System.Data.SQLite
Hex Artifact Content
Not logged in

Artifact 2971145260f9d0c79f2fbd001098bff5b0e33749:


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 73 6f 20  t libsqlite3.so 
4ba0: 6c 69 62 73 71 6c 69 74 65 33 2e 64 79 6c 69 62  libsqlite3.dylib
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 5c 0d 0a 20 20 20  urn [list \..   
4fb0: 20 20 20 20 20 20 20 20 20 53 51 4c 69 74 65 2e           SQLite.
4fc0: 49 6e 74 65 72 6f 70 2e 64 6c 6c 2e 73 6f 20 53  Interop.dll.so S
4fd0: 51 4c 69 74 65 2e 49 6e 74 65 72 6f 70 2e 73 6f  QLite.Interop.so
4fe0: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
4ff0: 53 51 4c 69 74 65 2e 49 6e 74 65 72 6f 70 2e 64  SQLite.Interop.d
5000: 79 6c 69 62 20 53 51 4c 69 74 65 2e 49 6e 74 65  ylib SQLite.Inte
5010: 72 6f 70 2e 64 6c 6c 2e 64 79 6c 69 62 5d 0d 0a  rop.dll.dylib]..
5020: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a        }..    }..
5030: 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74 43  ...    proc getC
5040: 6f 72 65 45 78 74 65 6e 73 69 6f 6e 42 69 6e 61  oreExtensionBina
5050: 72 79 46 69 6c 65 4e 61 6d 65 20 7b 20 7b 64 65  ryFileName { {de
5060: 66 61 75 6c 74 20 22 22 7d 20 7d 20 7b 0d 0a 20  fault ""} } {.. 
5070: 20 20 20 20 20 73 65 74 20 66 69 6c 65 4e 61 6d       set fileNam
5080: 65 20 5b 67 65 74 43 6f 72 65 42 69 6e 61 72 79  e [getCoreBinary
5090: 46 69 6c 65 4e 61 6d 65 5d 0d 0a 0d 0a 20 20 20  FileName]....   
50a0: 20 20 20 69 66 20 7b 5b 66 69 6c 65 20 65 78 69     if {[file exi
50b0: 73 74 73 20 24 66 69 6c 65 4e 61 6d 65 5d 7d 20  sts $fileName]} 
50c0: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
50d0: 72 65 74 75 72 6e 20 24 66 69 6c 65 4e 61 6d 65  return $fileName
50e0: 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
50f0: 20 20 20 72 65 74 75 72 6e 20 24 64 65 66 61 75     return $defau
5100: 6c 74 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20  lt..    }.....  
5110: 20 20 70 72 6f 63 20 69 73 42 75 69 6c 64 41 76    proc isBuildAv
5120: 61 69 6c 61 62 6c 65 20 7b 20 6e 61 74 69 76 65  ailable { native
5130: 20 64 69 72 65 63 74 6f 72 79 20 7b 76 61 72 4e   directory {varN
5140: 61 6d 65 20 22 22 7d 20 7d 20 7b 0d 0a 20 20 20  ame ""} } {..   
5150: 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
5160: 54 45 3a 20 42 75 69 6c 64 20 74 68 65 20 66 75  TE: Build the fu
5170: 6c 6c 79 20 71 75 61 6c 69 66 69 65 64 20 66 69  lly qualified fi
5180: 6c 65 20 6e 61 6d 65 20 66 6f 72 20 74 68 65 20  le name for the 
5190: 70 72 69 6d 61 72 79 20 61 73 73 65 6d 62 6c 79  primary assembly
51a0: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
51b0: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 53  containing the S
51c0: 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
51d0: 65 20 6d 61 6e 61 67 65 64 20 63 6f 6d 70 6f 6e  e managed compon
51e0: 65 6e 74 73 2e 20 20 49 74 0d 0a 20 20 20 20 20  ents.  It..     
51f0: 20 23 20 20 20 20 20 20 20 73 68 6f 75 6c 64 20   #       should 
5200: 62 65 20 6e 6f 74 65 64 20 74 68 61 74 20 74 68  be noted that th
5210: 69 73 20 61 73 73 65 6d 62 6c 79 20 66 69 6c 65  is assembly file
5220: 20 6d 61 79 20 61 6c 73 6f 20 63 6f 6e 74 61 69   may also contai
5230: 6e 20 74 68 65 0d 0a 20 20 20 20 20 20 23 20 20  n the..      #  
5240: 20 20 20 20 20 6e 61 74 69 76 65 20 63 6f 6d 70       native comp
5250: 6f 6e 65 6e 74 73 2c 20 69 66 20 61 20 6e 61 74  onents, if a nat
5260: 69 76 65 20 62 75 69 6c 64 20 69 73 20 69 6e 20  ive build is in 
5270: 75 73 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  use...      #.. 
5280: 20 20 20 20 20 73 65 74 20 66 69 6c 65 4e 61 6d       set fileNam
5290: 65 20 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e 61  e [file nativena
52a0: 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 24 64  me [file join $d
52b0: 69 72 65 63 74 6f 72 79 20 5c 0d 0a 20 20 20 20  irectory \..    
52c0: 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74        System.Dat
52d0: 61 2e 53 51 4c 69 74 65 2e 64 6c 6c 5d 5d 0d 0a  a.SQLite.dll]]..
52e0: 0d 0a 20 20 20 20 20 20 69 66 20 7b 21 5b 66 69  ..      if {![fi
52f0: 6c 65 20 65 78 69 73 74 73 20 24 66 69 6c 65 4e  le exists $fileN
5300: 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ame]} then {..  
5310: 20 20 20 20 20 20 72 65 74 75 72 6e 20 66 61 6c        return fal
5320: 73 65 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  se..      }.... 
5330: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
5340: 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74 20 74 6f  NOTE: Attempt to
5350: 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64   automatically d
5360: 65 74 65 63 74 20 69 66 20 74 68 65 20 70 72 69  etect if the pri
5370: 6d 61 72 79 20 61 73 73 65 6d 62 6c 79 0d 0a 20  mary assembly.. 
5380: 20 20 20 20 20 23 20 20 20 20 20 20 20 63 6f 6e       #       con
5390: 74 61 69 6e 73 20 61 6e 79 20 6e 61 74 69 76 65  tains any native
53a0: 20 63 6f 6d 70 6f 6e 65 6e 74 73 2c 20 69 66 20   components, if 
53b0: 6e 65 63 65 73 73 61 72 79 2e 0d 0a 20 20 20 20  necessary...    
53c0: 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b    #..      if {[
53d0: 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 6e  string length $n
53e0: 61 74 69 76 65 5d 20 3d 3d 20 30 7d 20 74 68 65  ative] == 0} the
53f0: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20  n {..        if 
5400: 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20  {[string length 
5410: 24 76 61 72 4e 61 6d 65 5d 20 3e 20 30 7d 20 74  $varName] > 0} t
5420: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
5430: 20 75 70 76 61 72 20 31 20 24 76 61 72 4e 61 6d   upvar 1 $varNam
5440: 65 20 24 76 61 72 4e 61 6d 65 0d 0a 20 20 20 20  e $varName..    
5450: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
5460: 20 73 65 74 20 6e 61 74 69 76 65 20 5b 69 73 4d   set native [isM
5470: 69 78 65 64 4d 6f 64 65 41 73 73 65 6d 62 6c 79  ixedModeAssembly
5480: 20 24 66 69 6c 65 4e 61 6d 65 20 24 76 61 72 4e   $fileName $varN
5490: 61 6d 65 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d  ame]..      }...
54a0: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
54b0: 23 20 4e 4f 54 45 3a 20 49 66 20 74 68 65 20 70  # NOTE: If the p
54c0: 72 69 6d 61 72 79 20 61 73 73 65 6d 62 6c 79 20  rimary assembly 
54d0: 61 6c 73 6f 20 63 6f 6e 74 61 69 6e 73 20 74 68  also contains th
54e0: 65 20 6e 61 74 69 76 65 20 63 6f 6d 70 6f 6e 65  e native compone
54f0: 6e 74 73 2c 0d 0a 20 20 20 20 20 20 23 20 20 20  nts,..      #   
5500: 20 20 20 20 77 65 20 68 61 76 65 20 65 76 65 72      we have ever
5510: 79 74 68 69 6e 67 20 77 65 20 6e 65 65 64 2e 0d  ything we need..
5520: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
5530: 69 66 20 7b 24 6e 61 74 69 76 65 7d 20 74 68 65  if {$native} the
5540: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 72 65 74  n {..        ret
5550: 75 72 6e 20 74 72 75 65 0d 0a 20 20 20 20 20 20  urn true..      
5560: 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  }....      #..  
5570: 20 20 20 20 23 20 4e 4f 54 45 3a 20 57 68 61 74      # NOTE: What
5580: 20 69 73 20 74 68 65 20 61 72 63 68 69 74 65 63   is the architec
5590: 74 75 72 65 20 66 6f 72 20 74 68 69 73 20 6d 61  ture for this ma
55a0: 63 68 69 6e 65 3f 0d 0a 20 20 20 20 20 20 23 0d  chine?..      #.
55b0: 0a 20 20 20 20 20 20 73 65 74 20 61 72 63 68 69  .      set archi
55c0: 74 65 63 74 75 72 65 20 5b 6d 61 63 68 69 6e 65  tecture [machine
55d0: 54 6f 50 6c 61 74 66 6f 72 6d 20 24 3a 3a 74 63  ToPlatform $::tc
55e0: 6c 5f 70 6c 61 74 66 6f 72 6d 28 6d 61 63 68 69  l_platform(machi
55f0: 6e 65 29 20 74 72 75 65 5d 0d 0a 0d 0a 20 20 20  ne) true]....   
5600: 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
5610: 54 45 3a 20 57 68 61 74 20 69 73 20 74 68 65 20  TE: What is the 
5620: 70 6c 61 74 66 6f 72 6d 20 66 6f 72 20 74 68 69  platform for thi
5630: 73 20 6d 61 63 68 69 6e 65 3f 0d 0a 20 20 20 20  s machine?..    
5640: 20 20 23 0d 0a 20 20 20 20 20 20 73 65 74 20 70    #..      set p
5650: 6c 61 74 66 6f 72 6d 20 5b 6d 61 63 68 69 6e 65  latform [machine
5660: 54 6f 50 6c 61 74 66 6f 72 6d 20 24 3a 3a 74 63  ToPlatform $::tc
5670: 6c 5f 70 6c 61 74 66 6f 72 6d 28 6d 61 63 68 69  l_platform(machi
5680: 6e 65 29 5d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d  ne)]....      #.
5690: 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 42  .      # NOTE: B
56a0: 75 69 6c 64 20 74 68 65 20 66 75 6c 6c 79 20 71  uild the fully q
56b0: 75 61 6c 69 66 69 65 64 20 66 69 6c 65 20 6e 61  ualified file na
56c0: 6d 65 20 66 6f 72 20 74 68 65 20 69 6e 74 65 72  me for the inter
56d0: 6f 70 20 61 73 73 65 6d 62 6c 79 0d 0a 20 20 20  op assembly..   
56e0: 20 20 20 23 20 20 20 20 20 20 20 63 6f 6e 74 61     #       conta
56f0: 69 6e 69 6e 67 20 74 68 65 20 53 79 73 74 65 6d  ining the System
5700: 2e 44 61 74 61 2e 53 51 4c 69 74 65 20 6e 61 74  .Data.SQLite nat
5710: 69 76 65 20 63 6f 6d 70 6f 6e 65 6e 74 73 2e 20  ive components. 
5720: 20 49 66 20 74 68 69 73 0d 0a 20 20 20 20 20 20   If this..      
5730: 23 20 20 20 20 20 20 20 66 69 6c 65 20 65 78 69  #       file exi
5740: 73 74 73 2c 20 77 65 20 73 68 6f 75 6c 64 20 68  sts, we should h
5750: 61 76 65 20 65 76 65 72 79 74 68 69 6e 67 20 77  ave everything w
5760: 65 20 6e 65 65 64 2e 0d 0a 20 20 20 20 20 20 23  e need...      #
5770: 0d 0a 20 20 20 20 20 20 66 6f 72 65 61 63 68 20  ..      foreach 
5780: 66 69 6c 65 4e 61 6d 65 4f 6e 6c 79 20 5b 67 65  fileNameOnly [ge
5790: 74 49 6e 74 65 72 6f 70 41 73 73 65 6d 62 6c 79  tInteropAssembly
57a0: 46 69 6c 65 4e 61 6d 65 73 4f 6e 6c 79 5d 20 7b  FileNamesOnly] {
57b0: 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 66 69  ..        set fi
57c0: 6c 65 4e 61 6d 65 20 5b 66 69 6c 65 20 6e 61 74  leName [file nat
57d0: 69 76 65 6e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f  ivename [file jo
57e0: 69 6e 20 24 64 69 72 65 63 74 6f 72 79 20 5c 0d  in $directory \.
57f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 24 61 72  .            $ar
5800: 63 68 69 74 65 63 74 75 72 65 20 24 66 69 6c 65  chitecture $file
5810: 4e 61 6d 65 4f 6e 6c 79 5d 5d 0d 0a 0d 0a 20 20  NameOnly]]....  
5820: 20 20 20 20 20 20 69 66 20 7b 5b 66 69 6c 65 20        if {[file 
5830: 65 78 69 73 74 73 20 24 66 69 6c 65 4e 61 6d 65  exists $fileName
5840: 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
5850: 20 20 20 20 20 72 65 74 75 72 6e 20 74 72 75 65       return true
5860: 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  ..        }.... 
5870: 20 20 20 20 20 20 20 73 65 74 20 66 69 6c 65 4e         set fileN
5880: 61 6d 65 20 5b 66 69 6c 65 20 6e 61 74 69 76 65  ame [file native
5890: 6e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20  name [file join 
58a0: 24 64 69 72 65 63 74 6f 72 79 20 5c 0d 0a 20 20  $directory \..  
58b0: 20 20 20 20 20 20 20 20 20 20 24 70 6c 61 74 66            $platf
58c0: 6f 72 6d 20 24 66 69 6c 65 4e 61 6d 65 4f 6e 6c  orm $fileNameOnl
58d0: 79 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69  y]]....        i
58e0: 66 20 7b 5b 66 69 6c 65 20 65 78 69 73 74 73 20  f {[file exists 
58f0: 24 66 69 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e  $fileName]} then
5900: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 72 65   {..          re
5910: 74 75 72 6e 20 74 72 75 65 0d 0a 20 20 20 20 20  turn true..     
5920: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
5930: 73 65 74 20 66 69 6c 65 4e 61 6d 65 20 5b 66 69  set fileName [fi
5940: 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65 20 5b 66  le nativename [f
5950: 69 6c 65 20 6a 6f 69 6e 20 24 64 69 72 65 63 74  ile join $direct
5960: 6f 72 79 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ory \..         
5970: 20 20 20 24 66 69 6c 65 4e 61 6d 65 4f 6e 6c 79     $fileNameOnly
5980: 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66  ]]....        if
5990: 20 7b 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24   {[file exists $
59a0: 66 69 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20  fileName]} then 
59b0: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  {..          ret
59c0: 75 72 6e 20 74 72 75 65 0d 0a 20 20 20 20 20 20  urn true..      
59d0: 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a    }..      }....
59e0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
59f0: 20 4e 4f 54 45 3a 20 42 75 69 6c 64 20 74 68 65   NOTE: Build the
5a00: 20 66 75 6c 6c 79 20 71 75 61 6c 69 66 69 65 64   fully qualified
5a10: 20 66 69 6c 65 20 6e 61 6d 65 20 66 6f 72 20 74   file name for t
5a20: 68 65 20 53 51 4c 69 74 65 20 63 6f 72 65 0d 0a  he SQLite core..
5a30: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 6c 69        #       li
5a40: 62 72 61 72 79 2e 20 20 49 66 20 74 68 69 73 20  brary.  If this 
5a50: 66 69 6c 65 20 65 78 69 73 74 73 2c 20 77 65 20  file exists, we 
5a60: 73 68 6f 75 6c 64 20 68 61 76 65 20 65 76 65 72  should have ever
5a70: 79 74 68 69 6e 67 20 77 65 0d 0a 20 20 20 20 20  ything we..     
5a80: 20 23 20 20 20 20 20 20 20 6e 65 65 64 2e 0d 0a   #       need...
5a90: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 66        #..      f
5aa0: 6f 72 65 61 63 68 20 66 69 6c 65 4e 61 6d 65 4f  oreach fileNameO
5ab0: 6e 6c 79 20 5b 67 65 74 4e 61 74 69 76 65 4c 69  nly [getNativeLi
5ac0: 62 72 61 72 79 46 69 6c 65 4e 61 6d 65 73 4f 6e  braryFileNamesOn
5ad0: 6c 79 5d 20 7b 0d 0a 20 20 20 20 20 20 20 20 73  ly] {..        s
5ae0: 65 74 20 66 69 6c 65 4e 61 6d 65 20 5b 66 69 6c  et fileName [fil
5af0: 65 20 6e 61 74 69 76 65 6e 61 6d 65 20 5b 66 69  e nativename [fi
5b00: 6c 65 20 6a 6f 69 6e 20 24 64 69 72 65 63 74 6f  le join $directo
5b10: 72 79 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  ry \..          
5b20: 20 20 24 61 72 63 68 69 74 65 63 74 75 72 65 20    $architecture 
5b30: 24 66 69 6c 65 4e 61 6d 65 4f 6e 6c 79 5d 5d 0d  $fileNameOnly]].
5b40: 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b  ...        if {[
5b50: 66 69 6c 65 20 65 78 69 73 74 73 20 24 66 69 6c  file exists $fil
5b60: 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a  eName]} then {..
5b70: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
5b80: 20 74 72 75 65 0d 0a 20 20 20 20 20 20 20 20 7d   true..        }
5b90: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20  ....        set 
5ba0: 66 69 6c 65 4e 61 6d 65 20 5b 66 69 6c 65 20 6e  fileName [file n
5bb0: 61 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c 65 20  ativename [file 
5bc0: 6a 6f 69 6e 20 24 64 69 72 65 63 74 6f 72 79 20  join $directory 
5bd0: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 24  \..            $
5be0: 70 6c 61 74 66 6f 72 6d 20 24 66 69 6c 65 4e 61  platform $fileNa
5bf0: 6d 65 4f 6e 6c 79 5d 5d 0d 0a 0d 0a 20 20 20 20  meOnly]]....    
5c00: 20 20 20 20 69 66 20 7b 5b 66 69 6c 65 20 65 78      if {[file ex
5c10: 69 73 74 73 20 24 66 69 6c 65 4e 61 6d 65 5d 7d  ists $fileName]}
5c20: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
5c30: 20 20 20 72 65 74 75 72 6e 20 74 72 75 65 0d 0a     return true..
5c40: 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
5c50: 20 20 20 20 20 73 65 74 20 66 69 6c 65 4e 61 6d       set fileNam
5c60: 65 20 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e 61  e [file nativena
5c70: 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 24 64  me [file join $d
5c80: 69 72 65 63 74 6f 72 79 20 5c 0d 0a 20 20 20 20  irectory \..    
5c90: 20 20 20 20 20 20 20 20 24 66 69 6c 65 4e 61 6d          $fileNam
5ca0: 65 4f 6e 6c 79 5d 5d 0d 0a 0d 0a 20 20 20 20 20  eOnly]]....     
5cb0: 20 20 20 69 66 20 7b 5b 66 69 6c 65 20 65 78 69     if {[file exi
5cc0: 73 74 73 20 24 66 69 6c 65 4e 61 6d 65 5d 7d 20  sts $fileName]} 
5cd0: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
5ce0: 20 20 72 65 74 75 72 6e 20 74 72 75 65 0d 0a 20    return true.. 
5cf0: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
5d00: 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  }....      #..  
5d10: 20 20 20 20 23 20 4e 4f 54 45 3a 20 4f 6e 65 20      # NOTE: One 
5d20: 6f 72 20 6d 6f 72 65 20 6e 61 74 69 76 65 20 63  or more native c
5d30: 6f 6d 70 6f 6e 65 6e 74 73 20 6e 65 65 64 65 64  omponents needed
5d40: 20 62 79 20 53 79 73 74 65 6d 2e 44 61 74 61 2e   by System.Data.
5d50: 53 51 4c 69 74 65 0d 0a 20 20 20 20 20 20 23 20  SQLite..      # 
5d60: 20 20 20 20 20 20 61 72 65 20 6d 69 73 73 69 6e        are missin
5d70: 67 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  g...      #..   
5d80: 20 20 20 72 65 74 75 72 6e 20 66 61 6c 73 65 0d     return false.
5d90: 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70  .    }.....    p
5da0: 72 6f 63 20 69 73 52 65 6c 65 61 73 65 41 76 61  roc isReleaseAva
5db0: 69 6c 61 62 6c 65 20 7b 20 64 69 72 65 63 74 6f  ilable { directo
5dc0: 72 79 20 7b 76 61 72 4e 61 6d 65 20 22 22 7d 20  ry {varName ""} 
5dd0: 7d 20 7b 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b  } {..      if {[
5de0: 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 76  string length $v
5df0: 61 72 4e 61 6d 65 5d 20 3e 20 30 7d 20 74 68 65  arName] > 0} the
5e00: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 75 70 76  n {..        upv
5e10: 61 72 20 31 20 24 76 61 72 4e 61 6d 65 20 24 76  ar 1 $varName $v
5e20: 61 72 4e 61 6d 65 0d 0a 20 20 20 20 20 20 7d 0d  arName..      }.
5e30: 0a 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ...      return 
5e40: 5b 69 73 42 75 69 6c 64 41 76 61 69 6c 61 62 6c  [isBuildAvailabl
5e50: 65 20 22 22 20 24 64 69 72 65 63 74 6f 72 79 20  e "" $directory 
5e60: 24 76 61 72 4e 61 6d 65 5d 0d 0a 20 20 20 20 7d  $varName]..    }
5e70: 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 6a 6f  .....    proc jo
5e80: 69 6e 42 75 69 6c 64 44 69 72 65 63 74 6f 72 79  inBuildDirectory
5e90: 20 7b 20 6e 61 74 69 76 65 20 70 61 74 68 20 79   { native path y
5ea0: 65 61 72 20 70 6c 61 74 66 6f 72 6d 20 63 6f 6e  ear platform con
5eb0: 66 69 67 75 72 61 74 69 6f 6e 20 7d 20 7b 0d 0a  figuration } {..
5ec0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
5ed0: 20 4e 4f 54 45 3a 20 46 69 67 75 72 65 20 6f 75   NOTE: Figure ou
5ee0: 74 20 61 6e 64 20 74 68 65 6e 20 72 65 74 75 72  t and then retur
5ef0: 6e 20 74 68 65 20 66 75 6c 6c 79 20 71 75 61 6c  n the fully qual
5f00: 69 66 69 65 64 20 70 61 74 68 20 74 6f 20 74 68  ified path to th
5f10: 65 20 62 75 69 6c 64 0d 0a 20 20 20 20 20 20 23  e build..      #
5f20: 20 20 20 20 20 20 20 64 69 72 65 63 74 6f 72 79         directory
5f30: 20 62 61 73 65 64 20 6f 6e 20 61 6c 6c 20 74 68   based on all th
5f40: 65 20 61 72 67 75 6d 65 6e 74 73 20 70 72 6f 76  e arguments prov
5f50: 69 64 65 64 20 62 79 20 6f 75 72 20 63 61 6c 6c  ided by our call
5f60: 65 72 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  er...      #..  
5f70: 20 20 20 20 69 66 20 7b 24 6e 61 74 69 76 65 7d      if {$native}
5f80: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
5f90: 20 72 65 74 75 72 6e 20 5b 66 69 6c 65 20 6a 6f   return [file jo
5fa0: 69 6e 20 24 70 61 74 68 20 62 69 6e 20 24 79 65  in $path bin $ye
5fb0: 61 72 20 24 70 6c 61 74 66 6f 72 6d 20 24 63 6f  ar $platform $co
5fc0: 6e 66 69 67 75 72 61 74 69 6f 6e 5d 0d 0a 20 20  nfiguration]..  
5fd0: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
5fe0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b 66 69        return [fi
5ff0: 6c 65 20 6a 6f 69 6e 20 24 70 61 74 68 20 62 69  le join $path bi
6000: 6e 20 24 79 65 61 72 20 24 63 6f 6e 66 69 67 75  n $year $configu
6010: 72 61 74 69 6f 6e 20 62 69 6e 5d 0d 0a 20 20 20  ration bin]..   
6020: 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a     }..    }.....
6030: 20 20 20 20 70 72 6f 63 20 67 65 74 42 75 69 6c      proc getBuil
6040: 64 44 69 72 65 63 74 6f 72 79 20 7b 7d 20 7b 0d  dDirectory {} {.
6050: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
6060: 23 20 4e 4f 54 45 3a 20 53 65 65 20 69 66 20 74  # NOTE: See if t
6070: 68 65 20 22 6e 61 74 69 76 65 22 20 72 75 6e 74  he "native" runt
6080: 69 6d 65 20 6f 70 74 69 6f 6e 20 68 61 73 20 62  ime option has b
6090: 65 65 6e 20 73 65 74 2e 20 20 49 66 20 73 6f 2c  een set.  If so,
60a0: 20 75 73 65 20 74 68 65 0d 0a 20 20 20 20 20 20   use the..      
60b0: 23 20 20 20 20 20 20 20 64 69 72 65 63 74 6f 72  #       director
60c0: 79 20 66 6f 72 20 74 68 65 20 6d 69 78 65 64 2d  y for the mixed-
60d0: 6d 6f 64 65 20 61 73 73 65 6d 62 6c 79 20 28 61  mode assembly (a
60e0: 2e 6b 2e 61 2e 20 74 68 65 20 6e 61 74 69 76 65  .k.a. the native
60f0: 20 69 6e 74 65 72 6f 70 0d 0a 20 20 20 20 20 20   interop..      
6100: 23 20 20 20 20 20 20 20 61 73 73 65 6d 62 6c 79  #       assembly
6110: 29 2e 20 20 54 6f 20 65 6e 61 62 6c 65 20 74 68  ).  To enable th
6120: 69 73 20 6f 70 74 69 6f 6e 20 76 69 61 20 74 68  is option via th
6130: 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 2c 20  e command line, 
6140: 65 6e 74 65 72 20 61 0d 0a 20 20 20 20 20 20 23  enter a..      #
6150: 20 20 20 20 20 20 20 63 6f 6d 6d 61 6e 64 20 73         command s
6160: 69 6d 69 6c 61 72 20 74 6f 20 6f 6e 65 20 6f 66  imilar to one of
6170: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 28   the following (
6180: 61 6c 6c 20 6f 6e 20 6f 6e 65 20 6c 69 6e 65 29  all on one line)
6190: 3a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  :..      #..    
61a0: 20 20 23 20 20 20 20 20 20 20 45 61 67 6c 65 53    #       EagleS
61b0: 68 65 6c 6c 2e 65 78 65 20 2d 69 6e 69 74 69 61  hell.exe -initia
61c0: 6c 69 7a 65 20 2d 72 75 6e 74 69 6d 65 4f 70 74  lize -runtimeOpt
61d0: 69 6f 6e 20 6e 61 74 69 76 65 0d 0a 20 20 20 20  ion native..    
61e0: 20 20 23 20 20 20 20 20 20 20 20 20 2d 66 69 6c    #         -fil
61f0: 65 20 2e 5c 70 61 74 68 5c 74 6f 5c 61 6c 6c 2e  e .\path\to\all.
6200: 65 61 67 6c 65 0d 0a 20 20 20 20 20 20 23 0d 0a  eagle..      #..
6210: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 54 6f        #       To
6220: 20 65 6e 61 62 6c 65 20 74 68 69 73 20 6f 70 74   enable this opt
6230: 69 6f 6e 20 76 69 61 20 74 68 65 20 63 6f 6d 6d  ion via the comm
6240: 61 6e 64 20 6c 69 6e 65 20 70 72 69 6f 72 20 74  and line prior t
6250: 6f 20 74 68 65 20 22 62 65 74 61 20 31 36 22 0d  o the "beta 16".
6260: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 72  .      #       r
6270: 65 6c 65 61 73 65 20 6f 66 20 45 61 67 6c 65 2c  elease of Eagle,
6280: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   the following c
6290: 6f 6d 6d 61 6e 64 20 6d 75 73 74 20 62 65 20 75  ommand must be u
62a0: 73 65 64 20 69 6e 73 74 65 61 64 0d 0a 20 20 20  sed instead..   
62b0: 20 20 20 23 20 20 20 20 20 20 20 28 61 6c 73 6f     #       (also
62c0: 20 61 6c 6c 20 6f 6e 20 6f 6e 65 20 6c 69 6e 65   all on one line
62d0: 29 3a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  ):..      #..   
62e0: 20 20 20 23 20 20 20 20 20 20 20 45 61 67 6c 65     #       Eagle
62f0: 53 68 65 6c 6c 2e 65 78 65 20 2d 69 6e 69 74 69  Shell.exe -initi
6300: 61 6c 69 7a 65 20 2d 70 6f 73 74 49 6e 69 74 69  alize -postIniti
6310: 61 6c 69 7a 65 0d 0a 20 20 20 20 20 20 23 20 20  alize..      #  
6320: 20 20 20 20 20 20 20 22 6f 62 6a 65 63 74 20 69         "object i
6330: 6e 76 6f 6b 65 20 49 6e 74 65 72 70 72 65 74 65  nvoke Interprete
6340: 72 2e 47 65 74 41 63 74 69 76 65 20 41 64 64 52  r.GetActive AddR
6350: 75 6e 74 69 6d 65 4f 70 74 69 6f 6e 20 6e 61 74  untimeOption nat
6360: 69 76 65 22 0d 0a 20 20 20 20 20 20 23 20 20 20  ive"..      #   
6370: 20 20 20 20 20 20 2d 66 69 6c 65 20 2e 5c 70 61        -file .\pa
6380: 74 68 5c 74 6f 5c 61 6c 6c 2e 65 61 67 6c 65 0d  th\to\all.eagle.
6390: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
63a0: 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73  if {[info exists
63b0: 20 3a 3a 62 75 69 6c 64 5f 64 69 72 65 63 74 6f   ::build_directo
63c0: 72 79 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20  ry] && \..      
63d0: 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67      [string leng
63e0: 74 68 20 24 3a 3a 62 75 69 6c 64 5f 64 69 72 65  th $::build_dire
63f0: 63 74 6f 72 79 5d 20 3e 20 30 7d 20 74 68 65 6e  ctory] > 0} then
6400: 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20   {..        #.. 
6410: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54         # NOTE: T
6420: 68 65 20 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 74  he location of t
6430: 68 65 20 62 75 69 6c 64 20 64 69 72 65 63 74 6f  he build directo
6440: 72 79 20 68 61 73 20 62 65 65 6e 20 6f 76 65 72  ry has been over
6450: 72 69 64 64 65 6e 3b 0d 0a 20 20 20 20 20 20 20  ridden;..       
6460: 20 23 20 20 20 20 20 20 20 74 68 65 72 65 66 6f   #       therefo
6470: 72 65 2c 20 75 73 65 20 69 74 20 76 65 72 62 61  re, use it verba
6480: 74 69 6d 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  tim...        #.
6490: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
64a0: 24 3a 3a 62 75 69 6c 64 5f 64 69 72 65 63 74 6f  $::build_directo
64b0: 72 79 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65  ry..      } else
64c0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20   {..        #.. 
64d0: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49         # NOTE: I
64e0: 66 20 74 68 65 20 22 6e 61 74 69 76 65 22 20 72  f the "native" r
64f0: 75 6e 74 69 6d 65 20 6f 70 74 69 6f 6e 20 69 73  untime option is
6500: 20 73 65 74 2c 20 74 68 65 20 6d 69 78 65 64 2d   set, the mixed-
6510: 6d 6f 64 65 20 61 73 73 65 6d 62 6c 79 0d 0a 20  mode assembly.. 
6520: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 69         #       i
6530: 73 20 62 65 69 6e 67 20 74 65 73 74 65 64 2e 20  s being tested. 
6540: 20 49 6e 20 74 68 61 74 20 63 61 73 65 2c 20 74   In that case, t
6550: 68 65 20 70 61 74 68 20 74 6f 20 74 68 65 20 62  he path to the b
6560: 75 69 6c 64 20 64 69 72 65 63 74 6f 72 79 0d 0a  uild directory..
6570: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
6580: 77 69 6c 6c 20 63 6f 6e 74 61 69 6e 20 74 68 65  will contain the
6590: 20 70 6c 61 74 66 6f 72 6d 20 6e 61 6d 65 20 61   platform name a
65a0: 6e 64 20 61 6c 6c 20 74 68 65 20 62 69 6e 61 72  nd all the binar
65b0: 69 65 73 20 75 6e 64 65 72 20 74 65 73 74 0d 0a  ies under test..
65c0: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
65d0: 73 68 6f 75 6c 64 20 62 65 20 70 72 65 73 65 6e  should be presen
65e0: 74 20 69 6e 20 74 68 61 74 20 64 69 72 65 63 74  t in that direct
65f0: 6f 72 79 2e 20 20 49 66 20 74 68 65 20 22 6e 61  ory.  If the "na
6600: 74 69 76 65 22 20 72 75 6e 74 69 6d 65 0d 0a 20  tive" runtime.. 
6610: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 6f         #       o
6620: 70 74 69 6f 6e 20 69 73 20 6e 6f 74 20 73 65 74  ption is not set
6630: 2c 20 74 68 65 20 62 75 69 6c 64 20 64 69 72 65  , the build dire
6640: 63 74 6f 72 79 20 77 69 6c 6c 20 62 65 20 63 6f  ctory will be co
6650: 6e 73 69 64 65 72 65 64 20 74 6f 20 62 65 0d 0a  nsidered to be..
6660: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
6670: 22 70 6c 61 74 66 6f 72 6d 2d 6e 65 75 74 72 61  "platform-neutra
6680: 6c 22 2c 20 77 69 74 68 20 74 68 65 20 6e 6f 74  l", with the not
6690: 61 62 6c 65 20 65 78 63 65 70 74 69 6f 6e 20 6f  able exception o
66a0: 66 20 61 6e 79 20 6e 61 74 69 76 65 0d 0a 20 20  f any native..  
66b0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 61 73        #       as
66c0: 73 65 6d 62 6c 79 20 28 65 2e 67 2e 20 22 53 51  sembly (e.g. "SQ
66d0: 4c 69 74 65 2e 49 6e 74 65 72 6f 70 2e 64 6c 6c  Lite.Interop.dll
66e0: 22 29 20 63 6f 70 69 65 64 20 74 68 65 72 65 20  ") copied there 
66f0: 64 75 72 69 6e 67 20 74 68 65 0d 0a 20 20 20 20  during the..    
6700: 20 20 20 20 23 20 20 20 20 20 20 20 62 75 69 6c      #       buil
6710: 64 20 70 72 6f 63 65 73 73 20 69 74 73 65 6c 66  d process itself
6720: 2e 20 20 49 66 20 74 68 65 20 62 75 69 6c 64 20  .  If the build 
6730: 70 72 6f 63 65 73 73 20 73 6f 6d 65 68 6f 77 20  process somehow 
6740: 64 6f 65 73 20 6e 6f 74 0d 0a 20 20 20 20 20 20  does not..      
6750: 20 20 23 20 20 20 20 20 20 20 63 6f 70 79 20 74    #       copy t
6760: 68 65 20 6e 61 74 69 76 65 20 61 73 73 65 6d 62  he native assemb
6770: 6c 79 20 66 6f 72 20 74 68 69 73 20 70 6c 61 74  ly for this plat
6780: 66 6f 72 6d 2c 20 6d 6f 73 74 20 6f 66 20 74 68  form, most of th
6790: 65 20 74 65 73 74 73 0d 0a 20 20 20 20 20 20 20  e tests..       
67a0: 20 23 20 20 20 20 20 20 20 69 6e 20 74 68 65 20   #       in the 
67b0: 73 75 69 74 65 20 77 69 6c 6c 20 73 69 6d 70 6c  suite will simpl
67c0: 79 20 62 65 20 73 6b 69 70 70 65 64 2e 20 20 47  y be skipped.  G
67d0: 65 6e 65 72 61 6c 6c 79 20 73 70 65 61 6b 69 6e  enerally speakin
67e0: 67 2c 20 74 68 65 72 65 0d 0a 20 20 20 20 20 20  g, there..      
67f0: 20 20 23 20 20 20 20 20 20 20 61 72 65 20 74 77    #       are tw
6800: 6f 20 77 61 79 73 20 74 6f 20 62 75 69 6c 64 20  o ways to build 
6810: 74 68 65 20 62 69 6e 61 72 69 65 73 20 77 68 65  the binaries whe
6820: 6e 20 70 72 65 70 61 72 69 6e 67 20 74 6f 20 72  n preparing to r
6830: 75 6e 20 74 68 65 0d 0a 20 20 20 20 20 20 20 20  un the..        
6840: 23 20 20 20 20 20 20 20 74 65 73 74 20 73 75 69  #       test sui
6850: 74 65 3a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  te:..        #..
6860: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
6870: 31 2e 20 42 75 69 6c 64 20 74 68 65 20 73 65 70  1. Build the sep
6880: 61 72 61 74 65 20 6d 61 6e 61 67 65 64 20 61 6e  arate managed an
6890: 64 20 6e 61 74 69 76 65 20 61 73 73 65 6d 62 6c  d native assembl
68a0: 69 65 73 20 75 73 69 6e 67 20 73 6f 6d 65 0d 0a  ies using some..
68b0: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
68c0: 20 20 20 63 6f 6d 6d 61 6e 64 73 20 73 69 6d 69     commands simi
68d0: 6c 61 72 20 74 6f 3a 0d 0a 20 20 20 20 20 20 20  lar to:..       
68e0: 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20   #..        #   
68f0: 20 20 20 20 20 20 20 62 75 69 6c 64 2e 62 61 74         build.bat
6900: 20 24 7b 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e   ${Configuration
6910: 7d 4d 61 6e 61 67 65 64 4f 6e 6c 79 20 24 7b 50  }ManagedOnly ${P
6920: 6c 61 74 66 6f 72 6d 7d 0d 0a 20 20 20 20 20 20  latform}..      
6930: 20 20 23 20 20 20 20 20 20 20 20 20 20 62 75 69    #          bui
6940: 6c 64 2e 62 61 74 20 24 7b 43 6f 6e 66 69 67 75  ld.bat ${Configu
6950: 72 61 74 69 6f 6e 7d 4e 61 74 69 76 65 4f 6e 6c  ration}NativeOnl
6960: 79 20 24 7b 50 6c 61 74 66 6f 72 6d 7d 0d 0a 20  y ${Platform}.. 
6970: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
6980: 20 20 23 20 20 20 20 20 20 20 20 20 20 57 68 65    #          Whe
6990: 72 65 20 24 7b 43 6f 6e 66 69 67 75 72 61 74 69  re ${Configurati
69a0: 6f 6e 7d 20 69 73 20 65 69 74 68 65 72 20 22 44  on} is either "D
69b0: 65 62 75 67 22 20 6f 72 20 22 52 65 6c 65 61 73  ebug" or "Releas
69c0: 65 22 20 61 6e 64 0d 0a 20 20 20 20 20 20 20 20  e" and..        
69d0: 23 20 20 20 20 20 20 20 20 20 20 24 7b 50 6c 61  #          ${Pla
69e0: 74 66 6f 72 6d 7d 20 69 73 20 65 69 74 68 65 72  tform} is either
69f0: 20 22 57 69 6e 33 32 22 20 6f 72 20 22 78 36 34   "Win32" or "x64
6a00: 22 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  "...        #.. 
6a10: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 32         #       2
6a20: 2e 20 42 75 69 6c 64 20 74 68 65 20 6d 69 78 65  . Build the mixe
6a30: 64 2d 6d 6f 64 65 20 61 73 73 65 6d 62 6c 79 20  d-mode assembly 
6a40: 75 73 69 6e 67 20 61 20 63 6f 6d 6d 61 6e 64 20  using a command 
6a50: 73 69 6d 69 6c 61 72 20 74 6f 3a 0d 0a 20 20 20  similar to:..   
6a60: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
6a70: 23 20 20 20 20 20 20 20 20 20 20 62 75 69 6c 64  #          build
6a80: 2e 62 61 74 20 24 7b 43 6f 6e 66 69 67 75 72 61  .bat ${Configura
6a90: 74 69 6f 6e 7d 20 24 7b 50 6c 61 74 66 6f 72 6d  tion} ${Platform
6aa0: 7d 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  }..        #..  
6ab0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 20 20        #         
6ac0: 20 57 68 65 72 65 20 24 7b 43 6f 6e 66 69 67 75   Where ${Configu
6ad0: 72 61 74 69 6f 6e 7d 20 69 73 20 65 69 74 68 65  ration} is eithe
6ae0: 72 20 22 44 65 62 75 67 22 20 6f 72 20 22 52 65  r "Debug" or "Re
6af0: 6c 65 61 73 65 22 20 61 6e 64 0d 0a 20 20 20 20  lease" and..    
6b00: 20 20 20 20 23 20 20 20 20 20 20 20 20 20 20 24      #          $
6b10: 7b 50 6c 61 74 66 6f 72 6d 7d 20 69 73 20 65 69  {Platform} is ei
6b20: 74 68 65 72 20 22 57 69 6e 33 32 22 20 6f 72 20  ther "Win32" or 
6b30: 22 78 36 34 22 2e 20 20 49 66 20 74 68 69 73 20  "x64".  If this 
6b40: 63 6f 6d 6d 61 6e 64 20 69 73 0d 0a 20 20 20 20  command is..    
6b50: 20 20 20 20 23 20 20 20 20 20 20 20 20 20 20 75      #          u
6b60: 73 65 64 2c 20 76 61 72 69 6f 75 73 20 74 65 73  sed, various tes
6b70: 74 73 20 74 68 61 74 20 72 65 71 75 69 72 65 20  ts that require 
6b80: 73 75 70 70 6c 65 6d 65 6e 74 61 72 79 20 6d 61  supplementary ma
6b90: 6e 61 67 65 64 0d 0a 20 20 20 20 20 20 20 20 23  naged..        #
6ba0: 20 20 20 20 20 20 20 20 20 20 61 73 73 65 6d 62            assemb
6bb0: 6c 69 65 73 20 28 65 2e 67 2e 20 4c 49 4e 51 29  lies (e.g. LINQ)
6bc0: 20 6d 61 79 20 62 65 20 73 6b 69 70 70 65 64 20   may be skipped 
6bd0: 75 6e 6c 65 73 73 20 74 68 6f 73 65 20 62 69 6e  unless those bin
6be0: 61 72 69 65 73 0d 0a 20 20 20 20 20 20 20 20 23  aries..        #
6bf0: 20 20 20 20 20 20 20 20 20 20 61 72 65 20 73 75            are su
6c00: 62 73 65 71 75 65 6e 74 6c 79 20 63 6f 70 69 65  bsequently copie
6c10: 64 20 69 6e 74 6f 20 74 68 65 20 63 6f 72 72 65  d into the corre
6c20: 63 74 20 64 69 72 65 63 74 6f 72 79 20 28 69 2e  ct directory (i.
6c30: 65 2e 20 62 79 0d 0a 20 20 20 20 20 20 20 20 23  e. by..        #
6c40: 20 20 20 20 20 20 20 20 20 20 22 74 65 73 74 5f            "test_
6c50: 61 6c 6c 2e 62 61 74 22 29 2e 0d 0a 20 20 20 20  all.bat")...    
6c60: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
6c70: 20 20 20 20 20 20 20 4e 6f 74 65 20 74 68 61 74         Note that
6c80: 20 61 6c 6c 20 6f 66 20 74 68 65 20 62 75 69 6c   all of the buil
6c90: 64 20 63 6f 6d 6d 61 6e 64 73 20 61 62 6f 76 65  d commands above
6ca0: 20 77 69 6c 6c 20 64 65 66 61 75 6c 74 20 74 6f   will default to
6cb0: 20 75 73 69 6e 67 0d 0a 20 20 20 20 20 20 20 20   using..        
6cc0: 23 20 20 20 20 20 20 20 74 68 65 20 6c 61 74 65  #       the late
6cd0: 73 74 20 76 65 72 73 69 6f 6e 20 6f 66 20 4d 53  st version of MS
6ce0: 42 75 69 6c 64 20 61 76 61 69 6c 61 62 6c 65 20  Build available 
6cf0: 61 6e 64 20 74 68 65 20 22 74 65 73 74 5f 79 65  and the "test_ye
6d00: 61 72 22 20 6d 61 79 0d 0a 20 20 20 20 20 20 20  ar" may..       
6d10: 20 23 20 20 20 20 20 20 20 6e 65 65 64 20 74 6f   #       need to
6d20: 20 62 65 20 61 64 6a 75 73 74 65 64 20 61 63 63   be adjusted acc
6d30: 6f 72 64 69 6e 67 6c 79 20 74 6f 20 61 63 74 75  ordingly to actu
6d40: 61 6c 6c 79 20 72 75 6e 20 74 68 65 20 74 65 73  ally run the tes
6d50: 74 20 73 75 69 74 65 2e 0d 0a 20 20 20 20 20 20  t suite...      
6d60: 20 20 23 20 20 20 20 20 20 20 52 65 66 65 72 20    #       Refer 
6d70: 74 6f 20 74 68 65 20 63 6f 6d 6d 65 6e 74 73 20  to the comments 
6d80: 69 6e 20 5b 67 65 74 42 75 69 6c 64 59 65 61 72  in [getBuildYear
6d90: 5d 20 66 6f 72 20 6d 6f 72 65 20 69 6e 66 6f 72  ] for more infor
6da0: 6d 61 74 69 6f 6e 20 6f 6e 0d 0a 20 20 20 20 20  mation on..     
6db0: 20 20 20 23 20 20 20 20 20 20 20 68 6f 77 20 74     #       how t
6dc0: 6f 20 73 65 74 20 74 68 69 73 20 76 61 72 69 61  o set this varia
6dd0: 62 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  ble...        #.
6de0: 0a 20 20 20 20 20 20 20 20 73 65 74 20 6e 61 74  .        set nat
6df0: 69 76 65 20 5b 68 61 73 52 75 6e 74 69 6d 65 4f  ive [hasRuntimeO
6e00: 70 74 69 6f 6e 20 6e 61 74 69 76 65 5d 0d 0a 0d  ption native]...
6e10: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
6e20: 5b 6a 6f 69 6e 42 75 69 6c 64 44 69 72 65 63 74  [joinBuildDirect
6e30: 6f 72 79 20 24 6e 61 74 69 76 65 20 5b 67 65 74  ory $native [get
6e40: 42 75 69 6c 64 42 61 73 65 44 69 72 65 63 74 6f  BuildBaseDirecto
6e50: 72 79 5d 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ry] \..         
6e60: 20 20 20 5b 67 65 74 42 75 69 6c 64 59 65 61 72     [getBuildYear
6e70: 5d 20 5b 67 65 74 42 75 69 6c 64 50 6c 61 74 66  ] [getBuildPlatf
6e80: 6f 72 6d 20 24 6e 61 74 69 76 65 5d 20 5b 67 65  orm $native] [ge
6e90: 74 42 75 69 6c 64 43 6f 6e 66 69 67 75 72 61 74  tBuildConfigurat
6ea0: 69 6f 6e 5d 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a  ion]]..      }..
6eb0: 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
6ec0: 6f 63 20 67 65 74 52 65 6c 65 61 73 65 56 65 72  oc getReleaseVer
6ed0: 73 69 6f 6e 20 7b 7d 20 7b 0d 0a 20 20 20 20 20  sion {} {..     
6ee0: 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
6ef0: 3a 20 46 69 67 75 72 65 20 6f 75 74 20 74 68 65  : Figure out the
6f00: 20 72 65 6c 65 61 73 65 20 76 65 72 73 69 6f 6e   release version
6f10: 20 66 6f 72 20 75 73 65 20 77 69 74 68 20 74 68   for use with th
6f20: 65 20 62 75 69 6c 64 20 64 69 72 65 63 74 6f 72  e build director
6f30: 79 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  y..      #      
6f40: 20 77 68 65 6e 20 63 68 65 63 6b 69 6e 67 20 66   when checking f
6f50: 6f 72 20 61 76 61 69 6c 61 62 6c 65 20 72 65 6c  or available rel
6f60: 65 61 73 65 73 2e 0d 0a 20 20 20 20 20 20 23 0d  eases...      #.
6f70: 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f  .      if {[info
6f80: 20 65 78 69 73 74 73 20 3a 3a 72 65 6c 65 61 73   exists ::releas
6f90: 65 5f 76 65 72 73 69 6f 6e 5d 20 26 26 20 5c 0d  e_version] && \.
6fa0: 0a 20 20 20 20 20 20 20 20 20 20 5b 73 74 72 69  .          [stri
6fb0: 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a 72 65 6c  ng length $::rel
6fc0: 65 61 73 65 5f 76 65 72 73 69 6f 6e 5d 20 3e 20  ease_version] > 
6fd0: 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
6fe0: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
6ff0: 4e 4f 54 45 3a 20 54 68 65 20 72 65 6c 65 61 73  NOTE: The releas
7000: 65 20 76 65 72 73 69 6f 6e 20 68 61 73 20 62 65  e version has be
7010: 65 6e 20 6f 76 65 72 72 69 64 64 65 6e 3b 20 74  en overridden; t
7020: 68 65 72 65 66 6f 72 65 2c 20 75 73 65 20 69 74  herefore, use it
7030: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
7040: 20 20 76 65 72 62 61 74 69 6d 2e 0d 0a 20 20 20    verbatim...   
7050: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
7060: 72 65 74 75 72 6e 20 24 3a 3a 72 65 6c 65 61 73  return $::releas
7070: 65 5f 76 65 72 73 69 6f 6e 0d 0a 20 20 20 20 20  e_version..     
7080: 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
7090: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
70a0: 4e 4f 54 45 3a 20 4e 6f 20 72 65 6c 65 61 73 65  NOTE: No release
70b0: 20 76 65 72 73 69 6f 6e 20 69 73 20 61 76 61 69   version is avai
70c0: 6c 61 62 6c 65 2c 20 72 65 74 75 72 6e 20 61 6e  lable, return an
70d0: 20 65 6d 70 74 79 20 73 74 72 69 6e 67 2e 0d 0a   empty string...
70e0: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
70f0: 49 74 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20  It is important 
7100: 74 6f 20 72 65 74 75 72 6e 20 61 6e 20 65 6d 70  to return an emp
7110: 74 79 20 73 74 72 69 6e 67 20 68 65 72 65 20 62  ty string here b
7120: 65 63 61 75 73 65 20 74 68 65 0d 0a 20 20 20 20  ecause the..    
7130: 20 20 20 20 23 20 20 20 20 20 20 20 72 65 73 75      #       resu
7140: 6c 74 20 6f 66 20 74 68 69 73 20 70 72 6f 63 65  lt of this proce
7150: 64 75 72 65 20 6d 61 79 20 62 65 20 75 73 65 64  dure may be used
7160: 20 77 69 74 68 20 5b 66 69 6c 65 20 6a 6f 69 6e   with [file join
7170: 5d 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  ]...        #.. 
7180: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 22 22         return ""
7190: 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d  ..      }..    }
71a0: 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65  .....    proc ge
71b0: 74 42 75 69 6c 64 46 69 6c 65 4e 61 6d 65 20 7b  tBuildFileName {
71c0: 20 66 69 6c 65 4e 61 6d 65 20 7b 70 6c 61 74 66   fileName {platf
71d0: 6f 72 6d 20 22 22 7d 20 7d 20 7b 0d 0a 20 20 20  orm ""} } {..   
71e0: 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
71f0: 54 45 3a 20 52 65 74 75 72 6e 73 20 74 68 65 20  TE: Returns the 
7200: 73 70 65 63 69 66 69 65 64 20 66 69 6c 65 20 6e  specified file n
7210: 61 6d 65 20 61 73 20 69 66 20 69 74 20 77 65 72  ame as if it wer
7220: 65 20 6c 6f 63 61 74 65 64 20 69 6e 20 74 68 65  e located in the
7230: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
7240: 62 75 69 6c 64 20 64 69 72 65 63 74 6f 72 79 2c  build directory,
7250: 20 64 69 73 63 61 72 64 69 6e 67 20 61 6e 79 20   discarding any 
7260: 64 69 72 65 63 74 6f 72 79 20 69 6e 66 6f 72 6d  directory inform
7270: 61 74 69 6f 6e 20 70 72 65 73 65 6e 74 0d 0a 20  ation present.. 
7280: 20 20 20 20 20 23 20 20 20 20 20 20 20 69 6e 20       #       in 
7290: 74 68 65 20 66 69 6c 65 20 6e 61 6d 65 20 61 73  the file name as
72a0: 20 70 72 6f 76 69 64 65 64 20 62 79 20 6f 75 72   provided by our
72b0: 20 63 61 6c 6c 65 72 2e 0d 0a 20 20 20 20 20 20   caller...      
72c0: 23 0d 0a 20 20 20 20 20 20 73 65 74 20 72 65 73  #..      set res
72d0: 75 6c 74 20 5b 66 69 6c 65 20 6e 61 74 69 76 65  ult [file native
72e0: 6e 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20 20 20  name \..        
72f0: 20 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5b 67 65    [file join [ge
7300: 74 42 75 69 6c 64 44 69 72 65 63 74 6f 72 79 5d  tBuildDirectory]
7310: 20 24 70 6c 61 74 66 6f 72 6d 20 5b 66 69 6c 65   $platform [file
7320: 20 74 61 69 6c 20 24 66 69 6c 65 4e 61 6d 65 5d   tail $fileName]
7330: 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ]]....      #.. 
7340: 20 20 20 20 20 23 20 48 41 43 4b 3a 20 57 68 65       # HACK: Whe
7350: 6e 20 72 75 6e 6e 69 6e 67 20 6f 6e 20 57 6f 57  n running on WoW
7360: 36 34 2c 20 61 73 73 75 6d 65 20 74 68 65 20 74  64, assume the t
7370: 65 73 74 20 65 78 65 63 75 74 61 62 6c 65 73 20  est executables 
7380: 61 72 65 20 70 72 65 73 65 6e 74 0d 0a 20 20 20  are present..   
7390: 20 20 20 23 20 20 20 20 20 20 20 77 69 74 68 20     #       with 
73a0: 74 68 65 20 22 33 32 22 20 73 75 66 66 69 78 20  the "32" suffix 
73b0: 6f 6e 20 74 68 65 6d 2e 0d 0a 20 20 20 20 20 20  on them...      
73c0: 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 73  #..      if {[is
73d0: 52 75 6e 6e 69 6e 67 57 6f 57 36 34 5d 20 26 26  RunningWoW64] &&
73e0: 20 5b 66 69 6c 65 20 65 78 74 65 6e 73 69 6f 6e   [file extension
73f0: 20 24 72 65 73 75 6c 74 5d 20 65 71 20 22 2e 65   $result] eq ".e
7400: 78 65 22 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  xe"} then {..   
7410: 20 20 20 20 20 73 65 74 20 72 65 73 75 6c 74 20       set result 
7420: 5b 61 70 70 65 6e 64 41 72 67 73 20 5b 66 69 6c  [appendArgs [fil
7430: 65 20 72 6f 6f 74 6e 61 6d 65 20 24 72 65 73 75  e rootname $resu
7440: 6c 74 5d 20 33 32 2e 65 78 65 5d 0d 0a 20 20 20  lt] 32.exe]..   
7450: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65     }....      re
7460: 74 75 72 6e 20 24 72 65 73 75 6c 74 0d 0a 20 20  turn $result..  
7470: 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
7480: 20 67 65 74 45 78 74 65 72 6e 61 6c 44 69 72 65   getExternalDire
7490: 63 74 6f 72 79 20 7b 7d 20 7b 0d 0a 20 20 20 20  ctory {} {..    
74a0: 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
74b0: 45 3a 20 54 68 69 73 20 70 72 6f 63 65 64 75 72  E: This procedur
74c0: 65 20 72 65 74 75 72 6e 73 20 74 68 65 20 64 69  e returns the di
74d0: 72 65 63 74 6f 72 79 20 77 68 65 72 65 20 74 68  rectory where th
74e0: 65 20 65 78 74 65 72 6e 61 6c 20 62 69 6e 61 72  e external binar
74f0: 79 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  y..      #      
7500: 20 66 69 6c 65 73 20 61 72 65 20 6c 6f 63 61 74   files are locat
7510: 65 64 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  ed...      #..  
7520: 20 20 20 20 72 65 74 75 72 6e 20 5b 66 69 6c 65      return [file
7530: 20 6e 61 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c   nativename [fil
7540: 65 20 64 69 72 6e 61 6d 65 20 5b 66 69 6c 65 20  e dirname [file 
7550: 64 69 72 6e 61 6d 65 20 5b 69 6e 66 6f 20 62 69  dirname [info bi
7560: 6e 61 72 79 5d 5d 5d 5d 0d 0a 20 20 20 20 7d 0d  nary]]]]..    }.
7570: 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74  ....    proc get
7580: 42 69 6e 61 72 79 44 69 72 65 63 74 6f 72 79 20  BinaryDirectory 
7590: 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20  {} {..      #.. 
75a0: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 69       # NOTE: Thi
75b0: 73 20 70 72 6f 63 65 64 75 72 65 20 72 65 74 75  s procedure retu
75c0: 72 6e 73 20 74 68 65 20 64 69 72 65 63 74 6f 72  rns the director
75d0: 79 20 77 68 65 72 65 20 74 68 65 20 74 65 73 74  y where the test
75e0: 20 61 70 70 6c 69 63 61 74 69 6f 6e 0d 0a 20 20   application..  
75f0: 20 20 20 20 23 20 20 20 20 20 20 20 69 74 73 65      #       itse
7600: 6c 66 20 28 69 2e 65 2e 20 74 68 65 20 45 61 67  lf (i.e. the Eag
7610: 6c 65 20 73 68 65 6c 6c 29 20 69 73 20 6c 6f 63  le shell) is loc
7620: 61 74 65 64 2e 20 20 54 68 69 73 20 77 69 6c 6c  ated.  This will
7630: 20 62 65 20 75 73 65 64 20 61 73 0d 0a 20 20 20   be used as..   
7640: 20 20 20 23 20 20 20 20 20 20 20 74 68 65 20 64     #       the d
7650: 65 73 74 69 6e 61 74 69 6f 6e 20 66 6f 72 20 74  estination for t
7660: 68 65 20 63 6f 70 69 65 64 20 53 79 73 74 65 6d  he copied System
7670: 2e 44 61 74 61 2e 53 51 4c 69 74 65 20 6e 61 74  .Data.SQLite nat
7680: 69 76 65 20 61 6e 64 0d 0a 20 20 20 20 20 20 23  ive and..      #
7690: 20 20 20 20 20 20 20 6d 61 6e 61 67 65 64 20 61         managed a
76a0: 73 73 65 6d 62 6c 69 65 73 20 28 69 2e 65 2e 20  ssemblies (i.e. 
76b0: 62 65 63 61 75 73 65 20 74 68 69 73 20 69 73 20  because this is 
76c0: 6f 6e 65 20 6f 66 20 74 68 65 20 66 65 77 20 70  one of the few p
76d0: 6c 61 63 65 73 0d 0a 20 20 20 20 20 20 23 20 20  laces..      #  
76e0: 20 20 20 20 20 77 68 65 72 65 20 74 68 65 20 43       where the C
76f0: 4c 52 20 77 69 6c 6c 20 61 63 74 75 61 6c 6c 79  LR will actually
7700: 20 66 69 6e 64 20 61 6e 64 20 6c 6f 61 64 20 74   find and load t
7710: 68 65 6d 20 70 72 6f 70 65 72 6c 79 29 2e 0d 0a  hem properly)...
7720: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69        #..      i
7730: 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20  f {[info exists 
7740: 3a 3a 62 69 6e 61 72 79 5f 64 69 72 65 63 74 6f  ::binary_directo
7750: 72 79 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20  ry] && \..      
7760: 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67      [string leng
7770: 74 68 20 24 3a 3a 62 69 6e 61 72 79 5f 64 69 72  th $::binary_dir
7780: 65 63 74 6f 72 79 5d 20 3e 20 30 7d 20 74 68 65  ectory] > 0} the
7790: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  n {..        #..
77a0: 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
77b0: 54 68 65 20 6c 6f 63 61 74 69 6f 6e 20 6f 66 20  The location of 
77c0: 74 68 65 20 62 69 6e 61 72 79 20 64 69 72 65 63  the binary direc
77d0: 74 6f 72 79 20 68 61 73 20 62 65 65 6e 20 6f 76  tory has been ov
77e0: 65 72 72 69 64 64 65 6e 3b 0d 0a 20 20 20 20 20  erridden;..     
77f0: 20 20 20 23 20 20 20 20 20 20 20 74 68 65 72 65     #       there
7800: 66 6f 72 65 2c 20 75 73 65 20 69 74 20 76 65 72  fore, use it ver
7810: 62 61 74 69 6d 2e 0d 0a 20 20 20 20 20 20 20 20  batim...        
7820: 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  #..        retur
7830: 6e 20 24 3a 3a 62 69 6e 61 72 79 5f 64 69 72 65  n $::binary_dire
7840: 63 74 6f 72 79 0d 0a 20 20 20 20 20 20 7d 20 65  ctory..      } e
7850: 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 72  lse {..        r
7860: 65 74 75 72 6e 20 5b 69 6e 66 6f 20 62 69 6e 61  eturn [info bina
7870: 72 79 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20  ry]..      }..  
7880: 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
7890: 20 67 65 74 45 78 74 65 72 6e 61 6c 46 69 6c 65   getExternalFile
78a0: 4e 61 6d 65 20 7b 20 66 69 6c 65 4e 61 6d 65 20  Name { fileName 
78b0: 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  } {..      #..  
78c0: 20 20 20 20 23 20 4e 4f 54 45 3a 20 52 65 74 75      # NOTE: Retu
78d0: 72 6e 73 20 74 68 65 20 73 70 65 63 69 66 69 65  rns the specifie
78e0: 64 20 66 69 6c 65 20 6e 61 6d 65 20 61 73 20 69  d file name as i
78f0: 66 20 69 74 20 77 65 72 65 20 6c 6f 63 61 74 65  f it were locate
7900: 64 20 69 6e 20 74 68 65 0d 0a 20 20 20 20 20 20  d in the..      
7910: 23 20 20 20 20 20 20 20 64 69 72 65 63 74 6f 72  #       director
7920: 79 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  y containing the
7930: 20 65 78 74 65 72 6e 61 6c 20 62 69 6e 61 72 69   external binari
7940: 65 73 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  es...      #..  
7950: 20 20 20 20 72 65 74 75 72 6e 20 5b 66 69 6c 65      return [file
7960: 20 6e 61 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c   nativename [fil
7970: 65 20 6a 6f 69 6e 20 5b 67 65 74 45 78 74 65 72  e join [getExter
7980: 6e 61 6c 44 69 72 65 63 74 6f 72 79 5d 20 24 66  nalDirectory] $f
7990: 69 6c 65 4e 61 6d 65 5d 5d 0d 0a 20 20 20 20 7d  ileName]]..    }
79a0: 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65  .....    proc ge
79b0: 74 42 69 6e 61 72 79 46 69 6c 65 4e 61 6d 65 20  tBinaryFileName 
79c0: 7b 20 66 69 6c 65 4e 61 6d 65 20 7b 70 6c 61 74  { fileName {plat
79d0: 66 6f 72 6d 20 22 22 7d 20 7d 20 7b 0d 0a 20 20  form ""} } {..  
79e0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
79f0: 4f 54 45 3a 20 52 65 74 75 72 6e 73 20 74 68 65  OTE: Returns the
7a00: 20 73 70 65 63 69 66 69 65 64 20 66 69 6c 65 20   specified file 
7a10: 6e 61 6d 65 20 61 73 20 69 66 20 69 74 20 77 65  name as if it we
7a20: 72 65 20 6c 6f 63 61 74 65 64 20 69 6e 20 74 68  re located in th
7a30: 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  e..      #      
7a40: 20 62 69 6e 61 72 79 20 64 69 72 65 63 74 6f 72   binary director
7a50: 79 2c 20 64 69 73 63 61 72 64 69 6e 67 20 61 6e  y, discarding an
7a60: 79 20 64 69 72 65 63 74 6f 72 79 20 69 6e 66 6f  y directory info
7a70: 72 6d 61 74 69 6f 6e 20 70 72 65 73 65 6e 74 0d  rmation present.
7a80: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 69  .      #       i
7a90: 6e 20 74 68 65 20 66 69 6c 65 20 6e 61 6d 65 20  n the file name 
7aa0: 61 73 20 70 72 6f 76 69 64 65 64 20 62 79 20 6f  as provided by o
7ab0: 75 72 20 63 61 6c 6c 65 72 2e 0d 0a 20 20 20 20  ur caller...    
7ac0: 20 20 23 0d 0a 20 20 20 20 20 20 72 65 74 75 72    #..      retur
7ad0: 6e 20 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e 61  n [file nativena
7ae0: 6d 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  me \..          
7af0: 5b 66 69 6c 65 20 6a 6f 69 6e 20 5b 67 65 74 42  [file join [getB
7b00: 69 6e 61 72 79 44 69 72 65 63 74 6f 72 79 5d 20  inaryDirectory] 
7b10: 24 70 6c 61 74 66 6f 72 6d 20 5b 66 69 6c 65 20  $platform [file 
7b20: 74 61 69 6c 20 24 66 69 6c 65 4e 61 6d 65 5d 5d  tail $fileName]]
7b30: 5d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  ]..    }.....   
7b40: 20 70 72 6f 63 20 67 65 74 43 6f 72 65 42 69 6e   proc getCoreBin
7b50: 61 72 79 46 69 6c 65 4e 61 6d 65 20 7b 20 7b 70  aryFileName { {p
7b60: 6c 61 74 66 6f 72 6d 20 22 22 7d 20 7b 73 74 61  latform ""} {sta
7b70: 6e 64 61 72 64 20 22 22 7d 20 7d 20 7b 0d 0a 20  ndard ""} } {.. 
7b80: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
7b90: 4e 4f 54 45 3a 20 52 65 74 75 72 6e 73 20 74 68  NOTE: Returns th
7ba0: 65 20 66 75 6c 6c 20 70 61 74 68 20 66 6f 72 20  e full path for 
7bb0: 74 68 65 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e  the file contain
7bc0: 69 6e 67 20 74 68 65 20 53 51 4c 69 74 65 20 63  ing the SQLite c
7bd0: 6f 72 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ore..      #    
7be0: 20 20 20 6e 61 74 69 76 65 20 6c 69 62 72 61 72     native librar
7bf0: 79 20 63 6f 64 65 20 66 6f 72 20 74 68 69 73 20  y code for this 
7c00: 70 6c 61 74 66 6f 72 6d 2e 20 20 46 69 72 73 74  platform.  First
7c10: 2c 20 63 68 65 63 6b 20 61 6e 64 20 73 65 65 20  , check and see 
7c20: 69 66 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  if..      #     
7c30: 20 20 74 68 65 20 53 51 4c 69 74 65 20 63 6f 72    the SQLite cor
7c40: 65 20 6e 61 74 69 76 65 20 6c 69 62 72 61 72 79  e native library
7c50: 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
7c60: 6e 20 6c 6f 61 64 65 64 2e 20 20 4e 65 78 74 2c  n loaded.  Next,
7c70: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
7c80: 66 61 6c 6c 62 61 63 6b 20 74 6f 20 77 68 61 74  fallback to what
7c90: 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68 20 73   the full path s
7ca0: 68 6f 75 6c 64 20 62 65 2c 20 62 61 73 65 64 20  hould be, based 
7cb0: 6f 6e 20 77 68 65 74 68 65 72 20 74 68 65 0d 0a  on whether the..
7cc0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 6d 69        #       mi
7cd0: 78 65 64 2d 6d 6f 64 65 20 61 73 73 65 6d 62 6c  xed-mode assembl
7ce0: 79 20 69 73 20 62 65 69 6e 67 20 75 73 65 64 20  y is being used 
7cf0: 61 6e 64 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  and the name of 
7d00: 74 68 65 20 63 75 72 72 65 6e 74 0d 0a 20 20 20  the current..   
7d10: 20 20 20 23 20 20 20 20 20 20 20 70 6c 61 74 66     #       platf
7d20: 6f 72 6d 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  orm...      #.. 
7d30: 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20       if {[catch 
7d40: 7b 0d 0a 20 20 20 20 20 20 20 20 6f 62 6a 65 63  {..        objec
7d50: 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20  t invoke -flags 
7d60: 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20  +NonPublic \..  
7d70: 20 20 20 20 20 20 20 20 20 20 53 79 73 74 65 6d            System
7d80: 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 55 6e 73  .Data.SQLite.Uns
7d90: 61 66 65 4e 61 74 69 76 65 4d 65 74 68 6f 64 73  afeNativeMethods
7da0: 20 5f 53 51 4c 69 74 65 4e 61 74 69 76 65 4d 6f   _SQLiteNativeMo
7db0: 64 75 6c 65 46 69 6c 65 4e 61 6d 65 0d 0a 20 20  duleFileName..  
7dc0: 20 20 20 20 7d 20 66 69 6c 65 4e 61 6d 65 5d 20      } fileName] 
7dd0: 3d 3d 20 30 20 26 26 20 5b 73 74 72 69 6e 67 20  == 0 && [string 
7de0: 6c 65 6e 67 74 68 20 24 66 69 6c 65 4e 61 6d 65  length $fileName
7df0: 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20  ] > 0} then {.. 
7e00: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
7e10: 20 20 23 20 4e 4f 54 45 3a 20 54 68 65 20 53 51    # NOTE: The SQ
7e20: 4c 69 74 65 20 63 6f 72 65 20 6e 61 74 69 76 65  Lite core native
7e30: 20 6c 69 62 72 61 72 79 20 68 61 73 20 61 6c 72   library has alr
7e40: 65 61 64 79 20 62 65 65 6e 20 6c 6f 61 64 65 64  eady been loaded
7e50: 20 76 69 61 0d 0a 20 20 20 20 20 20 20 20 23 20   via..        # 
7e60: 20 20 20 20 20 20 74 68 65 20 6e 61 74 69 76 65        the native
7e70: 20 6c 69 62 72 61 72 79 20 70 72 65 2d 6c 6f 61   library pre-loa
7e80: 64 65 72 2e 20 20 52 65 74 75 72 6e 20 74 68 61  der.  Return tha
7e90: 74 20 66 69 6c 65 20 6e 61 6d 65 20 6e 6f 77 2e  t file name now.
7ea0: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
7eb0: 20 20 20 20 20 72 65 74 75 72 6e 20 24 66 69 6c       return $fil
7ec0: 65 4e 61 6d 65 0d 0a 20 20 20 20 20 20 7d 0d 0a  eName..      }..
7ed0: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
7ee0: 20 23 20 4e 4f 54 45 3a 20 49 66 20 74 68 65 20   # NOTE: If the 
7ef0: 22 6e 61 74 69 76 65 22 20 72 75 6e 74 69 6d 65  "native" runtime
7f00: 20 6f 70 74 69 6f 6e 20 68 61 73 20 62 65 65 6e   option has been
7f10: 20 73 65 74 2c 20 61 6c 77 61 79 73 20 72 65 74   set, always ret
7f20: 75 72 6e 20 74 68 65 0d 0a 20 20 20 20 20 20 23  urn the..      #
7f30: 20 20 20 20 20 20 20 66 69 6c 65 20 6e 61 6d 65         file name
7f40: 20 66 6f 72 20 74 68 65 20 6d 69 78 65 64 2d 6d   for the mixed-m
7f50: 6f 64 65 20 61 73 73 65 6d 62 6c 79 2e 0d 0a 20  ode assembly... 
7f60: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66       #..      if
7f70: 20 7b 5b 68 61 73 52 75 6e 74 69 6d 65 4f 70 74   {[hasRuntimeOpt
7f80: 69 6f 6e 20 6e 61 74 69 76 65 5d 7d 20 74 68 65  ion native]} the
7f90: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  n {..        #..
7fa0: 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
7fb0: 52 65 74 75 72 6e 20 74 68 65 20 6d 69 78 65 64  Return the mixed
7fc0: 2d 6d 6f 64 65 20 61 73 73 65 6d 62 6c 79 20 66  -mode assembly f
7fd0: 69 6c 65 20 6e 61 6d 65 2e 0d 0a 20 20 20 20 20  ile name...     
7fe0: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65     #..        re
7ff0: 74 75 72 6e 20 5b 66 69 6c 65 20 6e 61 74 69 76  turn [file nativ
8000: 65 6e 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20 20  ename \..       
8010: 20 20 20 20 20 5b 66 69 6c 65 20 6a 6f 69 6e 20       [file join 
8020: 5b 67 65 74 42 69 6e 61 72 79 44 69 72 65 63 74  [getBinaryDirect
8030: 6f 72 79 5d 20 24 70 6c 61 74 66 6f 72 6d 20 53  ory] $platform S
8040: 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
8050: 65 2e 64 6c 6c 5d 5d 0d 0a 20 20 20 20 20 20 7d  e.dll]]..      }
8060: 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  ....      #..   
8070: 20 20 20 23 20 4e 4f 54 45 3a 20 41 72 65 20 77     # NOTE: Are w
8080: 65 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20  e attempting to 
8090: 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65  automatically de
80a0: 74 65 63 74 20 77 68 65 74 68 65 72 20 6f 72 20  tect whether or 
80b0: 6e 6f 74 20 74 68 65 0d 0a 20 20 20 20 20 20 23  not the..      #
80c0: 20 20 20 20 20 20 20 69 6e 74 65 72 6f 70 20 61         interop a
80d0: 73 73 65 6d 62 6c 79 20 73 68 6f 75 6c 64 20 62  ssembly should b
80e0: 65 20 75 73 65 64 3f 0d 0a 20 20 20 20 20 20 23  e used?..      #
80f0: 0d 0a 20 20 20 20 20 20 73 65 74 20 61 75 74 6f  ..      set auto
8100: 6d 61 74 69 63 20 5b 65 78 70 72 20 7b 5b 73 74  matic [expr {[st
8110: 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 73 74 61  ring length $sta
8120: 6e 64 61 72 64 5d 20 3d 3d 20 30 7d 5d 0d 0a 0d  ndard] == 0}]...
8130: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
8140: 23 20 4e 4f 54 45 3a 20 46 69 72 73 74 2c 20 69  # NOTE: First, i
8150: 6e 20 65 69 74 68 65 72 20 22 61 75 74 6f 6d 61  n either "automa
8160: 74 69 63 22 20 6f 72 20 22 6e 6f 6e 2d 73 74 61  tic" or "non-sta
8170: 6e 64 61 72 64 22 20 6d 6f 64 65 73 2c 20 61 74  ndard" modes, at
8180: 74 65 6d 70 74 0d 0a 20 20 20 20 20 20 23 20 20  tempt..      #  
8190: 20 20 20 20 20 74 6f 20 66 69 6e 64 20 74 68 65       to find the
81a0: 20 6e 61 74 69 76 65 2d 6f 6e 6c 79 20 69 6e 74   native-only int
81b0: 65 72 6f 70 20 61 73 73 65 6d 62 6c 79 2e 0d 0a  erop assembly...
81c0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69        #..      i
81d0: 66 20 7b 24 61 75 74 6f 6d 61 74 69 63 20 7c 7c  f {$automatic ||
81e0: 20 21 24 73 74 61 6e 64 61 72 64 7d 20 74 68 65   !$standard} the
81f0: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  n {..        #..
8200: 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
8210: 41 74 74 65 6d 70 74 20 74 6f 20 64 65 74 65 72  Attempt to deter
8220: 6d 69 6e 65 20 74 68 65 20 6e 61 74 69 76 65 2d  mine the native-
8230: 6f 6e 6c 79 20 69 6e 74 65 72 6f 70 20 61 73 73  only interop ass
8240: 65 6d 62 6c 79 20 66 69 6c 65 0d 0a 20 20 20 20  embly file..    
8250: 20 20 20 20 23 20 20 20 20 20 20 20 6e 61 6d 65      #       name
8260: 20 66 6f 72 20 74 68 69 73 20 70 6c 61 74 66 6f   for this platfo
8270: 72 6d 20 61 6e 64 20 74 68 65 6e 20 72 65 74 75  rm and then retu
8280: 72 6e 20 69 74 2e 0d 0a 20 20 20 20 20 20 20 20  rn it...        
8290: 23 0d 0a 20 20 20 20 20 20 20 20 66 6f 72 65 61  #..        forea
82a0: 63 68 20 66 69 6c 65 4e 61 6d 65 4f 6e 6c 79 20  ch fileNameOnly 
82b0: 5b 67 65 74 49 6e 74 65 72 6f 70 41 73 73 65 6d  [getInteropAssem
82c0: 62 6c 79 46 69 6c 65 4e 61 6d 65 73 4f 6e 6c 79  blyFileNamesOnly
82d0: 5d 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73  ] {..          s
82e0: 65 74 20 66 69 6c 65 4e 61 6d 65 20 5b 66 69 6c  et fileName [fil
82f0: 65 20 6e 61 74 69 76 65 6e 61 6d 65 20 5c 0d 0a  e nativename \..
8300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 66                [f
8310: 69 6c 65 20 6a 6f 69 6e 20 5b 67 65 74 42 69 6e  ile join [getBin
8320: 61 72 79 44 69 72 65 63 74 6f 72 79 5d 20 24 70  aryDirectory] $p
8330: 6c 61 74 66 6f 72 6d 20 24 66 69 6c 65 4e 61 6d  latform $fileNam
8340: 65 4f 6e 6c 79 5d 5d 0d 0a 0d 0a 20 20 20 20 20  eOnly]]....     
8350: 20 20 20 20 20 69 66 20 7b 5b 66 69 6c 65 20 65       if {[file e
8360: 78 69 73 74 73 20 24 66 69 6c 65 4e 61 6d 65 5d  xists $fileName]
8370: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
8380: 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 66 69        return $fi
8390: 6c 65 4e 61 6d 65 0d 0a 20 20 20 20 20 20 20 20  leName..        
83a0: 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a    }..        }..
83b0: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
83c0: 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
83d0: 3a 20 54 68 65 6e 2c 20 69 6e 20 65 69 74 68 65  : Then, in eithe
83e0: 72 20 22 61 75 74 6f 6d 61 74 69 63 22 20 6f 72  r "automatic" or
83f0: 20 22 73 74 61 6e 64 61 72 64 22 20 6d 6f 64 65   "standard" mode
8400: 73 2c 20 61 74 74 65 6d 70 74 20 74 6f 0d 0a 20  s, attempt to.. 
8410: 20 20 20 20 20 23 20 20 20 20 20 20 20 66 69 6e       #       fin
8420: 64 20 74 68 65 20 73 74 61 6e 64 61 72 64 20 53  d the standard S
8430: 51 4c 69 74 65 20 6c 69 62 72 61 72 79 2e 0d 0a  QLite library...
8440: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69        #..      i
8450: 66 20 7b 24 61 75 74 6f 6d 61 74 69 63 20 7c 7c  f {$automatic ||
8460: 20 24 73 74 61 6e 64 61 72 64 7d 20 74 68 65 6e   $standard} then
8470: 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20   {..        #.. 
8480: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41         # NOTE: A
8490: 74 74 65 6d 70 74 20 74 6f 20 64 65 74 65 72 6d  ttempt to determ
84a0: 69 6e 65 20 74 68 65 20 6e 61 74 69 76 65 2d 6f  ine the native-o
84b0: 6e 6c 79 20 73 74 61 6e 64 61 72 64 20 53 51 4c  nly standard SQL
84c0: 69 74 65 20 6c 69 62 72 61 72 79 0d 0a 20 20 20  ite library..   
84d0: 20 20 20 20 20 23 20 20 20 20 20 20 20 66 69 6c       #       fil
84e0: 65 20 6e 61 6d 65 20 66 6f 72 20 74 68 69 73 20  e name for this 
84f0: 70 6c 61 74 66 6f 72 6d 20 61 6e 64 20 74 68 65  platform and the
8500: 6e 20 72 65 74 75 72 6e 20 69 74 2e 0d 0a 20 20  n return it...  
8510: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
8520: 20 66 6f 72 65 61 63 68 20 66 69 6c 65 4e 61 6d   foreach fileNam
8530: 65 4f 6e 6c 79 20 5b 67 65 74 4e 61 74 69 76 65  eOnly [getNative
8540: 4c 69 62 72 61 72 79 46 69 6c 65 4e 61 6d 65 73  LibraryFileNames
8550: 4f 6e 6c 79 5d 20 7b 0d 0a 20 20 20 20 20 20 20  Only] {..       
8560: 20 20 20 73 65 74 20 66 69 6c 65 4e 61 6d 65 20     set fileName 
8570: 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65  [file nativename
8580: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
8590: 20 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5b 67 65    [file join [ge
85a0: 74 42 69 6e 61 72 79 44 69 72 65 63 74 6f 72 79  tBinaryDirectory
85b0: 5d 20 24 70 6c 61 74 66 6f 72 6d 20 24 66 69 6c  ] $platform $fil
85c0: 65 4e 61 6d 65 4f 6e 6c 79 5d 5d 0d 0a 0d 0a 20  eNameOnly]].... 
85d0: 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 66 69           if {[fi
85e0: 6c 65 20 65 78 69 73 74 73 20 24 66 69 6c 65 4e  le exists $fileN
85f0: 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ame]} then {..  
8600: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
8610: 20 24 66 69 6c 65 4e 61 6d 65 0d 0a 20 20 20 20   $fileName..    
8620: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
8630: 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20   }..      }.... 
8640: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
8650: 4e 4f 54 45 3a 20 57 61 73 20 74 68 65 20 6d 61  NOTE: Was the ma
8660: 6e 61 67 65 64 20 61 73 73 65 6d 62 6c 79 20 63  naged assembly c
8670: 6f 6d 70 69 6c 65 64 20 65 78 70 65 63 74 69 6e  ompiled expectin
8680: 67 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20 74  g to deal with t
8690: 68 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  he..      #     
86a0: 20 20 73 74 61 6e 64 61 72 64 20 63 6f 72 65 20    standard core 
86b0: 6c 69 62 72 61 72 79 3f 0d 0a 20 20 20 20 20 20  library?..      
86c0: 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 68 61  #..      if {[ha
86d0: 76 65 53 51 4c 69 74 65 44 65 66 69 6e 65 43 6f  veSQLiteDefineCo
86e0: 6e 73 74 61 6e 74 20 53 51 4c 49 54 45 5f 53 54  nstant SQLITE_ST
86f0: 41 4e 44 41 52 44 5d 20 7c 7c 20 5c 0d 0a 20 20  ANDARD] || \..  
8700: 20 20 20 20 20 20 20 20 5b 68 61 76 65 53 51 4c          [haveSQL
8710: 69 74 65 44 65 66 69 6e 65 43 6f 6e 73 74 61 6e  iteDefineConstan
8720: 74 20 53 51 4c 49 54 45 5f 53 54 41 4e 44 41 52  t SQLITE_STANDAR
8730: 44 5f 4c 49 42 52 41 52 59 5f 4e 41 4d 45 5d 7d  D_LIBRARY_NAME]}
8740: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
8750: 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
8760: 54 45 3a 20 46 61 6c 6c 62 61 63 6b 20 74 6f 20  TE: Fallback to 
8770: 72 65 74 75 72 6e 69 6e 67 20 74 68 65 20 6e 61  returning the na
8780: 74 69 76 65 2d 6f 6e 6c 79 20 73 74 61 6e 64 61  tive-only standa
8790: 72 64 20 53 51 4c 69 74 65 20 6c 69 62 72 61 72  rd SQLite librar
87a0: 79 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  y..        #    
87b0: 20 20 20 66 69 6c 65 20 6e 61 6d 65 20 66 6f 72     file name for
87c0: 20 74 68 65 20 70 6c 61 74 66 6f 72 6d 2e 0d 0a   the platform...
87d0: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
87e0: 20 20 20 73 65 74 20 66 69 6c 65 4e 61 6d 65 73     set fileNames
87f0: 4f 6e 6c 79 20 5b 67 65 74 4e 61 74 69 76 65 4c  Only [getNativeL
8800: 69 62 72 61 72 79 46 69 6c 65 4e 61 6d 65 73 4f  ibraryFileNamesO
8810: 6e 6c 79 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  nly]....        
8820: 69 66 20 7b 5b 6c 6c 65 6e 67 74 68 20 24 66 69  if {[llength $fi
8830: 6c 65 4e 61 6d 65 73 4f 6e 6c 79 5d 20 3d 3d 20  leNamesOnly] == 
8840: 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
8850: 20 20 20 20 20 72 65 74 75 72 6e 20 22 22 0d 0a       return ""..
8860: 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
8870: 20 20 20 20 20 72 65 74 75 72 6e 20 5b 66 69 6c       return [fil
8880: 65 20 6e 61 74 69 76 65 6e 61 6d 65 20 5b 66 69  e nativename [fi
8890: 6c 65 20 6a 6f 69 6e 20 5c 0d 0a 20 20 20 20 20  le join \..     
88a0: 20 20 20 20 20 20 20 5b 67 65 74 42 69 6e 61 72         [getBinar
88b0: 79 44 69 72 65 63 74 6f 72 79 5d 20 24 70 6c 61  yDirectory] $pla
88c0: 74 66 6f 72 6d 20 5b 6c 69 6e 64 65 78 20 24 66  tform [lindex $f
88d0: 69 6c 65 4e 61 6d 65 73 4f 6e 6c 79 20 30 5d 5d  ileNamesOnly 0]]
88e0: 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20  ]..      } else 
88f0: 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
8900: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 46 61        # NOTE: Fa
8910: 6c 6c 62 61 63 6b 20 74 6f 20 72 65 74 75 72 6e  llback to return
8920: 69 6e 67 20 74 68 65 20 6e 61 74 69 76 65 2d 6f  ing the native-o
8930: 6e 6c 79 20 69 6e 74 65 72 6f 70 20 61 73 73 65  nly interop asse
8940: 6d 62 6c 79 20 66 69 6c 65 0d 0a 20 20 20 20 20  mbly file..     
8950: 20 20 20 23 20 20 20 20 20 20 20 6e 61 6d 65 20     #       name 
8960: 66 6f 72 20 74 68 65 20 70 6c 61 74 66 6f 72 6d  for the platform
8970: 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
8980: 20 20 20 20 20 20 73 65 74 20 66 69 6c 65 4e 61        set fileNa
8990: 6d 65 73 4f 6e 6c 79 20 5b 67 65 74 49 6e 74 65  mesOnly [getInte
89a0: 72 6f 70 41 73 73 65 6d 62 6c 79 46 69 6c 65 4e  ropAssemblyFileN
89b0: 61 6d 65 73 4f 6e 6c 79 5d 0d 0a 0d 0a 20 20 20  amesOnly]....   
89c0: 20 20 20 20 20 69 66 20 7b 5b 6c 6c 65 6e 67 74       if {[llengt
89d0: 68 20 24 66 69 6c 65 4e 61 6d 65 73 4f 6e 6c 79  h $fileNamesOnly
89e0: 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  ] == 0} then {..
89f0: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
8a00: 20 22 22 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a   ""..        }..
8a10: 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ..        return
8a20: 20 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d   [file nativenam
8a30: 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5c 0d 0a  e [file join \..
8a40: 20 20 20 20 20 20 20 20 20 20 20 20 5b 67 65 74              [get
8a50: 42 69 6e 61 72 79 44 69 72 65 63 74 6f 72 79 5d  BinaryDirectory]
8a60: 20 24 70 6c 61 74 66 6f 72 6d 20 5b 6c 69 6e 64   $platform [lind
8a70: 65 78 20 24 66 69 6c 65 4e 61 6d 65 73 4f 6e 6c  ex $fileNamesOnl
8a80: 79 20 30 5d 5d 5d 0d 0a 20 20 20 20 20 20 7d 0d  y 0]]]..      }.
8a90: 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70  .    }.....    p
8aa0: 72 6f 63 20 67 65 74 43 6f 6d 6d 6f 6e 44 69 72  roc getCommonDir
8ab0: 65 63 74 6f 72 79 20 7b 7d 20 7b 0d 0a 20 20 20  ectory {} {..   
8ac0: 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
8ad0: 54 45 3a 20 54 68 69 73 20 70 72 6f 63 65 64 75  TE: This procedu
8ae0: 72 65 20 72 65 74 75 72 6e 73 20 74 68 65 20 64  re returns the d
8af0: 69 72 65 63 74 6f 72 79 20 77 68 65 72 65 20 74  irectory where t
8b00: 68 65 20 74 65 73 74 20 73 63 72 69 70 74 73 0d  he test scripts.
8b10: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 73  .      #       s
8b20: 68 6f 75 6c 64 20 62 65 20 6c 6f 63 61 74 65 64  hould be located
8b30: 2e 20 20 42 79 20 64 65 66 61 75 6c 74 2c 20 74  .  By default, t
8b40: 68 69 73 20 6a 75 73 74 20 72 65 74 75 72 6e 73  his just returns
8b50: 20 74 68 65 20 45 61 67 6c 65 0d 0a 20 20 20 20   the Eagle..    
8b60: 20 20 23 20 20 20 20 20 20 20 62 69 6e 61 72 79    #       binary
8b70: 20 64 69 72 65 63 74 6f 72 79 2e 0d 0a 20 20 20   directory...   
8b80: 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
8b90: 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 63  [info exists ::c
8ba0: 6f 6d 6d 6f 6e 5f 64 69 72 65 63 74 6f 72 79 5d  ommon_directory]
8bb0: 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20   && \..         
8bc0: 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20   [string length 
8bd0: 24 3a 3a 63 6f 6d 6d 6f 6e 5f 64 69 72 65 63 74  $::common_direct
8be0: 6f 72 79 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b  ory] > 0} then {
8bf0: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
8c00: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 65       # NOTE: The
8c10: 20 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 74 68 65   location of the
8c20: 20 63 6f 6d 6d 6f 6e 20 64 69 72 65 63 74 6f 72   common director
8c30: 79 20 68 61 73 20 62 65 65 6e 20 73 65 74 3b 0d  y has been set;.
8c40: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
8c50: 20 74 68 65 72 65 66 6f 72 65 2c 20 75 73 65 20   therefore, use 
8c60: 69 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  it...        #..
8c70: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 24          return $
8c80: 3a 3a 63 6f 6d 6d 6f 6e 5f 64 69 72 65 63 74 6f  ::common_directo
8c90: 72 79 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65  ry..      } else
8ca0: 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73  if {[info exists
8cb0: 20 3a 3a 76 65 6e 64 6f 72 5f 64 69 72 65 63 74   ::vendor_direct
8cc0: 6f 72 79 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20  ory] && \..     
8cd0: 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e       [string len
8ce0: 67 74 68 20 24 3a 3a 76 65 6e 64 6f 72 5f 64 69  gth $::vendor_di
8cf0: 72 65 63 74 6f 72 79 5d 20 3e 20 30 7d 20 74 68  rectory] > 0} th
8d00: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d  en {..        #.
8d10: 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
8d20: 20 54 68 65 20 6c 6f 63 61 74 69 6f 6e 20 6f 66   The location of
8d30: 20 74 68 65 20 76 65 6e 64 6f 72 20 64 69 72 65   the vendor dire
8d40: 63 74 6f 72 79 20 68 61 73 20 62 65 65 6e 20 73  ctory has been s
8d50: 65 74 3b 0d 0a 20 20 20 20 20 20 20 20 23 20 20  et;..        #  
8d60: 20 20 20 20 20 74 68 65 72 65 66 6f 72 65 2c 20       therefore, 
8d70: 75 73 65 20 69 74 2e 0d 0a 20 20 20 20 20 20 20  use it...       
8d80: 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75   #..        retu
8d90: 72 6e 20 24 3a 3a 76 65 6e 64 6f 72 5f 64 69 72  rn $::vendor_dir
8da0: 65 63 74 6f 72 79 0d 0a 20 20 20 20 20 20 7d 20  ectory..      } 
8db0: 65 6c 73 65 69 66 20 7b 5b 69 6e 66 6f 20 65 78  elseif {[info ex
8dc0: 69 73 74 73 20 3a 3a 74 63 6c 5f 6c 69 62 72 61  ists ::tcl_libra
8dd0: 72 79 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20  ry] && \..      
8de0: 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67      [string leng
8df0: 74 68 20 24 3a 3a 74 63 6c 5f 6c 69 62 72 61 72  th $::tcl_librar
8e00: 79 5d 20 3e 20 30 20 26 26 20 5c 0d 0a 20 20 20  y] > 0 && \..   
8e10: 20 20 20 20 20 20 20 5b 66 69 6c 65 20 69 73 64         [file isd
8e20: 69 72 65 63 74 6f 72 79 20 24 3a 3a 74 63 6c 5f  irectory $::tcl_
8e30: 6c 69 62 72 61 72 79 5d 7d 20 74 68 65 6e 20 7b  library]} then {
8e40: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
8e50: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 65       # NOTE: The
8e60: 20 76 61 72 69 61 62 6c 65 20 77 69 74 68 20 74   variable with t
8e70: 68 65 20 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 74  he location of t
8e80: 68 65 20 73 63 72 69 70 74 20 6c 69 62 72 61 72  he script librar
8e90: 79 20 69 73 0d 0a 20 20 20 20 20 20 20 20 23 20  y is..        # 
8ea0: 20 20 20 20 20 20 73 65 74 20 61 6e 64 20 61 70        set and ap
8eb0: 70 65 61 72 73 20 74 6f 20 62 65 20 61 20 72 65  pears to be a re
8ec0: 61 6c 20 64 69 72 65 63 74 6f 72 79 20 28 69 2e  al directory (i.
8ed0: 65 2e 20 6e 6f 74 20 65 6d 62 65 64 64 65 64 0d  e. not embedded.
8ee0: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
8ef0: 20 77 69 74 68 69 6e 20 61 20 66 69 6c 65 29 3b   within a file);
8f00: 20 74 68 65 72 65 66 6f 72 65 2c 20 75 73 65 20   therefore, use 
8f10: 69 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  it...        #..
8f20: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 24          return $
8f30: 3a 3a 74 63 6c 5f 6c 69 62 72 61 72 79 0d 0a 20  ::tcl_library.. 
8f40: 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
8f50: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
8f60: 20 20 23 20 4e 4f 54 45 3a 20 46 61 6c 6c 62 61    # NOTE: Fallba
8f70: 63 6b 20 74 6f 20 74 68 65 20 64 69 72 65 63 74  ck to the direct
8f80: 6f 72 79 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ory containing t
8f90: 68 65 20 65 78 65 63 75 74 61 62 6c 65 2e 0d 0a  he executable...
8fa0: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
8fb0: 20 20 20 72 65 74 75 72 6e 20 5b 69 6e 66 6f 20     return [info 
8fc0: 62 69 6e 61 72 79 5d 0d 0a 20 20 20 20 20 20 7d  binary]..      }
8fd0: 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
8fe0: 70 72 6f 63 20 67 65 74 44 61 74 61 62 61 73 65  proc getDatabase
8ff0: 44 69 72 65 63 74 6f 72 79 20 7b 7d 20 7b 0d 0a  Directory {} {..
9000: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
9010: 20 4e 4f 54 45 3a 20 54 68 69 73 20 70 72 6f 63   NOTE: This proc
9020: 65 64 75 72 65 20 72 65 74 75 72 6e 73 20 74 68  edure returns th
9030: 65 20 64 69 72 65 63 74 6f 72 79 20 77 68 65 72  e directory wher
9040: 65 20 74 68 65 20 74 65 73 74 20 64 61 74 61 62  e the test datab
9050: 61 73 65 73 0d 0a 20 20 20 20 20 20 23 20 20 20  ases..      #   
9060: 20 20 20 20 73 68 6f 75 6c 64 20 62 65 20 6c 6f      should be lo
9070: 63 61 74 65 64 2e 20 20 42 79 20 64 65 66 61 75  cated.  By defau
9080: 6c 74 2c 20 74 68 69 73 20 6a 75 73 74 20 75 73  lt, this just us
9090: 65 73 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  es the temporary
90a0: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
90b0: 64 69 72 65 63 74 6f 72 79 20 63 6f 6e 66 69 67  directory config
90c0: 75 72 65 64 20 66 6f 72 20 74 68 69 73 20 73 79  ured for this sy
90d0: 73 74 65 6d 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  stem...      #..
90e0: 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20        if {[info 
90f0: 65 78 69 73 74 73 20 3a 3a 64 61 74 61 62 61 73  exists ::databas
9100: 65 5f 64 69 72 65 63 74 6f 72 79 5d 20 26 26 20  e_directory] && 
9110: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 73 74  \..          [st
9120: 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a 64  ring length $::d
9130: 61 74 61 62 61 73 65 5f 64 69 72 65 63 74 6f 72  atabase_director
9140: 79 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  y] > 0} then {..
9150: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
9160: 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 65 20 6c     # NOTE: The l
9170: 6f 63 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 64  ocation of the d
9180: 61 74 61 62 61 73 65 20 64 69 72 65 63 74 6f 72  atabase director
9190: 79 20 68 61 73 20 62 65 65 6e 20 6f 76 65 72 72  y has been overr
91a0: 69 64 64 65 6e 3b 0d 0a 20 20 20 20 20 20 20 20  idden;..        
91b0: 23 20 20 20 20 20 20 20 74 68 65 72 65 66 6f 72  #       therefor
91c0: 65 2c 20 75 73 65 20 69 74 2e 0d 0a 20 20 20 20  e, use it...    
91d0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72      #..        r
91e0: 65 74 75 72 6e 20 24 3a 3a 64 61 74 61 62 61 73  eturn $::databas
91f0: 65 5f 64 69 72 65 63 74 6f 72 79 0d 0a 20 20 20  e_directory..   
9200: 20 20 20 7d 20 65 6c 73 65 69 66 20 7b 5b 69 6e     } elseif {[in
9210: 66 6f 20 65 78 69 73 74 73 20 3a 3a 73 63 72 61  fo exists ::scra
9220: 74 63 68 5f 64 69 72 65 63 74 6f 72 79 5d 20 26  tch_directory] &
9230: 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b  & \..          [
9240: 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a  string length $:
9250: 3a 73 63 72 61 74 63 68 5f 64 69 72 65 63 74 6f  :scratch_directo
9260: 72 79 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d  ry] > 0} then {.
9270: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
9280: 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 65 20      # NOTE: The 
9290: 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  location of the 
92a0: 73 63 72 61 74 63 68 20 64 69 72 65 63 74 6f 72  scratch director
92b0: 79 20 68 61 73 20 62 65 65 6e 20 6f 76 65 72 72  y has been overr
92c0: 69 64 64 65 6e 3b 0d 0a 20 20 20 20 20 20 20 20  idden;..        
92d0: 23 20 20 20 20 20 20 20 74 68 65 72 65 66 6f 72  #       therefor
92e0: 65 2c 20 75 73 65 20 69 74 2e 0d 0a 20 20 20 20  e, use it...    
92f0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72      #..        r
9300: 65 74 75 72 6e 20 24 3a 3a 73 63 72 61 74 63 68  eturn $::scratch
9310: 5f 64 69 72 65 63 74 6f 72 79 0d 0a 20 20 20 20  _directory..    
9320: 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
9330: 20 20 20 20 72 65 74 75 72 6e 20 5b 67 65 74 54      return [getT
9340: 65 6d 70 6f 72 61 72 79 50 61 74 68 5d 0d 0a 20  emporaryPath].. 
9350: 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c       }..    }...
9360: 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74 54 65  ..    proc getTe
9370: 6d 70 6f 72 61 72 79 44 69 72 65 63 74 6f 72 79  mporaryDirectory
9380: 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a   {} {..      #..
9390: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68        # NOTE: Th
93a0: 69 73 20 70 72 6f 63 65 64 75 72 65 20 72 65 74  is procedure ret
93b0: 75 72 6e 73 20 74 68 65 20 64 69 72 65 63 74 6f  urns the directo
93c0: 72 79 20 77 68 65 72 65 20 74 68 65 20 74 65 6d  ry where the tem
93d0: 70 6f 72 61 72 79 20 66 69 6c 65 73 0d 0a 20 20  porary files..  
93e0: 20 20 20 20 23 20 20 20 20 20 20 20 73 68 6f 75      #       shou
93f0: 6c 64 20 62 65 20 6c 6f 63 61 74 65 64 2e 20 20  ld be located.  
9400: 42 79 20 64 65 66 61 75 6c 74 2c 20 74 68 69 73  By default, this
9410: 20 6a 75 73 74 20 75 73 65 73 20 74 68 65 20 74   just uses the t
9420: 65 6d 70 6f 72 61 72 79 0d 0a 20 20 20 20 20 20  emporary..      
9430: 23 20 20 20 20 20 20 20 64 69 72 65 63 74 6f 72  #       director
9440: 79 20 63 6f 6e 66 69 67 75 72 65 64 20 66 6f 72  y configured for
9450: 20 74 68 69 73 20 73 79 73 74 65 6d 2e 0d 0a 20   this system... 
9460: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66       #..      if
9470: 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a   {[info exists :
9480: 3a 74 65 6d 70 6f 72 61 72 79 5f 64 69 72 65 63  :temporary_direc
9490: 74 6f 72 79 5d 20 26 26 20 5c 0d 0a 20 20 20 20  tory] && \..    
94a0: 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65        [string le
94b0: 6e 67 74 68 20 24 3a 3a 74 65 6d 70 6f 72 61 72  ngth $::temporar
94c0: 79 5f 64 69 72 65 63 74 6f 72 79 5d 20 3e 20 30  y_directory] > 0
94d0: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
94e0: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
94f0: 4f 54 45 3a 20 54 68 65 20 6c 6f 63 61 74 69 6f  OTE: The locatio
9500: 6e 20 6f 66 20 74 68 65 20 74 65 6d 70 6f 72 61  n of the tempora
9510: 72 79 20 64 69 72 65 63 74 6f 72 79 20 68 61 73  ry directory has
9520: 20 62 65 65 6e 20 6f 76 65 72 72 69 64 64 65 6e   been overridden
9530: 3b 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  ;..        #    
9540: 20 20 20 74 68 65 72 65 66 6f 72 65 2c 20 75 73     therefore, us
9550: 65 20 69 74 2e 0d 0a 20 20 20 20 20 20 20 20 23  e it...        #
9560: 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ..        return
9570: 20 24 3a 3a 74 65 6d 70 6f 72 61 72 79 5f 64 69   $::temporary_di
9580: 72 65 63 74 6f 72 79 0d 0a 20 20 20 20 20 20 7d  rectory..      }
9590: 20 65 6c 73 65 69 66 20 7b 5b 69 6e 66 6f 20 65   elseif {[info e
95a0: 78 69 73 74 73 20 3a 3a 73 63 72 61 74 63 68 5f  xists ::scratch_
95b0: 64 69 72 65 63 74 6f 72 79 5d 20 26 26 20 5c 0d  directory] && \.
95c0: 0a 20 20 20 20 20 20 20 20 20 20 5b 73 74 72 69  .          [stri
95d0: 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a 73 63 72  ng length $::scr
95e0: 61 74 63 68 5f 64 69 72 65 63 74 6f 72 79 5d 20  atch_directory] 
95f0: 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  > 0} then {..   
9600: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
9610: 23 20 4e 4f 54 45 3a 20 54 68 65 20 6c 6f 63 61  # NOTE: The loca
9620: 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 63 72 61  tion of the scra
9630: 74 63 68 20 64 69 72 65 63 74 6f 72 79 20 68 61  tch directory ha
9640: 73 20 62 65 65 6e 20 6f 76 65 72 72 69 64 64 65  s been overridde
9650: 6e 3b 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  n;..        #   
9660: 20 20 20 20 74 68 65 72 65 66 6f 72 65 2c 20 75      therefore, u
9670: 73 65 20 69 74 2e 0d 0a 20 20 20 20 20 20 20 20  se it...        
9680: 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  #..        retur
9690: 6e 20 24 3a 3a 73 63 72 61 74 63 68 5f 64 69 72  n $::scratch_dir
96a0: 65 63 74 6f 72 79 0d 0a 20 20 20 20 20 20 7d 20  ectory..      } 
96b0: 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
96c0: 72 65 74 75 72 6e 20 5b 67 65 74 54 65 6d 70 6f  return [getTempo
96d0: 72 61 72 79 50 61 74 68 5d 0d 0a 20 20 20 20 20  raryPath]..     
96e0: 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20   }..    }.....  
96f0: 20 20 70 72 6f 63 20 67 65 74 45 78 65 63 75 74    proc getExecut
9700: 65 4f 6e 53 65 74 75 70 20 7b 7d 20 7b 0d 0a 20  eOnSetup {} {.. 
9710: 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65       if {[info e
9720: 78 69 73 74 73 20 3a 3a 65 78 65 63 75 74 65 5f  xists ::execute_
9730: 6f 6e 5f 73 65 74 75 70 5d 20 26 26 20 5c 0d 0a  on_setup] && \..
9740: 20 20 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e            [strin
9750: 67 20 6c 65 6e 67 74 68 20 24 3a 3a 65 78 65 63  g length $::exec
9760: 75 74 65 5f 6f 6e 5f 73 65 74 75 70 5d 20 3e 20  ute_on_setup] > 
9770: 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
9780: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
9790: 4e 4f 54 45 3a 20 52 65 74 75 72 6e 20 74 68 65  NOTE: Return the
97a0: 20 63 6f 6e 66 69 67 75 72 65 64 20 53 51 4c 20   configured SQL 
97b0: 74 6f 20 65 78 65 63 75 74 65 20 64 75 72 69 6e  to execute durin
97c0: 67 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  g the connection
97d0: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
97e0: 20 20 73 65 74 75 70 20 70 72 6f 63 65 64 75 72    setup procedur
97f0: 65 20 28 69 2e 65 2e 20 66 6f 72 20 65 76 65 72  e (i.e. for ever
9800: 79 20 74 65 73 74 20 64 61 74 61 62 61 73 65 20  y test database 
9810: 63 6f 6e 6e 65 63 74 69 6f 6e 29 2e 0d 0a 20 20  connection)...  
9820: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
9830: 20 72 65 74 75 72 6e 20 24 3a 3a 65 78 65 63 75   return $::execu
9840: 74 65 5f 6f 6e 5f 73 65 74 75 70 0d 0a 20 20 20  te_on_setup..   
9850: 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
9860: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
9870: 23 20 4e 4f 54 45 3a 20 42 79 20 64 65 66 61 75  # NOTE: By defau
9880: 6c 74 2c 20 74 68 65 72 65 20 69 73 20 6e 6f 20  lt, there is no 
9890: 53 51 4c 20 74 6f 20 65 78 65 63 75 74 65 20 64  SQL to execute d
98a0: 75 72 69 6e 67 20 74 68 65 20 63 6f 6e 6e 65 63  uring the connec
98b0: 74 69 6f 6e 0d 0a 20 20 20 20 20 20 20 20 23 20  tion..        # 
98c0: 20 20 20 20 20 20 73 65 74 75 70 20 70 72 6f 63        setup proc
98d0: 65 64 75 72 65 20 28 69 2e 65 2e 20 66 6f 72 20  edure (i.e. for 
98e0: 65 76 65 72 79 20 74 65 73 74 20 64 61 74 61 62  every test datab
98f0: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 29 2e  ase connection).
9900: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
9910: 20 20 20 20 20 72 65 74 75 72 6e 20 22 22 0d 0a       return ""..
9920: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a        }..    }..
9930: 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74 54  ...    proc getT
9940: 65 73 74 4f 76 65 72 72 69 64 65 73 50 72 65 61  estOverridesPrea
9950: 6d 62 6c 65 20 7b 20 7b 65 78 74 72 61 56 61 72  mble { {extraVar
9960: 4e 61 6d 65 73 20 22 22 7d 20 7d 20 7b 0d 0a 20  Names ""} } {.. 
9970: 20 20 20 20 20 73 65 74 20 76 61 72 4e 61 6d 65       set varName
9980: 73 20 5b 6c 69 73 74 5d 0d 0a 0d 0a 20 20 20 20  s [list]....    
9990: 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
99a0: 45 3a 20 49 66 20 61 76 61 69 6c 61 62 6c 65 2c  E: If available,
99b0: 20 73 74 61 72 74 20 77 69 74 68 20 74 68 65 20   start with the 
99c0: 6d 61 73 74 65 72 20 6c 69 73 74 20 6f 66 20 74  master list of t
99d0: 65 73 74 20 6f 76 65 72 72 69 64 65 0d 0a 20 20  est override..  
99e0: 20 20 20 20 23 20 20 20 20 20 20 20 76 61 72 69      #       vari
99f0: 61 62 6c 65 73 2e 0d 0a 20 20 20 20 20 20 23 0d  ables...      #.
9a00: 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f  .      if {[info
9a10: 20 65 78 69 73 74 73 20 3a 3a 74 65 73 74 5f 6f   exists ::test_o
9a20: 76 65 72 72 69 64 65 73 5d 20 26 26 20 5c 0d 0a  verrides] && \..
9a30: 20 20 20 20 20 20 20 20 20 20 5b 6c 6c 65 6e 67            [lleng
9a40: 74 68 20 24 3a 3a 74 65 73 74 5f 6f 76 65 72 72  th $::test_overr
9a50: 69 64 65 73 5d 20 3e 20 30 7d 20 74 68 65 6e 20  ides] > 0} then 
9a60: 7b 0d 0a 20 20 20 20 20 20 20 20 65 76 61 6c 20  {..        eval 
9a70: 6c 61 70 70 65 6e 64 20 76 61 72 4e 61 6d 65 73  lappend varNames
9a80: 20 24 3a 3a 74 65 73 74 5f 6f 76 65 72 72 69 64   $::test_overrid
9a90: 65 73 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  es..      }.... 
9aa0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
9ab0: 4e 4f 54 45 3a 20 49 66 20 72 65 71 75 65 73 74  NOTE: If request
9ac0: 65 64 20 62 79 20 6f 75 72 20 63 61 6c 6c 65 72  ed by our caller
9ad0: 2c 20 61 64 64 20 61 6e 79 20 61 64 64 69 74 69  , add any additi
9ae0: 6f 6e 61 6c 20 76 61 72 69 61 62 6c 65 0d 0a 20  onal variable.. 
9af0: 20 20 20 20 20 23 20 20 20 20 20 20 20 6e 61 6d       #       nam
9b00: 65 73 20 74 6f 20 63 6f 70 79 20 6e 6f 77 2e 0d  es to copy now..
9b10: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
9b20: 69 66 20 7b 5b 6c 6c 65 6e 67 74 68 20 24 65 78  if {[llength $ex
9b30: 74 72 61 56 61 72 4e 61 6d 65 73 5d 20 3e 20 30  traVarNames] > 0
9b40: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
9b50: 20 20 65 76 61 6c 20 6c 61 70 70 65 6e 64 20 76    eval lappend v
9b60: 61 72 4e 61 6d 65 73 20 24 65 78 74 72 61 56 61  arNames $extraVa
9b70: 72 4e 61 6d 65 73 0d 0a 20 20 20 20 20 20 7d 0d  rNames..      }.
9b80: 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
9b90: 20 20 23 20 4e 4f 54 45 3a 20 42 75 69 6c 64 20    # NOTE: Build 
9ba0: 74 68 65 20 73 63 72 69 70 74 20 66 72 61 67 6d  the script fragm
9bb0: 65 6e 74 20 74 6f 20 62 65 20 72 65 74 75 72 6e  ent to be return
9bc0: 65 64 20 62 79 20 70 72 6f 63 65 73 73 69 6e 67  ed by processing
9bd0: 20 65 61 63 68 0d 0a 20 20 20 20 20 20 23 20 20   each..      #  
9be0: 20 20 20 20 20 76 61 72 69 61 62 6c 65 20 6e 61       variable na
9bf0: 6d 65 20 61 6e 64 20 61 64 64 69 6e 67 20 74 68  me and adding th
9c00: 65 20 6e 65 63 65 63 65 73 73 61 72 79 20 73 63  e nececessary sc
9c10: 72 69 70 74 20 66 72 61 67 6d 65 6e 74 73 20 66  ript fragments f
9c20: 6f 72 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  or..      #     
9c30: 20 20 65 61 63 68 20 6f 6e 65 2e 0d 0a 20 20 20    each one...   
9c40: 20 20 20 23 0d 0a 20 20 20 20 20 20 73 65 74 20     #..      set 
9c50: 72 65 73 75 6c 74 20 22 22 0d 0a 0d 0a 20 20 20  result ""....   
9c60: 20 20 20 66 6f 72 65 61 63 68 20 76 61 72 4e 61     foreach varNa
9c70: 6d 65 20 24 76 61 72 4e 61 6d 65 73 20 7b 0d 0a  me $varNames {..
9c80: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
9c90: 20 20 20 23 20 4e 4f 54 45 3a 20 42 75 69 6c 64     # NOTE: Build
9ca0: 20 74 68 65 20 71 75 61 6c 69 66 69 65 64 20 67   the qualified g
9cb0: 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20 6e  lobal variable n
9cc0: 61 6d 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  ame...        #.
9cd0: 0a 20 20 20 20 20 20 20 20 73 65 74 20 66 75 6c  .        set ful
9ce0: 6c 56 61 72 4e 61 6d 65 20 5b 61 70 70 65 6e 64  lVarName [append
9cf0: 41 72 67 73 20 3a 3a 20 24 76 61 72 4e 61 6d 65  Args :: $varName
9d00: 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  ]....        #..
9d10: 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
9d20: 44 6f 65 73 20 74 68 65 20 76 61 72 69 61 62 6c  Does the variabl
9d30: 65 20 65 78 69 73 74 20 69 6e 20 74 68 69 73 20  e exist in this 
9d40: 69 6e 74 65 72 70 72 65 74 65 72 20 63 6f 6e 74  interpreter cont
9d50: 65 78 74 3f 0d 0a 20 20 20 20 20 20 20 20 23 0d  ext?..        #.
9d60: 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 69 6e  .        if {[in
9d70: 66 6f 20 65 78 69 73 74 73 20 24 66 75 6c 6c 56  fo exists $fullV
9d80: 61 72 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d  arName]} then {.
9d90: 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
9da0: 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
9db0: 41 70 70 65 6e 64 20 61 20 73 63 72 69 70 74 20  Append a script 
9dc0: 66 72 61 67 6d 65 6e 74 20 74 6f 20 74 68 65 20  fragment to the 
9dd0: 72 65 73 75 6c 74 20 74 68 61 74 20 77 69 6c 6c  result that will
9de0: 20 63 6f 72 72 65 63 74 6c 79 0d 0a 20 20 20 20   correctly..    
9df0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63 6f        #       co
9e00: 70 79 20 61 6e 79 20 63 6f 6e 74 61 69 6e 65 64  py any contained
9e10: 20 76 61 6c 75 65 20 74 6f 20 61 6e 6f 74 68 65   value to anothe
9e20: 72 20 69 6e 74 65 72 70 72 65 74 65 72 20 63 6f  r interpreter co
9e30: 6e 74 65 78 74 2e 0d 0a 20 20 20 20 20 20 20 20  ntext...        
9e40: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 61    #..          a
9e50: 70 70 65 6e 64 20 72 65 73 75 6c 74 20 5c 6e 20  ppend result \n 
9e60: 22 73 65 74 20 22 20 24 66 75 6c 6c 56 61 72 4e  "set " $fullVarN
9e70: 61 6d 65 20 22 20 5c 7b 22 20 5b 73 65 74 20 24  ame " \{" [set $
9e80: 66 75 6c 6c 56 61 72 4e 61 6d 65 5d 20 5c 7d 0d  fullVarName] \}.
9e90: 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  .        }..    
9ea0: 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a    }....      #..
9eb0: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 66        # NOTE: If
9ec0: 20 74 68 65 20 72 65 73 75 6c 74 20 63 6f 6e 74   the result cont
9ed0: 61 69 6e 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  ains one or more
9ee0: 20 73 63 72 69 70 74 20 66 72 61 67 6d 65 6e 74   script fragment
9ef0: 73 2c 20 61 70 70 65 6e 64 20 61 0d 0a 20 20 20  s, append a..   
9f00: 20 20 20 23 20 20 20 20 20 20 20 6e 65 77 6c 69     #       newli
9f10: 6e 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  ne...      #..  
9f20: 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20      if {[string 
9f30: 6c 65 6e 67 74 68 20 24 72 65 73 75 6c 74 5d 20  length $result] 
9f40: 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  > 0} then {..   
9f50: 20 20 20 20 20 61 70 70 65 6e 64 20 72 65 73 75       append resu
9f60: 6c 74 20 5c 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a  lt \n..      }..
9f70: 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 24  ..      return $
9f80: 72 65 73 75 6c 74 0d 0a 20 20 20 20 7d 0d 0a 0c  result..    }...
9f90: 0d 0a 20 20 20 20 70 72 6f 63 20 6d 6f 76 65 53  ..    proc moveS
9fa0: 79 73 74 65 6d 44 61 74 61 53 51 4c 69 74 65 44  ystemDataSQLiteD
9fb0: 6c 6c 43 6f 6e 66 69 67 20 7b 20 7b 72 65 73 74  llConfig { {rest
9fc0: 6f 72 65 20 66 61 6c 73 65 7d 20 7b 76 65 72 62  ore false} {verb
9fd0: 6f 73 65 20 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a  ose false} } {..
9fe0: 20 20 20 20 20 20 73 65 74 20 64 69 72 65 63 74        set direct
9ff0: 6f 72 79 20 5b 6f 62 6a 65 63 74 20 69 6e 76 6f  ory [object invo
a000: 6b 65 20 41 70 70 44 6f 6d 61 69 6e 20 43 75 72  ke AppDomain Cur
a010: 72 65 6e 74 44 6f 6d 61 69 6e 2e 42 61 73 65 44  rentDomain.BaseD
a020: 69 72 65 63 74 6f 72 79 5d 0d 0a 0d 0a 20 20 20  irectory]....   
a030: 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c     if {[string l
a040: 65 6e 67 74 68 20 24 64 69 72 65 63 74 6f 72 79  ength $directory
a050: 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  ] == 0} then {..
a060: 20 20 20 20 20 20 20 20 69 66 20 7b 24 76 65 72          if {$ver
a070: 62 6f 73 65 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  bose} then {..  
a080: 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
a090: 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61  :test_channel [a
a0a0: 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
a0b0: 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
a0c0: 20 73 6b 69 70 70 65 64 20 6d 6f 76 69 6e 67 20   skipped moving 
a0d0: 5c 22 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51  \"System.Data.SQ
a0e0: 4c 69 74 65 2e 64 6c 6c 2e 63 6f 6e 66 69 67 5c  Lite.dll.config\
a0f0: 22 2c 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20  ", " \..        
a100: 20 20 20 20 20 20 22 6e 6f 20 62 61 73 65 20 64        "no base d
a110: 69 72 65 63 74 6f 72 79 5c 6e 22 5d 0d 0a 20 20  irectory\n"]..  
a120: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
a130: 20 72 65 74 75 72 6e 0d 0a 20 20 20 20 20 20 7d   return..      }
a140: 0d 0a 0d 0a 20 20 20 20 20 20 73 65 74 20 66 69  ....      set fi
a150: 6c 65 4e 61 6d 65 28 31 29 20 5b 66 69 6c 65 20  leName(1) [file 
a160: 6e 6f 72 6d 61 6c 69 7a 65 20 5c 0d 0a 20 20 20  normalize \..   
a170: 20 20 20 20 20 20 20 5b 66 69 6c 65 20 6a 6f 69         [file joi
a180: 6e 20 24 64 69 72 65 63 74 6f 72 79 20 53 79 73  n $directory Sys
a190: 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e  tem.Data.SQLite.
a1a0: 64 6c 6c 2e 63 6f 6e 66 69 67 5d 5d 0d 0a 0d 0a  dll.config]]....
a1b0: 20 20 20 20 20 20 73 65 74 20 66 69 6c 65 4e 61        set fileNa
a1c0: 6d 65 28 32 29 20 5b 61 70 70 65 6e 64 41 72 67  me(2) [appendArg
a1d0: 73 20 24 66 69 6c 65 4e 61 6d 65 28 31 29 20 2e  s $fileName(1) .
a1e0: 6d 6f 76 65 64 5d 0d 0a 0d 0a 20 20 20 20 20 20  moved]....      
a1f0: 69 66 20 7b 24 72 65 73 74 6f 72 65 7d 20 74 68  if {$restore} th
a200: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66  en {..        if
a210: 20 7b 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24   {[file exists $
a220: 66 69 6c 65 4e 61 6d 65 28 32 29 5d 7d 20 74 68  fileName(2)]} th
a230: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
a240: 66 69 6c 65 20 72 65 6e 61 6d 65 20 24 66 69 6c  file rename $fil
a250: 65 4e 61 6d 65 28 32 29 20 24 66 69 6c 65 4e 61  eName(2) $fileNa
a260: 6d 65 28 31 29 0d 0a 0d 0a 20 20 20 20 20 20 20  me(1)....       
a270: 20 20 20 69 66 20 7b 24 76 65 72 62 6f 73 65 7d     if {$verbose}
a280: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
a290: 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
a2a0: 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
a2b0: 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
a2c0: 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
a2d0: 6d 6f 76 65 64 20 5c 22 22 20 24 66 69 6c 65 4e  moved \"" $fileN
a2e0: 61 6d 65 28 32 29 20 22 5c 22 20 74 6f 20 5c 22  ame(2) "\" to \"
a2f0: 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  " \..           
a300: 20 20 20 20 20 24 66 69 6c 65 4e 61 6d 65 28 31       $fileName(1
a310: 29 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20 20  ) \"\n]..       
a320: 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 20     }..        } 
a330: 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
a340: 20 20 69 66 20 7b 24 76 65 72 62 6f 73 65 7d 20    if {$verbose} 
a350: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
a360: 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
a370: 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e  t_channel [appen
a380: 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
a390: 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 73           "---- s
a3a0: 6b 69 70 70 65 64 20 6d 6f 76 69 6e 67 20 5c 22  kipped moving \"
a3b0: 22 20 24 66 69 6c 65 4e 61 6d 65 28 32 29 20 5c  " $fileName(2) \
a3c0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
a3d0: 20 20 22 5c 22 2c 20 69 74 20 64 6f 65 73 20 6e    "\", it does n
a3e0: 6f 74 20 65 78 69 73 74 5c 6e 22 5d 0d 0a 20 20  ot exist\n"]..  
a3f0: 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
a400: 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 20 65 6c     }..      } el
a410: 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66  se {..        if
a420: 20 7b 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24   {[file exists $
a430: 66 69 6c 65 4e 61 6d 65 28 31 29 5d 7d 20 74 68  fileName(1)]} th
a440: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
a450: 66 69 6c 65 20 72 65 6e 61 6d 65 20 24 66 69 6c  file rename $fil
a460: 65 4e 61 6d 65 28 31 29 20 24 66 69 6c 65 4e 61  eName(1) $fileNa
a470: 6d 65 28 32 29 0d 0a 0d 0a 20 20 20 20 20 20 20  me(2)....       
a480: 20 20 20 69 66 20 7b 24 76 65 72 62 6f 73 65 7d     if {$verbose}
a490: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
a4a0: 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
a4b0: 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
a4c0: 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
a4d0: 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
a4e0: 6d 6f 76 65 64 20 5c 22 22 20 24 66 69 6c 65 4e  moved \"" $fileN
a4f0: 61 6d 65 28 31 29 20 22 5c 22 20 74 6f 20 5c 22  ame(1) "\" to \"
a500: 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  " \..           
a510: 20 20 20 20 20 24 66 69 6c 65 4e 61 6d 65 28 32       $fileName(2
a520: 29 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20 20  ) \"\n]..       
a530: 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 20     }..        } 
a540: 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
a550: 20 20 69 66 20 7b 24 76 65 72 62 6f 73 65 7d 20    if {$verbose} 
a560: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
a570: 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
a580: 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e  t_channel [appen
a590: 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
a5a0: 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 73           "---- s
a5b0: 6b 69 70 70 65 64 20 6d 6f 76 69 6e 67 20 5c 22  kipped moving \"
a5c0: 22 20 24 66 69 6c 65 4e 61 6d 65 28 31 29 20 5c  " $fileName(1) \
a5d0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
a5e0: 20 20 22 5c 22 2c 20 69 74 20 64 6f 65 73 20 6e    "\", it does n
a5f0: 6f 74 20 65 78 69 73 74 5c 6e 22 5d 0d 0a 20 20  ot exist\n"]..  
a600: 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
a610: 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20     }..      }.. 
a620: 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
a630: 63 20 67 65 74 41 70 70 44 6f 6d 61 69 6e 50 72  c getAppDomainPr
a640: 65 61 6d 62 6c 65 20 7b 20 7b 70 72 65 66 69 78  eamble { {prefix
a650: 20 22 22 7d 20 7b 73 75 66 66 69 78 20 22 22 7d   ""} {suffix ""}
a660: 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20   } {..      #.. 
a670: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 69       # NOTE: Thi
a680: 73 20 70 72 6f 63 65 64 75 72 65 20 72 65 74 75  s procedure retu
a690: 72 6e 73 20 61 20 74 65 73 74 20 73 65 74 75 70  rns a test setup
a6a0: 20 73 63 72 69 70 74 20 66 72 61 67 6d 65 6e 74   script fragment
a6b0: 20 73 75 69 74 61 62 6c 65 20 66 6f 72 0d 0a 20   suitable for.. 
a6c0: 20 20 20 20 20 23 20 20 20 20 20 20 20 65 76 61       #       eva
a6d0: 6c 75 61 74 69 6f 6e 20 62 79 20 61 6e 20 69 6e  luation by an in
a6e0: 74 65 72 70 72 65 74 65 72 20 63 72 65 61 74 65  terpreter create
a6f0: 64 20 69 6e 20 61 6e 20 69 73 6f 6c 61 74 65 64  d in an isolated
a700: 20 61 70 70 6c 69 63 61 74 69 6f 6e 0d 0a 20 20   application..  
a710: 20 20 20 20 23 20 20 20 20 20 20 20 64 6f 6d 61      #       doma
a720: 69 6e 2e 20 20 54 68 65 20 73 63 72 69 70 74 20  in.  The script 
a730: 66 72 61 67 6d 65 6e 74 20 62 65 69 6e 67 20 72  fragment being r
a740: 65 74 75 72 6e 65 64 20 77 69 6c 6c 20 62 65 20  eturned will be 
a750: 73 75 72 72 6f 75 6e 64 65 64 20 62 79 0d 0a 20  surrounded by.. 
a760: 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68 65       #       the
a770: 20 70 72 65 66 69 78 20 61 6e 64 20 73 75 66 66   prefix and suff
a780: 69 78 20 22 73 63 72 69 70 74 20 66 72 61 67 6d  ix "script fragm
a790: 65 6e 74 73 22 20 73 70 65 63 69 66 69 65 64 20  ents" specified 
a7a0: 62 79 20 6f 75 72 20 63 61 6c 6c 65 72 2c 0d 0a  by our caller,..
a7b0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 69 66        #       if
a7c0: 20 61 6e 79 2e 20 20 54 68 65 20 65 6e 74 69 72   any.  The entir
a7d0: 65 20 73 63 72 69 70 74 20 62 65 69 6e 67 20 72  e script being r
a7e0: 65 74 75 72 6e 65 64 20 77 69 6c 6c 20 62 65 20  eturned will be 
a7f0: 73 75 62 73 74 69 74 75 74 65 64 20 76 69 61 0d  substituted via.
a800: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 5b  .      #       [
a810: 73 75 62 73 74 5d 2c 20 69 6e 20 74 68 65 20 63  subst], in the c
a820: 6f 6e 74 65 78 74 20 6f 66 20 6f 75 72 20 63 61  ontext of our ca
a830: 6c 6c 65 72 2c 20 62 65 66 6f 72 65 20 62 65 69  ller, before bei
a840: 6e 67 20 72 65 74 75 72 6e 65 64 2e 0d 0a 20 20  ng returned...  
a850: 20 20 20 20 23 20 20 20 20 20 20 20 54 68 69 73      #       This
a860: 20 73 74 65 70 20 69 73 20 6e 65 63 65 73 73 61   step is necessa
a870: 72 79 20 73 6f 20 74 68 61 74 20 73 6f 6d 65 20  ry so that some 
a880: 6c 69 6d 69 74 65 64 20 63 6f 6e 74 65 78 74 20  limited context 
a890: 69 6e 66 6f 72 6d 61 74 69 6f 6e 2c 0d 0a 20 20  information,..  
a8a0: 20 20 20 20 23 20 20 20 20 20 20 20 70 72 69 6d      #       prim
a8b0: 61 72 69 6c 79 20 72 65 6c 61 74 65 64 20 74 6f  arily related to
a8c0: 20 74 68 65 20 74 65 73 74 69 6e 67 20 64 69 72   the testing dir
a8d0: 65 63 74 6f 72 69 65 73 2c 20 63 61 6e 20 62 65  ectories, can be
a8e0: 20 74 72 61 6e 73 66 65 72 72 65 64 0d 0a 20 20   transferred..  
a8f0: 20 20 20 20 23 20 20 20 20 20 20 20 74 6f 20 74      #       to t
a900: 68 65 20 69 6e 74 65 72 70 72 65 74 65 72 20 69  he interpreter i
a910: 6e 20 74 68 65 20 69 73 6f 6c 61 74 65 64 20 61  n the isolated a
a920: 70 70 6c 69 63 61 74 69 6f 6e 20 64 6f 6d 61 69  pplication domai
a930: 6e 2c 20 6d 61 6b 69 6e 67 20 69 74 0d 0a 20 20  n, making it..  
a940: 20 20 20 20 23 20 20 20 20 20 20 20 61 62 6c 65      #       able
a950: 20 74 6f 20 73 75 63 63 65 73 73 66 75 6c 6c 79   to successfully
a960: 20 72 75 6e 20 74 65 73 74 73 20 74 68 61 74 20   run tests that 
a970: 72 65 71 75 69 72 65 20 6f 6e 65 20 6f 72 20 6d  require one or m
a980: 6f 72 65 20 6f 66 20 74 68 65 0d 0a 20 20 20 20  ore of the..    
a990: 20 20 23 20 20 20 20 20 20 20 66 69 6c 65 73 20    #       files 
a9a0: 69 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 74 65  in one of the te
a9b0: 73 74 69 6e 67 20 64 69 72 65 63 74 6f 72 69 65  sting directorie
a9c0: 73 2e 20 20 43 61 6c 6c 65 72 73 20 73 68 6f 75  s.  Callers shou
a9d0: 6c 64 20 6b 65 65 70 20 69 6e 0d 0a 20 20 20 20  ld keep in..    
a9e0: 20 20 23 20 20 20 20 20 20 20 6d 69 6e 64 20 74    #       mind t
a9f0: 68 61 74 20 74 68 65 20 74 65 73 74 20 73 63 72  hat the test scr
aa00: 69 70 74 20 66 72 61 67 6d 65 6e 74 20 62 65 69  ipt fragment bei
aa10: 6e 67 20 72 65 74 75 72 6e 65 64 20 63 61 6e 6e  ng returned cann
aa20: 6f 74 20 72 65 6c 79 20 6f 6e 0d 0a 20 20 20 20  ot rely on..    
aa30: 20 20 23 20 20 20 20 20 20 20 61 6e 79 20 73 63    #       any sc
aa40: 72 69 70 74 20 6c 69 62 72 61 72 79 20 70 72 6f  ript library pro
aa50: 63 65 64 75 72 65 73 20 74 68 61 74 20 61 72 65  cedures that are
aa60: 20 6e 6f 74 20 70 72 6f 76 69 64 65 64 20 62 79   not provided by
aa70: 20 74 68 65 20 45 61 67 6c 65 0d 0a 20 20 20 20   the Eagle..    
aa80: 20 20 23 20 20 20 20 20 20 20 6c 69 62 72 61 72    #       librar
aa90: 79 20 70 61 63 6b 61 67 65 20 28 69 2e 65 2e 20  y package (i.e. 
aaa0: 22 69 6e 69 74 2e 65 61 67 6c 65 22 29 2c 20 69  "init.eagle"), i
aab0: 6e 63 6c 75 64 69 6e 67 20 74 68 6f 73 65 20 70  ncluding those p
aac0: 72 6f 76 69 64 65 64 20 62 79 0d 0a 20 20 20 20  rovided by..    
aad0: 20 20 23 20 20 20 20 20 20 20 74 68 65 20 45 61    #       the Ea
aae0: 67 6c 65 20 74 65 73 74 20 70 61 63 6b 61 67 65  gle test package
aaf0: 2c 20 75 6e 6c 65 73 73 20 74 68 65 20 66 69 6c  , unless the fil
ab00: 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  e containing the
ab10: 6d 20 69 73 20 6c 6f 61 64 65 64 0d 0a 20 20 20  m is loaded..   
ab20: 20 20 20 23 20 20 20 20 20 20 20 6d 61 6e 75 61     #       manua
ab30: 6c 6c 79 20 76 69 61 20 73 6f 6d 65 20 6f 74 68  lly via some oth
ab40: 65 72 20 6d 65 63 68 61 6e 69 73 6d 20 28 65 2e  er mechanism (e.
ab50: 67 2e 20 62 79 20 69 6e 63 6c 75 64 69 6e 67 20  g. by including 
ab60: 61 70 70 72 6f 70 72 69 61 74 65 0d 0a 20 20 20  appropriate..   
ab70: 20 20 20 23 20 20 20 20 20 20 20 5b 70 61 63 6b     #       [pack
ab80: 61 67 65 20 72 65 71 75 69 72 65 5d 20 6f 72 20  age require] or 
ab90: 5b 73 6f 75 72 63 65 5d 20 63 6f 6d 6d 61 6e 64  [source] command
aba0: 73 20 69 6e 20 74 68 65 20 70 72 65 66 69 78 20  s in the prefix 
abb0: 6f 72 20 73 75 66 66 69 78 0d 0a 20 20 20 20 20  or suffix..     
abc0: 20 23 20 20 20 20 20 20 20 73 63 72 69 70 74 20   #       script 
abd0: 66 72 61 67 6d 65 6e 74 73 29 2e 20 20 41 6c 73  fragments).  Als
abe0: 6f 2c 20 61 6c 6c 20 76 61 72 69 61 62 6c 65 20  o, all variable 
abf0: 72 65 66 65 72 65 6e 63 65 73 20 61 6e 64 20 61  references and a
ac00: 6c 6c 20 6e 65 73 74 65 64 0d 0a 20 20 20 20 20  ll nested..     
ac10: 20 23 20 20 20 20 20 20 20 63 6f 6d 6d 61 6e 64   #       command
ac20: 73 20 28 69 2e 65 2e 20 74 68 6f 73 65 20 69 6e  s (i.e. those in
ac30: 20 73 71 75 61 72 65 20 62 72 61 63 6b 65 74 73   square brackets
ac40: 29 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74  ) contained in t
ac50: 68 65 20 66 69 6e 61 6c 0d 0a 20 20 20 20 20 20  he final..      
ac60: 23 20 20 20 20 20 20 20 73 63 72 69 70 74 20 66  #       script f
ac70: 72 61 67 6d 65 6e 74 20 77 69 6c 6c 20 65 6e 64  ragment will end
ac80: 20 75 70 20 62 65 69 6e 67 20 65 76 61 6c 75 61   up being evalua
ac90: 74 65 64 20 69 6e 20 74 68 65 20 63 6f 6e 74 65  ted in the conte
aca0: 78 74 20 6f 66 20 74 68 65 0d 0a 20 20 20 20 20  xt of the..     
acb0: 20 23 20 20 20 20 20 20 20 63 61 6c 6c 69 6e 67   #       calling
acc0: 20 69 6e 74 65 72 70 72 65 74 65 72 20 61 6e 64   interpreter and
acd0: 20 6e 6f 74 20 74 68 65 20 74 61 72 67 65 74 20   not the target 
ace0: 69 6e 74 65 72 70 72 65 74 65 72 20 63 72 65 61  interpreter crea
acf0: 74 65 64 20 69 6e 20 74 68 65 0d 0a 20 20 20 20  ted in the..    
ad00: 20 20 23 20 20 20 20 20 20 20 69 73 6f 6c 61 74    #       isolat
ad10: 65 64 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 64  ed application d
ad20: 6f 6d 61 69 6e 20 75 6e 6c 65 73 73 20 74 68 65  omain unless the
ad30: 20 64 6f 6c 6c 61 72 20 73 69 67 6e 73 20 61 6e   dollar signs an
ad40: 64 2f 6f 72 20 73 71 75 61 72 65 0d 0a 20 20 20  d/or square..   
ad50: 20 20 20 23 20 20 20 20 20 20 20 62 72 61 63 6b     #       brack
ad60: 65 74 73 20 61 72 65 20 73 70 65 63 69 61 6c 6c  ets are speciall
ad70: 79 20 71 75 6f 74 65 64 20 77 69 74 68 20 62 61  y quoted with ba
ad80: 63 6b 73 6c 61 73 68 65 73 2e 0d 0a 20 20 20 20  ckslashes...    
ad90: 20 20 23 0d 0a 20 20 20 20 20 20 72 65 74 75 72    #..      retur
ada0: 6e 20 5b 75 70 6c 65 76 65 6c 20 31 20 5b 6c 69  n [uplevel 1 [li
adb0: 73 74 20 73 75 62 73 74 20 5b 61 70 70 65 6e 64  st subst [append
adc0: 41 72 67 73 20 24 70 72 65 66 69 78 20 7b 0d 0a  Args $prefix {..
add0: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
ade0: 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 65 20 5c     # NOTE: The \
adf0: 5b 6f 62 6a 65 63 74 5c 5d 20 63 6f 6d 6d 61 6e  [object\] comman
ae00: 64 20 6d 61 79 20 62 65 20 6d 69 73 73 69 6e 67  d may be missing
ae10: 20 69 6e 20 73 6f 6d 65 20 45 61 67 6c 65 20 63   in some Eagle c
ae20: 6f 72 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20  ore..        #  
ae30: 20 20 20 20 20 6c 69 62 72 61 72 79 20 63 6f 6e       library con
ae40: 66 69 67 75 72 61 74 69 6f 6e 73 2e 20 20 43 6c  figurations.  Cl
ae50: 6f 6e 69 6e 67 20 61 6e 64 20 75 73 69 6e 67 20  oning and using 
ae60: 74 68 65 20 70 72 6f 63 65 64 75 72 65 0d 0a 20  the procedure.. 
ae70: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 5c         #       \
ae80: 5b 63 68 61 6e 67 65 4e 61 74 69 76 65 52 75 6e  [changeNativeRun
ae90: 74 69 6d 65 4f 70 74 69 6f 6e 5c 5d 20 6d 61 79  timeOption\] may
aea0: 20 68 65 6c 70 20 74 6f 20 6d 69 74 69 67 61 74   help to mitigat
aeb0: 65 20 74 68 69 73 2e 0d 0a 20 20 20 20 20 20 20  e this...       
aec0: 20 23 0d 0a 20 20 20 20 20 20 20 20 70 72 6f 63   #..        proc
aed0: 20 63 68 61 6e 67 65 4e 61 74 69 76 65 52 75 6e   changeNativeRun
aee0: 74 69 6d 65 4f 70 74 69 6f 6e 20 5c 0d 0a 20 20  timeOption \..  
aef0: 20 20 20 20 20 20 20 20 20 20 7b 5b 69 6e 66 6f            {[info
af00: 20 61 72 67 73 20 63 68 61 6e 67 65 4e 61 74 69   args changeNati
af10: 76 65 52 75 6e 74 69 6d 65 4f 70 74 69 6f 6e 5d  veRuntimeOption]
af20: 7d 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  } \..           
af30: 20 7b 5b 69 6e 66 6f 20 62 6f 64 79 20 63 68 61   {[info body cha
af40: 6e 67 65 4e 61 74 69 76 65 52 75 6e 74 69 6d 65  ngeNativeRuntime
af50: 4f 70 74 69 6f 6e 5d 7d 0d 0a 0d 0a 20 20 20 20  Option]}....    
af60: 20 20 20 20 63 61 74 63 68 20 7b 0d 0a 20 20 20      catch {..   
af70: 20 20 20 20 20 20 20 63 68 61 6e 67 65 4e 61 74         changeNat
af80: 69 76 65 52 75 6e 74 69 6d 65 4f 70 74 69 6f 6e  iveRuntimeOption
af90: 20 5b 68 61 73 52 75 6e 74 69 6d 65 4f 70 74 69   [hasRuntimeOpti
afa0: 6f 6e 20 6e 61 74 69 76 65 5d 0d 0a 20 20 20 20  on native]..    
afb0: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 20 5b      }..      } [
afc0: 67 65 74 54 65 73 74 4f 76 65 72 72 69 64 65 73  getTestOverrides
afd0: 50 72 65 61 6d 62 6c 65 20 5b 6c 69 73 74 20 70  Preamble [list p
afe0: 61 74 68 20 74 65 73 74 5f 63 68 61 6e 6e 65 6c  ath test_channel
aff0: 5d 5d 20 24 73 75 66 66 69 78 5d 5d 5d 0d 0a 20  ]] $suffix]]].. 
b000: 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
b010: 63 20 74 72 79 43 6f 70 79 45 78 74 65 72 6e 61  c tryCopyExterna
b020: 6c 46 69 6c 65 20 7b 0d 0a 20 20 20 20 20 20 20  lFile {..       
b030: 20 20 20 20 20 66 69 6c 65 4e 61 6d 65 20 7b 70       fileName {p
b040: 6c 61 74 66 6f 72 6d 20 22 22 7d 20 7b 6e 65 77  latform ""} {new
b050: 46 69 6c 65 4e 61 6d 65 20 22 22 7d 20 7b 76 65  FileName ""} {ve
b060: 72 62 6f 73 65 20 66 61 6c 73 65 7d 20 7d 20 7b  rbose false} } {
b070: 0d 0a 20 20 20 20 20 20 73 65 74 20 73 6f 75 72  ..      set sour
b080: 63 65 46 69 6c 65 4e 61 6d 65 20 5b 67 65 74 45  ceFileName [getE
b090: 78 74 65 72 6e 61 6c 46 69 6c 65 4e 61 6d 65 20  xternalFileName 
b0a0: 24 66 69 6c 65 4e 61 6d 65 5d 0d 0a 0d 0a 20 20  $fileName]....  
b0b0: 20 20 20 20 69 66 20 7b 21 5b 66 69 6c 65 20 65      if {![file e
b0c0: 78 69 73 74 73 20 24 73 6f 75 72 63 65 46 69 6c  xists $sourceFil
b0d0: 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a  eName]} then {..
b0e0: 20 20 20 20 20 20 20 20 69 66 20 7b 24 76 65 72          if {$ver
b0f0: 62 6f 73 65 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  bose} then {..  
b100: 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
b110: 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61  :test_channel [a
b120: 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
b130: 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
b140: 20 73 6b 69 70 70 65 64 20 63 6f 70 79 69 6e 67   skipped copying
b150: 20 65 78 74 65 72 6e 61 6c 20 66 69 6c 65 20 5c   external file \
b160: 22 22 20 24 73 6f 75 72 63 65 46 69 6c 65 4e 61  "" $sourceFileNa
b170: 6d 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  me \..          
b180: 20 20 20 20 22 5c 22 2c 20 69 74 20 64 6f 65 73      "\", it does
b190: 20 6e 6f 74 20 65 78 69 73 74 5c 6e 22 5d 0d 0a   not exist\n"]..
b1a0: 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
b1b0: 20 20 20 72 65 74 75 72 6e 0d 0a 20 20 20 20 20     return..     
b1c0: 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b   }....      if {
b1d0: 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
b1e0: 6e 65 77 46 69 6c 65 4e 61 6d 65 5d 20 3e 20 30  newFileName] > 0
b1f0: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
b200: 20 20 73 65 74 20 74 61 72 67 65 74 46 69 6c 65    set targetFile
b210: 4e 61 6d 65 20 5b 67 65 74 42 69 6e 61 72 79 46  Name [getBinaryF
b220: 69 6c 65 4e 61 6d 65 20 24 6e 65 77 46 69 6c 65  ileName $newFile
b230: 4e 61 6d 65 20 24 70 6c 61 74 66 6f 72 6d 5d 0d  Name $platform].
b240: 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d  .      } else {.
b250: 0a 20 20 20 20 20 20 20 20 73 65 74 20 74 61 72  .        set tar
b260: 67 65 74 46 69 6c 65 4e 61 6d 65 20 5b 67 65 74  getFileName [get
b270: 42 69 6e 61 72 79 46 69 6c 65 4e 61 6d 65 20 24  BinaryFileName $
b280: 66 69 6c 65 4e 61 6d 65 20 24 70 6c 61 74 66 6f  fileName $platfo
b290: 72 6d 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a  rm]..      }....
b2a0: 20 20 20 20 20 20 73 65 74 20 74 61 72 67 65 74        set target
b2b0: 44 69 72 65 63 74 6f 72 79 20 5b 66 69 6c 65 20  Directory [file 
b2c0: 64 69 72 6e 61 6d 65 20 24 74 61 72 67 65 74 46  dirname $targetF
b2d0: 69 6c 65 4e 61 6d 65 5d 0d 0a 0d 0a 20 20 20 20  ileName]....    
b2e0: 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a    if {[catch {..
b2f0: 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 66 69          if {![fi
b300: 6c 65 20 65 78 69 73 74 73 20 24 74 61 72 67 65  le exists $targe
b310: 74 44 69 72 65 63 74 6f 72 79 5d 7d 20 74 68 65  tDirectory]} the
b320: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 66  n {..          f
b330: 69 6c 65 20 6d 6b 64 69 72 20 24 74 61 72 67 65  ile mkdir $targe
b340: 74 44 69 72 65 63 74 6f 72 79 0d 0a 20 20 20 20  tDirectory..    
b350: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 66      }..        f
b360: 69 6c 65 20 63 6f 70 79 20 2d 66 6f 72 63 65 20  ile copy -force 
b370: 24 73 6f 75 72 63 65 46 69 6c 65 4e 61 6d 65 20  $sourceFileName 
b380: 24 74 61 72 67 65 74 46 69 6c 65 4e 61 6d 65 0d  $targetFileName.
b390: 0a 20 20 20 20 20 20 7d 5d 20 3d 3d 20 30 7d 20  .      }] == 0} 
b3a0: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
b3b0: 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
b3c0: 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
b3d0: 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
b3e0: 20 22 2d 2d 2d 2d 20 63 6f 70 69 65 64 20 65 78   "---- copied ex
b3f0: 74 65 72 6e 61 6c 20 66 69 6c 65 20 66 72 6f 6d  ternal file from
b400: 20 5c 22 22 20 24 73 6f 75 72 63 65 46 69 6c 65   \"" $sourceFile
b410: 4e 61 6d 65 20 22 5c 22 20 74 6f 20 5c 22 22 20  Name "\" to \"" 
b420: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 24  \..            $
b430: 74 61 72 67 65 74 46 69 6c 65 4e 61 6d 65 20 5c  targetFileName \
b440: 22 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c  "\n]..      } el
b450: 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70  se {..        tp
b460: 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  uts $::test_chan
b470: 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
b480: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22  \..            "
b490: 2d 2d 2d 2d 20 66 61 69 6c 65 64 20 74 6f 20 63  ---- failed to c
b4a0: 6f 70 79 20 65 78 74 65 72 6e 61 6c 20 66 69 6c  opy external fil
b4b0: 65 20 66 72 6f 6d 20 5c 22 22 20 24 73 6f 75 72  e from \"" $sour
b4c0: 63 65 46 69 6c 65 4e 61 6d 65 20 5c 0d 0a 20 20  ceFileName \..  
b4d0: 20 20 20 20 20 20 20 20 20 20 22 5c 22 20 74 6f            "\" to
b4e0: 20 5c 22 22 20 24 74 61 72 67 65 74 46 69 6c 65   \"" $targetFile
b4f0: 4e 61 6d 65 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20  Name \"\n]..    
b500: 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20    }..    }..... 
b510: 20 20 20 70 72 6f 63 20 74 72 79 43 6f 70 79 42     proc tryCopyB
b520: 69 6e 61 72 79 46 69 6c 65 20 7b 0d 0a 20 20 20  inaryFile {..   
b530: 20 20 20 20 20 20 20 20 20 66 69 6c 65 4e 61 6d           fileNam
b540: 65 20 7b 70 6c 61 74 66 6f 72 6d 20 22 22 7d 20  e {platform ""} 
b550: 7b 6e 65 77 46 69 6c 65 4e 61 6d 65 20 22 22 7d  {newFileName ""}
b560: 20 7b 76 65 72 62 6f 73 65 20 66 61 6c 73 65 7d   {verbose false}
b570: 20 7d 20 7b 0d 0a 20 20 20 20 20 20 73 65 74 20   } {..      set 
b580: 73 6f 75 72 63 65 46 69 6c 65 4e 61 6d 65 20 5b  sourceFileName [
b590: 67 65 74 42 69 6e 61 72 79 46 69 6c 65 4e 61 6d  getBinaryFileNam
b5a0: 65 20 24 66 69 6c 65 4e 61 6d 65 20 24 70 6c 61  e $fileName $pla
b5b0: 74 66 6f 72 6d 5d 0d 0a 0d 0a 20 20 20 20 20 20  tform]....      
b5c0: 69 66 20 7b 21 5b 66 69 6c 65 20 65 78 69 73 74  if {![file exist
b5d0: 73 20 24 73 6f 75 72 63 65 46 69 6c 65 4e 61 6d  s $sourceFileNam
b5e0: 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  e]} then {..    
b5f0: 20 20 20 20 69 66 20 7b 24 76 65 72 62 6f 73 65      if {$verbose
b600: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
b610: 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
b620: 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e  t_channel [appen
b630: 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
b640: 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 73 6b 69         "---- ski
b650: 70 70 65 64 20 63 6f 70 79 69 6e 67 20 62 69 6e  pped copying bin
b660: 61 72 79 20 66 69 6c 65 20 5c 22 22 20 24 73 6f  ary file \"" $so
b670: 75 72 63 65 46 69 6c 65 4e 61 6d 65 20 5c 0d 0a  urceFileName \..
b680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 5c                "\
b690: 22 2c 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 65  ", it does not e
b6a0: 78 69 73 74 5c 6e 22 5d 0d 0a 20 20 20 20 20 20  xist\n"]..      
b6b0: 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 72 65 74    }..        ret
b6c0: 75 72 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a  urn..      }....
b6d0: 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e        if {[strin
b6e0: 67 20 6c 65 6e 67 74 68 20 24 6e 65 77 46 69 6c  g length $newFil
b6f0: 65 4e 61 6d 65 5d 20 3e 20 30 7d 20 74 68 65 6e  eName] > 0} then
b700: 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20   {..        set 
b710: 74 61 72 67 65 74 46 69 6c 65 4e 61 6d 65 20 5b  targetFileName [
b720: 67 65 74 42 75 69 6c 64 46 69 6c 65 4e 61 6d 65  getBuildFileName
b730: 20 24 6e 65 77 46 69 6c 65 4e 61 6d 65 20 24 70   $newFileName $p
b740: 6c 61 74 66 6f 72 6d 5d 0d 0a 20 20 20 20 20 20  latform]..      
b750: 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
b760: 20 20 73 65 74 20 74 61 72 67 65 74 46 69 6c 65    set targetFile
b770: 4e 61 6d 65 20 5b 67 65 74 42 75 69 6c 64 46 69  Name [getBuildFi
b780: 6c 65 4e 61 6d 65 20 24 66 69 6c 65 4e 61 6d 65  leName $fileName
b790: 20 24 70 6c 61 74 66 6f 72 6d 5d 0d 0a 20 20 20   $platform]..   
b7a0: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 73 65     }....      se
b7b0: 74 20 74 61 72 67 65 74 44 69 72 65 63 74 6f 72  t targetDirector
b7c0: 79 20 5b 66 69 6c 65 20 64 69 72 6e 61 6d 65 20  y [file dirname 
b7d0: 24 74 61 72 67 65 74 46 69 6c 65 4e 61 6d 65 5d  $targetFileName]
b7e0: 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 63  ....      if {[c
b7f0: 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20  atch {..        
b800: 69 66 20 7b 21 5b 66 69 6c 65 20 65 78 69 73 74  if {![file exist
b810: 73 20 24 74 61 72 67 65 74 44 69 72 65 63 74 6f  s $targetDirecto
b820: 72 79 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  ry]} then {..   
b830: 20 20 20 20 20 20 20 66 69 6c 65 20 6d 6b 64 69         file mkdi
b840: 72 20 24 74 61 72 67 65 74 44 69 72 65 63 74 6f  r $targetDirecto
b850: 72 79 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20  ry..        }.. 
b860: 20 20 20 20 20 20 20 66 69 6c 65 20 63 6f 70 79         file copy
b870: 20 2d 66 6f 72 63 65 20 24 73 6f 75 72 63 65 46   -force $sourceF
b880: 69 6c 65 4e 61 6d 65 20 24 74 61 72 67 65 74 46  ileName $targetF
b890: 69 6c 65 4e 61 6d 65 0d 0a 20 20 20 20 20 20 7d  ileName..      }
b8a0: 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  ] == 0} then {..
b8b0: 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
b8c0: 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61  :test_channel [a
b8d0: 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
b8e0: 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63           "---- c
b8f0: 6f 70 69 65 64 20 62 69 6e 61 72 79 20 66 69 6c  opied binary fil
b900: 65 20 66 72 6f 6d 20 5c 22 22 20 24 73 6f 75 72  e from \"" $sour
b910: 63 65 46 69 6c 65 4e 61 6d 65 20 22 5c 22 20 74  ceFileName "\" t
b920: 6f 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20 20  o \"" \..       
b930: 20 20 20 20 20 24 74 61 72 67 65 74 46 69 6c 65       $targetFile
b940: 4e 61 6d 65 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20  Name \"\n]..    
b950: 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
b960: 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
b970: 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e  t_channel [appen
b980: 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
b990: 20 20 20 20 20 22 2d 2d 2d 2d 20 66 61 69 6c 65       "---- faile
b9a0: 64 20 74 6f 20 63 6f 70 79 20 62 69 6e 61 72 79  d to copy binary
b9b0: 20 66 69 6c 65 20 66 72 6f 6d 20 5c 22 22 20 24   file from \"" $
b9c0: 73 6f 75 72 63 65 46 69 6c 65 4e 61 6d 65 20 5c  sourceFileName \
b9d0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 5c  ..            "\
b9e0: 22 20 74 6f 20 5c 22 22 20 24 74 61 72 67 65 74  " to \"" $target
b9f0: 46 69 6c 65 4e 61 6d 65 20 5c 22 5c 6e 5d 0d 0a  FileName \"\n]..
ba00: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a        }..    }..
ba10: 0c 0d 0a 20 20 20 20 70 72 6f 63 20 74 72 79 43  ...    proc tryC
ba20: 6f 70 79 42 75 69 6c 64 46 69 6c 65 20 7b 0d 0a  opyBuildFile {..
ba30: 20 20 20 20 20 20 20 20 20 20 20 20 66 69 6c 65              file
ba40: 4e 61 6d 65 20 7b 70 6c 61 74 66 6f 72 6d 20 22  Name {platform "
ba50: 22 7d 20 7b 6e 65 77 46 69 6c 65 4e 61 6d 65 20  "} {newFileName 
ba60: 22 22 7d 20 7b 76 65 72 62 6f 73 65 20 66 61 6c  ""} {verbose fal
ba70: 73 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 73  se} } {..      s
ba80: 65 74 20 73 6f 75 72 63 65 46 69 6c 65 4e 61 6d  et sourceFileNam
ba90: 65 20 5b 67 65 74 42 75 69 6c 64 46 69 6c 65 4e  e [getBuildFileN
baa0: 61 6d 65 20 24 66 69 6c 65 4e 61 6d 65 20 24 70  ame $fileName $p
bab0: 6c 61 74 66 6f 72 6d 5d 0d 0a 0d 0a 20 20 20 20  latform]....    
bac0: 20 20 69 66 20 7b 21 5b 66 69 6c 65 20 65 78 69    if {![file exi
bad0: 73 74 73 20 24 73 6f 75 72 63 65 46 69 6c 65 4e  sts $sourceFileN
bae0: 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ame]} then {..  
baf0: 20 20 20 20 20 20 69 66 20 7b 24 76 65 72 62 6f        if {$verbo
bb00: 73 65 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  se} then {..    
bb10: 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
bb20: 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70  est_channel [app
bb30: 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
bb40: 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 73           "---- s
bb50: 6b 69 70 70 65 64 20 63 6f 70 79 69 6e 67 20 62  kipped copying b
bb60: 75 69 6c 64 20 66 69 6c 65 20 5c 22 22 20 24 73  uild file \"" $s
bb70: 6f 75 72 63 65 46 69 6c 65 4e 61 6d 65 20 5c 0d  ourceFileName \.
bb80: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22  .              "
bb90: 5c 22 2c 20 69 74 20 64 6f 65 73 20 6e 6f 74 20  \", it does not 
bba0: 65 78 69 73 74 5c 6e 22 5d 0d 0a 20 20 20 20 20  exist\n"]..     
bbb0: 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 72 65     }..        re
bbc0: 74 75 72 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d  turn..      }...
bbd0: 0a 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69  .      if {[stri
bbe0: 6e 67 20 6c 65 6e 67 74 68 20 24 6e 65 77 46 69  ng length $newFi
bbf0: 6c 65 4e 61 6d 65 5d 20 3e 20 30 7d 20 74 68 65  leName] > 0} the
bc00: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 65 74  n {..        set
bc10: 20 74 61 72 67 65 74 46 69 6c 65 4e 61 6d 65 20   targetFileName 
bc20: 5b 67 65 74 42 69 6e 61 72 79 46 69 6c 65 4e 61  [getBinaryFileNa
bc30: 6d 65 20 24 6e 65 77 46 69 6c 65 4e 61 6d 65 20  me $newFileName 
bc40: 24 70 6c 61 74 66 6f 72 6d 5d 0d 0a 20 20 20 20  $platform]..    
bc50: 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
bc60: 20 20 20 20 73 65 74 20 74 61 72 67 65 74 46 69      set targetFi
bc70: 6c 65 4e 61 6d 65 20 5b 67 65 74 42 69 6e 61 72  leName [getBinar
bc80: 79 46 69 6c 65 4e 61 6d 65 20 24 66 69 6c 65 4e  yFileName $fileN
bc90: 61 6d 65 20 24 70 6c 61 74 66 6f 72 6d 5d 0d 0a  ame $platform]..
bca0: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
bcb0: 20 73 65 74 20 74 61 72 67 65 74 44 69 72 65 63   set targetDirec
bcc0: 74 6f 72 79 20 5b 66 69 6c 65 20 64 69 72 6e 61  tory [file dirna
bcd0: 6d 65 20 24 74 61 72 67 65 74 46 69 6c 65 4e 61  me $targetFileNa
bce0: 6d 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20  me]....      if 
bcf0: 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20  {[catch {..     
bd00: 20 20 20 69 66 20 7b 21 5b 66 69 6c 65 20 65 78     if {![file ex
bd10: 69 73 74 73 20 24 74 61 72 67 65 74 44 69 72 65  ists $targetDire
bd20: 63 74 6f 72 79 5d 7d 20 74 68 65 6e 20 7b 0d 0a  ctory]} then {..
bd30: 20 20 20 20 20 20 20 20 20 20 66 69 6c 65 20 6d            file m
bd40: 6b 64 69 72 20 24 74 61 72 67 65 74 44 69 72 65  kdir $targetDire
bd50: 63 74 6f 72 79 0d 0a 20 20 20 20 20 20 20 20 7d  ctory..        }
bd60: 0d 0a 20 20 20 20 20 20 20 20 66 69 6c 65 20 63  ..        file c
bd70: 6f 70 79 20 2d 66 6f 72 63 65 20 24 73 6f 75 72  opy -force $sour
bd80: 63 65 46 69 6c 65 4e 61 6d 65 20 24 74 61 72 67  ceFileName $targ
bd90: 65 74 46 69 6c 65 4e 61 6d 65 0d 0a 20 20 20 20  etFileName..    
bda0: 20 20 7d 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20    }] == 0} then 
bdb0: 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73  {..        tputs
bdc0: 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
bdd0: 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
bde0: 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
bdf0: 2d 20 63 6f 70 69 65 64 20 62 75 69 6c 64 20 66  - copied build f
be00: 69 6c 65 20 66 72 6f 6d 20 5c 22 22 20 24 73 6f  ile from \"" $so
be10: 75 72 63 65 46 69 6c 65 4e 61 6d 65 20 22 5c 22  urceFileName "\"
be20: 20 74 6f 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20   to \"" \..     
be30: 20 20 20 20 20 20 20 24 74 61 72 67 65 74 46 69         $targetFi
be40: 6c 65 4e 61 6d 65 20 5c 22 5c 6e 5d 0d 0a 20 20  leName \"\n]..  
be50: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
be60: 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
be70: 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70  est_channel [app
be80: 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
be90: 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 66 61 69         "---- fai
bea0: 6c 65 64 20 74 6f 20 63 6f 70 79 20 62 75 69 6c  led to copy buil
beb0: 64 20 66 69 6c 65 20 66 72 6f 6d 20 5c 22 22 20  d file from \"" 
bec0: 24 73 6f 75 72 63 65 46 69 6c 65 4e 61 6d 65 20  $sourceFileName 
bed0: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22  \..            "
bee0: 5c 22 20 74 6f 20 5c 22 22 20 24 74 61 72 67 65  \" to \"" $targe
bef0: 74 46 69 6c 65 4e 61 6d 65 20 5c 22 5c 6e 5d 0d  tFileName \"\n].
bf00: 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d  .      }..    }.
bf10: 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 74 72 79  ....    proc try
bf20: 44 65 6c 65 74 65 42 69 6e 61 72 79 46 69 6c 65  DeleteBinaryFile
bf30: 20 7b 20 66 69 6c 65 4e 61 6d 65 20 7b 70 6c 61   { fileName {pla
bf40: 74 66 6f 72 6d 20 22 22 7d 20 7b 76 65 72 62 6f  tform ""} {verbo
bf50: 73 65 20 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a 20  se false} } {.. 
bf60: 20 20 20 20 20 73 65 74 20 66 69 6c 65 4e 61 6d       set fileNam
bf70: 65 20 5b 67 65 74 42 69 6e 61 72 79 46 69 6c 65  e [getBinaryFile
bf80: 4e 61 6d 65 20 24 66 69 6c 65 4e 61 6d 65 20 24  Name $fileName $
bf90: 70 6c 61 74 66 6f 72 6d 5d 0d 0a 0d 0a 20 20 20  platform]....   
bfa0: 20 20 20 69 66 20 7b 21 5b 66 69 6c 65 20 65 78     if {![file ex
bfb0: 69 73 74 73 20 24 66 69 6c 65 4e 61 6d 65 5d 7d  ists $fileName]}
bfc0: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
bfd0: 20 69 66 20 7b 24 76 65 72 62 6f 73 65 7d 20 74   if {$verbose} t
bfe0: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
bff0: 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
c000: 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
c010: 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
c020: 20 20 20 20 22 2d 2d 2d 2d 20 73 6b 69 70 70 65      "---- skippe
c030: 64 20 64 65 6c 65 74 69 6e 67 20 62 69 6e 61 72  d deleting binar
c040: 79 20 66 69 6c 65 20 5c 22 22 20 24 66 69 6c 65  y file \"" $file
c050: 4e 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20 20 20  Name \..        
c060: 20 20 20 20 20 20 22 5c 22 2c 20 69 74 20 64 6f        "\", it do
c070: 65 73 20 6e 6f 74 20 65 78 69 73 74 5c 6e 22 5d  es not exist\n"]
c080: 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20  ..        }..   
c090: 20 20 20 20 20 72 65 74 75 72 6e 0d 0a 20 20 20       return..   
c0a0: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 69 66     }....      if
c0b0: 20 7b 5b 63 61 74 63 68 20 7b 66 69 6c 65 20 64   {[catch {file d
c0c0: 65 6c 65 74 65 20 24 66 69 6c 65 4e 61 6d 65 7d  elete $fileName}
c0d0: 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  ] == 0} then {..
c0e0: 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
c0f0: 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61  :test_channel [a
c100: 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
c110: 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 64           "---- d
c120: 65 6c 65 74 65 64 20 62 69 6e 61 72 79 20 66 69  eleted binary fi
c130: 6c 65 20 5c 22 22 20 24 66 69 6c 65 4e 61 6d 65  le \"" $fileName
c140: 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d 20   \"\n]..      } 
c150: 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
c160: 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
c170: 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
c180: 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
c190: 20 22 2d 2d 2d 2d 20 66 61 69 6c 65 64 20 74 6f   "---- failed to
c1a0: 20 64 65 6c 65 74 65 20 62 69 6e 61 72 79 20 66   delete binary f
c1b0: 69 6c 65 20 5c 22 22 20 24 66 69 6c 65 4e 61 6d  ile \"" $fileNam
c1c0: 65 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d  e \"\n]..      }
c1d0: 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
c1e0: 70 72 6f 63 20 74 72 79 44 65 6c 65 74 65 42 75  proc tryDeleteBu
c1f0: 69 6c 64 46 69 6c 65 20 7b 20 66 69 6c 65 4e 61  ildFile { fileNa
c200: 6d 65 20 7b 70 6c 61 74 66 6f 72 6d 20 22 22 7d  me {platform ""}
c210: 20 7b 76 65 72 62 6f 73 65 20 66 61 6c 73 65 7d   {verbose false}
c220: 20 7d 20 7b 0d 0a 20 20 20 20 20 20 73 65 74 20   } {..      set 
c230: 66 69 6c 65 4e 61 6d 65 20 5b 67 65 74 42 75 69  fileName [getBui
c240: 6c 64 46 69 6c 65 4e 61 6d 65 20 24 66 69 6c 65  ldFileName $file
c250: 4e 61 6d 65 20 24 70 6c 61 74 66 6f 72 6d 5d 0d  Name $platform].
c260: 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 21 5b 66  ...      if {![f
c270: 69 6c 65 20 65 78 69 73 74 73 20 24 66 69 6c 65  ile exists $file
c280: 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  Name]} then {.. 
c290: 20 20 20 20 20 20 20 69 66 20 7b 24 76 65 72 62         if {$verb
c2a0: 6f 73 65 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  ose} then {..   
c2b0: 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
c2c0: 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70  test_channel [ap
c2d0: 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
c2e0: 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
c2f0: 73 6b 69 70 70 65 64 20 64 65 6c 65 74 69 6e 67  skipped deleting
c300: 20 62 75 69 6c 64 20 66 69 6c 65 20 5c 22 22 20   build file \"" 
c310: 24 66 69 6c 65 4e 61 6d 65 20 5c 0d 0a 20 20 20  $fileName \..   
c320: 20 20 20 20 20 20 20 20 20 20 20 22 5c 22 2c 20             "\", 
c330: 69 74 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73  it does not exis
c340: 74 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20 7d  t\n"]..        }
c350: 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ..        return
c360: 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
c370: 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 66     if {[catch {f
c380: 69 6c 65 20 64 65 6c 65 74 65 20 24 66 69 6c 65  ile delete $file
c390: 4e 61 6d 65 7d 5d 20 3d 3d 20 30 7d 20 74 68 65  Name}] == 0} the
c3a0: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75  n {..        tpu
c3b0: 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
c3c0: 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
c3d0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 2d  ..            "-
c3e0: 2d 2d 2d 20 64 65 6c 65 74 65 64 20 62 75 69 6c  --- deleted buil
c3f0: 64 20 66 69 6c 65 20 5c 22 22 20 24 66 69 6c 65  d file \"" $file
c400: 4e 61 6d 65 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20  Name \"\n]..    
c410: 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
c420: 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
c430: 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e  t_channel [appen
c440: 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
c450: 20 20 20 20 20 22 2d 2d 2d 2d 20 66 61 69 6c 65       "---- faile
c460: 64 20 74 6f 20 64 65 6c 65 74 65 20 62 75 69 6c  d to delete buil
c470: 64 20 66 69 6c 65 20 5c 22 22 20 24 66 69 6c 65  d file \"" $file
c480: 4e 61 6d 65 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20  Name \"\n]..    
c490: 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20    }..    }..... 
c4a0: 20 20 20 70 72 6f 63 20 74 72 79 43 6f 70 79 41     proc tryCopyA
c4b0: 73 73 65 6d 62 6c 79 20 7b 0d 0a 20 20 20 20 20  ssembly {..     
c4c0: 20 20 20 20 20 20 20 66 69 6c 65 4e 61 6d 65 20         fileName 
c4d0: 7b 70 6c 61 74 66 6f 72 6d 20 22 22 7d 20 7b 70  {platform ""} {p
c4e0: 64 62 20 74 72 75 65 7d 20 7b 76 65 72 62 6f 73  db true} {verbos
c4f0: 65 20 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a 20 20  e false} } {..  
c500: 20 20 20 20 74 72 79 43 6f 70 79 42 75 69 6c 64      tryCopyBuild
c510: 46 69 6c 65 20 24 66 69 6c 65 4e 61 6d 65 20 24  File $fileName $
c520: 70 6c 61 74 66 6f 72 6d 20 22 22 20 24 76 65 72  platform "" $ver
c530: 62 6f 73 65 0d 0a 0d 0a 20 20 20 20 20 20 69 66  bose....      if
c540: 20 7b 24 70 64 62 7d 20 74 68 65 6e 20 7b 0d 0a   {$pdb} then {..
c550: 20 20 20 20 20 20 20 20 74 72 79 43 6f 70 79 42          tryCopyB
c560: 75 69 6c 64 46 69 6c 65 20 5b 61 70 70 65 6e 64  uildFile [append
c570: 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
c580: 20 20 20 20 5b 66 69 6c 65 20 72 6f 6f 74 6e 61      [file rootna
c590: 6d 65 20 24 66 69 6c 65 4e 61 6d 65 5d 20 2e 70  me $fileName] .p
c5a0: 64 62 5d 20 24 70 6c 61 74 66 6f 72 6d 20 22 22  db] $platform ""
c5b0: 20 24 76 65 72 62 6f 73 65 0d 0a 20 20 20 20 20   $verbose..     
c5c0: 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20   }..    }.....  
c5d0: 20 20 70 72 6f 63 20 74 72 79 44 65 6c 65 74 65    proc tryDelete
c5e0: 41 73 73 65 6d 62 6c 79 20 7b 0d 0a 20 20 20 20  Assembly {..    
c5f0: 20 20 20 20 20 20 20 20 66 69 6c 65 4e 61 6d 65          fileName
c600: 20 7b 70 6c 61 74 66 6f 72 6d 20 22 22 7d 20 7b   {platform ""} {
c610: 70 64 62 20 74 72 75 65 7d 20 7b 76 65 72 62 6f  pdb true} {verbo
c620: 73 65 20 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a 20  se false} } {.. 
c630: 20 20 20 20 20 74 72 79 44 65 6c 65 74 65 42 69       tryDeleteBi
c640: 6e 61 72 79 46 69 6c 65 20 24 66 69 6c 65 4e 61  naryFile $fileNa
c650: 6d 65 20 24 70 6c 61 74 66 6f 72 6d 20 24 76 65  me $platform $ve
c660: 72 62 6f 73 65 0d 0a 0d 0a 20 20 20 20 20 20 69  rbose....      i
c670: 66 20 7b 24 70 64 62 7d 20 74 68 65 6e 20 7b 0d  f {$pdb} then {.
c680: 0a 20 20 20 20 20 20 20 20 74 72 79 44 65 6c 65  .        tryDele
c690: 74 65 42 69 6e 61 72 79 46 69 6c 65 20 5b 61 70  teBinaryFile [ap
c6a0: 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
c6b0: 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20 72 6f          [file ro
c6c0: 6f 74 6e 61 6d 65 20 24 66 69 6c 65 4e 61 6d 65  otname $fileName
c6d0: 5d 20 2e 70 64 62 5d 20 24 70 6c 61 74 66 6f 72  ] .pdb] $platfor
c6e0: 6d 20 24 76 65 72 62 6f 73 65 0d 0a 20 20 20 20  m $verbose..    
c6f0: 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20    }..    }..... 
c700: 20 20 20 70 72 6f 63 20 74 72 79 4c 6f 61 64 41     proc tryLoadA
c710: 73 73 65 6d 62 6c 79 20 7b 20 66 69 6c 65 4e 61  ssembly { fileNa
c720: 6d 65 20 7b 70 6c 61 74 66 6f 72 6d 20 22 22 7d  me {platform ""}
c730: 20 7d 20 7b 0d 0a 20 20 20 20 20 20 73 65 74 20   } {..      set 
c740: 66 69 6c 65 4e 61 6d 65 20 5b 67 65 74 42 69 6e  fileName [getBin
c750: 61 72 79 46 69 6c 65 4e 61 6d 65 20 24 66 69 6c  aryFileName $fil
c760: 65 4e 61 6d 65 20 24 70 6c 61 74 66 6f 72 6d 5d  eName $platform]
c770: 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 63  ....      if {[c
c780: 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20  atch {..        
c790: 73 65 74 20 61 73 73 65 6d 62 6c 79 20 5b 6f 62  set assembly [ob
c7a0: 6a 65 63 74 20 6c 6f 61 64 20 2d 6c 6f 61 64 74  ject load -loadt
c7b0: 79 70 65 20 46 69 6c 65 20 2d 61 6c 69 61 73 20  ype File -alias 
c7c0: 24 66 69 6c 65 4e 61 6d 65 5d 0d 0a 20 20 20 20  $fileName]..    
c7d0: 20 20 7d 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20    }] == 0} then 
c7e0: 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
c7f0: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4e 6f        # NOTE: No
c800: 77 2c 20 61 64 64 20 74 68 65 20 6e 65 63 65 73  w, add the neces
c810: 73 61 72 79 20 74 65 73 74 20 63 6f 6e 73 74 72  sary test constr
c820: 61 69 6e 74 2e 0d 0a 20 20 20 20 20 20 20 20 23  aint...        #
c830: 0d 0a 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e  ..        addCon
c840: 73 74 72 61 69 6e 74 20 5b 66 69 6c 65 20 72 6f  straint [file ro
c850: 6f 74 6e 61 6d 65 20 5b 66 69 6c 65 20 74 61 69  otname [file tai
c860: 6c 20 24 66 69 6c 65 4e 61 6d 65 5d 5d 0d 0a 0d  l $fileName]]...
c870: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
c880: 20 20 20 20 23 20 4e 4f 54 45 3a 20 47 72 61 62      # NOTE: Grab
c890: 20 74 68 65 20 69 6d 61 67 65 20 72 75 6e 74 69   the image runti
c8a0: 6d 65 20 76 65 72 73 69 6f 6e 20 66 72 6f 6d 20  me version from 
c8b0: 74 68 65 20 61 73 73 65 6d 62 6c 79 20 62 65 63  the assembly bec
c8c0: 61 75 73 65 0d 0a 20 20 20 20 20 20 20 20 23 20  ause..        # 
c8d0: 20 20 20 20 20 20 73 65 76 65 72 61 6c 20 74 65        several te
c8e0: 73 74 73 20 72 65 6c 79 20 6f 6e 20 69 74 20 68  sts rely on it h
c8f0: 61 76 69 6e 67 20 61 20 63 65 72 74 61 69 6e 20  aving a certain 
c900: 76 61 6c 75 65 2e 0d 0a 20 20 20 20 20 20 20 20  value...        
c910: 23 0d 0a 20 20 20 20 20 20 20 20 61 64 64 43 6f  #..        addCo
c920: 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64  nstraint [append
c930: 41 72 67 73 20 5b 66 69 6c 65 20 74 61 69 6c 20  Args [file tail 
c940: 24 66 69 6c 65 4e 61 6d 65 5d 20 5f 20 5c 0d 0a  $fileName] _ \..
c950: 20 20 20 20 20 20 20 20 20 20 20 20 5b 24 61 73              [$as
c960: 73 65 6d 62 6c 79 20 49 6d 61 67 65 52 75 6e 74  sembly ImageRunt
c970: 69 6d 65 56 65 72 73 69 6f 6e 5d 5d 0d 0a 0d 0a  imeVersion]]....
c980: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
c990: 20 20 20 23 20 4e 4f 54 45 3a 20 52 65 74 75 72     # NOTE: Retur
c9a0: 6e 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68 20  n the full path 
c9b0: 6f 66 20 74 68 65 20 6c 6f 61 64 65 64 20 66 69  of the loaded fi
c9c0: 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  le...        #..
c9d0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 24          return $
c9e0: 66 69 6c 65 4e 61 6d 65 0d 0a 20 20 20 20 20 20  fileName..      
c9f0: 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65 74 75 72  }....      retur
ca00: 6e 20 22 22 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a  n ""..    }.....
ca10: 20 20 20 20 70 72 6f 63 20 69 73 53 51 4c 69 74      proc isSQLit
ca20: 65 52 65 61 64 79 20 7b 7d 20 7b 0d 0a 20 20 20  eReady {} {..   
ca30: 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
ca40: 54 45 3a 20 54 68 69 73 20 70 72 6f 63 65 64 75  TE: This procedu
ca50: 72 65 20 6d 75 73 74 20 72 65 74 75 72 6e 20 6e  re must return n
ca60: 6f 6e 2d 7a 65 72 6f 20 6f 6e 6c 79 20 69 66 20  on-zero only if 
ca70: 74 68 65 20 53 51 4c 69 74 65 20 6e 61 74 69 76  the SQLite nativ
ca80: 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  e..      #      
ca90: 20 6c 69 62 72 61 72 79 20 61 6e 64 20 74 68 65   library and the
caa0: 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c   System.Data.SQL
cab0: 69 74 65 20 6d 61 6e 61 67 65 64 20 61 73 73 65  ite managed asse
cac0: 6d 62 6c 79 20 61 72 65 20 6c 6f 61 64 65 64 0d  mbly are loaded.
cad0: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 61  .      #       a
cae0: 6e 64 20 72 65 61 64 79 20 66 6f 72 20 75 73 65  nd ready for use
caf0: 20 62 79 20 74 68 65 20 74 65 73 74 20 73 75 69   by the test sui
cb00: 74 65 2e 20 20 43 75 72 72 65 6e 74 6c 79 2c 20  te.  Currently, 
cb10: 74 68 69 73 20 70 72 6f 63 65 64 75 72 65 0d 0a  this procedure..
cb20: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 73 68        #       sh
cb30: 6f 75 6c 64 20 62 65 20 63 61 6c 6c 65 64 20 6f  ould be called o
cb40: 6e 6c 79 20 61 66 74 65 72 20 74 68 65 20 5b 74  nly after the [t
cb50: 72 79 4c 6f 61 64 41 73 73 65 6d 62 6c 79 5d 20  ryLoadAssembly] 
cb60: 70 72 6f 63 65 64 75 72 65 20 68 61 73 0d 0a 20  procedure has.. 
cb70: 20 20 20 20 20 23 20 20 20 20 20 20 20 62 65 65       #       bee
cb80: 6e 20 63 61 6c 6c 65 64 20 74 6f 20 70 72 6f 62  n called to prob
cb90: 65 20 66 6f 72 20 74 68 65 20 53 79 73 74 65 6d  e for the System
cba0: 2e 44 61 74 61 2e 53 51 4c 69 74 65 20 6d 61 6e  .Data.SQLite man
cbb0: 61 67 65 64 20 61 73 73 65 6d 62 6c 79 0d 0a 20  aged assembly.. 
cbc0: 20 20 20 20 20 23 20 20 20 20 20 20 20 61 6e 64       #       and
cbd0: 20 74 68 65 20 5b 63 68 65 63 6b 46 6f 72 53 51   the [checkForSQ
cbe0: 4c 69 74 65 5d 20 70 72 6f 63 65 64 75 72 65 20  Lite] procedure 
cbf0: 68 61 73 20 62 65 65 6e 20 63 61 6c 6c 65 64 20  has been called 
cc00: 74 6f 20 70 72 6f 62 65 20 66 6f 72 0d 0a 20 20  to probe for..  
cc10: 20 20 20 20 23 20 20 20 20 20 20 20 74 68 65 20      #       the 
cc20: 53 51 4c 69 74 65 20 6e 61 74 69 76 65 20 6c 69  SQLite native li
cc30: 62 72 61 72 79 3b 20 6f 74 68 65 72 77 69 73 65  brary; otherwise
cc40: 2c 20 74 68 69 73 20 70 72 6f 63 65 64 75 72 65  , this procedure
cc50: 20 77 69 6c 6c 20 73 69 6d 70 6c 79 0d 0a 20 20   will simply..  
cc60: 20 20 20 20 23 20 20 20 20 20 20 20 61 6c 77 61      #       alwa
cc70: 79 73 20 72 65 74 75 72 6e 20 7a 65 72 6f 2e 0d  ys return zero..
cc80: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
cc90: 72 65 74 75 72 6e 20 5b 65 78 70 72 20 7b 0d 0a  return [expr {..
cca0: 20 20 20 20 20 20 20 20 5b 68 61 76 65 43 6f 6e          [haveCon
ccb0: 73 74 72 61 69 6e 74 20 53 79 73 74 65 6d 2e 44  straint System.D
ccc0: 61 74 61 2e 53 51 4c 69 74 65 5d 20 26 26 20 5b  ata.SQLite] && [
ccd0: 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 53  haveConstraint S
cce0: 51 4c 69 74 65 5d 0d 0a 20 20 20 20 20 20 7d 5d  QLite]..      }]
ccf0: 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
cd00: 70 72 6f 63 20 6d 61 74 63 68 50 6c 61 74 66 6f  proc matchPlatfo
cd10: 72 6d 20 7b 20 70 6c 61 74 66 6f 72 6d 20 7d 20  rm { platform } 
cd20: 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  {..      #..    
cd30: 20 20 23 20 4e 4f 54 45 3a 20 41 6e 20 65 6d 70    # NOTE: An emp
cd40: 74 79 20 73 74 72 69 6e 67 20 66 6f 72 20 74 68  ty string for th
cd50: 65 20 70 6c 61 74 66 6f 72 6d 20 6d 65 61 6e 73  e platform means
cd60: 20 74 68 61 74 20 74 68 65 20 62 75 69 6c 64 20   that the build 
cd70: 69 73 20 6e 6f 74 0d 0a 20 20 20 20 20 20 23 20  is not..      # 
cd80: 20 20 20 20 20 20 5b 70 72 69 6d 61 72 69 6c 79        [primarily
cd90: 5d 20 61 20 6e 61 74 69 76 65 20 62 75 69 6c 64  ] a native build
cda0: 3b 20 74 68 65 72 65 66 6f 72 65 2c 20 69 74 20  ; therefore, it 
cdb0: 61 6c 77 61 79 73 20 6d 61 74 63 68 65 73 2e 0d  always matches..
cdc0: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
cdd0: 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67  if {[string leng
cde0: 74 68 20 24 70 6c 61 74 66 6f 72 6d 5d 20 3d 3d  th $platform] ==
cdf0: 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
ce00: 20 20 20 20 72 65 74 75 72 6e 20 74 72 75 65 0d      return true.
ce10: 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
ce20: 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
ce30: 45 3a 20 44 6f 65 73 20 74 68 65 20 73 70 65 63  E: Does the spec
ce40: 69 66 69 65 64 20 70 6c 61 74 66 6f 72 6d 20 6d  ified platform m
ce50: 61 74 63 68 20 75 70 20 74 6f 20 74 68 65 20 63  atch up to the c
ce60: 75 72 72 65 6e 74 20 70 72 6f 63 65 73 73 3f 0d  urrent process?.
ce70: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
ce80: 69 66 20 7b 24 70 6c 61 74 66 6f 72 6d 20 65 71  if {$platform eq
ce90: 20 5b 6d 61 63 68 69 6e 65 54 6f 50 6c 61 74 66   [machineToPlatf
cea0: 6f 72 6d 20 24 3a 3a 74 63 6c 5f 70 6c 61 74 66  orm $::tcl_platf
ceb0: 6f 72 6d 28 6d 61 63 68 69 6e 65 29 5d 7d 20 74  orm(machine)]} t
cec0: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 72  hen {..        r
ced0: 65 74 75 72 6e 20 74 72 75 65 0d 0a 20 20 20 20  eturn true..    
cee0: 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a    }....      #..
cef0: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68        # NOTE: Th
cf00: 65 20 73 70 65 63 69 66 69 65 64 20 70 6c 61 74  e specified plat
cf10: 66 6f 72 6d 20 64 6f 65 73 20 6e 6f 74 20 6d 61  form does not ma
cf20: 74 63 68 20 75 70 20 77 69 74 68 20 74 68 65 20  tch up with the 
cf30: 70 6c 61 74 66 6f 72 6d 0d 0a 20 20 20 20 20 20  platform..      
cf40: 23 20 20 20 20 20 20 20 66 6f 72 20 74 68 65 20  #       for the 
cf50: 63 75 72 72 65 6e 74 20 70 72 6f 63 65 73 73 2e  current process.
cf60: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
cf70: 20 72 65 74 75 72 6e 20 66 61 6c 73 65 0d 0a 20   return false.. 
cf80: 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
cf90: 63 20 68 61 76 65 53 51 4c 69 74 65 4f 62 6a 65  c haveSQLiteObje
cfa0: 63 74 43 6f 6d 6d 61 6e 64 20 7b 7d 20 7b 0d 0a  ctCommand {} {..
cfb0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
cfc0: 20 4e 4f 54 45 3a 20 49 73 20 74 68 65 20 5b 6f   NOTE: Is the [o
cfd0: 62 6a 65 63 74 5d 20 63 6f 6d 6d 61 6e 64 20 63  bject] command c
cfe0: 75 72 72 65 6e 74 6c 79 20 61 76 61 69 6c 61 62  urrently availab
cff0: 6c 65 3f 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  le?..      #..  
d000: 20 20 20 20 72 65 74 75 72 6e 20 5b 65 78 70 72      return [expr
d010: 20 7b 5b 6c 6c 65 6e 67 74 68 20 5b 69 6e 66 6f   {[llength [info
d020: 20 63 6f 6d 6d 61 6e 64 73 20 6f 62 6a 65 63 74   commands object
d030: 5d 5d 20 3e 20 30 7d 5d 0d 0a 20 20 20 20 7d 0d  ]] > 0}]..    }.
d040: 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 63 68 65  ....    proc che
d050: 63 6b 46 6f 72 53 51 4c 69 74 65 4f 62 6a 65 63  ckForSQLiteObjec
d060: 74 43 6f 6d 6d 61 6e 64 20 7b 20 63 68 61 6e 6e  tCommand { chann
d070: 65 6c 20 7d 20 7b 0d 0a 20 20 20 20 20 20 74 70  el } {..      tp
d080: 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 22 2d 2d  uts $channel "--
d090: 2d 2d 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20  -- checking for 
d0a0: 5c 22 6f 62 6a 65 63 74 5c 22 20 63 6f 6d 6d 61  \"object\" comma
d0b0: 6e 64 20 75 73 61 67 65 2e 2e 2e 20 22 0d 0a 0d  nd usage... "...
d0c0: 0a 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66  .      if {![inf
d0d0: 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 73 71  o exists ::no(sq
d0e0: 6c 69 74 65 4f 62 6a 65 63 74 43 6f 6d 6d 61 6e  liteObjectComman
d0f0: 64 29 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20  d)] && \..      
d100: 20 20 20 20 5b 68 61 76 65 53 51 4c 69 74 65 4f      [haveSQLiteO
d110: 62 6a 65 63 74 43 6f 6d 6d 61 6e 64 5d 7d 20 74  bjectCommand]} t
d120: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 74  hen {..        t
d130: 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 79 65  puts $channel ye
d140: 73 5c 6e 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73  s\n..      } els
d150: 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  e {..        #..
d160: 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
d170: 55 6e 6c 65 73 73 20 77 65 20 61 72 65 20 66 6f  Unless we are fo
d180: 72 62 69 64 64 65 6e 20 66 72 6f 6d 20 64 6f 69  rbidden from doi
d190: 6e 67 20 73 6f 2c 20 61 64 64 20 73 6f 6d 65 20  ng so, add some 
d1a0: 63 6f 6e 73 74 72 61 69 6e 74 73 0d 0a 20 20 20  constraints..   
d1b0: 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68 61       #       tha
d1c0: 74 20 77 69 6c 6c 20 61 6c 6c 6f 77 20 6d 6f 73  t will allow mos
d1d0: 74 20 6f 66 20 74 68 65 20 74 65 73 74 20 73 75  t of the test su
d1e0: 69 74 65 20 74 6f 20 72 75 6e 20 28 69 2e 65 2e  ite to run (i.e.
d1f0: 20 74 68 6f 73 65 0d 0a 20 20 20 20 20 20 20 20   those..        
d200: 23 20 20 20 20 20 20 20 74 65 73 74 73 20 74 68  #       tests th
d210: 61 74 20 64 6f 20 6e 6f 74 20 64 69 72 65 63 74  at do not direct
d220: 6c 79 20 72 65 6c 79 20 75 70 6f 6e 20 74 68 65  ly rely upon the
d230: 20 5b 6f 62 6a 65 63 74 5d 20 63 6f 6d 6d 61 6e   [object] comman
d240: 64 29 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  d)...        #..
d250: 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e          if {![in
d260: 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 73  fo exists ::no(s
d270: 68 69 6d 53 51 4c 69 74 65 41 73 73 65 6d 62 6c  himSQLiteAssembl
d280: 79 43 6f 6e 73 74 72 61 69 6e 74 73 29 5d 7d 20  yConstraints)]} 
d290: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
d2a0: 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20    addConstraint 
d2b0: 53 51 4c 69 74 65 0d 0a 20 20 20 20 20 20 20 20  SQLite..        
d2c0: 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20    addConstraint 
d2d0: 53 51 4c 69 74 65 49 6e 74 65 72 6f 70 0d 0a 20  SQLiteInterop.. 
d2e0: 20 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73           addCons
d2f0: 74 72 61 69 6e 74 20 53 79 73 74 65 6d 2e 44 61  traint System.Da
d300: 74 61 2e 53 51 4c 69 74 65 0d 0a 20 20 20 20 20  ta.SQLite..     
d310: 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69       addConstrai
d320: 6e 74 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53  nt System.Data.S
d330: 51 4c 69 74 65 2e 45 6e 63 72 79 70 74 69 6f 6e  QLite.Encryption
d340: 0d 0a 20 20 20 20 20 20 20 20 20 20 61 64 64 43  ..          addC
d350: 6f 6e 73 74 72 61 69 6e 74 20 53 79 73 74 65 6d  onstraint System
d360: 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 4c 69 6e  .Data.SQLite.Lin
d370: 71 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 61  q....          a
d380: 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70  ddConstraint [ap
d390: 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
d3a0: 20 20 20 20 20 20 20 20 20 20 53 79 73 74 65 6d            System
d3b0: 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 64 6c 6c  .Data.SQLite.dll
d3c0: 5f 76 20 5b 67 65 74 42 75 69 6c 64 43 6c 72 56  _v [getBuildClrV
d3d0: 65 72 73 69 6f 6e 5d 5d 0d 0a 20 20 20 20 20 20  ersion]]..      
d3e0: 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69    }....        i
d3f0: 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73  f {![info exists
d400: 20 3a 3a 6e 6f 28 73 68 69 6d 53 51 4c 69 74 65   ::no(shimSQLite
d410: 44 65 66 69 6e 65 43 6f 6e 73 74 61 6e 74 43 6f  DefineConstantCo
d420: 6e 73 74 72 61 69 6e 74 73 29 5d 7d 20 74 68 65  nstraints)]} the
d430: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 66  n {..          f
d440: 6f 72 65 61 63 68 20 64 65 66 69 6e 65 43 6f 6e  oreach defineCon
d450: 73 74 61 6e 74 20 5b 6c 69 73 74 20 5c 0d 0a 20  stant [list \.. 
d460: 20 20 20 20 20 20 20 20 20 20 20 20 20 49 4e 54               INT
d470: 45 52 4f 50 5f 45 58 54 45 4e 53 49 4f 4e 5f 46  EROP_EXTENSION_F
d480: 55 4e 43 54 49 4f 4e 53 20 49 4e 54 45 52 4f 50  UNCTIONS INTEROP
d490: 5f 46 54 53 35 5f 45 58 54 45 4e 53 49 4f 4e 20  _FTS5_EXTENSION 
d4a0: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
d4b0: 20 49 4e 54 45 52 4f 50 5f 4a 53 4f 4e 31 5f 45   INTEROP_JSON1_E
d4c0: 58 54 45 4e 53 49 4f 4e 20 49 4e 54 45 52 4f 50  XTENSION INTEROP
d4d0: 5f 50 45 52 43 45 4e 54 49 4c 45 5f 45 58 54 45  _PERCENTILE_EXTE
d4e0: 4e 53 49 4f 4e 20 5c 0d 0a 20 20 20 20 20 20 20  NSION \..       
d4f0: 20 20 20 20 20 20 20 49 4e 54 45 52 4f 50 5f 52         INTEROP_R
d500: 45 47 45 58 50 5f 45 58 54 45 4e 53 49 4f 4e 20  EGEXP_EXTENSION 
d510: 49 4e 54 45 52 4f 50 5f 54 45 53 54 5f 45 58 54  INTEROP_TEST_EXT
d520: 45 4e 53 49 4f 4e 20 5c 0d 0a 20 20 20 20 20 20  ENSION \..      
d530: 20 20 20 20 20 20 20 20 49 4e 54 45 52 4f 50 5f          INTEROP_
d540: 54 4f 54 59 50 45 5f 45 58 54 45 4e 53 49 4f 4e  TOTYPE_EXTENSION
d550: 20 49 4e 54 45 52 4f 50 5f 56 49 52 54 55 41 4c   INTEROP_VIRTUAL
d560: 5f 54 41 42 4c 45 20 5c 0d 0a 20 20 20 20 20 20  _TABLE \..      
d570: 20 20 20 20 20 20 20 20 55 53 45 5f 49 4e 54 45          USE_INTE
d580: 52 4f 50 5f 44 4c 4c 5d 20 7b 0d 0a 20 20 20 20  ROP_DLL] {..    
d590: 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74          addConst
d5a0: 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67  raint [appendArg
d5b0: 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
d5c0: 20 20 20 20 20 5b 67 65 74 53 51 4c 69 74 65 44       [getSQLiteD
d5d0: 65 66 69 6e 65 43 6f 6e 73 74 61 6e 74 50 72 65  efineConstantPre
d5e0: 66 69 78 5d 20 24 64 65 66 69 6e 65 43 6f 6e 73  fix] $defineCons
d5f0: 74 61 6e 74 5d 0d 0a 20 20 20 20 20 20 20 20 20  tant]..         
d600: 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d   }..        }...
d610: 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69  .        if {![i
d620: 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28  nfo exists ::no(
d630: 73 68 69 6d 53 51 4c 69 74 65 56 69 73 75 61 6c  shimSQLiteVisual
d640: 53 74 75 64 69 6f 43 6f 6e 73 74 72 61 69 6e 74  StudioConstraint
d650: 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  s)]} then {..   
d660: 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72         addConstr
d670: 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73  aint [appendArgs
d680: 20 76 69 73 75 61 6c 53 74 75 64 69 6f 20 5b 67   visualStudio [g
d690: 65 74 42 75 69 6c 64 59 65 61 72 5d 5d 0d 0a 20  etBuildYear]].. 
d6a0: 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
d6b0: 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
d6c0: 65 6c 20 6e 6f 5c 6e 0d 0a 20 20 20 20 20 20 7d  el no\n..      }
d6d0: 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
d6e0: 70 72 6f 63 20 63 68 61 6e 67 65 4e 61 74 69 76  proc changeNativ
d6f0: 65 52 75 6e 74 69 6d 65 4f 70 74 69 6f 6e 20 7b  eRuntimeOption {
d700: 20 6e 61 74 69 76 65 20 7d 20 7b 0d 0a 20 20 20   native } {..   
d710: 20 20 20 69 66 20 7b 5b 6c 6c 65 6e 67 74 68 20     if {[llength 
d720: 5b 69 6e 66 6f 20 63 6f 6d 6d 61 6e 64 73 20 64  [info commands d
d730: 65 62 75 67 5d 5d 20 3e 20 30 20 26 26 20 5c 0d  ebug]] > 0 && \.
d740: 0a 20 20 20 20 20 20 20 20 20 20 5b 6c 6c 65 6e  .          [llen
d750: 67 74 68 20 5b 69 6e 66 6f 20 73 75 62 63 6f 6d  gth [info subcom
d760: 6d 61 6e 64 73 20 64 65 62 75 67 20 72 75 6e 74  mands debug runt
d770: 69 6d 65 6f 70 74 69 6f 6e 5d 5d 20 3e 20 30 20  imeoption]] > 0 
d780: 26 26 20 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20  && [catch {..   
d790: 20 20 20 20 20 64 65 62 75 67 20 72 75 6e 74 69       debug runti
d7a0: 6d 65 6f 70 74 69 6f 6e 20 5b 65 78 70 72 20 7b  meoption [expr {
d7b0: 24 6e 61 74 69 76 65 20 3f 20 22 61 64 64 22 20  $native ? "add" 
d7c0: 3a 20 22 72 65 6d 6f 76 65 22 7d 5d 20 6e 61 74  : "remove"}] nat
d7d0: 69 76 65 0d 0a 20 20 20 20 20 20 7d 5d 20 3d 3d  ive..      }] ==
d7e0: 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
d7f0: 20 20 20 20 72 65 74 75 72 6e 20 74 72 75 65 0d      return true.
d800: 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
d810: 20 20 69 66 20 7b 5b 68 61 76 65 53 51 4c 69 74    if {[haveSQLit
d820: 65 4f 62 6a 65 63 74 43 6f 6d 6d 61 6e 64 5d 20  eObjectCommand] 
d830: 26 26 20 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20  && [catch {..   
d840: 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f       object invo
d850: 6b 65 20 49 6e 74 65 72 70 72 65 74 65 72 2e 47  ke Interpreter.G
d860: 65 74 41 63 74 69 76 65 20 5b 65 78 70 72 20 7b  etActive [expr {
d870: 24 6e 61 74 69 76 65 20 3f 20 5c 0d 0a 20 20 20  $native ? \..   
d880: 20 20 20 20 20 20 20 20 20 22 41 64 64 52 75 6e           "AddRun
d890: 74 69 6d 65 4f 70 74 69 6f 6e 22 20 3a 20 22 52  timeOption" : "R
d8a0: 65 6d 6f 76 65 52 75 6e 74 69 6d 65 4f 70 74 69  emoveRuntimeOpti
d8b0: 6f 6e 22 7d 5d 20 6e 61 74 69 76 65 0d 0a 20 20  on"}] native..  
d8c0: 20 20 20 20 7d 5d 20 3d 3d 20 30 7d 20 74 68 65      }] == 0} the
d8d0: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 72 65 74  n {..        ret
d8e0: 75 72 6e 20 74 72 75 65 0d 0a 20 20 20 20 20 20  urn true..      
d8f0: 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65 74 75 72  }....      retur
d900: 6e 20 66 61 6c 73 65 0d 0a 20 20 20 20 7d 0d 0a  n false..    }..
d910: 0c 0d 0a 20 20 20 20 70 72 6f 63 20 63 68 65 63  ...    proc chec
d920: 6b 46 6f 72 53 51 4c 69 74 65 42 75 69 6c 64 73  kForSQLiteBuilds
d930: 20 7b 20 63 68 61 6e 6e 65 6c 20 7b 73 65 6c 65   { channel {sele
d940: 63 74 20 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a 20  ct false} } {.. 
d950: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
d960: 4e 4f 54 45 3a 20 43 68 65 63 6b 20 66 6f 72 20  NOTE: Check for 
d970: 65 76 65 72 79 20 70 6f 73 73 69 62 6c 65 20 76  every possible v
d980: 61 6c 69 64 20 63 6f 6d 62 69 6e 61 74 69 6f 6e  alid combination
d990: 20 6f 66 20 76 61 6c 75 65 73 20 75 73 65 64 20   of values used 
d9a0: 77 68 65 6e 0d 0a 20 20 20 20 20 20 23 20 20 20  when..      #   
d9b0: 20 20 20 20 6c 6f 63 61 74 69 6e 67 20 6f 75 74      locating out
d9c0: 20 74 68 65 20 62 75 69 6c 64 20 6f 75 74 70 75   the build outpu
d9d0: 74 20 64 69 72 65 63 74 6f 72 79 2c 20 73 68 6f  t directory, sho
d9e0: 77 69 6e 67 20 65 61 63 68 20 61 76 61 69 6c 61  wing each availa
d9f0: 62 6c 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ble..      #    
da00: 20 20 20 62 75 69 6c 64 20 76 61 72 69 61 74 69     build variati
da10: 6f 6e 20 61 6c 6f 6e 67 20 74 68 65 20 77 61 79  on along the way
da20: 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
da30: 20 20 66 6f 72 65 61 63 68 20 6e 61 74 69 76 65    foreach native
da40: 20 5b 6c 69 73 74 20 66 61 6c 73 65 20 74 72 75   [list false tru
da50: 65 5d 20 7b 0d 0a 20 20 20 20 20 20 20 20 66 6f  e] {..        fo
da60: 72 65 61 63 68 20 79 65 61 72 20 5b 67 65 74 42  reach year [getB
da70: 75 69 6c 64 59 65 61 72 73 5d 20 7b 0d 0a 20 20  uildYears] {..  
da80: 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20          foreach 
da90: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 5b 67  configuration [g
daa0: 65 74 42 75 69 6c 64 43 6f 6e 66 69 67 75 72 61  etBuildConfigura
dab0: 74 69 6f 6e 73 5d 20 7b 0d 0a 20 20 20 20 20 20  tions] {..      
dac0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
dad0: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 46 69 67       # NOTE: Fig
dae0: 75 72 65 20 6f 75 74 20 74 68 65 20 65 66 66 65  ure out the effe
daf0: 63 74 69 76 65 20 62 75 69 6c 64 20 70 6c 61 74  ctive build plat
db00: 66 6f 72 6d 2e 20 20 54 68 69 73 20 69 73 0d 0a  form.  This is..
db10: 20 20 20 20 20 20 20 20 20 20 20 20 23 20 20 20              #   
db20: 20 20 20 20 62 61 73 65 64 20 6f 6e 20 77 68 65      based on whe
db30: 74 68 65 72 20 6f 72 20 6e 6f 74 20 61 20 5b 70  ther or not a [p
db40: 72 69 6d 61 72 69 6c 79 5d 20 6e 61 74 69 76 65  rimarily] native
db50: 20 62 75 69 6c 64 0d 0a 20 20 20 20 20 20 20 20   build..        
db60: 20 20 20 20 23 20 20 20 20 20 20 20 69 73 20 62      #       is b
db70: 65 69 6e 67 20 75 73 65 64 2e 20 20 46 6f 72 20  eing used.  For 
db80: 5b 70 72 69 6d 61 72 69 6c 79 5d 20 6e 6f 6e 2d  [primarily] non-
db90: 6e 61 74 69 76 65 20 62 75 69 6c 64 73 2c 0d 0a  native builds,..
dba0: 20 20 20 20 20 20 20 20 20 20 20 20 23 20 20 20              #   
dbb0: 20 20 20 20 74 68 69 73 20 77 69 6c 6c 20 62 65      this will be
dbc0: 20 61 6e 20 65 6d 70 74 79 20 73 74 72 69 6e 67   an empty string
dbd0: 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23  ...            #
dbe0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 65  ..            se
dbf0: 74 20 70 6c 61 74 66 6f 72 6d 20 5b 67 65 74 42  t platform [getB
dc00: 75 69 6c 64 50 6c 61 74 66 6f 72 6d 20 24 6e 61  uildPlatform $na
dc10: 74 69 76 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  tive]....       
dc20: 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
dc30: 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
dc40: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
dc50: 20 20 20 22 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e     "---- checkin
dc60: 67 20 66 6f 72 20 53 79 73 74 65 6d 2e 44 61 74  g for System.Dat
dc70: 61 2e 53 51 4c 69 74 65 20 62 75 69 6c 64 20 5c  a.SQLite build \
dc80: 22 22 20 5b 65 78 70 72 20 5c 0d 0a 20 20 20 20  "" [expr \..    
dc90: 20 20 20 20 20 20 20 20 20 20 20 20 7b 24 6e 61              {$na
dca0: 74 69 76 65 20 3f 20 22 6e 61 74 69 76 65 2f 22  tive ? "native/"
dcb0: 20 3a 20 22 22 7d 5d 20 5b 65 78 70 72 20 7b 5b   : ""}] [expr {[
dcc0: 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 5c 0d  string length \.
dcd0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
dce0: 20 24 70 6c 61 74 66 6f 72 6d 5d 20 3e 20 30 20   $platform] > 0 
dcf0: 3f 20 5b 61 70 70 65 6e 64 41 72 67 73 20 24 70  ? [appendArgs $p
dd00: 6c 61 74 66 6f 72 6d 20 2f 5d 20 3a 20 22 22 7d  latform /] : ""}
dd10: 5d 20 24 79 65 61 72 20 5c 0d 0a 20 20 20 20 20  ] $year \..     
dd20: 20 20 20 20 20 20 20 20 20 20 20 2f 20 24 63 6f             / $co
dd30: 6e 66 69 67 75 72 61 74 69 6f 6e 20 22 5c 22 2e  nfiguration "\".
dd40: 2e 2e 20 22 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  .. "]....       
dd50: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
dd60: 20 20 20 20 23 20 4e 4f 54 45 3a 20 42 75 69 6c      # NOTE: Buil
dd70: 64 20 74 68 65 20 66 75 6c 6c 79 20 71 75 61 6c  d the fully qual
dd80: 69 66 69 65 64 20 64 69 72 65 63 74 6f 72 79 20  ified directory 
dd90: 77 68 65 72 65 20 74 68 65 20 6e 65 63 65 73 73  where the necess
dda0: 61 72 79 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ary..           
ddb0: 20 23 20 20 20 20 20 20 20 63 6f 6d 70 6f 6e 65   #       compone
ddc0: 6e 74 73 20 66 6f 72 20 53 79 73 74 65 6d 2e 44  nts for System.D
ddd0: 61 74 61 2e 53 51 4c 69 74 65 20 73 68 6f 75 6c  ata.SQLite shoul
dde0: 64 20 62 65 20 66 6f 75 6e 64 2e 0d 0a 20 20 20  d be found...   
ddf0: 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
de00: 20 20 20 20 20 20 20 20 73 65 74 20 64 69 72 65          set dire
de10: 63 74 6f 72 79 20 5b 6a 6f 69 6e 42 75 69 6c 64  ctory [joinBuild
de20: 44 69 72 65 63 74 6f 72 79 20 24 6e 61 74 69 76  Directory $nativ
de30: 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e \..           
de40: 20 20 20 20 20 5b 67 65 74 42 75 69 6c 64 42 61       [getBuildBa
de50: 73 65 44 69 72 65 63 74 6f 72 79 5d 20 24 79 65  seDirectory] $ye
de60: 61 72 20 24 70 6c 61 74 66 6f 72 6d 20 24 63 6f  ar $platform $co
de70: 6e 66 69 67 75 72 61 74 69 6f 6e 5d 0d 0a 0d 0a  nfiguration]....
de80: 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20              #.. 
de90: 20 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54             # NOT
dea0: 45 3a 20 44 6f 20 74 68 65 20 6e 65 63 65 73 73  E: Do the necess
deb0: 61 72 79 20 66 69 6c 65 73 20 65 78 69 73 74 3f  ary files exist?
dec0: 20 20 43 75 72 72 65 6e 74 6c 79 2c 20 6e 6f 20    Currently, no 
ded0: 6f 74 68 65 72 20 73 74 65 70 73 0d 0a 20 20 20  other steps..   
dee0: 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20           #      
def0: 20 61 72 65 20 74 61 6b 65 6e 20 74 6f 20 76 65   are taken to ve
df00: 72 69 66 79 20 74 68 69 73 20 62 75 69 6c 64 20  rify this build 
df10: 69 73 20 61 63 74 75 61 6c 6c 79 20 76 69 61 62  is actually viab
df20: 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20  le...           
df30: 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   #..            
df40: 69 66 20 7b 5b 69 73 42 75 69 6c 64 41 76 61 69  if {[isBuildAvai
df50: 6c 61 62 6c 65 20 24 6e 61 74 69 76 65 20 24 64  lable $native $d
df60: 69 72 65 63 74 6f 72 79 5d 7d 20 74 68 65 6e 20  irectory]} then 
df70: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
df80: 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   #..            
df90: 20 20 23 20 4e 4f 54 45 3a 20 57 68 65 6e 20 69    # NOTE: When i
dfa0: 6e 20 22 73 65 6c 65 63 74 22 20 6d 6f 64 65 2c  n "select" mode,
dfb0: 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 73   automatically s
dfc0: 65 6c 65 63 74 20 74 68 65 20 66 69 72 73 74 0d  elect the first.
dfd0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23  .              #
dfe0: 20 20 20 20 20 20 20 61 76 61 69 6c 61 62 6c 65         available
dff0: 20 62 75 69 6c 64 20 6f 66 20 53 79 73 74 65 6d   build of System
e000: 2e 44 61 74 61 2e 53 51 4c 69 74 65 20 61 6e 64  .Data.SQLite and
e010: 20 74 68 65 6e 20 72 65 74 75 72 6e 0d 0a 20 20   then return..  
e020: 20 20 20 20 20 20 20 20 20 20 20 20 23 20 20 20              #   
e030: 20 20 20 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e      immediately.
e040: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
e050: 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  #..             
e060: 20 69 66 20 7b 24 73 65 6c 65 63 74 20 26 26 20   if {$select && 
e070: 5b 6d 61 74 63 68 50 6c 61 74 66 6f 72 6d 20 24  [matchPlatform $
e080: 70 6c 61 74 66 6f 72 6d 5d 7d 20 74 68 65 6e 20  platform]} then 
e090: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
e0a0: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
e0b0: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4d 61        # NOTE: Ma
e0c0: 6e 75 61 6c 6c 79 20 6f 76 65 72 72 69 64 65 20  nually override 
e0d0: 61 6c 6c 20 74 68 65 20 62 75 69 6c 64 20 64 69  all the build di
e0e0: 72 65 63 74 6f 72 79 20 73 65 6c 65 63 74 69 6f  rectory selectio
e0f0: 6e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n..             
e100: 20 20 20 23 20 20 20 20 20 20 20 72 65 6c 61 74     #       relat
e110: 65 64 20 74 65 73 74 20 73 65 74 74 69 6e 67 73  ed test settings
e120: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 66 6f 72   in order to for
e130: 63 65 20 74 68 69 73 20 62 75 69 6c 64 0d 0a 20  ce this build.. 
e140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23                 #
e150: 20 20 20 20 20 20 20 6f 66 20 53 79 73 74 65 6d         of System
e160: 2e 44 61 74 61 2e 53 51 4c 69 74 65 20 74 6f 20  .Data.SQLite to 
e170: 62 65 20 75 73 65 64 2e 0d 0a 20 20 20 20 20 20  be used...      
e180: 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
e190: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20               if 
e1a0: 7b 21 5b 63 68 61 6e 67 65 4e 61 74 69 76 65 52  {![changeNativeR
e1b0: 75 6e 74 69 6d 65 4f 70 74 69 6f 6e 20 24 6e 61  untimeOption $na
e1c0: 74 69 76 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  tive]} then {.. 
e1d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e1e0: 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
e1f0: 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
e200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e210: 20 20 20 20 20 22 6e 6f 2c 20 66 61 69 6c 65 64       "no, failed
e220: 20 74 6f 20 22 20 5b 65 78 70 72 20 7b 24 6e 61   to " [expr {$na
e230: 74 69 76 65 20 3f 20 22 61 64 64 22 20 3a 20 22  tive ? "add" : "
e240: 72 65 6d 6f 76 65 22 7d 5d 20 5c 0d 0a 20 20 20  remove"}] \..   
e250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e260: 20 20 20 22 20 74 68 65 20 5c 22 6e 61 74 69 76     " the \"nativ
e270: 65 5c 22 20 72 75 6e 74 69 6d 65 20 6f 70 74 69  e\" runtime opti
e280: 6f 6e 5c 6e 22 5d 0d 0a 0d 0a 20 20 20 20 20 20  on\n"]....      
e290: 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
e2a0: 72 6e 20 66 61 6c 73 65 0d 0a 20 20 20 20 20 20  rn false..      
e2b0: 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20            }.... 
e2c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
e2d0: 65 74 20 3a 3a 74 65 73 74 5f 79 65 61 72 20 24  et ::test_year $
e2e0: 79 65 61 72 0d 0a 20 20 20 20 20 20 20 20 20 20  year..          
e2f0: 20 20 20 20 20 20 73 65 74 20 3a 3a 74 65 73 74        set ::test
e300: 5f 70 6c 61 74 66 6f 72 6d 20 24 70 6c 61 74 66  _platform $platf
e310: 6f 72 6d 0d 0a 20 20 20 20 20 20 20 20 20 20 20  orm..           
e320: 20 20 20 20 20 73 65 74 20 3a 3a 74 65 73 74 5f       set ::test_
e330: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 24 63  configuration $c
e340: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 0d 0a 0d 0a  onfiguration....
e350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e360: 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b  tputs $channel [
e370: 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
e380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e390: 20 20 22 79 65 73 2c 20 73 65 6c 65 63 74 65 64    "yes, selected
e3a0: 20 28 22 20 5b 65 78 70 72 20 7b 24 6e 61 74 69   (" [expr {$nati
e3b0: 76 65 20 3f 20 22 6e 61 74 69 76 65 2f 22 20 3a  ve ? "native/" :
e3c0: 20 22 22 7d 5d 20 5c 0d 0a 20 20 20 20 20 20 20   ""}] \..       
e3d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 65 78               [ex
e3e0: 70 72 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67  pr {[string leng
e3f0: 74 68 20 24 70 6c 61 74 66 6f 72 6d 5d 20 3e 20  th $platform] > 
e400: 30 20 3f 20 5b 61 70 70 65 6e 64 41 72 67 73 20  0 ? [appendArgs 
e410: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
e420: 20 20 20 20 20 20 20 24 70 6c 61 74 66 6f 72 6d         $platform
e430: 20 2f 5d 20 3a 20 22 22 7d 5d 20 24 79 65 61 72   /] : ""}] $year
e440: 20 2f 20 24 63 6f 6e 66 69 67 75 72 61 74 69 6f   / $configuratio
e450: 6e 20 22 29 5c 6e 22 5d 0d 0a 0d 0a 20 20 20 20  n ")\n"]....    
e460: 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
e470: 72 6e 20 74 72 75 65 0d 0a 20 20 20 20 20 20 20  rn true..       
e480: 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d         } else {.
e490: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
e4a0: 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
e4b0: 79 65 73 5c 6e 0d 0a 20 20 20 20 20 20 20 20 20  yes\n..         
e4c0: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
e4d0: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
e4e0: 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
e4f0: 73 20 24 63 68 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d  s $channel no\n.
e500: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  .            }..
e510: 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
e520: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d       }..      }.
e530: 0a 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ...      return 
e540: 66 61 6c 73 65 0d 0a 20 20 20 20 7d 0d 0a 0c 0d  false..    }....
e550: 0a 20 20 20 20 70 72 6f 63 20 63 68 65 63 6b 46  .    proc checkF
e560: 6f 72 53 51 4c 69 74 65 52 65 6c 65 61 73 65 73  orSQLiteReleases
e570: 20 7b 20 63 68 61 6e 6e 65 6c 20 7b 73 65 6c 65   { channel {sele
e580: 63 74 20 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a 20  ct false} } {.. 
e590: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
e5a0: 4e 4f 54 45 3a 20 43 68 65 63 6b 20 66 6f 72 20  NOTE: Check for 
e5b0: 70 61 73 74 20 72 65 6c 65 61 73 65 73 20 6f 66  past releases of
e5c0: 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c   System.Data.SQL
e5d0: 69 74 65 20 69 6e 20 74 68 65 20 64 69 72 65 63  ite in the direc
e5e0: 74 6f 72 79 0d 0a 20 20 20 20 20 20 23 20 20 20  tory..      #   
e5f0: 20 20 20 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e      contained in
e600: 20 74 68 65 20 22 53 79 73 74 65 6d 2e 44 61 74   the "System.Dat
e610: 61 2e 53 51 4c 69 74 65 22 20 65 6e 76 69 72 6f  a.SQLite" enviro
e620: 6e 6d 65 6e 74 20 76 61 72 69 61 62 6c 65 2c 20  nment variable, 
e630: 69 66 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  if..      #     
e640: 20 20 70 72 65 73 65 6e 74 2e 0d 0a 20 20 20 20    present...    
e650: 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b    #..      if {[
e660: 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 65 6e  info exists ::en
e670: 76 28 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51  v(System.Data.SQ
e680: 4c 69 74 65 29 5d 20 26 26 20 5c 0d 0a 20 20 20  Lite)] && \..   
e690: 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c         [string l
e6a0: 65 6e 67 74 68 20 24 3a 3a 65 6e 76 28 53 79 73  ength $::env(Sys
e6b0: 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 29  tem.Data.SQLite)
e6c0: 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20  ] > 0} then {.. 
e6d0: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
e6e0: 20 20 23 20 4e 4f 54 45 3a 20 42 75 69 6c 64 20    # NOTE: Build 
e6f0: 74 68 65 20 66 75 6c 6c 79 20 71 75 61 6c 69 66  the fully qualif
e700: 69 65 64 20 64 69 72 65 63 74 6f 72 79 20 77 68  ied directory wh
e710: 65 72 65 20 74 68 65 20 6e 65 63 65 73 73 61 72  ere the necessar
e720: 79 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  y..        #    
e730: 20 20 20 63 6f 6d 70 6f 6e 65 6e 74 73 20 66 6f     components fo
e740: 72 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51  r System.Data.SQ
e750: 4c 69 74 65 20 73 68 6f 75 6c 64 20 62 65 20 66  Lite should be f
e760: 6f 75 6e 64 2e 0d 0a 20 20 20 20 20 20 20 20 23  ound...        #
e770: 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 64 69  ..        set di
e780: 72 65 63 74 6f 72 79 20 5b 66 69 6c 65 20 6e 61  rectory [file na
e790: 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c 65 20 6a  tivename [file j
e7a0: 6f 69 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  oin \..         
e7b0: 20 20 20 24 3a 3a 65 6e 76 28 53 79 73 74 65 6d     $::env(System
e7c0: 2e 44 61 74 61 2e 53 51 4c 69 74 65 29 20 5b 67  .Data.SQLite) [g
e7d0: 65 74 52 65 6c 65 61 73 65 56 65 72 73 69 6f 6e  etReleaseVersion
e7e0: 5d 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 74  ]]]....        t
e7f0: 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61  puts $channel [a
e800: 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
e810: 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63           "---- c
e820: 68 65 63 6b 69 6e 67 20 66 6f 72 20 53 79 73 74  hecking for Syst
e830: 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 20 72  em.Data.SQLite r
e840: 65 6c 65 61 73 65 20 5c 22 22 20 5c 0d 0a 20 20  elease \"" \..  
e850: 20 20 20 20 20 20 20 20 20 20 24 64 69 72 65 63            $direc
e860: 74 6f 72 79 20 22 5c 22 2e 2e 2e 20 22 5d 0d 0a  tory "\"... "]..
e870: 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 69  ..        if {[i
e880: 73 52 65 6c 65 61 73 65 41 76 61 69 6c 61 62 6c  sReleaseAvailabl
e890: 65 20 24 64 69 72 65 63 74 6f 72 79 20 70 6c 61  e $directory pla
e8a0: 74 66 6f 72 6d 5d 7d 20 74 68 65 6e 20 7b 0d 0a  tform]} then {..
e8b0: 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73            if {[s
e8c0: 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 70 6c  tring length $pl
e8d0: 61 74 66 6f 72 6d 5d 20 3d 3d 20 30 7d 20 74 68  atform] == 0} th
e8e0: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
e8f0: 20 20 73 65 74 20 70 6c 61 74 66 6f 72 6d 20 75    set platform u
e900: 6e 6b 6e 6f 77 6e 0d 0a 20 20 20 20 20 20 20 20  nknown..        
e910: 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20    }....         
e920: 20 69 66 20 7b 24 73 65 6c 65 63 74 20 26 26 20   if {$select && 
e930: 5b 6d 61 74 63 68 50 6c 61 74 66 6f 72 6d 20 24  [matchPlatform $
e940: 70 6c 61 74 66 6f 72 6d 5d 7d 20 74 68 65 6e 20  platform]} then 
e950: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  {..            s
e960: 65 74 20 3a 3a 62 75 69 6c 64 5f 64 69 72 65 63  et ::build_direc
e970: 74 6f 72 79 20 24 64 69 72 65 63 74 6f 72 79 0d  tory $directory.
e980: 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  ...            t
e990: 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61  puts $channel [a
e9a0: 70 70 65 6e 64 41 72 67 73 20 22 79 65 73 2c 20  ppendArgs "yes, 
e9b0: 73 65 6c 65 63 74 65 64 20 28 22 20 24 70 6c 61  selected (" $pla
e9c0: 74 66 6f 72 6d 20 22 29 5c 6e 22 5d 0d 0a 0d 0a  tform ")\n"]....
e9d0: 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
e9e0: 72 6e 20 74 72 75 65 0d 0a 20 20 20 20 20 20 20  rn true..       
e9f0: 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
ea00: 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
ea10: 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
ea20: 72 67 73 20 22 79 65 73 20 28 22 20 24 70 6c 61  rgs "yes (" $pla
ea30: 74 66 6f 72 6d 20 22 29 5c 6e 22 5d 0d 0a 20 20  tform ")\n"]..  
ea40: 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
ea50: 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
ea60: 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
ea70: 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d 0a 0d 0a 20 20  annel no\n....  
ea80: 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20          foreach 
ea90: 70 61 74 68 20 5b 6c 73 6f 72 74 20 2d 64 65 63  path [lsort -dec
eaa0: 72 65 61 73 69 6e 67 20 5b 66 69 6c 65 20 6c 69  reasing [file li
eab0: 73 74 20 24 64 69 72 65 63 74 6f 72 79 20 2a 5d  st $directory *]
eac0: 5d 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ] {..           
ead0: 20 69 66 20 7b 5b 66 69 6c 65 20 65 78 69 73 74   if {[file exist
eae0: 73 20 24 70 61 74 68 5d 20 26 26 20 5b 66 69 6c  s $path] && [fil
eaf0: 65 20 69 73 64 69 72 65 63 74 6f 72 79 20 24 70  e isdirectory $p
eb00: 61 74 68 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ath]} then {..  
eb10: 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
eb20: 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  s $channel [appe
eb30: 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
eb40: 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
eb50: 2d 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 53  - checking for S
eb60: 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
eb70: 65 20 72 65 6c 65 61 73 65 20 5c 22 22 20 5c 0d  e release \"" \.
eb80: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
eb90: 20 20 20 24 70 61 74 68 20 22 5c 22 2e 2e 2e 20     $path "\"... 
eba0: 22 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  "]....          
ebb0: 20 20 20 20 69 66 20 7b 5b 69 73 52 65 6c 65 61      if {[isRelea
ebc0: 73 65 41 76 61 69 6c 61 62 6c 65 20 24 70 61 74  seAvailable $pat
ebd0: 68 20 70 6c 61 74 66 6f 72 6d 5d 7d 20 74 68 65  h platform]} the
ebe0: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
ebf0: 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67       if {[string
ec00: 20 6c 65 6e 67 74 68 20 24 70 6c 61 74 66 6f 72   length $platfor
ec10: 6d 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d  m] == 0} then {.
ec20: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
ec30: 20 20 20 73 65 74 20 70 6c 61 74 66 6f 72 6d 20     set platform 
ec40: 75 6e 6b 6e 6f 77 6e 0d 0a 20 20 20 20 20 20 20  unknown..       
ec50: 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20           }....  
ec60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
ec70: 20 7b 24 73 65 6c 65 63 74 20 26 26 20 5b 6d 61   {$select && [ma
ec80: 74 63 68 50 6c 61 74 66 6f 72 6d 20 24 70 6c 61  tchPlatform $pla
ec90: 74 66 6f 72 6d 5d 7d 20 74 68 65 6e 20 7b 0d 0a  tform]} then {..
eca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ecb0: 20 20 73 65 74 20 3a 3a 62 75 69 6c 64 5f 64 69    set ::build_di
ecc0: 72 65 63 74 6f 72 79 20 24 70 61 74 68 0d 0a 0d  rectory $path...
ecd0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
ece0: 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
ecf0: 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 22 79  l [appendArgs "y
ed00: 65 73 2c 20 73 65 6c 65 63 74 65 64 20 28 22 20  es, selected (" 
ed10: 24 70 6c 61 74 66 6f 72 6d 20 22 29 5c 6e 22 5d  $platform ")\n"]
ed20: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
ed30: 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 72 75        return tru
ed40: 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e..             
ed50: 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
ed60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
ed70: 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61  puts $channel [a
ed80: 70 70 65 6e 64 41 72 67 73 20 22 79 65 73 20 28  ppendArgs "yes (
ed90: 22 20 24 70 6c 61 74 66 6f 72 6d 20 22 29 5c 6e  " $platform ")\n
eda0: 22 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  "]..            
edb0: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
edc0: 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
edd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
ede0: 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 6e 6f  puts $channel no
edf0: 5c 6e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  \n..            
ee00: 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20    }..           
ee10: 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d   }..          }.
ee20: 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  .        }..    
ee30: 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
ee40: 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
ee50: 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
ee60: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 2d  ..            "-
ee70: 2d 2d 2d 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 20  --- environment 
ee80: 76 61 72 69 61 62 6c 65 20 5c 22 53 79 73 74 65  variable \"Syste
ee90: 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 5c 22 20  m.Data.SQLite\" 
eea0: 69 73 20 6e 6f 74 20 22 20 5c 0d 0a 20 20 20 20  is not " \..    
eeb0: 20 20 20 20 20 20 20 20 22 73 65 74 2c 20 73 6b          "set, sk
eec0: 69 70 70 69 6e 67 20 63 68 65 63 6b 20 66 6f 72  ipping check for
eed0: 20 72 65 6c 65 61 73 65 73 2e 2e 2e 5c 6e 22 5d   releases...\n"]
eee0: 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
eef0: 20 20 20 72 65 74 75 72 6e 20 66 61 6c 73 65 0d     return false.
ef00: 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70  .    }.....    p
ef10: 72 6f 63 20 63 68 65 63 6b 46 6f 72 53 51 4c 69  roc checkForSQLi
ef20: 74 65 4c 69 62 72 61 72 79 20 7b 20 63 68 61 6e  teLibrary { chan
ef30: 6e 65 6c 20 7d 20 7b 0d 0a 20 20 20 20 20 20 74  nel } {..      t
ef40: 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 22 2d  puts $channel "-
ef50: 2d 2d 2d 20 63 68 65 63 6b 69 6e 67 20 66 6f 72  --- checking for
ef60: 20 53 51 4c 69 74 65 20 63 6f 72 65 20 6c 69 62   SQLite core lib
ef70: 72 61 72 79 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20  rary... "....   
ef80: 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d     if {[catch {.
ef90: 0a 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20  .        object 
efa0: 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e  invoke -flags +N
efb0: 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20  onPublic \..    
efc0: 20 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44          System.D
efd0: 61 74 61 2e 53 51 4c 69 74 65 2e 53 51 4c 69 74  ata.SQLite.SQLit
efe0: 65 33 20 53 51 4c 69 74 65 56 65 72 73 69 6f 6e  e3 SQLiteVersion
eff0: 0d 0a 20 20 20 20 20 20 7d 20 76 65 72 73 69 6f  ..      } versio
f000: 6e 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d  n] == 0} then {.
f010: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
f020: 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68 65 63      # NOTE: Chec
f030: 6b 20 69 66 20 74 68 65 20 72 65 74 75 72 6e 65  k if the returne
f040: 64 20 76 65 72 73 69 6f 6e 20 77 61 73 20 6e 75  d version was nu
f050: 6c 6c 2e 20 20 49 66 20 73 6f 2c 20 6d 61 6b 65  ll.  If so, make
f060: 20 69 74 20 65 61 73 79 0d 0a 20 20 20 20 20 20   it easy..      
f070: 20 20 23 20 20 20 20 20 20 20 74 6f 20 73 70 6f    #       to spo
f080: 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  t...        #.. 
f090: 20 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69         if {[stri
f0a0: 6e 67 20 6c 65 6e 67 74 68 20 24 76 65 72 73 69  ng length $versi
f0b0: 6f 6e 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b  on] == 0} then {
f0c0: 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20  ..          set 
f0d0: 76 65 72 73 69 6f 6e 20 6e 75 6c 6c 0d 0a 20 20  version null..  
f0e0: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
f0f0: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
f100: 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74 20 74 6f  NOTE: Attempt to
f110: 20 71 75 65 72 79 20 74 68 65 20 46 6f 73 73 69   query the Fossi
f120: 6c 20 73 6f 75 72 63 65 20 69 64 65 6e 74 69 66  l source identif
f130: 69 65 72 20 66 6f 72 20 74 68 65 20 53 51 4c 69  ier for the SQLi
f140: 74 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  te..        #   
f150: 20 20 20 20 63 6f 72 65 20 6c 69 62 72 61 72 79      core library
f160: 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
f170: 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68        if {[catch
f180: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 6f 62   {..          ob
f190: 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61  ject invoke -fla
f1a0: 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d  gs +NonPublic \.
f1b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53  .              S
f1c0: 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
f1d0: 65 2e 53 51 4c 69 74 65 33 20 53 51 4c 69 74 65  e.SQLite3 SQLite
f1e0: 53 6f 75 72 63 65 49 64 0d 0a 20 20 20 20 20 20  SourceId..      
f1f0: 20 20 7d 20 73 6f 75 72 63 65 49 64 5d 7d 20 74    } sourceId]} t
f200: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
f210: 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20   #..          # 
f220: 4e 4f 54 45 3a 20 57 65 20 66 61 69 6c 65 64 20  NOTE: We failed 
f230: 74 6f 20 71 75 65 72 79 20 74 68 65 20 46 6f 73  to query the Fos
f240: 73 69 6c 20 73 6f 75 72 63 65 20 69 64 65 6e 74  sil source ident
f250: 69 66 69 65 72 2e 0d 0a 20 20 20 20 20 20 20 20  ifier...        
f260: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 73    #..          s
f270: 65 74 20 73 6f 75 72 63 65 49 64 20 75 6e 6b 6e  et sourceId unkn
f280: 6f 77 6e 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  own..        }..
f290: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
f2a0: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68 65       # NOTE: Che
f2b0: 63 6b 20 69 66 20 74 68 65 20 72 65 74 75 72 6e  ck if the return
f2c0: 65 64 20 46 6f 73 73 69 6c 20 73 6f 75 72 63 65  ed Fossil source
f2d0: 20 69 64 65 6e 74 69 66 69 65 72 20 77 61 73 20   identifier was 
f2e0: 6e 75 6c 6c 2e 20 20 49 66 0d 0a 20 20 20 20 20  null.  If..     
f2f0: 20 20 20 23 20 20 20 20 20 20 20 73 6f 2c 20 6d     #       so, m
f300: 61 6b 65 20 69 74 20 65 61 73 79 20 74 6f 20 73  ake it easy to s
f310: 70 6f 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  pot...        #.
f320: 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73 74  .        if {[st
f330: 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 73 6f 75  ring length $sou
f340: 72 63 65 49 64 5d 20 3d 3d 20 30 7d 20 74 68 65  rceId] == 0} the
f350: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73  n {..          s
f360: 65 74 20 73 6f 75 72 63 65 49 64 20 6e 75 6c 6c  et sourceId null
f370: 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  ..        }.... 
f380: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
f390: 20 20 23 20 4e 4f 54 45 3a 20 59 65 73 2c 20 74    # NOTE: Yes, t
f3a0: 68 65 20 53 51 4c 69 74 65 20 63 6f 72 65 20 6c  he SQLite core l
f3b0: 69 62 72 61 72 79 20 61 70 70 65 61 72 73 20 74  ibrary appears t
f3c0: 6f 20 62 65 20 61 76 61 69 6c 61 62 6c 65 2e 0d  o be available..
f3d0: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
f3e0: 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e      addConstrain
f3f0: 74 20 53 51 4c 69 74 65 0d 0a 0d 0a 20 20 20 20  t SQLite....    
f400: 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
f410: 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 22  el [appendArgs "
f420: 79 65 73 20 28 22 20 24 76 65 72 73 69 6f 6e 20  yes (" $version 
f430: 22 20 22 20 24 73 6f 75 72 63 65 49 64 20 22 29  " " $sourceId ")
f440: 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c  \n"]..      } el
f450: 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70  se {..        tp
f460: 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 6e 6f 5c  uts $channel no\
f470: 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  n..      }..    
f480: 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 63  }.....    proc c
f490: 68 65 63 6b 46 6f 72 53 51 4c 69 74 65 49 6e 74  heckForSQLiteInt
f4a0: 65 72 6f 70 20 7b 20 63 68 61 6e 6e 65 6c 20 7d  erop { channel }
f4b0: 20 7b 0d 0a 20 20 20 20 20 20 74 70 75 74 73 20   {..      tputs 
f4c0: 24 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 63  $channel "---- c
f4d0: 68 65 63 6b 69 6e 67 20 66 6f 72 20 53 51 4c 69  hecking for SQLi
f4e0: 74 65 20 69 6e 74 65 72 6f 70 20 61 73 73 65 6d  te interop assem
f4f0: 62 6c 79 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20  bly... "....    
f500: 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a    if {[catch {..
f510: 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69          object i
f520: 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f  nvoke -flags +No
f530: 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20  nPublic \..     
f540: 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61         System.Da
f550: 74 61 2e 53 51 4c 69 74 65 2e 53 51 4c 69 74 65  ta.SQLite.SQLite
f560: 33 20 49 6e 74 65 72 6f 70 56 65 72 73 69 6f 6e  3 InteropVersion
f570: 0d 0a 20 20 20 20 20 20 7d 20 76 65 72 73 69 6f  ..      } versio
f580: 6e 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d  n] == 0} then {.
f590: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
f5a0: 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68 65 63      # NOTE: Chec
f5b0: 6b 20 69 66 20 74 68 65 20 72 65 74 75 72 6e 65  k if the returne
f5c0: 64 20 76 65 72 73 69 6f 6e 20 77 61 73 20 6e 75  d version was nu
f5d0: 6c 6c 2e 20 20 49 66 20 73 6f 2c 20 6d 61 6b 65  ll.  If so, make
f5e0: 20 69 74 20 65 61 73 79 0d 0a 20 20 20 20 20 20   it easy..      
f5f0: 20 20 23 20 20 20 20 20 20 20 74 6f 20 73 70 6f    #       to spo
f600: 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  t...        #.. 
f610: 20 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69         if {[stri
f620: 6e 67 20 6c 65 6e 67 74 68 20 24 76 65 72 73 69  ng length $versi
f630: 6f 6e 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b  on] == 0} then {
f640: 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20  ..          set 
f650: 76 65 72 73 69 6f 6e 20 6e 75 6c 6c 0d 0a 20 20  version null..  
f660: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
f670: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
f680: 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74 20 74 6f  NOTE: Attempt to
f690: 20 71 75 65 72 79 20 74 68 65 20 46 6f 73 73 69   query the Fossi
f6a0: 6c 20 73 6f 75 72 63 65 20 69 64 65 6e 74 69 66  l source identif
f6b0: 69 65 72 20 66 6f 72 20 74 68 65 20 53 51 4c 69  ier for the SQLi
f6c0: 74 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  te..        #   
f6d0: 20 20 20 20 63 6f 72 65 20 6c 69 62 72 61 72 79      core library
f6e0: 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
f6f0: 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68        if {[catch
f700: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 6f 62   {..          ob
f710: 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61  ject invoke -fla
f720: 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d  gs +NonPublic \.
f730: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53  .              S
f740: 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
f750: 65 2e 53 51 4c 69 74 65 33 20 49 6e 74 65 72 6f  e.SQLite3 Intero
f760: 70 53 6f 75 72 63 65 49 64 0d 0a 20 20 20 20 20  pSourceId..     
f770: 20 20 20 7d 20 73 6f 75 72 63 65 49 64 5d 7d 20     } sourceId]} 
f780: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
f790: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23    #..          #
f7a0: 20 4e 4f 54 45 3a 20 57 65 20 66 61 69 6c 65 64   NOTE: We failed
f7b0: 20 74 6f 20 71 75 65 72 79 20 74 68 65 20 46 6f   to query the Fo
f7c0: 73 73 69 6c 20 73 6f 75 72 63 65 20 69 64 65 6e  ssil source iden
f7d0: 74 69 66 69 65 72 2e 0d 0a 20 20 20 20 20 20 20  tifier...       
f7e0: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
f7f0: 73 65 74 20 73 6f 75 72 63 65 49 64 20 75 6e 6b  set sourceId unk
f800: 6e 6f 77 6e 0d 0a 20 20 20 20 20 20 20 20 7d 0d  nown..        }.
f810: 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
f820: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68        # NOTE: Ch
f830: 65 63 6b 20 69 66 20 74 68 65 20 72 65 74 75 72  eck if the retur
f840: 6e 65 64 20 46 6f 73 73 69 6c 20 73 6f 75 72 63  ned Fossil sourc
f850: 65 20 69 64 65 6e 74 69 66 69 65 72 20 77 61 73  e identifier was
f860: 20 6e 75 6c 6c 2e 20 20 49 66 0d 0a 20 20 20 20   null.  If..    
f870: 20 20 20 20 23 20 20 20 20 20 20 20 73 6f 2c 20      #       so, 
f880: 6d 61 6b 65 20 69 74 20 65 61 73 79 20 74 6f 20  make it easy to 
f890: 73 70 6f 74 2e 0d 0a 20 20 20 20 20 20 20 20 23  spot...        #
f8a0: 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73  ..        if {[s
f8b0: 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 73 6f  tring length $so
f8c0: 75 72 63 65 49 64 5d 20 3d 3d 20 30 7d 20 74 68  urceId] == 0} th
f8d0: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
f8e0: 73 65 74 20 73 6f 75 72 63 65 49 64 20 6e 75 6c  set sourceId nul
f8f0: 6c 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  l..        }....
f900: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
f910: 20 20 20 23 20 4e 4f 54 45 3a 20 42 65 66 6f 72     # NOTE: Befor
f920: 65 20 61 63 74 75 61 6c 6c 79 20 61 64 64 69 6e  e actually addin
f930: 67 20 74 68 65 20 74 65 73 74 20 63 6f 6e 73 74  g the test const
f940: 72 61 69 6e 74 2c 20 6d 61 6b 65 20 73 75 72 65  raint, make sure
f950: 20 74 68 65 0d 0a 20 20 20 20 20 20 20 20 23 20   the..        # 
f960: 20 20 20 20 20 20 76 65 72 73 69 6f 6e 20 69 73        version is
f970: 20 76 61 6c 69 64 20 28 69 2e 65 2e 20 6e 6f 74   valid (i.e. not
f980: 20 6a 75 73 74 20 74 68 61 74 20 77 65 20 63 6f   just that we co
f990: 75 6c 64 20 71 75 65 72 79 20 69 74 29 2e 0d 0a  uld query it)...
f9a0: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
f9b0: 20 20 20 69 66 20 7b 24 76 65 72 73 69 6f 6e 20     if {$version 
f9c0: 6e 65 20 22 6e 75 6c 6c 22 7d 20 74 68 65 6e 20  ne "null"} then 
f9d0: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a  {..          #..
f9e0: 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45            # NOTE
f9f0: 3a 20 59 65 73 2c 20 74 68 65 20 53 51 4c 69 74  : Yes, the SQLit
fa00: 65 20 69 6e 74 65 72 6f 70 20 61 73 73 65 6d 62  e interop assemb
fa10: 6c 79 20 61 70 70 65 61 72 73 20 74 6f 20 62 65  ly appears to be
fa20: 20 61 76 61 69 6c 61 62 6c 65 2e 0d 0a 20 20 20   available...   
fa30: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
fa40: 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e      addConstrain
fa50: 74 20 53 51 4c 69 74 65 49 6e 74 65 72 6f 70 0d  t SQLiteInterop.
fa60: 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74  ...          set
fa70: 20 61 6e 73 77 65 72 20 79 65 73 0d 0a 20 20 20   answer yes..   
fa80: 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
fa90: 20 20 20 20 20 20 20 20 20 73 65 74 20 61 6e 73           set ans
faa0: 77 65 72 20 6e 6f 0d 0a 20 20 20 20 20 20 20 20  wer no..        
fab0: 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 74 70 75  }....        tpu
fac0: 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70  ts $channel [app
fad0: 65 6e 64 41 72 67 73 20 24 61 6e 73 77 65 72 20  endArgs $answer 
fae0: 22 20 28 22 20 24 76 65 72 73 69 6f 6e 20 22 20  " (" $version " 
faf0: 22 20 24 73 6f 75 72 63 65 49 64 20 22 29 5c 6e  " $sourceId ")\n
fb00: 22 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65  "]..      } else
fb10: 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74   {..        tput
fb20: 73 20 24 63 68 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d  s $channel no\n.
fb30: 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d  .      }..    }.
fb40: 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 63 68 65  ....    proc che
fb50: 63 6b 46 6f 72 53 51 4c 69 74 65 44 65 66 69 6e  ckForSQLiteDefin
fb60: 65 43 6f 6e 73 74 61 6e 74 20 7b 20 63 68 61 6e  eConstant { chan
fb70: 6e 65 6c 20 6e 61 6d 65 20 7d 20 7b 0d 0a 20 20  nel name } {..  
fb80: 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
fb90: 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
fba0: 0d 0a 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d  ..          "---
fbb0: 2d 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 53  - checking for S
fbc0: 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
fbd0: 65 20 64 65 66 69 6e 65 20 63 6f 6e 73 74 61 6e  e define constan
fbe0: 74 20 5c 22 22 20 24 6e 61 6d 65 20 5c 0d 0a 20  t \"" $name \.. 
fbf0: 20 20 20 20 20 20 20 20 20 22 5c 22 2e 2e 2e 20           "\"... 
fc00: 22 5d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b  "]....      if {
fc10: 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20  [catch {..      
fc20: 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20    object invoke 
fc30: 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69  -flags +NonPubli
fc40: 63 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  c \..           
fc50: 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c   System.Data.SQL
fc60: 69 74 65 2e 53 51 4c 69 74 65 33 20 44 65 66 69  ite.SQLite3 Defi
fc70: 6e 65 43 6f 6e 73 74 61 6e 74 73 0d 0a 20 20 20  neConstants..   
fc80: 20 20 20 7d 20 64 65 66 69 6e 65 43 6f 6e 73 74     } defineConst
fc90: 61 6e 74 73 5d 20 3d 3d 20 30 7d 20 74 68 65 6e  ants] == 0} then
fca0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b   {..        if {
fcb0: 5b 6c 73 65 61 72 63 68 20 2d 65 78 61 63 74 20  [lsearch -exact 
fcc0: 2d 6e 6f 63 61 73 65 20 24 64 65 66 69 6e 65 43  -nocase $defineC
fcd0: 6f 6e 73 74 61 6e 74 73 20 24 6e 61 6d 65 5d 20  onstants $name] 
fce0: 21 3d 20 2d 31 7d 20 74 68 65 6e 20 7b 0d 0a 20  != -1} then {.. 
fcf0: 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
fd00: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 59 65        # NOTE: Ye
fd10: 73 2c 20 74 68 69 73 20 64 65 66 69 6e 65 20 63  s, this define c
fd20: 6f 6e 73 74 61 6e 74 20 77 61 73 20 65 6e 61 62  onstant was enab
fd30: 6c 65 64 20 77 68 65 6e 20 74 68 65 20 6d 61 6e  led when the man
fd40: 61 67 65 64 0d 0a 20 20 20 20 20 20 20 20 20 20  aged..          
fd50: 23 20 20 20 20 20 20 20 61 73 73 65 6d 62 6c 79  #       assembly
fd60: 20 77 61 73 20 63 6f 6d 70 69 6c 65 64 2e 0d 0a   was compiled...
fd70: 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
fd80: 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72         addConstr
fd90: 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73  aint [appendArgs
fda0: 20 5b 67 65 74 53 51 4c 69 74 65 44 65 66 69 6e   [getSQLiteDefin
fdb0: 65 43 6f 6e 73 74 61 6e 74 50 72 65 66 69 78 5d  eConstantPrefix]
fdc0: 20 24 6e 61 6d 65 5d 0d 0a 0d 0a 20 20 20 20 20   $name]....     
fdd0: 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
fde0: 6e 65 6c 20 79 65 73 5c 6e 0d 0a 20 20 20 20 20  nel yes\n..     
fdf0: 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
fe00: 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
fe10: 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d 0a 20 20 20 20  annel no\n..    
fe20: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 20 65      }..      } e
fe30: 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 74  lse {..        t
fe40: 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 65 72  puts $channel er
fe50: 72 6f 72 5c 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a  ror\n..      }..
fe60: 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
fe70: 6f 63 20 67 65 74 44 61 74 65 54 69 6d 65 46 6f  oc getDateTimeFo
fe80: 72 6d 61 74 20 7b 7d 20 7b 0d 0a 20 20 20 20 20  rmat {} {..     
fe90: 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
fea0: 3a 20 54 68 69 73 20 70 72 6f 63 65 64 75 72 65  : This procedure
feb0: 20 73 69 6d 70 6c 79 20 72 65 74 75 72 6e 73 20   simply returns 
fec0: 74 68 65 20 22 64 65 66 61 75 6c 74 22 20 44 61  the "default" Da
fed0: 74 65 54 69 6d 65 20 66 6f 72 6d 61 74 20 75 73  teTime format us
fee0: 65 64 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  ed..      #     
fef0: 20 20 62 79 20 74 68 65 20 74 65 73 74 20 73 75    by the test su
ff00: 69 74 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ite...      #.. 
ff10: 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65       if {[info e
ff20: 78 69 73 74 73 20 3a 3a 64 61 74 65 74 69 6d 65  xists ::datetime
ff30: 5f 66 6f 72 6d 61 74 5d 20 26 26 20 5c 0d 0a 20  _format] && \.. 
ff40: 20 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67           [string
ff50: 20 6c 65 6e 67 74 68 20 24 3a 3a 64 61 74 65 74   length $::datet
ff60: 69 6d 65 5f 66 6f 72 6d 61 74 5d 20 3e 20 30 7d  ime_format] > 0}
ff70: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
ff80: 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
ff90: 54 45 3a 20 52 65 74 75 72 6e 20 74 68 65 20 6d  TE: Return the m
ffa0: 61 6e 75 61 6c 6c 79 20 6f 76 65 72 72 69 64 64  anually overridd
ffb0: 65 6e 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65  en value for the
ffc0: 20 44 61 74 65 54 69 6d 65 20 66 6f 72 6d 61 74   DateTime format
ffd0: 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
ffe0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 3a 3a        return $::
fff0: 64 61 74 65 74 69 6d 65 5f 66 6f 72 6d 61 74 0d  datetime_format.
10000 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d  .      } else {.
10010 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
10020 20 20 20 20 23 20 4e 4f 54 45 3a 20 52 65 74 75      # NOTE: Retu
10030 72 6e 20 61 6e 20 49 53 4f 38 36 30 31 20 44 61  rn an ISO8601 Da
10040 74 65 54 69 6d 65 20 66 6f 72 6d 61 74 20 63 6f  teTime format co
10050 6d 70 61 74 69 62 6c 65 20 77 69 74 68 20 53 51  mpatible with SQ
10060 4c 69 74 65 2c 0d 0a 20 20 20 20 20 20 20 20 23  Lite,..        #
10070 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61         System.Da
10080 74 61 2e 53 51 4c 69 74 65 2c 20 61 6e 64 20 73  ta.SQLite, and s
10090 75 69 74 61 62 6c 65 20 66 6f 72 20 72 6f 75 6e  uitable for roun
100a0 64 2d 74 72 69 70 70 69 6e 67 20 77 69 74 68 20  d-tripping with 
100b0 74 68 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20  the..        #  
100c0 20 20 20 20 20 44 61 74 65 54 69 6d 65 20 63 6c       DateTime cl
100d0 61 73 73 20 6f 66 20 74 68 65 20 66 72 61 6d 65  ass of the frame
100e0 77 6f 72 6b 2e 20 20 49 66 20 74 68 69 73 20 76  work.  If this v
100f0 61 6c 75 65 20 69 73 20 63 68 61 6e 67 65 64 2c  alue is changed,
10100 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
10110 20 20 76 61 72 69 6f 75 73 20 74 65 73 74 73 20    various tests 
10120 6d 61 79 20 66 61 69 6c 2e 0d 0a 20 20 20 20 20  may fail...     
10130 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65     #..        re
10140 74 75 72 6e 20 22 79 79 79 79 2d 4d 4d 2d 64 64  turn "yyyy-MM-dd
10150 20 48 48 3a 6d 6d 3a 73 73 2e 46 46 46 46 46 46   HH:mm:ss.FFFFFF
10160 46 4b 22 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20  FK"..      }..  
10170 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
10180 20 65 6e 75 6d 65 72 61 62 6c 65 54 6f 4c 69 73   enumerableToLis
10190 74 20 7b 20 65 6e 75 6d 65 72 61 62 6c 65 20 7d  t { enumerable }
101a0 20 7b 0d 0a 20 20 20 20 20 20 73 65 74 20 72 65   {..      set re
101b0 73 75 6c 74 20 5b 6c 69 73 74 5d 0d 0a 0d 0a 20  sult [list].... 
101c0 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67       if {[string
101d0 20 6c 65 6e 67 74 68 20 24 65 6e 75 6d 65 72 61   length $enumera
101e0 62 6c 65 5d 20 3d 3d 20 30 20 7c 7c 20 24 65 6e  ble] == 0 || $en
101f0 75 6d 65 72 61 62 6c 65 20 65 71 20 22 6e 75 6c  umerable eq "nul
10200 6c 22 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  l"} then {..    
10210 20 20 20 20 72 65 74 75 72 6e 20 24 72 65 73 75      return $resu
10220 6c 74 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  lt..      }.... 
10230 20 20 20 20 20 6f 62 6a 65 63 74 20 66 6f 72 65       object fore
10240 61 63 68 20 2d 61 6c 69 61 73 20 69 74 65 6d 20  ach -alias item 
10250 24 65 6e 75 6d 65 72 61 62 6c 65 20 7b 0d 0a 20  $enumerable {.. 
10260 20 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69         if {[stri
10270 6e 67 20 6c 65 6e 67 74 68 20 24 69 74 65 6d 5d  ng length $item]
10280 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20   > 0} then {..  
10290 20 20 20 20 20 20 20 20 6c 61 70 70 65 6e 64 20          lappend 
102a0 72 65 73 75 6c 74 20 5b 24 69 74 65 6d 20 54 6f  result [$item To
102b0 53 74 72 69 6e 67 5d 0d 0a 20 20 20 20 20 20 20  String]..       
102c0 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20   }..      }.... 
102d0 20 20 20 20 20 72 65 74 75 72 6e 20 24 72 65 73       return $res
102e0 75 6c 74 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20  ult..    }..... 
102f0 20 20 20 70 72 6f 63 20 63 61 74 63 68 41 6e 64     proc catchAnd
10300 52 65 74 75 72 6e 20 7b 20 73 63 72 69 70 74 20  Return { script 
10310 7b 73 74 61 63 6b 54 72 61 63 65 20 66 61 6c 73  {stackTrace fals
10320 65 7d 20 7b 73 74 72 69 63 74 20 74 72 75 65 7d  e} {strict true}
10330 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20   } {..      #.. 
10340 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 45 76 61       # NOTE: Eva
10350 6c 75 61 74 65 20 74 68 65 20 73 63 72 69 70 74  luate the script
10360 20 70 72 6f 76 69 64 65 64 20 62 79 20 6f 75 72   provided by our
10370 20 63 61 6c 6c 65 72 20 69 6e 20 74 68 65 69 72   caller in their
10380 20 63 6f 6e 74 65 78 74 2c 0d 0a 20 20 20 20 20   context,..     
10390 20 23 20 20 20 20 20 20 20 63 61 70 74 75 72 69   #       capturi
103a0 6e 67 20 62 6f 74 68 20 74 68 65 20 72 65 73 75  ng both the resu
103b0 6c 74 20 61 6e 64 20 74 68 65 20 72 65 74 75 72  lt and the retur
103c0 6e 20 63 6f 64 65 2e 0d 0a 20 20 20 20 20 20 23  n code...      #
103d0 0d 0a 20 20 20 20 20 20 73 65 74 20 63 6f 64 65  ..      set code
103e0 20 5b 63 61 74 63 68 20 7b 75 70 6c 65 76 65 6c   [catch {uplevel
103f0 20 31 20 24 73 63 72 69 70 74 7d 20 72 65 73 75   1 $script} resu
10400 6c 74 5d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a  lt]....      #..
10410 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 44 69        # NOTE: Di
10420 64 20 74 68 65 20 73 63 72 69 70 74 20 70 72 6f  d the script pro
10430 76 69 64 65 64 20 62 79 20 6f 75 72 20 63 61 6c  vided by our cal
10440 6c 65 72 20 4e 4f 54 20 72 61 69 73 65 20 61 6e  ler NOT raise an
10450 20 65 72 72 6f 72 3f 0d 0a 20 20 20 20 20 20 23   error?..      #
10460 0d 0a 20 20 20 20 20 20 69 66 20 7b 24 73 74 72  ..      if {$str
10470 69 63 74 20 26 26 20 24 63 6f 64 65 20 3d 3d 20  ict && $code == 
10480 30 20 7c 7c 20 21 24 73 74 72 69 63 74 20 26 26  0 || !$strict &&
10490 20 24 63 6f 64 65 20 21 3d 20 31 7d 20 74 68 65   $code != 1} the
104a0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  n {..        #..
104b0 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
104c0 53 75 63 63 65 73 73 2e 20 20 52 65 74 75 72 6e  Success.  Return
104d0 20 61 20 6c 69 73 74 20 77 69 74 68 20 74 68 65   a list with the
104e0 20 72 65 74 75 72 6e 20 63 6f 64 65 20 61 6e 64   return code and
104f0 20 74 68 65 20 72 65 73 75 6c 74 2e 0d 0a 20 20   the result...  
10500 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
10510 20 72 65 74 75 72 6e 20 5b 6c 69 73 74 20 24 63   return [list $c
10520 6f 64 65 20 24 72 65 73 75 6c 74 5d 0d 0a 20 20  ode $result]..  
10530 20 20 20 20 7d 20 65 6c 73 65 69 66 20 7b 24 73      } elseif {$s
10540 74 61 63 6b 54 72 61 63 65 7d 20 74 68 65 6e 20  tackTrace} then 
10550 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
10560 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 46 61        # NOTE: Fa
10570 69 6c 75 72 65 2e 20 20 4f 75 72 20 63 61 6c 6c  ilure.  Our call
10580 65 72 20 77 61 6e 74 73 20 61 20 66 75 6c 6c 20  er wants a full 
10590 73 74 61 63 6b 20 74 72 61 63 65 20 28 69 66 20  stack trace (if 
105a0 61 70 70 6c 69 63 61 62 6c 65 29 2c 0d 0a 20 20  applicable),..  
105b0 20 20 20 20 20 20 23 20 20 20 20 20 20 20 72 65        #       re
105c0 74 75 72 6e 20 61 20 6c 69 73 74 20 77 69 74 68  turn a list with
105d0 20 74 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65   the return code
105e0 20 61 6e 64 20 74 68 65 20 72 65 73 75 6c 74 20   and the result 
105f0 76 65 72 62 61 74 69 6d 2e 0d 0a 20 20 20 20 20  verbatim...     
10600 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65     #..        re
10610 74 75 72 6e 20 5b 6c 69 73 74 20 24 63 6f 64 65  turn [list $code
10620 20 24 72 65 73 75 6c 74 5d 0d 0a 20 20 20 20 20   $result]..     
10630 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
10640 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
10650 4e 4f 54 45 3a 20 46 61 69 6c 75 72 65 2e 20 20  NOTE: Failure.  
10660 4f 75 72 20 63 61 6c 6c 65 72 20 64 6f 65 73 20  Our caller does 
10670 6e 6f 74 20 77 61 6e 74 20 61 20 66 75 6c 6c 20  not want a full 
10680 73 74 61 63 6b 20 74 72 61 63 65 20 28 69 66 0d  stack trace (if.
10690 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
106a0 20 61 70 70 6c 69 63 61 62 6c 65 29 2c 20 72 65   applicable), re
106b0 74 75 72 6e 20 61 20 6c 69 73 74 20 77 69 74 68  turn a list with
106c0 20 74 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65   the return code
106d0 2c 20 74 68 65 20 65 72 72 6f 72 0d 0a 20 20 20  , the error..   
106e0 20 20 20 20 20 23 20 20 20 20 20 20 20 63 6f 64       #       cod
106f0 65 20 66 6f 72 20 74 68 65 20 69 6e 74 65 72 70  e for the interp
10700 72 65 74 65 72 2c 20 61 6e 64 20 74 68 65 20 65  reter, and the e
10710 72 72 6f 72 20 6d 65 73 73 61 67 65 20 75 70 20  rror message up 
10720 74 6f 20 74 68 65 0d 0a 20 20 20 20 20 20 20 20  to the..        
10730 23 20 20 20 20 20 20 20 70 6f 69 6e 74 20 77 68  #       point wh
10740 65 72 65 20 74 68 65 20 73 74 61 63 6b 20 74 72  ere the stack tr
10750 61 63 65 20 73 68 6f 75 6c 64 20 73 74 61 72 74  ace should start
10760 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
10770 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b 6c 69        return [li
10780 73 74 20 24 63 6f 64 65 20 24 3a 3a 65 72 72 6f  st $code $::erro
10790 72 43 6f 64 65 20 5c 0d 0a 20 20 20 20 20 20 20  rCode \..       
107a0 20 20 20 20 20 5b 65 78 74 72 61 63 74 53 79 73       [extractSys
107b0 74 65 6d 44 61 74 61 53 51 4c 69 74 65 45 78 63  temDataSQLiteExc
107c0 65 70 74 69 6f 6e 4d 65 73 73 61 67 65 20 24 72  eptionMessage $r
107d0 65 73 75 6c 74 5d 5d 0d 0a 20 20 20 20 20 20 7d  esult]]..      }
107e0 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
107f0 70 72 6f 63 20 63 6f 6d 70 69 6c 65 43 53 68 61  proc compileCSha
10800 72 70 57 69 74 68 20 7b 0d 0a 20 20 20 20 20 20  rpWith {..      
10810 20 20 20 20 20 20 74 65 78 74 20 6d 65 6d 6f 72        text memor
10820 79 20 73 79 6d 62 6f 6c 73 20 73 74 72 69 63 74  y symbols strict
10830 20 72 65 73 75 6c 74 73 56 61 72 4e 61 6d 65 20   resultsVarName 
10840 65 72 72 6f 72 73 56 61 72 4e 61 6d 65 20 66 69  errorsVarName fi
10850 6c 65 4e 61 6d 65 73 0d 0a 20 20 20 20 20 20 20  leNames..       
10860 20 20 20 20 20 61 72 67 73 20 7d 20 7b 0d 0a 20       args } {.. 
10870 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
10880 4e 4f 54 45 3a 20 53 69 6e 63 65 20 77 65 20 61  NOTE: Since we a
10890 72 65 20 67 6f 69 6e 67 20 74 6f 20 75 73 65 20  re going to use 
108a0 74 68 69 73 20 6d 65 74 68 6f 64 20 6e 61 6d 65  this method name
108b0 20 61 20 6c 6f 74 2c 20 61 73 73 69 67 6e 20 69   a lot, assign i
108c0 74 20 74 6f 20 61 0d 0a 20 20 20 20 20 20 23 20  t to a..      # 
108d0 20 20 20 20 20 20 76 61 72 69 61 62 6c 65 20 66        variable f
108e0 69 72 73 74 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  irst...      #..
108f0 20 20 20 20 20 20 73 65 74 20 61 64 64 20 52 65        set add Re
10900 66 65 72 65 6e 63 65 64 41 73 73 65 6d 62 6c 69  ferencedAssembli
10910 65 73 2e 41 64 64 0d 0a 0d 0a 20 20 20 20 20 20  es.Add....      
10920 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
10930 20 43 72 65 61 74 65 20 74 68 65 20 62 61 73 65   Create the base
10940 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 76 61 6c   command to eval
10950 75 61 74 65 20 61 6e 64 20 61 64 64 20 74 68 65  uate and add the
10960 20 70 72 6f 70 65 72 74 79 20 73 65 74 74 69 6e   property settin
10970 67 73 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  gs..      #     
10980 20 20 74 68 61 74 20 61 72 65 20 61 6c 6d 6f 73    that are almos
10990 74 20 61 6c 77 61 79 73 20 6e 65 65 64 65 64 20  t always needed 
109a0 62 79 20 6f 75 72 20 75 6e 69 74 20 74 65 73 74  by our unit test
109b0 73 20 28 69 2e 65 2e 20 74 68 65 20 53 79 73 74  s (i.e. the Syst
109c0 65 6d 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  em..      #     
109d0 20 20 61 6e 64 20 53 79 73 74 65 6d 2e 44 61 74    and System.Dat
109e0 61 20 61 73 73 65 6d 62 6c 79 20 72 65 66 65 72  a assembly refer
109f0 65 6e 63 65 73 29 2e 0d 0a 20 20 20 20 20 20 23  ences)...      #
10a00 0d 0a 20 20 20 20 20 20 73 65 74 20 63 6f 6d 6d  ..      set comm
10a10 61 6e 64 20 5b 6c 69 73 74 20 5c 0d 0a 20 20 20  and [list \..   
10a20 20 20 20 20 20 20 20 63 6f 6d 70 69 6c 65 43 53         compileCS
10a30 68 61 72 70 20 24 74 65 78 74 20 24 6d 65 6d 6f  harp $text $memo
10a40 72 79 20 24 73 79 6d 62 6f 6c 73 20 24 73 74 72  ry $symbols $str
10a50 69 63 74 20 72 65 73 75 6c 74 73 20 65 72 72 6f  ict results erro
10a60 72 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  rs \..          
10a70 24 61 64 64 20 53 79 73 74 65 6d 2e 64 6c 6c 20  $add System.dll 
10a80 24 61 64 64 20 53 79 73 74 65 6d 2e 44 61 74 61  $add System.Data
10a90 2e 64 6c 6c 20 24 61 64 64 20 53 79 73 74 65 6d  .dll $add System
10aa0 2e 54 72 61 6e 73 61 63 74 69 6f 6e 73 2e 64 6c  .Transactions.dl
10ab0 6c 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 24  l \..          $
10ac0 61 64 64 20 53 79 73 74 65 6d 2e 58 6d 6c 2e 64  add System.Xml.d
10ad0 6c 6c 5d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a  ll]....      #..
10ae0 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 64        # NOTE: Ad
10af0 64 20 61 6c 6c 20 74 68 65 20 70 72 6f 76 69 64  d all the provid
10b00 65 64 20 66 69 6c 65 20 6e 61 6d 65 73 20 61 73  ed file names as
10b10 20 61 73 73 65 6d 62 6c 79 20 72 65 66 65 72 65   assembly refere
10b20 6e 63 65 73 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  nces...      #..
10b30 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 66 69        foreach fi
10b40 6c 65 4e 61 6d 65 20 24 66 69 6c 65 4e 61 6d 65  leName $fileName
10b50 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 6c 61 70  s {..        lap
10b60 70 65 6e 64 20 63 6f 6d 6d 61 6e 64 20 24 61 64  pend command $ad
10b70 64 20 5b 67 65 74 42 69 6e 61 72 79 46 69 6c 65  d [getBinaryFile
10b80 4e 61 6d 65 20 24 66 69 6c 65 4e 61 6d 65 5d 0d  Name $fileName].
10b90 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
10ba0 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
10bb0 45 3a 20 41 64 64 20 74 68 65 20 65 78 74 72 61  E: Add the extra
10bc0 20 61 72 67 75 6d 65 6e 74 73 2c 20 69 66 20 61   arguments, if a
10bd0 6e 79 2c 20 74 6f 20 74 68 65 20 63 6f 6d 6d 61  ny, to the comma
10be0 6e 64 20 74 6f 20 65 76 61 6c 75 61 74 65 2e 0d  nd to evaluate..
10bf0 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
10c00 65 76 61 6c 20 6c 61 70 70 65 6e 64 20 63 6f 6d  eval lappend com
10c10 6d 61 6e 64 20 24 61 72 67 73 0d 0a 0d 0a 20 20  mand $args....  
10c20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
10c30 4f 54 45 3a 20 41 6c 69 61 73 20 74 68 65 20 63  OTE: Alias the c
10c40 6f 6d 70 69 6c 65 72 20 6c 6f 63 61 6c 20 72 65  ompiler local re
10c50 73 75 6c 74 73 20 61 6e 64 20 65 72 72 6f 72 73  sults and errors
10c60 20 76 61 72 69 61 62 6c 65 73 20 74 6f 20 74 68   variables to th
10c70 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  e..      #      
10c80 20 76 61 72 69 61 62 6c 65 20 6e 61 6d 65 73 20   variable names 
10c90 70 72 6f 76 69 64 65 64 20 62 79 20 6f 75 72 20  provided by our 
10ca0 63 61 6c 6c 65 72 2e 0d 0a 20 20 20 20 20 20 23  caller...      #
10cb0 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72  ..      if {[str
10cc0 69 6e 67 20 6c 65 6e 67 74 68 20 24 72 65 73 75  ing length $resu
10cd0 6c 74 73 56 61 72 4e 61 6d 65 5d 20 3e 20 30 7d  ltsVarName] > 0}
10ce0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
10cf0 20 75 70 76 61 72 20 31 20 24 72 65 73 75 6c 74   upvar 1 $result
10d00 73 56 61 72 4e 61 6d 65 20 72 65 73 75 6c 74 73  sVarName results
10d10 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
10d20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c     if {[string l
10d30 65 6e 67 74 68 20 24 65 72 72 6f 72 73 56 61 72  ength $errorsVar
10d40 4e 61 6d 65 5d 20 3e 20 30 7d 20 74 68 65 6e 20  Name] > 0} then 
10d50 7b 0d 0a 20 20 20 20 20 20 20 20 75 70 76 61 72  {..        upvar
10d60 20 31 20 24 65 72 72 6f 72 73 56 61 72 4e 61 6d   1 $errorsVarNam
10d70 65 20 65 72 72 6f 72 73 0d 0a 20 20 20 20 20 20  e errors..      
10d80 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  }....      #..  
10d90 20 20 20 20 23 20 4e 4f 54 45 3a 20 45 76 61 6c      # NOTE: Eval
10da0 75 61 74 65 20 74 68 65 20 63 6f 6e 73 74 72 75  uate the constru
10db0 63 74 65 64 20 5b 63 6f 6d 70 69 6c 65 43 53 68  cted [compileCSh
10dc0 61 72 70 5d 20 63 6f 6d 6d 61 6e 64 20 61 6e 64  arp] command and
10dd0 20 72 65 74 75 72 6e 20 74 68 65 0d 0a 20 20 20   return the..   
10de0 20 20 20 23 20 20 20 20 20 20 20 72 65 73 75 6c     #       resul
10df0 74 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  t...      #..   
10e00 20 20 20 65 76 61 6c 20 24 63 6f 6d 6d 61 6e 64     eval $command
10e10 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
10e20 70 72 6f 63 20 69 73 4d 65 6d 6f 72 79 44 62 20  proc isMemoryDb 
10e30 7b 20 66 69 6c 65 4e 61 6d 65 20 7d 20 7b 0d 0a  { fileName } {..
10e40 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
10e50 20 4e 4f 54 45 3a 20 49 73 20 74 68 65 20 73 70   NOTE: Is the sp
10e60 65 63 69 66 69 65 64 20 64 61 74 61 62 61 73 65  ecified database
10e70 20 66 69 6c 65 20 6e 61 6d 65 20 72 65 61 6c 6c   file name reall
10e80 79 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64  y an in-memory d
10e90 61 74 61 62 61 73 65 3f 0d 0a 20 20 20 20 20 20  atabase?..      
10ea0 23 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  #..      return 
10eb0 5b 65 78 70 72 20 7b 24 66 69 6c 65 4e 61 6d 65  [expr {$fileName
10ec0 20 65 71 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 7c   eq ":memory:" |
10ed0 7c 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b  | \..          [
10ee0 73 74 72 69 6e 67 20 72 61 6e 67 65 20 24 66 69  string range $fi
10ef0 6c 65 4e 61 6d 65 20 30 20 31 32 5d 20 65 71 20  leName 0 12] eq 
10f00 22 66 69 6c 65 3a 3a 6d 65 6d 6f 72 79 3a 22 7d  "file::memory:"}
10f10 5d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  ]..    }.....   
10f20 20 70 72 6f 63 20 69 73 54 61 62 6c 65 49 6e 44   proc isTableInD
10f30 62 20 7b 20 6e 61 6d 65 20 7b 76 61 72 4e 61 6d  b { name {varNam
10f40 65 20 64 62 7d 20 7d 20 7b 0d 0a 20 20 20 20 20  e db} } {..     
10f50 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
10f60 3a 20 52 65 66 65 72 20 74 6f 20 74 68 65 20 73  : Refer to the s
10f70 70 65 63 69 66 69 65 64 20 76 61 72 69 61 62 6c  pecified variabl
10f80 65 20 28 65 2e 67 2e 20 22 64 62 22 29 20 69 6e  e (e.g. "db") in
10f90 20 74 68 65 20 63 6f 6e 74 65 78 74 20 6f 66 20   the context of 
10fa0 6f 75 72 0d 0a 20 20 20 20 20 20 23 20 20 20 20  our..      #    
10fb0 20 20 20 63 61 6c 6c 65 72 2e 20 20 49 74 20 63     caller.  It c
10fc0 6f 6e 74 61 69 6e 73 20 74 68 65 20 64 61 74 61  ontains the data
10fd0 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
10fe0 68 61 6e 64 6c 65 20 74 68 61 74 20 77 69 6c 6c  handle that will
10ff0 20 62 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20   be..      #    
11000 20 20 20 75 73 65 64 20 74 6f 20 65 78 65 63 75     used to execu
11010 74 65 20 74 68 65 20 71 75 65 72 79 20 75 73 65  te the query use
11020 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 69  d to determine i
11030 66 20 74 68 65 20 6e 61 6d 65 64 20 74 61 62 6c  f the named tabl
11040 65 20 69 73 0d 0a 20 20 20 20 20 20 23 20 20 20  e is..      #   
11050 20 20 20 20 70 72 65 73 65 6e 74 20 69 6e 20 74      present in t
11060 68 61 74 20 64 61 74 61 62 61 73 65 2e 0d 0a 20  hat database... 
11070 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 75 70       #..      up
11080 76 61 72 20 31 20 24 76 61 72 4e 61 6d 65 20 64  var 1 $varName d
11090 62 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  b....      #..  
110a0 20 20 20 20 23 20 4e 4f 54 45 3a 20 55 73 65 20      # NOTE: Use 
110b0 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  the sqlite_maste
110c0 72 20 74 61 62 6c 65 20 74 6f 20 64 65 74 65 72  r table to deter
110d0 6d 69 6e 65 20 69 66 20 74 68 65 20 6e 61 6d 65  mine if the name
110e0 64 20 74 61 62 6c 65 20 69 73 0d 0a 20 20 20 20  d table is..    
110f0 20 20 23 20 20 20 20 20 20 20 70 72 65 73 65 6e    #       presen
11100 74 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  t in the databas
11110 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  e...      #..   
11120 20 20 20 73 65 74 20 73 71 6c 20 7b 0d 0a 20 20     set sql {..  
11130 20 20 20 20 20 20 53 45 4c 45 43 54 20 43 4f 55        SELECT COU
11140 4e 54 28 2a 29 20 46 52 4f 4d 20 73 71 6c 69 74  NT(*) FROM sqlit
11150 65 5f 6d 61 73 74 65 72 20 57 48 45 52 45 20 74  e_master WHERE t
11160 79 70 65 20 3d 20 27 74 61 62 6c 65 27 20 41 4e  ype = 'table' AN
11170 44 20 6e 61 6d 65 20 3d 20 3f 3b 0d 0a 20 20 20  D name = ?;..   
11180 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d     }....      #.
11190 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 52  .      # NOTE: R
111a0 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69  eturn non-zero i
111b0 66 20 74 68 65 20 6e 61 6d 65 64 20 74 61 62 6c  f the named tabl
111c0 65 20 69 73 20 70 72 65 73 65 6e 74 2e 0d 0a 20  e is present... 
111d0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 72 65       #..      re
111e0 74 75 72 6e 20 5b 65 78 70 72 20 7b 0d 0a 20 20  turn [expr {..  
111f0 20 20 20 20 20 20 5b 73 71 6c 20 65 78 65 63 75        [sql execu
11200 74 65 20 2d 65 78 65 63 75 74 65 20 73 63 61 6c  te -execute scal
11210 61 72 20 24 64 62 20 24 73 71 6c 20 5b 6c 69 73  ar $db $sql [lis
11220 74 20 70 61 72 61 6d 31 20 53 74 72 69 6e 67 20  t param1 String 
11230 24 6e 61 6d 65 5d 5d 20 3e 20 30 0d 0a 20 20 20  $name]] > 0..   
11240 20 20 20 7d 5d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d     }]..    }....
11250 0a 20 20 20 20 70 72 6f 63 20 67 65 74 44 62 44  .    proc getDbD
11260 65 66 61 75 6c 74 50 61 67 65 53 69 7a 65 20 7b  efaultPageSize {
11270 7d 20 7b 0d 0a 20 20 20 20 20 20 74 72 79 20 7b  } {..      try {
11280 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 64 62  ..        set db
11290 20 5b 73 71 6c 20 6f 70 65 6e 20 2d 74 79 70 65   [sql open -type
112a0 20 53 51 4c 69 74 65 20 7b 44 61 74 61 20 53 6f   SQLite {Data So
112b0 75 72 63 65 3d 3a 6d 65 6d 6f 72 79 3a 3b 7d 5d  urce=:memory:;}]
112c0 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ..        return
112d0 20 5b 73 71 6c 20 65 78 65 63 75 74 65 20 2d 65   [sql execute -e
112e0 78 65 63 75 74 65 20 73 63 61 6c 61 72 20 24 64  xecute scalar $d
112f0 62 20 22 50 52 41 47 4d 41 20 70 61 67 65 5f 73  b "PRAGMA page_s
11300 69 7a 65 3b 22 5d 0d 0a 20 20 20 20 20 20 7d 20  ize;"]..      } 
11310 66 69 6e 61 6c 6c 79 20 7b 0d 0a 20 20 20 20 20  finally {..     
11320 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69     if {[info exi
11330 73 74 73 20 64 62 5d 7d 20 74 68 65 6e 20 7b 0d  sts db]} then {.
11340 0a 20 20 20 20 20 20 20 20 20 20 63 61 74 63 68  .          catch
11350 20 7b 73 71 6c 20 63 6c 6f 73 65 20 24 64 62 7d   {sql close $db}
11360 0d 0a 20 20 20 20 20 20 20 20 20 20 75 6e 73 65  ..          unse
11370 74 20 2d 6e 6f 63 6f 6d 70 6c 61 69 6e 20 64 62  t -nocomplain db
11380 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20  ..        }..   
11390 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a     }..    }.....
113a0 20 20 20 20 70 72 6f 63 20 67 65 74 44 62 44 65      proc getDbDe
113b0 66 61 75 6c 74 43 61 63 68 65 53 69 7a 65 20 7b  faultCacheSize {
113c0 7d 20 7b 0d 0a 20 20 20 20 20 20 74 72 79 20 7b  } {..      try {
113d0 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 64 62  ..        set db
113e0 20 5b 73 71 6c 20 6f 70 65 6e 20 2d 74 79 70 65   [sql open -type
113f0 20 53 51 4c 69 74 65 20 7b 44 61 74 61 20 53 6f   SQLite {Data So
11400 75 72 63 65 3d 3a 6d 65 6d 6f 72 79 3a 3b 7d 5d  urce=:memory:;}]
11410 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ..        return
11420 20 5b 73 71 6c 20 65 78 65 63 75 74 65 20 2d 65   [sql execute -e
11430 78 65 63 75 74 65 20 73 63 61 6c 61 72 20 24 64  xecute scalar $d
11440 62 20 22 50 52 41 47 4d 41 20 63 61 63 68 65 5f  b "PRAGMA cache_
11450 73 69 7a 65 3b 22 5d 0d 0a 20 20 20 20 20 20 7d  size;"]..      }
11460 20 66 69 6e 61 6c 6c 79 20 7b 0d 0a 20 20 20 20   finally {..    
11470 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78      if {[info ex
11480 69 73 74 73 20 64 62 5d 7d 20 74 68 65 6e 20 7b  ists db]} then {
11490 0d 0a 20 20 20 20 20 20 20 20 20 20 63 61 74 63  ..          catc
114a0 68 20 7b 73 71 6c 20 63 6c 6f 73 65 20 24 64 62  h {sql close $db
114b0 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 75 6e 73  }..          uns
114c0 65 74 20 2d 6e 6f 63 6f 6d 70 6c 61 69 6e 20 64  et -nocomplain d
114d0 62 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  b..        }..  
114e0 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d      }..    }....
114f0 0a 20 20 20 20 70 72 6f 63 20 75 73 65 4c 65 67  .    proc useLeg
11500 61 63 79 44 62 50 61 67 65 41 6e 64 43 61 63 68  acyDbPageAndCach
11510 65 53 69 7a 65 73 20 7b 20 76 61 72 4e 61 6d 65  eSizes { varName
11520 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20   } {..      #.. 
11530 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 52 65 66       # NOTE: Ref
11540 65 72 20 74 6f 20 74 68 65 20 73 70 65 63 69 66  er to the specif
11550 69 65 64 20 76 61 72 69 61 62 6c 65 20 28 65 2e  ied variable (e.
11560 67 2e 20 22 64 62 22 29 20 69 6e 20 74 68 65 20  g. "db") in the 
11570 63 6f 6e 74 65 78 74 20 6f 66 20 6f 75 72 0d 0a  context of our..
11580 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63 61        #       ca
11590 6c 6c 65 72 2e 20 20 49 74 20 63 6f 6e 74 61 69  ller.  It contai
115a0 6e 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ns the database 
115b0 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 6e 64 6c  connection handl
115c0 65 20 74 68 61 74 20 77 69 6c 6c 20 62 65 0d 0a  e that will be..
115d0 20 20 20 20 20 20 23 20 20 20 20 20 20 20 75 73        #       us
115e0 65 64 20 74 6f 20 65 78 65 63 75 74 65 20 71 75  ed to execute qu
115f0 65 72 69 65 73 20 75 73 65 64 20 74 6f 20 73 65  eries used to se
11600 74 20 74 68 65 20 70 61 67 65 20 61 6e 64 20 63  t the page and c
11610 61 63 68 65 20 73 69 7a 65 73 2e 0d 0a 20 20 20  ache sizes...   
11620 20 20 20 23 0d 0a 20 20 20 20 20 20 75 70 76 61     #..      upva
11630 72 20 31 20 24 76 61 72 4e 61 6d 65 20 64 62 0d  r 1 $varName db.
11640 0a 0d 0a 20 20 20 20 20 20 73 71 6c 20 65 78 65  ...      sql exe
11650 63 75 74 65 20 24 64 62 20 7b 0d 0a 20 20 20 20  cute $db {..    
11660 20 20 20 20 50 52 41 47 4d 41 20 70 61 67 65 5f      PRAGMA page_
11670 73 69 7a 65 20 3d 20 31 30 32 34 3b 0d 0a 20 20  size = 1024;..  
11680 20 20 20 20 20 20 50 52 41 47 4d 41 20 63 61 63        PRAGMA cac
11690 68 65 5f 73 69 7a 65 20 3d 20 32 30 30 30 3b 0d  he_size = 2000;.
116a0 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
116b0 20 20 72 65 74 75 72 6e 20 5b 6c 69 73 74 20 5c    return [list \
116c0 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 73 71 6c  ..          [sql
116d0 20 65 78 65 63 75 74 65 20 2d 65 78 65 63 75 74   execute -execut
116e0 65 20 73 63 61 6c 61 72 20 24 64 62 20 22 50 52  e scalar $db "PR
116f0 41 47 4d 41 20 70 61 67 65 5f 73 69 7a 65 3b 22  AGMA page_size;"
11700 5d 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b  ] \..          [
11710 73 71 6c 20 65 78 65 63 75 74 65 20 2d 65 78 65  sql execute -exe
11720 63 75 74 65 20 73 63 61 6c 61 72 20 24 64 62 20  cute scalar $db 
11730 22 50 52 41 47 4d 41 20 63 61 63 68 65 5f 73 69  "PRAGMA cache_si
11740 7a 65 3b 22 5d 5d 0d 0a 20 20 20 20 7d 0d 0a 0c  ze;"]]..    }...
11750 0d 0a 20 20 20 20 70 72 6f 63 20 65 78 74 72 61  ..    proc extra
11760 63 74 53 79 73 74 65 6d 44 61 74 61 53 51 4c 69  ctSystemDataSQLi
11770 74 65 45 78 63 65 70 74 69 6f 6e 4d 65 73 73 61  teExceptionMessa
11780 67 65 20 7b 20 76 61 6c 75 65 20 7d 20 7b 0d 0a  ge { value } {..
11790 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
117a0 20 4e 4f 54 45 3a 20 49 66 20 74 68 65 20 73 74   NOTE: If the st
117b0 72 69 6e 67 20 63 6f 6e 66 6f 72 6d 73 20 74 6f  ring conforms to
117c0 20 66 6f 72 6d 61 74 20 6f 66 20 74 68 65 20 6e   format of the n
117d0 6f 72 6d 61 6c 20 65 78 63 65 70 74 69 6f 6e 0d  ormal exception.
117e0 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 65  .      #       e
117f0 72 72 6f 72 20 73 74 72 69 6e 67 73 2c 20 65 78  rror strings, ex
11800 74 72 61 63 74 20 61 6e 64 20 72 65 74 75 72 6e  tract and return
11810 20 6f 6e 6c 79 20 74 68 65 20 65 72 72 6f 72 20   only the error 
11820 6d 65 73 73 61 67 65 0d 0a 20 20 20 20 20 20 23  message..      #
11830 20 20 20 20 20 20 20 70 6f 72 74 69 6f 6e 20 69         portion i
11840 74 73 65 6c 66 2e 0d 0a 20 20 20 20 20 20 23 0d  tself...      #.
11850 0a 20 20 20 20 20 20 73 65 74 20 70 61 74 74 65  .      set patte
11860 72 6e 73 20 5b 6c 69 73 74 20 5c 0d 0a 20 20 20  rns [list \..   
11870 20 20 20 7b 53 79 73 74 65 6d 5c 2e 44 61 74 61     {System\.Data
11880 5c 2e 53 51 4c 69 74 65 5c 2e 53 51 4c 69 74 65  \.SQLite\.SQLite
11890 45 78 63 65 70 74 69 6f 6e 20 5c 28 30 78 38 30  Exception \(0x80
118a0 30 30 34 30 30 35 5c 29 3a 20 28 2e 2b 3f 29 20  004005\): (.+?) 
118b0 20 28 3f 3a 20 29 3f 61 74 7d 20 5c 0d 0a 20 20   (?: )?at} \..  
118c0 20 20 20 20 7b 53 79 73 74 65 6d 5c 2e 44 61 74      {System\.Dat
118d0 61 5c 2e 53 51 4c 69 74 65 5c 2e 53 51 4c 69 74  a\.SQLite\.SQLit
118e0 65 45 78 63 65 70 74 69 6f 6e 3a 20 28 2e 2b 3f  eException: (.+?
118f0 29 20 20 28 3f 3a 20 29 3f 61 74 7d 5d 0d 0a 0d  )  (?: )?at}]...
11900 0a 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 70  .      foreach p
11910 61 74 74 65 72 6e 20 24 70 61 74 74 65 72 6e 73  attern $patterns
11920 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b   {..        if {
11930 5b 72 65 67 65 78 70 20 2d 2d 20 24 70 61 74 74  [regexp -- $patt
11940 65 72 6e 20 24 76 61 6c 75 65 20 64 75 6d 6d 79  ern $value dummy
11950 20 6d 65 73 73 61 67 65 5d 7d 20 74 68 65 6e 20   message]} then 
11960 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74  {..          set
11970 20 6d 65 73 73 61 67 65 20 5b 73 74 72 69 6e 67   message [string
11980 20 6d 61 70 20 5b 6c 69 73 74 20 5c 72 5c 6e 20   map [list \r\n 
11990 5c 6e 5d 20 5b 73 74 72 69 6e 67 20 74 72 69 6d  \n] [string trim
119a0 20 24 6d 65 73 73 61 67 65 5d 5d 0d 0a 20 20 20   $message]]..   
119b0 20 20 20 20 20 20 20 73 65 74 20 6c 69 6e 65 73         set lines
119c0 20 5b 73 70 6c 69 74 20 24 6d 65 73 73 61 67 65   [split $message
119d0 20 5c 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20   \n]....        
119e0 20 20 69 66 20 7b 5b 6c 6c 65 6e 67 74 68 20 24    if {[llength $
119f0 6c 69 6e 65 73 5d 20 3d 3d 20 32 7d 20 74 68 65  lines] == 2} the
11a00 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
11a10 20 69 66 20 7b 5b 6c 69 6e 64 65 78 20 24 6c 69   if {[lindex $li
11a20 6e 65 73 20 30 5d 20 65 71 20 5b 6c 69 6e 64 65  nes 0] eq [linde
11a30 78 20 24 6c 69 6e 65 73 20 31 5d 7d 20 74 68 65  x $lines 1]} the
11a40 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
11a50 20 20 20 72 65 74 75 72 6e 20 5b 6c 69 6e 64 65     return [linde
11a60 78 20 24 6c 69 6e 65 73 20 30 5d 0d 0a 20 20 20  x $lines 0]..   
11a70 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20           }....  
11a80 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
11a90 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5b 6c 69   [appendArgs [li
11aa0 6e 64 65 78 20 24 6c 69 6e 65 73 20 30 5d 20 22  ndex $lines 0] "
11ab0 20 2d 2d 20 22 20 5b 6c 69 6e 64 65 78 20 24 6c   -- " [lindex $l
11ac0 69 6e 65 73 20 31 5d 5d 0d 0a 20 20 20 20 20 20  ines 1]]..      
11ad0 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
11ae0 20 20 20 72 65 74 75 72 6e 20 24 6d 65 73 73 61     return $messa
11af0 67 65 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20  ge..        }.. 
11b00 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
11b10 72 65 74 75 72 6e 20 24 76 61 6c 75 65 0d 0a 20  return $value.. 
11b20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
11b30 63 20 74 72 69 6d 53 71 6c 20 7b 20 73 71 6c 20  c trimSql { sql 
11b40 7d 20 7b 0d 0a 20 20 20 20 20 20 72 65 74 75 72  } {..      retur
11b50 6e 20 5b 72 65 67 73 75 62 20 2d 61 6c 6c 20 2d  n [regsub -all -
11b60 2d 20 7b 5c 73 2b 7d 20 5b 73 74 72 69 6e 67 20  - {\s+} [string 
11b70 74 72 69 6d 20 24 73 71 6c 5d 20 22 20 22 5d 0d  trim $sql] " "].
11b80 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70  .    }.....    p
11b90 72 6f 63 20 65 78 65 63 75 74 65 53 71 6c 20 7b  roc executeSql {
11ba0 20 73 71 6c 20 7b 65 78 65 63 75 74 65 20 6e 6f   sql {execute no
11bb0 6e 65 7d 20 7b 66 6f 72 6d 61 74 20 6e 6f 6e 65  ne} {format none
11bc0 7d 20 7b 66 69 6c 65 4e 61 6d 65 20 22 22 7d 20  } {fileName ""} 
11bd0 7d 20 7b 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b  } {..      if {[
11be0 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 66  string length $f
11bf0 69 6c 65 4e 61 6d 65 5d 20 3d 3d 20 30 7d 20 74  ileName] == 0} t
11c00 68 65 6e 20 7b 73 65 74 20 66 69 6c 65 4e 61 6d  hen {set fileNam
11c10 65 20 3a 6d 65 6d 6f 72 79 3a 7d 0d 0a 20 20 20  e :memory:}..   
11c20 20 20 20 73 65 74 75 70 44 62 20 24 66 69 6c 65     setupDb $file
11c30 4e 61 6d 65 20 22 22 20 22 22 20 22 22 20 22 22  Name "" "" "" ""
11c40 20 22 22 20 66 61 6c 73 65 20 66 61 6c 73 65 20   "" false false 
11c50 66 61 6c 73 65 20 66 61 6c 73 65 20 64 62 20 74  false false db t
11c60 72 75 65 0d 0a 0d 0a 20 20 20 20 20 20 74 72 79  rue....      try
11c70 20 7b 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75   {..        retu
11c80 72 6e 20 5b 75 70 6c 65 76 65 6c 20 31 20 5b 6c  rn [uplevel 1 [l
11c90 69 73 74 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ist \..         
11ca0 20 20 20 73 71 6c 20 65 78 65 63 75 74 65 20 2d     sql execute -
11cb0 65 78 65 63 75 74 65 20 24 65 78 65 63 75 74 65  execute $execute
11cc0 20 2d 66 6f 72 6d 61 74 20 24 66 6f 72 6d 61 74   -format $format
11cd0 20 24 64 62 20 24 73 71 6c 5d 5d 0d 0a 20 20 20   $db $sql]]..   
11ce0 20 20 20 7d 20 66 69 6e 61 6c 6c 79 20 7b 0d 0a     } finally {..
11cf0 20 20 20 20 20 20 20 20 63 6c 65 61 6e 75 70 44          cleanupD
11d00 62 20 24 66 69 6c 65 4e 61 6d 65 20 64 62 20 66  b $fileName db f
11d10 61 6c 73 65 20 66 61 6c 73 65 20 66 61 6c 73 65  alse false false
11d20 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d  ..      }..    }
11d30 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 68 61  .....    proc ha
11d40 73 4e 6f 46 6c 61 67 73 20 7b 20 76 61 72 4e 61  sNoFlags { varNa
11d50 6d 65 20 6e 6f 6e 65 20 7d 20 7b 0d 0a 20 20 20  me none } {..   
11d60 20 20 20 75 70 76 61 72 20 31 20 24 76 61 72 4e     upvar 1 $varN
11d70 61 6d 65 20 66 6c 61 67 73 0d 0a 0d 0a 20 20 20  ame flags....   
11d80 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78     if {![info ex
11d90 69 73 74 73 20 66 6c 61 67 73 5d 7d 20 74 68 65  ists flags]} the
11da0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 72 65 74  n {..        ret
11db0 75 72 6e 20 74 72 75 65 0d 0a 20 20 20 20 20 20  urn true..      
11dc0 7d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b  }....      if {[
11dd0 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 66  string length $f
11de0 6c 61 67 73 5d 20 3d 3d 20 30 7d 20 74 68 65 6e  lags] == 0} then
11df0 20 7b 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75   {..        retu
11e00 72 6e 20 74 72 75 65 0d 0a 20 20 20 20 20 20 7d  rn true..      }
11e10 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 24 6e  ....      if {$n
11e20 6f 6e 65 20 26 26 20 24 66 6c 61 67 73 20 65 71  one && $flags eq
11e30 20 22 4e 6f 6e 65 22 7d 20 74 68 65 6e 20 7b 0d   "None"} then {.
11e40 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
11e50 74 72 75 65 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d  true..      }...
11e60 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 66 61  .      return fa
11e70 6c 73 65 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20  lse..    }..... 
11e80 20 20 20 70 72 6f 63 20 67 65 74 43 6f 6e 6e 65     proc getConne
11e90 63 74 69 6f 6e 46 6c 61 67 73 20 7b 20 66 69 6c  ctionFlags { fil
11ea0 65 4e 61 6d 65 20 66 6c 61 67 73 20 7b 71 75 69  eName flags {qui
11eb0 65 74 20 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a 20  et false} } {.. 
11ec0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
11ed0 4e 4f 54 45 3a 20 46 69 67 75 72 65 20 6f 75 74  NOTE: Figure out
11ee0 20 77 68 69 63 68 20 64 61 74 61 62 61 73 65 20   which database 
11ef0 66 69 6c 65 20 6e 61 6d 65 20 6f 72 20 63 6f 6e  file name or con
11f00 6e 65 63 74 69 6f 6e 20 73 74 72 69 6e 67 20 74  nection string t
11f10 68 65 73 65 0d 0a 20 20 20 20 20 20 23 20 20 20  hese..      #   
11f20 20 20 20 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66      connection f
11f30 6c 61 67 73 20 77 69 6c 6c 20 61 63 74 75 61 6c  lags will actual
11f40 6c 79 20 61 70 70 6c 79 20 74 6f 2e 20 20 54 68  ly apply to.  Th
11f50 69 73 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73  is is not necess
11f60 61 72 79 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ary..      #    
11f70 20 20 20 69 6e 20 71 75 69 65 74 20 6d 6f 64 65     in quiet mode
11f80 20 62 65 63 61 75 73 65 20 74 68 69 73 20 69 6e   because this in
11f90 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 6f 6e 6c  formation is onl
11fa0 79 20 75 73 65 64 20 66 6f 72 20 6c 6f 67 67 69  y used for loggi
11fb0 6e 67 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  ng..      #     
11fc0 20 20 61 6e 64 20 72 65 70 6f 72 74 69 6e 67 20    and reporting 
11fd0 70 75 72 70 6f 73 65 73 2e 0d 0a 20 20 20 20 20  purposes...     
11fe0 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 21 24   #..      if {!$
11ff0 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20  quiet} then {.. 
12000 20 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69         if {[stri
12010 6e 67 20 6c 65 6e 67 74 68 20 24 66 69 6c 65 4e  ng length $fileN
12020 61 6d 65 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b  ame] > 0} then {
12030 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20  ..          set 
12040 64 61 74 61 62 61 73 65 20 5b 61 70 70 65 6e 64  database [append
12050 41 72 67 73 20 22 66 69 6c 65 20 6e 61 6d 65 20  Args "file name 
12060 5c 22 22 20 24 66 69 6c 65 4e 61 6d 65 20 5c 22  \"" $fileName \"
12070 5d 0d 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73  ]..        } els
12080 65 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74  eif {[info exist
12090 73 20 3a 3a 64 61 74 61 53 6f 75 72 63 65 5d 20  s ::dataSource] 
120a0 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  && \..          
120b0 20 20 21 5b 61 72 72 61 79 20 65 78 69 73 74 73    ![array exists
120c0 20 3a 3a 64 61 74 61 53 6f 75 72 63 65 5d 7d 20   ::dataSource]} 
120d0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
120e0 20 20 73 65 74 20 64 61 74 61 62 61 73 65 20 5b    set database [
120f0 61 70 70 65 6e 64 41 72 67 73 20 22 64 61 74 61  appendArgs "data
12100 20 73 6f 75 72 63 65 20 5c 22 22 20 24 3a 3a 64   source \"" $::d
12110 61 74 61 53 6f 75 72 63 65 20 5c 22 5d 0d 0a 20  ataSource \"].. 
12120 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d         } else {.
12130 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20 64  .          set d
12140 61 74 61 62 61 73 65 20 3c 75 6e 6b 6e 6f 77 6e  atabase <unknown
12150 3e 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  >..        }..  
12160 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23      }....      #
12170 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
12180 53 68 6f 77 20 28 61 6e 64 20 6c 6f 67 29 20 74  Show (and log) t
12190 68 65 20 6c 6f 63 61 6c 20 63 6f 6e 6e 65 63 74  he local connect
121a0 69 6f 6e 20 66 6c 61 67 73 20 61 6e 64 20 74 68  ion flags and th
121b0 65 20 61 73 73 6f 63 69 61 74 65 64 0d 0a 20 20  e associated..  
121c0 20 20 20 20 23 20 20 20 20 20 20 20 64 61 74 61      #       data
121d0 20 73 6f 75 72 63 65 20 6f 72 20 66 69 6c 65 20   source or file 
121e0 6e 61 6d 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  name...      #..
121f0 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65        if {!$quie
12200 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  t} then {..     
12210 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78     if {![info ex
12220 69 73 74 73 20 3a 3a 6e 6f 28 65 6d 69 74 4c 6f  ists ::no(emitLo
12230 63 61 6c 46 6c 61 67 73 29 5d 20 26 26 20 5c 0d  calFlags)] && \.
12240 0a 20 20 20 20 20 20 20 20 20 20 20 20 28 21 5b  .            (![
12250 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f  info exists ::no
12260 28 65 6d 69 74 4c 6f 63 61 6c 46 6c 61 67 73 49  (emitLocalFlagsI
12270 66 4e 6f 6e 65 29 5d 20 7c 7c 20 5c 0d 0a 20 20  fNone)] || \..  
12280 20 20 20 20 20 20 20 20 20 20 20 21 5b 68 61 73             ![has
12290 4e 6f 46 6c 61 67 73 20 66 6c 61 67 73 20 66 61  NoFlags flags fa
122a0 6c 73 65 5d 29 7d 20 74 68 65 6e 20 7b 0d 0a 20  lse])} then {.. 
122b0 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
122c0 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b  ::test_channel [
122d0 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
122e0 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
122f0 2d 20 6c 6f 63 61 6c 20 63 6f 6e 6e 65 63 74 69  - local connecti
12300 6f 6e 20 66 6c 61 67 73 20 66 6f 72 20 22 20 24  on flags for " $
12310 64 61 74 61 62 61 73 65 20 5c 0d 0a 20 20 20 20  database \..    
12320 20 20 20 20 20 20 20 20 20 20 22 20 61 72 65 3a            " are:
12330 20 22 20 5b 65 78 70 72 20 7b 21 5b 68 61 73 4e   " [expr {![hasN
12340 6f 46 6c 61 67 73 20 66 6c 61 67 73 20 66 61 6c  oFlags flags fal
12350 73 65 5d 20 3f 20 5c 0d 0a 20 20 20 20 20 20 20  se] ? \..       
12360 20 20 20 20 20 20 20 5b 61 70 70 65 6e 64 41 72         [appendAr
12370 67 73 20 5c 22 20 24 66 6c 61 67 73 20 5c 22 5d  gs \" $flags \"]
12380 20 3a 20 22 3c 6e 6f 6e 65 3e 22 7d 5d 20 5c 6e   : "<none>"}] \n
12390 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  ]..        }..  
123a0 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23      }....      #
123b0 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
123c0 53 68 6f 77 20 28 61 6e 64 20 6c 6f 67 29 20 74  Show (and log) t
123d0 68 65 20 73 68 61 72 65 64 20 63 6f 6e 6e 65 63  he shared connec
123e0 74 69 6f 6e 20 66 6c 61 67 73 2e 0d 0a 20 20 20  tion flags...   
123f0 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
12400 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d  !$quiet} then {.
12410 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61  .        if {[ca
12420 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  tch {..         
12430 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 53   object invoke S
12440 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
12450 65 2e 53 51 4c 69 74 65 43 6f 6e 6e 65 63 74 69  e.SQLiteConnecti
12460 6f 6e 20 53 68 61 72 65 64 46 6c 61 67 73 0d 0a  on SharedFlags..
12470 20 20 20 20 20 20 20 20 7d 20 73 68 61 72 65 64          } shared
12480 46 6c 61 67 73 5d 20 3d 3d 20 30 7d 20 74 68 65  Flags] == 0} the
12490 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69  n {..          i
124a0 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73  f {![info exists
124b0 20 3a 3a 6e 6f 28 65 6d 69 74 53 68 61 72 65 64   ::no(emitShared
124c0 46 6c 61 67 73 29 5d 20 26 26 20 5c 0d 0a 20 20  Flags)] && \..  
124d0 20 20 20 20 20 20 20 20 20 20 20 20 28 21 5b 69              (![i
124e0 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28  nfo exists ::no(
124f0 65 6d 69 74 53 68 61 72 65 64 46 6c 61 67 73 49  emitSharedFlagsI
12500 66 4e 6f 6e 65 29 5d 20 7c 7c 20 5c 0d 0a 20 20  fNone)] || \..  
12510 20 20 20 20 20 20 20 20 20 20 20 20 20 21 5b 68               ![h
12520 61 73 4e 6f 46 6c 61 67 73 20 73 68 61 72 65 64  asNoFlags shared
12530 46 6c 61 67 73 20 74 72 75 65 5d 29 7d 20 74 68  Flags true])} th
12540 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
12550 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
12560 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
12570 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
12580 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 73 68 61         "---- sha
12590 72 65 64 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66  red connection f
125a0 6c 61 67 73 20 66 6f 72 20 22 20 24 64 61 74 61  lags for " $data
125b0 62 61 73 65 20 5c 0d 0a 20 20 20 20 20 20 20 20  base \..        
125c0 20 20 20 20 20 20 20 20 22 20 61 72 65 3a 20 22          " are: "
125d0 20 5b 65 78 70 72 20 7b 21 5b 68 61 73 4e 6f 46   [expr {![hasNoF
125e0 6c 61 67 73 20 73 68 61 72 65 64 46 6c 61 67 73  lags sharedFlags
125f0 20 74 72 75 65 5d 20 3f 20 5c 0d 0a 20 20 20 20   true] ? \..    
12600 20 20 20 20 20 20 20 20 20 20 20 20 5b 61 70 70              [app
12610 65 6e 64 41 72 67 73 20 5c 22 20 24 73 68 61 72  endArgs \" $shar
12620 65 64 46 6c 61 67 73 20 5c 22 5d 20 3a 20 22 3c  edFlags \"] : "<
12630 6e 6f 6e 65 3e 22 7d 5d 20 5c 6e 5d 0d 0a 20 20  none>"}] \n]..  
12640 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
12650 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
12660 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66         if {![inf
12670 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 65 6d  o exists ::no(em
12680 69 74 53 68 61 72 65 64 46 6c 61 67 73 29 5d 20  itSharedFlags)] 
12690 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  && \..          
126a0 20 20 20 20 21 5b 69 6e 66 6f 20 65 78 69 73 74      ![info exist
126b0 73 20 3a 3a 6e 6f 28 65 6d 69 74 53 68 61 72 65  s ::no(emitShare
126c0 64 46 6c 61 67 73 49 66 55 6e 61 76 61 69 6c 61  dFlagsIfUnavaila
126d0 62 6c 65 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  ble)]} then {.. 
126e0 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
126f0 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
12700 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
12710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12720 22 2d 2d 2d 2d 20 73 68 61 72 65 64 20 63 6f 6e  "---- shared con
12730 6e 65 63 74 69 6f 6e 20 66 6c 61 67 73 20 66 6f  nection flags fo
12740 72 20 22 20 24 64 61 74 61 62 61 73 65 20 5c 0d  r " $database \.
12750 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
12760 20 22 20 61 72 65 3a 20 3c 75 6e 61 76 61 69 6c   " are: <unavail
12770 61 62 6c 65 3e 5c 6e 22 5d 0d 0a 20 20 20 20 20  able>\n"]..     
12780 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
12790 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  }..      }....  
127a0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
127b0 4f 54 45 3a 20 53 68 6f 77 20 28 61 6e 64 20 6c  OTE: Show (and l
127c0 6f 67 29 20 74 68 65 20 64 65 74 65 63 74 65 64  og) the detected
127d0 20 67 6c 6f 62 61 6c 20 63 6f 6e 6e 65 63 74 69   global connecti
127e0 6f 6e 20 66 6c 61 67 73 2c 20 69 66 20 61 6e 79  on flags, if any
127f0 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
12800 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74    if {!$quiet} t
12810 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 69  hen {..        i
12820 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73  f {![info exists
12830 20 3a 3a 6e 6f 28 65 6d 69 74 47 6c 6f 62 61 6c   ::no(emitGlobal
12840 46 6c 61 67 73 29 5d 20 26 26 20 5c 0d 0a 20 20  Flags)] && \..  
12850 20 20 20 20 20 20 20 20 20 20 28 21 5b 69 6e 66            (![inf
12860 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 65 6d  o exists ::no(em
12870 69 74 47 6c 6f 62 61 6c 46 6c 61 67 73 49 66 4e  itGlobalFlagsIfN
12880 6f 6e 65 29 5d 20 7c 7c 20 5c 0d 0a 20 20 20 20  one)] || \..    
12890 20 20 20 20 20 20 20 20 20 21 5b 68 61 73 4e 6f           ![hasNo
128a0 46 6c 61 67 73 20 3a 3a 63 6f 6e 6e 65 63 74 69  Flags ::connecti
128b0 6f 6e 5f 66 6c 61 67 73 20 66 61 6c 73 65 5d 29  on_flags false])
128c0 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
128d0 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
128e0 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e  t_channel [appen
128f0 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
12900 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 67 6c 6f         "---- glo
12910 62 61 6c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66  bal connection f
12920 6c 61 67 73 20 61 72 65 3a 20 22 20 5c 0d 0a 20  lags are: " \.. 
12930 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 65 78               [ex
12940 70 72 20 7b 21 5b 68 61 73 4e 6f 46 6c 61 67 73  pr {![hasNoFlags
12950 20 3a 3a 63 6f 6e 6e 65 63 74 69 6f 6e 5f 66 6c   ::connection_fl
12960 61 67 73 20 66 61 6c 73 65 5d 20 3f 20 5c 0d 0a  ags false] ? \..
12970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 61                [a
12980 70 70 65 6e 64 41 72 67 73 20 5c 22 20 24 3a 3a  ppendArgs \" $::
12990 63 6f 6e 6e 65 63 74 69 6f 6e 5f 66 6c 61 67 73  connection_flags
129a0 20 5c 22 5d 20 3a 20 22 3c 6e 6f 6e 65 3e 22 7d   \"] : "<none>"}
129b0 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 7d  ] \n]..        }
129c0 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
129d0 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
129e0 54 45 3a 20 49 66 20 74 68 65 72 65 20 61 72 65  TE: If there are
129f0 20 61 6e 79 20 67 6c 6f 62 61 6c 20 28 70 65 72   any global (per
12a00 20 74 65 73 74 20 72 75 6e 29 20 63 6f 6e 6e 65   test run) conne
12a10 63 74 69 6f 6e 20 66 6c 61 67 73 20 63 75 72 72  ction flags curr
12a20 65 6e 74 6c 79 0d 0a 20 20 20 20 20 20 23 20 20  ently..      #  
12a30 20 20 20 20 20 73 65 74 2c 20 75 73 65 20 74 68       set, use th
12a40 65 6d 20 6e 6f 77 20 28 69 2e 65 2e 20 62 79 20  em now (i.e. by 
12a50 63 6f 6d 62 69 6e 69 6e 67 20 74 68 65 6d 20 77  combining them w
12a60 69 74 68 20 74 68 65 20 6f 6e 65 73 20 66 6f 72  ith the ones for
12a70 20 74 68 69 73 0d 0a 20 20 20 20 20 20 23 20 20   this..      #  
12a80 20 20 20 20 20 63 6f 6e 6e 65 63 74 69 6f 6e 29       connection)
12a90 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
12aa0 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73    if {[info exis
12ab0 74 73 20 3a 3a 63 6f 6e 6e 65 63 74 69 6f 6e 5f  ts ::connection_
12ac0 66 6c 61 67 73 5d 7d 20 74 68 65 6e 20 7b 0d 0a  flags]} then {..
12ad0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
12ae0 20 20 20 23 20 4e 4f 54 45 3a 20 43 6f 6d 62 69     # NOTE: Combi
12af0 6e 65 20 61 6e 64 2f 6f 72 20 72 65 70 6c 61 63  ne and/or replac
12b00 65 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  e the connection
12b10 20 66 6c 61 67 73 20 61 6e 64 20 74 68 65 6e 20   flags and then 
12b20 73 68 6f 77 20 74 68 65 0d 0a 20 20 20 20 20 20  show the..      
12b30 20 20 23 20 20 20 20 20 20 20 6e 65 77 20 76 61    #       new va
12b40 6c 75 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  lue...        #.
12b50 0a 20 20 20 20 20 20 20 20 73 65 74 20 66 6c 61  .        set fla
12b60 67 73 20 5b 63 6f 6d 62 69 6e 65 46 6c 61 67 73  gs [combineFlags
12b70 20 24 66 6c 61 67 73 20 24 3a 3a 63 6f 6e 6e 65   $flags $::conne
12b80 63 74 69 6f 6e 5f 66 6c 61 67 73 5d 0d 0a 0d 0a  ction_flags]....
12b90 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
12ba0 20 20 20 23 20 4e 4f 54 45 3a 20 53 68 6f 77 20     # NOTE: Show 
12bb0 28 61 6e 64 20 6c 6f 67 29 20 74 68 65 20 6e 65  (and log) the ne
12bc0 77 20 65 66 66 65 63 74 69 76 65 20 63 6f 6e 6e  w effective conn
12bd0 65 63 74 69 6f 6e 20 66 6c 61 67 73 2e 0d 0a 20  ection flags... 
12be0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
12bf0 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74    if {!$quiet} t
12c00 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
12c10 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73   if {![info exis
12c20 74 73 20 3a 3a 6e 6f 28 65 6d 69 74 43 6f 6d 62  ts ::no(emitComb
12c30 69 6e 65 64 46 6c 61 67 73 29 5d 20 26 26 20 5c  inedFlags)] && \
12c40 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
12c50 28 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a  (![info exists :
12c60 3a 6e 6f 28 65 6d 69 74 43 6f 6d 62 69 6e 65 64  :no(emitCombined
12c70 46 6c 61 67 73 49 66 4e 6f 6e 65 29 5d 20 7c 7c  FlagsIfNone)] ||
12c80 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
12c90 20 20 20 21 5b 68 61 73 4e 6f 46 6c 61 67 73 20     ![hasNoFlags 
12ca0 66 6c 61 67 73 20 66 61 6c 73 65 5d 29 7d 20 74  flags false])} t
12cb0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
12cc0 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
12cd0 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  _channel [append
12ce0 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
12cf0 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 6f          "---- co
12d00 6d 62 69 6e 65 64 20 63 6f 6e 6e 65 63 74 69 6f  mbined connectio
12d10 6e 20 66 6c 61 67 73 20 66 6f 72 20 22 20 24 64  n flags for " $d
12d20 61 74 61 62 61 73 65 20 5c 0d 0a 20 20 20 20 20  atabase \..     
12d30 20 20 20 20 20 20 20 20 20 20 20 22 20 61 72 65             " are
12d40 3a 20 22 20 5b 65 78 70 72 20 7b 21 5b 68 61 73  : " [expr {![has
12d50 4e 6f 46 6c 61 67 73 20 66 6c 61 67 73 20 66 61  NoFlags flags fa
12d60 6c 73 65 5d 20 3f 20 5c 0d 0a 20 20 20 20 20 20  lse] ? \..      
12d70 20 20 20 20 20 20 20 20 20 20 5b 61 70 70 65 6e            [appen
12d80 64 41 72 67 73 20 5c 22 20 24 66 6c 61 67 73 20  dArgs \" $flags 
12d90 5c 22 5d 20 3a 20 22 3c 6e 6f 6e 65 3e 22 7d 5d  \"] : "<none>"}]
12da0 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20   \n]..          
12db0 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  }..        }..  
12dc0 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 72      }....      r
12dd0 65 74 75 72 6e 20 24 66 6c 61 67 73 0d 0a 20 20  eturn $flags..  
12de0 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
12df0 20 67 65 74 46 6c 61 67 73 50 72 6f 70 65 72 74   getFlagsPropert
12e00 79 20 7b 20 7b 66 6c 61 67 73 20 22 22 7d 20 7b  y { {flags ""} {
12e10 71 75 69 65 74 20 66 61 6c 73 65 7d 20 7d 20 7b  quiet false} } {
12e20 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
12e30 20 23 20 4e 4f 54 45 3a 20 44 65 74 65 72 6d 69   # NOTE: Determi
12e40 6e 65 20 77 68 61 74 20 74 68 65 20 63 6f 6d 62  ne what the comb
12e50 69 6e 65 64 20 28 67 6c 6f 62 61 6c 20 61 6e 64  ined (global and
12e60 20 6c 6f 63 61 6c 29 20 63 6f 6e 6e 65 63 74 69   local) connecti
12e70 6f 6e 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  on..      #     
12e80 20 20 66 6c 61 67 73 20 73 68 6f 75 6c 64 20 62    flags should b
12e90 65 2c 20 70 6f 73 73 69 62 6c 79 20 71 75 69 65  e, possibly quie
12ea0 74 6c 79 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  tly...      #.. 
12eb0 20 20 20 20 20 73 65 74 20 66 6c 61 67 73 20 5b       set flags [
12ec0 67 65 74 43 6f 6e 6e 65 63 74 69 6f 6e 46 6c 61  getConnectionFla
12ed0 67 73 20 22 22 20 24 66 6c 61 67 73 20 24 71 75  gs "" $flags $qu
12ee0 69 65 74 5d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d  iet]....      #.
12ef0 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49  .      # NOTE: I
12f00 66 20 6e 6f 20 67 6c 6f 62 61 6c 20 6f 72 20 6c  f no global or l
12f10 6f 63 61 6c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  ocal connection 
12f20 66 6c 61 67 73 20 77 65 72 65 20 73 70 65 63 69  flags were speci
12f30 66 69 65 64 2c 20 74 68 65 0d 0a 20 20 20 20 20  fied, the..     
12f40 20 23 20 20 20 20 20 20 20 64 65 66 61 75 6c 74   #       default
12f50 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 6c 61 67   connection flag
12f60 73 20 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64  s should be used
12f70 3b 20 74 68 65 72 65 66 6f 72 65 2c 20 72 65 74  ; therefore, ret
12f80 75 72 6e 0d 0a 20 20 20 20 20 20 23 20 20 20 20  urn..      #    
12f90 20 20 20 61 6e 20 65 6d 70 74 79 20 73 74 72 69     an empty stri
12fa0 6e 67 20 69 6e 20 74 68 61 74 20 63 61 73 65 2e  ng in that case.
12fb0 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
12fc0 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e   if {[string len
12fd0 67 74 68 20 24 66 6c 61 67 73 5d 20 3d 3d 20 30  gth $flags] == 0
12fe0 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
12ff0 20 20 72 65 74 75 72 6e 20 22 22 0d 0a 20 20 20    return ""..   
13000 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d     }....      #.
13010 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49  .      # NOTE: I
13020 6e 20 6f 72 64 65 72 20 74 6f 20 63 68 65 63 6b  n order to check
13030 20 69 66 20 74 68 65 20 64 65 66 61 75 6c 74 20   if the default 
13040 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 6c 61 67 73  connection flags
13050 20 61 72 65 20 62 65 69 6e 67 20 75 73 65 64 0d   are being used.
13060 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 69  .      #       i
13070 74 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 74  t is necessary t
13080 6f 20 61 74 74 65 6d 70 74 20 61 20 63 6f 6e 76  o attempt a conv
13090 65 72 73 69 6f 6e 20 74 6f 20 74 68 65 20 61 63  ersion to the ac
130a0 74 75 61 6c 20 65 6e 75 6d 65 72 61 74 65 64 0d  tual enumerated.
130b0 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74  .      #       t
130c0 79 70 65 2e 20 20 46 61 69 6c 69 6e 67 20 74 68  ype.  Failing th
130d0 61 74 2c 20 74 68 65 20 63 68 65 63 6b 20 61 67  at, the check ag
130e0 61 69 6e 73 74 20 74 68 65 20 64 65 66 61 75 6c  ainst the defaul
130f0 74 20 76 61 6c 75 65 20 77 69 6c 6c 20 62 65 0d  t value will be.
13100 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 73  .      #       s
13110 6b 69 70 70 65 64 2e 0d 0a 20 20 20 20 20 20 23  kipped...      #
13120 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74  ..      if {[cat
13130 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 65  ch {..        se
13140 74 20 65 72 72 6f 72 20 6e 75 6c 6c 3b 20 23 20  t error null; # 
13150 49 47 4e 4f 52 45 44 0d 0a 0d 0a 20 20 20 20 20  IGNORED....     
13160 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65     object invoke
13170 20 55 74 69 6c 69 74 79 20 54 72 79 50 61 72 73   Utility TryPars
13180 65 46 6c 61 67 73 45 6e 75 6d 20 22 22 20 5c 0d  eFlagsEnum "" \.
13190 0a 20 20 20 20 20 20 20 20 20 20 20 20 53 79 73  .            Sys
131a0 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e  tem.Data.SQLite.
131b0 53 51 4c 69 74 65 43 6f 6e 6e 65 63 74 69 6f 6e  SQLiteConnection
131c0 46 6c 61 67 73 20 22 22 20 24 66 6c 61 67 73 20  Flags "" $flags 
131d0 6e 75 6c 6c 20 74 72 75 65 20 5c 0d 0a 20 20 20  null true \..   
131e0 20 20 20 20 20 20 20 20 20 74 72 75 65 20 65 72           true er
131f0 72 6f 72 0d 0a 20 20 20 20 20 20 7d 20 76 61 6c  ror..      } val
13200 75 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  ue]} then {..   
13210 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
13220 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74 69  # NOTE: Attempti
13230 6e 67 20 74 6f 20 70 61 72 73 65 20 74 68 65 20  ng to parse the 
13240 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 6c 61 67 73  connection flags
13250 20 63 61 75 73 65 64 20 61 20 73 63 72 69 70 74   caused a script
13260 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
13270 20 20 65 72 72 6f 72 2e 20 20 45 6d 69 74 20 61    error.  Emit a
13280 20 77 61 72 6e 69 6e 67 20 74 6f 20 74 68 65 20   warning to the 
13290 74 65 73 74 20 6c 6f 67 20 66 69 6c 65 20 61 6e  test log file an
132a0 64 20 63 6f 6e 74 69 6e 75 65 0d 0a 20 20 20 20  d continue..    
132b0 20 20 20 20 23 20 20 20 20 20 20 20 75 73 69 6e      #       usin
132c0 67 20 61 6e 20 65 6d 74 70 79 20 73 74 72 69 6e  g an emtpy strin
132d0 67 20 69 6e 73 74 65 61 64 2e 0d 0a 20 20 20 20  g instead...    
132e0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 74      #..        t
132f0 6c 6f 67 20 5b 61 70 70 65 6e 64 41 72 67 73 20  log [appendArgs 
13300 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22  \..            "
13310 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61  ==== WARNING: fa
13320 69 6c 65 64 20 74 6f 20 70 61 72 73 65 20 63 6f  iled to parse co
13330 6e 6e 65 63 74 69 6f 6e 20 66 6c 61 67 73 2c 20  nnection flags, 
13340 65 72 72 6f 72 3a 20 22 20 5c 0d 0a 20 20 20 20  error: " \..    
13350 20 20 20 20 20 20 20 20 5c 6e 5c 74 20 24 76 61          \n\t $va
13360 6c 75 65 20 5c 6e 5d 0d 0a 0d 0a 20 20 20 20 20  lue \n]....     
13370 20 20 20 73 65 74 20 76 61 6c 75 65 20 22 22 0d     set value "".
13380 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
13390 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
133a0 45 3a 20 49 66 20 74 68 65 20 63 6f 6d 62 69 6e  E: If the combin
133b0 65 64 20 66 6c 61 67 73 20 73 74 72 69 6e 67 20  ed flags string 
133c0 63 6f 75 6c 64 20 6e 6f 74 20 61 63 74 75 61 6c  could not actual
133d0 6c 79 20 62 65 20 63 6f 6e 76 65 72 74 65 64 0d  ly be converted.
133e0 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74  .      #       t
133f0 6f 20 74 68 65 20 65 6e 75 6d 65 72 61 74 65 64  o the enumerated
13400 20 74 79 70 65 20 69 74 20 69 73 20 74 68 65 20   type it is the 
13410 64 65 66 61 75 6c 74 20 76 61 6c 75 65 2c 20 74  default value, t
13420 68 65 6e 20 6a 75 73 74 20 75 73 65 0d 0a 20 20  hen just use..  
13430 20 20 20 20 23 20 20 20 20 20 20 20 69 74 20 76      #       it v
13440 65 72 62 61 74 69 6d 3b 20 6f 74 68 65 72 77 69  erbatim; otherwi
13450 73 65 2c 20 6a 75 73 74 20 72 65 74 75 72 6e 20  se, just return 
13460 61 6e 20 65 6d 70 74 79 20 73 74 72 69 6e 67 2e  an empty string.
13470 20 20 49 6e 20 74 68 61 74 0d 0a 20 20 20 20 20    In that..     
13480 20 23 20 20 20 20 20 20 20 63 61 73 65 2c 20 74   #       case, t
13490 68 65 20 64 65 66 61 75 6c 74 20 63 6f 6e 6e 65  he default conne
134a0 63 74 69 6f 6e 20 66 6c 61 67 73 20 77 69 6c 6c  ction flags will
134b0 20 62 65 20 75 73 65 64 2e 0d 0a 20 20 20 20 20   be used...     
134c0 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 73   #..      if {[s
134d0 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 76 61  tring length $va
134e0 6c 75 65 5d 20 3d 3d 20 30 20 7c 7c 20 24 76 61  lue] == 0 || $va
134f0 6c 75 65 20 6e 65 20 22 44 65 66 61 75 6c 74 22  lue ne "Default"
13500 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
13510 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 57    #..        # W
13520 41 52 4e 49 4e 47 3a 20 54 68 69 73 20 72 65 74  ARNING: This ret
13530 75 72 6e 73 20 74 68 65 20 73 74 72 69 6e 67 20  urns the string 
13540 76 61 6c 75 65 20 6f 66 20 74 68 65 20 63 6f 6d  value of the com
13550 62 69 6e 65 64 20 66 6c 61 67 73 2c 20 6e 6f 74  bined flags, not
13560 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
13570 20 20 20 20 20 74 68 65 20 65 6e 75 6d 65 72 61       the enumera
13580 74 65 64 20 76 61 6c 75 65 2e 20 20 54 68 69 73  ted value.  This
13590 20 69 73 20 62 79 20 64 65 73 69 67 6e 20 61 6e   is by design an
135a0 64 20 73 68 6f 75 6c 64 20 6e 6f 74 0d 0a 20 20  d should not..  
135b0 20 20 20 20 20 20 23 20 20 20 20 20 20 20 20 20        #         
135c0 20 62 65 20 63 68 61 6e 67 65 64 20 77 69 74 68   be changed with
135d0 6f 75 74 20 63 61 72 65 66 75 6c 20 63 6f 6e 73  out careful cons
135e0 69 64 65 72 61 74 69 6f 6e 20 28 65 2e 67 2e 20  ideration (e.g. 
135f0 69 74 20 77 6f 75 6c 64 0d 0a 20 20 20 20 20 20  it would..      
13600 20 20 23 20 20 20 20 20 20 20 20 20 20 70 72 65    #          pre
13610 76 65 6e 74 20 74 68 65 20 53 51 4c 69 74 65 43  vent the SQLiteC
13620 6f 6e 6e 65 63 74 69 6f 6e 20 63 6c 61 73 73 20  onnection class 
13630 66 72 6f 6d 20 61 6c 6c 6f 77 69 6e 67 20 69 6e  from allowing in
13640 76 61 6c 69 64 0d 0a 20 20 20 20 20 20 20 20 23  valid..        #
13650 20 20 20 20 20 20 20 20 20 20 5b 22 6d 61 67 69            ["magi
13660 63 61 6c 22 5d 20 6d 65 74 61 2d 66 6c 61 67 73  cal"] meta-flags
13670 29 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  )...        #.. 
13680 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b 61         return [a
13690 70 70 65 6e 64 41 72 67 73 20 22 46 6c 61 67 73  ppendArgs "Flags
136a0 3d 22 20 24 66 6c 61 67 73 20 5c 3b 5d 0d 0a 20  =" $flags \;].. 
136b0 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
136c0 72 65 74 75 72 6e 20 22 22 0d 0a 20 20 20 20 7d  return ""..    }
136d0 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 65 6e  .....    proc en
136e0 61 62 6c 65 53 68 61 72 65 64 43 61 63 68 65 20  ableSharedCache 
136f0 7b 20 63 68 61 6e 6e 65 6c 20 65 6e 61 62 6c 65  { channel enable
13700 20 7b 71 75 69 65 74 20 66 61 6c 73 65 7d 20 7d   {quiet false} }
13710 20 7b 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 63   {..      if {[c
13720 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20  atch {..        
13730 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66  object invoke -f
13740 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20  lags +NonPublic 
13750 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 53  \..            S
13760 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
13770 65 2e 55 6e 73 61 66 65 4e 61 74 69 76 65 4d 65  e.UnsafeNativeMe
13780 74 68 6f 64 73 20 5c 0d 0a 20 20 20 20 20 20 20  thods \..       
13790 20 20 20 20 20 73 71 6c 69 74 65 33 5f 65 6e 61       sqlite3_ena
137a0 62 6c 65 5f 73 68 61 72 65 64 5f 63 61 63 68 65  ble_shared_cache
137b0 20 5b 65 78 70 72 20 69 6e 74 28 24 65 6e 61 62   [expr int($enab
137c0 6c 65 29 5d 0d 0a 20 20 20 20 20 20 7d 20 72 65  le)]..      } re
137d0 73 75 6c 74 5d 20 3d 3d 20 30 7d 20 74 68 65 6e  sult] == 0} then
137e0 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b   {..        if {
137f0 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d  !$quiet} then {.
13800 0a 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73  .          tputs
13810 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e   $channel [appen
13820 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
13830 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 61 6c         "---- cal
13840 6c 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65  l sqlite3_enable
13850 5f 73 68 61 72 65 64 5f 63 61 63 68 65 28 22 20  _shared_cache(" 
13860 24 65 6e 61 62 6c 65 20 5c 0d 0a 20 20 20 20 20  $enable \..     
13870 20 20 20 20 20 20 20 20 20 22 29 2e 2e 2e 20 6f           ")... o
13880 6b 3a 20 22 20 24 72 65 73 75 6c 74 20 5c 6e 5d  k: " $result \n]
13890 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20  ..        }..   
138a0 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
138b0 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74       if {!$quiet
138c0 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
138d0 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
138e0 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
138f0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
13900 22 2d 2d 2d 2d 20 63 61 6c 6c 20 73 71 6c 69 74  "---- call sqlit
13910 65 33 5f 65 6e 61 62 6c 65 5f 73 68 61 72 65 64  e3_enable_shared
13920 5f 63 61 63 68 65 28 22 20 24 65 6e 61 62 6c 65  _cache(" $enable
13930 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
13940 20 20 22 29 2e 2e 2e 20 65 72 72 6f 72 3a 20 22    ")... error: "
13950 20 5c 6e 5c 74 20 24 72 65 73 75 6c 74 20 5c 6e   \n\t $result \n
13960 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  ]..        }..  
13970 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d      }..    }....
13980 0a 20 20 20 20 70 72 6f 63 20 73 65 74 75 70 44  .    proc setupD
13990 62 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  b {..           
139a0 20 66 69 6c 65 4e 61 6d 65 20 7b 6d 6f 64 65 20   fileName {mode 
139b0 22 22 7d 20 7b 64 61 74 65 54 69 6d 65 46 6f 72  ""} {dateTimeFor
139c0 6d 61 74 20 22 22 7d 20 7b 64 61 74 65 54 69 6d  mat ""} {dateTim
139d0 65 4b 69 6e 64 20 22 22 7d 20 7b 66 6c 61 67 73  eKind ""} {flags
139e0 20 22 22 7d 0d 0a 20 20 20 20 20 20 20 20 20 20   ""}..          
139f0 20 20 7b 65 78 74 72 61 20 22 22 7d 20 7b 71 75    {extra ""} {qu
13a00 61 6c 69 66 79 20 74 72 75 65 7d 20 7b 64 65 6c  alify true} {del
13a10 65 74 65 20 74 72 75 65 7d 20 7b 75 72 69 20 66  ete true} {uri f
13a20 61 6c 73 65 7d 0d 0a 20 20 20 20 20 20 20 20 20  alse}..         
13a30 20 20 20 7b 74 65 6d 70 6f 72 61 72 79 20 74 72     {temporary tr
13a40 75 65 7d 20 7b 76 61 72 4e 61 6d 65 20 64 62 7d  ue} {varName db}
13a50 20 7b 71 75 69 65 74 20 66 61 6c 73 65 7d 20 7d   {quiet false} }
13a60 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20   {..      #..   
13a70 20 20 20 23 20 4e 4f 54 45 3a 20 46 69 72 73 74     # NOTE: First
13a80 2c 20 73 65 65 20 69 66 20 6f 75 72 20 63 61 6c  , see if our cal
13a90 6c 65 72 20 68 61 73 20 72 65 71 75 65 73 74 65  ler has requeste
13aa0 64 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64  d an in-memory d
13ab0 61 74 61 62 61 73 65 2e 0d 0a 20 20 20 20 20 20  atabase...      
13ac0 23 0d 0a 20 20 20 20 20 20 73 65 74 20 69 73 4d  #..      set isM
13ad0 65 6d 6f 72 79 20 5b 69 73 4d 65 6d 6f 72 79 44  emory [isMemoryD
13ae0 62 20 24 66 69 6c 65 4e 61 6d 65 5d 0d 0a 0d 0a  b $fileName]....
13af0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
13b00 20 4e 4f 54 45 3a 20 46 6f 72 20 6e 6f 77 2c 20   NOTE: For now, 
13b10 61 6c 6c 20 74 65 73 74 20 64 61 74 61 62 61 73  all test databas
13b20 65 73 20 75 73 65 64 20 62 79 20 74 68 65 20 74  es used by the t
13b30 65 73 74 20 73 75 69 74 65 20 61 72 65 20 70 6c  est suite are pl
13b40 61 63 65 64 0d 0a 20 20 20 20 20 20 23 20 20 20  aced..      #   
13b50 20 20 20 20 69 6e 74 6f 20 74 68 65 20 64 61 74      into the dat
13b60 61 62 61 73 65 20 64 69 72 65 63 74 6f 72 79 2e  abase directory.
13b70 20 20 45 61 63 68 20 64 61 74 61 62 61 73 65 20    Each database 
13b80 61 6e 64 20 72 65 6c 61 74 65 64 20 66 69 6c 65  and related file
13b90 73 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  s..      #      
13ba0 20 75 73 65 64 20 62 79 20 61 20 74 65 73 74 20   used by a test 
13bb0 73 68 6f 75 6c 64 20 62 65 20 63 6c 65 61 6e 65  should be cleane
13bc0 64 20 75 70 20 62 79 20 74 68 61 74 20 74 65 73  d up by that tes
13bd0 74 20 75 73 69 6e 67 20 74 68 65 0d 0a 20 20 20  t using the..   
13be0 20 20 20 23 20 20 20 20 20 20 20 22 63 6c 65 61     #       "clea
13bf0 6e 75 70 44 62 22 20 70 72 6f 63 65 64 75 72 65  nupDb" procedure
13c00 2c 20 62 65 6c 6f 77 2e 0d 0a 20 20 20 20 20 20  , below...      
13c10 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 21 24 69  #..      if {!$i
13c20 73 4d 65 6d 6f 72 79 20 26 26 20 24 71 75 61 6c  sMemory && $qual
13c30 69 66 79 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  ify} then {..   
13c40 20 20 20 20 20 73 65 74 20 66 69 6c 65 4e 61 6d       set fileNam
13c50 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5b 67 65  e [file join [ge
13c60 74 44 61 74 61 62 61 73 65 44 69 72 65 63 74 6f  tDatabaseDirecto
13c70 72 79 5d 20 5b 66 69 6c 65 20 74 61 69 6c 20 24  ry] [file tail $
13c80 66 69 6c 65 4e 61 6d 65 5d 5d 0d 0a 20 20 20 20  fileName]]..    
13c90 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a    }....      #..
13ca0 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 42 79        # NOTE: By
13cb0 20 64 65 66 61 75 6c 74 2c 20 64 65 6c 65 74 65   default, delete
13cc0 20 61 6e 79 20 70 72 65 2d 65 78 69 73 74 69 6e   any pre-existin
13cd0 67 20 64 61 74 61 62 61 73 65 20 77 69 74 68 20  g database with 
13ce0 74 68 65 20 73 61 6d 65 20 66 69 6c 65 0d 0a 20  the same file.. 
13cf0 20 20 20 20 20 23 20 20 20 20 20 20 20 6e 61 6d       #       nam
13d00 65 20 69 66 20 69 74 20 63 75 72 72 65 6e 74 6c  e if it currentl
13d10 79 20 65 78 69 73 74 73 2e 0d 0a 20 20 20 20 20  y exists...     
13d20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 21 24   #..      if {!$
13d30 69 73 4d 65 6d 6f 72 79 20 26 26 20 24 64 65 6c  isMemory && $del
13d40 65 74 65 20 26 26 20 5b 66 69 6c 65 20 65 78 69  ete && [file exi
13d50 73 74 73 20 24 66 69 6c 65 4e 61 6d 65 5d 7d 20  sts $fileName]} 
13d60 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
13d70 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
13d80 45 3a 20 41 74 74 65 6d 70 74 20 74 6f 20 64 65  E: Attempt to de
13d90 6c 65 74 65 20 61 6e 79 20 70 72 65 2d 65 78 69  lete any pre-exi
13da0 73 74 69 6e 67 20 64 61 74 61 62 61 73 65 20 77  sting database w
13db0 69 74 68 20 74 68 65 20 73 61 6d 65 20 66 69 6c  ith the same fil
13dc0 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  e..        #    
13dd0 20 20 20 6e 61 6d 65 2e 0d 0a 20 20 20 20 20 20     name...      
13de0 20 20 23 0d 0a 20 20 20 20 20 20 20 20 69 66 20    #..        if 
13df0 7b 5b 63 61 74 63 68 20 7b 66 69 6c 65 20 64 65  {[catch {file de
13e00 6c 65 74 65 20 24 66 69 6c 65 4e 61 6d 65 7d 20  lete $fileName} 
13e10 65 72 72 6f 72 5d 7d 20 74 68 65 6e 20 7b 0d 0a  error]} then {..
13e20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
13e30 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 57         # NOTE: W
13e40 65 20 73 6f 6d 65 68 6f 77 20 66 61 69 6c 65 64  e somehow failed
13e50 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20 66   to delete the f
13e60 69 6c 65 2c 20 72 65 70 6f 72 74 20 77 68 79 2e  ile, report why.
13e70 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20  ..          #.. 
13e80 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71           if {!$q
13e90 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  uiet} then {..  
13ea0 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
13eb0 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
13ec0 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
13ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
13ee0 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61  ==== WARNING: fa
13ef0 69 6c 65 64 20 74 6f 20 64 65 6c 65 74 65 20 64  iled to delete d
13f00 61 74 61 62 61 73 65 20 66 69 6c 65 20 5c 22 22  atabase file \""
13f10 20 24 66 69 6c 65 4e 61 6d 65 20 5c 0d 0a 20 20   $fileName \..  
13f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 5c                "\
13f30 22 20 64 75 72 69 6e 67 20 73 65 74 75 70 2c 20  " during setup, 
13f40 65 72 72 6f 72 3a 20 22 20 5c 6e 5c 74 20 24 65  error: " \n\t $e
13f50 72 72 6f 72 20 5c 6e 5d 0d 0a 20 20 20 20 20 20  rror \n]..      
13f60 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d      }..        }
13f70 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
13f80 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
13f90 54 45 3a 20 52 65 66 65 72 20 74 6f 20 74 68 65  TE: Refer to the
13fa0 20 73 70 65 63 69 66 69 65 64 20 76 61 72 69 61   specified varia
13fb0 62 6c 65 20 28 65 2e 67 2e 20 22 64 62 22 29 20  ble (e.g. "db") 
13fc0 69 6e 20 74 68 65 20 63 6f 6e 74 65 78 74 20 6f  in the context o
13fd0 66 20 6f 75 72 0d 0a 20 20 20 20 20 20 23 20 20  f our..      #  
13fe0 20 20 20 20 20 63 61 6c 6c 65 72 2e 20 20 54 68       caller.  Th
13ff0 65 20 68 61 6e 64 6c 65 20 74 6f 20 74 68 65 20  e handle to the 
14000 6f 70 65 6e 65 64 20 64 61 74 61 62 61 73 65 20  opened database 
14010 77 69 6c 6c 20 62 65 20 73 74 6f 72 65 64 20 74  will be stored t
14020 68 65 72 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  here...      #..
14030 20 20 20 20 20 20 75 70 76 61 72 20 31 20 24 76        upvar 1 $v
14040 61 72 4e 61 6d 65 20 64 62 0d 0a 0d 0a 20 20 20  arName db....   
14050 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
14060 54 45 3a 20 53 74 61 72 74 20 62 75 69 6c 64 69  TE: Start buildi
14070 6e 67 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  ng the connectio
14080 6e 20 73 74 72 69 6e 67 2e 20 20 54 68 65 20 6f  n string.  The o
14090 6e 6c 79 20 72 65 71 75 69 72 65 64 20 70 6f 72  nly required por
140a0 74 69 6f 6e 0d 0a 20 20 20 20 20 20 23 20 20 20  tion..      #   
140b0 20 20 20 20 6f 66 20 74 68 65 20 63 6f 6e 6e 65      of the conne
140c0 63 74 69 6f 6e 20 73 74 72 69 6e 67 20 69 73 20  ction string is 
140d0 74 68 65 20 64 61 74 61 20 73 6f 75 72 63 65 2c  the data source,
140e0 20 77 68 69 63 68 20 63 6f 6e 74 61 69 6e 73 20   which contains 
140f0 74 68 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20  the..      #    
14100 20 20 20 64 61 74 61 62 61 73 65 20 66 69 6c 65     database file
14110 20 6e 61 6d 65 20 69 74 73 65 6c 66 2e 20 20 49   name itself.  I
14120 66 20 6f 75 72 20 63 61 6c 6c 65 72 20 77 61 6e  f our caller wan
14130 74 73 20 74 6f 20 75 73 65 20 61 20 55 52 49 20  ts to use a URI 
14140 61 73 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  as..      #     
14150 20 20 74 68 65 20 64 61 74 61 20 73 6f 75 72 63    the data sourc
14160 65 2c 20 75 73 65 20 74 68 65 20 46 75 6c 6c 55  e, use the FullU
14170 72 69 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 74  ri connection st
14180 72 69 6e 67 20 70 72 6f 70 65 72 74 79 20 74 6f  ring property to
14190 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
141a0 70 72 65 76 65 6e 74 20 74 68 65 20 64 61 74 61  prevent the data
141b0 20 73 6f 75 72 63 65 20 73 74 72 69 6e 67 20 66   source string f
141c0 72 6f 6d 20 62 65 69 6e 67 20 6d 61 6e 67 6c 65  rom being mangle
141d0 64 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  d...      #..   
141e0 20 20 20 69 66 20 7b 24 75 72 69 7d 20 74 68 65     if {$uri} the
141f0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 65 74  n {..        set
14200 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 7b 46 75 6c   connection {Ful
14210 6c 55 72 69 3d 24 7b 66 69 6c 65 4e 61 6d 65 7d  lUri=${fileName}
14220 7d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20  }..      } else 
14230 7b 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 63  {..        set c
14240 6f 6e 6e 65 63 74 69 6f 6e 20 7b 44 61 74 61 20  onnection {Data 
14250 53 6f 75 72 63 65 3d 24 7b 66 69 6c 65 4e 61 6d  Source=${fileNam
14260 65 7d 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a  e}}..      }....
14270 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
14280 20 4e 4f 54 45 3a 20 53 69 6e 63 65 20 74 68 69   NOTE: Since thi
14290 73 20 70 72 6f 63 65 64 75 72 65 20 68 61 73 20  s procedure has 
142a0 6e 6f 20 73 70 65 63 69 61 6c 20 6b 6e 6f 77 6c  no special knowl
142b0 65 64 67 65 20 6f 66 20 77 68 61 74 20 74 68 65  edge of what the
142c0 20 64 65 66 61 75 6c 74 0d 0a 20 20 20 20 20 20   default..      
142d0 23 20 20 20 20 20 20 20 73 65 74 74 69 6e 67 20  #       setting 
142e0 69 73 20 66 6f 72 20 74 68 65 20 54 6f 46 75 6c  is for the ToFul
142f0 6c 50 61 74 68 20 63 6f 6e 6e 65 63 74 69 6f 6e  lPath connection
14300 20 73 74 72 69 6e 67 20 70 72 6f 70 65 72 79 2c   string propery,
14310 20 61 6c 77 61 79 73 0d 0a 20 20 20 20 20 20 23   always..      #
14320 20 20 20 20 20 20 20 61 64 64 20 74 68 65 20 76         add the v
14330 61 6c 75 65 20 77 65 20 6b 6e 6f 77 20 61 62 6f  alue we know abo
14340 75 74 20 74 6f 20 74 68 65 20 63 6f 6e 6e 65 63  ut to the connec
14350 74 69 6f 6e 20 73 74 72 69 6e 67 2e 0d 0a 20 20  tion string...  
14360 20 20 20 20 23 0d 0a 20 20 20 20 20 20 61 70 70      #..      app
14370 65 6e 64 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 7b  end connection {
14380 3b 54 6f 46 75 6c 6c 50 61 74 68 3d 24 7b 71 75  ;ToFullPath=${qu
14390 61 6c 69 66 79 7d 7d 0d 0a 0d 0a 20 20 20 20 20  alify}}....     
143a0 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
143b0 3a 20 49 66 20 6f 75 72 20 63 61 6c 6c 65 72 20  : If our caller 
143c0 73 70 65 63 69 66 69 65 64 20 61 20 6a 6f 75 72  specified a jour
143d0 6e 61 6c 20 6d 6f 64 65 2c 20 61 64 64 20 74 68  nal mode, add th
143e0 65 20 6e 65 63 65 73 73 61 72 79 20 70 6f 72 74  e necessary port
143f0 69 6f 6e 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ion..      #    
14400 20 20 20 6f 66 20 74 68 65 20 63 6f 6e 6e 65 63     of the connec
14410 74 69 6f 6e 20 73 74 72 69 6e 67 20 6e 6f 77 2e  tion string now.
14420 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
14430 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e   if {[string len
14440 67 74 68 20 24 6d 6f 64 65 5d 20 3e 20 30 7d 20  gth $mode] > 0} 
14450 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
14460 61 70 70 65 6e 64 20 63 6f 6e 6e 65 63 74 69 6f  append connectio
14470 6e 20 7b 3b 4a 6f 75 72 6e 61 6c 20 4d 6f 64 65  n {;Journal Mode
14480 3d 24 7b 6d 6f 64 65 7d 7d 0d 0a 20 20 20 20 20  =${mode}}..     
14490 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20   }....      #.. 
144a0 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 66 20       # NOTE: If 
144b0 6f 75 72 20 63 61 6c 6c 65 72 20 73 70 65 63 69  our caller speci
144c0 66 69 65 64 20 61 20 44 61 74 65 54 69 6d 65 20  fied a DateTime 
144d0 66 6f 72 6d 61 74 2c 20 61 64 64 20 74 68 65 20  format, add the 
144e0 6e 65 63 65 73 73 61 72 79 0d 0a 20 20 20 20 20  necessary..     
144f0 20 23 20 20 20 20 20 20 20 70 6f 72 74 69 6f 6e   #       portion
14500 20 6f 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69   of the connecti
14510 6f 6e 20 73 74 72 69 6e 67 20 6e 6f 77 2e 0d 0a  on string now...
14520 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69        #..      i
14530 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74  f {[string lengt
14540 68 20 24 64 61 74 65 54 69 6d 65 46 6f 72 6d 61  h $dateTimeForma
14550 74 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  t] > 0} then {..
14560 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 20 63          append c
14570 6f 6e 6e 65 63 74 69 6f 6e 20 7b 3b 44 61 74 65  onnection {;Date
14580 54 69 6d 65 46 6f 72 6d 61 74 3d 24 7b 64 61 74  TimeFormat=${dat
14590 65 54 69 6d 65 46 6f 72 6d 61 74 7d 7d 0d 0a 20  eTimeFormat}}.. 
145a0 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
145b0 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
145c0 20 49 66 20 6f 75 72 20 63 61 6c 6c 65 72 20 73   If our caller s
145d0 70 65 63 69 66 69 65 64 20 61 20 44 61 74 65 54  pecified a DateT
145e0 69 6d 65 4b 69 6e 64 2c 20 61 64 64 20 74 68 65  imeKind, add the
145f0 20 6e 65 63 65 73 73 61 72 79 20 70 6f 72 74 69   necessary porti
14600 6f 6e 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  on..      #     
14610 20 20 6f 66 20 74 68 65 20 63 6f 6e 6e 65 63 74    of the connect
14620 69 6f 6e 20 73 74 72 69 6e 67 20 6e 6f 77 2e 0d  ion string now..
14630 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
14640 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67  if {[string leng
14650 74 68 20 24 64 61 74 65 54 69 6d 65 4b 69 6e 64  th $dateTimeKind
14660 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20  ] > 0} then {.. 
14670 20 20 20 20 20 20 20 61 70 70 65 6e 64 20 63 6f         append co
14680 6e 6e 65 63 74 69 6f 6e 20 7b 3b 44 61 74 65 54  nnection {;DateT
14690 69 6d 65 4b 69 6e 64 3d 24 7b 64 61 74 65 54 69  imeKind=${dateTi
146a0 6d 65 4b 69 6e 64 7d 7d 0d 0a 20 20 20 20 20 20  meKind}}..      
146b0 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  }....      #..  
146c0 20 20 20 20 23 20 4e 4f 54 45 3a 20 46 69 67 75      # NOTE: Figu
146d0 72 65 20 6f 75 74 20 77 68 61 74 20 74 68 65 20  re out what the 
146e0 66 69 6e 61 6c 20 66 6c 61 67 73 20 66 6f 72 20  final flags for 
146f0 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  this connection 
14700 6e 65 65 64 20 74 6f 20 62 65 2e 0d 0a 20 20 20  need to be...   
14710 20 20 20 23 0d 0a 20 20 20 20 20 20 73 65 74 20     #..      set 
14720 66 6c 61 67 73 20 5b 67 65 74 43 6f 6e 6e 65 63  flags [getConnec
14730 74 69 6f 6e 46 6c 61 67 73 20 24 66 69 6c 65 4e  tionFlags $fileN
14740 61 6d 65 20 24 66 6c 61 67 73 20 24 71 75 69 65  ame $flags $quie
14750 74 5d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20  t]....      #.. 
14760 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 66 20       # NOTE: If 
14770 6f 75 72 20 63 61 6c 6c 65 72 20 73 70 65 63 69  our caller speci
14780 66 69 65 64 20 73 6f 6d 65 20 53 51 4c 69 74 65  fied some SQLite
14790 43 6f 6e 6e 65 63 74 69 6f 6e 46 6c 61 67 73 2c  ConnectionFlags,
147a0 20 61 64 64 20 74 68 65 0d 0a 20 20 20 20 20 20   add the..      
147b0 23 20 20 20 20 20 20 20 6e 65 63 65 73 73 61 72  #       necessar
147c0 79 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65  y portion of the
147d0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 74 72 69   connection stri
147e0 6e 67 20 6e 6f 77 2e 0d 0a 20 20 20 20 20 20 23  ng now...      #
147f0 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72  ..      if {[str
14800 69 6e 67 20 6c 65 6e 67 74 68 20 24 66 6c 61 67  ing length $flag
14810 73 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  s] > 0} then {..
14820 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 20 63          append c
14830 6f 6e 6e 65 63 74 69 6f 6e 20 7b 3b 46 6c 61 67  onnection {;Flag
14840 73 3d 24 7b 66 6c 61 67 73 7d 7d 0d 0a 20 20 20  s=${flags}}..   
14850 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d     }....      #.
14860 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49  .      # NOTE: I
14870 66 20 6f 75 72 20 63 61 6c 6c 65 72 20 73 70 65  f our caller spe
14880 63 69 66 69 65 64 20 61 6e 20 65 78 74 72 61 20  cified an extra 
14890 70 61 79 6c 6f 61 64 20 74 6f 20 74 68 65 20 63  payload to the c
148a0 6f 6e 6e 65 63 74 69 6f 6e 0d 0a 20 20 20 20 20  onnection..     
148b0 20 23 20 20 20 20 20 20 20 73 74 72 69 6e 67 2c   #       string,
148c0 20 61 70 70 65 6e 64 20 69 74 20 6e 6f 77 2e 0d   append it now..
148d0 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
148e0 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67  if {[string leng
148f0 74 68 20 24 65 78 74 72 61 5d 20 3e 20 30 7d 20  th $extra] > 0} 
14900 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
14910 61 70 70 65 6e 64 20 63 6f 6e 6e 65 63 74 69 6f  append connectio
14920 6e 20 5c 3b 20 24 65 78 74 72 61 0d 0a 20 20 20  n \; $extra..   
14930 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d     }....      #.
14940 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4f  .      # NOTE: O
14950 70 65 6e 20 74 68 65 20 64 61 74 61 62 61 73 65  pen the database
14960 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6e 6f 77 2c   connection now,
14970 20 70 6c 61 63 69 6e 67 20 74 68 65 20 6f 70 61   placing the opa
14980 71 75 65 20 68 61 6e 64 6c 65 20 76 61 6c 75 65  que handle value
14990 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
149a0 69 6e 74 6f 20 74 68 65 20 76 61 72 69 61 62 6c  into the variabl
149b0 65 20 73 70 65 63 69 66 69 65 64 20 62 79 20 6f  e specified by o
149c0 75 72 20 63 61 6c 6c 65 72 2e 0d 0a 20 20 20 20  ur caller...    
149d0 20 20 23 0d 0a 20 20 20 20 20 20 73 65 74 20 64    #..      set d
149e0 62 20 5b 73 71 6c 20 6f 70 65 6e 20 2d 74 79 70  b [sql open -typ
149f0 65 20 53 51 4c 69 74 65 20 5b 73 75 62 73 74 20  e SQLite [subst 
14a00 24 63 6f 6e 6e 65 63 74 69 6f 6e 5d 5d 0d 0a 0d  $connection]]...
14a10 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
14a20 23 20 4e 4f 54 45 3a 20 43 6f 6e 66 69 67 75 72  # NOTE: Configur
14a30 65 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20  e the temporary 
14a40 64 69 72 65 63 74 6f 72 79 20 66 6f 72 20 74 68  directory for th
14a50 65 20 6e 65 77 6c 79 20 6f 70 65 6e 65 64 20 64  e newly opened d
14a60 61 74 61 62 61 73 65 0d 0a 20 20 20 20 20 20 23  atabase..      #
14a70 20 20 20 20 20 20 20 63 6f 6e 6e 65 63 74 69 6f         connectio
14a80 6e 20 6e 6f 77 20 75 6e 6c 65 73 73 20 6f 75 72  n now unless our
14a90 20 63 61 6c 6c 65 72 20 66 6f 72 62 69 64 73 20   caller forbids 
14aa0 69 74 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  it...      #..  
14ab0 20 20 20 20 69 66 20 7b 24 74 65 6d 70 6f 72 61      if {$tempora
14ac0 72 79 20 26 26 20 21 5b 69 6e 66 6f 20 65 78 69  ry && ![info exi
14ad0 73 74 73 20 3a 3a 6e 6f 28 73 65 74 54 65 6d 70  sts ::no(setTemp
14ae0 6f 72 61 72 79 44 69 72 65 63 74 6f 72 79 29 5d  oraryDirectory)]
14af0 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
14b00 20 20 73 71 6c 20 65 78 65 63 75 74 65 20 24 64    sql execute $d
14b10 62 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  b [appendArgs \.
14b20 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 50 52  .            "PR
14b30 41 47 4d 41 20 74 65 6d 70 5f 73 74 6f 72 65 5f  AGMA temp_store_
14b40 64 69 72 65 63 74 6f 72 79 20 3d 20 5c 22 22 20  directory = \"" 
14b50 5b 67 65 74 54 65 6d 70 6f 72 61 72 79 44 69 72  [getTemporaryDir
14b60 65 63 74 6f 72 79 5d 20 5c 22 5c 3b 5d 0d 0a 20  ectory] \"\;].. 
14b70 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
14b80 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
14b90 20 50 65 72 66 6f 72 6d 20 61 6e 79 20 65 78 74   Perform any ext
14ba0 72 61 20 70 65 72 2d 63 6f 6e 6e 65 63 74 69 6f  ra per-connectio
14bb0 6e 20 73 65 74 75 70 20 66 6f 72 20 74 68 65 20  n setup for the 
14bc0 6e 65 77 6c 79 20 6f 70 65 6e 65 64 0d 0a 20 20  newly opened..  
14bd0 20 20 20 20 23 20 20 20 20 20 20 20 64 61 74 61      #       data
14be0 62 61 73 65 20 6e 6f 77 20 75 6e 6c 65 73 73 20  base now unless 
14bf0 6f 75 72 20 63 61 6c 6c 65 72 20 66 6f 72 62 69  our caller forbi
14c00 64 73 20 69 74 2e 0d 0a 20 20 20 20 20 20 23 0d  ds it...      #.
14c10 0a 20 20 20 20 20 20 73 65 74 20 65 78 65 63 75  .      set execu
14c20 74 65 4f 6e 53 65 74 75 70 20 5b 67 65 74 45 78  teOnSetup [getEx
14c30 65 63 75 74 65 4f 6e 53 65 74 75 70 5d 0d 0a 0d  ecuteOnSetup]...
14c40 0a 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69  .      if {[stri
14c50 6e 67 20 6c 65 6e 67 74 68 20 24 65 78 65 63 75  ng length $execu
14c60 74 65 4f 6e 53 65 74 75 70 5d 20 3e 20 30 20 26  teOnSetup] > 0 &
14c70 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 21  & \..          !
14c80 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e  [info exists ::n
14c90 6f 28 65 78 65 63 75 74 65 4f 6e 53 65 74 75 70  o(executeOnSetup
14ca0 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  )]} then {..    
14cb0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
14cc0 20 4e 4f 54 45 3a 20 54 68 69 73 20 63 6f 6d 6d   NOTE: This comm
14cd0 61 6e 64 20 6d 61 79 20 72 61 69 73 65 20 61 6e  and may raise an
14ce0 20 65 72 72 6f 72 3b 20 69 66 20 73 6f 2c 20 74   error; if so, t
14cf0 68 61 74 20 69 73 20 66 69 6e 65 2c 20 61 73 0d  hat is fine, as.
14d00 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
14d10 20 74 68 65 20 65 6e 63 6c 6f 73 69 6e 67 20 74   the enclosing t
14d20 65 73 74 20 77 69 6c 6c 20 74 68 65 6e 20 66 61  est will then fa
14d30 69 6c 2e 20 20 54 68 65 20 5b 73 75 62 73 74 5d  il.  The [subst]
14d40 20 63 6f 6d 6d 61 6e 64 20 69 73 0d 0a 20 20 20   command is..   
14d50 20 20 20 20 20 23 20 20 20 20 20 20 20 75 73 65       #       use
14d60 64 20 6f 6e 20 74 68 65 20 53 51 4c 20 69 6e 20  d on the SQL in 
14d70 63 61 73 65 20 69 74 20 6e 65 65 64 73 20 74 6f  case it needs to
14d80 20 72 65 66 65 72 20 74 6f 20 73 74 61 74 65 20   refer to state 
14d90 69 6e 20 6f 75 72 0d 0a 20 20 20 20 20 20 20 20  in our..        
14da0 23 20 20 20 20 20 20 20 63 6f 6e 74 65 78 74 2e  #       context.
14db0 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
14dc0 20 20 20 20 20 73 71 6c 20 65 78 65 63 75 74 65       sql execute
14dd0 20 24 64 62 20 5b 73 75 62 73 74 20 24 65 78 65   $db [subst $exe
14de0 63 75 74 65 4f 6e 53 65 74 75 70 5d 0d 0a 20 20  cuteOnSetup]..  
14df0 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23      }....      #
14e00 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
14e10 41 6c 77 61 79 73 20 72 65 74 75 72 6e 20 74 68  Always return th
14e20 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 6e  e connection han
14e30 64 6c 65 20 75 70 6f 6e 20 73 75 63 63 65 73 73  dle upon success
14e40 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
14e50 20 20 72 65 74 75 72 6e 20 24 64 62 0d 0a 20 20    return $db..  
14e60 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
14e70 20 67 65 74 44 62 43 6f 6e 6e 65 63 74 69 6f 6e   getDbConnection
14e80 20 7b 20 7b 76 61 72 4e 61 6d 65 20 64 62 7d 20   { {varName db} 
14e90 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  } {..      #..  
14ea0 20 20 20 20 23 20 4e 4f 54 45 3a 20 52 65 66 65      # NOTE: Refe
14eb0 72 20 74 6f 20 74 68 65 20 73 70 65 63 69 66 69  r to the specifi
14ec0 65 64 20 76 61 72 69 61 62 6c 65 20 28 65 2e 67  ed variable (e.g
14ed0 2e 20 22 64 62 22 29 20 69 6e 20 74 68 65 20 63  . "db") in the c
14ee0 6f 6e 74 65 78 74 20 6f 66 20 6f 75 72 0d 0a 20  ontext of our.. 
14ef0 20 20 20 20 20 23 20 20 20 20 20 20 20 63 61 6c       #       cal
14f00 6c 65 72 2e 20 20 54 68 65 20 68 61 6e 64 6c 65  ler.  The handle
14f10 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
14f20 20 70 72 65 76 69 6f 75 73 6c 79 20 6f 70 65 6e   previously open
14f30 65 64 20 76 69 61 20 74 68 65 0d 0a 20 20 20 20  ed via the..    
14f40 20 20 23 20 20 20 20 20 20 20 5b 73 65 74 75 70    #       [setup
14f50 44 62 5d 20 70 72 6f 63 65 64 75 72 65 20 73 68  Db] procedure sh
14f60 6f 75 6c 64 20 62 65 20 73 74 6f 72 65 64 20 74  ould be stored t
14f70 68 65 72 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  here...      #..
14f80 20 20 20 20 20 20 75 70 76 61 72 20 31 20 24 76        upvar 1 $v
14f90 61 72 4e 61 6d 65 20 64 62 0d 0a 0d 0a 20 20 20  arName db....   
14fa0 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
14fb0 54 45 3a 20 54 68 69 73 20 72 65 74 75 72 6e 73  TE: This returns
14fc0 20 74 68 65 20 41 44 4f 2e 4e 45 54 20 49 44 62   the ADO.NET IDb
14fd0 43 6f 6e 6e 65 63 74 69 6f 6e 20 6f 62 6a 65 63  Connection objec
14fe0 74 20 69 6e 73 74 61 6e 63 65 20 66 6f 72 20 74  t instance for t
14ff0 68 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  he..      #     
15000 20 20 73 70 65 63 69 66 69 65 64 20 64 61 74 61    specified data
15010 62 73 65 20 68 61 6e 64 6c 65 2e 20 20 53 69 6e  bse handle.  Sin
15020 63 65 20 67 65 74 74 69 6e 67 20 74 68 69 73 20  ce getting this 
15030 6f 62 6a 65 63 74 20 72 65 6c 69 65 73 20 75 70  object relies up
15040 6f 6e 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  on..      #     
15050 20 20 45 61 67 6c 65 20 69 6e 74 65 72 6e 61 6c    Eagle internal
15060 73 2c 20 67 72 65 61 74 20 63 61 72 65 20 73 68  s, great care sh
15070 6f 75 6c 64 20 62 65 20 74 61 6b 65 6e 20 74 6f  ould be taken to
15080 20 61 76 6f 69 64 20 64 69 73 70 6f 73 69 6e 67   avoid disposing
15090 20 6f 66 0d 0a 20 20 20 20 20 20 23 20 20 20 20   of..      #    
150a0 20 20 20 74 68 69 73 20 6f 62 6a 65 63 74 20 6f     this object o
150b0 72 20 6f 74 68 65 72 77 69 73 65 20 70 75 74 74  r otherwise putt
150c0 69 6e 67 20 69 74 20 69 6e 74 6f 20 61 6e 20 69  ing it into an i
150d0 6e 76 61 6c 69 64 20 73 74 61 74 65 2e 0d 0a 20  nvalid state... 
150e0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66       #..      if
150f0 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 64   {[info exists d
15100 62 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  b]} then {..    
15110 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b      if {[catch {
15120 0d 0a 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65  ..          obje
15130 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73  ct invoke -flags
15140 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 2d 6f 62 6a   +NonPublic -obj
15150 65 63 74 66 6c 61 67 73 20 2b 4e 6f 44 69 73 70  ectflags +NoDisp
15160 6f 73 65 20 2d 61 6c 69 61 73 20 5c 0d 0a 20 20  ose -alias \..  
15170 20 20 20 20 20 20 20 20 20 20 20 20 49 6e 74 65              Inte
15180 72 70 72 65 74 65 72 2e 47 65 74 41 63 74 69 76  rpreter.GetActiv
15190 65 2e 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 49 74  e.connections It
151a0 65 6d 20 24 64 62 0d 0a 20 20 20 20 20 20 20 20  em $db..        
151b0 7d 20 72 65 73 75 6c 74 5d 20 3d 3d 20 30 7d 20  } result] == 0} 
151c0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
151d0 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23    #..          #
151e0 20 4e 4f 54 45 3a 20 53 75 63 63 65 73 73 2c 20   NOTE: Success, 
151f0 72 65 74 75 72 6e 20 74 68 65 20 6f 70 61 71 75  return the opaqu
15200 65 20 6f 62 6a 65 63 74 20 68 61 6e 64 6c 65 2e  e object handle.
15210 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20  ..          #.. 
15220 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
15230 24 72 65 73 75 6c 74 0d 0a 20 20 20 20 20 20 20  $result..       
15240 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
15250 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
15260 20 20 23 20 4e 4f 54 45 3a 20 46 61 69 6c 75 72    # NOTE: Failur
15270 65 2c 20 72 65 70 6f 72 74 20 77 68 79 2e 0d 0a  e, report why...
15280 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
15290 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
152a0 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70  test_channel [ap
152b0 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
152c0 20 20 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20            "==== 
152d0 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20  WARNING: failed 
152e0 74 6f 20 67 65 74 20 63 6f 6e 6e 65 63 74 69 6f  to get connectio
152f0 6e 20 68 61 6e 64 6c 65 20 66 6f 72 20 64 61 74  n handle for dat
15300 61 62 61 73 65 20 5c 22 22 20 5c 0d 0a 20 20 20  abase \"" \..   
15310 20 20 20 20 20 20 20 20 20 20 20 24 64 62 20 22             $db "
15320 5c 22 2c 20 65 72 72 6f 72 3a 20 22 20 5c 6e 5c  \", error: " \n\
15330 74 20 24 72 65 73 75 6c 74 20 5c 6e 5d 0d 0a 20  t $result \n].. 
15340 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
15350 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  }....      #..  
15360 20 20 20 20 23 20 4e 4f 54 45 3a 20 46 61 69 6c      # NOTE: Fail
15370 75 72 65 2c 20 72 65 74 75 72 6e 20 61 6e 20 6f  ure, return an o
15380 62 76 69 6f 75 73 6c 79 20 69 6e 76 61 6c 69 64  bviously invalid
15390 20 6f 70 61 71 75 65 20 6f 62 6a 65 63 74 20 68   opaque object h
153a0 61 6e 64 6c 65 2e 0d 0a 20 20 20 20 20 20 23 0d  andle...      #.
153b0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 22 22  .      return ""
153c0 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
153d0 70 72 6f 63 20 66 72 65 65 44 62 43 6f 6e 6e 65  proc freeDbConne
153e0 63 74 69 6f 6e 20 7b 20 7b 76 61 72 4e 61 6d 65  ction { {varName
153f0 20 63 6f 6e 6e 65 63 74 69 6f 6e 7d 20 7d 20 7b   connection} } {
15400 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
15410 20 23 20 4e 4f 54 45 3a 20 52 65 66 65 72 20 74   # NOTE: Refer t
15420 6f 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  o the specified 
15430 76 61 72 69 61 62 6c 65 20 28 65 2e 67 2e 20 22  variable (e.g. "
15440 63 6f 6e 6e 65 63 74 69 6f 6e 22 29 20 69 6e 20  connection") in 
15450 74 68 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20  the..      #    
15460 20 20 20 63 6f 6e 74 65 78 74 20 6f 66 20 6f 75     context of ou
15470 72 20 63 61 6c 6c 65 72 2e 20 20 54 68 65 20 6f  r caller.  The o
15480 70 61 71 75 65 20 6f 62 6a 65 63 74 20 68 61 6e  paque object han
15490 64 6c 65 20 66 6f 72 20 61 6e 20 41 44 4f 2e 4e  dle for an ADO.N
154a0 45 54 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  ET..      #     
154b0 20 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 72 65    connection pre
154c0 76 69 6f 75 73 6c 79 20 72 65 74 75 72 6e 65 64  viously returned
154d0 20 62 79 20 5b 67 65 74 44 62 43 6f 6e 6e 65 63   by [getDbConnec
154e0 74 69 6f 6e 5d 20 73 68 6f 75 6c 64 20 62 65 0d  tion] should be.
154f0 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 73  .      #       s
15500 74 6f 72 65 64 20 74 68 65 72 65 2e 0d 0a 20 20  tored there...  
15510 20 20 20 20 23 0d 0a 20 20 20 20 20 20 75 70 76      #..      upv
15520 61 72 20 31 20 24 76 61 72 4e 61 6d 65 20 63 6f  ar 1 $varName co
15530 6e 6e 65 63 74 69 6f 6e 0d 0a 0d 0a 20 20 20 20  nnection....    
15540 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
15550 45 3a 20 41 74 74 65 6d 70 74 20 74 6f 20 72 65  E: Attempt to re
15560 6d 6f 76 65 20 74 68 65 20 6f 70 61 71 75 65 20  move the opaque 
15570 6f 62 6a 65 63 74 20 68 61 6e 64 6c 65 20 66 72  object handle fr
15580 6f 6d 20 74 68 65 20 69 6e 74 65 72 70 72 65 74  om the interpret
15590 65 72 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  er..      #     
155a0 20 20 6e 6f 77 2e 20 20 54 68 69 73 20 5b 6f 62    now.  This [ob
155b0 6a 65 63 74 20 64 69 73 70 6f 73 65 5d 20 63 61  ject dispose] ca
155c0 6c 6c 20 77 69 6c 6c 20 6e 6f 74 20 61 63 74 75  ll will not actu
155d0 61 6c 6c 79 20 64 69 73 70 6f 73 65 20 6f 66 20  ally dispose of 
155e0 74 68 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20  the..      #    
155f0 20 20 20 75 6e 64 65 72 6c 79 69 6e 67 20 6f 62     underlying ob
15600 6a 65 63 74 20 62 65 63 61 75 73 65 20 74 68 65  ject because the
15610 20 2b 4e 6f 44 69 73 70 6f 73 65 20 66 6c 61 67   +NoDispose flag
15620 20 77 61 73 20 73 65 74 20 6f 6e 20 69 74 0d 0a   was set on it..
15630 20 20 20 20 20 20 23 20 20 20 20 20 20 20 64 75        #       du
15640 72 69 6e 67 20 63 72 65 61 74 69 6f 6e 20 6f 66  ring creation of
15650 20 74 68 65 20 6f 70 61 71 75 65 20 6f 62 6a 65   the opaque obje
15660 63 74 20 68 61 6e 64 6c 65 2e 0d 0a 20 20 20 20  ct handle...    
15670 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b    #..      if {[
15680 69 6e 66 6f 20 65 78 69 73 74 73 20 63 6f 6e 6e  info exists conn
15690 65 63 74 69 6f 6e 5d 20 26 26 20 5c 0d 0a 20 20  ection] && \..  
156a0 20 20 20 20 20 20 20 20 5b 63 61 74 63 68 20 7b          [catch {
156b0 6f 62 6a 65 63 74 20 64 69 73 70 6f 73 65 20 24  object dispose $
156c0 63 6f 6e 6e 65 63 74 69 6f 6e 7d 20 65 72 72 6f  connection} erro
156d0 72 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  r]} then {..    
156e0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
156f0 20 4e 4f 54 45 3a 20 57 65 20 73 6f 6d 65 68 6f   NOTE: We someho
15700 77 20 66 61 69 6c 65 64 20 74 6f 20 72 65 6d 6f  w failed to remo
15710 76 65 20 74 68 65 20 68 61 6e 64 6c 65 2c 20 72  ve the handle, r
15720 65 70 6f 72 74 20 77 68 79 2e 0d 0a 20 20 20 20  eport why...    
15730 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 74      #..        t
15740 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
15750 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
15760 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
15770 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66  "==== WARNING: f
15780 61 69 6c 65 64 20 74 6f 20 72 65 6d 6f 76 65 20  ailed to remove 
15790 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 6e 64 6c  connection handl
157a0 65 20 5c 22 22 20 24 63 6f 6e 6e 65 63 74 69 6f  e \"" $connectio
157b0 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n \..           
157c0 20 22 5c 22 2c 20 65 72 72 6f 72 3a 20 22 20 5c   "\", error: " \
157d0 6e 5c 74 20 24 65 72 72 6f 72 20 5c 6e 5d 0d 0a  n\t $error \n]..
157e0 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a        }..    }..
157f0 0c 0d 0a 20 20 20 20 70 72 6f 63 20 61 64 64 44  ...    proc addD
15800 62 43 6f 6e 6e 65 63 74 69 6f 6e 20 7b 20 63 6f  bConnection { co
15810 6e 6e 65 63 74 69 6f 6e 20 7b 76 61 72 4e 61 6d  nnection {varNam
15820 65 20 64 62 7d 20 7d 20 7b 0d 0a 20 20 20 20 20  e db} } {..     
15830 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
15840 3a 20 52 65 66 65 72 20 74 6f 20 74 68 65 20 73  : Refer to the s
15850 70 65 63 69 66 69 65 64 20 76 61 72 69 61 62 6c  pecified variabl
15860 65 20 28 65 2e 67 2e 20 22 64 62 22 29 20 69 6e  e (e.g. "db") in
15870 20 74 68 65 20 63 6f 6e 74 65 78 74 20 6f 66 20   the context of 
15880 6f 75 72 0d 0a 20 20 20 20 20 20 23 20 20 20 20  our..      #    
15890 20 20 20 63 61 6c 6c 65 72 2e 0d 0a 20 20 20 20     caller...    
158a0 20 20 23 0d 0a 20 20 20 20 20 20 75 70 76 61 72    #..      upvar
158b0 20 31 20 24 76 61 72 4e 61 6d 65 20 64 62 0d 0a   1 $varName db..
158c0 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
158d0 20 23 20 4e 4f 54 45 3a 20 43 72 65 61 74 65 20   # NOTE: Create 
158e0 61 20 63 6f 72 72 65 63 74 6c 79 20 66 6f 72 6d  a correctly form
158f0 61 74 74 65 64 20 6e 61 6d 65 20 66 6f 72 20 74  atted name for t
15900 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  he database conn
15910 65 63 74 69 6f 6e 20 74 6f 0d 0a 20 20 20 20 20  ection to..     
15920 20 23 20 20 20 20 20 20 20 62 65 20 61 64 64 65   #       be adde
15930 64 20 74 6f 20 74 68 65 20 6c 69 73 74 20 6d 61  d to the list ma
15940 6e 61 67 65 64 20 62 79 20 74 68 65 20 45 61 67  naged by the Eag
15950 6c 65 20 69 6e 74 65 72 70 72 65 74 65 72 2e 0d  le interpreter..
15960 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
15970 73 65 74 20 64 62 20 5b 6f 62 6a 65 63 74 20 69  set db [object i
15980 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f  nvoke -flags +No
15990 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20  nPublic \..     
159a0 20 20 20 20 20 45 61 67 6c 65 2e 5f 43 6f 6d 70       Eagle._Comp
159b0 6f 6e 65 6e 74 73 2e 50 72 69 76 61 74 65 2e 46  onents.Private.F
159c0 6f 72 6d 61 74 4f 70 73 20 44 61 74 61 62 61 73  ormatOps Databas
159d0 65 4f 62 6a 65 63 74 4e 61 6d 65 20 24 63 6f 6e  eObjectName $con
159e0 6e 65 63 74 69 6f 6e 20 5c 0d 0a 20 20 20 20 20  nection \..     
159f0 20 20 20 20 20 53 51 4c 69 74 65 43 6f 6e 6e 65       SQLiteConne
15a00 63 74 69 6f 6e 20 5b 6f 62 6a 65 63 74 20 69 6e  ction [object in
15a10 76 6f 6b 65 20 49 6e 74 65 72 70 72 65 74 65 72  voke Interpreter
15a20 2e 47 65 74 41 63 74 69 76 65 20 4e 65 78 74 49  .GetActive NextI
15a30 64 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a  d]]....      #..
15a40 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 64        # NOTE: Ad
15a50 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63  d the database c
15a60 6f 6e 6e 65 63 74 69 6f 6e 20 70 72 6f 76 69 64  onnection provid
15a70 65 64 20 62 79 20 6f 75 72 20 63 61 6c 6c 65 72  ed by our caller
15a80 20 74 6f 20 74 68 65 20 6c 69 73 74 0d 0a 20 20   to the list..  
15a90 20 20 20 20 23 20 20 20 20 20 20 20 6f 66 20 74      #       of t
15aa0 68 6f 73 65 20 6b 6e 6f 77 6e 20 74 6f 20 74 68  hose known to th
15ab0 65 20 45 61 67 6c 65 20 69 6e 74 65 72 70 72 65  e Eagle interpre
15ac0 74 65 72 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ter...      #.. 
15ad0 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f       object invo
15ae0 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75  ke -flags +NonPu
15af0 62 6c 69 63 20 49 6e 74 65 72 70 72 65 74 65 72  blic Interpreter
15b00 2e 47 65 74 41 63 74 69 76 65 2e 63 6f 6e 6e 65  .GetActive.conne
15b10 63 74 69 6f 6e 73 20 41 64 64 20 5c 0d 0a 20 20  ctions Add \..  
15b20 20 20 20 20 20 20 20 20 24 64 62 20 24 63 6f 6e          $db $con
15b30 6e 65 63 74 69 6f 6e 0d 0a 20 20 20 20 7d 0d 0a  nection..    }..
15b40 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74 52  ...    proc getR
15b50 6f 77 73 46 72 6f 6d 44 61 74 61 54 61 62 6c 65  owsFromDataTable
15b60 20 7b 20 64 61 74 61 54 61 62 6c 65 20 7d 20 7b   { dataTable } {
15b70 0d 0a 20 20 20 20 20 20 73 65 74 20 72 6f 77 73  ..      set rows
15b80 20 5b 6c 69 73 74 5d 0d 0a 20 20 20 20 20 20 73   [list]..      s
15b90 65 74 20 63 6f 75 6e 74 20 5b 24 64 61 74 61 54  et count [$dataT
15ba0 61 62 6c 65 20 43 6f 6c 75 6d 6e 73 2e 43 6f 75  able Columns.Cou
15bb0 6e 74 5d 0d 0a 0d 0a 20 20 20 20 20 20 66 6f 72  nt]....      for
15bc0 20 7b 73 65 74 20 69 6e 64 65 78 20 30 7d 20 7b   {set index 0} {
15bd0 24 69 6e 64 65 78 20 3c 20 24 63 6f 75 6e 74 7d  $index < $count}
15be0 20 7b 69 6e 63 72 20 69 6e 64 65 78 7d 20 7b 0d   {incr index} {.
15bf0 0a 20 20 20 20 20 20 20 20 73 65 74 20 64 61 74  .        set dat
15c00 61 43 6f 6c 75 6d 6e 20 5b 24 64 61 74 61 54 61  aColumn [$dataTa
15c10 62 6c 65 20 2d 61 6c 69 61 73 20 43 6f 6c 75 6d  ble -alias Colum
15c20 6e 73 2e 67 65 74 5f 49 74 65 6d 20 24 69 6e 64  ns.get_Item $ind
15c30 65 78 5d 0d 0a 20 20 20 20 20 20 20 20 73 65 74  ex]..        set
15c40 20 6e 61 6d 65 73 28 24 69 6e 64 65 78 29 20 5b   names($index) [
15c50 24 64 61 74 61 43 6f 6c 75 6d 6e 20 43 6f 6c 75  $dataColumn Colu
15c60 6d 6e 4e 61 6d 65 5d 0d 0a 20 20 20 20 20 20 7d  mnName]..      }
15c70 0d 0a 0d 0a 20 20 20 20 20 20 6f 62 6a 65 63 74  ....      object
15c80 20 66 6f 72 65 61 63 68 20 2d 61 6c 69 61 73 20   foreach -alias 
15c90 64 61 74 61 52 6f 77 20 5b 73 65 74 20 64 61 74  dataRow [set dat
15ca0 61 52 6f 77 73 20 5b 24 64 61 74 61 54 61 62 6c  aRows [$dataTabl
15cb0 65 20 52 6f 77 73 5d 5d 20 7b 0d 0a 20 20 20 20  e Rows]] {..    
15cc0 20 20 20 20 73 65 74 20 72 6f 77 20 5b 6c 69 73      set row [lis
15cd0 74 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 66 6f  t]....        fo
15ce0 72 20 7b 73 65 74 20 69 6e 64 65 78 20 30 7d 20  r {set index 0} 
15cf0 7b 24 69 6e 64 65 78 20 3c 20 24 63 6f 75 6e 74  {$index < $count
15d00 7d 20 7b 69 6e 63 72 20 69 6e 64 65 78 7d 20 7b  } {incr index} {
15d10 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20  ..          set 
15d20 76 61 6c 75 65 20 5b 24 64 61 74 61 52 6f 77 20  value [$dataRow 
15d30 2d 63 72 65 61 74 65 20 2d 61 6c 69 61 73 20 67  -create -alias g
15d40 65 74 5f 49 74 65 6d 20 24 69 6e 64 65 78 5d 0d  et_Item $index].
15d50 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20  ...          if 
15d60 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20  {[string length 
15d70 24 76 61 6c 75 65 5d 20 3e 20 30 20 26 26 20 5c  $value] > 0 && \
15d80 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
15d90 21 5b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20  ![object invoke 
15da0 43 6f 6e 76 65 72 74 20 49 73 44 42 4e 75 6c 6c  Convert IsDBNull
15db0 20 24 76 61 6c 75 65 5d 7d 20 74 68 65 6e 20 7b   $value]} then {
15dc0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 6c 61  ..            la
15dd0 70 70 65 6e 64 20 72 6f 77 20 5b 6c 69 73 74 20  ppend row [list 
15de0 24 6e 61 6d 65 73 28 24 69 6e 64 65 78 29 20 5b  $names($index) [
15df0 24 76 61 6c 75 65 20 54 6f 53 74 72 69 6e 67 5d  $value ToString]
15e00 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 20 65  ]..          } e
15e10 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  lse {..         
15e20 20 20 20 6c 61 70 70 65 6e 64 20 72 6f 77 20 5b     lappend row [
15e30 6c 69 73 74 20 24 6e 61 6d 65 73 28 24 69 6e 64  list $names($ind
15e40 65 78 29 5d 0d 0a 20 20 20 20 20 20 20 20 20 20  ex)]..          
15e50 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  }..        }....
15e60 20 20 20 20 20 20 20 20 6c 61 70 70 65 6e 64 20          lappend 
15e70 72 6f 77 73 20 24 72 6f 77 0d 0a 20 20 20 20 20  rows $row..     
15e80 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65 74 75   }....      retu
15e90 72 6e 20 24 72 6f 77 73 0d 0a 20 20 20 20 7d 0d  rn $rows..    }.
15ea0 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 64 75 6d  ....    proc dum
15eb0 70 52 6f 77 73 46 72 6f 6d 44 61 74 61 54 61 62  pRowsFromDataTab
15ec0 6c 65 20 7b 20 63 68 61 6e 6e 65 6c 20 72 6f 77  le { channel row
15ed0 73 20 7d 20 7b 0d 0a 20 20 20 20 20 20 73 65 74  s } {..      set
15ee0 20 73 65 71 75 65 6e 63 65 20 31 0d 0a 0d 0a 20   sequence 1.... 
15ef0 20 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77       foreach row
15f00 20 24 72 6f 77 73 20 7b 0d 0a 20 20 20 20 20 20   $rows {..      
15f10 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
15f20 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
15f30 20 20 20 20 20 20 20 20 20 20 20 20 5b 65 78 70              [exp
15f40 72 20 7b 24 73 65 71 75 65 6e 63 65 20 3e 20 31  r {$sequence > 1
15f50 20 3f 20 22 5c 6e 22 20 3a 20 22 22 7d 5d 20 22   ? "\n" : ""}] "
15f60 2d 2d 2d 2d 20 52 4f 57 20 23 22 20 24 73 65 71  ---- ROW #" $seq
15f70 75 65 6e 63 65 20 3a 5c 6e 5d 0d 0a 0d 0a 20 20  uence :\n]....  
15f80 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 70 61        foreach pa
15f90 69 72 20 24 72 6f 77 20 7b 0d 0a 20 20 20 20 20  ir $row {..     
15fa0 20 20 20 20 20 69 66 20 7b 5b 6c 6c 65 6e 67 74       if {[llengt
15fb0 68 20 24 70 61 69 72 5d 20 3e 3d 20 32 7d 20 74  h $pair] >= 2} t
15fc0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
15fd0 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
15fe0 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 74  l [appendArgs \t
15ff0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
16000 20 20 20 20 5b 6c 69 73 74 20 5b 6c 69 6e 64 65      [list [linde
16010 78 20 24 70 61 69 72 20 30 5d 5d 20 22 3a 20 22  x $pair 0]] ": "
16020 20 5b 6c 69 73 74 20 5b 6c 69 6e 64 65 78 20 24   [list [lindex $
16030 70 61 69 72 20 31 5d 5d 20 5c 6e 5d 0d 0a 20 20  pair 1]] \n]..  
16040 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 69 66          } elseif
16050 20 7b 5b 6c 6c 65 6e 67 74 68 20 24 70 61 69 72   {[llength $pair
16060 5d 20 3d 3d 20 31 7d 20 74 68 65 6e 20 7b 0d 0a  ] == 1} then {..
16070 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
16080 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  s $channel [appe
16090 6e 64 41 72 67 73 20 5c 74 20 5c 0d 0a 20 20 20  ndArgs \t \..   
160a0 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 6c 69               [li
160b0 73 74 20 5b 6c 69 6e 64 65 78 20 24 70 61 69 72  st [lindex $pair
160c0 20 30 5d 5d 20 22 3a 20 3c 6e 75 6c 6c 3e 5c 6e   0]] ": <null>\n
160d0 22 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 20  "]..          } 
160e0 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
160f0 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
16100 65 6c 20 5c 74 3c 65 6d 70 74 79 3e 5c 6e 3b 20  el \t<empty>\n; 
16110 23 20 4e 4f 54 45 3a 20 4e 6f 20 64 61 74 61 3f  # NOTE: No data?
16120 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20  ..          }.. 
16130 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
16140 20 20 20 20 69 6e 63 72 20 73 65 71 75 65 6e 63      incr sequenc
16150 65 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  e..      }..    
16160 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 63  }.....    proc c
16170 6c 65 61 6e 75 70 44 62 20 7b 20 66 69 6c 65 4e  leanupDb { fileN
16180 61 6d 65 20 7b 76 61 72 4e 61 6d 65 20 64 62 7d  ame {varName db}
16190 20 7b 63 6f 6c 6c 65 63 74 20 74 72 75 65 7d 20   {collect true} 
161a0 7b 71 75 61 6c 69 66 79 20 74 72 75 65 7d 0d 0a  {qualify true}..
161b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
161c0 20 20 20 20 20 7b 64 65 6c 65 74 65 20 74 72 75       {delete tru
161d0 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d  e} } {..      #.
161e0 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41  .      # NOTE: A
161f0 74 74 65 6d 70 74 20 74 6f 20 66 6f 72 63 65 20  ttempt to force 
16200 61 6c 6c 20 70 65 6e 64 69 6e 67 20 22 67 61 72  all pending "gar
16210 62 61 67 65 22 20 6f 62 6a 65 63 74 73 20 74 6f  bage" objects to
16220 20 62 65 20 63 6f 6c 6c 65 63 74 65 64 2c 0d 0a   be collected,..
16230 20 20 20 20 20 20 23 20 20 20 20 20 20 20 69 6e        #       in
16240 63 6c 75 64 69 6e 67 20 53 51 4c 69 74 65 20 73  cluding SQLite s
16250 74 61 74 65 6d 65 6e 74 73 20 61 6e 64 20 62 61  tatements and ba
16260 63 6b 75 70 20 6f 62 6a 65 63 74 73 3b 20 74 68  ckup objects; th
16270 69 73 20 73 68 6f 75 6c 64 20 61 6c 6c 6f 77 0d  is should allow.
16280 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74  .      #       t
16290 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 64 61  he underlying da
162a0 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 62  tabase file to b
162b0 65 20 64 65 6c 65 74 65 64 2e 0d 0a 20 20 20 20  e deleted...    
162c0 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 24    #..      if {$
162d0 63 6f 6c 6c 65 63 74 7d 20 74 68 65 6e 20 7b 0d  collect} then {.
162e0 0a 20 20 20 20 20 20 20 20 63 6f 6c 6c 65 63 74  .        collect
162f0 47 61 72 62 61 67 65 20 24 3a 3a 74 65 73 74 5f  Garbage $::test_
16300 63 68 61 6e 6e 65 6c 0d 0a 20 20 20 20 20 20 7d  channel..      }
16310 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  ....      #..   
16320 20 20 20 23 20 4e 4f 54 45 3a 20 52 65 66 65 72     # NOTE: Refer
16330 20 74 6f 20 74 68 65 20 73 70 65 63 69 66 69 65   to the specifie
16340 64 20 76 61 72 69 61 62 6c 65 20 28 65 2e 67 2e  d variable (e.g.
16350 20 22 64 62 22 29 20 69 6e 20 74 68 65 20 63 6f   "db") in the co
16360 6e 74 65 78 74 20 6f 66 20 6f 75 72 0d 0a 20 20  ntext of our..  
16370 20 20 20 20 23 20 20 20 20 20 20 20 63 61 6c 6c      #       call
16380 65 72 2e 20 20 54 68 65 20 68 61 6e 64 6c 65 20  er.  The handle 
16390 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
163a0 70 72 65 76 69 6f 75 73 6c 79 20 6f 70 65 6e 65  previously opene
163b0 64 20 76 69 61 20 74 68 65 0d 0a 20 20 20 20 20  d via the..     
163c0 20 23 20 20 20 20 20 20 20 5b 73 65 74 75 70 44   #       [setupD
163d0 62 5d 20 70 72 6f 63 65 64 75 72 65 20 73 68 6f  b] procedure sho
163e0 75 6c 64 20 62 65 20 73 74 6f 72 65 64 20 74 68  uld be stored th
163f0 65 72 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ere...      #.. 
16400 20 20 20 20 20 75 70 76 61 72 20 31 20 24 76 61       upvar 1 $va
16410 72 4e 61 6d 65 20 64 62 0d 0a 0d 0a 20 20 20 20  rName db....    
16420 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
16430 45 3a 20 43 6c 6f 73 65 20 74 68 65 20 63 6f 6e  E: Close the con
16440 6e 65 63 74 69 6f 6e 20 74 6f 20 74 68 65 20 64  nection to the d
16450 61 74 61 62 61 73 65 20 6e 6f 77 2e 20 20 54 68  atabase now.  Th
16460 69 73 20 73 68 6f 75 6c 64 20 61 6c 6c 6f 77 20  is should allow 
16470 75 73 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  us..      #     
16480 20 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20    to delete the 
16490 75 6e 64 65 72 6c 79 69 6e 67 20 64 61 74 61 62  underlying datab
164a0 61 73 65 20 66 69 6c 65 2e 0d 0a 20 20 20 20 20  ase file...     
164b0 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69   #..      if {[i
164c0 6e 66 6f 20 65 78 69 73 74 73 20 64 62 5d 20 26  nfo exists db] &
164d0 26 20 5b 63 61 74 63 68 20 7b 73 71 6c 20 63 6c  & [catch {sql cl
164e0 6f 73 65 20 24 64 62 7d 20 65 72 72 6f 72 5d 7d  ose $db} error]}
164f0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
16500 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
16510 54 45 3a 20 57 65 20 73 6f 6d 65 68 6f 77 20 66  TE: We somehow f
16520 61 69 6c 65 64 20 74 6f 20 63 6c 6f 73 65 20 74  ailed to close t
16530 68 65 20 64 61 74 61 62 61 73 65 2c 20 72 65 70  he database, rep
16540 6f 72 74 20 77 68 79 2e 0d 0a 20 20 20 20 20 20  ort why...      
16550 20 20 23 0d 0a 20 20 20 20 20 20 20 20 74 70 75    #..        tpu
16560 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
16570 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
16580 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 3d  ..            "=
16590 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61 69  === WARNING: fai
165a0 6c 65 64 20 74 6f 20 63 6c 6f 73 65 20 64 61 74  led to close dat
165b0 61 62 61 73 65 20 5c 22 22 20 24 64 62 20 22 5c  abase \"" $db "\
165c0 22 2c 20 65 72 72 6f 72 3a 20 22 20 5c 0d 0a 20  ", error: " \.. 
165d0 20 20 20 20 20 20 20 20 20 20 20 5c 6e 5c 74 20             \n\t 
165e0 24 65 72 72 6f 72 20 5c 6e 5d 0d 0a 20 20 20 20  $error \n]..    
165f0 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a    }....      #..
16600 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 46 69        # NOTE: Fi
16610 72 73 74 2c 20 73 65 65 20 69 66 20 6f 75 72 20  rst, see if our 
16620 63 61 6c 6c 65 72 20 68 61 73 20 72 65 71 75 65  caller has reque
16630 73 74 65 64 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  sted an in-memor
16640 79 20 64 61 74 61 62 61 73 65 2e 0d 0a 20 20 20  y database...   
16650 20 20 20 23 0d 0a 20 20 20 20 20 20 73 65 74 20     #..      set 
16660 69 73 4d 65 6d 6f 72 79 20 5b 69 73 4d 65 6d 6f  isMemory [isMemo
16670 72 79 44 62 20 24 66 69 6c 65 4e 61 6d 65 5d 0d  ryDb $fileName].
16680 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
16690 20 20 23 20 4e 4f 54 45 3a 20 42 75 69 6c 64 20    # NOTE: Build 
166a0 74 68 65 20 66 75 6c 6c 20 70 61 74 68 20 74 6f  the full path to
166b0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
166c0 6c 65 20 6e 61 6d 65 2e 20 20 46 6f 72 20 6e 6f  le name.  For no
166d0 77 2c 20 61 6c 6c 20 74 65 73 74 0d 0a 20 20 20  w, all test..   
166e0 20 20 20 23 20 20 20 20 20 20 20 64 61 74 61 62     #       datab
166f0 61 73 65 20 66 69 6c 65 73 20 61 72 65 20 73 74  ase files are st
16700 6f 72 65 64 20 69 6e 20 74 68 65 20 74 65 6d 70  ored in the temp
16710 6f 72 61 72 79 20 64 69 72 65 63 74 6f 72 79 2e  orary directory.
16720 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
16730 20 69 66 20 7b 21 24 69 73 4d 65 6d 6f 72 79 20   if {!$isMemory 
16740 26 26 20 24 71 75 61 6c 69 66 79 7d 20 74 68 65  && $qualify} the
16750 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 65 74  n {..        set
16760 20 66 69 6c 65 4e 61 6d 65 20 5b 66 69 6c 65 20   fileName [file 
16770 6a 6f 69 6e 20 5b 67 65 74 44 61 74 61 62 61 73  join [getDatabas
16780 65 44 69 72 65 63 74 6f 72 79 5d 20 5b 66 69 6c  eDirectory] [fil
16790 65 20 74 61 69 6c 20 24 66 69 6c 65 4e 61 6d 65  e tail $fileName
167a0 5d 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  ]]..      }.... 
167b0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
167c0 4e 4f 54 45 3a 20 43 68 65 63 6b 20 69 66 20 74  NOTE: Check if t
167d0 68 65 20 66 69 6c 65 20 73 74 69 6c 6c 20 65 78  he file still ex
167e0 69 73 74 73 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  ists...      #..
167f0 20 20 20 20 20 20 69 66 20 7b 21 24 69 73 4d 65        if {!$isMe
16800 6d 6f 72 79 20 26 26 20 24 64 65 6c 65 74 65 20  mory && $delete 
16810 26 26 20 5b 66 69 6c 65 20 65 78 69 73 74 73 20  && [file exists 
16820 24 66 69 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e  $fileName]} then
16830 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20   {..        #.. 
16840 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53         # NOTE: S
16850 6b 69 70 20 64 65 6c 65 74 69 6e 67 20 64 61 74  kip deleting dat
16860 61 62 61 73 65 20 66 69 6c 65 73 20 69 66 20 73  abase files if s
16870 6f 6d 65 62 6f 64 79 20 73 65 74 73 20 74 68 65  omebody sets the
16880 20 67 6c 6f 62 61 6c 0d 0a 20 20 20 20 20 20 20   global..       
16890 20 23 20 20 20 20 20 20 20 76 61 72 69 61 62 6c   #       variabl
168a0 65 20 74 6f 20 70 72 65 76 65 6e 74 20 69 74 2e  e to prevent it.
168b0 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
168c0 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20       if {![info 
168d0 65 78 69 73 74 73 20 3a 3a 6e 6f 28 63 6c 65 61  exists ::no(clea
168e0 6e 75 70 44 62 46 69 6c 65 29 5d 7d 20 74 68 65  nupDbFile)]} the
168f0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 23  n {..          #
16900 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f  ..          # NO
16910 54 45 3a 20 41 74 74 65 6d 70 74 20 74 6f 20 64  TE: Attempt to d
16920 65 6c 65 74 65 20 74 68 65 20 74 65 73 74 20 64  elete the test d
16930 61 74 61 62 61 73 65 20 66 69 6c 65 20 6e 6f 77  atabase file now
16940 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a  ...          #..
16950 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73            if {[s
16960 65 74 20 63 6f 64 65 20 5b 63 61 74 63 68 20 7b  et code [catch {
16970 66 69 6c 65 20 64 65 6c 65 74 65 20 24 66 69 6c  file delete $fil
16980 65 4e 61 6d 65 7d 20 65 72 72 6f 72 5d 5d 7d 20  eName} error]]} 
16990 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
169a0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
169b0 20 20 20 23 20 4e 4f 54 45 3a 20 57 65 20 73 6f     # NOTE: We so
169c0 6d 65 68 6f 77 20 66 61 69 6c 65 64 20 74 6f 20  mehow failed to 
169d0 64 65 6c 65 74 65 20 74 68 65 20 66 69 6c 65 2c  delete the file,
169e0 20 72 65 70 6f 72 74 20 77 68 79 2e 0d 0a 20 20   report why...  
169f0 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
16a00 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
16a10 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b  ::test_channel [
16a20 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
16a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 3d                "=
16a40 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61 69  === WARNING: fai
16a50 6c 65 64 20 74 6f 20 64 65 6c 65 74 65 20 64 61  led to delete da
16a60 74 61 62 61 73 65 20 66 69 6c 65 20 5c 22 22 20  tabase file \"" 
16a70 24 66 69 6c 65 4e 61 6d 65 20 5c 0d 0a 20 20 20  $fileName \..   
16a80 20 20 20 20 20 20 20 20 20 20 20 20 20 22 5c 22               "\"
16a90 20 64 75 72 69 6e 67 20 63 6c 65 61 6e 75 70 2c   during cleanup,
16aa0 20 65 72 72 6f 72 3a 20 22 20 5c 6e 5c 74 20 24   error: " \n\t $
16ab0 65 72 72 6f 72 20 5c 6e 5d 0d 0a 20 20 20 20 20  error \n]..     
16ac0 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
16ad0 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
16ae0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
16af0 20 23 20 4e 4f 54 45 3a 20 53 68 6f 77 20 74 68   # NOTE: Show th
16b00 61 74 20 77 65 20 73 6b 69 70 70 65 64 20 64 65  at we skipped de
16b10 6c 65 74 69 6e 67 20 74 68 65 20 66 69 6c 65 2e  leting the file.
16b20 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20  ..          #.. 
16b30 20 20 20 20 20 20 20 20 20 73 65 74 20 63 6f 64           set cod
16b40 65 20 30 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  e 0....         
16b50 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
16b60 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
16b70 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
16b80 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e      "==== WARNIN
16b90 47 3a 20 73 6b 69 70 70 65 64 20 64 65 6c 65 74  G: skipped delet
16ba0 69 6e 67 20 64 61 74 61 62 61 73 65 20 66 69 6c  ing database fil
16bb0 65 20 5c 22 22 20 24 66 69 6c 65 4e 61 6d 65 20  e \"" $fileName 
16bc0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
16bd0 20 22 5c 22 20 64 75 72 69 6e 67 20 63 6c 65 61   "\" during clea
16be0 6e 75 70 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20  nup\n"]..       
16bf0 20 7d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65   }..      } else
16c00 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20   {..        #.. 
16c10 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54         # NOTE: T
16c20 68 65 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74  he file does not
16c30 20 65 78 69 73 74 2c 20 73 75 63 63 65 73 73 21   exist, success!
16c40 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
16c50 20 20 20 20 20 73 65 74 20 63 6f 64 65 20 30 0d       set code 0.
16c60 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
16c70 20 20 72 65 74 75 72 6e 20 24 63 6f 64 65 0d 0a    return $code..
16c80 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
16c90 6f 63 20 73 61 76 65 45 6e 76 69 72 6f 6e 6d 65  oc saveEnvironme
16ca0 6e 74 56 61 72 69 61 62 6c 65 73 20 7b 20 6e 61  ntVariables { na
16cb0 6d 65 73 20 7b 76 61 72 4e 61 6d 65 20 22 22 7d  mes {varName ""}
16cc0 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20   } {..      #.. 
16cd0 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 46 6f 72       # NOTE: For
16ce0 20 65 61 63 68 20 6e 61 6d 65 2c 20 64 6f 65 73   each name, does
16cf0 20 74 68 65 20 6c 69 76 65 20 65 6e 76 69 72 6f   the live enviro
16d00 6e 6d 65 6e 74 20 76 61 72 69 61 62 6c 65 20 65  nment variable e
16d10 78 69 73 74 3f 20 20 49 66 0d 0a 20 20 20 20 20  xist?  If..     
16d20 20 23 20 20 20 20 20 20 20 73 6f 2c 20 73 61 76   #       so, sav
16d30 65 20 74 68 65 20 76 61 6c 75 65 20 66 6f 72 20  e the value for 
16d40 6c 61 74 65 72 3b 20 6f 74 68 65 72 77 69 73 65  later; otherwise
16d50 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20  , make sure the 
16d60 73 61 76 65 64 0d 0a 20 20 20 20 20 20 23 20 20  saved..      #  
16d70 20 20 20 20 20 76 61 6c 75 65 20 64 6f 65 73 20       value does 
16d80 6e 6f 74 20 65 78 69 73 74 20 65 69 74 68 65 72  not exist either
16d90 2e 20 20 54 68 65 20 6c 69 76 65 20 65 6e 76 69  .  The live envi
16da0 72 6f 6e 6d 65 6e 74 20 76 61 72 69 61 62 6c 65  ronment variable
16db0 73 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  s..      #      
16dc0 20 41 52 45 20 4e 4f 54 20 63 68 61 6e 67 65 64   ARE NOT changed
16dd0 20 62 79 20 74 68 69 73 20 70 72 6f 63 65 64 75   by this procedu
16de0 72 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  re...      #..  
16df0 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20      if {[string 
16e00 6c 65 6e 67 74 68 20 24 76 61 72 4e 61 6d 65 5d  length $varName]
16e10 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20   == 0} then {.. 
16e20 20 20 20 20 20 20 20 73 65 74 20 76 61 72 4e 61         set varNa
16e30 6d 65 20 73 61 76 65 64 45 6e 76 0d 0a 20 20 20  me savedEnv..   
16e40 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 75 70     }....      up
16e50 76 61 72 20 31 20 24 76 61 72 4e 61 6d 65 20 73  var 1 $varName s
16e60 61 76 65 64 45 6e 76 0d 0a 0d 0a 20 20 20 20 20  avedEnv....     
16e70 20 66 6f 72 65 61 63 68 20 6e 61 6d 65 20 24 6e   foreach name $n
16e80 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20 20 20  ames {..        
16e90 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73  if {[info exists
16ea0 20 3a 3a 65 6e 76 28 24 6e 61 6d 65 29 5d 7d 20   ::env($name)]} 
16eb0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
16ec0 20 20 73 65 74 20 73 61 76 65 64 45 6e 76 28 24    set savedEnv($
16ed0 6e 61 6d 65 29 20 24 3a 3a 65 6e 76 28 24 6e 61  name) $::env($na
16ee0 6d 65 29 0d 0a 20 20 20 20 20 20 20 20 7d 20 65  me)..        } e
16ef0 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  lse {..         
16f00 20 75 6e 73 65 74 20 2d 6e 6f 63 6f 6d 70 6c 61   unset -nocompla
16f10 69 6e 20 73 61 76 65 64 45 6e 76 28 24 6e 61 6d  in savedEnv($nam
16f20 65 29 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20  e)..        }.. 
16f30 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
16f40 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
16f50 20 54 68 69 73 20 69 73 20 73 65 6c 66 2d 63 6c   This is self-cl
16f60 65 61 6e 69 6e 67 2e 20 20 49 66 20 6e 6f 20 73  eaning.  If no s
16f70 61 76 65 64 20 65 6e 76 69 72 6f 6e 6d 65 6e 74  aved environment
16f80 20 76 61 72 69 61 62 6c 65 73 20 6e 6f 77 0d 0a   variables now..
16f90 20 20 20 20 20 20 23 20 20 20 20 20 20 20 65 78        #       ex
16fa0 69 73 74 2c 20 72 65 6d 6f 76 65 20 74 68 65 20  ist, remove the 
16fb0 61 72 72 61 79 2e 0d 0a 20 20 20 20 20 20 23 0d  array...      #.
16fc0 0a 20 20 20 20 20 20 69 66 20 7b 5b 61 72 72 61  .      if {[arra
16fd0 79 20 73 69 7a 65 20 73 61 76 65 64 45 6e 76 5d  y size savedEnv]
16fe0 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20   == 0} then {.. 
16ff0 20 20 20 20 20 20 20 75 6e 73 65 74 20 2d 6e 6f         unset -no
17000 63 6f 6d 70 6c 61 69 6e 20 73 61 76 65 64 45 6e  complain savedEn
17010 76 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  v..      }..    
17020 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 72  }.....    proc r
17030 65 73 74 6f 72 65 45 6e 76 69 72 6f 6e 6d 65 6e  estoreEnvironmen
17040 74 56 61 72 69 61 62 6c 65 73 20 7b 20 6e 61 6d  tVariables { nam
17050 65 73 20 7b 76 61 72 4e 61 6d 65 20 22 22 7d 20  es {varName ""} 
17060 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  } {..      #..  
17070 20 20 20 20 23 20 4e 4f 54 45 3a 20 46 6f 72 20      # NOTE: For 
17080 65 61 63 68 20 6e 61 6d 65 2c 20 64 6f 65 73 20  each name, does 
17090 74 68 65 20 73 61 76 65 64 20 65 6e 76 69 72 6f  the saved enviro
170a0 6e 6d 65 6e 74 20 76 61 72 69 61 62 6c 65 20 65  nment variable e
170b0 78 69 73 74 3f 20 20 49 66 0d 0a 20 20 20 20 20  xist?  If..     
170c0 20 23 20 20 20 20 20 20 20 73 6f 2c 20 72 65 73   #       so, res
170d0 74 6f 72 65 20 74 68 65 20 73 61 76 65 64 20 76  tore the saved v
170e0 61 6c 75 65 20 61 6e 64 20 75 6e 73 65 74 20 69  alue and unset i
170f0 74 3b 20 6f 74 68 65 72 77 69 73 65 2c 20 6d 61  t; otherwise, ma
17100 6b 65 20 73 75 72 65 0d 0a 20 20 20 20 20 20 23  ke sure..      #
17110 20 20 20 20 20 20 20 74 68 65 20 6c 69 76 65 20         the live 
17120 65 6e 76 69 72 6f 6e 6d 65 6e 74 20 76 61 72 69  environment vari
17130 61 62 6c 65 20 64 6f 65 73 20 6e 6f 74 20 65 78  able does not ex
17140 69 73 74 20 65 69 74 68 65 72 20 28 69 2e 65 2e  ist either (i.e.
17150 20 69 74 0d 0a 20 20 20 20 20 20 23 20 20 20 20   it..      #    
17160 20 20 20 77 61 73 20 6e 6f 74 20 73 65 74 20 74     was not set t
17170 6f 20 62 65 67 69 6e 20 77 69 74 68 29 2e 20 20  o begin with).  
17180 42 6f 74 68 20 73 61 76 65 64 20 61 6e 64 20 6c  Both saved and l
17190 69 76 65 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 0d  ive environment.
171a0 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 76  .      #       v
171b0 61 72 69 61 62 6c 65 73 20 41 52 45 20 63 68 61  ariables ARE cha
171c0 6e 67 65 64 20 62 79 20 74 68 69 73 20 70 72 6f  nged by this pro
171d0 63 65 64 75 72 65 2e 0d 0a 20 20 20 20 20 20 23  cedure...      #
171e0 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72  ..      if {[str
171f0 69 6e 67 20 6c 65 6e 67 74 68 20 24 76 61 72 4e  ing length $varN
17200 61 6d 65 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20  ame] == 0} then 
17210 7b 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 76  {..        set v
17220 61 72 4e 61 6d 65 20 73 61 76 65 64 45 6e 76 0d  arName savedEnv.
17230 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
17240 20 20 75 70 76 61 72 20 31 20 24 76 61 72 4e 61    upvar 1 $varNa
17250 6d 65 20 73 61 76 65 64 45 6e 76 0d 0a 0d 0a 20  me savedEnv.... 
17260 20 20 20 20 20 66 6f 72 65 61 63 68 20 6e 61 6d       foreach nam
17270 65 20 24 6e 61 6d 65 73 20 7b 0d 0a 20 20 20 20  e $names {..    
17280 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78      if {[info ex
17290 69 73 74 73 20 73 61 76 65 64 45 6e 76 28 24 6e  ists savedEnv($n
172a0 61 6d 65 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  ame)]} then {.. 
172b0 20 20 20 20 20 20 20 20 20 73 65 74 20 3a 3a 65           set ::e
172c0 6e 76 28 24 6e 61 6d 65 29 20 24 73 61 76 65 64  nv($name) $saved
172d0 45 6e 76 28 24 6e 61 6d 65 29 0d 0a 20 20 20 20  Env($name)..    
172e0 20 20 20 20 20 20 75 6e 73 65 74 20 2d 6e 6f 63        unset -noc
172f0 6f 6d 70 6c 61 69 6e 20 73 61 76 65 64 45 6e 76  omplain savedEnv
17300 28 24 6e 61 6d 65 29 0d 0a 20 20 20 20 20 20 20  ($name)..       
17310 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
17320 20 20 20 20 20 75 6e 73 65 74 20 2d 6e 6f 63 6f       unset -noco
17330 6d 70 6c 61 69 6e 20 3a 3a 65 6e 76 28 24 6e 61  mplain ::env($na
17340 6d 65 29 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  me)..        }..
17350 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
17360 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
17370 3a 20 54 68 69 73 20 69 73 20 73 65 6c 66 2d 63  : This is self-c
17380 6c 65 61 6e 69 6e 67 2e 20 20 49 66 20 6e 6f 20  leaning.  If no 
17390 73 61 76 65 64 20 65 6e 76 69 72 6f 6e 6d 65 6e  saved environmen
173a0 74 20 76 61 72 69 61 62 6c 65 73 20 6e 6f 77 0d  t variables now.
173b0 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 65  .      #       e
173c0 78 69 73 74 2c 20 72 65 6d 6f 76 65 20 74 68 65  xist, remove the
173d0 20 61 72 72 61 79 2e 0d 0a 20 20 20 20 20 20 23   array...      #
173e0 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 61 72 72  ..      if {[arr
173f0 61 79 20 73 69 7a 65 20 73 61 76 65 64 45 6e 76  ay size savedEnv
17400 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  ] == 0} then {..
17410 20 20 20 20 20 20 20 20 75 6e 73 65 74 20 2d 6e          unset -n
17420 6f 63 6f 6d 70 6c 61 69 6e 20 73 61 76 65 64 45  ocomplain savedE
17430 6e 76 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20  nv..      }..   
17440 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
17450 73 61 76 65 53 51 4c 69 74 65 43 6f 6e 6e 65 63  saveSQLiteConnec
17460 74 69 6f 6e 45 6e 76 69 72 6f 6e 6d 65 6e 74 20  tionEnvironment 
17470 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 75 70 76 61  {} {..      upva
17480 72 20 31 20 73 61 76 65 64 45 6e 76 20 73 61 76  r 1 savedEnv sav
17490 65 64 45 6e 76 0d 0a 0d 0a 20 20 20 20 20 20 73  edEnv....      s
174a0 61 76 65 45 6e 76 69 72 6f 6e 6d 65 6e 74 56 61  aveEnvironmentVa
174b0 72 69 61 62 6c 65 73 20 5b 6c 69 73 74 20 5c 0d  riables [list \.
174c0 0a 20 20 20 20 20 20 20 20 20 20 44 65 66 61 75  .          Defau
174d0 6c 74 46 6c 61 67 73 5f 53 51 4c 69 74 65 43 6f  ltFlags_SQLiteCo
174e0 6e 6e 65 63 74 69 6f 6e 20 4e 6f 5f 53 51 4c 69  nnection No_SQLi
174f0 74 65 43 6f 6e 6e 65 63 74 69 6f 6e 4e 65 77 50  teConnectionNewP
17500 61 72 73 65 72 5d 20 5c 0d 0a 20 20 20 20 20 20  arser] \..      
17510 20 20 20 20 73 61 76 65 64 45 6e 76 0d 0a 20 20      savedEnv..  
17520 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
17530 20 72 65 73 74 6f 72 65 53 51 4c 69 74 65 43 6f   restoreSQLiteCo
17540 6e 6e 65 63 74 69 6f 6e 45 6e 76 69 72 6f 6e 6d  nnectionEnvironm
17550 65 6e 74 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20  ent {} {..      
17560 75 70 76 61 72 20 31 20 73 61 76 65 64 45 6e 76  upvar 1 savedEnv
17570 20 73 61 76 65 64 45 6e 76 0d 0a 0d 0a 20 20 20   savedEnv....   
17580 20 20 20 72 65 73 74 6f 72 65 45 6e 76 69 72 6f     restoreEnviro
17590 6e 6d 65 6e 74 56 61 72 69 61 62 6c 65 73 20 5b  nmentVariables [
175a0 6c 69 73 74 20 5c 0d 0a 20 20 20 20 20 20 20 20  list \..        
175b0 20 20 44 65 66 61 75 6c 74 46 6c 61 67 73 5f 53    DefaultFlags_S
175c0 51 4c 69 74 65 43 6f 6e 6e 65 63 74 69 6f 6e 20  QLiteConnection 
175d0 4e 6f 5f 53 51 4c 69 74 65 43 6f 6e 6e 65 63 74  No_SQLiteConnect
175e0 69 6f 6e 4e 65 77 50 61 72 73 65 72 5d 20 5c 0d  ionNewParser] \.
175f0 0a 20 20 20 20 20 20 20 20 20 20 73 61 76 65 64  .          saved
17600 45 6e 76 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20  Env..    }..... 
17610 20 20 20 70 72 6f 63 20 73 61 76 65 53 51 4c 69     proc saveSQLi
17620 74 65 43 6f 6e 76 65 72 74 45 6e 76 69 72 6f 6e  teConvertEnviron
17630 6d 65 6e 74 20 7b 7d 20 7b 0d 0a 20 20 20 20 20  ment {} {..     
17640 20 75 70 76 61 72 20 31 20 73 61 76 65 64 45 6e   upvar 1 savedEn
17650 76 20 73 61 76 65 64 45 6e 76 0d 0a 0d 0a 20 20  v savedEnv....  
17660 20 20 20 20 73 61 76 65 45 6e 76 69 72 6f 6e 6d      saveEnvironm
17670 65 6e 74 56 61 72 69 61 62 6c 65 73 20 5b 6c 69  entVariables [li
17680 73 74 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  st \..          
17690 55 73 65 5f 53 51 4c 69 74 65 43 6f 6e 76 65 72  Use_SQLiteConver
176a0 74 5f 44 65 66 61 75 6c 74 44 62 54 79 70 65 20  t_DefaultDbType 
176b0 55 73 65 5f 53 51 4c 69 74 65 43 6f 6e 76 65 72  Use_SQLiteConver
176c0 74 5f 44 65 66 61 75 6c 74 54 79 70 65 4e 61 6d  t_DefaultTypeNam
176d0 65 5d 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  e] \..          
176e0 73 61 76 65 64 45 6e 76 0d 0a 20 20 20 20 7d 0d  savedEnv..    }.
176f0 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 72 65 73  ....    proc res
17700 74 6f 72 65 53 51 4c 69 74 65 43 6f 6e 76 65 72  toreSQLiteConver
17710 74 45 6e 76 69 72 6f 6e 6d 65 6e 74 20 7b 7d 20  tEnvironment {} 
17720 7b 0d 0a 20 20 20 20 20 20 75 70 76 61 72 20 31  {..      upvar 1
17730 20 73 61 76 65 64 45 6e 76 20 73 61 76 65 64 45   savedEnv savedE
17740 6e 76 0d 0a 0d 0a 20 20 20 20 20 20 72 65 73 74  nv....      rest
17750 6f 72 65 45 6e 76 69 72 6f 6e 6d 65 6e 74 56 61  oreEnvironmentVa
17760 72 69 61 62 6c 65 73 20 5b 6c 69 73 74 20 5c 0d  riables [list \.
17770 0a 20 20 20 20 20 20 20 20 20 20 55 73 65 5f 53  .          Use_S
17780 51 4c 69 74 65 43 6f 6e 76 65 72 74 5f 44 65 66  QLiteConvert_Def
17790 61 75 6c 74 44 62 54 79 70 65 20 55 73 65 5f 53  aultDbType Use_S
177a0 51 4c 69 74 65 43 6f 6e 76 65 72 74 5f 44 65 66  QLiteConvert_Def
177b0 61 75 6c 74 54 79 70 65 4e 61 6d 65 5d 20 5c 0d  aultTypeName] \.
177c0 0a 20 20 20 20 20 20 20 20 20 20 73 61 76 65 64  .          saved
177d0 45 6e 76 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20  Env..    }..... 
177e0 20 20 20 70 72 6f 63 20 73 65 74 75 70 44 62 49     proc setupDbI
177f0 6e 74 65 72 72 75 70 74 43 61 6c 6c 62 61 63 6b  nterruptCallback
17800 20 7b 20 63 68 61 6e 6e 65 6c 20 6c 6f 67 20 7d   { channel log }
17810 20 7b 0d 0a 20 20 20 20 20 20 74 70 75 74 73 20   {..      tputs 
17820 24 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 73  $channel "---- s
17830 65 74 74 69 6e 67 20 75 70 20 64 65 62 75 67 67  etting up debugg
17840 65 72 20 69 6e 74 65 72 72 75 70 74 20 63 61 6c  er interrupt cal
17850 6c 62 61 63 6b 2e 2e 2e 20 22 0d 0a 0d 0a 20 20  lback... "....  
17860 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b      if {[catch {
17870 0d 0a 20 20 20 20 20 20 20 20 73 61 76 65 45 6e  ..        saveEn
17880 76 69 72 6f 6e 6d 65 6e 74 56 61 72 69 61 62 6c  vironmentVariabl
17890 65 73 20 5b 6c 69 73 74 20 5c 0d 0a 20 20 20 20  es [list \..    
178a0 20 20 20 20 20 20 20 20 71 75 69 65 74 46 69 6e          quietFin
178b0 64 49 6e 74 65 72 70 72 65 74 65 72 54 65 73 74  dInterpreterTest
178c0 50 61 74 68 20 71 75 69 65 74 53 65 74 75 70 49  Path quietSetupI
178d0 6e 74 65 72 70 72 65 74 65 72 54 65 73 74 50 61  nterpreterTestPa
178e0 74 68 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 74  th]....        t
178f0 72 79 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  ry {..          
17900 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e  #..          # N
17910 4f 54 45 3a 20 50 72 65 76 65 6e 74 20 74 68 65  OTE: Prevent the
17920 20 76 65 6e 64 6f 72 20 73 63 72 69 70 74 20 66   vendor script f
17930 72 6f 6d 20 62 65 69 6e 67 20 6e 6f 69 73 79 20  rom being noisy 
17940 77 68 65 6e 20 63 72 65 61 74 69 6e 67 0d 0a 20  when creating.. 
17950 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20           #      
17960 20 74 68 65 20 69 73 6f 6c 61 74 65 64 20 69 6e   the isolated in
17970 74 65 72 70 72 65 74 65 72 2e 0d 0a 20 20 20 20  terpreter...    
17980 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
17990 20 20 20 73 65 74 20 3a 3a 65 6e 76 28 71 75 69     set ::env(qui
179a0 65 74 46 69 6e 64 49 6e 74 65 72 70 72 65 74 65  etFindInterprete
179b0 72 54 65 73 74 50 61 74 68 29 20 31 0d 0a 20 20  rTestPath) 1..  
179c0 20 20 20 20 20 20 20 20 73 65 74 20 3a 3a 65 6e          set ::en
179d0 76 28 71 75 69 65 74 53 65 74 75 70 49 6e 74 65  v(quietSetupInte
179e0 72 70 72 65 74 65 72 54 65 73 74 50 61 74 68 29  rpreterTestPath)
179f0 20 31 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   1....          
17a00 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e  #..          # N
17a10 4f 54 45 3a 20 4d 61 6b 65 20 73 75 72 65 20 74  OTE: Make sure t
17a20 68 65 20 73 63 72 69 70 74 20 64 65 62 75 67 67  he script debugg
17a30 65 72 20 61 6e 64 20 74 68 65 20 69 73 6f 6c 61  er and the isola
17a40 74 65 64 20 69 6e 74 65 72 70 72 65 74 65 72 0d  ted interpreter.
17a50 0a 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20  .          #    
17a60 20 20 20 61 72 65 20 73 65 74 75 70 20 61 6e 64     are setup and
17a70 20 72 65 61 64 79 20 66 6f 72 20 75 73 65 2e 0d   ready for use..
17a80 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
17a90 20 20 20 20 20 20 20 20 64 65 62 75 67 20 73 65          debug se
17aa0 74 75 70 20 74 72 75 65 20 74 72 75 65 0d 0a 0d  tup true true...
17ab0 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
17ac0 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
17ad0 4c 6f 61 64 20 74 68 65 20 6e 65 63 65 73 73 61  Load the necessa
17ae0 72 79 20 70 61 63 6b 61 67 65 73 20 69 6e 74 6f  ry packages into
17af0 20 74 68 65 20 69 73 6f 6c 61 74 65 64 20 69 6e   the isolated in
17b00 74 65 72 70 72 65 74 65 72 2e 0d 0a 20 20 20 20  terpreter...    
17b10 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
17b20 20 20 20 64 65 62 75 67 20 65 76 61 6c 20 7b 0d     debug eval {.
17b30 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 61 63  .            pac
17b40 6b 61 67 65 20 72 65 71 75 69 72 65 20 45 61 67  kage require Eag
17b50 6c 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  le..            
17b60 70 61 63 6b 61 67 65 20 72 65 71 75 69 72 65 20  package require 
17b70 45 61 67 6c 65 2e 4c 69 62 72 61 72 79 0d 0a 20  Eagle.Library.. 
17b80 20 20 20 20 20 20 20 20 20 20 20 70 61 63 6b 61             packa
17b90 67 65 20 72 65 71 75 69 72 65 20 45 61 67 6c 65  ge require Eagle
17ba0 2e 54 65 73 74 0d 0a 20 20 20 20 20 20 20 20 20  .Test..         
17bb0 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   }....          
17bc0 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e  #..          # N
17bd0 4f 54 45 3a 20 43 6f 70 79 20 74 68 65 20 6e 65  OTE: Copy the ne
17be0 63 65 73 73 61 72 79 20 76 61 72 69 61 62 6c 65  cessary variable
17bf0 73 20 69 6e 74 6f 20 74 68 65 20 69 73 6f 6c 61  s into the isola
17c00 74 65 64 20 69 6e 74 65 72 70 72 65 74 65 72 2e  ted interpreter.
17c10 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20  ..          #.. 
17c20 20 20 20 20 20 20 20 20 20 64 65 62 75 67 20 69           debug i
17c30 6e 76 6f 6b 65 20 30 20 73 65 74 20 3a 3a 74 65  nvoke 0 set ::te
17c40 73 74 5f 63 68 61 6e 6e 65 6c 20 24 63 68 61 6e  st_channel $chan
17c50 6e 65 6c 3b 20 23 20 4e 4f 54 45 3a 20 46 6f 72  nel; # NOTE: For
17c60 20 5b 74 70 75 74 73 5d 2e 0d 0a 20 20 20 20 20   [tputs]...     
17c70 20 20 20 20 20 64 65 62 75 67 20 69 6e 76 6f 6b       debug invok
17c80 65 20 30 20 73 65 74 20 3a 3a 74 65 73 74 5f 6c  e 0 set ::test_l
17c90 6f 67 20 24 6c 6f 67 3b 20 23 20 4e 4f 54 45 3a  og $log; # NOTE:
17ca0 20 46 6f 72 20 5b 74 6c 6f 67 5d 2e 0d 0a 0d 0a   For [tlog].....
17cb0 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
17cc0 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49         # NOTE: I
17cd0 6e 73 74 61 6c 6c 20 74 68 65 20 63 61 6c 6c 62  nstall the callb
17ce0 61 63 6b 20 73 63 72 69 70 74 20 74 6f 20 62 65  ack script to be
17cf0 20 65 76 61 6c 75 61 74 65 64 20 69 6e 20 74 68   evaluated in th
17d00 65 20 69 73 6f 6c 61 74 65 64 0d 0a 20 20 20 20  e isolated..    
17d10 20 20 20 20 20 20 23 20 20 20 20 20 20 20 69 6e        #       in
17d20 74 65 72 70 72 65 74 65 72 20 77 68 65 6e 20 74  terpreter when t
17d30 68 69 73 20 69 6e 74 65 72 70 72 65 74 65 72 20  his interpreter 
17d40 69 73 20 69 6e 74 65 72 72 75 70 74 65 64 20 62  is interrupted b
17d50 79 20 73 63 72 69 70 74 0d 0a 20 20 20 20 20 20  y script..      
17d60 20 20 20 20 23 20 20 20 20 20 20 20 63 61 6e 63      #       canc
17d70 65 6c 6c 61 74 69 6f 6e 2c 20 65 74 63 2e 0d 0a  ellation, etc...
17d80 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
17d90 20 20 20 20 20 20 20 64 65 62 75 67 20 63 61 6c         debug cal
17da0 6c 62 61 63 6b 20 61 70 70 6c 79 20 7b 7b 73 65  lback apply {{se
17db0 6e 64 65 72 20 65 7d 20 7b 0d 0a 20 20 20 20 20  nder e} {..     
17dc0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
17dd0 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68        # NOTE: Ch
17de0 65 63 6b 20 69 66 20 74 68 69 73 20 64 65 62 75  eck if this debu
17df0 67 67 65 72 20 63 61 6c 6c 62 61 63 6b 20 69 73  gger callback is
17e00 20 6f 6e 65 20 74 68 61 74 20 77 65 20 63 61 72   one that we car
17e10 65 20 61 62 6f 75 74 2e 0d 0a 20 20 20 20 20 20  e about...      
17e20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
17e30 20 20 20 20 20 73 65 74 20 69 6e 74 65 72 72 75       set interru
17e40 70 74 54 79 70 65 73 20 5b 73 70 6c 69 74 20 5b  ptTypes [split [
17e50 24 65 20 49 6e 74 65 72 72 75 70 74 54 79 70 65  $e InterruptType
17e60 5d 20 22 2c 20 22 5d 0d 0a 0d 0a 20 20 20 20 20  ] ", "]....     
17e70 20 20 20 20 20 20 20 69 66 20 7b 22 43 61 6e 63         if {"Canc
17e80 65 6c 65 64 22 20 69 6e 20 24 69 6e 74 65 72 72  eled" in $interr
17e90 75 70 74 54 79 70 65 73 20 7c 7c 20 5c 0d 0a 20  uptTypes || \.. 
17ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
17eb0 55 6e 77 6f 75 6e 64 22 20 69 6e 20 24 69 6e 74  Unwound" in $int
17ec0 65 72 72 75 70 74 54 79 70 65 73 7d 20 74 68 65  erruptTypes} the
17ed0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
17ee0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
17ef0 20 20 20 20 23 20 4e 4f 54 45 3a 20 4d 61 6b 65      # NOTE: Make
17f00 20 73 75 72 65 20 74 68 65 20 5b 6f 62 6a 65 63   sure the [objec
17f10 74 5d 20 63 6f 6d 6d 61 6e 64 20 69 73 20 61 76  t] command is av
17f20 61 69 6c 61 62 6c 65 2e 20 20 53 69 6e 63 65 0d  ailable.  Since.
17f30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23  .              #
17f40 20 20 20 20 20 20 20 74 68 69 73 20 69 73 20 61         this is a
17f50 6e 20 69 73 6f 6c 61 74 65 64 20 69 6e 74 65 72  n isolated inter
17f60 70 72 65 74 65 72 2c 20 63 68 65 63 6b 20 66 6f  preter, check fo
17f70 72 20 69 74 20 74 68 65 20 68 61 72 64 0d 0a 20  r it the hard.. 
17f80 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20 20               #  
17f90 20 20 20 20 20 77 61 79 2e 0d 0a 20 20 20 20 20       way...     
17fa0 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
17fb0 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 6c            if {[l
17fc0 6c 65 6e 67 74 68 20 5b 69 6e 66 6f 20 63 6f 6d  length [info com
17fd0 6d 61 6e 64 73 20 6f 62 6a 65 63 74 5d 5d 20 3e  mands object]] >
17fe0 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
17ff0 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20              #.. 
18000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23                 #
18010 20 4e 4f 54 45 3a 20 49 74 65 72 61 74 65 20 74   NOTE: Iterate t
18020 68 72 6f 75 67 68 20 61 6c 6c 20 64 61 74 61 62  hrough all datab
18030 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20  ase connections 
18040 6b 6e 6f 77 6e 20 74 6f 20 74 68 65 0d 0a 20 20  known to the..  
18050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20                # 
18060 20 20 20 20 20 20 70 61 72 65 6e 74 20 69 6e 74        parent int
18070 65 72 70 72 65 74 65 72 2e 0d 0a 20 20 20 20 20  erpreter...     
18080 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
18090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 62                ob
180a0 6a 65 63 74 20 66 6f 72 65 61 63 68 20 2d 61 6c  ject foreach -al
180b0 69 61 73 20 70 61 69 72 20 5b 6f 62 6a 65 63 74  ias pair [object
180c0 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b   invoke -flags +
180d0 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20  NonPublic \..   
180e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
180f0 20 24 65 20 49 6e 74 65 72 70 72 65 74 65 72 2e   $e Interpreter.
18100 63 6f 6e 6e 65 63 74 69 6f 6e 73 5d 20 7b 0d 0a  connections] {..
18110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18120 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20    #..           
18130 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41         # NOTE: A
18140 74 74 65 6d 70 74 20 74 6f 20 63 61 6e 63 65 6c  ttempt to cancel
18150 20 61 6e 79 20 53 51 4c 20 71 75 65 72 69 65 73   any SQL queries
18160 20 69 6e 20 70 72 6f 67 72 65 73 73 20 6f 6e 0d   in progress on.
18170 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
18180 20 20 20 23 20 20 20 20 20 20 20 74 68 69 73 20     #       this 
18190 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
181a0 69 6f 6e 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  ion...          
181b0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
181c0 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20               if 
181d0 7b 5b 63 61 74 63 68 20 7b 24 70 61 69 72 20 56  {[catch {$pair V
181e0 61 6c 75 65 2e 43 61 6e 63 65 6c 7d 20 65 72 72  alue.Cancel} err
181f0 6f 72 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  or]} then {..   
18200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18210 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
18220 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
18230 67 73 20 5c 6e 20 5c 0d 0a 20 20 20 20 20 20 20  gs \n \..       
18240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18250 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20   "==== WARNING: 
18260 66 61 69 6c 65 64 20 74 6f 20 63 61 6e 63 65 6c  failed to cancel
18270 20 71 75 65 72 79 20 66 6f 72 20 22 20 5c 0d 0a   query for " \..
18280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18290 20 20 20 20 20 20 20 20 22 63 6f 6e 6e 65 63 74          "connect
182a0 69 6f 6e 20 5c 22 22 20 5b 24 70 61 69 72 20 4b  ion \"" [$pair K
182b0 65 79 5d 20 22 5c 22 2c 20 65 72 72 6f 72 3a 20  ey] "\", error: 
182c0 22 20 5c 6e 5c 74 20 5c 0d 0a 20 20 20 20 20 20  " \n\t \..      
182d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
182e0 20 20 24 65 72 72 6f 72 20 5c 6e 5d 0d 0a 20 20    $error \n]..  
182f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18300 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  }..             
18310 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
18320 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
18330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 70                tp
18340 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  uts $::test_chan
18350 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
18360 5c 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  \n \..          
18370 20 20 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20            "==== 
18380 57 41 52 4e 49 4e 47 3a 20 63 61 6e 6e 6f 74 20  WARNING: cannot 
18390 63 61 6e 63 65 6c 20 61 6e 79 20 71 75 65 72 69  cancel any queri
183a0 65 73 3a 20 22 20 5c 0d 0a 20 20 20 20 20 20 20  es: " \..       
183b0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 74 68               "th
183c0 65 20 5c 22 6f 62 6a 65 63 74 5c 22 20 63 6f 6d  e \"object\" com
183d0 6d 61 6e 64 20 69 73 20 6e 6f 74 20 61 76 61 69  mand is not avai
183e0 6c 61 62 6c 65 5c 6e 22 5d 0d 0a 20 20 20 20 20  lable\n"]..     
183f0 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
18400 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
18410 20 20 20 20 20 7d 7d 0d 0a 20 20 20 20 20 20 20       }}..       
18420 20 7d 20 66 69 6e 61 6c 6c 79 20 7b 0d 0a 20 20   } finally {..  
18430 20 20 20 20 20 20 20 20 72 65 73 74 6f 72 65 45          restoreE
18440 6e 76 69 72 6f 6e 6d 65 6e 74 56 61 72 69 61 62  nvironmentVariab
18450 6c 65 73 20 5b 6c 69 73 74 20 5c 0d 0a 20 20 20  les [list \..   
18460 20 20 20 20 20 20 20 20 20 20 20 71 75 69 65 74             quiet
18470 46 69 6e 64 49 6e 74 65 72 70 72 65 74 65 72 54  FindInterpreterT
18480 65 73 74 50 61 74 68 20 71 75 69 65 74 53 65 74  estPath quietSet
18490 75 70 49 6e 74 65 72 70 72 65 74 65 72 54 65 73  upInterpreterTes
184a0 74 50 61 74 68 5d 0d 0a 20 20 20 20 20 20 20 20  tPath]..        
184b0 7d 0d 0a 20 20 20 20 20 20 7d 20 65 72 72 6f 72  }..      } error
184c0 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  ] == 0} then {..
184d0 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74          addConst
184e0 72 61 69 6e 74 20 69 6e 74 65 72 72 75 70 74 43  raint interruptC
184f0 61 6c 6c 62 61 63 6b 2e 73 71 6c 69 74 65 33 0d  allback.sqlite3.
18500 0a 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73  ...        tputs
18510 20 24 63 68 61 6e 6e 65 6c 20 79 65 73 5c 6e 0d   $channel yes\n.
18520 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d  .      } else {.
18530 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24  .        tputs $
18540 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
18550 72 67 73 20 22 6e 6f 2c 20 65 72 72 6f 72 3a 20  rgs "no, error: 
18560 22 20 5c 6e 5c 74 20 24 65 72 72 6f 72 20 5c 6e  " \n\t $error \n
18570 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  ]..      }..    
18580 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 63  }.....    proc c
18590 6c 65 61 6e 75 70 46 69 6c 65 20 7b 20 66 69 6c  leanupFile { fil
185a0 65 4e 61 6d 65 20 7b 63 6f 6c 6c 65 63 74 20 74  eName {collect t
185b0 72 75 65 7d 20 7b 66 6f 72 63 65 20 66 61 6c 73  rue} {force fals
185c0 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d  e} } {..      #.
185d0 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41  .      # NOTE: A
185e0 74 74 65 6d 70 74 20 74 6f 20 66 6f 72 63 65 20  ttempt to force 
185f0 61 6c 6c 20 70 65 6e 64 69 6e 67 20 22 67 61 72  all pending "gar
18600 62 61 67 65 22 20 6f 62 6a 65 63 74 73 20 74 6f  bage" objects to
18610 20 62 65 20 63 6f 6c 6c 65 63 74 65 64 2c 0d 0a   be collected,..
18620 20 20 20 20 20 20 23 20 20 20 20 20 20 20 69 6e        #       in
18630 63 6c 75 64 69 6e 67 20 53 51 4c 69 74 65 20 73  cluding SQLite s
18640 74 61 74 65 6d 65 6e 74 73 20 61 6e 64 20 62 61  tatements and ba
18650 63 6b 75 70 20 6f 62 6a 65 63 74 73 3b 20 74 68  ckup objects; th
18660 69 73 20 73 68 6f 75 6c 64 20 61 6c 6c 6f 77 0d  is should allow.
18670 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74  .      #       t
18680 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 64 61  he underlying da
18690 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 62  tabase file to b
186a0 65 20 64 65 6c 65 74 65 64 2e 0d 0a 20 20 20 20  e deleted...    
186b0 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 24    #..      if {$
186c0 63 6f 6c 6c 65 63 74 7d 20 74 68 65 6e 20 7b 0d  collect} then {.
186d0 0a 20 20 20 20 20 20 20 20 63 6f 6c 6c 65 63 74  .        collect
186e0 47 61 72 62 61 67 65 20 24 3a 3a 74 65 73 74 5f  Garbage $::test_
186f0 63 68 61 6e 6e 65 6c 0d 0a 20 20 20 20 20 20 7d  channel..      }
18700 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  ....      #..   
18710 20 20 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b     # NOTE: Check
18720 20 69 66 20 74 68 65 20 66 69 6c 65 20 73 74 69   if the file sti
18730 6c 6c 20 65 78 69 73 74 73 2e 0d 0a 20 20 20 20  ll exists...    
18740 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b    #..      if {[
18750 66 69 6c 65 20 65 78 69 73 74 73 20 24 66 69 6c  file exists $fil
18760 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a  eName]} then {..
18770 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
18780 20 20 20 23 20 4e 4f 54 45 3a 20 53 6b 69 70 20     # NOTE: Skip 
18790 64 65 6c 65 74 69 6e 67 20 74 65 73 74 20 66 69  deleting test fi
187a0 6c 65 73 20 69 66 20 73 6f 6d 65 62 6f 64 79 20  les if somebody 
187b0 73 65 74 73 20 74 68 65 20 67 6c 6f 62 61 6c 20  sets the global 
187c0 76 61 72 69 61 62 6c 65 0d 0a 20 20 20 20 20 20  variable..      
187d0 20 20 23 20 20 20 20 20 20 20 74 6f 20 70 72 65    #       to pre
187e0 76 65 6e 74 20 69 74 2e 0d 0a 20 20 20 20 20 20  vent it...      
187f0 20 20 23 0d 0a 20 20 20 20 20 20 20 20 69 66 20    #..        if 
18800 7b 24 66 6f 72 63 65 20 7c 7c 20 21 5b 69 6e 66  {$force || ![inf
18810 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 63 6c  o exists ::no(cl
18820 65 61 6e 75 70 46 69 6c 65 29 5d 7d 20 74 68 65  eanupFile)]} the
18830 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 23  n {..          #
18840 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f  ..          # NO
18850 54 45 3a 20 41 74 74 65 6d 70 74 20 74 6f 20 64  TE: Attempt to d
18860 65 6c 65 74 65 20 74 68 65 20 74 65 73 74 20 66  elete the test f
18870 69 6c 65 20 6e 6f 77 2e 0d 0a 20 20 20 20 20 20  ile now...      
18880 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
18890 20 69 66 20 7b 5b 73 65 74 20 63 6f 64 65 20 5b   if {[set code [
188a0 63 61 74 63 68 20 7b 66 69 6c 65 20 64 65 6c 65  catch {file dele
188b0 74 65 20 24 66 69 6c 65 4e 61 6d 65 7d 20 65 72  te $fileName} er
188c0 72 6f 72 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  ror]]} then {.. 
188d0 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
188e0 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45            # NOTE
188f0 3a 20 57 65 20 73 6f 6d 65 68 6f 77 20 66 61 69  : We somehow fai
18900 6c 65 64 20 74 6f 20 64 65 6c 65 74 65 20 74 68  led to delete th
18910 65 20 66 69 6c 65 2c 20 72 65 70 6f 72 74 20 77  e file, report w
18920 68 79 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20  hy...           
18930 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   #..            
18940 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
18950 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
18960 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
18970 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49       "==== WARNI
18980 4e 47 3a 20 66 61 69 6c 65 64 20 74 6f 20 64 65  NG: failed to de
18990 6c 65 74 65 20 74 65 73 74 20 66 69 6c 65 20 5c  lete test file \
189a0 22 22 20 24 66 69 6c 65 4e 61 6d 65 20 5c 0d 0a  "" $fileName \..
189b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
189c0 22 5c 22 20 64 75 72 69 6e 67 20 63 6c 65 61 6e  "\" during clean
189d0 75 70 2c 20 65 72 72 6f 72 3a 20 22 20 5c 6e 5c  up, error: " \n\
189e0 74 20 24 65 72 72 6f 72 20 5c 6e 5d 0d 0a 20 20  t $error \n]..  
189f0 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
18a00 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
18a10 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
18a20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 68 6f 77      # NOTE: Show
18a30 20 74 68 61 74 20 77 65 20 73 6b 69 70 70 65 64   that we skipped
18a40 20 64 65 6c 65 74 69 6e 67 20 74 68 65 20 66 69   deleting the fi
18a50 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23  le...          #
18a60 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20  ..          set 
18a70 63 6f 64 65 20 30 0d 0a 0d 0a 20 20 20 20 20 20  code 0....      
18a80 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
18a90 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e  t_channel [appen
18aa0 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
18ab0 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52         "==== WAR
18ac0 4e 49 4e 47 3a 20 73 6b 69 70 70 65 64 20 64 65  NING: skipped de
18ad0 6c 65 74 69 6e 67 20 74 65 73 74 20 66 69 6c 65  leting test file
18ae0 20 5c 22 22 20 24 66 69 6c 65 4e 61 6d 65 20 5c   \"" $fileName \
18af0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
18b00 22 5c 22 20 64 75 72 69 6e 67 20 63 6c 65 61 6e  "\" during clean
18b10 75 70 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20  up\n"]..        
18b20 7d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20  }..      } else 
18b30 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
18b40 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68        # NOTE: Th
18b50 65 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20  e file does not 
18b60 65 78 69 73 74 2c 20 73 75 63 63 65 73 73 21 0d  exist, success!.
18b70 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
18b80 20 20 20 20 73 65 74 20 63 6f 64 65 20 30 0d 0a      set code 0..
18b90 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
18ba0 20 72 65 74 75 72 6e 20 24 63 6f 64 65 0d 0a 20   return $code.. 
18bb0 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
18bc0 63 20 63 6c 65 61 6e 75 70 4d 65 6d 6f 72 79 20  c cleanupMemory 
18bd0 7b 20 76 61 72 4e 61 6d 65 20 7b 71 75 69 65 74  { varName {quiet
18be0 20 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a 20 20 20   false} } {..   
18bf0 20 20 20 69 66 20 7b 5b 68 61 76 65 53 51 4c 69     if {[haveSQLi
18c00 74 65 4f 62 6a 65 63 74 43 6f 6d 6d 61 6e 64 5d  teObjectCommand]
18c10 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20   && \..         
18c20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20   [string length 
18c30 24 76 61 72 4e 61 6d 65 5d 20 3e 20 30 7d 20 74  $varName] > 0} t
18c40 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  hen {..        #
18c50 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
18c60 3a 20 52 65 66 65 72 20 74 6f 20 74 68 65 20 73  : Refer to the s
18c70 70 65 63 69 66 69 65 64 20 76 61 72 69 61 62 6c  pecified variabl
18c80 65 20 28 65 2e 67 2e 20 22 63 6f 6e 6e 65 63 74  e (e.g. "connect
18c90 69 6f 6e 22 29 20 69 6e 20 74 68 65 0d 0a 20 20  ion") in the..  
18ca0 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63 6f        #       co
18cb0 6e 74 65 78 74 20 6f 66 20 6f 75 72 20 63 61 6c  ntext of our cal
18cc0 6c 65 72 2e 20 20 54 68 65 20 6f 70 61 71 75 65  ler.  The opaque
18cd0 20 6f 62 6a 65 63 74 20 68 61 6e 64 6c 65 20 66   object handle f
18ce0 6f 72 20 61 6e 0d 0a 20 20 20 20 20 20 20 20 23  or an..        #
18cf0 20 20 20 20 20 20 20 41 44 4f 2e 4e 45 54 20 63         ADO.NET c
18d00 6f 6e 6e 65 63 74 69 6f 6e 20 70 72 65 76 69 6f  onnection previo
18d10 75 73 6c 79 20 72 65 74 75 72 6e 65 64 20 62 79  usly returned by
18d20 20 5b 67 65 74 44 62 43 6f 6e 6e 65 63 74 69 6f   [getDbConnectio
18d30 6e 5d 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  n]..        #   
18d40 20 20 20 20 73 68 6f 75 6c 64 20 62 65 20 73 74      should be st
18d50 6f 72 65 64 20 74 68 65 72 65 2e 0d 0a 20 20 20  ored there...   
18d60 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
18d70 75 70 76 61 72 20 31 20 24 76 61 72 4e 61 6d 65  upvar 1 $varName
18d80 20 63 6f 6e 6e 65 63 74 69 6f 6e 0d 0a 0d 0a 20   connection.... 
18d90 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63         if {[catc
18da0 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 6f  h {..          o
18db0 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 24 63 6f  bject invoke $co
18dc0 6e 6e 65 63 74 69 6f 6e 20 52 65 6c 65 61 73 65  nnection Release
18dd0 4d 65 6d 6f 72 79 0d 0a 20 20 20 20 20 20 20 20  Memory..        
18de0 7d 20 72 65 73 75 6c 74 5d 7d 20 74 68 65 6e 20  } result]} then 
18df0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20  {..          if 
18e00 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b  {!$quiet} then {
18e10 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70  ..            tp
18e20 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  uts $::test_chan
18e30 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
18e40 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
18e50 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47     "==== WARNING
18e60 3a 20 66 61 69 6c 65 64 20 74 6f 20 72 65 6c 65  : failed to rele
18e70 61 73 65 20 64 61 74 61 62 61 73 65 20 6d 65 6d  ase database mem
18e80 6f 72 79 2c 20 65 72 72 6f 72 3a 20 22 20 5c 0d  ory, error: " \.
18e90 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
18ea0 20 5c 6e 5c 74 20 24 72 65 73 75 6c 74 20 5c 6e   \n\t $result \n
18eb0 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  ]..          }..
18ec0 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
18ed0 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b   }....      if {
18ee0 5b 6c 6c 65 6e 67 74 68 20 5b 69 6e 66 6f 20 63  [llength [info c
18ef0 6f 6d 6d 61 6e 64 73 20 64 65 62 75 67 5d 5d 20  ommands debug]] 
18f00 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  > 0} then {..   
18f10 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20       if {[catch 
18f20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 75 70 6c  {..          upl
18f30 65 76 65 6c 20 31 20 5b 6c 69 73 74 20 64 65 62  evel 1 [list deb
18f40 75 67 20 70 75 72 67 65 5d 0d 0a 20 20 20 20 20  ug purge]..     
18f50 20 20 20 7d 20 72 65 73 75 6c 74 5d 7d 20 74 68     } result]} th
18f60 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
18f70 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65  if {!$quiet} the
18f80 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
18f90 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
18fa0 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
18fb0 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
18fc0 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e        "==== WARN
18fd0 49 4e 47 3a 20 66 61 69 6c 65 64 20 74 6f 20 70  ING: failed to p
18fe0 75 72 67 65 20 63 61 6c 6c 20 66 72 61 6d 65 2c  urge call frame,
18ff0 20 65 72 72 6f 72 3a 20 22 20 5c 0d 0a 20 20 20   error: " \..   
19000 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 6e 5c               \n\
19010 74 20 24 72 65 73 75 6c 74 20 5c 6e 5d 0d 0a 20  t $result \n].. 
19020 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
19030 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
19040 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20   if {[catch {.. 
19050 20 20 20 20 20 20 20 20 20 75 70 6c 65 76 65 6c           uplevel
19060 20 31 20 5b 6c 69 73 74 20 64 65 62 75 67 20 63   1 [list debug c
19070 6c 65 61 6e 75 70 5d 0d 0a 20 20 20 20 20 20 20  leanup]..       
19080 20 7d 20 72 65 73 75 6c 74 5d 7d 20 74 68 65 6e   } result]} then
19090 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66   {..          if
190a0 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20   {!$quiet} then 
190b0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  {..            t
190c0 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
190d0 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
190e0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
190f0 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e      "==== WARNIN
19100 47 3a 20 66 61 69 6c 65 64 20 74 6f 20 63 6c 65  G: failed to cle
19110 61 6e 75 70 20 69 6e 74 65 72 70 72 65 74 65 72  anup interpreter
19120 2c 20 65 72 72 6f 72 3a 20 22 20 5c 0d 0a 20 20  , error: " \..  
19130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 6e                \n
19140 5c 74 20 24 72 65 73 75 6c 74 20 5c 6e 5d 0d 0a  \t $result \n]..
19150 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
19160 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
19170 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a    if {[catch {..
19180 20 20 20 20 20 20 20 20 20 20 75 70 6c 65 76 65            upleve
19190 6c 20 31 20 5b 6c 69 73 74 20 64 65 62 75 67 20  l 1 [list debug 
191a0 63 6f 6c 6c 65 63 74 5d 0d 0a 20 20 20 20 20 20  collect]..      
191b0 20 20 7d 20 72 65 73 75 6c 74 5d 7d 20 74 68 65    } result]} the
191c0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69  n {..          i
191d0 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e  f {!$quiet} then
191e0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
191f0 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
19200 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
19210 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
19220 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49       "==== WARNI
19230 4e 47 3a 20 66 61 69 6c 65 64 20 74 6f 20 63 6f  NG: failed to co
19240 6c 6c 65 63 74 20 67 61 72 62 61 67 65 2c 20 65  llect garbage, e
19250 72 72 6f 72 3a 20 22 20 5c 0d 0a 20 20 20 20 20  rror: " \..     
19260 20 20 20 20 20 20 20 20 20 20 20 5c 6e 5c 74 20             \n\t 
19270 24 72 65 73 75 6c 74 20 5c 6e 5d 0d 0a 20 20 20  $result \n]..   
19280 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
19290 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20    }..      }..  
192a0 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
192b0 20 73 65 74 75 70 4d 65 6d 6f 72 79 43 6f 75 6e   setupMemoryCoun
192c0 74 65 72 73 20 7b 20 76 61 72 4e 61 6d 65 20 7d  ters { varName }
192d0 20 7b 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 68   {..      if {[h
192e0 61 76 65 53 51 4c 69 74 65 4f 62 6a 65 63 74 43  aveSQLiteObjectC
192f0 6f 6d 6d 61 6e 64 5d 7d 20 74 68 65 6e 20 7b 0d  ommand]} then {.
19300 0a 20 20 20 20 20 20 20 20 75 70 76 61 72 20 31  .        upvar 1
19310 20 24 76 61 72 4e 61 6d 65 20 63 6f 75 6e 74 65   $varName counte
19320 72 0d 0a 0d 0a 20 20 20 20 20 20 20 20 73 65 74  r....        set
19330 20 63 6f 75 6e 74 65 72 28 31 29 20 5b 6f 62 6a   counter(1) [obj
19340 65 63 74 20 63 72 65 61 74 65 20 2d 61 6c 69 61  ect create -alia
19350 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
19360 20 53 79 73 74 65 6d 2e 44 69 61 67 6e 6f 73 74   System.Diagnost
19370 69 63 73 2e 50 65 72 66 6f 72 6d 61 6e 63 65 43  ics.PerformanceC
19380 6f 75 6e 74 65 72 20 50 72 6f 63 65 73 73 20 5c  ounter Process \
19390 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 57  ..            "W
193a0 6f 72 6b 69 6e 67 20 53 65 74 22 20 5b 66 69 6c  orking Set" [fil
193b0 65 20 72 6f 6f 74 6e 61 6d 65 20 5b 66 69 6c 65  e rootname [file
193c0 20 74 61 69 6c 20 24 3a 3a 62 69 6e 5f 66 69 6c   tail $::bin_fil
193d0 65 5d 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  e]]]....        
193e0 73 65 74 20 63 6f 75 6e 74 65 72 28 32 29 20 5b  set counter(2) [
193f0 6f 62 6a 65 63 74 20 63 72 65 61 74 65 20 2d 61  object create -a
19400 6c 69 61 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  lias \..        
19410 20 20 20 20 53 79 73 74 65 6d 2e 44 69 61 67 6e      System.Diagn
19420 6f 73 74 69 63 73 2e 50 65 72 66 6f 72 6d 61 6e  ostics.Performan
19430 63 65 43 6f 75 6e 74 65 72 20 50 72 6f 63 65 73  ceCounter Proces
19440 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
19450 20 22 57 6f 72 6b 69 6e 67 20 53 65 74 20 50 65   "Working Set Pe
19460 61 6b 22 20 5b 66 69 6c 65 20 72 6f 6f 74 6e 61  ak" [file rootna
19470 6d 65 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 3a  me [file tail $:
19480 3a 62 69 6e 5f 66 69 6c 65 5d 5d 5d 0d 0a 0d 0a  :bin_file]]]....
19490 20 20 20 20 20 20 20 20 73 65 74 20 63 6f 75 6e          set coun
194a0 74 65 72 28 33 29 20 5b 6f 62 6a 65 63 74 20 63  ter(3) [object c
194b0 72 65 61 74 65 20 2d 61 6c 69 61 73 20 5c 0d 0a  reate -alias \..
194c0 20 20 20 20 20 20 20 20 20 20 20 20 53 79 73 74              Syst
194d0 65 6d 2e 44 69 61 67 6e 6f 73 74 69 63 73 2e 50  em.Diagnostics.P
194e0 65 72 66 6f 72 6d 61 6e 63 65 43 6f 75 6e 74 65  erformanceCounte
194f0 72 20 50 72 6f 63 65 73 73 20 5c 0d 0a 20 20 20  r Process \..   
19500 20 20 20 20 20 20 20 20 20 22 50 72 69 76 61 74           "Privat
19510 65 20 42 79 74 65 73 22 20 5b 66 69 6c 65 20 72  e Bytes" [file r
19520 6f 6f 74 6e 61 6d 65 20 5b 66 69 6c 65 20 74 61  ootname [file ta
19530 69 6c 20 24 3a 3a 62 69 6e 5f 66 69 6c 65 5d 5d  il $::bin_file]]
19540 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  ]..      }....  
19550 20 20 20 20 72 65 74 75 72 6e 20 22 22 0d 0a 20      return "".. 
19560 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
19570 63 20 72 65 70 6f 72 74 4d 65 6d 6f 72 79 43 6f  c reportMemoryCo
19580 75 6e 74 65 72 73 20 7b 20 63 68 61 6e 6e 65 6c  unters { channel
19590 20 76 61 72 4e 61 6d 65 20 70 72 65 66 69 78 20   varName prefix 
195a0 7d 20 7b 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b  } {..      if {[
195b0 68 61 76 65 53 51 4c 69 74 65 4f 62 6a 65 63 74  haveSQLiteObject
195c0 43 6f 6d 6d 61 6e 64 5d 7d 20 74 68 65 6e 20 7b  Command]} then {
195d0 0d 0a 20 20 20 20 20 20 20 20 75 70 76 61 72 20  ..        upvar 
195e0 31 20 24 76 61 72 4e 61 6d 65 20 63 6f 75 6e 74  1 $varName count
195f0 65 72 0d 0a 0d 0a 20 20 20 20 20 20 20 20 74 70  er....        tp
19600 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70  uts $channel [ap
19610 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
19620 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 22 20          "---- " 
19630 24 70 72 65 66 69 78 20 22 20 63 6f 75 6e 74 65  $prefix " counte
19640 72 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20 20  r \"" \..       
19650 20 20 20 20 20 5b 6f 62 6a 65 63 74 20 69 6e 76       [object inv
19660 6f 6b 65 20 24 63 6f 75 6e 74 65 72 28 31 29 20  oke $counter(1) 
19670 43 6f 75 6e 74 65 72 4e 61 6d 65 5d 20 22 5c 22  CounterName] "\"
19680 20 76 61 6c 75 65 20 69 73 20 22 20 5c 0d 0a 20   value is " \.. 
19690 20 20 20 20 20 20 20 20 20 20 20 5b 6f 62 6a 65             [obje
196a0 63 74 20 69 6e 76 6f 6b 65 20 24 63 6f 75 6e 74  ct invoke $count
196b0 65 72 28 31 29 20 52 61 77 56 61 6c 75 65 5d 20  er(1) RawValue] 
196c0 5c 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 74  \n]....        t
196d0 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61  puts $channel [a
196e0 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
196f0 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 22           "---- "
19700 20 24 70 72 65 66 69 78 20 22 20 63 6f 75 6e 74   $prefix " count
19710 65 72 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20  er \"" \..      
19720 20 20 20 20 20 20 5b 6f 62 6a 65 63 74 20 69 6e        [object in
19730 76 6f 6b 65 20 24 63 6f 75 6e 74 65 72 28 32 29  voke $counter(2)
19740 20 43 6f 75 6e 74 65 72 4e 61 6d 65 5d 20 22 5c   CounterName] "\
19750 22 20 76 61 6c 75 65 20 69 73 20 22 20 5c 0d 0a  " value is " \..
19760 20 20 20 20 20 20 20 20 20 20 20 20 5b 6f 62 6a              [obj
19770 65 63 74 20 69 6e 76 6f 6b 65 20 24 63 6f 75 6e  ect invoke $coun
19780 74 65 72 28 32 29 20 52 61 77 56 61 6c 75 65 5d  ter(2) RawValue]
19790 20 5c 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20   \n]....        
197a0 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b  tputs $channel [
197b0 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
197c0 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
197d0 22 20 24 70 72 65 66 69 78 20 22 20 63 6f 75 6e  " $prefix " coun
197e0 74 65 72 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20  ter \"" \..     
197f0 20 20 20 20 20 20 20 5b 6f 62 6a 65 63 74 20 69         [object i
19800 6e 76 6f 6b 65 20 24 63 6f 75 6e 74 65 72 28 33  nvoke $counter(3
19810 29 20 43 6f 75 6e 74 65 72 4e 61 6d 65 5d 20 22  ) CounterName] "
19820 5c 22 20 76 61 6c 75 65 20 69 73 20 22 20 5c 0d  \" value is " \.
19830 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 6f 62  .            [ob
19840 6a 65 63 74 20 69 6e 76 6f 6b 65 20 24 63 6f 75  ject invoke $cou
19850 6e 74 65 72 28 33 29 20 52 61 77 56 61 6c 75 65  nter(3) RawValue
19860 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a  ] \n]..      }..
19870 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
19880 6f 63 20 63 6f 6c 6c 65 63 74 47 61 72 62 61 67  oc collectGarbag
19890 65 20 7b 20 63 68 61 6e 6e 65 6c 20 7b 6d 69 6c  e { channel {mil
198a0 6c 69 73 65 63 6f 6e 64 73 20 31 30 30 30 7d 20  liseconds 1000} 
198b0 7b 71 75 69 65 74 20 74 72 75 65 7d 20 7d 20 7b  {quiet true} } {
198c0 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 68 61 76  ..      if {[hav
198d0 65 53 51 4c 69 74 65 4f 62 6a 65 63 74 43 6f 6d  eSQLiteObjectCom
198e0 6d 61 6e 64 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  mand]} then {.. 
198f0 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63         if {[catc
19900 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 6f  h {..          o
19910 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 47 43 20  bject invoke GC 
19920 47 65 74 54 6f 74 61 6c 4d 65 6d 6f 72 79 20 66  GetTotalMemory f
19930 61 6c 73 65 0d 0a 20 20 20 20 20 20 20 20 7d 20  alse..        } 
19940 72 65 73 75 6c 74 5d 20 3d 3d 20 30 7d 20 74 68  result] == 0} th
19950 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
19960 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65  if {!$quiet} the
19970 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
19980 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
19990 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
199a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
199b0 2d 2d 2d 2d 20 6d 65 6d 6f 72 79 20 69 6e 20 75  ---- memory in u
199c0 73 65 20 62 79 20 74 68 65 20 43 4c 52 20 62 65  se by the CLR be
199d0 66 6f 72 65 20 63 6f 6c 6c 65 63 74 69 6f 6e 2e  fore collection.
199e0 2e 2e 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20  .. " \..        
199f0 20 20 20 20 20 20 20 20 24 72 65 73 75 6c 74 20          $result 
19a00 22 20 62 79 74 65 73 5c 6e 22 5d 0d 0a 20 20 20  " bytes\n"]..   
19a10 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
19a20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
19a30 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
19a40 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
19a50 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
19a60 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a    "==== WARNING:
19a70 20 66 61 69 6c 65 64 20 74 6f 20 67 65 74 20 43   failed to get C
19a80 4c 52 20 6d 65 6d 6f 72 79 20 75 73 61 67 65 2c  LR memory usage,
19a90 20 65 72 72 6f 72 3a 20 22 20 5c 0d 0a 20 20 20   error: " \..   
19aa0 20 20 20 20 20 20 20 20 20 20 20 5c 6e 5c 74 20             \n\t 
19ab0 24 72 65 73 75 6c 74 20 5c 6e 5d 0d 0a 20 20 20  $result \n]..   
19ac0 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d       }..      }.
19ad0 0a 0d 0a 20 20 20 20 20 20 23 23 23 23 23 23 23  ...      #######
19ae0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
19af0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
19b00 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
19b10 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
19b20 23 23 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ##....      #.. 
19b30 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 52 65 70       # NOTE: Rep
19b40 65 61 74 65 64 6c 79 20 61 74 74 65 6d 70 74 20  eatedly attempt 
19b50 74 6f 20 63 6f 6c 6c 65 63 74 20 67 61 72 62 61  to collect garba
19b60 67 65 20 75 6e 74 69 6c 20 74 68 65 20 61 6c 6c  ge until the all
19b70 6f 74 74 65 64 20 6e 75 6d 62 65 72 0d 0a 20 20  otted number..  
19b80 20 20 20 20 23 20 20 20 20 20 20 20 6f 66 20 6d      #       of m
19b90 69 6c 6c 69 73 65 63 6f 6e 64 73 20 68 61 73 20  illiseconds has 
19ba0 65 6c 61 70 73 65 64 2e 20 20 41 6c 77 61 79 73  elapsed.  Always
19bb0 20 61 74 74 65 6d 70 74 20 74 6f 20 63 6f 6c 6c   attempt to coll
19bc0 65 63 74 20 67 61 72 62 61 67 65 0d 0a 20 20 20  ect garbage..   
19bd0 20 20 20 23 20 20 20 20 20 20 20 61 74 20 6c 65     #       at le
19be0 61 73 74 20 6f 6e 63 65 2e 0d 0a 20 20 20 20 20  ast once...     
19bf0 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 68   #..      if {[h
19c00 61 76 65 53 51 4c 69 74 65 4f 62 6a 65 63 74 43  aveSQLiteObjectC
19c10 6f 6d 6d 61 6e 64 5d 7d 20 74 68 65 6e 20 7b 0d  ommand]} then {.
19c20 0a 20 20 20 20 20 20 20 20 73 65 74 20 73 74 61  .        set sta
19c30 72 74 20 5b 63 6c 6f 63 6b 20 73 65 63 6f 6e 64  rt [clock second
19c40 73 5d 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20  s]..        set 
19c50 73 74 6f 70 20 5b 65 78 70 72 20 7b 24 73 74 61  stop [expr {$sta
19c60 72 74 20 2b 20 28 24 6d 69 6c 6c 69 73 65 63 6f  rt + ($milliseco
19c70 6e 64 73 20 2f 20 31 30 30 30 29 7d 5d 0d 0a 0d  nds / 1000)}]...
19c80 0a 20 20 20 20 20 20 20 20 64 6f 20 7b 0d 0a 20  .        do {.. 
19c90 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
19ca0 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 74        # NOTE: At
19cb0 74 65 6d 70 74 20 74 6f 20 66 6f 72 63 65 20 61  tempt to force a
19cc0 20 66 75 6c 6c 20 67 61 72 62 61 67 65 20 63 6f   full garbage co
19cd0 6c 6c 65 63 74 69 6f 6e 20 6e 6f 77 2e 20 20 52  llection now.  R
19ce0 65 70 6f 72 74 20 61 6e 79 0d 0a 20 20 20 20 20  eport any..     
19cf0 20 20 20 20 20 23 20 20 20 20 20 20 20 65 72 72       #       err
19d00 6f 72 20 74 68 61 74 20 69 73 20 65 6e 63 6f 75  or that is encou
19d10 6e 74 65 72 65 64 20 69 66 20 77 65 20 66 61 69  ntered if we fai
19d20 6c 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d  l...          #.
19d30 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b  .          if {[
19d40 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20  catch {..       
19d50 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f       object invo
19d60 6b 65 20 47 43 20 47 65 74 54 6f 74 61 6c 4d 65  ke GC GetTotalMe
19d70 6d 6f 72 79 20 74 72 75 65 0d 0a 20 20 20 20 20  mory true..     
19d80 20 20 20 20 20 7d 20 65 72 72 6f 72 5d 7d 20 74       } error]} t
19d90 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
19da0 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
19db0 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
19dc0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
19dd0 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20   "==== WARNING: 
19de0 66 61 69 6c 65 64 20 66 75 6c 6c 20 67 61 72 62  failed full garb
19df0 61 67 65 20 63 6f 6c 6c 65 63 74 69 6f 6e 2c 20  age collection, 
19e00 65 72 72 6f 72 3a 20 22 20 5c 0d 0a 20 20 20 20  error: " \..    
19e10 20 20 20 20 20 20 20 20 20 20 20 20 5c 6e 5c 74              \n\t
19e20 20 24 65 72 72 6f 72 20 5c 6e 5d 0d 0a 20 20 20   $error \n]..   
19e30 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
19e40 20 20 20 20 20 20 73 65 74 20 6e 6f 77 20 5b 63        set now [c
19e50 6c 6f 63 6b 20 73 65 63 6f 6e 64 73 5d 0d 0a 20  lock seconds].. 
19e60 20 20 20 20 20 20 20 7d 20 77 68 69 6c 65 20 7b         } while {
19e70 24 73 74 61 72 74 20 3c 3d 20 24 6e 6f 77 20 26  $start <= $now &
19e80 26 20 24 6e 6f 77 20 3c 20 24 73 74 6f 70 7d 0d  & $now < $stop}.
19e90 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
19ea0 20 20 23 23 23 23 23 23 23 23 23 23 23 23 23 23    ##############
19eb0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
19ec0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
19ed0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
19ee0 23 23 23 23 23 23 23 23 23 23 23 0d 0a 0d 0a 20  ###########.... 
19ef0 20 20 20 20 20 69 66 20 7b 5b 68 61 76 65 53 51       if {[haveSQ
19f00 4c 69 74 65 4f 62 6a 65 63 74 43 6f 6d 6d 61 6e  LiteObjectComman
19f10 64 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  d]} then {..    
19f20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b      if {[catch {
19f30 0d 0a 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65  ..          obje
19f40 63 74 20 69 6e 76 6f 6b 65 20 47 43 20 47 65 74  ct invoke GC Get
19f50 54 6f 74 61 6c 4d 65 6d 6f 72 79 20 66 61 6c 73  TotalMemory fals
19f60 65 0d 0a 20 20 20 20 20 20 20 20 7d 20 72 65 73  e..        } res
19f70 75 6c 74 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20  ult] == 0} then 
19f80 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20  {..          if 
19f90 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b  {!$quiet} then {
19fa0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70  ..            tp
19fb0 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70  uts $channel [ap
19fc0 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
19fd0 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
19fe0 2d 20 6d 65 6d 6f 72 79 20 69 6e 20 75 73 65 20  - memory in use 
19ff0 62 79 20 74 68 65 20 43 4c 52 20 61 66 74 65 72  by the CLR after
1a000 20 63 6f 6c 6c 65 63 74 69 6f 6e 2e 2e 2e 20 22   collection... "
1a010 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
1a020 20 20 20 20 24 72 65 73 75 6c 74 20 22 20 62 79      $result " by
1a030 74 65 73 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20  tes\n"]..       
1a040 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 20     }..        } 
1a050 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
1a060 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
1a070 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
1a080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 3d                "=
1a090 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61 69  === WARNING: fai
1a0a0 6c 65 64 20 74 6f 20 67 65 74 20 43 4c 52 20 6d  led to get CLR m
1a0b0 65 6d 6f 72 79 20 75 73 61 67 65 2c 20 65 72 72  emory usage, err
1a0c0 6f 72 3a 20 22 20 5c 0d 0a 20 20 20 20 20 20 20  or: " \..       
1a0d0 20 20 20 20 20 20 20 5c 6e 5c 74 20 24 72 65 73         \n\t $res
1a0e0 75 6c 74 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20  ult \n]..       
1a0f0 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20   }..      }..   
1a100 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
1a110 67 65 74 53 51 4c 69 74 65 48 61 6e 64 6c 65 43  getSQLiteHandleC
1a120 6f 75 6e 74 73 20 7b 20 63 68 61 6e 6e 65 6c 20  ounts { channel 
1a130 7b 71 75 69 65 74 20 66 61 6c 73 65 7d 20 7d 20  {quiet false} } 
1a140 7b 0d 0a 20 20 20 20 20 20 73 65 74 20 72 65 73  {..      set res
1a150 75 6c 74 20 5b 6c 69 73 74 5d 0d 0a 0d 0a 20 20  ult [list]....  
1a160 20 20 20 20 69 66 20 7b 5b 68 61 76 65 53 51 4c      if {[haveSQL
1a170 69 74 65 4f 62 6a 65 63 74 43 6f 6d 6d 61 6e 64  iteObjectCommand
1a180 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20  ] && \..        
1a190 20 20 5b 68 61 76 65 53 51 4c 69 74 65 44 65 66    [haveSQLiteDef
1a1a0 69 6e 65 43 6f 6e 73 74 61 6e 74 20 43 4f 55 4e  ineConstant COUN
1a1b0 54 5f 48 41 4e 44 4c 45 5d 7d 20 74 68 65 6e 20  T_HANDLE]} then 
1a1c0 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
1a1d0 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 64        # NOTE: Ad
1a1e0 64 20 65 61 63 68 20 63 72 69 74 69 63 61 6c 20  d each critical 
1a1f0 68 61 6e 64 6c 65 20 63 6f 75 6e 74 20 74 6f 20  handle count to 
1a200 74 68 65 20 72 65 73 75 6c 74 69 6e 67 20 6c 69  the resulting li
1a210 73 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  st...        #..
1a220 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20          foreach 
1a230 6e 61 6d 65 20 5b 6c 69 73 74 20 63 6f 6e 6e 65  name [list conne
1a240 63 74 69 6f 6e 43 6f 75 6e 74 20 73 74 61 74 65  ctionCount state
1a250 6d 65 6e 74 43 6f 75 6e 74 20 62 61 63 6b 75 70  mentCount backup
1a260 43 6f 75 6e 74 5d 20 7b 0d 0a 20 20 20 20 20 20  Count] {..      
1a270 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b      if {[catch {
1a280 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 6f 62  ..            ob
1a290 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61  ject invoke -fla
1a2a0 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d  gs +NonPublic \.
1a2b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1a2c0 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c   System.Data.SQL
1a2d0 69 74 65 2e 44 65 62 75 67 44 61 74 61 20 24 6e  ite.DebugData $n
1a2e0 61 6d 65 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  ame..          }
1a2f0 20 76 61 6c 75 65 5d 20 3d 3d 20 30 7d 20 74 68   value] == 0} th
1a300 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
1a310 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74    if {!$quiet} t
1a320 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
1a330 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
1a340 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
1a350 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
1a360 20 20 20 20 20 22 2d 2d 2d 2d 20 63 72 69 74 69       "---- criti
1a370 63 61 6c 20 68 61 6e 64 6c 65 20 63 6f 75 6e 74  cal handle count
1a380 20 5c 22 22 20 24 6e 61 6d 65 20 22 5c 22 20 69   \"" $name "\" i
1a390 73 20 22 20 24 76 61 6c 75 65 20 5c 6e 5d 0d 0a  s " $value \n]..
1a3a0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d              }...
1a3b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 6c 61 70  .            lap
1a3c0 70 65 6e 64 20 72 65 73 75 6c 74 20 24 76 61 6c  pend result $val
1a3d0 75 65 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 20  ue..          } 
1a3e0 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
1a3f0 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
1a400 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
1a410 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1a420 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a    "==== WARNING:
1a430 20 66 61 69 6c 65 64 20 74 6f 20 67 65 74 20 63   failed to get c
1a440 72 69 74 69 63 61 6c 20 68 61 6e 64 6c 65 20 63  ritical handle c
1a450 6f 75 6e 74 20 5c 22 22 20 5c 0d 0a 20 20 20 20  ount \"" \..    
1a460 20 20 20 20 20 20 20 20 20 20 20 20 24 6e 61 6d              $nam
1a470 65 20 22 5c 22 2c 20 65 72 72 6f 72 3a 20 22 20  e "\", error: " 
1a480 5c 6e 5c 74 20 24 76 61 6c 75 65 20 5c 6e 5d 0d  \n\t $value \n].
1a490 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  .          }..  
1a4a0 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d        }..      }
1a4b0 20 65 6c 73 65 69 66 20 7b 21 24 71 75 69 65 74   elseif {!$quiet
1a4c0 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
1a4d0 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
1a4e0 4f 54 45 3a 20 54 68 65 20 61 63 74 75 61 6c 20  OTE: The actual 
1a4f0 68 61 6e 64 6c 65 20 63 6f 75 6e 74 73 20 61 72  handle counts ar
1a500 65 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 3b  e not available;
1a510 20 74 68 65 72 65 66 6f 72 65 2c 20 6a 75 73 74   therefore, just
1a520 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
1a530 20 20 72 65 74 75 72 6e 20 61 6e 20 65 6d 70 74    return an empt
1a540 79 20 6c 69 73 74 2e 0d 0a 20 20 20 20 20 20 20  y list...       
1a550 20 23 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74   #..        tput
1a560 73 20 24 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d  s $channel "----
1a570 20 63 72 69 74 69 63 61 6c 20 68 61 6e 64 6c 65   critical handle
1a580 20 63 6f 75 6e 74 73 20 75 6e 61 76 61 69 6c 61   counts unavaila
1a590 62 6c 65 5c 6e 22 0d 0a 20 20 20 20 20 20 7d 0d  ble\n"..      }.
1a5a0 0a 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ...      return 
1a5b0 24 72 65 73 75 6c 74 0d 0a 20 20 20 20 7d 0d 0a  $result..    }..
1a5c0 0c 0d 0a 20 20 20 20 70 72 6f 63 20 73 68 75 74  ...    proc shut
1a5d0 64 6f 77 6e 53 51 4c 69 74 65 20 7b 20 63 68 61  downSQLite { cha
1a5e0 6e 6e 65 6c 20 7b 66 6f 72 63 65 20 66 61 6c 73  nnel {force fals
1a5f0 65 7d 20 7b 71 75 69 65 74 20 66 61 6c 73 65 7d  e} {quiet false}
1a600 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20   } {..      #.. 
1a610 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4d 61 6b       # NOTE: Mak
1a620 65 20 73 75 72 65 20 74 68 61 74 20 53 51 4c 69  e sure that SQLi
1a630 74 65 20 63 6f 72 65 20 6c 69 62 72 61 72 79 20  te core library 
1a640 69 73 20 63 6f 6d 70 6c 65 74 65 6c 79 20 73 68  is completely sh
1a650 75 74 64 6f 77 6e 2e 20 20 54 68 69 73 0d 0a 20  utdown.  This.. 
1a660 20 20 20 20 20 23 20 20 20 20 20 20 20 69 73 20       #       is 
1a670 75 73 65 64 20 62 79 20 74 65 73 74 73 20 74 68  used by tests th
1a680 61 74 20 63 68 61 6e 67 65 20 63 6f 6e 66 69 67  at change config
1a690 75 72 61 74 69 6f 6e 20 6f 70 74 69 6f 6e 73 20  uration options 
1a6a0 61 6e 64 2f 6f 72 20 74 68 6f 73 65 0d 0a 20 20  and/or those..  
1a6b0 20 20 20 20 23 20 20 20 20 20 20 20 74 68 61 74      #       that
1a6c0 20 6e 65 65 64 20 74 6f 20 6d 61 6b 65 20 73 75   need to make su
1a6d0 72 65 20 6c 6f 67 67 69 6e 67 20 69 73 20 69 6e  re logging is in
1a6e0 69 74 69 61 6c 69 7a 65 64 20 28 69 2e 65 2e 20  itialized (i.e. 
1a6f0 6a 75 73 74 20 69 6e 20 63 61 73 65 0d 0a 20 20  just in case..  
1a700 20 20 20 20 23 20 20 20 20 20 20 20 74 68 65 20      #       the 
1a710 53 51 4c 69 74 65 20 63 6f 72 65 20 6c 69 62 72  SQLite core libr
1a720 61 72 79 20 77 61 73 20 69 6e 69 74 69 61 6c 69  ary was initiali
1a730 7a 65 64 20 69 6e 20 74 68 65 20 70 72 6f 63 65  zed in the proce
1a740 73 73 20 70 72 69 6f 72 20 74 6f 0d 0a 20 20 20  ss prior to..   
1a750 20 20 20 23 20 20 20 20 20 20 20 74 68 65 20 53     #       the S
1a760 51 4c 69 74 65 4c 6f 67 20 63 6c 61 73 73 20 62  QLiteLog class b
1a770 65 69 6e 67 20 61 62 6c 65 20 74 6f 20 73 65 74  eing able to set
1a780 75 70 20 69 74 73 20 6c 6f 67 67 69 6e 67 20 63  up its logging c
1a790 61 6c 6c 62 61 63 6b 29 2e 0d 0a 20 20 20 20 20  allback)...     
1a7a0 20 23 20 20 20 20 20 20 20 4e 6f 72 6d 61 6c 6c   #       Normall
1a7b0 79 2c 20 74 68 69 73 20 73 68 6f 75 6c 64 20 6f  y, this should o
1a7c0 6e 6c 79 20 62 65 20 70 65 72 66 6f 72 6d 65 64  nly be performed
1a7d0 20 69 66 20 53 51 4c 69 74 65 20 69 73 20 6c 6f   if SQLite is lo
1a7e0 61 64 65 64 20 61 6e 64 0d 0a 20 20 20 20 20 20  aded and..      
1a7f0 23 20 20 20 20 20 20 20 72 65 61 64 79 20 66 6f  #       ready fo
1a800 72 20 75 73 65 20 62 79 20 74 68 65 20 74 65 73  r use by the tes
1a810 74 20 73 75 69 74 65 2e 0d 0a 20 20 20 20 20 20  t suite...      
1a820 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 24 66 6f  #..      if {$fo
1a830 72 63 65 20 7c 7c 20 5b 69 73 53 51 4c 69 74 65  rce || [isSQLite
1a840 52 65 61 64 79 5d 7d 20 74 68 65 6e 20 7b 0d 0a  Ready]} then {..
1a850 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
1a860 20 20 20 23 20 42 55 47 46 49 58 3a 20 4d 61 6b     # BUGFIX: Mak
1a870 65 20 73 75 72 65 20 74 68 61 74 20 61 6e 79 20  e sure that any 
1a880 22 6c 65 61 6b 65 64 22 20 74 72 61 6e 73 61 63  "leaked" transac
1a890 74 69 6f 6e 73 20 61 6e 64 2f 6f 72 20 63 6f 6e  tions and/or con
1a8a0 6e 65 63 74 69 6f 6e 73 0d 0a 20 20 20 20 20 20  nections..      
1a8b0 20 20 23 20 20 20 20 20 20 20 20 20 61 72 65 20    #         are 
1a8c0 63 6c 65 61 6e 65 64 20 75 70 20 62 65 66 6f 72  cleaned up befor
1a8d0 65 20 63 61 6c 6c 69 6e 67 20 74 68 65 20 6e 61  e calling the na
1a8e0 74 69 76 65 20 73 68 75 74 64 6f 77 6e 20 66 75  tive shutdown fu
1a8f0 6e 63 74 69 6f 6e 2e 0d 0a 20 20 20 20 20 20 20  nction...       
1a900 20 23 0d 0a 20 20 20 20 20 20 20 20 66 6f 72 65   #..        fore
1a910 61 63 68 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ach transaction 
1a920 5b 69 6e 66 6f 20 74 72 61 6e 73 61 63 74 69 6f  [info transactio
1a930 6e 73 5d 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  ns] {..         
1a940 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6d 61 74   if {[string mat
1a950 63 68 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  ch \..          
1a960 20 20 20 20 53 79 73 74 65 6d 23 44 61 74 61 23      System#Data#
1a970 53 51 4c 69 74 65 23 53 51 4c 69 74 65 54 72 61  SQLite#SQLiteTra
1a980 6e 73 61 63 74 69 6f 6e 23 2a 20 24 74 72 61 6e  nsaction#* $tran
1a990 73 61 63 74 69 6f 6e 5d 7d 20 74 68 65 6e 20 7b  saction]} then {
1a9a0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ..            if
1a9b0 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20   {[catch {..    
1a9c0 20 20 20 20 20 20 20 20 20 20 73 71 6c 20 74 72            sql tr
1a9d0 61 6e 73 61 63 74 69 6f 6e 20 72 6f 6c 6c 62 61  ansaction rollba
1a9e0 63 6b 20 24 74 72 61 6e 73 61 63 74 69 6f 6e 0d  ck $transaction.
1a9f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 20 65  .            } e
1aa00 72 72 6f 72 5d 20 3d 3d 20 30 7d 20 74 68 65 6e  rror] == 0} then
1aa10 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
1aa20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74    if {!$quiet} t
1aa30 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
1aa40 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
1aa50 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
1aa60 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
1aa70 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 72           "---- r
1aa80 6f 6c 6c 65 64 20 62 61 63 6b 20 6c 65 61 6b 65  olled back leake
1aa90 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 5c 22  d transaction \"
1aaa0 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  " \..           
1aab0 20 20 20 20 20 20 20 20 20 24 74 72 61 6e 73 61           $transa
1aac0 63 74 69 6f 6e 20 5c 22 5c 6e 5d 0d 0a 20 20 20  ction \"\n]..   
1aad0 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
1aae0 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65            } else
1aaf0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
1ab00 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74    if {!$quiet} t
1ab10 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
1ab20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
1ab30 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
1ab40 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
1ab50 20 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57           "==== W
1ab60 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20 74  ARNING: failed t
1ab70 6f 20 72 6f 6c 6c 62 61 63 6b 20 6c 65 61 6b 65  o rollback leake
1ab80 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 5c 22  d transaction \"
1ab90 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  " \..           
1aba0 20 20 20 20 20 20 20 20 20 24 74 72 61 6e 73 61           $transa
1abb0 63 74 69 6f 6e 20 22 5c 22 2c 20 65 72 72 6f 72  ction "\", error
1abc0 3a 20 22 20 5c 6e 5c 74 20 24 65 72 72 6f 72 20  : " \n\t $error 
1abd0 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20  \n]..           
1abe0 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
1abf0 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d    }..          }
1ac00 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  ..        }.... 
1ac10 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 64         foreach d
1ac20 62 20 5b 69 6e 66 6f 20 63 6f 6e 6e 65 63 74 69  b [info connecti
1ac30 6f 6e 73 5d 20 7b 0d 0a 20 20 20 20 20 20 20 20  ons] {..        
1ac40 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6d 61    if {[string ma
1ac50 74 63 68 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  tch \..         
1ac60 20 20 20 20 20 53 79 73 74 65 6d 23 44 61 74 61       System#Data
1ac70 23 53 51 4c 69 74 65 23 53 51 4c 69 74 65 43 6f  #SQLite#SQLiteCo
1ac80 6e 6e 65 63 74 69 6f 6e 23 2a 20 24 64 62 5d 7d  nnection#* $db]}
1ac90 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
1aca0 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20       if {[catch 
1acb0 7b 73 71 6c 20 63 6c 6f 73 65 20 24 64 62 7d 20  {sql close $db} 
1acc0 65 72 72 6f 72 5d 20 3d 3d 20 30 7d 20 74 68 65  error] == 0} the
1acd0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
1ace0 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20     if {!$quiet} 
1acf0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
1ad00 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
1ad10 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
1ad20 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
1ad30 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
1ad40 63 6c 6f 73 65 64 20 6c 65 61 6b 65 64 20 64 61  closed leaked da
1ad50 74 61 62 61 73 65 20 5c 22 22 20 24 64 62 20 5c  tabase \"" $db \
1ad60 22 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20  "\n]..          
1ad70 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
1ad80 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
1ad90 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21             if {!
1ada0 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a  $quiet} then {..
1adb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1adc0 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b  tputs $channel [
1add0 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
1ade0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1adf0 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a    "==== WARNING:
1ae00 20 66 61 69 6c 65 64 20 74 6f 20 63 6c 6f 73 65   failed to close
1ae10 20 6c 65 61 6b 65 64 20 64 61 74 61 62 61 73 65   leaked database
1ae20 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20 20 20   \"" \..        
1ae30 20 20 20 20 20 20 20 20 20 20 20 20 24 64 62 20              $db 
1ae40 22 5c 22 2c 20 65 72 72 6f 72 3a 20 22 20 5c 6e  "\", error: " \n
1ae50 5c 74 20 24 65 72 72 6f 72 20 5c 6e 5d 0d 0a 20  \t $error \n].. 
1ae60 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a               }..
1ae70 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
1ae80 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
1ae90 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
1aea0 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 42 55   #..        # BU
1aeb0 47 46 49 58 3a 20 42 65 66 6f 72 65 20 63 61 6c  GFIX: Before cal
1aec0 6c 69 6e 67 20 74 68 65 20 6e 61 74 69 76 65 20  ling the native 
1aed0 73 68 75 74 64 6f 77 6e 20 66 75 6e 63 74 69 6f  shutdown functio
1aee0 6e 2c 20 6d 61 6b 65 20 73 75 72 65 20 62 6f 74  n, make sure bot
1aef0 68 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  h..        #    
1af00 20 20 20 20 20 6f 66 20 74 68 65 20 50 52 41 47       of the PRAG
1af10 4d 41 20 72 65 6c 61 74 65 64 20 64 69 72 65 63  MA related direc
1af20 74 6f 72 79 20 6e 61 6d 65 73 20 61 72 65 20 66  tory names are f
1af30 72 65 65 64 2e 0d 0a 20 20 20 20 20 20 20 20 23  reed...        #
1af40 0d 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b 46  ..        checkF
1af50 6f 72 53 51 4c 69 74 65 44 69 72 65 63 74 6f 72  orSQLiteDirector
1af60 69 65 73 20 24 63 68 61 6e 6e 65 6c 20 74 72 75  ies $channel tru
1af70 65 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20  e....        if 
1af80 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20  {[catch {..     
1af90 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f       object invo
1afa0 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75  ke -flags +NonPu
1afb0 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20 20 20  blic \..        
1afc0 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74        System.Dat
1afd0 61 2e 53 51 4c 69 74 65 2e 55 6e 73 61 66 65 4e  a.SQLite.UnsafeN
1afe0 61 74 69 76 65 4d 65 74 68 6f 64 73 20 73 71 6c  ativeMethods sql
1aff0 69 74 65 33 5f 73 68 75 74 64 6f 77 6e 0d 0a 20  ite3_shutdown.. 
1b000 20 20 20 20 20 20 20 7d 20 72 65 73 75 6c 74 5d         } result]
1b010 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20   == 0} then {.. 
1b020 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71           if {!$q
1b030 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  uiet} then {..  
1b040 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
1b050 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  $channel [append
1b060 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
1b070 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 61          "---- ca
1b080 6c 6c 20 73 71 6c 69 74 65 33 5f 73 68 75 74 64  ll sqlite3_shutd
1b090 6f 77 6e 28 29 2e 2e 2e 20 6f 6b 3a 20 22 20 24  own()... ok: " $
1b0a0 72 65 73 75 6c 74 20 5c 6e 5d 0d 0a 20 20 20 20  result \n]..    
1b0b0 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
1b0c0 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
1b0d0 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74       if {!$quiet
1b0e0 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
1b0f0 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
1b100 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
1b110 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
1b120 20 20 20 20 22 2d 2d 2d 2d 20 63 61 6c 6c 20 73      "---- call s
1b130 71 6c 69 74 65 33 5f 73 68 75 74 64 6f 77 6e 28  qlite3_shutdown(
1b140 29 2e 2e 2e 20 65 72 72 6f 72 3a 20 22 20 5c 6e  )... error: " \n
1b150 5c 74 20 24 72 65 73 75 6c 74 20 5c 6e 5d 0d 0a  \t $result \n]..
1b160 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
1b170 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d       }..      }.
1b180 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70  .    }.....    p
1b190 72 6f 63 20 72 65 70 6f 72 74 53 51 4c 69 74 65  roc reportSQLite
1b1a0 52 65 73 6f 75 72 63 65 73 20 7b 0d 0a 20 20 20  Resources {..   
1b1b0 20 20 20 20 20 20 20 20 20 63 68 61 6e 6e 65 6c           channel
1b1c0 20 7b 71 75 69 65 74 20 66 61 6c 73 65 7d 20 7b   {quiet false} {
1b1d0 72 65 73 65 74 20 74 72 75 65 7d 20 7b 63 6f 6c  reset true} {col
1b1e0 6c 65 63 74 20 74 72 75 65 7d 20 7d 20 7b 0d 0a  lect true} } {..
1b1f0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
1b200 20 4e 4f 54 45 3a 20 49 66 20 61 76 61 69 6c 61   NOTE: If availa
1b210 62 6c 65 2c 20 72 65 70 6f 72 74 20 6f 6e 20 28  ble, report on (
1b220 61 6e 64 20 70 6f 73 73 69 62 6c 79 20 72 65 73  and possibly res
1b230 65 74 29 20 74 68 65 20 72 75 6e 74 69 6d 65 0d  et) the runtime.
1b240 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63  .      #       c
1b250 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 73 74 61  onfiguration sta
1b260 74 69 73 74 69 63 73 2e 0d 0a 20 20 20 20 20 20  tistics...      
1b270 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 68 61  #..      if {[ha
1b280 76 65 53 51 4c 69 74 65 4f 62 6a 65 63 74 43 6f  veSQLiteObjectCo
1b290 6d 6d 61 6e 64 5d 20 26 26 20 5c 0d 0a 20 20 20  mmand] && \..   
1b2a0 20 20 20 20 20 20 20 5b 68 61 76 65 43 6f 6e 73         [haveCons
1b2b0 74 72 61 69 6e 74 20 62 75 69 6c 64 43 6f 6e 66  traint buildConf
1b2c0 69 67 75 72 61 74 69 6f 6e 2e 44 65 62 75 67 5d  iguration.Debug]
1b2d0 20 26 26 20 5b 63 61 74 63 68 20 7b 0d 0a 20 20   && [catch {..  
1b2e0 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76        object inv
1b2f0 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50  oke -flags +NonP
1b300 75 62 6c 69 63 20 2d 61 6c 69 61 73 20 5c 0d 0a  ublic -alias \..
1b310 20 20 20 20 20 20 20 20 20 20 20 20 53 79 73 74              Syst
1b320 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 44  em.Data.SQLite.D
1b330 65 62 75 67 44 61 74 61 20 73 65 74 74 69 6e 67  ebugData setting
1b340 52 65 61 64 43 6f 75 6e 74 73 0d 0a 20 20 20 20  ReadCounts..    
1b350 20 20 7d 20 73 65 74 74 69 6e 67 52 65 61 64 43    } settingReadC
1b360 6f 75 6e 74 73 5d 20 3d 3d 20 30 7d 20 74 68 65  ounts] == 0} the
1b370 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 65 74  n {..        set
1b380 20 6e 61 6d 65 43 6f 75 6e 74 20 5b 24 73 65 74   nameCount [$set
1b390 74 69 6e 67 52 65 61 64 43 6f 75 6e 74 73 20 43  tingReadCounts C
1b3a0 6f 75 6e 74 5d 0d 0a 20 20 20 20 20 20 20 20 73  ount]..        s
1b3b0 65 74 20 76 61 6c 75 65 43 6f 75 6e 74 20 30 0d  et valueCount 0.
1b3c0 0a 0d 0a 20 20 20 20 20 20 20 20 6f 62 6a 65 63  ...        objec
1b3d0 74 20 66 6f 72 65 61 63 68 20 2d 61 6c 69 61 73  t foreach -alias
1b3e0 20 70 61 69 72 20 24 73 65 74 74 69 6e 67 52 65   pair $settingRe
1b3f0 61 64 43 6f 75 6e 74 73 20 7b 0d 0a 20 20 20 20  adCounts {..    
1b400 20 20 20 20 20 20 69 6e 63 72 20 76 61 6c 75 65        incr value
1b410 43 6f 75 6e 74 20 5b 24 70 61 69 72 20 56 61 6c  Count [$pair Val
1b420 75 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  ue]....         
1b430 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68   if {!$quiet} th
1b440 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
1b450 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
1b460 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
1b470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b480 22 2d 2d 2d 2d 20 73 65 74 74 69 6e 67 20 5c 22  "---- setting \"
1b490 22 20 5b 24 70 61 69 72 20 4b 65 79 5d 20 22 5c  " [$pair Key] "\
1b4a0 22 20 77 61 73 20 72 65 61 64 20 22 20 5c 0d 0a  " was read " \..
1b4b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b4c0 5b 24 70 61 69 72 20 56 61 6c 75 65 5d 20 22 20  [$pair Value] " 
1b4d0 74 69 6d 65 73 5c 6e 22 5d 0d 0a 20 20 20 20 20  times\n"]..     
1b4e0 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
1b4f0 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20  }....        if 
1b500 7b 24 72 65 73 65 74 7d 20 74 68 65 6e 20 7b 0d  {$reset} then {.
1b510 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b  .          if {[
1b520 63 61 74 63 68 20 7b 24 73 65 74 74 69 6e 67 52  catch {$settingR
1b530 65 61 64 43 6f 75 6e 74 73 20 43 6c 65 61 72 7d  eadCounts Clear}
1b540 20 65 72 72 6f 72 5d 20 3d 3d 20 30 7d 20 74 68   error] == 0} th
1b550 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
1b560 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74    if {!$quiet} t
1b570 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
1b580 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
1b590 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
1b5a0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
1b5b0 20 20 20 20 20 22 2d 2d 2d 2d 20 72 65 73 65 74       "---- reset
1b5c0 20 73 65 74 74 69 6e 67 20 73 74 61 74 69 73 74   setting statist
1b5d0 69 63 73 20 66 6f 72 20 74 68 65 20 70 72 65 76  ics for the prev
1b5e0 69 6f 75 73 20 22 20 5c 0d 0a 20 20 20 20 20 20  ious " \..      
1b5f0 20 20 20 20 20 20 20 20 20 20 20 20 24 6e 61 6d              $nam
1b600 65 43 6f 75 6e 74 20 22 20 6e 61 6d 65 73 20 61  eCount " names a
1b610 6e 64 20 22 20 24 76 61 6c 75 65 43 6f 75 6e 74  nd " $valueCount
1b620 20 22 20 76 61 6c 75 65 73 20 72 65 61 64 5c 6e   " values read\n
1b630 22 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  "]..            
1b640 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 20 65  }..          } e
1b650 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  lse {..         
1b660 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
1b670 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
1b680 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1b690 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20   "==== WARNING: 
1b6a0 66 61 69 6c 65 64 20 74 6f 20 72 65 73 65 74 20  failed to reset 
1b6b0 73 65 74 74 69 6e 67 20 73 74 61 74 69 73 74 69  setting statisti
1b6c0 63 73 20 66 6f 72 20 22 20 5c 0d 0a 20 20 20 20  cs for " \..    
1b6d0 20 20 20 20 20 20 20 20 20 20 20 20 22 74 68 65              "the
1b6e0 20 70 72 65 76 69 6f 75 73 20 22 20 24 6e 61 6d   previous " $nam
1b6f0 65 43 6f 75 6e 74 20 22 20 6e 61 6d 65 73 20 61  eCount " names a
1b700 6e 64 20 22 20 24 76 61 6c 75 65 43 6f 75 6e 74  nd " $valueCount
1b710 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
1b720 20 20 20 20 22 20 76 61 6c 75 65 73 20 72 65 61      " values rea
1b730 64 2c 20 65 72 72 6f 72 3a 20 22 20 5c 6e 5c 74  d, error: " \n\t
1b740 20 24 65 72 72 6f 72 20 5c 6e 5d 0d 0a 20 20 20   $error \n]..   
1b750 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
1b760 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a    }..      }....
1b770 20 20 20 20 20 20 69 66 20 7b 5b 68 61 76 65 53        if {[haveS
1b780 51 4c 69 74 65 4f 62 6a 65 63 74 43 6f 6d 6d 61  QLiteObjectComma
1b790 6e 64 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20  nd] && \..      
1b7a0 20 20 20 20 5b 68 61 76 65 53 51 4c 69 74 65 44      [haveSQLiteD
1b7b0 65 66 69 6e 65 43 6f 6e 73 74 61 6e 74 20 49 4e  efineConstant IN
1b7c0 54 45 52 4f 50 5f 56 49 52 54 55 41 4c 5f 54 41  TEROP_VIRTUAL_TA
1b7d0 42 4c 45 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20  BLE] && \..     
1b7e0 20 20 20 20 20 5b 68 61 76 65 53 51 4c 69 74 65       [haveSQLite
1b7f0 44 65 66 69 6e 65 43 6f 6e 73 74 61 6e 74 20 54  DefineConstant T
1b800 52 41 43 4b 5f 4d 45 4d 4f 52 59 5f 42 59 54 45  RACK_MEMORY_BYTE
1b810 53 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  S]} then {..    
1b820 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d      if {!$quiet}
1b830 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
1b840 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
1b850 6c 20 22 2d 2d 2d 2d 20 63 75 72 72 65 6e 74 20  l "---- current 
1b860 6d 65 6d 6f 72 79 20 69 6e 20 75 73 65 20 62 79  memory in use by
1b870 20 53 51 4c 69 74 65 4d 65 6d 6f 72 79 2e 2e 2e   SQLiteMemory...
1b880 20 22 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d   "..        }...
1b890 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61  .        if {[ca
1b8a0 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  tch {..         
1b8b0 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d   object invoke -
1b8c0 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63  flags +NonPublic
1b8d0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
1b8e0 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51    System.Data.SQ
1b8f0 4c 69 74 65 2e 53 51 4c 69 74 65 4d 65 6d 6f 72  Lite.SQLiteMemor
1b900 79 20 62 79 74 65 73 41 6c 6c 6f 63 61 74 65 64  y bytesAllocated
1b910 0d 0a 20 20 20 20 20 20 20 20 7d 20 6d 65 6d 6f  ..        } memo
1b920 72 79 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b  ry] == 0} then {
1b930 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b  ..          if {
1b940 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d  !$quiet} then {.
1b950 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75  .            tpu
1b960 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70  ts $channel [app
1b970 65 6e 64 41 72 67 73 20 24 6d 65 6d 6f 72 79 20  endArgs $memory 
1b980 22 20 62 79 74 65 73 5c 6e 22 5d 0d 0a 20 20 20  " bytes\n"]..   
1b990 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
1b9a0 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
1b9b0 20 20 20 20 20 20 73 65 74 20 6d 65 6d 6f 72 79        set memory
1b9c0 20 75 6e 6b 6e 6f 77 6e 0d 0a 0d 0a 20 20 20 20   unknown....    
1b9d0 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65        if {!$quie
1b9e0 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  t} then {..     
1b9f0 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
1ba00 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
1ba10 73 20 24 6d 65 6d 6f 72 79 20 5c 6e 5d 0d 0a 20  s $memory \n].. 
1ba20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
1ba30 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
1ba40 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68   if {!$quiet} th
1ba50 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
1ba60 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 22  tputs $channel "
1ba70 2d 2d 2d 2d 20 6d 61 78 69 6d 75 6d 20 6d 65 6d  ---- maximum mem
1ba80 6f 72 79 20 69 6e 20 75 73 65 20 62 79 20 53 51  ory in use by SQ
1ba90 4c 69 74 65 4d 65 6d 6f 72 79 2e 2e 2e 20 22 0d  LiteMemory... ".
1baa0 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  .        }....  
1bab0 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68        if {[catch
1bac0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 6f 62   {..          ob
1bad0 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61  ject invoke -fla
1bae0 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d  gs +NonPublic \.
1baf0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53  .              S
1bb00 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
1bb10 65 2e 53 51 4c 69 74 65 4d 65 6d 6f 72 79 20 6d  e.SQLiteMemory m
1bb20 61 78 69 6d 75 6d 42 79 74 65 73 41 6c 6c 6f 63  aximumBytesAlloc
1bb30 61 74 65 64 0d 0a 20 20 20 20 20 20 20 20 7d 20  ated..        } 
1bb40 6d 65 6d 6f 72 79 5d 20 3d 3d 20 30 7d 20 74 68  memory] == 0} th
1bb50 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
1bb60 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65  if {!$quiet} the
1bb70 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
1bb80 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
1bb90 5b 61 70 70 65 6e 64 41 72 67 73 20 24 6d 65 6d  [appendArgs $mem
1bba0 6f 72 79 20 22 20 62 79 74 65 73 5c 6e 22 5d 0d  ory " bytes\n"].
1bbb0 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  .          }..  
1bbc0 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
1bbd0 20 20 20 20 20 20 20 20 20 20 73 65 74 20 6d 65            set me
1bbe0 6d 6f 72 79 20 75 6e 6b 6e 6f 77 6e 0d 0a 0d 0a  mory unknown....
1bbf0 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 24            if {!$
1bc00 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20  quiet} then {.. 
1bc10 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
1bc20 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e   $channel [appen
1bc30 64 41 72 67 73 20 24 6d 65 6d 6f 72 79 20 5c 6e  dArgs $memory \n
1bc40 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  ]..          }..
1bc50 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
1bc60 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b   }....      if {
1bc70 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d  !$quiet} then {.
1bc80 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24  .        tputs $
1bc90 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 63 75  channel "---- cu
1bca0 72 72 65 6e 74 20 6d 65 6d 6f 72 79 20 69 6e 20  rrent memory in 
1bcb0 75 73 65 20 62 79 20 53 51 4c 69 74 65 2e 2e 2e  use by SQLite...
1bcc0 20 22 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20   "..      }.... 
1bcd0 20 20 20 20 20 69 66 20 7b 5b 68 61 76 65 53 51       if {[haveSQ
1bce0 4c 69 74 65 4f 62 6a 65 63 74 43 6f 6d 6d 61 6e  LiteObjectComman
1bcf0 64 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  d]} then {..    
1bd00 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b      if {[catch {
1bd10 0d 0a 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65  ..          obje
1bd20 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73  ct invoke -flags
1bd30 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20   +NonPublic \.. 
1bd40 20 20 20 20 20 20 20 20 20 20 20 20 20 53 79 73               Sys
1bd50 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e  tem.Data.SQLite.
1bd60 55 6e 73 61 66 65 4e 61 74 69 76 65 4d 65 74 68  UnsafeNativeMeth
1bd70 6f 64 73 20 73 71 6c 69 74 65 33 5f 6d 65 6d 6f  ods sqlite3_memo
1bd80 72 79 5f 75 73 65 64 0d 0a 20 20 20 20 20 20 20  ry_used..       
1bd90 20 7d 20 6d 65 6d 6f 72 79 5d 20 3d 3d 20 30 7d   } memory] == 0}
1bda0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
1bdb0 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20     if {!$quiet} 
1bdc0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
1bdd0 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
1bde0 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 24  el [appendArgs $
1bdf0 6d 65 6d 6f 72 79 20 22 20 62 79 74 65 73 5c 6e  memory " bytes\n
1be00 22 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d  "]..          }.
1be10 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20  .        } else 
1be20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a  {..          #..
1be30 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45            # NOTE
1be40 3a 20 4d 61 79 62 65 20 74 68 65 20 53 51 4c 69  : Maybe the SQLi
1be50 74 65 20 63 6f 72 65 20 6c 69 62 72 61 72 79 20  te core library 
1be60 69 73 20 75 6e 61 76 61 69 6c 61 62 6c 65 3f 0d  is unavailable?.
1be70 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
1be80 20 20 20 20 20 20 20 20 73 65 74 20 6d 65 6d 6f          set memo
1be90 72 79 20 75 6e 6b 6e 6f 77 6e 0d 0a 0d 0a 20 20  ry unknown....  
1bea0 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75          if {!$qu
1beb0 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  iet} then {..   
1bec0 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
1bed0 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
1bee0 72 67 73 20 24 6d 65 6d 6f 72 79 20 5c 6e 5d 0d  rgs $memory \n].
1bef0 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  .          }..  
1bf00 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d        }..      }
1bf10 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
1bf20 20 73 65 74 20 6d 65 6d 6f 72 79 20 75 6e 61 76   set memory unav
1bf30 61 69 6c 61 62 6c 65 0d 0a 0d 0a 20 20 20 20 20  ailable....     
1bf40 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20     if {!$quiet} 
1bf50 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
1bf60 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
1bf70 20 5b 61 70 70 65 6e 64 41 72 67 73 20 24 6d 65   [appendArgs $me
1bf80 6d 6f 72 79 20 5c 6e 5d 0d 0a 20 20 20 20 20 20  mory \n]..      
1bf90 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a    }..      }....
1bfa0 20 20 20 20 20 20 73 65 74 20 72 65 73 75 6c 74        set result
1bfb0 20 24 6d 65 6d 6f 72 79 3b 20 23 20 4e 4f 54 45   $memory; # NOTE
1bfc0 3a 20 52 65 74 75 72 6e 20 6d 65 6d 6f 72 79 20  : Return memory 
1bfd0 69 6e 2d 75 73 65 20 74 6f 20 6f 75 72 20 63 61  in-use to our ca
1bfe0 6c 6c 65 72 2e 0d 0a 0d 0a 20 20 20 20 20 20 69  ller.....      i
1bff0 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e  f {!$quiet} then
1c000 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74   {..        tput
1c010 73 20 24 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d  s $channel "----
1c020 20 6d 61 78 69 6d 75 6d 20 6d 65 6d 6f 72 79 20   maximum memory 
1c030 69 6e 20 75 73 65 20 62 79 20 53 51 4c 69 74 65  in use by SQLite
1c040 2e 2e 2e 20 22 0d 0a 20 20 20 20 20 20 7d 0d 0a  ... "..      }..
1c050 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 68 61 76  ..      if {[hav
1c060 65 53 51 4c 69 74 65 4f 62 6a 65 63 74 43 6f 6d  eSQLiteObjectCom
1c070 6d 61 6e 64 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  mand]} then {.. 
1c080 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63         if {[catc
1c090 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 6f  h {..          o
1c0a0 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c  bject invoke -fl
1c0b0 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c  ags +NonPublic \
1c0c0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1c0d0 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
1c0e0 74 65 2e 55 6e 73 61 66 65 4e 61 74 69 76 65 4d  te.UnsafeNativeM
1c0f0 65 74 68 6f 64 73 20 5c 0d 0a 20 20 20 20 20 20  ethods \..      
1c100 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
1c110 6d 65 6d 6f 72 79 5f 68 69 67 68 77 61 74 65 72  memory_highwater
1c120 20 30 0d 0a 20 20 20 20 20 20 20 20 7d 20 6d 65   0..        } me
1c130 6d 6f 72 79 5d 20 3d 3d 20 30 7d 20 74 68 65 6e  mory] == 0} then
1c140 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66   {..          if
1c150 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20   {!$quiet} then 
1c160 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  {..            t
1c170 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61  puts $channel [a
1c180 70 70 65 6e 64 41 72 67 73 20 24 6d 65 6d 6f 72  ppendArgs $memor
1c190 79 20 22 20 62 79 74 65 73 5c 6e 22 5d 0d 0a 20  y " bytes\n"].. 
1c1a0 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
1c1b0 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
1c1c0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
1c1d0 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4d 61 79       # NOTE: May
1c1e0 62 65 20 74 68 65 20 53 51 4c 69 74 65 20 63 6f  be the SQLite co
1c1f0 72 65 20 6c 69 62 72 61 72 79 20 69 73 20 75 6e  re library is un
1c200 61 76 61 69 6c 61 62 6c 65 3f 0d 0a 20 20 20 20  available?..    
1c210 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
1c220 20 20 20 73 65 74 20 6d 65 6d 6f 72 79 20 75 6e     set memory un
1c230 6b 6e 6f 77 6e 0d 0a 0d 0a 20 20 20 20 20 20 20  known....       
1c240 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20     if {!$quiet} 
1c250 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
1c260 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
1c270 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 24  el [appendArgs $
1c280 6d 65 6d 6f 72 79 20 5c 6e 5d 0d 0a 20 20 20 20  memory \n]..    
1c290 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
1c2a0 20 7d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65   }..      } else
1c2b0 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20   {..        set 
1c2c0 6d 65 6d 6f 72 79 20 75 6e 61 76 61 69 6c 61 62  memory unavailab
1c2d0 6c 65 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66  le....        if
1c2e0 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20   {!$quiet} then 
1c2f0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70 75  {..          tpu
1c300 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70  ts $channel [app
1c310 65 6e 64 41 72 67 73 20 24 6d 65 6d 6f 72 79 20  endArgs $memory 
1c320 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  \n]..        }..
1c330 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
1c340 20 69 66 20 7b 24 63 6f 6c 6c 65 63 74 7d 20 74   if {$collect} t
1c350 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 63  hen {..        c
1c360 6f 6c 6c 65 63 74 47 61 72 62 61 67 65 20 24 63  ollectGarbage $c
1c370 68 61 6e 6e 65 6c 0d 0a 20 20 20 20 20 20 7d 0d  hannel..      }.
1c380 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 21 24 71  ...      if {!$q
1c390 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  uiet} then {..  
1c3a0 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
1c3b0 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 63 75 72 72 65  nnel "---- curre
1c3c0 6e 74 20 6d 65 6d 6f 72 79 20 69 6e 20 75 73 65  nt memory in use
1c3d0 20 62 79 20 74 68 65 20 43 4c 52 2e 2e 2e 20 22   by the CLR... "
1c3e0 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
1c3f0 20 20 20 69 66 20 7b 5b 68 61 76 65 53 51 4c 69     if {[haveSQLi
1c400 74 65 4f 62 6a 65 63 74 43 6f 6d 6d 61 6e 64 5d  teObjectCommand]
1c410 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
1c420 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a    if {[catch {..
1c430 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74            object
1c440 20 69 6e 76 6f 6b 65 20 47 43 20 47 65 74 54 6f   invoke GC GetTo
1c450 74 61 6c 4d 65 6d 6f 72 79 20 66 61 6c 73 65 0d  talMemory false.
1c460 0a 20 20 20 20 20 20 20 20 7d 20 6d 65 6d 6f 72  .        } memor
1c470 79 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d  y] == 0} then {.
1c480 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b  .          if {[
1c490 73 74 72 69 6e 67 20 69 73 20 69 6e 74 65 67 65  string is intege
1c4a0 72 20 2d 73 74 72 69 63 74 20 24 6d 65 6d 6f 72  r -strict $memor
1c4b0 79 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  y]} then {..    
1c4c0 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75          if {!$qu
1c4d0 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  iet} then {..   
1c4e0 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
1c4f0 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e   $channel [appen
1c500 64 41 72 67 73 20 24 6d 65 6d 6f 72 79 20 22 20  dArgs $memory " 
1c510 62 79 74 65 73 5c 6e 22 5d 0d 0a 20 20 20 20 20  bytes\n"]..     
1c520 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
1c530 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
1c540 20 20 20 20 20 20 20 20 20 20 73 65 74 20 6d 65            set me
1c550 6d 6f 72 79 20 69 6e 76 61 6c 69 64 0d 0a 0d 0a  mory invalid....
1c560 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b              if {
1c570 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d  !$quiet} then {.
1c580 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74  .              t
1c590 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61  puts $channel [a
1c5a0 70 70 65 6e 64 41 72 67 73 20 24 6d 65 6d 6f 72  ppendArgs $memor
1c5b0 79 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20  y \n]..         
1c5c0 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
1c5d0 7d 0d 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73  }..        } els
1c5e0 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73  e {..          s
1c5f0 65 74 20 6d 65 6d 6f 72 79 20 75 6e 6b 6e 6f 77  et memory unknow
1c600 6e 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 69  n....          i
1c610 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e  f {!$quiet} then
1c620 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
1c630 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b  tputs $channel [
1c640 61 70 70 65 6e 64 41 72 67 73 20 24 6d 65 6d 6f  appendArgs $memo
1c650 72 79 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20  ry \n]..        
1c660 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a    }..        }..
1c670 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
1c680 20 20 20 20 20 20 20 20 73 65 74 20 6d 65 6d 6f          set memo
1c690 72 79 20 75 6e 61 76 61 69 6c 61 62 6c 65 0d 0a  ry unavailable..
1c6a0 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21 24  ..        if {!$
1c6b0 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20  quiet} 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 5c 6e 5d 0d  rgs $memory \n].
1c6f0 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  .        }..    
1c700 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65 74    }....      ret
1c710 75 72 6e 20 24 72 65 73 75 6c 74 0d 0a 20 20 20  urn $result..   
1c720 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
1c730 63 68 65 63 6b 46 6f 72 53 51 4c 69 74 65 44 69  checkForSQLiteDi
1c740 72 65 63 74 6f 72 69 65 73 20 7b 20 63 68 61 6e  rectories { chan
1c750 6e 65 6c 20 7b 72 65 73 65 74 20 66 61 6c 73 65  nel {reset false
1c760 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a  } } {..      #..
1c770 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68        # NOTE: Ch
1c780 65 63 6b 20 69 66 20 74 68 65 20 73 71 6c 69 74  eck if the sqlit
1c790 65 33 5f 77 69 6e 33 32 5f 73 65 74 5f 64 69 72  e3_win32_set_dir
1c7a0 65 63 74 6f 72 79 20 66 75 6e 63 74 69 6f 6e 20  ectory function 
1c7b0 69 73 20 61 76 61 69 6c 61 62 6c 65 2e 0d 0a 20  is available... 
1c7c0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 74 70       #..      tp
1c7d0 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5c 0d 0a  uts $channel \..
1c7e0 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
1c7f0 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 66 75 6e  checking for fun
1c800 63 74 69 6f 6e 20 73 71 6c 69 74 65 33 5f 77 69  ction sqlite3_wi
1c810 6e 33 32 5f 73 65 74 5f 64 69 72 65 63 74 6f 72  n32_set_director
1c820 79 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 20 20  y... "....      
1c830 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
1c840 20 54 68 69 73 20 63 61 6c 6c 20 74 6f 20 74 68   This call to th
1c850 65 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f  e sqlite3_win32_
1c860 73 65 74 5f 64 69 72 65 63 74 6f 72 79 20 66 75  set_directory fu
1c870 6e 63 74 69 6f 6e 20 75 73 65 73 20 74 68 65 0d  nction uses the.
1c880 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 69  .      #       i
1c890 6e 76 61 6c 69 64 20 76 61 6c 75 65 20 30 20 66  nvalid value 0 f
1c8a0 6f 72 20 74 68 65 20 66 69 72 73 74 20 61 72 67  or the first arg
1c8b0 75 6d 65 6e 74 2e 20 20 54 68 69 73 20 63 6f 64  ument.  This cod
1c8c0 65 20 69 73 20 64 65 73 69 67 6e 65 64 0d 0a 20  e is designed.. 
1c8d0 20 20 20 20 20 23 20 20 20 20 20 20 20 74 6f 20       #       to 
1c8e0 63 68 65 63 6b 20 69 66 20 63 61 6c 6c 69 6e 67  check if calling
1c8f0 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 77 69   the function wi
1c900 6c 6c 20 72 61 69 73 65 20 61 6e 20 65 78 63 65  ll raise an exce
1c910 70 74 69 6f 6e 20 28 69 2e 65 2e 0d 0a 20 20 20  ption (i.e...   
1c920 20 20 20 23 20 20 20 20 20 20 20 74 68 65 20 61     #       the a
1c930 63 74 75 61 6c 20 72 65 73 75 6c 74 20 6f 66 20  ctual result of 
1c940 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65  the function doe
1c950 73 20 6e 6f 74 20 6d 61 74 74 65 72 20 61 73 20  s not matter as 
1c960 6c 6f 6e 67 20 61 73 20 6e 6f 0d 0a 20 20 20 20  long as no..    
1c970 20 20 23 20 20 20 20 20 20 20 64 69 72 65 63 74    #       direct
1c980 6f 72 79 20 69 73 20 63 68 61 6e 67 65 64 29 2e  ory is changed).
1c990 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
1c9a0 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20   if {[catch {.. 
1c9b0 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e         object in
1c9c0 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e  voke -flags +Non
1c9d0 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20  Public \..      
1c9e0 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74        System.Dat
1c9f0 61 2e 53 51 4c 69 74 65 2e 55 6e 73 61 66 65 4e  a.SQLite.UnsafeN
1ca00 61 74 69 76 65 4d 65 74 68 6f 64 73 20 5c 0d 0a  ativeMethods \..
1ca10 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
1ca20 74 65 33 5f 77 69 6e 33 32 5f 73 65 74 5f 64 69  te3_win32_set_di
1ca30 72 65 63 74 6f 72 79 20 30 20 6e 75 6c 6c 0d 0a  rectory 0 null..
1ca40 20 20 20 20 20 20 7d 5d 20 3d 3d 20 30 7d 20 74        }] == 0} t
1ca50 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  hen {..        #
1ca60 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
1ca70 3a 20 43 61 6c 6c 69 6e 67 20 74 68 65 20 73 71  : Calling the sq
1ca80 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 65 74 5f  lite3_win32_set_
1ca90 64 69 72 65 63 74 6f 72 79 20 66 75 6e 63 74 69  directory functi
1caa0 6f 6e 20 64 6f 65 73 20 6e 6f 74 0d 0a 20 20 20  on does not..   
1cab0 20 20 20 20 20 23 20 20 20 20 20 20 20 63 61 75       #       cau
1cac0 73 65 20 61 6e 20 65 78 63 65 70 74 69 6f 6e 3b  se an exception;
1cad0 20 74 68 65 72 65 66 6f 72 65 2c 20 69 74 20 6d   therefore, it m
1cae0 75 73 74 20 62 65 20 61 76 61 69 6c 61 62 6c 65  ust be available
1caf0 20 28 69 2e 65 2e 0d 0a 20 20 20 20 20 20 20 20   (i.e...        
1cb00 23 20 20 20 20 20 20 20 65 76 65 6e 20 74 68 6f  #       even tho
1cb10 75 67 68 20 69 74 20 73 68 6f 75 6c 64 20 72 65  ugh it should re
1cb20 74 75 72 6e 20 61 20 66 61 69 6c 75 72 65 20 72  turn a failure r
1cb30 65 74 75 72 6e 20 63 6f 64 65 20 69 6e 20 74 68  eturn code in th
1cb40 69 73 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  is..        #   
1cb50 20 20 20 20 63 61 73 65 29 2e 0d 0a 20 20 20 20      case)...    
1cb60 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 61      #..        a
1cb70 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 73 71 6c  ddConstraint sql
1cb80 69 74 65 33 5f 77 69 6e 33 32 5f 73 65 74 5f 64  ite3_win32_set_d
1cb90 69 72 65 63 74 6f 72 79 0d 0a 0d 0a 20 20 20 20  irectory....    
1cba0 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
1cbb0 65 6c 20 79 65 73 5c 6e 0d 0a 0d 0a 20 20 20 20  el yes\n....    
1cbc0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
1cbd0 20 4e 4f 54 45 3a 20 44 6f 65 73 20 6f 75 72 20   NOTE: Does our 
1cbe0 63 61 6c 6c 65 72 20 77 61 6e 74 20 74 6f 20 72  caller want to r
1cbf0 65 73 65 74 20 74 68 65 20 64 69 72 65 63 74 6f  eset the directo
1cc00 72 69 65 73 3f 0d 0a 20 20 20 20 20 20 20 20 23  ries?..        #
1cc10 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 24 72  ..        if {$r
1cc20 65 73 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  eset} then {..  
1cc30 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
1cc40 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4e 6f 77       # NOTE: Now
1cc50 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20 64   make sure the d
1cc60 61 74 61 62 61 73 65 20 61 6e 64 20 74 65 6d 70  atabase and temp
1cc70 6f 72 61 72 79 20 64 69 72 65 63 74 6f 72 69 65  orary directorie
1cc80 73 20 61 72 65 0d 0a 20 20 20 20 20 20 20 20 20  s are..         
1cc90 20 23 20 20 20 20 20 20 20 72 65 73 65 74 20 74   #       reset t
1cca0 68 65 69 72 20 64 65 66 61 75 6c 74 20 76 61 6c  heir default val
1ccb0 75 65 73 2c 20 77 68 69 63 68 20 73 68 6f 75 6c  ues, which shoul
1ccc0 64 20 62 65 20 6e 75 6c 6c 20 66 6f 72 20 62 6f  d be null for bo
1ccd0 74 68 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23  th...          #
1cce0 20 20 20 20 20 20 20 53 69 6e 63 65 20 74 68 65         Since the
1ccf0 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73   sqlite3_win32_s
1cd00 65 74 5f 64 69 72 65 63 74 6f 72 79 20 66 75 6e  et_directory fun
1cd10 63 74 69 6f 6e 20 69 73 20 61 76 61 69 6c 61 62  ction is availab
1cd20 6c 65 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 23  le,..          #
1cd30 20 20 20 20 20 20 20 75 73 65 20 69 74 2e 0d 0a         use it...
1cd40 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
1cd50 20 20 20 20 20 20 20 66 6f 72 20 7b 73 65 74 20         for {set 
1cd60 69 6e 64 65 78 20 31 7d 20 7b 24 69 6e 64 65 78  index 1} {$index
1cd70 20 3c 20 33 7d 20 7b 69 6e 63 72 20 69 6e 64 65   < 3} {incr inde
1cd80 78 7d 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  x} {..          
1cd90 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a    if {[catch {..
1cda0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 62                ob
1cdb0 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61  ject invoke -fla
1cdc0 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d  gs +NonPublic \.
1cdd0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1cde0 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53     System.Data.S
1cdf0 51 4c 69 74 65 2e 55 6e 73 61 66 65 4e 61 74 69  QLite.UnsafeNati
1ce00 76 65 4d 65 74 68 6f 64 73 20 5c 0d 0a 20 20 20  veMethods \..   
1ce10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
1ce20 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 65 74  qlite3_win32_set
1ce30 5f 64 69 72 65 63 74 6f 72 79 20 24 69 6e 64 65  _directory $inde
1ce40 78 20 6e 75 6c 6c 0d 0a 20 20 20 20 20 20 20 20  x null..        
1ce50 20 20 20 20 7d 20 72 65 73 75 6c 74 5d 20 3d 3d      } result] ==
1ce60 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
1ce70 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
1ce80 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  $channel [append
1ce90 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
1cea0 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
1ceb0 63 61 6c 6c 20 73 71 6c 69 74 65 33 5f 77 69 6e  call sqlite3_win
1cec0 33 32 5f 73 65 74 5f 64 69 72 65 63 74 6f 72 79  32_set_directory
1ced0 28 22 20 24 69 6e 64 65 78 20 5c 0d 0a 20 20 20  (" $index \..   
1cee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
1cef0 2c 20 6e 75 6c 6c 29 2e 2e 2e 20 6f 6b 3a 20 22  , null)... ok: "
1cf00 20 24 72 65 73 75 6c 74 20 5c 6e 5d 0d 0a 20 20   $result \n]..  
1cf10 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65            } else
1cf20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
1cf30 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
1cf40 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
1cf50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cf60 20 20 22 2d 2d 2d 2d 20 63 61 6c 6c 20 73 71 6c    "---- call sql
1cf70 69 74 65 33 5f 77 69 6e 33 32 5f 73 65 74 5f 64  ite3_win32_set_d
1cf80 69 72 65 63 74 6f 72 79 28 22 20 24 69 6e 64 65  irectory(" $inde
1cf90 78 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  x \..           
1cfa0 20 20 20 20 20 20 20 22 2c 20 6e 75 6c 6c 29 2e         ", null).
1cfb0 2e 2e 20 65 72 72 6f 72 3a 20 22 20 5c 6e 5c 74  .. error: " \n\t
1cfc0 20 24 72 65 73 75 6c 74 20 5c 6e 5d 0d 0a 20 20   $result \n]..  
1cfd0 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
1cfe0 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
1cff0 20 20 7d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73    }..      } els
1d000 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75  e {..        tpu
1d010 74 73 20 24 63 68 61 6e 6e 65 6c 20 6e 6f 5c 6e  ts $channel no\n
1d020 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  ....        #.. 
1d030 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 44         # NOTE: D
1d040 6f 65 73 20 6f 75 72 20 63 61 6c 6c 65 72 20 77  oes our caller w
1d050 61 6e 74 20 74 6f 20 72 65 73 65 74 20 74 68 65  ant to reset the
1d060 20 64 69 72 65 63 74 6f 72 69 65 73 3f 20 20 54   directories?  T
1d070 68 69 73 20 63 61 6e 20 6f 6e 6c 79 0d 0a 20 20  his can only..  
1d080 20 20 20 20 20 20 23 20 20 20 20 20 20 20 62 65        #       be
1d090 20 70 65 72 66 6f 72 6d 65 64 20 69 66 20 53 51   performed if SQ
1d0a0 4c 69 74 65 20 69 73 20 6c 6f 61 64 65 64 20 61  Lite is loaded a
1d0b0 6e 64 20 72 65 61 64 79 20 66 6f 72 20 75 73 65  nd ready for use
1d0c0 20 62 79 20 74 68 65 20 74 65 73 74 0d 0a 20 20   by the test..  
1d0d0 20 20 20 20 20 20 23 20 20 20 20 20 20 20 73 75        #       su
1d0e0 69 74 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  ite...        #.
1d0f0 0a 20 20 20 20 20 20 20 20 69 66 20 7b 24 72 65  .        if {$re
1d100 73 65 74 20 26 26 20 5b 69 73 53 51 4c 69 74 65  set && [isSQLite
1d110 52 65 61 64 79 5d 7d 20 74 68 65 6e 20 7b 0d 0a  Ready]} then {..
1d120 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
1d130 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4e         # NOTE: N
1d140 6f 77 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65  ow make sure the
1d150 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 74 65   database and te
1d160 6d 70 6f 72 61 72 79 20 64 69 72 65 63 74 6f 72  mporary director
1d170 69 65 73 20 61 72 65 0d 0a 20 20 20 20 20 20 20  ies are..       
1d180 20 20 20 23 20 20 20 20 20 20 20 72 65 73 65 74     #       reset
1d190 20 74 68 65 69 72 20 64 65 66 61 75 6c 74 20 76   their default v
1d1a0 61 6c 75 65 73 2c 20 77 68 69 63 68 20 73 68 6f  alues, which sho
1d1b0 75 6c 64 20 62 65 20 6e 75 6c 6c 20 66 6f 72 20  uld be null for 
1d1c0 62 6f 74 68 2e 0d 0a 20 20 20 20 20 20 20 20 20  both...         
1d1d0 20 23 20 20 20 20 20 20 20 53 69 6e 63 65 20 74   #       Since t
1d1e0 68 65 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32  he sqlite3_win32
1d1f0 5f 73 65 74 5f 64 69 72 65 63 74 6f 72 79 20 66  _set_directory f
1d200 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74  unction does not
1d210 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 20 20  ..          #   
1d220 20 20 20 20 61 70 70 65 61 72 20 74 6f 20 62 65      appear to be
1d230 20 61 76 61 69 6c 61 62 6c 65 2c 20 75 73 65 20   available, use 
1d240 74 68 65 20 61 73 73 6f 63 69 61 74 65 64 20 50  the associated P
1d250 52 41 47 4d 41 20 63 6f 6d 6d 61 6e 64 73 0d 0a  RAGMA commands..
1d260 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20            #     
1d270 20 20 69 6e 73 74 65 61 64 2e 0d 0a 20 20 20 20    instead...    
1d280 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
1d290 20 20 20 66 6f 72 65 61 63 68 20 64 69 72 65 63     foreach direc
1d2a0 74 6f 72 79 20 5b 6c 69 73 74 20 64 61 74 61 5f  tory [list data_
1d2b0 73 74 6f 72 65 5f 64 69 72 65 63 74 6f 72 79 20  store_directory 
1d2c0 74 65 6d 70 5f 73 74 6f 72 65 5f 64 69 72 65 63  temp_store_direc
1d2d0 74 6f 72 79 5d 20 7b 0d 0a 20 20 20 20 20 20 20  tory] {..       
1d2e0 20 20 20 20 20 73 65 74 20 73 71 6c 20 5b 61 70       set sql [ap
1d2f0 70 65 6e 64 41 72 67 73 20 22 50 52 41 47 4d 41  pendArgs "PRAGMA
1d300 20 22 20 24 64 69 72 65 63 74 6f 72 79 20 22 20   " $directory " 
1d310 3d 20 5c 22 5c 22 3b 22 5d 0d 0a 0d 0a 20 20 20  = \"\";"]....   
1d320 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61           if {[ca
1d330 74 63 68 20 7b 65 78 65 63 75 74 65 53 71 6c 20  tch {executeSql 
1d340 24 73 71 6c 7d 20 72 65 73 75 6c 74 5d 20 3d 3d  $sql} result] ==
1d350 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
1d360 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
1d370 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  $channel [append
1d380 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
1d390 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
1d3a0 65 78 65 63 75 74 65 20 50 52 41 47 4d 41 20 22  execute PRAGMA "
1d3b0 20 24 64 69 72 65 63 74 6f 72 79 20 22 2e 2e 2e   $directory "...
1d3c0 20 6f 6b 3a 20 5c 22 22 20 5c 0d 0a 20 20 20 20   ok: \"" \..    
1d3d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 24 72                $r
1d3e0 65 73 75 6c 74 20 5c 22 5c 6e 5d 0d 0a 20 20 20  esult \"\n]..   
1d3f0 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20           } else 
1d400 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
1d410 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
1d420 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
1d430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d440 20 22 2d 2d 2d 2d 20 65 78 65 63 75 74 65 20 50   "---- execute P
1d450 52 41 47 4d 41 20 22 20 24 64 69 72 65 63 74 6f  RAGMA " $directo
1d460 72 79 20 22 2e 2e 2e 20 65 72 72 6f 72 3a 20 22  ry "... error: "
1d470 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
1d480 20 20 20 20 20 20 5c 6e 5c 74 20 24 72 65 73 75        \n\t $resu
1d490 6c 74 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20  lt \n]..        
1d4a0 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
1d4b0 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20   }..        }.. 
1d4c0 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
1d4d0 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
1d4e0 20 46 69 6e 61 6c 6c 79 2c 20 73 68 6f 77 20 74   Finally, show t
1d4f0 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65  he current value
1d500 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
1d510 20 61 6e 64 20 74 65 6d 70 6f 72 61 72 79 0d 0a   and temporary..
1d520 20 20 20 20 20 20 23 20 20 20 20 20 20 20 64 69        #       di
1d530 72 65 63 74 6f 72 69 65 73 2e 20 20 54 68 69 73  rectories.  This
1d540 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20 70 65 72   can only be per
1d550 66 6f 72 6d 65 64 20 69 66 20 53 51 4c 69 74 65  formed if SQLite
1d560 20 69 73 20 6c 6f 61 64 65 64 0d 0a 20 20 20 20   is loaded..    
1d570 20 20 23 20 20 20 20 20 20 20 61 6e 64 20 72 65    #       and re
1d580 61 64 79 20 66 6f 72 20 75 73 65 20 62 79 20 74  ady for use by t
1d590 68 65 20 74 65 73 74 20 73 75 69 74 65 2e 0d 0a  he test suite...
1d5a0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69        #..      i
1d5b0 66 20 7b 5b 69 73 53 51 4c 69 74 65 52 65 61 64  f {[isSQLiteRead
1d5c0 79 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  y]} then {..    
1d5d0 20 20 20 20 66 6f 72 65 61 63 68 20 64 69 72 65      foreach dire
1d5e0 63 74 6f 72 79 20 5b 6c 69 73 74 20 64 61 74 61  ctory [list data
1d5f0 5f 73 74 6f 72 65 5f 64 69 72 65 63 74 6f 72 79  _store_directory
1d600 20 74 65 6d 70 5f 73 74 6f 72 65 5f 64 69 72 65   temp_store_dire
1d610 63 74 6f 72 79 5d 20 7b 0d 0a 20 20 20 20 20 20  ctory] {..      
1d620 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
1d630 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 22  el [appendArgs "
1d640 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e 67 20 22 20  ---- checking " 
1d650 24 64 69 72 65 63 74 6f 72 79 20 22 2e 2e 2e 20  $directory "... 
1d660 22 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  "]....          
1d670 73 65 74 20 73 71 6c 20 5b 61 70 70 65 6e 64 41  set sql [appendA
1d680 72 67 73 20 22 50 52 41 47 4d 41 20 22 20 24 64  rgs "PRAGMA " $d
1d690 69 72 65 63 74 6f 72 79 20 5c 3b 5d 0d 0a 0d 0a  irectory \;]....
1d6a0 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63            if {[c
1d6b0 61 74 63 68 20 7b 65 78 65 63 75 74 65 53 71 6c  atch {executeSql
1d6c0 20 24 73 71 6c 20 73 63 61 6c 61 72 7d 20 72 65   $sql scalar} re
1d6d0 73 75 6c 74 5d 20 3d 3d 20 30 7d 20 74 68 65 6e  sult] == 0} then
1d6e0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
1d6f0 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b  tputs $channel [
1d700 61 70 70 65 6e 64 41 72 67 73 20 22 6f 6b 3a 20  appendArgs "ok: 
1d710 5c 22 22 20 24 72 65 73 75 6c 74 20 5c 22 5c 6e  \"" $result \"\n
1d720 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 20 65  ]..          } e
1d730 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  lse {..         
1d740 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
1d750 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 22 65  l [appendArgs "e
1d760 72 72 6f 72 3a 20 22 20 5c 6e 5c 74 20 24 72 65  rror: " \n\t $re
1d770 73 75 6c 74 20 5c 6e 5d 0d 0a 20 20 20 20 20 20  sult \n]..      
1d780 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d      }..        }
1d790 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d  ..      }..    }
1d7a0 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 6c 6f  .....    proc lo
1d7b0 61 64 53 51 4c 69 74 65 54 65 73 74 53 65 74 74  adSQLiteTestSett
1d7c0 69 6e 67 73 20 7b 20 63 68 61 6e 6e 65 6c 20 7b  ings { channel {
1d7d0 73 75 66 66 69 78 20 22 22 7d 20 7b 71 75 69 65  suffix ""} {quie
1d7e0 74 20 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a 20 20  t false} } {..  
1d7f0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
1d800 4f 54 45 3a 20 53 6b 69 70 20 6c 6f 61 64 69 6e  OTE: Skip loadin
1d810 67 20 74 68 65 20 73 65 74 74 69 6e 67 73 20 69  g the settings i
1d820 66 20 74 68 65 69 72 20 75 73 61 67 65 20 68 61  f their usage ha
1d830 73 20 62 65 65 6e 20 64 69 73 61 62 6c 65 64 2e  s been disabled.
1d840 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
1d850 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73   if {![info exis
1d860 74 73 20 3a 3a 6e 6f 28 73 71 6c 69 74 65 54 65  ts ::no(sqliteTe
1d870 73 74 53 65 74 74 69 6e 67 73 29 5d 7d 20 74 68  stSettings)]} th
1d880 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d  en {..        #.
1d890 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
1d8a0 20 4c 6f 61 64 20 63 75 73 74 6f 6d 20 70 65 72   Load custom per
1d8b0 2d 75 73 65 72 20 61 6e 64 2f 6f 72 20 70 65 72  -user and/or per
1d8c0 2d 68 6f 73 74 20 74 65 73 74 20 73 65 74 74 69  -host test setti
1d8d0 6e 67 73 20 6e 6f 77 2e 0d 0a 20 20 20 20 20 20  ngs now...      
1d8e0 20 20 23 0d 0a 20 20 20 20 20 20 20 20 69 66 20    #..        if 
1d8f0 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  {[info exists ::
1d900 74 63 6c 5f 70 6c 61 74 66 6f 72 6d 28 75 73 65  tcl_platform(use
1d910 72 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  r)]} then {..   
1d920 20 20 20 20 20 20 20 73 65 74 20 75 73 65 72 53         set userS
1d930 65 74 74 69 6e 67 73 46 69 6c 65 4e 61 6d 65 20  ettingsFileName 
1d940 5b 66 69 6c 65 20 6a 6f 69 6e 20 5b 67 65 74 43  [file join [getC
1d950 6f 6d 6d 6f 6e 44 69 72 65 63 74 6f 72 79 5d 20  ommonDirectory] 
1d960 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
1d970 20 5b 61 70 70 65 6e 64 41 72 67 73 20 73 65 74   [appendArgs set
1d980 74 69 6e 67 73 20 24 73 75 66 66 69 78 20 2e 20  tings $suffix . 
1d990 24 3a 3a 74 63 6c 5f 70 6c 61 74 66 6f 72 6d 28  $::tcl_platform(
1d9a0 75 73 65 72 29 20 2e 65 61 67 6c 65 5d 5d 0d 0a  user) .eagle]]..
1d9b0 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b  ..          if {
1d9c0 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24 75 73  [file exists $us
1d9d0 65 72 53 65 74 74 69 6e 67 73 46 69 6c 65 4e 61  erSettingsFileNa
1d9e0 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  me]} then {..   
1d9f0 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71           if {!$q
1da00 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  uiet} then {..  
1da10 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
1da20 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  s $channel [appe
1da30 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
1da40 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
1da50 2d 20 6c 6f 61 64 69 6e 67 20 70 65 72 2d 75 73  - loading per-us
1da60 65 72 20 74 65 73 74 20 73 65 74 74 69 6e 67 73  er test settings
1da70 20 66 69 6c 65 20 5c 22 22 20 5c 0d 0a 20 20 20   file \"" \..   
1da80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 24                 $
1da90 75 73 65 72 53 65 74 74 69 6e 67 73 46 69 6c 65  userSettingsFile
1daa0 4e 61 6d 65 20 5c 22 2e 2e 2e 5c 6e 5d 0d 0a 20  Name \"...\n].. 
1dab0 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a             }....
1dac0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b              if {
1dad0 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20  [catch {..      
1dae0 20 20 20 20 20 20 20 20 75 70 6c 65 76 65 6c 20          uplevel 
1daf0 31 20 5b 6c 69 73 74 20 73 6f 75 72 63 65 20 24  1 [list source $
1db00 75 73 65 72 53 65 74 74 69 6e 67 73 46 69 6c 65  userSettingsFile
1db10 4e 61 6d 65 5d 0d 0a 20 20 20 20 20 20 20 20 20  Name]..         
1db20 20 20 20 7d 20 65 72 72 6f 72 5d 7d 20 74 68 65     } error]} the
1db30 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
1db40 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20     if {!$quiet} 
1db50 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
1db60 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
1db70 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
1db80 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
1db90 20 20 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20            "==== 
1dba0 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20  WARNING: failed 
1dbb0 74 6f 20 6c 6f 61 64 20 70 65 72 2d 75 73 65 72  to load per-user
1dbc0 20 73 65 74 74 69 6e 67 73 20 66 69 6c 65 20 5c   settings file \
1dbd0 22 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  "" \..          
1dbe0 20 20 20 20 20 20 20 20 20 20 24 75 73 65 72 53            $userS
1dbf0 65 74 74 69 6e 67 73 46 69 6c 65 4e 61 6d 65 20  ettingsFileName 
1dc00 22 5c 22 2c 20 65 72 72 6f 72 3a 20 22 20 5c 6e  "\", error: " \n
1dc10 5c 74 20 24 65 72 72 6f 72 20 5c 6e 5d 0d 0a 20  \t $error \n].. 
1dc20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a               }..
1dc30 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
1dc40 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20           } else 
1dc50 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  {..            i
1dc60 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e  f {!$quiet} then
1dc70 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
1dc80 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
1dc90 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
1dca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dcb0 20 20 22 2d 2d 2d 2d 20 73 6b 69 70 70 65 64 20    "---- skipped 
1dcc0 6c 6f 61 64 69 6e 67 20 70 65 72 2d 75 73 65 72  loading per-user
1dcd0 20 74 65 73 74 20 73 65 74 74 69 6e 67 73 20 66   test settings f
1dce0 69 6c 65 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20  ile \"" \..     
1dcf0 20 20 20 20 20 20 20 20 20 20 20 20 20 24 75 73               $us
1dd00 65 72 53 65 74 74 69 6e 67 73 46 69 6c 65 4e 61  erSettingsFileNa
1dd10 6d 65 20 22 5c 22 2c 20 69 74 20 64 6f 65 73 20  me "\", it does 
1dd20 6e 6f 74 20 65 78 69 73 74 5c 6e 22 5d 0d 0a 20  not exist\n"].. 
1dd30 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
1dd40 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
1dd50 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
1dd60 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1dd70 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1dd80 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1dd90 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1dda0 23 23 23 23 23 23 23 0d 0a 0d 0a 20 20 20 20 20  #######....     
1ddb0 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69     if {[info exi
1ddc0 73 74 73 20 3a 3a 74 63 6c 5f 70 6c 61 74 66 6f  sts ::tcl_platfo
1ddd0 72 6d 28 68 6f 73 74 29 5d 7d 20 74 68 65 6e 20  rm(host)]} then 
1dde0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74  {..          set
1ddf0 20 68 6f 73 74 53 65 74 74 69 6e 67 73 46 69 6c   hostSettingsFil
1de00 65 4e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e  eName [file join
1de10 20 5b 67 65 74 43 6f 6d 6d 6f 6e 44 69 72 65 63   [getCommonDirec
1de20 74 6f 72 79 5d 20 5c 0d 0a 20 20 20 20 20 20 20  tory] \..       
1de30 20 20 20 20 20 20 20 5b 61 70 70 65 6e 64 41 72         [appendAr
1de40 67 73 20 73 65 74 74 69 6e 67 73 20 24 73 75 66  gs settings $suf
1de50 66 69 78 20 2e 20 24 3a 3a 74 63 6c 5f 70 6c 61  fix . $::tcl_pla
1de60 74 66 6f 72 6d 28 68 6f 73 74 29 20 2e 65 61 67  tform(host) .eag
1de70 6c 65 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  le]]....        
1de80 20 20 69 66 20 7b 5b 66 69 6c 65 20 65 78 69 73    if {[file exis
1de90 74 73 20 24 68 6f 73 74 53 65 74 74 69 6e 67 73  ts $hostSettings
1dea0 46 69 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20  FileName]} then 
1deb0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  {..            i
1dec0 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e  f {!$quiet} then
1ded0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
1dee0 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
1def0 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
1df00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1df10 20 20 22 2d 2d 2d 2d 20 6c 6f 61 64 69 6e 67 20    "---- loading 
1df20 70 65 72 2d 68 6f 73 74 20 74 65 73 74 20 73 65  per-host test se
1df30 74 74 69 6e 67 73 20 66 69 6c 65 20 5c 22 22 20  ttings file \"" 
1df40 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
1df50 20 20 20 20 20 24 68 6f 73 74 53 65 74 74 69 6e       $hostSettin
1df60 67 73 46 69 6c 65 4e 61 6d 65 20 5c 22 2e 2e 2e  gsFileName \"...
1df70 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20  \n]..           
1df80 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   }....          
1df90 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a    if {[catch {..
1dfa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 75 70                up
1dfb0 6c 65 76 65 6c 20 31 20 5b 6c 69 73 74 20 73 6f  level 1 [list so
1dfc0 75 72 63 65 20 24 68 6f 73 74 53 65 74 74 69 6e  urce $hostSettin
1dfd0 67 73 46 69 6c 65 4e 61 6d 65 5d 0d 0a 20 20 20  gsFileName]..   
1dfe0 20 20 20 20 20 20 20 20 20 7d 20 65 72 72 6f 72           } error
1dff0 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
1e000 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71           if {!$q
1e010 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  uiet} then {..  
1e020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 70                tp
1e030 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70  uts $channel [ap
1e040 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
1e050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e060 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66  "==== WARNING: f
1e070 61 69 6c 65 64 20 74 6f 20 6c 6f 61 64 20 70 65  ailed to load pe
1e080 72 2d 68 6f 73 74 20 73 65 74 74 69 6e 67 73 20  r-host settings 
1e090 66 69 6c 65 20 5c 22 22 20 5c 0d 0a 20 20 20 20  file \"" \..    
1e0a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e0b0 24 68 6f 73 74 53 65 74 74 69 6e 67 73 46 69 6c  $hostSettingsFil
1e0c0 65 4e 61 6d 65 20 22 5c 22 2c 20 65 72 72 6f 72  eName "\", error
1e0d0 3a 20 22 20 5c 6e 5c 74 20 24 65 72 72 6f 72 20  : " \n\t $error 
1e0e0 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20  \n]..           
1e0f0 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
1e100 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d    }..          }
1e110 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
1e120 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74       if {!$quiet
1e130 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
1e140 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
1e150 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
1e160 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
1e170 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 73 6b          "---- sk
1e180 69 70 70 65 64 20 6c 6f 61 64 69 6e 67 20 70 65  ipped loading pe
1e190 72 2d 68 6f 73 74 20 74 65 73 74 20 73 65 74 74  r-host test sett
1e1a0 69 6e 67 73 20 66 69 6c 65 20 5c 22 22 20 5c 0d  ings file \"" \.
1e1b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1e1c0 20 20 20 24 68 6f 73 74 53 65 74 74 69 6e 67 73     $hostSettings
1e1d0 46 69 6c 65 4e 61 6d 65 20 22 5c 22 2c 20 69 74  FileName "\", it
1e1e0 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 5c   does not exist\
1e1f0 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n"]..           
1e200 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d   }..          }.
1e210 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  .        }..    
1e220 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20    }..    }..... 
1e230 20 20 20 70 72 6f 63 20 72 75 6e 53 51 4c 69 74     proc runSQLit
1e240 65 54 65 73 74 50 72 6f 6c 6f 67 75 65 20 7b 7d  eTestPrologue {}
1e250 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20   {..      #..   
1e260 20 20 20 23 20 4e 4f 54 45 3a 20 53 6b 69 70 20     # NOTE: Skip 
1e270 72 75 6e 6e 69 6e 67 20 6f 75 72 20 63 75 73 74  running our cust
1e280 6f 6d 20 70 72 6f 6c 6f 67 75 65 20 69 66 20 74  om prologue if t
1e290 68 65 20 6d 61 69 6e 20 6f 6e 65 20 68 61 73 20  he main one has 
1e2a0 62 65 65 6e 0d 0a 20 20 20 20 20 20 23 20 20 20  been..      #   
1e2b0 20 20 20 20 73 6b 69 70 70 65 64 2e 0d 0a 20 20      skipped...  
1e2c0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20      #..      if 
1e2d0 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a  {![info exists :
1e2e0 3a 6e 6f 28 70 72 6f 6c 6f 67 75 65 2e 65 61 67  :no(prologue.eag
1e2f0 6c 65 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  le)]} then {..  
1e300 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
1e310 20 23 20 4e 4f 54 45 3a 20 4c 6f 61 64 20 74 68   # NOTE: Load th
1e320 65 20 22 62 65 66 6f 72 65 2d 63 6f 6e 73 74 72  e "before-constr
1e330 61 69 6e 74 73 22 20 63 75 73 74 6f 6d 20 70 65  aints" custom pe
1e340 72 2d 75 73 65 72 20 61 6e 64 2f 6f 72 20 70 65  r-user and/or pe
1e350 72 2d 68 6f 73 74 0d 0a 20 20 20 20 20 20 20 20  r-host..        
1e360 23 20 20 20 20 20 20 20 74 65 73 74 20 73 65 74  #       test set
1e370 74 69 6e 67 73 20 6e 6f 77 2e 0d 0a 20 20 20 20  tings now...    
1e380 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 75      #..        u
1e390 70 6c 65 76 65 6c 20 31 20 5b 6c 69 73 74 20 6c  plevel 1 [list l
1e3a0 6f 61 64 53 51 4c 69 74 65 54 65 73 74 53 65 74  oadSQLiteTestSet
1e3b0 74 69 6e 67 73 20 24 3a 3a 74 65 73 74 5f 63 68  tings $::test_ch
1e3c0 61 6e 6e 65 6c 20 2e 62 65 66 6f 72 65 5d 0d 0a  annel .before]..
1e3d0 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
1e3e0 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68 65       # NOTE: Che
1e3f0 63 6b 20 69 66 20 74 68 65 20 5b 6f 62 6a 65 63  ck if the [objec
1e400 74 5d 20 63 6f 6d 6d 61 6e 64 20 69 73 20 61 76  t] command is av
1e410 61 69 6c 61 62 6c 65 3b 20 69 66 20 6e 6f 74 2c  ailable; if not,
1e420 20 61 64 64 20 73 6f 6d 65 0d 0a 20 20 20 20 20   add some..     
1e430 20 20 20 23 20 20 20 20 20 20 20 73 68 69 6d 73     #       shims
1e440 20 74 6f 20 6d 61 6b 65 20 74 68 65 20 74 65 73   to make the tes
1e450 74 20 73 75 69 74 65 20 72 75 6e 20 73 6d 6f 6f  t suite run smoo
1e460 74 68 65 72 2e 0d 0a 20 20 20 20 20 20 20 20 23  ther...        #
1e470 0d 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b 46  ..        checkF
1e480 6f 72 53 51 4c 69 74 65 4f 62 6a 65 63 74 43 6f  orSQLiteObjectCo
1e490 6d 6d 61 6e 64 20 24 3a 3a 74 65 73 74 5f 63 68  mmand $::test_ch
1e4a0 61 6e 6e 65 6c 0d 0a 0d 0a 20 20 20 20 20 20 20  annel....       
1e4b0 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
1e4c0 54 45 3a 20 44 65 74 65 72 6d 69 6e 65 20 74 68  TE: Determine th
1e4d0 65 20 6e 61 6d 65 73 20 6f 66 20 74 68 65 20 6e  e names of the n
1e4e0 61 74 69 76 65 20 70 6c 61 74 66 6f 72 6d 20 61  ative platform a
1e4f0 6e 64 20 61 72 63 68 69 74 65 63 74 75 72 65 2e  nd architecture.
1e500 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
1e510 20 20 20 20 20 73 65 74 20 70 6c 61 74 66 6f 72       set platfor
1e520 6d 20 5b 67 65 74 42 75 69 6c 64 50 6c 61 74 66  m [getBuildPlatf
1e530 6f 72 6d 20 74 72 75 65 5d 0d 0a 20 20 20 20 20  orm true]..     
1e540 20 20 20 73 65 74 20 61 72 63 68 69 74 65 63 74     set architect
1e550 75 72 65 20 5b 61 72 63 68 69 74 65 63 74 75 72  ure [architectur
1e560 65 46 6f 72 50 6c 61 74 66 6f 72 6d 20 24 70 6c  eForPlatform $pl
1e570 61 74 66 6f 72 6d 5d 0d 0a 0d 0a 20 20 20 20 20  atform]....     
1e580 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
1e590 4e 4f 54 45 3a 20 53 68 6f 77 20 74 68 65 20 70  NOTE: Show the p
1e5a0 6c 61 74 66 6f 72 6d 20 61 6e 64 20 61 72 63 68  latform and arch
1e5b0 69 74 65 63 74 75 72 65 20 75 73 65 64 20 74 6f  itecture used to
1e5c0 20 68 65 6c 70 20 6c 6f 63 61 74 65 20 74 68 65   help locate the
1e5d0 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
1e5e0 20 20 6e 61 74 69 76 65 20 62 75 69 6c 64 20 66    native build f
1e5f0 69 6c 65 73 2e 0d 0a 20 20 20 20 20 20 20 20 23  iles...        #
1e600 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20  ..        tputs 
1e610 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
1e620 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
1e630 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
1e640 20 70 6c 61 74 66 6f 72 6d 20 66 6f 72 20 6c 6f   platform for lo
1e650 63 61 74 69 6e 67 20 6e 61 74 69 76 65 20 62 75  cating native bu
1e660 69 6c 64 20 66 69 6c 65 73 20 69 73 20 5c 22 22  ild files is \""
1e670 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
1e680 24 70 6c 61 74 66 6f 72 6d 20 5c 22 5c 6e 5d 0d  $platform \"\n].
1e690 0a 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73  ...        tputs
1e6a0 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
1e6b0 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
1e6c0 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
1e6d0 2d 20 61 72 63 68 69 74 65 63 74 75 72 65 20 66  - architecture f
1e6e0 6f 72 20 6c 6f 63 61 74 69 6e 67 20 6e 61 74 69  or locating nati
1e6f0 76 65 20 62 75 69 6c 64 20 66 69 6c 65 73 20 69  ve build files i
1e700 73 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20 20  s \"" \..       
1e710 20 20 20 20 20 24 61 72 63 68 69 74 65 63 74 75       $architectu
1e720 72 65 20 5c 22 5c 6e 5d 0d 0a 0d 0a 20 20 20 20  re \"\n]....    
1e730 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
1e740 20 4e 4f 54 45 3a 20 42 75 69 6c 64 20 61 20 6c   NOTE: Build a l
1e750 69 73 74 20 6f 66 20 63 6f 6e 66 69 67 75 72 61  ist of configura
1e760 74 69 6f 6e 20 66 69 6c 65 73 20 74 68 61 74 20  tion files that 
1e770 77 65 20 68 61 6e 64 6c 65 2e 0d 0a 20 20 20 20  we handle...    
1e780 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 73      #..        s
1e790 65 74 20 63 6f 6e 66 69 67 46 69 6c 65 4e 61 6d  et configFileNam
1e7a0 65 73 20 5b 6c 69 73 74 20 5c 0d 0a 20 20 20 20  es [list \..    
1e7b0 20 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44          System.D
1e7c0 61 74 61 2e 53 51 4c 69 74 65 2e 64 6c 6c 2e 63  ata.SQLite.dll.c
1e7d0 6f 6e 66 69 67 5d 0d 0a 0d 0a 20 20 20 20 20 20  onfig]....      
1e7e0 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
1e7f0 4f 54 45 3a 20 42 75 69 6c 64 20 61 20 6c 69 73  OTE: Build a lis
1e800 74 20 6f 66 20 61 75 78 69 6c 69 61 72 79 20 4d  t of auxiliary M
1e810 61 6e 61 67 65 64 20 44 65 62 75 67 67 69 6e 67  anaged Debugging
1e820 20 41 73 73 69 73 74 61 6e 74 73 20 28 4d 44 41   Assistants (MDA
1e830 29 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  )..        #    
1e840 20 20 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e     configuration
1e850 20 66 69 6c 65 73 20 74 68 61 74 20 77 65 20 68   files that we h
1e860 61 6e 64 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20  andle...        
1e870 23 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 6d  #..        set m
1e880 64 61 43 6f 6e 66 69 67 46 69 6c 65 4e 61 6d 65  daConfigFileName
1e890 73 20 5b 6c 69 73 74 20 5c 0d 0a 20 20 20 20 20  s [list \..     
1e8a0 20 20 20 20 20 20 20 45 61 67 6c 65 53 68 65 6c         EagleShel
1e8b0 6c 33 32 2e 65 78 65 2e 6d 64 61 2e 63 6f 6e 66  l32.exe.mda.conf
1e8c0 69 67 20 49 6e 73 74 61 6c 6c 65 72 2e 65 78 65  ig Installer.exe
1e8d0 2e 6d 64 61 2e 63 6f 6e 66 69 67 20 5c 0d 0a 20  .mda.config \.. 
1e8e0 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 2e             test.
1e8f0 65 78 65 2e 6d 64 61 2e 63 6f 6e 66 69 67 20 74  exe.mda.config t
1e900 65 73 74 6c 69 6e 71 2e 65 78 65 2e 6d 64 61 2e  estlinq.exe.mda.
1e910 63 6f 6e 66 69 67 20 5c 0d 0a 20 20 20 20 20 20  config \..      
1e920 20 20 20 20 20 20 74 65 73 74 65 66 36 2e 65 78        testef6.ex
1e930 65 2e 6d 64 61 2e 63 6f 6e 66 69 67 5d 0d 0a 0d  e.mda.config]...
1e940 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
1e950 20 20 20 20 23 20 4e 4f 54 45 3a 20 42 75 69 6c      # NOTE: Buil
1e960 64 20 74 68 65 20 6c 69 73 74 20 6f 66 20 65 78  d the list of ex
1e970 74 65 72 6e 61 6c 20 66 69 6c 65 73 20 74 68 61  ternal files tha
1e980 74 20 77 65 20 68 61 6e 64 6c 65 2e 20 20 53 6f  t we handle.  So
1e990 6d 65 20 6f 66 0d 0a 20 20 20 20 20 20 20 20 23  me of..        #
1e9a0 20 20 20 20 20 20 20 74 68 65 73 65 20 66 69 6c         these fil
1e9b0 65 73 20 6d 61 79 20 62 65 20 6e 61 74 69 76 65  es may be native
1e9c0 20 61 6e 64 2f 6f 72 20 6d 61 6e 61 67 65 64 20   and/or managed 
1e9d0 61 73 73 65 6d 62 6c 69 65 73 20 74 68 61 74 20  assemblies that 
1e9e0 61 72 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20  are..        #  
1e9f0 20 20 20 20 20 72 65 71 75 69 72 65 64 20 74 6f       required to
1ea00 20 70 65 72 66 6f 72 6d 20 76 61 72 69 6f 75 73   perform various
1ea10 20 74 65 73 74 73 2e 0d 0a 20 20 20 20 20 20 20   tests...       
1ea20 20 23 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20   #..        set 
1ea30 65 78 74 65 72 6e 61 6c 46 69 6c 65 4e 61 6d 65  externalFileName
1ea40 73 20 5b 6c 69 73 74 20 5c 0d 0a 20 20 20 20 20  s [list \..     
1ea50 20 20 20 20 20 20 20 5b 66 69 6c 65 20 6a 6f 69         [file joi
1ea60 6e 20 45 6e 74 69 74 79 46 72 61 6d 65 77 6f 72  n EntityFramewor
1ea70 6b 20 6c 69 62 20 5b 73 74 72 69 6e 67 20 6d 61  k lib [string ma
1ea80 70 20 5b 6c 69 73 74 20 46 78 20 22 22 5d 20 5b  p [list Fx ""] [
1ea90 73 74 72 69 6e 67 20 5c 0d 0a 20 20 20 20 20 20  string \..      
1eaa0 20 20 20 20 20 20 6d 61 70 20 5b 6c 69 73 74 20        map [list 
1eab0 6e 65 74 46 78 34 35 31 20 6e 65 74 46 78 34 35  netFx451 netFx45
1eac0 20 6e 65 74 46 78 34 35 32 20 6e 65 74 46 78 34   netFx452 netFx4
1ead0 35 20 6e 65 74 46 78 34 36 20 6e 65 74 46 78 34  5 netFx46 netFx4
1eae0 35 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  5 \..           
1eaf0 20 6e 65 74 46 78 34 36 31 20 6e 65 74 46 78 34   netFx461 netFx4
1eb00 35 5d 20 5b 67 65 74 42 75 69 6c 64 4e 65 74 46  5] [getBuildNetF
1eb10 78 5d 5d 5d 20 45 6e 74 69 74 79 46 72 61 6d 65  x]]] EntityFrame
1eb20 77 6f 72 6b 2e 64 6c 6c 5d 5d 0d 0a 0d 0a 20 20  work.dll]]....  
1eb30 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
1eb40 20 23 20 4e 4f 54 45 3a 20 42 75 69 6c 64 20 74   # NOTE: Build t
1eb50 68 65 20 6c 69 73 74 20 6f 66 20 6e 61 74 69 76  he list of nativ
1eb60 65 20 61 73 73 65 6d 62 6c 79 20 66 69 6c 65 73  e assembly files
1eb70 20 74 68 61 74 20 77 65 20 68 61 6e 64 6c 65 2e   that we handle.
1eb80 20 20 54 68 65 0d 0a 20 20 20 20 20 20 20 20 23    The..        #
1eb90 20 20 20 20 20 20 20 72 65 61 73 6f 6e 20 74 68         reason th
1eba0 65 20 22 53 79 73 74 65 6d 2e 44 61 74 61 2e 53  e "System.Data.S
1ebb0 51 4c 69 74 65 2e 64 6c 6c 22 20 66 69 6c 65 20  QLite.dll" file 
1ebc0 69 73 20 69 6e 63 6c 75 64 65 64 20 68 65 72 65  is included here
1ebd0 20 69 73 0d 0a 20 20 20 20 20 20 20 20 23 20 20   is..        #  
1ebe0 20 20 20 20 20 62 65 63 61 75 73 65 20 69 74 20       because it 
1ebf0 63 6f 75 6c 64 20 62 65 20 74 68 65 20 6d 69 78  could be the mix
1ec00 65 64 2d 6d 6f 64 65 20 61 73 73 65 6d 62 6c 79  ed-mode assembly
1ec10 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
1ec20 20 20 20 20 20 20 73 65 74 20 6e 61 74 69 76 65        set native
1ec30 46 69 6c 65 4e 61 6d 65 73 20 5b 6c 69 73 74 5d  FileNames [list]
1ec40 0d 0a 0d 0a 20 20 20 20 20 20 20 20 65 76 61 6c  ....        eval
1ec50 20 6c 61 70 70 65 6e 64 20 6e 61 74 69 76 65 46   lappend nativeF
1ec60 69 6c 65 4e 61 6d 65 73 20 5b 67 65 74 4e 61 74  ileNames [getNat
1ec70 69 76 65 4c 69 62 72 61 72 79 46 69 6c 65 4e 61  iveLibraryFileNa
1ec80 6d 65 73 4f 6e 6c 79 5d 0d 0a 20 20 20 20 20 20  mesOnly]..      
1ec90 20 20 65 76 61 6c 20 6c 61 70 70 65 6e 64 20 6e    eval lappend n
1eca0 61 74 69 76 65 46 69 6c 65 4e 61 6d 65 73 20 5b  ativeFileNames [
1ecb0 67 65 74 49 6e 74 65 72 6f 70 41 73 73 65 6d 62  getInteropAssemb
1ecc0 6c 79 46 69 6c 65 4e 61 6d 65 73 4f 6e 6c 79 5d  lyFileNamesOnly]
1ecd0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 6c 61 70 70  ....        lapp
1ece0 65 6e 64 20 6e 61 74 69 76 65 46 69 6c 65 4e 61  end nativeFileNa
1ecf0 6d 65 73 20 53 79 73 74 65 6d 2e 44 61 74 61 2e  mes System.Data.
1ed00 53 51 4c 69 74 65 2e 64 6c 6c 0d 0a 0d 0a 20 20  SQLite.dll....  
1ed10 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
1ed20 20 23 20 4e 4f 54 45 3a 20 42 75 69 6c 64 20 74   # NOTE: Build t
1ed30 68 65 20 6c 69 73 74 20 6f 66 20 6d 61 6e 61 67  he list of manag
1ed40 65 64 20 61 73 73 65 6d 62 6c 79 20 66 69 6c 65  ed assembly file
1ed50 73 20 74 68 61 74 20 77 65 20 68 61 6e 64 6c 65  s that we handle
1ed60 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
1ed70 20 20 20 20 20 20 73 65 74 20 6d 61 6e 61 67 65        set manage
1ed80 64 46 69 6c 65 4e 61 6d 65 73 20 5b 6c 69 73 74  dFileNames [list
1ed90 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
1eda0 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
1edb0 74 65 2e 64 6c 6c 20 53 79 73 74 65 6d 2e 44 61  te.dll System.Da
1edc0 74 61 2e 53 51 4c 69 74 65 2e 4c 69 6e 71 2e 64  ta.SQLite.Linq.d
1edd0 6c 6c 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  ll \..          
1ede0 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51    System.Data.SQ
1edf0 4c 69 74 65 2e 45 46 36 2e 64 6c 6c 5d 0d 0a 0d  Lite.EF6.dll]...
1ee00 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
1ee10 20 20 20 20 23 20 4e 4f 54 45 3a 20 52 65 6d 6f      # NOTE: Remo
1ee20 76 65 20 61 6e 79 20 74 65 73 74 20 63 6f 6e 73  ve any test cons
1ee30 74 72 61 69 6e 74 73 20 74 68 61 74 20 72 65 66  traints that ref
1ee40 65 72 20 74 6f 20 74 68 65 20 6e 61 74 69 76 65  er to the native
1ee50 20 61 6e 64 2f 6f 72 0d 0a 20 20 20 20 20 20 20   and/or..       
1ee60 20 23 20 20 20 20 20 20 20 6d 61 6e 61 67 65 64   #       managed
1ee70 20 61 73 73 65 6d 62 6c 79 20 66 69 6c 65 73 20   assembly files 
1ee80 74 68 61 74 20 77 65 20 68 61 6e 64 6c 65 20 75  that we handle u
1ee90 6e 6c 65 73 73 20 66 6f 72 62 69 64 64 65 6e 20  nless forbidden 
1eea0 66 72 6f 6d 0d 0a 20 20 20 20 20 20 20 20 23 20  from..        # 
1eeb0 20 20 20 20 20 20 64 6f 69 6e 67 20 73 6f 2e 0d        doing so..
1eec0 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
1eed0 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65      if {![info e
1eee0 78 69 73 74 73 20 3a 3a 6e 6f 28 73 71 6c 69 74  xists ::no(sqlit
1eef0 65 52 65 6d 6f 76 65 43 6f 6e 73 74 72 61 69 6e  eRemoveConstrain
1ef00 74 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ts)]} then {..  
1ef10 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20          foreach 
1ef20 66 69 6c 65 4e 61 6d 65 20 24 63 6f 6e 66 69 67  fileName $config
1ef30 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20  FileNames {..   
1ef40 20 20 20 20 20 20 20 20 20 72 65 6d 6f 76 65 43           removeC
1ef50 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e  onstraint [appen
1ef60 64 41 72 67 73 20 66 69 6c 65 5f 20 24 66 69 6c  dArgs file_ $fil
1ef70 65 4e 61 6d 65 5d 0d 0a 20 20 20 20 20 20 20 20  eName]..        
1ef80 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20    }....         
1ef90 20 66 6f 72 65 61 63 68 20 66 69 6c 65 4e 61 6d   foreach fileNam
1efa0 65 20 24 6d 64 61 43 6f 6e 66 69 67 46 69 6c 65  e $mdaConfigFile
1efb0 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20 20  Names {..       
1efc0 20 20 20 20 20 72 65 6d 6f 76 65 43 6f 6e 73 74       removeConst
1efd0 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67  raint [appendArg
1efe0 73 20 66 69 6c 65 5f 20 24 66 69 6c 65 4e 61 6d  s file_ $fileNam
1eff0 65 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d  e]..          }.
1f000 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72  ...          for
1f010 65 61 63 68 20 66 69 6c 65 4e 61 6d 65 20 24 65  each fileName $e
1f020 78 74 65 72 6e 61 6c 46 69 6c 65 4e 61 6d 65 73  xternalFileNames
1f030 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
1f040 72 65 6d 6f 76 65 43 6f 6e 73 74 72 61 69 6e 74  removeConstraint
1f050 20 5b 61 70 70 65 6e 64 41 72 67 73 20 66 69 6c   [appendArgs fil
1f060 65 5f 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 66  e_ [file tail $f
1f070 69 6c 65 4e 61 6d 65 5d 5d 0d 0a 20 20 20 20 20  ileName]]..     
1f080 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
1f090 20 20 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65      foreach file
1f0a0 4e 61 6d 65 20 24 6e 61 74 69 76 65 46 69 6c 65  Name $nativeFile
1f0b0 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20 20  Names {..       
1f0c0 20 20 20 20 20 72 65 6d 6f 76 65 43 6f 6e 73 74       removeConst
1f0d0 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67  raint [appendArg
1f0e0 73 20 66 69 6c 65 5f 20 24 66 69 6c 65 4e 61 6d  s file_ $fileNam
1f0f0 65 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d  e]..          }.
1f100 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72  ...          for
1f110 65 61 63 68 20 66 69 6c 65 4e 61 6d 65 20 24 6d  each fileName $m
1f120 61 6e 61 67 65 64 46 69 6c 65 4e 61 6d 65 73 20  anagedFileNames 
1f130 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  {..            r
1f140 65 6d 6f 76 65 43 6f 6e 73 74 72 61 69 6e 74 20  emoveConstraint 
1f150 5b 61 70 70 65 6e 64 41 72 67 73 20 66 69 6c 65  [appendArgs file
1f160 5f 20 24 66 69 6c 65 4e 61 6d 65 5d 0d 0a 20 20  _ $fileName]..  
1f170 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
1f180 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
1f190 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
1f1a0 45 3a 20 53 6b 69 70 20 61 6c 6c 20 53 79 73 74  E: Skip all Syst
1f1b0 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 20 72  em.Data.SQLite r
1f1c0 65 6c 61 74 65 64 20 66 69 6c 65 20 68 61 6e 64  elated file hand
1f1d0 6c 69 6e 67 20 28 64 65 6c 65 74 69 6e 67 2c 0d  ling (deleting,.
1f1e0 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
1f1f0 20 63 6f 70 79 69 6e 67 2c 20 61 6e 64 20 6c 6f   copying, and lo
1f200 61 64 69 6e 67 29 20 69 66 20 69 6e 73 74 72 75  ading) if instru
1f210 63 74 65 64 2e 0d 0a 20 20 20 20 20 20 20 20 23  cted...        #
1f220 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b  ..        if {![
1f230 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f  info exists ::no
1f240 28 73 71 6c 69 74 65 46 69 6c 65 73 29 5d 7d 20  (sqliteFiles)]} 
1f250 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
1f260 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23    #..          #
1f270 20 4e 4f 54 45 3a 20 53 6b 69 70 20 74 72 79 69   NOTE: Skip tryi
1f280 6e 67 20 74 6f 20 64 65 6c 65 74 65 20 61 6e 79  ng to delete any
1f290 20 66 69 6c 65 73 20 69 66 20 69 6e 73 74 72 75   files if instru
1f2a0 63 74 65 64 2e 0d 0a 20 20 20 20 20 20 20 20 20  cted...         
1f2b0 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66   #..          if
1f2c0 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20   {![info exists 
1f2d0 3a 3a 6e 6f 28 64 65 6c 65 74 65 53 71 6c 69 74  ::no(deleteSqlit
1f2e0 65 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e 20 7b  eFiles)]} then {
1f2f0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ..            if
1f300 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20   {![info exists 
1f310 3a 3a 6e 6f 28 64 65 6c 65 74 65 53 71 6c 69 74  ::no(deleteSqlit
1f320 65 43 6f 6e 66 69 67 46 69 6c 65 73 29 5d 7d 20  eConfigFiles)]} 
1f330 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
1f340 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 66 69        foreach fi
1f350 6c 65 4e 61 6d 65 20 24 63 6f 6e 66 69 67 46 69  leName $configFi
1f360 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20  leNames {..     
1f370 20 20 20 20 20 20 20 20 20 20 20 74 72 79 44 65             tryDe
1f380 6c 65 74 65 42 69 6e 61 72 79 46 69 6c 65 20 24  leteBinaryFile $
1f390 66 69 6c 65 4e 61 6d 65 0d 0a 20 20 20 20 20 20  fileName..      
1f3a0 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
1f3b0 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
1f3c0 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e          if {![in
1f3d0 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 64  fo exists ::no(d
1f3e0 65 6c 65 74 65 53 71 6c 69 74 65 45 78 74 65 72  eleteSqliteExter
1f3f0 6e 61 6c 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e  nalFiles)]} then
1f400 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
1f410 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65 4e 61    foreach fileNa
1f420 6d 65 20 24 6d 64 61 43 6f 6e 66 69 67 46 69 6c  me $mdaConfigFil
1f430 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20  eNames {..      
1f440 20 20 20 20 20 20 20 20 20 20 74 72 79 44 65 6c            tryDel
1f450 65 74 65 42 75 69 6c 64 46 69 6c 65 20 24 66 69  eteBuildFile $fi
1f460 6c 65 4e 61 6d 65 0d 0a 20 20 20 20 20 20 20 20  leName..        
1f470 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
1f480 20 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68           foreach
1f490 20 66 69 6c 65 4e 61 6d 65 20 24 65 78 74 65 72   fileName $exter
1f4a0 6e 61 6c 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a  nalFileNames {..
1f4b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f4c0 74 72 79 44 65 6c 65 74 65 42 69 6e 61 72 79 46  tryDeleteBinaryF
1f4d0 69 6c 65 20 24 66 69 6c 65 4e 61 6d 65 0d 0a 20  ile $fileName.. 
1f4e0 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a               }..
1f4f0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d              }...
1f500 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20  .            if 
1f510 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a  {![info exists :
1f520 3a 6e 6f 28 64 65 6c 65 74 65 53 71 6c 69 74 65  :no(deleteSqlite
1f530 4e 61 74 69 76 65 46 69 6c 65 73 29 5d 7d 20 74  NativeFiles)]} t
1f540 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
1f550 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20       if {![info 
1f560 65 78 69 73 74 73 20 3a 3a 6e 6f 28 64 65 6c 65  exists ::no(dele
1f570 74 65 53 71 6c 69 74 65 49 6d 70 6c 69 63 69 74  teSqliteImplicit
1f580 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d  Files)]} then {.
1f590 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1f5a0 20 66 6f 72 65 61 63 68 20 66 69 6c 65 4e 61 6d   foreach fileNam
1f5b0 65 20 24 6e 61 74 69 76 65 46 69 6c 65 4e 61 6d  e $nativeFileNam
1f5c0 65 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  es {..          
1f5d0 20 20 20 20 20 20 20 20 74 72 79 44 65 6c 65 74          tryDelet
1f5e0 65 41 73 73 65 6d 62 6c 79 20 24 66 69 6c 65 4e  eAssembly $fileN
1f5f0 61 6d 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ame..           
1f600 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
1f610 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
1f620 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69           if {![i
1f630 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28  nfo exists ::no(
1f640 64 65 6c 65 74 65 53 71 6c 69 74 65 4e 6f 6e 49  deleteSqliteNonI
1f650 6d 70 6c 69 63 69 74 46 69 6c 65 73 29 5d 7d 20  mplicitFiles)]} 
1f660 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
1f670 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e          if {![in
1f680 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 64  fo exists ::no(d
1f690 65 6c 65 74 65 53 71 6c 69 74 65 50 6c 61 74 66  eleteSqlitePlatf
1f6a0 6f 72 6d 46 69 6c 65 73 29 5d 20 26 26 20 5c 0d  ormFiles)] && \.
1f6b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1f6c0 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e       [string len
1f6d0 67 74 68 20 24 70 6c 61 74 66 6f 72 6d 5d 20 3e  gth $platform] >
1f6e0 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
1f6f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f                fo
1f700 72 65 61 63 68 20 66 69 6c 65 4e 61 6d 65 20 24  reach fileName $
1f710 6e 61 74 69 76 65 46 69 6c 65 4e 61 6d 65 73 20  nativeFileNames 
1f720 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
1f730 20 20 20 20 20 20 20 74 72 79 44 65 6c 65 74 65         tryDelete
1f740 41 73 73 65 6d 62 6c 79 20 24 66 69 6c 65 4e 61  Assembly $fileNa
1f750 6d 65 20 24 70 6c 61 74 66 6f 72 6d 0d 0a 20 20  me $platform..  
1f760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f770 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  }..             
1f780 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
1f790 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e          if {![in
1f7a0 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 64  fo exists ::no(d
1f7b0 65 6c 65 74 65 53 71 6c 69 74 65 41 72 63 68 69  eleteSqliteArchi
1f7c0 74 65 63 74 75 72 65 46 69 6c 65 73 29 5d 20 26  tectureFiles)] &
1f7d0 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  & \..           
1f7e0 20 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67           [string
1f7f0 20 6c 65 6e 67 74 68 20 24 61 72 63 68 69 74 65   length $archite
1f800 63 74 75 72 65 5d 20 3e 20 30 7d 20 74 68 65 6e  cture] > 0} then
1f810 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
1f820 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 66 69        foreach fi
1f830 6c 65 4e 61 6d 65 20 24 6e 61 74 69 76 65 46 69  leName $nativeFi
1f840 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20  leNames {..     
1f850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
1f860 72 79 44 65 6c 65 74 65 41 73 73 65 6d 62 6c 79  ryDeleteAssembly
1f870 20 24 66 69 6c 65 4e 61 6d 65 20 24 61 72 63 68   $fileName $arch
1f880 69 74 65 63 74 75 72 65 0d 0a 20 20 20 20 20 20  itecture..      
1f890 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
1f8a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
1f8b0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1f8c0 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  }..            }
1f8d0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
1f8e0 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74  if {![info exist
1f8f0 73 20 3a 3a 6e 6f 28 64 65 6c 65 74 65 53 71 6c  s ::no(deleteSql
1f900 69 74 65 4d 61 6e 61 67 65 64 46 69 6c 65 73 29  iteManagedFiles)
1f910 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
1f920 20 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68           foreach
1f930 20 66 69 6c 65 4e 61 6d 65 20 24 6d 61 6e 61 67   fileName $manag
1f940 65 64 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20  edFileNames {.. 
1f950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
1f960 72 79 44 65 6c 65 74 65 41 73 73 65 6d 62 6c 79  ryDeleteAssembly
1f970 20 24 66 69 6c 65 4e 61 6d 65 0d 0a 20 20 20 20   $fileName..    
1f980 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
1f990 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
1f9a0 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
1f9b0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
1f9c0 20 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20    # NOTE: Check 
1f9d0 66 6f 72 20 74 68 65 20 22 61 75 74 6f 53 65 6c  for the "autoSel
1f9e0 65 63 74 22 20 72 75 6e 74 69 6d 65 20 6f 70 74  ect" runtime opt
1f9f0 69 6f 6e 2e 20 20 49 66 20 70 72 65 73 65 6e 74  ion.  If present
1fa00 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 20  ,..          #  
1fa10 20 20 20 20 20 61 74 74 65 6d 70 74 20 74 6f 20       attempt to 
1fa20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 73 65  automatically se
1fa30 6c 65 63 74 20 74 68 65 20 66 69 72 73 74 20 61  lect the first a
1fa40 76 61 69 6c 61 62 6c 65 0d 0a 20 20 20 20 20 20  vailable..      
1fa50 20 20 20 20 23 20 20 20 20 20 20 20 62 75 69 6c      #       buil
1fa60 64 20 28 6f 72 20 22 72 65 6c 65 61 73 65 22 29  d (or "release")
1fa70 20 6f 66 20 53 51 4c 69 74 65 20 61 6e 64 20 53   of SQLite and S
1fa80 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
1fa90 65 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 20  e..          #  
1faa0 20 20 20 20 20 66 6f 72 20 75 73 65 20 77 69 74       for use wit
1fab0 68 20 74 68 65 20 74 65 73 74 20 73 75 69 74 65  h the test suite
1fac0 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a  ...          #..
1fad0 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 68            if {[h
1fae0 61 73 52 75 6e 74 69 6d 65 4f 70 74 69 6f 6e 20  asRuntimeOption 
1faf0 61 75 74 6f 53 65 6c 65 63 74 5d 7d 20 74 68 65  autoSelect]} the
1fb00 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
1fb10 20 69 66 20 7b 21 5b 63 68 65 63 6b 46 6f 72 53   if {![checkForS
1fb20 51 4c 69 74 65 42 75 69 6c 64 73 20 24 3a 3a 74  QLiteBuilds $::t
1fb30 65 73 74 5f 63 68 61 6e 6e 65 6c 20 74 72 75 65  est_channel true
1fb40 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
1fb50 20 20 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f           checkFo
1fb60 72 53 51 4c 69 74 65 52 65 6c 65 61 73 65 73 20  rSQLiteReleases 
1fb70 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
1fb80 74 72 75 65 0d 0a 20 20 20 20 20 20 20 20 20 20  true..          
1fb90 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d    }..          }
1fba0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d  ....          #.
1fbb0 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54  .          # NOT
1fbc0 45 3a 20 53 6b 69 70 20 74 72 79 69 6e 67 20 74  E: Skip trying t
1fbd0 6f 20 76 65 72 69 66 79 20 74 68 65 20 62 75 69  o verify the bui
1fbe0 6c 64 20 64 69 72 65 63 74 6f 72 79 20 69 66 20  ld directory if 
1fbf0 69 6e 73 74 72 75 63 74 65 64 3b 0d 0a 20 20 20  instructed;..   
1fc00 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 6f         #       o
1fc10 74 68 65 72 77 69 73 65 2c 20 6d 61 6b 65 20 73  therwise, make s
1fc20 75 72 65 20 69 74 20 61 63 74 75 61 6c 6c 79 20  ure it actually 
1fc30 65 78 69 73 74 73 20 6f 72 20 68 61 6c 74 20 74  exists or halt t
1fc40 68 65 20 65 6e 74 69 72 65 0d 0a 20 20 20 20 20  he entire..     
1fc50 20 20 20 20 20 23 20 20 20 20 20 20 20 74 65 73       #       tes
1fc60 74 69 6e 67 20 70 72 6f 63 65 73 73 20 69 66 20  ting process if 
1fc70 69 74 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73  it does not exis
1fc80 74 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d  t...          #.
1fc90 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21  .          if {!
1fca0 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e  [info exists ::n
1fcb0 6f 28 76 65 72 69 66 79 42 75 69 6c 64 44 69 72  o(verifyBuildDir
1fcc0 65 63 74 6f 72 79 29 5d 7d 20 74 68 65 6e 20 7b  ectory)]} then {
1fcd0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 0d  ..            #.
1fce0 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4e  .            # N
1fcf0 4f 54 45 3a 20 41 74 20 74 68 69 73 20 70 6f 69  OTE: At this poi
1fd00 6e 74 2c 20 74 68 65 20 62 75 69 6c 64 20 64 69  nt, the build di
1fd10 72 65 63 74 6f 72 79 20 4d 55 53 54 20 65 78 69  rectory MUST exi
1fd20 73 74 20 61 73 20 61 0d 0a 20 20 20 20 20 20 20  st as a..       
1fd30 20 20 20 20 20 23 20 20 20 20 20 20 20 76 61 6c       #       val
1fd40 69 64 20 64 69 72 65 63 74 6f 72 79 20 66 6f 72  id directory for
1fd50 20 74 68 65 20 74 65 73 74 69 6e 67 20 70 72 6f   the testing pro
1fd60 63 65 73 73 20 74 6f 20 63 6f 6e 74 69 6e 75 65  cess to continue
1fd70 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23  ...            #
1fd80 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 65  ..            se
1fd90 74 20 64 69 72 65 63 74 6f 72 79 20 5b 67 65 74  t directory [get
1fda0 42 75 69 6c 64 44 69 72 65 63 74 6f 72 79 5d 0d  BuildDirectory].
1fdb0 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ...            i
1fdc0 66 20 7b 21 5b 66 69 6c 65 20 65 78 69 73 74 73  f {![file exists
1fdd0 20 24 64 69 72 65 63 74 6f 72 79 5d 20 7c 7c 20   $directory] || 
1fde0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
1fdf0 20 20 20 21 5b 66 69 6c 65 20 69 73 64 69 72 65     ![file isdire
1fe00 63 74 6f 72 79 20 24 64 69 72 65 63 74 6f 72 79  ctory $directory
1fe10 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
1fe20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
1fe30 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45            # NOTE
1fe40 3a 20 4a 75 73 74 20 70 72 69 6f 72 20 74 6f 20  : Just prior to 
1fe50 61 63 74 75 61 6c 6c 79 20 68 61 6c 74 69 6e 67  actually halting
1fe60 20 74 68 65 20 74 65 73 74 69 6e 67 20 70 72 6f   the testing pro
1fe70 63 65 73 73 2c 0d 0a 20 20 20 20 20 20 20 20 20  cess,..         
1fe80 20 20 20 20 20 23 20 20 20 20 20 20 20 61 64 64       #       add
1fe90 20 61 6e 20 65 72 72 6f 72 20 74 6f 20 74 68 65   an error to the
1fea0 20 74 65 73 74 20 6c 6f 67 20 66 69 6c 65 2e 0d   test log file..
1feb0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23  .              #
1fec0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1fed0 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
1fee0 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
1fef0 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
1ff00 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 6f 75         "---- cou
1ff10 6c 64 20 6e 6f 74 20 76 65 72 69 66 79 20 62 75  ld not verify bu
1ff20 69 6c 64 20 64 69 72 65 63 74 6f 72 79 20 5c 22  ild directory \"
1ff30 22 20 24 64 69 72 65 63 74 6f 72 79 20 5c 0d 0a  " $directory \..
1ff40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ff50 20 20 22 5c 22 2c 20 61 6c 6c 20 74 65 73 74 69    "\", all testi
1ff60 6e 67 20 68 61 6c 74 65 64 5c 6e 22 5d 0d 0a 0d  ng halted\n"]...
1ff70 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23  .              #
1ff80 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1ff90 23 20 4e 4f 54 45 3a 20 52 61 69 73 69 6e 67 20  # NOTE: Raising 
1ffa0 61 20 73 63 72 69 70 74 20 65 72 72 6f 72 20 66  a script error f
1ffb0 72 6f 6d 20 74 68 69 73 20 70 6f 69 6e 74 20 73  rom this point s
1ffc0 68 6f 75 6c 64 20 68 61 6c 74 0d 0a 20 20 20 20  hould halt..    
1ffd0 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20            #     
1ffe0 20 20 74 68 65 20 74 65 73 74 69 6e 67 20 70 72    the testing pr
1fff0 6f 63 65 73 73 2e 0d 0a 20 20 20 20 20 20 20 20  ocess...        
20000 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
20010 20 20 20 20 20 20 20 65 72 72 6f 72 20 5b 61 70         error [ap
20020 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
20030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 63                "c
20040 6f 75 6c 64 20 6e 6f 74 20 76 65 72 69 66 79 20  ould not verify 
20050 62 75 69 6c 64 20 64 69 72 65 63 74 6f 72 79 20  build directory 
20060 5c 22 22 20 24 64 69 72 65 63 74 6f 72 79 20 5c  \"" $directory \
20070 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
20080 20 20 20 20 22 5c 22 2c 20 61 6c 6c 20 74 65 73      "\", all tes
20090 74 69 6e 67 20 68 61 6c 74 65 64 22 5d 0d 0a 20  ting halted"].. 
200a0 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
200b0 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
200c0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
200d0 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 6b 69 70      # NOTE: Skip
200e0 20 74 72 79 69 6e 67 20 74 6f 20 63 6f 70 79 20   trying to copy 
200f0 61 6e 79 20 66 69 6c 65 73 20 69 66 20 69 6e 73  any files if ins
20100 74 72 75 63 74 65 64 2e 0d 0a 20 20 20 20 20 20  tructed...      
20110 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
20120 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73   if {![info exis
20130 74 73 20 3a 3a 6e 6f 28 63 6f 70 79 53 71 6c 69  ts ::no(copySqli
20140 74 65 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e 20  teFiles)]} then 
20150 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  {..            i
20160 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73  f {![info exists
20170 20 3a 3a 6e 6f 28 63 6f 70 79 53 71 6c 69 74 65   ::no(copySqlite
20180 43 6f 6e 66 69 67 46 69 6c 65 73 29 5d 7d 20 74  ConfigFiles)]} t
20190 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
201a0 20 20 20 20 20 66 6f 72 65 61 63 68 20 66 69 6c       foreach fil
201b0 65 4e 61 6d 65 20 24 63 6f 6e 66 69 67 46 69 6c  eName $configFil
201c0 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20  eNames {..      
201d0 20 20 20 20 20 20 20 20 20 20 74 72 79 43 6f 70            tryCop
201e0 79 42 75 69 6c 64 46 69 6c 65 20 24 66 69 6c 65  yBuildFile $file
201f0 4e 61 6d 65 0d 0a 20 20 20 20 20 20 20 20 20 20  Name..          
20200 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
20210 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
20220 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65      if {![info e
20230 78 69 73 74 73 20 3a 3a 6e 6f 28 63 6f 70 79 53  xists ::no(copyS
20240 71 6c 69 74 65 45 78 74 65 72 6e 61 6c 46 69 6c  qliteExternalFil
20250 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  es)]} then {..  
20260 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20              #.. 
20270 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4e               # N
20280 4f 54 45 3a 20 43 6f 70 79 20 74 68 65 20 4d 61  OTE: Copy the Ma
20290 6e 61 67 65 64 20 44 65 62 75 67 67 69 6e 67 20  naged Debugging 
202a0 41 73 73 69 73 74 61 6e 74 73 20 28 4d 44 41 29  Assistants (MDA)
202b0 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 0d 0a   configuration..
202c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20                # 
202d0 20 20 20 20 20 20 66 69 6c 65 20 66 6f 72 20 74        file for t
202e0 68 65 20 45 61 67 6c 65 20 73 68 65 6c 6c 20 74  he Eagle shell t
202f0 6f 20 74 68 65 20 62 75 69 6c 64 20 6f 75 74 70  o the build outp
20300 75 74 20 64 69 72 65 63 74 6f 72 79 2c 0d 0a 20  ut directory,.. 
20310 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20 20               #  
20320 20 20 20 20 20 77 68 69 6c 65 20 75 73 69 6e 67       while using
20330 20 65 61 63 68 20 6f 66 20 74 68 65 20 6e 61 6d   each of the nam
20340 65 73 20 6f 66 20 74 68 65 20 76 61 72 69 6f 75  es of the variou
20350 73 20 6c 65 67 61 63 79 20 74 65 73 74 0d 0a 20  s legacy test.. 
20360 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20 20               #  
20370 20 20 20 20 20 65 78 65 63 75 74 61 62 6c 65 73       executables
20380 2e 20 20 54 68 69 73 20 77 69 6c 6c 20 68 65 6c  .  This will hel
20390 70 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74  p to make sure t
203a0 68 61 74 20 61 6c 6c 20 74 68 65 0d 0a 20 20 20  hat all the..   
203b0 20 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20             #    
203c0 20 20 20 6c 65 67 61 63 79 20 74 65 73 74 73 20     legacy tests 
203d0 72 75 6e 20 77 69 74 68 20 65 78 61 63 74 6c 79  run with exactly
203e0 20 74 68 65 20 73 61 6d 65 20 73 65 74 20 6f 66   the same set of
203f0 20 4d 61 6e 61 67 65 64 0d 0a 20 20 20 20 20 20   Managed..      
20400 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
20410 44 65 62 75 67 67 69 6e 67 20 41 73 73 69 73 74  Debugging Assist
20420 61 6e 74 73 20 63 6f 6e 66 69 67 75 72 65 64 2e  ants configured.
20430 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
20440 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  #..             
20450 20 66 6f 72 65 61 63 68 20 66 69 6c 65 4e 61 6d   foreach fileNam
20460 65 20 24 6d 64 61 43 6f 6e 66 69 67 46 69 6c 65  e $mdaConfigFile
20470 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20 20  Names {..       
20480 20 20 20 20 20 20 20 20 20 74 72 79 43 6f 70 79           tryCopy
20490 42 69 6e 61 72 79 46 69 6c 65 20 45 61 67 6c 65  BinaryFile Eagle
204a0 53 68 65 6c 6c 2e 65 78 65 2e 6d 64 61 2e 63 6f  Shell.exe.mda.co
204b0 6e 66 69 67 20 22 22 20 24 66 69 6c 65 4e 61 6d  nfig "" $fileNam
204c0 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e..             
204d0 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   }....          
204e0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
204f0 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 6f 70       # NOTE: Cop
20500 79 20 74 68 65 20 65 78 74 65 72 6e 61 6c 20 62  y the external b
20510 69 6e 61 72 69 65 73 2c 20 69 66 20 61 6e 79 2c  inaries, if any,
20520 20 74 6f 20 74 68 65 20 64 69 72 65 63 74 6f 72   to the director
20530 79 20 74 68 61 74 0d 0a 20 20 20 20 20 20 20 20  y that..        
20540 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63 6f        #       co
20550 6e 74 61 69 6e 73 20 74 68 65 20 45 61 67 6c 65  ntains the Eagle
20560 20 73 68 65 6c 6c 2e 20 20 54 68 69 73 20 69 73   shell.  This is
20570 20 74 79 70 69 63 61 6c 6c 79 20 75 73 65 64 20   typically used 
20580 74 6f 20 6d 61 6b 65 0d 0a 20 20 20 20 20 20 20  to make..       
20590 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 73         #       s
205a0 75 72 65 20 61 73 73 65 6d 62 6c 69 65 73 20 72  ure assemblies r
205b0 65 66 65 72 65 6e 63 65 64 20 62 79 20 74 68 65  eferenced by the
205c0 20 6f 6e 65 73 20 62 65 69 6e 67 20 74 65 73 74   ones being test
205d0 65 64 20 61 72 65 0d 0a 20 20 20 20 20 20 20 20  ed are..        
205e0 20 20 20 20 20 20 23 20 20 20 20 20 20 20 61 76        #       av
205f0 61 69 6c 61 62 6c 65 20 64 75 72 69 6e 67 20 74  ailable during t
20600 68 65 20 74 65 73 74 69 6e 67 20 70 72 6f 63 65  he testing proce
20610 73 73 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ss...           
20620 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
20630 20 20 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65      foreach file
20640 4e 61 6d 65 20 24 65 78 74 65 72 6e 61 6c 46 69  Name $externalFi
20650 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20  leNames {..     
20660 20 20 20 20 20 20 20 20 20 20 20 74 72 79 43 6f             tryCo
20670 70 79 45 78 74 65 72 6e 61 6c 46 69 6c 65 20 24  pyExternalFile $
20680 66 69 6c 65 4e 61 6d 65 0d 0a 20 20 20 20 20 20  fileName..      
20690 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
206a0 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
206b0 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e          if {![in
206c0 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 63  fo exists ::no(c
206d0 6f 70 79 53 71 6c 69 74 65 4e 61 74 69 76 65 46  opySqliteNativeF
206e0 69 6c 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a  iles)]} then {..
206f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 0d                #.
20700 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23  .              #
20710 20 4e 4f 54 45 3a 20 49 66 20 74 68 65 20 74 65   NOTE: If the te
20720 73 74 20 70 6c 61 74 66 6f 72 6d 20 69 73 20 6c  st platform is l
20730 69 6b 65 6c 79 20 74 68 65 20 64 65 66 61 75 6c  ikely the defaul
20740 74 20 66 6f 72 20 74 68 69 73 0d 0a 20 20 20 20  t for this..    
20750 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20            #     
20760 20 20 6d 61 63 68 69 6e 65 2c 20 61 6c 73 6f 20    machine, also 
20770 74 72 79 20 74 6f 20 63 6f 70 79 20 74 68 65 20  try to copy the 
20780 6e 61 74 69 76 65 20 66 69 6c 65 73 20 74 6f 20  native files to 
20790 74 68 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20  the..           
207a0 20 20 20 23 20 20 20 20 20 20 20 62 69 6e 61 72     #       binar
207b0 79 20 6c 6f 63 61 74 69 6f 6e 2e 0d 0a 20 20 20  y location...   
207c0 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
207d0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b              if {
207e0 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  ![info exists ::
207f0 6e 6f 28 63 6f 70 79 53 71 6c 69 74 65 49 6d 70  no(copySqliteImp
20800 6c 69 63 69 74 46 69 6c 65 73 29 5d 20 26 26 20  licitFiles)] && 
20810 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
20820 20 20 20 20 20 5b 69 73 44 65 66 61 75 6c 74 42       [isDefaultB
20830 75 69 6c 64 50 6c 61 74 66 6f 72 6d 20 74 72 75  uildPlatform tru
20840 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  e]} then {..    
20850 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 65              fore
20860 61 63 68 20 66 69 6c 65 4e 61 6d 65 20 24 6e 61  ach fileName $na
20870 74 69 76 65 46 69 6c 65 4e 61 6d 65 73 20 7b 0d  tiveFileNames {.
20880 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
20890 20 20 20 74 72 79 43 6f 70 79 41 73 73 65 6d 62     tryCopyAssemb
208a0 6c 79 20 24 66 69 6c 65 4e 61 6d 65 0d 0a 20 20  ly $fileName..  
208b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d                }.
208c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
208d0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
208e0 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69    if {![info exi
208f0 73 74 73 20 3a 3a 6e 6f 28 63 6f 70 79 53 71 6c  sts ::no(copySql
20900 69 74 65 4e 6f 6e 49 6d 70 6c 69 63 69 74 46 69  iteNonImplicitFi
20910 6c 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  les)]} then {.. 
20920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
20930 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73  f {![info exists
20940 20 3a 3a 6e 6f 28 63 6f 70 79 53 71 6c 69 74 65   ::no(copySqlite
20950 50 6c 61 74 66 6f 72 6d 46 69 6c 65 73 29 5d 20  PlatformFiles)] 
20960 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  && \..          
20970 20 20 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e            [strin
20980 67 20 6c 65 6e 67 74 68 20 24 70 6c 61 74 66 6f  g length $platfo
20990 72 6d 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d  rm] > 0} then {.
209a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
209b0 20 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65 4e     foreach fileN
209c0 61 6d 65 20 24 6e 61 74 69 76 65 46 69 6c 65 4e  ame $nativeFileN
209d0 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20 20 20  ames {..        
209e0 20 20 20 20 20 20 20 20 20 20 20 20 74 72 79 43              tryC
209f0 6f 70 79 41 73 73 65 6d 62 6c 79 20 24 66 69 6c  opyAssembly $fil
20a00 65 4e 61 6d 65 20 24 70 6c 61 74 66 6f 72 6d 0d  eName $platform.
20a10 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
20a20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
20a30 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
20a40 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21             if {!
20a50 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e  [info exists ::n
20a60 6f 28 63 6f 70 79 53 71 6c 69 74 65 41 72 63 68  o(copySqliteArch
20a70 69 74 65 63 74 75 72 65 46 69 6c 65 73 29 5d 20  itectureFiles)] 
20a80 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  && \..          
20a90 20 20 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e            [strin
20aa0 67 20 6c 65 6e 67 74 68 20 24 61 72 63 68 69 74  g length $archit
20ab0 65 63 74 75 72 65 5d 20 3e 20 30 7d 20 74 68 65  ecture] > 0} the
20ac0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
20ad0 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 66         foreach f
20ae0 69 6c 65 4e 61 6d 65 20 24 6e 61 74 69 76 65 46  ileName $nativeF
20af0 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20  ileNames {..    
20b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20b10 74 72 79 43 6f 70 79 41 73 73 65 6d 62 6c 79 20  tryCopyAssembly 
20b20 24 66 69 6c 65 4e 61 6d 65 20 24 61 72 63 68 69  $fileName $archi
20b30 74 65 63 74 75 72 65 0d 0a 20 20 20 20 20 20 20  tecture..       
20b40 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
20b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d                }.
20b60 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
20b70 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
20b80 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ...            i
20b90 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73  f {![info exists
20ba0 20 3a 3a 6e 6f 28 63 6f 70 79 53 71 6c 69 74 65   ::no(copySqlite
20bb0 4d 61 6e 61 67 65 64 46 69 6c 65 73 29 5d 7d 20  ManagedFiles)]} 
20bc0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
20bd0 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 66 69        foreach fi
20be0 6c 65 4e 61 6d 65 20 24 6d 61 6e 61 67 65 64 46  leName $managedF
20bf0 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20  ileNames {..    
20c00 20 20 20 20 20 20 20 20 20 20 20 20 74 72 79 43              tryC
20c10 6f 70 79 41 73 73 65 6d 62 6c 79 20 24 66 69 6c  opyAssembly $fil
20c20 65 4e 61 6d 65 0d 0a 20 20 20 20 20 20 20 20 20  eName..         
20c30 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
20c40 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
20c50 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   }....          
20c60 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e  #..          # N
20c70 4f 54 45 3a 20 53 6b 69 70 20 74 72 79 69 6e 67  OTE: Skip trying
20c80 20 74 6f 20 6c 6f 61 64 20 61 6e 79 20 66 69 6c   to load any fil
20c90 65 73 20 69 66 20 69 6e 73 74 72 75 63 74 65 64  es if instructed
20ca0 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a  ...          #..
20cb0 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b            if {![
20cc0 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f  info exists ::no
20cd0 28 6c 6f 61 64 53 71 6c 69 74 65 46 69 6c 65 73  (loadSqliteFiles
20ce0 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  )]} then {..    
20cf0 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e          if {![in
20d00 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 6c  fo exists ::no(l
20d10 6f 61 64 53 71 6c 69 74 65 49 6d 70 6c 69 63 69  oadSqliteImplici
20d20 74 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e 20 7b  tFiles)]} then {
20d30 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
20d40 74 72 79 4c 6f 61 64 41 73 73 65 6d 62 6c 79 20  tryLoadAssembly 
20d50 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
20d60 74 65 2e 64 6c 6c 0d 0a 20 20 20 20 20 20 20 20  te.dll..        
20d70 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
20d80 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20       if {![info 
20d90 65 78 69 73 74 73 20 3a 3a 6e 6f 28 6c 6f 61 64  exists ::no(load
20da0 53 71 6c 69 74 65 4c 69 6e 71 46 69 6c 65 73 29  SqliteLinqFiles)
20db0 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
20dc0 20 20 20 20 20 20 20 20 20 74 72 79 4c 6f 61 64           tryLoad
20dd0 41 73 73 65 6d 62 6c 79 20 53 79 73 74 65 6d 2e  Assembly System.
20de0 44 61 74 61 2e 53 51 4c 69 74 65 2e 4c 69 6e 71  Data.SQLite.Linq
20df0 2e 64 6c 6c 0d 0a 20 20 20 20 20 20 20 20 20 20  .dll..          
20e00 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20    }....         
20e10 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78     if {![info ex
20e20 69 73 74 73 20 3a 3a 6e 6f 28 6c 6f 61 64 53 71  ists ::no(loadSq
20e30 6c 69 74 65 45 66 36 46 69 6c 65 73 29 5d 7d 20  liteEf6Files)]} 
20e40 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
20e50 20 20 20 20 20 20 74 72 79 4c 6f 61 64 41 73 73        tryLoadAss
20e60 65 6d 62 6c 79 20 53 79 73 74 65 6d 2e 44 61 74  embly System.Dat
20e70 61 2e 53 51 4c 69 74 65 2e 45 46 36 2e 64 6c 6c  a.SQLite.EF6.dll
20e80 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
20e90 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ...            i
20ea0 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73  f {![info exists
20eb0 20 3a 3a 6e 6f 28 6c 6f 61 64 53 71 6c 69 74 65   ::no(loadSqlite
20ec0 4e 6f 6e 49 6d 70 6c 69 63 69 74 46 69 6c 65 73  NonImplicitFiles
20ed0 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  )]} then {..    
20ee0 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b            if {![
20ef0 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f  info exists ::no
20f00 28 6c 6f 61 64 53 71 6c 69 74 65 50 6c 61 74 66  (loadSqlitePlatf
20f10 6f 72 6d 46 69 6c 65 73 29 5d 20 26 26 20 5c 0d  ormFiles)] && \.
20f20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
20f30 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74     [string lengt
20f40 68 20 24 70 6c 61 74 66 6f 72 6d 5d 20 3e 20 30  h $platform] > 0
20f50 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
20f60 20 20 20 20 20 20 20 20 20 20 74 72 79 4c 6f 61            tryLoa
20f70 64 41 73 73 65 6d 62 6c 79 20 53 79 73 74 65 6d  dAssembly System
20f80 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 64 6c 6c  .Data.SQLite.dll
20f90 20 24 70 6c 61 74 66 6f 72 6d 0d 0a 20 20 20 20   $platform..    
20fa0 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20            }.... 
20fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20               if 
20fc0 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a  {![info exists :
20fd0 3a 6e 6f 28 6c 6f 61 64 53 71 6c 69 74 65 41 72  :no(loadSqliteAr
20fe0 63 68 69 74 65 63 74 75 72 65 46 69 6c 65 73 29  chitectureFiles)
20ff0 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20  ] && \..        
21000 20 20 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e            [strin
21010 67 20 6c 65 6e 67 74 68 20 24 61 72 63 68 69 74  g length $archit
21020 65 63 74 75 72 65 5d 20 3e 20 30 7d 20 74 68 65  ecture] > 0} the
21030 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
21040 20 20 20 20 20 74 72 79 4c 6f 61 64 41 73 73 65       tryLoadAsse
21050 6d 62 6c 79 20 53 79 73 74 65 6d 2e 44 61 74 61  mbly System.Data
21060 2e 53 51 4c 69 74 65 2e 64 6c 6c 20 24 61 72 63  .SQLite.dll $arc
21070 68 69 74 65 63 74 75 72 65 0d 0a 20 20 20 20 20  hitecture..     
21080 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
21090 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
210a0 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
210b0 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 66 6f 72  }....        for
210c0 65 61 63 68 20 66 69 6c 65 4e 61 6d 65 4f 6e 6c  each fileNameOnl
210d0 79 20 5b 67 65 74 4e 61 74 69 76 65 4c 69 62 72  y [getNativeLibr
210e0 61 72 79 46 69 6c 65 4e 61 6d 65 73 4f 6e 6c 79  aryFileNamesOnly
210f0 5d 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 63  ] {..          c
21100 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20  atch {..        
21110 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
21120 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e  t_channel [appen
21130 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
21140 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 66           "---- f
21150 69 6c 65 20 76 65 72 73 69 6f 6e 20 6f 66 20 5c  ile version of \
21160 22 22 20 24 66 69 6c 65 4e 61 6d 65 4f 6e 6c 79  "" $fileNameOnly
21170 20 22 5c 22 2e 2e 2e 20 5c 22 22 20 5c 0d 0a 20   "\"... \"" \.. 
21180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b                 [
21190 66 69 6c 65 20 76 65 72 73 69 6f 6e 20 5b 67 65  file version [ge
211a0 74 42 69 6e 61 72 79 46 69 6c 65 4e 61 6d 65 20  tBinaryFileName 
211b0 24 66 69 6c 65 4e 61 6d 65 4f 6e 6c 79 5d 5d 20  $fileNameOnly]] 
211c0 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20  \"\n]..         
211d0 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d   }..        }...
211e0 0a 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68  .        foreach
211f0 20 66 69 6c 65 4e 61 6d 65 4f 6e 6c 79 20 5b 67   fileNameOnly [g
21200 65 74 49 6e 74 65 72 6f 70 41 73 73 65 6d 62 6c  etInteropAssembl
21210 79 46 69 6c 65 4e 61 6d 65 73 4f 6e 6c 79 5d 20  yFileNamesOnly] 
21220 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 63 61 74  {..          cat
21230 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  ch {..          
21240 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
21250 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
21260 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
21270 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 66 69 6c         "---- fil
21280 65 20 76 65 72 73 69 6f 6e 20 6f 66 20 5c 22 22  e version of \""
21290 20 24 66 69 6c 65 4e 61 6d 65 4f 6e 6c 79 20 22   $fileNameOnly "
212a0 5c 22 2e 2e 2e 20 5c 22 22 20 5c 0d 0a 20 20 20  \"... \"" \..   
212b0 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 66 69               [fi
212c0 6c 65 20 76 65 72 73 69 6f 6e 20 5b 67 65 74 42  le version [getB
212d0 69 6e 61 72 79 46 69 6c 65 4e 61 6d 65 20 24 66  inaryFileName $f
212e0 69 6c 65 4e 61 6d 65 4f 6e 6c 79 5d 5d 20 5c 22  ileNameOnly]] \"
212f0 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  \n]..          }
21300 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  ..        }.... 
21310 20 20 20 20 20 20 20 63 61 74 63 68 20 7b 0d 0a         catch {..
21320 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
21330 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
21340 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
21350 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d               "--
21360 2d 2d 20 66 69 6c 65 20 76 65 72 73 69 6f 6e 20  -- file version 
21370 6f 66 20 5c 22 53 79 73 74 65 6d 2e 44 61 74 61  of \"System.Data
21380 2e 53 51 4c 69 74 65 2e 64 6c 6c 5c 22 2e 2e 2e  .SQLite.dll\"...
21390 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20 20 20   \"" \..        
213a0 20 20 20 20 20 20 5b 66 69 6c 65 20 76 65 72 73        [file vers
213b0 69 6f 6e 20 5b 67 65 74 42 69 6e 61 72 79 46 69  ion [getBinaryFi
213c0 6c 65 4e 61 6d 65 20 53 79 73 74 65 6d 2e 44 61  leName System.Da
213d0 74 61 2e 53 51 4c 69 74 65 2e 64 6c 6c 5d 5d 20  ta.SQLite.dll]] 
213e0 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 7d  \"\n]..        }
213f0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 63 61 74 63  ....        catc
21400 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74  h {..          t
21410 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
21420 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
21430 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
21440 20 20 22 2d 2d 2d 2d 20 66 69 6c 65 20 76 65 72    "---- file ver
21450 73 69 6f 6e 20 6f 66 20 5c 22 53 79 73 74 65 6d  sion of \"System
21460 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 4c 69 6e  .Data.SQLite.Lin
21470 71 2e 64 6c 6c 5c 22 2e 2e 2e 20 5c 22 22 20 5c  q.dll\"... \"" \
21480 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
21490 5b 66 69 6c 65 20 76 65 72 73 69 6f 6e 20 5b 67  [file version [g
214a0 65 74 42 69 6e 61 72 79 46 69 6c 65 4e 61 6d 65  etBinaryFileName
214b0 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c   System.Data.SQL
214c0 69 74 65 2e 4c 69 6e 71 2e 64 6c 6c 5d 5d 20 5c  ite.Linq.dll]] \
214d0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
214e0 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 7d  \"\n]..        }
214f0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 63 61 74 63  ....        catc
21500 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74  h {..          t
21510 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
21520 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
21530 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
21540 20 20 22 2d 2d 2d 2d 20 66 69 6c 65 20 76 65 72    "---- file ver
21550 73 69 6f 6e 20 6f 66 20 5c 22 53 79 73 74 65 6d  sion of \"System
21560 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 45 46 36  .Data.SQLite.EF6
21570 2e 64 6c 6c 5c 22 2e 2e 2e 20 5c 22 22 20 5c 0d  .dll\"... \"" \.
21580 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b  .              [
21590 66 69 6c 65 20 76 65 72 73 69 6f 6e 20 5b 67 65  file version [ge
215a0 74 42 69 6e 61 72 79 46 69 6c 65 4e 61 6d 65 20  tBinaryFileName 
215b0 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
215c0 74 65 2e 45 46 36 2e 64 6c 6c 5d 5d 20 5c 0d 0a  te.EF6.dll]] \..
215d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 22                \"
215e0 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  \n]..        }..
215f0 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73  ..        if {[s
21600 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 70 6c  tring length $pl
21610 61 74 66 6f 72 6d 5d 20 3e 20 30 7d 20 74 68 65  atform] > 0} the
21620 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 66  n {..          f
21630 6f 72 65 61 63 68 20 66 69 6c 65 4e 61 6d 65 4f  oreach fileNameO
21640 6e 6c 79 20 5b 67 65 74 4e 61 74 69 76 65 4c 69  nly [getNativeLi
21650 62 72 61 72 79 46 69 6c 65 4e 61 6d 65 73 4f 6e  braryFileNamesOn
21660 6c 79 5d 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  ly] {..         
21670 20 20 20 63 61 74 63 68 20 7b 0d 0a 20 20 20 20     catch {..    
21680 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
21690 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
216a0 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
216b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
216c0 20 22 2d 2d 2d 2d 20 66 69 6c 65 20 76 65 72 73   "---- file vers
216d0 69 6f 6e 20 6f 66 20 5c 22 22 20 24 70 6c 61 74  ion of \"" $plat
216e0 66 6f 72 6d 20 5c 0d 0a 20 20 20 20 20 20 20 20  form \..        
216f0 20 20 20 20 20 20 20 20 20 20 2f 20 24 66 69 6c            / $fil
21700 65 4e 61 6d 65 4f 6e 6c 79 20 22 5c 22 2e 2e 2e  eNameOnly "\"...
21710 20 5c 22 22 20 5b 66 69 6c 65 20 76 65 72 73 69   \"" [file versi
21720 6f 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  on \..          
21730 20 20 20 20 20 20 20 20 5b 67 65 74 42 69 6e 61          [getBina
21740 72 79 46 69 6c 65 4e 61 6d 65 20 24 66 69 6c 65  ryFileName $file
21750 4e 61 6d 65 4f 6e 6c 79 20 24 70 6c 61 74 66 6f  NameOnly $platfo
21760 72 6d 5d 5d 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20  rm]] \"\n]..    
21770 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
21780 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
21790 20 20 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65      foreach file
217a0 4e 61 6d 65 4f 6e 6c 79 20 5b 67 65 74 49 6e 74  NameOnly [getInt
217b0 65 72 6f 70 41 73 73 65 6d 62 6c 79 46 69 6c 65  eropAssemblyFile
217c0 4e 61 6d 65 73 4f 6e 6c 79 5d 20 7b 0d 0a 20 20  NamesOnly] {..  
217d0 20 20 20 20 20 20 20 20 20 20 63 61 74 63 68 20            catch 
217e0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
217f0 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
21800 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
21810 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
21820 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 66 69          "---- fi
21830 6c 65 20 76 65 72 73 69 6f 6e 20 6f 66 20 5c 22  le version of \"
21840 22 20 24 70 6c 61 74 66 6f 72 6d 20 5c 0d 0a 20  " $platform \.. 
21850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21860 20 2f 20 24 66 69 6c 65 4e 61 6d 65 4f 6e 6c 79   / $fileNameOnly
21870 20 22 5c 22 2e 2e 2e 20 5c 22 22 20 5b 66 69 6c   "\"... \"" [fil
21880 65 20 76 65 72 73 69 6f 6e 20 5c 0d 0a 20 20 20  e version \..   
21890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b                 [
218a0 67 65 74 42 69 6e 61 72 79 46 69 6c 65 4e 61 6d  getBinaryFileNam
218b0 65 20 24 66 69 6c 65 4e 61 6d 65 4f 6e 6c 79 20  e $fileNameOnly 
218c0 24 70 6c 61 74 66 6f 72 6d 5d 5d 20 5c 22 5c 6e  $platform]] \"\n
218d0 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  ]..            }
218e0 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d  ..          }...
218f0 0a 20 20 20 20 20 20 20 20 20 20 63 61 74 63 68  .          catch
21900 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
21910 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
21920 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
21930 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
21940 20 20 20 20 20 22 2d 2d 2d 2d 20 66 69 6c 65 20       "---- file 
21950 76 65 72 73 69 6f 6e 20 6f 66 20 5c 22 22 20 24  version of \"" $
21960 70 6c 61 74 66 6f 72 6d 20 5c 0d 0a 20 20 20 20  platform \..    
21970 20 20 20 20 20 20 20 20 20 20 20 20 22 2f 53 79              "/Sy
21980 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
21990 2e 64 6c 6c 5c 22 2e 2e 2e 20 5c 22 22 20 5b 66  .dll\"... \"" [f
219a0 69 6c 65 20 76 65 72 73 69 6f 6e 20 5c 0d 0a 20  ile version \.. 
219b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b                 [
219c0 67 65 74 42 69 6e 61 72 79 46 69 6c 65 4e 61 6d  getBinaryFileNam
219d0 65 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51  e System.Data.SQ
219e0 4c 69 74 65 2e 64 6c 6c 20 24 70 6c 61 74 66 6f  Lite.dll $platfo
219f0 72 6d 5d 5d 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20  rm]] \"\n]..    
21a00 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
21a10 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66   }....        if
21a20 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68   {[string length
21a30 20 24 61 72 63 68 69 74 65 63 74 75 72 65 5d 20   $architecture] 
21a40 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  > 0} then {..   
21a50 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 66         foreach f
21a60 69 6c 65 4e 61 6d 65 4f 6e 6c 79 20 5b 67 65 74  ileNameOnly [get
21a70 4e 61 74 69 76 65 4c 69 62 72 61 72 79 46 69 6c  NativeLibraryFil
21a80 65 4e 61 6d 65 73 4f 6e 6c 79 5d 20 7b 0d 0a 20  eNamesOnly] {.. 
21a90 20 20 20 20 20 20 20 20 20 20 20 63 61 74 63 68             catch
21aa0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
21ab0 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
21ac0 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
21ad0 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
21ae0 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 66           "---- f
21af0 69 6c 65 20 76 65 72 73 69 6f 6e 20 6f 66 20 5c  ile version of \
21b00 22 22 20 24 61 72 63 68 69 74 65 63 74 75 72 65  "" $architecture
21b10 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
21b20 20 20 20 20 20 20 2f 20 24 66 69 6c 65 4e 61 6d        / $fileNam
21b30 65 4f 6e 6c 79 20 22 5c 22 2e 2e 2e 20 5c 22 22  eOnly "\"... \""
21b40 20 5b 66 69 6c 65 20 76 65 72 73 69 6f 6e 20 5c   [file version \
21b50 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
21b60 20 20 20 20 5b 67 65 74 42 69 6e 61 72 79 46 69      [getBinaryFi
21b70 6c 65 4e 61 6d 65 20 24 66 69 6c 65 4e 61 6d 65  leName $fileName
21b80 4f 6e 6c 79 20 24 61 72 63 68 69 74 65 63 74 75  Only $architectu
21b90 72 65 5d 5d 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20  re]] \"\n]..    
21ba0 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
21bb0 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
21bc0 20 20 20 20 63 61 74 63 68 20 7b 0d 0a 20 20 20      catch {..   
21bd0 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
21be0 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b  ::test_channel [
21bf0 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
21c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d                "-
21c10 2d 2d 2d 20 66 69 6c 65 20 76 65 72 73 69 6f 6e  --- file version
21c20 20 6f 66 20 5c 22 22 20 24 61 72 63 68 69 74 65   of \"" $archite
21c30 63 74 75 72 65 20 5c 0d 0a 20 20 20 20 20 20 20  cture \..       
21c40 20 20 20 20 20 20 20 20 20 2f 20 24 66 69 6c 65           / $file
21c50 4e 61 6d 65 4f 6e 6c 79 20 22 5c 22 2e 2e 2e 20  NameOnly "\"... 
21c60 5c 22 22 20 5b 66 69 6c 65 20 76 65 72 73 69 6f  \"" [file versio
21c70 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n \..           
21c80 20 20 20 20 20 5b 67 65 74 42 69 6e 61 72 79 46       [getBinaryF
21c90 69 6c 65 4e 61 6d 65 20 24 66 69 6c 65 4e 61 6d  ileName $fileNam
21ca0 65 4f 6e 6c 79 20 24 61 72 63 68 69 74 65 63 74  eOnly $architect
21cb0 75 72 65 5d 5d 20 5c 22 5c 6e 5d 0d 0a 20 20 20  ure]] \"\n]..   
21cc0 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
21cd0 20 20 20 20 20 20 63 61 74 63 68 20 7b 0d 0a 20        catch {.. 
21ce0 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
21cf0 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
21d00 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
21d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21d20 22 2d 2d 2d 2d 20 66 69 6c 65 20 76 65 72 73 69  "---- file versi
21d30 6f 6e 20 6f 66 20 5c 22 22 20 24 61 72 63 68 69  on of \"" $archi
21d40 74 65 63 74 75 72 65 20 5c 0d 0a 20 20 20 20 20  tecture \..     
21d50 20 20 20 20 20 20 20 20 20 20 20 22 2f 53 79 73             "/Sys
21d60 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e  tem.Data.SQLite.
21d70 64 6c 6c 5c 22 2e 2e 2e 20 5c 22 22 20 5b 66 69  dll\"... \"" [fi
21d80 6c 65 20 76 65 72 73 69 6f 6e 20 5c 0d 0a 20 20  le version \..  
21d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 67                [g
21da0 65 74 42 69 6e 61 72 79 46 69 6c 65 4e 61 6d 65  etBinaryFileName
21db0 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c   System.Data.SQL
21dc0 69 74 65 2e 64 6c 6c 20 24 61 72 63 68 69 74 65  ite.dll $archite
21dd0 63 74 75 72 65 5d 5d 20 5c 0d 0a 20 20 20 20 20  cture]] \..     
21de0 20 20 20 20 20 20 20 20 20 20 20 5c 22 5c 6e 5d             \"\n]
21df0 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20  ..          }.. 
21e00 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
21e10 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
21e20 20 4e 4f 54 45 3a 20 47 72 61 62 20 74 68 65 20   NOTE: Grab the 
21e30 6c 69 73 74 20 6f 66 20 6d 61 6e 61 67 65 64 20  list of managed 
21e40 61 73 73 65 6d 62 6c 69 65 73 20 66 6f 72 20 74  assemblies for t
21e50 68 65 20 63 75 72 72 65 6e 74 20 70 72 6f 63 65  he current proce
21e60 73 73 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  ss..        #   
21e70 20 20 20 20 61 6e 64 20 72 65 70 6f 72 74 20 6f      and report o
21e80 6e 20 74 68 65 20 53 79 73 74 65 6d 2e 44 61 74  n the System.Dat
21e90 61 2e 53 51 4c 69 74 65 20 72 65 6c 61 74 65 64  a.SQLite related
21ea0 20 6f 6e 65 73 2e 0d 0a 20 20 20 20 20 20 20 20   ones...        
21eb0 23 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b  #..        if {[
21ec0 68 61 76 65 53 51 4c 69 74 65 4f 62 6a 65 63 74  haveSQLiteObject
21ed0 43 6f 6d 6d 61 6e 64 5d 7d 20 74 68 65 6e 20 7b  Command]} then {
21ee0 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20  ..          set 
21ef0 61 73 73 65 6d 62 6c 69 65 73 20 5b 6f 62 6a 65  assemblies [obje
21f00 63 74 20 69 6e 76 6f 6b 65 20 41 70 70 44 6f 6d  ct invoke AppDom
21f10 61 69 6e 2e 43 75 72 72 65 6e 74 44 6f 6d 61 69  ain.CurrentDomai
21f20 6e 20 47 65 74 41 73 73 65 6d 62 6c 69 65 73 5d  n GetAssemblies]
21f30 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 6f 62  ....          ob
21f40 6a 65 63 74 20 66 6f 72 65 61 63 68 20 61 73 73  ject foreach ass
21f50 65 6d 62 6c 79 20 24 61 73 73 65 6d 62 6c 69 65  embly $assemblie
21f60 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s {..           
21f70 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6d 61 74   if {[string mat
21f80 63 68 20 5c 7b 53 79 73 74 65 6d 2e 44 61 74 61  ch \{System.Data
21f90 2e 53 51 4c 69 74 65 2a 20 24 61 73 73 65 6d 62  .SQLite* $assemb
21fa0 6c 79 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  ly]} then {..   
21fb0 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
21fc0 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
21fd0 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
21fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21ff0 20 20 22 2d 2d 2d 2d 20 66 6f 75 6e 64 20 6c 6f    "---- found lo
22000 61 64 65 64 20 61 73 73 65 6d 62 6c 79 3a 20 22  aded assembly: "
22010 20 24 61 73 73 65 6d 62 6c 79 20 5c 6e 5d 0d 0a   $assembly \n]..
22020 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
22030 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
22040 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
22050 20 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20   catch {..      
22060 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
22070 74 5f 63 68 61 6e 6e 65 6c 20 5c 0d 0a 20 20 20  t_channel \..   
22080 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
22090 20 64 65 66 69 6e 65 20 63 6f 6e 73 74 61 6e 74   define constant
220a0 73 20 66 6f 72 20 5c 22 53 79 73 74 65 6d 2e 44  s for \"System.D
220b0 61 74 61 2e 53 51 4c 69 74 65 5c 22 2e 2e 2e 20  ata.SQLite\"... 
220c0 22 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 69  "....          i
220d0 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20  f {[catch {..   
220e0 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20           object 
220f0 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e  invoke -flags +N
22100 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20  onPublic \..    
22110 20 20 20 20 20 20 20 20 20 20 20 20 53 79 73 74              Syst
22120 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 53  em.Data.SQLite.S
22130 51 4c 69 74 65 33 20 44 65 66 69 6e 65 43 6f 6e  QLite3 DefineCon
22140 73 74 61 6e 74 73 0d 0a 20 20 20 20 20 20 20 20  stants..        
22150 20 20 7d 20 64 65 66 69 6e 65 43 6f 6e 73 74 61    } defineConsta
22160 6e 74 73 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20  nts] == 0} then 
22170 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  {..            t
22180 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
22190 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
221a0 20 5b 66 6f 72 6d 61 74 4c 69 73 74 20 5b 6c 73   [formatList [ls
221b0 6f 72 74 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ort \..         
221c0 20 20 20 20 20 20 20 24 64 65 66 69 6e 65 43 6f         $defineCo
221d0 6e 73 74 61 6e 74 73 5d 20 3c 6e 6f 6e 65 3e 5d  nstants] <none>]
221e0 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20   \n]..          
221f0 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
22200 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
22210 65 73 74 5f 63 68 61 6e 6e 65 6c 20 75 6e 6b 6e  est_channel unkn
22220 6f 77 6e 5c 6e 0d 0a 20 20 20 20 20 20 20 20 20  own\n..         
22230 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d   }..        }...
22240 0a 20 20 20 20 20 20 20 20 63 61 74 63 68 20 7b  .        catch {
22250 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70 75 74  ..          tput
22260 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
22270 6c 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  l \..           
22280 20 20 20 22 2d 2d 2d 2d 20 73 6f 75 72 63 65 20     "---- source 
22290 76 65 72 73 69 6f 6e 20 6f 66 20 5c 22 53 79 73  version of \"Sys
222a0 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e  tem.Data.SQLite.
222b0 64 6c 6c 5c 22 2e 2e 2e 20 22 0d 0a 0d 0a 20 20  dll\"... "....  
222c0 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74          if {[cat
222d0 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  ch {..          
222e0 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20    object invoke 
222f0 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69  -flags +NonPubli
22300 63 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  c \..           
22310 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61       System.Data
22320 2e 53 51 4c 69 74 65 2e 53 51 4c 69 74 65 43 6f  .SQLite.SQLiteCo
22330 6e 6e 65 63 74 69 6f 6e 20 50 72 6f 76 69 64 65  nnection Provide
22340 72 56 65 72 73 69 6f 6e 0d 0a 20 20 20 20 20 20  rVersion..      
22350 20 20 20 20 7d 20 76 65 72 73 69 6f 6e 5d 20 3d      } version] =
22360 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  = 0} then {..   
22370 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73 74           if {[st
22380 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 76 65 72  ring length $ver
22390 73 69 6f 6e 5d 20 3d 3d 20 30 7d 20 74 68 65 6e  sion] == 0} then
223a0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
223b0 20 20 73 65 74 20 76 65 72 73 69 6f 6e 20 6e 75    set version nu
223c0 6c 6c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ll..            
223d0 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  }..            t
223e0 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
223f0 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
22400 20 24 76 65 72 73 69 6f 6e 20 5c 6e 5d 0d 0a 20   $version \n].. 
22410 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20           } else 
22420 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  {..            t
22430 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
22440 6e 6e 65 6c 20 75 6e 6b 6e 6f 77 6e 5c 6e 0d 0a  nnel unknown\n..
22450 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
22460 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
22470 20 20 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20    catch {..     
22480 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
22490 73 74 5f 63 68 61 6e 6e 65 6c 20 5c 0d 0a 20 20  st_channel \..  
224a0 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
224b0 2d 20 73 6f 75 72 63 65 20 63 68 65 63 6b 6f 75  - source checkou
224c0 74 20 6f 66 20 5c 22 53 79 73 74 65 6d 2e 44 61  t of \"System.Da
224d0 74 61 2e 53 51 4c 69 74 65 2e 64 6c 6c 5c 22 2e  ta.SQLite.dll\".
224e0 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 20 20 20 20  .. "....        
224f0 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a    if {[catch {..
22500 20 20 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65              obje
22510 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73  ct invoke -flags
22520 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20   +NonPublic \.. 
22530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
22540 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
22550 65 2e 53 51 4c 69 74 65 43 6f 6e 6e 65 63 74 69  e.SQLiteConnecti
22560 6f 6e 20 50 72 6f 76 69 64 65 72 53 6f 75 72 63  on ProviderSourc
22570 65 49 64 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  eId..          }
22580 20 73 6f 75 72 63 65 49 64 5d 20 3d 3d 20 30 7d   sourceId] == 0}
22590 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
225a0 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67       if {[string
225b0 20 6c 65 6e 67 74 68 20 24 73 6f 75 72 63 65 49   length $sourceI
225c0 64 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d  d] == 0} then {.
225d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
225e0 65 74 20 73 6f 75 72 63 65 49 64 20 6e 75 6c 6c  et sourceId null
225f0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
22600 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75  .            tpu
22610 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
22620 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 24  el [appendArgs $
22630 73 6f 75 72 63 65 49 64 20 5c 6e 5d 0d 0a 20 20  sourceId \n]..  
22640 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b          } else {
22650 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70  ..            tp
22660 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  uts $::test_chan
22670 6e 65 6c 20 75 6e 6b 6e 6f 77 6e 5c 6e 0d 0a 20  nel unknown\n.. 
22680 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
22690 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
226a0 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
226b0 54 45 3a 20 43 68 65 63 6b 20 74 68 65 20 61 76  TE: Check the av
226c0 61 69 6c 61 62 6c 65 20 62 75 69 6c 64 73 20 28  ailable builds (
226d0 61 6e 64 20 22 72 65 6c 65 61 73 65 73 22 29 20  and "releases") 
226e0 6f 66 20 53 51 4c 69 74 65 20 61 6e 64 0d 0a 20  of SQLite and.. 
226f0 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 53         #       S
22700 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
22710 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  e...        #.. 
22720 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72 53         checkForS
22730 51 4c 69 74 65 42 75 69 6c 64 73 20 24 3a 3a 74  QLiteBuilds $::t
22740 65 73 74 5f 63 68 61 6e 6e 65 6c 0d 0a 20 20 20  est_channel..   
22750 20 20 20 20 20 63 68 65 63 6b 46 6f 72 53 51 4c       checkForSQL
22760 69 74 65 52 65 6c 65 61 73 65 73 20 24 3a 3a 74  iteReleases $::t
22770 65 73 74 5f 63 68 61 6e 6e 65 6c 0d 0a 0d 0a 20  est_channel.... 
22780 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
22790 20 20 23 20 4e 4f 54 45 3a 20 4e 6f 77 2c 20 77    # NOTE: Now, w
227a0 65 20 6e 65 65 64 20 74 6f 20 6b 6e 6f 77 20 69  e need to know i
227b0 66 20 74 68 65 20 53 51 4c 69 74 65 20 63 6f 72  f the SQLite cor
227c0 65 20 6c 69 62 72 61 72 79 20 69 73 20 61 76 61  e library is ava
227d0 69 6c 61 62 6c 65 0d 0a 20 20 20 20 20 20 20 20  ilable..        
227e0 23 20 20 20 20 20 20 20 28 69 2e 65 2e 20 62 65  #       (i.e. be
227f0 63 61 75 73 65 20 74 68 65 20 6d 61 6e 61 67 65  cause the manage
22800 64 2d 6f 6e 6c 79 20 53 79 73 74 65 6d 2e 44 61  d-only System.Da
22810 74 61 2e 53 51 4c 69 74 65 20 61 73 73 65 6d 62  ta.SQLite assemb
22820 6c 79 20 63 61 6e 0d 0a 20 20 20 20 20 20 20 20  ly can..        
22830 23 20 20 20 20 20 20 20 6c 6f 61 64 20 77 69 74  #       load wit
22840 68 6f 75 74 20 69 74 3b 20 68 6f 77 65 76 65 72  hout it; however
22850 2c 20 69 74 20 63 61 6e 6e 6f 74 20 64 6f 20 61  , it cannot do a
22860 6e 79 74 68 69 6e 67 20 75 73 65 66 75 6c 20 77  nything useful w
22870 69 74 68 6f 75 74 0d 0a 20 20 20 20 20 20 20 20  ithout..        
22880 23 20 20 20 20 20 20 20 69 74 29 2e 20 20 49 66  #       it).  If
22890 20 77 65 20 61 72 65 20 75 73 69 6e 67 20 74 68   we are using th
228a0 65 20 6d 69 78 65 64 2d 6d 6f 64 65 20 61 73 73  e mixed-mode ass
228b0 65 6d 62 6c 79 20 61 6e 64 20 77 65 20 61 6c 72  embly and we alr
228c0 65 61 64 79 0d 0a 20 20 20 20 20 20 20 20 23 20  eady..        # 
228d0 20 20 20 20 20 20 66 6f 75 6e 64 20 69 74 20 28        found it (
228e0 61 62 6f 76 65 29 2c 20 74 68 69 73 20 73 68 6f  above), this sho
228f0 75 6c 64 20 61 6c 77 61 79 73 20 73 75 63 63 65  uld always succe
22900 65 64 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  ed...        #..
22910 20 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72          checkFor
22920 53 51 4c 69 74 65 4c 69 62 72 61 72 79 20 24 3a  SQLiteLibrary $:
22930 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 0d 0a 0d  :test_channel...
22940 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
22950 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68 65 63      # NOTE: Chec
22960 6b 20 69 66 20 74 68 65 20 53 51 4c 69 74 65 20  k if the SQLite 
22970 69 6e 74 65 72 6f 70 20 61 73 73 65 6d 62 6c 79  interop assembly
22980 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2e 0d 0a   is available...
22990 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
229a0 20 20 20 63 68 65 63 6b 46 6f 72 53 51 4c 69 74     checkForSQLit
229b0 65 49 6e 74 65 72 6f 70 20 24 3a 3a 74 65 73 74  eInterop $::test
229c0 5f 63 68 61 6e 6e 65 6c 0d 0a 0d 0a 20 20 20 20  _channel....    
229d0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
229e0 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 74 68 65   NOTE: Check the
229f0 20 53 51 4c 69 74 65 20 64 61 74 61 62 61 73 65   SQLite database
22a00 20 61 6e 64 20 74 65 6d 70 6f 72 61 72 79 20 64   and temporary d
22a10 69 72 65 63 74 6f 72 69 65 73 2e 0d 0a 20 20 20  irectories...   
22a20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
22a30 63 68 65 63 6b 46 6f 72 53 51 4c 69 74 65 44 69  checkForSQLiteDi
22a40 72 65 63 74 6f 72 69 65 73 20 24 3a 3a 74 65 73  rectories $::tes
22a50 74 5f 63 68 61 6e 6e 65 6c 0d 0a 0d 0a 20 20 20  t_channel....   
22a60 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
22a70 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74 20  # NOTE: Attempt 
22a80 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20  to determine if 
22a90 76 61 72 69 6f 75 73 20 63 6f 6d 70 69 6c 65 2d  various compile-
22aa0 74 69 6d 65 20 6f 70 74 69 6f 6e 73 20 6e 65 65  time options nee
22ab0 64 65 64 20 66 6f 72 0d 0a 20 20 20 20 20 20 20  ded for..       
22ac0 20 23 20 20 20 20 20 20 20 74 65 73 74 20 63 6f   #       test co
22ad0 6e 73 74 72 61 69 6e 74 73 20 77 65 72 65 20 65  nstraints were e
22ae0 6e 61 62 6c 65 64 20 66 6f 72 20 74 68 65 20 6d  nabled for the m
22af0 61 6e 61 67 65 64 20 61 73 73 65 6d 62 6c 79 2e  anaged assembly.
22b00 20 20 54 68 65 72 65 0d 0a 20 20 20 20 20 20 20    There..       
22b10 20 23 20 20 20 20 20 20 20 61 72 65 20 73 6f 6d   #       are som
22b20 65 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f  e compile-time o
22b30 70 74 69 6f 6e 73 20 74 68 61 74 20 6d 75 73 74  ptions that must
22b40 20 61 6c 73 6f 20 68 61 76 65 20 62 65 65 6e 20   also have been 
22b50 65 6e 61 62 6c 65 64 0d 0a 20 20 20 20 20 20 20  enabled..       
22b60 20 23 20 20 20 20 20 20 20 66 6f 72 20 74 68 65   #       for the
22b70 20 69 6e 74 65 72 6f 70 20 61 73 73 65 6d 62 6c   interop assembl
22b80 79 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 62 65  y in order to be
22b90 20 65 66 66 65 63 74 69 76 65 2e 20 20 46 6f 72   effective.  For
22ba0 20 74 68 6f 73 65 0d 0a 20 20 20 20 20 20 20 20   those..        
22bb0 23 20 20 20 20 20 20 20 6f 70 74 69 6f 6e 73 2c  #       options,
22bc0 20 69 74 20 77 69 6c 6c 20 62 65 20 61 73 73 75   it will be assu
22bd0 6d 65 64 20 74 68 61 74 20 69 74 20 77 61 73 20  med that it was 
22be0 65 6e 61 62 6c 65 64 20 66 6f 72 20 74 68 65 20  enabled for the 
22bf0 69 6e 74 65 72 6f 70 0d 0a 20 20 20 20 20 20 20  interop..       
22c00 20 23 20 20 20 20 20 20 20 61 73 73 65 6d 62 6c   #       assembl
22c10 79 20 69 66 20 69 74 20 77 61 73 20 65 6e 61 62  y if it was enab
22c20 6c 65 64 20 66 6f 72 20 74 68 65 20 6d 61 6e 61  led for the mana
22c30 67 65 64 20 61 73 73 65 6d 62 6c 79 2e 0d 0a 20  ged assembly... 
22c40 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
22c50 20 20 66 6f 72 65 61 63 68 20 64 65 66 69 6e 65    foreach define
22c60 43 6f 6e 73 74 61 6e 74 20 5b 6c 69 73 74 20 5c  Constant [list \
22c70 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 43 48  ..            CH
22c80 45 43 4b 5f 53 54 41 54 45 20 43 4f 55 4e 54 5f  ECK_STATE COUNT_
22c90 48 41 4e 44 4c 45 20 44 45 42 55 47 20 49 4e 54  HANDLE DEBUG INT
22ca0 45 52 4f 50 5f 43 4f 44 45 43 20 49 4e 54 45 52  EROP_CODEC INTER
22cb0 4f 50 5f 44 45 42 55 47 20 5c 0d 0a 20 20 20 20  OP_DEBUG \..    
22cc0 20 20 20 20 20 20 20 20 49 4e 54 45 52 4f 50 5f          INTEROP_
22cd0 45 58 54 45 4e 53 49 4f 4e 5f 46 55 4e 43 54 49  EXTENSION_FUNCTI
22ce0 4f 4e 53 20 49 4e 54 45 52 4f 50 5f 46 54 53 35  ONS INTEROP_FTS5
22cf0 5f 45 58 54 45 4e 53 49 4f 4e 20 5c 0d 0a 20 20  _EXTENSION \..  
22d00 20 20 20 20 20 20 20 20 20 20 49 4e 54 45 52 4f            INTERO
22d10 50 5f 49 4e 43 4c 55 44 45 5f 43 45 52 4f 44 20  P_INCLUDE_CEROD 
22d20 49 4e 54 45 52 4f 50 5f 49 4e 43 4c 55 44 45 5f  INTEROP_INCLUDE_
22d30 45 58 54 52 41 20 49 4e 54 45 52 4f 50 5f 49 4e  EXTRA INTEROP_IN
22d40 43 4c 55 44 45 5f 53 45 45 20 5c 0d 0a 20 20 20  CLUDE_SEE \..   
22d50 20 20 20 20 20 20 20 20 20 49 4e 54 45 52 4f 50           INTEROP
22d60 5f 49 4e 43 4c 55 44 45 5f 5a 49 50 56 46 53 20  _INCLUDE_ZIPVFS 
22d70 49 4e 54 45 52 4f 50 5f 4a 53 4f 4e 31 5f 45 58  INTEROP_JSON1_EX
22d80 54 45 4e 53 49 4f 4e 20 5c 0d 0a 20 20 20 20 20  TENSION \..     
22d90 20 20 20 20 20 20 20 49 4e 54 45 52 4f 50 5f 4c         INTEROP_L
22da0 45 47 41 43 59 5f 43 4c 4f 53 45 20 49 4e 54 45  EGACY_CLOSE INTE
22db0 52 4f 50 5f 4c 4f 47 20 49 4e 54 45 52 4f 50 5f  ROP_LOG INTEROP_
22dc0 50 45 52 43 45 4e 54 49 4c 45 5f 45 58 54 45 4e  PERCENTILE_EXTEN
22dd0 53 49 4f 4e 20 5c 0d 0a 20 20 20 20 20 20 20 20  SION \..        
22de0 20 20 20 20 49 4e 54 45 52 4f 50 5f 52 45 47 45      INTEROP_REGE
22df0 58 50 5f 45 58 54 45 4e 53 49 4f 4e 20 49 4e 54  XP_EXTENSION INT
22e00 45 52 4f 50 5f 54 45 53 54 5f 45 58 54 45 4e 53  EROP_TEST_EXTENS
22e10 49 4f 4e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ION \..         
22e20 20 20 20 49 4e 54 45 52 4f 50 5f 54 4f 54 59 50     INTEROP_TOTYP
22e30 45 5f 45 58 54 45 4e 53 49 4f 4e 20 49 4e 54 45  E_EXTENSION INTE
22e40 52 4f 50 5f 56 49 52 54 55 41 4c 5f 54 41 42 4c  ROP_VIRTUAL_TABL
22e50 45 20 4e 45 54 5f 32 30 20 4e 45 54 5f 33 35 20  E NET_20 NET_35 
22e60 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 4e  \..            N
22e70 45 54 5f 34 30 20 4e 45 54 5f 34 35 20 4e 45 54  ET_40 NET_45 NET
22e80 5f 34 35 31 20 4e 45 54 5f 34 35 32 20 4e 45 54  _451 NET_452 NET
22e90 5f 34 36 20 4e 45 54 5f 34 36 31 20 4e 45 54 5f  _46 NET_461 NET_
22ea0 43 4f 4d 50 41 43 54 5f 32 30 20 5c 0d 0a 20 20  COMPACT_20 \..  
22eb0 20 20 20 20 20 20 20 20 20 20 50 4c 41 54 46 4f            PLATFO
22ec0 52 4d 5f 43 4f 4d 50 41 43 54 46 52 41 4d 45 57  RM_COMPACTFRAMEW
22ed0 4f 52 4b 20 50 52 45 4c 4f 41 44 5f 4e 41 54 49  ORK PRELOAD_NATI
22ee0 56 45 5f 4c 49 42 52 41 52 59 20 52 45 54 41 52  VE_LIBRARY RETAR
22ef0 47 45 54 41 42 4c 45 20 5c 0d 0a 20 20 20 20 20  GETABLE \..     
22f00 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 53 54         SQLITE_ST
22f10 41 4e 44 41 52 44 20 53 51 4c 49 54 45 5f 53 54  ANDARD SQLITE_ST
22f20 41 4e 44 41 52 44 5f 4c 49 42 52 41 52 59 5f 4e  ANDARD_LIBRARY_N
22f30 41 4d 45 20 54 48 52 4f 57 5f 4f 4e 5f 44 49 53  AME THROW_ON_DIS
22f40 50 4f 53 45 44 20 5c 0d 0a 20 20 20 20 20 20 20  POSED \..       
22f50 20 20 20 20 20 54 52 41 43 45 20 54 52 41 43 45       TRACE TRACE
22f60 5f 43 4f 4e 4e 45 43 54 49 4f 4e 20 54 52 41 43  _CONNECTION TRAC
22f70 45 5f 44 45 54 45 43 54 49 4f 4e 20 54 52 41 43  E_DETECTION TRAC
22f80 45 5f 48 41 4e 44 4c 45 20 54 52 41 43 45 5f 50  E_HANDLE TRACE_P
22f90 52 45 4c 4f 41 44 20 5c 0d 0a 20 20 20 20 20 20  RELOAD \..      
22fa0 20 20 20 20 20 20 54 52 41 43 45 5f 53 48 41 52        TRACE_SHAR
22fb0 45 44 20 54 52 41 43 45 5f 53 54 41 54 45 4d 45  ED TRACE_STATEME
22fc0 4e 54 20 54 52 41 43 45 5f 57 41 52 4e 49 4e 47  NT TRACE_WARNING
22fd0 20 54 52 41 43 4b 5f 4d 45 4d 4f 52 59 5f 42 59   TRACK_MEMORY_BY
22fe0 54 45 53 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  TES \..         
22ff0 20 20 20 55 53 45 5f 45 4e 54 49 54 59 5f 46 52     USE_ENTITY_FR
23000 41 4d 45 57 4f 52 4b 5f 36 20 55 53 45 5f 49 4e  AMEWORK_6 USE_IN
23010 54 45 52 4f 50 5f 44 4c 4c 20 55 53 45 5f 50 52  TEROP_DLL USE_PR
23020 45 50 41 52 45 5f 56 32 20 57 49 4e 44 4f 57 53  EPARE_V2 WINDOWS
23030 5d 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 23  ] {..          #
23040 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f  ..          # NO
23050 54 45 3a 20 43 68 65 63 6b 20 69 66 20 74 68 65  TE: Check if the
23060 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70   compile-time op
23070 74 69 6f 6e 20 69 73 20 6c 69 73 74 65 64 20 69  tion is listed i
23080 6e 20 74 68 65 20 6c 69 73 74 20 6f 66 0d 0a 20  n the list of.. 
23090 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20           #      
230a0 20 22 64 65 66 69 6e 65 20 63 6f 6e 73 74 61 6e   "define constan
230b0 74 73 22 20 6b 65 70 74 20 74 72 61 63 6b 20 6f  ts" kept track o
230c0 66 20 62 79 20 74 68 65 20 6d 61 6e 61 67 65 64  f by the managed
230d0 20 61 73 73 65 6d 62 6c 79 2e 0d 0a 20 20 20 20   assembly...    
230e0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
230f0 20 20 20 63 68 65 63 6b 46 6f 72 53 51 4c 69 74     checkForSQLit
23100 65 44 65 66 69 6e 65 43 6f 6e 73 74 61 6e 74 20  eDefineConstant 
23110 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
23120 24 64 65 66 69 6e 65 43 6f 6e 73 74 61 6e 74 0d  $defineConstant.
23130 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  .        }....  
23140 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
23150 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 69   # NOTE: Check i
23160 66 20 74 68 65 20 53 79 73 74 65 6d 2e 44 61 74  f the System.Dat
23170 61 2e 53 51 4c 69 74 65 20 70 72 6f 76 69 64 65  a.SQLite provide
23180 72 20 77 61 73 20 63 6f 6d 70 69 6c 65 64 20 77  r was compiled w
23190 69 74 68 0d 0a 20 20 20 20 20 20 20 20 23 20 20  ith..        #  
231a0 20 20 20 20 20 73 75 70 70 6f 72 74 20 66 6f 72       support for
231b0 20 61 6e 79 20 65 6e 63 72 79 70 74 65 64 20 64   any encrypted d
231c0 61 74 61 62 61 73 65 73 2e 0d 0a 20 20 20 20 20  atabases...     
231d0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 69 66     #..        if
231e0 20 7b 5b 68 61 76 65 53 51 4c 69 74 65 44 65 66   {[haveSQLiteDef
231f0 69 6e 65 43 6f 6e 73 74 61 6e 74 20 49 4e 54 45  ineConstant INTE
23200 52 4f 50 5f 43 4f 44 45 43 5d 20 7c 7c 20 5c 0d  ROP_CODEC] || \.
23210 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 68 61  .            [ha
23220 76 65 53 51 4c 69 74 65 44 65 66 69 6e 65 43 6f  veSQLiteDefineCo
23230 6e 73 74 61 6e 74 20 49 4e 54 45 52 4f 50 5f 49  nstant INTEROP_I
23240 4e 43 4c 55 44 45 5f 53 45 45 5d 7d 20 74 68 65  NCLUDE_SEE]} the
23250 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 23  n {..          #
23260 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f  ..          # NO
23270 54 45 3a 20 59 65 73 2c 20 61 64 64 20 67 65 6e  TE: Yes, add gen
23280 65 72 69 63 20 63 6f 6e 73 74 72 61 69 6e 74 20  eric constraint 
23290 66 6f 72 20 75 73 65 20 62 79 20 74 68 65 20 74  for use by the t
232a0 65 73 74 20 73 75 69 74 65 2e 0d 0a 20 20 20 20  est suite...    
232b0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
232c0 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74     addConstraint
232d0 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c   System.Data.SQL
232e0 69 74 65 2e 45 6e 63 72 79 70 74 69 6f 6e 0d 0a  ite.Encryption..
232f0 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
23300 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
23310 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 74 68  # NOTE: Check th
23320 65 20 63 75 72 72 65 6e 74 20 62 75 69 6c 64 20  e current build 
23330 79 65 61 72 2e 20 20 42 61 73 69 63 61 6c 6c 79  year.  Basically
23340 2c 20 74 68 69 73 20 69 6e 64 69 63 61 74 65 73  , this indicates
23350 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
23360 20 20 77 68 69 63 68 20 76 65 72 73 69 6f 6e 20    which version 
23370 6f 66 20 4d 53 42 75 69 6c 64 20 61 6e 64 2f 6f  of MSBuild and/o
23380 72 20 56 69 73 75 61 6c 20 53 74 75 64 69 6f 20  r Visual Studio 
23390 77 61 73 20 75 73 65 64 20 74 6f 0d 0a 20 20 20  was used to..   
233a0 20 20 20 20 20 23 20 20 20 20 20 20 20 63 6f 6d       #       com
233b0 70 69 6c 65 20 74 68 65 20 61 73 73 65 6d 62 6c  pile the assembl
233c0 79 20 62 69 6e 61 72 69 65 73 20 75 6e 64 65 72  y binaries under
233d0 20 74 65 73 74 2e 0d 0a 20 20 20 20 20 20 20 20   test...        
233e0 23 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73  #..        tputs
233f0 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
23400 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
23410 22 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e 67 20 66  "---- checking f
23420 6f 72 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53  or System.Data.S
23430 51 4c 69 74 65 20 62 75 69 6c 64 20 79 65 61 72  QLite build year
23440 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 20 20 20  ... "....       
23450 20 73 65 74 20 79 65 61 72 20 5b 67 65 74 42 75   set year [getBu
23460 69 6c 64 59 65 61 72 5d 0d 0a 20 20 20 20 20 20  ildYear]..      
23470 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20    addConstraint 
23480 5b 61 70 70 65 6e 64 41 72 67 73 20 62 75 69 6c  [appendArgs buil
23490 64 59 65 61 72 2e 20 24 79 65 61 72 5d 0d 0a 20  dYear. $year].. 
234a0 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
234b0 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70  test_channel [ap
234c0 70 65 6e 64 41 72 67 73 20 5c 22 20 24 79 65 61  pendArgs \" $yea
234d0 72 20 5c 22 5c 6e 5d 0d 0a 0d 0a 20 20 20 20 20  r \"\n]....     
234e0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
234f0 4e 4f 54 45 3a 20 43 68 65 63 6b 20 74 68 65 20  NOTE: Check the 
23500 63 75 72 72 65 6e 74 20 62 75 69 6c 64 20 2e 4e  current build .N
23510 45 54 20 46 72 61 6d 65 77 6f 72 6b 2e 20 20 42  ET Framework.  B
23520 61 73 69 63 61 6c 6c 79 2c 20 74 68 69 73 0d 0a  asically, this..
23530 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
23540 69 6e 64 69 63 61 74 65 73 20 77 68 69 63 68 20  indicates which 
23550 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 65 20 2e  version of the .
23560 4e 45 54 20 46 72 61 6d 65 77 6f 72 6b 20 69 73  NET Framework is
23570 20 62 65 69 6e 67 0d 0a 20 20 20 20 20 20 20 20   being..        
23580 23 20 20 20 20 20 20 20 75 73 65 64 20 62 79 20  #       used by 
23590 74 68 65 20 61 73 73 65 6d 62 6c 79 20 62 69 6e  the assembly bin
235a0 61 72 69 65 73 20 75 6e 64 65 72 20 74 65 73 74  aries under test
235b0 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
235c0 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
235d0 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5c 0d 0a 20  est_channel \.. 
235e0 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
235f0 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 53 79   checking for Sy
23600 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
23610 20 62 75 69 6c 64 20 2e 4e 45 54 20 46 72 61 6d   build .NET Fram
23620 65 77 6f 72 6b 2e 2e 2e 20 22 0d 0a 0d 0a 20 20  ework... "....  
23630 20 20 20 20 20 20 73 65 74 20 6e 65 74 46 78 20        set netFx 
23640 5b 67 65 74 42 75 69 6c 64 4e 65 74 46 78 5d 0d  [getBuildNetFx].
23650 0a 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73  .        addCons
23660 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72  traint [appendAr
23670 67 73 20 62 75 69 6c 64 46 72 61 6d 65 77 6f 72  gs buildFramewor
23680 6b 2e 20 24 6e 65 74 46 78 5d 0d 0a 20 20 20 20  k. $netFx]..    
23690 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
236a0 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e  t_channel [appen
236b0 64 41 72 67 73 20 5c 22 20 24 6e 65 74 46 78 20  dArgs \" $netFx 
236c0 5c 22 5c 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  \"\n]....       
236d0 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
236e0 54 45 3a 20 43 68 65 63 6b 20 74 68 65 20 63 75  TE: Check the cu
236f0 72 72 65 6e 74 20 62 75 69 6c 64 20 63 6f 6e 66  rrent build conf
23700 69 67 75 72 61 74 69 6f 6e 2e 20 20 54 68 69 73  iguration.  This
23710 20 73 68 6f 75 6c 64 20 6e 6f 72 6d 61 6c 6c 79   should normally
23720 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
23730 20 20 62 65 20 65 69 74 68 65 72 20 22 44 65 62    be either "Deb
23740 75 67 22 20 6f 72 20 22 52 65 6c 65 61 73 65 22  ug" or "Release"
23750 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
23760 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
23770 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5c 0d 0a 20  est_channel \.. 
23780 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
23790 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 53 79   checking for Sy
237a0 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
237b0 20 62 75 69 6c 64 20 63 6f 6e 66 69 67 75 72 61   build configura
237c0 74 69 6f 6e 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20  tion... "....   
237d0 20 20 20 20 20 73 65 74 20 63 6f 6e 66 69 67 75       set configu
237e0 72 61 74 69 6f 6e 20 5b 67 65 74 42 75 69 6c 64  ration [getBuild
237f0 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 5d 0d 0a  Configuration]..
23800 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74          addConst
23810 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67  raint [appendArg
23820 73 20 62 75 69 6c 64 43 6f 6e 66 69 67 75 72 61  s buildConfigura
23830 74 69 6f 6e 2e 20 24 63 6f 6e 66 69 67 75 72 61  tion. $configura
23840 74 69 6f 6e 5d 0d 0a 20 20 20 20 20 20 20 20 74  tion]..        t
23850 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
23860 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
23870 20 5c 22 20 24 63 6f 6e 66 69 67 75 72 61 74 69   \" $configurati
23880 6f 6e 20 5c 22 5c 6e 5d 0d 0a 0d 0a 20 20 20 20  on \"\n]....    
23890 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
238a0 20 4e 4f 54 45 3a 20 54 72 79 20 74 6f 20 73 65   NOTE: Try to se
238b0 74 75 70 20 61 6e 20 69 6e 74 65 72 72 75 70 74  tup an interrupt
238c0 20 63 61 6c 6c 62 61 63 6b 20 75 73 69 6e 67 20   callback using 
238d0 74 68 65 20 73 63 72 69 70 74 20 64 65 62 75 67  the script debug
238e0 67 65 72 0d 0a 20 20 20 20 20 20 20 20 23 20 20  ger..        #  
238f0 20 20 20 20 20 74 68 61 74 20 77 69 6c 6c 20 63       that will c
23900 61 6e 63 65 6c 20 61 6c 6c 20 53 51 4c 20 71 75  ancel all SQL qu
23910 65 72 69 65 73 20 69 6e 20 70 72 6f 67 72 65 73  eries in progres
23920 73 20 66 6f 72 20 61 6c 6c 20 64 61 74 61 62 61  s for all databa
23930 73 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  se..        #   
23940 20 20 20 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20      connections 
23950 6b 6e 6f 77 6e 20 74 6f 20 74 68 69 73 20 69 6e  known to this in
23960 74 65 72 70 72 65 74 65 72 2e 0d 0a 20 20 20 20  terpreter...    
23970 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 69      #..        i
23980 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73  f {![info exists
23990 20 3a 3a 6e 6f 28 73 71 6c 69 74 65 49 6e 74 65   ::no(sqliteInte
239a0 72 72 75 70 74 43 61 6c 6c 62 61 63 6b 29 5d 7d  rruptCallback)]}
239b0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
239c0 20 20 20 73 65 74 75 70 44 62 49 6e 74 65 72 72     setupDbInterr
239d0 75 70 74 43 61 6c 6c 62 61 63 6b 20 24 3a 3a 74  uptCallback $::t
239e0 65 73 74 5f 63 68 61 6e 6e 65 6c 20 24 3a 3a 74  est_channel $::t
239f0 65 73 74 5f 6c 6f 67 0d 0a 20 20 20 20 20 20 20  est_log..       
23a00 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d   }....        #.
23a10 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
23a20 20 43 68 65 63 6b 20 66 6f 72 20 74 68 65 20 6e   Check for the n
23a30 61 74 69 76 65 20 72 75 6e 74 69 6d 65 20 6f 70  ative runtime op
23a40 74 69 6f 6e 2c 20 77 68 69 63 68 20 77 6f 75 6c  tion, which woul
23a50 64 20 6d 65 61 6e 20 77 65 20 61 72 65 0d 0a 20  d mean we are.. 
23a60 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 75         #       u
23a70 73 69 6e 67 20 74 68 65 20 6d 69 78 65 64 2d 6d  sing the mixed-m
23a80 6f 64 65 20 61 73 73 65 6d 62 6c 79 2e 0d 0a 20  ode assembly... 
23a90 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
23aa0 20 20 63 68 65 63 6b 46 6f 72 52 75 6e 74 69 6d    checkForRuntim
23ab0 65 4f 70 74 69 6f 6e 20 24 3a 3a 74 65 73 74 5f  eOption $::test_
23ac0 63 68 61 6e 6e 65 6c 20 6e 61 74 69 76 65 0d 0a  channel native..
23ad0 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
23ae0 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68 65       # NOTE: Che
23af0 63 6b 20 69 66 20 74 68 65 20 74 65 73 74 20 73  ck if the test s
23b00 75 69 74 65 20 73 68 6f 75 6c 64 20 63 6f 75 6e  uite should coun
23b10 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  t the number of 
23b20 63 6f 6e 6e 65 63 74 69 6f 6e 73 0d 0a 20 20 20  connections..   
23b30 20 20 20 20 20 23 20 20 20 20 20 20 20 22 6f 70       #       "op
23b40 65 6e 65 64 22 20 61 6e 64 20 22 63 6c 6f 73 65  ened" and "close
23b50 64 22 20 66 72 6f 6d 20 74 68 65 20 70 6f 6f 6c  d" from the pool
23b60 20 77 68 65 6e 20 64 65 74 65 72 6d 69 6e 69 6e   when determinin
23b70 67 20 69 66 20 61 20 74 65 73 74 0d 0a 20 20 20  g if a test..   
23b80 20 20 20 20 20 23 20 20 20 20 20 20 20 70 61 73       #       pas
23b90 73 65 64 2e 20 20 44 69 73 61 62 6c 69 6e 67 20  sed.  Disabling 
23ba0 74 68 69 73 20 62 65 68 61 76 69 6f 72 20 69 73  this behavior is
23bb0 20 73 6f 6d 65 74 69 6d 65 73 20 6e 65 63 65 73   sometimes neces
23bc0 73 61 72 79 20 28 65 2e 67 2e 0d 0a 20 20 20 20  sary (e.g...    
23bd0 20 20 20 20 23 20 20 20 20 20 20 20 64 75 72 69      #       duri
23be0 6e 67 20 74 68 65 20 72 65 6c 65 61 73 65 20 74  ng the release t
23bf0 65 73 74 69 6e 67 20 70 72 6f 63 65 73 73 29 20  esting process) 
23c00 62 65 63 61 75 73 65 20 74 68 65 72 65 20 61 72  because there ar
23c10 65 20 73 65 76 65 72 61 6c 0d 0a 20 20 20 20 20  e several..     
23c20 20 20 20 23 20 20 20 20 20 20 20 74 65 73 74 73     #       tests
23c30 20 74 68 61 74 20 72 65 6c 79 20 6f 6e 20 74 68   that rely on th
23c40 65 20 22 6f 70 65 6e 65 64 20 66 72 6f 6d 20 70  e "opened from p
23c50 6f 6f 6c 22 20 63 6f 75 6e 74 20 62 65 69 6e 67  ool" count being
23c60 20 67 72 65 61 74 65 72 0d 0a 20 20 20 20 20 20   greater..      
23c70 20 20 23 20 20 20 20 20 20 20 74 68 61 6e 20 7a    #       than z
23c80 65 72 6f 2e 20 20 54 68 65 73 65 20 74 65 73 74  ero.  These test
23c90 73 20 6d 61 79 20 66 61 69 6c 20 64 75 65 20 74  s may fail due t
23ca0 6f 20 74 68 65 20 6e 6f 6e 2d 64 65 74 65 72 6d  o the non-determ
23cb0 69 6e 69 73 74 69 63 0d 0a 20 20 20 20 20 20 20  inistic..       
23cc0 20 23 20 20 20 20 20 20 20 62 65 68 61 76 69 6f   #       behavio
23cd0 72 20 6f 66 20 74 68 65 20 43 4c 52 20 47 43 2c  r of the CLR GC,
23ce0 20 65 76 65 6e 20 77 68 65 6e 20 74 68 65 72 65   even when there
23cf0 20 69 73 20 6e 6f 20 62 75 67 20 69 6e 20 74 68   is no bug in th
23d00 65 20 63 6f 64 65 0d 0a 20 20 20 20 20 20 20 20  e code..        
23d10 23 20 20 20 20 20 20 20 62 65 69 6e 67 20 74 65  #       being te
23d20 73 74 65 64 2e 0d 0a 20 20 20 20 20 20 20 20 23  sted...        #
23d30 0d 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b 46  ..        checkF
23d40 6f 72 52 75 6e 74 69 6d 65 4f 70 74 69 6f 6e 20  orRuntimeOption 
23d50 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
23d60 6e 6f 50 6f 6f 6c 43 6f 75 6e 74 73 0d 0a 0d 0a  noPoolCounts....
23d70 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
23d80 20 20 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b     # NOTE: Check
23d90 20 69 66 20 74 68 65 20 74 65 73 74 20 73 75 69   if the test sui
23da0 74 65 20 73 68 6f 75 6c 64 20 75 73 65 20 73 68  te should use sh
23db0 61 72 65 64 2d 63 61 63 68 65 20 6d 6f 64 65 2e  ared-cache mode.
23dc0 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
23dd0 20 20 20 20 20 63 68 65 63 6b 46 6f 72 52 75 6e       checkForRun
23de0 74 69 6d 65 4f 70 74 69 6f 6e 20 24 3a 3a 74 65  timeOption $::te
23df0 73 74 5f 63 68 61 6e 6e 65 6c 20 73 68 61 72 65  st_channel share
23e00 64 43 61 63 68 65 0d 0a 0d 0a 20 20 20 20 20 20  dCache....      
23e10 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
23e20 4f 54 45 3a 20 52 65 70 6f 72 74 20 74 68 65 20  OTE: Report the 
23e30 72 65 73 6f 75 72 63 65 20 75 73 61 67 65 20 70  resource usage p
23e40 72 69 6f 72 20 74 6f 20 72 75 6e 6e 69 6e 67 20  rior to running 
23e50 61 6e 79 20 74 65 73 74 73 2e 0d 0a 20 20 20 20  any tests...    
23e60 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72      #..        r
23e70 65 70 6f 72 74 53 51 4c 69 74 65 52 65 73 6f 75  eportSQLiteResou
23e80 72 63 65 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  rces $::test_cha
23e90 6e 6e 65 6c 0d 0a 0d 0a 20 20 20 20 20 20 20 20  nnel....        
23ea0 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
23eb0 45 3a 20 47 72 61 62 20 74 68 65 20 6c 69 73 74  E: Grab the list
23ec0 20 6f 66 20 6e 61 74 69 76 65 20 6d 6f 64 75 6c   of native modul
23ed0 65 73 20 66 6f 72 20 74 68 65 20 63 75 72 72 65  es for the curre
23ee0 6e 74 20 70 72 6f 63 65 73 73 20 61 6e 64 0d 0a  nt process and..
23ef0 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
23f00 72 65 70 6f 72 74 20 6f 6e 20 74 68 65 20 53 79  report on the Sy
23f10 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
23f20 20 72 65 6c 61 74 65 64 20 6f 6e 65 73 2e 0d 0a   related ones...
23f30 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
23f40 20 20 20 69 66 20 7b 5b 68 61 76 65 53 51 4c 69     if {[haveSQLi
23f50 74 65 4f 62 6a 65 63 74 43 6f 6d 6d 61 6e 64 5d  teObjectCommand]
23f60 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
23f70 20 20 20 20 73 65 74 20 6d 6f 64 75 6c 65 73 20      set modules 
23f80 5b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 5c  [object invoke \
23f90 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
23fa0 53 79 73 74 65 6d 2e 44 69 61 67 6e 6f 73 74 69  System.Diagnosti
23fb0 63 73 2e 50 72 6f 63 65 73 73 2e 47 65 74 43 75  cs.Process.GetCu
23fc0 72 72 65 6e 74 50 72 6f 63 65 73 73 20 4d 6f 64  rrentProcess Mod
23fd0 75 6c 65 73 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  ules]....       
23fe0 20 20 20 6f 62 6a 65 63 74 20 66 6f 72 65 61 63     object foreac
23ff0 68 20 2d 61 6c 69 61 73 20 6d 6f 64 75 6c 65 20  h -alias module 
24000 24 6d 6f 64 75 6c 65 73 20 7b 0d 0a 20 20 20 20  $modules {..    
24010 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
24020 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54         # NOTE: T
24030 68 65 20 6d 6f 64 75 6c 65 20 66 69 6c 65 20 6e  he module file n
24040 61 6d 65 20 68 65 72 65 20 6d 75 73 74 20 62 65  ame here must be
24050 20 6e 6f 72 6d 61 6c 69 7a 65 64 2e 0d 0a 20 20   normalized...  
24060 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
24070 20 20 20 20 20 20 20 20 20 73 65 74 20 66 69 6c           set fil
24080 65 4e 61 6d 65 20 5b 66 69 6c 65 20 6e 6f 72 6d  eName [file norm
24090 61 6c 69 7a 65 20 5b 24 6d 6f 64 75 6c 65 20 46  alize [$module F
240a0 69 6c 65 4e 61 6d 65 5d 5d 0d 0a 20 20 20 20 20  ileName]]..     
240b0 20 20 20 20 20 20 20 73 65 74 20 66 69 6c 65 4e         set fileN
240c0 61 6d 65 4f 6e 6c 79 20 5b 66 69 6c 65 20 74 61  ameOnly [file ta
240d0 69 6c 20 24 66 69 6c 65 4e 61 6d 65 5d 0d 0a 0d  il $fileName]...
240e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20  .            if 
240f0 7b 5b 6c 73 65 61 72 63 68 20 2d 65 78 61 63 74  {[lsearch -exact
24100 20 2d 6e 6f 63 61 73 65 20 2d 2d 20 5c 0d 0a 20   -nocase -- \.. 
24110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b                 [
24120 67 65 74 4e 61 74 69 76 65 4c 69 62 72 61 72 79  getNativeLibrary
24130 46 69 6c 65 4e 61 6d 65 73 4f 6e 6c 79 5d 20 24  FileNamesOnly] $
24140 66 69 6c 65 4e 61 6d 65 4f 6e 6c 79 5d 20 21 3d  fileNameOnly] !=
24150 20 2d 31 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20   -1} then {..   
24160 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
24170 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
24180 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
24190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
241a0 20 20 22 2d 2d 2d 2d 20 66 6f 75 6e 64 20 6c 6f    "---- found lo
241b0 61 64 65 64 20 53 51 4c 69 74 65 20 6e 61 74 69  aded SQLite nati
241c0 76 65 20 6c 69 62 72 61 72 79 20 6d 6f 64 75 6c  ve library modul
241d0 65 3a 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20  e: " \..        
241e0 20 20 20 20 20 20 20 20 20 20 24 66 69 6c 65 4e            $fileN
241f0 61 6d 65 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20  ame \n]..       
24200 20 20 20 20 20 7d 20 65 6c 73 65 69 66 20 7b 5b       } elseif {[
24210 6c 73 65 61 72 63 68 20 2d 65 78 61 63 74 20 2d  lsearch -exact -
24220 6e 6f 63 61 73 65 20 2d 2d 20 5c 0d 0a 20 20 20  nocase -- \..   
24230 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 67 65               [ge
24240 74 49 6e 74 65 72 6f 70 41 73 73 65 6d 62 6c 79  tInteropAssembly
24250 46 69 6c 65 4e 61 6d 65 73 4f 6e 6c 79 5d 20 24  FileNamesOnly] $
24260 66 69 6c 65 4e 61 6d 65 4f 6e 6c 79 5d 20 21 3d  fileNameOnly] !=
24270 20 2d 31 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20   -1} then {..   
24280 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
24290 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
242a0 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
242b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
242c0 20 20 22 2d 2d 2d 2d 20 66 6f 75 6e 64 20 6c 6f    "---- found lo
242d0 61 64 65 64 20 53 51 4c 69 74 65 20 69 6e 74 65  aded SQLite inte
242e0 72 6f 70 20 61 73 73 65 6d 62 6c 79 20 6d 6f 64  rop assembly mod
242f0 75 6c 65 3a 20 22 20 5c 0d 0a 20 20 20 20 20 20  ule: " \..      
24300 20 20 20 20 20 20 20 20 20 20 20 20 24 66 69 6c              $fil
24310 65 4e 61 6d 65 20 5c 6e 5d 0d 0a 20 20 20 20 20  eName \n]..     
24320 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
24330 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d      }..        }
24340 0d 0a 0d 0a 20 20 20 20 20 20 20 20 63 61 74 63  ....        catc
24350 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74  h {..          t
24360 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
24370 6e 6e 65 6c 20 5c 0d 0a 20 20 20 20 20 20 20 20  nnel \..        
24380 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 6f 6d 70        "---- comp
24390 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 73  ile-time options
243a0 20 66 6f 72 20 53 51 4c 69 74 65 20 63 6f 72 65   for SQLite core
243b0 20 6c 69 62 72 61 72 79 2e 2e 2e 20 22 0d 0a 0d   library... "...
243c0 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b  .          if {[
243d0 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20  catch {..       
243e0 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f       object invo
243f0 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75  ke -flags +NonPu
24400 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20 20 20  blic \..        
24410 20 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44          System.D
24420 61 74 61 2e 53 51 4c 69 74 65 2e 53 51 4c 69 74  ata.SQLite.SQLit
24430 65 33 20 53 51 4c 69 74 65 43 6f 6d 70 69 6c 65  e3 SQLiteCompile
24440 4f 70 74 69 6f 6e 73 0d 0a 20 20 20 20 20 20 20  Options..       
24450 20 20 20 7d 20 63 6f 6d 70 69 6c 65 4f 70 74 69     } compileOpti
24460 6f 6e 73 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20  ons] == 0} then 
24470 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  {..            t
24480 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
24490 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
244a0 20 5b 66 6f 72 6d 61 74 4c 69 73 74 20 5b 6c 73   [formatList [ls
244b0 6f 72 74 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ort \..         
244c0 20 20 20 20 20 20 20 24 63 6f 6d 70 69 6c 65 4f         $compileO
244d0 70 74 69 6f 6e 73 5d 20 3c 6e 6f 6e 65 3e 5d 20  ptions] <none>] 
244e0 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  \n]..          }
244f0 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
24500 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
24510 73 74 5f 63 68 61 6e 6e 65 6c 20 75 6e 6b 6e 6f  st_channel unkno
24520 77 6e 5c 6e 0d 0a 20 20 20 20 20 20 20 20 20 20  wn\n..          
24530 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  }..        }....
24540 20 20 20 20 20 20 20 20 63 61 74 63 68 20 7b 0d          catch {.
24550 0a 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73  .          tputs
24560 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
24570 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
24580 20 20 22 2d 2d 2d 2d 20 63 6f 6d 70 69 6c 65 2d    "---- compile-
24590 74 69 6d 65 20 6f 70 74 69 6f 6e 73 20 66 6f 72  time options for
245a0 20 53 51 4c 69 74 65 20 69 6e 74 65 72 6f 70 20   SQLite interop 
245b0 61 73 73 65 6d 62 6c 79 2e 2e 2e 20 22 0d 0a 0d  assembly... "...
245c0 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b  .          if {[
245d0 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20  catch {..       
245e0 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f       object invo
245f0 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75  ke -flags +NonPu
24600 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20 20 20  blic \..        
24610 20 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44          System.D
24620 61 74 61 2e 53 51 4c 69 74 65 2e 53 51 4c 69 74  ata.SQLite.SQLit
24630 65 33 20 49 6e 74 65 72 6f 70 43 6f 6d 70 69 6c  e3 InteropCompil
24640 65 4f 70 74 69 6f 6e 73 0d 0a 20 20 20 20 20 20  eOptions..      
24650 20 20 20 20 7d 20 63 6f 6d 70 69 6c 65 4f 70 74      } compileOpt
24660 69 6f 6e 73 5d 20 3d 3d 20 30 7d 20 74 68 65 6e  ions] == 0} then
24670 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
24680 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
24690 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
246a0 73 20 5b 66 6f 72 6d 61 74 4c 69 73 74 20 5b 6c  s [formatList [l
246b0 73 6f 72 74 20 5c 0d 0a 20 20 20 20 20 20 20 20  sort \..        
246c0 20 20 20 20 20 20 20 20 24 63 6f 6d 70 69 6c 65          $compile
246d0 4f 70 74 69 6f 6e 73 5d 20 3c 6e 6f 6e 65 3e 5d  Options] <none>]
246e0 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20   \n]..          
246f0 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
24700 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
24710 65 73 74 5f 63 68 61 6e 6e 65 6c 20 75 6e 6b 6e  est_channel unkn
24720 6f 77 6e 5c 6e 0d 0a 20 20 20 20 20 20 20 20 20  own\n..         
24730 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d   }..        }...
24740 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
24750 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 68 6f 77      # NOTE: Show
24760 20 74 68 65 20 61 63 74 69 76 65 20 74 65 73 74   the active test
24770 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e 0d 0a 20   constraints... 
24780 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
24790 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
247a0 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
247b0 72 67 73 20 22 2d 2d 2d 2d 20 63 6f 6e 73 74 72  rgs "---- constr
247c0 61 69 6e 74 73 3a 20 22 20 5c 0d 0a 20 20 20 20  aints: " \..    
247d0 20 20 20 20 20 20 20 20 5b 66 6f 72 6d 61 74 4c          [formatL
247e0 69 73 74 20 5b 6c 73 6f 72 74 20 5b 67 65 74 43  ist [lsort [getC
247f0 6f 6e 73 74 72 61 69 6e 74 73 5d 5d 20 3c 6e 6f  onstraints]] <no
24800 6e 65 3e 5d 20 5c 6e 5d 0d 0a 0d 0a 20 20 20 20  ne>] \n]....    
24810 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
24820 20 4e 4f 54 45 3a 20 53 61 76 65 20 74 68 65 20   NOTE: Save the 
24830 74 65 73 74 20 63 6f 6e 73 74 72 61 69 6e 74 73  test constraints
24840 20 66 6f 72 20 75 73 65 20 62 79 20 74 68 72 65   for use by thre
24850 61 64 73 20 63 72 65 61 74 65 64 20 69 6e 20 74  ads created in t
24860 68 69 73 0d 0a 20 20 20 20 20 20 20 20 23 20 20  his..        #  
24870 20 20 20 20 20 61 70 70 6c 69 63 61 74 69 6f 6e       application
24880 20 64 6f 6d 61 69 6e 2e 20 20 54 68 69 73 20 69   domain.  This i
24890 73 20 6e 65 63 65 73 73 61 72 79 20 62 65 63 61  s necessary beca
248a0 75 73 65 20 61 6c 6c 20 74 68 65 20 45 61 67 6c  use all the Eagl
248b0 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  e..        #    
248c0 20 20 20 22 74 65 73 74 20 63 6f 6e 74 65 78 74     "test context
248d0 22 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73  " information is
248e0 20 70 65 72 2d 74 68 72 65 61 64 2e 0d 0a 20 20   per-thread...  
248f0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
24900 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73   if {![info exis
24910 74 73 20 3a 3a 74 65 73 74 5f 63 6f 6e 73 74 72  ts ::test_constr
24920 61 69 6e 74 73 5d 7d 20 74 68 65 6e 20 7b 0d 0a  aints]} then {..
24930 20 20 20 20 20 20 20 20 20 20 73 65 74 20 3a 3a            set ::
24940 74 65 73 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73  test_constraints
24950 20 24 3a 3a 65 61 67 6c 65 5f 74 65 73 74 73 28   $::eagle_tests(
24960 63 6f 6e 73 74 72 61 69 6e 74 73 29 0d 0a 20 20  constraints)..  
24970 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
24980 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
24990 4e 4f 54 45 3a 20 4c 6f 61 64 20 74 68 65 20 22  NOTE: Load the "
249a0 61 66 74 65 72 2d 63 6f 6e 73 74 72 61 69 6e 74  after-constraint
249b0 73 22 20 63 75 73 74 6f 6d 20 70 65 72 2d 75 73  s" custom per-us
249c0 65 72 20 61 6e 64 2f 6f 72 20 70 65 72 2d 68 6f  er and/or per-ho
249d0 73 74 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  st..        #   
249e0 20 20 20 20 74 65 73 74 20 73 65 74 74 69 6e 67      test setting
249f0 73 20 6e 6f 77 2e 0d 0a 20 20 20 20 20 20 20 20  s now...        
24a00 23 0d 0a 20 20 20 20 20 20 20 20 75 70 6c 65 76  #..        uplev
24a10 65 6c 20 31 20 5b 6c 69 73 74 20 6c 6f 61 64 53  el 1 [list loadS
24a20 51 4c 69 74 65 54 65 73 74 53 65 74 74 69 6e 67  QLiteTestSetting
24a30 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
24a40 6c 20 2e 61 66 74 65 72 5d 0d 0a 0d 0a 20 20 20  l .after]....   
24a50 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
24a60 23 20 4e 4f 54 45 3a 20 49 66 20 6e 65 63 65 73  # NOTE: If neces
24a70 73 61 72 79 2c 20 65 6e 61 62 6c 65 20 73 68 61  sary, enable sha
24a80 72 65 64 2d 63 61 63 68 65 20 6d 6f 64 65 20 6e  red-cache mode n
24a90 6f 77 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  ow...        #..
24aa0 20 20 20 20 20 20 20 20 69 66 20 7b 5b 68 61 73          if {[has
24ab0 52 75 6e 74 69 6d 65 4f 70 74 69 6f 6e 20 73 68  RuntimeOption sh
24ac0 61 72 65 64 43 61 63 68 65 5d 7d 20 74 68 65 6e  aredCache]} then
24ad0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 65 6e   {..          en
24ae0 61 62 6c 65 53 68 61 72 65 64 43 61 63 68 65 20  ableSharedCache 
24af0 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
24b00 74 72 75 65 0d 0a 20 20 20 20 20 20 20 20 7d 0d  true..        }.
24b10 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
24b20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 68        # NOTE: Sh
24b30 6f 77 20 77 68 65 6e 20 6f 75 72 20 74 65 73 74  ow when our test
24b40 73 20 61 63 74 75 61 6c 6c 79 20 62 65 67 61 6e  s actually began
24b50 20 28 6e 6f 77 29 2e 0d 0a 20 20 20 20 20 20 20   (now)...       
24b60 20 23 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74   #..        tput
24b70 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
24b80 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
24b90 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d  .            "--
24ba0 2d 2d 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53  -- System.Data.S
24bb0 51 4c 69 74 65 20 74 65 73 74 73 20 62 65 67 61  QLite tests bega
24bc0 6e 20 61 74 20 22 20 5c 0d 0a 20 20 20 20 20 20  n at " \..      
24bd0 20 20 20 20 20 20 5b 63 6c 6f 63 6b 20 66 6f 72        [clock for
24be0 6d 61 74 20 5b 63 6c 6f 63 6b 20 73 65 63 6f 6e  mat [clock secon
24bf0 64 73 5d 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20 20  ds]] \n]..      
24c00 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  }..    }.....   
24c10 20 70 72 6f 63 20 72 75 6e 53 51 4c 69 74 65 54   proc runSQLiteT
24c20 65 73 74 46 69 6c 65 73 50 72 6f 6c 6f 67 75 65  estFilesPrologue
24c30 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 75 70 6c   {} {..      upl
24c40 65 76 65 6c 20 31 20 7b 0d 0a 20 20 20 20 20 20  evel 1 {..      
24c50 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
24c60 4f 54 45 3a 20 53 65 74 75 70 20 74 68 65 20 76  OTE: Setup the v
24c70 61 72 69 61 62 6c 65 73 20 74 68 61 74 20 72 65  ariables that re
24c80 66 65 72 20 74 6f 20 74 68 65 20 76 61 72 69 6f  fer to the vario
24c90 75 73 20 6e 6f 6e 2d 64 61 74 61 20 66 69 6c 65  us non-data file
24ca0 73 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  s..        #    
24cb0 20 20 20 72 65 71 75 69 72 65 64 20 62 79 20 74     required by t
24cc0 68 65 20 74 65 73 74 73 20 69 6e 20 74 68 69 73  he tests in this
24cd0 20 66 69 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20   file...        
24ce0 23 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 65  #..        set e
24cf0 6e 74 69 74 79 46 72 61 6d 65 77 6f 72 6b 44 6c  ntityFrameworkDl
24d00 6c 46 69 6c 65 20 5c 0d 0a 20 20 20 20 20 20 20  lFile \..       
24d10 20 20 20 20 20 5b 67 65 74 42 75 69 6c 64 46 69       [getBuildFi
24d20 6c 65 4e 61 6d 65 20 45 6e 74 69 74 79 46 72 61  leName EntityFra
24d30 6d 65 77 6f 72 6b 2e 64 6c 6c 5d 0d 0a 0d 0a 20  mework.dll].... 
24d40 20 20 20 20 20 20 20 73 65 74 20 69 6e 73 74 61         set insta
24d50 6c 6c 65 72 45 78 65 46 69 6c 65 20 5b 67 65 74  llerExeFile [get
24d60 42 75 69 6c 64 46 69 6c 65 4e 61 6d 65 20 49 6e  BuildFileName In
24d70 73 74 61 6c 6c 65 72 2e 65 78 65 5d 0d 0a 20 20  staller.exe]..  
24d80 20 20 20 20 20 20 73 65 74 20 73 71 6c 69 74 65        set sqlite
24d90 44 65 73 69 67 6e 65 72 44 6c 6c 46 69 6c 65 20  DesignerDllFile 
24da0 5b 67 65 74 42 75 69 6c 64 46 69 6c 65 4e 61 6d  [getBuildFileNam
24db0 65 20 53 51 4c 69 74 65 2e 44 65 73 69 67 6e 65  e SQLite.Designe
24dc0 72 2e 64 6c 6c 5d 0d 0a 0d 0a 20 20 20 20 20 20  r.dll]....      
24dd0 20 20 73 65 74 20 73 79 73 74 65 6d 44 61 74 61    set systemData
24de0 53 51 4c 69 74 65 44 6c 6c 46 69 6c 65 20 5c 0d  SQLiteDllFile \.
24df0 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 67 65  .            [ge
24e00 74 42 75 69 6c 64 46 69 6c 65 4e 61 6d 65 20 53  tBuildFileName S
24e10 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
24e20 65 2e 64 6c 6c 5d 0d 0a 0d 0a 20 20 20 20 20 20  e.dll]....      
24e30 20 20 73 65 74 20 73 79 73 74 65 6d 44 61 74 61    set systemData
24e40 53 51 4c 69 74 65 4c 69 6e 71 44 6c 6c 46 69 6c  SQLiteLinqDllFil
24e50 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e \..           
24e60 20 5b 67 65 74 42 75 69 6c 64 46 69 6c 65 4e 61   [getBuildFileNa
24e70 6d 65 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53  me System.Data.S
24e80 51 4c 69 74 65 2e 4c 69 6e 71 2e 64 6c 6c 5d 0d  QLite.Linq.dll].
24e90 0a 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 73  ...        set s
24ea0 79 73 74 65 6d 44 61 74 61 53 51 4c 69 74 65 45  ystemDataSQLiteE
24eb0 66 36 44 6c 6c 46 69 6c 65 20 5c 0d 0a 20 20 20  f6DllFile \..   
24ec0 20 20 20 20 20 20 20 20 20 5b 67 65 74 42 75 69           [getBui
24ed0 6c 64 46 69 6c 65 4e 61 6d 65 20 53 79 73 74 65  ldFileName Syste
24ee0 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 45 46  m.Data.SQLite.EF
24ef0 36 2e 64 6c 6c 5d 0d 0a 0d 0a 20 20 20 20 20 20  6.dll]....      
24f00 20 20 73 65 74 20 74 65 73 74 45 78 65 46 69 6c    set testExeFil
24f10 65 20 5b 67 65 74 42 75 69 6c 64 46 69 6c 65 4e  e [getBuildFileN
24f20 61 6d 65 20 74 65 73 74 2e 65 78 65 5d 0d 0a 20  ame test.exe].. 
24f30 20 20 20 20 20 20 20 73 65 74 20 74 65 73 74 4c         set testL
24f40 69 6e 71 45 78 65 46 69 6c 65 20 5b 67 65 74 42  inqExeFile [getB
24f50 75 69 6c 64 46 69 6c 65 4e 61 6d 65 20 74 65 73  uildFileName tes
24f60 74 6c 69 6e 71 2e 65 78 65 5d 0d 0a 20 20 20 20  tlinq.exe]..    
24f70 20 20 20 20 73 65 74 20 74 65 73 74 45 66 36 45      set testEf6E
24f80 78 65 46 69 6c 65 20 5b 67 65 74 42 75 69 6c 64  xeFile [getBuild
24f90 46 69 6c 65 4e 61 6d 65 20 74 65 73 74 65 66 36  FileName testef6
24fa0 2e 65 78 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  .exe]....       
24fb0 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
24fc0 54 45 3a 20 53 65 74 75 70 20 74 68 65 20 76 61  TE: Setup the va
24fd0 72 69 61 62 6c 65 73 20 74 68 61 74 20 72 65 66  riables that ref
24fe0 65 72 20 74 6f 20 74 68 65 20 76 61 72 69 6f 75  er to the variou
24ff0 73 20 64 61 74 61 20 66 69 6c 65 73 0d 0a 20 20  s data files..  
25000 20 20 20 20 20 20 23 20 20 20 20 20 20 20 72 65        #       re
25010 71 75 69 72 65 64 20 62 79 20 74 68 65 20 74 65  quired by the te
25020 73 74 73 20 69 6e 20 74 68 69 73 20 66 69 6c 65  sts in this file
25030 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
25040 20 20 20 20 20 20 73 65 74 20 74 65 73 74 4c 69        set testLi
25050 6e 71 4f 75 74 46 69 6c 65 20 5b 66 69 6c 65 20  nqOutFile [file 
25060 6e 61 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c 65  nativename [file
25070 20 6a 6f 69 6e 20 5c 0d 0a 20 20 20 20 20 20 20   join \..       
25080 20 20 20 20 20 5b 67 65 74 53 51 4c 69 74 65 54       [getSQLiteT
25090 65 73 74 44 61 74 61 50 61 74 68 5d 20 74 65 73  estDataPath] tes
250a0 74 6c 69 6e 71 2e 6f 75 74 5d 5d 0d 0a 0d 0a 20  tlinq.out]].... 
250b0 20 20 20 20 20 20 20 73 65 74 20 6e 6f 72 74 68         set north
250c0 77 69 6e 64 45 66 44 62 46 69 6c 65 20 5b 66 69  windEfDbFile [fi
250d0 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65 20 5b 66  le nativename [f
250e0 69 6c 65 20 6a 6f 69 6e 20 5c 0d 0a 20 20 20 20  ile join \..    
250f0 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20 64 69          [file di
25100 72 6e 61 6d 65 20 5b 66 69 6c 65 20 64 69 72 6e  rname [file dirn
25110 61 6d 65 20 5b 67 65 74 53 51 4c 69 74 65 54 65  ame [getSQLiteTe
25120 73 74 44 61 74 61 50 61 74 68 5d 5d 5d 20 5c 0d  stDataPath]]] \.
25130 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73  .            tes
25140 74 6c 69 6e 71 20 6e 6f 72 74 68 77 69 6e 64 45  tlinq northwindE
25150 46 2e 64 62 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20  F.db]]....      
25160 20 20 73 65 74 20 6e 6f 6e 57 61 6c 44 62 46 69    set nonWalDbFi
25170 6c 65 20 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e  le [file nativen
25180 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5c  ame [file join \
25190 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 67  ..            [g
251a0 65 74 53 51 4c 69 74 65 54 65 73 74 44 61 74 61  etSQLiteTestData
251b0 50 61 74 68 5d 20 6e 6f 6e 57 61 6c 2e 64 62 5d  Path] nonWal.db]
251c0 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 73 65 74  ]....        set
251d0 20 77 61 6c 44 62 46 69 6c 65 20 5b 66 69 6c 65   walDbFile [file
251e0 20 6e 61 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c   nativename [fil
251f0 65 20 6a 6f 69 6e 20 5c 0d 0a 20 20 20 20 20 20  e join \..      
25200 20 20 20 20 20 20 5b 67 65 74 53 51 4c 69 74 65        [getSQLite
25210 54 65 73 74 44 61 74 61 50 61 74 68 5d 20 77 61  TestDataPath] wa
25220 6c 2e 64 62 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20  l.db]]....      
25230 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
25240 4f 54 45 3a 20 54 68 65 20 76 61 72 69 6f 75 73  OTE: The various
25250 20 69 6e 73 74 61 6c 6c 2f 75 6e 69 6e 73 74 61   install/uninsta
25260 6c 6c 20 6c 6f 67 20 66 69 6c 65 73 20 75 73 65  ll log files use
25270 64 20 74 6f 20 74 65 73 74 20 74 68 65 0d 0a 20  d to test the.. 
25280 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 64         #       d
25290 65 73 69 67 6e 2d 74 69 6d 65 20 63 6f 6d 70 6f  esign-time compo
252a0 6e 65 6e 74 20 69 6e 73 74 61 6c 6c 65 72 2e 0d  nent installer..
252b0 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
252c0 20 20 20 20 73 65 74 20 74 65 73 74 49 6e 73 74      set testInst
252d0 61 6c 6c 56 73 32 30 30 35 4c 6f 67 46 69 6c 65  allVs2005LogFile
252e0 20 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d   [file nativenam
252f0 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5c 0d 0a  e [file join \..
25300 20 20 20 20 20 20 20 20 20 20 20 20 5b 67 65 74              [get
25310 53 51 4c 69 74 65 54 65 73 74 44 61 74 61 50 61  SQLiteTestDataPa
25320 74 68 5d 20 49 6e 73 74 61 6c 6c 65 72 5f 54 65  th] Installer_Te
25330 73 74 5f 56 73 32 30 30 35 2e 6c 6f 67 5d 5d 0d  st_Vs2005.log]].
25340 0a 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 74  ...        set t
25350 65 73 74 49 6e 73 74 61 6c 6c 56 73 32 30 30 38  estInstallVs2008
25360 4c 6f 67 46 69 6c 65 20 5b 66 69 6c 65 20 6e 61  LogFile [file na
25370 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c 65 20 6a  tivename [file j
25380 6f 69 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  oin \..         
25390 20 20 20 5b 67 65 74 53 51 4c 69 74 65 54 65 73     [getSQLiteTes
253a0 74 44 61 74 61 50 61 74 68 5d 20 49 6e 73 74 61  tDataPath] Insta
253b0 6c 6c 65 72 5f 54 65 73 74 5f 56 73 32 30 30 38  ller_Test_Vs2008
253c0 2e 6c 6f 67 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20  .log]]....      
253d0 20 20 73 65 74 20 74 65 73 74 49 6e 73 74 61 6c    set testInstal
253e0 6c 56 73 32 30 31 30 4c 6f 67 46 69 6c 65 20 5b  lVs2010LogFile [
253f0 66 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65 20  file nativename 
25400 5b 66 69 6c 65 20 6a 6f 69 6e 20 5c 0d 0a 20 20  [file join \..  
25410 20 20 20 20 20 20 20 20 20 20 5b 67 65 74 53 51            [getSQ
25420 4c 69 74 65 54 65 73 74 44 61 74 61 50 61 74 68  LiteTestDataPath
25430 5d 20 49 6e 73 74 61 6c 6c 65 72 5f 54 65 73 74  ] Installer_Test
25440 5f 56 73 32 30 31 30 2e 6c 6f 67 5d 5d 0d 0a 0d  _Vs2010.log]]...
25450 0a 20 20 20 20 20 20 20 20 73 65 74 20 74 65 73  .        set tes
25460 74 49 6e 73 74 61 6c 6c 56 73 32 30 31 32 4c 6f  tInstallVs2012Lo
25470 67 46 69 6c 65 20 5b 66 69 6c 65 20 6e 61 74 69  gFile [file nati
25480 76 65 6e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69  vename [file joi
25490 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n \..           
254a0 20 5b 67 65 74 53 51 4c 69 74 65 54 65 73 74 44   [getSQLiteTestD
254b0 61 74 61 50 61 74 68 5d 20 49 6e 73 74 61 6c 6c  ataPath] Install
254c0 65 72 5f 54 65 73 74 5f 56 73 32 30 31 32 2e 6c  er_Test_Vs2012.l
254d0 6f 67 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  og]]....        
254e0 73 65 74 20 74 65 73 74 49 6e 73 74 61 6c 6c 56  set testInstallV
254f0 73 32 30 31 33 4c 6f 67 46 69 6c 65 20 5b 66 69  s2013LogFile [fi
25500 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65 20 5b 66  le nativename [f
25510 69 6c 65 20 6a 6f 69 6e 20 5c 0d 0a 20 20 20 20  ile join \..    
25520 20 20 20 20 20 20 20 20 5b 67 65 74 53 51 4c 69          [getSQLi
25530 74 65 54 65 73 74 44 61 74 61 50 61 74 68 5d 20  teTestDataPath] 
25540 49 6e 73 74 61 6c 6c 65 72 5f 54 65 73 74 5f 56  Installer_Test_V
25550 73 32 30 31 33 2e 6c 6f 67 5d 5d 0d 0a 0d 0a 20  s2013.log]].... 
25560 20 20 20 20 20 20 20 73 65 74 20 74 65 73 74 49         set testI
25570 6e 73 74 61 6c 6c 56 73 32 30 31 35 4c 6f 67 46  nstallVs2015LogF
25580 69 6c 65 20 5b 66 69 6c 65 20 6e 61 74 69 76 65  ile [file native
25590 6e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20  name [file join 
255a0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b  \..            [
255b0 67 65 74 53 51 4c 69 74 65 54 65 73 74 44 61 74  getSQLiteTestDat
255c0 61 50 61 74 68 5d 20 49 6e 73 74 61 6c 6c 65 72  aPath] Installer
255d0 5f 54 65 73 74 5f 56 73 32 30 31 35 2e 6c 6f 67  _Test_Vs2015.log
255e0 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 73 65  ]]....        se
255f0 74 20 74 65 73 74 55 6e 69 6e 73 74 61 6c 6c 56  t testUninstallV
25600 73 32 30 30 35 4c 6f 67 46 69 6c 65 20 5b 66 69  s2005LogFile [fi
25610 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65 20 5b 66  le nativename [f
25620 69 6c 65 20 6a 6f 69 6e 20 5c 0d 0a 20 20 20 20  ile join \..    
25630 20 20 20 20 20 20 20 20 5b 67 65 74 53 51 4c 69          [getSQLi
25640 74 65 54 65 73 74 44 61 74 61 50 61 74 68 5d 20  teTestDataPath] 
25650 55 6e 69 6e 73 74 61 6c 6c 65 72 5f 54 65 73 74  Uninstaller_Test
25660 5f 56 73 32 30 30 35 2e 6c 6f 67 5d 5d 0d 0a 0d  _Vs2005.log]]...
25670 0a 20 20 20 20 20 20 20 20 73 65 74 20 74 65 73  .        set tes
25680 74 55 6e 69 6e 73 74 61 6c 6c 56 73 32 30 30 38  tUninstallVs2008
25690 4c 6f 67 46 69 6c 65 20 5b 66 69 6c 65 20 6e 61  LogFile [file na
256a0 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c 65 20 6a  tivename [file j
256b0 6f 69 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  oin \..         
256c0 20 20 20 5b 67 65 74 53 51 4c 69 74 65 54 65 73     [getSQLiteTes
256d0 74 44 61 74 61 50 61 74 68 5d 20 55 6e 69 6e 73  tDataPath] Unins
256e0 74 61 6c 6c 65 72 5f 54 65 73 74 5f 56 73 32 30  taller_Test_Vs20
256f0 30 38 2e 6c 6f 67 5d 5d 0d 0a 0d 0a 20 20 20 20  08.log]]....    
25700 20 20 20 20 73 65 74 20 74 65 73 74 55 6e 69 6e      set testUnin
25710 73 74 61 6c 6c 56 73 32 30 31 30 4c 6f 67 46 69  stallVs2010LogFi
25720 6c 65 20 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e  le [file nativen
25730 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5c  ame [file join \
25740 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 67  ..            [g
25750 65 74 53 51 4c 69 74 65 54 65 73 74 44 61 74 61  etSQLiteTestData
25760 50 61 74 68 5d 20 55 6e 69 6e 73 74 61 6c 6c 65  Path] Uninstalle
25770 72 5f 54 65 73 74 5f 56 73 32 30 31 30 2e 6c 6f  r_Test_Vs2010.lo
25780 67 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 73  g]]....        s
25790 65 74 20 74 65 73 74 55 6e 69 6e 73 74 61 6c 6c  et testUninstall
257a0 56 73 32 30 31 32 4c 6f 67 46 69 6c 65 20 5b 66  Vs2012LogFile [f
257b0 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65 20 5b  ile nativename [
257c0 66 69 6c 65 20 6a 6f 69 6e 20 5c 0d 0a 20 20 20  file join \..   
257d0 20 20 20 20 20 20 20 20 20 5b 67 65 74 53 51 4c           [getSQL
257e0 69 74 65 54 65 73 74 44 61 74 61 50 61 74 68 5d  iteTestDataPath]
257f0 20 55 6e 69 6e 73 74 61 6c 6c 65 72 5f 54 65 73   Uninstaller_Tes
25800 74 5f 56 73 32 30 31 32 2e 6c 6f 67 5d 5d 0d 0a  t_Vs2012.log]]..
25810 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 74 65  ..        set te
25820 73 74 55 6e 69 6e 73 74 61 6c 6c 56 73 32 30 31  stUninstallVs201
25830 33 4c 6f 67 46 69 6c 65 20 5b 66 69 6c 65 20 6e  3LogFile [file n
25840 61 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c 65 20  ativename [file 
25850 6a 6f 69 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20  join \..        
25860 20 20 20 20 5b 67 65 74 53 51 4c 69 74 65 54 65      [getSQLiteTe
25870 73 74 44 61 74 61 50 61 74 68 5d 20 55 6e 69 6e  stDataPath] Unin
25880 73 74 61 6c 6c 65 72 5f 54 65 73 74 5f 56 73 32  staller_Test_Vs2
25890 30 31 33 2e 6c 6f 67 5d 5d 0d 0a 0d 0a 20 20 20  013.log]]....   
258a0 20 20 20 20 20 73 65 74 20 74 65 73 74 55 6e 69       set testUni
258b0 6e 73 74 61 6c 6c 56 73 32 30 31 35 4c 6f 67 46  nstallVs2015LogF
258c0 69 6c 65 20 5b 66 69 6c 65 20 6e 61 74 69 76 65  ile [file native
258d0 6e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20  name [file join 
258e0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b  \..            [
258f0 67 65 74 53 51 4c 69 74 65 54 65 73 74 44 61 74  getSQLiteTestDat
25900 61 50 61 74 68 5d 20 55 6e 69 6e 73 74 61 6c 6c  aPath] Uninstall
25910 65 72 5f 54 65 73 74 5f 56 73 32 30 31 35 2e 6c  er_Test_Vs2015.l
25920 6f 67 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  og]]....        
25930 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
25940 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
25950 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
25960 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
25970 23 23 23 23 23 23 23 0d 0a 0d 0a 20 20 20 20 20  #######....     
25980 20 20 20 69 66 20 7b 21 5b 68 61 76 65 43 6f 6e     if {![haveCon
25990 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41  straint [appendA
259a0 72 67 73 20 66 69 6c 65 5f 20 5c 0d 0a 20 20 20  rgs file_ \..   
259b0 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20 74           [file t
259c0 61 69 6c 20 24 65 6e 74 69 74 79 46 72 61 6d 65  ail $entityFrame
259d0 77 6f 72 6b 44 6c 6c 46 69 6c 65 5d 5d 5d 7d 20  workDllFile]]]} 
259e0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
259f0 20 20 63 68 65 63 6b 46 6f 72 46 69 6c 65 20 24    checkForFile $
25a00 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 24 65 6e  test_channel $en
25a10 74 69 74 79 46 72 61 6d 65 77 6f 72 6b 44 6c 6c  tityFrameworkDll
25a20 46 69 6c 65 0d 0a 20 20 20 20 20 20 20 20 7d 0d  File..        }.
25a30 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21  ...        if {!
25a40 5b 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74 20  [haveConstraint 
25a50 5b 61 70 70 65 6e 64 41 72 67 73 20 66 69 6c 65  [appendArgs file
25a60 5f 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  _ \..           
25a70 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 69 6e 73   [file tail $ins
25a80 74 61 6c 6c 65 72 45 78 65 46 69 6c 65 5d 5d 5d  tallerExeFile]]]
25a90 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
25aa0 20 20 20 20 63 68 65 63 6b 46 6f 72 46 69 6c 65      checkForFile
25ab0 20 24 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 24   $test_channel $
25ac0 69 6e 73 74 61 6c 6c 65 72 45 78 65 46 69 6c 65  installerExeFile
25ad0 20 49 6e 73 74 61 6c 6c 65 72 2e 65 78 65 0d 0a   Installer.exe..
25ae0 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
25af0 20 20 20 20 20 69 66 20 7b 21 5b 68 61 76 65 43       if {![haveC
25b00 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e  onstraint [appen
25b10 64 41 72 67 73 20 66 69 6c 65 5f 20 5c 0d 0a 20  dArgs file_ \.. 
25b20 20 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65             [file
25b30 20 74 61 69 6c 20 24 73 71 6c 69 74 65 44 65 73   tail $sqliteDes
25b40 69 67 6e 65 72 44 6c 6c 46 69 6c 65 5d 5d 5d 7d  ignerDllFile]]]}
25b50 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
25b60 20 20 20 63 68 65 63 6b 46 6f 72 46 69 6c 65 20     checkForFile 
25b70 24 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 24 73  $test_channel $s
25b80 71 6c 69 74 65 44 65 73 69 67 6e 65 72 44 6c 6c  qliteDesignerDll
25b90 46 69 6c 65 0d 0a 20 20 20 20 20 20 20 20 7d 0d  File..        }.
25ba0 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21  ...        if {!
25bb0 5b 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74 20  [haveConstraint 
25bc0 5b 61 70 70 65 6e 64 41 72 67 73 20 66 69 6c 65  [appendArgs file
25bd0 5f 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  _ \..           
25be0 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 73 79 73   [file tail $sys
25bf0 74 65 6d 44 61 74 61 53 51 4c 69 74 65 44 6c 6c  temDataSQLiteDll
25c00 46 69 6c 65 5d 5d 5d 7d 20 74 68 65 6e 20 7b 0d  File]]]} then {.
25c10 0a 20 20 20 20 20 20 20 20 20 20 63 68 65 63 6b  .          check
25c20 46 6f 72 46 69 6c 65 20 24 74 65 73 74 5f 63 68  ForFile $test_ch
25c30 61 6e 6e 65 6c 20 24 73 79 73 74 65 6d 44 61 74  annel $systemDat
25c40 61 53 51 4c 69 74 65 44 6c 6c 46 69 6c 65 0d 0a  aSQLiteDllFile..
25c50 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
25c60 20 20 20 20 20 69 66 20 7b 21 5b 68 61 76 65 43       if {![haveC
25c70 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e  onstraint [appen
25c80 64 41 72 67 73 20 66 69 6c 65 5f 20 5c 0d 0a 20  dArgs file_ \.. 
25c90 20 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65             [file
25ca0 20 74 61 69 6c 20 24 73 79 73 74 65 6d 44 61 74   tail $systemDat
25cb0 61 53 51 4c 69 74 65 4c 69 6e 71 44 6c 6c 46 69  aSQLiteLinqDllFi
25cc0 6c 65 5d 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  le]]]} then {.. 
25cd0 20 20 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f           checkFo
25ce0 72 46 69 6c 65 20 24 74 65 73 74 5f 63 68 61 6e  rFile $test_chan
25cf0 6e 65 6c 20 24 73 79 73 74 65 6d 44 61 74 61 53  nel $systemDataS
25d00 51 4c 69 74 65 4c 69 6e 71 44 6c 6c 46 69 6c 65  QLiteLinqDllFile
25d10 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  ..        }.... 
25d20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 68 61 76         if {![hav
25d30 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70  eConstraint [app
25d40 65 6e 64 41 72 67 73 20 66 69 6c 65 5f 20 5c 0d  endArgs file_ \.
25d50 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 66 69  .            [fi
25d60 6c 65 20 74 61 69 6c 20 24 73 79 73 74 65 6d 44  le tail $systemD
25d70 61 74 61 53 51 4c 69 74 65 45 66 36 44 6c 6c 46  ataSQLiteEf6DllF
25d80 69 6c 65 5d 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a  ile]]]} then {..
25d90 20 20 20 20 20 20 20 20 20 20 63 68 65 63 6b 46            checkF
25da0 6f 72 46 69 6c 65 20 24 74 65 73 74 5f 63 68 61  orFile $test_cha
25db0 6e 6e 65 6c 20 24 73 79 73 74 65 6d 44 61 74 61  nnel $systemData
25dc0 53 51 4c 69 74 65 45 66 36 44 6c 6c 46 69 6c 65  SQLiteEf6DllFile
25dd0 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  ..        }.... 
25de0 20 20 20 20 20 20 20 69 66 20 7b 21 5b 68 61 76         if {![hav
25df0 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70  eConstraint [app
25e00 65 6e 64 41 72 67 73 20 66 69 6c 65 5f 20 5c 0d  endArgs file_ \.
25e10 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 66 69  .            [fi
25e20 6c 65 20 74 61 69 6c 20 24 74 65 73 74 45 78 65  le tail $testExe
25e30 46 69 6c 65 5d 5d 5d 7d 20 74 68 65 6e 20 7b 0d  File]]]} then {.
25e40 0a 20 20 20 20 20 20 20 20 20 20 63 68 65 63 6b  .          check
25e50 46 6f 72 46 69 6c 65 20 24 74 65 73 74 5f 63 68  ForFile $test_ch
25e60 61 6e 6e 65 6c 20 24 74 65 73 74 45 78 65 46 69  annel $testExeFi
25e70 6c 65 20 74 65 73 74 2e 65 78 65 0d 0a 20 20 20  le test.exe..   
25e80 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
25e90 20 20 69 66 20 7b 21 5b 68 61 76 65 43 6f 6e 73    if {![haveCons
25ea0 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72  traint [appendAr
25eb0 67 73 20 66 69 6c 65 5f 20 5c 0d 0a 20 20 20 20  gs file_ \..    
25ec0 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20 74 61          [file ta
25ed0 69 6c 20 24 74 65 73 74 4c 69 6e 71 45 78 65 46  il $testLinqExeF
25ee0 69 6c 65 5d 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a  ile]]]} then {..
25ef0 20 20 20 20 20 20 20 20 20 20 63 68 65 63 6b 46            checkF
25f00 6f 72 46 69 6c 65 20 24 74 65 73 74 5f 63 68 61  orFile $test_cha
25f10 6e 6e 65 6c 20 24 74 65 73 74 4c 69 6e 71 45 78  nnel $testLinqEx
25f20 65 46 69 6c 65 20 74 65 73 74 6c 69 6e 71 2e 65  eFile testlinq.e
25f30 78 65 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d  xe..        }...
25f40 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 68  .        if {![h
25f50 61 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61  aveConstraint [a
25f60 70 70 65 6e 64 41 72 67 73 20 66 69 6c 65 5f 20  ppendArgs file_ 
25f70 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b  \..            [
25f80 66 69 6c 65 20 74 61 69 6c 20 24 74 65 73 74 45  file tail $testE
25f90 66 36 45 78 65 46 69 6c 65 5d 5d 5d 7d 20 74 68  f6ExeFile]]]} th
25fa0 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
25fb0 63 68 65 63 6b 46 6f 72 46 69 6c 65 20 24 74 65  checkForFile $te
25fc0 73 74 5f 63 68 61 6e 6e 65 6c 20 24 74 65 73 74  st_channel $test
25fd0 45 66 36 45 78 65 46 69 6c 65 20 74 65 73 74 65  Ef6ExeFile teste
25fe0 66 36 2e 65 78 65 0d 0a 20 20 20 20 20 20 20 20  f6.exe..        
25ff0 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20  }....        if 
26000 7b 21 5b 68 61 76 65 43 6f 6e 73 74 72 61 69 6e  {![haveConstrain
26010 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20 66 69  t [appendArgs fi
26020 6c 65 5f 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  le_ \..         
26030 20 20 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 74     [file tail $t
26040 65 73 74 4c 69 6e 71 4f 75 74 46 69 6c 65 5d 5d  estLinqOutFile]]
26050 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
26060 20 20 20 20 20 63 68 65 63 6b 46 6f 72 46 69 6c       checkForFil
26070 65 20 24 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  e $test_channel 
26080 24 74 65 73 74 4c 69 6e 71 4f 75 74 46 69 6c 65  $testLinqOutFile
26090 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  ..        }.... 
260a0 20 20 20 20 20 20 20 69 66 20 7b 21 5b 68 61 76         if {![hav
260b0 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70  eConstraint [app
260c0 65 6e 64 41 72 67 73 20 66 69 6c 65 5f 20 5c 0d  endArgs file_ \.
260d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 66 69  .            [fi
260e0 6c 65 20 74 61 69 6c 20 24 6e 6f 72 74 68 77 69  le tail $northwi
260f0 6e 64 45 66 44 62 46 69 6c 65 5d 5d 5d 7d 20 74  ndEfDbFile]]]} t
26100 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
26110 20 63 68 65 63 6b 46 6f 72 46 69 6c 65 20 24 74   checkForFile $t
26120 65 73 74 5f 63 68 61 6e 6e 65 6c 20 24 6e 6f 72  est_channel $nor
26130 74 68 77 69 6e 64 45 66 44 62 46 69 6c 65 0d 0a  thwindEfDbFile..
26140 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
26150 20 20 20 20 20 69 66 20 7b 21 5b 68 61 76 65 43       if {![haveC
26160 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e  onstraint [appen
26170 64 41 72 67 73 20 66 69 6c 65 5f 20 5c 0d 0a 20  dArgs file_ \.. 
26180 20 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65             [file
26190 20 74 61 69 6c 20 24 6e 6f 6e 57 61 6c 44 62 46   tail $nonWalDbF
261a0 69 6c 65 5d 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a  ile]]]} then {..
261b0 20 20 20 20 20 20 20 20 20 20 63 68 65 63 6b 46            checkF
261c0 6f 72 46 69 6c 65 20 24 74 65 73 74 5f 63 68 61  orFile $test_cha
261d0 6e 6e 65 6c 20 24 6e 6f 6e 57 61 6c 44 62 46 69  nnel $nonWalDbFi
261e0 6c 65 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d  le..        }...
261f0 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 68  .        if {![h
26200 61 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61  aveConstraint [a
26210 70 70 65 6e 64 41 72 67 73 20 66 69 6c 65 5f 20  ppendArgs file_ 
26220 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b  \..            [
26230 66 69 6c 65 20 74 61 69 6c 20 24 77 61 6c 44 62  file tail $walDb
26240 46 69 6c 65 5d 5d 5d 7d 20 74 68 65 6e 20 7b 0d  File]]]} then {.
26250 0a 20 20 20 20 20 20 20 20 20 20 63 68 65 63 6b  .          check
26260 46 6f 72 46 69 6c 65 20 24 74 65 73 74 5f 63 68  ForFile $test_ch
26270 61 6e 6e 65 6c 20 24 77 61 6c 44 62 46 69 6c 65  annel $walDbFile
26280 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  ..        }.... 
26290 20 20 20 20 20 20 20 69 66 20 7b 21 5b 68 61 76         if {![hav
262a0 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70  eConstraint [app
262b0 65 6e 64 41 72 67 73 20 66 69 6c 65 5f 20 5c 0d  endArgs file_ \.
262c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 66 69  .            [fi
262d0 6c 65 20 74 61 69 6c 20 24 74 65 73 74 49 6e 73  le tail $testIns
262e0 74 61 6c 6c 56 73 32 30 30 35 4c 6f 67 46 69 6c  tallVs2005LogFil
262f0 65 5d 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  e]]]} then {..  
26300 20 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72          checkFor
26310 46 69 6c 65 20 24 74 65 73 74 5f 63 68 61 6e 6e  File $test_chann
26320 65 6c 20 24 74 65 73 74 49 6e 73 74 61 6c 6c 56  el $testInstallV
26330 73 32 30 30 35 4c 6f 67 46 69 6c 65 0d 0a 20 20  s2005LogFile..  
26340 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
26350 20 20 20 69 66 20 7b 21 5b 68 61 76 65 43 6f 6e     if {![haveCon
26360 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41  straint [appendA
26370 72 67 73 20 66 69 6c 65 5f 20 5c 0d 0a 20 20 20  rgs file_ \..   
26380 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20 74           [file t
26390 61 69 6c 20 24 74 65 73 74 49 6e 73 74 61 6c 6c  ail $testInstall
263a0 56 73 32 30 30 38 4c 6f 67 46 69 6c 65 5d 5d 5d  Vs2008LogFile]]]
263b0 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
263c0 20 20 20 20 63 68 65 63 6b 46 6f 72 46 69 6c 65      checkForFile
263d0 20 24 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 24   $test_channel $
263e0 74 65 73 74 49 6e 73 74 61 6c 6c 56 73 32 30 30  testInstallVs200
263f0 38 4c 6f 67 46 69 6c 65 0d 0a 20 20 20 20 20 20  8LogFile..      
26400 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69    }....        i
26410 66 20 7b 21 5b 68 61 76 65 43 6f 6e 73 74 72 61  f {![haveConstra
26420 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20  int [appendArgs 
26430 66 69 6c 65 5f 20 5c 0d 0a 20 20 20 20 20 20 20  file_ \..       
26440 20 20 20 20 20 5b 66 69 6c 65 20 74 61 69 6c 20       [file tail 
26450 24 74 65 73 74 49 6e 73 74 61 6c 6c 56 73 32 30  $testInstallVs20
26460 31 30 4c 6f 67 46 69 6c 65 5d 5d 5d 7d 20 74 68  10LogFile]]]} th
26470 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
26480 63 68 65 63 6b 46 6f 72 46 69 6c 65 20 24 74 65  checkForFile $te
26490 73 74 5f 63 68 61 6e 6e 65 6c 20 24 74 65 73 74  st_channel $test
264a0 49 6e 73 74 61 6c 6c 56 73 32 30 31 30 4c 6f 67  InstallVs2010Log
264b0 46 69 6c 65 0d 0a 20 20 20 20 20 20 20 20 7d 0d  File..        }.
264c0 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21  ...        if {!
264d0 5b 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74 20  [haveConstraint 
264e0 5b 61 70 70 65 6e 64 41 72 67 73 20 66 69 6c 65  [appendArgs file
264f0 5f 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  _ \..           
26500 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 74 65 73   [file tail $tes
26510 74 49 6e 73 74 61 6c 6c 56 73 32 30 31 32 4c 6f  tInstallVs2012Lo
26520 67 46 69 6c 65 5d 5d 5d 7d 20 74 68 65 6e 20 7b  gFile]]]} then {
26530 0d 0a 20 20 20 20 20 20 20 20 20 20 63 68 65 63  ..          chec
26540 6b 46 6f 72 46 69 6c 65 20 24 74 65 73 74 5f 63  kForFile $test_c
26550 68 61 6e 6e 65 6c 20 24 74 65 73 74 49 6e 73 74  hannel $testInst
26560 61 6c 6c 56 73 32 30 31 32 4c 6f 67 46 69 6c 65  allVs2012LogFile
26570 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  ..        }.... 
26580 20 20 20 20 20 20 20 69 66 20 7b 21 5b 68 61 76         if {![hav
26590 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70  eConstraint [app
265a0 65 6e 64 41 72 67 73 20 66 69 6c 65 5f 20 5c 0d  endArgs file_ \.
265b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 66 69  .            [fi
265c0 6c 65 20 74 61 69 6c 20 24 74 65 73 74 49 6e 73  le tail $testIns
265d0 74 61 6c 6c 56 73 32 30 31 33 4c 6f 67 46 69 6c  tallVs2013LogFil
265e0 65 5d 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  e]]]} then {..  
265f0 20 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72          checkFor
26600 46 69 6c 65 20 24 74 65 73 74 5f 63 68 61 6e 6e  File $test_chann
26610 65 6c 20 24 74 65 73 74 49 6e 73 74 61 6c 6c 56  el $testInstallV
26620 73 32 30 31 33 4c 6f 67 46 69 6c 65 0d 0a 20 20  s2013LogFile..  
26630 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
26640 20 20 20 69 66 20 7b 21 5b 68 61 76 65 43 6f 6e     if {![haveCon
26650 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41  straint [appendA
26660 72 67 73 20 66 69 6c 65 5f 20 5c 0d 0a 20 20 20  rgs file_ \..   
26670 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20 74           [file t
26680 61 69 6c 20 24 74 65 73 74 49 6e 73 74 61 6c 6c  ail $testInstall
26690 56 73 32 30 31 35 4c 6f 67 46 69 6c 65 5d 5d 5d  Vs2015LogFile]]]
266a0 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
266b0 20 20 20 20 63 68 65 63 6b 46 6f 72 46 69 6c 65      checkForFile
266c0 20 24 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 24   $test_channel $
266d0 74 65 73 74 49 6e 73 74 61 6c 6c 56 73 32 30 31  testInstallVs201
266e0 35 4c 6f 67 46 69 6c 65 0d 0a 20 20 20 20 20 20  5LogFile..      
266f0 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69    }....        i
26700 66 20 7b 21 5b 68 61 76 65 43 6f 6e 73 74 72 61  f {![haveConstra
26710 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20  int [appendArgs 
26720 66 69 6c 65 5f 20 5c 0d 0a 20 20 20 20 20 20 20  file_ \..       
26730 20 20 20 20 20 5b 66 69 6c 65 20 74 61 69 6c 20       [file tail 
26740 24 74 65 73 74 55 6e 69 6e 73 74 61 6c 6c 56 73  $testUninstallVs
26750 32 30 30 35 4c 6f 67 46 69 6c 65 5d 5d 5d 7d 20  2005LogFile]]]} 
26760 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
26770 20 20 63 68 65 63 6b 46 6f 72 46 69 6c 65 20 24    checkForFile $
26780 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 24 74 65  test_channel $te
26790 73 74 55 6e 69 6e 73 74 61 6c 6c 56 73 32 30 30  stUninstallVs200
267a0 35 4c 6f 67 46 69 6c 65 0d 0a 20 20 20 20 20 20  5LogFile..      
267b0 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69    }....        i
267c0 66 20 7b 21 5b 68 61 76 65 43 6f 6e 73 74 72 61  f {![haveConstra
267d0 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20  int [appendArgs 
267e0 66 69 6c 65 5f 20 5c 0d 0a 20 20 20 20 20 20 20  file_ \..       
267f0 20 20 20 20 20 5b 66 69 6c 65 20 74 61 69 6c 20       [file tail 
26800 24 74 65 73 74 55 6e 69 6e 73 74 61 6c 6c 56 73  $testUninstallVs
26810 32 30 30 38 4c 6f 67 46 69 6c 65 5d 5d 5d 7d 20  2008LogFile]]]} 
26820 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
26830 20 20 63 68 65 63 6b 46 6f 72 46 69 6c 65 20 24    checkForFile $
26840 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 24 74 65  test_channel $te
26850 73 74 55 6e 69 6e 73 74 61 6c 6c 56 73 32 30 30  stUninstallVs200
26860 38 4c 6f 67 46 69 6c 65 0d 0a 20 20 20 20 20 20  8LogFile..      
26870 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69    }....        i
26880 66 20 7b 21 5b 68 61 76 65 43 6f 6e 73 74 72 61  f {![haveConstra
26890 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20  int [appendArgs 
268a0 66 69 6c 65 5f 20 5c 0d 0a 20 20 20 20 20 20 20  file_ \..       
268b0 20 20 20 20 20 5b 66 69 6c 65 20 74 61 69 6c 20       [file tail 
268c0 24 74 65 73 74 55 6e 69 6e 73 74 61 6c 6c 56 73  $testUninstallVs
268d0 32 30 31 30 4c 6f 67 46 69 6c 65 5d 5d 5d 7d 20  2010LogFile]]]} 
268e0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
268f0 20 20 63 68 65 63 6b 46 6f 72 46 69 6c 65 20 24    checkForFile $
26900 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 24 74 65  test_channel $te
26910 73 74 55 6e 69 6e 73 74 61 6c 6c 56 73 32 30 31  stUninstallVs201
26920 30 4c 6f 67 46 69 6c 65 0d 0a 20 20 20 20 20 20  0LogFile..      
26930 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69    }....        i
26940 66 20 7b 21 5b 68 61 76 65 43 6f 6e 73 74 72 61  f {![haveConstra
26950 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20  int [appendArgs 
26960 66 69 6c 65 5f 20 5c 0d 0a 20 20 20 20 20 20 20  file_ \..       
26970 20 20 20 20 20 5b 66 69 6c 65 20 74 61 69 6c 20       [file tail 
26980 24 74 65 73 74 55 6e 69 6e 73 74 61 6c 6c 56 73  $testUninstallVs
26990 32 30 31 32 4c 6f 67 46 69 6c 65 5d 5d 5d 7d 20  2012LogFile]]]} 
269a0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
269b0 20 20 63 68 65 63 6b 46 6f 72 46 69 6c 65 20 24    checkForFile $
269c0 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 24 74 65  test_channel $te
269d0 73 74 55 6e 69 6e 73 74 61 6c 6c 56 73 32 30 31  stUninstallVs201
269e0 32 4c 6f 67 46 69 6c 65 0d 0a 20 20 20 20 20 20  2LogFile..      
269f0 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69    }....        i
26a00 66 20 7b 21 5b 68 61 76 65 43 6f 6e 73 74 72 61  f {![haveConstra
26a10 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20  int [appendArgs 
26a20 66 69 6c 65 5f 20 5c 0d 0a 20 20 20 20 20 20 20  file_ \..       
26a30 20 20 20 20 20 5b 66 69 6c 65 20 74 61 69 6c 20       [file tail 
26a40 24 74 65 73 74 55 6e 69 6e 73 74 61 6c 6c 56 73  $testUninstallVs
26a50 32 30 31 33 4c 6f 67 46 69 6c 65 5d 5d 5d 7d 20  2013LogFile]]]} 
26a60 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
26a70 20 20 63 68 65 63 6b 46 6f 72 46 69 6c 65 20 24    checkForFile $
26a80 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 24 74 65  test_channel $te
26a90 73 74 55 6e 69 6e 73 74 61 6c 6c 56 73 32 30 31  stUninstallVs201
26aa0 33 4c 6f 67 46 69 6c 65 0d 0a 20 20 20 20 20 20  3LogFile..      
26ab0 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69    }....        i
26ac0 66 20 7b 21 5b 68 61 76 65 43 6f 6e 73 74 72 61  f {![haveConstra
26ad0 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20  int [appendArgs 
26ae0 66 69 6c 65 5f 20 5c 0d 0a 20 20 20 20 20 20 20  file_ \..       
26af0 20 20 20 20 20 5b 66 69 6c 65 20 74 61 69 6c 20       [file tail 
26b00 24 74 65 73 74 55 6e 69 6e 73 74 61 6c 6c 56 73  $testUninstallVs
26b10 32 30 31 35 4c 6f 67 46 69 6c 65 5d 5d 5d 7d 20  2015LogFile]]]} 
26b20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
26b30 20 20 63 68 65 63 6b 46 6f 72 46 69 6c 65 20 24    checkForFile $
26b40 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 24 74 65  test_channel $te
26b50 73 74 55 6e 69 6e 73 74 61 6c 6c 56 73 32 30 31  stUninstallVs201
26b60 35 4c 6f 67 46 69 6c 65 0d 0a 20 20 20 20 20 20  5LogFile..      
26b70 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20    }..      }..  
26b80 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
26b90 20 72 75 6e 53 51 4c 69 74 65 54 65 73 74 46 69   runSQLiteTestFi
26ba0 6c 65 73 45 70 69 6c 6f 67 75 65 20 7b 7d 20 7b  lesEpilogue {} {
26bb0 0d 0a 20 20 20 20 20 20 75 70 6c 65 76 65 6c 20  ..      uplevel 
26bc0 31 20 7b 0d 0a 20 20 20 20 20 20 20 20 75 6e 73  1 {..        uns
26bd0 65 74 20 2d 6e 6f 63 6f 6d 70 6c 61 69 6e 20 5c  et -nocomplain \
26be0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 65  ..            te
26bf0 73 74 55 6e 69 6e 73 74 61 6c 6c 56 73 32 30 31  stUninstallVs201
26c00 35 4c 6f 67 46 69 6c 65 20 74 65 73 74 55 6e 69  5LogFile testUni
26c10 6e 73 74 61 6c 6c 56 73 32 30 31 33 4c 6f 67 46  nstallVs2013LogF
26c20 69 6c 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ile \..         
26c30 20 20 20 74 65 73 74 55 6e 69 6e 73 74 61 6c 6c     testUninstall
26c40 56 73 32 30 31 32 4c 6f 67 46 69 6c 65 20 74 65  Vs2012LogFile te
26c50 73 74 55 6e 69 6e 73 74 61 6c 6c 56 73 32 30 31  stUninstallVs201
26c60 30 4c 6f 67 46 69 6c 65 20 5c 0d 0a 20 20 20 20  0LogFile \..    
26c70 20 20 20 20 20 20 20 20 74 65 73 74 55 6e 69 6e          testUnin
26c80 73 74 61 6c 6c 56 73 32 30 30 38 4c 6f 67 46 69  stallVs2008LogFi
26c90 6c 65 20 74 65 73 74 55 6e 69 6e 73 74 61 6c 6c  le testUninstall
26ca0 56 73 32 30 30 35 4c 6f 67 46 69 6c 65 20 5c 0d  Vs2005LogFile \.
26cb0 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73  .            tes
26cc0 74 49 6e 73 74 61 6c 6c 56 73 32 30 31 35 4c 6f  tInstallVs2015Lo
26cd0 67 46 69 6c 65 20 74 65 73 74 49 6e 73 74 61 6c  gFile testInstal
26ce0 6c 56 73 32 30 31 33 4c 6f 67 46 69 6c 65 20 5c  lVs2013LogFile \
26cf0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 65  ..            te
26d00 73 74 49 6e 73 74 61 6c 6c 56 73 32 30 31 32 4c  stInstallVs2012L
26d10 6f 67 46 69 6c 65 20 74 65 73 74 49 6e 73 74 61  ogFile testInsta
26d20 6c 6c 56 73 32 30 31 30 4c 6f 67 46 69 6c 65 20  llVs2010LogFile 
26d30 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  \..            t
26d40 65 73 74 49 6e 73 74 61 6c 6c 56 73 32 30 30 38  estInstallVs2008
26d50 4c 6f 67 46 69 6c 65 20 74 65 73 74 49 6e 73 74  LogFile testInst
26d60 61 6c 6c 56 73 32 30 30 35 4c 6f 67 46 69 6c 65  allVs2005LogFile
26d70 0d 0a 0d 0a 20 20 20 20 20 20 20 20 75 6e 73 65  ....        unse
26d80 74 20 2d 6e 6f 63 6f 6d 70 6c 61 69 6e 20 5c 0d  t -nocomplain \.
26d90 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e 6f 72  .            nor
26da0 74 68 77 69 6e 64 45 66 44 62 46 69 6c 65 20 74  thwindEfDbFile t
26db0 65 73 74 4c 69 6e 71 4f 75 74 46 69 6c 65 20 5c  estLinqOutFile \
26dc0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 77 61  ..            wa
26dd0 6c 44 62 46 69 6c 65 20 6e 6f 6e 57 61 6c 44 62  lDbFile nonWalDb
26de0 46 69 6c 65 0d 0a 0d 0a 20 20 20 20 20 20 20 20  File....        
26df0 75 6e 73 65 74 20 2d 6e 6f 63 6f 6d 70 6c 61 69  unset -nocomplai
26e00 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n \..           
26e10 20 74 65 73 74 45 66 36 45 78 65 46 69 6c 65 20   testEf6ExeFile 
26e20 74 65 73 74 4c 69 6e 71 45 78 65 46 69 6c 65 20  testLinqExeFile 
26e30 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  \..            t
26e40 65 73 74 45 78 65 46 69 6c 65 20 73 79 73 74 65  estExeFile syste
26e50 6d 44 61 74 61 53 51 4c 69 74 65 45 66 36 44 6c  mDataSQLiteEf6Dl
26e60 6c 46 69 6c 65 20 5c 0d 0a 20 20 20 20 20 20 20  lFile \..       
26e70 20 20 20 20 20 73 79 73 74 65 6d 44 61 74 61 53       systemDataS
26e80 51 4c 69 74 65 4c 69 6e 71 44 6c 6c 46 69 6c 65  QLiteLinqDllFile
26e90 20 73 79 73 74 65 6d 44 61 74 61 53 51 4c 69 74   systemDataSQLit
26ea0 65 44 6c 6c 46 69 6c 65 20 5c 0d 0a 20 20 20 20  eDllFile \..    
26eb0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 44 65          sqliteDe
26ec0 73 69 67 6e 65 72 44 6c 6c 46 69 6c 65 20 69 6e  signerDllFile in
26ed0 73 74 61 6c 6c 65 72 45 78 65 46 69 6c 65 20 5c  stallerExeFile \
26ee0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 65 6e  ..            en
26ef0 74 69 74 79 46 72 61 6d 65 77 6f 72 6b 44 6c 6c  tityFrameworkDll
26f00 46 69 6c 65 0d 0a 20 20 20 20 20 20 7d 0d 0a 20  File..      }.. 
26f10 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
26f20 63 20 72 75 6e 53 51 4c 69 74 65 54 65 73 74 45  c runSQLiteTestE
26f30 70 69 6c 6f 67 75 65 20 7b 7d 20 7b 0d 0a 20 20  pilogue {} {..  
26f40 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
26f50 4f 54 45 3a 20 53 6b 69 70 20 72 75 6e 6e 69 6e  OTE: Skip runnin
26f60 67 20 6f 75 72 20 63 75 73 74 6f 6d 20 65 70 69  g our custom epi
26f70 6c 6f 67 75 65 20 69 66 20 74 68 65 20 6d 61 69  logue if the mai
26f80 6e 20 6f 6e 65 20 68 61 73 20 62 65 65 6e 0d 0a  n one has been..
26f90 20 20 20 20 20 20 23 20 20 20 20 20 20 20 73 6b        #       sk
26fa0 69 70 70 65 64 2e 0d 0a 20 20 20 20 20 20 23 0d  ipped...      #.
26fb0 0a 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66  .      if {![inf
26fc0 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 65 70  o exists ::no(ep
26fd0 69 6c 6f 67 75 65 2e 65 61 67 6c 65 29 5d 7d 20  ilogue.eagle)]} 
26fe0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
26ff0 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
27000 45 3a 20 53 68 6f 77 20 77 68 65 6e 20 6f 75 72  E: Show when our
27010 20 74 65 73 74 73 20 61 63 74 75 61 6c 6c 79 20   tests actually 
27020 65 6e 64 65 64 20 28 6e 6f 77 29 2e 0d 0a 20 20  ended (now)...  
27030 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
27040 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
27050 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
27060 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
27070 20 20 22 2d 2d 2d 2d 20 53 79 73 74 65 6d 2e 44    "---- System.D
27080 61 74 61 2e 53 51 4c 69 74 65 20 74 65 73 74 73  ata.SQLite tests
27090 20 65 6e 64 65 64 20 61 74 20 22 20 5c 0d 0a 20   ended at " \.. 
270a0 20 20 20 20 20 20 20 20 20 20 20 5b 63 6c 6f 63             [cloc
270b0 6b 20 66 6f 72 6d 61 74 20 5b 63 6c 6f 63 6b 20  k format [clock 
270c0 73 65 63 6f 6e 64 73 5d 5d 20 5c 6e 5d 0d 0a 0d  seconds]] \n]...
270d0 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
270e0 20 20 20 20 23 20 4e 4f 54 45 3a 20 4c 6f 61 64      # NOTE: Load
270f0 20 74 68 65 20 22 65 70 69 6c 6f 67 75 65 22 20   the "epilogue" 
27100 63 75 73 74 6f 6d 20 70 65 72 2d 75 73 65 72 20  custom per-user 
27110 61 6e 64 2f 6f 72 20 70 65 72 2d 68 6f 73 74 20  and/or per-host 
27120 74 65 73 74 0d 0a 20 20 20 20 20 20 20 20 23 20  test..        # 
27130 20 20 20 20 20 20 73 65 74 74 69 6e 67 73 20 6e        settings n
27140 6f 77 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  ow...        #..
27150 20 20 20 20 20 20 20 20 75 70 6c 65 76 65 6c 20          uplevel 
27160 31 20 5b 6c 69 73 74 20 6c 6f 61 64 53 51 4c 69  1 [list loadSQLi
27170 74 65 54 65 73 74 53 65 74 74 69 6e 67 73 20 24  teTestSettings $
27180 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 2e  ::test_channel .
27190 65 70 69 6c 6f 67 75 65 5d 0d 0a 0d 0a 20 20 20  epilogue]....   
271a0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
271b0 23 20 42 55 47 46 49 58 3a 20 42 65 66 6f 72 65  # BUGFIX: Before
271c0 20 63 68 65 63 6b 69 6e 67 20 74 68 65 20 66 69   checking the fi
271d0 6e 61 6c 20 72 65 73 6f 75 72 63 65 73 20 69 6e  nal resources in
271e0 20 75 73 65 20 62 79 20 53 51 4c 69 74 65 2c 20   use by SQLite, 
271f0 6d 61 6b 65 0d 0a 20 20 20 20 20 20 20 20 23 20  make..        # 
27200 20 20 20 20 20 20 20 20 73 75 72 65 20 62 6f 74          sure bot
27210 68 20 6f 66 20 74 68 65 20 50 52 41 47 4d 41 20  h of the PRAGMA 
27220 72 65 6c 61 74 65 64 20 64 69 72 65 63 74 6f 72  related director
27230 79 20 6e 61 6d 65 73 20 61 72 65 20 66 72 65 65  y names are free
27240 64 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  d...        #.. 
27250 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72 53         checkForS
27260 51 4c 69 74 65 44 69 72 65 63 74 6f 72 69 65 73  QLiteDirectories
27270 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
27280 20 74 72 75 65 0d 0a 0d 0a 20 20 20 20 20 20 20   true....       
27290 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
272a0 54 45 3a 20 41 6c 73 6f 20 72 65 70 6f 72 74 20  TE: Also report 
272b0 74 68 65 20 72 65 73 6f 75 72 63 65 20 75 73 61  the resource usa
272c0 67 65 20 61 66 74 65 72 20 72 75 6e 6e 69 6e 67  ge after running
272d0 20 74 68 65 20 74 65 73 74 73 2e 0d 0a 20 20 20   the tests...   
272e0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
272f0 72 65 70 6f 72 74 53 51 4c 69 74 65 52 65 73 6f  reportSQLiteReso
27300 75 72 63 65 73 20 24 3a 3a 74 65 73 74 5f 63 68  urces $::test_ch
27310 61 6e 6e 65 6c 0d 0a 0d 0a 20 20 20 20 20 20 20  annel....       
27320 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
27330 54 45 3a 20 52 65 70 6f 72 74 20 74 68 65 20 63  TE: Report the c
27340 72 69 74 69 63 61 6c 20 68 61 6e 64 6c 65 20 63  ritical handle c
27350 6f 75 6e 74 73 20 61 66 74 65 72 20 72 75 6e 6e  ounts after runn
27360 69 6e 67 20 74 68 65 20 74 65 73 74 73 2e 0d 0a  ing the tests...
27370 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
27380 20 20 20 67 65 74 53 51 4c 69 74 65 48 61 6e 64     getSQLiteHand
27390 6c 65 43 6f 75 6e 74 73 20 24 3a 3a 74 65 73 74  leCounts $::test
273a0 5f 63 68 61 6e 6e 65 6c 0d 0a 0d 0a 20 20 20 20  _channel....    
273b0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
273c0 20 4e 4f 54 45 3a 20 49 66 20 6e 65 63 65 73 73   NOTE: If necess
273d0 61 72 79 2c 20 64 69 73 61 62 6c 65 20 73 68 61  ary, disable sha
273e0 72 65 64 2d 63 61 63 68 65 20 6d 6f 64 65 20 6e  red-cache mode n
273f0 6f 77 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  ow...        #..
27400 20 20 20 20 20 20 20 20 69 66 20 7b 5b 68 61 73          if {[has
27410 52 75 6e 74 69 6d 65 4f 70 74 69 6f 6e 20 73 68  RuntimeOption sh
27420 61 72 65 64 43 61 63 68 65 5d 7d 20 74 68 65 6e  aredCache]} then
27430 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 65 6e   {..          en
27440 61 62 6c 65 53 68 61 72 65 64 43 61 63 68 65 20  ableSharedCache 
27450 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
27460 66 61 6c 73 65 0d 0a 20 20 20 20 20 20 20 20 7d  false..        }
27470 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d  ..      }..    }
27480 0d 0a 0c 0d 0a 20 20 20 20 23 23 23 23 23 23 23  .....    #######
27490 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
274a0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
274b0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
274c0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
274d0 23 23 23 23 0d 0a 20 20 20 20 23 23 23 23 23 23  ####..    ######
274e0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
274f0 23 23 23 23 23 23 23 20 45 4e 44 20 45 61 67 6c  ####### END Eagl
27500 65 20 4f 4e 4c 59 20 23 23 23 23 23 23 23 23 23  e ONLY #########
27510 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
27520 23 23 23 23 23 0d 0a 20 20 20 20 23 23 23 23 23  #####..    #####
27530 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
27540 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
27550 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
27560 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
27570 23 23 23 23 23 23 0d 0a 20 20 7d 0d 0a 0d 0a 20  ######..  }.... 
27580 20 23 0d 0a 20 20 23 20 4e 4f 54 45 3a 20 53 61   #..  # NOTE: Sa
27590 76 65 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  ve the name of t
275a0 68 65 20 64 69 72 65 63 74 6f 72 79 20 63 6f 6e  he directory con
275b0 74 61 69 6e 69 6e 67 20 74 68 69 73 20 66 69 6c  taining this fil
275c0 65 2e 0d 0a 20 20 23 0d 0a 20 20 69 66 20 7b 21  e...  #..  if {!
275d0 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 63 6f 6d  [info exists com
275e0 6d 6f 6e 5f 64 69 72 65 63 74 6f 72 79 5d 7d 20  mon_directory]} 
275f0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 73 65 74 20  then {..    set 
27600 63 6f 6d 6d 6f 6e 5f 64 69 72 65 63 74 6f 72 79  common_directory
27610 20 5b 66 69 6c 65 20 64 69 72 6e 61 6d 65 20 5b   [file dirname [
27620 69 6e 66 6f 20 73 63 72 69 70 74 5d 5d 0d 0a 20  info script]].. 
27630 20 7d 0d 0a 0d 0a 20 20 23 0d 0a 20 20 23 20 4e   }....  #..  # N
27640 4f 54 45 3a 20 50 72 6f 76 69 64 65 20 74 68 65  OTE: Provide the
27650 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c   System.Data.SQL
27660 69 74 65 20 74 65 73 74 20 70 61 63 6b 61 67 65  ite test package
27670 20 74 6f 20 74 68 65 20 69 6e 74 65 72 70 72 65   to the interpre
27680 74 65 72 2e 0d 0a 20 20 23 0d 0a 20 20 70 61 63  ter...  #..  pac
27690 6b 61 67 65 20 70 72 6f 76 69 64 65 20 53 79 73  kage provide Sys
276a0 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e  tem.Data.SQLite.
276b0 54 65 73 74 20 31 2e 30 0d 0a 7d 0d 0a           Test 1.0..}..