System.Data.SQLite
Hex Artifact Content
Not logged in

Artifact 7e20f4a0ec75aa2f6727ce65963e6dc0af79b941:


0000: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0010: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0020: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0030: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0040: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0d  ###############.
0050: 0a 23 0d 0a 23 20 63 6f 6d 6d 6f 6e 2e 65 61 67  .#..# common.eag
0060: 6c 65 20 2d 2d 0d 0a 23 0d 0a 23 20 57 72 69 74  le --..#..# Writ
0070: 74 65 6e 20 62 79 20 4a 6f 65 20 4d 69 73 74 61  ten by Joe Mista
0080: 63 68 6b 69 6e 2e 0d 0a 23 20 52 65 6c 65 61 73  chkin...# Releas
0090: 65 64 20 74 6f 20 74 68 65 20 70 75 62 6c 69 63  ed to the public
00a0: 20 64 6f 6d 61 69 6e 2c 20 75 73 65 20 61 74 20   domain, use at 
00b0: 79 6f 75 72 20 6f 77 6e 20 72 69 73 6b 21 0d 0a  your own risk!..
00c0: 23 0d 0a 23 23 23 23 23 23 23 23 23 23 23 23 23  #..#############
00d0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
00e0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
00f0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0100: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0110: 23 23 0d 0a 0d 0a 23 0d 0a 23 20 4e 4f 54 45 3a  ##....#..# NOTE:
0120: 20 55 73 65 20 6f 75 72 20 6f 77 6e 20 6e 61 6d   Use our own nam
0130: 65 73 70 61 63 65 20 68 65 72 65 20 62 65 63 61  espace here beca
0140: 75 73 65 20 65 76 65 6e 20 74 68 6f 75 67 68 20  use even though 
0150: 77 65 20 64 6f 20 6e 6f 74 20 64 69 72 65 63 74  we do not direct
0160: 6c 79 0d 0a 23 20 20 20 20 20 20 20 73 75 70 70  ly..#       supp
0170: 6f 72 74 20 6e 61 6d 65 73 70 61 63 65 73 20 6f  ort namespaces o
0180: 75 72 73 65 6c 76 65 73 2c 20 77 65 20 64 6f 20  urselves, we do 
0190: 6e 6f 74 20 77 61 6e 74 20 74 6f 20 70 6f 6c 6c  not want to poll
01a0: 75 74 65 20 74 68 65 20 67 6c 6f 62 61 6c 0d 0a  ute the global..
01b0: 23 20 20 20 20 20 20 20 6e 61 6d 65 73 70 61 63  #       namespac
01c0: 65 20 69 66 20 74 68 69 73 20 73 63 72 69 70 74  e if this script
01d0: 20 61 63 74 75 61 6c 6c 79 20 65 6e 64 73 20 75   actually ends u
01e0: 70 20 62 65 69 6e 67 20 65 76 61 6c 75 61 74 65  p being evaluate
01f0: 64 20 69 6e 20 54 63 6c 2e 0d 0a 23 0d 0a 6e 61  d in Tcl...#..na
0200: 6d 65 73 70 61 63 65 20 65 76 61 6c 20 3a 3a 45  mespace eval ::E
0210: 61 67 6c 65 20 7b 0d 0a 20 20 69 66 20 7b 5b 69  agle {..  if {[i
0220: 73 45 61 67 6c 65 5d 7d 20 74 68 65 6e 20 7b 0d  sEagle]} then {.
0230: 0a 20 20 20 20 23 23 23 23 23 23 23 23 23 23 23  .    ###########
0240: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0250: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0260: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0270: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0280: 0d 0a 20 20 20 20 23 23 23 23 23 23 23 23 23 23  ..    ##########
0290: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
02a0: 23 23 20 42 45 47 49 4e 20 45 61 67 6c 65 20 4f  ## BEGIN Eagle O
02b0: 4e 4c 59 20 23 23 23 23 23 23 23 23 23 23 23 23  NLY ############
02c0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
02d0: 23 0d 0a 20 20 20 20 23 23 23 23 23 23 23 23 23  #..    #########
02e0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
02f0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0300: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0310: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0320: 23 23 0d 0a 0d 0a 20 20 20 20 70 72 6f 63 20 67  ##....    proc g
0330: 65 74 53 51 4c 69 74 65 44 65 66 69 6e 65 43 6f  etSQLiteDefineCo
0340: 6e 73 74 61 6e 74 50 72 65 66 69 78 20 7b 7d 20  nstantPrefix {} 
0350: 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  {..      #..    
0360: 20 20 23 20 4e 4f 54 45 3a 20 53 65 65 20 69 66    # NOTE: See if
0370: 20 74 68 65 20 64 65 66 69 6e 65 20 63 6f 6e 73   the define cons
0380: 74 61 6e 74 20 70 72 65 66 69 78 20 73 65 74 74  tant prefix sett
0390: 69 6e 67 20 68 61 73 20 62 65 65 6e 20 6f 76 65  ing has been ove
03a0: 72 72 69 64 64 65 6e 0d 0a 20 20 20 20 20 20 23  rridden..      #
03b0: 20 20 20 20 20 20 20 62 79 20 74 68 65 20 75 73         by the us
03c0: 65 72 20 28 65 2e 67 2e 20 6f 6e 20 74 68 65 20  er (e.g. on the 
03d0: 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 29 2e 0d 0a  command line)...
03e0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69        #..      i
03f0: 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20  f {[info exists 
0400: 3a 3a 64 65 66 69 6e 65 5f 63 6f 6e 73 74 61 6e  ::define_constan
0410: 74 5f 70 72 65 66 69 78 5d 20 26 26 20 5c 0d 0a  t_prefix] && \..
0420: 20 20 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e            [strin
0430: 67 20 6c 65 6e 67 74 68 20 24 3a 3a 64 65 66 69  g length $::defi
0440: 6e 65 5f 63 6f 6e 73 74 61 6e 74 5f 70 72 65 66  ne_constant_pref
0450: 69 78 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d  ix] > 0} then {.
0460: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
0470: 20 20 20 20 23 20 4e 4f 54 45 3a 20 55 73 65 20      # NOTE: Use 
0480: 74 68 65 20 73 70 65 63 69 66 69 65 64 20 64 65  the specified de
0490: 66 69 6e 65 20 63 6f 6e 73 74 61 6e 74 20 70 72  fine constant pr
04a0: 65 66 69 78 2e 0d 0a 20 20 20 20 20 20 20 20 23  efix...        #
04b0: 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ..        return
04c0: 20 24 3a 3a 64 65 66 69 6e 65 5f 63 6f 6e 73 74   $::define_const
04d0: 61 6e 74 5f 70 72 65 66 69 78 0d 0a 20 20 20 20  ant_prefix..    
04e0: 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
04f0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
0500: 20 4e 4f 54 45 3a 20 55 73 65 20 74 68 65 20 64   NOTE: Use the d
0510: 65 66 61 75 6c 74 20 64 65 66 69 6e 65 20 63 6f  efault define co
0520: 6e 73 74 61 6e 74 20 70 72 65 66 69 78 2e 0d 0a  nstant prefix...
0530: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
0540: 20 20 20 72 65 74 75 72 6e 20 64 65 66 69 6e 65     return define
0550: 43 6f 6e 73 74 61 6e 74 2e 53 79 73 74 65 6d 2e  Constant.System.
0560: 44 61 74 61 2e 53 51 4c 69 74 65 2e 0d 0a 20 20  Data.SQLite...  
0570: 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d      }..    }....
0580: 0a 20 20 20 20 70 72 6f 63 20 68 61 76 65 53 51  .    proc haveSQ
0590: 4c 69 74 65 44 65 66 69 6e 65 43 6f 6e 73 74 61  LiteDefineConsta
05a0: 6e 74 20 7b 20 6e 61 6d 65 20 7d 20 7b 0d 0a 20  nt { name } {.. 
05b0: 20 20 20 20 20 72 65 74 75 72 6e 20 5b 68 61 76       return [hav
05c0: 65 43 6f 6e 73 74 72 61 69 6e 74 20 5c 0d 0a 20  eConstraint \.. 
05d0: 20 20 20 20 20 20 20 20 20 5b 61 70 70 65 6e 64           [append
05e0: 41 72 67 73 20 5b 67 65 74 53 51 4c 69 74 65 44  Args [getSQLiteD
05f0: 65 66 69 6e 65 43 6f 6e 73 74 61 6e 74 50 72 65  efineConstantPre
0600: 66 69 78 5d 20 24 6e 61 6d 65 5d 5d 0d 0a 20 20  fix] $name]]..  
0610: 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
0620: 20 67 65 74 42 75 69 6c 64 59 65 61 72 20 7b 7d   getBuildYear {}
0630: 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20   {..      #..   
0640: 20 20 20 23 20 4e 4f 54 45 3a 20 53 65 65 20 69     # NOTE: See i
0650: 66 20 74 68 65 20 22 79 65 61 72 22 20 73 65 74  f the "year" set
0660: 74 69 6e 67 20 68 61 73 20 62 65 65 6e 20 6f 76  ting has been ov
0670: 65 72 72 69 64 64 65 6e 20 62 79 20 74 68 65 20  erridden by the 
0680: 75 73 65 72 20 28 65 2e 67 2e 0d 0a 20 20 20 20  user (e.g...    
0690: 20 20 23 20 20 20 20 20 20 20 6f 6e 20 74 68 65    #       on the
06a0: 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 29 2e 20   command line). 
06b0: 20 54 68 69 73 20 68 65 6c 70 73 20 63 6f 6e 74   This helps cont
06c0: 72 6f 6c 20 65 78 61 63 74 6c 79 20 77 68 69 63  rol exactly whic
06d0: 68 20 73 65 74 20 6f 66 0d 0a 20 20 20 20 20 20  h set of..      
06e0: 23 20 20 20 20 20 20 20 62 69 6e 61 72 69 65 73  #       binaries
06f0: 20 77 65 20 61 72 65 20 74 65 73 74 69 6e 67 2c   we are testing,
0700: 20 74 68 6f 73 65 20 70 72 6f 64 75 63 65 64 20   those produced 
0710: 75 73 69 6e 67 20 74 68 65 20 56 69 73 75 61 6c  using the Visual
0720: 20 53 74 75 64 69 6f 0d 0a 20 20 20 20 20 20 23   Studio..      #
0730: 20 20 20 20 20 20 20 32 30 30 35 2c 20 32 30 30         2005, 200
0740: 38 2c 20 32 30 31 30 2c 20 32 30 31 32 2c 20 32  8, 2010, 2012, 2
0750: 30 31 33 2c 20 6f 72 20 32 30 31 35 20 62 75 69  013, or 2015 bui
0760: 6c 64 20 73 79 73 74 65 6d 73 2e 20 20 54 6f 20  ld systems.  To 
0770: 6f 76 65 72 72 69 64 65 0d 0a 20 20 20 20 20 20  override..      
0780: 23 20 20 20 20 20 20 20 74 68 69 73 20 76 61 6c  #       this val
0790: 75 65 20 76 69 61 20 74 68 65 20 63 6f 6d 6d 61  ue via the comma
07a0: 6e 64 20 6c 69 6e 65 2c 20 65 6e 74 65 72 20 61  nd line, enter a
07b0: 20 63 6f 6d 6d 61 6e 64 20 73 69 6d 69 6c 61 72   command similar
07c0: 20 74 6f 20 6f 6e 65 0d 0a 20 20 20 20 20 20 23   to one..      #
07d0: 20 20 20 20 20 20 20 6f 66 20 74 68 65 20 66 6f         of the fo
07e0: 6c 6c 6f 77 69 6e 67 20 28 61 6c 6c 20 6f 6e 20  llowing (all on 
07f0: 6f 6e 65 20 6c 69 6e 65 29 3a 0d 0a 20 20 20 20  one line):..    
0800: 20 20 23 0d 0a 20 20 20 20 20 20 23 20 20 20 20    #..      #    
0810: 20 20 20 45 61 67 6c 65 53 68 65 6c 6c 2e 65 78     EagleShell.ex
0820: 65 20 2d 61 6e 79 49 6e 69 74 69 61 6c 69 7a 65  e -anyInitialize
0830: 20 22 73 65 74 20 74 65 73 74 5f 79 65 61 72 20   "set test_year 
0840: 32 30 30 35 22 0d 0a 20 20 20 20 20 20 23 20 20  2005"..      #  
0850: 20 20 20 20 20 20 20 2d 66 69 6c 65 20 2e 5c 70         -file .\p
0860: 61 74 68 5c 74 6f 5c 61 6c 6c 2e 65 61 67 6c 65  ath\to\all.eagle
0870: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
0880: 20 23 20 20 20 20 20 20 20 45 61 67 6c 65 53 68   #       EagleSh
0890: 65 6c 6c 2e 65 78 65 20 2d 61 6e 79 49 6e 69 74  ell.exe -anyInit
08a0: 69 61 6c 69 7a 65 20 22 73 65 74 20 74 65 73 74  ialize "set test
08b0: 5f 79 65 61 72 20 32 30 30 38 22 0d 0a 20 20 20  _year 2008"..   
08c0: 20 20 20 23 20 20 20 20 20 20 20 20 20 2d 66 69     #         -fi
08d0: 6c 65 20 2e 5c 70 61 74 68 5c 74 6f 5c 61 6c 6c  le .\path\to\all
08e0: 2e 65 61 67 6c 65 0d 0a 20 20 20 20 20 20 23 0d  .eagle..      #.
08f0: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 45  .      #       E
0900: 61 67 6c 65 53 68 65 6c 6c 2e 65 78 65 20 2d 61  agleShell.exe -a
0910: 6e 79 49 6e 69 74 69 61 6c 69 7a 65 20 22 73 65  nyInitialize "se
0920: 74 20 74 65 73 74 5f 79 65 61 72 20 32 30 31 30  t test_year 2010
0930: 22 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  "..      #      
0940: 20 20 20 2d 66 69 6c 65 20 2e 5c 70 61 74 68 5c     -file .\path\
0950: 74 6f 5c 61 6c 6c 2e 65 61 67 6c 65 0d 0a 20 20  to\all.eagle..  
0960: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 20      #..      #  
0970: 20 20 20 20 20 45 61 67 6c 65 53 68 65 6c 6c 2e       EagleShell.
0980: 65 78 65 20 2d 61 6e 79 49 6e 69 74 69 61 6c 69  exe -anyInitiali
0990: 7a 65 20 22 73 65 74 20 74 65 73 74 5f 79 65 61  ze "set test_yea
09a0: 72 20 32 30 31 32 22 0d 0a 20 20 20 20 20 20 23  r 2012"..      #
09b0: 20 20 20 20 20 20 20 20 20 2d 66 69 6c 65 20 2e           -file .
09c0: 5c 70 61 74 68 5c 74 6f 5c 61 6c 6c 2e 65 61 67  \path\to\all.eag
09d0: 6c 65 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  le..      #..   
09e0: 20 20 20 23 20 20 20 20 20 20 20 45 61 67 6c 65     #       Eagle
09f0: 53 68 65 6c 6c 2e 65 78 65 20 2d 61 6e 79 49 6e  Shell.exe -anyIn
0a00: 69 74 69 61 6c 69 7a 65 20 22 73 65 74 20 74 65  itialize "set te
0a10: 73 74 5f 79 65 61 72 20 32 30 31 33 22 0d 0a 20  st_year 2013".. 
0a20: 20 20 20 20 20 23 20 20 20 20 20 20 20 20 20 2d       #         -
0a30: 66 69 6c 65 20 2e 5c 70 61 74 68 5c 74 6f 5c 61  file .\path\to\a
0a40: 6c 6c 2e 65 61 67 6c 65 0d 0a 20 20 20 20 20 20  ll.eagle..      
0a50: 23 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  #..      #      
0a60: 20 45 61 67 6c 65 53 68 65 6c 6c 2e 65 78 65 20   EagleShell.exe 
0a70: 2d 61 6e 79 49 6e 69 74 69 61 6c 69 7a 65 20 22  -anyInitialize "
0a80: 73 65 74 20 74 65 73 74 5f 79 65 61 72 20 32 30  set test_year 20
0a90: 31 35 22 0d 0a 20 20 20 20 20 20 23 20 20 20 20  15"..      #    
0aa0: 20 20 20 20 20 2d 66 69 6c 65 20 2e 5c 70 61 74       -file .\pat
0ab0: 68 5c 74 6f 5c 61 6c 6c 2e 65 61 67 6c 65 0d 0a  h\to\all.eagle..
0ac0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
0ad0: 20 20 20 20 20 20 20 45 61 67 6c 65 53 68 65 6c         EagleShel
0ae0: 6c 2e 65 78 65 20 2d 61 6e 79 49 6e 69 74 69 61  l.exe -anyInitia
0af0: 6c 69 7a 65 20 22 75 6e 73 65 74 20 2d 6e 6f 63  lize "unset -noc
0b00: 6f 6d 70 6c 61 69 6e 20 74 65 73 74 5f 79 65 61  omplain test_yea
0b10: 72 22 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  r"..      #     
0b20: 20 20 20 20 2d 66 69 6c 65 20 2e 5c 70 61 74 68      -file .\path
0b30: 5c 74 6f 5c 61 6c 6c 2e 65 61 67 6c 65 0d 0a 20  \to\all.eagle.. 
0b40: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66       #..      if
0b50: 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a   {[info exists :
0b60: 3a 74 65 73 74 5f 79 65 61 72 5d 20 26 26 20 5b  :test_year] && [
0b70: 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a  string length $:
0b80: 3a 74 65 73 74 5f 79 65 61 72 5d 20 3e 20 30 7d  :test_year] > 0}
0b90: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
0ba0: 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
0bb0: 54 45 3a 20 55 73 65 20 74 68 65 20 73 70 65 63  TE: Use the spec
0bc0: 69 66 69 65 64 20 74 65 73 74 20 79 65 61 72 2e  ified test year.
0bd0: 20 20 49 66 20 74 68 69 73 20 76 61 72 69 61 62    If this variab
0be0: 6c 65 20 69 73 20 6e 6f 74 20 73 65 74 2c 20 74  le is not set, t
0bf0: 68 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  he..        #   
0c00: 20 20 20 20 64 65 66 61 75 6c 74 20 76 61 6c 75      default valu
0c10: 65 20 77 69 6c 6c 20 62 65 20 62 61 73 65 64 20  e will be based 
0c20: 6f 6e 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  on whether or no
0c30: 74 20 45 61 67 6c 65 20 68 61 73 20 62 65 65 6e  t Eagle has been
0c40: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
0c50: 20 20 63 6f 6d 70 69 6c 65 64 20 61 67 61 69 6e    compiled again
0c60: 73 74 20 74 68 65 20 43 4c 52 20 76 32 2e 30 20  st the CLR v2.0 
0c70: 6f 72 20 43 4c 52 20 76 34 2e 30 2e 0d 0a 20 20  or CLR v4.0...  
0c80: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
0c90: 20 72 65 74 75 72 6e 20 24 3a 3a 74 65 73 74 5f   return $::test_
0ca0: 79 65 61 72 0d 0a 20 20 20 20 20 20 7d 20 65 6c  year..      } el
0cb0: 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d  se {..        #.
0cc0: 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
0cd0: 20 49 66 20 45 61 67 6c 65 20 68 61 73 20 62 65   If Eagle has be
0ce0: 65 6e 20 63 6f 6d 70 69 6c 65 64 20 61 67 61 69  en compiled agai
0cf0: 6e 73 74 20 74 68 65 20 43 4c 52 20 76 34 2e 30  nst the CLR v4.0
0d00: 2c 20 75 73 65 20 22 32 30 31 30 22 20 62 79 0d  , use "2010" by.
0d10: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
0d20: 20 64 65 66 61 75 6c 74 20 28 77 65 20 63 6f 75   default (we cou
0d30: 6c 64 20 75 73 65 20 22 32 30 31 32 22 2c 20 22  ld use "2012", "
0d40: 32 30 31 33 22 2c 20 6f 72 20 22 32 30 31 35 22  2013", or "2015"
0d50: 20 69 6e 20 74 68 61 74 20 63 61 73 65 20 61 73   in that case as
0d60: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
0d70: 20 20 77 65 6c 6c 29 20 61 73 20 74 68 65 20 74    well) as the t
0d80: 65 73 74 20 79 65 61 72 3b 20 6f 74 68 65 72 77  est year; otherw
0d90: 69 73 65 2c 20 75 73 65 20 22 32 30 30 38 22 20  ise, use "2008" 
0da0: 62 79 20 64 65 66 61 75 6c 74 20 28 77 65 0d 0a  by default (we..
0db0: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
0dc0: 63 6f 75 6c 64 20 75 73 65 20 22 32 30 30 35 22  could use "2005"
0dd0: 20 69 6e 20 74 68 61 74 20 63 61 73 65 20 61 73   in that case as
0de0: 20 77 65 6c 6c 29 2e 20 20 49 66 20 61 6e 6f 74   well).  If anot
0df0: 68 65 72 20 6d 61 6a 6f 72 0d 0a 20 20 20 20 20  her major..     
0e00: 20 20 20 23 20 20 20 20 20 20 20 5b 69 6e 63 6f     #       [inco
0e10: 6d 70 61 74 69 62 6c 65 5d 20 76 65 72 73 69 6f  mpatible] versio
0e20: 6e 20 6f 66 20 74 68 65 20 43 4c 52 20 69 73 20  n of the CLR is 
0e30: 72 65 6c 65 61 73 65 64 2c 20 74 68 69 73 20 63  released, this c
0e40: 68 65 63 6b 20 77 69 6c 6c 0d 0a 20 20 20 20 20  heck will..     
0e50: 20 20 20 23 20 20 20 20 20 20 20 68 61 76 65 20     #       have 
0e60: 74 6f 20 62 65 20 63 68 61 6e 67 65 64 2e 20 20  to be changed.  
0e70: 54 68 65 20 64 65 66 61 75 6c 74 20 74 65 73 74  The default test
0e80: 20 79 65 61 72 20 74 6f 20 75 73 65 20 66 6f 72   year to use for
0e90: 20 61 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20   a..        #   
0ea0: 20 20 20 20 70 61 72 74 69 63 75 6c 61 72 20 43      particular C
0eb0: 4c 52 20 76 65 72 73 69 6f 6e 20 6d 61 79 20 62  LR version may b
0ec0: 65 20 6f 76 65 72 72 69 64 64 65 6e 20 62 79 20  e overridden by 
0ed0: 73 65 74 74 69 6e 67 20 74 68 65 20 67 6c 6f 62  setting the glob
0ee0: 61 6c 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  al..        #   
0ef0: 20 20 20 20 76 61 72 69 61 62 6c 65 20 22 74 65      variable "te
0f00: 73 74 5f 79 65 61 72 5f 63 6c 72 5f 76 24 58 22  st_year_clr_v$X"
0f10: 2c 20 77 68 65 72 65 20 22 24 58 22 20 6d 61 79  , where "$X" may
0f20: 20 5b 63 75 72 72 65 6e 74 6c 79 5d 20 62 65 0d   [currently] be.
0f30: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
0f40: 20 65 69 74 68 65 72 20 22 32 22 20 6f 72 20 22   either "2" or "
0f50: 34 22 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  4"...        #..
0f60: 20 20 20 20 20 20 20 20 69 66 20 7b 5b 68 61 76          if {[hav
0f70: 65 43 6f 6e 73 74 72 61 69 6e 74 20 69 6d 61 67  eConstraint imag
0f80: 65 52 75 6e 74 69 6d 65 34 30 5d 7d 20 74 68 65  eRuntime40]} the
0f90: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69  n {..          i
0fa0: 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20  f {[info exists 
0fb0: 3a 3a 74 65 73 74 5f 79 65 61 72 5f 63 6c 72 5f  ::test_year_clr_
0fc0: 76 34 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20  v4] && \..      
0fd0: 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20          [string 
0fe0: 6c 65 6e 67 74 68 20 24 3a 3a 74 65 73 74 5f 79  length $::test_y
0ff0: 65 61 72 5f 63 6c 72 5f 76 34 5d 20 3e 20 30 7d  ear_clr_v4] > 0}
1000: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
1010: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
1020: 20 20 20 20 23 20 4e 4f 54 45 3a 20 55 73 65 20      # NOTE: Use 
1030: 74 68 65 20 73 70 65 63 69 66 69 65 64 20 74 65  the specified te
1040: 73 74 20 79 65 61 72 20 66 6f 72 20 74 68 65 20  st year for the 
1050: 43 4c 52 20 76 34 2e 30 2e 0d 0a 20 20 20 20 20  CLR v4.0...     
1060: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
1070: 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 3a 3a        return $::
1080: 74 65 73 74 5f 79 65 61 72 5f 63 6c 72 5f 76 34  test_year_clr_v4
1090: 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c  ..          } el
10a0: 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  se {..          
10b0: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20    #..           
10c0: 20 23 20 4e 4f 54 45 3a 20 55 73 65 20 74 68 65   # NOTE: Use the
10d0: 20 64 65 66 61 75 6c 74 20 74 65 73 74 20 79 65   default test ye
10e0: 61 72 20 66 6f 72 20 74 68 65 20 43 4c 52 20 76  ar for the CLR v
10f0: 34 2e 30 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  4.0...          
1100: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20    #..           
1110: 20 72 65 74 75 72 6e 20 32 30 31 30 3b 20 23 20   return 2010; # 
1120: 54 4f 44 4f 3a 20 47 6f 6f 64 20 22 66 61 6c 6c  TODO: Good "fall
1130: 62 61 63 6b 22 20 64 65 66 61 75 6c 74 3f 0d 0a  back" default?..
1140: 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
1150: 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
1160: 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 69 6e           if {[in
1170: 66 6f 20 65 78 69 73 74 73 20 3a 3a 74 65 73 74  fo exists ::test
1180: 5f 79 65 61 72 5f 63 6c 72 5f 76 32 5d 20 26 26  _year_clr_v2] &&
1190: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
11a0: 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68    [string length
11b0: 20 24 3a 3a 74 65 73 74 5f 79 65 61 72 5f 63 6c   $::test_year_cl
11c0: 72 5f 76 32 5d 20 3e 20 30 7d 20 74 68 65 6e 20  r_v2] > 0} then 
11d0: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23  {..            #
11e0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 20  ..            # 
11f0: 4e 4f 54 45 3a 20 55 73 65 20 74 68 65 20 73 70  NOTE: Use the sp
1200: 65 63 69 66 69 65 64 20 74 65 73 74 20 79 65 61  ecified test yea
1210: 72 20 66 6f 72 20 74 68 65 20 43 4c 52 20 76 32  r for the CLR v2
1220: 2e 30 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20  .0...           
1230: 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   #..            
1240: 72 65 74 75 72 6e 20 24 3a 3a 74 65 73 74 5f 79  return $::test_y
1250: 65 61 72 5f 63 6c 72 5f 76 32 0d 0a 20 20 20 20  ear_clr_v2..    
1260: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
1270: 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20              #.. 
1280: 20 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54             # NOT
1290: 45 3a 20 55 73 65 20 74 68 65 20 64 65 66 61 75  E: Use the defau
12a0: 6c 74 20 74 65 73 74 20 79 65 61 72 20 66 6f 72  lt test year for
12b0: 20 74 68 65 20 43 4c 52 20 76 32 2e 30 2e 0d 0a   the CLR v2.0...
12c0: 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20              #.. 
12d0: 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
12e0: 6e 20 32 30 30 38 3b 20 23 20 54 4f 44 4f 3a 20  n 2008; # TODO: 
12f0: 47 6f 6f 64 20 22 66 61 6c 6c 62 61 63 6b 22 20  Good "fallback" 
1300: 64 65 66 61 75 6c 74 3f 0d 0a 20 20 20 20 20 20  default?..      
1310: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d      }..        }
1320: 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d  ..      }..    }
1330: 0d 0a 0c 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20  .....    #..    
1340: 23 20 4e 4f 54 45 3a 20 54 68 69 73 20 70 72 6f  # NOTE: This pro
1350: 63 65 64 75 72 65 20 69 73 20 6f 6e 6c 79 20 75  cedure is only u
1360: 73 65 64 20 77 68 65 6e 20 61 64 64 69 6e 67 20  sed when adding 
1370: 73 68 69 6d 6d 65 64 20 74 65 73 74 20 63 6f 6e  shimmed test con
1380: 73 74 72 61 69 6e 74 73 2e 0d 0a 20 20 20 20 23  straints...    #
1390: 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74 42 75  ..    proc getBu
13a0: 69 6c 64 43 6c 72 56 65 72 73 69 6f 6e 20 7b 7d  ildClrVersion {}
13b0: 20 7b 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69   {..      if {[i
13c0: 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 74 65 73  nfo exists ::tes
13d0: 74 5f 63 6c 72 5d 20 26 26 20 5b 73 74 72 69 6e  t_clr] && [strin
13e0: 67 20 6c 65 6e 67 74 68 20 24 3a 3a 74 65 73 74  g length $::test
13f0: 5f 63 6c 72 5d 20 3e 20 30 7d 20 74 68 65 6e 20  _clr] > 0} then 
1400: 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
1410: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 55 73        # NOTE: Us
1420: 65 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  e the specified 
1430: 74 65 73 74 20 76 65 72 73 69 6f 6e 20 66 6f 72  test version for
1440: 20 74 68 65 20 43 4c 52 2e 20 20 49 66 20 74 68   the CLR.  If th
1450: 69 73 20 76 61 72 69 61 62 6c 65 0d 0a 20 20 20  is variable..   
1460: 20 20 20 20 20 23 20 20 20 20 20 20 20 69 73 20       #       is 
1470: 6e 6f 74 20 73 65 74 2c 20 74 68 65 20 64 65 66  not set, the def
1480: 61 75 6c 74 20 76 61 6c 75 65 20 77 69 6c 6c 20  ault value will 
1490: 62 65 20 62 61 73 65 64 20 6f 6e 20 77 68 65 74  be based on whet
14a0: 68 65 72 20 6f 72 20 6e 6f 74 0d 0a 20 20 20 20  her or not..    
14b0: 20 20 20 20 23 20 20 20 20 20 20 20 45 61 67 6c      #       Eagl
14c0: 65 20 68 61 73 20 62 65 65 6e 20 63 6f 6d 70 69  e has been compi
14d0: 6c 65 64 20 61 67 61 69 6e 73 74 20 74 68 65 20  led against the 
14e0: 43 4c 52 20 76 32 2e 30 20 6f 72 20 43 4c 52 20  CLR v2.0 or CLR 
14f0: 76 34 2e 30 2e 0d 0a 20 20 20 20 20 20 20 20 23  v4.0...        #
1500: 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ..        return
1510: 20 24 3a 3a 74 65 73 74 5f 63 6c 72 0d 0a 20 20   $::test_clr..  
1520: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
1530: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
1540: 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 69   # NOTE: Check i
1550: 66 20 45 61 67 6c 65 20 68 61 73 20 62 65 65 6e  f Eagle has been
1560: 20 63 6f 6d 70 69 6c 65 64 20 61 67 61 69 6e 73   compiled agains
1570: 74 20 74 68 65 20 43 4c 52 20 76 34 2e 30 2e 20  t the CLR v4.0. 
1580: 20 49 66 20 73 6f 2c 0d 0a 20 20 20 20 20 20 20   If so,..       
1590: 20 23 20 20 20 20 20 20 20 6a 75 73 74 20 75 73   #       just us
15a0: 65 20 74 68 61 74 20 43 4c 52 20 76 65 72 73 69  e that CLR versi
15b0: 6f 6e 2e 20 20 4f 74 68 65 72 77 69 73 65 2c 20  on.  Otherwise, 
15c0: 75 73 65 20 74 68 65 20 76 65 72 73 69 6f 6e 20  use the version 
15d0: 66 6f 72 20 74 68 65 0d 0a 20 20 20 20 20 20 20  for the..       
15e0: 20 23 20 20 20 20 20 20 20 43 4c 52 20 76 32 2e   #       CLR v2.
15f0: 30 2e 20 20 49 66 20 61 6e 6f 74 68 65 72 20 6d  0.  If another m
1600: 61 6a 6f 72 20 5b 69 6e 63 6f 6d 70 61 74 69 62  ajor [incompatib
1610: 6c 65 5d 20 76 65 72 73 69 6f 6e 20 6f 66 20 74  le] version of t
1620: 68 65 20 43 4c 52 0d 0a 20 20 20 20 20 20 20 20  he CLR..        
1630: 23 20 20 20 20 20 20 20 69 73 20 72 65 6c 65 61  #       is relea
1640: 73 65 64 2c 20 74 68 69 73 20 63 68 65 63 6b 20  sed, this check 
1650: 77 69 6c 6c 20 68 61 76 65 20 74 6f 20 62 65 20  will have to be 
1660: 63 68 61 6e 67 65 64 2e 20 20 54 68 65 20 64 65  changed.  The de
1670: 66 61 75 6c 74 0d 0a 20 20 20 20 20 20 20 20 23  fault..        #
1680: 20 20 20 20 20 20 20 76 65 72 73 69 6f 6e 20 76         version v
1690: 61 6c 75 65 20 66 6f 72 20 61 20 70 61 72 74 69  alue for a parti
16a0: 63 75 6c 61 72 20 43 4c 52 20 76 65 72 73 69 6f  cular CLR versio
16b0: 6e 20 6d 61 79 20 62 65 20 6f 76 65 72 72 69 64  n may be overrid
16c0: 64 65 6e 0d 0a 20 20 20 20 20 20 20 20 23 20 20  den..        #  
16d0: 20 20 20 20 20 62 79 20 73 65 74 74 69 6e 67 20       by setting 
16e0: 74 68 65 20 67 6c 6f 62 61 6c 20 76 61 72 69 61  the global varia
16f0: 62 6c 65 20 22 74 65 73 74 5f 63 6c 72 5f 76 24  ble "test_clr_v$
1700: 58 22 2c 20 77 68 65 72 65 20 22 24 58 22 20 6d  X", where "$X" m
1710: 61 79 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  ay..        #   
1720: 20 20 20 20 5b 63 75 72 72 65 6e 74 6c 79 5d 20      [currently] 
1730: 62 65 20 65 69 74 68 65 72 20 22 32 22 20 6f 72  be either "2" or
1740: 20 22 34 22 2e 0d 0a 20 20 20 20 20 20 20 20 23   "4"...        #
1750: 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 68  ..        if {[h
1760: 61 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 69 6d  aveConstraint im
1770: 61 67 65 52 75 6e 74 69 6d 65 34 30 5d 7d 20 74  ageRuntime40]} t
1780: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
1790: 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74   if {[info exist
17a0: 73 20 3a 3a 74 65 73 74 5f 63 6c 72 5f 76 34 5d  s ::test_clr_v4]
17b0: 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20   && \..         
17c0: 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e       [string len
17d0: 67 74 68 20 24 3a 3a 74 65 73 74 5f 63 6c 72 5f  gth $::test_clr_
17e0: 76 34 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d  v4] > 0} then {.
17f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a  .            #..
1800: 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f              # NO
1810: 54 45 3a 20 55 73 65 20 74 68 65 20 73 70 65 63  TE: Use the spec
1820: 69 66 69 65 64 20 74 65 73 74 20 76 65 72 73 69  ified test versi
1830: 6f 6e 20 66 6f 72 20 74 68 65 20 43 4c 52 20 76  on for the CLR v
1840: 34 2e 30 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  4.0...          
1850: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20    #..           
1860: 20 72 65 74 75 72 6e 20 24 3a 3a 74 65 73 74 5f   return $::test_
1870: 63 6c 72 5f 76 34 0d 0a 20 20 20 20 20 20 20 20  clr_v4..        
1880: 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
1890: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
18a0: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 55         # NOTE: U
18b0: 73 65 20 74 68 65 20 64 65 66 61 75 6c 74 20 74  se the default t
18c0: 65 73 74 20 76 65 72 73 69 6f 6e 20 66 6f 72 20  est version for 
18d0: 74 68 65 20 43 4c 52 20 76 34 2e 30 2e 0d 0a 20  the CLR v4.0... 
18e0: 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
18f0: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
1900: 20 34 2e 30 2e 33 30 33 31 39 3b 20 23 20 54 4f   4.0.30319; # TO
1910: 44 4f 3a 20 47 6f 6f 64 20 22 66 61 6c 6c 62 61  DO: Good "fallba
1920: 63 6b 22 20 64 65 66 61 75 6c 74 3f 0d 0a 20 20  ck" default?..  
1930: 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
1940: 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
1950: 20 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f         if {[info
1960: 20 65 78 69 73 74 73 20 3a 3a 74 65 73 74 5f 63   exists ::test_c
1970: 6c 72 5f 76 32 5d 20 26 26 20 5c 0d 0a 20 20 20  lr_v2] && \..   
1980: 20 20 20 20 20 20 20 20 20 20 20 5b 73 74 72 69             [stri
1990: 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a 74 65 73  ng length $::tes
19a0: 74 5f 63 6c 72 5f 76 32 5d 20 3e 20 30 7d 20 74  t_clr_v2] > 0} t
19b0: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
19c0: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
19d0: 20 20 23 20 4e 4f 54 45 3a 20 55 73 65 20 74 68    # NOTE: Use th
19e0: 65 20 73 70 65 63 69 66 69 65 64 20 74 65 73 74  e specified test
19f0: 20 76 65 72 73 69 6f 6e 20 66 6f 72 20 74 68 65   version for the
1a00: 20 43 4c 52 20 76 32 2e 30 2e 0d 0a 20 20 20 20   CLR v2.0...    
1a10: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
1a20: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 3a         return $:
1a30: 3a 74 65 73 74 5f 63 6c 72 5f 76 32 0d 0a 20 20  :test_clr_v2..  
1a40: 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b          } else {
1a50: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 0d  ..            #.
1a60: 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4e  .            # N
1a70: 4f 54 45 3a 20 55 73 65 20 74 68 65 20 64 65 66  OTE: Use the def
1a80: 61 75 6c 74 20 74 65 73 74 20 76 65 72 73 69 6f  ault test versio
1a90: 6e 20 66 6f 72 20 74 68 65 20 43 4c 52 20 76 32  n for the CLR v2
1aa0: 2e 30 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20  .0...           
1ab0: 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   #..            
1ac0: 72 65 74 75 72 6e 20 32 2e 30 2e 35 30 37 32 37  return 2.0.50727
1ad0: 3b 20 23 20 54 4f 44 4f 3a 20 47 6f 6f 64 20 22  ; # TODO: Good "
1ae0: 66 61 6c 6c 62 61 63 6b 22 20 64 65 66 61 75 6c  fallback" defaul
1af0: 74 3f 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d  t?..          }.
1b00: 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  .        }..    
1b10: 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20    }..    }..... 
1b20: 20 20 20 70 72 6f 63 20 67 65 74 42 75 69 6c 64     proc getBuild
1b30: 59 65 61 72 73 20 7b 7d 20 7b 0d 0a 20 20 20 20  Years {} {..    
1b40: 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
1b50: 45 3a 20 53 65 65 20 69 66 20 74 68 65 20 6c 69  E: See if the li
1b60: 73 74 20 6f 66 20 74 65 73 74 20 79 65 61 72 73  st of test years
1b70: 20 68 61 73 20 62 65 65 6e 20 6f 76 65 72 72 69   has been overri
1b80: 64 64 65 6e 20 62 79 20 74 68 65 20 75 73 65 72  dden by the user
1b90: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
1ba0: 28 65 2e 67 2e 20 6f 6e 20 74 68 65 20 63 6f 6d  (e.g. on the com
1bb0: 6d 61 6e 64 20 6c 69 6e 65 29 2e 0d 0a 20 20 20  mand line)...   
1bc0: 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
1bd0: 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 74  [info exists ::t
1be0: 65 73 74 5f 79 65 61 72 73 5d 20 26 26 20 5b 6c  est_years] && [l
1bf0: 6c 65 6e 67 74 68 20 24 3a 3a 74 65 73 74 5f 79  length $::test_y
1c00: 65 61 72 73 5d 20 3e 20 30 7d 20 74 68 65 6e 20  ears] > 0} then 
1c10: 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
1c20: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 55 73        # NOTE: Us
1c30: 65 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  e the specified 
1c40: 6c 69 73 74 20 6f 66 20 74 65 73 74 20 79 65 61  list of test yea
1c50: 72 73 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  rs...        #..
1c60: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 24          return $
1c70: 3a 3a 74 65 73 74 5f 79 65 61 72 73 0d 0a 20 20  ::test_years..  
1c80: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
1c90: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
1ca0: 20 23 20 4e 4f 54 45 3a 20 55 73 65 20 74 68 65   # NOTE: Use the
1cb0: 20 64 65 66 61 75 6c 74 20 6c 69 73 74 20 6f 66   default list of
1cc0: 20 74 65 73 74 20 79 65 61 72 73 20 28 69 2e 65   test years (i.e
1cd0: 2e 20 61 6c 6c 29 2e 0d 0a 20 20 20 20 20 20 20  . all)...       
1ce0: 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75   #..        retu
1cf0: 72 6e 20 5b 6c 69 73 74 20 32 30 30 35 20 32 30  rn [list 2005 20
1d00: 30 38 20 32 30 31 30 20 32 30 31 32 20 32 30 31  08 2010 2012 201
1d10: 33 20 32 30 31 35 5d 0d 0a 20 20 20 20 20 20 7d  3 2015]..      }
1d20: 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
1d30: 70 72 6f 63 20 67 65 74 42 75 69 6c 64 4e 65 74  proc getBuildNet
1d40: 46 78 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 23  Fx {} {..      #
1d50: 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
1d60: 53 65 65 20 69 66 20 74 68 65 20 74 65 73 74 20  See if the test 
1d70: 2e 4e 45 54 20 46 72 61 6d 65 77 6f 72 6b 20 73  .NET Framework s
1d80: 65 74 74 69 6e 67 20 68 61 73 20 62 65 65 6e 20  etting has been 
1d90: 6f 76 65 72 72 69 64 64 65 6e 20 62 79 0d 0a 20  overridden by.. 
1da0: 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68 65       #       the
1db0: 20 75 73 65 72 20 28 65 2e 67 2e 20 6f 6e 20 74   user (e.g. on t
1dc0: 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 29  he command line)
1dd0: 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
1de0: 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73    if {[info exis
1df0: 74 73 20 3a 3a 74 65 73 74 5f 6e 65 74 5f 66 78  ts ::test_net_fx
1e00: 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20  ] && \..        
1e10: 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68    [string length
1e20: 20 24 3a 3a 74 65 73 74 5f 6e 65 74 5f 66 78 5d   $::test_net_fx]
1e30: 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20   > 0} then {..  
1e40: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
1e50: 20 23 20 4e 4f 54 45 3a 20 55 73 65 20 74 68 65   # NOTE: Use the
1e60: 20 73 70 65 63 69 66 69 65 64 20 74 65 73 74 20   specified test 
1e70: 2e 4e 45 54 20 46 72 61 6d 65 77 6f 72 6b 2e 0d  .NET Framework..
1e80: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
1e90: 20 20 20 20 72 65 74 75 72 6e 20 24 3a 3a 74 65      return $::te
1ea0: 73 74 5f 6e 65 74 5f 66 78 0d 0a 20 20 20 20 20  st_net_fx..     
1eb0: 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
1ec0: 20 20 20 73 65 74 20 79 65 61 72 20 5b 67 65 74     set year [get
1ed0: 42 75 69 6c 64 59 65 61 72 5d 0d 0a 20 20 20 20  BuildYear]..    
1ee0: 20 20 20 20 73 65 74 20 79 65 61 72 56 61 72 4e      set yearVarN
1ef0: 61 6d 65 20 5b 61 70 70 65 6e 64 41 72 67 73 20  ame [appendArgs 
1f00: 3a 3a 74 65 73 74 5f 6e 65 74 5f 66 78 5f 20 24  ::test_net_fx_ $
1f10: 79 65 61 72 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  year]....       
1f20: 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74   if {[info exist
1f30: 73 20 24 79 65 61 72 56 61 72 4e 61 6d 65 5d 20  s $yearVarName] 
1f40: 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  && \..          
1f50: 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68    [string length
1f60: 20 5b 73 65 74 20 24 79 65 61 72 56 61 72 4e 61   [set $yearVarNa
1f70: 6d 65 5d 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b  me]] > 0} then {
1f80: 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20  ..          #.. 
1f90: 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a           # NOTE:
1fa0: 20 55 73 65 20 74 68 65 20 73 70 65 63 69 66 69   Use the specifi
1fb0: 65 64 20 74 65 73 74 20 2e 4e 45 54 20 46 72 61  ed test .NET Fra
1fc0: 6d 65 77 6f 72 6b 2c 20 62 61 73 65 64 20 6f 6e  mework, based on
1fd0: 20 74 68 65 20 62 75 69 6c 64 0d 0a 20 20 20 20   the build..    
1fe0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 79 65        #       ye
1ff0: 61 72 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23  ar...          #
2000: 0d 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ..          retu
2010: 72 6e 20 5b 73 65 74 20 24 79 65 61 72 56 61 72  rn [set $yearVar
2020: 4e 61 6d 65 5d 0d 0a 20 20 20 20 20 20 20 20 7d  Name]..        }
2030: 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
2040: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
2050: 23 20 4e 4f 54 45 3a 20 46 61 6c 6c 62 61 63 6b  # NOTE: Fallback
2060: 20 74 6f 20 74 68 65 20 22 77 65 6c 6c 20 6b 6e   to the "well kn
2070: 6f 77 6e 22 20 2e 4e 45 54 20 46 72 61 6d 65 77  own" .NET Framew
2080: 6f 72 6b 20 76 65 72 73 69 6f 6e 20 74 68 61 74  ork version that
2090: 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 20 20  ..          #   
20a0: 20 20 20 20 69 73 20 6d 6f 73 74 20 63 6c 6f 73      is most clos
20b0: 65 6c 79 20 61 73 73 6f 63 69 61 74 65 64 20 77  ely associated w
20c0: 69 74 68 20 61 20 70 61 72 74 69 63 75 6c 61 72  ith a particular
20d0: 20 76 65 72 73 69 6f 6e 20 6f 66 0d 0a 20 20 20   version of..   
20e0: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 56         #       V
20f0: 69 73 75 61 6c 20 53 74 75 64 69 6f 2e 0d 0a 20  isual Studio... 
2100: 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
2110: 20 20 20 20 20 20 73 77 69 74 63 68 20 2d 65 78        switch -ex
2120: 61 63 74 20 2d 2d 20 24 79 65 61 72 20 7b 0d 0a  act -- $year {..
2130: 20 20 20 20 20 20 20 20 20 20 20 20 32 30 30 35              2005
2140: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
2150: 20 20 72 65 74 75 72 6e 20 6e 65 74 46 78 32 30    return netFx20
2160: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
2170: 0a 20 20 20 20 20 20 20 20 20 20 20 20 32 30 30  .            200
2180: 38 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  8 {..           
2190: 20 20 20 72 65 74 75 72 6e 20 6e 65 74 46 78 33     return netFx3
21a0: 35 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  5..            }
21b0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 32 30  ..            20
21c0: 31 30 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  10 {..          
21d0: 20 20 20 20 72 65 74 75 72 6e 20 6e 65 74 46 78      return netFx
21e0: 34 30 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  40..            
21f0: 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 32  }..            2
2200: 30 31 32 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  012 {..         
2210: 20 20 20 20 20 72 65 74 75 72 6e 20 6e 65 74 46       return netF
2220: 78 34 35 0d 0a 20 20 20 20 20 20 20 20 20 20 20  x45..           
2230: 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   }..            
2240: 32 30 31 33 20 7b 0d 0a 20 20 20 20 20 20 20 20  2013 {..        
2250: 20 20 20 20 20 20 72 65 74 75 72 6e 20 6e 65 74        return net
2260: 46 78 34 35 31 3b 20 23 20 54 4f 44 4f 3a 20 4f  Fx451; # TODO: O
2270: 72 20 22 6e 65 74 46 78 34 35 32 22 3f 0d 0a 20  r "netFx452"?.. 
2280: 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
2290: 20 20 20 20 20 20 20 20 20 20 32 30 31 35 20 7b            2015 {
22a0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
22b0: 72 65 74 75 72 6e 20 6e 65 74 46 78 34 36 3b 20  return netFx46; 
22c0: 23 20 54 4f 44 4f 3a 20 4f 72 20 22 6e 65 74 46  # TODO: Or "netF
22d0: 78 34 36 31 22 3f 0d 0a 20 20 20 20 20 20 20 20  x461"?..        
22e0: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
22f0: 20 20 20 64 65 66 61 75 6c 74 20 7b 0d 0a 20 20     default {..  
2300: 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
2310: 72 6e 20 6e 65 74 46 78 33 35 3b 20 23 20 54 4f  rn netFx35; # TO
2320: 44 4f 3a 20 47 6f 6f 64 20 22 66 61 6c 6c 62 61  DO: Good "fallba
2330: 63 6b 22 20 64 65 66 61 75 6c 74 3f 0d 0a 20 20  ck" default?..  
2340: 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
2350: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
2360: 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20    }..      }..  
2370: 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 23 0d 0a 20    }.....    #.. 
2380: 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 69 73 20     # NOTE: This 
2390: 70 72 6f 63 65 64 75 72 65 20 73 68 6f 75 6c 64  procedure should
23a0: 20 72 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f   return non-zero
23b0: 20 69 66 20 74 68 65 20 63 6f 6e 66 69 67 75 72   if the configur
23c0: 65 64 20 74 65 73 74 0d 0a 20 20 20 20 23 20 20  ed test..    #  
23d0: 20 20 20 20 20 70 6c 61 74 66 6f 72 6d 20 69 73       platform is
23e0: 20 6d 6f 73 74 20 6c 69 6b 65 6c 79 20 74 68 65   most likely the
23f0: 20 64 65 66 61 75 6c 74 20 66 6f 72 20 74 68 69   default for thi
2400: 73 20 6d 61 63 68 69 6e 65 2e 0d 0a 20 20 20 20  s machine...    
2410: 23 0d 0a 20 20 20 20 70 72 6f 63 20 69 73 44 65  #..    proc isDe
2420: 66 61 75 6c 74 42 75 69 6c 64 50 6c 61 74 66 6f  faultBuildPlatfo
2430: 72 6d 20 7b 20 7b 76 65 72 62 6f 73 65 20 66 61  rm { {verbose fa
2440: 6c 73 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20  lse} } {..      
2450: 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
2460: 20 52 75 6e 6e 69 6e 67 20 6f 6e 20 57 6f 57 36   Running on WoW6
2470: 34 20 69 73 20 6e 65 76 65 72 20 74 68 65 20 64  4 is never the d
2480: 65 66 61 75 6c 74 20 70 6c 61 74 66 6f 72 6d 2e  efault platform.
2490: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
24a0: 20 69 66 20 7b 5b 69 73 52 75 6e 6e 69 6e 67 57   if {[isRunningW
24b0: 6f 57 36 34 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  oW64]} then {.. 
24c0: 20 20 20 20 20 20 20 69 66 20 7b 24 76 65 72 62         if {$verb
24d0: 6f 73 65 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  ose} then {..   
24e0: 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
24f0: 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5c 0d 0a  test_channel \..
2500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d                "-
2510: 2d 2d 2d 20 64 65 74 65 63 74 65 64 20 6e 6f 6e  --- detected non
2520: 2d 64 65 66 61 75 6c 74 20 70 6c 61 74 66 6f 72  -default platfor
2530: 6d 20 28 57 6f 57 36 34 29 5c 6e 22 0d 0a 20 20  m (WoW64)\n"..  
2540: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
2550: 20 72 65 74 75 72 6e 20 66 61 6c 73 65 0d 0a 20   return false.. 
2560: 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
2570: 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
2580: 20 54 68 69 73 20 68 61 73 20 61 20 67 6f 6f 64   This has a good
2590: 20 63 68 61 6e 63 65 20 6f 66 20 62 65 69 6e 67   chance of being
25a0: 20 74 68 65 20 64 65 66 61 75 6c 74 20 70 6c 61   the default pla
25b0: 74 66 6f 72 6d 2e 0d 0a 20 20 20 20 20 20 23 0d  tform...      #.
25c0: 0a 20 20 20 20 20 20 69 66 20 7b 24 76 65 72 62  .      if {$verb
25d0: 6f 73 65 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  ose} then {..   
25e0: 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
25f0: 73 74 5f 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d  st_channel "----
2600: 20 64 65 74 65 63 74 65 64 20 64 65 66 61 75 6c   detected defaul
2610: 74 20 70 6c 61 74 66 6f 72 6d 5c 6e 22 0d 0a 20  t platform\n".. 
2620: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 72 65       }..      re
2630: 74 75 72 6e 20 74 72 75 65 0d 0a 20 20 20 20 7d  turn true..    }
2640: 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65  .....    proc ge
2650: 74 42 75 69 6c 64 50 6c 61 74 66 6f 72 6d 20 7b  tBuildPlatform {
2660: 20 6e 61 74 69 76 65 20 7d 20 7b 0d 0a 20 20 20   native } {..   
2670: 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69     if {[info exi
2680: 73 74 73 20 3a 3a 74 65 73 74 5f 70 6c 61 74 66  sts ::test_platf
2690: 6f 72 6d 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20  orm] && \..     
26a0: 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e       [string len
26b0: 67 74 68 20 24 3a 3a 74 65 73 74 5f 70 6c 61 74  gth $::test_plat
26c0: 66 6f 72 6d 5d 20 3e 20 30 7d 20 74 68 65 6e 20  form] > 0} then 
26d0: 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
26e0: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 55 73        # NOTE: Us
26f0: 65 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  e the specified 
2700: 74 65 73 74 20 70 6c 61 74 66 6f 72 6d 2e 20 20  test platform.  
2710: 49 66 20 74 68 69 73 20 76 61 72 69 61 62 6c 65  If this variable
2720: 20 69 73 20 6e 6f 74 20 73 65 74 2c 0d 0a 20 20   is not set,..  
2730: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68        #       th
2740: 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20  e default value 
2750: 77 69 6c 6c 20 62 65 20 62 61 73 65 64 20 6f 6e  will be based on
2760: 20 74 68 65 20 6d 61 63 68 69 6e 65 20 61 72 63   the machine arc
2770: 68 69 74 65 63 74 75 72 65 2e 0d 0a 20 20 20 20  hitecture...    
2780: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72      #..        r
2790: 65 74 75 72 6e 20 5b 65 78 70 72 20 7b 24 6e 61  eturn [expr {$na
27a0: 74 69 76 65 20 3f 20 24 3a 3a 74 65 73 74 5f 70  tive ? $::test_p
27b0: 6c 61 74 66 6f 72 6d 20 3a 20 22 22 7d 5d 0d 0a  latform : ""}]..
27c0: 20 20 20 20 20 20 7d 20 65 6c 73 65 69 66 20 7b        } elseif {
27d0: 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 74  [info exists ::t
27e0: 65 73 74 5f 6d 61 63 68 69 6e 65 5d 20 26 26 20  est_machine] && 
27f0: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 73 74  \..          [st
2800: 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a 74  ring length $::t
2810: 65 73 74 5f 6d 61 63 68 69 6e 65 5d 20 3e 20 30  est_machine] > 0
2820: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
2830: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
2840: 4f 54 45 3a 20 46 6f 72 20 6e 61 74 69 76 65 20  OTE: For native 
2850: 62 75 69 6c 64 73 2c 20 72 65 74 75 72 6e 20 74  builds, return t
2860: 68 65 20 70 6c 61 74 66 6f 72 6d 20 6e 61 6d 65  he platform name
2870: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74   corresponding t
2880: 6f 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  o..        #    
2890: 20 20 20 74 68 65 20 74 65 73 74 20 6d 61 63 68     the test mach
28a0: 69 6e 65 20 61 72 63 68 69 74 65 63 74 75 72 65  ine architecture
28b0: 3b 20 6f 74 68 65 72 77 69 73 65 2c 20 72 65 74  ; otherwise, ret
28c0: 75 72 6e 20 61 6e 20 65 6d 70 74 79 0d 0a 20 20  urn an empty..  
28d0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 73 74        #       st
28e0: 72 69 6e 67 2e 0d 0a 20 20 20 20 20 20 20 20 23  ring...        #
28f0: 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ..        return
2900: 20 5b 65 78 70 72 20 7b 0d 0a 20 20 20 20 20 20   [expr {..      
2910: 20 20 20 20 24 6e 61 74 69 76 65 20 3f 20 5b 6d      $native ? [m
2920: 61 63 68 69 6e 65 54 6f 50 6c 61 74 66 6f 72 6d  achineToPlatform
2930: 20 24 3a 3a 74 65 73 74 5f 6d 61 63 68 69 6e 65   $::test_machine
2940: 5d 20 3a 20 22 22 0d 0a 20 20 20 20 20 20 20 20  ] : ""..        
2950: 7d 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65  }]..      } else
2960: 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73  if {[info exists
2970: 20 3a 3a 74 63 6c 5f 70 6c 61 74 66 6f 72 6d 28   ::tcl_platform(
2980: 6d 61 63 68 69 6e 65 29 5d 7d 20 74 68 65 6e 20  machine)]} then 
2990: 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
29a0: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 46 6f        # NOTE: Fo
29b0: 72 20 6e 61 74 69 76 65 20 62 75 69 6c 64 73 2c  r native builds,
29c0: 20 72 65 74 75 72 6e 20 74 68 65 20 70 6c 61 74   return the plat
29d0: 66 6f 72 6d 20 6e 61 6d 65 20 63 6f 72 72 65 73  form name corres
29e0: 70 6f 6e 64 69 6e 67 20 74 6f 0d 0a 20 20 20 20  ponding to..    
29f0: 20 20 20 20 23 20 20 20 20 20 20 20 74 68 65 20      #       the 
2a00: 6d 61 63 68 69 6e 65 20 61 72 63 68 69 74 65 63  machine architec
2a10: 74 75 72 65 3b 20 6f 74 68 65 72 77 69 73 65 2c  ture; otherwise,
2a20: 20 72 65 74 75 72 6e 20 61 6e 20 65 6d 70 74 79   return an empty
2a30: 20 73 74 72 69 6e 67 2e 0d 0a 20 20 20 20 20 20   string...      
2a40: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74    #..        ret
2a50: 75 72 6e 20 5b 65 78 70 72 20 7b 0d 0a 20 20 20  urn [expr {..   
2a60: 20 20 20 20 20 20 20 24 6e 61 74 69 76 65 20 3f         $native ?
2a70: 20 5b 6d 61 63 68 69 6e 65 54 6f 50 6c 61 74 66   [machineToPlatf
2a80: 6f 72 6d 20 24 3a 3a 74 63 6c 5f 70 6c 61 74 66  orm $::tcl_platf
2a90: 6f 72 6d 28 6d 61 63 68 69 6e 65 29 5d 20 3a 20  orm(machine)] : 
2aa0: 22 22 0d 0a 20 20 20 20 20 20 20 20 7d 5d 0d 0a  ""..        }]..
2ab0: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
2ac0: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
2ad0: 20 20 20 23 20 4e 4f 54 45 3a 20 4e 6f 20 6d 61     # NOTE: No ma
2ae0: 63 68 69 6e 65 20 61 72 63 68 69 74 65 63 74 75  chine architectu
2af0: 72 65 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2c  re is available,
2b00: 20 72 65 74 75 72 6e 20 61 6e 20 65 6d 70 74 79   return an empty
2b10: 20 73 74 72 69 6e 67 2e 0d 0a 20 20 20 20 20 20   string...      
2b20: 20 20 23 20 20 20 20 20 20 20 49 74 20 69 73 20    #       It is 
2b30: 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 72 65 74  important to ret
2b40: 75 72 6e 20 61 6e 20 65 6d 70 74 79 20 73 74 72  urn an empty str
2b50: 69 6e 67 20 68 65 72 65 20 62 65 63 61 75 73 65  ing here because
2b60: 20 74 68 65 0d 0a 20 20 20 20 20 20 20 20 23 20   the..        # 
2b70: 20 20 20 20 20 20 72 65 73 75 6c 74 20 6f 66 20        result of 
2b80: 74 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 6d  this procedure m
2b90: 61 79 20 62 65 20 75 73 65 64 20 77 69 74 68 20  ay be used with 
2ba0: 5b 66 69 6c 65 20 6a 6f 69 6e 5d 2e 0d 0a 20 20  [file join]...  
2bb0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
2bc0: 20 72 65 74 75 72 6e 20 22 22 0d 0a 20 20 20 20   return ""..    
2bd0: 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20    }..    }..... 
2be0: 20 20 20 70 72 6f 63 20 67 65 74 42 75 69 6c 64     proc getBuild
2bf0: 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 7b 7d  Configuration {}
2c00: 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20   {..      #..   
2c10: 20 20 20 23 20 4e 4f 54 45 3a 20 53 65 65 20 69     # NOTE: See i
2c20: 66 20 74 68 65 20 22 63 6f 6e 66 69 67 75 72 61  f the "configura
2c30: 74 69 6f 6e 22 20 73 65 74 74 69 6e 67 20 68 61  tion" setting ha
2c40: 73 20 62 65 65 6e 20 6f 76 65 72 72 69 64 64 65  s been overridde
2c50: 6e 20 62 79 20 74 68 65 0d 0a 20 20 20 20 20 20  n by the..      
2c60: 23 20 20 20 20 20 20 20 75 73 65 72 20 28 65 2e  #       user (e.
2c70: 67 2e 20 6f 6e 20 74 68 65 20 63 6f 6d 6d 61 6e  g. on the comman
2c80: 64 20 6c 69 6e 65 29 2e 20 20 54 68 69 73 20 68  d line).  This h
2c90: 65 6c 70 73 20 63 6f 6e 74 72 6f 6c 20 65 78 61  elps control exa
2ca0: 63 74 6c 79 0d 0a 20 20 20 20 20 20 23 20 20 20  ctly..      #   
2cb0: 20 20 20 20 77 68 69 63 68 20 73 65 74 20 6f 66      which set of
2cc0: 20 62 69 6e 61 72 69 65 73 20 77 65 20 61 72 65   binaries we are
2cd0: 20 74 65 73 74 69 6e 67 20 28 69 2e 65 2e 20 74   testing (i.e. t
2ce0: 68 6f 73 65 20 62 75 69 6c 74 20 69 6e 20 74 68  hose built in th
2cf0: 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  e..      #      
2d00: 20 22 44 65 62 75 67 22 20 6f 72 20 22 52 65 6c   "Debug" or "Rel
2d10: 65 61 73 65 22 20 62 75 69 6c 64 20 63 6f 6e 66  ease" build conf
2d20: 69 67 75 72 61 74 69 6f 6e 73 29 2e 20 20 54 6f  igurations).  To
2d30: 20 6f 76 65 72 72 69 64 65 20 74 68 69 73 0d 0a   override this..
2d40: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 76 61        #       va
2d50: 6c 75 65 20 76 69 61 20 74 68 65 20 63 6f 6d 6d  lue via the comm
2d60: 61 6e 64 20 6c 69 6e 65 2c 20 65 6e 74 65 72 20  and line, enter 
2d70: 61 20 63 6f 6d 6d 61 6e 64 20 73 69 6d 69 6c 61  a command simila
2d80: 72 20 74 6f 20 6f 6e 65 20 6f 66 0d 0a 20 20 20  r to one of..   
2d90: 20 20 20 23 20 20 20 20 20 20 20 74 68 65 20 66     #       the f
2da0: 6f 6c 6c 6f 77 69 6e 67 20 28 61 6c 6c 20 6f 6e  ollowing (all on
2db0: 20 6f 6e 65 20 6c 69 6e 65 29 3a 0d 0a 20 20 20   one line):..   
2dc0: 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 20 20     #..      #   
2dd0: 20 20 20 20 45 61 67 6c 65 53 68 65 6c 6c 2e 65      EagleShell.e
2de0: 78 65 20 2d 61 6e 79 49 6e 69 74 69 61 6c 69 7a  xe -anyInitializ
2df0: 65 20 22 73 65 74 20 74 65 73 74 5f 63 6f 6e 66  e "set test_conf
2e00: 69 67 75 72 61 74 69 6f 6e 20 44 65 62 75 67 22  iguration Debug"
2e10: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
2e20: 20 20 2d 66 69 6c 65 20 2e 5c 70 61 74 68 5c 74    -file .\path\t
2e30: 6f 5c 61 6c 6c 2e 65 61 67 6c 65 0d 0a 20 20 20  o\all.eagle..   
2e40: 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 20 20     #..      #   
2e50: 20 20 20 20 45 61 67 6c 65 53 68 65 6c 6c 2e 65      EagleShell.e
2e60: 78 65 20 2d 61 6e 79 49 6e 69 74 69 61 6c 69 7a  xe -anyInitializ
2e70: 65 20 22 73 65 74 20 74 65 73 74 5f 63 6f 6e 66  e "set test_conf
2e80: 69 67 75 72 61 74 69 6f 6e 20 52 65 6c 65 61 73  iguration Releas
2e90: 65 22 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  e"..      #     
2ea0: 20 20 20 20 2d 66 69 6c 65 20 2e 5c 70 61 74 68      -file .\path
2eb0: 5c 74 6f 5c 61 6c 6c 2e 65 61 67 6c 65 0d 0a 20  \to\all.eagle.. 
2ec0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
2ed0: 20 20 20 20 20 20 45 61 67 6c 65 53 68 65 6c 6c        EagleShell
2ee0: 2e 65 78 65 20 2d 66 69 6c 65 20 2e 5c 70 61 74  .exe -file .\pat
2ef0: 68 5c 74 6f 5c 61 6c 6c 2e 65 61 67 6c 65 20 2d  h\to\all.eagle -
2f00: 70 72 65 54 65 73 74 0d 0a 20 20 20 20 20 20 23  preTest..      #
2f10: 20 20 20 20 20 20 20 20 20 22 75 6e 73 65 74 20           "unset 
2f20: 2d 6e 6f 63 6f 6d 70 6c 61 69 6e 20 74 65 73 74  -nocomplain test
2f30: 5f 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 22 0d  _configuration".
2f40: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
2f50: 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73  if {[info exists
2f60: 20 3a 3a 74 65 73 74 5f 63 6f 6e 66 69 67 75 72   ::test_configur
2f70: 61 74 69 6f 6e 5d 20 26 26 20 5c 0d 0a 20 20 20  ation] && \..   
2f80: 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c         [string l
2f90: 65 6e 67 74 68 20 24 3a 3a 74 65 73 74 5f 63 6f  ength $::test_co
2fa0: 6e 66 69 67 75 72 61 74 69 6f 6e 5d 20 3e 20 30  nfiguration] > 0
2fb0: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
2fc0: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
2fd0: 4f 54 45 3a 20 55 73 65 20 74 68 65 20 73 70 65  OTE: Use the spe
2fe0: 63 69 66 69 65 64 20 74 65 73 74 20 63 6f 6e 66  cified test conf
2ff0: 69 67 75 72 61 74 69 6f 6e 2e 20 20 54 68 65 20  iguration.  The 
3000: 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20 75 73  default value us
3010: 65 64 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  ed..        #   
3020: 20 20 20 20 66 6f 72 20 74 68 69 73 20 76 61 72      for this var
3030: 69 61 62 6c 65 20 69 73 20 74 79 70 69 63 61 6c  iable is typical
3040: 6c 79 20 22 52 65 6c 65 61 73 65 22 2c 20 61 73  ly "Release", as
3050: 20 73 65 74 20 62 79 20 74 68 65 20 74 65 73 74   set by the test
3060: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
3070: 20 20 73 75 69 74 65 20 69 74 73 65 6c 66 2e 0d    suite itself..
3080: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
3090: 20 20 20 20 72 65 74 75 72 6e 20 24 3a 3a 74 65      return $::te
30a0: 73 74 5f 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  st_configuration
30b0: 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b  ..      } else {
30c0: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
30d0: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4e 6f 72       # NOTE: Nor
30e0: 6d 61 6c 6c 79 2c 20 77 65 20 77 69 6c 6c 20 6e  mally, we will n
30f0: 65 76 65 72 20 68 69 74 20 74 68 69 73 20 63 61  ever hit this ca
3100: 73 65 20 62 65 63 61 75 73 65 20 74 68 65 20 76  se because the v
3110: 61 6c 75 65 20 6f 66 20 74 68 65 0d 0a 20 20 20  alue of the..   
3120: 20 20 20 20 20 23 20 20 20 20 20 20 20 74 65 73       #       tes
3130: 74 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  t configuration 
3140: 76 61 72 69 61 62 6c 65 20 69 73 20 61 6c 77 61  variable is alwa
3150: 79 73 20 73 65 74 20 62 79 20 74 68 65 20 74 65  ys set by the te
3160: 73 74 20 73 75 69 74 65 0d 0a 20 20 20 20 20 20  st suite..      
3170: 20 20 23 20 20 20 20 20 20 20 69 74 73 65 6c 66    #       itself
3180: 3b 20 68 6f 77 65 76 65 72 2c 20 69 74 20 63 61  ; however, it ca
3190: 6e 20 62 65 20 6f 76 65 72 72 69 64 64 65 6e 20  n be overridden 
31a0: 75 73 69 6e 67 20 74 68 65 20 75 6e 73 65 74 20  using the unset 
31b0: 63 6f 6d 6d 61 6e 64 0d 0a 20 20 20 20 20 20 20  command..       
31c0: 20 23 20 20 20 20 20 20 20 66 72 6f 6d 20 74 68   #       from th
31d0: 65 20 2d 70 72 65 54 65 73 74 20 6f 70 74 69 6f  e -preTest optio
31e0: 6e 20 74 6f 20 74 68 65 20 74 65 73 74 20 73 75  n to the test su
31f0: 69 74 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  ite...        #.
3200: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
3210: 24 3a 3a 65 61 67 6c 65 5f 70 6c 61 74 66 6f 72  $::eagle_platfor
3220: 6d 28 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 29  m(configuration)
3230: 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d  ..      }..    }
3240: 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65  .....    proc ge
3250: 74 42 75 69 6c 64 43 6f 6e 66 69 67 75 72 61 74  tBuildConfigurat
3260: 69 6f 6e 73 20 7b 7d 20 7b 0d 0a 20 20 20 20 20  ions {} {..     
3270: 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
3280: 3a 20 53 65 65 20 69 66 20 74 68 65 20 6c 69 73  : See if the lis
3290: 74 20 6f 66 20 74 65 73 74 20 63 6f 6e 66 69 67  t of test config
32a0: 75 72 61 74 69 6f 6e 73 20 68 61 73 20 62 65 65  urations has bee
32b0: 6e 20 6f 76 65 72 72 69 64 64 65 6e 20 62 79 0d  n overridden by.
32c0: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74  .      #       t
32d0: 68 65 20 75 73 65 72 20 28 65 2e 67 2e 20 6f 6e  he user (e.g. on
32e0: 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e   the command lin
32f0: 65 29 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  e)...      #..  
3300: 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78      if {[info ex
3310: 69 73 74 73 20 3a 3a 74 65 73 74 5f 63 6f 6e 66  ists ::test_conf
3320: 69 67 75 72 61 74 69 6f 6e 73 5d 20 26 26 20 5c  igurations] && \
3330: 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 6c 6c 65  ..          [lle
3340: 6e 67 74 68 20 24 3a 3a 74 65 73 74 5f 63 6f 6e  ngth $::test_con
3350: 66 69 67 75 72 61 74 69 6f 6e 73 5d 20 3e 20 30  figurations] > 0
3360: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
3370: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
3380: 4f 54 45 3a 20 55 73 65 20 74 68 65 20 73 70 65  OTE: Use the spe
3390: 63 69 66 69 65 64 20 6c 69 73 74 20 6f 66 20 74  cified list of t
33a0: 65 73 74 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  est configuratio
33b0: 6e 73 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  ns...        #..
33c0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 24          return $
33d0: 3a 3a 74 65 73 74 5f 63 6f 6e 66 69 67 75 72 61  ::test_configura
33e0: 74 69 6f 6e 73 0d 0a 20 20 20 20 20 20 7d 20 65  tions..      } e
33f0: 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  lse {..        #
3400: 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
3410: 3a 20 55 73 65 20 74 68 65 20 64 65 66 61 75 6c  : Use the defaul
3420: 74 20 6c 69 73 74 20 6f 66 20 74 65 73 74 20 63  t list of test c
3430: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 73 2e 0d 0a  onfigurations...
3440: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
3450: 20 20 20 72 65 74 75 72 6e 20 5b 6c 69 73 74 20     return [list 
3460: 44 65 62 75 67 20 52 65 6c 65 61 73 65 5d 0d 0a  Debug Release]..
3470: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a        }..    }..
3480: 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74 42  ...    proc getB
3490: 75 69 6c 64 42 61 73 65 44 69 72 65 63 74 6f 72  uildBaseDirector
34a0: 79 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d  y {} {..      #.
34b0: 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 46  .      # NOTE: F
34c0: 69 67 75 72 65 20 6f 75 74 20 74 68 65 20 62 61  igure out the ba
34d0: 73 65 20 64 69 72 65 63 74 6f 72 79 20 77 68 65  se directory whe
34e0: 72 65 20 61 6c 6c 20 74 68 65 20 62 75 69 6c 64  re all the build
34f0: 73 20 73 68 6f 75 6c 64 20 62 65 0d 0a 20 20 20  s should be..   
3500: 20 20 20 23 20 20 20 20 20 20 20 6c 6f 63 61 74     #       locat
3510: 65 64 2e 20 20 54 68 69 73 20 77 69 6c 6c 20 62  ed.  This will b
3520: 65 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20  e the directory 
3530: 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68  that contains th
3540: 65 20 61 63 74 75 61 6c 0d 0a 20 20 20 20 20 20  e actual..      
3550: 23 20 20 20 20 20 20 20 62 75 69 6c 64 20 6f 75  #       build ou
3560: 74 70 75 74 20 64 69 72 65 63 74 6f 72 79 20 28  tput directory (
3570: 65 2e 67 2e 20 70 61 72 65 6e 74 20 6f 66 20 22  e.g. parent of "
3580: 62 69 6e 22 29 2e 0d 0a 20 20 20 20 20 20 23 0d  bin")...      #.
3590: 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f  .      if {[info
35a0: 20 65 78 69 73 74 73 20 3a 3a 62 75 69 6c 64 5f   exists ::build_
35b0: 62 61 73 65 5f 64 69 72 65 63 74 6f 72 79 5d 20  base_directory] 
35c0: 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  && \..          
35d0: 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
35e0: 3a 3a 62 75 69 6c 64 5f 62 61 73 65 5f 64 69 72  ::build_base_dir
35f0: 65 63 74 6f 72 79 5d 20 3e 20 30 7d 20 74 68 65  ectory] > 0} the
3600: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  n {..        #..
3610: 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
3620: 54 68 65 20 6c 6f 63 61 74 69 6f 6e 20 6f 66 20  The location of 
3630: 74 68 65 20 62 75 69 6c 64 20 62 61 73 65 20 64  the build base d
3640: 69 72 65 63 74 6f 72 79 20 68 61 73 20 62 65 65  irectory has bee
3650: 6e 20 6f 76 65 72 72 69 64 64 65 6e 3b 0d 0a 20  n overridden;.. 
3660: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74         #       t
3670: 68 65 72 65 66 6f 72 65 2c 20 75 73 65 20 69 74  herefore, use it
3680: 20 76 65 72 62 61 74 69 6d 2e 0d 0a 20 20 20 20   verbatim...    
3690: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72      #..        r
36a0: 65 74 75 72 6e 20 24 3a 3a 62 75 69 6c 64 5f 62  eturn $::build_b
36b0: 61 73 65 5f 64 69 72 65 63 74 6f 72 79 0d 0a 20  ase_directory.. 
36c0: 20 20 20 20 20 7d 20 65 6c 73 65 69 66 20 7b 5b       } elseif {[
36d0: 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 63 6f  info exists ::co
36e0: 6d 6d 6f 6e 5f 64 69 72 65 63 74 6f 72 79 5d 20  mmon_directory] 
36f0: 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  && \..          
3700: 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
3710: 3a 3a 63 6f 6d 6d 6f 6e 5f 64 69 72 65 63 74 6f  ::common_directo
3720: 72 79 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d  ry] > 0} then {.
3730: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
3740: 20 20 20 20 23 20 4e 4f 54 45 3a 20 4e 65 78 74      # NOTE: Next
3750: 2c 20 66 61 6c 6c 62 61 63 6b 20 74 6f 20 74 68  , fallback to th
3760: 65 20 67 72 61 6e 64 70 61 72 65 6e 74 20 64 69  e grandparent di
3770: 72 65 63 74 6f 72 79 20 6f 66 20 74 68 65 20 6f  rectory of the o
3780: 6e 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  ne..        #   
3790: 20 20 20 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74      containing t
37a0: 68 69 73 20 66 69 6c 65 20 28 69 2e 65 2e 20 22  his file (i.e. "
37b0: 63 6f 6d 6d 6f 6e 2e 65 61 67 6c 65 22 29 2c 20  common.eagle"), 
37c0: 69 66 20 61 76 61 69 6c 61 62 6c 65 2e 0d 0a 20  if available... 
37d0: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
37e0: 20 20 72 65 74 75 72 6e 20 5b 66 69 6c 65 20 64    return [file d
37f0: 69 72 6e 61 6d 65 20 5b 66 69 6c 65 20 64 69 72  irname [file dir
3800: 6e 61 6d 65 20 24 3a 3a 63 6f 6d 6d 6f 6e 5f 64  name $::common_d
3810: 69 72 65 63 74 6f 72 79 5d 5d 0d 0a 20 20 20 20  irectory]]..    
3820: 20 20 7d 20 65 6c 73 65 69 66 20 7b 5b 69 6e 66    } elseif {[inf
3830: 6f 20 65 78 69 73 74 73 20 3a 3a 70 61 74 68 5d  o exists ::path]
3840: 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20   && \..         
3850: 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20   [string length 
3860: 24 3a 3a 70 61 74 68 5d 20 3e 20 30 7d 20 74 68  $::path] > 0} th
3870: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d  en {..        #.
3880: 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
3890: 20 46 69 6e 61 6c 6c 79 2c 20 66 61 6c 6c 62 61   Finally, fallba
38a0: 63 6b 20 74 6f 20 74 68 65 20 70 61 72 65 6e 74  ck to the parent
38b0: 20 64 69 72 65 63 74 6f 72 79 20 6f 66 20 74 68   directory of th
38c0: 65 20 45 61 67 6c 65 54 65 73 74 0d 0a 20 20 20  e EagleTest..   
38d0: 20 20 20 20 20 23 20 20 20 20 20 20 20 70 61 74       #       pat
38e0: 68 2e 20 20 54 68 65 20 45 61 67 6c 65 54 65 73  h.  The EagleTes
38f0: 74 20 70 61 63 6b 61 67 65 20 67 75 61 72 61 6e  t package guaran
3900: 74 65 65 73 20 74 68 61 74 20 74 68 69 73 20 76  tees that this v
3910: 61 72 69 61 62 6c 65 0d 0a 20 20 20 20 20 20 20  ariable..       
3920: 20 23 20 20 20 20 20 20 20 77 69 6c 6c 20 62 65   #       will be
3930: 20 73 65 74 20 74 6f 20 74 68 65 20 64 69 72 65   set to the dire
3940: 63 74 6f 72 79 20 63 6f 6e 74 61 69 6e 69 6e 67  ctory containing
3950: 20 74 68 65 20 66 69 72 73 74 20 66 69 6c 65 20   the first file 
3960: 74 6f 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  to..        #   
3970: 20 20 20 20 65 78 65 63 75 74 65 20 74 68 65 20      execute the 
3980: 5b 72 75 6e 54 65 73 74 50 72 6f 6c 6f 67 75 65  [runTestPrologue
3990: 5d 20 73 63 72 69 70 74 20 6c 69 62 72 61 72 79  ] script library
39a0: 20 70 72 6f 63 65 64 75 72 65 2e 0d 0a 20 20 20   procedure...   
39b0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
39c0: 72 65 74 75 72 6e 20 5b 66 69 6c 65 20 64 69 72  return [file dir
39d0: 6e 61 6d 65 20 24 3a 3a 70 61 74 68 5d 0d 0a 20  name $::path].. 
39e0: 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
39f0: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
3a00: 20 20 23 20 4e 4f 54 45 3a 20 4e 6f 20 70 61 74    # NOTE: No pat
3a10: 68 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2c 20  h is available, 
3a20: 72 65 74 75 72 6e 20 61 6e 20 65 6d 70 74 79 20  return an empty 
3a30: 73 74 72 69 6e 67 2e 20 20 54 68 69 73 20 70 6f  string.  This po
3a40: 69 6e 74 0d 0a 20 20 20 20 20 20 20 20 23 20 20  int..        #  
3a50: 20 20 20 20 20 73 68 6f 75 6c 64 20 6e 6f 74 20       should not 
3a60: 62 65 20 72 65 61 63 68 65 64 2e 0d 0a 20 20 20  be reached...   
3a70: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
3a80: 72 65 74 75 72 6e 20 22 22 0d 0a 20 20 20 20 20  return ""..     
3a90: 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20   }..    }.....  
3aa0: 20 20 70 72 6f 63 20 67 65 74 53 51 4c 69 74 65    proc getSQLite
3ab0: 54 65 73 74 44 61 74 61 50 61 74 68 20 7b 7d 20  TestDataPath {} 
3ac0: 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  {..      #..    
3ad0: 20 20 23 20 4e 4f 54 45 3a 20 46 69 67 75 72 65    # NOTE: Figure
3ae0: 20 6f 75 74 20 74 68 65 20 64 69 72 65 63 74 6f   out the directo
3af0: 72 79 20 77 68 65 72 65 20 61 6c 6c 20 74 68 65  ry where all the
3b00: 20 74 65 73 74 20 64 61 74 61 20 66 69 6c 65 73   test data files
3b10: 20 73 68 6f 75 6c 64 0d 0a 20 20 20 20 20 20 23   should..      #
3b20: 20 20 20 20 20 20 20 62 65 20 6c 6f 63 61 74 65         be locate
3b30: 64 2e 20 20 54 68 69 73 20 73 68 6f 75 6c 64 20  d.  This should 
3b40: 62 65 20 74 68 65 20 22 64 61 74 61 22 20 64 69  be the "data" di
3b50: 72 65 63 74 6f 72 79 20 62 65 6e 65 61 74 68 20  rectory beneath 
3b60: 74 68 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20  the..      #    
3b70: 20 20 20 64 69 72 65 63 74 6f 72 79 20 63 6f 6e     directory con
3b80: 74 61 69 6e 69 6e 67 20 74 68 65 20 61 63 74 75  taining the actu
3b90: 61 6c 20 74 65 73 74 20 73 63 72 69 70 74 73 2e  al test scripts.
3ba0: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
3bb0: 20 72 65 74 75 72 6e 20 5b 66 69 6c 65 20 6a 6f   return [file jo
3bc0: 69 6e 20 24 3a 3a 70 61 74 68 20 64 61 74 61 5d  in $::path data]
3bd0: 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
3be0: 70 72 6f 63 20 69 73 52 75 6e 6e 69 6e 67 57 6f  proc isRunningWo
3bf0: 57 36 34 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20  W64 {} {..      
3c00: 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
3c10: 20 46 6f 72 20 6e 6f 77 2c 20 6a 75 73 74 20 75   For now, just u
3c20: 73 65 20 74 68 65 20 65 78 69 73 74 69 6e 67 20  se the existing 
3c30: 74 65 73 74 20 63 6f 6e 73 74 72 61 69 6e 74 20  test constraint 
3c40: 66 6f 72 20 64 65 74 65 63 74 69 6e 67 0d 0a 20  for detecting.. 
3c50: 20 20 20 20 20 23 20 20 20 20 20 20 20 61 20 57       #       a W
3c60: 6f 57 36 34 20 70 72 6f 63 65 73 73 2e 0d 0a 20  oW64 process... 
3c70: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 72 65       #..      re
3c80: 74 75 72 6e 20 5b 68 61 76 65 43 6f 6e 73 74 72  turn [haveConstr
3c90: 61 69 6e 74 20 77 6f 77 36 34 5d 0d 0a 20 20 20  aint wow64]..   
3ca0: 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
3cb0: 69 73 4d 69 78 65 64 4d 6f 64 65 41 73 73 65 6d  isMixedModeAssem
3cc0: 62 6c 79 20 7b 20 66 69 6c 65 4e 61 6d 65 20 7b  bly { fileName {
3cd0: 76 61 72 4e 61 6d 65 20 22 22 7d 20 7d 20 7b 0d  varName ""} } {.
3ce0: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
3cf0: 23 20 4e 4f 54 45 3a 20 46 69 72 73 74 2c 20 6d  # NOTE: First, m
3d00: 61 6b 65 20 73 75 72 65 20 74 68 65 20 74 65 73  ake sure the tes
3d10: 74 20 73 75 69 74 65 20 69 6e 66 72 61 73 74 72  t suite infrastr
3d20: 75 63 74 75 72 65 20 69 73 20 61 6c 6c 6f 77 65  ucture is allowe
3d30: 64 20 74 6f 0d 0a 20 20 20 20 20 20 23 20 20 20  d to..      #   
3d40: 20 20 20 20 75 73 65 20 74 68 65 20 5b 65 78 65      use the [exe
3d50: 63 5d 20 63 6f 6d 6d 61 6e 64 2e 0d 0a 20 20 20  c] command...   
3d60: 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
3d70: 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  ![info exists ::
3d80: 6e 6f 28 65 78 65 63 29 5d 20 26 26 20 21 5b 69  no(exec)] && ![i
3d90: 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28  nfo exists ::no(
3da0: 63 6f 72 46 6c 61 67 73 29 5d 7d 20 74 68 65 6e  corFlags)]} then
3db0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20   {..        #.. 
3dc0: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49         # NOTE: I
3dd0: 66 20 74 68 65 20 6c 6f 63 61 74 69 6f 6e 20 6f  f the location o
3de0: 66 20 43 6f 72 46 6c 61 67 73 20 69 73 20 70 72  f CorFlags is pr
3df0: 65 73 65 6e 74 20 69 6e 20 74 68 65 20 65 6e 76  esent in the env
3e00: 69 72 6f 6e 6d 65 6e 74 2c 0d 0a 20 20 20 20 20  ironment,..     
3e10: 20 20 20 23 20 20 20 20 20 20 20 75 73 65 20 69     #       use i
3e20: 74 3b 20 6f 74 68 65 72 77 69 73 65 20 61 73 73  t; otherwise ass
3e30: 75 6d 65 20 69 74 20 69 73 20 69 6e 20 74 68 65  ume it is in the
3e40: 20 50 41 54 48 2e 0d 0a 20 20 20 20 20 20 20 20   PATH...        
3e50: 23 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 63  #..        set c
3e60: 6f 72 46 6c 61 67 73 20 5b 65 78 70 72 20 7b 0d  orFlags [expr {.
3e70: 0a 20 20 20 20 20 20 20 20 20 20 5b 69 6e 66 6f  .          [info
3e80: 20 65 78 69 73 74 73 20 3a 3a 65 6e 76 28 43 6f   exists ::env(Co
3e90: 72 46 6c 61 67 73 29 5d 20 3f 20 24 3a 3a 65 6e  rFlags)] ? $::en
3ea0: 76 28 43 6f 72 46 6c 61 67 73 29 20 3a 20 22 43  v(CorFlags) : "C
3eb0: 6f 72 46 6c 61 67 73 22 0d 0a 20 20 20 20 20 20  orFlags"..      
3ec0: 20 20 7d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20    }]....        
3ed0: 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
3ee0: 45 3a 20 41 74 74 65 6d 70 74 20 74 6f 20 65 78  E: Attempt to ex
3ef0: 65 63 75 74 65 20 43 6f 72 46 6c 61 67 73 20 6f  ecute CorFlags o
3f00: 6e 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  n the specified 
3f10: 66 69 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20 23  file...        #
3f20: 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63  ..        if {[c
3f30: 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20  atch {..        
3f40: 20 20 65 78 65 63 20 2d 2d 20 24 63 6f 72 46 6c    exec -- $corFl
3f50: 61 67 73 20 5b 66 69 6c 65 20 6e 61 74 69 76 65  ags [file native
3f60: 6e 61 6d 65 20 24 66 69 6c 65 4e 61 6d 65 5d 0d  name $fileName].
3f70: 0a 20 20 20 20 20 20 20 20 7d 20 65 78 65 63 5d  .        } exec]
3f80: 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20   == 0} then {.. 
3f90: 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
3fa0: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 66        # NOTE: If
3fb0: 20 72 65 71 75 65 73 74 65 64 20 62 79 20 6f 75   requested by ou
3fc0: 72 20 63 61 6c 6c 65 72 2c 20 61 74 74 65 6d 70  r caller, attemp
3fd0: 74 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74  t to determine t
3fe0: 68 65 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20  he..          # 
3ff0: 20 20 20 20 20 20 70 6c 61 74 66 6f 72 6d 20 66        platform f
4000: 6f 72 20 74 68 65 20 73 70 65 63 69 66 69 65 64  or the specified
4010: 20 66 69 6c 65 20 61 73 20 77 65 6c 6c 2e 0d 0a   file as well...
4020: 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
4030: 20 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69         if {[stri
4040: 6e 67 20 6c 65 6e 67 74 68 20 24 76 61 72 4e 61  ng length $varNa
4050: 6d 65 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d  me] > 0} then {.
4060: 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a  .            #..
4070: 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f              # NO
4080: 54 45 3a 20 53 74 6f 72 65 20 74 68 65 20 70 6c  TE: Store the pl
4090: 61 74 66 6f 72 6d 20 69 6e 20 74 68 65 20 6e 61  atform in the na
40a0: 6d 65 64 20 76 61 72 69 61 62 6c 65 20 69 6e 20  med variable in 
40b0: 74 68 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20  the..           
40c0: 20 23 20 20 20 20 20 20 20 63 6f 6e 74 65 78 74   #       context
40d0: 20 6f 66 20 6f 75 72 20 63 61 6c 6c 65 72 2e 0d   of our caller..
40e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a  .            #..
40f0: 20 20 20 20 20 20 20 20 20 20 20 20 75 70 76 61              upva
4100: 72 20 31 20 24 76 61 72 4e 61 6d 65 20 70 6c 61  r 1 $varName pla
4110: 74 66 6f 72 6d 0d 0a 0d 0a 20 20 20 20 20 20 20  tform....       
4120: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
4130: 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 74 74 65      # NOTE: Atte
4140: 6d 70 74 20 74 6f 20 65 78 74 72 61 63 74 20 74  mpt to extract t
4150: 68 65 20 50 45 20 6c 69 6e 65 20 66 72 6f 6d 20  he PE line from 
4160: 74 68 65 20 63 61 70 74 75 72 65 64 0d 0a 20 20  the captured..  
4170: 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20            #     
4180: 20 20 6f 75 74 70 75 74 2e 20 20 49 66 20 74 68    output.  If th
4190: 69 73 20 76 61 6c 75 65 20 69 73 20 22 50 45 33  is value is "PE3
41a0: 32 22 20 6f 72 20 22 50 45 33 32 2b 22 2c 20 74  2" or "PE32+", t
41b0: 68 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  he..            
41c0: 23 20 20 20 20 20 20 20 61 73 73 65 6d 62 6c 79  #       assembly
41d0: 20 66 69 6c 65 20 69 73 20 33 32 2d 62 69 74 20   file is 32-bit 
41e0: 6f 72 20 36 34 2d 62 69 74 2c 20 72 65 73 70 65  or 64-bit, respe
41f0: 63 74 69 76 65 6c 79 3b 0d 0a 20 20 20 20 20 20  ctively;..      
4200: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 6f 74        #       ot
4210: 68 65 72 77 69 73 65 2c 20 69 74 73 20 74 79 70  herwise, its typ
4220: 65 20 69 73 20 75 6e 6b 6e 6f 77 6e 2e 0d 0a 20  e is unknown... 
4230: 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
4240: 20 20 20 20 20 20 20 20 20 20 73 65 74 20 70 61            set pa
4250: 74 74 65 72 6e 20 7b 5e 50 45 20 20 20 20 20 20  ttern {^PE      
4260: 20 20 3a 20 28 50 45 33 32 7c 50 45 33 32 5c 2b    : (PE32|PE32\+
4270: 29 5c 73 2b 24 7d 0d 0a 0d 0a 20 20 20 20 20 20  )\s+$}....      
4280: 20 20 20 20 20 20 69 66 20 7b 5b 72 65 67 65 78        if {[regex
4290: 70 20 2d 6c 69 6e 65 20 2d 2d 20 24 70 61 74 74  p -line -- $patt
42a0: 65 72 6e 20 24 65 78 65 63 20 64 75 6d 6d 79 20  ern $exec dummy 
42b0: 70 65 33 32 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  pe32]} then {.. 
42c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a               #..
42d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20                # 
42e0: 48 41 43 4b 3a 20 54 68 69 73 20 5b 73 77 69 74  HACK: This [swit
42f0: 63 68 5d 20 61 73 73 75 6d 65 73 20 74 68 61 74  ch] assumes that
4300: 20 33 32 2d 62 69 74 20 65 78 65 63 75 74 61 62   32-bit executab
4310: 6c 65 73 20 61 72 65 0d 0a 20 20 20 20 20 20 20  les are..       
4320: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 61         #       a
4330: 6c 77 61 79 73 20 78 38 36 20 61 6e 64 20 74 68  lways x86 and th
4340: 61 74 20 36 34 2d 62 69 74 20 65 78 65 63 75 74  at 64-bit execut
4350: 61 62 6c 65 73 20 61 72 65 20 61 6c 77 61 79 73  ables are always
4360: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
4370: 23 20 20 20 20 20 20 20 78 36 34 2e 0d 0a 20 20  #       x64...  
4380: 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20              #.. 
4390: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 77 69               swi
43a0: 74 63 68 20 2d 65 78 61 63 74 20 2d 2d 20 24 70  tch -exact -- $p
43b0: 65 33 32 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  e32 {..         
43c0: 20 20 20 20 20 20 20 50 45 33 32 20 7b 0d 0a 20         PE32 {.. 
43d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
43e0: 20 73 65 74 20 70 6c 61 74 66 6f 72 6d 20 57 69   set platform Wi
43f0: 6e 33 32 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n32..           
4400: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
4410: 20 20 20 20 20 20 20 20 50 45 33 32 2b 20 7b 0d          PE32+ {.
4420: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
4430: 20 20 20 73 65 74 20 70 6c 61 74 66 6f 72 6d 20     set platform 
4440: 78 36 34 0d 0a 20 20 20 20 20 20 20 20 20 20 20  x64..           
4450: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
4460: 20 20 20 20 20 20 20 20 64 65 66 61 75 6c 74 20          default 
4470: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
4480: 20 20 20 20 20 73 65 74 20 70 6c 61 74 66 6f 72       set platfor
4490: 6d 20 22 22 0d 0a 20 20 20 20 20 20 20 20 20 20  m ""..          
44a0: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
44b0: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
44c0: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
44d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65                se
44e0: 74 20 70 6c 61 74 66 6f 72 6d 20 22 22 0d 0a 20  t platform "".. 
44f0: 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
4500: 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
4510: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
4520: 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 74 74 65      # NOTE: Atte
4530: 6d 70 74 20 74 6f 20 65 78 74 72 61 63 74 20 74  mpt to extract t
4540: 68 65 20 49 4c 4f 4e 4c 59 20 6c 69 6e 65 20 66  he ILONLY line f
4550: 72 6f 6d 20 74 68 65 20 63 61 70 74 75 72 65 64  rom the captured
4560: 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 20 20  ..          #   
4570: 20 20 20 20 6f 75 74 70 75 74 2e 20 20 49 66 20      output.  If 
4580: 74 68 69 73 20 76 61 6c 75 65 20 69 73 20 7a 65  this value is ze
4590: 72 6f 2c 20 74 68 65 20 73 70 65 63 69 66 69 65  ro, the specifie
45a0: 64 20 66 69 6c 65 20 6d 75 73 74 0d 0a 20 20 20  d file must..   
45b0: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 62         #       b
45c0: 65 20 61 20 6d 69 78 65 64 2d 6d 6f 64 65 20 61  e a mixed-mode a
45d0: 73 73 65 6d 62 6c 79 3b 20 6f 74 68 65 72 77 69  ssembly; otherwi
45e0: 73 65 2c 20 69 74 20 63 6f 6e 74 61 69 6e 73 20  se, it contains 
45f0: 6f 6e 6c 79 0d 0a 20 20 20 20 20 20 20 20 20 20  only..          
4600: 23 20 20 20 20 20 20 20 6d 61 6e 61 67 65 64 20  #       managed 
4610: 63 6f 6d 70 6f 6e 65 6e 74 73 2e 0d 0a 20 20 20  components...   
4620: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
4630: 20 20 20 20 73 65 74 20 70 61 74 74 65 72 6e 20      set pattern 
4640: 7b 5e 49 4c 4f 4e 4c 59 20 20 20 20 3a 20 28 30  {^ILONLY    : (0
4650: 7c 31 29 5c 73 2b 24 7d 0d 0a 0d 0a 20 20 20 20  |1)\s+$}....    
4660: 20 20 20 20 20 20 69 66 20 7b 21 5b 72 65 67 65        if {![rege
4670: 78 70 20 2d 6c 69 6e 65 20 2d 2d 20 24 70 61 74  xp -line -- $pat
4680: 74 65 72 6e 20 24 65 78 65 63 20 64 75 6d 6d 79  tern $exec dummy
4690: 20 69 6c 4f 6e 6c 79 5d 7d 20 74 68 65 6e 20 7b   ilOnly]} then {
46a0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65  ..            re
46b0: 74 75 72 6e 20 66 61 6c 73 65 0d 0a 20 20 20 20  turn false..    
46c0: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
46d0: 20 20 20 20 20 69 66 20 7b 21 24 69 6c 4f 6e 6c       if {!$ilOnl
46e0: 79 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  y} then {..     
46f0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 72         return tr
4700: 75 65 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d  ue..          }.
4710: 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  .        }..    
4720: 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a    }....      #..
4730: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 66        # NOTE: If
4740: 20 74 68 65 20 74 65 73 74 20 73 75 69 74 65 20   the test suite 
4750: 63 61 6e 6e 6f 74 20 75 73 65 20 5b 65 78 65 63  cannot use [exec
4760: 5d 20 6f 72 20 65 78 65 63 75 74 69 6f 6e 20 6f  ] or execution o
4770: 66 20 43 6f 72 46 6c 61 67 73 0d 0a 20 20 20 20  f CorFlags..    
4780: 20 20 23 20 20 20 20 20 20 20 66 61 69 6c 65 64    #       failed
4790: 2c 20 72 65 74 75 72 6e 20 66 61 6c 73 65 2e 0d  , return false..
47a0: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
47b0: 72 65 74 75 72 6e 20 66 61 6c 73 65 0d 0a 20 20  return false..  
47c0: 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
47d0: 20 67 65 74 4e 61 74 69 76 65 4c 69 62 72 61 72   getNativeLibrar
47e0: 79 46 69 6c 65 4e 61 6d 65 73 4f 6e 6c 79 20 7b  yFileNamesOnly {
47f0: 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  } {..      #..  
4800: 20 20 20 20 23 20 4e 4f 54 45 3a 20 46 69 72 73      # NOTE: Firs
4810: 74 2c 20 63 68 65 63 6b 20 69 66 20 74 68 65 20  t, check if the 
4820: 6c 69 73 74 20 6f 66 20 6e 61 74 69 76 65 20 6c  list of native l
4830: 69 62 72 61 72 79 20 66 69 6c 65 20 6e 61 6d 65  ibrary file name
4840: 73 20 68 61 73 20 62 65 65 6e 0d 0a 20 20 20 20  s has been..    
4850: 20 20 23 20 20 20 20 20 20 20 6d 61 6e 75 61 6c    #       manual
4860: 6c 79 20 6f 76 65 72 72 69 64 64 65 6e 2e 0d 0a  ly overridden...
4870: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69        #..      i
4880: 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20  f {[info exists 
4890: 3a 3a 6e 61 74 69 76 65 5f 6c 69 62 72 61 72 79  ::native_library
48a0: 5f 66 69 6c 65 5f 6e 61 6d 65 73 5d 20 26 26 20  _file_names] && 
48b0: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 6c 6c  \..          [ll
48c0: 65 6e 67 74 68 20 24 3a 3a 6e 61 74 69 76 65 5f  ength $::native_
48d0: 6c 69 62 72 61 72 79 5f 66 69 6c 65 5f 6e 61 6d  library_file_nam
48e0: 65 73 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d  es] > 0} then {.
48f0: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
4900: 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 65 20      # NOTE: The 
4910: 6c 69 73 74 20 6f 66 20 6e 61 74 69 76 65 20 6c  list of native l
4920: 69 62 72 61 72 79 20 66 69 6c 65 20 6e 61 6d 65  ibrary file name
4930: 73 20 68 61 73 20 62 65 65 6e 20 6f 76 65 72 72  s has been overr
4940: 69 64 64 65 6e 3b 0d 0a 20 20 20 20 20 20 20 20  idden;..        
4950: 23 20 20 20 20 20 20 20 74 68 65 72 65 66 6f 72  #       therefor
4960: 65 2c 20 75 73 65 20 69 74 20 76 65 72 62 61 74  e, use it verbat
4970: 69 6d 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  im...        #..
4980: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 24          return $
4990: 3a 3a 6e 61 74 69 76 65 5f 6c 69 62 72 61 72 79  ::native_library
49a0: 5f 66 69 6c 65 5f 6e 61 6d 65 73 0d 0a 20 20 20  _file_names..   
49b0: 20 20 20 7d 20 65 6c 73 65 69 66 20 7b 5b 69 73     } elseif {[is
49c0: 57 69 6e 64 6f 77 73 5d 7d 20 74 68 65 6e 20 7b  Windows]} then {
49d0: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
49e0: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4f 74 68       # NOTE: Oth
49f0: 65 72 77 69 73 65 2c 20 6f 6e 20 57 69 6e 64 6f  erwise, on Windo
4a00: 77 73 2c 20 61 6c 77 61 79 73 20 75 73 65 20 74  ws, always use t
4a10: 68 65 20 64 65 66 61 75 6c 74 20 66 69 6c 65 20  he default file 
4a20: 6e 61 6d 65 0d 0a 20 20 20 20 20 20 20 20 23 20  name..        # 
4a30: 20 20 20 20 20 20 22 73 71 6c 69 74 65 33 2e 64        "sqlite3.d
4a40: 6c 6c 22 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  ll"...        #.
4a50: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
4a60: 5b 6c 69 73 74 20 73 71 6c 69 74 65 33 2e 64 6c  [list sqlite3.dl
4a70: 6c 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65  l]..      } else
4a80: 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20   {..        #.. 
4a90: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4f         # NOTE: O
4aa0: 74 68 65 72 77 69 73 65 2c 20 72 65 74 75 72 6e  therwise, return
4ab0: 20 62 6f 74 68 20 74 68 65 20 67 65 6e 65 72 69   both the generi
4ac0: 63 20 50 4f 53 49 58 20 66 69 6c 65 20 6e 61 6d  c POSIX file nam
4ad0: 65 20 61 6e 64 20 74 68 65 0d 0a 20 20 20 20 20  e and the..     
4ae0: 20 20 20 23 20 20 20 20 20 20 20 4d 61 63 20 4f     #       Mac O
4af0: 53 20 58 20 66 69 6c 65 20 6e 61 6d 65 2c 20 73  S X file name, s
4b00: 69 6e 63 65 20 77 65 20 64 6f 20 6e 6f 74 20 63  ince we do not c
4b10: 75 72 72 65 6e 74 6c 79 20 68 61 76 65 20 61 6e  urrently have an
4b20: 20 65 61 73 79 0d 0a 20 20 20 20 20 20 20 20 23   easy..        #
4b30: 20 20 20 20 20 20 20 77 61 79 20 74 6f 20 64 65         way to de
4b40: 74 65 63 74 20 77 68 69 63 68 20 6f 66 20 74 68  tect which of th
4b50: 6f 73 65 20 70 6c 61 74 66 6f 72 6d 73 20 77 65  ose platforms we
4b60: 20 61 72 65 20 72 75 6e 6e 69 6e 67 20 6f 6e 2e   are running on.
4b70: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
4b80: 20 20 20 20 20 72 65 74 75 72 6e 20 5b 6c 69 73       return [lis
4b90: 74 20 6c 69 62 73 71 6c 69 74 65 33 2e 64 79 6c  t libsqlite3.dyl
4ba0: 69 62 20 6c 69 62 73 71 6c 69 74 65 33 2e 73 6f  ib libsqlite3.so
4bb0: 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  ]..      }..    
4bc0: 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67  }.....    proc g
4bd0: 65 74 49 6e 74 65 72 6f 70 41 73 73 65 6d 62 6c  etInteropAssembl
4be0: 79 46 69 6c 65 4e 61 6d 65 73 4f 6e 6c 79 20 7b  yFileNamesOnly {
4bf0: 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  } {..      #..  
4c00: 20 20 20 20 23 20 4e 4f 54 45 3a 20 46 69 72 73      # NOTE: Firs
4c10: 74 2c 20 63 68 65 63 6b 20 69 66 20 74 68 65 20  t, check if the 
4c20: 6c 69 73 74 20 6f 66 20 69 6e 74 65 72 6f 70 20  list of interop 
4c30: 61 73 73 65 6d 62 6c 79 20 66 69 6c 65 20 6e 61  assembly file na
4c40: 6d 65 73 20 68 61 73 20 62 65 65 6e 0d 0a 20 20  mes has been..  
4c50: 20 20 20 20 23 20 20 20 20 20 20 20 6d 61 6e 75      #       manu
4c60: 61 6c 6c 79 20 6f 76 65 72 72 69 64 64 65 6e 2e  ally overridden.
4c70: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
4c80: 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74   if {[info exist
4c90: 73 20 3a 3a 69 6e 74 65 72 6f 70 5f 61 73 73 65  s ::interop_asse
4ca0: 6d 62 6c 79 5f 66 69 6c 65 5f 6e 61 6d 65 73 5d  mbly_file_names]
4cb0: 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20   && \..         
4cc0: 20 5b 6c 6c 65 6e 67 74 68 20 24 3a 3a 69 6e 74   [llength $::int
4cd0: 65 72 6f 70 5f 61 73 73 65 6d 62 6c 79 5f 66 69  erop_assembly_fi
4ce0: 6c 65 5f 6e 61 6d 65 73 5d 20 3e 20 30 7d 20 74  le_names] > 0} t
4cf0: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  hen {..        #
4d00: 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
4d10: 3a 20 54 68 65 20 6c 69 73 74 20 6f 66 20 69 6e  : The list of in
4d20: 74 65 72 6f 70 20 61 73 73 65 6d 62 6c 79 20 66  terop assembly f
4d30: 69 6c 65 20 6e 61 6d 65 73 20 68 61 73 20 62 65  ile names has be
4d40: 65 6e 20 6f 76 65 72 72 69 64 64 65 6e 3b 0d 0a  en overridden;..
4d50: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
4d60: 74 68 65 72 65 66 6f 72 65 2c 20 75 73 65 20 69  therefore, use i
4d70: 74 20 76 65 72 62 61 74 69 6d 2e 0d 0a 20 20 20  t verbatim...   
4d80: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
4d90: 72 65 74 75 72 6e 20 24 3a 3a 69 6e 74 65 72 6f  return $::intero
4da0: 70 5f 61 73 73 65 6d 62 6c 79 5f 66 69 6c 65 5f  p_assembly_file_
4db0: 6e 61 6d 65 73 0d 0a 20 20 20 20 20 20 7d 20 65  names..      } e
4dc0: 6c 73 65 69 66 20 7b 5b 69 73 57 69 6e 64 6f 77  lseif {[isWindow
4dd0: 73 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  s]} then {..    
4de0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
4df0: 20 4e 4f 54 45 3a 20 4f 74 68 65 72 77 69 73 65   NOTE: Otherwise
4e00: 2c 20 6f 6e 20 57 69 6e 64 6f 77 73 2c 20 61 6c  , on Windows, al
4e10: 77 61 79 73 20 75 73 65 20 74 68 65 20 64 65 66  ways use the def
4e20: 61 75 6c 74 20 66 69 6c 65 20 6e 61 6d 65 0d 0a  ault file name..
4e30: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
4e40: 22 53 51 4c 69 74 65 2e 49 6e 74 65 72 6f 70 2e  "SQLite.Interop.
4e50: 64 6c 6c 22 2e 0d 0a 20 20 20 20 20 20 20 20 23  dll"...        #
4e60: 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ..        return
4e70: 20 5b 6c 69 73 74 20 53 51 4c 69 74 65 2e 49 6e   [list SQLite.In
4e80: 74 65 72 6f 70 2e 64 6c 6c 5d 0d 0a 20 20 20 20  terop.dll]..    
4e90: 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
4ea0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
4eb0: 20 4e 4f 54 45 3a 20 4f 74 68 65 72 77 69 73 65   NOTE: Otherwise
4ec0: 2c 20 72 65 74 75 72 6e 20 62 6f 74 68 20 74 68  , return both th
4ed0: 65 20 67 65 6e 65 72 69 63 20 50 4f 53 49 58 20  e generic POSIX 
4ee0: 66 69 6c 65 20 6e 61 6d 65 20 61 6e 64 20 74 68  file name and th
4ef0: 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  e..        #    
4f00: 20 20 20 4d 61 63 20 4f 53 20 58 20 66 69 6c 65     Mac OS X file
4f10: 20 6e 61 6d 65 2c 20 73 69 6e 63 65 20 77 65 20   name, since we 
4f20: 64 6f 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79  do not currently
4f30: 20 68 61 76 65 20 61 6e 20 65 61 73 79 0d 0a 20   have an easy.. 
4f40: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 77         #       w
4f50: 61 79 20 74 6f 20 64 65 74 65 63 74 20 77 68 69  ay to detect whi
4f60: 63 68 20 6f 66 20 74 68 6f 73 65 20 70 6c 61 74  ch of those plat
4f70: 66 6f 72 6d 73 20 77 65 20 61 72 65 20 72 75 6e  forms we are run
4f80: 6e 69 6e 67 20 6f 6e 2e 0d 0a 20 20 20 20 20 20  ning on...      
4f90: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74    #..        ret
4fa0: 75 72 6e 20 5b 6c 69 73 74 20 6c 69 62 53 51 4c  urn [list libSQL
4fb0: 69 74 65 2e 49 6e 74 65 72 6f 70 2e 64 79 6c 69  ite.Interop.dyli
4fc0: 62 20 6c 69 62 53 51 4c 69 74 65 2e 49 6e 74 65  b libSQLite.Inte
4fd0: 72 6f 70 2e 73 6f 5d 0d 0a 20 20 20 20 20 20 7d  rop.so]..      }
4fe0: 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
4ff0: 70 72 6f 63 20 67 65 74 43 6f 72 65 45 78 74 65  proc getCoreExte
5000: 6e 73 69 6f 6e 42 69 6e 61 72 79 46 69 6c 65 4e  nsionBinaryFileN
5010: 61 6d 65 20 7b 20 7b 64 65 66 61 75 6c 74 20 22  ame { {default "
5020: 22 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 73 65  "} } {..      se
5030: 74 20 66 69 6c 65 4e 61 6d 65 20 5b 67 65 74 43  t fileName [getC
5040: 6f 72 65 42 69 6e 61 72 79 46 69 6c 65 4e 61 6d  oreBinaryFileNam
5050: 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b  e]....      if {
5060: 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24 66 69  [file exists $fi
5070: 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d  leName]} then {.
5080: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
5090: 24 66 69 6c 65 4e 61 6d 65 0d 0a 20 20 20 20 20  $fileName..     
50a0: 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65 74 75   }....      retu
50b0: 72 6e 20 24 64 65 66 61 75 6c 74 0d 0a 20 20 20  rn $default..   
50c0: 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
50d0: 69 73 42 75 69 6c 64 41 76 61 69 6c 61 62 6c 65  isBuildAvailable
50e0: 20 7b 20 6e 61 74 69 76 65 20 64 69 72 65 63 74   { native direct
50f0: 6f 72 79 20 7b 76 61 72 4e 61 6d 65 20 22 22 7d  ory {varName ""}
5100: 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20   } {..      #.. 
5110: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 42 75 69       # NOTE: Bui
5120: 6c 64 20 74 68 65 20 66 75 6c 6c 79 20 71 75 61  ld the fully qua
5130: 6c 69 66 69 65 64 20 66 69 6c 65 20 6e 61 6d 65  lified file name
5140: 20 66 6f 72 20 74 68 65 20 70 72 69 6d 61 72 79   for the primary
5150: 20 61 73 73 65 6d 62 6c 79 0d 0a 20 20 20 20 20   assembly..     
5160: 20 23 20 20 20 20 20 20 20 63 6f 6e 74 61 69 6e   #       contain
5170: 69 6e 67 20 74 68 65 20 53 79 73 74 65 6d 2e 44  ing the System.D
5180: 61 74 61 2e 53 51 4c 69 74 65 20 6d 61 6e 61 67  ata.SQLite manag
5190: 65 64 20 63 6f 6d 70 6f 6e 65 6e 74 73 2e 20 20  ed components.  
51a0: 49 74 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  It..      #     
51b0: 20 20 73 68 6f 75 6c 64 20 62 65 20 6e 6f 74 65    should be note
51c0: 64 20 74 68 61 74 20 74 68 69 73 20 61 73 73 65  d that this asse
51d0: 6d 62 6c 79 20 66 69 6c 65 20 6d 61 79 20 61 6c  mbly file may al
51e0: 73 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 0d 0a  so contain the..
51f0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 6e 61        #       na
5200: 74 69 76 65 20 63 6f 6d 70 6f 6e 65 6e 74 73 2c  tive components,
5210: 20 69 66 20 61 20 6e 61 74 69 76 65 20 62 75 69   if a native bui
5220: 6c 64 20 69 73 20 69 6e 20 75 73 65 2e 0d 0a 20  ld is in use... 
5230: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 73 65       #..      se
5240: 74 20 66 69 6c 65 4e 61 6d 65 20 5b 66 69 6c 65  t fileName [file
5250: 20 6e 61 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c   nativename [fil
5260: 65 20 6a 6f 69 6e 20 24 64 69 72 65 63 74 6f 72  e join $director
5270: 79 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 53  y \..          S
5280: 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
5290: 65 2e 64 6c 6c 5d 5d 0d 0a 0d 0a 20 20 20 20 20  e.dll]]....     
52a0: 20 69 66 20 7b 21 5b 66 69 6c 65 20 65 78 69 73   if {![file exis
52b0: 74 73 20 24 66 69 6c 65 4e 61 6d 65 5d 7d 20 74  ts $fileName]} t
52c0: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 72  hen {..        r
52d0: 65 74 75 72 6e 20 66 61 6c 73 65 0d 0a 20 20 20  eturn false..   
52e0: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d     }....      #.
52f0: 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41  .      # NOTE: A
5300: 74 74 65 6d 70 74 20 74 6f 20 61 75 74 6f 6d 61  ttempt to automa
5310: 74 69 63 61 6c 6c 79 20 64 65 74 65 63 74 20 69  tically detect i
5320: 66 20 74 68 65 20 70 72 69 6d 61 72 79 20 61 73  f the primary as
5330: 73 65 6d 62 6c 79 0d 0a 20 20 20 20 20 20 23 20  sembly..      # 
5340: 20 20 20 20 20 20 63 6f 6e 74 61 69 6e 73 20 61        contains a
5350: 6e 79 20 6e 61 74 69 76 65 20 63 6f 6d 70 6f 6e  ny native compon
5360: 65 6e 74 73 2c 20 69 66 20 6e 65 63 65 73 73 61  ents, if necessa
5370: 72 79 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  ry...      #..  
5380: 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20      if {[string 
5390: 6c 65 6e 67 74 68 20 24 6e 61 74 69 76 65 5d 20  length $native] 
53a0: 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  == 0} then {..  
53b0: 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e        if {[strin
53c0: 67 20 6c 65 6e 67 74 68 20 24 76 61 72 4e 61 6d  g length $varNam
53d0: 65 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  e] > 0} then {..
53e0: 20 20 20 20 20 20 20 20 20 20 75 70 76 61 72 20            upvar 
53f0: 31 20 24 76 61 72 4e 61 6d 65 20 24 76 61 72 4e  1 $varName $varN
5400: 61 6d 65 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  ame..        }..
5410: 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 6e 61  ..        set na
5420: 74 69 76 65 20 5b 69 73 4d 69 78 65 64 4d 6f 64  tive [isMixedMod
5430: 65 41 73 73 65 6d 62 6c 79 20 24 66 69 6c 65 4e  eAssembly $fileN
5440: 61 6d 65 20 24 76 61 72 4e 61 6d 65 5d 0d 0a 20  ame $varName].. 
5450: 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
5460: 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
5470: 20 49 66 20 74 68 65 20 70 72 69 6d 61 72 79 20   If the primary 
5480: 61 73 73 65 6d 62 6c 79 20 61 6c 73 6f 20 63 6f  assembly also co
5490: 6e 74 61 69 6e 73 20 74 68 65 20 6e 61 74 69 76  ntains the nativ
54a0: 65 20 63 6f 6d 70 6f 6e 65 6e 74 73 2c 0d 0a 20  e components,.. 
54b0: 20 20 20 20 20 23 20 20 20 20 20 20 20 77 65 20       #       we 
54c0: 68 61 76 65 20 65 76 65 72 79 74 68 69 6e 67 20  have everything 
54d0: 77 65 20 6e 65 65 64 2e 0d 0a 20 20 20 20 20 20  we need...      
54e0: 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 24 6e 61  #..      if {$na
54f0: 74 69 76 65 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  tive} then {..  
5500: 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 72 75        return tru
5510: 65 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  e..      }....  
5520: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
5530: 4f 54 45 3a 20 57 68 61 74 20 69 73 20 74 68 65  OTE: What is the
5540: 20 61 72 63 68 69 74 65 63 74 75 72 65 20 66 6f   architecture fo
5550: 72 20 74 68 69 73 20 6d 61 63 68 69 6e 65 3f 0d  r this machine?.
5560: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
5570: 73 65 74 20 61 72 63 68 69 74 65 63 74 75 72 65  set architecture
5580: 20 5b 6d 61 63 68 69 6e 65 54 6f 50 6c 61 74 66   [machineToPlatf
5590: 6f 72 6d 20 24 3a 3a 74 63 6c 5f 70 6c 61 74 66  orm $::tcl_platf
55a0: 6f 72 6d 28 6d 61 63 68 69 6e 65 29 20 74 72 75  orm(machine) tru
55b0: 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20  e]....      #.. 
55c0: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 57 68 61       # NOTE: Wha
55d0: 74 20 69 73 20 74 68 65 20 70 6c 61 74 66 6f 72  t is the platfor
55e0: 6d 20 66 6f 72 20 74 68 69 73 20 6d 61 63 68 69  m for this machi
55f0: 6e 65 3f 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  ne?..      #..  
5600: 20 20 20 20 73 65 74 20 70 6c 61 74 66 6f 72 6d      set platform
5610: 20 5b 6d 61 63 68 69 6e 65 54 6f 50 6c 61 74 66   [machineToPlatf
5620: 6f 72 6d 20 24 3a 3a 74 63 6c 5f 70 6c 61 74 66  orm $::tcl_platf
5630: 6f 72 6d 28 6d 61 63 68 69 6e 65 29 5d 0d 0a 0d  orm(machine)]...
5640: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
5650: 23 20 4e 4f 54 45 3a 20 42 75 69 6c 64 20 74 68  # NOTE: Build th
5660: 65 20 66 75 6c 6c 79 20 71 75 61 6c 69 66 69 65  e fully qualifie
5670: 64 20 66 69 6c 65 20 6e 61 6d 65 20 66 6f 72 20  d file name for 
5680: 74 68 65 20 69 6e 74 65 72 6f 70 20 61 73 73 65  the interop asse
5690: 6d 62 6c 79 0d 0a 20 20 20 20 20 20 23 20 20 20  mbly..      #   
56a0: 20 20 20 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74      containing t
56b0: 68 65 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53  he System.Data.S
56c0: 51 4c 69 74 65 20 6e 61 74 69 76 65 20 63 6f 6d  QLite native com
56d0: 70 6f 6e 65 6e 74 73 2e 20 20 49 66 20 74 68 69  ponents.  If thi
56e0: 73 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  s..      #      
56f0: 20 66 69 6c 65 20 65 78 69 73 74 73 2c 20 77 65   file exists, we
5700: 20 73 68 6f 75 6c 64 20 68 61 76 65 20 65 76 65   should have eve
5710: 72 79 74 68 69 6e 67 20 77 65 20 6e 65 65 64 2e  rything we need.
5720: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
5730: 20 66 6f 72 65 61 63 68 20 66 69 6c 65 4e 61 6d   foreach fileNam
5740: 65 4f 6e 6c 79 20 5b 67 65 74 49 6e 74 65 72 6f  eOnly [getIntero
5750: 70 41 73 73 65 6d 62 6c 79 46 69 6c 65 4e 61 6d  pAssemblyFileNam
5760: 65 73 4f 6e 6c 79 5d 20 7b 0d 0a 20 20 20 20 20  esOnly] {..     
5770: 20 20 20 73 65 74 20 66 69 6c 65 4e 61 6d 65 20     set fileName 
5780: 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65  [file nativename
5790: 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 24 64 69 72   [file join $dir
57a0: 65 63 74 6f 72 79 20 5c 0d 0a 20 20 20 20 20 20  ectory \..      
57b0: 20 20 20 20 20 20 24 61 72 63 68 69 74 65 63 74        $architect
57c0: 75 72 65 20 24 66 69 6c 65 4e 61 6d 65 4f 6e 6c  ure $fileNameOnl
57d0: 79 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69  y]]....        i
57e0: 66 20 7b 5b 66 69 6c 65 20 65 78 69 73 74 73 20  f {[file exists 
57f0: 24 66 69 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e  $fileName]} then
5800: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 72 65   {..          re
5810: 74 75 72 6e 20 74 72 75 65 0d 0a 20 20 20 20 20  turn true..     
5820: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
5830: 73 65 74 20 66 69 6c 65 4e 61 6d 65 20 5b 66 69  set fileName [fi
5840: 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65 20 5b 66  le nativename [f
5850: 69 6c 65 20 6a 6f 69 6e 20 24 64 69 72 65 63 74  ile join $direct
5860: 6f 72 79 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ory \..         
5870: 20 20 20 24 70 6c 61 74 66 6f 72 6d 20 24 66 69     $platform $fi
5880: 6c 65 4e 61 6d 65 4f 6e 6c 79 5d 5d 0d 0a 0d 0a  leNameOnly]]....
5890: 20 20 20 20 20 20 20 20 69 66 20 7b 5b 66 69 6c          if {[fil
58a0: 65 20 65 78 69 73 74 73 20 24 66 69 6c 65 4e 61  e exists $fileNa
58b0: 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  me]} then {..   
58c0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 72         return tr
58d0: 75 65 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d  ue..        }...
58e0: 0a 20 20 20 20 20 20 20 20 73 65 74 20 66 69 6c  .        set fil
58f0: 65 4e 61 6d 65 20 5b 66 69 6c 65 20 6e 61 74 69  eName [file nati
5900: 76 65 6e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69  vename [file joi
5910: 6e 20 24 64 69 72 65 63 74 6f 72 79 20 5c 0d 0a  n $directory \..
5920: 20 20 20 20 20 20 20 20 20 20 20 20 24 66 69 6c              $fil
5930: 65 4e 61 6d 65 4f 6e 6c 79 5d 5d 0d 0a 0d 0a 20  eNameOnly]].... 
5940: 20 20 20 20 20 20 20 69 66 20 7b 5b 66 69 6c 65         if {[file
5950: 20 65 78 69 73 74 73 20 24 66 69 6c 65 4e 61 6d   exists $fileNam
5960: 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  e]} then {..    
5970: 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 72 75        return tru
5980: 65 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  e..        }..  
5990: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23      }....      #
59a0: 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
59b0: 42 75 69 6c 64 20 74 68 65 20 66 75 6c 6c 79 20  Build the fully 
59c0: 71 75 61 6c 69 66 69 65 64 20 66 69 6c 65 20 6e  qualified file n
59d0: 61 6d 65 20 66 6f 72 20 74 68 65 20 53 51 4c 69  ame for the SQLi
59e0: 74 65 20 63 6f 72 65 0d 0a 20 20 20 20 20 20 23  te core..      #
59f0: 20 20 20 20 20 20 20 6c 69 62 72 61 72 79 2e 20         library. 
5a00: 20 49 66 20 74 68 69 73 20 66 69 6c 65 20 65 78   If this file ex
5a10: 69 73 74 73 2c 20 77 65 20 73 68 6f 75 6c 64 20  ists, we should 
5a20: 68 61 76 65 20 65 76 65 72 79 74 68 69 6e 67 20  have everything 
5a30: 77 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  we..      #     
5a40: 20 20 6e 65 65 64 2e 0d 0a 20 20 20 20 20 20 23    need...      #
5a50: 0d 0a 20 20 20 20 20 20 66 6f 72 65 61 63 68 20  ..      foreach 
5a60: 66 69 6c 65 4e 61 6d 65 4f 6e 6c 79 20 5b 67 65  fileNameOnly [ge
5a70: 74 4e 61 74 69 76 65 4c 69 62 72 61 72 79 46 69  tNativeLibraryFi
5a80: 6c 65 4e 61 6d 65 73 4f 6e 6c 79 5d 20 7b 0d 0a  leNamesOnly] {..
5a90: 20 20 20 20 20 20 20 20 73 65 74 20 66 69 6c 65          set file
5aa0: 4e 61 6d 65 20 5b 66 69 6c 65 20 6e 61 74 69 76  Name [file nativ
5ab0: 65 6e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e  ename [file join
5ac0: 20 24 64 69 72 65 63 74 6f 72 79 20 5c 0d 0a 20   $directory \.. 
5ad0: 20 20 20 20 20 20 20 20 20 20 20 24 61 72 63 68             $arch
5ae0: 69 74 65 63 74 75 72 65 20 24 66 69 6c 65 4e 61  itecture $fileNa
5af0: 6d 65 4f 6e 6c 79 5d 5d 0d 0a 0d 0a 20 20 20 20  meOnly]]....    
5b00: 20 20 20 20 69 66 20 7b 5b 66 69 6c 65 20 65 78      if {[file ex
5b10: 69 73 74 73 20 24 66 69 6c 65 4e 61 6d 65 5d 7d  ists $fileName]}
5b20: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
5b30: 20 20 20 72 65 74 75 72 6e 20 74 72 75 65 0d 0a     return true..
5b40: 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
5b50: 20 20 20 20 20 73 65 74 20 66 69 6c 65 4e 61 6d       set fileNam
5b60: 65 20 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e 61  e [file nativena
5b70: 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 24 64  me [file join $d
5b80: 69 72 65 63 74 6f 72 79 20 5c 0d 0a 20 20 20 20  irectory \..    
5b90: 20 20 20 20 20 20 20 20 24 70 6c 61 74 66 6f 72          $platfor
5ba0: 6d 20 24 66 69 6c 65 4e 61 6d 65 4f 6e 6c 79 5d  m $fileNameOnly]
5bb0: 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20  ]....        if 
5bc0: 7b 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24 66  {[file exists $f
5bd0: 69 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b  ileName]} then {
5be0: 0d 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ..          retu
5bf0: 72 6e 20 74 72 75 65 0d 0a 20 20 20 20 20 20 20  rn true..       
5c00: 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 73 65   }....        se
5c10: 74 20 66 69 6c 65 4e 61 6d 65 20 5b 66 69 6c 65  t fileName [file
5c20: 20 6e 61 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c   nativename [fil
5c30: 65 20 6a 6f 69 6e 20 24 64 69 72 65 63 74 6f 72  e join $director
5c40: 79 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  y \..           
5c50: 20 24 66 69 6c 65 4e 61 6d 65 4f 6e 6c 79 5d 5d   $fileNameOnly]]
5c60: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b  ....        if {
5c70: 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24 66 69  [file exists $fi
5c80: 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d  leName]} then {.
5c90: 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
5ca0: 6e 20 74 72 75 65 0d 0a 20 20 20 20 20 20 20 20  n true..        
5cb0: 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  }..      }....  
5cc0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
5cd0: 4f 54 45 3a 20 4f 6e 65 20 6f 72 20 6d 6f 72 65  OTE: One or more
5ce0: 20 6e 61 74 69 76 65 20 63 6f 6d 70 6f 6e 65 6e   native componen
5cf0: 74 73 20 6e 65 65 64 65 64 20 62 79 20 53 79 73  ts needed by Sys
5d00: 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 0d  tem.Data.SQLite.
5d10: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 61  .      #       a
5d20: 72 65 20 6d 69 73 73 69 6e 67 2e 0d 0a 20 20 20  re missing...   
5d30: 20 20 20 23 0d 0a 20 20 20 20 20 20 72 65 74 75     #..      retu
5d40: 72 6e 20 66 61 6c 73 65 0d 0a 20 20 20 20 7d 0d  rn false..    }.
5d50: 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 69 73 52  ....    proc isR
5d60: 65 6c 65 61 73 65 41 76 61 69 6c 61 62 6c 65 20  eleaseAvailable 
5d70: 7b 20 64 69 72 65 63 74 6f 72 79 20 7b 76 61 72  { directory {var
5d80: 4e 61 6d 65 20 22 22 7d 20 7d 20 7b 0d 0a 20 20  Name ""} } {..  
5d90: 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20      if {[string 
5da0: 6c 65 6e 67 74 68 20 24 76 61 72 4e 61 6d 65 5d  length $varName]
5db0: 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20   > 0} then {..  
5dc0: 20 20 20 20 20 20 75 70 76 61 72 20 31 20 24 76        upvar 1 $v
5dd0: 61 72 4e 61 6d 65 20 24 76 61 72 4e 61 6d 65 0d  arName $varName.
5de0: 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
5df0: 20 20 72 65 74 75 72 6e 20 5b 69 73 42 75 69 6c    return [isBuil
5e00: 64 41 76 61 69 6c 61 62 6c 65 20 22 22 20 24 64  dAvailable "" $d
5e10: 69 72 65 63 74 6f 72 79 20 24 76 61 72 4e 61 6d  irectory $varNam
5e20: 65 5d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20  e]..    }.....  
5e30: 20 20 70 72 6f 63 20 6a 6f 69 6e 42 75 69 6c 64    proc joinBuild
5e40: 44 69 72 65 63 74 6f 72 79 20 7b 20 6e 61 74 69  Directory { nati
5e50: 76 65 20 70 61 74 68 20 79 65 61 72 20 70 6c 61  ve path year pla
5e60: 74 66 6f 72 6d 20 63 6f 6e 66 69 67 75 72 61 74  tform configurat
5e70: 69 6f 6e 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23  ion } {..      #
5e80: 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
5e90: 46 69 67 75 72 65 20 6f 75 74 20 61 6e 64 20 74  Figure out and t
5ea0: 68 65 6e 20 72 65 74 75 72 6e 20 74 68 65 20 66  hen return the f
5eb0: 75 6c 6c 79 20 71 75 61 6c 69 66 69 65 64 20 70  ully qualified p
5ec0: 61 74 68 20 74 6f 20 74 68 65 20 62 75 69 6c 64  ath to the build
5ed0: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
5ee0: 64 69 72 65 63 74 6f 72 79 20 62 61 73 65 64 20  directory based 
5ef0: 6f 6e 20 61 6c 6c 20 74 68 65 20 61 72 67 75 6d  on all the argum
5f00: 65 6e 74 73 20 70 72 6f 76 69 64 65 64 20 62 79  ents provided by
5f10: 20 6f 75 72 20 63 61 6c 6c 65 72 2e 0d 0a 20 20   our caller...  
5f20: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20      #..      if 
5f30: 7b 24 6e 61 74 69 76 65 7d 20 74 68 65 6e 20 7b  {$native} then {
5f40: 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ..        return
5f50: 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 24 70 61 74   [file join $pat
5f60: 68 20 62 69 6e 20 24 79 65 61 72 20 24 70 6c 61  h bin $year $pla
5f70: 74 66 6f 72 6d 20 24 63 6f 6e 66 69 67 75 72 61  tform $configura
5f80: 74 69 6f 6e 5d 0d 0a 20 20 20 20 20 20 7d 20 65  tion]..      } e
5f90: 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 72  lse {..        r
5fa0: 65 74 75 72 6e 20 5b 66 69 6c 65 20 6a 6f 69 6e  eturn [file join
5fb0: 20 24 70 61 74 68 20 62 69 6e 20 24 79 65 61 72   $path bin $year
5fc0: 20 24 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20   $configuration 
5fd0: 62 69 6e 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20  bin]..      }.. 
5fe0: 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
5ff0: 63 20 67 65 74 42 75 69 6c 64 44 69 72 65 63 74  c getBuildDirect
6000: 6f 72 79 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20  ory {} {..      
6010: 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
6020: 20 53 65 65 20 69 66 20 74 68 65 20 22 6e 61 74   See if the "nat
6030: 69 76 65 22 20 72 75 6e 74 69 6d 65 20 6f 70 74  ive" runtime opt
6040: 69 6f 6e 20 68 61 73 20 62 65 65 6e 20 73 65 74  ion has been set
6050: 2e 20 20 49 66 20 73 6f 2c 20 75 73 65 20 74 68  .  If so, use th
6060: 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  e..      #      
6070: 20 64 69 72 65 63 74 6f 72 79 20 66 6f 72 20 74   directory for t
6080: 68 65 20 6d 69 78 65 64 2d 6d 6f 64 65 20 61 73  he mixed-mode as
6090: 73 65 6d 62 6c 79 20 28 61 2e 6b 2e 61 2e 20 74  sembly (a.k.a. t
60a0: 68 65 20 6e 61 74 69 76 65 20 69 6e 74 65 72 6f  he native intero
60b0: 70 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  p..      #      
60c0: 20 61 73 73 65 6d 62 6c 79 29 2e 20 20 54 6f 20   assembly).  To 
60d0: 65 6e 61 62 6c 65 20 74 68 69 73 20 6f 70 74 69  enable this opti
60e0: 6f 6e 20 76 69 61 20 74 68 65 20 63 6f 6d 6d 61  on via the comma
60f0: 6e 64 20 6c 69 6e 65 2c 20 65 6e 74 65 72 20 61  nd line, enter a
6100: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
6110: 63 6f 6d 6d 61 6e 64 20 73 69 6d 69 6c 61 72 20  command similar 
6120: 74 6f 20 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f  to one of the fo
6130: 6c 6c 6f 77 69 6e 67 20 28 61 6c 6c 20 6f 6e 20  llowing (all on 
6140: 6f 6e 65 20 6c 69 6e 65 29 3a 0d 0a 20 20 20 20  one line):..    
6150: 20 20 23 0d 0a 20 20 20 20 20 20 23 20 20 20 20    #..      #    
6160: 20 20 20 45 61 67 6c 65 53 68 65 6c 6c 2e 65 78     EagleShell.ex
6170: 65 20 2d 69 6e 69 74 69 61 6c 69 7a 65 20 2d 72  e -initialize -r
6180: 75 6e 74 69 6d 65 4f 70 74 69 6f 6e 20 6e 61 74  untimeOption nat
6190: 69 76 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ive..      #    
61a0: 20 20 20 20 20 2d 66 69 6c 65 20 2e 5c 70 61 74       -file .\pat
61b0: 68 5c 74 6f 5c 61 6c 6c 2e 65 61 67 6c 65 0d 0a  h\to\all.eagle..
61c0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
61d0: 20 20 20 20 20 20 20 54 6f 20 65 6e 61 62 6c 65         To enable
61e0: 20 74 68 69 73 20 6f 70 74 69 6f 6e 20 76 69 61   this option via
61f0: 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e   the command lin
6200: 65 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20 22  e prior to the "
6210: 62 65 74 61 20 31 36 22 0d 0a 20 20 20 20 20 20  beta 16"..      
6220: 23 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 20  #       release 
6230: 6f 66 20 45 61 67 6c 65 2c 20 74 68 65 20 66 6f  of Eagle, the fo
6240: 6c 6c 6f 77 69 6e 67 20 63 6f 6d 6d 61 6e 64 20  llowing command 
6250: 6d 75 73 74 20 62 65 20 75 73 65 64 20 69 6e 73  must be used ins
6260: 74 65 61 64 0d 0a 20 20 20 20 20 20 23 20 20 20  tead..      #   
6270: 20 20 20 20 28 61 6c 73 6f 20 61 6c 6c 20 6f 6e      (also all on
6280: 20 6f 6e 65 20 6c 69 6e 65 29 3a 0d 0a 20 20 20   one line):..   
6290: 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 20 20     #..      #   
62a0: 20 20 20 20 45 61 67 6c 65 53 68 65 6c 6c 2e 65      EagleShell.e
62b0: 78 65 20 2d 69 6e 69 74 69 61 6c 69 7a 65 20 2d  xe -initialize -
62c0: 70 6f 73 74 49 6e 69 74 69 61 6c 69 7a 65 0d 0a  postInitialize..
62d0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 20 20        #         
62e0: 22 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 49  "object invoke I
62f0: 6e 74 65 72 70 72 65 74 65 72 2e 47 65 74 41 63  nterpreter.GetAc
6300: 74 69 76 65 20 41 64 64 52 75 6e 74 69 6d 65 4f  tive AddRuntimeO
6310: 70 74 69 6f 6e 20 6e 61 74 69 76 65 22 0d 0a 20  ption native".. 
6320: 20 20 20 20 20 23 20 20 20 20 20 20 20 20 20 2d       #         -
6330: 66 69 6c 65 20 2e 5c 70 61 74 68 5c 74 6f 5c 61  file .\path\to\a
6340: 6c 6c 2e 65 61 67 6c 65 0d 0a 20 20 20 20 20 20  ll.eagle..      
6350: 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 6e  #..      if {[in
6360: 66 6f 20 65 78 69 73 74 73 20 3a 3a 62 75 69 6c  fo exists ::buil
6370: 64 5f 64 69 72 65 63 74 6f 72 79 5d 20 26 26 20  d_directory] && 
6380: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 73 74  \..          [st
6390: 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a 62  ring length $::b
63a0: 75 69 6c 64 5f 64 69 72 65 63 74 6f 72 79 5d 20  uild_directory] 
63b0: 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  > 0} then {..   
63c0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
63d0: 23 20 4e 4f 54 45 3a 20 54 68 65 20 6c 6f 63 61  # NOTE: The loca
63e0: 74 69 6f 6e 20 6f 66 20 74 68 65 20 62 75 69 6c  tion of the buil
63f0: 64 20 64 69 72 65 63 74 6f 72 79 20 68 61 73 20  d directory has 
6400: 62 65 65 6e 20 6f 76 65 72 72 69 64 64 65 6e 3b  been overridden;
6410: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
6420: 20 20 74 68 65 72 65 66 6f 72 65 2c 20 75 73 65    therefore, use
6430: 20 69 74 20 76 65 72 62 61 74 69 6d 2e 0d 0a 20   it verbatim... 
6440: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
6450: 20 20 72 65 74 75 72 6e 20 24 3a 3a 62 75 69 6c    return $::buil
6460: 64 5f 64 69 72 65 63 74 6f 72 79 0d 0a 20 20 20  d_directory..   
6470: 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
6480: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
6490: 23 20 4e 4f 54 45 3a 20 49 66 20 74 68 65 20 22  # NOTE: If the "
64a0: 6e 61 74 69 76 65 22 20 72 75 6e 74 69 6d 65 20  native" runtime 
64b0: 6f 70 74 69 6f 6e 20 69 73 20 73 65 74 2c 20 74  option is set, t
64c0: 68 65 20 6d 69 78 65 64 2d 6d 6f 64 65 20 61 73  he mixed-mode as
64d0: 73 65 6d 62 6c 79 0d 0a 20 20 20 20 20 20 20 20  sembly..        
64e0: 23 20 20 20 20 20 20 20 69 73 20 62 65 69 6e 67  #       is being
64f0: 20 74 65 73 74 65 64 2e 20 20 49 6e 20 74 68 61   tested.  In tha
6500: 74 20 63 61 73 65 2c 20 74 68 65 20 70 61 74 68  t case, the path
6510: 20 74 6f 20 74 68 65 20 62 75 69 6c 64 20 64 69   to the build di
6520: 72 65 63 74 6f 72 79 0d 0a 20 20 20 20 20 20 20  rectory..       
6530: 20 23 20 20 20 20 20 20 20 77 69 6c 6c 20 63 6f   #       will co
6540: 6e 74 61 69 6e 20 74 68 65 20 70 6c 61 74 66 6f  ntain the platfo
6550: 72 6d 20 6e 61 6d 65 20 61 6e 64 20 61 6c 6c 20  rm name and all 
6560: 74 68 65 20 62 69 6e 61 72 69 65 73 20 75 6e 64  the binaries und
6570: 65 72 20 74 65 73 74 0d 0a 20 20 20 20 20 20 20  er test..       
6580: 20 23 20 20 20 20 20 20 20 73 68 6f 75 6c 64 20   #       should 
6590: 62 65 20 70 72 65 73 65 6e 74 20 69 6e 20 74 68  be present in th
65a0: 61 74 20 64 69 72 65 63 74 6f 72 79 2e 20 20 49  at directory.  I
65b0: 66 20 74 68 65 20 22 6e 61 74 69 76 65 22 20 72  f the "native" r
65c0: 75 6e 74 69 6d 65 0d 0a 20 20 20 20 20 20 20 20  untime..        
65d0: 23 20 20 20 20 20 20 20 6f 70 74 69 6f 6e 20 69  #       option i
65e0: 73 20 6e 6f 74 20 73 65 74 2c 20 74 68 65 20 62  s not set, the b
65f0: 75 69 6c 64 20 64 69 72 65 63 74 6f 72 79 20 77  uild directory w
6600: 69 6c 6c 20 62 65 20 63 6f 6e 73 69 64 65 72 65  ill be considere
6610: 64 20 74 6f 20 62 65 0d 0a 20 20 20 20 20 20 20  d to be..       
6620: 20 23 20 20 20 20 20 20 20 22 70 6c 61 74 66 6f   #       "platfo
6630: 72 6d 2d 6e 65 75 74 72 61 6c 22 2c 20 77 69 74  rm-neutral", wit
6640: 68 20 74 68 65 20 6e 6f 74 61 62 6c 65 20 65 78  h the notable ex
6650: 63 65 70 74 69 6f 6e 20 6f 66 20 61 6e 79 20 6e  ception of any n
6660: 61 74 69 76 65 0d 0a 20 20 20 20 20 20 20 20 23  ative..        #
6670: 20 20 20 20 20 20 20 61 73 73 65 6d 62 6c 79 20         assembly 
6680: 28 65 2e 67 2e 20 22 53 51 4c 69 74 65 2e 49 6e  (e.g. "SQLite.In
6690: 74 65 72 6f 70 2e 64 6c 6c 22 29 20 63 6f 70 69  terop.dll") copi
66a0: 65 64 20 74 68 65 72 65 20 64 75 72 69 6e 67 20  ed there during 
66b0: 74 68 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20  the..        #  
66c0: 20 20 20 20 20 62 75 69 6c 64 20 70 72 6f 63 65       build proce
66d0: 73 73 20 69 74 73 65 6c 66 2e 20 20 49 66 20 74  ss itself.  If t
66e0: 68 65 20 62 75 69 6c 64 20 70 72 6f 63 65 73 73  he build process
66f0: 20 73 6f 6d 65 68 6f 77 20 64 6f 65 73 20 6e 6f   somehow does no
6700: 74 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  t..        #    
6710: 20 20 20 63 6f 70 79 20 74 68 65 20 6e 61 74 69     copy the nati
6720: 76 65 20 61 73 73 65 6d 62 6c 79 20 66 6f 72 20  ve assembly for 
6730: 74 68 69 73 20 70 6c 61 74 66 6f 72 6d 2c 20 6d  this platform, m
6740: 6f 73 74 20 6f 66 20 74 68 65 20 74 65 73 74 73  ost of the tests
6750: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
6760: 20 20 69 6e 20 74 68 65 20 73 75 69 74 65 20 77    in the suite w
6770: 69 6c 6c 20 73 69 6d 70 6c 79 20 62 65 20 73 6b  ill simply be sk
6780: 69 70 70 65 64 2e 20 20 47 65 6e 65 72 61 6c 6c  ipped.  Generall
6790: 79 20 73 70 65 61 6b 69 6e 67 2c 20 74 68 65 72  y speaking, ther
67a0: 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  e..        #    
67b0: 20 20 20 61 72 65 20 74 77 6f 20 77 61 79 73 20     are two ways 
67c0: 74 6f 20 62 75 69 6c 64 20 74 68 65 20 62 69 6e  to build the bin
67d0: 61 72 69 65 73 20 77 68 65 6e 20 70 72 65 70 61  aries when prepa
67e0: 72 69 6e 67 20 74 6f 20 72 75 6e 20 74 68 65 0d  ring to run the.
67f0: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
6800: 20 74 65 73 74 20 73 75 69 74 65 3a 0d 0a 20 20   test suite:..  
6810: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
6820: 20 23 20 20 20 20 20 20 20 31 2e 20 42 75 69 6c   #       1. Buil
6830: 64 20 74 68 65 20 73 65 70 61 72 61 74 65 20 6d  d the separate m
6840: 61 6e 61 67 65 64 20 61 6e 64 20 6e 61 74 69 76  anaged and nativ
6850: 65 20 61 73 73 65 6d 62 6c 69 65 73 20 75 73 69  e assemblies usi
6860: 6e 67 20 73 6f 6d 65 0d 0a 20 20 20 20 20 20 20  ng some..       
6870: 20 23 20 20 20 20 20 20 20 20 20 20 63 6f 6d 6d   #          comm
6880: 61 6e 64 73 20 73 69 6d 69 6c 61 72 20 74 6f 3a  ands similar to:
6890: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
68a0: 20 20 20 20 20 23 20 20 20 20 20 20 20 20 20 20       #          
68b0: 62 75 69 6c 64 2e 62 61 74 20 24 7b 43 6f 6e 66  build.bat ${Conf
68c0: 69 67 75 72 61 74 69 6f 6e 7d 4d 61 6e 61 67 65  iguration}Manage
68d0: 64 4f 6e 6c 79 20 24 7b 50 6c 61 74 66 6f 72 6d  dOnly ${Platform
68e0: 7d 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  }..        #    
68f0: 20 20 20 20 20 20 62 75 69 6c 64 2e 62 61 74 20        build.bat 
6900: 24 7b 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 7d  ${Configuration}
6910: 4e 61 74 69 76 65 4f 6e 6c 79 20 24 7b 50 6c 61  NativeOnly ${Pla
6920: 74 66 6f 72 6d 7d 0d 0a 20 20 20 20 20 20 20 20  tform}..        
6930: 23 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  #..        #    
6940: 20 20 20 20 20 20 57 68 65 72 65 20 24 7b 43 6f        Where ${Co
6950: 6e 66 69 67 75 72 61 74 69 6f 6e 7d 20 69 73 20  nfiguration} is 
6960: 65 69 74 68 65 72 20 22 44 65 62 75 67 22 20 6f  either "Debug" o
6970: 72 20 22 52 65 6c 65 61 73 65 22 20 61 6e 64 0d  r "Release" and.
6980: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
6990: 20 20 20 20 24 7b 50 6c 61 74 66 6f 72 6d 7d 20      ${Platform} 
69a0: 69 73 20 65 69 74 68 65 72 20 22 57 69 6e 33 32  is either "Win32
69b0: 22 20 6f 72 20 22 78 36 34 22 2e 0d 0a 20 20 20  " or "x64"...   
69c0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
69d0: 23 20 20 20 20 20 20 20 32 2e 20 42 75 69 6c 64  #       2. Build
69e0: 20 74 68 65 20 6d 69 78 65 64 2d 6d 6f 64 65 20   the mixed-mode 
69f0: 61 73 73 65 6d 62 6c 79 20 75 73 69 6e 67 20 61  assembly using a
6a00: 20 63 6f 6d 6d 61 6e 64 20 73 69 6d 69 6c 61 72   command similar
6a10: 20 74 6f 3a 0d 0a 20 20 20 20 20 20 20 20 23 0d   to:..        #.
6a20: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
6a30: 20 20 20 20 62 75 69 6c 64 2e 62 61 74 20 24 7b      build.bat ${
6a40: 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 7d 20 24  Configuration} $
6a50: 7b 50 6c 61 74 66 6f 72 6d 7d 0d 0a 20 20 20 20  {Platform}..    
6a60: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
6a70: 20 20 20 20 20 20 20 20 20 20 57 68 65 72 65 20            Where 
6a80: 24 7b 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 7d  ${Configuration}
6a90: 20 69 73 20 65 69 74 68 65 72 20 22 44 65 62 75   is either "Debu
6aa0: 67 22 20 6f 72 20 22 52 65 6c 65 61 73 65 22 20  g" or "Release" 
6ab0: 61 6e 64 0d 0a 20 20 20 20 20 20 20 20 23 20 20  and..        #  
6ac0: 20 20 20 20 20 20 20 20 24 7b 50 6c 61 74 66 6f          ${Platfo
6ad0: 72 6d 7d 20 69 73 20 65 69 74 68 65 72 20 22 57  rm} is either "W
6ae0: 69 6e 33 32 22 20 6f 72 20 22 78 36 34 22 2e 20  in32" or "x64". 
6af0: 20 49 66 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64   If this command
6b00: 20 69 73 0d 0a 20 20 20 20 20 20 20 20 23 20 20   is..        #  
6b10: 20 20 20 20 20 20 20 20 75 73 65 64 2c 20 76 61          used, va
6b20: 72 69 6f 75 73 20 74 65 73 74 73 20 74 68 61 74  rious tests that
6b30: 20 72 65 71 75 69 72 65 20 73 75 70 70 6c 65 6d   require supplem
6b40: 65 6e 74 61 72 79 20 6d 61 6e 61 67 65 64 0d 0a  entary managed..
6b50: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
6b60: 20 20 20 61 73 73 65 6d 62 6c 69 65 73 20 28 65     assemblies (e
6b70: 2e 67 2e 20 4c 49 4e 51 29 20 6d 61 79 20 62 65  .g. LINQ) may be
6b80: 20 73 6b 69 70 70 65 64 20 75 6e 6c 65 73 73 20   skipped unless 
6b90: 74 68 6f 73 65 20 62 69 6e 61 72 69 65 73 0d 0a  those binaries..
6ba0: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
6bb0: 20 20 20 61 72 65 20 73 75 62 73 65 71 75 65 6e     are subsequen
6bc0: 74 6c 79 20 63 6f 70 69 65 64 20 69 6e 74 6f 20  tly copied into 
6bd0: 74 68 65 20 63 6f 72 72 65 63 74 20 64 69 72 65  the correct dire
6be0: 63 74 6f 72 79 20 28 69 2e 65 2e 20 62 79 0d 0a  ctory (i.e. by..
6bf0: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
6c00: 20 20 20 22 74 65 73 74 5f 61 6c 6c 2e 62 61 74     "test_all.bat
6c10: 22 29 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  ")...        #..
6c20: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
6c30: 4e 6f 74 65 20 74 68 61 74 20 61 6c 6c 20 6f 66  Note that all of
6c40: 20 74 68 65 20 62 75 69 6c 64 20 63 6f 6d 6d 61   the build comma
6c50: 6e 64 73 20 61 62 6f 76 65 20 77 69 6c 6c 20 64  nds above will d
6c60: 65 66 61 75 6c 74 20 74 6f 20 75 73 69 6e 67 0d  efault to using.
6c70: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
6c80: 20 74 68 65 20 6c 61 74 65 73 74 20 76 65 72 73   the latest vers
6c90: 69 6f 6e 20 6f 66 20 4d 53 42 75 69 6c 64 20 61  ion of MSBuild a
6ca0: 76 61 69 6c 61 62 6c 65 20 61 6e 64 20 74 68 65  vailable and the
6cb0: 20 22 74 65 73 74 5f 79 65 61 72 22 20 6d 61 79   "test_year" may
6cc0: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
6cd0: 20 20 6e 65 65 64 20 74 6f 20 62 65 20 61 64 6a    need to be adj
6ce0: 75 73 74 65 64 20 61 63 63 6f 72 64 69 6e 67 6c  usted accordingl
6cf0: 79 20 74 6f 20 61 63 74 75 61 6c 6c 79 20 72 75  y to actually ru
6d00: 6e 20 74 68 65 20 74 65 73 74 20 73 75 69 74 65  n the test suite
6d10: 2e 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  ...        #    
6d20: 20 20 20 52 65 66 65 72 20 74 6f 20 74 68 65 20     Refer to the 
6d30: 63 6f 6d 6d 65 6e 74 73 20 69 6e 20 5b 67 65 74  comments in [get
6d40: 42 75 69 6c 64 59 65 61 72 5d 20 66 6f 72 20 6d  BuildYear] for m
6d50: 6f 72 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ore information 
6d60: 6f 6e 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  on..        #   
6d70: 20 20 20 20 68 6f 77 20 74 6f 20 73 65 74 20 74      how to set t
6d80: 68 69 73 20 76 61 72 69 61 62 6c 65 2e 0d 0a 20  his variable... 
6d90: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
6da0: 20 20 73 65 74 20 6e 61 74 69 76 65 20 5b 68 61    set native [ha
6db0: 73 52 75 6e 74 69 6d 65 4f 70 74 69 6f 6e 20 6e  sRuntimeOption n
6dc0: 61 74 69 76 65 5d 0d 0a 0d 0a 20 20 20 20 20 20  ative]....      
6dd0: 20 20 72 65 74 75 72 6e 20 5b 6a 6f 69 6e 42 75    return [joinBu
6de0: 69 6c 64 44 69 72 65 63 74 6f 72 79 20 24 6e 61  ildDirectory $na
6df0: 74 69 76 65 20 5b 67 65 74 42 75 69 6c 64 42 61  tive [getBuildBa
6e00: 73 65 44 69 72 65 63 74 6f 72 79 5d 20 5c 0d 0a  seDirectory] \..
6e10: 20 20 20 20 20 20 20 20 20 20 20 20 5b 67 65 74              [get
6e20: 42 75 69 6c 64 59 65 61 72 5d 20 5b 67 65 74 42  BuildYear] [getB
6e30: 75 69 6c 64 50 6c 61 74 66 6f 72 6d 20 24 6e 61  uildPlatform $na
6e40: 74 69 76 65 5d 20 5b 67 65 74 42 75 69 6c 64 43  tive] [getBuildC
6e50: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 5d 5d 0d 0a  onfiguration]]..
6e60: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a        }..    }..
6e70: 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74 52  ...    proc getR
6e80: 65 6c 65 61 73 65 56 65 72 73 69 6f 6e 20 7b 7d  eleaseVersion {}
6e90: 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20   {..      #..   
6ea0: 20 20 20 23 20 4e 4f 54 45 3a 20 46 69 67 75 72     # NOTE: Figur
6eb0: 65 20 6f 75 74 20 74 68 65 20 72 65 6c 65 61 73  e out the releas
6ec0: 65 20 76 65 72 73 69 6f 6e 20 66 6f 72 20 75 73  e version for us
6ed0: 65 20 77 69 74 68 20 74 68 65 20 62 75 69 6c 64  e with the build
6ee0: 20 64 69 72 65 63 74 6f 72 79 0d 0a 20 20 20 20   directory..    
6ef0: 20 20 23 20 20 20 20 20 20 20 77 68 65 6e 20 63    #       when c
6f00: 68 65 63 6b 69 6e 67 20 66 6f 72 20 61 76 61 69  hecking for avai
6f10: 6c 61 62 6c 65 20 72 65 6c 65 61 73 65 73 2e 0d  lable releases..
6f20: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
6f30: 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73  if {[info exists
6f40: 20 3a 3a 72 65 6c 65 61 73 65 5f 76 65 72 73 69   ::release_versi
6f50: 6f 6e 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20  on] && \..      
6f60: 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67      [string leng
6f70: 74 68 20 24 3a 3a 72 65 6c 65 61 73 65 5f 76 65  th $::release_ve
6f80: 72 73 69 6f 6e 5d 20 3e 20 30 7d 20 74 68 65 6e  rsion] > 0} then
6f90: 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20   {..        #.. 
6fa0: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54         # NOTE: T
6fb0: 68 65 20 72 65 6c 65 61 73 65 20 76 65 72 73 69  he release versi
6fc0: 6f 6e 20 68 61 73 20 62 65 65 6e 20 6f 76 65 72  on has been over
6fd0: 72 69 64 64 65 6e 3b 20 74 68 65 72 65 66 6f 72  ridden; therefor
6fe0: 65 2c 20 75 73 65 20 69 74 0d 0a 20 20 20 20 20  e, use it..     
6ff0: 20 20 20 23 20 20 20 20 20 20 20 76 65 72 62 61     #       verba
7000: 74 69 6d 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  tim...        #.
7010: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
7020: 24 3a 3a 72 65 6c 65 61 73 65 5f 76 65 72 73 69  $::release_versi
7030: 6f 6e 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65  on..      } else
7040: 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20   {..        #.. 
7050: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4e         # NOTE: N
7060: 6f 20 72 65 6c 65 61 73 65 20 76 65 72 73 69 6f  o release versio
7070: 6e 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2c 20  n is available, 
7080: 72 65 74 75 72 6e 20 61 6e 20 65 6d 70 74 79 20  return an empty 
7090: 73 74 72 69 6e 67 2e 0d 0a 20 20 20 20 20 20 20  string...       
70a0: 20 23 20 20 20 20 20 20 20 49 74 20 69 73 20 69   #       It is i
70b0: 6d 70 6f 72 74 61 6e 74 20 74 6f 20 72 65 74 75  mportant to retu
70c0: 72 6e 20 61 6e 20 65 6d 70 74 79 20 73 74 72 69  rn an empty stri
70d0: 6e 67 20 68 65 72 65 20 62 65 63 61 75 73 65 20  ng here because 
70e0: 74 68 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20  the..        #  
70f0: 20 20 20 20 20 72 65 73 75 6c 74 20 6f 66 20 74       result of t
7100: 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 6d 61  his procedure ma
7110: 79 20 62 65 20 75 73 65 64 20 77 69 74 68 20 5b  y be used with [
7120: 66 69 6c 65 20 6a 6f 69 6e 5d 2e 0d 0a 20 20 20  file join]...   
7130: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
7140: 72 65 74 75 72 6e 20 22 22 0d 0a 20 20 20 20 20  return ""..     
7150: 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20   }..    }.....  
7160: 20 20 70 72 6f 63 20 67 65 74 42 75 69 6c 64 46    proc getBuildF
7170: 69 6c 65 4e 61 6d 65 20 7b 20 66 69 6c 65 4e 61  ileName { fileNa
7180: 6d 65 20 7b 70 6c 61 74 66 6f 72 6d 20 22 22 7d  me {platform ""}
7190: 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20   } {..      #.. 
71a0: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 52 65 74       # NOTE: Ret
71b0: 75 72 6e 73 20 74 68 65 20 73 70 65 63 69 66 69  urns the specifi
71c0: 65 64 20 66 69 6c 65 20 6e 61 6d 65 20 61 73 20  ed file name as 
71d0: 69 66 20 69 74 20 77 65 72 65 20 6c 6f 63 61 74  if it were locat
71e0: 65 64 20 69 6e 20 74 68 65 0d 0a 20 20 20 20 20  ed in the..     
71f0: 20 23 20 20 20 20 20 20 20 62 75 69 6c 64 20 64   #       build d
7200: 69 72 65 63 74 6f 72 79 2c 20 64 69 73 63 61 72  irectory, discar
7210: 64 69 6e 67 20 61 6e 79 20 64 69 72 65 63 74 6f  ding any directo
7220: 72 79 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 70  ry information p
7230: 72 65 73 65 6e 74 0d 0a 20 20 20 20 20 20 23 20  resent..      # 
7240: 20 20 20 20 20 20 69 6e 20 74 68 65 20 66 69 6c        in the fil
7250: 65 20 6e 61 6d 65 20 61 73 20 70 72 6f 76 69 64  e name as provid
7260: 65 64 20 62 79 20 6f 75 72 20 63 61 6c 6c 65 72  ed by our caller
7270: 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
7280: 20 20 73 65 74 20 72 65 73 75 6c 74 20 5b 66 69    set result [fi
7290: 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65 20 5c 0d  le nativename \.
72a0: 0a 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65  .          [file
72b0: 20 6a 6f 69 6e 20 5b 67 65 74 42 75 69 6c 64 44   join [getBuildD
72c0: 69 72 65 63 74 6f 72 79 5d 20 24 70 6c 61 74 66  irectory] $platf
72d0: 6f 72 6d 20 5b 66 69 6c 65 20 74 61 69 6c 20 24  orm [file tail $
72e0: 66 69 6c 65 4e 61 6d 65 5d 5d 5d 0d 0a 0d 0a 20  fileName]]].... 
72f0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
7300: 48 41 43 4b 3a 20 57 68 65 6e 20 72 75 6e 6e 69  HACK: When runni
7310: 6e 67 20 6f 6e 20 57 6f 57 36 34 2c 20 61 73 73  ng on WoW64, ass
7320: 75 6d 65 20 74 68 65 20 74 65 73 74 20 65 78 65  ume the test exe
7330: 63 75 74 61 62 6c 65 73 20 61 72 65 20 70 72 65  cutables are pre
7340: 73 65 6e 74 0d 0a 20 20 20 20 20 20 23 20 20 20  sent..      #   
7350: 20 20 20 20 77 69 74 68 20 74 68 65 20 22 33 32      with the "32
7360: 22 20 73 75 66 66 69 78 20 6f 6e 20 74 68 65 6d  " suffix on them
7370: 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
7380: 20 20 69 66 20 7b 5b 69 73 52 75 6e 6e 69 6e 67    if {[isRunning
7390: 57 6f 57 36 34 5d 20 26 26 20 5b 66 69 6c 65 20  WoW64] && [file 
73a0: 65 78 74 65 6e 73 69 6f 6e 20 24 72 65 73 75 6c  extension $resul
73b0: 74 5d 20 65 71 20 22 2e 65 78 65 22 7d 20 74 68  t] eq ".exe"} th
73c0: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 65  en {..        se
73d0: 74 20 72 65 73 75 6c 74 20 5b 61 70 70 65 6e 64  t result [append
73e0: 41 72 67 73 20 5b 66 69 6c 65 20 72 6f 6f 74 6e  Args [file rootn
73f0: 61 6d 65 20 24 72 65 73 75 6c 74 5d 20 33 32 2e  ame $result] 32.
7400: 65 78 65 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d  exe]..      }...
7410: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 72  .      return $r
7420: 65 73 75 6c 74 0d 0a 20 20 20 20 7d 0d 0a 0c 0d  esult..    }....
7430: 0a 20 20 20 20 70 72 6f 63 20 67 65 74 45 78 74  .    proc getExt
7440: 65 72 6e 61 6c 44 69 72 65 63 74 6f 72 79 20 7b  ernalDirectory {
7450: 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  } {..      #..  
7460: 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 69 73      # NOTE: This
7470: 20 70 72 6f 63 65 64 75 72 65 20 72 65 74 75 72   procedure retur
7480: 6e 73 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  ns the directory
7490: 20 77 68 65 72 65 20 74 68 65 20 65 78 74 65 72   where the exter
74a0: 6e 61 6c 20 62 69 6e 61 72 79 0d 0a 20 20 20 20  nal binary..    
74b0: 20 20 23 20 20 20 20 20 20 20 66 69 6c 65 73 20    #       files 
74c0: 61 72 65 20 6c 6f 63 61 74 65 64 2e 0d 0a 20 20  are located...  
74d0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 72 65 74      #..      ret
74e0: 75 72 6e 20 5b 66 69 6c 65 20 6e 61 74 69 76 65  urn [file native
74f0: 6e 61 6d 65 20 5b 66 69 6c 65 20 64 69 72 6e 61  name [file dirna
7500: 6d 65 20 5b 66 69 6c 65 20 64 69 72 6e 61 6d 65  me [file dirname
7510: 20 5b 69 6e 66 6f 20 62 69 6e 61 72 79 5d 5d 5d   [info binary]]]
7520: 5d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  ]..    }.....   
7530: 20 70 72 6f 63 20 67 65 74 42 69 6e 61 72 79 44   proc getBinaryD
7540: 69 72 65 63 74 6f 72 79 20 7b 7d 20 7b 0d 0a 20  irectory {} {.. 
7550: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
7560: 4e 4f 54 45 3a 20 54 68 69 73 20 70 72 6f 63 65  NOTE: This proce
7570: 64 75 72 65 20 72 65 74 75 72 6e 73 20 74 68 65  dure returns the
7580: 20 64 69 72 65 63 74 6f 72 79 20 77 68 65 72 65   directory where
7590: 20 74 68 65 20 74 65 73 74 20 61 70 70 6c 69 63   the test applic
75a0: 61 74 69 6f 6e 0d 0a 20 20 20 20 20 20 23 20 20  ation..      #  
75b0: 20 20 20 20 20 69 74 73 65 6c 66 20 28 69 2e 65       itself (i.e
75c0: 2e 20 74 68 65 20 45 61 67 6c 65 20 73 68 65 6c  . the Eagle shel
75d0: 6c 29 20 69 73 20 6c 6f 63 61 74 65 64 2e 20 20  l) is located.  
75e0: 54 68 69 73 20 77 69 6c 6c 20 62 65 20 75 73 65  This will be use
75f0: 64 20 61 73 0d 0a 20 20 20 20 20 20 23 20 20 20  d as..      #   
7600: 20 20 20 20 74 68 65 20 64 65 73 74 69 6e 61 74      the destinat
7610: 69 6f 6e 20 66 6f 72 20 74 68 65 20 63 6f 70 69  ion for the copi
7620: 65 64 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53  ed System.Data.S
7630: 51 4c 69 74 65 20 6e 61 74 69 76 65 20 61 6e 64  QLite native and
7640: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
7650: 6d 61 6e 61 67 65 64 20 61 73 73 65 6d 62 6c 69  managed assembli
7660: 65 73 20 28 69 2e 65 2e 20 62 65 63 61 75 73 65  es (i.e. because
7670: 20 74 68 69 73 20 69 73 20 6f 6e 65 20 6f 66 20   this is one of 
7680: 74 68 65 20 66 65 77 20 70 6c 61 63 65 73 0d 0a  the few places..
7690: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 77 68        #       wh
76a0: 65 72 65 20 74 68 65 20 43 4c 52 20 77 69 6c 6c  ere the CLR will
76b0: 20 61 63 74 75 61 6c 6c 79 20 66 69 6e 64 20 61   actually find a
76c0: 6e 64 20 6c 6f 61 64 20 74 68 65 6d 20 70 72 6f  nd load them pro
76d0: 70 65 72 6c 79 29 2e 0d 0a 20 20 20 20 20 20 23  perly)...      #
76e0: 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66  ..      if {[inf
76f0: 6f 20 65 78 69 73 74 73 20 3a 3a 62 69 6e 61 72  o exists ::binar
7700: 79 5f 64 69 72 65 63 74 6f 72 79 5d 20 26 26 20  y_directory] && 
7710: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 73 74  \..          [st
7720: 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a 62  ring length $::b
7730: 69 6e 61 72 79 5f 64 69 72 65 63 74 6f 72 79 5d  inary_directory]
7740: 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20   > 0} then {..  
7750: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
7760: 20 23 20 4e 4f 54 45 3a 20 54 68 65 20 6c 6f 63   # NOTE: The loc
7770: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 62 69 6e  ation of the bin
7780: 61 72 79 20 64 69 72 65 63 74 6f 72 79 20 68 61  ary directory ha
7790: 73 20 62 65 65 6e 20 6f 76 65 72 72 69 64 64 65  s been overridde
77a0: 6e 3b 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  n;..        #   
77b0: 20 20 20 20 74 68 65 72 65 66 6f 72 65 2c 20 75      therefore, u
77c0: 73 65 20 69 74 20 76 65 72 62 61 74 69 6d 2e 0d  se it verbatim..
77d0: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
77e0: 20 20 20 20 72 65 74 75 72 6e 20 24 3a 3a 62 69      return $::bi
77f0: 6e 61 72 79 5f 64 69 72 65 63 74 6f 72 79 0d 0a  nary_directory..
7800: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
7810: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b          return [
7820: 69 6e 66 6f 20 62 69 6e 61 72 79 5d 0d 0a 20 20  info binary]..  
7830: 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d      }..    }....
7840: 0a 20 20 20 20 70 72 6f 63 20 67 65 74 45 78 74  .    proc getExt
7850: 65 72 6e 61 6c 46 69 6c 65 4e 61 6d 65 20 7b 20  ernalFileName { 
7860: 66 69 6c 65 4e 61 6d 65 20 7d 20 7b 0d 0a 20 20  fileName } {..  
7870: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
7880: 4f 54 45 3a 20 52 65 74 75 72 6e 73 20 74 68 65  OTE: Returns the
7890: 20 73 70 65 63 69 66 69 65 64 20 66 69 6c 65 20   specified file 
78a0: 6e 61 6d 65 20 61 73 20 69 66 20 69 74 20 77 65  name as if it we
78b0: 72 65 20 6c 6f 63 61 74 65 64 20 69 6e 20 74 68  re located in th
78c0: 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  e..      #      
78d0: 20 64 69 72 65 63 74 6f 72 79 20 63 6f 6e 74 61   directory conta
78e0: 69 6e 69 6e 67 20 74 68 65 20 65 78 74 65 72 6e  ining the extern
78f0: 61 6c 20 62 69 6e 61 72 69 65 73 2e 0d 0a 20 20  al binaries...  
7900: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 72 65 74      #..      ret
7910: 75 72 6e 20 5b 66 69 6c 65 20 6e 61 74 69 76 65  urn [file native
7920: 6e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20  name [file join 
7930: 5b 67 65 74 45 78 74 65 72 6e 61 6c 44 69 72 65  [getExternalDire
7940: 63 74 6f 72 79 5d 20 24 66 69 6c 65 4e 61 6d 65  ctory] $fileName
7950: 5d 5d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20  ]]..    }.....  
7960: 20 20 70 72 6f 63 20 67 65 74 42 69 6e 61 72 79    proc getBinary
7970: 46 69 6c 65 4e 61 6d 65 20 7b 20 66 69 6c 65 4e  FileName { fileN
7980: 61 6d 65 20 7b 70 6c 61 74 66 6f 72 6d 20 22 22  ame {platform ""
7990: 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a  } } {..      #..
79a0: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 52 65        # NOTE: Re
79b0: 74 75 72 6e 73 20 74 68 65 20 73 70 65 63 69 66  turns the specif
79c0: 69 65 64 20 66 69 6c 65 20 6e 61 6d 65 20 61 73  ied file name as
79d0: 20 69 66 20 69 74 20 77 65 72 65 20 6c 6f 63 61   if it were loca
79e0: 74 65 64 20 69 6e 20 74 68 65 0d 0a 20 20 20 20  ted in the..    
79f0: 20 20 23 20 20 20 20 20 20 20 62 69 6e 61 72 79    #       binary
7a00: 20 64 69 72 65 63 74 6f 72 79 2c 20 64 69 73 63   directory, disc
7a10: 61 72 64 69 6e 67 20 61 6e 79 20 64 69 72 65 63  arding any direc
7a20: 74 6f 72 79 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  tory information
7a30: 20 70 72 65 73 65 6e 74 0d 0a 20 20 20 20 20 20   present..      
7a40: 23 20 20 20 20 20 20 20 69 6e 20 74 68 65 20 66  #       in the f
7a50: 69 6c 65 20 6e 61 6d 65 20 61 73 20 70 72 6f 76  ile name as prov
7a60: 69 64 65 64 20 62 79 20 6f 75 72 20 63 61 6c 6c  ided by our call
7a70: 65 72 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  er...      #..  
7a80: 20 20 20 20 72 65 74 75 72 6e 20 5b 66 69 6c 65      return [file
7a90: 20 6e 61 74 69 76 65 6e 61 6d 65 20 5c 0d 0a 20   nativename \.. 
7aa0: 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20 6a           [file j
7ab0: 6f 69 6e 20 5b 67 65 74 42 69 6e 61 72 79 44 69  oin [getBinaryDi
7ac0: 72 65 63 74 6f 72 79 5d 20 24 70 6c 61 74 66 6f  rectory] $platfo
7ad0: 72 6d 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 66  rm [file tail $f
7ae0: 69 6c 65 4e 61 6d 65 5d 5d 5d 0d 0a 20 20 20 20  ileName]]]..    
7af0: 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67  }.....    proc g
7b00: 65 74 43 6f 72 65 42 69 6e 61 72 79 46 69 6c 65  etCoreBinaryFile
7b10: 4e 61 6d 65 20 7b 20 7b 70 6c 61 74 66 6f 72 6d  Name { {platform
7b20: 20 22 22 7d 20 7b 73 74 61 6e 64 61 72 64 20 22   ""} {standard "
7b30: 22 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d  "} } {..      #.
7b40: 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 52  .      # NOTE: R
7b50: 65 74 75 72 6e 73 20 74 68 65 20 66 75 6c 6c 20  eturns the full 
7b60: 70 61 74 68 20 66 6f 72 20 74 68 65 20 66 69 6c  path for the fil
7b70: 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  e containing the
7b80: 20 53 51 4c 69 74 65 20 63 6f 72 65 0d 0a 20 20   SQLite core..  
7b90: 20 20 20 20 23 20 20 20 20 20 20 20 6e 61 74 69      #       nati
7ba0: 76 65 20 6c 69 62 72 61 72 79 20 63 6f 64 65 20  ve library code 
7bb0: 66 6f 72 20 74 68 69 73 20 70 6c 61 74 66 6f 72  for this platfor
7bc0: 6d 2e 20 20 46 69 72 73 74 2c 20 63 68 65 63 6b  m.  First, check
7bd0: 20 61 6e 64 20 73 65 65 20 69 66 0d 0a 20 20 20   and see if..   
7be0: 20 20 20 23 20 20 20 20 20 20 20 74 68 65 20 53     #       the S
7bf0: 51 4c 69 74 65 20 63 6f 72 65 20 6e 61 74 69 76  QLite core nativ
7c00: 65 20 6c 69 62 72 61 72 79 20 68 61 73 20 61 6c  e library has al
7c10: 72 65 61 64 79 20 62 65 65 6e 20 6c 6f 61 64 65  ready been loade
7c20: 64 2e 20 20 4e 65 78 74 2c 0d 0a 20 20 20 20 20  d.  Next,..     
7c30: 20 23 20 20 20 20 20 20 20 66 61 6c 6c 62 61 63   #       fallbac
7c40: 6b 20 74 6f 20 77 68 61 74 20 74 68 65 20 66 75  k to what the fu
7c50: 6c 6c 20 70 61 74 68 20 73 68 6f 75 6c 64 20 62  ll path should b
7c60: 65 2c 20 62 61 73 65 64 20 6f 6e 20 77 68 65 74  e, based on whet
7c70: 68 65 72 20 74 68 65 0d 0a 20 20 20 20 20 20 23  her the..      #
7c80: 20 20 20 20 20 20 20 6d 69 78 65 64 2d 6d 6f 64         mixed-mod
7c90: 65 20 61 73 73 65 6d 62 6c 79 20 69 73 20 62 65  e assembly is be
7ca0: 69 6e 67 20 75 73 65 64 20 61 6e 64 20 74 68 65  ing used and the
7cb0: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 63 75 72   name of the cur
7cc0: 72 65 6e 74 0d 0a 20 20 20 20 20 20 23 20 20 20  rent..      #   
7cd0: 20 20 20 20 70 6c 61 74 66 6f 72 6d 2e 0d 0a 20      platform... 
7ce0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66       #..      if
7cf0: 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20   {[catch {..    
7d00: 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b      object invok
7d10: 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62  e -flags +NonPub
7d20: 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  lic \..         
7d30: 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53     System.Data.S
7d40: 51 4c 69 74 65 2e 55 6e 73 61 66 65 4e 61 74 69  QLite.UnsafeNati
7d50: 76 65 4d 65 74 68 6f 64 73 20 5f 53 51 4c 69 74  veMethods _SQLit
7d60: 65 4e 61 74 69 76 65 4d 6f 64 75 6c 65 46 69 6c  eNativeModuleFil
7d70: 65 4e 61 6d 65 0d 0a 20 20 20 20 20 20 7d 20 66  eName..      } f
7d80: 69 6c 65 4e 61 6d 65 5d 20 3d 3d 20 30 20 26 26  ileName] == 0 &&
7d90: 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20   [string length 
7da0: 24 66 69 6c 65 4e 61 6d 65 5d 20 3e 20 30 7d 20  $fileName] > 0} 
7db0: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
7dc0: 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
7dd0: 45 3a 20 54 68 65 20 53 51 4c 69 74 65 20 63 6f  E: The SQLite co
7de0: 72 65 20 6e 61 74 69 76 65 20 6c 69 62 72 61 72  re native librar
7df0: 79 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  y has already be
7e00: 65 6e 20 6c 6f 61 64 65 64 20 76 69 61 0d 0a 20  en loaded via.. 
7e10: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74         #       t
7e20: 68 65 20 6e 61 74 69 76 65 20 6c 69 62 72 61 72  he native librar
7e30: 79 20 70 72 65 2d 6c 6f 61 64 65 72 2e 20 20 52  y pre-loader.  R
7e40: 65 74 75 72 6e 20 74 68 61 74 20 66 69 6c 65 20  eturn that file 
7e50: 6e 61 6d 65 20 6e 6f 77 2e 0d 0a 20 20 20 20 20  name now...     
7e60: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65     #..        re
7e70: 74 75 72 6e 20 24 66 69 6c 65 4e 61 6d 65 0d 0a  turn $fileName..
7e80: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
7e90: 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
7ea0: 3a 20 49 66 20 74 68 65 20 22 6e 61 74 69 76 65  : If the "native
7eb0: 22 20 72 75 6e 74 69 6d 65 20 6f 70 74 69 6f 6e  " runtime option
7ec0: 20 68 61 73 20 62 65 65 6e 20 73 65 74 2c 20 61   has been set, a
7ed0: 6c 77 61 79 73 20 72 65 74 75 72 6e 20 74 68 65  lways return the
7ee0: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
7ef0: 66 69 6c 65 20 6e 61 6d 65 20 66 6f 72 20 74 68  file name for th
7f00: 65 20 6d 69 78 65 64 2d 6d 6f 64 65 20 61 73 73  e mixed-mode ass
7f10: 65 6d 62 6c 79 2e 0d 0a 20 20 20 20 20 20 23 0d  embly...      #.
7f20: 0a 20 20 20 20 20 20 69 66 20 7b 5b 68 61 73 52  .      if {[hasR
7f30: 75 6e 74 69 6d 65 4f 70 74 69 6f 6e 20 6e 61 74  untimeOption nat
7f40: 69 76 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ive]} then {..  
7f50: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
7f60: 20 23 20 4e 4f 54 45 3a 20 52 65 74 75 72 6e 20   # NOTE: Return 
7f70: 74 68 65 20 6d 69 78 65 64 2d 6d 6f 64 65 20 61  the mixed-mode a
7f80: 73 73 65 6d 62 6c 79 20 66 69 6c 65 20 6e 61 6d  ssembly file nam
7f90: 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  e...        #.. 
7fa0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b 66         return [f
7fb0: 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65 20 5c  ile nativename \
7fc0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 66  ..            [f
7fd0: 69 6c 65 20 6a 6f 69 6e 20 5b 67 65 74 42 69 6e  ile join [getBin
7fe0: 61 72 79 44 69 72 65 63 74 6f 72 79 5d 20 24 70  aryDirectory] $p
7ff0: 6c 61 74 66 6f 72 6d 20 53 79 73 74 65 6d 2e 44  latform System.D
8000: 61 74 61 2e 53 51 4c 69 74 65 2e 64 6c 6c 5d 5d  ata.SQLite.dll]]
8010: 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
8020: 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
8030: 54 45 3a 20 41 72 65 20 77 65 20 61 74 74 65 6d  TE: Are we attem
8040: 70 74 69 6e 67 20 74 6f 20 61 75 74 6f 6d 61 74  pting to automat
8050: 69 63 61 6c 6c 79 20 64 65 74 65 63 74 20 77 68  ically detect wh
8060: 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65  ether or not the
8070: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
8080: 69 6e 74 65 72 6f 70 20 61 73 73 65 6d 62 6c 79  interop assembly
8090: 20 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64 3f   should be used?
80a0: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
80b0: 20 73 65 74 20 61 75 74 6f 6d 61 74 69 63 20 5b   set automatic [
80c0: 65 78 70 72 20 7b 5b 73 74 72 69 6e 67 20 6c 65  expr {[string le
80d0: 6e 67 74 68 20 24 73 74 61 6e 64 61 72 64 5d 20  ngth $standard] 
80e0: 3d 3d 20 30 7d 5d 0d 0a 0d 0a 20 20 20 20 20 20  == 0}]....      
80f0: 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
8100: 20 46 69 72 73 74 2c 20 69 6e 20 65 69 74 68 65   First, in eithe
8110: 72 20 22 61 75 74 6f 6d 61 74 69 63 22 20 6f 72  r "automatic" or
8120: 20 22 6e 6f 6e 2d 73 74 61 6e 64 61 72 64 22 20   "non-standard" 
8130: 6d 6f 64 65 73 2c 20 61 74 74 65 6d 70 74 0d 0a  modes, attempt..
8140: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74 6f        #       to
8150: 20 66 69 6e 64 20 74 68 65 20 6e 61 74 69 76 65   find the native
8160: 2d 6f 6e 6c 79 20 69 6e 74 65 72 6f 70 20 61 73  -only interop as
8170: 73 65 6d 62 6c 79 2e 0d 0a 20 20 20 20 20 20 23  sembly...      #
8180: 0d 0a 20 20 20 20 20 20 69 66 20 7b 24 61 75 74  ..      if {$aut
8190: 6f 6d 61 74 69 63 20 7c 7c 20 21 24 73 74 61 6e  omatic || !$stan
81a0: 64 61 72 64 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  dard} then {..  
81b0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
81c0: 20 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74   # NOTE: Attempt
81d0: 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68   to determine th
81e0: 65 20 6e 61 74 69 76 65 2d 6f 6e 6c 79 20 69 6e  e native-only in
81f0: 74 65 72 6f 70 20 61 73 73 65 6d 62 6c 79 20 66  terop assembly f
8200: 69 6c 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20  ile..        #  
8210: 20 20 20 20 20 6e 61 6d 65 20 66 6f 72 20 74 68       name for th
8220: 69 73 20 70 6c 61 74 66 6f 72 6d 20 61 6e 64 20  is platform and 
8230: 74 68 65 6e 20 72 65 74 75 72 6e 20 69 74 2e 0d  then return it..
8240: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
8250: 20 20 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65      foreach file
8260: 4e 61 6d 65 4f 6e 6c 79 20 5b 67 65 74 49 6e 74  NameOnly [getInt
8270: 65 72 6f 70 41 73 73 65 6d 62 6c 79 46 69 6c 65  eropAssemblyFile
8280: 4e 61 6d 65 73 4f 6e 6c 79 5d 20 7b 0d 0a 20 20  NamesOnly] {..  
8290: 20 20 20 20 20 20 20 20 73 65 74 20 66 69 6c 65          set file
82a0: 4e 61 6d 65 20 5b 66 69 6c 65 20 6e 61 74 69 76  Name [file nativ
82b0: 65 6e 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20 20  ename \..       
82c0: 20 20 20 20 20 20 20 5b 66 69 6c 65 20 6a 6f 69         [file joi
82d0: 6e 20 5b 67 65 74 42 69 6e 61 72 79 44 69 72 65  n [getBinaryDire
82e0: 63 74 6f 72 79 5d 20 24 70 6c 61 74 66 6f 72 6d  ctory] $platform
82f0: 20 24 66 69 6c 65 4e 61 6d 65 4f 6e 6c 79 5d 5d   $fileNameOnly]]
8300: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66  ....          if
8310: 20 7b 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24   {[file exists $
8320: 66 69 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20  fileName]} then 
8330: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  {..            r
8340: 65 74 75 72 6e 20 24 66 69 6c 65 4e 61 6d 65 0d  eturn $fileName.
8350: 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  .          }..  
8360: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d        }..      }
8370: 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  ....      #..   
8380: 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 65 6e 2c     # NOTE: Then,
8390: 20 69 6e 20 65 69 74 68 65 72 20 22 61 75 74 6f   in either "auto
83a0: 6d 61 74 69 63 22 20 6f 72 20 22 73 74 61 6e 64  matic" or "stand
83b0: 61 72 64 22 20 6d 6f 64 65 73 2c 20 61 74 74 65  ard" modes, atte
83c0: 6d 70 74 20 74 6f 0d 0a 20 20 20 20 20 20 23 20  mpt to..      # 
83d0: 20 20 20 20 20 20 66 69 6e 64 20 74 68 65 20 73        find the s
83e0: 74 61 6e 64 61 72 64 20 53 51 4c 69 74 65 20 6c  tandard SQLite l
83f0: 69 62 72 61 72 79 2e 0d 0a 20 20 20 20 20 20 23  ibrary...      #
8400: 0d 0a 20 20 20 20 20 20 69 66 20 7b 24 61 75 74  ..      if {$aut
8410: 6f 6d 61 74 69 63 20 7c 7c 20 24 73 74 61 6e 64  omatic || $stand
8420: 61 72 64 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  ard} then {..   
8430: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
8440: 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74 20  # NOTE: Attempt 
8450: 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65  to determine the
8460: 20 6e 61 74 69 76 65 2d 6f 6e 6c 79 20 73 74 61   native-only sta
8470: 6e 64 61 72 64 20 53 51 4c 69 74 65 20 6c 69 62  ndard SQLite lib
8480: 72 61 72 79 0d 0a 20 20 20 20 20 20 20 20 23 20  rary..        # 
8490: 20 20 20 20 20 20 66 69 6c 65 20 6e 61 6d 65 20        file name 
84a0: 66 6f 72 20 74 68 69 73 20 70 6c 61 74 66 6f 72  for this platfor
84b0: 6d 20 61 6e 64 20 74 68 65 6e 20 72 65 74 75 72  m and then retur
84c0: 6e 20 69 74 2e 0d 0a 20 20 20 20 20 20 20 20 23  n it...        #
84d0: 0d 0a 20 20 20 20 20 20 20 20 66 6f 72 65 61 63  ..        foreac
84e0: 68 20 66 69 6c 65 4e 61 6d 65 4f 6e 6c 79 20 5b  h fileNameOnly [
84f0: 67 65 74 4e 61 74 69 76 65 4c 69 62 72 61 72 79  getNativeLibrary
8500: 46 69 6c 65 4e 61 6d 65 73 4f 6e 6c 79 5d 20 7b  FileNamesOnly] {
8510: 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20  ..          set 
8520: 66 69 6c 65 4e 61 6d 65 20 5b 66 69 6c 65 20 6e  fileName [file n
8530: 61 74 69 76 65 6e 61 6d 65 20 5c 0d 0a 20 20 20  ativename \..   
8540: 20 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65             [file
8550: 20 6a 6f 69 6e 20 5b 67 65 74 42 69 6e 61 72 79   join [getBinary
8560: 44 69 72 65 63 74 6f 72 79 5d 20 24 70 6c 61 74  Directory] $plat
8570: 66 6f 72 6d 20 24 66 69 6c 65 4e 61 6d 65 4f 6e  form $fileNameOn
8580: 6c 79 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  ly]]....        
8590: 20 20 69 66 20 7b 5b 66 69 6c 65 20 65 78 69 73    if {[file exis
85a0: 74 73 20 24 66 69 6c 65 4e 61 6d 65 5d 7d 20 74  ts $fileName]} t
85b0: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
85c0: 20 20 20 72 65 74 75 72 6e 20 24 66 69 6c 65 4e     return $fileN
85d0: 61 6d 65 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  ame..          }
85e0: 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20  ..        }..   
85f0: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d     }....      #.
8600: 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 57  .      # NOTE: W
8610: 61 73 20 74 68 65 20 6d 61 6e 61 67 65 64 20 61  as the managed a
8620: 73 73 65 6d 62 6c 79 20 63 6f 6d 70 69 6c 65 64  ssembly compiled
8630: 20 65 78 70 65 63 74 69 6e 67 20 74 6f 20 64 65   expecting to de
8640: 61 6c 20 77 69 74 68 20 74 68 65 0d 0a 20 20 20  al with the..   
8650: 20 20 20 23 20 20 20 20 20 20 20 73 74 61 6e 64     #       stand
8660: 61 72 64 20 63 6f 72 65 20 6c 69 62 72 61 72 79  ard core library
8670: 3f 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ?..      #..    
8680: 20 20 69 66 20 7b 5b 68 61 76 65 53 51 4c 69 74    if {[haveSQLit
8690: 65 44 65 66 69 6e 65 43 6f 6e 73 74 61 6e 74 20  eDefineConstant 
86a0: 53 51 4c 49 54 45 5f 53 54 41 4e 44 41 52 44 5d  SQLITE_STANDARD]
86b0: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
86c0: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
86d0: 4f 54 45 3a 20 46 61 6c 6c 62 61 63 6b 20 74 6f  OTE: Fallback to
86e0: 20 72 65 74 75 72 6e 69 6e 67 20 74 68 65 20 6e   returning the n
86f0: 61 74 69 76 65 2d 6f 6e 6c 79 20 73 74 61 6e 64  ative-only stand
8700: 61 72 64 20 53 51 4c 69 74 65 20 6c 69 62 72 61  ard SQLite libra
8710: 72 79 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  ry..        #   
8720: 20 20 20 20 66 69 6c 65 20 6e 61 6d 65 20 66 6f      file name fo
8730: 72 20 74 68 65 20 70 6c 61 74 66 6f 72 6d 2e 0d  r the platform..
8740: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
8750: 20 20 20 20 73 65 74 20 66 69 6c 65 4e 61 6d 65      set fileName
8760: 73 4f 6e 6c 79 20 5b 67 65 74 4e 61 74 69 76 65  sOnly [getNative
8770: 4c 69 62 72 61 72 79 46 69 6c 65 4e 61 6d 65 73  LibraryFileNames
8780: 4f 6e 6c 79 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  Only]....       
8790: 20 69 66 20 7b 5b 6c 6c 65 6e 67 74 68 20 24 66   if {[llength $f
87a0: 69 6c 65 4e 61 6d 65 73 4f 6e 6c 79 5d 20 3d 3d  ileNamesOnly] ==
87b0: 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
87c0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 22 22 0d        return "".
87d0: 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  .        }....  
87e0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b 66 69        return [fi
87f0: 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65 20 5b 66  le nativename [f
8800: 69 6c 65 20 6a 6f 69 6e 20 5c 0d 0a 20 20 20 20  ile join \..    
8810: 20 20 20 20 20 20 20 20 5b 67 65 74 42 69 6e 61          [getBina
8820: 72 79 44 69 72 65 63 74 6f 72 79 5d 20 24 70 6c  ryDirectory] $pl
8830: 61 74 66 6f 72 6d 20 5b 6c 69 6e 64 65 78 20 24  atform [lindex $
8840: 66 69 6c 65 4e 61 6d 65 73 4f 6e 6c 79 20 30 5d  fileNamesOnly 0]
8850: 5d 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65  ]]..      } else
8860: 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20   {..        #.. 
8870: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 46         # NOTE: F
8880: 61 6c 6c 62 61 63 6b 20 74 6f 20 72 65 74 75 72  allback to retur
8890: 6e 69 6e 67 20 74 68 65 20 6e 61 74 69 76 65 2d  ning the native-
88a0: 6f 6e 6c 79 20 69 6e 74 65 72 6f 70 20 61 73 73  only interop ass
88b0: 65 6d 62 6c 79 20 66 69 6c 65 0d 0a 20 20 20 20  embly file..    
88c0: 20 20 20 20 23 20 20 20 20 20 20 20 6e 61 6d 65      #       name
88d0: 20 66 6f 72 20 74 68 65 20 70 6c 61 74 66 6f 72   for the platfor
88e0: 6d 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  m...        #.. 
88f0: 20 20 20 20 20 20 20 73 65 74 20 66 69 6c 65 4e         set fileN
8900: 61 6d 65 73 4f 6e 6c 79 20 5b 67 65 74 49 6e 74  amesOnly [getInt
8910: 65 72 6f 70 41 73 73 65 6d 62 6c 79 46 69 6c 65  eropAssemblyFile
8920: 4e 61 6d 65 73 4f 6e 6c 79 5d 0d 0a 0d 0a 20 20  NamesOnly]....  
8930: 20 20 20 20 20 20 69 66 20 7b 5b 6c 6c 65 6e 67        if {[lleng
8940: 74 68 20 24 66 69 6c 65 4e 61 6d 65 73 4f 6e 6c  th $fileNamesOnl
8950: 79 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d  y] == 0} then {.
8960: 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
8970: 6e 20 22 22 0d 0a 20 20 20 20 20 20 20 20 7d 0d  n ""..        }.
8980: 0a 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ...        retur
8990: 6e 20 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e 61  n [file nativena
89a0: 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5c 0d  me [file join \.
89b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 67 65  .            [ge
89c0: 74 42 69 6e 61 72 79 44 69 72 65 63 74 6f 72 79  tBinaryDirectory
89d0: 5d 20 24 70 6c 61 74 66 6f 72 6d 20 5b 6c 69 6e  ] $platform [lin
89e0: 64 65 78 20 24 66 69 6c 65 4e 61 6d 65 73 4f 6e  dex $fileNamesOn
89f0: 6c 79 20 30 5d 5d 5d 0d 0a 20 20 20 20 20 20 7d  ly 0]]]..      }
8a00: 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
8a10: 70 72 6f 63 20 67 65 74 43 6f 6d 6d 6f 6e 44 69  proc getCommonDi
8a20: 72 65 63 74 6f 72 79 20 7b 7d 20 7b 0d 0a 20 20  rectory {} {..  
8a30: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
8a40: 4f 54 45 3a 20 54 68 69 73 20 70 72 6f 63 65 64  OTE: This proced
8a50: 75 72 65 20 72 65 74 75 72 6e 73 20 74 68 65 20  ure returns the 
8a60: 64 69 72 65 63 74 6f 72 79 20 77 68 65 72 65 20  directory where 
8a70: 74 68 65 20 74 65 73 74 20 73 63 72 69 70 74 73  the test scripts
8a80: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
8a90: 73 68 6f 75 6c 64 20 62 65 20 6c 6f 63 61 74 65  should be locate
8aa0: 64 2e 20 20 42 79 20 64 65 66 61 75 6c 74 2c 20  d.  By default, 
8ab0: 74 68 69 73 20 6a 75 73 74 20 72 65 74 75 72 6e  this just return
8ac0: 73 20 74 68 65 20 45 61 67 6c 65 0d 0a 20 20 20  s the Eagle..   
8ad0: 20 20 20 23 20 20 20 20 20 20 20 62 69 6e 61 72     #       binar
8ae0: 79 20 64 69 72 65 63 74 6f 72 79 2e 0d 0a 20 20  y directory...  
8af0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20      #..      if 
8b00: 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  {[info exists ::
8b10: 63 6f 6d 6d 6f 6e 5f 64 69 72 65 63 74 6f 72 79  common_directory
8b20: 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20  ] && \..        
8b30: 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68    [string length
8b40: 20 24 3a 3a 63 6f 6d 6d 6f 6e 5f 64 69 72 65 63   $::common_direc
8b50: 74 6f 72 79 5d 20 3e 20 30 7d 20 74 68 65 6e 20  tory] > 0} then 
8b60: 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
8b70: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68        # NOTE: Th
8b80: 65 20 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 74 68  e location of th
8b90: 65 20 63 6f 6d 6d 6f 6e 20 64 69 72 65 63 74 6f  e common directo
8ba0: 72 79 20 68 61 73 20 62 65 65 6e 20 73 65 74 3b  ry has been set;
8bb0: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
8bc0: 20 20 74 68 65 72 65 66 6f 72 65 2c 20 75 73 65    therefore, use
8bd0: 20 69 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d   it...        #.
8be0: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
8bf0: 24 3a 3a 63 6f 6d 6d 6f 6e 5f 64 69 72 65 63 74  $::common_direct
8c00: 6f 72 79 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73  ory..      } els
8c10: 65 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74  eif {[info exist
8c20: 73 20 3a 3a 76 65 6e 64 6f 72 5f 64 69 72 65 63  s ::vendor_direc
8c30: 74 6f 72 79 5d 20 26 26 20 5c 0d 0a 20 20 20 20  tory] && \..    
8c40: 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65        [string le
8c50: 6e 67 74 68 20 24 3a 3a 76 65 6e 64 6f 72 5f 64  ngth $::vendor_d
8c60: 69 72 65 63 74 6f 72 79 5d 20 3e 20 30 7d 20 74  irectory] > 0} t
8c70: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  hen {..        #
8c80: 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
8c90: 3a 20 54 68 65 20 6c 6f 63 61 74 69 6f 6e 20 6f  : The location o
8ca0: 66 20 74 68 65 20 76 65 6e 64 6f 72 20 64 69 72  f the vendor dir
8cb0: 65 63 74 6f 72 79 20 68 61 73 20 62 65 65 6e 20  ectory has been 
8cc0: 73 65 74 3b 0d 0a 20 20 20 20 20 20 20 20 23 20  set;..        # 
8cd0: 20 20 20 20 20 20 74 68 65 72 65 66 6f 72 65 2c        therefore,
8ce0: 20 75 73 65 20 69 74 2e 0d 0a 20 20 20 20 20 20   use it...      
8cf0: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74    #..        ret
8d00: 75 72 6e 20 24 3a 3a 76 65 6e 64 6f 72 5f 64 69  urn $::vendor_di
8d10: 72 65 63 74 6f 72 79 0d 0a 20 20 20 20 20 20 7d  rectory..      }
8d20: 20 65 6c 73 65 69 66 20 7b 5b 69 6e 66 6f 20 65   elseif {[info e
8d30: 78 69 73 74 73 20 3a 3a 74 63 6c 5f 6c 69 62 72  xists ::tcl_libr
8d40: 61 72 79 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20  ary] && \..     
8d50: 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e       [string len
8d60: 67 74 68 20 24 3a 3a 74 63 6c 5f 6c 69 62 72 61  gth $::tcl_libra
8d70: 72 79 5d 20 3e 20 30 20 26 26 20 5c 0d 0a 20 20  ry] > 0 && \..  
8d80: 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20 69 73          [file is
8d90: 64 69 72 65 63 74 6f 72 79 20 24 3a 3a 74 63 6c  directory $::tcl
8da0: 5f 6c 69 62 72 61 72 79 5d 7d 20 74 68 65 6e 20  _library]} then 
8db0: 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
8dc0: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68        # NOTE: Th
8dd0: 65 20 76 61 72 69 61 62 6c 65 20 77 69 74 68 20  e variable with 
8de0: 74 68 65 20 6c 6f 63 61 74 69 6f 6e 20 6f 66 20  the location of 
8df0: 74 68 65 20 73 63 72 69 70 74 20 6c 69 62 72 61  the script libra
8e00: 72 79 20 69 73 0d 0a 20 20 20 20 20 20 20 20 23  ry is..        #
8e10: 20 20 20 20 20 20 20 73 65 74 20 61 6e 64 20 61         set and a
8e20: 70 70 65 61 72 73 20 74 6f 20 62 65 20 61 20 72  ppears to be a r
8e30: 65 61 6c 20 64 69 72 65 63 74 6f 72 79 20 28 69  eal directory (i
8e40: 2e 65 2e 20 6e 6f 74 20 65 6d 62 65 64 64 65 64  .e. not embedded
8e50: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
8e60: 20 20 77 69 74 68 69 6e 20 61 20 66 69 6c 65 29    within a file)
8e70: 3b 20 74 68 65 72 65 66 6f 72 65 2c 20 75 73 65  ; therefore, use
8e80: 20 69 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d   it...        #.
8e90: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
8ea0: 24 3a 3a 74 63 6c 5f 6c 69 62 72 61 72 79 0d 0a  $::tcl_library..
8eb0: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
8ec0: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
8ed0: 20 20 20 23 20 4e 4f 54 45 3a 20 46 61 6c 6c 62     # NOTE: Fallb
8ee0: 61 63 6b 20 74 6f 20 74 68 65 20 64 69 72 65 63  ack to the direc
8ef0: 74 6f 72 79 20 63 6f 6e 74 61 69 6e 69 6e 67 20  tory containing 
8f00: 74 68 65 20 65 78 65 63 75 74 61 62 6c 65 2e 0d  the executable..
8f10: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
8f20: 20 20 20 20 72 65 74 75 72 6e 20 5b 69 6e 66 6f      return [info
8f30: 20 62 69 6e 61 72 79 5d 0d 0a 20 20 20 20 20 20   binary]..      
8f40: 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  }..    }.....   
8f50: 20 70 72 6f 63 20 67 65 74 44 61 74 61 62 61 73   proc getDatabas
8f60: 65 44 69 72 65 63 74 6f 72 79 20 7b 7d 20 7b 0d  eDirectory {} {.
8f70: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
8f80: 23 20 4e 4f 54 45 3a 20 54 68 69 73 20 70 72 6f  # NOTE: This pro
8f90: 63 65 64 75 72 65 20 72 65 74 75 72 6e 73 20 74  cedure returns t
8fa0: 68 65 20 64 69 72 65 63 74 6f 72 79 20 77 68 65  he directory whe
8fb0: 72 65 20 74 68 65 20 74 65 73 74 20 64 61 74 61  re the test data
8fc0: 62 61 73 65 73 0d 0a 20 20 20 20 20 20 23 20 20  bases..      #  
8fd0: 20 20 20 20 20 73 68 6f 75 6c 64 20 62 65 20 6c       should be l
8fe0: 6f 63 61 74 65 64 2e 20 20 42 79 20 64 65 66 61  ocated.  By defa
8ff0: 75 6c 74 2c 20 74 68 69 73 20 6a 75 73 74 20 75  ult, this just u
9000: 73 65 73 20 74 68 65 20 74 65 6d 70 6f 72 61 72  ses the temporar
9010: 79 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  y..      #      
9020: 20 64 69 72 65 63 74 6f 72 79 20 63 6f 6e 66 69   directory confi
9030: 67 75 72 65 64 20 66 6f 72 20 74 68 69 73 20 73  gured for this s
9040: 79 73 74 65 6d 2e 0d 0a 20 20 20 20 20 20 23 0d  ystem...      #.
9050: 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f  .      if {[info
9060: 20 65 78 69 73 74 73 20 3a 3a 64 61 74 61 62 61   exists ::databa
9070: 73 65 5f 64 69 72 65 63 74 6f 72 79 5d 20 26 26  se_directory] &&
9080: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 73   \..          [s
9090: 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a  tring length $::
90a0: 64 61 74 61 62 61 73 65 5f 64 69 72 65 63 74 6f  database_directo
90b0: 72 79 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d  ry] > 0} then {.
90c0: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
90d0: 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 65 20      # NOTE: The 
90e0: 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  location of the 
90f0: 64 61 74 61 62 61 73 65 20 64 69 72 65 63 74 6f  database directo
9100: 72 79 20 68 61 73 20 62 65 65 6e 20 6f 76 65 72  ry has been over
9110: 72 69 64 64 65 6e 3b 0d 0a 20 20 20 20 20 20 20  ridden;..       
9120: 20 23 20 20 20 20 20 20 20 74 68 65 72 65 66 6f   #       therefo
9130: 72 65 2c 20 75 73 65 20 69 74 2e 0d 0a 20 20 20  re, use it...   
9140: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
9150: 72 65 74 75 72 6e 20 24 3a 3a 64 61 74 61 62 61  return $::databa
9160: 73 65 5f 64 69 72 65 63 74 6f 72 79 0d 0a 20 20  se_directory..  
9170: 20 20 20 20 7d 20 65 6c 73 65 69 66 20 7b 5b 69      } elseif {[i
9180: 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 73 63 72  nfo exists ::scr
9190: 61 74 63 68 5f 64 69 72 65 63 74 6f 72 79 5d 20  atch_directory] 
91a0: 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  && \..          
91b0: 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
91c0: 3a 3a 73 63 72 61 74 63 68 5f 64 69 72 65 63 74  ::scratch_direct
91d0: 6f 72 79 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b  ory] > 0} then {
91e0: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
91f0: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 65       # NOTE: The
9200: 20 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 74 68 65   location of the
9210: 20 73 63 72 61 74 63 68 20 64 69 72 65 63 74 6f   scratch directo
9220: 72 79 20 68 61 73 20 62 65 65 6e 20 6f 76 65 72  ry has been over
9230: 72 69 64 64 65 6e 3b 0d 0a 20 20 20 20 20 20 20  ridden;..       
9240: 20 23 20 20 20 20 20 20 20 74 68 65 72 65 66 6f   #       therefo
9250: 72 65 2c 20 75 73 65 20 69 74 2e 0d 0a 20 20 20  re, use it...   
9260: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
9270: 72 65 74 75 72 6e 20 24 3a 3a 73 63 72 61 74 63  return $::scratc
9280: 68 5f 64 69 72 65 63 74 6f 72 79 0d 0a 20 20 20  h_directory..   
9290: 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
92a0: 20 20 20 20 20 72 65 74 75 72 6e 20 5b 67 65 74       return [get
92b0: 54 65 6d 70 6f 72 61 72 79 50 61 74 68 5d 0d 0a  TemporaryPath]..
92c0: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a        }..    }..
92d0: 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74 54  ...    proc getT
92e0: 65 6d 70 6f 72 61 72 79 44 69 72 65 63 74 6f 72  emporaryDirector
92f0: 79 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d  y {} {..      #.
9300: 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54  .      # NOTE: T
9310: 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 72 65  his procedure re
9320: 74 75 72 6e 73 20 74 68 65 20 64 69 72 65 63 74  turns the direct
9330: 6f 72 79 20 77 68 65 72 65 20 74 68 65 20 74 65  ory where the te
9340: 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 0d 0a 20  mporary files.. 
9350: 20 20 20 20 20 23 20 20 20 20 20 20 20 73 68 6f       #       sho
9360: 75 6c 64 20 62 65 20 6c 6f 63 61 74 65 64 2e 20  uld be located. 
9370: 20 42 79 20 64 65 66 61 75 6c 74 2c 20 74 68 69   By default, thi
9380: 73 20 6a 75 73 74 20 75 73 65 73 20 74 68 65 20  s just uses the 
9390: 74 65 6d 70 6f 72 61 72 79 0d 0a 20 20 20 20 20  temporary..     
93a0: 20 23 20 20 20 20 20 20 20 64 69 72 65 63 74 6f   #       directo
93b0: 72 79 20 63 6f 6e 66 69 67 75 72 65 64 20 66 6f  ry configured fo
93c0: 72 20 74 68 69 73 20 73 79 73 74 65 6d 2e 0d 0a  r this system...
93d0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69        #..      i
93e0: 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20  f {[info exists 
93f0: 3a 3a 74 65 6d 70 6f 72 61 72 79 5f 64 69 72 65  ::temporary_dire
9400: 63 74 6f 72 79 5d 20 26 26 20 5c 0d 0a 20 20 20  ctory] && \..   
9410: 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c         [string l
9420: 65 6e 67 74 68 20 24 3a 3a 74 65 6d 70 6f 72 61  ength $::tempora
9430: 72 79 5f 64 69 72 65 63 74 6f 72 79 5d 20 3e 20  ry_directory] > 
9440: 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
9450: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
9460: 4e 4f 54 45 3a 20 54 68 65 20 6c 6f 63 61 74 69  NOTE: The locati
9470: 6f 6e 20 6f 66 20 74 68 65 20 74 65 6d 70 6f 72  on of the tempor
9480: 61 72 79 20 64 69 72 65 63 74 6f 72 79 20 68 61  ary directory ha
9490: 73 20 62 65 65 6e 20 6f 76 65 72 72 69 64 64 65  s been overridde
94a0: 6e 3b 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  n;..        #   
94b0: 20 20 20 20 74 68 65 72 65 66 6f 72 65 2c 20 75      therefore, u
94c0: 73 65 20 69 74 2e 0d 0a 20 20 20 20 20 20 20 20  se it...        
94d0: 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  #..        retur
94e0: 6e 20 24 3a 3a 74 65 6d 70 6f 72 61 72 79 5f 64  n $::temporary_d
94f0: 69 72 65 63 74 6f 72 79 0d 0a 20 20 20 20 20 20  irectory..      
9500: 7d 20 65 6c 73 65 69 66 20 7b 5b 69 6e 66 6f 20  } elseif {[info 
9510: 65 78 69 73 74 73 20 3a 3a 73 63 72 61 74 63 68  exists ::scratch
9520: 5f 64 69 72 65 63 74 6f 72 79 5d 20 26 26 20 5c  _directory] && \
9530: 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 73 74 72  ..          [str
9540: 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a 73 63  ing length $::sc
9550: 72 61 74 63 68 5f 64 69 72 65 63 74 6f 72 79 5d  ratch_directory]
9560: 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20   > 0} then {..  
9570: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
9580: 20 23 20 4e 4f 54 45 3a 20 54 68 65 20 6c 6f 63   # NOTE: The loc
9590: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 63 72  ation of the scr
95a0: 61 74 63 68 20 64 69 72 65 63 74 6f 72 79 20 68  atch directory h
95b0: 61 73 20 62 65 65 6e 20 6f 76 65 72 72 69 64 64  as been overridd
95c0: 65 6e 3b 0d 0a 20 20 20 20 20 20 20 20 23 20 20  en;..        #  
95d0: 20 20 20 20 20 74 68 65 72 65 66 6f 72 65 2c 20       therefore, 
95e0: 75 73 65 20 69 74 2e 0d 0a 20 20 20 20 20 20 20  use it...       
95f0: 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75   #..        retu
9600: 72 6e 20 24 3a 3a 73 63 72 61 74 63 68 5f 64 69  rn $::scratch_di
9610: 72 65 63 74 6f 72 79 0d 0a 20 20 20 20 20 20 7d  rectory..      }
9620: 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
9630: 20 72 65 74 75 72 6e 20 5b 67 65 74 54 65 6d 70   return [getTemp
9640: 6f 72 61 72 79 50 61 74 68 5d 0d 0a 20 20 20 20  oraryPath]..    
9650: 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20    }..    }..... 
9660: 20 20 20 70 72 6f 63 20 67 65 74 45 78 65 63 75     proc getExecu
9670: 74 65 4f 6e 53 65 74 75 70 20 7b 7d 20 7b 0d 0a  teOnSetup {} {..
9680: 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20        if {[info 
9690: 65 78 69 73 74 73 20 3a 3a 65 78 65 63 75 74 65  exists ::execute
96a0: 5f 6f 6e 5f 73 65 74 75 70 5d 20 26 26 20 5c 0d  _on_setup] && \.
96b0: 0a 20 20 20 20 20 20 20 20 20 20 5b 73 74 72 69  .          [stri
96c0: 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a 65 78 65  ng length $::exe
96d0: 63 75 74 65 5f 6f 6e 5f 73 65 74 75 70 5d 20 3e  cute_on_setup] >
96e0: 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
96f0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
9700: 20 4e 4f 54 45 3a 20 52 65 74 75 72 6e 20 74 68   NOTE: Return th
9710: 65 20 63 6f 6e 66 69 67 75 72 65 64 20 53 51 4c  e configured SQL
9720: 20 74 6f 20 65 78 65 63 75 74 65 20 64 75 72 69   to execute duri
9730: 6e 67 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  ng the connectio
9740: 6e 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  n..        #    
9750: 20 20 20 73 65 74 75 70 20 70 72 6f 63 65 64 75     setup procedu
9760: 72 65 20 28 69 2e 65 2e 20 66 6f 72 20 65 76 65  re (i.e. for eve
9770: 72 79 20 74 65 73 74 20 64 61 74 61 62 61 73 65  ry test database
9780: 20 63 6f 6e 6e 65 63 74 69 6f 6e 29 2e 0d 0a 20   connection)... 
9790: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
97a0: 20 20 72 65 74 75 72 6e 20 24 3a 3a 65 78 65 63    return $::exec
97b0: 75 74 65 5f 6f 6e 5f 73 65 74 75 70 0d 0a 20 20  ute_on_setup..  
97c0: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
97d0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
97e0: 20 23 20 4e 4f 54 45 3a 20 42 79 20 64 65 66 61   # NOTE: By defa
97f0: 75 6c 74 2c 20 74 68 65 72 65 20 69 73 20 6e 6f  ult, there is no
9800: 20 53 51 4c 20 74 6f 20 65 78 65 63 75 74 65 20   SQL to execute 
9810: 64 75 72 69 6e 67 20 74 68 65 20 63 6f 6e 6e 65  during the conne
9820: 63 74 69 6f 6e 0d 0a 20 20 20 20 20 20 20 20 23  ction..        #
9830: 20 20 20 20 20 20 20 73 65 74 75 70 20 70 72 6f         setup pro
9840: 63 65 64 75 72 65 20 28 69 2e 65 2e 20 66 6f 72  cedure (i.e. for
9850: 20 65 76 65 72 79 20 74 65 73 74 20 64 61 74 61   every test data
9860: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 29  base connection)
9870: 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
9880: 20 20 20 20 20 20 72 65 74 75 72 6e 20 22 22 0d        return "".
9890: 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d  .      }..    }.
98a0: 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74  ....    proc get
98b0: 54 65 73 74 4f 76 65 72 72 69 64 65 73 50 72 65  TestOverridesPre
98c0: 61 6d 62 6c 65 20 7b 20 7b 65 78 74 72 61 56 61  amble { {extraVa
98d0: 72 4e 61 6d 65 73 20 22 22 7d 20 7d 20 7b 0d 0a  rNames ""} } {..
98e0: 20 20 20 20 20 20 73 65 74 20 76 61 72 4e 61 6d        set varNam
98f0: 65 73 20 5b 6c 69 73 74 5d 0d 0a 0d 0a 20 20 20  es [list]....   
9900: 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
9910: 54 45 3a 20 49 66 20 61 76 61 69 6c 61 62 6c 65  TE: If available
9920: 2c 20 73 74 61 72 74 20 77 69 74 68 20 74 68 65  , start with the
9930: 20 6d 61 73 74 65 72 20 6c 69 73 74 20 6f 66 20   master list of 
9940: 74 65 73 74 20 6f 76 65 72 72 69 64 65 0d 0a 20  test override.. 
9950: 20 20 20 20 20 23 20 20 20 20 20 20 20 76 61 72       #       var
9960: 69 61 62 6c 65 73 2e 0d 0a 20 20 20 20 20 20 23  iables...      #
9970: 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66  ..      if {[inf
9980: 6f 20 65 78 69 73 74 73 20 3a 3a 74 65 73 74 5f  o exists ::test_
9990: 6f 76 65 72 72 69 64 65 73 5d 20 26 26 20 5c 0d  overrides] && \.
99a0: 0a 20 20 20 20 20 20 20 20 20 20 5b 6c 6c 65 6e  .          [llen
99b0: 67 74 68 20 24 3a 3a 74 65 73 74 5f 6f 76 65 72  gth $::test_over
99c0: 72 69 64 65 73 5d 20 3e 20 30 7d 20 74 68 65 6e  rides] > 0} then
99d0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 65 76 61 6c   {..        eval
99e0: 20 6c 61 70 70 65 6e 64 20 76 61 72 4e 61 6d 65   lappend varName
99f0: 73 20 24 3a 3a 74 65 73 74 5f 6f 76 65 72 72 69  s $::test_overri
9a00: 64 65 73 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a  des..      }....
9a10: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
9a20: 20 4e 4f 54 45 3a 20 49 66 20 72 65 71 75 65 73   NOTE: If reques
9a30: 74 65 64 20 62 79 20 6f 75 72 20 63 61 6c 6c 65  ted by our calle
9a40: 72 2c 20 61 64 64 20 61 6e 79 20 61 64 64 69 74  r, add any addit
9a50: 69 6f 6e 61 6c 20 76 61 72 69 61 62 6c 65 0d 0a  ional variable..
9a60: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 6e 61        #       na
9a70: 6d 65 73 20 74 6f 20 63 6f 70 79 20 6e 6f 77 2e  mes to copy now.
9a80: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
9a90: 20 69 66 20 7b 5b 6c 6c 65 6e 67 74 68 20 24 65   if {[llength $e
9aa0: 78 74 72 61 56 61 72 4e 61 6d 65 73 5d 20 3e 20  xtraVarNames] > 
9ab0: 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
9ac0: 20 20 20 65 76 61 6c 20 6c 61 70 70 65 6e 64 20     eval lappend 
9ad0: 76 61 72 4e 61 6d 65 73 20 24 65 78 74 72 61 56  varNames $extraV
9ae0: 61 72 4e 61 6d 65 73 0d 0a 20 20 20 20 20 20 7d  arNames..      }
9af0: 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  ....      #..   
9b00: 20 20 20 23 20 4e 4f 54 45 3a 20 42 75 69 6c 64     # NOTE: Build
9b10: 20 74 68 65 20 73 63 72 69 70 74 20 66 72 61 67   the script frag
9b20: 6d 65 6e 74 20 74 6f 20 62 65 20 72 65 74 75 72  ment to be retur
9b30: 6e 65 64 20 62 79 20 70 72 6f 63 65 73 73 69 6e  ned by processin
9b40: 67 20 65 61 63 68 0d 0a 20 20 20 20 20 20 23 20  g each..      # 
9b50: 20 20 20 20 20 20 76 61 72 69 61 62 6c 65 20 6e        variable n
9b60: 61 6d 65 20 61 6e 64 20 61 64 64 69 6e 67 20 74  ame and adding t
9b70: 68 65 20 6e 65 63 65 63 65 73 73 61 72 79 20 73  he nececessary s
9b80: 63 72 69 70 74 20 66 72 61 67 6d 65 6e 74 73 20  cript fragments 
9b90: 66 6f 72 0d 0a 20 20 20 20 20 20 23 20 20 20 20  for..      #    
9ba0: 20 20 20 65 61 63 68 20 6f 6e 65 2e 0d 0a 20 20     each one...  
9bb0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 73 65 74      #..      set
9bc0: 20 72 65 73 75 6c 74 20 22 22 0d 0a 0d 0a 20 20   result ""....  
9bd0: 20 20 20 20 66 6f 72 65 61 63 68 20 76 61 72 4e      foreach varN
9be0: 61 6d 65 20 24 76 61 72 4e 61 6d 65 73 20 7b 0d  ame $varNames {.
9bf0: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
9c00: 20 20 20 20 23 20 4e 4f 54 45 3a 20 42 75 69 6c      # NOTE: Buil
9c10: 64 20 74 68 65 20 71 75 61 6c 69 66 69 65 64 20  d the qualified 
9c20: 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20  global variable 
9c30: 6e 61 6d 65 2e 0d 0a 20 20 20 20 20 20 20 20 23  name...        #
9c40: 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 66 75  ..        set fu
9c50: 6c 6c 56 61 72 4e 61 6d 65 20 5b 61 70 70 65 6e  llVarName [appen
9c60: 64 41 72 67 73 20 3a 3a 20 24 76 61 72 4e 61 6d  dArgs :: $varNam
9c70: 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d  e]....        #.
9c80: 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
9c90: 20 44 6f 65 73 20 74 68 65 20 76 61 72 69 61 62   Does the variab
9ca0: 6c 65 20 65 78 69 73 74 20 69 6e 20 74 68 69 73  le exist in this
9cb0: 20 69 6e 74 65 72 70 72 65 74 65 72 20 63 6f 6e   interpreter con
9cc0: 74 65 78 74 3f 0d 0a 20 20 20 20 20 20 20 20 23  text?..        #
9cd0: 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 69  ..        if {[i
9ce0: 6e 66 6f 20 65 78 69 73 74 73 20 24 66 75 6c 6c  nfo exists $full
9cf0: 56 61 72 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b  VarName]} then {
9d00: 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20  ..          #.. 
9d10: 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a           # NOTE:
9d20: 20 41 70 70 65 6e 64 20 61 20 73 63 72 69 70 74   Append a script
9d30: 20 66 72 61 67 6d 65 6e 74 20 74 6f 20 74 68 65   fragment to the
9d40: 20 72 65 73 75 6c 74 20 74 68 61 74 20 77 69 6c   result that wil
9d50: 6c 20 63 6f 72 72 65 63 74 6c 79 0d 0a 20 20 20  l correctly..   
9d60: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63         #       c
9d70: 6f 70 79 20 61 6e 79 20 63 6f 6e 74 61 69 6e 65  opy any containe
9d80: 64 20 76 61 6c 75 65 20 74 6f 20 61 6e 6f 74 68  d value to anoth
9d90: 65 72 20 69 6e 74 65 72 70 72 65 74 65 72 20 63  er interpreter c
9da0: 6f 6e 74 65 78 74 2e 0d 0a 20 20 20 20 20 20 20  ontext...       
9db0: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
9dc0: 61 70 70 65 6e 64 20 72 65 73 75 6c 74 20 5c 6e  append result \n
9dd0: 20 22 73 65 74 20 22 20 24 66 75 6c 6c 56 61 72   "set " $fullVar
9de0: 4e 61 6d 65 20 22 20 5c 7b 22 20 5b 73 65 74 20  Name " \{" [set 
9df0: 24 66 75 6c 6c 56 61 72 4e 61 6d 65 5d 20 5c 7d  $fullVarName] \}
9e00: 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20  ..        }..   
9e10: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d     }....      #.
9e20: 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49  .      # NOTE: I
9e30: 66 20 74 68 65 20 72 65 73 75 6c 74 20 63 6f 6e  f the result con
9e40: 74 61 69 6e 73 20 6f 6e 65 20 6f 72 20 6d 6f 72  tains one or mor
9e50: 65 20 73 63 72 69 70 74 20 66 72 61 67 6d 65 6e  e script fragmen
9e60: 74 73 2c 20 61 70 70 65 6e 64 20 61 0d 0a 20 20  ts, append a..  
9e70: 20 20 20 20 23 20 20 20 20 20 20 20 6e 65 77 6c      #       newl
9e80: 69 6e 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ine...      #.. 
9e90: 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67       if {[string
9ea0: 20 6c 65 6e 67 74 68 20 24 72 65 73 75 6c 74 5d   length $result]
9eb0: 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20   > 0} then {..  
9ec0: 20 20 20 20 20 20 61 70 70 65 6e 64 20 72 65 73        append res
9ed0: 75 6c 74 20 5c 6e 0d 0a 20 20 20 20 20 20 7d 0d  ult \n..      }.
9ee0: 0a 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ...      return 
9ef0: 24 72 65 73 75 6c 74 0d 0a 20 20 20 20 7d 0d 0a  $result..    }..
9f00: 0c 0d 0a 20 20 20 20 70 72 6f 63 20 6d 6f 76 65  ...    proc move
9f10: 53 79 73 74 65 6d 44 61 74 61 53 51 4c 69 74 65  SystemDataSQLite
9f20: 44 6c 6c 43 6f 6e 66 69 67 20 7b 20 7b 72 65 73  DllConfig { {res
9f30: 74 6f 72 65 20 66 61 6c 73 65 7d 20 7b 76 65 72  tore false} {ver
9f40: 62 6f 73 65 20 66 61 6c 73 65 7d 20 7d 20 7b 0d  bose false} } {.
9f50: 0a 20 20 20 20 20 20 73 65 74 20 64 69 72 65 63  .      set direc
9f60: 74 6f 72 79 20 5b 6f 62 6a 65 63 74 20 69 6e 76  tory [object inv
9f70: 6f 6b 65 20 41 70 70 44 6f 6d 61 69 6e 20 43 75  oke AppDomain Cu
9f80: 72 72 65 6e 74 44 6f 6d 61 69 6e 2e 42 61 73 65  rrentDomain.Base
9f90: 44 69 72 65 63 74 6f 72 79 5d 0d 0a 0d 0a 20 20  Directory]....  
9fa0: 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20      if {[string 
9fb0: 6c 65 6e 67 74 68 20 24 64 69 72 65 63 74 6f 72  length $director
9fc0: 79 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d  y] == 0} then {.
9fd0: 0a 20 20 20 20 20 20 20 20 69 66 20 7b 24 76 65  .        if {$ve
9fe0: 72 62 6f 73 65 7d 20 74 68 65 6e 20 7b 0d 0a 20  rbose} then {.. 
9ff0: 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
a000: 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b  ::test_channel [
a010: 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
a020: 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
a030: 2d 20 73 6b 69 70 70 65 64 20 6d 6f 76 69 6e 67  - skipped moving
a040: 20 5c 22 53 79 73 74 65 6d 2e 44 61 74 61 2e 53   \"System.Data.S
a050: 51 4c 69 74 65 2e 64 6c 6c 2e 63 6f 6e 66 69 67  QLite.dll.config
a060: 5c 22 2c 20 22 20 5c 0d 0a 20 20 20 20 20 20 20  \", " \..       
a070: 20 20 20 20 20 20 20 22 6e 6f 20 62 61 73 65 20         "no base 
a080: 64 69 72 65 63 74 6f 72 79 5c 6e 22 5d 0d 0a 20  directory\n"].. 
a090: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
a0a0: 20 20 72 65 74 75 72 6e 0d 0a 20 20 20 20 20 20    return..      
a0b0: 7d 0d 0a 0d 0a 20 20 20 20 20 20 73 65 74 20 66  }....      set f
a0c0: 69 6c 65 4e 61 6d 65 28 31 29 20 5b 66 69 6c 65  ileName(1) [file
a0d0: 20 6e 6f 72 6d 61 6c 69 7a 65 20 5c 0d 0a 20 20   normalize \..  
a0e0: 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20 6a 6f          [file jo
a0f0: 69 6e 20 24 64 69 72 65 63 74 6f 72 79 20 53 79  in $directory Sy
a100: 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
a110: 2e 64 6c 6c 2e 63 6f 6e 66 69 67 5d 5d 0d 0a 0d  .dll.config]]...
a120: 0a 20 20 20 20 20 20 73 65 74 20 66 69 6c 65 4e  .      set fileN
a130: 61 6d 65 28 32 29 20 5b 61 70 70 65 6e 64 41 72  ame(2) [appendAr
a140: 67 73 20 24 66 69 6c 65 4e 61 6d 65 28 31 29 20  gs $fileName(1) 
a150: 2e 6d 6f 76 65 64 5d 0d 0a 0d 0a 20 20 20 20 20  .moved]....     
a160: 20 69 66 20 7b 24 72 65 73 74 6f 72 65 7d 20 74   if {$restore} t
a170: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 69  hen {..        i
a180: 66 20 7b 5b 66 69 6c 65 20 65 78 69 73 74 73 20  f {[file exists 
a190: 24 66 69 6c 65 4e 61 6d 65 28 32 29 5d 7d 20 74  $fileName(2)]} t
a1a0: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
a1b0: 20 66 69 6c 65 20 72 65 6e 61 6d 65 20 24 66 69   file rename $fi
a1c0: 6c 65 4e 61 6d 65 28 32 29 20 24 66 69 6c 65 4e  leName(2) $fileN
a1d0: 61 6d 65 28 31 29 0d 0a 0d 0a 20 20 20 20 20 20  ame(1)....      
a1e0: 20 20 20 20 69 66 20 7b 24 76 65 72 62 6f 73 65      if {$verbose
a1f0: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
a200: 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
a210: 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70  est_channel [app
a220: 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
a230: 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
a240: 20 6d 6f 76 65 64 20 5c 22 22 20 24 66 69 6c 65   moved \"" $file
a250: 4e 61 6d 65 28 32 29 20 22 5c 22 20 74 6f 20 5c  Name(2) "\" to \
a260: 22 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  "" \..          
a270: 20 20 20 20 20 20 24 66 69 6c 65 4e 61 6d 65 28        $fileName(
a280: 31 29 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20  1) \"\n]..      
a290: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d      }..        }
a2a0: 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
a2b0: 20 20 20 69 66 20 7b 24 76 65 72 62 6f 73 65 7d     if {$verbose}
a2c0: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
a2d0: 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
a2e0: 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
a2f0: 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
a300: 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
a310: 73 6b 69 70 70 65 64 20 6d 6f 76 69 6e 67 20 5c  skipped moving \
a320: 22 22 20 24 66 69 6c 65 4e 61 6d 65 28 32 29 20  "" $fileName(2) 
a330: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
a340: 20 20 20 22 5c 22 2c 20 69 74 20 64 6f 65 73 20     "\", it does 
a350: 6e 6f 74 20 65 78 69 73 74 5c 6e 22 5d 0d 0a 20  not exist\n"].. 
a360: 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
a370: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 20 65      }..      } e
a380: 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 69  lse {..        i
a390: 66 20 7b 5b 66 69 6c 65 20 65 78 69 73 74 73 20  f {[file exists 
a3a0: 24 66 69 6c 65 4e 61 6d 65 28 31 29 5d 7d 20 74  $fileName(1)]} t
a3b0: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
a3c0: 20 66 69 6c 65 20 72 65 6e 61 6d 65 20 24 66 69   file rename $fi
a3d0: 6c 65 4e 61 6d 65 28 31 29 20 24 66 69 6c 65 4e  leName(1) $fileN
a3e0: 61 6d 65 28 32 29 0d 0a 0d 0a 20 20 20 20 20 20  ame(2)....      
a3f0: 20 20 20 20 69 66 20 7b 24 76 65 72 62 6f 73 65      if {$verbose
a400: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
a410: 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
a420: 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70  est_channel [app
a430: 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
a440: 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
a450: 20 6d 6f 76 65 64 20 5c 22 22 20 24 66 69 6c 65   moved \"" $file
a460: 4e 61 6d 65 28 31 29 20 22 5c 22 20 74 6f 20 5c  Name(1) "\" to \
a470: 22 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  "" \..          
a480: 20 20 20 20 20 20 24 66 69 6c 65 4e 61 6d 65 28        $fileName(
a490: 32 29 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20  2) \"\n]..      
a4a0: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d      }..        }
a4b0: 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
a4c0: 20 20 20 69 66 20 7b 24 76 65 72 62 6f 73 65 7d     if {$verbose}
a4d0: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
a4e0: 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
a4f0: 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
a500: 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
a510: 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
a520: 73 6b 69 70 70 65 64 20 6d 6f 76 69 6e 67 20 5c  skipped moving \
a530: 22 22 20 24 66 69 6c 65 4e 61 6d 65 28 31 29 20  "" $fileName(1) 
a540: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
a550: 20 20 20 22 5c 22 2c 20 69 74 20 64 6f 65 73 20     "\", it does 
a560: 6e 6f 74 20 65 78 69 73 74 5c 6e 22 5d 0d 0a 20  not exist\n"].. 
a570: 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
a580: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a      }..      }..
a590: 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
a5a0: 6f 63 20 67 65 74 41 70 70 44 6f 6d 61 69 6e 50  oc getAppDomainP
a5b0: 72 65 61 6d 62 6c 65 20 7b 20 7b 70 72 65 66 69  reamble { {prefi
a5c0: 78 20 22 22 7d 20 7b 73 75 66 66 69 78 20 22 22  x ""} {suffix ""
a5d0: 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a  } } {..      #..
a5e0: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68        # NOTE: Th
a5f0: 69 73 20 70 72 6f 63 65 64 75 72 65 20 72 65 74  is procedure ret
a600: 75 72 6e 73 20 61 20 74 65 73 74 20 73 65 74 75  urns a test setu
a610: 70 20 73 63 72 69 70 74 20 66 72 61 67 6d 65 6e  p script fragmen
a620: 74 20 73 75 69 74 61 62 6c 65 20 66 6f 72 0d 0a  t suitable for..
a630: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 65 76        #       ev
a640: 61 6c 75 61 74 69 6f 6e 20 62 79 20 61 6e 20 69  aluation by an i
a650: 6e 74 65 72 70 72 65 74 65 72 20 63 72 65 61 74  nterpreter creat
a660: 65 64 20 69 6e 20 61 6e 20 69 73 6f 6c 61 74 65  ed in an isolate
a670: 64 20 61 70 70 6c 69 63 61 74 69 6f 6e 0d 0a 20  d application.. 
a680: 20 20 20 20 20 23 20 20 20 20 20 20 20 64 6f 6d       #       dom
a690: 61 69 6e 2e 20 20 54 68 65 20 73 63 72 69 70 74  ain.  The script
a6a0: 20 66 72 61 67 6d 65 6e 74 20 62 65 69 6e 67 20   fragment being 
a6b0: 72 65 74 75 72 6e 65 64 20 77 69 6c 6c 20 62 65  returned will be
a6c0: 20 73 75 72 72 6f 75 6e 64 65 64 20 62 79 0d 0a   surrounded by..
a6d0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68        #       th
a6e0: 65 20 70 72 65 66 69 78 20 61 6e 64 20 73 75 66  e prefix and suf
a6f0: 66 69 78 20 22 73 63 72 69 70 74 20 66 72 61 67  fix "script frag
a700: 6d 65 6e 74 73 22 20 73 70 65 63 69 66 69 65 64  ments" specified
a710: 20 62 79 20 6f 75 72 20 63 61 6c 6c 65 72 2c 0d   by our caller,.
a720: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 69  .      #       i
a730: 66 20 61 6e 79 2e 20 20 54 68 65 20 65 6e 74 69  f any.  The enti
a740: 72 65 20 73 63 72 69 70 74 20 62 65 69 6e 67 20  re script being 
a750: 72 65 74 75 72 6e 65 64 20 77 69 6c 6c 20 62 65  returned will be
a760: 20 73 75 62 73 74 69 74 75 74 65 64 20 76 69 61   substituted via
a770: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
a780: 5b 73 75 62 73 74 5d 2c 20 69 6e 20 74 68 65 20  [subst], in the 
a790: 63 6f 6e 74 65 78 74 20 6f 66 20 6f 75 72 20 63  context of our c
a7a0: 61 6c 6c 65 72 2c 20 62 65 66 6f 72 65 20 62 65  aller, before be
a7b0: 69 6e 67 20 72 65 74 75 72 6e 65 64 2e 0d 0a 20  ing returned... 
a7c0: 20 20 20 20 20 23 20 20 20 20 20 20 20 54 68 69       #       Thi
a7d0: 73 20 73 74 65 70 20 69 73 20 6e 65 63 65 73 73  s step is necess
a7e0: 61 72 79 20 73 6f 20 74 68 61 74 20 73 6f 6d 65  ary so that some
a7f0: 20 6c 69 6d 69 74 65 64 20 63 6f 6e 74 65 78 74   limited context
a800: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2c 0d 0a 20   information,.. 
a810: 20 20 20 20 20 23 20 20 20 20 20 20 20 70 72 69       #       pri
a820: 6d 61 72 69 6c 79 20 72 65 6c 61 74 65 64 20 74  marily related t
a830: 6f 20 74 68 65 20 74 65 73 74 69 6e 67 20 64 69  o the testing di
a840: 72 65 63 74 6f 72 69 65 73 2c 20 63 61 6e 20 62  rectories, can b
a850: 65 20 74 72 61 6e 73 66 65 72 72 65 64 0d 0a 20  e transferred.. 
a860: 20 20 20 20 20 23 20 20 20 20 20 20 20 74 6f 20       #       to 
a870: 74 68 65 20 69 6e 74 65 72 70 72 65 74 65 72 20  the interpreter 
a880: 69 6e 20 74 68 65 20 69 73 6f 6c 61 74 65 64 20  in the isolated 
a890: 61 70 70 6c 69 63 61 74 69 6f 6e 20 64 6f 6d 61  application doma
a8a0: 69 6e 2c 20 6d 61 6b 69 6e 67 20 69 74 0d 0a 20  in, making it.. 
a8b0: 20 20 20 20 20 23 20 20 20 20 20 20 20 61 62 6c       #       abl
a8c0: 65 20 74 6f 20 73 75 63 63 65 73 73 66 75 6c 6c  e to successfull
a8d0: 79 20 72 75 6e 20 74 65 73 74 73 20 74 68 61 74  y run tests that
a8e0: 20 72 65 71 75 69 72 65 20 6f 6e 65 20 6f 72 20   require one or 
a8f0: 6d 6f 72 65 20 6f 66 20 74 68 65 0d 0a 20 20 20  more of the..   
a900: 20 20 20 23 20 20 20 20 20 20 20 66 69 6c 65 73     #       files
a910: 20 69 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 74   in one of the t
a920: 65 73 74 69 6e 67 20 64 69 72 65 63 74 6f 72 69  esting directori
a930: 65 73 2e 20 20 43 61 6c 6c 65 72 73 20 73 68 6f  es.  Callers sho
a940: 75 6c 64 20 6b 65 65 70 20 69 6e 0d 0a 20 20 20  uld keep in..   
a950: 20 20 20 23 20 20 20 20 20 20 20 6d 69 6e 64 20     #       mind 
a960: 74 68 61 74 20 74 68 65 20 74 65 73 74 20 73 63  that the test sc
a970: 72 69 70 74 20 66 72 61 67 6d 65 6e 74 20 62 65  ript fragment be
a980: 69 6e 67 20 72 65 74 75 72 6e 65 64 20 63 61 6e  ing returned can
a990: 6e 6f 74 20 72 65 6c 79 20 6f 6e 0d 0a 20 20 20  not rely on..   
a9a0: 20 20 20 23 20 20 20 20 20 20 20 61 6e 79 20 73     #       any s
a9b0: 63 72 69 70 74 20 6c 69 62 72 61 72 79 20 70 72  cript library pr
a9c0: 6f 63 65 64 75 72 65 73 20 74 68 61 74 20 61 72  ocedures that ar
a9d0: 65 20 6e 6f 74 20 70 72 6f 76 69 64 65 64 20 62  e not provided b
a9e0: 79 20 74 68 65 20 45 61 67 6c 65 0d 0a 20 20 20  y the Eagle..   
a9f0: 20 20 20 23 20 20 20 20 20 20 20 6c 69 62 72 61     #       libra
aa00: 72 79 20 70 61 63 6b 61 67 65 20 28 69 2e 65 2e  ry package (i.e.
aa10: 20 22 69 6e 69 74 2e 65 61 67 6c 65 22 29 2c 20   "init.eagle"), 
aa20: 69 6e 63 6c 75 64 69 6e 67 20 74 68 6f 73 65 20  including those 
aa30: 70 72 6f 76 69 64 65 64 20 62 79 0d 0a 20 20 20  provided by..   
aa40: 20 20 20 23 20 20 20 20 20 20 20 74 68 65 20 45     #       the E
aa50: 61 67 6c 65 20 74 65 73 74 20 70 61 63 6b 61 67  agle test packag
aa60: 65 2c 20 75 6e 6c 65 73 73 20 74 68 65 20 66 69  e, unless the fi
aa70: 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  le containing th
aa80: 65 6d 20 69 73 20 6c 6f 61 64 65 64 0d 0a 20 20  em is loaded..  
aa90: 20 20 20 20 23 20 20 20 20 20 20 20 6d 61 6e 75      #       manu
aaa0: 61 6c 6c 79 20 76 69 61 20 73 6f 6d 65 20 6f 74  ally via some ot
aab0: 68 65 72 20 6d 65 63 68 61 6e 69 73 6d 20 28 65  her mechanism (e
aac0: 2e 67 2e 20 62 79 20 69 6e 63 6c 75 64 69 6e 67  .g. by including
aad0: 20 61 70 70 72 6f 70 72 69 61 74 65 0d 0a 20 20   appropriate..  
aae0: 20 20 20 20 23 20 20 20 20 20 20 20 5b 70 61 63      #       [pac
aaf0: 6b 61 67 65 20 72 65 71 75 69 72 65 5d 20 6f 72  kage require] or
ab00: 20 5b 73 6f 75 72 63 65 5d 20 63 6f 6d 6d 61 6e   [source] comman
ab10: 64 73 20 69 6e 20 74 68 65 20 70 72 65 66 69 78  ds in the prefix
ab20: 20 6f 72 20 73 75 66 66 69 78 0d 0a 20 20 20 20   or suffix..    
ab30: 20 20 23 20 20 20 20 20 20 20 73 63 72 69 70 74    #       script
ab40: 20 66 72 61 67 6d 65 6e 74 73 29 2e 20 20 41 6c   fragments).  Al
ab50: 73 6f 2c 20 61 6c 6c 20 76 61 72 69 61 62 6c 65  so, all variable
ab60: 20 72 65 66 65 72 65 6e 63 65 73 20 61 6e 64 20   references and 
ab70: 61 6c 6c 20 6e 65 73 74 65 64 0d 0a 20 20 20 20  all nested..    
ab80: 20 20 23 20 20 20 20 20 20 20 63 6f 6d 6d 61 6e    #       comman
ab90: 64 73 20 28 69 2e 65 2e 20 74 68 6f 73 65 20 69  ds (i.e. those i
aba0: 6e 20 73 71 75 61 72 65 20 62 72 61 63 6b 65 74  n square bracket
abb0: 73 29 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20  s) contained in 
abc0: 74 68 65 20 66 69 6e 61 6c 0d 0a 20 20 20 20 20  the final..     
abd0: 20 23 20 20 20 20 20 20 20 73 63 72 69 70 74 20   #       script 
abe0: 66 72 61 67 6d 65 6e 74 20 77 69 6c 6c 20 65 6e  fragment will en
abf0: 64 20 75 70 20 62 65 69 6e 67 20 65 76 61 6c 75  d up being evalu
ac00: 61 74 65 64 20 69 6e 20 74 68 65 20 63 6f 6e 74  ated in the cont
ac10: 65 78 74 20 6f 66 20 74 68 65 0d 0a 20 20 20 20  ext of the..    
ac20: 20 20 23 20 20 20 20 20 20 20 63 61 6c 6c 69 6e    #       callin
ac30: 67 20 69 6e 74 65 72 70 72 65 74 65 72 20 61 6e  g interpreter an
ac40: 64 20 6e 6f 74 20 74 68 65 20 74 61 72 67 65 74  d not the target
ac50: 20 69 6e 74 65 72 70 72 65 74 65 72 20 63 72 65   interpreter cre
ac60: 61 74 65 64 20 69 6e 20 74 68 65 0d 0a 20 20 20  ated in the..   
ac70: 20 20 20 23 20 20 20 20 20 20 20 69 73 6f 6c 61     #       isola
ac80: 74 65 64 20 61 70 70 6c 69 63 61 74 69 6f 6e 20  ted application 
ac90: 64 6f 6d 61 69 6e 20 75 6e 6c 65 73 73 20 74 68  domain unless th
aca0: 65 20 64 6f 6c 6c 61 72 20 73 69 67 6e 73 20 61  e dollar signs a
acb0: 6e 64 2f 6f 72 20 73 71 75 61 72 65 0d 0a 20 20  nd/or square..  
acc0: 20 20 20 20 23 20 20 20 20 20 20 20 62 72 61 63      #       brac
acd0: 6b 65 74 73 20 61 72 65 20 73 70 65 63 69 61 6c  kets are special
ace0: 6c 79 20 71 75 6f 74 65 64 20 77 69 74 68 20 62  ly quoted with b
acf0: 61 63 6b 73 6c 61 73 68 65 73 2e 0d 0a 20 20 20  ackslashes...   
ad00: 20 20 20 23 0d 0a 20 20 20 20 20 20 72 65 74 75     #..      retu
ad10: 72 6e 20 5b 75 70 6c 65 76 65 6c 20 31 20 5b 6c  rn [uplevel 1 [l
ad20: 69 73 74 20 73 75 62 73 74 20 5b 61 70 70 65 6e  ist subst [appen
ad30: 64 41 72 67 73 20 24 70 72 65 66 69 78 20 7b 0d  dArgs $prefix {.
ad40: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
ad50: 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 65 20      # NOTE: The 
ad60: 5c 5b 6f 62 6a 65 63 74 5c 5d 20 63 6f 6d 6d 61  \[object\] comma
ad70: 6e 64 20 6d 61 79 20 62 65 20 6d 69 73 73 69 6e  nd may be missin
ad80: 67 20 69 6e 20 73 6f 6d 65 20 45 61 67 6c 65 20  g in some Eagle 
ad90: 63 6f 72 65 0d 0a 20 20 20 20 20 20 20 20 23 20  core..        # 
ada0: 20 20 20 20 20 20 6c 69 62 72 61 72 79 20 63 6f        library co
adb0: 6e 66 69 67 75 72 61 74 69 6f 6e 73 2e 20 20 43  nfigurations.  C
adc0: 6c 6f 6e 69 6e 67 20 61 6e 64 20 75 73 69 6e 67  loning and using
add0: 20 74 68 65 20 70 72 6f 63 65 64 75 72 65 0d 0a   the procedure..
ade0: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
adf0: 5c 5b 63 68 61 6e 67 65 4e 61 74 69 76 65 52 75  \[changeNativeRu
ae00: 6e 74 69 6d 65 4f 70 74 69 6f 6e 5c 5d 20 6d 61  ntimeOption\] ma
ae10: 79 20 68 65 6c 70 20 74 6f 20 6d 69 74 69 67 61  y help to mitiga
ae20: 74 65 20 74 68 69 73 2e 0d 0a 20 20 20 20 20 20  te this...      
ae30: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 70 72 6f    #..        pro
ae40: 63 20 63 68 61 6e 67 65 4e 61 74 69 76 65 52 75  c changeNativeRu
ae50: 6e 74 69 6d 65 4f 70 74 69 6f 6e 20 5c 0d 0a 20  ntimeOption \.. 
ae60: 20 20 20 20 20 20 20 20 20 20 20 7b 5b 69 6e 66             {[inf
ae70: 6f 20 61 72 67 73 20 63 68 61 6e 67 65 4e 61 74  o args changeNat
ae80: 69 76 65 52 75 6e 74 69 6d 65 4f 70 74 69 6f 6e  iveRuntimeOption
ae90: 5d 7d 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  ]} \..          
aea0: 20 20 7b 5b 69 6e 66 6f 20 62 6f 64 79 20 63 68    {[info body ch
aeb0: 61 6e 67 65 4e 61 74 69 76 65 52 75 6e 74 69 6d  angeNativeRuntim
aec0: 65 4f 70 74 69 6f 6e 5d 7d 0d 0a 0d 0a 20 20 20  eOption]}....   
aed0: 20 20 20 20 20 63 61 74 63 68 20 7b 0d 0a 20 20       catch {..  
aee0: 20 20 20 20 20 20 20 20 63 68 61 6e 67 65 4e 61          changeNa
aef0: 74 69 76 65 52 75 6e 74 69 6d 65 4f 70 74 69 6f  tiveRuntimeOptio
af00: 6e 20 5b 68 61 73 52 75 6e 74 69 6d 65 4f 70 74  n [hasRuntimeOpt
af10: 69 6f 6e 20 6e 61 74 69 76 65 5d 0d 0a 20 20 20  ion native]..   
af20: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 20       }..      } 
af30: 5b 67 65 74 54 65 73 74 4f 76 65 72 72 69 64 65  [getTestOverride
af40: 73 50 72 65 61 6d 62 6c 65 20 5b 6c 69 73 74 20  sPreamble [list 
af50: 70 61 74 68 20 74 65 73 74 5f 63 68 61 6e 6e 65  path test_channe
af60: 6c 5d 5d 20 24 73 75 66 66 69 78 5d 5d 5d 0d 0a  l]] $suffix]]]..
af70: 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
af80: 6f 63 20 74 72 79 43 6f 70 79 45 78 74 65 72 6e  oc tryCopyExtern
af90: 61 6c 46 69 6c 65 20 7b 0d 0a 20 20 20 20 20 20  alFile {..      
afa0: 20 20 20 20 20 20 66 69 6c 65 4e 61 6d 65 20 7b        fileName {
afb0: 70 6c 61 74 66 6f 72 6d 20 22 22 7d 20 7b 6e 65  platform ""} {ne
afc0: 77 46 69 6c 65 4e 61 6d 65 20 22 22 7d 20 7b 76  wFileName ""} {v
afd0: 65 72 62 6f 73 65 20 66 61 6c 73 65 7d 20 7d 20  erbose false} } 
afe0: 7b 0d 0a 20 20 20 20 20 20 73 65 74 20 73 6f 75  {..      set sou
aff0: 72 63 65 46 69 6c 65 4e 61 6d 65 20 5b 67 65 74  rceFileName [get
b000: 45 78 74 65 72 6e 61 6c 46 69 6c 65 4e 61 6d 65  ExternalFileName
b010: 20 24 66 69 6c 65 4e 61 6d 65 5d 0d 0a 0d 0a 20   $fileName].... 
b020: 20 20 20 20 20 69 66 20 7b 21 5b 66 69 6c 65 20       if {![file 
b030: 65 78 69 73 74 73 20 24 73 6f 75 72 63 65 46 69  exists $sourceFi
b040: 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d  leName]} then {.
b050: 0a 20 20 20 20 20 20 20 20 69 66 20 7b 24 76 65  .        if {$ve
b060: 72 62 6f 73 65 7d 20 74 68 65 6e 20 7b 0d 0a 20  rbose} then {.. 
b070: 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
b080: 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b  ::test_channel [
b090: 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
b0a0: 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
b0b0: 2d 20 73 6b 69 70 70 65 64 20 63 6f 70 79 69 6e  - skipped copyin
b0c0: 67 20 65 78 74 65 72 6e 61 6c 20 66 69 6c 65 20  g external file 
b0d0: 5c 22 22 20 24 73 6f 75 72 63 65 46 69 6c 65 4e  \"" $sourceFileN
b0e0: 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ame \..         
b0f0: 20 20 20 20 20 22 5c 22 2c 20 69 74 20 64 6f 65       "\", it doe
b100: 73 20 6e 6f 74 20 65 78 69 73 74 5c 6e 22 5d 0d  s not exist\n"].
b110: 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  .        }..    
b120: 20 20 20 20 72 65 74 75 72 6e 0d 0a 20 20 20 20      return..    
b130: 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20    }....      if 
b140: 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20  {[string length 
b150: 24 6e 65 77 46 69 6c 65 4e 61 6d 65 5d 20 3e 20  $newFileName] > 
b160: 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
b170: 20 20 20 73 65 74 20 74 61 72 67 65 74 46 69 6c     set targetFil
b180: 65 4e 61 6d 65 20 5b 67 65 74 42 69 6e 61 72 79  eName [getBinary
b190: 46 69 6c 65 4e 61 6d 65 20 24 6e 65 77 46 69 6c  FileName $newFil
b1a0: 65 4e 61 6d 65 20 24 70 6c 61 74 66 6f 72 6d 5d  eName $platform]
b1b0: 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b  ..      } else {
b1c0: 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 74 61  ..        set ta
b1d0: 72 67 65 74 46 69 6c 65 4e 61 6d 65 20 5b 67 65  rgetFileName [ge
b1e0: 74 42 69 6e 61 72 79 46 69 6c 65 4e 61 6d 65 20  tBinaryFileName 
b1f0: 24 66 69 6c 65 4e 61 6d 65 20 24 70 6c 61 74 66  $fileName $platf
b200: 6f 72 6d 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d  orm]..      }...
b210: 0a 20 20 20 20 20 20 73 65 74 20 74 61 72 67 65  .      set targe
b220: 74 44 69 72 65 63 74 6f 72 79 20 5b 66 69 6c 65  tDirectory [file
b230: 20 64 69 72 6e 61 6d 65 20 24 74 61 72 67 65 74   dirname $target
b240: 46 69 6c 65 4e 61 6d 65 5d 0d 0a 0d 0a 20 20 20  FileName]....   
b250: 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d     if {[catch {.
b260: 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 66  .        if {![f
b270: 69 6c 65 20 65 78 69 73 74 73 20 24 74 61 72 67  ile exists $targ
b280: 65 74 44 69 72 65 63 74 6f 72 79 5d 7d 20 74 68  etDirectory]} th
b290: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
b2a0: 66 69 6c 65 20 6d 6b 64 69 72 20 24 74 61 72 67  file mkdir $targ
b2b0: 65 74 44 69 72 65 63 74 6f 72 79 0d 0a 20 20 20  etDirectory..   
b2c0: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
b2d0: 66 69 6c 65 20 63 6f 70 79 20 2d 66 6f 72 63 65  file copy -force
b2e0: 20 24 73 6f 75 72 63 65 46 69 6c 65 4e 61 6d 65   $sourceFileName
b2f0: 20 24 74 61 72 67 65 74 46 69 6c 65 4e 61 6d 65   $targetFileName
b300: 0d 0a 20 20 20 20 20 20 7d 5d 20 3d 3d 20 30 7d  ..      }] == 0}
b310: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
b320: 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
b330: 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
b340: 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
b350: 20 20 22 2d 2d 2d 2d 20 63 6f 70 69 65 64 20 65    "---- copied e
b360: 78 74 65 72 6e 61 6c 20 66 69 6c 65 20 66 72 6f  xternal file fro
b370: 6d 20 5c 22 22 20 24 73 6f 75 72 63 65 46 69 6c  m \"" $sourceFil
b380: 65 4e 61 6d 65 20 22 5c 22 20 74 6f 20 5c 22 22  eName "\" to \""
b390: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
b3a0: 24 74 61 72 67 65 74 46 69 6c 65 4e 61 6d 65 20  $targetFileName 
b3b0: 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d 20 65  \"\n]..      } e
b3c0: 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 74  lse {..        t
b3d0: 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
b3e0: 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
b3f0: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
b400: 22 2d 2d 2d 2d 20 66 61 69 6c 65 64 20 74 6f 20  "---- failed to 
b410: 63 6f 70 79 20 65 78 74 65 72 6e 61 6c 20 66 69  copy external fi
b420: 6c 65 20 66 72 6f 6d 20 5c 22 22 20 24 73 6f 75  le from \"" $sou
b430: 72 63 65 46 69 6c 65 4e 61 6d 65 20 5c 0d 0a 20  rceFileName \.. 
b440: 20 20 20 20 20 20 20 20 20 20 20 22 5c 22 20 74             "\" t
b450: 6f 20 5c 22 22 20 24 74 61 72 67 65 74 46 69 6c  o \"" $targetFil
b460: 65 4e 61 6d 65 20 5c 22 5c 6e 5d 0d 0a 20 20 20  eName \"\n]..   
b470: 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a     }..    }.....
b480: 20 20 20 20 70 72 6f 63 20 74 72 79 43 6f 70 79      proc tryCopy
b490: 42 69 6e 61 72 79 46 69 6c 65 20 7b 0d 0a 20 20  BinaryFile {..  
b4a0: 20 20 20 20 20 20 20 20 20 20 66 69 6c 65 4e 61            fileNa
b4b0: 6d 65 20 7b 70 6c 61 74 66 6f 72 6d 20 22 22 7d  me {platform ""}
b4c0: 20 7b 6e 65 77 46 69 6c 65 4e 61 6d 65 20 22 22   {newFileName ""
b4d0: 7d 20 7b 76 65 72 62 6f 73 65 20 66 61 6c 73 65  } {verbose false
b4e0: 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 73 65 74  } } {..      set
b4f0: 20 73 6f 75 72 63 65 46 69 6c 65 4e 61 6d 65 20   sourceFileName 
b500: 5b 67 65 74 42 69 6e 61 72 79 46 69 6c 65 4e 61  [getBinaryFileNa
b510: 6d 65 20 24 66 69 6c 65 4e 61 6d 65 20 24 70 6c  me $fileName $pl
b520: 61 74 66 6f 72 6d 5d 0d 0a 0d 0a 20 20 20 20 20  atform]....     
b530: 20 69 66 20 7b 21 5b 66 69 6c 65 20 65 78 69 73   if {![file exis
b540: 74 73 20 24 73 6f 75 72 63 65 46 69 6c 65 4e 61  ts $sourceFileNa
b550: 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  me]} then {..   
b560: 20 20 20 20 20 69 66 20 7b 24 76 65 72 62 6f 73       if {$verbos
b570: 65 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  e} then {..     
b580: 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
b590: 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
b5a0: 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
b5b0: 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 73 6b          "---- sk
b5c0: 69 70 70 65 64 20 63 6f 70 79 69 6e 67 20 62 69  ipped copying bi
b5d0: 6e 61 72 79 20 66 69 6c 65 20 5c 22 22 20 24 73  nary file \"" $s
b5e0: 6f 75 72 63 65 46 69 6c 65 4e 61 6d 65 20 5c 0d  ourceFileName \.
b5f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22  .              "
b600: 5c 22 2c 20 69 74 20 64 6f 65 73 20 6e 6f 74 20  \", it does not 
b610: 65 78 69 73 74 5c 6e 22 5d 0d 0a 20 20 20 20 20  exist\n"]..     
b620: 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 72 65     }..        re
b630: 74 75 72 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d  turn..      }...
b640: 0a 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69  .      if {[stri
b650: 6e 67 20 6c 65 6e 67 74 68 20 24 6e 65 77 46 69  ng length $newFi
b660: 6c 65 4e 61 6d 65 5d 20 3e 20 30 7d 20 74 68 65  leName] > 0} the
b670: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 65 74  n {..        set
b680: 20 74 61 72 67 65 74 46 69 6c 65 4e 61 6d 65 20   targetFileName 
b690: 5b 67 65 74 42 75 69 6c 64 46 69 6c 65 4e 61 6d  [getBuildFileNam
b6a0: 65 20 24 6e 65 77 46 69 6c 65 4e 61 6d 65 20 24  e $newFileName $
b6b0: 70 6c 61 74 66 6f 72 6d 5d 0d 0a 20 20 20 20 20  platform]..     
b6c0: 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
b6d0: 20 20 20 73 65 74 20 74 61 72 67 65 74 46 69 6c     set targetFil
b6e0: 65 4e 61 6d 65 20 5b 67 65 74 42 75 69 6c 64 46  eName [getBuildF
b6f0: 69 6c 65 4e 61 6d 65 20 24 66 69 6c 65 4e 61 6d  ileName $fileNam
b700: 65 20 24 70 6c 61 74 66 6f 72 6d 5d 0d 0a 20 20  e $platform]..  
b710: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 73      }....      s
b720: 65 74 20 74 61 72 67 65 74 44 69 72 65 63 74 6f  et targetDirecto
b730: 72 79 20 5b 66 69 6c 65 20 64 69 72 6e 61 6d 65  ry [file dirname
b740: 20 24 74 61 72 67 65 74 46 69 6c 65 4e 61 6d 65   $targetFileName
b750: 5d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b  ]....      if {[
b760: 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20  catch {..       
b770: 20 69 66 20 7b 21 5b 66 69 6c 65 20 65 78 69 73   if {![file exis
b780: 74 73 20 24 74 61 72 67 65 74 44 69 72 65 63 74  ts $targetDirect
b790: 6f 72 79 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ory]} then {..  
b7a0: 20 20 20 20 20 20 20 20 66 69 6c 65 20 6d 6b 64          file mkd
b7b0: 69 72 20 24 74 61 72 67 65 74 44 69 72 65 63 74  ir $targetDirect
b7c0: 6f 72 79 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  ory..        }..
b7d0: 20 20 20 20 20 20 20 20 66 69 6c 65 20 63 6f 70          file cop
b7e0: 79 20 2d 66 6f 72 63 65 20 24 73 6f 75 72 63 65  y -force $source
b7f0: 46 69 6c 65 4e 61 6d 65 20 24 74 61 72 67 65 74  FileName $target
b800: 46 69 6c 65 4e 61 6d 65 0d 0a 20 20 20 20 20 20  FileName..      
b810: 7d 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d  }] == 0} then {.
b820: 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24  .        tputs $
b830: 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b  ::test_channel [
b840: 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
b850: 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
b860: 63 6f 70 69 65 64 20 62 69 6e 61 72 79 20 66 69  copied binary fi
b870: 6c 65 20 66 72 6f 6d 20 5c 22 22 20 24 73 6f 75  le from \"" $sou
b880: 72 63 65 46 69 6c 65 4e 61 6d 65 20 22 5c 22 20  rceFileName "\" 
b890: 74 6f 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20  to \"" \..      
b8a0: 20 20 20 20 20 20 24 74 61 72 67 65 74 46 69 6c        $targetFil
b8b0: 65 4e 61 6d 65 20 5c 22 5c 6e 5d 0d 0a 20 20 20  eName \"\n]..   
b8c0: 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
b8d0: 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
b8e0: 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
b8f0: 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
b900: 20 20 20 20 20 20 22 2d 2d 2d 2d 20 66 61 69 6c        "---- fail
b910: 65 64 20 74 6f 20 63 6f 70 79 20 62 69 6e 61 72  ed to copy binar
b920: 79 20 66 69 6c 65 20 66 72 6f 6d 20 5c 22 22 20  y file from \"" 
b930: 24 73 6f 75 72 63 65 46 69 6c 65 4e 61 6d 65 20  $sourceFileName 
b940: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22  \..            "
b950: 5c 22 20 74 6f 20 5c 22 22 20 24 74 61 72 67 65  \" to \"" $targe
b960: 74 46 69 6c 65 4e 61 6d 65 20 5c 22 5c 6e 5d 0d  tFileName \"\n].
b970: 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d  .      }..    }.
b980: 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 74 72 79  ....    proc try
b990: 43 6f 70 79 42 75 69 6c 64 46 69 6c 65 20 7b 0d  CopyBuildFile {.
b9a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 69 6c  .            fil
b9b0: 65 4e 61 6d 65 20 7b 70 6c 61 74 66 6f 72 6d 20  eName {platform 
b9c0: 22 22 7d 20 7b 6e 65 77 46 69 6c 65 4e 61 6d 65  ""} {newFileName
b9d0: 20 22 22 7d 20 7b 76 65 72 62 6f 73 65 20 66 61   ""} {verbose fa
b9e0: 6c 73 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20  lse} } {..      
b9f0: 73 65 74 20 73 6f 75 72 63 65 46 69 6c 65 4e 61  set sourceFileNa
ba00: 6d 65 20 5b 67 65 74 42 75 69 6c 64 46 69 6c 65  me [getBuildFile
ba10: 4e 61 6d 65 20 24 66 69 6c 65 4e 61 6d 65 20 24  Name $fileName $
ba20: 70 6c 61 74 66 6f 72 6d 5d 0d 0a 0d 0a 20 20 20  platform]....   
ba30: 20 20 20 69 66 20 7b 21 5b 66 69 6c 65 20 65 78     if {![file ex
ba40: 69 73 74 73 20 24 73 6f 75 72 63 65 46 69 6c 65  ists $sourceFile
ba50: 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  Name]} then {.. 
ba60: 20 20 20 20 20 20 20 69 66 20 7b 24 76 65 72 62         if {$verb
ba70: 6f 73 65 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  ose} then {..   
ba80: 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
ba90: 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70  test_channel [ap
baa0: 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
bab0: 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
bac0: 73 6b 69 70 70 65 64 20 63 6f 70 79 69 6e 67 20  skipped copying 
bad0: 62 75 69 6c 64 20 66 69 6c 65 20 5c 22 22 20 24  build file \"" $
bae0: 73 6f 75 72 63 65 46 69 6c 65 4e 61 6d 65 20 5c  sourceFileName \
baf0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
bb00: 22 5c 22 2c 20 69 74 20 64 6f 65 73 20 6e 6f 74  "\", it does not
bb10: 20 65 78 69 73 74 5c 6e 22 5d 0d 0a 20 20 20 20   exist\n"]..    
bb20: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 72      }..        r
bb30: 65 74 75 72 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a  eturn..      }..
bb40: 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72  ..      if {[str
bb50: 69 6e 67 20 6c 65 6e 67 74 68 20 24 6e 65 77 46  ing length $newF
bb60: 69 6c 65 4e 61 6d 65 5d 20 3e 20 30 7d 20 74 68  ileName] > 0} th
bb70: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 65  en {..        se
bb80: 74 20 74 61 72 67 65 74 46 69 6c 65 4e 61 6d 65  t targetFileName
bb90: 20 5b 67 65 74 42 69 6e 61 72 79 46 69 6c 65 4e   [getBinaryFileN
bba0: 61 6d 65 20 24 6e 65 77 46 69 6c 65 4e 61 6d 65  ame $newFileName
bbb0: 20 24 70 6c 61 74 66 6f 72 6d 5d 0d 0a 20 20 20   $platform]..   
bbc0: 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
bbd0: 20 20 20 20 20 73 65 74 20 74 61 72 67 65 74 46       set targetF
bbe0: 69 6c 65 4e 61 6d 65 20 5b 67 65 74 42 69 6e 61  ileName [getBina
bbf0: 72 79 46 69 6c 65 4e 61 6d 65 20 24 66 69 6c 65  ryFileName $file
bc00: 4e 61 6d 65 20 24 70 6c 61 74 66 6f 72 6d 5d 0d  Name $platform].
bc10: 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
bc20: 20 20 73 65 74 20 74 61 72 67 65 74 44 69 72 65    set targetDire
bc30: 63 74 6f 72 79 20 5b 66 69 6c 65 20 64 69 72 6e  ctory [file dirn
bc40: 61 6d 65 20 24 74 61 72 67 65 74 46 69 6c 65 4e  ame $targetFileN
bc50: 61 6d 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 69 66  ame]....      if
bc60: 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20   {[catch {..    
bc70: 20 20 20 20 69 66 20 7b 21 5b 66 69 6c 65 20 65      if {![file e
bc80: 78 69 73 74 73 20 24 74 61 72 67 65 74 44 69 72  xists $targetDir
bc90: 65 63 74 6f 72 79 5d 7d 20 74 68 65 6e 20 7b 0d  ectory]} then {.
bca0: 0a 20 20 20 20 20 20 20 20 20 20 66 69 6c 65 20  .          file 
bcb0: 6d 6b 64 69 72 20 24 74 61 72 67 65 74 44 69 72  mkdir $targetDir
bcc0: 65 63 74 6f 72 79 0d 0a 20 20 20 20 20 20 20 20  ectory..        
bcd0: 7d 0d 0a 20 20 20 20 20 20 20 20 66 69 6c 65 20  }..        file 
bce0: 63 6f 70 79 20 2d 66 6f 72 63 65 20 24 73 6f 75  copy -force $sou
bcf0: 72 63 65 46 69 6c 65 4e 61 6d 65 20 24 74 61 72  rceFileName $tar
bd00: 67 65 74 46 69 6c 65 4e 61 6d 65 0d 0a 20 20 20  getFileName..   
bd10: 20 20 20 7d 5d 20 3d 3d 20 30 7d 20 74 68 65 6e     }] == 0} then
bd20: 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74   {..        tput
bd30: 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
bd40: 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
bd50: 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d  .            "--
bd60: 2d 2d 20 63 6f 70 69 65 64 20 62 75 69 6c 64 20  -- copied build 
bd70: 66 69 6c 65 20 66 72 6f 6d 20 5c 22 22 20 24 73  file from \"" $s
bd80: 6f 75 72 63 65 46 69 6c 65 4e 61 6d 65 20 22 5c  ourceFileName "\
bd90: 22 20 74 6f 20 5c 22 22 20 5c 0d 0a 20 20 20 20  " to \"" \..    
bda0: 20 20 20 20 20 20 20 20 24 74 61 72 67 65 74 46          $targetF
bdb0: 69 6c 65 4e 61 6d 65 20 5c 22 5c 6e 5d 0d 0a 20  ileName \"\n].. 
bdc0: 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
bdd0: 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
bde0: 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70  test_channel [ap
bdf0: 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
be00: 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 66 61          "---- fa
be10: 69 6c 65 64 20 74 6f 20 63 6f 70 79 20 62 75 69  iled to copy bui
be20: 6c 64 20 66 69 6c 65 20 66 72 6f 6d 20 5c 22 22  ld file from \""
be30: 20 24 73 6f 75 72 63 65 46 69 6c 65 4e 61 6d 65   $sourceFileName
be40: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
be50: 22 5c 22 20 74 6f 20 5c 22 22 20 24 74 61 72 67  "\" to \"" $targ
be60: 65 74 46 69 6c 65 4e 61 6d 65 20 5c 22 5c 6e 5d  etFileName \"\n]
be70: 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d  ..      }..    }
be80: 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 74 72  .....    proc tr
be90: 79 44 65 6c 65 74 65 42 69 6e 61 72 79 46 69 6c  yDeleteBinaryFil
bea0: 65 20 7b 20 66 69 6c 65 4e 61 6d 65 20 7b 70 6c  e { fileName {pl
beb0: 61 74 66 6f 72 6d 20 22 22 7d 20 7b 76 65 72 62  atform ""} {verb
bec0: 6f 73 65 20 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a  ose false} } {..
bed0: 20 20 20 20 20 20 73 65 74 20 66 69 6c 65 4e 61        set fileNa
bee0: 6d 65 20 5b 67 65 74 42 69 6e 61 72 79 46 69 6c  me [getBinaryFil
bef0: 65 4e 61 6d 65 20 24 66 69 6c 65 4e 61 6d 65 20  eName $fileName 
bf00: 24 70 6c 61 74 66 6f 72 6d 5d 0d 0a 0d 0a 20 20  $platform]....  
bf10: 20 20 20 20 69 66 20 7b 21 5b 66 69 6c 65 20 65      if {![file e
bf20: 78 69 73 74 73 20 24 66 69 6c 65 4e 61 6d 65 5d  xists $fileName]
bf30: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
bf40: 20 20 69 66 20 7b 24 76 65 72 62 6f 73 65 7d 20    if {$verbose} 
bf50: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
bf60: 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
bf70: 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
bf80: 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
bf90: 20 20 20 20 20 22 2d 2d 2d 2d 20 73 6b 69 70 70       "---- skipp
bfa0: 65 64 20 64 65 6c 65 74 69 6e 67 20 62 69 6e 61  ed deleting bina
bfb0: 72 79 20 66 69 6c 65 20 5c 22 22 20 24 66 69 6c  ry file \"" $fil
bfc0: 65 4e 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20 20  eName \..       
bfd0: 20 20 20 20 20 20 20 22 5c 22 2c 20 69 74 20 64         "\", it d
bfe0: 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 5c 6e 22  oes not exist\n"
bff0: 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  ]..        }..  
c000: 20 20 20 20 20 20 72 65 74 75 72 6e 0d 0a 20 20        return..  
c010: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 69      }....      i
c020: 66 20 7b 5b 63 61 74 63 68 20 7b 66 69 6c 65 20  f {[catch {file 
c030: 64 65 6c 65 74 65 20 24 66 69 6c 65 4e 61 6d 65  delete $fileName
c040: 7d 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d  }] == 0} then {.
c050: 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24  .        tputs $
c060: 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b  ::test_channel [
c070: 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
c080: 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
c090: 64 65 6c 65 74 65 64 20 62 69 6e 61 72 79 20 66  deleted binary f
c0a0: 69 6c 65 20 5c 22 22 20 24 66 69 6c 65 4e 61 6d  ile \"" $fileNam
c0b0: 65 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d  e \"\n]..      }
c0c0: 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
c0d0: 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
c0e0: 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
c0f0: 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
c100: 20 20 22 2d 2d 2d 2d 20 66 61 69 6c 65 64 20 74    "---- failed t
c110: 6f 20 64 65 6c 65 74 65 20 62 69 6e 61 72 79 20  o delete binary 
c120: 66 69 6c 65 20 5c 22 22 20 24 66 69 6c 65 4e 61  file \"" $fileNa
c130: 6d 65 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20  me \"\n]..      
c140: 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  }..    }.....   
c150: 20 70 72 6f 63 20 74 72 79 44 65 6c 65 74 65 42   proc tryDeleteB
c160: 75 69 6c 64 46 69 6c 65 20 7b 20 66 69 6c 65 4e  uildFile { fileN
c170: 61 6d 65 20 7b 70 6c 61 74 66 6f 72 6d 20 22 22  ame {platform ""
c180: 7d 20 7b 76 65 72 62 6f 73 65 20 66 61 6c 73 65  } {verbose false
c190: 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 73 65 74  } } {..      set
c1a0: 20 66 69 6c 65 4e 61 6d 65 20 5b 67 65 74 42 75   fileName [getBu
c1b0: 69 6c 64 46 69 6c 65 4e 61 6d 65 20 24 66 69 6c  ildFileName $fil
c1c0: 65 4e 61 6d 65 20 24 70 6c 61 74 66 6f 72 6d 5d  eName $platform]
c1d0: 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 21 5b  ....      if {![
c1e0: 66 69 6c 65 20 65 78 69 73 74 73 20 24 66 69 6c  file exists $fil
c1f0: 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a  eName]} then {..
c200: 20 20 20 20 20 20 20 20 69 66 20 7b 24 76 65 72          if {$ver
c210: 62 6f 73 65 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  bose} then {..  
c220: 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
c230: 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61  :test_channel [a
c240: 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
c250: 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
c260: 20 73 6b 69 70 70 65 64 20 64 65 6c 65 74 69 6e   skipped deletin
c270: 67 20 62 75 69 6c 64 20 66 69 6c 65 20 5c 22 22  g build file \""
c280: 20 24 66 69 6c 65 4e 61 6d 65 20 5c 0d 0a 20 20   $fileName \..  
c290: 20 20 20 20 20 20 20 20 20 20 20 20 22 5c 22 2c              "\",
c2a0: 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 65 78 69   it does not exi
c2b0: 73 74 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20  st\n"]..        
c2c0: 7d 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  }..        retur
c2d0: 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  n..      }....  
c2e0: 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b      if {[catch {
c2f0: 66 69 6c 65 20 64 65 6c 65 74 65 20 24 66 69 6c  file delete $fil
c300: 65 4e 61 6d 65 7d 5d 20 3d 3d 20 30 7d 20 74 68  eName}] == 0} th
c310: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70  en {..        tp
c320: 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  uts $::test_chan
c330: 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
c340: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22  \..            "
c350: 2d 2d 2d 2d 20 64 65 6c 65 74 65 64 20 62 75 69  ---- deleted bui
c360: 6c 64 20 66 69 6c 65 20 5c 22 22 20 24 66 69 6c  ld file \"" $fil
c370: 65 4e 61 6d 65 20 5c 22 5c 6e 5d 0d 0a 20 20 20  eName \"\n]..   
c380: 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
c390: 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
c3a0: 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
c3b0: 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
c3c0: 20 20 20 20 20 20 22 2d 2d 2d 2d 20 66 61 69 6c        "---- fail
c3d0: 65 64 20 74 6f 20 64 65 6c 65 74 65 20 62 75 69  ed to delete bui
c3e0: 6c 64 20 66 69 6c 65 20 5c 22 22 20 24 66 69 6c  ld file \"" $fil
c3f0: 65 4e 61 6d 65 20 5c 22 5c 6e 5d 0d 0a 20 20 20  eName \"\n]..   
c400: 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a     }..    }.....
c410: 20 20 20 20 70 72 6f 63 20 74 72 79 43 6f 70 79      proc tryCopy
c420: 41 73 73 65 6d 62 6c 79 20 7b 0d 0a 20 20 20 20  Assembly {..    
c430: 20 20 20 20 20 20 20 20 66 69 6c 65 4e 61 6d 65          fileName
c440: 20 7b 70 6c 61 74 66 6f 72 6d 20 22 22 7d 20 7b   {platform ""} {
c450: 70 64 62 20 74 72 75 65 7d 20 7b 76 65 72 62 6f  pdb true} {verbo
c460: 73 65 20 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a 20  se false} } {.. 
c470: 20 20 20 20 20 74 72 79 43 6f 70 79 42 75 69 6c       tryCopyBuil
c480: 64 46 69 6c 65 20 24 66 69 6c 65 4e 61 6d 65 20  dFile $fileName 
c490: 24 70 6c 61 74 66 6f 72 6d 20 22 22 20 24 76 65  $platform "" $ve
c4a0: 72 62 6f 73 65 0d 0a 0d 0a 20 20 20 20 20 20 69  rbose....      i
c4b0: 66 20 7b 24 70 64 62 7d 20 74 68 65 6e 20 7b 0d  f {$pdb} then {.
c4c0: 0a 20 20 20 20 20 20 20 20 74 72 79 43 6f 70 79  .        tryCopy
c4d0: 42 75 69 6c 64 46 69 6c 65 20 5b 61 70 70 65 6e  BuildFile [appen
c4e0: 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
c4f0: 20 20 20 20 20 5b 66 69 6c 65 20 72 6f 6f 74 6e       [file rootn
c500: 61 6d 65 20 24 66 69 6c 65 4e 61 6d 65 5d 20 2e  ame $fileName] .
c510: 70 64 62 5d 20 24 70 6c 61 74 66 6f 72 6d 20 22  pdb] $platform "
c520: 22 20 24 76 65 72 62 6f 73 65 0d 0a 20 20 20 20  " $verbose..    
c530: 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20    }..    }..... 
c540: 20 20 20 70 72 6f 63 20 74 72 79 44 65 6c 65 74     proc tryDelet
c550: 65 41 73 73 65 6d 62 6c 79 20 7b 0d 0a 20 20 20  eAssembly {..   
c560: 20 20 20 20 20 20 20 20 20 66 69 6c 65 4e 61 6d           fileNam
c570: 65 20 7b 70 6c 61 74 66 6f 72 6d 20 22 22 7d 20  e {platform ""} 
c580: 7b 70 64 62 20 74 72 75 65 7d 20 7b 76 65 72 62  {pdb true} {verb
c590: 6f 73 65 20 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a  ose false} } {..
c5a0: 20 20 20 20 20 20 74 72 79 44 65 6c 65 74 65 42        tryDeleteB
c5b0: 69 6e 61 72 79 46 69 6c 65 20 24 66 69 6c 65 4e  inaryFile $fileN
c5c0: 61 6d 65 20 24 70 6c 61 74 66 6f 72 6d 20 24 76  ame $platform $v
c5d0: 65 72 62 6f 73 65 0d 0a 0d 0a 20 20 20 20 20 20  erbose....      
c5e0: 69 66 20 7b 24 70 64 62 7d 20 74 68 65 6e 20 7b  if {$pdb} then {
c5f0: 0d 0a 20 20 20 20 20 20 20 20 74 72 79 44 65 6c  ..        tryDel
c600: 65 74 65 42 69 6e 61 72 79 46 69 6c 65 20 5b 61  eteBinaryFile [a
c610: 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
c620: 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20 72           [file r
c630: 6f 6f 74 6e 61 6d 65 20 24 66 69 6c 65 4e 61 6d  ootname $fileNam
c640: 65 5d 20 2e 70 64 62 5d 20 24 70 6c 61 74 66 6f  e] .pdb] $platfo
c650: 72 6d 20 24 76 65 72 62 6f 73 65 0d 0a 20 20 20  rm $verbose..   
c660: 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a     }..    }.....
c670: 20 20 20 20 70 72 6f 63 20 74 72 79 4c 6f 61 64      proc tryLoad
c680: 41 73 73 65 6d 62 6c 79 20 7b 20 66 69 6c 65 4e  Assembly { fileN
c690: 61 6d 65 20 7b 70 6c 61 74 66 6f 72 6d 20 22 22  ame {platform ""
c6a0: 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 73 65 74  } } {..      set
c6b0: 20 66 69 6c 65 4e 61 6d 65 20 5b 67 65 74 42 69   fileName [getBi
c6c0: 6e 61 72 79 46 69 6c 65 4e 61 6d 65 20 24 66 69  naryFileName $fi
c6d0: 6c 65 4e 61 6d 65 20 24 70 6c 61 74 66 6f 72 6d  leName $platform
c6e0: 5d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b  ]....      if {[
c6f0: 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20  catch {..       
c700: 20 73 65 74 20 61 73 73 65 6d 62 6c 79 20 5b 6f   set assembly [o
c710: 62 6a 65 63 74 20 6c 6f 61 64 20 2d 6c 6f 61 64  bject load -load
c720: 74 79 70 65 20 46 69 6c 65 20 2d 61 6c 69 61 73  type File -alias
c730: 20 24 66 69 6c 65 4e 61 6d 65 5d 0d 0a 20 20 20   $fileName]..   
c740: 20 20 20 7d 5d 20 3d 3d 20 30 7d 20 74 68 65 6e     }] == 0} then
c750: 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20   {..        #.. 
c760: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4e         # NOTE: N
c770: 6f 77 2c 20 61 64 64 20 74 68 65 20 6e 65 63 65  ow, add the nece
c780: 73 73 61 72 79 20 74 65 73 74 20 63 6f 6e 73 74  ssary test const
c790: 72 61 69 6e 74 2e 0d 0a 20 20 20 20 20 20 20 20  raint...        
c7a0: 23 0d 0a 20 20 20 20 20 20 20 20 61 64 64 43 6f  #..        addCo
c7b0: 6e 73 74 72 61 69 6e 74 20 5b 66 69 6c 65 20 72  nstraint [file r
c7c0: 6f 6f 74 6e 61 6d 65 20 5b 66 69 6c 65 20 74 61  ootname [file ta
c7d0: 69 6c 20 24 66 69 6c 65 4e 61 6d 65 5d 5d 0d 0a  il $fileName]]..
c7e0: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
c7f0: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 47 72 61       # NOTE: Gra
c800: 62 20 74 68 65 20 69 6d 61 67 65 20 72 75 6e 74  b the image runt
c810: 69 6d 65 20 76 65 72 73 69 6f 6e 20 66 72 6f 6d  ime version from
c820: 20 74 68 65 20 61 73 73 65 6d 62 6c 79 20 62 65   the assembly be
c830: 63 61 75 73 65 0d 0a 20 20 20 20 20 20 20 20 23  cause..        #
c840: 20 20 20 20 20 20 20 73 65 76 65 72 61 6c 20 74         several t
c850: 65 73 74 73 20 72 65 6c 79 20 6f 6e 20 69 74 20  ests rely on it 
c860: 68 61 76 69 6e 67 20 61 20 63 65 72 74 61 69 6e  having a certain
c870: 20 76 61 6c 75 65 2e 0d 0a 20 20 20 20 20 20 20   value...       
c880: 20 23 0d 0a 20 20 20 20 20 20 20 20 61 64 64 43   #..        addC
c890: 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e  onstraint [appen
c8a0: 64 41 72 67 73 20 5b 66 69 6c 65 20 74 61 69 6c  dArgs [file tail
c8b0: 20 24 66 69 6c 65 4e 61 6d 65 5d 20 5f 20 5c 0d   $fileName] _ \.
c8c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 24 61  .            [$a
c8d0: 73 73 65 6d 62 6c 79 20 49 6d 61 67 65 52 75 6e  ssembly ImageRun
c8e0: 74 69 6d 65 56 65 72 73 69 6f 6e 5d 5d 0d 0a 0d  timeVersion]]...
c8f0: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
c900: 20 20 20 20 23 20 4e 4f 54 45 3a 20 52 65 74 75      # NOTE: Retu
c910: 72 6e 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68  rn the full path
c920: 20 6f 66 20 74 68 65 20 6c 6f 61 64 65 64 20 66   of the loaded f
c930: 69 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  ile...        #.
c940: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
c950: 24 66 69 6c 65 4e 61 6d 65 0d 0a 20 20 20 20 20  $fileName..     
c960: 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65 74 75   }....      retu
c970: 72 6e 20 22 22 0d 0a 20 20 20 20 7d 0d 0a 0c 0d  rn ""..    }....
c980: 0a 20 20 20 20 70 72 6f 63 20 69 73 53 51 4c 69  .    proc isSQLi
c990: 74 65 52 65 61 64 79 20 7b 7d 20 7b 0d 0a 20 20  teReady {} {..  
c9a0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
c9b0: 4f 54 45 3a 20 54 68 69 73 20 70 72 6f 63 65 64  OTE: This proced
c9c0: 75 72 65 20 6d 75 73 74 20 72 65 74 75 72 6e 20  ure must return 
c9d0: 6e 6f 6e 2d 7a 65 72 6f 20 6f 6e 6c 79 20 69 66  non-zero only if
c9e0: 20 74 68 65 20 53 51 4c 69 74 65 20 6e 61 74 69   the SQLite nati
c9f0: 76 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  ve..      #     
ca00: 20 20 6c 69 62 72 61 72 79 20 61 6e 64 20 74 68    library and th
ca10: 65 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51  e System.Data.SQ
ca20: 4c 69 74 65 20 6d 61 6e 61 67 65 64 20 61 73 73  Lite managed ass
ca30: 65 6d 62 6c 79 20 61 72 65 20 6c 6f 61 64 65 64  embly are loaded
ca40: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
ca50: 61 6e 64 20 72 65 61 64 79 20 66 6f 72 20 75 73  and ready for us
ca60: 65 20 62 79 20 74 68 65 20 74 65 73 74 20 73 75  e by the test su
ca70: 69 74 65 2e 20 20 43 75 72 72 65 6e 74 6c 79 2c  ite.  Currently,
ca80: 20 74 68 69 73 20 70 72 6f 63 65 64 75 72 65 0d   this procedure.
ca90: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 73  .      #       s
caa0: 68 6f 75 6c 64 20 62 65 20 63 61 6c 6c 65 64 20  hould be called 
cab0: 6f 6e 6c 79 20 61 66 74 65 72 20 74 68 65 20 5b  only after the [
cac0: 74 72 79 4c 6f 61 64 41 73 73 65 6d 62 6c 79 5d  tryLoadAssembly]
cad0: 20 70 72 6f 63 65 64 75 72 65 20 68 61 73 0d 0a   procedure has..
cae0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 62 65        #       be
caf0: 65 6e 20 63 61 6c 6c 65 64 20 74 6f 20 70 72 6f  en called to pro
cb00: 62 65 20 66 6f 72 20 74 68 65 20 53 79 73 74 65  be for the Syste
cb10: 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 20 6d 61  m.Data.SQLite ma
cb20: 6e 61 67 65 64 20 61 73 73 65 6d 62 6c 79 0d 0a  naged assembly..
cb30: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 61 6e        #       an
cb40: 64 20 74 68 65 20 5b 63 68 65 63 6b 46 6f 72 53  d the [checkForS
cb50: 51 4c 69 74 65 5d 20 70 72 6f 63 65 64 75 72 65  QLite] procedure
cb60: 20 68 61 73 20 62 65 65 6e 20 63 61 6c 6c 65 64   has been called
cb70: 20 74 6f 20 70 72 6f 62 65 20 66 6f 72 0d 0a 20   to probe for.. 
cb80: 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68 65       #       the
cb90: 20 53 51 4c 69 74 65 20 6e 61 74 69 76 65 20 6c   SQLite native l
cba0: 69 62 72 61 72 79 3b 20 6f 74 68 65 72 77 69 73  ibrary; otherwis
cbb0: 65 2c 20 74 68 69 73 20 70 72 6f 63 65 64 75 72  e, this procedur
cbc0: 65 20 77 69 6c 6c 20 73 69 6d 70 6c 79 0d 0a 20  e will simply.. 
cbd0: 20 20 20 20 20 23 20 20 20 20 20 20 20 61 6c 77       #       alw
cbe0: 61 79 73 20 72 65 74 75 72 6e 20 7a 65 72 6f 2e  ays return zero.
cbf0: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
cc00: 20 72 65 74 75 72 6e 20 5b 65 78 70 72 20 7b 0d   return [expr {.
cc10: 0a 20 20 20 20 20 20 20 20 5b 68 61 76 65 43 6f  .        [haveCo
cc20: 6e 73 74 72 61 69 6e 74 20 53 79 73 74 65 6d 2e  nstraint System.
cc30: 44 61 74 61 2e 53 51 4c 69 74 65 5d 20 26 26 20  Data.SQLite] && 
cc40: 5b 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74 20  [haveConstraint 
cc50: 53 51 4c 69 74 65 5d 0d 0a 20 20 20 20 20 20 7d  SQLite]..      }
cc60: 5d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  ]..    }.....   
cc70: 20 70 72 6f 63 20 6d 61 74 63 68 50 6c 61 74 66   proc matchPlatf
cc80: 6f 72 6d 20 7b 20 70 6c 61 74 66 6f 72 6d 20 7d  orm { platform }
cc90: 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20   {..      #..   
cca0: 20 20 20 23 20 4e 4f 54 45 3a 20 41 6e 20 65 6d     # NOTE: An em
ccb0: 70 74 79 20 73 74 72 69 6e 67 20 66 6f 72 20 74  pty string for t
ccc0: 68 65 20 70 6c 61 74 66 6f 72 6d 20 6d 65 61 6e  he platform mean
ccd0: 73 20 74 68 61 74 20 74 68 65 20 62 75 69 6c 64  s that the build
cce0: 20 69 73 20 6e 6f 74 0d 0a 20 20 20 20 20 20 23   is not..      #
ccf0: 20 20 20 20 20 20 20 5b 70 72 69 6d 61 72 69 6c         [primaril
cd00: 79 5d 20 61 20 6e 61 74 69 76 65 20 62 75 69 6c  y] a native buil
cd10: 64 3b 20 74 68 65 72 65 66 6f 72 65 2c 20 69 74  d; therefore, it
cd20: 20 61 6c 77 61 79 73 20 6d 61 74 63 68 65 73 2e   always matches.
cd30: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
cd40: 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e   if {[string len
cd50: 67 74 68 20 24 70 6c 61 74 66 6f 72 6d 5d 20 3d  gth $platform] =
cd60: 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  = 0} then {..   
cd70: 20 20 20 20 20 72 65 74 75 72 6e 20 74 72 75 65       return true
cd80: 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
cd90: 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
cda0: 54 45 3a 20 44 6f 65 73 20 74 68 65 20 73 70 65  TE: Does the spe
cdb0: 63 69 66 69 65 64 20 70 6c 61 74 66 6f 72 6d 20  cified platform 
cdc0: 6d 61 74 63 68 20 75 70 20 74 6f 20 74 68 65 20  match up to the 
cdd0: 63 75 72 72 65 6e 74 20 70 72 6f 63 65 73 73 3f  current process?
cde0: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
cdf0: 20 69 66 20 7b 24 70 6c 61 74 66 6f 72 6d 20 65   if {$platform e
ce00: 71 20 5b 6d 61 63 68 69 6e 65 54 6f 50 6c 61 74  q [machineToPlat
ce10: 66 6f 72 6d 20 24 3a 3a 74 63 6c 5f 70 6c 61 74  form $::tcl_plat
ce20: 66 6f 72 6d 28 6d 61 63 68 69 6e 65 29 5d 7d 20  form(machine)]} 
ce30: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
ce40: 72 65 74 75 72 6e 20 74 72 75 65 0d 0a 20 20 20  return true..   
ce50: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d     }....      #.
ce60: 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54  .      # NOTE: T
ce70: 68 65 20 73 70 65 63 69 66 69 65 64 20 70 6c 61  he specified pla
ce80: 74 66 6f 72 6d 20 64 6f 65 73 20 6e 6f 74 20 6d  tform does not m
ce90: 61 74 63 68 20 75 70 20 77 69 74 68 20 74 68 65  atch up with the
cea0: 20 70 6c 61 74 66 6f 72 6d 0d 0a 20 20 20 20 20   platform..     
ceb0: 20 23 20 20 20 20 20 20 20 66 6f 72 20 74 68 65   #       for the
cec0: 20 63 75 72 72 65 6e 74 20 70 72 6f 63 65 73 73   current process
ced0: 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
cee0: 20 20 72 65 74 75 72 6e 20 66 61 6c 73 65 0d 0a    return false..
cef0: 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
cf00: 6f 63 20 68 61 76 65 53 51 4c 69 74 65 4f 62 6a  oc haveSQLiteObj
cf10: 65 63 74 43 6f 6d 6d 61 6e 64 20 7b 7d 20 7b 0d  ectCommand {} {.
cf20: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
cf30: 23 20 4e 4f 54 45 3a 20 49 73 20 74 68 65 20 5b  # NOTE: Is the [
cf40: 6f 62 6a 65 63 74 5d 20 63 6f 6d 6d 61 6e 64 20  object] command 
cf50: 63 75 72 72 65 6e 74 6c 79 20 61 76 61 69 6c 61  currently availa
cf60: 62 6c 65 3f 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ble?..      #.. 
cf70: 20 20 20 20 20 72 65 74 75 72 6e 20 5b 65 78 70       return [exp
cf80: 72 20 7b 5b 6c 6c 65 6e 67 74 68 20 5b 69 6e 66  r {[llength [inf
cf90: 6f 20 63 6f 6d 6d 61 6e 64 73 20 6f 62 6a 65 63  o commands objec
cfa0: 74 5d 5d 20 3e 20 30 7d 5d 0d 0a 20 20 20 20 7d  t]] > 0}]..    }
cfb0: 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 63 68  .....    proc ch
cfc0: 65 63 6b 46 6f 72 53 51 4c 69 74 65 4f 62 6a 65  eckForSQLiteObje
cfd0: 63 74 43 6f 6d 6d 61 6e 64 20 7b 20 63 68 61 6e  ctCommand { chan
cfe0: 6e 65 6c 20 7d 20 7b 0d 0a 20 20 20 20 20 20 74  nel } {..      t
cff0: 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 22 2d  puts $channel "-
d000: 2d 2d 2d 20 63 68 65 63 6b 69 6e 67 20 66 6f 72  --- checking for
d010: 20 5c 22 6f 62 6a 65 63 74 5c 22 20 63 6f 6d 6d   \"object\" comm
d020: 61 6e 64 20 75 73 61 67 65 2e 2e 2e 20 22 0d 0a  and usage... "..
d030: 0d 0a 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e  ..      if {![in
d040: 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 73  fo exists ::no(s
d050: 71 6c 69 74 65 4f 62 6a 65 63 74 43 6f 6d 6d 61  qliteObjectComma
d060: 6e 64 29 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20  nd)] && \..     
d070: 20 20 20 20 20 5b 68 61 76 65 53 51 4c 69 74 65       [haveSQLite
d080: 4f 62 6a 65 63 74 43 6f 6d 6d 61 6e 64 5d 7d 20  ObjectCommand]} 
d090: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
d0a0: 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 79  tputs $channel y
d0b0: 65 73 5c 6e 0d 0a 20 20 20 20 20 20 7d 20 65 6c  es\n..      } el
d0c0: 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d  se {..        #.
d0d0: 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
d0e0: 20 55 6e 6c 65 73 73 20 77 65 20 61 72 65 20 66   Unless we are f
d0f0: 6f 72 62 69 64 64 65 6e 20 66 72 6f 6d 20 64 6f  orbidden from do
d100: 69 6e 67 20 73 6f 2c 20 61 64 64 20 73 6f 6d 65  ing so, add some
d110: 20 63 6f 6e 73 74 72 61 69 6e 74 73 0d 0a 20 20   constraints..  
d120: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68        #       th
d130: 61 74 20 77 69 6c 6c 20 61 6c 6c 6f 77 20 6d 6f  at will allow mo
d140: 73 74 20 6f 66 20 74 68 65 20 74 65 73 74 20 73  st of the test s
d150: 75 69 74 65 20 74 6f 20 72 75 6e 20 28 69 2e 65  uite to run (i.e
d160: 2e 20 74 68 6f 73 65 0d 0a 20 20 20 20 20 20 20  . those..       
d170: 20 23 20 20 20 20 20 20 20 74 65 73 74 73 20 74   #       tests t
d180: 68 61 74 20 64 6f 20 6e 6f 74 20 64 69 72 65 63  hat do not direc
d190: 74 6c 79 20 72 65 6c 79 20 75 70 6f 6e 20 74 68  tly rely upon th
d1a0: 65 20 5b 6f 62 6a 65 63 74 5d 20 63 6f 6d 6d 61  e [object] comma
d1b0: 6e 64 29 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  nd)...        #.
d1c0: 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69  .        if {![i
d1d0: 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28  nfo exists ::no(
d1e0: 73 68 69 6d 53 51 4c 69 74 65 41 73 73 65 6d 62  shimSQLiteAssemb
d1f0: 6c 79 43 6f 6e 73 74 72 61 69 6e 74 73 29 5d 7d  lyConstraints)]}
d200: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
d210: 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74     addConstraint
d220: 20 53 51 4c 69 74 65 0d 0a 20 20 20 20 20 20 20   SQLite..       
d230: 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74     addConstraint
d240: 20 53 51 4c 69 74 65 49 6e 74 65 72 6f 70 0d 0a   SQLiteInterop..
d250: 20 20 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e            addCon
d260: 73 74 72 61 69 6e 74 20 53 79 73 74 65 6d 2e 44  straint System.D
d270: 61 74 61 2e 53 51 4c 69 74 65 0d 0a 20 20 20 20  ata.SQLite..    
d280: 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61        addConstra
d290: 69 6e 74 20 53 79 73 74 65 6d 2e 44 61 74 61 2e  int System.Data.
d2a0: 53 51 4c 69 74 65 2e 45 6e 63 72 79 70 74 69 6f  SQLite.Encryptio
d2b0: 6e 0d 0a 20 20 20 20 20 20 20 20 20 20 61 64 64  n..          add
d2c0: 43 6f 6e 73 74 72 61 69 6e 74 20 53 79 73 74 65  Constraint Syste
d2d0: 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 4c 69  m.Data.SQLite.Li
d2e0: 6e 71 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  nq....          
d2f0: 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61  addConstraint [a
d300: 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
d310: 20 20 20 20 20 20 20 20 20 20 20 53 79 73 74 65             Syste
d320: 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 64 6c  m.Data.SQLite.dl
d330: 6c 5f 76 20 5b 67 65 74 42 75 69 6c 64 43 6c 72  l_v [getBuildClr
d340: 56 65 72 73 69 6f 6e 5d 5d 0d 0a 20 20 20 20 20  Version]]..     
d350: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
d360: 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74  if {![info exist
d370: 73 20 3a 3a 6e 6f 28 73 68 69 6d 53 51 4c 69 74  s ::no(shimSQLit
d380: 65 44 65 66 69 6e 65 43 6f 6e 73 74 61 6e 74 43  eDefineConstantC
d390: 6f 6e 73 74 72 61 69 6e 74 73 29 5d 7d 20 74 68  onstraints)]} th
d3a0: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
d3b0: 66 6f 72 65 61 63 68 20 64 65 66 69 6e 65 43 6f  foreach defineCo
d3c0: 6e 73 74 61 6e 74 20 5b 6c 69 73 74 20 5c 0d 0a  nstant [list \..
d3d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 49 4e                IN
d3e0: 54 45 52 4f 50 5f 45 58 54 45 4e 53 49 4f 4e 5f  TEROP_EXTENSION_
d3f0: 46 55 4e 43 54 49 4f 4e 53 20 49 4e 54 45 52 4f  FUNCTIONS INTERO
d400: 50 5f 46 54 53 35 5f 45 58 54 45 4e 53 49 4f 4e  P_FTS5_EXTENSION
d410: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
d420: 20 20 49 4e 54 45 52 4f 50 5f 4a 53 4f 4e 31 5f    INTEROP_JSON1_
d430: 45 58 54 45 4e 53 49 4f 4e 20 49 4e 54 45 52 4f  EXTENSION INTERO
d440: 50 5f 50 45 52 43 45 4e 54 49 4c 45 5f 45 58 54  P_PERCENTILE_EXT
d450: 45 4e 53 49 4f 4e 20 5c 0d 0a 20 20 20 20 20 20  ENSION \..      
d460: 20 20 20 20 20 20 20 20 49 4e 54 45 52 4f 50 5f          INTEROP_
d470: 52 45 47 45 58 50 5f 45 58 54 45 4e 53 49 4f 4e  REGEXP_EXTENSION
d480: 20 49 4e 54 45 52 4f 50 5f 54 45 53 54 5f 45 58   INTEROP_TEST_EX
d490: 54 45 4e 53 49 4f 4e 20 5c 0d 0a 20 20 20 20 20  TENSION \..     
d4a0: 20 20 20 20 20 20 20 20 20 49 4e 54 45 52 4f 50           INTEROP
d4b0: 5f 54 4f 54 59 50 45 5f 45 58 54 45 4e 53 49 4f  _TOTYPE_EXTENSIO
d4c0: 4e 20 49 4e 54 45 52 4f 50 5f 56 49 52 54 55 41  N INTEROP_VIRTUA
d4d0: 4c 5f 54 41 42 4c 45 20 5c 0d 0a 20 20 20 20 20  L_TABLE \..     
d4e0: 20 20 20 20 20 20 20 20 20 55 53 45 5f 49 4e 54           USE_INT
d4f0: 45 52 4f 50 5f 44 4c 4c 5d 20 7b 0d 0a 20 20 20  EROP_DLL] {..   
d500: 20 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73           addCons
d510: 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72  traint [appendAr
d520: 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
d530: 20 20 20 20 20 20 5b 67 65 74 53 51 4c 69 74 65        [getSQLite
d540: 44 65 66 69 6e 65 43 6f 6e 73 74 61 6e 74 50 72  DefineConstantPr
d550: 65 66 69 78 5d 20 24 64 65 66 69 6e 65 43 6f 6e  efix] $defineCon
d560: 73 74 61 6e 74 5d 0d 0a 20 20 20 20 20 20 20 20  stant]..        
d570: 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a    }..        }..
d580: 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b  ..        if {![
d590: 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f  info exists ::no
d5a0: 28 73 68 69 6d 53 51 4c 69 74 65 56 69 73 75 61  (shimSQLiteVisua
d5b0: 6c 53 74 75 64 69 6f 43 6f 6e 73 74 72 61 69 6e  lStudioConstrain
d5c0: 74 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ts)]} then {..  
d5d0: 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74          addConst
d5e0: 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67  raint [appendArg
d5f0: 73 20 76 69 73 75 61 6c 53 74 75 64 69 6f 20 5b  s visualStudio [
d600: 67 65 74 42 75 69 6c 64 59 65 61 72 5d 5d 0d 0a  getBuildYear]]..
d610: 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
d620: 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
d630: 6e 65 6c 20 6e 6f 5c 6e 0d 0a 20 20 20 20 20 20  nel no\n..      
d640: 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  }..    }.....   
d650: 20 70 72 6f 63 20 63 68 61 6e 67 65 4e 61 74 69   proc changeNati
d660: 76 65 52 75 6e 74 69 6d 65 4f 70 74 69 6f 6e 20  veRuntimeOption 
d670: 7b 20 6e 61 74 69 76 65 20 7d 20 7b 0d 0a 20 20  { native } {..  
d680: 20 20 20 20 69 66 20 7b 5b 6c 6c 65 6e 67 74 68      if {[llength
d690: 20 5b 69 6e 66 6f 20 63 6f 6d 6d 61 6e 64 73 20   [info commands 
d6a0: 64 65 62 75 67 5d 5d 20 3e 20 30 20 26 26 20 5c  debug]] > 0 && \
d6b0: 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 6c 6c 65  ..          [lle
d6c0: 6e 67 74 68 20 5b 69 6e 66 6f 20 73 75 62 63 6f  ngth [info subco
d6d0: 6d 6d 61 6e 64 73 20 64 65 62 75 67 20 72 75 6e  mmands debug run
d6e0: 74 69 6d 65 6f 70 74 69 6f 6e 5d 5d 20 3e 20 30  timeoption]] > 0
d6f0: 20 26 26 20 5b 63 61 74 63 68 20 7b 0d 0a 20 20   && [catch {..  
d700: 20 20 20 20 20 20 64 65 62 75 67 20 72 75 6e 74        debug runt
d710: 69 6d 65 6f 70 74 69 6f 6e 20 5b 65 78 70 72 20  imeoption [expr 
d720: 7b 24 6e 61 74 69 76 65 20 3f 20 22 61 64 64 22  {$native ? "add"
d730: 20 3a 20 22 72 65 6d 6f 76 65 22 7d 5d 20 6e 61   : "remove"}] na
d740: 74 69 76 65 0d 0a 20 20 20 20 20 20 7d 5d 20 3d  tive..      }] =
d750: 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  = 0} then {..   
d760: 20 20 20 20 20 72 65 74 75 72 6e 20 74 72 75 65       return true
d770: 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
d780: 20 20 20 69 66 20 7b 5b 68 61 76 65 53 51 4c 69     if {[haveSQLi
d790: 74 65 4f 62 6a 65 63 74 43 6f 6d 6d 61 6e 64 5d  teObjectCommand]
d7a0: 20 26 26 20 5b 63 61 74 63 68 20 7b 0d 0a 20 20   && [catch {..  
d7b0: 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76        object inv
d7c0: 6f 6b 65 20 49 6e 74 65 72 70 72 65 74 65 72 2e  oke Interpreter.
d7d0: 47 65 74 41 63 74 69 76 65 20 5b 65 78 70 72 20  GetActive [expr 
d7e0: 7b 24 6e 61 74 69 76 65 20 3f 20 5c 0d 0a 20 20  {$native ? \..  
d7f0: 20 20 20 20 20 20 20 20 20 20 22 41 64 64 52 75            "AddRu
d800: 6e 74 69 6d 65 4f 70 74 69 6f 6e 22 20 3a 20 22  ntimeOption" : "
d810: 52 65 6d 6f 76 65 52 75 6e 74 69 6d 65 4f 70 74  RemoveRuntimeOpt
d820: 69 6f 6e 22 7d 5d 20 6e 61 74 69 76 65 0d 0a 20  ion"}] native.. 
d830: 20 20 20 20 20 7d 5d 20 3d 3d 20 30 7d 20 74 68       }] == 0} th
d840: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 72 65  en {..        re
d850: 74 75 72 6e 20 74 72 75 65 0d 0a 20 20 20 20 20  turn true..     
d860: 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65 74 75   }....      retu
d870: 72 6e 20 66 61 6c 73 65 0d 0a 20 20 20 20 7d 0d  rn false..    }.
d880: 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 63 68 65  ....    proc che
d890: 63 6b 46 6f 72 53 51 4c 69 74 65 42 75 69 6c 64  ckForSQLiteBuild
d8a0: 73 20 7b 20 63 68 61 6e 6e 65 6c 20 7b 73 65 6c  s { channel {sel
d8b0: 65 63 74 20 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a  ect false} } {..
d8c0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
d8d0: 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 66 6f 72   NOTE: Check for
d8e0: 20 65 76 65 72 79 20 70 6f 73 73 69 62 6c 65 20   every possible 
d8f0: 76 61 6c 69 64 20 63 6f 6d 62 69 6e 61 74 69 6f  valid combinatio
d900: 6e 20 6f 66 20 76 61 6c 75 65 73 20 75 73 65 64  n of values used
d910: 20 77 68 65 6e 0d 0a 20 20 20 20 20 20 23 20 20   when..      #  
d920: 20 20 20 20 20 6c 6f 63 61 74 69 6e 67 20 6f 75       locating ou
d930: 74 20 74 68 65 20 62 75 69 6c 64 20 6f 75 74 70  t the build outp
d940: 75 74 20 64 69 72 65 63 74 6f 72 79 2c 20 73 68  ut directory, sh
d950: 6f 77 69 6e 67 20 65 61 63 68 20 61 76 61 69 6c  owing each avail
d960: 61 62 6c 65 0d 0a 20 20 20 20 20 20 23 20 20 20  able..      #   
d970: 20 20 20 20 62 75 69 6c 64 20 76 61 72 69 61 74      build variat
d980: 69 6f 6e 20 61 6c 6f 6e 67 20 74 68 65 20 77 61  ion along the wa
d990: 79 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  y...      #..   
d9a0: 20 20 20 66 6f 72 65 61 63 68 20 6e 61 74 69 76     foreach nativ
d9b0: 65 20 5b 6c 69 73 74 20 66 61 6c 73 65 20 74 72  e [list false tr
d9c0: 75 65 5d 20 7b 0d 0a 20 20 20 20 20 20 20 20 66  ue] {..        f
d9d0: 6f 72 65 61 63 68 20 79 65 61 72 20 5b 67 65 74  oreach year [get
d9e0: 42 75 69 6c 64 59 65 61 72 73 5d 20 7b 0d 0a 20  BuildYears] {.. 
d9f0: 20 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68           foreach
da00: 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 5b   configuration [
da10: 67 65 74 42 75 69 6c 64 43 6f 6e 66 69 67 75 72  getBuildConfigur
da20: 61 74 69 6f 6e 73 5d 20 7b 0d 0a 20 20 20 20 20  ations] {..     
da30: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
da40: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 46 69        # NOTE: Fi
da50: 67 75 72 65 20 6f 75 74 20 74 68 65 20 65 66 66  gure out the eff
da60: 65 63 74 69 76 65 20 62 75 69 6c 64 20 70 6c 61  ective build pla
da70: 74 66 6f 72 6d 2e 20 20 54 68 69 73 20 69 73 0d  tform.  This is.
da80: 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 20 20  .            #  
da90: 20 20 20 20 20 62 61 73 65 64 20 6f 6e 20 77 68       based on wh
daa0: 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 61 20 5b  ether or not a [
dab0: 70 72 69 6d 61 72 69 6c 79 5d 20 6e 61 74 69 76  primarily] nativ
dac0: 65 20 62 75 69 6c 64 0d 0a 20 20 20 20 20 20 20  e build..       
dad0: 20 20 20 20 20 23 20 20 20 20 20 20 20 69 73 20       #       is 
dae0: 62 65 69 6e 67 20 75 73 65 64 2e 20 20 46 6f 72  being used.  For
daf0: 20 5b 70 72 69 6d 61 72 69 6c 79 5d 20 6e 6f 6e   [primarily] non
db00: 2d 6e 61 74 69 76 65 20 62 75 69 6c 64 73 2c 0d  -native builds,.
db10: 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 20 20  .            #  
db20: 20 20 20 20 20 74 68 69 73 20 77 69 6c 6c 20 62       this will b
db30: 65 20 61 6e 20 65 6d 70 74 79 20 73 74 72 69 6e  e an empty strin
db40: 67 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  g...            
db50: 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  #..            s
db60: 65 74 20 70 6c 61 74 66 6f 72 6d 20 5b 67 65 74  et platform [get
db70: 42 75 69 6c 64 50 6c 61 74 66 6f 72 6d 20 24 6e  BuildPlatform $n
db80: 61 74 69 76 65 5d 0d 0a 0d 0a 20 20 20 20 20 20  ative]....      
db90: 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
dba0: 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
dbb0: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
dbc0: 20 20 20 20 22 2d 2d 2d 2d 20 63 68 65 63 6b 69      "---- checki
dbd0: 6e 67 20 66 6f 72 20 53 79 73 74 65 6d 2e 44 61  ng for System.Da
dbe0: 74 61 2e 53 51 4c 69 74 65 20 62 75 69 6c 64 20  ta.SQLite build 
dbf0: 5c 22 22 20 5b 65 78 70 72 20 5c 0d 0a 20 20 20  \"" [expr \..   
dc00: 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 24 6e               {$n
dc10: 61 74 69 76 65 20 3f 20 22 6e 61 74 69 76 65 2f  ative ? "native/
dc20: 22 20 3a 20 22 22 7d 5d 20 5b 65 78 70 72 20 7b  " : ""}] [expr {
dc30: 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 5c  [string length \
dc40: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
dc50: 20 20 24 70 6c 61 74 66 6f 72 6d 5d 20 3e 20 30    $platform] > 0
dc60: 20 3f 20 5b 61 70 70 65 6e 64 41 72 67 73 20 24   ? [appendArgs $
dc70: 70 6c 61 74 66 6f 72 6d 20 2f 5d 20 3a 20 22 22  platform /] : ""
dc80: 7d 5d 20 24 79 65 61 72 20 5c 0d 0a 20 20 20 20  }] $year \..    
dc90: 20 20 20 20 20 20 20 20 20 20 20 20 2f 20 24 63              / $c
dca0: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 22 5c 22  onfiguration "\"
dcb0: 2e 2e 2e 20 22 5d 0d 0a 0d 0a 20 20 20 20 20 20  ... "]....      
dcc0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
dcd0: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 42 75 69       # NOTE: Bui
dce0: 6c 64 20 74 68 65 20 66 75 6c 6c 79 20 71 75 61  ld the fully qua
dcf0: 6c 69 66 69 65 64 20 64 69 72 65 63 74 6f 72 79  lified directory
dd00: 20 77 68 65 72 65 20 74 68 65 20 6e 65 63 65 73   where the neces
dd10: 73 61 72 79 0d 0a 20 20 20 20 20 20 20 20 20 20  sary..          
dd20: 20 20 23 20 20 20 20 20 20 20 63 6f 6d 70 6f 6e    #       compon
dd30: 65 6e 74 73 20 66 6f 72 20 53 79 73 74 65 6d 2e  ents for System.
dd40: 44 61 74 61 2e 53 51 4c 69 74 65 20 73 68 6f 75  Data.SQLite shou
dd50: 6c 64 20 62 65 20 66 6f 75 6e 64 2e 0d 0a 20 20  ld be found...  
dd60: 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
dd70: 20 20 20 20 20 20 20 20 20 73 65 74 20 64 69 72           set dir
dd80: 65 63 74 6f 72 79 20 5b 6a 6f 69 6e 42 75 69 6c  ectory [joinBuil
dd90: 64 44 69 72 65 63 74 6f 72 79 20 24 6e 61 74 69  dDirectory $nati
dda0: 76 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  ve \..          
ddb0: 20 20 20 20 20 20 5b 67 65 74 42 75 69 6c 64 42        [getBuildB
ddc0: 61 73 65 44 69 72 65 63 74 6f 72 79 5d 20 24 79  aseDirectory] $y
ddd0: 65 61 72 20 24 70 6c 61 74 66 6f 72 6d 20 24 63  ear $platform $c
dde0: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 5d 0d 0a 0d  onfiguration]...
ddf0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a  .            #..
de00: 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f              # NO
de10: 54 45 3a 20 44 6f 20 74 68 65 20 6e 65 63 65 73  TE: Do the neces
de20: 73 61 72 79 20 66 69 6c 65 73 20 65 78 69 73 74  sary files exist
de30: 3f 20 20 43 75 72 72 65 6e 74 6c 79 2c 20 6e 6f  ?  Currently, no
de40: 20 6f 74 68 65 72 20 73 74 65 70 73 0d 0a 20 20   other steps..  
de50: 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20            #     
de60: 20 20 61 72 65 20 74 61 6b 65 6e 20 74 6f 20 76    are taken to v
de70: 65 72 69 66 79 20 74 68 69 73 20 62 75 69 6c 64  erify this build
de80: 20 69 73 20 61 63 74 75 61 6c 6c 79 20 76 69 61   is actually via
de90: 62 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  ble...          
dea0: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20    #..           
deb0: 20 69 66 20 7b 5b 69 73 42 75 69 6c 64 41 76 61   if {[isBuildAva
dec0: 69 6c 61 62 6c 65 20 24 6e 61 74 69 76 65 20 24  ilable $native $
ded0: 64 69 72 65 63 74 6f 72 79 5d 7d 20 74 68 65 6e  directory]} then
dee0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
def0: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20    #..           
df00: 20 20 20 23 20 4e 4f 54 45 3a 20 57 68 65 6e 20     # NOTE: When 
df10: 69 6e 20 22 73 65 6c 65 63 74 22 20 6d 6f 64 65  in "select" mode
df20: 2c 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  , automatically 
df30: 73 65 6c 65 63 74 20 74 68 65 20 66 69 72 73 74  select the first
df40: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
df50: 23 20 20 20 20 20 20 20 61 76 61 69 6c 61 62 6c  #       availabl
df60: 65 20 62 75 69 6c 64 20 6f 66 20 53 79 73 74 65  e build of Syste
df70: 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 20 61 6e  m.Data.SQLite an
df80: 64 20 74 68 65 6e 20 72 65 74 75 72 6e 0d 0a 20  d then return.. 
df90: 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20 20               #  
dfa0: 20 20 20 20 20 69 6d 6d 65 64 69 61 74 65 6c 79       immediately
dfb0: 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
dfc0: 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   #..            
dfd0: 20 20 69 66 20 7b 24 73 65 6c 65 63 74 20 26 26    if {$select &&
dfe0: 20 5b 6d 61 74 63 68 50 6c 61 74 66 6f 72 6d 20   [matchPlatform 
dff0: 24 70 6c 61 74 66 6f 72 6d 5d 7d 20 74 68 65 6e  $platform]} then
e000: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
e010: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
e020: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4d         # NOTE: M
e030: 61 6e 75 61 6c 6c 79 20 6f 76 65 72 72 69 64 65  anually override
e040: 20 61 6c 6c 20 74 68 65 20 62 75 69 6c 64 20 64   all the build d
e050: 69 72 65 63 74 6f 72 79 20 73 65 6c 65 63 74 69  irectory selecti
e060: 6f 6e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  on..            
e070: 20 20 20 20 23 20 20 20 20 20 20 20 72 65 6c 61      #       rela
e080: 74 65 64 20 74 65 73 74 20 73 65 74 74 69 6e 67  ted test setting
e090: 73 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 66 6f  s in order to fo
e0a0: 72 63 65 20 74 68 69 73 20 62 75 69 6c 64 0d 0a  rce this build..
e0b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e0c0: 23 20 20 20 20 20 20 20 6f 66 20 53 79 73 74 65  #       of Syste
e0d0: 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 20 74 6f  m.Data.SQLite to
e0e0: 20 62 65 20 75 73 65 64 2e 0d 0a 20 20 20 20 20   be used...     
e0f0: 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
e100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
e110: 20 7b 21 5b 63 68 61 6e 67 65 4e 61 74 69 76 65   {![changeNative
e120: 52 75 6e 74 69 6d 65 4f 70 74 69 6f 6e 20 24 6e  RuntimeOption $n
e130: 61 74 69 76 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a  ative]} then {..
e140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e150: 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
e160: 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
e170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e180: 20 20 20 20 20 20 22 6e 6f 2c 20 66 61 69 6c 65        "no, faile
e190: 64 20 74 6f 20 22 20 5b 65 78 70 72 20 7b 24 6e  d to " [expr {$n
e1a0: 61 74 69 76 65 20 3f 20 22 61 64 64 22 20 3a 20  ative ? "add" : 
e1b0: 22 72 65 6d 6f 76 65 22 7d 5d 20 5c 0d 0a 20 20  "remove"}] \..  
e1c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e1d0: 20 20 20 20 22 20 74 68 65 20 5c 22 6e 61 74 69      " the \"nati
e1e0: 76 65 5c 22 20 72 75 6e 74 69 6d 65 20 6f 70 74  ve\" runtime opt
e1f0: 69 6f 6e 5c 6e 22 5d 0d 0a 0d 0a 20 20 20 20 20  ion\n"]....     
e200: 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74               ret
e210: 75 72 6e 20 66 61 6c 73 65 0d 0a 20 20 20 20 20  urn false..     
e220: 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a             }....
e230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e240: 73 65 74 20 3a 3a 74 65 73 74 5f 79 65 61 72 20  set ::test_year 
e250: 24 79 65 61 72 0d 0a 20 20 20 20 20 20 20 20 20  $year..         
e260: 20 20 20 20 20 20 20 73 65 74 20 3a 3a 74 65 73         set ::tes
e270: 74 5f 70 6c 61 74 66 6f 72 6d 20 24 70 6c 61 74  t_platform $plat
e280: 66 6f 72 6d 0d 0a 20 20 20 20 20 20 20 20 20 20  form..          
e290: 20 20 20 20 20 20 73 65 74 20 3a 3a 74 65 73 74        set ::test
e2a0: 5f 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 24  _configuration $
e2b0: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 0d 0a 0d  configuration...
e2c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
e2d0: 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
e2e0: 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
e2f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e300: 20 20 20 22 79 65 73 2c 20 73 65 6c 65 63 74 65     "yes, selecte
e310: 64 20 28 22 20 5b 65 78 70 72 20 7b 24 6e 61 74  d (" [expr {$nat
e320: 69 76 65 20 3f 20 22 6e 61 74 69 76 65 2f 22 20  ive ? "native/" 
e330: 3a 20 22 22 7d 5d 20 5c 0d 0a 20 20 20 20 20 20  : ""}] \..      
e340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 65                [e
e350: 78 70 72 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e  xpr {[string len
e360: 67 74 68 20 24 70 6c 61 74 66 6f 72 6d 5d 20 3e  gth $platform] >
e370: 20 30 20 3f 20 5b 61 70 70 65 6e 64 41 72 67 73   0 ? [appendArgs
e380: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
e390: 20 20 20 20 20 20 20 20 24 70 6c 61 74 66 6f 72          $platfor
e3a0: 6d 20 2f 5d 20 3a 20 22 22 7d 5d 20 24 79 65 61  m /] : ""}] $yea
e3b0: 72 20 2f 20 24 63 6f 6e 66 69 67 75 72 61 74 69  r / $configurati
e3c0: 6f 6e 20 22 29 5c 6e 22 5d 0d 0a 0d 0a 20 20 20  on ")\n"]....   
e3d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74               ret
e3e0: 75 72 6e 20 74 72 75 65 0d 0a 20 20 20 20 20 20  urn true..      
e3f0: 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b          } else {
e400: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
e410: 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
e420: 20 79 65 73 5c 6e 0d 0a 20 20 20 20 20 20 20 20   yes\n..        
e430: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
e440: 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
e450: 20 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75               tpu
e460: 74 73 20 24 63 68 61 6e 6e 65 6c 20 6e 6f 5c 6e  ts $channel no\n
e470: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
e480: 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  .          }..  
e490: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d        }..      }
e4a0: 0d 0a 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ....      return
e4b0: 20 66 61 6c 73 65 0d 0a 20 20 20 20 7d 0d 0a 0c   false..    }...
e4c0: 0d 0a 20 20 20 20 70 72 6f 63 20 63 68 65 63 6b  ..    proc check
e4d0: 46 6f 72 53 51 4c 69 74 65 52 65 6c 65 61 73 65  ForSQLiteRelease
e4e0: 73 20 7b 20 63 68 61 6e 6e 65 6c 20 7b 73 65 6c  s { channel {sel
e4f0: 65 63 74 20 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a  ect false} } {..
e500: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
e510: 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 66 6f 72   NOTE: Check for
e520: 20 70 61 73 74 20 72 65 6c 65 61 73 65 73 20 6f   past releases o
e530: 66 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51  f System.Data.SQ
e540: 4c 69 74 65 20 69 6e 20 74 68 65 20 64 69 72 65  Lite in the dire
e550: 63 74 6f 72 79 0d 0a 20 20 20 20 20 20 23 20 20  ctory..      #  
e560: 20 20 20 20 20 63 6f 6e 74 61 69 6e 65 64 20 69       contained i
e570: 6e 20 74 68 65 20 22 53 79 73 74 65 6d 2e 44 61  n the "System.Da
e580: 74 61 2e 53 51 4c 69 74 65 22 20 65 6e 76 69 72  ta.SQLite" envir
e590: 6f 6e 6d 65 6e 74 20 76 61 72 69 61 62 6c 65 2c  onment variable,
e5a0: 20 69 66 0d 0a 20 20 20 20 20 20 23 20 20 20 20   if..      #    
e5b0: 20 20 20 70 72 65 73 65 6e 74 2e 0d 0a 20 20 20     present...   
e5c0: 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
e5d0: 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 65  [info exists ::e
e5e0: 6e 76 28 53 79 73 74 65 6d 2e 44 61 74 61 2e 53  nv(System.Data.S
e5f0: 51 4c 69 74 65 29 5d 20 26 26 20 5c 0d 0a 20 20  QLite)] && \..  
e600: 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20          [string 
e610: 6c 65 6e 67 74 68 20 24 3a 3a 65 6e 76 28 53 79  length $::env(Sy
e620: 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
e630: 29 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  )] > 0} then {..
e640: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
e650: 20 20 20 23 20 4e 4f 54 45 3a 20 42 75 69 6c 64     # NOTE: Build
e660: 20 74 68 65 20 66 75 6c 6c 79 20 71 75 61 6c 69   the fully quali
e670: 66 69 65 64 20 64 69 72 65 63 74 6f 72 79 20 77  fied directory w
e680: 68 65 72 65 20 74 68 65 20 6e 65 63 65 73 73 61  here the necessa
e690: 72 79 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  ry..        #   
e6a0: 20 20 20 20 63 6f 6d 70 6f 6e 65 6e 74 73 20 66      components f
e6b0: 6f 72 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53  or System.Data.S
e6c0: 51 4c 69 74 65 20 73 68 6f 75 6c 64 20 62 65 20  QLite should be 
e6d0: 66 6f 75 6e 64 2e 0d 0a 20 20 20 20 20 20 20 20  found...        
e6e0: 23 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 64  #..        set d
e6f0: 69 72 65 63 74 6f 72 79 20 5b 66 69 6c 65 20 6e  irectory [file n
e700: 61 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c 65 20  ativename [file 
e710: 6a 6f 69 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20  join \..        
e720: 20 20 20 20 24 3a 3a 65 6e 76 28 53 79 73 74 65      $::env(Syste
e730: 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 29 20 5b  m.Data.SQLite) [
e740: 67 65 74 52 65 6c 65 61 73 65 56 65 72 73 69 6f  getReleaseVersio
e750: 6e 5d 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  n]]]....        
e760: 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b  tputs $channel [
e770: 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
e780: 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
e790: 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 53 79 73  checking for Sys
e7a0: 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 20  tem.Data.SQLite 
e7b0: 72 65 6c 65 61 73 65 20 5c 22 22 20 5c 0d 0a 20  release \"" \.. 
e7c0: 20 20 20 20 20 20 20 20 20 20 20 24 64 69 72 65             $dire
e7d0: 63 74 6f 72 79 20 22 5c 22 2e 2e 2e 20 22 5d 0d  ctory "\"... "].
e7e0: 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b  ...        if {[
e7f0: 69 73 52 65 6c 65 61 73 65 41 76 61 69 6c 61 62  isReleaseAvailab
e800: 6c 65 20 24 64 69 72 65 63 74 6f 72 79 20 70 6c  le $directory pl
e810: 61 74 66 6f 72 6d 5d 7d 20 74 68 65 6e 20 7b 0d  atform]} then {.
e820: 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b  .          if {[
e830: 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 70  string length $p
e840: 6c 61 74 66 6f 72 6d 5d 20 3d 3d 20 30 7d 20 74  latform] == 0} t
e850: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
e860: 20 20 20 73 65 74 20 70 6c 61 74 66 6f 72 6d 20     set platform 
e870: 75 6e 6b 6e 6f 77 6e 0d 0a 20 20 20 20 20 20 20  unknown..       
e880: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
e890: 20 20 69 66 20 7b 24 73 65 6c 65 63 74 20 26 26    if {$select &&
e8a0: 20 5b 6d 61 74 63 68 50 6c 61 74 66 6f 72 6d 20   [matchPlatform 
e8b0: 24 70 6c 61 74 66 6f 72 6d 5d 7d 20 74 68 65 6e  $platform]} then
e8c0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
e8d0: 73 65 74 20 3a 3a 62 75 69 6c 64 5f 64 69 72 65  set ::build_dire
e8e0: 63 74 6f 72 79 20 24 64 69 72 65 63 74 6f 72 79  ctory $directory
e8f0: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
e900: 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b  tputs $channel [
e910: 61 70 70 65 6e 64 41 72 67 73 20 22 79 65 73 2c  appendArgs "yes,
e920: 20 73 65 6c 65 63 74 65 64 20 28 22 20 24 70 6c   selected (" $pl
e930: 61 74 66 6f 72 6d 20 22 29 5c 6e 22 5d 0d 0a 0d  atform ")\n"]...
e940: 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74  .            ret
e950: 75 72 6e 20 74 72 75 65 0d 0a 20 20 20 20 20 20  urn true..      
e960: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
e970: 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
e980: 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  $channel [append
e990: 41 72 67 73 20 22 79 65 73 20 28 22 20 24 70 6c  Args "yes (" $pl
e9a0: 61 74 66 6f 72 6d 20 22 29 5c 6e 22 5d 0d 0a 20  atform ")\n"].. 
e9b0: 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
e9c0: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
e9d0: 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
e9e0: 68 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d 0a 0d 0a 20  hannel no\n.... 
e9f0: 20 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68           foreach
ea00: 20 70 61 74 68 20 5b 6c 73 6f 72 74 20 2d 64 65   path [lsort -de
ea10: 63 72 65 61 73 69 6e 67 20 5b 66 69 6c 65 20 6c  creasing [file l
ea20: 69 73 74 20 24 64 69 72 65 63 74 6f 72 79 20 2a  ist $directory *
ea30: 5d 5d 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  ]] {..          
ea40: 20 20 69 66 20 7b 5b 66 69 6c 65 20 65 78 69 73    if {[file exis
ea50: 74 73 20 24 70 61 74 68 5d 20 26 26 20 5b 66 69  ts $path] && [fi
ea60: 6c 65 20 69 73 64 69 72 65 63 74 6f 72 79 20 24  le isdirectory $
ea70: 70 61 74 68 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  path]} then {.. 
ea80: 20 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75               tpu
ea90: 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70  ts $channel [app
eaa0: 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
eab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d               "--
eac0: 2d 2d 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20  -- checking for 
ead0: 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
eae0: 74 65 20 72 65 6c 65 61 73 65 20 5c 22 22 20 5c  te release \"" \
eaf0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
eb00: 20 20 20 20 24 70 61 74 68 20 22 5c 22 2e 2e 2e      $path "\"...
eb10: 20 22 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20   "]....         
eb20: 20 20 20 20 20 69 66 20 7b 5b 69 73 52 65 6c 65       if {[isRele
eb30: 61 73 65 41 76 61 69 6c 61 62 6c 65 20 24 70 61  aseAvailable $pa
eb40: 74 68 20 70 6c 61 74 66 6f 72 6d 5d 7d 20 74 68  th platform]} th
eb50: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
eb60: 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e        if {[strin
eb70: 67 20 6c 65 6e 67 74 68 20 24 70 6c 61 74 66 6f  g length $platfo
eb80: 72 6d 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b  rm] == 0} then {
eb90: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
eba0: 20 20 20 20 73 65 74 20 70 6c 61 74 66 6f 72 6d      set platform
ebb0: 20 75 6e 6b 6e 6f 77 6e 0d 0a 20 20 20 20 20 20   unknown..      
ebc0: 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20            }.... 
ebd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
ebe0: 66 20 7b 24 73 65 6c 65 63 74 20 26 26 20 5b 6d  f {$select && [m
ebf0: 61 74 63 68 50 6c 61 74 66 6f 72 6d 20 24 70 6c  atchPlatform $pl
ec00: 61 74 66 6f 72 6d 5d 7d 20 74 68 65 6e 20 7b 0d  atform]} then {.
ec10: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
ec20: 20 20 20 73 65 74 20 3a 3a 62 75 69 6c 64 5f 64     set ::build_d
ec30: 69 72 65 63 74 6f 72 79 20 24 70 61 74 68 0d 0a  irectory $path..
ec40: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
ec50: 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
ec60: 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 22  el [appendArgs "
ec70: 79 65 73 2c 20 73 65 6c 65 63 74 65 64 20 28 22  yes, selected ("
ec80: 20 24 70 6c 61 74 66 6f 72 6d 20 22 29 5c 6e 22   $platform ")\n"
ec90: 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ]....           
eca0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 72         return tr
ecb0: 75 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ue..            
ecc0: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
ecd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ece0: 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b  tputs $channel [
ecf0: 61 70 70 65 6e 64 41 72 67 73 20 22 79 65 73 20  appendArgs "yes 
ed00: 28 22 20 24 70 6c 61 74 66 6f 72 6d 20 22 29 5c  (" $platform ")\
ed10: 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n"]..           
ed20: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
ed30: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
ed40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ed50: 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 6e  tputs $channel n
ed60: 6f 5c 6e 0d 0a 20 20 20 20 20 20 20 20 20 20 20  o\n..           
ed70: 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
ed80: 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d    }..          }
ed90: 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20  ..        }..   
eda0: 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
edb0: 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
edc0: 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
edd0: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22  \..            "
ede0: 2d 2d 2d 2d 20 65 6e 76 69 72 6f 6e 6d 65 6e 74  ---- environment
edf0: 20 76 61 72 69 61 62 6c 65 20 5c 22 53 79 73 74   variable \"Syst
ee00: 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 5c 22  em.Data.SQLite\"
ee10: 20 69 73 20 6e 6f 74 20 22 20 5c 0d 0a 20 20 20   is not " \..   
ee20: 20 20 20 20 20 20 20 20 20 22 73 65 74 2c 20 73           "set, s
ee30: 6b 69 70 70 69 6e 67 20 63 68 65 63 6b 20 66 6f  kipping check fo
ee40: 72 20 72 65 6c 65 61 73 65 73 2e 2e 2e 5c 6e 22  r releases...\n"
ee50: 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  ]..      }....  
ee60: 20 20 20 20 72 65 74 75 72 6e 20 66 61 6c 73 65      return false
ee70: 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
ee80: 70 72 6f 63 20 63 68 65 63 6b 46 6f 72 53 51 4c  proc checkForSQL
ee90: 69 74 65 4c 69 62 72 61 72 79 20 7b 20 63 68 61  iteLibrary { cha
eea0: 6e 6e 65 6c 20 7d 20 7b 0d 0a 20 20 20 20 20 20  nnel } {..      
eeb0: 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 22  tputs $channel "
eec0: 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e 67 20 66 6f  ---- checking fo
eed0: 72 20 53 51 4c 69 74 65 20 63 6f 72 65 20 6c 69  r SQLite core li
eee0: 62 72 61 72 79 2e 2e 2e 20 22 0d 0a 0d 0a 20 20  brary... "....  
eef0: 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b      if {[catch {
ef00: 0d 0a 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74  ..        object
ef10: 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b   invoke -flags +
ef20: 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20  NonPublic \..   
ef30: 20 20 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e           System.
ef40: 44 61 74 61 2e 53 51 4c 69 74 65 2e 53 51 4c 69  Data.SQLite.SQLi
ef50: 74 65 33 20 53 51 4c 69 74 65 56 65 72 73 69 6f  te3 SQLiteVersio
ef60: 6e 0d 0a 20 20 20 20 20 20 7d 20 76 65 72 73 69  n..      } versi
ef70: 6f 6e 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b  on] == 0} then {
ef80: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
ef90: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68 65       # NOTE: Che
efa0: 63 6b 20 69 66 20 74 68 65 20 72 65 74 75 72 6e  ck if the return
efb0: 65 64 20 76 65 72 73 69 6f 6e 20 77 61 73 20 6e  ed version was n
efc0: 75 6c 6c 2e 20 20 49 66 20 73 6f 2c 20 6d 61 6b  ull.  If so, mak
efd0: 65 20 69 74 20 65 61 73 79 0d 0a 20 20 20 20 20  e it easy..     
efe0: 20 20 20 23 20 20 20 20 20 20 20 74 6f 20 73 70     #       to sp
eff0: 6f 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  ot...        #..
f000: 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72          if {[str
f010: 69 6e 67 20 6c 65 6e 67 74 68 20 24 76 65 72 73  ing length $vers
f020: 69 6f 6e 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20  ion] == 0} then 
f030: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74  {..          set
f040: 20 76 65 72 73 69 6f 6e 20 6e 75 6c 6c 0d 0a 20   version null.. 
f050: 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
f060: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
f070: 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74 20 74   NOTE: Attempt t
f080: 6f 20 71 75 65 72 79 20 74 68 65 20 46 6f 73 73  o query the Foss
f090: 69 6c 20 73 6f 75 72 63 65 20 69 64 65 6e 74 69  il source identi
f0a0: 66 69 65 72 20 66 6f 72 20 74 68 65 20 53 51 4c  fier for the SQL
f0b0: 69 74 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20  ite..        #  
f0c0: 20 20 20 20 20 63 6f 72 65 20 6c 69 62 72 61 72       core librar
f0d0: 79 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  y...        #.. 
f0e0: 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63         if {[catc
f0f0: 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 6f  h {..          o
f100: 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c  bject invoke -fl
f110: 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c  ags +NonPublic \
f120: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
f130: 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
f140: 74 65 2e 53 51 4c 69 74 65 33 20 53 51 4c 69 74  te.SQLite3 SQLit
f150: 65 53 6f 75 72 63 65 49 64 0d 0a 20 20 20 20 20  eSourceId..     
f160: 20 20 20 7d 20 73 6f 75 72 63 65 49 64 5d 7d 20     } sourceId]} 
f170: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
f180: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23    #..          #
f190: 20 4e 4f 54 45 3a 20 57 65 20 66 61 69 6c 65 64   NOTE: We failed
f1a0: 20 74 6f 20 71 75 65 72 79 20 74 68 65 20 46 6f   to query the Fo
f1b0: 73 73 69 6c 20 73 6f 75 72 63 65 20 69 64 65 6e  ssil source iden
f1c0: 74 69 66 69 65 72 2e 0d 0a 20 20 20 20 20 20 20  tifier...       
f1d0: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
f1e0: 73 65 74 20 73 6f 75 72 63 65 49 64 20 75 6e 6b  set sourceId unk
f1f0: 6e 6f 77 6e 0d 0a 20 20 20 20 20 20 20 20 7d 0d  nown..        }.
f200: 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
f210: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68        # NOTE: Ch
f220: 65 63 6b 20 69 66 20 74 68 65 20 72 65 74 75 72  eck if the retur
f230: 6e 65 64 20 46 6f 73 73 69 6c 20 73 6f 75 72 63  ned Fossil sourc
f240: 65 20 69 64 65 6e 74 69 66 69 65 72 20 77 61 73  e identifier was
f250: 20 6e 75 6c 6c 2e 20 20 49 66 0d 0a 20 20 20 20   null.  If..    
f260: 20 20 20 20 23 20 20 20 20 20 20 20 73 6f 2c 20      #       so, 
f270: 6d 61 6b 65 20 69 74 20 65 61 73 79 20 74 6f 20  make it easy to 
f280: 73 70 6f 74 2e 0d 0a 20 20 20 20 20 20 20 20 23  spot...        #
f290: 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73  ..        if {[s
f2a0: 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 73 6f  tring length $so
f2b0: 75 72 63 65 49 64 5d 20 3d 3d 20 30 7d 20 74 68  urceId] == 0} th
f2c0: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
f2d0: 73 65 74 20 73 6f 75 72 63 65 49 64 20 6e 75 6c  set sourceId nul
f2e0: 6c 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  l..        }....
f2f0: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
f300: 20 20 20 23 20 4e 4f 54 45 3a 20 59 65 73 2c 20     # NOTE: Yes, 
f310: 74 68 65 20 53 51 4c 69 74 65 20 63 6f 72 65 20  the SQLite core 
f320: 6c 69 62 72 61 72 79 20 61 70 70 65 61 72 73 20  library appears 
f330: 74 6f 20 62 65 20 61 76 61 69 6c 61 62 6c 65 2e  to be available.
f340: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
f350: 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69       addConstrai
f360: 6e 74 20 53 51 4c 69 74 65 0d 0a 0d 0a 20 20 20  nt SQLite....   
f370: 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
f380: 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
f390: 22 79 65 73 20 28 22 20 24 76 65 72 73 69 6f 6e  "yes (" $version
f3a0: 20 22 20 22 20 24 73 6f 75 72 63 65 49 64 20 22   " " $sourceId "
f3b0: 29 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 7d 20 65  )\n"]..      } e
f3c0: 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 74  lse {..        t
f3d0: 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 6e 6f  puts $channel no
f3e0: 5c 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20  \n..      }..   
f3f0: 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
f400: 63 68 65 63 6b 46 6f 72 53 51 4c 69 74 65 49 6e  checkForSQLiteIn
f410: 74 65 72 6f 70 20 7b 20 63 68 61 6e 6e 65 6c 20  terop { channel 
f420: 7d 20 7b 0d 0a 20 20 20 20 20 20 74 70 75 74 73  } {..      tputs
f430: 20 24 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20   $channel "---- 
f440: 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 53 51 4c  checking for SQL
f450: 69 74 65 20 69 6e 74 65 72 6f 70 20 61 73 73 65  ite interop asse
f460: 6d 62 6c 79 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20  mbly... "....   
f470: 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d     if {[catch {.
f480: 0a 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20  .        object 
f490: 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e  invoke -flags +N
f4a0: 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20  onPublic \..    
f4b0: 20 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44          System.D
f4c0: 61 74 61 2e 53 51 4c 69 74 65 2e 53 51 4c 69 74  ata.SQLite.SQLit
f4d0: 65 33 20 49 6e 74 65 72 6f 70 56 65 72 73 69 6f  e3 InteropVersio
f4e0: 6e 0d 0a 20 20 20 20 20 20 7d 20 76 65 72 73 69  n..      } versi
f4f0: 6f 6e 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b  on] == 0} then {
f500: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
f510: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68 65       # NOTE: Che
f520: 63 6b 20 69 66 20 74 68 65 20 72 65 74 75 72 6e  ck if the return
f530: 65 64 20 76 65 72 73 69 6f 6e 20 77 61 73 20 6e  ed version was n
f540: 75 6c 6c 2e 20 20 49 66 20 73 6f 2c 20 6d 61 6b  ull.  If so, mak
f550: 65 20 69 74 20 65 61 73 79 0d 0a 20 20 20 20 20  e it easy..     
f560: 20 20 20 23 20 20 20 20 20 20 20 74 6f 20 73 70     #       to sp
f570: 6f 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  ot...        #..
f580: 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72          if {[str
f590: 69 6e 67 20 6c 65 6e 67 74 68 20 24 76 65 72 73  ing length $vers
f5a0: 69 6f 6e 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20  ion] == 0} then 
f5b0: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74  {..          set
f5c0: 20 76 65 72 73 69 6f 6e 20 6e 75 6c 6c 0d 0a 20   version null.. 
f5d0: 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
f5e0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
f5f0: 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74 20 74   NOTE: Attempt t
f600: 6f 20 71 75 65 72 79 20 74 68 65 20 46 6f 73 73  o query the Foss
f610: 69 6c 20 73 6f 75 72 63 65 20 69 64 65 6e 74 69  il source identi
f620: 66 69 65 72 20 66 6f 72 20 74 68 65 20 53 51 4c  fier for the SQL
f630: 69 74 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20  ite..        #  
f640: 20 20 20 20 20 63 6f 72 65 20 6c 69 62 72 61 72       core librar
f650: 79 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  y...        #.. 
f660: 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63         if {[catc
f670: 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 6f  h {..          o
f680: 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c  bject invoke -fl
f690: 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c  ags +NonPublic \
f6a0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
f6b0: 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
f6c0: 74 65 2e 53 51 4c 69 74 65 33 20 49 6e 74 65 72  te.SQLite3 Inter
f6d0: 6f 70 53 6f 75 72 63 65 49 64 0d 0a 20 20 20 20  opSourceId..    
f6e0: 20 20 20 20 7d 20 73 6f 75 72 63 65 49 64 5d 7d      } sourceId]}
f6f0: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
f700: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
f710: 23 20 4e 4f 54 45 3a 20 57 65 20 66 61 69 6c 65  # NOTE: We faile
f720: 64 20 74 6f 20 71 75 65 72 79 20 74 68 65 20 46  d to query the F
f730: 6f 73 73 69 6c 20 73 6f 75 72 63 65 20 69 64 65  ossil source ide
f740: 6e 74 69 66 69 65 72 2e 0d 0a 20 20 20 20 20 20  ntifier...      
f750: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
f760: 20 73 65 74 20 73 6f 75 72 63 65 49 64 20 75 6e   set sourceId un
f770: 6b 6e 6f 77 6e 0d 0a 20 20 20 20 20 20 20 20 7d  known..        }
f780: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  ....        #.. 
f790: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43         # NOTE: C
f7a0: 68 65 63 6b 20 69 66 20 74 68 65 20 72 65 74 75  heck if the retu
f7b0: 72 6e 65 64 20 46 6f 73 73 69 6c 20 73 6f 75 72  rned Fossil sour
f7c0: 63 65 20 69 64 65 6e 74 69 66 69 65 72 20 77 61  ce identifier wa
f7d0: 73 20 6e 75 6c 6c 2e 20 20 49 66 0d 0a 20 20 20  s null.  If..   
f7e0: 20 20 20 20 20 23 20 20 20 20 20 20 20 73 6f 2c       #       so,
f7f0: 20 6d 61 6b 65 20 69 74 20 65 61 73 79 20 74 6f   make it easy to
f800: 20 73 70 6f 74 2e 0d 0a 20 20 20 20 20 20 20 20   spot...        
f810: 23 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b  #..        if {[
f820: 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 73  string length $s
f830: 6f 75 72 63 65 49 64 5d 20 3d 3d 20 30 7d 20 74  ourceId] == 0} t
f840: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
f850: 20 73 65 74 20 73 6f 75 72 63 65 49 64 20 6e 75   set sourceId nu
f860: 6c 6c 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d  ll..        }...
f870: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
f880: 20 20 20 20 23 20 4e 4f 54 45 3a 20 42 65 66 6f      # NOTE: Befo
f890: 72 65 20 61 63 74 75 61 6c 6c 79 20 61 64 64 69  re actually addi
f8a0: 6e 67 20 74 68 65 20 74 65 73 74 20 63 6f 6e 73  ng the test cons
f8b0: 74 72 61 69 6e 74 2c 20 6d 61 6b 65 20 73 75 72  traint, make sur
f8c0: 65 20 74 68 65 0d 0a 20 20 20 20 20 20 20 20 23  e the..        #
f8d0: 20 20 20 20 20 20 20 76 65 72 73 69 6f 6e 20 69         version i
f8e0: 73 20 76 61 6c 69 64 20 28 69 2e 65 2e 20 6e 6f  s valid (i.e. no
f8f0: 74 20 6a 75 73 74 20 74 68 61 74 20 77 65 20 63  t just that we c
f900: 6f 75 6c 64 20 71 75 65 72 79 20 69 74 29 2e 0d  ould query it)..
f910: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
f920: 20 20 20 20 69 66 20 7b 24 76 65 72 73 69 6f 6e      if {$version
f930: 20 6e 65 20 22 6e 75 6c 6c 22 7d 20 74 68 65 6e   ne "null"} then
f940: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d   {..          #.
f950: 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54  .          # NOT
f960: 45 3a 20 59 65 73 2c 20 74 68 65 20 53 51 4c 69  E: Yes, the SQLi
f970: 74 65 20 69 6e 74 65 72 6f 70 20 61 73 73 65 6d  te interop assem
f980: 62 6c 79 20 61 70 70 65 61 72 73 20 74 6f 20 62  bly appears to b
f990: 65 20 61 76 61 69 6c 61 62 6c 65 2e 0d 0a 20 20  e available...  
f9a0: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
f9b0: 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69       addConstrai
f9c0: 6e 74 20 53 51 4c 69 74 65 49 6e 74 65 72 6f 70  nt SQLiteInterop
f9d0: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65  ....          se
f9e0: 74 20 61 6e 73 77 65 72 20 79 65 73 0d 0a 20 20  t answer yes..  
f9f0: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
fa00: 20 20 20 20 20 20 20 20 20 20 73 65 74 20 61 6e            set an
fa10: 73 77 65 72 20 6e 6f 0d 0a 20 20 20 20 20 20 20  swer no..       
fa20: 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 74 70   }....        tp
fa30: 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70  uts $channel [ap
fa40: 70 65 6e 64 41 72 67 73 20 24 61 6e 73 77 65 72  pendArgs $answer
fa50: 20 22 20 28 22 20 24 76 65 72 73 69 6f 6e 20 22   " (" $version "
fa60: 20 22 20 24 73 6f 75 72 63 65 49 64 20 22 29 5c   " $sourceId ")\
fa70: 6e 22 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73  n"]..      } els
fa80: 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75  e {..        tpu
fa90: 74 73 20 24 63 68 61 6e 6e 65 6c 20 6e 6f 5c 6e  ts $channel no\n
faa0: 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d  ..      }..    }
fab0: 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 63 68  .....    proc ch
fac0: 65 63 6b 46 6f 72 53 51 4c 69 74 65 44 65 66 69  eckForSQLiteDefi
fad0: 6e 65 43 6f 6e 73 74 61 6e 74 20 7b 20 63 68 61  neConstant { cha
fae0: 6e 6e 65 6c 20 6e 61 6d 65 20 7d 20 7b 0d 0a 20  nnel name } {.. 
faf0: 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
fb00: 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
fb10: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 22 2d 2d  \..          "--
fb20: 2d 2d 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20  -- checking for 
fb30: 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
fb40: 74 65 20 64 65 66 69 6e 65 20 63 6f 6e 73 74 61  te define consta
fb50: 6e 74 20 5c 22 22 20 24 6e 61 6d 65 20 5c 0d 0a  nt \"" $name \..
fb60: 20 20 20 20 20 20 20 20 20 20 22 5c 22 2e 2e 2e            "\"...
fb70: 20 22 5d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20   "]....      if 
fb80: 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20  {[catch {..     
fb90: 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65     object invoke
fba0: 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c   -flags +NonPubl
fbb0: 69 63 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  ic \..          
fbc0: 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51    System.Data.SQ
fbd0: 4c 69 74 65 2e 53 51 4c 69 74 65 33 20 44 65 66  Lite.SQLite3 Def
fbe0: 69 6e 65 43 6f 6e 73 74 61 6e 74 73 0d 0a 20 20  ineConstants..  
fbf0: 20 20 20 20 7d 20 64 65 66 69 6e 65 43 6f 6e 73      } defineCons
fc00: 74 61 6e 74 73 5d 20 3d 3d 20 30 7d 20 74 68 65  tants] == 0} the
fc10: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20  n {..        if 
fc20: 7b 5b 6c 73 65 61 72 63 68 20 2d 65 78 61 63 74  {[lsearch -exact
fc30: 20 2d 6e 6f 63 61 73 65 20 24 64 65 66 69 6e 65   -nocase $define
fc40: 43 6f 6e 73 74 61 6e 74 73 20 24 6e 61 6d 65 5d  Constants $name]
fc50: 20 21 3d 20 2d 31 7d 20 74 68 65 6e 20 7b 0d 0a   != -1} then {..
fc60: 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
fc70: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 59         # NOTE: Y
fc80: 65 73 2c 20 74 68 69 73 20 64 65 66 69 6e 65 20  es, this define 
fc90: 63 6f 6e 73 74 61 6e 74 20 77 61 73 20 65 6e 61  constant was ena
fca0: 62 6c 65 64 20 77 68 65 6e 20 74 68 65 20 6d 61  bled when the ma
fcb0: 6e 61 67 65 64 0d 0a 20 20 20 20 20 20 20 20 20  naged..         
fcc0: 20 23 20 20 20 20 20 20 20 61 73 73 65 6d 62 6c   #       assembl
fcd0: 79 20 77 61 73 20 63 6f 6d 70 69 6c 65 64 2e 0d  y was compiled..
fce0: 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
fcf0: 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74          addConst
fd00: 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67  raint [appendArg
fd10: 73 20 5b 67 65 74 53 51 4c 69 74 65 44 65 66 69  s [getSQLiteDefi
fd20: 6e 65 43 6f 6e 73 74 61 6e 74 50 72 65 66 69 78  neConstantPrefix
fd30: 5d 20 24 6e 61 6d 65 5d 0d 0a 0d 0a 20 20 20 20  ] $name]....    
fd40: 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
fd50: 6e 6e 65 6c 20 79 65 73 5c 6e 0d 0a 20 20 20 20  nnel yes\n..    
fd60: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
fd70: 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
fd80: 68 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d 0a 20 20 20  hannel no\n..   
fd90: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 20       }..      } 
fda0: 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
fdb0: 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 65  tputs $channel e
fdc0: 72 72 6f 72 5c 6e 0d 0a 20 20 20 20 20 20 7d 0d  rror\n..      }.
fdd0: 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70  .    }.....    p
fde0: 72 6f 63 20 67 65 74 44 61 74 65 54 69 6d 65 46  roc getDateTimeF
fdf0: 6f 72 6d 61 74 20 7b 20 7b 74 69 6d 65 5a 6f 6e  ormat { {timeZon
fe00: 65 20 74 72 75 65 7d 20 7d 20 7b 0d 0a 20 20 20  e true} } {..   
fe10: 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
fe20: 54 45 3a 20 54 68 69 73 20 70 72 6f 63 65 64 75  TE: This procedu
fe30: 72 65 20 73 69 6d 70 6c 79 20 72 65 74 75 72 6e  re simply return
fe40: 73 20 74 68 65 20 22 64 65 66 61 75 6c 74 22 20  s the "default" 
fe50: 44 61 74 65 54 69 6d 65 20 66 6f 72 6d 61 74 20  DateTime format 
fe60: 75 73 65 64 0d 0a 20 20 20 20 20 20 23 20 20 20  used..      #   
fe70: 20 20 20 20 62 79 20 74 68 65 20 74 65 73 74 20      by the test 
fe80: 73 75 69 74 65 2e 0d 0a 20 20 20 20 20 20 23 0d  suite...      #.
fe90: 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f  .      if {[info
fea0: 20 65 78 69 73 74 73 20 3a 3a 64 61 74 65 74 69   exists ::dateti
feb0: 6d 65 5f 66 6f 72 6d 61 74 5d 20 26 26 20 5c 0d  me_format] && \.
fec0: 0a 20 20 20 20 20 20 20 20 20 20 5b 73 74 72 69  .          [stri
fed0: 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a 64 61 74  ng length $::dat
fee0: 65 74 69 6d 65 5f 66 6f 72 6d 61 74 5d 20 3e 20  etime_format] > 
fef0: 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
ff00: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
ff10: 4e 4f 54 45 3a 20 52 65 74 75 72 6e 20 74 68 65  NOTE: Return the
ff20: 20 6d 61 6e 75 61 6c 6c 79 20 6f 76 65 72 72 69   manually overri
ff30: 64 64 65 6e 20 76 61 6c 75 65 20 66 6f 72 20 74  dden value for t
ff40: 68 65 20 44 61 74 65 54 69 6d 65 20 66 6f 72 6d  he DateTime form
ff50: 61 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  at...        #..
ff60: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 24          return $
ff70: 3a 3a 64 61 74 65 74 69 6d 65 5f 66 6f 72 6d 61  ::datetime_forma
ff80: 74 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20  t..      } else 
ff90: 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
ffa0: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 52 65        # NOTE: Re
ffb0: 74 75 72 6e 20 61 6e 20 49 53 4f 38 36 30 31 20  turn an ISO8601 
ffc0: 44 61 74 65 54 69 6d 65 20 66 6f 72 6d 61 74 20  DateTime format 
ffd0: 63 6f 6d 70 61 74 69 62 6c 65 20 77 69 74 68 20  compatible with 
ffe0: 53 51 4c 69 74 65 2c 0d 0a 20 20 20 20 20 20 20  SQLite,..       
fff0: 20 23 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e   #       System.
10000 44 61 74 61 2e 53 51 4c 69 74 65 2c 20 61 6e 64  Data.SQLite, and
10010 20 73 75 69 74 61 62 6c 65 20 66 6f 72 20 72 6f   suitable for ro
10020 75 6e 64 2d 74 72 69 70 70 69 6e 67 20 77 69 74  und-tripping wit
10030 68 20 74 68 65 0d 0a 20 20 20 20 20 20 20 20 23  h the..        #
10040 20 20 20 20 20 20 20 44 61 74 65 54 69 6d 65 20         DateTime 
10050 63 6c 61 73 73 20 6f 66 20 74 68 65 20 66 72 61  class of the fra
10060 6d 65 77 6f 72 6b 2e 20 20 49 66 20 74 68 69 73  mework.  If this
10070 20 76 61 6c 75 65 20 69 73 20 63 68 61 6e 67 65   value is change
10080 64 2c 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  d,..        #   
10090 20 20 20 20 76 61 72 69 6f 75 73 20 74 65 73 74      various test
100a0 73 20 6d 61 79 20 66 61 69 6c 2e 0d 0a 20 20 20  s may fail...   
100b0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
100c0 72 65 74 75 72 6e 20 5b 61 70 70 65 6e 64 41 72  return [appendAr
100d0 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
100e0 20 20 22 79 79 79 79 2d 4d 4d 2d 64 64 20 48 48    "yyyy-MM-dd HH
100f0 3a 6d 6d 3a 73 73 2e 46 46 46 46 46 46 46 22 20  :mm:ss.FFFFFFF" 
10100 5b 65 78 70 72 20 7b 24 74 69 6d 65 5a 6f 6e 65  [expr {$timeZone
10110 20 3f 20 22 4b 22 20 3a 20 22 22 7d 5d 5d 0d 0a   ? "K" : ""}]]..
10120 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a        }..    }..
10130 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74 44  ...    proc getD
10140 61 74 65 54 69 6d 65 54 69 63 6b 73 20 7b 20 76  ateTimeTicks { v
10150 61 6c 75 65 20 7b 6c 6f 63 61 6c 20 22 22 7d 20  alue {local ""} 
10160 7b 64 65 66 61 75 6c 74 20 22 22 7d 20 7d 20 7b  {default ""} } {
10170 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72  ..      if {[str
10180 69 6e 67 20 6c 65 6e 67 74 68 20 24 76 61 6c 75  ing length $valu
10190 65 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d  e] == 0} then {.
101a0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
101b0 24 64 65 66 61 75 6c 74 0d 0a 20 20 20 20 20 20  $default..      
101c0 7d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b  }....      if {[
101d0 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20  catch {..       
101e0 20 73 65 74 20 64 61 74 65 54 69 6d 65 20 5b 6f   set dateTime [o
101f0 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 63 72  bject invoke -cr
10200 65 61 74 65 20 44 61 74 65 54 69 6d 65 20 50 61  eate DateTime Pa
10210 72 73 65 45 78 61 63 74 20 5c 0d 0a 20 20 20 20  rseExact \..    
10220 20 20 20 20 20 20 20 20 24 76 61 6c 75 65 20 5b          $value [
10230 67 65 74 44 61 74 65 54 69 6d 65 46 6f 72 6d 61  getDateTimeForma
10240 74 5d 20 6e 75 6c 6c 20 41 64 6a 75 73 74 54 6f  t] null AdjustTo
10250 55 6e 69 76 65 72 73 61 6c 5d 0d 0a 20 20 20 20  Universal]..    
10260 20 20 7d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20    }]} then {..  
10270 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 64 65        return $de
10280 66 61 75 6c 74 0d 0a 20 20 20 20 20 20 7d 0d 0a  fault..      }..
10290 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72  ..      if {[str
102a0 69 6e 67 20 69 73 20 62 6f 6f 6c 65 61 6e 20 2d  ing is boolean -
102b0 73 74 72 69 63 74 20 24 6c 6f 63 61 6c 5d 7d 20  strict $local]} 
102c0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
102d0 73 65 74 20 64 61 74 65 54 69 6d 65 20 5b 6f 62  set dateTime [ob
102e0 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 63 72 65  ject invoke -cre
102f0 61 74 65 20 44 61 74 65 54 69 6d 65 20 53 70 65  ate DateTime Spe
10300 63 69 66 79 4b 69 6e 64 20 5c 0d 0a 20 20 20 20  cifyKind \..    
10310 20 20 20 20 20 20 20 20 24 64 61 74 65 54 69 6d          $dateTim
10320 65 20 55 74 63 5d 0d 0a 20 20 20 20 20 20 7d 20  e Utc]..      } 
10330 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
10340 72 65 74 75 72 6e 20 5b 6f 62 6a 65 63 74 20 69  return [object i
10350 6e 76 6f 6b 65 20 24 64 61 74 65 54 69 6d 65 20  nvoke $dateTime 
10360 54 69 63 6b 73 5d 0d 0a 20 20 20 20 20 20 7d 0d  Ticks]..      }.
10370 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 24 6c 6f  ...      if {$lo
10380 63 61 6c 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  cal} then {..   
10390 20 20 20 20 20 72 65 74 75 72 6e 20 5b 6f 62 6a       return [obj
103a0 65 63 74 20 69 6e 76 6f 6b 65 20 24 64 61 74 65  ect invoke $date
103b0 54 69 6d 65 20 54 6f 4c 6f 63 61 6c 54 69 6d 65  Time ToLocalTime
103c0 2e 54 69 63 6b 73 5d 0d 0a 20 20 20 20 20 20 7d  .Ticks]..      }
103d0 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
103e0 20 72 65 74 75 72 6e 20 5b 6f 62 6a 65 63 74 20   return [object 
103f0 69 6e 76 6f 6b 65 20 24 64 61 74 65 54 69 6d 65  invoke $dateTime
10400 20 54 6f 55 6e 69 76 65 72 73 61 6c 54 69 6d 65   ToUniversalTime
10410 2e 54 69 63 6b 73 5d 0d 0a 20 20 20 20 20 20 7d  .Ticks]..      }
10420 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
10430 70 72 6f 63 20 67 65 74 50 72 6f 70 65 72 74 69  proc getProperti
10440 65 73 20 7b 20 6f 62 6a 65 63 74 20 76 61 72 4e  es { object varN
10450 61 6d 65 20 7d 20 7b 0d 0a 20 20 20 20 20 20 75  ame } {..      u
10460 70 76 61 72 20 31 20 24 76 61 72 4e 61 6d 65 20  pvar 1 $varName 
10470 70 72 6f 70 65 72 74 69 65 73 0d 0a 0d 0a 20 20  properties....  
10480 20 20 20 20 73 65 74 20 63 6f 75 6e 74 20 30 0d      set count 0.
10490 0a 20 20 20 20 20 20 73 65 74 20 6e 61 6d 65 73  .      set names
104a0 20 5b 6c 69 73 74 5d 0d 0a 0d 0a 20 20 20 20 20   [list]....     
104b0 20 69 66 20 7b 5b 69 73 4f 62 6a 65 63 74 48 61   if {[isObjectHa
104c0 6e 64 6c 65 20 24 6f 62 6a 65 63 74 5d 20 26 26  ndle $object] &&
104d0 20 24 6f 62 6a 65 63 74 20 6e 65 20 22 6e 75 6c   $object ne "nul
104e0 6c 22 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  l"} then {..    
104f0 20 20 20 20 65 76 61 6c 20 6c 61 70 70 65 6e 64      eval lappend
10500 20 6e 61 6d 65 73 20 5b 6f 62 6a 65 63 74 20 6d   names [object m
10510 65 6d 62 65 72 73 20 5c 0d 0a 20 20 20 20 20 20  embers \..      
10520 20 20 20 20 20 20 2d 6d 65 6d 62 65 72 74 79 70        -membertyp
10530 65 73 20 50 72 6f 70 65 72 74 79 20 2d 6e 61 6d  es Property -nam
10540 65 6f 6e 6c 79 20 24 6f 62 6a 65 63 74 5d 0d 0a  eonly $object]..
10550 0d 0a 20 20 20 20 20 20 20 20 65 76 61 6c 20 6c  ..        eval l
10560 61 70 70 65 6e 64 20 6e 61 6d 65 73 20 5b 6f 62  append names [ob
10570 6a 65 63 74 20 6d 65 6d 62 65 72 73 20 5c 0d 0a  ject members \..
10580 20 20 20 20 20 20 20 20 20 20 20 20 2d 6d 65 6d              -mem
10590 62 65 72 74 79 70 65 73 20 46 69 65 6c 64 20 2d  bertypes Field -
105a0 6e 61 6d 65 6f 6e 6c 79 20 24 6f 62 6a 65 63 74  nameonly $object
105b0 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  ]..      }....  
105c0 20 20 20 20 66 6f 72 65 61 63 68 20 6e 61 6d 65      foreach name
105d0 20 24 6e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20   $names {..     
105e0 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d     if {[catch {.
105f0 0a 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63  .          objec
10600 74 20 69 6e 76 6f 6b 65 20 2d 6f 62 6a 65 63 74  t invoke -object
10610 66 6c 61 67 73 20 2b 4e 6f 44 69 73 70 6f 73 65  flags +NoDispose
10620 20 24 6f 62 6a 65 63 74 20 24 6e 61 6d 65 0d 0a   $object $name..
10630 20 20 20 20 20 20 20 20 7d 20 76 61 6c 75 65 5d          } value]
10640 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20   == 0} then {.. 
10650 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 69 73           if {[is
10660 4f 62 6a 65 63 74 48 61 6e 64 6c 65 20 24 76 61  ObjectHandle $va
10670 6c 75 65 5d 20 26 26 20 24 76 61 6c 75 65 20 6e  lue] && $value n
10680 65 20 22 6e 75 6c 6c 22 7d 20 74 68 65 6e 20 7b  e "null"} then {
10690 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 65  ..            se
106a0 74 20 65 72 72 6f 72 20 6e 75 6c 6c 3b 20 6f 62  t error null; ob
106b0 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61  ject invoke -fla
106c0 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d  gs +NonPublic \.
106d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
106e0 20 2d 6d 61 72 73 68 61 6c 66 6c 61 67 73 20 2b   -marshalflags +
106f0 4e 6f 48 61 6e 64 6c 65 20 49 6e 74 65 72 70 72  NoHandle Interpr
10700 65 74 65 72 2e 47 65 74 41 63 74 69 76 65 20 5c  eter.GetActive \
10710 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
10720 20 20 41 64 64 4f 62 6a 65 63 74 52 65 66 65 72    AddObjectRefer
10730 65 6e 63 65 20 4f 6b 20 24 76 61 6c 75 65 20 65  ence Ok $value e
10740 72 72 6f 72 0d 0a 0d 0a 20 20 20 20 20 20 20 20  rror....        
10750 20 20 20 20 6c 61 70 70 65 6e 64 20 70 72 6f 70      lappend prop
10760 65 72 74 69 65 73 28 6f 62 6a 65 63 74 73 29 20  erties(objects) 
10770 5b 6c 69 73 74 20 24 6e 61 6d 65 20 24 76 61 6c  [list $name $val
10780 75 65 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  ue]..          }
10790 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
107a0 20 20 20 20 20 6c 61 70 70 65 6e 64 20 70 72 6f       lappend pro
107b0 70 65 72 74 69 65 73 28 76 61 6c 75 65 73 29 20  perties(values) 
107c0 5b 6c 69 73 74 20 24 6e 61 6d 65 20 24 76 61 6c  [list $name $val
107d0 75 65 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  ue]..          }
107e0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 69 6e  ....          in
107f0 63 72 20 63 6f 75 6e 74 0d 0a 20 20 20 20 20 20  cr count..      
10800 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
10810 20 20 20 20 20 20 6c 61 70 70 65 6e 64 20 70 72        lappend pr
10820 6f 70 65 72 74 69 65 73 28 65 72 72 6f 72 73 29  operties(errors)
10830 20 5b 6c 69 73 74 20 24 6e 61 6d 65 20 24 3a 3a   [list $name $::
10840 65 72 72 6f 72 43 6f 64 65 5d 0d 0a 20 20 20 20  errorCode]..    
10850 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a      }..      }..
10860 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 24  ..      return $
10870 63 6f 75 6e 74 0d 0a 20 20 20 20 7d 0d 0a 0c 0d  count..    }....
10880 0a 20 20 20 20 70 72 6f 63 20 67 65 74 41 6c 6c  .    proc getAll
10890 50 72 6f 70 65 72 74 69 65 73 20 7b 20 6f 62 6a  Properties { obj
108a0 65 63 74 20 76 61 72 4e 61 6d 65 20 7d 20 7b 0d  ect varName } {.
108b0 0a 20 20 20 20 20 20 75 70 76 61 72 20 31 20 24  .      upvar 1 $
108c0 76 61 72 4e 61 6d 65 20 70 72 6f 70 65 72 74 69  varName properti
108d0 65 73 0d 0a 20 20 20 20 20 20 73 65 74 20 76 61  es..      set va
108e0 6c 75 65 20 24 6f 62 6a 65 63 74 0d 0a 0d 0a 20  lue $object.... 
108f0 20 20 20 20 20 77 68 69 6c 65 20 7b 74 72 75 65       while {true
10900 7d 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20  } {..        if 
10910 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 70  {![info exists p
10920 72 6f 70 65 72 74 69 65 73 28 73 65 65 6e 4f 62  roperties(seenOb
10930 6a 65 63 74 73 29 5d 20 7c 7c 20 5c 0d 0a 20 20  jects)] || \..  
10940 20 20 20 20 20 20 20 20 20 20 24 76 61 6c 75 65            $value
10950 20 6e 69 20 24 70 72 6f 70 65 72 74 69 65 73 28   ni $properties(
10960 73 65 65 6e 4f 62 6a 65 63 74 73 29 7d 20 74 68  seenObjects)} th
10970 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
10980 67 65 74 50 72 6f 70 65 72 74 69 65 73 20 24 76  getProperties $v
10990 61 6c 75 65 20 70 72 6f 70 65 72 74 69 65 73 0d  alue properties.
109a0 0a 20 20 20 20 20 20 20 20 20 20 6c 61 70 70 65  .          lappe
109b0 6e 64 20 70 72 6f 70 65 72 74 69 65 73 28 73 65  nd properties(se
109c0 65 6e 4f 62 6a 65 63 74 73 29 20 24 76 61 6c 75  enObjects) $valu
109d0 65 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  e..        }....
109e0 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e          if {![in
109f0 66 6f 20 65 78 69 73 74 73 20 70 72 6f 70 65 72  fo exists proper
10a00 74 69 65 73 28 6f 62 6a 65 63 74 73 29 5d 7d 20  ties(objects)]} 
10a10 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
10a20 20 20 62 72 65 61 6b 0d 0a 20 20 20 20 20 20 20    break..       
10a30 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66   }....        if
10a40 20 7b 5b 6c 6c 65 6e 67 74 68 20 24 70 72 6f 70   {[llength $prop
10a50 65 72 74 69 65 73 28 6f 62 6a 65 63 74 73 29 5d  erties(objects)]
10a60 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20   == 0} then {.. 
10a70 20 20 20 20 20 20 20 20 20 75 6e 73 65 74 20 70           unset p
10a80 72 6f 70 65 72 74 69 65 73 28 6f 62 6a 65 63 74  roperties(object
10a90 73 29 3b 20 62 72 65 61 6b 0d 0a 20 20 20 20 20  s); break..     
10aa0 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
10ab0 73 65 74 20 76 61 6c 75 65 20 5b 6c 69 6e 64 65  set value [linde
10ac0 78 20 5b 6c 69 6e 64 65 78 20 24 70 72 6f 70 65  x [lindex $prope
10ad0 72 74 69 65 73 28 6f 62 6a 65 63 74 73 29 20 30  rties(objects) 0
10ae0 5d 20 65 6e 64 5d 0d 0a 20 20 20 20 20 20 20 20  ] end]..        
10af0 73 65 74 20 70 72 6f 70 65 72 74 69 65 73 28 6f  set properties(o
10b00 62 6a 65 63 74 73 29 20 5b 6c 72 61 6e 67 65 20  bjects) [lrange 
10b10 24 70 72 6f 70 65 72 74 69 65 73 28 6f 62 6a 65  $properties(obje
10b20 63 74 73 29 20 31 20 65 6e 64 5d 0d 0a 20 20 20  cts) 1 end]..   
10b30 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 69 66     }....      if
10b40 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 70   {[info exists p
10b50 72 6f 70 65 72 74 69 65 73 28 73 65 65 6e 4f 62  roperties(seenOb
10b60 6a 65 63 74 73 29 5d 7d 20 74 68 65 6e 20 7b 0d  jects)]} then {.
10b70 0a 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68  .        foreach
10b80 20 76 61 6c 75 65 20 24 70 72 6f 70 65 72 74 69   value $properti
10b90 65 73 28 73 65 65 6e 4f 62 6a 65 63 74 73 29 20  es(seenObjects) 
10ba0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20  {..          if 
10bb0 7b 24 76 61 6c 75 65 20 65 71 20 24 6f 62 6a 65  {$value eq $obje
10bc0 63 74 7d 20 63 6f 6e 74 69 6e 75 65 0d 0a 20 20  ct} continue..  
10bd0 20 20 20 20 20 20 20 20 63 61 74 63 68 20 7b 6f          catch {o
10be0 62 6a 65 63 74 20 64 69 73 70 6f 73 65 20 24 76  bject dispose $v
10bf0 61 6c 75 65 7d 0d 0a 20 20 20 20 20 20 20 20 7d  alue}..        }
10c00 0d 0a 0d 0a 20 20 20 20 20 20 20 20 75 6e 73 65  ....        unse
10c10 74 20 70 72 6f 70 65 72 74 69 65 73 28 73 65 65  t properties(see
10c20 6e 4f 62 6a 65 63 74 73 29 0d 0a 20 20 20 20 20  nObjects)..     
10c30 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20   }..    }.....  
10c40 20 20 70 72 6f 63 20 67 65 74 56 61 72 69 61 62    proc getVariab
10c50 6c 65 73 20 7b 20 76 61 72 4e 61 6d 65 73 20 7b  les { varNames {
10c60 6f 62 6a 65 63 74 73 20 66 61 6c 73 65 7d 20 7d  objects false} }
10c70 20 7b 0d 0a 20 20 20 20 20 20 73 65 74 20 72 65   {..      set re
10c80 73 75 6c 74 20 5b 6c 69 73 74 5d 0d 0a 0d 0a 20  sult [list].... 
10c90 20 20 20 20 20 66 6f 72 65 61 63 68 20 76 61 72       foreach var
10ca0 4e 61 6d 65 20 24 76 61 72 4e 61 6d 65 73 20 7b  Name $varNames {
10cb0 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 75  ..        if {[u
10cc0 70 6c 65 76 65 6c 20 31 20 5b 6c 69 73 74 20 61  plevel 1 [list a
10cd0 72 72 61 79 20 65 78 69 73 74 73 20 24 76 61 72  rray exists $var
10ce0 4e 61 6d 65 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a  Name]]} then {..
10cf0 20 20 20 20 20 20 20 20 20 20 73 65 74 20 61 72            set ar
10d00 72 61 79 4e 61 6d 65 20 24 76 61 72 4e 61 6d 65  rayName $varName
10d10 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 66 6f  ....          fo
10d20 72 65 61 63 68 20 65 6c 65 6d 65 6e 74 4e 61 6d  reach elementNam
10d30 65 20 5b 75 70 6c 65 76 65 6c 20 31 20 5b 6c 69  e [uplevel 1 [li
10d40 73 74 20 61 72 72 61 79 20 6e 61 6d 65 73 20 24  st array names $
10d50 61 72 72 61 79 4e 61 6d 65 5d 5d 20 7b 0d 0a 20  arrayName]] {.. 
10d60 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20 6e             set n
10d70 61 6d 65 20 5b 61 70 70 65 6e 64 41 72 67 73 20  ame [appendArgs 
10d80 24 61 72 72 61 79 4e 61 6d 65 20 28 20 24 65 6c  $arrayName ( $el
10d90 65 6d 65 6e 74 4e 61 6d 65 20 29 5d 0d 0a 20 20  ementName )]..  
10da0 20 20 20 20 20 20 20 20 20 20 73 65 74 20 76 61            set va
10db0 72 56 61 6c 75 65 20 5b 75 70 6c 65 76 65 6c 20  rValue [uplevel 
10dc0 31 20 5b 6c 69 73 74 20 73 65 74 20 24 6e 61 6d  1 [list set $nam
10dd0 65 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  e]]....         
10de0 20 20 20 69 66 20 7b 24 6f 62 6a 65 63 74 73 20     if {$objects 
10df0 26 26 20 5b 69 73 4f 62 6a 65 63 74 48 61 6e 64  && [isObjectHand
10e00 6c 65 20 24 76 61 72 56 61 6c 75 65 5d 7d 20 74  le $varValue]} t
10e10 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
10e20 20 20 20 20 20 75 6e 73 65 74 20 2d 6e 6f 63 6f       unset -noco
10e30 6d 70 6c 61 69 6e 20 70 72 6f 70 65 72 74 69 65  mplain propertie
10e40 73 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  s..             
10e50 20 67 65 74 41 6c 6c 50 72 6f 70 65 72 74 69 65   getAllPropertie
10e60 73 20 24 76 61 72 56 61 6c 75 65 20 70 72 6f 70  s $varValue prop
10e70 65 72 74 69 65 73 0d 0a 0d 0a 20 20 20 20 20 20  erties....      
10e80 20 20 20 20 20 20 20 20 6c 61 70 70 65 6e 64 20          lappend 
10e90 72 65 73 75 6c 74 20 5b 6c 69 73 74 20 24 6e 61  result [list $na
10ea0 6d 65 20 5b 61 72 72 61 79 20 67 65 74 20 70 72  me [array get pr
10eb0 6f 70 65 72 74 69 65 73 5d 5d 0d 0a 20 20 20 20  operties]]..    
10ec0 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b          } else {
10ed0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
10ee0 6c 61 70 70 65 6e 64 20 72 65 73 75 6c 74 20 5b  lappend result [
10ef0 6c 69 73 74 20 24 6e 61 6d 65 20 24 76 61 72 56  list $name $varV
10f00 61 6c 75 65 5d 0d 0a 20 20 20 20 20 20 20 20 20  alue]..         
10f10 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
10f20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73  }..        } els
10f30 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73  e {..          s
10f40 65 74 20 76 61 72 56 61 6c 75 65 20 5b 75 70 6c  et varValue [upl
10f50 65 76 65 6c 20 31 20 5b 6c 69 73 74 20 73 65 74  evel 1 [list set
10f60 20 24 76 61 72 4e 61 6d 65 5d 5d 0d 0a 0d 0a 20   $varName]].... 
10f70 20 20 20 20 20 20 20 20 20 69 66 20 7b 24 6f 62           if {$ob
10f80 6a 65 63 74 73 20 26 26 20 5b 69 73 4f 62 6a 65  jects && [isObje
10f90 63 74 48 61 6e 64 6c 65 20 24 76 61 72 56 61 6c  ctHandle $varVal
10fa0 75 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  ue]} then {..   
10fb0 20 20 20 20 20 20 20 20 20 75 6e 73 65 74 20 2d           unset -
10fc0 6e 6f 63 6f 6d 70 6c 61 69 6e 20 70 72 6f 70 65  nocomplain prope
10fd0 72 74 69 65 73 0d 0a 20 20 20 20 20 20 20 20 20  rties..         
10fe0 20 20 20 67 65 74 41 6c 6c 50 72 6f 70 65 72 74     getAllPropert
10ff0 69 65 73 20 24 76 61 72 56 61 6c 75 65 20 70 72  ies $varValue pr
11000 6f 70 65 72 74 69 65 73 0d 0a 0d 0a 20 20 20 20  operties....    
11010 20 20 20 20 20 20 20 20 6c 61 70 70 65 6e 64 20          lappend 
11020 72 65 73 75 6c 74 20 5b 6c 69 73 74 20 24 76 61  result [list $va
11030 72 4e 61 6d 65 20 5b 61 72 72 61 79 20 67 65 74  rName [array get
11040 20 70 72 6f 70 65 72 74 69 65 73 5d 5d 0d 0a 20   properties]].. 
11050 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20           } else 
11060 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 6c  {..            l
11070 61 70 70 65 6e 64 20 72 65 73 75 6c 74 20 5b 6c  append result [l
11080 69 73 74 20 24 76 61 72 4e 61 6d 65 20 24 76 61  ist $varName $va
11090 72 56 61 6c 75 65 5d 0d 0a 20 20 20 20 20 20 20  rValue]..       
110a0 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d     }..        }.
110b0 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
110c0 20 20 72 65 74 75 72 6e 20 24 72 65 73 75 6c 74    return $result
110d0 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
110e0 70 72 6f 63 20 65 6e 75 6d 65 72 61 62 6c 65 54  proc enumerableT
110f0 6f 4c 69 73 74 20 7b 20 65 6e 75 6d 65 72 61 62  oList { enumerab
11100 6c 65 20 7d 20 7b 0d 0a 20 20 20 20 20 20 73 65  le } {..      se
11110 74 20 72 65 73 75 6c 74 20 5b 6c 69 73 74 5d 0d  t result [list].
11120 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 73 74  ...      if {[st
11130 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 65 6e 75  ring length $enu
11140 6d 65 72 61 62 6c 65 5d 20 3d 3d 20 30 20 7c 7c  merable] == 0 ||
11150 20 24 65 6e 75 6d 65 72 61 62 6c 65 20 65 71 20   $enumerable eq 
11160 22 6e 75 6c 6c 22 7d 20 74 68 65 6e 20 7b 0d 0a  "null"} then {..
11170 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 24          return $
11180 72 65 73 75 6c 74 0d 0a 20 20 20 20 20 20 7d 0d  result..      }.
11190 0a 0d 0a 20 20 20 20 20 20 6f 62 6a 65 63 74 20  ...      object 
111a0 66 6f 72 65 61 63 68 20 2d 61 6c 69 61 73 20 69  foreach -alias i
111b0 74 65 6d 20 24 65 6e 75 6d 65 72 61 62 6c 65 20  tem $enumerable 
111c0 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b  {..        if {[
111d0 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 69  string length $i
111e0 74 65 6d 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b  tem] > 0} then {
111f0 0d 0a 20 20 20 20 20 20 20 20 20 20 6c 61 70 70  ..          lapp
11200 65 6e 64 20 72 65 73 75 6c 74 20 5b 24 69 74 65  end result [$ite
11210 6d 20 54 6f 53 74 72 69 6e 67 5d 0d 0a 20 20 20  m ToString]..   
11220 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d       }..      }.
11230 0a 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ...      return 
11240 24 72 65 73 75 6c 74 0d 0a 20 20 20 20 7d 0d 0a  $result..    }..
11250 0c 0d 0a 20 20 20 20 70 72 6f 63 20 63 61 74 63  ...    proc catc
11260 68 41 6e 64 52 65 74 75 72 6e 20 7b 20 73 63 72  hAndReturn { scr
11270 69 70 74 20 7b 73 74 61 63 6b 54 72 61 63 65 20  ipt {stackTrace 
11280 66 61 6c 73 65 7d 20 7b 73 74 72 69 63 74 20 74  false} {strict t
11290 72 75 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20  rue} } {..      
112a0 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
112b0 20 45 76 61 6c 75 61 74 65 20 74 68 65 20 73 63   Evaluate the sc
112c0 72 69 70 74 20 70 72 6f 76 69 64 65 64 20 62 79  ript provided by
112d0 20 6f 75 72 20 63 61 6c 6c 65 72 20 69 6e 20 74   our caller in t
112e0 68 65 69 72 20 63 6f 6e 74 65 78 74 2c 0d 0a 20  heir context,.. 
112f0 20 20 20 20 20 23 20 20 20 20 20 20 20 63 61 70       #       cap
11300 74 75 72 69 6e 67 20 62 6f 74 68 20 74 68 65 20  turing both the 
11310 72 65 73 75 6c 74 20 61 6e 64 20 74 68 65 20 72  result and the r
11320 65 74 75 72 6e 20 63 6f 64 65 2e 0d 0a 20 20 20  eturn code...   
11330 20 20 20 23 0d 0a 20 20 20 20 20 20 73 65 74 20     #..      set 
11340 63 6f 64 65 20 5b 63 61 74 63 68 20 7b 75 70 6c  code [catch {upl
11350 65 76 65 6c 20 31 20 24 73 63 72 69 70 74 7d 20  evel 1 $script} 
11360 72 65 73 75 6c 74 5d 0d 0a 0d 0a 20 20 20 20 20  result]....     
11370 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
11380 3a 20 44 69 64 20 74 68 65 20 73 63 72 69 70 74  : Did the script
11390 20 70 72 6f 76 69 64 65 64 20 62 79 20 6f 75 72   provided by our
113a0 20 63 61 6c 6c 65 72 20 4e 4f 54 20 72 61 69 73   caller NOT rais
113b0 65 20 61 6e 20 65 72 72 6f 72 3f 0d 0a 20 20 20  e an error?..   
113c0 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
113d0 24 73 74 72 69 63 74 20 26 26 20 24 63 6f 64 65  $strict && $code
113e0 20 3d 3d 20 30 20 7c 7c 20 21 24 73 74 72 69 63   == 0 || !$stric
113f0 74 20 26 26 20 24 63 6f 64 65 20 21 3d 20 31 7d  t && $code != 1}
11400 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
11410 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
11420 54 45 3a 20 53 75 63 63 65 73 73 2e 20 20 52 65  TE: Success.  Re
11430 74 75 72 6e 20 61 20 6c 69 73 74 20 77 69 74 68  turn a list with
11440 20 74 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65   the return code
11450 20 61 6e 64 20 74 68 65 20 72 65 73 75 6c 74 2e   and the result.
11460 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
11470 20 20 20 20 20 72 65 74 75 72 6e 20 5b 6c 69 73       return [lis
11480 74 20 24 63 6f 64 65 20 24 72 65 73 75 6c 74 5d  t $code $result]
11490 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 69 66  ..      } elseif
114a0 20 7b 24 73 74 61 63 6b 54 72 61 63 65 7d 20 74   {$stackTrace} t
114b0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  hen {..        #
114c0 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
114d0 3a 20 46 61 69 6c 75 72 65 2e 20 20 4f 75 72 20  : Failure.  Our 
114e0 63 61 6c 6c 65 72 20 77 61 6e 74 73 20 61 20 66  caller wants a f
114f0 75 6c 6c 20 73 74 61 63 6b 20 74 72 61 63 65 20  ull stack trace 
11500 28 69 66 20 61 70 70 6c 69 63 61 62 6c 65 29 2c  (if applicable),
11510 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
11520 20 20 72 65 74 75 72 6e 20 61 20 6c 69 73 74 20    return a list 
11530 77 69 74 68 20 74 68 65 20 72 65 74 75 72 6e 20  with the return 
11540 63 6f 64 65 20 61 6e 64 20 74 68 65 20 72 65 73  code and the res
11550 75 6c 74 20 76 65 72 62 61 74 69 6d 2e 0d 0a 20  ult verbatim... 
11560 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
11570 20 20 72 65 74 75 72 6e 20 5b 6c 69 73 74 20 24    return [list $
11580 63 6f 64 65 20 24 72 65 73 75 6c 74 5d 0d 0a 20  code $result].. 
11590 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
115a0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
115b0 20 20 23 20 4e 4f 54 45 3a 20 46 61 69 6c 75 72    # NOTE: Failur
115c0 65 2e 20 20 4f 75 72 20 63 61 6c 6c 65 72 20 64  e.  Our caller d
115d0 6f 65 73 20 6e 6f 74 20 77 61 6e 74 20 61 20 66  oes not want a f
115e0 75 6c 6c 20 73 74 61 63 6b 20 74 72 61 63 65 20  ull stack trace 
115f0 28 69 66 0d 0a 20 20 20 20 20 20 20 20 23 20 20  (if..        #  
11600 20 20 20 20 20 61 70 70 6c 69 63 61 62 6c 65 29       applicable)
11610 2c 20 72 65 74 75 72 6e 20 61 20 6c 69 73 74 20  , return a list 
11620 77 69 74 68 20 74 68 65 20 72 65 74 75 72 6e 20  with the return 
11630 63 6f 64 65 2c 20 74 68 65 20 65 72 72 6f 72 0d  code, the error.
11640 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
11650 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 69 6e   code for the in
11660 74 65 72 70 72 65 74 65 72 2c 20 61 6e 64 20 74  terpreter, and t
11670 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  he error message
11680 20 75 70 20 74 6f 20 74 68 65 0d 0a 20 20 20 20   up to the..    
11690 20 20 20 20 23 20 20 20 20 20 20 20 70 6f 69 6e      #       poin
116a0 74 20 77 68 65 72 65 20 74 68 65 20 73 74 61 63  t where the stac
116b0 6b 20 74 72 61 63 65 20 73 68 6f 75 6c 64 20 73  k trace should s
116c0 74 61 72 74 2e 0d 0a 20 20 20 20 20 20 20 20 23  tart...        #
116d0 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ..        return
116e0 20 5b 6c 69 73 74 20 24 63 6f 64 65 20 24 3a 3a   [list $code $::
116f0 65 72 72 6f 72 43 6f 64 65 20 5c 0d 0a 20 20 20  errorCode \..   
11700 20 20 20 20 20 20 20 20 20 5b 65 78 74 72 61 63           [extrac
11710 74 53 79 73 74 65 6d 44 61 74 61 53 51 4c 69 74  tSystemDataSQLit
11720 65 45 78 63 65 70 74 69 6f 6e 4d 65 73 73 61 67  eExceptionMessag
11730 65 20 24 72 65 73 75 6c 74 5d 5d 0d 0a 20 20 20  e $result]]..   
11740 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a     }..    }.....
11750 20 20 20 20 70 72 6f 63 20 63 6f 6d 70 69 6c 65      proc compile
11760 43 53 68 61 72 70 57 69 74 68 20 7b 0d 0a 20 20  CSharpWith {..  
11770 20 20 20 20 20 20 20 20 20 20 74 65 78 74 20 6d            text m
11780 65 6d 6f 72 79 20 73 79 6d 62 6f 6c 73 20 73 74  emory symbols st
11790 72 69 63 74 20 72 65 73 75 6c 74 73 56 61 72 4e  rict resultsVarN
117a0 61 6d 65 20 65 72 72 6f 72 73 56 61 72 4e 61 6d  ame errorsVarNam
117b0 65 20 66 69 6c 65 4e 61 6d 65 73 0d 0a 20 20 20  e fileNames..   
117c0 20 20 20 20 20 20 20 20 20 61 72 67 73 20 7d 20           args } 
117d0 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  {..      #..    
117e0 20 20 23 20 4e 4f 54 45 3a 20 53 69 6e 63 65 20    # NOTE: Since 
117f0 77 65 20 61 72 65 20 67 6f 69 6e 67 20 74 6f 20  we are going to 
11800 75 73 65 20 74 68 69 73 20 6d 65 74 68 6f 64 20  use this method 
11810 6e 61 6d 65 20 61 20 6c 6f 74 2c 20 61 73 73 69  name a lot, assi
11820 67 6e 20 69 74 20 74 6f 20 61 0d 0a 20 20 20 20  gn it to a..    
11830 20 20 23 20 20 20 20 20 20 20 76 61 72 69 61 62    #       variab
11840 6c 65 20 66 69 72 73 74 2e 0d 0a 20 20 20 20 20  le first...     
11850 20 23 0d 0a 20 20 20 20 20 20 73 65 74 20 61 64   #..      set ad
11860 64 20 52 65 66 65 72 65 6e 63 65 64 41 73 73 65  d ReferencedAsse
11870 6d 62 6c 69 65 73 2e 41 64 64 0d 0a 0d 0a 20 20  mblies.Add....  
11880 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
11890 4f 54 45 3a 20 43 72 65 61 74 65 20 74 68 65 20  OTE: Create the 
118a0 62 61 73 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20  base command to 
118b0 65 76 61 6c 75 61 74 65 20 61 6e 64 20 61 64 64  evaluate and add
118c0 20 74 68 65 20 70 72 6f 70 65 72 74 79 20 73 65   the property se
118d0 74 74 69 6e 67 73 0d 0a 20 20 20 20 20 20 23 20  ttings..      # 
118e0 20 20 20 20 20 20 74 68 61 74 20 61 72 65 20 61        that are a
118f0 6c 6d 6f 73 74 20 61 6c 77 61 79 73 20 6e 65 65  lmost always nee
11900 64 65 64 20 62 79 20 6f 75 72 20 75 6e 69 74 20  ded by our unit 
11910 74 65 73 74 73 20 28 69 2e 65 2e 20 74 68 65 20  tests (i.e. the 
11920 53 79 73 74 65 6d 0d 0a 20 20 20 20 20 20 23 20  System..      # 
11930 20 20 20 20 20 20 61 6e 64 20 53 79 73 74 65 6d        and System
11940 2e 44 61 74 61 20 61 73 73 65 6d 62 6c 79 20 72  .Data assembly r
11950 65 66 65 72 65 6e 63 65 73 29 2e 0d 0a 20 20 20  eferences)...   
11960 20 20 20 23 0d 0a 20 20 20 20 20 20 73 65 74 20     #..      set 
11970 63 6f 6d 6d 61 6e 64 20 5b 6c 69 73 74 20 5c 0d  command [list \.
11980 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6d 70 69  .          compi
11990 6c 65 43 53 68 61 72 70 20 24 74 65 78 74 20 24  leCSharp $text $
119a0 6d 65 6d 6f 72 79 20 24 73 79 6d 62 6f 6c 73 20  memory $symbols 
119b0 24 73 74 72 69 63 74 20 72 65 73 75 6c 74 73 20  $strict results 
119c0 65 72 72 6f 72 73 20 5c 0d 0a 20 20 20 20 20 20  errors \..      
119d0 20 20 20 20 24 61 64 64 20 53 79 73 74 65 6d 2e      $add System.
119e0 64 6c 6c 20 24 61 64 64 20 53 79 73 74 65 6d 2e  dll $add System.
119f0 44 61 74 61 2e 64 6c 6c 20 24 61 64 64 20 53 79  Data.dll $add Sy
11a00 73 74 65 6d 2e 54 72 61 6e 73 61 63 74 69 6f 6e  stem.Transaction
11a10 73 2e 64 6c 6c 20 5c 0d 0a 20 20 20 20 20 20 20  s.dll \..       
11a20 20 20 20 24 61 64 64 20 53 79 73 74 65 6d 2e 58     $add System.X
11a30 6d 6c 2e 64 6c 6c 5d 0d 0a 0d 0a 20 20 20 20 20  ml.dll]....     
11a40 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
11a50 3a 20 41 64 64 20 61 6c 6c 20 74 68 65 20 70 72  : Add all the pr
11a60 6f 76 69 64 65 64 20 66 69 6c 65 20 6e 61 6d 65  ovided file name
11a70 73 20 61 73 20 61 73 73 65 6d 62 6c 79 20 72 65  s as assembly re
11a80 66 65 72 65 6e 63 65 73 2e 0d 0a 20 20 20 20 20  ferences...     
11a90 20 23 0d 0a 20 20 20 20 20 20 66 6f 72 65 61 63   #..      foreac
11aa0 68 20 66 69 6c 65 4e 61 6d 65 20 24 66 69 6c 65  h fileName $file
11ab0 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20 20  Names {..       
11ac0 20 6c 61 70 70 65 6e 64 20 63 6f 6d 6d 61 6e 64   lappend command
11ad0 20 24 61 64 64 20 5b 67 65 74 42 69 6e 61 72 79   $add [getBinary
11ae0 46 69 6c 65 4e 61 6d 65 20 24 66 69 6c 65 4e 61  FileName $fileNa
11af0 6d 65 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a  me]..      }....
11b00 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
11b10 20 4e 4f 54 45 3a 20 41 64 64 20 74 68 65 20 65   NOTE: Add the e
11b20 78 74 72 61 20 61 72 67 75 6d 65 6e 74 73 2c 20  xtra arguments, 
11b30 69 66 20 61 6e 79 2c 20 74 6f 20 74 68 65 20 63  if any, to the c
11b40 6f 6d 6d 61 6e 64 20 74 6f 20 65 76 61 6c 75 61  ommand to evalua
11b50 74 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  te...      #..  
11b60 20 20 20 20 65 76 61 6c 20 6c 61 70 70 65 6e 64      eval lappend
11b70 20 63 6f 6d 6d 61 6e 64 20 24 61 72 67 73 0d 0a   command $args..
11b80 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
11b90 20 23 20 4e 4f 54 45 3a 20 41 6c 69 61 73 20 74   # NOTE: Alias t
11ba0 68 65 20 63 6f 6d 70 69 6c 65 72 20 6c 6f 63 61  he compiler loca
11bb0 6c 20 72 65 73 75 6c 74 73 20 61 6e 64 20 65 72  l results and er
11bc0 72 6f 72 73 20 76 61 72 69 61 62 6c 65 73 20 74  rors variables t
11bd0 6f 20 74 68 65 0d 0a 20 20 20 20 20 20 23 20 20  o the..      #  
11be0 20 20 20 20 20 76 61 72 69 61 62 6c 65 20 6e 61       variable na
11bf0 6d 65 73 20 70 72 6f 76 69 64 65 64 20 62 79 20  mes provided by 
11c00 6f 75 72 20 63 61 6c 6c 65 72 2e 0d 0a 20 20 20  our caller...   
11c10 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
11c20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
11c30 72 65 73 75 6c 74 73 56 61 72 4e 61 6d 65 5d 20  resultsVarName] 
11c40 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  > 0} then {..   
11c50 20 20 20 20 20 75 70 76 61 72 20 31 20 24 72 65       upvar 1 $re
11c60 73 75 6c 74 73 56 61 72 4e 61 6d 65 20 72 65 73  sultsVarName res
11c70 75 6c 74 73 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d  ults..      }...
11c80 0a 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69  .      if {[stri
11c90 6e 67 20 6c 65 6e 67 74 68 20 24 65 72 72 6f 72  ng length $error
11ca0 73 56 61 72 4e 61 6d 65 5d 20 3e 20 30 7d 20 74  sVarName] > 0} t
11cb0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 75  hen {..        u
11cc0 70 76 61 72 20 31 20 24 65 72 72 6f 72 73 56 61  pvar 1 $errorsVa
11cd0 72 4e 61 6d 65 20 65 72 72 6f 72 73 0d 0a 20 20  rName errors..  
11ce0 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23      }....      #
11cf0 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
11d00 45 76 61 6c 75 61 74 65 20 74 68 65 20 63 6f 6e  Evaluate the con
11d10 73 74 72 75 63 74 65 64 20 5b 63 6f 6d 70 69 6c  structed [compil
11d20 65 43 53 68 61 72 70 5d 20 63 6f 6d 6d 61 6e 64  eCSharp] command
11d30 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65 0d   and return the.
11d40 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 72  .      #       r
11d50 65 73 75 6c 74 2e 0d 0a 20 20 20 20 20 20 23 0d  esult...      #.
11d60 0a 20 20 20 20 20 20 65 76 61 6c 20 24 63 6f 6d  .      eval $com
11d70 6d 61 6e 64 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a  mand..    }.....
11d80 20 20 20 20 70 72 6f 63 20 69 73 4d 65 6d 6f 72      proc isMemor
11d90 79 44 62 20 7b 20 66 69 6c 65 4e 61 6d 65 20 7d  yDb { fileName }
11da0 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20   {..      #..   
11db0 20 20 20 23 20 4e 4f 54 45 3a 20 49 73 20 74 68     # NOTE: Is th
11dc0 65 20 73 70 65 63 69 66 69 65 64 20 64 61 74 61  e specified data
11dd0 62 61 73 65 20 66 69 6c 65 20 6e 61 6d 65 20 72  base file name r
11de0 65 61 6c 6c 79 20 61 6e 20 69 6e 2d 6d 65 6d 6f  eally an in-memo
11df0 72 79 20 64 61 74 61 62 61 73 65 3f 0d 0a 20 20  ry database?..  
11e00 20 20 20 20 23 0d 0a 20 20 20 20 20 20 72 65 74      #..      ret
11e10 75 72 6e 20 5b 65 78 70 72 20 7b 24 66 69 6c 65  urn [expr {$file
11e20 4e 61 6d 65 20 65 71 20 22 3a 6d 65 6d 6f 72 79  Name eq ":memory
11e30 3a 22 20 7c 7c 20 5c 0d 0a 20 20 20 20 20 20 20  :" || \..       
11e40 20 20 20 5b 73 74 72 69 6e 67 20 72 61 6e 67 65     [string range
11e50 20 24 66 69 6c 65 4e 61 6d 65 20 30 20 31 32 5d   $fileName 0 12]
11e60 20 65 71 20 22 66 69 6c 65 3a 3a 6d 65 6d 6f 72   eq "file::memor
11e70 79 3a 22 7d 5d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d  y:"}]..    }....
11e80 0a 20 20 20 20 70 72 6f 63 20 69 73 54 61 62 6c  .    proc isTabl
11e90 65 49 6e 44 62 20 7b 20 6e 61 6d 65 20 7b 76 61  eInDb { name {va
11ea0 72 4e 61 6d 65 20 64 62 7d 20 7d 20 7b 0d 0a 20  rName db} } {.. 
11eb0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
11ec0 4e 4f 54 45 3a 20 52 65 66 65 72 20 74 6f 20 74  NOTE: Refer to t
11ed0 68 65 20 73 70 65 63 69 66 69 65 64 20 76 61 72  he specified var
11ee0 69 61 62 6c 65 20 28 65 2e 67 2e 20 22 64 62 22  iable (e.g. "db"
11ef0 29 20 69 6e 20 74 68 65 20 63 6f 6e 74 65 78 74  ) in the context
11f00 20 6f 66 20 6f 75 72 0d 0a 20 20 20 20 20 20 23   of our..      #
11f10 20 20 20 20 20 20 20 63 61 6c 6c 65 72 2e 20 20         caller.  
11f20 49 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  It contains the 
11f30 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
11f40 69 6f 6e 20 68 61 6e 64 6c 65 20 74 68 61 74 20  ion handle that 
11f50 77 69 6c 6c 20 62 65 0d 0a 20 20 20 20 20 20 23  will be..      #
11f60 20 20 20 20 20 20 20 75 73 65 64 20 74 6f 20 65         used to e
11f70 78 65 63 75 74 65 20 74 68 65 20 71 75 65 72 79  xecute the query
11f80 20 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69   used to determi
11f90 6e 65 20 69 66 20 74 68 65 20 6e 61 6d 65 64 20  ne if the named 
11fa0 74 61 62 6c 65 20 69 73 0d 0a 20 20 20 20 20 20  table is..      
11fb0 23 20 20 20 20 20 20 20 70 72 65 73 65 6e 74 20  #       present 
11fc0 69 6e 20 74 68 61 74 20 64 61 74 61 62 61 73 65  in that database
11fd0 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
11fe0 20 20 75 70 76 61 72 20 31 20 24 76 61 72 4e 61    upvar 1 $varNa
11ff0 6d 65 20 64 62 0d 0a 0d 0a 20 20 20 20 20 20 23  me db....      #
12000 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
12010 55 73 65 20 74 68 65 20 73 71 6c 69 74 65 5f 6d  Use the sqlite_m
12020 61 73 74 65 72 20 74 61 62 6c 65 20 74 6f 20 64  aster table to d
12030 65 74 65 72 6d 69 6e 65 20 69 66 20 74 68 65 20  etermine if the 
12040 6e 61 6d 65 64 20 74 61 62 6c 65 20 69 73 0d 0a  named table is..
12050 20 20 20 20 20 20 23 20 20 20 20 20 20 20 70 72        #       pr
12060 65 73 65 6e 74 20 69 6e 20 74 68 65 20 64 61 74  esent in the dat
12070 61 62 61 73 65 2e 0d 0a 20 20 20 20 20 20 23 0d  abase...      #.
12080 0a 20 20 20 20 20 20 73 65 74 20 73 71 6c 20 7b  .      set sql {
12090 0d 0a 20 20 20 20 20 20 20 20 53 45 4c 45 43 54  ..        SELECT
120a0 20 43 4f 55 4e 54 28 2a 29 20 46 52 4f 4d 20 73   COUNT(*) FROM s
120b0 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 57 48 45  qlite_master WHE
120c0 52 45 20 74 79 70 65 20 3d 20 27 74 61 62 6c 65  RE type = 'table
120d0 27 20 41 4e 44 20 6e 61 6d 65 20 3d 20 3f 3b 0d  ' AND name = ?;.
120e0 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
120f0 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
12100 45 3a 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65  E: Return non-ze
12110 72 6f 20 69 66 20 74 68 65 20 6e 61 6d 65 64 20  ro if the named 
12120 74 61 62 6c 65 20 69 73 20 70 72 65 73 65 6e 74  table is present
12130 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
12140 20 20 72 65 74 75 72 6e 20 5b 65 78 70 72 20 7b    return [expr {
12150 0d 0a 20 20 20 20 20 20 20 20 5b 73 71 6c 20 65  ..        [sql e
12160 78 65 63 75 74 65 20 2d 65 78 65 63 75 74 65 20  xecute -execute 
12170 73 63 61 6c 61 72 20 24 64 62 20 24 73 71 6c 20  scalar $db $sql 
12180 5b 6c 69 73 74 20 70 61 72 61 6d 31 20 53 74 72  [list param1 Str
12190 69 6e 67 20 24 6e 61 6d 65 5d 5d 20 3e 20 30 0d  ing $name]] > 0.
121a0 0a 20 20 20 20 20 20 7d 5d 0d 0a 20 20 20 20 7d  .      }]..    }
121b0 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65  .....    proc ge
121c0 74 44 62 44 65 66 61 75 6c 74 50 61 67 65 53 69  tDbDefaultPageSi
121d0 7a 65 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 74  ze {} {..      t
121e0 72 79 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 65  ry {..        se
121f0 74 20 64 62 20 5b 73 71 6c 20 6f 70 65 6e 20 2d  t db [sql open -
12200 74 79 70 65 20 53 51 4c 69 74 65 20 7b 44 61 74  type SQLite {Dat
12210 61 20 53 6f 75 72 63 65 3d 3a 6d 65 6d 6f 72 79  a Source=:memory
12220 3a 3b 7d 5d 0d 0a 20 20 20 20 20 20 20 20 72 65  :;}]..        re
12230 74 75 72 6e 20 5b 73 71 6c 20 65 78 65 63 75 74  turn [sql execut
12240 65 20 2d 65 78 65 63 75 74 65 20 73 63 61 6c 61  e -execute scala
12250 72 20 24 64 62 20 22 50 52 41 47 4d 41 20 70 61  r $db "PRAGMA pa
12260 67 65 5f 73 69 7a 65 3b 22 5d 0d 0a 20 20 20 20  ge_size;"]..    
12270 20 20 7d 20 66 69 6e 61 6c 6c 79 20 7b 0d 0a 20    } finally {.. 
12280 20 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f         if {[info
12290 20 65 78 69 73 74 73 20 64 62 5d 7d 20 74 68 65   exists db]} the
122a0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 63  n {..          c
122b0 61 74 63 68 20 7b 73 71 6c 20 63 6c 6f 73 65 20  atch {sql close 
122c0 24 64 62 7d 0d 0a 20 20 20 20 20 20 20 20 20 20  $db}..          
122d0 75 6e 73 65 74 20 2d 6e 6f 63 6f 6d 70 6c 61 69  unset -nocomplai
122e0 6e 20 64 62 0d 0a 20 20 20 20 20 20 20 20 7d 0d  n db..        }.
122f0 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d  .      }..    }.
12300 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74  ....    proc get
12310 44 62 44 65 66 61 75 6c 74 43 61 63 68 65 53 69  DbDefaultCacheSi
12320 7a 65 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 74  ze {} {..      t
12330 72 79 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 65  ry {..        se
12340 74 20 64 62 20 5b 73 71 6c 20 6f 70 65 6e 20 2d  t db [sql open -
12350 74 79 70 65 20 53 51 4c 69 74 65 20 7b 44 61 74  type SQLite {Dat
12360 61 20 53 6f 75 72 63 65 3d 3a 6d 65 6d 6f 72 79  a Source=:memory
12370 3a 3b 7d 5d 0d 0a 20 20 20 20 20 20 20 20 72 65  :;}]..        re
12380 74 75 72 6e 20 5b 73 71 6c 20 65 78 65 63 75 74  turn [sql execut
12390 65 20 2d 65 78 65 63 75 74 65 20 73 63 61 6c 61  e -execute scala
123a0 72 20 24 64 62 20 22 50 52 41 47 4d 41 20 63 61  r $db "PRAGMA ca
123b0 63 68 65 5f 73 69 7a 65 3b 22 5d 0d 0a 20 20 20  che_size;"]..   
123c0 20 20 20 7d 20 66 69 6e 61 6c 6c 79 20 7b 0d 0a     } finally {..
123d0 20 20 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66          if {[inf
123e0 6f 20 65 78 69 73 74 73 20 64 62 5d 7d 20 74 68  o exists db]} th
123f0 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
12400 63 61 74 63 68 20 7b 73 71 6c 20 63 6c 6f 73 65  catch {sql close
12410 20 24 64 62 7d 0d 0a 20 20 20 20 20 20 20 20 20   $db}..         
12420 20 75 6e 73 65 74 20 2d 6e 6f 63 6f 6d 70 6c 61   unset -nocompla
12430 69 6e 20 64 62 0d 0a 20 20 20 20 20 20 20 20 7d  in db..        }
12440 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d  ..      }..    }
12450 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 75 73  .....    proc us
12460 65 4c 65 67 61 63 79 44 62 50 61 67 65 41 6e 64  eLegacyDbPageAnd
12470 43 61 63 68 65 53 69 7a 65 73 20 7b 20 76 61 72  CacheSizes { var
12480 4e 61 6d 65 20 7d 20 7b 0d 0a 20 20 20 20 20 20  Name } {..      
12490 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
124a0 20 52 65 66 65 72 20 74 6f 20 74 68 65 20 73 70   Refer to the sp
124b0 65 63 69 66 69 65 64 20 76 61 72 69 61 62 6c 65  ecified variable
124c0 20 28 65 2e 67 2e 20 22 64 62 22 29 20 69 6e 20   (e.g. "db") in 
124d0 74 68 65 20 63 6f 6e 74 65 78 74 20 6f 66 20 6f  the context of o
124e0 75 72 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  ur..      #     
124f0 20 20 63 61 6c 6c 65 72 2e 20 20 49 74 20 63 6f    caller.  It co
12500 6e 74 61 69 6e 73 20 74 68 65 20 64 61 74 61 62  ntains the datab
12510 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68  ase connection h
12520 61 6e 64 6c 65 20 74 68 61 74 20 77 69 6c 6c 20  andle that will 
12530 62 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  be..      #     
12540 20 20 75 73 65 64 20 74 6f 20 65 78 65 63 75 74    used to execut
12550 65 20 71 75 65 72 69 65 73 20 75 73 65 64 20 74  e queries used t
12560 6f 20 73 65 74 20 74 68 65 20 70 61 67 65 20 61  o set the page a
12570 6e 64 20 63 61 63 68 65 20 73 69 7a 65 73 2e 0d  nd cache sizes..
12580 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
12590 75 70 76 61 72 20 31 20 24 76 61 72 4e 61 6d 65  upvar 1 $varName
125a0 20 64 62 0d 0a 0d 0a 20 20 20 20 20 20 73 71 6c   db....      sql
125b0 20 65 78 65 63 75 74 65 20 24 64 62 20 7b 0d 0a   execute $db {..
125c0 20 20 20 20 20 20 20 20 50 52 41 47 4d 41 20 70          PRAGMA p
125d0 61 67 65 5f 73 69 7a 65 20 3d 20 31 30 32 34 3b  age_size = 1024;
125e0 0d 0a 20 20 20 20 20 20 20 20 50 52 41 47 4d 41  ..        PRAGMA
125f0 20 63 61 63 68 65 5f 73 69 7a 65 20 3d 20 32 30   cache_size = 20
12600 30 30 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a  00;..      }....
12610 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b 6c 69        return [li
12620 73 74 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  st \..          
12630 5b 73 71 6c 20 65 78 65 63 75 74 65 20 2d 65 78  [sql execute -ex
12640 65 63 75 74 65 20 73 63 61 6c 61 72 20 24 64 62  ecute scalar $db
12650 20 22 50 52 41 47 4d 41 20 70 61 67 65 5f 73 69   "PRAGMA page_si
12660 7a 65 3b 22 5d 20 5c 0d 0a 20 20 20 20 20 20 20  ze;"] \..       
12670 20 20 20 5b 73 71 6c 20 65 78 65 63 75 74 65 20     [sql execute 
12680 2d 65 78 65 63 75 74 65 20 73 63 61 6c 61 72 20  -execute scalar 
12690 24 64 62 20 22 50 52 41 47 4d 41 20 63 61 63 68  $db "PRAGMA cach
126a0 65 5f 73 69 7a 65 3b 22 5d 5d 0d 0a 20 20 20 20  e_size;"]]..    
126b0 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 65  }.....    proc e
126c0 78 74 72 61 63 74 53 79 73 74 65 6d 44 61 74 61  xtractSystemData
126d0 53 51 4c 69 74 65 45 78 63 65 70 74 69 6f 6e 4d  SQLiteExceptionM
126e0 65 73 73 61 67 65 20 7b 20 76 61 6c 75 65 20 7d  essage { value }
126f0 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20   {..      #..   
12700 20 20 20 23 20 4e 4f 54 45 3a 20 49 66 20 74 68     # NOTE: If th
12710 65 20 73 74 72 69 6e 67 20 63 6f 6e 66 6f 72 6d  e string conform
12720 73 20 74 6f 20 66 6f 72 6d 61 74 20 6f 66 20 74  s to format of t
12730 68 65 20 6e 6f 72 6d 61 6c 20 65 78 63 65 70 74  he normal except
12740 69 6f 6e 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ion..      #    
12750 20 20 20 65 72 72 6f 72 20 73 74 72 69 6e 67 73     error strings
12760 2c 20 65 78 74 72 61 63 74 20 61 6e 64 20 72 65  , extract and re
12770 74 75 72 6e 20 6f 6e 6c 79 20 74 68 65 20 65 72  turn only the er
12780 72 6f 72 20 6d 65 73 73 61 67 65 0d 0a 20 20 20  ror message..   
12790 20 20 20 23 20 20 20 20 20 20 20 70 6f 72 74 69     #       porti
127a0 6f 6e 20 69 74 73 65 6c 66 2e 0d 0a 20 20 20 20  on itself...    
127b0 20 20 23 0d 0a 20 20 20 20 20 20 73 65 74 20 70    #..      set p
127c0 61 74 74 65 72 6e 73 20 5b 6c 69 73 74 20 5c 0d  atterns [list \.
127d0 0a 20 20 20 20 20 20 7b 53 79 73 74 65 6d 5c 2e  .      {System\.
127e0 44 61 74 61 5c 2e 53 51 4c 69 74 65 5c 2e 53 51  Data\.SQLite\.SQ
127f0 4c 69 74 65 45 78 63 65 70 74 69 6f 6e 20 5c 28  LiteException \(
12800 30 78 38 30 30 30 34 30 30 35 5c 29 3a 20 28 2e  0x80004005\): (.
12810 2b 3f 29 20 20 28 3f 3a 20 29 3f 61 74 7d 20 5c  +?)  (?: )?at} \
12820 0d 0a 20 20 20 20 20 20 7b 53 79 73 74 65 6d 5c  ..      {System\
12830 2e 44 61 74 61 5c 2e 53 51 4c 69 74 65 5c 2e 53  .Data\.SQLite\.S
12840 51 4c 69 74 65 45 78 63 65 70 74 69 6f 6e 3a 20  QLiteException: 
12850 28 2e 2b 3f 29 20 20 28 3f 3a 20 29 3f 61 74 7d  (.+?)  (?: )?at}
12860 20 5c 0d 0a 20 20 20 20 20 20 7b 45 61 67 6c 65   \..      {Eagle
12870 5c 2e 5f 43 6f 6d 70 6f 6e 65 6e 74 73 5c 2e 50  \._Components\.P
12880 75 62 6c 69 63 5c 2e 53 63 72 69 70 74 45 78 63  ublic\.ScriptExc
12890 65 70 74 69 6f 6e 3a 20 28 2e 2b 3f 29 20 20 28  eption: (.+?)  (
128a0 3f 3a 20 29 3f 61 74 7d 5d 0d 0a 0d 0a 20 20 20  ?: )?at}]....   
128b0 20 20 20 66 6f 72 65 61 63 68 20 70 61 74 74 65     foreach patte
128c0 72 6e 20 24 70 61 74 74 65 72 6e 73 20 7b 0d 0a  rn $patterns {..
128d0 20 20 20 20 20 20 20 20 69 66 20 7b 5b 72 65 67          if {[reg
128e0 65 78 70 20 2d 2d 20 24 70 61 74 74 65 72 6e 20  exp -- $pattern 
128f0 24 76 61 6c 75 65 20 64 75 6d 6d 79 20 6d 65 73  $value dummy mes
12900 73 61 67 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  sage]} then {.. 
12910 20 20 20 20 20 20 20 20 20 73 65 74 20 6d 65 73           set mes
12920 73 61 67 65 20 5b 73 74 72 69 6e 67 20 6d 61 70  sage [string map
12930 20 5b 6c 69 73 74 20 5c 72 5c 6e 20 5c 6e 5d 20   [list \r\n \n] 
12940 5b 73 74 72 69 6e 67 20 74 72 69 6d 20 24 6d 65  [string trim $me
12950 73 73 61 67 65 5d 5d 0d 0a 20 20 20 20 20 20 20  ssage]]..       
12960 20 20 20 73 65 74 20 6c 69 6e 65 73 20 5b 73 70     set lines [sp
12970 6c 69 74 20 24 6d 65 73 73 61 67 65 20 5c 6e 5d  lit $message \n]
12980 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66  ....          if
12990 20 7b 5b 6c 6c 65 6e 67 74 68 20 24 6c 69 6e 65   {[llength $line
129a0 73 5d 20 3d 3d 20 32 7d 20 74 68 65 6e 20 7b 0d  s] == 2} then {.
129b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20  .            if 
129c0 7b 5b 6c 69 6e 64 65 78 20 24 6c 69 6e 65 73 20  {[lindex $lines 
129d0 30 5d 20 65 71 20 5b 6c 69 6e 64 65 78 20 24 6c  0] eq [lindex $l
129e0 69 6e 65 73 20 31 5d 7d 20 74 68 65 6e 20 7b 0d  ines 1]} then {.
129f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72  .              r
12a00 65 74 75 72 6e 20 5b 6c 69 6e 64 65 78 20 24 6c  eturn [lindex $l
12a10 69 6e 65 73 20 30 5d 0d 0a 20 20 20 20 20 20 20  ines 0]..       
12a20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
12a30 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b 61 70        return [ap
12a40 70 65 6e 64 41 72 67 73 20 5b 6c 69 6e 64 65 78  pendArgs [lindex
12a50 20 24 6c 69 6e 65 73 20 30 5d 20 22 20 2d 2d 20   $lines 0] " -- 
12a60 22 20 5b 6c 69 6e 64 65 78 20 24 6c 69 6e 65 73  " [lindex $lines
12a70 20 31 5d 5d 0d 0a 20 20 20 20 20 20 20 20 20 20   1]]..          
12a80 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 72  }....          r
12a90 65 74 75 72 6e 20 24 6d 65 73 73 61 67 65 0d 0a  eturn $message..
12aa0 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
12ab0 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65 74 75   }....      retu
12ac0 72 6e 20 24 76 61 6c 75 65 0d 0a 20 20 20 20 7d  rn $value..    }
12ad0 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 74 72  .....    proc tr
12ae0 69 6d 53 71 6c 20 7b 20 73 71 6c 20 7d 20 7b 0d  imSql { sql } {.
12af0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b 72  .      return [r
12b00 65 67 73 75 62 20 2d 61 6c 6c 20 2d 2d 20 7b 5c  egsub -all -- {\
12b10 73 2b 7d 20 5b 73 74 72 69 6e 67 20 74 72 69 6d  s+} [string trim
12b20 20 24 73 71 6c 5d 20 22 20 22 5d 0d 0a 20 20 20   $sql] " "]..   
12b30 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
12b40 65 78 65 63 75 74 65 53 71 6c 20 7b 20 73 71 6c  executeSql { sql
12b50 20 7b 65 78 65 63 75 74 65 20 6e 6f 6e 65 7d 20   {execute none} 
12b60 7b 66 6f 72 6d 61 74 20 6e 6f 6e 65 7d 20 7b 66  {format none} {f
12b70 69 6c 65 4e 61 6d 65 20 22 22 7d 20 7d 20 7b 0d  ileName ""} } {.
12b80 0a 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69  .      if {[stri
12b90 6e 67 20 6c 65 6e 67 74 68 20 24 66 69 6c 65 4e  ng length $fileN
12ba0 61 6d 65 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20  ame] == 0} then 
12bb0 7b 73 65 74 20 66 69 6c 65 4e 61 6d 65 20 3a 6d  {set fileName :m
12bc0 65 6d 6f 72 79 3a 7d 0d 0a 20 20 20 20 20 20 73  emory:}..      s
12bd0 65 74 75 70 44 62 20 24 66 69 6c 65 4e 61 6d 65  etupDb $fileName
12be0 20 22 22 20 22 22 20 22 22 20 22 22 20 22 22 20   "" "" "" "" "" 
12bf0 66 61 6c 73 65 20 66 61 6c 73 65 20 66 61 6c 73  false false fals
12c00 65 20 66 61 6c 73 65 20 64 62 20 74 72 75 65 0d  e false db true.
12c10 0a 0d 0a 20 20 20 20 20 20 74 72 79 20 7b 0d 0a  ...      try {..
12c20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b          return [
12c30 75 70 6c 65 76 65 6c 20 31 20 5b 6c 69 73 74 20  uplevel 1 [list 
12c40 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  \..            s
12c50 71 6c 20 65 78 65 63 75 74 65 20 2d 65 78 65 63  ql execute -exec
12c60 75 74 65 20 24 65 78 65 63 75 74 65 20 2d 66 6f  ute $execute -fo
12c70 72 6d 61 74 20 24 66 6f 72 6d 61 74 20 24 64 62  rmat $format $db
12c80 20 24 73 71 6c 5d 5d 0d 0a 20 20 20 20 20 20 7d   $sql]]..      }
12c90 20 66 69 6e 61 6c 6c 79 20 7b 0d 0a 20 20 20 20   finally {..    
12ca0 20 20 20 20 63 6c 65 61 6e 75 70 44 62 20 24 66      cleanupDb $f
12cb0 69 6c 65 4e 61 6d 65 20 64 62 20 66 61 6c 73 65  ileName db false
12cc0 20 66 61 6c 73 65 20 66 61 6c 73 65 0d 0a 20 20   false false..  
12cd0 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d      }..    }....
12ce0 0a 20 20 20 20 70 72 6f 63 20 68 61 73 4e 6f 46  .    proc hasNoF
12cf0 6c 61 67 73 20 7b 20 76 61 72 4e 61 6d 65 20 6e  lags { varName n
12d00 6f 6e 65 20 7d 20 7b 0d 0a 20 20 20 20 20 20 75  one } {..      u
12d10 70 76 61 72 20 31 20 24 76 61 72 4e 61 6d 65 20  pvar 1 $varName 
12d20 66 6c 61 67 73 0d 0a 0d 0a 20 20 20 20 20 20 69  flags....      i
12d30 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73  f {![info exists
12d40 20 66 6c 61 67 73 5d 7d 20 74 68 65 6e 20 7b 0d   flags]} then {.
12d50 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
12d60 74 72 75 65 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d  true..      }...
12d70 0a 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69  .      if {[stri
12d80 6e 67 20 6c 65 6e 67 74 68 20 24 66 6c 61 67 73  ng length $flags
12d90 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  ] == 0} then {..
12da0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 74          return t
12db0 72 75 65 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a  rue..      }....
12dc0 20 20 20 20 20 20 69 66 20 7b 24 6e 6f 6e 65 20        if {$none 
12dd0 26 26 20 24 66 6c 61 67 73 20 65 71 20 22 4e 6f  && $flags eq "No
12de0 6e 65 22 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  ne"} then {..   
12df0 20 20 20 20 20 72 65 74 75 72 6e 20 74 72 75 65       return true
12e00 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
12e10 20 20 20 72 65 74 75 72 6e 20 66 61 6c 73 65 0d     return false.
12e20 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70  .    }.....    p
12e30 72 6f 63 20 67 65 74 43 6f 6e 6e 65 63 74 69 6f  roc getConnectio
12e40 6e 46 6c 61 67 73 20 7b 20 66 69 6c 65 4e 61 6d  nFlags { fileNam
12e50 65 20 66 6c 61 67 73 20 7b 71 75 69 65 74 20 66  e flags {quiet f
12e60 61 6c 73 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20  alse} } {..     
12e70 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
12e80 3a 20 46 69 67 75 72 65 20 6f 75 74 20 77 68 69  : Figure out whi
12e90 63 68 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ch database file
12ea0 20 6e 61 6d 65 20 6f 72 20 63 6f 6e 6e 65 63 74   name or connect
12eb0 69 6f 6e 20 73 74 72 69 6e 67 20 74 68 65 73 65  ion string these
12ec0 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
12ed0 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 6c 61 67 73  connection flags
12ee0 20 77 69 6c 6c 20 61 63 74 75 61 6c 6c 79 20 61   will actually a
12ef0 70 70 6c 79 20 74 6f 2e 20 20 54 68 69 73 20 69  pply to.  This i
12f00 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 0d  s not necessary.
12f10 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 69  .      #       i
12f20 6e 20 71 75 69 65 74 20 6d 6f 64 65 20 62 65 63  n quiet mode bec
12f30 61 75 73 65 20 74 68 69 73 20 69 6e 66 6f 72 6d  ause this inform
12f40 61 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 75 73  ation is only us
12f50 65 64 20 66 6f 72 20 6c 6f 67 67 69 6e 67 0d 0a  ed for logging..
12f60 20 20 20 20 20 20 23 20 20 20 20 20 20 20 61 6e        #       an
12f70 64 20 72 65 70 6f 72 74 69 6e 67 20 70 75 72 70  d reporting purp
12f80 6f 73 65 73 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  oses...      #..
12f90 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65        if {!$quie
12fa0 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  t} then {..     
12fb0 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c     if {[string l
12fc0 65 6e 67 74 68 20 24 66 69 6c 65 4e 61 6d 65 5d  ength $fileName]
12fd0 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20   > 0} then {..  
12fe0 20 20 20 20 20 20 20 20 73 65 74 20 64 61 74 61          set data
12ff0 62 61 73 65 20 5b 61 70 70 65 6e 64 41 72 67 73  base [appendArgs
13000 20 22 66 69 6c 65 20 6e 61 6d 65 20 5c 22 22 20   "file name \"" 
13010 24 66 69 6c 65 4e 61 6d 65 20 5c 22 5d 0d 0a 20  $fileName \"].. 
13020 20 20 20 20 20 20 20 7d 20 65 6c 73 65 69 66 20         } elseif 
13030 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  {[info exists ::
13040 64 61 74 61 53 6f 75 72 63 65 5d 20 26 26 20 5c  dataSource] && \
13050 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 21 5b  ..            ![
13060 61 72 72 61 79 20 65 78 69 73 74 73 20 3a 3a 64  array exists ::d
13070 61 74 61 53 6f 75 72 63 65 5d 7d 20 74 68 65 6e  ataSource]} then
13080 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65   {..          se
13090 74 20 64 61 74 61 62 61 73 65 20 5b 61 70 70 65  t database [appe
130a0 6e 64 41 72 67 73 20 22 64 61 74 61 20 73 6f 75  ndArgs "data sou
130b0 72 63 65 20 5c 22 22 20 24 3a 3a 64 61 74 61 53  rce \"" $::dataS
130c0 6f 75 72 63 65 20 5c 22 5d 0d 0a 20 20 20 20 20  ource \"]..     
130d0 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
130e0 20 20 20 20 20 20 20 73 65 74 20 64 61 74 61 62         set datab
130f0 61 73 65 20 3c 75 6e 6b 6e 6f 77 6e 3e 0d 0a 20  ase <unknown>.. 
13100 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
13110 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  }....      #..  
13120 20 20 20 20 23 20 4e 4f 54 45 3a 20 45 76 65 6e      # NOTE: Even
13130 20 74 68 6f 75 67 68 20 74 68 65 72 65 20 69 73   though there is
13140 20 6f 6e 6c 79 20 6f 6e 65 20 73 6f 75 72 63 65   only one source
13150 20 6f 66 20 66 6c 61 67 73 20 73 6f 20 66 61 72   of flags so far
13160 2c 20 74 68 65 79 0d 0a 20 20 20 20 20 20 23 20  , they..      # 
13170 20 20 20 20 20 20 6d 75 73 74 20 62 65 20 63 6f        must be co
13180 6d 62 69 6e 65 64 20 75 73 69 6e 67 20 74 68 65  mbined using the
13190 20 63 6f 72 72 65 63 74 20 73 79 6e 74 61 78 20   correct syntax 
131a0 66 6f 72 20 65 6e 75 6d 65 72 61 74 65 64 0d 0a  for enumerated..
131b0 20 20 20 20 20 20 23 20 20 20 20 20 20 20 66 6c        #       fl
131c0 61 67 20 76 61 6c 75 65 73 20 66 6f 72 20 74 68  ag values for th
131d0 65 20 2e 4e 45 54 20 46 72 61 6d 65 77 6f 72 6b  e .NET Framework
131e0 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
131f0 20 20 73 65 74 20 66 6c 61 67 73 20 5b 63 6f 6d    set flags [com
13200 62 69 6e 65 46 6c 61 67 73 20 24 66 6c 61 67 73  bineFlags $flags
13210 20 22 22 5d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d   ""]....      #.
13220 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53  .      # NOTE: S
13230 68 6f 77 20 28 61 6e 64 20 6c 6f 67 29 20 74 68  how (and log) th
13240 65 20 6c 6f 63 61 6c 20 63 6f 6e 6e 65 63 74 69  e local connecti
13250 6f 6e 20 66 6c 61 67 73 20 61 6e 64 20 74 68 65  on flags and the
13260 20 61 73 73 6f 63 69 61 74 65 64 0d 0a 20 20 20   associated..   
13270 20 20 20 23 20 20 20 20 20 20 20 64 61 74 61 20     #       data 
13280 73 6f 75 72 63 65 20 6f 72 20 66 69 6c 65 20 6e  source or file n
13290 61 6d 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ame...      #.. 
132a0 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74       if {!$quiet
132b0 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
132c0 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69    if {![info exi
132d0 73 74 73 20 3a 3a 6e 6f 28 65 6d 69 74 4c 6f 63  sts ::no(emitLoc
132e0 61 6c 46 6c 61 67 73 29 5d 20 26 26 20 5c 0d 0a  alFlags)] && \..
132f0 20 20 20 20 20 20 20 20 20 20 20 20 28 21 5b 69              (![i
13300 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28  nfo exists ::no(
13310 65 6d 69 74 4c 6f 63 61 6c 46 6c 61 67 73 49 66  emitLocalFlagsIf
13320 4e 6f 6e 65 29 5d 20 7c 7c 20 5c 0d 0a 20 20 20  None)] || \..   
13330 20 20 20 20 20 20 20 20 20 20 21 5b 68 61 73 4e            ![hasN
13340 6f 46 6c 61 67 73 20 66 6c 61 67 73 20 66 61 6c  oFlags flags fal
13350 73 65 5d 29 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  se])} then {..  
13360 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
13370 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61  :test_channel [a
13380 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
13390 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
133a0 20 6c 6f 63 61 6c 20 63 6f 6e 6e 65 63 74 69 6f   local connectio
133b0 6e 20 66 6c 61 67 73 20 66 6f 72 20 22 20 24 64  n flags for " $d
133c0 61 74 61 62 61 73 65 20 5c 0d 0a 20 20 20 20 20  atabase \..     
133d0 20 20 20 20 20 20 20 20 20 22 20 61 72 65 3a 20           " are: 
133e0 22 20 5b 65 78 70 72 20 7b 21 5b 68 61 73 4e 6f  " [expr {![hasNo
133f0 46 6c 61 67 73 20 66 6c 61 67 73 20 66 61 6c 73  Flags flags fals
13400 65 5d 20 3f 20 5c 0d 0a 20 20 20 20 20 20 20 20  e] ? \..        
13410 20 20 20 20 20 20 5b 61 70 70 65 6e 64 41 72 67        [appendArg
13420 73 20 5c 22 20 24 66 6c 61 67 73 20 5c 22 5d 20  s \" $flags \"] 
13430 3a 20 22 3c 6e 6f 6e 65 3e 22 7d 5d 20 5c 6e 5d  : "<none>"}] \n]
13440 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20  ..        }..   
13450 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d     }....      #.
13460 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53  .      # NOTE: S
13470 68 6f 77 20 28 61 6e 64 20 6c 6f 67 29 20 74 68  how (and log) th
13480 65 20 73 68 61 72 65 64 20 63 6f 6e 6e 65 63 74  e shared connect
13490 69 6f 6e 20 66 6c 61 67 73 2e 0d 0a 20 20 20 20  ion flags...    
134a0 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 21    #..      if {!
134b0 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a  $quiet} then {..
134c0 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74          if {[cat
134d0 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  ch {..          
134e0 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 53 79  object invoke Sy
134f0 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
13500 2e 53 51 4c 69 74 65 43 6f 6e 6e 65 63 74 69 6f  .SQLiteConnectio
13510 6e 20 53 68 61 72 65 64 46 6c 61 67 73 0d 0a 20  n SharedFlags.. 
13520 20 20 20 20 20 20 20 7d 20 73 68 61 72 65 64 46         } sharedF
13530 6c 61 67 73 5d 20 3d 3d 20 30 7d 20 74 68 65 6e  lags] == 0} then
13540 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66   {..          if
13550 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20   {![info exists 
13560 3a 3a 6e 6f 28 65 6d 69 74 53 68 61 72 65 64 46  ::no(emitSharedF
13570 6c 61 67 73 29 5d 20 26 26 20 5c 0d 0a 20 20 20  lags)] && \..   
13580 20 20 20 20 20 20 20 20 20 20 20 28 21 5b 69 6e             (![in
13590 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 65  fo exists ::no(e
135a0 6d 69 74 53 68 61 72 65 64 46 6c 61 67 73 49 66  mitSharedFlagsIf
135b0 4e 6f 6e 65 29 5d 20 7c 7c 20 5c 0d 0a 20 20 20  None)] || \..   
135c0 20 20 20 20 20 20 20 20 20 20 20 20 21 5b 68 61              ![ha
135d0 73 4e 6f 46 6c 61 67 73 20 73 68 61 72 65 64 46  sNoFlags sharedF
135e0 6c 61 67 73 20 74 72 75 65 5d 29 7d 20 74 68 65  lags true])} the
135f0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
13600 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
13610 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
13620 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
13630 20 20 20 20 20 20 22 2d 2d 2d 2d 20 73 68 61 72        "---- shar
13640 65 64 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 6c  ed connection fl
13650 61 67 73 20 66 6f 72 20 22 20 24 64 61 74 61 62  ags for " $datab
13660 61 73 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ase \..         
13670 20 20 20 20 20 20 20 22 20 61 72 65 3a 20 22 20         " are: " 
13680 5b 65 78 70 72 20 7b 21 5b 68 61 73 4e 6f 46 6c  [expr {![hasNoFl
13690 61 67 73 20 73 68 61 72 65 64 46 6c 61 67 73 20  ags sharedFlags 
136a0 74 72 75 65 5d 20 3f 20 5c 0d 0a 20 20 20 20 20  true] ? \..     
136b0 20 20 20 20 20 20 20 20 20 20 20 5b 61 70 70 65             [appe
136c0 6e 64 41 72 67 73 20 5c 22 20 24 73 68 61 72 65  ndArgs \" $share
136d0 64 46 6c 61 67 73 20 5c 22 5d 20 3a 20 22 3c 6e  dFlags \"] : "<n
136e0 6f 6e 65 3e 22 7d 5d 20 5c 6e 5d 0d 0a 20 20 20  one>"}] \n]..   
136f0 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
13700 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
13710 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f        if {![info
13720 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 65 6d 69   exists ::no(emi
13730 74 53 68 61 72 65 64 46 6c 61 67 73 29 5d 20 26  tSharedFlags)] &
13740 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  & \..           
13750 20 20 20 21 5b 69 6e 66 6f 20 65 78 69 73 74 73     ![info exists
13760 20 3a 3a 6e 6f 28 65 6d 69 74 53 68 61 72 65 64   ::no(emitShared
13770 46 6c 61 67 73 49 66 55 6e 61 76 61 69 6c 61 62  FlagsIfUnavailab
13780 6c 65 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  le)]} then {..  
13790 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
137a0 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
137b0 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
137c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
137d0 2d 2d 2d 2d 20 73 68 61 72 65 64 20 63 6f 6e 6e  ---- shared conn
137e0 65 63 74 69 6f 6e 20 66 6c 61 67 73 20 66 6f 72  ection flags for
137f0 20 22 20 24 64 61 74 61 62 61 73 65 20 5c 0d 0a   " $database \..
13800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13810 22 20 61 72 65 3a 20 3c 75 6e 61 76 61 69 6c 61  " are: <unavaila
13820 62 6c 65 3e 5c 6e 22 5d 0d 0a 20 20 20 20 20 20  ble>\n"]..      
13830 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d      }..        }
13840 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
13850 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
13860 54 45 3a 20 53 68 6f 77 20 28 61 6e 64 20 6c 6f  TE: Show (and lo
13870 67 29 20 74 68 65 20 64 65 74 65 63 74 65 64 20  g) the detected 
13880 67 6c 6f 62 61 6c 20 63 6f 6e 6e 65 63 74 69 6f  global connectio
13890 6e 20 66 6c 61 67 73 2c 20 69 66 20 61 6e 79 2e  n flags, if any.
138a0 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
138b0 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68   if {!$quiet} th
138c0 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66  en {..        if
138d0 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20   {![info exists 
138e0 3a 3a 6e 6f 28 65 6d 69 74 47 6c 6f 62 61 6c 46  ::no(emitGlobalF
138f0 6c 61 67 73 29 5d 20 26 26 20 5c 0d 0a 20 20 20  lags)] && \..   
13900 20 20 20 20 20 20 20 20 20 28 21 5b 69 6e 66 6f           (![info
13910 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 65 6d 69   exists ::no(emi
13920 74 47 6c 6f 62 61 6c 46 6c 61 67 73 49 66 4e 6f  tGlobalFlagsIfNo
13930 6e 65 29 5d 20 7c 7c 20 5c 0d 0a 20 20 20 20 20  ne)] || \..     
13940 20 20 20 20 20 20 20 20 21 5b 68 61 73 4e 6f 46          ![hasNoF
13950 6c 61 67 73 20 3a 3a 63 6f 6e 6e 65 63 74 69 6f  lags ::connectio
13960 6e 5f 66 6c 61 67 73 20 66 61 6c 73 65 5d 29 7d  n_flags false])}
13970 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
13980 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
13990 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  _channel [append
139a0 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
139b0 20 20 20 20 20 20 22 2d 2d 2d 2d 20 67 6c 6f 62        "---- glob
139c0 61 6c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 6c  al connection fl
139d0 61 67 73 20 61 72 65 3a 20 22 20 5c 0d 0a 20 20  ags are: " \..  
139e0 20 20 20 20 20 20 20 20 20 20 20 20 5b 65 78 70              [exp
139f0 72 20 7b 21 5b 68 61 73 4e 6f 46 6c 61 67 73 20  r {![hasNoFlags 
13a00 3a 3a 63 6f 6e 6e 65 63 74 69 6f 6e 5f 66 6c 61  ::connection_fla
13a10 67 73 20 66 61 6c 73 65 5d 20 3f 20 5c 0d 0a 20  gs false] ? \.. 
13a20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 61 70               [ap
13a30 70 65 6e 64 41 72 67 73 20 5c 22 20 24 3a 3a 63  pendArgs \" $::c
13a40 6f 6e 6e 65 63 74 69 6f 6e 5f 66 6c 61 67 73 20  onnection_flags 
13a50 5c 22 5d 20 3a 20 22 3c 6e 6f 6e 65 3e 22 7d 5d  \"] : "<none>"}]
13a60 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d   \n]..        }.
13a70 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
13a80 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
13a90 45 3a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  E: If there are 
13aa0 61 6e 79 20 67 6c 6f 62 61 6c 20 28 70 65 72 20  any global (per 
13ab0 74 65 73 74 20 72 75 6e 29 20 63 6f 6e 6e 65 63  test run) connec
13ac0 74 69 6f 6e 20 66 6c 61 67 73 20 63 75 72 72 65  tion flags curre
13ad0 6e 74 6c 79 0d 0a 20 20 20 20 20 20 23 20 20 20  ntly..      #   
13ae0 20 20 20 20 73 65 74 2c 20 75 73 65 20 74 68 65      set, use the
13af0 6d 20 6e 6f 77 20 28 69 2e 65 2e 20 62 79 20 63  m now (i.e. by c
13b00 6f 6d 62 69 6e 69 6e 67 20 74 68 65 6d 20 77 69  ombining them wi
13b10 74 68 20 74 68 65 20 6f 6e 65 73 20 66 6f 72 20  th the ones for 
13b20 74 68 69 73 0d 0a 20 20 20 20 20 20 23 20 20 20  this..      #   
13b30 20 20 20 20 63 6f 6e 6e 65 63 74 69 6f 6e 29 2e      connection).
13b40 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
13b50 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74   if {[info exist
13b60 73 20 3a 3a 63 6f 6e 6e 65 63 74 69 6f 6e 5f 66  s ::connection_f
13b70 6c 61 67 73 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  lags]} then {.. 
13b80 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
13b90 20 20 23 20 4e 4f 54 45 3a 20 43 6f 6d 62 69 6e    # NOTE: Combin
13ba0 65 20 61 6e 64 2f 6f 72 20 72 65 70 6c 61 63 65  e and/or replace
13bb0 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
13bc0 66 6c 61 67 73 20 61 6e 64 20 74 68 65 6e 20 73  flags and then s
13bd0 68 6f 77 20 74 68 65 0d 0a 20 20 20 20 20 20 20  how the..       
13be0 20 23 20 20 20 20 20 20 20 6e 65 77 20 76 61 6c   #       new val
13bf0 75 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  ue...        #..
13c00 20 20 20 20 20 20 20 20 73 65 74 20 66 6c 61 67          set flag
13c10 73 20 5b 63 6f 6d 62 69 6e 65 46 6c 61 67 73 20  s [combineFlags 
13c20 24 66 6c 61 67 73 20 24 3a 3a 63 6f 6e 6e 65 63  $flags $::connec
13c30 74 69 6f 6e 5f 66 6c 61 67 73 5d 0d 0a 0d 0a 20  tion_flags].... 
13c40 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
13c50 20 20 23 20 4e 4f 54 45 3a 20 53 68 6f 77 20 28    # NOTE: Show (
13c60 61 6e 64 20 6c 6f 67 29 20 74 68 65 20 6e 65 77  and log) the new
13c70 20 65 66 66 65 63 74 69 76 65 20 63 6f 6e 6e 65   effective conne
13c80 63 74 69 6f 6e 20 66 6c 61 67 73 2e 0d 0a 20 20  ction flags...  
13c90 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
13ca0 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68   if {!$quiet} th
13cb0 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
13cc0 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74  if {![info exist
13cd0 73 20 3a 3a 6e 6f 28 65 6d 69 74 43 6f 6d 62 69  s ::no(emitCombi
13ce0 6e 65 64 46 6c 61 67 73 29 5d 20 26 26 20 5c 0d  nedFlags)] && \.
13cf0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28  .              (
13d00 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  ![info exists ::
13d10 6e 6f 28 65 6d 69 74 43 6f 6d 62 69 6e 65 64 46  no(emitCombinedF
13d20 6c 61 67 73 49 66 4e 6f 6e 65 29 5d 20 7c 7c 20  lagsIfNone)] || 
13d30 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
13d40 20 20 21 5b 68 61 73 4e 6f 46 6c 61 67 73 20 66    ![hasNoFlags f
13d50 6c 61 67 73 20 66 61 6c 73 65 5d 29 7d 20 74 68  lags false])} th
13d60 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
13d70 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
13d80 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
13d90 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
13da0 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 6f 6d         "---- com
13db0 62 69 6e 65 64 20 63 6f 6e 6e 65 63 74 69 6f 6e  bined connection
13dc0 20 66 6c 61 67 73 20 66 6f 72 20 22 20 24 64 61   flags for " $da
13dd0 74 61 62 61 73 65 20 5c 0d 0a 20 20 20 20 20 20  tabase \..      
13de0 20 20 20 20 20 20 20 20 20 20 22 20 61 72 65 3a            " are:
13df0 20 22 20 5b 65 78 70 72 20 7b 21 5b 68 61 73 4e   " [expr {![hasN
13e00 6f 46 6c 61 67 73 20 66 6c 61 67 73 20 66 61 6c  oFlags flags fal
13e10 73 65 5d 20 3f 20 5c 0d 0a 20 20 20 20 20 20 20  se] ? \..       
13e20 20 20 20 20 20 20 20 20 20 5b 61 70 70 65 6e 64           [append
13e30 41 72 67 73 20 5c 22 20 24 66 6c 61 67 73 20 5c  Args \" $flags \
13e40 22 5d 20 3a 20 22 3c 6e 6f 6e 65 3e 22 7d 5d 20  "] : "<none>"}] 
13e50 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  \n]..          }
13e60 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20  ..        }..   
13e70 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65     }....      re
13e80 74 75 72 6e 20 24 66 6c 61 67 73 0d 0a 20 20 20  turn $flags..   
13e90 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
13ea0 67 65 74 46 6c 61 67 73 50 72 6f 70 65 72 74 79  getFlagsProperty
13eb0 20 7b 20 7b 66 6c 61 67 73 20 22 22 7d 20 7b 71   { {flags ""} {q
13ec0 75 69 65 74 20 66 61 6c 73 65 7d 20 7d 20 7b 0d  uiet false} } {.
13ed0 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
13ee0 23 20 4e 4f 54 45 3a 20 44 65 74 65 72 6d 69 6e  # NOTE: Determin
13ef0 65 20 77 68 61 74 20 74 68 65 20 63 6f 6d 62 69  e what the combi
13f00 6e 65 64 20 28 67 6c 6f 62 61 6c 20 61 6e 64 20  ned (global and 
13f10 6c 6f 63 61 6c 29 20 63 6f 6e 6e 65 63 74 69 6f  local) connectio
13f20 6e 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  n..      #      
13f30 20 66 6c 61 67 73 20 73 68 6f 75 6c 64 20 62 65   flags should be
13f40 2c 20 70 6f 73 73 69 62 6c 79 20 71 75 69 65 74  , possibly quiet
13f50 6c 79 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  ly...      #..  
13f60 20 20 20 20 73 65 74 20 66 6c 61 67 73 20 5b 67      set flags [g
13f70 65 74 43 6f 6e 6e 65 63 74 69 6f 6e 46 6c 61 67  etConnectionFlag
13f80 73 20 22 22 20 24 66 6c 61 67 73 20 24 71 75 69  s "" $flags $qui
13f90 65 74 5d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a  et]....      #..
13fa0 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 66        # NOTE: If
13fb0 20 6e 6f 20 67 6c 6f 62 61 6c 20 6f 72 20 6c 6f   no global or lo
13fc0 63 61 6c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66  cal connection f
13fd0 6c 61 67 73 20 77 65 72 65 20 73 70 65 63 69 66  lags were specif
13fe0 69 65 64 2c 20 74 68 65 0d 0a 20 20 20 20 20 20  ied, the..      
13ff0 23 20 20 20 20 20 20 20 64 65 66 61 75 6c 74 20  #       default 
14000 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 6c 61 67 73  connection flags
14010 20 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64 3b   should be used;
14020 20 74 68 65 72 65 66 6f 72 65 2c 20 72 65 74 75   therefore, retu
14030 72 6e 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  rn..      #     
14040 20 20 61 6e 20 65 6d 70 74 79 20 73 74 72 69 6e    an empty strin
14050 67 20 69 6e 20 74 68 61 74 20 63 61 73 65 2e 0d  g in that case..
14060 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
14070 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67  if {[string leng
14080 74 68 20 24 66 6c 61 67 73 5d 20 3d 3d 20 30 7d  th $flags] == 0}
14090 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
140a0 20 72 65 74 75 72 6e 20 22 22 0d 0a 20 20 20 20   return ""..    
140b0 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a    }....      #..
140c0 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 6e        # NOTE: In
140d0 20 6f 72 64 65 72 20 74 6f 20 63 68 65 63 6b 20   order to check 
140e0 69 66 20 74 68 65 20 64 65 66 61 75 6c 74 20 63  if the default c
140f0 6f 6e 6e 65 63 74 69 6f 6e 20 66 6c 61 67 73 20  onnection flags 
14100 61 72 65 20 62 65 69 6e 67 20 75 73 65 64 0d 0a  are being used..
14110 20 20 20 20 20 20 23 20 20 20 20 20 20 20 69 74        #       it
14120 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 74 6f   is necessary to
14130 20 61 74 74 65 6d 70 74 20 61 20 63 6f 6e 76 65   attempt a conve
14140 72 73 69 6f 6e 20 74 6f 20 74 68 65 20 61 63 74  rsion to the act
14150 75 61 6c 20 65 6e 75 6d 65 72 61 74 65 64 0d 0a  ual enumerated..
14160 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74 79        #       ty
14170 70 65 2e 20 20 46 61 69 6c 69 6e 67 20 74 68 61  pe.  Failing tha
14180 74 2c 20 74 68 65 20 63 68 65 63 6b 20 61 67 61  t, the check aga
14190 69 6e 73 74 20 74 68 65 20 64 65 66 61 75 6c 74  inst the default
141a0 20 76 61 6c 75 65 20 77 69 6c 6c 20 62 65 0d 0a   value will be..
141b0 20 20 20 20 20 20 23 20 20 20 20 20 20 20 73 6b        #       sk
141c0 69 70 70 65 64 2e 0d 0a 20 20 20 20 20 20 23 0d  ipped...      #.
141d0 0a 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63  .      if {[catc
141e0 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 65 74  h {..        set
141f0 20 65 72 72 6f 72 20 6e 75 6c 6c 3b 20 23 20 49   error null; # I
14200 47 4e 4f 52 45 44 0d 0a 0d 0a 20 20 20 20 20 20  GNORED....      
14210 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20    object invoke 
14220 55 74 69 6c 69 74 79 20 54 72 79 50 61 72 73 65  Utility TryParse
14230 46 6c 61 67 73 45 6e 75 6d 20 22 22 20 5c 0d 0a  FlagsEnum "" \..
14240 20 20 20 20 20 20 20 20 20 20 20 20 53 79 73 74              Syst
14250 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 53  em.Data.SQLite.S
14260 51 4c 69 74 65 43 6f 6e 6e 65 63 74 69 6f 6e 46  QLiteConnectionF
14270 6c 61 67 73 20 22 22 20 24 66 6c 61 67 73 20 6e  lags "" $flags n
14280 75 6c 6c 20 74 72 75 65 20 5c 0d 0a 20 20 20 20  ull true \..    
14290 20 20 20 20 20 20 20 20 74 72 75 65 20 74 72 75          true tru
142a0 65 20 65 72 72 6f 72 0d 0a 20 20 20 20 20 20 7d  e error..      }
142b0 20 76 61 6c 75 65 5d 7d 20 74 68 65 6e 20 7b 0d   value]} then {.
142c0 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
142d0 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 74 74 65      # NOTE: Atte
142e0 6d 70 74 69 6e 67 20 74 6f 20 70 61 72 73 65 20  mpting to parse 
142f0 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66  the connection f
14300 6c 61 67 73 20 63 61 75 73 65 64 20 61 20 73 63  lags caused a sc
14310 72 69 70 74 0d 0a 20 20 20 20 20 20 20 20 23 20  ript..        # 
14320 20 20 20 20 20 20 65 72 72 6f 72 2e 20 20 45 6d        error.  Em
14330 69 74 20 61 20 77 61 72 6e 69 6e 67 20 74 6f 20  it a warning to 
14340 74 68 65 20 74 65 73 74 20 6c 6f 67 20 66 69 6c  the test log fil
14350 65 20 61 6e 64 20 63 6f 6e 74 69 6e 75 65 0d 0a  e and continue..
14360 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
14370 75 73 69 6e 67 20 61 6e 20 65 6d 74 70 79 20 73  using an emtpy s
14380 74 72 69 6e 67 20 69 6e 73 74 65 61 64 2e 0d 0a  tring instead...
14390 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
143a0 20 20 20 74 6c 6f 67 20 5b 61 70 70 65 6e 64 41     tlog [appendA
143b0 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
143c0 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47     "==== WARNING
143d0 3a 20 66 61 69 6c 65 64 20 74 6f 20 70 61 72 73  : failed to pars
143e0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 6c 61  e connection fla
143f0 67 73 2c 20 65 72 72 6f 72 3a 20 22 20 5c 0d 0a  gs, error: " \..
14400 20 20 20 20 20 20 20 20 20 20 20 20 5c 6e 5c 74              \n\t
14410 20 24 76 61 6c 75 65 20 5c 6e 5d 0d 0a 0d 0a 20   $value \n].... 
14420 20 20 20 20 20 20 20 73 65 74 20 76 61 6c 75 65         set value
14430 20 22 22 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a   ""..      }....
14440 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
14450 20 4e 4f 54 45 3a 20 49 66 20 74 68 65 20 63 6f   NOTE: If the co
14460 6d 62 69 6e 65 64 20 66 6c 61 67 73 20 73 74 72  mbined flags str
14470 69 6e 67 20 63 6f 75 6c 64 20 6e 6f 74 20 61 63  ing could not ac
14480 74 75 61 6c 6c 79 20 62 65 20 63 6f 6e 76 65 72  tually be conver
14490 74 65 64 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ted..      #    
144a0 20 20 20 74 6f 20 74 68 65 20 65 6e 75 6d 65 72     to the enumer
144b0 61 74 65 64 20 74 79 70 65 20 69 74 20 69 73 20  ated type it is 
144c0 74 68 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75  the default valu
144d0 65 2c 20 74 68 65 6e 20 6a 75 73 74 20 75 73 65  e, then just use
144e0 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
144f0 69 74 20 76 65 72 62 61 74 69 6d 3b 20 6f 74 68  it verbatim; oth
14500 65 72 77 69 73 65 2c 20 6a 75 73 74 20 72 65 74  erwise, just ret
14510 75 72 6e 20 61 6e 20 65 6d 70 74 79 20 73 74 72  urn an empty str
14520 69 6e 67 2e 20 20 49 6e 20 74 68 61 74 0d 0a 20  ing.  In that.. 
14530 20 20 20 20 20 23 20 20 20 20 20 20 20 63 61 73       #       cas
14540 65 2c 20 74 68 65 20 64 65 66 61 75 6c 74 20 63  e, the default c
14550 6f 6e 6e 65 63 74 69 6f 6e 20 66 6c 61 67 73 20  onnection flags 
14560 77 69 6c 6c 20 62 65 20 75 73 65 64 2e 0d 0a 20  will be used... 
14570 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66       #..      if
14580 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68   {[string length
14590 20 24 76 61 6c 75 65 5d 20 3d 3d 20 30 20 7c 7c   $value] == 0 ||
145a0 20 24 76 61 6c 75 65 20 6e 65 20 22 44 65 66 61   $value ne "Defa
145b0 75 6c 74 22 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ult"} then {..  
145c0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
145d0 20 23 20 57 41 52 4e 49 4e 47 3a 20 54 68 69 73   # WARNING: This
145e0 20 72 65 74 75 72 6e 73 20 74 68 65 20 73 74 72   returns the str
145f0 69 6e 67 20 76 61 6c 75 65 20 6f 66 20 74 68 65  ing value of the
14600 20 63 6f 6d 62 69 6e 65 64 20 66 6c 61 67 73 2c   combined flags,
14610 20 6e 6f 74 0d 0a 20 20 20 20 20 20 20 20 23 20   not..        # 
14620 20 20 20 20 20 20 20 20 20 74 68 65 20 65 6e 75           the enu
14630 6d 65 72 61 74 65 64 20 76 61 6c 75 65 2e 20 20  merated value.  
14640 54 68 69 73 20 69 73 20 62 79 20 64 65 73 69 67  This is by desig
14650 6e 20 61 6e 64 20 73 68 6f 75 6c 64 20 6e 6f 74  n and should not
14660 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
14670 20 20 20 20 20 62 65 20 63 68 61 6e 67 65 64 20       be changed 
14680 77 69 74 68 6f 75 74 20 63 61 72 65 66 75 6c 20  without careful 
14690 63 6f 6e 73 69 64 65 72 61 74 69 6f 6e 20 28 65  consideration (e
146a0 2e 67 2e 20 69 74 20 77 6f 75 6c 64 0d 0a 20 20  .g. it would..  
146b0 20 20 20 20 20 20 23 20 20 20 20 20 20 20 20 20        #         
146c0 20 70 72 65 76 65 6e 74 20 74 68 65 20 53 51 4c   prevent the SQL
146d0 69 74 65 43 6f 6e 6e 65 63 74 69 6f 6e 20 63 6c  iteConnection cl
146e0 61 73 73 20 66 72 6f 6d 20 61 6c 6c 6f 77 69 6e  ass from allowin
146f0 67 20 69 6e 76 61 6c 69 64 0d 0a 20 20 20 20 20  g invalid..     
14700 20 20 20 23 20 20 20 20 20 20 20 20 20 20 5b 22     #          ["
14710 6d 61 67 69 63 61 6c 22 5d 20 6d 65 74 61 2d 66  magical"] meta-f
14720 6c 61 67 73 29 2e 0d 0a 20 20 20 20 20 20 20 20  lags)...        
14730 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  #..        retur
14740 6e 20 5b 61 70 70 65 6e 64 41 72 67 73 20 22 46  n [appendArgs "F
14750 6c 61 67 73 3d 22 20 24 66 6c 61 67 73 20 5c 3b  lags=" $flags \;
14760 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  ]..      }....  
14770 20 20 20 20 72 65 74 75 72 6e 20 22 22 0d 0a 20      return "".. 
14780 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
14790 63 20 65 6e 61 62 6c 65 53 68 61 72 65 64 43 61  c enableSharedCa
147a0 63 68 65 20 7b 20 63 68 61 6e 6e 65 6c 20 65 6e  che { channel en
147b0 61 62 6c 65 20 7b 71 75 69 65 74 20 66 61 6c 73  able {quiet fals
147c0 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 69 66  e} } {..      if
147d0 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20   {[catch {..    
147e0 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b      object invok
147f0 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62  e -flags +NonPub
14800 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  lic \..         
14810 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53     System.Data.S
14820 51 4c 69 74 65 2e 55 6e 73 61 66 65 4e 61 74 69  QLite.UnsafeNati
14830 76 65 4d 65 74 68 6f 64 73 20 5c 0d 0a 20 20 20  veMethods \..   
14840 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
14850 5f 65 6e 61 62 6c 65 5f 73 68 61 72 65 64 5f 63  _enable_shared_c
14860 61 63 68 65 20 5b 65 78 70 72 20 69 6e 74 28 24  ache [expr int($
14870 65 6e 61 62 6c 65 29 5d 0d 0a 20 20 20 20 20 20  enable)]..      
14880 7d 20 72 65 73 75 6c 74 5d 20 3d 3d 20 30 7d 20  } result] == 0} 
14890 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
148a0 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65  if {!$quiet} the
148b0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74  n {..          t
148c0 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61  puts $channel [a
148d0 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
148e0 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
148f0 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 5f 65 6e   call sqlite3_en
14900 61 62 6c 65 5f 73 68 61 72 65 64 5f 63 61 63 68  able_shared_cach
14910 65 28 22 20 24 65 6e 61 62 6c 65 20 5c 0d 0a 20  e(" $enable \.. 
14920 20 20 20 20 20 20 20 20 20 20 20 20 20 22 29 2e               ").
14930 2e 2e 20 6f 6b 3a 20 22 20 24 72 65 73 75 6c 74  .. ok: " $result
14940 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d   \n]..        }.
14950 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d  .      } else {.
14960 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71  .        if {!$q
14970 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  uiet} then {..  
14980 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
14990 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
149a0 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
149b0 20 20 20 20 22 2d 2d 2d 2d 20 63 61 6c 6c 20 73      "---- call s
149c0 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 73 68  qlite3_enable_sh
149d0 61 72 65 64 5f 63 61 63 68 65 28 22 20 24 65 6e  ared_cache(" $en
149e0 61 62 6c 65 20 5c 0d 0a 20 20 20 20 20 20 20 20  able \..        
149f0 20 20 20 20 20 20 22 29 2e 2e 2e 20 65 72 72 6f        ")... erro
14a00 72 3a 20 22 20 5c 6e 5c 74 20 24 72 65 73 75 6c  r: " \n\t $resul
14a10 74 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 7d  t \n]..        }
14a20 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d  ..      }..    }
14a30 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 73 65  .....    proc se
14a40 74 75 70 44 62 20 7b 0d 0a 20 20 20 20 20 20 20  tupDb {..       
14a50 20 20 20 20 20 66 69 6c 65 4e 61 6d 65 20 7b 6d       fileName {m
14a60 6f 64 65 20 22 22 7d 20 7b 64 61 74 65 54 69 6d  ode ""} {dateTim
14a70 65 46 6f 72 6d 61 74 20 22 22 7d 20 7b 64 61 74  eFormat ""} {dat
14a80 65 54 69 6d 65 4b 69 6e 64 20 22 22 7d 20 7b 66  eTimeKind ""} {f
14a90 6c 61 67 73 20 22 22 7d 0d 0a 20 20 20 20 20 20  lags ""}..      
14aa0 20 20 20 20 20 20 7b 65 78 74 72 61 20 22 22 7d        {extra ""}
14ab0 20 7b 71 75 61 6c 69 66 79 20 74 72 75 65 7d 20   {qualify true} 
14ac0 7b 64 65 6c 65 74 65 20 74 72 75 65 7d 20 7b 75  {delete true} {u
14ad0 72 69 20 66 61 6c 73 65 7d 0d 0a 20 20 20 20 20  ri false}..     
14ae0 20 20 20 20 20 20 20 7b 74 65 6d 70 6f 72 61 72         {temporar
14af0 79 20 74 72 75 65 7d 20 7b 76 61 72 4e 61 6d 65  y true} {varName
14b00 20 64 62 7d 20 7b 71 75 69 65 74 20 66 61 6c 73   db} {quiet fals
14b10 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d  e} } {..      #.
14b20 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 46  .      # NOTE: F
14b30 69 72 73 74 2c 20 73 65 65 20 69 66 20 6f 75 72  irst, see if our
14b40 20 63 61 6c 6c 65 72 20 68 61 73 20 72 65 71 75   caller has requ
14b50 65 73 74 65 64 20 61 6e 20 69 6e 2d 6d 65 6d 6f  ested an in-memo
14b60 72 79 20 64 61 74 61 62 61 73 65 2e 0d 0a 20 20  ry database...  
14b70 20 20 20 20 23 0d 0a 20 20 20 20 20 20 73 65 74      #..      set
14b80 20 69 73 4d 65 6d 6f 72 79 20 5b 69 73 4d 65 6d   isMemory [isMem
14b90 6f 72 79 44 62 20 24 66 69 6c 65 4e 61 6d 65 5d  oryDb $fileName]
14ba0 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  ....      #..   
14bb0 20 20 20 23 20 4e 4f 54 45 3a 20 46 6f 72 20 6e     # NOTE: For n
14bc0 6f 77 2c 20 61 6c 6c 20 74 65 73 74 20 64 61 74  ow, all test dat
14bd0 61 62 61 73 65 73 20 75 73 65 64 20 62 79 20 74  abases used by t
14be0 68 65 20 74 65 73 74 20 73 75 69 74 65 20 61 72  he test suite ar
14bf0 65 20 70 6c 61 63 65 64 0d 0a 20 20 20 20 20 20  e placed..      
14c00 23 20 20 20 20 20 20 20 69 6e 74 6f 20 74 68 65  #       into the
14c10 20 64 61 74 61 62 61 73 65 20 64 69 72 65 63 74   database direct
14c20 6f 72 79 2e 20 20 45 61 63 68 20 64 61 74 61 62  ory.  Each datab
14c30 61 73 65 20 61 6e 64 20 72 65 6c 61 74 65 64 20  ase and related 
14c40 66 69 6c 65 73 0d 0a 20 20 20 20 20 20 23 20 20  files..      #  
14c50 20 20 20 20 20 75 73 65 64 20 62 79 20 61 20 74       used by a t
14c60 65 73 74 20 73 68 6f 75 6c 64 20 62 65 20 63 6c  est should be cl
14c70 65 61 6e 65 64 20 75 70 20 62 79 20 74 68 61 74  eaned up by that
14c80 20 74 65 73 74 20 75 73 69 6e 67 20 74 68 65 0d   test using the.
14c90 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 22  .      #       "
14ca0 63 6c 65 61 6e 75 70 44 62 22 20 70 72 6f 63 65  cleanupDb" proce
14cb0 64 75 72 65 2c 20 62 65 6c 6f 77 2e 0d 0a 20 20  dure, below...  
14cc0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20      #..      if 
14cd0 7b 21 24 69 73 4d 65 6d 6f 72 79 20 26 26 20 24  {!$isMemory && $
14ce0 71 75 61 6c 69 66 79 7d 20 74 68 65 6e 20 7b 0d  qualify} then {.
14cf0 0a 20 20 20 20 20 20 20 20 73 65 74 20 66 69 6c  .        set fil
14d00 65 4e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e  eName [file join
14d10 20 5b 67 65 74 44 61 74 61 62 61 73 65 44 69 72   [getDatabaseDir
14d20 65 63 74 6f 72 79 5d 20 5b 66 69 6c 65 20 74 61  ectory] [file ta
14d30 69 6c 20 24 66 69 6c 65 4e 61 6d 65 5d 5d 0d 0a  il $fileName]]..
14d40 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
14d50 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
14d60 3a 20 42 79 20 64 65 66 61 75 6c 74 2c 20 64 65  : By default, de
14d70 6c 65 74 65 20 61 6e 79 20 70 72 65 2d 65 78 69  lete any pre-exi
14d80 73 74 69 6e 67 20 64 61 74 61 62 61 73 65 20 77  sting database w
14d90 69 74 68 20 74 68 65 20 73 61 6d 65 20 66 69 6c  ith the same fil
14da0 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  e..      #      
14db0 20 6e 61 6d 65 20 69 66 20 69 74 20 63 75 72 72   name if it curr
14dc0 65 6e 74 6c 79 20 65 78 69 73 74 73 2e 0d 0a 20  ently exists... 
14dd0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66       #..      if
14de0 20 7b 21 24 69 73 4d 65 6d 6f 72 79 20 26 26 20   {!$isMemory && 
14df0 24 64 65 6c 65 74 65 20 26 26 20 5b 66 69 6c 65  $delete && [file
14e00 20 65 78 69 73 74 73 20 24 66 69 6c 65 4e 61 6d   exists $fileNam
14e10 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  e]} then {..    
14e20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
14e30 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74 20 74   NOTE: Attempt t
14e40 6f 20 64 65 6c 65 74 65 20 61 6e 79 20 70 72 65  o delete any pre
14e50 2d 65 78 69 73 74 69 6e 67 20 64 61 74 61 62 61  -existing databa
14e60 73 65 20 77 69 74 68 20 74 68 65 20 73 61 6d 65  se with the same
14e70 20 66 69 6c 65 0d 0a 20 20 20 20 20 20 20 20 23   file..        #
14e80 20 20 20 20 20 20 20 6e 61 6d 65 2e 0d 0a 20 20         name...  
14e90 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
14ea0 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 66 69 6c   if {[catch {fil
14eb0 65 20 64 65 6c 65 74 65 20 24 66 69 6c 65 4e 61  e delete $fileNa
14ec0 6d 65 7d 20 65 72 72 6f 72 5d 7d 20 74 68 65 6e  me} error]} then
14ed0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d   {..          #.
14ee0 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54  .          # NOT
14ef0 45 3a 20 57 65 20 73 6f 6d 65 68 6f 77 20 66 61  E: We somehow fa
14f00 69 6c 65 64 20 74 6f 20 64 65 6c 65 74 65 20 74  iled to delete t
14f10 68 65 20 66 69 6c 65 2c 20 72 65 70 6f 72 74 20  he file, report 
14f20 77 68 79 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  why...          
14f30 23 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20  #..          if 
14f40 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b  {!$quiet} then {
14f50 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70  ..            tp
14f60 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  uts $::test_chan
14f70 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
14f80 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
14f90 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47     "==== WARNING
14fa0 3a 20 66 61 69 6c 65 64 20 74 6f 20 64 65 6c 65  : failed to dele
14fb0 74 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  te database file
14fc0 20 5c 22 22 20 24 66 69 6c 65 4e 61 6d 65 20 5c   \"" $fileName \
14fd0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
14fe0 20 20 22 5c 22 20 64 75 72 69 6e 67 20 73 65 74    "\" during set
14ff0 75 70 2c 20 65 72 72 6f 72 3a 20 22 20 5c 6e 5c  up, error: " \n\
15000 74 20 24 65 72 72 6f 72 20 5c 6e 5d 0d 0a 20 20  t $error \n]..  
15010 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
15020 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d     }..      }...
15030 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
15040 23 20 4e 4f 54 45 3a 20 52 65 66 65 72 20 74 6f  # NOTE: Refer to
15050 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 76   the specified v
15060 61 72 69 61 62 6c 65 20 28 65 2e 67 2e 20 22 64  ariable (e.g. "d
15070 62 22 29 20 69 6e 20 74 68 65 20 63 6f 6e 74 65  b") in the conte
15080 78 74 20 6f 66 20 6f 75 72 0d 0a 20 20 20 20 20  xt of our..     
15090 20 23 20 20 20 20 20 20 20 63 61 6c 6c 65 72 2e   #       caller.
150a0 20 20 54 68 65 20 68 61 6e 64 6c 65 20 74 6f 20    The handle to 
150b0 74 68 65 20 6f 70 65 6e 65 64 20 64 61 74 61 62  the opened datab
150c0 61 73 65 20 77 69 6c 6c 20 62 65 20 73 74 6f 72  ase will be stor
150d0 65 64 20 74 68 65 72 65 2e 0d 0a 20 20 20 20 20  ed there...     
150e0 20 23 0d 0a 20 20 20 20 20 20 75 70 76 61 72 20   #..      upvar 
150f0 31 20 24 76 61 72 4e 61 6d 65 20 64 62 0d 0a 0d  1 $varName db...
15100 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
15110 23 20 4e 4f 54 45 3a 20 53 74 61 72 74 20 62 75  # NOTE: Start bu
15120 69 6c 64 69 6e 67 20 74 68 65 20 63 6f 6e 6e 65  ilding the conne
15130 63 74 69 6f 6e 20 73 74 72 69 6e 67 2e 20 20 54  ction string.  T
15140 68 65 20 6f 6e 6c 79 20 72 65 71 75 69 72 65 64  he only required
15150 20 70 6f 72 74 69 6f 6e 0d 0a 20 20 20 20 20 20   portion..      
15160 23 20 20 20 20 20 20 20 6f 66 20 74 68 65 20 63  #       of the c
15170 6f 6e 6e 65 63 74 69 6f 6e 20 73 74 72 69 6e 67  onnection string
15180 20 69 73 20 74 68 65 20 64 61 74 61 20 73 6f 75   is the data sou
15190 72 63 65 2c 20 77 68 69 63 68 20 63 6f 6e 74 61  rce, which conta
151a0 69 6e 73 20 74 68 65 0d 0a 20 20 20 20 20 20 23  ins the..      #
151b0 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65 20         database 
151c0 66 69 6c 65 20 6e 61 6d 65 20 69 74 73 65 6c 66  file name itself
151d0 2e 20 20 49 66 20 6f 75 72 20 63 61 6c 6c 65 72  .  If our caller
151e0 20 77 61 6e 74 73 20 74 6f 20 75 73 65 20 61 20   wants to use a 
151f0 55 52 49 20 61 73 0d 0a 20 20 20 20 20 20 23 20  URI as..      # 
15200 20 20 20 20 20 20 74 68 65 20 64 61 74 61 20 73        the data s
15210 6f 75 72 63 65 2c 20 75 73 65 20 74 68 65 20 46  ource, use the F
15220 75 6c 6c 55 72 69 20 63 6f 6e 6e 65 63 74 69 6f  ullUri connectio
15230 6e 20 73 74 72 69 6e 67 20 70 72 6f 70 65 72 74  n string propert
15240 79 20 74 6f 0d 0a 20 20 20 20 20 20 23 20 20 20  y to..      #   
15250 20 20 20 20 70 72 65 76 65 6e 74 20 74 68 65 20      prevent the 
15260 64 61 74 61 20 73 6f 75 72 63 65 20 73 74 72 69  data source stri
15270 6e 67 20 66 72 6f 6d 20 62 65 69 6e 67 20 6d 61  ng from being ma
15280 6e 67 6c 65 64 2e 0d 0a 20 20 20 20 20 20 23 0d  ngled...      #.
15290 0a 20 20 20 20 20 20 69 66 20 7b 24 75 72 69 7d  .      if {$uri}
152a0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
152b0 20 73 65 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   set connection 
152c0 7b 46 75 6c 6c 55 72 69 3d 24 7b 66 69 6c 65 4e  {FullUri=${fileN
152d0 61 6d 65 7d 7d 0d 0a 20 20 20 20 20 20 7d 20 65  ame}}..      } e
152e0 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 73  lse {..        s
152f0 65 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 7b 44  et connection {D
15300 61 74 61 20 53 6f 75 72 63 65 3d 24 7b 66 69 6c  ata Source=${fil
15310 65 4e 61 6d 65 7d 7d 0d 0a 20 20 20 20 20 20 7d  eName}}..      }
15320 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  ....      #..   
15330 20 20 20 23 20 4e 4f 54 45 3a 20 53 69 6e 63 65     # NOTE: Since
15340 20 74 68 69 73 20 70 72 6f 63 65 64 75 72 65 20   this procedure 
15350 68 61 73 20 6e 6f 20 73 70 65 63 69 61 6c 20 6b  has no special k
15360 6e 6f 77 6c 65 64 67 65 20 6f 66 20 77 68 61 74  nowledge of what
15370 20 74 68 65 20 64 65 66 61 75 6c 74 0d 0a 20 20   the default..  
15380 20 20 20 20 23 20 20 20 20 20 20 20 73 65 74 74      #       sett
15390 69 6e 67 20 69 73 20 66 6f 72 20 74 68 65 20 54  ing is for the T
153a0 6f 46 75 6c 6c 50 61 74 68 20 63 6f 6e 6e 65 63  oFullPath connec
153b0 74 69 6f 6e 20 73 74 72 69 6e 67 20 70 72 6f 70  tion string prop
153c0 65 72 79 2c 20 61 6c 77 61 79 73 0d 0a 20 20 20  ery, always..   
153d0 20 20 20 23 20 20 20 20 20 20 20 61 64 64 20 74     #       add t
153e0 68 65 20 76 61 6c 75 65 20 77 65 20 6b 6e 6f 77  he value we know
153f0 20 61 62 6f 75 74 20 74 6f 20 74 68 65 20 63 6f   about to the co
15400 6e 6e 65 63 74 69 6f 6e 20 73 74 72 69 6e 67 2e  nnection string.
15410 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
15420 20 61 70 70 65 6e 64 20 63 6f 6e 6e 65 63 74 69   append connecti
15430 6f 6e 20 7b 3b 54 6f 46 75 6c 6c 50 61 74 68 3d  on {;ToFullPath=
15440 24 7b 71 75 61 6c 69 66 79 7d 7d 0d 0a 0d 0a 20  ${qualify}}.... 
15450 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
15460 4e 4f 54 45 3a 20 49 66 20 6f 75 72 20 63 61 6c  NOTE: If our cal
15470 6c 65 72 20 73 70 65 63 69 66 69 65 64 20 61 20  ler specified a 
15480 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 2c 20 61 64  journal mode, ad
15490 64 20 74 68 65 20 6e 65 63 65 73 73 61 72 79 20  d the necessary 
154a0 70 6f 72 74 69 6f 6e 0d 0a 20 20 20 20 20 20 23  portion..      #
154b0 20 20 20 20 20 20 20 6f 66 20 74 68 65 20 63 6f         of the co
154c0 6e 6e 65 63 74 69 6f 6e 20 73 74 72 69 6e 67 20  nnection string 
154d0 6e 6f 77 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  now...      #.. 
154e0 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67       if {[string
154f0 20 6c 65 6e 67 74 68 20 24 6d 6f 64 65 5d 20 3e   length $mode] >
15500 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
15510 20 20 20 20 61 70 70 65 6e 64 20 63 6f 6e 6e 65      append conne
15520 63 74 69 6f 6e 20 7b 3b 4a 6f 75 72 6e 61 6c 20  ction {;Journal 
15530 4d 6f 64 65 3d 24 7b 6d 6f 64 65 7d 7d 0d 0a 20  Mode=${mode}}.. 
15540 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
15550 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
15560 20 49 66 20 6f 75 72 20 63 61 6c 6c 65 72 20 73   If our caller s
15570 70 65 63 69 66 69 65 64 20 61 20 44 61 74 65 54  pecified a DateT
15580 69 6d 65 20 66 6f 72 6d 61 74 2c 20 61 64 64 20  ime format, add 
15590 74 68 65 20 6e 65 63 65 73 73 61 72 79 0d 0a 20  the necessary.. 
155a0 20 20 20 20 20 23 20 20 20 20 20 20 20 70 6f 72       #       por
155b0 74 69 6f 6e 20 6f 66 20 74 68 65 20 63 6f 6e 6e  tion of the conn
155c0 65 63 74 69 6f 6e 20 73 74 72 69 6e 67 20 6e 6f  ection string no
155d0 77 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  w...      #..   
155e0 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c     if {[string l
155f0 65 6e 67 74 68 20 24 64 61 74 65 54 69 6d 65 46  ength $dateTimeF
15600 6f 72 6d 61 74 5d 20 3e 20 30 7d 20 74 68 65 6e  ormat] > 0} then
15610 20 7b 0d 0a 20 20 20 20 20 20 20 20 61 70 70 65   {..        appe
15620 6e 64 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 7b 3b  nd connection {;
15630 44 61 74 65 54 69 6d 65 46 6f 72 6d 61 74 3d 24  DateTimeFormat=$
15640 7b 64 61 74 65 54 69 6d 65 46 6f 72 6d 61 74 7d  {dateTimeFormat}
15650 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  }..      }....  
15660 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
15670 4f 54 45 3a 20 49 66 20 6f 75 72 20 63 61 6c 6c  OTE: If our call
15680 65 72 20 73 70 65 63 69 66 69 65 64 20 61 20 44  er specified a D
15690 61 74 65 54 69 6d 65 4b 69 6e 64 2c 20 61 64 64  ateTimeKind, add
156a0 20 74 68 65 20 6e 65 63 65 73 73 61 72 79 20 70   the necessary p
156b0 6f 72 74 69 6f 6e 0d 0a 20 20 20 20 20 20 23 20  ortion..      # 
156c0 20 20 20 20 20 20 6f 66 20 74 68 65 20 63 6f 6e        of the con
156d0 6e 65 63 74 69 6f 6e 20 73 74 72 69 6e 67 20 6e  nection string n
156e0 6f 77 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  ow...      #..  
156f0 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20      if {[string 
15700 6c 65 6e 67 74 68 20 24 64 61 74 65 54 69 6d 65  length $dateTime
15710 4b 69 6e 64 5d 20 3e 20 30 7d 20 74 68 65 6e 20  Kind] > 0} then 
15720 7b 0d 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e  {..        appen
15730 64 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 7b 3b 44  d connection {;D
15740 61 74 65 54 69 6d 65 4b 69 6e 64 3d 24 7b 64 61  ateTimeKind=${da
15750 74 65 54 69 6d 65 4b 69 6e 64 7d 7d 0d 0a 20 20  teTimeKind}}..  
15760 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23      }....      #
15770 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
15780 46 69 67 75 72 65 20 6f 75 74 20 77 68 61 74 20  Figure out what 
15790 74 68 65 20 66 69 6e 61 6c 20 66 6c 61 67 73 20  the final flags 
157a0 66 6f 72 20 74 68 69 73 20 63 6f 6e 6e 65 63 74  for this connect
157b0 69 6f 6e 20 6e 65 65 64 20 74 6f 20 62 65 2e 0d  ion need to be..
157c0 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
157d0 73 65 74 20 66 6c 61 67 73 20 5b 67 65 74 43 6f  set flags [getCo
157e0 6e 6e 65 63 74 69 6f 6e 46 6c 61 67 73 20 24 66  nnectionFlags $f
157f0 69 6c 65 4e 61 6d 65 20 24 66 6c 61 67 73 20 24  ileName $flags $
15800 71 75 69 65 74 5d 0d 0a 0d 0a 20 20 20 20 20 20  quiet]....      
15810 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
15820 20 49 66 20 6f 75 72 20 63 61 6c 6c 65 72 20 73   If our caller s
15830 70 65 63 69 66 69 65 64 20 73 6f 6d 65 20 53 51  pecified some SQ
15840 4c 69 74 65 43 6f 6e 6e 65 63 74 69 6f 6e 46 6c  LiteConnectionFl
15850 61 67 73 2c 20 61 64 64 20 74 68 65 0d 0a 20 20  ags, add the..  
15860 20 20 20 20 23 20 20 20 20 20 20 20 6e 65 63 65      #       nece
15870 73 73 61 72 79 20 70 6f 72 74 69 6f 6e 20 6f 66  ssary portion of
15880 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
15890 73 74 72 69 6e 67 20 6e 6f 77 2e 0d 0a 20 20 20  string now...   
158a0 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
158b0 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
158c0 66 6c 61 67 73 5d 20 3e 20 30 7d 20 74 68 65 6e  flags] > 0} then
158d0 20 7b 0d 0a 20 20 20 20 20 20 20 20 61 70 70 65   {..        appe
158e0 6e 64 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 7b 3b  nd connection {;
158f0 46 6c 61 67 73 3d 24 7b 66 6c 61 67 73 7d 7d 0d  Flags=${flags}}.
15900 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
15910 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
15920 45 3a 20 49 66 20 6f 75 72 20 63 61 6c 6c 65 72  E: If our caller
15930 20 73 70 65 63 69 66 69 65 64 20 61 6e 20 65 78   specified an ex
15940 74 72 61 20 70 61 79 6c 6f 61 64 20 74 6f 20 74  tra payload to t
15950 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0d 0a 20  he connection.. 
15960 20 20 20 20 20 23 20 20 20 20 20 20 20 73 74 72       #       str
15970 69 6e 67 2c 20 61 70 70 65 6e 64 20 69 74 20 6e  ing, append it n
15980 6f 77 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  ow...      #..  
15990 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20      if {[string 
159a0 6c 65 6e 67 74 68 20 24 65 78 74 72 61 5d 20 3e  length $extra] >
159b0 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
159c0 20 20 20 20 61 70 70 65 6e 64 20 63 6f 6e 6e 65      append conne
159d0 63 74 69 6f 6e 20 5c 3b 20 24 65 78 74 72 61 0d  ction \; $extra.
159e0 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
159f0 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
15a00 45 3a 20 4f 70 65 6e 20 74 68 65 20 64 61 74 61  E: Open the data
15a10 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
15a20 6e 6f 77 2c 20 70 6c 61 63 69 6e 67 20 74 68 65  now, placing the
15a30 20 6f 70 61 71 75 65 20 68 61 6e 64 6c 65 20 76   opaque handle v
15a40 61 6c 75 65 0d 0a 20 20 20 20 20 20 23 20 20 20  alue..      #   
15a50 20 20 20 20 69 6e 74 6f 20 74 68 65 20 76 61 72      into the var
15a60 69 61 62 6c 65 20 73 70 65 63 69 66 69 65 64 20  iable specified 
15a70 62 79 20 6f 75 72 20 63 61 6c 6c 65 72 2e 0d 0a  by our caller...
15a80 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 73        #..      s
15a90 65 74 20 64 62 20 5b 73 71 6c 20 6f 70 65 6e 20  et db [sql open 
15aa0 2d 74 79 70 65 20 53 51 4c 69 74 65 20 5b 73 75  -type SQLite [su
15ab0 62 73 74 20 24 63 6f 6e 6e 65 63 74 69 6f 6e 5d  bst $connection]
15ac0 5d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  ]....      #..  
15ad0 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 6f 6e 66      # NOTE: Conf
15ae0 69 67 75 72 65 20 74 68 65 20 74 65 6d 70 6f 72  igure the tempor
15af0 61 72 79 20 64 69 72 65 63 74 6f 72 79 20 66 6f  ary directory fo
15b00 72 20 74 68 65 20 6e 65 77 6c 79 20 6f 70 65 6e  r the newly open
15b10 65 64 20 64 61 74 61 62 61 73 65 0d 0a 20 20 20  ed database..   
15b20 20 20 20 23 20 20 20 20 20 20 20 63 6f 6e 6e 65     #       conne
15b30 63 74 69 6f 6e 20 6e 6f 77 20 75 6e 6c 65 73 73  ction now unless
15b40 20 6f 75 72 20 63 61 6c 6c 65 72 20 66 6f 72 62   our caller forb
15b50 69 64 73 20 69 74 2e 0d 0a 20 20 20 20 20 20 23  ids it...      #
15b60 0d 0a 20 20 20 20 20 20 69 66 20 7b 24 74 65 6d  ..      if {$tem
15b70 70 6f 72 61 72 79 20 26 26 20 21 5b 69 6e 66 6f  porary && ![info
15b80 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 73 65 74   exists ::no(set
15b90 54 65 6d 70 6f 72 61 72 79 44 69 72 65 63 74 6f  TemporaryDirecto
15ba0 72 79 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ry)]} then {..  
15bb0 20 20 20 20 20 20 73 71 6c 20 65 78 65 63 75 74        sql execut
15bc0 65 20 24 64 62 20 5b 61 70 70 65 6e 64 41 72 67  e $db [appendArg
15bd0 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
15be0 20 22 50 52 41 47 4d 41 20 74 65 6d 70 5f 73 74   "PRAGMA temp_st
15bf0 6f 72 65 5f 64 69 72 65 63 74 6f 72 79 20 3d 20  ore_directory = 
15c00 5c 22 22 20 5b 67 65 74 54 65 6d 70 6f 72 61 72  \"" [getTemporar
15c10 79 44 69 72 65 63 74 6f 72 79 5d 20 5c 22 5c 3b  yDirectory] \"\;
15c20 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  ]..      }....  
15c30 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
15c40 4f 54 45 3a 20 50 65 72 66 6f 72 6d 20 61 6e 79  OTE: Perform any
15c50 20 65 78 74 72 61 20 70 65 72 2d 63 6f 6e 6e 65   extra per-conne
15c60 63 74 69 6f 6e 20 73 65 74 75 70 20 66 6f 72 20  ction setup for 
15c70 74 68 65 20 6e 65 77 6c 79 20 6f 70 65 6e 65 64  the newly opened
15c80 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
15c90 64 61 74 61 62 61 73 65 20 6e 6f 77 20 75 6e 6c  database now unl
15ca0 65 73 73 20 6f 75 72 20 63 61 6c 6c 65 72 20 66  ess our caller f
15cb0 6f 72 62 69 64 73 20 69 74 2e 0d 0a 20 20 20 20  orbids it...    
15cc0 20 20 23 0d 0a 20 20 20 20 20 20 73 65 74 20 65    #..      set e
15cd0 78 65 63 75 74 65 4f 6e 53 65 74 75 70 20 5b 67  xecuteOnSetup [g
15ce0 65 74 45 78 65 63 75 74 65 4f 6e 53 65 74 75 70  etExecuteOnSetup
15cf0 5d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b  ]....      if {[
15d00 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 65  string length $e
15d10 78 65 63 75 74 65 4f 6e 53 65 74 75 70 5d 20 3e  xecuteOnSetup] >
15d20 20 30 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20   0 && \..       
15d30 20 20 20 21 5b 69 6e 66 6f 20 65 78 69 73 74 73     ![info exists
15d40 20 3a 3a 6e 6f 28 65 78 65 63 75 74 65 4f 6e 53   ::no(executeOnS
15d50 65 74 75 70 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a  etup)]} then {..
15d60 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
15d70 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 69 73 20     # NOTE: This 
15d80 63 6f 6d 6d 61 6e 64 20 6d 61 79 20 72 61 69 73  command may rais
15d90 65 20 61 6e 20 65 72 72 6f 72 3b 20 69 66 20 73  e an error; if s
15da0 6f 2c 20 74 68 61 74 20 69 73 20 66 69 6e 65 2c  o, that is fine,
15db0 20 61 73 0d 0a 20 20 20 20 20 20 20 20 23 20 20   as..        #  
15dc0 20 20 20 20 20 74 68 65 20 65 6e 63 6c 6f 73 69       the enclosi
15dd0 6e 67 20 74 65 73 74 20 77 69 6c 6c 20 74 68 65  ng test will the
15de0 6e 20 66 61 69 6c 2e 20 20 54 68 65 20 5b 73 75  n fail.  The [su
15df0 62 73 74 5d 20 63 6f 6d 6d 61 6e 64 20 69 73 0d  bst] command is.
15e00 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
15e10 20 75 73 65 64 20 6f 6e 20 74 68 65 20 53 51 4c   used on the SQL
15e20 20 69 6e 20 63 61 73 65 20 69 74 20 6e 65 65 64   in case it need
15e30 73 20 74 6f 20 72 65 66 65 72 20 74 6f 20 73 74  s to refer to st
15e40 61 74 65 20 69 6e 20 6f 75 72 0d 0a 20 20 20 20  ate in our..    
15e50 20 20 20 20 23 20 20 20 20 20 20 20 63 6f 6e 74      #       cont
15e60 65 78 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  ext...        #.
15e70 0a 20 20 20 20 20 20 20 20 73 71 6c 20 65 78 65  .        sql exe
15e80 63 75 74 65 20 24 64 62 20 5b 73 75 62 73 74 20  cute $db [subst 
15e90 24 65 78 65 63 75 74 65 4f 6e 53 65 74 75 70 5d  $executeOnSetup]
15ea0 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
15eb0 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
15ec0 54 45 3a 20 41 6c 77 61 79 73 20 72 65 74 75 72  TE: Always retur
15ed0 6e 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  n the connection
15ee0 20 68 61 6e 64 6c 65 20 75 70 6f 6e 20 73 75 63   handle upon suc
15ef0 63 65 73 73 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  cess...      #..
15f00 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 64 62        return $db
15f10 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
15f20 70 72 6f 63 20 67 65 74 44 62 43 6f 6e 6e 65 63  proc getDbConnec
15f30 74 69 6f 6e 20 7b 20 7b 76 61 72 4e 61 6d 65 20  tion { {varName 
15f40 64 62 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23  db} } {..      #
15f50 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
15f60 52 65 66 65 72 20 74 6f 20 74 68 65 20 73 70 65  Refer to the spe
15f70 63 69 66 69 65 64 20 76 61 72 69 61 62 6c 65 20  cified variable 
15f80 28 65 2e 67 2e 20 22 64 62 22 29 20 69 6e 20 74  (e.g. "db") in t
15f90 68 65 20 63 6f 6e 74 65 78 74 20 6f 66 20 6f 75  he context of ou
15fa0 72 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  r..      #      
15fb0 20 63 61 6c 6c 65 72 2e 20 20 54 68 65 20 68 61   caller.  The ha
15fc0 6e 64 6c 65 20 74 6f 20 74 68 65 20 64 61 74 61  ndle to the data
15fd0 62 61 73 65 20 70 72 65 76 69 6f 75 73 6c 79 20  base previously 
15fe0 6f 70 65 6e 65 64 20 76 69 61 20 74 68 65 0d 0a  opened via the..
15ff0 20 20 20 20 20 20 23 20 20 20 20 20 20 20 5b 73        #       [s
16000 65 74 75 70 44 62 5d 20 70 72 6f 63 65 64 75 72  etupDb] procedur
16010 65 20 73 68 6f 75 6c 64 20 62 65 20 73 74 6f 72  e should be stor
16020 65 64 20 74 68 65 72 65 2e 0d 0a 20 20 20 20 20  ed there...     
16030 20 23 0d 0a 20 20 20 20 20 20 75 70 76 61 72 20   #..      upvar 
16040 31 20 24 76 61 72 4e 61 6d 65 20 64 62 0d 0a 0d  1 $varName db...
16050 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
16060 23 20 4e 4f 54 45 3a 20 54 68 69 73 20 72 65 74  # NOTE: This ret
16070 75 72 6e 73 20 74 68 65 20 41 44 4f 2e 4e 45 54  urns the ADO.NET
16080 20 49 44 62 43 6f 6e 6e 65 63 74 69 6f 6e 20 6f   IDbConnection o
16090 62 6a 65 63 74 20 69 6e 73 74 61 6e 63 65 20 66  bject instance f
160a0 6f 72 20 74 68 65 0d 0a 20 20 20 20 20 20 23 20  or the..      # 
160b0 20 20 20 20 20 20 73 70 65 63 69 66 69 65 64 20        specified 
160c0 64 61 74 61 62 73 65 20 68 61 6e 64 6c 65 2e 20  databse handle. 
160d0 20 53 69 6e 63 65 20 67 65 74 74 69 6e 67 20 74   Since getting t
160e0 68 69 73 20 6f 62 6a 65 63 74 20 72 65 6c 69 65  his object relie
160f0 73 20 75 70 6f 6e 0d 0a 20 20 20 20 20 20 23 20  s upon..      # 
16100 20 20 20 20 20 20 45 61 67 6c 65 20 69 6e 74 65        Eagle inte
16110 72 6e 61 6c 73 2c 20 67 72 65 61 74 20 63 61 72  rnals, great car
16120 65 20 73 68 6f 75 6c 64 20 62 65 20 74 61 6b 65  e should be take
16130 6e 20 74 6f 20 61 76 6f 69 64 20 64 69 73 70 6f  n to avoid dispo
16140 73 69 6e 67 20 6f 66 0d 0a 20 20 20 20 20 20 23  sing of..      #
16150 20 20 20 20 20 20 20 74 68 69 73 20 6f 62 6a 65         this obje
16160 63 74 20 6f 72 20 6f 74 68 65 72 77 69 73 65 20  ct or otherwise 
16170 70 75 74 74 69 6e 67 20 69 74 20 69 6e 74 6f 20  putting it into 
16180 61 6e 20 69 6e 76 61 6c 69 64 20 73 74 61 74 65  an invalid state
16190 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
161a0 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73    if {[info exis
161b0 74 73 20 64 62 5d 7d 20 74 68 65 6e 20 7b 0d 0a  ts db]} then {..
161c0 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74          if {[cat
161d0 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  ch {..          
161e0 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66  object invoke -f
161f0 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20  lags +NonPublic 
16200 2d 6f 62 6a 65 63 74 66 6c 61 67 73 20 2b 4e 6f  -objectflags +No
16210 44 69 73 70 6f 73 65 20 2d 61 6c 69 61 73 20 5c  Dispose -alias \
16220 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
16230 49 6e 74 65 72 70 72 65 74 65 72 2e 47 65 74 41  Interpreter.GetA
16240 63 74 69 76 65 2e 63 6f 6e 6e 65 63 74 69 6f 6e  ctive.connection
16250 73 20 49 74 65 6d 20 24 64 62 0d 0a 20 20 20 20  s Item $db..    
16260 20 20 20 20 7d 20 72 65 73 75 6c 74 5d 20 3d 3d      } result] ==
16270 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
16280 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
16290 20 20 20 23 20 4e 4f 54 45 3a 20 53 75 63 63 65     # NOTE: Succe
162a0 73 73 2c 20 72 65 74 75 72 6e 20 74 68 65 20 6f  ss, return the o
162b0 70 61 71 75 65 20 6f 62 6a 65 63 74 20 68 61 6e  paque object han
162c0 64 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  dle...          
162d0 23 0d 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  #..          ret
162e0 75 72 6e 20 24 72 65 73 75 6c 74 0d 0a 20 20 20  urn $result..   
162f0 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
16300 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
16310 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 46 61        # NOTE: Fa
16320 69 6c 75 72 65 2c 20 72 65 70 6f 72 74 20 77 68  ilure, report wh
16330 79 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d  y...          #.
16340 0a 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73  .          tputs
16350 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
16360 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
16370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 3d                "=
16380 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61 69  === WARNING: fai
16390 6c 65 64 20 74 6f 20 67 65 74 20 63 6f 6e 6e 65  led to get conne
163a0 63 74 69 6f 6e 20 68 61 6e 64 6c 65 20 66 6f 72  ction handle for
163b0 20 64 61 74 61 62 61 73 65 20 5c 22 22 20 5c 0d   database \"" \.
163c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 24  .              $
163d0 64 62 20 22 5c 22 2c 20 65 72 72 6f 72 3a 20 22  db "\", error: "
163e0 20 5c 6e 5c 74 20 24 72 65 73 75 6c 74 20 5c 6e   \n\t $result \n
163f0 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  ]..        }..  
16400 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23      }....      #
16410 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
16420 46 61 69 6c 75 72 65 2c 20 72 65 74 75 72 6e 20  Failure, return 
16430 61 6e 20 6f 62 76 69 6f 75 73 6c 79 20 69 6e 76  an obviously inv
16440 61 6c 69 64 20 6f 70 61 71 75 65 20 6f 62 6a 65  alid opaque obje
16450 63 74 20 68 61 6e 64 6c 65 2e 0d 0a 20 20 20 20  ct handle...    
16460 20 20 23 0d 0a 20 20 20 20 20 20 72 65 74 75 72    #..      retur
16470 6e 20 22 22 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a  n ""..    }.....
16480 20 20 20 20 70 72 6f 63 20 66 72 65 65 44 62 43      proc freeDbC
16490 6f 6e 6e 65 63 74 69 6f 6e 20 7b 20 7b 76 61 72  onnection { {var
164a0 4e 61 6d 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 7d  Name connection}
164b0 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20   } {..      #.. 
164c0 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 52 65 66       # NOTE: Ref
164d0 65 72 20 74 6f 20 74 68 65 20 73 70 65 63 69 66  er to the specif
164e0 69 65 64 20 76 61 72 69 61 62 6c 65 20 28 65 2e  ied variable (e.
164f0 67 2e 20 22 63 6f 6e 6e 65 63 74 69 6f 6e 22 29  g. "connection")
16500 20 69 6e 20 74 68 65 0d 0a 20 20 20 20 20 20 23   in the..      #
16510 20 20 20 20 20 20 20 63 6f 6e 74 65 78 74 20 6f         context o
16520 66 20 6f 75 72 20 63 61 6c 6c 65 72 2e 20 20 54  f our caller.  T
16530 68 65 20 6f 70 61 71 75 65 20 6f 62 6a 65 63 74  he opaque object
16540 20 68 61 6e 64 6c 65 20 66 6f 72 20 61 6e 20 41   handle for an A
16550 44 4f 2e 4e 45 54 0d 0a 20 20 20 20 20 20 23 20  DO.NET..      # 
16560 20 20 20 20 20 20 63 6f 6e 6e 65 63 74 69 6f 6e        connection
16570 20 70 72 65 76 69 6f 75 73 6c 79 20 72 65 74 75   previously retu
16580 72 6e 65 64 20 62 79 20 5b 67 65 74 44 62 43 6f  rned by [getDbCo
16590 6e 6e 65 63 74 69 6f 6e 5d 20 73 68 6f 75 6c 64  nnection] should
165a0 20 62 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20   be..      #    
165b0 20 20 20 73 74 6f 72 65 64 20 74 68 65 72 65 2e     stored there.
165c0 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
165d0 20 75 70 76 61 72 20 31 20 24 76 61 72 4e 61 6d   upvar 1 $varNam
165e0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0d 0a 0d 0a  e connection....
165f0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
16600 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74 20 74   NOTE: Attempt t
16610 6f 20 72 65 6d 6f 76 65 20 74 68 65 20 6f 70 61  o remove the opa
16620 71 75 65 20 6f 62 6a 65 63 74 20 68 61 6e 64 6c  que object handl
16630 65 20 66 72 6f 6d 20 74 68 65 20 69 6e 74 65 72  e from the inter
16640 70 72 65 74 65 72 0d 0a 20 20 20 20 20 20 23 20  preter..      # 
16650 20 20 20 20 20 20 6e 6f 77 2e 20 20 54 68 69 73        now.  This
16660 20 5b 6f 62 6a 65 63 74 20 64 69 73 70 6f 73 65   [object dispose
16670 5d 20 63 61 6c 6c 20 77 69 6c 6c 20 6e 6f 74 20  ] call will not 
16680 61 63 74 75 61 6c 6c 79 20 64 69 73 70 6f 73 65  actually dispose
16690 20 6f 66 20 74 68 65 0d 0a 20 20 20 20 20 20 23   of the..      #
166a0 20 20 20 20 20 20 20 75 6e 64 65 72 6c 79 69 6e         underlyin
166b0 67 20 6f 62 6a 65 63 74 20 62 65 63 61 75 73 65  g object because
166c0 20 74 68 65 20 2b 4e 6f 44 69 73 70 6f 73 65 20   the +NoDispose 
166d0 66 6c 61 67 20 77 61 73 20 73 65 74 20 6f 6e 20  flag was set on 
166e0 69 74 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  it..      #     
166f0 20 20 64 75 72 69 6e 67 20 63 72 65 61 74 69 6f    during creatio
16700 6e 20 6f 66 20 74 68 65 20 6f 70 61 71 75 65 20  n of the opaque 
16710 6f 62 6a 65 63 74 20 68 61 6e 64 6c 65 2e 0d 0a  object handle...
16720 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69        #..      i
16730 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20  f {[info exists 
16740 63 6f 6e 6e 65 63 74 69 6f 6e 5d 20 26 26 20 5c  connection] && \
16750 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 63 61 74  ..          [cat
16760 63 68 20 7b 6f 62 6a 65 63 74 20 64 69 73 70 6f  ch {object dispo
16770 73 65 20 24 63 6f 6e 6e 65 63 74 69 6f 6e 7d 20  se $connection} 
16780 65 72 72 6f 72 5d 7d 20 74 68 65 6e 20 7b 0d 0a  error]} then {..
16790 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
167a0 20 20 20 23 20 4e 4f 54 45 3a 20 57 65 20 73 6f     # NOTE: We so
167b0 6d 65 68 6f 77 20 66 61 69 6c 65 64 20 74 6f 20  mehow failed to 
167c0 72 65 6d 6f 76 65 20 74 68 65 20 68 61 6e 64 6c  remove the handl
167d0 65 2c 20 72 65 70 6f 72 74 20 77 68 79 2e 0d 0a  e, report why...
167e0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
167f0 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
16800 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  _channel [append
16810 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
16820 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e      "==== WARNIN
16830 47 3a 20 66 61 69 6c 65 64 20 74 6f 20 72 65 6d  G: failed to rem
16840 6f 76 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68  ove connection h
16850 61 6e 64 6c 65 20 5c 22 22 20 24 63 6f 6e 6e 65  andle \"" $conne
16860 63 74 69 6f 6e 20 5c 0d 0a 20 20 20 20 20 20 20  ction \..       
16870 20 20 20 20 20 22 5c 22 2c 20 65 72 72 6f 72 3a       "\", error:
16880 20 22 20 5c 6e 5c 74 20 24 65 72 72 6f 72 20 5c   " \n\t $error \
16890 6e 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20  n]..      }..   
168a0 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
168b0 61 64 64 44 62 43 6f 6e 6e 65 63 74 69 6f 6e 20  addDbConnection 
168c0 7b 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 7b 76 61  { connection {va
168d0 72 4e 61 6d 65 20 64 62 7d 20 7d 20 7b 0d 0a 20  rName db} } {.. 
168e0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
168f0 4e 4f 54 45 3a 20 52 65 66 65 72 20 74 6f 20 74  NOTE: Refer to t
16900 68 65 20 73 70 65 63 69 66 69 65 64 20 76 61 72  he specified var
16910 69 61 62 6c 65 20 28 65 2e 67 2e 20 22 64 62 22  iable (e.g. "db"
16920 29 20 69 6e 20 74 68 65 20 63 6f 6e 74 65 78 74  ) in the context
16930 20 6f 66 20 6f 75 72 0d 0a 20 20 20 20 20 20 23   of our..      #
16940 20 20 20 20 20 20 20 63 61 6c 6c 65 72 2e 0d 0a         caller...
16950 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 75        #..      u
16960 70 76 61 72 20 31 20 24 76 61 72 4e 61 6d 65 20  pvar 1 $varName 
16970 64 62 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20  db....      #.. 
16980 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 72 65       # NOTE: Cre
16990 61 74 65 20 61 20 63 6f 72 72 65 63 74 6c 79 20  ate a correctly 
169a0 66 6f 72 6d 61 74 74 65 64 20 6e 61 6d 65 20 66  formatted name f
169b0 6f 72 20 74 68 65 20 64 61 74 61 62 61 73 65 20  or the database 
169c0 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 0d 0a 20  connection to.. 
169d0 20 20 20 20 20 23 20 20 20 20 20 20 20 62 65 20       #       be 
169e0 61 64 64 65 64 20 74 6f 20 74 68 65 20 6c 69 73  added to the lis
169f0 74 20 6d 61 6e 61 67 65 64 20 62 79 20 74 68 65  t managed by the
16a00 20 45 61 67 6c 65 20 69 6e 74 65 72 70 72 65 74   Eagle interpret
16a10 65 72 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  er...      #..  
16a20 20 20 20 20 73 65 74 20 64 62 20 5b 6f 62 6a 65      set db [obje
16a30 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73  ct invoke -flags
16a40 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20   +NonPublic \.. 
16a50 20 20 20 20 20 20 20 20 20 45 61 67 6c 65 2e 5f           Eagle._
16a60 43 6f 6d 70 6f 6e 65 6e 74 73 2e 50 72 69 76 61  Components.Priva
16a70 74 65 2e 46 6f 72 6d 61 74 4f 70 73 20 44 61 74  te.FormatOps Dat
16a80 61 62 61 73 65 4f 62 6a 65 63 74 4e 61 6d 65 20  abaseObjectName 
16a90 24 63 6f 6e 6e 65 63 74 69 6f 6e 20 5c 0d 0a 20  $connection \.. 
16aa0 20 20 20 20 20 20 20 20 20 53 51 4c 69 74 65 43           SQLiteC
16ab0 6f 6e 6e 65 63 74 69 6f 6e 20 5b 6f 62 6a 65 63  onnection [objec
16ac0 74 20 69 6e 76 6f 6b 65 20 49 6e 74 65 72 70 72  t invoke Interpr
16ad0 65 74 65 72 2e 47 65 74 41 63 74 69 76 65 20 4e  eter.GetActive N
16ae0 65 78 74 49 64 5d 5d 0d 0a 0d 0a 20 20 20 20 20  extId]]....     
16af0 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
16b00 3a 20 41 64 64 20 74 68 65 20 64 61 74 61 62 61  : Add the databa
16b10 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 72  se connection pr
16b20 6f 76 69 64 65 64 20 62 79 20 6f 75 72 20 63 61  ovided by our ca
16b30 6c 6c 65 72 20 74 6f 20 74 68 65 20 6c 69 73 74  ller to the list
16b40 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
16b50 6f 66 20 74 68 6f 73 65 20 6b 6e 6f 77 6e 20 74  of those known t
16b60 6f 20 74 68 65 20 45 61 67 6c 65 20 69 6e 74 65  o the Eagle inte
16b70 72 70 72 65 74 65 72 2e 0d 0a 20 20 20 20 20 20  rpreter...      
16b80 23 0d 0a 20 20 20 20 20 20 6f 62 6a 65 63 74 20  #..      object 
16b90 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e  invoke -flags +N
16ba0 6f 6e 50 75 62 6c 69 63 20 49 6e 74 65 72 70 72  onPublic Interpr
16bb0 65 74 65 72 2e 47 65 74 41 63 74 69 76 65 2e 63  eter.GetActive.c
16bc0 6f 6e 6e 65 63 74 69 6f 6e 73 20 41 64 64 20 5c  onnections Add \
16bd0 0d 0a 20 20 20 20 20 20 20 20 20 20 24 64 62 20  ..          $db 
16be0 24 63 6f 6e 6e 65 63 74 69 6f 6e 0d 0a 20 20 20  $connection..   
16bf0 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
16c00 67 65 74 52 6f 77 73 46 72 6f 6d 44 61 74 61 54  getRowsFromDataT
16c10 61 62 6c 65 20 7b 20 64 61 74 61 54 61 62 6c 65  able { dataTable
16c20 20 7d 20 7b 0d 0a 20 20 20 20 20 20 73 65 74 20   } {..      set 
16c30 72 6f 77 73 20 5b 6c 69 73 74 5d 0d 0a 20 20 20  rows [list]..   
16c40 20 20 20 73 65 74 20 63 6f 75 6e 74 20 5b 24 64     set count [$d
16c50 61 74 61 54 61 62 6c 65 20 43 6f 6c 75 6d 6e 73  ataTable Columns
16c60 2e 43 6f 75 6e 74 5d 0d 0a 0d 0a 20 20 20 20 20  .Count]....     
16c70 20 66 6f 72 20 7b 73 65 74 20 69 6e 64 65 78 20   for {set index 
16c80 30 7d 20 7b 24 69 6e 64 65 78 20 3c 20 24 63 6f  0} {$index < $co
16c90 75 6e 74 7d 20 7b 69 6e 63 72 20 69 6e 64 65 78  unt} {incr index
16ca0 7d 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 65 74  } {..        set
16cb0 20 64 61 74 61 43 6f 6c 75 6d 6e 20 5b 24 64 61   dataColumn [$da
16cc0 74 61 54 61 62 6c 65 20 2d 61 6c 69 61 73 20 43  taTable -alias C
16cd0 6f 6c 75 6d 6e 73 2e 67 65 74 5f 49 74 65 6d 20  olumns.get_Item 
16ce0 24 69 6e 64 65 78 5d 0d 0a 20 20 20 20 20 20 20  $index]..       
16cf0 20 73 65 74 20 6e 61 6d 65 73 28 24 69 6e 64 65   set names($inde
16d00 78 29 20 5b 24 64 61 74 61 43 6f 6c 75 6d 6e 20  x) [$dataColumn 
16d10 43 6f 6c 75 6d 6e 4e 61 6d 65 5d 0d 0a 20 20 20  ColumnName]..   
16d20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 6f 62     }....      ob
16d30 6a 65 63 74 20 66 6f 72 65 61 63 68 20 2d 61 6c  ject foreach -al
16d40 69 61 73 20 64 61 74 61 52 6f 77 20 5b 73 65 74  ias dataRow [set
16d50 20 64 61 74 61 52 6f 77 73 20 5b 24 64 61 74 61   dataRows [$data
16d60 54 61 62 6c 65 20 52 6f 77 73 5d 5d 20 7b 0d 0a  Table Rows]] {..
16d70 20 20 20 20 20 20 20 20 73 65 74 20 72 6f 77 20          set row 
16d80 5b 6c 69 73 74 5d 0d 0a 0d 0a 20 20 20 20 20 20  [list]....      
16d90 20 20 66 6f 72 20 7b 73 65 74 20 69 6e 64 65 78    for {set index
16da0 20 30 7d 20 7b 24 69 6e 64 65 78 20 3c 20 24 63   0} {$index < $c
16db0 6f 75 6e 74 7d 20 7b 69 6e 63 72 20 69 6e 64 65  ount} {incr inde
16dc0 78 7d 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  x} {..          
16dd0 73 65 74 20 76 61 6c 75 65 20 5b 24 64 61 74 61  set value [$data
16de0 52 6f 77 20 2d 63 72 65 61 74 65 20 2d 61 6c 69  Row -create -ali
16df0 61 73 20 67 65 74 5f 49 74 65 6d 20 24 69 6e 64  as get_Item $ind
16e00 65 78 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  ex]....         
16e10 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e   if {[string len
16e20 67 74 68 20 24 76 61 6c 75 65 5d 20 3e 20 30 20  gth $value] > 0 
16e30 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  && \..          
16e40 20 20 20 20 21 5b 6f 62 6a 65 63 74 20 69 6e 76      ![object inv
16e50 6f 6b 65 20 43 6f 6e 76 65 72 74 20 49 73 44 42  oke Convert IsDB
16e60 4e 75 6c 6c 20 24 76 61 6c 75 65 5d 7d 20 74 68  Null $value]} th
16e70 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
16e80 20 20 6c 61 70 70 65 6e 64 20 72 6f 77 20 5b 6c    lappend row [l
16e90 69 73 74 20 24 6e 61 6d 65 73 28 24 69 6e 64 65  ist $names($inde
16ea0 78 29 20 5b 24 76 61 6c 75 65 20 54 6f 53 74 72  x) [$value ToStr
16eb0 69 6e 67 5d 5d 0d 0a 20 20 20 20 20 20 20 20 20  ing]]..         
16ec0 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
16ed0 20 20 20 20 20 20 20 6c 61 70 70 65 6e 64 20 72         lappend r
16ee0 6f 77 20 5b 6c 69 73 74 20 24 6e 61 6d 65 73 28  ow [list $names(
16ef0 24 69 6e 64 65 78 29 5d 0d 0a 20 20 20 20 20 20  $index)]..      
16f00 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d      }..        }
16f10 0d 0a 0d 0a 20 20 20 20 20 20 20 20 6c 61 70 70  ....        lapp
16f20 65 6e 64 20 72 6f 77 73 20 24 72 6f 77 0d 0a 20  end rows $row.. 
16f30 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
16f40 72 65 74 75 72 6e 20 24 72 6f 77 73 0d 0a 20 20  return $rows..  
16f50 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
16f60 20 64 75 6d 70 52 6f 77 73 46 72 6f 6d 44 61 74   dumpRowsFromDat
16f70 61 54 61 62 6c 65 20 7b 20 63 68 61 6e 6e 65 6c  aTable { channel
16f80 20 72 6f 77 73 20 7d 20 7b 0d 0a 20 20 20 20 20   rows } {..     
16f90 20 73 65 74 20 73 65 71 75 65 6e 63 65 20 31 0d   set sequence 1.
16fa0 0a 0d 0a 20 20 20 20 20 20 66 6f 72 65 61 63 68  ...      foreach
16fb0 20 72 6f 77 20 24 72 6f 77 73 20 7b 0d 0a 20 20   row $rows {..  
16fc0 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
16fd0 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
16fe0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
16ff0 5b 65 78 70 72 20 7b 24 73 65 71 75 65 6e 63 65  [expr {$sequence
17000 20 3e 20 31 20 3f 20 22 5c 6e 22 20 3a 20 22 22   > 1 ? "\n" : ""
17010 7d 5d 20 22 2d 2d 2d 2d 20 52 4f 57 20 23 22 20  }] "---- ROW #" 
17020 24 73 65 71 75 65 6e 63 65 20 3a 5c 6e 5d 0d 0a  $sequence :\n]..
17030 0d 0a 20 20 20 20 20 20 20 20 66 6f 72 65 61 63  ..        foreac
17040 68 20 70 61 69 72 20 24 72 6f 77 20 7b 0d 0a 20  h pair $row {.. 
17050 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 6c 6c           if {[ll
17060 65 6e 67 74 68 20 24 70 61 69 72 5d 20 3e 3d 20  ength $pair] >= 
17070 32 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  2} then {..     
17080 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
17090 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
170a0 73 20 5c 74 20 5c 0d 0a 20 20 20 20 20 20 20 20  s \t \..        
170b0 20 20 20 20 20 20 20 20 5b 6c 69 73 74 20 5b 6c          [list [l
170c0 69 6e 64 65 78 20 24 70 61 69 72 20 30 5d 5d 20  index $pair 0]] 
170d0 22 3a 20 22 20 5b 6c 69 73 74 20 5b 6c 69 6e 64  ": " [list [lind
170e0 65 78 20 24 70 61 69 72 20 31 5d 5d 20 5c 6e 5d  ex $pair 1]] \n]
170f0 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c  ..          } el
17100 73 65 69 66 20 7b 5b 6c 6c 65 6e 67 74 68 20 24  seif {[llength $
17110 70 61 69 72 5d 20 3d 3d 20 31 7d 20 74 68 65 6e  pair] == 1} then
17120 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
17130 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b  tputs $channel [
17140 61 70 70 65 6e 64 41 72 67 73 20 5c 74 20 5c 0d  appendArgs \t \.
17150 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
17160 20 5b 6c 69 73 74 20 5b 6c 69 6e 64 65 78 20 24   [list [lindex $
17170 70 61 69 72 20 30 5d 5d 20 22 3a 20 3c 6e 75 6c  pair 0]] ": <nul
17180 6c 3e 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20  l>\n"]..        
17190 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
171a0 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
171b0 68 61 6e 6e 65 6c 20 5c 74 3c 65 6d 70 74 79 3e  hannel \t<empty>
171c0 5c 6e 3b 20 23 20 4e 4f 54 45 3a 20 4e 6f 20 64  \n; # NOTE: No d
171d0 61 74 61 3f 0d 0a 20 20 20 20 20 20 20 20 20 20  ata?..          
171e0 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  }..        }....
171f0 20 20 20 20 20 20 20 20 69 6e 63 72 20 73 65 71          incr seq
17200 75 65 6e 63 65 0d 0a 20 20 20 20 20 20 7d 0d 0a  uence..      }..
17210 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
17220 6f 63 20 63 6c 65 61 6e 75 70 44 62 20 7b 20 66  oc cleanupDb { f
17230 69 6c 65 4e 61 6d 65 20 7b 76 61 72 4e 61 6d 65  ileName {varName
17240 20 64 62 7d 20 7b 63 6f 6c 6c 65 63 74 20 74 72   db} {collect tr
17250 75 65 7d 20 7b 71 75 61 6c 69 66 79 20 74 72 75  ue} {qualify tru
17260 65 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  e}..            
17270 20 20 20 20 20 20 20 20 20 7b 64 65 6c 65 74 65           {delete
17280 20 74 72 75 65 7d 20 7d 20 7b 0d 0a 20 20 20 20   true} } {..    
17290 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
172a0 45 3a 20 41 74 74 65 6d 70 74 20 74 6f 20 66 6f  E: Attempt to fo
172b0 72 63 65 20 61 6c 6c 20 70 65 6e 64 69 6e 67 20  rce all pending 
172c0 22 67 61 72 62 61 67 65 22 20 6f 62 6a 65 63 74  "garbage" object
172d0 73 20 74 6f 20 62 65 20 63 6f 6c 6c 65 63 74 65  s to be collecte
172e0 64 2c 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  d,..      #     
172f0 20 20 69 6e 63 6c 75 64 69 6e 67 20 53 51 4c 69    including SQLi
17300 74 65 20 73 74 61 74 65 6d 65 6e 74 73 20 61 6e  te statements an
17310 64 20 62 61 63 6b 75 70 20 6f 62 6a 65 63 74 73  d backup objects
17320 3b 20 74 68 69 73 20 73 68 6f 75 6c 64 20 61 6c  ; this should al
17330 6c 6f 77 0d 0a 20 20 20 20 20 20 23 20 20 20 20  low..      #    
17340 20 20 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e     the underlyin
17350 67 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  g database file 
17360 74 6f 20 62 65 20 64 65 6c 65 74 65 64 2e 0d 0a  to be deleted...
17370 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69        #..      i
17380 66 20 7b 24 63 6f 6c 6c 65 63 74 7d 20 74 68 65  f {$collect} the
17390 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 63 6f 6c  n {..        col
173a0 6c 65 63 74 47 61 72 62 61 67 65 20 24 3a 3a 74  lectGarbage $::t
173b0 65 73 74 5f 63 68 61 6e 6e 65 6c 0d 0a 20 20 20  est_channel..   
173c0 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d     }....      #.
173d0 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 52  .      # NOTE: R
173e0 65 66 65 72 20 74 6f 20 74 68 65 20 73 70 65 63  efer to the spec
173f0 69 66 69 65 64 20 76 61 72 69 61 62 6c 65 20 28  ified variable (
17400 65 2e 67 2e 20 22 64 62 22 29 20 69 6e 20 74 68  e.g. "db") in th
17410 65 20 63 6f 6e 74 65 78 74 20 6f 66 20 6f 75 72  e context of our
17420 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
17430 63 61 6c 6c 65 72 2e 20 20 54 68 65 20 68 61 6e  caller.  The han
17440 64 6c 65 20 74 6f 20 74 68 65 20 64 61 74 61 62  dle to the datab
17450 61 73 65 20 70 72 65 76 69 6f 75 73 6c 79 20 6f  ase previously o
17460 70 65 6e 65 64 20 76 69 61 20 74 68 65 0d 0a 20  pened via the.. 
17470 20 20 20 20 20 23 20 20 20 20 20 20 20 5b 73 65       #       [se
17480 74 75 70 44 62 5d 20 70 72 6f 63 65 64 75 72 65  tupDb] procedure
17490 20 73 68 6f 75 6c 64 20 62 65 20 73 74 6f 72 65   should be store
174a0 64 20 74 68 65 72 65 2e 0d 0a 20 20 20 20 20 20  d there...      
174b0 23 0d 0a 20 20 20 20 20 20 75 70 76 61 72 20 31  #..      upvar 1
174c0 20 24 76 61 72 4e 61 6d 65 20 64 62 0d 0a 0d 0a   $varName db....
174d0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
174e0 20 4e 4f 54 45 3a 20 43 6c 6f 73 65 20 74 68 65   NOTE: Close the
174f0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 74   connection to t
17500 68 65 20 64 61 74 61 62 61 73 65 20 6e 6f 77 2e  he database now.
17510 20 20 54 68 69 73 20 73 68 6f 75 6c 64 20 61 6c    This should al
17520 6c 6f 77 20 75 73 0d 0a 20 20 20 20 20 20 23 20  low us..      # 
17530 20 20 20 20 20 20 74 6f 20 64 65 6c 65 74 65 20        to delete 
17540 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 64  the underlying d
17550 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0d 0a 20  atabase file... 
17560 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66       #..      if
17570 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 64   {[info exists d
17580 62 5d 20 26 26 20 5b 63 61 74 63 68 20 7b 73 71  b] && [catch {sq
17590 6c 20 63 6c 6f 73 65 20 24 64 62 7d 20 65 72 72  l close $db} err
175a0 6f 72 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  or]} then {..   
175b0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
175c0 23 20 4e 4f 54 45 3a 20 57 65 20 73 6f 6d 65 68  # NOTE: We someh
175d0 6f 77 20 66 61 69 6c 65 64 20 74 6f 20 63 6c 6f  ow failed to clo
175e0 73 65 20 74 68 65 20 64 61 74 61 62 61 73 65 2c  se the database,
175f0 20 72 65 70 6f 72 74 20 77 68 79 2e 0d 0a 20 20   report why...  
17600 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
17610 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
17620 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
17630 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
17640 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a    "==== WARNING:
17650 20 66 61 69 6c 65 64 20 74 6f 20 63 6c 6f 73 65   failed to close
17660 20 64 61 74 61 62 61 73 65 20 5c 22 22 20 24 64   database \"" $d
17670 62 20 22 5c 22 2c 20 65 72 72 6f 72 3a 20 22 20  b "\", error: " 
17680 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5c  \..            \
17690 6e 5c 74 20 24 65 72 72 6f 72 20 5c 6e 5d 0d 0a  n\t $error \n]..
176a0 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
176b0 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
176c0 3a 20 46 69 72 73 74 2c 20 73 65 65 20 69 66 20  : First, see if 
176d0 6f 75 72 20 63 61 6c 6c 65 72 20 68 61 73 20 72  our caller has r
176e0 65 71 75 65 73 74 65 64 20 61 6e 20 69 6e 2d 6d  equested an in-m
176f0 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e 0d  emory database..
17700 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
17710 73 65 74 20 69 73 4d 65 6d 6f 72 79 20 5b 69 73  set isMemory [is
17720 4d 65 6d 6f 72 79 44 62 20 24 66 69 6c 65 4e 61  MemoryDb $fileNa
17730 6d 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a  me]....      #..
17740 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 42 75        # NOTE: Bu
17750 69 6c 64 20 74 68 65 20 66 75 6c 6c 20 70 61 74  ild the full pat
17760 68 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  h to the databas
17770 65 20 66 69 6c 65 20 6e 61 6d 65 2e 20 20 46 6f  e file name.  Fo
17780 72 20 6e 6f 77 2c 20 61 6c 6c 20 74 65 73 74 0d  r now, all test.
17790 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 64  .      #       d
177a0 61 74 61 62 61 73 65 20 66 69 6c 65 73 20 61 72  atabase files ar
177b0 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  e stored in the 
177c0 74 65 6d 70 6f 72 61 72 79 20 64 69 72 65 63 74  temporary direct
177d0 6f 72 79 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ory...      #.. 
177e0 20 20 20 20 20 69 66 20 7b 21 24 69 73 4d 65 6d       if {!$isMem
177f0 6f 72 79 20 26 26 20 24 71 75 61 6c 69 66 79 7d  ory && $qualify}
17800 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
17810 20 73 65 74 20 66 69 6c 65 4e 61 6d 65 20 5b 66   set fileName [f
17820 69 6c 65 20 6a 6f 69 6e 20 5b 67 65 74 44 61 74  ile join [getDat
17830 61 62 61 73 65 44 69 72 65 63 74 6f 72 79 5d 20  abaseDirectory] 
17840 5b 66 69 6c 65 20 74 61 69 6c 20 24 66 69 6c 65  [file tail $file
17850 4e 61 6d 65 5d 5d 0d 0a 20 20 20 20 20 20 7d 0d  Name]]..      }.
17860 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
17870 20 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20    # NOTE: Check 
17880 69 66 20 74 68 65 20 66 69 6c 65 20 73 74 69 6c  if the file stil
17890 6c 20 65 78 69 73 74 73 2e 0d 0a 20 20 20 20 20  l exists...     
178a0 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 21 24   #..      if {!$
178b0 69 73 4d 65 6d 6f 72 79 20 26 26 20 24 64 65 6c  isMemory && $del
178c0 65 74 65 20 26 26 20 5b 66 69 6c 65 20 65 78 69  ete && [file exi
178d0 73 74 73 20 24 66 69 6c 65 4e 61 6d 65 5d 7d 20  sts $fileName]} 
178e0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
178f0 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
17900 45 3a 20 53 6b 69 70 20 64 65 6c 65 74 69 6e 67  E: Skip deleting
17910 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 20   database files 
17920 69 66 20 73 6f 6d 65 62 6f 64 79 20 73 65 74 73  if somebody sets
17930 20 74 68 65 20 67 6c 6f 62 61 6c 0d 0a 20 20 20   the global..   
17940 20 20 20 20 20 23 20 20 20 20 20 20 20 76 61 72       #       var
17950 69 61 62 6c 65 20 74 6f 20 70 72 65 76 65 6e 74  iable to prevent
17960 20 69 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d   it...        #.
17970 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69  .        if {![i
17980 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28  nfo exists ::no(
17990 63 6c 65 61 6e 75 70 44 62 46 69 6c 65 29 5d 7d  cleanupDbFile)]}
179a0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
179b0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
179c0 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74 20  # NOTE: Attempt 
179d0 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20 74 65  to delete the te
179e0 73 74 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  st database file
179f0 20 6e 6f 77 2e 0d 0a 20 20 20 20 20 20 20 20 20   now...         
17a00 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66   #..          if
17a10 20 7b 5b 73 65 74 20 63 6f 64 65 20 5b 63 61 74   {[set code [cat
17a20 63 68 20 7b 66 69 6c 65 20 64 65 6c 65 74 65 20  ch {file delete 
17a30 24 66 69 6c 65 4e 61 6d 65 7d 20 65 72 72 6f 72  $fileName} error
17a40 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  ]]} then {..    
17a50 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
17a60 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 57         # NOTE: W
17a70 65 20 73 6f 6d 65 68 6f 77 20 66 61 69 6c 65 64  e somehow failed
17a80 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20 66   to delete the f
17a90 69 6c 65 2c 20 72 65 70 6f 72 74 20 77 68 79 2e  ile, report why.
17aa0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 0d  ..            #.
17ab0 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75  .            tpu
17ac0 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
17ad0 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
17ae0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
17af0 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a    "==== WARNING:
17b00 20 66 61 69 6c 65 64 20 74 6f 20 64 65 6c 65 74   failed to delet
17b10 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
17b20 5c 22 22 20 24 66 69 6c 65 4e 61 6d 65 20 5c 0d  \"" $fileName \.
17b30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
17b40 20 22 5c 22 20 64 75 72 69 6e 67 20 63 6c 65 61   "\" during clea
17b50 6e 75 70 2c 20 65 72 72 6f 72 3a 20 22 20 5c 6e  nup, error: " \n
17b60 5c 74 20 24 65 72 72 6f 72 20 5c 6e 5d 0d 0a 20  \t $error \n].. 
17b70 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
17b80 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
17b90 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
17ba0 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 68 6f       # NOTE: Sho
17bb0 77 20 74 68 61 74 20 77 65 20 73 6b 69 70 70 65  w that we skippe
17bc0 64 20 64 65 6c 65 74 69 6e 67 20 74 68 65 20 66  d deleting the f
17bd0 69 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  ile...          
17be0 23 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74  #..          set
17bf0 20 63 6f 64 65 20 30 0d 0a 0d 0a 20 20 20 20 20   code 0....     
17c00 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
17c10 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
17c20 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
17c30 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41          "==== WA
17c40 52 4e 49 4e 47 3a 20 73 6b 69 70 70 65 64 20 64  RNING: skipped d
17c50 65 6c 65 74 69 6e 67 20 64 61 74 61 62 61 73 65  eleting database
17c60 20 66 69 6c 65 20 5c 22 22 20 24 66 69 6c 65 4e   file \"" $fileN
17c70 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ame \..         
17c80 20 20 20 20 20 22 5c 22 20 64 75 72 69 6e 67 20       "\" during 
17c90 63 6c 65 61 6e 75 70 5c 6e 22 5d 0d 0a 20 20 20  cleanup\n"]..   
17ca0 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 20       }..      } 
17cb0 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
17cc0 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
17cd0 45 3a 20 54 68 65 20 66 69 6c 65 20 64 6f 65 73  E: The file does
17ce0 20 6e 6f 74 20 65 78 69 73 74 2c 20 73 75 63 63   not exist, succ
17cf0 65 73 73 21 0d 0a 20 20 20 20 20 20 20 20 23 0d  ess!..        #.
17d00 0a 20 20 20 20 20 20 20 20 73 65 74 20 63 6f 64  .        set cod
17d10 65 20 30 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a  e 0..      }....
17d20 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 63 6f        return $co
17d30 64 65 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20  de..    }.....  
17d40 20 20 70 72 6f 63 20 73 61 76 65 45 6e 76 69 72    proc saveEnvir
17d50 6f 6e 6d 65 6e 74 56 61 72 69 61 62 6c 65 73 20  onmentVariables 
17d60 7b 20 6e 61 6d 65 73 20 7b 76 61 72 4e 61 6d 65  { names {varName
17d70 20 22 22 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20   ""} } {..      
17d80 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
17d90 20 46 6f 72 20 65 61 63 68 20 6e 61 6d 65 2c 20   For each name, 
17da0 64 6f 65 73 20 74 68 65 20 6c 69 76 65 20 65 6e  does the live en
17db0 76 69 72 6f 6e 6d 65 6e 74 20 76 61 72 69 61 62  vironment variab
17dc0 6c 65 20 65 78 69 73 74 3f 20 20 49 66 0d 0a 20  le exist?  If.. 
17dd0 20 20 20 20 20 23 20 20 20 20 20 20 20 73 6f 2c       #       so,
17de0 20 73 61 76 65 20 74 68 65 20 76 61 6c 75 65 20   save the value 
17df0 66 6f 72 20 6c 61 74 65 72 3b 20 6f 74 68 65 72  for later; other
17e00 77 69 73 65 2c 20 6d 61 6b 65 20 73 75 72 65 20  wise, make sure 
17e10 74 68 65 20 73 61 76 65 64 0d 0a 20 20 20 20 20  the saved..     
17e20 20 23 20 20 20 20 20 20 20 76 61 6c 75 65 20 64   #       value d
17e30 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 20 65 69  oes not exist ei
17e40 74 68 65 72 2e 20 20 54 68 65 20 6c 69 76 65 20  ther.  The live 
17e50 65 6e 76 69 72 6f 6e 6d 65 6e 74 20 76 61 72 69  environment vari
17e60 61 62 6c 65 73 0d 0a 20 20 20 20 20 20 23 20 20  ables..      #  
17e70 20 20 20 20 20 41 52 45 20 4e 4f 54 20 63 68 61       ARE NOT cha
17e80 6e 67 65 64 20 62 79 20 74 68 69 73 20 70 72 6f  nged by this pro
17e90 63 65 64 75 72 65 2e 0d 0a 20 20 20 20 20 20 23  cedure...      #
17ea0 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72  ..      if {[str
17eb0 69 6e 67 20 6c 65 6e 67 74 68 20 24 76 61 72 4e  ing length $varN
17ec0 61 6d 65 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20  ame] == 0} then 
17ed0 7b 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 76  {..        set v
17ee0 61 72 4e 61 6d 65 20 73 61 76 65 64 45 6e 76 0d  arName savedEnv.
17ef0 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
17f00 20 20 75 70 76 61 72 20 31 20 24 76 61 72 4e 61    upvar 1 $varNa
17f10 6d 65 20 73 61 76 65 64 45 6e 76 0d 0a 0d 0a 20  me savedEnv.... 
17f20 20 20 20 20 20 66 6f 72 65 61 63 68 20 6e 61 6d       foreach nam
17f30 65 20 24 6e 61 6d 65 73 20 7b 0d 0a 20 20 20 20  e $names {..    
17f40 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78      if {[info ex
17f50 69 73 74 73 20 3a 3a 65 6e 76 28 24 6e 61 6d 65  ists ::env($name
17f60 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  )]} then {..    
17f70 20 20 20 20 20 20 73 65 74 20 73 61 76 65 64 45        set savedE
17f80 6e 76 28 24 6e 61 6d 65 29 20 24 3a 3a 65 6e 76  nv($name) $::env
17f90 28 24 6e 61 6d 65 29 0d 0a 20 20 20 20 20 20 20  ($name)..       
17fa0 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
17fb0 20 20 20 20 20 75 6e 73 65 74 20 2d 6e 6f 63 6f       unset -noco
17fc0 6d 70 6c 61 69 6e 20 73 61 76 65 64 45 6e 76 28  mplain savedEnv(
17fd0 24 6e 61 6d 65 29 0d 0a 20 20 20 20 20 20 20 20  $name)..        
17fe0 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  }..      }....  
17ff0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
18000 4f 54 45 3a 20 54 68 69 73 20 69 73 20 73 65 6c  OTE: This is sel
18010 66 2d 63 6c 65 61 6e 69 6e 67 2e 20 20 49 66 20  f-cleaning.  If 
18020 6e 6f 20 73 61 76 65 64 20 65 6e 76 69 72 6f 6e  no saved environ
18030 6d 65 6e 74 20 76 61 72 69 61 62 6c 65 73 20 6e  ment variables n
18040 6f 77 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  ow..      #     
18050 20 20 65 78 69 73 74 2c 20 72 65 6d 6f 76 65 20    exist, remove 
18060 74 68 65 20 61 72 72 61 79 2e 0d 0a 20 20 20 20  the array...    
18070 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b    #..      if {[
18080 61 72 72 61 79 20 73 69 7a 65 20 73 61 76 65 64  array size saved
18090 45 6e 76 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20  Env] == 0} then 
180a0 7b 0d 0a 20 20 20 20 20 20 20 20 75 6e 73 65 74  {..        unset
180b0 20 2d 6e 6f 63 6f 6d 70 6c 61 69 6e 20 73 61 76   -nocomplain sav
180c0 65 64 45 6e 76 0d 0a 20 20 20 20 20 20 7d 0d 0a  edEnv..      }..
180d0 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
180e0 6f 63 20 72 65 73 74 6f 72 65 45 6e 76 69 72 6f  oc restoreEnviro
180f0 6e 6d 65 6e 74 56 61 72 69 61 62 6c 65 73 20 7b  nmentVariables {
18100 20 6e 61 6d 65 73 20 7b 76 61 72 4e 61 6d 65 20   names {varName 
18110 22 22 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23  ""} } {..      #
18120 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
18130 46 6f 72 20 65 61 63 68 20 6e 61 6d 65 2c 20 64  For each name, d
18140 6f 65 73 20 74 68 65 20 73 61 76 65 64 20 65 6e  oes the saved en
18150 76 69 72 6f 6e 6d 65 6e 74 20 76 61 72 69 61 62  vironment variab
18160 6c 65 20 65 78 69 73 74 3f 20 20 49 66 0d 0a 20  le exist?  If.. 
18170 20 20 20 20 20 23 20 20 20 20 20 20 20 73 6f 2c       #       so,
18180 20 72 65 73 74 6f 72 65 20 74 68 65 20 73 61 76   restore the sav
18190 65 64 20 76 61 6c 75 65 20 61 6e 64 20 75 6e 73  ed value and uns
181a0 65 74 20 69 74 3b 20 6f 74 68 65 72 77 69 73 65  et it; otherwise
181b0 2c 20 6d 61 6b 65 20 73 75 72 65 0d 0a 20 20 20  , make sure..   
181c0 20 20 20 23 20 20 20 20 20 20 20 74 68 65 20 6c     #       the l
181d0 69 76 65 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 20  ive environment 
181e0 76 61 72 69 61 62 6c 65 20 64 6f 65 73 20 6e 6f  variable does no
181f0 74 20 65 78 69 73 74 20 65 69 74 68 65 72 20 28  t exist either (
18200 69 2e 65 2e 20 69 74 0d 0a 20 20 20 20 20 20 23  i.e. it..      #
18210 20 20 20 20 20 20 20 77 61 73 20 6e 6f 74 20 73         was not s
18220 65 74 20 74 6f 20 62 65 67 69 6e 20 77 69 74 68  et to begin with
18230 29 2e 20 20 42 6f 74 68 20 73 61 76 65 64 20 61  ).  Both saved a
18240 6e 64 20 6c 69 76 65 20 65 6e 76 69 72 6f 6e 6d  nd live environm
18250 65 6e 74 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ent..      #    
18260 20 20 20 76 61 72 69 61 62 6c 65 73 20 41 52 45     variables ARE
18270 20 63 68 61 6e 67 65 64 20 62 79 20 74 68 69 73   changed by this
18280 20 70 72 6f 63 65 64 75 72 65 2e 0d 0a 20 20 20   procedure...   
18290 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
182a0 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
182b0 76 61 72 4e 61 6d 65 5d 20 3d 3d 20 30 7d 20 74  varName] == 0} t
182c0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 73  hen {..        s
182d0 65 74 20 76 61 72 4e 61 6d 65 20 73 61 76 65 64  et varName saved
182e0 45 6e 76 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a  Env..      }....
182f0 20 20 20 20 20 20 75 70 76 61 72 20 31 20 24 76        upvar 1 $v
18300 61 72 4e 61 6d 65 20 73 61 76 65 64 45 6e 76 0d  arName savedEnv.
18310 0a 0d 0a 20 20 20 20 20 20 66 6f 72 65 61 63 68  ...      foreach
18320 20 6e 61 6d 65 20 24 6e 61 6d 65 73 20 7b 0d 0a   name $names {..
18330 20 20 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66          if {[inf
18340 6f 20 65 78 69 73 74 73 20 73 61 76 65 64 45 6e  o exists savedEn
18350 76 28 24 6e 61 6d 65 29 5d 7d 20 74 68 65 6e 20  v($name)]} then 
18360 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74  {..          set
18370 20 3a 3a 65 6e 76 28 24 6e 61 6d 65 29 20 24 73   ::env($name) $s
18380 61 76 65 64 45 6e 76 28 24 6e 61 6d 65 29 0d 0a  avedEnv($name)..
18390 20 20 20 20 20 20 20 20 20 20 75 6e 73 65 74 20            unset 
183a0 2d 6e 6f 63 6f 6d 70 6c 61 69 6e 20 73 61 76 65  -nocomplain save
183b0 64 45 6e 76 28 24 6e 61 6d 65 29 0d 0a 20 20 20  dEnv($name)..   
183c0 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
183d0 20 20 20 20 20 20 20 20 20 75 6e 73 65 74 20 2d           unset -
183e0 6e 6f 63 6f 6d 70 6c 61 69 6e 20 3a 3a 65 6e 76  nocomplain ::env
183f0 28 24 6e 61 6d 65 29 0d 0a 20 20 20 20 20 20 20  ($name)..       
18400 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20   }..      }.... 
18410 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
18420 4e 4f 54 45 3a 20 54 68 69 73 20 69 73 20 73 65  NOTE: This is se
18430 6c 66 2d 63 6c 65 61 6e 69 6e 67 2e 20 20 49 66  lf-cleaning.  If
18440 20 6e 6f 20 73 61 76 65 64 20 65 6e 76 69 72 6f   no saved enviro
18450 6e 6d 65 6e 74 20 76 61 72 69 61 62 6c 65 73 20  nment variables 
18460 6e 6f 77 0d 0a 20 20 20 20 20 20 23 20 20 20 20  now..      #    
18470 20 20 20 65 78 69 73 74 2c 20 72 65 6d 6f 76 65     exist, remove
18480 20 74 68 65 20 61 72 72 61 79 2e 0d 0a 20 20 20   the array...   
18490 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
184a0 5b 61 72 72 61 79 20 73 69 7a 65 20 73 61 76 65  [array size save
184b0 64 45 6e 76 5d 20 3d 3d 20 30 7d 20 74 68 65 6e  dEnv] == 0} then
184c0 20 7b 0d 0a 20 20 20 20 20 20 20 20 75 6e 73 65   {..        unse
184d0 74 20 2d 6e 6f 63 6f 6d 70 6c 61 69 6e 20 73 61  t -nocomplain sa
184e0 76 65 64 45 6e 76 0d 0a 20 20 20 20 20 20 7d 0d  vedEnv..      }.
184f0 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70  .    }.....    p
18500 72 6f 63 20 73 61 76 65 53 51 4c 69 74 65 43 6f  roc saveSQLiteCo
18510 6e 6e 65 63 74 69 6f 6e 45 6e 76 69 72 6f 6e 6d  nnectionEnvironm
18520 65 6e 74 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20  ent {} {..      
18530 75 70 76 61 72 20 31 20 73 61 76 65 64 45 6e 76  upvar 1 savedEnv
18540 20 73 61 76 65 64 45 6e 76 0d 0a 0d 0a 20 20 20   savedEnv....   
18550 20 20 20 73 61 76 65 45 6e 76 69 72 6f 6e 6d 65     saveEnvironme
18560 6e 74 56 61 72 69 61 62 6c 65 73 20 5b 6c 69 73  ntVariables [lis
18570 74 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 44  t \..          D
18580 65 66 61 75 6c 74 46 6c 61 67 73 5f 53 51 4c 69  efaultFlags_SQLi
18590 74 65 43 6f 6e 6e 65 63 74 69 6f 6e 20 4e 6f 5f  teConnection No_
185a0 53 51 4c 69 74 65 43 6f 6e 6e 65 63 74 69 6f 6e  SQLiteConnection
185b0 4e 65 77 50 61 72 73 65 72 5d 20 5c 0d 0a 20 20  NewParser] \..  
185c0 20 20 20 20 20 20 20 20 73 61 76 65 64 45 6e 76          savedEnv
185d0 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
185e0 70 72 6f 63 20 72 65 73 74 6f 72 65 53 51 4c 69  proc restoreSQLi
185f0 74 65 43 6f 6e 6e 65 63 74 69 6f 6e 45 6e 76 69  teConnectionEnvi
18600 72 6f 6e 6d 65 6e 74 20 7b 7d 20 7b 0d 0a 20 20  ronment {} {..  
18610 20 20 20 20 75 70 76 61 72 20 31 20 73 61 76 65      upvar 1 save
18620 64 45 6e 76 20 73 61 76 65 64 45 6e 76 0d 0a 0d  dEnv savedEnv...
18630 0a 20 20 20 20 20 20 72 65 73 74 6f 72 65 45 6e  .      restoreEn
18640 76 69 72 6f 6e 6d 65 6e 74 56 61 72 69 61 62 6c  vironmentVariabl
18650 65 73 20 5b 6c 69 73 74 20 5c 0d 0a 20 20 20 20  es [list \..    
18660 20 20 20 20 20 20 44 65 66 61 75 6c 74 46 6c 61        DefaultFla
18670 67 73 5f 53 51 4c 69 74 65 43 6f 6e 6e 65 63 74  gs_SQLiteConnect
18680 69 6f 6e 20 4e 6f 5f 53 51 4c 69 74 65 43 6f 6e  ion No_SQLiteCon
18690 6e 65 63 74 69 6f 6e 4e 65 77 50 61 72 73 65 72  nectionNewParser
186a0 5d 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 73  ] \..          s
186b0 61 76 65 64 45 6e 76 0d 0a 20 20 20 20 7d 0d 0a  avedEnv..    }..
186c0 0c 0d 0a 20 20 20 20 70 72 6f 63 20 73 61 76 65  ...    proc save
186d0 53 51 4c 69 74 65 43 6f 6e 76 65 72 74 45 6e 76  SQLiteConvertEnv
186e0 69 72 6f 6e 6d 65 6e 74 20 7b 7d 20 7b 0d 0a 20  ironment {} {.. 
186f0 20 20 20 20 20 75 70 76 61 72 20 31 20 73 61 76       upvar 1 sav
18700 65 64 45 6e 76 20 73 61 76 65 64 45 6e 76 0d 0a  edEnv savedEnv..
18710 0d 0a 20 20 20 20 20 20 73 61 76 65 45 6e 76 69  ..      saveEnvi
18720 72 6f 6e 6d 65 6e 74 56 61 72 69 61 62 6c 65 73  ronmentVariables
18730 20 5b 6c 69 73 74 20 5c 0d 0a 20 20 20 20 20 20   [list \..      
18740 20 20 20 20 55 73 65 5f 53 51 4c 69 74 65 43 6f      Use_SQLiteCo
18750 6e 76 65 72 74 5f 44 65 66 61 75 6c 74 44 62 54  nvert_DefaultDbT
18760 79 70 65 20 55 73 65 5f 53 51 4c 69 74 65 43 6f  ype Use_SQLiteCo
18770 6e 76 65 72 74 5f 44 65 66 61 75 6c 74 54 79 70  nvert_DefaultTyp
18780 65 4e 61 6d 65 5d 20 5c 0d 0a 20 20 20 20 20 20  eName] \..      
18790 20 20 20 20 73 61 76 65 64 45 6e 76 0d 0a 20 20      savedEnv..  
187a0 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
187b0 20 72 65 73 74 6f 72 65 53 51 4c 69 74 65 43 6f   restoreSQLiteCo
187c0 6e 76 65 72 74 45 6e 76 69 72 6f 6e 6d 65 6e 74  nvertEnvironment
187d0 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 75 70 76   {} {..      upv
187e0 61 72 20 31 20 73 61 76 65 64 45 6e 76 20 73 61  ar 1 savedEnv sa
187f0 76 65 64 45 6e 76 0d 0a 0d 0a 20 20 20 20 20 20  vedEnv....      
18800 72 65 73 74 6f 72 65 45 6e 76 69 72 6f 6e 6d 65  restoreEnvironme
18810 6e 74 56 61 72 69 61 62 6c 65 73 20 5b 6c 69 73  ntVariables [lis
18820 74 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 55  t \..          U
18830 73 65 5f 53 51 4c 69 74 65 43 6f 6e 76 65 72 74  se_SQLiteConvert
18840 5f 44 65 66 61 75 6c 74 44 62 54 79 70 65 20 55  _DefaultDbType U
18850 73 65 5f 53 51 4c 69 74 65 43 6f 6e 76 65 72 74  se_SQLiteConvert
18860 5f 44 65 66 61 75 6c 74 54 79 70 65 4e 61 6d 65  _DefaultTypeName
18870 5d 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 73  ] \..          s
18880 61 76 65 64 45 6e 76 0d 0a 20 20 20 20 7d 0d 0a  avedEnv..    }..
18890 0c 0d 0a 20 20 20 20 70 72 6f 63 20 73 65 74 75  ...    proc setu
188a0 70 44 62 49 6e 74 65 72 72 75 70 74 43 61 6c 6c  pDbInterruptCall
188b0 62 61 63 6b 20 7b 20 63 68 61 6e 6e 65 6c 20 6c  back { channel l
188c0 6f 67 20 7d 20 7b 0d 0a 20 20 20 20 20 20 74 70  og } {..      tp
188d0 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 22 2d 2d  uts $channel "--
188e0 2d 2d 20 73 65 74 74 69 6e 67 20 75 70 20 64 65  -- setting up de
188f0 62 75 67 67 65 72 20 69 6e 74 65 72 72 75 70 74  bugger interrupt
18900 20 63 61 6c 6c 62 61 63 6b 2e 2e 2e 20 22 0d 0a   callback... "..
18910 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74  ..      if {[cat
18920 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 61  ch {..        sa
18930 76 65 45 6e 76 69 72 6f 6e 6d 65 6e 74 56 61 72  veEnvironmentVar
18940 69 61 62 6c 65 73 20 5b 6c 69 73 74 20 5c 0d 0a  iables [list \..
18950 20 20 20 20 20 20 20 20 20 20 20 20 71 75 69 65              quie
18960 74 46 69 6e 64 49 6e 74 65 72 70 72 65 74 65 72  tFindInterpreter
18970 54 65 73 74 50 61 74 68 20 71 75 69 65 74 53 65  TestPath quietSe
18980 74 75 70 49 6e 74 65 72 70 72 65 74 65 72 54 65  tupInterpreterTe
18990 73 74 50 61 74 68 5d 0d 0a 0d 0a 20 20 20 20 20  stPath]....     
189a0 20 20 20 74 72 79 20 7b 0d 0a 20 20 20 20 20 20     try {..      
189b0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
189c0 20 23 20 4e 4f 54 45 3a 20 50 72 65 76 65 6e 74   # NOTE: Prevent
189d0 20 74 68 65 20 76 65 6e 64 6f 72 20 73 63 72 69   the vendor scri
189e0 70 74 20 66 72 6f 6d 20 62 65 69 6e 67 20 6e 6f  pt from being no
189f0 69 73 79 20 77 68 65 6e 20 63 72 65 61 74 69 6e  isy when creatin
18a00 67 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 20  g..          #  
18a10 20 20 20 20 20 74 68 65 20 69 73 6f 6c 61 74 65       the isolate
18a20 64 20 69 6e 74 65 72 70 72 65 74 65 72 2e 0d 0a  d interpreter...
18a30 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
18a40 20 20 20 20 20 20 20 73 65 74 20 3a 3a 65 6e 76         set ::env
18a50 28 71 75 69 65 74 46 69 6e 64 49 6e 74 65 72 70  (quietFindInterp
18a60 72 65 74 65 72 54 65 73 74 50 61 74 68 29 20 31  reterTestPath) 1
18a70 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20  ..          set 
18a80 3a 3a 65 6e 76 28 71 75 69 65 74 53 65 74 75 70  ::env(quietSetup
18a90 49 6e 74 65 72 70 72 65 74 65 72 54 65 73 74 50  InterpreterTestP
18aa0 61 74 68 29 20 31 0d 0a 0d 0a 20 20 20 20 20 20  ath) 1....      
18ab0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
18ac0 20 23 20 4e 4f 54 45 3a 20 4d 61 6b 65 20 73 75   # NOTE: Make su
18ad0 72 65 20 74 68 65 20 73 63 72 69 70 74 20 64 65  re the script de
18ae0 62 75 67 67 65 72 20 61 6e 64 20 74 68 65 20 69  bugger and the i
18af0 73 6f 6c 61 74 65 64 20 69 6e 74 65 72 70 72 65  solated interpre
18b00 74 65 72 0d 0a 20 20 20 20 20 20 20 20 20 20 23  ter..          #
18b10 20 20 20 20 20 20 20 61 72 65 20 73 65 74 75 70         are setup
18b20 20 61 6e 64 20 72 65 61 64 79 20 66 6f 72 20 75   and ready for u
18b30 73 65 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23  se...          #
18b40 0d 0a 20 20 20 20 20 20 20 20 20 20 64 65 62 75  ..          debu
18b50 67 20 73 65 74 75 70 20 74 72 75 65 20 74 72 75  g setup true tru
18b60 65 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 23  e....          #
18b70 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f  ..          # NO
18b80 54 45 3a 20 4c 6f 61 64 20 74 68 65 20 6e 65 63  TE: Load the nec
18b90 65 73 73 61 72 79 20 70 61 63 6b 61 67 65 73 20  essary packages 
18ba0 69 6e 74 6f 20 74 68 65 20 69 73 6f 6c 61 74 65  into the isolate
18bb0 64 20 69 6e 74 65 72 70 72 65 74 65 72 2e 0d 0a  d interpreter...
18bc0 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
18bd0 20 20 20 20 20 20 20 64 65 62 75 67 20 65 76 61         debug eva
18be0 6c 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  l {..           
18bf0 20 70 61 63 6b 61 67 65 20 72 65 71 75 69 72 65   package require
18c00 20 45 61 67 6c 65 0d 0a 20 20 20 20 20 20 20 20   Eagle..        
18c10 20 20 20 20 70 61 63 6b 61 67 65 20 72 65 71 75      package requ
18c20 69 72 65 20 45 61 67 6c 65 2e 4c 69 62 72 61 72  ire Eagle.Librar
18c30 79 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  y..            p
18c40 61 63 6b 61 67 65 20 72 65 71 75 69 72 65 20 45  ackage require E
18c50 61 67 6c 65 2e 54 65 73 74 0d 0a 20 20 20 20 20  agle.Test..     
18c60 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
18c70 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
18c80 20 23 20 4e 4f 54 45 3a 20 43 6f 70 79 20 74 68   # NOTE: Copy th
18c90 65 20 6e 65 63 65 73 73 61 72 79 20 76 61 72 69  e necessary vari
18ca0 61 62 6c 65 73 20 69 6e 74 6f 20 74 68 65 20 69  ables into the i
18cb0 73 6f 6c 61 74 65 64 20 69 6e 74 65 72 70 72 65  solated interpre
18cc0 74 65 72 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  ter...          
18cd0 23 0d 0a 20 20 20 20 20 20 20 20 20 20 64 65 62  #..          deb
18ce0 75 67 20 69 6e 76 6f 6b 65 20 30 20 73 65 74 20  ug invoke 0 set 
18cf0 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 24  ::test_channel $
18d00 63 68 61 6e 6e 65 6c 3b 20 23 20 4e 4f 54 45 3a  channel; # NOTE:
18d10 20 46 6f 72 20 5b 74 70 75 74 73 5d 2e 0d 0a 20   For [tputs]... 
18d20 20 20 20 20 20 20 20 20 20 64 65 62 75 67 20 69           debug i
18d30 6e 76 6f 6b 65 20 30 20 73 65 74 20 3a 3a 74 65  nvoke 0 set ::te
18d40 73 74 5f 6c 6f 67 20 24 6c 6f 67 3b 20 23 20 4e  st_log $log; # N
18d50 4f 54 45 3a 20 46 6f 72 20 5b 74 6c 6f 67 5d 2e  OTE: For [tlog].
18d60 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d  ....          #.
18d70 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54  .          # NOT
18d80 45 3a 20 49 6e 73 74 61 6c 6c 20 74 68 65 20 63  E: Install the c
18d90 61 6c 6c 62 61 63 6b 20 73 63 72 69 70 74 20 74  allback script t
18da0 6f 20 62 65 20 65 76 61 6c 75 61 74 65 64 20 69  o be evaluated i
18db0 6e 20 74 68 65 20 69 73 6f 6c 61 74 65 64 0d 0a  n the isolated..
18dc0 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20            #     
18dd0 20 20 69 6e 74 65 72 70 72 65 74 65 72 20 77 68    interpreter wh
18de0 65 6e 20 74 68 69 73 20 69 6e 74 65 72 70 72 65  en this interpre
18df0 74 65 72 20 69 73 20 69 6e 74 65 72 72 75 70 74  ter is interrupt
18e00 65 64 20 62 79 20 73 63 72 69 70 74 0d 0a 20 20  ed by script..  
18e10 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
18e20 63 61 6e 63 65 6c 6c 61 74 69 6f 6e 2c 20 65 74  cancellation, et
18e30 63 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d  c...          #.
18e40 0a 20 20 20 20 20 20 20 20 20 20 64 65 62 75 67  .          debug
18e50 20 63 61 6c 6c 62 61 63 6b 20 61 70 70 6c 79 20   callback apply 
18e60 7b 7b 73 65 6e 64 65 72 20 65 7d 20 7b 0d 0a 20  {{sender e} {.. 
18e70 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
18e80 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45            # NOTE
18e90 3a 20 43 68 65 63 6b 20 69 66 20 74 68 69 73 20  : Check if this 
18ea0 64 65 62 75 67 67 65 72 20 63 61 6c 6c 62 61 63  debugger callbac
18eb0 6b 20 69 73 20 6f 6e 65 20 74 68 61 74 20 77 65  k is one that we
18ec0 20 63 61 72 65 20 61 62 6f 75 74 2e 0d 0a 20 20   care about...  
18ed0 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
18ee0 20 20 20 20 20 20 20 20 20 73 65 74 20 69 6e 74           set int
18ef0 65 72 72 75 70 74 54 79 70 65 73 20 5b 73 70 6c  erruptTypes [spl
18f00 69 74 20 5b 24 65 20 49 6e 74 65 72 72 75 70 74  it [$e Interrupt
18f10 54 79 70 65 5d 20 22 2c 20 22 5d 0d 0a 0d 0a 20  Type] ", "].... 
18f20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 22             if {"
18f30 43 61 6e 63 65 6c 65 64 22 20 69 6e 20 24 69 6e  Canceled" in $in
18f40 74 65 72 72 75 70 74 54 79 70 65 73 20 7c 7c 20  terruptTypes || 
18f50 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
18f60 20 20 20 22 55 6e 77 6f 75 6e 64 22 20 69 6e 20     "Unwound" in 
18f70 24 69 6e 74 65 72 72 75 70 74 54 79 70 65 73 7d  $interruptTypes}
18f80 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
18f90 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
18fa0 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
18fb0 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 5b 6f  Make sure the [o
18fc0 62 6a 65 63 74 5d 20 63 6f 6d 6d 61 6e 64 20 69  bject] command i
18fd0 73 20 61 76 61 69 6c 61 62 6c 65 2e 20 20 53 69  s available.  Si
18fe0 6e 63 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20  nce..           
18ff0 20 20 20 23 20 20 20 20 20 20 20 74 68 69 73 20     #       this 
19000 69 73 20 61 6e 20 69 73 6f 6c 61 74 65 64 20 69  is an isolated i
19010 6e 74 65 72 70 72 65 74 65 72 2c 20 63 68 65 63  nterpreter, chec
19020 6b 20 66 6f 72 20 69 74 20 74 68 65 20 68 61 72  k for it the har
19030 64 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  d..             
19040 20 23 20 20 20 20 20 20 20 77 61 79 2e 0d 0a 20   #       way... 
19050 20 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a               #..
19060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
19070 20 7b 5b 6c 6c 65 6e 67 74 68 20 5b 69 6e 66 6f   {[llength [info
19080 20 63 6f 6d 6d 61 6e 64 73 20 6f 62 6a 65 63 74   commands object
19090 5d 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  ]] > 0} then {..
190a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
190b0 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  #..             
190c0 20 20 20 23 20 4e 4f 54 45 3a 20 49 74 65 72 61     # NOTE: Itera
190d0 74 65 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 64  te through all d
190e0 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
190f0 6f 6e 73 20 6b 6e 6f 77 6e 20 74 6f 20 74 68 65  ons known to the
19100 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
19110 20 20 23 20 20 20 20 20 20 20 70 61 72 65 6e 74    #       parent
19120 20 69 6e 74 65 72 70 72 65 74 65 72 2e 0d 0a 20   interpreter... 
19130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23                 #
19140 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
19150 20 20 6f 62 6a 65 63 74 20 66 6f 72 65 61 63 68    object foreach
19160 20 2d 61 6c 69 61 73 20 70 61 69 72 20 5b 6f 62   -alias pair [ob
19170 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61  ject invoke -fla
19180 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d  gs +NonPublic \.
19190 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
191a0 20 20 20 20 20 24 65 20 49 6e 74 65 72 70 72 65       $e Interpre
191b0 74 65 72 2e 63 6f 6e 6e 65 63 74 69 6f 6e 73 5d  ter.connections]
191c0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
191d0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
191e0 20 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54             # NOT
191f0 45 3a 20 41 74 74 65 6d 70 74 20 74 6f 20 63 61  E: Attempt to ca
19200 6e 63 65 6c 20 61 6e 79 20 53 51 4c 20 71 75 65  ncel any SQL que
19210 72 69 65 73 20 69 6e 20 70 72 6f 67 72 65 73 73  ries in progress
19220 20 6f 6e 0d 0a 20 20 20 20 20 20 20 20 20 20 20   on..           
19230 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74         #       t
19240 68 69 73 20 64 61 74 61 62 61 73 65 20 63 6f 6e  his database con
19250 6e 65 63 74 69 6f 6e 2e 0d 0a 20 20 20 20 20 20  nection...      
19260 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20              #.. 
19270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19280 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 24 70 61   if {[catch {$pa
19290 69 72 20 56 61 6c 75 65 2e 43 61 6e 63 65 6c 7d  ir Value.Cancel}
192a0 20 65 72 72 6f 72 5d 7d 20 74 68 65 6e 20 7b 0d   error]} then {.
192b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
192c0 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
192d0 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
192e0 6e 64 41 72 67 73 20 5c 6e 20 5c 0d 0a 20 20 20  ndArgs \n \..   
192f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19300 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49       "==== WARNI
19310 4e 47 3a 20 66 61 69 6c 65 64 20 74 6f 20 63 61  NG: failed to ca
19320 6e 63 65 6c 20 71 75 65 72 79 20 66 6f 72 20 22  ncel query for "
19330 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
19340 20 20 20 20 20 20 20 20 20 20 20 20 22 63 6f 6e              "con
19350 6e 65 63 74 69 6f 6e 20 5c 22 22 20 5b 24 70 61  nection \"" [$pa
19360 69 72 20 4b 65 79 5d 20 22 5c 22 2c 20 65 72 72  ir Key] "\", err
19370 6f 72 3a 20 22 20 5c 6e 5c 74 20 5c 0d 0a 20 20  or: " \n\t \..  
19380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19390 20 20 20 20 20 20 24 65 72 72 6f 72 20 5c 6e 5d        $error \n]
193a0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
193b0 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
193c0 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
193d0 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b          } else {
193e0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
193f0 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
19400 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
19410 72 67 73 20 5c 6e 20 5c 0d 0a 20 20 20 20 20 20  rgs \n \..      
19420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 3d                "=
19430 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 63 61 6e  === WARNING: can
19440 6e 6f 74 20 63 61 6e 63 65 6c 20 61 6e 79 20 71  not cancel any q
19450 75 65 72 69 65 73 3a 20 22 20 5c 0d 0a 20 20 20  ueries: " \..   
19460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19470 20 22 74 68 65 20 5c 22 6f 62 6a 65 63 74 5c 22   "the \"object\"
19480 20 63 6f 6d 6d 61 6e 64 20 69 73 20 6e 6f 74 20   command is not 
19490 61 76 61 69 6c 61 62 6c 65 5c 6e 22 5d 0d 0a 20  available\n"].. 
194a0 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a               }..
194b0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
194c0 20 20 20 20 20 20 20 20 20 7d 7d 0d 0a 20 20 20           }}..   
194d0 20 20 20 20 20 7d 20 66 69 6e 61 6c 6c 79 20 7b       } finally {
194e0 0d 0a 20 20 20 20 20 20 20 20 20 20 72 65 73 74  ..          rest
194f0 6f 72 65 45 6e 76 69 72 6f 6e 6d 65 6e 74 56 61  oreEnvironmentVa
19500 72 69 61 62 6c 65 73 20 5b 6c 69 73 74 20 5c 0d  riables [list \.
19510 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 71  .              q
19520 75 69 65 74 46 69 6e 64 49 6e 74 65 72 70 72 65  uietFindInterpre
19530 74 65 72 54 65 73 74 50 61 74 68 20 71 75 69 65  terTestPath quie
19540 74 53 65 74 75 70 49 6e 74 65 72 70 72 65 74 65  tSetupInterprete
19550 72 54 65 73 74 50 61 74 68 5d 0d 0a 20 20 20 20  rTestPath]..    
19560 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 20 65      }..      } e
19570 72 72 6f 72 5d 20 3d 3d 20 30 7d 20 74 68 65 6e  rror] == 0} then
19580 20 7b 0d 0a 20 20 20 20 20 20 20 20 61 64 64 43   {..        addC
19590 6f 6e 73 74 72 61 69 6e 74 20 69 6e 74 65 72 72  onstraint interr
195a0 75 70 74 43 61 6c 6c 62 61 63 6b 2e 73 71 6c 69  uptCallback.sqli
195b0 74 65 33 0d 0a 0d 0a 20 20 20 20 20 20 20 20 74  te3....        t
195c0 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 79 65  puts $channel ye
195d0 73 5c 6e 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73  s\n..      } els
195e0 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75  e {..        tpu
195f0 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70  ts $channel [app
19600 65 6e 64 41 72 67 73 20 22 6e 6f 2c 20 65 72 72  endArgs "no, err
19610 6f 72 3a 20 22 20 5c 6e 5c 74 20 24 65 72 72 6f  or: " \n\t $erro
19620 72 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a  r \n]..      }..
19630 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
19640 6f 63 20 63 6c 65 61 6e 75 70 46 69 6c 65 20 7b  oc cleanupFile {
19650 20 66 69 6c 65 4e 61 6d 65 20 7b 63 6f 6c 6c 65   fileName {colle
19660 63 74 20 74 72 75 65 7d 20 7b 66 6f 72 63 65 20  ct true} {force 
19670 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a 20 20 20 20  false} } {..    
19680 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
19690 45 3a 20 41 74 74 65 6d 70 74 20 74 6f 20 66 6f  E: Attempt to fo
196a0 72 63 65 20 61 6c 6c 20 70 65 6e 64 69 6e 67 20  rce all pending 
196b0 22 67 61 72 62 61 67 65 22 20 6f 62 6a 65 63 74  "garbage" object
196c0 73 20 74 6f 20 62 65 20 63 6f 6c 6c 65 63 74 65  s to be collecte
196d0 64 2c 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  d,..      #     
196e0 20 20 69 6e 63 6c 75 64 69 6e 67 20 53 51 4c 69    including SQLi
196f0 74 65 20 73 74 61 74 65 6d 65 6e 74 73 20 61 6e  te statements an
19700 64 20 62 61 63 6b 75 70 20 6f 62 6a 65 63 74 73  d backup objects
19710 3b 20 74 68 69 73 20 73 68 6f 75 6c 64 20 61 6c  ; this should al
19720 6c 6f 77 0d 0a 20 20 20 20 20 20 23 20 20 20 20  low..      #    
19730 20 20 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e     the underlyin
19740 67 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  g database file 
19750 74 6f 20 62 65 20 64 65 6c 65 74 65 64 2e 0d 0a  to be deleted...
19760 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69        #..      i
19770 66 20 7b 24 63 6f 6c 6c 65 63 74 7d 20 74 68 65  f {$collect} the
19780 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 63 6f 6c  n {..        col
19790 6c 65 63 74 47 61 72 62 61 67 65 20 24 3a 3a 74  lectGarbage $::t
197a0 65 73 74 5f 63 68 61 6e 6e 65 6c 0d 0a 20 20 20  est_channel..   
197b0 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d     }....      #.
197c0 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43  .      # NOTE: C
197d0 68 65 63 6b 20 69 66 20 74 68 65 20 66 69 6c 65  heck if the file
197e0 20 73 74 69 6c 6c 20 65 78 69 73 74 73 2e 0d 0a   still exists...
197f0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69        #..      i
19800 66 20 7b 5b 66 69 6c 65 20 65 78 69 73 74 73 20  f {[file exists 
19810 24 66 69 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e  $fileName]} then
19820 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20   {..        #.. 
19830 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53         # NOTE: S
19840 6b 69 70 20 64 65 6c 65 74 69 6e 67 20 74 65 73  kip deleting tes
19850 74 20 66 69 6c 65 73 20 69 66 20 73 6f 6d 65 62  t files if someb
19860 6f 64 79 20 73 65 74 73 20 74 68 65 20 67 6c 6f  ody sets the glo
19870 62 61 6c 20 76 61 72 69 61 62 6c 65 0d 0a 20 20  bal variable..  
19880 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74 6f        #       to
19890 20 70 72 65 76 65 6e 74 20 69 74 2e 0d 0a 20 20   prevent it...  
198a0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
198b0 20 69 66 20 7b 24 66 6f 72 63 65 20 7c 7c 20 21   if {$force || !
198c0 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e  [info exists ::n
198d0 6f 28 63 6c 65 61 6e 75 70 46 69 6c 65 29 5d 7d  o(cleanupFile)]}
198e0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
198f0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
19900 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74 20  # NOTE: Attempt 
19910 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20 74 65  to delete the te
19920 73 74 20 66 69 6c 65 20 6e 6f 77 2e 0d 0a 20 20  st file now...  
19930 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
19940 20 20 20 20 20 69 66 20 7b 5b 73 65 74 20 63 6f       if {[set co
19950 64 65 20 5b 63 61 74 63 68 20 7b 66 69 6c 65 20  de [catch {file 
19960 64 65 6c 65 74 65 20 24 66 69 6c 65 4e 61 6d 65  delete $fileName
19970 7d 20 65 72 72 6f 72 5d 5d 7d 20 74 68 65 6e 20  } error]]} then 
19980 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23  {..            #
19990 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 20  ..            # 
199a0 4e 4f 54 45 3a 20 57 65 20 73 6f 6d 65 68 6f 77  NOTE: We somehow
199b0 20 66 61 69 6c 65 64 20 74 6f 20 64 65 6c 65 74   failed to delet
199c0 65 20 74 68 65 20 66 69 6c 65 2c 20 72 65 70 6f  e the file, repo
199d0 72 74 20 77 68 79 2e 0d 0a 20 20 20 20 20 20 20  rt why...       
199e0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
199f0 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
19a00 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e  t_channel [appen
19a10 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
19a20 20 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57           "==== W
19a30 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20 74  ARNING: failed t
19a40 6f 20 64 65 6c 65 74 65 20 74 65 73 74 20 66 69  o delete test fi
19a50 6c 65 20 5c 22 22 20 24 66 69 6c 65 4e 61 6d 65  le \"" $fileName
19a60 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
19a70 20 20 20 20 22 5c 22 20 64 75 72 69 6e 67 20 63      "\" during c
19a80 6c 65 61 6e 75 70 2c 20 65 72 72 6f 72 3a 20 22  leanup, error: "
19a90 20 5c 6e 5c 74 20 24 65 72 72 6f 72 20 5c 6e 5d   \n\t $error \n]
19aa0 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20  ..          }.. 
19ab0 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d         } else {.
19ac0 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
19ad0 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
19ae0 53 68 6f 77 20 74 68 61 74 20 77 65 20 73 6b 69  Show that we ski
19af0 70 70 65 64 20 64 65 6c 65 74 69 6e 67 20 74 68  pped deleting th
19b00 65 20 66 69 6c 65 2e 0d 0a 20 20 20 20 20 20 20  e file...       
19b10 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
19b20 73 65 74 20 63 6f 64 65 20 30 0d 0a 0d 0a 20 20  set code 0....  
19b30 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
19b40 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61  :test_channel [a
19b50 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
19b60 20 20 20 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d             "====
19b70 20 57 41 52 4e 49 4e 47 3a 20 73 6b 69 70 70 65   WARNING: skippe
19b80 64 20 64 65 6c 65 74 69 6e 67 20 74 65 73 74 20  d deleting test 
19b90 66 69 6c 65 20 5c 22 22 20 24 66 69 6c 65 4e 61  file \"" $fileNa
19ba0 6d 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  me \..          
19bb0 20 20 20 20 22 5c 22 20 64 75 72 69 6e 67 20 63      "\" during c
19bc0 6c 65 61 6e 75 70 5c 6e 22 5d 0d 0a 20 20 20 20  leanup\n"]..    
19bd0 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 20 65      }..      } e
19be0 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  lse {..        #
19bf0 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
19c00 3a 20 54 68 65 20 66 69 6c 65 20 64 6f 65 73 20  : The file does 
19c10 6e 6f 74 20 65 78 69 73 74 2c 20 73 75 63 63 65  not exist, succe
19c20 73 73 21 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  ss!..        #..
19c30 20 20 20 20 20 20 20 20 73 65 74 20 63 6f 64 65          set code
19c40 20 30 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20   0..      }.... 
19c50 20 20 20 20 20 72 65 74 75 72 6e 20 24 63 6f 64       return $cod
19c60 65 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  e..    }.....   
19c70 20 70 72 6f 63 20 63 6c 65 61 6e 75 70 4d 65 6d   proc cleanupMem
19c80 6f 72 79 20 7b 20 76 61 72 4e 61 6d 65 20 7b 71  ory { varName {q
19c90 75 69 65 74 20 66 61 6c 73 65 7d 20 7d 20 7b 0d  uiet false} } {.
19ca0 0a 20 20 20 20 20 20 69 66 20 7b 5b 68 61 76 65  .      if {[have
19cb0 53 51 4c 69 74 65 4f 62 6a 65 63 74 43 6f 6d 6d  SQLiteObjectComm
19cc0 61 6e 64 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20  and] && \..     
19cd0 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e       [string len
19ce0 67 74 68 20 24 76 61 72 4e 61 6d 65 5d 20 3e 20  gth $varName] > 
19cf0 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
19d00 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
19d10 4e 4f 54 45 3a 20 52 65 66 65 72 20 74 6f 20 74  NOTE: Refer to t
19d20 68 65 20 73 70 65 63 69 66 69 65 64 20 76 61 72  he specified var
19d30 69 61 62 6c 65 20 28 65 2e 67 2e 20 22 63 6f 6e  iable (e.g. "con
19d40 6e 65 63 74 69 6f 6e 22 29 20 69 6e 20 74 68 65  nection") in the
19d50 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
19d60 20 20 63 6f 6e 74 65 78 74 20 6f 66 20 6f 75 72    context of our
19d70 20 63 61 6c 6c 65 72 2e 20 20 54 68 65 20 6f 70   caller.  The op
19d80 61 71 75 65 20 6f 62 6a 65 63 74 20 68 61 6e 64  aque object hand
19d90 6c 65 20 66 6f 72 20 61 6e 0d 0a 20 20 20 20 20  le for an..     
19da0 20 20 20 23 20 20 20 20 20 20 20 41 44 4f 2e 4e     #       ADO.N
19db0 45 54 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 72  ET connection pr
19dc0 65 76 69 6f 75 73 6c 79 20 72 65 74 75 72 6e 65  eviously returne
19dd0 64 20 62 79 20 5b 67 65 74 44 62 43 6f 6e 6e 65  d by [getDbConne
19de0 63 74 69 6f 6e 5d 0d 0a 20 20 20 20 20 20 20 20  ction]..        
19df0 23 20 20 20 20 20 20 20 73 68 6f 75 6c 64 20 62  #       should b
19e00 65 20 73 74 6f 72 65 64 20 74 68 65 72 65 2e 0d  e stored there..
19e10 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
19e20 20 20 20 20 75 70 76 61 72 20 31 20 24 76 61 72      upvar 1 $var
19e30 4e 61 6d 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0d  Name connection.
19e40 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b  ...        if {[
19e50 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20  catch {..       
19e60 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65     object invoke
19e70 20 24 63 6f 6e 6e 65 63 74 69 6f 6e 20 52 65 6c   $connection Rel
19e80 65 61 73 65 4d 65 6d 6f 72 79 0d 0a 20 20 20 20  easeMemory..    
19e90 20 20 20 20 7d 20 72 65 73 75 6c 74 5d 7d 20 74      } result]} t
19ea0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
19eb0 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68   if {!$quiet} th
19ec0 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
19ed0 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
19ee0 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
19ef0 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
19f00 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52         "==== WAR
19f10 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20 74 6f 20  NING: failed to 
19f20 72 65 6c 65 61 73 65 20 64 61 74 61 62 61 73 65  release database
19f30 20 6d 65 6d 6f 72 79 2c 20 65 72 72 6f 72 3a 20   memory, error: 
19f40 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  " \..           
19f50 20 20 20 20 20 5c 6e 5c 74 20 24 72 65 73 75 6c       \n\t $resul
19f60 74 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20  t \n]..         
19f70 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20   }..        }.. 
19f80 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
19f90 69 66 20 7b 5b 6c 6c 65 6e 67 74 68 20 5b 69 6e  if {[llength [in
19fa0 66 6f 20 63 6f 6d 6d 61 6e 64 73 20 64 65 62 75  fo commands debu
19fb0 67 5d 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d  g]] > 0} then {.
19fc0 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61  .        if {[ca
19fd0 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  tch {..         
19fe0 20 75 70 6c 65 76 65 6c 20 31 20 5b 6c 69 73 74   uplevel 1 [list
19ff0 20 64 65 62 75 67 20 70 75 72 67 65 5d 0d 0a 20   debug purge].. 
1a000 20 20 20 20 20 20 20 7d 20 72 65 73 75 6c 74 5d         } result]
1a010 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
1a020 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d      if {!$quiet}
1a030 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
1a040 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
1a050 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
1a060 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
1a070 20 20 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20            "==== 
1a080 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20  WARNING: failed 
1a090 74 6f 20 70 75 72 67 65 20 63 61 6c 6c 20 66 72  to purge call fr
1a0a0 61 6d 65 2c 20 65 72 72 6f 72 3a 20 22 20 5c 0d  ame, error: " \.
1a0b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1a0c0 20 5c 6e 5c 74 20 24 72 65 73 75 6c 74 20 5c 6e   \n\t $result \n
1a0d0 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  ]..          }..
1a0e0 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
1a0f0 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20       if {[catch 
1a100 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 75 70 6c  {..          upl
1a110 65 76 65 6c 20 31 20 5b 6c 69 73 74 20 64 65 62  evel 1 [list deb
1a120 75 67 20 63 6c 65 61 6e 75 70 5d 0d 0a 20 20 20  ug cleanup]..   
1a130 20 20 20 20 20 7d 20 72 65 73 75 6c 74 5d 7d 20       } result]} 
1a140 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
1a150 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74    if {!$quiet} t
1a160 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
1a170 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
1a180 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  _channel [append
1a190 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
1a1a0 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41          "==== WA
1a1b0 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20 74 6f  RNING: failed to
1a1c0 20 63 6c 65 61 6e 75 70 20 69 6e 74 65 72 70 72   cleanup interpr
1a1d0 65 74 65 72 2c 20 65 72 72 6f 72 3a 20 22 20 5c  eter, error: " \
1a1e0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1a1f0 20 20 5c 6e 5c 74 20 24 72 65 73 75 6c 74 20 5c    \n\t $result \
1a200 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d  n]..          }.
1a210 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  .        }....  
1a220 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68        if {[catch
1a230 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 75 70   {..          up
1a240 6c 65 76 65 6c 20 31 20 5b 6c 69 73 74 20 64 65  level 1 [list de
1a250 62 75 67 20 63 6f 6c 6c 65 63 74 5d 0d 0a 20 20  bug collect]..  
1a260 20 20 20 20 20 20 7d 20 72 65 73 75 6c 74 5d 7d        } result]}
1a270 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
1a280 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20     if {!$quiet} 
1a290 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
1a2a0 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
1a2b0 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e  t_channel [appen
1a2c0 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
1a2d0 20 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57           "==== W
1a2e0 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20 74  ARNING: failed t
1a2f0 6f 20 63 6f 6c 6c 65 63 74 20 67 61 72 62 61 67  o collect garbag
1a300 65 2c 20 65 72 72 6f 72 3a 20 22 20 5c 0d 0a 20  e, error: " \.. 
1a310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
1a320 6e 5c 74 20 24 72 65 73 75 6c 74 20 5c 6e 5d 0d  n\t $result \n].
1a330 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  .          }..  
1a340 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d        }..      }
1a350 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
1a360 70 72 6f 63 20 73 65 74 75 70 4d 65 6d 6f 72 79  proc setupMemory
1a370 43 6f 75 6e 74 65 72 73 20 7b 20 76 61 72 4e 61  Counters { varNa
1a380 6d 65 20 7d 20 7b 0d 0a 20 20 20 20 20 20 69 66  me } {..      if
1a390 20 7b 5b 68 61 76 65 53 51 4c 69 74 65 4f 62 6a   {[haveSQLiteObj
1a3a0 65 63 74 43 6f 6d 6d 61 6e 64 5d 7d 20 74 68 65  ectCommand]} the
1a3b0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 75 70 76  n {..        upv
1a3c0 61 72 20 31 20 24 76 61 72 4e 61 6d 65 20 63 6f  ar 1 $varName co
1a3d0 75 6e 74 65 72 0d 0a 0d 0a 20 20 20 20 20 20 20  unter....       
1a3e0 20 73 65 74 20 63 6f 75 6e 74 65 72 28 31 29 20   set counter(1) 
1a3f0 5b 6f 62 6a 65 63 74 20 63 72 65 61 74 65 20 2d  [object create -
1a400 61 6c 69 61 73 20 5c 0d 0a 20 20 20 20 20 20 20  alias \..       
1a410 20 20 20 20 20 53 79 73 74 65 6d 2e 44 69 61 67       System.Diag
1a420 6e 6f 73 74 69 63 73 2e 50 65 72 66 6f 72 6d 61  nostics.Performa
1a430 6e 63 65 43 6f 75 6e 74 65 72 20 50 72 6f 63 65  nceCounter Proce
1a440 73 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  ss \..          
1a450 20 20 22 57 6f 72 6b 69 6e 67 20 53 65 74 22 20    "Working Set" 
1a460 5b 66 69 6c 65 20 72 6f 6f 74 6e 61 6d 65 20 5b  [file rootname [
1a470 66 69 6c 65 20 74 61 69 6c 20 24 3a 3a 62 69 6e  file tail $::bin
1a480 5f 66 69 6c 65 5d 5d 5d 0d 0a 0d 0a 20 20 20 20  _file]]]....    
1a490 20 20 20 20 73 65 74 20 63 6f 75 6e 74 65 72 28      set counter(
1a4a0 32 29 20 5b 6f 62 6a 65 63 74 20 63 72 65 61 74  2) [object creat
1a4b0 65 20 2d 61 6c 69 61 73 20 5c 0d 0a 20 20 20 20  e -alias \..    
1a4c0 20 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44          System.D
1a4d0 69 61 67 6e 6f 73 74 69 63 73 2e 50 65 72 66 6f  iagnostics.Perfo
1a4e0 72 6d 61 6e 63 65 43 6f 75 6e 74 65 72 20 50 72  rmanceCounter Pr
1a4f0 6f 63 65 73 73 20 5c 0d 0a 20 20 20 20 20 20 20  ocess \..       
1a500 20 20 20 20 20 22 57 6f 72 6b 69 6e 67 20 53 65       "Working Se
1a510 74 20 50 65 61 6b 22 20 5b 66 69 6c 65 20 72 6f  t Peak" [file ro
1a520 6f 74 6e 61 6d 65 20 5b 66 69 6c 65 20 74 61 69  otname [file tai
1a530 6c 20 24 3a 3a 62 69 6e 5f 66 69 6c 65 5d 5d 5d  l $::bin_file]]]
1a540 0d 0a 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20  ....        set 
1a550 63 6f 75 6e 74 65 72 28 33 29 20 5b 6f 62 6a 65  counter(3) [obje
1a560 63 74 20 63 72 65 61 74 65 20 2d 61 6c 69 61 73  ct create -alias
1a570 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
1a580 53 79 73 74 65 6d 2e 44 69 61 67 6e 6f 73 74 69  System.Diagnosti
1a590 63 73 2e 50 65 72 66 6f 72 6d 61 6e 63 65 43 6f  cs.PerformanceCo
1a5a0 75 6e 74 65 72 20 50 72 6f 63 65 73 73 20 5c 0d  unter Process \.
1a5b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 50 72  .            "Pr
1a5c0 69 76 61 74 65 20 42 79 74 65 73 22 20 5b 66 69  ivate Bytes" [fi
1a5d0 6c 65 20 72 6f 6f 74 6e 61 6d 65 20 5b 66 69 6c  le rootname [fil
1a5e0 65 20 74 61 69 6c 20 24 3a 3a 62 69 6e 5f 66 69  e tail $::bin_fi
1a5f0 6c 65 5d 5d 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a  le]]]..      }..
1a600 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 22  ..      return "
1a610 22 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  "..    }.....   
1a620 20 70 72 6f 63 20 72 65 70 6f 72 74 4d 65 6d 6f   proc reportMemo
1a630 72 79 43 6f 75 6e 74 65 72 73 20 7b 20 63 68 61  ryCounters { cha
1a640 6e 6e 65 6c 20 76 61 72 4e 61 6d 65 20 70 72 65  nnel varName pre
1a650 66 69 78 20 7d 20 7b 0d 0a 20 20 20 20 20 20 69  fix } {..      i
1a660 66 20 7b 5b 68 61 76 65 53 51 4c 69 74 65 4f 62  f {[haveSQLiteOb
1a670 6a 65 63 74 43 6f 6d 6d 61 6e 64 5d 7d 20 74 68  jectCommand]} th
1a680 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 75 70  en {..        up
1a690 76 61 72 20 31 20 24 76 61 72 4e 61 6d 65 20 63  var 1 $varName c
1a6a0 6f 75 6e 74 65 72 0d 0a 0d 0a 20 20 20 20 20 20  ounter....      
1a6b0 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
1a6c0 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
1a6d0 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
1a6e0 2d 20 22 20 24 70 72 65 66 69 78 20 22 20 63 6f  - " $prefix " co
1a6f0 75 6e 74 65 72 20 5c 22 22 20 5c 0d 0a 20 20 20  unter \"" \..   
1a700 20 20 20 20 20 20 20 20 20 5b 6f 62 6a 65 63 74           [object
1a710 20 69 6e 76 6f 6b 65 20 24 63 6f 75 6e 74 65 72   invoke $counter
1a720 28 31 29 20 43 6f 75 6e 74 65 72 4e 61 6d 65 5d  (1) CounterName]
1a730 20 22 5c 22 20 76 61 6c 75 65 20 69 73 20 22 20   "\" value is " 
1a740 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b  \..            [
1a750 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 24 63  object invoke $c
1a760 6f 75 6e 74 65 72 28 31 29 20 52 61 77 56 61 6c  ounter(1) RawVal
1a770 75 65 5d 20 5c 6e 5d 0d 0a 0d 0a 20 20 20 20 20  ue] \n]....     
1a780 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
1a790 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
1a7a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d  .            "--
1a7b0 2d 2d 20 22 20 24 70 72 65 66 69 78 20 22 20 63  -- " $prefix " c
1a7c0 6f 75 6e 74 65 72 20 5c 22 22 20 5c 0d 0a 20 20  ounter \"" \..  
1a7d0 20 20 20 20 20 20 20 20 20 20 5b 6f 62 6a 65 63            [objec
1a7e0 74 20 69 6e 76 6f 6b 65 20 24 63 6f 75 6e 74 65  t invoke $counte
1a7f0 72 28 32 29 20 43 6f 75 6e 74 65 72 4e 61 6d 65  r(2) CounterName
1a800 5d 20 22 5c 22 20 76 61 6c 75 65 20 69 73 20 22  ] "\" value is "
1a810 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
1a820 5b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 24  [object invoke $
1a830 63 6f 75 6e 74 65 72 28 32 29 20 52 61 77 56 61  counter(2) RawVa
1a840 6c 75 65 5d 20 5c 6e 5d 0d 0a 0d 0a 20 20 20 20  lue] \n]....    
1a850 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
1a860 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
1a870 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 2d  ..            "-
1a880 2d 2d 2d 20 22 20 24 70 72 65 66 69 78 20 22 20  --- " $prefix " 
1a890 63 6f 75 6e 74 65 72 20 5c 22 22 20 5c 0d 0a 20  counter \"" \.. 
1a8a0 20 20 20 20 20 20 20 20 20 20 20 5b 6f 62 6a 65             [obje
1a8b0 63 74 20 69 6e 76 6f 6b 65 20 24 63 6f 75 6e 74  ct invoke $count
1a8c0 65 72 28 33 29 20 43 6f 75 6e 74 65 72 4e 61 6d  er(3) CounterNam
1a8d0 65 5d 20 22 5c 22 20 76 61 6c 75 65 20 69 73 20  e] "\" value is 
1a8e0 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  " \..           
1a8f0 20 5b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20   [object invoke 
1a900 24 63 6f 75 6e 74 65 72 28 33 29 20 52 61 77 56  $counter(3) RawV
1a910 61 6c 75 65 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20  alue] \n]..     
1a920 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20   }..    }.....  
1a930 20 20 70 72 6f 63 20 63 6f 6c 6c 65 63 74 47 61    proc collectGa
1a940 72 62 61 67 65 20 7b 20 63 68 61 6e 6e 65 6c 20  rbage { channel 
1a950 7b 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20 31 30  {milliseconds 10
1a960 30 30 7d 20 7b 71 75 69 65 74 20 74 72 75 65 7d  00} {quiet true}
1a970 20 7d 20 7b 0d 0a 20 20 20 20 20 20 69 66 20 7b   } {..      if {
1a980 5b 68 61 76 65 53 51 4c 69 74 65 4f 62 6a 65 63  [haveSQLiteObjec
1a990 74 43 6f 6d 6d 61 6e 64 5d 7d 20 74 68 65 6e 20  tCommand]} then 
1a9a0 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b  {..        if {[
1a9b0 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20  catch {..       
1a9c0 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65     object invoke
1a9d0 20 47 43 20 47 65 74 54 6f 74 61 6c 4d 65 6d 6f   GC GetTotalMemo
1a9e0 72 79 20 66 61 6c 73 65 0d 0a 20 20 20 20 20 20  ry false..      
1a9f0 20 20 7d 20 72 65 73 75 6c 74 5d 20 3d 3d 20 30    } result] == 0
1aa00 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
1aa10 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d      if {!$quiet}
1aa20 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
1aa30 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
1aa40 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
1aa50 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
1aa60 20 20 20 22 2d 2d 2d 2d 20 6d 65 6d 6f 72 79 20     "---- memory 
1aa70 69 6e 20 75 73 65 20 62 79 20 74 68 65 20 43 4c  in use by the CL
1aa80 52 20 62 65 66 6f 72 65 20 63 6f 6c 6c 65 63 74  R before collect
1aa90 69 6f 6e 2e 2e 2e 20 22 20 5c 0d 0a 20 20 20 20  ion... " \..    
1aaa0 20 20 20 20 20 20 20 20 20 20 20 20 24 72 65 73              $res
1aab0 75 6c 74 20 22 20 62 79 74 65 73 5c 6e 22 5d 0d  ult " bytes\n"].
1aac0 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  .          }..  
1aad0 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
1aae0 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
1aaf0 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  $channel [append
1ab00 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
1ab10 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e        "==== WARN
1ab20 49 4e 47 3a 20 66 61 69 6c 65 64 20 74 6f 20 67  ING: failed to g
1ab30 65 74 20 43 4c 52 20 6d 65 6d 6f 72 79 20 75 73  et CLR memory us
1ab40 61 67 65 2c 20 65 72 72 6f 72 3a 20 22 20 5c 0d  age, error: " \.
1ab50 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c  .              \
1ab60 6e 5c 74 20 24 72 65 73 75 6c 74 20 5c 6e 5d 0d  n\t $result \n].
1ab70 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  .        }..    
1ab80 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 23 23    }....      ###
1ab90 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1aba0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1abb0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1abc0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1abd0 23 23 23 23 23 23 0d 0a 0d 0a 20 20 20 20 20 20  ######....      
1abe0 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
1abf0 20 52 65 70 65 61 74 65 64 6c 79 20 61 74 74 65   Repeatedly atte
1ac00 6d 70 74 20 74 6f 20 63 6f 6c 6c 65 63 74 20 67  mpt to collect g
1ac10 61 72 62 61 67 65 20 75 6e 74 69 6c 20 74 68 65  arbage until the
1ac20 20 61 6c 6c 6f 74 74 65 64 20 6e 75 6d 62 65 72   allotted number
1ac30 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
1ac40 6f 66 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20  of milliseconds 
1ac50 68 61 73 20 65 6c 61 70 73 65 64 2e 20 20 41 6c  has elapsed.  Al
1ac60 77 61 79 73 20 61 74 74 65 6d 70 74 20 74 6f 20  ways attempt to 
1ac70 63 6f 6c 6c 65 63 74 20 67 61 72 62 61 67 65 0d  collect garbage.
1ac80 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 61  .      #       a
1ac90 74 20 6c 65 61 73 74 20 6f 6e 63 65 2e 0d 0a 20  t least once... 
1aca0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66       #..      if
1acb0 20 7b 5b 68 61 76 65 53 51 4c 69 74 65 4f 62 6a   {[haveSQLiteObj
1acc0 65 63 74 43 6f 6d 6d 61 6e 64 5d 7d 20 74 68 65  ectCommand]} the
1acd0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 65 74  n {..        set
1ace0 20 73 74 61 72 74 20 5b 63 6c 6f 63 6b 20 73 65   start [clock se
1acf0 63 6f 6e 64 73 5d 0d 0a 20 20 20 20 20 20 20 20  conds]..        
1ad00 73 65 74 20 73 74 6f 70 20 5b 65 78 70 72 20 7b  set stop [expr {
1ad10 24 73 74 61 72 74 20 2b 20 28 24 6d 69 6c 6c 69  $start + ($milli
1ad20 73 65 63 6f 6e 64 73 20 2f 20 31 30 30 30 29 7d  seconds / 1000)}
1ad30 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 64 6f 20  ]....        do 
1ad40 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a  {..          #..
1ad50 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45            # NOTE
1ad60 3a 20 41 74 74 65 6d 70 74 20 74 6f 20 66 6f 72  : Attempt to for
1ad70 63 65 20 61 20 66 75 6c 6c 20 67 61 72 62 61 67  ce a full garbag
1ad80 65 20 63 6f 6c 6c 65 63 74 69 6f 6e 20 6e 6f 77  e collection now
1ad90 2e 20 20 52 65 70 6f 72 74 20 61 6e 79 0d 0a 20  .  Report any.. 
1ada0 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20           #      
1adb0 20 65 72 72 6f 72 20 74 68 61 74 20 69 73 20 65   error that is e
1adc0 6e 63 6f 75 6e 74 65 72 65 64 20 69 66 20 77 65  ncountered if we
1add0 20 66 61 69 6c 2e 0d 0a 20 20 20 20 20 20 20 20   fail...        
1ade0 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 69    #..          i
1adf0 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20  f {[catch {..   
1ae00 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20           object 
1ae10 69 6e 76 6f 6b 65 20 47 43 20 47 65 74 54 6f 74  invoke GC GetTot
1ae20 61 6c 4d 65 6d 6f 72 79 20 74 72 75 65 0d 0a 20  alMemory true.. 
1ae30 20 20 20 20 20 20 20 20 20 7d 20 65 72 72 6f 72           } error
1ae40 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
1ae50 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
1ae60 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
1ae70 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
1ae80 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49       "==== WARNI
1ae90 4e 47 3a 20 66 61 69 6c 65 64 20 66 75 6c 6c 20  NG: failed full 
1aea0 67 61 72 62 61 67 65 20 63 6f 6c 6c 65 63 74 69  garbage collecti
1aeb0 6f 6e 2c 20 65 72 72 6f 72 3a 20 22 20 5c 0d 0a  on, error: " \..
1aec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aed0 5c 6e 5c 74 20 24 65 72 72 6f 72 20 5c 6e 5d 0d  \n\t $error \n].
1aee0 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  .          }....
1aef0 20 20 20 20 20 20 20 20 20 20 73 65 74 20 6e 6f            set no
1af00 77 20 5b 63 6c 6f 63 6b 20 73 65 63 6f 6e 64 73  w [clock seconds
1af10 5d 0d 0a 20 20 20 20 20 20 20 20 7d 20 77 68 69  ]..        } whi
1af20 6c 65 20 7b 24 73 74 61 72 74 20 3c 3d 20 24 6e  le {$start <= $n
1af30 6f 77 20 26 26 20 24 6e 6f 77 20 3c 20 24 73 74  ow && $now < $st
1af40 6f 70 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a  op}..      }....
1af50 20 20 20 20 20 20 23 23 23 23 23 23 23 23 23 23        ##########
1af60 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1af70 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1af80 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1af90 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0d  ###############.
1afa0 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 68 61  ...      if {[ha
1afb0 76 65 53 51 4c 69 74 65 4f 62 6a 65 63 74 43 6f  veSQLiteObjectCo
1afc0 6d 6d 61 6e 64 5d 7d 20 74 68 65 6e 20 7b 0d 0a  mmand]} then {..
1afd0 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74          if {[cat
1afe0 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  ch {..          
1aff0 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 47 43  object invoke GC
1b000 20 47 65 74 54 6f 74 61 6c 4d 65 6d 6f 72 79 20   GetTotalMemory 
1b010 66 61 6c 73 65 0d 0a 20 20 20 20 20 20 20 20 7d  false..        }
1b020 20 72 65 73 75 6c 74 5d 20 3d 3d 20 30 7d 20 74   result] == 0} t
1b030 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
1b040 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68   if {!$quiet} th
1b050 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
1b060 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
1b070 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
1b080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b090 22 2d 2d 2d 2d 20 6d 65 6d 6f 72 79 20 69 6e 20  "---- memory in 
1b0a0 75 73 65 20 62 79 20 74 68 65 20 43 4c 52 20 61  use by the CLR a
1b0b0 66 74 65 72 20 63 6f 6c 6c 65 63 74 69 6f 6e 2e  fter collection.
1b0c0 2e 2e 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20  .. " \..        
1b0d0 20 20 20 20 20 20 20 20 24 72 65 73 75 6c 74 20          $result 
1b0e0 22 20 62 79 74 65 73 5c 6e 22 5d 0d 0a 20 20 20  " bytes\n"]..   
1b0f0 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
1b100 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
1b110 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
1b120 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
1b130 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
1b140 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a    "==== WARNING:
1b150 20 66 61 69 6c 65 64 20 74 6f 20 67 65 74 20 43   failed to get C
1b160 4c 52 20 6d 65 6d 6f 72 79 20 75 73 61 67 65 2c  LR memory usage,
1b170 20 65 72 72 6f 72 3a 20 22 20 5c 0d 0a 20 20 20   error: " \..   
1b180 20 20 20 20 20 20 20 20 20 20 20 5c 6e 5c 74 20             \n\t 
1b190 24 72 65 73 75 6c 74 20 5c 6e 5d 0d 0a 20 20 20  $result \n]..   
1b1a0 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d       }..      }.
1b1b0 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70  .    }.....    p
1b1c0 72 6f 63 20 67 65 74 53 51 4c 69 74 65 48 61 6e  roc getSQLiteHan
1b1d0 64 6c 65 43 6f 75 6e 74 73 20 7b 20 63 68 61 6e  dleCounts { chan
1b1e0 6e 65 6c 20 7b 71 75 69 65 74 20 66 61 6c 73 65  nel {quiet false
1b1f0 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 73 65 74  } } {..      set
1b200 20 72 65 73 75 6c 74 20 5b 6c 69 73 74 5d 0d 0a   result [list]..
1b210 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 68 61 76  ..      if {[hav
1b220 65 53 51 4c 69 74 65 4f 62 6a 65 63 74 43 6f 6d  eSQLiteObjectCom
1b230 6d 61 6e 64 5d 20 26 26 20 5c 0d 0a 20 20 20 20  mand] && \..    
1b240 20 20 20 20 20 20 5b 68 61 76 65 53 51 4c 69 74        [haveSQLit
1b250 65 44 65 66 69 6e 65 43 6f 6e 73 74 61 6e 74 20  eDefineConstant 
1b260 43 4f 55 4e 54 5f 48 41 4e 44 4c 45 5d 7d 20 74  COUNT_HANDLE]} t
1b270 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  hen {..        #
1b280 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
1b290 3a 20 41 64 64 20 65 61 63 68 20 63 72 69 74 69  : Add each criti
1b2a0 63 61 6c 20 68 61 6e 64 6c 65 20 63 6f 75 6e 74  cal handle count
1b2b0 20 74 6f 20 74 68 65 20 72 65 73 75 6c 74 69 6e   to the resultin
1b2c0 67 20 6c 69 73 74 2e 0d 0a 20 20 20 20 20 20 20  g list...       
1b2d0 20 23 0d 0a 20 20 20 20 20 20 20 20 66 6f 72 65   #..        fore
1b2e0 61 63 68 20 6e 61 6d 65 20 5b 6c 69 73 74 20 63  ach name [list c
1b2f0 6f 6e 6e 65 63 74 69 6f 6e 43 6f 75 6e 74 20 73  onnectionCount s
1b300 74 61 74 65 6d 65 6e 74 43 6f 75 6e 74 20 62 61  tatementCount ba
1b310 63 6b 75 70 43 6f 75 6e 74 5d 20 7b 0d 0a 20 20  ckupCount] {..  
1b320 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74          if {[cat
1b330 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  ch {..          
1b340 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20    object invoke 
1b350 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69  -flags +NonPubli
1b360 63 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  c \..           
1b370 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61       System.Data
1b380 2e 53 51 4c 69 74 65 2e 44 65 62 75 67 44 61 74  .SQLite.DebugDat
1b390 61 20 24 6e 61 6d 65 0d 0a 20 20 20 20 20 20 20  a $name..       
1b3a0 20 20 20 7d 20 76 61 6c 75 65 5d 20 3d 3d 20 30     } value] == 0
1b3b0 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
1b3c0 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65        if {!$quie
1b3d0 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  t} then {..     
1b3e0 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
1b3f0 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
1b400 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
1b410 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63           "---- c
1b420 72 69 74 69 63 61 6c 20 68 61 6e 64 6c 65 20 63  ritical handle c
1b430 6f 75 6e 74 20 5c 22 22 20 24 6e 61 6d 65 20 22  ount \"" $name "
1b440 5c 22 20 69 73 20 22 20 24 76 61 6c 75 65 20 5c  \" is " $value \
1b450 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  n]..            
1b460 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  }....           
1b470 20 6c 61 70 70 65 6e 64 20 72 65 73 75 6c 74 20   lappend result 
1b480 24 76 61 6c 75 65 0d 0a 20 20 20 20 20 20 20 20  $value..        
1b490 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
1b4a0 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
1b4b0 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
1b4c0 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
1b4d0 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e        "==== WARN
1b4e0 49 4e 47 3a 20 66 61 69 6c 65 64 20 74 6f 20 67  ING: failed to g
1b4f0 65 74 20 63 72 69 74 69 63 61 6c 20 68 61 6e 64  et critical hand
1b500 6c 65 20 63 6f 75 6e 74 20 5c 22 22 20 5c 0d 0a  le count \"" \..
1b510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b520 24 6e 61 6d 65 20 22 5c 22 2c 20 65 72 72 6f 72  $name "\", error
1b530 3a 20 22 20 5c 6e 5c 74 20 24 76 61 6c 75 65 20  : " \n\t $value 
1b540 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  \n]..          }
1b550 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20  ..        }..   
1b560 20 20 20 7d 20 65 6c 73 65 69 66 20 7b 21 24 71     } elseif {!$q
1b570 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  uiet} then {..  
1b580 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
1b590 20 23 20 4e 4f 54 45 3a 20 54 68 65 20 61 63 74   # NOTE: The act
1b5a0 75 61 6c 20 68 61 6e 64 6c 65 20 63 6f 75 6e 74  ual handle count
1b5b0 73 20 61 72 65 20 6e 6f 74 20 61 76 61 69 6c 61  s are not availa
1b5c0 62 6c 65 3b 20 74 68 65 72 65 66 6f 72 65 2c 20  ble; therefore, 
1b5d0 6a 75 73 74 0d 0a 20 20 20 20 20 20 20 20 23 20  just..        # 
1b5e0 20 20 20 20 20 20 72 65 74 75 72 6e 20 61 6e 20        return an 
1b5f0 65 6d 70 74 79 20 6c 69 73 74 2e 0d 0a 20 20 20  empty list...   
1b600 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
1b610 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 22  tputs $channel "
1b620 2d 2d 2d 2d 20 63 72 69 74 69 63 61 6c 20 68 61  ---- critical ha
1b630 6e 64 6c 65 20 63 6f 75 6e 74 73 20 75 6e 61 76  ndle counts unav
1b640 61 69 6c 61 62 6c 65 5c 6e 22 0d 0a 20 20 20 20  ailable\n"..    
1b650 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65 74    }....      ret
1b660 75 72 6e 20 24 72 65 73 75 6c 74 0d 0a 20 20 20  urn $result..   
1b670 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
1b680 73 68 75 74 64 6f 77 6e 53 51 4c 69 74 65 20 7b  shutdownSQLite {
1b690 20 63 68 61 6e 6e 65 6c 20 7b 66 6f 72 63 65 20   channel {force 
1b6a0 66 61 6c 73 65 7d 20 7b 71 75 69 65 74 20 66 61  false} {quiet fa
1b6b0 6c 73 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20  lse} } {..      
1b6c0 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
1b6d0 20 4d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20   Make sure that 
1b6e0 53 51 4c 69 74 65 20 63 6f 72 65 20 6c 69 62 72  SQLite core libr
1b6f0 61 72 79 20 69 73 20 63 6f 6d 70 6c 65 74 65 6c  ary is completel
1b700 79 20 73 68 75 74 64 6f 77 6e 2e 20 20 54 68 69  y shutdown.  Thi
1b710 73 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  s..      #      
1b720 20 69 73 20 75 73 65 64 20 62 79 20 74 65 73 74   is used by test
1b730 73 20 74 68 61 74 20 63 68 61 6e 67 65 20 63 6f  s that change co
1b740 6e 66 69 67 75 72 61 74 69 6f 6e 20 6f 70 74 69  nfiguration opti
1b750 6f 6e 73 20 61 6e 64 2f 6f 72 20 74 68 6f 73 65  ons and/or those
1b760 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
1b770 74 68 61 74 20 6e 65 65 64 20 74 6f 20 6d 61 6b  that need to mak
1b780 65 20 73 75 72 65 20 6c 6f 67 67 69 6e 67 20 69  e sure logging i
1b790 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 28 69  s initialized (i
1b7a0 2e 65 2e 20 6a 75 73 74 20 69 6e 20 63 61 73 65  .e. just in case
1b7b0 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
1b7c0 74 68 65 20 53 51 4c 69 74 65 20 63 6f 72 65 20  the SQLite core 
1b7d0 6c 69 62 72 61 72 79 20 77 61 73 20 69 6e 69 74  library was init
1b7e0 69 61 6c 69 7a 65 64 20 69 6e 20 74 68 65 20 70  ialized in the p
1b7f0 72 6f 63 65 73 73 20 70 72 69 6f 72 20 74 6f 0d  rocess prior to.
1b800 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74  .      #       t
1b810 68 65 20 53 51 4c 69 74 65 4c 6f 67 20 63 6c 61  he SQLiteLog cla
1b820 73 73 20 62 65 69 6e 67 20 61 62 6c 65 20 74 6f  ss being able to
1b830 20 73 65 74 75 70 20 69 74 73 20 6c 6f 67 67 69   setup its loggi
1b840 6e 67 20 63 61 6c 6c 62 61 63 6b 29 2e 0d 0a 20  ng callback)... 
1b850 20 20 20 20 20 23 20 20 20 20 20 20 20 4e 6f 72       #       Nor
1b860 6d 61 6c 6c 79 2c 20 74 68 69 73 20 73 68 6f 75  mally, this shou
1b870 6c 64 20 6f 6e 6c 79 20 62 65 20 70 65 72 66 6f  ld only be perfo
1b880 72 6d 65 64 20 69 66 20 53 51 4c 69 74 65 20 69  rmed if SQLite i
1b890 73 20 6c 6f 61 64 65 64 20 61 6e 64 0d 0a 20 20  s loaded and..  
1b8a0 20 20 20 20 23 20 20 20 20 20 20 20 72 65 61 64      #       read
1b8b0 79 20 66 6f 72 20 75 73 65 20 62 79 20 74 68 65  y for use by the
1b8c0 20 74 65 73 74 20 73 75 69 74 65 2e 0d 0a 20 20   test suite...  
1b8d0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20      #..      if 
1b8e0 7b 24 66 6f 72 63 65 20 7c 7c 20 5b 69 73 53 51  {$force || [isSQ
1b8f0 4c 69 74 65 52 65 61 64 79 5d 7d 20 74 68 65 6e  LiteReady]} then
1b900 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20   {..        #.. 
1b910 20 20 20 20 20 20 20 23 20 42 55 47 46 49 58 3a         # BUGFIX:
1b920 20 4d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20   Make sure that 
1b930 61 6e 79 20 22 6c 65 61 6b 65 64 22 20 74 72 61  any "leaked" tra
1b940 6e 73 61 63 74 69 6f 6e 73 20 61 6e 64 2f 6f 72  nsactions and/or
1b950 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 0d 0a 20 20   connections..  
1b960 20 20 20 20 20 20 23 20 20 20 20 20 20 20 20 20        #         
1b970 61 72 65 20 63 6c 65 61 6e 65 64 20 75 70 20 62  are cleaned up b
1b980 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 74 68  efore calling th
1b990 65 20 6e 61 74 69 76 65 20 73 68 75 74 64 6f 77  e native shutdow
1b9a0 6e 20 66 75 6e 63 74 69 6f 6e 2e 0d 0a 20 20 20  n function...   
1b9b0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
1b9c0 66 6f 72 65 61 63 68 20 74 72 61 6e 73 61 63 74  foreach transact
1b9d0 69 6f 6e 20 5b 69 6e 66 6f 20 74 72 61 6e 73 61  ion [info transa
1b9e0 63 74 69 6f 6e 73 5d 20 7b 0d 0a 20 20 20 20 20  ctions] {..     
1b9f0 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67       if {[string
1ba00 20 6d 61 74 63 68 20 5c 0d 0a 20 20 20 20 20 20   match \..      
1ba10 20 20 20 20 20 20 20 20 53 79 73 74 65 6d 23 44          System#D
1ba20 61 74 61 23 53 51 4c 69 74 65 23 53 51 4c 69 74  ata#SQLite#SQLit
1ba30 65 54 72 61 6e 73 61 63 74 69 6f 6e 23 2a 20 24  eTransaction#* $
1ba40 74 72 61 6e 73 61 63 74 69 6f 6e 5d 7d 20 74 68  transaction]} th
1ba50 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
1ba60 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a    if {[catch {..
1ba70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
1ba80 6c 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 72 6f  l transaction ro
1ba90 6c 6c 62 61 63 6b 20 24 74 72 61 6e 73 61 63 74  llback $transact
1baa0 69 6f 6e 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ion..           
1bab0 20 7d 20 65 72 72 6f 72 5d 20 3d 3d 20 30 7d 20   } error] == 0} 
1bac0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
1bad0 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65        if {!$quie
1bae0 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  t} then {..     
1baf0 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
1bb00 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e   $channel [appen
1bb10 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
1bb20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d               "--
1bb30 2d 2d 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 6c  -- rolled back l
1bb40 65 61 6b 65 64 20 74 72 61 6e 73 61 63 74 69 6f  eaked transactio
1bb50 6e 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20 20  n \"" \..       
1bb60 20 20 20 20 20 20 20 20 20 20 20 20 20 24 74 72               $tr
1bb70 61 6e 73 61 63 74 69 6f 6e 20 5c 22 5c 6e 5d 0d  ansaction \"\n].
1bb80 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
1bb90 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 20  ..            } 
1bba0 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
1bbb0 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65        if {!$quie
1bbc0 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  t} then {..     
1bbd0 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
1bbe0 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e   $channel [appen
1bbf0 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
1bc00 20 20 20 20 20 20 20 20 20 20 20 20 20 22 3d 3d               "==
1bc10 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c  == WARNING: fail
1bc20 65 64 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 6c  ed to rollback l
1bc30 65 61 6b 65 64 20 74 72 61 6e 73 61 63 74 69 6f  eaked transactio
1bc40 6e 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20 20  n \"" \..       
1bc50 20 20 20 20 20 20 20 20 20 20 20 20 20 24 74 72               $tr
1bc60 61 6e 73 61 63 74 69 6f 6e 20 22 5c 22 2c 20 65  ansaction "\", e
1bc70 72 72 6f 72 3a 20 22 20 5c 6e 5c 74 20 24 65 72  rror: " \n\t $er
1bc80 72 6f 72 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20  ror \n]..       
1bc90 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
1bca0 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
1bcb0 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d     }..        }.
1bcc0 0a 0d 0a 20 20 20 20 20 20 20 20 66 6f 72 65 61  ...        forea
1bcd0 63 68 20 64 62 20 5b 69 6e 66 6f 20 63 6f 6e 6e  ch db [info conn
1bce0 65 63 74 69 6f 6e 73 5d 20 7b 0d 0a 20 20 20 20  ections] {..    
1bcf0 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e        if {[strin
1bd00 67 20 6d 61 74 63 68 20 5c 0d 0a 20 20 20 20 20  g match \..     
1bd10 20 20 20 20 20 20 20 20 20 53 79 73 74 65 6d 23           System#
1bd20 44 61 74 61 23 53 51 4c 69 74 65 23 53 51 4c 69  Data#SQLite#SQLi
1bd30 74 65 43 6f 6e 6e 65 63 74 69 6f 6e 23 2a 20 24  teConnection#* $
1bd40 64 62 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  db]} then {..   
1bd50 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61           if {[ca
1bd60 74 63 68 20 7b 73 71 6c 20 63 6c 6f 73 65 20 24  tch {sql close $
1bd70 64 62 7d 20 65 72 72 6f 72 5d 20 3d 3d 20 30 7d  db} error] == 0}
1bd80 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
1bd90 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69         if {!$qui
1bda0 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  et} then {..    
1bdb0 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
1bdc0 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  s $channel [appe
1bdd0 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
1bde0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d                "-
1bdf0 2d 2d 2d 20 63 6c 6f 73 65 64 20 6c 65 61 6b 65  --- closed leake
1be00 64 20 64 61 74 61 62 61 73 65 20 5c 22 22 20 24  d database \"" $
1be10 64 62 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20  db \"\n]..      
1be20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
1be30 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d         } else {.
1be40 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
1be50 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e  f {!$quiet} then
1be60 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
1be70 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
1be80 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
1be90 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1bea0 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e        "==== WARN
1beb0 49 4e 47 3a 20 66 61 69 6c 65 64 20 74 6f 20 63  ING: failed to c
1bec0 6c 6f 73 65 20 6c 65 61 6b 65 64 20 64 61 74 61  lose leaked data
1bed0 62 61 73 65 20 5c 22 22 20 5c 0d 0a 20 20 20 20  base \"" \..    
1bee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bef0 24 64 62 20 22 5c 22 2c 20 65 72 72 6f 72 3a 20  $db "\", error: 
1bf00 22 20 5c 6e 5c 74 20 24 65 72 72 6f 72 20 5c 6e  " \n\t $error \n
1bf10 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ]..             
1bf20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   }..            
1bf30 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  }..          }..
1bf40 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
1bf50 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
1bf60 23 20 42 55 47 46 49 58 3a 20 42 65 66 6f 72 65  # BUGFIX: Before
1bf70 20 63 61 6c 6c 69 6e 67 20 74 68 65 20 6e 61 74   calling the nat
1bf80 69 76 65 20 73 68 75 74 64 6f 77 6e 20 66 75 6e  ive shutdown fun
1bf90 63 74 69 6f 6e 2c 20 6d 61 6b 65 20 73 75 72 65  ction, make sure
1bfa0 20 62 6f 74 68 0d 0a 20 20 20 20 20 20 20 20 23   both..        #
1bfb0 20 20 20 20 20 20 20 20 20 6f 66 20 74 68 65 20           of the 
1bfc0 50 52 41 47 4d 41 20 72 65 6c 61 74 65 64 20 64  PRAGMA related d
1bfd0 69 72 65 63 74 6f 72 79 20 6e 61 6d 65 73 20 61  irectory names a
1bfe0 72 65 20 66 72 65 65 64 2e 0d 0a 20 20 20 20 20  re freed...     
1bff0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 63 68     #..        ch
1c000 65 63 6b 46 6f 72 53 51 4c 69 74 65 44 69 72 65  eckForSQLiteDire
1c010 63 74 6f 72 69 65 73 20 24 63 68 61 6e 6e 65 6c  ctories $channel
1c020 20 74 72 75 65 0d 0a 0d 0a 20 20 20 20 20 20 20   true....       
1c030 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20   if {[catch {.. 
1c040 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20           object 
1c050 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e  invoke -flags +N
1c060 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20  onPublic \..    
1c070 20 20 20 20 20 20 20 20 20 20 53 79 73 74 65 6d            System
1c080 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 55 6e 73  .Data.SQLite.Uns
1c090 61 66 65 4e 61 74 69 76 65 4d 65 74 68 6f 64 73  afeNativeMethods
1c0a0 20 73 71 6c 69 74 65 33 5f 73 68 75 74 64 6f 77   sqlite3_shutdow
1c0b0 6e 0d 0a 20 20 20 20 20 20 20 20 7d 20 72 65 73  n..        } res
1c0c0 75 6c 74 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20  ult] == 0} then 
1c0d0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20  {..          if 
1c0e0 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b  {!$quiet} then {
1c0f0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70  ..            tp
1c100 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70  uts $channel [ap
1c110 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
1c120 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
1c130 2d 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 5f 73  - call sqlite3_s
1c140 68 75 74 64 6f 77 6e 28 29 2e 2e 2e 20 6f 6b 3a  hutdown()... ok:
1c150 20 22 20 24 72 65 73 75 6c 74 20 5c 6e 5d 0d 0a   " $result \n]..
1c160 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
1c170 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
1c180 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71           if {!$q
1c190 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  uiet} then {..  
1c1a0 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
1c1b0 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  $channel [append
1c1c0 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
1c1d0 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 61          "---- ca
1c1e0 6c 6c 20 73 71 6c 69 74 65 33 5f 73 68 75 74 64  ll sqlite3_shutd
1c1f0 6f 77 6e 28 29 2e 2e 2e 20 65 72 72 6f 72 3a 20  own()... error: 
1c200 22 20 5c 6e 5c 74 20 24 72 65 73 75 6c 74 20 5c  " \n\t $result \
1c210 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d  n]..          }.
1c220 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  .        }..    
1c230 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20    }..    }..... 
1c240 20 20 20 70 72 6f 63 20 72 65 70 6f 72 74 53 51     proc reportSQ
1c250 4c 69 74 65 52 65 73 6f 75 72 63 65 73 20 7b 0d  LiteResources {.
1c260 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 68 61  .            cha
1c270 6e 6e 65 6c 20 7b 71 75 69 65 74 20 66 61 6c 73  nnel {quiet fals
1c280 65 7d 20 7b 72 65 73 65 74 20 74 72 75 65 7d 20  e} {reset true} 
1c290 7b 63 6f 6c 6c 65 63 74 20 74 72 75 65 7d 20 7d  {collect true} }
1c2a0 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20   {..      #..   
1c2b0 20 20 20 23 20 4e 4f 54 45 3a 20 49 66 20 61 76     # NOTE: If av
1c2c0 61 69 6c 61 62 6c 65 2c 20 72 65 70 6f 72 74 20  ailable, report 
1c2d0 6f 6e 20 28 61 6e 64 20 70 6f 73 73 69 62 6c 79  on (and possibly
1c2e0 20 72 65 73 65 74 29 20 74 68 65 20 72 75 6e 74   reset) the runt
1c2f0 69 6d 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ime..      #    
1c300 20 20 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e     configuration
1c310 20 73 74 61 74 69 73 74 69 63 73 2e 0d 0a 20 20   statistics...  
1c320 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20      #..      if 
1c330 7b 5b 68 61 76 65 53 51 4c 69 74 65 4f 62 6a 65  {[haveSQLiteObje
1c340 63 74 43 6f 6d 6d 61 6e 64 5d 20 26 26 20 5c 0d  ctCommand] && \.
1c350 0a 20 20 20 20 20 20 20 20 20 20 5b 68 61 76 65  .          [have
1c360 43 6f 6e 73 74 72 61 69 6e 74 20 62 75 69 6c 64  Constraint build
1c370 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e 44 65  Configuration.De
1c380 62 75 67 5d 20 26 26 20 5b 63 61 74 63 68 20 7b  bug] && [catch {
1c390 0d 0a 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74  ..        object
1c3a0 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b   invoke -flags +
1c3b0 4e 6f 6e 50 75 62 6c 69 63 20 2d 61 6c 69 61 73  NonPublic -alias
1c3c0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
1c3d0 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
1c3e0 74 65 2e 44 65 62 75 67 44 61 74 61 20 73 65 74  te.DebugData set
1c3f0 74 69 6e 67 52 65 61 64 43 6f 75 6e 74 73 0d 0a  tingReadCounts..
1c400 20 20 20 20 20 20 7d 20 73 65 74 74 69 6e 67 52        } settingR
1c410 65 61 64 43 6f 75 6e 74 73 5d 20 3d 3d 20 30 7d  eadCounts] == 0}
1c420 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
1c430 20 73 65 74 20 6e 61 6d 65 43 6f 75 6e 74 20 5b   set nameCount [
1c440 24 73 65 74 74 69 6e 67 52 65 61 64 43 6f 75 6e  $settingReadCoun
1c450 74 73 20 43 6f 75 6e 74 5d 0d 0a 20 20 20 20 20  ts Count]..     
1c460 20 20 20 73 65 74 20 76 61 6c 75 65 43 6f 75 6e     set valueCoun
1c470 74 20 30 0d 0a 0d 0a 20 20 20 20 20 20 20 20 6f  t 0....        o
1c480 62 6a 65 63 74 20 66 6f 72 65 61 63 68 20 2d 61  bject foreach -a
1c490 6c 69 61 73 20 70 61 69 72 20 24 73 65 74 74 69  lias pair $setti
1c4a0 6e 67 52 65 61 64 43 6f 75 6e 74 73 20 7b 0d 0a  ngReadCounts {..
1c4b0 20 20 20 20 20 20 20 20 20 20 69 6e 63 72 20 76            incr v
1c4c0 61 6c 75 65 43 6f 75 6e 74 20 5b 24 70 61 69 72  alueCount [$pair
1c4d0 20 56 61 6c 75 65 5d 0d 0a 0d 0a 20 20 20 20 20   Value]....     
1c4e0 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74       if {!$quiet
1c4f0 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
1c500 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
1c510 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
1c520 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
1c530 20 20 20 20 22 2d 2d 2d 2d 20 73 65 74 74 69 6e      "---- settin
1c540 67 20 5c 22 22 20 5b 24 70 61 69 72 20 4b 65 79  g \"" [$pair Key
1c550 5d 20 22 5c 22 20 77 61 73 20 72 65 61 64 20 22  ] "\" was read "
1c560 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
1c570 20 20 20 20 5b 24 70 61 69 72 20 56 61 6c 75 65      [$pair Value
1c580 5d 20 22 20 74 69 6d 65 73 5c 6e 22 5d 0d 0a 20  ] " times\n"].. 
1c590 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
1c5a0 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
1c5b0 20 69 66 20 7b 24 72 65 73 65 74 7d 20 74 68 65   if {$reset} the
1c5c0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69  n {..          i
1c5d0 66 20 7b 5b 63 61 74 63 68 20 7b 24 73 65 74 74  f {[catch {$sett
1c5e0 69 6e 67 52 65 61 64 43 6f 75 6e 74 73 20 43 6c  ingReadCounts Cl
1c5f0 65 61 72 7d 20 65 72 72 6f 72 5d 20 3d 3d 20 30  ear} error] == 0
1c600 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
1c610 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65        if {!$quie
1c620 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  t} then {..     
1c630 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
1c640 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
1c650 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
1c660 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 72           "---- r
1c670 65 73 65 74 20 73 65 74 74 69 6e 67 20 73 74 61  eset setting sta
1c680 74 69 73 74 69 63 73 20 66 6f 72 20 74 68 65 20  tistics for the 
1c690 70 72 65 76 69 6f 75 73 20 22 20 5c 0d 0a 20 20  previous " \..  
1c6a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c6b0 24 6e 61 6d 65 43 6f 75 6e 74 20 22 20 6e 61 6d  $nameCount " nam
1c6c0 65 73 20 61 6e 64 20 22 20 24 76 61 6c 75 65 43  es and " $valueC
1c6d0 6f 75 6e 74 20 22 20 76 61 6c 75 65 73 20 72 65  ount " values re
1c6e0 61 64 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20  ad\n"]..        
1c6f0 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
1c700 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
1c710 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
1c720 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
1c730 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
1c740 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49       "==== WARNI
1c750 4e 47 3a 20 66 61 69 6c 65 64 20 74 6f 20 72 65  NG: failed to re
1c760 73 65 74 20 73 65 74 74 69 6e 67 20 73 74 61 74  set setting stat
1c770 69 73 74 69 63 73 20 66 6f 72 20 22 20 5c 0d 0a  istics for " \..
1c780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c790 22 74 68 65 20 70 72 65 76 69 6f 75 73 20 22 20  "the previous " 
1c7a0 24 6e 61 6d 65 43 6f 75 6e 74 20 22 20 6e 61 6d  $nameCount " nam
1c7b0 65 73 20 61 6e 64 20 22 20 24 76 61 6c 75 65 43  es and " $valueC
1c7c0 6f 75 6e 74 20 5c 0d 0a 20 20 20 20 20 20 20 20  ount \..        
1c7d0 20 20 20 20 20 20 20 20 22 20 76 61 6c 75 65 73          " values
1c7e0 20 72 65 61 64 2c 20 65 72 72 6f 72 3a 20 22 20   read, error: " 
1c7f0 5c 6e 5c 74 20 24 65 72 72 6f 72 20 5c 6e 5d 0d  \n\t $error \n].
1c800 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  .          }..  
1c810 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d        }..      }
1c820 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 68  ....      if {[h
1c830 61 76 65 53 51 4c 69 74 65 4f 62 6a 65 63 74 43  aveSQLiteObjectC
1c840 6f 6d 6d 61 6e 64 5d 20 26 26 20 5c 0d 0a 20 20  ommand] && \..  
1c850 20 20 20 20 20 20 20 20 5b 68 61 76 65 53 51 4c          [haveSQL
1c860 69 74 65 44 65 66 69 6e 65 43 6f 6e 73 74 61 6e  iteDefineConstan
1c870 74 20 49 4e 54 45 52 4f 50 5f 56 49 52 54 55 41  t INTEROP_VIRTUA
1c880 4c 5f 54 41 42 4c 45 5d 20 26 26 20 5c 0d 0a 20  L_TABLE] && \.. 
1c890 20 20 20 20 20 20 20 20 20 5b 68 61 76 65 53 51           [haveSQ
1c8a0 4c 69 74 65 44 65 66 69 6e 65 43 6f 6e 73 74 61  LiteDefineConsta
1c8b0 6e 74 20 54 52 41 43 4b 5f 4d 45 4d 4f 52 59 5f  nt TRACK_MEMORY_
1c8c0 42 59 54 45 53 5d 7d 20 74 68 65 6e 20 7b 0d 0a  BYTES]} then {..
1c8d0 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75          if {!$qu
1c8e0 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  iet} then {..   
1c8f0 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
1c900 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 63 75 72 72  annel "---- curr
1c910 65 6e 74 20 6d 65 6d 6f 72 79 20 69 6e 20 75 73  ent memory in us
1c920 65 20 62 79 20 53 51 4c 69 74 65 4d 65 6d 6f 72  e by SQLiteMemor
1c930 79 2e 2e 2e 20 22 0d 0a 20 20 20 20 20 20 20 20  y... "..        
1c940 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20  }....        if 
1c950 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20  {[catch {..     
1c960 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f       object invo
1c970 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75  ke -flags +NonPu
1c980 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20 20 20  blic \..        
1c990 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74        System.Dat
1c9a0 61 2e 53 51 4c 69 74 65 2e 53 51 4c 69 74 65 4d  a.SQLite.SQLiteM
1c9b0 65 6d 6f 72 79 20 62 79 74 65 73 41 6c 6c 6f 63  emory bytesAlloc
1c9c0 61 74 65 64 0d 0a 20 20 20 20 20 20 20 20 7d 20  ated..        } 
1c9d0 6d 65 6d 6f 72 79 5d 20 3d 3d 20 30 7d 20 74 68  memory] == 0} th
1c9e0 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
1c9f0 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65  if {!$quiet} the
1ca00 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
1ca10 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
1ca20 5b 61 70 70 65 6e 64 41 72 67 73 20 24 6d 65 6d  [appendArgs $mem
1ca30 6f 72 79 20 22 20 62 79 74 65 73 5c 6e 22 5d 0d  ory " bytes\n"].
1ca40 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  .          }..  
1ca50 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
1ca60 20 20 20 20 20 20 20 20 20 20 73 65 74 20 6d 65            set me
1ca70 6d 6f 72 79 20 75 6e 6b 6e 6f 77 6e 0d 0a 0d 0a  mory unknown....
1ca80 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 24            if {!$
1ca90 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20  quiet} then {.. 
1caa0 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
1cab0 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e   $channel [appen
1cac0 64 41 72 67 73 20 24 6d 65 6d 6f 72 79 20 5c 6e  dArgs $memory \n
1cad0 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  ]..          }..
1cae0 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
1caf0 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74       if {!$quiet
1cb00 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
1cb10 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
1cb20 65 6c 20 22 2d 2d 2d 2d 20 6d 61 78 69 6d 75 6d  el "---- maximum
1cb30 20 6d 65 6d 6f 72 79 20 69 6e 20 75 73 65 20 62   memory in use b
1cb40 79 20 53 51 4c 69 74 65 4d 65 6d 6f 72 79 2e 2e  y SQLiteMemory..
1cb50 2e 20 22 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  . "..        }..
1cb60 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63  ..        if {[c
1cb70 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20  atch {..        
1cb80 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20    object invoke 
1cb90 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69  -flags +NonPubli
1cba0 63 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  c \..           
1cbb0 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53     System.Data.S
1cbc0 51 4c 69 74 65 2e 53 51 4c 69 74 65 4d 65 6d 6f  QLite.SQLiteMemo
1cbd0 72 79 20 6d 61 78 69 6d 75 6d 42 79 74 65 73 41  ry maximumBytesA
1cbe0 6c 6c 6f 63 61 74 65 64 0d 0a 20 20 20 20 20 20  llocated..      
1cbf0 20 20 7d 20 6d 65 6d 6f 72 79 5d 20 3d 3d 20 30    } memory] == 0
1cc00 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
1cc10 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d      if {!$quiet}
1cc20 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
1cc30 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
1cc40 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
1cc50 24 6d 65 6d 6f 72 79 20 22 20 62 79 74 65 73 5c  $memory " bytes\
1cc60 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  n"]..          }
1cc70 0d 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65  ..        } else
1cc80 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65   {..          se
1cc90 74 20 6d 65 6d 6f 72 79 20 75 6e 6b 6e 6f 77 6e  t memory unknown
1cca0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66  ....          if
1ccb0 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20   {!$quiet} then 
1ccc0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  {..            t
1ccd0 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61  puts $channel [a
1cce0 70 70 65 6e 64 41 72 67 73 20 24 6d 65 6d 6f 72  ppendArgs $memor
1ccf0 79 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20  y \n]..         
1cd00 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20   }..        }.. 
1cd10 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
1cd20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65  if {!$quiet} the
1cd30 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75  n {..        tpu
1cd40 74 73 20 24 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d  ts $channel "---
1cd50 2d 20 63 75 72 72 65 6e 74 20 6d 65 6d 6f 72 79  - current memory
1cd60 20 69 6e 20 75 73 65 20 62 79 20 53 51 4c 69 74   in use by SQLit
1cd70 65 2e 2e 2e 20 22 0d 0a 20 20 20 20 20 20 7d 0d  e... "..      }.
1cd80 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 68 61  ...      if {[ha
1cd90 76 65 53 51 4c 69 74 65 4f 62 6a 65 63 74 43 6f  veSQLiteObjectCo
1cda0 6d 6d 61 6e 64 5d 7d 20 74 68 65 6e 20 7b 0d 0a  mmand]} then {..
1cdb0 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74          if {[cat
1cdc0 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  ch {..          
1cdd0 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66  object invoke -f
1cde0 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20  lags +NonPublic 
1cdf0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
1ce00 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c   System.Data.SQL
1ce10 69 74 65 2e 55 6e 73 61 66 65 4e 61 74 69 76 65  ite.UnsafeNative
1ce20 4d 65 74 68 6f 64 73 20 73 71 6c 69 74 65 33 5f  Methods sqlite3_
1ce30 6d 65 6d 6f 72 79 5f 75 73 65 64 0d 0a 20 20 20  memory_used..   
1ce40 20 20 20 20 20 7d 20 6d 65 6d 6f 72 79 5d 20 3d       } memory] =
1ce50 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  = 0} then {..   
1ce60 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69         if {!$qui
1ce70 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  et} then {..    
1ce80 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
1ce90 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
1cea0 67 73 20 24 6d 65 6d 6f 72 79 20 22 20 62 79 74  gs $memory " byt
1ceb0 65 73 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20  es\n"]..        
1cec0 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 20 65    }..        } e
1ced0 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  lse {..         
1cee0 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20   #..          # 
1cef0 4e 4f 54 45 3a 20 4d 61 79 62 65 20 74 68 65 20  NOTE: Maybe the 
1cf00 53 51 4c 69 74 65 20 63 6f 72 65 20 6c 69 62 72  SQLite core libr
1cf10 61 72 79 20 69 73 20 75 6e 61 76 61 69 6c 61 62  ary is unavailab
1cf20 6c 65 3f 0d 0a 20 20 20 20 20 20 20 20 20 20 23  le?..          #
1cf30 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20  ..          set 
1cf40 6d 65 6d 6f 72 79 20 75 6e 6b 6e 6f 77 6e 0d 0a  memory unknown..
1cf50 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b  ..          if {
1cf60 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d  !$quiet} then {.
1cf70 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75  .            tpu
1cf80 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70  ts $channel [app
1cf90 65 6e 64 41 72 67 73 20 24 6d 65 6d 6f 72 79 20  endArgs $memory 
1cfa0 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  \n]..          }
1cfb0 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20  ..        }..   
1cfc0 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
1cfd0 20 20 20 20 20 73 65 74 20 6d 65 6d 6f 72 79 20       set memory 
1cfe0 75 6e 61 76 61 69 6c 61 62 6c 65 0d 0a 0d 0a 20  unavailable.... 
1cff0 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69         if {!$qui
1d000 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  et} then {..    
1d010 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
1d020 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
1d030 20 24 6d 65 6d 6f 72 79 20 5c 6e 5d 0d 0a 20 20   $memory \n]..  
1d040 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d        }..      }
1d050 0d 0a 0d 0a 20 20 20 20 20 20 73 65 74 20 72 65  ....      set re
1d060 73 75 6c 74 20 24 6d 65 6d 6f 72 79 3b 20 23 20  sult $memory; # 
1d070 4e 4f 54 45 3a 20 52 65 74 75 72 6e 20 6d 65 6d  NOTE: Return mem
1d080 6f 72 79 20 69 6e 2d 75 73 65 20 74 6f 20 6f 75  ory in-use to ou
1d090 72 20 63 61 6c 6c 65 72 2e 0d 0a 0d 0a 20 20 20  r caller.....   
1d0a0 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20     if {!$quiet} 
1d0b0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
1d0c0 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 22  tputs $channel "
1d0d0 2d 2d 2d 2d 20 6d 61 78 69 6d 75 6d 20 6d 65 6d  ---- maximum mem
1d0e0 6f 72 79 20 69 6e 20 75 73 65 20 62 79 20 53 51  ory in use by SQ
1d0f0 4c 69 74 65 2e 2e 2e 20 22 0d 0a 20 20 20 20 20  Lite... "..     
1d100 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b   }....      if {
1d110 5b 68 61 76 65 53 51 4c 69 74 65 4f 62 6a 65 63  [haveSQLiteObjec
1d120 74 43 6f 6d 6d 61 6e 64 5d 7d 20 74 68 65 6e 20  tCommand]} then 
1d130 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b  {..        if {[
1d140 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20  catch {..       
1d150 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65     object invoke
1d160 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c   -flags +NonPubl
1d170 69 63 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  ic \..          
1d180 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e      System.Data.
1d190 53 51 4c 69 74 65 2e 55 6e 73 61 66 65 4e 61 74  SQLite.UnsafeNat
1d1a0 69 76 65 4d 65 74 68 6f 64 73 20 5c 0d 0a 20 20  iveMethods \..  
1d1b0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
1d1c0 74 65 33 5f 6d 65 6d 6f 72 79 5f 68 69 67 68 77  te3_memory_highw
1d1d0 61 74 65 72 20 30 0d 0a 20 20 20 20 20 20 20 20  ater 0..        
1d1e0 7d 20 6d 65 6d 6f 72 79 5d 20 3d 3d 20 30 7d 20  } memory] == 0} 
1d1f0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
1d200 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74    if {!$quiet} t
1d210 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
1d220 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
1d230 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 24 6d  l [appendArgs $m
1d240 65 6d 6f 72 79 20 22 20 62 79 74 65 73 5c 6e 22  emory " bytes\n"
1d250 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  ]..          }..
1d260 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b          } else {
1d270 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20  ..          #.. 
1d280 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a           # NOTE:
1d290 20 4d 61 79 62 65 20 74 68 65 20 53 51 4c 69 74   Maybe the SQLit
1d2a0 65 20 63 6f 72 65 20 6c 69 62 72 61 72 79 20 69  e core library i
1d2b0 73 20 75 6e 61 76 61 69 6c 61 62 6c 65 3f 0d 0a  s unavailable?..
1d2c0 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
1d2d0 20 20 20 20 20 20 20 73 65 74 20 6d 65 6d 6f 72         set memor
1d2e0 79 20 75 6e 6b 6e 6f 77 6e 0d 0a 0d 0a 20 20 20  y unknown....   
1d2f0 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69         if {!$qui
1d300 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  et} then {..    
1d310 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
1d320 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
1d330 67 73 20 24 6d 65 6d 6f 72 79 20 5c 6e 5d 0d 0a  gs $memory \n]..
1d340 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
1d350 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 20       }..      } 
1d360 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
1d370 73 65 74 20 6d 65 6d 6f 72 79 20 75 6e 61 76 61  set memory unava
1d380 69 6c 61 62 6c 65 0d 0a 0d 0a 20 20 20 20 20 20  ilable....      
1d390 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74    if {!$quiet} t
1d3a0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
1d3b0 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
1d3c0 5b 61 70 70 65 6e 64 41 72 67 73 20 24 6d 65 6d  [appendArgs $mem
1d3d0 6f 72 79 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20  ory \n]..       
1d3e0 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20   }..      }.... 
1d3f0 20 20 20 20 20 69 66 20 7b 24 63 6f 6c 6c 65 63       if {$collec
1d400 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  t} then {..     
1d410 20 20 20 63 6f 6c 6c 65 63 74 47 61 72 62 61 67     collectGarbag
1d420 65 20 24 63 68 61 6e 6e 65 6c 0d 0a 20 20 20 20  e $channel..    
1d430 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20    }....      if 
1d440 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b  {!$quiet} then {
1d450 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20  ..        tputs 
1d460 24 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 63  $channel "---- c
1d470 75 72 72 65 6e 74 20 6d 65 6d 6f 72 79 20 69 6e  urrent memory in
1d480 20 75 73 65 20 62 79 20 74 68 65 20 43 4c 52 2e   use by the CLR.
1d490 2e 2e 20 22 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d  .. "..      }...
1d4a0 0a 20 20 20 20 20 20 69 66 20 7b 5b 68 61 76 65  .      if {[have
1d4b0 53 51 4c 69 74 65 4f 62 6a 65 63 74 43 6f 6d 6d  SQLiteObjectComm
1d4c0 61 6e 64 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  and]} then {..  
1d4d0 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68        if {[catch
1d4e0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 6f 62   {..          ob
1d4f0 6a 65 63 74 20 69 6e 76 6f 6b 65 20 47 43 20 47  ject invoke GC G
1d500 65 74 54 6f 74 61 6c 4d 65 6d 6f 72 79 20 66 61  etTotalMemory fa
1d510 6c 73 65 0d 0a 20 20 20 20 20 20 20 20 7d 20 6d  lse..        } m
1d520 65 6d 6f 72 79 5d 20 3d 3d 20 30 7d 20 74 68 65  emory] == 0} the
1d530 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69  n {..          i
1d540 66 20 7b 5b 73 74 72 69 6e 67 20 69 73 20 69 6e  f {[string is in
1d550 74 65 67 65 72 20 2d 73 74 72 69 63 74 20 24 6d  teger -strict $m
1d560 65 6d 6f 72 79 5d 7d 20 74 68 65 6e 20 7b 0d 0a  emory]} then {..
1d570 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b              if {
1d580 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d  !$quiet} then {.
1d590 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74  .              t
1d5a0 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61  puts $channel [a
1d5b0 70 70 65 6e 64 41 72 67 73 20 24 6d 65 6d 6f 72  ppendArgs $memor
1d5c0 79 20 22 20 62 79 74 65 73 5c 6e 22 5d 0d 0a 20  y " bytes\n"].. 
1d5d0 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
1d5e0 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b          } else {
1d5f0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 65  ..            se
1d600 74 20 6d 65 6d 6f 72 79 20 69 6e 76 61 6c 69 64  t memory invalid
1d610 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
1d620 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65  if {!$quiet} the
1d630 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
1d640 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
1d650 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 24 6d  l [appendArgs $m
1d660 65 6d 6f 72 79 20 5c 6e 5d 0d 0a 20 20 20 20 20  emory \n]..     
1d670 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
1d680 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d      }..        }
1d690 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
1d6a0 20 20 20 73 65 74 20 6d 65 6d 6f 72 79 20 75 6e     set memory un
1d6b0 6b 6e 6f 77 6e 0d 0a 0d 0a 20 20 20 20 20 20 20  known....       
1d6c0 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20     if {!$quiet} 
1d6d0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
1d6e0 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
1d6f0 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 24  el [appendArgs $
1d700 6d 65 6d 6f 72 79 20 5c 6e 5d 0d 0a 20 20 20 20  memory \n]..    
1d710 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
1d720 20 7d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65   }..      } else
1d730 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20   {..        set 
1d740 6d 65 6d 6f 72 79 20 75 6e 61 76 61 69 6c 61 62  memory unavailab
1d750 6c 65 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66  le....        if
1d760 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20   {!$quiet} then 
1d770 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70 75  {..          tpu
1d780 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70  ts $channel [app
1d790 65 6e 64 41 72 67 73 20 24 6d 65 6d 6f 72 79 20  endArgs $memory 
1d7a0 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  \n]..        }..
1d7b0 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
1d7c0 20 72 65 74 75 72 6e 20 24 72 65 73 75 6c 74 0d   return $result.
1d7d0 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70  .    }.....    p
1d7e0 72 6f 63 20 63 68 65 63 6b 46 6f 72 53 51 4c 69  roc checkForSQLi
1d7f0 74 65 44 69 72 65 63 74 6f 72 69 65 73 20 7b 20  teDirectories { 
1d800 63 68 61 6e 6e 65 6c 20 7b 72 65 73 65 74 20 66  channel {reset f
1d810 61 6c 73 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20  alse} } {..     
1d820 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
1d830 3a 20 43 68 65 63 6b 20 69 66 20 74 68 65 20 73  : Check if the s
1d840 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 65 74  qlite3_win32_set
1d850 5f 64 69 72 65 63 74 6f 72 79 20 66 75 6e 63 74  _directory funct
1d860 69 6f 6e 20 69 73 20 61 76 61 69 6c 61 62 6c 65  ion is available
1d870 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
1d880 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
1d890 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 22 2d   \..          "-
1d8a0 2d 2d 2d 20 63 68 65 63 6b 69 6e 67 20 66 6f 72  --- checking for
1d8b0 20 66 75 6e 63 74 69 6f 6e 20 73 71 6c 69 74 65   function sqlite
1d8c0 33 5f 77 69 6e 33 32 5f 73 65 74 5f 64 69 72 65  3_win32_set_dire
1d8d0 63 74 6f 72 79 2e 2e 2e 20 22 0d 0a 0d 0a 20 20  ctory... "....  
1d8e0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
1d8f0 4f 54 45 3a 20 54 68 69 73 20 63 61 6c 6c 20 74  OTE: This call t
1d900 6f 20 74 68 65 20 73 71 6c 69 74 65 33 5f 77 69  o the sqlite3_wi
1d910 6e 33 32 5f 73 65 74 5f 64 69 72 65 63 74 6f 72  n32_set_director
1d920 79 20 66 75 6e 63 74 69 6f 6e 20 75 73 65 73 20  y function uses 
1d930 74 68 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20  the..      #    
1d940 20 20 20 69 6e 76 61 6c 69 64 20 76 61 6c 75 65     invalid value
1d950 20 30 20 66 6f 72 20 74 68 65 20 66 69 72 73 74   0 for the first
1d960 20 61 72 67 75 6d 65 6e 74 2e 20 20 54 68 69 73   argument.  This
1d970 20 63 6f 64 65 20 69 73 20 64 65 73 69 67 6e 65   code is designe
1d980 64 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  d..      #      
1d990 20 74 6f 20 63 68 65 63 6b 20 69 66 20 63 61 6c   to check if cal
1d9a0 6c 69 6e 67 20 74 68 65 20 66 75 6e 63 74 69 6f  ling the functio
1d9b0 6e 20 77 69 6c 6c 20 72 61 69 73 65 20 61 6e 20  n will raise an 
1d9c0 65 78 63 65 70 74 69 6f 6e 20 28 69 2e 65 2e 0d  exception (i.e..
1d9d0 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74  .      #       t
1d9e0 68 65 20 61 63 74 75 61 6c 20 72 65 73 75 6c 74  he actual result
1d9f0 20 6f 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e   of the function
1da00 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 74 65 72   does not matter
1da10 20 61 73 20 6c 6f 6e 67 20 61 73 20 6e 6f 0d 0a   as long as no..
1da20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 64 69        #       di
1da30 72 65 63 74 6f 72 79 20 69 73 20 63 68 61 6e 67  rectory is chang
1da40 65 64 29 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ed)...      #.. 
1da50 20 20 20 20 20 69 66 20 7b 5b 69 73 57 69 6e 64       if {[isWind
1da60 6f 77 73 5d 20 26 26 20 5b 63 61 74 63 68 20 7b  ows] && [catch {
1da70 0d 0a 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74  ..        object
1da80 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b   invoke -flags +
1da90 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20  NonPublic \..   
1daa0 20 20 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e           System.
1dab0 44 61 74 61 2e 53 51 4c 69 74 65 2e 55 6e 73 61  Data.SQLite.Unsa
1dac0 66 65 4e 61 74 69 76 65 4d 65 74 68 6f 64 73 20  feNativeMethods 
1dad0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  \..            s
1dae0 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 65 74  qlite3_win32_set
1daf0 5f 64 69 72 65 63 74 6f 72 79 20 30 20 6e 75 6c  _directory 0 nul
1db00 6c 0d 0a 20 20 20 20 20 20 7d 5d 20 3d 3d 20 30  l..      }] == 0
1db10 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
1db20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
1db30 4f 54 45 3a 20 43 61 6c 6c 69 6e 67 20 74 68 65  OTE: Calling the
1db40 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73   sqlite3_win32_s
1db50 65 74 5f 64 69 72 65 63 74 6f 72 79 20 66 75 6e  et_directory fun
1db60 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 0d 0a  ction does not..
1db70 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
1db80 63 61 75 73 65 20 61 6e 20 65 78 63 65 70 74 69  cause an excepti
1db90 6f 6e 3b 20 74 68 65 72 65 66 6f 72 65 2c 20 69  on; therefore, i
1dba0 74 20 6d 75 73 74 20 62 65 20 61 76 61 69 6c 61  t must be availa
1dbb0 62 6c 65 20 28 69 2e 65 2e 0d 0a 20 20 20 20 20  ble (i.e...     
1dbc0 20 20 20 23 20 20 20 20 20 20 20 65 76 65 6e 20     #       even 
1dbd0 74 68 6f 75 67 68 20 69 74 20 73 68 6f 75 6c 64  though it should
1dbe0 20 72 65 74 75 72 6e 20 61 20 66 61 69 6c 75 72   return a failur
1dbf0 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20 69 6e  e return code in
1dc00 20 74 68 69 73 0d 0a 20 20 20 20 20 20 20 20 23   this..        #
1dc10 20 20 20 20 20 20 20 63 61 73 65 29 2e 0d 0a 20         case)... 
1dc20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
1dc30 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20    addConstraint 
1dc40 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 65  sqlite3_win32_se
1dc50 74 5f 64 69 72 65 63 74 6f 72 79 0d 0a 0d 0a 20  t_directory.... 
1dc60 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
1dc70 61 6e 6e 65 6c 20 79 65 73 5c 6e 0d 0a 0d 0a 20  annel yes\n.... 
1dc80 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
1dc90 20 20 23 20 4e 4f 54 45 3a 20 44 6f 65 73 20 6f    # NOTE: Does o
1dca0 75 72 20 63 61 6c 6c 65 72 20 77 61 6e 74 20 74  ur caller want t
1dcb0 6f 20 72 65 73 65 74 20 74 68 65 20 64 69 72 65  o reset the dire
1dcc0 63 74 6f 72 69 65 73 3f 0d 0a 20 20 20 20 20 20  ctories?..      
1dcd0 20 20 23 0d 0a 20 20 20 20 20 20 20 20 69 66 20    #..        if 
1dce0 7b 24 72 65 73 65 74 7d 20 74 68 65 6e 20 7b 0d  {$reset} then {.
1dcf0 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
1dd00 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
1dd10 4e 6f 77 20 6d 61 6b 65 20 73 75 72 65 20 74 68  Now make sure th
1dd20 65 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 74  e database and t
1dd30 65 6d 70 6f 72 61 72 79 20 64 69 72 65 63 74 6f  emporary directo
1dd40 72 69 65 73 20 61 72 65 0d 0a 20 20 20 20 20 20  ries are..      
1dd50 20 20 20 20 23 20 20 20 20 20 20 20 72 65 73 65      #       rese
1dd60 74 20 74 68 65 69 72 20 64 65 66 61 75 6c 74 20  t their default 
1dd70 76 61 6c 75 65 73 2c 20 77 68 69 63 68 20 73 68  values, which sh
1dd80 6f 75 6c 64 20 62 65 20 6e 75 6c 6c 20 66 6f 72  ould be null for
1dd90 20 62 6f 74 68 2e 0d 0a 20 20 20 20 20 20 20 20   both...        
1dda0 20 20 23 20 20 20 20 20 20 20 53 69 6e 63 65 20    #       Since 
1ddb0 74 68 65 20 73 71 6c 69 74 65 33 5f 77 69 6e 33  the sqlite3_win3
1ddc0 32 5f 73 65 74 5f 64 69 72 65 63 74 6f 72 79 20  2_set_directory 
1ddd0 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 76 61 69  function is avai
1dde0 6c 61 62 6c 65 2c 0d 0a 20 20 20 20 20 20 20 20  lable,..        
1ddf0 20 20 23 20 20 20 20 20 20 20 75 73 65 20 69 74    #       use it
1de00 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a  ...          #..
1de10 20 20 20 20 20 20 20 20 20 20 66 6f 72 20 7b 73            for {s
1de20 65 74 20 69 6e 64 65 78 20 31 7d 20 7b 24 69 6e  et index 1} {$in
1de30 64 65 78 20 3c 20 33 7d 20 7b 69 6e 63 72 20 69  dex < 3} {incr i
1de40 6e 64 65 78 7d 20 7b 0d 0a 20 20 20 20 20 20 20  ndex} {..       
1de50 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20       if {[catch 
1de60 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
1de70 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d   object invoke -
1de80 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63  flags +NonPublic
1de90 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
1dea0 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74        System.Dat
1deb0 61 2e 53 51 4c 69 74 65 2e 55 6e 73 61 66 65 4e  a.SQLite.UnsafeN
1dec0 61 74 69 76 65 4d 65 74 68 6f 64 73 20 5c 0d 0a  ativeMethods \..
1ded0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dee0 20 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f    sqlite3_win32_
1def0 73 65 74 5f 64 69 72 65 63 74 6f 72 79 20 24 69  set_directory $i
1df00 6e 64 65 78 20 6e 75 6c 6c 0d 0a 20 20 20 20 20  ndex null..     
1df10 20 20 20 20 20 20 20 7d 20 72 65 73 75 6c 74 5d         } result]
1df20 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20   == 0} then {.. 
1df30 20 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75               tpu
1df40 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70  ts $channel [app
1df50 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
1df60 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d               "--
1df70 2d 2d 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 5f  -- call sqlite3_
1df80 77 69 6e 33 32 5f 73 65 74 5f 64 69 72 65 63 74  win32_set_direct
1df90 6f 72 79 28 22 20 24 69 6e 64 65 78 20 5c 0d 0a  ory(" $index \..
1dfa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dfb0 20 20 22 2c 20 6e 75 6c 6c 29 2e 2e 2e 20 6f 6b    ", null)... ok
1dfc0 3a 20 22 20 24 72 65 73 75 6c 74 20 5c 6e 5d 0d  : " $result \n].
1dfd0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 20 65  .            } e
1dfe0 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  lse {..         
1dff0 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
1e000 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
1e010 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
1e020 20 20 20 20 20 22 2d 2d 2d 2d 20 63 61 6c 6c 20       "---- call 
1e030 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 65  sqlite3_win32_se
1e040 74 5f 64 69 72 65 63 74 6f 72 79 28 22 20 24 69  t_directory(" $i
1e050 6e 64 65 78 20 5c 0d 0a 20 20 20 20 20 20 20 20  ndex \..        
1e060 20 20 20 20 20 20 20 20 20 20 22 2c 20 6e 75 6c            ", nul
1e070 6c 29 2e 2e 2e 20 65 72 72 6f 72 3a 20 22 20 5c  l)... error: " \
1e080 6e 5c 74 20 24 72 65 73 75 6c 74 20 5c 6e 5d 0d  n\t $result \n].
1e090 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  .            }..
1e0a0 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
1e0b0 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 20       }..      } 
1e0c0 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
1e0d0 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 6e  tputs $channel n
1e0e0 6f 5c 6e 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23  o\n....        #
1e0f0 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
1e100 3a 20 44 6f 65 73 20 6f 75 72 20 63 61 6c 6c 65  : Does our calle
1e110 72 20 77 61 6e 74 20 74 6f 20 72 65 73 65 74 20  r want to reset 
1e120 74 68 65 20 64 69 72 65 63 74 6f 72 69 65 73 3f  the directories?
1e130 20 20 54 68 69 73 20 63 61 6e 20 6f 6e 6c 79 0d    This can only.
1e140 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
1e150 20 62 65 20 70 65 72 66 6f 72 6d 65 64 20 69 66   be performed if
1e160 20 53 51 4c 69 74 65 20 69 73 20 6c 6f 61 64 65   SQLite is loade
1e170 64 20 61 6e 64 20 72 65 61 64 79 20 66 6f 72 20  d and ready for 
1e180 75 73 65 20 62 79 20 74 68 65 20 74 65 73 74 0d  use by the test.
1e190 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
1e1a0 20 73 75 69 74 65 2e 0d 0a 20 20 20 20 20 20 20   suite...       
1e1b0 20 23 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b   #..        if {
1e1c0 24 72 65 73 65 74 20 26 26 20 5b 69 73 53 51 4c  $reset && [isSQL
1e1d0 69 74 65 52 65 61 64 79 5d 7d 20 74 68 65 6e 20  iteReady]} then 
1e1e0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a  {..          #..
1e1f0 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45            # NOTE
1e200 3a 20 4e 6f 77 20 6d 61 6b 65 20 73 75 72 65 20  : Now make sure 
1e210 74 68 65 20 64 61 74 61 62 61 73 65 20 61 6e 64  the database and
1e220 20 74 65 6d 70 6f 72 61 72 79 20 64 69 72 65 63   temporary direc
1e230 74 6f 72 69 65 73 20 61 72 65 0d 0a 20 20 20 20  tories are..    
1e240 20 20 20 20 20 20 23 20 20 20 20 20 20 20 72 65        #       re
1e250 73 65 74 20 74 68 65 69 72 20 64 65 66 61 75 6c  set their defaul
1e260 74 20 76 61 6c 75 65 73 2c 20 77 68 69 63 68 20  t values, which 
1e270 73 68 6f 75 6c 64 20 62 65 20 6e 75 6c 6c 20 66  should be null f
1e280 6f 72 20 62 6f 74 68 2e 0d 0a 20 20 20 20 20 20  or both...      
1e290 20 20 20 20 23 20 20 20 20 20 20 20 53 69 6e 63      #       Sinc
1e2a0 65 20 74 68 65 20 73 71 6c 69 74 65 33 5f 77 69  e the sqlite3_wi
1e2b0 6e 33 32 5f 73 65 74 5f 64 69 72 65 63 74 6f 72  n32_set_director
1e2c0 79 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20  y function does 
1e2d0 6e 6f 74 0d 0a 20 20 20 20 20 20 20 20 20 20 23  not..          #
1e2e0 20 20 20 20 20 20 20 61 70 70 65 61 72 20 74 6f         appear to
1e2f0 20 62 65 20 61 76 61 69 6c 61 62 6c 65 2c 20 75   be available, u
1e300 73 65 20 74 68 65 20 61 73 73 6f 63 69 61 74 65  se the associate
1e310 64 20 50 52 41 47 4d 41 20 63 6f 6d 6d 61 6e 64  d PRAGMA command
1e320 73 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 20  s..          #  
1e330 20 20 20 20 20 69 6e 73 74 65 61 64 2e 0d 0a 20       instead... 
1e340 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
1e350 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 64 69        foreach di
1e360 72 65 63 74 6f 72 79 20 5b 6c 69 73 74 20 64 61  rectory [list da
1e370 74 61 5f 73 74 6f 72 65 5f 64 69 72 65 63 74 6f  ta_store_directo
1e380 72 79 20 74 65 6d 70 5f 73 74 6f 72 65 5f 64 69  ry temp_store_di
1e390 72 65 63 74 6f 72 79 5d 20 7b 0d 0a 20 20 20 20  rectory] {..    
1e3a0 20 20 20 20 20 20 20 20 73 65 74 20 73 71 6c 20          set sql 
1e3b0 5b 61 70 70 65 6e 64 41 72 67 73 20 22 50 52 41  [appendArgs "PRA
1e3c0 47 4d 41 20 22 20 24 64 69 72 65 63 74 6f 72 79  GMA " $directory
1e3d0 20 22 20 3d 20 5c 22 5c 22 3b 22 5d 0d 0a 0d 0a   " = \"\";"]....
1e3e0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b              if {
1e3f0 5b 63 61 74 63 68 20 7b 65 78 65 63 75 74 65 53  [catch {executeS
1e400 71 6c 20 24 73 71 6c 7d 20 72 65 73 75 6c 74 5d  ql $sql} result]
1e410 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20   == 0} then {.. 
1e420 20 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75               tpu
1e430 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70  ts $channel [app
1e440 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
1e450 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d               "--
1e460 2d 2d 20 65 78 65 63 75 74 65 20 50 52 41 47 4d  -- execute PRAGM
1e470 41 20 22 20 24 64 69 72 65 63 74 6f 72 79 20 22  A " $directory "
1e480 2e 2e 2e 20 6f 6b 3a 20 5c 22 22 20 5c 0d 0a 20  ... ok: \"" \.. 
1e490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e4a0 20 24 72 65 73 75 6c 74 20 5c 22 5c 6e 5d 0d 0a   $result \"\n]..
1e4b0 20 20 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c              } el
1e4c0 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  se {..          
1e4d0 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
1e4e0 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
1e4f0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1e500 20 20 20 20 22 2d 2d 2d 2d 20 65 78 65 63 75 74      "---- execut
1e510 65 20 50 52 41 47 4d 41 20 22 20 24 64 69 72 65  e PRAGMA " $dire
1e520 63 74 6f 72 79 20 22 2e 2e 2e 20 65 72 72 6f 72  ctory "... error
1e530 3a 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  : " \..         
1e540 20 20 20 20 20 20 20 20 20 5c 6e 5c 74 20 24 72           \n\t $r
1e550 65 73 75 6c 74 20 5c 6e 5d 0d 0a 20 20 20 20 20  esult \n]..     
1e560 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
1e570 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d      }..        }
1e580 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
1e590 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
1e5a0 54 45 3a 20 46 69 6e 61 6c 6c 79 2c 20 73 68 6f  TE: Finally, sho
1e5b0 77 20 74 68 65 20 63 75 72 72 65 6e 74 20 76 61  w the current va
1e5c0 6c 75 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  lue of the datab
1e5d0 61 73 65 20 61 6e 64 20 74 65 6d 70 6f 72 61 72  ase and temporar
1e5e0 79 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  y..      #      
1e5f0 20 64 69 72 65 63 74 6f 72 69 65 73 2e 20 20 54   directories.  T
1e600 68 69 73 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20  his can only be 
1e610 70 65 72 66 6f 72 6d 65 64 20 69 66 20 53 51 4c  performed if SQL
1e620 69 74 65 20 69 73 20 6c 6f 61 64 65 64 0d 0a 20  ite is loaded.. 
1e630 20 20 20 20 20 23 20 20 20 20 20 20 20 61 6e 64       #       and
1e640 20 72 65 61 64 79 20 66 6f 72 20 75 73 65 20 62   ready for use b
1e650 79 20 74 68 65 20 74 65 73 74 20 73 75 69 74 65  y the test suite
1e660 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
1e670 20 20 69 66 20 7b 5b 69 73 53 51 4c 69 74 65 52    if {[isSQLiteR
1e680 65 61 64 79 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  eady]} then {.. 
1e690 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 64         foreach d
1e6a0 69 72 65 63 74 6f 72 79 20 5b 6c 69 73 74 20 64  irectory [list d
1e6b0 61 74 61 5f 73 74 6f 72 65 5f 64 69 72 65 63 74  ata_store_direct
1e6c0 6f 72 79 20 74 65 6d 70 5f 73 74 6f 72 65 5f 64  ory temp_store_d
1e6d0 69 72 65 63 74 6f 72 79 5d 20 7b 0d 0a 20 20 20  irectory] {..   
1e6e0 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
1e6f0 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
1e700 73 20 22 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e 67  s "---- checking
1e710 20 22 20 24 64 69 72 65 63 74 6f 72 79 20 22 2e   " $directory ".
1e720 2e 2e 20 22 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  .. "]....       
1e730 20 20 20 73 65 74 20 73 71 6c 20 5b 61 70 70 65     set sql [appe
1e740 6e 64 41 72 67 73 20 22 50 52 41 47 4d 41 20 22  ndArgs "PRAGMA "
1e750 20 24 64 69 72 65 63 74 6f 72 79 20 5c 3b 5d 0d   $directory \;].
1e760 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20  ...          if 
1e770 7b 5b 63 61 74 63 68 20 7b 65 78 65 63 75 74 65  {[catch {execute
1e780 53 71 6c 20 24 73 71 6c 20 73 63 61 6c 61 72 7d  Sql $sql scalar}
1e790 20 72 65 73 75 6c 74 5d 20 3d 3d 20 30 7d 20 74   result] == 0} t
1e7a0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
1e7b0 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
1e7c0 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 22 6f  l [appendArgs "o
1e7d0 6b 3a 20 5c 22 22 20 24 72 65 73 75 6c 74 20 5c  k: \"" $result \
1e7e0 22 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20  "\n]..          
1e7f0 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
1e800 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
1e810 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
1e820 20 22 65 72 72 6f 72 3a 20 22 20 5c 6e 5c 74 20   "error: " \n\t 
1e830 24 72 65 73 75 6c 74 20 5c 6e 5d 0d 0a 20 20 20  $result \n]..   
1e840 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
1e850 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20    }..      }..  
1e860 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
1e870 20 6c 6f 61 64 53 51 4c 69 74 65 54 65 73 74 53   loadSQLiteTestS
1e880 65 74 74 69 6e 67 73 20 7b 20 63 68 61 6e 6e 65  ettings { channe
1e890 6c 20 7b 73 75 66 66 69 78 20 22 22 7d 20 7b 71  l {suffix ""} {q
1e8a0 75 69 65 74 20 66 61 6c 73 65 7d 20 7d 20 7b 0d  uiet false} } {.
1e8b0 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
1e8c0 23 20 4e 4f 54 45 3a 20 53 6b 69 70 20 6c 6f 61  # NOTE: Skip loa
1e8d0 64 69 6e 67 20 74 68 65 20 73 65 74 74 69 6e 67  ding the setting
1e8e0 73 20 69 66 20 74 68 65 69 72 20 75 73 61 67 65  s if their usage
1e8f0 20 68 61 73 20 62 65 65 6e 20 64 69 73 61 62 6c   has been disabl
1e900 65 64 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  ed...      #..  
1e910 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65      if {![info e
1e920 78 69 73 74 73 20 3a 3a 6e 6f 28 73 71 6c 69 74  xists ::no(sqlit
1e930 65 54 65 73 74 53 65 74 74 69 6e 67 73 29 5d 7d  eTestSettings)]}
1e940 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
1e950 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
1e960 54 45 3a 20 4c 6f 61 64 20 63 75 73 74 6f 6d 20  TE: Load custom 
1e970 70 65 72 2d 75 73 65 72 20 61 6e 64 2f 6f 72 20  per-user and/or 
1e980 70 65 72 2d 68 6f 73 74 20 74 65 73 74 20 73 65  per-host test se
1e990 74 74 69 6e 67 73 20 6e 6f 77 2e 0d 0a 20 20 20  ttings now...   
1e9a0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
1e9b0 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73  if {[info exists
1e9c0 20 3a 3a 74 63 6c 5f 70 6c 61 74 66 6f 72 6d 28   ::tcl_platform(
1e9d0 75 73 65 72 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a  user)]} then {..
1e9e0 20 20 20 20 20 20 20 20 20 20 73 65 74 20 75 73            set us
1e9f0 65 72 53 65 74 74 69 6e 67 73 46 69 6c 65 4e 61  erSettingsFileNa
1ea00 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5b 67  me [file join [g
1ea10 65 74 43 6f 6d 6d 6f 6e 44 69 72 65 63 74 6f 72  etCommonDirector
1ea20 79 5d 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  y] \..          
1ea30 20 20 20 20 5b 61 70 70 65 6e 64 41 72 67 73 20      [appendArgs 
1ea40 73 65 74 74 69 6e 67 73 20 24 73 75 66 66 69 78  settings $suffix
1ea50 20 2e 20 24 3a 3a 74 63 6c 5f 70 6c 61 74 66 6f   . $::tcl_platfo
1ea60 72 6d 28 75 73 65 72 29 20 2e 65 61 67 6c 65 5d  rm(user) .eagle]
1ea70 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 69  ]....          i
1ea80 66 20 7b 5b 66 69 6c 65 20 65 78 69 73 74 73 20  f {[file exists 
1ea90 24 75 73 65 72 53 65 74 74 69 6e 67 73 46 69 6c  $userSettingsFil
1eaa0 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a  eName]} then {..
1eab0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b              if {
1eac0 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d  !$quiet} then {.
1ead0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74  .              t
1eae0 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61  puts $channel [a
1eaf0 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
1eb00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
1eb10 2d 2d 2d 2d 20 6c 6f 61 64 69 6e 67 20 70 65 72  ---- loading per
1eb20 2d 75 73 65 72 20 74 65 73 74 20 73 65 74 74 69  -user test setti
1eb30 6e 67 73 20 66 69 6c 65 20 5c 22 22 20 5c 0d 0a  ngs file \"" \..
1eb40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eb50 20 20 24 75 73 65 72 53 65 74 74 69 6e 67 73 46    $userSettingsF
1eb60 69 6c 65 4e 61 6d 65 20 5c 22 2e 2e 2e 5c 6e 5d  ileName \"...\n]
1eb70 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
1eb80 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ...            i
1eb90 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20  f {[catch {..   
1eba0 20 20 20 20 20 20 20 20 20 20 20 75 70 6c 65 76             uplev
1ebb0 65 6c 20 31 20 5b 6c 69 73 74 20 73 6f 75 72 63  el 1 [list sourc
1ebc0 65 20 24 75 73 65 72 53 65 74 74 69 6e 67 73 46  e $userSettingsF
1ebd0 69 6c 65 4e 61 6d 65 5d 0d 0a 20 20 20 20 20 20  ileName]..      
1ebe0 20 20 20 20 20 20 7d 20 65 72 72 6f 72 5d 7d 20        } error]} 
1ebf0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
1ec00 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65        if {!$quie
1ec10 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  t} then {..     
1ec20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
1ec30 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e   $channel [appen
1ec40 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
1ec50 20 20 20 20 20 20 20 20 20 20 20 20 20 22 3d 3d               "==
1ec60 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c  == WARNING: fail
1ec70 65 64 20 74 6f 20 6c 6f 61 64 20 70 65 72 2d 75  ed to load per-u
1ec80 73 65 72 20 73 65 74 74 69 6e 67 73 20 66 69 6c  ser settings fil
1ec90 65 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20 20  e \"" \..       
1eca0 20 20 20 20 20 20 20 20 20 20 20 20 20 24 75 73               $us
1ecb0 65 72 53 65 74 74 69 6e 67 73 46 69 6c 65 4e 61  erSettingsFileNa
1ecc0 6d 65 20 22 5c 22 2c 20 65 72 72 6f 72 3a 20 22  me "\", error: "
1ecd0 20 5c 6e 5c 74 20 24 65 72 72 6f 72 20 5c 6e 5d   \n\t $error \n]
1ece0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1ecf0 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  }..            }
1ed00 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c  ..          } el
1ed10 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  se {..          
1ed20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74    if {!$quiet} t
1ed30 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
1ed40 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
1ed50 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
1ed60 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
1ed70 20 20 20 20 20 22 2d 2d 2d 2d 20 73 6b 69 70 70       "---- skipp
1ed80 65 64 20 6c 6f 61 64 69 6e 67 20 70 65 72 2d 75  ed loading per-u
1ed90 73 65 72 20 74 65 73 74 20 73 65 74 74 69 6e 67  ser test setting
1eda0 73 20 66 69 6c 65 20 5c 22 22 20 5c 0d 0a 20 20  s file \"" \..  
1edb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1edc0 24 75 73 65 72 53 65 74 74 69 6e 67 73 46 69 6c  $userSettingsFil
1edd0 65 4e 61 6d 65 20 22 5c 22 2c 20 69 74 20 64 6f  eName "\", it do
1ede0 65 73 20 6e 6f 74 20 65 78 69 73 74 5c 6e 22 5d  es not exist\n"]
1edf0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
1ee00 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  .          }..  
1ee10 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
1ee20 20 20 20 23 23 23 23 23 23 23 23 23 23 23 23 23     #############
1ee30 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1ee40 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1ee50 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1ee60 23 23 23 23 23 23 23 23 23 23 0d 0a 0d 0a 20 20  ##########....  
1ee70 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20        if {[info 
1ee80 65 78 69 73 74 73 20 3a 3a 74 63 6c 5f 70 6c 61  exists ::tcl_pla
1ee90 74 66 6f 72 6d 28 68 6f 73 74 29 5d 7d 20 74 68  tform(host)]} th
1eea0 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
1eeb0 73 65 74 20 68 6f 73 74 53 65 74 74 69 6e 67 73  set hostSettings
1eec0 46 69 6c 65 4e 61 6d 65 20 5b 66 69 6c 65 20 6a  FileName [file j
1eed0 6f 69 6e 20 5b 67 65 74 43 6f 6d 6d 6f 6e 44 69  oin [getCommonDi
1eee0 72 65 63 74 6f 72 79 5d 20 5c 0d 0a 20 20 20 20  rectory] \..    
1eef0 20 20 20 20 20 20 20 20 20 20 5b 61 70 70 65 6e            [appen
1ef00 64 41 72 67 73 20 73 65 74 74 69 6e 67 73 20 24  dArgs settings $
1ef10 73 75 66 66 69 78 20 2e 20 24 3a 3a 74 63 6c 5f  suffix . $::tcl_
1ef20 70 6c 61 74 66 6f 72 6d 28 68 6f 73 74 29 20 2e  platform(host) .
1ef30 65 61 67 6c 65 5d 5d 0d 0a 0d 0a 20 20 20 20 20  eagle]]....     
1ef40 20 20 20 20 20 69 66 20 7b 5b 66 69 6c 65 20 65       if {[file e
1ef50 78 69 73 74 73 20 24 68 6f 73 74 53 65 74 74 69  xists $hostSetti
1ef60 6e 67 73 46 69 6c 65 4e 61 6d 65 5d 7d 20 74 68  ngsFileName]} th
1ef70 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
1ef80 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74    if {!$quiet} t
1ef90 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
1efa0 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
1efb0 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
1efc0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
1efd0 20 20 20 20 20 22 2d 2d 2d 2d 20 6c 6f 61 64 69       "---- loadi
1efe0 6e 67 20 70 65 72 2d 68 6f 73 74 20 74 65 73 74  ng per-host test
1eff0 20 73 65 74 74 69 6e 67 73 20 66 69 6c 65 20 5c   settings file \
1f000 22 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  "" \..          
1f010 20 20 20 20 20 20 20 20 24 68 6f 73 74 53 65 74          $hostSet
1f020 74 69 6e 67 73 46 69 6c 65 4e 61 6d 65 20 5c 22  tingsFileName \"
1f030 2e 2e 2e 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20  ...\n]..        
1f040 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
1f050 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20       if {[catch 
1f060 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
1f070 20 75 70 6c 65 76 65 6c 20 31 20 5b 6c 69 73 74   uplevel 1 [list
1f080 20 73 6f 75 72 63 65 20 24 68 6f 73 74 53 65 74   source $hostSet
1f090 74 69 6e 67 73 46 69 6c 65 4e 61 6d 65 5d 0d 0a  tingsFileName]..
1f0a0 20 20 20 20 20 20 20 20 20 20 20 20 7d 20 65 72              } er
1f0b0 72 6f 72 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ror]} then {..  
1f0c0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b              if {
1f0d0 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d  !$quiet} then {.
1f0e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1f0f0 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
1f100 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
1f110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f120 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47     "==== WARNING
1f130 3a 20 66 61 69 6c 65 64 20 74 6f 20 6c 6f 61 64  : failed to load
1f140 20 70 65 72 2d 68 6f 73 74 20 73 65 74 74 69 6e   per-host settin
1f150 67 73 20 66 69 6c 65 20 5c 22 22 20 5c 0d 0a 20  gs file \"" \.. 
1f160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f170 20 20 20 24 68 6f 73 74 53 65 74 74 69 6e 67 73     $hostSettings
1f180 46 69 6c 65 4e 61 6d 65 20 22 5c 22 2c 20 65 72  FileName "\", er
1f190 72 6f 72 3a 20 22 20 5c 6e 5c 74 20 24 65 72 72  ror: " \n\t $err
1f1a0 6f 72 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20  or \n]..        
1f1b0 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
1f1c0 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
1f1d0 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
1f1e0 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75          if {!$qu
1f1f0 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  iet} then {..   
1f200 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
1f210 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e   $channel [appen
1f220 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
1f230 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
1f240 20 73 6b 69 70 70 65 64 20 6c 6f 61 64 69 6e 67   skipped loading
1f250 20 70 65 72 2d 68 6f 73 74 20 74 65 73 74 20 73   per-host test s
1f260 65 74 74 69 6e 67 73 20 66 69 6c 65 20 5c 22 22  ettings file \""
1f270 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
1f280 20 20 20 20 20 20 24 68 6f 73 74 53 65 74 74 69        $hostSetti
1f290 6e 67 73 46 69 6c 65 4e 61 6d 65 20 22 5c 22 2c  ngsFileName "\",
1f2a0 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 65 78 69   it does not exi
1f2b0 73 74 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20  st\n"]..        
1f2c0 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
1f2d0 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20   }..        }.. 
1f2e0 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c       }..    }...
1f2f0 0d 0a 20 20 20 20 70 72 6f 63 20 72 75 6e 53 51  ..    proc runSQ
1f300 4c 69 74 65 54 65 73 74 50 72 6f 6c 6f 67 75 65  LiteTestPrologue
1f310 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a   {} {..      #..
1f320 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 6b        # NOTE: Sk
1f330 69 70 20 72 75 6e 6e 69 6e 67 20 6f 75 72 20 63  ip running our c
1f340 75 73 74 6f 6d 20 70 72 6f 6c 6f 67 75 65 20 69  ustom prologue i
1f350 66 20 74 68 65 20 6d 61 69 6e 20 6f 6e 65 20 68  f the main one h
1f360 61 73 20 62 65 65 6e 0d 0a 20 20 20 20 20 20 23  as been..      #
1f370 20 20 20 20 20 20 20 73 6b 69 70 70 65 64 2e 0d         skipped..
1f380 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
1f390 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74  if {![info exist
1f3a0 73 20 3a 3a 6e 6f 28 70 72 6f 6c 6f 67 75 65 2e  s ::no(prologue.
1f3b0 65 61 67 6c 65 29 5d 7d 20 74 68 65 6e 20 7b 0d  eagle)]} then {.
1f3c0 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
1f3d0 20 20 20 20 23 20 4e 4f 54 45 3a 20 4c 6f 61 64      # NOTE: Load
1f3e0 20 74 68 65 20 22 62 65 66 6f 72 65 2d 63 6f 6e   the "before-con
1f3f0 73 74 72 61 69 6e 74 73 22 20 63 75 73 74 6f 6d  straints" custom
1f400 20 70 65 72 2d 75 73 65 72 20 61 6e 64 2f 6f 72   per-user and/or
1f410 20 70 65 72 2d 68 6f 73 74 0d 0a 20 20 20 20 20   per-host..     
1f420 20 20 20 23 20 20 20 20 20 20 20 74 65 73 74 20     #       test 
1f430 73 65 74 74 69 6e 67 73 20 6e 6f 77 2e 0d 0a 20  settings now... 
1f440 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
1f450 20 20 75 70 6c 65 76 65 6c 20 31 20 5b 6c 69 73    uplevel 1 [lis
1f460 74 20 6c 6f 61 64 53 51 4c 69 74 65 54 65 73 74  t loadSQLiteTest
1f470 53 65 74 74 69 6e 67 73 20 24 3a 3a 74 65 73 74  Settings $::test
1f480 5f 63 68 61 6e 6e 65 6c 20 2e 62 65 66 6f 72 65  _channel .before
1f490 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  ]....        #..
1f4a0 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
1f4b0 43 68 65 63 6b 20 69 66 20 74 68 65 20 5b 6f 62  Check if the [ob
1f4c0 6a 65 63 74 5d 20 63 6f 6d 6d 61 6e 64 20 69 73  ject] command is
1f4d0 20 61 76 61 69 6c 61 62 6c 65 3b 20 69 66 20 6e   available; if n
1f4e0 6f 74 2c 20 61 64 64 20 73 6f 6d 65 0d 0a 20 20  ot, add some..  
1f4f0 20 20 20 20 20 20 23 20 20 20 20 20 20 20 73 68        #       sh
1f500 69 6d 73 20 74 6f 20 6d 61 6b 65 20 74 68 65 20  ims to make the 
1f510 74 65 73 74 20 73 75 69 74 65 20 72 75 6e 20 73  test suite run s
1f520 6d 6f 6f 74 68 65 72 2e 0d 0a 20 20 20 20 20 20  moother...      
1f530 20 20 23 0d 0a 20 20 20 20 20 20 20 20 63 68 65    #..        che
1f540 63 6b 46 6f 72 53 51 4c 69 74 65 4f 62 6a 65 63  ckForSQLiteObjec
1f550 74 43 6f 6d 6d 61 6e 64 20 24 3a 3a 74 65 73 74  tCommand $::test
1f560 5f 63 68 61 6e 6e 65 6c 0d 0a 0d 0a 20 20 20 20  _channel....    
1f570 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
1f580 20 4e 4f 54 45 3a 20 44 65 74 65 72 6d 69 6e 65   NOTE: Determine
1f590 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 74 68   the names of th
1f5a0 65 20 6e 61 74 69 76 65 20 70 6c 61 74 66 6f 72  e native platfor
1f5b0 6d 20 61 6e 64 20 61 72 63 68 69 74 65 63 74 75  m and architectu
1f5c0 72 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  re...        #..
1f5d0 20 20 20 20 20 20 20 20 73 65 74 20 70 6c 61 74          set plat
1f5e0 66 6f 72 6d 20 5b 67 65 74 42 75 69 6c 64 50 6c  form [getBuildPl
1f5f0 61 74 66 6f 72 6d 20 74 72 75 65 5d 0d 0a 20 20  atform true]..  
1f600 20 20 20 20 20 20 73 65 74 20 61 72 63 68 69 74        set archit
1f610 65 63 74 75 72 65 20 5b 61 72 63 68 69 74 65 63  ecture [architec
1f620 74 75 72 65 46 6f 72 50 6c 61 74 66 6f 72 6d 20  tureForPlatform 
1f630 24 70 6c 61 74 66 6f 72 6d 5d 0d 0a 0d 0a 20 20  $platform]....  
1f640 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
1f650 20 23 20 4e 4f 54 45 3a 20 53 68 6f 77 20 74 68   # NOTE: Show th
1f660 65 20 70 6c 61 74 66 6f 72 6d 20 61 6e 64 20 61  e platform and a
1f670 72 63 68 69 74 65 63 74 75 72 65 20 75 73 65 64  rchitecture used
1f680 20 74 6f 20 68 65 6c 70 20 6c 6f 63 61 74 65 20   to help locate 
1f690 74 68 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20  the..        #  
1f6a0 20 20 20 20 20 6e 61 74 69 76 65 20 62 75 69 6c       native buil
1f6b0 64 20 66 69 6c 65 73 2e 0d 0a 20 20 20 20 20 20  d files...      
1f6c0 20 20 23 0d 0a 20 20 20 20 20 20 20 20 74 70 75    #..        tpu
1f6d0 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
1f6e0 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
1f6f0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 2d  ..            "-
1f700 2d 2d 2d 20 70 6c 61 74 66 6f 72 6d 20 66 6f 72  --- platform for
1f710 20 6c 6f 63 61 74 69 6e 67 20 6e 61 74 69 76 65   locating native
1f720 20 62 75 69 6c 64 20 66 69 6c 65 73 20 69 73 20   build files is 
1f730 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  \"" \..         
1f740 20 20 20 24 70 6c 61 74 66 6f 72 6d 20 5c 22 5c     $platform \"\
1f750 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 74 70  n]....        tp
1f760 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  uts $::test_chan
1f770 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
1f780 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22  \..            "
1f790 2d 2d 2d 2d 20 61 72 63 68 69 74 65 63 74 75 72  ---- architectur
1f7a0 65 20 66 6f 72 20 6c 6f 63 61 74 69 6e 67 20 6e  e for locating n
1f7b0 61 74 69 76 65 20 62 75 69 6c 64 20 66 69 6c 65  ative build file
1f7c0 73 20 69 73 20 5c 22 22 20 5c 0d 0a 20 20 20 20  s is \"" \..    
1f7d0 20 20 20 20 20 20 20 20 24 61 72 63 68 69 74 65          $archite
1f7e0 63 74 75 72 65 20 5c 22 5c 6e 5d 0d 0a 0d 0a 20  cture \"\n].... 
1f7f0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
1f800 20 20 23 20 4e 4f 54 45 3a 20 42 75 69 6c 64 20    # NOTE: Build 
1f810 61 20 6c 69 73 74 20 6f 66 20 63 6f 6e 66 69 67  a list of config
1f820 75 72 61 74 69 6f 6e 20 66 69 6c 65 73 20 74 68  uration files th
1f830 61 74 20 77 65 20 68 61 6e 64 6c 65 2e 0d 0a 20  at we handle... 
1f840 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
1f850 20 20 73 65 74 20 63 6f 6e 66 69 67 46 69 6c 65    set configFile
1f860 4e 61 6d 65 73 20 5b 6c 69 73 74 20 5c 0d 0a 20  Names [list \.. 
1f870 20 20 20 20 20 20 20 20 20 20 20 53 79 73 74 65             Syste
1f880 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 64 6c  m.Data.SQLite.dl
1f890 6c 2e 63 6f 6e 66 69 67 5d 0d 0a 0d 0a 20 20 20  l.config]....   
1f8a0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
1f8b0 23 20 4e 4f 54 45 3a 20 42 75 69 6c 64 20 61 20  # NOTE: Build a 
1f8c0 6c 69 73 74 20 6f 66 20 61 75 78 69 6c 69 61 72  list of auxiliar
1f8d0 79 20 4d 61 6e 61 67 65 64 20 44 65 62 75 67 67  y Managed Debugg
1f8e0 69 6e 67 20 41 73 73 69 73 74 61 6e 74 73 20 28  ing Assistants (
1f8f0 4d 44 41 29 0d 0a 20 20 20 20 20 20 20 20 23 20  MDA)..        # 
1f900 20 20 20 20 20 20 63 6f 6e 66 69 67 75 72 61 74        configurat
1f910 69 6f 6e 20 66 69 6c 65 73 20 74 68 61 74 20 77  ion files that w
1f920 65 20 68 61 6e 64 6c 65 2e 0d 0a 20 20 20 20 20  e handle...     
1f930 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 73 65     #..        se
1f940 74 20 6d 64 61 43 6f 6e 66 69 67 46 69 6c 65 4e  t mdaConfigFileN
1f950 61 6d 65 73 20 5b 6c 69 73 74 20 5c 0d 0a 20 20  ames [list \..  
1f960 20 20 20 20 20 20 20 20 20 20 45 61 67 6c 65 53            EagleS
1f970 68 65 6c 6c 33 32 2e 65 78 65 2e 6d 64 61 2e 63  hell32.exe.mda.c
1f980 6f 6e 66 69 67 20 49 6e 73 74 61 6c 6c 65 72 2e  onfig Installer.
1f990 65 78 65 2e 6d 64 61 2e 63 6f 6e 66 69 67 20 5c  exe.mda.config \
1f9a0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 65  ..            te
1f9b0 73 74 2e 65 78 65 2e 6d 64 61 2e 63 6f 6e 66 69  st.exe.mda.confi
1f9c0 67 20 74 65 73 74 6c 69 6e 71 2e 65 78 65 2e 6d  g testlinq.exe.m
1f9d0 64 61 2e 63 6f 6e 66 69 67 20 5c 0d 0a 20 20 20  da.config \..   
1f9e0 20 20 20 20 20 20 20 20 20 74 65 73 74 65 66 36           testef6
1f9f0 2e 65 78 65 2e 6d 64 61 2e 63 6f 6e 66 69 67 5d  .exe.mda.config]
1fa00 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  ....        #.. 
1fa10 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 42         # NOTE: B
1fa20 75 69 6c 64 20 74 68 65 20 6c 69 73 74 20 6f 66  uild the list of
1fa30 20 65 78 74 65 72 6e 61 6c 20 66 69 6c 65 73 20   external files 
1fa40 74 68 61 74 20 77 65 20 68 61 6e 64 6c 65 2e 20  that we handle. 
1fa50 20 53 6f 6d 65 20 6f 66 0d 0a 20 20 20 20 20 20   Some of..      
1fa60 20 20 23 20 20 20 20 20 20 20 74 68 65 73 65 20    #       these 
1fa70 66 69 6c 65 73 20 6d 61 79 20 62 65 20 6e 61 74  files may be nat
1fa80 69 76 65 20 61 6e 64 2f 6f 72 20 6d 61 6e 61 67  ive and/or manag
1fa90 65 64 20 61 73 73 65 6d 62 6c 69 65 73 20 74 68  ed assemblies th
1faa0 61 74 20 61 72 65 0d 0a 20 20 20 20 20 20 20 20  at are..        
1fab0 23 20 20 20 20 20 20 20 72 65 71 75 69 72 65 64  #       required
1fac0 20 74 6f 20 70 65 72 66 6f 72 6d 20 76 61 72 69   to perform vari
1fad0 6f 75 73 20 74 65 73 74 73 2e 0d 0a 20 20 20 20  ous tests...    
1fae0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 73      #..        s
1faf0 65 74 20 65 78 74 65 72 6e 61 6c 46 69 6c 65 4e  et externalFileN
1fb00 61 6d 65 73 20 5b 6c 69 73 74 20 5c 0d 0a 20 20  ames [list \..  
1fb10 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20            [file 
1fb20 6a 6f 69 6e 20 45 6e 74 69 74 79 46 72 61 6d 65  join EntityFrame
1fb30 77 6f 72 6b 20 6c 69 62 20 5b 73 74 72 69 6e 67  work lib [string
1fb40 20 6d 61 70 20 5b 6c 69 73 74 20 46 78 20 22 22   map [list Fx ""
1fb50 5d 20 5b 73 74 72 69 6e 67 20 5c 0d 0a 20 20 20  ] [string \..   
1fb60 20 20 20 20 20 20 20 20 20 6d 61 70 20 5b 6c 69           map [li
1fb70 73 74 20 6e 65 74 46 78 34 35 31 20 6e 65 74 46  st netFx451 netF
1fb80 78 34 35 20 6e 65 74 46 78 34 35 32 20 6e 65 74  x45 netFx452 net
1fb90 46 78 34 35 20 6e 65 74 46 78 34 36 20 6e 65 74  Fx45 netFx46 net
1fba0 46 78 34 35 20 5c 0d 0a 20 20 20 20 20 20 20 20  Fx45 \..        
1fbb0 20 20 20 20 6e 65 74 46 78 34 36 31 20 6e 65 74      netFx461 net
1fbc0 46 78 34 35 5d 20 5b 67 65 74 42 75 69 6c 64 4e  Fx45] [getBuildN
1fbd0 65 74 46 78 5d 5d 5d 20 45 6e 74 69 74 79 46 72  etFx]]] EntityFr
1fbe0 61 6d 65 77 6f 72 6b 2e 64 6c 6c 5d 5d 0d 0a 0d  amework.dll]]...
1fbf0 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
1fc00 20 20 20 20 23 20 4e 4f 54 45 3a 20 42 75 69 6c      # NOTE: Buil
1fc10 64 20 74 68 65 20 6c 69 73 74 20 6f 66 20 6e 61  d the list of na
1fc20 74 69 76 65 20 61 73 73 65 6d 62 6c 79 20 66 69  tive assembly fi
1fc30 6c 65 73 20 74 68 61 74 20 77 65 20 68 61 6e 64  les that we hand
1fc40 6c 65 2e 20 20 54 68 65 0d 0a 20 20 20 20 20 20  le.  The..      
1fc50 20 20 23 20 20 20 20 20 20 20 72 65 61 73 6f 6e    #       reason
1fc60 20 74 68 65 20 22 53 79 73 74 65 6d 2e 44 61 74   the "System.Dat
1fc70 61 2e 53 51 4c 69 74 65 2e 64 6c 6c 22 20 66 69  a.SQLite.dll" fi
1fc80 6c 65 20 69 73 20 69 6e 63 6c 75 64 65 64 20 68  le is included h
1fc90 65 72 65 20 69 73 0d 0a 20 20 20 20 20 20 20 20  ere is..        
1fca0 23 20 20 20 20 20 20 20 62 65 63 61 75 73 65 20  #       because 
1fcb0 69 74 20 63 6f 75 6c 64 20 62 65 20 74 68 65 20  it could be the 
1fcc0 6d 69 78 65 64 2d 6d 6f 64 65 20 61 73 73 65 6d  mixed-mode assem
1fcd0 62 6c 79 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  bly...        #.
1fce0 0a 20 20 20 20 20 20 20 20 73 65 74 20 6e 61 74  .        set nat
1fcf0 69 76 65 46 69 6c 65 4e 61 6d 65 73 20 5b 6c 69  iveFileNames [li
1fd00 73 74 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 65  st]....        e
1fd10 76 61 6c 20 6c 61 70 70 65 6e 64 20 6e 61 74 69  val lappend nati
1fd20 76 65 46 69 6c 65 4e 61 6d 65 73 20 5b 67 65 74  veFileNames [get
1fd30 4e 61 74 69 76 65 4c 69 62 72 61 72 79 46 69 6c  NativeLibraryFil
1fd40 65 4e 61 6d 65 73 4f 6e 6c 79 5d 0d 0a 20 20 20  eNamesOnly]..   
1fd50 20 20 20 20 20 65 76 61 6c 20 6c 61 70 70 65 6e       eval lappen
1fd60 64 20 6e 61 74 69 76 65 46 69 6c 65 4e 61 6d 65  d nativeFileName
1fd70 73 20 5b 67 65 74 49 6e 74 65 72 6f 70 41 73 73  s [getInteropAss
1fd80 65 6d 62 6c 79 46 69 6c 65 4e 61 6d 65 73 4f 6e  emblyFileNamesOn
1fd90 6c 79 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 6c  ly]....        l
1fda0 61 70 70 65 6e 64 20 6e 61 74 69 76 65 46 69 6c  append nativeFil
1fdb0 65 4e 61 6d 65 73 20 53 79 73 74 65 6d 2e 44 61  eNames System.Da
1fdc0 74 61 2e 53 51 4c 69 74 65 2e 64 6c 6c 0d 0a 0d  ta.SQLite.dll...
1fdd0 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
1fde0 20 20 20 20 23 20 4e 4f 54 45 3a 20 42 75 69 6c      # NOTE: Buil
1fdf0 64 20 74 68 65 20 6c 69 73 74 20 6f 66 20 6d 61  d the list of ma
1fe00 6e 61 67 65 64 20 61 73 73 65 6d 62 6c 79 20 66  naged assembly f
1fe10 69 6c 65 73 20 74 68 61 74 20 77 65 20 68 61 6e  iles that we han
1fe20 64 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  dle...        #.
1fe30 0a 20 20 20 20 20 20 20 20 73 65 74 20 6d 61 6e  .        set man
1fe40 61 67 65 64 46 69 6c 65 4e 61 6d 65 73 20 5b 6c  agedFileNames [l
1fe50 69 73 74 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ist \..         
1fe60 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53     System.Data.S
1fe70 51 4c 69 74 65 2e 64 6c 6c 20 53 79 73 74 65 6d  QLite.dll System
1fe80 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 4c 69 6e  .Data.SQLite.Lin
1fe90 71 2e 64 6c 6c 20 5c 0d 0a 20 20 20 20 20 20 20  q.dll \..       
1fea0 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61       System.Data
1feb0 2e 53 51 4c 69 74 65 2e 45 46 36 2e 64 6c 6c 5d  .SQLite.EF6.dll]
1fec0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  ....        #.. 
1fed0 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 52         # NOTE: R
1fee0 65 6d 6f 76 65 20 61 6e 79 20 74 65 73 74 20 63  emove any test c
1fef0 6f 6e 73 74 72 61 69 6e 74 73 20 74 68 61 74 20  onstraints that 
1ff00 72 65 66 65 72 20 74 6f 20 74 68 65 20 6e 61 74  refer to the nat
1ff10 69 76 65 20 61 6e 64 2f 6f 72 0d 0a 20 20 20 20  ive and/or..    
1ff20 20 20 20 20 23 20 20 20 20 20 20 20 6d 61 6e 61      #       mana
1ff30 67 65 64 20 61 73 73 65 6d 62 6c 79 20 66 69 6c  ged assembly fil
1ff40 65 73 20 74 68 61 74 20 77 65 20 68 61 6e 64 6c  es that we handl
1ff50 65 20 75 6e 6c 65 73 73 20 66 6f 72 62 69 64 64  e unless forbidd
1ff60 65 6e 20 66 72 6f 6d 0d 0a 20 20 20 20 20 20 20  en from..       
1ff70 20 23 20 20 20 20 20 20 20 64 6f 69 6e 67 20 73   #       doing s
1ff80 6f 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  o...        #.. 
1ff90 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66         if {![inf
1ffa0 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 73 71  o exists ::no(sq
1ffb0 6c 69 74 65 52 65 6d 6f 76 65 43 6f 6e 73 74 72  liteRemoveConstr
1ffc0 61 69 6e 74 73 29 5d 7d 20 74 68 65 6e 20 7b 0d  aints)]} then {.
1ffd0 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 65 61  .          forea
1ffe0 63 68 20 66 69 6c 65 4e 61 6d 65 20 24 63 6f 6e  ch fileName $con
1fff0 66 69 67 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a  figFileNames {..
20000 20 20 20 20 20 20 20 20 20 20 20 20 72 65 6d 6f              remo
20010 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70  veConstraint [ap
20020 70 65 6e 64 41 72 67 73 20 66 69 6c 65 5f 20 24  pendArgs file_ $
20030 66 69 6c 65 4e 61 6d 65 5d 0d 0a 20 20 20 20 20  fileName]..     
20040 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
20050 20 20 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65      foreach file
20060 4e 61 6d 65 20 24 6d 64 61 43 6f 6e 66 69 67 46  Name $mdaConfigF
20070 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20  ileNames {..    
20080 20 20 20 20 20 20 20 20 72 65 6d 6f 76 65 43 6f          removeCo
20090 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64  nstraint [append
200a0 41 72 67 73 20 66 69 6c 65 5f 20 24 66 69 6c 65  Args file_ $file
200b0 4e 61 6d 65 5d 0d 0a 20 20 20 20 20 20 20 20 20  Name]..         
200c0 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   }....          
200d0 66 6f 72 65 61 63 68 20 66 69 6c 65 4e 61 6d 65  foreach fileName
200e0 20 24 65 78 74 65 72 6e 61 6c 46 69 6c 65 4e 61   $externalFileNa
200f0 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  mes {..         
20100 20 20 20 72 65 6d 6f 76 65 43 6f 6e 73 74 72 61     removeConstra
20110 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20  int [appendArgs 
20120 66 69 6c 65 5f 20 5b 66 69 6c 65 20 74 61 69 6c  file_ [file tail
20130 20 24 66 69 6c 65 4e 61 6d 65 5d 5d 0d 0a 20 20   $fileName]]..  
20140 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
20150 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 66         foreach f
20160 69 6c 65 4e 61 6d 65 20 24 6e 61 74 69 76 65 46  ileName $nativeF
20170 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20  ileNames {..    
20180 20 20 20 20 20 20 20 20 72 65 6d 6f 76 65 43 6f          removeCo
20190 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64  nstraint [append
201a0 41 72 67 73 20 66 69 6c 65 5f 20 24 66 69 6c 65  Args file_ $file
201b0 4e 61 6d 65 5d 0d 0a 20 20 20 20 20 20 20 20 20  Name]..         
201c0 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   }....          
201d0 66 6f 72 65 61 63 68 20 66 69 6c 65 4e 61 6d 65  foreach fileName
201e0 20 24 6d 61 6e 61 67 65 64 46 69 6c 65 4e 61 6d   $managedFileNam
201f0 65 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  es {..          
20200 20 20 72 65 6d 6f 76 65 43 6f 6e 73 74 72 61 69    removeConstrai
20210 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20 66  nt [appendArgs f
20220 69 6c 65 5f 20 24 66 69 6c 65 4e 61 6d 65 5d 0d  ile_ $fileName].
20230 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  .          }..  
20240 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
20250 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
20260 4e 4f 54 45 3a 20 53 6b 69 70 20 61 6c 6c 20 53  NOTE: Skip all S
20270 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
20280 65 20 72 65 6c 61 74 65 64 20 66 69 6c 65 20 68  e related file h
20290 61 6e 64 6c 69 6e 67 20 28 64 65 6c 65 74 69 6e  andling (deletin
202a0 67 2c 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  g,..        #   
202b0 20 20 20 20 63 6f 70 79 69 6e 67 2c 20 61 6e 64      copying, and
202c0 20 6c 6f 61 64 69 6e 67 29 20 69 66 20 69 6e 73   loading) if ins
202d0 74 72 75 63 74 65 64 2e 0d 0a 20 20 20 20 20 20  tructed...      
202e0 20 20 23 0d 0a 20 20 20 20 20 20 20 20 69 66 20    #..        if 
202f0 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a  {![info exists :
20300 3a 6e 6f 28 73 71 6c 69 74 65 46 69 6c 65 73 29  :no(sqliteFiles)
20310 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
20320 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
20330 20 20 23 20 4e 4f 54 45 3a 20 53 6b 69 70 20 74    # NOTE: Skip t
20340 72 79 69 6e 67 20 74 6f 20 64 65 6c 65 74 65 20  rying to delete 
20350 61 6e 79 20 66 69 6c 65 73 20 69 66 20 69 6e 73  any files if ins
20360 74 72 75 63 74 65 64 2e 0d 0a 20 20 20 20 20 20  tructed...      
20370 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
20380 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73   if {![info exis
20390 74 73 20 3a 3a 6e 6f 28 64 65 6c 65 74 65 53 71  ts ::no(deleteSq
203a0 6c 69 74 65 46 69 6c 65 73 29 5d 7d 20 74 68 65  liteFiles)]} the
203b0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
203c0 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73   if {![info exis
203d0 74 73 20 3a 3a 6e 6f 28 64 65 6c 65 74 65 53 71  ts ::no(deleteSq
203e0 6c 69 74 65 43 6f 6e 66 69 67 46 69 6c 65 73 29  liteConfigFiles)
203f0 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
20400 20 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68           foreach
20410 20 66 69 6c 65 4e 61 6d 65 20 24 63 6f 6e 66 69   fileName $confi
20420 67 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20  gFileNames {..  
20430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 72                tr
20440 79 44 65 6c 65 74 65 42 69 6e 61 72 79 46 69 6c  yDeleteBinaryFil
20450 65 20 24 66 69 6c 65 4e 61 6d 65 0d 0a 20 20 20  e $fileName..   
20460 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
20470 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20            }.... 
20480 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21             if {!
20490 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e  [info exists ::n
204a0 6f 28 64 65 6c 65 74 65 53 71 6c 69 74 65 45 78  o(deleteSqliteEx
204b0 74 65 72 6e 61 6c 46 69 6c 65 73 29 5d 7d 20 74  ternalFiles)]} t
204c0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
204d0 20 20 20 20 20 66 6f 72 65 61 63 68 20 66 69 6c       foreach fil
204e0 65 4e 61 6d 65 20 24 6d 64 61 43 6f 6e 66 69 67  eName $mdaConfig
204f0 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20  FileNames {..   
20500 20 20 20 20 20 20 20 20 20 20 20 20 20 74 72 79               try
20510 44 65 6c 65 74 65 42 75 69 6c 64 46 69 6c 65 20  DeleteBuildFile 
20520 24 66 69 6c 65 4e 61 6d 65 0d 0a 20 20 20 20 20  $fileName..     
20530 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20           }....  
20540 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 65              fore
20550 61 63 68 20 66 69 6c 65 4e 61 6d 65 20 24 65 78  ach fileName $ex
20560 74 65 72 6e 61 6c 46 69 6c 65 4e 61 6d 65 73 20  ternalFileNames 
20570 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
20580 20 20 20 74 72 79 44 65 6c 65 74 65 42 69 6e 61     tryDeleteBina
20590 72 79 46 69 6c 65 20 24 66 69 6c 65 4e 61 6d 65  ryFile $fileName
205a0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
205b0 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  }..            }
205c0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
205d0 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74  if {![info exist
205e0 73 20 3a 3a 6e 6f 28 64 65 6c 65 74 65 53 71 6c  s ::no(deleteSql
205f0 69 74 65 4e 61 74 69 76 65 46 69 6c 65 73 29 5d  iteNativeFiles)]
20600 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
20610 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e          if {![in
20620 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 64  fo exists ::no(d
20630 65 6c 65 74 65 53 71 6c 69 74 65 49 6d 70 6c 69  eleteSqliteImpli
20640 63 69 74 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e  citFiles)]} then
20650 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
20660 20 20 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65      foreach file
20670 4e 61 6d 65 20 24 6e 61 74 69 76 65 46 69 6c 65  Name $nativeFile
20680 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20 20  Names {..       
20690 20 20 20 20 20 20 20 20 20 20 20 74 72 79 44 65             tryDe
206a0 6c 65 74 65 41 73 73 65 6d 62 6c 79 20 24 66 69  leteAssembly $fi
206b0 6c 65 4e 61 6d 65 0d 0a 20 20 20 20 20 20 20 20  leName..        
206c0 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
206d0 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20           }....  
206e0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b              if {
206f0 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  ![info exists ::
20700 6e 6f 28 64 65 6c 65 74 65 53 71 6c 69 74 65 4e  no(deleteSqliteN
20710 6f 6e 49 6d 70 6c 69 63 69 74 46 69 6c 65 73 29  onImplicitFiles)
20720 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
20730 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21             if {!
20740 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e  [info exists ::n
20750 6f 28 64 65 6c 65 74 65 53 71 6c 69 74 65 50 6c  o(deleteSqlitePl
20760 61 74 66 6f 72 6d 46 69 6c 65 73 29 5d 20 26 26  atformFiles)] &&
20770 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
20780 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20          [string 
20790 6c 65 6e 67 74 68 20 24 70 6c 61 74 66 6f 72 6d  length $platform
207a0 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20  ] > 0} then {.. 
207b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
207c0 20 66 6f 72 65 61 63 68 20 66 69 6c 65 4e 61 6d   foreach fileNam
207d0 65 20 24 6e 61 74 69 76 65 46 69 6c 65 4e 61 6d  e $nativeFileNam
207e0 65 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  es {..          
207f0 20 20 20 20 20 20 20 20 20 20 74 72 79 44 65 6c            tryDel
20800 65 74 65 41 73 73 65 6d 62 6c 79 20 24 66 69 6c  eteAssembly $fil
20810 65 4e 61 6d 65 20 24 70 6c 61 74 66 6f 72 6d 0d  eName $platform.
20820 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
20830 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
20840 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
20850 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21             if {!
20860 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e  [info exists ::n
20870 6f 28 64 65 6c 65 74 65 53 71 6c 69 74 65 41 72  o(deleteSqliteAr
20880 63 68 69 74 65 63 74 75 72 65 46 69 6c 65 73 29  chitectureFiles)
20890 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20  ] && \..        
208a0 20 20 20 20 20 20 20 20 20 20 20 20 5b 73 74 72              [str
208b0 69 6e 67 20 6c 65 6e 67 74 68 20 24 61 72 63 68  ing length $arch
208c0 69 74 65 63 74 75 72 65 5d 20 3e 20 30 7d 20 74  itecture] > 0} t
208d0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
208e0 20 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68           foreach
208f0 20 66 69 6c 65 4e 61 6d 65 20 24 6e 61 74 69 76   fileName $nativ
20900 65 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20  eFileNames {..  
20910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20920 20 20 74 72 79 44 65 6c 65 74 65 41 73 73 65 6d    tryDeleteAssem
20930 62 6c 79 20 24 66 69 6c 65 4e 61 6d 65 20 24 61  bly $fileName $a
20940 72 63 68 69 74 65 63 74 75 72 65 0d 0a 20 20 20  rchitecture..   
20950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
20960 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
20970 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20    }..           
20980 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
20990 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20    }....         
209a0 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78     if {![info ex
209b0 69 73 74 73 20 3a 3a 6e 6f 28 64 65 6c 65 74 65  ists ::no(delete
209c0 53 71 6c 69 74 65 4d 61 6e 61 67 65 64 46 69 6c  SqliteManagedFil
209d0 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  es)]} then {..  
209e0 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 65              fore
209f0 61 63 68 20 66 69 6c 65 4e 61 6d 65 20 24 6d 61  ach fileName $ma
20a00 6e 61 67 65 64 46 69 6c 65 4e 61 6d 65 73 20 7b  nagedFileNames {
20a10 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
20a20 20 20 74 72 79 44 65 6c 65 74 65 41 73 73 65 6d    tryDeleteAssem
20a30 62 6c 79 20 24 66 69 6c 65 4e 61 6d 65 0d 0a 20  bly $fileName.. 
20a40 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a               }..
20a50 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
20a60 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20           }....  
20a70 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
20a80 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68 65       # NOTE: Che
20a90 63 6b 20 66 6f 72 20 74 68 65 20 22 61 75 74 6f  ck for the "auto
20aa0 53 65 6c 65 63 74 22 20 72 75 6e 74 69 6d 65 20  Select" runtime 
20ab0 6f 70 74 69 6f 6e 2e 20 20 49 66 20 70 72 65 73  option.  If pres
20ac0 65 6e 74 2c 0d 0a 20 20 20 20 20 20 20 20 20 20  ent,..          
20ad0 23 20 20 20 20 20 20 20 61 74 74 65 6d 70 74 20  #       attempt 
20ae0 74 6f 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  to automatically
20af0 20 73 65 6c 65 63 74 20 74 68 65 20 66 69 72 73   select the firs
20b00 74 20 61 76 61 69 6c 61 62 6c 65 0d 0a 20 20 20  t available..   
20b10 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 62         #       b
20b20 75 69 6c 64 20 28 6f 72 20 22 72 65 6c 65 61 73  uild (or "releas
20b30 65 22 29 20 6f 66 20 53 51 4c 69 74 65 20 61 6e  e") of SQLite an
20b40 64 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51  d System.Data.SQ
20b50 4c 69 74 65 0d 0a 20 20 20 20 20 20 20 20 20 20  Lite..          
20b60 23 20 20 20 20 20 20 20 66 6f 72 20 75 73 65 20  #       for use 
20b70 77 69 74 68 20 74 68 65 20 74 65 73 74 20 73 75  with the test su
20b80 69 74 65 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  ite...          
20b90 23 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20  #..          if 
20ba0 7b 5b 68 61 73 52 75 6e 74 69 6d 65 4f 70 74 69  {[hasRuntimeOpti
20bb0 6f 6e 20 61 75 74 6f 53 65 6c 65 63 74 5d 7d 20  on autoSelect]} 
20bc0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
20bd0 20 20 20 20 69 66 20 7b 21 5b 63 68 65 63 6b 46      if {![checkF
20be0 6f 72 53 51 4c 69 74 65 42 75 69 6c 64 73 20 24  orSQLiteBuilds $
20bf0 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 74  ::test_channel t
20c00 72 75 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  rue]} then {..  
20c10 20 20 20 20 20 20 20 20 20 20 20 20 63 68 65 63              chec
20c20 6b 46 6f 72 53 51 4c 69 74 65 52 65 6c 65 61 73  kForSQLiteReleas
20c30 65 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  es $::test_chann
20c40 65 6c 20 74 72 75 65 0d 0a 20 20 20 20 20 20 20  el true..       
20c50 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
20c60 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20    }....         
20c70 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20   #..          # 
20c80 4e 4f 54 45 3a 20 53 6b 69 70 20 74 72 79 69 6e  NOTE: Skip tryin
20c90 67 20 74 6f 20 76 65 72 69 66 79 20 74 68 65 20  g to verify the 
20ca0 62 75 69 6c 64 20 64 69 72 65 63 74 6f 72 79 20  build directory 
20cb0 69 66 20 69 6e 73 74 72 75 63 74 65 64 3b 0d 0a  if instructed;..
20cc0 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20            #     
20cd0 20 20 6f 74 68 65 72 77 69 73 65 2c 20 6d 61 6b    otherwise, mak
20ce0 65 20 73 75 72 65 20 69 74 20 61 63 74 75 61 6c  e sure it actual
20cf0 6c 79 20 65 78 69 73 74 73 20 6f 72 20 68 61 6c  ly exists or hal
20d00 74 20 74 68 65 20 65 6e 74 69 72 65 0d 0a 20 20  t the entire..  
20d10 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
20d20 74 65 73 74 69 6e 67 20 70 72 6f 63 65 73 73 20  testing process 
20d30 69 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 65  if it does not e
20d40 78 69 73 74 2e 0d 0a 20 20 20 20 20 20 20 20 20  xist...         
20d50 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66   #..          if
20d60 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20   {![info exists 
20d70 3a 3a 6e 6f 28 76 65 72 69 66 79 42 75 69 6c 64  ::no(verifyBuild
20d80 44 69 72 65 63 74 6f 72 79 29 5d 7d 20 74 68 65  Directory)]} the
20d90 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
20da0 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   #..            
20db0 23 20 4e 4f 54 45 3a 20 41 74 20 74 68 69 73 20  # NOTE: At this 
20dc0 70 6f 69 6e 74 2c 20 74 68 65 20 62 75 69 6c 64  point, the build
20dd0 20 64 69 72 65 63 74 6f 72 79 20 4d 55 53 54 20   directory MUST 
20de0 65 78 69 73 74 20 61 73 20 61 0d 0a 20 20 20 20  exist as a..    
20df0 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
20e00 76 61 6c 69 64 20 64 69 72 65 63 74 6f 72 79 20  valid directory 
20e10 66 6f 72 20 74 68 65 20 74 65 73 74 69 6e 67 20  for the testing 
20e20 70 72 6f 63 65 73 73 20 74 6f 20 63 6f 6e 74 69  process to conti
20e30 6e 75 65 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  nue...          
20e40 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20    #..           
20e50 20 73 65 74 20 64 69 72 65 63 74 6f 72 79 20 5b   set directory [
20e60 67 65 74 42 75 69 6c 64 44 69 72 65 63 74 6f 72  getBuildDirector
20e70 79 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  y]....          
20e80 20 20 69 66 20 7b 21 5b 66 69 6c 65 20 65 78 69    if {![file exi
20e90 73 74 73 20 24 64 69 72 65 63 74 6f 72 79 5d 20  sts $directory] 
20ea0 7c 7c 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  || \..          
20eb0 20 20 20 20 20 20 21 5b 66 69 6c 65 20 69 73 64        ![file isd
20ec0 69 72 65 63 74 6f 72 79 20 24 64 69 72 65 63 74  irectory $direct
20ed0 6f 72 79 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ory]} then {..  
20ee0 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20              #.. 
20ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4e               # N
20f00 4f 54 45 3a 20 4a 75 73 74 20 70 72 69 6f 72 20  OTE: Just prior 
20f10 74 6f 20 61 63 74 75 61 6c 6c 79 20 68 61 6c 74  to actually halt
20f20 69 6e 67 20 74 68 65 20 74 65 73 74 69 6e 67 20  ing the testing 
20f30 70 72 6f 63 65 73 73 2c 0d 0a 20 20 20 20 20 20  process,..      
20f40 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
20f50 61 64 64 20 61 6e 20 65 72 72 6f 72 20 74 6f 20  add an error to 
20f60 74 68 65 20 74 65 73 74 20 6c 6f 67 20 66 69 6c  the test log fil
20f70 65 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  e...            
20f80 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20    #..           
20f90 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
20fa0 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  _channel [append
20fb0 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
20fc0 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
20fd0 63 6f 75 6c 64 20 6e 6f 74 20 76 65 72 69 66 79  could not verify
20fe0 20 62 75 69 6c 64 20 64 69 72 65 63 74 6f 72 79   build directory
20ff0 20 5c 22 22 20 24 64 69 72 65 63 74 6f 72 79 20   \"" $directory 
21000 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
21010 20 20 20 20 20 22 5c 22 2c 20 61 6c 6c 20 74 65       "\", all te
21020 73 74 69 6e 67 20 68 61 6c 74 65 64 5c 6e 22 5d  sting halted\n"]
21030 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
21040 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20    #..           
21050 20 20 20 23 20 4e 4f 54 45 3a 20 52 61 69 73 69     # NOTE: Raisi
21060 6e 67 20 61 20 73 63 72 69 70 74 20 65 72 72 6f  ng a script erro
21070 72 20 66 72 6f 6d 20 74 68 69 73 20 70 6f 69 6e  r from this poin
21080 74 20 73 68 6f 75 6c 64 20 68 61 6c 74 0d 0a 20  t should halt.. 
21090 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20 20               #  
210a0 20 20 20 20 20 74 68 65 20 74 65 73 74 69 6e 67       the testing
210b0 20 70 72 6f 63 65 73 73 2e 0d 0a 20 20 20 20 20   process...     
210c0 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
210d0 20 20 20 20 20 20 20 20 20 20 65 72 72 6f 72 20            error 
210e0 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
210f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21100 20 22 63 6f 75 6c 64 20 6e 6f 74 20 76 65 72 69   "could not veri
21110 66 79 20 62 75 69 6c 64 20 64 69 72 65 63 74 6f  fy build directo
21120 72 79 20 5c 22 22 20 24 64 69 72 65 63 74 6f 72  ry \"" $director
21130 79 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  y \..           
21140 20 20 20 20 20 20 20 22 5c 22 2c 20 61 6c 6c 20         "\", all 
21150 74 65 73 74 69 6e 67 20 68 61 6c 74 65 64 22 5d  testing halted"]
21160 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
21170 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  .          }....
21180 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
21190 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53         # NOTE: S
211a0 6b 69 70 20 74 72 79 69 6e 67 20 74 6f 20 63 6f  kip trying to co
211b0 70 79 20 61 6e 79 20 66 69 6c 65 73 20 69 66 20  py any files if 
211c0 69 6e 73 74 72 75 63 74 65 64 2e 0d 0a 20 20 20  instructed...   
211d0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
211e0 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65      if {![info e
211f0 78 69 73 74 73 20 3a 3a 6e 6f 28 63 6f 70 79 53  xists ::no(copyS
21200 71 6c 69 74 65 46 69 6c 65 73 29 5d 7d 20 74 68  qliteFiles)]} th
21210 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
21220 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69    if {![info exi
21230 73 74 73 20 3a 3a 6e 6f 28 63 6f 70 79 53 71 6c  sts ::no(copySql
21240 69 74 65 43 6f 6e 66 69 67 46 69 6c 65 73 29 5d  iteConfigFiles)]
21250 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
21260 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20          foreach 
21270 66 69 6c 65 4e 61 6d 65 20 24 63 6f 6e 66 69 67  fileName $config
21280 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20  FileNames {..   
21290 20 20 20 20 20 20 20 20 20 20 20 20 20 74 72 79               try
212a0 43 6f 70 79 42 75 69 6c 64 46 69 6c 65 20 24 66  CopyBuildFile $f
212b0 69 6c 65 4e 61 6d 65 0d 0a 20 20 20 20 20 20 20  ileName..       
212c0 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
212d0 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
212e0 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66         if {![inf
212f0 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 63 6f  o exists ::no(co
21300 70 79 53 71 6c 69 74 65 45 78 74 65 72 6e 61 6c  pySqliteExternal
21310 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d  Files)]} then {.
21320 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23  .              #
21330 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
21340 23 20 4e 4f 54 45 3a 20 43 6f 70 79 20 74 68 65  # NOTE: Copy the
21350 20 4d 61 6e 61 67 65 64 20 44 65 62 75 67 67 69   Managed Debuggi
21360 6e 67 20 41 73 73 69 73 74 61 6e 74 73 20 28 4d  ng Assistants (M
21370 44 41 29 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  DA) configuratio
21380 6e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n..             
21390 20 23 20 20 20 20 20 20 20 66 69 6c 65 20 66 6f   #       file fo
213a0 72 20 74 68 65 20 45 61 67 6c 65 20 73 68 65 6c  r the Eagle shel
213b0 6c 20 74 6f 20 74 68 65 20 62 75 69 6c 64 20 6f  l to the build o
213c0 75 74 70 75 74 20 64 69 72 65 63 74 6f 72 79 2c  utput directory,
213d0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
213e0 23 20 20 20 20 20 20 20 77 68 69 6c 65 20 75 73  #       while us
213f0 69 6e 67 20 65 61 63 68 20 6f 66 20 74 68 65 20  ing each of the 
21400 6e 61 6d 65 73 20 6f 66 20 74 68 65 20 76 61 72  names of the var
21410 69 6f 75 73 20 6c 65 67 61 63 79 20 74 65 73 74  ious legacy test
21420 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
21430 23 20 20 20 20 20 20 20 65 78 65 63 75 74 61 62  #       executab
21440 6c 65 73 2e 20 20 54 68 69 73 20 77 69 6c 6c 20  les.  This will 
21450 68 65 6c 70 20 74 6f 20 6d 61 6b 65 20 73 75 72  help to make sur
21460 65 20 74 68 61 74 20 61 6c 6c 20 74 68 65 0d 0a  e that all the..
21470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20                # 
21480 20 20 20 20 20 20 6c 65 67 61 63 79 20 74 65 73        legacy tes
21490 74 73 20 72 75 6e 20 77 69 74 68 20 65 78 61 63  ts run with exac
214a0 74 6c 79 20 74 68 65 20 73 61 6d 65 20 73 65 74  tly the same set
214b0 20 6f 66 20 4d 61 6e 61 67 65 64 0d 0a 20 20 20   of Managed..   
214c0 20 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20             #    
214d0 20 20 20 44 65 62 75 67 67 69 6e 67 20 41 73 73     Debugging Ass
214e0 69 73 74 61 6e 74 73 20 63 6f 6e 66 69 67 75 72  istants configur
214f0 65 64 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ed...           
21500 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
21510 20 20 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65      foreach file
21520 4e 61 6d 65 20 24 6d 64 61 43 6f 6e 66 69 67 46  Name $mdaConfigF
21530 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20  ileNames {..    
21540 20 20 20 20 20 20 20 20 20 20 20 20 74 72 79 43              tryC
21550 6f 70 79 42 69 6e 61 72 79 46 69 6c 65 20 45 61  opyBinaryFile Ea
21560 67 6c 65 53 68 65 6c 6c 2e 65 78 65 2e 6d 64 61  gleShell.exe.mda
21570 2e 63 6f 6e 66 69 67 20 22 22 20 24 66 69 6c 65  .config "" $file
21580 4e 61 6d 65 0d 0a 20 20 20 20 20 20 20 20 20 20  Name..          
21590 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
215a0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
215b0 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
215c0 43 6f 70 79 20 74 68 65 20 65 78 74 65 72 6e 61  Copy the externa
215d0 6c 20 62 69 6e 61 72 69 65 73 2c 20 69 66 20 61  l binaries, if a
215e0 6e 79 2c 20 74 6f 20 74 68 65 20 64 69 72 65 63  ny, to the direc
215f0 74 6f 72 79 20 74 68 61 74 0d 0a 20 20 20 20 20  tory that..     
21600 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20           #      
21610 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 45 61   contains the Ea
21620 67 6c 65 20 73 68 65 6c 6c 2e 20 20 54 68 69 73  gle shell.  This
21630 20 69 73 20 74 79 70 69 63 61 6c 6c 79 20 75 73   is typically us
21640 65 64 20 74 6f 20 6d 61 6b 65 0d 0a 20 20 20 20  ed to make..    
21650 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20            #     
21660 20 20 73 75 72 65 20 61 73 73 65 6d 62 6c 69 65    sure assemblie
21670 73 20 72 65 66 65 72 65 6e 63 65 64 20 62 79 20  s referenced by 
21680 74 68 65 20 6f 6e 65 73 20 62 65 69 6e 67 20 74  the ones being t
21690 65 73 74 65 64 20 61 72 65 0d 0a 20 20 20 20 20  ested are..     
216a0 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20           #      
216b0 20 61 76 61 69 6c 61 62 6c 65 20 64 75 72 69 6e   available durin
216c0 67 20 74 68 65 20 74 65 73 74 69 6e 67 20 70 72  g the testing pr
216d0 6f 63 65 73 73 2e 0d 0a 20 20 20 20 20 20 20 20  ocess...        
216e0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
216f0 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 66         foreach f
21700 69 6c 65 4e 61 6d 65 20 24 65 78 74 65 72 6e 61  ileName $externa
21710 6c 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20  lFileNames {..  
21720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 72                tr
21730 79 43 6f 70 79 45 78 74 65 72 6e 61 6c 46 69 6c  yCopyExternalFil
21740 65 20 24 66 69 6c 65 4e 61 6d 65 0d 0a 20 20 20  e $fileName..   
21750 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
21760 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20            }.... 
21770 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21             if {!
21780 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e  [info exists ::n
21790 6f 28 63 6f 70 79 53 71 6c 69 74 65 4e 61 74 69  o(copySqliteNati
217a0 76 65 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e 20  veFiles)]} then 
217b0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
217c0 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   #..            
217d0 20 20 23 20 4e 4f 54 45 3a 20 49 66 20 74 68 65    # NOTE: If the
217e0 20 74 65 73 74 20 70 6c 61 74 66 6f 72 6d 20 69   test platform i
217f0 73 20 6c 69 6b 65 6c 79 20 74 68 65 20 64 65 66  s likely the def
21800 61 75 6c 74 20 66 6f 72 20 74 68 69 73 0d 0a 20  ault for this.. 
21810 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20 20               #  
21820 20 20 20 20 20 6d 61 63 68 69 6e 65 2c 20 61 6c       machine, al
21830 73 6f 20 74 72 79 20 74 6f 20 63 6f 70 79 20 74  so try to copy t
21840 68 65 20 6e 61 74 69 76 65 20 66 69 6c 65 73 20  he native files 
21850 74 6f 20 74 68 65 0d 0a 20 20 20 20 20 20 20 20  to the..        
21860 20 20 20 20 20 20 23 20 20 20 20 20 20 20 62 69        #       bi
21870 6e 61 72 79 20 6c 6f 63 61 74 69 6f 6e 2e 0d 0a  nary location...
21880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 0d                #.
21890 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
218a0 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73  f {![info exists
218b0 20 3a 3a 6e 6f 28 63 6f 70 79 53 71 6c 69 74 65   ::no(copySqlite
218c0 49 6d 70 6c 69 63 69 74 46 69 6c 65 73 29 5d 20  ImplicitFiles)] 
218d0 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  && \..          
218e0 20 20 20 20 20 20 20 20 5b 69 73 44 65 66 61 75          [isDefau
218f0 6c 74 42 75 69 6c 64 50 6c 61 74 66 6f 72 6d 20  ltBuildPlatform 
21900 74 72 75 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  true]} then {.. 
21910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66                 f
21920 6f 72 65 61 63 68 20 66 69 6c 65 4e 61 6d 65 20  oreach fileName 
21930 24 6e 61 74 69 76 65 46 69 6c 65 4e 61 6d 65 73  $nativeFileNames
21940 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
21950 20 20 20 20 20 20 74 72 79 43 6f 70 79 41 73 73        tryCopyAss
21960 65 6d 62 6c 79 20 24 66 69 6c 65 4e 61 6d 65 0d  embly $fileName.
21970 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
21980 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   }..            
21990 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20    }....         
219a0 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20       if {![info 
219b0 65 78 69 73 74 73 20 3a 3a 6e 6f 28 63 6f 70 79  exists ::no(copy
219c0 53 71 6c 69 74 65 4e 6f 6e 49 6d 70 6c 69 63 69  SqliteNonImplici
219d0 74 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e 20 7b  tFiles)]} then {
219e0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
219f0 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69    if {![info exi
21a00 73 74 73 20 3a 3a 6e 6f 28 63 6f 70 79 53 71 6c  sts ::no(copySql
21a10 69 74 65 50 6c 61 74 66 6f 72 6d 46 69 6c 65 73  itePlatformFiles
21a20 29 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20  )] && \..       
21a30 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 73 74               [st
21a40 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 70 6c 61  ring length $pla
21a50 74 66 6f 72 6d 5d 20 3e 20 30 7d 20 74 68 65 6e  tform] > 0} then
21a60 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
21a70 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 66 69        foreach fi
21a80 6c 65 4e 61 6d 65 20 24 6e 61 74 69 76 65 46 69  leName $nativeFi
21a90 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20  leNames {..     
21aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
21ab0 72 79 43 6f 70 79 41 73 73 65 6d 62 6c 79 20 24  ryCopyAssembly $
21ac0 66 69 6c 65 4e 61 6d 65 20 24 70 6c 61 74 66 6f  fileName $platfo
21ad0 72 6d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  rm..            
21ae0 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
21af0 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20           }....  
21b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
21b10 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20   {![info exists 
21b20 3a 3a 6e 6f 28 63 6f 70 79 53 71 6c 69 74 65 41  ::no(copySqliteA
21b30 72 63 68 69 74 65 63 74 75 72 65 46 69 6c 65 73  rchitectureFiles
21b40 29 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20  )] && \..       
21b50 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 73 74               [st
21b60 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 61 72 63  ring length $arc
21b70 68 69 74 65 63 74 75 72 65 5d 20 3e 20 30 7d 20  hitecture] > 0} 
21b80 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
21b90 20 20 20 20 20 20 20 20 20 20 66 6f 72 65 61 63            foreac
21ba0 68 20 66 69 6c 65 4e 61 6d 65 20 24 6e 61 74 69  h fileName $nati
21bb0 76 65 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20  veFileNames {.. 
21bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21bd0 20 20 20 74 72 79 43 6f 70 79 41 73 73 65 6d 62     tryCopyAssemb
21be0 6c 79 20 24 66 69 6c 65 4e 61 6d 65 20 24 61 72  ly $fileName $ar
21bf0 63 68 69 74 65 63 74 75 72 65 0d 0a 20 20 20 20  chitecture..    
21c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d                }.
21c10 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
21c20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   }..            
21c30 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20    }..           
21c40 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   }....          
21c50 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69    if {![info exi
21c60 73 74 73 20 3a 3a 6e 6f 28 63 6f 70 79 53 71 6c  sts ::no(copySql
21c70 69 74 65 4d 61 6e 61 67 65 64 46 69 6c 65 73 29  iteManagedFiles)
21c80 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
21c90 20 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68           foreach
21ca0 20 66 69 6c 65 4e 61 6d 65 20 24 6d 61 6e 61 67   fileName $manag
21cb0 65 64 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20  edFileNames {.. 
21cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
21cd0 72 79 43 6f 70 79 41 73 73 65 6d 62 6c 79 20 24  ryCopyAssembly $
21ce0 66 69 6c 65 4e 61 6d 65 0d 0a 20 20 20 20 20 20  fileName..      
21cf0 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
21d00 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
21d10 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
21d20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
21d30 23 20 4e 4f 54 45 3a 20 53 6b 69 70 20 74 72 79  # NOTE: Skip try
21d40 69 6e 67 20 74 6f 20 6c 6f 61 64 20 61 6e 79 20  ing to load any 
21d50 66 69 6c 65 73 20 69 66 20 69 6e 73 74 72 75 63  files if instruc
21d60 74 65 64 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  ted...          
21d70 23 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20  #..          if 
21d80 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a  {![info exists :
21d90 3a 6e 6f 28 6c 6f 61 64 53 71 6c 69 74 65 46 69  :no(loadSqliteFi
21da0 6c 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  les)]} then {.. 
21db0 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21             if {!
21dc0 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e  [info exists ::n
21dd0 6f 28 6c 6f 61 64 53 71 6c 69 74 65 49 6d 70 6c  o(loadSqliteImpl
21de0 69 63 69 74 46 69 6c 65 73 29 5d 7d 20 74 68 65  icitFiles)]} the
21df0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
21e00 20 20 20 74 72 79 4c 6f 61 64 41 73 73 65 6d 62     tryLoadAssemb
21e10 6c 79 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53  ly System.Data.S
21e20 51 4c 69 74 65 2e 64 6c 6c 0d 0a 20 20 20 20 20  QLite.dll..     
21e30 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
21e40 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e          if {![in
21e50 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 6c  fo exists ::no(l
21e60 6f 61 64 53 71 6c 69 74 65 4c 69 6e 71 46 69 6c  oadSqliteLinqFil
21e70 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  es)]} then {..  
21e80 20 20 20 20 20 20 20 20 20 20 20 20 74 72 79 4c              tryL
21e90 6f 61 64 41 73 73 65 6d 62 6c 79 20 53 79 73 74  oadAssembly Syst
21ea0 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 4c  em.Data.SQLite.L
21eb0 69 6e 71 2e 64 6c 6c 0d 0a 20 20 20 20 20 20 20  inq.dll..       
21ec0 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
21ed0 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f        if {![info
21ee0 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 6c 6f 61   exists ::no(loa
21ef0 64 53 71 6c 69 74 65 45 66 36 46 69 6c 65 73 29  dSqliteEf6Files)
21f00 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
21f10 20 20 20 20 20 20 20 20 20 74 72 79 4c 6f 61 64           tryLoad
21f20 41 73 73 65 6d 62 6c 79 20 53 79 73 74 65 6d 2e  Assembly System.
21f30 44 61 74 61 2e 53 51 4c 69 74 65 2e 45 46 36 2e  Data.SQLite.EF6.
21f40 64 6c 6c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  dll..           
21f50 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   }....          
21f60 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69    if {![info exi
21f70 73 74 73 20 3a 3a 6e 6f 28 6c 6f 61 64 53 71 6c  sts ::no(loadSql
21f80 69 74 65 4e 6f 6e 49 6d 70 6c 69 63 69 74 46 69  iteNonImplicitFi
21f90 6c 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  les)]} then {.. 
21fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20               if 
21fb0 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a  {![info exists :
21fc0 3a 6e 6f 28 6c 6f 61 64 53 71 6c 69 74 65 50 6c  :no(loadSqlitePl
21fd0 61 74 66 6f 72 6d 46 69 6c 65 73 29 5d 20 26 26  atformFiles)] &&
21fe0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
21ff0 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65        [string le
22000 6e 67 74 68 20 24 70 6c 61 74 66 6f 72 6d 5d 20  ngth $platform] 
22010 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  > 0} then {..   
22020 20 20 20 20 20 20 20 20 20 20 20 20 20 74 72 79               try
22030 4c 6f 61 64 41 73 73 65 6d 62 6c 79 20 53 79 73  LoadAssembly Sys
22040 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e  tem.Data.SQLite.
22050 64 6c 6c 20 24 70 6c 61 74 66 6f 72 6d 0d 0a 20  dll $platform.. 
22060 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a               }..
22070 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
22080 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74  if {![info exist
22090 73 20 3a 3a 6e 6f 28 6c 6f 61 64 53 71 6c 69 74  s ::no(loadSqlit
220a0 65 41 72 63 68 69 74 65 63 74 75 72 65 46 69 6c  eArchitectureFil
220b0 65 73 29 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20  es)] && \..     
220c0 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 73 74               [st
220d0 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 61 72 63  ring length $arc
220e0 68 69 74 65 63 74 75 72 65 5d 20 3e 20 30 7d 20  hitecture] > 0} 
220f0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
22100 20 20 20 20 20 20 20 20 74 72 79 4c 6f 61 64 41          tryLoadA
22110 73 73 65 6d 62 6c 79 20 53 79 73 74 65 6d 2e 44  ssembly System.D
22120 61 74 61 2e 53 51 4c 69 74 65 2e 64 6c 6c 20 24  ata.SQLite.dll $
22130 61 72 63 68 69 74 65 63 74 75 72 65 0d 0a 20 20  architecture..  
22140 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
22150 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
22160 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
22170 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
22180 66 6f 72 65 61 63 68 20 66 69 6c 65 4e 61 6d 65  foreach fileName
22190 4f 6e 6c 79 20 5b 67 65 74 4e 61 74 69 76 65 4c  Only [getNativeL
221a0 69 62 72 61 72 79 46 69 6c 65 4e 61 6d 65 73 4f  ibraryFileNamesO
221b0 6e 6c 79 5d 20 7b 0d 0a 20 20 20 20 20 20 20 20  nly] {..        
221c0 20 20 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20    catch {..     
221d0 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
221e0 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70  test_channel [ap
221f0 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
22200 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
22210 2d 20 66 69 6c 65 20 76 65 72 73 69 6f 6e 20 6f  - file version o
22220 66 20 5c 22 22 20 24 66 69 6c 65 4e 61 6d 65 4f  f \"" $fileNameO
22230 6e 6c 79 20 22 5c 22 2e 2e 2e 20 5c 22 22 20 5c  nly "\"... \"" \
22240 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
22250 20 20 5b 66 69 6c 65 20 76 65 72 73 69 6f 6e 20    [file version 
22260 5b 67 65 74 42 69 6e 61 72 79 46 69 6c 65 4e 61  [getBinaryFileNa
22270 6d 65 20 24 66 69 6c 65 4e 61 6d 65 4f 6e 6c 79  me $fileNameOnly
22280 5d 5d 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20  ]] \"\n]..      
22290 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d      }..        }
222a0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 66 6f 72 65  ....        fore
222b0 61 63 68 20 66 69 6c 65 4e 61 6d 65 4f 6e 6c 79  ach fileNameOnly
222c0 20 5b 67 65 74 49 6e 74 65 72 6f 70 41 73 73 65   [getInteropAsse
222d0 6d 62 6c 79 46 69 6c 65 4e 61 6d 65 73 4f 6e 6c  mblyFileNamesOnl
222e0 79 5d 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  y] {..          
222f0 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20  catch {..       
22300 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
22310 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
22320 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
22330 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
22340 66 69 6c 65 20 76 65 72 73 69 6f 6e 20 6f 66 20  file version of 
22350 5c 22 22 20 24 66 69 6c 65 4e 61 6d 65 4f 6e 6c  \"" $fileNameOnl
22360 79 20 22 5c 22 2e 2e 2e 20 5c 22 22 20 5c 0d 0a  y "\"... \"" \..
22370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22380 5b 66 69 6c 65 20 76 65 72 73 69 6f 6e 20 5b 67  [file version [g
22390 65 74 42 69 6e 61 72 79 46 69 6c 65 4e 61 6d 65  etBinaryFileName
223a0 20 24 66 69 6c 65 4e 61 6d 65 4f 6e 6c 79 5d 5d   $fileNameOnly]]
223b0 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20   \"\n]..        
223c0 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a    }..        }..
223d0 0d 0a 20 20 20 20 20 20 20 20 63 61 74 63 68 20  ..        catch 
223e0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70 75  {..          tpu
223f0 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
22400 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
22410 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
22420 22 2d 2d 2d 2d 20 66 69 6c 65 20 76 65 72 73 69  "---- file versi
22430 6f 6e 20 6f 66 20 5c 22 53 79 73 74 65 6d 2e 44  on of \"System.D
22440 61 74 61 2e 53 51 4c 69 74 65 2e 64 6c 6c 5c 22  ata.SQLite.dll\"
22450 2e 2e 2e 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20  ... \"" \..     
22460 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20 76           [file v
22470 65 72 73 69 6f 6e 20 5b 67 65 74 42 69 6e 61 72  ersion [getBinar
22480 79 46 69 6c 65 4e 61 6d 65 20 53 79 73 74 65 6d  yFileName System
22490 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 64 6c 6c  .Data.SQLite.dll
224a0 5d 5d 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20  ]] \"\n]..      
224b0 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 63    }....        c
224c0 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20  atch {..        
224d0 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
224e0 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
224f0 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
22500 20 20 20 20 20 22 2d 2d 2d 2d 20 66 69 6c 65 20       "---- file 
22510 76 65 72 73 69 6f 6e 20 6f 66 20 5c 22 53 79 73  version of \"Sys
22520 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e  tem.Data.SQLite.
22530 4c 69 6e 71 2e 64 6c 6c 5c 22 2e 2e 2e 20 5c 22  Linq.dll\"... \"
22540 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  " \..           
22550 20 20 20 5b 66 69 6c 65 20 76 65 72 73 69 6f 6e     [file version
22560 20 5b 67 65 74 42 69 6e 61 72 79 46 69 6c 65 4e   [getBinaryFileN
22570 61 6d 65 20 53 79 73 74 65 6d 2e 44 61 74 61 2e  ame System.Data.
22580 53 51 4c 69 74 65 2e 4c 69 6e 71 2e 64 6c 6c 5d  SQLite.Linq.dll]
22590 5d 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ] \..           
225a0 20 20 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20     \"\n]..      
225b0 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 63    }....        c
225c0 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20  atch {..        
225d0 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
225e0 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
225f0 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
22600 20 20 20 20 20 22 2d 2d 2d 2d 20 66 69 6c 65 20       "---- file 
22610 76 65 72 73 69 6f 6e 20 6f 66 20 5c 22 53 79 73  version of \"Sys
22620 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e  tem.Data.SQLite.
22630 45 46 36 2e 64 6c 6c 5c 22 2e 2e 2e 20 5c 22 22  EF6.dll\"... \""
22640 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
22650 20 20 5b 66 69 6c 65 20 76 65 72 73 69 6f 6e 20    [file version 
22660 5b 67 65 74 42 69 6e 61 72 79 46 69 6c 65 4e 61  [getBinaryFileNa
22670 6d 65 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53  me System.Data.S
22680 51 4c 69 74 65 2e 45 46 36 2e 64 6c 6c 5d 5d 20  QLite.EF6.dll]] 
22690 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
226a0 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20   \"\n]..        
226b0 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20  }....        if 
226c0 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20  {[string length 
226d0 24 70 6c 61 74 66 6f 72 6d 5d 20 3e 20 30 7d 20  $platform] > 0} 
226e0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
226f0 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65 4e 61    foreach fileNa
22700 6d 65 4f 6e 6c 79 20 5b 67 65 74 4e 61 74 69 76  meOnly [getNativ
22710 65 4c 69 62 72 61 72 79 46 69 6c 65 4e 61 6d 65  eLibraryFileName
22720 73 4f 6e 6c 79 5d 20 7b 0d 0a 20 20 20 20 20 20  sOnly] {..      
22730 20 20 20 20 20 20 63 61 74 63 68 20 7b 0d 0a 20        catch {.. 
22740 20 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75               tpu
22750 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
22760 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
22770 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
22780 20 20 20 20 22 2d 2d 2d 2d 20 66 69 6c 65 20 76      "---- file v
22790 65 72 73 69 6f 6e 20 6f 66 20 5c 22 22 20 24 70  ersion of \"" $p
227a0 6c 61 74 66 6f 72 6d 20 5c 0d 0a 20 20 20 20 20  latform \..     
227b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 20 24               / $
227c0 66 69 6c 65 4e 61 6d 65 4f 6e 6c 79 20 22 5c 22  fileNameOnly "\"
227d0 2e 2e 2e 20 5c 22 22 20 5b 66 69 6c 65 20 76 65  ... \"" [file ve
227e0 72 73 69 6f 6e 20 5c 0d 0a 20 20 20 20 20 20 20  rsion \..       
227f0 20 20 20 20 20 20 20 20 20 20 20 5b 67 65 74 42             [getB
22800 69 6e 61 72 79 46 69 6c 65 4e 61 6d 65 20 24 66  inaryFileName $f
22810 69 6c 65 4e 61 6d 65 4f 6e 6c 79 20 24 70 6c 61  ileNameOnly $pla
22820 74 66 6f 72 6d 5d 5d 20 5c 22 5c 6e 5d 0d 0a 20  tform]] \"\n].. 
22830 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
22840 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
22850 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 66         foreach f
22860 69 6c 65 4e 61 6d 65 4f 6e 6c 79 20 5b 67 65 74  ileNameOnly [get
22870 49 6e 74 65 72 6f 70 41 73 73 65 6d 62 6c 79 46  InteropAssemblyF
22880 69 6c 65 4e 61 6d 65 73 4f 6e 6c 79 5d 20 7b 0d  ileNamesOnly] {.
22890 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 61 74  .            cat
228a0 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  ch {..          
228b0 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
228c0 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e  t_channel [appen
228d0 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
228e0 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
228f0 20 66 69 6c 65 20 76 65 72 73 69 6f 6e 20 6f 66   file version of
22900 20 5c 22 22 20 24 70 6c 61 74 66 6f 72 6d 20 5c   \"" $platform \
22910 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
22920 20 20 20 20 2f 20 24 66 69 6c 65 4e 61 6d 65 4f      / $fileNameO
22930 6e 6c 79 20 22 5c 22 2e 2e 2e 20 5c 22 22 20 5b  nly "\"... \"" [
22940 66 69 6c 65 20 76 65 72 73 69 6f 6e 20 5c 0d 0a  file version \..
22950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22960 20 20 5b 67 65 74 42 69 6e 61 72 79 46 69 6c 65    [getBinaryFile
22970 4e 61 6d 65 20 24 66 69 6c 65 4e 61 6d 65 4f 6e  Name $fileNameOn
22980 6c 79 20 24 70 6c 61 74 66 6f 72 6d 5d 5d 20 5c  ly $platform]] \
22990 22 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20  "\n]..          
229a0 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d    }..          }
229b0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 63 61  ....          ca
229c0 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  tch {..         
229d0 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
229e0 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  _channel [append
229f0 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
22a00 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 66 69          "---- fi
22a10 6c 65 20 76 65 72 73 69 6f 6e 20 6f 66 20 5c 22  le version of \"
22a20 22 20 24 70 6c 61 74 66 6f 72 6d 20 5c 0d 0a 20  " $platform \.. 
22a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
22a40 2f 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c  /System.Data.SQL
22a50 69 74 65 2e 64 6c 6c 5c 22 2e 2e 2e 20 5c 22 22  ite.dll\"... \""
22a60 20 5b 66 69 6c 65 20 76 65 72 73 69 6f 6e 20 5c   [file version \
22a70 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
22a80 20 20 5b 67 65 74 42 69 6e 61 72 79 46 69 6c 65    [getBinaryFile
22a90 4e 61 6d 65 20 53 79 73 74 65 6d 2e 44 61 74 61  Name System.Data
22aa0 2e 53 51 4c 69 74 65 2e 64 6c 6c 20 24 70 6c 61  .SQLite.dll $pla
22ab0 74 66 6f 72 6d 5d 5d 20 5c 22 5c 6e 5d 0d 0a 20  tform]] \"\n].. 
22ac0 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
22ad0 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
22ae0 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e   if {[string len
22af0 67 74 68 20 24 61 72 63 68 69 74 65 63 74 75 72  gth $architectur
22b00 65 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  e] > 0} then {..
22b10 20 20 20 20 20 20 20 20 20 20 66 6f 72 65 61 63            foreac
22b20 68 20 66 69 6c 65 4e 61 6d 65 4f 6e 6c 79 20 5b  h fileNameOnly [
22b30 67 65 74 4e 61 74 69 76 65 4c 69 62 72 61 72 79  getNativeLibrary
22b40 46 69 6c 65 4e 61 6d 65 73 4f 6e 6c 79 5d 20 7b  FileNamesOnly] {
22b50 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 61  ..            ca
22b60 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  tch {..         
22b70 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
22b80 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
22b90 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
22ba0 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
22bb0 2d 20 66 69 6c 65 20 76 65 72 73 69 6f 6e 20 6f  - file version o
22bc0 66 20 5c 22 22 20 24 61 72 63 68 69 74 65 63 74  f \"" $architect
22bd0 75 72 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ure \..         
22be0 20 20 20 20 20 20 20 20 20 2f 20 24 66 69 6c 65           / $file
22bf0 4e 61 6d 65 4f 6e 6c 79 20 22 5c 22 2e 2e 2e 20  NameOnly "\"... 
22c00 5c 22 22 20 5b 66 69 6c 65 20 76 65 72 73 69 6f  \"" [file versio
22c10 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n \..           
22c20 20 20 20 20 20 20 20 5b 67 65 74 42 69 6e 61 72         [getBinar
22c30 79 46 69 6c 65 4e 61 6d 65 20 24 66 69 6c 65 4e  yFileName $fileN
22c40 61 6d 65 4f 6e 6c 79 20 24 61 72 63 68 69 74 65  ameOnly $archite
22c50 63 74 75 72 65 5d 5d 20 5c 22 5c 6e 5d 0d 0a 20  cture]] \"\n].. 
22c60 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
22c70 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
22c80 20 20 20 20 20 20 20 63 61 74 63 68 20 7b 0d 0a         catch {..
22c90 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
22ca0 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
22cb0 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
22cc0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
22cd0 20 22 2d 2d 2d 2d 20 66 69 6c 65 20 76 65 72 73   "---- file vers
22ce0 69 6f 6e 20 6f 66 20 5c 22 22 20 24 61 72 63 68  ion of \"" $arch
22cf0 69 74 65 63 74 75 72 65 20 5c 0d 0a 20 20 20 20  itecture \..    
22d00 20 20 20 20 20 20 20 20 20 20 20 20 2f 20 24 66              / $f
22d10 69 6c 65 4e 61 6d 65 4f 6e 6c 79 20 22 5c 22 2e  ileNameOnly "\".
22d20 2e 2e 20 5c 22 22 20 5b 66 69 6c 65 20 76 65 72  .. \"" [file ver
22d30 73 69 6f 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20  sion \..        
22d40 20 20 20 20 20 20 20 20 5b 67 65 74 42 69 6e 61          [getBina
22d50 72 79 46 69 6c 65 4e 61 6d 65 20 24 66 69 6c 65  ryFileName $file
22d60 4e 61 6d 65 4f 6e 6c 79 20 24 61 72 63 68 69 74  NameOnly $archit
22d70 65 63 74 75 72 65 5d 5d 20 5c 22 5c 6e 5d 0d 0a  ecture]] \"\n]..
22d80 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20            }.... 
22d90 20 20 20 20 20 20 20 20 20 63 61 74 63 68 20 7b           catch {
22da0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70  ..            tp
22db0 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  uts $::test_chan
22dc0 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
22dd0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
22de0 20 20 20 22 2d 2d 2d 2d 20 66 69 6c 65 20 76 65     "---- file ve
22df0 72 73 69 6f 6e 20 6f 66 20 5c 22 22 20 24 61 72  rsion of \"" $ar
22e00 63 68 69 74 65 63 74 75 72 65 20 5c 0d 0a 20 20  chitecture \..  
22e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2f                "/
22e20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
22e30 74 65 2e 64 6c 6c 5c 22 2e 2e 2e 20 5c 22 22 20  te.dll\"... \"" 
22e40 5b 66 69 6c 65 20 76 65 72 73 69 6f 6e 20 5c 0d  [file version \.
22e50 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
22e60 20 5b 67 65 74 42 69 6e 61 72 79 46 69 6c 65 4e   [getBinaryFileN
22e70 61 6d 65 20 53 79 73 74 65 6d 2e 44 61 74 61 2e  ame System.Data.
22e80 53 51 4c 69 74 65 2e 64 6c 6c 20 24 61 72 63 68  SQLite.dll $arch
22e90 69 74 65 63 74 75 72 65 5d 5d 20 5c 0d 0a 20 20  itecture]] \..  
22ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 22                \"
22eb0 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  \n]..          }
22ec0 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  ..        }.... 
22ed0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
22ee0 20 20 23 20 4e 4f 54 45 3a 20 47 72 61 62 20 74    # NOTE: Grab t
22ef0 68 65 20 6c 69 73 74 20 6f 66 20 6d 61 6e 61 67  he list of manag
22f00 65 64 20 61 73 73 65 6d 62 6c 69 65 73 20 66 6f  ed assemblies fo
22f10 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 72  r the current pr
22f20 6f 63 65 73 73 0d 0a 20 20 20 20 20 20 20 20 23  ocess..        #
22f30 20 20 20 20 20 20 20 61 6e 64 20 72 65 70 6f 72         and repor
22f40 74 20 6f 6e 20 74 68 65 20 53 79 73 74 65 6d 2e  t on the System.
22f50 44 61 74 61 2e 53 51 4c 69 74 65 20 72 65 6c 61  Data.SQLite rela
22f60 74 65 64 20 6f 6e 65 73 2e 0d 0a 20 20 20 20 20  ted ones...     
22f70 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 69 66     #..        if
22f80 20 7b 5b 68 61 76 65 53 51 4c 69 74 65 4f 62 6a   {[haveSQLiteObj
22f90 65 63 74 43 6f 6d 6d 61 6e 64 5d 7d 20 74 68 65  ectCommand]} the
22fa0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73  n {..          s
22fb0 65 74 20 61 73 73 65 6d 62 6c 69 65 73 20 5b 6f  et assemblies [o
22fc0 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 41 70 70  bject invoke App
22fd0 44 6f 6d 61 69 6e 2e 43 75 72 72 65 6e 74 44 6f  Domain.CurrentDo
22fe0 6d 61 69 6e 20 47 65 74 41 73 73 65 6d 62 6c 69  main GetAssembli
22ff0 65 73 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  es]....         
23000 20 6f 62 6a 65 63 74 20 66 6f 72 65 61 63 68 20   object foreach 
23010 61 73 73 65 6d 62 6c 79 20 24 61 73 73 65 6d 62  assembly $assemb
23020 6c 69 65 73 20 7b 0d 0a 20 20 20 20 20 20 20 20  lies {..        
23030 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20      if {[string 
23040 6d 61 74 63 68 20 5c 7b 53 79 73 74 65 6d 2e 44  match \{System.D
23050 61 74 61 2e 53 51 4c 69 74 65 2a 20 24 61 73 73  ata.SQLite* $ass
23060 65 6d 62 6c 79 5d 7d 20 74 68 65 6e 20 7b 0d 0a  embly]} then {..
23070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 70                tp
23080 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  uts $::test_chan
23090 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
230a0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
230b0 20 20 20 20 20 22 2d 2d 2d 2d 20 66 6f 75 6e 64       "---- found
230c0 20 6c 6f 61 64 65 64 20 61 73 73 65 6d 62 6c 79   loaded assembly
230d0 3a 20 22 20 24 61 73 73 65 6d 62 6c 79 20 5c 6e  : " $assembly \n
230e0 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  ]..            }
230f0 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20  ..          }.. 
23100 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
23110 20 20 20 20 63 61 74 63 68 20 7b 0d 0a 20 20 20      catch {..   
23120 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
23130 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5c 0d 0a  test_channel \..
23140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d                "-
23150 2d 2d 2d 20 64 65 66 69 6e 65 20 63 6f 6e 73 74  --- define const
23160 61 6e 74 73 20 66 6f 72 20 5c 22 53 79 73 74 65  ants for \"Syste
23170 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 5c 22 2e  m.Data.SQLite\".
23180 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 20 20 20 20  .. "....        
23190 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a    if {[catch {..
231a0 20 20 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65              obje
231b0 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73  ct invoke -flags
231c0 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20   +NonPublic \.. 
231d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
231e0 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
231f0 65 2e 53 51 4c 69 74 65 33 20 44 65 66 69 6e 65  e.SQLite3 Define
23200 43 6f 6e 73 74 61 6e 74 73 0d 0a 20 20 20 20 20  Constants..     
23210 20 20 20 20 20 7d 20 64 65 66 69 6e 65 43 6f 6e       } defineCon
23220 73 74 61 6e 74 73 5d 20 3d 3d 20 30 7d 20 74 68  stants] == 0} th
23230 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
23240 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
23250 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
23260 72 67 73 20 5b 66 6f 72 6d 61 74 4c 69 73 74 20  rgs [formatList 
23270 5b 6c 73 6f 72 74 20 5c 0d 0a 20 20 20 20 20 20  [lsort \..      
23280 20 20 20 20 20 20 20 20 20 20 24 64 65 66 69 6e            $defin
23290 65 43 6f 6e 73 74 61 6e 74 73 5d 20 3c 6e 6f 6e  eConstants] <non
232a0 65 3e 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20  e>] \n]..       
232b0 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
232c0 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
232d0 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 75  ::test_channel u
232e0 6e 6b 6e 6f 77 6e 5c 6e 0d 0a 20 20 20 20 20 20  nknown\n..      
232f0 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d      }..        }
23300 0d 0a 0d 0a 20 20 20 20 20 20 20 20 63 61 74 63  ....        catc
23310 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74  h {..          t
23320 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
23330 6e 6e 65 6c 20 5c 0d 0a 20 20 20 20 20 20 20 20  nnel \..        
23340 20 20 20 20 20 20 22 2d 2d 2d 2d 20 73 6f 75 72        "---- sour
23350 63 65 20 76 65 72 73 69 6f 6e 20 6f 66 20 5c 22  ce version of \"
23360 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
23370 74 65 2e 64 6c 6c 5c 22 2e 2e 2e 20 22 0d 0a 0d  te.dll\"... "...
23380 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b  .          if {[
23390 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20  catch {..       
233a0 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f       object invo
233b0 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75  ke -flags +NonPu
233c0 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20 20 20  blic \..        
233d0 20 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44          System.D
233e0 61 74 61 2e 53 51 4c 69 74 65 2e 53 51 4c 69 74  ata.SQLite.SQLit
233f0 65 43 6f 6e 6e 65 63 74 69 6f 6e 20 50 72 6f 76  eConnection Prov
23400 69 64 65 72 56 65 72 73 69 6f 6e 0d 0a 20 20 20  iderVersion..   
23410 20 20 20 20 20 20 20 7d 20 76 65 72 73 69 6f 6e         } version
23420 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  ] == 0} then {..
23430 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b              if {
23440 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
23450 76 65 72 73 69 6f 6e 5d 20 3d 3d 20 30 7d 20 74  version] == 0} t
23460 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
23470 20 20 20 20 20 73 65 74 20 76 65 72 73 69 6f 6e       set version
23480 20 6e 75 6c 6c 0d 0a 20 20 20 20 20 20 20 20 20   null..         
23490 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
234a0 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
234b0 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
234c0 72 67 73 20 24 76 65 72 73 69 6f 6e 20 5c 6e 5d  rgs $version \n]
234d0 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c  ..          } el
234e0 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  se {..          
234f0 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
23500 63 68 61 6e 6e 65 6c 20 75 6e 6b 6e 6f 77 6e 5c  channel unknown\
23510 6e 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  n..          }..
23520 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
23530 20 20 20 20 20 63 61 74 63 68 20 7b 0d 0a 20 20       catch {..  
23540 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
23550 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5c 0d  :test_channel \.
23560 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22  .              "
23570 2d 2d 2d 2d 20 73 6f 75 72 63 65 20 63 68 65 63  ---- source chec
23580 6b 6f 75 74 20 6f 66 20 5c 22 53 79 73 74 65 6d  kout of \"System
23590 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 64 6c 6c  .Data.SQLite.dll
235a0 5c 22 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 20  \"... "....     
235b0 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20       if {[catch 
235c0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 6f  {..            o
235d0 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c  bject invoke -fl
235e0 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c  ags +NonPublic \
235f0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
23600 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51    System.Data.SQ
23610 4c 69 74 65 2e 53 51 4c 69 74 65 43 6f 6e 6e 65  Lite.SQLiteConne
23620 63 74 69 6f 6e 20 50 72 6f 76 69 64 65 72 53 6f  ction ProviderSo
23630 75 72 63 65 49 64 0d 0a 20 20 20 20 20 20 20 20  urceId..        
23640 20 20 7d 20 73 6f 75 72 63 65 49 64 5d 20 3d 3d    } sourceId] ==
23650 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
23660 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72          if {[str
23670 69 6e 67 20 6c 65 6e 67 74 68 20 24 73 6f 75 72  ing length $sour
23680 63 65 49 64 5d 20 3d 3d 20 30 7d 20 74 68 65 6e  ceId] == 0} then
23690 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
236a0 20 20 73 65 74 20 73 6f 75 72 63 65 49 64 20 6e    set sourceId n
236b0 75 6c 6c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ull..           
236c0 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   }..            
236d0 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
236e0 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
236f0 73 20 24 73 6f 75 72 63 65 49 64 20 5c 6e 5d 0d  s $sourceId \n].
23700 0a 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73  .          } els
23710 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e {..           
23720 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
23730 68 61 6e 6e 65 6c 20 75 6e 6b 6e 6f 77 6e 5c 6e  hannel unknown\n
23740 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20  ..          }.. 
23750 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
23760 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
23770 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 74 68 65   NOTE: Check the
23780 20 61 76 61 69 6c 61 62 6c 65 20 62 75 69 6c 64   available build
23790 73 20 28 61 6e 64 20 22 72 65 6c 65 61 73 65 73  s (and "releases
237a0 22 29 20 6f 66 20 53 51 4c 69 74 65 20 61 6e 64  ") of SQLite and
237b0 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
237c0 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51    System.Data.SQ
237d0 4c 69 74 65 2e 0d 0a 20 20 20 20 20 20 20 20 23  Lite...        #
237e0 0d 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b 46  ..        checkF
237f0 6f 72 53 51 4c 69 74 65 42 75 69 6c 64 73 20 24  orSQLiteBuilds $
23800 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 0d 0a  ::test_channel..
23810 20 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72          checkFor
23820 53 51 4c 69 74 65 52 65 6c 65 61 73 65 73 20 24  SQLiteReleases $
23830 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 0d 0a  ::test_channel..
23840 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
23850 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4e 6f 77       # NOTE: Now
23860 2c 20 77 65 20 6e 65 65 64 20 74 6f 20 6b 6e 6f  , we need to kno
23870 77 20 69 66 20 74 68 65 20 53 51 4c 69 74 65 20  w if the SQLite 
23880 63 6f 72 65 20 6c 69 62 72 61 72 79 20 69 73 20  core library is 
23890 61 76 61 69 6c 61 62 6c 65 0d 0a 20 20 20 20 20  available..     
238a0 20 20 20 23 20 20 20 20 20 20 20 28 69 2e 65 2e     #       (i.e.
238b0 20 62 65 63 61 75 73 65 20 74 68 65 20 6d 61 6e   because the man
238c0 61 67 65 64 2d 6f 6e 6c 79 20 53 79 73 74 65 6d  aged-only System
238d0 2e 44 61 74 61 2e 53 51 4c 69 74 65 20 61 73 73  .Data.SQLite ass
238e0 65 6d 62 6c 79 20 63 61 6e 0d 0a 20 20 20 20 20  embly can..     
238f0 20 20 20 23 20 20 20 20 20 20 20 6c 6f 61 64 20     #       load 
23900 77 69 74 68 6f 75 74 20 69 74 3b 20 68 6f 77 65  without it; howe
23910 76 65 72 2c 20 69 74 20 63 61 6e 6e 6f 74 20 64  ver, it cannot d
23920 6f 20 61 6e 79 74 68 69 6e 67 20 75 73 65 66 75  o anything usefu
23930 6c 20 77 69 74 68 6f 75 74 0d 0a 20 20 20 20 20  l without..     
23940 20 20 20 23 20 20 20 20 20 20 20 69 74 29 2e 20     #       it). 
23950 20 49 66 20 77 65 20 61 72 65 20 75 73 69 6e 67   If we are using
23960 20 74 68 65 20 6d 69 78 65 64 2d 6d 6f 64 65 20   the mixed-mode 
23970 61 73 73 65 6d 62 6c 79 20 61 6e 64 20 77 65 20  assembly and we 
23980 61 6c 72 65 61 64 79 0d 0a 20 20 20 20 20 20 20  already..       
23990 20 23 20 20 20 20 20 20 20 66 6f 75 6e 64 20 69   #       found i
239a0 74 20 28 61 62 6f 76 65 29 2c 20 74 68 69 73 20  t (above), this 
239b0 73 68 6f 75 6c 64 20 61 6c 77 61 79 73 20 73 75  should always su
239c0 63 63 65 65 64 2e 0d 0a 20 20 20 20 20 20 20 20  cceed...        
239d0 23 0d 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b  #..        check
239e0 46 6f 72 53 51 4c 69 74 65 4c 69 62 72 61 72 79  ForSQLiteLibrary
239f0 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
23a00 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  ....        #.. 
23a10 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43         # NOTE: C
23a20 68 65 63 6b 20 69 66 20 74 68 65 20 53 51 4c 69  heck if the SQLi
23a30 74 65 20 69 6e 74 65 72 6f 70 20 61 73 73 65 6d  te interop assem
23a40 62 6c 79 20 69 73 20 61 76 61 69 6c 61 62 6c 65  bly is available
23a50 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
23a60 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72 53 51        checkForSQ
23a70 4c 69 74 65 49 6e 74 65 72 6f 70 20 24 3a 3a 74  LiteInterop $::t
23a80 65 73 74 5f 63 68 61 6e 6e 65 6c 0d 0a 0d 0a 20  est_channel.... 
23a90 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
23aa0 20 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20    # NOTE: Check 
23ab0 74 68 65 20 53 51 4c 69 74 65 20 64 61 74 61 62  the SQLite datab
23ac0 61 73 65 20 61 6e 64 20 74 65 6d 70 6f 72 61 72  ase and temporar
23ad0 79 20 64 69 72 65 63 74 6f 72 69 65 73 2e 0d 0a  y directories...
23ae0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
23af0 20 20 20 63 68 65 63 6b 46 6f 72 53 51 4c 69 74     checkForSQLit
23b00 65 44 69 72 65 63 74 6f 72 69 65 73 20 24 3a 3a  eDirectories $::
23b10 74 65 73 74 5f 63 68 61 6e 6e 65 6c 0d 0a 0d 0a  test_channel....
23b20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
23b30 20 20 20 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d     # NOTE: Attem
23b40 70 74 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  pt to determine 
23b50 69 66 20 76 61 72 69 6f 75 73 20 63 6f 6d 70 69  if various compi
23b60 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 73 20  le-time options 
23b70 6e 65 65 64 65 64 20 66 6f 72 0d 0a 20 20 20 20  needed for..    
23b80 20 20 20 20 23 20 20 20 20 20 20 20 74 65 73 74      #       test
23b90 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 77 65 72   constraints wer
23ba0 65 20 65 6e 61 62 6c 65 64 20 66 6f 72 20 74 68  e enabled for th
23bb0 65 20 6d 61 6e 61 67 65 64 20 61 73 73 65 6d 62  e managed assemb
23bc0 6c 79 2e 20 20 54 68 65 72 65 0d 0a 20 20 20 20  ly.  There..    
23bd0 20 20 20 20 23 20 20 20 20 20 20 20 61 72 65 20      #       are 
23be0 73 6f 6d 65 20 63 6f 6d 70 69 6c 65 2d 74 69 6d  some compile-tim
23bf0 65 20 6f 70 74 69 6f 6e 73 20 74 68 61 74 20 6d  e options that m
23c00 75 73 74 20 61 6c 73 6f 20 68 61 76 65 20 62 65  ust also have be
23c10 65 6e 20 65 6e 61 62 6c 65 64 0d 0a 20 20 20 20  en enabled..    
23c20 20 20 20 20 23 20 20 20 20 20 20 20 66 6f 72 20      #       for 
23c30 74 68 65 20 69 6e 74 65 72 6f 70 20 61 73 73 65  the interop asse
23c40 6d 62 6c 79 20 69 6e 20 6f 72 64 65 72 20 74 6f  mbly in order to
23c50 20 62 65 20 65 66 66 65 63 74 69 76 65 2e 20 20   be effective.  
23c60 46 6f 72 20 74 68 6f 73 65 0d 0a 20 20 20 20 20  For those..     
23c70 20 20 20 23 20 20 20 20 20 20 20 6f 70 74 69 6f     #       optio
23c80 6e 73 2c 20 69 74 20 77 69 6c 6c 20 62 65 20 61  ns, it will be a
23c90 73 73 75 6d 65 64 20 74 68 61 74 20 69 74 20 77  ssumed that it w
23ca0 61 73 20 65 6e 61 62 6c 65 64 20 66 6f 72 20 74  as enabled for t
23cb0 68 65 20 69 6e 74 65 72 6f 70 0d 0a 20 20 20 20  he interop..    
23cc0 20 20 20 20 23 20 20 20 20 20 20 20 61 73 73 65      #       asse
23cd0 6d 62 6c 79 20 69 66 20 69 74 20 77 61 73 20 65  mbly if it was e
23ce0 6e 61 62 6c 65 64 20 66 6f 72 20 74 68 65 20 6d  nabled for the m
23cf0 61 6e 61 67 65 64 20 61 73 73 65 6d 62 6c 79 2e  anaged assembly.
23d00 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
23d10 20 20 20 20 20 66 6f 72 65 61 63 68 20 64 65 66       foreach def
23d20 69 6e 65 43 6f 6e 73 74 61 6e 74 20 5b 6c 69 73  ineConstant [lis
23d30 74 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  t \..           
23d40 20 43 48 45 43 4b 5f 53 54 41 54 45 20 43 4f 55   CHECK_STATE COU
23d50 4e 54 5f 48 41 4e 44 4c 45 20 44 45 42 55 47 20  NT_HANDLE DEBUG 
23d60 49 4e 54 45 52 4f 50 5f 43 4f 44 45 43 20 49 4e  INTEROP_CODEC IN
23d70 54 45 52 4f 50 5f 44 45 42 55 47 20 5c 0d 0a 20  TEROP_DEBUG \.. 
23d80 20 20 20 20 20 20 20 20 20 20 20 49 4e 54 45 52             INTER
23d90 4f 50 5f 45 58 54 45 4e 53 49 4f 4e 5f 46 55 4e  OP_EXTENSION_FUN
23da0 43 54 49 4f 4e 53 20 49 4e 54 45 52 4f 50 5f 46  CTIONS INTEROP_F
23db0 54 53 35 5f 45 58 54 45 4e 53 49 4f 4e 20 5c 0d  TS5_EXTENSION \.
23dc0 0a 20 20 20 20 20 20 20 20 20 20 20 20 49 4e 54  .            INT
23dd0 45 52 4f 50 5f 49 4e 43 4c 55 44 45 5f 43 45 52  EROP_INCLUDE_CER
23de0 4f 44 20 49 4e 54 45 52 4f 50 5f 49 4e 43 4c 55  OD INTEROP_INCLU
23df0 44 45 5f 45 58 54 52 41 20 49 4e 54 45 52 4f 50  DE_EXTRA INTEROP
23e00 5f 49 4e 43 4c 55 44 45 5f 53 45 45 20 5c 0d 0a  _INCLUDE_SEE \..
23e10 20 20 20 20 20 20 20 20 20 20 20 20 49 4e 54 45              INTE
23e20 52 4f 50 5f 49 4e 43 4c 55 44 45 5f 5a 49 50 56  ROP_INCLUDE_ZIPV
23e30 46 53 20 49 4e 54 45 52 4f 50 5f 4a 53 4f 4e 31  FS INTEROP_JSON1
23e40 5f 45 58 54 45 4e 53 49 4f 4e 20 5c 0d 0a 20 20  _EXTENSION \..  
23e50 20 20 20 20 20 20 20 20 20 20 49 4e 54 45 52 4f            INTERO
23e60 50 5f 4c 45 47 41 43 59 5f 43 4c 4f 53 45 20 49  P_LEGACY_CLOSE I
23e70 4e 54 45 52 4f 50 5f 4c 4f 47 20 49 4e 54 45 52  NTEROP_LOG INTER
23e80 4f 50 5f 50 45 52 43 45 4e 54 49 4c 45 5f 45 58  OP_PERCENTILE_EX
23e90 54 45 4e 53 49 4f 4e 20 5c 0d 0a 20 20 20 20 20  TENSION \..     
23ea0 20 20 20 20 20 20 20 49 4e 54 45 52 4f 50 5f 52         INTEROP_R
23eb0 45 47 45 58 50 5f 45 58 54 45 4e 53 49 4f 4e 20  EGEXP_EXTENSION 
23ec0 49 4e 54 45 52 4f 50 5f 54 45 53 54 5f 45 58 54  INTEROP_TEST_EXT
23ed0 45 4e 53 49 4f 4e 20 5c 0d 0a 20 20 20 20 20 20  ENSION \..      
23ee0 20 20 20 20 20 20 49 4e 54 45 52 4f 50 5f 54 4f        INTEROP_TO
23ef0 54 59 50 45 5f 45 58 54 45 4e 53 49 4f 4e 20 49  TYPE_EXTENSION I
23f00 4e 54 45 52 4f 50 5f 56 49 52 54 55 41 4c 5f 54  NTEROP_VIRTUAL_T
23f10 41 42 4c 45 20 4e 45 54 5f 32 30 20 4e 45 54 5f  ABLE NET_20 NET_
23f20 33 35 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  35 \..          
23f30 20 20 4e 45 54 5f 34 30 20 4e 45 54 5f 34 35 20    NET_40 NET_45 
23f40 4e 45 54 5f 34 35 31 20 4e 45 54 5f 34 35 32 20  NET_451 NET_452 
23f50 4e 45 54 5f 34 36 20 4e 45 54 5f 34 36 31 20 4e  NET_46 NET_461 N
23f60 45 54 5f 43 4f 4d 50 41 43 54 5f 32 30 20 5c 0d  ET_COMPACT_20 \.
23f70 0a 20 20 20 20 20 20 20 20 20 20 20 20 50 4c 41  .            PLA
23f80 54 46 4f 52 4d 5f 43 4f 4d 50 41 43 54 46 52 41  TFORM_COMPACTFRA
23f90 4d 45 57 4f 52 4b 20 50 52 45 4c 4f 41 44 5f 4e  MEWORK PRELOAD_N
23fa0 41 54 49 56 45 5f 4c 49 42 52 41 52 59 20 52 45  ATIVE_LIBRARY RE
23fb0 54 41 52 47 45 54 41 42 4c 45 20 5c 0d 0a 20 20  TARGETABLE \..  
23fc0 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
23fd0 5f 53 54 41 4e 44 41 52 44 20 54 48 52 4f 57 5f  _STANDARD THROW_
23fe0 4f 4e 5f 44 49 53 50 4f 53 45 44 20 54 52 41 43  ON_DISPOSED TRAC
23ff0 45 20 54 52 41 43 45 5f 43 4f 4e 4e 45 43 54 49  E TRACE_CONNECTI
24000 4f 4e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  ON \..          
24010 20 20 54 52 41 43 45 5f 44 45 54 45 43 54 49 4f    TRACE_DETECTIO
24020 4e 20 54 52 41 43 45 5f 48 41 4e 44 4c 45 20 54  N TRACE_HANDLE T
24030 52 41 43 45 5f 50 52 45 4c 4f 41 44 20 54 52 41  RACE_PRELOAD TRA
24040 43 45 5f 53 48 41 52 45 44 20 5c 0d 0a 20 20 20  CE_SHARED \..   
24050 20 20 20 20 20 20 20 20 20 54 52 41 43 45 5f 53           TRACE_S
24060 54 41 54 45 4d 45 4e 54 20 54 52 41 43 45 5f 57  TATEMENT TRACE_W
24070 41 52 4e 49 4e 47 20 54 52 41 43 4b 5f 4d 45 4d  ARNING TRACK_MEM
24080 4f 52 59 5f 42 59 54 45 53 20 5c 0d 0a 20 20 20  ORY_BYTES \..   
24090 20 20 20 20 20 20 20 20 20 55 53 45 5f 45 4e 54           USE_ENT
240a0 49 54 59 5f 46 52 41 4d 45 57 4f 52 4b 5f 36 20  ITY_FRAMEWORK_6 
240b0 55 53 45 5f 49 4e 54 45 52 4f 50 5f 44 4c 4c 20  USE_INTEROP_DLL 
240c0 55 53 45 5f 50 52 45 50 41 52 45 5f 56 32 20 57  USE_PREPARE_V2 W
240d0 49 4e 44 4f 57 53 5d 20 7b 0d 0a 20 20 20 20 20  INDOWS] {..     
240e0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
240f0 20 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20    # NOTE: Check 
24100 69 66 20 74 68 65 20 63 6f 6d 70 69 6c 65 2d 74  if the compile-t
24110 69 6d 65 20 6f 70 74 69 6f 6e 20 69 73 20 6c 69  ime option is li
24120 73 74 65 64 20 69 6e 20 74 68 65 20 6c 69 73 74  sted in the list
24130 20 6f 66 0d 0a 20 20 20 20 20 20 20 20 20 20 23   of..          #
24140 20 20 20 20 20 20 20 22 64 65 66 69 6e 65 20 63         "define c
24150 6f 6e 73 74 61 6e 74 73 22 20 6b 65 70 74 20 74  onstants" kept t
24160 72 61 63 6b 20 6f 66 20 62 79 20 74 68 65 20 6d  rack of by the m
24170 61 6e 61 67 65 64 20 61 73 73 65 6d 62 6c 79 2e  anaged assembly.
24180 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20  ..          #.. 
24190 20 20 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f           checkFo
241a0 72 53 51 4c 69 74 65 44 65 66 69 6e 65 43 6f 6e  rSQLiteDefineCon
241b0 73 74 61 6e 74 20 24 3a 3a 74 65 73 74 5f 63 68  stant $::test_ch
241c0 61 6e 6e 65 6c 20 24 64 65 66 69 6e 65 43 6f 6e  annel $defineCon
241d0 73 74 61 6e 74 0d 0a 20 20 20 20 20 20 20 20 7d  stant..        }
241e0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  ....        #.. 
241f0 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43         # NOTE: C
24200 68 65 63 6b 20 69 66 20 74 68 65 20 53 79 73 74  heck if the Syst
24210 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 20 70  em.Data.SQLite p
24220 72 6f 76 69 64 65 72 20 77 61 73 20 63 6f 6d 70  rovider was comp
24230 69 6c 65 64 20 77 69 74 68 0d 0a 20 20 20 20 20  iled with..     
24240 20 20 20 23 20 20 20 20 20 20 20 73 75 70 70 6f     #       suppo
24250 72 74 20 66 6f 72 20 61 6e 79 20 65 6e 63 72 79  rt for any encry
24260 70 74 65 64 20 64 61 74 61 62 61 73 65 73 2e 0d  pted databases..
24270 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
24280 20 20 20 20 69 66 20 7b 5b 68 61 76 65 53 51 4c      if {[haveSQL
24290 69 74 65 44 65 66 69 6e 65 43 6f 6e 73 74 61 6e  iteDefineConstan
242a0 74 20 49 4e 54 45 52 4f 50 5f 43 4f 44 45 43 5d  t INTEROP_CODEC]
242b0 20 7c 7c 20 5c 0d 0a 20 20 20 20 20 20 20 20 20   || \..         
242c0 20 20 20 5b 68 61 76 65 53 51 4c 69 74 65 44 65     [haveSQLiteDe
242d0 66 69 6e 65 43 6f 6e 73 74 61 6e 74 20 49 4e 54  fineConstant INT
242e0 45 52 4f 50 5f 49 4e 43 4c 55 44 45 5f 53 45 45  EROP_INCLUDE_SEE
242f0 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
24300 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
24310 20 20 23 20 4e 4f 54 45 3a 20 59 65 73 2c 20 61    # NOTE: Yes, a
24320 64 64 20 67 65 6e 65 72 69 63 20 63 6f 6e 73 74  dd generic const
24330 72 61 69 6e 74 20 66 6f 72 20 75 73 65 20 62 79  raint for use by
24340 20 74 68 65 20 74 65 73 74 20 73 75 69 74 65 2e   the test suite.
24350 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20  ..          #.. 
24360 20 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73           addCons
24370 74 72 61 69 6e 74 20 53 79 73 74 65 6d 2e 44 61  traint System.Da
24380 74 61 2e 53 51 4c 69 74 65 2e 45 6e 63 72 79 70  ta.SQLite.Encryp
24390 74 69 6f 6e 0d 0a 20 20 20 20 20 20 20 20 7d 0d  tion..        }.
243a0 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
243b0 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68        # NOTE: Ch
243c0 65 63 6b 20 74 68 65 20 63 75 72 72 65 6e 74 20  eck the current 
243d0 62 75 69 6c 64 20 79 65 61 72 2e 20 20 42 61 73  build year.  Bas
243e0 69 63 61 6c 6c 79 2c 20 74 68 69 73 20 69 6e 64  ically, this ind
243f0 69 63 61 74 65 73 0d 0a 20 20 20 20 20 20 20 20  icates..        
24400 23 20 20 20 20 20 20 20 77 68 69 63 68 20 76 65  #       which ve
24410 72 73 69 6f 6e 20 6f 66 20 4d 53 42 75 69 6c 64  rsion of MSBuild
24420 20 61 6e 64 2f 6f 72 20 56 69 73 75 61 6c 20 53   and/or Visual S
24430 74 75 64 69 6f 20 77 61 73 20 75 73 65 64 20 74  tudio was used t
24440 6f 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  o..        #    
24450 20 20 20 63 6f 6d 70 69 6c 65 20 74 68 65 20 61     compile the a
24460 73 73 65 6d 62 6c 79 20 62 69 6e 61 72 69 65 73  ssembly binaries
24470 20 75 6e 64 65 72 20 74 65 73 74 2e 0d 0a 20 20   under test...  
24480 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
24490 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
244a0 68 61 6e 6e 65 6c 20 5c 0d 0a 20 20 20 20 20 20  hannel \..      
244b0 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 68 65 63        "---- chec
244c0 6b 69 6e 67 20 66 6f 72 20 53 79 73 74 65 6d 2e  king for System.
244d0 44 61 74 61 2e 53 51 4c 69 74 65 20 62 75 69 6c  Data.SQLite buil
244e0 64 20 79 65 61 72 2e 2e 2e 20 22 0d 0a 0d 0a 20  d year... ".... 
244f0 20 20 20 20 20 20 20 73 65 74 20 79 65 61 72 20         set year 
24500 5b 67 65 74 42 75 69 6c 64 59 65 61 72 5d 0d 0a  [getBuildYear]..
24510 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74          addConst
24520 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67  raint [appendArg
24530 73 20 62 75 69 6c 64 59 65 61 72 2e 20 24 79 65  s buildYear. $ye
24540 61 72 5d 0d 0a 20 20 20 20 20 20 20 20 74 70 75  ar]..        tpu
24550 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
24560 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
24570 22 20 24 79 65 61 72 20 5c 22 5c 6e 5d 0d 0a 0d  " $year \"\n]...
24580 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
24590 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68 65 63      # NOTE: Chec
245a0 6b 20 74 68 65 20 63 75 72 72 65 6e 74 20 62 75  k the current bu
245b0 69 6c 64 20 2e 4e 45 54 20 46 72 61 6d 65 77 6f  ild .NET Framewo
245c0 72 6b 2e 20 20 42 61 73 69 63 61 6c 6c 79 2c 20  rk.  Basically, 
245d0 74 68 69 73 0d 0a 20 20 20 20 20 20 20 20 23 20  this..        # 
245e0 20 20 20 20 20 20 69 6e 64 69 63 61 74 65 73 20        indicates 
245f0 77 68 69 63 68 20 76 65 72 73 69 6f 6e 20 6f 66  which version of
24600 20 74 68 65 20 2e 4e 45 54 20 46 72 61 6d 65 77   the .NET Framew
24610 6f 72 6b 20 69 73 20 62 65 69 6e 67 0d 0a 20 20  ork is being..  
24620 20 20 20 20 20 20 23 20 20 20 20 20 20 20 75 73        #       us
24630 65 64 20 62 79 20 74 68 65 20 61 73 73 65 6d 62  ed by the assemb
24640 6c 79 20 62 69 6e 61 72 69 65 73 20 75 6e 64 65  ly binaries unde
24650 72 20 74 65 73 74 2e 0d 0a 20 20 20 20 20 20 20  r test...       
24660 20 23 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74   #..        tput
24670 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
24680 6c 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  l \..           
24690 20 22 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e 67 20   "---- checking 
246a0 66 6f 72 20 53 79 73 74 65 6d 2e 44 61 74 61 2e  for System.Data.
246b0 53 51 4c 69 74 65 20 62 75 69 6c 64 20 2e 4e 45  SQLite build .NE
246c0 54 20 46 72 61 6d 65 77 6f 72 6b 2e 2e 2e 20 22  T Framework... "
246d0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20  ....        set 
246e0 6e 65 74 46 78 20 5b 67 65 74 42 75 69 6c 64 4e  netFx [getBuildN
246f0 65 74 46 78 5d 0d 0a 20 20 20 20 20 20 20 20 61  etFx]..        a
24700 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70  ddConstraint [ap
24710 70 65 6e 64 41 72 67 73 20 62 75 69 6c 64 46 72  pendArgs buildFr
24720 61 6d 65 77 6f 72 6b 2e 20 24 6e 65 74 46 78 5d  amework. $netFx]
24730 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20  ..        tputs 
24740 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
24750 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 22 20 24  [appendArgs \" $
24760 6e 65 74 46 78 20 5c 22 5c 6e 5d 0d 0a 0d 0a 20  netFx \"\n].... 
24770 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
24780 20 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20    # NOTE: Check 
24790 74 68 65 20 63 75 72 72 65 6e 74 20 62 75 69 6c  the current buil
247a0 64 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e  d configuration.
247b0 20 20 54 68 69 73 20 73 68 6f 75 6c 64 20 6e 6f    This should no
247c0 72 6d 61 6c 6c 79 0d 0a 20 20 20 20 20 20 20 20  rmally..        
247d0 23 20 20 20 20 20 20 20 62 65 20 65 69 74 68 65  #       be eithe
247e0 72 20 22 44 65 62 75 67 22 20 6f 72 20 22 52 65  r "Debug" or "Re
247f0 6c 65 61 73 65 22 2e 0d 0a 20 20 20 20 20 20 20  lease"...       
24800 20 23 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74   #..        tput
24810 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
24820 6c 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  l \..           
24830 20 22 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e 67 20   "---- checking 
24840 66 6f 72 20 53 79 73 74 65 6d 2e 44 61 74 61 2e  for System.Data.
24850 53 51 4c 69 74 65 20 62 75 69 6c 64 20 63 6f 6e  SQLite build con
24860 66 69 67 75 72 61 74 69 6f 6e 2e 2e 2e 20 22 0d  figuration... ".
24870 0a 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 63  ...        set c
24880 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 5b 67 65  onfiguration [ge
24890 74 42 75 69 6c 64 43 6f 6e 66 69 67 75 72 61 74  tBuildConfigurat
248a0 69 6f 6e 5d 0d 0a 20 20 20 20 20 20 20 20 61 64  ion]..        ad
248b0 64 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70  dConstraint [app
248c0 65 6e 64 41 72 67 73 20 62 75 69 6c 64 43 6f 6e  endArgs buildCon
248d0 66 69 67 75 72 61 74 69 6f 6e 2e 20 24 63 6f 6e  figuration. $con
248e0 66 69 67 75 72 61 74 69 6f 6e 5d 0d 0a 20 20 20  figuration]..   
248f0 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
24900 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
24910 6e 64 41 72 67 73 20 5c 22 20 24 63 6f 6e 66 69  ndArgs \" $confi
24920 67 75 72 61 74 69 6f 6e 20 5c 22 5c 6e 5d 0d 0a  guration \"\n]..
24930 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
24940 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 72 79       # NOTE: Try
24950 20 74 6f 20 73 65 74 75 70 20 61 6e 20 69 6e 74   to setup an int
24960 65 72 72 75 70 74 20 63 61 6c 6c 62 61 63 6b 20  errupt callback 
24970 75 73 69 6e 67 20 74 68 65 20 73 63 72 69 70 74  using the script
24980 20 64 65 62 75 67 67 65 72 0d 0a 20 20 20 20 20   debugger..     
24990 20 20 20 23 20 20 20 20 20 20 20 74 68 61 74 20     #       that 
249a0 77 69 6c 6c 20 63 61 6e 63 65 6c 20 61 6c 6c 20  will cancel all 
249b0 53 51 4c 20 71 75 65 72 69 65 73 20 69 6e 20 70  SQL queries in p
249c0 72 6f 67 72 65 73 73 20 66 6f 72 20 61 6c 6c 20  rogress for all 
249d0 64 61 74 61 62 61 73 65 0d 0a 20 20 20 20 20 20  database..      
249e0 20 20 23 20 20 20 20 20 20 20 63 6f 6e 6e 65 63    #       connec
249f0 74 69 6f 6e 73 20 6b 6e 6f 77 6e 20 74 6f 20 74  tions known to t
24a00 68 69 73 20 69 6e 74 65 72 70 72 65 74 65 72 2e  his interpreter.
24a10 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
24a20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20       if {![info 
24a30 65 78 69 73 74 73 20 3a 3a 6e 6f 28 73 71 6c 69  exists ::no(sqli
24a40 74 65 49 6e 74 65 72 72 75 70 74 43 61 6c 6c 62  teInterruptCallb
24a50 61 63 6b 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  ack)]} then {.. 
24a60 20 20 20 20 20 20 20 20 20 73 65 74 75 70 44 62           setupDb
24a70 49 6e 74 65 72 72 75 70 74 43 61 6c 6c 62 61 63  InterruptCallbac
24a80 6b 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  k $::test_channe
24a90 6c 20 24 3a 3a 74 65 73 74 5f 6c 6f 67 0d 0a 20  l $::test_log.. 
24aa0 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
24ab0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
24ac0 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 66 6f 72   NOTE: Check for
24ad0 20 74 68 65 20 6e 61 74 69 76 65 20 72 75 6e 74   the native runt
24ae0 69 6d 65 20 6f 70 74 69 6f 6e 2c 20 77 68 69 63  ime option, whic
24af0 68 20 77 6f 75 6c 64 20 6d 65 61 6e 20 77 65 20  h would mean we 
24b00 61 72 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20  are..        #  
24b10 20 20 20 20 20 75 73 69 6e 67 20 74 68 65 20 6d       using the m
24b20 69 78 65 64 2d 6d 6f 64 65 20 61 73 73 65 6d 62  ixed-mode assemb
24b30 6c 79 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  ly...        #..
24b40 20 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72          checkFor
24b50 52 75 6e 74 69 6d 65 4f 70 74 69 6f 6e 20 24 3a  RuntimeOption $:
24b60 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 6e 61  :test_channel na
24b70 74 69 76 65 0d 0a 0d 0a 20 20 20 20 20 20 20 20  tive....        
24b80 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
24b90 45 3a 20 43 68 65 63 6b 20 69 66 20 74 68 65 20  E: Check if the 
24ba0 74 65 73 74 20 73 75 69 74 65 20 73 68 6f 75 6c  test suite shoul
24bb0 64 20 63 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62  d count the numb
24bc0 65 72 20 6f 66 20 63 6f 6e 6e 65 63 74 69 6f 6e  er of connection
24bd0 73 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  s..        #    
24be0 20 20 20 22 6f 70 65 6e 65 64 22 20 61 6e 64 20     "opened" and 
24bf0 22 63 6c 6f 73 65 64 22 20 66 72 6f 6d 20 74 68  "closed" from th
24c00 65 20 70 6f 6f 6c 20 77 68 65 6e 20 64 65 74 65  e pool when dete
24c10 72 6d 69 6e 69 6e 67 20 69 66 20 61 20 74 65 73  rmining if a tes
24c20 74 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  t..        #    
24c30 20 20 20 70 61 73 73 65 64 2e 20 20 44 69 73 61     passed.  Disa
24c40 62 6c 69 6e 67 20 74 68 69 73 20 62 65 68 61 76  bling this behav
24c50 69 6f 72 20 69 73 20 73 6f 6d 65 74 69 6d 65 73  ior is sometimes
24c60 20 6e 65 63 65 73 73 61 72 79 20 28 65 2e 67 2e   necessary (e.g.
24c70 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
24c80 20 20 64 75 72 69 6e 67 20 74 68 65 20 72 65 6c    during the rel
24c90 65 61 73 65 20 74 65 73 74 69 6e 67 20 70 72 6f  ease testing pro
24ca0 63 65 73 73 29 20 62 65 63 61 75 73 65 20 74 68  cess) because th
24cb0 65 72 65 20 61 72 65 20 73 65 76 65 72 61 6c 0d  ere are several.
24cc0 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
24cd0 20 74 65 73 74 73 20 74 68 61 74 20 72 65 6c 79   tests that rely
24ce0 20 6f 6e 20 74 68 65 20 22 6f 70 65 6e 65 64 20   on the "opened 
24cf0 66 72 6f 6d 20 70 6f 6f 6c 22 20 63 6f 75 6e 74  from pool" count
24d00 20 62 65 69 6e 67 20 67 72 65 61 74 65 72 0d 0a   being greater..
24d10 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
24d20 74 68 61 6e 20 7a 65 72 6f 2e 20 20 54 68 65 73  than zero.  Thes
24d30 65 20 74 65 73 74 73 20 6d 61 79 20 66 61 69 6c  e tests may fail
24d40 20 64 75 65 20 74 6f 20 74 68 65 20 6e 6f 6e 2d   due to the non-
24d50 64 65 74 65 72 6d 69 6e 69 73 74 69 63 0d 0a 20  deterministic.. 
24d60 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 62         #       b
24d70 65 68 61 76 69 6f 72 20 6f 66 20 74 68 65 20 43  ehavior of the C
24d80 4c 52 20 47 43 2c 20 65 76 65 6e 20 77 68 65 6e  LR GC, even when
24d90 20 74 68 65 72 65 20 69 73 20 6e 6f 20 62 75 67   there is no bug
24da0 20 69 6e 20 74 68 65 20 63 6f 64 65 0d 0a 20 20   in the code..  
24db0 20 20 20 20 20 20 23 20 20 20 20 20 20 20 62 65        #       be
24dc0 69 6e 67 20 74 65 73 74 65 64 2e 0d 0a 20 20 20  ing tested...   
24dd0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
24de0 63 68 65 63 6b 46 6f 72 52 75 6e 74 69 6d 65 4f  checkForRuntimeO
24df0 70 74 69 6f 6e 20 24 3a 3a 74 65 73 74 5f 63 68  ption $::test_ch
24e00 61 6e 6e 65 6c 20 6e 6f 50 6f 6f 6c 43 6f 75 6e  annel noPoolCoun
24e10 74 73 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d  ts....        #.
24e20 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
24e30 20 43 68 65 63 6b 20 69 66 20 74 68 65 20 74 65   Check if the te
24e40 73 74 20 73 75 69 74 65 20 73 68 6f 75 6c 64 20  st suite should 
24e50 75 73 65 20 73 68 61 72 65 64 2d 63 61 63 68 65  use shared-cache
24e60 20 6d 6f 64 65 2e 0d 0a 20 20 20 20 20 20 20 20   mode...        
24e70 23 0d 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b  #..        check
24e80 46 6f 72 52 75 6e 74 69 6d 65 4f 70 74 69 6f 6e  ForRuntimeOption
24e90 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
24ea0 20 73 68 61 72 65 64 43 61 63 68 65 0d 0a 0d 0a   sharedCache....
24eb0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
24ec0 20 20 20 23 20 4e 4f 54 45 3a 20 52 65 70 6f 72     # NOTE: Repor
24ed0 74 20 74 68 65 20 72 65 73 6f 75 72 63 65 20 75  t the resource u
24ee0 73 61 67 65 20 70 72 69 6f 72 20 74 6f 20 72 75  sage prior to ru
24ef0 6e 6e 69 6e 67 20 61 6e 79 20 74 65 73 74 73 2e  nning any tests.
24f00 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
24f10 20 20 20 20 20 72 65 70 6f 72 74 53 51 4c 69 74       reportSQLit
24f20 65 52 65 73 6f 75 72 63 65 73 20 24 3a 3a 74 65  eResources $::te
24f30 73 74 5f 63 68 61 6e 6e 65 6c 0d 0a 0d 0a 20 20  st_channel....  
24f40 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
24f50 20 23 20 4e 4f 54 45 3a 20 47 72 61 62 20 74 68   # NOTE: Grab th
24f60 65 20 6c 69 73 74 20 6f 66 20 6e 61 74 69 76 65  e list of native
24f70 20 6d 6f 64 75 6c 65 73 20 66 6f 72 20 74 68 65   modules for the
24f80 20 63 75 72 72 65 6e 74 20 70 72 6f 63 65 73 73   current process
24f90 20 61 6e 64 0d 0a 20 20 20 20 20 20 20 20 23 20   and..        # 
24fa0 20 20 20 20 20 20 72 65 70 6f 72 74 20 6f 6e 20        report on 
24fb0 74 68 65 20 53 79 73 74 65 6d 2e 44 61 74 61 2e  the System.Data.
24fc0 53 51 4c 69 74 65 20 72 65 6c 61 74 65 64 20 6f  SQLite related o
24fd0 6e 65 73 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  nes...        #.
24fe0 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 68 61  .        if {[ha
24ff0 76 65 53 51 4c 69 74 65 4f 62 6a 65 63 74 43 6f  veSQLiteObjectCo
25000 6d 6d 61 6e 64 5d 7d 20 74 68 65 6e 20 7b 0d 0a  mmand]} then {..
25010 20 20 20 20 20 20 20 20 20 20 73 65 74 20 6d 6f            set mo
25020 64 75 6c 65 73 20 5b 6f 62 6a 65 63 74 20 69 6e  dules [object in
25030 76 6f 6b 65 20 5c 0d 0a 20 20 20 20 20 20 20 20  voke \..        
25040 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44 69 61        System.Dia
25050 67 6e 6f 73 74 69 63 73 2e 50 72 6f 63 65 73 73  gnostics.Process
25060 2e 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65  .GetCurrentProce
25070 73 73 20 4d 6f 64 75 6c 65 73 5d 0d 0a 0d 0a 20  ss Modules].... 
25080 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20           object 
25090 66 6f 72 65 61 63 68 20 2d 61 6c 69 61 73 20 6d  foreach -alias m
250a0 6f 64 75 6c 65 20 24 6d 6f 64 75 6c 65 73 20 7b  odule $modules {
250b0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 0d  ..            #.
250c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4e  .            # N
250d0 4f 54 45 3a 20 54 68 65 20 6d 6f 64 75 6c 65 20  OTE: The module 
250e0 66 69 6c 65 20 6e 61 6d 65 20 68 65 72 65 20 6d  file name here m
250f0 75 73 74 20 62 65 20 6e 6f 72 6d 61 6c 69 7a 65  ust be normalize
25100 64 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  d...            
25110 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  #..            s
25120 65 74 20 66 69 6c 65 4e 61 6d 65 20 5b 66 69 6c  et fileName [fil
25130 65 20 6e 6f 72 6d 61 6c 69 7a 65 20 5b 24 6d 6f  e normalize [$mo
25140 64 75 6c 65 20 46 69 6c 65 4e 61 6d 65 5d 5d 0d  dule FileName]].
25150 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74  .            set
25160 20 66 69 6c 65 4e 61 6d 65 4f 6e 6c 79 20 5b 66   fileNameOnly [f
25170 69 6c 65 20 74 61 69 6c 20 24 66 69 6c 65 4e 61  ile tail $fileNa
25180 6d 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  me]....         
25190 20 20 20 69 66 20 7b 5b 6c 73 65 61 72 63 68 20     if {[lsearch 
251a0 2d 65 78 61 63 74 20 2d 6e 6f 63 61 73 65 20 2d  -exact -nocase -
251b0 2d 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  - \..           
251c0 20 20 20 20 20 5b 67 65 74 4e 61 74 69 76 65 4c       [getNativeL
251d0 69 62 72 61 72 79 46 69 6c 65 4e 61 6d 65 73 4f  ibraryFileNamesO
251e0 6e 6c 79 5d 20 24 66 69 6c 65 4e 61 6d 65 4f 6e  nly] $fileNameOn
251f0 6c 79 5d 20 21 3d 20 2d 31 7d 20 74 68 65 6e 20  ly] != -1} then 
25200 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
25210 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
25220 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
25230 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
25240 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 66 6f          "---- fo
25250 75 6e 64 20 6c 6f 61 64 65 64 20 53 51 4c 69 74  und loaded SQLit
25260 65 20 6e 61 74 69 76 65 20 6c 69 62 72 61 72 79  e native library
25270 20 6d 6f 64 75 6c 65 3a 20 22 20 5c 0d 0a 20 20   module: " \..  
25280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25290 24 66 69 6c 65 4e 61 6d 65 20 5c 6e 5d 0d 0a 20  $fileName \n].. 
252a0 20 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73             } els
252b0 65 69 66 20 7b 5b 6c 73 65 61 72 63 68 20 2d 65  eif {[lsearch -e
252c0 78 61 63 74 20 2d 6e 6f 63 61 73 65 20 2d 2d 20  xact -nocase -- 
252d0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
252e0 20 20 20 5b 67 65 74 49 6e 74 65 72 6f 70 41 73     [getInteropAs
252f0 73 65 6d 62 6c 79 46 69 6c 65 4e 61 6d 65 73 4f  semblyFileNamesO
25300 6e 6c 79 5d 20 24 66 69 6c 65 4e 61 6d 65 4f 6e  nly] $fileNameOn
25310 6c 79 5d 20 21 3d 20 2d 31 7d 20 74 68 65 6e 20  ly] != -1} then 
25320 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
25330 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
25340 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
25350 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
25360 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 66 6f          "---- fo
25370 75 6e 64 20 6c 6f 61 64 65 64 20 53 51 4c 69 74  und loaded SQLit
25380 65 20 69 6e 74 65 72 6f 70 20 61 73 73 65 6d 62  e interop assemb
25390 6c 79 20 6d 6f 64 75 6c 65 3a 20 22 20 5c 0d 0a  ly module: " \..
253a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
253b0 20 20 24 66 69 6c 65 4e 61 6d 65 20 5c 6e 5d 0d    $fileName \n].
253c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  .            }..
253d0 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
253e0 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
253f0 20 20 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20    catch {..     
25400 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
25410 73 74 5f 63 68 61 6e 6e 65 6c 20 5c 0d 0a 20 20  st_channel \..  
25420 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
25430 2d 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f  - compile-time o
25440 70 74 69 6f 6e 73 20 66 6f 72 20 53 51 4c 69 74  ptions for SQLit
25450 65 20 63 6f 72 65 20 6c 69 62 72 61 72 79 2e 2e  e core library..
25460 2e 20 22 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  . "....         
25470 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20   if {[catch {.. 
25480 20 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63             objec
25490 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20  t invoke -flags 
254a0 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20  +NonPublic \..  
254b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 79                Sy
254c0 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
254d0 2e 53 51 4c 69 74 65 33 20 53 51 4c 69 74 65 43  .SQLite3 SQLiteC
254e0 6f 6d 70 69 6c 65 4f 70 74 69 6f 6e 73 0d 0a 20  ompileOptions.. 
254f0 20 20 20 20 20 20 20 20 20 7d 20 63 6f 6d 70 69           } compi
25500 6c 65 4f 70 74 69 6f 6e 73 5d 20 3d 3d 20 30 7d  leOptions] == 0}
25510 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
25520 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
25530 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
25540 6e 64 41 72 67 73 20 5b 66 6f 72 6d 61 74 4c 69  ndArgs [formatLi
25550 73 74 20 5b 6c 73 6f 72 74 20 5c 0d 0a 20 20 20  st [lsort \..   
25560 20 20 20 20 20 20 20 20 20 20 20 20 20 24 63 6f               $co
25570 6d 70 69 6c 65 4f 70 74 69 6f 6e 73 5d 20 3c 6e  mpileOptions] <n
25580 6f 6e 65 3e 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20  one>] \n]..     
25590 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
255a0 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
255b0 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
255c0 20 75 6e 6b 6e 6f 77 6e 5c 6e 0d 0a 20 20 20 20   unknown\n..    
255d0 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
255e0 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 63 61   }....        ca
255f0 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  tch {..         
25600 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
25610 68 61 6e 6e 65 6c 20 5c 0d 0a 20 20 20 20 20 20  hannel \..      
25620 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 6f          "---- co
25630 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f  mpile-time optio
25640 6e 73 20 66 6f 72 20 53 51 4c 69 74 65 20 69 6e  ns for SQLite in
25650 74 65 72 6f 70 20 61 73 73 65 6d 62 6c 79 2e 2e  terop assembly..
25660 2e 20 22 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  . "....         
25670 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20   if {[catch {.. 
25680 20 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63             objec
25690 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20  t invoke -flags 
256a0 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20  +NonPublic \..  
256b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 79                Sy
256c0 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
256d0 2e 53 51 4c 69 74 65 33 20 49 6e 74 65 72 6f 70  .SQLite3 Interop
256e0 43 6f 6d 70 69 6c 65 4f 70 74 69 6f 6e 73 0d 0a  CompileOptions..
256f0 20 20 20 20 20 20 20 20 20 20 7d 20 63 6f 6d 70            } comp
25700 69 6c 65 4f 70 74 69 6f 6e 73 5d 20 3d 3d 20 30  ileOptions] == 0
25710 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
25720 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
25730 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70  est_channel [app
25740 65 6e 64 41 72 67 73 20 5b 66 6f 72 6d 61 74 4c  endArgs [formatL
25750 69 73 74 20 5b 6c 73 6f 72 74 20 5c 0d 0a 20 20  ist [lsort \..  
25760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 24 63                $c
25770 6f 6d 70 69 6c 65 4f 70 74 69 6f 6e 73 5d 20 3c  ompileOptions] <
25780 6e 6f 6e 65 3e 5d 20 5c 6e 5d 0d 0a 20 20 20 20  none>] \n]..    
25790 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
257a0 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
257b0 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
257c0 6c 20 75 6e 6b 6e 6f 77 6e 5c 6e 0d 0a 20 20 20  l unknown\n..   
257d0 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
257e0 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23    }....        #
257f0 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
25800 3a 20 53 68 6f 77 20 74 68 65 20 61 63 74 69 76  : Show the activ
25810 65 20 74 65 73 74 20 63 6f 6e 73 74 72 61 69 6e  e test constrain
25820 74 73 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  ts...        #..
25830 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
25840 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61  :test_channel [a
25850 70 70 65 6e 64 41 72 67 73 20 22 2d 2d 2d 2d 20  ppendArgs "---- 
25860 63 6f 6e 73 74 72 61 69 6e 74 73 3a 20 22 20 5c  constraints: " \
25870 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 66  ..            [f
25880 6f 72 6d 61 74 4c 69 73 74 20 5b 6c 73 6f 72 74  ormatList [lsort
25890 20 5b 67 65 74 43 6f 6e 73 74 72 61 69 6e 74 73   [getConstraints
258a0 5d 5d 20 3c 6e 6f 6e 65 3e 5d 20 5c 6e 5d 0d 0a  ]] <none>] \n]..
258b0 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
258c0 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 61 76       # NOTE: Sav
258d0 65 20 74 68 65 20 74 65 73 74 20 63 6f 6e 73 74  e the test const
258e0 72 61 69 6e 74 73 20 66 6f 72 20 75 73 65 20 62  raints for use b
258f0 79 20 74 68 72 65 61 64 73 20 63 72 65 61 74 65  y threads create
25900 64 20 69 6e 20 74 68 69 73 0d 0a 20 20 20 20 20  d in this..     
25910 20 20 20 23 20 20 20 20 20 20 20 61 70 70 6c 69     #       appli
25920 63 61 74 69 6f 6e 20 64 6f 6d 61 69 6e 2e 20 20  cation domain.  
25930 54 68 69 73 20 69 73 20 6e 65 63 65 73 73 61 72  This is necessar
25940 79 20 62 65 63 61 75 73 65 20 61 6c 6c 20 74 68  y because all th
25950 65 20 45 61 67 6c 65 0d 0a 20 20 20 20 20 20 20  e Eagle..       
25960 20 23 20 20 20 20 20 20 20 22 74 65 73 74 20 63   #       "test c
25970 6f 6e 74 65 78 74 22 20 69 6e 66 6f 72 6d 61 74  ontext" informat
25980 69 6f 6e 20 69 73 20 70 65 72 2d 74 68 72 65 61  ion is per-threa
25990 64 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  d...        #.. 
259a0 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66         if {![inf
259b0 6f 20 65 78 69 73 74 73 20 3a 3a 74 65 73 74 5f  o exists ::test_
259c0 63 6f 6e 73 74 72 61 69 6e 74 73 5d 7d 20 74 68  constraints]} th
259d0 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
259e0 73 65 74 20 3a 3a 74 65 73 74 5f 63 6f 6e 73 74  set ::test_const
259f0 72 61 69 6e 74 73 20 24 3a 3a 65 61 67 6c 65 5f  raints $::eagle_
25a00 74 65 73 74 73 28 63 6f 6e 73 74 72 61 69 6e 74  tests(constraint
25a10 73 29 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d  s)..        }...
25a20 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
25a30 20 20 20 20 23 20 4e 4f 54 45 3a 20 4c 6f 61 64      # NOTE: Load
25a40 20 74 68 65 20 22 61 66 74 65 72 2d 63 6f 6e 73   the "after-cons
25a50 74 72 61 69 6e 74 73 22 20 63 75 73 74 6f 6d 20  traints" custom 
25a60 70 65 72 2d 75 73 65 72 20 61 6e 64 2f 6f 72 20  per-user and/or 
25a70 70 65 72 2d 68 6f 73 74 0d 0a 20 20 20 20 20 20  per-host..      
25a80 20 20 23 20 20 20 20 20 20 20 74 65 73 74 20 73    #       test s
25a90 65 74 74 69 6e 67 73 20 6e 6f 77 2e 0d 0a 20 20  ettings now...  
25aa0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
25ab0 20 75 70 6c 65 76 65 6c 20 31 20 5b 6c 69 73 74   uplevel 1 [list
25ac0 20 6c 6f 61 64 53 51 4c 69 74 65 54 65 73 74 53   loadSQLiteTestS
25ad0 65 74 74 69 6e 67 73 20 24 3a 3a 74 65 73 74 5f  ettings $::test_
25ae0 63 68 61 6e 6e 65 6c 20 2e 61 66 74 65 72 5d 0d  channel .after].
25af0 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
25b00 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 66        # NOTE: If
25b10 20 6e 65 63 65 73 73 61 72 79 2c 20 65 6e 61 62   necessary, enab
25b20 6c 65 20 73 68 61 72 65 64 2d 63 61 63 68 65 20  le shared-cache 
25b30 6d 6f 64 65 20 6e 6f 77 2e 0d 0a 20 20 20 20 20  mode now...     
25b40 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 69 66     #..        if
25b50 20 7b 5b 68 61 73 52 75 6e 74 69 6d 65 4f 70 74   {[hasRuntimeOpt
25b60 69 6f 6e 20 73 68 61 72 65 64 43 61 63 68 65 5d  ion sharedCache]
25b70 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
25b80 20 20 20 20 65 6e 61 62 6c 65 53 68 61 72 65 64      enableShared
25b90 43 61 63 68 65 20 24 3a 3a 74 65 73 74 5f 63 68  Cache $::test_ch
25ba0 61 6e 6e 65 6c 20 74 72 75 65 0d 0a 20 20 20 20  annel true..    
25bb0 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
25bc0 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
25bd0 54 45 3a 20 53 68 6f 77 20 77 68 65 6e 20 6f 75  TE: Show when ou
25be0 72 20 74 65 73 74 73 20 61 63 74 75 61 6c 6c 79  r tests actually
25bf0 20 62 65 67 61 6e 20 28 6e 6f 77 29 2e 0d 0a 20   began (now)... 
25c00 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
25c10 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
25c20 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
25c30 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
25c40 20 20 20 22 2d 2d 2d 2d 20 53 79 73 74 65 6d 2e     "---- System.
25c50 44 61 74 61 2e 53 51 4c 69 74 65 20 74 65 73 74  Data.SQLite test
25c60 73 20 62 65 67 61 6e 20 61 74 20 22 20 5c 0d 0a  s began at " \..
25c70 20 20 20 20 20 20 20 20 20 20 20 20 5b 63 6c 6f              [clo
25c80 63 6b 20 66 6f 72 6d 61 74 20 5b 63 6c 6f 63 6b  ck format [clock
25c90 20 73 65 63 6f 6e 64 73 5d 5d 20 5c 6e 5d 0d 0a   seconds]] \n]..
25ca0 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a        }..    }..
25cb0 0c 0d 0a 20 20 20 20 70 72 6f 63 20 72 75 6e 53  ...    proc runS
25cc0 51 4c 69 74 65 54 65 73 74 46 69 6c 65 73 50 72  QLiteTestFilesPr
25cd0 6f 6c 6f 67 75 65 20 7b 7d 20 7b 0d 0a 20 20 20  ologue {} {..   
25ce0 20 20 20 75 70 6c 65 76 65 6c 20 31 20 7b 0d 0a     uplevel 1 {..
25cf0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
25d00 20 20 20 23 20 4e 4f 54 45 3a 20 53 65 74 75 70     # NOTE: Setup
25d10 20 74 68 65 20 76 61 72 69 61 62 6c 65 73 20 74   the variables t
25d20 68 61 74 20 72 65 66 65 72 20 74 6f 20 74 68 65  hat refer to the
25d30 20 76 61 72 69 6f 75 73 20 6e 6f 6e 2d 64 61 74   various non-dat
25d40 61 20 66 69 6c 65 73 0d 0a 20 20 20 20 20 20 20  a files..       
25d50 20 23 20 20 20 20 20 20 20 72 65 71 75 69 72 65   #       require
25d60 64 20 62 79 20 74 68 65 20 74 65 73 74 73 20 69  d by the tests i
25d70 6e 20 74 68 69 73 20 66 69 6c 65 2e 0d 0a 20 20  n this file...  
25d80 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
25d90 20 73 65 74 20 65 6e 74 69 74 79 46 72 61 6d 65   set entityFrame
25da0 77 6f 72 6b 44 6c 6c 46 69 6c 65 20 5c 0d 0a 20  workDllFile \.. 
25db0 20 20 20 20 20 20 20 20 20 20 20 5b 67 65 74 42             [getB
25dc0 75 69 6c 64 46 69 6c 65 4e 61 6d 65 20 45 6e 74  uildFileName Ent
25dd0 69 74 79 46 72 61 6d 65 77 6f 72 6b 2e 64 6c 6c  ityFramework.dll
25de0 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 73 65 74  ]....        set
25df0 20 69 6e 73 74 61 6c 6c 65 72 45 78 65 46 69 6c   installerExeFil
25e00 65 20 5b 67 65 74 42 75 69 6c 64 46 69 6c 65 4e  e [getBuildFileN
25e10 61 6d 65 20 49 6e 73 74 61 6c 6c 65 72 2e 65 78  ame Installer.ex
25e20 65 5d 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20  e]..        set 
25e30 73 71 6c 69 74 65 44 65 73 69 67 6e 65 72 44 6c  sqliteDesignerDl
25e40 6c 46 69 6c 65 20 5b 67 65 74 42 75 69 6c 64 46  lFile [getBuildF
25e50 69 6c 65 4e 61 6d 65 20 53 51 4c 69 74 65 2e 44  ileName SQLite.D
25e60 65 73 69 67 6e 65 72 2e 64 6c 6c 5d 0d 0a 0d 0a  esigner.dll]....
25e70 20 20 20 20 20 20 20 20 73 65 74 20 73 79 73 74          set syst
25e80 65 6d 44 61 74 61 53 51 4c 69 74 65 44 6c 6c 46  emDataSQLiteDllF
25e90 69 6c 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ile \..         
25ea0 20 20 20 5b 67 65 74 42 75 69 6c 64 46 69 6c 65     [getBuildFile
25eb0 4e 61 6d 65 20 53 79 73 74 65 6d 2e 44 61 74 61  Name System.Data
25ec0 2e 53 51 4c 69 74 65 2e 64 6c 6c 5d 0d 0a 0d 0a  .SQLite.dll]....
25ed0 20 20 20 20 20 20 20 20 73 65 74 20 73 79 73 74          set syst
25ee0 65 6d 44 61 74 61 53 51 4c 69 74 65 4c 69 6e 71  emDataSQLiteLinq
25ef0 44 6c 6c 46 69 6c 65 20 5c 0d 0a 20 20 20 20 20  DllFile \..     
25f00 20 20 20 20 20 20 20 5b 67 65 74 42 75 69 6c 64         [getBuild
25f10 46 69 6c 65 4e 61 6d 65 20 53 79 73 74 65 6d 2e  FileName System.
25f20 44 61 74 61 2e 53 51 4c 69 74 65 2e 4c 69 6e 71  Data.SQLite.Linq
25f30 2e 64 6c 6c 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  .dll]....       
25f40 20 73 65 74 20 73 79 73 74 65 6d 44 61 74 61 53   set systemDataS
25f50 51 4c 69 74 65 45 66 36 44 6c 6c 46 69 6c 65 20  QLiteEf6DllFile 
25f60 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b  \..            [
25f70 67 65 74 42 75 69 6c 64 46 69 6c 65 4e 61 6d 65  getBuildFileName
25f80 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c   System.Data.SQL
25f90 69 74 65 2e 45 46 36 2e 64 6c 6c 5d 0d 0a 0d 0a  ite.EF6.dll]....
25fa0 20 20 20 20 20 20 20 20 73 65 74 20 74 65 73 74          set test
25fb0 45 78 65 46 69 6c 65 20 5b 67 65 74 42 75 69 6c  ExeFile [getBuil
25fc0 64 46 69 6c 65 4e 61 6d 65 20 74 65 73 74 2e 65  dFileName test.e
25fd0 78 65 5d 0d 0a 20 20 20 20 20 20 20 20 73 65 74  xe]..        set
25fe0 20 74 65 73 74 4c 69 6e 71 45 78 65 46 69 6c 65   testLinqExeFile
25ff0 20 5b 67 65 74 42 75 69 6c 64 46 69 6c 65 4e 61   [getBuildFileNa
26000 6d 65 20 74 65 73 74 6c 69 6e 71 2e 65 78 65 5d  me testlinq.exe]
26010 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 74 65  ..        set te
26020 73 74 45 66 36 45 78 65 46 69 6c 65 20 5b 67 65  stEf6ExeFile [ge
26030 74 42 75 69 6c 64 46 69 6c 65 4e 61 6d 65 20 74  tBuildFileName t
26040 65 73 74 65 66 36 2e 65 78 65 5d 0d 0a 0d 0a 20  estef6.exe].... 
26050 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
26060 20 20 23 20 4e 4f 54 45 3a 20 53 65 74 75 70 20    # NOTE: Setup 
26070 74 68 65 20 76 61 72 69 61 62 6c 65 73 20 74 68  the variables th
26080 61 74 20 72 65 66 65 72 20 74 6f 20 74 68 65 20  at refer to the 
26090 76 61 72 69 6f 75 73 20 64 61 74 61 20 66 69 6c  various data fil
260a0 65 73 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  es..        #   
260b0 20 20 20 20 72 65 71 75 69 72 65 64 20 62 79 20      required by 
260c0 74 68 65 20 74 65 73 74 73 20 69 6e 20 74 68 69  the tests in thi
260d0 73 20 66 69 6c 65 2e 0d 0a 20 20 20 20 20 20 20  s file...       
260e0 20 23 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20   #..        set 
260f0 74 65 73 74 4c 69 6e 71 4f 75 74 46 69 6c 65 20  testLinqOutFile 
26100 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65  [file nativename
26110 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5c 0d 0a 20   [file join \.. 
26120 20 20 20 20 20 20 20 20 20 20 20 5b 67 65 74 53             [getS
26130 51 4c 69 74 65 54 65 73 74 44 61 74 61 50 61 74  QLiteTestDataPat
26140 68 5d 20 74 65 73 74 6c 69 6e 71 2e 6f 75 74 5d  h] testlinq.out]
26150 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 73 65 74  ]....        set
26160 20 6e 6f 72 74 68 77 69 6e 64 45 66 44 62 46 69   northwindEfDbFi
26170 6c 65 20 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e  le [file nativen
26180 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5c  ame [file join \
26190 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 66  ..            [f
261a0 69 6c 65 20 64 69 72 6e 61 6d 65 20 5b 66 69 6c  ile dirname [fil
261b0 65 20 64 69 72 6e 61 6d 65 20 5b 67 65 74 53 51  e dirname [getSQ
261c0 4c 69 74 65 54 65 73 74 44 61 74 61 50 61 74 68  LiteTestDataPath
261d0 5d 5d 5d 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ]]] \..         
261e0 20 20 20 74 65 73 74 6c 69 6e 71 20 6e 6f 72 74     testlinq nort
261f0 68 77 69 6e 64 45 46 2e 64 62 5d 5d 0d 0a 0d 0a  hwindEF.db]]....
26200 20 20 20 20 20 20 20 20 73 65 74 20 6e 6f 6e 57          set nonW
26210 61 6c 44 62 46 69 6c 65 20 5b 66 69 6c 65 20 6e  alDbFile [file n
26220 61 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c 65 20  ativename [file 
26230 6a 6f 69 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20  join \..        
26240 20 20 20 20 5b 67 65 74 53 51 4c 69 74 65 54 65      [getSQLiteTe
26250 73 74 44 61 74 61 50 61 74 68 5d 20 6e 6f 6e 57  stDataPath] nonW
26260 61 6c 2e 64 62 5d 5d 0d 0a 0d 0a 20 20 20 20 20  al.db]]....     
26270 20 20 20 73 65 74 20 77 61 6c 44 62 46 69 6c 65     set walDbFile
26280 20 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d   [file nativenam
26290 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5c 0d 0a  e [file join \..
262a0 20 20 20 20 20 20 20 20 20 20 20 20 5b 67 65 74              [get
262b0 53 51 4c 69 74 65 54 65 73 74 44 61 74 61 50 61  SQLiteTestDataPa
262c0 74 68 5d 20 77 61 6c 2e 64 62 5d 5d 0d 0a 0d 0a  th] wal.db]]....
262d0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
262e0 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 65 20 76     # NOTE: The v
262f0 61 72 69 6f 75 73 20 69 6e 73 74 61 6c 6c 2f 75  arious install/u
26300 6e 69 6e 73 74 61 6c 6c 20 6c 6f 67 20 66 69 6c  ninstall log fil
26310 65 73 20 75 73 65 64 20 74 6f 20 74 65 73 74 20  es used to test 
26320 74 68 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20  the..        #  
26330 20 20 20 20 20 64 65 73 69 67 6e 2d 74 69 6d 65       design-time
26340 20 63 6f 6d 70 6f 6e 65 6e 74 20 69 6e 73 74 61   component insta
26350 6c 6c 65 72 2e 0d 0a 20 20 20 20 20 20 20 20 23  ller...        #
26360 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 74 65  ..        set te
26370 73 74 49 6e 73 74 61 6c 6c 56 73 32 30 30 35 4c  stInstallVs2005L
26380 6f 67 46 69 6c 65 20 5b 66 69 6c 65 20 6e 61 74  ogFile [file nat
26390 69 76 65 6e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f  ivename [file jo
263a0 69 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  in \..          
263b0 20 20 5b 67 65 74 53 51 4c 69 74 65 54 65 73 74    [getSQLiteTest
263c0 44 61 74 61 50 61 74 68 5d 20 49 6e 73 74 61 6c  DataPath] Instal
263d0 6c 65 72 5f 54 65 73 74 5f 56 73 32 30 30 35 2e  ler_Test_Vs2005.
263e0 6c 6f 67 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  log]]....       
263f0 20 73 65 74 20 74 65 73 74 49 6e 73 74 61 6c 6c   set testInstall
26400 56 73 32 30 30 38 4c 6f 67 46 69 6c 65 20 5b 66  Vs2008LogFile [f
26410 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65 20 5b  ile nativename [
26420 66 69 6c 65 20 6a 6f 69 6e 20 5c 0d 0a 20 20 20  file join \..   
26430 20 20 20 20 20 20 20 20 20 5b 67 65 74 53 51 4c           [getSQL
26440 69 74 65 54 65 73 74 44 61 74 61 50 61 74 68 5d  iteTestDataPath]
26450 20 49 6e 73 74 61 6c 6c 65 72 5f 54 65 73 74 5f   Installer_Test_
26460 56 73 32 30 30 38 2e 6c 6f 67 5d 5d 0d 0a 0d 0a  Vs2008.log]]....
26470 20 20 20 20 20 20 20 20 73 65 74 20 74 65 73 74          set test
26480 49 6e 73 74 61 6c 6c 56 73 32 30 31 30 4c 6f 67  InstallVs2010Log
26490 46 69 6c 65 20 5b 66 69 6c 65 20 6e 61 74 69 76  File [file nativ
264a0 65 6e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e  ename [file join
264b0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
264c0 5b 67 65 74 53 51 4c 69 74 65 54 65 73 74 44 61  [getSQLiteTestDa
264d0 74 61 50 61 74 68 5d 20 49 6e 73 74 61 6c 6c 65  taPath] Installe
264e0 72 5f 54 65 73 74 5f 56 73 32 30 31 30 2e 6c 6f  r_Test_Vs2010.lo
264f0 67 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 73  g]]....        s
26500 65 74 20 74 65 73 74 49 6e 73 74 61 6c 6c 56 73  et testInstallVs
26510 32 30 31 32 4c 6f 67 46 69 6c 65 20 5b 66 69 6c  2012LogFile [fil
26520 65 20 6e 61 74 69 76 65 6e 61 6d 65 20 5b 66 69  e nativename [fi
26530 6c 65 20 6a 6f 69 6e 20 5c 0d 0a 20 20 20 20 20  le join \..     
26540 20 20 20 20 20 20 20 5b 67 65 74 53 51 4c 69 74         [getSQLit
26550 65 54 65 73 74 44 61 74 61 50 61 74 68 5d 20 49  eTestDataPath] I
26560 6e 73 74 61 6c 6c 65 72 5f 54 65 73 74 5f 56 73  nstaller_Test_Vs
26570 32 30 31 32 2e 6c 6f 67 5d 5d 0d 0a 0d 0a 20 20  2012.log]]....  
26580 20 20 20 20 20 20 73 65 74 20 74 65 73 74 49 6e        set testIn
26590 73 74 61 6c 6c 56 73 32 30 31 33 4c 6f 67 46 69  stallVs2013LogFi
265a0 6c 65 20 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e  le [file nativen
265b0 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5c  ame [file join \
265c0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 67  ..            [g
265d0 65 74 53 51 4c 69 74 65 54 65 73 74 44 61 74 61  etSQLiteTestData
265e0 50 61 74 68 5d 20 49 6e 73 74 61 6c 6c 65 72 5f  Path] Installer_
265f0 54 65 73 74 5f 56 73 32 30 31 33 2e 6c 6f 67 5d  Test_Vs2013.log]
26600 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 73 65 74  ]....        set
26610 20 74 65 73 74 49 6e 73 74 61 6c 6c 56 73 32 30   testInstallVs20
26620 31 35 4c 6f 67 46 69 6c 65 20 5b 66 69 6c 65 20  15LogFile [file 
26630 6e 61 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c 65  nativename [file
26640 20 6a 6f 69 6e 20 5c 0d 0a 20 20 20 20 20 20 20   join \..       
26650 20 20 20 20 20 5b 67 65 74 53 51 4c 69 74 65 54       [getSQLiteT
26660 65 73 74 44 61 74 61 50 61 74 68 5d 20 49 6e 73  estDataPath] Ins
26670 74 61 6c 6c 65 72 5f 54 65 73 74 5f 56 73 32 30  taller_Test_Vs20
26680 31 35 2e 6c 6f 67 5d 5d 0d 0a 0d 0a 20 20 20 20  15.log]]....    
26690 20 20 20 20 73 65 74 20 74 65 73 74 55 6e 69 6e      set testUnin
266a0 73 74 61 6c 6c 56 73 32 30 30 35 4c 6f 67 46 69  stallVs2005LogFi
266b0 6c 65 20 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e  le [file nativen
266c0 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5c  ame [file join \
266d0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 67  ..            [g
266e0 65 74 53 51 4c 69 74 65 54 65 73 74 44 61 74 61  etSQLiteTestData
266f0 50 61 74 68 5d 20 55 6e 69 6e 73 74 61 6c 6c 65  Path] Uninstalle
26700 72 5f 54 65 73 74 5f 56 73 32 30 30 35 2e 6c 6f  r_Test_Vs2005.lo
26710 67 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 73  g]]....        s
26720 65 74 20 74 65 73 74 55 6e 69 6e 73 74 61 6c 6c  et testUninstall
26730 56 73 32 30 30 38 4c 6f 67 46 69 6c 65 20 5b 66  Vs2008LogFile [f
26740 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65 20 5b  ile nativename [
26750 66 69 6c 65 20 6a 6f 69 6e 20 5c 0d 0a 20 20 20  file join \..   
26760 20 20 20 20 20 20 20 20 20 5b 67 65 74 53 51 4c           [getSQL
26770 69 74 65 54 65 73 74 44 61 74 61 50 61 74 68 5d  iteTestDataPath]
26780 20 55 6e 69 6e 73 74 61 6c 6c 65 72 5f 54 65 73   Uninstaller_Tes
26790 74 5f 56 73 32 30 30 38 2e 6c 6f 67 5d 5d 0d 0a  t_Vs2008.log]]..
267a0 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 74 65  ..        set te
267b0 73 74 55 6e 69 6e 73 74 61 6c 6c 56 73 32 30 31  stUninstallVs201
267c0 30 4c 6f 67 46 69 6c 65 20 5b 66 69 6c 65 20 6e  0LogFile [file n
267d0 61 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c 65 20  ativename [file 
267e0 6a 6f 69 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20  join \..        
267f0 20 20 20 20 5b 67 65 74 53 51 4c 69 74 65 54 65      [getSQLiteTe
26800 73 74 44 61 74 61 50 61 74 68 5d 20 55 6e 69 6e  stDataPath] Unin
26810 73 74 61 6c 6c 65 72 5f 54 65 73 74 5f 56 73 32  staller_Test_Vs2
26820 30 31 30 2e 6c 6f 67 5d 5d 0d 0a 0d 0a 20 20 20  010.log]]....   
26830 20 20 20 20 20 73 65 74 20 74 65 73 74 55 6e 69       set testUni
26840 6e 73 74 61 6c 6c 56 73 32 30 31 32 4c 6f 67 46  nstallVs2012LogF
26850 69 6c 65 20 5b 66 69 6c 65 20 6e 61 74 69 76 65  ile [file native
26860 6e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20  name [file join 
26870 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b  \..            [
26880 67 65 74 53 51 4c 69 74 65 54 65 73 74 44 61 74  getSQLiteTestDat
26890 61 50 61 74 68 5d 20 55 6e 69 6e 73 74 61 6c 6c  aPath] Uninstall
268a0 65 72 5f 54 65 73 74 5f 56 73 32 30 31 32 2e 6c  er_Test_Vs2012.l
268b0 6f 67 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  og]]....        
268c0 73 65 74 20 74 65 73 74 55 6e 69 6e 73 74 61 6c  set testUninstal
268d0 6c 56 73 32 30 31 33 4c 6f 67 46 69 6c 65 20 5b  lVs2013LogFile [
268e0 66 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65 20  file nativename 
268f0 5b 66 69 6c 65 20 6a 6f 69 6e 20 5c 0d 0a 20 20  [file join \..  
26900 20 20 20 20 20 20 20 20 20 20 5b 67 65 74 53 51            [getSQ
26910 4c 69 74 65 54 65 73 74 44 61 74 61 50 61 74 68  LiteTestDataPath
26920 5d 20 55 6e 69 6e 73 74 61 6c 6c 65 72 5f 54 65  ] Uninstaller_Te
26930 73 74 5f 56 73 32 30 31 33 2e 6c 6f 67 5d 5d 0d  st_Vs2013.log]].
26940 0a 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 74  ...        set t
26950 65 73 74 55 6e 69 6e 73 74 61 6c 6c 56 73 32 30  estUninstallVs20
26960 31 35 4c 6f 67 46 69 6c 65 20 5b 66 69 6c 65 20  15LogFile [file 
26970 6e 61 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c 65  nativename [file
26980 20 6a 6f 69 6e 20 5c 0d 0a 20 20 20 20 20 20 20   join \..       
26990 20 20 20 20 20 5b 67 65 74 53 51 4c 69 74 65 54       [getSQLiteT
269a0 65 73 74 44 61 74 61 50 61 74 68 5d 20 55 6e 69  estDataPath] Uni
269b0 6e 73 74 61 6c 6c 65 72 5f 54 65 73 74 5f 56 73  nstaller_Test_Vs
269c0 32 30 31 35 2e 6c 6f 67 5d 5d 0d 0a 0d 0a 20 20  2015.log]]....  
269d0 20 20 20 20 20 20 23 23 23 23 23 23 23 23 23 23        ##########
269e0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
269f0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
26a00 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
26a10 23 23 23 23 23 23 23 23 23 23 23 23 23 0d 0a 0d  #############...
26a20 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 68  .        if {![h
26a30 61 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61  aveConstraint [a
26a40 70 70 65 6e 64 41 72 67 73 20 66 69 6c 65 5f 20  ppendArgs file_ 
26a50 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b  \..            [
26a60 66 69 6c 65 20 74 61 69 6c 20 24 65 6e 74 69 74  file tail $entit
26a70 79 46 72 61 6d 65 77 6f 72 6b 44 6c 6c 46 69 6c  yFrameworkDllFil
26a80 65 5d 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  e]]]} then {..  
26a90 20 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72          checkFor
26aa0 46 69 6c 65 20 24 74 65 73 74 5f 63 68 61 6e 6e  File $test_chann
26ab0 65 6c 20 24 65 6e 74 69 74 79 46 72 61 6d 65 77  el $entityFramew
26ac0 6f 72 6b 44 6c 6c 46 69 6c 65 0d 0a 20 20 20 20  orkDllFile..    
26ad0 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
26ae0 20 69 66 20 7b 21 5b 68 61 76 65 43 6f 6e 73 74   if {![haveConst
26af0 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67  raint [appendArg
26b00 73 20 66 69 6c 65 5f 20 5c 0d 0a 20 20 20 20 20  s file_ \..     
26b10 20 20 20 20 20 20 20 5b 66 69 6c 65 20 74 61 69         [file tai
26b20 6c 20 24 69 6e 73 74 61 6c 6c 65 72 45 78 65 46  l $installerExeF
26b30 69 6c 65 5d 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a  ile]]]} then {..
26b40 20 20 20 20 20 20 20 20 20 20 63 68 65 63 6b 46            checkF
26b50 6f 72 46 69 6c 65 20 24 74 65 73 74 5f 63 68 61  orFile $test_cha
26b60 6e 6e 65 6c 20 24 69 6e 73 74 61 6c 6c 65 72 45  nnel $installerE
26b70 78 65 46 69 6c 65 20 49 6e 73 74 61 6c 6c 65 72  xeFile Installer
26b80 2e 65 78 65 0d 0a 20 20 20 20 20 20 20 20 7d 0d  .exe..        }.
26b90 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21  ...        if {!
26ba0 5b 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74 20  [haveConstraint 
26bb0 5b 61 70 70 65 6e 64 41 72 67 73 20 66 69 6c 65  [appendArgs file
26bc0 5f 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  _ \..           
26bd0 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 73 71 6c   [file tail $sql
26be0 69 74 65 44 65 73 69 67 6e 65 72 44 6c 6c 46 69  iteDesignerDllFi
26bf0 6c 65 5d 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  le]]]} then {.. 
26c00 20 20 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f           checkFo
26c10 72 46 69 6c 65 20 24 74 65 73 74 5f 63 68 61 6e  rFile $test_chan
26c20 6e 65 6c 20 24 73 71 6c 69 74 65 44 65 73 69 67  nel $sqliteDesig
26c30 6e 65 72 44 6c 6c 46 69 6c 65 0d 0a 20 20 20 20  nerDllFile..    
26c40 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
26c50 20 69 66 20 7b 21 5b 68 61 76 65 43 6f 6e 73 74   if {![haveConst
26c60 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67  raint [appendArg
26c70 73 20 66 69 6c 65 5f 20 5c 0d 0a 20 20 20 20 20  s file_ \..     
26c80 20 20 20 20 20 20 20 5b 66 69 6c 65 20 74 61 69         [file tai
26c90 6c 20 24 73 79 73 74 65 6d 44 61 74 61 53 51 4c  l $systemDataSQL
26ca0 69 74 65 44 6c 6c 46 69 6c 65 5d 5d 5d 7d 20 74  iteDllFile]]]} t
26cb0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
26cc0 20 63 68 65 63 6b 46 6f 72 46 69 6c 65 20 24 74   checkForFile $t
26cd0 65 73 74 5f 63 68 61 6e 6e 65 6c 20 24 73 79 73  est_channel $sys
26ce0 74 65 6d 44 61 74 61 53 51 4c 69 74 65 44 6c 6c  temDataSQLiteDll
26cf0 46 69 6c 65 0d 0a 20 20 20 20 20 20 20 20 7d 0d  File..        }.
26d00 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21  ...        if {!
26d10 5b 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74 20  [haveConstraint 
26d20 5b 61 70 70 65 6e 64 41 72 67 73 20 66 69 6c 65  [appendArgs file
26d30 5f 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  _ \..           
26d40 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 73 79 73   [file tail $sys
26d50 74 65 6d 44 61 74 61 53 51 4c 69 74 65 4c 69 6e  temDataSQLiteLin
26d60 71 44 6c 6c 46 69 6c 65 5d 5d 5d 7d 20 74 68 65  qDllFile]]]} the
26d70 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 63  n {..          c
26d80 68 65 63 6b 46 6f 72 46 69 6c 65 20 24 74 65 73  heckForFile $tes
26d90 74 5f 63 68 61 6e 6e 65 6c 20 24 73 79 73 74 65  t_channel $syste
26da0 6d 44 61 74 61 53 51 4c 69 74 65 4c 69 6e 71 44  mDataSQLiteLinqD
26db0 6c 6c 46 69 6c 65 0d 0a 20 20 20 20 20 20 20 20  llFile..        
26dc0 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20  }....        if 
26dd0 7b 21 5b 68 61 76 65 43 6f 6e 73 74 72 61 69 6e  {![haveConstrain
26de0 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20 66 69  t [appendArgs fi
26df0 6c 65 5f 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  le_ \..         
26e00 20 20 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 73     [file tail $s
26e10 79 73 74 65 6d 44 61 74 61 53 51 4c 69 74 65 45  ystemDataSQLiteE
26e20 66 36 44 6c 6c 46 69 6c 65 5d 5d 5d 7d 20 74 68  f6DllFile]]]} th
26e30 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
26e40 63 68 65 63 6b 46 6f 72 46 69 6c 65 20 24 74 65  checkForFile $te
26e50 73 74 5f 63 68 61 6e 6e 65 6c 20 24 73 79 73 74  st_channel $syst
26e60 65 6d 44 61 74 61 53 51 4c 69 74 65 45 66 36 44  emDataSQLiteEf6D
26e70 6c 6c 46 69 6c 65 0d 0a 20 20 20 20 20 20 20 20  llFile..        
26e80 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20  }....        if 
26e90 7b 21 5b 68 61 76 65 43 6f 6e 73 74 72 61 69 6e  {![haveConstrain
26ea0 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20 66 69  t [appendArgs fi
26eb0 6c 65 5f 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  le_ \..         
26ec0 20 20 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 74     [file tail $t
26ed0 65 73 74 45 78 65 46 69 6c 65 5d 5d 5d 7d 20 74  estExeFile]]]} t
26ee0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
26ef0 20 63 68 65 63 6b 46 6f 72 46 69 6c 65 20 24 74   checkForFile $t
26f00 65 73 74 5f 63 68 61 6e 6e 65 6c 20 24 74 65 73  est_channel $tes
26f10 74 45 78 65 46 69 6c 65 20 74 65 73 74 2e 65 78  tExeFile test.ex
26f20 65 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  e..        }....
26f30 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 68 61          if {![ha
26f40 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70  veConstraint [ap
26f50 70 65 6e 64 41 72 67 73 20 66 69 6c 65 5f 20 5c  pendArgs file_ \
26f60 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 66  ..            [f
26f70 69 6c 65 20 74 61 69 6c 20 24 74 65 73 74 4c 69  ile tail $testLi
26f80 6e 71 45 78 65 46 69 6c 65 5d 5d 5d 7d 20 74 68  nqExeFile]]]} th
26f90 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
26fa0 63 68 65 63 6b 46 6f 72 46 69 6c 65 20 24 74 65  checkForFile $te
26fb0 73 74 5f 63 68 61 6e 6e 65 6c 20 24 74 65 73 74  st_channel $test
26fc0 4c 69 6e 71 45 78 65 46 69 6c 65 20 74 65 73 74  LinqExeFile test
26fd0 6c 69 6e 71 2e 65 78 65 0d 0a 20 20 20 20 20 20  linq.exe..      
26fe0 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69    }....        i
26ff0 66 20 7b 21 5b 68 61 76 65 43 6f 6e 73 74 72 61  f {![haveConstra
27000 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20  int [appendArgs 
27010 66 69 6c 65 5f 20 5c 0d 0a 20 20 20 20 20 20 20  file_ \..       
27020 20 20 20 20 20 5b 66 69 6c 65 20 74 61 69 6c 20       [file tail 
27030 24 74 65 73 74 45 66 36 45 78 65 46 69 6c 65 5d  $testEf6ExeFile]
27040 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  ]]} then {..    
27050 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72 46 69        checkForFi
27060 6c 65 20 24 74 65 73 74 5f 63 68 61 6e 6e 65 6c  le $test_channel
27070 20 24 74 65 73 74 45 66 36 45 78 65 46 69 6c 65   $testEf6ExeFile
27080 20 74 65 73 74 65 66 36 2e 65 78 65 0d 0a 20 20   testef6.exe..  
27090 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
270a0 20 20 20 69 66 20 7b 21 5b 68 61 76 65 43 6f 6e     if {![haveCon
270b0 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41  straint [appendA
270c0 72 67 73 20 66 69 6c 65 5f 20 5c 0d 0a 20 20 20  rgs file_ \..   
270d0 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20 74           [file t
270e0 61 69 6c 20 24 74 65 73 74 4c 69 6e 71 4f 75 74  ail $testLinqOut
270f0 46 69 6c 65 5d 5d 5d 7d 20 74 68 65 6e 20 7b 0d  File]]]} then {.
27100 0a 20 20 20 20 20 20 20 20 20 20 63 68 65 63 6b  .          check
27110 46 6f 72 46 69 6c 65 20 24 74 65 73 74 5f 63 68  ForFile $test_ch
27120 61 6e 6e 65 6c 20 24 74 65 73 74 4c 69 6e 71 4f  annel $testLinqO
27130 75 74 46 69 6c 65 0d 0a 20 20 20 20 20 20 20 20  utFile..        
27140 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20  }....        if 
27150 7b 21 5b 68 61 76 65 43 6f 6e 73 74 72 61 69 6e  {![haveConstrain
27160 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20 66 69  t [appendArgs fi
27170 6c 65 5f 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  le_ \..         
27180 20 20 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 6e     [file tail $n
27190 6f 72 74 68 77 69 6e 64 45 66 44 62 46 69 6c 65  orthwindEfDbFile
271a0 5d 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  ]]]} then {..   
271b0 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72 46         checkForF
271c0 69 6c 65 20 24 74 65 73 74 5f 63 68 61 6e 6e 65  ile $test_channe
271d0 6c 20 24 6e 6f 72 74 68 77 69 6e 64 45 66 44 62  l $northwindEfDb
271e0 46 69 6c 65 0d 0a 20 20 20 20 20 20 20 20 7d 0d  File..        }.
271f0 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21  ...        if {!
27200 5b 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74 20  [haveConstraint 
27210 5b 61 70 70 65 6e 64 41 72 67 73 20 66 69 6c 65  [appendArgs file
27220 5f 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  _ \..           
27230 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 6e 6f 6e   [file tail $non
27240 57 61 6c 44 62 46 69 6c 65 5d 5d 5d 7d 20 74 68  WalDbFile]]]} th
27250 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
27260 63 68 65 63 6b 46 6f 72 46 69 6c 65 20 24 74 65  checkForFile $te
27270 73 74 5f 63 68 61 6e 6e 65 6c 20 24 6e 6f 6e 57  st_channel $nonW
27280 61 6c 44 62 46 69 6c 65 0d 0a 20 20 20 20 20 20  alDbFile..      
27290 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69    }....        i
272a0 66 20 7b 21 5b 68 61 76 65 43 6f 6e 73 74 72 61  f {![haveConstra
272b0 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20  int [appendArgs 
272c0 66 69 6c 65 5f 20 5c 0d 0a 20 20 20 20 20 20 20  file_ \..       
272d0 20 20 20 20 20 5b 66 69 6c 65 20 74 61 69 6c 20       [file tail 
272e0 24 77 61 6c 44 62 46 69 6c 65 5d 5d 5d 7d 20 74  $walDbFile]]]} t
272f0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
27300 20 63 68 65 63 6b 46 6f 72 46 69 6c 65 20 24 74   checkForFile $t
27310 65 73 74 5f 63 68 61 6e 6e 65 6c 20 24 77 61 6c  est_channel $wal
27320 44 62 46 69 6c 65 0d 0a 20 20 20 20 20 20 20 20  DbFile..        
27330 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20  }....        if 
27340 7b 21 5b 68 61 76 65 43 6f 6e 73 74 72 61 69 6e  {![haveConstrain
27350 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20 66 69  t [appendArgs fi
27360 6c 65 5f 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  le_ \..         
27370 20 20 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 74     [file tail $t
27380 65 73 74 49 6e 73 74 61 6c 6c 56 73 32 30 30 35  estInstallVs2005
27390 4c 6f 67 46 69 6c 65 5d 5d 5d 7d 20 74 68 65 6e  LogFile]]]} then
273a0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 63 68   {..          ch
273b0 65 63 6b 46 6f 72 46 69 6c 65 20 24 74 65 73 74  eckForFile $test
273c0 5f 63 68 61 6e 6e 65 6c 20 24 74 65 73 74 49 6e  _channel $testIn
273d0 73 74 61 6c 6c 56 73 32 30 30 35 4c 6f 67 46 69  stallVs2005LogFi
273e0 6c 65 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d  le..        }...
273f0 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 68  .        if {![h
27400 61 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61  aveConstraint [a
27410 70 70 65 6e 64 41 72 67 73 20 66 69 6c 65 5f 20  ppendArgs file_ 
27420 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b  \..            [
27430 66 69 6c 65 20 74 61 69 6c 20 24 74 65 73 74 49  file tail $testI
27440 6e 73 74 61 6c 6c 56 73 32 30 30 38 4c 6f 67 46  nstallVs2008LogF
27450 69 6c 65 5d 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a  ile]]]} then {..
27460 20 20 20 20 20 20 20 20 20 20 63 68 65 63 6b 46            checkF
27470 6f 72 46 69 6c 65 20 24 74 65 73 74 5f 63 68 61  orFile $test_cha
27480 6e 6e 65 6c 20 24 74 65 73 74 49 6e 73 74 61 6c  nnel $testInstal
27490 6c 56 73 32 30 30 38 4c 6f 67 46 69 6c 65 0d 0a  lVs2008LogFile..
274a0 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
274b0 20 20 20 20 20 69 66 20 7b 21 5b 68 61 76 65 43       if {![haveC
274c0 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e  onstraint [appen
274d0 64 41 72 67 73 20 66 69 6c 65 5f 20 5c 0d 0a 20  dArgs file_ \.. 
274e0 20 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65             [file
274f0 20 74 61 69 6c 20 24 74 65 73 74 49 6e 73 74 61   tail $testInsta
27500 6c 6c 56 73 32 30 31 30 4c 6f 67 46 69 6c 65 5d  llVs2010LogFile]
27510 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  ]]} then {..    
27520 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72 46 69        checkForFi
27530 6c 65 20 24 74 65 73 74 5f 63 68 61 6e 6e 65 6c  le $test_channel
27540 20 24 74 65 73 74 49 6e 73 74 61 6c 6c 56 73 32   $testInstallVs2
27550 30 31 30 4c 6f 67 46 69 6c 65 0d 0a 20 20 20 20  010LogFile..    
27560 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
27570 20 69 66 20 7b 21 5b 68 61 76 65 43 6f 6e 73 74   if {![haveConst
27580 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67  raint [appendArg
27590 73 20 66 69 6c 65 5f 20 5c 0d 0a 20 20 20 20 20  s file_ \..     
275a0 20 20 20 20 20 20 20 5b 66 69 6c 65 20 74 61 69         [file tai
275b0 6c 20 24 74 65 73 74 49 6e 73 74 61 6c 6c 56 73  l $testInstallVs
275c0 32 30 31 32 4c 6f 67 46 69 6c 65 5d 5d 5d 7d 20  2012LogFile]]]} 
275d0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
275e0 20 20 63 68 65 63 6b 46 6f 72 46 69 6c 65 20 24    checkForFile $
275f0 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 24 74 65  test_channel $te
27600 73 74 49 6e 73 74 61 6c 6c 56 73 32 30 31 32 4c  stInstallVs2012L
27610 6f 67 46 69 6c 65 0d 0a 20 20 20 20 20 20 20 20  ogFile..        
27620 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20  }....        if 
27630 7b 21 5b 68 61 76 65 43 6f 6e 73 74 72 61 69 6e  {![haveConstrain
27640 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20 66 69  t [appendArgs fi
27650 6c 65 5f 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  le_ \..         
27660 20 20 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 74     [file tail $t
27670 65 73 74 49 6e 73 74 61 6c 6c 56 73 32 30 31 33  estInstallVs2013
27680 4c 6f 67 46 69 6c 65 5d 5d 5d 7d 20 74 68 65 6e  LogFile]]]} then
27690 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 63 68   {..          ch
276a0 65 63 6b 46 6f 72 46 69 6c 65 20 24 74 65 73 74  eckForFile $test
276b0 5f 63 68 61 6e 6e 65 6c 20 24 74 65 73 74 49 6e  _channel $testIn
276c0 73 74 61 6c 6c 56 73 32 30 31 33 4c 6f 67 46 69  stallVs2013LogFi
276d0 6c 65 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d  le..        }...
276e0 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 68  .        if {![h
276f0 61 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61  aveConstraint [a
27700 70 70 65 6e 64 41 72 67 73 20 66 69 6c 65 5f 20  ppendArgs file_ 
27710 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b  \..            [
27720 66 69 6c 65 20 74 61 69 6c 20 24 74 65 73 74 49  file tail $testI
27730 6e 73 74 61 6c 6c 56 73 32 30 31 35 4c 6f 67 46  nstallVs2015LogF
27740 69 6c 65 5d 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a  ile]]]} then {..
27750 20 20 20 20 20 20 20 20 20 20 63 68 65 63 6b 46            checkF
27760 6f 72 46 69 6c 65 20 24 74 65 73 74 5f 63 68 61  orFile $test_cha
27770 6e 6e 65 6c 20 24 74 65 73 74 49 6e 73 74 61 6c  nnel $testInstal
27780 6c 56 73 32 30 31 35 4c 6f 67 46 69 6c 65 0d 0a  lVs2015LogFile..
27790 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
277a0 20 20 20 20 20 69 66 20 7b 21 5b 68 61 76 65 43       if {![haveC
277b0 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e  onstraint [appen
277c0 64 41 72 67 73 20 66 69 6c 65 5f 20 5c 0d 0a 20  dArgs file_ \.. 
277d0 20 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65             [file
277e0 20 74 61 69 6c 20 24 74 65 73 74 55 6e 69 6e 73   tail $testUnins
277f0 74 61 6c 6c 56 73 32 30 30 35 4c 6f 67 46 69 6c  tallVs2005LogFil
27800 65 5d 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  e]]]} then {..  
27810 20 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72          checkFor
27820 46 69 6c 65 20 24 74 65 73 74 5f 63 68 61 6e 6e  File $test_chann
27830 65 6c 20 24 74 65 73 74 55 6e 69 6e 73 74 61 6c  el $testUninstal
27840 6c 56 73 32 30 30 35 4c 6f 67 46 69 6c 65 0d 0a  lVs2005LogFile..
27850 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
27860 20 20 20 20 20 69 66 20 7b 21 5b 68 61 76 65 43       if {![haveC
27870 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e  onstraint [appen
27880 64 41 72 67 73 20 66 69 6c 65 5f 20 5c 0d 0a 20  dArgs file_ \.. 
27890 20 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65             [file
278a0 20 74 61 69 6c 20 24 74 65 73 74 55 6e 69 6e 73   tail $testUnins
278b0 74 61 6c 6c 56 73 32 30 30 38 4c 6f 67 46 69 6c  tallVs2008LogFil
278c0 65 5d 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  e]]]} then {..  
278d0 20 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72          checkFor
278e0 46 69 6c 65 20 24 74 65 73 74 5f 63 68 61 6e 6e  File $test_chann
278f0 65 6c 20 24 74 65 73 74 55 6e 69 6e 73 74 61 6c  el $testUninstal
27900 6c 56 73 32 30 30 38 4c 6f 67 46 69 6c 65 0d 0a  lVs2008LogFile..
27910 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
27920 20 20 20 20 20 69 66 20 7b 21 5b 68 61 76 65 43       if {![haveC
27930 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e  onstraint [appen
27940 64 41 72 67 73 20 66 69 6c 65 5f 20 5c 0d 0a 20  dArgs file_ \.. 
27950 20 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65             [file
27960 20 74 61 69 6c 20 24 74 65 73 74 55 6e 69 6e 73   tail $testUnins
27970 74 61 6c 6c 56 73 32 30 31 30 4c 6f 67 46 69 6c  tallVs2010LogFil
27980 65 5d 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  e]]]} then {..  
27990 20 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72          checkFor
279a0 46 69 6c 65 20 24 74 65 73 74 5f 63 68 61 6e 6e  File $test_chann
279b0 65 6c 20 24 74 65 73 74 55 6e 69 6e 73 74 61 6c  el $testUninstal
279c0 6c 56 73 32 30 31 30 4c 6f 67 46 69 6c 65 0d 0a  lVs2010LogFile..
279d0 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
279e0 20 20 20 20 20 69 66 20 7b 21 5b 68 61 76 65 43       if {![haveC
279f0 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e  onstraint [appen
27a00 64 41 72 67 73 20 66 69 6c 65 5f 20 5c 0d 0a 20  dArgs file_ \.. 
27a10 20 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65             [file
27a20 20 74 61 69 6c 20 24 74 65 73 74 55 6e 69 6e 73   tail $testUnins
27a30 74 61 6c 6c 56 73 32 30 31 32 4c 6f 67 46 69 6c  tallVs2012LogFil
27a40 65 5d 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  e]]]} then {..  
27a50 20 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72          checkFor
27a60 46 69 6c 65 20 24 74 65 73 74 5f 63 68 61 6e 6e  File $test_chann
27a70 65 6c 20 24 74 65 73 74 55 6e 69 6e 73 74 61 6c  el $testUninstal
27a80 6c 56 73 32 30 31 32 4c 6f 67 46 69 6c 65 0d 0a  lVs2012LogFile..
27a90 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
27aa0 20 20 20 20 20 69 66 20 7b 21 5b 68 61 76 65 43       if {![haveC
27ab0 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e  onstraint [appen
27ac0 64 41 72 67 73 20 66 69 6c 65 5f 20 5c 0d 0a 20  dArgs file_ \.. 
27ad0 20 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65             [file
27ae0 20 74 61 69 6c 20 24 74 65 73 74 55 6e 69 6e 73   tail $testUnins
27af0 74 61 6c 6c 56 73 32 30 31 33 4c 6f 67 46 69 6c  tallVs2013LogFil
27b00 65 5d 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  e]]]} then {..  
27b10 20 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72          checkFor
27b20 46 69 6c 65 20 24 74 65 73 74 5f 63 68 61 6e 6e  File $test_chann
27b30 65 6c 20 24 74 65 73 74 55 6e 69 6e 73 74 61 6c  el $testUninstal
27b40 6c 56 73 32 30 31 33 4c 6f 67 46 69 6c 65 0d 0a  lVs2013LogFile..
27b50 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
27b60 20 20 20 20 20 69 66 20 7b 21 5b 68 61 76 65 43       if {![haveC
27b70 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e  onstraint [appen
27b80 64 41 72 67 73 20 66 69 6c 65 5f 20 5c 0d 0a 20  dArgs file_ \.. 
27b90 20 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65             [file
27ba0 20 74 61 69 6c 20 24 74 65 73 74 55 6e 69 6e 73   tail $testUnins
27bb0 74 61 6c 6c 56 73 32 30 31 35 4c 6f 67 46 69 6c  tallVs2015LogFil
27bc0 65 5d 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  e]]]} then {..  
27bd0 20 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72          checkFor
27be0 46 69 6c 65 20 24 74 65 73 74 5f 63 68 61 6e 6e  File $test_chann
27bf0 65 6c 20 24 74 65 73 74 55 6e 69 6e 73 74 61 6c  el $testUninstal
27c00 6c 56 73 32 30 31 35 4c 6f 67 46 69 6c 65 0d 0a  lVs2015LogFile..
27c10 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
27c20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20   }..    }.....  
27c30 20 20 70 72 6f 63 20 72 75 6e 53 51 4c 69 74 65    proc runSQLite
27c40 54 65 73 74 46 69 6c 65 73 45 70 69 6c 6f 67 75  TestFilesEpilogu
27c50 65 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 75 70  e {} {..      up
27c60 6c 65 76 65 6c 20 31 20 7b 0d 0a 20 20 20 20 20  level 1 {..     
27c70 20 20 20 75 6e 73 65 74 20 2d 6e 6f 63 6f 6d 70     unset -nocomp
27c80 6c 61 69 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20  lain \..        
27c90 20 20 20 20 74 65 73 74 55 6e 69 6e 73 74 61 6c      testUninstal
27ca0 6c 56 73 32 30 31 35 4c 6f 67 46 69 6c 65 20 74  lVs2015LogFile t
27cb0 65 73 74 55 6e 69 6e 73 74 61 6c 6c 56 73 32 30  estUninstallVs20
27cc0 31 33 4c 6f 67 46 69 6c 65 20 5c 0d 0a 20 20 20  13LogFile \..   
27cd0 20 20 20 20 20 20 20 20 20 74 65 73 74 55 6e 69           testUni
27ce0 6e 73 74 61 6c 6c 56 73 32 30 31 32 4c 6f 67 46  nstallVs2012LogF
27cf0 69 6c 65 20 74 65 73 74 55 6e 69 6e 73 74 61 6c  ile testUninstal
27d00 6c 56 73 32 30 31 30 4c 6f 67 46 69 6c 65 20 5c  lVs2010LogFile \
27d10 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 65  ..            te
27d20 73 74 55 6e 69 6e 73 74 61 6c 6c 56 73 32 30 30  stUninstallVs200
27d30 38 4c 6f 67 46 69 6c 65 20 74 65 73 74 55 6e 69  8LogFile testUni
27d40 6e 73 74 61 6c 6c 56 73 32 30 30 35 4c 6f 67 46  nstallVs2005LogF
27d50 69 6c 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ile \..         
27d60 20 20 20 74 65 73 74 49 6e 73 74 61 6c 6c 56 73     testInstallVs
27d70 32 30 31 35 4c 6f 67 46 69 6c 65 20 74 65 73 74  2015LogFile test
27d80 49 6e 73 74 61 6c 6c 56 73 32 30 31 33 4c 6f 67  InstallVs2013Log
27d90 46 69 6c 65 20 5c 0d 0a 20 20 20 20 20 20 20 20  File \..        
27da0 20 20 20 20 74 65 73 74 49 6e 73 74 61 6c 6c 56      testInstallV
27db0 73 32 30 31 32 4c 6f 67 46 69 6c 65 20 74 65 73  s2012LogFile tes
27dc0 74 49 6e 73 74 61 6c 6c 56 73 32 30 31 30 4c 6f  tInstallVs2010Lo
27dd0 67 46 69 6c 65 20 5c 0d 0a 20 20 20 20 20 20 20  gFile \..       
27de0 20 20 20 20 20 74 65 73 74 49 6e 73 74 61 6c 6c       testInstall
27df0 56 73 32 30 30 38 4c 6f 67 46 69 6c 65 20 74 65  Vs2008LogFile te
27e00 73 74 49 6e 73 74 61 6c 6c 56 73 32 30 30 35 4c  stInstallVs2005L
27e10 6f 67 46 69 6c 65 0d 0a 0d 0a 20 20 20 20 20 20  ogFile....      
27e20 20 20 75 6e 73 65 74 20 2d 6e 6f 63 6f 6d 70 6c    unset -nocompl
27e30 61 69 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ain \..         
27e40 20 20 20 6e 6f 72 74 68 77 69 6e 64 45 66 44 62     northwindEfDb
27e50 46 69 6c 65 20 74 65 73 74 4c 69 6e 71 4f 75 74  File testLinqOut
27e60 46 69 6c 65 20 5c 0d 0a 20 20 20 20 20 20 20 20  File \..        
27e70 20 20 20 20 77 61 6c 44 62 46 69 6c 65 20 6e 6f      walDbFile no
27e80 6e 57 61 6c 44 62 46 69 6c 65 0d 0a 0d 0a 20 20  nWalDbFile....  
27e90 20 20 20 20 20 20 75 6e 73 65 74 20 2d 6e 6f 63        unset -noc
27ea0 6f 6d 70 6c 61 69 6e 20 5c 0d 0a 20 20 20 20 20  omplain \..     
27eb0 20 20 20 20 20 20 20 74 65 73 74 45 66 36 45 78         testEf6Ex
27ec0 65 46 69 6c 65 20 74 65 73 74 4c 69 6e 71 45 78  eFile testLinqEx
27ed0 65 46 69 6c 65 20 5c 0d 0a 20 20 20 20 20 20 20  eFile \..       
27ee0 20 20 20 20 20 74 65 73 74 45 78 65 46 69 6c 65       testExeFile
27ef0 20 73 79 73 74 65 6d 44 61 74 61 53 51 4c 69 74   systemDataSQLit
27f00 65 45 66 36 44 6c 6c 46 69 6c 65 20 5c 0d 0a 20  eEf6DllFile \.. 
27f10 20 20 20 20 20 20 20 20 20 20 20 73 79 73 74 65             syste
27f20 6d 44 61 74 61 53 51 4c 69 74 65 4c 69 6e 71 44  mDataSQLiteLinqD
27f30 6c 6c 46 69 6c 65 20 73 79 73 74 65 6d 44 61 74  llFile systemDat
27f40 61 53 51 4c 69 74 65 44 6c 6c 46 69 6c 65 20 5c  aSQLiteDllFile \
27f50 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  ..            sq
27f60 6c 69 74 65 44 65 73 69 67 6e 65 72 44 6c 6c 46  liteDesignerDllF
27f70 69 6c 65 20 69 6e 73 74 61 6c 6c 65 72 45 78 65  ile installerExe
27f80 46 69 6c 65 20 5c 0d 0a 20 20 20 20 20 20 20 20  File \..        
27f90 20 20 20 20 65 6e 74 69 74 79 46 72 61 6d 65 77      entityFramew
27fa0 6f 72 6b 44 6c 6c 46 69 6c 65 0d 0a 20 20 20 20  orkDllFile..    
27fb0 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20    }..    }..... 
27fc0 20 20 20 70 72 6f 63 20 72 75 6e 53 51 4c 69 74     proc runSQLit
27fd0 65 54 65 73 74 45 70 69 6c 6f 67 75 65 20 7b 7d  eTestEpilogue {}
27fe0 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20   {..      #..   
27ff0 20 20 20 23 20 4e 4f 54 45 3a 20 53 6b 69 70 20     # NOTE: Skip 
28000 72 75 6e 6e 69 6e 67 20 6f 75 72 20 63 75 73 74  running our cust
28010 6f 6d 20 65 70 69 6c 6f 67 75 65 20 69 66 20 74  om epilogue if t
28020 68 65 20 6d 61 69 6e 20 6f 6e 65 20 68 61 73 20  he main one has 
28030 62 65 65 6e 0d 0a 20 20 20 20 20 20 23 20 20 20  been..      #   
28040 20 20 20 20 73 6b 69 70 70 65 64 2e 0d 0a 20 20      skipped...  
28050 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20      #..      if 
28060 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a  {![info exists :
28070 3a 6e 6f 28 65 70 69 6c 6f 67 75 65 2e 65 61 67  :no(epilogue.eag
28080 6c 65 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  le)]} then {..  
28090 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
280a0 20 23 20 4e 4f 54 45 3a 20 53 68 6f 77 20 77 68   # NOTE: Show wh
280b0 65 6e 20 6f 75 72 20 74 65 73 74 73 20 61 63 74  en our tests act
280c0 75 61 6c 6c 79 20 65 6e 64 65 64 20 28 6e 6f 77  ually ended (now
280d0 29 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  )...        #.. 
280e0 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
280f0 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70  test_channel [ap
28100 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
28110 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 53 79          "---- Sy
28120 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
28130 20 74 65 73 74 73 20 65 6e 64 65 64 20 61 74 20   tests ended at 
28140 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  " \..           
28150 20 5b 63 6c 6f 63 6b 20 66 6f 72 6d 61 74 20 5b   [clock format [
28160 63 6c 6f 63 6b 20 73 65 63 6f 6e 64 73 5d 5d 20  clock seconds]] 
28170 5c 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23  \n]....        #
28180 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
28190 3a 20 4c 6f 61 64 20 74 68 65 20 22 65 70 69 6c  : Load the "epil
281a0 6f 67 75 65 22 20 63 75 73 74 6f 6d 20 70 65 72  ogue" custom per
281b0 2d 75 73 65 72 20 61 6e 64 2f 6f 72 20 70 65 72  -user and/or per
281c0 2d 68 6f 73 74 20 74 65 73 74 0d 0a 20 20 20 20  -host test..    
281d0 20 20 20 20 23 20 20 20 20 20 20 20 73 65 74 74      #       sett
281e0 69 6e 67 73 20 6e 6f 77 2e 0d 0a 20 20 20 20 20  ings now...     
281f0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 75 70     #..        up
28200 6c 65 76 65 6c 20 31 20 5b 6c 69 73 74 20 6c 6f  level 1 [list lo
28210 61 64 53 51 4c 69 74 65 54 65 73 74 53 65 74 74  adSQLiteTestSett
28220 69 6e 67 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  ings $::test_cha
28230 6e 6e 65 6c 20 2e 65 70 69 6c 6f 67 75 65 5d 0d  nnel .epilogue].
28240 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
28250 20 20 20 20 20 20 23 20 42 55 47 46 49 58 3a 20        # BUGFIX: 
28260 42 65 66 6f 72 65 20 63 68 65 63 6b 69 6e 67 20  Before checking 
28270 74 68 65 20 66 69 6e 61 6c 20 72 65 73 6f 75 72  the final resour
28280 63 65 73 20 69 6e 20 75 73 65 20 62 79 20 53 51  ces in use by SQ
28290 4c 69 74 65 2c 20 6d 61 6b 65 0d 0a 20 20 20 20  Lite, make..    
282a0 20 20 20 20 23 20 20 20 20 20 20 20 20 20 73 75      #         su
282b0 72 65 20 62 6f 74 68 20 6f 66 20 74 68 65 20 50  re both of the P
282c0 52 41 47 4d 41 20 72 65 6c 61 74 65 64 20 64 69  RAGMA related di
282d0 72 65 63 74 6f 72 79 20 6e 61 6d 65 73 20 61 72  rectory names ar
282e0 65 20 66 72 65 65 64 2e 0d 0a 20 20 20 20 20 20  e freed...      
282f0 20 20 23 0d 0a 20 20 20 20 20 20 20 20 63 68 65    #..        che
28300 63 6b 46 6f 72 53 51 4c 69 74 65 44 69 72 65 63  ckForSQLiteDirec
28310 74 6f 72 69 65 73 20 24 3a 3a 74 65 73 74 5f 63  tories $::test_c
28320 68 61 6e 6e 65 6c 20 74 72 75 65 0d 0a 0d 0a 20  hannel true.... 
28330 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
28340 20 20 23 20 4e 4f 54 45 3a 20 41 6c 73 6f 20 72    # NOTE: Also r
28350 65 70 6f 72 74 20 74 68 65 20 72 65 73 6f 75 72  eport the resour
28360 63 65 20 75 73 61 67 65 20 61 66 74 65 72 20 72  ce usage after r
28370 75 6e 6e 69 6e 67 20 74 68 65 20 74 65 73 74 73  unning the tests
28380 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
28390 20 20 20 20 20 20 72 65 70 6f 72 74 53 51 4c 69        reportSQLi
283a0 74 65 52 65 73 6f 75 72 63 65 73 20 24 3a 3a 74  teResources $::t
283b0 65 73 74 5f 63 68 61 6e 6e 65 6c 0d 0a 0d 0a 20  est_channel.... 
283c0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
283d0 20 20 23 20 4e 4f 54 45 3a 20 52 65 70 6f 72 74    # NOTE: Report
283e0 20 74 68 65 20 63 72 69 74 69 63 61 6c 20 68 61   the critical ha
283f0 6e 64 6c 65 20 63 6f 75 6e 74 73 20 61 66 74 65  ndle counts afte
28400 72 20 72 75 6e 6e 69 6e 67 20 74 68 65 20 74 65  r running the te
28410 73 74 73 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  sts...        #.
28420 0a 20 20 20 20 20 20 20 20 67 65 74 53 51 4c 69  .        getSQLi
28430 74 65 48 61 6e 64 6c 65 43 6f 75 6e 74 73 20 24  teHandleCounts $
28440 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 0d 0a  ::test_channel..
28450 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
28460 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 66 20       # NOTE: If 
28470 6e 65 63 65 73 73 61 72 79 2c 20 64 69 73 61 62  necessary, disab
28480 6c 65 20 73 68 61 72 65 64 2d 63 61 63 68 65 20  le shared-cache 
28490 6d 6f 64 65 20 6e 6f 77 2e 0d 0a 20 20 20 20 20  mode now...     
284a0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 69 66     #..        if
284b0 20 7b 5b 68 61 73 52 75 6e 74 69 6d 65 4f 70 74   {[hasRuntimeOpt
284c0 69 6f 6e 20 73 68 61 72 65 64 43 61 63 68 65 5d  ion sharedCache]
284d0 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
284e0 20 20 20 20 65 6e 61 62 6c 65 53 68 61 72 65 64      enableShared
284f0 43 61 63 68 65 20 24 3a 3a 74 65 73 74 5f 63 68  Cache $::test_ch
28500 61 6e 6e 65 6c 20 66 61 6c 73 65 0d 0a 20 20 20  annel false..   
28510 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d       }..      }.
28520 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 23  .    }.....    #
28530 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
28540 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
28550 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
28560 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
28570 23 23 23 23 23 23 23 23 23 23 0d 0a 20 20 20 20  ##########..    
28580 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
28590 23 23 23 23 23 23 23 23 23 23 23 23 23 20 45 4e  ############# EN
285a0 44 20 45 61 67 6c 65 20 4f 4e 4c 59 20 23 23 23  D Eagle ONLY ###
285b0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
285c0 23 23 23 23 23 23 23 23 23 23 23 0d 0a 20 20 20  ###########..   
285d0 20 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23   ###############
285e0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
285f0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
28600 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
28610 23 23 23 23 23 23 23 23 23 23 23 23 0d 0a 20 20  ############..  
28620 7d 0d 0a 0d 0a 20 20 23 0d 0a 20 20 23 20 4e 4f  }....  #..  # NO
28630 54 45 3a 20 53 61 76 65 20 74 68 65 20 6e 61 6d  TE: Save the nam
28640 65 20 6f 66 20 74 68 65 20 64 69 72 65 63 74 6f  e of the directo
28650 72 79 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  ry containing th
28660 69 73 20 66 69 6c 65 2e 0d 0a 20 20 23 0d 0a 20  is file...  #.. 
28670 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73   if {![info exis
28680 74 73 20 63 6f 6d 6d 6f 6e 5f 64 69 72 65 63 74  ts common_direct
28690 6f 72 79 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ory]} then {..  
286a0 20 20 73 65 74 20 63 6f 6d 6d 6f 6e 5f 64 69 72    set common_dir
286b0 65 63 74 6f 72 79 20 5b 66 69 6c 65 20 64 69 72  ectory [file dir
286c0 6e 61 6d 65 20 5b 69 6e 66 6f 20 73 63 72 69 70  name [info scrip
286d0 74 5d 5d 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 23 0d  t]]..  }....  #.
286e0 0a 20 20 23 20 4e 4f 54 45 3a 20 50 72 6f 76 69  .  # NOTE: Provi
286f0 64 65 20 74 68 65 20 53 79 73 74 65 6d 2e 44 61  de the System.Da
28700 74 61 2e 53 51 4c 69 74 65 20 74 65 73 74 20 70  ta.SQLite test p
28710 61 63 6b 61 67 65 20 74 6f 20 74 68 65 20 69 6e  ackage to the in
28720 74 65 72 70 72 65 74 65 72 2e 0d 0a 20 20 23 0d  terpreter...  #.
28730 0a 20 20 70 61 63 6b 61 67 65 20 70 72 6f 76 69  .  package provi
28740 64 65 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53  de System.Data.S
28750 51 4c 69 74 65 2e 54 65 73 74 20 31 2e 30 0d 0a  QLite.Test 1.0..
28760 7d 0d 0a                                         }..