System.Data.SQLite
Hex Artifact Content
Not logged in

Artifact 86ae414fced7ec4faeda81dcc1e92e0451e72281:


0000: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0010: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0020: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0030: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0040: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0d  ###############.
0050: 0a 23 0d 0a 23 20 63 6f 6d 6d 6f 6e 2e 65 61 67  .#..# common.eag
0060: 6c 65 20 2d 2d 0d 0a 23 0d 0a 23 20 57 72 69 74  le --..#..# Writ
0070: 74 65 6e 20 62 79 20 4a 6f 65 20 4d 69 73 74 61  ten by Joe Mista
0080: 63 68 6b 69 6e 2e 0d 0a 23 20 52 65 6c 65 61 73  chkin...# Releas
0090: 65 64 20 74 6f 20 74 68 65 20 70 75 62 6c 69 63  ed to the public
00a0: 20 64 6f 6d 61 69 6e 2c 20 75 73 65 20 61 74 20   domain, use at 
00b0: 79 6f 75 72 20 6f 77 6e 20 72 69 73 6b 21 0d 0a  your own risk!..
00c0: 23 0d 0a 23 23 23 23 23 23 23 23 23 23 23 23 23  #..#############
00d0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
00e0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
00f0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0100: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0110: 23 23 0d 0a 0d 0a 23 0d 0a 23 20 4e 4f 54 45 3a  ##....#..# NOTE:
0120: 20 55 73 65 20 6f 75 72 20 6f 77 6e 20 6e 61 6d   Use our own nam
0130: 65 73 70 61 63 65 20 68 65 72 65 20 62 65 63 61  espace here beca
0140: 75 73 65 20 65 76 65 6e 20 74 68 6f 75 67 68 20  use even though 
0150: 77 65 20 64 6f 20 6e 6f 74 20 64 69 72 65 63 74  we do not direct
0160: 6c 79 0d 0a 23 20 20 20 20 20 20 20 73 75 70 70  ly..#       supp
0170: 6f 72 74 20 6e 61 6d 65 73 70 61 63 65 73 20 6f  ort namespaces o
0180: 75 72 73 65 6c 76 65 73 2c 20 77 65 20 64 6f 20  urselves, we do 
0190: 6e 6f 74 20 77 61 6e 74 20 74 6f 20 70 6f 6c 6c  not want to poll
01a0: 75 74 65 20 74 68 65 20 67 6c 6f 62 61 6c 0d 0a  ute the global..
01b0: 23 20 20 20 20 20 20 20 6e 61 6d 65 73 70 61 63  #       namespac
01c0: 65 20 69 66 20 74 68 69 73 20 73 63 72 69 70 74  e if this script
01d0: 20 61 63 74 75 61 6c 6c 79 20 65 6e 64 73 20 75   actually ends u
01e0: 70 20 62 65 69 6e 67 20 65 76 61 6c 75 61 74 65  p being evaluate
01f0: 64 20 69 6e 20 54 63 6c 2e 0d 0a 23 0d 0a 6e 61  d in Tcl...#..na
0200: 6d 65 73 70 61 63 65 20 65 76 61 6c 20 3a 3a 45  mespace eval ::E
0210: 61 67 6c 65 20 7b 0d 0a 20 20 69 66 20 7b 5b 69  agle {..  if {[i
0220: 73 45 61 67 6c 65 5d 7d 20 74 68 65 6e 20 7b 0d  sEagle]} then {.
0230: 0a 20 20 20 20 23 23 23 23 23 23 23 23 23 23 23  .    ###########
0240: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0250: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0260: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0270: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0280: 0d 0a 20 20 20 20 23 23 23 23 23 23 23 23 23 23  ..    ##########
0290: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
02a0: 23 23 20 42 45 47 49 4e 20 45 61 67 6c 65 20 4f  ## BEGIN Eagle O
02b0: 4e 4c 59 20 23 23 23 23 23 23 23 23 23 23 23 23  NLY ############
02c0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
02d0: 23 0d 0a 20 20 20 20 23 23 23 23 23 23 23 23 23  #..    #########
02e0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
02f0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0300: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0310: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0320: 23 23 0d 0a 0d 0a 20 20 20 20 70 72 6f 63 20 67  ##....    proc g
0330: 65 74 53 51 4c 69 74 65 44 65 66 69 6e 65 43 6f  etSQLiteDefineCo
0340: 6e 73 74 61 6e 74 50 72 65 66 69 78 20 7b 7d 20  nstantPrefix {} 
0350: 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  {..      #..    
0360: 20 20 23 20 4e 4f 54 45 3a 20 53 65 65 20 69 66    # NOTE: See if
0370: 20 74 68 65 20 64 65 66 69 6e 65 20 63 6f 6e 73   the define cons
0380: 74 61 6e 74 20 70 72 65 66 69 78 20 73 65 74 74  tant prefix sett
0390: 69 6e 67 20 68 61 73 20 62 65 65 6e 20 6f 76 65  ing has been ove
03a0: 72 72 69 64 64 65 6e 0d 0a 20 20 20 20 20 20 23  rridden..      #
03b0: 20 20 20 20 20 20 20 62 79 20 74 68 65 20 75 73         by the us
03c0: 65 72 20 28 65 2e 67 2e 20 6f 6e 20 74 68 65 20  er (e.g. on the 
03d0: 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 29 2e 0d 0a  command line)...
03e0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69        #..      i
03f0: 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20  f {[info exists 
0400: 3a 3a 64 65 66 69 6e 65 5f 63 6f 6e 73 74 61 6e  ::define_constan
0410: 74 5f 70 72 65 66 69 78 5d 20 26 26 20 5c 0d 0a  t_prefix] && \..
0420: 20 20 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e            [strin
0430: 67 20 6c 65 6e 67 74 68 20 24 3a 3a 64 65 66 69  g length $::defi
0440: 6e 65 5f 63 6f 6e 73 74 61 6e 74 5f 70 72 65 66  ne_constant_pref
0450: 69 78 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d  ix] > 0} then {.
0460: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
0470: 20 20 20 20 23 20 4e 4f 54 45 3a 20 55 73 65 20      # NOTE: Use 
0480: 74 68 65 20 73 70 65 63 69 66 69 65 64 20 64 65  the specified de
0490: 66 69 6e 65 20 63 6f 6e 73 74 61 6e 74 20 70 72  fine constant pr
04a0: 65 66 69 78 2e 0d 0a 20 20 20 20 20 20 20 20 23  efix...        #
04b0: 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ..        return
04c0: 20 24 3a 3a 64 65 66 69 6e 65 5f 63 6f 6e 73 74   $::define_const
04d0: 61 6e 74 5f 70 72 65 66 69 78 0d 0a 20 20 20 20  ant_prefix..    
04e0: 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
04f0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
0500: 20 4e 4f 54 45 3a 20 55 73 65 20 74 68 65 20 64   NOTE: Use the d
0510: 65 66 61 75 6c 74 20 64 65 66 69 6e 65 20 63 6f  efault define co
0520: 6e 73 74 61 6e 74 20 70 72 65 66 69 78 2e 0d 0a  nstant prefix...
0530: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
0540: 20 20 20 72 65 74 75 72 6e 20 64 65 66 69 6e 65     return define
0550: 43 6f 6e 73 74 61 6e 74 2e 53 79 73 74 65 6d 2e  Constant.System.
0560: 44 61 74 61 2e 53 51 4c 69 74 65 2e 0d 0a 20 20  Data.SQLite...  
0570: 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d      }..    }....
0580: 0a 20 20 20 20 70 72 6f 63 20 68 61 76 65 53 51  .    proc haveSQ
0590: 4c 69 74 65 44 65 66 69 6e 65 43 6f 6e 73 74 61  LiteDefineConsta
05a0: 6e 74 20 7b 20 6e 61 6d 65 20 7d 20 7b 0d 0a 20  nt { name } {.. 
05b0: 20 20 20 20 20 72 65 74 75 72 6e 20 5b 68 61 76       return [hav
05c0: 65 43 6f 6e 73 74 72 61 69 6e 74 20 5c 0d 0a 20  eConstraint \.. 
05d0: 20 20 20 20 20 20 20 20 20 5b 61 70 70 65 6e 64           [append
05e0: 41 72 67 73 20 5b 67 65 74 53 51 4c 69 74 65 44  Args [getSQLiteD
05f0: 65 66 69 6e 65 43 6f 6e 73 74 61 6e 74 50 72 65  efineConstantPre
0600: 66 69 78 5d 20 24 6e 61 6d 65 5d 5d 0d 0a 20 20  fix] $name]]..  
0610: 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
0620: 20 67 65 74 42 75 69 6c 64 59 65 61 72 20 7b 7d   getBuildYear {}
0630: 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20   {..      #..   
0640: 20 20 20 23 20 4e 4f 54 45 3a 20 53 65 65 20 69     # NOTE: See i
0650: 66 20 74 68 65 20 22 79 65 61 72 22 20 73 65 74  f the "year" set
0660: 74 69 6e 67 20 68 61 73 20 62 65 65 6e 20 6f 76  ting has been ov
0670: 65 72 72 69 64 64 65 6e 20 62 79 20 74 68 65 20  erridden by the 
0680: 75 73 65 72 20 28 65 2e 67 2e 0d 0a 20 20 20 20  user (e.g...    
0690: 20 20 23 20 20 20 20 20 20 20 6f 6e 20 74 68 65    #       on the
06a0: 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 29 2e 20   command line). 
06b0: 20 54 68 69 73 20 68 65 6c 70 73 20 63 6f 6e 74   This helps cont
06c0: 72 6f 6c 20 65 78 61 63 74 6c 79 20 77 68 69 63  rol exactly whic
06d0: 68 20 73 65 74 20 6f 66 0d 0a 20 20 20 20 20 20  h set of..      
06e0: 23 20 20 20 20 20 20 20 62 69 6e 61 72 69 65 73  #       binaries
06f0: 20 77 65 20 61 72 65 20 74 65 73 74 69 6e 67 2c   we are testing,
0700: 20 74 68 6f 73 65 20 70 72 6f 64 75 63 65 64 20   those produced 
0710: 75 73 69 6e 67 20 74 68 65 20 56 69 73 75 61 6c  using the Visual
0720: 20 53 74 75 64 69 6f 0d 0a 20 20 20 20 20 20 23   Studio..      #
0730: 20 20 20 20 20 20 20 32 30 30 35 2c 20 32 30 30         2005, 200
0740: 38 2c 20 32 30 31 30 2c 20 32 30 31 32 2c 20 32  8, 2010, 2012, 2
0750: 30 31 33 2c 20 6f 72 20 32 30 31 35 20 62 75 69  013, or 2015 bui
0760: 6c 64 20 73 79 73 74 65 6d 73 2e 20 20 54 6f 20  ld systems.  To 
0770: 6f 76 65 72 72 69 64 65 0d 0a 20 20 20 20 20 20  override..      
0780: 23 20 20 20 20 20 20 20 74 68 69 73 20 76 61 6c  #       this val
0790: 75 65 20 76 69 61 20 74 68 65 20 63 6f 6d 6d 61  ue via the comma
07a0: 6e 64 20 6c 69 6e 65 2c 20 65 6e 74 65 72 20 61  nd line, enter a
07b0: 20 63 6f 6d 6d 61 6e 64 20 73 69 6d 69 6c 61 72   command similar
07c0: 20 74 6f 20 6f 6e 65 0d 0a 20 20 20 20 20 20 23   to one..      #
07d0: 20 20 20 20 20 20 20 6f 66 20 74 68 65 20 66 6f         of the fo
07e0: 6c 6c 6f 77 69 6e 67 20 28 61 6c 6c 20 6f 6e 20  llowing (all on 
07f0: 6f 6e 65 20 6c 69 6e 65 29 3a 0d 0a 20 20 20 20  one line):..    
0800: 20 20 23 0d 0a 20 20 20 20 20 20 23 20 20 20 20    #..      #    
0810: 20 20 20 45 61 67 6c 65 53 68 65 6c 6c 2e 65 78     EagleShell.ex
0820: 65 20 2d 61 6e 79 49 6e 69 74 69 61 6c 69 7a 65  e -anyInitialize
0830: 20 22 73 65 74 20 74 65 73 74 5f 79 65 61 72 20   "set test_year 
0840: 32 30 30 35 22 0d 0a 20 20 20 20 20 20 23 20 20  2005"..      #  
0850: 20 20 20 20 20 20 20 2d 66 69 6c 65 20 2e 5c 70         -file .\p
0860: 61 74 68 5c 74 6f 5c 61 6c 6c 2e 65 61 67 6c 65  ath\to\all.eagle
0870: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
0880: 20 23 20 20 20 20 20 20 20 45 61 67 6c 65 53 68   #       EagleSh
0890: 65 6c 6c 2e 65 78 65 20 2d 61 6e 79 49 6e 69 74  ell.exe -anyInit
08a0: 69 61 6c 69 7a 65 20 22 73 65 74 20 74 65 73 74  ialize "set test
08b0: 5f 79 65 61 72 20 32 30 30 38 22 0d 0a 20 20 20  _year 2008"..   
08c0: 20 20 20 23 20 20 20 20 20 20 20 20 20 2d 66 69     #         -fi
08d0: 6c 65 20 2e 5c 70 61 74 68 5c 74 6f 5c 61 6c 6c  le .\path\to\all
08e0: 2e 65 61 67 6c 65 0d 0a 20 20 20 20 20 20 23 0d  .eagle..      #.
08f0: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 45  .      #       E
0900: 61 67 6c 65 53 68 65 6c 6c 2e 65 78 65 20 2d 61  agleShell.exe -a
0910: 6e 79 49 6e 69 74 69 61 6c 69 7a 65 20 22 73 65  nyInitialize "se
0920: 74 20 74 65 73 74 5f 79 65 61 72 20 32 30 31 30  t test_year 2010
0930: 22 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  "..      #      
0940: 20 20 20 2d 66 69 6c 65 20 2e 5c 70 61 74 68 5c     -file .\path\
0950: 74 6f 5c 61 6c 6c 2e 65 61 67 6c 65 0d 0a 20 20  to\all.eagle..  
0960: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 20      #..      #  
0970: 20 20 20 20 20 45 61 67 6c 65 53 68 65 6c 6c 2e       EagleShell.
0980: 65 78 65 20 2d 61 6e 79 49 6e 69 74 69 61 6c 69  exe -anyInitiali
0990: 7a 65 20 22 73 65 74 20 74 65 73 74 5f 79 65 61  ze "set test_yea
09a0: 72 20 32 30 31 32 22 0d 0a 20 20 20 20 20 20 23  r 2012"..      #
09b0: 20 20 20 20 20 20 20 20 20 2d 66 69 6c 65 20 2e           -file .
09c0: 5c 70 61 74 68 5c 74 6f 5c 61 6c 6c 2e 65 61 67  \path\to\all.eag
09d0: 6c 65 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  le..      #..   
09e0: 20 20 20 23 20 20 20 20 20 20 20 45 61 67 6c 65     #       Eagle
09f0: 53 68 65 6c 6c 2e 65 78 65 20 2d 61 6e 79 49 6e  Shell.exe -anyIn
0a00: 69 74 69 61 6c 69 7a 65 20 22 73 65 74 20 74 65  itialize "set te
0a10: 73 74 5f 79 65 61 72 20 32 30 31 33 22 0d 0a 20  st_year 2013".. 
0a20: 20 20 20 20 20 23 20 20 20 20 20 20 20 20 20 2d       #         -
0a30: 66 69 6c 65 20 2e 5c 70 61 74 68 5c 74 6f 5c 61  file .\path\to\a
0a40: 6c 6c 2e 65 61 67 6c 65 0d 0a 20 20 20 20 20 20  ll.eagle..      
0a50: 23 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  #..      #      
0a60: 20 45 61 67 6c 65 53 68 65 6c 6c 2e 65 78 65 20   EagleShell.exe 
0a70: 2d 61 6e 79 49 6e 69 74 69 61 6c 69 7a 65 20 22  -anyInitialize "
0a80: 73 65 74 20 74 65 73 74 5f 79 65 61 72 20 32 30  set test_year 20
0a90: 31 35 22 0d 0a 20 20 20 20 20 20 23 20 20 20 20  15"..      #    
0aa0: 20 20 20 20 20 2d 66 69 6c 65 20 2e 5c 70 61 74       -file .\pat
0ab0: 68 5c 74 6f 5c 61 6c 6c 2e 65 61 67 6c 65 0d 0a  h\to\all.eagle..
0ac0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
0ad0: 20 20 20 20 20 20 20 45 61 67 6c 65 53 68 65 6c         EagleShel
0ae0: 6c 2e 65 78 65 20 2d 61 6e 79 49 6e 69 74 69 61  l.exe -anyInitia
0af0: 6c 69 7a 65 20 22 75 6e 73 65 74 20 2d 6e 6f 63  lize "unset -noc
0b00: 6f 6d 70 6c 61 69 6e 20 74 65 73 74 5f 79 65 61  omplain test_yea
0b10: 72 22 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  r"..      #     
0b20: 20 20 20 20 2d 66 69 6c 65 20 2e 5c 70 61 74 68      -file .\path
0b30: 5c 74 6f 5c 61 6c 6c 2e 65 61 67 6c 65 0d 0a 20  \to\all.eagle.. 
0b40: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66       #..      if
0b50: 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a   {[info exists :
0b60: 3a 74 65 73 74 5f 79 65 61 72 5d 20 26 26 20 5b  :test_year] && [
0b70: 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a  string length $:
0b80: 3a 74 65 73 74 5f 79 65 61 72 5d 20 3e 20 30 7d  :test_year] > 0}
0b90: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
0ba0: 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
0bb0: 54 45 3a 20 55 73 65 20 74 68 65 20 73 70 65 63  TE: Use the spec
0bc0: 69 66 69 65 64 20 74 65 73 74 20 79 65 61 72 2e  ified test year.
0bd0: 20 20 49 66 20 74 68 69 73 20 76 61 72 69 61 62    If this variab
0be0: 6c 65 20 69 73 20 6e 6f 74 20 73 65 74 2c 20 74  le is not set, t
0bf0: 68 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  he..        #   
0c00: 20 20 20 20 64 65 66 61 75 6c 74 20 76 61 6c 75      default valu
0c10: 65 20 77 69 6c 6c 20 62 65 20 62 61 73 65 64 20  e will be based 
0c20: 6f 6e 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  on whether or no
0c30: 74 20 45 61 67 6c 65 20 68 61 73 20 62 65 65 6e  t Eagle has been
0c40: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
0c50: 20 20 63 6f 6d 70 69 6c 65 64 20 61 67 61 69 6e    compiled again
0c60: 73 74 20 74 68 65 20 43 4c 52 20 76 32 2e 30 20  st the CLR v2.0 
0c70: 6f 72 20 43 4c 52 20 76 34 2e 30 2e 0d 0a 20 20  or CLR v4.0...  
0c80: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
0c90: 20 72 65 74 75 72 6e 20 24 3a 3a 74 65 73 74 5f   return $::test_
0ca0: 79 65 61 72 0d 0a 20 20 20 20 20 20 7d 20 65 6c  year..      } el
0cb0: 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d  se {..        #.
0cc0: 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
0cd0: 20 49 66 20 45 61 67 6c 65 20 68 61 73 20 62 65   If Eagle has be
0ce0: 65 6e 20 63 6f 6d 70 69 6c 65 64 20 61 67 61 69  en compiled agai
0cf0: 6e 73 74 20 74 68 65 20 43 4c 52 20 76 34 2e 30  nst the CLR v4.0
0d00: 2c 20 75 73 65 20 22 32 30 31 30 22 20 62 79 0d  , use "2010" by.
0d10: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
0d20: 20 64 65 66 61 75 6c 74 20 28 77 65 20 63 6f 75   default (we cou
0d30: 6c 64 20 75 73 65 20 22 32 30 31 32 22 2c 20 22  ld use "2012", "
0d40: 32 30 31 33 22 2c 20 6f 72 20 22 32 30 31 35 22  2013", or "2015"
0d50: 20 69 6e 20 74 68 61 74 20 63 61 73 65 20 61 73   in that case as
0d60: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
0d70: 20 20 77 65 6c 6c 29 20 61 73 20 74 68 65 20 74    well) as the t
0d80: 65 73 74 20 79 65 61 72 3b 20 6f 74 68 65 72 77  est year; otherw
0d90: 69 73 65 2c 20 75 73 65 20 22 32 30 30 38 22 20  ise, use "2008" 
0da0: 62 79 20 64 65 66 61 75 6c 74 20 28 77 65 0d 0a  by default (we..
0db0: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
0dc0: 63 6f 75 6c 64 20 75 73 65 20 22 32 30 30 35 22  could use "2005"
0dd0: 20 69 6e 20 74 68 61 74 20 63 61 73 65 20 61 73   in that case as
0de0: 20 77 65 6c 6c 29 2e 20 20 49 66 20 61 6e 6f 74   well).  If anot
0df0: 68 65 72 20 6d 61 6a 6f 72 0d 0a 20 20 20 20 20  her major..     
0e00: 20 20 20 23 20 20 20 20 20 20 20 5b 69 6e 63 6f     #       [inco
0e10: 6d 70 61 74 69 62 6c 65 5d 20 76 65 72 73 69 6f  mpatible] versio
0e20: 6e 20 6f 66 20 74 68 65 20 43 4c 52 20 69 73 20  n of the CLR is 
0e30: 72 65 6c 65 61 73 65 64 2c 20 74 68 69 73 20 63  released, this c
0e40: 68 65 63 6b 20 77 69 6c 6c 0d 0a 20 20 20 20 20  heck will..     
0e50: 20 20 20 23 20 20 20 20 20 20 20 68 61 76 65 20     #       have 
0e60: 74 6f 20 62 65 20 63 68 61 6e 67 65 64 2e 20 20  to be changed.  
0e70: 54 68 65 20 64 65 66 61 75 6c 74 20 74 65 73 74  The default test
0e80: 20 79 65 61 72 20 74 6f 20 75 73 65 20 66 6f 72   year to use for
0e90: 20 61 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20   a..        #   
0ea0: 20 20 20 20 70 61 72 74 69 63 75 6c 61 72 20 43      particular C
0eb0: 4c 52 20 76 65 72 73 69 6f 6e 20 6d 61 79 20 62  LR version may b
0ec0: 65 20 6f 76 65 72 72 69 64 64 65 6e 20 62 79 20  e overridden by 
0ed0: 73 65 74 74 69 6e 67 20 74 68 65 20 67 6c 6f 62  setting the glob
0ee0: 61 6c 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  al..        #   
0ef0: 20 20 20 20 76 61 72 69 61 62 6c 65 20 22 74 65      variable "te
0f00: 73 74 5f 79 65 61 72 5f 63 6c 72 5f 76 24 58 22  st_year_clr_v$X"
0f10: 2c 20 77 68 65 72 65 20 22 24 58 22 20 6d 61 79  , where "$X" may
0f20: 20 5b 63 75 72 72 65 6e 74 6c 79 5d 20 62 65 0d   [currently] be.
0f30: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
0f40: 20 65 69 74 68 65 72 20 22 32 22 20 6f 72 20 22   either "2" or "
0f50: 34 22 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  4"...        #..
0f60: 20 20 20 20 20 20 20 20 69 66 20 7b 5b 68 61 76          if {[hav
0f70: 65 43 6f 6e 73 74 72 61 69 6e 74 20 69 6d 61 67  eConstraint imag
0f80: 65 52 75 6e 74 69 6d 65 34 30 5d 7d 20 74 68 65  eRuntime40]} the
0f90: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69  n {..          i
0fa0: 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20  f {[info exists 
0fb0: 3a 3a 74 65 73 74 5f 79 65 61 72 5f 63 6c 72 5f  ::test_year_clr_
0fc0: 76 34 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20  v4] && \..      
0fd0: 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20          [string 
0fe0: 6c 65 6e 67 74 68 20 24 3a 3a 74 65 73 74 5f 79  length $::test_y
0ff0: 65 61 72 5f 63 6c 72 5f 76 34 5d 20 3e 20 30 7d  ear_clr_v4] > 0}
1000: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
1010: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
1020: 20 20 20 20 23 20 4e 4f 54 45 3a 20 55 73 65 20      # NOTE: Use 
1030: 74 68 65 20 73 70 65 63 69 66 69 65 64 20 74 65  the specified te
1040: 73 74 20 79 65 61 72 20 66 6f 72 20 74 68 65 20  st year for the 
1050: 43 4c 52 20 76 34 2e 30 2e 0d 0a 20 20 20 20 20  CLR v4.0...     
1060: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
1070: 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 3a 3a        return $::
1080: 74 65 73 74 5f 79 65 61 72 5f 63 6c 72 5f 76 34  test_year_clr_v4
1090: 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c  ..          } el
10a0: 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  se {..          
10b0: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20    #..           
10c0: 20 23 20 4e 4f 54 45 3a 20 55 73 65 20 74 68 65   # NOTE: Use the
10d0: 20 64 65 66 61 75 6c 74 20 74 65 73 74 20 79 65   default test ye
10e0: 61 72 20 66 6f 72 20 74 68 65 20 43 4c 52 20 76  ar for the CLR v
10f0: 34 2e 30 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  4.0...          
1100: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20    #..           
1110: 20 72 65 74 75 72 6e 20 32 30 31 30 3b 20 23 20   return 2010; # 
1120: 54 4f 44 4f 3a 20 47 6f 6f 64 20 22 66 61 6c 6c  TODO: Good "fall
1130: 62 61 63 6b 22 20 64 65 66 61 75 6c 74 3f 0d 0a  back" default?..
1140: 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
1150: 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
1160: 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 69 6e           if {[in
1170: 66 6f 20 65 78 69 73 74 73 20 3a 3a 74 65 73 74  fo exists ::test
1180: 5f 79 65 61 72 5f 63 6c 72 5f 76 32 5d 20 26 26  _year_clr_v2] &&
1190: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
11a0: 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68    [string length
11b0: 20 24 3a 3a 74 65 73 74 5f 79 65 61 72 5f 63 6c   $::test_year_cl
11c0: 72 5f 76 32 5d 20 3e 20 30 7d 20 74 68 65 6e 20  r_v2] > 0} then 
11d0: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23  {..            #
11e0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 20  ..            # 
11f0: 4e 4f 54 45 3a 20 55 73 65 20 74 68 65 20 73 70  NOTE: Use the sp
1200: 65 63 69 66 69 65 64 20 74 65 73 74 20 79 65 61  ecified test yea
1210: 72 20 66 6f 72 20 74 68 65 20 43 4c 52 20 76 32  r for the CLR v2
1220: 2e 30 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20  .0...           
1230: 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   #..            
1240: 72 65 74 75 72 6e 20 24 3a 3a 74 65 73 74 5f 79  return $::test_y
1250: 65 61 72 5f 63 6c 72 5f 76 32 0d 0a 20 20 20 20  ear_clr_v2..    
1260: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
1270: 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20              #.. 
1280: 20 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54             # NOT
1290: 45 3a 20 55 73 65 20 74 68 65 20 64 65 66 61 75  E: Use the defau
12a0: 6c 74 20 74 65 73 74 20 79 65 61 72 20 66 6f 72  lt test year for
12b0: 20 74 68 65 20 43 4c 52 20 76 32 2e 30 2e 0d 0a   the CLR v2.0...
12c0: 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20              #.. 
12d0: 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
12e0: 6e 20 32 30 30 38 3b 20 23 20 54 4f 44 4f 3a 20  n 2008; # TODO: 
12f0: 47 6f 6f 64 20 22 66 61 6c 6c 62 61 63 6b 22 20  Good "fallback" 
1300: 64 65 66 61 75 6c 74 3f 0d 0a 20 20 20 20 20 20  default?..      
1310: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d      }..        }
1320: 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d  ..      }..    }
1330: 0d 0a 0c 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20  .....    #..    
1340: 23 20 4e 4f 54 45 3a 20 54 68 69 73 20 70 72 6f  # NOTE: This pro
1350: 63 65 64 75 72 65 20 69 73 20 6f 6e 6c 79 20 75  cedure is only u
1360: 73 65 64 20 77 68 65 6e 20 61 64 64 69 6e 67 20  sed when adding 
1370: 73 68 69 6d 6d 65 64 20 74 65 73 74 20 63 6f 6e  shimmed test con
1380: 73 74 72 61 69 6e 74 73 2e 0d 0a 20 20 20 20 23  straints...    #
1390: 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74 42 75  ..    proc getBu
13a0: 69 6c 64 43 6c 72 56 65 72 73 69 6f 6e 20 7b 7d  ildClrVersion {}
13b0: 20 7b 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69   {..      if {[i
13c0: 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 74 65 73  nfo exists ::tes
13d0: 74 5f 63 6c 72 5d 20 26 26 20 5b 73 74 72 69 6e  t_clr] && [strin
13e0: 67 20 6c 65 6e 67 74 68 20 24 3a 3a 74 65 73 74  g length $::test
13f0: 5f 63 6c 72 5d 20 3e 20 30 7d 20 74 68 65 6e 20  _clr] > 0} then 
1400: 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
1410: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 55 73        # NOTE: Us
1420: 65 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  e the specified 
1430: 74 65 73 74 20 76 65 72 73 69 6f 6e 20 66 6f 72  test version for
1440: 20 74 68 65 20 43 4c 52 2e 20 20 49 66 20 74 68   the CLR.  If th
1450: 69 73 20 76 61 72 69 61 62 6c 65 0d 0a 20 20 20  is variable..   
1460: 20 20 20 20 20 23 20 20 20 20 20 20 20 69 73 20       #       is 
1470: 6e 6f 74 20 73 65 74 2c 20 74 68 65 20 64 65 66  not set, the def
1480: 61 75 6c 74 20 76 61 6c 75 65 20 77 69 6c 6c 20  ault value will 
1490: 62 65 20 62 61 73 65 64 20 6f 6e 20 77 68 65 74  be based on whet
14a0: 68 65 72 20 6f 72 20 6e 6f 74 0d 0a 20 20 20 20  her or not..    
14b0: 20 20 20 20 23 20 20 20 20 20 20 20 45 61 67 6c      #       Eagl
14c0: 65 20 68 61 73 20 62 65 65 6e 20 63 6f 6d 70 69  e has been compi
14d0: 6c 65 64 20 61 67 61 69 6e 73 74 20 74 68 65 20  led against the 
14e0: 43 4c 52 20 76 32 2e 30 20 6f 72 20 43 4c 52 20  CLR v2.0 or CLR 
14f0: 76 34 2e 30 2e 0d 0a 20 20 20 20 20 20 20 20 23  v4.0...        #
1500: 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ..        return
1510: 20 24 3a 3a 74 65 73 74 5f 63 6c 72 0d 0a 20 20   $::test_clr..  
1520: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
1530: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
1540: 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 69   # NOTE: Check i
1550: 66 20 45 61 67 6c 65 20 68 61 73 20 62 65 65 6e  f Eagle has been
1560: 20 63 6f 6d 70 69 6c 65 64 20 61 67 61 69 6e 73   compiled agains
1570: 74 20 74 68 65 20 43 4c 52 20 76 34 2e 30 2e 20  t the CLR v4.0. 
1580: 20 49 66 20 73 6f 2c 0d 0a 20 20 20 20 20 20 20   If so,..       
1590: 20 23 20 20 20 20 20 20 20 6a 75 73 74 20 75 73   #       just us
15a0: 65 20 74 68 61 74 20 43 4c 52 20 76 65 72 73 69  e that CLR versi
15b0: 6f 6e 2e 20 20 4f 74 68 65 72 77 69 73 65 2c 20  on.  Otherwise, 
15c0: 75 73 65 20 74 68 65 20 76 65 72 73 69 6f 6e 20  use the version 
15d0: 66 6f 72 20 74 68 65 0d 0a 20 20 20 20 20 20 20  for the..       
15e0: 20 23 20 20 20 20 20 20 20 43 4c 52 20 76 32 2e   #       CLR v2.
15f0: 30 2e 20 20 49 66 20 61 6e 6f 74 68 65 72 20 6d  0.  If another m
1600: 61 6a 6f 72 20 5b 69 6e 63 6f 6d 70 61 74 69 62  ajor [incompatib
1610: 6c 65 5d 20 76 65 72 73 69 6f 6e 20 6f 66 20 74  le] version of t
1620: 68 65 20 43 4c 52 0d 0a 20 20 20 20 20 20 20 20  he CLR..        
1630: 23 20 20 20 20 20 20 20 69 73 20 72 65 6c 65 61  #       is relea
1640: 73 65 64 2c 20 74 68 69 73 20 63 68 65 63 6b 20  sed, this check 
1650: 77 69 6c 6c 20 68 61 76 65 20 74 6f 20 62 65 20  will have to be 
1660: 63 68 61 6e 67 65 64 2e 20 20 54 68 65 20 64 65  changed.  The de
1670: 66 61 75 6c 74 0d 0a 20 20 20 20 20 20 20 20 23  fault..        #
1680: 20 20 20 20 20 20 20 76 65 72 73 69 6f 6e 20 76         version v
1690: 61 6c 75 65 20 66 6f 72 20 61 20 70 61 72 74 69  alue for a parti
16a0: 63 75 6c 61 72 20 43 4c 52 20 76 65 72 73 69 6f  cular CLR versio
16b0: 6e 20 6d 61 79 20 62 65 20 6f 76 65 72 72 69 64  n may be overrid
16c0: 64 65 6e 0d 0a 20 20 20 20 20 20 20 20 23 20 20  den..        #  
16d0: 20 20 20 20 20 62 79 20 73 65 74 74 69 6e 67 20       by setting 
16e0: 74 68 65 20 67 6c 6f 62 61 6c 20 76 61 72 69 61  the global varia
16f0: 62 6c 65 20 22 74 65 73 74 5f 63 6c 72 5f 76 24  ble "test_clr_v$
1700: 58 22 2c 20 77 68 65 72 65 20 22 24 58 22 20 6d  X", where "$X" m
1710: 61 79 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  ay..        #   
1720: 20 20 20 20 5b 63 75 72 72 65 6e 74 6c 79 5d 20      [currently] 
1730: 62 65 20 65 69 74 68 65 72 20 22 32 22 20 6f 72  be either "2" or
1740: 20 22 34 22 2e 0d 0a 20 20 20 20 20 20 20 20 23   "4"...        #
1750: 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 68  ..        if {[h
1760: 61 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 69 6d  aveConstraint im
1770: 61 67 65 52 75 6e 74 69 6d 65 34 30 5d 7d 20 74  ageRuntime40]} t
1780: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
1790: 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74   if {[info exist
17a0: 73 20 3a 3a 74 65 73 74 5f 63 6c 72 5f 76 34 5d  s ::test_clr_v4]
17b0: 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20   && \..         
17c0: 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e       [string len
17d0: 67 74 68 20 24 3a 3a 74 65 73 74 5f 63 6c 72 5f  gth $::test_clr_
17e0: 76 34 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d  v4] > 0} then {.
17f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a  .            #..
1800: 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f              # NO
1810: 54 45 3a 20 55 73 65 20 74 68 65 20 73 70 65 63  TE: Use the spec
1820: 69 66 69 65 64 20 74 65 73 74 20 76 65 72 73 69  ified test versi
1830: 6f 6e 20 66 6f 72 20 74 68 65 20 43 4c 52 20 76  on for the CLR v
1840: 34 2e 30 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  4.0...          
1850: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20    #..           
1860: 20 72 65 74 75 72 6e 20 24 3a 3a 74 65 73 74 5f   return $::test_
1870: 63 6c 72 5f 76 34 0d 0a 20 20 20 20 20 20 20 20  clr_v4..        
1880: 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
1890: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
18a0: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 55         # NOTE: U
18b0: 73 65 20 74 68 65 20 64 65 66 61 75 6c 74 20 74  se the default t
18c0: 65 73 74 20 76 65 72 73 69 6f 6e 20 66 6f 72 20  est version for 
18d0: 74 68 65 20 43 4c 52 20 76 34 2e 30 2e 0d 0a 20  the CLR v4.0... 
18e0: 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
18f0: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
1900: 20 34 2e 30 2e 33 30 33 31 39 3b 20 23 20 54 4f   4.0.30319; # TO
1910: 44 4f 3a 20 47 6f 6f 64 20 22 66 61 6c 6c 62 61  DO: Good "fallba
1920: 63 6b 22 20 64 65 66 61 75 6c 74 3f 0d 0a 20 20  ck" default?..  
1930: 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
1940: 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
1950: 20 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f         if {[info
1960: 20 65 78 69 73 74 73 20 3a 3a 74 65 73 74 5f 63   exists ::test_c
1970: 6c 72 5f 76 32 5d 20 26 26 20 5c 0d 0a 20 20 20  lr_v2] && \..   
1980: 20 20 20 20 20 20 20 20 20 20 20 5b 73 74 72 69             [stri
1990: 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a 74 65 73  ng length $::tes
19a0: 74 5f 63 6c 72 5f 76 32 5d 20 3e 20 30 7d 20 74  t_clr_v2] > 0} t
19b0: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
19c0: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
19d0: 20 20 23 20 4e 4f 54 45 3a 20 55 73 65 20 74 68    # NOTE: Use th
19e0: 65 20 73 70 65 63 69 66 69 65 64 20 74 65 73 74  e specified test
19f0: 20 76 65 72 73 69 6f 6e 20 66 6f 72 20 74 68 65   version for the
1a00: 20 43 4c 52 20 76 32 2e 30 2e 0d 0a 20 20 20 20   CLR v2.0...    
1a10: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
1a20: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 3a         return $:
1a30: 3a 74 65 73 74 5f 63 6c 72 5f 76 32 0d 0a 20 20  :test_clr_v2..  
1a40: 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b          } else {
1a50: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 0d  ..            #.
1a60: 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4e  .            # N
1a70: 4f 54 45 3a 20 55 73 65 20 74 68 65 20 64 65 66  OTE: Use the def
1a80: 61 75 6c 74 20 74 65 73 74 20 76 65 72 73 69 6f  ault test versio
1a90: 6e 20 66 6f 72 20 74 68 65 20 43 4c 52 20 76 32  n for the CLR v2
1aa0: 2e 30 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20  .0...           
1ab0: 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   #..            
1ac0: 72 65 74 75 72 6e 20 32 2e 30 2e 35 30 37 32 37  return 2.0.50727
1ad0: 3b 20 23 20 54 4f 44 4f 3a 20 47 6f 6f 64 20 22  ; # TODO: Good "
1ae0: 66 61 6c 6c 62 61 63 6b 22 20 64 65 66 61 75 6c  fallback" defaul
1af0: 74 3f 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d  t?..          }.
1b00: 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  .        }..    
1b10: 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20    }..    }..... 
1b20: 20 20 20 70 72 6f 63 20 67 65 74 42 75 69 6c 64     proc getBuild
1b30: 59 65 61 72 73 20 7b 7d 20 7b 0d 0a 20 20 20 20  Years {} {..    
1b40: 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
1b50: 45 3a 20 53 65 65 20 69 66 20 74 68 65 20 6c 69  E: See if the li
1b60: 73 74 20 6f 66 20 74 65 73 74 20 79 65 61 72 73  st of test years
1b70: 20 68 61 73 20 62 65 65 6e 20 6f 76 65 72 72 69   has been overri
1b80: 64 64 65 6e 20 62 79 20 74 68 65 20 75 73 65 72  dden by the user
1b90: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
1ba0: 28 65 2e 67 2e 20 6f 6e 20 74 68 65 20 63 6f 6d  (e.g. on the com
1bb0: 6d 61 6e 64 20 6c 69 6e 65 29 2e 0d 0a 20 20 20  mand line)...   
1bc0: 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
1bd0: 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 74  [info exists ::t
1be0: 65 73 74 5f 79 65 61 72 73 5d 20 26 26 20 5b 6c  est_years] && [l
1bf0: 6c 65 6e 67 74 68 20 24 3a 3a 74 65 73 74 5f 79  length $::test_y
1c00: 65 61 72 73 5d 20 3e 20 30 7d 20 74 68 65 6e 20  ears] > 0} then 
1c10: 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
1c20: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 55 73        # NOTE: Us
1c30: 65 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  e the specified 
1c40: 6c 69 73 74 20 6f 66 20 74 65 73 74 20 79 65 61  list of test yea
1c50: 72 73 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  rs...        #..
1c60: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 24          return $
1c70: 3a 3a 74 65 73 74 5f 79 65 61 72 73 0d 0a 20 20  ::test_years..  
1c80: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
1c90: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
1ca0: 20 23 20 4e 4f 54 45 3a 20 55 73 65 20 74 68 65   # NOTE: Use the
1cb0: 20 64 65 66 61 75 6c 74 20 6c 69 73 74 20 6f 66   default list of
1cc0: 20 74 65 73 74 20 79 65 61 72 73 20 28 69 2e 65   test years (i.e
1cd0: 2e 20 61 6c 6c 29 2e 0d 0a 20 20 20 20 20 20 20  . all)...       
1ce0: 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75   #..        retu
1cf0: 72 6e 20 5b 6c 69 73 74 20 32 30 30 35 20 32 30  rn [list 2005 20
1d00: 30 38 20 32 30 31 30 20 32 30 31 32 20 32 30 31  08 2010 2012 201
1d10: 33 20 32 30 31 35 5d 0d 0a 20 20 20 20 20 20 7d  3 2015]..      }
1d20: 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
1d30: 70 72 6f 63 20 67 65 74 42 75 69 6c 64 4e 65 74  proc getBuildNet
1d40: 46 78 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 23  Fx {} {..      #
1d50: 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
1d60: 53 65 65 20 69 66 20 74 68 65 20 74 65 73 74 20  See if the test 
1d70: 2e 4e 45 54 20 46 72 61 6d 65 77 6f 72 6b 20 73  .NET Framework s
1d80: 65 74 74 69 6e 67 20 68 61 73 20 62 65 65 6e 20  etting has been 
1d90: 6f 76 65 72 72 69 64 64 65 6e 20 62 79 0d 0a 20  overridden by.. 
1da0: 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68 65       #       the
1db0: 20 75 73 65 72 20 28 65 2e 67 2e 20 6f 6e 20 74   user (e.g. on t
1dc0: 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 29  he command line)
1dd0: 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
1de0: 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73    if {[info exis
1df0: 74 73 20 3a 3a 74 65 73 74 5f 6e 65 74 5f 66 78  ts ::test_net_fx
1e00: 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20  ] && \..        
1e10: 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68    [string length
1e20: 20 24 3a 3a 74 65 73 74 5f 6e 65 74 5f 66 78 5d   $::test_net_fx]
1e30: 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20   > 0} then {..  
1e40: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
1e50: 20 23 20 4e 4f 54 45 3a 20 55 73 65 20 74 68 65   # NOTE: Use the
1e60: 20 73 70 65 63 69 66 69 65 64 20 74 65 73 74 20   specified test 
1e70: 2e 4e 45 54 20 46 72 61 6d 65 77 6f 72 6b 2e 0d  .NET Framework..
1e80: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
1e90: 20 20 20 20 72 65 74 75 72 6e 20 24 3a 3a 74 65      return $::te
1ea0: 73 74 5f 6e 65 74 5f 66 78 0d 0a 20 20 20 20 20  st_net_fx..     
1eb0: 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
1ec0: 20 20 20 73 65 74 20 79 65 61 72 20 5b 67 65 74     set year [get
1ed0: 42 75 69 6c 64 59 65 61 72 5d 0d 0a 20 20 20 20  BuildYear]..    
1ee0: 20 20 20 20 73 65 74 20 79 65 61 72 56 61 72 4e      set yearVarN
1ef0: 61 6d 65 20 5b 61 70 70 65 6e 64 41 72 67 73 20  ame [appendArgs 
1f00: 3a 3a 74 65 73 74 5f 6e 65 74 5f 66 78 5f 20 24  ::test_net_fx_ $
1f10: 79 65 61 72 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  year]....       
1f20: 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74   if {[info exist
1f30: 73 20 24 79 65 61 72 56 61 72 4e 61 6d 65 5d 20  s $yearVarName] 
1f40: 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  && \..          
1f50: 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68    [string length
1f60: 20 5b 73 65 74 20 24 79 65 61 72 56 61 72 4e 61   [set $yearVarNa
1f70: 6d 65 5d 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b  me]] > 0} then {
1f80: 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20  ..          #.. 
1f90: 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a           # NOTE:
1fa0: 20 55 73 65 20 74 68 65 20 73 70 65 63 69 66 69   Use the specifi
1fb0: 65 64 20 74 65 73 74 20 2e 4e 45 54 20 46 72 61  ed test .NET Fra
1fc0: 6d 65 77 6f 72 6b 2c 20 62 61 73 65 64 20 6f 6e  mework, based on
1fd0: 20 74 68 65 20 62 75 69 6c 64 0d 0a 20 20 20 20   the build..    
1fe0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 79 65        #       ye
1ff0: 61 72 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23  ar...          #
2000: 0d 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ..          retu
2010: 72 6e 20 5b 73 65 74 20 24 79 65 61 72 56 61 72  rn [set $yearVar
2020: 4e 61 6d 65 5d 0d 0a 20 20 20 20 20 20 20 20 7d  Name]..        }
2030: 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
2040: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
2050: 23 20 4e 4f 54 45 3a 20 46 61 6c 6c 62 61 63 6b  # NOTE: Fallback
2060: 20 74 6f 20 74 68 65 20 22 77 65 6c 6c 20 6b 6e   to the "well kn
2070: 6f 77 6e 22 20 2e 4e 45 54 20 46 72 61 6d 65 77  own" .NET Framew
2080: 6f 72 6b 20 76 65 72 73 69 6f 6e 20 74 68 61 74  ork version that
2090: 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 20 20  ..          #   
20a0: 20 20 20 20 69 73 20 6d 6f 73 74 20 63 6c 6f 73      is most clos
20b0: 65 6c 79 20 61 73 73 6f 63 69 61 74 65 64 20 77  ely associated w
20c0: 69 74 68 20 61 20 70 61 72 74 69 63 75 6c 61 72  ith a particular
20d0: 20 76 65 72 73 69 6f 6e 20 6f 66 0d 0a 20 20 20   version of..   
20e0: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 56         #       V
20f0: 69 73 75 61 6c 20 53 74 75 64 69 6f 2e 0d 0a 20  isual Studio... 
2100: 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
2110: 20 20 20 20 20 20 73 77 69 74 63 68 20 2d 65 78        switch -ex
2120: 61 63 74 20 2d 2d 20 24 79 65 61 72 20 7b 0d 0a  act -- $year {..
2130: 20 20 20 20 20 20 20 20 20 20 20 20 32 30 30 35              2005
2140: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
2150: 20 20 72 65 74 75 72 6e 20 6e 65 74 46 78 32 30    return netFx20
2160: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
2170: 0a 20 20 20 20 20 20 20 20 20 20 20 20 32 30 30  .            200
2180: 38 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  8 {..           
2190: 20 20 20 72 65 74 75 72 6e 20 6e 65 74 46 78 33     return netFx3
21a0: 35 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  5..            }
21b0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 32 30  ..            20
21c0: 31 30 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  10 {..          
21d0: 20 20 20 20 72 65 74 75 72 6e 20 6e 65 74 46 78      return netFx
21e0: 34 30 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  40..            
21f0: 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 32  }..            2
2200: 30 31 32 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  012 {..         
2210: 20 20 20 20 20 72 65 74 75 72 6e 20 6e 65 74 46       return netF
2220: 78 34 35 0d 0a 20 20 20 20 20 20 20 20 20 20 20  x45..           
2230: 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   }..            
2240: 32 30 31 33 20 7b 0d 0a 20 20 20 20 20 20 20 20  2013 {..        
2250: 20 20 20 20 20 20 72 65 74 75 72 6e 20 6e 65 74        return net
2260: 46 78 34 35 31 3b 20 23 20 54 4f 44 4f 3a 20 4f  Fx451; # TODO: O
2270: 72 20 22 6e 65 74 46 78 34 35 32 22 3f 0d 0a 20  r "netFx452"?.. 
2280: 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
2290: 20 20 20 20 20 20 20 20 20 20 32 30 31 35 20 7b            2015 {
22a0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
22b0: 72 65 74 75 72 6e 20 6e 65 74 46 78 34 36 3b 20  return netFx46; 
22c0: 23 20 54 4f 44 4f 3a 20 4f 72 20 22 6e 65 74 46  # TODO: Or "netF
22d0: 78 34 36 31 22 20 2f 20 22 6e 65 74 46 78 34 36  x461" / "netFx46
22e0: 32 22 3f 0d 0a 20 20 20 20 20 20 20 20 20 20 20  2"?..           
22f0: 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   }..            
2300: 64 65 66 61 75 6c 74 20 7b 0d 0a 20 20 20 20 20  default {..     
2310: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
2320: 6e 65 74 46 78 33 35 3b 20 23 20 54 4f 44 4f 3a  netFx35; # TODO:
2330: 20 47 6f 6f 64 20 22 66 61 6c 6c 62 61 63 6b 22   Good "fallback"
2340: 20 64 65 66 61 75 6c 74 3f 0d 0a 20 20 20 20 20   default?..     
2350: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
2360: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d      }..        }
2370: 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d  ..      }..    }
2380: 0d 0a 0c 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20  .....    #..    
2390: 23 20 4e 4f 54 45 3a 20 54 68 69 73 20 70 72 6f  # NOTE: This pro
23a0: 63 65 64 75 72 65 20 73 68 6f 75 6c 64 20 72 65  cedure should re
23b0: 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66  turn non-zero if
23c0: 20 74 68 65 20 63 6f 6e 66 69 67 75 72 65 64 20   the configured 
23d0: 74 65 73 74 0d 0a 20 20 20 20 23 20 20 20 20 20  test..    #     
23e0: 20 20 70 6c 61 74 66 6f 72 6d 20 69 73 20 6d 6f    platform is mo
23f0: 73 74 20 6c 69 6b 65 6c 79 20 74 68 65 20 64 65  st likely the de
2400: 66 61 75 6c 74 20 66 6f 72 20 74 68 69 73 20 6d  fault for this m
2410: 61 63 68 69 6e 65 2e 0d 0a 20 20 20 20 23 0d 0a  achine...    #..
2420: 20 20 20 20 70 72 6f 63 20 69 73 44 65 66 61 75      proc isDefau
2430: 6c 74 42 75 69 6c 64 50 6c 61 74 66 6f 72 6d 20  ltBuildPlatform 
2440: 7b 20 7b 76 65 72 62 6f 73 65 20 74 72 75 65 7d  { {verbose true}
2450: 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20   } {..      #.. 
2460: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 52 75 6e       # NOTE: Run
2470: 6e 69 6e 67 20 6f 6e 20 57 6f 57 36 34 20 69 73  ning on WoW64 is
2480: 20 6e 65 76 65 72 20 74 68 65 20 64 65 66 61 75   never the defau
2490: 6c 74 20 70 6c 61 74 66 6f 72 6d 2e 0d 0a 20 20  lt platform...  
24a0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20      #..      if 
24b0: 7b 5b 69 73 52 75 6e 6e 69 6e 67 57 6f 57 36 34  {[isRunningWoW64
24c0: 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
24d0: 20 20 20 69 66 20 7b 24 76 65 72 62 6f 73 65 7d     if {$verbose}
24e0: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
24f0: 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
2500: 5f 63 68 61 6e 6e 65 6c 20 5c 0d 0a 20 20 20 20  _channel \..    
2510: 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
2520: 64 65 74 65 63 74 65 64 20 6e 6f 6e 2d 64 65 66  detected non-def
2530: 61 75 6c 74 20 70 6c 61 74 66 6f 72 6d 20 28 57  ault platform (W
2540: 6f 57 36 34 29 5c 6e 22 0d 0a 20 20 20 20 20 20  oW64)\n"..      
2550: 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 72    }....        r
2560: 65 74 75 72 6e 20 66 61 6c 73 65 0d 0a 20 20 20  eturn false..   
2570: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d     }....      #.
2580: 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54  .      # NOTE: T
2590: 68 69 73 20 68 61 73 20 61 20 67 6f 6f 64 20 63  his has a good c
25a0: 68 61 6e 63 65 20 6f 66 20 62 65 69 6e 67 20 74  hance of being t
25b0: 68 65 20 64 65 66 61 75 6c 74 20 70 6c 61 74 66  he default platf
25c0: 6f 72 6d 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  orm...      #.. 
25d0: 20 20 20 20 20 69 66 20 7b 24 76 65 72 62 6f 73       if {$verbos
25e0: 65 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  e} then {..     
25f0: 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
2600: 5f 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 64  _channel "---- d
2610: 65 74 65 63 74 65 64 20 64 65 66 61 75 6c 74 20  etected default 
2620: 70 6c 61 74 66 6f 72 6d 5c 6e 22 0d 0a 20 20 20  platform\n"..   
2630: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65     }....      re
2640: 74 75 72 6e 20 74 72 75 65 0d 0a 20 20 20 20 7d  turn true..    }
2650: 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65  .....    proc ge
2660: 74 42 75 69 6c 64 50 6c 61 74 66 6f 72 6d 20 7b  tBuildPlatform {
2670: 20 6e 61 74 69 76 65 20 7d 20 7b 0d 0a 20 20 20   native } {..   
2680: 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69     if {[info exi
2690: 73 74 73 20 3a 3a 74 65 73 74 5f 70 6c 61 74 66  sts ::test_platf
26a0: 6f 72 6d 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20  orm] && \..     
26b0: 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e       [string len
26c0: 67 74 68 20 24 3a 3a 74 65 73 74 5f 70 6c 61 74  gth $::test_plat
26d0: 66 6f 72 6d 5d 20 3e 20 30 7d 20 74 68 65 6e 20  form] > 0} then 
26e0: 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
26f0: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 55 73        # NOTE: Us
2700: 65 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  e the specified 
2710: 74 65 73 74 20 70 6c 61 74 66 6f 72 6d 2e 20 20  test platform.  
2720: 49 66 20 74 68 69 73 20 76 61 72 69 61 62 6c 65  If this variable
2730: 20 69 73 20 6e 6f 74 20 73 65 74 2c 0d 0a 20 20   is not set,..  
2740: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68        #       th
2750: 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20  e default value 
2760: 77 69 6c 6c 20 62 65 20 62 61 73 65 64 20 6f 6e  will be based on
2770: 20 74 68 65 20 6d 61 63 68 69 6e 65 20 61 72 63   the machine arc
2780: 68 69 74 65 63 74 75 72 65 2e 0d 0a 20 20 20 20  hitecture...    
2790: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72      #..        r
27a0: 65 74 75 72 6e 20 5b 65 78 70 72 20 7b 24 6e 61  eturn [expr {$na
27b0: 74 69 76 65 20 3f 20 24 3a 3a 74 65 73 74 5f 70  tive ? $::test_p
27c0: 6c 61 74 66 6f 72 6d 20 3a 20 22 22 7d 5d 0d 0a  latform : ""}]..
27d0: 20 20 20 20 20 20 7d 20 65 6c 73 65 69 66 20 7b        } elseif {
27e0: 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 74  [info exists ::t
27f0: 65 73 74 5f 6d 61 63 68 69 6e 65 5d 20 26 26 20  est_machine] && 
2800: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 73 74  \..          [st
2810: 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a 74  ring length $::t
2820: 65 73 74 5f 6d 61 63 68 69 6e 65 5d 20 3e 20 30  est_machine] > 0
2830: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
2840: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
2850: 4f 54 45 3a 20 46 6f 72 20 6e 61 74 69 76 65 20  OTE: For native 
2860: 62 75 69 6c 64 73 2c 20 72 65 74 75 72 6e 20 74  builds, return t
2870: 68 65 20 70 6c 61 74 66 6f 72 6d 20 6e 61 6d 65  he platform name
2880: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74   corresponding t
2890: 6f 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  o..        #    
28a0: 20 20 20 74 68 65 20 74 65 73 74 20 6d 61 63 68     the test mach
28b0: 69 6e 65 20 61 72 63 68 69 74 65 63 74 75 72 65  ine architecture
28c0: 3b 20 6f 74 68 65 72 77 69 73 65 2c 20 72 65 74  ; otherwise, ret
28d0: 75 72 6e 20 61 6e 20 65 6d 70 74 79 0d 0a 20 20  urn an empty..  
28e0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 73 74        #       st
28f0: 72 69 6e 67 2e 0d 0a 20 20 20 20 20 20 20 20 23  ring...        #
2900: 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ..        return
2910: 20 5b 65 78 70 72 20 7b 0d 0a 20 20 20 20 20 20   [expr {..      
2920: 20 20 20 20 24 6e 61 74 69 76 65 20 3f 20 5b 6d      $native ? [m
2930: 61 63 68 69 6e 65 54 6f 50 6c 61 74 66 6f 72 6d  achineToPlatform
2940: 20 24 3a 3a 74 65 73 74 5f 6d 61 63 68 69 6e 65   $::test_machine
2950: 5d 20 3a 20 22 22 0d 0a 20 20 20 20 20 20 20 20  ] : ""..        
2960: 7d 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65  }]..      } else
2970: 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73  if {[info exists
2980: 20 3a 3a 74 63 6c 5f 70 6c 61 74 66 6f 72 6d 28   ::tcl_platform(
2990: 6d 61 63 68 69 6e 65 29 5d 7d 20 74 68 65 6e 20  machine)]} then 
29a0: 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
29b0: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 46 6f        # NOTE: Fo
29c0: 72 20 6e 61 74 69 76 65 20 62 75 69 6c 64 73 2c  r native builds,
29d0: 20 72 65 74 75 72 6e 20 74 68 65 20 70 6c 61 74   return the plat
29e0: 66 6f 72 6d 20 6e 61 6d 65 20 63 6f 72 72 65 73  form name corres
29f0: 70 6f 6e 64 69 6e 67 20 74 6f 0d 0a 20 20 20 20  ponding to..    
2a00: 20 20 20 20 23 20 20 20 20 20 20 20 74 68 65 20      #       the 
2a10: 6d 61 63 68 69 6e 65 20 61 72 63 68 69 74 65 63  machine architec
2a20: 74 75 72 65 3b 20 6f 74 68 65 72 77 69 73 65 2c  ture; otherwise,
2a30: 20 72 65 74 75 72 6e 20 61 6e 20 65 6d 70 74 79   return an empty
2a40: 20 73 74 72 69 6e 67 2e 0d 0a 20 20 20 20 20 20   string...      
2a50: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74    #..        ret
2a60: 75 72 6e 20 5b 65 78 70 72 20 7b 0d 0a 20 20 20  urn [expr {..   
2a70: 20 20 20 20 20 20 20 24 6e 61 74 69 76 65 20 3f         $native ?
2a80: 20 5b 6d 61 63 68 69 6e 65 54 6f 50 6c 61 74 66   [machineToPlatf
2a90: 6f 72 6d 20 24 3a 3a 74 63 6c 5f 70 6c 61 74 66  orm $::tcl_platf
2aa0: 6f 72 6d 28 6d 61 63 68 69 6e 65 29 5d 20 3a 20  orm(machine)] : 
2ab0: 22 22 0d 0a 20 20 20 20 20 20 20 20 7d 5d 0d 0a  ""..        }]..
2ac0: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
2ad0: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
2ae0: 20 20 20 23 20 4e 4f 54 45 3a 20 4e 6f 20 6d 61     # NOTE: No ma
2af0: 63 68 69 6e 65 20 61 72 63 68 69 74 65 63 74 75  chine architectu
2b00: 72 65 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2c  re is available,
2b10: 20 72 65 74 75 72 6e 20 61 6e 20 65 6d 70 74 79   return an empty
2b20: 20 73 74 72 69 6e 67 2e 0d 0a 20 20 20 20 20 20   string...      
2b30: 20 20 23 20 20 20 20 20 20 20 49 74 20 69 73 20    #       It is 
2b40: 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 72 65 74  important to ret
2b50: 75 72 6e 20 61 6e 20 65 6d 70 74 79 20 73 74 72  urn an empty str
2b60: 69 6e 67 20 68 65 72 65 20 62 65 63 61 75 73 65  ing here because
2b70: 20 74 68 65 0d 0a 20 20 20 20 20 20 20 20 23 20   the..        # 
2b80: 20 20 20 20 20 20 72 65 73 75 6c 74 20 6f 66 20        result of 
2b90: 74 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 6d  this procedure m
2ba0: 61 79 20 62 65 20 75 73 65 64 20 77 69 74 68 20  ay be used with 
2bb0: 5b 66 69 6c 65 20 6a 6f 69 6e 5d 2e 0d 0a 20 20  [file join]...  
2bc0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
2bd0: 20 72 65 74 75 72 6e 20 22 22 0d 0a 20 20 20 20   return ""..    
2be0: 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20    }..    }..... 
2bf0: 20 20 20 70 72 6f 63 20 67 65 74 42 75 69 6c 64     proc getBuild
2c00: 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 7b 7d  Configuration {}
2c10: 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20   {..      #..   
2c20: 20 20 20 23 20 4e 4f 54 45 3a 20 53 65 65 20 69     # NOTE: See i
2c30: 66 20 74 68 65 20 22 63 6f 6e 66 69 67 75 72 61  f the "configura
2c40: 74 69 6f 6e 22 20 73 65 74 74 69 6e 67 20 68 61  tion" setting ha
2c50: 73 20 62 65 65 6e 20 6f 76 65 72 72 69 64 64 65  s been overridde
2c60: 6e 20 62 79 20 74 68 65 0d 0a 20 20 20 20 20 20  n by the..      
2c70: 23 20 20 20 20 20 20 20 75 73 65 72 20 28 65 2e  #       user (e.
2c80: 67 2e 20 6f 6e 20 74 68 65 20 63 6f 6d 6d 61 6e  g. on the comman
2c90: 64 20 6c 69 6e 65 29 2e 20 20 54 68 69 73 20 68  d line).  This h
2ca0: 65 6c 70 73 20 63 6f 6e 74 72 6f 6c 20 65 78 61  elps control exa
2cb0: 63 74 6c 79 0d 0a 20 20 20 20 20 20 23 20 20 20  ctly..      #   
2cc0: 20 20 20 20 77 68 69 63 68 20 73 65 74 20 6f 66      which set of
2cd0: 20 62 69 6e 61 72 69 65 73 20 77 65 20 61 72 65   binaries we are
2ce0: 20 74 65 73 74 69 6e 67 20 28 69 2e 65 2e 20 74   testing (i.e. t
2cf0: 68 6f 73 65 20 62 75 69 6c 74 20 69 6e 20 74 68  hose built in th
2d00: 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  e..      #      
2d10: 20 22 44 65 62 75 67 22 20 6f 72 20 22 52 65 6c   "Debug" or "Rel
2d20: 65 61 73 65 22 20 62 75 69 6c 64 20 63 6f 6e 66  ease" build conf
2d30: 69 67 75 72 61 74 69 6f 6e 73 29 2e 20 20 54 6f  igurations).  To
2d40: 20 6f 76 65 72 72 69 64 65 20 74 68 69 73 0d 0a   override this..
2d50: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 76 61        #       va
2d60: 6c 75 65 20 76 69 61 20 74 68 65 20 63 6f 6d 6d  lue via the comm
2d70: 61 6e 64 20 6c 69 6e 65 2c 20 65 6e 74 65 72 20  and line, enter 
2d80: 61 20 63 6f 6d 6d 61 6e 64 20 73 69 6d 69 6c 61  a command simila
2d90: 72 20 74 6f 20 6f 6e 65 20 6f 66 0d 0a 20 20 20  r to one of..   
2da0: 20 20 20 23 20 20 20 20 20 20 20 74 68 65 20 66     #       the f
2db0: 6f 6c 6c 6f 77 69 6e 67 20 28 61 6c 6c 20 6f 6e  ollowing (all on
2dc0: 20 6f 6e 65 20 6c 69 6e 65 29 3a 0d 0a 20 20 20   one line):..   
2dd0: 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 20 20     #..      #   
2de0: 20 20 20 20 45 61 67 6c 65 53 68 65 6c 6c 2e 65      EagleShell.e
2df0: 78 65 20 2d 61 6e 79 49 6e 69 74 69 61 6c 69 7a  xe -anyInitializ
2e00: 65 20 22 73 65 74 20 74 65 73 74 5f 63 6f 6e 66  e "set test_conf
2e10: 69 67 75 72 61 74 69 6f 6e 20 44 65 62 75 67 22  iguration Debug"
2e20: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
2e30: 20 20 2d 66 69 6c 65 20 2e 5c 70 61 74 68 5c 74    -file .\path\t
2e40: 6f 5c 61 6c 6c 2e 65 61 67 6c 65 0d 0a 20 20 20  o\all.eagle..   
2e50: 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 20 20     #..      #   
2e60: 20 20 20 20 45 61 67 6c 65 53 68 65 6c 6c 2e 65      EagleShell.e
2e70: 78 65 20 2d 61 6e 79 49 6e 69 74 69 61 6c 69 7a  xe -anyInitializ
2e80: 65 20 22 73 65 74 20 74 65 73 74 5f 63 6f 6e 66  e "set test_conf
2e90: 69 67 75 72 61 74 69 6f 6e 20 52 65 6c 65 61 73  iguration Releas
2ea0: 65 22 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  e"..      #     
2eb0: 20 20 20 20 2d 66 69 6c 65 20 2e 5c 70 61 74 68      -file .\path
2ec0: 5c 74 6f 5c 61 6c 6c 2e 65 61 67 6c 65 0d 0a 20  \to\all.eagle.. 
2ed0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
2ee0: 20 20 20 20 20 20 45 61 67 6c 65 53 68 65 6c 6c        EagleShell
2ef0: 2e 65 78 65 20 2d 66 69 6c 65 20 2e 5c 70 61 74  .exe -file .\pat
2f00: 68 5c 74 6f 5c 61 6c 6c 2e 65 61 67 6c 65 20 2d  h\to\all.eagle -
2f10: 70 72 65 54 65 73 74 0d 0a 20 20 20 20 20 20 23  preTest..      #
2f20: 20 20 20 20 20 20 20 20 20 22 75 6e 73 65 74 20           "unset 
2f30: 2d 6e 6f 63 6f 6d 70 6c 61 69 6e 20 74 65 73 74  -nocomplain test
2f40: 5f 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 22 0d  _configuration".
2f50: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
2f60: 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73  if {[info exists
2f70: 20 3a 3a 74 65 73 74 5f 63 6f 6e 66 69 67 75 72   ::test_configur
2f80: 61 74 69 6f 6e 5d 20 26 26 20 5c 0d 0a 20 20 20  ation] && \..   
2f90: 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c         [string l
2fa0: 65 6e 67 74 68 20 24 3a 3a 74 65 73 74 5f 63 6f  ength $::test_co
2fb0: 6e 66 69 67 75 72 61 74 69 6f 6e 5d 20 3e 20 30  nfiguration] > 0
2fc0: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
2fd0: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
2fe0: 4f 54 45 3a 20 55 73 65 20 74 68 65 20 73 70 65  OTE: Use the spe
2ff0: 63 69 66 69 65 64 20 74 65 73 74 20 63 6f 6e 66  cified test conf
3000: 69 67 75 72 61 74 69 6f 6e 2e 20 20 54 68 65 20  iguration.  The 
3010: 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20 75 73  default value us
3020: 65 64 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  ed..        #   
3030: 20 20 20 20 66 6f 72 20 74 68 69 73 20 76 61 72      for this var
3040: 69 61 62 6c 65 20 69 73 20 74 79 70 69 63 61 6c  iable is typical
3050: 6c 79 20 22 52 65 6c 65 61 73 65 22 2c 20 61 73  ly "Release", as
3060: 20 73 65 74 20 62 79 20 74 68 65 20 74 65 73 74   set by the test
3070: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
3080: 20 20 73 75 69 74 65 20 69 74 73 65 6c 66 2e 0d    suite itself..
3090: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
30a0: 20 20 20 20 72 65 74 75 72 6e 20 24 3a 3a 74 65      return $::te
30b0: 73 74 5f 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  st_configuration
30c0: 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b  ..      } else {
30d0: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
30e0: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4e 6f 72       # NOTE: Nor
30f0: 6d 61 6c 6c 79 2c 20 77 65 20 77 69 6c 6c 20 6e  mally, we will n
3100: 65 76 65 72 20 68 69 74 20 74 68 69 73 20 63 61  ever hit this ca
3110: 73 65 20 62 65 63 61 75 73 65 20 74 68 65 20 76  se because the v
3120: 61 6c 75 65 20 6f 66 20 74 68 65 0d 0a 20 20 20  alue of the..   
3130: 20 20 20 20 20 23 20 20 20 20 20 20 20 74 65 73       #       tes
3140: 74 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  t configuration 
3150: 76 61 72 69 61 62 6c 65 20 69 73 20 61 6c 77 61  variable is alwa
3160: 79 73 20 73 65 74 20 62 79 20 74 68 65 20 74 65  ys set by the te
3170: 73 74 20 73 75 69 74 65 0d 0a 20 20 20 20 20 20  st suite..      
3180: 20 20 23 20 20 20 20 20 20 20 69 74 73 65 6c 66    #       itself
3190: 3b 20 68 6f 77 65 76 65 72 2c 20 69 74 20 63 61  ; however, it ca
31a0: 6e 20 62 65 20 6f 76 65 72 72 69 64 64 65 6e 20  n be overridden 
31b0: 75 73 69 6e 67 20 74 68 65 20 75 6e 73 65 74 20  using the unset 
31c0: 63 6f 6d 6d 61 6e 64 0d 0a 20 20 20 20 20 20 20  command..       
31d0: 20 23 20 20 20 20 20 20 20 66 72 6f 6d 20 74 68   #       from th
31e0: 65 20 2d 70 72 65 54 65 73 74 20 6f 70 74 69 6f  e -preTest optio
31f0: 6e 20 74 6f 20 74 68 65 20 74 65 73 74 20 73 75  n to the test su
3200: 69 74 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  ite...        #.
3210: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
3220: 24 3a 3a 65 61 67 6c 65 5f 70 6c 61 74 66 6f 72  $::eagle_platfor
3230: 6d 28 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 29  m(configuration)
3240: 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d  ..      }..    }
3250: 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65  .....    proc ge
3260: 74 42 75 69 6c 64 43 6f 6e 66 69 67 75 72 61 74  tBuildConfigurat
3270: 69 6f 6e 73 20 7b 7d 20 7b 0d 0a 20 20 20 20 20  ions {} {..     
3280: 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
3290: 3a 20 53 65 65 20 69 66 20 74 68 65 20 6c 69 73  : See if the lis
32a0: 74 20 6f 66 20 74 65 73 74 20 63 6f 6e 66 69 67  t of test config
32b0: 75 72 61 74 69 6f 6e 73 20 68 61 73 20 62 65 65  urations has bee
32c0: 6e 20 6f 76 65 72 72 69 64 64 65 6e 20 62 79 0d  n overridden by.
32d0: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74  .      #       t
32e0: 68 65 20 75 73 65 72 20 28 65 2e 67 2e 20 6f 6e  he user (e.g. on
32f0: 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e   the command lin
3300: 65 29 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  e)...      #..  
3310: 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78      if {[info ex
3320: 69 73 74 73 20 3a 3a 74 65 73 74 5f 63 6f 6e 66  ists ::test_conf
3330: 69 67 75 72 61 74 69 6f 6e 73 5d 20 26 26 20 5c  igurations] && \
3340: 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 6c 6c 65  ..          [lle
3350: 6e 67 74 68 20 24 3a 3a 74 65 73 74 5f 63 6f 6e  ngth $::test_con
3360: 66 69 67 75 72 61 74 69 6f 6e 73 5d 20 3e 20 30  figurations] > 0
3370: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
3380: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
3390: 4f 54 45 3a 20 55 73 65 20 74 68 65 20 73 70 65  OTE: Use the spe
33a0: 63 69 66 69 65 64 20 6c 69 73 74 20 6f 66 20 74  cified list of t
33b0: 65 73 74 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  est configuratio
33c0: 6e 73 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  ns...        #..
33d0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 24          return $
33e0: 3a 3a 74 65 73 74 5f 63 6f 6e 66 69 67 75 72 61  ::test_configura
33f0: 74 69 6f 6e 73 0d 0a 20 20 20 20 20 20 7d 20 65  tions..      } e
3400: 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  lse {..        #
3410: 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
3420: 3a 20 55 73 65 20 74 68 65 20 64 65 66 61 75 6c  : Use the defaul
3430: 74 20 6c 69 73 74 20 6f 66 20 74 65 73 74 20 63  t list of test c
3440: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 73 2e 0d 0a  onfigurations...
3450: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
3460: 20 20 20 72 65 74 75 72 6e 20 5b 6c 69 73 74 20     return [list 
3470: 44 65 62 75 67 20 52 65 6c 65 61 73 65 5d 0d 0a  Debug Release]..
3480: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a        }..    }..
3490: 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74 42  ...    proc getB
34a0: 75 69 6c 64 42 61 73 65 44 69 72 65 63 74 6f 72  uildBaseDirector
34b0: 79 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d  y {} {..      #.
34c0: 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 46  .      # NOTE: F
34d0: 69 67 75 72 65 20 6f 75 74 20 74 68 65 20 62 61  igure out the ba
34e0: 73 65 20 64 69 72 65 63 74 6f 72 79 20 77 68 65  se directory whe
34f0: 72 65 20 61 6c 6c 20 74 68 65 20 62 75 69 6c 64  re all the build
3500: 73 20 73 68 6f 75 6c 64 20 62 65 0d 0a 20 20 20  s should be..   
3510: 20 20 20 23 20 20 20 20 20 20 20 6c 6f 63 61 74     #       locat
3520: 65 64 2e 20 20 54 68 69 73 20 77 69 6c 6c 20 62  ed.  This will b
3530: 65 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20  e the directory 
3540: 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68  that contains th
3550: 65 20 61 63 74 75 61 6c 0d 0a 20 20 20 20 20 20  e actual..      
3560: 23 20 20 20 20 20 20 20 62 75 69 6c 64 20 6f 75  #       build ou
3570: 74 70 75 74 20 64 69 72 65 63 74 6f 72 79 20 28  tput directory (
3580: 65 2e 67 2e 20 70 61 72 65 6e 74 20 6f 66 20 22  e.g. parent of "
3590: 62 69 6e 22 29 2e 0d 0a 20 20 20 20 20 20 23 0d  bin")...      #.
35a0: 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f  .      if {[info
35b0: 20 65 78 69 73 74 73 20 3a 3a 62 75 69 6c 64 5f   exists ::build_
35c0: 62 61 73 65 5f 64 69 72 65 63 74 6f 72 79 5d 20  base_directory] 
35d0: 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  && \..          
35e0: 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
35f0: 3a 3a 62 75 69 6c 64 5f 62 61 73 65 5f 64 69 72  ::build_base_dir
3600: 65 63 74 6f 72 79 5d 20 3e 20 30 7d 20 74 68 65  ectory] > 0} the
3610: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  n {..        #..
3620: 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
3630: 54 68 65 20 6c 6f 63 61 74 69 6f 6e 20 6f 66 20  The location of 
3640: 74 68 65 20 62 75 69 6c 64 20 62 61 73 65 20 64  the build base d
3650: 69 72 65 63 74 6f 72 79 20 68 61 73 20 62 65 65  irectory has bee
3660: 6e 20 6f 76 65 72 72 69 64 64 65 6e 3b 0d 0a 20  n overridden;.. 
3670: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74         #       t
3680: 68 65 72 65 66 6f 72 65 2c 20 75 73 65 20 69 74  herefore, use it
3690: 20 76 65 72 62 61 74 69 6d 2e 0d 0a 20 20 20 20   verbatim...    
36a0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72      #..        r
36b0: 65 74 75 72 6e 20 24 3a 3a 62 75 69 6c 64 5f 62  eturn $::build_b
36c0: 61 73 65 5f 64 69 72 65 63 74 6f 72 79 0d 0a 20  ase_directory.. 
36d0: 20 20 20 20 20 7d 20 65 6c 73 65 69 66 20 7b 5b       } elseif {[
36e0: 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 63 6f  info exists ::co
36f0: 6d 6d 6f 6e 5f 64 69 72 65 63 74 6f 72 79 5d 20  mmon_directory] 
3700: 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  && \..          
3710: 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
3720: 3a 3a 63 6f 6d 6d 6f 6e 5f 64 69 72 65 63 74 6f  ::common_directo
3730: 72 79 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d  ry] > 0} then {.
3740: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
3750: 20 20 20 20 23 20 4e 4f 54 45 3a 20 4e 65 78 74      # NOTE: Next
3760: 2c 20 66 61 6c 6c 62 61 63 6b 20 74 6f 20 74 68  , fallback to th
3770: 65 20 67 72 61 6e 64 70 61 72 65 6e 74 20 64 69  e grandparent di
3780: 72 65 63 74 6f 72 79 20 6f 66 20 74 68 65 20 6f  rectory of the o
3790: 6e 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  ne..        #   
37a0: 20 20 20 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74      containing t
37b0: 68 69 73 20 66 69 6c 65 20 28 69 2e 65 2e 20 22  his file (i.e. "
37c0: 63 6f 6d 6d 6f 6e 2e 65 61 67 6c 65 22 29 2c 20  common.eagle"), 
37d0: 69 66 20 61 76 61 69 6c 61 62 6c 65 2e 0d 0a 20  if available... 
37e0: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
37f0: 20 20 72 65 74 75 72 6e 20 5b 66 69 6c 65 20 64    return [file d
3800: 69 72 6e 61 6d 65 20 5b 66 69 6c 65 20 64 69 72  irname [file dir
3810: 6e 61 6d 65 20 24 3a 3a 63 6f 6d 6d 6f 6e 5f 64  name $::common_d
3820: 69 72 65 63 74 6f 72 79 5d 5d 0d 0a 20 20 20 20  irectory]]..    
3830: 20 20 7d 20 65 6c 73 65 69 66 20 7b 5b 69 6e 66    } elseif {[inf
3840: 6f 20 65 78 69 73 74 73 20 3a 3a 70 61 74 68 5d  o exists ::path]
3850: 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20   && \..         
3860: 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20   [string length 
3870: 24 3a 3a 70 61 74 68 5d 20 3e 20 30 7d 20 74 68  $::path] > 0} th
3880: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d  en {..        #.
3890: 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
38a0: 20 46 69 6e 61 6c 6c 79 2c 20 66 61 6c 6c 62 61   Finally, fallba
38b0: 63 6b 20 74 6f 20 74 68 65 20 70 61 72 65 6e 74  ck to the parent
38c0: 20 64 69 72 65 63 74 6f 72 79 20 6f 66 20 74 68   directory of th
38d0: 65 20 45 61 67 6c 65 54 65 73 74 0d 0a 20 20 20  e EagleTest..   
38e0: 20 20 20 20 20 23 20 20 20 20 20 20 20 70 61 74       #       pat
38f0: 68 2e 20 20 54 68 65 20 45 61 67 6c 65 54 65 73  h.  The EagleTes
3900: 74 20 70 61 63 6b 61 67 65 20 67 75 61 72 61 6e  t package guaran
3910: 74 65 65 73 20 74 68 61 74 20 74 68 69 73 20 76  tees that this v
3920: 61 72 69 61 62 6c 65 0d 0a 20 20 20 20 20 20 20  ariable..       
3930: 20 23 20 20 20 20 20 20 20 77 69 6c 6c 20 62 65   #       will be
3940: 20 73 65 74 20 74 6f 20 74 68 65 20 64 69 72 65   set to the dire
3950: 63 74 6f 72 79 20 63 6f 6e 74 61 69 6e 69 6e 67  ctory containing
3960: 20 74 68 65 20 66 69 72 73 74 20 66 69 6c 65 20   the first file 
3970: 74 6f 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  to..        #   
3980: 20 20 20 20 65 78 65 63 75 74 65 20 74 68 65 20      execute the 
3990: 5b 72 75 6e 54 65 73 74 50 72 6f 6c 6f 67 75 65  [runTestPrologue
39a0: 5d 20 73 63 72 69 70 74 20 6c 69 62 72 61 72 79  ] script library
39b0: 20 70 72 6f 63 65 64 75 72 65 2e 0d 0a 20 20 20   procedure...   
39c0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
39d0: 72 65 74 75 72 6e 20 5b 66 69 6c 65 20 64 69 72  return [file dir
39e0: 6e 61 6d 65 20 24 3a 3a 70 61 74 68 5d 0d 0a 20  name $::path].. 
39f0: 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
3a00: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
3a10: 20 20 23 20 4e 4f 54 45 3a 20 4e 6f 20 70 61 74    # NOTE: No pat
3a20: 68 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2c 20  h is available, 
3a30: 72 65 74 75 72 6e 20 61 6e 20 65 6d 70 74 79 20  return an empty 
3a40: 73 74 72 69 6e 67 2e 20 20 54 68 69 73 20 70 6f  string.  This po
3a50: 69 6e 74 0d 0a 20 20 20 20 20 20 20 20 23 20 20  int..        #  
3a60: 20 20 20 20 20 73 68 6f 75 6c 64 20 6e 6f 74 20       should not 
3a70: 62 65 20 72 65 61 63 68 65 64 2e 0d 0a 20 20 20  be reached...   
3a80: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
3a90: 72 65 74 75 72 6e 20 22 22 0d 0a 20 20 20 20 20  return ""..     
3aa0: 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20   }..    }.....  
3ab0: 20 20 70 72 6f 63 20 67 65 74 53 51 4c 69 74 65    proc getSQLite
3ac0: 54 65 73 74 44 61 74 61 50 61 74 68 20 7b 7d 20  TestDataPath {} 
3ad0: 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  {..      #..    
3ae0: 20 20 23 20 4e 4f 54 45 3a 20 46 69 67 75 72 65    # NOTE: Figure
3af0: 20 6f 75 74 20 74 68 65 20 64 69 72 65 63 74 6f   out the directo
3b00: 72 79 20 77 68 65 72 65 20 61 6c 6c 20 74 68 65  ry where all the
3b10: 20 74 65 73 74 20 64 61 74 61 20 66 69 6c 65 73   test data files
3b20: 20 73 68 6f 75 6c 64 0d 0a 20 20 20 20 20 20 23   should..      #
3b30: 20 20 20 20 20 20 20 62 65 20 6c 6f 63 61 74 65         be locate
3b40: 64 2e 20 20 54 68 69 73 20 73 68 6f 75 6c 64 20  d.  This should 
3b50: 62 65 20 74 68 65 20 22 64 61 74 61 22 20 64 69  be the "data" di
3b60: 72 65 63 74 6f 72 79 20 62 65 6e 65 61 74 68 20  rectory beneath 
3b70: 74 68 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20  the..      #    
3b80: 20 20 20 64 69 72 65 63 74 6f 72 79 20 63 6f 6e     directory con
3b90: 74 61 69 6e 69 6e 67 20 74 68 65 20 61 63 74 75  taining the actu
3ba0: 61 6c 20 74 65 73 74 20 73 63 72 69 70 74 73 2e  al test scripts.
3bb0: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
3bc0: 20 72 65 74 75 72 6e 20 5b 66 69 6c 65 20 6a 6f   return [file jo
3bd0: 69 6e 20 24 3a 3a 70 61 74 68 20 64 61 74 61 5d  in $::path data]
3be0: 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
3bf0: 70 72 6f 63 20 69 73 52 75 6e 6e 69 6e 67 57 6f  proc isRunningWo
3c00: 57 36 34 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20  W64 {} {..      
3c10: 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
3c20: 20 46 6f 72 20 6e 6f 77 2c 20 6a 75 73 74 20 75   For now, just u
3c30: 73 65 20 74 68 65 20 65 78 69 73 74 69 6e 67 20  se the existing 
3c40: 74 65 73 74 20 63 6f 6e 73 74 72 61 69 6e 74 20  test constraint 
3c50: 66 6f 72 20 64 65 74 65 63 74 69 6e 67 0d 0a 20  for detecting.. 
3c60: 20 20 20 20 20 23 20 20 20 20 20 20 20 61 20 57       #       a W
3c70: 6f 57 36 34 20 70 72 6f 63 65 73 73 2e 0d 0a 20  oW64 process... 
3c80: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 72 65       #..      re
3c90: 74 75 72 6e 20 5b 68 61 76 65 43 6f 6e 73 74 72  turn [haveConstr
3ca0: 61 69 6e 74 20 77 6f 77 36 34 5d 0d 0a 20 20 20  aint wow64]..   
3cb0: 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
3cc0: 69 73 4d 69 78 65 64 4d 6f 64 65 41 73 73 65 6d  isMixedModeAssem
3cd0: 62 6c 79 20 7b 20 66 69 6c 65 4e 61 6d 65 20 7b  bly { fileName {
3ce0: 76 61 72 4e 61 6d 65 20 22 22 7d 20 7d 20 7b 0d  varName ""} } {.
3cf0: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
3d00: 23 20 4e 4f 54 45 3a 20 46 69 72 73 74 2c 20 6d  # NOTE: First, m
3d10: 61 6b 65 20 73 75 72 65 20 74 68 65 20 74 65 73  ake sure the tes
3d20: 74 20 73 75 69 74 65 20 69 6e 66 72 61 73 74 72  t suite infrastr
3d30: 75 63 74 75 72 65 20 69 73 20 61 6c 6c 6f 77 65  ucture is allowe
3d40: 64 20 74 6f 0d 0a 20 20 20 20 20 20 23 20 20 20  d to..      #   
3d50: 20 20 20 20 75 73 65 20 74 68 65 20 5b 65 78 65      use the [exe
3d60: 63 5d 20 63 6f 6d 6d 61 6e 64 2e 0d 0a 20 20 20  c] command...   
3d70: 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
3d80: 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  ![info exists ::
3d90: 6e 6f 28 65 78 65 63 29 5d 20 26 26 20 21 5b 69  no(exec)] && ![i
3da0: 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28  nfo exists ::no(
3db0: 63 6f 72 46 6c 61 67 73 29 5d 7d 20 74 68 65 6e  corFlags)]} then
3dc0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20   {..        #.. 
3dd0: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49         # NOTE: I
3de0: 66 20 74 68 65 20 6c 6f 63 61 74 69 6f 6e 20 6f  f the location o
3df0: 66 20 43 6f 72 46 6c 61 67 73 20 69 73 20 70 72  f CorFlags is pr
3e00: 65 73 65 6e 74 20 69 6e 20 74 68 65 20 65 6e 76  esent in the env
3e10: 69 72 6f 6e 6d 65 6e 74 2c 0d 0a 20 20 20 20 20  ironment,..     
3e20: 20 20 20 23 20 20 20 20 20 20 20 75 73 65 20 69     #       use i
3e30: 74 3b 20 6f 74 68 65 72 77 69 73 65 20 61 73 73  t; otherwise ass
3e40: 75 6d 65 20 69 74 20 69 73 20 69 6e 20 74 68 65  ume it is in the
3e50: 20 50 41 54 48 2e 0d 0a 20 20 20 20 20 20 20 20   PATH...        
3e60: 23 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 63  #..        set c
3e70: 6f 72 46 6c 61 67 73 20 5b 65 78 70 72 20 7b 0d  orFlags [expr {.
3e80: 0a 20 20 20 20 20 20 20 20 20 20 5b 69 6e 66 6f  .          [info
3e90: 20 65 78 69 73 74 73 20 3a 3a 65 6e 76 28 43 6f   exists ::env(Co
3ea0: 72 46 6c 61 67 73 29 5d 20 3f 20 24 3a 3a 65 6e  rFlags)] ? $::en
3eb0: 76 28 43 6f 72 46 6c 61 67 73 29 20 3a 20 22 43  v(CorFlags) : "C
3ec0: 6f 72 46 6c 61 67 73 22 0d 0a 20 20 20 20 20 20  orFlags"..      
3ed0: 20 20 7d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20    }]....        
3ee0: 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
3ef0: 45 3a 20 41 74 74 65 6d 70 74 20 74 6f 20 65 78  E: Attempt to ex
3f00: 65 63 75 74 65 20 43 6f 72 46 6c 61 67 73 20 6f  ecute CorFlags o
3f10: 6e 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  n the specified 
3f20: 66 69 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20 23  file...        #
3f30: 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63  ..        if {[c
3f40: 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20  atch {..        
3f50: 20 20 65 78 65 63 20 2d 2d 20 24 63 6f 72 46 6c    exec -- $corFl
3f60: 61 67 73 20 5b 66 69 6c 65 20 6e 61 74 69 76 65  ags [file native
3f70: 6e 61 6d 65 20 24 66 69 6c 65 4e 61 6d 65 5d 0d  name $fileName].
3f80: 0a 20 20 20 20 20 20 20 20 7d 20 65 78 65 63 5d  .        } exec]
3f90: 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20   == 0} then {.. 
3fa0: 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
3fb0: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 66        # NOTE: If
3fc0: 20 72 65 71 75 65 73 74 65 64 20 62 79 20 6f 75   requested by ou
3fd0: 72 20 63 61 6c 6c 65 72 2c 20 61 74 74 65 6d 70  r caller, attemp
3fe0: 74 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74  t to determine t
3ff0: 68 65 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20  he..          # 
4000: 20 20 20 20 20 20 70 6c 61 74 66 6f 72 6d 20 66        platform f
4010: 6f 72 20 74 68 65 20 73 70 65 63 69 66 69 65 64  or the specified
4020: 20 66 69 6c 65 20 61 73 20 77 65 6c 6c 2e 0d 0a   file as well...
4030: 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
4040: 20 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69         if {[stri
4050: 6e 67 20 6c 65 6e 67 74 68 20 24 76 61 72 4e 61  ng length $varNa
4060: 6d 65 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d  me] > 0} then {.
4070: 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a  .            #..
4080: 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f              # NO
4090: 54 45 3a 20 53 74 6f 72 65 20 74 68 65 20 70 6c  TE: Store the pl
40a0: 61 74 66 6f 72 6d 20 69 6e 20 74 68 65 20 6e 61  atform in the na
40b0: 6d 65 64 20 76 61 72 69 61 62 6c 65 20 69 6e 20  med variable in 
40c0: 74 68 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20  the..           
40d0: 20 23 20 20 20 20 20 20 20 63 6f 6e 74 65 78 74   #       context
40e0: 20 6f 66 20 6f 75 72 20 63 61 6c 6c 65 72 2e 0d   of our caller..
40f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a  .            #..
4100: 20 20 20 20 20 20 20 20 20 20 20 20 75 70 76 61              upva
4110: 72 20 31 20 24 76 61 72 4e 61 6d 65 20 70 6c 61  r 1 $varName pla
4120: 74 66 6f 72 6d 0d 0a 0d 0a 20 20 20 20 20 20 20  tform....       
4130: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
4140: 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 74 74 65      # NOTE: Atte
4150: 6d 70 74 20 74 6f 20 65 78 74 72 61 63 74 20 74  mpt to extract t
4160: 68 65 20 50 45 20 6c 69 6e 65 20 66 72 6f 6d 20  he PE line from 
4170: 74 68 65 20 63 61 70 74 75 72 65 64 0d 0a 20 20  the captured..  
4180: 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20            #     
4190: 20 20 6f 75 74 70 75 74 2e 20 20 49 66 20 74 68    output.  If th
41a0: 69 73 20 76 61 6c 75 65 20 69 73 20 22 50 45 33  is value is "PE3
41b0: 32 22 20 6f 72 20 22 50 45 33 32 2b 22 2c 20 74  2" or "PE32+", t
41c0: 68 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  he..            
41d0: 23 20 20 20 20 20 20 20 61 73 73 65 6d 62 6c 79  #       assembly
41e0: 20 66 69 6c 65 20 69 73 20 33 32 2d 62 69 74 20   file is 32-bit 
41f0: 6f 72 20 36 34 2d 62 69 74 2c 20 72 65 73 70 65  or 64-bit, respe
4200: 63 74 69 76 65 6c 79 3b 0d 0a 20 20 20 20 20 20  ctively;..      
4210: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 6f 74        #       ot
4220: 68 65 72 77 69 73 65 2c 20 69 74 73 20 74 79 70  herwise, its typ
4230: 65 20 69 73 20 75 6e 6b 6e 6f 77 6e 2e 0d 0a 20  e is unknown... 
4240: 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
4250: 20 20 20 20 20 20 20 20 20 20 73 65 74 20 70 61            set pa
4260: 74 74 65 72 6e 20 7b 5e 50 45 20 20 20 20 20 20  ttern {^PE      
4270: 20 20 3a 20 28 50 45 33 32 7c 50 45 33 32 5c 2b    : (PE32|PE32\+
4280: 29 5c 73 2b 24 7d 0d 0a 0d 0a 20 20 20 20 20 20  )\s+$}....      
4290: 20 20 20 20 20 20 69 66 20 7b 5b 72 65 67 65 78        if {[regex
42a0: 70 20 2d 6c 69 6e 65 20 2d 2d 20 24 70 61 74 74  p -line -- $patt
42b0: 65 72 6e 20 24 65 78 65 63 20 64 75 6d 6d 79 20  ern $exec dummy 
42c0: 70 65 33 32 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  pe32]} then {.. 
42d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a               #..
42e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20                # 
42f0: 48 41 43 4b 3a 20 54 68 69 73 20 5b 73 77 69 74  HACK: This [swit
4300: 63 68 5d 20 61 73 73 75 6d 65 73 20 74 68 61 74  ch] assumes that
4310: 20 33 32 2d 62 69 74 20 65 78 65 63 75 74 61 62   32-bit executab
4320: 6c 65 73 20 61 72 65 0d 0a 20 20 20 20 20 20 20  les are..       
4330: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 61         #       a
4340: 6c 77 61 79 73 20 78 38 36 20 61 6e 64 20 74 68  lways x86 and th
4350: 61 74 20 36 34 2d 62 69 74 20 65 78 65 63 75 74  at 64-bit execut
4360: 61 62 6c 65 73 20 61 72 65 20 61 6c 77 61 79 73  ables are always
4370: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
4380: 23 20 20 20 20 20 20 20 78 36 34 2e 0d 0a 20 20  #       x64...  
4390: 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20              #.. 
43a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 77 69               swi
43b0: 74 63 68 20 2d 65 78 61 63 74 20 2d 2d 20 24 70  tch -exact -- $p
43c0: 65 33 32 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  e32 {..         
43d0: 20 20 20 20 20 20 20 50 45 33 32 20 7b 0d 0a 20         PE32 {.. 
43e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
43f0: 20 73 65 74 20 70 6c 61 74 66 6f 72 6d 20 57 69   set platform Wi
4400: 6e 33 32 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n32..           
4410: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
4420: 20 20 20 20 20 20 20 20 50 45 33 32 2b 20 7b 0d          PE32+ {.
4430: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
4440: 20 20 20 73 65 74 20 70 6c 61 74 66 6f 72 6d 20     set platform 
4450: 78 36 34 0d 0a 20 20 20 20 20 20 20 20 20 20 20  x64..           
4460: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
4470: 20 20 20 20 20 20 20 20 64 65 66 61 75 6c 74 20          default 
4480: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
4490: 20 20 20 20 20 73 65 74 20 70 6c 61 74 66 6f 72       set platfor
44a0: 6d 20 22 22 0d 0a 20 20 20 20 20 20 20 20 20 20  m ""..          
44b0: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
44c0: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
44d0: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
44e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65                se
44f0: 74 20 70 6c 61 74 66 6f 72 6d 20 22 22 0d 0a 20  t platform "".. 
4500: 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
4510: 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
4520: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
4530: 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 74 74 65      # NOTE: Atte
4540: 6d 70 74 20 74 6f 20 65 78 74 72 61 63 74 20 74  mpt to extract t
4550: 68 65 20 49 4c 4f 4e 4c 59 20 6c 69 6e 65 20 66  he ILONLY line f
4560: 72 6f 6d 20 74 68 65 20 63 61 70 74 75 72 65 64  rom the captured
4570: 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 20 20  ..          #   
4580: 20 20 20 20 6f 75 74 70 75 74 2e 20 20 49 66 20      output.  If 
4590: 74 68 69 73 20 76 61 6c 75 65 20 69 73 20 7a 65  this value is ze
45a0: 72 6f 2c 20 74 68 65 20 73 70 65 63 69 66 69 65  ro, the specifie
45b0: 64 20 66 69 6c 65 20 6d 75 73 74 0d 0a 20 20 20  d file must..   
45c0: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 62         #       b
45d0: 65 20 61 20 6d 69 78 65 64 2d 6d 6f 64 65 20 61  e a mixed-mode a
45e0: 73 73 65 6d 62 6c 79 3b 20 6f 74 68 65 72 77 69  ssembly; otherwi
45f0: 73 65 2c 20 69 74 20 63 6f 6e 74 61 69 6e 73 20  se, it contains 
4600: 6f 6e 6c 79 0d 0a 20 20 20 20 20 20 20 20 20 20  only..          
4610: 23 20 20 20 20 20 20 20 6d 61 6e 61 67 65 64 20  #       managed 
4620: 63 6f 6d 70 6f 6e 65 6e 74 73 2e 0d 0a 20 20 20  components...   
4630: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
4640: 20 20 20 20 73 65 74 20 70 61 74 74 65 72 6e 20      set pattern 
4650: 7b 5e 49 4c 4f 4e 4c 59 20 20 20 20 3a 20 28 30  {^ILONLY    : (0
4660: 7c 31 29 5c 73 2b 24 7d 0d 0a 0d 0a 20 20 20 20  |1)\s+$}....    
4670: 20 20 20 20 20 20 69 66 20 7b 21 5b 72 65 67 65        if {![rege
4680: 78 70 20 2d 6c 69 6e 65 20 2d 2d 20 24 70 61 74  xp -line -- $pat
4690: 74 65 72 6e 20 24 65 78 65 63 20 64 75 6d 6d 79  tern $exec dummy
46a0: 20 69 6c 4f 6e 6c 79 5d 7d 20 74 68 65 6e 20 7b   ilOnly]} then {
46b0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65  ..            re
46c0: 74 75 72 6e 20 66 61 6c 73 65 0d 0a 20 20 20 20  turn false..    
46d0: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
46e0: 20 20 20 20 20 69 66 20 7b 21 24 69 6c 4f 6e 6c       if {!$ilOnl
46f0: 79 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  y} then {..     
4700: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 72         return tr
4710: 75 65 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d  ue..          }.
4720: 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  .        }..    
4730: 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a    }....      #..
4740: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 66        # NOTE: If
4750: 20 74 68 65 20 74 65 73 74 20 73 75 69 74 65 20   the test suite 
4760: 63 61 6e 6e 6f 74 20 75 73 65 20 5b 65 78 65 63  cannot use [exec
4770: 5d 20 6f 72 20 65 78 65 63 75 74 69 6f 6e 20 6f  ] or execution o
4780: 66 20 43 6f 72 46 6c 61 67 73 0d 0a 20 20 20 20  f CorFlags..    
4790: 20 20 23 20 20 20 20 20 20 20 66 61 69 6c 65 64    #       failed
47a0: 2c 20 72 65 74 75 72 6e 20 66 61 6c 73 65 2e 0d  , return false..
47b0: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
47c0: 72 65 74 75 72 6e 20 66 61 6c 73 65 0d 0a 20 20  return false..  
47d0: 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
47e0: 20 67 65 74 4e 61 74 69 76 65 4c 69 62 72 61 72   getNativeLibrar
47f0: 79 46 69 6c 65 4e 61 6d 65 73 4f 6e 6c 79 20 7b  yFileNamesOnly {
4800: 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  } {..      #..  
4810: 20 20 20 20 23 20 4e 4f 54 45 3a 20 46 69 72 73      # NOTE: Firs
4820: 74 2c 20 63 68 65 63 6b 20 69 66 20 74 68 65 20  t, check if the 
4830: 6c 69 73 74 20 6f 66 20 6e 61 74 69 76 65 20 6c  list of native l
4840: 69 62 72 61 72 79 20 66 69 6c 65 20 6e 61 6d 65  ibrary file name
4850: 73 20 68 61 73 20 62 65 65 6e 0d 0a 20 20 20 20  s has been..    
4860: 20 20 23 20 20 20 20 20 20 20 6d 61 6e 75 61 6c    #       manual
4870: 6c 79 20 6f 76 65 72 72 69 64 64 65 6e 2e 0d 0a  ly overridden...
4880: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69        #..      i
4890: 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20  f {[info exists 
48a0: 3a 3a 6e 61 74 69 76 65 5f 6c 69 62 72 61 72 79  ::native_library
48b0: 5f 66 69 6c 65 5f 6e 61 6d 65 73 5d 20 26 26 20  _file_names] && 
48c0: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 6c 6c  \..          [ll
48d0: 65 6e 67 74 68 20 24 3a 3a 6e 61 74 69 76 65 5f  ength $::native_
48e0: 6c 69 62 72 61 72 79 5f 66 69 6c 65 5f 6e 61 6d  library_file_nam
48f0: 65 73 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d  es] > 0} then {.
4900: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
4910: 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 65 20      # NOTE: The 
4920: 6c 69 73 74 20 6f 66 20 6e 61 74 69 76 65 20 6c  list of native l
4930: 69 62 72 61 72 79 20 66 69 6c 65 20 6e 61 6d 65  ibrary file name
4940: 73 20 68 61 73 20 62 65 65 6e 20 6f 76 65 72 72  s has been overr
4950: 69 64 64 65 6e 3b 0d 0a 20 20 20 20 20 20 20 20  idden;..        
4960: 23 20 20 20 20 20 20 20 74 68 65 72 65 66 6f 72  #       therefor
4970: 65 2c 20 75 73 65 20 69 74 20 76 65 72 62 61 74  e, use it verbat
4980: 69 6d 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  im...        #..
4990: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 24          return $
49a0: 3a 3a 6e 61 74 69 76 65 5f 6c 69 62 72 61 72 79  ::native_library
49b0: 5f 66 69 6c 65 5f 6e 61 6d 65 73 0d 0a 20 20 20  _file_names..   
49c0: 20 20 20 7d 20 65 6c 73 65 69 66 20 7b 5b 69 73     } elseif {[is
49d0: 57 69 6e 64 6f 77 73 5d 7d 20 74 68 65 6e 20 7b  Windows]} then {
49e0: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
49f0: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4f 74 68       # NOTE: Oth
4a00: 65 72 77 69 73 65 2c 20 6f 6e 20 57 69 6e 64 6f  erwise, on Windo
4a10: 77 73 2c 20 61 6c 77 61 79 73 20 75 73 65 20 74  ws, always use t
4a20: 68 65 20 64 65 66 61 75 6c 74 20 66 69 6c 65 20  he default file 
4a30: 6e 61 6d 65 0d 0a 20 20 20 20 20 20 20 20 23 20  name..        # 
4a40: 20 20 20 20 20 20 22 73 71 6c 69 74 65 33 2e 64        "sqlite3.d
4a50: 6c 6c 22 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  ll"...        #.
4a60: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
4a70: 5b 6c 69 73 74 20 73 71 6c 69 74 65 33 2e 64 6c  [list sqlite3.dl
4a80: 6c 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65  l]..      } else
4a90: 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20   {..        #.. 
4aa0: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4f         # NOTE: O
4ab0: 74 68 65 72 77 69 73 65 2c 20 72 65 74 75 72 6e  therwise, return
4ac0: 20 62 6f 74 68 20 74 68 65 20 67 65 6e 65 72 69   both the generi
4ad0: 63 20 50 4f 53 49 58 20 66 69 6c 65 20 6e 61 6d  c POSIX file nam
4ae0: 65 20 61 6e 64 20 74 68 65 0d 0a 20 20 20 20 20  e and the..     
4af0: 20 20 20 23 20 20 20 20 20 20 20 4d 61 63 20 4f     #       Mac O
4b00: 53 20 58 20 66 69 6c 65 20 6e 61 6d 65 2c 20 73  S X file name, s
4b10: 69 6e 63 65 20 77 65 20 64 6f 20 6e 6f 74 20 63  ince we do not c
4b20: 75 72 72 65 6e 74 6c 79 20 68 61 76 65 20 61 6e  urrently have an
4b30: 20 65 61 73 79 0d 0a 20 20 20 20 20 20 20 20 23   easy..        #
4b40: 20 20 20 20 20 20 20 77 61 79 20 74 6f 20 64 65         way to de
4b50: 74 65 63 74 20 77 68 69 63 68 20 6f 66 20 74 68  tect which of th
4b60: 6f 73 65 20 70 6c 61 74 66 6f 72 6d 73 20 77 65  ose platforms we
4b70: 20 61 72 65 20 72 75 6e 6e 69 6e 67 20 6f 6e 2e   are running on.
4b80: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
4b90: 20 20 20 20 20 72 65 74 75 72 6e 20 5b 6c 69 73       return [lis
4ba0: 74 20 6c 69 62 73 71 6c 69 74 65 33 2e 64 79 6c  t libsqlite3.dyl
4bb0: 69 62 20 6c 69 62 73 71 6c 69 74 65 33 2e 73 6f  ib libsqlite3.so
4bc0: 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  ]..      }..    
4bd0: 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67  }.....    proc g
4be0: 65 74 49 6e 74 65 72 6f 70 41 73 73 65 6d 62 6c  etInteropAssembl
4bf0: 79 46 69 6c 65 4e 61 6d 65 73 4f 6e 6c 79 20 7b  yFileNamesOnly {
4c00: 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  } {..      #..  
4c10: 20 20 20 20 23 20 4e 4f 54 45 3a 20 46 69 72 73      # NOTE: Firs
4c20: 74 2c 20 63 68 65 63 6b 20 69 66 20 74 68 65 20  t, check if the 
4c30: 6c 69 73 74 20 6f 66 20 69 6e 74 65 72 6f 70 20  list of interop 
4c40: 61 73 73 65 6d 62 6c 79 20 66 69 6c 65 20 6e 61  assembly file na
4c50: 6d 65 73 20 68 61 73 20 62 65 65 6e 0d 0a 20 20  mes has been..  
4c60: 20 20 20 20 23 20 20 20 20 20 20 20 6d 61 6e 75      #       manu
4c70: 61 6c 6c 79 20 6f 76 65 72 72 69 64 64 65 6e 2e  ally overridden.
4c80: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
4c90: 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74   if {[info exist
4ca0: 73 20 3a 3a 69 6e 74 65 72 6f 70 5f 61 73 73 65  s ::interop_asse
4cb0: 6d 62 6c 79 5f 66 69 6c 65 5f 6e 61 6d 65 73 5d  mbly_file_names]
4cc0: 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20   && \..         
4cd0: 20 5b 6c 6c 65 6e 67 74 68 20 24 3a 3a 69 6e 74   [llength $::int
4ce0: 65 72 6f 70 5f 61 73 73 65 6d 62 6c 79 5f 66 69  erop_assembly_fi
4cf0: 6c 65 5f 6e 61 6d 65 73 5d 20 3e 20 30 7d 20 74  le_names] > 0} t
4d00: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  hen {..        #
4d10: 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
4d20: 3a 20 54 68 65 20 6c 69 73 74 20 6f 66 20 69 6e  : The list of in
4d30: 74 65 72 6f 70 20 61 73 73 65 6d 62 6c 79 20 66  terop assembly f
4d40: 69 6c 65 20 6e 61 6d 65 73 20 68 61 73 20 62 65  ile names has be
4d50: 65 6e 20 6f 76 65 72 72 69 64 64 65 6e 3b 0d 0a  en overridden;..
4d60: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
4d70: 74 68 65 72 65 66 6f 72 65 2c 20 75 73 65 20 69  therefore, use i
4d80: 74 20 76 65 72 62 61 74 69 6d 2e 0d 0a 20 20 20  t verbatim...   
4d90: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
4da0: 72 65 74 75 72 6e 20 24 3a 3a 69 6e 74 65 72 6f  return $::intero
4db0: 70 5f 61 73 73 65 6d 62 6c 79 5f 66 69 6c 65 5f  p_assembly_file_
4dc0: 6e 61 6d 65 73 0d 0a 20 20 20 20 20 20 7d 20 65  names..      } e
4dd0: 6c 73 65 69 66 20 7b 5b 69 73 57 69 6e 64 6f 77  lseif {[isWindow
4de0: 73 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  s]} then {..    
4df0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
4e00: 20 4e 4f 54 45 3a 20 4f 74 68 65 72 77 69 73 65   NOTE: Otherwise
4e10: 2c 20 6f 6e 20 57 69 6e 64 6f 77 73 2c 20 61 6c  , on Windows, al
4e20: 77 61 79 73 20 75 73 65 20 74 68 65 20 64 65 66  ways use the def
4e30: 61 75 6c 74 20 66 69 6c 65 20 6e 61 6d 65 0d 0a  ault file name..
4e40: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
4e50: 22 53 51 4c 69 74 65 2e 49 6e 74 65 72 6f 70 2e  "SQLite.Interop.
4e60: 64 6c 6c 22 2e 0d 0a 20 20 20 20 20 20 20 20 23  dll"...        #
4e70: 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ..        return
4e80: 20 5b 6c 69 73 74 20 53 51 4c 69 74 65 2e 49 6e   [list SQLite.In
4e90: 74 65 72 6f 70 2e 64 6c 6c 5d 0d 0a 20 20 20 20  terop.dll]..    
4ea0: 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
4eb0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
4ec0: 20 4e 4f 54 45 3a 20 4f 74 68 65 72 77 69 73 65   NOTE: Otherwise
4ed0: 2c 20 72 65 74 75 72 6e 20 62 6f 74 68 20 74 68  , return both th
4ee0: 65 20 67 65 6e 65 72 69 63 20 50 4f 53 49 58 20  e generic POSIX 
4ef0: 66 69 6c 65 20 6e 61 6d 65 20 61 6e 64 20 74 68  file name and th
4f00: 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  e..        #    
4f10: 20 20 20 4d 61 63 20 4f 53 20 58 20 66 69 6c 65     Mac OS X file
4f20: 20 6e 61 6d 65 2c 20 73 69 6e 63 65 20 77 65 20   name, since we 
4f30: 64 6f 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79  do not currently
4f40: 20 68 61 76 65 20 61 6e 20 65 61 73 79 0d 0a 20   have an easy.. 
4f50: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 77         #       w
4f60: 61 79 20 74 6f 20 64 65 74 65 63 74 20 77 68 69  ay to detect whi
4f70: 63 68 20 6f 66 20 74 68 6f 73 65 20 70 6c 61 74  ch of those plat
4f80: 66 6f 72 6d 73 20 77 65 20 61 72 65 20 72 75 6e  forms we are run
4f90: 6e 69 6e 67 20 6f 6e 2e 0d 0a 20 20 20 20 20 20  ning on...      
4fa0: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74    #..        ret
4fb0: 75 72 6e 20 5b 6c 69 73 74 20 6c 69 62 53 51 4c  urn [list libSQL
4fc0: 69 74 65 2e 49 6e 74 65 72 6f 70 2e 64 79 6c 69  ite.Interop.dyli
4fd0: 62 20 6c 69 62 53 51 4c 69 74 65 2e 49 6e 74 65  b libSQLite.Inte
4fe0: 72 6f 70 2e 73 6f 5d 0d 0a 20 20 20 20 20 20 7d  rop.so]..      }
4ff0: 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
5000: 70 72 6f 63 20 67 65 74 43 6f 72 65 45 78 74 65  proc getCoreExte
5010: 6e 73 69 6f 6e 42 69 6e 61 72 79 46 69 6c 65 4e  nsionBinaryFileN
5020: 61 6d 65 20 7b 20 7b 64 65 66 61 75 6c 74 20 22  ame { {default "
5030: 22 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 73 65  "} } {..      se
5040: 74 20 66 69 6c 65 4e 61 6d 65 20 5b 67 65 74 43  t fileName [getC
5050: 6f 72 65 42 69 6e 61 72 79 46 69 6c 65 4e 61 6d  oreBinaryFileNam
5060: 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b  e]....      if {
5070: 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24 66 69  [file exists $fi
5080: 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d  leName]} then {.
5090: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
50a0: 24 66 69 6c 65 4e 61 6d 65 0d 0a 20 20 20 20 20  $fileName..     
50b0: 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65 74 75   }....      retu
50c0: 72 6e 20 24 64 65 66 61 75 6c 74 0d 0a 20 20 20  rn $default..   
50d0: 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
50e0: 69 73 42 75 69 6c 64 41 76 61 69 6c 61 62 6c 65  isBuildAvailable
50f0: 20 7b 20 6e 61 74 69 76 65 20 64 69 72 65 63 74   { native direct
5100: 6f 72 79 20 7b 76 61 72 4e 61 6d 65 20 22 22 7d  ory {varName ""}
5110: 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20   } {..      #.. 
5120: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 42 75 69       # NOTE: Bui
5130: 6c 64 20 74 68 65 20 66 75 6c 6c 79 20 71 75 61  ld the fully qua
5140: 6c 69 66 69 65 64 20 66 69 6c 65 20 6e 61 6d 65  lified file name
5150: 20 66 6f 72 20 74 68 65 20 70 72 69 6d 61 72 79   for the primary
5160: 20 61 73 73 65 6d 62 6c 79 0d 0a 20 20 20 20 20   assembly..     
5170: 20 23 20 20 20 20 20 20 20 63 6f 6e 74 61 69 6e   #       contain
5180: 69 6e 67 20 74 68 65 20 53 79 73 74 65 6d 2e 44  ing the System.D
5190: 61 74 61 2e 53 51 4c 69 74 65 20 6d 61 6e 61 67  ata.SQLite manag
51a0: 65 64 20 63 6f 6d 70 6f 6e 65 6e 74 73 2e 20 20  ed components.  
51b0: 49 74 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  It..      #     
51c0: 20 20 73 68 6f 75 6c 64 20 62 65 20 6e 6f 74 65    should be note
51d0: 64 20 74 68 61 74 20 74 68 69 73 20 61 73 73 65  d that this asse
51e0: 6d 62 6c 79 20 66 69 6c 65 20 6d 61 79 20 61 6c  mbly file may al
51f0: 73 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 0d 0a  so contain the..
5200: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 6e 61        #       na
5210: 74 69 76 65 20 63 6f 6d 70 6f 6e 65 6e 74 73 2c  tive components,
5220: 20 69 66 20 61 20 6e 61 74 69 76 65 20 62 75 69   if a native bui
5230: 6c 64 20 69 73 20 69 6e 20 75 73 65 2e 0d 0a 20  ld is in use... 
5240: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 73 65       #..      se
5250: 74 20 66 69 6c 65 4e 61 6d 65 20 5b 66 69 6c 65  t fileName [file
5260: 20 6e 61 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c   nativename [fil
5270: 65 20 6a 6f 69 6e 20 24 64 69 72 65 63 74 6f 72  e join $director
5280: 79 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 53  y \..          S
5290: 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
52a0: 65 2e 64 6c 6c 5d 5d 0d 0a 0d 0a 20 20 20 20 20  e.dll]]....     
52b0: 20 69 66 20 7b 21 5b 66 69 6c 65 20 65 78 69 73   if {![file exis
52c0: 74 73 20 24 66 69 6c 65 4e 61 6d 65 5d 7d 20 74  ts $fileName]} t
52d0: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 72  hen {..        r
52e0: 65 74 75 72 6e 20 66 61 6c 73 65 0d 0a 20 20 20  eturn false..   
52f0: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d     }....      #.
5300: 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41  .      # NOTE: A
5310: 74 74 65 6d 70 74 20 74 6f 20 61 75 74 6f 6d 61  ttempt to automa
5320: 74 69 63 61 6c 6c 79 20 64 65 74 65 63 74 20 69  tically detect i
5330: 66 20 74 68 65 20 70 72 69 6d 61 72 79 20 61 73  f the primary as
5340: 73 65 6d 62 6c 79 0d 0a 20 20 20 20 20 20 23 20  sembly..      # 
5350: 20 20 20 20 20 20 63 6f 6e 74 61 69 6e 73 20 61        contains a
5360: 6e 79 20 6e 61 74 69 76 65 20 63 6f 6d 70 6f 6e  ny native compon
5370: 65 6e 74 73 2c 20 69 66 20 6e 65 63 65 73 73 61  ents, if necessa
5380: 72 79 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  ry...      #..  
5390: 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20      if {[string 
53a0: 6c 65 6e 67 74 68 20 24 6e 61 74 69 76 65 5d 20  length $native] 
53b0: 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  == 0} then {..  
53c0: 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e        if {[strin
53d0: 67 20 6c 65 6e 67 74 68 20 24 76 61 72 4e 61 6d  g length $varNam
53e0: 65 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  e] > 0} then {..
53f0: 20 20 20 20 20 20 20 20 20 20 75 70 76 61 72 20            upvar 
5400: 31 20 24 76 61 72 4e 61 6d 65 20 24 76 61 72 4e  1 $varName $varN
5410: 61 6d 65 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  ame..        }..
5420: 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 6e 61  ..        set na
5430: 74 69 76 65 20 5b 69 73 4d 69 78 65 64 4d 6f 64  tive [isMixedMod
5440: 65 41 73 73 65 6d 62 6c 79 20 24 66 69 6c 65 4e  eAssembly $fileN
5450: 61 6d 65 20 24 76 61 72 4e 61 6d 65 5d 0d 0a 20  ame $varName].. 
5460: 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
5470: 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
5480: 20 49 66 20 74 68 65 20 70 72 69 6d 61 72 79 20   If the primary 
5490: 61 73 73 65 6d 62 6c 79 20 61 6c 73 6f 20 63 6f  assembly also co
54a0: 6e 74 61 69 6e 73 20 74 68 65 20 6e 61 74 69 76  ntains the nativ
54b0: 65 20 63 6f 6d 70 6f 6e 65 6e 74 73 2c 0d 0a 20  e components,.. 
54c0: 20 20 20 20 20 23 20 20 20 20 20 20 20 77 65 20       #       we 
54d0: 68 61 76 65 20 65 76 65 72 79 74 68 69 6e 67 20  have everything 
54e0: 77 65 20 6e 65 65 64 2e 0d 0a 20 20 20 20 20 20  we need...      
54f0: 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 24 6e 61  #..      if {$na
5500: 74 69 76 65 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  tive} then {..  
5510: 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 72 75        return tru
5520: 65 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  e..      }....  
5530: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
5540: 4f 54 45 3a 20 49 66 20 74 68 65 20 6d 61 63 68  OTE: If the mach
5550: 69 6e 65 20 6e 61 6d 65 20 69 73 20 75 6e 61 76  ine name is unav
5560: 61 69 6c 61 62 6c 65 2c 20 74 68 65 72 65 20 69  ailable, there i
5570: 73 20 6e 6f 74 68 69 67 6e 20 65 6c 73 65 20 77  s nothign else w
5580: 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  e..      #      
5590: 20 63 61 6e 20 64 6f 2e 0d 0a 20 20 20 20 20 20   can do...      
55a0: 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 21 5b 69  #..      if {![i
55b0: 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 74 63 6c  nfo exists ::tcl
55c0: 5f 70 6c 61 74 66 6f 72 6d 28 6d 61 63 68 69 6e  _platform(machin
55d0: 65 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  e)]} then {..   
55e0: 20 20 20 20 20 72 65 74 75 72 6e 20 66 61 6c 73       return fals
55f0: 65 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  e..      }....  
5600: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
5610: 4f 54 45 3a 20 57 68 61 74 20 69 73 20 74 68 65  OTE: What is the
5620: 20 61 72 63 68 69 74 65 63 74 75 72 65 20 66 6f   architecture fo
5630: 72 20 74 68 69 73 20 6d 61 63 68 69 6e 65 3f 0d  r this machine?.
5640: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
5650: 73 65 74 20 61 72 63 68 69 74 65 63 74 75 72 65  set architecture
5660: 20 5b 6d 61 63 68 69 6e 65 54 6f 50 6c 61 74 66   [machineToPlatf
5670: 6f 72 6d 20 24 3a 3a 74 63 6c 5f 70 6c 61 74 66  orm $::tcl_platf
5680: 6f 72 6d 28 6d 61 63 68 69 6e 65 29 20 74 72 75  orm(machine) tru
5690: 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20  e]....      #.. 
56a0: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 57 68 61       # NOTE: Wha
56b0: 74 20 69 73 20 74 68 65 20 70 6c 61 74 66 6f 72  t is the platfor
56c0: 6d 20 66 6f 72 20 74 68 69 73 20 6d 61 63 68 69  m for this machi
56d0: 6e 65 3f 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  ne?..      #..  
56e0: 20 20 20 20 73 65 74 20 70 6c 61 74 66 6f 72 6d      set platform
56f0: 20 5b 6d 61 63 68 69 6e 65 54 6f 50 6c 61 74 66   [machineToPlatf
5700: 6f 72 6d 20 24 3a 3a 74 63 6c 5f 70 6c 61 74 66  orm $::tcl_platf
5710: 6f 72 6d 28 6d 61 63 68 69 6e 65 29 5d 0d 0a 0d  orm(machine)]...
5720: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
5730: 23 20 4e 4f 54 45 3a 20 42 75 69 6c 64 20 74 68  # NOTE: Build th
5740: 65 20 66 75 6c 6c 79 20 71 75 61 6c 69 66 69 65  e fully qualifie
5750: 64 20 66 69 6c 65 20 6e 61 6d 65 20 66 6f 72 20  d file name for 
5760: 74 68 65 20 69 6e 74 65 72 6f 70 20 61 73 73 65  the interop asse
5770: 6d 62 6c 79 0d 0a 20 20 20 20 20 20 23 20 20 20  mbly..      #   
5780: 20 20 20 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74      containing t
5790: 68 65 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53  he System.Data.S
57a0: 51 4c 69 74 65 20 6e 61 74 69 76 65 20 63 6f 6d  QLite native com
57b0: 70 6f 6e 65 6e 74 73 2e 20 20 49 66 20 74 68 69  ponents.  If thi
57c0: 73 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  s..      #      
57d0: 20 66 69 6c 65 20 65 78 69 73 74 73 2c 20 77 65   file exists, we
57e0: 20 73 68 6f 75 6c 64 20 68 61 76 65 20 65 76 65   should have eve
57f0: 72 79 74 68 69 6e 67 20 77 65 20 6e 65 65 64 2e  rything we need.
5800: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
5810: 20 66 6f 72 65 61 63 68 20 66 69 6c 65 4e 61 6d   foreach fileNam
5820: 65 4f 6e 6c 79 20 5b 67 65 74 49 6e 74 65 72 6f  eOnly [getIntero
5830: 70 41 73 73 65 6d 62 6c 79 46 69 6c 65 4e 61 6d  pAssemblyFileNam
5840: 65 73 4f 6e 6c 79 5d 20 7b 0d 0a 20 20 20 20 20  esOnly] {..     
5850: 20 20 20 73 65 74 20 66 69 6c 65 4e 61 6d 65 20     set fileName 
5860: 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65  [file nativename
5870: 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 24 64 69 72   [file join $dir
5880: 65 63 74 6f 72 79 20 5c 0d 0a 20 20 20 20 20 20  ectory \..      
5890: 20 20 20 20 20 20 24 61 72 63 68 69 74 65 63 74        $architect
58a0: 75 72 65 20 24 66 69 6c 65 4e 61 6d 65 4f 6e 6c  ure $fileNameOnl
58b0: 79 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69  y]]....        i
58c0: 66 20 7b 5b 66 69 6c 65 20 65 78 69 73 74 73 20  f {[file exists 
58d0: 24 66 69 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e  $fileName]} then
58e0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 72 65   {..          re
58f0: 74 75 72 6e 20 74 72 75 65 0d 0a 20 20 20 20 20  turn true..     
5900: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
5910: 73 65 74 20 66 69 6c 65 4e 61 6d 65 20 5b 66 69  set fileName [fi
5920: 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65 20 5b 66  le nativename [f
5930: 69 6c 65 20 6a 6f 69 6e 20 24 64 69 72 65 63 74  ile join $direct
5940: 6f 72 79 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ory \..         
5950: 20 20 20 24 70 6c 61 74 66 6f 72 6d 20 24 66 69     $platform $fi
5960: 6c 65 4e 61 6d 65 4f 6e 6c 79 5d 5d 0d 0a 0d 0a  leNameOnly]]....
5970: 20 20 20 20 20 20 20 20 69 66 20 7b 5b 66 69 6c          if {[fil
5980: 65 20 65 78 69 73 74 73 20 24 66 69 6c 65 4e 61  e exists $fileNa
5990: 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  me]} then {..   
59a0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 72         return tr
59b0: 75 65 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d  ue..        }...
59c0: 0a 20 20 20 20 20 20 20 20 73 65 74 20 66 69 6c  .        set fil
59d0: 65 4e 61 6d 65 20 5b 66 69 6c 65 20 6e 61 74 69  eName [file nati
59e0: 76 65 6e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69  vename [file joi
59f0: 6e 20 24 64 69 72 65 63 74 6f 72 79 20 5c 0d 0a  n $directory \..
5a00: 20 20 20 20 20 20 20 20 20 20 20 20 24 66 69 6c              $fil
5a10: 65 4e 61 6d 65 4f 6e 6c 79 5d 5d 0d 0a 0d 0a 20  eNameOnly]].... 
5a20: 20 20 20 20 20 20 20 69 66 20 7b 5b 66 69 6c 65         if {[file
5a30: 20 65 78 69 73 74 73 20 24 66 69 6c 65 4e 61 6d   exists $fileNam
5a40: 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  e]} then {..    
5a50: 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 72 75        return tru
5a60: 65 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  e..        }..  
5a70: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23      }....      #
5a80: 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
5a90: 42 75 69 6c 64 20 74 68 65 20 66 75 6c 6c 79 20  Build the fully 
5aa0: 71 75 61 6c 69 66 69 65 64 20 66 69 6c 65 20 6e  qualified file n
5ab0: 61 6d 65 20 66 6f 72 20 74 68 65 20 53 51 4c 69  ame for the SQLi
5ac0: 74 65 20 63 6f 72 65 0d 0a 20 20 20 20 20 20 23  te core..      #
5ad0: 20 20 20 20 20 20 20 6c 69 62 72 61 72 79 2e 20         library. 
5ae0: 20 49 66 20 74 68 69 73 20 66 69 6c 65 20 65 78   If this file ex
5af0: 69 73 74 73 2c 20 77 65 20 73 68 6f 75 6c 64 20  ists, we should 
5b00: 68 61 76 65 20 65 76 65 72 79 74 68 69 6e 67 20  have everything 
5b10: 77 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  we..      #     
5b20: 20 20 6e 65 65 64 2e 0d 0a 20 20 20 20 20 20 23    need...      #
5b30: 0d 0a 20 20 20 20 20 20 66 6f 72 65 61 63 68 20  ..      foreach 
5b40: 66 69 6c 65 4e 61 6d 65 4f 6e 6c 79 20 5b 67 65  fileNameOnly [ge
5b50: 74 4e 61 74 69 76 65 4c 69 62 72 61 72 79 46 69  tNativeLibraryFi
5b60: 6c 65 4e 61 6d 65 73 4f 6e 6c 79 5d 20 7b 0d 0a  leNamesOnly] {..
5b70: 20 20 20 20 20 20 20 20 73 65 74 20 66 69 6c 65          set file
5b80: 4e 61 6d 65 20 5b 66 69 6c 65 20 6e 61 74 69 76  Name [file nativ
5b90: 65 6e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e  ename [file join
5ba0: 20 24 64 69 72 65 63 74 6f 72 79 20 5c 0d 0a 20   $directory \.. 
5bb0: 20 20 20 20 20 20 20 20 20 20 20 24 61 72 63 68             $arch
5bc0: 69 74 65 63 74 75 72 65 20 24 66 69 6c 65 4e 61  itecture $fileNa
5bd0: 6d 65 4f 6e 6c 79 5d 5d 0d 0a 0d 0a 20 20 20 20  meOnly]]....    
5be0: 20 20 20 20 69 66 20 7b 5b 66 69 6c 65 20 65 78      if {[file ex
5bf0: 69 73 74 73 20 24 66 69 6c 65 4e 61 6d 65 5d 7d  ists $fileName]}
5c00: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
5c10: 20 20 20 72 65 74 75 72 6e 20 74 72 75 65 0d 0a     return true..
5c20: 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
5c30: 20 20 20 20 20 73 65 74 20 66 69 6c 65 4e 61 6d       set fileNam
5c40: 65 20 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e 61  e [file nativena
5c50: 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 24 64  me [file join $d
5c60: 69 72 65 63 74 6f 72 79 20 5c 0d 0a 20 20 20 20  irectory \..    
5c70: 20 20 20 20 20 20 20 20 24 70 6c 61 74 66 6f 72          $platfor
5c80: 6d 20 24 66 69 6c 65 4e 61 6d 65 4f 6e 6c 79 5d  m $fileNameOnly]
5c90: 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20  ]....        if 
5ca0: 7b 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24 66  {[file exists $f
5cb0: 69 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b  ileName]} then {
5cc0: 0d 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ..          retu
5cd0: 72 6e 20 74 72 75 65 0d 0a 20 20 20 20 20 20 20  rn true..       
5ce0: 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 73 65   }....        se
5cf0: 74 20 66 69 6c 65 4e 61 6d 65 20 5b 66 69 6c 65  t fileName [file
5d00: 20 6e 61 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c   nativename [fil
5d10: 65 20 6a 6f 69 6e 20 24 64 69 72 65 63 74 6f 72  e join $director
5d20: 79 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  y \..           
5d30: 20 24 66 69 6c 65 4e 61 6d 65 4f 6e 6c 79 5d 5d   $fileNameOnly]]
5d40: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b  ....        if {
5d50: 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24 66 69  [file exists $fi
5d60: 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d  leName]} then {.
5d70: 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
5d80: 6e 20 74 72 75 65 0d 0a 20 20 20 20 20 20 20 20  n true..        
5d90: 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  }..      }....  
5da0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
5db0: 4f 54 45 3a 20 4f 6e 65 20 6f 72 20 6d 6f 72 65  OTE: One or more
5dc0: 20 6e 61 74 69 76 65 20 63 6f 6d 70 6f 6e 65 6e   native componen
5dd0: 74 73 20 6e 65 65 64 65 64 20 62 79 20 53 79 73  ts needed by Sys
5de0: 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 0d  tem.Data.SQLite.
5df0: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 61  .      #       a
5e00: 72 65 20 6d 69 73 73 69 6e 67 2e 0d 0a 20 20 20  re missing...   
5e10: 20 20 20 23 0d 0a 20 20 20 20 20 20 72 65 74 75     #..      retu
5e20: 72 6e 20 66 61 6c 73 65 0d 0a 20 20 20 20 7d 0d  rn false..    }.
5e30: 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 69 73 52  ....    proc isR
5e40: 65 6c 65 61 73 65 41 76 61 69 6c 61 62 6c 65 20  eleaseAvailable 
5e50: 7b 20 64 69 72 65 63 74 6f 72 79 20 7b 76 61 72  { directory {var
5e60: 4e 61 6d 65 20 22 22 7d 20 7d 20 7b 0d 0a 20 20  Name ""} } {..  
5e70: 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20      if {[string 
5e80: 6c 65 6e 67 74 68 20 24 76 61 72 4e 61 6d 65 5d  length $varName]
5e90: 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20   > 0} then {..  
5ea0: 20 20 20 20 20 20 75 70 76 61 72 20 31 20 24 76        upvar 1 $v
5eb0: 61 72 4e 61 6d 65 20 24 76 61 72 4e 61 6d 65 0d  arName $varName.
5ec0: 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
5ed0: 20 20 72 65 74 75 72 6e 20 5b 69 73 42 75 69 6c    return [isBuil
5ee0: 64 41 76 61 69 6c 61 62 6c 65 20 22 22 20 24 64  dAvailable "" $d
5ef0: 69 72 65 63 74 6f 72 79 20 24 76 61 72 4e 61 6d  irectory $varNam
5f00: 65 5d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20  e]..    }.....  
5f10: 20 20 70 72 6f 63 20 6a 6f 69 6e 42 75 69 6c 64    proc joinBuild
5f20: 44 69 72 65 63 74 6f 72 79 20 7b 20 6e 61 74 69  Directory { nati
5f30: 76 65 20 70 61 74 68 20 79 65 61 72 20 70 6c 61  ve path year pla
5f40: 74 66 6f 72 6d 20 63 6f 6e 66 69 67 75 72 61 74  tform configurat
5f50: 69 6f 6e 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23  ion } {..      #
5f60: 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
5f70: 46 69 67 75 72 65 20 6f 75 74 20 61 6e 64 20 74  Figure out and t
5f80: 68 65 6e 20 72 65 74 75 72 6e 20 74 68 65 20 66  hen return the f
5f90: 75 6c 6c 79 20 71 75 61 6c 69 66 69 65 64 20 70  ully qualified p
5fa0: 61 74 68 20 74 6f 20 74 68 65 20 62 75 69 6c 64  ath to the build
5fb0: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
5fc0: 64 69 72 65 63 74 6f 72 79 20 62 61 73 65 64 20  directory based 
5fd0: 6f 6e 20 61 6c 6c 20 74 68 65 20 61 72 67 75 6d  on all the argum
5fe0: 65 6e 74 73 20 70 72 6f 76 69 64 65 64 20 62 79  ents provided by
5ff0: 20 6f 75 72 20 63 61 6c 6c 65 72 2e 0d 0a 20 20   our caller...  
6000: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20      #..      if 
6010: 7b 24 6e 61 74 69 76 65 7d 20 74 68 65 6e 20 7b  {$native} then {
6020: 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ..        return
6030: 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 24 70 61 74   [file join $pat
6040: 68 20 62 69 6e 20 24 79 65 61 72 20 24 70 6c 61  h bin $year $pla
6050: 74 66 6f 72 6d 20 24 63 6f 6e 66 69 67 75 72 61  tform $configura
6060: 74 69 6f 6e 5d 0d 0a 20 20 20 20 20 20 7d 20 65  tion]..      } e
6070: 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 72  lse {..        r
6080: 65 74 75 72 6e 20 5b 66 69 6c 65 20 6a 6f 69 6e  eturn [file join
6090: 20 24 70 61 74 68 20 62 69 6e 20 24 79 65 61 72   $path bin $year
60a0: 20 24 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20   $configuration 
60b0: 62 69 6e 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20  bin]..      }.. 
60c0: 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
60d0: 63 20 67 65 74 42 75 69 6c 64 44 69 72 65 63 74  c getBuildDirect
60e0: 6f 72 79 20 7b 20 6d 61 6e 61 67 65 64 4f 6e 6c  ory { managedOnl
60f0: 79 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a  y } {..      #..
6100: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 65        # NOTE: Se
6110: 65 20 69 66 20 74 68 65 20 22 6e 61 74 69 76 65  e if the "native
6120: 22 20 72 75 6e 74 69 6d 65 20 6f 70 74 69 6f 6e  " runtime option
6130: 20 68 61 73 20 62 65 65 6e 20 73 65 74 2e 20 20   has been set.  
6140: 49 66 20 73 6f 2c 20 75 73 65 20 74 68 65 0d 0a  If so, use the..
6150: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 64 69        #       di
6160: 72 65 63 74 6f 72 79 20 66 6f 72 20 74 68 65 20  rectory for the 
6170: 6d 69 78 65 64 2d 6d 6f 64 65 20 61 73 73 65 6d  mixed-mode assem
6180: 62 6c 79 20 28 61 2e 6b 2e 61 2e 20 74 68 65 20  bly (a.k.a. the 
6190: 6e 61 74 69 76 65 20 69 6e 74 65 72 6f 70 0d 0a  native interop..
61a0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 61 73        #       as
61b0: 73 65 6d 62 6c 79 29 2e 20 20 54 6f 20 65 6e 61  sembly).  To ena
61c0: 62 6c 65 20 74 68 69 73 20 6f 70 74 69 6f 6e 20  ble this option 
61d0: 76 69 61 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20  via the command 
61e0: 6c 69 6e 65 2c 20 65 6e 74 65 72 20 61 0d 0a 20  line, enter a.. 
61f0: 20 20 20 20 20 23 20 20 20 20 20 20 20 63 6f 6d       #       com
6200: 6d 61 6e 64 20 73 69 6d 69 6c 61 72 20 74 6f 20  mand similar to 
6210: 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  one of the follo
6220: 77 69 6e 67 20 28 61 6c 6c 20 6f 6e 20 6f 6e 65  wing (all on one
6230: 20 6c 69 6e 65 29 3a 0d 0a 20 20 20 20 20 20 23   line):..      #
6240: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
6250: 45 61 67 6c 65 53 68 65 6c 6c 2e 65 78 65 20 2d  EagleShell.exe -
6260: 69 6e 69 74 69 61 6c 69 7a 65 20 2d 72 75 6e 74  initialize -runt
6270: 69 6d 65 4f 70 74 69 6f 6e 20 6e 61 74 69 76 65  imeOption native
6280: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
6290: 20 20 2d 66 69 6c 65 20 2e 5c 70 61 74 68 5c 74    -file .\path\t
62a0: 6f 5c 61 6c 6c 2e 65 61 67 6c 65 0d 0a 20 20 20  o\all.eagle..   
62b0: 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 20 20     #..      #   
62c0: 20 20 20 20 54 6f 20 65 6e 61 62 6c 65 20 74 68      To enable th
62d0: 69 73 20 6f 70 74 69 6f 6e 20 76 69 61 20 74 68  is option via th
62e0: 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20 70  e command line p
62f0: 72 69 6f 72 20 74 6f 20 74 68 65 20 22 62 65 74  rior to the "bet
6300: 61 20 31 36 22 0d 0a 20 20 20 20 20 20 23 20 20  a 16"..      #  
6310: 20 20 20 20 20 72 65 6c 65 61 73 65 20 6f 66 20       release of 
6320: 45 61 67 6c 65 2c 20 74 68 65 20 66 6f 6c 6c 6f  Eagle, the follo
6330: 77 69 6e 67 20 63 6f 6d 6d 61 6e 64 20 6d 75 73  wing command mus
6340: 74 20 62 65 20 75 73 65 64 20 69 6e 73 74 65 61  t be used instea
6350: 64 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  d..      #      
6360: 20 28 61 6c 73 6f 20 61 6c 6c 20 6f 6e 20 6f 6e   (also all on on
6370: 65 20 6c 69 6e 65 29 3a 0d 0a 20 20 20 20 20 20  e line):..      
6380: 23 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  #..      #      
6390: 20 45 61 67 6c 65 53 68 65 6c 6c 2e 65 78 65 20   EagleShell.exe 
63a0: 2d 69 6e 69 74 69 61 6c 69 7a 65 20 2d 70 6f 73  -initialize -pos
63b0: 74 49 6e 69 74 69 61 6c 69 7a 65 0d 0a 20 20 20  tInitialize..   
63c0: 20 20 20 23 20 20 20 20 20 20 20 20 20 22 6f 62     #         "ob
63d0: 6a 65 63 74 20 69 6e 76 6f 6b 65 20 49 6e 74 65  ject invoke Inte
63e0: 72 70 72 65 74 65 72 2e 47 65 74 41 63 74 69 76  rpreter.GetActiv
63f0: 65 20 41 64 64 52 75 6e 74 69 6d 65 4f 70 74 69  e AddRuntimeOpti
6400: 6f 6e 20 6e 61 74 69 76 65 22 0d 0a 20 20 20 20  on native"..    
6410: 20 20 23 20 20 20 20 20 20 20 20 20 2d 66 69 6c    #         -fil
6420: 65 20 2e 5c 70 61 74 68 5c 74 6f 5c 61 6c 6c 2e  e .\path\to\all.
6430: 65 61 67 6c 65 0d 0a 20 20 20 20 20 20 23 0d 0a  eagle..      #..
6440: 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20        if {[info 
6450: 65 78 69 73 74 73 20 3a 3a 62 75 69 6c 64 5f 64  exists ::build_d
6460: 69 72 65 63 74 6f 72 79 5d 20 26 26 20 5c 0d 0a  irectory] && \..
6470: 20 20 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e            [strin
6480: 67 20 6c 65 6e 67 74 68 20 24 3a 3a 62 75 69 6c  g length $::buil
6490: 64 5f 64 69 72 65 63 74 6f 72 79 5d 20 3e 20 30  d_directory] > 0
64a0: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
64b0: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
64c0: 4f 54 45 3a 20 54 68 65 20 6c 6f 63 61 74 69 6f  OTE: The locatio
64d0: 6e 20 6f 66 20 74 68 65 20 62 75 69 6c 64 20 64  n of the build d
64e0: 69 72 65 63 74 6f 72 79 20 68 61 73 20 62 65 65  irectory has bee
64f0: 6e 20 6f 76 65 72 72 69 64 64 65 6e 3b 0d 0a 20  n overridden;.. 
6500: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74         #       t
6510: 68 65 72 65 66 6f 72 65 2c 20 75 73 65 20 69 74  herefore, use it
6520: 20 76 65 72 62 61 74 69 6d 2e 0d 0a 20 20 20 20   verbatim...    
6530: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72      #..        r
6540: 65 74 75 72 6e 20 24 3a 3a 62 75 69 6c 64 5f 64  eturn $::build_d
6550: 69 72 65 63 74 6f 72 79 0d 0a 20 20 20 20 20 20  irectory..      
6560: 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
6570: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
6580: 4f 54 45 3a 20 49 66 20 74 68 65 20 22 6e 61 74  OTE: If the "nat
6590: 69 76 65 22 20 72 75 6e 74 69 6d 65 20 6f 70 74  ive" runtime opt
65a0: 69 6f 6e 20 69 73 20 73 65 74 2c 20 74 68 65 20  ion is set, the 
65b0: 6d 69 78 65 64 2d 6d 6f 64 65 20 61 73 73 65 6d  mixed-mode assem
65c0: 62 6c 79 0d 0a 20 20 20 20 20 20 20 20 23 20 20  bly..        #  
65d0: 20 20 20 20 20 69 73 20 62 65 69 6e 67 20 74 65       is being te
65e0: 73 74 65 64 2e 20 20 49 6e 20 74 68 61 74 20 63  sted.  In that c
65f0: 61 73 65 2c 20 74 68 65 20 70 61 74 68 20 74 6f  ase, the path to
6600: 20 74 68 65 20 62 75 69 6c 64 20 64 69 72 65 63   the build direc
6610: 74 6f 72 79 0d 0a 20 20 20 20 20 20 20 20 23 20  tory..        # 
6620: 20 20 20 20 20 20 77 69 6c 6c 20 63 6f 6e 74 61        will conta
6630: 69 6e 20 74 68 65 20 70 6c 61 74 66 6f 72 6d 20  in the platform 
6640: 6e 61 6d 65 20 61 6e 64 20 61 6c 6c 20 74 68 65  name and all the
6650: 20 62 69 6e 61 72 69 65 73 20 75 6e 64 65 72 20   binaries under 
6660: 74 65 73 74 0d 0a 20 20 20 20 20 20 20 20 23 20  test..        # 
6670: 20 20 20 20 20 20 73 68 6f 75 6c 64 20 62 65 20        should be 
6680: 70 72 65 73 65 6e 74 20 69 6e 20 74 68 61 74 20  present in that 
6690: 64 69 72 65 63 74 6f 72 79 2e 20 20 49 66 20 74  directory.  If t
66a0: 68 65 20 22 6e 61 74 69 76 65 22 20 72 75 6e 74  he "native" runt
66b0: 69 6d 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20  ime..        #  
66c0: 20 20 20 20 20 6f 70 74 69 6f 6e 20 69 73 20 6e       option is n
66d0: 6f 74 20 73 65 74 2c 20 74 68 65 20 62 75 69 6c  ot set, the buil
66e0: 64 20 64 69 72 65 63 74 6f 72 79 20 77 69 6c 6c  d directory will
66f0: 20 62 65 20 63 6f 6e 73 69 64 65 72 65 64 20 74   be considered t
6700: 6f 20 62 65 0d 0a 20 20 20 20 20 20 20 20 23 20  o be..        # 
6710: 20 20 20 20 20 20 22 70 6c 61 74 66 6f 72 6d 2d        "platform-
6720: 6e 65 75 74 72 61 6c 22 2c 20 77 69 74 68 20 74  neutral", with t
6730: 68 65 20 6e 6f 74 61 62 6c 65 20 65 78 63 65 70  he notable excep
6740: 74 69 6f 6e 20 6f 66 20 61 6e 79 20 6e 61 74 69  tion of any nati
6750: 76 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  ve..        #   
6760: 20 20 20 20 61 73 73 65 6d 62 6c 79 20 28 65 2e      assembly (e.
6770: 67 2e 20 22 53 51 4c 69 74 65 2e 49 6e 74 65 72  g. "SQLite.Inter
6780: 6f 70 2e 64 6c 6c 22 29 20 63 6f 70 69 65 64 20  op.dll") copied 
6790: 74 68 65 72 65 20 64 75 72 69 6e 67 20 74 68 65  there during the
67a0: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
67b0: 20 20 62 75 69 6c 64 20 70 72 6f 63 65 73 73 20    build process 
67c0: 69 74 73 65 6c 66 2e 20 20 49 66 20 74 68 65 20  itself.  If the 
67d0: 62 75 69 6c 64 20 70 72 6f 63 65 73 73 20 73 6f  build process so
67e0: 6d 65 68 6f 77 20 64 6f 65 73 20 6e 6f 74 0d 0a  mehow does not..
67f0: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
6800: 63 6f 70 79 20 74 68 65 20 6e 61 74 69 76 65 20  copy the native 
6810: 61 73 73 65 6d 62 6c 79 20 66 6f 72 20 74 68 69  assembly for thi
6820: 73 20 70 6c 61 74 66 6f 72 6d 2c 20 6d 6f 73 74  s platform, most
6830: 20 6f 66 20 74 68 65 20 74 65 73 74 73 0d 0a 20   of the tests.. 
6840: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 69         #       i
6850: 6e 20 74 68 65 20 73 75 69 74 65 20 77 69 6c 6c  n the suite will
6860: 20 73 69 6d 70 6c 79 20 62 65 20 73 6b 69 70 70   simply be skipp
6870: 65 64 2e 20 20 47 65 6e 65 72 61 6c 6c 79 20 73  ed.  Generally s
6880: 70 65 61 6b 69 6e 67 2c 20 74 68 65 72 65 0d 0a  peaking, there..
6890: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
68a0: 61 72 65 20 74 77 6f 20 77 61 79 73 20 74 6f 20  are two ways to 
68b0: 62 75 69 6c 64 20 74 68 65 20 62 69 6e 61 72 69  build the binari
68c0: 65 73 20 77 68 65 6e 20 70 72 65 70 61 72 69 6e  es when preparin
68d0: 67 20 74 6f 20 72 75 6e 20 74 68 65 0d 0a 20 20  g to run the..  
68e0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74 65        #       te
68f0: 73 74 20 73 75 69 74 65 3a 0d 0a 20 20 20 20 20  st suite:..     
6900: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
6910: 20 20 20 20 20 20 31 2e 20 42 75 69 6c 64 20 74        1. Build t
6920: 68 65 20 73 65 70 61 72 61 74 65 20 6d 61 6e 61  he separate mana
6930: 67 65 64 20 61 6e 64 20 6e 61 74 69 76 65 20 61  ged and native a
6940: 73 73 65 6d 62 6c 69 65 73 20 75 73 69 6e 67 20  ssemblies using 
6950: 73 6f 6d 65 0d 0a 20 20 20 20 20 20 20 20 23 20  some..        # 
6960: 20 20 20 20 20 20 20 20 20 63 6f 6d 6d 61 6e 64           command
6970: 73 20 73 69 6d 69 6c 61 72 20 74 6f 3a 0d 0a 20  s similar to:.. 
6980: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
6990: 20 20 23 20 20 20 20 20 20 20 20 20 20 62 75 69    #          bui
69a0: 6c 64 2e 62 61 74 20 24 7b 43 6f 6e 66 69 67 75  ld.bat ${Configu
69b0: 72 61 74 69 6f 6e 7d 4d 61 6e 61 67 65 64 4f 6e  ration}ManagedOn
69c0: 6c 79 20 24 7b 50 6c 61 74 66 6f 72 6d 7d 0d 0a  ly ${Platform}..
69d0: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
69e0: 20 20 20 62 75 69 6c 64 2e 62 61 74 20 24 7b 43     build.bat ${C
69f0: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 7d 4e 61 74  onfiguration}Nat
6a00: 69 76 65 4f 6e 6c 79 20 24 7b 50 6c 61 74 66 6f  iveOnly ${Platfo
6a10: 72 6d 7d 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  rm}..        #..
6a20: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
6a30: 20 20 20 57 68 65 72 65 20 24 7b 43 6f 6e 66 69     Where ${Confi
6a40: 67 75 72 61 74 69 6f 6e 7d 20 69 73 20 65 69 74  guration} is eit
6a50: 68 65 72 20 22 44 65 62 75 67 22 20 6f 72 20 22  her "Debug" or "
6a60: 52 65 6c 65 61 73 65 22 20 61 6e 64 0d 0a 20 20  Release" and..  
6a70: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 20 20        #         
6a80: 20 24 7b 50 6c 61 74 66 6f 72 6d 7d 20 69 73 20   ${Platform} is 
6a90: 65 69 74 68 65 72 20 22 57 69 6e 33 32 22 20 6f  either "Win32" o
6aa0: 72 20 22 78 36 34 22 2e 0d 0a 20 20 20 20 20 20  r "x64"...      
6ab0: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 20    #..        #  
6ac0: 20 20 20 20 20 32 2e 20 42 75 69 6c 64 20 74 68       2. Build th
6ad0: 65 20 6d 69 78 65 64 2d 6d 6f 64 65 20 61 73 73  e mixed-mode ass
6ae0: 65 6d 62 6c 79 20 75 73 69 6e 67 20 61 20 63 6f  embly using a co
6af0: 6d 6d 61 6e 64 20 73 69 6d 69 6c 61 72 20 74 6f  mmand similar to
6b00: 3a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  :..        #..  
6b10: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 20 20        #         
6b20: 20 62 75 69 6c 64 2e 62 61 74 20 24 7b 43 6f 6e   build.bat ${Con
6b30: 66 69 67 75 72 61 74 69 6f 6e 7d 20 24 7b 50 6c  figuration} ${Pl
6b40: 61 74 66 6f 72 6d 7d 0d 0a 20 20 20 20 20 20 20  atform}..       
6b50: 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20   #..        #   
6b60: 20 20 20 20 20 20 20 57 68 65 72 65 20 24 7b 43         Where ${C
6b70: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 7d 20 69 73  onfiguration} is
6b80: 20 65 69 74 68 65 72 20 22 44 65 62 75 67 22 20   either "Debug" 
6b90: 6f 72 20 22 52 65 6c 65 61 73 65 22 20 61 6e 64  or "Release" and
6ba0: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
6bb0: 20 20 20 20 20 24 7b 50 6c 61 74 66 6f 72 6d 7d       ${Platform}
6bc0: 20 69 73 20 65 69 74 68 65 72 20 22 57 69 6e 33   is either "Win3
6bd0: 32 22 20 6f 72 20 22 78 36 34 22 2e 20 20 49 66  2" or "x64".  If
6be0: 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 69 73   this command is
6bf0: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
6c00: 20 20 20 20 20 75 73 65 64 2c 20 76 61 72 69 6f       used, vario
6c10: 75 73 20 74 65 73 74 73 20 74 68 61 74 20 72 65  us tests that re
6c20: 71 75 69 72 65 20 73 75 70 70 6c 65 6d 65 6e 74  quire supplement
6c30: 61 72 79 20 6d 61 6e 61 67 65 64 0d 0a 20 20 20  ary managed..   
6c40: 20 20 20 20 20 23 20 20 20 20 20 20 20 20 20 20       #          
6c50: 61 73 73 65 6d 62 6c 69 65 73 20 28 65 2e 67 2e  assemblies (e.g.
6c60: 20 4c 49 4e 51 29 20 6d 61 79 20 62 65 20 73 6b   LINQ) may be sk
6c70: 69 70 70 65 64 20 75 6e 6c 65 73 73 20 74 68 6f  ipped unless tho
6c80: 73 65 20 62 69 6e 61 72 69 65 73 0d 0a 20 20 20  se binaries..   
6c90: 20 20 20 20 20 23 20 20 20 20 20 20 20 20 20 20       #          
6ca0: 61 72 65 20 73 75 62 73 65 71 75 65 6e 74 6c 79  are subsequently
6cb0: 20 63 6f 70 69 65 64 20 69 6e 74 6f 20 74 68 65   copied into the
6cc0: 20 63 6f 72 72 65 63 74 20 64 69 72 65 63 74 6f   correct directo
6cd0: 72 79 20 28 69 2e 65 2e 20 62 79 0d 0a 20 20 20  ry (i.e. by..   
6ce0: 20 20 20 20 20 23 20 20 20 20 20 20 20 20 20 20       #          
6cf0: 22 74 65 73 74 5f 61 6c 6c 2e 62 61 74 22 29 2e  "test_all.bat").
6d00: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
6d10: 20 20 20 20 20 23 20 20 20 20 20 20 20 4e 6f 74       #       Not
6d20: 65 20 74 68 61 74 20 61 6c 6c 20 6f 66 20 74 68  e that all of th
6d30: 65 20 62 75 69 6c 64 20 63 6f 6d 6d 61 6e 64 73  e build commands
6d40: 20 61 62 6f 76 65 20 77 69 6c 6c 20 64 65 66 61   above will defa
6d50: 75 6c 74 20 74 6f 20 75 73 69 6e 67 0d 0a 20 20  ult to using..  
6d60: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68        #       th
6d70: 65 20 6c 61 74 65 73 74 20 76 65 72 73 69 6f 6e  e latest version
6d80: 20 6f 66 20 4d 53 42 75 69 6c 64 20 61 76 61 69   of MSBuild avai
6d90: 6c 61 62 6c 65 20 61 6e 64 20 74 68 65 20 22 74  lable and the "t
6da0: 65 73 74 5f 79 65 61 72 22 20 6d 61 79 0d 0a 20  est_year" may.. 
6db0: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 6e         #       n
6dc0: 65 65 64 20 74 6f 20 62 65 20 61 64 6a 75 73 74  eed to be adjust
6dd0: 65 64 20 61 63 63 6f 72 64 69 6e 67 6c 79 20 74  ed accordingly t
6de0: 6f 20 61 63 74 75 61 6c 6c 79 20 72 75 6e 20 74  o actually run t
6df0: 68 65 20 74 65 73 74 20 73 75 69 74 65 2e 0d 0a  he test suite...
6e00: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
6e10: 52 65 66 65 72 20 74 6f 20 74 68 65 20 63 6f 6d  Refer to the com
6e20: 6d 65 6e 74 73 20 69 6e 20 5b 67 65 74 42 75 69  ments in [getBui
6e30: 6c 64 59 65 61 72 5d 20 66 6f 72 20 6d 6f 72 65  ldYear] for more
6e40: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e 0d   information on.
6e50: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
6e60: 20 68 6f 77 20 74 6f 20 73 65 74 20 74 68 69 73   how to set this
6e70: 20 76 61 72 69 61 62 6c 65 2e 0d 0a 20 20 20 20   variable...    
6e80: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 73      #..        s
6e90: 65 74 20 6e 61 74 69 76 65 20 5b 65 78 70 72 20  et native [expr 
6ea0: 7b 21 24 6d 61 6e 61 67 65 64 4f 6e 6c 79 20 26  {!$managedOnly &
6eb0: 26 20 5b 68 61 73 52 75 6e 74 69 6d 65 4f 70 74  & [hasRuntimeOpt
6ec0: 69 6f 6e 20 6e 61 74 69 76 65 5d 7d 5d 0d 0a 0d  ion native]}]...
6ed0: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
6ee0: 5b 6a 6f 69 6e 42 75 69 6c 64 44 69 72 65 63 74  [joinBuildDirect
6ef0: 6f 72 79 20 24 6e 61 74 69 76 65 20 5b 67 65 74  ory $native [get
6f00: 42 75 69 6c 64 42 61 73 65 44 69 72 65 63 74 6f  BuildBaseDirecto
6f10: 72 79 5d 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ry] \..         
6f20: 20 20 20 5b 67 65 74 42 75 69 6c 64 59 65 61 72     [getBuildYear
6f30: 5d 20 5b 67 65 74 42 75 69 6c 64 50 6c 61 74 66  ] [getBuildPlatf
6f40: 6f 72 6d 20 24 6e 61 74 69 76 65 5d 20 5b 67 65  orm $native] [ge
6f50: 74 42 75 69 6c 64 43 6f 6e 66 69 67 75 72 61 74  tBuildConfigurat
6f60: 69 6f 6e 5d 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a  ion]]..      }..
6f70: 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
6f80: 6f 63 20 67 65 74 52 65 6c 65 61 73 65 56 65 72  oc getReleaseVer
6f90: 73 69 6f 6e 20 7b 7d 20 7b 0d 0a 20 20 20 20 20  sion {} {..     
6fa0: 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
6fb0: 3a 20 46 69 67 75 72 65 20 6f 75 74 20 74 68 65  : Figure out the
6fc0: 20 72 65 6c 65 61 73 65 20 76 65 72 73 69 6f 6e   release version
6fd0: 20 66 6f 72 20 75 73 65 20 77 69 74 68 20 74 68   for use with th
6fe0: 65 20 62 75 69 6c 64 20 64 69 72 65 63 74 6f 72  e build director
6ff0: 79 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  y..      #      
7000: 20 77 68 65 6e 20 63 68 65 63 6b 69 6e 67 20 66   when checking f
7010: 6f 72 20 61 76 61 69 6c 61 62 6c 65 20 72 65 6c  or available rel
7020: 65 61 73 65 73 2e 0d 0a 20 20 20 20 20 20 23 0d  eases...      #.
7030: 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f  .      if {[info
7040: 20 65 78 69 73 74 73 20 3a 3a 72 65 6c 65 61 73   exists ::releas
7050: 65 5f 76 65 72 73 69 6f 6e 5d 20 26 26 20 5c 0d  e_version] && \.
7060: 0a 20 20 20 20 20 20 20 20 20 20 5b 73 74 72 69  .          [stri
7070: 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a 72 65 6c  ng length $::rel
7080: 65 61 73 65 5f 76 65 72 73 69 6f 6e 5d 20 3e 20  ease_version] > 
7090: 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
70a0: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
70b0: 4e 4f 54 45 3a 20 54 68 65 20 72 65 6c 65 61 73  NOTE: The releas
70c0: 65 20 76 65 72 73 69 6f 6e 20 68 61 73 20 62 65  e version has be
70d0: 65 6e 20 6f 76 65 72 72 69 64 64 65 6e 3b 20 74  en overridden; t
70e0: 68 65 72 65 66 6f 72 65 2c 20 75 73 65 20 69 74  herefore, use it
70f0: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
7100: 20 20 76 65 72 62 61 74 69 6d 2e 0d 0a 20 20 20    verbatim...   
7110: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
7120: 72 65 74 75 72 6e 20 24 3a 3a 72 65 6c 65 61 73  return $::releas
7130: 65 5f 76 65 72 73 69 6f 6e 0d 0a 20 20 20 20 20  e_version..     
7140: 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
7150: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
7160: 4e 4f 54 45 3a 20 4e 6f 20 72 65 6c 65 61 73 65  NOTE: No release
7170: 20 76 65 72 73 69 6f 6e 20 69 73 20 61 76 61 69   version is avai
7180: 6c 61 62 6c 65 2c 20 72 65 74 75 72 6e 20 61 6e  lable, return an
7190: 20 65 6d 70 74 79 20 73 74 72 69 6e 67 2e 0d 0a   empty string...
71a0: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
71b0: 49 74 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20  It is important 
71c0: 74 6f 20 72 65 74 75 72 6e 20 61 6e 20 65 6d 70  to return an emp
71d0: 74 79 20 73 74 72 69 6e 67 20 68 65 72 65 20 62  ty string here b
71e0: 65 63 61 75 73 65 20 74 68 65 0d 0a 20 20 20 20  ecause the..    
71f0: 20 20 20 20 23 20 20 20 20 20 20 20 72 65 73 75      #       resu
7200: 6c 74 20 6f 66 20 74 68 69 73 20 70 72 6f 63 65  lt of this proce
7210: 64 75 72 65 20 6d 61 79 20 62 65 20 75 73 65 64  dure may be used
7220: 20 77 69 74 68 20 5b 66 69 6c 65 20 6a 6f 69 6e   with [file join
7230: 5d 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  ]...        #.. 
7240: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 22 22         return ""
7250: 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d  ..      }..    }
7260: 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65  .....    proc ge
7270: 74 42 75 69 6c 64 46 69 6c 65 4e 61 6d 65 20 7b  tBuildFileName {
7280: 20 66 69 6c 65 4e 61 6d 65 20 6d 61 6e 61 67 65   fileName manage
7290: 64 4f 6e 6c 79 20 7b 70 6c 61 74 66 6f 72 6d 20  dOnly {platform 
72a0: 22 22 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23  ""} } {..      #
72b0: 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
72c0: 52 65 74 75 72 6e 73 20 74 68 65 20 73 70 65 63  Returns the spec
72d0: 69 66 69 65 64 20 66 69 6c 65 20 6e 61 6d 65 20  ified file name 
72e0: 61 73 20 69 66 20 69 74 20 77 65 72 65 20 6c 6f  as if it were lo
72f0: 63 61 74 65 64 20 69 6e 20 74 68 65 0d 0a 20 20  cated in the..  
7300: 20 20 20 20 23 20 20 20 20 20 20 20 62 75 69 6c      #       buil
7310: 64 20 64 69 72 65 63 74 6f 72 79 2c 20 64 69 73  d directory, dis
7320: 63 61 72 64 69 6e 67 20 61 6e 79 20 64 69 72 65  carding any dire
7330: 63 74 6f 72 79 20 69 6e 66 6f 72 6d 61 74 69 6f  ctory informatio
7340: 6e 20 70 72 65 73 65 6e 74 0d 0a 20 20 20 20 20  n present..     
7350: 20 23 20 20 20 20 20 20 20 69 6e 20 74 68 65 20   #       in the 
7360: 66 69 6c 65 20 6e 61 6d 65 20 61 73 20 70 72 6f  file name as pro
7370: 76 69 64 65 64 20 62 79 20 6f 75 72 20 63 61 6c  vided by our cal
7380: 6c 65 72 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ler...      #.. 
7390: 20 20 20 20 20 73 65 74 20 72 65 73 75 6c 74 20       set result 
73a0: 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65  [file nativename
73b0: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 66   \..          [f
73c0: 69 6c 65 20 6a 6f 69 6e 20 5b 67 65 74 42 75 69  ile join [getBui
73d0: 6c 64 44 69 72 65 63 74 6f 72 79 20 24 6d 61 6e  ldDirectory $man
73e0: 61 67 65 64 4f 6e 6c 79 5d 20 24 70 6c 61 74 66  agedOnly] $platf
73f0: 6f 72 6d 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  orm \..         
7400: 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 66 69 6c   [file tail $fil
7410: 65 4e 61 6d 65 5d 5d 5d 0d 0a 0d 0a 20 20 20 20  eName]]]....    
7420: 20 20 23 0d 0a 20 20 20 20 20 20 23 20 48 41 43    #..      # HAC
7430: 4b 3a 20 57 68 65 6e 20 72 75 6e 6e 69 6e 67 20  K: When running 
7440: 6f 6e 20 57 6f 57 36 34 2c 20 61 73 73 75 6d 65  on WoW64, assume
7450: 20 74 68 65 20 74 65 73 74 20 65 78 65 63 75 74   the test execut
7460: 61 62 6c 65 73 20 61 72 65 20 70 72 65 73 65 6e  ables are presen
7470: 74 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  t..      #      
7480: 20 77 69 74 68 20 74 68 65 20 22 33 32 22 20 73   with the "32" s
7490: 75 66 66 69 78 20 6f 6e 20 74 68 65 6d 2e 0d 0a  uffix on them...
74a0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69        #..      i
74b0: 66 20 7b 5b 69 73 52 75 6e 6e 69 6e 67 57 6f 57  f {[isRunningWoW
74c0: 36 34 5d 20 26 26 20 5b 66 69 6c 65 20 65 78 74  64] && [file ext
74d0: 65 6e 73 69 6f 6e 20 24 72 65 73 75 6c 74 5d 20  ension $result] 
74e0: 65 71 20 22 2e 65 78 65 22 7d 20 74 68 65 6e 20  eq ".exe"} then 
74f0: 7b 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 72  {..        set r
7500: 65 73 75 6c 74 20 5b 61 70 70 65 6e 64 41 72 67  esult [appendArg
7510: 73 20 5b 66 69 6c 65 20 72 6f 6f 74 6e 61 6d 65  s [file rootname
7520: 20 24 72 65 73 75 6c 74 5d 20 33 32 2e 65 78 65   $result] 32.exe
7530: 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  ]..      }....  
7540: 20 20 20 20 72 65 74 75 72 6e 20 24 72 65 73 75      return $resu
7550: 6c 74 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20  lt..    }.....  
7560: 20 20 70 72 6f 63 20 67 65 74 45 78 74 65 72 6e    proc getExtern
7570: 61 6c 44 69 72 65 63 74 6f 72 79 20 7b 7d 20 7b  alDirectory {} {
7580: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
7590: 20 23 20 4e 4f 54 45 3a 20 54 68 69 73 20 70 72   # NOTE: This pr
75a0: 6f 63 65 64 75 72 65 20 72 65 74 75 72 6e 73 20  ocedure returns 
75b0: 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 77 68  the directory wh
75c0: 65 72 65 20 74 68 65 20 65 78 74 65 72 6e 61 6c  ere the external
75d0: 20 62 69 6e 61 72 79 0d 0a 20 20 20 20 20 20 23   binary..      #
75e0: 20 20 20 20 20 20 20 66 69 6c 65 73 20 61 72 65         files are
75f0: 20 6c 6f 63 61 74 65 64 2e 0d 0a 20 20 20 20 20   located...     
7600: 20 23 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e   #..      return
7610: 20 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d   [file nativenam
7620: 65 20 5b 66 69 6c 65 20 64 69 72 6e 61 6d 65 20  e [file dirname 
7630: 5b 66 69 6c 65 20 64 69 72 6e 61 6d 65 20 5b 69  [file dirname [i
7640: 6e 66 6f 20 62 69 6e 61 72 79 5d 5d 5d 5d 0d 0a  nfo binary]]]]..
7650: 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
7660: 6f 63 20 67 65 74 42 69 6e 61 72 79 44 69 72 65  oc getBinaryDire
7670: 63 74 6f 72 79 20 7b 7d 20 7b 0d 0a 20 20 20 20  ctory {} {..    
7680: 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
7690: 45 3a 20 54 68 69 73 20 70 72 6f 63 65 64 75 72  E: This procedur
76a0: 65 20 72 65 74 75 72 6e 73 20 74 68 65 20 64 69  e returns the di
76b0: 72 65 63 74 6f 72 79 20 77 68 65 72 65 20 74 68  rectory where th
76c0: 65 20 74 65 73 74 20 61 70 70 6c 69 63 61 74 69  e test applicati
76d0: 6f 6e 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  on..      #     
76e0: 20 20 69 74 73 65 6c 66 20 28 69 2e 65 2e 20 74    itself (i.e. t
76f0: 68 65 20 45 61 67 6c 65 20 73 68 65 6c 6c 29 20  he Eagle shell) 
7700: 69 73 20 6c 6f 63 61 74 65 64 2e 20 20 54 68 69  is located.  Thi
7710: 73 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 61  s will be used a
7720: 73 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  s..      #      
7730: 20 74 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e   the destination
7740: 20 66 6f 72 20 74 68 65 20 63 6f 70 69 65 64 20   for the copied 
7750: 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
7760: 74 65 20 6e 61 74 69 76 65 20 61 6e 64 0d 0a 20  te native and.. 
7770: 20 20 20 20 20 23 20 20 20 20 20 20 20 6d 61 6e       #       man
7780: 61 67 65 64 20 61 73 73 65 6d 62 6c 69 65 73 20  aged assemblies 
7790: 28 69 2e 65 2e 20 62 65 63 61 75 73 65 20 74 68  (i.e. because th
77a0: 69 73 20 69 73 20 6f 6e 65 20 6f 66 20 74 68 65  is is one of the
77b0: 20 66 65 77 20 70 6c 61 63 65 73 0d 0a 20 20 20   few places..   
77c0: 20 20 20 23 20 20 20 20 20 20 20 77 68 65 72 65     #       where
77d0: 20 74 68 65 20 43 4c 52 20 77 69 6c 6c 20 61 63   the CLR will ac
77e0: 74 75 61 6c 6c 79 20 66 69 6e 64 20 61 6e 64 20  tually find and 
77f0: 6c 6f 61 64 20 74 68 65 6d 20 70 72 6f 70 65 72  load them proper
7800: 6c 79 29 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ly)...      #.. 
7810: 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65       if {[info e
7820: 78 69 73 74 73 20 3a 3a 62 69 6e 61 72 79 5f 64  xists ::binary_d
7830: 69 72 65 63 74 6f 72 79 5d 20 26 26 20 5c 0d 0a  irectory] && \..
7840: 20 20 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e            [strin
7850: 67 20 6c 65 6e 67 74 68 20 24 3a 3a 62 69 6e 61  g length $::bina
7860: 72 79 5f 64 69 72 65 63 74 6f 72 79 5d 20 3e 20  ry_directory] > 
7870: 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
7880: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
7890: 4e 4f 54 45 3a 20 54 68 65 20 6c 6f 63 61 74 69  NOTE: The locati
78a0: 6f 6e 20 6f 66 20 74 68 65 20 62 69 6e 61 72 79  on of the binary
78b0: 20 64 69 72 65 63 74 6f 72 79 20 68 61 73 20 62   directory has b
78c0: 65 65 6e 20 6f 76 65 72 72 69 64 64 65 6e 3b 0d  een overridden;.
78d0: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
78e0: 20 74 68 65 72 65 66 6f 72 65 2c 20 75 73 65 20   therefore, use 
78f0: 69 74 20 76 65 72 62 61 74 69 6d 2e 0d 0a 20 20  it verbatim...  
7900: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
7910: 20 72 65 74 75 72 6e 20 24 3a 3a 62 69 6e 61 72   return $::binar
7920: 79 5f 64 69 72 65 63 74 6f 72 79 0d 0a 20 20 20  y_directory..   
7930: 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
7940: 20 20 20 20 20 72 65 74 75 72 6e 20 5b 69 6e 66       return [inf
7950: 6f 20 62 69 6e 61 72 79 5d 0d 0a 20 20 20 20 20  o binary]..     
7960: 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20   }..    }.....  
7970: 20 20 70 72 6f 63 20 67 65 74 45 78 74 65 72 6e    proc getExtern
7980: 61 6c 46 69 6c 65 4e 61 6d 65 20 7b 20 66 69 6c  alFileName { fil
7990: 65 4e 61 6d 65 20 7d 20 7b 0d 0a 20 20 20 20 20  eName } {..     
79a0: 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
79b0: 3a 20 52 65 74 75 72 6e 73 20 74 68 65 20 73 70  : Returns the sp
79c0: 65 63 69 66 69 65 64 20 66 69 6c 65 20 6e 61 6d  ecified file nam
79d0: 65 20 61 73 20 69 66 20 69 74 20 77 65 72 65 20  e as if it were 
79e0: 6c 6f 63 61 74 65 64 20 69 6e 20 74 68 65 0d 0a  located in the..
79f0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 64 69        #       di
7a00: 72 65 63 74 6f 72 79 20 63 6f 6e 74 61 69 6e 69  rectory containi
7a10: 6e 67 20 74 68 65 20 65 78 74 65 72 6e 61 6c 20  ng the external 
7a20: 62 69 6e 61 72 69 65 73 2e 0d 0a 20 20 20 20 20  binaries...     
7a30: 20 23 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e   #..      return
7a40: 20 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d   [file nativenam
7a50: 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5b 67 65  e [file join [ge
7a60: 74 45 78 74 65 72 6e 61 6c 44 69 72 65 63 74 6f  tExternalDirecto
7a70: 72 79 5d 20 24 66 69 6c 65 4e 61 6d 65 5d 5d 0d  ry] $fileName]].
7a80: 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70  .    }.....    p
7a90: 72 6f 63 20 67 65 74 42 69 6e 61 72 79 46 69 6c  roc getBinaryFil
7aa0: 65 4e 61 6d 65 20 7b 20 66 69 6c 65 4e 61 6d 65  eName { fileName
7ab0: 20 7b 70 6c 61 74 66 6f 72 6d 20 22 22 7d 20 7d   {platform ""} }
7ac0: 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20   {..      #..   
7ad0: 20 20 20 23 20 4e 4f 54 45 3a 20 52 65 74 75 72     # NOTE: Retur
7ae0: 6e 73 20 74 68 65 20 73 70 65 63 69 66 69 65 64  ns the specified
7af0: 20 66 69 6c 65 20 6e 61 6d 65 20 61 73 20 69 66   file name as if
7b00: 20 69 74 20 77 65 72 65 20 6c 6f 63 61 74 65 64   it were located
7b10: 20 69 6e 20 74 68 65 0d 0a 20 20 20 20 20 20 23   in the..      #
7b20: 20 20 20 20 20 20 20 62 69 6e 61 72 79 20 64 69         binary di
7b30: 72 65 63 74 6f 72 79 2c 20 64 69 73 63 61 72 64  rectory, discard
7b40: 69 6e 67 20 61 6e 79 20 64 69 72 65 63 74 6f 72  ing any director
7b50: 79 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 70 72  y information pr
7b60: 65 73 65 6e 74 0d 0a 20 20 20 20 20 20 23 20 20  esent..      #  
7b70: 20 20 20 20 20 69 6e 20 74 68 65 20 66 69 6c 65       in the file
7b80: 20 6e 61 6d 65 20 61 73 20 70 72 6f 76 69 64 65   name as provide
7b90: 64 20 62 79 20 6f 75 72 20 63 61 6c 6c 65 72 2e  d by our caller.
7ba0: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
7bb0: 20 72 65 74 75 72 6e 20 5b 66 69 6c 65 20 6e 61   return [file na
7bc0: 74 69 76 65 6e 61 6d 65 20 5c 0d 0a 20 20 20 20  tivename \..    
7bd0: 20 20 20 20 20 20 5b 66 69 6c 65 20 6a 6f 69 6e        [file join
7be0: 20 5b 67 65 74 42 69 6e 61 72 79 44 69 72 65 63   [getBinaryDirec
7bf0: 74 6f 72 79 5d 20 24 70 6c 61 74 66 6f 72 6d 20  tory] $platform 
7c00: 5b 66 69 6c 65 20 74 61 69 6c 20 24 66 69 6c 65  [file tail $file
7c10: 4e 61 6d 65 5d 5d 5d 0d 0a 20 20 20 20 7d 0d 0a  Name]]]..    }..
7c20: 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74 43  ...    proc getC
7c30: 6f 72 65 42 69 6e 61 72 79 46 69 6c 65 4e 61 6d  oreBinaryFileNam
7c40: 65 20 7b 20 7b 70 6c 61 74 66 6f 72 6d 20 22 22  e { {platform ""
7c50: 7d 20 7b 73 74 61 6e 64 61 72 64 20 22 22 7d 20  } {standard ""} 
7c60: 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  } {..      #..  
7c70: 20 20 20 20 23 20 4e 4f 54 45 3a 20 52 65 74 75      # NOTE: Retu
7c80: 72 6e 73 20 74 68 65 20 66 75 6c 6c 20 70 61 74  rns the full pat
7c90: 68 20 66 6f 72 20 74 68 65 20 66 69 6c 65 20 63  h for the file c
7ca0: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 53 51  ontaining the SQ
7cb0: 4c 69 74 65 20 63 6f 72 65 0d 0a 20 20 20 20 20  Lite core..     
7cc0: 20 23 20 20 20 20 20 20 20 6e 61 74 69 76 65 20   #       native 
7cd0: 6c 69 62 72 61 72 79 20 63 6f 64 65 20 66 6f 72  library code for
7ce0: 20 74 68 69 73 20 70 6c 61 74 66 6f 72 6d 2e 20   this platform. 
7cf0: 20 46 69 72 73 74 2c 20 63 68 65 63 6b 20 61 6e   First, check an
7d00: 64 20 73 65 65 20 69 66 0d 0a 20 20 20 20 20 20  d see if..      
7d10: 23 20 20 20 20 20 20 20 74 68 65 20 53 51 4c 69  #       the SQLi
7d20: 74 65 20 63 6f 72 65 20 6e 61 74 69 76 65 20 6c  te core native l
7d30: 69 62 72 61 72 79 20 68 61 73 20 61 6c 72 65 61  ibrary has alrea
7d40: 64 79 20 62 65 65 6e 20 6c 6f 61 64 65 64 2e 20  dy been loaded. 
7d50: 20 4e 65 78 74 2c 0d 0a 20 20 20 20 20 20 23 20   Next,..      # 
7d60: 20 20 20 20 20 20 66 61 6c 6c 62 61 63 6b 20 74        fallback t
7d70: 6f 20 77 68 61 74 20 74 68 65 20 66 75 6c 6c 20  o what the full 
7d80: 70 61 74 68 20 73 68 6f 75 6c 64 20 62 65 2c 20  path should be, 
7d90: 62 61 73 65 64 20 6f 6e 20 77 68 65 74 68 65 72  based on whether
7da0: 20 74 68 65 0d 0a 20 20 20 20 20 20 23 20 20 20   the..      #   
7db0: 20 20 20 20 6d 69 78 65 64 2d 6d 6f 64 65 20 61      mixed-mode a
7dc0: 73 73 65 6d 62 6c 79 20 69 73 20 62 65 69 6e 67  ssembly is being
7dd0: 20 75 73 65 64 20 61 6e 64 20 74 68 65 20 6e 61   used and the na
7de0: 6d 65 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e  me of the curren
7df0: 74 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  t..      #      
7e00: 20 70 6c 61 74 66 6f 72 6d 2e 0d 0a 20 20 20 20   platform...    
7e10: 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b    #..      if {[
7e20: 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20  catch {..       
7e30: 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d   object invoke -
7e40: 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63  flags +NonPublic
7e50: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
7e60: 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
7e70: 74 65 2e 55 6e 73 61 66 65 4e 61 74 69 76 65 4d  te.UnsafeNativeM
7e80: 65 74 68 6f 64 73 20 5f 53 51 4c 69 74 65 4e 61  ethods _SQLiteNa
7e90: 74 69 76 65 4d 6f 64 75 6c 65 46 69 6c 65 4e 61  tiveModuleFileNa
7ea0: 6d 65 0d 0a 20 20 20 20 20 20 7d 20 66 69 6c 65  me..      } file
7eb0: 4e 61 6d 65 5d 20 3d 3d 20 30 20 26 26 20 5b 73  Name] == 0 && [s
7ec0: 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 66 69  tring length $fi
7ed0: 6c 65 4e 61 6d 65 5d 20 3e 20 30 7d 20 74 68 65  leName] > 0} the
7ee0: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  n {..        #..
7ef0: 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
7f00: 54 68 65 20 53 51 4c 69 74 65 20 63 6f 72 65 20  The SQLite core 
7f10: 6e 61 74 69 76 65 20 6c 69 62 72 61 72 79 20 68  native library h
7f20: 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
7f30: 6c 6f 61 64 65 64 20 76 69 61 0d 0a 20 20 20 20  loaded via..    
7f40: 20 20 20 20 23 20 20 20 20 20 20 20 74 68 65 20      #       the 
7f50: 6e 61 74 69 76 65 20 6c 69 62 72 61 72 79 20 70  native library p
7f60: 72 65 2d 6c 6f 61 64 65 72 2e 20 20 52 65 74 75  re-loader.  Retu
7f70: 72 6e 20 74 68 61 74 20 66 69 6c 65 20 6e 61 6d  rn that file nam
7f80: 65 20 6e 6f 77 2e 0d 0a 20 20 20 20 20 20 20 20  e now...        
7f90: 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  #..        retur
7fa0: 6e 20 24 66 69 6c 65 4e 61 6d 65 0d 0a 20 20 20  n $fileName..   
7fb0: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d     }....      #.
7fc0: 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49  .      # NOTE: I
7fd0: 66 20 74 68 65 20 22 6e 61 74 69 76 65 22 20 72  f the "native" r
7fe0: 75 6e 74 69 6d 65 20 6f 70 74 69 6f 6e 20 68 61  untime option ha
7ff0: 73 20 62 65 65 6e 20 73 65 74 2c 20 61 6c 77 61  s been set, alwa
8000: 79 73 20 72 65 74 75 72 6e 20 74 68 65 0d 0a 20  ys return the.. 
8010: 20 20 20 20 20 23 20 20 20 20 20 20 20 66 69 6c       #       fil
8020: 65 20 6e 61 6d 65 20 66 6f 72 20 74 68 65 20 6d  e name for the m
8030: 69 78 65 64 2d 6d 6f 64 65 20 61 73 73 65 6d 62  ixed-mode assemb
8040: 6c 79 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  ly...      #..  
8050: 20 20 20 20 69 66 20 7b 5b 68 61 73 52 75 6e 74      if {[hasRunt
8060: 69 6d 65 4f 70 74 69 6f 6e 20 6e 61 74 69 76 65  imeOption native
8070: 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
8080: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
8090: 4e 4f 54 45 3a 20 52 65 74 75 72 6e 20 74 68 65  NOTE: Return the
80a0: 20 6d 69 78 65 64 2d 6d 6f 64 65 20 61 73 73 65   mixed-mode asse
80b0: 6d 62 6c 79 20 66 69 6c 65 20 6e 61 6d 65 2e 0d  mbly file name..
80c0: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
80d0: 20 20 20 20 72 65 74 75 72 6e 20 5b 66 69 6c 65      return [file
80e0: 20 6e 61 74 69 76 65 6e 61 6d 65 20 5c 0d 0a 20   nativename \.. 
80f0: 20 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65             [file
8100: 20 6a 6f 69 6e 20 5b 67 65 74 42 69 6e 61 72 79   join [getBinary
8110: 44 69 72 65 63 74 6f 72 79 5d 20 24 70 6c 61 74  Directory] $plat
8120: 66 6f 72 6d 20 53 79 73 74 65 6d 2e 44 61 74 61  form System.Data
8130: 2e 53 51 4c 69 74 65 2e 64 6c 6c 5d 5d 0d 0a 20  .SQLite.dll]].. 
8140: 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
8150: 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
8160: 20 41 72 65 20 77 65 20 61 74 74 65 6d 70 74 69   Are we attempti
8170: 6e 67 20 74 6f 20 61 75 74 6f 6d 61 74 69 63 61  ng to automatica
8180: 6c 6c 79 20 64 65 74 65 63 74 20 77 68 65 74 68  lly detect wheth
8190: 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 0d 0a 20  er or not the.. 
81a0: 20 20 20 20 20 23 20 20 20 20 20 20 20 69 6e 74       #       int
81b0: 65 72 6f 70 20 61 73 73 65 6d 62 6c 79 20 73 68  erop assembly sh
81c0: 6f 75 6c 64 20 62 65 20 75 73 65 64 3f 0d 0a 20  ould be used?.. 
81d0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 73 65       #..      se
81e0: 74 20 61 75 74 6f 6d 61 74 69 63 20 5b 65 78 70  t automatic [exp
81f0: 72 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74  r {[string lengt
8200: 68 20 24 73 74 61 6e 64 61 72 64 5d 20 3d 3d 20  h $standard] == 
8210: 30 7d 5d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a  0}]....      #..
8220: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 46 69        # NOTE: Fi
8230: 72 73 74 2c 20 69 6e 20 65 69 74 68 65 72 20 22  rst, in either "
8240: 61 75 74 6f 6d 61 74 69 63 22 20 6f 72 20 22 6e  automatic" or "n
8250: 6f 6e 2d 73 74 61 6e 64 61 72 64 22 20 6d 6f 64  on-standard" mod
8260: 65 73 2c 20 61 74 74 65 6d 70 74 0d 0a 20 20 20  es, attempt..   
8270: 20 20 20 23 20 20 20 20 20 20 20 74 6f 20 66 69     #       to fi
8280: 6e 64 20 74 68 65 20 6e 61 74 69 76 65 2d 6f 6e  nd the native-on
8290: 6c 79 20 69 6e 74 65 72 6f 70 20 61 73 73 65 6d  ly interop assem
82a0: 62 6c 79 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  bly...      #.. 
82b0: 20 20 20 20 20 69 66 20 7b 24 61 75 74 6f 6d 61       if {$automa
82c0: 74 69 63 20 7c 7c 20 21 24 73 74 61 6e 64 61 72  tic || !$standar
82d0: 64 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  d} then {..     
82e0: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
82f0: 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74 20 74 6f  NOTE: Attempt to
8300: 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 6e   determine the n
8310: 61 74 69 76 65 2d 6f 6e 6c 79 20 69 6e 74 65 72  ative-only inter
8320: 6f 70 20 61 73 73 65 6d 62 6c 79 20 66 69 6c 65  op assembly file
8330: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
8340: 20 20 6e 61 6d 65 20 66 6f 72 20 74 68 69 73 20    name for this 
8350: 70 6c 61 74 66 6f 72 6d 20 61 6e 64 20 74 68 65  platform and the
8360: 6e 20 72 65 74 75 72 6e 20 69 74 2e 0d 0a 20 20  n return it...  
8370: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
8380: 20 66 6f 72 65 61 63 68 20 66 69 6c 65 4e 61 6d   foreach fileNam
8390: 65 4f 6e 6c 79 20 5b 67 65 74 49 6e 74 65 72 6f  eOnly [getIntero
83a0: 70 41 73 73 65 6d 62 6c 79 46 69 6c 65 4e 61 6d  pAssemblyFileNam
83b0: 65 73 4f 6e 6c 79 5d 20 7b 0d 0a 20 20 20 20 20  esOnly] {..     
83c0: 20 20 20 20 20 73 65 74 20 66 69 6c 65 4e 61 6d       set fileNam
83d0: 65 20 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e 61  e [file nativena
83e0: 6d 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  me \..          
83f0: 20 20 20 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5b      [file join [
8400: 67 65 74 42 69 6e 61 72 79 44 69 72 65 63 74 6f  getBinaryDirecto
8410: 72 79 5d 20 24 70 6c 61 74 66 6f 72 6d 20 24 66  ry] $platform $f
8420: 69 6c 65 4e 61 6d 65 4f 6e 6c 79 5d 5d 0d 0a 0d  ileNameOnly]]...
8430: 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b  .          if {[
8440: 66 69 6c 65 20 65 78 69 73 74 73 20 24 66 69 6c  file exists $fil
8450: 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a  eName]} then {..
8460: 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
8470: 72 6e 20 24 66 69 6c 65 4e 61 6d 65 0d 0a 20 20  rn $fileName..  
8480: 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
8490: 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d     }..      }...
84a0: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
84b0: 23 20 4e 4f 54 45 3a 20 54 68 65 6e 2c 20 69 6e  # NOTE: Then, in
84c0: 20 65 69 74 68 65 72 20 22 61 75 74 6f 6d 61 74   either "automat
84d0: 69 63 22 20 6f 72 20 22 73 74 61 6e 64 61 72 64  ic" or "standard
84e0: 22 20 6d 6f 64 65 73 2c 20 61 74 74 65 6d 70 74  " modes, attempt
84f0: 20 74 6f 0d 0a 20 20 20 20 20 20 23 20 20 20 20   to..      #    
8500: 20 20 20 66 69 6e 64 20 74 68 65 20 73 74 61 6e     find the stan
8510: 64 61 72 64 20 53 51 4c 69 74 65 20 6c 69 62 72  dard SQLite libr
8520: 61 72 79 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ary...      #.. 
8530: 20 20 20 20 20 69 66 20 7b 24 61 75 74 6f 6d 61       if {$automa
8540: 74 69 63 20 7c 7c 20 24 73 74 61 6e 64 61 72 64  tic || $standard
8550: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
8560: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
8570: 4f 54 45 3a 20 41 74 74 65 6d 70 74 20 74 6f 20  OTE: Attempt to 
8580: 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 6e 61  determine the na
8590: 74 69 76 65 2d 6f 6e 6c 79 20 73 74 61 6e 64 61  tive-only standa
85a0: 72 64 20 53 51 4c 69 74 65 20 6c 69 62 72 61 72  rd SQLite librar
85b0: 79 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  y..        #    
85c0: 20 20 20 66 69 6c 65 20 6e 61 6d 65 20 66 6f 72     file name for
85d0: 20 74 68 69 73 20 70 6c 61 74 66 6f 72 6d 20 61   this platform a
85e0: 6e 64 20 74 68 65 6e 20 72 65 74 75 72 6e 20 69  nd then return i
85f0: 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  t...        #.. 
8600: 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 66         foreach f
8610: 69 6c 65 4e 61 6d 65 4f 6e 6c 79 20 5b 67 65 74  ileNameOnly [get
8620: 4e 61 74 69 76 65 4c 69 62 72 61 72 79 46 69 6c  NativeLibraryFil
8630: 65 4e 61 6d 65 73 4f 6e 6c 79 5d 20 7b 0d 0a 20  eNamesOnly] {.. 
8640: 20 20 20 20 20 20 20 20 20 73 65 74 20 66 69 6c           set fil
8650: 65 4e 61 6d 65 20 5b 66 69 6c 65 20 6e 61 74 69  eName [file nati
8660: 76 65 6e 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20  vename \..      
8670: 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20 6a 6f          [file jo
8680: 69 6e 20 5b 67 65 74 42 69 6e 61 72 79 44 69 72  in [getBinaryDir
8690: 65 63 74 6f 72 79 5d 20 24 70 6c 61 74 66 6f 72  ectory] $platfor
86a0: 6d 20 24 66 69 6c 65 4e 61 6d 65 4f 6e 6c 79 5d  m $fileNameOnly]
86b0: 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 69  ]....          i
86c0: 66 20 7b 5b 66 69 6c 65 20 65 78 69 73 74 73 20  f {[file exists 
86d0: 24 66 69 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e  $fileName]} then
86e0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
86f0: 72 65 74 75 72 6e 20 24 66 69 6c 65 4e 61 6d 65  return $fileName
8700: 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20  ..          }.. 
8710: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
8720: 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  }....      #..  
8730: 20 20 20 20 23 20 4e 4f 54 45 3a 20 57 61 73 20      # NOTE: Was 
8740: 74 68 65 20 6d 61 6e 61 67 65 64 20 61 73 73 65  the managed asse
8750: 6d 62 6c 79 20 63 6f 6d 70 69 6c 65 64 20 65 78  mbly compiled ex
8760: 70 65 63 74 69 6e 67 20 74 6f 20 64 65 61 6c 20  pecting to deal 
8770: 77 69 74 68 20 74 68 65 0d 0a 20 20 20 20 20 20  with the..      
8780: 23 20 20 20 20 20 20 20 73 74 61 6e 64 61 72 64  #       standard
8790: 20 63 6f 72 65 20 6c 69 62 72 61 72 79 3f 0d 0a   core library?..
87a0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69        #..      i
87b0: 66 20 7b 5b 68 61 76 65 53 51 4c 69 74 65 44 65  f {[haveSQLiteDe
87c0: 66 69 6e 65 43 6f 6e 73 74 61 6e 74 20 53 51 4c  fineConstant SQL
87d0: 49 54 45 5f 53 54 41 4e 44 41 52 44 5d 7d 20 74  ITE_STANDARD]} t
87e0: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  hen {..        #
87f0: 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
8800: 3a 20 46 61 6c 6c 62 61 63 6b 20 74 6f 20 72 65  : Fallback to re
8810: 74 75 72 6e 69 6e 67 20 74 68 65 20 6e 61 74 69  turning the nati
8820: 76 65 2d 6f 6e 6c 79 20 73 74 61 6e 64 61 72 64  ve-only standard
8830: 20 53 51 4c 69 74 65 20 6c 69 62 72 61 72 79 0d   SQLite library.
8840: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
8850: 20 66 69 6c 65 20 6e 61 6d 65 20 66 6f 72 20 74   file name for t
8860: 68 65 20 70 6c 61 74 66 6f 72 6d 2e 0d 0a 20 20  he platform...  
8870: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
8880: 20 73 65 74 20 66 69 6c 65 4e 61 6d 65 73 4f 6e   set fileNamesOn
8890: 6c 79 20 5b 67 65 74 4e 61 74 69 76 65 4c 69 62  ly [getNativeLib
88a0: 72 61 72 79 46 69 6c 65 4e 61 6d 65 73 4f 6e 6c  raryFileNamesOnl
88b0: 79 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66  y]....        if
88c0: 20 7b 5b 6c 6c 65 6e 67 74 68 20 24 66 69 6c 65   {[llength $file
88d0: 4e 61 6d 65 73 4f 6e 6c 79 5d 20 3d 3d 20 30 7d  NamesOnly] == 0}
88e0: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
88f0: 20 20 20 72 65 74 75 72 6e 20 22 22 0d 0a 20 20     return ""..  
8900: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
8910: 20 20 20 72 65 74 75 72 6e 20 5b 66 69 6c 65 20     return [file 
8920: 6e 61 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c 65  nativename [file
8930: 20 6a 6f 69 6e 20 5c 0d 0a 20 20 20 20 20 20 20   join \..       
8940: 20 20 20 20 20 5b 67 65 74 42 69 6e 61 72 79 44       [getBinaryD
8950: 69 72 65 63 74 6f 72 79 5d 20 24 70 6c 61 74 66  irectory] $platf
8960: 6f 72 6d 20 5b 6c 69 6e 64 65 78 20 24 66 69 6c  orm [lindex $fil
8970: 65 4e 61 6d 65 73 4f 6e 6c 79 20 30 5d 5d 5d 0d  eNamesOnly 0]]].
8980: 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d  .      } else {.
8990: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
89a0: 20 20 20 20 23 20 4e 4f 54 45 3a 20 46 61 6c 6c      # NOTE: Fall
89b0: 62 61 63 6b 20 74 6f 20 72 65 74 75 72 6e 69 6e  back to returnin
89c0: 67 20 74 68 65 20 6e 61 74 69 76 65 2d 6f 6e 6c  g the native-onl
89d0: 79 20 69 6e 74 65 72 6f 70 20 61 73 73 65 6d 62  y interop assemb
89e0: 6c 79 20 66 69 6c 65 0d 0a 20 20 20 20 20 20 20  ly file..       
89f0: 20 23 20 20 20 20 20 20 20 6e 61 6d 65 20 66 6f   #       name fo
8a00: 72 20 74 68 65 20 70 6c 61 74 66 6f 72 6d 2e 0d  r the platform..
8a10: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
8a20: 20 20 20 20 73 65 74 20 66 69 6c 65 4e 61 6d 65      set fileName
8a30: 73 4f 6e 6c 79 20 5b 67 65 74 49 6e 74 65 72 6f  sOnly [getIntero
8a40: 70 41 73 73 65 6d 62 6c 79 46 69 6c 65 4e 61 6d  pAssemblyFileNam
8a50: 65 73 4f 6e 6c 79 5d 0d 0a 0d 0a 20 20 20 20 20  esOnly]....     
8a60: 20 20 20 69 66 20 7b 5b 6c 6c 65 6e 67 74 68 20     if {[llength 
8a70: 24 66 69 6c 65 4e 61 6d 65 73 4f 6e 6c 79 5d 20  $fileNamesOnly] 
8a80: 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  == 0} then {..  
8a90: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 22          return "
8aa0: 22 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  "..        }....
8ab0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b          return [
8ac0: 66 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65 20  file nativename 
8ad0: 5b 66 69 6c 65 20 6a 6f 69 6e 20 5c 0d 0a 20 20  [file join \..  
8ae0: 20 20 20 20 20 20 20 20 20 20 5b 67 65 74 42 69            [getBi
8af0: 6e 61 72 79 44 69 72 65 63 74 6f 72 79 5d 20 24  naryDirectory] $
8b00: 70 6c 61 74 66 6f 72 6d 20 5b 6c 69 6e 64 65 78  platform [lindex
8b10: 20 24 66 69 6c 65 4e 61 6d 65 73 4f 6e 6c 79 20   $fileNamesOnly 
8b20: 30 5d 5d 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20  0]]]..      }.. 
8b30: 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
8b40: 63 20 67 65 74 43 6f 6d 6d 6f 6e 44 69 72 65 63  c getCommonDirec
8b50: 74 6f 72 79 20 7b 7d 20 7b 0d 0a 20 20 20 20 20  tory {} {..     
8b60: 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
8b70: 3a 20 54 68 69 73 20 70 72 6f 63 65 64 75 72 65  : This procedure
8b80: 20 72 65 74 75 72 6e 73 20 74 68 65 20 64 69 72   returns the dir
8b90: 65 63 74 6f 72 79 20 77 68 65 72 65 20 74 68 65  ectory where the
8ba0: 20 74 65 73 74 20 73 63 72 69 70 74 73 0d 0a 20   test scripts.. 
8bb0: 20 20 20 20 20 23 20 20 20 20 20 20 20 73 68 6f       #       sho
8bc0: 75 6c 64 20 62 65 20 6c 6f 63 61 74 65 64 2e 20  uld be located. 
8bd0: 20 42 79 20 64 65 66 61 75 6c 74 2c 20 74 68 69   By default, thi
8be0: 73 20 6a 75 73 74 20 72 65 74 75 72 6e 73 20 74  s just returns t
8bf0: 68 65 20 45 61 67 6c 65 0d 0a 20 20 20 20 20 20  he Eagle..      
8c00: 23 20 20 20 20 20 20 20 62 69 6e 61 72 79 20 64  #       binary d
8c10: 69 72 65 63 74 6f 72 79 2e 0d 0a 20 20 20 20 20  irectory...     
8c20: 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69   #..      if {[i
8c30: 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 63 6f 6d  nfo exists ::com
8c40: 6d 6f 6e 5f 64 69 72 65 63 74 6f 72 79 5d 20 26  mon_directory] &
8c50: 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b  & \..          [
8c60: 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a  string length $:
8c70: 3a 63 6f 6d 6d 6f 6e 5f 64 69 72 65 63 74 6f 72  :common_director
8c80: 79 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  y] > 0} then {..
8c90: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
8ca0: 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 65 20 6c     # NOTE: The l
8cb0: 6f 63 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 63  ocation of the c
8cc0: 6f 6d 6d 6f 6e 20 64 69 72 65 63 74 6f 72 79 20  ommon directory 
8cd0: 68 61 73 20 62 65 65 6e 20 73 65 74 3b 0d 0a 20  has been set;.. 
8ce0: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74         #       t
8cf0: 68 65 72 65 66 6f 72 65 2c 20 75 73 65 20 69 74  herefore, use it
8d00: 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
8d10: 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 3a 3a        return $::
8d20: 63 6f 6d 6d 6f 6e 5f 64 69 72 65 63 74 6f 72 79  common_directory
8d30: 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 69 66  ..      } elseif
8d40: 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a   {[info exists :
8d50: 3a 76 65 6e 64 6f 72 5f 64 69 72 65 63 74 6f 72  :vendor_director
8d60: 79 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20  y] && \..       
8d70: 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74     [string lengt
8d80: 68 20 24 3a 3a 76 65 6e 64 6f 72 5f 64 69 72 65  h $::vendor_dire
8d90: 63 74 6f 72 79 5d 20 3e 20 30 7d 20 74 68 65 6e  ctory] > 0} then
8da0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20   {..        #.. 
8db0: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54         # NOTE: T
8dc0: 68 65 20 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 74  he location of t
8dd0: 68 65 20 76 65 6e 64 6f 72 20 64 69 72 65 63 74  he vendor direct
8de0: 6f 72 79 20 68 61 73 20 62 65 65 6e 20 73 65 74  ory has been set
8df0: 3b 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  ;..        #    
8e00: 20 20 20 74 68 65 72 65 66 6f 72 65 2c 20 75 73     therefore, us
8e10: 65 20 69 74 2e 0d 0a 20 20 20 20 20 20 20 20 23  e it...        #
8e20: 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ..        return
8e30: 20 24 3a 3a 76 65 6e 64 6f 72 5f 64 69 72 65 63   $::vendor_direc
8e40: 74 6f 72 79 0d 0a 20 20 20 20 20 20 7d 20 65 6c  tory..      } el
8e50: 73 65 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73  seif {[info exis
8e60: 74 73 20 3a 3a 74 63 6c 5f 6c 69 62 72 61 72 79  ts ::tcl_library
8e70: 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20  ] && \..        
8e80: 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68    [string length
8e90: 20 24 3a 3a 74 63 6c 5f 6c 69 62 72 61 72 79 5d   $::tcl_library]
8ea0: 20 3e 20 30 20 26 26 20 5c 0d 0a 20 20 20 20 20   > 0 && \..     
8eb0: 20 20 20 20 20 5b 66 69 6c 65 20 69 73 64 69 72       [file isdir
8ec0: 65 63 74 6f 72 79 20 24 3a 3a 74 63 6c 5f 6c 69  ectory $::tcl_li
8ed0: 62 72 61 72 79 5d 7d 20 74 68 65 6e 20 7b 0d 0a  brary]} then {..
8ee0: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
8ef0: 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 65 20 76     # NOTE: The v
8f00: 61 72 69 61 62 6c 65 20 77 69 74 68 20 74 68 65  ariable with the
8f10: 20 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 74 68 65   location of the
8f20: 20 73 63 72 69 70 74 20 6c 69 62 72 61 72 79 20   script library 
8f30: 69 73 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  is..        #   
8f40: 20 20 20 20 73 65 74 20 61 6e 64 20 61 70 70 65      set and appe
8f50: 61 72 73 20 74 6f 20 62 65 20 61 20 72 65 61 6c  ars to be a real
8f60: 20 64 69 72 65 63 74 6f 72 79 20 28 69 2e 65 2e   directory (i.e.
8f70: 20 6e 6f 74 20 65 6d 62 65 64 64 65 64 0d 0a 20   not embedded.. 
8f80: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 77         #       w
8f90: 69 74 68 69 6e 20 61 20 66 69 6c 65 29 3b 20 74  ithin a file); t
8fa0: 68 65 72 65 66 6f 72 65 2c 20 75 73 65 20 69 74  herefore, use it
8fb0: 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
8fc0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 3a 3a        return $::
8fd0: 74 63 6c 5f 6c 69 62 72 61 72 79 0d 0a 20 20 20  tcl_library..   
8fe0: 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
8ff0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
9000: 23 20 4e 4f 54 45 3a 20 46 61 6c 6c 62 61 63 6b  # NOTE: Fallback
9010: 20 74 6f 20 74 68 65 20 64 69 72 65 63 74 6f 72   to the director
9020: 79 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  y containing the
9030: 20 65 78 65 63 75 74 61 62 6c 65 2e 0d 0a 20 20   executable...  
9040: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
9050: 20 72 65 74 75 72 6e 20 5b 69 6e 66 6f 20 62 69   return [info bi
9060: 6e 61 72 79 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a  nary]..      }..
9070: 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
9080: 6f 63 20 67 65 74 44 61 74 61 62 61 73 65 44 69  oc getDatabaseDi
9090: 72 65 63 74 6f 72 79 20 7b 7d 20 7b 0d 0a 20 20  rectory {} {..  
90a0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
90b0: 4f 54 45 3a 20 54 68 69 73 20 70 72 6f 63 65 64  OTE: This proced
90c0: 75 72 65 20 72 65 74 75 72 6e 73 20 74 68 65 20  ure returns the 
90d0: 64 69 72 65 63 74 6f 72 79 20 77 68 65 72 65 20  directory where 
90e0: 74 68 65 20 74 65 73 74 20 64 61 74 61 62 61 73  the test databas
90f0: 65 73 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  es..      #     
9100: 20 20 73 68 6f 75 6c 64 20 62 65 20 6c 6f 63 61    should be loca
9110: 74 65 64 2e 20 20 42 79 20 64 65 66 61 75 6c 74  ted.  By default
9120: 2c 20 74 68 69 73 20 6a 75 73 74 20 75 73 65 73  , this just uses
9130: 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 0d 0a   the temporary..
9140: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 64 69        #       di
9150: 72 65 63 74 6f 72 79 20 63 6f 6e 66 69 67 75 72  rectory configur
9160: 65 64 20 66 6f 72 20 74 68 69 73 20 73 79 73 74  ed for this syst
9170: 65 6d 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  em...      #..  
9180: 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78      if {[info ex
9190: 69 73 74 73 20 3a 3a 64 61 74 61 62 61 73 65 5f  ists ::database_
91a0: 64 69 72 65 63 74 6f 72 79 5d 20 26 26 20 5c 0d  directory] && \.
91b0: 0a 20 20 20 20 20 20 20 20 20 20 5b 73 74 72 69  .          [stri
91c0: 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a 64 61 74  ng length $::dat
91d0: 61 62 61 73 65 5f 64 69 72 65 63 74 6f 72 79 5d  abase_directory]
91e0: 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20   > 0} then {..  
91f0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
9200: 20 23 20 4e 4f 54 45 3a 20 54 68 65 20 6c 6f 63   # NOTE: The loc
9210: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 64 61 74  ation of the dat
9220: 61 62 61 73 65 20 64 69 72 65 63 74 6f 72 79 20  abase directory 
9230: 68 61 73 20 62 65 65 6e 20 6f 76 65 72 72 69 64  has been overrid
9240: 64 65 6e 3b 0d 0a 20 20 20 20 20 20 20 20 23 20  den;..        # 
9250: 20 20 20 20 20 20 74 68 65 72 65 66 6f 72 65 2c        therefore,
9260: 20 75 73 65 20 69 74 2e 0d 0a 20 20 20 20 20 20   use it...      
9270: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74    #..        ret
9280: 75 72 6e 20 24 3a 3a 64 61 74 61 62 61 73 65 5f  urn $::database_
9290: 64 69 72 65 63 74 6f 72 79 0d 0a 20 20 20 20 20  directory..     
92a0: 20 7d 20 65 6c 73 65 69 66 20 7b 5b 69 6e 66 6f   } elseif {[info
92b0: 20 65 78 69 73 74 73 20 3a 3a 73 63 72 61 74 63   exists ::scratc
92c0: 68 5f 64 69 72 65 63 74 6f 72 79 5d 20 26 26 20  h_directory] && 
92d0: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 73 74  \..          [st
92e0: 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a 73  ring length $::s
92f0: 63 72 61 74 63 68 5f 64 69 72 65 63 74 6f 72 79  cratch_directory
9300: 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20  ] > 0} then {.. 
9310: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
9320: 20 20 23 20 4e 4f 54 45 3a 20 54 68 65 20 6c 6f    # NOTE: The lo
9330: 63 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 63  cation of the sc
9340: 72 61 74 63 68 20 64 69 72 65 63 74 6f 72 79 20  ratch directory 
9350: 68 61 73 20 62 65 65 6e 20 6f 76 65 72 72 69 64  has been overrid
9360: 64 65 6e 3b 0d 0a 20 20 20 20 20 20 20 20 23 20  den;..        # 
9370: 20 20 20 20 20 20 74 68 65 72 65 66 6f 72 65 2c        therefore,
9380: 20 75 73 65 20 69 74 2e 0d 0a 20 20 20 20 20 20   use it...      
9390: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74    #..        ret
93a0: 75 72 6e 20 24 3a 3a 73 63 72 61 74 63 68 5f 64  urn $::scratch_d
93b0: 69 72 65 63 74 6f 72 79 0d 0a 20 20 20 20 20 20  irectory..      
93c0: 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
93d0: 20 20 72 65 74 75 72 6e 20 5b 67 65 74 54 65 6d    return [getTem
93e0: 70 6f 72 61 72 79 50 61 74 68 5d 0d 0a 20 20 20  poraryPath]..   
93f0: 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a     }..    }.....
9400: 20 20 20 20 70 72 6f 63 20 67 65 74 54 65 6d 70      proc getTemp
9410: 6f 72 61 72 79 44 69 72 65 63 74 6f 72 79 20 7b  oraryDirectory {
9420: 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  } {..      #..  
9430: 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 69 73      # NOTE: This
9440: 20 70 72 6f 63 65 64 75 72 65 20 72 65 74 75 72   procedure retur
9450: 6e 73 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  ns the directory
9460: 20 77 68 65 72 65 20 74 68 65 20 74 65 6d 70 6f   where the tempo
9470: 72 61 72 79 20 66 69 6c 65 73 0d 0a 20 20 20 20  rary files..    
9480: 20 20 23 20 20 20 20 20 20 20 73 68 6f 75 6c 64    #       should
9490: 20 62 65 20 6c 6f 63 61 74 65 64 2e 20 20 42 79   be located.  By
94a0: 20 64 65 66 61 75 6c 74 2c 20 74 68 69 73 20 6a   default, this j
94b0: 75 73 74 20 75 73 65 73 20 74 68 65 20 74 65 6d  ust uses the tem
94c0: 70 6f 72 61 72 79 0d 0a 20 20 20 20 20 20 23 20  porary..      # 
94d0: 20 20 20 20 20 20 64 69 72 65 63 74 6f 72 79 20        directory 
94e0: 63 6f 6e 66 69 67 75 72 65 64 20 66 6f 72 20 74  configured for t
94f0: 68 69 73 20 73 79 73 74 65 6d 2e 0d 0a 20 20 20  his system...   
9500: 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
9510: 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 74  [info exists ::t
9520: 65 6d 70 6f 72 61 72 79 5f 64 69 72 65 63 74 6f  emporary_directo
9530: 72 79 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20  ry] && \..      
9540: 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67      [string leng
9550: 74 68 20 24 3a 3a 74 65 6d 70 6f 72 61 72 79 5f  th $::temporary_
9560: 64 69 72 65 63 74 6f 72 79 5d 20 3e 20 30 7d 20  directory] > 0} 
9570: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
9580: 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
9590: 45 3a 20 54 68 65 20 6c 6f 63 61 74 69 6f 6e 20  E: The location 
95a0: 6f 66 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  of the temporary
95b0: 20 64 69 72 65 63 74 6f 72 79 20 68 61 73 20 62   directory has b
95c0: 65 65 6e 20 6f 76 65 72 72 69 64 64 65 6e 3b 0d  een overridden;.
95d0: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
95e0: 20 74 68 65 72 65 66 6f 72 65 2c 20 75 73 65 20   therefore, use 
95f0: 69 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  it...        #..
9600: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 24          return $
9610: 3a 3a 74 65 6d 70 6f 72 61 72 79 5f 64 69 72 65  ::temporary_dire
9620: 63 74 6f 72 79 0d 0a 20 20 20 20 20 20 7d 20 65  ctory..      } e
9630: 6c 73 65 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69  lseif {[info exi
9640: 73 74 73 20 3a 3a 73 63 72 61 74 63 68 5f 64 69  sts ::scratch_di
9650: 72 65 63 74 6f 72 79 5d 20 26 26 20 5c 0d 0a 20  rectory] && \.. 
9660: 20 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67           [string
9670: 20 6c 65 6e 67 74 68 20 24 3a 3a 73 63 72 61 74   length $::scrat
9680: 63 68 5f 64 69 72 65 63 74 6f 72 79 5d 20 3e 20  ch_directory] > 
9690: 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
96a0: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
96b0: 4e 4f 54 45 3a 20 54 68 65 20 6c 6f 63 61 74 69  NOTE: The locati
96c0: 6f 6e 20 6f 66 20 74 68 65 20 73 63 72 61 74 63  on of the scratc
96d0: 68 20 64 69 72 65 63 74 6f 72 79 20 68 61 73 20  h directory has 
96e0: 62 65 65 6e 20 6f 76 65 72 72 69 64 64 65 6e 3b  been overridden;
96f0: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
9700: 20 20 74 68 65 72 65 66 6f 72 65 2c 20 75 73 65    therefore, use
9710: 20 69 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d   it...        #.
9720: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
9730: 24 3a 3a 73 63 72 61 74 63 68 5f 64 69 72 65 63  $::scratch_direc
9740: 74 6f 72 79 0d 0a 20 20 20 20 20 20 7d 20 65 6c  tory..      } el
9750: 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 72 65  se {..        re
9760: 74 75 72 6e 20 5b 67 65 74 54 65 6d 70 6f 72 61  turn [getTempora
9770: 72 79 50 61 74 68 5d 0d 0a 20 20 20 20 20 20 7d  ryPath]..      }
9780: 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
9790: 70 72 6f 63 20 67 65 74 45 78 65 63 75 74 65 4f  proc getExecuteO
97a0: 6e 53 65 74 75 70 20 7b 7d 20 7b 0d 0a 20 20 20  nSetup {} {..   
97b0: 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69     if {[info exi
97c0: 73 74 73 20 3a 3a 65 78 65 63 75 74 65 5f 6f 6e  sts ::execute_on
97d0: 5f 73 65 74 75 70 5d 20 26 26 20 5c 0d 0a 20 20  _setup] && \..  
97e0: 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20          [string 
97f0: 6c 65 6e 67 74 68 20 24 3a 3a 65 78 65 63 75 74  length $::execut
9800: 65 5f 6f 6e 5f 73 65 74 75 70 5d 20 3e 20 30 7d  e_on_setup] > 0}
9810: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
9820: 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
9830: 54 45 3a 20 52 65 74 75 72 6e 20 74 68 65 20 63  TE: Return the c
9840: 6f 6e 66 69 67 75 72 65 64 20 53 51 4c 20 74 6f  onfigured SQL to
9850: 20 65 78 65 63 75 74 65 20 64 75 72 69 6e 67 20   execute during 
9860: 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0d 0a  the connection..
9870: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
9880: 73 65 74 75 70 20 70 72 6f 63 65 64 75 72 65 20  setup procedure 
9890: 28 69 2e 65 2e 20 66 6f 72 20 65 76 65 72 79 20  (i.e. for every 
98a0: 74 65 73 74 20 64 61 74 61 62 61 73 65 20 63 6f  test database co
98b0: 6e 6e 65 63 74 69 6f 6e 29 2e 0d 0a 20 20 20 20  nnection)...    
98c0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72      #..        r
98d0: 65 74 75 72 6e 20 24 3a 3a 65 78 65 63 75 74 65  eturn $::execute
98e0: 5f 6f 6e 5f 73 65 74 75 70 0d 0a 20 20 20 20 20  _on_setup..     
98f0: 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
9900: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
9910: 4e 4f 54 45 3a 20 42 79 20 64 65 66 61 75 6c 74  NOTE: By default
9920: 2c 20 74 68 65 72 65 20 69 73 20 6e 6f 20 53 51  , there is no SQ
9930: 4c 20 74 6f 20 65 78 65 63 75 74 65 20 64 75 72  L to execute dur
9940: 69 6e 67 20 74 68 65 20 63 6f 6e 6e 65 63 74 69  ing the connecti
9950: 6f 6e 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  on..        #   
9960: 20 20 20 20 73 65 74 75 70 20 70 72 6f 63 65 64      setup proced
9970: 75 72 65 20 28 69 2e 65 2e 20 66 6f 72 20 65 76  ure (i.e. for ev
9980: 65 72 79 20 74 65 73 74 20 64 61 74 61 62 61 73  ery test databas
9990: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 29 2e 0d 0a  e connection)...
99a0: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
99b0: 20 20 20 72 65 74 75 72 6e 20 22 22 0d 0a 20 20     return ""..  
99c0: 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d      }..    }....
99d0: 0a 20 20 20 20 70 72 6f 63 20 67 65 74 53 74 72  .    proc getStr
99e0: 69 6e 67 4d 61 70 46 6f 72 54 63 6c 45 73 63 61  ingMapForTclEsca
99f0: 70 65 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 72  pe {} {..      r
9a00: 65 74 75 72 6e 20 5b 6c 69 73 74 20 5c 5c 20 5c  eturn [list \\ \
9a10: 5c 5c 5c 20 5c 5b 20 5c 5c 5c 5b 20 5c 5d 20 5c  \\\ \[ \\\[ \] \
9a20: 5c 5c 5d 20 5c 24 20 5c 5c 5c 24 5d 0d 0a 20 20  \\] \$ \\\$]..  
9a30: 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
9a40: 20 67 65 74 54 65 73 74 4f 76 65 72 72 69 64 65   getTestOverride
9a50: 73 50 72 65 61 6d 62 6c 65 20 7b 20 7b 65 78 74  sPreamble { {ext
9a60: 72 61 56 61 72 4e 61 6d 65 73 20 22 22 7d 20 7d  raVarNames ""} }
9a70: 20 7b 0d 0a 20 20 20 20 20 20 73 65 74 20 76 61   {..      set va
9a80: 72 4e 61 6d 65 73 20 5b 6c 69 73 74 5d 0d 0a 0d  rNames [list]...
9a90: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
9aa0: 23 20 4e 4f 54 45 3a 20 49 66 20 61 76 61 69 6c  # NOTE: If avail
9ab0: 61 62 6c 65 2c 20 73 74 61 72 74 20 77 69 74 68  able, start with
9ac0: 20 74 68 65 20 6d 61 73 74 65 72 20 6c 69 73 74   the master list
9ad0: 20 6f 66 20 74 65 73 74 20 6f 76 65 72 72 69 64   of test overrid
9ae0: 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  e..      #      
9af0: 20 76 61 72 69 61 62 6c 65 73 2e 0d 0a 20 20 20   variables...   
9b00: 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
9b10: 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 74  [info exists ::t
9b20: 65 73 74 5f 6f 76 65 72 72 69 64 65 73 5d 20 26  est_overrides] &
9b30: 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b  & \..          [
9b40: 6c 6c 65 6e 67 74 68 20 24 3a 3a 74 65 73 74 5f  llength $::test_
9b50: 6f 76 65 72 72 69 64 65 73 5d 20 3e 20 30 7d 20  overrides] > 0} 
9b60: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
9b70: 65 76 61 6c 20 6c 61 70 70 65 6e 64 20 76 61 72  eval lappend var
9b80: 4e 61 6d 65 73 20 24 3a 3a 74 65 73 74 5f 6f 76  Names $::test_ov
9b90: 65 72 72 69 64 65 73 0d 0a 20 20 20 20 20 20 7d  errides..      }
9ba0: 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  ....      #..   
9bb0: 20 20 20 23 20 4e 4f 54 45 3a 20 49 66 20 72 65     # NOTE: If re
9bc0: 71 75 65 73 74 65 64 20 62 79 20 6f 75 72 20 63  quested by our c
9bd0: 61 6c 6c 65 72 2c 20 61 64 64 20 61 6e 79 20 61  aller, add any a
9be0: 64 64 69 74 69 6f 6e 61 6c 20 76 61 72 69 61 62  dditional variab
9bf0: 6c 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  le..      #     
9c00: 20 20 6e 61 6d 65 73 20 74 6f 20 63 6f 70 79 20    names to copy 
9c10: 6e 6f 77 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  now...      #.. 
9c20: 20 20 20 20 20 69 66 20 7b 5b 6c 6c 65 6e 67 74       if {[llengt
9c30: 68 20 24 65 78 74 72 61 56 61 72 4e 61 6d 65 73  h $extraVarNames
9c40: 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20  ] > 0} then {.. 
9c50: 20 20 20 20 20 20 20 65 76 61 6c 20 6c 61 70 70         eval lapp
9c60: 65 6e 64 20 76 61 72 4e 61 6d 65 73 20 24 65 78  end varNames $ex
9c70: 74 72 61 56 61 72 4e 61 6d 65 73 0d 0a 20 20 20  traVarNames..   
9c80: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d     }....      #.
9c90: 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 42  .      # NOTE: B
9ca0: 75 69 6c 64 20 74 68 65 20 73 63 72 69 70 74 20  uild the script 
9cb0: 66 72 61 67 6d 65 6e 74 20 74 6f 20 62 65 20 72  fragment to be r
9cc0: 65 74 75 72 6e 65 64 20 62 79 20 70 72 6f 63 65  eturned by proce
9cd0: 73 73 69 6e 67 20 65 61 63 68 0d 0a 20 20 20 20  ssing each..    
9ce0: 20 20 23 20 20 20 20 20 20 20 76 61 72 69 61 62    #       variab
9cf0: 6c 65 20 6e 61 6d 65 20 61 6e 64 20 61 64 64 69  le name and addi
9d00: 6e 67 20 74 68 65 20 6e 65 63 65 63 65 73 73 61  ng the nececessa
9d10: 72 79 20 73 63 72 69 70 74 20 66 72 61 67 6d 65  ry script fragme
9d20: 6e 74 73 20 66 6f 72 0d 0a 20 20 20 20 20 20 23  nts for..      #
9d30: 20 20 20 20 20 20 20 65 61 63 68 20 6f 6e 65 2e         each one.
9d40: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
9d50: 20 73 65 74 20 72 65 73 75 6c 74 20 22 22 0d 0a   set result ""..
9d60: 0d 0a 20 20 20 20 20 20 66 6f 72 65 61 63 68 20  ..      foreach 
9d70: 76 61 72 4e 61 6d 65 20 24 76 61 72 4e 61 6d 65  varName $varName
9d80: 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  s {..        #..
9d90: 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
9da0: 42 75 69 6c 64 20 74 68 65 20 71 75 61 6c 69 66  Build the qualif
9db0: 69 65 64 20 67 6c 6f 62 61 6c 20 76 61 72 69 61  ied global varia
9dc0: 62 6c 65 20 6e 61 6d 65 2e 0d 0a 20 20 20 20 20  ble name...     
9dd0: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 73 65     #..        se
9de0: 74 20 66 75 6c 6c 56 61 72 4e 61 6d 65 20 5b 61  t fullVarName [a
9df0: 70 70 65 6e 64 41 72 67 73 20 3a 3a 20 24 76 61  ppendArgs :: $va
9e00: 72 4e 61 6d 65 5d 0d 0a 0d 0a 20 20 20 20 20 20  rName]....      
9e10: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
9e20: 4f 54 45 3a 20 44 6f 65 73 20 74 68 65 20 76 61  OTE: Does the va
9e30: 72 69 61 62 6c 65 20 65 78 69 73 74 20 69 6e 20  riable exist in 
9e40: 74 68 69 73 20 69 6e 74 65 72 70 72 65 74 65 72  this interpreter
9e50: 20 63 6f 6e 74 65 78 74 3f 0d 0a 20 20 20 20 20   context?..     
9e60: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 69 66     #..        if
9e70: 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 24   {[info exists $
9e80: 66 75 6c 6c 56 61 72 4e 61 6d 65 5d 7d 20 74 68  fullVarName]} th
9e90: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
9ea0: 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e  #..          # N
9eb0: 4f 54 45 3a 20 41 70 70 65 6e 64 20 61 20 73 63  OTE: Append a sc
9ec0: 72 69 70 74 20 66 72 61 67 6d 65 6e 74 20 74 6f  ript fragment to
9ed0: 20 74 68 65 20 72 65 73 75 6c 74 20 74 68 61 74   the result that
9ee0: 20 77 69 6c 6c 20 63 6f 72 72 65 63 74 6c 79 0d   will correctly.
9ef0: 0a 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20  .          #    
9f00: 20 20 20 63 6f 70 79 20 61 6e 79 20 63 6f 6e 74     copy any cont
9f10: 61 69 6e 65 64 20 76 61 6c 75 65 20 74 6f 20 61  ained value to a
9f20: 6e 6f 74 68 65 72 20 69 6e 74 65 72 70 72 65 74  nother interpret
9f30: 65 72 20 63 6f 6e 74 65 78 74 2e 0d 0a 20 20 20  er context...   
9f40: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
9f50: 20 20 20 20 61 70 70 65 6e 64 20 72 65 73 75 6c      append resul
9f60: 74 20 5c 6e 20 22 73 65 74 20 22 20 24 66 75 6c  t \n "set " $ful
9f70: 6c 56 61 72 4e 61 6d 65 20 22 20 5c 7b 22 20 5b  lVarName " \{" [
9f80: 73 74 72 69 6e 67 20 6d 61 70 20 5c 0d 0a 20 20  string map \..  
9f90: 20 20 20 20 20 20 20 20 20 20 20 20 5b 67 65 74              [get
9fa0: 53 74 72 69 6e 67 4d 61 70 46 6f 72 54 63 6c 45  StringMapForTclE
9fb0: 73 63 61 70 65 5d 20 5b 73 65 74 20 24 66 75 6c  scape] [set $ful
9fc0: 6c 56 61 72 4e 61 6d 65 5d 5d 20 5c 7d 0d 0a 20  lVarName]] \}.. 
9fd0: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
9fe0: 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  }....      #..  
9ff0: 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 66 20 74      # NOTE: If t
a000: 68 65 20 72 65 73 75 6c 74 20 63 6f 6e 74 61 69  he result contai
a010: 6e 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 73  ns one or more s
a020: 63 72 69 70 74 20 66 72 61 67 6d 65 6e 74 73 2c  cript fragments,
a030: 20 61 70 70 65 6e 64 20 61 0d 0a 20 20 20 20 20   append a..     
a040: 20 23 20 20 20 20 20 20 20 6e 65 77 6c 69 6e 65   #       newline
a050: 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
a060: 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65    if {[string le
a070: 6e 67 74 68 20 24 72 65 73 75 6c 74 5d 20 3e 20  ngth $result] > 
a080: 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
a090: 20 20 20 61 70 70 65 6e 64 20 72 65 73 75 6c 74     append result
a0a0: 20 5c 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a   \n..      }....
a0b0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 72 65        return $re
a0c0: 73 75 6c 74 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a  sult..    }.....
a0d0: 20 20 20 20 70 72 6f 63 20 6d 6f 76 65 53 79 73      proc moveSys
a0e0: 74 65 6d 44 61 74 61 53 51 4c 69 74 65 44 6c 6c  temDataSQLiteDll
a0f0: 43 6f 6e 66 69 67 20 7b 20 7b 72 65 73 74 6f 72  Config { {restor
a100: 65 20 66 61 6c 73 65 7d 20 7b 76 65 72 62 6f 73  e false} {verbos
a110: 65 20 74 72 75 65 7d 20 7d 20 7b 0d 0a 20 20 20  e true} } {..   
a120: 20 20 20 73 65 74 20 64 69 72 65 63 74 6f 72 79     set directory
a130: 20 5b 67 65 74 42 69 6e 61 72 79 44 69 72 65 63   [getBinaryDirec
a140: 74 6f 72 79 5d 0d 0a 0d 0a 20 20 20 20 20 20 69  tory]....      i
a150: 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74  f {[string lengt
a160: 68 20 24 64 69 72 65 63 74 6f 72 79 5d 20 3d 3d  h $directory] ==
a170: 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
a180: 20 20 20 20 69 66 20 7b 24 76 65 72 62 6f 73 65      if {$verbose
a190: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
a1a0: 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
a1b0: 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e  t_channel [appen
a1c0: 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
a1d0: 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 73 6b 69         "---- ski
a1e0: 70 70 65 64 20 6d 6f 76 69 6e 67 20 5c 22 53 79  pped moving \"Sy
a1f0: 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
a200: 2e 64 6c 6c 2e 63 6f 6e 66 69 67 5c 22 2c 20 22  .dll.config\", "
a210: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
a220: 20 20 22 6e 6f 20 62 69 6e 61 72 79 20 64 69 72    "no binary dir
a230: 65 63 74 6f 72 79 5c 6e 22 5d 0d 0a 20 20 20 20  ectory\n"]..    
a240: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
a250: 20 72 65 74 75 72 6e 0d 0a 20 20 20 20 20 20 7d   return..      }
a260: 0d 0a 0d 0a 20 20 20 20 20 20 73 65 74 20 66 69  ....      set fi
a270: 6c 65 4e 61 6d 65 28 31 29 20 5b 66 69 6c 65 20  leName(1) [file 
a280: 6e 6f 72 6d 61 6c 69 7a 65 20 5c 0d 0a 20 20 20  normalize \..   
a290: 20 20 20 20 20 20 20 5b 66 69 6c 65 20 6a 6f 69         [file joi
a2a0: 6e 20 24 64 69 72 65 63 74 6f 72 79 20 53 79 73  n $directory Sys
a2b0: 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e  tem.Data.SQLite.
a2c0: 64 6c 6c 2e 63 6f 6e 66 69 67 5d 5d 0d 0a 0d 0a  dll.config]]....
a2d0: 20 20 20 20 20 20 73 65 74 20 66 69 6c 65 4e 61        set fileNa
a2e0: 6d 65 28 32 29 20 5b 61 70 70 65 6e 64 41 72 67  me(2) [appendArg
a2f0: 73 20 24 66 69 6c 65 4e 61 6d 65 28 31 29 20 2e  s $fileName(1) .
a300: 6d 6f 76 65 64 5d 0d 0a 0d 0a 20 20 20 20 20 20  moved]....      
a310: 69 66 20 7b 24 72 65 73 74 6f 72 65 7d 20 74 68  if {$restore} th
a320: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66  en {..        if
a330: 20 7b 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24   {[file exists $
a340: 66 69 6c 65 4e 61 6d 65 28 32 29 5d 7d 20 74 68  fileName(2)]} th
a350: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
a360: 66 69 6c 65 20 72 65 6e 61 6d 65 20 24 66 69 6c  file rename $fil
a370: 65 4e 61 6d 65 28 32 29 20 24 66 69 6c 65 4e 61  eName(2) $fileNa
a380: 6d 65 28 31 29 0d 0a 0d 0a 20 20 20 20 20 20 20  me(1)....       
a390: 20 20 20 69 66 20 7b 24 76 65 72 62 6f 73 65 7d     if {$verbose}
a3a0: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
a3b0: 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
a3c0: 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
a3d0: 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
a3e0: 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
a3f0: 6d 6f 76 65 64 20 5c 22 22 20 24 66 69 6c 65 4e  moved \"" $fileN
a400: 61 6d 65 28 32 29 20 22 5c 22 20 74 6f 20 5c 22  ame(2) "\" to \"
a410: 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  " \..           
a420: 20 20 20 20 20 24 66 69 6c 65 4e 61 6d 65 28 31       $fileName(1
a430: 29 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20 20  ) \"\n]..       
a440: 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 20     }..        } 
a450: 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
a460: 20 20 69 66 20 7b 24 76 65 72 62 6f 73 65 7d 20    if {$verbose} 
a470: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
a480: 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
a490: 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e  t_channel [appen
a4a0: 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
a4b0: 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 73           "---- s
a4c0: 6b 69 70 70 65 64 20 6d 6f 76 69 6e 67 20 5c 22  kipped moving \"
a4d0: 22 20 24 66 69 6c 65 4e 61 6d 65 28 32 29 20 5c  " $fileName(2) \
a4e0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
a4f0: 20 20 22 5c 22 2c 20 69 74 20 64 6f 65 73 20 6e    "\", it does n
a500: 6f 74 20 65 78 69 73 74 5c 6e 22 5d 0d 0a 20 20  ot exist\n"]..  
a510: 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
a520: 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 20 65 6c     }..      } el
a530: 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66  se {..        if
a540: 20 7b 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24   {[file exists $
a550: 66 69 6c 65 4e 61 6d 65 28 31 29 5d 7d 20 74 68  fileName(1)]} th
a560: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
a570: 66 69 6c 65 20 72 65 6e 61 6d 65 20 24 66 69 6c  file rename $fil
a580: 65 4e 61 6d 65 28 31 29 20 24 66 69 6c 65 4e 61  eName(1) $fileNa
a590: 6d 65 28 32 29 0d 0a 0d 0a 20 20 20 20 20 20 20  me(2)....       
a5a0: 20 20 20 69 66 20 7b 24 76 65 72 62 6f 73 65 7d     if {$verbose}
a5b0: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
a5c0: 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
a5d0: 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
a5e0: 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
a5f0: 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
a600: 6d 6f 76 65 64 20 5c 22 22 20 24 66 69 6c 65 4e  moved \"" $fileN
a610: 61 6d 65 28 31 29 20 22 5c 22 20 74 6f 20 5c 22  ame(1) "\" to \"
a620: 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  " \..           
a630: 20 20 20 20 20 24 66 69 6c 65 4e 61 6d 65 28 32       $fileName(2
a640: 29 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20 20  ) \"\n]..       
a650: 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 20     }..        } 
a660: 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
a670: 20 20 69 66 20 7b 24 76 65 72 62 6f 73 65 7d 20    if {$verbose} 
a680: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
a690: 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
a6a0: 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e  t_channel [appen
a6b0: 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
a6c0: 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 73           "---- s
a6d0: 6b 69 70 70 65 64 20 6d 6f 76 69 6e 67 20 5c 22  kipped moving \"
a6e0: 22 20 24 66 69 6c 65 4e 61 6d 65 28 31 29 20 5c  " $fileName(1) \
a6f0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
a700: 20 20 22 5c 22 2c 20 69 74 20 64 6f 65 73 20 6e    "\", it does n
a710: 6f 74 20 65 78 69 73 74 5c 6e 22 5d 0d 0a 20 20  ot exist\n"]..  
a720: 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
a730: 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20     }..      }.. 
a740: 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
a750: 63 20 67 65 74 41 70 70 44 6f 6d 61 69 6e 50 72  c getAppDomainPr
a760: 65 61 6d 62 6c 65 20 7b 20 7b 70 72 65 66 69 78  eamble { {prefix
a770: 20 22 22 7d 20 7b 73 75 66 66 69 78 20 22 22 7d   ""} {suffix ""}
a780: 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20   } {..      #.. 
a790: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 69       # NOTE: Thi
a7a0: 73 20 70 72 6f 63 65 64 75 72 65 20 72 65 74 75  s procedure retu
a7b0: 72 6e 73 20 61 20 74 65 73 74 20 73 65 74 75 70  rns a test setup
a7c0: 20 73 63 72 69 70 74 20 66 72 61 67 6d 65 6e 74   script fragment
a7d0: 20 73 75 69 74 61 62 6c 65 20 66 6f 72 0d 0a 20   suitable for.. 
a7e0: 20 20 20 20 20 23 20 20 20 20 20 20 20 65 76 61       #       eva
a7f0: 6c 75 61 74 69 6f 6e 20 62 79 20 61 6e 20 69 6e  luation by an in
a800: 74 65 72 70 72 65 74 65 72 20 63 72 65 61 74 65  terpreter create
a810: 64 20 69 6e 20 61 6e 20 69 73 6f 6c 61 74 65 64  d in an isolated
a820: 20 61 70 70 6c 69 63 61 74 69 6f 6e 0d 0a 20 20   application..  
a830: 20 20 20 20 23 20 20 20 20 20 20 20 64 6f 6d 61      #       doma
a840: 69 6e 2e 20 20 54 68 65 20 73 63 72 69 70 74 20  in.  The script 
a850: 66 72 61 67 6d 65 6e 74 20 62 65 69 6e 67 20 72  fragment being r
a860: 65 74 75 72 6e 65 64 20 77 69 6c 6c 20 62 65 20  eturned will be 
a870: 73 75 72 72 6f 75 6e 64 65 64 20 62 79 0d 0a 20  surrounded by.. 
a880: 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68 65       #       the
a890: 20 70 72 65 66 69 78 20 61 6e 64 20 73 75 66 66   prefix and suff
a8a0: 69 78 20 22 73 63 72 69 70 74 20 66 72 61 67 6d  ix "script fragm
a8b0: 65 6e 74 73 22 20 73 70 65 63 69 66 69 65 64 20  ents" specified 
a8c0: 62 79 20 6f 75 72 20 63 61 6c 6c 65 72 2c 0d 0a  by our caller,..
a8d0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 69 66        #       if
a8e0: 20 61 6e 79 2e 20 20 54 68 65 20 65 6e 74 69 72   any.  The entir
a8f0: 65 20 73 63 72 69 70 74 20 62 65 69 6e 67 20 72  e script being r
a900: 65 74 75 72 6e 65 64 20 77 69 6c 6c 20 62 65 20  eturned will be 
a910: 73 75 62 73 74 69 74 75 74 65 64 20 76 69 61 0d  substituted via.
a920: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 5b  .      #       [
a930: 73 75 62 73 74 5d 2c 20 69 6e 20 74 68 65 20 63  subst], in the c
a940: 6f 6e 74 65 78 74 20 6f 66 20 6f 75 72 20 63 61  ontext of our ca
a950: 6c 6c 65 72 2c 20 62 65 66 6f 72 65 20 62 65 69  ller, before bei
a960: 6e 67 20 72 65 74 75 72 6e 65 64 2e 0d 0a 20 20  ng returned...  
a970: 20 20 20 20 23 20 20 20 20 20 20 20 54 68 69 73      #       This
a980: 20 73 74 65 70 20 69 73 20 6e 65 63 65 73 73 61   step is necessa
a990: 72 79 20 73 6f 20 74 68 61 74 20 73 6f 6d 65 20  ry so that some 
a9a0: 6c 69 6d 69 74 65 64 20 63 6f 6e 74 65 78 74 20  limited context 
a9b0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 2c 0d 0a 20 20  information,..  
a9c0: 20 20 20 20 23 20 20 20 20 20 20 20 70 72 69 6d      #       prim
a9d0: 61 72 69 6c 79 20 72 65 6c 61 74 65 64 20 74 6f  arily related to
a9e0: 20 74 68 65 20 74 65 73 74 69 6e 67 20 64 69 72   the testing dir
a9f0: 65 63 74 6f 72 69 65 73 2c 20 63 61 6e 20 62 65  ectories, can be
aa00: 20 74 72 61 6e 73 66 65 72 72 65 64 0d 0a 20 20   transferred..  
aa10: 20 20 20 20 23 20 20 20 20 20 20 20 74 6f 20 74      #       to t
aa20: 68 65 20 69 6e 74 65 72 70 72 65 74 65 72 20 69  he interpreter i
aa30: 6e 20 74 68 65 20 69 73 6f 6c 61 74 65 64 20 61  n the isolated a
aa40: 70 70 6c 69 63 61 74 69 6f 6e 20 64 6f 6d 61 69  pplication domai
aa50: 6e 2c 20 6d 61 6b 69 6e 67 20 69 74 0d 0a 20 20  n, making it..  
aa60: 20 20 20 20 23 20 20 20 20 20 20 20 61 62 6c 65      #       able
aa70: 20 74 6f 20 73 75 63 63 65 73 73 66 75 6c 6c 79   to successfully
aa80: 20 72 75 6e 20 74 65 73 74 73 20 74 68 61 74 20   run tests that 
aa90: 72 65 71 75 69 72 65 20 6f 6e 65 20 6f 72 20 6d  require one or m
aaa0: 6f 72 65 20 6f 66 20 74 68 65 0d 0a 20 20 20 20  ore of the..    
aab0: 20 20 23 20 20 20 20 20 20 20 66 69 6c 65 73 20    #       files 
aac0: 69 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 74 65  in one of the te
aad0: 73 74 69 6e 67 20 64 69 72 65 63 74 6f 72 69 65  sting directorie
aae0: 73 2e 20 20 43 61 6c 6c 65 72 73 20 73 68 6f 75  s.  Callers shou
aaf0: 6c 64 20 6b 65 65 70 20 69 6e 0d 0a 20 20 20 20  ld keep in..    
ab00: 20 20 23 20 20 20 20 20 20 20 6d 69 6e 64 20 74    #       mind t
ab10: 68 61 74 20 74 68 65 20 74 65 73 74 20 73 63 72  hat the test scr
ab20: 69 70 74 20 66 72 61 67 6d 65 6e 74 20 62 65 69  ipt fragment bei
ab30: 6e 67 20 72 65 74 75 72 6e 65 64 20 63 61 6e 6e  ng returned cann
ab40: 6f 74 20 72 65 6c 79 20 6f 6e 0d 0a 20 20 20 20  ot rely on..    
ab50: 20 20 23 20 20 20 20 20 20 20 61 6e 79 20 73 63    #       any sc
ab60: 72 69 70 74 20 6c 69 62 72 61 72 79 20 70 72 6f  ript library pro
ab70: 63 65 64 75 72 65 73 20 74 68 61 74 20 61 72 65  cedures that are
ab80: 20 6e 6f 74 20 70 72 6f 76 69 64 65 64 20 62 79   not provided by
ab90: 20 74 68 65 20 45 61 67 6c 65 0d 0a 20 20 20 20   the Eagle..    
aba0: 20 20 23 20 20 20 20 20 20 20 6c 69 62 72 61 72    #       librar
abb0: 79 20 70 61 63 6b 61 67 65 20 28 69 2e 65 2e 20  y package (i.e. 
abc0: 22 69 6e 69 74 2e 65 61 67 6c 65 22 29 2c 20 69  "init.eagle"), i
abd0: 6e 63 6c 75 64 69 6e 67 20 74 68 6f 73 65 20 70  ncluding those p
abe0: 72 6f 76 69 64 65 64 20 62 79 0d 0a 20 20 20 20  rovided by..    
abf0: 20 20 23 20 20 20 20 20 20 20 74 68 65 20 45 61    #       the Ea
ac00: 67 6c 65 20 74 65 73 74 20 70 61 63 6b 61 67 65  gle test package
ac10: 2c 20 75 6e 6c 65 73 73 20 74 68 65 20 66 69 6c  , unless the fil
ac20: 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  e containing the
ac30: 6d 20 69 73 20 6c 6f 61 64 65 64 0d 0a 20 20 20  m is loaded..   
ac40: 20 20 20 23 20 20 20 20 20 20 20 6d 61 6e 75 61     #       manua
ac50: 6c 6c 79 20 76 69 61 20 73 6f 6d 65 20 6f 74 68  lly via some oth
ac60: 65 72 20 6d 65 63 68 61 6e 69 73 6d 20 28 65 2e  er mechanism (e.
ac70: 67 2e 20 62 79 20 69 6e 63 6c 75 64 69 6e 67 20  g. by including 
ac80: 61 70 70 72 6f 70 72 69 61 74 65 0d 0a 20 20 20  appropriate..   
ac90: 20 20 20 23 20 20 20 20 20 20 20 5b 70 61 63 6b     #       [pack
aca0: 61 67 65 20 72 65 71 75 69 72 65 5d 20 6f 72 20  age require] or 
acb0: 5b 73 6f 75 72 63 65 5d 20 63 6f 6d 6d 61 6e 64  [source] command
acc0: 73 20 69 6e 20 74 68 65 20 70 72 65 66 69 78 20  s in the prefix 
acd0: 6f 72 20 73 75 66 66 69 78 0d 0a 20 20 20 20 20  or suffix..     
ace0: 20 23 20 20 20 20 20 20 20 73 63 72 69 70 74 20   #       script 
acf0: 66 72 61 67 6d 65 6e 74 73 29 2e 20 20 41 6c 73  fragments).  Als
ad00: 6f 2c 20 61 6c 6c 20 76 61 72 69 61 62 6c 65 20  o, all variable 
ad10: 72 65 66 65 72 65 6e 63 65 73 20 61 6e 64 20 61  references and a
ad20: 6c 6c 20 6e 65 73 74 65 64 0d 0a 20 20 20 20 20  ll nested..     
ad30: 20 23 20 20 20 20 20 20 20 63 6f 6d 6d 61 6e 64   #       command
ad40: 73 20 28 69 2e 65 2e 20 74 68 6f 73 65 20 69 6e  s (i.e. those in
ad50: 20 73 71 75 61 72 65 20 62 72 61 63 6b 65 74 73   square brackets
ad60: 29 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74  ) contained in t
ad70: 68 65 20 66 69 6e 61 6c 0d 0a 20 20 20 20 20 20  he final..      
ad80: 23 20 20 20 20 20 20 20 73 63 72 69 70 74 20 66  #       script f
ad90: 72 61 67 6d 65 6e 74 20 77 69 6c 6c 20 65 6e 64  ragment will end
ada0: 20 75 70 20 62 65 69 6e 67 20 65 76 61 6c 75 61   up being evalua
adb0: 74 65 64 20 69 6e 20 74 68 65 20 63 6f 6e 74 65  ted in the conte
adc0: 78 74 20 6f 66 20 74 68 65 0d 0a 20 20 20 20 20  xt of the..     
add0: 20 23 20 20 20 20 20 20 20 63 61 6c 6c 69 6e 67   #       calling
ade0: 20 69 6e 74 65 72 70 72 65 74 65 72 20 61 6e 64   interpreter and
adf0: 20 6e 6f 74 20 74 68 65 20 74 61 72 67 65 74 20   not the target 
ae00: 69 6e 74 65 72 70 72 65 74 65 72 20 63 72 65 61  interpreter crea
ae10: 74 65 64 20 69 6e 20 74 68 65 0d 0a 20 20 20 20  ted in the..    
ae20: 20 20 23 20 20 20 20 20 20 20 69 73 6f 6c 61 74    #       isolat
ae30: 65 64 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 64  ed application d
ae40: 6f 6d 61 69 6e 20 75 6e 6c 65 73 73 20 74 68 65  omain unless the
ae50: 20 64 6f 6c 6c 61 72 20 73 69 67 6e 73 20 61 6e   dollar signs an
ae60: 64 2f 6f 72 20 73 71 75 61 72 65 0d 0a 20 20 20  d/or square..   
ae70: 20 20 20 23 20 20 20 20 20 20 20 62 72 61 63 6b     #       brack
ae80: 65 74 73 20 61 72 65 20 73 70 65 63 69 61 6c 6c  ets are speciall
ae90: 79 20 71 75 6f 74 65 64 20 77 69 74 68 20 62 61  y quoted with ba
aea0: 63 6b 73 6c 61 73 68 65 73 2e 0d 0a 20 20 20 20  ckslashes...    
aeb0: 20 20 23 0d 0a 20 20 20 20 20 20 72 65 74 75 72    #..      retur
aec0: 6e 20 5b 75 70 6c 65 76 65 6c 20 31 20 5b 6c 69  n [uplevel 1 [li
aed0: 73 74 20 73 75 62 73 74 20 5b 61 70 70 65 6e 64  st subst [append
aee0: 41 72 67 73 20 24 70 72 65 66 69 78 20 7b 0d 0a  Args $prefix {..
aef0: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
af00: 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 65 20 5c     # NOTE: The \
af10: 5b 6f 62 6a 65 63 74 5c 5d 20 63 6f 6d 6d 61 6e  [object\] comman
af20: 64 20 6d 61 79 20 62 65 20 6d 69 73 73 69 6e 67  d may be missing
af30: 20 69 6e 20 73 6f 6d 65 20 45 61 67 6c 65 20 63   in some Eagle c
af40: 6f 72 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20  ore..        #  
af50: 20 20 20 20 20 6c 69 62 72 61 72 79 20 63 6f 6e       library con
af60: 66 69 67 75 72 61 74 69 6f 6e 73 2e 20 20 43 6c  figurations.  Cl
af70: 6f 6e 69 6e 67 20 61 6e 64 20 75 73 69 6e 67 20  oning and using 
af80: 74 68 65 20 70 72 6f 63 65 64 75 72 65 0d 0a 20  the procedure.. 
af90: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 5c         #       \
afa0: 5b 63 68 61 6e 67 65 4e 61 74 69 76 65 52 75 6e  [changeNativeRun
afb0: 74 69 6d 65 4f 70 74 69 6f 6e 5c 5d 20 6d 61 79  timeOption\] may
afc0: 20 68 65 6c 70 20 74 6f 20 6d 69 74 69 67 61 74   help to mitigat
afd0: 65 20 74 68 69 73 2e 0d 0a 20 20 20 20 20 20 20  e this...       
afe0: 20 23 0d 0a 20 20 20 20 20 20 20 20 70 72 6f 63   #..        proc
aff0: 20 63 68 61 6e 67 65 4e 61 74 69 76 65 52 75 6e   changeNativeRun
b000: 74 69 6d 65 4f 70 74 69 6f 6e 20 5c 0d 0a 20 20  timeOption \..  
b010: 20 20 20 20 20 20 20 20 20 20 7b 5b 69 6e 66 6f            {[info
b020: 20 61 72 67 73 20 63 68 61 6e 67 65 4e 61 74 69   args changeNati
b030: 76 65 52 75 6e 74 69 6d 65 4f 70 74 69 6f 6e 5d  veRuntimeOption]
b040: 7d 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  } \..           
b050: 20 7b 5b 69 6e 66 6f 20 62 6f 64 79 20 63 68 61   {[info body cha
b060: 6e 67 65 4e 61 74 69 76 65 52 75 6e 74 69 6d 65  ngeNativeRuntime
b070: 4f 70 74 69 6f 6e 5d 7d 0d 0a 0d 0a 20 20 20 20  Option]}....    
b080: 20 20 20 20 63 61 74 63 68 20 7b 0d 0a 20 20 20      catch {..   
b090: 20 20 20 20 20 20 20 63 68 61 6e 67 65 4e 61 74         changeNat
b0a0: 69 76 65 52 75 6e 74 69 6d 65 4f 70 74 69 6f 6e  iveRuntimeOption
b0b0: 20 5b 68 61 73 52 75 6e 74 69 6d 65 4f 70 74 69   [hasRuntimeOpti
b0c0: 6f 6e 20 6e 61 74 69 76 65 5d 0d 0a 20 20 20 20  on native]..    
b0d0: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 20 5b      }..      } [
b0e0: 67 65 74 54 65 73 74 4f 76 65 72 72 69 64 65 73  getTestOverrides
b0f0: 50 72 65 61 6d 62 6c 65 20 5b 6c 69 73 74 20 70  Preamble [list p
b100: 61 74 68 20 74 65 73 74 5f 63 68 61 6e 6e 65 6c  ath test_channel
b110: 5d 5d 20 24 73 75 66 66 69 78 5d 5d 5d 0d 0a 20  ]] $suffix]]].. 
b120: 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
b130: 63 20 74 72 79 43 6f 70 79 45 78 74 65 72 6e 61  c tryCopyExterna
b140: 6c 46 69 6c 65 20 7b 0d 0a 20 20 20 20 20 20 20  lFile {..       
b150: 20 20 20 20 20 66 69 6c 65 4e 61 6d 65 20 7b 70       fileName {p
b160: 6c 61 74 66 6f 72 6d 20 22 22 7d 20 7b 6e 65 77  latform ""} {new
b170: 46 69 6c 65 4e 61 6d 65 20 22 22 7d 20 7b 76 65  FileName ""} {ve
b180: 72 62 6f 73 65 20 74 72 75 65 7d 20 7d 20 7b 0d  rbose true} } {.
b190: 0a 20 20 20 20 20 20 73 65 74 20 73 6f 75 72 63  .      set sourc
b1a0: 65 46 69 6c 65 4e 61 6d 65 20 5b 67 65 74 45 78  eFileName [getEx
b1b0: 74 65 72 6e 61 6c 46 69 6c 65 4e 61 6d 65 20 24  ternalFileName $
b1c0: 66 69 6c 65 4e 61 6d 65 5d 0d 0a 0d 0a 20 20 20  fileName]....   
b1d0: 20 20 20 69 66 20 7b 21 5b 66 69 6c 65 20 65 78     if {![file ex
b1e0: 69 73 74 73 20 24 73 6f 75 72 63 65 46 69 6c 65  ists $sourceFile
b1f0: 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  Name]} then {.. 
b200: 20 20 20 20 20 20 20 69 66 20 7b 24 76 65 72 62         if {$verb
b210: 6f 73 65 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  ose} then {..   
b220: 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
b230: 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70  test_channel [ap
b240: 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
b250: 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
b260: 73 6b 69 70 70 65 64 20 63 6f 70 79 69 6e 67 20  skipped copying 
b270: 65 78 74 65 72 6e 61 6c 20 66 69 6c 65 20 5c 22  external file \"
b280: 22 20 24 73 6f 75 72 63 65 46 69 6c 65 4e 61 6d  " $sourceFileNam
b290: 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e \..           
b2a0: 20 20 20 22 5c 22 2c 20 69 74 20 64 6f 65 73 20     "\", it does 
b2b0: 6e 6f 74 20 65 78 69 73 74 5c 6e 22 5d 0d 0a 20  not exist\n"].. 
b2c0: 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
b2d0: 20 20 20 20 72 65 74 75 72 6e 0d 0a 20 20 20 20      return..    
b2e0: 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20    }....      if 
b2f0: 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20  {[string length 
b300: 24 6e 65 77 46 69 6c 65 4e 61 6d 65 5d 20 3e 20  $newFileName] > 
b310: 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
b320: 20 20 20 73 65 74 20 74 61 72 67 65 74 46 69 6c     set targetFil
b330: 65 4e 61 6d 65 20 5b 67 65 74 42 69 6e 61 72 79  eName [getBinary
b340: 46 69 6c 65 4e 61 6d 65 20 24 6e 65 77 46 69 6c  FileName $newFil
b350: 65 4e 61 6d 65 20 24 70 6c 61 74 66 6f 72 6d 5d  eName $platform]
b360: 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b  ..      } else {
b370: 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 74 61  ..        set ta
b380: 72 67 65 74 46 69 6c 65 4e 61 6d 65 20 5b 67 65  rgetFileName [ge
b390: 74 42 69 6e 61 72 79 46 69 6c 65 4e 61 6d 65 20  tBinaryFileName 
b3a0: 24 66 69 6c 65 4e 61 6d 65 20 24 70 6c 61 74 66  $fileName $platf
b3b0: 6f 72 6d 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d  orm]..      }...
b3c0: 0a 20 20 20 20 20 20 73 65 74 20 74 61 72 67 65  .      set targe
b3d0: 74 44 69 72 65 63 74 6f 72 79 20 5b 66 69 6c 65  tDirectory [file
b3e0: 20 64 69 72 6e 61 6d 65 20 24 74 61 72 67 65 74   dirname $target
b3f0: 46 69 6c 65 4e 61 6d 65 5d 0d 0a 0d 0a 20 20 20  FileName]....   
b400: 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d     if {[catch {.
b410: 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 66  .        if {![f
b420: 69 6c 65 20 65 78 69 73 74 73 20 24 74 61 72 67  ile exists $targ
b430: 65 74 44 69 72 65 63 74 6f 72 79 5d 7d 20 74 68  etDirectory]} th
b440: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
b450: 66 69 6c 65 20 6d 6b 64 69 72 20 24 74 61 72 67  file mkdir $targ
b460: 65 74 44 69 72 65 63 74 6f 72 79 0d 0a 20 20 20  etDirectory..   
b470: 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
b480: 20 20 66 69 6c 65 20 63 6f 70 79 20 2d 66 6f 72    file copy -for
b490: 63 65 20 24 73 6f 75 72 63 65 46 69 6c 65 4e 61  ce $sourceFileNa
b4a0: 6d 65 20 24 74 61 72 67 65 74 46 69 6c 65 4e 61  me $targetFileNa
b4b0: 6d 65 0d 0a 20 20 20 20 20 20 7d 5d 20 3d 3d 20  me..      }] == 
b4c0: 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
b4d0: 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
b4e0: 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  _channel [append
b4f0: 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
b500: 20 20 20 20 22 2d 2d 2d 2d 20 63 6f 70 69 65 64      "---- copied
b510: 20 65 78 74 65 72 6e 61 6c 20 66 69 6c 65 20 66   external file f
b520: 72 6f 6d 20 5c 22 22 20 24 73 6f 75 72 63 65 46  rom \"" $sourceF
b530: 69 6c 65 4e 61 6d 65 20 22 5c 22 20 74 6f 20 5c  ileName "\" to \
b540: 22 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  "" \..          
b550: 20 20 24 74 61 72 67 65 74 46 69 6c 65 4e 61 6d    $targetFileNam
b560: 65 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d  e \"\n]..      }
b570: 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
b580: 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
b590: 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
b5a0: 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
b5b0: 20 20 22 2d 2d 2d 2d 20 66 61 69 6c 65 64 20 74    "---- failed t
b5c0: 6f 20 63 6f 70 79 20 65 78 74 65 72 6e 61 6c 20  o copy external 
b5d0: 66 69 6c 65 20 66 72 6f 6d 20 5c 22 22 20 24 73  file from \"" $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 22 5c 22  .            "\"
b600: 20 74 6f 20 5c 22 22 20 24 74 61 72 67 65 74 46   to \"" $targetF
b610: 69 6c 65 4e 61 6d 65 20 5c 22 5c 6e 5d 0d 0a 20  ileName \"\n].. 
b620: 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c       }..    }...
b630: 0d 0a 20 20 20 20 70 72 6f 63 20 74 72 79 43 6f  ..    proc tryCo
b640: 70 79 42 69 6e 61 72 79 46 69 6c 65 20 7b 0d 0a  pyBinaryFile {..
b650: 20 20 20 20 20 20 20 20 20 20 20 20 66 69 6c 65              file
b660: 4e 61 6d 65 20 6d 61 6e 61 67 65 64 4f 6e 6c 79  Name managedOnly
b670: 20 7b 70 6c 61 74 66 6f 72 6d 20 22 22 7d 20 7b   {platform ""} {
b680: 6e 65 77 46 69 6c 65 4e 61 6d 65 20 22 22 7d 0d  newFileName ""}.
b690: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 76 65  .            {ve
b6a0: 72 62 6f 73 65 20 74 72 75 65 7d 20 7d 20 7b 0d  rbose true} } {.
b6b0: 0a 20 20 20 20 20 20 73 65 74 20 73 6f 75 72 63  .      set sourc
b6c0: 65 46 69 6c 65 4e 61 6d 65 20 5b 67 65 74 42 69  eFileName [getBi
b6d0: 6e 61 72 79 46 69 6c 65 4e 61 6d 65 20 24 66 69  naryFileName $fi
b6e0: 6c 65 4e 61 6d 65 20 24 70 6c 61 74 66 6f 72 6d  leName $platform
b6f0: 5d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 21  ]....      if {!
b700: 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24 73 6f  [file exists $so
b710: 75 72 63 65 46 69 6c 65 4e 61 6d 65 5d 7d 20 74  urceFileName]} t
b720: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 69  hen {..        i
b730: 66 20 7b 24 76 65 72 62 6f 73 65 7d 20 74 68 65  f {$verbose} the
b740: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74  n {..          t
b750: 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
b760: 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
b770: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
b780: 20 20 22 2d 2d 2d 2d 20 73 6b 69 70 70 65 64 20    "---- skipped 
b790: 63 6f 70 79 69 6e 67 20 62 69 6e 61 72 79 20 66  copying binary f
b7a0: 69 6c 65 20 5c 22 22 20 24 73 6f 75 72 63 65 46  ile \"" $sourceF
b7b0: 69 6c 65 4e 61 6d 65 20 5c 0d 0a 20 20 20 20 20  ileName \..     
b7c0: 20 20 20 20 20 20 20 20 20 22 5c 22 2c 20 69 74           "\", it
b7d0: 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 5c   does not exist\
b7e0: 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  n"]..        }..
b7f0: 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ..        return
b800: 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
b810: 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c     if {[string l
b820: 65 6e 67 74 68 20 24 6e 65 77 46 69 6c 65 4e 61  ength $newFileNa
b830: 6d 65 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d  me] > 0} then {.
b840: 0a 20 20 20 20 20 20 20 20 73 65 74 20 74 61 72  .        set tar
b850: 67 65 74 46 69 6c 65 4e 61 6d 65 20 5b 67 65 74  getFileName [get
b860: 42 75 69 6c 64 46 69 6c 65 4e 61 6d 65 20 5c 0d  BuildFileName \.
b870: 0a 20 20 20 20 20 20 20 20 20 20 20 20 24 6e 65  .            $ne
b880: 77 46 69 6c 65 4e 61 6d 65 20 24 6d 61 6e 61 67  wFileName $manag
b890: 65 64 4f 6e 6c 79 20 24 70 6c 61 74 66 6f 72 6d  edOnly $platform
b8a0: 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20  ]..      } else 
b8b0: 7b 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 74  {..        set t
b8c0: 61 72 67 65 74 46 69 6c 65 4e 61 6d 65 20 5b 67  argetFileName [g
b8d0: 65 74 42 75 69 6c 64 46 69 6c 65 4e 61 6d 65 20  etBuildFileName 
b8e0: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 24  \..            $
b8f0: 66 69 6c 65 4e 61 6d 65 20 24 6d 61 6e 61 67 65  fileName $manage
b900: 64 4f 6e 6c 79 20 24 70 6c 61 74 66 6f 72 6d 5d  dOnly $platform]
b910: 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
b920: 20 20 20 73 65 74 20 74 61 72 67 65 74 44 69 72     set targetDir
b930: 65 63 74 6f 72 79 20 5b 66 69 6c 65 20 64 69 72  ectory [file dir
b940: 6e 61 6d 65 20 24 74 61 72 67 65 74 46 69 6c 65  name $targetFile
b950: 4e 61 6d 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 69  Name]....      i
b960: 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20  f {[catch {..   
b970: 20 20 20 20 20 69 66 20 7b 21 5b 66 69 6c 65 20       if {![file 
b980: 65 78 69 73 74 73 20 24 74 61 72 67 65 74 44 69  exists $targetDi
b990: 72 65 63 74 6f 72 79 5d 7d 20 74 68 65 6e 20 7b  rectory]} then {
b9a0: 0d 0a 20 20 20 20 20 20 20 20 20 20 66 69 6c 65  ..          file
b9b0: 20 6d 6b 64 69 72 20 24 74 61 72 67 65 74 44 69   mkdir $targetDi
b9c0: 72 65 63 74 6f 72 79 0d 0a 20 20 20 20 20 20 20  rectory..       
b9d0: 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 66 69   }....        fi
b9e0: 6c 65 20 63 6f 70 79 20 2d 66 6f 72 63 65 20 24  le copy -force $
b9f0: 73 6f 75 72 63 65 46 69 6c 65 4e 61 6d 65 20 24  sourceFileName $
ba00: 74 61 72 67 65 74 46 69 6c 65 4e 61 6d 65 0d 0a  targetFileName..
ba10: 20 20 20 20 20 20 7d 5d 20 3d 3d 20 30 7d 20 74        }] == 0} t
ba20: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 74  hen {..        t
ba30: 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
ba40: 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
ba50: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
ba60: 22 2d 2d 2d 2d 20 63 6f 70 69 65 64 20 62 69 6e  "---- copied bin
ba70: 61 72 79 20 66 69 6c 65 20 66 72 6f 6d 20 5c 22  ary file from \"
ba80: 22 20 24 73 6f 75 72 63 65 46 69 6c 65 4e 61 6d  " $sourceFileNam
ba90: 65 20 22 5c 22 20 74 6f 20 5c 22 22 20 5c 0d 0a  e "\" to \"" \..
baa0: 20 20 20 20 20 20 20 20 20 20 20 20 24 74 61 72              $tar
bab0: 67 65 74 46 69 6c 65 4e 61 6d 65 20 5c 22 5c 6e  getFileName \"\n
bac0: 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20  ]..      } else 
bad0: 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73  {..        tputs
bae0: 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
baf0: 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
bb00: 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
bb10: 2d 20 66 61 69 6c 65 64 20 74 6f 20 63 6f 70 79  - failed to copy
bb20: 20 62 69 6e 61 72 79 20 66 69 6c 65 20 66 72 6f   binary file fro
bb30: 6d 20 5c 22 22 20 24 73 6f 75 72 63 65 46 69 6c  m \"" $sourceFil
bb40: 65 4e 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20 20  eName \..       
bb50: 20 20 20 20 20 22 5c 22 20 74 6f 20 5c 22 22 20       "\" to \"" 
bb60: 24 74 61 72 67 65 74 46 69 6c 65 4e 61 6d 65 20  $targetFileName 
bb70: 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a  \"\n]..      }..
bb80: 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
bb90: 6f 63 20 74 72 79 43 6f 70 79 42 75 69 6c 64 46  oc tryCopyBuildF
bba0: 69 6c 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  ile {..         
bbb0: 20 20 20 66 69 6c 65 4e 61 6d 65 20 6d 61 6e 61     fileName mana
bbc0: 67 65 64 4f 6e 6c 79 20 7b 70 6c 61 74 66 6f 72  gedOnly {platfor
bbd0: 6d 20 22 22 7d 20 7b 6e 65 77 46 69 6c 65 4e 61  m ""} {newFileNa
bbe0: 6d 65 20 22 22 7d 0d 0a 20 20 20 20 20 20 20 20  me ""}..        
bbf0: 20 20 20 20 7b 76 65 72 62 6f 73 65 20 74 72 75      {verbose tru
bc00: 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 73 65  e} } {..      se
bc10: 74 20 73 6f 75 72 63 65 46 69 6c 65 4e 61 6d 65  t sourceFileName
bc20: 20 5b 67 65 74 42 75 69 6c 64 46 69 6c 65 4e 61   [getBuildFileNa
bc30: 6d 65 20 24 66 69 6c 65 4e 61 6d 65 20 24 6d 61  me $fileName $ma
bc40: 6e 61 67 65 64 4f 6e 6c 79 20 24 70 6c 61 74 66  nagedOnly $platf
bc50: 6f 72 6d 5d 0d 0a 0d 0a 20 20 20 20 20 20 69 66  orm]....      if
bc60: 20 7b 21 5b 66 69 6c 65 20 65 78 69 73 74 73 20   {![file exists 
bc70: 24 73 6f 75 72 63 65 46 69 6c 65 4e 61 6d 65 5d  $sourceFileName]
bc80: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
bc90: 20 20 69 66 20 7b 24 76 65 72 62 6f 73 65 7d 20    if {$verbose} 
bca0: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
bcb0: 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
bcc0: 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
bcd0: 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
bce0: 20 20 20 20 20 22 2d 2d 2d 2d 20 73 6b 69 70 70       "---- skipp
bcf0: 65 64 20 63 6f 70 79 69 6e 67 20 62 75 69 6c 64  ed copying build
bd00: 20 66 69 6c 65 20 5c 22 22 20 24 73 6f 75 72 63   file \"" $sourc
bd10: 65 46 69 6c 65 4e 61 6d 65 20 5c 0d 0a 20 20 20  eFileName \..   
bd20: 20 20 20 20 20 20 20 20 20 20 20 22 5c 22 2c 20             "\", 
bd30: 69 74 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73  it does not exis
bd40: 74 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20 7d  t\n"]..        }
bd50: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75  ....        retu
bd60: 72 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  rn..      }.... 
bd70: 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67       if {[string
bd80: 20 6c 65 6e 67 74 68 20 24 6e 65 77 46 69 6c 65   length $newFile
bd90: 4e 61 6d 65 5d 20 3e 20 30 7d 20 74 68 65 6e 20  Name] > 0} then 
bda0: 7b 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 74  {..        set t
bdb0: 61 72 67 65 74 46 69 6c 65 4e 61 6d 65 20 5b 67  argetFileName [g
bdc0: 65 74 42 69 6e 61 72 79 46 69 6c 65 4e 61 6d 65  etBinaryFileName
bdd0: 20 24 6e 65 77 46 69 6c 65 4e 61 6d 65 20 24 70   $newFileName $p
bde0: 6c 61 74 66 6f 72 6d 5d 0d 0a 20 20 20 20 20 20  latform]..      
bdf0: 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
be00: 20 20 73 65 74 20 74 61 72 67 65 74 46 69 6c 65    set targetFile
be10: 4e 61 6d 65 20 5b 67 65 74 42 69 6e 61 72 79 46  Name [getBinaryF
be20: 69 6c 65 4e 61 6d 65 20 24 66 69 6c 65 4e 61 6d  ileName $fileNam
be30: 65 20 24 70 6c 61 74 66 6f 72 6d 5d 0d 0a 20 20  e $platform]..  
be40: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 73      }....      s
be50: 65 74 20 74 61 72 67 65 74 44 69 72 65 63 74 6f  et targetDirecto
be60: 72 79 20 5b 66 69 6c 65 20 64 69 72 6e 61 6d 65  ry [file dirname
be70: 20 24 74 61 72 67 65 74 46 69 6c 65 4e 61 6d 65   $targetFileName
be80: 5d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b  ]....      if {[
be90: 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20  catch {..       
bea0: 20 69 66 20 7b 21 5b 66 69 6c 65 20 65 78 69 73   if {![file exis
beb0: 74 73 20 24 74 61 72 67 65 74 44 69 72 65 63 74  ts $targetDirect
bec0: 6f 72 79 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ory]} then {..  
bed0: 20 20 20 20 20 20 20 20 66 69 6c 65 20 6d 6b 64          file mkd
bee0: 69 72 20 24 74 61 72 67 65 74 44 69 72 65 63 74  ir $targetDirect
bef0: 6f 72 79 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  ory..        }..
bf00: 0d 0a 20 20 20 20 20 20 20 20 66 69 6c 65 20 63  ..        file c
bf10: 6f 70 79 20 2d 66 6f 72 63 65 20 24 73 6f 75 72  opy -force $sour
bf20: 63 65 46 69 6c 65 4e 61 6d 65 20 24 74 61 72 67  ceFileName $targ
bf30: 65 74 46 69 6c 65 4e 61 6d 65 0d 0a 20 20 20 20  etFileName..    
bf40: 20 20 7d 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20    }] == 0} then 
bf50: 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73  {..        tputs
bf60: 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
bf70: 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
bf80: 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
bf90: 2d 20 63 6f 70 69 65 64 20 62 75 69 6c 64 20 66  - copied build f
bfa0: 69 6c 65 20 66 72 6f 6d 20 5c 22 22 20 24 73 6f  ile from \"" $so
bfb0: 75 72 63 65 46 69 6c 65 4e 61 6d 65 20 22 5c 22  urceFileName "\"
bfc0: 20 74 6f 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20   to \"" \..     
bfd0: 20 20 20 20 20 20 20 24 74 61 72 67 65 74 46 69         $targetFi
bfe0: 6c 65 4e 61 6d 65 20 5c 22 5c 6e 5d 0d 0a 20 20  leName \"\n]..  
bff0: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
c000: 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
c010: 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70  est_channel [app
c020: 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
c030: 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 66 61 69         "---- fai
c040: 6c 65 64 20 74 6f 20 63 6f 70 79 20 62 75 69 6c  led to copy buil
c050: 64 20 66 69 6c 65 20 66 72 6f 6d 20 5c 22 22 20  d file from \"" 
c060: 24 73 6f 75 72 63 65 46 69 6c 65 4e 61 6d 65 20  $sourceFileName 
c070: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22  \..            "
c080: 5c 22 20 74 6f 20 5c 22 22 20 24 74 61 72 67 65  \" to \"" $targe
c090: 74 46 69 6c 65 4e 61 6d 65 20 5c 22 5c 6e 5d 0d  tFileName \"\n].
c0a0: 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d  .      }..    }.
c0b0: 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 74 72 79  ....    proc try
c0c0: 44 65 6c 65 74 65 42 69 6e 61 72 79 46 69 6c 65  DeleteBinaryFile
c0d0: 20 7b 20 66 69 6c 65 4e 61 6d 65 20 7b 70 6c 61   { fileName {pla
c0e0: 74 66 6f 72 6d 20 22 22 7d 20 7b 76 65 72 62 6f  tform ""} {verbo
c0f0: 73 65 20 74 72 75 65 7d 20 7d 20 7b 0d 0a 20 20  se true} } {..  
c100: 20 20 20 20 73 65 74 20 66 69 6c 65 4e 61 6d 65      set fileName
c110: 20 5b 67 65 74 42 69 6e 61 72 79 46 69 6c 65 4e   [getBinaryFileN
c120: 61 6d 65 20 24 66 69 6c 65 4e 61 6d 65 20 24 70  ame $fileName $p
c130: 6c 61 74 66 6f 72 6d 5d 0d 0a 0d 0a 20 20 20 20  latform]....    
c140: 20 20 69 66 20 7b 21 5b 66 69 6c 65 20 65 78 69    if {![file exi
c150: 73 74 73 20 24 66 69 6c 65 4e 61 6d 65 5d 7d 20  sts $fileName]} 
c160: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
c170: 69 66 20 7b 24 76 65 72 62 6f 73 65 7d 20 74 68  if {$verbose} th
c180: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
c190: 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
c1a0: 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
c1b0: 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
c1c0: 20 20 20 22 2d 2d 2d 2d 20 73 6b 69 70 70 65 64     "---- skipped
c1d0: 20 64 65 6c 65 74 69 6e 67 20 62 69 6e 61 72 79   deleting binary
c1e0: 20 66 69 6c 65 20 5c 22 22 20 24 66 69 6c 65 4e   file \"" $fileN
c1f0: 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ame \..         
c200: 20 20 20 20 20 22 5c 22 2c 20 69 74 20 64 6f 65       "\", it doe
c210: 73 20 6e 6f 74 20 65 78 69 73 74 5c 6e 22 5d 0d  s not exist\n"].
c220: 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  .        }....  
c230: 20 20 20 20 20 20 72 65 74 75 72 6e 0d 0a 20 20        return..  
c240: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 69      }....      i
c250: 66 20 7b 5b 63 61 74 63 68 20 7b 66 69 6c 65 20  f {[catch {file 
c260: 64 65 6c 65 74 65 20 24 66 69 6c 65 4e 61 6d 65  delete $fileName
c270: 7d 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d  }] == 0} then {.
c280: 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24  .        tputs $
c290: 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b  ::test_channel [
c2a0: 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
c2b0: 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
c2c0: 64 65 6c 65 74 65 64 20 62 69 6e 61 72 79 20 66  deleted binary f
c2d0: 69 6c 65 20 5c 22 22 20 24 66 69 6c 65 4e 61 6d  ile \"" $fileNam
c2e0: 65 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d  e \"\n]..      }
c2f0: 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
c300: 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
c310: 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
c320: 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
c330: 20 20 22 2d 2d 2d 2d 20 66 61 69 6c 65 64 20 74    "---- failed t
c340: 6f 20 64 65 6c 65 74 65 20 62 69 6e 61 72 79 20  o delete binary 
c350: 66 69 6c 65 20 5c 22 22 20 24 66 69 6c 65 4e 61  file \"" $fileNa
c360: 6d 65 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20  me \"\n]..      
c370: 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  }..    }.....   
c380: 20 70 72 6f 63 20 74 72 79 44 65 6c 65 74 65 42   proc tryDeleteB
c390: 75 69 6c 64 46 69 6c 65 20 7b 0d 0a 20 20 20 20  uildFile {..    
c3a0: 20 20 20 20 20 20 20 20 66 69 6c 65 4e 61 6d 65          fileName
c3b0: 20 6d 61 6e 61 67 65 64 4f 6e 6c 79 20 7b 70 6c   managedOnly {pl
c3c0: 61 74 66 6f 72 6d 20 22 22 7d 20 7b 76 65 72 62  atform ""} {verb
c3d0: 6f 73 65 20 74 72 75 65 7d 20 7d 20 7b 0d 0a 20  ose true} } {.. 
c3e0: 20 20 20 20 20 73 65 74 20 66 69 6c 65 4e 61 6d       set fileNam
c3f0: 65 20 5b 67 65 74 42 75 69 6c 64 46 69 6c 65 4e  e [getBuildFileN
c400: 61 6d 65 20 24 66 69 6c 65 4e 61 6d 65 20 24 6d  ame $fileName $m
c410: 61 6e 61 67 65 64 4f 6e 6c 79 20 24 70 6c 61 74  anagedOnly $plat
c420: 66 6f 72 6d 5d 0d 0a 0d 0a 20 20 20 20 20 20 69  form]....      i
c430: 66 20 7b 21 5b 66 69 6c 65 20 65 78 69 73 74 73  f {![file exists
c440: 20 24 66 69 6c 65 4e 61 6d 65 5d 7d 20 74 68 65   $fileName]} the
c450: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20  n {..        if 
c460: 7b 24 76 65 72 62 6f 73 65 7d 20 74 68 65 6e 20  {$verbose} then 
c470: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70 75  {..          tpu
c480: 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
c490: 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
c4a0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
c4b0: 22 2d 2d 2d 2d 20 73 6b 69 70 70 65 64 20 64 65  "---- skipped de
c4c0: 6c 65 74 69 6e 67 20 62 75 69 6c 64 20 66 69 6c  leting build fil
c4d0: 65 20 5c 22 22 20 24 66 69 6c 65 4e 61 6d 65 20  e \"" $fileName 
c4e0: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
c4f0: 20 22 5c 22 2c 20 69 74 20 64 6f 65 73 20 6e 6f   "\", it does no
c500: 74 20 65 78 69 73 74 5c 6e 22 5d 0d 0a 20 20 20  t exist\n"]..   
c510: 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
c520: 20 20 72 65 74 75 72 6e 0d 0a 20 20 20 20 20 20    return..      
c530: 7d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b  }....      if {[
c540: 63 61 74 63 68 20 7b 66 69 6c 65 20 64 65 6c 65  catch {file dele
c550: 74 65 20 24 66 69 6c 65 4e 61 6d 65 7d 5d 20 3d  te $fileName}] =
c560: 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  = 0} then {..   
c570: 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
c580: 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
c590: 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
c5a0: 20 20 20 20 20 20 22 2d 2d 2d 2d 20 64 65 6c 65        "---- dele
c5b0: 74 65 64 20 62 75 69 6c 64 20 66 69 6c 65 20 5c  ted build file \
c5c0: 22 22 20 24 66 69 6c 65 4e 61 6d 65 20 5c 22 5c  "" $fileName \"\
c5d0: 6e 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65  n]..      } else
c5e0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74   {..        tput
c5f0: 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
c600: 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
c610: 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d  .            "--
c620: 2d 2d 20 66 61 69 6c 65 64 20 74 6f 20 64 65 6c  -- failed to del
c630: 65 74 65 20 62 75 69 6c 64 20 66 69 6c 65 20 5c  ete build file \
c640: 22 22 20 24 66 69 6c 65 4e 61 6d 65 20 5c 22 5c  "" $fileName \"\
c650: 6e 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20  n]..      }..   
c660: 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
c670: 74 72 79 43 6f 70 79 41 73 73 65 6d 62 6c 79 20  tryCopyAssembly 
c680: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 66  {..            f
c690: 69 6c 65 4e 61 6d 65 20 6d 61 6e 61 67 65 64 4f  ileName managedO
c6a0: 6e 6c 79 20 7b 70 6c 61 74 66 6f 72 6d 20 22 22  nly {platform ""
c6b0: 7d 20 7b 70 64 62 20 74 72 75 65 7d 20 7b 76 65  } {pdb true} {ve
c6c0: 72 62 6f 73 65 20 74 72 75 65 7d 20 7d 20 7b 0d  rbose true} } {.
c6d0: 0a 20 20 20 20 20 20 74 72 79 43 6f 70 79 42 75  .      tryCopyBu
c6e0: 69 6c 64 46 69 6c 65 20 24 66 69 6c 65 4e 61 6d  ildFile $fileNam
c6f0: 65 20 24 6d 61 6e 61 67 65 64 4f 6e 6c 79 20 24  e $managedOnly $
c700: 70 6c 61 74 66 6f 72 6d 20 22 22 20 24 76 65 72  platform "" $ver
c710: 62 6f 73 65 0d 0a 0d 0a 20 20 20 20 20 20 69 66  bose....      if
c720: 20 7b 24 70 64 62 7d 20 74 68 65 6e 20 7b 0d 0a   {$pdb} then {..
c730: 20 20 20 20 20 20 20 20 74 72 79 43 6f 70 79 42          tryCopyB
c740: 75 69 6c 64 46 69 6c 65 20 5b 61 70 70 65 6e 64  uildFile [append
c750: 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
c760: 20 20 20 20 5b 66 69 6c 65 20 72 6f 6f 74 6e 61      [file rootna
c770: 6d 65 20 24 66 69 6c 65 4e 61 6d 65 5d 20 2e 70  me $fileName] .p
c780: 64 62 5d 20 24 6d 61 6e 61 67 65 64 4f 6e 6c 79  db] $managedOnly
c790: 20 24 70 6c 61 74 66 6f 72 6d 20 22 22 20 24 76   $platform "" $v
c7a0: 65 72 62 6f 73 65 0d 0a 20 20 20 20 20 20 7d 0d  erbose..      }.
c7b0: 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70  .    }.....    p
c7c0: 72 6f 63 20 74 72 79 44 65 6c 65 74 65 41 73 73  roc tryDeleteAss
c7d0: 65 6d 62 6c 79 20 7b 0d 0a 20 20 20 20 20 20 20  embly {..       
c7e0: 20 20 20 20 20 66 69 6c 65 4e 61 6d 65 20 7b 70       fileName {p
c7f0: 6c 61 74 66 6f 72 6d 20 22 22 7d 20 7b 70 64 62  latform ""} {pdb
c800: 20 74 72 75 65 7d 20 7b 76 65 72 62 6f 73 65 20   true} {verbose 
c810: 74 72 75 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20  true} } {..     
c820: 20 74 72 79 44 65 6c 65 74 65 42 69 6e 61 72 79   tryDeleteBinary
c830: 46 69 6c 65 20 24 66 69 6c 65 4e 61 6d 65 20 24  File $fileName $
c840: 70 6c 61 74 66 6f 72 6d 20 24 76 65 72 62 6f 73  platform $verbos
c850: 65 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 24  e....      if {$
c860: 70 64 62 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  pdb} then {..   
c870: 20 20 20 20 20 74 72 79 44 65 6c 65 74 65 42 69       tryDeleteBi
c880: 6e 61 72 79 46 69 6c 65 20 5b 61 70 70 65 6e 64  naryFile [append
c890: 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
c8a0: 20 20 20 20 5b 66 69 6c 65 20 72 6f 6f 74 6e 61      [file rootna
c8b0: 6d 65 20 24 66 69 6c 65 4e 61 6d 65 5d 20 2e 70  me $fileName] .p
c8c0: 64 62 5d 20 24 70 6c 61 74 66 6f 72 6d 20 24 76  db] $platform $v
c8d0: 65 72 62 6f 73 65 0d 0a 20 20 20 20 20 20 7d 0d  erbose..      }.
c8e0: 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70  .    }.....    p
c8f0: 72 6f 63 20 74 72 79 4c 6f 61 64 41 73 73 65 6d  roc tryLoadAssem
c900: 62 6c 79 20 7b 20 66 69 6c 65 4e 61 6d 65 20 7b  bly { fileName {
c910: 70 6c 61 74 66 6f 72 6d 20 22 22 7d 20 7d 20 7b  platform ""} } {
c920: 0d 0a 20 20 20 20 20 20 73 65 74 20 66 69 6c 65  ..      set file
c930: 4e 61 6d 65 20 5b 67 65 74 42 69 6e 61 72 79 46  Name [getBinaryF
c940: 69 6c 65 4e 61 6d 65 20 24 66 69 6c 65 4e 61 6d  ileName $fileNam
c950: 65 20 24 70 6c 61 74 66 6f 72 6d 5d 0d 0a 0d 0a  e $platform]....
c960: 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68        if {[catch
c970: 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20   {..        set 
c980: 61 73 73 65 6d 62 6c 79 20 5b 6f 62 6a 65 63 74  assembly [object
c990: 20 6c 6f 61 64 20 2d 6c 6f 61 64 74 79 70 65 20   load -loadtype 
c9a0: 46 69 6c 65 20 2d 61 6c 69 61 73 20 24 66 69 6c  File -alias $fil
c9b0: 65 4e 61 6d 65 5d 0d 0a 20 20 20 20 20 20 7d 5d  eName]..      }]
c9c0: 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20   == 0} then {.. 
c9d0: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
c9e0: 20 20 23 20 4e 4f 54 45 3a 20 4e 6f 77 2c 20 61    # NOTE: Now, a
c9f0: 64 64 20 74 68 65 20 6e 65 63 65 73 73 61 72 79  dd the necessary
ca00: 20 74 65 73 74 20 63 6f 6e 73 74 72 61 69 6e 74   test constraint
ca10: 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
ca20: 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61        addConstra
ca30: 69 6e 74 20 5b 66 69 6c 65 20 72 6f 6f 74 6e 61  int [file rootna
ca40: 6d 65 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 66  me [file tail $f
ca50: 69 6c 65 4e 61 6d 65 5d 5d 0d 0a 0d 0a 20 20 20  ileName]]....   
ca60: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
ca70: 23 20 4e 4f 54 45 3a 20 47 72 61 62 20 74 68 65  # NOTE: Grab the
ca80: 20 69 6d 61 67 65 20 72 75 6e 74 69 6d 65 20 76   image runtime v
ca90: 65 72 73 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20  ersion from the 
caa0: 61 73 73 65 6d 62 6c 79 20 62 65 63 61 75 73 65  assembly because
cab0: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
cac0: 20 20 73 65 76 65 72 61 6c 20 74 65 73 74 73 20    several tests 
cad0: 72 65 6c 79 20 6f 6e 20 69 74 20 68 61 76 69 6e  rely on it havin
cae0: 67 20 61 20 63 65 72 74 61 69 6e 20 76 61 6c 75  g a certain valu
caf0: 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  e...        #.. 
cb00: 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72         addConstr
cb10: 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73  aint [appendArgs
cb20: 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 66 69 6c   [file tail $fil
cb30: 65 4e 61 6d 65 5d 20 5f 20 5c 0d 0a 20 20 20 20  eName] _ \..    
cb40: 20 20 20 20 20 20 20 20 5b 24 61 73 73 65 6d 62          [$assemb
cb50: 6c 79 20 49 6d 61 67 65 52 75 6e 74 69 6d 65 56  ly ImageRuntimeV
cb60: 65 72 73 69 6f 6e 5d 5d 0d 0a 0d 0a 20 20 20 20  ersion]]....    
cb70: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
cb80: 20 4e 4f 54 45 3a 20 52 65 74 75 72 6e 20 74 68   NOTE: Return th
cb90: 65 20 66 75 6c 6c 20 70 61 74 68 20 6f 66 20 74  e full path of t
cba0: 68 65 20 6c 6f 61 64 65 64 20 66 69 6c 65 2e 0d  he loaded file..
cbb0: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
cbc0: 20 20 20 20 72 65 74 75 72 6e 20 24 66 69 6c 65      return $file
cbd0: 4e 61 6d 65 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d  Name..      }...
cbe0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 22 22  .      return ""
cbf0: 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
cc00: 70 72 6f 63 20 69 73 53 51 4c 69 74 65 52 65 61  proc isSQLiteRea
cc10: 64 79 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 23  dy {} {..      #
cc20: 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
cc30: 54 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 6d  This procedure m
cc40: 75 73 74 20 72 65 74 75 72 6e 20 6e 6f 6e 2d 7a  ust return non-z
cc50: 65 72 6f 20 6f 6e 6c 79 20 69 66 20 74 68 65 20  ero only if the 
cc60: 53 51 4c 69 74 65 20 6e 61 74 69 76 65 0d 0a 20  SQLite native.. 
cc70: 20 20 20 20 20 23 20 20 20 20 20 20 20 6c 69 62       #       lib
cc80: 72 61 72 79 20 61 6e 64 20 74 68 65 20 53 79 73  rary and the Sys
cc90: 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 20  tem.Data.SQLite 
cca0: 6d 61 6e 61 67 65 64 20 61 73 73 65 6d 62 6c 79  managed assembly
ccb0: 20 61 72 65 20 6c 6f 61 64 65 64 0d 0a 20 20 20   are loaded..   
ccc0: 20 20 20 23 20 20 20 20 20 20 20 61 6e 64 20 72     #       and r
ccd0: 65 61 64 79 20 66 6f 72 20 75 73 65 20 62 79 20  eady for use by 
cce0: 74 68 65 20 74 65 73 74 20 73 75 69 74 65 2e 20  the test suite. 
ccf0: 20 43 75 72 72 65 6e 74 6c 79 2c 20 74 68 69 73   Currently, this
cd00: 20 70 72 6f 63 65 64 75 72 65 0d 0a 20 20 20 20   procedure..    
cd10: 20 20 23 20 20 20 20 20 20 20 73 68 6f 75 6c 64    #       should
cd20: 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e 6c 79 20   be called only 
cd30: 61 66 74 65 72 20 74 68 65 20 5b 74 72 79 4c 6f  after the [tryLo
cd40: 61 64 41 73 73 65 6d 62 6c 79 5d 20 70 72 6f 63  adAssembly] proc
cd50: 65 64 75 72 65 20 68 61 73 0d 0a 20 20 20 20 20  edure has..     
cd60: 20 23 20 20 20 20 20 20 20 62 65 65 6e 20 63 61   #       been ca
cd70: 6c 6c 65 64 20 74 6f 20 70 72 6f 62 65 20 66 6f  lled to probe fo
cd80: 72 20 74 68 65 20 53 79 73 74 65 6d 2e 44 61 74  r the System.Dat
cd90: 61 2e 53 51 4c 69 74 65 20 6d 61 6e 61 67 65 64  a.SQLite managed
cda0: 20 61 73 73 65 6d 62 6c 79 0d 0a 20 20 20 20 20   assembly..     
cdb0: 20 23 20 20 20 20 20 20 20 61 6e 64 20 74 68 65   #       and the
cdc0: 20 5b 63 68 65 63 6b 46 6f 72 53 51 4c 69 74 65   [checkForSQLite
cdd0: 5d 20 70 72 6f 63 65 64 75 72 65 20 68 61 73 20  ] procedure has 
cde0: 62 65 65 6e 20 63 61 6c 6c 65 64 20 74 6f 20 70  been called to p
cdf0: 72 6f 62 65 20 66 6f 72 0d 0a 20 20 20 20 20 20  robe for..      
ce00: 23 20 20 20 20 20 20 20 74 68 65 20 53 51 4c 69  #       the SQLi
ce10: 74 65 20 6e 61 74 69 76 65 20 6c 69 62 72 61 72  te native librar
ce20: 79 3b 20 6f 74 68 65 72 77 69 73 65 2c 20 74 68  y; otherwise, th
ce30: 69 73 20 70 72 6f 63 65 64 75 72 65 20 77 69 6c  is procedure wil
ce40: 6c 20 73 69 6d 70 6c 79 0d 0a 20 20 20 20 20 20  l simply..      
ce50: 23 20 20 20 20 20 20 20 61 6c 77 61 79 73 20 72  #       always r
ce60: 65 74 75 72 6e 20 7a 65 72 6f 2e 0d 0a 20 20 20  eturn zero...   
ce70: 20 20 20 23 0d 0a 20 20 20 20 20 20 72 65 74 75     #..      retu
ce80: 72 6e 20 5b 65 78 70 72 20 7b 0d 0a 20 20 20 20  rn [expr {..    
ce90: 20 20 20 20 5b 68 61 76 65 43 6f 6e 73 74 72 61      [haveConstra
cea0: 69 6e 74 20 53 79 73 74 65 6d 2e 44 61 74 61 2e  int System.Data.
ceb0: 53 51 4c 69 74 65 5d 20 26 26 20 5b 68 61 76 65  SQLite] && [have
cec0: 43 6f 6e 73 74 72 61 69 6e 74 20 53 51 4c 69 74  Constraint SQLit
ced0: 65 5d 0d 0a 20 20 20 20 20 20 7d 5d 0d 0a 20 20  e]..      }]..  
cee0: 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
cef0: 20 6d 61 74 63 68 50 6c 61 74 66 6f 72 6d 20 7b   matchPlatform {
cf00: 20 70 6c 61 74 66 6f 72 6d 20 7d 20 7b 0d 0a 20   platform } {.. 
cf10: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
cf20: 4e 4f 54 45 3a 20 41 6e 20 65 6d 70 74 79 20 73  NOTE: An empty s
cf30: 74 72 69 6e 67 20 66 6f 72 20 74 68 65 20 70 6c  tring for the pl
cf40: 61 74 66 6f 72 6d 20 6d 65 61 6e 73 20 74 68 61  atform means tha
cf50: 74 20 74 68 65 20 62 75 69 6c 64 20 69 73 20 6e  t the build is n
cf60: 6f 74 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  ot..      #     
cf70: 20 20 5b 70 72 69 6d 61 72 69 6c 79 5d 20 61 20    [primarily] a 
cf80: 6e 61 74 69 76 65 20 62 75 69 6c 64 3b 20 74 68  native build; th
cf90: 65 72 65 66 6f 72 65 2c 20 69 74 20 61 6c 77 61  erefore, it alwa
cfa0: 79 73 20 6d 61 74 63 68 65 73 2e 0d 0a 20 20 20  ys matches...   
cfb0: 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
cfc0: 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
cfd0: 70 6c 61 74 66 6f 72 6d 5d 20 3d 3d 20 30 7d 20  platform] == 0} 
cfe0: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
cff0: 72 65 74 75 72 6e 20 74 72 75 65 0d 0a 20 20 20  return true..   
d000: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d     }....      #.
d010: 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49  .      # NOTE: I
d020: 66 20 74 68 65 20 6d 61 63 68 69 6e 65 20 6e 61  f the machine na
d030: 6d 65 20 69 73 20 75 6e 61 76 61 69 6c 61 62 6c  me is unavailabl
d040: 65 2c 20 74 68 65 72 65 20 69 73 20 6e 6f 74 68  e, there is noth
d050: 69 67 6e 20 65 6c 73 65 20 77 65 0d 0a 20 20 20  ign else we..   
d060: 20 20 20 23 20 20 20 20 20 20 20 63 61 6e 20 64     #       can d
d070: 6f 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  o...      #..   
d080: 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78     if {![info ex
d090: 69 73 74 73 20 3a 3a 74 63 6c 5f 70 6c 61 74 66  ists ::tcl_platf
d0a0: 6f 72 6d 28 6d 61 63 68 69 6e 65 29 5d 7d 20 74  orm(machine)]} t
d0b0: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 72  hen {..        r
d0c0: 65 74 75 72 6e 20 66 61 6c 73 65 0d 0a 20 20 20  eturn false..   
d0d0: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d     }....      #.
d0e0: 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 44  .      # NOTE: D
d0f0: 6f 65 73 20 74 68 65 20 73 70 65 63 69 66 69 65  oes the specifie
d100: 64 20 70 6c 61 74 66 6f 72 6d 20 6d 61 74 63 68  d platform match
d110: 20 75 70 20 74 6f 20 74 68 65 20 63 75 72 72 65   up to the curre
d120: 6e 74 20 70 72 6f 63 65 73 73 3f 0d 0a 20 20 20  nt process?..   
d130: 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
d140: 24 70 6c 61 74 66 6f 72 6d 20 65 71 20 5b 6d 61  $platform eq [ma
d150: 63 68 69 6e 65 54 6f 50 6c 61 74 66 6f 72 6d 20  chineToPlatform 
d160: 24 3a 3a 74 63 6c 5f 70 6c 61 74 66 6f 72 6d 28  $::tcl_platform(
d170: 6d 61 63 68 69 6e 65 29 5d 7d 20 74 68 65 6e 20  machine)]} then 
d180: 7b 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  {..        retur
d190: 6e 20 74 72 75 65 0d 0a 20 20 20 20 20 20 7d 0d  n true..      }.
d1a0: 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
d1b0: 20 20 23 20 4e 4f 54 45 3a 20 54 68 65 20 73 70    # NOTE: The sp
d1c0: 65 63 69 66 69 65 64 20 70 6c 61 74 66 6f 72 6d  ecified platform
d1d0: 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20   does not match 
d1e0: 75 70 20 77 69 74 68 20 74 68 65 20 70 6c 61 74  up with the plat
d1f0: 66 6f 72 6d 0d 0a 20 20 20 20 20 20 23 20 20 20  form..      #   
d200: 20 20 20 20 66 6f 72 20 74 68 65 20 63 75 72 72      for the curr
d210: 65 6e 74 20 70 72 6f 63 65 73 73 2e 0d 0a 20 20  ent process...  
d220: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 72 65 74      #..      ret
d230: 75 72 6e 20 66 61 6c 73 65 0d 0a 20 20 20 20 7d  urn false..    }
d240: 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 68 61  .....    proc ha
d250: 76 65 53 51 4c 69 74 65 4f 62 6a 65 63 74 43 6f  veSQLiteObjectCo
d260: 6d 6d 61 6e 64 20 7b 7d 20 7b 0d 0a 20 20 20 20  mmand {} {..    
d270: 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
d280: 45 3a 20 49 73 20 74 68 65 20 5b 6f 62 6a 65 63  E: Is the [objec
d290: 74 5d 20 63 6f 6d 6d 61 6e 64 20 63 75 72 72 65  t] command curre
d2a0: 6e 74 6c 79 20 61 76 61 69 6c 61 62 6c 65 3f 0d  ntly available?.
d2b0: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
d2c0: 72 65 74 75 72 6e 20 5b 65 78 70 72 20 7b 5b 6c  return [expr {[l
d2d0: 6c 65 6e 67 74 68 20 5b 69 6e 66 6f 20 63 6f 6d  length [info com
d2e0: 6d 61 6e 64 73 20 6f 62 6a 65 63 74 5d 5d 20 3e  mands object]] >
d2f0: 20 30 7d 5d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a   0}]..    }.....
d300: 20 20 20 20 70 72 6f 63 20 63 68 65 63 6b 46 6f      proc checkFo
d310: 72 53 51 4c 69 74 65 4f 62 6a 65 63 74 43 6f 6d  rSQLiteObjectCom
d320: 6d 61 6e 64 20 7b 20 63 68 61 6e 6e 65 6c 20 7d  mand { channel }
d330: 20 7b 0d 0a 20 20 20 20 20 20 74 70 75 74 73 20   {..      tputs 
d340: 24 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 63  $channel "---- c
d350: 68 65 63 6b 69 6e 67 20 66 6f 72 20 5c 22 6f 62  hecking for \"ob
d360: 6a 65 63 74 5c 22 20 63 6f 6d 6d 61 6e 64 20 75  ject\" command u
d370: 73 61 67 65 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20  sage... "....   
d380: 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78     if {![info ex
d390: 69 73 74 73 20 3a 3a 6e 6f 28 73 71 6c 69 74 65  ists ::no(sqlite
d3a0: 4f 62 6a 65 63 74 43 6f 6d 6d 61 6e 64 29 5d 20  ObjectCommand)] 
d3b0: 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  && \..          
d3c0: 5b 68 61 76 65 53 51 4c 69 74 65 4f 62 6a 65 63  [haveSQLiteObjec
d3d0: 74 43 6f 6d 6d 61 6e 64 5d 7d 20 74 68 65 6e 20  tCommand]} then 
d3e0: 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73  {..        tputs
d3f0: 20 24 63 68 61 6e 6e 65 6c 20 79 65 73 5c 6e 0d   $channel yes\n.
d400: 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d  .      } else {.
d410: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
d420: 20 20 20 20 23 20 4e 4f 54 45 3a 20 55 6e 6c 65      # NOTE: Unle
d430: 73 73 20 77 65 20 61 72 65 20 66 6f 72 62 69 64  ss we are forbid
d440: 64 65 6e 20 66 72 6f 6d 20 64 6f 69 6e 67 20 73  den from doing s
d450: 6f 2c 20 61 64 64 20 73 6f 6d 65 20 63 6f 6e 73  o, add some cons
d460: 74 72 61 69 6e 74 73 0d 0a 20 20 20 20 20 20 20  traints..       
d470: 20 23 20 20 20 20 20 20 20 74 68 61 74 20 77 69   #       that wi
d480: 6c 6c 20 61 6c 6c 6f 77 20 6d 6f 73 74 20 6f 66  ll allow most of
d490: 20 74 68 65 20 74 65 73 74 20 73 75 69 74 65 20   the test suite 
d4a0: 74 6f 20 72 75 6e 20 28 69 2e 65 2e 20 74 68 6f  to run (i.e. tho
d4b0: 73 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  se..        #   
d4c0: 20 20 20 20 74 65 73 74 73 20 74 68 61 74 20 64      tests that d
d4d0: 6f 20 6e 6f 74 20 64 69 72 65 63 74 6c 79 20 72  o not directly r
d4e0: 65 6c 79 20 75 70 6f 6e 20 74 68 65 20 5b 6f 62  ely upon the [ob
d4f0: 6a 65 63 74 5d 20 63 6f 6d 6d 61 6e 64 29 2e 0d  ject] command)..
d500: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
d510: 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65      if {![info e
d520: 78 69 73 74 73 20 3a 3a 6e 6f 28 73 68 69 6d 53  xists ::no(shimS
d530: 51 4c 69 74 65 41 73 73 65 6d 62 6c 79 43 6f 6e  QLiteAssemblyCon
d540: 73 74 72 61 69 6e 74 73 29 5d 7d 20 74 68 65 6e  straints)]} then
d550: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 61 64   {..          ad
d560: 64 43 6f 6e 73 74 72 61 69 6e 74 20 53 51 4c 69  dConstraint SQLi
d570: 74 65 0d 0a 20 20 20 20 20 20 20 20 20 20 61 64  te..          ad
d580: 64 43 6f 6e 73 74 72 61 69 6e 74 20 53 51 4c 69  dConstraint SQLi
d590: 74 65 49 6e 74 65 72 6f 70 0d 0a 20 20 20 20 20  teInterop..     
d5a0: 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69       addConstrai
d5b0: 6e 74 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53  nt System.Data.S
d5c0: 51 4c 69 74 65 0d 0a 20 20 20 20 20 20 20 20 20  QLite..         
d5d0: 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 53   addConstraint S
d5e0: 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
d5f0: 65 2e 45 6e 63 72 79 70 74 69 6f 6e 0d 0a 20 20  e.Encryption..  
d600: 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74          addConst
d610: 72 61 69 6e 74 20 53 79 73 74 65 6d 2e 44 61 74  raint System.Dat
d620: 61 2e 53 51 4c 69 74 65 2e 4c 69 6e 71 0d 0a 0d  a.SQLite.Linq...
d630: 0a 20 20 20 20 20 20 20 20 20 20 61 64 64 43 6f  .          addCo
d640: 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64  nstraint [append
d650: 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
d660: 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74        System.Dat
d670: 61 2e 53 51 4c 69 74 65 2e 64 6c 6c 5f 76 20 5b  a.SQLite.dll_v [
d680: 67 65 74 42 75 69 6c 64 43 6c 72 56 65 72 73 69  getBuildClrVersi
d690: 6f 6e 5d 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d  on]]..        }.
d6a0: 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21  ...        if {!
d6b0: 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e  [info exists ::n
d6c0: 6f 28 73 68 69 6d 53 51 4c 69 74 65 44 65 66 69  o(shimSQLiteDefi
d6d0: 6e 65 43 6f 6e 73 74 61 6e 74 43 6f 6e 73 74 72  neConstantConstr
d6e0: 61 69 6e 74 73 29 5d 7d 20 74 68 65 6e 20 7b 0d  aints)]} then {.
d6f0: 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 65 61  .          forea
d700: 63 68 20 64 65 66 69 6e 65 43 6f 6e 73 74 61 6e  ch defineConstan
d710: 74 20 5b 6c 69 73 74 20 5c 0d 0a 20 20 20 20 20  t [list \..     
d720: 20 20 20 20 20 20 20 20 20 49 4e 54 45 52 4f 50           INTEROP
d730: 5f 45 58 54 45 4e 53 49 4f 4e 5f 46 55 4e 43 54  _EXTENSION_FUNCT
d740: 49 4f 4e 53 20 49 4e 54 45 52 4f 50 5f 46 54 53  IONS INTEROP_FTS
d750: 35 5f 45 58 54 45 4e 53 49 4f 4e 20 5c 0d 0a 20  5_EXTENSION \.. 
d760: 20 20 20 20 20 20 20 20 20 20 20 20 20 49 4e 54               INT
d770: 45 52 4f 50 5f 4a 53 4f 4e 31 5f 45 58 54 45 4e  EROP_JSON1_EXTEN
d780: 53 49 4f 4e 20 49 4e 54 45 52 4f 50 5f 50 45 52  SION INTEROP_PER
d790: 43 45 4e 54 49 4c 45 5f 45 58 54 45 4e 53 49 4f  CENTILE_EXTENSIO
d7a0: 4e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  N \..           
d7b0: 20 20 20 49 4e 54 45 52 4f 50 5f 52 45 47 45 58     INTEROP_REGEX
d7c0: 50 5f 45 58 54 45 4e 53 49 4f 4e 20 49 4e 54 45  P_EXTENSION INTE
d7d0: 52 4f 50 5f 54 45 53 54 5f 45 58 54 45 4e 53 49  ROP_TEST_EXTENSI
d7e0: 4f 4e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  ON \..          
d7f0: 20 20 20 20 49 4e 54 45 52 4f 50 5f 53 48 41 31      INTEROP_SHA1
d800: 5f 45 58 54 45 4e 53 49 4f 4e 20 49 4e 54 45 52  _EXTENSION INTER
d810: 4f 50 5f 54 4f 54 59 50 45 5f 45 58 54 45 4e 53  OP_TOTYPE_EXTENS
d820: 49 4f 4e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ION \..         
d830: 20 20 20 20 20 49 4e 54 45 52 4f 50 5f 56 49 52       INTEROP_VIR
d840: 54 55 41 4c 5f 54 41 42 4c 45 20 55 53 45 5f 49  TUAL_TABLE USE_I
d850: 4e 54 45 52 4f 50 5f 44 4c 4c 5d 20 7b 0d 0a 20  NTEROP_DLL] {.. 
d860: 20 20 20 20 20 20 20 20 20 20 20 61 64 64 43 6f             addCo
d870: 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64  nstraint [append
d880: 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
d890: 20 20 20 20 20 20 20 20 5b 67 65 74 53 51 4c 69          [getSQLi
d8a0: 74 65 44 65 66 69 6e 65 43 6f 6e 73 74 61 6e 74  teDefineConstant
d8b0: 50 72 65 66 69 78 5d 20 24 64 65 66 69 6e 65 43  Prefix] $defineC
d8c0: 6f 6e 73 74 61 6e 74 5d 0d 0a 20 20 20 20 20 20  onstant]..      
d8d0: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d      }..        }
d8e0: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b  ....        if {
d8f0: 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  ![info exists ::
d900: 6e 6f 28 73 68 69 6d 53 51 4c 69 74 65 56 69 73  no(shimSQLiteVis
d910: 75 61 6c 53 74 75 64 69 6f 43 6f 6e 73 74 72 61  ualStudioConstra
d920: 69 6e 74 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a  ints)]} then {..
d930: 20 20 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e            addCon
d940: 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41  straint [appendA
d950: 72 67 73 20 76 69 73 75 61 6c 53 74 75 64 69 6f  rgs visualStudio
d960: 20 5b 67 65 74 42 75 69 6c 64 59 65 61 72 5d 5d   [getBuildYear]]
d970: 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  ..        }.... 
d980: 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
d990: 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d 0a 20 20 20 20  annel no\n..    
d9a0: 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20    }..    }..... 
d9b0: 20 20 20 70 72 6f 63 20 63 68 61 6e 67 65 4e 61     proc changeNa
d9c0: 74 69 76 65 52 75 6e 74 69 6d 65 4f 70 74 69 6f  tiveRuntimeOptio
d9d0: 6e 20 7b 20 6e 61 74 69 76 65 20 7d 20 7b 0d 0a  n { native } {..
d9e0: 20 20 20 20 20 20 69 66 20 7b 5b 6c 6c 65 6e 67        if {[lleng
d9f0: 74 68 20 5b 69 6e 66 6f 20 63 6f 6d 6d 61 6e 64  th [info command
da00: 73 20 64 65 62 75 67 5d 5d 20 3e 20 30 20 26 26  s debug]] > 0 &&
da10: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 6c   \..          [l
da20: 6c 65 6e 67 74 68 20 5b 69 6e 66 6f 20 73 75 62  length [info sub
da30: 63 6f 6d 6d 61 6e 64 73 20 64 65 62 75 67 20 72  commands debug r
da40: 75 6e 74 69 6d 65 6f 70 74 69 6f 6e 5d 5d 20 3e  untimeoption]] >
da50: 20 30 20 26 26 20 5b 63 61 74 63 68 20 7b 0d 0a   0 && [catch {..
da60: 20 20 20 20 20 20 20 20 64 65 62 75 67 20 72 75          debug ru
da70: 6e 74 69 6d 65 6f 70 74 69 6f 6e 20 5b 65 78 70  ntimeoption [exp
da80: 72 20 7b 24 6e 61 74 69 76 65 20 3f 20 22 61 64  r {$native ? "ad
da90: 64 22 20 3a 20 22 72 65 6d 6f 76 65 22 7d 5d 20  d" : "remove"}] 
daa0: 6e 61 74 69 76 65 0d 0a 20 20 20 20 20 20 7d 5d  native..      }]
dab0: 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20   == 0} then {.. 
dac0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 72         return tr
dad0: 75 65 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  ue..      }.... 
dae0: 20 20 20 20 20 69 66 20 7b 5b 68 61 76 65 53 51       if {[haveSQ
daf0: 4c 69 74 65 4f 62 6a 65 63 74 43 6f 6d 6d 61 6e  LiteObjectComman
db00: 64 5d 20 26 26 20 5b 63 61 74 63 68 20 7b 0d 0a  d] && [catch {..
db10: 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69          object i
db20: 6e 76 6f 6b 65 20 49 6e 74 65 72 70 72 65 74 65  nvoke Interprete
db30: 72 2e 47 65 74 41 63 74 69 76 65 20 5b 65 78 70  r.GetActive [exp
db40: 72 20 7b 24 6e 61 74 69 76 65 20 3f 20 5c 0d 0a  r {$native ? \..
db50: 20 20 20 20 20 20 20 20 20 20 20 20 22 41 64 64              "Add
db60: 52 75 6e 74 69 6d 65 4f 70 74 69 6f 6e 22 20 3a  RuntimeOption" :
db70: 20 22 52 65 6d 6f 76 65 52 75 6e 74 69 6d 65 4f   "RemoveRuntimeO
db80: 70 74 69 6f 6e 22 7d 5d 20 6e 61 74 69 76 65 0d  ption"}] native.
db90: 0a 20 20 20 20 20 20 7d 5d 20 3d 3d 20 30 7d 20  .      }] == 0} 
dba0: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
dbb0: 72 65 74 75 72 6e 20 74 72 75 65 0d 0a 20 20 20  return true..   
dbc0: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65     }....      re
dbd0: 74 75 72 6e 20 66 61 6c 73 65 0d 0a 20 20 20 20  turn false..    
dbe0: 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 63  }.....    proc c
dbf0: 68 65 63 6b 46 6f 72 53 51 4c 69 74 65 42 75 69  heckForSQLiteBui
dc00: 6c 64 73 20 7b 20 63 68 61 6e 6e 65 6c 20 7b 73  lds { channel {s
dc10: 65 6c 65 63 74 20 66 61 6c 73 65 7d 20 7d 20 7b  elect false} } {
dc20: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
dc30: 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 66   # NOTE: Check f
dc40: 6f 72 20 65 76 65 72 79 20 70 6f 73 73 69 62 6c  or every possibl
dc50: 65 20 76 61 6c 69 64 20 63 6f 6d 62 69 6e 61 74  e valid combinat
dc60: 69 6f 6e 20 6f 66 20 76 61 6c 75 65 73 20 75 73  ion of values us
dc70: 65 64 20 77 68 65 6e 0d 0a 20 20 20 20 20 20 23  ed when..      #
dc80: 20 20 20 20 20 20 20 6c 6f 63 61 74 69 6e 67 20         locating 
dc90: 6f 75 74 20 74 68 65 20 62 75 69 6c 64 20 6f 75  out the build ou
dca0: 74 70 75 74 20 64 69 72 65 63 74 6f 72 79 2c 20  tput directory, 
dcb0: 73 68 6f 77 69 6e 67 20 65 61 63 68 20 61 76 61  showing each ava
dcc0: 69 6c 61 62 6c 65 0d 0a 20 20 20 20 20 20 23 20  ilable..      # 
dcd0: 20 20 20 20 20 20 62 75 69 6c 64 20 76 61 72 69        build vari
dce0: 61 74 69 6f 6e 20 61 6c 6f 6e 67 20 74 68 65 20  ation along the 
dcf0: 77 61 79 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  way...      #.. 
dd00: 20 20 20 20 20 66 6f 72 65 61 63 68 20 6e 61 74       foreach nat
dd10: 69 76 65 20 5b 6c 69 73 74 20 66 61 6c 73 65 20  ive [list false 
dd20: 74 72 75 65 5d 20 7b 0d 0a 20 20 20 20 20 20 20  true] {..       
dd30: 20 66 6f 72 65 61 63 68 20 79 65 61 72 20 5b 67   foreach year [g
dd40: 65 74 42 75 69 6c 64 59 65 61 72 73 5d 20 7b 0d  etBuildYears] {.
dd50: 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 65 61  .          forea
dd60: 63 68 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  ch configuration
dd70: 20 5b 67 65 74 42 75 69 6c 64 43 6f 6e 66 69 67   [getBuildConfig
dd80: 75 72 61 74 69 6f 6e 73 5d 20 7b 0d 0a 20 20 20  urations] {..   
dd90: 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
dda0: 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
ddb0: 46 69 67 75 72 65 20 6f 75 74 20 74 68 65 20 65  Figure out the e
ddc0: 66 66 65 63 74 69 76 65 20 62 75 69 6c 64 20 70  ffective build p
ddd0: 6c 61 74 66 6f 72 6d 2e 20 20 54 68 69 73 20 69  latform.  This i
dde0: 73 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23  s..            #
ddf0: 20 20 20 20 20 20 20 62 61 73 65 64 20 6f 6e 20         based on 
de00: 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 61  whether or not a
de10: 20 5b 70 72 69 6d 61 72 69 6c 79 5d 20 6e 61 74   [primarily] nat
de20: 69 76 65 20 62 75 69 6c 64 0d 0a 20 20 20 20 20  ive build..     
de30: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 69         #       i
de40: 73 20 62 65 69 6e 67 20 75 73 65 64 2e 20 20 46  s being used.  F
de50: 6f 72 20 5b 70 72 69 6d 61 72 69 6c 79 5d 20 6e  or [primarily] n
de60: 6f 6e 2d 6e 61 74 69 76 65 20 62 75 69 6c 64 73  on-native builds
de70: 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23  ,..            #
de80: 20 20 20 20 20 20 20 74 68 69 73 20 77 69 6c 6c         this will
de90: 20 62 65 20 61 6e 20 65 6d 70 74 79 20 73 74 72   be an empty str
dea0: 69 6e 67 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  ing...          
deb0: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20    #..           
dec0: 20 73 65 74 20 70 6c 61 74 66 6f 72 6d 20 5b 67   set platform [g
ded0: 65 74 42 75 69 6c 64 50 6c 61 74 66 6f 72 6d 20  etBuildPlatform 
dee0: 24 6e 61 74 69 76 65 5d 0d 0a 0d 0a 20 20 20 20  $native]....    
def0: 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
df00: 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
df10: 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
df20: 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 68 65 63        "---- chec
df30: 6b 69 6e 67 20 66 6f 72 20 53 79 73 74 65 6d 2e  king for System.
df40: 44 61 74 61 2e 53 51 4c 69 74 65 20 62 75 69 6c  Data.SQLite buil
df50: 64 20 5c 22 22 20 5b 65 78 70 72 20 5c 0d 0a 20  d \"" [expr \.. 
df60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b                 {
df70: 24 6e 61 74 69 76 65 20 3f 20 22 6e 61 74 69 76  $native ? "nativ
df80: 65 2f 22 20 3a 20 22 22 7d 5d 20 5b 65 78 70 72  e/" : ""}] [expr
df90: 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68   {[string length
dfa0: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
dfb0: 20 20 20 20 24 70 6c 61 74 66 6f 72 6d 5d 20 3e      $platform] >
dfc0: 20 30 20 3f 20 5b 61 70 70 65 6e 64 41 72 67 73   0 ? [appendArgs
dfd0: 20 24 70 6c 61 74 66 6f 72 6d 20 2f 5d 20 3a 20   $platform /] : 
dfe0: 22 22 7d 5d 20 24 79 65 61 72 20 5c 0d 0a 20 20  ""}] $year \..  
dff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 20                / 
e000: 24 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 22  $configuration "
e010: 5c 22 2e 2e 2e 20 22 5d 0d 0a 0d 0a 20 20 20 20  \"... "]....    
e020: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
e030: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 42         # NOTE: B
e040: 75 69 6c 64 20 74 68 65 20 66 75 6c 6c 79 20 71  uild the fully q
e050: 75 61 6c 69 66 69 65 64 20 64 69 72 65 63 74 6f  ualified directo
e060: 72 79 20 77 68 65 72 65 20 74 68 65 20 6e 65 63  ry where the nec
e070: 65 73 73 61 72 79 0d 0a 20 20 20 20 20 20 20 20  essary..        
e080: 20 20 20 20 23 20 20 20 20 20 20 20 63 6f 6d 70      #       comp
e090: 6f 6e 65 6e 74 73 20 66 6f 72 20 53 79 73 74 65  onents for Syste
e0a0: 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 20 73 68  m.Data.SQLite sh
e0b0: 6f 75 6c 64 20 62 65 20 66 6f 75 6e 64 2e 0d 0a  ould be found...
e0c0: 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20              #.. 
e0d0: 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20 64             set d
e0e0: 69 72 65 63 74 6f 72 79 20 5b 6a 6f 69 6e 42 75  irectory [joinBu
e0f0: 69 6c 64 44 69 72 65 63 74 6f 72 79 20 24 6e 61  ildDirectory $na
e100: 74 69 76 65 20 5c 0d 0a 20 20 20 20 20 20 20 20  tive \..        
e110: 20 20 20 20 20 20 20 20 5b 67 65 74 42 75 69 6c          [getBuil
e120: 64 42 61 73 65 44 69 72 65 63 74 6f 72 79 5d 20  dBaseDirectory] 
e130: 24 79 65 61 72 20 24 70 6c 61 74 66 6f 72 6d 20  $year $platform 
e140: 24 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 5d 0d  $configuration].
e150: 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23  ...            #
e160: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 20  ..            # 
e170: 4e 4f 54 45 3a 20 44 6f 20 74 68 65 20 6e 65 63  NOTE: Do the nec
e180: 65 73 73 61 72 79 20 66 69 6c 65 73 20 65 78 69  essary files exi
e190: 73 74 3f 20 20 43 75 72 72 65 6e 74 6c 79 2c 20  st?  Currently, 
e1a0: 6e 6f 20 6f 74 68 65 72 20 73 74 65 70 73 0d 0a  no other steps..
e1b0: 20 20 20 20 20 20 20 20 20 20 20 20 23 20 20 20              #   
e1c0: 20 20 20 20 61 72 65 20 74 61 6b 65 6e 20 74 6f      are taken to
e1d0: 20 76 65 72 69 66 79 20 74 68 69 73 20 62 75 69   verify this bui
e1e0: 6c 64 20 69 73 20 61 63 74 75 61 6c 6c 79 20 76  ld is actually v
e1f0: 69 61 62 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20  iable...        
e200: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
e210: 20 20 20 69 66 20 7b 5b 69 73 42 75 69 6c 64 41     if {[isBuildA
e220: 76 61 69 6c 61 62 6c 65 20 24 6e 61 74 69 76 65  vailable $native
e230: 20 24 64 69 72 65 63 74 6f 72 79 5d 7d 20 74 68   $directory]} th
e240: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
e250: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
e260: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 57 68 65       # NOTE: Whe
e270: 6e 20 69 6e 20 22 73 65 6c 65 63 74 22 20 6d 6f  n in "select" mo
e280: 64 65 2c 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  de, automaticall
e290: 79 20 73 65 6c 65 63 74 20 74 68 65 20 66 69 72  y select the fir
e2a0: 73 74 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  st..            
e2b0: 20 20 23 20 20 20 20 20 20 20 61 76 61 69 6c 61    #       availa
e2c0: 62 6c 65 20 62 75 69 6c 64 20 6f 66 20 53 79 73  ble build of Sys
e2d0: 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 20  tem.Data.SQLite 
e2e0: 61 6e 64 20 74 68 65 6e 20 72 65 74 75 72 6e 0d  and then return.
e2f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23  .              #
e300: 20 20 20 20 20 20 20 69 6d 6d 65 64 69 61 74 65         immediate
e310: 6c 79 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ly...           
e320: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
e330: 20 20 20 20 69 66 20 7b 24 73 65 6c 65 63 74 20      if {$select 
e340: 26 26 20 5b 6d 61 74 63 68 50 6c 61 74 66 6f 72  && [matchPlatfor
e350: 6d 20 24 70 6c 61 74 66 6f 72 6d 5d 7d 20 74 68  m $platform]} th
e360: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
e370: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
e380: 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a           # NOTE:
e390: 20 4d 61 6e 75 61 6c 6c 79 20 6f 76 65 72 72 69   Manually overri
e3a0: 64 65 20 61 6c 6c 20 74 68 65 20 62 75 69 6c 64  de all the build
e3b0: 20 64 69 72 65 63 74 6f 72 79 20 73 65 6c 65 63   directory selec
e3c0: 74 69 6f 6e 0d 0a 20 20 20 20 20 20 20 20 20 20  tion..          
e3d0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 72 65        #       re
e3e0: 6c 61 74 65 64 20 74 65 73 74 20 73 65 74 74 69  lated test setti
e3f0: 6e 67 73 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ngs in order to 
e400: 66 6f 72 63 65 20 74 68 69 73 20 62 75 69 6c 64  force this build
e410: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
e420: 20 20 23 20 20 20 20 20 20 20 6f 66 20 53 79 73    #       of Sys
e430: 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 20  tem.Data.SQLite 
e440: 74 6f 20 62 65 20 75 73 65 64 2e 0d 0a 20 20 20  to be used...   
e450: 20 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a               #..
e460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e470: 69 66 20 7b 21 5b 63 68 61 6e 67 65 4e 61 74 69  if {![changeNati
e480: 76 65 52 75 6e 74 69 6d 65 4f 70 74 69 6f 6e 20  veRuntimeOption 
e490: 24 6e 61 74 69 76 65 5d 7d 20 74 68 65 6e 20 7b  $native]} then {
e4a0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
e4b0: 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
e4c0: 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
e4d0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
e4e0: 20 20 20 20 20 20 20 20 22 6e 6f 2c 20 66 61 69          "no, fai
e4f0: 6c 65 64 20 74 6f 20 22 20 5b 65 78 70 72 20 7b  led to " [expr {
e500: 24 6e 61 74 69 76 65 20 3f 20 22 61 64 64 22 20  $native ? "add" 
e510: 3a 20 22 72 65 6d 6f 76 65 22 7d 5d 20 5c 0d 0a  : "remove"}] \..
e520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e530: 20 20 20 20 20 20 22 20 74 68 65 20 5c 22 6e 61        " the \"na
e540: 74 69 76 65 5c 22 20 72 75 6e 74 69 6d 65 20 6f  tive\" runtime o
e550: 70 74 69 6f 6e 5c 6e 22 5d 0d 0a 0d 0a 20 20 20  ption\n"]....   
e560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
e570: 65 74 75 72 6e 20 66 61 6c 73 65 0d 0a 20 20 20  eturn false..   
e580: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a               }..
e590: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
e5a0: 20 20 73 65 74 20 3a 3a 74 65 73 74 5f 79 65 61    set ::test_yea
e5b0: 72 20 24 79 65 61 72 0d 0a 20 20 20 20 20 20 20  r $year..       
e5c0: 20 20 20 20 20 20 20 20 20 73 65 74 20 3a 3a 74           set ::t
e5d0: 65 73 74 5f 70 6c 61 74 66 6f 72 6d 20 24 70 6c  est_platform $pl
e5e0: 61 74 66 6f 72 6d 0d 0a 20 20 20 20 20 20 20 20  atform..        
e5f0: 20 20 20 20 20 20 20 20 73 65 74 20 3a 3a 74 65          set ::te
e600: 73 74 5f 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  st_configuration
e610: 20 24 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 0d   $configuration.
e620: 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
e630: 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
e640: 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
e650: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
e660: 20 20 20 20 20 22 79 65 73 2c 20 73 65 6c 65 63       "yes, selec
e670: 74 65 64 20 28 22 20 5b 65 78 70 72 20 7b 24 6e  ted (" [expr {$n
e680: 61 74 69 76 65 20 3f 20 22 6e 61 74 69 76 65 2f  ative ? "native/
e690: 22 20 3a 20 22 22 7d 5d 20 5c 0d 0a 20 20 20 20  " : ""}] \..    
e6a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e6b0: 5b 65 78 70 72 20 7b 5b 73 74 72 69 6e 67 20 6c  [expr {[string l
e6c0: 65 6e 67 74 68 20 24 70 6c 61 74 66 6f 72 6d 5d  ength $platform]
e6d0: 20 3e 20 30 20 3f 20 5b 61 70 70 65 6e 64 41 72   > 0 ? [appendAr
e6e0: 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
e6f0: 20 20 20 20 20 20 20 20 20 20 24 70 6c 61 74 66            $platf
e700: 6f 72 6d 20 2f 5d 20 3a 20 22 22 7d 5d 20 24 79  orm /] : ""}] $y
e710: 65 61 72 20 2f 20 24 63 6f 6e 66 69 67 75 72 61  ear / $configura
e720: 74 69 6f 6e 20 22 29 5c 6e 22 5d 0d 0a 0d 0a 20  tion ")\n"].... 
e730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
e740: 65 74 75 72 6e 20 74 72 75 65 0d 0a 20 20 20 20  eturn true..    
e750: 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65            } else
e760: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
e770: 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
e780: 65 6c 20 79 65 73 5c 6e 0d 0a 20 20 20 20 20 20  el yes\n..      
e790: 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
e7a0: 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d         } else {.
e7b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74  .              t
e7c0: 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 6e 6f  puts $channel no
e7d0: 5c 6e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  \n..            
e7e0: 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  }..          }..
e7f0: 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
e800: 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65 74 75   }....      retu
e810: 72 6e 20 66 61 6c 73 65 0d 0a 20 20 20 20 7d 0d  rn false..    }.
e820: 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 63 68 65  ....    proc che
e830: 63 6b 46 6f 72 53 51 4c 69 74 65 52 65 6c 65 61  ckForSQLiteRelea
e840: 73 65 73 20 7b 20 63 68 61 6e 6e 65 6c 20 7b 73  ses { channel {s
e850: 65 6c 65 63 74 20 66 61 6c 73 65 7d 20 7d 20 7b  elect false} } {
e860: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
e870: 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 66   # NOTE: Check f
e880: 6f 72 20 70 61 73 74 20 72 65 6c 65 61 73 65 73  or past releases
e890: 20 6f 66 20 53 79 73 74 65 6d 2e 44 61 74 61 2e   of System.Data.
e8a0: 53 51 4c 69 74 65 20 69 6e 20 74 68 65 20 64 69  SQLite in the di
e8b0: 72 65 63 74 6f 72 79 0d 0a 20 20 20 20 20 20 23  rectory..      #
e8c0: 20 20 20 20 20 20 20 63 6f 6e 74 61 69 6e 65 64         contained
e8d0: 20 69 6e 20 74 68 65 20 22 53 79 73 74 65 6d 2e   in the "System.
e8e0: 44 61 74 61 2e 53 51 4c 69 74 65 22 20 65 6e 76  Data.SQLite" env
e8f0: 69 72 6f 6e 6d 65 6e 74 20 76 61 72 69 61 62 6c  ironment variabl
e900: 65 2c 20 69 66 0d 0a 20 20 20 20 20 20 23 20 20  e, if..      #  
e910: 20 20 20 20 20 70 72 65 73 65 6e 74 2e 0d 0a 20       present... 
e920: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66       #..      if
e930: 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a   {[info exists :
e940: 3a 65 6e 76 28 53 79 73 74 65 6d 2e 44 61 74 61  :env(System.Data
e950: 2e 53 51 4c 69 74 65 29 5d 20 26 26 20 5c 0d 0a  .SQLite)] && \..
e960: 20 20 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e            [strin
e970: 67 20 6c 65 6e 67 74 68 20 24 3a 3a 65 6e 76 28  g length $::env(
e980: 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
e990: 74 65 29 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b  te)] > 0} then {
e9a0: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
e9b0: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 42 75 69       # NOTE: Bui
e9c0: 6c 64 20 74 68 65 20 66 75 6c 6c 79 20 71 75 61  ld the fully qua
e9d0: 6c 69 66 69 65 64 20 64 69 72 65 63 74 6f 72 79  lified directory
e9e0: 20 77 68 65 72 65 20 74 68 65 20 6e 65 63 65 73   where the neces
e9f0: 73 61 72 79 0d 0a 20 20 20 20 20 20 20 20 23 20  sary..        # 
ea00: 20 20 20 20 20 20 63 6f 6d 70 6f 6e 65 6e 74 73        components
ea10: 20 66 6f 72 20 53 79 73 74 65 6d 2e 44 61 74 61   for System.Data
ea20: 2e 53 51 4c 69 74 65 20 73 68 6f 75 6c 64 20 62  .SQLite should b
ea30: 65 20 66 6f 75 6e 64 2e 0d 0a 20 20 20 20 20 20  e found...      
ea40: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 73 65 74    #..        set
ea50: 20 64 69 72 65 63 74 6f 72 79 20 5b 66 69 6c 65   directory [file
ea60: 20 6e 61 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c   nativename [fil
ea70: 65 20 6a 6f 69 6e 20 5c 0d 0a 20 20 20 20 20 20  e join \..      
ea80: 20 20 20 20 20 20 24 3a 3a 65 6e 76 28 53 79 73        $::env(Sys
ea90: 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 29  tem.Data.SQLite)
eaa0: 20 5b 67 65 74 52 65 6c 65 61 73 65 56 65 72 73   [getReleaseVers
eab0: 69 6f 6e 5d 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20  ion]]]....      
eac0: 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
ead0: 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
eae0: 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
eaf0: 2d 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 53  - checking for S
eb00: 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
eb10: 65 20 72 65 6c 65 61 73 65 20 5c 22 22 20 5c 0d  e release \"" \.
eb20: 0a 20 20 20 20 20 20 20 20 20 20 20 20 24 64 69  .            $di
eb30: 72 65 63 74 6f 72 79 20 22 5c 22 2e 2e 2e 20 22  rectory "\"... "
eb40: 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20  ]....        if 
eb50: 7b 5b 69 73 52 65 6c 65 61 73 65 41 76 61 69 6c  {[isReleaseAvail
eb60: 61 62 6c 65 20 24 64 69 72 65 63 74 6f 72 79 20  able $directory 
eb70: 70 6c 61 74 66 6f 72 6d 5d 7d 20 74 68 65 6e 20  platform]} then 
eb80: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20  {..          if 
eb90: 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20  {[string length 
eba0: 24 70 6c 61 74 66 6f 72 6d 5d 20 3d 3d 20 30 7d  $platform] == 0}
ebb0: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
ebc0: 20 20 20 20 20 73 65 74 20 70 6c 61 74 66 6f 72       set platfor
ebd0: 6d 20 75 6e 6b 6e 6f 77 6e 0d 0a 20 20 20 20 20  m unknown..     
ebe0: 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
ebf0: 20 20 20 20 69 66 20 7b 24 73 65 6c 65 63 74 20      if {$select 
ec00: 26 26 20 5b 6d 61 74 63 68 50 6c 61 74 66 6f 72  && [matchPlatfor
ec10: 6d 20 24 70 6c 61 74 66 6f 72 6d 5d 7d 20 74 68  m $platform]} th
ec20: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
ec30: 20 20 73 65 74 20 3a 3a 62 75 69 6c 64 5f 64 69    set ::build_di
ec40: 72 65 63 74 6f 72 79 20 24 64 69 72 65 63 74 6f  rectory $directo
ec50: 72 79 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  ry....          
ec60: 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
ec70: 20 5b 61 70 70 65 6e 64 41 72 67 73 20 22 79 65   [appendArgs "ye
ec80: 73 2c 20 73 65 6c 65 63 74 65 64 20 28 22 20 24  s, selected (" $
ec90: 70 6c 61 74 66 6f 72 6d 20 22 29 5c 6e 22 5d 0d  platform ")\n"].
eca0: 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  ...            r
ecb0: 65 74 75 72 6e 20 74 72 75 65 0d 0a 20 20 20 20  eturn true..    
ecc0: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
ecd0: 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
ece0: 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  s $channel [appe
ecf0: 6e 64 41 72 67 73 20 22 79 65 73 20 28 22 20 24  ndArgs "yes (" $
ed00: 70 6c 61 74 66 6f 72 6d 20 22 29 5c 6e 22 5d 0d  platform ")\n"].
ed10: 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  .          }..  
ed20: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
ed30: 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
ed40: 24 63 68 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d 0a 0d  $channel no\n...
ed50: 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 65 61  .          forea
ed60: 63 68 20 70 61 74 68 20 5b 6c 73 6f 72 74 20 2d  ch path [lsort -
ed70: 64 65 63 72 65 61 73 69 6e 67 20 5b 66 69 6c 65  decreasing [file
ed80: 20 6c 69 73 74 20 24 64 69 72 65 63 74 6f 72 79   list $directory
ed90: 20 2a 5d 5d 20 7b 0d 0a 20 20 20 20 20 20 20 20   *]] {..        
eda0: 20 20 20 20 69 66 20 7b 5b 66 69 6c 65 20 65 78      if {[file ex
edb0: 69 73 74 73 20 24 70 61 74 68 5d 20 26 26 20 5b  ists $path] && [
edc0: 66 69 6c 65 20 69 73 64 69 72 65 63 74 6f 72 79  file isdirectory
edd0: 20 24 70 61 74 68 5d 7d 20 74 68 65 6e 20 7b 0d   $path]} then {.
ede0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74  .              t
edf0: 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61  puts $channel [a
ee00: 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
ee10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
ee20: 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e 67 20 66 6f  ---- checking fo
ee30: 72 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51  r System.Data.SQ
ee40: 4c 69 74 65 20 72 65 6c 65 61 73 65 20 5c 22 22  Lite release \""
ee50: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
ee60: 20 20 20 20 20 20 24 70 61 74 68 20 22 5c 22 2e        $path "\".
ee70: 2e 2e 20 22 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  .. "]....       
ee80: 20 20 20 20 20 20 20 69 66 20 7b 5b 69 73 52 65         if {[isRe
ee90: 6c 65 61 73 65 41 76 61 69 6c 61 62 6c 65 20 24  leaseAvailable $
eea0: 70 61 74 68 20 70 6c 61 74 66 6f 72 6d 5d 7d 20  path platform]} 
eeb0: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
eec0: 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72          if {[str
eed0: 69 6e 67 20 6c 65 6e 67 74 68 20 24 70 6c 61 74  ing length $plat
eee0: 66 6f 72 6d 5d 20 3d 3d 20 30 7d 20 74 68 65 6e  form] == 0} then
eef0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
ef00: 20 20 20 20 20 20 73 65 74 20 70 6c 61 74 66 6f        set platfo
ef10: 72 6d 20 75 6e 6b 6e 6f 77 6e 0d 0a 20 20 20 20  rm unknown..    
ef20: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d              }...
ef30: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
ef40: 20 69 66 20 7b 24 73 65 6c 65 63 74 20 26 26 20   if {$select && 
ef50: 5b 6d 61 74 63 68 50 6c 61 74 66 6f 72 6d 20 24  [matchPlatform $
ef60: 70 6c 61 74 66 6f 72 6d 5d 7d 20 74 68 65 6e 20  platform]} then 
ef70: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
ef80: 20 20 20 20 20 73 65 74 20 3a 3a 62 75 69 6c 64       set ::build
ef90: 5f 64 69 72 65 63 74 6f 72 79 20 24 70 61 74 68  _directory $path
efa0: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
efb0: 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
efc0: 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
efd0: 20 22 79 65 73 2c 20 73 65 6c 65 63 74 65 64 20   "yes, selected 
efe0: 28 22 20 24 70 6c 61 74 66 6f 72 6d 20 22 29 5c  (" $platform ")\
eff0: 6e 22 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  n"]....         
f000: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
f010: 74 72 75 65 0d 0a 20 20 20 20 20 20 20 20 20 20  true..          
f020: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
f030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f040: 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
f050: 20 5b 61 70 70 65 6e 64 41 72 67 73 20 22 79 65   [appendArgs "ye
f060: 73 20 28 22 20 24 70 6c 61 74 66 6f 72 6d 20 22  s (" $platform "
f070: 29 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20 20  )\n"]..         
f080: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
f090: 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b          } else {
f0a0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
f0b0: 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
f0c0: 20 6e 6f 5c 6e 0d 0a 20 20 20 20 20 20 20 20 20   no\n..         
f0d0: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
f0e0: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
f0f0: 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20   }..        }.. 
f100: 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
f110: 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
f120: 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
f130: 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
f140: 20 22 2d 2d 2d 2d 20 65 6e 76 69 72 6f 6e 6d 65   "---- environme
f150: 6e 74 20 76 61 72 69 61 62 6c 65 20 5c 22 53 79  nt variable \"Sy
f160: 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
f170: 5c 22 20 69 73 20 6e 6f 74 20 22 20 5c 0d 0a 20  \" is not " \.. 
f180: 20 20 20 20 20 20 20 20 20 20 20 22 73 65 74 2c             "set,
f190: 20 73 6b 69 70 70 69 6e 67 20 63 68 65 63 6b 20   skipping check 
f1a0: 66 6f 72 20 72 65 6c 65 61 73 65 73 2e 2e 2e 5c  for releases...\
f1b0: 6e 22 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a  n"]..      }....
f1c0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 66 61 6c        return fal
f1d0: 73 65 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20  se..    }.....  
f1e0: 20 20 70 72 6f 63 20 63 68 65 63 6b 46 6f 72 53    proc checkForS
f1f0: 51 4c 69 74 65 4c 69 62 72 61 72 79 20 7b 20 63  QLiteLibrary { c
f200: 68 61 6e 6e 65 6c 20 7d 20 7b 0d 0a 20 20 20 20  hannel } {..    
f210: 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
f220: 20 22 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e 67 20   "---- checking 
f230: 66 6f 72 20 53 51 4c 69 74 65 20 63 6f 72 65 20  for SQLite core 
f240: 6c 69 62 72 61 72 79 2e 2e 2e 20 22 0d 0a 0d 0a  library... "....
f250: 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68        if {[catch
f260: 20 7b 0d 0a 20 20 20 20 20 20 20 20 6f 62 6a 65   {..        obje
f270: 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73  ct invoke -flags
f280: 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20   +NonPublic \.. 
f290: 20 20 20 20 20 20 20 20 20 20 20 53 79 73 74 65             Syste
f2a0: 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 53 51  m.Data.SQLite.SQ
f2b0: 4c 69 74 65 33 20 53 51 4c 69 74 65 56 65 72 73  Lite3 SQLiteVers
f2c0: 69 6f 6e 0d 0a 20 20 20 20 20 20 7d 20 76 65 72  ion..      } ver
f2d0: 73 69 6f 6e 5d 20 3d 3d 20 30 7d 20 74 68 65 6e  sion] == 0} then
f2e0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20   {..        #.. 
f2f0: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43         # NOTE: C
f300: 68 65 63 6b 20 69 66 20 74 68 65 20 72 65 74 75  heck if the retu
f310: 72 6e 65 64 20 76 65 72 73 69 6f 6e 20 77 61 73  rned version was
f320: 20 6e 75 6c 6c 2e 20 20 49 66 20 73 6f 2c 20 6d   null.  If so, m
f330: 61 6b 65 20 69 74 20 65 61 73 79 0d 0a 20 20 20  ake it easy..   
f340: 20 20 20 20 20 23 20 20 20 20 20 20 20 74 6f 20       #       to 
f350: 73 70 6f 74 2e 0d 0a 20 20 20 20 20 20 20 20 23  spot...        #
f360: 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73  ..        if {[s
f370: 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 76 65  tring length $ve
f380: 72 73 69 6f 6e 5d 20 3d 3d 20 30 7d 20 74 68 65  rsion] == 0} the
f390: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73  n {..          s
f3a0: 65 74 20 76 65 72 73 69 6f 6e 20 6e 75 6c 6c 0d  et version null.
f3b0: 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  .        }....  
f3c0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
f3d0: 20 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74   # NOTE: Attempt
f3e0: 20 74 6f 20 71 75 65 72 79 20 74 68 65 20 46 6f   to query the Fo
f3f0: 73 73 69 6c 20 73 6f 75 72 63 65 20 69 64 65 6e  ssil source iden
f400: 74 69 66 69 65 72 20 66 6f 72 20 74 68 65 20 53  tifier for the S
f410: 51 4c 69 74 65 0d 0a 20 20 20 20 20 20 20 20 23  QLite..        #
f420: 20 20 20 20 20 20 20 63 6f 72 65 20 6c 69 62 72         core libr
f430: 61 72 79 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  ary...        #.
f440: 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61  .        if {[ca
f450: 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  tch {..         
f460: 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d   object invoke -
f470: 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63  flags +NonPublic
f480: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
f490: 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51    System.Data.SQ
f4a0: 4c 69 74 65 2e 53 51 4c 69 74 65 33 20 53 51 4c  Lite.SQLite3 SQL
f4b0: 69 74 65 53 6f 75 72 63 65 49 64 0d 0a 20 20 20  iteSourceId..   
f4c0: 20 20 20 20 20 7d 20 73 6f 75 72 63 65 49 64 5d       } sourceId]
f4d0: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
f4e0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
f4f0: 20 23 20 4e 4f 54 45 3a 20 57 65 20 66 61 69 6c   # NOTE: We fail
f500: 65 64 20 74 6f 20 71 75 65 72 79 20 74 68 65 20  ed to query the 
f510: 46 6f 73 73 69 6c 20 73 6f 75 72 63 65 20 69 64  Fossil source id
f520: 65 6e 74 69 66 69 65 72 2e 0d 0a 20 20 20 20 20  entifier...     
f530: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
f540: 20 20 73 65 74 20 73 6f 75 72 63 65 49 64 20 75    set sourceId u
f550: 6e 6b 6e 6f 77 6e 0d 0a 20 20 20 20 20 20 20 20  nknown..        
f560: 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  }....        #..
f570: 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
f580: 43 68 65 63 6b 20 69 66 20 74 68 65 20 72 65 74  Check if the ret
f590: 75 72 6e 65 64 20 46 6f 73 73 69 6c 20 73 6f 75  urned Fossil sou
f5a0: 72 63 65 20 69 64 65 6e 74 69 66 69 65 72 20 77  rce identifier w
f5b0: 61 73 20 6e 75 6c 6c 2e 20 20 49 66 0d 0a 20 20  as null.  If..  
f5c0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 73 6f        #       so
f5d0: 2c 20 6d 61 6b 65 20 69 74 20 65 61 73 79 20 74  , make it easy t
f5e0: 6f 20 73 70 6f 74 2e 0d 0a 20 20 20 20 20 20 20  o spot...       
f5f0: 20 23 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b   #..        if {
f600: 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
f610: 73 6f 75 72 63 65 49 64 5d 20 3d 3d 20 30 7d 20  sourceId] == 0} 
f620: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
f630: 20 20 73 65 74 20 73 6f 75 72 63 65 49 64 20 6e    set sourceId n
f640: 75 6c 6c 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  ull..        }..
f650: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
f660: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 59 65 73       # NOTE: Yes
f670: 2c 20 74 68 65 20 53 51 4c 69 74 65 20 63 6f 72  , the SQLite cor
f680: 65 20 6c 69 62 72 61 72 79 20 61 70 70 65 61 72  e library appear
f690: 73 20 74 6f 20 62 65 20 61 76 61 69 6c 61 62 6c  s to be availabl
f6a0: 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  e...        #.. 
f6b0: 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72         addConstr
f6c0: 61 69 6e 74 20 53 51 4c 69 74 65 0d 0a 0d 0a 20  aint SQLite.... 
f6d0: 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
f6e0: 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
f6f0: 73 20 22 79 65 73 20 28 22 20 24 76 65 72 73 69  s "yes (" $versi
f700: 6f 6e 20 22 20 22 20 24 73 6f 75 72 63 65 49 64  on " " $sourceId
f710: 20 22 29 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 7d   ")\n"]..      }
f720: 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
f730: 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
f740: 6e 6f 5c 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a 20  no\n..      }.. 
f750: 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
f760: 63 20 63 68 65 63 6b 46 6f 72 53 51 4c 69 74 65  c checkForSQLite
f770: 49 6e 74 65 72 6f 70 20 7b 20 63 68 61 6e 6e 65  Interop { channe
f780: 6c 20 7d 20 7b 0d 0a 20 20 20 20 20 20 74 70 75  l } {..      tpu
f790: 74 73 20 24 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d  ts $channel "---
f7a0: 2d 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 53  - checking for S
f7b0: 51 4c 69 74 65 20 69 6e 74 65 72 6f 70 20 61 73  QLite interop as
f7c0: 73 65 6d 62 6c 79 2e 2e 2e 20 22 0d 0a 0d 0a 20  sembly... ".... 
f7d0: 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20       if {[catch 
f7e0: 7b 0d 0a 20 20 20 20 20 20 20 20 6f 62 6a 65 63  {..        objec
f7f0: 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20  t invoke -flags 
f800: 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20  +NonPublic \..  
f810: 20 20 20 20 20 20 20 20 20 20 53 79 73 74 65 6d            System
f820: 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 53 51 4c  .Data.SQLite.SQL
f830: 69 74 65 33 20 49 6e 74 65 72 6f 70 56 65 72 73  ite3 InteropVers
f840: 69 6f 6e 0d 0a 20 20 20 20 20 20 7d 20 76 65 72  ion..      } ver
f850: 73 69 6f 6e 5d 20 3d 3d 20 30 7d 20 74 68 65 6e  sion] == 0} then
f860: 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20   {..        #.. 
f870: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43         # NOTE: C
f880: 68 65 63 6b 20 69 66 20 74 68 65 20 72 65 74 75  heck if the retu
f890: 72 6e 65 64 20 76 65 72 73 69 6f 6e 20 77 61 73  rned version was
f8a0: 20 6e 75 6c 6c 2e 20 20 49 66 20 73 6f 2c 20 6d   null.  If so, m
f8b0: 61 6b 65 20 69 74 20 65 61 73 79 0d 0a 20 20 20  ake it easy..   
f8c0: 20 20 20 20 20 23 20 20 20 20 20 20 20 74 6f 20       #       to 
f8d0: 73 70 6f 74 2e 0d 0a 20 20 20 20 20 20 20 20 23  spot...        #
f8e0: 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73  ..        if {[s
f8f0: 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 76 65  tring length $ve
f900: 72 73 69 6f 6e 5d 20 3d 3d 20 30 7d 20 74 68 65  rsion] == 0} the
f910: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73  n {..          s
f920: 65 74 20 76 65 72 73 69 6f 6e 20 6e 75 6c 6c 0d  et version null.
f930: 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  .        }....  
f940: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
f950: 20 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74   # NOTE: Attempt
f960: 20 74 6f 20 71 75 65 72 79 20 74 68 65 20 46 6f   to query the Fo
f970: 73 73 69 6c 20 73 6f 75 72 63 65 20 69 64 65 6e  ssil source iden
f980: 74 69 66 69 65 72 20 66 6f 72 20 74 68 65 20 53  tifier for the S
f990: 51 4c 69 74 65 0d 0a 20 20 20 20 20 20 20 20 23  QLite..        #
f9a0: 20 20 20 20 20 20 20 63 6f 72 65 20 6c 69 62 72         core libr
f9b0: 61 72 79 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  ary...        #.
f9c0: 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61  .        if {[ca
f9d0: 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  tch {..         
f9e0: 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d   object invoke -
f9f0: 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63  flags +NonPublic
fa00: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
fa10: 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51    System.Data.SQ
fa20: 4c 69 74 65 2e 53 51 4c 69 74 65 33 20 49 6e 74  Lite.SQLite3 Int
fa30: 65 72 6f 70 53 6f 75 72 63 65 49 64 0d 0a 20 20  eropSourceId..  
fa40: 20 20 20 20 20 20 7d 20 73 6f 75 72 63 65 49 64        } sourceId
fa50: 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
fa60: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
fa70: 20 20 23 20 4e 4f 54 45 3a 20 57 65 20 66 61 69    # NOTE: We fai
fa80: 6c 65 64 20 74 6f 20 71 75 65 72 79 20 74 68 65  led to query the
fa90: 20 46 6f 73 73 69 6c 20 73 6f 75 72 63 65 20 69   Fossil source i
faa0: 64 65 6e 74 69 66 69 65 72 2e 0d 0a 20 20 20 20  dentifier...    
fab0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
fac0: 20 20 20 73 65 74 20 73 6f 75 72 63 65 49 64 20     set sourceId 
fad0: 75 6e 6b 6e 6f 77 6e 0d 0a 20 20 20 20 20 20 20  unknown..       
fae0: 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d   }....        #.
faf0: 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
fb00: 20 43 68 65 63 6b 20 69 66 20 74 68 65 20 72 65   Check if the re
fb10: 74 75 72 6e 65 64 20 46 6f 73 73 69 6c 20 73 6f  turned Fossil so
fb20: 75 72 63 65 20 69 64 65 6e 74 69 66 69 65 72 20  urce identifier 
fb30: 77 61 73 20 6e 75 6c 6c 2e 20 20 49 66 0d 0a 20  was null.  If.. 
fb40: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 73         #       s
fb50: 6f 2c 20 6d 61 6b 65 20 69 74 20 65 61 73 79 20  o, make it easy 
fb60: 74 6f 20 73 70 6f 74 2e 0d 0a 20 20 20 20 20 20  to spot...      
fb70: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 69 66 20    #..        if 
fb80: 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20  {[string length 
fb90: 24 73 6f 75 72 63 65 49 64 5d 20 3d 3d 20 30 7d  $sourceId] == 0}
fba0: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
fbb0: 20 20 20 73 65 74 20 73 6f 75 72 63 65 49 64 20     set sourceId 
fbc0: 6e 75 6c 6c 0d 0a 20 20 20 20 20 20 20 20 7d 0d  null..        }.
fbd0: 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
fbe0: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 42 65        # NOTE: Be
fbf0: 66 6f 72 65 20 61 63 74 75 61 6c 6c 79 20 61 64  fore actually ad
fc00: 64 69 6e 67 20 74 68 65 20 74 65 73 74 20 63 6f  ding the test co
fc10: 6e 73 74 72 61 69 6e 74 2c 20 6d 61 6b 65 20 73  nstraint, make s
fc20: 75 72 65 20 74 68 65 0d 0a 20 20 20 20 20 20 20  ure the..       
fc30: 20 23 20 20 20 20 20 20 20 76 65 72 73 69 6f 6e   #       version
fc40: 20 69 73 20 76 61 6c 69 64 20 28 69 2e 65 2e 20   is valid (i.e. 
fc50: 6e 6f 74 20 6a 75 73 74 20 74 68 61 74 20 77 65  not just that we
fc60: 20 63 6f 75 6c 64 20 71 75 65 72 79 20 69 74 29   could query it)
fc70: 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
fc80: 20 20 20 20 20 20 69 66 20 7b 24 76 65 72 73 69        if {$versi
fc90: 6f 6e 20 6e 65 20 22 6e 75 6c 6c 22 7d 20 74 68  on ne "null"} th
fca0: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
fcb0: 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e  #..          # N
fcc0: 4f 54 45 3a 20 59 65 73 2c 20 74 68 65 20 53 51  OTE: Yes, the SQ
fcd0: 4c 69 74 65 20 69 6e 74 65 72 6f 70 20 61 73 73  Lite interop ass
fce0: 65 6d 62 6c 79 20 61 70 70 65 61 72 73 20 74 6f  embly appears to
fcf0: 20 62 65 20 61 76 61 69 6c 61 62 6c 65 2e 0d 0a   be available...
fd00: 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
fd10: 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72         addConstr
fd20: 61 69 6e 74 20 53 51 4c 69 74 65 49 6e 74 65 72  aint SQLiteInter
fd30: 6f 70 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  op....          
fd40: 73 65 74 20 61 6e 73 77 65 72 20 79 65 73 0d 0a  set answer yes..
fd50: 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b          } else {
fd60: 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20  ..          set 
fd70: 61 6e 73 77 65 72 20 6e 6f 0d 0a 20 20 20 20 20  answer no..     
fd80: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
fd90: 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b  tputs $channel [
fda0: 61 70 70 65 6e 64 41 72 67 73 20 24 61 6e 73 77  appendArgs $answ
fdb0: 65 72 20 22 20 28 22 20 24 76 65 72 73 69 6f 6e  er " (" $version
fdc0: 20 22 20 22 20 24 73 6f 75 72 63 65 49 64 20 22   " " $sourceId "
fdd0: 29 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 7d 20 65  )\n"]..      } e
fde0: 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 74  lse {..        t
fdf0: 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 6e 6f  puts $channel no
fe00: 5c 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20  \n..      }..   
fe10: 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
fe20: 63 68 65 63 6b 46 6f 72 53 51 4c 69 74 65 44 65  checkForSQLiteDe
fe30: 66 69 6e 65 43 6f 6e 73 74 61 6e 74 20 7b 20 63  fineConstant { c
fe40: 68 61 6e 6e 65 6c 20 6e 61 6d 65 20 7d 20 7b 0d  hannel name } {.
fe50: 0a 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68  .      tputs $ch
fe60: 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
fe70: 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 22  s \..          "
fe80: 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e 67 20 66 6f  ---- checking fo
fe90: 72 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51  r System.Data.SQ
fea0: 4c 69 74 65 20 64 65 66 69 6e 65 20 63 6f 6e 73  Lite define cons
feb0: 74 61 6e 74 20 5c 22 22 20 24 6e 61 6d 65 20 5c  tant \"" $name \
fec0: 0d 0a 20 20 20 20 20 20 20 20 20 20 22 5c 22 2e  ..          "\".
fed0: 2e 2e 20 22 5d 0d 0a 0d 0a 20 20 20 20 20 20 69  .. "]....      i
fee0: 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20  f {[catch {..   
fef0: 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f       object invo
ff00: 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75  ke -flags +NonPu
ff10: 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20 20 20  blic \..        
ff20: 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e      System.Data.
ff30: 53 51 4c 69 74 65 2e 53 51 4c 69 74 65 33 20 44  SQLite.SQLite3 D
ff40: 65 66 69 6e 65 43 6f 6e 73 74 61 6e 74 73 0d 0a  efineConstants..
ff50: 20 20 20 20 20 20 7d 20 64 65 66 69 6e 65 43 6f        } defineCo
ff60: 6e 73 74 61 6e 74 73 5d 20 3d 3d 20 30 7d 20 74  nstants] == 0} t
ff70: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 69  hen {..        i
ff80: 66 20 7b 5b 6c 73 65 61 72 63 68 20 2d 65 78 61  f {[lsearch -exa
ff90: 63 74 20 2d 6e 6f 63 61 73 65 20 24 64 65 66 69  ct -nocase $defi
ffa0: 6e 65 43 6f 6e 73 74 61 6e 74 73 20 24 6e 61 6d  neConstants $nam
ffb0: 65 5d 20 21 3d 20 2d 31 7d 20 74 68 65 6e 20 7b  e] != -1} then {
ffc0: 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20  ..          #.. 
ffd0: 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a           # NOTE:
ffe0: 20 59 65 73 2c 20 74 68 69 73 20 64 65 66 69 6e   Yes, this defin
fff0: 65 20 63 6f 6e 73 74 61 6e 74 20 77 61 73 20 65  e constant was e
10000 6e 61 62 6c 65 64 20 77 68 65 6e 20 74 68 65 20  nabled when the 
10010 6d 61 6e 61 67 65 64 0d 0a 20 20 20 20 20 20 20  managed..       
10020 20 20 20 23 20 20 20 20 20 20 20 61 73 73 65 6d     #       assem
10030 62 6c 79 20 77 61 73 20 63 6f 6d 70 69 6c 65 64  bly was compiled
10040 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a  ...          #..
10050 20 20 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e            addCon
10060 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41  straint [appendA
10070 72 67 73 20 5b 67 65 74 53 51 4c 69 74 65 44 65  rgs [getSQLiteDe
10080 66 69 6e 65 43 6f 6e 73 74 61 6e 74 50 72 65 66  fineConstantPref
10090 69 78 5d 20 24 6e 61 6d 65 5d 0d 0a 0d 0a 20 20  ix] $name]....  
100a0 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
100b0 68 61 6e 6e 65 6c 20 79 65 73 5c 6e 0d 0a 20 20  hannel yes\n..  
100c0 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
100d0 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
100e0 24 63 68 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d 0a 20  $channel no\n.. 
100f0 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
10100 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
10110 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
10120 20 65 72 72 6f 72 5c 6e 0d 0a 20 20 20 20 20 20   error\n..      
10130 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  }..    }.....   
10140 20 70 72 6f 63 20 67 65 74 44 61 74 65 54 69 6d   proc getDateTim
10150 65 46 6f 72 6d 61 74 20 7b 20 7b 74 69 6d 65 5a  eFormat { {timeZ
10160 6f 6e 65 20 74 72 75 65 7d 20 7d 20 7b 0d 0a 20  one true} } {.. 
10170 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
10180 4e 4f 54 45 3a 20 54 68 69 73 20 70 72 6f 63 65  NOTE: This proce
10190 64 75 72 65 20 73 69 6d 70 6c 79 20 72 65 74 75  dure simply retu
101a0 72 6e 73 20 74 68 65 20 22 64 65 66 61 75 6c 74  rns the "default
101b0 22 20 44 61 74 65 54 69 6d 65 20 66 6f 72 6d 61  " DateTime forma
101c0 74 20 75 73 65 64 0d 0a 20 20 20 20 20 20 23 20  t used..      # 
101d0 20 20 20 20 20 20 62 79 20 74 68 65 20 74 65 73        by the tes
101e0 74 20 73 75 69 74 65 2e 0d 0a 20 20 20 20 20 20  t suite...      
101f0 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 6e  #..      if {[in
10200 66 6f 20 65 78 69 73 74 73 20 3a 3a 64 61 74 65  fo exists ::date
10210 74 69 6d 65 5f 66 6f 72 6d 61 74 5d 20 26 26 20  time_format] && 
10220 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 73 74  \..          [st
10230 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a 64  ring length $::d
10240 61 74 65 74 69 6d 65 5f 66 6f 72 6d 61 74 5d 20  atetime_format] 
10250 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  > 0} then {..   
10260 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
10270 23 20 4e 4f 54 45 3a 20 52 65 74 75 72 6e 20 74  # NOTE: Return t
10280 68 65 20 6d 61 6e 75 61 6c 6c 79 20 6f 76 65 72  he manually over
10290 72 69 64 64 65 6e 20 76 61 6c 75 65 20 66 6f 72  ridden value for
102a0 20 74 68 65 20 44 61 74 65 54 69 6d 65 20 66 6f   the DateTime fo
102b0 72 6d 61 74 2e 0d 0a 20 20 20 20 20 20 20 20 23  rmat...        #
102c0 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ..        return
102d0 20 24 3a 3a 64 61 74 65 74 69 6d 65 5f 66 6f 72   $::datetime_for
102e0 6d 61 74 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73  mat..      } els
102f0 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  e {..        #..
10300 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
10310 52 65 74 75 72 6e 20 61 6e 20 49 53 4f 38 36 30  Return an ISO860
10320 31 20 44 61 74 65 54 69 6d 65 20 66 6f 72 6d 61  1 DateTime forma
10330 74 20 63 6f 6d 70 61 74 69 62 6c 65 20 77 69 74  t compatible wit
10340 68 20 53 51 4c 69 74 65 2c 0d 0a 20 20 20 20 20  h SQLite,..     
10350 20 20 20 23 20 20 20 20 20 20 20 53 79 73 74 65     #       Syste
10360 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2c 20 61  m.Data.SQLite, a
10370 6e 64 20 73 75 69 74 61 62 6c 65 20 66 6f 72 20  nd suitable for 
10380 72 6f 75 6e 64 2d 74 72 69 70 70 69 6e 67 20 77  round-tripping w
10390 69 74 68 20 74 68 65 0d 0a 20 20 20 20 20 20 20  ith the..       
103a0 20 23 20 20 20 20 20 20 20 44 61 74 65 54 69 6d   #       DateTim
103b0 65 20 63 6c 61 73 73 20 6f 66 20 74 68 65 20 66  e class of the f
103c0 72 61 6d 65 77 6f 72 6b 2e 20 20 49 66 20 74 68  ramework.  If th
103d0 69 73 20 76 61 6c 75 65 20 69 73 20 63 68 61 6e  is value is chan
103e0 67 65 64 2c 0d 0a 20 20 20 20 20 20 20 20 23 20  ged,..        # 
103f0 20 20 20 20 20 20 76 61 72 69 6f 75 73 20 74 65        various te
10400 73 74 73 20 6d 61 79 20 66 61 69 6c 2e 0d 0a 20  sts may fail... 
10410 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
10420 20 20 72 65 74 75 72 6e 20 5b 61 70 70 65 6e 64    return [append
10430 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
10440 20 20 20 20 22 79 79 79 79 2d 4d 4d 2d 64 64 20      "yyyy-MM-dd 
10450 48 48 3a 6d 6d 3a 73 73 2e 46 46 46 46 46 46 46  HH:mm:ss.FFFFFFF
10460 22 20 5b 65 78 70 72 20 7b 24 74 69 6d 65 5a 6f  " [expr {$timeZo
10470 6e 65 20 3f 20 22 4b 22 20 3a 20 22 22 7d 5d 5d  ne ? "K" : ""}]]
10480 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d  ..      }..    }
10490 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65  .....    proc ge
104a0 74 44 61 74 65 54 69 6d 65 54 69 63 6b 73 20 7b  tDateTimeTicks {
104b0 20 76 61 6c 75 65 20 7b 6c 6f 63 61 6c 20 22 22   value {local ""
104c0 7d 20 7b 64 65 66 61 75 6c 74 20 22 22 7d 20 7d  } {default ""} }
104d0 20 7b 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 73   {..      if {[s
104e0 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 76 61  tring length $va
104f0 6c 75 65 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20  lue] == 0} then 
10500 7b 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  {..        retur
10510 6e 20 24 64 65 66 61 75 6c 74 0d 0a 20 20 20 20  n $default..    
10520 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20    }....      if 
10530 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20  {[catch {..     
10540 20 20 20 73 65 74 20 64 61 74 65 54 69 6d 65 20     set dateTime 
10550 5b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d  [object invoke -
10560 63 72 65 61 74 65 20 5c 0d 0a 20 20 20 20 20 20  create \..      
10570 20 20 20 20 20 20 2d 70 61 72 61 6d 65 74 65 72        -parameter
10580 74 79 70 65 73 20 5b 6c 69 73 74 20 53 74 72 69  types [list Stri
10590 6e 67 20 53 74 72 69 6e 67 20 49 46 6f 72 6d 61  ng String IForma
105a0 74 50 72 6f 76 69 64 65 72 20 5c 0d 0a 20 20 20  tProvider \..   
105b0 20 20 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e           System.
105c0 47 6c 6f 62 61 6c 69 7a 61 74 69 6f 6e 2e 44 61  Globalization.Da
105d0 74 65 54 69 6d 65 53 74 79 6c 65 73 5d 20 44 61  teTimeStyles] Da
105e0 74 65 54 69 6d 65 20 50 61 72 73 65 45 78 61 63  teTime ParseExac
105f0 74 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  t \..           
10600 20 24 76 61 6c 75 65 20 5b 67 65 74 44 61 74 65   $value [getDate
10610 54 69 6d 65 46 6f 72 6d 61 74 5d 20 6e 75 6c 6c  TimeFormat] null
10620 20 41 64 6a 75 73 74 54 6f 55 6e 69 76 65 72 73   AdjustToUnivers
10630 61 6c 5d 0d 0a 20 20 20 20 20 20 7d 5d 7d 20 74  al]..      }]} t
10640 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 72  hen {..        r
10650 65 74 75 72 6e 20 24 64 65 66 61 75 6c 74 0d 0a  eturn $default..
10660 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
10670 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 69 73 20   if {[string is 
10680 62 6f 6f 6c 65 61 6e 20 2d 73 74 72 69 63 74 20  boolean -strict 
10690 24 6c 6f 63 61 6c 5d 7d 20 74 68 65 6e 20 7b 0d  $local]} then {.
106a0 0a 20 20 20 20 20 20 20 20 73 65 74 20 64 61 74  .        set dat
106b0 65 54 69 6d 65 20 5b 6f 62 6a 65 63 74 20 69 6e  eTime [object in
106c0 76 6f 6b 65 20 2d 63 72 65 61 74 65 20 44 61 74  voke -create Dat
106d0 65 54 69 6d 65 20 53 70 65 63 69 66 79 4b 69 6e  eTime SpecifyKin
106e0 64 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  d \..           
106f0 20 24 64 61 74 65 54 69 6d 65 20 55 74 63 5d 0d   $dateTime Utc].
10700 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d  .      } else {.
10710 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
10720 5b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 24  [object invoke $
10730 64 61 74 65 54 69 6d 65 20 54 69 63 6b 73 5d 0d  dateTime Ticks].
10740 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
10750 20 20 69 66 20 7b 24 6c 6f 63 61 6c 7d 20 74 68    if {$local} th
10760 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 72 65  en {..        re
10770 74 75 72 6e 20 5b 6f 62 6a 65 63 74 20 69 6e 76  turn [object inv
10780 6f 6b 65 20 24 64 61 74 65 54 69 6d 65 20 54 6f  oke $dateTime To
10790 4c 6f 63 61 6c 54 69 6d 65 2e 54 69 63 6b 73 5d  LocalTime.Ticks]
107a0 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b  ..      } else {
107b0 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ..        return
107c0 20 5b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20   [object invoke 
107d0 24 64 61 74 65 54 69 6d 65 20 54 6f 55 6e 69 76  $dateTime ToUniv
107e0 65 72 73 61 6c 54 69 6d 65 2e 54 69 63 6b 73 5d  ersalTime.Ticks]
107f0 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d  ..      }..    }
10800 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65  .....    proc ge
10810 74 50 72 6f 70 65 72 74 69 65 73 20 7b 20 6f 62  tProperties { ob
10820 6a 65 63 74 20 76 61 72 4e 61 6d 65 20 7d 20 7b  ject varName } {
10830 0d 0a 20 20 20 20 20 20 75 70 76 61 72 20 31 20  ..      upvar 1 
10840 24 76 61 72 4e 61 6d 65 20 70 72 6f 70 65 72 74  $varName propert
10850 69 65 73 0d 0a 0d 0a 20 20 20 20 20 20 73 65 74  ies....      set
10860 20 63 6f 75 6e 74 20 30 0d 0a 20 20 20 20 20 20   count 0..      
10870 73 65 74 20 6e 61 6d 65 73 20 5b 6c 69 73 74 5d  set names [list]
10880 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69  ....      if {[i
10890 73 4f 62 6a 65 63 74 48 61 6e 64 6c 65 20 24 6f  sObjectHandle $o
108a0 62 6a 65 63 74 5d 20 26 26 20 24 6f 62 6a 65 63  bject] && $objec
108b0 74 20 6e 65 20 22 6e 75 6c 6c 22 7d 20 74 68 65  t ne "null"} the
108c0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 65 76 61  n {..        eva
108d0 6c 20 6c 61 70 70 65 6e 64 20 6e 61 6d 65 73 20  l lappend names 
108e0 5b 6f 62 6a 65 63 74 20 6d 65 6d 62 65 72 73 20  [object members 
108f0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 2d  \..            -
10900 6d 65 6d 62 65 72 74 79 70 65 73 20 50 72 6f 70  membertypes Prop
10910 65 72 74 79 20 2d 6e 61 6d 65 6f 6e 6c 79 20 24  erty -nameonly $
10920 6f 62 6a 65 63 74 5d 0d 0a 0d 0a 20 20 20 20 20  object]....     
10930 20 20 20 65 76 61 6c 20 6c 61 70 70 65 6e 64 20     eval lappend 
10940 6e 61 6d 65 73 20 5b 6f 62 6a 65 63 74 20 6d 65  names [object me
10950 6d 62 65 72 73 20 5c 0d 0a 20 20 20 20 20 20 20  mbers \..       
10960 20 20 20 20 20 2d 6d 65 6d 62 65 72 74 79 70 65       -membertype
10970 73 20 46 69 65 6c 64 20 2d 6e 61 6d 65 6f 6e 6c  s Field -nameonl
10980 79 20 24 6f 62 6a 65 63 74 5d 0d 0a 20 20 20 20  y $object]..    
10990 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 66 6f 72    }....      for
109a0 65 61 63 68 20 6e 61 6d 65 20 24 6e 61 6d 65 73  each name $names
109b0 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b   {..        if {
109c0 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20  [catch {..      
109d0 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b      object invok
109e0 65 20 2d 6f 62 6a 65 63 74 66 6c 61 67 73 20 2b  e -objectflags +
109f0 4e 6f 44 69 73 70 6f 73 65 20 24 6f 62 6a 65 63  NoDispose $objec
10a00 74 20 24 6e 61 6d 65 0d 0a 20 20 20 20 20 20 20  t $name..       
10a10 20 7d 20 76 61 6c 75 65 5d 20 3d 3d 20 30 7d 20   } value] == 0} 
10a20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
10a30 20 20 69 66 20 7b 5b 69 73 4f 62 6a 65 63 74 48    if {[isObjectH
10a40 61 6e 64 6c 65 20 24 76 61 6c 75 65 5d 20 26 26  andle $value] &&
10a50 20 24 76 61 6c 75 65 20 6e 65 20 22 6e 75 6c 6c   $value ne "null
10a60 22 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  "} then {..     
10a70 20 20 20 20 20 20 20 73 65 74 20 65 72 72 6f 72         set error
10a80 20 6e 75 6c 6c 3b 20 6f 62 6a 65 63 74 20 69 6e   null; object in
10a90 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e  voke -flags +Non
10aa0 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20  Public \..      
10ab0 20 20 20 20 20 20 20 20 20 20 2d 6d 61 72 73 68            -marsh
10ac0 61 6c 66 6c 61 67 73 20 2b 4e 6f 48 61 6e 64 6c  alflags +NoHandl
10ad0 65 20 49 6e 74 65 72 70 72 65 74 65 72 2e 47 65  e Interpreter.Ge
10ae0 74 41 63 74 69 76 65 20 5c 0d 0a 20 20 20 20 20  tActive \..     
10af0 20 20 20 20 20 20 20 20 20 20 20 41 64 64 4f 62             AddOb
10b00 6a 65 63 74 52 65 66 65 72 65 6e 63 65 20 4f 6b  jectReference Ok
10b10 20 24 76 61 6c 75 65 20 65 72 72 6f 72 0d 0a 0d   $value error...
10b20 0a 20 20 20 20 20 20 20 20 20 20 20 20 6c 61 70  .            lap
10b30 70 65 6e 64 20 70 72 6f 70 65 72 74 69 65 73 28  pend properties(
10b40 6f 62 6a 65 63 74 73 29 20 5b 6c 69 73 74 20 24  objects) [list $
10b50 6e 61 6d 65 20 24 76 61 6c 75 65 5d 0d 0a 20 20  name $value]..  
10b60 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b          } else {
10b70 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 6c 61  ..            la
10b80 70 70 65 6e 64 20 70 72 6f 70 65 72 74 69 65 73  ppend properties
10b90 28 76 61 6c 75 65 73 29 20 5b 6c 69 73 74 20 24  (values) [list $
10ba0 6e 61 6d 65 20 24 76 61 6c 75 65 5d 0d 0a 20 20  name $value]..  
10bb0 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
10bc0 20 20 20 20 20 20 20 69 6e 63 72 20 63 6f 75 6e         incr coun
10bd0 74 0d 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73  t..        } els
10be0 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 6c  e {..          l
10bf0 61 70 70 65 6e 64 20 70 72 6f 70 65 72 74 69 65  append propertie
10c00 73 28 65 72 72 6f 72 73 29 20 5b 6c 69 73 74 20  s(errors) [list 
10c10 24 6e 61 6d 65 20 24 3a 3a 65 72 72 6f 72 43 6f  $name $::errorCo
10c20 64 65 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  de]..        }..
10c30 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
10c40 20 72 65 74 75 72 6e 20 24 63 6f 75 6e 74 0d 0a   return $count..
10c50 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
10c60 6f 63 20 67 65 74 41 6c 6c 50 72 6f 70 65 72 74  oc getAllPropert
10c70 69 65 73 20 7b 20 6f 62 6a 65 63 74 20 76 61 72  ies { object var
10c80 4e 61 6d 65 20 7d 20 7b 0d 0a 20 20 20 20 20 20  Name } {..      
10c90 75 70 76 61 72 20 31 20 24 76 61 72 4e 61 6d 65  upvar 1 $varName
10ca0 20 70 72 6f 70 65 72 74 69 65 73 0d 0a 20 20 20   properties..   
10cb0 20 20 20 73 65 74 20 76 61 6c 75 65 20 24 6f 62     set value $ob
10cc0 6a 65 63 74 0d 0a 0d 0a 20 20 20 20 20 20 77 68  ject....      wh
10cd0 69 6c 65 20 7b 74 72 75 65 7d 20 7b 0d 0a 20 20  ile {true} {..  
10ce0 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f        if {![info
10cf0 20 65 78 69 73 74 73 20 70 72 6f 70 65 72 74 69   exists properti
10d00 65 73 28 73 65 65 6e 4f 62 6a 65 63 74 73 29 5d  es(seenObjects)]
10d10 20 7c 7c 20 5c 0d 0a 20 20 20 20 20 20 20 20 20   || \..         
10d20 20 20 20 24 76 61 6c 75 65 20 6e 69 20 24 70 72     $value ni $pr
10d30 6f 70 65 72 74 69 65 73 28 73 65 65 6e 4f 62 6a  operties(seenObj
10d40 65 63 74 73 29 7d 20 74 68 65 6e 20 7b 0d 0a 20  ects)} then {.. 
10d50 20 20 20 20 20 20 20 20 20 67 65 74 50 72 6f 70           getProp
10d60 65 72 74 69 65 73 20 24 76 61 6c 75 65 20 70 72  erties $value pr
10d70 6f 70 65 72 74 69 65 73 0d 0a 20 20 20 20 20 20  operties..      
10d80 20 20 20 20 6c 61 70 70 65 6e 64 20 70 72 6f 70      lappend prop
10d90 65 72 74 69 65 73 28 73 65 65 6e 4f 62 6a 65 63  erties(seenObjec
10da0 74 73 29 20 24 76 61 6c 75 65 0d 0a 20 20 20 20  ts) $value..    
10db0 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
10dc0 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73   if {![info exis
10dd0 74 73 20 70 72 6f 70 65 72 74 69 65 73 28 6f 62  ts properties(ob
10de0 6a 65 63 74 73 29 5d 7d 20 74 68 65 6e 20 7b 0d  jects)]} then {.
10df0 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
10e00 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  ..        }.... 
10e10 20 20 20 20 20 20 20 69 66 20 7b 5b 6c 6c 65 6e         if {[llen
10e20 67 74 68 20 24 70 72 6f 70 65 72 74 69 65 73 28  gth $properties(
10e30 6f 62 6a 65 63 74 73 29 5d 20 3d 3d 20 30 7d 20  objects)] == 0} 
10e40 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
10e50 20 20 75 6e 73 65 74 20 70 72 6f 70 65 72 74 69    unset properti
10e60 65 73 28 6f 62 6a 65 63 74 73 29 3b 20 62 72 65  es(objects); bre
10e70 61 6b 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d  ak..        }...
10e80 0a 20 20 20 20 20 20 20 20 73 65 74 20 76 61 6c  .        set val
10e90 75 65 20 5b 6c 69 6e 64 65 78 20 5b 6c 69 6e 64  ue [lindex [lind
10ea0 65 78 20 24 70 72 6f 70 65 72 74 69 65 73 28 6f  ex $properties(o
10eb0 62 6a 65 63 74 73 29 20 30 5d 20 65 6e 64 5d 0d  bjects) 0] end].
10ec0 0a 20 20 20 20 20 20 20 20 73 65 74 20 70 72 6f  .        set pro
10ed0 70 65 72 74 69 65 73 28 6f 62 6a 65 63 74 73 29  perties(objects)
10ee0 20 5b 6c 72 61 6e 67 65 20 24 70 72 6f 70 65 72   [lrange $proper
10ef0 74 69 65 73 28 6f 62 6a 65 63 74 73 29 20 31 20  ties(objects) 1 
10f00 65 6e 64 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d  end]..      }...
10f10 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f  .      if {[info
10f20 20 65 78 69 73 74 73 20 70 72 6f 70 65 72 74 69   exists properti
10f30 65 73 28 73 65 65 6e 4f 62 6a 65 63 74 73 29 5d  es(seenObjects)]
10f40 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
10f50 20 20 66 6f 72 65 61 63 68 20 76 61 6c 75 65 20    foreach value 
10f60 24 70 72 6f 70 65 72 74 69 65 73 28 73 65 65 6e  $properties(seen
10f70 4f 62 6a 65 63 74 73 29 20 7b 0d 0a 20 20 20 20  Objects) {..    
10f80 20 20 20 20 20 20 69 66 20 7b 24 76 61 6c 75 65        if {$value
10f90 20 65 71 20 24 6f 62 6a 65 63 74 7d 20 63 6f 6e   eq $object} con
10fa0 74 69 6e 75 65 0d 0a 20 20 20 20 20 20 20 20 20  tinue..         
10fb0 20 63 61 74 63 68 20 7b 6f 62 6a 65 63 74 20 64   catch {object d
10fc0 69 73 70 6f 73 65 20 24 76 61 6c 75 65 7d 0d 0a  ispose $value}..
10fd0 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
10fe0 20 20 20 20 20 75 6e 73 65 74 20 70 72 6f 70 65       unset prope
10ff0 72 74 69 65 73 28 73 65 65 6e 4f 62 6a 65 63 74  rties(seenObject
11000 73 29 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20  s)..      }..   
11010 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
11020 67 65 74 56 61 72 69 61 62 6c 65 73 20 7b 20 76  getVariables { v
11030 61 72 4e 61 6d 65 73 20 7b 6f 62 6a 65 63 74 73  arNames {objects
11040 20 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a 20 20 20   false} } {..   
11050 20 20 20 73 65 74 20 72 65 73 75 6c 74 20 5b 6c     set result [l
11060 69 73 74 5d 0d 0a 0d 0a 20 20 20 20 20 20 66 6f  ist]....      fo
11070 72 65 61 63 68 20 76 61 72 4e 61 6d 65 20 24 76  reach varName $v
11080 61 72 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20  arNames {..     
11090 20 20 20 69 66 20 7b 5b 75 70 6c 65 76 65 6c 20     if {[uplevel 
110a0 31 20 5b 6c 69 73 74 20 61 72 72 61 79 20 65 78  1 [list array ex
110b0 69 73 74 73 20 24 76 61 72 4e 61 6d 65 5d 5d 7d  ists $varName]]}
110c0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
110d0 20 20 20 73 65 74 20 61 72 72 61 79 4e 61 6d 65     set arrayName
110e0 20 24 76 61 72 4e 61 6d 65 0d 0a 0d 0a 20 20 20   $varName....   
110f0 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 65         foreach e
11100 6c 65 6d 65 6e 74 4e 61 6d 65 20 5b 75 70 6c 65  lementName [uple
11110 76 65 6c 20 31 20 5b 6c 69 73 74 20 61 72 72 61  vel 1 [list arra
11120 79 20 6e 61 6d 65 73 20 24 61 72 72 61 79 4e 61  y names $arrayNa
11130 6d 65 5d 5d 20 7b 0d 0a 20 20 20 20 20 20 20 20  me]] {..        
11140 20 20 20 20 73 65 74 20 6e 61 6d 65 20 5b 61 70      set name [ap
11150 70 65 6e 64 41 72 67 73 20 24 61 72 72 61 79 4e  pendArgs $arrayN
11160 61 6d 65 20 28 20 24 65 6c 65 6d 65 6e 74 4e 61  ame ( $elementNa
11170 6d 65 20 29 5d 0d 0a 20 20 20 20 20 20 20 20 20  me )]..         
11180 20 20 20 73 65 74 20 76 61 72 56 61 6c 75 65 20     set varValue 
11190 5b 75 70 6c 65 76 65 6c 20 31 20 5b 6c 69 73 74  [uplevel 1 [list
111a0 20 73 65 74 20 24 6e 61 6d 65 5d 5d 0d 0a 0d 0a   set $name]]....
111b0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b              if {
111c0 24 6f 62 6a 65 63 74 73 20 26 26 20 5b 69 73 4f  $objects && [isO
111d0 62 6a 65 63 74 48 61 6e 64 6c 65 20 24 76 61 72  bjectHandle $var
111e0 56 61 6c 75 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a  Value]} then {..
111f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 75 6e                un
11200 73 65 74 20 2d 6e 6f 63 6f 6d 70 6c 61 69 6e 20  set -nocomplain 
11210 70 72 6f 70 65 72 74 69 65 73 0d 0a 20 20 20 20  properties..    
11220 20 20 20 20 20 20 20 20 20 20 67 65 74 41 6c 6c            getAll
11230 50 72 6f 70 65 72 74 69 65 73 20 24 76 61 72 56  Properties $varV
11240 61 6c 75 65 20 70 72 6f 70 65 72 74 69 65 73 0d  alue properties.
11250 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
11260 20 6c 61 70 70 65 6e 64 20 72 65 73 75 6c 74 20   lappend result 
11270 5b 6c 69 73 74 20 24 6e 61 6d 65 20 5b 61 72 72  [list $name [arr
11280 61 79 20 67 65 74 20 70 72 6f 70 65 72 74 69 65  ay get propertie
11290 73 5d 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s]]..           
112a0 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
112b0 20 20 20 20 20 20 20 20 20 6c 61 70 70 65 6e 64           lappend
112c0 20 72 65 73 75 6c 74 20 5b 6c 69 73 74 20 24 6e   result [list $n
112d0 61 6d 65 20 24 76 61 72 56 61 6c 75 65 5d 0d 0a  ame $varValue]..
112e0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
112f0 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
11300 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
11310 20 20 20 20 20 20 20 20 73 65 74 20 76 61 72 56          set varV
11320 61 6c 75 65 20 5b 75 70 6c 65 76 65 6c 20 31 20  alue [uplevel 1 
11330 5b 6c 69 73 74 20 73 65 74 20 24 76 61 72 4e 61  [list set $varNa
11340 6d 65 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  me]]....        
11350 20 20 69 66 20 7b 24 6f 62 6a 65 63 74 73 20 26    if {$objects &
11360 26 20 5b 69 73 4f 62 6a 65 63 74 48 61 6e 64 6c  & [isObjectHandl
11370 65 20 24 76 61 72 56 61 6c 75 65 5d 7d 20 74 68  e $varValue]} th
11380 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
11390 20 20 75 6e 73 65 74 20 2d 6e 6f 63 6f 6d 70 6c    unset -nocompl
113a0 61 69 6e 20 70 72 6f 70 65 72 74 69 65 73 0d 0a  ain properties..
113b0 20 20 20 20 20 20 20 20 20 20 20 20 67 65 74 41              getA
113c0 6c 6c 50 72 6f 70 65 72 74 69 65 73 20 24 76 61  llProperties $va
113d0 72 56 61 6c 75 65 20 70 72 6f 70 65 72 74 69 65  rValue propertie
113e0 73 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s....           
113f0 20 6c 61 70 70 65 6e 64 20 72 65 73 75 6c 74 20   lappend result 
11400 5b 6c 69 73 74 20 24 76 61 72 4e 61 6d 65 20 5b  [list $varName [
11410 61 72 72 61 79 20 67 65 74 20 70 72 6f 70 65 72  array get proper
11420 74 69 65 73 5d 5d 0d 0a 20 20 20 20 20 20 20 20  ties]]..        
11430 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
11440 20 20 20 20 20 20 20 20 6c 61 70 70 65 6e 64 20          lappend 
11450 72 65 73 75 6c 74 20 5b 6c 69 73 74 20 24 76 61  result [list $va
11460 72 4e 61 6d 65 20 24 76 61 72 56 61 6c 75 65 5d  rName $varValue]
11470 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20  ..          }.. 
11480 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
11490 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65 74 75 72  }....      retur
114a0 6e 20 24 72 65 73 75 6c 74 0d 0a 20 20 20 20 7d  n $result..    }
114b0 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 65 6e  .....    proc en
114c0 75 6d 65 72 61 62 6c 65 54 6f 4c 69 73 74 20 7b  umerableToList {
114d0 20 65 6e 75 6d 65 72 61 62 6c 65 20 7d 20 7b 0d   enumerable } {.
114e0 0a 20 20 20 20 20 20 73 65 74 20 72 65 73 75 6c  .      set resul
114f0 74 20 5b 6c 69 73 74 5d 0d 0a 0d 0a 20 20 20 20  t [list]....    
11500 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65    if {[string le
11510 6e 67 74 68 20 24 65 6e 75 6d 65 72 61 62 6c 65  ngth $enumerable
11520 5d 20 3d 3d 20 30 20 7c 7c 20 24 65 6e 75 6d 65  ] == 0 || $enume
11530 72 61 62 6c 65 20 65 71 20 22 6e 75 6c 6c 22 7d  rable eq "null"}
11540 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
11550 20 72 65 74 75 72 6e 20 24 72 65 73 75 6c 74 0d   return $result.
11560 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
11570 20 20 6f 62 6a 65 63 74 20 66 6f 72 65 61 63 68    object foreach
11580 20 2d 61 6c 69 61 73 20 69 74 65 6d 20 24 65 6e   -alias item $en
11590 75 6d 65 72 61 62 6c 65 20 7b 0d 0a 20 20 20 20  umerable {..    
115a0 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20      if {[string 
115b0 6c 65 6e 67 74 68 20 24 69 74 65 6d 5d 20 3e 20  length $item] > 
115c0 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
115d0 20 20 20 20 20 6c 61 70 70 65 6e 64 20 72 65 73       lappend res
115e0 75 6c 74 20 5b 24 69 74 65 6d 20 54 6f 53 74 72  ult [$item ToStr
115f0 69 6e 67 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d  ing]..        }.
11600 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
11610 20 20 72 65 74 75 72 6e 20 24 72 65 73 75 6c 74    return $result
11620 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
11630 70 72 6f 63 20 63 61 74 63 68 41 6e 64 52 65 74  proc catchAndRet
11640 75 72 6e 20 7b 20 73 63 72 69 70 74 20 7b 73 74  urn { script {st
11650 61 63 6b 54 72 61 63 65 20 66 61 6c 73 65 7d 20  ackTrace false} 
11660 7b 73 74 72 69 63 74 20 74 72 75 65 7d 20 7d 20  {strict true} } 
11670 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  {..      #..    
11680 20 20 23 20 4e 4f 54 45 3a 20 45 76 61 6c 75 61    # NOTE: Evalua
11690 74 65 20 74 68 65 20 73 63 72 69 70 74 20 70 72  te the script pr
116a0 6f 76 69 64 65 64 20 62 79 20 6f 75 72 20 63 61  ovided by our ca
116b0 6c 6c 65 72 20 69 6e 20 74 68 65 69 72 20 63 6f  ller in their co
116c0 6e 74 65 78 74 2c 0d 0a 20 20 20 20 20 20 23 20  ntext,..      # 
116d0 20 20 20 20 20 20 63 61 70 74 75 72 69 6e 67 20        capturing 
116e0 62 6f 74 68 20 74 68 65 20 72 65 73 75 6c 74 20  both the result 
116f0 61 6e 64 20 74 68 65 20 72 65 74 75 72 6e 20 63  and the return c
11700 6f 64 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ode...      #.. 
11710 20 20 20 20 20 73 65 74 20 63 6f 64 65 20 5b 63       set code [c
11720 61 74 63 68 20 7b 75 70 6c 65 76 65 6c 20 31 20  atch {uplevel 1 
11730 24 73 63 72 69 70 74 7d 20 72 65 73 75 6c 74 5d  $script} result]
11740 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  ....      #..   
11750 20 20 20 23 20 4e 4f 54 45 3a 20 44 69 64 20 74     # NOTE: Did t
11760 68 65 20 73 63 72 69 70 74 20 70 72 6f 76 69 64  he script provid
11770 65 64 20 62 79 20 6f 75 72 20 63 61 6c 6c 65 72  ed by our caller
11780 20 4e 4f 54 20 72 61 69 73 65 20 61 6e 20 65 72   NOT raise an er
11790 72 6f 72 3f 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ror?..      #.. 
117a0 20 20 20 20 20 69 66 20 7b 24 73 74 72 69 63 74       if {$strict
117b0 20 26 26 20 24 63 6f 64 65 20 3d 3d 20 30 20 7c   && $code == 0 |
117c0 7c 20 21 24 73 74 72 69 63 74 20 26 26 20 24 63  | !$strict && $c
117d0 6f 64 65 20 21 3d 20 31 7d 20 74 68 65 6e 20 7b  ode != 1} then {
117e0 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
117f0 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 75 63       # NOTE: Suc
11800 63 65 73 73 2e 20 20 52 65 74 75 72 6e 20 61 20  cess.  Return a 
11810 6c 69 73 74 20 77 69 74 68 20 74 68 65 20 72 65  list with the re
11820 74 75 72 6e 20 63 6f 64 65 20 61 6e 64 20 74 68  turn code and th
11830 65 20 72 65 73 75 6c 74 2e 0d 0a 20 20 20 20 20  e result...     
11840 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65     #..        re
11850 74 75 72 6e 20 5b 6c 69 73 74 20 24 63 6f 64 65  turn [list $code
11860 20 24 72 65 73 75 6c 74 5d 0d 0a 20 20 20 20 20   $result]..     
11870 20 7d 20 65 6c 73 65 69 66 20 7b 24 73 74 61 63   } elseif {$stac
11880 6b 54 72 61 63 65 7d 20 74 68 65 6e 20 7b 0d 0a  kTrace} then {..
11890 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
118a0 20 20 20 23 20 4e 4f 54 45 3a 20 46 61 69 6c 75     # NOTE: Failu
118b0 72 65 2e 20 20 4f 75 72 20 63 61 6c 6c 65 72 20  re.  Our caller 
118c0 77 61 6e 74 73 20 61 20 66 75 6c 6c 20 73 74 61  wants a full sta
118d0 63 6b 20 74 72 61 63 65 20 28 69 66 20 61 70 70  ck trace (if app
118e0 6c 69 63 61 62 6c 65 29 2c 0d 0a 20 20 20 20 20  licable),..     
118f0 20 20 20 23 20 20 20 20 20 20 20 72 65 74 75 72     #       retur
11900 6e 20 61 20 6c 69 73 74 20 77 69 74 68 20 74 68  n a list with th
11910 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20 61 6e  e return code an
11920 64 20 74 68 65 20 72 65 73 75 6c 74 20 76 65 72  d the result ver
11930 62 61 74 69 6d 2e 0d 0a 20 20 20 20 20 20 20 20  batim...        
11940 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  #..        retur
11950 6e 20 5b 6c 69 73 74 20 24 63 6f 64 65 20 24 72  n [list $code $r
11960 65 73 75 6c 74 5d 0d 0a 20 20 20 20 20 20 7d 20  esult]..      } 
11970 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
11980 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
11990 45 3a 20 46 61 69 6c 75 72 65 2e 20 20 4f 75 72  E: Failure.  Our
119a0 20 63 61 6c 6c 65 72 20 64 6f 65 73 20 6e 6f 74   caller does not
119b0 20 77 61 6e 74 20 61 20 66 75 6c 6c 20 73 74 61   want a full sta
119c0 63 6b 20 74 72 61 63 65 20 28 69 66 0d 0a 20 20  ck trace (if..  
119d0 20 20 20 20 20 20 23 20 20 20 20 20 20 20 61 70        #       ap
119e0 70 6c 69 63 61 62 6c 65 29 2c 20 72 65 74 75 72  plicable), retur
119f0 6e 20 61 20 6c 69 73 74 20 77 69 74 68 20 74 68  n a list with th
11a00 65 20 72 65 74 75 72 6e 20 63 6f 64 65 2c 20 74  e return code, t
11a10 68 65 20 65 72 72 6f 72 0d 0a 20 20 20 20 20 20  he error..      
11a20 20 20 23 20 20 20 20 20 20 20 63 6f 64 65 20 66    #       code f
11a30 6f 72 20 74 68 65 20 69 6e 74 65 72 70 72 65 74  or the interpret
11a40 65 72 2c 20 61 6e 64 20 74 68 65 20 65 72 72 6f  er, and the erro
11a50 72 20 6d 65 73 73 61 67 65 20 75 70 20 74 6f 20  r message up to 
11a60 74 68 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20  the..        #  
11a70 20 20 20 20 20 70 6f 69 6e 74 20 77 68 65 72 65       point where
11a80 20 74 68 65 20 73 74 61 63 6b 20 74 72 61 63 65   the stack trace
11a90 20 73 68 6f 75 6c 64 20 73 74 61 72 74 2e 0d 0a   should start...
11aa0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
11ab0 20 20 20 72 65 74 75 72 6e 20 5b 6c 69 73 74 20     return [list 
11ac0 24 63 6f 64 65 20 24 3a 3a 65 72 72 6f 72 43 6f  $code $::errorCo
11ad0 64 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  de \..          
11ae0 20 20 5b 65 78 74 72 61 63 74 53 79 73 74 65 6d    [extractSystem
11af0 44 61 74 61 53 51 4c 69 74 65 45 78 63 65 70 74  DataSQLiteExcept
11b00 69 6f 6e 4d 65 73 73 61 67 65 20 24 72 65 73 75  ionMessage $resu
11b10 6c 74 5d 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20  lt]]..      }.. 
11b20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
11b30 63 20 63 6f 6d 70 69 6c 65 43 53 68 61 72 70 57  c compileCSharpW
11b40 69 74 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  ith {..         
11b50 20 20 20 74 65 78 74 20 6d 65 6d 6f 72 79 20 73     text memory s
11b60 79 6d 62 6f 6c 73 20 73 74 72 69 63 74 20 72 65  ymbols strict re
11b70 73 75 6c 74 73 56 61 72 4e 61 6d 65 20 65 72 72  sultsVarName err
11b80 6f 72 73 56 61 72 4e 61 6d 65 20 66 69 6c 65 4e  orsVarName fileN
11b90 61 6d 65 73 0d 0a 20 20 20 20 20 20 20 20 20 20  ames..          
11ba0 20 20 61 72 67 73 20 7d 20 7b 0d 0a 20 20 20 20    args } {..    
11bb0 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
11bc0 45 3a 20 53 69 6e 63 65 20 77 65 20 61 72 65 20  E: Since we are 
11bd0 67 6f 69 6e 67 20 74 6f 20 75 73 65 20 74 68 69  going to use thi
11be0 73 20 6d 65 74 68 6f 64 20 6e 61 6d 65 20 61 20  s method name a 
11bf0 6c 6f 74 2c 20 61 73 73 69 67 6e 20 69 74 20 74  lot, assign it t
11c00 6f 20 61 0d 0a 20 20 20 20 20 20 23 20 20 20 20  o a..      #    
11c10 20 20 20 76 61 72 69 61 62 6c 65 20 66 69 72 73     variable firs
11c20 74 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  t...      #..   
11c30 20 20 20 73 65 74 20 61 64 64 20 52 65 66 65 72     set add Refer
11c40 65 6e 63 65 64 41 73 73 65 6d 62 6c 69 65 73 2e  encedAssemblies.
11c50 41 64 64 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a  Add....      #..
11c60 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 72        # NOTE: Cr
11c70 65 61 74 65 20 74 68 65 20 62 61 73 65 20 63 6f  eate the base co
11c80 6d 6d 61 6e 64 20 74 6f 20 65 76 61 6c 75 61 74  mmand to evaluat
11c90 65 20 61 6e 64 20 61 64 64 20 74 68 65 20 70 72  e and add the pr
11ca0 6f 70 65 72 74 79 20 73 65 74 74 69 6e 67 73 0d  operty settings.
11cb0 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74  .      #       t
11cc0 68 61 74 20 61 72 65 20 61 6c 6d 6f 73 74 20 61  hat are almost a
11cd0 6c 77 61 79 73 20 6e 65 65 64 65 64 20 62 79 20  lways needed by 
11ce0 6f 75 72 20 75 6e 69 74 20 74 65 73 74 73 20 28  our unit tests (
11cf0 69 2e 65 2e 20 74 68 65 20 53 79 73 74 65 6d 0d  i.e. the System.
11d00 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 61  .      #       a
11d10 6e 64 20 53 79 73 74 65 6d 2e 44 61 74 61 20 61  nd System.Data a
11d20 73 73 65 6d 62 6c 79 20 72 65 66 65 72 65 6e 63  ssembly referenc
11d30 65 73 29 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  es)...      #.. 
11d40 20 20 20 20 20 73 65 74 20 63 6f 6d 6d 61 6e 64       set command
11d50 20 5b 6c 69 73 74 20 5c 0d 0a 20 20 20 20 20 20   [list \..      
11d60 20 20 20 20 63 6f 6d 70 69 6c 65 43 53 68 61 72      compileCShar
11d70 70 20 24 74 65 78 74 20 24 6d 65 6d 6f 72 79 20  p $text $memory 
11d80 24 73 79 6d 62 6f 6c 73 20 24 73 74 72 69 63 74  $symbols $strict
11d90 20 72 65 73 75 6c 74 73 20 65 72 72 6f 72 73 20   results errors 
11da0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 24 61 64  \..          $ad
11db0 64 20 53 79 73 74 65 6d 2e 64 6c 6c 20 24 61 64  d System.dll $ad
11dc0 64 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 64 6c  d System.Data.dl
11dd0 6c 20 24 61 64 64 20 53 79 73 74 65 6d 2e 54 72  l $add System.Tr
11de0 61 6e 73 61 63 74 69 6f 6e 73 2e 64 6c 6c 20 5c  ansactions.dll \
11df0 0d 0a 20 20 20 20 20 20 20 20 20 20 24 61 64 64  ..          $add
11e00 20 53 79 73 74 65 6d 2e 58 6d 6c 2e 64 6c 6c 5d   System.Xml.dll]
11e10 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  ....      #..   
11e20 20 20 20 23 20 4e 4f 54 45 3a 20 41 64 64 20 61     # NOTE: Add a
11e30 6c 6c 20 74 68 65 20 70 72 6f 76 69 64 65 64 20  ll the provided 
11e40 66 69 6c 65 20 6e 61 6d 65 73 20 61 73 20 61 73  file names as as
11e50 73 65 6d 62 6c 79 20 72 65 66 65 72 65 6e 63 65  sembly reference
11e60 73 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  s...      #..   
11e70 20 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65 4e     foreach fileN
11e80 61 6d 65 20 24 66 69 6c 65 4e 61 6d 65 73 20 7b  ame $fileNames {
11e90 0d 0a 20 20 20 20 20 20 20 20 6c 61 70 70 65 6e  ..        lappen
11ea0 64 20 63 6f 6d 6d 61 6e 64 20 24 61 64 64 20 5b  d command $add [
11eb0 67 65 74 42 69 6e 61 72 79 46 69 6c 65 4e 61 6d  getBinaryFileNam
11ec0 65 20 24 66 69 6c 65 4e 61 6d 65 5d 0d 0a 20 20  e $fileName]..  
11ed0 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23      }....      #
11ee0 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
11ef0 41 64 64 20 74 68 65 20 65 78 74 72 61 20 61 72  Add the extra ar
11f00 67 75 6d 65 6e 74 73 2c 20 69 66 20 61 6e 79 2c  guments, if any,
11f10 20 74 6f 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20   to the command 
11f20 74 6f 20 65 76 61 6c 75 61 74 65 2e 0d 0a 20 20  to evaluate...  
11f30 20 20 20 20 23 0d 0a 20 20 20 20 20 20 65 76 61      #..      eva
11f40 6c 20 6c 61 70 70 65 6e 64 20 63 6f 6d 6d 61 6e  l lappend comman
11f50 64 20 24 61 72 67 73 0d 0a 0d 0a 20 20 20 20 20  d $args....     
11f60 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
11f70 3a 20 41 6c 69 61 73 20 74 68 65 20 63 6f 6d 70  : Alias the comp
11f80 69 6c 65 72 20 6c 6f 63 61 6c 20 72 65 73 75 6c  iler local resul
11f90 74 73 20 61 6e 64 20 65 72 72 6f 72 73 20 76 61  ts and errors va
11fa0 72 69 61 62 6c 65 73 20 74 6f 20 74 68 65 0d 0a  riables to the..
11fb0 20 20 20 20 20 20 23 20 20 20 20 20 20 20 76 61        #       va
11fc0 72 69 61 62 6c 65 20 6e 61 6d 65 73 20 70 72 6f  riable names pro
11fd0 76 69 64 65 64 20 62 79 20 6f 75 72 20 63 61 6c  vided by our cal
11fe0 6c 65 72 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ler...      #.. 
11ff0 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67       if {[string
12000 20 6c 65 6e 67 74 68 20 24 72 65 73 75 6c 74 73   length $results
12010 56 61 72 4e 61 6d 65 5d 20 3e 20 30 7d 20 74 68  VarName] > 0} th
12020 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 75 70  en {..        up
12030 76 61 72 20 31 20 24 72 65 73 75 6c 74 73 56 61  var 1 $resultsVa
12040 72 4e 61 6d 65 20 72 65 73 75 6c 74 73 0d 0a 20  rName results.. 
12050 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
12060 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67  if {[string leng
12070 74 68 20 24 65 72 72 6f 72 73 56 61 72 4e 61 6d  th $errorsVarNam
12080 65 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  e] > 0} then {..
12090 20 20 20 20 20 20 20 20 75 70 76 61 72 20 31 20          upvar 1 
120a0 24 65 72 72 6f 72 73 56 61 72 4e 61 6d 65 20 65  $errorsVarName e
120b0 72 72 6f 72 73 0d 0a 20 20 20 20 20 20 7d 0d 0a  rrors..      }..
120c0 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
120d0 20 23 20 4e 4f 54 45 3a 20 45 76 61 6c 75 61 74   # NOTE: Evaluat
120e0 65 20 74 68 65 20 63 6f 6e 73 74 72 75 63 74 65  e the constructe
120f0 64 20 5b 63 6f 6d 70 69 6c 65 43 53 68 61 72 70  d [compileCSharp
12100 5d 20 63 6f 6d 6d 61 6e 64 20 61 6e 64 20 72 65  ] command and re
12110 74 75 72 6e 20 74 68 65 0d 0a 20 20 20 20 20 20  turn the..      
12120 23 20 20 20 20 20 20 20 72 65 73 75 6c 74 2e 0d  #       result..
12130 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
12140 65 76 61 6c 20 24 63 6f 6d 6d 61 6e 64 0d 0a 20  eval $command.. 
12150 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
12160 63 20 69 73 4d 65 6d 6f 72 79 44 62 20 7b 20 66  c isMemoryDb { f
12170 69 6c 65 4e 61 6d 65 20 7d 20 7b 0d 0a 20 20 20  ileName } {..   
12180 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
12190 54 45 3a 20 49 73 20 74 68 65 20 73 70 65 63 69  TE: Is the speci
121a0 66 69 65 64 20 64 61 74 61 62 61 73 65 20 66 69  fied database fi
121b0 6c 65 20 6e 61 6d 65 20 72 65 61 6c 6c 79 20 61  le name really a
121c0 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  n in-memory data
121d0 62 61 73 65 3f 0d 0a 20 20 20 20 20 20 23 0d 0a  base?..      #..
121e0 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b 65 78        return [ex
121f0 70 72 20 7b 24 66 69 6c 65 4e 61 6d 65 20 65 71  pr {$fileName eq
12200 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 7c 7c 20 5c   ":memory:" || \
12210 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 73 74 72  ..          [str
12220 69 6e 67 20 72 61 6e 67 65 20 24 66 69 6c 65 4e  ing range $fileN
12230 61 6d 65 20 30 20 31 32 5d 20 65 71 20 22 66 69  ame 0 12] eq "fi
12240 6c 65 3a 3a 6d 65 6d 6f 72 79 3a 22 7d 5d 0d 0a  le::memory:"}]..
12250 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
12260 6f 63 20 69 73 54 61 62 6c 65 49 6e 44 62 20 7b  oc isTableInDb {
12270 20 6e 61 6d 65 20 7b 76 61 72 4e 61 6d 65 20 64   name {varName d
12280 62 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d  b} } {..      #.
12290 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 52  .      # NOTE: R
122a0 65 66 65 72 20 74 6f 20 74 68 65 20 73 70 65 63  efer to the spec
122b0 69 66 69 65 64 20 76 61 72 69 61 62 6c 65 20 28  ified variable (
122c0 65 2e 67 2e 20 22 64 62 22 29 20 69 6e 20 74 68  e.g. "db") in th
122d0 65 20 63 6f 6e 74 65 78 74 20 6f 66 20 6f 75 72  e context of our
122e0 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
122f0 63 61 6c 6c 65 72 2e 20 20 49 74 20 63 6f 6e 74  caller.  It cont
12300 61 69 6e 73 20 74 68 65 20 64 61 74 61 62 61 73  ains the databas
12310 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 6e  e connection han
12320 64 6c 65 20 74 68 61 74 20 77 69 6c 6c 20 62 65  dle that will be
12330 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
12340 75 73 65 64 20 74 6f 20 65 78 65 63 75 74 65 20  used to execute 
12350 74 68 65 20 71 75 65 72 79 20 75 73 65 64 20 74  the query used t
12360 6f 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20 74  o determine if t
12370 68 65 20 6e 61 6d 65 64 20 74 61 62 6c 65 20 69  he named table i
12380 73 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  s..      #      
12390 20 70 72 65 73 65 6e 74 20 69 6e 20 74 68 61 74   present in that
123a0 20 64 61 74 61 62 61 73 65 2e 0d 0a 20 20 20 20   database...    
123b0 20 20 23 0d 0a 20 20 20 20 20 20 75 70 76 61 72    #..      upvar
123c0 20 31 20 24 76 61 72 4e 61 6d 65 20 64 62 0d 0a   1 $varName db..
123d0 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
123e0 20 23 20 4e 4f 54 45 3a 20 55 73 65 20 74 68 65   # NOTE: Use the
123f0 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74   sqlite_master t
12400 61 62 6c 65 20 74 6f 20 64 65 74 65 72 6d 69 6e  able to determin
12410 65 20 69 66 20 74 68 65 20 6e 61 6d 65 64 20 74  e if the named t
12420 61 62 6c 65 20 69 73 0d 0a 20 20 20 20 20 20 23  able is..      #
12430 20 20 20 20 20 20 20 70 72 65 73 65 6e 74 20 69         present i
12440 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0d  n the database..
12450 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
12460 73 65 74 20 73 71 6c 20 7b 0d 0a 20 20 20 20 20  set sql {..     
12470 20 20 20 53 45 4c 45 43 54 20 43 4f 55 4e 54 28     SELECT COUNT(
12480 2a 29 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d  *) FROM sqlite_m
12490 61 73 74 65 72 20 57 48 45 52 45 20 74 79 70 65  aster WHERE type
124a0 20 3d 20 27 74 61 62 6c 65 27 20 41 4e 44 20 6e   = 'table' AND n
124b0 61 6d 65 20 3d 20 3f 3b 0d 0a 20 20 20 20 20 20  ame = ?;..      
124c0 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  }....      #..  
124d0 20 20 20 20 23 20 4e 4f 54 45 3a 20 52 65 74 75      # NOTE: Retu
124e0 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74  rn non-zero if t
124f0 68 65 20 6e 61 6d 65 64 20 74 61 62 6c 65 20 69  he named table i
12500 73 20 70 72 65 73 65 6e 74 2e 0d 0a 20 20 20 20  s present...    
12510 20 20 23 0d 0a 20 20 20 20 20 20 72 65 74 75 72    #..      retur
12520 6e 20 5b 65 78 70 72 20 7b 0d 0a 20 20 20 20 20  n [expr {..     
12530 20 20 20 5b 73 71 6c 20 65 78 65 63 75 74 65 20     [sql execute 
12540 2d 65 78 65 63 75 74 65 20 73 63 61 6c 61 72 20  -execute scalar 
12550 24 64 62 20 24 73 71 6c 20 5b 6c 69 73 74 20 70  $db $sql [list p
12560 61 72 61 6d 31 20 53 74 72 69 6e 67 20 24 6e 61  aram1 String $na
12570 6d 65 5d 5d 20 3e 20 30 0d 0a 20 20 20 20 20 20  me]] > 0..      
12580 7d 5d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20  }]..    }.....  
12590 20 20 70 72 6f 63 20 67 65 74 44 62 44 65 66 61    proc getDbDefa
125a0 75 6c 74 50 61 67 65 53 69 7a 65 20 7b 7d 20 7b  ultPageSize {} {
125b0 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b  ..      return [
125c0 65 78 65 63 75 74 65 53 71 6c 20 22 50 52 41 47  executeSql "PRAG
125d0 4d 41 20 70 61 67 65 5f 73 69 7a 65 3b 22 20 73  MA page_size;" s
125e0 63 61 6c 61 72 5d 0d 0a 20 20 20 20 7d 0d 0a 0c  calar]..    }...
125f0 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74 44 62  ..    proc getDb
12600 44 65 66 61 75 6c 74 43 61 63 68 65 53 69 7a 65  DefaultCacheSize
12610 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 72 65 74   {} {..      ret
12620 75 72 6e 20 5b 65 78 65 63 75 74 65 53 71 6c 20  urn [executeSql 
12630 22 50 52 41 47 4d 41 20 63 61 63 68 65 5f 73 69  "PRAGMA cache_si
12640 7a 65 3b 22 20 73 63 61 6c 61 72 5d 0d 0a 20 20  ze;" scalar]..  
12650 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
12660 20 75 73 65 4c 65 67 61 63 79 44 62 50 61 67 65   useLegacyDbPage
12670 41 6e 64 43 61 63 68 65 53 69 7a 65 73 20 7b 20  AndCacheSizes { 
12680 76 61 72 4e 61 6d 65 20 7d 20 7b 0d 0a 20 20 20  varName } {..   
12690 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
126a0 54 45 3a 20 52 65 66 65 72 20 74 6f 20 74 68 65  TE: Refer to the
126b0 20 73 70 65 63 69 66 69 65 64 20 76 61 72 69 61   specified varia
126c0 62 6c 65 20 28 65 2e 67 2e 20 22 64 62 22 29 20  ble (e.g. "db") 
126d0 69 6e 20 74 68 65 20 63 6f 6e 74 65 78 74 20 6f  in the context o
126e0 66 20 6f 75 72 0d 0a 20 20 20 20 20 20 23 20 20  f our..      #  
126f0 20 20 20 20 20 63 61 6c 6c 65 72 2e 20 20 49 74       caller.  It
12700 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 64 61   contains the da
12710 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
12720 6e 20 68 61 6e 64 6c 65 20 74 68 61 74 20 77 69  n handle that wi
12730 6c 6c 20 62 65 0d 0a 20 20 20 20 20 20 23 20 20  ll be..      #  
12740 20 20 20 20 20 75 73 65 64 20 74 6f 20 65 78 65       used to exe
12750 63 75 74 65 20 71 75 65 72 69 65 73 20 75 73 65  cute queries use
12760 64 20 74 6f 20 73 65 74 20 74 68 65 20 70 61 67  d to set the pag
12770 65 20 61 6e 64 20 63 61 63 68 65 20 73 69 7a 65  e and cache size
12780 73 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  s...      #..   
12790 20 20 20 75 70 76 61 72 20 31 20 24 76 61 72 4e     upvar 1 $varN
127a0 61 6d 65 20 64 62 0d 0a 0d 0a 20 20 20 20 20 20  ame db....      
127b0 73 71 6c 20 65 78 65 63 75 74 65 20 24 64 62 20  sql execute $db 
127c0 7b 0d 0a 20 20 20 20 20 20 20 20 50 52 41 47 4d  {..        PRAGM
127d0 41 20 70 61 67 65 5f 73 69 7a 65 20 3d 20 31 30  A page_size = 10
127e0 32 34 3b 0d 0a 20 20 20 20 20 20 20 20 50 52 41  24;..        PRA
127f0 47 4d 41 20 63 61 63 68 65 5f 73 69 7a 65 20 3d  GMA cache_size =
12800 20 32 30 30 30 3b 0d 0a 20 20 20 20 20 20 7d 0d   2000;..      }.
12810 0a 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ...      return 
12820 5b 6c 69 73 74 20 5c 0d 0a 20 20 20 20 20 20 20  [list \..       
12830 20 20 20 5b 73 71 6c 20 65 78 65 63 75 74 65 20     [sql execute 
12840 2d 65 78 65 63 75 74 65 20 73 63 61 6c 61 72 20  -execute scalar 
12850 24 64 62 20 22 50 52 41 47 4d 41 20 70 61 67 65  $db "PRAGMA page
12860 5f 73 69 7a 65 3b 22 5d 20 5c 0d 0a 20 20 20 20  _size;"] \..    
12870 20 20 20 20 20 20 5b 73 71 6c 20 65 78 65 63 75        [sql execu
12880 74 65 20 2d 65 78 65 63 75 74 65 20 73 63 61 6c  te -execute scal
12890 61 72 20 24 64 62 20 22 50 52 41 47 4d 41 20 63  ar $db "PRAGMA c
128a0 61 63 68 65 5f 73 69 7a 65 3b 22 5d 5d 0d 0a 20  ache_size;"]].. 
128b0 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
128c0 63 20 65 78 74 72 61 63 74 53 79 73 74 65 6d 44  c extractSystemD
128d0 61 74 61 53 51 4c 69 74 65 45 78 63 65 70 74 69  ataSQLiteExcepti
128e0 6f 6e 4d 65 73 73 61 67 65 20 7b 20 76 61 6c 75  onMessage { valu
128f0 65 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a  e } {..      #..
12900 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 66        # NOTE: If
12910 20 74 68 65 20 73 74 72 69 6e 67 20 63 6f 6e 66   the string conf
12920 6f 72 6d 73 20 74 6f 20 66 6f 72 6d 61 74 20 6f  orms to format o
12930 66 20 74 68 65 20 6e 6f 72 6d 61 6c 20 65 78 63  f the normal exc
12940 65 70 74 69 6f 6e 0d 0a 20 20 20 20 20 20 23 20  eption..      # 
12950 20 20 20 20 20 20 65 72 72 6f 72 20 73 74 72 69        error stri
12960 6e 67 73 2c 20 65 78 74 72 61 63 74 20 61 6e 64  ngs, extract and
12970 20 72 65 74 75 72 6e 20 6f 6e 6c 79 20 74 68 65   return only the
12980 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0d 0a   error message..
12990 20 20 20 20 20 20 23 20 20 20 20 20 20 20 70 6f        #       po
129a0 72 74 69 6f 6e 20 69 74 73 65 6c 66 2e 0d 0a 20  rtion itself... 
129b0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 73 65       #..      se
129c0 74 20 70 61 74 74 65 72 6e 73 20 5b 6c 69 73 74  t patterns [list
129d0 20 5c 0d 0a 20 20 20 20 20 20 7b 53 79 73 74 65   \..      {Syste
129e0 6d 5c 2e 44 61 74 61 5c 2e 53 51 4c 69 74 65 5c  m\.Data\.SQLite\
129f0 2e 53 51 4c 69 74 65 45 78 63 65 70 74 69 6f 6e  .SQLiteException
12a00 20 5c 28 30 78 38 30 30 30 34 30 30 35 5c 29 3a   \(0x80004005\):
12a10 20 28 2e 2b 3f 29 20 20 28 3f 3a 20 29 3f 61 74   (.+?)  (?: )?at
12a20 7d 20 5c 0d 0a 20 20 20 20 20 20 7b 53 79 73 74  } \..      {Syst
12a30 65 6d 5c 2e 44 61 74 61 5c 2e 53 51 4c 69 74 65  em\.Data\.SQLite
12a40 5c 2e 53 51 4c 69 74 65 45 78 63 65 70 74 69 6f  \.SQLiteExceptio
12a50 6e 3a 20 28 2e 2b 3f 29 20 20 28 3f 3a 20 29 3f  n: (.+?)  (?: )?
12a60 61 74 7d 20 5c 0d 0a 20 20 20 20 20 20 7b 45 61  at} \..      {Ea
12a70 67 6c 65 5c 2e 5f 43 6f 6d 70 6f 6e 65 6e 74 73  gle\._Components
12a80 5c 2e 50 75 62 6c 69 63 5c 2e 53 63 72 69 70 74  \.Public\.Script
12a90 45 78 63 65 70 74 69 6f 6e 3a 20 28 2e 2b 3f 29  Exception: (.+?)
12aa0 20 20 28 3f 3a 20 29 3f 61 74 7d 5d 0d 0a 0d 0a    (?: )?at}]....
12ab0 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 70 61        foreach pa
12ac0 74 74 65 72 6e 20 24 70 61 74 74 65 72 6e 73 20  ttern $patterns 
12ad0 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b  {..        if {[
12ae0 72 65 67 65 78 70 20 2d 2d 20 24 70 61 74 74 65  regexp -- $patte
12af0 72 6e 20 24 76 61 6c 75 65 20 64 75 6d 6d 79 20  rn $value dummy 
12b00 6d 65 73 73 61 67 65 5d 7d 20 74 68 65 6e 20 7b  message]} then {
12b10 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20  ..          set 
12b20 6d 65 73 73 61 67 65 20 5b 73 74 72 69 6e 67 20  message [string 
12b30 6d 61 70 20 5b 6c 69 73 74 20 5c 72 5c 6e 20 5c  map [list \r\n \
12b40 6e 5d 20 5b 73 74 72 69 6e 67 20 74 72 69 6d 20  n] [string trim 
12b50 24 6d 65 73 73 61 67 65 5d 5d 0d 0a 20 20 20 20  $message]]..    
12b60 20 20 20 20 20 20 73 65 74 20 6c 69 6e 65 73 20        set lines 
12b70 5b 73 70 6c 69 74 20 24 6d 65 73 73 61 67 65 20  [split $message 
12b80 5c 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  \n]....         
12b90 20 69 66 20 7b 5b 6c 6c 65 6e 67 74 68 20 24 6c   if {[llength $l
12ba0 69 6e 65 73 5d 20 3d 3d 20 32 7d 20 74 68 65 6e  ines] == 2} then
12bb0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
12bc0 69 66 20 7b 5b 6c 69 6e 64 65 78 20 24 6c 69 6e  if {[lindex $lin
12bd0 65 73 20 30 5d 20 65 71 20 5b 6c 69 6e 64 65 78  es 0] eq [lindex
12be0 20 24 6c 69 6e 65 73 20 31 5d 7d 20 74 68 65 6e   $lines 1]} then
12bf0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
12c00 20 20 72 65 74 75 72 6e 20 5b 6c 69 6e 64 65 78    return [lindex
12c10 20 24 6c 69 6e 65 73 20 30 5d 0d 0a 20 20 20 20   $lines 0]..    
12c20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
12c30 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
12c40 5b 61 70 70 65 6e 64 41 72 67 73 20 5b 6c 69 6e  [appendArgs [lin
12c50 64 65 78 20 24 6c 69 6e 65 73 20 30 5d 20 22 20  dex $lines 0] " 
12c60 2d 2d 20 22 20 5b 6c 69 6e 64 65 78 20 24 6c 69  -- " [lindex $li
12c70 6e 65 73 20 31 5d 5d 0d 0a 20 20 20 20 20 20 20  nes 1]]..       
12c80 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
12c90 20 20 72 65 74 75 72 6e 20 24 6d 65 73 73 61 67    return $messag
12ca0 65 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  e..        }..  
12cb0 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 72      }....      r
12cc0 65 74 75 72 6e 20 24 76 61 6c 75 65 0d 0a 20 20  eturn $value..  
12cd0 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
12ce0 20 74 72 69 6d 53 71 6c 20 7b 20 73 71 6c 20 7d   trimSql { sql }
12cf0 20 7b 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e   {..      return
12d00 20 5b 72 65 67 73 75 62 20 2d 61 6c 6c 20 2d 2d   [regsub -all --
12d10 20 7b 5c 73 2b 7d 20 5b 73 74 72 69 6e 67 20 74   {\s+} [string t
12d20 72 69 6d 20 24 73 71 6c 5d 20 22 20 22 5d 0d 0a  rim $sql] " "]..
12d30 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
12d40 6f 63 20 65 78 65 63 75 74 65 53 71 6c 20 7b 20  oc executeSql { 
12d50 73 71 6c 20 7b 65 78 65 63 75 74 65 20 6e 6f 6e  sql {execute non
12d60 65 7d 20 7b 66 6f 72 6d 61 74 20 6e 6f 6e 65 7d  e} {format none}
12d70 20 7b 66 69 6c 65 4e 61 6d 65 20 22 22 7d 20 7d   {fileName ""} }
12d80 20 7b 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 73   {..      if {[s
12d90 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 66 69  tring length $fi
12da0 6c 65 4e 61 6d 65 5d 20 3d 3d 20 30 7d 20 74 68  leName] == 0} th
12db0 65 6e 20 7b 73 65 74 20 66 69 6c 65 4e 61 6d 65  en {set fileName
12dc0 20 3a 6d 65 6d 6f 72 79 3a 7d 0d 0a 20 20 20 20   :memory:}..    
12dd0 20 20 73 65 74 75 70 44 62 20 24 66 69 6c 65 4e    setupDb $fileN
12de0 61 6d 65 20 22 22 20 22 22 20 22 22 20 22 22 20  ame "" "" "" "" 
12df0 22 22 20 66 61 6c 73 65 20 66 61 6c 73 65 20 66  "" false false f
12e00 61 6c 73 65 20 66 61 6c 73 65 20 64 62 20 74 72  alse false db tr
12e10 75 65 0d 0a 0d 0a 20 20 20 20 20 20 74 72 79 20  ue....      try 
12e20 7b 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  {..        retur
12e30 6e 20 5b 75 70 6c 65 76 65 6c 20 31 20 5b 6c 69  n [uplevel 1 [li
12e40 73 74 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  st \..          
12e50 20 20 73 71 6c 20 65 78 65 63 75 74 65 20 2d 65    sql execute -e
12e60 78 65 63 75 74 65 20 24 65 78 65 63 75 74 65 20  xecute $execute 
12e70 2d 66 6f 72 6d 61 74 20 24 66 6f 72 6d 61 74 20  -format $format 
12e80 24 64 62 20 24 73 71 6c 5d 5d 0d 0a 20 20 20 20  $db $sql]]..    
12e90 20 20 7d 20 66 69 6e 61 6c 6c 79 20 7b 0d 0a 20    } finally {.. 
12ea0 20 20 20 20 20 20 20 73 65 74 20 63 6f 6e 6e 65         set conne
12eb0 63 74 69 6f 6e 20 5b 67 65 74 44 62 43 6f 6e 6e  ction [getDbConn
12ec0 65 63 74 69 6f 6e 5d 0d 0a 0d 0a 20 20 20 20 20  ection]....     
12ed0 20 20 20 74 72 79 20 7b 0d 0a 20 20 20 20 20 20     try {..      
12ee0 20 20 20 20 63 6c 65 61 6e 75 70 44 62 20 24 66      cleanupDb $f
12ef0 69 6c 65 4e 61 6d 65 20 64 62 20 66 61 6c 73 65  ileName db false
12f00 20 66 61 6c 73 65 20 66 61 6c 73 65 0d 0a 20 20   false false..  
12f10 20 20 20 20 20 20 7d 20 66 69 6e 61 6c 6c 79 20        } finally 
12f20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 6f 62 6a  {..          obj
12f30 65 63 74 20 66 6c 61 67 73 20 24 63 6f 6e 6e 65  ect flags $conne
12f40 63 74 69 6f 6e 20 2d 4e 6f 44 69 73 70 6f 73 65  ction -NoDispose
12f50 3b 20 66 72 65 65 44 62 43 6f 6e 6e 65 63 74 69  ; freeDbConnecti
12f60 6f 6e 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20  on..        }.. 
12f70 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c       }..    }...
12f80 0d 0a 20 20 20 20 70 72 6f 63 20 68 61 73 4e 6f  ..    proc hasNo
12f90 46 6c 61 67 73 20 7b 20 76 61 72 4e 61 6d 65 20  Flags { varName 
12fa0 6e 6f 6e 65 20 7d 20 7b 0d 0a 20 20 20 20 20 20  none } {..      
12fb0 75 70 76 61 72 20 31 20 24 76 61 72 4e 61 6d 65  upvar 1 $varName
12fc0 20 66 6c 61 67 73 0d 0a 0d 0a 20 20 20 20 20 20   flags....      
12fd0 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74  if {![info exist
12fe0 73 20 66 6c 61 67 73 5d 7d 20 74 68 65 6e 20 7b  s flags]} then {
12ff0 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ..        return
13000 20 74 72 75 65 0d 0a 20 20 20 20 20 20 7d 0d 0a   true..      }..
13010 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72  ..      if {[str
13020 69 6e 67 20 6c 65 6e 67 74 68 20 24 66 6c 61 67  ing length $flag
13030 73 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d  s] == 0} then {.
13040 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
13050 74 72 75 65 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d  true..      }...
13060 0a 20 20 20 20 20 20 69 66 20 7b 24 6e 6f 6e 65  .      if {$none
13070 20 26 26 20 24 66 6c 61 67 73 20 65 71 20 22 4e   && $flags eq "N
13080 6f 6e 65 22 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  one"} then {..  
13090 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 72 75        return tru
130a0 65 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  e..      }....  
130b0 20 20 20 20 72 65 74 75 72 6e 20 66 61 6c 73 65      return false
130c0 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
130d0 70 72 6f 63 20 67 65 74 43 6f 6e 6e 65 63 74 69  proc getConnecti
130e0 6f 6e 46 6c 61 67 73 20 7b 20 66 69 6c 65 4e 61  onFlags { fileNa
130f0 6d 65 20 66 6c 61 67 73 20 7b 71 75 69 65 74 20  me flags {quiet 
13100 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a 20 20 20 20  false} } {..    
13110 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
13120 45 3a 20 46 69 67 75 72 65 20 6f 75 74 20 77 68  E: Figure out wh
13130 69 63 68 20 64 61 74 61 62 61 73 65 20 66 69 6c  ich database fil
13140 65 20 6e 61 6d 65 20 6f 72 20 63 6f 6e 6e 65 63  e name or connec
13150 74 69 6f 6e 20 73 74 72 69 6e 67 20 74 68 65 73  tion string thes
13160 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  e..      #      
13170 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 6c 61 67   connection flag
13180 73 20 77 69 6c 6c 20 61 63 74 75 61 6c 6c 79 20  s will actually 
13190 61 70 70 6c 79 20 74 6f 2e 20 20 54 68 69 73 20  apply to.  This 
131a0 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79  is not necessary
131b0 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
131c0 69 6e 20 71 75 69 65 74 20 6d 6f 64 65 20 62 65  in quiet mode be
131d0 63 61 75 73 65 20 74 68 69 73 20 69 6e 66 6f 72  cause this infor
131e0 6d 61 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 75  mation is only u
131f0 73 65 64 20 66 6f 72 20 6c 6f 67 67 69 6e 67 0d  sed for logging.
13200 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 61  .      #       a
13210 6e 64 20 72 65 70 6f 72 74 69 6e 67 20 70 75 72  nd reporting pur
13220 70 6f 73 65 73 2e 0d 0a 20 20 20 20 20 20 23 0d  poses...      #.
13230 0a 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69  .      if {!$qui
13240 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  et} then {..    
13250 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20      if {[string 
13260 6c 65 6e 67 74 68 20 24 66 69 6c 65 4e 61 6d 65  length $fileName
13270 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20  ] > 0} then {.. 
13280 20 20 20 20 20 20 20 20 20 73 65 74 20 64 61 74           set dat
13290 61 62 61 73 65 20 5b 61 70 70 65 6e 64 41 72 67  abase [appendArg
132a0 73 20 22 66 69 6c 65 20 6e 61 6d 65 20 5c 22 22  s "file name \""
132b0 20 24 66 69 6c 65 4e 61 6d 65 20 5c 22 5d 0d 0a   $fileName \"]..
132c0 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 69 66          } elseif
132d0 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a   {[info exists :
132e0 3a 64 61 74 61 53 6f 75 72 63 65 5d 20 26 26 20  :dataSource] && 
132f0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 21  \..            !
13300 5b 61 72 72 61 79 20 65 78 69 73 74 73 20 3a 3a  [array exists ::
13310 64 61 74 61 53 6f 75 72 63 65 5d 7d 20 74 68 65  dataSource]} the
13320 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73  n {..          s
13330 65 74 20 64 61 74 61 62 61 73 65 20 5b 61 70 70  et database [app
13340 65 6e 64 41 72 67 73 20 22 64 61 74 61 20 73 6f  endArgs "data so
13350 75 72 63 65 20 5c 22 22 20 24 3a 3a 64 61 74 61  urce \"" $::data
13360 53 6f 75 72 63 65 20 5c 22 5d 0d 0a 20 20 20 20  Source \"]..    
13370 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
13380 20 20 20 20 20 20 20 20 73 65 74 20 64 61 74 61          set data
13390 62 61 73 65 20 3c 75 6e 6b 6e 6f 77 6e 3e 0d 0a  base <unknown>..
133a0 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
133b0 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20   }....      #.. 
133c0 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 45 76 65       # NOTE: Eve
133d0 6e 20 74 68 6f 75 67 68 20 74 68 65 72 65 20 69  n though there i
133e0 73 20 6f 6e 6c 79 20 6f 6e 65 20 73 6f 75 72 63  s only one sourc
133f0 65 20 6f 66 20 66 6c 61 67 73 20 73 6f 20 66 61  e of flags so fa
13400 72 2c 20 74 68 65 79 0d 0a 20 20 20 20 20 20 23  r, they..      #
13410 20 20 20 20 20 20 20 6d 75 73 74 20 62 65 20 63         must be c
13420 6f 6d 62 69 6e 65 64 20 75 73 69 6e 67 20 74 68  ombined using th
13430 65 20 63 6f 72 72 65 63 74 20 73 79 6e 74 61 78  e correct syntax
13440 20 66 6f 72 20 65 6e 75 6d 65 72 61 74 65 64 0d   for enumerated.
13450 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 66  .      #       f
13460 6c 61 67 20 76 61 6c 75 65 73 20 66 6f 72 20 74  lag values for t
13470 68 65 20 2e 4e 45 54 20 46 72 61 6d 65 77 6f 72  he .NET Framewor
13480 6b 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  k...      #..   
13490 20 20 20 73 65 74 20 66 6c 61 67 73 20 5b 63 6f     set flags [co
134a0 6d 62 69 6e 65 46 6c 61 67 73 20 24 66 6c 61 67  mbineFlags $flag
134b0 73 20 22 22 5d 0d 0a 0d 0a 20 20 20 20 20 20 23  s ""]....      #
134c0 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
134d0 53 68 6f 77 20 28 61 6e 64 20 6c 6f 67 29 20 74  Show (and log) t
134e0 68 65 20 6c 6f 63 61 6c 20 63 6f 6e 6e 65 63 74  he local connect
134f0 69 6f 6e 20 66 6c 61 67 73 20 61 6e 64 20 74 68  ion flags and th
13500 65 20 61 73 73 6f 63 69 61 74 65 64 0d 0a 20 20  e associated..  
13510 20 20 20 20 23 20 20 20 20 20 20 20 64 61 74 61      #       data
13520 20 73 6f 75 72 63 65 20 6f 72 20 66 69 6c 65 20   source or file 
13530 6e 61 6d 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  name...      #..
13540 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65        if {!$quie
13550 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  t} then {..     
13560 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78     if {![info ex
13570 69 73 74 73 20 3a 3a 6e 6f 28 65 6d 69 74 4c 6f  ists ::no(emitLo
13580 63 61 6c 46 6c 61 67 73 29 5d 20 26 26 20 5c 0d  calFlags)] && \.
13590 0a 20 20 20 20 20 20 20 20 20 20 20 20 28 21 5b  .            (![
135a0 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f  info exists ::no
135b0 28 65 6d 69 74 4c 6f 63 61 6c 46 6c 61 67 73 49  (emitLocalFlagsI
135c0 66 4e 6f 6e 65 29 5d 20 7c 7c 20 5c 0d 0a 20 20  fNone)] || \..  
135d0 20 20 20 20 20 20 20 20 20 20 20 21 5b 68 61 73             ![has
135e0 4e 6f 46 6c 61 67 73 20 66 6c 61 67 73 20 66 61  NoFlags flags fa
135f0 6c 73 65 5d 29 7d 20 74 68 65 6e 20 7b 0d 0a 20  lse])} then {.. 
13600 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
13610 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b  ::test_channel [
13620 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
13630 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
13640 2d 20 6c 6f 63 61 6c 20 63 6f 6e 6e 65 63 74 69  - local connecti
13650 6f 6e 20 66 6c 61 67 73 20 66 6f 72 20 22 20 24  on flags for " $
13660 64 61 74 61 62 61 73 65 20 5c 0d 0a 20 20 20 20  database \..    
13670 20 20 20 20 20 20 20 20 20 20 22 20 61 72 65 3a            " are:
13680 20 22 20 5b 65 78 70 72 20 7b 21 5b 68 61 73 4e   " [expr {![hasN
13690 6f 46 6c 61 67 73 20 66 6c 61 67 73 20 66 61 6c  oFlags flags fal
136a0 73 65 5d 20 3f 20 5c 0d 0a 20 20 20 20 20 20 20  se] ? \..       
136b0 20 20 20 20 20 20 20 5b 61 70 70 65 6e 64 41 72         [appendAr
136c0 67 73 20 5c 22 20 24 66 6c 61 67 73 20 5c 22 5d  gs \" $flags \"]
136d0 20 3a 20 22 3c 6e 6f 6e 65 3e 22 7d 5d 20 5c 6e   : "<none>"}] \n
136e0 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  ]..        }..  
136f0 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23      }....      #
13700 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
13710 53 68 6f 77 20 28 61 6e 64 20 6c 6f 67 29 20 74  Show (and log) t
13720 68 65 20 73 68 61 72 65 64 20 63 6f 6e 6e 65 63  he shared connec
13730 74 69 6f 6e 20 66 6c 61 67 73 2e 0d 0a 20 20 20  tion flags...   
13740 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
13750 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d  !$quiet} then {.
13760 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61  .        if {[ca
13770 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  tch {..         
13780 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 53   object invoke S
13790 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
137a0 65 2e 53 51 4c 69 74 65 43 6f 6e 6e 65 63 74 69  e.SQLiteConnecti
137b0 6f 6e 20 53 68 61 72 65 64 46 6c 61 67 73 0d 0a  on SharedFlags..
137c0 20 20 20 20 20 20 20 20 7d 20 73 68 61 72 65 64          } shared
137d0 46 6c 61 67 73 5d 20 3d 3d 20 30 7d 20 74 68 65  Flags] == 0} the
137e0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69  n {..          i
137f0 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73  f {![info exists
13800 20 3a 3a 6e 6f 28 65 6d 69 74 53 68 61 72 65 64   ::no(emitShared
13810 46 6c 61 67 73 29 5d 20 26 26 20 5c 0d 0a 20 20  Flags)] && \..  
13820 20 20 20 20 20 20 20 20 20 20 20 20 28 21 5b 69              (![i
13830 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28  nfo exists ::no(
13840 65 6d 69 74 53 68 61 72 65 64 46 6c 61 67 73 49  emitSharedFlagsI
13850 66 4e 6f 6e 65 29 5d 20 7c 7c 20 5c 0d 0a 20 20  fNone)] || \..  
13860 20 20 20 20 20 20 20 20 20 20 20 20 20 21 5b 68               ![h
13870 61 73 4e 6f 46 6c 61 67 73 20 73 68 61 72 65 64  asNoFlags shared
13880 46 6c 61 67 73 20 74 72 75 65 5d 29 7d 20 74 68  Flags true])} th
13890 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
138a0 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
138b0 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
138c0 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
138d0 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 73 68 61         "---- sha
138e0 72 65 64 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66  red connection f
138f0 6c 61 67 73 20 66 6f 72 20 22 20 24 64 61 74 61  lags for " $data
13900 62 61 73 65 20 5c 0d 0a 20 20 20 20 20 20 20 20  base \..        
13910 20 20 20 20 20 20 20 20 22 20 61 72 65 3a 20 22          " are: "
13920 20 5b 65 78 70 72 20 7b 21 5b 68 61 73 4e 6f 46   [expr {![hasNoF
13930 6c 61 67 73 20 73 68 61 72 65 64 46 6c 61 67 73  lags sharedFlags
13940 20 74 72 75 65 5d 20 3f 20 5c 0d 0a 20 20 20 20   true] ? \..    
13950 20 20 20 20 20 20 20 20 20 20 20 20 5b 61 70 70              [app
13960 65 6e 64 41 72 67 73 20 5c 22 20 24 73 68 61 72  endArgs \" $shar
13970 65 64 46 6c 61 67 73 20 5c 22 5d 20 3a 20 22 3c  edFlags \"] : "<
13980 6e 6f 6e 65 3e 22 7d 5d 20 5c 6e 5d 0d 0a 20 20  none>"}] \n]..  
13990 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
139a0 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
139b0 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66         if {![inf
139c0 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 65 6d  o exists ::no(em
139d0 69 74 53 68 61 72 65 64 46 6c 61 67 73 29 5d 20  itSharedFlags)] 
139e0 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  && \..          
139f0 20 20 20 20 21 5b 69 6e 66 6f 20 65 78 69 73 74      ![info exist
13a00 73 20 3a 3a 6e 6f 28 65 6d 69 74 53 68 61 72 65  s ::no(emitShare
13a10 64 46 6c 61 67 73 49 66 55 6e 61 76 61 69 6c 61  dFlagsIfUnavaila
13a20 62 6c 65 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  ble)]} then {.. 
13a30 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
13a40 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
13a50 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
13a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13a70 22 2d 2d 2d 2d 20 73 68 61 72 65 64 20 63 6f 6e  "---- shared con
13a80 6e 65 63 74 69 6f 6e 20 66 6c 61 67 73 20 66 6f  nection flags fo
13a90 72 20 22 20 24 64 61 74 61 62 61 73 65 20 5c 0d  r " $database \.
13aa0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
13ab0 20 22 20 61 72 65 3a 20 3c 75 6e 61 76 61 69 6c   " are: <unavail
13ac0 61 62 6c 65 3e 5c 6e 22 5d 0d 0a 20 20 20 20 20  able>\n"]..     
13ad0 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
13ae0 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  }..      }....  
13af0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
13b00 4f 54 45 3a 20 53 68 6f 77 20 28 61 6e 64 20 6c  OTE: Show (and l
13b10 6f 67 29 20 74 68 65 20 64 65 74 65 63 74 65 64  og) the detected
13b20 20 67 6c 6f 62 61 6c 20 63 6f 6e 6e 65 63 74 69   global connecti
13b30 6f 6e 20 66 6c 61 67 73 2c 20 69 66 20 61 6e 79  on flags, if any
13b40 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
13b50 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74    if {!$quiet} t
13b60 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 69  hen {..        i
13b70 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73  f {![info exists
13b80 20 3a 3a 6e 6f 28 65 6d 69 74 47 6c 6f 62 61 6c   ::no(emitGlobal
13b90 46 6c 61 67 73 29 5d 20 26 26 20 5c 0d 0a 20 20  Flags)] && \..  
13ba0 20 20 20 20 20 20 20 20 20 20 28 21 5b 69 6e 66            (![inf
13bb0 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 65 6d  o exists ::no(em
13bc0 69 74 47 6c 6f 62 61 6c 46 6c 61 67 73 49 66 4e  itGlobalFlagsIfN
13bd0 6f 6e 65 29 5d 20 7c 7c 20 5c 0d 0a 20 20 20 20  one)] || \..    
13be0 20 20 20 20 20 20 20 20 20 21 5b 68 61 73 4e 6f           ![hasNo
13bf0 46 6c 61 67 73 20 3a 3a 63 6f 6e 6e 65 63 74 69  Flags ::connecti
13c00 6f 6e 5f 66 6c 61 67 73 20 66 61 6c 73 65 5d 29  on_flags false])
13c10 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
13c20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
13c30 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e  t_channel [appen
13c40 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
13c50 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 67 6c 6f         "---- glo
13c60 62 61 6c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66  bal connection f
13c70 6c 61 67 73 20 61 72 65 3a 20 22 20 5c 0d 0a 20  lags are: " \.. 
13c80 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 65 78               [ex
13c90 70 72 20 7b 21 5b 68 61 73 4e 6f 46 6c 61 67 73  pr {![hasNoFlags
13ca0 20 3a 3a 63 6f 6e 6e 65 63 74 69 6f 6e 5f 66 6c   ::connection_fl
13cb0 61 67 73 20 66 61 6c 73 65 5d 20 3f 20 5c 0d 0a  ags false] ? \..
13cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 61                [a
13cd0 70 70 65 6e 64 41 72 67 73 20 5c 22 20 24 3a 3a  ppendArgs \" $::
13ce0 63 6f 6e 6e 65 63 74 69 6f 6e 5f 66 6c 61 67 73  connection_flags
13cf0 20 5c 22 5d 20 3a 20 22 3c 6e 6f 6e 65 3e 22 7d   \"] : "<none>"}
13d00 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 7d  ] \n]..        }
13d10 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
13d20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
13d30 54 45 3a 20 49 66 20 74 68 65 72 65 20 61 72 65  TE: If there are
13d40 20 61 6e 79 20 67 6c 6f 62 61 6c 20 28 70 65 72   any global (per
13d50 20 74 65 73 74 20 72 75 6e 29 20 63 6f 6e 6e 65   test run) conne
13d60 63 74 69 6f 6e 20 66 6c 61 67 73 20 63 75 72 72  ction flags curr
13d70 65 6e 74 6c 79 0d 0a 20 20 20 20 20 20 23 20 20  ently..      #  
13d80 20 20 20 20 20 73 65 74 2c 20 75 73 65 20 74 68       set, use th
13d90 65 6d 20 6e 6f 77 20 28 69 2e 65 2e 20 62 79 20  em now (i.e. by 
13da0 63 6f 6d 62 69 6e 69 6e 67 20 74 68 65 6d 20 77  combining them w
13db0 69 74 68 20 74 68 65 20 6f 6e 65 73 20 66 6f 72  ith the ones for
13dc0 20 74 68 69 73 0d 0a 20 20 20 20 20 20 23 20 20   this..      #  
13dd0 20 20 20 20 20 63 6f 6e 6e 65 63 74 69 6f 6e 29       connection)
13de0 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
13df0 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73    if {[info exis
13e00 74 73 20 3a 3a 63 6f 6e 6e 65 63 74 69 6f 6e 5f  ts ::connection_
13e10 66 6c 61 67 73 5d 7d 20 74 68 65 6e 20 7b 0d 0a  flags]} then {..
13e20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
13e30 20 20 20 23 20 4e 4f 54 45 3a 20 43 6f 6d 62 69     # NOTE: Combi
13e40 6e 65 20 61 6e 64 2f 6f 72 20 72 65 70 6c 61 63  ne and/or replac
13e50 65 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  e the connection
13e60 20 66 6c 61 67 73 20 61 6e 64 20 74 68 65 6e 20   flags and then 
13e70 73 68 6f 77 20 74 68 65 0d 0a 20 20 20 20 20 20  show the..      
13e80 20 20 23 20 20 20 20 20 20 20 6e 65 77 20 76 61    #       new va
13e90 6c 75 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  lue...        #.
13ea0 0a 20 20 20 20 20 20 20 20 73 65 74 20 66 6c 61  .        set fla
13eb0 67 73 20 5b 63 6f 6d 62 69 6e 65 46 6c 61 67 73  gs [combineFlags
13ec0 20 24 66 6c 61 67 73 20 24 3a 3a 63 6f 6e 6e 65   $flags $::conne
13ed0 63 74 69 6f 6e 5f 66 6c 61 67 73 5d 0d 0a 0d 0a  ction_flags]....
13ee0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
13ef0 20 20 20 23 20 4e 4f 54 45 3a 20 53 68 6f 77 20     # NOTE: Show 
13f00 28 61 6e 64 20 6c 6f 67 29 20 74 68 65 20 6e 65  (and log) the ne
13f10 77 20 65 66 66 65 63 74 69 76 65 20 63 6f 6e 6e  w effective conn
13f20 65 63 74 69 6f 6e 20 66 6c 61 67 73 2e 0d 0a 20  ection flags... 
13f30 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
13f40 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74    if {!$quiet} t
13f50 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
13f60 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73   if {![info exis
13f70 74 73 20 3a 3a 6e 6f 28 65 6d 69 74 43 6f 6d 62  ts ::no(emitComb
13f80 69 6e 65 64 46 6c 61 67 73 29 5d 20 26 26 20 5c  inedFlags)] && \
13f90 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
13fa0 28 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a  (![info exists :
13fb0 3a 6e 6f 28 65 6d 69 74 43 6f 6d 62 69 6e 65 64  :no(emitCombined
13fc0 46 6c 61 67 73 49 66 4e 6f 6e 65 29 5d 20 7c 7c  FlagsIfNone)] ||
13fd0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
13fe0 20 20 20 21 5b 68 61 73 4e 6f 46 6c 61 67 73 20     ![hasNoFlags 
13ff0 66 6c 61 67 73 20 66 61 6c 73 65 5d 29 7d 20 74  flags false])} t
14000 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
14010 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
14020 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  _channel [append
14030 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
14040 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 6f          "---- co
14050 6d 62 69 6e 65 64 20 63 6f 6e 6e 65 63 74 69 6f  mbined connectio
14060 6e 20 66 6c 61 67 73 20 66 6f 72 20 22 20 24 64  n flags for " $d
14070 61 74 61 62 61 73 65 20 5c 0d 0a 20 20 20 20 20  atabase \..     
14080 20 20 20 20 20 20 20 20 20 20 20 22 20 61 72 65             " are
14090 3a 20 22 20 5b 65 78 70 72 20 7b 21 5b 68 61 73  : " [expr {![has
140a0 4e 6f 46 6c 61 67 73 20 66 6c 61 67 73 20 66 61  NoFlags flags fa
140b0 6c 73 65 5d 20 3f 20 5c 0d 0a 20 20 20 20 20 20  lse] ? \..      
140c0 20 20 20 20 20 20 20 20 20 20 5b 61 70 70 65 6e            [appen
140d0 64 41 72 67 73 20 5c 22 20 24 66 6c 61 67 73 20  dArgs \" $flags 
140e0 5c 22 5d 20 3a 20 22 3c 6e 6f 6e 65 3e 22 7d 5d  \"] : "<none>"}]
140f0 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20   \n]..          
14100 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  }..        }..  
14110 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 72      }....      r
14120 65 74 75 72 6e 20 24 66 6c 61 67 73 0d 0a 20 20  eturn $flags..  
14130 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
14140 20 67 65 74 46 6c 61 67 73 50 72 6f 70 65 72 74   getFlagsPropert
14150 79 20 7b 20 7b 66 6c 61 67 73 20 22 22 7d 20 7b  y { {flags ""} {
14160 71 75 69 65 74 20 66 61 6c 73 65 7d 20 7d 20 7b  quiet false} } {
14170 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
14180 20 23 20 4e 4f 54 45 3a 20 44 65 74 65 72 6d 69   # NOTE: Determi
14190 6e 65 20 77 68 61 74 20 74 68 65 20 63 6f 6d 62  ne what the comb
141a0 69 6e 65 64 20 28 67 6c 6f 62 61 6c 20 61 6e 64  ined (global and
141b0 20 6c 6f 63 61 6c 29 20 63 6f 6e 6e 65 63 74 69   local) connecti
141c0 6f 6e 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  on..      #     
141d0 20 20 66 6c 61 67 73 20 73 68 6f 75 6c 64 20 62    flags should b
141e0 65 2c 20 70 6f 73 73 69 62 6c 79 20 71 75 69 65  e, possibly quie
141f0 74 6c 79 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  tly...      #.. 
14200 20 20 20 20 20 73 65 74 20 66 6c 61 67 73 20 5b       set flags [
14210 67 65 74 43 6f 6e 6e 65 63 74 69 6f 6e 46 6c 61  getConnectionFla
14220 67 73 20 22 22 20 24 66 6c 61 67 73 20 24 71 75  gs "" $flags $qu
14230 69 65 74 5d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d  iet]....      #.
14240 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49  .      # NOTE: I
14250 66 20 6e 6f 20 67 6c 6f 62 61 6c 20 6f 72 20 6c  f no global or l
14260 6f 63 61 6c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  ocal connection 
14270 66 6c 61 67 73 20 77 65 72 65 20 73 70 65 63 69  flags were speci
14280 66 69 65 64 2c 20 74 68 65 0d 0a 20 20 20 20 20  fied, the..     
14290 20 23 20 20 20 20 20 20 20 64 65 66 61 75 6c 74   #       default
142a0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 6c 61 67   connection flag
142b0 73 20 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64  s should be used
142c0 3b 20 74 68 65 72 65 66 6f 72 65 2c 20 72 65 74  ; therefore, ret
142d0 75 72 6e 0d 0a 20 20 20 20 20 20 23 20 20 20 20  urn..      #    
142e0 20 20 20 61 6e 20 65 6d 70 74 79 20 73 74 72 69     an empty stri
142f0 6e 67 20 69 6e 20 74 68 61 74 20 63 61 73 65 2e  ng in that case.
14300 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
14310 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e   if {[string len
14320 67 74 68 20 24 66 6c 61 67 73 5d 20 3d 3d 20 30  gth $flags] == 0
14330 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
14340 20 20 72 65 74 75 72 6e 20 22 22 0d 0a 20 20 20    return ""..   
14350 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d     }....      #.
14360 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49  .      # NOTE: I
14370 6e 20 6f 72 64 65 72 20 74 6f 20 63 68 65 63 6b  n order to check
14380 20 69 66 20 74 68 65 20 64 65 66 61 75 6c 74 20   if the default 
14390 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 6c 61 67 73  connection flags
143a0 20 61 72 65 20 62 65 69 6e 67 20 75 73 65 64 0d   are being used.
143b0 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 69  .      #       i
143c0 74 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 74  t is necessary t
143d0 6f 20 61 74 74 65 6d 70 74 20 61 20 63 6f 6e 76  o attempt a conv
143e0 65 72 73 69 6f 6e 20 74 6f 20 74 68 65 20 61 63  ersion to the ac
143f0 74 75 61 6c 20 65 6e 75 6d 65 72 61 74 65 64 0d  tual enumerated.
14400 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74  .      #       t
14410 79 70 65 2e 20 20 46 61 69 6c 69 6e 67 20 74 68  ype.  Failing th
14420 61 74 2c 20 74 68 65 20 63 68 65 63 6b 20 61 67  at, the check ag
14430 61 69 6e 73 74 20 74 68 65 20 64 65 66 61 75 6c  ainst the defaul
14440 74 20 76 61 6c 75 65 20 77 69 6c 6c 20 62 65 0d  t value will be.
14450 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 73  .      #       s
14460 6b 69 70 70 65 64 2e 0d 0a 20 20 20 20 20 20 23  kipped...      #
14470 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74  ..      if {[cat
14480 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 65  ch {..        se
14490 74 20 65 72 72 6f 72 20 6e 75 6c 6c 3b 20 23 20  t error null; # 
144a0 49 47 4e 4f 52 45 44 0d 0a 0d 0a 20 20 20 20 20  IGNORED....     
144b0 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65     object invoke
144c0 20 55 74 69 6c 69 74 79 20 54 72 79 50 61 72 73   Utility TryPars
144d0 65 46 6c 61 67 73 45 6e 75 6d 20 22 22 20 5c 0d  eFlagsEnum "" \.
144e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 53 79 73  .            Sys
144f0 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e  tem.Data.SQLite.
14500 53 51 4c 69 74 65 43 6f 6e 6e 65 63 74 69 6f 6e  SQLiteConnection
14510 46 6c 61 67 73 20 22 22 20 24 66 6c 61 67 73 20  Flags "" $flags 
14520 6e 75 6c 6c 20 74 72 75 65 20 5c 0d 0a 20 20 20  null true \..   
14530 20 20 20 20 20 20 20 20 20 74 72 75 65 20 74 72           true tr
14540 75 65 20 65 72 72 6f 72 0d 0a 20 20 20 20 20 20  ue error..      
14550 7d 20 76 61 6c 75 65 5d 7d 20 74 68 65 6e 20 7b  } value]} then {
14560 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
14570 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 74 74       # NOTE: Att
14580 65 6d 70 74 69 6e 67 20 74 6f 20 70 61 72 73 65  empting to parse
14590 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
145a0 66 6c 61 67 73 20 63 61 75 73 65 64 20 61 20 73  flags caused a s
145b0 63 72 69 70 74 0d 0a 20 20 20 20 20 20 20 20 23  cript..        #
145c0 20 20 20 20 20 20 20 65 72 72 6f 72 2e 20 20 45         error.  E
145d0 6d 69 74 20 61 20 77 61 72 6e 69 6e 67 20 74 6f  mit a warning to
145e0 20 74 68 65 20 74 65 73 74 20 6c 6f 67 20 66 69   the test log fi
145f0 6c 65 20 61 6e 64 20 63 6f 6e 74 69 6e 75 65 0d  le and continue.
14600 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
14610 20 75 73 69 6e 67 20 61 6e 20 65 6d 74 70 79 20   using an emtpy 
14620 73 74 72 69 6e 67 20 69 6e 73 74 65 61 64 2e 0d  string instead..
14630 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
14640 20 20 20 20 74 6c 6f 67 20 5b 61 70 70 65 6e 64      tlog [append
14650 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
14660 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e      "==== WARNIN
14670 47 3a 20 66 61 69 6c 65 64 20 74 6f 20 70 61 72  G: failed to par
14680 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 6c  se connection fl
14690 61 67 73 2c 20 65 72 72 6f 72 3a 20 22 20 5c 0d  ags, error: " \.
146a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 5c 6e 5c  .            \n\
146b0 74 20 24 76 61 6c 75 65 20 5c 6e 5d 0d 0a 0d 0a  t $value \n]....
146c0 20 20 20 20 20 20 20 20 73 65 74 20 76 61 6c 75          set valu
146d0 65 20 22 22 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d  e ""..      }...
146e0 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
146f0 23 20 4e 4f 54 45 3a 20 49 66 20 74 68 65 20 63  # NOTE: If the c
14700 6f 6d 62 69 6e 65 64 20 66 6c 61 67 73 20 73 74  ombined flags st
14710 72 69 6e 67 20 63 6f 75 6c 64 20 6e 6f 74 20 61  ring could not a
14720 63 74 75 61 6c 6c 79 20 62 65 20 63 6f 6e 76 65  ctually be conve
14730 72 74 65 64 0d 0a 20 20 20 20 20 20 23 20 20 20  rted..      #   
14740 20 20 20 20 74 6f 20 74 68 65 20 65 6e 75 6d 65      to the enume
14750 72 61 74 65 64 20 74 79 70 65 20 69 74 20 69 73  rated type it is
14760 20 74 68 65 20 64 65 66 61 75 6c 74 20 76 61 6c   the default val
14770 75 65 2c 20 74 68 65 6e 20 6a 75 73 74 20 75 73  ue, then just us
14780 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  e..      #      
14790 20 69 74 20 76 65 72 62 61 74 69 6d 3b 20 6f 74   it verbatim; ot
147a0 68 65 72 77 69 73 65 2c 20 6a 75 73 74 20 72 65  herwise, just re
147b0 74 75 72 6e 20 61 6e 20 65 6d 70 74 79 20 73 74  turn an empty st
147c0 72 69 6e 67 2e 20 20 49 6e 20 74 68 61 74 0d 0a  ring.  In that..
147d0 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63 61        #       ca
147e0 73 65 2c 20 74 68 65 20 64 65 66 61 75 6c 74 20  se, the default 
147f0 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 6c 61 67 73  connection flags
14800 20 77 69 6c 6c 20 62 65 20 75 73 65 64 2e 0d 0a   will be used...
14810 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69        #..      i
14820 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74  f {[string lengt
14830 68 20 24 76 61 6c 75 65 5d 20 3d 3d 20 30 20 7c  h $value] == 0 |
14840 7c 20 24 76 61 6c 75 65 20 6e 65 20 22 44 65 66  | $value ne "Def
14850 61 75 6c 74 22 7d 20 74 68 65 6e 20 7b 0d 0a 20  ault"} then {.. 
14860 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
14870 20 20 23 20 57 41 52 4e 49 4e 47 3a 20 54 68 69    # WARNING: Thi
14880 73 20 72 65 74 75 72 6e 73 20 74 68 65 20 73 74  s returns the st
14890 72 69 6e 67 20 76 61 6c 75 65 20 6f 66 20 74 68  ring value of th
148a0 65 20 63 6f 6d 62 69 6e 65 64 20 66 6c 61 67 73  e combined flags
148b0 2c 20 6e 6f 74 0d 0a 20 20 20 20 20 20 20 20 23  , not..        #
148c0 20 20 20 20 20 20 20 20 20 20 74 68 65 20 65 6e            the en
148d0 75 6d 65 72 61 74 65 64 20 76 61 6c 75 65 2e 20  umerated value. 
148e0 20 54 68 69 73 20 69 73 20 62 79 20 64 65 73 69   This is by desi
148f0 67 6e 20 61 6e 64 20 73 68 6f 75 6c 64 20 6e 6f  gn and should no
14900 74 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  t..        #    
14910 20 20 20 20 20 20 62 65 20 63 68 61 6e 67 65 64        be changed
14920 20 77 69 74 68 6f 75 74 20 63 61 72 65 66 75 6c   without careful
14930 20 63 6f 6e 73 69 64 65 72 61 74 69 6f 6e 20 28   consideration (
14940 65 2e 67 2e 20 69 74 20 77 6f 75 6c 64 0d 0a 20  e.g. it would.. 
14950 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 20         #        
14960 20 20 70 72 65 76 65 6e 74 20 74 68 65 20 53 51    prevent the SQ
14970 4c 69 74 65 43 6f 6e 6e 65 63 74 69 6f 6e 20 63  LiteConnection c
14980 6c 61 73 73 20 66 72 6f 6d 20 61 6c 6c 6f 77 69  lass from allowi
14990 6e 67 20 69 6e 76 61 6c 69 64 0d 0a 20 20 20 20  ng invalid..    
149a0 20 20 20 20 23 20 20 20 20 20 20 20 20 20 20 5b      #          [
149b0 22 6d 61 67 69 63 61 6c 22 5d 20 6d 65 74 61 2d  "magical"] meta-
149c0 66 6c 61 67 73 29 2e 0d 0a 20 20 20 20 20 20 20  flags)...       
149d0 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75   #..        retu
149e0 72 6e 20 5b 61 70 70 65 6e 64 41 72 67 73 20 22  rn [appendArgs "
149f0 46 6c 61 67 73 3d 22 20 24 66 6c 61 67 73 20 5c  Flags=" $flags \
14a00 3b 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  ;]..      }.... 
14a10 20 20 20 20 20 72 65 74 75 72 6e 20 22 22 0d 0a       return ""..
14a20 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
14a30 6f 63 20 65 6e 61 62 6c 65 53 68 61 72 65 64 43  oc enableSharedC
14a40 61 63 68 65 20 7b 20 63 68 61 6e 6e 65 6c 20 65  ache { channel e
14a50 6e 61 62 6c 65 20 7b 71 75 69 65 74 20 66 61 6c  nable {quiet fal
14a60 73 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 69  se} } {..      i
14a70 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20  f {[catch {..   
14a80 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f       object invo
14a90 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75  ke -flags +NonPu
14aa0 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20 20 20  blic \..        
14ab0 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e      System.Data.
14ac0 53 51 4c 69 74 65 2e 55 6e 73 61 66 65 4e 61 74  SQLite.UnsafeNat
14ad0 69 76 65 4d 65 74 68 6f 64 73 20 5c 0d 0a 20 20  iveMethods \..  
14ae0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
14af0 33 5f 65 6e 61 62 6c 65 5f 73 68 61 72 65 64 5f  3_enable_shared_
14b00 63 61 63 68 65 20 5b 65 78 70 72 20 69 6e 74 28  cache [expr int(
14b10 24 65 6e 61 62 6c 65 29 5d 0d 0a 20 20 20 20 20  $enable)]..     
14b20 20 7d 20 72 65 73 75 6c 74 5d 20 3d 3d 20 30 7d   } result] == 0}
14b30 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
14b40 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68   if {!$quiet} th
14b50 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
14b60 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b  tputs $channel [
14b70 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
14b80 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
14b90 2d 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 5f 65  - call sqlite3_e
14ba0 6e 61 62 6c 65 5f 73 68 61 72 65 64 5f 63 61 63  nable_shared_cac
14bb0 68 65 28 22 20 24 65 6e 61 62 6c 65 20 5c 0d 0a  he(" $enable \..
14bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 29                ")
14bd0 2e 2e 2e 20 6f 6b 3a 20 22 20 24 72 65 73 75 6c  ... ok: " $resul
14be0 74 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 7d  t \n]..        }
14bf0 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b  ..      } else {
14c00 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21 24  ..        if {!$
14c10 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20  quiet} then {.. 
14c20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
14c30 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
14c40 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
14c50 20 20 20 20 20 22 2d 2d 2d 2d 20 63 61 6c 6c 20       "---- call 
14c60 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 73  sqlite3_enable_s
14c70 68 61 72 65 64 5f 63 61 63 68 65 28 22 20 24 65  hared_cache(" $e
14c80 6e 61 62 6c 65 20 5c 0d 0a 20 20 20 20 20 20 20  nable \..       
14c90 20 20 20 20 20 20 20 22 29 2e 2e 2e 20 65 72 72         ")... err
14ca0 6f 72 3a 20 22 20 5c 6e 5c 74 20 24 72 65 73 75  or: " \n\t $resu
14cb0 6c 74 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20  lt \n]..        
14cc0 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  }..      }..    
14cd0 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 73  }.....    proc s
14ce0 65 74 75 70 44 62 20 7b 0d 0a 20 20 20 20 20 20  etupDb {..      
14cf0 20 20 20 20 20 20 66 69 6c 65 4e 61 6d 65 20 7b        fileName {
14d00 6d 6f 64 65 20 22 22 7d 20 7b 64 61 74 65 54 69  mode ""} {dateTi
14d10 6d 65 46 6f 72 6d 61 74 20 22 22 7d 20 7b 64 61  meFormat ""} {da
14d20 74 65 54 69 6d 65 4b 69 6e 64 20 22 22 7d 20 7b  teTimeKind ""} {
14d30 66 6c 61 67 73 20 22 22 7d 0d 0a 20 20 20 20 20  flags ""}..     
14d40 20 20 20 20 20 20 20 7b 65 78 74 72 61 20 22 22         {extra ""
14d50 7d 20 7b 71 75 61 6c 69 66 79 20 74 72 75 65 7d  } {qualify true}
14d60 20 7b 64 65 6c 65 74 65 20 74 72 75 65 7d 20 7b   {delete true} {
14d70 75 72 69 20 66 61 6c 73 65 7d 0d 0a 20 20 20 20  uri false}..    
14d80 20 20 20 20 20 20 20 20 7b 74 65 6d 70 6f 72 61          {tempora
14d90 72 79 20 74 72 75 65 7d 20 7b 76 61 72 4e 61 6d  ry true} {varNam
14da0 65 20 64 62 7d 20 7b 71 75 69 65 74 20 66 61 6c  e db} {quiet fal
14db0 73 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23  se} } {..      #
14dc0 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
14dd0 46 69 72 73 74 2c 20 73 65 65 20 69 66 20 6f 75  First, see if ou
14de0 72 20 63 61 6c 6c 65 72 20 68 61 73 20 72 65 71  r caller has req
14df0 75 65 73 74 65 64 20 61 6e 20 69 6e 2d 6d 65 6d  uested an in-mem
14e00 6f 72 79 20 64 61 74 61 62 61 73 65 2e 0d 0a 20  ory database... 
14e10 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 73 65       #..      se
14e20 74 20 69 73 4d 65 6d 6f 72 79 20 5b 69 73 4d 65  t isMemory [isMe
14e30 6d 6f 72 79 44 62 20 24 66 69 6c 65 4e 61 6d 65  moryDb $fileName
14e40 5d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  ]....      #..  
14e50 20 20 20 20 23 20 4e 4f 54 45 3a 20 46 6f 72 20      # NOTE: For 
14e60 6e 6f 77 2c 20 61 6c 6c 20 74 65 73 74 20 64 61  now, all test da
14e70 74 61 62 61 73 65 73 20 75 73 65 64 20 62 79 20  tabases used by 
14e80 74 68 65 20 74 65 73 74 20 73 75 69 74 65 20 61  the test suite a
14e90 72 65 20 70 6c 61 63 65 64 0d 0a 20 20 20 20 20  re placed..     
14ea0 20 23 20 20 20 20 20 20 20 69 6e 74 6f 20 74 68   #       into th
14eb0 65 20 64 61 74 61 62 61 73 65 20 64 69 72 65 63  e database direc
14ec0 74 6f 72 79 2e 20 20 45 61 63 68 20 64 61 74 61  tory.  Each data
14ed0 62 61 73 65 20 61 6e 64 20 72 65 6c 61 74 65 64  base and related
14ee0 20 66 69 6c 65 73 0d 0a 20 20 20 20 20 20 23 20   files..      # 
14ef0 20 20 20 20 20 20 75 73 65 64 20 62 79 20 61 20        used by a 
14f00 74 65 73 74 20 73 68 6f 75 6c 64 20 62 65 20 63  test should be c
14f10 6c 65 61 6e 65 64 20 75 70 20 62 79 20 74 68 61  leaned up by tha
14f20 74 20 74 65 73 74 20 75 73 69 6e 67 20 74 68 65  t test using the
14f30 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
14f40 22 63 6c 65 61 6e 75 70 44 62 22 20 70 72 6f 63  "cleanupDb" proc
14f50 65 64 75 72 65 2c 20 62 65 6c 6f 77 2e 0d 0a 20  edure, below... 
14f60 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66       #..      if
14f70 20 7b 21 24 69 73 4d 65 6d 6f 72 79 20 26 26 20   {!$isMemory && 
14f80 24 71 75 61 6c 69 66 79 7d 20 74 68 65 6e 20 7b  $qualify} then {
14f90 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 66 69  ..        set fi
14fa0 6c 65 4e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69  leName [file joi
14fb0 6e 20 5b 67 65 74 44 61 74 61 62 61 73 65 44 69  n [getDatabaseDi
14fc0 72 65 63 74 6f 72 79 5d 20 5b 66 69 6c 65 20 74  rectory] [file t
14fd0 61 69 6c 20 24 66 69 6c 65 4e 61 6d 65 5d 5d 0d  ail $fileName]].
14fe0 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
14ff0 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
15000 45 3a 20 42 79 20 64 65 66 61 75 6c 74 2c 20 64  E: By default, d
15010 65 6c 65 74 65 20 61 6e 79 20 70 72 65 2d 65 78  elete any pre-ex
15020 69 73 74 69 6e 67 20 64 61 74 61 62 61 73 65 20  isting database 
15030 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 66 69  with the same fi
15040 6c 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  le..      #     
15050 20 20 6e 61 6d 65 20 69 66 20 69 74 20 63 75 72    name if it cur
15060 72 65 6e 74 6c 79 20 65 78 69 73 74 73 2e 0d 0a  rently exists...
15070 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69        #..      i
15080 66 20 7b 21 24 69 73 4d 65 6d 6f 72 79 20 26 26  f {!$isMemory &&
15090 20 24 64 65 6c 65 74 65 20 26 26 20 5b 66 69 6c   $delete && [fil
150a0 65 20 65 78 69 73 74 73 20 24 66 69 6c 65 4e 61  e exists $fileNa
150b0 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  me]} then {..   
150c0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
150d0 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74 20  # NOTE: Attempt 
150e0 74 6f 20 64 65 6c 65 74 65 20 61 6e 79 20 70 72  to delete any pr
150f0 65 2d 65 78 69 73 74 69 6e 67 20 64 61 74 61 62  e-existing datab
15100 61 73 65 20 77 69 74 68 20 74 68 65 20 73 61 6d  ase with the sam
15110 65 20 66 69 6c 65 0d 0a 20 20 20 20 20 20 20 20  e file..        
15120 23 20 20 20 20 20 20 20 6e 61 6d 65 2e 0d 0a 20  #       name... 
15130 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
15140 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 66 69    if {[catch {fi
15150 6c 65 20 64 65 6c 65 74 65 20 24 66 69 6c 65 4e  le delete $fileN
15160 61 6d 65 7d 20 65 72 72 6f 72 5d 7d 20 74 68 65  ame} error]} the
15170 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 23  n {..          #
15180 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f  ..          # NO
15190 54 45 3a 20 57 65 20 73 6f 6d 65 68 6f 77 20 66  TE: We somehow f
151a0 61 69 6c 65 64 20 74 6f 20 64 65 6c 65 74 65 20  ailed to delete 
151b0 74 68 65 20 66 69 6c 65 2c 20 72 65 70 6f 72 74  the file, report
151c0 20 77 68 79 2e 0d 0a 20 20 20 20 20 20 20 20 20   why...         
151d0 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66   #..          if
151e0 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20   {!$quiet} then 
151f0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  {..            t
15200 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
15210 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
15220 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
15230 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e      "==== WARNIN
15240 47 3a 20 66 61 69 6c 65 64 20 74 6f 20 64 65 6c  G: failed to del
15250 65 74 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  ete database fil
15260 65 20 5c 22 22 20 24 66 69 6c 65 4e 61 6d 65 20  e \"" $fileName 
15270 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
15280 20 20 20 22 5c 22 20 64 75 72 69 6e 67 20 73 65     "\" during se
15290 74 75 70 2c 20 65 72 72 6f 72 3a 20 22 20 5c 6e  tup, error: " \n
152a0 5c 74 20 24 65 72 72 6f 72 20 5c 6e 5d 0d 0a 20  \t $error \n].. 
152b0 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
152c0 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a      }..      }..
152d0 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
152e0 20 23 20 4e 4f 54 45 3a 20 52 65 66 65 72 20 74   # NOTE: Refer t
152f0 6f 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  o the specified 
15300 76 61 72 69 61 62 6c 65 20 28 65 2e 67 2e 20 22  variable (e.g. "
15310 64 62 22 29 20 69 6e 20 74 68 65 20 63 6f 6e 74  db") in the cont
15320 65 78 74 20 6f 66 20 6f 75 72 0d 0a 20 20 20 20  ext of our..    
15330 20 20 23 20 20 20 20 20 20 20 63 61 6c 6c 65 72    #       caller
15340 2e 20 20 54 68 65 20 68 61 6e 64 6c 65 20 74 6f  .  The handle to
15350 20 74 68 65 20 6f 70 65 6e 65 64 20 64 61 74 61   the opened data
15360 62 61 73 65 20 77 69 6c 6c 20 62 65 20 73 74 6f  base will be sto
15370 72 65 64 20 74 68 65 72 65 2e 0d 0a 20 20 20 20  red there...    
15380 20 20 23 0d 0a 20 20 20 20 20 20 75 70 76 61 72    #..      upvar
15390 20 31 20 24 76 61 72 4e 61 6d 65 20 64 62 0d 0a   1 $varName db..
153a0 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
153b0 20 23 20 4e 4f 54 45 3a 20 53 74 61 72 74 20 62   # NOTE: Start b
153c0 75 69 6c 64 69 6e 67 20 74 68 65 20 63 6f 6e 6e  uilding the conn
153d0 65 63 74 69 6f 6e 20 73 74 72 69 6e 67 2e 20 20  ection string.  
153e0 54 68 65 20 6f 6e 6c 79 20 72 65 71 75 69 72 65  The only require
153f0 64 20 70 6f 72 74 69 6f 6e 0d 0a 20 20 20 20 20  d portion..     
15400 20 23 20 20 20 20 20 20 20 6f 66 20 74 68 65 20   #       of the 
15410 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 74 72 69 6e  connection strin
15420 67 20 69 73 20 74 68 65 20 64 61 74 61 20 73 6f  g is the data so
15430 75 72 63 65 2c 20 77 68 69 63 68 20 63 6f 6e 74  urce, which cont
15440 61 69 6e 73 20 74 68 65 0d 0a 20 20 20 20 20 20  ains the..      
15450 23 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65  #       database
15460 20 66 69 6c 65 20 6e 61 6d 65 20 69 74 73 65 6c   file name itsel
15470 66 2e 20 20 49 66 20 6f 75 72 20 63 61 6c 6c 65  f.  If our calle
15480 72 20 77 61 6e 74 73 20 74 6f 20 75 73 65 20 61  r wants to use a
15490 20 55 52 49 20 61 73 0d 0a 20 20 20 20 20 20 23   URI as..      #
154a0 20 20 20 20 20 20 20 74 68 65 20 64 61 74 61 20         the data 
154b0 73 6f 75 72 63 65 2c 20 75 73 65 20 74 68 65 20  source, use the 
154c0 46 75 6c 6c 55 72 69 20 63 6f 6e 6e 65 63 74 69  FullUri connecti
154d0 6f 6e 20 73 74 72 69 6e 67 20 70 72 6f 70 65 72  on string proper
154e0 74 79 20 74 6f 0d 0a 20 20 20 20 20 20 23 20 20  ty to..      #  
154f0 20 20 20 20 20 70 72 65 76 65 6e 74 20 74 68 65       prevent the
15500 20 64 61 74 61 20 73 6f 75 72 63 65 20 73 74 72   data source str
15510 69 6e 67 20 66 72 6f 6d 20 62 65 69 6e 67 20 6d  ing from being m
15520 61 6e 67 6c 65 64 2e 0d 0a 20 20 20 20 20 20 23  angled...      #
15530 0d 0a 20 20 20 20 20 20 69 66 20 7b 24 75 72 69  ..      if {$uri
15540 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
15550 20 20 73 65 74 20 63 6f 6e 6e 65 63 74 69 6f 6e    set connection
15560 20 7b 46 75 6c 6c 55 72 69 3d 24 7b 66 69 6c 65   {FullUri=${file
15570 4e 61 6d 65 7d 7d 0d 0a 20 20 20 20 20 20 7d 20  Name}}..      } 
15580 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
15590 73 65 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 7b  set connection {
155a0 44 61 74 61 20 53 6f 75 72 63 65 3d 24 7b 66 69  Data Source=${fi
155b0 6c 65 4e 61 6d 65 7d 7d 0d 0a 20 20 20 20 20 20  leName}}..      
155c0 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  }....      #..  
155d0 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 69 6e 63      # NOTE: Sinc
155e0 65 20 74 68 69 73 20 70 72 6f 63 65 64 75 72 65  e this procedure
155f0 20 68 61 73 20 6e 6f 20 73 70 65 63 69 61 6c 20   has no special 
15600 6b 6e 6f 77 6c 65 64 67 65 20 6f 66 20 77 68 61  knowledge of wha
15610 74 20 74 68 65 20 64 65 66 61 75 6c 74 0d 0a 20  t the default.. 
15620 20 20 20 20 20 23 20 20 20 20 20 20 20 73 65 74       #       set
15630 74 69 6e 67 20 69 73 20 66 6f 72 20 74 68 65 20  ting is for the 
15640 54 6f 46 75 6c 6c 50 61 74 68 20 63 6f 6e 6e 65  ToFullPath conne
15650 63 74 69 6f 6e 20 73 74 72 69 6e 67 20 70 72 6f  ction string pro
15660 70 65 72 79 2c 20 61 6c 77 61 79 73 0d 0a 20 20  pery, always..  
15670 20 20 20 20 23 20 20 20 20 20 20 20 61 64 64 20      #       add 
15680 74 68 65 20 76 61 6c 75 65 20 77 65 20 6b 6e 6f  the value we kno
15690 77 20 61 62 6f 75 74 20 74 6f 20 74 68 65 20 63  w about to the c
156a0 6f 6e 6e 65 63 74 69 6f 6e 20 73 74 72 69 6e 67  onnection string
156b0 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
156c0 20 20 61 70 70 65 6e 64 20 63 6f 6e 6e 65 63 74    append connect
156d0 69 6f 6e 20 7b 3b 54 6f 46 75 6c 6c 50 61 74 68  ion {;ToFullPath
156e0 3d 24 7b 71 75 61 6c 69 66 79 7d 7d 0d 0a 0d 0a  =${qualify}}....
156f0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
15700 20 4e 4f 54 45 3a 20 49 66 20 6f 75 72 20 63 61   NOTE: If our ca
15710 6c 6c 65 72 20 73 70 65 63 69 66 69 65 64 20 61  ller specified a
15720 20 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 2c 20 61   journal mode, a
15730 64 64 20 74 68 65 20 6e 65 63 65 73 73 61 72 79  dd the necessary
15740 20 70 6f 72 74 69 6f 6e 0d 0a 20 20 20 20 20 20   portion..      
15750 23 20 20 20 20 20 20 20 6f 66 20 74 68 65 20 63  #       of the c
15760 6f 6e 6e 65 63 74 69 6f 6e 20 73 74 72 69 6e 67  onnection string
15770 20 6e 6f 77 2e 0d 0a 20 20 20 20 20 20 23 0d 0a   now...      #..
15780 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e        if {[strin
15790 67 20 6c 65 6e 67 74 68 20 24 6d 6f 64 65 5d 20  g length $mode] 
157a0 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  > 0} then {..   
157b0 20 20 20 20 20 61 70 70 65 6e 64 20 63 6f 6e 6e       append conn
157c0 65 63 74 69 6f 6e 20 7b 3b 4a 6f 75 72 6e 61 6c  ection {;Journal
157d0 20 4d 6f 64 65 3d 24 7b 6d 6f 64 65 7d 7d 0d 0a   Mode=${mode}}..
157e0 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
157f0 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
15800 3a 20 49 66 20 6f 75 72 20 63 61 6c 6c 65 72 20  : If our caller 
15810 73 70 65 63 69 66 69 65 64 20 61 20 44 61 74 65  specified a Date
15820 54 69 6d 65 20 66 6f 72 6d 61 74 2c 20 61 64 64  Time format, add
15830 20 74 68 65 20 6e 65 63 65 73 73 61 72 79 0d 0a   the necessary..
15840 20 20 20 20 20 20 23 20 20 20 20 20 20 20 70 6f        #       po
15850 72 74 69 6f 6e 20 6f 66 20 74 68 65 20 63 6f 6e  rtion of the con
15860 6e 65 63 74 69 6f 6e 20 73 74 72 69 6e 67 20 6e  nection string n
15870 6f 77 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  ow...      #..  
15880 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20      if {[string 
15890 6c 65 6e 67 74 68 20 24 64 61 74 65 54 69 6d 65  length $dateTime
158a0 46 6f 72 6d 61 74 5d 20 3e 20 30 7d 20 74 68 65  Format] > 0} the
158b0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 61 70 70  n {..        app
158c0 65 6e 64 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 7b  end connection {
158d0 3b 44 61 74 65 54 69 6d 65 46 6f 72 6d 61 74 3d  ;DateTimeFormat=
158e0 24 7b 64 61 74 65 54 69 6d 65 46 6f 72 6d 61 74  ${dateTimeFormat
158f0 7d 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  }}..      }.... 
15900 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
15910 4e 4f 54 45 3a 20 49 66 20 6f 75 72 20 63 61 6c  NOTE: If our cal
15920 6c 65 72 20 73 70 65 63 69 66 69 65 64 20 61 20  ler specified a 
15930 44 61 74 65 54 69 6d 65 4b 69 6e 64 2c 20 61 64  DateTimeKind, ad
15940 64 20 74 68 65 20 6e 65 63 65 73 73 61 72 79 20  d the necessary 
15950 70 6f 72 74 69 6f 6e 0d 0a 20 20 20 20 20 20 23  portion..      #
15960 20 20 20 20 20 20 20 6f 66 20 74 68 65 20 63 6f         of the co
15970 6e 6e 65 63 74 69 6f 6e 20 73 74 72 69 6e 67 20  nnection string 
15980 6e 6f 77 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  now...      #.. 
15990 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67       if {[string
159a0 20 6c 65 6e 67 74 68 20 24 64 61 74 65 54 69 6d   length $dateTim
159b0 65 4b 69 6e 64 5d 20 3e 20 30 7d 20 74 68 65 6e  eKind] > 0} then
159c0 20 7b 0d 0a 20 20 20 20 20 20 20 20 61 70 70 65   {..        appe
159d0 6e 64 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 7b 3b  nd connection {;
159e0 44 61 74 65 54 69 6d 65 4b 69 6e 64 3d 24 7b 64  DateTimeKind=${d
159f0 61 74 65 54 69 6d 65 4b 69 6e 64 7d 7d 0d 0a 20  ateTimeKind}}.. 
15a00 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
15a10 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
15a20 20 46 69 67 75 72 65 20 6f 75 74 20 77 68 61 74   Figure out what
15a30 20 74 68 65 20 66 69 6e 61 6c 20 66 6c 61 67 73   the final flags
15a40 20 66 6f 72 20 74 68 69 73 20 63 6f 6e 6e 65 63   for this connec
15a50 74 69 6f 6e 20 6e 65 65 64 20 74 6f 20 62 65 2e  tion need to be.
15a60 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
15a70 20 73 65 74 20 66 6c 61 67 73 20 5b 67 65 74 43   set flags [getC
15a80 6f 6e 6e 65 63 74 69 6f 6e 46 6c 61 67 73 20 24  onnectionFlags $
15a90 66 69 6c 65 4e 61 6d 65 20 24 66 6c 61 67 73 20  fileName $flags 
15aa0 24 71 75 69 65 74 5d 0d 0a 0d 0a 20 20 20 20 20  $quiet]....     
15ab0 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
15ac0 3a 20 49 66 20 6f 75 72 20 63 61 6c 6c 65 72 20  : If our caller 
15ad0 73 70 65 63 69 66 69 65 64 20 73 6f 6d 65 20 53  specified some S
15ae0 51 4c 69 74 65 43 6f 6e 6e 65 63 74 69 6f 6e 46  QLiteConnectionF
15af0 6c 61 67 73 2c 20 61 64 64 20 74 68 65 0d 0a 20  lags, add the.. 
15b00 20 20 20 20 20 23 20 20 20 20 20 20 20 6e 65 63       #       nec
15b10 65 73 73 61 72 79 20 70 6f 72 74 69 6f 6e 20 6f  essary portion o
15b20 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  f the connection
15b30 20 73 74 72 69 6e 67 20 6e 6f 77 2e 0d 0a 20 20   string now...  
15b40 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20      #..      if 
15b50 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20  {[string length 
15b60 24 66 6c 61 67 73 5d 20 3e 20 30 7d 20 74 68 65  $flags] > 0} the
15b70 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 61 70 70  n {..        app
15b80 65 6e 64 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 7b  end connection {
15b90 3b 46 6c 61 67 73 3d 24 7b 66 6c 61 67 73 7d 7d  ;Flags=${flags}}
15ba0 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
15bb0 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
15bc0 54 45 3a 20 49 66 20 6f 75 72 20 63 61 6c 6c 65  TE: If our calle
15bd0 72 20 73 70 65 63 69 66 69 65 64 20 61 6e 20 65  r specified an e
15be0 78 74 72 61 20 70 61 79 6c 6f 61 64 20 74 6f 20  xtra payload to 
15bf0 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0d 0a  the connection..
15c00 20 20 20 20 20 20 23 20 20 20 20 20 20 20 73 74        #       st
15c10 72 69 6e 67 2c 20 61 70 70 65 6e 64 20 69 74 20  ring, append it 
15c20 6e 6f 77 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  now...      #.. 
15c30 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67       if {[string
15c40 20 6c 65 6e 67 74 68 20 24 65 78 74 72 61 5d 20   length $extra] 
15c50 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  > 0} then {..   
15c60 20 20 20 20 20 61 70 70 65 6e 64 20 63 6f 6e 6e       append conn
15c70 65 63 74 69 6f 6e 20 5c 3b 20 24 65 78 74 72 61  ection \; $extra
15c80 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
15c90 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
15ca0 54 45 3a 20 46 6f 72 20 63 6c 61 72 69 74 79 2c  TE: For clarity,
15cb0 20 61 70 70 65 6e 64 20 61 20 66 69 6e 61 6c 20   append a final 
15cc0 73 65 6d 69 63 6f 6c 6f 6e 20 74 6f 20 74 68 65  semicolon to the
15cd0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 74 72 69   connection stri
15ce0 6e 67 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  ng...      #..  
15cf0 20 20 20 20 61 70 70 65 6e 64 20 63 6f 6e 6e 65      append conne
15d00 63 74 69 6f 6e 20 5c 3b 0d 0a 0d 0a 20 20 20 20  ction \;....    
15d10 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
15d20 45 3a 20 4f 70 65 6e 20 74 68 65 20 64 61 74 61  E: Open the data
15d30 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
15d40 6e 6f 77 2c 20 70 6c 61 63 69 6e 67 20 74 68 65  now, placing the
15d50 20 6f 70 61 71 75 65 20 68 61 6e 64 6c 65 20 76   opaque handle v
15d60 61 6c 75 65 0d 0a 20 20 20 20 20 20 23 20 20 20  alue..      #   
15d70 20 20 20 20 69 6e 74 6f 20 74 68 65 20 76 61 72      into the var
15d80 69 61 62 6c 65 20 73 70 65 63 69 66 69 65 64 20  iable specified 
15d90 62 79 20 6f 75 72 20 63 61 6c 6c 65 72 2e 0d 0a  by our caller...
15da0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 73        #..      s
15db0 65 74 20 64 62 20 5b 73 71 6c 20 6f 70 65 6e 20  et db [sql open 
15dc0 2d 74 79 70 65 20 53 51 4c 69 74 65 20 5b 73 75  -type SQLite [su
15dd0 62 73 74 20 24 63 6f 6e 6e 65 63 74 69 6f 6e 5d  bst $connection]
15de0 5d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  ]....      #..  
15df0 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 6f 6e 66      # NOTE: Conf
15e00 69 67 75 72 65 20 74 68 65 20 74 65 6d 70 6f 72  igure the tempor
15e10 61 72 79 20 64 69 72 65 63 74 6f 72 79 20 66 6f  ary directory fo
15e20 72 20 74 68 65 20 6e 65 77 6c 79 20 6f 70 65 6e  r the newly open
15e30 65 64 20 64 61 74 61 62 61 73 65 0d 0a 20 20 20  ed database..   
15e40 20 20 20 23 20 20 20 20 20 20 20 63 6f 6e 6e 65     #       conne
15e50 63 74 69 6f 6e 20 6e 6f 77 20 75 6e 6c 65 73 73  ction now unless
15e60 20 6f 75 72 20 63 61 6c 6c 65 72 20 66 6f 72 62   our caller forb
15e70 69 64 73 20 69 74 2e 0d 0a 20 20 20 20 20 20 23  ids it...      #
15e80 0d 0a 20 20 20 20 20 20 69 66 20 7b 24 74 65 6d  ..      if {$tem
15e90 70 6f 72 61 72 79 20 26 26 20 21 5b 69 6e 66 6f  porary && ![info
15ea0 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 73 65 74   exists ::no(set
15eb0 54 65 6d 70 6f 72 61 72 79 44 69 72 65 63 74 6f  TemporaryDirecto
15ec0 72 79 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ry)]} then {..  
15ed0 20 20 20 20 20 20 73 71 6c 20 65 78 65 63 75 74        sql execut
15ee0 65 20 24 64 62 20 5b 61 70 70 65 6e 64 41 72 67  e $db [appendArg
15ef0 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
15f00 20 22 50 52 41 47 4d 41 20 74 65 6d 70 5f 73 74   "PRAGMA temp_st
15f10 6f 72 65 5f 64 69 72 65 63 74 6f 72 79 20 3d 20  ore_directory = 
15f20 5c 22 22 20 5b 67 65 74 54 65 6d 70 6f 72 61 72  \"" [getTemporar
15f30 79 44 69 72 65 63 74 6f 72 79 5d 20 5c 22 5c 3b  yDirectory] \"\;
15f40 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  ]..      }....  
15f50 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
15f60 4f 54 45 3a 20 50 65 72 66 6f 72 6d 20 61 6e 79  OTE: Perform any
15f70 20 65 78 74 72 61 20 70 65 72 2d 63 6f 6e 6e 65   extra per-conne
15f80 63 74 69 6f 6e 20 73 65 74 75 70 20 66 6f 72 20  ction setup for 
15f90 74 68 65 20 6e 65 77 6c 79 20 6f 70 65 6e 65 64  the newly opened
15fa0 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
15fb0 64 61 74 61 62 61 73 65 20 6e 6f 77 20 75 6e 6c  database now unl
15fc0 65 73 73 20 6f 75 72 20 63 61 6c 6c 65 72 20 66  ess our caller f
15fd0 6f 72 62 69 64 73 20 69 74 2e 0d 0a 20 20 20 20  orbids it...    
15fe0 20 20 23 0d 0a 20 20 20 20 20 20 73 65 74 20 65    #..      set e
15ff0 78 65 63 75 74 65 4f 6e 53 65 74 75 70 20 5b 67  xecuteOnSetup [g
16000 65 74 45 78 65 63 75 74 65 4f 6e 53 65 74 75 70  etExecuteOnSetup
16010 5d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b  ]....      if {[
16020 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 65  string length $e
16030 78 65 63 75 74 65 4f 6e 53 65 74 75 70 5d 20 3e  xecuteOnSetup] >
16040 20 30 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20   0 && \..       
16050 20 20 20 21 5b 69 6e 66 6f 20 65 78 69 73 74 73     ![info exists
16060 20 3a 3a 6e 6f 28 65 78 65 63 75 74 65 4f 6e 53   ::no(executeOnS
16070 65 74 75 70 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a  etup)]} then {..
16080 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
16090 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 69 73 20     # NOTE: This 
160a0 63 6f 6d 6d 61 6e 64 20 6d 61 79 20 72 61 69 73  command may rais
160b0 65 20 61 6e 20 65 72 72 6f 72 3b 20 69 66 20 73  e an error; if s
160c0 6f 2c 20 74 68 61 74 20 69 73 20 66 69 6e 65 2c  o, that is fine,
160d0 20 61 73 0d 0a 20 20 20 20 20 20 20 20 23 20 20   as..        #  
160e0 20 20 20 20 20 74 68 65 20 65 6e 63 6c 6f 73 69       the enclosi
160f0 6e 67 20 74 65 73 74 20 77 69 6c 6c 20 74 68 65  ng test will the
16100 6e 20 66 61 69 6c 2e 20 20 54 68 65 20 5b 73 75  n fail.  The [su
16110 62 73 74 5d 20 63 6f 6d 6d 61 6e 64 20 69 73 0d  bst] command is.
16120 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
16130 20 75 73 65 64 20 6f 6e 20 74 68 65 20 53 51 4c   used on the SQL
16140 20 69 6e 20 63 61 73 65 20 69 74 20 6e 65 65 64   in case it need
16150 73 20 74 6f 20 72 65 66 65 72 20 74 6f 20 73 74  s to refer to st
16160 61 74 65 20 69 6e 20 6f 75 72 0d 0a 20 20 20 20  ate in our..    
16170 20 20 20 20 23 20 20 20 20 20 20 20 63 6f 6e 74      #       cont
16180 65 78 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  ext...        #.
16190 0a 20 20 20 20 20 20 20 20 73 71 6c 20 65 78 65  .        sql exe
161a0 63 75 74 65 20 24 64 62 20 5b 73 75 62 73 74 20  cute $db [subst 
161b0 24 65 78 65 63 75 74 65 4f 6e 53 65 74 75 70 5d  $executeOnSetup]
161c0 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
161d0 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
161e0 54 45 3a 20 41 6c 77 61 79 73 20 72 65 74 75 72  TE: Always retur
161f0 6e 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  n the connection
16200 20 68 61 6e 64 6c 65 20 75 70 6f 6e 20 73 75 63   handle upon suc
16210 63 65 73 73 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  cess...      #..
16220 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 64 62        return $db
16230 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
16240 70 72 6f 63 20 67 65 74 44 62 43 6f 6e 6e 65 63  proc getDbConnec
16250 74 69 6f 6e 20 7b 20 7b 76 61 72 4e 61 6d 65 20  tion { {varName 
16260 64 62 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23  db} } {..      #
16270 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
16280 52 65 66 65 72 20 74 6f 20 74 68 65 20 73 70 65  Refer to the spe
16290 63 69 66 69 65 64 20 76 61 72 69 61 62 6c 65 20  cified variable 
162a0 28 65 2e 67 2e 20 22 64 62 22 29 20 69 6e 20 74  (e.g. "db") in t
162b0 68 65 20 63 6f 6e 74 65 78 74 20 6f 66 20 6f 75  he context of ou
162c0 72 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  r..      #      
162d0 20 63 61 6c 6c 65 72 2e 20 20 54 68 65 20 68 61   caller.  The ha
162e0 6e 64 6c 65 20 74 6f 20 74 68 65 20 64 61 74 61  ndle to the data
162f0 62 61 73 65 20 70 72 65 76 69 6f 75 73 6c 79 20  base previously 
16300 6f 70 65 6e 65 64 20 76 69 61 20 74 68 65 0d 0a  opened via the..
16310 20 20 20 20 20 20 23 20 20 20 20 20 20 20 5b 73        #       [s
16320 65 74 75 70 44 62 5d 20 70 72 6f 63 65 64 75 72  etupDb] procedur
16330 65 20 73 68 6f 75 6c 64 20 62 65 20 73 74 6f 72  e should be stor
16340 65 64 20 74 68 65 72 65 2e 0d 0a 20 20 20 20 20  ed there...     
16350 20 23 0d 0a 20 20 20 20 20 20 75 70 76 61 72 20   #..      upvar 
16360 31 20 24 76 61 72 4e 61 6d 65 20 64 62 0d 0a 0d  1 $varName db...
16370 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
16380 23 20 4e 4f 54 45 3a 20 54 68 69 73 20 72 65 74  # NOTE: This ret
16390 75 72 6e 73 20 74 68 65 20 41 44 4f 2e 4e 45 54  urns the ADO.NET
163a0 20 49 44 62 43 6f 6e 6e 65 63 74 69 6f 6e 20 6f   IDbConnection o
163b0 62 6a 65 63 74 20 69 6e 73 74 61 6e 63 65 20 66  bject instance f
163c0 6f 72 20 74 68 65 0d 0a 20 20 20 20 20 20 23 20  or the..      # 
163d0 20 20 20 20 20 20 73 70 65 63 69 66 69 65 64 20        specified 
163e0 64 61 74 61 62 73 65 20 68 61 6e 64 6c 65 2e 20  databse handle. 
163f0 20 53 69 6e 63 65 20 67 65 74 74 69 6e 67 20 74   Since getting t
16400 68 69 73 20 6f 62 6a 65 63 74 20 72 65 6c 69 65  his object relie
16410 73 20 75 70 6f 6e 0d 0a 20 20 20 20 20 20 23 20  s upon..      # 
16420 20 20 20 20 20 20 45 61 67 6c 65 20 69 6e 74 65        Eagle inte
16430 72 6e 61 6c 73 2c 20 67 72 65 61 74 20 63 61 72  rnals, great car
16440 65 20 73 68 6f 75 6c 64 20 62 65 20 74 61 6b 65  e should be take
16450 6e 20 74 6f 20 61 76 6f 69 64 20 64 69 73 70 6f  n to avoid dispo
16460 73 69 6e 67 20 6f 66 0d 0a 20 20 20 20 20 20 23  sing of..      #
16470 20 20 20 20 20 20 20 74 68 69 73 20 6f 62 6a 65         this obje
16480 63 74 20 6f 72 20 6f 74 68 65 72 77 69 73 65 20  ct or otherwise 
16490 70 75 74 74 69 6e 67 20 69 74 20 69 6e 74 6f 20  putting it into 
164a0 61 6e 20 69 6e 76 61 6c 69 64 20 73 74 61 74 65  an invalid state
164b0 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
164c0 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73    if {[info exis
164d0 74 73 20 64 62 5d 7d 20 74 68 65 6e 20 7b 0d 0a  ts db]} then {..
164e0 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74          if {[cat
164f0 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  ch {..          
16500 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66  object invoke -f
16510 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20  lags +NonPublic 
16520 2d 6f 62 6a 65 63 74 66 6c 61 67 73 20 2b 4e 6f  -objectflags +No
16530 44 69 73 70 6f 73 65 20 2d 61 6c 69 61 73 20 5c  Dispose -alias \
16540 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
16550 49 6e 74 65 72 70 72 65 74 65 72 2e 47 65 74 41  Interpreter.GetA
16560 63 74 69 76 65 2e 63 6f 6e 6e 65 63 74 69 6f 6e  ctive.connection
16570 73 20 49 74 65 6d 20 24 64 62 0d 0a 20 20 20 20  s Item $db..    
16580 20 20 20 20 7d 20 72 65 73 75 6c 74 5d 20 3d 3d      } result] ==
16590 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
165a0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
165b0 20 20 20 23 20 4e 4f 54 45 3a 20 53 75 63 63 65     # NOTE: Succe
165c0 73 73 2c 20 72 65 74 75 72 6e 20 74 68 65 20 6f  ss, return the o
165d0 70 61 71 75 65 20 6f 62 6a 65 63 74 20 68 61 6e  paque object han
165e0 64 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  dle...          
165f0 23 0d 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  #..          ret
16600 75 72 6e 20 24 72 65 73 75 6c 74 0d 0a 20 20 20  urn $result..   
16610 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
16620 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
16630 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 46 61        # NOTE: Fa
16640 69 6c 75 72 65 2c 20 72 65 70 6f 72 74 20 77 68  ilure, report wh
16650 79 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d  y...          #.
16660 0a 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73  .          tputs
16670 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
16680 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
16690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 3d                "=
166a0 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61 69  === WARNING: fai
166b0 6c 65 64 20 74 6f 20 67 65 74 20 63 6f 6e 6e 65  led to get conne
166c0 63 74 69 6f 6e 20 68 61 6e 64 6c 65 20 66 6f 72  ction handle for
166d0 20 64 61 74 61 62 61 73 65 20 5c 22 22 20 5c 0d   database \"" \.
166e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 24  .              $
166f0 64 62 20 22 5c 22 2c 20 65 72 72 6f 72 3a 20 22  db "\", error: "
16700 20 5c 6e 5c 74 20 24 72 65 73 75 6c 74 20 5c 6e   \n\t $result \n
16710 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  ]..        }..  
16720 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23      }....      #
16730 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
16740 46 61 69 6c 75 72 65 2c 20 72 65 74 75 72 6e 20  Failure, return 
16750 61 6e 20 6f 62 76 69 6f 75 73 6c 79 20 69 6e 76  an obviously inv
16760 61 6c 69 64 20 6f 70 61 71 75 65 20 6f 62 6a 65  alid opaque obje
16770 63 74 20 68 61 6e 64 6c 65 2e 0d 0a 20 20 20 20  ct handle...    
16780 20 20 23 0d 0a 20 20 20 20 20 20 72 65 74 75 72    #..      retur
16790 6e 20 22 22 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a  n ""..    }.....
167a0 20 20 20 20 70 72 6f 63 20 66 72 65 65 44 62 43      proc freeDbC
167b0 6f 6e 6e 65 63 74 69 6f 6e 20 7b 20 7b 76 61 72  onnection { {var
167c0 4e 61 6d 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 7d  Name connection}
167d0 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20   } {..      #.. 
167e0 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 52 65 66       # NOTE: Ref
167f0 65 72 20 74 6f 20 74 68 65 20 73 70 65 63 69 66  er to the specif
16800 69 65 64 20 76 61 72 69 61 62 6c 65 20 28 65 2e  ied variable (e.
16810 67 2e 20 22 63 6f 6e 6e 65 63 74 69 6f 6e 22 29  g. "connection")
16820 20 69 6e 20 74 68 65 0d 0a 20 20 20 20 20 20 23   in the..      #
16830 20 20 20 20 20 20 20 63 6f 6e 74 65 78 74 20 6f         context o
16840 66 20 6f 75 72 20 63 61 6c 6c 65 72 2e 20 20 54  f our caller.  T
16850 68 65 20 6f 70 61 71 75 65 20 6f 62 6a 65 63 74  he opaque object
16860 20 68 61 6e 64 6c 65 20 66 6f 72 20 61 6e 20 41   handle for an A
16870 44 4f 2e 4e 45 54 0d 0a 20 20 20 20 20 20 23 20  DO.NET..      # 
16880 20 20 20 20 20 20 63 6f 6e 6e 65 63 74 69 6f 6e        connection
16890 20 70 72 65 76 69 6f 75 73 6c 79 20 72 65 74 75   previously retu
168a0 72 6e 65 64 20 62 79 20 5b 67 65 74 44 62 43 6f  rned by [getDbCo
168b0 6e 6e 65 63 74 69 6f 6e 5d 20 73 68 6f 75 6c 64  nnection] should
168c0 20 62 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20   be..      #    
168d0 20 20 20 73 74 6f 72 65 64 20 74 68 65 72 65 2e     stored there.
168e0 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
168f0 20 75 70 76 61 72 20 31 20 24 76 61 72 4e 61 6d   upvar 1 $varNam
16900 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0d 0a 0d 0a  e connection....
16910 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
16920 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74 20 74   NOTE: Attempt t
16930 6f 20 72 65 6d 6f 76 65 20 74 68 65 20 6f 70 61  o remove the opa
16940 71 75 65 20 6f 62 6a 65 63 74 20 68 61 6e 64 6c  que object handl
16950 65 20 66 72 6f 6d 20 74 68 65 20 69 6e 74 65 72  e from the inter
16960 70 72 65 74 65 72 0d 0a 20 20 20 20 20 20 23 20  preter..      # 
16970 20 20 20 20 20 20 6e 6f 77 2e 20 20 54 68 69 73        now.  This
16980 20 5b 6f 62 6a 65 63 74 20 64 69 73 70 6f 73 65   [object dispose
16990 5d 20 63 61 6c 6c 20 77 69 6c 6c 20 6e 6f 74 20  ] call will not 
169a0 61 63 74 75 61 6c 6c 79 20 64 69 73 70 6f 73 65  actually dispose
169b0 20 6f 66 20 74 68 65 0d 0a 20 20 20 20 20 20 23   of the..      #
169c0 20 20 20 20 20 20 20 75 6e 64 65 72 6c 79 69 6e         underlyin
169d0 67 20 6f 62 6a 65 63 74 20 62 65 63 61 75 73 65  g object because
169e0 20 74 68 65 20 2b 4e 6f 44 69 73 70 6f 73 65 20   the +NoDispose 
169f0 66 6c 61 67 20 77 61 73 20 73 65 74 20 6f 6e 20  flag was set on 
16a00 69 74 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  it..      #     
16a10 20 20 64 75 72 69 6e 67 20 63 72 65 61 74 69 6f    during creatio
16a20 6e 20 6f 66 20 74 68 65 20 6f 70 61 71 75 65 20  n of the opaque 
16a30 6f 62 6a 65 63 74 20 68 61 6e 64 6c 65 2e 0d 0a  object handle...
16a40 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69        #..      i
16a50 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20  f {[info exists 
16a60 63 6f 6e 6e 65 63 74 69 6f 6e 5d 20 26 26 20 5c  connection] && \
16a70 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 63 61 74  ..          [cat
16a80 63 68 20 7b 6f 62 6a 65 63 74 20 64 69 73 70 6f  ch {object dispo
16a90 73 65 20 24 63 6f 6e 6e 65 63 74 69 6f 6e 7d 20  se $connection} 
16aa0 65 72 72 6f 72 5d 7d 20 74 68 65 6e 20 7b 0d 0a  error]} then {..
16ab0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
16ac0 20 20 20 23 20 4e 4f 54 45 3a 20 57 65 20 73 6f     # NOTE: We so
16ad0 6d 65 68 6f 77 20 66 61 69 6c 65 64 20 74 6f 20  mehow failed to 
16ae0 72 65 6d 6f 76 65 20 74 68 65 20 68 61 6e 64 6c  remove the handl
16af0 65 2c 20 72 65 70 6f 72 74 20 77 68 79 2e 0d 0a  e, report why...
16b00 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
16b10 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
16b20 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  _channel [append
16b30 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
16b40 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e      "==== WARNIN
16b50 47 3a 20 66 61 69 6c 65 64 20 74 6f 20 72 65 6d  G: failed to rem
16b60 6f 76 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68  ove connection h
16b70 61 6e 64 6c 65 20 5c 22 22 20 24 63 6f 6e 6e 65  andle \"" $conne
16b80 63 74 69 6f 6e 20 5c 0d 0a 20 20 20 20 20 20 20  ction \..       
16b90 20 20 20 20 20 22 5c 22 2c 20 65 72 72 6f 72 3a       "\", error:
16ba0 20 22 20 5c 6e 5c 74 20 24 65 72 72 6f 72 20 5c   " \n\t $error \
16bb0 6e 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20  n]..      }..   
16bc0 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
16bd0 61 64 64 44 62 43 6f 6e 6e 65 63 74 69 6f 6e 20  addDbConnection 
16be0 7b 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 7b 76 61  { connection {va
16bf0 72 4e 61 6d 65 20 64 62 7d 20 7d 20 7b 0d 0a 20  rName db} } {.. 
16c00 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
16c10 4e 4f 54 45 3a 20 52 65 66 65 72 20 74 6f 20 74  NOTE: Refer to t
16c20 68 65 20 73 70 65 63 69 66 69 65 64 20 76 61 72  he specified var
16c30 69 61 62 6c 65 20 28 65 2e 67 2e 20 22 64 62 22  iable (e.g. "db"
16c40 29 20 69 6e 20 74 68 65 20 63 6f 6e 74 65 78 74  ) in the context
16c50 20 6f 66 20 6f 75 72 0d 0a 20 20 20 20 20 20 23   of our..      #
16c60 20 20 20 20 20 20 20 63 61 6c 6c 65 72 2e 0d 0a         caller...
16c70 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 75        #..      u
16c80 70 76 61 72 20 31 20 24 76 61 72 4e 61 6d 65 20  pvar 1 $varName 
16c90 64 62 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20  db....      #.. 
16ca0 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 72 65       # NOTE: Cre
16cb0 61 74 65 20 61 20 63 6f 72 72 65 63 74 6c 79 20  ate a correctly 
16cc0 66 6f 72 6d 61 74 74 65 64 20 6e 61 6d 65 20 66  formatted name f
16cd0 6f 72 20 74 68 65 20 64 61 74 61 62 61 73 65 20  or the database 
16ce0 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 0d 0a 20  connection to.. 
16cf0 20 20 20 20 20 23 20 20 20 20 20 20 20 62 65 20       #       be 
16d00 61 64 64 65 64 20 74 6f 20 74 68 65 20 6c 69 73  added to the lis
16d10 74 20 6d 61 6e 61 67 65 64 20 62 79 20 74 68 65  t managed by the
16d20 20 45 61 67 6c 65 20 69 6e 74 65 72 70 72 65 74   Eagle interpret
16d30 65 72 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  er...      #..  
16d40 20 20 20 20 73 65 74 20 64 62 20 5b 6f 62 6a 65      set db [obje
16d50 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73  ct invoke -flags
16d60 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20   +NonPublic \.. 
16d70 20 20 20 20 20 20 20 20 20 45 61 67 6c 65 2e 5f           Eagle._
16d80 43 6f 6d 70 6f 6e 65 6e 74 73 2e 50 72 69 76 61  Components.Priva
16d90 74 65 2e 46 6f 72 6d 61 74 4f 70 73 20 44 61 74  te.FormatOps Dat
16da0 61 62 61 73 65 4f 62 6a 65 63 74 4e 61 6d 65 20  abaseObjectName 
16db0 24 63 6f 6e 6e 65 63 74 69 6f 6e 20 5c 0d 0a 20  $connection \.. 
16dc0 20 20 20 20 20 20 20 20 20 53 51 4c 69 74 65 43           SQLiteC
16dd0 6f 6e 6e 65 63 74 69 6f 6e 20 5b 6f 62 6a 65 63  onnection [objec
16de0 74 20 69 6e 76 6f 6b 65 20 49 6e 74 65 72 70 72  t invoke Interpr
16df0 65 74 65 72 2e 47 65 74 41 63 74 69 76 65 20 4e  eter.GetActive N
16e00 65 78 74 49 64 5d 5d 0d 0a 0d 0a 20 20 20 20 20  extId]]....     
16e10 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
16e20 3a 20 41 64 64 20 74 68 65 20 64 61 74 61 62 61  : Add the databa
16e30 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 72  se connection pr
16e40 6f 76 69 64 65 64 20 62 79 20 6f 75 72 20 63 61  ovided by our ca
16e50 6c 6c 65 72 20 74 6f 20 74 68 65 20 6c 69 73 74  ller to the list
16e60 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
16e70 6f 66 20 74 68 6f 73 65 20 6b 6e 6f 77 6e 20 74  of those known t
16e80 6f 20 74 68 65 20 45 61 67 6c 65 20 69 6e 74 65  o the Eagle inte
16e90 72 70 72 65 74 65 72 2e 0d 0a 20 20 20 20 20 20  rpreter...      
16ea0 23 0d 0a 20 20 20 20 20 20 6f 62 6a 65 63 74 20  #..      object 
16eb0 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e  invoke -flags +N
16ec0 6f 6e 50 75 62 6c 69 63 20 49 6e 74 65 72 70 72  onPublic Interpr
16ed0 65 74 65 72 2e 47 65 74 41 63 74 69 76 65 2e 63  eter.GetActive.c
16ee0 6f 6e 6e 65 63 74 69 6f 6e 73 20 41 64 64 20 5c  onnections Add \
16ef0 0d 0a 20 20 20 20 20 20 20 20 20 20 24 64 62 20  ..          $db 
16f00 24 63 6f 6e 6e 65 63 74 69 6f 6e 0d 0a 20 20 20  $connection..   
16f10 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
16f20 72 65 6d 6f 76 65 44 62 54 72 61 6e 73 61 63 74  removeDbTransact
16f30 69 6f 6e 20 7b 20 74 72 61 6e 73 61 63 74 69 6f  ion { transactio
16f40 6e 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a  n } {..      #..
16f50 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 52 65        # NOTE: Re
16f60 6d 6f 76 65 20 74 68 65 20 64 61 74 61 62 61 73  move the databas
16f70 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 70 72  e transaction pr
16f80 6f 76 69 64 65 64 20 62 79 20 6f 75 72 20 63 61  ovided by our ca
16f90 6c 6c 65 72 20 66 72 6f 6d 20 74 68 65 0d 0a 20  ller from the.. 
16fa0 20 20 20 20 20 23 20 20 20 20 20 20 20 6c 69 73       #       lis
16fb0 74 20 6f 66 20 74 68 6f 73 65 20 6b 6e 6f 77 6e  t of those known
16fc0 20 74 6f 20 74 68 65 20 45 61 67 6c 65 20 69 6e   to the Eagle in
16fd0 74 65 72 70 72 65 74 65 72 2e 0d 0a 20 20 20 20  terpreter...    
16fe0 20 20 23 0d 0a 20 20 20 20 20 20 6f 62 6a 65 63    #..      objec
16ff0 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20  t invoke -flags 
17000 2b 4e 6f 6e 50 75 62 6c 69 63 20 49 6e 74 65 72  +NonPublic Inter
17010 70 72 65 74 65 72 2e 47 65 74 41 63 74 69 76 65  preter.GetActive
17020 2e 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 5c 0d  .transactions \.
17030 0a 20 20 20 20 20 20 20 20 20 20 52 65 6d 6f 76  .          Remov
17040 65 20 24 74 72 61 6e 73 61 63 74 69 6f 6e 0d 0a  e $transaction..
17050 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
17060 6f 63 20 67 65 74 52 6f 77 73 46 72 6f 6d 44 61  oc getRowsFromDa
17070 74 61 54 61 62 6c 65 20 7b 20 64 61 74 61 54 61  taTable { dataTa
17080 62 6c 65 20 7b 76 61 6c 75 65 43 61 6c 6c 62 61  ble {valueCallba
17090 63 6b 20 22 22 7d 20 7d 20 7b 0d 0a 20 20 20 20  ck ""} } {..    
170a0 20 20 73 65 74 20 72 6f 77 73 20 5b 6c 69 73 74    set rows [list
170b0 5d 0d 0a 20 20 20 20 20 20 73 65 74 20 63 6f 75  ]..      set cou
170c0 6e 74 20 5b 24 64 61 74 61 54 61 62 6c 65 20 43  nt [$dataTable C
170d0 6f 6c 75 6d 6e 73 2e 43 6f 75 6e 74 5d 0d 0a 0d  olumns.Count]...
170e0 0a 20 20 20 20 20 20 66 6f 72 20 7b 73 65 74 20  .      for {set 
170f0 69 6e 64 65 78 20 30 7d 20 7b 24 69 6e 64 65 78  index 0} {$index
17100 20 3c 20 24 63 6f 75 6e 74 7d 20 7b 69 6e 63 72   < $count} {incr
17110 20 69 6e 64 65 78 7d 20 7b 0d 0a 20 20 20 20 20   index} {..     
17120 20 20 20 73 65 74 20 64 61 74 61 43 6f 6c 75 6d     set dataColum
17130 6e 20 5b 24 64 61 74 61 54 61 62 6c 65 20 2d 61  n [$dataTable -a
17140 6c 69 61 73 20 43 6f 6c 75 6d 6e 73 2e 67 65 74  lias Columns.get
17150 5f 49 74 65 6d 20 24 69 6e 64 65 78 5d 0d 0a 20  _Item $index].. 
17160 20 20 20 20 20 20 20 73 65 74 20 6e 61 6d 65 73         set names
17170 28 24 69 6e 64 65 78 29 20 5b 24 64 61 74 61 43  ($index) [$dataC
17180 6f 6c 75 6d 6e 20 43 6f 6c 75 6d 6e 4e 61 6d 65  olumn ColumnName
17190 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  ]..      }....  
171a0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
171b0 4f 54 45 3a 20 53 65 74 75 70 20 73 6f 6d 65 20  OTE: Setup some 
171c0 54 63 6c 20 72 65 74 75 72 6e 20 63 6f 64 65 20  Tcl return code 
171d0 63 6f 6e 73 74 61 6e 74 73 2e 0d 0a 20 20 20 20  constants...    
171e0 20 20 23 0d 0a 20 20 20 20 20 20 73 65 74 20 4f    #..      set O
171f0 6b 20 30 3b 20 73 65 74 20 45 72 72 6f 72 20 31  k 0; set Error 1
17200 3b 20 73 65 74 20 52 65 74 75 72 6e 20 32 3b 20  ; set Return 2; 
17210 73 65 74 20 42 72 65 61 6b 20 33 3b 20 73 65 74  set Break 3; set
17220 20 43 6f 6e 74 69 6e 75 65 20 34 0d 0a 0d 0a 20   Continue 4.... 
17230 20 20 20 20 20 6f 62 6a 65 63 74 20 66 6f 72 65       object fore
17240 61 63 68 20 2d 61 6c 69 61 73 20 64 61 74 61 52  ach -alias dataR
17250 6f 77 20 5b 73 65 74 20 64 61 74 61 52 6f 77 73  ow [set dataRows
17260 20 5b 24 64 61 74 61 54 61 62 6c 65 20 52 6f 77   [$dataTable Row
17270 73 5d 5d 20 7b 0d 0a 20 20 20 20 20 20 20 20 73  s]] {..        s
17280 65 74 20 72 6f 77 20 5b 6c 69 73 74 5d 0d 0a 0d  et row [list]...
17290 0a 20 20 20 20 20 20 20 20 66 6f 72 20 7b 73 65  .        for {se
172a0 74 20 69 6e 64 65 78 20 30 7d 20 7b 24 69 6e 64  t index 0} {$ind
172b0 65 78 20 3c 20 24 63 6f 75 6e 74 7d 20 7b 69 6e  ex < $count} {in
172c0 63 72 20 69 6e 64 65 78 7d 20 7b 0d 0a 20 20 20  cr index} {..   
172d0 20 20 20 20 20 20 20 73 65 74 20 76 61 6c 75 65         set value
172e0 20 5b 24 64 61 74 61 52 6f 77 20 2d 63 72 65 61   [$dataRow -crea
172f0 74 65 20 2d 61 6c 69 61 73 20 67 65 74 5f 49 74  te -alias get_It
17300 65 6d 20 24 69 6e 64 65 78 5d 0d 0a 0d 0a 20 20  em $index]....  
17310 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72          if {[str
17320 69 6e 67 20 6c 65 6e 67 74 68 20 24 76 61 6c 75  ing length $valu
17330 65 43 61 6c 6c 62 61 63 6b 5d 20 3e 20 30 7d 20  eCallback] > 0} 
17340 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
17350 20 20 20 20 73 65 74 20 63 6f 64 65 20 5b 63 61      set code [ca
17360 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  tch {..         
17370 20 20 20 20 20 24 76 61 6c 75 65 43 61 6c 6c 62       $valueCallb
17380 61 63 6b 20 24 64 61 74 61 54 61 62 6c 65 20 24  ack $dataTable $
17390 64 61 74 61 52 6f 77 20 24 69 6e 64 65 78 20 24  dataRow $index $
173a0 76 61 6c 75 65 0d 0a 20 20 20 20 20 20 20 20 20  value..         
173b0 20 20 20 7d 20 6e 65 77 56 61 6c 75 65 5d 0d 0a     } newValue]..
173c0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ..            if
173d0 20 7b 24 63 6f 64 65 20 3d 3d 20 24 4f 6b 7d 20   {$code == $Ok} 
173e0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
173f0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
17400 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 55         # NOTE: U
17410 73 65 20 74 68 65 20 73 70 65 63 69 66 69 65 64  se the specified
17420 20 28 6e 65 77 3f 29 20 72 6f 77 20 76 61 6c 75   (new?) row valu
17430 65 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  e...            
17440 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20    #..           
17450 20 20 20 6c 61 70 70 65 6e 64 20 72 6f 77 20 5b     lappend row [
17460 6c 69 73 74 20 24 6e 61 6d 65 73 28 24 69 6e 64  list $names($ind
17470 65 78 29 20 24 6e 65 77 56 61 6c 75 65 5d 0d 0a  ex) $newValue]..
17480 20 20 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c              } el
17490 73 65 69 66 20 7b 24 63 6f 64 65 20 3d 3d 20 24  seif {$code == $
174a0 45 72 72 6f 72 7d 20 74 68 65 6e 20 7b 0d 0a 20  Error} then {.. 
174b0 20 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a               #..
174c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20                # 
174d0 4e 4f 54 45 3a 20 55 73 65 20 74 68 65 20 28 6e  NOTE: Use the (n
174e0 65 77 3f 29 20 4e 55 4c 4c 20 72 6f 77 20 76 61  ew?) NULL row va
174f0 6c 75 65 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  lue...          
17500 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
17510 20 20 20 20 20 6c 61 70 70 65 6e 64 20 72 6f 77       lappend row
17520 20 5b 6c 69 73 74 20 24 6e 61 6d 65 73 28 24 69   [list $names($i
17530 6e 64 65 78 29 5d 0d 0a 20 20 20 20 20 20 20 20  ndex)]..        
17540 20 20 20 20 7d 20 65 6c 73 65 69 66 20 7b 24 63      } elseif {$c
17550 6f 64 65 20 3d 3d 20 24 52 65 74 75 72 6e 7d 20  ode == $Return} 
17560 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
17570 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
17580 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53         # NOTE: S
17590 6b 69 70 20 72 65 6d 61 69 6e 69 6e 67 20 76 61  kip remaining va
175a0 6c 75 65 73 20 66 6f 72 20 74 68 69 73 20 72 6f  lues for this ro
175b0 77 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  w...            
175c0 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20    #..           
175d0 20 20 20 62 72 65 61 6b 0d 0a 20 20 20 20 20 20     break..      
175e0 20 20 20 20 20 20 7d 20 65 6c 73 65 69 66 20 7b        } elseif {
175f0 24 63 6f 64 65 20 3d 3d 20 24 42 72 65 61 6b 7d  $code == $Break}
17600 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
17610 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
17620 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
17630 53 6b 69 70 20 70 72 6f 63 65 73 73 69 6e 67 20  Skip processing 
17640 74 68 69 73 20 72 6f 77 20 76 61 6c 75 65 2e 0d  this row value..
17650 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23  .              #
17660 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 20  ..            } 
17670 65 6c 73 65 69 66 20 7b 24 63 6f 64 65 20 3d 3d  elseif {$code ==
17680 20 24 43 6f 6e 74 69 6e 75 65 7d 20 74 68 65 6e   $Continue} then
17690 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
176a0 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20    #..           
176b0 20 20 20 23 20 4e 4f 54 45 3a 20 55 73 65 20 64     # NOTE: Use d
176c0 65 66 61 75 6c 74 20 72 6f 77 20 76 61 6c 75 65  efault row value
176d0 20 68 61 6e 64 6c 69 6e 67 2e 0d 0a 20 20 20 20   handling...    
176e0 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
176f0 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
17700 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
17710 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20              set 
17720 63 6f 64 65 20 24 43 6f 6e 74 69 6e 75 65 0d 0a  code $Continue..
17730 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20            }.... 
17740 20 20 20 20 20 20 20 20 20 69 66 20 7b 24 63 6f           if {$co
17750 64 65 20 3d 3d 20 24 43 6f 6e 74 69 6e 75 65 7d  de == $Continue}
17760 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
17770 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67       if {[string
17780 20 6c 65 6e 67 74 68 20 24 76 61 6c 75 65 5d 20   length $value] 
17790 3e 20 30 20 26 26 20 5c 0d 0a 20 20 20 20 20 20  > 0 && \..      
177a0 20 20 20 20 20 20 20 20 20 20 21 5b 6f 62 6a 65            ![obje
177b0 63 74 20 69 6e 76 6f 6b 65 20 43 6f 6e 76 65 72  ct invoke Conver
177c0 74 20 49 73 44 42 4e 75 6c 6c 20 24 76 61 6c 75  t IsDBNull $valu
177d0 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  e]} then {..    
177e0 20 20 20 20 20 20 20 20 20 20 6c 61 70 70 65 6e            lappen
177f0 64 20 72 6f 77 20 5b 6c 69 73 74 20 24 6e 61 6d  d row [list $nam
17800 65 73 28 24 69 6e 64 65 78 29 20 5b 24 76 61 6c  es($index) [$val
17810 75 65 20 54 6f 53 74 72 69 6e 67 5d 5d 0d 0a 20  ue ToString]].. 
17820 20 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73             } els
17830 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e {..           
17840 20 20 20 6c 61 70 70 65 6e 64 20 72 6f 77 20 5b     lappend row [
17850 6c 69 73 74 20 24 6e 61 6d 65 73 28 24 69 6e 64  list $names($ind
17860 65 78 29 5d 0d 0a 20 20 20 20 20 20 20 20 20 20  ex)]..          
17870 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d    }..          }
17880 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  ..        }.... 
17890 20 20 20 20 20 20 20 6c 61 70 70 65 6e 64 20 72         lappend r
178a0 6f 77 73 20 24 72 6f 77 0d 0a 20 20 20 20 20 20  ows $row..      
178b0 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65 74 75 72  }....      retur
178c0 6e 20 24 72 6f 77 73 0d 0a 20 20 20 20 7d 0d 0a  n $rows..    }..
178d0 0c 0d 0a 20 20 20 20 70 72 6f 63 20 64 75 6d 70  ...    proc dump
178e0 52 6f 77 73 46 72 6f 6d 44 61 74 61 54 61 62 6c  RowsFromDataTabl
178f0 65 20 7b 20 63 68 61 6e 6e 65 6c 20 72 6f 77 73  e { channel rows
17900 20 7d 20 7b 0d 0a 20 20 20 20 20 20 73 65 74 20   } {..      set 
17910 73 65 71 75 65 6e 63 65 20 31 0d 0a 0d 0a 20 20  sequence 1....  
17920 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77 20      foreach row 
17930 24 72 6f 77 73 20 7b 0d 0a 20 20 20 20 20 20 20  $rows {..       
17940 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
17950 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
17960 20 20 20 20 20 20 20 20 20 20 20 5b 65 78 70 72             [expr
17970 20 7b 24 73 65 71 75 65 6e 63 65 20 3e 20 31 20   {$sequence > 1 
17980 3f 20 22 5c 6e 22 20 3a 20 22 22 7d 5d 20 22 2d  ? "\n" : ""}] "-
17990 2d 2d 2d 20 52 4f 57 20 23 22 20 24 73 65 71 75  --- ROW #" $sequ
179a0 65 6e 63 65 20 3a 5c 6e 5d 0d 0a 0d 0a 20 20 20  ence :\n]....   
179b0 20 20 20 20 20 66 6f 72 65 61 63 68 20 70 61 69       foreach pai
179c0 72 20 24 72 6f 77 20 7b 0d 0a 20 20 20 20 20 20  r $row {..      
179d0 20 20 20 20 69 66 20 7b 5b 6c 6c 65 6e 67 74 68      if {[llength
179e0 20 24 70 61 69 72 5d 20 3e 3d 20 32 7d 20 74 68   $pair] >= 2} th
179f0 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
17a00 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
17a10 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 74 20   [appendArgs \t 
17a20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
17a30 20 20 20 5b 6c 69 73 74 20 5b 6c 69 6e 64 65 78     [list [lindex
17a40 20 24 70 61 69 72 20 30 5d 5d 20 22 3a 20 22 20   $pair 0]] ": " 
17a50 5b 6c 69 73 74 20 5b 6c 69 6e 64 65 78 20 24 70  [list [lindex $p
17a60 61 69 72 20 31 5d 5d 20 5c 6e 5d 0d 0a 20 20 20  air 1]] \n]..   
17a70 20 20 20 20 20 20 20 7d 20 65 6c 73 65 69 66 20         } elseif 
17a80 7b 5b 6c 6c 65 6e 67 74 68 20 24 70 61 69 72 5d  {[llength $pair]
17a90 20 3d 3d 20 31 7d 20 74 68 65 6e 20 7b 0d 0a 20   == 1} then {.. 
17aa0 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
17ab0 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e   $channel [appen
17ac0 64 41 72 67 73 20 5c 74 20 5c 0d 0a 20 20 20 20  dArgs \t \..    
17ad0 20 20 20 20 20 20 20 20 20 20 20 20 5b 6c 69 73              [lis
17ae0 74 20 5b 6c 69 6e 64 65 78 20 24 70 61 69 72 20  t [lindex $pair 
17af0 30 5d 5d 20 22 3a 20 3c 6e 75 6c 6c 3e 5c 6e 22  0]] ": <null>\n"
17b00 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 20 65  ]..          } e
17b10 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  lse {..         
17b20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
17b30 6c 20 5c 74 3c 65 6d 70 74 79 3e 5c 6e 3b 20 23  l \t<empty>\n; #
17b40 20 4e 4f 54 45 3a 20 4e 6f 20 64 61 74 61 3f 0d   NOTE: No data?.
17b50 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  .          }..  
17b60 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
17b70 20 20 20 69 6e 63 72 20 73 65 71 75 65 6e 63 65     incr sequence
17b80 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d  ..      }..    }
17b90 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 63 6c  .....    proc cl
17ba0 65 61 6e 75 70 44 62 20 7b 20 66 69 6c 65 4e 61  eanupDb { fileNa
17bb0 6d 65 20 7b 76 61 72 4e 61 6d 65 20 64 62 7d 20  me {varName db} 
17bc0 7b 63 6f 6c 6c 65 63 74 20 74 72 75 65 7d 20 7b  {collect true} {
17bd0 71 75 61 6c 69 66 79 20 74 72 75 65 7d 0d 0a 20  qualify true}.. 
17be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17bf0 20 20 20 20 7b 64 65 6c 65 74 65 20 74 72 75 65      {delete true
17c00 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a  } } {..      #..
17c10 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 74        # NOTE: At
17c20 74 65 6d 70 74 20 74 6f 20 66 6f 72 63 65 20 61  tempt to force a
17c30 6c 6c 20 70 65 6e 64 69 6e 67 20 22 67 61 72 62  ll pending "garb
17c40 61 67 65 22 20 6f 62 6a 65 63 74 73 20 74 6f 20  age" objects to 
17c50 62 65 20 63 6f 6c 6c 65 63 74 65 64 2c 0d 0a 20  be collected,.. 
17c60 20 20 20 20 20 23 20 20 20 20 20 20 20 69 6e 63       #       inc
17c70 6c 75 64 69 6e 67 20 53 51 4c 69 74 65 20 73 74  luding SQLite st
17c80 61 74 65 6d 65 6e 74 73 20 61 6e 64 20 62 61 63  atements and bac
17c90 6b 75 70 20 6f 62 6a 65 63 74 73 3b 20 74 68 69  kup objects; thi
17ca0 73 20 73 68 6f 75 6c 64 20 61 6c 6c 6f 77 0d 0a  s should allow..
17cb0 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68        #       th
17cc0 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 64 61 74  e underlying dat
17cd0 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 62 65  abase file to be
17ce0 20 64 65 6c 65 74 65 64 2e 0d 0a 20 20 20 20 20   deleted...     
17cf0 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 24 63   #..      if {$c
17d00 6f 6c 6c 65 63 74 7d 20 74 68 65 6e 20 7b 0d 0a  ollect} then {..
17d10 20 20 20 20 20 20 20 20 63 6f 6c 6c 65 63 74 47          collectG
17d20 61 72 62 61 67 65 20 24 3a 3a 74 65 73 74 5f 63  arbage $::test_c
17d30 68 61 6e 6e 65 6c 0d 0a 20 20 20 20 20 20 7d 0d  hannel..      }.
17d40 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
17d50 20 20 23 20 4e 4f 54 45 3a 20 52 65 66 65 72 20    # NOTE: Refer 
17d60 74 6f 20 74 68 65 20 73 70 65 63 69 66 69 65 64  to the specified
17d70 20 76 61 72 69 61 62 6c 65 20 28 65 2e 67 2e 20   variable (e.g. 
17d80 22 64 62 22 29 20 69 6e 20 74 68 65 20 63 6f 6e  "db") in the con
17d90 74 65 78 74 20 6f 66 20 6f 75 72 0d 0a 20 20 20  text of our..   
17da0 20 20 20 23 20 20 20 20 20 20 20 63 61 6c 6c 65     #       calle
17db0 72 2e 20 20 54 68 65 20 68 61 6e 64 6c 65 20 74  r.  The handle t
17dc0 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 70  o the database p
17dd0 72 65 76 69 6f 75 73 6c 79 20 6f 70 65 6e 65 64  reviously opened
17de0 20 76 69 61 20 74 68 65 0d 0a 20 20 20 20 20 20   via the..      
17df0 23 20 20 20 20 20 20 20 5b 73 65 74 75 70 44 62  #       [setupDb
17e00 5d 20 70 72 6f 63 65 64 75 72 65 20 73 68 6f 75  ] procedure shou
17e10 6c 64 20 62 65 20 73 74 6f 72 65 64 20 74 68 65  ld be stored the
17e20 72 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  re...      #..  
17e30 20 20 20 20 75 70 76 61 72 20 31 20 24 76 61 72      upvar 1 $var
17e40 4e 61 6d 65 20 64 62 0d 0a 0d 0a 20 20 20 20 20  Name db....     
17e50 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
17e60 3a 20 43 6c 6f 73 65 20 74 68 65 20 63 6f 6e 6e  : Close the conn
17e70 65 63 74 69 6f 6e 20 74 6f 20 74 68 65 20 64 61  ection to the da
17e80 74 61 62 61 73 65 20 6e 6f 77 2e 20 20 54 68 69  tabase now.  Thi
17e90 73 20 73 68 6f 75 6c 64 20 61 6c 6c 6f 77 20 75  s should allow u
17ea0 73 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  s..      #      
17eb0 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20 75   to delete the u
17ec0 6e 64 65 72 6c 79 69 6e 67 20 64 61 74 61 62 61  nderlying databa
17ed0 73 65 20 66 69 6c 65 2e 0d 0a 20 20 20 20 20 20  se file...      
17ee0 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 6e  #..      if {[in
17ef0 66 6f 20 65 78 69 73 74 73 20 64 62 5d 20 26 26  fo exists db] &&
17f00 20 5b 63 61 74 63 68 20 7b 73 71 6c 20 63 6c 6f   [catch {sql clo
17f10 73 65 20 24 64 62 7d 20 65 72 72 6f 72 5d 7d 20  se $db} error]} 
17f20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
17f30 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
17f40 45 3a 20 57 65 20 73 6f 6d 65 68 6f 77 20 66 61  E: We somehow fa
17f50 69 6c 65 64 20 74 6f 20 63 6c 6f 73 65 20 74 68  iled to close th
17f60 65 20 64 61 74 61 62 61 73 65 2c 20 72 65 70 6f  e database, repo
17f70 72 74 20 77 68 79 2e 0d 0a 20 20 20 20 20 20 20  rt why...       
17f80 20 23 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74   #..        tput
17f90 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
17fa0 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
17fb0 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 3d 3d  .            "==
17fc0 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c  == WARNING: fail
17fd0 65 64 20 74 6f 20 63 6c 6f 73 65 20 64 61 74 61  ed to close data
17fe0 62 61 73 65 20 5c 22 22 20 24 64 62 20 22 5c 22  base \"" $db "\"
17ff0 2c 20 65 72 72 6f 72 3a 20 22 20 5c 0d 0a 20 20  , error: " \..  
18000 20 20 20 20 20 20 20 20 20 20 5c 6e 5c 74 20 24            \n\t $
18010 65 72 72 6f 72 20 5c 6e 5d 0d 0a 20 20 20 20 20  error \n]..     
18020 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20   }....      #.. 
18030 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 46 69 72       # NOTE: Fir
18040 73 74 2c 20 73 65 65 20 69 66 20 6f 75 72 20 63  st, see if our c
18050 61 6c 6c 65 72 20 68 61 73 20 72 65 71 75 65 73  aller has reques
18060 74 65 64 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79  ted an in-memory
18070 20 64 61 74 61 62 61 73 65 2e 0d 0a 20 20 20 20   database...    
18080 20 20 23 0d 0a 20 20 20 20 20 20 73 65 74 20 69    #..      set i
18090 73 4d 65 6d 6f 72 79 20 5b 69 73 4d 65 6d 6f 72  sMemory [isMemor
180a0 79 44 62 20 24 66 69 6c 65 4e 61 6d 65 5d 0d 0a  yDb $fileName]..
180b0 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
180c0 20 23 20 4e 4f 54 45 3a 20 42 75 69 6c 64 20 74   # NOTE: Build t
180d0 68 65 20 66 75 6c 6c 20 70 61 74 68 20 74 6f 20  he full path to 
180e0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
180f0 65 20 6e 61 6d 65 2e 20 20 46 6f 72 20 6e 6f 77  e name.  For now
18100 2c 20 61 6c 6c 20 74 65 73 74 0d 0a 20 20 20 20  , all test..    
18110 20 20 23 20 20 20 20 20 20 20 64 61 74 61 62 61    #       databa
18120 73 65 20 66 69 6c 65 73 20 61 72 65 20 73 74 6f  se files are sto
18130 72 65 64 20 69 6e 20 74 68 65 20 74 65 6d 70 6f  red in the tempo
18140 72 61 72 79 20 64 69 72 65 63 74 6f 72 79 2e 0d  rary directory..
18150 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
18160 69 66 20 7b 21 24 69 73 4d 65 6d 6f 72 79 20 26  if {!$isMemory &
18170 26 20 24 71 75 61 6c 69 66 79 7d 20 74 68 65 6e  & $qualify} then
18180 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20   {..        set 
18190 66 69 6c 65 4e 61 6d 65 20 5b 66 69 6c 65 20 6a  fileName [file j
181a0 6f 69 6e 20 5b 67 65 74 44 61 74 61 62 61 73 65  oin [getDatabase
181b0 44 69 72 65 63 74 6f 72 79 5d 20 5b 66 69 6c 65  Directory] [file
181c0 20 74 61 69 6c 20 24 66 69 6c 65 4e 61 6d 65 5d   tail $fileName]
181d0 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  ]..      }....  
181e0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
181f0 4f 54 45 3a 20 43 68 65 63 6b 20 69 66 20 74 68  OTE: Check if th
18200 65 20 66 69 6c 65 20 73 74 69 6c 6c 20 65 78 69  e file still exi
18210 73 74 73 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  sts...      #.. 
18220 20 20 20 20 20 69 66 20 7b 21 24 69 73 4d 65 6d       if {!$isMem
18230 6f 72 79 20 26 26 20 24 64 65 6c 65 74 65 20 26  ory && $delete &
18240 26 20 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24  & [file exists $
18250 66 69 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20  fileName]} then 
18260 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
18270 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 6b        # NOTE: Sk
18280 69 70 20 64 65 6c 65 74 69 6e 67 20 64 61 74 61  ip deleting data
18290 62 61 73 65 20 66 69 6c 65 73 20 69 66 20 73 6f  base files if so
182a0 6d 65 62 6f 64 79 20 73 65 74 73 20 74 68 65 20  mebody sets the 
182b0 67 6c 6f 62 61 6c 0d 0a 20 20 20 20 20 20 20 20  global..        
182c0 23 20 20 20 20 20 20 20 76 61 72 69 61 62 6c 65  #       variable
182d0 20 74 6f 20 70 72 65 76 65 6e 74 20 69 74 2e 0d   to prevent it..
182e0 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
182f0 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65      if {![info e
18300 78 69 73 74 73 20 3a 3a 6e 6f 28 63 6c 65 61 6e  xists ::no(clean
18310 75 70 44 62 46 69 6c 65 29 5d 7d 20 74 68 65 6e  upDbFile)]} then
18320 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d   {..          #.
18330 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54  .          # NOT
18340 45 3a 20 41 74 74 65 6d 70 74 20 74 6f 20 64 65  E: Attempt to de
18350 6c 65 74 65 20 74 68 65 20 74 65 73 74 20 64 61  lete the test da
18360 74 61 62 61 73 65 20 66 69 6c 65 20 6e 6f 77 2e  tabase file now.
18370 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20  ..          #.. 
18380 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73 65           if {[se
18390 74 20 63 6f 64 65 20 5b 63 61 74 63 68 20 7b 66  t code [catch {f
183a0 69 6c 65 20 64 65 6c 65 74 65 20 24 66 69 6c 65  ile delete $file
183b0 4e 61 6d 65 7d 20 65 72 72 6f 72 5d 5d 7d 20 74  Name} error]]} t
183c0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
183d0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
183e0 20 20 23 20 4e 4f 54 45 3a 20 57 65 20 73 6f 6d    # NOTE: We som
183f0 65 68 6f 77 20 66 61 69 6c 65 64 20 74 6f 20 64  ehow failed to d
18400 65 6c 65 74 65 20 74 68 65 20 66 69 6c 65 2c 20  elete the file, 
18410 72 65 70 6f 72 74 20 77 68 79 2e 0d 0a 20 20 20  report why...   
18420 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
18430 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
18440 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61  :test_channel [a
18450 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
18460 20 20 20 20 20 20 20 20 20 20 20 20 20 22 3d 3d               "==
18470 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c  == WARNING: fail
18480 65 64 20 74 6f 20 64 65 6c 65 74 65 20 64 61 74  ed to delete dat
18490 61 62 61 73 65 20 66 69 6c 65 20 5c 22 22 20 24  abase file \"" $
184a0 66 69 6c 65 4e 61 6d 65 20 5c 0d 0a 20 20 20 20  fileName \..    
184b0 20 20 20 20 20 20 20 20 20 20 20 20 22 5c 22 20              "\" 
184c0 64 75 72 69 6e 67 20 63 6c 65 61 6e 75 70 2c 20  during cleanup, 
184d0 65 72 72 6f 72 3a 20 22 20 5c 6e 5c 74 20 24 65  error: " \n\t $e
184e0 72 72 6f 72 20 5c 6e 5d 0d 0a 20 20 20 20 20 20  rror \n]..      
184f0 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d      }..        }
18500 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
18510 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
18520 23 20 4e 4f 54 45 3a 20 53 68 6f 77 20 74 68 61  # NOTE: Show tha
18530 74 20 77 65 20 73 6b 69 70 70 65 64 20 64 65 6c  t we skipped del
18540 65 74 69 6e 67 20 74 68 65 20 66 69 6c 65 2e 0d  eting the file..
18550 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
18560 20 20 20 20 20 20 20 20 73 65 74 20 63 6f 64 65          set code
18570 20 30 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   0....          
18580 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
18590 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
185a0 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
185b0 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47     "==== WARNING
185c0 3a 20 73 6b 69 70 70 65 64 20 64 65 6c 65 74 69  : skipped deleti
185d0 6e 67 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ng database file
185e0 20 5c 22 22 20 24 66 69 6c 65 4e 61 6d 65 20 5c   \"" $fileName \
185f0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
18600 22 5c 22 20 64 75 72 69 6e 67 20 63 6c 65 61 6e  "\" during clean
18610 75 70 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20  up\n"]..        
18620 7d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20  }..      } else 
18630 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
18640 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68        # NOTE: Th
18650 65 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20  e file does not 
18660 65 78 69 73 74 2c 20 73 75 63 63 65 73 73 21 0d  exist, success!.
18670 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
18680 20 20 20 20 73 65 74 20 63 6f 64 65 20 30 0d 0a      set code 0..
18690 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
186a0 20 72 65 74 75 72 6e 20 24 63 6f 64 65 0d 0a 20   return $code.. 
186b0 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
186c0 63 20 73 61 76 65 45 6e 76 69 72 6f 6e 6d 65 6e  c saveEnvironmen
186d0 74 56 61 72 69 61 62 6c 65 73 20 7b 20 6e 61 6d  tVariables { nam
186e0 65 73 20 7b 76 61 72 4e 61 6d 65 20 22 22 7d 20  es {varName ""} 
186f0 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  } {..      #..  
18700 20 20 20 20 23 20 4e 4f 54 45 3a 20 46 6f 72 20      # NOTE: For 
18710 65 61 63 68 20 6e 61 6d 65 2c 20 64 6f 65 73 20  each name, does 
18720 74 68 65 20 6c 69 76 65 20 65 6e 76 69 72 6f 6e  the live environ
18730 6d 65 6e 74 20 76 61 72 69 61 62 6c 65 20 65 78  ment variable ex
18740 69 73 74 3f 20 20 49 66 0d 0a 20 20 20 20 20 20  ist?  If..      
18750 23 20 20 20 20 20 20 20 73 6f 2c 20 73 61 76 65  #       so, save
18760 20 74 68 65 20 76 61 6c 75 65 20 66 6f 72 20 6c   the value for l
18770 61 74 65 72 3b 20 6f 74 68 65 72 77 69 73 65 2c  ater; otherwise,
18780 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20 73   make sure the s
18790 61 76 65 64 0d 0a 20 20 20 20 20 20 23 20 20 20  aved..      #   
187a0 20 20 20 20 76 61 6c 75 65 20 64 6f 65 73 20 6e      value does n
187b0 6f 74 20 65 78 69 73 74 20 65 69 74 68 65 72 2e  ot exist either.
187c0 20 20 54 68 65 20 6c 69 76 65 20 65 6e 76 69 72    The live envir
187d0 6f 6e 6d 65 6e 74 20 76 61 72 69 61 62 6c 65 73  onment variables
187e0 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
187f0 41 52 45 20 4e 4f 54 20 63 68 61 6e 67 65 64 20  ARE NOT changed 
18800 62 79 20 74 68 69 73 20 70 72 6f 63 65 64 75 72  by this procedur
18810 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  e...      #..   
18820 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c     if {[string l
18830 65 6e 67 74 68 20 24 76 61 72 4e 61 6d 65 5d 20  ength $varName] 
18840 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  == 0} then {..  
18850 20 20 20 20 20 20 73 65 74 20 76 61 72 4e 61 6d        set varNam
18860 65 20 73 61 76 65 64 45 6e 76 0d 0a 20 20 20 20  e savedEnv..    
18870 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 75 70 76    }....      upv
18880 61 72 20 31 20 24 76 61 72 4e 61 6d 65 20 73 61  ar 1 $varName sa
18890 76 65 64 45 6e 76 0d 0a 0d 0a 20 20 20 20 20 20  vedEnv....      
188a0 66 6f 72 65 61 63 68 20 6e 61 6d 65 20 24 6e 61  foreach name $na
188b0 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 69  mes {..        i
188c0 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20  f {[info exists 
188d0 3a 3a 65 6e 76 28 24 6e 61 6d 65 29 5d 7d 20 74  ::env($name)]} t
188e0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
188f0 20 73 65 74 20 73 61 76 65 64 45 6e 76 28 24 6e   set savedEnv($n
18900 61 6d 65 29 20 24 3a 3a 65 6e 76 28 24 6e 61 6d  ame) $::env($nam
18910 65 29 0d 0a 20 20 20 20 20 20 20 20 7d 20 65 6c  e)..        } el
18920 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  se {..          
18930 75 6e 73 65 74 20 2d 6e 6f 63 6f 6d 70 6c 61 69  unset -nocomplai
18940 6e 20 73 61 76 65 64 45 6e 76 28 24 6e 61 6d 65  n savedEnv($name
18950 29 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  )..        }..  
18960 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23      }....      #
18970 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
18980 54 68 69 73 20 69 73 20 73 65 6c 66 2d 63 6c 65  This is self-cle
18990 61 6e 69 6e 67 2e 20 20 49 66 20 6e 6f 20 73 61  aning.  If no sa
189a0 76 65 64 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 20  ved environment 
189b0 76 61 72 69 61 62 6c 65 73 20 6e 6f 77 0d 0a 20  variables now.. 
189c0 20 20 20 20 20 23 20 20 20 20 20 20 20 65 78 69       #       exi
189d0 73 74 2c 20 72 65 6d 6f 76 65 20 74 68 65 20 61  st, remove the a
189e0 72 72 61 79 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  rray...      #..
189f0 20 20 20 20 20 20 69 66 20 7b 5b 61 72 72 61 79        if {[array
18a00 20 73 69 7a 65 20 73 61 76 65 64 45 6e 76 5d 20   size savedEnv] 
18a10 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  == 0} then {..  
18a20 20 20 20 20 20 20 75 6e 73 65 74 20 2d 6e 6f 63        unset -noc
18a30 6f 6d 70 6c 61 69 6e 20 73 61 76 65 64 45 6e 76  omplain savedEnv
18a40 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d  ..      }..    }
18a50 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 72 65  .....    proc re
18a60 73 74 6f 72 65 45 6e 76 69 72 6f 6e 6d 65 6e 74  storeEnvironment
18a70 56 61 72 69 61 62 6c 65 73 20 7b 20 6e 61 6d 65  Variables { name
18a80 73 20 7b 76 61 72 4e 61 6d 65 20 22 22 7d 20 7d  s {varName ""} }
18a90 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20   {..      #..   
18aa0 20 20 20 23 20 4e 4f 54 45 3a 20 46 6f 72 20 65     # NOTE: For e
18ab0 61 63 68 20 6e 61 6d 65 2c 20 64 6f 65 73 20 74  ach name, does t
18ac0 68 65 20 73 61 76 65 64 20 65 6e 76 69 72 6f 6e  he saved environ
18ad0 6d 65 6e 74 20 76 61 72 69 61 62 6c 65 20 65 78  ment variable ex
18ae0 69 73 74 3f 20 20 49 66 0d 0a 20 20 20 20 20 20  ist?  If..      
18af0 23 20 20 20 20 20 20 20 73 6f 2c 20 72 65 73 74  #       so, rest
18b00 6f 72 65 20 74 68 65 20 73 61 76 65 64 20 76 61  ore the saved va
18b10 6c 75 65 20 61 6e 64 20 75 6e 73 65 74 20 69 74  lue and unset it
18b20 3b 20 6f 74 68 65 72 77 69 73 65 2c 20 6d 61 6b  ; otherwise, mak
18b30 65 20 73 75 72 65 0d 0a 20 20 20 20 20 20 23 20  e sure..      # 
18b40 20 20 20 20 20 20 74 68 65 20 6c 69 76 65 20 65        the live e
18b50 6e 76 69 72 6f 6e 6d 65 6e 74 20 76 61 72 69 61  nvironment varia
18b60 62 6c 65 20 64 6f 65 73 20 6e 6f 74 20 65 78 69  ble does not exi
18b70 73 74 20 65 69 74 68 65 72 20 28 69 2e 65 2e 20  st either (i.e. 
18b80 69 74 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  it..      #     
18b90 20 20 77 61 73 20 6e 6f 74 20 73 65 74 20 74 6f    was not set to
18ba0 20 62 65 67 69 6e 20 77 69 74 68 29 2e 20 20 42   begin with).  B
18bb0 6f 74 68 20 73 61 76 65 64 20 61 6e 64 20 6c 69  oth saved and li
18bc0 76 65 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 0d 0a  ve environment..
18bd0 20 20 20 20 20 20 23 20 20 20 20 20 20 20 76 61        #       va
18be0 72 69 61 62 6c 65 73 20 41 52 45 20 63 68 61 6e  riables ARE chan
18bf0 67 65 64 20 62 79 20 74 68 69 73 20 70 72 6f 63  ged by this proc
18c00 65 64 75 72 65 2e 0d 0a 20 20 20 20 20 20 23 0d  edure...      #.
18c10 0a 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69  .      if {[stri
18c20 6e 67 20 6c 65 6e 67 74 68 20 24 76 61 72 4e 61  ng length $varNa
18c30 6d 65 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b  me] == 0} then {
18c40 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 76 61  ..        set va
18c50 72 4e 61 6d 65 20 73 61 76 65 64 45 6e 76 0d 0a  rName savedEnv..
18c60 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
18c70 20 75 70 76 61 72 20 31 20 24 76 61 72 4e 61 6d   upvar 1 $varNam
18c80 65 20 73 61 76 65 64 45 6e 76 0d 0a 0d 0a 20 20  e savedEnv....  
18c90 20 20 20 20 66 6f 72 65 61 63 68 20 6e 61 6d 65      foreach name
18ca0 20 24 6e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20   $names {..     
18cb0 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69     if {[info exi
18cc0 73 74 73 20 73 61 76 65 64 45 6e 76 28 24 6e 61  sts savedEnv($na
18cd0 6d 65 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  me)]} then {..  
18ce0 20 20 20 20 20 20 20 20 73 65 74 20 3a 3a 65 6e          set ::en
18cf0 76 28 24 6e 61 6d 65 29 20 24 73 61 76 65 64 45  v($name) $savedE
18d00 6e 76 28 24 6e 61 6d 65 29 0d 0a 20 20 20 20 20  nv($name)..     
18d10 20 20 20 20 20 75 6e 73 65 74 20 2d 6e 6f 63 6f       unset -noco
18d20 6d 70 6c 61 69 6e 20 73 61 76 65 64 45 6e 76 28  mplain savedEnv(
18d30 24 6e 61 6d 65 29 0d 0a 20 20 20 20 20 20 20 20  $name)..        
18d40 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
18d50 20 20 20 20 75 6e 73 65 74 20 2d 6e 6f 63 6f 6d      unset -nocom
18d60 70 6c 61 69 6e 20 3a 3a 65 6e 76 28 24 6e 61 6d  plain ::env($nam
18d70 65 29 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20  e)..        }.. 
18d80 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
18d90 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
18da0 20 54 68 69 73 20 69 73 20 73 65 6c 66 2d 63 6c   This is self-cl
18db0 65 61 6e 69 6e 67 2e 20 20 49 66 20 6e 6f 20 73  eaning.  If no s
18dc0 61 76 65 64 20 65 6e 76 69 72 6f 6e 6d 65 6e 74  aved environment
18dd0 20 76 61 72 69 61 62 6c 65 73 20 6e 6f 77 0d 0a   variables now..
18de0 20 20 20 20 20 20 23 20 20 20 20 20 20 20 65 78        #       ex
18df0 69 73 74 2c 20 72 65 6d 6f 76 65 20 74 68 65 20  ist, remove the 
18e00 61 72 72 61 79 2e 0d 0a 20 20 20 20 20 20 23 0d  array...      #.
18e10 0a 20 20 20 20 20 20 69 66 20 7b 5b 61 72 72 61  .      if {[arra
18e20 79 20 73 69 7a 65 20 73 61 76 65 64 45 6e 76 5d  y size savedEnv]
18e30 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20   == 0} then {.. 
18e40 20 20 20 20 20 20 20 75 6e 73 65 74 20 2d 6e 6f         unset -no
18e50 63 6f 6d 70 6c 61 69 6e 20 73 61 76 65 64 45 6e  complain savedEn
18e60 76 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  v..      }..    
18e70 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 73  }.....    proc s
18e80 61 76 65 47 65 74 53 65 74 74 69 6e 67 56 61 6c  aveGetSettingVal
18e90 75 65 45 6e 76 69 72 6f 6e 6d 65 6e 74 20 7b 7d  ueEnvironment {}
18ea0 20 7b 0d 0a 20 20 20 20 20 20 75 70 76 61 72 20   {..      upvar 
18eb0 31 20 73 61 76 65 64 45 6e 76 20 73 61 76 65 64  1 savedEnv saved
18ec0 45 6e 76 0d 0a 0d 0a 20 20 20 20 20 20 73 61 76  Env....      sav
18ed0 65 45 6e 76 69 72 6f 6e 6d 65 6e 74 56 61 72 69  eEnvironmentVari
18ee0 61 62 6c 65 73 20 5b 6c 69 73 74 20 5c 0d 0a 20  ables [list \.. 
18ef0 20 20 20 20 20 20 20 20 20 4e 6f 5f 45 78 70 61           No_Expa
18f00 6e 64 20 4e 6f 5f 53 51 4c 69 74 65 47 65 74 53  nd No_SQLiteGetS
18f10 65 74 74 69 6e 67 56 61 6c 75 65 20 4e 6f 5f 53  ettingValue No_S
18f20 51 4c 69 74 65 58 6d 6c 43 6f 6e 66 69 67 46 69  QLiteXmlConfigFi
18f30 6c 65 5d 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  le] \..         
18f40 20 73 61 76 65 64 45 6e 76 0d 0a 20 20 20 20 7d   savedEnv..    }
18f50 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 72 65  .....    proc re
18f60 73 74 6f 72 65 47 65 74 53 65 74 74 69 6e 67 56  storeGetSettingV
18f70 61 6c 75 65 45 6e 76 69 72 6f 6e 6d 65 6e 74 20  alueEnvironment 
18f80 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 75 70 76 61  {} {..      upva
18f90 72 20 31 20 73 61 76 65 64 45 6e 76 20 73 61 76  r 1 savedEnv sav
18fa0 65 64 45 6e 76 0d 0a 0d 0a 20 20 20 20 20 20 72  edEnv....      r
18fb0 65 73 74 6f 72 65 45 6e 76 69 72 6f 6e 6d 65 6e  estoreEnvironmen
18fc0 74 56 61 72 69 61 62 6c 65 73 20 5b 6c 69 73 74  tVariables [list
18fd0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 4e 6f   \..          No
18fe0 5f 45 78 70 61 6e 64 20 4e 6f 5f 53 51 4c 69 74  _Expand No_SQLit
18ff0 65 47 65 74 53 65 74 74 69 6e 67 56 61 6c 75 65  eGetSettingValue
19000 20 4e 6f 5f 53 51 4c 69 74 65 58 6d 6c 43 6f 6e   No_SQLiteXmlCon
19010 66 69 67 46 69 6c 65 5d 20 5c 0d 0a 20 20 20 20  figFile] \..    
19020 20 20 20 20 20 20 73 61 76 65 64 45 6e 76 0d 0a        savedEnv..
19030 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
19040 6f 63 20 73 61 76 65 53 51 4c 69 74 65 43 6f 6e  oc saveSQLiteCon
19050 6e 65 63 74 69 6f 6e 45 6e 76 69 72 6f 6e 6d 65  nectionEnvironme
19060 6e 74 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 75  nt {} {..      u
19070 70 76 61 72 20 31 20 73 61 76 65 64 45 6e 76 20  pvar 1 savedEnv 
19080 73 61 76 65 64 45 6e 76 0d 0a 0d 0a 20 20 20 20  savedEnv....    
19090 20 20 73 61 76 65 45 6e 76 69 72 6f 6e 6d 65 6e    saveEnvironmen
190a0 74 56 61 72 69 61 62 6c 65 73 20 5b 6c 69 73 74  tVariables [list
190b0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 44 65   \..          De
190c0 66 61 75 6c 74 46 6c 61 67 73 5f 53 51 4c 69 74  faultFlags_SQLit
190d0 65 43 6f 6e 6e 65 63 74 69 6f 6e 20 4e 6f 5f 53  eConnection No_S
190e0 51 4c 69 74 65 43 6f 6e 6e 65 63 74 69 6f 6e 4e  QLiteConnectionN
190f0 65 77 50 61 72 73 65 72 5d 20 5c 0d 0a 20 20 20  ewParser] \..   
19100 20 20 20 20 20 20 20 73 61 76 65 64 45 6e 76 0d         savedEnv.
19110 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70  .    }.....    p
19120 72 6f 63 20 72 65 73 74 6f 72 65 53 51 4c 69 74  roc restoreSQLit
19130 65 43 6f 6e 6e 65 63 74 69 6f 6e 45 6e 76 69 72  eConnectionEnvir
19140 6f 6e 6d 65 6e 74 20 7b 7d 20 7b 0d 0a 20 20 20  onment {} {..   
19150 20 20 20 75 70 76 61 72 20 31 20 73 61 76 65 64     upvar 1 saved
19160 45 6e 76 20 73 61 76 65 64 45 6e 76 0d 0a 0d 0a  Env savedEnv....
19170 20 20 20 20 20 20 72 65 73 74 6f 72 65 45 6e 76        restoreEnv
19180 69 72 6f 6e 6d 65 6e 74 56 61 72 69 61 62 6c 65  ironmentVariable
19190 73 20 5b 6c 69 73 74 20 5c 0d 0a 20 20 20 20 20  s [list \..     
191a0 20 20 20 20 20 44 65 66 61 75 6c 74 46 6c 61 67       DefaultFlag
191b0 73 5f 53 51 4c 69 74 65 43 6f 6e 6e 65 63 74 69  s_SQLiteConnecti
191c0 6f 6e 20 4e 6f 5f 53 51 4c 69 74 65 43 6f 6e 6e  on No_SQLiteConn
191d0 65 63 74 69 6f 6e 4e 65 77 50 61 72 73 65 72 5d  ectionNewParser]
191e0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 73 61   \..          sa
191f0 76 65 64 45 6e 76 0d 0a 20 20 20 20 7d 0d 0a 0c  vedEnv..    }...
19200 0d 0a 20 20 20 20 70 72 6f 63 20 73 61 76 65 53  ..    proc saveS
19210 51 4c 69 74 65 43 6f 6e 76 65 72 74 45 6e 76 69  QLiteConvertEnvi
19220 72 6f 6e 6d 65 6e 74 20 7b 7d 20 7b 0d 0a 20 20  ronment {} {..  
19230 20 20 20 20 75 70 76 61 72 20 31 20 73 61 76 65      upvar 1 save
19240 64 45 6e 76 20 73 61 76 65 64 45 6e 76 0d 0a 0d  dEnv savedEnv...
19250 0a 20 20 20 20 20 20 73 61 76 65 45 6e 76 69 72  .      saveEnvir
19260 6f 6e 6d 65 6e 74 56 61 72 69 61 62 6c 65 73 20  onmentVariables 
19270 5b 6c 69 73 74 20 5c 0d 0a 20 20 20 20 20 20 20  [list \..       
19280 20 20 20 55 73 65 5f 53 51 4c 69 74 65 43 6f 6e     Use_SQLiteCon
19290 76 65 72 74 5f 44 65 66 61 75 6c 74 44 62 54 79  vert_DefaultDbTy
192a0 70 65 20 55 73 65 5f 53 51 4c 69 74 65 43 6f 6e  pe Use_SQLiteCon
192b0 76 65 72 74 5f 44 65 66 61 75 6c 74 54 79 70 65  vert_DefaultType
192c0 4e 61 6d 65 5d 20 5c 0d 0a 20 20 20 20 20 20 20  Name] \..       
192d0 20 20 20 73 61 76 65 64 45 6e 76 0d 0a 20 20 20     savedEnv..   
192e0 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
192f0 72 65 73 74 6f 72 65 53 51 4c 69 74 65 43 6f 6e  restoreSQLiteCon
19300 76 65 72 74 45 6e 76 69 72 6f 6e 6d 65 6e 74 20  vertEnvironment 
19310 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 75 70 76 61  {} {..      upva
19320 72 20 31 20 73 61 76 65 64 45 6e 76 20 73 61 76  r 1 savedEnv sav
19330 65 64 45 6e 76 0d 0a 0d 0a 20 20 20 20 20 20 72  edEnv....      r
19340 65 73 74 6f 72 65 45 6e 76 69 72 6f 6e 6d 65 6e  estoreEnvironmen
19350 74 56 61 72 69 61 62 6c 65 73 20 5b 6c 69 73 74  tVariables [list
19360 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 55 73   \..          Us
19370 65 5f 53 51 4c 69 74 65 43 6f 6e 76 65 72 74 5f  e_SQLiteConvert_
19380 44 65 66 61 75 6c 74 44 62 54 79 70 65 20 55 73  DefaultDbType Us
19390 65 5f 53 51 4c 69 74 65 43 6f 6e 76 65 72 74 5f  e_SQLiteConvert_
193a0 44 65 66 61 75 6c 74 54 79 70 65 4e 61 6d 65 5d  DefaultTypeName]
193b0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 73 61   \..          sa
193c0 76 65 64 45 6e 76 0d 0a 20 20 20 20 7d 0d 0a 0c  vedEnv..    }...
193d0 0d 0a 20 20 20 20 70 72 6f 63 20 73 65 74 75 70  ..    proc setup
193e0 44 62 49 6e 74 65 72 72 75 70 74 43 61 6c 6c 62  DbInterruptCallb
193f0 61 63 6b 20 7b 20 63 68 61 6e 6e 65 6c 20 6c 6f  ack { channel lo
19400 67 20 7d 20 7b 0d 0a 20 20 20 20 20 20 74 70 75  g } {..      tpu
19410 74 73 20 24 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d  ts $channel "---
19420 2d 20 73 65 74 74 69 6e 67 20 75 70 20 64 65 62  - setting up deb
19430 75 67 67 65 72 20 69 6e 74 65 72 72 75 70 74 20  ugger interrupt 
19440 63 61 6c 6c 62 61 63 6b 2e 2e 2e 20 22 0d 0a 0d  callback... "...
19450 0a 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63  .      if {[catc
19460 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 61 76  h {..        sav
19470 65 45 6e 76 69 72 6f 6e 6d 65 6e 74 56 61 72 69  eEnvironmentVari
19480 61 62 6c 65 73 20 5b 6c 69 73 74 20 5c 0d 0a 20  ables [list \.. 
19490 20 20 20 20 20 20 20 20 20 20 20 71 75 69 65 74             quiet
194a0 46 69 6e 64 49 6e 74 65 72 70 72 65 74 65 72 54  FindInterpreterT
194b0 65 73 74 50 61 74 68 20 71 75 69 65 74 53 65 74  estPath quietSet
194c0 75 70 49 6e 74 65 72 70 72 65 74 65 72 54 65 73  upInterpreterTes
194d0 74 50 61 74 68 5d 0d 0a 0d 0a 20 20 20 20 20 20  tPath]....      
194e0 20 20 74 72 79 20 7b 0d 0a 20 20 20 20 20 20 20    try {..       
194f0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
19500 23 20 4e 4f 54 45 3a 20 50 72 65 76 65 6e 74 20  # NOTE: Prevent 
19510 74 68 65 20 76 65 6e 64 6f 72 20 73 63 72 69 70  the vendor scrip
19520 74 20 66 72 6f 6d 20 62 65 69 6e 67 20 6e 6f 69  t from being noi
19530 73 79 20 77 68 65 6e 20 63 72 65 61 74 69 6e 67  sy when creating
19540 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 20 20  ..          #   
19550 20 20 20 20 74 68 65 20 69 73 6f 6c 61 74 65 64      the isolated
19560 20 69 6e 74 65 72 70 72 65 74 65 72 2e 0d 0a 20   interpreter... 
19570 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
19580 20 20 20 20 20 20 73 65 74 20 3a 3a 65 6e 76 28        set ::env(
19590 71 75 69 65 74 46 69 6e 64 49 6e 74 65 72 70 72  quietFindInterpr
195a0 65 74 65 72 54 65 73 74 50 61 74 68 29 20 31 0d  eterTestPath) 1.
195b0 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20 3a  .          set :
195c0 3a 65 6e 76 28 71 75 69 65 74 53 65 74 75 70 49  :env(quietSetupI
195d0 6e 74 65 72 70 72 65 74 65 72 54 65 73 74 50 61  nterpreterTestPa
195e0 74 68 29 20 31 0d 0a 0d 0a 20 20 20 20 20 20 20  th) 1....       
195f0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
19600 23 20 4e 4f 54 45 3a 20 4d 61 6b 65 20 73 75 72  # NOTE: Make sur
19610 65 20 74 68 65 20 73 63 72 69 70 74 20 64 65 62  e the script deb
19620 75 67 67 65 72 20 61 6e 64 20 74 68 65 20 69 73  ugger and the is
19630 6f 6c 61 74 65 64 20 69 6e 74 65 72 70 72 65 74  olated interpret
19640 65 72 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20  er..          # 
19650 20 20 20 20 20 20 61 72 65 20 73 65 74 75 70 20        are setup 
19660 61 6e 64 20 72 65 61 64 79 20 66 6f 72 20 75 73  and ready for us
19670 65 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d  e...          #.
19680 0a 20 20 20 20 20 20 20 20 20 20 64 65 62 75 67  .          debug
19690 20 73 65 74 75 70 20 74 72 75 65 20 74 72 75 65   setup true true
196a0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d  ....          #.
196b0 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54  .          # NOT
196c0 45 3a 20 4c 6f 61 64 20 74 68 65 20 6e 65 63 65  E: Load the nece
196d0 73 73 61 72 79 20 70 61 63 6b 61 67 65 73 20 69  ssary packages i
196e0 6e 74 6f 20 74 68 65 20 69 73 6f 6c 61 74 65 64  nto the isolated
196f0 20 69 6e 74 65 72 70 72 65 74 65 72 2e 0d 0a 20   interpreter... 
19700 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
19710 20 20 20 20 20 20 64 65 62 75 67 20 65 76 61 6c        debug eval
19720 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
19730 70 61 63 6b 61 67 65 20 72 65 71 75 69 72 65 20  package require 
19740 45 61 67 6c 65 0d 0a 20 20 20 20 20 20 20 20 20  Eagle..         
19750 20 20 20 70 61 63 6b 61 67 65 20 72 65 71 75 69     package requi
19760 72 65 20 45 61 67 6c 65 2e 4c 69 62 72 61 72 79  re Eagle.Library
19770 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 61  ..            pa
19780 63 6b 61 67 65 20 72 65 71 75 69 72 65 20 45 61  ckage require Ea
19790 67 6c 65 2e 54 65 73 74 0d 0a 20 20 20 20 20 20  gle.Test..      
197a0 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
197b0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
197c0 23 20 4e 4f 54 45 3a 20 43 6f 70 79 20 74 68 65  # NOTE: Copy the
197d0 20 6e 65 63 65 73 73 61 72 79 20 76 61 72 69 61   necessary varia
197e0 62 6c 65 73 20 69 6e 74 6f 20 74 68 65 20 69 73  bles into the is
197f0 6f 6c 61 74 65 64 20 69 6e 74 65 72 70 72 65 74  olated interpret
19800 65 72 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23  er...          #
19810 0d 0a 20 20 20 20 20 20 20 20 20 20 64 65 62 75  ..          debu
19820 67 20 69 6e 76 6f 6b 65 20 30 20 73 65 74 20 3a  g invoke 0 set :
19830 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 24 63  :test_channel $c
19840 68 61 6e 6e 65 6c 3b 20 23 20 4e 4f 54 45 3a 20  hannel; # NOTE: 
19850 46 6f 72 20 5b 74 70 75 74 73 5d 2e 0d 0a 20 20  For [tputs]...  
19860 20 20 20 20 20 20 20 20 64 65 62 75 67 20 69 6e          debug in
19870 76 6f 6b 65 20 30 20 73 65 74 20 3a 3a 74 65 73  voke 0 set ::tes
19880 74 5f 6c 6f 67 20 24 6c 6f 67 3b 20 23 20 4e 4f  t_log $log; # NO
19890 54 45 3a 20 46 6f 72 20 5b 74 6c 6f 67 5d 2e 0d  TE: For [tlog]..
198a0 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a  ...          #..
198b0 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45            # NOTE
198c0 3a 20 49 6e 73 74 61 6c 6c 20 74 68 65 20 63 61  : Install the ca
198d0 6c 6c 62 61 63 6b 20 73 63 72 69 70 74 20 74 6f  llback script to
198e0 20 62 65 20 65 76 61 6c 75 61 74 65 64 20 69 6e   be evaluated in
198f0 20 74 68 65 20 69 73 6f 6c 61 74 65 64 0d 0a 20   the isolated.. 
19900 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20           #      
19910 20 69 6e 74 65 72 70 72 65 74 65 72 20 77 68 65   interpreter whe
19920 6e 20 74 68 69 73 20 69 6e 74 65 72 70 72 65 74  n this interpret
19930 65 72 20 69 73 20 69 6e 74 65 72 72 75 70 74 65  er is interrupte
19940 64 20 62 79 20 73 63 72 69 70 74 0d 0a 20 20 20  d by script..   
19950 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63         #       c
19960 61 6e 63 65 6c 6c 61 74 69 6f 6e 2c 20 65 74 63  ancellation, etc
19970 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a  ...          #..
19980 20 20 20 20 20 20 20 20 20 20 64 65 62 75 67 20            debug 
19990 63 61 6c 6c 62 61 63 6b 20 61 70 70 6c 79 20 7b  callback apply {
199a0 7b 73 65 6e 64 65 72 20 65 7d 20 7b 0d 0a 20 20  {sender e} {..  
199b0 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
199c0 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a           # NOTE:
199d0 20 43 68 65 63 6b 20 69 66 20 74 68 69 73 20 64   Check if this d
199e0 65 62 75 67 67 65 72 20 63 61 6c 6c 62 61 63 6b  ebugger callback
199f0 20 69 73 20 6f 6e 65 20 74 68 61 74 20 77 65 20   is one that we 
19a00 63 61 72 65 20 61 62 6f 75 74 2e 0d 0a 20 20 20  care about...   
19a10 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
19a20 20 20 20 20 20 20 20 20 73 65 74 20 69 6e 74 65          set inte
19a30 72 72 75 70 74 54 79 70 65 73 20 5b 73 70 6c 69  rruptTypes [spli
19a40 74 20 5b 24 65 20 49 6e 74 65 72 72 75 70 74 54  t [$e InterruptT
19a50 79 70 65 5d 20 22 2c 20 22 5d 0d 0a 0d 0a 20 20  ype] ", "]....  
19a60 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 22 43            if {"C
19a70 61 6e 63 65 6c 65 64 22 20 69 6e 20 24 69 6e 74  anceled" in $int
19a80 65 72 72 75 70 74 54 79 70 65 73 20 7c 7c 20 5c  erruptTypes || \
19a90 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
19aa0 20 20 22 55 6e 77 6f 75 6e 64 22 20 69 6e 20 24    "Unwound" in $
19ab0 69 6e 74 65 72 72 75 70 74 54 79 70 65 73 7d 20  interruptTypes} 
19ac0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
19ad0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
19ae0 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4d         # NOTE: M
19af0 61 6b 65 20 73 75 72 65 20 74 68 65 20 5b 6f 62  ake sure the [ob
19b00 6a 65 63 74 5d 20 63 6f 6d 6d 61 6e 64 20 69 73  ject] command is
19b10 20 61 76 61 69 6c 61 62 6c 65 2e 20 20 53 69 6e   available.  Sin
19b20 63 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ce..            
19b30 20 20 23 20 20 20 20 20 20 20 74 68 69 73 20 69    #       this i
19b40 73 20 61 6e 20 69 73 6f 6c 61 74 65 64 20 69 6e  s an isolated in
19b50 74 65 72 70 72 65 74 65 72 2c 20 63 68 65 63 6b  terpreter, check
19b60 20 66 6f 72 20 69 74 20 74 68 65 20 68 61 72 64   for it the hard
19b70 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
19b80 23 20 20 20 20 20 20 20 77 61 79 2e 0d 0a 20 20  #       way...  
19b90 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20              #.. 
19ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20               if 
19bb0 7b 5b 6c 6c 65 6e 67 74 68 20 5b 69 6e 66 6f 20  {[llength [info 
19bc0 63 6f 6d 6d 61 6e 64 73 20 6f 62 6a 65 63 74 5d  commands object]
19bd0 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20  ] > 0} then {.. 
19be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23                 #
19bf0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
19c00 20 20 23 20 4e 4f 54 45 3a 20 49 74 65 72 61 74    # NOTE: Iterat
19c10 65 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 64 61  e through all da
19c20 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
19c30 6e 73 20 6b 6e 6f 77 6e 20 74 6f 20 74 68 65 0d  ns known to the.
19c40 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
19c50 20 23 20 20 20 20 20 20 20 70 61 72 65 6e 74 20   #       parent 
19c60 69 6e 74 65 72 70 72 65 74 65 72 2e 0d 0a 20 20  interpreter...  
19c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 0d                #.
19c80 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
19c90 20 6f 62 6a 65 63 74 20 66 6f 72 65 61 63 68 20   object foreach 
19ca0 2d 61 6c 69 61 73 20 70 61 69 72 20 5b 6f 62 6a  -alias pair [obj
19cb0 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67  ect invoke -flag
19cc0 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a  s +NonPublic \..
19cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19ce0 20 20 20 20 24 65 20 49 6e 74 65 72 70 72 65 74      $e Interpret
19cf0 65 72 2e 63 6f 6e 6e 65 63 74 69 6f 6e 73 5d 20  er.connections] 
19d00 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
19d10 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
19d20 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45            # NOTE
19d30 3a 20 41 74 74 65 6d 70 74 20 74 6f 20 63 61 6e  : Attempt to can
19d40 63 65 6c 20 61 6e 79 20 53 51 4c 20 71 75 65 72  cel any SQL quer
19d50 69 65 73 20 69 6e 20 70 72 6f 67 72 65 73 73 20  ies in progress 
19d60 6f 6e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  on..            
19d70 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68        #       th
19d80 69 73 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  is database conn
19d90 65 63 74 69 6f 6e 2e 0d 0a 20 20 20 20 20 20 20  ection...       
19da0 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
19db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19dc0 69 66 20 7b 5b 63 61 74 63 68 20 7b 24 70 61 69  if {[catch {$pai
19dd0 72 20 56 61 6c 75 65 2e 43 61 6e 63 65 6c 7d 20  r Value.Cancel} 
19de0 65 72 72 6f 72 5d 7d 20 74 68 65 6e 20 7b 0d 0a  error]} then {..
19df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19e00 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
19e10 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e  t_channel [appen
19e20 64 41 72 67 73 20 5c 6e 20 5c 0d 0a 20 20 20 20  dArgs \n \..    
19e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19e40 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e      "==== WARNIN
19e50 47 3a 20 66 61 69 6c 65 64 20 74 6f 20 63 61 6e  G: failed to can
19e60 63 65 6c 20 71 75 65 72 79 20 66 6f 72 20 22 20  cel query for " 
19e70 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
19e80 20 20 20 20 20 20 20 20 20 20 20 22 63 6f 6e 6e             "conn
19e90 65 63 74 69 6f 6e 20 5c 22 22 20 5b 24 70 61 69  ection \"" [$pai
19ea0 72 20 4b 65 79 5d 20 22 5c 22 2c 20 65 72 72 6f  r Key] "\", erro
19eb0 72 3a 20 22 20 5c 6e 5c 74 20 5c 0d 0a 20 20 20  r: " \n\t \..   
19ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19ed0 20 20 20 20 20 24 65 72 72 6f 72 20 5c 6e 5d 0d       $error \n].
19ee0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
19ef0 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
19f00 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
19f10 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d         } else {.
19f20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
19f30 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
19f40 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
19f50 67 73 20 5c 6e 20 5c 0d 0a 20 20 20 20 20 20 20  gs \n \..       
19f60 20 20 20 20 20 20 20 20 20 20 20 20 20 22 3d 3d               "==
19f70 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 63 61 6e 6e  == WARNING: cann
19f80 6f 74 20 63 61 6e 63 65 6c 20 61 6e 79 20 71 75  ot cancel any qu
19f90 65 72 69 65 73 3a 20 22 20 5c 0d 0a 20 20 20 20  eries: " \..    
19fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19fb0 22 74 68 65 20 5c 22 6f 62 6a 65 63 74 5c 22 20  "the \"object\" 
19fc0 63 6f 6d 6d 61 6e 64 20 69 73 20 6e 6f 74 20 61  command is not a
19fd0 76 61 69 6c 61 62 6c 65 5c 6e 22 5d 0d 0a 20 20  vailable\n"]..  
19fe0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
19ff0 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
1a000 20 20 20 20 20 20 20 20 7d 7d 0d 0a 20 20 20 20          }}..    
1a010 20 20 20 20 7d 20 66 69 6e 61 6c 6c 79 20 7b 0d      } finally {.
1a020 0a 20 20 20 20 20 20 20 20 20 20 72 65 73 74 6f  .          resto
1a030 72 65 45 6e 76 69 72 6f 6e 6d 65 6e 74 56 61 72  reEnvironmentVar
1a040 69 61 62 6c 65 73 20 5b 6c 69 73 74 20 5c 0d 0a  iables [list \..
1a050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 71 75                qu
1a060 69 65 74 46 69 6e 64 49 6e 74 65 72 70 72 65 74  ietFindInterpret
1a070 65 72 54 65 73 74 50 61 74 68 20 71 75 69 65 74  erTestPath quiet
1a080 53 65 74 75 70 49 6e 74 65 72 70 72 65 74 65 72  SetupInterpreter
1a090 54 65 73 74 50 61 74 68 5d 0d 0a 20 20 20 20 20  TestPath]..     
1a0a0 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 20 65 72     }..      } er
1a0b0 72 6f 72 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20  ror] == 0} then 
1a0c0 7b 0d 0a 20 20 20 20 20 20 20 20 61 64 64 43 6f  {..        addCo
1a0d0 6e 73 74 72 61 69 6e 74 20 69 6e 74 65 72 72 75  nstraint interru
1a0e0 70 74 43 61 6c 6c 62 61 63 6b 2e 73 71 6c 69 74  ptCallback.sqlit
1a0f0 65 33 0d 0a 0d 0a 20 20 20 20 20 20 20 20 74 70  e3....        tp
1a100 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 79 65 73  uts $channel yes
1a110 5c 6e 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65  \n..      } else
1a120 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74   {..        tput
1a130 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  s $channel [appe
1a140 6e 64 41 72 67 73 20 22 6e 6f 2c 20 65 72 72 6f  ndArgs "no, erro
1a150 72 3a 20 22 20 5c 6e 5c 74 20 24 65 72 72 6f 72  r: " \n\t $error
1a160 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20   \n]..      }.. 
1a170 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
1a180 63 20 63 6c 65 61 6e 75 70 46 69 6c 65 20 7b 20  c cleanupFile { 
1a190 66 69 6c 65 4e 61 6d 65 20 7b 63 6f 6c 6c 65 63  fileName {collec
1a1a0 74 20 74 72 75 65 7d 20 7b 66 6f 72 63 65 20 66  t true} {force f
1a1b0 61 6c 73 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20  alse} } {..     
1a1c0 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
1a1d0 3a 20 41 74 74 65 6d 70 74 20 74 6f 20 66 6f 72  : Attempt to for
1a1e0 63 65 20 61 6c 6c 20 70 65 6e 64 69 6e 67 20 22  ce all pending "
1a1f0 67 61 72 62 61 67 65 22 20 6f 62 6a 65 63 74 73  garbage" objects
1a200 20 74 6f 20 62 65 20 63 6f 6c 6c 65 63 74 65 64   to be collected
1a210 2c 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  ,..      #      
1a220 20 69 6e 63 6c 75 64 69 6e 67 20 53 51 4c 69 74   including SQLit
1a230 65 20 73 74 61 74 65 6d 65 6e 74 73 20 61 6e 64  e statements and
1a240 20 62 61 63 6b 75 70 20 6f 62 6a 65 63 74 73 3b   backup objects;
1a250 20 74 68 69 73 20 73 68 6f 75 6c 64 20 61 6c 6c   this should all
1a260 6f 77 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  ow..      #     
1a270 20 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67    the underlying
1a280 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74   database file t
1a290 6f 20 62 65 20 64 65 6c 65 74 65 64 2e 0d 0a 20  o be deleted... 
1a2a0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66       #..      if
1a2b0 20 7b 24 63 6f 6c 6c 65 63 74 7d 20 74 68 65 6e   {$collect} then
1a2c0 20 7b 0d 0a 20 20 20 20 20 20 20 20 63 6f 6c 6c   {..        coll
1a2d0 65 63 74 47 61 72 62 61 67 65 20 24 3a 3a 74 65  ectGarbage $::te
1a2e0 73 74 5f 63 68 61 6e 6e 65 6c 0d 0a 20 20 20 20  st_channel..    
1a2f0 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a    }....      #..
1a300 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68        # NOTE: Ch
1a310 65 63 6b 20 69 66 20 74 68 65 20 66 69 6c 65 20  eck if the file 
1a320 73 74 69 6c 6c 20 65 78 69 73 74 73 2e 0d 0a 20  still exists... 
1a330 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66       #..      if
1a340 20 7b 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24   {[file exists $
1a350 66 69 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20  fileName]} then 
1a360 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
1a370 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 6b        # NOTE: Sk
1a380 69 70 20 64 65 6c 65 74 69 6e 67 20 74 65 73 74  ip deleting test
1a390 20 66 69 6c 65 73 20 69 66 20 73 6f 6d 65 62 6f   files if somebo
1a3a0 64 79 20 73 65 74 73 20 74 68 65 20 67 6c 6f 62  dy sets the glob
1a3b0 61 6c 20 76 61 72 69 61 62 6c 65 0d 0a 20 20 20  al variable..   
1a3c0 20 20 20 20 20 23 20 20 20 20 20 20 20 74 6f 20       #       to 
1a3d0 70 72 65 76 65 6e 74 20 69 74 2e 0d 0a 20 20 20  prevent it...   
1a3e0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
1a3f0 69 66 20 7b 24 66 6f 72 63 65 20 7c 7c 20 21 5b  if {$force || ![
1a400 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f  info exists ::no
1a410 28 63 6c 65 61 6e 75 70 46 69 6c 65 29 5d 7d 20  (cleanupFile)]} 
1a420 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
1a430 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23    #..          #
1a440 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74 20 74   NOTE: Attempt t
1a450 6f 20 64 65 6c 65 74 65 20 74 68 65 20 74 65 73  o delete the tes
1a460 74 20 66 69 6c 65 20 6e 6f 77 2e 0d 0a 20 20 20  t file now...   
1a470 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
1a480 20 20 20 20 69 66 20 7b 5b 73 65 74 20 63 6f 64      if {[set cod
1a490 65 20 5b 63 61 74 63 68 20 7b 66 69 6c 65 20 64  e [catch {file d
1a4a0 65 6c 65 74 65 20 24 66 69 6c 65 4e 61 6d 65 7d  elete $fileName}
1a4b0 20 65 72 72 6f 72 5d 5d 7d 20 74 68 65 6e 20 7b   error]]} then {
1a4c0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 0d  ..            #.
1a4d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4e  .            # N
1a4e0 4f 54 45 3a 20 57 65 20 73 6f 6d 65 68 6f 77 20  OTE: We somehow 
1a4f0 66 61 69 6c 65 64 20 74 6f 20 64 65 6c 65 74 65  failed to delete
1a500 20 74 68 65 20 66 69 6c 65 2c 20 72 65 70 6f 72   the file, repor
1a510 74 20 77 68 79 2e 0d 0a 20 20 20 20 20 20 20 20  t why...        
1a520 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
1a530 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
1a540 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  _channel [append
1a550 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
1a560 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41          "==== WA
1a570 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20 74 6f  RNING: failed to
1a580 20 64 65 6c 65 74 65 20 74 65 73 74 20 66 69 6c   delete test fil
1a590 65 20 5c 22 22 20 24 66 69 6c 65 4e 61 6d 65 20  e \"" $fileName 
1a5a0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
1a5b0 20 20 20 22 5c 22 20 64 75 72 69 6e 67 20 63 6c     "\" during cl
1a5c0 65 61 6e 75 70 2c 20 65 72 72 6f 72 3a 20 22 20  eanup, error: " 
1a5d0 5c 6e 5c 74 20 24 65 72 72 6f 72 20 5c 6e 5d 0d  \n\t $error \n].
1a5e0 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  .          }..  
1a5f0 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
1a600 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
1a610 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53         # NOTE: S
1a620 68 6f 77 20 74 68 61 74 20 77 65 20 73 6b 69 70  how that we skip
1a630 70 65 64 20 64 65 6c 65 74 69 6e 67 20 74 68 65  ped deleting the
1a640 20 66 69 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20   file...        
1a650 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 73    #..          s
1a660 65 74 20 63 6f 64 65 20 30 0d 0a 0d 0a 20 20 20  et code 0....   
1a670 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
1a680 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70  test_channel [ap
1a690 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
1a6a0 20 20 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20            "==== 
1a6b0 57 41 52 4e 49 4e 47 3a 20 73 6b 69 70 70 65 64  WARNING: skipped
1a6c0 20 64 65 6c 65 74 69 6e 67 20 74 65 73 74 20 66   deleting test f
1a6d0 69 6c 65 20 5c 22 22 20 24 66 69 6c 65 4e 61 6d  ile \"" $fileNam
1a6e0 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e \..           
1a6f0 20 20 20 22 5c 22 20 64 75 72 69 6e 67 20 63 6c     "\" during cl
1a700 65 61 6e 75 70 5c 6e 22 5d 0d 0a 20 20 20 20 20  eanup\n"]..     
1a710 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 20 65 6c     }..      } el
1a720 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d  se {..        #.
1a730 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
1a740 20 54 68 65 20 66 69 6c 65 20 64 6f 65 73 20 6e   The file does n
1a750 6f 74 20 65 78 69 73 74 2c 20 73 75 63 63 65 73  ot exist, succes
1a760 73 21 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  s!..        #.. 
1a770 20 20 20 20 20 20 20 73 65 74 20 63 6f 64 65 20         set code 
1a780 30 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  0..      }....  
1a790 20 20 20 20 72 65 74 75 72 6e 20 24 63 6f 64 65      return $code
1a7a0 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
1a7b0 70 72 6f 63 20 63 6c 65 61 6e 75 70 4d 65 6d 6f  proc cleanupMemo
1a7c0 72 79 20 7b 20 76 61 72 4e 61 6d 65 20 7b 71 75  ry { varName {qu
1a7d0 69 65 74 20 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a  iet false} } {..
1a7e0 20 20 20 20 20 20 69 66 20 7b 5b 68 61 76 65 53        if {[haveS
1a7f0 51 4c 69 74 65 4f 62 6a 65 63 74 43 6f 6d 6d 61  QLiteObjectComma
1a800 6e 64 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20  nd] && \..      
1a810 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67      [string leng
1a820 74 68 20 24 76 61 72 4e 61 6d 65 5d 20 3e 20 30  th $varName] > 0
1a830 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
1a840 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
1a850 4f 54 45 3a 20 52 65 66 65 72 20 74 6f 20 74 68  OTE: Refer to th
1a860 65 20 73 70 65 63 69 66 69 65 64 20 76 61 72 69  e specified vari
1a870 61 62 6c 65 20 28 65 2e 67 2e 20 22 63 6f 6e 6e  able (e.g. "conn
1a880 65 63 74 69 6f 6e 22 29 20 69 6e 20 74 68 65 0d  ection") in the.
1a890 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
1a8a0 20 63 6f 6e 74 65 78 74 20 6f 66 20 6f 75 72 20   context of our 
1a8b0 63 61 6c 6c 65 72 2e 20 20 54 68 65 20 6f 70 61  caller.  The opa
1a8c0 71 75 65 20 6f 62 6a 65 63 74 20 68 61 6e 64 6c  que object handl
1a8d0 65 20 66 6f 72 20 61 6e 0d 0a 20 20 20 20 20 20  e for an..      
1a8e0 20 20 23 20 20 20 20 20 20 20 41 44 4f 2e 4e 45    #       ADO.NE
1a8f0 54 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 72 65  T connection pre
1a900 76 69 6f 75 73 6c 79 20 72 65 74 75 72 6e 65 64  viously returned
1a910 20 62 79 20 5b 67 65 74 44 62 43 6f 6e 6e 65 63   by [getDbConnec
1a920 74 69 6f 6e 5d 0d 0a 20 20 20 20 20 20 20 20 23  tion]..        #
1a930 20 20 20 20 20 20 20 73 68 6f 75 6c 64 20 62 65         should be
1a940 20 73 74 6f 72 65 64 20 74 68 65 72 65 2e 0d 0a   stored there...
1a950 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
1a960 20 20 20 75 70 76 61 72 20 31 20 24 76 61 72 4e     upvar 1 $varN
1a970 61 6d 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0d 0a  ame connection..
1a980 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63  ..        if {[c
1a990 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20  atch {..        
1a9a0 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20    object invoke 
1a9b0 24 63 6f 6e 6e 65 63 74 69 6f 6e 20 52 65 6c 65  $connection Rele
1a9c0 61 73 65 4d 65 6d 6f 72 79 0d 0a 20 20 20 20 20  aseMemory..     
1a9d0 20 20 20 7d 20 72 65 73 75 6c 74 5d 7d 20 74 68     } result]} th
1a9e0 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
1a9f0 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65  if {!$quiet} the
1aa00 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
1aa10 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
1aa20 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
1aa30 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
1aa40 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e        "==== WARN
1aa50 49 4e 47 3a 20 66 61 69 6c 65 64 20 74 6f 20 72  ING: failed to r
1aa60 65 6c 65 61 73 65 20 64 61 74 61 62 61 73 65 20  elease database 
1aa70 6d 65 6d 6f 72 79 2c 20 65 72 72 6f 72 3a 20 22  memory, error: "
1aa80 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
1aa90 20 20 20 20 5c 6e 5c 74 20 24 72 65 73 75 6c 74      \n\t $result
1aaa0 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20   \n]..          
1aab0 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  }..        }..  
1aac0 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 69      }....      i
1aad0 66 20 7b 5b 6c 6c 65 6e 67 74 68 20 5b 69 6e 66  f {[llength [inf
1aae0 6f 20 63 6f 6d 6d 61 6e 64 73 20 64 65 62 75 67  o commands debug
1aaf0 5d 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  ]] > 0} then {..
1ab00 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74          if {[cat
1ab10 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  ch {..          
1ab20 75 70 6c 65 76 65 6c 20 31 20 5b 6c 69 73 74 20  uplevel 1 [list 
1ab30 64 65 62 75 67 20 70 75 72 67 65 5d 0d 0a 20 20  debug purge]..  
1ab40 20 20 20 20 20 20 7d 20 72 65 73 75 6c 74 5d 7d        } result]}
1ab50 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
1ab60 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20     if {!$quiet} 
1ab70 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
1ab80 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
1ab90 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e  t_channel [appen
1aba0 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
1abb0 20 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57           "==== W
1abc0 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20 74  ARNING: failed t
1abd0 6f 20 70 75 72 67 65 20 63 61 6c 6c 20 66 72 61  o purge call fra
1abe0 6d 65 2c 20 65 72 72 6f 72 3a 20 22 20 5c 0d 0a  me, error: " \..
1abf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ac00 5c 6e 5c 74 20 24 72 65 73 75 6c 74 20 5c 6e 5d  \n\t $result \n]
1ac10 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20  ..          }.. 
1ac20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
1ac30 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b      if {[catch {
1ac40 0d 0a 20 20 20 20 20 20 20 20 20 20 75 70 6c 65  ..          uple
1ac50 76 65 6c 20 31 20 5b 6c 69 73 74 20 64 65 62 75  vel 1 [list debu
1ac60 67 20 63 6c 65 61 6e 75 70 5d 0d 0a 20 20 20 20  g cleanup]..    
1ac70 20 20 20 20 7d 20 72 65 73 75 6c 74 5d 7d 20 74      } result]} t
1ac80 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
1ac90 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68   if {!$quiet} th
1aca0 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
1acb0 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
1acc0 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
1acd0 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
1ace0 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52         "==== WAR
1acf0 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20 74 6f 20  NING: failed to 
1ad00 63 6c 65 61 6e 75 70 20 69 6e 74 65 72 70 72 65  cleanup interpre
1ad10 74 65 72 2c 20 65 72 72 6f 72 3a 20 22 20 5c 0d  ter, error: " \.
1ad20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1ad30 20 5c 6e 5c 74 20 24 72 65 73 75 6c 74 20 5c 6e   \n\t $result \n
1ad40 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  ]..          }..
1ad50 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
1ad60 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20       if {[catch 
1ad70 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 75 70 6c  {..          upl
1ad80 65 76 65 6c 20 31 20 5b 6c 69 73 74 20 64 65 62  evel 1 [list deb
1ad90 75 67 20 63 6f 6c 6c 65 63 74 5d 0d 0a 20 20 20  ug collect]..   
1ada0 20 20 20 20 20 7d 20 72 65 73 75 6c 74 5d 7d 20       } result]} 
1adb0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
1adc0 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74    if {!$quiet} t
1add0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
1ade0 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
1adf0 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  _channel [append
1ae00 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
1ae10 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41          "==== WA
1ae20 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20 74 6f  RNING: failed to
1ae30 20 63 6f 6c 6c 65 63 74 20 67 61 72 62 61 67 65   collect garbage
1ae40 2c 20 65 72 72 6f 72 3a 20 22 20 5c 0d 0a 20 20  , error: " \..  
1ae50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 6e                \n
1ae60 5c 74 20 24 72 65 73 75 6c 74 20 5c 6e 5d 0d 0a  \t $result \n]..
1ae70 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
1ae80 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d       }..      }.
1ae90 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70  .    }.....    p
1aea0 72 6f 63 20 73 65 74 75 70 4d 65 6d 6f 72 79 43  roc setupMemoryC
1aeb0 6f 75 6e 74 65 72 73 20 7b 20 76 61 72 4e 61 6d  ounters { varNam
1aec0 65 20 7d 20 7b 0d 0a 20 20 20 20 20 20 69 66 20  e } {..      if 
1aed0 7b 5b 68 61 76 65 53 51 4c 69 74 65 4f 62 6a 65  {[haveSQLiteObje
1aee0 63 74 43 6f 6d 6d 61 6e 64 5d 7d 20 74 68 65 6e  ctCommand]} then
1aef0 20 7b 0d 0a 20 20 20 20 20 20 20 20 75 70 76 61   {..        upva
1af00 72 20 31 20 24 76 61 72 4e 61 6d 65 20 63 6f 75  r 1 $varName cou
1af10 6e 74 65 72 0d 0a 0d 0a 20 20 20 20 20 20 20 20  nter....        
1af20 73 65 74 20 63 6f 75 6e 74 65 72 28 31 29 20 5b  set counter(1) [
1af30 6f 62 6a 65 63 74 20 63 72 65 61 74 65 20 2d 61  object create -a
1af40 6c 69 61 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  lias \..        
1af50 20 20 20 20 53 79 73 74 65 6d 2e 44 69 61 67 6e      System.Diagn
1af60 6f 73 74 69 63 73 2e 50 65 72 66 6f 72 6d 61 6e  ostics.Performan
1af70 63 65 43 6f 75 6e 74 65 72 20 50 72 6f 63 65 73  ceCounter Proces
1af80 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
1af90 20 22 57 6f 72 6b 69 6e 67 20 53 65 74 22 20 5b   "Working Set" [
1afa0 66 69 6c 65 20 72 6f 6f 74 6e 61 6d 65 20 5b 66  file rootname [f
1afb0 69 6c 65 20 74 61 69 6c 20 24 3a 3a 62 69 6e 5f  ile tail $::bin_
1afc0 66 69 6c 65 5d 5d 5d 0d 0a 0d 0a 20 20 20 20 20  file]]]....     
1afd0 20 20 20 73 65 74 20 63 6f 75 6e 74 65 72 28 32     set counter(2
1afe0 29 20 5b 6f 62 6a 65 63 74 20 63 72 65 61 74 65  ) [object create
1aff0 20 2d 61 6c 69 61 73 20 5c 0d 0a 20 20 20 20 20   -alias \..     
1b000 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44 69         System.Di
1b010 61 67 6e 6f 73 74 69 63 73 2e 50 65 72 66 6f 72  agnostics.Perfor
1b020 6d 61 6e 63 65 43 6f 75 6e 74 65 72 20 50 72 6f  manceCounter Pro
1b030 63 65 73 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  cess \..        
1b040 20 20 20 20 22 57 6f 72 6b 69 6e 67 20 53 65 74      "Working Set
1b050 20 50 65 61 6b 22 20 5b 66 69 6c 65 20 72 6f 6f   Peak" [file roo
1b060 74 6e 61 6d 65 20 5b 66 69 6c 65 20 74 61 69 6c  tname [file tail
1b070 20 24 3a 3a 62 69 6e 5f 66 69 6c 65 5d 5d 5d 0d   $::bin_file]]].
1b080 0a 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 63  ...        set c
1b090 6f 75 6e 74 65 72 28 33 29 20 5b 6f 62 6a 65 63  ounter(3) [objec
1b0a0 74 20 63 72 65 61 74 65 20 2d 61 6c 69 61 73 20  t create -alias 
1b0b0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 53  \..            S
1b0c0 79 73 74 65 6d 2e 44 69 61 67 6e 6f 73 74 69 63  ystem.Diagnostic
1b0d0 73 2e 50 65 72 66 6f 72 6d 61 6e 63 65 43 6f 75  s.PerformanceCou
1b0e0 6e 74 65 72 20 50 72 6f 63 65 73 73 20 5c 0d 0a  nter Process \..
1b0f0 20 20 20 20 20 20 20 20 20 20 20 20 22 50 72 69              "Pri
1b100 76 61 74 65 20 42 79 74 65 73 22 20 5b 66 69 6c  vate Bytes" [fil
1b110 65 20 72 6f 6f 74 6e 61 6d 65 20 5b 66 69 6c 65  e rootname [file
1b120 20 74 61 69 6c 20 24 3a 3a 62 69 6e 5f 66 69 6c   tail $::bin_fil
1b130 65 5d 5d 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d  e]]]..      }...
1b140 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 22 22  .      return ""
1b150 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
1b160 70 72 6f 63 20 72 65 70 6f 72 74 4d 65 6d 6f 72  proc reportMemor
1b170 79 43 6f 75 6e 74 65 72 73 20 7b 20 63 68 61 6e  yCounters { chan
1b180 6e 65 6c 20 76 61 72 4e 61 6d 65 20 70 72 65 66  nel varName pref
1b190 69 78 20 7d 20 7b 0d 0a 20 20 20 20 20 20 69 66  ix } {..      if
1b1a0 20 7b 5b 68 61 76 65 53 51 4c 69 74 65 4f 62 6a   {[haveSQLiteObj
1b1b0 65 63 74 43 6f 6d 6d 61 6e 64 5d 7d 20 74 68 65  ectCommand]} the
1b1c0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 75 70 76  n {..        upv
1b1d0 61 72 20 31 20 24 76 61 72 4e 61 6d 65 20 63 6f  ar 1 $varName co
1b1e0 75 6e 74 65 72 0d 0a 0d 0a 20 20 20 20 20 20 20  unter....       
1b1f0 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
1b200 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
1b210 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
1b220 20 22 20 24 70 72 65 66 69 78 20 22 20 63 6f 75   " $prefix " cou
1b230 6e 74 65 72 20 5c 22 22 20 5c 0d 0a 20 20 20 20  nter \"" \..    
1b240 20 20 20 20 20 20 20 20 5b 6f 62 6a 65 63 74 20          [object 
1b250 69 6e 76 6f 6b 65 20 24 63 6f 75 6e 74 65 72 28  invoke $counter(
1b260 31 29 20 43 6f 75 6e 74 65 72 4e 61 6d 65 5d 20  1) CounterName] 
1b270 22 5c 22 20 76 61 6c 75 65 20 69 73 20 22 20 5c  "\" value is " \
1b280 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 6f  ..            [o
1b290 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 24 63 6f  bject invoke $co
1b2a0 75 6e 74 65 72 28 31 29 20 52 61 77 56 61 6c 75  unter(1) RawValu
1b2b0 65 5d 20 5c 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20  e] \n]....      
1b2c0 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
1b2d0 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
1b2e0 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
1b2f0 2d 20 22 20 24 70 72 65 66 69 78 20 22 20 63 6f  - " $prefix " co
1b300 75 6e 74 65 72 20 5c 22 22 20 5c 0d 0a 20 20 20  unter \"" \..   
1b310 20 20 20 20 20 20 20 20 20 5b 6f 62 6a 65 63 74           [object
1b320 20 69 6e 76 6f 6b 65 20 24 63 6f 75 6e 74 65 72   invoke $counter
1b330 28 32 29 20 43 6f 75 6e 74 65 72 4e 61 6d 65 5d  (2) CounterName]
1b340 20 22 5c 22 20 76 61 6c 75 65 20 69 73 20 22 20   "\" value is " 
1b350 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b  \..            [
1b360 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 24 63  object invoke $c
1b370 6f 75 6e 74 65 72 28 32 29 20 52 61 77 56 61 6c  ounter(2) RawVal
1b380 75 65 5d 20 5c 6e 5d 0d 0a 0d 0a 20 20 20 20 20  ue] \n]....     
1b390 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
1b3a0 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
1b3b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d  .            "--
1b3c0 2d 2d 20 22 20 24 70 72 65 66 69 78 20 22 20 63  -- " $prefix " c
1b3d0 6f 75 6e 74 65 72 20 5c 22 22 20 5c 0d 0a 20 20  ounter \"" \..  
1b3e0 20 20 20 20 20 20 20 20 20 20 5b 6f 62 6a 65 63            [objec
1b3f0 74 20 69 6e 76 6f 6b 65 20 24 63 6f 75 6e 74 65  t invoke $counte
1b400 72 28 33 29 20 43 6f 75 6e 74 65 72 4e 61 6d 65  r(3) CounterName
1b410 5d 20 22 5c 22 20 76 61 6c 75 65 20 69 73 20 22  ] "\" value is "
1b420 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
1b430 5b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 24  [object invoke $
1b440 63 6f 75 6e 74 65 72 28 33 29 20 52 61 77 56 61  counter(3) RawVa
1b450 6c 75 65 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20 20  lue] \n]..      
1b460 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  }..    }.....   
1b470 20 70 72 6f 63 20 63 6f 6c 6c 65 63 74 47 61 72   proc collectGar
1b480 62 61 67 65 20 7b 20 63 68 61 6e 6e 65 6c 20 7b  bage { channel {
1b490 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20 31 30 30  milliseconds 100
1b4a0 30 7d 20 7b 71 75 69 65 74 20 74 72 75 65 7d 20  0} {quiet true} 
1b4b0 7d 20 7b 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b  } {..      if {[
1b4c0 68 61 76 65 53 51 4c 69 74 65 4f 62 6a 65 63 74  haveSQLiteObject
1b4d0 43 6f 6d 6d 61 6e 64 5d 7d 20 74 68 65 6e 20 7b  Command]} then {
1b4e0 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63  ..        if {[c
1b4f0 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20  atch {..        
1b500 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20    object invoke 
1b510 47 43 20 47 65 74 54 6f 74 61 6c 4d 65 6d 6f 72  GC GetTotalMemor
1b520 79 20 66 61 6c 73 65 0d 0a 20 20 20 20 20 20 20  y false..       
1b530 20 7d 20 72 65 73 75 6c 74 5d 20 3d 3d 20 30 7d   } result] == 0}
1b540 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
1b550 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20     if {!$quiet} 
1b560 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
1b570 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
1b580 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
1b590 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1b5a0 20 20 22 2d 2d 2d 2d 20 6d 65 6d 6f 72 79 20 69    "---- memory i
1b5b0 6e 20 75 73 65 20 62 79 20 74 68 65 20 43 4c 52  n use by the CLR
1b5c0 20 62 65 66 6f 72 65 20 63 6f 6c 6c 65 63 74 69   before collecti
1b5d0 6f 6e 2e 2e 2e 20 22 20 5c 0d 0a 20 20 20 20 20  on... " \..     
1b5e0 20 20 20 20 20 20 20 20 20 20 20 24 72 65 73 75             $resu
1b5f0 6c 74 20 22 20 62 79 74 65 73 5c 6e 22 5d 0d 0a  lt " bytes\n"]..
1b600 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
1b610 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
1b620 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
1b630 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
1b640 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
1b650 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49       "==== WARNI
1b660 4e 47 3a 20 66 61 69 6c 65 64 20 74 6f 20 67 65  NG: failed to ge
1b670 74 20 43 4c 52 20 6d 65 6d 6f 72 79 20 75 73 61  t CLR memory usa
1b680 67 65 2c 20 65 72 72 6f 72 3a 20 22 20 5c 0d 0a  ge, error: " \..
1b690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 6e                \n
1b6a0 5c 74 20 24 72 65 73 75 6c 74 20 5c 6e 5d 0d 0a  \t $result \n]..
1b6b0 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
1b6c0 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 23 23 23   }....      ####
1b6d0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1b6e0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1b6f0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1b700 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1b710 23 23 23 23 23 0d 0a 0d 0a 20 20 20 20 20 20 23  #####....      #
1b720 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
1b730 52 65 70 65 61 74 65 64 6c 79 20 61 74 74 65 6d  Repeatedly attem
1b740 70 74 20 74 6f 20 63 6f 6c 6c 65 63 74 20 67 61  pt to collect ga
1b750 72 62 61 67 65 20 75 6e 74 69 6c 20 74 68 65 20  rbage until the 
1b760 61 6c 6c 6f 74 74 65 64 20 6e 75 6d 62 65 72 0d  allotted number.
1b770 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 6f  .      #       o
1b780 66 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20 68  f milliseconds h
1b790 61 73 20 65 6c 61 70 73 65 64 2e 20 20 41 6c 77  as elapsed.  Alw
1b7a0 61 79 73 20 61 74 74 65 6d 70 74 20 74 6f 20 63  ays attempt to c
1b7b0 6f 6c 6c 65 63 74 20 67 61 72 62 61 67 65 0d 0a  ollect garbage..
1b7c0 20 20 20 20 20 20 23 20 20 20 20 20 20 20 61 74        #       at
1b7d0 20 6c 65 61 73 74 20 6f 6e 63 65 2e 0d 0a 20 20   least once...  
1b7e0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20      #..      if 
1b7f0 7b 5b 68 61 76 65 53 51 4c 69 74 65 4f 62 6a 65  {[haveSQLiteObje
1b800 63 74 43 6f 6d 6d 61 6e 64 5d 7d 20 74 68 65 6e  ctCommand]} then
1b810 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20   {..        set 
1b820 73 74 61 72 74 20 5b 63 6c 6f 63 6b 20 73 65 63  start [clock sec
1b830 6f 6e 64 73 5d 0d 0a 20 20 20 20 20 20 20 20 73  onds]..        s
1b840 65 74 20 73 74 6f 70 20 5b 65 78 70 72 20 7b 24  et stop [expr {$
1b850 73 74 61 72 74 20 2b 20 28 24 6d 69 6c 6c 69 73  start + ($millis
1b860 65 63 6f 6e 64 73 20 2f 20 31 30 30 30 29 7d 5d  econds / 1000)}]
1b870 0d 0a 0d 0a 20 20 20 20 20 20 20 20 64 6f 20 7b  ....        do {
1b880 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20  ..          #.. 
1b890 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a           # NOTE:
1b8a0 20 41 74 74 65 6d 70 74 20 74 6f 20 66 6f 72 63   Attempt to forc
1b8b0 65 20 61 20 66 75 6c 6c 20 67 61 72 62 61 67 65  e a full garbage
1b8c0 20 63 6f 6c 6c 65 63 74 69 6f 6e 20 6e 6f 77 2e   collection now.
1b8d0 20 20 52 65 70 6f 72 74 20 61 6e 79 0d 0a 20 20    Report any..  
1b8e0 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
1b8f0 65 72 72 6f 72 20 74 68 61 74 20 69 73 20 65 6e  error that is en
1b900 63 6f 75 6e 74 65 72 65 64 20 69 66 20 77 65 20  countered if we 
1b910 66 61 69 6c 2e 0d 0a 20 20 20 20 20 20 20 20 20  fail...         
1b920 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66   #..          if
1b930 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20   {[catch {..    
1b940 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69          object i
1b950 6e 76 6f 6b 65 20 47 43 20 47 65 74 54 6f 74 61  nvoke GC GetTota
1b960 6c 4d 65 6d 6f 72 79 20 74 72 75 65 0d 0a 20 20  lMemory true..  
1b970 20 20 20 20 20 20 20 20 7d 20 65 72 72 6f 72 5d          } error]
1b980 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
1b990 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
1b9a0 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
1b9b0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
1b9c0 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e      "==== WARNIN
1b9d0 47 3a 20 66 61 69 6c 65 64 20 66 75 6c 6c 20 67  G: failed full g
1b9e0 61 72 62 61 67 65 20 63 6f 6c 6c 65 63 74 69 6f  arbage collectio
1b9f0 6e 2c 20 65 72 72 6f 72 3a 20 22 20 5c 0d 0a 20  n, error: " \.. 
1ba00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
1ba10 6e 5c 74 20 24 65 72 72 6f 72 20 5c 6e 5d 0d 0a  n\t $error \n]..
1ba20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20            }.... 
1ba30 20 20 20 20 20 20 20 20 20 73 65 74 20 6e 6f 77           set now
1ba40 20 5b 63 6c 6f 63 6b 20 73 65 63 6f 6e 64 73 5d   [clock seconds]
1ba50 0d 0a 20 20 20 20 20 20 20 20 7d 20 77 68 69 6c  ..        } whil
1ba60 65 20 7b 24 73 74 61 72 74 20 3c 3d 20 24 6e 6f  e {$start <= $no
1ba70 77 20 26 26 20 24 6e 6f 77 20 3c 20 24 73 74 6f  w && $now < $sto
1ba80 70 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  p}..      }.... 
1ba90 20 20 20 20 20 23 23 23 23 23 23 23 23 23 23 23       ###########
1baa0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1bab0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1bac0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1bad0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0d 0a  ##############..
1bae0 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 68 61 76  ..      if {[hav
1baf0 65 53 51 4c 69 74 65 4f 62 6a 65 63 74 43 6f 6d  eSQLiteObjectCom
1bb00 6d 61 6e 64 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  mand]} then {.. 
1bb10 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63         if {[catc
1bb20 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 6f  h {..          o
1bb30 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 47 43 20  bject invoke GC 
1bb40 47 65 74 54 6f 74 61 6c 4d 65 6d 6f 72 79 20 66  GetTotalMemory f
1bb50 61 6c 73 65 0d 0a 20 20 20 20 20 20 20 20 7d 20  alse..        } 
1bb60 72 65 73 75 6c 74 5d 20 3d 3d 20 30 7d 20 74 68  result] == 0} th
1bb70 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
1bb80 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65  if {!$quiet} the
1bb90 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
1bba0 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
1bbb0 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
1bbc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
1bbd0 2d 2d 2d 2d 20 6d 65 6d 6f 72 79 20 69 6e 20 75  ---- memory in u
1bbe0 73 65 20 62 79 20 74 68 65 20 43 4c 52 20 61 66  se by the CLR af
1bbf0 74 65 72 20 63 6f 6c 6c 65 63 74 69 6f 6e 2e 2e  ter collection..
1bc00 2e 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  . " \..         
1bc10 20 20 20 20 20 20 20 24 72 65 73 75 6c 74 20 22         $result "
1bc20 20 62 79 74 65 73 5c 6e 22 5d 0d 0a 20 20 20 20   bytes\n"]..    
1bc30 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
1bc40 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
1bc50 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
1bc60 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
1bc70 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
1bc80 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20   "==== WARNING: 
1bc90 66 61 69 6c 65 64 20 74 6f 20 67 65 74 20 43 4c  failed to get CL
1bca0 52 20 6d 65 6d 6f 72 79 20 75 73 61 67 65 2c 20  R memory usage, 
1bcb0 65 72 72 6f 72 3a 20 22 20 5c 0d 0a 20 20 20 20  error: " \..    
1bcc0 20 20 20 20 20 20 20 20 20 20 5c 6e 5c 74 20 24            \n\t $
1bcd0 72 65 73 75 6c 74 20 5c 6e 5d 0d 0a 20 20 20 20  result \n]..    
1bce0 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a      }..      }..
1bcf0 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
1bd00 6f 63 20 67 65 74 53 51 4c 69 74 65 48 61 6e 64  oc getSQLiteHand
1bd10 6c 65 43 6f 75 6e 74 73 20 7b 20 63 68 61 6e 6e  leCounts { chann
1bd20 65 6c 20 7b 71 75 69 65 74 20 66 61 6c 73 65 7d  el {quiet false}
1bd30 20 7d 20 7b 0d 0a 20 20 20 20 20 20 73 65 74 20   } {..      set 
1bd40 72 65 73 75 6c 74 20 5b 6c 69 73 74 5d 0d 0a 0d  result [list]...
1bd50 0a 20 20 20 20 20 20 69 66 20 7b 5b 68 61 76 65  .      if {[have
1bd60 53 51 4c 69 74 65 4f 62 6a 65 63 74 43 6f 6d 6d  SQLiteObjectComm
1bd70 61 6e 64 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20  and] && \..     
1bd80 20 20 20 20 20 5b 68 61 76 65 53 51 4c 69 74 65       [haveSQLite
1bd90 44 65 66 69 6e 65 43 6f 6e 73 74 61 6e 74 20 43  DefineConstant C
1bda0 4f 55 4e 54 5f 48 41 4e 44 4c 45 5d 7d 20 74 68  OUNT_HANDLE]} th
1bdb0 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d  en {..        #.
1bdc0 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
1bdd0 20 41 64 64 20 65 61 63 68 20 63 72 69 74 69 63   Add each critic
1bde0 61 6c 20 68 61 6e 64 6c 65 20 63 6f 75 6e 74 20  al handle count 
1bdf0 74 6f 20 74 68 65 20 72 65 73 75 6c 74 69 6e 67  to the resulting
1be00 20 6c 69 73 74 2e 0d 0a 20 20 20 20 20 20 20 20   list...        
1be10 23 0d 0a 20 20 20 20 20 20 20 20 66 6f 72 65 61  #..        forea
1be20 63 68 20 6e 61 6d 65 20 5b 6c 69 73 74 20 5c 0d  ch name [list \.
1be30 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e  .            con
1be40 6e 65 63 74 69 6f 6e 43 6f 75 6e 74 20 73 74 61  nectionCount sta
1be50 74 65 6d 65 6e 74 43 6f 75 6e 74 20 62 61 63 6b  tementCount back
1be60 75 70 43 6f 75 6e 74 20 62 6c 6f 62 43 6f 75 6e  upCount blobCoun
1be70 74 5d 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  t] {..          
1be80 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20  if {[catch {..  
1be90 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74            object
1bea0 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b   invoke -flags +
1beb0 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20  NonPublic \..   
1bec0 20 20 20 20 20 20 20 20 20 20 20 20 20 53 79 73               Sys
1bed0 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e  tem.Data.SQLite.
1bee0 44 65 62 75 67 44 61 74 61 20 24 6e 61 6d 65 0d  DebugData $name.
1bef0 0a 20 20 20 20 20 20 20 20 20 20 7d 20 76 61 6c  .          } val
1bf00 75 65 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b  ue] == 0} then {
1bf10 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ..            if
1bf20 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20   {!$quiet} then 
1bf30 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
1bf40 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
1bf50 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
1bf60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bf70 20 22 2d 2d 2d 2d 20 63 72 69 74 69 63 61 6c 20   "---- critical 
1bf80 68 61 6e 64 6c 65 20 63 6f 75 6e 74 20 5c 22 22  handle count \""
1bf90 20 24 6e 61 6d 65 20 22 5c 22 20 69 73 20 22 20   $name "\" is " 
1bfa0 24 76 61 6c 75 65 20 5c 6e 5d 0d 0a 20 20 20 20  $value \n]..    
1bfb0 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
1bfc0 20 20 20 20 20 20 20 20 20 6c 61 70 70 65 6e 64           lappend
1bfd0 20 72 65 73 75 6c 74 20 24 76 61 6c 75 65 0d 0a   result $value..
1bfe0 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65            } else
1bff0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
1c000 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b  tputs $channel [
1c010 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
1c020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 3d                "=
1c030 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61 69  === WARNING: fai
1c040 6c 65 64 20 74 6f 20 67 65 74 20 63 72 69 74 69  led to get criti
1c050 63 61 6c 20 68 61 6e 64 6c 65 20 63 6f 75 6e 74  cal handle count
1c060 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20 20 20   \"" \..        
1c070 20 20 20 20 20 20 20 20 24 6e 61 6d 65 20 22 5c          $name "\
1c080 22 2c 20 65 72 72 6f 72 3a 20 22 20 5c 6e 5c 74  ", error: " \n\t
1c090 20 24 76 61 6c 75 65 20 5c 6e 5d 0d 0a 20 20 20   $value \n]..   
1c0a0 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
1c0b0 20 20 7d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73    }..      } els
1c0c0 65 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68  eif {!$quiet} th
1c0d0 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d  en {..        #.
1c0e0 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
1c0f0 20 54 68 65 20 61 63 74 75 61 6c 20 68 61 6e 64   The actual hand
1c100 6c 65 20 63 6f 75 6e 74 73 20 61 72 65 20 6e 6f  le counts are no
1c110 74 20 61 76 61 69 6c 61 62 6c 65 3b 20 74 68 65  t available; the
1c120 72 65 66 6f 72 65 2c 20 6a 75 73 74 0d 0a 20 20  refore, just..  
1c130 20 20 20 20 20 20 23 20 20 20 20 20 20 20 72 65        #       re
1c140 74 75 72 6e 20 61 6e 20 65 6d 70 74 79 20 6c 69  turn an empty li
1c150 73 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  st...        #..
1c160 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
1c170 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 63 72 69  hannel "---- cri
1c180 74 69 63 61 6c 20 68 61 6e 64 6c 65 20 63 6f 75  tical handle cou
1c190 6e 74 73 20 75 6e 61 76 61 69 6c 61 62 6c 65 5c  nts unavailable\
1c1a0 6e 22 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  n"..      }.... 
1c1b0 20 20 20 20 20 72 65 74 75 72 6e 20 24 72 65 73       return $res
1c1c0 75 6c 74 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20  ult..    }..... 
1c1d0 20 20 20 70 72 6f 63 20 73 68 75 74 64 6f 77 6e     proc shutdown
1c1e0 53 51 4c 69 74 65 20 7b 20 63 68 61 6e 6e 65 6c  SQLite { channel
1c1f0 20 7b 66 6f 72 63 65 20 66 61 6c 73 65 7d 20 7b   {force false} {
1c200 71 75 69 65 74 20 66 61 6c 73 65 7d 20 7d 20 7b  quiet false} } {
1c210 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
1c220 20 23 20 4e 4f 54 45 3a 20 4d 61 6b 65 20 73 75   # NOTE: Make su
1c230 72 65 20 74 68 61 74 20 53 51 4c 69 74 65 20 63  re that SQLite c
1c240 6f 72 65 20 6c 69 62 72 61 72 79 20 69 73 20 63  ore library is c
1c250 6f 6d 70 6c 65 74 65 6c 79 20 73 68 75 74 64 6f  ompletely shutdo
1c260 77 6e 2e 20 20 54 68 69 73 0d 0a 20 20 20 20 20  wn.  This..     
1c270 20 23 20 20 20 20 20 20 20 69 73 20 75 73 65 64   #       is used
1c280 20 62 79 20 74 65 73 74 73 20 74 68 61 74 20 63   by tests that c
1c290 68 61 6e 67 65 20 63 6f 6e 66 69 67 75 72 61 74  hange configurat
1c2a0 69 6f 6e 20 6f 70 74 69 6f 6e 73 20 61 6e 64 2f  ion options and/
1c2b0 6f 72 20 74 68 6f 73 65 0d 0a 20 20 20 20 20 20  or those..      
1c2c0 23 20 20 20 20 20 20 20 74 68 61 74 20 6e 65 65  #       that nee
1c2d0 64 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 6c  d to make sure l
1c2e0 6f 67 67 69 6e 67 20 69 73 20 69 6e 69 74 69 61  ogging is initia
1c2f0 6c 69 7a 65 64 20 28 69 2e 65 2e 20 6a 75 73 74  lized (i.e. just
1c300 20 69 6e 20 63 61 73 65 0d 0a 20 20 20 20 20 20   in case..      
1c310 23 20 20 20 20 20 20 20 74 68 65 20 53 51 4c 69  #       the SQLi
1c320 74 65 20 63 6f 72 65 20 6c 69 62 72 61 72 79 20  te core library 
1c330 77 61 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20  was initialized 
1c340 69 6e 20 74 68 65 20 70 72 6f 63 65 73 73 20 70  in the process p
1c350 72 69 6f 72 20 74 6f 0d 0a 20 20 20 20 20 20 23  rior to..      #
1c360 20 20 20 20 20 20 20 74 68 65 20 53 51 4c 69 74         the SQLit
1c370 65 4c 6f 67 20 63 6c 61 73 73 20 62 65 69 6e 67  eLog class being
1c380 20 61 62 6c 65 20 74 6f 20 73 65 74 75 70 20 69   able to setup i
1c390 74 73 20 6c 6f 67 67 69 6e 67 20 63 61 6c 6c 62  ts logging callb
1c3a0 61 63 6b 29 2e 0d 0a 20 20 20 20 20 20 23 20 20  ack)...      #  
1c3b0 20 20 20 20 20 4e 6f 72 6d 61 6c 6c 79 2c 20 74       Normally, t
1c3c0 68 69 73 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20  his should only 
1c3d0 62 65 20 70 65 72 66 6f 72 6d 65 64 20 69 66 20  be performed if 
1c3e0 53 51 4c 69 74 65 20 69 73 20 6c 6f 61 64 65 64  SQLite is loaded
1c3f0 20 61 6e 64 0d 0a 20 20 20 20 20 20 23 20 20 20   and..      #   
1c400 20 20 20 20 72 65 61 64 79 20 66 6f 72 20 75 73      ready for us
1c410 65 20 62 79 20 74 68 65 20 74 65 73 74 20 73 75  e by the test su
1c420 69 74 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ite...      #.. 
1c430 20 20 20 20 20 69 66 20 7b 24 66 6f 72 63 65 20       if {$force 
1c440 7c 7c 20 5b 69 73 53 51 4c 69 74 65 52 65 61 64  || [isSQLiteRead
1c450 79 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  y]} then {..    
1c460 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
1c470 20 42 55 47 46 49 58 3a 20 4d 61 6b 65 20 73 75   BUGFIX: Make su
1c480 72 65 20 74 68 61 74 20 61 6e 79 20 22 6c 65 61  re that any "lea
1c490 6b 65 64 22 20 74 72 61 6e 73 61 63 74 69 6f 6e  ked" transaction
1c4a0 73 20 61 6e 64 2f 6f 72 20 63 6f 6e 6e 65 63 74  s and/or connect
1c4b0 69 6f 6e 73 0d 0a 20 20 20 20 20 20 20 20 23 20  ions..        # 
1c4c0 20 20 20 20 20 20 20 20 61 72 65 20 63 6c 65 61          are clea
1c4d0 6e 65 64 20 75 70 20 62 65 66 6f 72 65 20 63 61  ned up before ca
1c4e0 6c 6c 69 6e 67 20 74 68 65 20 6e 61 74 69 76 65  lling the native
1c4f0 20 73 68 75 74 64 6f 77 6e 20 66 75 6e 63 74 69   shutdown functi
1c500 6f 6e 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  on...        #..
1c510 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20          foreach 
1c520 74 72 61 6e 73 61 63 74 69 6f 6e 20 5b 69 6e 66  transaction [inf
1c530 6f 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 5d 20  o transactions] 
1c540 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20  {..          if 
1c550 7b 5b 73 74 72 69 6e 67 20 6d 61 74 63 68 20 5c  {[string match \
1c560 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1c570 53 79 73 74 65 6d 23 44 61 74 61 23 53 51 4c 69  System#Data#SQLi
1c580 74 65 23 53 51 4c 69 74 65 54 72 61 6e 73 61 63  te#SQLiteTransac
1c590 74 69 6f 6e 23 2a 20 24 74 72 61 6e 73 61 63 74  tion#* $transact
1c5a0 69 6f 6e 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ion]} then {..  
1c5b0 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63            if {[c
1c5c0 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20  atch {..        
1c5d0 20 20 20 20 20 20 73 71 6c 20 74 72 61 6e 73 61        sql transa
1c5e0 63 74 69 6f 6e 20 72 6f 6c 6c 62 61 63 6b 20 24  ction rollback $
1c5f0 74 72 61 6e 73 61 63 74 69 6f 6e 0d 0a 20 20 20  transaction..   
1c600 20 20 20 20 20 20 20 20 20 7d 20 65 72 72 6f 72           } error
1c610 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  ] == 0} then {..
1c620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
1c630 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20   {!$quiet} then 
1c640 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
1c650 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
1c660 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
1c670 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1c680 20 20 20 20 20 22 2d 2d 2d 2d 20 72 6f 6c 6c 65       "---- rolle
1c690 64 20 62 61 63 6b 20 6c 65 61 6b 65 64 20 74 72  d back leaked tr
1c6a0 61 6e 73 61 63 74 69 6f 6e 20 5c 22 22 20 5c 0d  ansaction \"" \.
1c6b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1c6c0 20 20 20 20 20 24 74 72 61 6e 73 61 63 74 69 6f       $transactio
1c6d0 6e 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20 20  n \"\n]..       
1c6e0 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
1c6f0 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
1c700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
1c710 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20   {!$quiet} then 
1c720 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
1c730 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
1c740 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
1c750 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1c760 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49       "==== WARNI
1c770 4e 47 3a 20 66 61 69 6c 65 64 20 74 6f 20 72 6f  NG: failed to ro
1c780 6c 6c 62 61 63 6b 20 6c 65 61 6b 65 64 20 74 72  llback leaked tr
1c790 61 6e 73 61 63 74 69 6f 6e 20 5c 22 22 20 5c 0d  ansaction \"" \.
1c7a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1c7b0 20 20 20 20 20 24 74 72 61 6e 73 61 63 74 69 6f       $transactio
1c7c0 6e 20 22 5c 22 2c 20 65 72 72 6f 72 3a 20 22 20  n "\", error: " 
1c7d0 5c 6e 5c 74 20 24 65 72 72 6f 72 20 5c 6e 5d 0d  \n\t $error \n].
1c7e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
1c7f0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
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 0d 0a 20 20 20 20 20        }....     
1c820 20 20 20 66 6f 72 65 61 63 68 20 64 62 20 5b 69     foreach db [i
1c830 6e 66 6f 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 5d  nfo connections]
1c840 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66   {..          if
1c850 20 7b 5b 73 74 72 69 6e 67 20 6d 61 74 63 68 20   {[string match 
1c860 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
1c870 20 53 79 73 74 65 6d 23 44 61 74 61 23 53 51 4c   System#Data#SQL
1c880 69 74 65 23 53 51 4c 69 74 65 43 6f 6e 6e 65 63  ite#SQLiteConnec
1c890 74 69 6f 6e 23 2a 20 24 64 62 5d 7d 20 74 68 65  tion#* $db]} the
1c8a0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
1c8b0 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 73 71 6c   if {[catch {sql
1c8c0 20 63 6c 6f 73 65 20 24 64 62 7d 20 65 72 72 6f   close $db} erro
1c8d0 72 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d  r] == 0} then {.
1c8e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
1c8f0 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e  f {!$quiet} then
1c900 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
1c910 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
1c920 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
1c930 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1c940 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 6c 6f 73        "---- clos
1c950 65 64 20 6c 65 61 6b 65 64 20 64 61 74 61 62 61  ed leaked databa
1c960 73 65 20 5c 22 22 20 24 64 62 20 5c 22 5c 6e 5d  se \"" $db \"\n]
1c970 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1c980 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  }..            }
1c990 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
1c9a0 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69         if {!$qui
1c9b0 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  et} then {..    
1c9c0 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
1c9d0 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  s $channel [appe
1c9e0 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
1c9f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 3d                "=
1ca00 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61 69  === WARNING: fai
1ca10 6c 65 64 20 74 6f 20 63 6c 6f 73 65 20 6c 65 61  led to close lea
1ca20 6b 65 64 20 64 61 74 61 62 61 73 65 20 5c 22 22  ked database \""
1ca30 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
1ca40 20 20 20 20 20 20 20 20 24 64 62 20 22 5c 22 2c          $db "\",
1ca50 20 65 72 72 6f 72 3a 20 22 20 5c 6e 5c 74 20 24   error: " \n\t $
1ca60 65 72 72 6f 72 20 5c 6e 5d 0d 0a 20 20 20 20 20  error \n]..     
1ca70 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
1ca80 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
1ca90 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
1caa0 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  }....        #..
1cab0 20 20 20 20 20 20 20 20 23 20 42 55 47 46 49 58          # BUGFIX
1cac0 3a 20 42 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67  : Before calling
1cad0 20 74 68 65 20 6e 61 74 69 76 65 20 73 68 75 74   the native shut
1cae0 64 6f 77 6e 20 66 75 6e 63 74 69 6f 6e 2c 20 6d  down function, m
1caf0 61 6b 65 20 73 75 72 65 20 62 6f 74 68 0d 0a 20  ake sure both.. 
1cb00 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 20         #        
1cb10 20 6f 66 20 74 68 65 20 50 52 41 47 4d 41 20 72   of the PRAGMA r
1cb20 65 6c 61 74 65 64 20 64 69 72 65 63 74 6f 72 79  elated directory
1cb30 20 6e 61 6d 65 73 20 61 72 65 20 66 72 65 65 64   names are freed
1cb40 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
1cb50 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72 53 51        checkForSQ
1cb60 4c 69 74 65 44 69 72 65 63 74 6f 72 69 65 73 20  LiteDirectories 
1cb70 24 63 68 61 6e 6e 65 6c 20 74 72 75 65 0d 0a 0d  $channel true...
1cb80 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61  .        if {[ca
1cb90 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  tch {..         
1cba0 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d   object invoke -
1cbb0 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63  flags +NonPublic
1cbc0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
1cbd0 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51    System.Data.SQ
1cbe0 4c 69 74 65 2e 55 6e 73 61 66 65 4e 61 74 69 76  Lite.UnsafeNativ
1cbf0 65 4d 65 74 68 6f 64 73 20 73 71 6c 69 74 65 33  eMethods sqlite3
1cc00 5f 73 68 75 74 64 6f 77 6e 0d 0a 20 20 20 20 20  _shutdown..     
1cc10 20 20 20 7d 20 72 65 73 75 6c 74 5d 20 3d 3d 20     } result] == 
1cc20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
1cc30 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74       if {!$quiet
1cc40 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
1cc50 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
1cc60 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
1cc70 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
1cc80 20 20 20 20 22 2d 2d 2d 2d 20 63 61 6c 6c 20 73      "---- call s
1cc90 71 6c 69 74 65 33 5f 73 68 75 74 64 6f 77 6e 28  qlite3_shutdown(
1cca0 29 2e 2e 2e 20 6f 6b 3a 20 22 20 24 72 65 73 75  )... ok: " $resu
1ccb0 6c 74 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20  lt \n]..        
1ccc0 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 20 65    }..        } e
1ccd0 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  lse {..         
1cce0 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68   if {!$quiet} th
1ccf0 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
1cd00 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
1cd10 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
1cd20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cd30 22 2d 2d 2d 2d 20 63 61 6c 6c 20 73 71 6c 69 74  "---- call sqlit
1cd40 65 33 5f 73 68 75 74 64 6f 77 6e 28 29 2e 2e 2e  e3_shutdown()...
1cd50 20 65 72 72 6f 72 3a 20 22 20 5c 6e 5c 74 20 24   error: " \n\t $
1cd60 72 65 73 75 6c 74 20 5c 6e 5d 0d 0a 20 20 20 20  result \n]..    
1cd70 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
1cd80 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20   }..      }..   
1cd90 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
1cda0 72 65 70 6f 72 74 53 51 4c 69 74 65 52 65 73 6f  reportSQLiteReso
1cdb0 75 72 63 65 73 20 7b 0d 0a 20 20 20 20 20 20 20  urces {..       
1cdc0 20 20 20 20 20 63 68 61 6e 6e 65 6c 20 7b 71 75       channel {qu
1cdd0 69 65 74 20 66 61 6c 73 65 7d 20 7b 72 65 73 65  iet false} {rese
1cde0 74 20 74 72 75 65 7d 20 7b 63 6f 6c 6c 65 63 74  t true} {collect
1cdf0 20 74 72 75 65 7d 20 7d 20 7b 0d 0a 20 20 20 20   true} } {..    
1ce00 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
1ce10 45 3a 20 49 66 20 61 76 61 69 6c 61 62 6c 65 2c  E: If available,
1ce20 20 72 65 70 6f 72 74 20 6f 6e 20 28 61 6e 64 20   report on (and 
1ce30 70 6f 73 73 69 62 6c 79 20 72 65 73 65 74 29 20  possibly reset) 
1ce40 74 68 65 20 72 75 6e 74 69 6d 65 0d 0a 20 20 20  the runtime..   
1ce50 20 20 20 23 20 20 20 20 20 20 20 63 6f 6e 66 69     #       confi
1ce60 67 75 72 61 74 69 6f 6e 20 73 74 61 74 69 73 74  guration statist
1ce70 69 63 73 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ics...      #.. 
1ce80 20 20 20 20 20 69 66 20 7b 5b 68 61 76 65 53 51       if {[haveSQ
1ce90 4c 69 74 65 4f 62 6a 65 63 74 43 6f 6d 6d 61 6e  LiteObjectComman
1cea0 64 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20  d] && \..       
1ceb0 20 20 20 5b 68 61 76 65 43 6f 6e 73 74 72 61 69     [haveConstrai
1cec0 6e 74 20 62 75 69 6c 64 43 6f 6e 66 69 67 75 72  nt buildConfigur
1ced0 61 74 69 6f 6e 2e 44 65 62 75 67 5d 7d 20 74 68  ation.Debug]} th
1cee0 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66  en {..        if
1cef0 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20   {[catch {..    
1cf00 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76        object inv
1cf10 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50  oke -flags +NonP
1cf20 75 62 6c 69 63 20 2d 61 6c 69 61 73 20 5c 0d 0a  ublic -alias \..
1cf30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 79                Sy
1cf40 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
1cf50 2e 44 65 62 75 67 44 61 74 61 20 73 65 74 74 69  .DebugData setti
1cf60 6e 67 52 65 61 64 43 6f 75 6e 74 73 0d 0a 20 20  ngReadCounts..  
1cf70 20 20 20 20 20 20 7d 20 73 65 74 74 69 6e 67 52        } settingR
1cf80 65 61 64 43 6f 75 6e 74 73 5d 20 3d 3d 20 30 7d  eadCounts] == 0}
1cf90 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
1cfa0 20 20 20 73 65 74 20 6e 61 6d 65 43 6f 75 6e 74     set nameCount
1cfb0 20 5b 24 73 65 74 74 69 6e 67 52 65 61 64 43 6f   [$settingReadCo
1cfc0 75 6e 74 73 20 43 6f 75 6e 74 5d 0d 0a 20 20 20  unts Count]..   
1cfd0 20 20 20 20 20 20 20 73 65 74 20 76 61 6c 75 65         set value
1cfe0 43 6f 75 6e 74 20 30 0d 0a 0d 0a 20 20 20 20 20  Count 0....     
1cff0 20 20 20 20 20 6f 62 6a 65 63 74 20 66 6f 72 65       object fore
1d000 61 63 68 20 2d 61 6c 69 61 73 20 70 61 69 72 20  ach -alias pair 
1d010 24 73 65 74 74 69 6e 67 52 65 61 64 43 6f 75 6e  $settingReadCoun
1d020 74 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  ts {..          
1d030 20 20 69 6e 63 72 20 76 61 6c 75 65 43 6f 75 6e    incr valueCoun
1d040 74 20 5b 24 70 61 69 72 20 56 61 6c 75 65 5d 0d  t [$pair Value].
1d050 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ...            i
1d060 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e  f {!$quiet} then
1d070 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
1d080 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
1d090 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
1d0a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d0b0 20 20 22 2d 2d 2d 2d 20 73 65 74 74 69 6e 67 20    "---- setting 
1d0c0 5c 22 22 20 5b 24 70 61 69 72 20 4b 65 79 5d 20  \"" [$pair Key] 
1d0d0 22 5c 22 20 77 61 73 20 72 65 61 64 20 22 20 5c  "\" was read " \
1d0e0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1d0f0 20 20 20 20 5b 24 70 61 69 72 20 56 61 6c 75 65      [$pair Value
1d100 5d 20 22 20 74 69 6d 65 73 5c 6e 22 5d 0d 0a 20  ] " times\n"].. 
1d110 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
1d120 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
1d130 20 20 20 20 20 20 20 69 66 20 7b 24 72 65 73 65         if {$rese
1d140 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  t} then {..     
1d150 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63         if {[catc
1d160 68 20 7b 24 73 65 74 74 69 6e 67 52 65 61 64 43  h {$settingReadC
1d170 6f 75 6e 74 73 20 43 6c 65 61 72 7d 20 65 72 72  ounts Clear} err
1d180 6f 72 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b  or] == 0} then {
1d190 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1d1a0 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65  if {!$quiet} the
1d1b0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
1d1c0 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
1d1d0 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
1d1e0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
1d1f0 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 72 65 73         "---- res
1d200 65 74 20 73 65 74 74 69 6e 67 20 73 74 61 74 69  et setting stati
1d210 73 74 69 63 73 20 66 6f 72 20 74 68 65 20 70 72  stics for the pr
1d220 65 76 69 6f 75 73 20 22 20 5c 0d 0a 20 20 20 20  evious " \..    
1d230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d240 24 6e 61 6d 65 43 6f 75 6e 74 20 22 20 6e 61 6d  $nameCount " nam
1d250 65 73 20 61 6e 64 20 22 20 24 76 61 6c 75 65 43  es and " $valueC
1d260 6f 75 6e 74 20 22 20 76 61 6c 75 65 73 20 72 65  ount " values re
1d270 61 64 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20  ad\n"]..        
1d280 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
1d290 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
1d2a0 20 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75               tpu
1d2b0 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70  ts $channel [app
1d2c0 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
1d2d0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 3d 3d               "==
1d2e0 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c  == WARNING: fail
1d2f0 65 64 20 74 6f 20 72 65 73 65 74 20 73 65 74 74  ed to reset sett
1d300 69 6e 67 20 73 74 61 74 69 73 74 69 63 73 20 66  ing statistics f
1d310 6f 72 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20  or " \..        
1d320 20 20 20 20 20 20 20 20 20 20 22 74 68 65 20 70            "the p
1d330 72 65 76 69 6f 75 73 20 22 20 24 6e 61 6d 65 43  revious " $nameC
1d340 6f 75 6e 74 20 22 20 6e 61 6d 65 73 20 61 6e 64  ount " names and
1d350 20 22 20 24 76 61 6c 75 65 43 6f 75 6e 74 20 5c   " $valueCount \
1d360 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1d370 20 20 20 20 22 20 76 61 6c 75 65 73 20 72 65 61      " values rea
1d380 64 2c 20 65 72 72 6f 72 3a 20 22 20 5c 6e 5c 74  d, error: " \n\t
1d390 20 24 65 72 72 6f 72 20 5c 6e 5d 0d 0a 20 20 20   $error \n]..   
1d3a0 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
1d3b0 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
1d3c0 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66   }....        if
1d3d0 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20   {[catch {..    
1d3e0 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76        object inv
1d3f0 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50  oke -flags +NonP
1d400 75 62 6c 69 63 20 2d 61 6c 69 61 73 20 5c 0d 0a  ublic -alias \..
1d410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 79                Sy
1d420 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
1d430 2e 44 65 62 75 67 44 61 74 61 20 73 65 74 74 69  .DebugData setti
1d440 6e 67 46 69 6c 65 52 65 61 64 43 6f 75 6e 74 73  ngFileReadCounts
1d450 0d 0a 20 20 20 20 20 20 20 20 7d 20 73 65 74 74  ..        } sett
1d460 69 6e 67 46 69 6c 65 52 65 61 64 43 6f 75 6e 74  ingFileReadCount
1d470 73 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d  s] == 0} then {.
1d480 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20 6e  .          set n
1d490 61 6d 65 43 6f 75 6e 74 20 5b 24 73 65 74 74 69  ameCount [$setti
1d4a0 6e 67 46 69 6c 65 52 65 61 64 43 6f 75 6e 74 73  ngFileReadCounts
1d4b0 20 43 6f 75 6e 74 5d 0d 0a 20 20 20 20 20 20 20   Count]..       
1d4c0 20 20 20 73 65 74 20 76 61 6c 75 65 43 6f 75 6e     set valueCoun
1d4d0 74 20 30 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  t 0....         
1d4e0 20 6f 62 6a 65 63 74 20 66 6f 72 65 61 63 68 20   object foreach 
1d4f0 2d 61 6c 69 61 73 20 70 61 69 72 20 24 73 65 74  -alias pair $set
1d500 74 69 6e 67 46 69 6c 65 52 65 61 64 43 6f 75 6e  tingFileReadCoun
1d510 74 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  ts {..          
1d520 20 20 69 6e 63 72 20 76 61 6c 75 65 43 6f 75 6e    incr valueCoun
1d530 74 20 5b 24 70 61 69 72 20 56 61 6c 75 65 5d 0d  t [$pair Value].
1d540 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ...            i
1d550 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e  f {!$quiet} then
1d560 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
1d570 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
1d580 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
1d590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d5a0 20 20 22 2d 2d 2d 2d 20 73 65 74 74 69 6e 67 20    "---- setting 
1d5b0 5c 22 22 20 5b 24 70 61 69 72 20 4b 65 79 5d 20  \"" [$pair Key] 
1d5c0 22 5c 22 20 77 61 73 20 72 65 61 64 20 22 20 5c  "\" was read " \
1d5d0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1d5e0 20 20 20 20 5b 24 70 61 69 72 20 56 61 6c 75 65      [$pair Value
1d5f0 5d 20 22 20 74 69 6d 65 73 20 66 72 6f 6d 20 74  ] " times from t
1d600 68 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  he configuration
1d610 20 66 69 6c 65 5c 6e 22 5d 0d 0a 20 20 20 20 20   file\n"]..     
1d620 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
1d630 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
1d640 20 20 20 69 66 20 7b 24 72 65 73 65 74 7d 20 74     if {$reset} t
1d650 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
1d660 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 24     if {[catch {$
1d670 73 65 74 74 69 6e 67 46 69 6c 65 52 65 61 64 43  settingFileReadC
1d680 6f 75 6e 74 73 20 43 6c 65 61 72 7d 20 65 72 72  ounts Clear} err
1d690 6f 72 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b  or] == 0} then {
1d6a0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1d6b0 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65  if {!$quiet} the
1d6c0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
1d6d0 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
1d6e0 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
1d6f0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
1d700 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 72 65 73         "---- res
1d710 65 74 20 73 65 74 74 69 6e 67 20 73 74 61 74 69  et setting stati
1d720 73 74 69 63 73 20 66 6f 72 20 74 68 65 20 70 72  stics for the pr
1d730 65 76 69 6f 75 73 20 22 20 5c 0d 0a 20 20 20 20  evious " \..    
1d740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d750 24 6e 61 6d 65 43 6f 75 6e 74 20 22 20 6e 61 6d  $nameCount " nam
1d760 65 73 20 61 6e 64 20 22 20 24 76 61 6c 75 65 43  es and " $valueC
1d770 6f 75 6e 74 20 22 20 76 61 6c 75 65 73 20 72 65  ount " values re
1d780 61 64 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20  ad " \..        
1d790 20 20 20 20 20 20 20 20 20 20 20 20 22 66 72 6f              "fro
1d7a0 6d 20 74 68 65 20 63 6f 6e 66 69 67 75 72 61 74  m the configurat
1d7b0 69 6f 6e 20 66 69 6c 65 5c 6e 22 5d 0d 0a 20 20  ion file\n"]..  
1d7c0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
1d7d0 20 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73             } els
1d7e0 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e {..           
1d7f0 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
1d800 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
1d810 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1d820 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47     "==== WARNING
1d830 3a 20 66 61 69 6c 65 64 20 74 6f 20 72 65 73 65  : failed to rese
1d840 74 20 73 65 74 74 69 6e 67 20 73 74 61 74 69 73  t setting statis
1d850 74 69 63 73 20 66 6f 72 20 22 20 5c 0d 0a 20 20  tics for " \..  
1d860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d870 22 74 68 65 20 70 72 65 76 69 6f 75 73 20 22 20  "the previous " 
1d880 24 6e 61 6d 65 43 6f 75 6e 74 20 22 20 6e 61 6d  $nameCount " nam
1d890 65 73 20 61 6e 64 20 22 20 24 76 61 6c 75 65 43  es and " $valueC
1d8a0 6f 75 6e 74 20 5c 0d 0a 20 20 20 20 20 20 20 20  ount \..        
1d8b0 20 20 20 20 20 20 20 20 20 20 22 20 76 61 6c 75            " valu
1d8c0 65 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  es read from the
1d8d0 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 66   configuration f
1d8e0 69 6c 65 2c 20 65 72 72 6f 72 3a 20 22 20 5c 6e  ile, error: " \n
1d8f0 5c 74 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  \t \..          
1d900 20 20 20 20 20 20 20 20 24 65 72 72 6f 72 20 5c          $error \
1d910 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  n]..            
1d920 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  }..          }..
1d930 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
1d940 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b   }....      if {
1d950 5b 68 61 76 65 53 51 4c 69 74 65 4f 62 6a 65 63  [haveSQLiteObjec
1d960 74 43 6f 6d 6d 61 6e 64 5d 20 26 26 20 5c 0d 0a  tCommand] && \..
1d970 20 20 20 20 20 20 20 20 20 20 5b 68 61 76 65 53            [haveS
1d980 51 4c 69 74 65 44 65 66 69 6e 65 43 6f 6e 73 74  QLiteDefineConst
1d990 61 6e 74 20 49 4e 54 45 52 4f 50 5f 56 49 52 54  ant INTEROP_VIRT
1d9a0 55 41 4c 5f 54 41 42 4c 45 5d 20 26 26 20 5c 0d  UAL_TABLE] && \.
1d9b0 0a 20 20 20 20 20 20 20 20 20 20 5b 68 61 76 65  .          [have
1d9c0 53 51 4c 69 74 65 44 65 66 69 6e 65 43 6f 6e 73  SQLiteDefineCons
1d9d0 74 61 6e 74 20 54 52 41 43 4b 5f 4d 45 4d 4f 52  tant TRACK_MEMOR
1d9e0 59 5f 42 59 54 45 53 5d 7d 20 74 68 65 6e 20 7b  Y_BYTES]} then {
1d9f0 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21 24  ..        if {!$
1da00 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20  quiet} then {.. 
1da10 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
1da20 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 63 75  channel "---- cu
1da30 72 72 65 6e 74 20 6d 65 6d 6f 72 79 20 69 6e 20  rrent memory in 
1da40 75 73 65 20 62 79 20 53 51 4c 69 74 65 4d 65 6d  use by SQLiteMem
1da50 6f 72 79 2e 2e 2e 20 22 0d 0a 20 20 20 20 20 20  ory... "..      
1da60 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69    }....        i
1da70 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20  f {[catch {..   
1da80 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e         object in
1da90 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e  voke -flags +Non
1daa0 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20  Public \..      
1dab0 20 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44          System.D
1dac0 61 74 61 2e 53 51 4c 69 74 65 2e 53 51 4c 69 74  ata.SQLite.SQLit
1dad0 65 4d 65 6d 6f 72 79 20 62 79 74 65 73 41 6c 6c  eMemory bytesAll
1dae0 6f 63 61 74 65 64 0d 0a 20 20 20 20 20 20 20 20  ocated..        
1daf0 7d 20 6d 65 6d 6f 72 79 5d 20 3d 3d 20 30 7d 20  } memory] == 0} 
1db00 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
1db10 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74    if {!$quiet} t
1db20 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
1db30 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
1db40 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 24 6d  l [appendArgs $m
1db50 65 6d 6f 72 79 20 22 20 62 79 74 65 73 5c 6e 22  emory " bytes\n"
1db60 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  ]..          }..
1db70 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b          } else {
1db80 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20  ..          set 
1db90 6d 65 6d 6f 72 79 20 75 6e 6b 6e 6f 77 6e 0d 0a  memory unknown..
1dba0 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b  ..          if {
1dbb0 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d  !$quiet} then {.
1dbc0 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75  .            tpu
1dbd0 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70  ts $channel [app
1dbe0 65 6e 64 41 72 67 73 20 24 6d 65 6d 6f 72 79 20  endArgs $memory 
1dbf0 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  \n]..          }
1dc00 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  ..        }.... 
1dc10 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69         if {!$qui
1dc20 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  et} then {..    
1dc30 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
1dc40 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 6d 61 78 69 6d  nnel "---- maxim
1dc50 75 6d 20 6d 65 6d 6f 72 79 20 69 6e 20 75 73 65  um memory in use
1dc60 20 62 79 20 53 51 4c 69 74 65 4d 65 6d 6f 72 79   by SQLiteMemory
1dc70 2e 2e 2e 20 22 0d 0a 20 20 20 20 20 20 20 20 7d  ... "..        }
1dc80 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b  ....        if {
1dc90 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20  [catch {..      
1dca0 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b      object invok
1dcb0 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62  e -flags +NonPub
1dcc0 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  lic \..         
1dcd0 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61       System.Data
1dce0 2e 53 51 4c 69 74 65 2e 53 51 4c 69 74 65 4d 65  .SQLite.SQLiteMe
1dcf0 6d 6f 72 79 20 6d 61 78 69 6d 75 6d 42 79 74 65  mory maximumByte
1dd00 73 41 6c 6c 6f 63 61 74 65 64 0d 0a 20 20 20 20  sAllocated..    
1dd10 20 20 20 20 7d 20 6d 65 6d 6f 72 79 5d 20 3d 3d      } memory] ==
1dd20 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
1dd30 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65        if {!$quie
1dd40 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  t} then {..     
1dd50 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
1dd60 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
1dd70 73 20 24 6d 65 6d 6f 72 79 20 22 20 62 79 74 65  s $memory " byte
1dd80 73 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20 20  s\n"]..         
1dd90 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 20 65 6c   }..        } el
1dda0 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  se {..          
1ddb0 73 65 74 20 6d 65 6d 6f 72 79 20 75 6e 6b 6e 6f  set memory unkno
1ddc0 77 6e 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  wn....          
1ddd0 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65  if {!$quiet} the
1dde0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
1ddf0 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
1de00 5b 61 70 70 65 6e 64 41 72 67 73 20 24 6d 65 6d  [appendArgs $mem
1de10 6f 72 79 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20  ory \n]..       
1de20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d     }..        }.
1de30 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
1de40 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74    if {!$quiet} t
1de50 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 74  hen {..        t
1de60 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 22 2d  puts $channel "-
1de70 2d 2d 2d 20 63 75 72 72 65 6e 74 20 6d 65 6d 6f  --- current memo
1de80 72 79 20 69 6e 20 75 73 65 20 62 79 20 53 51 4c  ry in use by SQL
1de90 69 74 65 2e 2e 2e 20 22 0d 0a 20 20 20 20 20 20  ite... "..      
1dea0 7d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b  }....      if {[
1deb0 68 61 76 65 53 51 4c 69 74 65 4f 62 6a 65 63 74  haveSQLiteObject
1dec0 43 6f 6d 6d 61 6e 64 5d 7d 20 74 68 65 6e 20 7b  Command]} then {
1ded0 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63  ..        if {[c
1dee0 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20  atch {..        
1def0 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20    object invoke 
1df00 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69  -flags +NonPubli
1df10 63 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  c \..           
1df20 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53     System.Data.S
1df30 51 4c 69 74 65 2e 55 6e 73 61 66 65 4e 61 74 69  QLite.UnsafeNati
1df40 76 65 4d 65 74 68 6f 64 73 20 73 71 6c 69 74 65  veMethods sqlite
1df50 33 5f 6d 65 6d 6f 72 79 5f 75 73 65 64 0d 0a 20  3_memory_used.. 
1df60 20 20 20 20 20 20 20 7d 20 6d 65 6d 6f 72 79 5d         } memory]
1df70 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20   == 0} then {.. 
1df80 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71           if {!$q
1df90 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  uiet} then {..  
1dfa0 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
1dfb0 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  $channel [append
1dfc0 41 72 67 73 20 24 6d 65 6d 6f 72 79 20 22 20 62  Args $memory " b
1dfd0 79 74 65 73 5c 6e 22 5d 0d 0a 20 20 20 20 20 20  ytes\n"]..      
1dfe0 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d      }..        }
1dff0 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
1e000 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
1e010 23 20 4e 4f 54 45 3a 20 4d 61 79 62 65 20 74 68  # NOTE: Maybe th
1e020 65 20 53 51 4c 69 74 65 20 63 6f 72 65 20 6c 69  e SQLite core li
1e030 62 72 61 72 79 20 69 73 20 75 6e 61 76 61 69 6c  brary is unavail
1e040 61 62 6c 65 3f 0d 0a 20 20 20 20 20 20 20 20 20  able?..         
1e050 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65   #..          se
1e060 74 20 6d 65 6d 6f 72 79 20 75 6e 6b 6e 6f 77 6e  t memory unknown
1e070 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66  ....          if
1e080 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20   {!$quiet} then 
1e090 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  {..            t
1e0a0 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61  puts $channel [a
1e0b0 70 70 65 6e 64 41 72 67 73 20 24 6d 65 6d 6f 72  ppendArgs $memor
1e0c0 79 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20  y \n]..         
1e0d0 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20   }..        }.. 
1e0e0 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
1e0f0 20 20 20 20 20 20 20 73 65 74 20 6d 65 6d 6f 72         set memor
1e100 79 20 75 6e 61 76 61 69 6c 61 62 6c 65 0d 0a 0d  y unavailable...
1e110 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71  .        if {!$q
1e120 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  uiet} then {..  
1e130 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
1e140 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
1e150 67 73 20 24 6d 65 6d 6f 72 79 20 5c 6e 5d 0d 0a  gs $memory \n]..
1e160 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
1e170 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 73 65 74 20   }....      set 
1e180 72 65 73 75 6c 74 20 24 6d 65 6d 6f 72 79 3b 20  result $memory; 
1e190 23 20 4e 4f 54 45 3a 20 52 65 74 75 72 6e 20 6d  # NOTE: Return m
1e1a0 65 6d 6f 72 79 20 69 6e 2d 75 73 65 20 74 6f 20  emory in-use to 
1e1b0 6f 75 72 20 63 61 6c 6c 65 72 2e 0d 0a 0d 0a 20  our caller..... 
1e1c0 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74       if {!$quiet
1e1d0 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
1e1e0 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
1e1f0 20 22 2d 2d 2d 2d 20 6d 61 78 69 6d 75 6d 20 6d   "---- maximum m
1e200 65 6d 6f 72 79 20 69 6e 20 75 73 65 20 62 79 20  emory in use by 
1e210 53 51 4c 69 74 65 2e 2e 2e 20 22 0d 0a 20 20 20  SQLite... "..   
1e220 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 69 66     }....      if
1e230 20 7b 5b 68 61 76 65 53 51 4c 69 74 65 4f 62 6a   {[haveSQLiteObj
1e240 65 63 74 43 6f 6d 6d 61 6e 64 5d 7d 20 74 68 65  ectCommand]} the
1e250 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20  n {..        if 
1e260 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20  {[catch {..     
1e270 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f       object invo
1e280 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75  ke -flags +NonPu
1e290 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20 20 20  blic \..        
1e2a0 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74        System.Dat
1e2b0 61 2e 53 51 4c 69 74 65 2e 55 6e 73 61 66 65 4e  a.SQLite.UnsafeN
1e2c0 61 74 69 76 65 4d 65 74 68 6f 64 73 20 5c 0d 0a  ativeMethods \..
1e2d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
1e2e0 6c 69 74 65 33 5f 6d 65 6d 6f 72 79 5f 68 69 67  lite3_memory_hig
1e2f0 68 77 61 74 65 72 20 30 0d 0a 20 20 20 20 20 20  hwater 0..      
1e300 20 20 7d 20 6d 65 6d 6f 72 79 5d 20 3d 3d 20 30    } memory] == 0
1e310 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
1e320 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d      if {!$quiet}
1e330 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
1e340 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
1e350 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
1e360 24 6d 65 6d 6f 72 79 20 22 20 62 79 74 65 73 5c  $memory " bytes\
1e370 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  n"]..          }
1e380 0d 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65  ..        } else
1e390 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d   {..          #.
1e3a0 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54  .          # NOT
1e3b0 45 3a 20 4d 61 79 62 65 20 74 68 65 20 53 51 4c  E: Maybe the SQL
1e3c0 69 74 65 20 63 6f 72 65 20 6c 69 62 72 61 72 79  ite core library
1e3d0 20 69 73 20 75 6e 61 76 61 69 6c 61 62 6c 65 3f   is unavailable?
1e3e0 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20  ..          #.. 
1e3f0 20 20 20 20 20 20 20 20 20 73 65 74 20 6d 65 6d           set mem
1e400 6f 72 79 20 75 6e 6b 6e 6f 77 6e 0d 0a 0d 0a 20  ory unknown.... 
1e410 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71           if {!$q
1e420 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  uiet} then {..  
1e430 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
1e440 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  $channel [append
1e450 41 72 67 73 20 24 6d 65 6d 6f 72 79 20 5c 6e 5d  Args $memory \n]
1e460 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20  ..          }.. 
1e470 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
1e480 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
1e490 20 20 73 65 74 20 6d 65 6d 6f 72 79 20 75 6e 61    set memory una
1e4a0 76 61 69 6c 61 62 6c 65 0d 0a 0d 0a 20 20 20 20  vailable....    
1e4b0 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d      if {!$quiet}
1e4c0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
1e4d0 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
1e4e0 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 24 6d  l [appendArgs $m
1e4f0 65 6d 6f 72 79 20 5c 6e 5d 0d 0a 20 20 20 20 20  emory \n]..     
1e500 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d     }..      }...
1e510 0a 20 20 20 20 20 20 69 66 20 7b 24 63 6f 6c 6c  .      if {$coll
1e520 65 63 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  ect} then {..   
1e530 20 20 20 20 20 63 6f 6c 6c 65 63 74 47 61 72 62       collectGarb
1e540 61 67 65 20 24 63 68 61 6e 6e 65 6c 0d 0a 20 20  age $channel..  
1e550 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 69      }....      i
1e560 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e  f {!$quiet} then
1e570 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74   {..        tput
1e580 73 20 24 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d  s $channel "----
1e590 20 63 75 72 72 65 6e 74 20 6d 65 6d 6f 72 79 20   current memory 
1e5a0 69 6e 20 75 73 65 20 62 79 20 74 68 65 20 43 4c  in use by the CL
1e5b0 52 2e 2e 2e 20 22 0d 0a 20 20 20 20 20 20 7d 0d  R... "..      }.
1e5c0 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 68 61  ...      if {[ha
1e5d0 76 65 53 51 4c 69 74 65 4f 62 6a 65 63 74 43 6f  veSQLiteObjectCo
1e5e0 6d 6d 61 6e 64 5d 7d 20 74 68 65 6e 20 7b 0d 0a  mmand]} then {..
1e5f0 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74          if {[cat
1e600 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  ch {..          
1e610 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 47 43  object invoke GC
1e620 20 47 65 74 54 6f 74 61 6c 4d 65 6d 6f 72 79 20   GetTotalMemory 
1e630 66 61 6c 73 65 0d 0a 20 20 20 20 20 20 20 20 7d  false..        }
1e640 20 6d 65 6d 6f 72 79 5d 20 3d 3d 20 30 7d 20 74   memory] == 0} t
1e650 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
1e660 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 69 73 20   if {[string is 
1e670 69 6e 74 65 67 65 72 20 2d 73 74 72 69 63 74 20  integer -strict 
1e680 24 6d 65 6d 6f 72 79 5d 7d 20 74 68 65 6e 20 7b  $memory]} then {
1e690 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ..            if
1e6a0 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20   {!$quiet} then 
1e6b0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
1e6c0 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
1e6d0 5b 61 70 70 65 6e 64 41 72 67 73 20 24 6d 65 6d  [appendArgs $mem
1e6e0 6f 72 79 20 22 20 62 79 74 65 73 5c 6e 22 5d 0d  ory " bytes\n"].
1e6f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  .            }..
1e700 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65            } else
1e710 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
1e720 73 65 74 20 6d 65 6d 6f 72 79 20 69 6e 76 61 6c  set memory inval
1e730 69 64 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  id....          
1e740 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74    if {!$quiet} t
1e750 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
1e760 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
1e770 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
1e780 24 6d 65 6d 6f 72 79 20 5c 6e 5d 0d 0a 20 20 20  $memory \n]..   
1e790 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
1e7a0 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
1e7b0 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
1e7c0 20 20 20 20 20 73 65 74 20 6d 65 6d 6f 72 79 20       set memory 
1e7d0 75 6e 6b 6e 6f 77 6e 0d 0a 0d 0a 20 20 20 20 20  unknown....     
1e7e0 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74       if {!$quiet
1e7f0 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
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 24 6d 65 6d 6f 72 79 20 5c 6e 5d 0d 0a 20 20   $memory \n]..  
1e830 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
1e840 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 20 65 6c     }..      } el
1e850 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 65  se {..        se
1e860 74 20 6d 65 6d 6f 72 79 20 75 6e 61 76 61 69 6c  t memory unavail
1e870 61 62 6c 65 0d 0a 0d 0a 20 20 20 20 20 20 20 20  able....        
1e880 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65  if {!$quiet} the
1e890 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74  n {..          t
1e8a0 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61  puts $channel [a
1e8b0 70 70 65 6e 64 41 72 67 73 20 24 6d 65 6d 6f 72  ppendArgs $memor
1e8c0 79 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 7d  y \n]..        }
1e8d0 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
1e8e0 20 20 20 72 65 74 75 72 6e 20 24 72 65 73 75 6c     return $resul
1e8f0 74 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  t..    }.....   
1e900 20 70 72 6f 63 20 63 68 65 63 6b 46 6f 72 53 51   proc checkForSQ
1e910 4c 69 74 65 44 69 72 65 63 74 6f 72 69 65 73 20  LiteDirectories 
1e920 7b 20 63 68 61 6e 6e 65 6c 20 7b 72 65 73 65 74  { channel {reset
1e930 20 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a 20 20 20   false} } {..   
1e940 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
1e950 54 45 3a 20 43 68 65 63 6b 20 69 66 20 74 68 65  TE: Check if the
1e960 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73   sqlite3_win32_s
1e970 65 74 5f 64 69 72 65 63 74 6f 72 79 20 66 75 6e  et_directory fun
1e980 63 74 69 6f 6e 20 69 73 20 61 76 61 69 6c 61 62  ction is availab
1e990 6c 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  le...      #..  
1e9a0 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
1e9b0 65 6c 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  el \..          
1e9c0 22 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e 67 20 66  "---- checking f
1e9d0 6f 72 20 66 75 6e 63 74 69 6f 6e 20 73 71 6c 69  or function sqli
1e9e0 74 65 33 5f 77 69 6e 33 32 5f 73 65 74 5f 64 69  te3_win32_set_di
1e9f0 72 65 63 74 6f 72 79 2e 2e 2e 20 22 0d 0a 0d 0a  rectory... "....
1ea00 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
1ea10 20 4e 4f 54 45 3a 20 54 68 69 73 20 63 61 6c 6c   NOTE: This call
1ea20 20 74 6f 20 74 68 65 20 73 71 6c 69 74 65 33 5f   to the sqlite3_
1ea30 77 69 6e 33 32 5f 73 65 74 5f 64 69 72 65 63 74  win32_set_direct
1ea40 6f 72 79 20 66 75 6e 63 74 69 6f 6e 20 75 73 65  ory function use
1ea50 73 20 74 68 65 0d 0a 20 20 20 20 20 20 23 20 20  s the..      #  
1ea60 20 20 20 20 20 69 6e 76 61 6c 69 64 20 76 61 6c       invalid val
1ea70 75 65 20 30 20 66 6f 72 20 74 68 65 20 66 69 72  ue 0 for the fir
1ea80 73 74 20 61 72 67 75 6d 65 6e 74 2e 20 20 54 68  st argument.  Th
1ea90 69 73 20 63 6f 64 65 20 69 73 20 64 65 73 69 67  is code is desig
1eaa0 6e 65 64 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ned..      #    
1eab0 20 20 20 74 6f 20 63 68 65 63 6b 20 69 66 20 63     to check if c
1eac0 61 6c 6c 69 6e 67 20 74 68 65 20 66 75 6e 63 74  alling the funct
1ead0 69 6f 6e 20 77 69 6c 6c 20 72 61 69 73 65 20 61  ion will raise a
1eae0 6e 20 65 78 63 65 70 74 69 6f 6e 20 28 69 2e 65  n exception (i.e
1eaf0 2e 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  ...      #      
1eb00 20 74 68 65 20 61 63 74 75 61 6c 20 72 65 73 75   the actual resu
1eb10 6c 74 20 6f 66 20 74 68 65 20 66 75 6e 63 74 69  lt of the functi
1eb20 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 74  on does not matt
1eb30 65 72 20 61 73 20 6c 6f 6e 67 20 61 73 20 6e 6f  er as long as no
1eb40 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
1eb50 64 69 72 65 63 74 6f 72 79 20 69 73 20 63 68 61  directory is cha
1eb60 6e 67 65 64 29 2e 0d 0a 20 20 20 20 20 20 23 0d  nged)...      #.
1eb70 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 73 57 69  .      if {[isWi
1eb80 6e 64 6f 77 73 5d 20 26 26 20 5b 63 61 74 63 68  ndows] && [catch
1eb90 20 7b 0d 0a 20 20 20 20 20 20 20 20 6f 62 6a 65   {..        obje
1eba0 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73  ct invoke -flags
1ebb0 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20   +NonPublic \.. 
1ebc0 20 20 20 20 20 20 20 20 20 20 20 53 79 73 74 65             Syste
1ebd0 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 55 6e  m.Data.SQLite.Un
1ebe0 73 61 66 65 4e 61 74 69 76 65 4d 65 74 68 6f 64  safeNativeMethod
1ebf0 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
1ec00 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73   sqlite3_win32_s
1ec10 65 74 5f 64 69 72 65 63 74 6f 72 79 20 30 20 6e  et_directory 0 n
1ec20 75 6c 6c 0d 0a 20 20 20 20 20 20 7d 5d 20 3d 3d  ull..      }] ==
1ec30 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
1ec40 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
1ec50 20 4e 4f 54 45 3a 20 43 61 6c 6c 69 6e 67 20 74   NOTE: Calling t
1ec60 68 65 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32  he sqlite3_win32
1ec70 5f 73 65 74 5f 64 69 72 65 63 74 6f 72 79 20 66  _set_directory f
1ec80 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74  unction does not
1ec90 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
1eca0 20 20 63 61 75 73 65 20 61 6e 20 65 78 63 65 70    cause an excep
1ecb0 74 69 6f 6e 3b 20 74 68 65 72 65 66 6f 72 65 2c  tion; therefore,
1ecc0 20 69 74 20 6d 75 73 74 20 62 65 20 61 76 61 69   it must be avai
1ecd0 6c 61 62 6c 65 20 28 69 2e 65 2e 0d 0a 20 20 20  lable (i.e...   
1ece0 20 20 20 20 20 23 20 20 20 20 20 20 20 65 76 65       #       eve
1ecf0 6e 20 74 68 6f 75 67 68 20 69 74 20 73 68 6f 75  n though it shou
1ed00 6c 64 20 72 65 74 75 72 6e 20 61 20 66 61 69 6c  ld return a fail
1ed10 75 72 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20  ure return code 
1ed20 69 6e 20 74 68 69 73 0d 0a 20 20 20 20 20 20 20  in this..       
1ed30 20 23 20 20 20 20 20 20 20 63 61 73 65 29 2e 0d   #       case)..
1ed40 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
1ed50 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e      addConstrain
1ed60 74 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f  t sqlite3_win32_
1ed70 73 65 74 5f 64 69 72 65 63 74 6f 72 79 0d 0a 0d  set_directory...
1ed80 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24  .        tputs $
1ed90 63 68 61 6e 6e 65 6c 20 79 65 73 5c 6e 0d 0a 0d  channel yes\n...
1eda0 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
1edb0 20 20 20 20 23 20 4e 4f 54 45 3a 20 44 6f 65 73      # NOTE: Does
1edc0 20 6f 75 72 20 63 61 6c 6c 65 72 20 77 61 6e 74   our caller want
1edd0 20 74 6f 20 72 65 73 65 74 20 74 68 65 20 64 69   to reset the di
1ede0 72 65 63 74 6f 72 69 65 73 3f 0d 0a 20 20 20 20  rectories?..    
1edf0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 69      #..        i
1ee00 66 20 7b 24 72 65 73 65 74 7d 20 74 68 65 6e 20  f {$reset} then 
1ee10 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a  {..          #..
1ee20 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45            # NOTE
1ee30 3a 20 4e 6f 77 20 6d 61 6b 65 20 73 75 72 65 20  : Now make sure 
1ee40 74 68 65 20 64 61 74 61 62 61 73 65 20 61 6e 64  the database and
1ee50 20 74 65 6d 70 6f 72 61 72 79 20 64 69 72 65 63   temporary direc
1ee60 74 6f 72 69 65 73 20 61 72 65 0d 0a 20 20 20 20  tories are..    
1ee70 20 20 20 20 20 20 23 20 20 20 20 20 20 20 72 65        #       re
1ee80 73 65 74 20 74 68 65 69 72 20 64 65 66 61 75 6c  set their defaul
1ee90 74 20 76 61 6c 75 65 73 2c 20 77 68 69 63 68 20  t values, which 
1eea0 73 68 6f 75 6c 64 20 62 65 20 6e 75 6c 6c 20 66  should be null f
1eeb0 6f 72 20 62 6f 74 68 2e 0d 0a 20 20 20 20 20 20  or both...      
1eec0 20 20 20 20 23 20 20 20 20 20 20 20 53 69 6e 63      #       Sinc
1eed0 65 20 74 68 65 20 73 71 6c 69 74 65 33 5f 77 69  e the sqlite3_wi
1eee0 6e 33 32 5f 73 65 74 5f 64 69 72 65 63 74 6f 72  n32_set_director
1eef0 79 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 76  y function is av
1ef00 61 69 6c 61 62 6c 65 2c 0d 0a 20 20 20 20 20 20  ailable,..      
1ef10 20 20 20 20 23 20 20 20 20 20 20 20 75 73 65 20      #       use 
1ef20 69 74 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23  it...          #
1ef30 0d 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 20  ..          for 
1ef40 7b 73 65 74 20 69 6e 64 65 78 20 31 7d 20 7b 24  {set index 1} {$
1ef50 69 6e 64 65 78 20 3c 20 33 7d 20 7b 69 6e 63 72  index < 3} {incr
1ef60 20 69 6e 64 65 78 7d 20 7b 0d 0a 20 20 20 20 20   index} {..     
1ef70 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63         if {[catc
1ef80 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  h {..           
1ef90 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65     object invoke
1efa0 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c   -flags +NonPubl
1efb0 69 63 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  ic \..          
1efc0 20 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44          System.D
1efd0 61 74 61 2e 53 51 4c 69 74 65 2e 55 6e 73 61 66  ata.SQLite.Unsaf
1efe0 65 4e 61 74 69 76 65 4d 65 74 68 6f 64 73 20 5c  eNativeMethods \
1eff0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1f000 20 20 20 20 73 71 6c 69 74 65 33 5f 77 69 6e 33      sqlite3_win3
1f010 32 5f 73 65 74 5f 64 69 72 65 63 74 6f 72 79 20  2_set_directory 
1f020 24 69 6e 64 65 78 20 6e 75 6c 6c 0d 0a 20 20 20  $index null..   
1f030 20 20 20 20 20 20 20 20 20 7d 20 72 65 73 75 6c           } resul
1f040 74 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d  t] == 0} then {.
1f050 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74  .              t
1f060 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61  puts $channel [a
1f070 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
1f080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
1f090 2d 2d 2d 2d 20 63 61 6c 6c 20 73 71 6c 69 74 65  ---- call sqlite
1f0a0 33 5f 77 69 6e 33 32 5f 73 65 74 5f 64 69 72 65  3_win32_set_dire
1f0b0 63 74 6f 72 79 28 22 20 24 69 6e 64 65 78 20 5c  ctory(" $index \
1f0c0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1f0d0 20 20 20 20 22 2c 20 6e 75 6c 6c 29 2e 2e 2e 20      ", null)... 
1f0e0 6f 6b 3a 20 22 20 24 72 65 73 75 6c 74 20 5c 6e  ok: " $result \n
1f0f0 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  ]..            }
1f100 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
1f110 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
1f120 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
1f130 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
1f140 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 61 6c         "---- cal
1f150 6c 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f  l sqlite3_win32_
1f160 73 65 74 5f 64 69 72 65 63 74 6f 72 79 28 22 20  set_directory(" 
1f170 24 69 6e 64 65 78 20 5c 0d 0a 20 20 20 20 20 20  $index \..      
1f180 20 20 20 20 20 20 20 20 20 20 20 20 22 2c 20 6e              ", n
1f190 75 6c 6c 29 2e 2e 2e 20 65 72 72 6f 72 3a 20 22  ull)... error: "
1f1a0 20 5c 6e 5c 74 20 24 72 65 73 75 6c 74 20 5c 6e   \n\t $result \n
1f1b0 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  ]..            }
1f1c0 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20  ..          }.. 
1f1d0 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
1f1e0 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
1f1f0 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
1f200 20 6e 6f 5c 6e 0d 0a 0d 0a 20 20 20 20 20 20 20   no\n....       
1f210 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
1f220 54 45 3a 20 44 6f 65 73 20 6f 75 72 20 63 61 6c  TE: Does our cal
1f230 6c 65 72 20 77 61 6e 74 20 74 6f 20 72 65 73 65  ler want to rese
1f240 74 20 74 68 65 20 64 69 72 65 63 74 6f 72 69 65  t the directorie
1f250 73 3f 20 20 54 68 69 73 20 63 61 6e 20 6f 6e 6c  s?  This can onl
1f260 79 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  y..        #    
1f270 20 20 20 62 65 20 70 65 72 66 6f 72 6d 65 64 20     be performed 
1f280 69 66 20 53 51 4c 69 74 65 20 69 73 20 6c 6f 61  if SQLite is loa
1f290 64 65 64 20 61 6e 64 20 72 65 61 64 79 20 66 6f  ded and ready fo
1f2a0 72 20 75 73 65 20 62 79 20 74 68 65 20 74 65 73  r use by the tes
1f2b0 74 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  t..        #    
1f2c0 20 20 20 73 75 69 74 65 2e 0d 0a 20 20 20 20 20     suite...     
1f2d0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 69 66     #..        if
1f2e0 20 7b 24 72 65 73 65 74 20 26 26 20 5b 69 73 53   {$reset && [isS
1f2f0 51 4c 69 74 65 52 65 61 64 79 5d 7d 20 74 68 65  QLiteReady]} the
1f300 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 23  n {..          #
1f310 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f  ..          # NO
1f320 54 45 3a 20 4e 6f 77 20 6d 61 6b 65 20 73 75 72  TE: Now make sur
1f330 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61  e the database a
1f340 6e 64 20 74 65 6d 70 6f 72 61 72 79 20 64 69 72  nd temporary dir
1f350 65 63 74 6f 72 69 65 73 20 61 72 65 0d 0a 20 20  ectories are..  
1f360 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
1f370 72 65 73 65 74 20 74 68 65 69 72 20 64 65 66 61  reset their defa
1f380 75 6c 74 20 76 61 6c 75 65 73 2c 20 77 68 69 63  ult values, whic
1f390 68 20 73 68 6f 75 6c 64 20 62 65 20 6e 75 6c 6c  h should be null
1f3a0 20 66 6f 72 20 62 6f 74 68 2e 0d 0a 20 20 20 20   for both...    
1f3b0 20 20 20 20 20 20 23 20 20 20 20 20 20 20 53 69        #       Si
1f3c0 6e 63 65 20 74 68 65 20 73 71 6c 69 74 65 33 5f  nce the sqlite3_
1f3d0 77 69 6e 33 32 5f 73 65 74 5f 64 69 72 65 63 74  win32_set_direct
1f3e0 6f 72 79 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65  ory function doe
1f3f0 73 20 6e 6f 74 0d 0a 20 20 20 20 20 20 20 20 20  s not..         
1f400 20 23 20 20 20 20 20 20 20 61 70 70 65 61 72 20   #       appear 
1f410 74 6f 20 62 65 20 61 76 61 69 6c 61 62 6c 65 2c  to be available,
1f420 20 75 73 65 20 74 68 65 20 61 73 73 6f 63 69 61   use the associa
1f430 74 65 64 20 50 52 41 47 4d 41 20 63 6f 6d 6d 61  ted PRAGMA comma
1f440 6e 64 73 0d 0a 20 20 20 20 20 20 20 20 20 20 23  nds..          #
1f450 20 20 20 20 20 20 20 69 6e 73 74 65 61 64 2e 0d         instead..
1f460 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
1f470 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20          foreach 
1f480 64 69 72 65 63 74 6f 72 79 20 5b 6c 69 73 74 20  directory [list 
1f490 64 61 74 61 5f 73 74 6f 72 65 5f 64 69 72 65 63  data_store_direc
1f4a0 74 6f 72 79 20 74 65 6d 70 5f 73 74 6f 72 65 5f  tory temp_store_
1f4b0 64 69 72 65 63 74 6f 72 79 5d 20 7b 0d 0a 20 20  directory] {..  
1f4c0 20 20 20 20 20 20 20 20 20 20 73 65 74 20 73 71            set sq
1f4d0 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 22 50  l [appendArgs "P
1f4e0 52 41 47 4d 41 20 22 20 24 64 69 72 65 63 74 6f  RAGMA " $directo
1f4f0 72 79 20 22 20 3d 20 5c 22 5c 22 3b 22 5d 0d 0a  ry " = \"\";"]..
1f500 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ..            if
1f510 20 7b 5b 63 61 74 63 68 20 7b 65 78 65 63 75 74   {[catch {execut
1f520 65 53 71 6c 20 24 73 71 6c 7d 20 72 65 73 75 6c  eSql $sql} resul
1f530 74 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d  t] == 0} then {.
1f540 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74  .              t
1f550 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61  puts $channel [a
1f560 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
1f570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
1f580 2d 2d 2d 2d 20 65 78 65 63 75 74 65 20 50 52 41  ---- execute PRA
1f590 47 4d 41 20 22 20 24 64 69 72 65 63 74 6f 72 79  GMA " $directory
1f5a0 20 22 2e 2e 2e 20 6f 6b 3a 20 5c 22 22 20 5c 0d   "... ok: \"" \.
1f5b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1f5c0 20 20 20 24 72 65 73 75 6c 74 20 5c 22 5c 6e 5d     $result \"\n]
1f5d0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 20  ..            } 
1f5e0 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
1f5f0 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
1f600 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
1f610 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
1f620 20 20 20 20 20 20 22 2d 2d 2d 2d 20 65 78 65 63        "---- exec
1f630 75 74 65 20 50 52 41 47 4d 41 20 22 20 24 64 69  ute PRAGMA " $di
1f640 72 65 63 74 6f 72 79 20 22 2e 2e 2e 20 65 72 72  rectory "... err
1f650 6f 72 3a 20 22 20 5c 0d 0a 20 20 20 20 20 20 20  or: " \..       
1f660 20 20 20 20 20 20 20 20 20 20 20 5c 6e 5c 74 20             \n\t 
1f670 24 72 65 73 75 6c 74 20 5c 6e 5d 0d 0a 20 20 20  $result \n]..   
1f680 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
1f690 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
1f6a0 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20   }..      }.... 
1f6b0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
1f6c0 4e 4f 54 45 3a 20 46 69 6e 61 6c 6c 79 2c 20 73  NOTE: Finally, s
1f6d0 68 6f 77 20 74 68 65 20 63 75 72 72 65 6e 74 20  how the current 
1f6e0 76 61 6c 75 65 20 6f 66 20 74 68 65 20 64 61 74  value of the dat
1f6f0 61 62 61 73 65 20 61 6e 64 20 74 65 6d 70 6f 72  abase and tempor
1f700 61 72 79 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ary..      #    
1f710 20 20 20 64 69 72 65 63 74 6f 72 69 65 73 2e 20     directories. 
1f720 20 54 68 69 73 20 63 61 6e 20 6f 6e 6c 79 20 62   This can only b
1f730 65 20 70 65 72 66 6f 72 6d 65 64 20 69 66 20 53  e performed if S
1f740 51 4c 69 74 65 20 69 73 20 6c 6f 61 64 65 64 0d  QLite is loaded.
1f750 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 61  .      #       a
1f760 6e 64 20 72 65 61 64 79 20 66 6f 72 20 75 73 65  nd ready for use
1f770 20 62 79 20 74 68 65 20 74 65 73 74 20 73 75 69   by the test sui
1f780 74 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  te...      #..  
1f790 20 20 20 20 69 66 20 7b 5b 69 73 53 51 4c 69 74      if {[isSQLit
1f7a0 65 52 65 61 64 79 5d 7d 20 74 68 65 6e 20 7b 0d  eReady]} then {.
1f7b0 0a 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68  .        foreach
1f7c0 20 64 69 72 65 63 74 6f 72 79 20 5b 6c 69 73 74   directory [list
1f7d0 20 64 61 74 61 5f 73 74 6f 72 65 5f 64 69 72 65   data_store_dire
1f7e0 63 74 6f 72 79 20 74 65 6d 70 5f 73 74 6f 72 65  ctory temp_store
1f7f0 5f 64 69 72 65 63 74 6f 72 79 5d 20 7b 0d 0a 20  _directory] {.. 
1f800 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
1f810 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
1f820 72 67 73 20 22 2d 2d 2d 2d 20 63 68 65 63 6b 69  rgs "---- checki
1f830 6e 67 20 22 20 24 64 69 72 65 63 74 6f 72 79 20  ng " $directory 
1f840 22 2e 2e 2e 20 22 5d 0d 0a 0d 0a 20 20 20 20 20  "... "]....     
1f850 20 20 20 20 20 73 65 74 20 73 71 6c 20 5b 61 70       set sql [ap
1f860 70 65 6e 64 41 72 67 73 20 22 50 52 41 47 4d 41  pendArgs "PRAGMA
1f870 20 22 20 24 64 69 72 65 63 74 6f 72 79 20 5c 3b   " $directory \;
1f880 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 69  ]....          i
1f890 66 20 7b 5b 63 61 74 63 68 20 7b 65 78 65 63 75  f {[catch {execu
1f8a0 74 65 53 71 6c 20 24 73 71 6c 20 73 63 61 6c 61  teSql $sql scala
1f8b0 72 7d 20 72 65 73 75 6c 74 5d 20 3d 3d 20 30 7d  r} result] == 0}
1f8c0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
1f8d0 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
1f8e0 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
1f8f0 22 6f 6b 3a 20 5c 22 22 20 24 72 65 73 75 6c 74  "ok: \"" $result
1f900 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20   \"\n]..        
1f910 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
1f920 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
1f930 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
1f940 67 73 20 22 65 72 72 6f 72 3a 20 22 20 5c 6e 5c  gs "error: " \n\
1f950 74 20 24 72 65 73 75 6c 74 20 5c 6e 5d 0d 0a 20  t $result \n].. 
1f960 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
1f970 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a      }..      }..
1f980 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
1f990 6f 63 20 6c 6f 61 64 53 51 4c 69 74 65 54 65 73  oc loadSQLiteTes
1f9a0 74 53 65 74 74 69 6e 67 73 20 7b 20 63 68 61 6e  tSettings { chan
1f9b0 6e 65 6c 20 7b 73 75 66 66 69 78 20 22 22 7d 20  nel {suffix ""} 
1f9c0 7b 71 75 69 65 74 20 66 61 6c 73 65 7d 20 7d 20  {quiet false} } 
1f9d0 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  {..      #..    
1f9e0 20 20 23 20 4e 4f 54 45 3a 20 53 6b 69 70 20 6c    # NOTE: Skip l
1f9f0 6f 61 64 69 6e 67 20 74 68 65 20 73 65 74 74 69  oading the setti
1fa00 6e 67 73 20 69 66 20 74 68 65 69 72 20 75 73 61  ngs if their usa
1fa10 67 65 20 68 61 73 20 62 65 65 6e 20 64 69 73 61  ge has been disa
1fa20 62 6c 65 64 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  bled...      #..
1fa30 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f        if {![info
1fa40 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 73 71 6c   exists ::no(sql
1fa50 69 74 65 54 65 73 74 53 65 74 74 69 6e 67 73 29  iteTestSettings)
1fa60 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
1fa70 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
1fa80 4e 4f 54 45 3a 20 4c 6f 61 64 20 63 75 73 74 6f  NOTE: Load custo
1fa90 6d 20 70 65 72 2d 75 73 65 72 20 61 6e 64 2f 6f  m per-user and/o
1faa0 72 20 70 65 72 2d 68 6f 73 74 20 74 65 73 74 20  r per-host test 
1fab0 73 65 74 74 69 6e 67 73 20 6e 6f 77 2e 0d 0a 20  settings now... 
1fac0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
1fad0 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73    if {[info exis
1fae0 74 73 20 3a 3a 74 63 6c 5f 70 6c 61 74 66 6f 72  ts ::tcl_platfor
1faf0 6d 28 75 73 65 72 29 5d 7d 20 74 68 65 6e 20 7b  m(user)]} then {
1fb00 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20  ..          set 
1fb10 75 73 65 72 53 65 74 74 69 6e 67 73 46 69 6c 65  userSettingsFile
1fb20 4e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20  Name [file join 
1fb30 5b 67 65 74 43 6f 6d 6d 6f 6e 44 69 72 65 63 74  [getCommonDirect
1fb40 6f 72 79 5d 20 5c 0d 0a 20 20 20 20 20 20 20 20  ory] \..        
1fb50 20 20 20 20 20 20 5b 61 70 70 65 6e 64 41 72 67        [appendArg
1fb60 73 20 73 65 74 74 69 6e 67 73 20 24 73 75 66 66  s settings $suff
1fb70 69 78 20 2e 20 24 3a 3a 74 63 6c 5f 70 6c 61 74  ix . $::tcl_plat
1fb80 66 6f 72 6d 28 75 73 65 72 29 20 2e 65 61 67 6c  form(user) .eagl
1fb90 65 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  e]]....         
1fba0 20 69 66 20 7b 5b 66 69 6c 65 20 65 78 69 73 74   if {[file exist
1fbb0 73 20 24 75 73 65 72 53 65 74 74 69 6e 67 73 46  s $userSettingsF
1fbc0 69 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b  ileName]} then {
1fbd0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ..            if
1fbe0 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20   {!$quiet} then 
1fbf0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
1fc00 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
1fc10 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
1fc20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fc30 20 22 2d 2d 2d 2d 20 6c 6f 61 64 69 6e 67 20 70   "---- loading p
1fc40 65 72 2d 75 73 65 72 20 74 65 73 74 20 73 65 74  er-user test set
1fc50 74 69 6e 67 73 20 66 69 6c 65 20 5c 22 22 20 5c  tings file \"" \
1fc60 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1fc70 20 20 20 20 24 75 73 65 72 53 65 74 74 69 6e 67      $userSetting
1fc80 73 46 69 6c 65 4e 61 6d 65 20 5c 22 2e 2e 2e 5c  sFileName \"...\
1fc90 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  n]..            
1fca0 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  }....           
1fcb0 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20   if {[catch {.. 
1fcc0 20 20 20 20 20 20 20 20 20 20 20 20 20 75 70 6c               upl
1fcd0 65 76 65 6c 20 31 20 5b 6c 69 73 74 20 73 6f 75  evel 1 [list sou
1fce0 72 63 65 20 24 75 73 65 72 53 65 74 74 69 6e 67  rce $userSetting
1fcf0 73 46 69 6c 65 4e 61 6d 65 5d 0d 0a 20 20 20 20  sFileName]..    
1fd00 20 20 20 20 20 20 20 20 7d 20 65 72 72 6f 72 5d          } error]
1fd10 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
1fd20 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75          if {!$qu
1fd30 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  iet} then {..   
1fd40 20 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75               tpu
1fd50 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70  ts $channel [app
1fd60 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
1fd70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
1fd80 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61  ==== WARNING: fa
1fd90 69 6c 65 64 20 74 6f 20 6c 6f 61 64 20 70 65 72  iled to load per
1fda0 2d 75 73 65 72 20 73 65 74 74 69 6e 67 73 20 66  -user settings f
1fdb0 69 6c 65 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20  ile \"" \..     
1fdc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 24                 $
1fdd0 75 73 65 72 53 65 74 74 69 6e 67 73 46 69 6c 65  userSettingsFile
1fde0 4e 61 6d 65 20 22 5c 22 2c 20 65 72 72 6f 72 3a  Name "\", error:
1fdf0 20 22 20 5c 6e 5c 74 20 24 65 72 72 6f 72 20 5c   " \n\t $error \
1fe00 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  n]..            
1fe10 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20    }..           
1fe20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 20   }..          } 
1fe30 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
1fe40 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d      if {!$quiet}
1fe50 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
1fe60 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
1fe70 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
1fe80 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
1fe90 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 73 6b 69         "---- ski
1fea0 70 70 65 64 20 6c 6f 61 64 69 6e 67 20 70 65 72  pped loading per
1feb0 2d 75 73 65 72 20 74 65 73 74 20 73 65 74 74 69  -user test setti
1fec0 6e 67 73 20 66 69 6c 65 20 5c 22 22 20 5c 0d 0a  ngs file \"" \..
1fed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fee0 20 20 24 75 73 65 72 53 65 74 74 69 6e 67 73 46    $userSettingsF
1fef0 69 6c 65 4e 61 6d 65 20 22 5c 22 2c 20 69 74 20  ileName "\", it 
1ff00 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 5c 6e  does not exist\n
1ff10 22 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  "]..            
1ff20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  }..          }..
1ff30 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
1ff40 20 20 20 20 20 23 23 23 23 23 23 23 23 23 23 23       ###########
1ff50 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1ff60 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1ff70 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1ff80 23 23 23 23 23 23 23 23 23 23 23 23 0d 0a 0d 0a  ############....
1ff90 20 20 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66          if {[inf
1ffa0 6f 20 65 78 69 73 74 73 20 3a 3a 74 63 6c 5f 70  o exists ::tcl_p
1ffb0 6c 61 74 66 6f 72 6d 28 68 6f 73 74 29 5d 7d 20  latform(host)]} 
1ffc0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
1ffd0 20 20 73 65 74 20 68 6f 73 74 53 65 74 74 69 6e    set hostSettin
1ffe0 67 73 46 69 6c 65 4e 61 6d 65 20 5b 66 69 6c 65  gsFileName [file
1fff0 20 6a 6f 69 6e 20 5b 67 65 74 43 6f 6d 6d 6f 6e   join [getCommon
20000 44 69 72 65 63 74 6f 72 79 5d 20 5c 0d 0a 20 20  Directory] \..  
20010 20 20 20 20 20 20 20 20 20 20 20 20 5b 61 70 70              [app
20020 65 6e 64 41 72 67 73 20 73 65 74 74 69 6e 67 73  endArgs settings
20030 20 24 73 75 66 66 69 78 20 2e 20 24 3a 3a 74 63   $suffix . $::tc
20040 6c 5f 70 6c 61 74 66 6f 72 6d 28 68 6f 73 74 29  l_platform(host)
20050 20 2e 65 61 67 6c 65 5d 5d 0d 0a 0d 0a 20 20 20   .eagle]]....   
20060 20 20 20 20 20 20 20 69 66 20 7b 5b 66 69 6c 65         if {[file
20070 20 65 78 69 73 74 73 20 24 68 6f 73 74 53 65 74   exists $hostSet
20080 74 69 6e 67 73 46 69 6c 65 4e 61 6d 65 5d 7d 20  tingsFileName]} 
20090 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
200a0 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d      if {!$quiet}
200b0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
200c0 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
200d0 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
200e0 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
200f0 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 6c 6f 61         "---- loa
20100 64 69 6e 67 20 70 65 72 2d 68 6f 73 74 20 74 65  ding per-host te
20110 73 74 20 73 65 74 74 69 6e 67 73 20 66 69 6c 65  st settings file
20120 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20 20 20   \"" \..        
20130 20 20 20 20 20 20 20 20 20 20 24 68 6f 73 74 53            $hostS
20140 65 74 74 69 6e 67 73 46 69 6c 65 4e 61 6d 65 20  ettingsFileName 
20150 5c 22 2e 2e 2e 5c 6e 5d 0d 0a 20 20 20 20 20 20  \"...\n]..      
20160 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
20170 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63         if {[catc
20180 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  h {..           
20190 20 20 20 75 70 6c 65 76 65 6c 20 31 20 5b 6c 69     uplevel 1 [li
201a0 73 74 20 73 6f 75 72 63 65 20 24 68 6f 73 74 53  st source $hostS
201b0 65 74 74 69 6e 67 73 46 69 6c 65 4e 61 6d 65 5d  ettingsFileName]
201c0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 20  ..            } 
201d0 65 72 72 6f 72 5d 7d 20 74 68 65 6e 20 7b 0d 0a  error]} then {..
201e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
201f0 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20   {!$quiet} then 
20200 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
20210 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
20220 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
20230 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
20240 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49       "==== WARNI
20250 4e 47 3a 20 66 61 69 6c 65 64 20 74 6f 20 6c 6f  NG: failed to lo
20260 61 64 20 70 65 72 2d 68 6f 73 74 20 73 65 74 74  ad per-host sett
20270 69 6e 67 73 20 66 69 6c 65 20 5c 22 22 20 5c 0d  ings file \"" \.
20280 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
20290 20 20 20 20 20 24 68 6f 73 74 53 65 74 74 69 6e       $hostSettin
202a0 67 73 46 69 6c 65 4e 61 6d 65 20 22 5c 22 2c 20  gsFileName "\", 
202b0 65 72 72 6f 72 3a 20 22 20 5c 6e 5c 74 20 24 65  error: " \n\t $e
202c0 72 72 6f 72 20 5c 6e 5d 0d 0a 20 20 20 20 20 20  rror \n]..      
202d0 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
202e0 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
202f0 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
20300 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 24            if {!$
20310 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20  quiet} then {.. 
20320 20 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75               tpu
20330 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70  ts $channel [app
20340 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
20350 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d               "--
20360 2d 2d 20 73 6b 69 70 70 65 64 20 6c 6f 61 64 69  -- skipped loadi
20370 6e 67 20 70 65 72 2d 68 6f 73 74 20 74 65 73 74  ng per-host test
20380 20 73 65 74 74 69 6e 67 73 20 66 69 6c 65 20 5c   settings file \
20390 22 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  "" \..          
203a0 20 20 20 20 20 20 20 20 24 68 6f 73 74 53 65 74          $hostSet
203b0 74 69 6e 67 73 46 69 6c 65 4e 61 6d 65 20 22 5c  tingsFileName "\
203c0 22 2c 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 65  ", it does not e
203d0 78 69 73 74 5c 6e 22 5d 0d 0a 20 20 20 20 20 20  xist\n"]..      
203e0 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
203f0 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d     }..        }.
20400 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d  .      }..    }.
20410 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 63 6f 70  ....    proc cop
20420 79 53 61 6d 70 6c 65 44 61 74 61 62 61 73 65 46  ySampleDatabaseF
20430 69 6c 65 73 20 7b 7d 20 7b 0d 0a 20 20 20 20 20  iles {} {..     
20440 20 75 70 6c 65 76 65 6c 20 31 20 7b 0d 0a 20 20   uplevel 1 {..  
20450 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
20460 20 23 20 4e 4f 54 45 3a 20 43 6f 70 79 20 28 6f   # NOTE: Copy (o
20470 72 20 72 65 2d 63 6f 70 79 29 20 74 68 65 20 72  r re-copy) the r
20480 65 66 65 72 65 6e 63 65 20 64 61 74 61 62 61 73  eference databas
20490 65 20 66 69 6c 65 20 75 73 65 64 20 66 6f 72 20  e file used for 
204a0 74 68 69 73 0d 0a 20 20 20 20 20 20 20 20 23 20  this..        # 
204b0 20 20 20 20 20 20 75 6e 69 74 20 74 65 73 74 20        unit test 
204c0 74 6f 20 74 68 65 20 62 75 69 6c 64 20 64 69 72  to the build dir
204d0 65 63 74 6f 72 79 20 69 6e 20 63 61 73 65 20 69  ectory in case i
204e0 74 20 68 61 73 20 62 65 65 6e 20 63 68 61 6e 67  t has been chang
204f0 65 64 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  ed..        #   
20500 20 20 20 20 62 79 20 61 20 70 72 65 76 69 6f 75      by a previou
20510 73 20 74 65 73 74 20 72 75 6e 2e 0d 0a 20 20 20  s test run...   
20520 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
20530 66 69 6c 65 20 63 6f 70 79 20 2d 66 6f 72 63 65  file copy -force
20540 20 24 6e 6f 72 74 68 77 69 6e 64 45 66 44 62 46   $northwindEfDbF
20550 69 6c 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ile \..         
20560 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5b 67 65 74   [file join [get
20570 42 75 69 6c 64 44 69 72 65 63 74 6f 72 79 20 66  BuildDirectory f
20580 61 6c 73 65 5d 20 5b 66 69 6c 65 20 74 61 69 6c  alse] [file tail
20590 20 24 6e 6f 72 74 68 77 69 6e 64 45 66 44 62 46   $northwindEfDbF
205a0 69 6c 65 5d 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a  ile]]..      }..
205b0 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
205c0 6f 63 20 72 75 6e 53 51 4c 69 74 65 54 65 73 74  oc runSQLiteTest
205d0 50 72 6f 6c 6f 67 75 65 20 7b 7d 20 7b 0d 0a 20  Prologue {} {.. 
205e0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
205f0 4e 4f 54 45 3a 20 53 6b 69 70 20 72 75 6e 6e 69  NOTE: Skip runni
20600 6e 67 20 6f 75 72 20 63 75 73 74 6f 6d 20 70 72  ng our custom pr
20610 6f 6c 6f 67 75 65 20 69 66 20 74 68 65 20 6d 61  ologue if the ma
20620 69 6e 20 6f 6e 65 20 68 61 73 20 62 65 65 6e 0d  in one has been.
20630 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 73  .      #       s
20640 6b 69 70 70 65 64 2e 0d 0a 20 20 20 20 20 20 23  kipped...      #
20650 0d 0a 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e  ..      if {![in
20660 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 70  fo exists ::no(p
20670 72 6f 6c 6f 67 75 65 2e 65 61 67 6c 65 29 5d 7d  rologue.eagle)]}
20680 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
20690 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
206a0 54 45 3a 20 4c 6f 61 64 20 74 68 65 20 22 62 65  TE: Load the "be
206b0 66 6f 72 65 2d 63 6f 6e 73 74 72 61 69 6e 74 73  fore-constraints
206c0 22 20 63 75 73 74 6f 6d 20 70 65 72 2d 75 73 65  " custom per-use
206d0 72 20 61 6e 64 2f 6f 72 20 70 65 72 2d 68 6f 73  r and/or per-hos
206e0 74 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  t..        #    
206f0 20 20 20 74 65 73 74 20 73 65 74 74 69 6e 67 73     test settings
20700 20 6e 6f 77 2e 0d 0a 20 20 20 20 20 20 20 20 23   now...        #
20710 0d 0a 20 20 20 20 20 20 20 20 75 70 6c 65 76 65  ..        upleve
20720 6c 20 31 20 5b 6c 69 73 74 20 6c 6f 61 64 53 51  l 1 [list loadSQ
20730 4c 69 74 65 54 65 73 74 53 65 74 74 69 6e 67 73  LiteTestSettings
20740 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
20750 20 2e 62 65 66 6f 72 65 5d 0d 0a 0d 0a 20 20 20   .before]....   
20760 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
20770 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 69 66  # NOTE: Check if
20780 20 74 68 65 20 5b 6f 62 6a 65 63 74 5d 20 63 6f   the [object] co
20790 6d 6d 61 6e 64 20 69 73 20 61 76 61 69 6c 61 62  mmand is availab
207a0 6c 65 3b 20 69 66 20 6e 6f 74 2c 20 61 64 64 20  le; if not, add 
207b0 73 6f 6d 65 0d 0a 20 20 20 20 20 20 20 20 23 20  some..        # 
207c0 20 20 20 20 20 20 73 68 69 6d 73 20 74 6f 20 6d        shims to m
207d0 61 6b 65 20 74 68 65 20 74 65 73 74 20 73 75 69  ake the test sui
207e0 74 65 20 72 75 6e 20 73 6d 6f 6f 74 68 65 72 2e  te run smoother.
207f0 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
20800 20 20 20 20 20 63 68 65 63 6b 46 6f 72 53 51 4c       checkForSQL
20810 69 74 65 4f 62 6a 65 63 74 43 6f 6d 6d 61 6e 64  iteObjectCommand
20820 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
20830 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  ....        #.. 
20840 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 44         # NOTE: D
20850 65 74 65 72 6d 69 6e 65 20 74 68 65 20 6e 61 6d  etermine the nam
20860 65 73 20 6f 66 20 74 68 65 20 6e 61 74 69 76 65  es of the native
20870 20 70 6c 61 74 66 6f 72 6d 20 61 6e 64 20 61 72   platform and ar
20880 63 68 69 74 65 63 74 75 72 65 2e 0d 0a 20 20 20  chitecture...   
20890 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
208a0 73 65 74 20 70 6c 61 74 66 6f 72 6d 20 5b 67 65  set platform [ge
208b0 74 42 75 69 6c 64 50 6c 61 74 66 6f 72 6d 20 74  tBuildPlatform t
208c0 72 75 65 5d 0d 0a 20 20 20 20 20 20 20 20 73 65  rue]..        se
208d0 74 20 61 72 63 68 69 74 65 63 74 75 72 65 20 5b  t architecture [
208e0 61 72 63 68 69 74 65 63 74 75 72 65 46 6f 72 50  architectureForP
208f0 6c 61 74 66 6f 72 6d 20 24 70 6c 61 74 66 6f 72  latform $platfor
20900 6d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d  m]....        #.
20910 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
20920 20 53 68 6f 77 20 74 68 65 20 70 6c 61 74 66 6f   Show the platfo
20930 72 6d 20 61 6e 64 20 61 72 63 68 69 74 65 63 74  rm and architect
20940 75 72 65 20 75 73 65 64 20 74 6f 20 68 65 6c 70  ure used to help
20950 20 6c 6f 63 61 74 65 20 74 68 65 0d 0a 20 20 20   locate the..   
20960 20 20 20 20 20 23 20 20 20 20 20 20 20 6e 61 74       #       nat
20970 69 76 65 20 62 75 69 6c 64 20 66 69 6c 65 73 2e  ive build files.
20980 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
20990 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
209a0 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
209b0 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
209c0 20 20 20 20 20 20 22 2d 2d 2d 2d 20 70 6c 61 74        "---- plat
209d0 66 6f 72 6d 20 66 6f 72 20 6c 6f 63 61 74 69 6e  form for locatin
209e0 67 20 6e 61 74 69 76 65 20 62 75 69 6c 64 20 66  g native build f
209f0 69 6c 65 73 20 69 73 20 5c 22 22 20 5c 0d 0a 20  iles is \"" \.. 
20a00 20 20 20 20 20 20 20 20 20 20 20 24 70 6c 61 74             $plat
20a10 66 6f 72 6d 20 5c 22 5c 6e 5d 0d 0a 0d 0a 20 20  form \"\n]....  
20a20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
20a30 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70  est_channel [app
20a40 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
20a50 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 61 72 63         "---- arc
20a60 68 69 74 65 63 74 75 72 65 20 66 6f 72 20 6c 6f  hitecture for lo
20a70 63 61 74 69 6e 67 20 6e 61 74 69 76 65 20 62 75  cating native bu
20a80 69 6c 64 20 66 69 6c 65 73 20 69 73 20 5c 22 22  ild files is \""
20a90 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
20aa0 24 61 72 63 68 69 74 65 63 74 75 72 65 20 5c 22  $architecture \"
20ab0 5c 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23  \n]....        #
20ac0 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
20ad0 3a 20 42 75 69 6c 64 20 61 20 6c 69 73 74 20 6f  : Build a list o
20ae0 66 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  f configuration 
20af0 66 69 6c 65 73 20 74 68 61 74 20 77 65 20 68 61  files that we ha
20b00 6e 64 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20 23  ndle...        #
20b10 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 63 6f  ..        set co
20b20 6e 66 69 67 46 69 6c 65 4e 61 6d 65 73 20 5b 6c  nfigFileNames [l
20b30 69 73 74 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ist \..         
20b40 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53     System.Data.S
20b50 51 4c 69 74 65 2e 64 6c 6c 2e 63 6f 6e 66 69 67  QLite.dll.config
20b60 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  ]....        #..
20b70 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
20b80 42 75 69 6c 64 20 61 20 6c 69 73 74 20 6f 66 20  Build a list of 
20b90 61 75 78 69 6c 69 61 72 79 20 4d 61 6e 61 67 65  auxiliary Manage
20ba0 64 20 44 65 62 75 67 67 69 6e 67 20 41 73 73 69  d Debugging Assi
20bb0 73 74 61 6e 74 73 20 28 4d 44 41 29 0d 0a 20 20  stants (MDA)..  
20bc0 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63 6f        #       co
20bd0 6e 66 69 67 75 72 61 74 69 6f 6e 20 66 69 6c 65  nfiguration file
20be0 73 20 74 68 61 74 20 77 65 20 68 61 6e 64 6c 65  s that we handle
20bf0 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
20c00 20 20 20 20 20 20 73 65 74 20 6d 64 61 43 6f 6e        set mdaCon
20c10 66 69 67 46 69 6c 65 4e 61 6d 65 73 20 5b 6c 69  figFileNames [li
20c20 73 74 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  st \..          
20c30 20 20 45 61 67 6c 65 53 68 65 6c 6c 33 32 2e 65    EagleShell32.e
20c40 78 65 2e 6d 64 61 2e 63 6f 6e 66 69 67 20 49 6e  xe.mda.config In
20c50 73 74 61 6c 6c 65 72 2e 65 78 65 2e 6d 64 61 2e  staller.exe.mda.
20c60 63 6f 6e 66 69 67 20 5c 0d 0a 20 20 20 20 20 20  config \..      
20c70 20 20 20 20 20 20 74 65 73 74 2e 65 78 65 2e 6d        test.exe.m
20c80 64 61 2e 63 6f 6e 66 69 67 20 74 65 73 74 6c 69  da.config testli
20c90 6e 71 2e 65 78 65 2e 6d 64 61 2e 63 6f 6e 66 69  nq.exe.mda.confi
20ca0 67 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  g \..           
20cb0 20 74 65 73 74 65 66 36 2e 65 78 65 2e 6d 64 61   testef6.exe.mda
20cc0 2e 63 6f 6e 66 69 67 5d 0d 0a 0d 0a 20 20 20 20  .config]....    
20cd0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
20ce0 20 4e 4f 54 45 3a 20 42 75 69 6c 64 20 74 68 65   NOTE: Build the
20cf0 20 6c 69 73 74 20 6f 66 20 65 78 74 65 72 6e 61   list of externa
20d00 6c 20 66 69 6c 65 73 20 74 68 61 74 20 77 65 20  l files that we 
20d10 68 61 6e 64 6c 65 2e 20 20 53 6f 6d 65 20 6f 66  handle.  Some of
20d20 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
20d30 20 20 74 68 65 73 65 20 66 69 6c 65 73 20 6d 61    these files ma
20d40 79 20 62 65 20 6e 61 74 69 76 65 20 61 6e 64 2f  y be native and/
20d50 6f 72 20 6d 61 6e 61 67 65 64 20 61 73 73 65 6d  or managed assem
20d60 62 6c 69 65 73 20 74 68 61 74 20 61 72 65 0d 0a  blies that are..
20d70 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
20d80 72 65 71 75 69 72 65 64 20 74 6f 20 70 65 72 66  required to perf
20d90 6f 72 6d 20 76 61 72 69 6f 75 73 20 74 65 73 74  orm various test
20da0 73 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  s...        #.. 
20db0 20 20 20 20 20 20 20 73 65 74 20 65 78 74 65 72         set exter
20dc0 6e 61 6c 46 69 6c 65 4e 61 6d 65 73 20 5b 6c 69  nalFileNames [li
20dd0 73 74 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  st \..          
20de0 20 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 45 6e 74    [file join Ent
20df0 69 74 79 46 72 61 6d 65 77 6f 72 6b 20 6c 69 62  ityFramework lib
20e00 20 5b 73 74 72 69 6e 67 20 6d 61 70 20 5b 6c 69   [string map [li
20e10 73 74 20 46 78 20 22 22 5d 20 5c 0d 0a 20 20 20  st Fx ""] \..   
20e20 20 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67           [string
20e30 20 6d 61 70 20 5b 6c 69 73 74 20 6e 65 74 46 78   map [list netFx
20e40 34 35 31 20 6e 65 74 46 78 34 35 20 6e 65 74 46  451 netFx45 netF
20e50 78 34 35 32 20 6e 65 74 46 78 34 35 20 6e 65 74  x452 netFx45 net
20e60 46 78 34 36 20 5c 0d 0a 20 20 20 20 20 20 20 20  Fx46 \..        
20e70 20 20 20 20 6e 65 74 46 78 34 35 20 6e 65 74 46      netFx45 netF
20e80 78 34 36 31 20 6e 65 74 46 78 34 35 20 6e 65 74  x461 netFx45 net
20e90 46 78 34 36 32 20 6e 65 74 46 78 34 35 5d 20 5b  Fx462 netFx45] [
20ea0 67 65 74 42 75 69 6c 64 4e 65 74 46 78 5d 5d 5d  getBuildNetFx]]]
20eb0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
20ec0 45 6e 74 69 74 79 46 72 61 6d 65 77 6f 72 6b 2e  EntityFramework.
20ed0 64 6c 6c 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  dll]]....       
20ee0 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
20ef0 54 45 3a 20 42 75 69 6c 64 20 74 68 65 20 6c 69  TE: Build the li
20f00 73 74 20 6f 66 20 6e 61 74 69 76 65 20 61 73 73  st of native ass
20f10 65 6d 62 6c 79 20 66 69 6c 65 73 20 74 68 61 74  embly files that
20f20 20 77 65 20 68 61 6e 64 6c 65 2e 0d 0a 20 20 20   we handle...   
20f30 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
20f40 73 65 74 20 6e 61 74 69 76 65 46 69 6c 65 4e 61  set nativeFileNa
20f50 6d 65 73 20 5b 6c 69 73 74 5d 0d 0a 0d 0a 20 20  mes [list]....  
20f60 20 20 20 20 20 20 65 76 61 6c 20 6c 61 70 70 65        eval lappe
20f70 6e 64 20 6e 61 74 69 76 65 46 69 6c 65 4e 61 6d  nd nativeFileNam
20f80 65 73 20 5b 67 65 74 4e 61 74 69 76 65 4c 69 62  es [getNativeLib
20f90 72 61 72 79 46 69 6c 65 4e 61 6d 65 73 4f 6e 6c  raryFileNamesOnl
20fa0 79 5d 0d 0a 20 20 20 20 20 20 20 20 65 76 61 6c  y]..        eval
20fb0 20 6c 61 70 70 65 6e 64 20 6e 61 74 69 76 65 46   lappend nativeF
20fc0 69 6c 65 4e 61 6d 65 73 20 5b 67 65 74 49 6e 74  ileNames [getInt
20fd0 65 72 6f 70 41 73 73 65 6d 62 6c 79 46 69 6c 65  eropAssemblyFile
20fe0 4e 61 6d 65 73 4f 6e 6c 79 5d 0d 0a 0d 0a 20 20  NamesOnly]....  
20ff0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
21000 20 23 20 4e 4f 54 45 3a 20 42 75 69 6c 64 20 74   # NOTE: Build t
21010 68 65 20 6c 69 73 74 20 6f 66 20 6d 69 78 65 64  he list of mixed
21020 2d 6d 6f 64 65 20 61 73 73 65 6d 62 6c 79 20 66  -mode assembly f
21030 69 6c 65 73 20 74 68 61 74 20 77 65 20 68 61 6e  iles that we han
21040 64 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  dle...        #.
21050 0a 20 20 20 20 20 20 20 20 73 65 74 20 6d 69 78  .        set mix
21060 65 64 46 69 6c 65 4e 61 6d 65 73 20 5b 6c 69 73  edFileNames [lis
21070 74 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66  t]....        if
21080 20 7b 5b 68 61 73 52 75 6e 74 69 6d 65 4f 70 74   {[hasRuntimeOpt
21090 69 6f 6e 20 6e 61 74 69 76 65 5d 7d 20 74 68 65  ion native]} the
210a0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 6c  n {..          l
210b0 61 70 70 65 6e 64 20 6d 69 78 65 64 46 69 6c 65  append mixedFile
210c0 4e 61 6d 65 73 20 53 79 73 74 65 6d 2e 44 61 74  Names System.Dat
210d0 61 2e 53 51 4c 69 74 65 2e 64 6c 6c 0d 0a 20 20  a.SQLite.dll..  
210e0 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
210f0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
21100 4e 4f 54 45 3a 20 42 75 69 6c 64 20 74 68 65 20  NOTE: Build the 
21110 6c 69 73 74 20 6f 66 20 6d 61 6e 61 67 65 64 20  list of managed 
21120 61 73 73 65 6d 62 6c 79 20 66 69 6c 65 73 20 74  assembly files t
21130 68 61 74 20 77 65 20 68 61 6e 64 6c 65 2e 0d 0a  hat we handle...
21140 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
21150 20 20 20 73 65 74 20 6d 61 6e 61 67 65 64 46 69     set managedFi
21160 6c 65 4e 61 6d 65 73 20 5b 6c 69 73 74 20 5c 0d  leNames [list \.
21170 0a 20 20 20 20 20 20 20 20 20 20 20 20 53 79 73  .            Sys
21180 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e  tem.Data.SQLite.
21190 4c 69 6e 71 2e 64 6c 6c 20 53 79 73 74 65 6d 2e  Linq.dll System.
211a0 44 61 74 61 2e 53 51 4c 69 74 65 2e 45 46 36 2e  Data.SQLite.EF6.
211b0 64 6c 6c 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  dll]....        
211c0 69 66 20 7b 21 5b 68 61 73 52 75 6e 74 69 6d 65  if {![hasRuntime
211d0 4f 70 74 69 6f 6e 20 6e 61 74 69 76 65 5d 7d 20  Option native]} 
211e0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
211f0 20 20 6c 61 70 70 65 6e 64 20 6d 61 6e 61 67 65    lappend manage
21200 64 46 69 6c 65 4e 61 6d 65 73 20 53 79 73 74 65  dFileNames Syste
21210 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 64 6c  m.Data.SQLite.dl
21220 6c 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  l..        }....
21230 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
21240 20 20 20 23 20 4e 4f 54 45 3a 20 53 68 6f 77 20     # NOTE: Show 
21250 74 68 65 20 76 61 72 69 6f 75 73 20 6c 69 73 74  the various list
21260 73 20 6f 66 20 66 69 6c 65 20 6e 61 6d 65 73 20  s of file names 
21270 74 68 61 74 20 61 72 65 20 68 61 6e 64 6c 65 64  that are handled
21280 20 62 79 20 74 68 69 73 0d 0a 20 20 20 20 20 20   by this..      
21290 20 20 23 20 20 20 20 20 20 20 70 72 6f 63 65 64    #       proced
212a0 75 72 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  ure...        #.
212b0 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24  .        tputs $
212c0 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b  ::test_channel [
212d0 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
212e0 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
212f0 6c 69 73 74 20 6f 66 20 5c 22 63 6f 6e 66 69 67  list of \"config
21300 75 72 61 74 69 6f 6e 5c 22 20 66 69 6c 65 20 6e  uration\" file n
21310 61 6d 65 73 20 69 73 3a 20 22 20 5c 0d 0a 20 20  ames is: " \..  
21320 20 20 20 20 20 20 20 20 20 20 24 63 6f 6e 66 69            $confi
21330 67 46 69 6c 65 4e 61 6d 65 73 20 5c 6e 5d 0d 0a  gFileNames \n]..
21340 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20  ..        tputs 
21350 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
21360 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
21370 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
21380 20 6c 69 73 74 20 6f 66 20 5c 22 4d 44 41 20 63   list of \"MDA c
21390 6f 6e 66 69 67 75 72 61 74 69 6f 6e 5c 22 20 66  onfiguration\" f
213a0 69 6c 65 20 6e 61 6d 65 73 20 69 73 3a 20 22 20  ile names is: " 
213b0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 24  \..            $
213c0 6d 64 61 43 6f 6e 66 69 67 46 69 6c 65 4e 61 6d  mdaConfigFileNam
213d0 65 73 20 5c 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20  es \n]....      
213e0 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
213f0 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
21400 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
21410 20 20 20 22 2d 2d 2d 2d 20 6c 69 73 74 20 6f 66     "---- list of
21420 20 5c 22 65 78 74 65 72 6e 61 6c 5c 22 20 66 69   \"external\" fi
21430 6c 65 20 6e 61 6d 65 73 20 69 73 3a 20 22 20 24  le names is: " $
21440 65 78 74 65 72 6e 61 6c 46 69 6c 65 4e 61 6d 65  externalFileName
21450 73 20 5c 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  s \n]....       
21460 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
21470 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
21480 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
21490 20 20 22 2d 2d 2d 2d 20 6c 69 73 74 20 6f 66 20    "---- list of 
214a0 5c 22 6e 61 74 69 76 65 5c 22 20 66 69 6c 65 20  \"native\" file 
214b0 6e 61 6d 65 73 20 69 73 3a 20 22 20 24 6e 61 74  names is: " $nat
214c0 69 76 65 46 69 6c 65 4e 61 6d 65 73 20 5c 6e 5d  iveFileNames \n]
214d0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74  ....        tput
214e0 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
214f0 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
21500 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d  .            "--
21510 2d 2d 20 6c 69 73 74 20 6f 66 20 5c 22 6d 69 78  -- list of \"mix
21520 65 64 5c 22 20 66 69 6c 65 20 6e 61 6d 65 73 20  ed\" file names 
21530 69 73 3a 20 22 20 24 6d 69 78 65 64 46 69 6c 65  is: " $mixedFile
21540 4e 61 6d 65 73 20 5c 6e 5d 0d 0a 0d 0a 20 20 20  Names \n]....   
21550 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
21560 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
21570 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
21580 20 20 20 20 20 20 22 2d 2d 2d 2d 20 6c 69 73 74        "---- list
21590 20 6f 66 20 5c 22 6d 61 6e 61 67 65 64 5c 22 20   of \"managed\" 
215a0 66 69 6c 65 20 6e 61 6d 65 73 20 69 73 3a 20 22  file names is: "
215b0 20 24 6d 61 6e 61 67 65 64 46 69 6c 65 4e 61 6d   $managedFileNam
215c0 65 73 20 5c 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20  es \n]....      
215d0 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
215e0 4f 54 45 3a 20 52 65 6d 6f 76 65 20 61 6e 79 20  OTE: Remove any 
215f0 74 65 73 74 20 63 6f 6e 73 74 72 61 69 6e 74 73  test constraints
21600 20 74 68 61 74 20 72 65 66 65 72 20 74 6f 20 74   that refer to t
21610 68 65 20 6e 61 74 69 76 65 20 61 6e 64 2f 6f 72  he native and/or
21620 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
21630 20 20 6d 61 6e 61 67 65 64 20 61 73 73 65 6d 62    managed assemb
21640 6c 79 20 66 69 6c 65 73 20 74 68 61 74 20 77 65  ly files that we
21650 20 68 61 6e 64 6c 65 20 75 6e 6c 65 73 73 20 66   handle unless f
21660 6f 72 62 69 64 64 65 6e 20 66 72 6f 6d 0d 0a 20  orbidden from.. 
21670 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 64         #       d
21680 6f 69 6e 67 20 73 6f 2e 0d 0a 20 20 20 20 20 20  oing so...      
21690 20 20 23 0d 0a 20 20 20 20 20 20 20 20 69 66 20    #..        if 
216a0 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a  {![info exists :
216b0 3a 6e 6f 28 73 71 6c 69 74 65 52 65 6d 6f 76 65  :no(sqliteRemove
216c0 43 6f 6e 73 74 72 61 69 6e 74 73 29 5d 7d 20 74  Constraints)]} t
216d0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
216e0 20 66 6f 72 65 61 63 68 20 66 69 6c 65 4e 61 6d   foreach fileNam
216f0 65 20 24 63 6f 6e 66 69 67 46 69 6c 65 4e 61 6d  e $configFileNam
21700 65 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  es {..          
21710 20 20 72 65 6d 6f 76 65 43 6f 6e 73 74 72 61 69    removeConstrai
21720 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20 66  nt [appendArgs f
21730 69 6c 65 5f 20 24 66 69 6c 65 4e 61 6d 65 5d 0d  ile_ $fileName].
21740 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  .          }....
21750 20 20 20 20 20 20 20 20 20 20 66 6f 72 65 61 63            foreac
21760 68 20 66 69 6c 65 4e 61 6d 65 20 24 6d 64 61 43  h fileName $mdaC
21770 6f 6e 66 69 67 46 69 6c 65 4e 61 6d 65 73 20 7b  onfigFileNames {
21780 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65  ..            re
21790 6d 6f 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b  moveConstraint [
217a0 61 70 70 65 6e 64 41 72 67 73 20 66 69 6c 65 5f  appendArgs file_
217b0 20 24 66 69 6c 65 4e 61 6d 65 5d 0d 0a 20 20 20   $fileName]..   
217c0 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
217d0 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 66 69        foreach fi
217e0 6c 65 4e 61 6d 65 20 24 65 78 74 65 72 6e 61 6c  leName $external
217f0 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20  FileNames {..   
21800 20 20 20 20 20 20 20 20 20 72 65 6d 6f 76 65 43           removeC
21810 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e  onstraint [appen
21820 64 41 72 67 73 20 66 69 6c 65 5f 20 5b 66 69 6c  dArgs file_ [fil
21830 65 20 74 61 69 6c 20 24 66 69 6c 65 4e 61 6d 65  e tail $fileName
21840 5d 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d  ]]..          }.
21850 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72  ...          for
21860 65 61 63 68 20 66 69 6c 65 4e 61 6d 65 20 24 6e  each fileName $n
21870 61 74 69 76 65 46 69 6c 65 4e 61 6d 65 73 20 7b  ativeFileNames {
21880 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65  ..            re
21890 6d 6f 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b  moveConstraint [
218a0 61 70 70 65 6e 64 41 72 67 73 20 66 69 6c 65 5f  appendArgs file_
218b0 20 24 66 69 6c 65 4e 61 6d 65 5d 0d 0a 20 20 20   $fileName]..   
218c0 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
218d0 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 66 69        foreach fi
218e0 6c 65 4e 61 6d 65 20 24 6d 69 78 65 64 46 69 6c  leName $mixedFil
218f0 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20  eNames {..      
21900 20 20 20 20 20 20 72 65 6d 6f 76 65 43 6f 6e 73        removeCons
21910 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72  traint [appendAr
21920 67 73 20 66 69 6c 65 5f 20 24 66 69 6c 65 4e 61  gs file_ $fileNa
21930 6d 65 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  me]..          }
21940 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 66 6f  ....          fo
21950 72 65 61 63 68 20 66 69 6c 65 4e 61 6d 65 20 24  reach fileName $
21960 6d 61 6e 61 67 65 64 46 69 6c 65 4e 61 6d 65 73  managedFileNames
21970 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
21980 72 65 6d 6f 76 65 43 6f 6e 73 74 72 61 69 6e 74  removeConstraint
21990 20 5b 61 70 70 65 6e 64 41 72 67 73 20 66 69 6c   [appendArgs fil
219a0 65 5f 20 24 66 69 6c 65 4e 61 6d 65 5d 0d 0a 20  e_ $fileName].. 
219b0 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
219c0 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
219d0 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
219e0 54 45 3a 20 53 6b 69 70 20 61 6c 6c 20 53 79 73  TE: Skip all Sys
219f0 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 20  tem.Data.SQLite 
21a00 72 65 6c 61 74 65 64 20 66 69 6c 65 20 68 61 6e  related file han
21a10 64 6c 69 6e 67 20 28 64 65 6c 65 74 69 6e 67 2c  dling (deleting,
21a20 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
21a30 20 20 63 6f 70 79 69 6e 67 2c 20 61 6e 64 20 6c    copying, and l
21a40 6f 61 64 69 6e 67 29 20 69 66 20 69 6e 73 74 72  oading) if instr
21a50 75 63 74 65 64 2e 0d 0a 20 20 20 20 20 20 20 20  ucted...        
21a60 23 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21  #..        if {!
21a70 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e  [info exists ::n
21a80 6f 28 73 71 6c 69 74 65 46 69 6c 65 73 29 5d 7d  o(sqliteFiles)]}
21a90 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
21aa0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
21ab0 23 20 4e 4f 54 45 3a 20 53 6b 69 70 20 74 72 79  # NOTE: Skip try
21ac0 69 6e 67 20 74 6f 20 64 65 6c 65 74 65 20 61 6e  ing to delete an
21ad0 79 20 66 69 6c 65 73 20 69 66 20 69 6e 73 74 72  y files if instr
21ae0 75 63 74 65 64 2e 0d 0a 20 20 20 20 20 20 20 20  ucted...        
21af0 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 69    #..          i
21b00 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73  f {![info exists
21b10 20 3a 3a 6e 6f 28 64 65 6c 65 74 65 53 71 6c 69   ::no(deleteSqli
21b20 74 65 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e 20  teFiles)]} then 
21b30 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  {..            i
21b40 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73  f {![info exists
21b50 20 3a 3a 6e 6f 28 64 65 6c 65 74 65 53 71 6c 69   ::no(deleteSqli
21b60 74 65 43 6f 6e 66 69 67 46 69 6c 65 73 29 5d 7d  teConfigFiles)]}
21b70 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
21b80 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 66         foreach f
21b90 69 6c 65 4e 61 6d 65 20 24 63 6f 6e 66 69 67 46  ileName $configF
21ba0 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20  ileNames {..    
21bb0 20 20 20 20 20 20 20 20 20 20 20 20 74 72 79 44              tryD
21bc0 65 6c 65 74 65 42 69 6e 61 72 79 46 69 6c 65 20  eleteBinaryFile 
21bd0 24 66 69 6c 65 4e 61 6d 65 0d 0a 20 20 20 20 20  $fileName..     
21be0 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
21bf0 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
21c00 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69           if {![i
21c10 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28  nfo exists ::no(
21c20 64 65 6c 65 74 65 53 71 6c 69 74 65 45 78 74 65  deleteSqliteExte
21c30 72 6e 61 6c 46 69 6c 65 73 29 5d 7d 20 74 68 65  rnalFiles)]} the
21c40 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
21c50 20 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65 4e     foreach fileN
21c60 61 6d 65 20 24 6d 64 61 43 6f 6e 66 69 67 46 69  ame $mdaConfigFi
21c70 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20  leNames {..     
21c80 20 20 20 20 20 20 20 20 20 20 20 74 72 79 44 65             tryDe
21c90 6c 65 74 65 42 75 69 6c 64 46 69 6c 65 20 24 66  leteBuildFile $f
21ca0 69 6c 65 4e 61 6d 65 20 66 61 6c 73 65 0d 0a 20  ileName false.. 
21cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a               }..
21cc0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
21cd0 66 6f 72 65 61 63 68 20 66 69 6c 65 4e 61 6d 65  foreach fileName
21ce0 20 24 65 78 74 65 72 6e 61 6c 46 69 6c 65 4e 61   $externalFileNa
21cf0 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  mes {..         
21d00 20 20 20 20 20 20 20 74 72 79 44 65 6c 65 74 65         tryDelete
21d10 42 69 6e 61 72 79 46 69 6c 65 20 24 66 69 6c 65  BinaryFile $file
21d20 4e 61 6d 65 0d 0a 20 20 20 20 20 20 20 20 20 20  Name..          
21d30 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
21d40 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
21d50 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65      if {![info e
21d60 78 69 73 74 73 20 3a 3a 6e 6f 28 64 65 6c 65 74  xists ::no(delet
21d70 65 53 71 6c 69 74 65 4e 61 74 69 76 65 46 69 6c  eSqliteNativeFil
21d80 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  es)]} then {..  
21d90 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b              if {
21da0 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  ![info exists ::
21db0 6e 6f 28 64 65 6c 65 74 65 53 71 6c 69 74 65 49  no(deleteSqliteI
21dc0 6d 70 6c 69 63 69 74 4e 61 74 69 76 65 46 69 6c  mplicitNativeFil
21dd0 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  es)]} then {..  
21de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f                fo
21df0 72 65 61 63 68 20 66 69 6c 65 4e 61 6d 65 20 24  reach fileName $
21e00 6e 61 74 69 76 65 46 69 6c 65 4e 61 6d 65 73 20  nativeFileNames 
21e10 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
21e20 20 20 20 20 20 74 72 79 44 65 6c 65 74 65 41 73       tryDeleteAs
21e30 73 65 6d 62 6c 79 20 24 66 69 6c 65 4e 61 6d 65  sembly $fileName
21e40 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
21e50 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20    }..           
21e60 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
21e70 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f        if {![info
21e80 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 64 65 6c   exists ::no(del
21e90 65 74 65 53 71 6c 69 74 65 4e 6f 6e 49 6d 70 6c  eteSqliteNonImpl
21ea0 69 63 69 74 46 69 6c 65 73 29 5d 7d 20 74 68 65  icitFiles)]} the
21eb0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
21ec0 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20       if {![info 
21ed0 65 78 69 73 74 73 20 3a 3a 6e 6f 28 64 65 6c 65  exists ::no(dele
21ee0 74 65 53 71 6c 69 74 65 50 6c 61 74 66 6f 72 6d  teSqlitePlatform
21ef0 46 69 6c 65 73 29 5d 20 26 26 20 5c 0d 0a 20 20  Files)] && \..  
21f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21f10 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68    [string length
21f20 20 24 70 6c 61 74 66 6f 72 6d 5d 20 3e 20 30 7d   $platform] > 0}
21f30 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
21f40 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 65 61             forea
21f50 63 68 20 66 69 6c 65 4e 61 6d 65 20 24 6e 61 74  ch fileName $nat
21f60 69 76 65 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a  iveFileNames {..
21f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21f80 20 20 20 20 74 72 79 44 65 6c 65 74 65 41 73 73      tryDeleteAss
21f90 65 6d 62 6c 79 20 24 66 69 6c 65 4e 61 6d 65 20  embly $fileName 
21fa0 24 70 6c 61 74 66 6f 72 6d 0d 0a 20 20 20 20 20  $platform..     
21fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a               }..
21fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21fd0 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  }....           
21fe0 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20       if {![info 
21ff0 65 78 69 73 74 73 20 3a 3a 6e 6f 28 64 65 6c 65  exists ::no(dele
22000 74 65 53 71 6c 69 74 65 41 72 63 68 69 74 65 63  teSqliteArchitec
22010 74 75 72 65 46 69 6c 65 73 29 5d 20 26 26 20 5c  tureFiles)] && \
22020 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
22030 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65        [string le
22040 6e 67 74 68 20 24 61 72 63 68 69 74 65 63 74 75  ngth $architectu
22050 72 65 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d  re] > 0} then {.
22060 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
22070 20 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65 4e     foreach fileN
22080 61 6d 65 20 24 6e 61 74 69 76 65 46 69 6c 65 4e  ame $nativeFileN
22090 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20 20 20  ames {..        
220a0 20 20 20 20 20 20 20 20 20 20 20 20 74 72 79 44              tryD
220b0 65 6c 65 74 65 41 73 73 65 6d 62 6c 79 20 24 66  eleteAssembly $f
220c0 69 6c 65 4e 61 6d 65 20 24 61 72 63 68 69 74 65  ileName $archite
220d0 63 74 75 72 65 0d 0a 20 20 20 20 20 20 20 20 20  cture..         
220e0 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
220f0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
22100 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a               }..
22110 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d              }...
22120 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20  .            if 
22130 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a  {![info exists :
22140 3a 6e 6f 28 64 65 6c 65 74 65 53 71 6c 69 74 65  :no(deleteSqlite
22150 4d 69 78 65 64 46 69 6c 65 73 29 5d 7d 20 74 68  MixedFiles)]} th
22160 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
22170 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
22180 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 66 20       # NOTE: If 
22190 74 68 65 20 22 6e 61 74 69 76 65 22 20 72 75 6e  the "native" run
221a0 74 69 6d 65 20 6f 70 74 69 6f 6e 20 69 73 20 73  time option is s
221b0 65 74 2c 20 64 65 6c 65 74 65 20 69 6d 70 6c 69  et, delete impli
221c0 63 69 74 0d 0a 20 20 20 20 20 20 20 20 20 20 20  cit..           
221d0 20 20 20 23 20 20 20 20 20 20 20 6d 69 78 65 64     #       mixed
221e0 2d 6d 6f 64 65 20 61 73 73 65 6d 62 6c 79 20 66  -mode assembly f
221f0 69 6c 65 73 20 61 73 20 77 65 6c 6c 2e 20 20 54  iles as well.  T
22200 68 69 73 20 72 75 6e 74 69 6d 65 20 6f 70 74 69  his runtime opti
22210 6f 6e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  on..            
22220 20 20 23 20 20 20 20 20 20 20 63 68 65 63 6b 20    #       check 
22230 69 73 20 68 61 6e 64 6c 65 64 20 77 68 65 6e 20  is handled when 
22240 62 75 69 6c 64 69 6e 67 20 74 68 65 20 6c 69 73  building the lis
22250 74 20 6f 66 20 6d 69 78 65 64 2d 6d 6f 64 65 0d  t of mixed-mode.
22260 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23  .              #
22270 20 20 20 20 20 20 20 61 73 73 65 6d 62 6c 79 20         assembly 
22280 66 69 6c 65 20 6e 61 6d 65 73 2e 0d 0a 20 20 20  file names...   
22290 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
222a0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b              if {
222b0 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  ![info exists ::
222c0 6e 6f 28 64 65 6c 65 74 65 53 71 6c 69 74 65 49  no(deleteSqliteI
222d0 6d 70 6c 69 63 69 74 4d 69 78 65 64 46 69 6c 65  mplicitMixedFile
222e0 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  s)]} then {..   
222f0 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72               for
22300 65 61 63 68 20 66 69 6c 65 4e 61 6d 65 20 24 6d  each fileName $m
22310 69 78 65 64 46 69 6c 65 4e 61 6d 65 73 20 7b 0d  ixedFileNames {.
22320 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
22330 20 20 20 74 72 79 44 65 6c 65 74 65 41 73 73 65     tryDeleteAsse
22340 6d 62 6c 79 20 24 66 69 6c 65 4e 61 6d 65 0d 0a  mbly $fileName..
22350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22360 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  }..             
22370 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   }....          
22380 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65      if {![info e
22390 78 69 73 74 73 20 3a 3a 6e 6f 28 64 65 6c 65 74  xists ::no(delet
223a0 65 53 71 6c 69 74 65 4e 6f 6e 49 6d 70 6c 69 63  eSqliteNonImplic
223b0 69 74 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e 20  itFiles)]} then 
223c0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
223d0 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78     if {![info ex
223e0 69 73 74 73 20 3a 3a 6e 6f 28 64 65 6c 65 74 65  ists ::no(delete
223f0 53 71 6c 69 74 65 50 6c 61 74 66 6f 72 6d 46 69  SqlitePlatformFi
22400 6c 65 73 29 5d 20 26 26 20 5c 0d 0a 20 20 20 20  les)] && \..    
22410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22420 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
22430 70 6c 61 74 66 6f 72 6d 5d 20 3e 20 30 7d 20 74  platform] > 0} t
22440 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
22450 20 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68           foreach
22460 20 66 69 6c 65 4e 61 6d 65 20 24 6d 69 78 65 64   fileName $mixed
22470 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20  FileNames {..   
22480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22490 20 74 72 79 44 65 6c 65 74 65 41 73 73 65 6d 62   tryDeleteAssemb
224a0 6c 79 20 24 66 69 6c 65 4e 61 6d 65 20 24 70 6c  ly $fileName $pl
224b0 61 74 66 6f 72 6d 0d 0a 20 20 20 20 20 20 20 20  atform..        
224c0 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
224d0 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a               }..
224e0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
224f0 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69    if {![info exi
22500 73 74 73 20 3a 3a 6e 6f 28 64 65 6c 65 74 65 53  sts ::no(deleteS
22510 71 6c 69 74 65 41 72 63 68 69 74 65 63 74 75 72  qliteArchitectur
22520 65 46 69 6c 65 73 29 5d 20 26 26 20 5c 0d 0a 20  eFiles)] && \.. 
22530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22540 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74     [string lengt
22550 68 20 24 61 72 63 68 69 74 65 63 74 75 72 65 5d  h $architecture]
22560 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20   > 0} then {..  
22570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22580 66 6f 72 65 61 63 68 20 66 69 6c 65 4e 61 6d 65  foreach fileName
22590 20 24 6d 69 78 65 64 46 69 6c 65 4e 61 6d 65 73   $mixedFileNames
225a0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
225b0 20 20 20 20 20 20 20 20 74 72 79 44 65 6c 65 74          tryDelet
225c0 65 41 73 73 65 6d 62 6c 79 20 24 66 69 6c 65 4e  eAssembly $fileN
225d0 61 6d 65 20 24 61 72 63 68 69 74 65 63 74 75 72  ame $architectur
225e0 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e..             
225f0 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
22600 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
22610 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
22620 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
22630 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69           if {![i
22640 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28  nfo exists ::no(
22650 64 65 6c 65 74 65 53 71 6c 69 74 65 4d 61 6e 61  deleteSqliteMana
22660 67 65 64 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e  gedFiles)]} then
22670 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
22680 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65 4e 61    foreach fileNa
22690 6d 65 20 24 6d 61 6e 61 67 65 64 46 69 6c 65 4e  me $managedFileN
226a0 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20 20 20  ames {..        
226b0 20 20 20 20 20 20 20 20 74 72 79 44 65 6c 65 74          tryDelet
226c0 65 41 73 73 65 6d 62 6c 79 20 24 66 69 6c 65 4e  eAssembly $fileN
226d0 61 6d 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ame..           
226e0 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
226f0 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d    }..          }
22700 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d  ....          #.
22710 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54  .          # NOT
22720 45 3a 20 43 68 65 63 6b 20 66 6f 72 20 74 68 65  E: Check for the
22730 20 22 61 75 74 6f 53 65 6c 65 63 74 22 20 72 75   "autoSelect" ru
22740 6e 74 69 6d 65 20 6f 70 74 69 6f 6e 2e 20 20 49  ntime option.  I
22750 66 20 70 72 65 73 65 6e 74 2c 0d 0a 20 20 20 20  f present,..    
22760 20 20 20 20 20 20 23 20 20 20 20 20 20 20 61 74        #       at
22770 74 65 6d 70 74 20 74 6f 20 61 75 74 6f 6d 61 74  tempt to automat
22780 69 63 61 6c 6c 79 20 73 65 6c 65 63 74 20 74 68  ically select th
22790 65 20 66 69 72 73 74 20 61 76 61 69 6c 61 62 6c  e first availabl
227a0 65 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 20  e..          #  
227b0 20 20 20 20 20 62 75 69 6c 64 20 28 6f 72 20 22       build (or "
227c0 72 65 6c 65 61 73 65 22 29 20 6f 66 20 53 51 4c  release") of SQL
227d0 69 74 65 20 61 6e 64 20 53 79 73 74 65 6d 2e 44  ite and System.D
227e0 61 74 61 2e 53 51 4c 69 74 65 0d 0a 20 20 20 20  ata.SQLite..    
227f0 20 20 20 20 20 20 23 20 20 20 20 20 20 20 66 6f        #       fo
22800 72 20 75 73 65 20 77 69 74 68 20 74 68 65 20 74  r use with the t
22810 65 73 74 20 73 75 69 74 65 2e 0d 0a 20 20 20 20  est suite...    
22820 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
22830 20 20 20 69 66 20 7b 5b 68 61 73 52 75 6e 74 69     if {[hasRunti
22840 6d 65 4f 70 74 69 6f 6e 20 61 75 74 6f 53 65 6c  meOption autoSel
22850 65 63 74 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ect]} then {..  
22860 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b            if {![
22870 63 68 65 63 6b 46 6f 72 53 51 4c 69 74 65 42 75  checkForSQLiteBu
22880 69 6c 64 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  ilds $::test_cha
22890 6e 6e 65 6c 20 74 72 75 65 5d 7d 20 74 68 65 6e  nnel true]} then
228a0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
228b0 20 20 63 68 65 63 6b 46 6f 72 53 51 4c 69 74 65    checkForSQLite
228c0 52 65 6c 65 61 73 65 73 20 24 3a 3a 74 65 73 74  Releases $::test
228d0 5f 63 68 61 6e 6e 65 6c 20 74 72 75 65 0d 0a 20  _channel true.. 
228e0 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
228f0 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
22900 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
22910 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 6b 69 70      # NOTE: Skip
22920 20 74 72 79 69 6e 67 20 74 6f 20 76 65 72 69 66   trying to verif
22930 79 20 74 68 65 20 62 75 69 6c 64 20 64 69 72 65  y the build dire
22940 63 74 6f 72 79 20 69 66 20 69 6e 73 74 72 75 63  ctory if instruc
22950 74 65 64 3b 0d 0a 20 20 20 20 20 20 20 20 20 20  ted;..          
22960 23 20 20 20 20 20 20 20 6f 74 68 65 72 77 69 73  #       otherwis
22970 65 2c 20 6d 61 6b 65 20 73 75 72 65 20 69 74 20  e, make sure it 
22980 61 63 74 75 61 6c 6c 79 20 65 78 69 73 74 73 20  actually exists 
22990 6f 72 20 68 61 6c 74 20 74 68 65 20 65 6e 74 69  or halt the enti
229a0 72 65 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20  re..          # 
229b0 20 20 20 20 20 20 74 65 73 74 69 6e 67 20 70 72        testing pr
229c0 6f 63 65 73 73 20 69 66 20 69 74 20 64 6f 65 73  ocess if it does
229d0 20 6e 6f 74 20 65 78 69 73 74 2e 0d 0a 20 20 20   not exist...   
229e0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
229f0 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65      if {![info e
22a00 78 69 73 74 73 20 3a 3a 6e 6f 28 76 65 72 69 66  xists ::no(verif
22a10 79 42 75 69 6c 64 44 69 72 65 63 74 6f 72 79 29  yBuildDirectory)
22a20 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
22a30 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
22a40 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 74        # NOTE: At
22a50 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65   this point, the
22a60 20 62 75 69 6c 64 20 64 69 72 65 63 74 6f 72 79   build directory
22a70 20 4d 55 53 54 20 65 78 69 73 74 20 61 73 20 61   MUST exist as a
22a80 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 20  ..            # 
22a90 20 20 20 20 20 20 76 61 6c 69 64 20 64 69 72 65        valid dire
22aa0 63 74 6f 72 79 20 66 6f 72 20 74 68 65 20 74 65  ctory for the te
22ab0 73 74 69 6e 67 20 70 72 6f 63 65 73 73 20 74 6f  sting process to
22ac0 20 63 6f 6e 74 69 6e 75 65 2e 0d 0a 20 20 20 20   continue...    
22ad0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
22ae0 20 20 20 20 20 20 20 73 65 74 20 64 69 72 65 63         set direc
22af0 74 6f 72 79 20 5b 67 65 74 42 75 69 6c 64 44 69  tory [getBuildDi
22b00 72 65 63 74 6f 72 79 20 66 61 6c 73 65 5d 0d 0a  rectory false]..
22b10 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ..            if
22b20 20 7b 21 5b 66 69 6c 65 20 65 78 69 73 74 73 20   {![file exists 
22b30 24 64 69 72 65 63 74 6f 72 79 5d 20 7c 7c 20 5c  $directory] || \
22b40 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
22b50 20 20 21 5b 66 69 6c 65 20 69 73 64 69 72 65 63    ![file isdirec
22b60 74 6f 72 79 20 24 64 69 72 65 63 74 6f 72 79 5d  tory $directory]
22b70 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
22b80 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
22b90 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a           # NOTE:
22ba0 20 4a 75 73 74 20 70 72 69 6f 72 20 74 6f 20 61   Just prior to a
22bb0 63 74 75 61 6c 6c 79 20 68 61 6c 74 69 6e 67 20  ctually halting 
22bc0 74 68 65 20 74 65 73 74 69 6e 67 20 70 72 6f 63  the testing proc
22bd0 65 73 73 2c 0d 0a 20 20 20 20 20 20 20 20 20 20  ess,..          
22be0 20 20 20 20 23 20 20 20 20 20 20 20 61 64 64 20      #       add 
22bf0 61 6e 20 65 72 72 6f 72 20 74 6f 20 74 68 65 20  an error to the 
22c00 74 65 73 74 20 6c 6f 67 20 66 69 6c 65 2e 0d 0a  test log file...
22c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 0d                #.
22c20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74  .              t
22c30 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
22c40 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
22c50 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
22c60 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 6f 75 6c        "---- coul
22c70 64 20 6e 6f 74 20 76 65 72 69 66 79 20 62 75 69  d not verify bui
22c80 6c 64 20 64 69 72 65 63 74 6f 72 79 20 5c 22 22  ld directory \""
22c90 20 24 64 69 72 65 63 74 6f 72 79 20 5c 0d 0a 20   $directory \.. 
22ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22cb0 20 22 5c 22 2c 20 61 6c 6c 20 74 65 73 74 69 6e   "\", all testin
22cc0 67 20 68 61 6c 74 65 64 5c 6e 22 5d 0d 0a 0d 0a  g halted\n"]....
22cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 0d                #.
22ce0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23  .              #
22cf0 20 4e 4f 54 45 3a 20 52 61 69 73 69 6e 67 20 61   NOTE: Raising a
22d00 20 73 63 72 69 70 74 20 65 72 72 6f 72 20 66 72   script error fr
22d10 6f 6d 20 74 68 69 73 20 70 6f 69 6e 74 20 73 68  om this point sh
22d20 6f 75 6c 64 20 68 61 6c 74 0d 0a 20 20 20 20 20  ould halt..     
22d30 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20           #      
22d40 20 74 68 65 20 74 65 73 74 69 6e 67 20 70 72 6f   the testing pro
22d50 63 65 73 73 2e 0d 0a 20 20 20 20 20 20 20 20 20  cess...         
22d60 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
22d70 20 20 20 20 20 20 65 72 72 6f 72 20 5b 61 70 70        error [app
22d80 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
22d90 20 20 20 20 20 20 20 20 20 20 20 20 20 22 63 6f               "co
22da0 75 6c 64 20 6e 6f 74 20 76 65 72 69 66 79 20 62  uld not verify b
22db0 75 69 6c 64 20 64 69 72 65 63 74 6f 72 79 20 5c  uild directory \
22dc0 22 22 20 24 64 69 72 65 63 74 6f 72 79 20 5c 0d  "" $directory \.
22dd0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
22de0 20 20 20 22 5c 22 2c 20 61 6c 6c 20 74 65 73 74     "\", all test
22df0 69 6e 67 20 68 61 6c 74 65 64 22 5d 0d 0a 20 20  ing halted"]..  
22e00 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
22e10 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
22e20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
22e30 20 20 20 23 20 4e 4f 54 45 3a 20 53 6b 69 70 20     # NOTE: Skip 
22e40 74 72 79 69 6e 67 20 74 6f 20 63 6f 70 79 20 61  trying to copy a
22e50 6e 79 20 66 69 6c 65 73 20 69 66 20 69 6e 73 74  ny files if inst
22e60 72 75 63 74 65 64 2e 0d 0a 20 20 20 20 20 20 20  ructed...       
22e70 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
22e80 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74  if {![info exist
22e90 73 20 3a 3a 6e 6f 28 63 6f 70 79 53 71 6c 69 74  s ::no(copySqlit
22ea0 65 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e 20 7b  eFiles)]} then {
22eb0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ..            if
22ec0 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20   {![info exists 
22ed0 3a 3a 6e 6f 28 63 6f 70 79 53 71 6c 69 74 65 43  ::no(copySqliteC
22ee0 6f 6e 66 69 67 46 69 6c 65 73 29 5d 7d 20 74 68  onfigFiles)]} th
22ef0 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
22f00 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
22f10 74 5f 63 68 61 6e 6e 65 6c 20 5c 0d 0a 20 20 20  t_channel \..   
22f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
22f30 2d 2d 2d 2d 20 63 6f 70 79 69 6e 67 20 5c 22 63  ---- copying \"c
22f40 6f 6e 66 69 67 75 72 61 74 69 6f 6e 5c 22 20 66  onfiguration\" f
22f50 69 6c 65 73 2e 2e 2e 5c 6e 22 0d 0a 0d 0a 20 20  iles...\n"....  
22f60 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 65              fore
22f70 61 63 68 20 66 69 6c 65 4e 61 6d 65 20 24 63 6f  ach fileName $co
22f80 6e 66 69 67 46 69 6c 65 4e 61 6d 65 73 20 7b 0d  nfigFileNames {.
22f90 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
22fa0 20 74 72 79 43 6f 70 79 42 75 69 6c 64 46 69 6c   tryCopyBuildFil
22fb0 65 20 24 66 69 6c 65 4e 61 6d 65 20 66 61 6c 73  e $fileName fals
22fc0 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e..             
22fd0 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   }..            
22fe0 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  }....           
22ff0 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73   if {![info exis
23000 74 73 20 3a 3a 6e 6f 28 63 6f 70 79 53 71 6c 69  ts ::no(copySqli
23010 74 65 45 78 74 65 72 6e 61 6c 46 69 6c 65 73 29  teExternalFiles)
23020 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
23030 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
23040 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45            # NOTE
23050 3a 20 43 6f 70 79 20 74 68 65 20 4d 61 6e 61 67  : Copy the Manag
23060 65 64 20 44 65 62 75 67 67 69 6e 67 20 41 73 73  ed Debugging Ass
23070 69 73 74 61 6e 74 73 20 28 4d 44 41 29 20 63 6f  istants (MDA) co
23080 6e 66 69 67 75 72 61 74 69 6f 6e 0d 0a 20 20 20  nfiguration..   
23090 20 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20             #    
230a0 20 20 20 66 69 6c 65 20 66 6f 72 20 74 68 65 20     file for the 
230b0 45 61 67 6c 65 20 73 68 65 6c 6c 20 74 6f 20 74  Eagle shell to t
230c0 68 65 20 62 75 69 6c 64 20 6f 75 74 70 75 74 20  he build output 
230d0 64 69 72 65 63 74 6f 72 79 2c 0d 0a 20 20 20 20  directory,..    
230e0 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20            #     
230f0 20 20 77 68 69 6c 65 20 75 73 69 6e 67 20 65 61    while using ea
23100 63 68 20 6f 66 20 74 68 65 20 6e 61 6d 65 73 20  ch of the names 
23110 6f 66 20 74 68 65 20 76 61 72 69 6f 75 73 20 6c  of the various l
23120 65 67 61 63 79 20 74 65 73 74 0d 0a 20 20 20 20  egacy test..    
23130 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20            #     
23140 20 20 65 78 65 63 75 74 61 62 6c 65 73 2e 20 20    executables.  
23150 54 68 69 73 20 77 69 6c 6c 20 68 65 6c 70 20 74  This will help t
23160 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74  o make sure that
23170 20 61 6c 6c 20 74 68 65 0d 0a 20 20 20 20 20 20   all the..      
23180 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
23190 6c 65 67 61 63 79 20 74 65 73 74 73 20 72 75 6e  legacy tests run
231a0 20 77 69 74 68 20 65 78 61 63 74 6c 79 20 74 68   with exactly th
231b0 65 20 73 61 6d 65 20 73 65 74 20 6f 66 20 4d 61  e same set of Ma
231c0 6e 61 67 65 64 0d 0a 20 20 20 20 20 20 20 20 20  naged..         
231d0 20 20 20 20 20 23 20 20 20 20 20 20 20 44 65 62       #       Deb
231e0 75 67 67 69 6e 67 20 41 73 73 69 73 74 61 6e 74  ugging Assistant
231f0 73 20 63 6f 6e 66 69 67 75 72 65 64 2e 0d 0a 20  s configured... 
23200 20 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a               #..
23210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 70                tp
23220 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  uts $::test_chan
23230 6e 65 6c 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  nel \..         
23240 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63           "---- c
23250 6f 70 79 69 6e 67 20 5c 22 4d 44 41 20 63 6f 6e  opying \"MDA con
23260 66 69 67 75 72 61 74 69 6f 6e 5c 22 20 66 69 6c  figuration\" fil
23270 65 73 2e 2e 2e 5c 6e 22 0d 0a 0d 0a 20 20 20 20  es...\n"....    
23280 20 20 20 20 20 20 20 20 20 20 66 6f 72 65 61 63            foreac
23290 68 20 66 69 6c 65 4e 61 6d 65 20 24 6d 64 61 43  h fileName $mdaC
232a0 6f 6e 66 69 67 46 69 6c 65 4e 61 6d 65 73 20 7b  onfigFileNames {
232b0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
232c0 20 20 74 72 79 43 6f 70 79 42 69 6e 61 72 79 46    tryCopyBinaryF
232d0 69 6c 65 20 45 61 67 6c 65 53 68 65 6c 6c 2e 65  ile EagleShell.e
232e0 78 65 2e 6d 64 61 2e 63 6f 6e 66 69 67 20 74 72  xe.mda.config tr
232f0 75 65 20 22 22 20 24 66 69 6c 65 4e 61 6d 65 0d  ue "" $fileName.
23300 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
23310 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
23320 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20    #..           
23330 20 20 20 23 20 4e 4f 54 45 3a 20 43 6f 70 79 20     # NOTE: Copy 
23340 74 68 65 20 65 78 74 65 72 6e 61 6c 20 62 69 6e  the external bin
23350 61 72 69 65 73 2c 20 69 66 20 61 6e 79 2c 20 74  aries, if any, t
23360 6f 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20  o the directory 
23370 74 68 61 74 0d 0a 20 20 20 20 20 20 20 20 20 20  that..          
23380 20 20 20 20 23 20 20 20 20 20 20 20 63 6f 6e 74      #       cont
23390 61 69 6e 73 20 74 68 65 20 45 61 67 6c 65 20 73  ains the Eagle s
233a0 68 65 6c 6c 2e 20 20 54 68 69 73 20 69 73 20 74  hell.  This is t
233b0 79 70 69 63 61 6c 6c 79 20 75 73 65 64 20 74 6f  ypically used to
233c0 20 6d 61 6b 65 0d 0a 20 20 20 20 20 20 20 20 20   make..         
233d0 20 20 20 20 20 23 20 20 20 20 20 20 20 73 75 72       #       sur
233e0 65 20 61 73 73 65 6d 62 6c 69 65 73 20 72 65 66  e assemblies ref
233f0 65 72 65 6e 63 65 64 20 62 79 20 74 68 65 20 6f  erenced by the o
23400 6e 65 73 20 62 65 69 6e 67 20 74 65 73 74 65 64  nes being tested
23410 20 61 72 65 0d 0a 20 20 20 20 20 20 20 20 20 20   are..          
23420 20 20 20 20 23 20 20 20 20 20 20 20 61 76 61 69      #       avai
23430 6c 61 62 6c 65 20 64 75 72 69 6e 67 20 74 68 65  lable during the
23440 20 74 65 73 74 69 6e 67 20 70 72 6f 63 65 73 73   testing process
23450 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
23460 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   #..            
23470 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
23480 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 63 6f  channel "---- co
23490 70 79 69 6e 67 20 5c 22 65 78 74 65 72 6e 61 6c  pying \"external
234a0 5c 22 20 66 69 6c 65 73 2e 2e 2e 5c 6e 22 0d 0a  \" files...\n"..
234b0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
234c0 66 6f 72 65 61 63 68 20 66 69 6c 65 4e 61 6d 65  foreach fileName
234d0 20 24 65 78 74 65 72 6e 61 6c 46 69 6c 65 4e 61   $externalFileNa
234e0 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  mes {..         
234f0 20 20 20 20 20 20 20 74 72 79 43 6f 70 79 45 78         tryCopyEx
23500 74 65 72 6e 61 6c 46 69 6c 65 20 24 66 69 6c 65  ternalFile $file
23510 4e 61 6d 65 0d 0a 20 20 20 20 20 20 20 20 20 20  Name..          
23520 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
23530 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
23540 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65      if {![info e
23550 78 69 73 74 73 20 3a 3a 6e 6f 28 63 6f 70 79 53  xists ::no(copyS
23560 71 6c 69 74 65 4e 61 74 69 76 65 46 69 6c 65 73  qliteNativeFiles
23570 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  )]} then {..    
23580 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
23590 20 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54             # NOT
235a0 45 3a 20 49 66 20 74 68 65 20 74 65 73 74 20 70  E: If the test p
235b0 6c 61 74 66 6f 72 6d 20 69 73 20 6c 69 6b 65 6c  latform is likel
235c0 79 20 74 68 65 20 64 65 66 61 75 6c 74 20 66 6f  y the default fo
235d0 72 20 74 68 69 73 0d 0a 20 20 20 20 20 20 20 20  r this..        
235e0 20 20 20 20 20 20 23 20 20 20 20 20 20 20 6d 61        #       ma
235f0 63 68 69 6e 65 2c 20 61 6c 73 6f 20 74 72 79 20  chine, also try 
23600 74 6f 20 63 6f 70 79 20 74 68 65 20 6e 61 74 69  to copy the nati
23610 76 65 20 66 69 6c 65 73 20 74 6f 20 74 68 65 0d  ve files to the.
23620 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23  .              #
23630 20 20 20 20 20 20 20 62 69 6e 61 72 79 20 6c 6f         binary lo
23640 63 61 74 69 6f 6e 2e 0d 0a 20 20 20 20 20 20 20  cation...       
23650 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
23660 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e          if {![in
23670 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 63  fo exists ::no(c
23680 6f 70 79 53 71 6c 69 74 65 49 6d 70 6c 69 63 69  opySqliteImplici
23690 74 4e 61 74 69 76 65 46 69 6c 65 73 29 5d 20 26  tNativeFiles)] &
236a0 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  & \..           
236b0 20 20 20 20 20 20 20 5b 69 73 44 65 66 61 75 6c         [isDefaul
236c0 74 42 75 69 6c 64 50 6c 61 74 66 6f 72 6d 5d 7d  tBuildPlatform]}
236d0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
236e0 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
236f0 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5c  ::test_channel \
23700 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
23710 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 6f 70 79        "---- copy
23720 69 6e 67 20 69 6d 70 6c 69 63 69 74 20 5c 22 6e  ing implicit \"n
23730 61 74 69 76 65 5c 22 20 66 69 6c 65 73 2e 2e 2e  ative\" files...
23740 5c 6e 22 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  \n"....         
23750 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 66         foreach f
23760 69 6c 65 4e 61 6d 65 20 24 6e 61 74 69 76 65 46  ileName $nativeF
23770 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20  ileNames {..    
23780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 72                tr
23790 79 43 6f 70 79 41 73 73 65 6d 62 6c 79 20 24 66  yCopyAssembly $f
237a0 69 6c 65 4e 61 6d 65 20 66 61 6c 73 65 0d 0a 20  ileName false.. 
237b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
237c0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
237d0 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  }....           
237e0 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78     if {![info ex
237f0 69 73 74 73 20 3a 3a 6e 6f 28 63 6f 70 79 53 71  ists ::no(copySq
23800 6c 69 74 65 4e 6f 6e 49 6d 70 6c 69 63 69 74 46  liteNonImplicitF
23810 69 6c 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a  iles)]} then {..
23820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23830 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74  if {![info exist
23840 73 20 3a 3a 6e 6f 28 63 6f 70 79 53 71 6c 69 74  s ::no(copySqlit
23850 65 50 6c 61 74 66 6f 72 6d 46 69 6c 65 73 29 5d  ePlatformFiles)]
23860 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20   && \..         
23870 20 20 20 20 20 20 20 20 20 20 20 5b 73 74 72 69             [stri
23880 6e 67 20 6c 65 6e 67 74 68 20 24 70 6c 61 74 66  ng length $platf
23890 6f 72 6d 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b  orm] > 0} then {
238a0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
238b0 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
238c0 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e  t_channel [appen
238d0 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
238e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
238f0 2d 2d 2d 2d 20 63 6f 70 79 69 6e 67 20 5c 22 6e  ---- copying \"n
23900 61 74 69 76 65 5c 22 20 66 69 6c 65 73 20 66 6f  ative\" files fo
23910 72 20 70 6c 61 74 66 6f 72 6d 20 5c 22 22 20 5c  r platform \"" \
23920 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
23930 20 20 20 20 20 20 20 20 24 70 6c 61 74 66 6f 72          $platfor
23940 6d 20 5c 22 2e 2e 2e 5c 6e 5d 0d 0a 0d 0a 20 20  m \"...\n]....  
23950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23960 66 6f 72 65 61 63 68 20 66 69 6c 65 4e 61 6d 65  foreach fileName
23970 20 24 6e 61 74 69 76 65 46 69 6c 65 4e 61 6d 65   $nativeFileName
23980 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s {..           
23990 20 20 20 20 20 20 20 20 20 74 72 79 43 6f 70 79           tryCopy
239a0 41 73 73 65 6d 62 6c 79 20 24 66 69 6c 65 4e 61  Assembly $fileNa
239b0 6d 65 20 66 61 6c 73 65 20 24 70 6c 61 74 66 6f  me false $platfo
239c0 72 6d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  rm..            
239d0 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
239e0 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20           }....  
239f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
23a00 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20   {![info exists 
23a10 3a 3a 6e 6f 28 63 6f 70 79 53 71 6c 69 74 65 41  ::no(copySqliteA
23a20 72 63 68 69 74 65 63 74 75 72 65 46 69 6c 65 73  rchitectureFiles
23a30 29 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20  )] && \..       
23a40 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 73 74               [st
23a50 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 61 72 63  ring length $arc
23a60 68 69 74 65 63 74 75 72 65 5d 20 3e 20 30 7d 20  hitecture] > 0} 
23a70 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
23a80 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
23a90 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
23aa0 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
23ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23ac0 20 20 20 20 20 22 2d 2d 2d 2d 20 63 6f 70 79 69       "---- copyi
23ad0 6e 67 20 5c 22 6e 61 74 69 76 65 5c 22 20 66 69  ng \"native\" fi
23ae0 6c 65 73 20 66 6f 72 20 61 72 63 68 69 74 65 63  les for architec
23af0 74 75 72 65 20 5c 22 22 20 5c 0d 0a 20 20 20 20  ture \"" \..    
23b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23b10 20 20 24 61 72 63 68 69 74 65 63 74 75 72 65 20    $architecture 
23b20 5c 22 2e 2e 2e 5c 6e 5d 0d 0a 0d 0a 20 20 20 20  \"...\n]....    
23b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f                fo
23b40 72 65 61 63 68 20 66 69 6c 65 4e 61 6d 65 20 24  reach fileName $
23b50 6e 61 74 69 76 65 46 69 6c 65 4e 61 6d 65 73 20  nativeFileNames 
23b60 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
23b70 20 20 20 20 20 20 20 74 72 79 43 6f 70 79 41 73         tryCopyAs
23b80 73 65 6d 62 6c 79 20 24 66 69 6c 65 4e 61 6d 65  sembly $fileName
23b90 20 66 61 6c 73 65 20 24 61 72 63 68 69 74 65 63   false $architec
23ba0 74 75 72 65 0d 0a 20 20 20 20 20 20 20 20 20 20  ture..          
23bb0 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
23bc0 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
23bd0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
23be0 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a             }....
23bf0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b              if {
23c00 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  ![info exists ::
23c10 6e 6f 28 63 6f 70 79 53 71 6c 69 74 65 4d 69 78  no(copySqliteMix
23c20 65 64 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e 20  edFiles)]} then 
23c30 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
23c40 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   #..            
23c50 20 20 23 20 4e 4f 54 45 3a 20 49 66 20 74 68 65    # NOTE: If the
23c60 20 22 6e 61 74 69 76 65 22 20 72 75 6e 74 69 6d   "native" runtim
23c70 65 20 6f 70 74 69 6f 6e 20 69 73 20 73 65 74 2c  e option is set,
23c80 20 63 6f 70 79 20 69 6d 70 6c 69 63 69 74 0d 0a   copy implicit..
23c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20                # 
23ca0 20 20 20 20 20 20 6d 69 78 65 64 2d 6d 6f 64 65        mixed-mode
23cb0 20 61 73 73 65 6d 62 6c 79 20 66 69 6c 65 73 20   assembly files 
23cc0 61 73 20 77 65 6c 6c 2e 20 20 54 68 65 20 72 75  as well.  The ru
23cd0 6e 74 69 6d 65 20 6f 70 74 69 6f 6e 0d 0a 20 20  ntime option..  
23ce0 20 20 20 20 20 20 20 20 20 20 20 20 23 20 20 20              #   
23cf0 20 20 20 20 63 68 65 63 6b 20 69 73 20 68 61 6e      check is han
23d00 64 6c 65 64 20 77 68 65 6e 20 62 75 69 6c 64 69  dled when buildi
23d10 6e 67 20 74 68 65 20 6c 69 73 74 20 6f 66 20 6d  ng the list of m
23d20 69 78 65 64 2d 6d 6f 64 65 0d 0a 20 20 20 20 20  ixed-mode..     
23d30 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20           #      
23d40 20 61 73 73 65 6d 62 6c 79 20 66 69 6c 65 20 6e   assembly file n
23d50 61 6d 65 73 2e 0d 0a 20 20 20 20 20 20 20 20 20  ames...         
23d60 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
23d70 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f        if {![info
23d80 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 63 6f 70   exists ::no(cop
23d90 79 53 71 6c 69 74 65 49 6d 70 6c 69 63 69 74 4d  ySqliteImplicitM
23da0 69 78 65 64 46 69 6c 65 73 29 5d 7d 20 74 68 65  ixedFiles)]} the
23db0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
23dc0 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
23dd0 73 74 5f 63 68 61 6e 6e 65 6c 20 5c 0d 0a 20 20  st_channel \..  
23de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23df0 20 20 22 2d 2d 2d 2d 20 63 6f 70 79 69 6e 67 20    "---- copying 
23e00 69 6d 70 6c 69 63 69 74 20 5c 22 6d 69 78 65 64  implicit \"mixed
23e10 5c 22 20 66 69 6c 65 73 2e 2e 2e 5c 6e 22 0d 0a  \" files...\n"..
23e20 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
23e30 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65 4e 61    foreach fileNa
23e40 6d 65 20 24 6d 69 78 65 64 46 69 6c 65 4e 61 6d  me $mixedFileNam
23e50 65 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  es {..          
23e60 20 20 20 20 20 20 20 20 74 72 79 43 6f 70 79 41          tryCopyA
23e70 73 73 65 6d 62 6c 79 20 24 66 69 6c 65 4e 61 6d  ssembly $fileNam
23e80 65 20 66 61 6c 73 65 0d 0a 20 20 20 20 20 20 20  e false..       
23e90 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
23ea0 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20            }.... 
23eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20               if 
23ec0 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a  {![info exists :
23ed0 3a 6e 6f 28 63 6f 70 79 53 71 6c 69 74 65 4e 6f  :no(copySqliteNo
23ee0 6e 49 6d 70 6c 69 63 69 74 46 69 6c 65 73 29 5d  nImplicitFiles)]
23ef0 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
23f00 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b            if {![
23f10 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f  info exists ::no
23f20 28 63 6f 70 79 53 71 6c 69 74 65 50 6c 61 74 66  (copySqlitePlatf
23f30 6f 72 6d 46 69 6c 65 73 29 5d 20 26 26 20 5c 0d  ormFiles)] && \.
23f40 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
23f50 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e       [string len
23f60 67 74 68 20 24 70 6c 61 74 66 6f 72 6d 5d 20 3e  gth $platform] >
23f70 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
23f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 70                tp
23f90 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  uts $::test_chan
23fa0 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
23fb0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
23fc0 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63           "---- c
23fd0 6f 70 79 69 6e 67 20 5c 22 6d 69 78 65 64 5c 22  opying \"mixed\"
23fe0 20 66 69 6c 65 73 20 66 6f 72 20 70 6c 61 74 66   files for platf
23ff0 6f 72 6d 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20  orm \"" \..     
24000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24010 20 24 70 6c 61 74 66 6f 72 6d 20 5c 22 2e 2e 2e   $platform \"...
24020 5c 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  \n]....         
24030 20 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68           foreach
24040 20 66 69 6c 65 4e 61 6d 65 20 24 6d 69 78 65 64   fileName $mixed
24050 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20  FileNames {..   
24060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24070 20 74 72 79 43 6f 70 79 41 73 73 65 6d 62 6c 79   tryCopyAssembly
24080 20 24 66 69 6c 65 4e 61 6d 65 20 66 61 6c 73 65   $fileName false
24090 20 24 70 6c 61 74 66 6f 72 6d 0d 0a 20 20 20 20   $platform..    
240a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d                }.
240b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
240c0 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   }....          
240d0 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f        if {![info
240e0 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 63 6f 70   exists ::no(cop
240f0 79 53 71 6c 69 74 65 41 72 63 68 69 74 65 63 74  ySqliteArchitect
24100 75 72 65 46 69 6c 65 73 29 5d 20 26 26 20 5c 0d  ureFiles)] && \.
24110 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
24120 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e       [string len
24130 67 74 68 20 24 61 72 63 68 69 74 65 63 74 75 72  gth $architectur
24140 65 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  e] > 0} then {..
24150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24160 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
24170 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
24180 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
24190 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d               "--
241a0 2d 2d 20 63 6f 70 79 69 6e 67 20 5c 22 6d 69 78  -- copying \"mix
241b0 65 64 5c 22 20 66 69 6c 65 73 20 66 6f 72 20 61  ed\" files for a
241c0 72 63 68 69 74 65 63 74 75 72 65 20 5c 22 22 20  rchitecture \"" 
241d0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
241e0 20 20 20 20 20 20 20 20 20 24 61 72 63 68 69 74           $archit
241f0 65 63 74 75 72 65 20 5c 22 2e 2e 2e 5c 6e 5d 0d  ecture \"...\n].
24200 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
24210 20 20 20 20 20 66 6f 72 65 61 63 68 20 66 69 6c       foreach fil
24220 65 4e 61 6d 65 20 24 6d 69 78 65 64 46 69 6c 65  eName $mixedFile
24230 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20 20  Names {..       
24240 20 20 20 20 20 20 20 20 20 20 20 20 20 74 72 79               try
24250 43 6f 70 79 41 73 73 65 6d 62 6c 79 20 24 66 69  CopyAssembly $fi
24260 6c 65 4e 61 6d 65 20 66 61 6c 73 65 20 24 61 72  leName false $ar
24270 63 68 69 74 65 63 74 75 72 65 0d 0a 20 20 20 20  chitecture..    
24280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d                }.
24290 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
242a0 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   }..            
242b0 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20    }..           
242c0 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   }....          
242d0 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69    if {![info exi
242e0 73 74 73 20 3a 3a 6e 6f 28 63 6f 70 79 53 71 6c  sts ::no(copySql
242f0 69 74 65 4d 61 6e 61 67 65 64 46 69 6c 65 73 29  iteManagedFiles)
24300 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
24310 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
24320 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 22  ::test_channel "
24330 2d 2d 2d 2d 20 63 6f 70 79 69 6e 67 20 5c 22 6d  ---- copying \"m
24340 61 6e 61 67 65 64 5c 22 20 66 69 6c 65 73 2e 2e  anaged\" files..
24350 2e 5c 6e 22 0d 0a 0d 0a 20 20 20 20 20 20 20 20  .\n"....        
24360 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 66 69        foreach fi
24370 6c 65 4e 61 6d 65 20 24 6d 61 6e 61 67 65 64 46  leName $managedF
24380 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20  ileNames {..    
24390 20 20 20 20 20 20 20 20 20 20 20 20 74 72 79 43              tryC
243a0 6f 70 79 41 73 73 65 6d 62 6c 79 20 24 66 69 6c  opyAssembly $fil
243b0 65 4e 61 6d 65 20 74 72 75 65 0d 0a 20 20 20 20  eName true..    
243c0 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
243d0 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
243e0 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
243f0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
24400 20 20 23 20 4e 4f 54 45 3a 20 53 6b 69 70 20 74    # NOTE: Skip t
24410 72 79 69 6e 67 20 74 6f 20 6c 6f 61 64 20 61 6e  rying to load an
24420 79 20 66 69 6c 65 73 20 69 66 20 69 6e 73 74 72  y files if instr
24430 75 63 74 65 64 2e 0d 0a 20 20 20 20 20 20 20 20  ucted...        
24440 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 69    #..          i
24450 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73  f {![info exists
24460 20 3a 3a 6e 6f 28 6c 6f 61 64 53 71 6c 69 74 65   ::no(loadSqlite
24470 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d  Files)]} then {.
24480 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20  .            if 
24490 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a  {![info exists :
244a0 3a 6e 6f 28 6c 6f 61 64 53 71 6c 69 74 65 49 6d  :no(loadSqliteIm
244b0 70 6c 69 63 69 74 46 69 6c 65 73 29 5d 7d 20 74  plicitFiles)]} t
244c0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
244d0 20 20 20 20 20 74 72 79 4c 6f 61 64 41 73 73 65       tryLoadAsse
244e0 6d 62 6c 79 20 53 79 73 74 65 6d 2e 44 61 74 61  mbly System.Data
244f0 2e 53 51 4c 69 74 65 2e 64 6c 6c 0d 0a 20 20 20  .SQLite.dll..   
24500 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20           }....  
24510 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b            if {![
24520 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f  info exists ::no
24530 28 6c 6f 61 64 53 71 6c 69 74 65 4c 69 6e 71 46  (loadSqliteLinqF
24540 69 6c 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a  iles)]} then {..
24550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 72                tr
24560 79 4c 6f 61 64 41 73 73 65 6d 62 6c 79 20 53 79  yLoadAssembly Sy
24570 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
24580 2e 4c 69 6e 71 2e 64 6c 6c 0d 0a 20 20 20 20 20  .Linq.dll..     
24590 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
245a0 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e          if {![in
245b0 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 6c  fo exists ::no(l
245c0 6f 61 64 53 71 6c 69 74 65 45 66 36 46 69 6c 65  oadSqliteEf6File
245d0 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  s)]} then {..   
245e0 20 20 20 20 20 20 20 20 20 20 20 74 72 79 4c 6f             tryLo
245f0 61 64 41 73 73 65 6d 62 6c 79 20 53 79 73 74 65  adAssembly Syste
24600 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 45 46  m.Data.SQLite.EF
24610 36 2e 64 6c 6c 0d 0a 20 20 20 20 20 20 20 20 20  6.dll..         
24620 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
24630 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65      if {![info e
24640 78 69 73 74 73 20 3a 3a 6e 6f 28 6c 6f 61 64 53  xists ::no(loadS
24650 71 6c 69 74 65 4e 6f 6e 49 6d 70 6c 69 63 69 74  qliteNonImplicit
24660 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d  Files)]} then {.
24670 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
24680 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73  f {![info exists
24690 20 3a 3a 6e 6f 28 6c 6f 61 64 53 71 6c 69 74 65   ::no(loadSqlite
246a0 50 6c 61 74 66 6f 72 6d 46 69 6c 65 73 29 5d 20  PlatformFiles)] 
246b0 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  && \..          
246c0 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20          [string 
246d0 6c 65 6e 67 74 68 20 24 70 6c 61 74 66 6f 72 6d  length $platform
246e0 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20  ] > 0} then {.. 
246f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
24700 72 79 4c 6f 61 64 41 73 73 65 6d 62 6c 79 20 53  ryLoadAssembly S
24710 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
24720 65 2e 64 6c 6c 20 24 70 6c 61 74 66 6f 72 6d 0d  e.dll $platform.
24730 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
24740 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
24750 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69    if {![info exi
24760 73 74 73 20 3a 3a 6e 6f 28 6c 6f 61 64 53 71 6c  sts ::no(loadSql
24770 69 74 65 41 72 63 68 69 74 65 63 74 75 72 65 46  iteArchitectureF
24780 69 6c 65 73 29 5d 20 26 26 20 5c 0d 0a 20 20 20  iles)] && \..   
24790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b                 [
247a0 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 61  string length $a
247b0 72 63 68 69 74 65 63 74 75 72 65 5d 20 3e 20 30  rchitecture] > 0
247c0 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
247d0 20 20 20 20 20 20 20 20 20 20 74 72 79 4c 6f 61            tryLoa
247e0 64 41 73 73 65 6d 62 6c 79 20 53 79 73 74 65 6d  dAssembly System
247f0 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 64 6c 6c  .Data.SQLite.dll
24800 20 24 61 72 63 68 69 74 65 63 74 75 72 65 0d 0a   $architecture..
24810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d                }.
24820 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  .            }..
24830 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
24840 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
24850 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65 4e 61    foreach fileNa
24860 6d 65 4f 6e 6c 79 20 24 6e 61 74 69 76 65 46 69  meOnly $nativeFi
24870 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20  leNames {..     
24880 20 20 20 20 20 63 61 74 63 68 20 7b 0d 0a 20 20       catch {..  
24890 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
248a0 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
248b0 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
248c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
248d0 2d 2d 2d 2d 20 66 69 6c 65 20 76 65 72 73 69 6f  ---- file versio
248e0 6e 20 6f 66 20 5c 22 22 20 24 66 69 6c 65 4e 61  n of \"" $fileNa
248f0 6d 65 4f 6e 6c 79 20 22 5c 22 2e 2e 2e 20 5c 22  meOnly "\"... \"
24900 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  " \..           
24910 20 20 20 20 20 5b 66 69 6c 65 20 76 65 72 73 69       [file versi
24920 6f 6e 20 5b 67 65 74 42 69 6e 61 72 79 46 69 6c  on [getBinaryFil
24930 65 4e 61 6d 65 20 24 66 69 6c 65 4e 61 6d 65 4f  eName $fileNameO
24940 6e 6c 79 5d 5d 20 5c 22 5c 6e 5d 0d 0a 20 20 20  nly]] \"\n]..   
24950 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
24960 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 66    }....        f
24970 6f 72 65 61 63 68 20 66 69 6c 65 4e 61 6d 65 4f  oreach fileNameO
24980 6e 6c 79 20 24 6d 69 78 65 64 46 69 6c 65 4e 61  nly $mixedFileNa
24990 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  mes {..         
249a0 20 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20   catch {..      
249b0 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
249c0 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70  est_channel [app
249d0 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
249e0 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
249f0 20 66 69 6c 65 20 76 65 72 73 69 6f 6e 20 6f 66   file version of
24a00 20 5c 22 22 20 24 66 69 6c 65 4e 61 6d 65 4f 6e   \"" $fileNameOn
24a10 6c 79 20 22 5c 22 2e 2e 2e 20 5c 22 22 20 5c 0d  ly "\"... \"" \.
24a20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
24a30 20 5b 66 69 6c 65 20 76 65 72 73 69 6f 6e 20 5b   [file version [
24a40 67 65 74 42 69 6e 61 72 79 46 69 6c 65 4e 61 6d  getBinaryFileNam
24a50 65 20 24 66 69 6c 65 4e 61 6d 65 4f 6e 6c 79 5d  e $fileNameOnly]
24a60 5d 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20 20  ] \"\n]..       
24a70 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d     }..        }.
24a80 0a 0d 0a 20 20 20 20 20 20 20 20 66 6f 72 65 61  ...        forea
24a90 63 68 20 66 69 6c 65 4e 61 6d 65 4f 6e 6c 79 20  ch fileNameOnly 
24aa0 24 6d 61 6e 61 67 65 64 46 69 6c 65 4e 61 6d 65  $managedFileName
24ab0 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 63  s {..          c
24ac0 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20  atch {..        
24ad0 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
24ae0 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e  t_channel [appen
24af0 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
24b00 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 66           "---- f
24b10 69 6c 65 20 76 65 72 73 69 6f 6e 20 6f 66 20 5c  ile version of \
24b20 22 22 20 24 66 69 6c 65 4e 61 6d 65 4f 6e 6c 79  "" $fileNameOnly
24b30 20 22 5c 22 2e 2e 2e 20 5c 22 22 20 5c 0d 0a 20   "\"... \"" \.. 
24b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b                 [
24b50 66 69 6c 65 20 76 65 72 73 69 6f 6e 20 5b 67 65  file version [ge
24b60 74 42 69 6e 61 72 79 46 69 6c 65 4e 61 6d 65 20  tBinaryFileName 
24b70 24 66 69 6c 65 4e 61 6d 65 4f 6e 6c 79 5d 5d 20  $fileNameOnly]] 
24b80 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20  \"\n]..         
24b90 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d   }..        }...
24ba0 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73 74  .        if {[st
24bb0 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 70 6c 61  ring length $pla
24bc0 74 66 6f 72 6d 5d 20 3e 20 30 7d 20 74 68 65 6e  tform] > 0} then
24bd0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 66 6f   {..          fo
24be0 72 65 61 63 68 20 66 69 6c 65 4e 61 6d 65 4f 6e  reach fileNameOn
24bf0 6c 79 20 24 6e 61 74 69 76 65 46 69 6c 65 4e 61  ly $nativeFileNa
24c00 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  mes {..         
24c10 20 20 20 63 61 74 63 68 20 7b 0d 0a 20 20 20 20     catch {..    
24c20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
24c30 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
24c40 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
24c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24c60 20 22 2d 2d 2d 2d 20 66 69 6c 65 20 76 65 72 73   "---- file vers
24c70 69 6f 6e 20 6f 66 20 5c 22 22 20 24 70 6c 61 74  ion of \"" $plat
24c80 66 6f 72 6d 20 5c 0d 0a 20 20 20 20 20 20 20 20  form \..        
24c90 20 20 20 20 20 20 20 20 20 20 2f 20 24 66 69 6c            / $fil
24ca0 65 4e 61 6d 65 4f 6e 6c 79 20 22 5c 22 2e 2e 2e  eNameOnly "\"...
24cb0 20 5c 22 22 20 5b 66 69 6c 65 20 76 65 72 73 69   \"" [file versi
24cc0 6f 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  on \..          
24cd0 20 20 20 20 20 20 20 20 5b 67 65 74 42 69 6e 61          [getBina
24ce0 72 79 46 69 6c 65 4e 61 6d 65 20 24 66 69 6c 65  ryFileName $file
24cf0 4e 61 6d 65 4f 6e 6c 79 20 24 70 6c 61 74 66 6f  NameOnly $platfo
24d00 72 6d 5d 5d 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20  rm]] \"\n]..    
24d10 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
24d20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
24d30 20 20 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65      foreach file
24d40 4e 61 6d 65 4f 6e 6c 79 20 24 6d 69 78 65 64 46  NameOnly $mixedF
24d50 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20  ileNames {..    
24d60 20 20 20 20 20 20 20 20 63 61 74 63 68 20 7b 0d          catch {.
24d70 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74  .              t
24d80 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
24d90 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
24da0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
24db0 20 20 20 20 20 20 22 2d 2d 2d 2d 20 66 69 6c 65        "---- file
24dc0 20 76 65 72 73 69 6f 6e 20 6f 66 20 5c 22 22 20   version of \"" 
24dd0 24 70 6c 61 74 66 6f 72 6d 20 5c 0d 0a 20 20 20  $platform \..   
24de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
24df0 20 24 66 69 6c 65 4e 61 6d 65 4f 6e 6c 79 20 22   $fileNameOnly "
24e00 5c 22 2e 2e 2e 20 5c 22 22 20 5b 66 69 6c 65 20  \"... \"" [file 
24e10 76 65 72 73 69 6f 6e 20 5c 0d 0a 20 20 20 20 20  version \..     
24e20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 67 65               [ge
24e30 74 42 69 6e 61 72 79 46 69 6c 65 4e 61 6d 65 20  tBinaryFileName 
24e40 24 66 69 6c 65 4e 61 6d 65 4f 6e 6c 79 20 24 70  $fileNameOnly $p
24e50 6c 61 74 66 6f 72 6d 5d 5d 20 5c 22 5c 6e 5d 0d  latform]] \"\n].
24e60 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  .            }..
24e70 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
24e80 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
24e90 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65    if {[string le
24ea0 6e 67 74 68 20 24 61 72 63 68 69 74 65 63 74 75  ngth $architectu
24eb0 72 65 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d  re] > 0} then {.
24ec0 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 65 61  .          forea
24ed0 63 68 20 66 69 6c 65 4e 61 6d 65 4f 6e 6c 79 20  ch fileNameOnly 
24ee0 24 6e 61 74 69 76 65 46 69 6c 65 4e 61 6d 65 73  $nativeFileNames
24ef0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
24f00 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20  catch {..       
24f10 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
24f20 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70  test_channel [ap
24f30 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
24f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d                "-
24f50 2d 2d 2d 20 66 69 6c 65 20 76 65 72 73 69 6f 6e  --- file version
24f60 20 6f 66 20 5c 22 22 20 24 61 72 63 68 69 74 65   of \"" $archite
24f70 63 74 75 72 65 20 5c 0d 0a 20 20 20 20 20 20 20  cture \..       
24f80 20 20 20 20 20 20 20 20 20 20 20 2f 20 24 66 69             / $fi
24f90 6c 65 4e 61 6d 65 4f 6e 6c 79 20 22 5c 22 2e 2e  leNameOnly "\"..
24fa0 2e 20 5c 22 22 20 5b 66 69 6c 65 20 76 65 72 73  . \"" [file vers
24fb0 69 6f 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ion \..         
24fc0 20 20 20 20 20 20 20 20 20 5b 67 65 74 42 69 6e           [getBin
24fd0 61 72 79 46 69 6c 65 4e 61 6d 65 20 24 66 69 6c  aryFileName $fil
24fe0 65 4e 61 6d 65 4f 6e 6c 79 20 24 61 72 63 68 69  eNameOnly $archi
24ff0 74 65 63 74 75 72 65 5d 5d 20 5c 22 5c 6e 5d 0d  tecture]] \"\n].
25000 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  .            }..
25010 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20            }.... 
25020 20 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68           foreach
25030 20 66 69 6c 65 4e 61 6d 65 4f 6e 6c 79 20 24 6d   fileNameOnly $m
25040 69 78 65 64 46 69 6c 65 4e 61 6d 65 73 20 7b 0d  ixedFileNames {.
25050 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 61 74  .            cat
25060 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  ch {..          
25070 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
25080 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e  t_channel [appen
25090 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
250a0 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
250b0 20 66 69 6c 65 20 76 65 72 73 69 6f 6e 20 6f 66   file version of
250c0 20 5c 22 22 20 24 61 72 63 68 69 74 65 63 74 75   \"" $architectu
250d0 72 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  re \..          
250e0 20 20 20 20 20 20 20 20 2f 20 24 66 69 6c 65 4e          / $fileN
250f0 61 6d 65 4f 6e 6c 79 20 22 5c 22 2e 2e 2e 20 5c  ameOnly "\"... \
25100 22 22 20 5b 66 69 6c 65 20 76 65 72 73 69 6f 6e  "" [file version
25110 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
25120 20 20 20 20 20 20 5b 67 65 74 42 69 6e 61 72 79        [getBinary
25130 46 69 6c 65 4e 61 6d 65 20 24 66 69 6c 65 4e 61  FileName $fileNa
25140 6d 65 4f 6e 6c 79 20 24 61 72 63 68 69 74 65 63  meOnly $architec
25150 74 75 72 65 5d 5d 20 5c 22 5c 6e 5d 0d 0a 20 20  ture]] \"\n]..  
25160 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
25170 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
25180 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23    }....        #
25190 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
251a0 3a 20 47 72 61 62 20 74 68 65 20 6c 69 73 74 20  : Grab the list 
251b0 6f 66 20 6d 61 6e 61 67 65 64 20 61 73 73 65 6d  of managed assem
251c0 62 6c 69 65 73 20 66 6f 72 20 74 68 65 20 63 75  blies for the cu
251d0 72 72 65 6e 74 20 70 72 6f 63 65 73 73 0d 0a 20  rrent process.. 
251e0 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 61         #       a
251f0 6e 64 20 72 65 70 6f 72 74 20 6f 6e 20 74 68 65  nd report on the
25200 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c   System.Data.SQL
25210 69 74 65 20 72 65 6c 61 74 65 64 20 6f 6e 65 73  ite related ones
25220 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
25230 20 20 20 20 20 20 69 66 20 7b 5b 68 61 76 65 53        if {[haveS
25240 51 4c 69 74 65 4f 62 6a 65 63 74 43 6f 6d 6d 61  QLiteObjectComma
25250 6e 64 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  nd]} then {..   
25260 20 20 20 20 20 20 20 73 65 74 20 61 73 73 65 6d         set assem
25270 62 6c 69 65 73 20 5b 6f 62 6a 65 63 74 20 69 6e  blies [object in
25280 76 6f 6b 65 20 41 70 70 44 6f 6d 61 69 6e 2e 43  voke AppDomain.C
25290 75 72 72 65 6e 74 44 6f 6d 61 69 6e 20 47 65 74  urrentDomain Get
252a0 41 73 73 65 6d 62 6c 69 65 73 5d 0d 0a 0d 0a 20  Assemblies].... 
252b0 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20           object 
252c0 66 6f 72 65 61 63 68 20 61 73 73 65 6d 62 6c 79  foreach assembly
252d0 20 24 61 73 73 65 6d 62 6c 69 65 73 20 7b 0d 0a   $assemblies {..
252e0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b              if {
252f0 5b 73 74 72 69 6e 67 20 6d 61 74 63 68 20 5c 7b  [string match \{
25300 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
25310 74 65 2a 20 24 61 73 73 65 6d 62 6c 79 5d 7d 20  te* $assembly]} 
25320 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
25330 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
25340 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70  est_channel [app
25350 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
25360 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d               "--
25370 2d 2d 20 66 6f 75 6e 64 20 6c 6f 61 64 65 64 20  -- found loaded 
25380 61 73 73 65 6d 62 6c 79 3a 20 22 20 24 61 73 73  assembly: " $ass
25390 65 6d 62 6c 79 20 5c 6e 5d 0d 0a 20 20 20 20 20  embly \n]..     
253a0 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
253b0 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d      }..        }
253c0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 63 61 74 63  ....        catc
253d0 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74  h {..          t
253e0 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
253f0 6e 6e 65 6c 20 5c 0d 0a 20 20 20 20 20 20 20 20  nnel \..        
25400 20 20 20 20 20 20 22 2d 2d 2d 2d 20 64 65 66 69        "---- defi
25410 6e 65 20 63 6f 6e 73 74 61 6e 74 73 20 66 6f 72  ne constants for
25420 20 5c 22 53 79 73 74 65 6d 2e 44 61 74 61 2e 53   \"System.Data.S
25430 51 4c 69 74 65 5c 22 2e 2e 2e 20 22 0d 0a 0d 0a  QLite\"... "....
25440 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63            if {[c
25450 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20  atch {..        
25460 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b      object invok
25470 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62  e -flags +NonPub
25480 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  lic \..         
25490 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61         System.Da
254a0 74 61 2e 53 51 4c 69 74 65 2e 53 51 4c 69 74 65  ta.SQLite.SQLite
254b0 33 20 44 65 66 69 6e 65 43 6f 6e 73 74 61 6e 74  3 DefineConstant
254c0 73 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 20 64  s..          } d
254d0 65 66 69 6e 65 43 6f 6e 73 74 61 6e 74 73 5d 20  efineConstants] 
254e0 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  == 0} then {..  
254f0 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
25500 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
25510 5b 61 70 70 65 6e 64 41 72 67 73 20 5b 66 6f 72  [appendArgs [for
25520 6d 61 74 4c 69 73 74 20 5b 6c 73 6f 72 74 20 5c  matList [lsort \
25530 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
25540 20 20 24 64 65 66 69 6e 65 43 6f 6e 73 74 61 6e    $defineConstan
25550 74 73 5d 20 3c 6e 6f 6e 65 3e 5d 20 5c 6e 5d 0d  ts] <none>] \n].
25560 0a 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73  .          } els
25570 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e {..           
25580 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
25590 68 61 6e 6e 65 6c 20 75 6e 6b 6e 6f 77 6e 5c 6e  hannel unknown\n
255a0 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20  ..          }.. 
255b0 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
255c0 20 20 20 20 63 61 74 63 68 20 7b 0d 0a 20 20 20      catch {..   
255d0 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
255e0 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5c 0d 0a  test_channel \..
255f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d                "-
25600 2d 2d 2d 20 73 6f 75 72 63 65 20 76 65 72 73 69  --- source versi
25610 6f 6e 20 6f 66 20 5c 22 53 79 73 74 65 6d 2e 44  on of \"System.D
25620 61 74 61 2e 53 51 4c 69 74 65 2e 64 6c 6c 5c 22  ata.SQLite.dll\"
25630 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 20 20 20  ... "....       
25640 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d     if {[catch {.
25650 0a 20 20 20 20 20 20 20 20 20 20 20 20 6f 62 6a  .            obj
25660 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67  ect invoke -flag
25670 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a  s +NonPublic \..
25680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25690 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
256a0 74 65 2e 53 51 4c 69 74 65 43 6f 6e 6e 65 63 74  te.SQLiteConnect
256b0 69 6f 6e 20 50 72 6f 76 69 64 65 72 56 65 72 73  ion ProviderVers
256c0 69 6f 6e 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  ion..          }
256d0 20 76 65 72 73 69 6f 6e 5d 20 3d 3d 20 30 7d 20   version] == 0} 
256e0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
256f0 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20      if {[string 
25700 6c 65 6e 67 74 68 20 24 76 65 72 73 69 6f 6e 5d  length $version]
25710 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20   == 0} then {.. 
25720 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74               set
25730 20 76 65 72 73 69 6f 6e 20 6e 75 6c 6c 0d 0a 20   version null.. 
25740 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
25750 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
25760 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
25770 5b 61 70 70 65 6e 64 41 72 67 73 20 24 76 65 72  [appendArgs $ver
25780 73 69 6f 6e 20 5c 6e 5d 0d 0a 20 20 20 20 20 20  sion \n]..      
25790 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
257a0 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
257b0 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
257c0 75 6e 6b 6e 6f 77 6e 5c 6e 0d 0a 20 20 20 20 20  unknown\n..     
257d0 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
257e0 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 63 61 74  }....        cat
257f0 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  ch {..          
25800 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
25810 61 6e 6e 65 6c 20 5c 0d 0a 20 20 20 20 20 20 20  annel \..       
25820 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 73 6f 75         "---- sou
25830 72 63 65 20 63 68 65 63 6b 6f 75 74 20 6f 66 20  rce checkout of 
25840 5c 22 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51  \"System.Data.SQ
25850 4c 69 74 65 2e 64 6c 6c 5c 22 2e 2e 2e 20 22 0d  Lite.dll\"... ".
25860 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20  ...          if 
25870 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20  {[catch {..     
25880 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e         object in
25890 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e  voke -flags +Non
258a0 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20  Public \..      
258b0 20 20 20 20 20 20 20 20 20 20 53 79 73 74 65 6d            System
258c0 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 53 51 4c  .Data.SQLite.SQL
258d0 69 74 65 43 6f 6e 6e 65 63 74 69 6f 6e 20 50 72  iteConnection Pr
258e0 6f 76 69 64 65 72 53 6f 75 72 63 65 49 64 0d 0a  oviderSourceId..
258f0 20 20 20 20 20 20 20 20 20 20 7d 20 73 6f 75 72            } sour
25900 63 65 49 64 5d 20 3d 3d 20 30 7d 20 74 68 65 6e  ceId] == 0} then
25910 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
25920 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67  if {[string leng
25930 74 68 20 24 73 6f 75 72 63 65 49 64 5d 20 3d 3d  th $sourceId] ==
25940 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
25950 20 20 20 20 20 20 20 20 20 20 73 65 74 20 73 6f            set so
25960 75 72 63 65 49 64 20 6e 75 6c 6c 0d 0a 20 20 20  urceId null..   
25970 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
25980 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
25990 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61  :test_channel [a
259a0 70 70 65 6e 64 41 72 67 73 20 24 73 6f 75 72 63  ppendArgs $sourc
259b0 65 49 64 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20  eId \n]..       
259c0 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
259d0 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
259e0 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 75  ::test_channel u
259f0 6e 6b 6e 6f 77 6e 5c 6e 0d 0a 20 20 20 20 20 20  nknown\n..      
25a00 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d      }..        }
25a10 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  ....        #.. 
25a20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43         # NOTE: C
25a30 68 65 63 6b 20 74 68 65 20 61 76 61 69 6c 61 62  heck the availab
25a40 6c 65 20 62 75 69 6c 64 73 20 28 61 6e 64 20 22  le builds (and "
25a50 72 65 6c 65 61 73 65 73 22 29 20 6f 66 20 53 51  releases") of SQ
25a60 4c 69 74 65 20 61 6e 64 0d 0a 20 20 20 20 20 20  Lite and..      
25a70 20 20 23 20 20 20 20 20 20 20 53 79 73 74 65 6d    #       System
25a80 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 0d 0a 20  .Data.SQLite... 
25a90 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
25aa0 20 20 63 68 65 63 6b 46 6f 72 53 51 4c 69 74 65    checkForSQLite
25ab0 42 75 69 6c 64 73 20 24 3a 3a 74 65 73 74 5f 63  Builds $::test_c
25ac0 68 61 6e 6e 65 6c 0d 0a 20 20 20 20 20 20 20 20  hannel..        
25ad0 63 68 65 63 6b 46 6f 72 53 51 4c 69 74 65 52 65  checkForSQLiteRe
25ae0 6c 65 61 73 65 73 20 24 3a 3a 74 65 73 74 5f 63  leases $::test_c
25af0 68 61 6e 6e 65 6c 0d 0a 0d 0a 20 20 20 20 20 20  hannel....      
25b00 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
25b10 4f 54 45 3a 20 4e 6f 77 2c 20 77 65 20 6e 65 65  OTE: Now, we nee
25b20 64 20 74 6f 20 6b 6e 6f 77 20 69 66 20 74 68 65  d to know if the
25b30 20 53 51 4c 69 74 65 20 63 6f 72 65 20 6c 69 62   SQLite core lib
25b40 72 61 72 79 20 69 73 20 61 76 61 69 6c 61 62 6c  rary is availabl
25b50 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  e..        #    
25b60 20 20 20 28 69 2e 65 2e 20 62 65 63 61 75 73 65     (i.e. because
25b70 20 74 68 65 20 6d 61 6e 61 67 65 64 2d 6f 6e 6c   the managed-onl
25b80 79 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51  y System.Data.SQ
25b90 4c 69 74 65 20 61 73 73 65 6d 62 6c 79 20 63 61  Lite assembly ca
25ba0 6e 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  n..        #    
25bb0 20 20 20 6c 6f 61 64 20 77 69 74 68 6f 75 74 20     load without 
25bc0 69 74 3b 20 68 6f 77 65 76 65 72 2c 20 69 74 20  it; however, it 
25bd0 63 61 6e 6e 6f 74 20 64 6f 20 61 6e 79 74 68 69  cannot do anythi
25be0 6e 67 20 75 73 65 66 75 6c 20 77 69 74 68 6f 75  ng useful withou
25bf0 74 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  t..        #    
25c00 20 20 20 69 74 29 2e 20 20 49 66 20 77 65 20 61     it).  If we a
25c10 72 65 20 75 73 69 6e 67 20 74 68 65 20 6d 69 78  re using the mix
25c20 65 64 2d 6d 6f 64 65 20 61 73 73 65 6d 62 6c 79  ed-mode assembly
25c30 20 61 6e 64 20 77 65 20 61 6c 72 65 61 64 79 0d   and we already.
25c40 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
25c50 20 66 6f 75 6e 64 20 69 74 20 28 61 62 6f 76 65   found it (above
25c60 29 2c 20 74 68 69 73 20 73 68 6f 75 6c 64 20 61  ), this should a
25c70 6c 77 61 79 73 20 73 75 63 63 65 65 64 2e 0d 0a  lways succeed...
25c80 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
25c90 20 20 20 63 68 65 63 6b 46 6f 72 53 51 4c 69 74     checkForSQLit
25ca0 65 4c 69 62 72 61 72 79 20 24 3a 3a 74 65 73 74  eLibrary $::test
25cb0 5f 63 68 61 6e 6e 65 6c 0d 0a 0d 0a 20 20 20 20  _channel....    
25cc0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
25cd0 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 69 66 20   NOTE: Check if 
25ce0 74 68 65 20 53 51 4c 69 74 65 20 69 6e 74 65 72  the SQLite inter
25cf0 6f 70 20 61 73 73 65 6d 62 6c 79 20 69 73 20 61  op assembly is a
25d00 76 61 69 6c 61 62 6c 65 2e 0d 0a 20 20 20 20 20  vailable...     
25d10 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 63 68     #..        ch
25d20 65 63 6b 46 6f 72 53 51 4c 69 74 65 49 6e 74 65  eckForSQLiteInte
25d30 72 6f 70 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  rop $::test_chan
25d40 6e 65 6c 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23  nel....        #
25d50 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
25d60 3a 20 43 68 65 63 6b 20 74 68 65 20 53 51 4c 69  : Check the SQLi
25d70 74 65 20 64 61 74 61 62 61 73 65 20 61 6e 64 20  te database and 
25d80 74 65 6d 70 6f 72 61 72 79 20 64 69 72 65 63 74  temporary direct
25d90 6f 72 69 65 73 2e 0d 0a 20 20 20 20 20 20 20 20  ories...        
25da0 23 0d 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b  #..        check
25db0 46 6f 72 53 51 4c 69 74 65 44 69 72 65 63 74 6f  ForSQLiteDirecto
25dc0 72 69 65 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  ries $::test_cha
25dd0 6e 6e 65 6c 0d 0a 0d 0a 20 20 20 20 20 20 20 20  nnel....        
25de0 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
25df0 45 3a 20 41 74 74 65 6d 70 74 20 74 6f 20 64 65  E: Attempt to de
25e00 74 65 72 6d 69 6e 65 20 69 66 20 76 61 72 69 6f  termine if vario
25e10 75 73 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20  us compile-time 
25e20 6f 70 74 69 6f 6e 73 20 6e 65 65 64 65 64 20 66  options needed f
25e30 6f 72 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  or..        #   
25e40 20 20 20 20 74 65 73 74 20 63 6f 6e 73 74 72 61      test constra
25e50 69 6e 74 73 20 77 65 72 65 20 65 6e 61 62 6c 65  ints were enable
25e60 64 20 66 6f 72 20 74 68 65 20 6d 61 6e 61 67 65  d for the manage
25e70 64 20 61 73 73 65 6d 62 6c 79 2e 20 20 54 68 65  d assembly.  The
25e80 72 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  re..        #   
25e90 20 20 20 20 61 72 65 20 73 6f 6d 65 20 63 6f 6d      are some com
25ea0 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e  pile-time option
25eb0 73 20 74 68 61 74 20 6d 75 73 74 20 61 6c 73 6f  s that must also
25ec0 20 68 61 76 65 20 62 65 65 6e 20 65 6e 61 62 6c   have been enabl
25ed0 65 64 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  ed..        #   
25ee0 20 20 20 20 66 6f 72 20 74 68 65 20 69 6e 74 65      for the inte
25ef0 72 6f 70 20 61 73 73 65 6d 62 6c 79 20 69 6e 20  rop assembly in 
25f00 6f 72 64 65 72 20 74 6f 20 62 65 20 65 66 66 65  order to be effe
25f10 63 74 69 76 65 2e 20 20 46 6f 72 20 74 68 6f 73  ctive.  For thos
25f20 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  e..        #    
25f30 20 20 20 6f 70 74 69 6f 6e 73 2c 20 69 74 20 77     options, it w
25f40 69 6c 6c 20 62 65 20 61 73 73 75 6d 65 64 20 74  ill be assumed t
25f50 68 61 74 20 69 74 20 77 61 73 20 65 6e 61 62 6c  hat it was enabl
25f60 65 64 20 66 6f 72 20 74 68 65 20 69 6e 74 65 72  ed for the inter
25f70 6f 70 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  op..        #   
25f80 20 20 20 20 61 73 73 65 6d 62 6c 79 20 69 66 20      assembly if 
25f90 69 74 20 77 61 73 20 65 6e 61 62 6c 65 64 20 66  it was enabled f
25fa0 6f 72 20 74 68 65 20 6d 61 6e 61 67 65 64 20 61  or the managed a
25fb0 73 73 65 6d 62 6c 79 2e 0d 0a 20 20 20 20 20 20  ssembly...      
25fc0 20 20 23 0d 0a 20 20 20 20 20 20 20 20 66 6f 72    #..        for
25fd0 65 61 63 68 20 64 65 66 69 6e 65 43 6f 6e 73 74  each defineConst
25fe0 61 6e 74 20 5b 6c 69 73 74 20 5c 0d 0a 20 20 20  ant [list \..   
25ff0 20 20 20 20 20 20 20 20 20 43 48 45 43 4b 5f 53           CHECK_S
26000 54 41 54 45 20 43 4f 55 4e 54 5f 48 41 4e 44 4c  TATE COUNT_HANDL
26010 45 20 44 45 42 55 47 20 49 4e 54 45 52 4f 50 5f  E DEBUG INTEROP_
26020 43 4f 44 45 43 20 49 4e 54 45 52 4f 50 5f 44 45  CODEC INTEROP_DE
26030 42 55 47 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  BUG \..         
26040 20 20 20 49 4e 54 45 52 4f 50 5f 45 58 54 45 4e     INTEROP_EXTEN
26050 53 49 4f 4e 5f 46 55 4e 43 54 49 4f 4e 53 20 49  SION_FUNCTIONS I
26060 4e 54 45 52 4f 50 5f 46 54 53 35 5f 45 58 54 45  NTEROP_FTS5_EXTE
26070 4e 53 49 4f 4e 20 5c 0d 0a 20 20 20 20 20 20 20  NSION \..       
26080 20 20 20 20 20 49 4e 54 45 52 4f 50 5f 49 4e 43       INTEROP_INC
26090 4c 55 44 45 5f 43 45 52 4f 44 20 49 4e 54 45 52  LUDE_CEROD INTER
260a0 4f 50 5f 49 4e 43 4c 55 44 45 5f 45 58 54 52 41  OP_INCLUDE_EXTRA
260b0 20 49 4e 54 45 52 4f 50 5f 49 4e 43 4c 55 44 45   INTEROP_INCLUDE
260c0 5f 53 45 45 20 5c 0d 0a 20 20 20 20 20 20 20 20  _SEE \..        
260d0 20 20 20 20 49 4e 54 45 52 4f 50 5f 49 4e 43 4c      INTEROP_INCL
260e0 55 44 45 5f 5a 49 50 56 46 53 20 49 4e 54 45 52  UDE_ZIPVFS INTER
260f0 4f 50 5f 4a 53 4f 4e 31 5f 45 58 54 45 4e 53 49  OP_JSON1_EXTENSI
26100 4f 4e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  ON \..          
26110 20 20 49 4e 54 45 52 4f 50 5f 4c 45 47 41 43 59    INTEROP_LEGACY
26120 5f 43 4c 4f 53 45 20 49 4e 54 45 52 4f 50 5f 4c  _CLOSE INTEROP_L
26130 4f 47 20 49 4e 54 45 52 4f 50 5f 50 45 52 43 45  OG INTEROP_PERCE
26140 4e 54 49 4c 45 5f 45 58 54 45 4e 53 49 4f 4e 20  NTILE_EXTENSION 
26150 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 49  \..            I
26160 4e 54 45 52 4f 50 5f 52 45 47 45 58 50 5f 45 58  NTEROP_REGEXP_EX
26170 54 45 4e 53 49 4f 4e 20 49 4e 54 45 52 4f 50 5f  TENSION INTEROP_
26180 53 48 41 31 5f 45 58 54 45 4e 53 49 4f 4e 20 5c  SHA1_EXTENSION \
26190 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 49 4e  ..            IN
261a0 54 45 52 4f 50 5f 54 45 53 54 5f 45 58 54 45 4e  TEROP_TEST_EXTEN
261b0 53 49 4f 4e 20 49 4e 54 45 52 4f 50 5f 54 4f 54  SION INTEROP_TOT
261c0 59 50 45 5f 45 58 54 45 4e 53 49 4f 4e 20 5c 0d  YPE_EXTENSION \.
261d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 49 4e 54  .            INT
261e0 45 52 4f 50 5f 56 49 52 54 55 41 4c 5f 54 41 42  EROP_VIRTUAL_TAB
261f0 4c 45 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  LE \..          
26200 20 20 4e 45 54 5f 32 30 20 4e 45 54 5f 33 35 20    NET_20 NET_35 
26210 4e 45 54 5f 34 30 20 4e 45 54 5f 34 35 20 4e 45  NET_40 NET_45 NE
26220 54 5f 34 35 31 20 4e 45 54 5f 34 35 32 20 4e 45  T_451 NET_452 NE
26230 54 5f 34 36 20 4e 45 54 5f 34 36 31 20 5c 0d 0a  T_46 NET_461 \..
26240 20 20 20 20 20 20 20 20 20 20 20 20 4e 45 54 5f              NET_
26250 34 36 32 20 4e 45 54 5f 43 4f 4d 50 41 43 54 5f  462 NET_COMPACT_
26260 32 30 20 50 4c 41 54 46 4f 52 4d 5f 43 4f 4d 50  20 PLATFORM_COMP
26270 41 43 54 46 52 41 4d 45 57 4f 52 4b 20 5c 0d 0a  ACTFRAMEWORK \..
26280 20 20 20 20 20 20 20 20 20 20 20 20 50 52 45 4c              PREL
26290 4f 41 44 5f 4e 41 54 49 56 45 5f 4c 49 42 52 41  OAD_NATIVE_LIBRA
262a0 52 59 20 52 45 54 41 52 47 45 54 41 42 4c 45 20  RY RETARGETABLE 
262b0 53 51 4c 49 54 45 5f 53 54 41 4e 44 41 52 44 20  SQLITE_STANDARD 
262c0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 54  \..            T
262d0 48 52 4f 57 5f 4f 4e 5f 44 49 53 50 4f 53 45 44  HROW_ON_DISPOSED
262e0 20 54 52 41 43 45 20 54 52 41 43 45 5f 43 4f 4e   TRACE TRACE_CON
262f0 4e 45 43 54 49 4f 4e 20 54 52 41 43 45 5f 44 45  NECTION TRACE_DE
26300 54 45 43 54 49 4f 4e 20 5c 0d 0a 20 20 20 20 20  TECTION \..     
26310 20 20 20 20 20 20 20 54 52 41 43 45 5f 48 41 4e         TRACE_HAN
26320 44 4c 45 20 54 52 41 43 45 5f 50 52 45 4c 4f 41  DLE TRACE_PRELOA
26330 44 20 54 52 41 43 45 5f 53 48 41 52 45 44 20 54  D TRACE_SHARED T
26340 52 41 43 45 5f 53 54 41 54 45 4d 45 4e 54 20 5c  RACE_STATEMENT \
26350 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 54 52  ..            TR
26360 41 43 45 5f 57 41 52 4e 49 4e 47 20 54 52 41 43  ACE_WARNING TRAC
26370 4b 5f 4d 45 4d 4f 52 59 5f 42 59 54 45 53 20 55  K_MEMORY_BYTES U
26380 53 45 5f 45 4e 54 49 54 59 5f 46 52 41 4d 45 57  SE_ENTITY_FRAMEW
26390 4f 52 4b 5f 36 20 5c 0d 0a 20 20 20 20 20 20 20  ORK_6 \..       
263a0 20 20 20 20 20 55 53 45 5f 49 4e 54 45 52 4f 50       USE_INTEROP
263b0 5f 44 4c 4c 20 55 53 45 5f 50 52 45 50 41 52 45  _DLL USE_PREPARE
263c0 5f 56 32 20 57 49 4e 44 4f 57 53 5d 20 7b 0d 0a  _V2 WINDOWS] {..
263d0 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
263e0 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43         # NOTE: C
263f0 68 65 63 6b 20 69 66 20 74 68 65 20 63 6f 6d 70  heck if the comp
26400 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 20  ile-time option 
26410 69 73 20 6c 69 73 74 65 64 20 69 6e 20 74 68 65  is listed in the
26420 20 6c 69 73 74 20 6f 66 0d 0a 20 20 20 20 20 20   list of..      
26430 20 20 20 20 23 20 20 20 20 20 20 20 22 64 65 66      #       "def
26440 69 6e 65 20 63 6f 6e 73 74 61 6e 74 73 22 20 6b  ine constants" k
26450 65 70 74 20 74 72 61 63 6b 20 6f 66 20 62 79 20  ept track of by 
26460 74 68 65 20 6d 61 6e 61 67 65 64 20 61 73 73 65  the managed asse
26470 6d 62 6c 79 2e 0d 0a 20 20 20 20 20 20 20 20 20  mbly...         
26480 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 63 68   #..          ch
26490 65 63 6b 46 6f 72 53 51 4c 69 74 65 44 65 66 69  eckForSQLiteDefi
264a0 6e 65 43 6f 6e 73 74 61 6e 74 20 24 3a 3a 74 65  neConstant $::te
264b0 73 74 5f 63 68 61 6e 6e 65 6c 20 24 64 65 66 69  st_channel $defi
264c0 6e 65 43 6f 6e 73 74 61 6e 74 0d 0a 20 20 20 20  neConstant..    
264d0 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
264e0 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
264f0 54 45 3a 20 43 68 65 63 6b 20 69 66 20 74 68 65  TE: Check if the
26500 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c   System.Data.SQL
26510 69 74 65 20 70 72 6f 76 69 64 65 72 20 77 61 73  ite provider was
26520 20 63 6f 6d 70 69 6c 65 64 20 77 69 74 68 0d 0a   compiled with..
26530 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
26540 73 75 70 70 6f 72 74 20 66 6f 72 20 61 6e 79 20  support for any 
26550 65 6e 63 72 79 70 74 65 64 20 64 61 74 61 62 61  encrypted databa
26560 73 65 73 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  ses...        #.
26570 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 68 61  .        if {[ha
26580 76 65 53 51 4c 69 74 65 44 65 66 69 6e 65 43 6f  veSQLiteDefineCo
26590 6e 73 74 61 6e 74 20 49 4e 54 45 52 4f 50 5f 43  nstant INTEROP_C
265a0 4f 44 45 43 5d 20 7c 7c 20 5c 0d 0a 20 20 20 20  ODEC] || \..    
265b0 20 20 20 20 20 20 20 20 5b 68 61 76 65 53 51 4c          [haveSQL
265c0 69 74 65 44 65 66 69 6e 65 43 6f 6e 73 74 61 6e  iteDefineConstan
265d0 74 20 49 4e 54 45 52 4f 50 5f 49 4e 43 4c 55 44  t INTEROP_INCLUD
265e0 45 5f 53 45 45 5d 7d 20 74 68 65 6e 20 7b 0d 0a  E_SEE]} then {..
265f0 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
26600 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 59         # NOTE: Y
26610 65 73 2c 20 61 64 64 20 67 65 6e 65 72 69 63 20  es, add generic 
26620 63 6f 6e 73 74 72 61 69 6e 74 20 66 6f 72 20 75  constraint for u
26630 73 65 20 62 79 20 74 68 65 20 74 65 73 74 20 73  se by the test s
26640 75 69 74 65 2e 0d 0a 20 20 20 20 20 20 20 20 20  uite...         
26650 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 61 64   #..          ad
26660 64 43 6f 6e 73 74 72 61 69 6e 74 20 53 79 73 74  dConstraint Syst
26670 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 45  em.Data.SQLite.E
26680 6e 63 72 79 70 74 69 6f 6e 0d 0a 20 20 20 20 20  ncryption..     
26690 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
266a0 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
266b0 45 3a 20 43 68 65 63 6b 20 74 68 65 20 63 75 72  E: Check the cur
266c0 72 65 6e 74 20 62 75 69 6c 64 20 79 65 61 72 2e  rent build year.
266d0 20 20 42 61 73 69 63 61 6c 6c 79 2c 20 74 68 69    Basically, thi
266e0 73 20 69 6e 64 69 63 61 74 65 73 0d 0a 20 20 20  s indicates..   
266f0 20 20 20 20 20 23 20 20 20 20 20 20 20 77 68 69       #       whi
26700 63 68 20 76 65 72 73 69 6f 6e 20 6f 66 20 4d 53  ch version of MS
26710 42 75 69 6c 64 20 61 6e 64 2f 6f 72 20 56 69 73  Build and/or Vis
26720 75 61 6c 20 53 74 75 64 69 6f 20 77 61 73 20 75  ual Studio was u
26730 73 65 64 20 74 6f 0d 0a 20 20 20 20 20 20 20 20  sed to..        
26740 23 20 20 20 20 20 20 20 63 6f 6d 70 69 6c 65 20  #       compile 
26750 74 68 65 20 61 73 73 65 6d 62 6c 79 20 62 69 6e  the assembly bin
26760 61 72 69 65 73 20 75 6e 64 65 72 20 74 65 73 74  aries under test
26770 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
26780 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
26790 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5c 0d 0a 20  est_channel \.. 
267a0 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
267b0 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 53 79   checking for Sy
267c0 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
267d0 20 62 75 69 6c 64 20 79 65 61 72 2e 2e 2e 20 22   build year... "
267e0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20  ....        set 
267f0 79 65 61 72 20 5b 67 65 74 42 75 69 6c 64 59 65  year [getBuildYe
26800 61 72 5d 0d 0a 20 20 20 20 20 20 20 20 61 64 64  ar]..        add
26810 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65  Constraint [appe
26820 6e 64 41 72 67 73 20 62 75 69 6c 64 59 65 61 72  ndArgs buildYear
26830 2e 20 24 79 65 61 72 5d 0d 0a 20 20 20 20 20 20  . $year]..      
26840 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
26850 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
26860 72 67 73 20 5c 22 20 24 79 65 61 72 20 5c 22 5c  rgs \" $year \"\
26870 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d  n]....        #.
26880 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
26890 20 43 68 65 63 6b 20 74 68 65 20 63 75 72 72 65   Check the curre
268a0 6e 74 20 62 75 69 6c 64 20 2e 4e 45 54 20 46 72  nt build .NET Fr
268b0 61 6d 65 77 6f 72 6b 2e 20 20 42 61 73 69 63 61  amework.  Basica
268c0 6c 6c 79 2c 20 74 68 69 73 0d 0a 20 20 20 20 20  lly, this..     
268d0 20 20 20 23 20 20 20 20 20 20 20 69 6e 64 69 63     #       indic
268e0 61 74 65 73 20 77 68 69 63 68 20 76 65 72 73 69  ates which versi
268f0 6f 6e 20 6f 66 20 74 68 65 20 2e 4e 45 54 20 46  on of the .NET F
26900 72 61 6d 65 77 6f 72 6b 20 69 73 20 62 65 69 6e  ramework is bein
26910 67 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  g..        #    
26920 20 20 20 75 73 65 64 20 62 79 20 74 68 65 20 61     used by the a
26930 73 73 65 6d 62 6c 79 20 62 69 6e 61 72 69 65 73  ssembly binaries
26940 20 75 6e 64 65 72 20 74 65 73 74 2e 0d 0a 20 20   under test...  
26950 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
26960 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
26970 68 61 6e 6e 65 6c 20 5c 0d 0a 20 20 20 20 20 20  hannel \..      
26980 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 68 65 63        "---- chec
26990 6b 69 6e 67 20 66 6f 72 20 53 79 73 74 65 6d 2e  king for System.
269a0 44 61 74 61 2e 53 51 4c 69 74 65 20 62 75 69 6c  Data.SQLite buil
269b0 64 20 2e 4e 45 54 20 46 72 61 6d 65 77 6f 72 6b  d .NET Framework
269c0 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 20 20 20  ... "....       
269d0 20 73 65 74 20 6e 65 74 46 78 20 5b 67 65 74 42   set netFx [getB
269e0 75 69 6c 64 4e 65 74 46 78 5d 0d 0a 20 20 20 20  uildNetFx]..    
269f0 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e      addConstrain
26a00 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20 62 75  t [appendArgs bu
26a10 69 6c 64 46 72 61 6d 65 77 6f 72 6b 2e 20 24 6e  ildFramework. $n
26a20 65 74 46 78 5d 0d 0a 20 20 20 20 20 20 20 20 74  etFx]..        t
26a30 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
26a40 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
26a50 20 5c 22 20 24 6e 65 74 46 78 20 5c 22 5c 6e 5d   \" $netFx \"\n]
26a60 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  ....        #.. 
26a70 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43         # NOTE: C
26a80 68 65 63 6b 20 74 68 65 20 63 75 72 72 65 6e 74  heck the current
26a90 20 62 75 69 6c 64 20 63 6f 6e 66 69 67 75 72 61   build configura
26aa0 74 69 6f 6e 2e 20 20 54 68 69 73 20 73 68 6f 75  tion.  This shou
26ab0 6c 64 20 6e 6f 72 6d 61 6c 6c 79 0d 0a 20 20 20  ld normally..   
26ac0 20 20 20 20 20 23 20 20 20 20 20 20 20 62 65 20       #       be 
26ad0 65 69 74 68 65 72 20 22 44 65 62 75 67 22 20 6f  either "Debug" o
26ae0 72 20 22 52 65 6c 65 61 73 65 22 2e 0d 0a 20 20  r "Release"...  
26af0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
26b00 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
26b10 68 61 6e 6e 65 6c 20 5c 0d 0a 20 20 20 20 20 20  hannel \..      
26b20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 68 65 63        "---- chec
26b30 6b 69 6e 67 20 66 6f 72 20 53 79 73 74 65 6d 2e  king for System.
26b40 44 61 74 61 2e 53 51 4c 69 74 65 20 62 75 69 6c  Data.SQLite buil
26b50 64 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e  d configuration.
26b60 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 20 20 20 20  .. "....        
26b70 73 65 74 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  set configuratio
26b80 6e 20 5b 67 65 74 42 75 69 6c 64 43 6f 6e 66 69  n [getBuildConfi
26b90 67 75 72 61 74 69 6f 6e 5d 0d 0a 20 20 20 20 20  guration]..     
26ba0 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74     addConstraint
26bb0 20 5b 61 70 70 65 6e 64 41 72 67 73 20 62 75 69   [appendArgs bui
26bc0 6c 64 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e  ldConfiguration.
26bd0 20 24 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 5d   $configuration]
26be0 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20  ..        tputs 
26bf0 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
26c00 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 22 20 24  [appendArgs \" $
26c10 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 5c 22  configuration \"
26c20 5c 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23  \n]....        #
26c30 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
26c40 3a 20 54 72 79 20 74 6f 20 73 65 74 75 70 20 61  : Try to setup a
26c50 6e 20 69 6e 74 65 72 72 75 70 74 20 63 61 6c 6c  n interrupt call
26c60 62 61 63 6b 20 75 73 69 6e 67 20 74 68 65 20 73  back using the s
26c70 63 72 69 70 74 20 64 65 62 75 67 67 65 72 0d 0a  cript debugger..
26c80 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
26c90 74 68 61 74 20 77 69 6c 6c 20 63 61 6e 63 65 6c  that will cancel
26ca0 20 61 6c 6c 20 53 51 4c 20 71 75 65 72 69 65 73   all SQL queries
26cb0 20 69 6e 20 70 72 6f 67 72 65 73 73 20 66 6f 72   in progress for
26cc0 20 61 6c 6c 20 64 61 74 61 62 61 73 65 0d 0a 20   all database.. 
26cd0 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63         #       c
26ce0 6f 6e 6e 65 63 74 69 6f 6e 73 20 6b 6e 6f 77 6e  onnections known
26cf0 20 74 6f 20 74 68 69 73 20 69 6e 74 65 72 70 72   to this interpr
26d00 65 74 65 72 2e 0d 0a 20 20 20 20 20 20 20 20 23  eter...        #
26d10 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b  ..        if {![
26d20 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f  info exists ::no
26d30 28 73 71 6c 69 74 65 49 6e 74 65 72 72 75 70 74  (sqliteInterrupt
26d40 43 61 6c 6c 62 61 63 6b 29 5d 7d 20 74 68 65 6e  Callback)]} then
26d50 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65   {..          se
26d60 74 75 70 44 62 49 6e 74 65 72 72 75 70 74 43 61  tupDbInterruptCa
26d70 6c 6c 62 61 63 6b 20 24 3a 3a 74 65 73 74 5f 63  llback $::test_c
26d80 68 61 6e 6e 65 6c 20 24 3a 3a 74 65 73 74 5f 6c  hannel $::test_l
26d90 6f 67 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d  og..        }...
26da0 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
26db0 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68 65 63      # NOTE: Chec
26dc0 6b 20 66 6f 72 20 74 68 65 20 6e 61 74 69 76 65  k for the native
26dd0 20 72 75 6e 74 69 6d 65 20 6f 70 74 69 6f 6e 2c   runtime option,
26de0 20 77 68 69 63 68 20 77 6f 75 6c 64 20 6d 65 61   which would mea
26df0 6e 20 77 65 20 61 72 65 0d 0a 20 20 20 20 20 20  n we are..      
26e00 20 20 23 20 20 20 20 20 20 20 75 73 69 6e 67 20    #       using 
26e10 74 68 65 20 6d 69 78 65 64 2d 6d 6f 64 65 20 61  the mixed-mode a
26e20 73 73 65 6d 62 6c 79 2e 0d 0a 20 20 20 20 20 20  ssembly...      
26e30 20 20 23 0d 0a 20 20 20 20 20 20 20 20 63 68 65    #..        che
26e40 63 6b 46 6f 72 52 75 6e 74 69 6d 65 4f 70 74 69  ckForRuntimeOpti
26e50 6f 6e 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  on $::test_chann
26e60 65 6c 20 6e 61 74 69 76 65 0d 0a 0d 0a 20 20 20  el native....   
26e70 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
26e80 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 69 66  # NOTE: Check if
26e90 20 74 68 65 20 74 65 73 74 20 73 75 69 74 65 20   the test suite 
26ea0 73 68 6f 75 6c 64 20 63 6f 75 6e 74 20 74 68 65  should count the
26eb0 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6e 6e 65   number of conne
26ec0 63 74 69 6f 6e 73 0d 0a 20 20 20 20 20 20 20 20  ctions..        
26ed0 23 20 20 20 20 20 20 20 22 6f 70 65 6e 65 64 22  #       "opened"
26ee0 20 61 6e 64 20 22 63 6c 6f 73 65 64 22 20 66 72   and "closed" fr
26ef0 6f 6d 20 74 68 65 20 70 6f 6f 6c 20 77 68 65 6e  om the pool when
26f00 20 64 65 74 65 72 6d 69 6e 69 6e 67 20 69 66 20   determining if 
26f10 61 20 74 65 73 74 0d 0a 20 20 20 20 20 20 20 20  a test..        
26f20 23 20 20 20 20 20 20 20 70 61 73 73 65 64 2e 20  #       passed. 
26f30 20 44 69 73 61 62 6c 69 6e 67 20 74 68 69 73 20   Disabling this 
26f40 62 65 68 61 76 69 6f 72 20 69 73 20 73 6f 6d 65  behavior is some
26f50 74 69 6d 65 73 20 6e 65 63 65 73 73 61 72 79 20  times necessary 
26f60 28 65 2e 67 2e 0d 0a 20 20 20 20 20 20 20 20 23  (e.g...        #
26f70 20 20 20 20 20 20 20 64 75 72 69 6e 67 20 74 68         during th
26f80 65 20 72 65 6c 65 61 73 65 20 74 65 73 74 69 6e  e release testin
26f90 67 20 70 72 6f 63 65 73 73 29 20 62 65 63 61 75  g process) becau
26fa0 73 65 20 74 68 65 72 65 20 61 72 65 20 73 65 76  se there are sev
26fb0 65 72 61 6c 0d 0a 20 20 20 20 20 20 20 20 23 20  eral..        # 
26fc0 20 20 20 20 20 20 74 65 73 74 73 20 74 68 61 74        tests that
26fd0 20 72 65 6c 79 20 6f 6e 20 74 68 65 20 22 6f 70   rely on the "op
26fe0 65 6e 65 64 20 66 72 6f 6d 20 70 6f 6f 6c 22 20  ened from pool" 
26ff0 63 6f 75 6e 74 20 62 65 69 6e 67 20 67 72 65 61  count being grea
27000 74 65 72 0d 0a 20 20 20 20 20 20 20 20 23 20 20  ter..        #  
27010 20 20 20 20 20 74 68 61 6e 20 7a 65 72 6f 2e 20       than zero. 
27020 20 54 68 65 73 65 20 74 65 73 74 73 20 6d 61 79   These tests may
27030 20 66 61 69 6c 20 64 75 65 20 74 6f 20 74 68 65   fail due to the
27040 20 6e 6f 6e 2d 64 65 74 65 72 6d 69 6e 69 73 74   non-determinist
27050 69 63 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  ic..        #   
27060 20 20 20 20 62 65 68 61 76 69 6f 72 20 6f 66 20      behavior of 
27070 74 68 65 20 43 4c 52 20 47 43 2c 20 65 76 65 6e  the CLR GC, even
27080 20 77 68 65 6e 20 74 68 65 72 65 20 69 73 20 6e   when there is n
27090 6f 20 62 75 67 20 69 6e 20 74 68 65 20 63 6f 64  o bug in the cod
270a0 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  e..        #    
270b0 20 20 20 62 65 69 6e 67 20 74 65 73 74 65 64 2e     being tested.
270c0 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
270d0 20 20 20 20 20 63 68 65 63 6b 46 6f 72 52 75 6e       checkForRun
270e0 74 69 6d 65 4f 70 74 69 6f 6e 20 24 3a 3a 74 65  timeOption $::te
270f0 73 74 5f 63 68 61 6e 6e 65 6c 20 6e 6f 50 6f 6f  st_channel noPoo
27100 6c 43 6f 75 6e 74 73 0d 0a 0d 0a 20 20 20 20 20  lCounts....     
27110 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
27120 4e 4f 54 45 3a 20 43 68 65 63 6b 20 69 66 20 74  NOTE: Check if t
27130 68 65 20 74 65 73 74 20 73 75 69 74 65 20 73 68  he test suite sh
27140 6f 75 6c 64 20 75 73 65 20 73 68 61 72 65 64 2d  ould use shared-
27150 63 61 63 68 65 20 6d 6f 64 65 2e 0d 0a 20 20 20  cache mode...   
27160 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
27170 63 68 65 63 6b 46 6f 72 52 75 6e 74 69 6d 65 4f  checkForRuntimeO
27180 70 74 69 6f 6e 20 24 3a 3a 74 65 73 74 5f 63 68  ption $::test_ch
27190 61 6e 6e 65 6c 20 73 68 61 72 65 64 43 61 63 68  annel sharedCach
271a0 65 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  e....        #..
271b0 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
271c0 52 65 70 6f 72 74 20 74 68 65 20 72 65 73 6f 75  Report the resou
271d0 72 63 65 20 75 73 61 67 65 20 70 72 69 6f 72 20  rce usage prior 
271e0 74 6f 20 72 75 6e 6e 69 6e 67 20 61 6e 79 20 74  to running any t
271f0 65 73 74 73 2e 0d 0a 20 20 20 20 20 20 20 20 23  ests...        #
27200 0d 0a 20 20 20 20 20 20 20 20 72 65 70 6f 72 74  ..        report
27210 53 51 4c 69 74 65 52 65 73 6f 75 72 63 65 73 20  SQLiteResources 
27220 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 0d  $::test_channel.
27230 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
27240 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 47 72        # NOTE: Gr
27250 61 62 20 74 68 65 20 6c 69 73 74 20 6f 66 20 6e  ab the list of n
27260 61 74 69 76 65 20 6d 6f 64 75 6c 65 73 20 66 6f  ative modules fo
27270 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 72  r the current pr
27280 6f 63 65 73 73 20 61 6e 64 0d 0a 20 20 20 20 20  ocess and..     
27290 20 20 20 23 20 20 20 20 20 20 20 72 65 70 6f 72     #       repor
272a0 74 20 6f 6e 20 74 68 65 20 53 79 73 74 65 6d 2e  t on the System.
272b0 44 61 74 61 2e 53 51 4c 69 74 65 20 72 65 6c 61  Data.SQLite rela
272c0 74 65 64 20 6f 6e 65 73 2e 0d 0a 20 20 20 20 20  ted ones...     
272d0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 69 66     #..        if
272e0 20 7b 5b 68 61 76 65 53 51 4c 69 74 65 4f 62 6a   {[haveSQLiteObj
272f0 65 63 74 43 6f 6d 6d 61 6e 64 5d 7d 20 74 68 65  ectCommand]} the
27300 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73  n {..          s
27310 65 74 20 6d 6f 64 75 6c 65 73 20 5b 6f 62 6a 65  et modules [obje
27320 63 74 20 69 6e 76 6f 6b 65 20 5c 0d 0a 20 20 20  ct invoke \..   
27330 20 20 20 20 20 20 20 20 20 20 20 53 79 73 74 65             Syste
27340 6d 2e 44 69 61 67 6e 6f 73 74 69 63 73 2e 50 72  m.Diagnostics.Pr
27350 6f 63 65 73 73 2e 47 65 74 43 75 72 72 65 6e 74  ocess.GetCurrent
27360 50 72 6f 63 65 73 73 20 4d 6f 64 75 6c 65 73 5d  Process Modules]
27370 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 6f 62  ....          ob
27380 6a 65 63 74 20 66 6f 72 65 61 63 68 20 2d 61 6c  ject foreach -al
27390 69 61 73 20 6d 6f 64 75 6c 65 20 24 6d 6f 64 75  ias module $modu
273a0 6c 65 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  les {..         
273b0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
273c0 20 20 23 20 4e 4f 54 45 3a 20 54 68 65 20 6d 6f    # NOTE: The mo
273d0 64 75 6c 65 20 66 69 6c 65 20 6e 61 6d 65 20 68  dule file name h
273e0 65 72 65 20 6d 75 73 74 20 62 65 20 6e 6f 72 6d  ere must be norm
273f0 61 6c 69 7a 65 64 2e 0d 0a 20 20 20 20 20 20 20  alized...       
27400 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
27410 20 20 20 20 73 65 74 20 66 69 6c 65 4e 61 6d 65      set fileName
27420 20 5b 66 69 6c 65 20 6e 6f 72 6d 61 6c 69 7a 65   [file normalize
27430 20 5b 24 6d 6f 64 75 6c 65 20 46 69 6c 65 4e 61   [$module FileNa
27440 6d 65 5d 5d 0d 0a 20 20 20 20 20 20 20 20 20 20  me]]..          
27450 20 20 73 65 74 20 66 69 6c 65 4e 61 6d 65 4f 6e    set fileNameOn
27460 6c 79 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 66  ly [file tail $f
27470 69 6c 65 4e 61 6d 65 5d 0d 0a 0d 0a 20 20 20 20  ileName]....    
27480 20 20 20 20 20 20 20 20 69 66 20 7b 5b 6c 73 65          if {[lse
27490 61 72 63 68 20 2d 65 78 61 63 74 20 2d 6e 6f 63  arch -exact -noc
274a0 61 73 65 20 2d 2d 20 5c 0d 0a 20 20 20 20 20 20  ase -- \..      
274b0 20 20 20 20 20 20 20 20 20 20 5b 67 65 74 4e 61            [getNa
274c0 74 69 76 65 4c 69 62 72 61 72 79 46 69 6c 65 4e  tiveLibraryFileN
274d0 61 6d 65 73 4f 6e 6c 79 5d 20 24 66 69 6c 65 4e  amesOnly] $fileN
274e0 61 6d 65 4f 6e 6c 79 5d 20 21 3d 20 2d 31 7d 20  ameOnly] != -1} 
274f0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
27500 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
27510 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70  est_channel [app
27520 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
27530 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d               "--
27540 2d 2d 20 66 6f 75 6e 64 20 6c 6f 61 64 65 64 20  -- found loaded 
27550 53 51 4c 69 74 65 20 6e 61 74 69 76 65 20 6c 69  SQLite native li
27560 62 72 61 72 79 20 6d 6f 64 75 6c 65 3a 20 22 20  brary module: " 
27570 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
27580 20 20 20 20 20 24 66 69 6c 65 4e 61 6d 65 20 5c       $fileName \
27590 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  n]..            
275a0 7d 20 65 6c 73 65 69 66 20 7b 5b 6c 73 65 61 72  } elseif {[lsear
275b0 63 68 20 2d 65 78 61 63 74 20 2d 6e 6f 63 61 73  ch -exact -nocas
275c0 65 20 2d 2d 20 5c 0d 0a 20 20 20 20 20 20 20 20  e -- \..        
275d0 20 20 20 20 20 20 20 20 5b 67 65 74 49 6e 74 65          [getInte
275e0 72 6f 70 41 73 73 65 6d 62 6c 79 46 69 6c 65 4e  ropAssemblyFileN
275f0 61 6d 65 73 4f 6e 6c 79 5d 20 24 66 69 6c 65 4e  amesOnly] $fileN
27600 61 6d 65 4f 6e 6c 79 5d 20 21 3d 20 2d 31 7d 20  ameOnly] != -1} 
27610 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
27620 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
27630 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70  est_channel [app
27640 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
27650 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d               "--
27660 2d 2d 20 66 6f 75 6e 64 20 6c 6f 61 64 65 64 20  -- found loaded 
27670 53 51 4c 69 74 65 20 69 6e 74 65 72 6f 70 20 61  SQLite interop a
27680 73 73 65 6d 62 6c 79 20 6d 6f 64 75 6c 65 3a 20  ssembly module: 
27690 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  " \..           
276a0 20 20 20 20 20 20 20 24 66 69 6c 65 4e 61 6d 65         $fileName
276b0 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20   \n]..          
276c0 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d    }..          }
276d0 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  ..        }.... 
276e0 20 20 20 20 20 20 20 63 61 74 63 68 20 7b 0d 0a         catch {..
276f0 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
27700 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
27710 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
27720 20 22 2d 2d 2d 2d 20 63 6f 6d 70 69 6c 65 2d 74   "---- compile-t
27730 69 6d 65 20 6f 70 74 69 6f 6e 73 20 66 6f 72 20  ime options for 
27740 53 51 4c 69 74 65 20 63 6f 72 65 20 6c 69 62 72  SQLite core libr
27750 61 72 79 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20  ary... "....    
27760 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68        if {[catch
27770 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
27780 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66  object invoke -f
27790 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20  lags +NonPublic 
277a0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
277b0 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53     System.Data.S
277c0 51 4c 69 74 65 2e 53 51 4c 69 74 65 33 20 53 51  QLite.SQLite3 SQ
277d0 4c 69 74 65 43 6f 6d 70 69 6c 65 4f 70 74 69 6f  LiteCompileOptio
277e0 6e 73 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 20  ns..          } 
277f0 63 6f 6d 70 69 6c 65 4f 70 74 69 6f 6e 73 5d 20  compileOptions] 
27800 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  == 0} then {..  
27810 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
27820 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
27830 5b 61 70 70 65 6e 64 41 72 67 73 20 5b 66 6f 72  [appendArgs [for
27840 6d 61 74 4c 69 73 74 20 5b 6c 73 6f 72 74 20 5c  matList [lsort \
27850 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
27860 20 20 24 63 6f 6d 70 69 6c 65 4f 70 74 69 6f 6e    $compileOption
27870 73 5d 20 3c 6e 6f 6e 65 3e 5d 20 5c 6e 5d 0d 0a  s] <none>] \n]..
27880 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65            } else
27890 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
278a0 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
278b0 61 6e 6e 65 6c 20 75 6e 6b 6e 6f 77 6e 5c 6e 0d  annel unknown\n.
278c0 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  .          }..  
278d0 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
278e0 20 20 20 63 61 74 63 68 20 7b 0d 0a 20 20 20 20     catch {..    
278f0 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
27900 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5c 0d 0a 20  est_channel \.. 
27910 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d               "--
27920 2d 2d 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20  -- compile-time 
27930 6f 70 74 69 6f 6e 73 20 66 6f 72 20 53 51 4c 69  options for SQLi
27940 74 65 20 69 6e 74 65 72 6f 70 20 61 73 73 65 6d  te interop assem
27950 62 6c 79 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20  bly... "....    
27960 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68        if {[catch
27970 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
27980 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66  object invoke -f
27990 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20  lags +NonPublic 
279a0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
279b0 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53     System.Data.S
279c0 51 4c 69 74 65 2e 53 51 4c 69 74 65 33 20 49 6e  QLite.SQLite3 In
279d0 74 65 72 6f 70 43 6f 6d 70 69 6c 65 4f 70 74 69  teropCompileOpti
279e0 6f 6e 73 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  ons..          }
279f0 20 63 6f 6d 70 69 6c 65 4f 70 74 69 6f 6e 73 5d   compileOptions]
27a00 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20   == 0} then {.. 
27a10 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
27a20 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
27a30 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5b 66 6f   [appendArgs [fo
27a40 72 6d 61 74 4c 69 73 74 20 5b 6c 73 6f 72 74 20  rmatList [lsort 
27a50 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
27a60 20 20 20 24 63 6f 6d 70 69 6c 65 4f 70 74 69 6f     $compileOptio
27a70 6e 73 5d 20 3c 6e 6f 6e 65 3e 5d 20 5c 6e 5d 0d  ns] <none>] \n].
27a80 0a 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73  .          } els
27a90 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e {..           
27aa0 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
27ab0 68 61 6e 6e 65 6c 20 75 6e 6b 6e 6f 77 6e 5c 6e  hannel unknown\n
27ac0 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20  ..          }.. 
27ad0 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
27ae0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
27af0 20 4e 4f 54 45 3a 20 53 68 6f 77 20 74 68 65 20   NOTE: Show the 
27b00 61 63 74 69 76 65 20 74 65 73 74 20 63 6f 6e 73  active test cons
27b10 74 72 61 69 6e 74 73 2e 0d 0a 20 20 20 20 20 20  traints...      
27b20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 74 70 75    #..        tpu
27b30 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
27b40 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 22  el [appendArgs "
27b50 2d 2d 2d 2d 20 63 6f 6e 73 74 72 61 69 6e 74 73  ---- constraints
27b60 3a 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  : " \..         
27b70 20 20 20 5b 66 6f 72 6d 61 74 4c 69 73 74 20 5b     [formatList [
27b80 6c 73 6f 72 74 20 5b 67 65 74 43 6f 6e 73 74 72  lsort [getConstr
27b90 61 69 6e 74 73 5d 5d 20 3c 6e 6f 6e 65 3e 5d 20  aints]] <none>] 
27ba0 5c 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23  \n]....        #
27bb0 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
27bc0 3a 20 53 61 76 65 20 74 68 65 20 74 65 73 74 20  : Save the test 
27bd0 63 6f 6e 73 74 72 61 69 6e 74 73 20 66 6f 72 20  constraints for 
27be0 75 73 65 20 62 79 20 74 68 72 65 61 64 73 20 63  use by threads c
27bf0 72 65 61 74 65 64 20 69 6e 20 74 68 69 73 0d 0a  reated in this..
27c00 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
27c10 61 70 70 6c 69 63 61 74 69 6f 6e 20 64 6f 6d 61  application doma
27c20 69 6e 2e 20 20 54 68 69 73 20 69 73 20 6e 65 63  in.  This is nec
27c30 65 73 73 61 72 79 20 62 65 63 61 75 73 65 20 61  essary because a
27c40 6c 6c 20 74 68 65 20 45 61 67 6c 65 0d 0a 20 20  ll the Eagle..  
27c50 20 20 20 20 20 20 23 20 20 20 20 20 20 20 22 74        #       "t
27c60 65 73 74 20 63 6f 6e 74 65 78 74 22 20 69 6e 66  est context" inf
27c70 6f 72 6d 61 74 69 6f 6e 20 69 73 20 70 65 72 2d  ormation is per-
27c80 74 68 72 65 61 64 2e 0d 0a 20 20 20 20 20 20 20  thread...       
27c90 20 23 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b   #..        if {
27ca0 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  ![info exists ::
27cb0 74 65 73 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73  test_constraints
27cc0 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
27cd0 20 20 20 20 20 73 65 74 20 3a 3a 74 65 73 74 5f       set ::test_
27ce0 63 6f 6e 73 74 72 61 69 6e 74 73 20 24 3a 3a 65  constraints $::e
27cf0 61 67 6c 65 5f 74 65 73 74 73 28 63 6f 6e 73 74  agle_tests(const
27d00 72 61 69 6e 74 73 29 0d 0a 20 20 20 20 20 20 20  raints)..       
27d10 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d   }....        #.
27d20 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
27d30 20 4c 6f 61 64 20 74 68 65 20 22 61 66 74 65 72   Load the "after
27d40 2d 63 6f 6e 73 74 72 61 69 6e 74 73 22 20 63 75  -constraints" cu
27d50 73 74 6f 6d 20 70 65 72 2d 75 73 65 72 20 61 6e  stom per-user an
27d60 64 2f 6f 72 20 70 65 72 2d 68 6f 73 74 0d 0a 20  d/or per-host.. 
27d70 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74         #       t
27d80 65 73 74 20 73 65 74 74 69 6e 67 73 20 6e 6f 77  est settings now
27d90 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
27da0 20 20 20 20 20 20 75 70 6c 65 76 65 6c 20 31 20        uplevel 1 
27db0 5b 6c 69 73 74 20 6c 6f 61 64 53 51 4c 69 74 65  [list loadSQLite
27dc0 54 65 73 74 53 65 74 74 69 6e 67 73 20 24 3a 3a  TestSettings $::
27dd0 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 2e 61 66  test_channel .af
27de0 74 65 72 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  ter]....        
27df0 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
27e00 45 3a 20 49 66 20 6e 65 63 65 73 73 61 72 79 2c  E: If necessary,
27e10 20 65 6e 61 62 6c 65 20 73 68 61 72 65 64 2d 63   enable shared-c
27e20 61 63 68 65 20 6d 6f 64 65 20 6e 6f 77 2e 0d 0a  ache mode now...
27e30 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
27e40 20 20 20 69 66 20 7b 5b 68 61 73 52 75 6e 74 69     if {[hasRunti
27e50 6d 65 4f 70 74 69 6f 6e 20 73 68 61 72 65 64 43  meOption sharedC
27e60 61 63 68 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  ache]} then {.. 
27e70 20 20 20 20 20 20 20 20 20 65 6e 61 62 6c 65 53           enableS
27e80 68 61 72 65 64 43 61 63 68 65 20 24 3a 3a 74 65  haredCache $::te
27e90 73 74 5f 63 68 61 6e 6e 65 6c 20 74 72 75 65 0d  st_channel true.
27ea0 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  .        }....  
27eb0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
27ec0 20 23 20 4e 4f 54 45 3a 20 53 68 6f 77 20 77 68   # NOTE: Show wh
27ed0 65 6e 20 6f 75 72 20 74 65 73 74 73 20 61 63 74  en our tests act
27ee0 75 61 6c 6c 79 20 62 65 67 61 6e 20 28 6e 6f 77  ually began (now
27ef0 29 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  )...        #.. 
27f00 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
27f10 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70  test_channel [ap
27f20 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
27f30 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 53 79          "---- Sy
27f40 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
27f50 20 74 65 73 74 73 20 62 65 67 61 6e 20 61 74 20   tests began at 
27f60 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  " \..           
27f70 20 5b 63 6c 6f 63 6b 20 66 6f 72 6d 61 74 20 5b   [clock format [
27f80 63 6c 6f 63 6b 20 73 65 63 6f 6e 64 73 5d 5d 20  clock seconds]] 
27f90 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20  \n]..      }..  
27fa0 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
27fb0 20 72 75 6e 53 51 4c 69 74 65 54 65 73 74 46 69   runSQLiteTestFi
27fc0 6c 65 73 50 72 6f 6c 6f 67 75 65 20 7b 7d 20 7b  lesPrologue {} {
27fd0 0d 0a 20 20 20 20 20 20 75 70 6c 65 76 65 6c 20  ..      uplevel 
27fe0 31 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  1 {..        #..
27ff0 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
28000 53 65 74 75 70 20 74 68 65 20 76 61 72 69 61 62  Setup the variab
28010 6c 65 73 20 74 68 61 74 20 72 65 66 65 72 20 74  les that refer t
28020 6f 20 74 68 65 20 76 61 72 69 6f 75 73 20 6e 6f  o the various no
28030 6e 2d 64 61 74 61 20 66 69 6c 65 73 0d 0a 20 20  n-data files..  
28040 20 20 20 20 20 20 23 20 20 20 20 20 20 20 72 65        #       re
28050 71 75 69 72 65 64 20 62 79 20 74 68 65 20 74 65  quired by the te
28060 73 74 73 20 69 6e 20 74 68 69 73 20 66 69 6c 65  sts in this file
28070 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
28080 20 20 20 20 20 20 73 65 74 20 65 6e 74 69 74 79        set entity
28090 46 72 61 6d 65 77 6f 72 6b 44 6c 6c 46 69 6c 65  FrameworkDllFile
280a0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
280b0 5b 67 65 74 42 75 69 6c 64 46 69 6c 65 4e 61 6d  [getBuildFileNam
280c0 65 20 45 6e 74 69 74 79 46 72 61 6d 65 77 6f 72  e EntityFramewor
280d0 6b 2e 64 6c 6c 20 66 61 6c 73 65 5d 0d 0a 0d 0a  k.dll false]....
280e0 20 20 20 20 20 20 20 20 73 65 74 20 69 6e 73 74          set inst
280f0 61 6c 6c 65 72 45 78 65 46 69 6c 65 20 5c 0d 0a  allerExeFile \..
28100 20 20 20 20 20 20 20 20 20 20 20 20 5b 67 65 74              [get
28110 42 75 69 6c 64 46 69 6c 65 4e 61 6d 65 20 49 6e  BuildFileName In
28120 73 74 61 6c 6c 65 72 2e 65 78 65 20 66 61 6c 73  staller.exe fals
28130 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 73 65  e]....        se
28140 74 20 73 71 6c 69 74 65 44 65 73 69 67 6e 65 72  t sqliteDesigner
28150 44 6c 6c 46 69 6c 65 20 5c 0d 0a 20 20 20 20 20  DllFile \..     
28160 20 20 20 20 20 20 20 5b 67 65 74 42 75 69 6c 64         [getBuild
28170 46 69 6c 65 4e 61 6d 65 20 53 51 4c 69 74 65 2e  FileName SQLite.
28180 44 65 73 69 67 6e 65 72 2e 64 6c 6c 20 66 61 6c  Designer.dll fal
28190 73 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 73  se]....        s
281a0 65 74 20 73 79 73 74 65 6d 44 61 74 61 53 51 4c  et systemDataSQL
281b0 69 74 65 44 6c 6c 46 69 6c 65 20 5c 0d 0a 20 20  iteDllFile \..  
281c0 20 20 20 20 20 20 20 20 20 20 5b 67 65 74 42 75            [getBu
281d0 69 6c 64 46 69 6c 65 4e 61 6d 65 20 53 79 73 74  ildFileName Syst
281e0 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 64  em.Data.SQLite.d
281f0 6c 6c 20 66 61 6c 73 65 5d 0d 0a 0d 0a 20 20 20  ll false]....   
28200 20 20 20 20 20 73 65 74 20 73 79 73 74 65 6d 44       set systemD
28210 61 74 61 53 51 4c 69 74 65 4c 69 6e 71 44 6c 6c  ataSQLiteLinqDll
28220 46 69 6c 65 20 5c 0d 0a 20 20 20 20 20 20 20 20  File \..        
28230 20 20 20 20 5b 67 65 74 42 75 69 6c 64 46 69 6c      [getBuildFil
28240 65 4e 61 6d 65 20 53 79 73 74 65 6d 2e 44 61 74  eName System.Dat
28250 61 2e 53 51 4c 69 74 65 2e 4c 69 6e 71 2e 64 6c  a.SQLite.Linq.dl
28260 6c 20 66 61 6c 73 65 5d 0d 0a 0d 0a 20 20 20 20  l false]....    
28270 20 20 20 20 73 65 74 20 73 79 73 74 65 6d 44 61      set systemDa
28280 74 61 53 51 4c 69 74 65 45 66 36 44 6c 6c 46 69  taSQLiteEf6DllFi
28290 6c 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  le \..          
282a0 20 20 5b 67 65 74 42 75 69 6c 64 46 69 6c 65 4e    [getBuildFileN
282b0 61 6d 65 20 53 79 73 74 65 6d 2e 44 61 74 61 2e  ame System.Data.
282c0 53 51 4c 69 74 65 2e 45 46 36 2e 64 6c 6c 20 66  SQLite.EF6.dll f
282d0 61 6c 73 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  alse]....       
282e0 20 73 65 74 20 74 65 73 74 45 78 65 46 69 6c 65   set testExeFile
282f0 20 5b 67 65 74 42 75 69 6c 64 46 69 6c 65 4e 61   [getBuildFileNa
28300 6d 65 20 74 65 73 74 2e 65 78 65 20 66 61 6c 73  me test.exe fals
28310 65 5d 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20  e]..        set 
28320 74 65 73 74 4c 69 6e 71 45 78 65 46 69 6c 65 20  testLinqExeFile 
28330 5b 67 65 74 42 75 69 6c 64 46 69 6c 65 4e 61 6d  [getBuildFileNam
28340 65 20 74 65 73 74 6c 69 6e 71 2e 65 78 65 20 66  e testlinq.exe f
28350 61 6c 73 65 5d 0d 0a 20 20 20 20 20 20 20 20 73  alse]..        s
28360 65 74 20 74 65 73 74 45 66 36 45 78 65 46 69 6c  et testEf6ExeFil
28370 65 20 5b 67 65 74 42 75 69 6c 64 46 69 6c 65 4e  e [getBuildFileN
28380 61 6d 65 20 74 65 73 74 65 66 36 2e 65 78 65 20  ame testef6.exe 
28390 66 61 6c 73 65 5d 0d 0a 0d 0a 20 20 20 20 20 20  false]....      
283a0 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
283b0 4f 54 45 3a 20 53 65 74 75 70 20 74 68 65 20 76  OTE: Setup the v
283c0 61 72 69 61 62 6c 65 73 20 74 68 61 74 20 72 65  ariables that re
283d0 66 65 72 20 74 6f 20 74 68 65 20 76 61 72 69 6f  fer to the vario
283e0 75 73 20 64 61 74 61 20 66 69 6c 65 73 0d 0a 20  us data files.. 
283f0 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 72         #       r
28400 65 71 75 69 72 65 64 20 62 79 20 74 68 65 20 74  equired by the t
28410 65 73 74 73 20 69 6e 20 74 68 69 73 20 66 69 6c  ests in this fil
28420 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  e...        #.. 
28430 20 20 20 20 20 20 20 73 65 74 20 74 65 73 74 4c         set testL
28440 69 6e 71 4f 75 74 46 69 6c 65 20 5b 66 69 6c 65  inqOutFile [file
28450 20 6e 61 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c   nativename [fil
28460 65 20 6a 6f 69 6e 20 5c 0d 0a 20 20 20 20 20 20  e join \..      
28470 20 20 20 20 20 20 5b 67 65 74 53 51 4c 69 74 65        [getSQLite
28480 54 65 73 74 44 61 74 61 50 61 74 68 5d 20 74 65  TestDataPath] te
28490 73 74 6c 69 6e 71 2e 6f 75 74 5d 5d 0d 0a 0d 0a  stlinq.out]]....
284a0 20 20 20 20 20 20 20 20 73 65 74 20 6e 6f 72 74          set nort
284b0 68 77 69 6e 64 45 66 44 62 46 69 6c 65 20 5b 66  hwindEfDbFile [f
284c0 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65 20 5b  ile nativename [
284d0 66 69 6c 65 20 6a 6f 69 6e 20 5c 0d 0a 20 20 20  file join \..   
284e0 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20 64           [file d
284f0 69 72 6e 61 6d 65 20 5b 66 69 6c 65 20 64 69 72  irname [file dir
28500 6e 61 6d 65 20 5b 67 65 74 53 51 4c 69 74 65 54  name [getSQLiteT
28510 65 73 74 44 61 74 61 50 61 74 68 5d 5d 5d 20 5c  estDataPath]]] \
28520 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 65  ..            te
28530 73 74 6c 69 6e 71 20 6e 6f 72 74 68 77 69 6e 64  stlinq northwind
28540 45 46 2e 64 62 5d 5d 0d 0a 0d 0a 20 20 20 20 20  EF.db]]....     
28550 20 20 20 73 65 74 20 6e 6f 6e 57 61 6c 44 62 46     set nonWalDbF
28560 69 6c 65 20 5b 66 69 6c 65 20 6e 61 74 69 76 65  ile [file native
28570 6e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20  name [file join 
28580 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b  \..            [
28590 67 65 74 53 51 4c 69 74 65 54 65 73 74 44 61 74  getSQLiteTestDat
285a0 61 50 61 74 68 5d 20 6e 6f 6e 57 61 6c 2e 64 62  aPath] nonWal.db
285b0 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 73 65  ]]....        se
285c0 74 20 77 61 6c 44 62 46 69 6c 65 20 5b 66 69 6c  t walDbFile [fil
285d0 65 20 6e 61 74 69 76 65 6e 61 6d 65 20 5b 66 69  e nativename [fi
285e0 6c 65 20 6a 6f 69 6e 20 5c 0d 0a 20 20 20 20 20  le join \..     
285f0 20 20 20 20 20 20 20 5b 67 65 74 53 51 4c 69 74         [getSQLit
28600 65 54 65 73 74 44 61 74 61 50 61 74 68 5d 20 77  eTestDataPath] w
28610 61 6c 2e 64 62 5d 5d 0d 0a 0d 0a 20 20 20 20 20  al.db]]....     
28620 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
28630 4e 4f 54 45 3a 20 54 68 65 20 76 61 72 69 6f 75  NOTE: The variou
28640 73 20 69 6e 73 74 61 6c 6c 2f 75 6e 69 6e 73 74  s install/uninst
28650 61 6c 6c 20 6c 6f 67 20 66 69 6c 65 73 20 75 73  all log files us
28660 65 64 20 74 6f 20 74 65 73 74 20 74 68 65 0d 0a  ed to test the..
28670 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
28680 64 65 73 69 67 6e 2d 74 69 6d 65 20 63 6f 6d 70  design-time comp
28690 6f 6e 65 6e 74 20 69 6e 73 74 61 6c 6c 65 72 2e  onent installer.
286a0 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
286b0 20 20 20 20 20 73 65 74 20 74 65 73 74 49 6e 73       set testIns
286c0 74 61 6c 6c 56 73 32 30 30 35 4c 6f 67 46 69 6c  tallVs2005LogFil
286d0 65 20 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e 61  e [file nativena
286e0 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5c 0d  me [file join \.
286f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 67 65  .            [ge
28700 74 53 51 4c 69 74 65 54 65 73 74 44 61 74 61 50  tSQLiteTestDataP
28710 61 74 68 5d 20 49 6e 73 74 61 6c 6c 65 72 5f 54  ath] Installer_T
28720 65 73 74 5f 56 73 32 30 30 35 2e 6c 6f 67 5d 5d  est_Vs2005.log]]
28730 0d 0a 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20  ....        set 
28740 74 65 73 74 49 6e 73 74 61 6c 6c 56 73 32 30 30  testInstallVs200
28750 38 4c 6f 67 46 69 6c 65 20 5b 66 69 6c 65 20 6e  8LogFile [file n
28760 61 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c 65 20  ativename [file 
28770 6a 6f 69 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20  join \..        
28780 20 20 20 20 5b 67 65 74 53 51 4c 69 74 65 54 65      [getSQLiteTe
28790 73 74 44 61 74 61 50 61 74 68 5d 20 49 6e 73 74  stDataPath] Inst
287a0 61 6c 6c 65 72 5f 54 65 73 74 5f 56 73 32 30 30  aller_Test_Vs200
287b0 38 2e 6c 6f 67 5d 5d 0d 0a 0d 0a 20 20 20 20 20  8.log]]....     
287c0 20 20 20 73 65 74 20 74 65 73 74 49 6e 73 74 61     set testInsta
287d0 6c 6c 56 73 32 30 31 30 4c 6f 67 46 69 6c 65 20  llVs2010LogFile 
287e0 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65  [file nativename
287f0 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5c 0d 0a 20   [file join \.. 
28800 20 20 20 20 20 20 20 20 20 20 20 5b 67 65 74 53             [getS
28810 51 4c 69 74 65 54 65 73 74 44 61 74 61 50 61 74  QLiteTestDataPat
28820 68 5d 20 49 6e 73 74 61 6c 6c 65 72 5f 54 65 73  h] Installer_Tes
28830 74 5f 56 73 32 30 31 30 2e 6c 6f 67 5d 5d 0d 0a  t_Vs2010.log]]..
28840 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 74 65  ..        set te
28850 73 74 49 6e 73 74 61 6c 6c 56 73 32 30 31 32 4c  stInstallVs2012L
28860 6f 67 46 69 6c 65 20 5b 66 69 6c 65 20 6e 61 74  ogFile [file nat
28870 69 76 65 6e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f  ivename [file jo
28880 69 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  in \..          
28890 20 20 5b 67 65 74 53 51 4c 69 74 65 54 65 73 74    [getSQLiteTest
288a0 44 61 74 61 50 61 74 68 5d 20 49 6e 73 74 61 6c  DataPath] Instal
288b0 6c 65 72 5f 54 65 73 74 5f 56 73 32 30 31 32 2e  ler_Test_Vs2012.
288c0 6c 6f 67 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  log]]....       
288d0 20 73 65 74 20 74 65 73 74 49 6e 73 74 61 6c 6c   set testInstall
288e0 56 73 32 30 31 33 4c 6f 67 46 69 6c 65 20 5b 66  Vs2013LogFile [f
288f0 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65 20 5b  ile nativename [
28900 66 69 6c 65 20 6a 6f 69 6e 20 5c 0d 0a 20 20 20  file join \..   
28910 20 20 20 20 20 20 20 20 20 5b 67 65 74 53 51 4c           [getSQL
28920 69 74 65 54 65 73 74 44 61 74 61 50 61 74 68 5d  iteTestDataPath]
28930 20 49 6e 73 74 61 6c 6c 65 72 5f 54 65 73 74 5f   Installer_Test_
28940 56 73 32 30 31 33 2e 6c 6f 67 5d 5d 0d 0a 0d 0a  Vs2013.log]]....
28950 20 20 20 20 20 20 20 20 73 65 74 20 74 65 73 74          set test
28960 49 6e 73 74 61 6c 6c 56 73 32 30 31 35 4c 6f 67  InstallVs2015Log
28970 46 69 6c 65 20 5b 66 69 6c 65 20 6e 61 74 69 76  File [file nativ
28980 65 6e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e  ename [file join
28990 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
289a0 5b 67 65 74 53 51 4c 69 74 65 54 65 73 74 44 61  [getSQLiteTestDa
289b0 74 61 50 61 74 68 5d 20 49 6e 73 74 61 6c 6c 65  taPath] Installe
289c0 72 5f 54 65 73 74 5f 56 73 32 30 31 35 2e 6c 6f  r_Test_Vs2015.lo
289d0 67 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 73  g]]....        s
289e0 65 74 20 74 65 73 74 55 6e 69 6e 73 74 61 6c 6c  et testUninstall
289f0 56 73 32 30 30 35 4c 6f 67 46 69 6c 65 20 5b 66  Vs2005LogFile [f
28a00 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65 20 5b  ile nativename [
28a10 66 69 6c 65 20 6a 6f 69 6e 20 5c 0d 0a 20 20 20  file join \..   
28a20 20 20 20 20 20 20 20 20 20 5b 67 65 74 53 51 4c           [getSQL
28a30 69 74 65 54 65 73 74 44 61 74 61 50 61 74 68 5d  iteTestDataPath]
28a40 20 55 6e 69 6e 73 74 61 6c 6c 65 72 5f 54 65 73   Uninstaller_Tes
28a50 74 5f 56 73 32 30 30 35 2e 6c 6f 67 5d 5d 0d 0a  t_Vs2005.log]]..
28a60 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 74 65  ..        set te
28a70 73 74 55 6e 69 6e 73 74 61 6c 6c 56 73 32 30 30  stUninstallVs200
28a80 38 4c 6f 67 46 69 6c 65 20 5b 66 69 6c 65 20 6e  8LogFile [file n
28a90 61 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c 65 20  ativename [file 
28aa0 6a 6f 69 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20  join \..        
28ab0 20 20 20 20 5b 67 65 74 53 51 4c 69 74 65 54 65      [getSQLiteTe
28ac0 73 74 44 61 74 61 50 61 74 68 5d 20 55 6e 69 6e  stDataPath] Unin
28ad0 73 74 61 6c 6c 65 72 5f 54 65 73 74 5f 56 73 32  staller_Test_Vs2
28ae0 30 30 38 2e 6c 6f 67 5d 5d 0d 0a 0d 0a 20 20 20  008.log]]....   
28af0 20 20 20 20 20 73 65 74 20 74 65 73 74 55 6e 69       set testUni
28b00 6e 73 74 61 6c 6c 56 73 32 30 31 30 4c 6f 67 46  nstallVs2010LogF
28b10 69 6c 65 20 5b 66 69 6c 65 20 6e 61 74 69 76 65  ile [file native
28b20 6e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20  name [file join 
28b30 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b  \..            [
28b40 67 65 74 53 51 4c 69 74 65 54 65 73 74 44 61 74  getSQLiteTestDat
28b50 61 50 61 74 68 5d 20 55 6e 69 6e 73 74 61 6c 6c  aPath] Uninstall
28b60 65 72 5f 54 65 73 74 5f 56 73 32 30 31 30 2e 6c  er_Test_Vs2010.l
28b70 6f 67 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  og]]....        
28b80 73 65 74 20 74 65 73 74 55 6e 69 6e 73 74 61 6c  set testUninstal
28b90 6c 56 73 32 30 31 32 4c 6f 67 46 69 6c 65 20 5b  lVs2012LogFile [
28ba0 66 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65 20  file nativename 
28bb0 5b 66 69 6c 65 20 6a 6f 69 6e 20 5c 0d 0a 20 20  [file join \..  
28bc0 20 20 20 20 20 20 20 20 20 20 5b 67 65 74 53 51            [getSQ
28bd0 4c 69 74 65 54 65 73 74 44 61 74 61 50 61 74 68  LiteTestDataPath
28be0 5d 20 55 6e 69 6e 73 74 61 6c 6c 65 72 5f 54 65  ] Uninstaller_Te
28bf0 73 74 5f 56 73 32 30 31 32 2e 6c 6f 67 5d 5d 0d  st_Vs2012.log]].
28c00 0a 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 74  ...        set t
28c10 65 73 74 55 6e 69 6e 73 74 61 6c 6c 56 73 32 30  estUninstallVs20
28c20 31 33 4c 6f 67 46 69 6c 65 20 5b 66 69 6c 65 20  13LogFile [file 
28c30 6e 61 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c 65  nativename [file
28c40 20 6a 6f 69 6e 20 5c 0d 0a 20 20 20 20 20 20 20   join \..       
28c50 20 20 20 20 20 5b 67 65 74 53 51 4c 69 74 65 54       [getSQLiteT
28c60 65 73 74 44 61 74 61 50 61 74 68 5d 20 55 6e 69  estDataPath] Uni
28c70 6e 73 74 61 6c 6c 65 72 5f 54 65 73 74 5f 56 73  nstaller_Test_Vs
28c80 32 30 31 33 2e 6c 6f 67 5d 5d 0d 0a 0d 0a 20 20  2013.log]]....  
28c90 20 20 20 20 20 20 73 65 74 20 74 65 73 74 55 6e        set testUn
28ca0 69 6e 73 74 61 6c 6c 56 73 32 30 31 35 4c 6f 67  installVs2015Log
28cb0 46 69 6c 65 20 5b 66 69 6c 65 20 6e 61 74 69 76  File [file nativ
28cc0 65 6e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e  ename [file join
28cd0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
28ce0 5b 67 65 74 53 51 4c 69 74 65 54 65 73 74 44 61  [getSQLiteTestDa
28cf0 74 61 50 61 74 68 5d 20 55 6e 69 6e 73 74 61 6c  taPath] Uninstal
28d00 6c 65 72 5f 54 65 73 74 5f 56 73 32 30 31 35 2e  ler_Test_Vs2015.
28d10 6c 6f 67 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  log]]....       
28d20 20 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23   ###############
28d30 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
28d40 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
28d50 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
28d60 23 23 23 23 23 23 23 23 0d 0a 0d 0a 20 20 20 20  ########....    
28d70 20 20 20 20 69 66 20 7b 21 5b 68 61 76 65 43 6f      if {![haveCo
28d80 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64  nstraint [append
28d90 41 72 67 73 20 66 69 6c 65 5f 20 5c 0d 0a 20 20  Args file_ \..  
28da0 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20            [file 
28db0 74 61 69 6c 20 24 65 6e 74 69 74 79 46 72 61 6d  tail $entityFram
28dc0 65 77 6f 72 6b 44 6c 6c 46 69 6c 65 5d 5d 5d 7d  eworkDllFile]]]}
28dd0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
28de0 20 20 20 63 68 65 63 6b 46 6f 72 46 69 6c 65 20     checkForFile 
28df0 24 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 24 65  $test_channel $e
28e00 6e 74 69 74 79 46 72 61 6d 65 77 6f 72 6b 44 6c  ntityFrameworkDl
28e10 6c 46 69 6c 65 0d 0a 20 20 20 20 20 20 20 20 7d  lFile..        }
28e20 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b  ....        if {
28e30 21 5b 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74  ![haveConstraint
28e40 20 5b 61 70 70 65 6e 64 41 72 67 73 20 66 69 6c   [appendArgs fil
28e50 65 5f 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  e_ \..          
28e60 20 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 69 6e    [file tail $in
28e70 73 74 61 6c 6c 65 72 45 78 65 46 69 6c 65 5d 5d  stallerExeFile]]
28e80 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
28e90 20 20 20 20 20 63 68 65 63 6b 46 6f 72 46 69 6c       checkForFil
28ea0 65 20 24 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  e $test_channel 
28eb0 24 69 6e 73 74 61 6c 6c 65 72 45 78 65 46 69 6c  $installerExeFil
28ec0 65 20 49 6e 73 74 61 6c 6c 65 72 2e 65 78 65 0d  e Installer.exe.
28ed0 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  .        }....  
28ee0 20 20 20 20 20 20 69 66 20 7b 21 5b 68 61 76 65        if {![have
28ef0 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65  Constraint [appe
28f00 6e 64 41 72 67 73 20 66 69 6c 65 5f 20 5c 0d 0a  ndArgs file_ \..
28f10 20 20 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c              [fil
28f20 65 20 74 61 69 6c 20 24 73 71 6c 69 74 65 44 65  e tail $sqliteDe
28f30 73 69 67 6e 65 72 44 6c 6c 46 69 6c 65 5d 5d 5d  signerDllFile]]]
28f40 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
28f50 20 20 20 20 63 68 65 63 6b 46 6f 72 46 69 6c 65      checkForFile
28f60 20 24 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 24   $test_channel $
28f70 73 71 6c 69 74 65 44 65 73 69 67 6e 65 72 44 6c  sqliteDesignerDl
28f80 6c 46 69 6c 65 0d 0a 20 20 20 20 20 20 20 20 7d  lFile..        }
28f90 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b  ....        if {
28fa0 21 5b 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74  ![haveConstraint
28fb0 20 5b 61 70 70 65 6e 64 41 72 67 73 20 66 69 6c   [appendArgs fil
28fc0 65 5f 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  e_ \..          
28fd0 20 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 73 79    [file tail $sy
28fe0 73 74 65 6d 44 61 74 61 53 51 4c 69 74 65 44 6c  stemDataSQLiteDl
28ff0 6c 46 69 6c 65 5d 5d 5d 7d 20 74 68 65 6e 20 7b  lFile]]]} then {
29000 0d 0a 20 20 20 20 20 20 20 20 20 20 63 68 65 63  ..          chec
29010 6b 46 6f 72 46 69 6c 65 20 24 74 65 73 74 5f 63  kForFile $test_c
29020 68 61 6e 6e 65 6c 20 24 73 79 73 74 65 6d 44 61  hannel $systemDa
29030 74 61 53 51 4c 69 74 65 44 6c 6c 46 69 6c 65 0d  taSQLiteDllFile.
29040 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  .        }....  
29050 20 20 20 20 20 20 69 66 20 7b 21 5b 68 61 76 65        if {![have
29060 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65  Constraint [appe
29070 6e 64 41 72 67 73 20 66 69 6c 65 5f 20 5c 0d 0a  ndArgs file_ \..
29080 20 20 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c              [fil
29090 65 20 74 61 69 6c 20 24 73 79 73 74 65 6d 44 61  e tail $systemDa
290a0 74 61 53 51 4c 69 74 65 4c 69 6e 71 44 6c 6c 46  taSQLiteLinqDllF
290b0 69 6c 65 5d 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a  ile]]]} then {..
290c0 20 20 20 20 20 20 20 20 20 20 63 68 65 63 6b 46            checkF
290d0 6f 72 46 69 6c 65 20 24 74 65 73 74 5f 63 68 61  orFile $test_cha
290e0 6e 6e 65 6c 20 24 73 79 73 74 65 6d 44 61 74 61  nnel $systemData
290f0 53 51 4c 69 74 65 4c 69 6e 71 44 6c 6c 46 69 6c  SQLiteLinqDllFil
29100 65 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  e..        }....
29110 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 68 61          if {![ha
29120 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70  veConstraint [ap
29130 70 65 6e 64 41 72 67 73 20 66 69 6c 65 5f 20 5c  pendArgs file_ \
29140 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 66  ..            [f
29150 69 6c 65 20 74 61 69 6c 20 24 73 79 73 74 65 6d  ile tail $system
29160 44 61 74 61 53 51 4c 69 74 65 45 66 36 44 6c 6c  DataSQLiteEf6Dll
29170 46 69 6c 65 5d 5d 5d 7d 20 74 68 65 6e 20 7b 0d  File]]]} then {.
29180 0a 20 20 20 20 20 20 20 20 20 20 63 68 65 63 6b  .          check
29190 46 6f 72 46 69 6c 65 20 24 74 65 73 74 5f 63 68  ForFile $test_ch
291a0 61 6e 6e 65 6c 20 24 73 79 73 74 65 6d 44 61 74  annel $systemDat
291b0 61 53 51 4c 69 74 65 45 66 36 44 6c 6c 46 69 6c  aSQLiteEf6DllFil
291c0 65 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  e..        }....
291d0 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 68 61          if {![ha
291e0 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70  veConstraint [ap
291f0 70 65 6e 64 41 72 67 73 20 66 69 6c 65 5f 20 5c  pendArgs file_ \
29200 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 66  ..            [f
29210 69 6c 65 20 74 61 69 6c 20 24 74 65 73 74 45 78  ile tail $testEx
29220 65 46 69 6c 65 5d 5d 5d 7d 20 74 68 65 6e 20 7b  eFile]]]} then {
29230 0d 0a 20 20 20 20 20 20 20 20 20 20 63 68 65 63  ..          chec
29240 6b 46 6f 72 46 69 6c 65 20 24 74 65 73 74 5f 63  kForFile $test_c
29250 68 61 6e 6e 65 6c 20 24 74 65 73 74 45 78 65 46  hannel $testExeF
29260 69 6c 65 20 74 65 73 74 2e 65 78 65 0d 0a 20 20  ile test.exe..  
29270 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
29280 20 20 20 69 66 20 7b 21 5b 68 61 76 65 43 6f 6e     if {![haveCon
29290 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41  straint [appendA
292a0 72 67 73 20 66 69 6c 65 5f 20 5c 0d 0a 20 20 20  rgs file_ \..   
292b0 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20 74           [file t
292c0 61 69 6c 20 24 74 65 73 74 4c 69 6e 71 45 78 65  ail $testLinqExe
292d0 46 69 6c 65 5d 5d 5d 7d 20 74 68 65 6e 20 7b 0d  File]]]} then {.
292e0 0a 20 20 20 20 20 20 20 20 20 20 63 68 65 63 6b  .          check
292f0 46 6f 72 46 69 6c 65 20 24 74 65 73 74 5f 63 68  ForFile $test_ch
29300 61 6e 6e 65 6c 20 24 74 65 73 74 4c 69 6e 71 45  annel $testLinqE
29310 78 65 46 69 6c 65 20 74 65 73 74 6c 69 6e 71 2e  xeFile testlinq.
29320 65 78 65 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  exe..        }..
29330 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b  ..        if {![
29340 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b  haveConstraint [
29350 61 70 70 65 6e 64 41 72 67 73 20 66 69 6c 65 5f  appendArgs file_
29360 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
29370 5b 66 69 6c 65 20 74 61 69 6c 20 24 74 65 73 74  [file tail $test
29380 45 66 36 45 78 65 46 69 6c 65 5d 5d 5d 7d 20 74  Ef6ExeFile]]]} t
29390 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
293a0 20 63 68 65 63 6b 46 6f 72 46 69 6c 65 20 24 74   checkForFile $t
293b0 65 73 74 5f 63 68 61 6e 6e 65 6c 20 24 74 65 73  est_channel $tes
293c0 74 45 66 36 45 78 65 46 69 6c 65 20 74 65 73 74  tEf6ExeFile test
293d0 65 66 36 2e 65 78 65 0d 0a 20 20 20 20 20 20 20  ef6.exe..       
293e0 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66   }....        if
293f0 20 7b 21 5b 68 61 76 65 43 6f 6e 73 74 72 61 69   {![haveConstrai
29400 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20 66  nt [appendArgs f
29410 69 6c 65 5f 20 5c 0d 0a 20 20 20 20 20 20 20 20  ile_ \..        
29420 20 20 20 20 5b 66 69 6c 65 20 74 61 69 6c 20 24      [file tail $
29430 74 65 73 74 4c 69 6e 71 4f 75 74 46 69 6c 65 5d  testLinqOutFile]
29440 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  ]]} then {..    
29450 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72 46 69        checkForFi
29460 6c 65 20 24 74 65 73 74 5f 63 68 61 6e 6e 65 6c  le $test_channel
29470 20 24 74 65 73 74 4c 69 6e 71 4f 75 74 46 69 6c   $testLinqOutFil
29480 65 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  e..        }....
29490 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 68 61          if {![ha
294a0 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70  veConstraint [ap
294b0 70 65 6e 64 41 72 67 73 20 66 69 6c 65 5f 20 5c  pendArgs file_ \
294c0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 66  ..            [f
294d0 69 6c 65 20 74 61 69 6c 20 24 6e 6f 72 74 68 77  ile tail $northw
294e0 69 6e 64 45 66 44 62 46 69 6c 65 5d 5d 5d 7d 20  indEfDbFile]]]} 
294f0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
29500 20 20 63 68 65 63 6b 46 6f 72 46 69 6c 65 20 24    checkForFile $
29510 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 24 6e 6f  test_channel $no
29520 72 74 68 77 69 6e 64 45 66 44 62 46 69 6c 65 0d  rthwindEfDbFile.
29530 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  .        }....  
29540 20 20 20 20 20 20 69 66 20 7b 21 5b 68 61 76 65        if {![have
29550 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65  Constraint [appe
29560 6e 64 41 72 67 73 20 66 69 6c 65 5f 20 5c 0d 0a  ndArgs file_ \..
29570 20 20 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c              [fil
29580 65 20 74 61 69 6c 20 24 6e 6f 6e 57 61 6c 44 62  e tail $nonWalDb
29590 46 69 6c 65 5d 5d 5d 7d 20 74 68 65 6e 20 7b 0d  File]]]} then {.
295a0 0a 20 20 20 20 20 20 20 20 20 20 63 68 65 63 6b  .          check
295b0 46 6f 72 46 69 6c 65 20 24 74 65 73 74 5f 63 68  ForFile $test_ch
295c0 61 6e 6e 65 6c 20 24 6e 6f 6e 57 61 6c 44 62 46  annel $nonWalDbF
295d0 69 6c 65 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  ile..        }..
295e0 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b  ..        if {![
295f0 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b  haveConstraint [
29600 61 70 70 65 6e 64 41 72 67 73 20 66 69 6c 65 5f  appendArgs file_
29610 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
29620 5b 66 69 6c 65 20 74 61 69 6c 20 24 77 61 6c 44  [file tail $walD
29630 62 46 69 6c 65 5d 5d 5d 7d 20 74 68 65 6e 20 7b  bFile]]]} then {
29640 0d 0a 20 20 20 20 20 20 20 20 20 20 63 68 65 63  ..          chec
29650 6b 46 6f 72 46 69 6c 65 20 24 74 65 73 74 5f 63  kForFile $test_c
29660 68 61 6e 6e 65 6c 20 24 77 61 6c 44 62 46 69 6c  hannel $walDbFil
29670 65 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  e..        }....
29680 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 68 61          if {![ha
29690 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70  veConstraint [ap
296a0 70 65 6e 64 41 72 67 73 20 66 69 6c 65 5f 20 5c  pendArgs file_ \
296b0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 66  ..            [f
296c0 69 6c 65 20 74 61 69 6c 20 24 74 65 73 74 49 6e  ile tail $testIn
296d0 73 74 61 6c 6c 56 73 32 30 30 35 4c 6f 67 46 69  stallVs2005LogFi
296e0 6c 65 5d 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  le]]]} then {.. 
296f0 20 20 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f           checkFo
29700 72 46 69 6c 65 20 24 74 65 73 74 5f 63 68 61 6e  rFile $test_chan
29710 6e 65 6c 20 24 74 65 73 74 49 6e 73 74 61 6c 6c  nel $testInstall
29720 56 73 32 30 30 35 4c 6f 67 46 69 6c 65 0d 0a 20  Vs2005LogFile.. 
29730 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
29740 20 20 20 20 69 66 20 7b 21 5b 68 61 76 65 43 6f      if {![haveCo
29750 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64  nstraint [append
29760 41 72 67 73 20 66 69 6c 65 5f 20 5c 0d 0a 20 20  Args file_ \..  
29770 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20            [file 
29780 74 61 69 6c 20 24 74 65 73 74 49 6e 73 74 61 6c  tail $testInstal
29790 6c 56 73 32 30 30 38 4c 6f 67 46 69 6c 65 5d 5d  lVs2008LogFile]]
297a0 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
297b0 20 20 20 20 20 63 68 65 63 6b 46 6f 72 46 69 6c       checkForFil
297c0 65 20 24 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  e $test_channel 
297d0 24 74 65 73 74 49 6e 73 74 61 6c 6c 56 73 32 30  $testInstallVs20
297e0 30 38 4c 6f 67 46 69 6c 65 0d 0a 20 20 20 20 20  08LogFile..     
297f0 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
29800 69 66 20 7b 21 5b 68 61 76 65 43 6f 6e 73 74 72  if {![haveConstr
29810 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73  aint [appendArgs
29820 20 66 69 6c 65 5f 20 5c 0d 0a 20 20 20 20 20 20   file_ \..      
29830 20 20 20 20 20 20 5b 66 69 6c 65 20 74 61 69 6c        [file tail
29840 20 24 74 65 73 74 49 6e 73 74 61 6c 6c 56 73 32   $testInstallVs2
29850 30 31 30 4c 6f 67 46 69 6c 65 5d 5d 5d 7d 20 74  010LogFile]]]} t
29860 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
29870 20 63 68 65 63 6b 46 6f 72 46 69 6c 65 20 24 74   checkForFile $t
29880 65 73 74 5f 63 68 61 6e 6e 65 6c 20 24 74 65 73  est_channel $tes
29890 74 49 6e 73 74 61 6c 6c 56 73 32 30 31 30 4c 6f  tInstallVs2010Lo
298a0 67 46 69 6c 65 0d 0a 20 20 20 20 20 20 20 20 7d  gFile..        }
298b0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b  ....        if {
298c0 21 5b 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74  ![haveConstraint
298d0 20 5b 61 70 70 65 6e 64 41 72 67 73 20 66 69 6c   [appendArgs fil
298e0 65 5f 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  e_ \..          
298f0 20 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 74 65    [file tail $te
29900 73 74 49 6e 73 74 61 6c 6c 56 73 32 30 31 32 4c  stInstallVs2012L
29910 6f 67 46 69 6c 65 5d 5d 5d 7d 20 74 68 65 6e 20  ogFile]]]} then 
29920 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 63 68 65  {..          che
29930 63 6b 46 6f 72 46 69 6c 65 20 24 74 65 73 74 5f  ckForFile $test_
29940 63 68 61 6e 6e 65 6c 20 24 74 65 73 74 49 6e 73  channel $testIns
29950 74 61 6c 6c 56 73 32 30 31 32 4c 6f 67 46 69 6c  tallVs2012LogFil
29960 65 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  e..        }....
29970 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 68 61          if {![ha
29980 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70  veConstraint [ap
29990 70 65 6e 64 41 72 67 73 20 66 69 6c 65 5f 20 5c  pendArgs file_ \
299a0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 66  ..            [f
299b0 69 6c 65 20 74 61 69 6c 20 24 74 65 73 74 49 6e  ile tail $testIn
299c0 73 74 61 6c 6c 56 73 32 30 31 33 4c 6f 67 46 69  stallVs2013LogFi
299d0 6c 65 5d 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  le]]]} then {.. 
299e0 20 20 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f           checkFo
299f0 72 46 69 6c 65 20 24 74 65 73 74 5f 63 68 61 6e  rFile $test_chan
29a00 6e 65 6c 20 24 74 65 73 74 49 6e 73 74 61 6c 6c  nel $testInstall
29a10 56 73 32 30 31 33 4c 6f 67 46 69 6c 65 0d 0a 20  Vs2013LogFile.. 
29a20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
29a30 20 20 20 20 69 66 20 7b 21 5b 68 61 76 65 43 6f      if {![haveCo
29a40 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64  nstraint [append
29a50 41 72 67 73 20 66 69 6c 65 5f 20 5c 0d 0a 20 20  Args file_ \..  
29a60 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20            [file 
29a70 74 61 69 6c 20 24 74 65 73 74 49 6e 73 74 61 6c  tail $testInstal
29a80 6c 56 73 32 30 31 35 4c 6f 67 46 69 6c 65 5d 5d  lVs2015LogFile]]
29a90 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
29aa0 20 20 20 20 20 63 68 65 63 6b 46 6f 72 46 69 6c       checkForFil
29ab0 65 20 24 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  e $test_channel 
29ac0 24 74 65 73 74 49 6e 73 74 61 6c 6c 56 73 32 30  $testInstallVs20
29ad0 31 35 4c 6f 67 46 69 6c 65 0d 0a 20 20 20 20 20  15LogFile..     
29ae0 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
29af0 69 66 20 7b 21 5b 68 61 76 65 43 6f 6e 73 74 72  if {![haveConstr
29b00 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73  aint [appendArgs
29b10 20 66 69 6c 65 5f 20 5c 0d 0a 20 20 20 20 20 20   file_ \..      
29b20 20 20 20 20 20 20 5b 66 69 6c 65 20 74 61 69 6c        [file tail
29b30 20 24 74 65 73 74 55 6e 69 6e 73 74 61 6c 6c 56   $testUninstallV
29b40 73 32 30 30 35 4c 6f 67 46 69 6c 65 5d 5d 5d 7d  s2005LogFile]]]}
29b50 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
29b60 20 20 20 63 68 65 63 6b 46 6f 72 46 69 6c 65 20     checkForFile 
29b70 24 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 24 74  $test_channel $t
29b80 65 73 74 55 6e 69 6e 73 74 61 6c 6c 56 73 32 30  estUninstallVs20
29b90 30 35 4c 6f 67 46 69 6c 65 0d 0a 20 20 20 20 20  05LogFile..     
29ba0 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
29bb0 69 66 20 7b 21 5b 68 61 76 65 43 6f 6e 73 74 72  if {![haveConstr
29bc0 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73  aint [appendArgs
29bd0 20 66 69 6c 65 5f 20 5c 0d 0a 20 20 20 20 20 20   file_ \..      
29be0 20 20 20 20 20 20 5b 66 69 6c 65 20 74 61 69 6c        [file tail
29bf0 20 24 74 65 73 74 55 6e 69 6e 73 74 61 6c 6c 56   $testUninstallV
29c00 73 32 30 30 38 4c 6f 67 46 69 6c 65 5d 5d 5d 7d  s2008LogFile]]]}
29c10 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
29c20 20 20 20 63 68 65 63 6b 46 6f 72 46 69 6c 65 20     checkForFile 
29c30 24 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 24 74  $test_channel $t
29c40 65 73 74 55 6e 69 6e 73 74 61 6c 6c 56 73 32 30  estUninstallVs20
29c50 30 38 4c 6f 67 46 69 6c 65 0d 0a 20 20 20 20 20  08LogFile..     
29c60 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
29c70 69 66 20 7b 21 5b 68 61 76 65 43 6f 6e 73 74 72  if {![haveConstr
29c80 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73  aint [appendArgs
29c90 20 66 69 6c 65 5f 20 5c 0d 0a 20 20 20 20 20 20   file_ \..      
29ca0 20 20 20 20 20 20 5b 66 69 6c 65 20 74 61 69 6c        [file tail
29cb0 20 24 74 65 73 74 55 6e 69 6e 73 74 61 6c 6c 56   $testUninstallV
29cc0 73 32 30 31 30 4c 6f 67 46 69 6c 65 5d 5d 5d 7d  s2010LogFile]]]}
29cd0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
29ce0 20 20 20 63 68 65 63 6b 46 6f 72 46 69 6c 65 20     checkForFile 
29cf0 24 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 24 74  $test_channel $t
29d00 65 73 74 55 6e 69 6e 73 74 61 6c 6c 56 73 32 30  estUninstallVs20
29d10 31 30 4c 6f 67 46 69 6c 65 0d 0a 20 20 20 20 20  10LogFile..     
29d20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
29d30 69 66 20 7b 21 5b 68 61 76 65 43 6f 6e 73 74 72  if {![haveConstr
29d40 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73  aint [appendArgs
29d50 20 66 69 6c 65 5f 20 5c 0d 0a 20 20 20 20 20 20   file_ \..      
29d60 20 20 20 20 20 20 5b 66 69 6c 65 20 74 61 69 6c        [file tail
29d70 20 24 74 65 73 74 55 6e 69 6e 73 74 61 6c 6c 56   $testUninstallV
29d80 73 32 30 31 32 4c 6f 67 46 69 6c 65 5d 5d 5d 7d  s2012LogFile]]]}
29d90 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
29da0 20 20 20 63 68 65 63 6b 46 6f 72 46 69 6c 65 20     checkForFile 
29db0 24 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 24 74  $test_channel $t
29dc0 65 73 74 55 6e 69 6e 73 74 61 6c 6c 56 73 32 30  estUninstallVs20
29dd0 31 32 4c 6f 67 46 69 6c 65 0d 0a 20 20 20 20 20  12LogFile..     
29de0 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
29df0 69 66 20 7b 21 5b 68 61 76 65 43 6f 6e 73 74 72  if {![haveConstr
29e00 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73  aint [appendArgs
29e10 20 66 69 6c 65 5f 20 5c 0d 0a 20 20 20 20 20 20   file_ \..      
29e20 20 20 20 20 20 20 5b 66 69 6c 65 20 74 61 69 6c        [file tail
29e30 20 24 74 65 73 74 55 6e 69 6e 73 74 61 6c 6c 56   $testUninstallV
29e40 73 32 30 31 33 4c 6f 67 46 69 6c 65 5d 5d 5d 7d  s2013LogFile]]]}
29e50 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
29e60 20 20 20 63 68 65 63 6b 46 6f 72 46 69 6c 65 20     checkForFile 
29e70 24 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 24 74  $test_channel $t
29e80 65 73 74 55 6e 69 6e 73 74 61 6c 6c 56 73 32 30  estUninstallVs20
29e90 31 33 4c 6f 67 46 69 6c 65 0d 0a 20 20 20 20 20  13LogFile..     
29ea0 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
29eb0 69 66 20 7b 21 5b 68 61 76 65 43 6f 6e 73 74 72  if {![haveConstr
29ec0 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73  aint [appendArgs
29ed0 20 66 69 6c 65 5f 20 5c 0d 0a 20 20 20 20 20 20   file_ \..      
29ee0 20 20 20 20 20 20 5b 66 69 6c 65 20 74 61 69 6c        [file tail
29ef0 20 24 74 65 73 74 55 6e 69 6e 73 74 61 6c 6c 56   $testUninstallV
29f00 73 32 30 31 35 4c 6f 67 46 69 6c 65 5d 5d 5d 7d  s2015LogFile]]]}
29f10 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
29f20 20 20 20 63 68 65 63 6b 46 6f 72 46 69 6c 65 20     checkForFile 
29f30 24 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 24 74  $test_channel $t
29f40 65 73 74 55 6e 69 6e 73 74 61 6c 6c 56 73 32 30  estUninstallVs20
29f50 31 35 4c 6f 67 46 69 6c 65 0d 0a 20 20 20 20 20  15LogFile..     
29f60 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20     }..      }.. 
29f70 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
29f80 63 20 72 75 6e 53 51 4c 69 74 65 54 65 73 74 46  c runSQLiteTestF
29f90 69 6c 65 73 45 70 69 6c 6f 67 75 65 20 7b 7d 20  ilesEpilogue {} 
29fa0 7b 0d 0a 20 20 20 20 20 20 75 70 6c 65 76 65 6c  {..      uplevel
29fb0 20 31 20 7b 0d 0a 20 20 20 20 20 20 20 20 75 6e   1 {..        un
29fc0 73 65 74 20 2d 6e 6f 63 6f 6d 70 6c 61 69 6e 20  set -nocomplain 
29fd0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  \..            t
29fe0 65 73 74 55 6e 69 6e 73 74 61 6c 6c 56 73 32 30  estUninstallVs20
29ff0 31 35 4c 6f 67 46 69 6c 65 20 74 65 73 74 55 6e  15LogFile testUn
2a000 69 6e 73 74 61 6c 6c 56 73 32 30 31 33 4c 6f 67  installVs2013Log
2a010 46 69 6c 65 20 5c 0d 0a 20 20 20 20 20 20 20 20  File \..        
2a020 20 20 20 20 74 65 73 74 55 6e 69 6e 73 74 61 6c      testUninstal
2a030 6c 56 73 32 30 31 32 4c 6f 67 46 69 6c 65 20 74  lVs2012LogFile t
2a040 65 73 74 55 6e 69 6e 73 74 61 6c 6c 56 73 32 30  estUninstallVs20
2a050 31 30 4c 6f 67 46 69 6c 65 20 5c 0d 0a 20 20 20  10LogFile \..   
2a060 20 20 20 20 20 20 20 20 20 74 65 73 74 55 6e 69           testUni
2a070 6e 73 74 61 6c 6c 56 73 32 30 30 38 4c 6f 67 46  nstallVs2008LogF
2a080 69 6c 65 20 74 65 73 74 55 6e 69 6e 73 74 61 6c  ile testUninstal
2a090 6c 56 73 32 30 30 35 4c 6f 67 46 69 6c 65 20 5c  lVs2005LogFile \
2a0a0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 65  ..            te
2a0b0 73 74 49 6e 73 74 61 6c 6c 56 73 32 30 31 35 4c  stInstallVs2015L
2a0c0 6f 67 46 69 6c 65 20 74 65 73 74 49 6e 73 74 61  ogFile testInsta
2a0d0 6c 6c 56 73 32 30 31 33 4c 6f 67 46 69 6c 65 20  llVs2013LogFile 
2a0e0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  \..            t
2a0f0 65 73 74 49 6e 73 74 61 6c 6c 56 73 32 30 31 32  estInstallVs2012
2a100 4c 6f 67 46 69 6c 65 20 74 65 73 74 49 6e 73 74  LogFile testInst
2a110 61 6c 6c 56 73 32 30 31 30 4c 6f 67 46 69 6c 65  allVs2010LogFile
2a120 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
2a130 74 65 73 74 49 6e 73 74 61 6c 6c 56 73 32 30 30  testInstallVs200
2a140 38 4c 6f 67 46 69 6c 65 20 74 65 73 74 49 6e 73  8LogFile testIns
2a150 74 61 6c 6c 56 73 32 30 30 35 4c 6f 67 46 69 6c  tallVs2005LogFil
2a160 65 0d 0a 0d 0a 20 20 20 20 20 20 20 20 75 6e 73  e....        uns
2a170 65 74 20 2d 6e 6f 63 6f 6d 70 6c 61 69 6e 20 5c  et -nocomplain \
2a180 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e 6f  ..            no
2a190 72 74 68 77 69 6e 64 45 66 44 62 46 69 6c 65 20  rthwindEfDbFile 
2a1a0 74 65 73 74 4c 69 6e 71 4f 75 74 46 69 6c 65 20  testLinqOutFile 
2a1b0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 77  \..            w
2a1c0 61 6c 44 62 46 69 6c 65 20 6e 6f 6e 57 61 6c 44  alDbFile nonWalD
2a1d0 62 46 69 6c 65 0d 0a 0d 0a 20 20 20 20 20 20 20  bFile....       
2a1e0 20 75 6e 73 65 74 20 2d 6e 6f 63 6f 6d 70 6c 61   unset -nocompla
2a1f0 69 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  in \..          
2a200 20 20 74 65 73 74 45 66 36 45 78 65 46 69 6c 65    testEf6ExeFile
2a210 20 74 65 73 74 4c 69 6e 71 45 78 65 46 69 6c 65   testLinqExeFile
2a220 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
2a230 74 65 73 74 45 78 65 46 69 6c 65 20 73 79 73 74  testExeFile syst
2a240 65 6d 44 61 74 61 53 51 4c 69 74 65 45 66 36 44  emDataSQLiteEf6D
2a250 6c 6c 46 69 6c 65 20 5c 0d 0a 20 20 20 20 20 20  llFile \..      
2a260 20 20 20 20 20 20 73 79 73 74 65 6d 44 61 74 61        systemData
2a270 53 51 4c 69 74 65 4c 69 6e 71 44 6c 6c 46 69 6c  SQLiteLinqDllFil
2a280 65 20 73 79 73 74 65 6d 44 61 74 61 53 51 4c 69  e systemDataSQLi
2a290 74 65 44 6c 6c 46 69 6c 65 20 5c 0d 0a 20 20 20  teDllFile \..   
2a2a0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 44           sqliteD
2a2b0 65 73 69 67 6e 65 72 44 6c 6c 46 69 6c 65 20 69  esignerDllFile i
2a2c0 6e 73 74 61 6c 6c 65 72 45 78 65 46 69 6c 65 20  nstallerExeFile 
2a2d0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 65  \..            e
2a2e0 6e 74 69 74 79 46 72 61 6d 65 77 6f 72 6b 44 6c  ntityFrameworkDl
2a2f0 6c 46 69 6c 65 0d 0a 20 20 20 20 20 20 7d 0d 0a  lFile..      }..
2a300 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
2a310 6f 63 20 72 75 6e 53 51 4c 69 74 65 54 65 73 74  oc runSQLiteTest
2a320 45 70 69 6c 6f 67 75 65 20 7b 7d 20 7b 0d 0a 20  Epilogue {} {.. 
2a330 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
2a340 4e 4f 54 45 3a 20 53 6b 69 70 20 72 75 6e 6e 69  NOTE: Skip runni
2a350 6e 67 20 6f 75 72 20 63 75 73 74 6f 6d 20 65 70  ng our custom ep
2a360 69 6c 6f 67 75 65 20 69 66 20 74 68 65 20 6d 61  ilogue if the ma
2a370 69 6e 20 6f 6e 65 20 68 61 73 20 62 65 65 6e 0d  in one has been.
2a380 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 73  .      #       s
2a390 6b 69 70 70 65 64 2e 0d 0a 20 20 20 20 20 20 23  kipped...      #
2a3a0 0d 0a 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e  ..      if {![in
2a3b0 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 65  fo exists ::no(e
2a3c0 70 69 6c 6f 67 75 65 2e 65 61 67 6c 65 29 5d 7d  pilogue.eagle)]}
2a3d0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
2a3e0 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
2a3f0 54 45 3a 20 53 68 6f 77 20 77 68 65 6e 20 6f 75  TE: Show when ou
2a400 72 20 74 65 73 74 73 20 61 63 74 75 61 6c 6c 79  r tests actually
2a410 20 65 6e 64 65 64 20 28 6e 6f 77 29 2e 0d 0a 20   ended (now)... 
2a420 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
2a430 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
2a440 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
2a450 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
2a460 20 20 20 22 2d 2d 2d 2d 20 53 79 73 74 65 6d 2e     "---- System.
2a470 44 61 74 61 2e 53 51 4c 69 74 65 20 74 65 73 74  Data.SQLite test
2a480 73 20 65 6e 64 65 64 20 61 74 20 22 20 5c 0d 0a  s ended at " \..
2a490 20 20 20 20 20 20 20 20 20 20 20 20 5b 63 6c 6f              [clo
2a4a0 63 6b 20 66 6f 72 6d 61 74 20 5b 63 6c 6f 63 6b  ck format [clock
2a4b0 20 73 65 63 6f 6e 64 73 5d 5d 20 5c 6e 5d 0d 0a   seconds]] \n]..
2a4c0 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
2a4d0 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4c 6f 61       # NOTE: Loa
2a4e0 64 20 74 68 65 20 22 65 70 69 6c 6f 67 75 65 22  d the "epilogue"
2a4f0 20 63 75 73 74 6f 6d 20 70 65 72 2d 75 73 65 72   custom per-user
2a500 20 61 6e 64 2f 6f 72 20 70 65 72 2d 68 6f 73 74   and/or per-host
2a510 20 74 65 73 74 0d 0a 20 20 20 20 20 20 20 20 23   test..        #
2a520 20 20 20 20 20 20 20 73 65 74 74 69 6e 67 73 20         settings 
2a530 6e 6f 77 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  now...        #.
2a540 0a 20 20 20 20 20 20 20 20 75 70 6c 65 76 65 6c  .        uplevel
2a550 20 31 20 5b 6c 69 73 74 20 6c 6f 61 64 53 51 4c   1 [list loadSQL
2a560 69 74 65 54 65 73 74 53 65 74 74 69 6e 67 73 20  iteTestSettings 
2a570 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
2a580 2e 65 70 69 6c 6f 67 75 65 5d 0d 0a 0d 0a 20 20  .epilogue]....  
2a590 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
2a5a0 20 23 20 42 55 47 46 49 58 3a 20 42 65 66 6f 72   # BUGFIX: Befor
2a5b0 65 20 63 68 65 63 6b 69 6e 67 20 74 68 65 20 66  e checking the f
2a5c0 69 6e 61 6c 20 72 65 73 6f 75 72 63 65 73 20 69  inal resources i
2a5d0 6e 20 75 73 65 20 62 79 20 53 51 4c 69 74 65 2c  n use by SQLite,
2a5e0 20 6d 61 6b 65 0d 0a 20 20 20 20 20 20 20 20 23   make..        #
2a5f0 20 20 20 20 20 20 20 20 20 73 75 72 65 20 62 6f           sure bo
2a600 74 68 20 6f 66 20 74 68 65 20 50 52 41 47 4d 41  th of the PRAGMA
2a610 20 72 65 6c 61 74 65 64 20 64 69 72 65 63 74 6f   related directo
2a620 72 79 20 6e 61 6d 65 73 20 61 72 65 20 66 72 65  ry names are fre
2a630 65 64 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  ed...        #..
2a640 20 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72          checkFor
2a650 53 51 4c 69 74 65 44 69 72 65 63 74 6f 72 69 65  SQLiteDirectorie
2a660 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
2a670 6c 20 74 72 75 65 0d 0a 0d 0a 20 20 20 20 20 20  l true....      
2a680 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
2a690 4f 54 45 3a 20 41 6c 73 6f 20 72 65 70 6f 72 74  OTE: Also report
2a6a0 20 74 68 65 20 72 65 73 6f 75 72 63 65 20 75 73   the resource us
2a6b0 61 67 65 20 61 66 74 65 72 20 72 75 6e 6e 69 6e  age after runnin
2a6c0 67 20 74 68 65 20 74 65 73 74 73 2e 0d 0a 20 20  g the tests...  
2a6d0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
2a6e0 20 72 65 70 6f 72 74 53 51 4c 69 74 65 52 65 73   reportSQLiteRes
2a6f0 6f 75 72 63 65 73 20 24 3a 3a 74 65 73 74 5f 63  ources $::test_c
2a700 68 61 6e 6e 65 6c 0d 0a 0d 0a 20 20 20 20 20 20  hannel....      
2a710 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
2a720 4f 54 45 3a 20 52 65 70 6f 72 74 20 74 68 65 20  OTE: Report the 
2a730 63 72 69 74 69 63 61 6c 20 68 61 6e 64 6c 65 20  critical handle 
2a740 63 6f 75 6e 74 73 20 61 66 74 65 72 20 72 75 6e  counts after run
2a750 6e 69 6e 67 20 74 68 65 20 74 65 73 74 73 2e 0d  ning the tests..
2a760 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
2a770 20 20 20 20 67 65 74 53 51 4c 69 74 65 48 61 6e      getSQLiteHan
2a780 64 6c 65 43 6f 75 6e 74 73 20 24 3a 3a 74 65 73  dleCounts $::tes
2a790 74 5f 63 68 61 6e 6e 65 6c 0d 0a 0d 0a 20 20 20  t_channel....   
2a7a0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
2a7b0 23 20 4e 4f 54 45 3a 20 49 66 20 6e 65 63 65 73  # NOTE: If neces
2a7c0 73 61 72 79 2c 20 64 69 73 61 62 6c 65 20 73 68  sary, disable sh
2a7d0 61 72 65 64 2d 63 61 63 68 65 20 6d 6f 64 65 20  ared-cache mode 
2a7e0 6e 6f 77 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  now...        #.
2a7f0 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 68 61  .        if {[ha
2a800 73 52 75 6e 74 69 6d 65 4f 70 74 69 6f 6e 20 73  sRuntimeOption s
2a810 68 61 72 65 64 43 61 63 68 65 5d 7d 20 74 68 65  haredCache]} the
2a820 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 65  n {..          e
2a830 6e 61 62 6c 65 53 68 61 72 65 64 43 61 63 68 65  nableSharedCache
2a840 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
2a850 20 66 61 6c 73 65 0d 0a 20 20 20 20 20 20 20 20   false..        
2a860 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  }..      }..    
2a870 7d 0d 0a 0c 0d 0a 20 20 20 20 23 23 23 23 23 23  }.....    ######
2a880 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2a890 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2a8a0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2a8b0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2a8c0 23 23 23 23 23 0d 0a 20 20 20 20 23 23 23 23 23  #####..    #####
2a8d0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2a8e0 23 23 23 23 23 23 23 23 20 45 4e 44 20 45 61 67  ######## END Eag
2a8f0 6c 65 20 4f 4e 4c 59 20 23 23 23 23 23 23 23 23  le ONLY ########
2a900 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2a910 23 23 23 23 23 23 0d 0a 20 20 20 20 23 23 23 23  ######..    ####
2a920 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2a930 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2a940 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2a950 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2a960 23 23 23 23 23 23 23 0d 0a 20 20 7d 0d 0a 0d 0a  #######..  }....
2a970 20 20 23 0d 0a 20 20 23 20 4e 4f 54 45 3a 20 53    #..  # NOTE: S
2a980 61 76 65 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  ave the name of 
2a990 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 63 6f  the directory co
2a9a0 6e 74 61 69 6e 69 6e 67 20 74 68 69 73 20 66 69  ntaining this fi
2a9b0 6c 65 2e 0d 0a 20 20 23 0d 0a 20 20 69 66 20 7b  le...  #..  if {
2a9c0 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 63 6f  ![info exists co
2a9d0 6d 6d 6f 6e 5f 64 69 72 65 63 74 6f 72 79 5d 7d  mmon_directory]}
2a9e0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 73 65 74   then {..    set
2a9f0 20 63 6f 6d 6d 6f 6e 5f 64 69 72 65 63 74 6f 72   common_director
2aa00 79 20 5b 66 69 6c 65 20 64 69 72 6e 61 6d 65 20  y [file dirname 
2aa10 5b 69 6e 66 6f 20 73 63 72 69 70 74 5d 5d 0d 0a  [info script]]..
2aa20 20 20 7d 0d 0a 0d 0a 20 20 23 0d 0a 20 20 23 20    }....  #..  # 
2aa30 4e 4f 54 45 3a 20 50 72 6f 76 69 64 65 20 74 68  NOTE: Provide th
2aa40 65 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51  e System.Data.SQ
2aa50 4c 69 74 65 20 74 65 73 74 20 70 61 63 6b 61 67  Lite test packag
2aa60 65 20 74 6f 20 74 68 65 20 69 6e 74 65 72 70 72  e to the interpr
2aa70 65 74 65 72 2e 0d 0a 20 20 23 0d 0a 20 20 70 61  eter...  #..  pa
2aa80 63 6b 61 67 65 20 70 72 6f 76 69 64 65 20 53 79  ckage provide Sy
2aa90 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
2aaa0 2e 54 65 73 74 20 31 2e 30 0d 0a 7d 0d 0a        .Test 1.0..}..