System.Data.SQLite
Hex Artifact Content
Not logged in

Artifact b15021147bf0c75be9d9d1c342f3abb35075619d:


0000: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0010: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0020: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0030: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0040: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0d  ###############.
0050: 0a 23 0d 0a 23 20 63 6f 6d 6d 6f 6e 2e 65 61 67  .#..# common.eag
0060: 6c 65 20 2d 2d 0d 0a 23 0d 0a 23 20 57 72 69 74  le --..#..# Writ
0070: 74 65 6e 20 62 79 20 4a 6f 65 20 4d 69 73 74 61  ten by Joe Mista
0080: 63 68 6b 69 6e 2e 0d 0a 23 20 52 65 6c 65 61 73  chkin...# Releas
0090: 65 64 20 74 6f 20 74 68 65 20 70 75 62 6c 69 63  ed to the public
00a0: 20 64 6f 6d 61 69 6e 2c 20 75 73 65 20 61 74 20   domain, use at 
00b0: 79 6f 75 72 20 6f 77 6e 20 72 69 73 6b 21 0d 0a  your own risk!..
00c0: 23 0d 0a 23 23 23 23 23 23 23 23 23 23 23 23 23  #..#############
00d0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
00e0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
00f0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0100: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0110: 23 23 0d 0a 0d 0a 23 0d 0a 23 20 4e 4f 54 45 3a  ##....#..# NOTE:
0120: 20 55 73 65 20 6f 75 72 20 6f 77 6e 20 6e 61 6d   Use our own nam
0130: 65 73 70 61 63 65 20 68 65 72 65 20 62 65 63 61  espace here beca
0140: 75 73 65 20 65 76 65 6e 20 74 68 6f 75 67 68 20  use even though 
0150: 77 65 20 64 6f 20 6e 6f 74 20 64 69 72 65 63 74  we do not direct
0160: 6c 79 0d 0a 23 20 20 20 20 20 20 20 73 75 70 70  ly..#       supp
0170: 6f 72 74 20 6e 61 6d 65 73 70 61 63 65 73 20 6f  ort namespaces o
0180: 75 72 73 65 6c 76 65 73 2c 20 77 65 20 64 6f 20  urselves, we do 
0190: 6e 6f 74 20 77 61 6e 74 20 74 6f 20 70 6f 6c 6c  not want to poll
01a0: 75 74 65 20 74 68 65 20 67 6c 6f 62 61 6c 0d 0a  ute the global..
01b0: 23 20 20 20 20 20 20 20 6e 61 6d 65 73 70 61 63  #       namespac
01c0: 65 20 69 66 20 74 68 69 73 20 73 63 72 69 70 74  e if this script
01d0: 20 61 63 74 75 61 6c 6c 79 20 65 6e 64 73 20 75   actually ends u
01e0: 70 20 62 65 69 6e 67 20 65 76 61 6c 75 61 74 65  p being evaluate
01f0: 64 20 69 6e 20 54 63 6c 2e 0d 0a 23 0d 0a 6e 61  d in Tcl...#..na
0200: 6d 65 73 70 61 63 65 20 65 76 61 6c 20 3a 3a 45  mespace eval ::E
0210: 61 67 6c 65 20 7b 0d 0a 20 20 69 66 20 7b 5b 69  agle {..  if {[i
0220: 73 45 61 67 6c 65 5d 7d 20 74 68 65 6e 20 7b 0d  sEagle]} then {.
0230: 0a 20 20 20 20 23 23 23 23 23 23 23 23 23 23 23  .    ###########
0240: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0250: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0260: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0270: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0280: 0d 0a 20 20 20 20 23 23 23 23 23 23 23 23 23 23  ..    ##########
0290: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
02a0: 23 23 20 42 45 47 49 4e 20 45 61 67 6c 65 20 4f  ## BEGIN Eagle O
02b0: 4e 4c 59 20 23 23 23 23 23 23 23 23 23 23 23 23  NLY ############
02c0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
02d0: 23 0d 0a 20 20 20 20 23 23 23 23 23 23 23 23 23  #..    #########
02e0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
02f0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0300: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0310: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0320: 23 23 0d 0a 0d 0a 20 20 20 20 70 72 6f 63 20 67  ##....    proc g
0330: 65 74 53 51 4c 69 74 65 44 65 66 69 6e 65 43 6f  etSQLiteDefineCo
0340: 6e 73 74 61 6e 74 50 72 65 66 69 78 20 7b 7d 20  nstantPrefix {} 
0350: 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  {..      #..    
0360: 20 20 23 20 4e 4f 54 45 3a 20 53 65 65 20 69 66    # NOTE: See if
0370: 20 74 68 65 20 64 65 66 69 6e 65 20 63 6f 6e 73   the define cons
0380: 74 61 6e 74 20 70 72 65 66 69 78 20 73 65 74 74  tant prefix sett
0390: 69 6e 67 20 68 61 73 20 62 65 65 6e 20 6f 76 65  ing has been ove
03a0: 72 72 69 64 64 65 6e 0d 0a 20 20 20 20 20 20 23  rridden..      #
03b0: 20 20 20 20 20 20 20 62 79 20 74 68 65 20 75 73         by the us
03c0: 65 72 20 28 65 2e 67 2e 20 6f 6e 20 74 68 65 20  er (e.g. on the 
03d0: 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 29 2e 0d 0a  command line)...
03e0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69        #..      i
03f0: 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20  f {[info exists 
0400: 3a 3a 64 65 66 69 6e 65 5f 63 6f 6e 73 74 61 6e  ::define_constan
0410: 74 5f 70 72 65 66 69 78 5d 20 26 26 20 5c 0d 0a  t_prefix] && \..
0420: 20 20 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e            [strin
0430: 67 20 6c 65 6e 67 74 68 20 24 3a 3a 64 65 66 69  g length $::defi
0440: 6e 65 5f 63 6f 6e 73 74 61 6e 74 5f 70 72 65 66  ne_constant_pref
0450: 69 78 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d  ix] > 0} then {.
0460: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
0470: 20 20 20 20 23 20 4e 4f 54 45 3a 20 55 73 65 20      # NOTE: Use 
0480: 74 68 65 20 73 70 65 63 69 66 69 65 64 20 64 65  the specified de
0490: 66 69 6e 65 20 63 6f 6e 73 74 61 6e 74 20 70 72  fine constant pr
04a0: 65 66 69 78 2e 0d 0a 20 20 20 20 20 20 20 20 23  efix...        #
04b0: 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ..        return
04c0: 20 24 3a 3a 64 65 66 69 6e 65 5f 63 6f 6e 73 74   $::define_const
04d0: 61 6e 74 5f 70 72 65 66 69 78 0d 0a 20 20 20 20  ant_prefix..    
04e0: 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
04f0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
0500: 20 4e 4f 54 45 3a 20 55 73 65 20 74 68 65 20 64   NOTE: Use the d
0510: 65 66 61 75 6c 74 20 64 65 66 69 6e 65 20 63 6f  efault define co
0520: 6e 73 74 61 6e 74 20 70 72 65 66 69 78 2e 0d 0a  nstant prefix...
0530: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
0540: 20 20 20 72 65 74 75 72 6e 20 64 65 66 69 6e 65     return define
0550: 43 6f 6e 73 74 61 6e 74 2e 53 79 73 74 65 6d 2e  Constant.System.
0560: 44 61 74 61 2e 53 51 4c 69 74 65 2e 0d 0a 20 20  Data.SQLite...  
0570: 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d      }..    }....
0580: 0a 20 20 20 20 70 72 6f 63 20 68 61 76 65 53 51  .    proc haveSQ
0590: 4c 69 74 65 44 65 66 69 6e 65 43 6f 6e 73 74 61  LiteDefineConsta
05a0: 6e 74 20 7b 20 6e 61 6d 65 20 7d 20 7b 0d 0a 20  nt { name } {.. 
05b0: 20 20 20 20 20 72 65 74 75 72 6e 20 5b 68 61 76       return [hav
05c0: 65 43 6f 6e 73 74 72 61 69 6e 74 20 5c 0d 0a 20  eConstraint \.. 
05d0: 20 20 20 20 20 20 20 20 20 5b 61 70 70 65 6e 64           [append
05e0: 41 72 67 73 20 5b 67 65 74 53 51 4c 69 74 65 44  Args [getSQLiteD
05f0: 65 66 69 6e 65 43 6f 6e 73 74 61 6e 74 50 72 65  efineConstantPre
0600: 66 69 78 5d 20 24 6e 61 6d 65 5d 5d 0d 0a 20 20  fix] $name]]..  
0610: 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
0620: 20 67 65 74 42 75 69 6c 64 59 65 61 72 20 7b 7d   getBuildYear {}
0630: 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20   {..      #..   
0640: 20 20 20 23 20 4e 4f 54 45 3a 20 53 65 65 20 69     # NOTE: See i
0650: 66 20 74 68 65 20 22 79 65 61 72 22 20 73 65 74  f the "year" set
0660: 74 69 6e 67 20 68 61 73 20 62 65 65 6e 20 6f 76  ting has been ov
0670: 65 72 72 69 64 64 65 6e 20 62 79 20 74 68 65 20  erridden by the 
0680: 75 73 65 72 20 28 65 2e 67 2e 0d 0a 20 20 20 20  user (e.g...    
0690: 20 20 23 20 20 20 20 20 20 20 6f 6e 20 74 68 65    #       on the
06a0: 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 29 2e 20   command line). 
06b0: 20 54 68 69 73 20 68 65 6c 70 73 20 63 6f 6e 74   This helps cont
06c0: 72 6f 6c 20 65 78 61 63 74 6c 79 20 77 68 69 63  rol exactly whic
06d0: 68 20 73 65 74 20 6f 66 0d 0a 20 20 20 20 20 20  h set of..      
06e0: 23 20 20 20 20 20 20 20 62 69 6e 61 72 69 65 73  #       binaries
06f0: 20 77 65 20 61 72 65 20 74 65 73 74 69 6e 67 2c   we are testing,
0700: 20 74 68 6f 73 65 20 70 72 6f 64 75 63 65 64 20   those produced 
0710: 75 73 69 6e 67 20 74 68 65 20 56 69 73 75 61 6c  using the Visual
0720: 20 53 74 75 64 69 6f 0d 0a 20 20 20 20 20 20 23   Studio..      #
0730: 20 20 20 20 20 20 20 32 30 30 35 2c 20 32 30 30         2005, 200
0740: 38 2c 20 32 30 31 30 2c 20 32 30 31 32 2c 20 32  8, 2010, 2012, 2
0750: 30 31 33 2c 20 6f 72 20 32 30 31 35 20 62 75 69  013, or 2015 bui
0760: 6c 64 20 73 79 73 74 65 6d 73 2e 20 20 54 6f 20  ld systems.  To 
0770: 6f 76 65 72 72 69 64 65 0d 0a 20 20 20 20 20 20  override..      
0780: 23 20 20 20 20 20 20 20 74 68 69 73 20 76 61 6c  #       this val
0790: 75 65 20 76 69 61 20 74 68 65 20 63 6f 6d 6d 61  ue via the comma
07a0: 6e 64 20 6c 69 6e 65 2c 20 65 6e 74 65 72 20 61  nd line, enter a
07b0: 20 63 6f 6d 6d 61 6e 64 20 73 69 6d 69 6c 61 72   command similar
07c0: 20 74 6f 20 6f 6e 65 0d 0a 20 20 20 20 20 20 23   to one..      #
07d0: 20 20 20 20 20 20 20 6f 66 20 74 68 65 20 66 6f         of the fo
07e0: 6c 6c 6f 77 69 6e 67 20 28 61 6c 6c 20 6f 6e 20  llowing (all on 
07f0: 6f 6e 65 20 6c 69 6e 65 29 3a 0d 0a 20 20 20 20  one line):..    
0800: 20 20 23 0d 0a 20 20 20 20 20 20 23 20 20 20 20    #..      #    
0810: 20 20 20 45 61 67 6c 65 53 68 65 6c 6c 2e 65 78     EagleShell.ex
0820: 65 20 2d 61 6e 79 49 6e 69 74 69 61 6c 69 7a 65  e -anyInitialize
0830: 20 22 73 65 74 20 74 65 73 74 5f 79 65 61 72 20   "set test_year 
0840: 32 30 30 35 22 0d 0a 20 20 20 20 20 20 23 20 20  2005"..      #  
0850: 20 20 20 20 20 20 20 2d 66 69 6c 65 20 2e 5c 70         -file .\p
0860: 61 74 68 5c 74 6f 5c 61 6c 6c 2e 65 61 67 6c 65  ath\to\all.eagle
0870: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
0880: 20 23 20 20 20 20 20 20 20 45 61 67 6c 65 53 68   #       EagleSh
0890: 65 6c 6c 2e 65 78 65 20 2d 61 6e 79 49 6e 69 74  ell.exe -anyInit
08a0: 69 61 6c 69 7a 65 20 22 73 65 74 20 74 65 73 74  ialize "set test
08b0: 5f 79 65 61 72 20 32 30 30 38 22 0d 0a 20 20 20  _year 2008"..   
08c0: 20 20 20 23 20 20 20 20 20 20 20 20 20 2d 66 69     #         -fi
08d0: 6c 65 20 2e 5c 70 61 74 68 5c 74 6f 5c 61 6c 6c  le .\path\to\all
08e0: 2e 65 61 67 6c 65 0d 0a 20 20 20 20 20 20 23 0d  .eagle..      #.
08f0: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 45  .      #       E
0900: 61 67 6c 65 53 68 65 6c 6c 2e 65 78 65 20 2d 61  agleShell.exe -a
0910: 6e 79 49 6e 69 74 69 61 6c 69 7a 65 20 22 73 65  nyInitialize "se
0920: 74 20 74 65 73 74 5f 79 65 61 72 20 32 30 31 30  t test_year 2010
0930: 22 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  "..      #      
0940: 20 20 20 2d 66 69 6c 65 20 2e 5c 70 61 74 68 5c     -file .\path\
0950: 74 6f 5c 61 6c 6c 2e 65 61 67 6c 65 0d 0a 20 20  to\all.eagle..  
0960: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 20      #..      #  
0970: 20 20 20 20 20 45 61 67 6c 65 53 68 65 6c 6c 2e       EagleShell.
0980: 65 78 65 20 2d 61 6e 79 49 6e 69 74 69 61 6c 69  exe -anyInitiali
0990: 7a 65 20 22 73 65 74 20 74 65 73 74 5f 79 65 61  ze "set test_yea
09a0: 72 20 32 30 31 32 22 0d 0a 20 20 20 20 20 20 23  r 2012"..      #
09b0: 20 20 20 20 20 20 20 20 20 2d 66 69 6c 65 20 2e           -file .
09c0: 5c 70 61 74 68 5c 74 6f 5c 61 6c 6c 2e 65 61 67  \path\to\all.eag
09d0: 6c 65 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  le..      #..   
09e0: 20 20 20 23 20 20 20 20 20 20 20 45 61 67 6c 65     #       Eagle
09f0: 53 68 65 6c 6c 2e 65 78 65 20 2d 61 6e 79 49 6e  Shell.exe -anyIn
0a00: 69 74 69 61 6c 69 7a 65 20 22 73 65 74 20 74 65  itialize "set te
0a10: 73 74 5f 79 65 61 72 20 32 30 31 33 22 0d 0a 20  st_year 2013".. 
0a20: 20 20 20 20 20 23 20 20 20 20 20 20 20 20 20 2d       #         -
0a30: 66 69 6c 65 20 2e 5c 70 61 74 68 5c 74 6f 5c 61  file .\path\to\a
0a40: 6c 6c 2e 65 61 67 6c 65 0d 0a 20 20 20 20 20 20  ll.eagle..      
0a50: 23 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  #..      #      
0a60: 20 45 61 67 6c 65 53 68 65 6c 6c 2e 65 78 65 20   EagleShell.exe 
0a70: 2d 61 6e 79 49 6e 69 74 69 61 6c 69 7a 65 20 22  -anyInitialize "
0a80: 73 65 74 20 74 65 73 74 5f 79 65 61 72 20 32 30  set test_year 20
0a90: 31 35 22 0d 0a 20 20 20 20 20 20 23 20 20 20 20  15"..      #    
0aa0: 20 20 20 20 20 2d 66 69 6c 65 20 2e 5c 70 61 74       -file .\pat
0ab0: 68 5c 74 6f 5c 61 6c 6c 2e 65 61 67 6c 65 0d 0a  h\to\all.eagle..
0ac0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
0ad0: 20 20 20 20 20 20 20 45 61 67 6c 65 53 68 65 6c         EagleShel
0ae0: 6c 2e 65 78 65 20 2d 61 6e 79 49 6e 69 74 69 61  l.exe -anyInitia
0af0: 6c 69 7a 65 20 22 75 6e 73 65 74 20 2d 6e 6f 63  lize "unset -noc
0b00: 6f 6d 70 6c 61 69 6e 20 74 65 73 74 5f 79 65 61  omplain test_yea
0b10: 72 22 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  r"..      #     
0b20: 20 20 20 20 2d 66 69 6c 65 20 2e 5c 70 61 74 68      -file .\path
0b30: 5c 74 6f 5c 61 6c 6c 2e 65 61 67 6c 65 0d 0a 20  \to\all.eagle.. 
0b40: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66       #..      if
0b50: 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a   {[info exists :
0b60: 3a 74 65 73 74 5f 79 65 61 72 5d 20 26 26 20 5b  :test_year] && [
0b70: 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a  string length $:
0b80: 3a 74 65 73 74 5f 79 65 61 72 5d 20 3e 20 30 7d  :test_year] > 0}
0b90: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
0ba0: 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
0bb0: 54 45 3a 20 55 73 65 20 74 68 65 20 73 70 65 63  TE: Use the spec
0bc0: 69 66 69 65 64 20 74 65 73 74 20 79 65 61 72 2e  ified test year.
0bd0: 20 20 49 66 20 74 68 69 73 20 76 61 72 69 61 62    If this variab
0be0: 6c 65 20 69 73 20 6e 6f 74 20 73 65 74 2c 20 74  le is not set, t
0bf0: 68 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  he..        #   
0c00: 20 20 20 20 64 65 66 61 75 6c 74 20 76 61 6c 75      default valu
0c10: 65 20 77 69 6c 6c 20 62 65 20 62 61 73 65 64 20  e will be based 
0c20: 6f 6e 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  on whether or no
0c30: 74 20 45 61 67 6c 65 20 68 61 73 20 62 65 65 6e  t Eagle has been
0c40: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
0c50: 20 20 63 6f 6d 70 69 6c 65 64 20 61 67 61 69 6e    compiled again
0c60: 73 74 20 74 68 65 20 43 4c 52 20 76 32 2e 30 20  st the CLR v2.0 
0c70: 6f 72 20 43 4c 52 20 76 34 2e 30 2e 0d 0a 20 20  or CLR v4.0...  
0c80: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
0c90: 20 72 65 74 75 72 6e 20 24 3a 3a 74 65 73 74 5f   return $::test_
0ca0: 79 65 61 72 0d 0a 20 20 20 20 20 20 7d 20 65 6c  year..      } el
0cb0: 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d  se {..        #.
0cc0: 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
0cd0: 20 49 66 20 45 61 67 6c 65 20 68 61 73 20 62 65   If Eagle has be
0ce0: 65 6e 20 63 6f 6d 70 69 6c 65 64 20 61 67 61 69  en compiled agai
0cf0: 6e 73 74 20 74 68 65 20 43 4c 52 20 76 34 2e 30  nst the CLR v4.0
0d00: 2c 20 75 73 65 20 22 32 30 31 30 22 20 62 79 0d  , use "2010" by.
0d10: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
0d20: 20 64 65 66 61 75 6c 74 20 28 77 65 20 63 6f 75   default (we cou
0d30: 6c 64 20 75 73 65 20 22 32 30 31 32 22 2c 20 22  ld use "2012", "
0d40: 32 30 31 33 22 2c 20 6f 72 20 22 32 30 31 35 22  2013", or "2015"
0d50: 20 69 6e 20 74 68 61 74 20 63 61 73 65 20 61 73   in that case as
0d60: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
0d70: 20 20 77 65 6c 6c 29 20 61 73 20 74 68 65 20 74    well) as the t
0d80: 65 73 74 20 79 65 61 72 3b 20 6f 74 68 65 72 77  est year; otherw
0d90: 69 73 65 2c 20 75 73 65 20 22 32 30 30 38 22 20  ise, use "2008" 
0da0: 62 79 20 64 65 66 61 75 6c 74 20 28 77 65 0d 0a  by default (we..
0db0: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
0dc0: 63 6f 75 6c 64 20 75 73 65 20 22 32 30 30 35 22  could use "2005"
0dd0: 20 69 6e 20 74 68 61 74 20 63 61 73 65 20 61 73   in that case as
0de0: 20 77 65 6c 6c 29 2e 20 20 49 66 20 61 6e 6f 74   well).  If anot
0df0: 68 65 72 20 6d 61 6a 6f 72 0d 0a 20 20 20 20 20  her major..     
0e00: 20 20 20 23 20 20 20 20 20 20 20 5b 69 6e 63 6f     #       [inco
0e10: 6d 70 61 74 69 62 6c 65 5d 20 76 65 72 73 69 6f  mpatible] versio
0e20: 6e 20 6f 66 20 74 68 65 20 43 4c 52 20 69 73 20  n of the CLR is 
0e30: 72 65 6c 65 61 73 65 64 2c 20 74 68 69 73 20 63  released, this c
0e40: 68 65 63 6b 20 77 69 6c 6c 0d 0a 20 20 20 20 20  heck will..     
0e50: 20 20 20 23 20 20 20 20 20 20 20 68 61 76 65 20     #       have 
0e60: 74 6f 20 62 65 20 63 68 61 6e 67 65 64 2e 20 20  to be changed.  
0e70: 54 68 65 20 64 65 66 61 75 6c 74 20 74 65 73 74  The default test
0e80: 20 79 65 61 72 20 74 6f 20 75 73 65 20 66 6f 72   year to use for
0e90: 20 61 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20   a..        #   
0ea0: 20 20 20 20 70 61 72 74 69 63 75 6c 61 72 20 43      particular C
0eb0: 4c 52 20 76 65 72 73 69 6f 6e 20 6d 61 79 20 62  LR version may b
0ec0: 65 20 6f 76 65 72 72 69 64 64 65 6e 20 62 79 20  e overridden by 
0ed0: 73 65 74 74 69 6e 67 20 74 68 65 20 67 6c 6f 62  setting the glob
0ee0: 61 6c 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  al..        #   
0ef0: 20 20 20 20 76 61 72 69 61 62 6c 65 20 22 74 65      variable "te
0f00: 73 74 5f 79 65 61 72 5f 63 6c 72 5f 76 24 58 22  st_year_clr_v$X"
0f10: 2c 20 77 68 65 72 65 20 22 24 58 22 20 6d 61 79  , where "$X" may
0f20: 20 5b 63 75 72 72 65 6e 74 6c 79 5d 20 62 65 0d   [currently] be.
0f30: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
0f40: 20 65 69 74 68 65 72 20 22 32 22 20 6f 72 20 22   either "2" or "
0f50: 34 22 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  4"...        #..
0f60: 20 20 20 20 20 20 20 20 69 66 20 7b 5b 68 61 76          if {[hav
0f70: 65 43 6f 6e 73 74 72 61 69 6e 74 20 69 6d 61 67  eConstraint imag
0f80: 65 52 75 6e 74 69 6d 65 34 30 5d 7d 20 74 68 65  eRuntime40]} the
0f90: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69  n {..          i
0fa0: 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20  f {[info exists 
0fb0: 3a 3a 74 65 73 74 5f 79 65 61 72 5f 63 6c 72 5f  ::test_year_clr_
0fc0: 76 34 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20  v4] && \..      
0fd0: 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20          [string 
0fe0: 6c 65 6e 67 74 68 20 24 3a 3a 74 65 73 74 5f 79  length $::test_y
0ff0: 65 61 72 5f 63 6c 72 5f 76 34 5d 20 3e 20 30 7d  ear_clr_v4] > 0}
1000: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
1010: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
1020: 20 20 20 20 23 20 4e 4f 54 45 3a 20 55 73 65 20      # NOTE: Use 
1030: 74 68 65 20 73 70 65 63 69 66 69 65 64 20 74 65  the specified te
1040: 73 74 20 79 65 61 72 20 66 6f 72 20 74 68 65 20  st year for the 
1050: 43 4c 52 20 76 34 2e 30 2e 0d 0a 20 20 20 20 20  CLR v4.0...     
1060: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
1070: 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 3a 3a        return $::
1080: 74 65 73 74 5f 79 65 61 72 5f 63 6c 72 5f 76 34  test_year_clr_v4
1090: 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c  ..          } el
10a0: 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  se {..          
10b0: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20    #..           
10c0: 20 23 20 4e 4f 54 45 3a 20 55 73 65 20 74 68 65   # NOTE: Use the
10d0: 20 64 65 66 61 75 6c 74 20 74 65 73 74 20 79 65   default test ye
10e0: 61 72 20 66 6f 72 20 74 68 65 20 43 4c 52 20 76  ar for the CLR v
10f0: 34 2e 30 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  4.0...          
1100: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20    #..           
1110: 20 72 65 74 75 72 6e 20 32 30 31 30 3b 20 23 20   return 2010; # 
1120: 54 4f 44 4f 3a 20 47 6f 6f 64 20 22 66 61 6c 6c  TODO: Good "fall
1130: 62 61 63 6b 22 20 64 65 66 61 75 6c 74 3f 0d 0a  back" default?..
1140: 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
1150: 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
1160: 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 69 6e           if {[in
1170: 66 6f 20 65 78 69 73 74 73 20 3a 3a 74 65 73 74  fo exists ::test
1180: 5f 79 65 61 72 5f 63 6c 72 5f 76 32 5d 20 26 26  _year_clr_v2] &&
1190: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
11a0: 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68    [string length
11b0: 20 24 3a 3a 74 65 73 74 5f 79 65 61 72 5f 63 6c   $::test_year_cl
11c0: 72 5f 76 32 5d 20 3e 20 30 7d 20 74 68 65 6e 20  r_v2] > 0} then 
11d0: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23  {..            #
11e0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 20  ..            # 
11f0: 4e 4f 54 45 3a 20 55 73 65 20 74 68 65 20 73 70  NOTE: Use the sp
1200: 65 63 69 66 69 65 64 20 74 65 73 74 20 79 65 61  ecified test yea
1210: 72 20 66 6f 72 20 74 68 65 20 43 4c 52 20 76 32  r for the CLR v2
1220: 2e 30 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20  .0...           
1230: 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   #..            
1240: 72 65 74 75 72 6e 20 24 3a 3a 74 65 73 74 5f 79  return $::test_y
1250: 65 61 72 5f 63 6c 72 5f 76 32 0d 0a 20 20 20 20  ear_clr_v2..    
1260: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
1270: 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20              #.. 
1280: 20 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54             # NOT
1290: 45 3a 20 55 73 65 20 74 68 65 20 64 65 66 61 75  E: Use the defau
12a0: 6c 74 20 74 65 73 74 20 79 65 61 72 20 66 6f 72  lt test year for
12b0: 20 74 68 65 20 43 4c 52 20 76 32 2e 30 2e 0d 0a   the CLR v2.0...
12c0: 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20              #.. 
12d0: 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
12e0: 6e 20 32 30 30 38 3b 20 23 20 54 4f 44 4f 3a 20  n 2008; # TODO: 
12f0: 47 6f 6f 64 20 22 66 61 6c 6c 62 61 63 6b 22 20  Good "fallback" 
1300: 64 65 66 61 75 6c 74 3f 0d 0a 20 20 20 20 20 20  default?..      
1310: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d      }..        }
1320: 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d  ..      }..    }
1330: 0d 0a 0c 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20  .....    #..    
1340: 23 20 4e 4f 54 45 3a 20 54 68 69 73 20 70 72 6f  # NOTE: This pro
1350: 63 65 64 75 72 65 20 69 73 20 6f 6e 6c 79 20 75  cedure is only u
1360: 73 65 64 20 77 68 65 6e 20 61 64 64 69 6e 67 20  sed when adding 
1370: 73 68 69 6d 6d 65 64 20 74 65 73 74 20 63 6f 6e  shimmed test con
1380: 73 74 72 61 69 6e 74 73 2e 0d 0a 20 20 20 20 23  straints...    #
1390: 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74 42 75  ..    proc getBu
13a0: 69 6c 64 43 6c 72 56 65 72 73 69 6f 6e 20 7b 7d  ildClrVersion {}
13b0: 20 7b 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69   {..      if {[i
13c0: 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 74 65 73  nfo exists ::tes
13d0: 74 5f 63 6c 72 5d 20 26 26 20 5b 73 74 72 69 6e  t_clr] && [strin
13e0: 67 20 6c 65 6e 67 74 68 20 24 3a 3a 74 65 73 74  g length $::test
13f0: 5f 63 6c 72 5d 20 3e 20 30 7d 20 74 68 65 6e 20  _clr] > 0} then 
1400: 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
1410: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 55 73        # NOTE: Us
1420: 65 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  e the specified 
1430: 74 65 73 74 20 76 65 72 73 69 6f 6e 20 66 6f 72  test version for
1440: 20 74 68 65 20 43 4c 52 2e 20 20 49 66 20 74 68   the CLR.  If th
1450: 69 73 20 76 61 72 69 61 62 6c 65 0d 0a 20 20 20  is variable..   
1460: 20 20 20 20 20 23 20 20 20 20 20 20 20 69 73 20       #       is 
1470: 6e 6f 74 20 73 65 74 2c 20 74 68 65 20 64 65 66  not set, the def
1480: 61 75 6c 74 20 76 61 6c 75 65 20 77 69 6c 6c 20  ault value will 
1490: 62 65 20 62 61 73 65 64 20 6f 6e 20 77 68 65 74  be based on whet
14a0: 68 65 72 20 6f 72 20 6e 6f 74 0d 0a 20 20 20 20  her or not..    
14b0: 20 20 20 20 23 20 20 20 20 20 20 20 45 61 67 6c      #       Eagl
14c0: 65 20 68 61 73 20 62 65 65 6e 20 63 6f 6d 70 69  e has been compi
14d0: 6c 65 64 20 61 67 61 69 6e 73 74 20 74 68 65 20  led against the 
14e0: 43 4c 52 20 76 32 2e 30 20 6f 72 20 43 4c 52 20  CLR v2.0 or CLR 
14f0: 76 34 2e 30 2e 0d 0a 20 20 20 20 20 20 20 20 23  v4.0...        #
1500: 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ..        return
1510: 20 24 3a 3a 74 65 73 74 5f 63 6c 72 0d 0a 20 20   $::test_clr..  
1520: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
1530: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
1540: 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 69   # NOTE: Check i
1550: 66 20 45 61 67 6c 65 20 68 61 73 20 62 65 65 6e  f Eagle has been
1560: 20 63 6f 6d 70 69 6c 65 64 20 61 67 61 69 6e 73   compiled agains
1570: 74 20 74 68 65 20 43 4c 52 20 76 34 2e 30 2e 20  t the CLR v4.0. 
1580: 20 49 66 20 73 6f 2c 0d 0a 20 20 20 20 20 20 20   If so,..       
1590: 20 23 20 20 20 20 20 20 20 6a 75 73 74 20 75 73   #       just us
15a0: 65 20 74 68 61 74 20 43 4c 52 20 76 65 72 73 69  e that CLR versi
15b0: 6f 6e 2e 20 20 4f 74 68 65 72 77 69 73 65 2c 20  on.  Otherwise, 
15c0: 75 73 65 20 74 68 65 20 76 65 72 73 69 6f 6e 20  use the version 
15d0: 66 6f 72 20 74 68 65 0d 0a 20 20 20 20 20 20 20  for the..       
15e0: 20 23 20 20 20 20 20 20 20 43 4c 52 20 76 32 2e   #       CLR v2.
15f0: 30 2e 20 20 49 66 20 61 6e 6f 74 68 65 72 20 6d  0.  If another m
1600: 61 6a 6f 72 20 5b 69 6e 63 6f 6d 70 61 74 69 62  ajor [incompatib
1610: 6c 65 5d 20 76 65 72 73 69 6f 6e 20 6f 66 20 74  le] version of t
1620: 68 65 20 43 4c 52 0d 0a 20 20 20 20 20 20 20 20  he CLR..        
1630: 23 20 20 20 20 20 20 20 69 73 20 72 65 6c 65 61  #       is relea
1640: 73 65 64 2c 20 74 68 69 73 20 63 68 65 63 6b 20  sed, this check 
1650: 77 69 6c 6c 20 68 61 76 65 20 74 6f 20 62 65 20  will have to be 
1660: 63 68 61 6e 67 65 64 2e 20 20 54 68 65 20 64 65  changed.  The de
1670: 66 61 75 6c 74 0d 0a 20 20 20 20 20 20 20 20 23  fault..        #
1680: 20 20 20 20 20 20 20 76 65 72 73 69 6f 6e 20 76         version v
1690: 61 6c 75 65 20 66 6f 72 20 61 20 70 61 72 74 69  alue for a parti
16a0: 63 75 6c 61 72 20 43 4c 52 20 76 65 72 73 69 6f  cular CLR versio
16b0: 6e 20 6d 61 79 20 62 65 20 6f 76 65 72 72 69 64  n may be overrid
16c0: 64 65 6e 0d 0a 20 20 20 20 20 20 20 20 23 20 20  den..        #  
16d0: 20 20 20 20 20 62 79 20 73 65 74 74 69 6e 67 20       by setting 
16e0: 74 68 65 20 67 6c 6f 62 61 6c 20 76 61 72 69 61  the global varia
16f0: 62 6c 65 20 22 74 65 73 74 5f 63 6c 72 5f 76 24  ble "test_clr_v$
1700: 58 22 2c 20 77 68 65 72 65 20 22 24 58 22 20 6d  X", where "$X" m
1710: 61 79 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  ay..        #   
1720: 20 20 20 20 5b 63 75 72 72 65 6e 74 6c 79 5d 20      [currently] 
1730: 62 65 20 65 69 74 68 65 72 20 22 32 22 20 6f 72  be either "2" or
1740: 20 22 34 22 2e 0d 0a 20 20 20 20 20 20 20 20 23   "4"...        #
1750: 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 68  ..        if {[h
1760: 61 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 69 6d  aveConstraint im
1770: 61 67 65 52 75 6e 74 69 6d 65 34 30 5d 7d 20 74  ageRuntime40]} t
1780: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
1790: 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74   if {[info exist
17a0: 73 20 3a 3a 74 65 73 74 5f 63 6c 72 5f 76 34 5d  s ::test_clr_v4]
17b0: 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20   && \..         
17c0: 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e       [string len
17d0: 67 74 68 20 24 3a 3a 74 65 73 74 5f 63 6c 72 5f  gth $::test_clr_
17e0: 76 34 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d  v4] > 0} then {.
17f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a  .            #..
1800: 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f              # NO
1810: 54 45 3a 20 55 73 65 20 74 68 65 20 73 70 65 63  TE: Use the spec
1820: 69 66 69 65 64 20 74 65 73 74 20 76 65 72 73 69  ified test versi
1830: 6f 6e 20 66 6f 72 20 74 68 65 20 43 4c 52 20 76  on for the CLR v
1840: 34 2e 30 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  4.0...          
1850: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20    #..           
1860: 20 72 65 74 75 72 6e 20 24 3a 3a 74 65 73 74 5f   return $::test_
1870: 63 6c 72 5f 76 34 0d 0a 20 20 20 20 20 20 20 20  clr_v4..        
1880: 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
1890: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
18a0: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 55         # NOTE: U
18b0: 73 65 20 74 68 65 20 64 65 66 61 75 6c 74 20 74  se the default t
18c0: 65 73 74 20 76 65 72 73 69 6f 6e 20 66 6f 72 20  est version for 
18d0: 74 68 65 20 43 4c 52 20 76 34 2e 30 2e 0d 0a 20  the CLR v4.0... 
18e0: 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
18f0: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
1900: 20 34 2e 30 2e 33 30 33 31 39 3b 20 23 20 54 4f   4.0.30319; # TO
1910: 44 4f 3a 20 47 6f 6f 64 20 22 66 61 6c 6c 62 61  DO: Good "fallba
1920: 63 6b 22 20 64 65 66 61 75 6c 74 3f 0d 0a 20 20  ck" default?..  
1930: 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
1940: 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
1950: 20 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f         if {[info
1960: 20 65 78 69 73 74 73 20 3a 3a 74 65 73 74 5f 63   exists ::test_c
1970: 6c 72 5f 76 32 5d 20 26 26 20 5c 0d 0a 20 20 20  lr_v2] && \..   
1980: 20 20 20 20 20 20 20 20 20 20 20 5b 73 74 72 69             [stri
1990: 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a 74 65 73  ng length $::tes
19a0: 74 5f 63 6c 72 5f 76 32 5d 20 3e 20 30 7d 20 74  t_clr_v2] > 0} t
19b0: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
19c0: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
19d0: 20 20 23 20 4e 4f 54 45 3a 20 55 73 65 20 74 68    # NOTE: Use th
19e0: 65 20 73 70 65 63 69 66 69 65 64 20 74 65 73 74  e specified test
19f0: 20 76 65 72 73 69 6f 6e 20 66 6f 72 20 74 68 65   version for the
1a00: 20 43 4c 52 20 76 32 2e 30 2e 0d 0a 20 20 20 20   CLR v2.0...    
1a10: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
1a20: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 3a         return $:
1a30: 3a 74 65 73 74 5f 63 6c 72 5f 76 32 0d 0a 20 20  :test_clr_v2..  
1a40: 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b          } else {
1a50: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 0d  ..            #.
1a60: 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4e  .            # N
1a70: 4f 54 45 3a 20 55 73 65 20 74 68 65 20 64 65 66  OTE: Use the def
1a80: 61 75 6c 74 20 74 65 73 74 20 76 65 72 73 69 6f  ault test versio
1a90: 6e 20 66 6f 72 20 74 68 65 20 43 4c 52 20 76 32  n for the CLR v2
1aa0: 2e 30 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20  .0...           
1ab0: 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   #..            
1ac0: 72 65 74 75 72 6e 20 32 2e 30 2e 35 30 37 32 37  return 2.0.50727
1ad0: 3b 20 23 20 54 4f 44 4f 3a 20 47 6f 6f 64 20 22  ; # TODO: Good "
1ae0: 66 61 6c 6c 62 61 63 6b 22 20 64 65 66 61 75 6c  fallback" defaul
1af0: 74 3f 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d  t?..          }.
1b00: 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  .        }..    
1b10: 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20    }..    }..... 
1b20: 20 20 20 70 72 6f 63 20 67 65 74 42 75 69 6c 64     proc getBuild
1b30: 59 65 61 72 73 20 7b 7d 20 7b 0d 0a 20 20 20 20  Years {} {..    
1b40: 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
1b50: 45 3a 20 53 65 65 20 69 66 20 74 68 65 20 6c 69  E: See if the li
1b60: 73 74 20 6f 66 20 74 65 73 74 20 79 65 61 72 73  st of test years
1b70: 20 68 61 73 20 62 65 65 6e 20 6f 76 65 72 72 69   has been overri
1b80: 64 64 65 6e 20 62 79 20 74 68 65 20 75 73 65 72  dden by the user
1b90: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
1ba0: 28 65 2e 67 2e 20 6f 6e 20 74 68 65 20 63 6f 6d  (e.g. on the com
1bb0: 6d 61 6e 64 20 6c 69 6e 65 29 2e 0d 0a 20 20 20  mand line)...   
1bc0: 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
1bd0: 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 74  [info exists ::t
1be0: 65 73 74 5f 79 65 61 72 73 5d 20 26 26 20 5b 6c  est_years] && [l
1bf0: 6c 65 6e 67 74 68 20 24 3a 3a 74 65 73 74 5f 79  length $::test_y
1c00: 65 61 72 73 5d 20 3e 20 30 7d 20 74 68 65 6e 20  ears] > 0} then 
1c10: 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
1c20: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 55 73        # NOTE: Us
1c30: 65 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  e the specified 
1c40: 6c 69 73 74 20 6f 66 20 74 65 73 74 20 79 65 61  list of test yea
1c50: 72 73 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  rs...        #..
1c60: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 24          return $
1c70: 3a 3a 74 65 73 74 5f 79 65 61 72 73 0d 0a 20 20  ::test_years..  
1c80: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
1c90: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
1ca0: 20 23 20 4e 4f 54 45 3a 20 55 73 65 20 74 68 65   # NOTE: Use the
1cb0: 20 64 65 66 61 75 6c 74 20 6c 69 73 74 20 6f 66   default list of
1cc0: 20 74 65 73 74 20 79 65 61 72 73 20 28 69 2e 65   test years (i.e
1cd0: 2e 20 61 6c 6c 29 2e 0d 0a 20 20 20 20 20 20 20  . all)...       
1ce0: 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75   #..        retu
1cf0: 72 6e 20 5b 6c 69 73 74 20 32 30 30 35 20 32 30  rn [list 2005 20
1d00: 30 38 20 32 30 31 30 20 32 30 31 32 20 32 30 31  08 2010 2012 201
1d10: 33 20 32 30 31 35 5d 0d 0a 20 20 20 20 20 20 7d  3 2015]..      }
1d20: 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
1d30: 70 72 6f 63 20 67 65 74 42 75 69 6c 64 4e 65 74  proc getBuildNet
1d40: 46 78 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 23  Fx {} {..      #
1d50: 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
1d60: 53 65 65 20 69 66 20 74 68 65 20 74 65 73 74 20  See if the test 
1d70: 2e 4e 45 54 20 46 72 61 6d 65 77 6f 72 6b 20 73  .NET Framework s
1d80: 65 74 74 69 6e 67 20 68 61 73 20 62 65 65 6e 20  etting has been 
1d90: 6f 76 65 72 72 69 64 64 65 6e 20 62 79 0d 0a 20  overridden by.. 
1da0: 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68 65       #       the
1db0: 20 75 73 65 72 20 28 65 2e 67 2e 20 6f 6e 20 74   user (e.g. on t
1dc0: 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 29  he command line)
1dd0: 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
1de0: 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73    if {[info exis
1df0: 74 73 20 3a 3a 74 65 73 74 5f 6e 65 74 5f 66 78  ts ::test_net_fx
1e00: 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20  ] && \..        
1e10: 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68    [string length
1e20: 20 24 3a 3a 74 65 73 74 5f 6e 65 74 5f 66 78 5d   $::test_net_fx]
1e30: 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20   > 0} then {..  
1e40: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
1e50: 20 23 20 4e 4f 54 45 3a 20 55 73 65 20 74 68 65   # NOTE: Use the
1e60: 20 73 70 65 63 69 66 69 65 64 20 74 65 73 74 20   specified test 
1e70: 2e 4e 45 54 20 46 72 61 6d 65 77 6f 72 6b 2e 0d  .NET Framework..
1e80: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
1e90: 20 20 20 20 72 65 74 75 72 6e 20 24 3a 3a 74 65      return $::te
1ea0: 73 74 5f 6e 65 74 5f 66 78 0d 0a 20 20 20 20 20  st_net_fx..     
1eb0: 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
1ec0: 20 20 20 73 65 74 20 79 65 61 72 20 5b 67 65 74     set year [get
1ed0: 42 75 69 6c 64 59 65 61 72 5d 0d 0a 20 20 20 20  BuildYear]..    
1ee0: 20 20 20 20 73 65 74 20 79 65 61 72 56 61 72 4e      set yearVarN
1ef0: 61 6d 65 20 5b 61 70 70 65 6e 64 41 72 67 73 20  ame [appendArgs 
1f00: 3a 3a 74 65 73 74 5f 6e 65 74 5f 66 78 5f 20 24  ::test_net_fx_ $
1f10: 79 65 61 72 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  year]....       
1f20: 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74   if {[info exist
1f30: 73 20 24 79 65 61 72 56 61 72 4e 61 6d 65 5d 20  s $yearVarName] 
1f40: 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  && \..          
1f50: 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68    [string length
1f60: 20 5b 73 65 74 20 24 79 65 61 72 56 61 72 4e 61   [set $yearVarNa
1f70: 6d 65 5d 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b  me]] > 0} then {
1f80: 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20  ..          #.. 
1f90: 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a           # NOTE:
1fa0: 20 55 73 65 20 74 68 65 20 73 70 65 63 69 66 69   Use the specifi
1fb0: 65 64 20 74 65 73 74 20 2e 4e 45 54 20 46 72 61  ed test .NET Fra
1fc0: 6d 65 77 6f 72 6b 2c 20 62 61 73 65 64 20 6f 6e  mework, based on
1fd0: 20 74 68 65 20 62 75 69 6c 64 0d 0a 20 20 20 20   the build..    
1fe0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 79 65        #       ye
1ff0: 61 72 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23  ar...          #
2000: 0d 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ..          retu
2010: 72 6e 20 5b 73 65 74 20 24 79 65 61 72 56 61 72  rn [set $yearVar
2020: 4e 61 6d 65 5d 0d 0a 20 20 20 20 20 20 20 20 7d  Name]..        }
2030: 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
2040: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
2050: 23 20 4e 4f 54 45 3a 20 46 61 6c 6c 62 61 63 6b  # NOTE: Fallback
2060: 20 74 6f 20 74 68 65 20 22 77 65 6c 6c 20 6b 6e   to the "well kn
2070: 6f 77 6e 22 20 2e 4e 45 54 20 46 72 61 6d 65 77  own" .NET Framew
2080: 6f 72 6b 20 76 65 72 73 69 6f 6e 20 74 68 61 74  ork version that
2090: 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 20 20  ..          #   
20a0: 20 20 20 20 69 73 20 6d 6f 73 74 20 63 6c 6f 73      is most clos
20b0: 65 6c 79 20 61 73 73 6f 63 69 61 74 65 64 20 77  ely associated w
20c0: 69 74 68 20 61 20 70 61 72 74 69 63 75 6c 61 72  ith a particular
20d0: 20 76 65 72 73 69 6f 6e 20 6f 66 0d 0a 20 20 20   version of..   
20e0: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 56         #       V
20f0: 69 73 75 61 6c 20 53 74 75 64 69 6f 2e 0d 0a 20  isual Studio... 
2100: 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
2110: 20 20 20 20 20 20 73 77 69 74 63 68 20 2d 65 78        switch -ex
2120: 61 63 74 20 2d 2d 20 24 79 65 61 72 20 7b 0d 0a  act -- $year {..
2130: 20 20 20 20 20 20 20 20 20 20 20 20 32 30 30 35              2005
2140: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
2150: 20 20 72 65 74 75 72 6e 20 6e 65 74 46 78 32 30    return netFx20
2160: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
2170: 0a 20 20 20 20 20 20 20 20 20 20 20 20 32 30 30  .            200
2180: 38 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  8 {..           
2190: 20 20 20 72 65 74 75 72 6e 20 6e 65 74 46 78 33     return netFx3
21a0: 35 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  5..            }
21b0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 32 30  ..            20
21c0: 31 30 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  10 {..          
21d0: 20 20 20 20 72 65 74 75 72 6e 20 6e 65 74 46 78      return netFx
21e0: 34 30 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  40..            
21f0: 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 32  }..            2
2200: 30 31 32 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  012 {..         
2210: 20 20 20 20 20 72 65 74 75 72 6e 20 6e 65 74 46       return netF
2220: 78 34 35 0d 0a 20 20 20 20 20 20 20 20 20 20 20  x45..           
2230: 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   }..            
2240: 32 30 31 33 20 7b 0d 0a 20 20 20 20 20 20 20 20  2013 {..        
2250: 20 20 20 20 20 20 72 65 74 75 72 6e 20 6e 65 74        return net
2260: 46 78 34 35 31 3b 20 23 20 54 4f 44 4f 3a 20 4f  Fx451; # TODO: O
2270: 72 20 22 6e 65 74 46 78 34 35 32 22 3f 0d 0a 20  r "netFx452"?.. 
2280: 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
2290: 20 20 20 20 20 20 20 20 20 20 32 30 31 35 20 7b            2015 {
22a0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
22b0: 72 65 74 75 72 6e 20 6e 65 74 46 78 34 36 3b 20  return netFx46; 
22c0: 23 20 54 4f 44 4f 3a 20 4f 72 20 22 6e 65 74 46  # TODO: Or "netF
22d0: 78 34 36 31 22 3f 0d 0a 20 20 20 20 20 20 20 20  x461"?..        
22e0: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
22f0: 20 20 20 64 65 66 61 75 6c 74 20 7b 0d 0a 20 20     default {..  
2300: 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
2310: 72 6e 20 6e 65 74 46 78 33 35 3b 20 23 20 54 4f  rn netFx35; # TO
2320: 44 4f 3a 20 47 6f 6f 64 20 22 66 61 6c 6c 62 61  DO: Good "fallba
2330: 63 6b 22 20 64 65 66 61 75 6c 74 3f 0d 0a 20 20  ck" default?..  
2340: 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
2350: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
2360: 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20    }..      }..  
2370: 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 23 0d 0a 20    }.....    #.. 
2380: 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 69 73 20     # NOTE: This 
2390: 70 72 6f 63 65 64 75 72 65 20 73 68 6f 75 6c 64  procedure should
23a0: 20 72 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f   return non-zero
23b0: 20 69 66 20 74 68 65 20 63 6f 6e 66 69 67 75 72   if the configur
23c0: 65 64 20 74 65 73 74 0d 0a 20 20 20 20 23 20 20  ed test..    #  
23d0: 20 20 20 20 20 70 6c 61 74 66 6f 72 6d 20 69 73       platform is
23e0: 20 6d 6f 73 74 20 6c 69 6b 65 6c 79 20 74 68 65   most likely the
23f0: 20 64 65 66 61 75 6c 74 20 66 6f 72 20 74 68 69   default for thi
2400: 73 20 6d 61 63 68 69 6e 65 2e 0d 0a 20 20 20 20  s machine...    
2410: 23 0d 0a 20 20 20 20 70 72 6f 63 20 69 73 44 65  #..    proc isDe
2420: 66 61 75 6c 74 42 75 69 6c 64 50 6c 61 74 66 6f  faultBuildPlatfo
2430: 72 6d 20 7b 20 7b 76 65 72 62 6f 73 65 20 66 61  rm { {verbose fa
2440: 6c 73 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20  lse} } {..      
2450: 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
2460: 20 52 75 6e 6e 69 6e 67 20 6f 6e 20 57 6f 57 36   Running on WoW6
2470: 34 20 69 73 20 6e 65 76 65 72 20 74 68 65 20 64  4 is never the d
2480: 65 66 61 75 6c 74 20 70 6c 61 74 66 6f 72 6d 2e  efault platform.
2490: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
24a0: 20 69 66 20 7b 5b 69 73 52 75 6e 6e 69 6e 67 57   if {[isRunningW
24b0: 6f 57 36 34 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  oW64]} then {.. 
24c0: 20 20 20 20 20 20 20 69 66 20 7b 24 76 65 72 62         if {$verb
24d0: 6f 73 65 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  ose} then {..   
24e0: 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
24f0: 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5c 0d 0a  test_channel \..
2500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d                "-
2510: 2d 2d 2d 20 64 65 74 65 63 74 65 64 20 6e 6f 6e  --- detected non
2520: 2d 64 65 66 61 75 6c 74 20 70 6c 61 74 66 6f 72  -default platfor
2530: 6d 20 28 57 6f 57 36 34 29 5c 6e 22 0d 0a 20 20  m (WoW64)\n"..  
2540: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
2550: 20 72 65 74 75 72 6e 20 66 61 6c 73 65 0d 0a 20   return false.. 
2560: 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
2570: 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
2580: 20 54 68 69 73 20 68 61 73 20 61 20 67 6f 6f 64   This has a good
2590: 20 63 68 61 6e 63 65 20 6f 66 20 62 65 69 6e 67   chance of being
25a0: 20 74 68 65 20 64 65 66 61 75 6c 74 20 70 6c 61   the default pla
25b0: 74 66 6f 72 6d 2e 0d 0a 20 20 20 20 20 20 23 0d  tform...      #.
25c0: 0a 20 20 20 20 20 20 69 66 20 7b 24 76 65 72 62  .      if {$verb
25d0: 6f 73 65 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  ose} then {..   
25e0: 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
25f0: 73 74 5f 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d  st_channel "----
2600: 20 64 65 74 65 63 74 65 64 20 64 65 66 61 75 6c   detected defaul
2610: 74 20 70 6c 61 74 66 6f 72 6d 5c 6e 22 0d 0a 20  t platform\n".. 
2620: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 72 65       }..      re
2630: 74 75 72 6e 20 74 72 75 65 0d 0a 20 20 20 20 7d  turn true..    }
2640: 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65  .....    proc ge
2650: 74 42 75 69 6c 64 50 6c 61 74 66 6f 72 6d 20 7b  tBuildPlatform {
2660: 20 6e 61 74 69 76 65 20 7d 20 7b 0d 0a 20 20 20   native } {..   
2670: 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69     if {[info exi
2680: 73 74 73 20 3a 3a 74 65 73 74 5f 70 6c 61 74 66  sts ::test_platf
2690: 6f 72 6d 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20  orm] && \..     
26a0: 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e       [string len
26b0: 67 74 68 20 24 3a 3a 74 65 73 74 5f 70 6c 61 74  gth $::test_plat
26c0: 66 6f 72 6d 5d 20 3e 20 30 7d 20 74 68 65 6e 20  form] > 0} then 
26d0: 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
26e0: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 55 73        # NOTE: Us
26f0: 65 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  e the specified 
2700: 74 65 73 74 20 70 6c 61 74 66 6f 72 6d 2e 20 20  test platform.  
2710: 49 66 20 74 68 69 73 20 76 61 72 69 61 62 6c 65  If this variable
2720: 20 69 73 20 6e 6f 74 20 73 65 74 2c 0d 0a 20 20   is not set,..  
2730: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68        #       th
2740: 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20  e default value 
2750: 77 69 6c 6c 20 62 65 20 62 61 73 65 64 20 6f 6e  will be based on
2760: 20 74 68 65 20 6d 61 63 68 69 6e 65 20 61 72 63   the machine arc
2770: 68 69 74 65 63 74 75 72 65 2e 0d 0a 20 20 20 20  hitecture...    
2780: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72      #..        r
2790: 65 74 75 72 6e 20 5b 65 78 70 72 20 7b 24 6e 61  eturn [expr {$na
27a0: 74 69 76 65 20 3f 20 24 3a 3a 74 65 73 74 5f 70  tive ? $::test_p
27b0: 6c 61 74 66 6f 72 6d 20 3a 20 22 22 7d 5d 0d 0a  latform : ""}]..
27c0: 20 20 20 20 20 20 7d 20 65 6c 73 65 69 66 20 7b        } elseif {
27d0: 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 74  [info exists ::t
27e0: 65 73 74 5f 6d 61 63 68 69 6e 65 5d 20 26 26 20  est_machine] && 
27f0: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 73 74  \..          [st
2800: 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a 74  ring length $::t
2810: 65 73 74 5f 6d 61 63 68 69 6e 65 5d 20 3e 20 30  est_machine] > 0
2820: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
2830: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
2840: 4f 54 45 3a 20 46 6f 72 20 6e 61 74 69 76 65 20  OTE: For native 
2850: 62 75 69 6c 64 73 2c 20 72 65 74 75 72 6e 20 74  builds, return t
2860: 68 65 20 70 6c 61 74 66 6f 72 6d 20 6e 61 6d 65  he platform name
2870: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74   corresponding t
2880: 6f 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  o..        #    
2890: 20 20 20 74 68 65 20 74 65 73 74 20 6d 61 63 68     the test mach
28a0: 69 6e 65 20 61 72 63 68 69 74 65 63 74 75 72 65  ine architecture
28b0: 3b 20 6f 74 68 65 72 77 69 73 65 2c 20 72 65 74  ; otherwise, ret
28c0: 75 72 6e 20 61 6e 20 65 6d 70 74 79 0d 0a 20 20  urn an empty..  
28d0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 73 74        #       st
28e0: 72 69 6e 67 2e 0d 0a 20 20 20 20 20 20 20 20 23  ring...        #
28f0: 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ..        return
2900: 20 5b 65 78 70 72 20 7b 0d 0a 20 20 20 20 20 20   [expr {..      
2910: 20 20 20 20 24 6e 61 74 69 76 65 20 3f 20 5b 6d      $native ? [m
2920: 61 63 68 69 6e 65 54 6f 50 6c 61 74 66 6f 72 6d  achineToPlatform
2930: 20 24 3a 3a 74 65 73 74 5f 6d 61 63 68 69 6e 65   $::test_machine
2940: 5d 20 3a 20 22 22 0d 0a 20 20 20 20 20 20 20 20  ] : ""..        
2950: 7d 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65  }]..      } else
2960: 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73  if {[info exists
2970: 20 3a 3a 74 63 6c 5f 70 6c 61 74 66 6f 72 6d 28   ::tcl_platform(
2980: 6d 61 63 68 69 6e 65 29 5d 7d 20 74 68 65 6e 20  machine)]} then 
2990: 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
29a0: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 46 6f        # NOTE: Fo
29b0: 72 20 6e 61 74 69 76 65 20 62 75 69 6c 64 73 2c  r native builds,
29c0: 20 72 65 74 75 72 6e 20 74 68 65 20 70 6c 61 74   return the plat
29d0: 66 6f 72 6d 20 6e 61 6d 65 20 63 6f 72 72 65 73  form name corres
29e0: 70 6f 6e 64 69 6e 67 20 74 6f 0d 0a 20 20 20 20  ponding to..    
29f0: 20 20 20 20 23 20 20 20 20 20 20 20 74 68 65 20      #       the 
2a00: 6d 61 63 68 69 6e 65 20 61 72 63 68 69 74 65 63  machine architec
2a10: 74 75 72 65 3b 20 6f 74 68 65 72 77 69 73 65 2c  ture; otherwise,
2a20: 20 72 65 74 75 72 6e 20 61 6e 20 65 6d 70 74 79   return an empty
2a30: 20 73 74 72 69 6e 67 2e 0d 0a 20 20 20 20 20 20   string...      
2a40: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74    #..        ret
2a50: 75 72 6e 20 5b 65 78 70 72 20 7b 0d 0a 20 20 20  urn [expr {..   
2a60: 20 20 20 20 20 20 20 24 6e 61 74 69 76 65 20 3f         $native ?
2a70: 20 5b 6d 61 63 68 69 6e 65 54 6f 50 6c 61 74 66   [machineToPlatf
2a80: 6f 72 6d 20 24 3a 3a 74 63 6c 5f 70 6c 61 74 66  orm $::tcl_platf
2a90: 6f 72 6d 28 6d 61 63 68 69 6e 65 29 5d 20 3a 20  orm(machine)] : 
2aa0: 22 22 0d 0a 20 20 20 20 20 20 20 20 7d 5d 0d 0a  ""..        }]..
2ab0: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
2ac0: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
2ad0: 20 20 20 23 20 4e 4f 54 45 3a 20 4e 6f 20 6d 61     # NOTE: No ma
2ae0: 63 68 69 6e 65 20 61 72 63 68 69 74 65 63 74 75  chine architectu
2af0: 72 65 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2c  re is available,
2b00: 20 72 65 74 75 72 6e 20 61 6e 20 65 6d 70 74 79   return an empty
2b10: 20 73 74 72 69 6e 67 2e 0d 0a 20 20 20 20 20 20   string...      
2b20: 20 20 23 20 20 20 20 20 20 20 49 74 20 69 73 20    #       It is 
2b30: 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 72 65 74  important to ret
2b40: 75 72 6e 20 61 6e 20 65 6d 70 74 79 20 73 74 72  urn an empty str
2b50: 69 6e 67 20 68 65 72 65 20 62 65 63 61 75 73 65  ing here because
2b60: 20 74 68 65 0d 0a 20 20 20 20 20 20 20 20 23 20   the..        # 
2b70: 20 20 20 20 20 20 72 65 73 75 6c 74 20 6f 66 20        result of 
2b80: 74 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 6d  this procedure m
2b90: 61 79 20 62 65 20 75 73 65 64 20 77 69 74 68 20  ay be used with 
2ba0: 5b 66 69 6c 65 20 6a 6f 69 6e 5d 2e 0d 0a 20 20  [file join]...  
2bb0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
2bc0: 20 72 65 74 75 72 6e 20 22 22 0d 0a 20 20 20 20   return ""..    
2bd0: 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20    }..    }..... 
2be0: 20 20 20 70 72 6f 63 20 67 65 74 42 75 69 6c 64     proc getBuild
2bf0: 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 7b 7d  Configuration {}
2c00: 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20   {..      #..   
2c10: 20 20 20 23 20 4e 4f 54 45 3a 20 53 65 65 20 69     # NOTE: See i
2c20: 66 20 74 68 65 20 22 63 6f 6e 66 69 67 75 72 61  f the "configura
2c30: 74 69 6f 6e 22 20 73 65 74 74 69 6e 67 20 68 61  tion" setting ha
2c40: 73 20 62 65 65 6e 20 6f 76 65 72 72 69 64 64 65  s been overridde
2c50: 6e 20 62 79 20 74 68 65 0d 0a 20 20 20 20 20 20  n by the..      
2c60: 23 20 20 20 20 20 20 20 75 73 65 72 20 28 65 2e  #       user (e.
2c70: 67 2e 20 6f 6e 20 74 68 65 20 63 6f 6d 6d 61 6e  g. on the comman
2c80: 64 20 6c 69 6e 65 29 2e 20 20 54 68 69 73 20 68  d line).  This h
2c90: 65 6c 70 73 20 63 6f 6e 74 72 6f 6c 20 65 78 61  elps control exa
2ca0: 63 74 6c 79 0d 0a 20 20 20 20 20 20 23 20 20 20  ctly..      #   
2cb0: 20 20 20 20 77 68 69 63 68 20 73 65 74 20 6f 66      which set of
2cc0: 20 62 69 6e 61 72 69 65 73 20 77 65 20 61 72 65   binaries we are
2cd0: 20 74 65 73 74 69 6e 67 20 28 69 2e 65 2e 20 74   testing (i.e. t
2ce0: 68 6f 73 65 20 62 75 69 6c 74 20 69 6e 20 74 68  hose built in th
2cf0: 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  e..      #      
2d00: 20 22 44 65 62 75 67 22 20 6f 72 20 22 52 65 6c   "Debug" or "Rel
2d10: 65 61 73 65 22 20 62 75 69 6c 64 20 63 6f 6e 66  ease" build conf
2d20: 69 67 75 72 61 74 69 6f 6e 73 29 2e 20 20 54 6f  igurations).  To
2d30: 20 6f 76 65 72 72 69 64 65 20 74 68 69 73 0d 0a   override this..
2d40: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 76 61        #       va
2d50: 6c 75 65 20 76 69 61 20 74 68 65 20 63 6f 6d 6d  lue via the comm
2d60: 61 6e 64 20 6c 69 6e 65 2c 20 65 6e 74 65 72 20  and line, enter 
2d70: 61 20 63 6f 6d 6d 61 6e 64 20 73 69 6d 69 6c 61  a command simila
2d80: 72 20 74 6f 20 6f 6e 65 20 6f 66 0d 0a 20 20 20  r to one of..   
2d90: 20 20 20 23 20 20 20 20 20 20 20 74 68 65 20 66     #       the f
2da0: 6f 6c 6c 6f 77 69 6e 67 20 28 61 6c 6c 20 6f 6e  ollowing (all on
2db0: 20 6f 6e 65 20 6c 69 6e 65 29 3a 0d 0a 20 20 20   one line):..   
2dc0: 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 20 20     #..      #   
2dd0: 20 20 20 20 45 61 67 6c 65 53 68 65 6c 6c 2e 65      EagleShell.e
2de0: 78 65 20 2d 61 6e 79 49 6e 69 74 69 61 6c 69 7a  xe -anyInitializ
2df0: 65 20 22 73 65 74 20 74 65 73 74 5f 63 6f 6e 66  e "set test_conf
2e00: 69 67 75 72 61 74 69 6f 6e 20 44 65 62 75 67 22  iguration Debug"
2e10: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
2e20: 20 20 2d 66 69 6c 65 20 2e 5c 70 61 74 68 5c 74    -file .\path\t
2e30: 6f 5c 61 6c 6c 2e 65 61 67 6c 65 0d 0a 20 20 20  o\all.eagle..   
2e40: 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 20 20     #..      #   
2e50: 20 20 20 20 45 61 67 6c 65 53 68 65 6c 6c 2e 65      EagleShell.e
2e60: 78 65 20 2d 61 6e 79 49 6e 69 74 69 61 6c 69 7a  xe -anyInitializ
2e70: 65 20 22 73 65 74 20 74 65 73 74 5f 63 6f 6e 66  e "set test_conf
2e80: 69 67 75 72 61 74 69 6f 6e 20 52 65 6c 65 61 73  iguration Releas
2e90: 65 22 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  e"..      #     
2ea0: 20 20 20 20 2d 66 69 6c 65 20 2e 5c 70 61 74 68      -file .\path
2eb0: 5c 74 6f 5c 61 6c 6c 2e 65 61 67 6c 65 0d 0a 20  \to\all.eagle.. 
2ec0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
2ed0: 20 20 20 20 20 20 45 61 67 6c 65 53 68 65 6c 6c        EagleShell
2ee0: 2e 65 78 65 20 2d 66 69 6c 65 20 2e 5c 70 61 74  .exe -file .\pat
2ef0: 68 5c 74 6f 5c 61 6c 6c 2e 65 61 67 6c 65 20 2d  h\to\all.eagle -
2f00: 70 72 65 54 65 73 74 0d 0a 20 20 20 20 20 20 23  preTest..      #
2f10: 20 20 20 20 20 20 20 20 20 22 75 6e 73 65 74 20           "unset 
2f20: 2d 6e 6f 63 6f 6d 70 6c 61 69 6e 20 74 65 73 74  -nocomplain test
2f30: 5f 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 22 0d  _configuration".
2f40: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
2f50: 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73  if {[info exists
2f60: 20 3a 3a 74 65 73 74 5f 63 6f 6e 66 69 67 75 72   ::test_configur
2f70: 61 74 69 6f 6e 5d 20 26 26 20 5c 0d 0a 20 20 20  ation] && \..   
2f80: 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c         [string l
2f90: 65 6e 67 74 68 20 24 3a 3a 74 65 73 74 5f 63 6f  ength $::test_co
2fa0: 6e 66 69 67 75 72 61 74 69 6f 6e 5d 20 3e 20 30  nfiguration] > 0
2fb0: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
2fc0: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
2fd0: 4f 54 45 3a 20 55 73 65 20 74 68 65 20 73 70 65  OTE: Use the spe
2fe0: 63 69 66 69 65 64 20 74 65 73 74 20 63 6f 6e 66  cified test conf
2ff0: 69 67 75 72 61 74 69 6f 6e 2e 20 20 54 68 65 20  iguration.  The 
3000: 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20 75 73  default value us
3010: 65 64 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  ed..        #   
3020: 20 20 20 20 66 6f 72 20 74 68 69 73 20 76 61 72      for this var
3030: 69 61 62 6c 65 20 69 73 20 74 79 70 69 63 61 6c  iable is typical
3040: 6c 79 20 22 52 65 6c 65 61 73 65 22 2c 20 61 73  ly "Release", as
3050: 20 73 65 74 20 62 79 20 74 68 65 20 74 65 73 74   set by the test
3060: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
3070: 20 20 73 75 69 74 65 20 69 74 73 65 6c 66 2e 0d    suite itself..
3080: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
3090: 20 20 20 20 72 65 74 75 72 6e 20 24 3a 3a 74 65      return $::te
30a0: 73 74 5f 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  st_configuration
30b0: 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b  ..      } else {
30c0: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
30d0: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4e 6f 72       # NOTE: Nor
30e0: 6d 61 6c 6c 79 2c 20 77 65 20 77 69 6c 6c 20 6e  mally, we will n
30f0: 65 76 65 72 20 68 69 74 20 74 68 69 73 20 63 61  ever hit this ca
3100: 73 65 20 62 65 63 61 75 73 65 20 74 68 65 20 76  se because the v
3110: 61 6c 75 65 20 6f 66 20 74 68 65 0d 0a 20 20 20  alue of the..   
3120: 20 20 20 20 20 23 20 20 20 20 20 20 20 74 65 73       #       tes
3130: 74 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  t configuration 
3140: 76 61 72 69 61 62 6c 65 20 69 73 20 61 6c 77 61  variable is alwa
3150: 79 73 20 73 65 74 20 62 79 20 74 68 65 20 74 65  ys set by the te
3160: 73 74 20 73 75 69 74 65 0d 0a 20 20 20 20 20 20  st suite..      
3170: 20 20 23 20 20 20 20 20 20 20 69 74 73 65 6c 66    #       itself
3180: 3b 20 68 6f 77 65 76 65 72 2c 20 69 74 20 63 61  ; however, it ca
3190: 6e 20 62 65 20 6f 76 65 72 72 69 64 64 65 6e 20  n be overridden 
31a0: 75 73 69 6e 67 20 74 68 65 20 75 6e 73 65 74 20  using the unset 
31b0: 63 6f 6d 6d 61 6e 64 0d 0a 20 20 20 20 20 20 20  command..       
31c0: 20 23 20 20 20 20 20 20 20 66 72 6f 6d 20 74 68   #       from th
31d0: 65 20 2d 70 72 65 54 65 73 74 20 6f 70 74 69 6f  e -preTest optio
31e0: 6e 20 74 6f 20 74 68 65 20 74 65 73 74 20 73 75  n to the test su
31f0: 69 74 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  ite...        #.
3200: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
3210: 24 3a 3a 65 61 67 6c 65 5f 70 6c 61 74 66 6f 72  $::eagle_platfor
3220: 6d 28 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 29  m(configuration)
3230: 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d  ..      }..    }
3240: 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65  .....    proc ge
3250: 74 42 75 69 6c 64 43 6f 6e 66 69 67 75 72 61 74  tBuildConfigurat
3260: 69 6f 6e 73 20 7b 7d 20 7b 0d 0a 20 20 20 20 20  ions {} {..     
3270: 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
3280: 3a 20 53 65 65 20 69 66 20 74 68 65 20 6c 69 73  : See if the lis
3290: 74 20 6f 66 20 74 65 73 74 20 63 6f 6e 66 69 67  t of test config
32a0: 75 72 61 74 69 6f 6e 73 20 68 61 73 20 62 65 65  urations has bee
32b0: 6e 20 6f 76 65 72 72 69 64 64 65 6e 20 62 79 0d  n overridden by.
32c0: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74  .      #       t
32d0: 68 65 20 75 73 65 72 20 28 65 2e 67 2e 20 6f 6e  he user (e.g. on
32e0: 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e   the command lin
32f0: 65 29 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  e)...      #..  
3300: 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78      if {[info ex
3310: 69 73 74 73 20 3a 3a 74 65 73 74 5f 63 6f 6e 66  ists ::test_conf
3320: 69 67 75 72 61 74 69 6f 6e 73 5d 20 26 26 20 5c  igurations] && \
3330: 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 6c 6c 65  ..          [lle
3340: 6e 67 74 68 20 24 3a 3a 74 65 73 74 5f 63 6f 6e  ngth $::test_con
3350: 66 69 67 75 72 61 74 69 6f 6e 73 5d 20 3e 20 30  figurations] > 0
3360: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
3370: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
3380: 4f 54 45 3a 20 55 73 65 20 74 68 65 20 73 70 65  OTE: Use the spe
3390: 63 69 66 69 65 64 20 6c 69 73 74 20 6f 66 20 74  cified list of t
33a0: 65 73 74 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  est configuratio
33b0: 6e 73 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  ns...        #..
33c0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 24          return $
33d0: 3a 3a 74 65 73 74 5f 63 6f 6e 66 69 67 75 72 61  ::test_configura
33e0: 74 69 6f 6e 73 0d 0a 20 20 20 20 20 20 7d 20 65  tions..      } e
33f0: 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  lse {..        #
3400: 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
3410: 3a 20 55 73 65 20 74 68 65 20 64 65 66 61 75 6c  : Use the defaul
3420: 74 20 6c 69 73 74 20 6f 66 20 74 65 73 74 20 63  t list of test c
3430: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 73 2e 0d 0a  onfigurations...
3440: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
3450: 20 20 20 72 65 74 75 72 6e 20 5b 6c 69 73 74 20     return [list 
3460: 44 65 62 75 67 20 52 65 6c 65 61 73 65 5d 0d 0a  Debug Release]..
3470: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a        }..    }..
3480: 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74 42  ...    proc getB
3490: 75 69 6c 64 42 61 73 65 44 69 72 65 63 74 6f 72  uildBaseDirector
34a0: 79 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d  y {} {..      #.
34b0: 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 46  .      # NOTE: F
34c0: 69 67 75 72 65 20 6f 75 74 20 74 68 65 20 62 61  igure out the ba
34d0: 73 65 20 64 69 72 65 63 74 6f 72 79 20 77 68 65  se directory whe
34e0: 72 65 20 61 6c 6c 20 74 68 65 20 62 75 69 6c 64  re all the build
34f0: 73 20 73 68 6f 75 6c 64 20 62 65 0d 0a 20 20 20  s should be..   
3500: 20 20 20 23 20 20 20 20 20 20 20 6c 6f 63 61 74     #       locat
3510: 65 64 2e 20 20 54 68 69 73 20 77 69 6c 6c 20 62  ed.  This will b
3520: 65 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20  e the directory 
3530: 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68  that contains th
3540: 65 20 61 63 74 75 61 6c 0d 0a 20 20 20 20 20 20  e actual..      
3550: 23 20 20 20 20 20 20 20 62 75 69 6c 64 20 6f 75  #       build ou
3560: 74 70 75 74 20 64 69 72 65 63 74 6f 72 79 20 28  tput directory (
3570: 65 2e 67 2e 20 70 61 72 65 6e 74 20 6f 66 20 22  e.g. parent of "
3580: 62 69 6e 22 29 2e 0d 0a 20 20 20 20 20 20 23 0d  bin")...      #.
3590: 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f  .      if {[info
35a0: 20 65 78 69 73 74 73 20 3a 3a 62 75 69 6c 64 5f   exists ::build_
35b0: 62 61 73 65 5f 64 69 72 65 63 74 6f 72 79 5d 20  base_directory] 
35c0: 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  && \..          
35d0: 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
35e0: 3a 3a 62 75 69 6c 64 5f 62 61 73 65 5f 64 69 72  ::build_base_dir
35f0: 65 63 74 6f 72 79 5d 20 3e 20 30 7d 20 74 68 65  ectory] > 0} the
3600: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  n {..        #..
3610: 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
3620: 54 68 65 20 6c 6f 63 61 74 69 6f 6e 20 6f 66 20  The location of 
3630: 74 68 65 20 62 75 69 6c 64 20 62 61 73 65 20 64  the build base d
3640: 69 72 65 63 74 6f 72 79 20 68 61 73 20 62 65 65  irectory has bee
3650: 6e 20 6f 76 65 72 72 69 64 64 65 6e 3b 0d 0a 20  n overridden;.. 
3660: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74         #       t
3670: 68 65 72 65 66 6f 72 65 2c 20 75 73 65 20 69 74  herefore, use it
3680: 20 76 65 72 62 61 74 69 6d 2e 0d 0a 20 20 20 20   verbatim...    
3690: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72      #..        r
36a0: 65 74 75 72 6e 20 24 3a 3a 62 75 69 6c 64 5f 62  eturn $::build_b
36b0: 61 73 65 5f 64 69 72 65 63 74 6f 72 79 0d 0a 20  ase_directory.. 
36c0: 20 20 20 20 20 7d 20 65 6c 73 65 69 66 20 7b 5b       } elseif {[
36d0: 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 63 6f  info exists ::co
36e0: 6d 6d 6f 6e 5f 64 69 72 65 63 74 6f 72 79 5d 20  mmon_directory] 
36f0: 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  && \..          
3700: 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
3710: 3a 3a 63 6f 6d 6d 6f 6e 5f 64 69 72 65 63 74 6f  ::common_directo
3720: 72 79 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d  ry] > 0} then {.
3730: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
3740: 20 20 20 20 23 20 4e 4f 54 45 3a 20 4e 65 78 74      # NOTE: Next
3750: 2c 20 66 61 6c 6c 62 61 63 6b 20 74 6f 20 74 68  , fallback to th
3760: 65 20 67 72 61 6e 64 70 61 72 65 6e 74 20 64 69  e grandparent di
3770: 72 65 63 74 6f 72 79 20 6f 66 20 74 68 65 20 6f  rectory of the o
3780: 6e 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  ne..        #   
3790: 20 20 20 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74      containing t
37a0: 68 69 73 20 66 69 6c 65 20 28 69 2e 65 2e 20 22  his file (i.e. "
37b0: 63 6f 6d 6d 6f 6e 2e 65 61 67 6c 65 22 29 2c 20  common.eagle"), 
37c0: 69 66 20 61 76 61 69 6c 61 62 6c 65 2e 0d 0a 20  if available... 
37d0: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
37e0: 20 20 72 65 74 75 72 6e 20 5b 66 69 6c 65 20 64    return [file d
37f0: 69 72 6e 61 6d 65 20 5b 66 69 6c 65 20 64 69 72  irname [file dir
3800: 6e 61 6d 65 20 24 3a 3a 63 6f 6d 6d 6f 6e 5f 64  name $::common_d
3810: 69 72 65 63 74 6f 72 79 5d 5d 0d 0a 20 20 20 20  irectory]]..    
3820: 20 20 7d 20 65 6c 73 65 69 66 20 7b 5b 69 6e 66    } elseif {[inf
3830: 6f 20 65 78 69 73 74 73 20 3a 3a 70 61 74 68 5d  o exists ::path]
3840: 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20   && \..         
3850: 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20   [string length 
3860: 24 3a 3a 70 61 74 68 5d 20 3e 20 30 7d 20 74 68  $::path] > 0} th
3870: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d  en {..        #.
3880: 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
3890: 20 46 69 6e 61 6c 6c 79 2c 20 66 61 6c 6c 62 61   Finally, fallba
38a0: 63 6b 20 74 6f 20 74 68 65 20 70 61 72 65 6e 74  ck to the parent
38b0: 20 64 69 72 65 63 74 6f 72 79 20 6f 66 20 74 68   directory of th
38c0: 65 20 45 61 67 6c 65 54 65 73 74 0d 0a 20 20 20  e EagleTest..   
38d0: 20 20 20 20 20 23 20 20 20 20 20 20 20 70 61 74       #       pat
38e0: 68 2e 20 20 54 68 65 20 45 61 67 6c 65 54 65 73  h.  The EagleTes
38f0: 74 20 70 61 63 6b 61 67 65 20 67 75 61 72 61 6e  t package guaran
3900: 74 65 65 73 20 74 68 61 74 20 74 68 69 73 20 76  tees that this v
3910: 61 72 69 61 62 6c 65 0d 0a 20 20 20 20 20 20 20  ariable..       
3920: 20 23 20 20 20 20 20 20 20 77 69 6c 6c 20 62 65   #       will be
3930: 20 73 65 74 20 74 6f 20 74 68 65 20 64 69 72 65   set to the dire
3940: 63 74 6f 72 79 20 63 6f 6e 74 61 69 6e 69 6e 67  ctory containing
3950: 20 74 68 65 20 66 69 72 73 74 20 66 69 6c 65 20   the first file 
3960: 74 6f 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  to..        #   
3970: 20 20 20 20 65 78 65 63 75 74 65 20 74 68 65 20      execute the 
3980: 5b 72 75 6e 54 65 73 74 50 72 6f 6c 6f 67 75 65  [runTestPrologue
3990: 5d 20 73 63 72 69 70 74 20 6c 69 62 72 61 72 79  ] script library
39a0: 20 70 72 6f 63 65 64 75 72 65 2e 0d 0a 20 20 20   procedure...   
39b0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
39c0: 72 65 74 75 72 6e 20 5b 66 69 6c 65 20 64 69 72  return [file dir
39d0: 6e 61 6d 65 20 24 3a 3a 70 61 74 68 5d 0d 0a 20  name $::path].. 
39e0: 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
39f0: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
3a00: 20 20 23 20 4e 4f 54 45 3a 20 4e 6f 20 70 61 74    # NOTE: No pat
3a10: 68 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2c 20  h is available, 
3a20: 72 65 74 75 72 6e 20 61 6e 20 65 6d 70 74 79 20  return an empty 
3a30: 73 74 72 69 6e 67 2e 20 20 54 68 69 73 20 70 6f  string.  This po
3a40: 69 6e 74 0d 0a 20 20 20 20 20 20 20 20 23 20 20  int..        #  
3a50: 20 20 20 20 20 73 68 6f 75 6c 64 20 6e 6f 74 20       should not 
3a60: 62 65 20 72 65 61 63 68 65 64 2e 0d 0a 20 20 20  be reached...   
3a70: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
3a80: 72 65 74 75 72 6e 20 22 22 0d 0a 20 20 20 20 20  return ""..     
3a90: 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20   }..    }.....  
3aa0: 20 20 70 72 6f 63 20 67 65 74 53 51 4c 69 74 65    proc getSQLite
3ab0: 54 65 73 74 44 61 74 61 50 61 74 68 20 7b 7d 20  TestDataPath {} 
3ac0: 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  {..      #..    
3ad0: 20 20 23 20 4e 4f 54 45 3a 20 46 69 67 75 72 65    # NOTE: Figure
3ae0: 20 6f 75 74 20 74 68 65 20 64 69 72 65 63 74 6f   out the directo
3af0: 72 79 20 77 68 65 72 65 20 61 6c 6c 20 74 68 65  ry where all the
3b00: 20 74 65 73 74 20 64 61 74 61 20 66 69 6c 65 73   test data files
3b10: 20 73 68 6f 75 6c 64 0d 0a 20 20 20 20 20 20 23   should..      #
3b20: 20 20 20 20 20 20 20 62 65 20 6c 6f 63 61 74 65         be locate
3b30: 64 2e 20 20 54 68 69 73 20 73 68 6f 75 6c 64 20  d.  This should 
3b40: 62 65 20 74 68 65 20 22 64 61 74 61 22 20 64 69  be the "data" di
3b50: 72 65 63 74 6f 72 79 20 62 65 6e 65 61 74 68 20  rectory beneath 
3b60: 74 68 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20  the..      #    
3b70: 20 20 20 64 69 72 65 63 74 6f 72 79 20 63 6f 6e     directory con
3b80: 74 61 69 6e 69 6e 67 20 74 68 65 20 61 63 74 75  taining the actu
3b90: 61 6c 20 74 65 73 74 20 73 63 72 69 70 74 73 2e  al test scripts.
3ba0: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
3bb0: 20 72 65 74 75 72 6e 20 5b 66 69 6c 65 20 6a 6f   return [file jo
3bc0: 69 6e 20 24 3a 3a 70 61 74 68 20 64 61 74 61 5d  in $::path data]
3bd0: 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
3be0: 70 72 6f 63 20 69 73 52 75 6e 6e 69 6e 67 57 6f  proc isRunningWo
3bf0: 57 36 34 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20  W64 {} {..      
3c00: 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
3c10: 20 46 6f 72 20 6e 6f 77 2c 20 6a 75 73 74 20 75   For now, just u
3c20: 73 65 20 74 68 65 20 65 78 69 73 74 69 6e 67 20  se the existing 
3c30: 74 65 73 74 20 63 6f 6e 73 74 72 61 69 6e 74 20  test constraint 
3c40: 66 6f 72 20 64 65 74 65 63 74 69 6e 67 0d 0a 20  for detecting.. 
3c50: 20 20 20 20 20 23 20 20 20 20 20 20 20 61 20 57       #       a W
3c60: 6f 57 36 34 20 70 72 6f 63 65 73 73 2e 0d 0a 20  oW64 process... 
3c70: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 72 65       #..      re
3c80: 74 75 72 6e 20 5b 68 61 76 65 43 6f 6e 73 74 72  turn [haveConstr
3c90: 61 69 6e 74 20 77 6f 77 36 34 5d 0d 0a 20 20 20  aint wow64]..   
3ca0: 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
3cb0: 69 73 4d 69 78 65 64 4d 6f 64 65 41 73 73 65 6d  isMixedModeAssem
3cc0: 62 6c 79 20 7b 20 66 69 6c 65 4e 61 6d 65 20 7b  bly { fileName {
3cd0: 76 61 72 4e 61 6d 65 20 22 22 7d 20 7d 20 7b 0d  varName ""} } {.
3ce0: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
3cf0: 23 20 4e 4f 54 45 3a 20 46 69 72 73 74 2c 20 6d  # NOTE: First, m
3d00: 61 6b 65 20 73 75 72 65 20 74 68 65 20 74 65 73  ake sure the tes
3d10: 74 20 73 75 69 74 65 20 69 6e 66 72 61 73 74 72  t suite infrastr
3d20: 75 63 74 75 72 65 20 69 73 20 61 6c 6c 6f 77 65  ucture is allowe
3d30: 64 20 74 6f 0d 0a 20 20 20 20 20 20 23 20 20 20  d to..      #   
3d40: 20 20 20 20 75 73 65 20 74 68 65 20 5b 65 78 65      use the [exe
3d50: 63 5d 20 63 6f 6d 6d 61 6e 64 2e 0d 0a 20 20 20  c] command...   
3d60: 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
3d70: 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  ![info exists ::
3d80: 6e 6f 28 65 78 65 63 29 5d 20 26 26 20 21 5b 69  no(exec)] && ![i
3d90: 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28  nfo exists ::no(
3da0: 63 6f 72 46 6c 61 67 73 29 5d 7d 20 74 68 65 6e  corFlags)]} then
3db0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20   {..        #.. 
3dc0: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49         # NOTE: I
3dd0: 66 20 74 68 65 20 6c 6f 63 61 74 69 6f 6e 20 6f  f the location o
3de0: 66 20 43 6f 72 46 6c 61 67 73 20 69 73 20 70 72  f CorFlags is pr
3df0: 65 73 65 6e 74 20 69 6e 20 74 68 65 20 65 6e 76  esent in the env
3e00: 69 72 6f 6e 6d 65 6e 74 2c 0d 0a 20 20 20 20 20  ironment,..     
3e10: 20 20 20 23 20 20 20 20 20 20 20 75 73 65 20 69     #       use i
3e20: 74 3b 20 6f 74 68 65 72 77 69 73 65 20 61 73 73  t; otherwise ass
3e30: 75 6d 65 20 69 74 20 69 73 20 69 6e 20 74 68 65  ume it is in the
3e40: 20 50 41 54 48 2e 0d 0a 20 20 20 20 20 20 20 20   PATH...        
3e50: 23 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 63  #..        set c
3e60: 6f 72 46 6c 61 67 73 20 5b 65 78 70 72 20 7b 0d  orFlags [expr {.
3e70: 0a 20 20 20 20 20 20 20 20 20 20 5b 69 6e 66 6f  .          [info
3e80: 20 65 78 69 73 74 73 20 3a 3a 65 6e 76 28 43 6f   exists ::env(Co
3e90: 72 46 6c 61 67 73 29 5d 20 3f 20 24 3a 3a 65 6e  rFlags)] ? $::en
3ea0: 76 28 43 6f 72 46 6c 61 67 73 29 20 3a 20 22 43  v(CorFlags) : "C
3eb0: 6f 72 46 6c 61 67 73 22 0d 0a 20 20 20 20 20 20  orFlags"..      
3ec0: 20 20 7d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20    }]....        
3ed0: 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
3ee0: 45 3a 20 41 74 74 65 6d 70 74 20 74 6f 20 65 78  E: Attempt to ex
3ef0: 65 63 75 74 65 20 43 6f 72 46 6c 61 67 73 20 6f  ecute CorFlags o
3f00: 6e 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  n the specified 
3f10: 66 69 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20 23  file...        #
3f20: 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63  ..        if {[c
3f30: 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20  atch {..        
3f40: 20 20 65 78 65 63 20 2d 2d 20 24 63 6f 72 46 6c    exec -- $corFl
3f50: 61 67 73 20 5b 66 69 6c 65 20 6e 61 74 69 76 65  ags [file native
3f60: 6e 61 6d 65 20 24 66 69 6c 65 4e 61 6d 65 5d 0d  name $fileName].
3f70: 0a 20 20 20 20 20 20 20 20 7d 20 65 78 65 63 5d  .        } exec]
3f80: 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20   == 0} then {.. 
3f90: 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
3fa0: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 66        # NOTE: If
3fb0: 20 72 65 71 75 65 73 74 65 64 20 62 79 20 6f 75   requested by ou
3fc0: 72 20 63 61 6c 6c 65 72 2c 20 61 74 74 65 6d 70  r caller, attemp
3fd0: 74 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74  t to determine t
3fe0: 68 65 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20  he..          # 
3ff0: 20 20 20 20 20 20 70 6c 61 74 66 6f 72 6d 20 66        platform f
4000: 6f 72 20 74 68 65 20 73 70 65 63 69 66 69 65 64  or the specified
4010: 20 66 69 6c 65 20 61 73 20 77 65 6c 6c 2e 0d 0a   file as well...
4020: 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
4030: 20 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69         if {[stri
4040: 6e 67 20 6c 65 6e 67 74 68 20 24 76 61 72 4e 61  ng length $varNa
4050: 6d 65 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d  me] > 0} then {.
4060: 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a  .            #..
4070: 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f              # NO
4080: 54 45 3a 20 53 74 6f 72 65 20 74 68 65 20 70 6c  TE: Store the pl
4090: 61 74 66 6f 72 6d 20 69 6e 20 74 68 65 20 6e 61  atform in the na
40a0: 6d 65 64 20 76 61 72 69 61 62 6c 65 20 69 6e 20  med variable in 
40b0: 74 68 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20  the..           
40c0: 20 23 20 20 20 20 20 20 20 63 6f 6e 74 65 78 74   #       context
40d0: 20 6f 66 20 6f 75 72 20 63 61 6c 6c 65 72 2e 0d   of our caller..
40e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a  .            #..
40f0: 20 20 20 20 20 20 20 20 20 20 20 20 75 70 76 61              upva
4100: 72 20 31 20 24 76 61 72 4e 61 6d 65 20 70 6c 61  r 1 $varName pla
4110: 74 66 6f 72 6d 0d 0a 0d 0a 20 20 20 20 20 20 20  tform....       
4120: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
4130: 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 74 74 65      # NOTE: Atte
4140: 6d 70 74 20 74 6f 20 65 78 74 72 61 63 74 20 74  mpt to extract t
4150: 68 65 20 50 45 20 6c 69 6e 65 20 66 72 6f 6d 20  he PE line from 
4160: 74 68 65 20 63 61 70 74 75 72 65 64 0d 0a 20 20  the captured..  
4170: 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20            #     
4180: 20 20 6f 75 74 70 75 74 2e 20 20 49 66 20 74 68    output.  If th
4190: 69 73 20 76 61 6c 75 65 20 69 73 20 22 50 45 33  is value is "PE3
41a0: 32 22 20 6f 72 20 22 50 45 33 32 2b 22 2c 20 74  2" or "PE32+", t
41b0: 68 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  he..            
41c0: 23 20 20 20 20 20 20 20 61 73 73 65 6d 62 6c 79  #       assembly
41d0: 20 66 69 6c 65 20 69 73 20 33 32 2d 62 69 74 20   file is 32-bit 
41e0: 6f 72 20 36 34 2d 62 69 74 2c 20 72 65 73 70 65  or 64-bit, respe
41f0: 63 74 69 76 65 6c 79 3b 0d 0a 20 20 20 20 20 20  ctively;..      
4200: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 6f 74        #       ot
4210: 68 65 72 77 69 73 65 2c 20 69 74 73 20 74 79 70  herwise, its typ
4220: 65 20 69 73 20 75 6e 6b 6e 6f 77 6e 2e 0d 0a 20  e is unknown... 
4230: 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
4240: 20 20 20 20 20 20 20 20 20 20 73 65 74 20 70 61            set pa
4250: 74 74 65 72 6e 20 7b 5e 50 45 20 20 20 20 20 20  ttern {^PE      
4260: 20 20 3a 20 28 50 45 33 32 7c 50 45 33 32 5c 2b    : (PE32|PE32\+
4270: 29 5c 73 2b 24 7d 0d 0a 0d 0a 20 20 20 20 20 20  )\s+$}....      
4280: 20 20 20 20 20 20 69 66 20 7b 5b 72 65 67 65 78        if {[regex
4290: 70 20 2d 6c 69 6e 65 20 2d 2d 20 24 70 61 74 74  p -line -- $patt
42a0: 65 72 6e 20 24 65 78 65 63 20 64 75 6d 6d 79 20  ern $exec dummy 
42b0: 70 65 33 32 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  pe32]} then {.. 
42c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a               #..
42d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20                # 
42e0: 48 41 43 4b 3a 20 54 68 69 73 20 5b 73 77 69 74  HACK: This [swit
42f0: 63 68 5d 20 61 73 73 75 6d 65 73 20 74 68 61 74  ch] assumes that
4300: 20 33 32 2d 62 69 74 20 65 78 65 63 75 74 61 62   32-bit executab
4310: 6c 65 73 20 61 72 65 0d 0a 20 20 20 20 20 20 20  les are..       
4320: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 61         #       a
4330: 6c 77 61 79 73 20 78 38 36 20 61 6e 64 20 74 68  lways x86 and th
4340: 61 74 20 36 34 2d 62 69 74 20 65 78 65 63 75 74  at 64-bit execut
4350: 61 62 6c 65 73 20 61 72 65 20 61 6c 77 61 79 73  ables are always
4360: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
4370: 23 20 20 20 20 20 20 20 78 36 34 2e 0d 0a 20 20  #       x64...  
4380: 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20              #.. 
4390: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 77 69               swi
43a0: 74 63 68 20 2d 65 78 61 63 74 20 2d 2d 20 24 70  tch -exact -- $p
43b0: 65 33 32 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  e32 {..         
43c0: 20 20 20 20 20 20 20 50 45 33 32 20 7b 0d 0a 20         PE32 {.. 
43d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
43e0: 20 73 65 74 20 70 6c 61 74 66 6f 72 6d 20 57 69   set platform Wi
43f0: 6e 33 32 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n32..           
4400: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
4410: 20 20 20 20 20 20 20 20 50 45 33 32 2b 20 7b 0d          PE32+ {.
4420: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
4430: 20 20 20 73 65 74 20 70 6c 61 74 66 6f 72 6d 20     set platform 
4440: 78 36 34 0d 0a 20 20 20 20 20 20 20 20 20 20 20  x64..           
4450: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
4460: 20 20 20 20 20 20 20 20 64 65 66 61 75 6c 74 20          default 
4470: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
4480: 20 20 20 20 20 73 65 74 20 70 6c 61 74 66 6f 72       set platfor
4490: 6d 20 22 22 0d 0a 20 20 20 20 20 20 20 20 20 20  m ""..          
44a0: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
44b0: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
44c0: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
44d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65                se
44e0: 74 20 70 6c 61 74 66 6f 72 6d 20 22 22 0d 0a 20  t platform "".. 
44f0: 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
4500: 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
4510: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
4520: 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 74 74 65      # NOTE: Atte
4530: 6d 70 74 20 74 6f 20 65 78 74 72 61 63 74 20 74  mpt to extract t
4540: 68 65 20 49 4c 4f 4e 4c 59 20 6c 69 6e 65 20 66  he ILONLY line f
4550: 72 6f 6d 20 74 68 65 20 63 61 70 74 75 72 65 64  rom the captured
4560: 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 20 20  ..          #   
4570: 20 20 20 20 6f 75 74 70 75 74 2e 20 20 49 66 20      output.  If 
4580: 74 68 69 73 20 76 61 6c 75 65 20 69 73 20 7a 65  this value is ze
4590: 72 6f 2c 20 74 68 65 20 73 70 65 63 69 66 69 65  ro, the specifie
45a0: 64 20 66 69 6c 65 20 6d 75 73 74 0d 0a 20 20 20  d file must..   
45b0: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 62         #       b
45c0: 65 20 61 20 6d 69 78 65 64 2d 6d 6f 64 65 20 61  e a mixed-mode a
45d0: 73 73 65 6d 62 6c 79 3b 20 6f 74 68 65 72 77 69  ssembly; otherwi
45e0: 73 65 2c 20 69 74 20 63 6f 6e 74 61 69 6e 73 20  se, it contains 
45f0: 6f 6e 6c 79 0d 0a 20 20 20 20 20 20 20 20 20 20  only..          
4600: 23 20 20 20 20 20 20 20 6d 61 6e 61 67 65 64 20  #       managed 
4610: 63 6f 6d 70 6f 6e 65 6e 74 73 2e 0d 0a 20 20 20  components...   
4620: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
4630: 20 20 20 20 73 65 74 20 70 61 74 74 65 72 6e 20      set pattern 
4640: 7b 5e 49 4c 4f 4e 4c 59 20 20 20 20 3a 20 28 30  {^ILONLY    : (0
4650: 7c 31 29 5c 73 2b 24 7d 0d 0a 0d 0a 20 20 20 20  |1)\s+$}....    
4660: 20 20 20 20 20 20 69 66 20 7b 21 5b 72 65 67 65        if {![rege
4670: 78 70 20 2d 6c 69 6e 65 20 2d 2d 20 24 70 61 74  xp -line -- $pat
4680: 74 65 72 6e 20 24 65 78 65 63 20 64 75 6d 6d 79  tern $exec dummy
4690: 20 69 6c 4f 6e 6c 79 5d 7d 20 74 68 65 6e 20 7b   ilOnly]} then {
46a0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65  ..            re
46b0: 74 75 72 6e 20 66 61 6c 73 65 0d 0a 20 20 20 20  turn false..    
46c0: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
46d0: 20 20 20 20 20 69 66 20 7b 21 24 69 6c 4f 6e 6c       if {!$ilOnl
46e0: 79 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  y} then {..     
46f0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 72         return tr
4700: 75 65 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d  ue..          }.
4710: 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  .        }..    
4720: 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a    }....      #..
4730: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 66        # NOTE: If
4740: 20 74 68 65 20 74 65 73 74 20 73 75 69 74 65 20   the test suite 
4750: 63 61 6e 6e 6f 74 20 75 73 65 20 5b 65 78 65 63  cannot use [exec
4760: 5d 20 6f 72 20 65 78 65 63 75 74 69 6f 6e 20 6f  ] or execution o
4770: 66 20 43 6f 72 46 6c 61 67 73 0d 0a 20 20 20 20  f CorFlags..    
4780: 20 20 23 20 20 20 20 20 20 20 66 61 69 6c 65 64    #       failed
4790: 2c 20 72 65 74 75 72 6e 20 66 61 6c 73 65 2e 0d  , return false..
47a0: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
47b0: 72 65 74 75 72 6e 20 66 61 6c 73 65 0d 0a 20 20  return false..  
47c0: 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
47d0: 20 67 65 74 4e 61 74 69 76 65 4c 69 62 72 61 72   getNativeLibrar
47e0: 79 46 69 6c 65 4e 61 6d 65 73 4f 6e 6c 79 20 7b  yFileNamesOnly {
47f0: 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  } {..      #..  
4800: 20 20 20 20 23 20 4e 4f 54 45 3a 20 46 69 72 73      # NOTE: Firs
4810: 74 2c 20 63 68 65 63 6b 20 69 66 20 74 68 65 20  t, check if the 
4820: 6c 69 73 74 20 6f 66 20 6e 61 74 69 76 65 20 6c  list of native l
4830: 69 62 72 61 72 79 20 66 69 6c 65 20 6e 61 6d 65  ibrary file name
4840: 73 20 68 61 73 20 62 65 65 6e 0d 0a 20 20 20 20  s has been..    
4850: 20 20 23 20 20 20 20 20 20 20 6d 61 6e 75 61 6c    #       manual
4860: 6c 79 20 6f 76 65 72 72 69 64 64 65 6e 2e 0d 0a  ly overridden...
4870: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69        #..      i
4880: 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20  f {[info exists 
4890: 3a 3a 6e 61 74 69 76 65 5f 6c 69 62 72 61 72 79  ::native_library
48a0: 5f 66 69 6c 65 5f 6e 61 6d 65 73 5d 20 26 26 20  _file_names] && 
48b0: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 6c 6c  \..          [ll
48c0: 65 6e 67 74 68 20 24 3a 3a 6e 61 74 69 76 65 5f  ength $::native_
48d0: 6c 69 62 72 61 72 79 5f 66 69 6c 65 5f 6e 61 6d  library_file_nam
48e0: 65 73 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d  es] > 0} then {.
48f0: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
4900: 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 65 20      # NOTE: The 
4910: 6c 69 73 74 20 6f 66 20 6e 61 74 69 76 65 20 6c  list of native l
4920: 69 62 72 61 72 79 20 66 69 6c 65 20 6e 61 6d 65  ibrary file name
4930: 73 20 68 61 73 20 62 65 65 6e 20 6f 76 65 72 72  s has been overr
4940: 69 64 64 65 6e 3b 0d 0a 20 20 20 20 20 20 20 20  idden;..        
4950: 23 20 20 20 20 20 20 20 74 68 65 72 65 66 6f 72  #       therefor
4960: 65 2c 20 75 73 65 20 69 74 20 76 65 72 62 61 74  e, use it verbat
4970: 69 6d 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  im...        #..
4980: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 24          return $
4990: 3a 3a 6e 61 74 69 76 65 5f 6c 69 62 72 61 72 79  ::native_library
49a0: 5f 66 69 6c 65 5f 6e 61 6d 65 73 0d 0a 20 20 20  _file_names..   
49b0: 20 20 20 7d 20 65 6c 73 65 69 66 20 7b 5b 69 73     } elseif {[is
49c0: 57 69 6e 64 6f 77 73 5d 7d 20 74 68 65 6e 20 7b  Windows]} then {
49d0: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
49e0: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4f 74 68       # NOTE: Oth
49f0: 65 72 77 69 73 65 2c 20 6f 6e 20 57 69 6e 64 6f  erwise, on Windo
4a00: 77 73 2c 20 61 6c 77 61 79 73 20 75 73 65 20 74  ws, always use t
4a10: 68 65 20 64 65 66 61 75 6c 74 20 66 69 6c 65 20  he default file 
4a20: 6e 61 6d 65 0d 0a 20 20 20 20 20 20 20 20 23 20  name..        # 
4a30: 20 20 20 20 20 20 22 73 71 6c 69 74 65 33 2e 64        "sqlite3.d
4a40: 6c 6c 22 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  ll"...        #.
4a50: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
4a60: 5b 6c 69 73 74 20 73 71 6c 69 74 65 33 2e 64 6c  [list sqlite3.dl
4a70: 6c 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65  l]..      } else
4a80: 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20   {..        #.. 
4a90: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4f         # NOTE: O
4aa0: 74 68 65 72 77 69 73 65 2c 20 72 65 74 75 72 6e  therwise, return
4ab0: 20 62 6f 74 68 20 74 68 65 20 67 65 6e 65 72 69   both the generi
4ac0: 63 20 50 4f 53 49 58 20 66 69 6c 65 20 6e 61 6d  c POSIX file nam
4ad0: 65 20 61 6e 64 20 74 68 65 0d 0a 20 20 20 20 20  e and the..     
4ae0: 20 20 20 23 20 20 20 20 20 20 20 4d 61 63 20 4f     #       Mac O
4af0: 53 20 58 20 66 69 6c 65 20 6e 61 6d 65 2c 20 73  S X file name, s
4b00: 69 6e 63 65 20 77 65 20 64 6f 20 6e 6f 74 20 63  ince we do not c
4b10: 75 72 72 65 6e 74 6c 79 20 68 61 76 65 20 61 6e  urrently have an
4b20: 20 65 61 73 79 0d 0a 20 20 20 20 20 20 20 20 23   easy..        #
4b30: 20 20 20 20 20 20 20 77 61 79 20 74 6f 20 64 65         way to de
4b40: 74 65 63 74 20 77 68 69 63 68 20 6f 66 20 74 68  tect which of th
4b50: 6f 73 65 20 70 6c 61 74 66 6f 72 6d 73 20 77 65  ose platforms we
4b60: 20 61 72 65 20 72 75 6e 6e 69 6e 67 20 6f 6e 2e   are running on.
4b70: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
4b80: 20 20 20 20 20 72 65 74 75 72 6e 20 5b 6c 69 73       return [lis
4b90: 74 20 6c 69 62 73 71 6c 69 74 65 33 2e 64 79 6c  t libsqlite3.dyl
4ba0: 69 62 20 6c 69 62 73 71 6c 69 74 65 33 2e 73 6f  ib libsqlite3.so
4bb0: 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  ]..      }..    
4bc0: 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67  }.....    proc g
4bd0: 65 74 49 6e 74 65 72 6f 70 41 73 73 65 6d 62 6c  etInteropAssembl
4be0: 79 46 69 6c 65 4e 61 6d 65 73 4f 6e 6c 79 20 7b  yFileNamesOnly {
4bf0: 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  } {..      #..  
4c00: 20 20 20 20 23 20 4e 4f 54 45 3a 20 46 69 72 73      # NOTE: Firs
4c10: 74 2c 20 63 68 65 63 6b 20 69 66 20 74 68 65 20  t, check if the 
4c20: 6c 69 73 74 20 6f 66 20 69 6e 74 65 72 6f 70 20  list of interop 
4c30: 61 73 73 65 6d 62 6c 79 20 66 69 6c 65 20 6e 61  assembly file na
4c40: 6d 65 73 20 68 61 73 20 62 65 65 6e 0d 0a 20 20  mes has been..  
4c50: 20 20 20 20 23 20 20 20 20 20 20 20 6d 61 6e 75      #       manu
4c60: 61 6c 6c 79 20 6f 76 65 72 72 69 64 64 65 6e 2e  ally overridden.
4c70: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
4c80: 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74   if {[info exist
4c90: 73 20 3a 3a 69 6e 74 65 72 6f 70 5f 61 73 73 65  s ::interop_asse
4ca0: 6d 62 6c 79 5f 66 69 6c 65 5f 6e 61 6d 65 73 5d  mbly_file_names]
4cb0: 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20   && \..         
4cc0: 20 5b 6c 6c 65 6e 67 74 68 20 24 3a 3a 69 6e 74   [llength $::int
4cd0: 65 72 6f 70 5f 61 73 73 65 6d 62 6c 79 5f 66 69  erop_assembly_fi
4ce0: 6c 65 5f 6e 61 6d 65 73 5d 20 3e 20 30 7d 20 74  le_names] > 0} t
4cf0: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  hen {..        #
4d00: 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
4d10: 3a 20 54 68 65 20 6c 69 73 74 20 6f 66 20 69 6e  : The list of in
4d20: 74 65 72 6f 70 20 61 73 73 65 6d 62 6c 79 20 66  terop assembly f
4d30: 69 6c 65 20 6e 61 6d 65 73 20 68 61 73 20 62 65  ile names has be
4d40: 65 6e 20 6f 76 65 72 72 69 64 64 65 6e 3b 0d 0a  en overridden;..
4d50: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
4d60: 74 68 65 72 65 66 6f 72 65 2c 20 75 73 65 20 69  therefore, use i
4d70: 74 20 76 65 72 62 61 74 69 6d 2e 0d 0a 20 20 20  t verbatim...   
4d80: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
4d90: 72 65 74 75 72 6e 20 24 3a 3a 69 6e 74 65 72 6f  return $::intero
4da0: 70 5f 61 73 73 65 6d 62 6c 79 5f 66 69 6c 65 5f  p_assembly_file_
4db0: 6e 61 6d 65 73 0d 0a 20 20 20 20 20 20 7d 20 65  names..      } e
4dc0: 6c 73 65 69 66 20 7b 5b 69 73 57 69 6e 64 6f 77  lseif {[isWindow
4dd0: 73 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  s]} then {..    
4de0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
4df0: 20 4e 4f 54 45 3a 20 4f 74 68 65 72 77 69 73 65   NOTE: Otherwise
4e00: 2c 20 6f 6e 20 57 69 6e 64 6f 77 73 2c 20 61 6c  , on Windows, al
4e10: 77 61 79 73 20 75 73 65 20 74 68 65 20 64 65 66  ways use the def
4e20: 61 75 6c 74 20 66 69 6c 65 20 6e 61 6d 65 0d 0a  ault file name..
4e30: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
4e40: 22 53 51 4c 69 74 65 2e 49 6e 74 65 72 6f 70 2e  "SQLite.Interop.
4e50: 64 6c 6c 22 2e 0d 0a 20 20 20 20 20 20 20 20 23  dll"...        #
4e60: 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ..        return
4e70: 20 5b 6c 69 73 74 20 53 51 4c 69 74 65 2e 49 6e   [list SQLite.In
4e80: 74 65 72 6f 70 2e 64 6c 6c 5d 0d 0a 20 20 20 20  terop.dll]..    
4e90: 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
4ea0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
4eb0: 20 4e 4f 54 45 3a 20 4f 74 68 65 72 77 69 73 65   NOTE: Otherwise
4ec0: 2c 20 72 65 74 75 72 6e 20 62 6f 74 68 20 74 68  , return both th
4ed0: 65 20 67 65 6e 65 72 69 63 20 50 4f 53 49 58 20  e generic POSIX 
4ee0: 66 69 6c 65 20 6e 61 6d 65 20 61 6e 64 20 74 68  file name and th
4ef0: 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  e..        #    
4f00: 20 20 20 4d 61 63 20 4f 53 20 58 20 66 69 6c 65     Mac OS X file
4f10: 20 6e 61 6d 65 2c 20 73 69 6e 63 65 20 77 65 20   name, since we 
4f20: 64 6f 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79  do not currently
4f30: 20 68 61 76 65 20 61 6e 20 65 61 73 79 0d 0a 20   have an easy.. 
4f40: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 77         #       w
4f50: 61 79 20 74 6f 20 64 65 74 65 63 74 20 77 68 69  ay to detect whi
4f60: 63 68 20 6f 66 20 74 68 6f 73 65 20 70 6c 61 74  ch of those plat
4f70: 66 6f 72 6d 73 20 77 65 20 61 72 65 20 72 75 6e  forms we are run
4f80: 6e 69 6e 67 20 6f 6e 2e 0d 0a 20 20 20 20 20 20  ning on...      
4f90: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74    #..        ret
4fa0: 75 72 6e 20 5b 6c 69 73 74 20 6c 69 62 53 51 4c  urn [list libSQL
4fb0: 69 74 65 2e 49 6e 74 65 72 6f 70 2e 64 79 6c 69  ite.Interop.dyli
4fc0: 62 20 6c 69 62 53 51 4c 69 74 65 2e 49 6e 74 65  b libSQLite.Inte
4fd0: 72 6f 70 2e 73 6f 5d 0d 0a 20 20 20 20 20 20 7d  rop.so]..      }
4fe0: 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
4ff0: 70 72 6f 63 20 67 65 74 43 6f 72 65 45 78 74 65  proc getCoreExte
5000: 6e 73 69 6f 6e 42 69 6e 61 72 79 46 69 6c 65 4e  nsionBinaryFileN
5010: 61 6d 65 20 7b 20 7b 64 65 66 61 75 6c 74 20 22  ame { {default "
5020: 22 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 73 65  "} } {..      se
5030: 74 20 66 69 6c 65 4e 61 6d 65 20 5b 67 65 74 43  t fileName [getC
5040: 6f 72 65 42 69 6e 61 72 79 46 69 6c 65 4e 61 6d  oreBinaryFileNam
5050: 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b  e]....      if {
5060: 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24 66 69  [file exists $fi
5070: 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d  leName]} then {.
5080: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
5090: 24 66 69 6c 65 4e 61 6d 65 0d 0a 20 20 20 20 20  $fileName..     
50a0: 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65 74 75   }....      retu
50b0: 72 6e 20 24 64 65 66 61 75 6c 74 0d 0a 20 20 20  rn $default..   
50c0: 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
50d0: 69 73 42 75 69 6c 64 41 76 61 69 6c 61 62 6c 65  isBuildAvailable
50e0: 20 7b 20 6e 61 74 69 76 65 20 64 69 72 65 63 74   { native direct
50f0: 6f 72 79 20 7b 76 61 72 4e 61 6d 65 20 22 22 7d  ory {varName ""}
5100: 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20   } {..      #.. 
5110: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 42 75 69       # NOTE: Bui
5120: 6c 64 20 74 68 65 20 66 75 6c 6c 79 20 71 75 61  ld the fully qua
5130: 6c 69 66 69 65 64 20 66 69 6c 65 20 6e 61 6d 65  lified file name
5140: 20 66 6f 72 20 74 68 65 20 70 72 69 6d 61 72 79   for the primary
5150: 20 61 73 73 65 6d 62 6c 79 0d 0a 20 20 20 20 20   assembly..     
5160: 20 23 20 20 20 20 20 20 20 63 6f 6e 74 61 69 6e   #       contain
5170: 69 6e 67 20 74 68 65 20 53 79 73 74 65 6d 2e 44  ing the System.D
5180: 61 74 61 2e 53 51 4c 69 74 65 20 6d 61 6e 61 67  ata.SQLite manag
5190: 65 64 20 63 6f 6d 70 6f 6e 65 6e 74 73 2e 20 20  ed components.  
51a0: 49 74 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  It..      #     
51b0: 20 20 73 68 6f 75 6c 64 20 62 65 20 6e 6f 74 65    should be note
51c0: 64 20 74 68 61 74 20 74 68 69 73 20 61 73 73 65  d that this asse
51d0: 6d 62 6c 79 20 66 69 6c 65 20 6d 61 79 20 61 6c  mbly file may al
51e0: 73 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 0d 0a  so contain the..
51f0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 6e 61        #       na
5200: 74 69 76 65 20 63 6f 6d 70 6f 6e 65 6e 74 73 2c  tive components,
5210: 20 69 66 20 61 20 6e 61 74 69 76 65 20 62 75 69   if a native bui
5220: 6c 64 20 69 73 20 69 6e 20 75 73 65 2e 0d 0a 20  ld is in use... 
5230: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 73 65       #..      se
5240: 74 20 66 69 6c 65 4e 61 6d 65 20 5b 66 69 6c 65  t fileName [file
5250: 20 6e 61 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c   nativename [fil
5260: 65 20 6a 6f 69 6e 20 24 64 69 72 65 63 74 6f 72  e join $director
5270: 79 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 53  y \..          S
5280: 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
5290: 65 2e 64 6c 6c 5d 5d 0d 0a 0d 0a 20 20 20 20 20  e.dll]]....     
52a0: 20 69 66 20 7b 21 5b 66 69 6c 65 20 65 78 69 73   if {![file exis
52b0: 74 73 20 24 66 69 6c 65 4e 61 6d 65 5d 7d 20 74  ts $fileName]} t
52c0: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 72  hen {..        r
52d0: 65 74 75 72 6e 20 66 61 6c 73 65 0d 0a 20 20 20  eturn false..   
52e0: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d     }....      #.
52f0: 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41  .      # NOTE: A
5300: 74 74 65 6d 70 74 20 74 6f 20 61 75 74 6f 6d 61  ttempt to automa
5310: 74 69 63 61 6c 6c 79 20 64 65 74 65 63 74 20 69  tically detect i
5320: 66 20 74 68 65 20 70 72 69 6d 61 72 79 20 61 73  f the primary as
5330: 73 65 6d 62 6c 79 0d 0a 20 20 20 20 20 20 23 20  sembly..      # 
5340: 20 20 20 20 20 20 63 6f 6e 74 61 69 6e 73 20 61        contains a
5350: 6e 79 20 6e 61 74 69 76 65 20 63 6f 6d 70 6f 6e  ny native compon
5360: 65 6e 74 73 2c 20 69 66 20 6e 65 63 65 73 73 61  ents, if necessa
5370: 72 79 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  ry...      #..  
5380: 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20      if {[string 
5390: 6c 65 6e 67 74 68 20 24 6e 61 74 69 76 65 5d 20  length $native] 
53a0: 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  == 0} then {..  
53b0: 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e        if {[strin
53c0: 67 20 6c 65 6e 67 74 68 20 24 76 61 72 4e 61 6d  g length $varNam
53d0: 65 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  e] > 0} then {..
53e0: 20 20 20 20 20 20 20 20 20 20 75 70 76 61 72 20            upvar 
53f0: 31 20 24 76 61 72 4e 61 6d 65 20 24 76 61 72 4e  1 $varName $varN
5400: 61 6d 65 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  ame..        }..
5410: 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 6e 61  ..        set na
5420: 74 69 76 65 20 5b 69 73 4d 69 78 65 64 4d 6f 64  tive [isMixedMod
5430: 65 41 73 73 65 6d 62 6c 79 20 24 66 69 6c 65 4e  eAssembly $fileN
5440: 61 6d 65 20 24 76 61 72 4e 61 6d 65 5d 0d 0a 20  ame $varName].. 
5450: 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
5460: 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
5470: 20 49 66 20 74 68 65 20 70 72 69 6d 61 72 79 20   If the primary 
5480: 61 73 73 65 6d 62 6c 79 20 61 6c 73 6f 20 63 6f  assembly also co
5490: 6e 74 61 69 6e 73 20 74 68 65 20 6e 61 74 69 76  ntains the nativ
54a0: 65 20 63 6f 6d 70 6f 6e 65 6e 74 73 2c 0d 0a 20  e components,.. 
54b0: 20 20 20 20 20 23 20 20 20 20 20 20 20 77 65 20       #       we 
54c0: 68 61 76 65 20 65 76 65 72 79 74 68 69 6e 67 20  have everything 
54d0: 77 65 20 6e 65 65 64 2e 0d 0a 20 20 20 20 20 20  we need...      
54e0: 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 24 6e 61  #..      if {$na
54f0: 74 69 76 65 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  tive} then {..  
5500: 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 72 75        return tru
5510: 65 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  e..      }....  
5520: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
5530: 4f 54 45 3a 20 57 68 61 74 20 69 73 20 74 68 65  OTE: What is the
5540: 20 61 72 63 68 69 74 65 63 74 75 72 65 20 66 6f   architecture fo
5550: 72 20 74 68 69 73 20 6d 61 63 68 69 6e 65 3f 0d  r this machine?.
5560: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
5570: 73 65 74 20 61 72 63 68 69 74 65 63 74 75 72 65  set architecture
5580: 20 5b 6d 61 63 68 69 6e 65 54 6f 50 6c 61 74 66   [machineToPlatf
5590: 6f 72 6d 20 24 3a 3a 74 63 6c 5f 70 6c 61 74 66  orm $::tcl_platf
55a0: 6f 72 6d 28 6d 61 63 68 69 6e 65 29 20 74 72 75  orm(machine) tru
55b0: 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20  e]....      #.. 
55c0: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 57 68 61       # NOTE: Wha
55d0: 74 20 69 73 20 74 68 65 20 70 6c 61 74 66 6f 72  t is the platfor
55e0: 6d 20 66 6f 72 20 74 68 69 73 20 6d 61 63 68 69  m for this machi
55f0: 6e 65 3f 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  ne?..      #..  
5600: 20 20 20 20 73 65 74 20 70 6c 61 74 66 6f 72 6d      set platform
5610: 20 5b 6d 61 63 68 69 6e 65 54 6f 50 6c 61 74 66   [machineToPlatf
5620: 6f 72 6d 20 24 3a 3a 74 63 6c 5f 70 6c 61 74 66  orm $::tcl_platf
5630: 6f 72 6d 28 6d 61 63 68 69 6e 65 29 5d 0d 0a 0d  orm(machine)]...
5640: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
5650: 23 20 4e 4f 54 45 3a 20 42 75 69 6c 64 20 74 68  # NOTE: Build th
5660: 65 20 66 75 6c 6c 79 20 71 75 61 6c 69 66 69 65  e fully qualifie
5670: 64 20 66 69 6c 65 20 6e 61 6d 65 20 66 6f 72 20  d file name for 
5680: 74 68 65 20 69 6e 74 65 72 6f 70 20 61 73 73 65  the interop asse
5690: 6d 62 6c 79 0d 0a 20 20 20 20 20 20 23 20 20 20  mbly..      #   
56a0: 20 20 20 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74      containing t
56b0: 68 65 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53  he System.Data.S
56c0: 51 4c 69 74 65 20 6e 61 74 69 76 65 20 63 6f 6d  QLite native com
56d0: 70 6f 6e 65 6e 74 73 2e 20 20 49 66 20 74 68 69  ponents.  If thi
56e0: 73 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  s..      #      
56f0: 20 66 69 6c 65 20 65 78 69 73 74 73 2c 20 77 65   file exists, we
5700: 20 73 68 6f 75 6c 64 20 68 61 76 65 20 65 76 65   should have eve
5710: 72 79 74 68 69 6e 67 20 77 65 20 6e 65 65 64 2e  rything we need.
5720: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
5730: 20 66 6f 72 65 61 63 68 20 66 69 6c 65 4e 61 6d   foreach fileNam
5740: 65 4f 6e 6c 79 20 5b 67 65 74 49 6e 74 65 72 6f  eOnly [getIntero
5750: 70 41 73 73 65 6d 62 6c 79 46 69 6c 65 4e 61 6d  pAssemblyFileNam
5760: 65 73 4f 6e 6c 79 5d 20 7b 0d 0a 20 20 20 20 20  esOnly] {..     
5770: 20 20 20 73 65 74 20 66 69 6c 65 4e 61 6d 65 20     set fileName 
5780: 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65  [file nativename
5790: 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 24 64 69 72   [file join $dir
57a0: 65 63 74 6f 72 79 20 5c 0d 0a 20 20 20 20 20 20  ectory \..      
57b0: 20 20 20 20 20 20 24 61 72 63 68 69 74 65 63 74        $architect
57c0: 75 72 65 20 24 66 69 6c 65 4e 61 6d 65 4f 6e 6c  ure $fileNameOnl
57d0: 79 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69  y]]....        i
57e0: 66 20 7b 5b 66 69 6c 65 20 65 78 69 73 74 73 20  f {[file exists 
57f0: 24 66 69 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e  $fileName]} then
5800: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 72 65   {..          re
5810: 74 75 72 6e 20 74 72 75 65 0d 0a 20 20 20 20 20  turn true..     
5820: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
5830: 73 65 74 20 66 69 6c 65 4e 61 6d 65 20 5b 66 69  set fileName [fi
5840: 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65 20 5b 66  le nativename [f
5850: 69 6c 65 20 6a 6f 69 6e 20 24 64 69 72 65 63 74  ile join $direct
5860: 6f 72 79 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ory \..         
5870: 20 20 20 24 70 6c 61 74 66 6f 72 6d 20 24 66 69     $platform $fi
5880: 6c 65 4e 61 6d 65 4f 6e 6c 79 5d 5d 0d 0a 0d 0a  leNameOnly]]....
5890: 20 20 20 20 20 20 20 20 69 66 20 7b 5b 66 69 6c          if {[fil
58a0: 65 20 65 78 69 73 74 73 20 24 66 69 6c 65 4e 61  e exists $fileNa
58b0: 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  me]} then {..   
58c0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 72         return tr
58d0: 75 65 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d  ue..        }...
58e0: 0a 20 20 20 20 20 20 20 20 73 65 74 20 66 69 6c  .        set fil
58f0: 65 4e 61 6d 65 20 5b 66 69 6c 65 20 6e 61 74 69  eName [file nati
5900: 76 65 6e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69  vename [file joi
5910: 6e 20 24 64 69 72 65 63 74 6f 72 79 20 5c 0d 0a  n $directory \..
5920: 20 20 20 20 20 20 20 20 20 20 20 20 24 66 69 6c              $fil
5930: 65 4e 61 6d 65 4f 6e 6c 79 5d 5d 0d 0a 0d 0a 20  eNameOnly]].... 
5940: 20 20 20 20 20 20 20 69 66 20 7b 5b 66 69 6c 65         if {[file
5950: 20 65 78 69 73 74 73 20 24 66 69 6c 65 4e 61 6d   exists $fileNam
5960: 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  e]} then {..    
5970: 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 72 75        return tru
5980: 65 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  e..        }..  
5990: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23      }....      #
59a0: 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
59b0: 42 75 69 6c 64 20 74 68 65 20 66 75 6c 6c 79 20  Build the fully 
59c0: 71 75 61 6c 69 66 69 65 64 20 66 69 6c 65 20 6e  qualified file n
59d0: 61 6d 65 20 66 6f 72 20 74 68 65 20 53 51 4c 69  ame for the SQLi
59e0: 74 65 20 63 6f 72 65 0d 0a 20 20 20 20 20 20 23  te core..      #
59f0: 20 20 20 20 20 20 20 6c 69 62 72 61 72 79 2e 20         library. 
5a00: 20 49 66 20 74 68 69 73 20 66 69 6c 65 20 65 78   If this file ex
5a10: 69 73 74 73 2c 20 77 65 20 73 68 6f 75 6c 64 20  ists, we should 
5a20: 68 61 76 65 20 65 76 65 72 79 74 68 69 6e 67 20  have everything 
5a30: 77 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  we..      #     
5a40: 20 20 6e 65 65 64 2e 0d 0a 20 20 20 20 20 20 23    need...      #
5a50: 0d 0a 20 20 20 20 20 20 66 6f 72 65 61 63 68 20  ..      foreach 
5a60: 66 69 6c 65 4e 61 6d 65 4f 6e 6c 79 20 5b 67 65  fileNameOnly [ge
5a70: 74 4e 61 74 69 76 65 4c 69 62 72 61 72 79 46 69  tNativeLibraryFi
5a80: 6c 65 4e 61 6d 65 73 4f 6e 6c 79 5d 20 7b 0d 0a  leNamesOnly] {..
5a90: 20 20 20 20 20 20 20 20 73 65 74 20 66 69 6c 65          set file
5aa0: 4e 61 6d 65 20 5b 66 69 6c 65 20 6e 61 74 69 76  Name [file nativ
5ab0: 65 6e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e  ename [file join
5ac0: 20 24 64 69 72 65 63 74 6f 72 79 20 5c 0d 0a 20   $directory \.. 
5ad0: 20 20 20 20 20 20 20 20 20 20 20 24 61 72 63 68             $arch
5ae0: 69 74 65 63 74 75 72 65 20 24 66 69 6c 65 4e 61  itecture $fileNa
5af0: 6d 65 4f 6e 6c 79 5d 5d 0d 0a 0d 0a 20 20 20 20  meOnly]]....    
5b00: 20 20 20 20 69 66 20 7b 5b 66 69 6c 65 20 65 78      if {[file ex
5b10: 69 73 74 73 20 24 66 69 6c 65 4e 61 6d 65 5d 7d  ists $fileName]}
5b20: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
5b30: 20 20 20 72 65 74 75 72 6e 20 74 72 75 65 0d 0a     return true..
5b40: 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
5b50: 20 20 20 20 20 73 65 74 20 66 69 6c 65 4e 61 6d       set fileNam
5b60: 65 20 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e 61  e [file nativena
5b70: 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 24 64  me [file join $d
5b80: 69 72 65 63 74 6f 72 79 20 5c 0d 0a 20 20 20 20  irectory \..    
5b90: 20 20 20 20 20 20 20 20 24 70 6c 61 74 66 6f 72          $platfor
5ba0: 6d 20 24 66 69 6c 65 4e 61 6d 65 4f 6e 6c 79 5d  m $fileNameOnly]
5bb0: 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20  ]....        if 
5bc0: 7b 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24 66  {[file exists $f
5bd0: 69 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b  ileName]} then {
5be0: 0d 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ..          retu
5bf0: 72 6e 20 74 72 75 65 0d 0a 20 20 20 20 20 20 20  rn true..       
5c00: 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 73 65   }....        se
5c10: 74 20 66 69 6c 65 4e 61 6d 65 20 5b 66 69 6c 65  t fileName [file
5c20: 20 6e 61 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c   nativename [fil
5c30: 65 20 6a 6f 69 6e 20 24 64 69 72 65 63 74 6f 72  e join $director
5c40: 79 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  y \..           
5c50: 20 24 66 69 6c 65 4e 61 6d 65 4f 6e 6c 79 5d 5d   $fileNameOnly]]
5c60: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b  ....        if {
5c70: 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24 66 69  [file exists $fi
5c80: 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d  leName]} then {.
5c90: 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
5ca0: 6e 20 74 72 75 65 0d 0a 20 20 20 20 20 20 20 20  n true..        
5cb0: 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  }..      }....  
5cc0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
5cd0: 4f 54 45 3a 20 4f 6e 65 20 6f 72 20 6d 6f 72 65  OTE: One or more
5ce0: 20 6e 61 74 69 76 65 20 63 6f 6d 70 6f 6e 65 6e   native componen
5cf0: 74 73 20 6e 65 65 64 65 64 20 62 79 20 53 79 73  ts needed by Sys
5d00: 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 0d  tem.Data.SQLite.
5d10: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 61  .      #       a
5d20: 72 65 20 6d 69 73 73 69 6e 67 2e 0d 0a 20 20 20  re missing...   
5d30: 20 20 20 23 0d 0a 20 20 20 20 20 20 72 65 74 75     #..      retu
5d40: 72 6e 20 66 61 6c 73 65 0d 0a 20 20 20 20 7d 0d  rn false..    }.
5d50: 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 69 73 52  ....    proc isR
5d60: 65 6c 65 61 73 65 41 76 61 69 6c 61 62 6c 65 20  eleaseAvailable 
5d70: 7b 20 64 69 72 65 63 74 6f 72 79 20 7b 76 61 72  { directory {var
5d80: 4e 61 6d 65 20 22 22 7d 20 7d 20 7b 0d 0a 20 20  Name ""} } {..  
5d90: 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20      if {[string 
5da0: 6c 65 6e 67 74 68 20 24 76 61 72 4e 61 6d 65 5d  length $varName]
5db0: 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20   > 0} then {..  
5dc0: 20 20 20 20 20 20 75 70 76 61 72 20 31 20 24 76        upvar 1 $v
5dd0: 61 72 4e 61 6d 65 20 24 76 61 72 4e 61 6d 65 0d  arName $varName.
5de0: 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
5df0: 20 20 72 65 74 75 72 6e 20 5b 69 73 42 75 69 6c    return [isBuil
5e00: 64 41 76 61 69 6c 61 62 6c 65 20 22 22 20 24 64  dAvailable "" $d
5e10: 69 72 65 63 74 6f 72 79 20 24 76 61 72 4e 61 6d  irectory $varNam
5e20: 65 5d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20  e]..    }.....  
5e30: 20 20 70 72 6f 63 20 6a 6f 69 6e 42 75 69 6c 64    proc joinBuild
5e40: 44 69 72 65 63 74 6f 72 79 20 7b 20 6e 61 74 69  Directory { nati
5e50: 76 65 20 70 61 74 68 20 79 65 61 72 20 70 6c 61  ve path year pla
5e60: 74 66 6f 72 6d 20 63 6f 6e 66 69 67 75 72 61 74  tform configurat
5e70: 69 6f 6e 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23  ion } {..      #
5e80: 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
5e90: 46 69 67 75 72 65 20 6f 75 74 20 61 6e 64 20 74  Figure out and t
5ea0: 68 65 6e 20 72 65 74 75 72 6e 20 74 68 65 20 66  hen return the f
5eb0: 75 6c 6c 79 20 71 75 61 6c 69 66 69 65 64 20 70  ully qualified p
5ec0: 61 74 68 20 74 6f 20 74 68 65 20 62 75 69 6c 64  ath to the build
5ed0: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
5ee0: 64 69 72 65 63 74 6f 72 79 20 62 61 73 65 64 20  directory based 
5ef0: 6f 6e 20 61 6c 6c 20 74 68 65 20 61 72 67 75 6d  on all the argum
5f00: 65 6e 74 73 20 70 72 6f 76 69 64 65 64 20 62 79  ents provided by
5f10: 20 6f 75 72 20 63 61 6c 6c 65 72 2e 0d 0a 20 20   our caller...  
5f20: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20      #..      if 
5f30: 7b 24 6e 61 74 69 76 65 7d 20 74 68 65 6e 20 7b  {$native} then {
5f40: 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ..        return
5f50: 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 24 70 61 74   [file join $pat
5f60: 68 20 62 69 6e 20 24 79 65 61 72 20 24 70 6c 61  h bin $year $pla
5f70: 74 66 6f 72 6d 20 24 63 6f 6e 66 69 67 75 72 61  tform $configura
5f80: 74 69 6f 6e 5d 0d 0a 20 20 20 20 20 20 7d 20 65  tion]..      } e
5f90: 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 72  lse {..        r
5fa0: 65 74 75 72 6e 20 5b 66 69 6c 65 20 6a 6f 69 6e  eturn [file join
5fb0: 20 24 70 61 74 68 20 62 69 6e 20 24 79 65 61 72   $path bin $year
5fc0: 20 24 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20   $configuration 
5fd0: 62 69 6e 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20  bin]..      }.. 
5fe0: 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
5ff0: 63 20 67 65 74 42 75 69 6c 64 44 69 72 65 63 74  c getBuildDirect
6000: 6f 72 79 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20  ory {} {..      
6010: 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
6020: 20 53 65 65 20 69 66 20 74 68 65 20 22 6e 61 74   See if the "nat
6030: 69 76 65 22 20 72 75 6e 74 69 6d 65 20 6f 70 74  ive" runtime opt
6040: 69 6f 6e 20 68 61 73 20 62 65 65 6e 20 73 65 74  ion has been set
6050: 2e 20 20 49 66 20 73 6f 2c 20 75 73 65 20 74 68  .  If so, use th
6060: 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  e..      #      
6070: 20 64 69 72 65 63 74 6f 72 79 20 66 6f 72 20 74   directory for t
6080: 68 65 20 6d 69 78 65 64 2d 6d 6f 64 65 20 61 73  he mixed-mode as
6090: 73 65 6d 62 6c 79 20 28 61 2e 6b 2e 61 2e 20 74  sembly (a.k.a. t
60a0: 68 65 20 6e 61 74 69 76 65 20 69 6e 74 65 72 6f  he native intero
60b0: 70 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  p..      #      
60c0: 20 61 73 73 65 6d 62 6c 79 29 2e 20 20 54 6f 20   assembly).  To 
60d0: 65 6e 61 62 6c 65 20 74 68 69 73 20 6f 70 74 69  enable this opti
60e0: 6f 6e 20 76 69 61 20 74 68 65 20 63 6f 6d 6d 61  on via the comma
60f0: 6e 64 20 6c 69 6e 65 2c 20 65 6e 74 65 72 20 61  nd line, enter a
6100: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
6110: 63 6f 6d 6d 61 6e 64 20 73 69 6d 69 6c 61 72 20  command similar 
6120: 74 6f 20 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f  to one of the fo
6130: 6c 6c 6f 77 69 6e 67 20 28 61 6c 6c 20 6f 6e 20  llowing (all on 
6140: 6f 6e 65 20 6c 69 6e 65 29 3a 0d 0a 20 20 20 20  one line):..    
6150: 20 20 23 0d 0a 20 20 20 20 20 20 23 20 20 20 20    #..      #    
6160: 20 20 20 45 61 67 6c 65 53 68 65 6c 6c 2e 65 78     EagleShell.ex
6170: 65 20 2d 69 6e 69 74 69 61 6c 69 7a 65 20 2d 72  e -initialize -r
6180: 75 6e 74 69 6d 65 4f 70 74 69 6f 6e 20 6e 61 74  untimeOption nat
6190: 69 76 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ive..      #    
61a0: 20 20 20 20 20 2d 66 69 6c 65 20 2e 5c 70 61 74       -file .\pat
61b0: 68 5c 74 6f 5c 61 6c 6c 2e 65 61 67 6c 65 0d 0a  h\to\all.eagle..
61c0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
61d0: 20 20 20 20 20 20 20 54 6f 20 65 6e 61 62 6c 65         To enable
61e0: 20 74 68 69 73 20 6f 70 74 69 6f 6e 20 76 69 61   this option via
61f0: 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e   the command lin
6200: 65 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20 22  e prior to the "
6210: 62 65 74 61 20 31 36 22 0d 0a 20 20 20 20 20 20  beta 16"..      
6220: 23 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 20  #       release 
6230: 6f 66 20 45 61 67 6c 65 2c 20 74 68 65 20 66 6f  of Eagle, the fo
6240: 6c 6c 6f 77 69 6e 67 20 63 6f 6d 6d 61 6e 64 20  llowing command 
6250: 6d 75 73 74 20 62 65 20 75 73 65 64 20 69 6e 73  must be used ins
6260: 74 65 61 64 0d 0a 20 20 20 20 20 20 23 20 20 20  tead..      #   
6270: 20 20 20 20 28 61 6c 73 6f 20 61 6c 6c 20 6f 6e      (also all on
6280: 20 6f 6e 65 20 6c 69 6e 65 29 3a 0d 0a 20 20 20   one line):..   
6290: 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 20 20     #..      #   
62a0: 20 20 20 20 45 61 67 6c 65 53 68 65 6c 6c 2e 65      EagleShell.e
62b0: 78 65 20 2d 69 6e 69 74 69 61 6c 69 7a 65 20 2d  xe -initialize -
62c0: 70 6f 73 74 49 6e 69 74 69 61 6c 69 7a 65 0d 0a  postInitialize..
62d0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 20 20        #         
62e0: 22 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 49  "object invoke I
62f0: 6e 74 65 72 70 72 65 74 65 72 2e 47 65 74 41 63  nterpreter.GetAc
6300: 74 69 76 65 20 41 64 64 52 75 6e 74 69 6d 65 4f  tive AddRuntimeO
6310: 70 74 69 6f 6e 20 6e 61 74 69 76 65 22 0d 0a 20  ption native".. 
6320: 20 20 20 20 20 23 20 20 20 20 20 20 20 20 20 2d       #         -
6330: 66 69 6c 65 20 2e 5c 70 61 74 68 5c 74 6f 5c 61  file .\path\to\a
6340: 6c 6c 2e 65 61 67 6c 65 0d 0a 20 20 20 20 20 20  ll.eagle..      
6350: 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 6e  #..      if {[in
6360: 66 6f 20 65 78 69 73 74 73 20 3a 3a 62 75 69 6c  fo exists ::buil
6370: 64 5f 64 69 72 65 63 74 6f 72 79 5d 20 26 26 20  d_directory] && 
6380: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 73 74  \..          [st
6390: 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a 62  ring length $::b
63a0: 75 69 6c 64 5f 64 69 72 65 63 74 6f 72 79 5d 20  uild_directory] 
63b0: 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  > 0} then {..   
63c0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
63d0: 23 20 4e 4f 54 45 3a 20 54 68 65 20 6c 6f 63 61  # NOTE: The loca
63e0: 74 69 6f 6e 20 6f 66 20 74 68 65 20 62 75 69 6c  tion of the buil
63f0: 64 20 64 69 72 65 63 74 6f 72 79 20 68 61 73 20  d directory has 
6400: 62 65 65 6e 20 6f 76 65 72 72 69 64 64 65 6e 3b  been overridden;
6410: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
6420: 20 20 74 68 65 72 65 66 6f 72 65 2c 20 75 73 65    therefore, use
6430: 20 69 74 20 76 65 72 62 61 74 69 6d 2e 0d 0a 20   it verbatim... 
6440: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
6450: 20 20 72 65 74 75 72 6e 20 24 3a 3a 62 75 69 6c    return $::buil
6460: 64 5f 64 69 72 65 63 74 6f 72 79 0d 0a 20 20 20  d_directory..   
6470: 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
6480: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
6490: 23 20 4e 4f 54 45 3a 20 49 66 20 74 68 65 20 22  # NOTE: If the "
64a0: 6e 61 74 69 76 65 22 20 72 75 6e 74 69 6d 65 20  native" runtime 
64b0: 6f 70 74 69 6f 6e 20 69 73 20 73 65 74 2c 20 74  option is set, t
64c0: 68 65 20 6d 69 78 65 64 2d 6d 6f 64 65 20 61 73  he mixed-mode as
64d0: 73 65 6d 62 6c 79 0d 0a 20 20 20 20 20 20 20 20  sembly..        
64e0: 23 20 20 20 20 20 20 20 69 73 20 62 65 69 6e 67  #       is being
64f0: 20 74 65 73 74 65 64 2e 20 20 49 6e 20 74 68 61   tested.  In tha
6500: 74 20 63 61 73 65 2c 20 74 68 65 20 70 61 74 68  t case, the path
6510: 20 74 6f 20 74 68 65 20 62 75 69 6c 64 20 64 69   to the build di
6520: 72 65 63 74 6f 72 79 0d 0a 20 20 20 20 20 20 20  rectory..       
6530: 20 23 20 20 20 20 20 20 20 77 69 6c 6c 20 63 6f   #       will co
6540: 6e 74 61 69 6e 20 74 68 65 20 70 6c 61 74 66 6f  ntain the platfo
6550: 72 6d 20 6e 61 6d 65 20 61 6e 64 20 61 6c 6c 20  rm name and all 
6560: 74 68 65 20 62 69 6e 61 72 69 65 73 20 75 6e 64  the binaries und
6570: 65 72 20 74 65 73 74 0d 0a 20 20 20 20 20 20 20  er test..       
6580: 20 23 20 20 20 20 20 20 20 73 68 6f 75 6c 64 20   #       should 
6590: 62 65 20 70 72 65 73 65 6e 74 20 69 6e 20 74 68  be present in th
65a0: 61 74 20 64 69 72 65 63 74 6f 72 79 2e 20 20 49  at directory.  I
65b0: 66 20 74 68 65 20 22 6e 61 74 69 76 65 22 20 72  f the "native" r
65c0: 75 6e 74 69 6d 65 0d 0a 20 20 20 20 20 20 20 20  untime..        
65d0: 23 20 20 20 20 20 20 20 6f 70 74 69 6f 6e 20 69  #       option i
65e0: 73 20 6e 6f 74 20 73 65 74 2c 20 74 68 65 20 62  s not set, the b
65f0: 75 69 6c 64 20 64 69 72 65 63 74 6f 72 79 20 77  uild directory w
6600: 69 6c 6c 20 62 65 20 63 6f 6e 73 69 64 65 72 65  ill be considere
6610: 64 20 74 6f 20 62 65 0d 0a 20 20 20 20 20 20 20  d to be..       
6620: 20 23 20 20 20 20 20 20 20 22 70 6c 61 74 66 6f   #       "platfo
6630: 72 6d 2d 6e 65 75 74 72 61 6c 22 2c 20 77 69 74  rm-neutral", wit
6640: 68 20 74 68 65 20 6e 6f 74 61 62 6c 65 20 65 78  h the notable ex
6650: 63 65 70 74 69 6f 6e 20 6f 66 20 61 6e 79 20 6e  ception of any n
6660: 61 74 69 76 65 0d 0a 20 20 20 20 20 20 20 20 23  ative..        #
6670: 20 20 20 20 20 20 20 61 73 73 65 6d 62 6c 79 20         assembly 
6680: 28 65 2e 67 2e 20 22 53 51 4c 69 74 65 2e 49 6e  (e.g. "SQLite.In
6690: 74 65 72 6f 70 2e 64 6c 6c 22 29 20 63 6f 70 69  terop.dll") copi
66a0: 65 64 20 74 68 65 72 65 20 64 75 72 69 6e 67 20  ed there during 
66b0: 74 68 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20  the..        #  
66c0: 20 20 20 20 20 62 75 69 6c 64 20 70 72 6f 63 65       build proce
66d0: 73 73 20 69 74 73 65 6c 66 2e 20 20 49 66 20 74  ss itself.  If t
66e0: 68 65 20 62 75 69 6c 64 20 70 72 6f 63 65 73 73  he build process
66f0: 20 73 6f 6d 65 68 6f 77 20 64 6f 65 73 20 6e 6f   somehow does no
6700: 74 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  t..        #    
6710: 20 20 20 63 6f 70 79 20 74 68 65 20 6e 61 74 69     copy the nati
6720: 76 65 20 61 73 73 65 6d 62 6c 79 20 66 6f 72 20  ve assembly for 
6730: 74 68 69 73 20 70 6c 61 74 66 6f 72 6d 2c 20 6d  this platform, m
6740: 6f 73 74 20 6f 66 20 74 68 65 20 74 65 73 74 73  ost of the tests
6750: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
6760: 20 20 69 6e 20 74 68 65 20 73 75 69 74 65 20 77    in the suite w
6770: 69 6c 6c 20 73 69 6d 70 6c 79 20 62 65 20 73 6b  ill simply be sk
6780: 69 70 70 65 64 2e 20 20 47 65 6e 65 72 61 6c 6c  ipped.  Generall
6790: 79 20 73 70 65 61 6b 69 6e 67 2c 20 74 68 65 72  y speaking, ther
67a0: 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  e..        #    
67b0: 20 20 20 61 72 65 20 74 77 6f 20 77 61 79 73 20     are two ways 
67c0: 74 6f 20 62 75 69 6c 64 20 74 68 65 20 62 69 6e  to build the bin
67d0: 61 72 69 65 73 20 77 68 65 6e 20 70 72 65 70 61  aries when prepa
67e0: 72 69 6e 67 20 74 6f 20 72 75 6e 20 74 68 65 0d  ring to run the.
67f0: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
6800: 20 74 65 73 74 20 73 75 69 74 65 3a 0d 0a 20 20   test suite:..  
6810: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
6820: 20 23 20 20 20 20 20 20 20 31 2e 20 42 75 69 6c   #       1. Buil
6830: 64 20 74 68 65 20 73 65 70 61 72 61 74 65 20 6d  d the separate m
6840: 61 6e 61 67 65 64 20 61 6e 64 20 6e 61 74 69 76  anaged and nativ
6850: 65 20 61 73 73 65 6d 62 6c 69 65 73 20 75 73 69  e assemblies usi
6860: 6e 67 20 73 6f 6d 65 0d 0a 20 20 20 20 20 20 20  ng some..       
6870: 20 23 20 20 20 20 20 20 20 20 20 20 63 6f 6d 6d   #          comm
6880: 61 6e 64 73 20 73 69 6d 69 6c 61 72 20 74 6f 3a  ands similar to:
6890: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
68a0: 20 20 20 20 20 23 20 20 20 20 20 20 20 20 20 20       #          
68b0: 62 75 69 6c 64 2e 62 61 74 20 24 7b 43 6f 6e 66  build.bat ${Conf
68c0: 69 67 75 72 61 74 69 6f 6e 7d 4d 61 6e 61 67 65  iguration}Manage
68d0: 64 4f 6e 6c 79 20 24 7b 50 6c 61 74 66 6f 72 6d  dOnly ${Platform
68e0: 7d 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  }..        #    
68f0: 20 20 20 20 20 20 62 75 69 6c 64 2e 62 61 74 20        build.bat 
6900: 24 7b 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 7d  ${Configuration}
6910: 4e 61 74 69 76 65 4f 6e 6c 79 20 24 7b 50 6c 61  NativeOnly ${Pla
6920: 74 66 6f 72 6d 7d 0d 0a 20 20 20 20 20 20 20 20  tform}..        
6930: 23 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  #..        #    
6940: 20 20 20 20 20 20 57 68 65 72 65 20 24 7b 43 6f        Where ${Co
6950: 6e 66 69 67 75 72 61 74 69 6f 6e 7d 20 69 73 20  nfiguration} is 
6960: 65 69 74 68 65 72 20 22 44 65 62 75 67 22 20 6f  either "Debug" o
6970: 72 20 22 52 65 6c 65 61 73 65 22 20 61 6e 64 0d  r "Release" and.
6980: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
6990: 20 20 20 20 24 7b 50 6c 61 74 66 6f 72 6d 7d 20      ${Platform} 
69a0: 69 73 20 65 69 74 68 65 72 20 22 57 69 6e 33 32  is either "Win32
69b0: 22 20 6f 72 20 22 78 36 34 22 2e 0d 0a 20 20 20  " or "x64"...   
69c0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
69d0: 23 20 20 20 20 20 20 20 32 2e 20 42 75 69 6c 64  #       2. Build
69e0: 20 74 68 65 20 6d 69 78 65 64 2d 6d 6f 64 65 20   the mixed-mode 
69f0: 61 73 73 65 6d 62 6c 79 20 75 73 69 6e 67 20 61  assembly using a
6a00: 20 63 6f 6d 6d 61 6e 64 20 73 69 6d 69 6c 61 72   command similar
6a10: 20 74 6f 3a 0d 0a 20 20 20 20 20 20 20 20 23 0d   to:..        #.
6a20: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
6a30: 20 20 20 20 62 75 69 6c 64 2e 62 61 74 20 24 7b      build.bat ${
6a40: 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 7d 20 24  Configuration} $
6a50: 7b 50 6c 61 74 66 6f 72 6d 7d 0d 0a 20 20 20 20  {Platform}..    
6a60: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
6a70: 20 20 20 20 20 20 20 20 20 20 57 68 65 72 65 20            Where 
6a80: 24 7b 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 7d  ${Configuration}
6a90: 20 69 73 20 65 69 74 68 65 72 20 22 44 65 62 75   is either "Debu
6aa0: 67 22 20 6f 72 20 22 52 65 6c 65 61 73 65 22 20  g" or "Release" 
6ab0: 61 6e 64 0d 0a 20 20 20 20 20 20 20 20 23 20 20  and..        #  
6ac0: 20 20 20 20 20 20 20 20 24 7b 50 6c 61 74 66 6f          ${Platfo
6ad0: 72 6d 7d 20 69 73 20 65 69 74 68 65 72 20 22 57  rm} is either "W
6ae0: 69 6e 33 32 22 20 6f 72 20 22 78 36 34 22 2e 20  in32" or "x64". 
6af0: 20 49 66 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64   If this command
6b00: 20 69 73 0d 0a 20 20 20 20 20 20 20 20 23 20 20   is..        #  
6b10: 20 20 20 20 20 20 20 20 75 73 65 64 2c 20 76 61          used, va
6b20: 72 69 6f 75 73 20 74 65 73 74 73 20 74 68 61 74  rious tests that
6b30: 20 72 65 71 75 69 72 65 20 73 75 70 70 6c 65 6d   require supplem
6b40: 65 6e 74 61 72 79 20 6d 61 6e 61 67 65 64 0d 0a  entary managed..
6b50: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
6b60: 20 20 20 61 73 73 65 6d 62 6c 69 65 73 20 28 65     assemblies (e
6b70: 2e 67 2e 20 4c 49 4e 51 29 20 6d 61 79 20 62 65  .g. LINQ) may be
6b80: 20 73 6b 69 70 70 65 64 20 75 6e 6c 65 73 73 20   skipped unless 
6b90: 74 68 6f 73 65 20 62 69 6e 61 72 69 65 73 0d 0a  those binaries..
6ba0: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
6bb0: 20 20 20 61 72 65 20 73 75 62 73 65 71 75 65 6e     are subsequen
6bc0: 74 6c 79 20 63 6f 70 69 65 64 20 69 6e 74 6f 20  tly copied into 
6bd0: 74 68 65 20 63 6f 72 72 65 63 74 20 64 69 72 65  the correct dire
6be0: 63 74 6f 72 79 20 28 69 2e 65 2e 20 62 79 0d 0a  ctory (i.e. by..
6bf0: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
6c00: 20 20 20 22 74 65 73 74 5f 61 6c 6c 2e 62 61 74     "test_all.bat
6c10: 22 29 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  ")...        #..
6c20: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
6c30: 4e 6f 74 65 20 74 68 61 74 20 61 6c 6c 20 6f 66  Note that all of
6c40: 20 74 68 65 20 62 75 69 6c 64 20 63 6f 6d 6d 61   the build comma
6c50: 6e 64 73 20 61 62 6f 76 65 20 77 69 6c 6c 20 64  nds above will d
6c60: 65 66 61 75 6c 74 20 74 6f 20 75 73 69 6e 67 0d  efault to using.
6c70: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
6c80: 20 74 68 65 20 6c 61 74 65 73 74 20 76 65 72 73   the latest vers
6c90: 69 6f 6e 20 6f 66 20 4d 53 42 75 69 6c 64 20 61  ion of MSBuild a
6ca0: 76 61 69 6c 61 62 6c 65 20 61 6e 64 20 74 68 65  vailable and the
6cb0: 20 22 74 65 73 74 5f 79 65 61 72 22 20 6d 61 79   "test_year" may
6cc0: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
6cd0: 20 20 6e 65 65 64 20 74 6f 20 62 65 20 61 64 6a    need to be adj
6ce0: 75 73 74 65 64 20 61 63 63 6f 72 64 69 6e 67 6c  usted accordingl
6cf0: 79 20 74 6f 20 61 63 74 75 61 6c 6c 79 20 72 75  y to actually ru
6d00: 6e 20 74 68 65 20 74 65 73 74 20 73 75 69 74 65  n the test suite
6d10: 2e 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  ...        #    
6d20: 20 20 20 52 65 66 65 72 20 74 6f 20 74 68 65 20     Refer to the 
6d30: 63 6f 6d 6d 65 6e 74 73 20 69 6e 20 5b 67 65 74  comments in [get
6d40: 42 75 69 6c 64 59 65 61 72 5d 20 66 6f 72 20 6d  BuildYear] for m
6d50: 6f 72 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ore information 
6d60: 6f 6e 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  on..        #   
6d70: 20 20 20 20 68 6f 77 20 74 6f 20 73 65 74 20 74      how to set t
6d80: 68 69 73 20 76 61 72 69 61 62 6c 65 2e 0d 0a 20  his variable... 
6d90: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
6da0: 20 20 73 65 74 20 6e 61 74 69 76 65 20 5b 68 61    set native [ha
6db0: 73 52 75 6e 74 69 6d 65 4f 70 74 69 6f 6e 20 6e  sRuntimeOption n
6dc0: 61 74 69 76 65 5d 0d 0a 0d 0a 20 20 20 20 20 20  ative]....      
6dd0: 20 20 72 65 74 75 72 6e 20 5b 6a 6f 69 6e 42 75    return [joinBu
6de0: 69 6c 64 44 69 72 65 63 74 6f 72 79 20 24 6e 61  ildDirectory $na
6df0: 74 69 76 65 20 5b 67 65 74 42 75 69 6c 64 42 61  tive [getBuildBa
6e00: 73 65 44 69 72 65 63 74 6f 72 79 5d 20 5c 0d 0a  seDirectory] \..
6e10: 20 20 20 20 20 20 20 20 20 20 20 20 5b 67 65 74              [get
6e20: 42 75 69 6c 64 59 65 61 72 5d 20 5b 67 65 74 42  BuildYear] [getB
6e30: 75 69 6c 64 50 6c 61 74 66 6f 72 6d 20 24 6e 61  uildPlatform $na
6e40: 74 69 76 65 5d 20 5b 67 65 74 42 75 69 6c 64 43  tive] [getBuildC
6e50: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 5d 5d 0d 0a  onfiguration]]..
6e60: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a        }..    }..
6e70: 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74 52  ...    proc getR
6e80: 65 6c 65 61 73 65 56 65 72 73 69 6f 6e 20 7b 7d  eleaseVersion {}
6e90: 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20   {..      #..   
6ea0: 20 20 20 23 20 4e 4f 54 45 3a 20 46 69 67 75 72     # NOTE: Figur
6eb0: 65 20 6f 75 74 20 74 68 65 20 72 65 6c 65 61 73  e out the releas
6ec0: 65 20 76 65 72 73 69 6f 6e 20 66 6f 72 20 75 73  e version for us
6ed0: 65 20 77 69 74 68 20 74 68 65 20 62 75 69 6c 64  e with the build
6ee0: 20 64 69 72 65 63 74 6f 72 79 0d 0a 20 20 20 20   directory..    
6ef0: 20 20 23 20 20 20 20 20 20 20 77 68 65 6e 20 63    #       when c
6f00: 68 65 63 6b 69 6e 67 20 66 6f 72 20 61 76 61 69  hecking for avai
6f10: 6c 61 62 6c 65 20 72 65 6c 65 61 73 65 73 2e 0d  lable releases..
6f20: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
6f30: 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73  if {[info exists
6f40: 20 3a 3a 72 65 6c 65 61 73 65 5f 76 65 72 73 69   ::release_versi
6f50: 6f 6e 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20  on] && \..      
6f60: 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67      [string leng
6f70: 74 68 20 24 3a 3a 72 65 6c 65 61 73 65 5f 76 65  th $::release_ve
6f80: 72 73 69 6f 6e 5d 20 3e 20 30 7d 20 74 68 65 6e  rsion] > 0} then
6f90: 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20   {..        #.. 
6fa0: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54         # NOTE: T
6fb0: 68 65 20 72 65 6c 65 61 73 65 20 76 65 72 73 69  he release versi
6fc0: 6f 6e 20 68 61 73 20 62 65 65 6e 20 6f 76 65 72  on has been over
6fd0: 72 69 64 64 65 6e 3b 20 74 68 65 72 65 66 6f 72  ridden; therefor
6fe0: 65 2c 20 75 73 65 20 69 74 0d 0a 20 20 20 20 20  e, use it..     
6ff0: 20 20 20 23 20 20 20 20 20 20 20 76 65 72 62 61     #       verba
7000: 74 69 6d 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  tim...        #.
7010: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
7020: 24 3a 3a 72 65 6c 65 61 73 65 5f 76 65 72 73 69  $::release_versi
7030: 6f 6e 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65  on..      } else
7040: 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20   {..        #.. 
7050: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4e         # NOTE: N
7060: 6f 20 72 65 6c 65 61 73 65 20 76 65 72 73 69 6f  o release versio
7070: 6e 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2c 20  n is available, 
7080: 72 65 74 75 72 6e 20 61 6e 20 65 6d 70 74 79 20  return an empty 
7090: 73 74 72 69 6e 67 2e 0d 0a 20 20 20 20 20 20 20  string...       
70a0: 20 23 20 20 20 20 20 20 20 49 74 20 69 73 20 69   #       It is i
70b0: 6d 70 6f 72 74 61 6e 74 20 74 6f 20 72 65 74 75  mportant to retu
70c0: 72 6e 20 61 6e 20 65 6d 70 74 79 20 73 74 72 69  rn an empty stri
70d0: 6e 67 20 68 65 72 65 20 62 65 63 61 75 73 65 20  ng here because 
70e0: 74 68 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20  the..        #  
70f0: 20 20 20 20 20 72 65 73 75 6c 74 20 6f 66 20 74       result of t
7100: 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 6d 61  his procedure ma
7110: 79 20 62 65 20 75 73 65 64 20 77 69 74 68 20 5b  y be used with [
7120: 66 69 6c 65 20 6a 6f 69 6e 5d 2e 0d 0a 20 20 20  file join]...   
7130: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
7140: 72 65 74 75 72 6e 20 22 22 0d 0a 20 20 20 20 20  return ""..     
7150: 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20   }..    }.....  
7160: 20 20 70 72 6f 63 20 67 65 74 42 75 69 6c 64 46    proc getBuildF
7170: 69 6c 65 4e 61 6d 65 20 7b 20 66 69 6c 65 4e 61  ileName { fileNa
7180: 6d 65 20 7b 70 6c 61 74 66 6f 72 6d 20 22 22 7d  me {platform ""}
7190: 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20   } {..      #.. 
71a0: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 52 65 74       # NOTE: Ret
71b0: 75 72 6e 73 20 74 68 65 20 73 70 65 63 69 66 69  urns the specifi
71c0: 65 64 20 66 69 6c 65 20 6e 61 6d 65 20 61 73 20  ed file name as 
71d0: 69 66 20 69 74 20 77 65 72 65 20 6c 6f 63 61 74  if it were locat
71e0: 65 64 20 69 6e 20 74 68 65 0d 0a 20 20 20 20 20  ed in the..     
71f0: 20 23 20 20 20 20 20 20 20 62 75 69 6c 64 20 64   #       build d
7200: 69 72 65 63 74 6f 72 79 2c 20 64 69 73 63 61 72  irectory, discar
7210: 64 69 6e 67 20 61 6e 79 20 64 69 72 65 63 74 6f  ding any directo
7220: 72 79 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 70  ry information p
7230: 72 65 73 65 6e 74 0d 0a 20 20 20 20 20 20 23 20  resent..      # 
7240: 20 20 20 20 20 20 69 6e 20 74 68 65 20 66 69 6c        in the fil
7250: 65 20 6e 61 6d 65 20 61 73 20 70 72 6f 76 69 64  e name as provid
7260: 65 64 20 62 79 20 6f 75 72 20 63 61 6c 6c 65 72  ed by our caller
7270: 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
7280: 20 20 73 65 74 20 72 65 73 75 6c 74 20 5b 66 69    set result [fi
7290: 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65 20 5c 0d  le nativename \.
72a0: 0a 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65  .          [file
72b0: 20 6a 6f 69 6e 20 5b 67 65 74 42 75 69 6c 64 44   join [getBuildD
72c0: 69 72 65 63 74 6f 72 79 5d 20 24 70 6c 61 74 66  irectory] $platf
72d0: 6f 72 6d 20 5b 66 69 6c 65 20 74 61 69 6c 20 24  orm [file tail $
72e0: 66 69 6c 65 4e 61 6d 65 5d 5d 5d 0d 0a 0d 0a 20  fileName]]].... 
72f0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
7300: 48 41 43 4b 3a 20 57 68 65 6e 20 72 75 6e 6e 69  HACK: When runni
7310: 6e 67 20 6f 6e 20 57 6f 57 36 34 2c 20 61 73 73  ng on WoW64, ass
7320: 75 6d 65 20 74 68 65 20 74 65 73 74 20 65 78 65  ume the test exe
7330: 63 75 74 61 62 6c 65 73 20 61 72 65 20 70 72 65  cutables are pre
7340: 73 65 6e 74 0d 0a 20 20 20 20 20 20 23 20 20 20  sent..      #   
7350: 20 20 20 20 77 69 74 68 20 74 68 65 20 22 33 32      with the "32
7360: 22 20 73 75 66 66 69 78 20 6f 6e 20 74 68 65 6d  " suffix on them
7370: 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
7380: 20 20 69 66 20 7b 5b 69 73 52 75 6e 6e 69 6e 67    if {[isRunning
7390: 57 6f 57 36 34 5d 20 26 26 20 5b 66 69 6c 65 20  WoW64] && [file 
73a0: 65 78 74 65 6e 73 69 6f 6e 20 24 72 65 73 75 6c  extension $resul
73b0: 74 5d 20 65 71 20 22 2e 65 78 65 22 7d 20 74 68  t] eq ".exe"} th
73c0: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 65  en {..        se
73d0: 74 20 72 65 73 75 6c 74 20 5b 61 70 70 65 6e 64  t result [append
73e0: 41 72 67 73 20 5b 66 69 6c 65 20 72 6f 6f 74 6e  Args [file rootn
73f0: 61 6d 65 20 24 72 65 73 75 6c 74 5d 20 33 32 2e  ame $result] 32.
7400: 65 78 65 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d  exe]..      }...
7410: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 72  .      return $r
7420: 65 73 75 6c 74 0d 0a 20 20 20 20 7d 0d 0a 0c 0d  esult..    }....
7430: 0a 20 20 20 20 70 72 6f 63 20 67 65 74 45 78 74  .    proc getExt
7440: 65 72 6e 61 6c 44 69 72 65 63 74 6f 72 79 20 7b  ernalDirectory {
7450: 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  } {..      #..  
7460: 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 69 73      # NOTE: This
7470: 20 70 72 6f 63 65 64 75 72 65 20 72 65 74 75 72   procedure retur
7480: 6e 73 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  ns the directory
7490: 20 77 68 65 72 65 20 74 68 65 20 65 78 74 65 72   where the exter
74a0: 6e 61 6c 20 62 69 6e 61 72 79 0d 0a 20 20 20 20  nal binary..    
74b0: 20 20 23 20 20 20 20 20 20 20 66 69 6c 65 73 20    #       files 
74c0: 61 72 65 20 6c 6f 63 61 74 65 64 2e 0d 0a 20 20  are located...  
74d0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 72 65 74      #..      ret
74e0: 75 72 6e 20 5b 66 69 6c 65 20 6e 61 74 69 76 65  urn [file native
74f0: 6e 61 6d 65 20 5b 66 69 6c 65 20 64 69 72 6e 61  name [file dirna
7500: 6d 65 20 5b 66 69 6c 65 20 64 69 72 6e 61 6d 65  me [file dirname
7510: 20 5b 69 6e 66 6f 20 62 69 6e 61 72 79 5d 5d 5d   [info binary]]]
7520: 5d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  ]..    }.....   
7530: 20 70 72 6f 63 20 67 65 74 42 69 6e 61 72 79 44   proc getBinaryD
7540: 69 72 65 63 74 6f 72 79 20 7b 7d 20 7b 0d 0a 20  irectory {} {.. 
7550: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
7560: 4e 4f 54 45 3a 20 54 68 69 73 20 70 72 6f 63 65  NOTE: This proce
7570: 64 75 72 65 20 72 65 74 75 72 6e 73 20 74 68 65  dure returns the
7580: 20 64 69 72 65 63 74 6f 72 79 20 77 68 65 72 65   directory where
7590: 20 74 68 65 20 74 65 73 74 20 61 70 70 6c 69 63   the test applic
75a0: 61 74 69 6f 6e 0d 0a 20 20 20 20 20 20 23 20 20  ation..      #  
75b0: 20 20 20 20 20 69 74 73 65 6c 66 20 28 69 2e 65       itself (i.e
75c0: 2e 20 74 68 65 20 45 61 67 6c 65 20 73 68 65 6c  . the Eagle shel
75d0: 6c 29 20 69 73 20 6c 6f 63 61 74 65 64 2e 20 20  l) is located.  
75e0: 54 68 69 73 20 77 69 6c 6c 20 62 65 20 75 73 65  This will be use
75f0: 64 20 61 73 0d 0a 20 20 20 20 20 20 23 20 20 20  d as..      #   
7600: 20 20 20 20 74 68 65 20 64 65 73 74 69 6e 61 74      the destinat
7610: 69 6f 6e 20 66 6f 72 20 74 68 65 20 63 6f 70 69  ion for the copi
7620: 65 64 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53  ed System.Data.S
7630: 51 4c 69 74 65 20 6e 61 74 69 76 65 20 61 6e 64  QLite native and
7640: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
7650: 6d 61 6e 61 67 65 64 20 61 73 73 65 6d 62 6c 69  managed assembli
7660: 65 73 20 28 69 2e 65 2e 20 62 65 63 61 75 73 65  es (i.e. because
7670: 20 74 68 69 73 20 69 73 20 6f 6e 65 20 6f 66 20   this is one of 
7680: 74 68 65 20 66 65 77 20 70 6c 61 63 65 73 0d 0a  the few places..
7690: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 77 68        #       wh
76a0: 65 72 65 20 74 68 65 20 43 4c 52 20 77 69 6c 6c  ere the CLR will
76b0: 20 61 63 74 75 61 6c 6c 79 20 66 69 6e 64 20 61   actually find a
76c0: 6e 64 20 6c 6f 61 64 20 74 68 65 6d 20 70 72 6f  nd load them pro
76d0: 70 65 72 6c 79 29 2e 0d 0a 20 20 20 20 20 20 23  perly)...      #
76e0: 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66  ..      if {[inf
76f0: 6f 20 65 78 69 73 74 73 20 3a 3a 62 69 6e 61 72  o exists ::binar
7700: 79 5f 64 69 72 65 63 74 6f 72 79 5d 20 26 26 20  y_directory] && 
7710: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 73 74  \..          [st
7720: 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a 62  ring length $::b
7730: 69 6e 61 72 79 5f 64 69 72 65 63 74 6f 72 79 5d  inary_directory]
7740: 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20   > 0} then {..  
7750: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
7760: 20 23 20 4e 4f 54 45 3a 20 54 68 65 20 6c 6f 63   # NOTE: The loc
7770: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 62 69 6e  ation of the bin
7780: 61 72 79 20 64 69 72 65 63 74 6f 72 79 20 68 61  ary directory ha
7790: 73 20 62 65 65 6e 20 6f 76 65 72 72 69 64 64 65  s been overridde
77a0: 6e 3b 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  n;..        #   
77b0: 20 20 20 20 74 68 65 72 65 66 6f 72 65 2c 20 75      therefore, u
77c0: 73 65 20 69 74 20 76 65 72 62 61 74 69 6d 2e 0d  se it verbatim..
77d0: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
77e0: 20 20 20 20 72 65 74 75 72 6e 20 24 3a 3a 62 69      return $::bi
77f0: 6e 61 72 79 5f 64 69 72 65 63 74 6f 72 79 0d 0a  nary_directory..
7800: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
7810: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b          return [
7820: 69 6e 66 6f 20 62 69 6e 61 72 79 5d 0d 0a 20 20  info binary]..  
7830: 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d      }..    }....
7840: 0a 20 20 20 20 70 72 6f 63 20 67 65 74 45 78 74  .    proc getExt
7850: 65 72 6e 61 6c 46 69 6c 65 4e 61 6d 65 20 7b 20  ernalFileName { 
7860: 66 69 6c 65 4e 61 6d 65 20 7d 20 7b 0d 0a 20 20  fileName } {..  
7870: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
7880: 4f 54 45 3a 20 52 65 74 75 72 6e 73 20 74 68 65  OTE: Returns the
7890: 20 73 70 65 63 69 66 69 65 64 20 66 69 6c 65 20   specified file 
78a0: 6e 61 6d 65 20 61 73 20 69 66 20 69 74 20 77 65  name as if it we
78b0: 72 65 20 6c 6f 63 61 74 65 64 20 69 6e 20 74 68  re located in th
78c0: 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  e..      #      
78d0: 20 64 69 72 65 63 74 6f 72 79 20 63 6f 6e 74 61   directory conta
78e0: 69 6e 69 6e 67 20 74 68 65 20 65 78 74 65 72 6e  ining the extern
78f0: 61 6c 20 62 69 6e 61 72 69 65 73 2e 0d 0a 20 20  al binaries...  
7900: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 72 65 74      #..      ret
7910: 75 72 6e 20 5b 66 69 6c 65 20 6e 61 74 69 76 65  urn [file native
7920: 6e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20  name [file join 
7930: 5b 67 65 74 45 78 74 65 72 6e 61 6c 44 69 72 65  [getExternalDire
7940: 63 74 6f 72 79 5d 20 24 66 69 6c 65 4e 61 6d 65  ctory] $fileName
7950: 5d 5d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20  ]]..    }.....  
7960: 20 20 70 72 6f 63 20 67 65 74 42 69 6e 61 72 79    proc getBinary
7970: 46 69 6c 65 4e 61 6d 65 20 7b 20 66 69 6c 65 4e  FileName { fileN
7980: 61 6d 65 20 7b 70 6c 61 74 66 6f 72 6d 20 22 22  ame {platform ""
7990: 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a  } } {..      #..
79a0: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 52 65        # NOTE: Re
79b0: 74 75 72 6e 73 20 74 68 65 20 73 70 65 63 69 66  turns the specif
79c0: 69 65 64 20 66 69 6c 65 20 6e 61 6d 65 20 61 73  ied file name as
79d0: 20 69 66 20 69 74 20 77 65 72 65 20 6c 6f 63 61   if it were loca
79e0: 74 65 64 20 69 6e 20 74 68 65 0d 0a 20 20 20 20  ted in the..    
79f0: 20 20 23 20 20 20 20 20 20 20 62 69 6e 61 72 79    #       binary
7a00: 20 64 69 72 65 63 74 6f 72 79 2c 20 64 69 73 63   directory, disc
7a10: 61 72 64 69 6e 67 20 61 6e 79 20 64 69 72 65 63  arding any direc
7a20: 74 6f 72 79 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  tory information
7a30: 20 70 72 65 73 65 6e 74 0d 0a 20 20 20 20 20 20   present..      
7a40: 23 20 20 20 20 20 20 20 69 6e 20 74 68 65 20 66  #       in the f
7a50: 69 6c 65 20 6e 61 6d 65 20 61 73 20 70 72 6f 76  ile name as prov
7a60: 69 64 65 64 20 62 79 20 6f 75 72 20 63 61 6c 6c  ided by our call
7a70: 65 72 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  er...      #..  
7a80: 20 20 20 20 72 65 74 75 72 6e 20 5b 66 69 6c 65      return [file
7a90: 20 6e 61 74 69 76 65 6e 61 6d 65 20 5c 0d 0a 20   nativename \.. 
7aa0: 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20 6a           [file j
7ab0: 6f 69 6e 20 5b 67 65 74 42 69 6e 61 72 79 44 69  oin [getBinaryDi
7ac0: 72 65 63 74 6f 72 79 5d 20 24 70 6c 61 74 66 6f  rectory] $platfo
7ad0: 72 6d 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 66  rm [file tail $f
7ae0: 69 6c 65 4e 61 6d 65 5d 5d 5d 0d 0a 20 20 20 20  ileName]]]..    
7af0: 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67  }.....    proc g
7b00: 65 74 43 6f 72 65 42 69 6e 61 72 79 46 69 6c 65  etCoreBinaryFile
7b10: 4e 61 6d 65 20 7b 20 7b 70 6c 61 74 66 6f 72 6d  Name { {platform
7b20: 20 22 22 7d 20 7b 73 74 61 6e 64 61 72 64 20 22   ""} {standard "
7b30: 22 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d  "} } {..      #.
7b40: 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 52  .      # NOTE: R
7b50: 65 74 75 72 6e 73 20 74 68 65 20 66 75 6c 6c 20  eturns the full 
7b60: 70 61 74 68 20 66 6f 72 20 74 68 65 20 66 69 6c  path for the fil
7b70: 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  e containing the
7b80: 20 53 51 4c 69 74 65 20 63 6f 72 65 0d 0a 20 20   SQLite core..  
7b90: 20 20 20 20 23 20 20 20 20 20 20 20 6e 61 74 69      #       nati
7ba0: 76 65 20 6c 69 62 72 61 72 79 20 63 6f 64 65 20  ve library code 
7bb0: 66 6f 72 20 74 68 69 73 20 70 6c 61 74 66 6f 72  for this platfor
7bc0: 6d 2e 20 20 46 69 72 73 74 2c 20 63 68 65 63 6b  m.  First, check
7bd0: 20 61 6e 64 20 73 65 65 20 69 66 0d 0a 20 20 20   and see if..   
7be0: 20 20 20 23 20 20 20 20 20 20 20 74 68 65 20 53     #       the S
7bf0: 51 4c 69 74 65 20 63 6f 72 65 20 6e 61 74 69 76  QLite core nativ
7c00: 65 20 6c 69 62 72 61 72 79 20 68 61 73 20 61 6c  e library has al
7c10: 72 65 61 64 79 20 62 65 65 6e 20 6c 6f 61 64 65  ready been loade
7c20: 64 2e 20 20 4e 65 78 74 2c 0d 0a 20 20 20 20 20  d.  Next,..     
7c30: 20 23 20 20 20 20 20 20 20 66 61 6c 6c 62 61 63   #       fallbac
7c40: 6b 20 74 6f 20 77 68 61 74 20 74 68 65 20 66 75  k to what the fu
7c50: 6c 6c 20 70 61 74 68 20 73 68 6f 75 6c 64 20 62  ll path should b
7c60: 65 2c 20 62 61 73 65 64 20 6f 6e 20 77 68 65 74  e, based on whet
7c70: 68 65 72 20 74 68 65 0d 0a 20 20 20 20 20 20 23  her the..      #
7c80: 20 20 20 20 20 20 20 6d 69 78 65 64 2d 6d 6f 64         mixed-mod
7c90: 65 20 61 73 73 65 6d 62 6c 79 20 69 73 20 62 65  e assembly is be
7ca0: 69 6e 67 20 75 73 65 64 20 61 6e 64 20 74 68 65  ing used and the
7cb0: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 63 75 72   name of the cur
7cc0: 72 65 6e 74 0d 0a 20 20 20 20 20 20 23 20 20 20  rent..      #   
7cd0: 20 20 20 20 70 6c 61 74 66 6f 72 6d 2e 0d 0a 20      platform... 
7ce0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66       #..      if
7cf0: 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20   {[catch {..    
7d00: 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b      object invok
7d10: 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62  e -flags +NonPub
7d20: 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  lic \..         
7d30: 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53     System.Data.S
7d40: 51 4c 69 74 65 2e 55 6e 73 61 66 65 4e 61 74 69  QLite.UnsafeNati
7d50: 76 65 4d 65 74 68 6f 64 73 20 5f 53 51 4c 69 74  veMethods _SQLit
7d60: 65 4e 61 74 69 76 65 4d 6f 64 75 6c 65 46 69 6c  eNativeModuleFil
7d70: 65 4e 61 6d 65 0d 0a 20 20 20 20 20 20 7d 20 66  eName..      } f
7d80: 69 6c 65 4e 61 6d 65 5d 20 3d 3d 20 30 20 26 26  ileName] == 0 &&
7d90: 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20   [string length 
7da0: 24 66 69 6c 65 4e 61 6d 65 5d 20 3e 20 30 7d 20  $fileName] > 0} 
7db0: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
7dc0: 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
7dd0: 45 3a 20 54 68 65 20 53 51 4c 69 74 65 20 63 6f  E: The SQLite co
7de0: 72 65 20 6e 61 74 69 76 65 20 6c 69 62 72 61 72  re native librar
7df0: 79 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  y has already be
7e00: 65 6e 20 6c 6f 61 64 65 64 20 76 69 61 0d 0a 20  en loaded via.. 
7e10: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74         #       t
7e20: 68 65 20 6e 61 74 69 76 65 20 6c 69 62 72 61 72  he native librar
7e30: 79 20 70 72 65 2d 6c 6f 61 64 65 72 2e 20 20 52  y pre-loader.  R
7e40: 65 74 75 72 6e 20 74 68 61 74 20 66 69 6c 65 20  eturn that file 
7e50: 6e 61 6d 65 20 6e 6f 77 2e 0d 0a 20 20 20 20 20  name now...     
7e60: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65     #..        re
7e70: 74 75 72 6e 20 24 66 69 6c 65 4e 61 6d 65 0d 0a  turn $fileName..
7e80: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
7e90: 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
7ea0: 3a 20 49 66 20 74 68 65 20 22 6e 61 74 69 76 65  : If the "native
7eb0: 22 20 72 75 6e 74 69 6d 65 20 6f 70 74 69 6f 6e  " runtime option
7ec0: 20 68 61 73 20 62 65 65 6e 20 73 65 74 2c 20 61   has been set, a
7ed0: 6c 77 61 79 73 20 72 65 74 75 72 6e 20 74 68 65  lways return the
7ee0: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
7ef0: 66 69 6c 65 20 6e 61 6d 65 20 66 6f 72 20 74 68  file name for th
7f00: 65 20 6d 69 78 65 64 2d 6d 6f 64 65 20 61 73 73  e mixed-mode ass
7f10: 65 6d 62 6c 79 2e 0d 0a 20 20 20 20 20 20 23 0d  embly...      #.
7f20: 0a 20 20 20 20 20 20 69 66 20 7b 5b 68 61 73 52  .      if {[hasR
7f30: 75 6e 74 69 6d 65 4f 70 74 69 6f 6e 20 6e 61 74  untimeOption nat
7f40: 69 76 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ive]} then {..  
7f50: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
7f60: 20 23 20 4e 4f 54 45 3a 20 52 65 74 75 72 6e 20   # NOTE: Return 
7f70: 74 68 65 20 6d 69 78 65 64 2d 6d 6f 64 65 20 61  the mixed-mode a
7f80: 73 73 65 6d 62 6c 79 20 66 69 6c 65 20 6e 61 6d  ssembly file nam
7f90: 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  e...        #.. 
7fa0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b 66         return [f
7fb0: 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65 20 5c  ile nativename \
7fc0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 66  ..            [f
7fd0: 69 6c 65 20 6a 6f 69 6e 20 5b 67 65 74 42 69 6e  ile join [getBin
7fe0: 61 72 79 44 69 72 65 63 74 6f 72 79 5d 20 24 70  aryDirectory] $p
7ff0: 6c 61 74 66 6f 72 6d 20 53 79 73 74 65 6d 2e 44  latform System.D
8000: 61 74 61 2e 53 51 4c 69 74 65 2e 64 6c 6c 5d 5d  ata.SQLite.dll]]
8010: 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
8020: 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
8030: 54 45 3a 20 41 72 65 20 77 65 20 61 74 74 65 6d  TE: Are we attem
8040: 70 74 69 6e 67 20 74 6f 20 61 75 74 6f 6d 61 74  pting to automat
8050: 69 63 61 6c 6c 79 20 64 65 74 65 63 74 20 77 68  ically detect wh
8060: 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65  ether or not the
8070: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
8080: 69 6e 74 65 72 6f 70 20 61 73 73 65 6d 62 6c 79  interop assembly
8090: 20 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64 3f   should be used?
80a0: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
80b0: 20 73 65 74 20 61 75 74 6f 6d 61 74 69 63 20 5b   set automatic [
80c0: 65 78 70 72 20 7b 5b 73 74 72 69 6e 67 20 6c 65  expr {[string le
80d0: 6e 67 74 68 20 24 73 74 61 6e 64 61 72 64 5d 20  ngth $standard] 
80e0: 3d 3d 20 30 7d 5d 0d 0a 0d 0a 20 20 20 20 20 20  == 0}]....      
80f0: 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
8100: 20 46 69 72 73 74 2c 20 69 6e 20 65 69 74 68 65   First, in eithe
8110: 72 20 22 61 75 74 6f 6d 61 74 69 63 22 20 6f 72  r "automatic" or
8120: 20 22 6e 6f 6e 2d 73 74 61 6e 64 61 72 64 22 20   "non-standard" 
8130: 6d 6f 64 65 73 2c 20 61 74 74 65 6d 70 74 0d 0a  modes, attempt..
8140: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74 6f        #       to
8150: 20 66 69 6e 64 20 74 68 65 20 6e 61 74 69 76 65   find the native
8160: 2d 6f 6e 6c 79 20 69 6e 74 65 72 6f 70 20 61 73  -only interop as
8170: 73 65 6d 62 6c 79 2e 0d 0a 20 20 20 20 20 20 23  sembly...      #
8180: 0d 0a 20 20 20 20 20 20 69 66 20 7b 24 61 75 74  ..      if {$aut
8190: 6f 6d 61 74 69 63 20 7c 7c 20 21 24 73 74 61 6e  omatic || !$stan
81a0: 64 61 72 64 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  dard} then {..  
81b0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
81c0: 20 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74   # NOTE: Attempt
81d0: 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68   to determine th
81e0: 65 20 6e 61 74 69 76 65 2d 6f 6e 6c 79 20 69 6e  e native-only in
81f0: 74 65 72 6f 70 20 61 73 73 65 6d 62 6c 79 20 66  terop assembly f
8200: 69 6c 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20  ile..        #  
8210: 20 20 20 20 20 6e 61 6d 65 20 66 6f 72 20 74 68       name for th
8220: 69 73 20 70 6c 61 74 66 6f 72 6d 20 61 6e 64 20  is platform and 
8230: 74 68 65 6e 20 72 65 74 75 72 6e 20 69 74 2e 0d  then return it..
8240: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
8250: 20 20 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65      foreach file
8260: 4e 61 6d 65 4f 6e 6c 79 20 5b 67 65 74 49 6e 74  NameOnly [getInt
8270: 65 72 6f 70 41 73 73 65 6d 62 6c 79 46 69 6c 65  eropAssemblyFile
8280: 4e 61 6d 65 73 4f 6e 6c 79 5d 20 7b 0d 0a 20 20  NamesOnly] {..  
8290: 20 20 20 20 20 20 20 20 73 65 74 20 66 69 6c 65          set file
82a0: 4e 61 6d 65 20 5b 66 69 6c 65 20 6e 61 74 69 76  Name [file nativ
82b0: 65 6e 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20 20  ename \..       
82c0: 20 20 20 20 20 20 20 5b 66 69 6c 65 20 6a 6f 69         [file joi
82d0: 6e 20 5b 67 65 74 42 69 6e 61 72 79 44 69 72 65  n [getBinaryDire
82e0: 63 74 6f 72 79 5d 20 24 70 6c 61 74 66 6f 72 6d  ctory] $platform
82f0: 20 24 66 69 6c 65 4e 61 6d 65 4f 6e 6c 79 5d 5d   $fileNameOnly]]
8300: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66  ....          if
8310: 20 7b 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24   {[file exists $
8320: 66 69 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20  fileName]} then 
8330: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  {..            r
8340: 65 74 75 72 6e 20 24 66 69 6c 65 4e 61 6d 65 0d  eturn $fileName.
8350: 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  .          }..  
8360: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d        }..      }
8370: 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  ....      #..   
8380: 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 65 6e 2c     # NOTE: Then,
8390: 20 69 6e 20 65 69 74 68 65 72 20 22 61 75 74 6f   in either "auto
83a0: 6d 61 74 69 63 22 20 6f 72 20 22 73 74 61 6e 64  matic" or "stand
83b0: 61 72 64 22 20 6d 6f 64 65 73 2c 20 61 74 74 65  ard" modes, atte
83c0: 6d 70 74 20 74 6f 0d 0a 20 20 20 20 20 20 23 20  mpt to..      # 
83d0: 20 20 20 20 20 20 66 69 6e 64 20 74 68 65 20 73        find the s
83e0: 74 61 6e 64 61 72 64 20 53 51 4c 69 74 65 20 6c  tandard SQLite l
83f0: 69 62 72 61 72 79 2e 0d 0a 20 20 20 20 20 20 23  ibrary...      #
8400: 0d 0a 20 20 20 20 20 20 69 66 20 7b 24 61 75 74  ..      if {$aut
8410: 6f 6d 61 74 69 63 20 7c 7c 20 24 73 74 61 6e 64  omatic || $stand
8420: 61 72 64 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  ard} then {..   
8430: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
8440: 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74 20  # NOTE: Attempt 
8450: 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65  to determine the
8460: 20 6e 61 74 69 76 65 2d 6f 6e 6c 79 20 73 74 61   native-only sta
8470: 6e 64 61 72 64 20 53 51 4c 69 74 65 20 6c 69 62  ndard SQLite lib
8480: 72 61 72 79 0d 0a 20 20 20 20 20 20 20 20 23 20  rary..        # 
8490: 20 20 20 20 20 20 66 69 6c 65 20 6e 61 6d 65 20        file name 
84a0: 66 6f 72 20 74 68 69 73 20 70 6c 61 74 66 6f 72  for this platfor
84b0: 6d 20 61 6e 64 20 74 68 65 6e 20 72 65 74 75 72  m and then retur
84c0: 6e 20 69 74 2e 0d 0a 20 20 20 20 20 20 20 20 23  n it...        #
84d0: 0d 0a 20 20 20 20 20 20 20 20 66 6f 72 65 61 63  ..        foreac
84e0: 68 20 66 69 6c 65 4e 61 6d 65 4f 6e 6c 79 20 5b  h fileNameOnly [
84f0: 67 65 74 4e 61 74 69 76 65 4c 69 62 72 61 72 79  getNativeLibrary
8500: 46 69 6c 65 4e 61 6d 65 73 4f 6e 6c 79 5d 20 7b  FileNamesOnly] {
8510: 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20  ..          set 
8520: 66 69 6c 65 4e 61 6d 65 20 5b 66 69 6c 65 20 6e  fileName [file n
8530: 61 74 69 76 65 6e 61 6d 65 20 5c 0d 0a 20 20 20  ativename \..   
8540: 20 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65             [file
8550: 20 6a 6f 69 6e 20 5b 67 65 74 42 69 6e 61 72 79   join [getBinary
8560: 44 69 72 65 63 74 6f 72 79 5d 20 24 70 6c 61 74  Directory] $plat
8570: 66 6f 72 6d 20 24 66 69 6c 65 4e 61 6d 65 4f 6e  form $fileNameOn
8580: 6c 79 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  ly]]....        
8590: 20 20 69 66 20 7b 5b 66 69 6c 65 20 65 78 69 73    if {[file exis
85a0: 74 73 20 24 66 69 6c 65 4e 61 6d 65 5d 7d 20 74  ts $fileName]} t
85b0: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
85c0: 20 20 20 72 65 74 75 72 6e 20 24 66 69 6c 65 4e     return $fileN
85d0: 61 6d 65 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  ame..          }
85e0: 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20  ..        }..   
85f0: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d     }....      #.
8600: 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 57  .      # NOTE: W
8610: 61 73 20 74 68 65 20 6d 61 6e 61 67 65 64 20 61  as the managed a
8620: 73 73 65 6d 62 6c 79 20 63 6f 6d 70 69 6c 65 64  ssembly compiled
8630: 20 65 78 70 65 63 74 69 6e 67 20 74 6f 20 64 65   expecting to de
8640: 61 6c 20 77 69 74 68 20 74 68 65 0d 0a 20 20 20  al with the..   
8650: 20 20 20 23 20 20 20 20 20 20 20 73 74 61 6e 64     #       stand
8660: 61 72 64 20 63 6f 72 65 20 6c 69 62 72 61 72 79  ard core library
8670: 3f 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ?..      #..    
8680: 20 20 69 66 20 7b 5b 68 61 76 65 53 51 4c 69 74    if {[haveSQLit
8690: 65 44 65 66 69 6e 65 43 6f 6e 73 74 61 6e 74 20  eDefineConstant 
86a0: 53 51 4c 49 54 45 5f 53 54 41 4e 44 41 52 44 5d  SQLITE_STANDARD]
86b0: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
86c0: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
86d0: 4f 54 45 3a 20 46 61 6c 6c 62 61 63 6b 20 74 6f  OTE: Fallback to
86e0: 20 72 65 74 75 72 6e 69 6e 67 20 74 68 65 20 6e   returning the n
86f0: 61 74 69 76 65 2d 6f 6e 6c 79 20 73 74 61 6e 64  ative-only stand
8700: 61 72 64 20 53 51 4c 69 74 65 20 6c 69 62 72 61  ard SQLite libra
8710: 72 79 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  ry..        #   
8720: 20 20 20 20 66 69 6c 65 20 6e 61 6d 65 20 66 6f      file name fo
8730: 72 20 74 68 65 20 70 6c 61 74 66 6f 72 6d 2e 0d  r the platform..
8740: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
8750: 20 20 20 20 73 65 74 20 66 69 6c 65 4e 61 6d 65      set fileName
8760: 73 4f 6e 6c 79 20 5b 67 65 74 4e 61 74 69 76 65  sOnly [getNative
8770: 4c 69 62 72 61 72 79 46 69 6c 65 4e 61 6d 65 73  LibraryFileNames
8780: 4f 6e 6c 79 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  Only]....       
8790: 20 69 66 20 7b 5b 6c 6c 65 6e 67 74 68 20 24 66   if {[llength $f
87a0: 69 6c 65 4e 61 6d 65 73 4f 6e 6c 79 5d 20 3d 3d  ileNamesOnly] ==
87b0: 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
87c0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 22 22 0d        return "".
87d0: 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  .        }....  
87e0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b 66 69        return [fi
87f0: 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65 20 5b 66  le nativename [f
8800: 69 6c 65 20 6a 6f 69 6e 20 5c 0d 0a 20 20 20 20  ile join \..    
8810: 20 20 20 20 20 20 20 20 5b 67 65 74 42 69 6e 61          [getBina
8820: 72 79 44 69 72 65 63 74 6f 72 79 5d 20 24 70 6c  ryDirectory] $pl
8830: 61 74 66 6f 72 6d 20 5b 6c 69 6e 64 65 78 20 24  atform [lindex $
8840: 66 69 6c 65 4e 61 6d 65 73 4f 6e 6c 79 20 30 5d  fileNamesOnly 0]
8850: 5d 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65  ]]..      } else
8860: 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20   {..        #.. 
8870: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 46         # NOTE: F
8880: 61 6c 6c 62 61 63 6b 20 74 6f 20 72 65 74 75 72  allback to retur
8890: 6e 69 6e 67 20 74 68 65 20 6e 61 74 69 76 65 2d  ning the native-
88a0: 6f 6e 6c 79 20 69 6e 74 65 72 6f 70 20 61 73 73  only interop ass
88b0: 65 6d 62 6c 79 20 66 69 6c 65 0d 0a 20 20 20 20  embly file..    
88c0: 20 20 20 20 23 20 20 20 20 20 20 20 6e 61 6d 65      #       name
88d0: 20 66 6f 72 20 74 68 65 20 70 6c 61 74 66 6f 72   for the platfor
88e0: 6d 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  m...        #.. 
88f0: 20 20 20 20 20 20 20 73 65 74 20 66 69 6c 65 4e         set fileN
8900: 61 6d 65 73 4f 6e 6c 79 20 5b 67 65 74 49 6e 74  amesOnly [getInt
8910: 65 72 6f 70 41 73 73 65 6d 62 6c 79 46 69 6c 65  eropAssemblyFile
8920: 4e 61 6d 65 73 4f 6e 6c 79 5d 0d 0a 0d 0a 20 20  NamesOnly]....  
8930: 20 20 20 20 20 20 69 66 20 7b 5b 6c 6c 65 6e 67        if {[lleng
8940: 74 68 20 24 66 69 6c 65 4e 61 6d 65 73 4f 6e 6c  th $fileNamesOnl
8950: 79 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d  y] == 0} then {.
8960: 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
8970: 6e 20 22 22 0d 0a 20 20 20 20 20 20 20 20 7d 0d  n ""..        }.
8980: 0a 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ...        retur
8990: 6e 20 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e 61  n [file nativena
89a0: 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5c 0d  me [file join \.
89b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 67 65  .            [ge
89c0: 74 42 69 6e 61 72 79 44 69 72 65 63 74 6f 72 79  tBinaryDirectory
89d0: 5d 20 24 70 6c 61 74 66 6f 72 6d 20 5b 6c 69 6e  ] $platform [lin
89e0: 64 65 78 20 24 66 69 6c 65 4e 61 6d 65 73 4f 6e  dex $fileNamesOn
89f0: 6c 79 20 30 5d 5d 5d 0d 0a 20 20 20 20 20 20 7d  ly 0]]]..      }
8a00: 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
8a10: 70 72 6f 63 20 67 65 74 43 6f 6d 6d 6f 6e 44 69  proc getCommonDi
8a20: 72 65 63 74 6f 72 79 20 7b 7d 20 7b 0d 0a 20 20  rectory {} {..  
8a30: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
8a40: 4f 54 45 3a 20 54 68 69 73 20 70 72 6f 63 65 64  OTE: This proced
8a50: 75 72 65 20 72 65 74 75 72 6e 73 20 74 68 65 20  ure returns the 
8a60: 64 69 72 65 63 74 6f 72 79 20 77 68 65 72 65 20  directory where 
8a70: 74 68 65 20 74 65 73 74 20 73 63 72 69 70 74 73  the test scripts
8a80: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
8a90: 73 68 6f 75 6c 64 20 62 65 20 6c 6f 63 61 74 65  should be locate
8aa0: 64 2e 20 20 42 79 20 64 65 66 61 75 6c 74 2c 20  d.  By default, 
8ab0: 74 68 69 73 20 6a 75 73 74 20 72 65 74 75 72 6e  this just return
8ac0: 73 20 74 68 65 20 45 61 67 6c 65 0d 0a 20 20 20  s the Eagle..   
8ad0: 20 20 20 23 20 20 20 20 20 20 20 62 69 6e 61 72     #       binar
8ae0: 79 20 64 69 72 65 63 74 6f 72 79 2e 0d 0a 20 20  y directory...  
8af0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20      #..      if 
8b00: 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  {[info exists ::
8b10: 63 6f 6d 6d 6f 6e 5f 64 69 72 65 63 74 6f 72 79  common_directory
8b20: 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20  ] && \..        
8b30: 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68    [string length
8b40: 20 24 3a 3a 63 6f 6d 6d 6f 6e 5f 64 69 72 65 63   $::common_direc
8b50: 74 6f 72 79 5d 20 3e 20 30 7d 20 74 68 65 6e 20  tory] > 0} then 
8b60: 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
8b70: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68        # NOTE: Th
8b80: 65 20 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 74 68  e location of th
8b90: 65 20 63 6f 6d 6d 6f 6e 20 64 69 72 65 63 74 6f  e common directo
8ba0: 72 79 20 68 61 73 20 62 65 65 6e 20 73 65 74 3b  ry has been set;
8bb0: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
8bc0: 20 20 74 68 65 72 65 66 6f 72 65 2c 20 75 73 65    therefore, use
8bd0: 20 69 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d   it...        #.
8be0: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
8bf0: 24 3a 3a 63 6f 6d 6d 6f 6e 5f 64 69 72 65 63 74  $::common_direct
8c00: 6f 72 79 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73  ory..      } els
8c10: 65 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74  eif {[info exist
8c20: 73 20 3a 3a 76 65 6e 64 6f 72 5f 64 69 72 65 63  s ::vendor_direc
8c30: 74 6f 72 79 5d 20 26 26 20 5c 0d 0a 20 20 20 20  tory] && \..    
8c40: 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65        [string le
8c50: 6e 67 74 68 20 24 3a 3a 76 65 6e 64 6f 72 5f 64  ngth $::vendor_d
8c60: 69 72 65 63 74 6f 72 79 5d 20 3e 20 30 7d 20 74  irectory] > 0} t
8c70: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  hen {..        #
8c80: 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
8c90: 3a 20 54 68 65 20 6c 6f 63 61 74 69 6f 6e 20 6f  : The location o
8ca0: 66 20 74 68 65 20 76 65 6e 64 6f 72 20 64 69 72  f the vendor dir
8cb0: 65 63 74 6f 72 79 20 68 61 73 20 62 65 65 6e 20  ectory has been 
8cc0: 73 65 74 3b 0d 0a 20 20 20 20 20 20 20 20 23 20  set;..        # 
8cd0: 20 20 20 20 20 20 74 68 65 72 65 66 6f 72 65 2c        therefore,
8ce0: 20 75 73 65 20 69 74 2e 0d 0a 20 20 20 20 20 20   use it...      
8cf0: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74    #..        ret
8d00: 75 72 6e 20 24 3a 3a 76 65 6e 64 6f 72 5f 64 69  urn $::vendor_di
8d10: 72 65 63 74 6f 72 79 0d 0a 20 20 20 20 20 20 7d  rectory..      }
8d20: 20 65 6c 73 65 69 66 20 7b 5b 69 6e 66 6f 20 65   elseif {[info e
8d30: 78 69 73 74 73 20 3a 3a 74 63 6c 5f 6c 69 62 72  xists ::tcl_libr
8d40: 61 72 79 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20  ary] && \..     
8d50: 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e       [string len
8d60: 67 74 68 20 24 3a 3a 74 63 6c 5f 6c 69 62 72 61  gth $::tcl_libra
8d70: 72 79 5d 20 3e 20 30 20 26 26 20 5c 0d 0a 20 20  ry] > 0 && \..  
8d80: 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20 69 73          [file is
8d90: 64 69 72 65 63 74 6f 72 79 20 24 3a 3a 74 63 6c  directory $::tcl
8da0: 5f 6c 69 62 72 61 72 79 5d 7d 20 74 68 65 6e 20  _library]} then 
8db0: 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
8dc0: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68        # NOTE: Th
8dd0: 65 20 76 61 72 69 61 62 6c 65 20 77 69 74 68 20  e variable with 
8de0: 74 68 65 20 6c 6f 63 61 74 69 6f 6e 20 6f 66 20  the location of 
8df0: 74 68 65 20 73 63 72 69 70 74 20 6c 69 62 72 61  the script libra
8e00: 72 79 20 69 73 0d 0a 20 20 20 20 20 20 20 20 23  ry is..        #
8e10: 20 20 20 20 20 20 20 73 65 74 20 61 6e 64 20 61         set and a
8e20: 70 70 65 61 72 73 20 74 6f 20 62 65 20 61 20 72  ppears to be a r
8e30: 65 61 6c 20 64 69 72 65 63 74 6f 72 79 20 28 69  eal directory (i
8e40: 2e 65 2e 20 6e 6f 74 20 65 6d 62 65 64 64 65 64  .e. not embedded
8e50: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
8e60: 20 20 77 69 74 68 69 6e 20 61 20 66 69 6c 65 29    within a file)
8e70: 3b 20 74 68 65 72 65 66 6f 72 65 2c 20 75 73 65  ; therefore, use
8e80: 20 69 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d   it...        #.
8e90: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
8ea0: 24 3a 3a 74 63 6c 5f 6c 69 62 72 61 72 79 0d 0a  $::tcl_library..
8eb0: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
8ec0: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
8ed0: 20 20 20 23 20 4e 4f 54 45 3a 20 46 61 6c 6c 62     # NOTE: Fallb
8ee0: 61 63 6b 20 74 6f 20 74 68 65 20 64 69 72 65 63  ack to the direc
8ef0: 74 6f 72 79 20 63 6f 6e 74 61 69 6e 69 6e 67 20  tory containing 
8f00: 74 68 65 20 65 78 65 63 75 74 61 62 6c 65 2e 0d  the executable..
8f10: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
8f20: 20 20 20 20 72 65 74 75 72 6e 20 5b 69 6e 66 6f      return [info
8f30: 20 62 69 6e 61 72 79 5d 0d 0a 20 20 20 20 20 20   binary]..      
8f40: 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  }..    }.....   
8f50: 20 70 72 6f 63 20 67 65 74 44 61 74 61 62 61 73   proc getDatabas
8f60: 65 44 69 72 65 63 74 6f 72 79 20 7b 7d 20 7b 0d  eDirectory {} {.
8f70: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
8f80: 23 20 4e 4f 54 45 3a 20 54 68 69 73 20 70 72 6f  # NOTE: This pro
8f90: 63 65 64 75 72 65 20 72 65 74 75 72 6e 73 20 74  cedure returns t
8fa0: 68 65 20 64 69 72 65 63 74 6f 72 79 20 77 68 65  he directory whe
8fb0: 72 65 20 74 68 65 20 74 65 73 74 20 64 61 74 61  re the test data
8fc0: 62 61 73 65 73 0d 0a 20 20 20 20 20 20 23 20 20  bases..      #  
8fd0: 20 20 20 20 20 73 68 6f 75 6c 64 20 62 65 20 6c       should be l
8fe0: 6f 63 61 74 65 64 2e 20 20 42 79 20 64 65 66 61  ocated.  By defa
8ff0: 75 6c 74 2c 20 74 68 69 73 20 6a 75 73 74 20 75  ult, this just u
9000: 73 65 73 20 74 68 65 20 74 65 6d 70 6f 72 61 72  ses the temporar
9010: 79 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  y..      #      
9020: 20 64 69 72 65 63 74 6f 72 79 20 63 6f 6e 66 69   directory confi
9030: 67 75 72 65 64 20 66 6f 72 20 74 68 69 73 20 73  gured for this s
9040: 79 73 74 65 6d 2e 0d 0a 20 20 20 20 20 20 23 0d  ystem...      #.
9050: 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f  .      if {[info
9060: 20 65 78 69 73 74 73 20 3a 3a 64 61 74 61 62 61   exists ::databa
9070: 73 65 5f 64 69 72 65 63 74 6f 72 79 5d 20 26 26  se_directory] &&
9080: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 73   \..          [s
9090: 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a  tring length $::
90a0: 64 61 74 61 62 61 73 65 5f 64 69 72 65 63 74 6f  database_directo
90b0: 72 79 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d  ry] > 0} then {.
90c0: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
90d0: 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 65 20      # NOTE: The 
90e0: 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  location of the 
90f0: 64 61 74 61 62 61 73 65 20 64 69 72 65 63 74 6f  database directo
9100: 72 79 20 68 61 73 20 62 65 65 6e 20 6f 76 65 72  ry has been over
9110: 72 69 64 64 65 6e 3b 0d 0a 20 20 20 20 20 20 20  ridden;..       
9120: 20 23 20 20 20 20 20 20 20 74 68 65 72 65 66 6f   #       therefo
9130: 72 65 2c 20 75 73 65 20 69 74 2e 0d 0a 20 20 20  re, use it...   
9140: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
9150: 72 65 74 75 72 6e 20 24 3a 3a 64 61 74 61 62 61  return $::databa
9160: 73 65 5f 64 69 72 65 63 74 6f 72 79 0d 0a 20 20  se_directory..  
9170: 20 20 20 20 7d 20 65 6c 73 65 69 66 20 7b 5b 69      } elseif {[i
9180: 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 73 63 72  nfo exists ::scr
9190: 61 74 63 68 5f 64 69 72 65 63 74 6f 72 79 5d 20  atch_directory] 
91a0: 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  && \..          
91b0: 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
91c0: 3a 3a 73 63 72 61 74 63 68 5f 64 69 72 65 63 74  ::scratch_direct
91d0: 6f 72 79 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b  ory] > 0} then {
91e0: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
91f0: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 65       # NOTE: The
9200: 20 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 74 68 65   location of the
9210: 20 73 63 72 61 74 63 68 20 64 69 72 65 63 74 6f   scratch directo
9220: 72 79 20 68 61 73 20 62 65 65 6e 20 6f 76 65 72  ry has been over
9230: 72 69 64 64 65 6e 3b 0d 0a 20 20 20 20 20 20 20  ridden;..       
9240: 20 23 20 20 20 20 20 20 20 74 68 65 72 65 66 6f   #       therefo
9250: 72 65 2c 20 75 73 65 20 69 74 2e 0d 0a 20 20 20  re, use it...   
9260: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
9270: 72 65 74 75 72 6e 20 24 3a 3a 73 63 72 61 74 63  return $::scratc
9280: 68 5f 64 69 72 65 63 74 6f 72 79 0d 0a 20 20 20  h_directory..   
9290: 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
92a0: 20 20 20 20 20 72 65 74 75 72 6e 20 5b 67 65 74       return [get
92b0: 54 65 6d 70 6f 72 61 72 79 50 61 74 68 5d 0d 0a  TemporaryPath]..
92c0: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a        }..    }..
92d0: 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74 54  ...    proc getT
92e0: 65 6d 70 6f 72 61 72 79 44 69 72 65 63 74 6f 72  emporaryDirector
92f0: 79 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d  y {} {..      #.
9300: 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54  .      # NOTE: T
9310: 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 72 65  his procedure re
9320: 74 75 72 6e 73 20 74 68 65 20 64 69 72 65 63 74  turns the direct
9330: 6f 72 79 20 77 68 65 72 65 20 74 68 65 20 74 65  ory where the te
9340: 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 0d 0a 20  mporary files.. 
9350: 20 20 20 20 20 23 20 20 20 20 20 20 20 73 68 6f       #       sho
9360: 75 6c 64 20 62 65 20 6c 6f 63 61 74 65 64 2e 20  uld be located. 
9370: 20 42 79 20 64 65 66 61 75 6c 74 2c 20 74 68 69   By default, thi
9380: 73 20 6a 75 73 74 20 75 73 65 73 20 74 68 65 20  s just uses the 
9390: 74 65 6d 70 6f 72 61 72 79 0d 0a 20 20 20 20 20  temporary..     
93a0: 20 23 20 20 20 20 20 20 20 64 69 72 65 63 74 6f   #       directo
93b0: 72 79 20 63 6f 6e 66 69 67 75 72 65 64 20 66 6f  ry configured fo
93c0: 72 20 74 68 69 73 20 73 79 73 74 65 6d 2e 0d 0a  r this system...
93d0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69        #..      i
93e0: 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20  f {[info exists 
93f0: 3a 3a 74 65 6d 70 6f 72 61 72 79 5f 64 69 72 65  ::temporary_dire
9400: 63 74 6f 72 79 5d 20 26 26 20 5c 0d 0a 20 20 20  ctory] && \..   
9410: 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c         [string l
9420: 65 6e 67 74 68 20 24 3a 3a 74 65 6d 70 6f 72 61  ength $::tempora
9430: 72 79 5f 64 69 72 65 63 74 6f 72 79 5d 20 3e 20  ry_directory] > 
9440: 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
9450: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
9460: 4e 4f 54 45 3a 20 54 68 65 20 6c 6f 63 61 74 69  NOTE: The locati
9470: 6f 6e 20 6f 66 20 74 68 65 20 74 65 6d 70 6f 72  on of the tempor
9480: 61 72 79 20 64 69 72 65 63 74 6f 72 79 20 68 61  ary directory ha
9490: 73 20 62 65 65 6e 20 6f 76 65 72 72 69 64 64 65  s been overridde
94a0: 6e 3b 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  n;..        #   
94b0: 20 20 20 20 74 68 65 72 65 66 6f 72 65 2c 20 75      therefore, u
94c0: 73 65 20 69 74 2e 0d 0a 20 20 20 20 20 20 20 20  se it...        
94d0: 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  #..        retur
94e0: 6e 20 24 3a 3a 74 65 6d 70 6f 72 61 72 79 5f 64  n $::temporary_d
94f0: 69 72 65 63 74 6f 72 79 0d 0a 20 20 20 20 20 20  irectory..      
9500: 7d 20 65 6c 73 65 69 66 20 7b 5b 69 6e 66 6f 20  } elseif {[info 
9510: 65 78 69 73 74 73 20 3a 3a 73 63 72 61 74 63 68  exists ::scratch
9520: 5f 64 69 72 65 63 74 6f 72 79 5d 20 26 26 20 5c  _directory] && \
9530: 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 73 74 72  ..          [str
9540: 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a 73 63  ing length $::sc
9550: 72 61 74 63 68 5f 64 69 72 65 63 74 6f 72 79 5d  ratch_directory]
9560: 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20   > 0} then {..  
9570: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
9580: 20 23 20 4e 4f 54 45 3a 20 54 68 65 20 6c 6f 63   # NOTE: The loc
9590: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 63 72  ation of the scr
95a0: 61 74 63 68 20 64 69 72 65 63 74 6f 72 79 20 68  atch directory h
95b0: 61 73 20 62 65 65 6e 20 6f 76 65 72 72 69 64 64  as been overridd
95c0: 65 6e 3b 0d 0a 20 20 20 20 20 20 20 20 23 20 20  en;..        #  
95d0: 20 20 20 20 20 74 68 65 72 65 66 6f 72 65 2c 20       therefore, 
95e0: 75 73 65 20 69 74 2e 0d 0a 20 20 20 20 20 20 20  use it...       
95f0: 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75   #..        retu
9600: 72 6e 20 24 3a 3a 73 63 72 61 74 63 68 5f 64 69  rn $::scratch_di
9610: 72 65 63 74 6f 72 79 0d 0a 20 20 20 20 20 20 7d  rectory..      }
9620: 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
9630: 20 72 65 74 75 72 6e 20 5b 67 65 74 54 65 6d 70   return [getTemp
9640: 6f 72 61 72 79 50 61 74 68 5d 0d 0a 20 20 20 20  oraryPath]..    
9650: 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20    }..    }..... 
9660: 20 20 20 70 72 6f 63 20 67 65 74 45 78 65 63 75     proc getExecu
9670: 74 65 4f 6e 53 65 74 75 70 20 7b 7d 20 7b 0d 0a  teOnSetup {} {..
9680: 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20        if {[info 
9690: 65 78 69 73 74 73 20 3a 3a 65 78 65 63 75 74 65  exists ::execute
96a0: 5f 6f 6e 5f 73 65 74 75 70 5d 20 26 26 20 5c 0d  _on_setup] && \.
96b0: 0a 20 20 20 20 20 20 20 20 20 20 5b 73 74 72 69  .          [stri
96c0: 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a 65 78 65  ng length $::exe
96d0: 63 75 74 65 5f 6f 6e 5f 73 65 74 75 70 5d 20 3e  cute_on_setup] >
96e0: 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
96f0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
9700: 20 4e 4f 54 45 3a 20 52 65 74 75 72 6e 20 74 68   NOTE: Return th
9710: 65 20 63 6f 6e 66 69 67 75 72 65 64 20 53 51 4c  e configured SQL
9720: 20 74 6f 20 65 78 65 63 75 74 65 20 64 75 72 69   to execute duri
9730: 6e 67 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  ng the connectio
9740: 6e 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  n..        #    
9750: 20 20 20 73 65 74 75 70 20 70 72 6f 63 65 64 75     setup procedu
9760: 72 65 20 28 69 2e 65 2e 20 66 6f 72 20 65 76 65  re (i.e. for eve
9770: 72 79 20 74 65 73 74 20 64 61 74 61 62 61 73 65  ry test database
9780: 20 63 6f 6e 6e 65 63 74 69 6f 6e 29 2e 0d 0a 20   connection)... 
9790: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
97a0: 20 20 72 65 74 75 72 6e 20 24 3a 3a 65 78 65 63    return $::exec
97b0: 75 74 65 5f 6f 6e 5f 73 65 74 75 70 0d 0a 20 20  ute_on_setup..  
97c0: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
97d0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
97e0: 20 23 20 4e 4f 54 45 3a 20 42 79 20 64 65 66 61   # NOTE: By defa
97f0: 75 6c 74 2c 20 74 68 65 72 65 20 69 73 20 6e 6f  ult, there is no
9800: 20 53 51 4c 20 74 6f 20 65 78 65 63 75 74 65 20   SQL to execute 
9810: 64 75 72 69 6e 67 20 74 68 65 20 63 6f 6e 6e 65  during the conne
9820: 63 74 69 6f 6e 0d 0a 20 20 20 20 20 20 20 20 23  ction..        #
9830: 20 20 20 20 20 20 20 73 65 74 75 70 20 70 72 6f         setup pro
9840: 63 65 64 75 72 65 20 28 69 2e 65 2e 20 66 6f 72  cedure (i.e. for
9850: 20 65 76 65 72 79 20 74 65 73 74 20 64 61 74 61   every test data
9860: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 29  base connection)
9870: 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
9880: 20 20 20 20 20 20 72 65 74 75 72 6e 20 22 22 0d        return "".
9890: 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d  .      }..    }.
98a0: 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74  ....    proc get
98b0: 54 65 73 74 4f 76 65 72 72 69 64 65 73 50 72 65  TestOverridesPre
98c0: 61 6d 62 6c 65 20 7b 20 7b 65 78 74 72 61 56 61  amble { {extraVa
98d0: 72 4e 61 6d 65 73 20 22 22 7d 20 7d 20 7b 0d 0a  rNames ""} } {..
98e0: 20 20 20 20 20 20 73 65 74 20 76 61 72 4e 61 6d        set varNam
98f0: 65 73 20 5b 6c 69 73 74 5d 0d 0a 0d 0a 20 20 20  es [list]....   
9900: 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
9910: 54 45 3a 20 49 66 20 61 76 61 69 6c 61 62 6c 65  TE: If available
9920: 2c 20 73 74 61 72 74 20 77 69 74 68 20 74 68 65  , start with the
9930: 20 6d 61 73 74 65 72 20 6c 69 73 74 20 6f 66 20   master list of 
9940: 74 65 73 74 20 6f 76 65 72 72 69 64 65 0d 0a 20  test override.. 
9950: 20 20 20 20 20 23 20 20 20 20 20 20 20 76 61 72       #       var
9960: 69 61 62 6c 65 73 2e 0d 0a 20 20 20 20 20 20 23  iables...      #
9970: 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66  ..      if {[inf
9980: 6f 20 65 78 69 73 74 73 20 3a 3a 74 65 73 74 5f  o exists ::test_
9990: 6f 76 65 72 72 69 64 65 73 5d 20 26 26 20 5c 0d  overrides] && \.
99a0: 0a 20 20 20 20 20 20 20 20 20 20 5b 6c 6c 65 6e  .          [llen
99b0: 67 74 68 20 24 3a 3a 74 65 73 74 5f 6f 76 65 72  gth $::test_over
99c0: 72 69 64 65 73 5d 20 3e 20 30 7d 20 74 68 65 6e  rides] > 0} then
99d0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 65 76 61 6c   {..        eval
99e0: 20 6c 61 70 70 65 6e 64 20 76 61 72 4e 61 6d 65   lappend varName
99f0: 73 20 24 3a 3a 74 65 73 74 5f 6f 76 65 72 72 69  s $::test_overri
9a00: 64 65 73 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a  des..      }....
9a10: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
9a20: 20 4e 4f 54 45 3a 20 49 66 20 72 65 71 75 65 73   NOTE: If reques
9a30: 74 65 64 20 62 79 20 6f 75 72 20 63 61 6c 6c 65  ted by our calle
9a40: 72 2c 20 61 64 64 20 61 6e 79 20 61 64 64 69 74  r, add any addit
9a50: 69 6f 6e 61 6c 20 76 61 72 69 61 62 6c 65 0d 0a  ional variable..
9a60: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 6e 61        #       na
9a70: 6d 65 73 20 74 6f 20 63 6f 70 79 20 6e 6f 77 2e  mes to copy now.
9a80: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
9a90: 20 69 66 20 7b 5b 6c 6c 65 6e 67 74 68 20 24 65   if {[llength $e
9aa0: 78 74 72 61 56 61 72 4e 61 6d 65 73 5d 20 3e 20  xtraVarNames] > 
9ab0: 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
9ac0: 20 20 20 65 76 61 6c 20 6c 61 70 70 65 6e 64 20     eval lappend 
9ad0: 76 61 72 4e 61 6d 65 73 20 24 65 78 74 72 61 56  varNames $extraV
9ae0: 61 72 4e 61 6d 65 73 0d 0a 20 20 20 20 20 20 7d  arNames..      }
9af0: 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  ....      #..   
9b00: 20 20 20 23 20 4e 4f 54 45 3a 20 42 75 69 6c 64     # NOTE: Build
9b10: 20 74 68 65 20 73 63 72 69 70 74 20 66 72 61 67   the script frag
9b20: 6d 65 6e 74 20 74 6f 20 62 65 20 72 65 74 75 72  ment to be retur
9b30: 6e 65 64 20 62 79 20 70 72 6f 63 65 73 73 69 6e  ned by processin
9b40: 67 20 65 61 63 68 0d 0a 20 20 20 20 20 20 23 20  g each..      # 
9b50: 20 20 20 20 20 20 76 61 72 69 61 62 6c 65 20 6e        variable n
9b60: 61 6d 65 20 61 6e 64 20 61 64 64 69 6e 67 20 74  ame and adding t
9b70: 68 65 20 6e 65 63 65 63 65 73 73 61 72 79 20 73  he nececessary s
9b80: 63 72 69 70 74 20 66 72 61 67 6d 65 6e 74 73 20  cript fragments 
9b90: 66 6f 72 0d 0a 20 20 20 20 20 20 23 20 20 20 20  for..      #    
9ba0: 20 20 20 65 61 63 68 20 6f 6e 65 2e 0d 0a 20 20     each one...  
9bb0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 73 65 74      #..      set
9bc0: 20 72 65 73 75 6c 74 20 22 22 0d 0a 0d 0a 20 20   result ""....  
9bd0: 20 20 20 20 66 6f 72 65 61 63 68 20 76 61 72 4e      foreach varN
9be0: 61 6d 65 20 24 76 61 72 4e 61 6d 65 73 20 7b 0d  ame $varNames {.
9bf0: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
9c00: 20 20 20 20 23 20 4e 4f 54 45 3a 20 42 75 69 6c      # NOTE: Buil
9c10: 64 20 74 68 65 20 71 75 61 6c 69 66 69 65 64 20  d the qualified 
9c20: 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20  global variable 
9c30: 6e 61 6d 65 2e 0d 0a 20 20 20 20 20 20 20 20 23  name...        #
9c40: 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 66 75  ..        set fu
9c50: 6c 6c 56 61 72 4e 61 6d 65 20 5b 61 70 70 65 6e  llVarName [appen
9c60: 64 41 72 67 73 20 3a 3a 20 24 76 61 72 4e 61 6d  dArgs :: $varNam
9c70: 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d  e]....        #.
9c80: 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
9c90: 20 44 6f 65 73 20 74 68 65 20 76 61 72 69 61 62   Does the variab
9ca0: 6c 65 20 65 78 69 73 74 20 69 6e 20 74 68 69 73  le exist in this
9cb0: 20 69 6e 74 65 72 70 72 65 74 65 72 20 63 6f 6e   interpreter con
9cc0: 74 65 78 74 3f 0d 0a 20 20 20 20 20 20 20 20 23  text?..        #
9cd0: 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 69  ..        if {[i
9ce0: 6e 66 6f 20 65 78 69 73 74 73 20 24 66 75 6c 6c  nfo exists $full
9cf0: 56 61 72 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b  VarName]} then {
9d00: 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20  ..          #.. 
9d10: 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a           # NOTE:
9d20: 20 41 70 70 65 6e 64 20 61 20 73 63 72 69 70 74   Append a script
9d30: 20 66 72 61 67 6d 65 6e 74 20 74 6f 20 74 68 65   fragment to the
9d40: 20 72 65 73 75 6c 74 20 74 68 61 74 20 77 69 6c   result that wil
9d50: 6c 20 63 6f 72 72 65 63 74 6c 79 0d 0a 20 20 20  l correctly..   
9d60: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63         #       c
9d70: 6f 70 79 20 61 6e 79 20 63 6f 6e 74 61 69 6e 65  opy any containe
9d80: 64 20 76 61 6c 75 65 20 74 6f 20 61 6e 6f 74 68  d value to anoth
9d90: 65 72 20 69 6e 74 65 72 70 72 65 74 65 72 20 63  er interpreter c
9da0: 6f 6e 74 65 78 74 2e 0d 0a 20 20 20 20 20 20 20  ontext...       
9db0: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
9dc0: 61 70 70 65 6e 64 20 72 65 73 75 6c 74 20 5c 6e  append result \n
9dd0: 20 22 73 65 74 20 22 20 24 66 75 6c 6c 56 61 72   "set " $fullVar
9de0: 4e 61 6d 65 20 22 20 5c 7b 22 20 5b 73 65 74 20  Name " \{" [set 
9df0: 24 66 75 6c 6c 56 61 72 4e 61 6d 65 5d 20 5c 7d  $fullVarName] \}
9e00: 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20  ..        }..   
9e10: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d     }....      #.
9e20: 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49  .      # NOTE: I
9e30: 66 20 74 68 65 20 72 65 73 75 6c 74 20 63 6f 6e  f the result con
9e40: 74 61 69 6e 73 20 6f 6e 65 20 6f 72 20 6d 6f 72  tains one or mor
9e50: 65 20 73 63 72 69 70 74 20 66 72 61 67 6d 65 6e  e script fragmen
9e60: 74 73 2c 20 61 70 70 65 6e 64 20 61 0d 0a 20 20  ts, append a..  
9e70: 20 20 20 20 23 20 20 20 20 20 20 20 6e 65 77 6c      #       newl
9e80: 69 6e 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ine...      #.. 
9e90: 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67       if {[string
9ea0: 20 6c 65 6e 67 74 68 20 24 72 65 73 75 6c 74 5d   length $result]
9eb0: 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20   > 0} then {..  
9ec0: 20 20 20 20 20 20 61 70 70 65 6e 64 20 72 65 73        append res
9ed0: 75 6c 74 20 5c 6e 0d 0a 20 20 20 20 20 20 7d 0d  ult \n..      }.
9ee0: 0a 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ...      return 
9ef0: 24 72 65 73 75 6c 74 0d 0a 20 20 20 20 7d 0d 0a  $result..    }..
9f00: 0c 0d 0a 20 20 20 20 70 72 6f 63 20 6d 6f 76 65  ...    proc move
9f10: 53 79 73 74 65 6d 44 61 74 61 53 51 4c 69 74 65  SystemDataSQLite
9f20: 44 6c 6c 43 6f 6e 66 69 67 20 7b 20 7b 72 65 73  DllConfig { {res
9f30: 74 6f 72 65 20 66 61 6c 73 65 7d 20 7b 76 65 72  tore false} {ver
9f40: 62 6f 73 65 20 66 61 6c 73 65 7d 20 7d 20 7b 0d  bose false} } {.
9f50: 0a 20 20 20 20 20 20 73 65 74 20 64 69 72 65 63  .      set direc
9f60: 74 6f 72 79 20 5b 6f 62 6a 65 63 74 20 69 6e 76  tory [object inv
9f70: 6f 6b 65 20 41 70 70 44 6f 6d 61 69 6e 20 43 75  oke AppDomain Cu
9f80: 72 72 65 6e 74 44 6f 6d 61 69 6e 2e 42 61 73 65  rrentDomain.Base
9f90: 44 69 72 65 63 74 6f 72 79 5d 0d 0a 0d 0a 20 20  Directory]....  
9fa0: 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20      if {[string 
9fb0: 6c 65 6e 67 74 68 20 24 64 69 72 65 63 74 6f 72  length $director
9fc0: 79 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d  y] == 0} then {.
9fd0: 0a 20 20 20 20 20 20 20 20 69 66 20 7b 24 76 65  .        if {$ve
9fe0: 72 62 6f 73 65 7d 20 74 68 65 6e 20 7b 0d 0a 20  rbose} then {.. 
9ff0: 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
a000: 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b  ::test_channel [
a010: 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
a020: 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
a030: 2d 20 73 6b 69 70 70 65 64 20 6d 6f 76 69 6e 67  - skipped moving
a040: 20 5c 22 53 79 73 74 65 6d 2e 44 61 74 61 2e 53   \"System.Data.S
a050: 51 4c 69 74 65 2e 64 6c 6c 2e 63 6f 6e 66 69 67  QLite.dll.config
a060: 5c 22 2c 20 22 20 5c 0d 0a 20 20 20 20 20 20 20  \", " \..       
a070: 20 20 20 20 20 20 20 22 6e 6f 20 62 61 73 65 20         "no base 
a080: 64 69 72 65 63 74 6f 72 79 5c 6e 22 5d 0d 0a 20  directory\n"].. 
a090: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
a0a0: 20 20 72 65 74 75 72 6e 0d 0a 20 20 20 20 20 20    return..      
a0b0: 7d 0d 0a 0d 0a 20 20 20 20 20 20 73 65 74 20 66  }....      set f
a0c0: 69 6c 65 4e 61 6d 65 28 31 29 20 5b 66 69 6c 65  ileName(1) [file
a0d0: 20 6e 6f 72 6d 61 6c 69 7a 65 20 5c 0d 0a 20 20   normalize \..  
a0e0: 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20 6a 6f          [file jo
a0f0: 69 6e 20 24 64 69 72 65 63 74 6f 72 79 20 53 79  in $directory Sy
a100: 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
a110: 2e 64 6c 6c 2e 63 6f 6e 66 69 67 5d 5d 0d 0a 0d  .dll.config]]...
a120: 0a 20 20 20 20 20 20 73 65 74 20 66 69 6c 65 4e  .      set fileN
a130: 61 6d 65 28 32 29 20 5b 61 70 70 65 6e 64 41 72  ame(2) [appendAr
a140: 67 73 20 24 66 69 6c 65 4e 61 6d 65 28 31 29 20  gs $fileName(1) 
a150: 2e 6d 6f 76 65 64 5d 0d 0a 0d 0a 20 20 20 20 20  .moved]....     
a160: 20 69 66 20 7b 24 72 65 73 74 6f 72 65 7d 20 74   if {$restore} t
a170: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 69  hen {..        i
a180: 66 20 7b 5b 66 69 6c 65 20 65 78 69 73 74 73 20  f {[file exists 
a190: 24 66 69 6c 65 4e 61 6d 65 28 32 29 5d 7d 20 74  $fileName(2)]} t
a1a0: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
a1b0: 20 66 69 6c 65 20 72 65 6e 61 6d 65 20 24 66 69   file rename $fi
a1c0: 6c 65 4e 61 6d 65 28 32 29 20 24 66 69 6c 65 4e  leName(2) $fileN
a1d0: 61 6d 65 28 31 29 0d 0a 0d 0a 20 20 20 20 20 20  ame(1)....      
a1e0: 20 20 20 20 69 66 20 7b 24 76 65 72 62 6f 73 65      if {$verbose
a1f0: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
a200: 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
a210: 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70  est_channel [app
a220: 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
a230: 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
a240: 20 6d 6f 76 65 64 20 5c 22 22 20 24 66 69 6c 65   moved \"" $file
a250: 4e 61 6d 65 28 32 29 20 22 5c 22 20 74 6f 20 5c  Name(2) "\" to \
a260: 22 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  "" \..          
a270: 20 20 20 20 20 20 24 66 69 6c 65 4e 61 6d 65 28        $fileName(
a280: 31 29 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20  1) \"\n]..      
a290: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d      }..        }
a2a0: 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
a2b0: 20 20 20 69 66 20 7b 24 76 65 72 62 6f 73 65 7d     if {$verbose}
a2c0: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
a2d0: 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
a2e0: 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
a2f0: 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
a300: 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
a310: 73 6b 69 70 70 65 64 20 6d 6f 76 69 6e 67 20 5c  skipped moving \
a320: 22 22 20 24 66 69 6c 65 4e 61 6d 65 28 32 29 20  "" $fileName(2) 
a330: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
a340: 20 20 20 22 5c 22 2c 20 69 74 20 64 6f 65 73 20     "\", it does 
a350: 6e 6f 74 20 65 78 69 73 74 5c 6e 22 5d 0d 0a 20  not exist\n"].. 
a360: 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
a370: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 20 65      }..      } e
a380: 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 69  lse {..        i
a390: 66 20 7b 5b 66 69 6c 65 20 65 78 69 73 74 73 20  f {[file exists 
a3a0: 24 66 69 6c 65 4e 61 6d 65 28 31 29 5d 7d 20 74  $fileName(1)]} t
a3b0: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
a3c0: 20 66 69 6c 65 20 72 65 6e 61 6d 65 20 24 66 69   file rename $fi
a3d0: 6c 65 4e 61 6d 65 28 31 29 20 24 66 69 6c 65 4e  leName(1) $fileN
a3e0: 61 6d 65 28 32 29 0d 0a 0d 0a 20 20 20 20 20 20  ame(2)....      
a3f0: 20 20 20 20 69 66 20 7b 24 76 65 72 62 6f 73 65      if {$verbose
a400: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
a410: 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
a420: 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70  est_channel [app
a430: 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
a440: 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
a450: 20 6d 6f 76 65 64 20 5c 22 22 20 24 66 69 6c 65   moved \"" $file
a460: 4e 61 6d 65 28 31 29 20 22 5c 22 20 74 6f 20 5c  Name(1) "\" to \
a470: 22 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  "" \..          
a480: 20 20 20 20 20 20 24 66 69 6c 65 4e 61 6d 65 28        $fileName(
a490: 32 29 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20  2) \"\n]..      
a4a0: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d      }..        }
a4b0: 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
a4c0: 20 20 20 69 66 20 7b 24 76 65 72 62 6f 73 65 7d     if {$verbose}
a4d0: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
a4e0: 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
a4f0: 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
a500: 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
a510: 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
a520: 73 6b 69 70 70 65 64 20 6d 6f 76 69 6e 67 20 5c  skipped moving \
a530: 22 22 20 24 66 69 6c 65 4e 61 6d 65 28 31 29 20  "" $fileName(1) 
a540: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
a550: 20 20 20 22 5c 22 2c 20 69 74 20 64 6f 65 73 20     "\", it does 
a560: 6e 6f 74 20 65 78 69 73 74 5c 6e 22 5d 0d 0a 20  not exist\n"].. 
a570: 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
a580: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a      }..      }..
a590: 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
a5a0: 6f 63 20 67 65 74 41 70 70 44 6f 6d 61 69 6e 50  oc getAppDomainP
a5b0: 72 65 61 6d 62 6c 65 20 7b 20 7b 70 72 65 66 69  reamble { {prefi
a5c0: 78 20 22 22 7d 20 7b 73 75 66 66 69 78 20 22 22  x ""} {suffix ""
a5d0: 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a  } } {..      #..
a5e0: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68        # NOTE: Th
a5f0: 69 73 20 70 72 6f 63 65 64 75 72 65 20 72 65 74  is procedure ret
a600: 75 72 6e 73 20 61 20 74 65 73 74 20 73 65 74 75  urns a test setu
a610: 70 20 73 63 72 69 70 74 20 66 72 61 67 6d 65 6e  p script fragmen
a620: 74 20 73 75 69 74 61 62 6c 65 20 66 6f 72 0d 0a  t suitable for..
a630: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 65 76        #       ev
a640: 61 6c 75 61 74 69 6f 6e 20 62 79 20 61 6e 20 69  aluation by an i
a650: 6e 74 65 72 70 72 65 74 65 72 20 63 72 65 61 74  nterpreter creat
a660: 65 64 20 69 6e 20 61 6e 20 69 73 6f 6c 61 74 65  ed in an isolate
a670: 64 20 61 70 70 6c 69 63 61 74 69 6f 6e 0d 0a 20  d application.. 
a680: 20 20 20 20 20 23 20 20 20 20 20 20 20 64 6f 6d       #       dom
a690: 61 69 6e 2e 20 20 54 68 65 20 73 63 72 69 70 74  ain.  The script
a6a0: 20 66 72 61 67 6d 65 6e 74 20 62 65 69 6e 67 20   fragment being 
a6b0: 72 65 74 75 72 6e 65 64 20 77 69 6c 6c 20 62 65  returned will be
a6c0: 20 73 75 72 72 6f 75 6e 64 65 64 20 62 79 0d 0a   surrounded by..
a6d0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68        #       th
a6e0: 65 20 70 72 65 66 69 78 20 61 6e 64 20 73 75 66  e prefix and suf
a6f0: 66 69 78 20 22 73 63 72 69 70 74 20 66 72 61 67  fix "script frag
a700: 6d 65 6e 74 73 22 20 73 70 65 63 69 66 69 65 64  ments" specified
a710: 20 62 79 20 6f 75 72 20 63 61 6c 6c 65 72 2c 0d   by our caller,.
a720: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 69  .      #       i
a730: 66 20 61 6e 79 2e 20 20 54 68 65 20 65 6e 74 69  f any.  The enti
a740: 72 65 20 73 63 72 69 70 74 20 62 65 69 6e 67 20  re script being 
a750: 72 65 74 75 72 6e 65 64 20 77 69 6c 6c 20 62 65  returned will be
a760: 20 73 75 62 73 74 69 74 75 74 65 64 20 76 69 61   substituted via
a770: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
a780: 5b 73 75 62 73 74 5d 2c 20 69 6e 20 74 68 65 20  [subst], in the 
a790: 63 6f 6e 74 65 78 74 20 6f 66 20 6f 75 72 20 63  context of our c
a7a0: 61 6c 6c 65 72 2c 20 62 65 66 6f 72 65 20 62 65  aller, before be
a7b0: 69 6e 67 20 72 65 74 75 72 6e 65 64 2e 0d 0a 20  ing returned... 
a7c0: 20 20 20 20 20 23 20 20 20 20 20 20 20 54 68 69       #       Thi
a7d0: 73 20 73 74 65 70 20 69 73 20 6e 65 63 65 73 73  s step is necess
a7e0: 61 72 79 20 73 6f 20 74 68 61 74 20 73 6f 6d 65  ary so that some
a7f0: 20 6c 69 6d 69 74 65 64 20 63 6f 6e 74 65 78 74   limited context
a800: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2c 0d 0a 20   information,.. 
a810: 20 20 20 20 20 23 20 20 20 20 20 20 20 70 72 69       #       pri
a820: 6d 61 72 69 6c 79 20 72 65 6c 61 74 65 64 20 74  marily related t
a830: 6f 20 74 68 65 20 74 65 73 74 69 6e 67 20 64 69  o the testing di
a840: 72 65 63 74 6f 72 69 65 73 2c 20 63 61 6e 20 62  rectories, can b
a850: 65 20 74 72 61 6e 73 66 65 72 72 65 64 0d 0a 20  e transferred.. 
a860: 20 20 20 20 20 23 20 20 20 20 20 20 20 74 6f 20       #       to 
a870: 74 68 65 20 69 6e 74 65 72 70 72 65 74 65 72 20  the interpreter 
a880: 69 6e 20 74 68 65 20 69 73 6f 6c 61 74 65 64 20  in the isolated 
a890: 61 70 70 6c 69 63 61 74 69 6f 6e 20 64 6f 6d 61  application doma
a8a0: 69 6e 2c 20 6d 61 6b 69 6e 67 20 69 74 0d 0a 20  in, making it.. 
a8b0: 20 20 20 20 20 23 20 20 20 20 20 20 20 61 62 6c       #       abl
a8c0: 65 20 74 6f 20 73 75 63 63 65 73 73 66 75 6c 6c  e to successfull
a8d0: 79 20 72 75 6e 20 74 65 73 74 73 20 74 68 61 74  y run tests that
a8e0: 20 72 65 71 75 69 72 65 20 6f 6e 65 20 6f 72 20   require one or 
a8f0: 6d 6f 72 65 20 6f 66 20 74 68 65 0d 0a 20 20 20  more of the..   
a900: 20 20 20 23 20 20 20 20 20 20 20 66 69 6c 65 73     #       files
a910: 20 69 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 74   in one of the t
a920: 65 73 74 69 6e 67 20 64 69 72 65 63 74 6f 72 69  esting directori
a930: 65 73 2e 20 20 43 61 6c 6c 65 72 73 20 73 68 6f  es.  Callers sho
a940: 75 6c 64 20 6b 65 65 70 20 69 6e 0d 0a 20 20 20  uld keep in..   
a950: 20 20 20 23 20 20 20 20 20 20 20 6d 69 6e 64 20     #       mind 
a960: 74 68 61 74 20 74 68 65 20 74 65 73 74 20 73 63  that the test sc
a970: 72 69 70 74 20 66 72 61 67 6d 65 6e 74 20 62 65  ript fragment be
a980: 69 6e 67 20 72 65 74 75 72 6e 65 64 20 63 61 6e  ing returned can
a990: 6e 6f 74 20 72 65 6c 79 20 6f 6e 0d 0a 20 20 20  not rely on..   
a9a0: 20 20 20 23 20 20 20 20 20 20 20 61 6e 79 20 73     #       any s
a9b0: 63 72 69 70 74 20 6c 69 62 72 61 72 79 20 70 72  cript library pr
a9c0: 6f 63 65 64 75 72 65 73 20 74 68 61 74 20 61 72  ocedures that ar
a9d0: 65 20 6e 6f 74 20 70 72 6f 76 69 64 65 64 20 62  e not provided b
a9e0: 79 20 74 68 65 20 45 61 67 6c 65 0d 0a 20 20 20  y the Eagle..   
a9f0: 20 20 20 23 20 20 20 20 20 20 20 6c 69 62 72 61     #       libra
aa00: 72 79 20 70 61 63 6b 61 67 65 20 28 69 2e 65 2e  ry package (i.e.
aa10: 20 22 69 6e 69 74 2e 65 61 67 6c 65 22 29 2c 20   "init.eagle"), 
aa20: 69 6e 63 6c 75 64 69 6e 67 20 74 68 6f 73 65 20  including those 
aa30: 70 72 6f 76 69 64 65 64 20 62 79 0d 0a 20 20 20  provided by..   
aa40: 20 20 20 23 20 20 20 20 20 20 20 74 68 65 20 45     #       the E
aa50: 61 67 6c 65 20 74 65 73 74 20 70 61 63 6b 61 67  agle test packag
aa60: 65 2c 20 75 6e 6c 65 73 73 20 74 68 65 20 66 69  e, unless the fi
aa70: 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  le containing th
aa80: 65 6d 20 69 73 20 6c 6f 61 64 65 64 0d 0a 20 20  em is loaded..  
aa90: 20 20 20 20 23 20 20 20 20 20 20 20 6d 61 6e 75      #       manu
aaa0: 61 6c 6c 79 20 76 69 61 20 73 6f 6d 65 20 6f 74  ally via some ot
aab0: 68 65 72 20 6d 65 63 68 61 6e 69 73 6d 20 28 65  her mechanism (e
aac0: 2e 67 2e 20 62 79 20 69 6e 63 6c 75 64 69 6e 67  .g. by including
aad0: 20 61 70 70 72 6f 70 72 69 61 74 65 0d 0a 20 20   appropriate..  
aae0: 20 20 20 20 23 20 20 20 20 20 20 20 5b 70 61 63      #       [pac
aaf0: 6b 61 67 65 20 72 65 71 75 69 72 65 5d 20 6f 72  kage require] or
ab00: 20 5b 73 6f 75 72 63 65 5d 20 63 6f 6d 6d 61 6e   [source] comman
ab10: 64 73 20 69 6e 20 74 68 65 20 70 72 65 66 69 78  ds in the prefix
ab20: 20 6f 72 20 73 75 66 66 69 78 0d 0a 20 20 20 20   or suffix..    
ab30: 20 20 23 20 20 20 20 20 20 20 73 63 72 69 70 74    #       script
ab40: 20 66 72 61 67 6d 65 6e 74 73 29 2e 20 20 41 6c   fragments).  Al
ab50: 73 6f 2c 20 61 6c 6c 20 76 61 72 69 61 62 6c 65  so, all variable
ab60: 20 72 65 66 65 72 65 6e 63 65 73 20 61 6e 64 20   references and 
ab70: 61 6c 6c 20 6e 65 73 74 65 64 0d 0a 20 20 20 20  all nested..    
ab80: 20 20 23 20 20 20 20 20 20 20 63 6f 6d 6d 61 6e    #       comman
ab90: 64 73 20 28 69 2e 65 2e 20 74 68 6f 73 65 20 69  ds (i.e. those i
aba0: 6e 20 73 71 75 61 72 65 20 62 72 61 63 6b 65 74  n square bracket
abb0: 73 29 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20  s) contained in 
abc0: 74 68 65 20 66 69 6e 61 6c 0d 0a 20 20 20 20 20  the final..     
abd0: 20 23 20 20 20 20 20 20 20 73 63 72 69 70 74 20   #       script 
abe0: 66 72 61 67 6d 65 6e 74 20 77 69 6c 6c 20 65 6e  fragment will en
abf0: 64 20 75 70 20 62 65 69 6e 67 20 65 76 61 6c 75  d up being evalu
ac00: 61 74 65 64 20 69 6e 20 74 68 65 20 63 6f 6e 74  ated in the cont
ac10: 65 78 74 20 6f 66 20 74 68 65 0d 0a 20 20 20 20  ext of the..    
ac20: 20 20 23 20 20 20 20 20 20 20 63 61 6c 6c 69 6e    #       callin
ac30: 67 20 69 6e 74 65 72 70 72 65 74 65 72 20 61 6e  g interpreter an
ac40: 64 20 6e 6f 74 20 74 68 65 20 74 61 72 67 65 74  d not the target
ac50: 20 69 6e 74 65 72 70 72 65 74 65 72 20 63 72 65   interpreter cre
ac60: 61 74 65 64 20 69 6e 20 74 68 65 0d 0a 20 20 20  ated in the..   
ac70: 20 20 20 23 20 20 20 20 20 20 20 69 73 6f 6c 61     #       isola
ac80: 74 65 64 20 61 70 70 6c 69 63 61 74 69 6f 6e 20  ted application 
ac90: 64 6f 6d 61 69 6e 20 75 6e 6c 65 73 73 20 74 68  domain unless th
aca0: 65 20 64 6f 6c 6c 61 72 20 73 69 67 6e 73 20 61  e dollar signs a
acb0: 6e 64 2f 6f 72 20 73 71 75 61 72 65 0d 0a 20 20  nd/or square..  
acc0: 20 20 20 20 23 20 20 20 20 20 20 20 62 72 61 63      #       brac
acd0: 6b 65 74 73 20 61 72 65 20 73 70 65 63 69 61 6c  kets are special
ace0: 6c 79 20 71 75 6f 74 65 64 20 77 69 74 68 20 62  ly quoted with b
acf0: 61 63 6b 73 6c 61 73 68 65 73 2e 0d 0a 20 20 20  ackslashes...   
ad00: 20 20 20 23 0d 0a 20 20 20 20 20 20 72 65 74 75     #..      retu
ad10: 72 6e 20 5b 75 70 6c 65 76 65 6c 20 31 20 5b 6c  rn [uplevel 1 [l
ad20: 69 73 74 20 73 75 62 73 74 20 5b 61 70 70 65 6e  ist subst [appen
ad30: 64 41 72 67 73 20 24 70 72 65 66 69 78 20 7b 0d  dArgs $prefix {.
ad40: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
ad50: 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 65 20      # NOTE: The 
ad60: 5c 5b 6f 62 6a 65 63 74 5c 5d 20 63 6f 6d 6d 61  \[object\] comma
ad70: 6e 64 20 6d 61 79 20 62 65 20 6d 69 73 73 69 6e  nd may be missin
ad80: 67 20 69 6e 20 73 6f 6d 65 20 45 61 67 6c 65 20  g in some Eagle 
ad90: 63 6f 72 65 0d 0a 20 20 20 20 20 20 20 20 23 20  core..        # 
ada0: 20 20 20 20 20 20 6c 69 62 72 61 72 79 20 63 6f        library co
adb0: 6e 66 69 67 75 72 61 74 69 6f 6e 73 2e 20 20 43  nfigurations.  C
adc0: 6c 6f 6e 69 6e 67 20 61 6e 64 20 75 73 69 6e 67  loning and using
add0: 20 74 68 65 20 70 72 6f 63 65 64 75 72 65 0d 0a   the procedure..
ade0: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
adf0: 5c 5b 63 68 61 6e 67 65 4e 61 74 69 76 65 52 75  \[changeNativeRu
ae00: 6e 74 69 6d 65 4f 70 74 69 6f 6e 5c 5d 20 6d 61  ntimeOption\] ma
ae10: 79 20 68 65 6c 70 20 74 6f 20 6d 69 74 69 67 61  y help to mitiga
ae20: 74 65 20 74 68 69 73 2e 0d 0a 20 20 20 20 20 20  te this...      
ae30: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 70 72 6f    #..        pro
ae40: 63 20 63 68 61 6e 67 65 4e 61 74 69 76 65 52 75  c changeNativeRu
ae50: 6e 74 69 6d 65 4f 70 74 69 6f 6e 20 5c 0d 0a 20  ntimeOption \.. 
ae60: 20 20 20 20 20 20 20 20 20 20 20 7b 5b 69 6e 66             {[inf
ae70: 6f 20 61 72 67 73 20 63 68 61 6e 67 65 4e 61 74  o args changeNat
ae80: 69 76 65 52 75 6e 74 69 6d 65 4f 70 74 69 6f 6e  iveRuntimeOption
ae90: 5d 7d 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  ]} \..          
aea0: 20 20 7b 5b 69 6e 66 6f 20 62 6f 64 79 20 63 68    {[info body ch
aeb0: 61 6e 67 65 4e 61 74 69 76 65 52 75 6e 74 69 6d  angeNativeRuntim
aec0: 65 4f 70 74 69 6f 6e 5d 7d 0d 0a 0d 0a 20 20 20  eOption]}....   
aed0: 20 20 20 20 20 63 61 74 63 68 20 7b 0d 0a 20 20       catch {..  
aee0: 20 20 20 20 20 20 20 20 63 68 61 6e 67 65 4e 61          changeNa
aef0: 74 69 76 65 52 75 6e 74 69 6d 65 4f 70 74 69 6f  tiveRuntimeOptio
af00: 6e 20 5b 68 61 73 52 75 6e 74 69 6d 65 4f 70 74  n [hasRuntimeOpt
af10: 69 6f 6e 20 6e 61 74 69 76 65 5d 0d 0a 20 20 20  ion native]..   
af20: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 20       }..      } 
af30: 5b 67 65 74 54 65 73 74 4f 76 65 72 72 69 64 65  [getTestOverride
af40: 73 50 72 65 61 6d 62 6c 65 20 5b 6c 69 73 74 20  sPreamble [list 
af50: 70 61 74 68 20 74 65 73 74 5f 63 68 61 6e 6e 65  path test_channe
af60: 6c 5d 5d 20 24 73 75 66 66 69 78 5d 5d 5d 0d 0a  l]] $suffix]]]..
af70: 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
af80: 6f 63 20 74 72 79 43 6f 70 79 45 78 74 65 72 6e  oc tryCopyExtern
af90: 61 6c 46 69 6c 65 20 7b 0d 0a 20 20 20 20 20 20  alFile {..      
afa0: 20 20 20 20 20 20 66 69 6c 65 4e 61 6d 65 20 7b        fileName {
afb0: 70 6c 61 74 66 6f 72 6d 20 22 22 7d 20 7b 6e 65  platform ""} {ne
afc0: 77 46 69 6c 65 4e 61 6d 65 20 22 22 7d 20 7b 76  wFileName ""} {v
afd0: 65 72 62 6f 73 65 20 66 61 6c 73 65 7d 20 7d 20  erbose false} } 
afe0: 7b 0d 0a 20 20 20 20 20 20 73 65 74 20 73 6f 75  {..      set sou
aff0: 72 63 65 46 69 6c 65 4e 61 6d 65 20 5b 67 65 74  rceFileName [get
b000: 45 78 74 65 72 6e 61 6c 46 69 6c 65 4e 61 6d 65  ExternalFileName
b010: 20 24 66 69 6c 65 4e 61 6d 65 5d 0d 0a 0d 0a 20   $fileName].... 
b020: 20 20 20 20 20 69 66 20 7b 21 5b 66 69 6c 65 20       if {![file 
b030: 65 78 69 73 74 73 20 24 73 6f 75 72 63 65 46 69  exists $sourceFi
b040: 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d  leName]} then {.
b050: 0a 20 20 20 20 20 20 20 20 69 66 20 7b 24 76 65  .        if {$ve
b060: 72 62 6f 73 65 7d 20 74 68 65 6e 20 7b 0d 0a 20  rbose} then {.. 
b070: 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
b080: 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b  ::test_channel [
b090: 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
b0a0: 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
b0b0: 2d 20 73 6b 69 70 70 65 64 20 63 6f 70 79 69 6e  - skipped copyin
b0c0: 67 20 65 78 74 65 72 6e 61 6c 20 66 69 6c 65 20  g external file 
b0d0: 5c 22 22 20 24 73 6f 75 72 63 65 46 69 6c 65 4e  \"" $sourceFileN
b0e0: 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ame \..         
b0f0: 20 20 20 20 20 22 5c 22 2c 20 69 74 20 64 6f 65       "\", it doe
b100: 73 20 6e 6f 74 20 65 78 69 73 74 5c 6e 22 5d 0d  s not exist\n"].
b110: 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  .        }..    
b120: 20 20 20 20 72 65 74 75 72 6e 0d 0a 20 20 20 20      return..    
b130: 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20    }....      if 
b140: 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20  {[string length 
b150: 24 6e 65 77 46 69 6c 65 4e 61 6d 65 5d 20 3e 20  $newFileName] > 
b160: 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
b170: 20 20 20 73 65 74 20 74 61 72 67 65 74 46 69 6c     set targetFil
b180: 65 4e 61 6d 65 20 5b 67 65 74 42 69 6e 61 72 79  eName [getBinary
b190: 46 69 6c 65 4e 61 6d 65 20 24 6e 65 77 46 69 6c  FileName $newFil
b1a0: 65 4e 61 6d 65 20 24 70 6c 61 74 66 6f 72 6d 5d  eName $platform]
b1b0: 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b  ..      } else {
b1c0: 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 74 61  ..        set ta
b1d0: 72 67 65 74 46 69 6c 65 4e 61 6d 65 20 5b 67 65  rgetFileName [ge
b1e0: 74 42 69 6e 61 72 79 46 69 6c 65 4e 61 6d 65 20  tBinaryFileName 
b1f0: 24 66 69 6c 65 4e 61 6d 65 20 24 70 6c 61 74 66  $fileName $platf
b200: 6f 72 6d 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d  orm]..      }...
b210: 0a 20 20 20 20 20 20 73 65 74 20 74 61 72 67 65  .      set targe
b220: 74 44 69 72 65 63 74 6f 72 79 20 5b 66 69 6c 65  tDirectory [file
b230: 20 64 69 72 6e 61 6d 65 20 24 74 61 72 67 65 74   dirname $target
b240: 46 69 6c 65 4e 61 6d 65 5d 0d 0a 0d 0a 20 20 20  FileName]....   
b250: 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d     if {[catch {.
b260: 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 66  .        if {![f
b270: 69 6c 65 20 65 78 69 73 74 73 20 24 74 61 72 67  ile exists $targ
b280: 65 74 44 69 72 65 63 74 6f 72 79 5d 7d 20 74 68  etDirectory]} th
b290: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
b2a0: 66 69 6c 65 20 6d 6b 64 69 72 20 24 74 61 72 67  file mkdir $targ
b2b0: 65 74 44 69 72 65 63 74 6f 72 79 0d 0a 20 20 20  etDirectory..   
b2c0: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
b2d0: 66 69 6c 65 20 63 6f 70 79 20 2d 66 6f 72 63 65  file copy -force
b2e0: 20 24 73 6f 75 72 63 65 46 69 6c 65 4e 61 6d 65   $sourceFileName
b2f0: 20 24 74 61 72 67 65 74 46 69 6c 65 4e 61 6d 65   $targetFileName
b300: 0d 0a 20 20 20 20 20 20 7d 5d 20 3d 3d 20 30 7d  ..      }] == 0}
b310: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
b320: 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
b330: 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
b340: 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
b350: 20 20 22 2d 2d 2d 2d 20 63 6f 70 69 65 64 20 65    "---- copied e
b360: 78 74 65 72 6e 61 6c 20 66 69 6c 65 20 66 72 6f  xternal file fro
b370: 6d 20 5c 22 22 20 24 73 6f 75 72 63 65 46 69 6c  m \"" $sourceFil
b380: 65 4e 61 6d 65 20 22 5c 22 20 74 6f 20 5c 22 22  eName "\" to \""
b390: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
b3a0: 24 74 61 72 67 65 74 46 69 6c 65 4e 61 6d 65 20  $targetFileName 
b3b0: 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d 20 65  \"\n]..      } e
b3c0: 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 74  lse {..        t
b3d0: 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
b3e0: 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
b3f0: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
b400: 22 2d 2d 2d 2d 20 66 61 69 6c 65 64 20 74 6f 20  "---- failed to 
b410: 63 6f 70 79 20 65 78 74 65 72 6e 61 6c 20 66 69  copy external fi
b420: 6c 65 20 66 72 6f 6d 20 5c 22 22 20 24 73 6f 75  le from \"" $sou
b430: 72 63 65 46 69 6c 65 4e 61 6d 65 20 5c 0d 0a 20  rceFileName \.. 
b440: 20 20 20 20 20 20 20 20 20 20 20 22 5c 22 20 74             "\" t
b450: 6f 20 5c 22 22 20 24 74 61 72 67 65 74 46 69 6c  o \"" $targetFil
b460: 65 4e 61 6d 65 20 5c 22 5c 6e 5d 0d 0a 20 20 20  eName \"\n]..   
b470: 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a     }..    }.....
b480: 20 20 20 20 70 72 6f 63 20 74 72 79 43 6f 70 79      proc tryCopy
b490: 42 69 6e 61 72 79 46 69 6c 65 20 7b 0d 0a 20 20  BinaryFile {..  
b4a0: 20 20 20 20 20 20 20 20 20 20 66 69 6c 65 4e 61            fileNa
b4b0: 6d 65 20 7b 70 6c 61 74 66 6f 72 6d 20 22 22 7d  me {platform ""}
b4c0: 20 7b 6e 65 77 46 69 6c 65 4e 61 6d 65 20 22 22   {newFileName ""
b4d0: 7d 20 7b 76 65 72 62 6f 73 65 20 66 61 6c 73 65  } {verbose false
b4e0: 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 73 65 74  } } {..      set
b4f0: 20 73 6f 75 72 63 65 46 69 6c 65 4e 61 6d 65 20   sourceFileName 
b500: 5b 67 65 74 42 69 6e 61 72 79 46 69 6c 65 4e 61  [getBinaryFileNa
b510: 6d 65 20 24 66 69 6c 65 4e 61 6d 65 20 24 70 6c  me $fileName $pl
b520: 61 74 66 6f 72 6d 5d 0d 0a 0d 0a 20 20 20 20 20  atform]....     
b530: 20 69 66 20 7b 21 5b 66 69 6c 65 20 65 78 69 73   if {![file exis
b540: 74 73 20 24 73 6f 75 72 63 65 46 69 6c 65 4e 61  ts $sourceFileNa
b550: 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  me]} then {..   
b560: 20 20 20 20 20 69 66 20 7b 24 76 65 72 62 6f 73       if {$verbos
b570: 65 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  e} then {..     
b580: 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
b590: 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
b5a0: 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
b5b0: 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 73 6b          "---- sk
b5c0: 69 70 70 65 64 20 63 6f 70 79 69 6e 67 20 62 69  ipped copying bi
b5d0: 6e 61 72 79 20 66 69 6c 65 20 5c 22 22 20 24 73  nary file \"" $s
b5e0: 6f 75 72 63 65 46 69 6c 65 4e 61 6d 65 20 5c 0d  ourceFileName \.
b5f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22  .              "
b600: 5c 22 2c 20 69 74 20 64 6f 65 73 20 6e 6f 74 20  \", it does not 
b610: 65 78 69 73 74 5c 6e 22 5d 0d 0a 20 20 20 20 20  exist\n"]..     
b620: 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 72 65     }..        re
b630: 74 75 72 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d  turn..      }...
b640: 0a 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69  .      if {[stri
b650: 6e 67 20 6c 65 6e 67 74 68 20 24 6e 65 77 46 69  ng length $newFi
b660: 6c 65 4e 61 6d 65 5d 20 3e 20 30 7d 20 74 68 65  leName] > 0} the
b670: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 65 74  n {..        set
b680: 20 74 61 72 67 65 74 46 69 6c 65 4e 61 6d 65 20   targetFileName 
b690: 5b 67 65 74 42 75 69 6c 64 46 69 6c 65 4e 61 6d  [getBuildFileNam
b6a0: 65 20 24 6e 65 77 46 69 6c 65 4e 61 6d 65 20 24  e $newFileName $
b6b0: 70 6c 61 74 66 6f 72 6d 5d 0d 0a 20 20 20 20 20  platform]..     
b6c0: 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
b6d0: 20 20 20 73 65 74 20 74 61 72 67 65 74 46 69 6c     set targetFil
b6e0: 65 4e 61 6d 65 20 5b 67 65 74 42 75 69 6c 64 46  eName [getBuildF
b6f0: 69 6c 65 4e 61 6d 65 20 24 66 69 6c 65 4e 61 6d  ileName $fileNam
b700: 65 20 24 70 6c 61 74 66 6f 72 6d 5d 0d 0a 20 20  e $platform]..  
b710: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 73      }....      s
b720: 65 74 20 74 61 72 67 65 74 44 69 72 65 63 74 6f  et targetDirecto
b730: 72 79 20 5b 66 69 6c 65 20 64 69 72 6e 61 6d 65  ry [file dirname
b740: 20 24 74 61 72 67 65 74 46 69 6c 65 4e 61 6d 65   $targetFileName
b750: 5d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b  ]....      if {[
b760: 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20  catch {..       
b770: 20 69 66 20 7b 21 5b 66 69 6c 65 20 65 78 69 73   if {![file exis
b780: 74 73 20 24 74 61 72 67 65 74 44 69 72 65 63 74  ts $targetDirect
b790: 6f 72 79 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ory]} then {..  
b7a0: 20 20 20 20 20 20 20 20 66 69 6c 65 20 6d 6b 64          file mkd
b7b0: 69 72 20 24 74 61 72 67 65 74 44 69 72 65 63 74  ir $targetDirect
b7c0: 6f 72 79 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  ory..        }..
b7d0: 20 20 20 20 20 20 20 20 66 69 6c 65 20 63 6f 70          file cop
b7e0: 79 20 2d 66 6f 72 63 65 20 24 73 6f 75 72 63 65  y -force $source
b7f0: 46 69 6c 65 4e 61 6d 65 20 24 74 61 72 67 65 74  FileName $target
b800: 46 69 6c 65 4e 61 6d 65 0d 0a 20 20 20 20 20 20  FileName..      
b810: 7d 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d  }] == 0} then {.
b820: 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24  .        tputs $
b830: 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b  ::test_channel [
b840: 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
b850: 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
b860: 63 6f 70 69 65 64 20 62 69 6e 61 72 79 20 66 69  copied binary fi
b870: 6c 65 20 66 72 6f 6d 20 5c 22 22 20 24 73 6f 75  le from \"" $sou
b880: 72 63 65 46 69 6c 65 4e 61 6d 65 20 22 5c 22 20  rceFileName "\" 
b890: 74 6f 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20  to \"" \..      
b8a0: 20 20 20 20 20 20 24 74 61 72 67 65 74 46 69 6c        $targetFil
b8b0: 65 4e 61 6d 65 20 5c 22 5c 6e 5d 0d 0a 20 20 20  eName \"\n]..   
b8c0: 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
b8d0: 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
b8e0: 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
b8f0: 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
b900: 20 20 20 20 20 20 22 2d 2d 2d 2d 20 66 61 69 6c        "---- fail
b910: 65 64 20 74 6f 20 63 6f 70 79 20 62 69 6e 61 72  ed to copy binar
b920: 79 20 66 69 6c 65 20 66 72 6f 6d 20 5c 22 22 20  y file from \"" 
b930: 24 73 6f 75 72 63 65 46 69 6c 65 4e 61 6d 65 20  $sourceFileName 
b940: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22  \..            "
b950: 5c 22 20 74 6f 20 5c 22 22 20 24 74 61 72 67 65  \" to \"" $targe
b960: 74 46 69 6c 65 4e 61 6d 65 20 5c 22 5c 6e 5d 0d  tFileName \"\n].
b970: 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d  .      }..    }.
b980: 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 74 72 79  ....    proc try
b990: 43 6f 70 79 42 75 69 6c 64 46 69 6c 65 20 7b 0d  CopyBuildFile {.
b9a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 69 6c  .            fil
b9b0: 65 4e 61 6d 65 20 7b 70 6c 61 74 66 6f 72 6d 20  eName {platform 
b9c0: 22 22 7d 20 7b 6e 65 77 46 69 6c 65 4e 61 6d 65  ""} {newFileName
b9d0: 20 22 22 7d 20 7b 76 65 72 62 6f 73 65 20 66 61   ""} {verbose fa
b9e0: 6c 73 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20  lse} } {..      
b9f0: 73 65 74 20 73 6f 75 72 63 65 46 69 6c 65 4e 61  set sourceFileNa
ba00: 6d 65 20 5b 67 65 74 42 75 69 6c 64 46 69 6c 65  me [getBuildFile
ba10: 4e 61 6d 65 20 24 66 69 6c 65 4e 61 6d 65 20 24  Name $fileName $
ba20: 70 6c 61 74 66 6f 72 6d 5d 0d 0a 0d 0a 20 20 20  platform]....   
ba30: 20 20 20 69 66 20 7b 21 5b 66 69 6c 65 20 65 78     if {![file ex
ba40: 69 73 74 73 20 24 73 6f 75 72 63 65 46 69 6c 65  ists $sourceFile
ba50: 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  Name]} then {.. 
ba60: 20 20 20 20 20 20 20 69 66 20 7b 24 76 65 72 62         if {$verb
ba70: 6f 73 65 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  ose} then {..   
ba80: 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
ba90: 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70  test_channel [ap
baa0: 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
bab0: 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
bac0: 73 6b 69 70 70 65 64 20 63 6f 70 79 69 6e 67 20  skipped copying 
bad0: 62 75 69 6c 64 20 66 69 6c 65 20 5c 22 22 20 24  build file \"" $
bae0: 73 6f 75 72 63 65 46 69 6c 65 4e 61 6d 65 20 5c  sourceFileName \
baf0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
bb00: 22 5c 22 2c 20 69 74 20 64 6f 65 73 20 6e 6f 74  "\", it does not
bb10: 20 65 78 69 73 74 5c 6e 22 5d 0d 0a 20 20 20 20   exist\n"]..    
bb20: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 72      }..        r
bb30: 65 74 75 72 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a  eturn..      }..
bb40: 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72  ..      if {[str
bb50: 69 6e 67 20 6c 65 6e 67 74 68 20 24 6e 65 77 46  ing length $newF
bb60: 69 6c 65 4e 61 6d 65 5d 20 3e 20 30 7d 20 74 68  ileName] > 0} th
bb70: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 65  en {..        se
bb80: 74 20 74 61 72 67 65 74 46 69 6c 65 4e 61 6d 65  t targetFileName
bb90: 20 5b 67 65 74 42 69 6e 61 72 79 46 69 6c 65 4e   [getBinaryFileN
bba0: 61 6d 65 20 24 6e 65 77 46 69 6c 65 4e 61 6d 65  ame $newFileName
bbb0: 20 24 70 6c 61 74 66 6f 72 6d 5d 0d 0a 20 20 20   $platform]..   
bbc0: 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
bbd0: 20 20 20 20 20 73 65 74 20 74 61 72 67 65 74 46       set targetF
bbe0: 69 6c 65 4e 61 6d 65 20 5b 67 65 74 42 69 6e 61  ileName [getBina
bbf0: 72 79 46 69 6c 65 4e 61 6d 65 20 24 66 69 6c 65  ryFileName $file
bc00: 4e 61 6d 65 20 24 70 6c 61 74 66 6f 72 6d 5d 0d  Name $platform].
bc10: 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
bc20: 20 20 73 65 74 20 74 61 72 67 65 74 44 69 72 65    set targetDire
bc30: 63 74 6f 72 79 20 5b 66 69 6c 65 20 64 69 72 6e  ctory [file dirn
bc40: 61 6d 65 20 24 74 61 72 67 65 74 46 69 6c 65 4e  ame $targetFileN
bc50: 61 6d 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 69 66  ame]....      if
bc60: 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20   {[catch {..    
bc70: 20 20 20 20 69 66 20 7b 21 5b 66 69 6c 65 20 65      if {![file e
bc80: 78 69 73 74 73 20 24 74 61 72 67 65 74 44 69 72  xists $targetDir
bc90: 65 63 74 6f 72 79 5d 7d 20 74 68 65 6e 20 7b 0d  ectory]} then {.
bca0: 0a 20 20 20 20 20 20 20 20 20 20 66 69 6c 65 20  .          file 
bcb0: 6d 6b 64 69 72 20 24 74 61 72 67 65 74 44 69 72  mkdir $targetDir
bcc0: 65 63 74 6f 72 79 0d 0a 20 20 20 20 20 20 20 20  ectory..        
bcd0: 7d 0d 0a 20 20 20 20 20 20 20 20 66 69 6c 65 20  }..        file 
bce0: 63 6f 70 79 20 2d 66 6f 72 63 65 20 24 73 6f 75  copy -force $sou
bcf0: 72 63 65 46 69 6c 65 4e 61 6d 65 20 24 74 61 72  rceFileName $tar
bd00: 67 65 74 46 69 6c 65 4e 61 6d 65 0d 0a 20 20 20  getFileName..   
bd10: 20 20 20 7d 5d 20 3d 3d 20 30 7d 20 74 68 65 6e     }] == 0} then
bd20: 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74   {..        tput
bd30: 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
bd40: 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
bd50: 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d  .            "--
bd60: 2d 2d 20 63 6f 70 69 65 64 20 62 75 69 6c 64 20  -- copied build 
bd70: 66 69 6c 65 20 66 72 6f 6d 20 5c 22 22 20 24 73  file from \"" $s
bd80: 6f 75 72 63 65 46 69 6c 65 4e 61 6d 65 20 22 5c  ourceFileName "\
bd90: 22 20 74 6f 20 5c 22 22 20 5c 0d 0a 20 20 20 20  " to \"" \..    
bda0: 20 20 20 20 20 20 20 20 24 74 61 72 67 65 74 46          $targetF
bdb0: 69 6c 65 4e 61 6d 65 20 5c 22 5c 6e 5d 0d 0a 20  ileName \"\n].. 
bdc0: 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
bdd0: 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
bde0: 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70  test_channel [ap
bdf0: 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
be00: 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 66 61          "---- fa
be10: 69 6c 65 64 20 74 6f 20 63 6f 70 79 20 62 75 69  iled to copy bui
be20: 6c 64 20 66 69 6c 65 20 66 72 6f 6d 20 5c 22 22  ld file from \""
be30: 20 24 73 6f 75 72 63 65 46 69 6c 65 4e 61 6d 65   $sourceFileName
be40: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
be50: 22 5c 22 20 74 6f 20 5c 22 22 20 24 74 61 72 67  "\" to \"" $targ
be60: 65 74 46 69 6c 65 4e 61 6d 65 20 5c 22 5c 6e 5d  etFileName \"\n]
be70: 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d  ..      }..    }
be80: 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 74 72  .....    proc tr
be90: 79 44 65 6c 65 74 65 42 69 6e 61 72 79 46 69 6c  yDeleteBinaryFil
bea0: 65 20 7b 20 66 69 6c 65 4e 61 6d 65 20 7b 70 6c  e { fileName {pl
beb0: 61 74 66 6f 72 6d 20 22 22 7d 20 7b 76 65 72 62  atform ""} {verb
bec0: 6f 73 65 20 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a  ose false} } {..
bed0: 20 20 20 20 20 20 73 65 74 20 66 69 6c 65 4e 61        set fileNa
bee0: 6d 65 20 5b 67 65 74 42 69 6e 61 72 79 46 69 6c  me [getBinaryFil
bef0: 65 4e 61 6d 65 20 24 66 69 6c 65 4e 61 6d 65 20  eName $fileName 
bf00: 24 70 6c 61 74 66 6f 72 6d 5d 0d 0a 0d 0a 20 20  $platform]....  
bf10: 20 20 20 20 69 66 20 7b 21 5b 66 69 6c 65 20 65      if {![file e
bf20: 78 69 73 74 73 20 24 66 69 6c 65 4e 61 6d 65 5d  xists $fileName]
bf30: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
bf40: 20 20 69 66 20 7b 24 76 65 72 62 6f 73 65 7d 20    if {$verbose} 
bf50: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
bf60: 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
bf70: 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
bf80: 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
bf90: 20 20 20 20 20 22 2d 2d 2d 2d 20 73 6b 69 70 70       "---- skipp
bfa0: 65 64 20 64 65 6c 65 74 69 6e 67 20 62 69 6e 61  ed deleting bina
bfb0: 72 79 20 66 69 6c 65 20 5c 22 22 20 24 66 69 6c  ry file \"" $fil
bfc0: 65 4e 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20 20  eName \..       
bfd0: 20 20 20 20 20 20 20 22 5c 22 2c 20 69 74 20 64         "\", it d
bfe0: 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 5c 6e 22  oes not exist\n"
bff0: 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  ]..        }..  
c000: 20 20 20 20 20 20 72 65 74 75 72 6e 0d 0a 20 20        return..  
c010: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 69      }....      i
c020: 66 20 7b 5b 63 61 74 63 68 20 7b 66 69 6c 65 20  f {[catch {file 
c030: 64 65 6c 65 74 65 20 24 66 69 6c 65 4e 61 6d 65  delete $fileName
c040: 7d 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d  }] == 0} then {.
c050: 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24  .        tputs $
c060: 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b  ::test_channel [
c070: 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
c080: 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
c090: 64 65 6c 65 74 65 64 20 62 69 6e 61 72 79 20 66  deleted binary f
c0a0: 69 6c 65 20 5c 22 22 20 24 66 69 6c 65 4e 61 6d  ile \"" $fileNam
c0b0: 65 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d  e \"\n]..      }
c0c0: 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
c0d0: 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
c0e0: 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
c0f0: 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
c100: 20 20 22 2d 2d 2d 2d 20 66 61 69 6c 65 64 20 74    "---- failed t
c110: 6f 20 64 65 6c 65 74 65 20 62 69 6e 61 72 79 20  o delete binary 
c120: 66 69 6c 65 20 5c 22 22 20 24 66 69 6c 65 4e 61  file \"" $fileNa
c130: 6d 65 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20  me \"\n]..      
c140: 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  }..    }.....   
c150: 20 70 72 6f 63 20 74 72 79 44 65 6c 65 74 65 42   proc tryDeleteB
c160: 75 69 6c 64 46 69 6c 65 20 7b 20 66 69 6c 65 4e  uildFile { fileN
c170: 61 6d 65 20 7b 70 6c 61 74 66 6f 72 6d 20 22 22  ame {platform ""
c180: 7d 20 7b 76 65 72 62 6f 73 65 20 66 61 6c 73 65  } {verbose false
c190: 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 73 65 74  } } {..      set
c1a0: 20 66 69 6c 65 4e 61 6d 65 20 5b 67 65 74 42 75   fileName [getBu
c1b0: 69 6c 64 46 69 6c 65 4e 61 6d 65 20 24 66 69 6c  ildFileName $fil
c1c0: 65 4e 61 6d 65 20 24 70 6c 61 74 66 6f 72 6d 5d  eName $platform]
c1d0: 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 21 5b  ....      if {![
c1e0: 66 69 6c 65 20 65 78 69 73 74 73 20 24 66 69 6c  file exists $fil
c1f0: 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a  eName]} then {..
c200: 20 20 20 20 20 20 20 20 69 66 20 7b 24 76 65 72          if {$ver
c210: 62 6f 73 65 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  bose} then {..  
c220: 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
c230: 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61  :test_channel [a
c240: 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
c250: 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
c260: 20 73 6b 69 70 70 65 64 20 64 65 6c 65 74 69 6e   skipped deletin
c270: 67 20 62 75 69 6c 64 20 66 69 6c 65 20 5c 22 22  g build file \""
c280: 20 24 66 69 6c 65 4e 61 6d 65 20 5c 0d 0a 20 20   $fileName \..  
c290: 20 20 20 20 20 20 20 20 20 20 20 20 22 5c 22 2c              "\",
c2a0: 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 65 78 69   it does not exi
c2b0: 73 74 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20  st\n"]..        
c2c0: 7d 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  }..        retur
c2d0: 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  n..      }....  
c2e0: 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b      if {[catch {
c2f0: 66 69 6c 65 20 64 65 6c 65 74 65 20 24 66 69 6c  file delete $fil
c300: 65 4e 61 6d 65 7d 5d 20 3d 3d 20 30 7d 20 74 68  eName}] == 0} th
c310: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70  en {..        tp
c320: 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  uts $::test_chan
c330: 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
c340: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22  \..            "
c350: 2d 2d 2d 2d 20 64 65 6c 65 74 65 64 20 62 75 69  ---- deleted bui
c360: 6c 64 20 66 69 6c 65 20 5c 22 22 20 24 66 69 6c  ld file \"" $fil
c370: 65 4e 61 6d 65 20 5c 22 5c 6e 5d 0d 0a 20 20 20  eName \"\n]..   
c380: 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
c390: 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
c3a0: 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
c3b0: 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
c3c0: 20 20 20 20 20 20 22 2d 2d 2d 2d 20 66 61 69 6c        "---- fail
c3d0: 65 64 20 74 6f 20 64 65 6c 65 74 65 20 62 75 69  ed to delete bui
c3e0: 6c 64 20 66 69 6c 65 20 5c 22 22 20 24 66 69 6c  ld file \"" $fil
c3f0: 65 4e 61 6d 65 20 5c 22 5c 6e 5d 0d 0a 20 20 20  eName \"\n]..   
c400: 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a     }..    }.....
c410: 20 20 20 20 70 72 6f 63 20 74 72 79 43 6f 70 79      proc tryCopy
c420: 41 73 73 65 6d 62 6c 79 20 7b 0d 0a 20 20 20 20  Assembly {..    
c430: 20 20 20 20 20 20 20 20 66 69 6c 65 4e 61 6d 65          fileName
c440: 20 7b 70 6c 61 74 66 6f 72 6d 20 22 22 7d 20 7b   {platform ""} {
c450: 70 64 62 20 74 72 75 65 7d 20 7b 76 65 72 62 6f  pdb true} {verbo
c460: 73 65 20 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a 20  se false} } {.. 
c470: 20 20 20 20 20 74 72 79 43 6f 70 79 42 75 69 6c       tryCopyBuil
c480: 64 46 69 6c 65 20 24 66 69 6c 65 4e 61 6d 65 20  dFile $fileName 
c490: 24 70 6c 61 74 66 6f 72 6d 20 22 22 20 24 76 65  $platform "" $ve
c4a0: 72 62 6f 73 65 0d 0a 0d 0a 20 20 20 20 20 20 69  rbose....      i
c4b0: 66 20 7b 24 70 64 62 7d 20 74 68 65 6e 20 7b 0d  f {$pdb} then {.
c4c0: 0a 20 20 20 20 20 20 20 20 74 72 79 43 6f 70 79  .        tryCopy
c4d0: 42 75 69 6c 64 46 69 6c 65 20 5b 61 70 70 65 6e  BuildFile [appen
c4e0: 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
c4f0: 20 20 20 20 20 5b 66 69 6c 65 20 72 6f 6f 74 6e       [file rootn
c500: 61 6d 65 20 24 66 69 6c 65 4e 61 6d 65 5d 20 2e  ame $fileName] .
c510: 70 64 62 5d 20 24 70 6c 61 74 66 6f 72 6d 20 22  pdb] $platform "
c520: 22 20 24 76 65 72 62 6f 73 65 0d 0a 20 20 20 20  " $verbose..    
c530: 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20    }..    }..... 
c540: 20 20 20 70 72 6f 63 20 74 72 79 44 65 6c 65 74     proc tryDelet
c550: 65 41 73 73 65 6d 62 6c 79 20 7b 0d 0a 20 20 20  eAssembly {..   
c560: 20 20 20 20 20 20 20 20 20 66 69 6c 65 4e 61 6d           fileNam
c570: 65 20 7b 70 6c 61 74 66 6f 72 6d 20 22 22 7d 20  e {platform ""} 
c580: 7b 70 64 62 20 74 72 75 65 7d 20 7b 76 65 72 62  {pdb true} {verb
c590: 6f 73 65 20 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a  ose false} } {..
c5a0: 20 20 20 20 20 20 74 72 79 44 65 6c 65 74 65 42        tryDeleteB
c5b0: 69 6e 61 72 79 46 69 6c 65 20 24 66 69 6c 65 4e  inaryFile $fileN
c5c0: 61 6d 65 20 24 70 6c 61 74 66 6f 72 6d 20 24 76  ame $platform $v
c5d0: 65 72 62 6f 73 65 0d 0a 0d 0a 20 20 20 20 20 20  erbose....      
c5e0: 69 66 20 7b 24 70 64 62 7d 20 74 68 65 6e 20 7b  if {$pdb} then {
c5f0: 0d 0a 20 20 20 20 20 20 20 20 74 72 79 44 65 6c  ..        tryDel
c600: 65 74 65 42 69 6e 61 72 79 46 69 6c 65 20 5b 61  eteBinaryFile [a
c610: 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
c620: 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20 72           [file r
c630: 6f 6f 74 6e 61 6d 65 20 24 66 69 6c 65 4e 61 6d  ootname $fileNam
c640: 65 5d 20 2e 70 64 62 5d 20 24 70 6c 61 74 66 6f  e] .pdb] $platfo
c650: 72 6d 20 24 76 65 72 62 6f 73 65 0d 0a 20 20 20  rm $verbose..   
c660: 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a     }..    }.....
c670: 20 20 20 20 70 72 6f 63 20 74 72 79 4c 6f 61 64      proc tryLoad
c680: 41 73 73 65 6d 62 6c 79 20 7b 20 66 69 6c 65 4e  Assembly { fileN
c690: 61 6d 65 20 7b 70 6c 61 74 66 6f 72 6d 20 22 22  ame {platform ""
c6a0: 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 73 65 74  } } {..      set
c6b0: 20 66 69 6c 65 4e 61 6d 65 20 5b 67 65 74 42 69   fileName [getBi
c6c0: 6e 61 72 79 46 69 6c 65 4e 61 6d 65 20 24 66 69  naryFileName $fi
c6d0: 6c 65 4e 61 6d 65 20 24 70 6c 61 74 66 6f 72 6d  leName $platform
c6e0: 5d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b  ]....      if {[
c6f0: 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20  catch {..       
c700: 20 73 65 74 20 61 73 73 65 6d 62 6c 79 20 5b 6f   set assembly [o
c710: 62 6a 65 63 74 20 6c 6f 61 64 20 2d 6c 6f 61 64  bject load -load
c720: 74 79 70 65 20 46 69 6c 65 20 2d 61 6c 69 61 73  type File -alias
c730: 20 24 66 69 6c 65 4e 61 6d 65 5d 0d 0a 20 20 20   $fileName]..   
c740: 20 20 20 7d 5d 20 3d 3d 20 30 7d 20 74 68 65 6e     }] == 0} then
c750: 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20   {..        #.. 
c760: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4e         # NOTE: N
c770: 6f 77 2c 20 61 64 64 20 74 68 65 20 6e 65 63 65  ow, add the nece
c780: 73 73 61 72 79 20 74 65 73 74 20 63 6f 6e 73 74  ssary test const
c790: 72 61 69 6e 74 2e 0d 0a 20 20 20 20 20 20 20 20  raint...        
c7a0: 23 0d 0a 20 20 20 20 20 20 20 20 61 64 64 43 6f  #..        addCo
c7b0: 6e 73 74 72 61 69 6e 74 20 5b 66 69 6c 65 20 72  nstraint [file r
c7c0: 6f 6f 74 6e 61 6d 65 20 5b 66 69 6c 65 20 74 61  ootname [file ta
c7d0: 69 6c 20 24 66 69 6c 65 4e 61 6d 65 5d 5d 0d 0a  il $fileName]]..
c7e0: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
c7f0: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 47 72 61       # NOTE: Gra
c800: 62 20 74 68 65 20 69 6d 61 67 65 20 72 75 6e 74  b the image runt
c810: 69 6d 65 20 76 65 72 73 69 6f 6e 20 66 72 6f 6d  ime version from
c820: 20 74 68 65 20 61 73 73 65 6d 62 6c 79 20 62 65   the assembly be
c830: 63 61 75 73 65 0d 0a 20 20 20 20 20 20 20 20 23  cause..        #
c840: 20 20 20 20 20 20 20 73 65 76 65 72 61 6c 20 74         several t
c850: 65 73 74 73 20 72 65 6c 79 20 6f 6e 20 69 74 20  ests rely on it 
c860: 68 61 76 69 6e 67 20 61 20 63 65 72 74 61 69 6e  having a certain
c870: 20 76 61 6c 75 65 2e 0d 0a 20 20 20 20 20 20 20   value...       
c880: 20 23 0d 0a 20 20 20 20 20 20 20 20 61 64 64 43   #..        addC
c890: 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e  onstraint [appen
c8a0: 64 41 72 67 73 20 5b 66 69 6c 65 20 74 61 69 6c  dArgs [file tail
c8b0: 20 24 66 69 6c 65 4e 61 6d 65 5d 20 5f 20 5c 0d   $fileName] _ \.
c8c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 24 61  .            [$a
c8d0: 73 73 65 6d 62 6c 79 20 49 6d 61 67 65 52 75 6e  ssembly ImageRun
c8e0: 74 69 6d 65 56 65 72 73 69 6f 6e 5d 5d 0d 0a 0d  timeVersion]]...
c8f0: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
c900: 20 20 20 20 23 20 4e 4f 54 45 3a 20 52 65 74 75      # NOTE: Retu
c910: 72 6e 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68  rn the full path
c920: 20 6f 66 20 74 68 65 20 6c 6f 61 64 65 64 20 66   of the loaded f
c930: 69 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  ile...        #.
c940: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
c950: 24 66 69 6c 65 4e 61 6d 65 0d 0a 20 20 20 20 20  $fileName..     
c960: 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65 74 75   }....      retu
c970: 72 6e 20 22 22 0d 0a 20 20 20 20 7d 0d 0a 0c 0d  rn ""..    }....
c980: 0a 20 20 20 20 70 72 6f 63 20 69 73 53 51 4c 69  .    proc isSQLi
c990: 74 65 52 65 61 64 79 20 7b 7d 20 7b 0d 0a 20 20  teReady {} {..  
c9a0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
c9b0: 4f 54 45 3a 20 54 68 69 73 20 70 72 6f 63 65 64  OTE: This proced
c9c0: 75 72 65 20 6d 75 73 74 20 72 65 74 75 72 6e 20  ure must return 
c9d0: 6e 6f 6e 2d 7a 65 72 6f 20 6f 6e 6c 79 20 69 66  non-zero only if
c9e0: 20 74 68 65 20 53 51 4c 69 74 65 20 6e 61 74 69   the SQLite nati
c9f0: 76 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  ve..      #     
ca00: 20 20 6c 69 62 72 61 72 79 20 61 6e 64 20 74 68    library and th
ca10: 65 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51  e System.Data.SQ
ca20: 4c 69 74 65 20 6d 61 6e 61 67 65 64 20 61 73 73  Lite managed ass
ca30: 65 6d 62 6c 79 20 61 72 65 20 6c 6f 61 64 65 64  embly are loaded
ca40: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
ca50: 61 6e 64 20 72 65 61 64 79 20 66 6f 72 20 75 73  and ready for us
ca60: 65 20 62 79 20 74 68 65 20 74 65 73 74 20 73 75  e by the test su
ca70: 69 74 65 2e 20 20 43 75 72 72 65 6e 74 6c 79 2c  ite.  Currently,
ca80: 20 74 68 69 73 20 70 72 6f 63 65 64 75 72 65 0d   this procedure.
ca90: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 73  .      #       s
caa0: 68 6f 75 6c 64 20 62 65 20 63 61 6c 6c 65 64 20  hould be called 
cab0: 6f 6e 6c 79 20 61 66 74 65 72 20 74 68 65 20 5b  only after the [
cac0: 74 72 79 4c 6f 61 64 41 73 73 65 6d 62 6c 79 5d  tryLoadAssembly]
cad0: 20 70 72 6f 63 65 64 75 72 65 20 68 61 73 0d 0a   procedure has..
cae0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 62 65        #       be
caf0: 65 6e 20 63 61 6c 6c 65 64 20 74 6f 20 70 72 6f  en called to pro
cb00: 62 65 20 66 6f 72 20 74 68 65 20 53 79 73 74 65  be for the Syste
cb10: 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 20 6d 61  m.Data.SQLite ma
cb20: 6e 61 67 65 64 20 61 73 73 65 6d 62 6c 79 0d 0a  naged assembly..
cb30: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 61 6e        #       an
cb40: 64 20 74 68 65 20 5b 63 68 65 63 6b 46 6f 72 53  d the [checkForS
cb50: 51 4c 69 74 65 5d 20 70 72 6f 63 65 64 75 72 65  QLite] procedure
cb60: 20 68 61 73 20 62 65 65 6e 20 63 61 6c 6c 65 64   has been called
cb70: 20 74 6f 20 70 72 6f 62 65 20 66 6f 72 0d 0a 20   to probe for.. 
cb80: 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68 65       #       the
cb90: 20 53 51 4c 69 74 65 20 6e 61 74 69 76 65 20 6c   SQLite native l
cba0: 69 62 72 61 72 79 3b 20 6f 74 68 65 72 77 69 73  ibrary; otherwis
cbb0: 65 2c 20 74 68 69 73 20 70 72 6f 63 65 64 75 72  e, this procedur
cbc0: 65 20 77 69 6c 6c 20 73 69 6d 70 6c 79 0d 0a 20  e will simply.. 
cbd0: 20 20 20 20 20 23 20 20 20 20 20 20 20 61 6c 77       #       alw
cbe0: 61 79 73 20 72 65 74 75 72 6e 20 7a 65 72 6f 2e  ays return zero.
cbf0: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
cc00: 20 72 65 74 75 72 6e 20 5b 65 78 70 72 20 7b 0d   return [expr {.
cc10: 0a 20 20 20 20 20 20 20 20 5b 68 61 76 65 43 6f  .        [haveCo
cc20: 6e 73 74 72 61 69 6e 74 20 53 79 73 74 65 6d 2e  nstraint System.
cc30: 44 61 74 61 2e 53 51 4c 69 74 65 5d 20 26 26 20  Data.SQLite] && 
cc40: 5b 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74 20  [haveConstraint 
cc50: 53 51 4c 69 74 65 5d 0d 0a 20 20 20 20 20 20 7d  SQLite]..      }
cc60: 5d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  ]..    }.....   
cc70: 20 70 72 6f 63 20 6d 61 74 63 68 50 6c 61 74 66   proc matchPlatf
cc80: 6f 72 6d 20 7b 20 70 6c 61 74 66 6f 72 6d 20 7d  orm { platform }
cc90: 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20   {..      #..   
cca0: 20 20 20 23 20 4e 4f 54 45 3a 20 41 6e 20 65 6d     # NOTE: An em
ccb0: 70 74 79 20 73 74 72 69 6e 67 20 66 6f 72 20 74  pty string for t
ccc0: 68 65 20 70 6c 61 74 66 6f 72 6d 20 6d 65 61 6e  he platform mean
ccd0: 73 20 74 68 61 74 20 74 68 65 20 62 75 69 6c 64  s that the build
cce0: 20 69 73 20 6e 6f 74 0d 0a 20 20 20 20 20 20 23   is not..      #
ccf0: 20 20 20 20 20 20 20 5b 70 72 69 6d 61 72 69 6c         [primaril
cd00: 79 5d 20 61 20 6e 61 74 69 76 65 20 62 75 69 6c  y] a native buil
cd10: 64 3b 20 74 68 65 72 65 66 6f 72 65 2c 20 69 74  d; therefore, it
cd20: 20 61 6c 77 61 79 73 20 6d 61 74 63 68 65 73 2e   always matches.
cd30: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
cd40: 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e   if {[string len
cd50: 67 74 68 20 24 70 6c 61 74 66 6f 72 6d 5d 20 3d  gth $platform] =
cd60: 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  = 0} then {..   
cd70: 20 20 20 20 20 72 65 74 75 72 6e 20 74 72 75 65       return true
cd80: 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
cd90: 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
cda0: 54 45 3a 20 44 6f 65 73 20 74 68 65 20 73 70 65  TE: Does the spe
cdb0: 63 69 66 69 65 64 20 70 6c 61 74 66 6f 72 6d 20  cified platform 
cdc0: 6d 61 74 63 68 20 75 70 20 74 6f 20 74 68 65 20  match up to the 
cdd0: 63 75 72 72 65 6e 74 20 70 72 6f 63 65 73 73 3f  current process?
cde0: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
cdf0: 20 69 66 20 7b 24 70 6c 61 74 66 6f 72 6d 20 65   if {$platform e
ce00: 71 20 5b 6d 61 63 68 69 6e 65 54 6f 50 6c 61 74  q [machineToPlat
ce10: 66 6f 72 6d 20 24 3a 3a 74 63 6c 5f 70 6c 61 74  form $::tcl_plat
ce20: 66 6f 72 6d 28 6d 61 63 68 69 6e 65 29 5d 7d 20  form(machine)]} 
ce30: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
ce40: 72 65 74 75 72 6e 20 74 72 75 65 0d 0a 20 20 20  return true..   
ce50: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d     }....      #.
ce60: 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54  .      # NOTE: T
ce70: 68 65 20 73 70 65 63 69 66 69 65 64 20 70 6c 61  he specified pla
ce80: 74 66 6f 72 6d 20 64 6f 65 73 20 6e 6f 74 20 6d  tform does not m
ce90: 61 74 63 68 20 75 70 20 77 69 74 68 20 74 68 65  atch up with the
cea0: 20 70 6c 61 74 66 6f 72 6d 0d 0a 20 20 20 20 20   platform..     
ceb0: 20 23 20 20 20 20 20 20 20 66 6f 72 20 74 68 65   #       for the
cec0: 20 63 75 72 72 65 6e 74 20 70 72 6f 63 65 73 73   current process
ced0: 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
cee0: 20 20 72 65 74 75 72 6e 20 66 61 6c 73 65 0d 0a    return false..
cef0: 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
cf00: 6f 63 20 68 61 76 65 53 51 4c 69 74 65 4f 62 6a  oc haveSQLiteObj
cf10: 65 63 74 43 6f 6d 6d 61 6e 64 20 7b 7d 20 7b 0d  ectCommand {} {.
cf20: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
cf30: 23 20 4e 4f 54 45 3a 20 49 73 20 74 68 65 20 5b  # NOTE: Is the [
cf40: 6f 62 6a 65 63 74 5d 20 63 6f 6d 6d 61 6e 64 20  object] command 
cf50: 63 75 72 72 65 6e 74 6c 79 20 61 76 61 69 6c 61  currently availa
cf60: 62 6c 65 3f 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ble?..      #.. 
cf70: 20 20 20 20 20 72 65 74 75 72 6e 20 5b 65 78 70       return [exp
cf80: 72 20 7b 5b 6c 6c 65 6e 67 74 68 20 5b 69 6e 66  r {[llength [inf
cf90: 6f 20 63 6f 6d 6d 61 6e 64 73 20 6f 62 6a 65 63  o commands objec
cfa0: 74 5d 5d 20 3e 20 30 7d 5d 0d 0a 20 20 20 20 7d  t]] > 0}]..    }
cfb0: 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 63 68  .....    proc ch
cfc0: 65 63 6b 46 6f 72 53 51 4c 69 74 65 4f 62 6a 65  eckForSQLiteObje
cfd0: 63 74 43 6f 6d 6d 61 6e 64 20 7b 20 63 68 61 6e  ctCommand { chan
cfe0: 6e 65 6c 20 7d 20 7b 0d 0a 20 20 20 20 20 20 74  nel } {..      t
cff0: 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 22 2d  puts $channel "-
d000: 2d 2d 2d 20 63 68 65 63 6b 69 6e 67 20 66 6f 72  --- checking for
d010: 20 5c 22 6f 62 6a 65 63 74 5c 22 20 63 6f 6d 6d   \"object\" comm
d020: 61 6e 64 20 75 73 61 67 65 2e 2e 2e 20 22 0d 0a  and usage... "..
d030: 0d 0a 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e  ..      if {![in
d040: 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 73  fo exists ::no(s
d050: 71 6c 69 74 65 4f 62 6a 65 63 74 43 6f 6d 6d 61  qliteObjectComma
d060: 6e 64 29 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20  nd)] && \..     
d070: 20 20 20 20 20 5b 68 61 76 65 53 51 4c 69 74 65       [haveSQLite
d080: 4f 62 6a 65 63 74 43 6f 6d 6d 61 6e 64 5d 7d 20  ObjectCommand]} 
d090: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
d0a0: 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 79  tputs $channel y
d0b0: 65 73 5c 6e 0d 0a 20 20 20 20 20 20 7d 20 65 6c  es\n..      } el
d0c0: 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d  se {..        #.
d0d0: 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
d0e0: 20 55 6e 6c 65 73 73 20 77 65 20 61 72 65 20 66   Unless we are f
d0f0: 6f 72 62 69 64 64 65 6e 20 66 72 6f 6d 20 64 6f  orbidden from do
d100: 69 6e 67 20 73 6f 2c 20 61 64 64 20 73 6f 6d 65  ing so, add some
d110: 20 63 6f 6e 73 74 72 61 69 6e 74 73 0d 0a 20 20   constraints..  
d120: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68        #       th
d130: 61 74 20 77 69 6c 6c 20 61 6c 6c 6f 77 20 6d 6f  at will allow mo
d140: 73 74 20 6f 66 20 74 68 65 20 74 65 73 74 20 73  st of the test s
d150: 75 69 74 65 20 74 6f 20 72 75 6e 20 28 69 2e 65  uite to run (i.e
d160: 2e 20 74 68 6f 73 65 0d 0a 20 20 20 20 20 20 20  . those..       
d170: 20 23 20 20 20 20 20 20 20 74 65 73 74 73 20 74   #       tests t
d180: 68 61 74 20 64 6f 20 6e 6f 74 20 64 69 72 65 63  hat do not direc
d190: 74 6c 79 20 72 65 6c 79 20 75 70 6f 6e 20 74 68  tly rely upon th
d1a0: 65 20 5b 6f 62 6a 65 63 74 5d 20 63 6f 6d 6d 61  e [object] comma
d1b0: 6e 64 29 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  nd)...        #.
d1c0: 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69  .        if {![i
d1d0: 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28  nfo exists ::no(
d1e0: 73 68 69 6d 53 51 4c 69 74 65 41 73 73 65 6d 62  shimSQLiteAssemb
d1f0: 6c 79 43 6f 6e 73 74 72 61 69 6e 74 73 29 5d 7d  lyConstraints)]}
d200: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
d210: 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74     addConstraint
d220: 20 53 51 4c 69 74 65 0d 0a 20 20 20 20 20 20 20   SQLite..       
d230: 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74     addConstraint
d240: 20 53 51 4c 69 74 65 49 6e 74 65 72 6f 70 0d 0a   SQLiteInterop..
d250: 20 20 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e            addCon
d260: 73 74 72 61 69 6e 74 20 53 79 73 74 65 6d 2e 44  straint System.D
d270: 61 74 61 2e 53 51 4c 69 74 65 0d 0a 20 20 20 20  ata.SQLite..    
d280: 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61        addConstra
d290: 69 6e 74 20 53 79 73 74 65 6d 2e 44 61 74 61 2e  int System.Data.
d2a0: 53 51 4c 69 74 65 2e 45 6e 63 72 79 70 74 69 6f  SQLite.Encryptio
d2b0: 6e 0d 0a 20 20 20 20 20 20 20 20 20 20 61 64 64  n..          add
d2c0: 43 6f 6e 73 74 72 61 69 6e 74 20 53 79 73 74 65  Constraint Syste
d2d0: 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 4c 69  m.Data.SQLite.Li
d2e0: 6e 71 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  nq....          
d2f0: 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61  addConstraint [a
d300: 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
d310: 20 20 20 20 20 20 20 20 20 20 20 53 79 73 74 65             Syste
d320: 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 64 6c  m.Data.SQLite.dl
d330: 6c 5f 76 20 5b 67 65 74 42 75 69 6c 64 43 6c 72  l_v [getBuildClr
d340: 56 65 72 73 69 6f 6e 5d 5d 0d 0a 20 20 20 20 20  Version]]..     
d350: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
d360: 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74  if {![info exist
d370: 73 20 3a 3a 6e 6f 28 73 68 69 6d 53 51 4c 69 74  s ::no(shimSQLit
d380: 65 44 65 66 69 6e 65 43 6f 6e 73 74 61 6e 74 43  eDefineConstantC
d390: 6f 6e 73 74 72 61 69 6e 74 73 29 5d 7d 20 74 68  onstraints)]} th
d3a0: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
d3b0: 66 6f 72 65 61 63 68 20 64 65 66 69 6e 65 43 6f  foreach defineCo
d3c0: 6e 73 74 61 6e 74 20 5b 6c 69 73 74 20 5c 0d 0a  nstant [list \..
d3d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 49 4e                IN
d3e0: 54 45 52 4f 50 5f 45 58 54 45 4e 53 49 4f 4e 5f  TEROP_EXTENSION_
d3f0: 46 55 4e 43 54 49 4f 4e 53 20 49 4e 54 45 52 4f  FUNCTIONS INTERO
d400: 50 5f 46 54 53 35 5f 45 58 54 45 4e 53 49 4f 4e  P_FTS5_EXTENSION
d410: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
d420: 20 20 49 4e 54 45 52 4f 50 5f 4a 53 4f 4e 31 5f    INTEROP_JSON1_
d430: 45 58 54 45 4e 53 49 4f 4e 20 49 4e 54 45 52 4f  EXTENSION INTERO
d440: 50 5f 50 45 52 43 45 4e 54 49 4c 45 5f 45 58 54  P_PERCENTILE_EXT
d450: 45 4e 53 49 4f 4e 20 5c 0d 0a 20 20 20 20 20 20  ENSION \..      
d460: 20 20 20 20 20 20 20 20 49 4e 54 45 52 4f 50 5f          INTEROP_
d470: 52 45 47 45 58 50 5f 45 58 54 45 4e 53 49 4f 4e  REGEXP_EXTENSION
d480: 20 49 4e 54 45 52 4f 50 5f 54 45 53 54 5f 45 58   INTEROP_TEST_EX
d490: 54 45 4e 53 49 4f 4e 20 5c 0d 0a 20 20 20 20 20  TENSION \..     
d4a0: 20 20 20 20 20 20 20 20 20 49 4e 54 45 52 4f 50           INTEROP
d4b0: 5f 54 4f 54 59 50 45 5f 45 58 54 45 4e 53 49 4f  _TOTYPE_EXTENSIO
d4c0: 4e 20 49 4e 54 45 52 4f 50 5f 56 49 52 54 55 41  N INTEROP_VIRTUA
d4d0: 4c 5f 54 41 42 4c 45 20 5c 0d 0a 20 20 20 20 20  L_TABLE \..     
d4e0: 20 20 20 20 20 20 20 20 20 55 53 45 5f 49 4e 54           USE_INT
d4f0: 45 52 4f 50 5f 44 4c 4c 5d 20 7b 0d 0a 20 20 20  EROP_DLL] {..   
d500: 20 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73           addCons
d510: 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72  traint [appendAr
d520: 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
d530: 20 20 20 20 20 20 5b 67 65 74 53 51 4c 69 74 65        [getSQLite
d540: 44 65 66 69 6e 65 43 6f 6e 73 74 61 6e 74 50 72  DefineConstantPr
d550: 65 66 69 78 5d 20 24 64 65 66 69 6e 65 43 6f 6e  efix] $defineCon
d560: 73 74 61 6e 74 5d 0d 0a 20 20 20 20 20 20 20 20  stant]..        
d570: 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a    }..        }..
d580: 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b  ..        if {![
d590: 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f  info exists ::no
d5a0: 28 73 68 69 6d 53 51 4c 69 74 65 56 69 73 75 61  (shimSQLiteVisua
d5b0: 6c 53 74 75 64 69 6f 43 6f 6e 73 74 72 61 69 6e  lStudioConstrain
d5c0: 74 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ts)]} then {..  
d5d0: 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74          addConst
d5e0: 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67  raint [appendArg
d5f0: 73 20 76 69 73 75 61 6c 53 74 75 64 69 6f 20 5b  s visualStudio [
d600: 67 65 74 42 75 69 6c 64 59 65 61 72 5d 5d 0d 0a  getBuildYear]]..
d610: 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
d620: 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
d630: 6e 65 6c 20 6e 6f 5c 6e 0d 0a 20 20 20 20 20 20  nel no\n..      
d640: 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  }..    }.....   
d650: 20 70 72 6f 63 20 63 68 61 6e 67 65 4e 61 74 69   proc changeNati
d660: 76 65 52 75 6e 74 69 6d 65 4f 70 74 69 6f 6e 20  veRuntimeOption 
d670: 7b 20 6e 61 74 69 76 65 20 7d 20 7b 0d 0a 20 20  { native } {..  
d680: 20 20 20 20 69 66 20 7b 5b 6c 6c 65 6e 67 74 68      if {[llength
d690: 20 5b 69 6e 66 6f 20 63 6f 6d 6d 61 6e 64 73 20   [info commands 
d6a0: 64 65 62 75 67 5d 5d 20 3e 20 30 20 26 26 20 5c  debug]] > 0 && \
d6b0: 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 6c 6c 65  ..          [lle
d6c0: 6e 67 74 68 20 5b 69 6e 66 6f 20 73 75 62 63 6f  ngth [info subco
d6d0: 6d 6d 61 6e 64 73 20 64 65 62 75 67 20 72 75 6e  mmands debug run
d6e0: 74 69 6d 65 6f 70 74 69 6f 6e 5d 5d 20 3e 20 30  timeoption]] > 0
d6f0: 20 26 26 20 5b 63 61 74 63 68 20 7b 0d 0a 20 20   && [catch {..  
d700: 20 20 20 20 20 20 64 65 62 75 67 20 72 75 6e 74        debug runt
d710: 69 6d 65 6f 70 74 69 6f 6e 20 5b 65 78 70 72 20  imeoption [expr 
d720: 7b 24 6e 61 74 69 76 65 20 3f 20 22 61 64 64 22  {$native ? "add"
d730: 20 3a 20 22 72 65 6d 6f 76 65 22 7d 5d 20 6e 61   : "remove"}] na
d740: 74 69 76 65 0d 0a 20 20 20 20 20 20 7d 5d 20 3d  tive..      }] =
d750: 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  = 0} then {..   
d760: 20 20 20 20 20 72 65 74 75 72 6e 20 74 72 75 65       return true
d770: 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
d780: 20 20 20 69 66 20 7b 5b 68 61 76 65 53 51 4c 69     if {[haveSQLi
d790: 74 65 4f 62 6a 65 63 74 43 6f 6d 6d 61 6e 64 5d  teObjectCommand]
d7a0: 20 26 26 20 5b 63 61 74 63 68 20 7b 0d 0a 20 20   && [catch {..  
d7b0: 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76        object inv
d7c0: 6f 6b 65 20 49 6e 74 65 72 70 72 65 74 65 72 2e  oke Interpreter.
d7d0: 47 65 74 41 63 74 69 76 65 20 5b 65 78 70 72 20  GetActive [expr 
d7e0: 7b 24 6e 61 74 69 76 65 20 3f 20 5c 0d 0a 20 20  {$native ? \..  
d7f0: 20 20 20 20 20 20 20 20 20 20 22 41 64 64 52 75            "AddRu
d800: 6e 74 69 6d 65 4f 70 74 69 6f 6e 22 20 3a 20 22  ntimeOption" : "
d810: 52 65 6d 6f 76 65 52 75 6e 74 69 6d 65 4f 70 74  RemoveRuntimeOpt
d820: 69 6f 6e 22 7d 5d 20 6e 61 74 69 76 65 0d 0a 20  ion"}] native.. 
d830: 20 20 20 20 20 7d 5d 20 3d 3d 20 30 7d 20 74 68       }] == 0} th
d840: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 72 65  en {..        re
d850: 74 75 72 6e 20 74 72 75 65 0d 0a 20 20 20 20 20  turn true..     
d860: 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65 74 75   }....      retu
d870: 72 6e 20 66 61 6c 73 65 0d 0a 20 20 20 20 7d 0d  rn false..    }.
d880: 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 63 68 65  ....    proc che
d890: 63 6b 46 6f 72 53 51 4c 69 74 65 42 75 69 6c 64  ckForSQLiteBuild
d8a0: 73 20 7b 20 63 68 61 6e 6e 65 6c 20 7b 73 65 6c  s { channel {sel
d8b0: 65 63 74 20 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a  ect false} } {..
d8c0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
d8d0: 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 66 6f 72   NOTE: Check for
d8e0: 20 65 76 65 72 79 20 70 6f 73 73 69 62 6c 65 20   every possible 
d8f0: 76 61 6c 69 64 20 63 6f 6d 62 69 6e 61 74 69 6f  valid combinatio
d900: 6e 20 6f 66 20 76 61 6c 75 65 73 20 75 73 65 64  n of values used
d910: 20 77 68 65 6e 0d 0a 20 20 20 20 20 20 23 20 20   when..      #  
d920: 20 20 20 20 20 6c 6f 63 61 74 69 6e 67 20 6f 75       locating ou
d930: 74 20 74 68 65 20 62 75 69 6c 64 20 6f 75 74 70  t the build outp
d940: 75 74 20 64 69 72 65 63 74 6f 72 79 2c 20 73 68  ut directory, sh
d950: 6f 77 69 6e 67 20 65 61 63 68 20 61 76 61 69 6c  owing each avail
d960: 61 62 6c 65 0d 0a 20 20 20 20 20 20 23 20 20 20  able..      #   
d970: 20 20 20 20 62 75 69 6c 64 20 76 61 72 69 61 74      build variat
d980: 69 6f 6e 20 61 6c 6f 6e 67 20 74 68 65 20 77 61  ion along the wa
d990: 79 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  y...      #..   
d9a0: 20 20 20 66 6f 72 65 61 63 68 20 6e 61 74 69 76     foreach nativ
d9b0: 65 20 5b 6c 69 73 74 20 66 61 6c 73 65 20 74 72  e [list false tr
d9c0: 75 65 5d 20 7b 0d 0a 20 20 20 20 20 20 20 20 66  ue] {..        f
d9d0: 6f 72 65 61 63 68 20 79 65 61 72 20 5b 67 65 74  oreach year [get
d9e0: 42 75 69 6c 64 59 65 61 72 73 5d 20 7b 0d 0a 20  BuildYears] {.. 
d9f0: 20 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68           foreach
da00: 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 5b   configuration [
da10: 67 65 74 42 75 69 6c 64 43 6f 6e 66 69 67 75 72  getBuildConfigur
da20: 61 74 69 6f 6e 73 5d 20 7b 0d 0a 20 20 20 20 20  ations] {..     
da30: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
da40: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 46 69        # NOTE: Fi
da50: 67 75 72 65 20 6f 75 74 20 74 68 65 20 65 66 66  gure out the eff
da60: 65 63 74 69 76 65 20 62 75 69 6c 64 20 70 6c 61  ective build pla
da70: 74 66 6f 72 6d 2e 20 20 54 68 69 73 20 69 73 0d  tform.  This is.
da80: 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 20 20  .            #  
da90: 20 20 20 20 20 62 61 73 65 64 20 6f 6e 20 77 68       based on wh
daa0: 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 61 20 5b  ether or not a [
dab0: 70 72 69 6d 61 72 69 6c 79 5d 20 6e 61 74 69 76  primarily] nativ
dac0: 65 20 62 75 69 6c 64 0d 0a 20 20 20 20 20 20 20  e build..       
dad0: 20 20 20 20 20 23 20 20 20 20 20 20 20 69 73 20       #       is 
dae0: 62 65 69 6e 67 20 75 73 65 64 2e 20 20 46 6f 72  being used.  For
daf0: 20 5b 70 72 69 6d 61 72 69 6c 79 5d 20 6e 6f 6e   [primarily] non
db00: 2d 6e 61 74 69 76 65 20 62 75 69 6c 64 73 2c 0d  -native builds,.
db10: 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 20 20  .            #  
db20: 20 20 20 20 20 74 68 69 73 20 77 69 6c 6c 20 62       this will b
db30: 65 20 61 6e 20 65 6d 70 74 79 20 73 74 72 69 6e  e an empty strin
db40: 67 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  g...            
db50: 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  #..            s
db60: 65 74 20 70 6c 61 74 66 6f 72 6d 20 5b 67 65 74  et platform [get
db70: 42 75 69 6c 64 50 6c 61 74 66 6f 72 6d 20 24 6e  BuildPlatform $n
db80: 61 74 69 76 65 5d 0d 0a 0d 0a 20 20 20 20 20 20  ative]....      
db90: 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
dba0: 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
dbb0: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
dbc0: 20 20 20 20 22 2d 2d 2d 2d 20 63 68 65 63 6b 69      "---- checki
dbd0: 6e 67 20 66 6f 72 20 53 79 73 74 65 6d 2e 44 61  ng for System.Da
dbe0: 74 61 2e 53 51 4c 69 74 65 20 62 75 69 6c 64 20  ta.SQLite build 
dbf0: 5c 22 22 20 5b 65 78 70 72 20 5c 0d 0a 20 20 20  \"" [expr \..   
dc00: 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 24 6e               {$n
dc10: 61 74 69 76 65 20 3f 20 22 6e 61 74 69 76 65 2f  ative ? "native/
dc20: 22 20 3a 20 22 22 7d 5d 20 5b 65 78 70 72 20 7b  " : ""}] [expr {
dc30: 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 5c  [string length \
dc40: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
dc50: 20 20 24 70 6c 61 74 66 6f 72 6d 5d 20 3e 20 30    $platform] > 0
dc60: 20 3f 20 5b 61 70 70 65 6e 64 41 72 67 73 20 24   ? [appendArgs $
dc70: 70 6c 61 74 66 6f 72 6d 20 2f 5d 20 3a 20 22 22  platform /] : ""
dc80: 7d 5d 20 24 79 65 61 72 20 5c 0d 0a 20 20 20 20  }] $year \..    
dc90: 20 20 20 20 20 20 20 20 20 20 20 20 2f 20 24 63              / $c
dca0: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 22 5c 22  onfiguration "\"
dcb0: 2e 2e 2e 20 22 5d 0d 0a 0d 0a 20 20 20 20 20 20  ... "]....      
dcc0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
dcd0: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 42 75 69       # NOTE: Bui
dce0: 6c 64 20 74 68 65 20 66 75 6c 6c 79 20 71 75 61  ld the fully qua
dcf0: 6c 69 66 69 65 64 20 64 69 72 65 63 74 6f 72 79  lified directory
dd00: 20 77 68 65 72 65 20 74 68 65 20 6e 65 63 65 73   where the neces
dd10: 73 61 72 79 0d 0a 20 20 20 20 20 20 20 20 20 20  sary..          
dd20: 20 20 23 20 20 20 20 20 20 20 63 6f 6d 70 6f 6e    #       compon
dd30: 65 6e 74 73 20 66 6f 72 20 53 79 73 74 65 6d 2e  ents for System.
dd40: 44 61 74 61 2e 53 51 4c 69 74 65 20 73 68 6f 75  Data.SQLite shou
dd50: 6c 64 20 62 65 20 66 6f 75 6e 64 2e 0d 0a 20 20  ld be found...  
dd60: 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
dd70: 20 20 20 20 20 20 20 20 20 73 65 74 20 64 69 72           set dir
dd80: 65 63 74 6f 72 79 20 5b 6a 6f 69 6e 42 75 69 6c  ectory [joinBuil
dd90: 64 44 69 72 65 63 74 6f 72 79 20 24 6e 61 74 69  dDirectory $nati
dda0: 76 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  ve \..          
ddb0: 20 20 20 20 20 20 5b 67 65 74 42 75 69 6c 64 42        [getBuildB
ddc0: 61 73 65 44 69 72 65 63 74 6f 72 79 5d 20 24 79  aseDirectory] $y
ddd0: 65 61 72 20 24 70 6c 61 74 66 6f 72 6d 20 24 63  ear $platform $c
dde0: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 5d 0d 0a 0d  onfiguration]...
ddf0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a  .            #..
de00: 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f              # NO
de10: 54 45 3a 20 44 6f 20 74 68 65 20 6e 65 63 65 73  TE: Do the neces
de20: 73 61 72 79 20 66 69 6c 65 73 20 65 78 69 73 74  sary files exist
de30: 3f 20 20 43 75 72 72 65 6e 74 6c 79 2c 20 6e 6f  ?  Currently, no
de40: 20 6f 74 68 65 72 20 73 74 65 70 73 0d 0a 20 20   other steps..  
de50: 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20            #     
de60: 20 20 61 72 65 20 74 61 6b 65 6e 20 74 6f 20 76    are taken to v
de70: 65 72 69 66 79 20 74 68 69 73 20 62 75 69 6c 64  erify this build
de80: 20 69 73 20 61 63 74 75 61 6c 6c 79 20 76 69 61   is actually via
de90: 62 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  ble...          
dea0: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20    #..           
deb0: 20 69 66 20 7b 5b 69 73 42 75 69 6c 64 41 76 61   if {[isBuildAva
dec0: 69 6c 61 62 6c 65 20 24 6e 61 74 69 76 65 20 24  ilable $native $
ded0: 64 69 72 65 63 74 6f 72 79 5d 7d 20 74 68 65 6e  directory]} then
dee0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
def0: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20    #..           
df00: 20 20 20 23 20 4e 4f 54 45 3a 20 57 68 65 6e 20     # NOTE: When 
df10: 69 6e 20 22 73 65 6c 65 63 74 22 20 6d 6f 64 65  in "select" mode
df20: 2c 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  , automatically 
df30: 73 65 6c 65 63 74 20 74 68 65 20 66 69 72 73 74  select the first
df40: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
df50: 23 20 20 20 20 20 20 20 61 76 61 69 6c 61 62 6c  #       availabl
df60: 65 20 62 75 69 6c 64 20 6f 66 20 53 79 73 74 65  e build of Syste
df70: 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 20 61 6e  m.Data.SQLite an
df80: 64 20 74 68 65 6e 20 72 65 74 75 72 6e 0d 0a 20  d then return.. 
df90: 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20 20               #  
dfa0: 20 20 20 20 20 69 6d 6d 65 64 69 61 74 65 6c 79       immediately
dfb0: 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
dfc0: 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   #..            
dfd0: 20 20 69 66 20 7b 24 73 65 6c 65 63 74 20 26 26    if {$select &&
dfe0: 20 5b 6d 61 74 63 68 50 6c 61 74 66 6f 72 6d 20   [matchPlatform 
dff0: 24 70 6c 61 74 66 6f 72 6d 5d 7d 20 74 68 65 6e  $platform]} then
e000: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
e010: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
e020: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4d         # NOTE: M
e030: 61 6e 75 61 6c 6c 79 20 6f 76 65 72 72 69 64 65  anually override
e040: 20 61 6c 6c 20 74 68 65 20 62 75 69 6c 64 20 64   all the build d
e050: 69 72 65 63 74 6f 72 79 20 73 65 6c 65 63 74 69  irectory selecti
e060: 6f 6e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  on..            
e070: 20 20 20 20 23 20 20 20 20 20 20 20 72 65 6c 61      #       rela
e080: 74 65 64 20 74 65 73 74 20 73 65 74 74 69 6e 67  ted test setting
e090: 73 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 66 6f  s in order to fo
e0a0: 72 63 65 20 74 68 69 73 20 62 75 69 6c 64 0d 0a  rce this build..
e0b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e0c0: 23 20 20 20 20 20 20 20 6f 66 20 53 79 73 74 65  #       of Syste
e0d0: 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 20 74 6f  m.Data.SQLite to
e0e0: 20 62 65 20 75 73 65 64 2e 0d 0a 20 20 20 20 20   be used...     
e0f0: 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
e100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
e110: 20 7b 21 5b 63 68 61 6e 67 65 4e 61 74 69 76 65   {![changeNative
e120: 52 75 6e 74 69 6d 65 4f 70 74 69 6f 6e 20 24 6e  RuntimeOption $n
e130: 61 74 69 76 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a  ative]} then {..
e140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e150: 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
e160: 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
e170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e180: 20 20 20 20 20 20 22 6e 6f 2c 20 66 61 69 6c 65        "no, faile
e190: 64 20 74 6f 20 22 20 5b 65 78 70 72 20 7b 24 6e  d to " [expr {$n
e1a0: 61 74 69 76 65 20 3f 20 22 61 64 64 22 20 3a 20  ative ? "add" : 
e1b0: 22 72 65 6d 6f 76 65 22 7d 5d 20 5c 0d 0a 20 20  "remove"}] \..  
e1c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e1d0: 20 20 20 20 22 20 74 68 65 20 5c 22 6e 61 74 69      " the \"nati
e1e0: 76 65 5c 22 20 72 75 6e 74 69 6d 65 20 6f 70 74  ve\" runtime opt
e1f0: 69 6f 6e 5c 6e 22 5d 0d 0a 0d 0a 20 20 20 20 20  ion\n"]....     
e200: 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74               ret
e210: 75 72 6e 20 66 61 6c 73 65 0d 0a 20 20 20 20 20  urn false..     
e220: 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a             }....
e230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e240: 73 65 74 20 3a 3a 74 65 73 74 5f 79 65 61 72 20  set ::test_year 
e250: 24 79 65 61 72 0d 0a 20 20 20 20 20 20 20 20 20  $year..         
e260: 20 20 20 20 20 20 20 73 65 74 20 3a 3a 74 65 73         set ::tes
e270: 74 5f 70 6c 61 74 66 6f 72 6d 20 24 70 6c 61 74  t_platform $plat
e280: 66 6f 72 6d 0d 0a 20 20 20 20 20 20 20 20 20 20  form..          
e290: 20 20 20 20 20 20 73 65 74 20 3a 3a 74 65 73 74        set ::test
e2a0: 5f 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 24  _configuration $
e2b0: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 0d 0a 0d  configuration...
e2c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
e2d0: 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
e2e0: 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
e2f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e300: 20 20 20 22 79 65 73 2c 20 73 65 6c 65 63 74 65     "yes, selecte
e310: 64 20 28 22 20 5b 65 78 70 72 20 7b 24 6e 61 74  d (" [expr {$nat
e320: 69 76 65 20 3f 20 22 6e 61 74 69 76 65 2f 22 20  ive ? "native/" 
e330: 3a 20 22 22 7d 5d 20 5c 0d 0a 20 20 20 20 20 20  : ""}] \..      
e340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 65                [e
e350: 78 70 72 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e  xpr {[string len
e360: 67 74 68 20 24 70 6c 61 74 66 6f 72 6d 5d 20 3e  gth $platform] >
e370: 20 30 20 3f 20 5b 61 70 70 65 6e 64 41 72 67 73   0 ? [appendArgs
e380: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
e390: 20 20 20 20 20 20 20 20 24 70 6c 61 74 66 6f 72          $platfor
e3a0: 6d 20 2f 5d 20 3a 20 22 22 7d 5d 20 24 79 65 61  m /] : ""}] $yea
e3b0: 72 20 2f 20 24 63 6f 6e 66 69 67 75 72 61 74 69  r / $configurati
e3c0: 6f 6e 20 22 29 5c 6e 22 5d 0d 0a 0d 0a 20 20 20  on ")\n"]....   
e3d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74               ret
e3e0: 75 72 6e 20 74 72 75 65 0d 0a 20 20 20 20 20 20  urn true..      
e3f0: 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b          } else {
e400: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
e410: 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
e420: 20 79 65 73 5c 6e 0d 0a 20 20 20 20 20 20 20 20   yes\n..        
e430: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
e440: 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
e450: 20 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75               tpu
e460: 74 73 20 24 63 68 61 6e 6e 65 6c 20 6e 6f 5c 6e  ts $channel no\n
e470: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
e480: 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  .          }..  
e490: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d        }..      }
e4a0: 0d 0a 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ....      return
e4b0: 20 66 61 6c 73 65 0d 0a 20 20 20 20 7d 0d 0a 0c   false..    }...
e4c0: 0d 0a 20 20 20 20 70 72 6f 63 20 63 68 65 63 6b  ..    proc check
e4d0: 46 6f 72 53 51 4c 69 74 65 52 65 6c 65 61 73 65  ForSQLiteRelease
e4e0: 73 20 7b 20 63 68 61 6e 6e 65 6c 20 7b 73 65 6c  s { channel {sel
e4f0: 65 63 74 20 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a  ect false} } {..
e500: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
e510: 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 66 6f 72   NOTE: Check for
e520: 20 70 61 73 74 20 72 65 6c 65 61 73 65 73 20 6f   past releases o
e530: 66 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51  f System.Data.SQ
e540: 4c 69 74 65 20 69 6e 20 74 68 65 20 64 69 72 65  Lite in the dire
e550: 63 74 6f 72 79 0d 0a 20 20 20 20 20 20 23 20 20  ctory..      #  
e560: 20 20 20 20 20 63 6f 6e 74 61 69 6e 65 64 20 69       contained i
e570: 6e 20 74 68 65 20 22 53 79 73 74 65 6d 2e 44 61  n the "System.Da
e580: 74 61 2e 53 51 4c 69 74 65 22 20 65 6e 76 69 72  ta.SQLite" envir
e590: 6f 6e 6d 65 6e 74 20 76 61 72 69 61 62 6c 65 2c  onment variable,
e5a0: 20 69 66 0d 0a 20 20 20 20 20 20 23 20 20 20 20   if..      #    
e5b0: 20 20 20 70 72 65 73 65 6e 74 2e 0d 0a 20 20 20     present...   
e5c0: 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
e5d0: 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 65  [info exists ::e
e5e0: 6e 76 28 53 79 73 74 65 6d 2e 44 61 74 61 2e 53  nv(System.Data.S
e5f0: 51 4c 69 74 65 29 5d 20 26 26 20 5c 0d 0a 20 20  QLite)] && \..  
e600: 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20          [string 
e610: 6c 65 6e 67 74 68 20 24 3a 3a 65 6e 76 28 53 79  length $::env(Sy
e620: 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
e630: 29 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  )] > 0} then {..
e640: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
e650: 20 20 20 23 20 4e 4f 54 45 3a 20 42 75 69 6c 64     # NOTE: Build
e660: 20 74 68 65 20 66 75 6c 6c 79 20 71 75 61 6c 69   the fully quali
e670: 66 69 65 64 20 64 69 72 65 63 74 6f 72 79 20 77  fied directory w
e680: 68 65 72 65 20 74 68 65 20 6e 65 63 65 73 73 61  here the necessa
e690: 72 79 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  ry..        #   
e6a0: 20 20 20 20 63 6f 6d 70 6f 6e 65 6e 74 73 20 66      components f
e6b0: 6f 72 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53  or System.Data.S
e6c0: 51 4c 69 74 65 20 73 68 6f 75 6c 64 20 62 65 20  QLite should be 
e6d0: 66 6f 75 6e 64 2e 0d 0a 20 20 20 20 20 20 20 20  found...        
e6e0: 23 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 64  #..        set d
e6f0: 69 72 65 63 74 6f 72 79 20 5b 66 69 6c 65 20 6e  irectory [file n
e700: 61 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c 65 20  ativename [file 
e710: 6a 6f 69 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20  join \..        
e720: 20 20 20 20 24 3a 3a 65 6e 76 28 53 79 73 74 65      $::env(Syste
e730: 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 29 20 5b  m.Data.SQLite) [
e740: 67 65 74 52 65 6c 65 61 73 65 56 65 72 73 69 6f  getReleaseVersio
e750: 6e 5d 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  n]]]....        
e760: 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b  tputs $channel [
e770: 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
e780: 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
e790: 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 53 79 73  checking for Sys
e7a0: 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 20  tem.Data.SQLite 
e7b0: 72 65 6c 65 61 73 65 20 5c 22 22 20 5c 0d 0a 20  release \"" \.. 
e7c0: 20 20 20 20 20 20 20 20 20 20 20 24 64 69 72 65             $dire
e7d0: 63 74 6f 72 79 20 22 5c 22 2e 2e 2e 20 22 5d 0d  ctory "\"... "].
e7e0: 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b  ...        if {[
e7f0: 69 73 52 65 6c 65 61 73 65 41 76 61 69 6c 61 62  isReleaseAvailab
e800: 6c 65 20 24 64 69 72 65 63 74 6f 72 79 20 70 6c  le $directory pl
e810: 61 74 66 6f 72 6d 5d 7d 20 74 68 65 6e 20 7b 0d  atform]} then {.
e820: 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b  .          if {[
e830: 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 70  string length $p
e840: 6c 61 74 66 6f 72 6d 5d 20 3d 3d 20 30 7d 20 74  latform] == 0} t
e850: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
e860: 20 20 20 73 65 74 20 70 6c 61 74 66 6f 72 6d 20     set platform 
e870: 75 6e 6b 6e 6f 77 6e 0d 0a 20 20 20 20 20 20 20  unknown..       
e880: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
e890: 20 20 69 66 20 7b 24 73 65 6c 65 63 74 20 26 26    if {$select &&
e8a0: 20 5b 6d 61 74 63 68 50 6c 61 74 66 6f 72 6d 20   [matchPlatform 
e8b0: 24 70 6c 61 74 66 6f 72 6d 5d 7d 20 74 68 65 6e  $platform]} then
e8c0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
e8d0: 73 65 74 20 3a 3a 62 75 69 6c 64 5f 64 69 72 65  set ::build_dire
e8e0: 63 74 6f 72 79 20 24 64 69 72 65 63 74 6f 72 79  ctory $directory
e8f0: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
e900: 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b  tputs $channel [
e910: 61 70 70 65 6e 64 41 72 67 73 20 22 79 65 73 2c  appendArgs "yes,
e920: 20 73 65 6c 65 63 74 65 64 20 28 22 20 24 70 6c   selected (" $pl
e930: 61 74 66 6f 72 6d 20 22 29 5c 6e 22 5d 0d 0a 0d  atform ")\n"]...
e940: 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74  .            ret
e950: 75 72 6e 20 74 72 75 65 0d 0a 20 20 20 20 20 20  urn true..      
e960: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
e970: 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
e980: 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  $channel [append
e990: 41 72 67 73 20 22 79 65 73 20 28 22 20 24 70 6c  Args "yes (" $pl
e9a0: 61 74 66 6f 72 6d 20 22 29 5c 6e 22 5d 0d 0a 20  atform ")\n"].. 
e9b0: 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
e9c0: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
e9d0: 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
e9e0: 68 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d 0a 0d 0a 20  hannel no\n.... 
e9f0: 20 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68           foreach
ea00: 20 70 61 74 68 20 5b 6c 73 6f 72 74 20 2d 64 65   path [lsort -de
ea10: 63 72 65 61 73 69 6e 67 20 5b 66 69 6c 65 20 6c  creasing [file l
ea20: 69 73 74 20 24 64 69 72 65 63 74 6f 72 79 20 2a  ist $directory *
ea30: 5d 5d 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  ]] {..          
ea40: 20 20 69 66 20 7b 5b 66 69 6c 65 20 65 78 69 73    if {[file exis
ea50: 74 73 20 24 70 61 74 68 5d 20 26 26 20 5b 66 69  ts $path] && [fi
ea60: 6c 65 20 69 73 64 69 72 65 63 74 6f 72 79 20 24  le isdirectory $
ea70: 70 61 74 68 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  path]} then {.. 
ea80: 20 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75               tpu
ea90: 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70  ts $channel [app
eaa0: 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
eab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d               "--
eac0: 2d 2d 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20  -- checking for 
ead0: 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
eae0: 74 65 20 72 65 6c 65 61 73 65 20 5c 22 22 20 5c  te release \"" \
eaf0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
eb00: 20 20 20 20 24 70 61 74 68 20 22 5c 22 2e 2e 2e      $path "\"...
eb10: 20 22 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20   "]....         
eb20: 20 20 20 20 20 69 66 20 7b 5b 69 73 52 65 6c 65       if {[isRele
eb30: 61 73 65 41 76 61 69 6c 61 62 6c 65 20 24 70 61  aseAvailable $pa
eb40: 74 68 20 70 6c 61 74 66 6f 72 6d 5d 7d 20 74 68  th platform]} th
eb50: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
eb60: 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e        if {[strin
eb70: 67 20 6c 65 6e 67 74 68 20 24 70 6c 61 74 66 6f  g length $platfo
eb80: 72 6d 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b  rm] == 0} then {
eb90: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
eba0: 20 20 20 20 73 65 74 20 70 6c 61 74 66 6f 72 6d      set platform
ebb0: 20 75 6e 6b 6e 6f 77 6e 0d 0a 20 20 20 20 20 20   unknown..      
ebc0: 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20            }.... 
ebd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
ebe0: 66 20 7b 24 73 65 6c 65 63 74 20 26 26 20 5b 6d  f {$select && [m
ebf0: 61 74 63 68 50 6c 61 74 66 6f 72 6d 20 24 70 6c  atchPlatform $pl
ec00: 61 74 66 6f 72 6d 5d 7d 20 74 68 65 6e 20 7b 0d  atform]} then {.
ec10: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
ec20: 20 20 20 73 65 74 20 3a 3a 62 75 69 6c 64 5f 64     set ::build_d
ec30: 69 72 65 63 74 6f 72 79 20 24 70 61 74 68 0d 0a  irectory $path..
ec40: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
ec50: 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
ec60: 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 22  el [appendArgs "
ec70: 79 65 73 2c 20 73 65 6c 65 63 74 65 64 20 28 22  yes, selected ("
ec80: 20 24 70 6c 61 74 66 6f 72 6d 20 22 29 5c 6e 22   $platform ")\n"
ec90: 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ]....           
eca0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 72         return tr
ecb0: 75 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ue..            
ecc0: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
ecd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ece0: 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b  tputs $channel [
ecf0: 61 70 70 65 6e 64 41 72 67 73 20 22 79 65 73 20  appendArgs "yes 
ed00: 28 22 20 24 70 6c 61 74 66 6f 72 6d 20 22 29 5c  (" $platform ")\
ed10: 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n"]..           
ed20: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
ed30: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
ed40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ed50: 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 6e  tputs $channel n
ed60: 6f 5c 6e 0d 0a 20 20 20 20 20 20 20 20 20 20 20  o\n..           
ed70: 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
ed80: 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d    }..          }
ed90: 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20  ..        }..   
eda0: 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
edb0: 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
edc0: 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
edd0: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22  \..            "
ede0: 2d 2d 2d 2d 20 65 6e 76 69 72 6f 6e 6d 65 6e 74  ---- environment
edf0: 20 76 61 72 69 61 62 6c 65 20 5c 22 53 79 73 74   variable \"Syst
ee00: 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 5c 22  em.Data.SQLite\"
ee10: 20 69 73 20 6e 6f 74 20 22 20 5c 0d 0a 20 20 20   is not " \..   
ee20: 20 20 20 20 20 20 20 20 20 22 73 65 74 2c 20 73           "set, s
ee30: 6b 69 70 70 69 6e 67 20 63 68 65 63 6b 20 66 6f  kipping check fo
ee40: 72 20 72 65 6c 65 61 73 65 73 2e 2e 2e 5c 6e 22  r releases...\n"
ee50: 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  ]..      }....  
ee60: 20 20 20 20 72 65 74 75 72 6e 20 66 61 6c 73 65      return false
ee70: 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
ee80: 70 72 6f 63 20 63 68 65 63 6b 46 6f 72 53 51 4c  proc checkForSQL
ee90: 69 74 65 4c 69 62 72 61 72 79 20 7b 20 63 68 61  iteLibrary { cha
eea0: 6e 6e 65 6c 20 7d 20 7b 0d 0a 20 20 20 20 20 20  nnel } {..      
eeb0: 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 22  tputs $channel "
eec0: 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e 67 20 66 6f  ---- checking fo
eed0: 72 20 53 51 4c 69 74 65 20 63 6f 72 65 20 6c 69  r SQLite core li
eee0: 62 72 61 72 79 2e 2e 2e 20 22 0d 0a 0d 0a 20 20  brary... "....  
eef0: 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b      if {[catch {
ef00: 0d 0a 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74  ..        object
ef10: 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b   invoke -flags +
ef20: 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20  NonPublic \..   
ef30: 20 20 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e           System.
ef40: 44 61 74 61 2e 53 51 4c 69 74 65 2e 53 51 4c 69  Data.SQLite.SQLi
ef50: 74 65 33 20 53 51 4c 69 74 65 56 65 72 73 69 6f  te3 SQLiteVersio
ef60: 6e 0d 0a 20 20 20 20 20 20 7d 20 76 65 72 73 69  n..      } versi
ef70: 6f 6e 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b  on] == 0} then {
ef80: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
ef90: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68 65       # NOTE: Che
efa0: 63 6b 20 69 66 20 74 68 65 20 72 65 74 75 72 6e  ck if the return
efb0: 65 64 20 76 65 72 73 69 6f 6e 20 77 61 73 20 6e  ed version was n
efc0: 75 6c 6c 2e 20 20 49 66 20 73 6f 2c 20 6d 61 6b  ull.  If so, mak
efd0: 65 20 69 74 20 65 61 73 79 0d 0a 20 20 20 20 20  e it easy..     
efe0: 20 20 20 23 20 20 20 20 20 20 20 74 6f 20 73 70     #       to sp
eff0: 6f 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  ot...        #..
f000: 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72          if {[str
f010: 69 6e 67 20 6c 65 6e 67 74 68 20 24 76 65 72 73  ing length $vers
f020: 69 6f 6e 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20  ion] == 0} then 
f030: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74  {..          set
f040: 20 76 65 72 73 69 6f 6e 20 6e 75 6c 6c 0d 0a 20   version null.. 
f050: 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
f060: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
f070: 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74 20 74   NOTE: Attempt t
f080: 6f 20 71 75 65 72 79 20 74 68 65 20 46 6f 73 73  o query the Foss
f090: 69 6c 20 73 6f 75 72 63 65 20 69 64 65 6e 74 69  il source identi
f0a0: 66 69 65 72 20 66 6f 72 20 74 68 65 20 53 51 4c  fier for the SQL
f0b0: 69 74 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20  ite..        #  
f0c0: 20 20 20 20 20 63 6f 72 65 20 6c 69 62 72 61 72       core librar
f0d0: 79 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  y...        #.. 
f0e0: 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63         if {[catc
f0f0: 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 6f  h {..          o
f100: 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c  bject invoke -fl
f110: 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c  ags +NonPublic \
f120: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
f130: 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
f140: 74 65 2e 53 51 4c 69 74 65 33 20 53 51 4c 69 74  te.SQLite3 SQLit
f150: 65 53 6f 75 72 63 65 49 64 0d 0a 20 20 20 20 20  eSourceId..     
f160: 20 20 20 7d 20 73 6f 75 72 63 65 49 64 5d 7d 20     } sourceId]} 
f170: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
f180: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23    #..          #
f190: 20 4e 4f 54 45 3a 20 57 65 20 66 61 69 6c 65 64   NOTE: We failed
f1a0: 20 74 6f 20 71 75 65 72 79 20 74 68 65 20 46 6f   to query the Fo
f1b0: 73 73 69 6c 20 73 6f 75 72 63 65 20 69 64 65 6e  ssil source iden
f1c0: 74 69 66 69 65 72 2e 0d 0a 20 20 20 20 20 20 20  tifier...       
f1d0: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
f1e0: 73 65 74 20 73 6f 75 72 63 65 49 64 20 75 6e 6b  set sourceId unk
f1f0: 6e 6f 77 6e 0d 0a 20 20 20 20 20 20 20 20 7d 0d  nown..        }.
f200: 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
f210: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68        # NOTE: Ch
f220: 65 63 6b 20 69 66 20 74 68 65 20 72 65 74 75 72  eck if the retur
f230: 6e 65 64 20 46 6f 73 73 69 6c 20 73 6f 75 72 63  ned Fossil sourc
f240: 65 20 69 64 65 6e 74 69 66 69 65 72 20 77 61 73  e identifier was
f250: 20 6e 75 6c 6c 2e 20 20 49 66 0d 0a 20 20 20 20   null.  If..    
f260: 20 20 20 20 23 20 20 20 20 20 20 20 73 6f 2c 20      #       so, 
f270: 6d 61 6b 65 20 69 74 20 65 61 73 79 20 74 6f 20  make it easy to 
f280: 73 70 6f 74 2e 0d 0a 20 20 20 20 20 20 20 20 23  spot...        #
f290: 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73  ..        if {[s
f2a0: 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 73 6f  tring length $so
f2b0: 75 72 63 65 49 64 5d 20 3d 3d 20 30 7d 20 74 68  urceId] == 0} th
f2c0: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
f2d0: 73 65 74 20 73 6f 75 72 63 65 49 64 20 6e 75 6c  set sourceId nul
f2e0: 6c 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  l..        }....
f2f0: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
f300: 20 20 20 23 20 4e 4f 54 45 3a 20 59 65 73 2c 20     # NOTE: Yes, 
f310: 74 68 65 20 53 51 4c 69 74 65 20 63 6f 72 65 20  the SQLite core 
f320: 6c 69 62 72 61 72 79 20 61 70 70 65 61 72 73 20  library appears 
f330: 74 6f 20 62 65 20 61 76 61 69 6c 61 62 6c 65 2e  to be available.
f340: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
f350: 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69       addConstrai
f360: 6e 74 20 53 51 4c 69 74 65 0d 0a 0d 0a 20 20 20  nt SQLite....   
f370: 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
f380: 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
f390: 22 79 65 73 20 28 22 20 24 76 65 72 73 69 6f 6e  "yes (" $version
f3a0: 20 22 20 22 20 24 73 6f 75 72 63 65 49 64 20 22   " " $sourceId "
f3b0: 29 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 7d 20 65  )\n"]..      } e
f3c0: 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 74  lse {..        t
f3d0: 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 6e 6f  puts $channel no
f3e0: 5c 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20  \n..      }..   
f3f0: 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
f400: 63 68 65 63 6b 46 6f 72 53 51 4c 69 74 65 49 6e  checkForSQLiteIn
f410: 74 65 72 6f 70 20 7b 20 63 68 61 6e 6e 65 6c 20  terop { channel 
f420: 7d 20 7b 0d 0a 20 20 20 20 20 20 74 70 75 74 73  } {..      tputs
f430: 20 24 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20   $channel "---- 
f440: 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 53 51 4c  checking for SQL
f450: 69 74 65 20 69 6e 74 65 72 6f 70 20 61 73 73 65  ite interop asse
f460: 6d 62 6c 79 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20  mbly... "....   
f470: 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d     if {[catch {.
f480: 0a 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20  .        object 
f490: 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e  invoke -flags +N
f4a0: 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20  onPublic \..    
f4b0: 20 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44          System.D
f4c0: 61 74 61 2e 53 51 4c 69 74 65 2e 53 51 4c 69 74  ata.SQLite.SQLit
f4d0: 65 33 20 49 6e 74 65 72 6f 70 56 65 72 73 69 6f  e3 InteropVersio
f4e0: 6e 0d 0a 20 20 20 20 20 20 7d 20 76 65 72 73 69  n..      } versi
f4f0: 6f 6e 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b  on] == 0} then {
f500: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
f510: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68 65       # NOTE: Che
f520: 63 6b 20 69 66 20 74 68 65 20 72 65 74 75 72 6e  ck if the return
f530: 65 64 20 76 65 72 73 69 6f 6e 20 77 61 73 20 6e  ed version was n
f540: 75 6c 6c 2e 20 20 49 66 20 73 6f 2c 20 6d 61 6b  ull.  If so, mak
f550: 65 20 69 74 20 65 61 73 79 0d 0a 20 20 20 20 20  e it easy..     
f560: 20 20 20 23 20 20 20 20 20 20 20 74 6f 20 73 70     #       to sp
f570: 6f 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  ot...        #..
f580: 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72          if {[str
f590: 69 6e 67 20 6c 65 6e 67 74 68 20 24 76 65 72 73  ing length $vers
f5a0: 69 6f 6e 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20  ion] == 0} then 
f5b0: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74  {..          set
f5c0: 20 76 65 72 73 69 6f 6e 20 6e 75 6c 6c 0d 0a 20   version null.. 
f5d0: 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
f5e0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
f5f0: 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74 20 74   NOTE: Attempt t
f600: 6f 20 71 75 65 72 79 20 74 68 65 20 46 6f 73 73  o query the Foss
f610: 69 6c 20 73 6f 75 72 63 65 20 69 64 65 6e 74 69  il source identi
f620: 66 69 65 72 20 66 6f 72 20 74 68 65 20 53 51 4c  fier for the SQL
f630: 69 74 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20  ite..        #  
f640: 20 20 20 20 20 63 6f 72 65 20 6c 69 62 72 61 72       core librar
f650: 79 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  y...        #.. 
f660: 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63         if {[catc
f670: 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 6f  h {..          o
f680: 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c  bject invoke -fl
f690: 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c  ags +NonPublic \
f6a0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
f6b0: 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
f6c0: 74 65 2e 53 51 4c 69 74 65 33 20 49 6e 74 65 72  te.SQLite3 Inter
f6d0: 6f 70 53 6f 75 72 63 65 49 64 0d 0a 20 20 20 20  opSourceId..    
f6e0: 20 20 20 20 7d 20 73 6f 75 72 63 65 49 64 5d 7d      } sourceId]}
f6f0: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
f700: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
f710: 23 20 4e 4f 54 45 3a 20 57 65 20 66 61 69 6c 65  # NOTE: We faile
f720: 64 20 74 6f 20 71 75 65 72 79 20 74 68 65 20 46  d to query the F
f730: 6f 73 73 69 6c 20 73 6f 75 72 63 65 20 69 64 65  ossil source ide
f740: 6e 74 69 66 69 65 72 2e 0d 0a 20 20 20 20 20 20  ntifier...      
f750: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
f760: 20 73 65 74 20 73 6f 75 72 63 65 49 64 20 75 6e   set sourceId un
f770: 6b 6e 6f 77 6e 0d 0a 20 20 20 20 20 20 20 20 7d  known..        }
f780: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  ....        #.. 
f790: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43         # NOTE: C
f7a0: 68 65 63 6b 20 69 66 20 74 68 65 20 72 65 74 75  heck if the retu
f7b0: 72 6e 65 64 20 46 6f 73 73 69 6c 20 73 6f 75 72  rned Fossil sour
f7c0: 63 65 20 69 64 65 6e 74 69 66 69 65 72 20 77 61  ce identifier wa
f7d0: 73 20 6e 75 6c 6c 2e 20 20 49 66 0d 0a 20 20 20  s null.  If..   
f7e0: 20 20 20 20 20 23 20 20 20 20 20 20 20 73 6f 2c       #       so,
f7f0: 20 6d 61 6b 65 20 69 74 20 65 61 73 79 20 74 6f   make it easy to
f800: 20 73 70 6f 74 2e 0d 0a 20 20 20 20 20 20 20 20   spot...        
f810: 23 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b  #..        if {[
f820: 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 73  string length $s
f830: 6f 75 72 63 65 49 64 5d 20 3d 3d 20 30 7d 20 74  ourceId] == 0} t
f840: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
f850: 20 73 65 74 20 73 6f 75 72 63 65 49 64 20 6e 75   set sourceId nu
f860: 6c 6c 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d  ll..        }...
f870: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
f880: 20 20 20 20 23 20 4e 4f 54 45 3a 20 42 65 66 6f      # NOTE: Befo
f890: 72 65 20 61 63 74 75 61 6c 6c 79 20 61 64 64 69  re actually addi
f8a0: 6e 67 20 74 68 65 20 74 65 73 74 20 63 6f 6e 73  ng the test cons
f8b0: 74 72 61 69 6e 74 2c 20 6d 61 6b 65 20 73 75 72  traint, make sur
f8c0: 65 20 74 68 65 0d 0a 20 20 20 20 20 20 20 20 23  e the..        #
f8d0: 20 20 20 20 20 20 20 76 65 72 73 69 6f 6e 20 69         version i
f8e0: 73 20 76 61 6c 69 64 20 28 69 2e 65 2e 20 6e 6f  s valid (i.e. no
f8f0: 74 20 6a 75 73 74 20 74 68 61 74 20 77 65 20 63  t just that we c
f900: 6f 75 6c 64 20 71 75 65 72 79 20 69 74 29 2e 0d  ould query it)..
f910: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
f920: 20 20 20 20 69 66 20 7b 24 76 65 72 73 69 6f 6e      if {$version
f930: 20 6e 65 20 22 6e 75 6c 6c 22 7d 20 74 68 65 6e   ne "null"} then
f940: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d   {..          #.
f950: 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54  .          # NOT
f960: 45 3a 20 59 65 73 2c 20 74 68 65 20 53 51 4c 69  E: Yes, the SQLi
f970: 74 65 20 69 6e 74 65 72 6f 70 20 61 73 73 65 6d  te interop assem
f980: 62 6c 79 20 61 70 70 65 61 72 73 20 74 6f 20 62  bly appears to b
f990: 65 20 61 76 61 69 6c 61 62 6c 65 2e 0d 0a 20 20  e available...  
f9a0: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
f9b0: 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69       addConstrai
f9c0: 6e 74 20 53 51 4c 69 74 65 49 6e 74 65 72 6f 70  nt SQLiteInterop
f9d0: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65  ....          se
f9e0: 74 20 61 6e 73 77 65 72 20 79 65 73 0d 0a 20 20  t answer yes..  
f9f0: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
fa00: 20 20 20 20 20 20 20 20 20 20 73 65 74 20 61 6e            set an
fa10: 73 77 65 72 20 6e 6f 0d 0a 20 20 20 20 20 20 20  swer no..       
fa20: 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 74 70   }....        tp
fa30: 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70  uts $channel [ap
fa40: 70 65 6e 64 41 72 67 73 20 24 61 6e 73 77 65 72  pendArgs $answer
fa50: 20 22 20 28 22 20 24 76 65 72 73 69 6f 6e 20 22   " (" $version "
fa60: 20 22 20 24 73 6f 75 72 63 65 49 64 20 22 29 5c   " $sourceId ")\
fa70: 6e 22 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73  n"]..      } els
fa80: 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75  e {..        tpu
fa90: 74 73 20 24 63 68 61 6e 6e 65 6c 20 6e 6f 5c 6e  ts $channel no\n
faa0: 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d  ..      }..    }
fab0: 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 63 68  .....    proc ch
fac0: 65 63 6b 46 6f 72 53 51 4c 69 74 65 44 65 66 69  eckForSQLiteDefi
fad0: 6e 65 43 6f 6e 73 74 61 6e 74 20 7b 20 63 68 61  neConstant { cha
fae0: 6e 6e 65 6c 20 6e 61 6d 65 20 7d 20 7b 0d 0a 20  nnel name } {.. 
faf0: 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
fb00: 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
fb10: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 22 2d 2d  \..          "--
fb20: 2d 2d 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20  -- checking for 
fb30: 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
fb40: 74 65 20 64 65 66 69 6e 65 20 63 6f 6e 73 74 61  te define consta
fb50: 6e 74 20 5c 22 22 20 24 6e 61 6d 65 20 5c 0d 0a  nt \"" $name \..
fb60: 20 20 20 20 20 20 20 20 20 20 22 5c 22 2e 2e 2e            "\"...
fb70: 20 22 5d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20   "]....      if 
fb80: 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20  {[catch {..     
fb90: 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65     object invoke
fba0: 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c   -flags +NonPubl
fbb0: 69 63 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  ic \..          
fbc0: 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51    System.Data.SQ
fbd0: 4c 69 74 65 2e 53 51 4c 69 74 65 33 20 44 65 66  Lite.SQLite3 Def
fbe0: 69 6e 65 43 6f 6e 73 74 61 6e 74 73 0d 0a 20 20  ineConstants..  
fbf0: 20 20 20 20 7d 20 64 65 66 69 6e 65 43 6f 6e 73      } defineCons
fc00: 74 61 6e 74 73 5d 20 3d 3d 20 30 7d 20 74 68 65  tants] == 0} the
fc10: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20  n {..        if 
fc20: 7b 5b 6c 73 65 61 72 63 68 20 2d 65 78 61 63 74  {[lsearch -exact
fc30: 20 2d 6e 6f 63 61 73 65 20 24 64 65 66 69 6e 65   -nocase $define
fc40: 43 6f 6e 73 74 61 6e 74 73 20 24 6e 61 6d 65 5d  Constants $name]
fc50: 20 21 3d 20 2d 31 7d 20 74 68 65 6e 20 7b 0d 0a   != -1} then {..
fc60: 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
fc70: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 59         # NOTE: Y
fc80: 65 73 2c 20 74 68 69 73 20 64 65 66 69 6e 65 20  es, this define 
fc90: 63 6f 6e 73 74 61 6e 74 20 77 61 73 20 65 6e 61  constant was ena
fca0: 62 6c 65 64 20 77 68 65 6e 20 74 68 65 20 6d 61  bled when the ma
fcb0: 6e 61 67 65 64 0d 0a 20 20 20 20 20 20 20 20 20  naged..         
fcc0: 20 23 20 20 20 20 20 20 20 61 73 73 65 6d 62 6c   #       assembl
fcd0: 79 20 77 61 73 20 63 6f 6d 70 69 6c 65 64 2e 0d  y was compiled..
fce0: 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
fcf0: 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74          addConst
fd00: 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67  raint [appendArg
fd10: 73 20 5b 67 65 74 53 51 4c 69 74 65 44 65 66 69  s [getSQLiteDefi
fd20: 6e 65 43 6f 6e 73 74 61 6e 74 50 72 65 66 69 78  neConstantPrefix
fd30: 5d 20 24 6e 61 6d 65 5d 0d 0a 0d 0a 20 20 20 20  ] $name]....    
fd40: 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
fd50: 6e 6e 65 6c 20 79 65 73 5c 6e 0d 0a 20 20 20 20  nnel yes\n..    
fd60: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
fd70: 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
fd80: 68 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d 0a 20 20 20  hannel no\n..   
fd90: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 20       }..      } 
fda0: 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
fdb0: 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 65  tputs $channel e
fdc0: 72 72 6f 72 5c 6e 0d 0a 20 20 20 20 20 20 7d 0d  rror\n..      }.
fdd0: 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70  .    }.....    p
fde0: 72 6f 63 20 67 65 74 44 61 74 65 54 69 6d 65 46  roc getDateTimeF
fdf0: 6f 72 6d 61 74 20 7b 7d 20 7b 0d 0a 20 20 20 20  ormat {} {..    
fe00: 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
fe10: 45 3a 20 54 68 69 73 20 70 72 6f 63 65 64 75 72  E: This procedur
fe20: 65 20 73 69 6d 70 6c 79 20 72 65 74 75 72 6e 73  e simply returns
fe30: 20 74 68 65 20 22 64 65 66 61 75 6c 74 22 20 44   the "default" D
fe40: 61 74 65 54 69 6d 65 20 66 6f 72 6d 61 74 20 75  ateTime format u
fe50: 73 65 64 0d 0a 20 20 20 20 20 20 23 20 20 20 20  sed..      #    
fe60: 20 20 20 62 79 20 74 68 65 20 74 65 73 74 20 73     by the test s
fe70: 75 69 74 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  uite...      #..
fe80: 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20        if {[info 
fe90: 65 78 69 73 74 73 20 3a 3a 64 61 74 65 74 69 6d  exists ::datetim
fea0: 65 5f 66 6f 72 6d 61 74 5d 20 26 26 20 5c 0d 0a  e_format] && \..
feb0: 20 20 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e            [strin
fec0: 67 20 6c 65 6e 67 74 68 20 24 3a 3a 64 61 74 65  g length $::date
fed0: 74 69 6d 65 5f 66 6f 72 6d 61 74 5d 20 3e 20 30  time_format] > 0
fee0: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
fef0: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
ff00: 4f 54 45 3a 20 52 65 74 75 72 6e 20 74 68 65 20  OTE: Return the 
ff10: 6d 61 6e 75 61 6c 6c 79 20 6f 76 65 72 72 69 64  manually overrid
ff20: 64 65 6e 20 76 61 6c 75 65 20 66 6f 72 20 74 68  den value for th
ff30: 65 20 44 61 74 65 54 69 6d 65 20 66 6f 72 6d 61  e DateTime forma
ff40: 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  t...        #.. 
ff50: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 3a         return $:
ff60: 3a 64 61 74 65 74 69 6d 65 5f 66 6f 72 6d 61 74  :datetime_format
ff70: 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b  ..      } else {
ff80: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
ff90: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 52 65 74       # NOTE: Ret
ffa0: 75 72 6e 20 61 6e 20 49 53 4f 38 36 30 31 20 44  urn an ISO8601 D
ffb0: 61 74 65 54 69 6d 65 20 66 6f 72 6d 61 74 20 63  ateTime format c
ffc0: 6f 6d 70 61 74 69 62 6c 65 20 77 69 74 68 20 53  ompatible with S
ffd0: 51 4c 69 74 65 2c 0d 0a 20 20 20 20 20 20 20 20  QLite,..        
ffe0: 23 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44  #       System.D
fff0: 61 74 61 2e 53 51 4c 69 74 65 2c 20 61 6e 64 20  ata.SQLite, and 
10000 73 75 69 74 61 62 6c 65 20 66 6f 72 20 72 6f 75  suitable for rou
10010 6e 64 2d 74 72 69 70 70 69 6e 67 20 77 69 74 68  nd-tripping with
10020 20 74 68 65 0d 0a 20 20 20 20 20 20 20 20 23 20   the..        # 
10030 20 20 20 20 20 20 44 61 74 65 54 69 6d 65 20 63        DateTime c
10040 6c 61 73 73 20 6f 66 20 74 68 65 20 66 72 61 6d  lass of the fram
10050 65 77 6f 72 6b 2e 20 20 49 66 20 74 68 69 73 20  ework.  If this 
10060 76 61 6c 75 65 20 69 73 20 63 68 61 6e 67 65 64  value is changed
10070 2c 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  ,..        #    
10080 20 20 20 76 61 72 69 6f 75 73 20 74 65 73 74 73     various tests
10090 20 6d 61 79 20 66 61 69 6c 2e 0d 0a 20 20 20 20   may fail...    
100a0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72      #..        r
100b0 65 74 75 72 6e 20 22 79 79 79 79 2d 4d 4d 2d 64  eturn "yyyy-MM-d
100c0 64 20 48 48 3a 6d 6d 3a 73 73 2e 46 46 46 46 46  d HH:mm:ss.FFFFF
100d0 46 46 4b 22 0d 0a 20 20 20 20 20 20 7d 0d 0a 20  FFK"..      }.. 
100e0 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
100f0 63 20 67 65 74 50 72 6f 70 65 72 74 69 65 73 20  c getProperties 
10100 7b 20 6f 62 6a 65 63 74 20 76 61 72 4e 61 6d 65  { object varName
10110 20 7d 20 7b 0d 0a 20 20 20 20 20 20 75 70 76 61   } {..      upva
10120 72 20 31 20 24 76 61 72 4e 61 6d 65 20 70 72 6f  r 1 $varName pro
10130 70 65 72 74 69 65 73 0d 0a 0d 0a 20 20 20 20 20  perties....     
10140 20 73 65 74 20 63 6f 75 6e 74 20 30 0d 0a 20 20   set count 0..  
10150 20 20 20 20 73 65 74 20 6e 61 6d 65 73 20 5b 6c      set names [l
10160 69 73 74 5d 0d 0a 0d 0a 20 20 20 20 20 20 69 66  ist]....      if
10170 20 7b 5b 69 73 4f 62 6a 65 63 74 48 61 6e 64 6c   {[isObjectHandl
10180 65 20 24 6f 62 6a 65 63 74 5d 20 26 26 20 24 6f  e $object] && $o
10190 62 6a 65 63 74 20 6e 65 20 22 6e 75 6c 6c 22 7d  bject ne "null"}
101a0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
101b0 20 65 76 61 6c 20 6c 61 70 70 65 6e 64 20 6e 61   eval lappend na
101c0 6d 65 73 20 5b 6f 62 6a 65 63 74 20 6d 65 6d 62  mes [object memb
101d0 65 72 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ers \..         
101e0 20 20 20 2d 6d 65 6d 62 65 72 74 79 70 65 73 20     -membertypes 
101f0 50 72 6f 70 65 72 74 79 20 2d 6e 61 6d 65 6f 6e  Property -nameon
10200 6c 79 20 24 6f 62 6a 65 63 74 5d 0d 0a 0d 0a 20  ly $object].... 
10210 20 20 20 20 20 20 20 65 76 61 6c 20 6c 61 70 70         eval lapp
10220 65 6e 64 20 6e 61 6d 65 73 20 5b 6f 62 6a 65 63  end names [objec
10230 74 20 6d 65 6d 62 65 72 73 20 5c 0d 0a 20 20 20  t members \..   
10240 20 20 20 20 20 20 20 20 20 2d 6d 65 6d 62 65 72           -member
10250 74 79 70 65 73 20 46 69 65 6c 64 20 2d 6e 61 6d  types Field -nam
10260 65 6f 6e 6c 79 20 24 6f 62 6a 65 63 74 5d 0d 0a  eonly $object]..
10270 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
10280 20 66 6f 72 65 61 63 68 20 6e 61 6d 65 20 24 6e   foreach name $n
10290 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20 20 20  ames {..        
102a0 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20  if {[catch {..  
102b0 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69          object i
102c0 6e 76 6f 6b 65 20 2d 6f 62 6a 65 63 74 66 6c 61  nvoke -objectfla
102d0 67 73 20 2b 4e 6f 44 69 73 70 6f 73 65 20 24 6f  gs +NoDispose $o
102e0 62 6a 65 63 74 20 24 6e 61 6d 65 0d 0a 20 20 20  bject $name..   
102f0 20 20 20 20 20 7d 20 76 61 6c 75 65 5d 20 3d 3d       } value] ==
10300 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
10310 20 20 20 20 20 20 69 66 20 7b 5b 69 73 4f 62 6a        if {[isObj
10320 65 63 74 48 61 6e 64 6c 65 20 24 76 61 6c 75 65  ectHandle $value
10330 5d 20 26 26 20 24 76 61 6c 75 65 20 6e 65 20 22  ] && $value ne "
10340 6e 75 6c 6c 22 7d 20 74 68 65 6e 20 7b 0d 0a 20  null"} then {.. 
10350 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20 65             set e
10360 72 72 6f 72 20 6e 75 6c 6c 3b 20 6f 62 6a 65 63  rror null; objec
10370 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20  t invoke -flags 
10380 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20  +NonPublic \..  
10390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 6d                -m
103a0 61 72 73 68 61 6c 66 6c 61 67 73 20 2b 4e 6f 48  arshalflags +NoH
103b0 61 6e 64 6c 65 20 49 6e 74 65 72 70 72 65 74 65  andle Interprete
103c0 72 2e 47 65 74 41 63 74 69 76 65 20 5c 0d 0a 20  r.GetActive \.. 
103d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 41                 A
103e0 64 64 4f 62 6a 65 63 74 52 65 66 65 72 65 6e 63  ddObjectReferenc
103f0 65 20 4f 6b 20 24 76 61 6c 75 65 20 65 72 72 6f  e Ok $value erro
10400 72 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  r....           
10410 20 6c 61 70 70 65 6e 64 20 70 72 6f 70 65 72 74   lappend propert
10420 69 65 73 28 6f 62 6a 65 63 74 73 29 20 5b 6c 69  ies(objects) [li
10430 73 74 20 24 6e 61 6d 65 20 24 76 61 6c 75 65 5d  st $name $value]
10440 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c  ..          } el
10450 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  se {..          
10460 20 20 6c 61 70 70 65 6e 64 20 70 72 6f 70 65 72    lappend proper
10470 74 69 65 73 28 76 61 6c 75 65 73 29 20 5b 6c 69  ties(values) [li
10480 73 74 20 24 6e 61 6d 65 20 24 76 61 6c 75 65 5d  st $name $value]
10490 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d  ..          }...
104a0 0a 20 20 20 20 20 20 20 20 20 20 69 6e 63 72 20  .          incr 
104b0 63 6f 75 6e 74 0d 0a 20 20 20 20 20 20 20 20 7d  count..        }
104c0 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
104d0 20 20 20 6c 61 70 70 65 6e 64 20 70 72 6f 70 65     lappend prope
104e0 72 74 69 65 73 28 65 72 72 6f 72 73 29 20 5b 6c  rties(errors) [l
104f0 69 73 74 20 24 6e 61 6d 65 20 24 3a 3a 65 72 72  ist $name $::err
10500 6f 72 43 6f 64 65 5d 0d 0a 20 20 20 20 20 20 20  orCode]..       
10510 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20   }..      }.... 
10520 20 20 20 20 20 72 65 74 75 72 6e 20 24 63 6f 75       return $cou
10530 6e 74 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20  nt..    }.....  
10540 20 20 70 72 6f 63 20 67 65 74 41 6c 6c 50 72 6f    proc getAllPro
10550 70 65 72 74 69 65 73 20 7b 20 6f 62 6a 65 63 74  perties { object
10560 20 76 61 72 4e 61 6d 65 20 7d 20 7b 0d 0a 20 20   varName } {..  
10570 20 20 20 20 75 70 76 61 72 20 31 20 24 76 61 72      upvar 1 $var
10580 4e 61 6d 65 20 70 72 6f 70 65 72 74 69 65 73 0d  Name properties.
10590 0a 20 20 20 20 20 20 73 65 74 20 76 61 6c 75 65  .      set value
105a0 20 24 6f 62 6a 65 63 74 0d 0a 0d 0a 20 20 20 20   $object....    
105b0 20 20 77 68 69 6c 65 20 7b 74 72 75 65 7d 20 7b    while {true} {
105c0 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b  ..        if {![
105d0 69 6e 66 6f 20 65 78 69 73 74 73 20 70 72 6f 70  info exists prop
105e0 65 72 74 69 65 73 28 73 65 65 6e 4f 62 6a 65 63  erties(seenObjec
105f0 74 73 29 5d 20 7c 7c 20 5c 0d 0a 20 20 20 20 20  ts)] || \..     
10600 20 20 20 20 20 20 20 24 76 61 6c 75 65 20 6e 69         $value ni
10610 20 24 70 72 6f 70 65 72 74 69 65 73 28 73 65 65   $properties(see
10620 6e 4f 62 6a 65 63 74 73 29 7d 20 74 68 65 6e 20  nObjects)} then 
10630 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 67 65 74  {..          get
10640 50 72 6f 70 65 72 74 69 65 73 20 24 76 61 6c 75  Properties $valu
10650 65 20 70 72 6f 70 65 72 74 69 65 73 0d 0a 20 20  e properties..  
10660 20 20 20 20 20 20 20 20 6c 61 70 70 65 6e 64 20          lappend 
10670 70 72 6f 70 65 72 74 69 65 73 28 73 65 65 6e 4f  properties(seenO
10680 62 6a 65 63 74 73 29 20 24 76 61 6c 75 65 0d 0a  bjects) $value..
10690 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
106a0 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20       if {![info 
106b0 65 78 69 73 74 73 20 70 72 6f 70 65 72 74 69 65  exists propertie
106c0 73 28 6f 62 6a 65 63 74 73 29 5d 7d 20 74 68 65  s(objects)]} the
106d0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 62  n {..          b
106e0 72 65 61 6b 0d 0a 20 20 20 20 20 20 20 20 7d 0d  reak..        }.
106f0 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b  ...        if {[
10700 6c 6c 65 6e 67 74 68 20 24 70 72 6f 70 65 72 74  llength $propert
10710 69 65 73 28 6f 62 6a 65 63 74 73 29 5d 20 3d 3d  ies(objects)] ==
10720 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
10730 20 20 20 20 20 20 75 6e 73 65 74 20 70 72 6f 70        unset prop
10740 65 72 74 69 65 73 28 6f 62 6a 65 63 74 73 29 3b  erties(objects);
10750 20 62 72 65 61 6b 0d 0a 20 20 20 20 20 20 20 20   break..        
10760 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 73 65 74  }....        set
10770 20 76 61 6c 75 65 20 5b 6c 69 6e 64 65 78 20 5b   value [lindex [
10780 6c 69 6e 64 65 78 20 24 70 72 6f 70 65 72 74 69  lindex $properti
10790 65 73 28 6f 62 6a 65 63 74 73 29 20 30 5d 20 65  es(objects) 0] e
107a0 6e 64 5d 0d 0a 20 20 20 20 20 20 20 20 73 65 74  nd]..        set
107b0 20 70 72 6f 70 65 72 74 69 65 73 28 6f 62 6a 65   properties(obje
107c0 63 74 73 29 20 5b 6c 72 61 6e 67 65 20 24 70 72  cts) [lrange $pr
107d0 6f 70 65 72 74 69 65 73 28 6f 62 6a 65 63 74 73  operties(objects
107e0 29 20 31 20 65 6e 64 5d 0d 0a 20 20 20 20 20 20  ) 1 end]..      
107f0 7d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b  }....      if {[
10800 69 6e 66 6f 20 65 78 69 73 74 73 20 70 72 6f 70  info exists prop
10810 65 72 74 69 65 73 28 73 65 65 6e 4f 62 6a 65 63  erties(seenObjec
10820 74 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ts)]} then {..  
10830 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 76 61        foreach va
10840 6c 75 65 20 24 70 72 6f 70 65 72 74 69 65 73 28  lue $properties(
10850 73 65 65 6e 4f 62 6a 65 63 74 73 29 20 7b 0d 0a  seenObjects) {..
10860 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 24 76            if {$v
10870 61 6c 75 65 20 65 71 20 24 6f 62 6a 65 63 74 7d  alue eq $object}
10880 20 63 6f 6e 74 69 6e 75 65 0d 0a 20 20 20 20 20   continue..     
10890 20 20 20 20 20 63 61 74 63 68 20 7b 6f 62 6a 65       catch {obje
108a0 63 74 20 64 69 73 70 6f 73 65 20 24 76 61 6c 75  ct dispose $valu
108b0 65 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d  e}..        }...
108c0 0a 20 20 20 20 20 20 20 20 75 6e 73 65 74 20 70  .        unset p
108d0 72 6f 70 65 72 74 69 65 73 28 73 65 65 6e 4f 62  roperties(seenOb
108e0 6a 65 63 74 73 29 0d 0a 20 20 20 20 20 20 7d 0d  jects)..      }.
108f0 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70  .    }.....    p
10900 72 6f 63 20 67 65 74 56 61 72 69 61 62 6c 65 73  roc getVariables
10910 20 7b 20 76 61 72 4e 61 6d 65 73 20 7b 6f 62 6a   { varNames {obj
10920 65 63 74 73 20 66 61 6c 73 65 7d 20 7d 20 7b 0d  ects false} } {.
10930 0a 20 20 20 20 20 20 73 65 74 20 72 65 73 75 6c  .      set resul
10940 74 20 5b 6c 69 73 74 5d 0d 0a 0d 0a 20 20 20 20  t [list]....    
10950 20 20 66 6f 72 65 61 63 68 20 76 61 72 4e 61 6d    foreach varNam
10960 65 20 24 76 61 72 4e 61 6d 65 73 20 7b 0d 0a 20  e $varNames {.. 
10970 20 20 20 20 20 20 20 69 66 20 7b 5b 75 70 6c 65         if {[uple
10980 76 65 6c 20 31 20 5b 6c 69 73 74 20 61 72 72 61  vel 1 [list arra
10990 79 20 65 78 69 73 74 73 20 24 76 61 72 4e 61 6d  y exists $varNam
109a0 65 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  e]]} then {..   
109b0 20 20 20 20 20 20 20 73 65 74 20 61 72 72 61 79         set array
109c0 4e 61 6d 65 20 24 76 61 72 4e 61 6d 65 0d 0a 0d  Name $varName...
109d0 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 65 61  .          forea
109e0 63 68 20 65 6c 65 6d 65 6e 74 4e 61 6d 65 20 5b  ch elementName [
109f0 75 70 6c 65 76 65 6c 20 31 20 5b 6c 69 73 74 20  uplevel 1 [list 
10a00 61 72 72 61 79 20 6e 61 6d 65 73 20 24 61 72 72  array names $arr
10a10 61 79 4e 61 6d 65 5d 5d 20 7b 0d 0a 20 20 20 20  ayName]] {..    
10a20 20 20 20 20 20 20 20 20 73 65 74 20 6e 61 6d 65          set name
10a30 20 5b 61 70 70 65 6e 64 41 72 67 73 20 24 61 72   [appendArgs $ar
10a40 72 61 79 4e 61 6d 65 20 28 20 24 65 6c 65 6d 65  rayName ( $eleme
10a50 6e 74 4e 61 6d 65 20 29 5d 0d 0a 20 20 20 20 20  ntName )]..     
10a60 20 20 20 20 20 20 20 73 65 74 20 76 61 72 56 61         set varVa
10a70 6c 75 65 20 5b 75 70 6c 65 76 65 6c 20 31 20 5b  lue [uplevel 1 [
10a80 6c 69 73 74 20 73 65 74 20 24 6e 61 6d 65 5d 5d  list set $name]]
10a90 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
10aa0 69 66 20 7b 24 6f 62 6a 65 63 74 73 20 26 26 20  if {$objects && 
10ab0 5b 69 73 4f 62 6a 65 63 74 48 61 6e 64 6c 65 20  [isObjectHandle 
10ac0 24 76 61 72 56 61 6c 75 65 5d 7d 20 74 68 65 6e  $varValue]} then
10ad0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
10ae0 20 20 75 6e 73 65 74 20 2d 6e 6f 63 6f 6d 70 6c    unset -nocompl
10af0 61 69 6e 20 70 72 6f 70 65 72 74 69 65 73 0d 0a  ain properties..
10b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 67 65                ge
10b10 74 41 6c 6c 50 72 6f 70 65 72 74 69 65 73 20 24  tAllProperties $
10b20 76 61 72 56 61 6c 75 65 20 70 72 6f 70 65 72 74  varValue propert
10b30 69 65 73 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  ies....         
10b40 20 20 20 20 20 6c 61 70 70 65 6e 64 20 72 65 73       lappend res
10b50 75 6c 74 20 5b 6c 69 73 74 20 24 6e 61 6d 65 20  ult [list $name 
10b60 5b 61 72 72 61 79 20 67 65 74 20 70 72 6f 70 65  [array get prope
10b70 72 74 69 65 73 5d 5d 0d 0a 20 20 20 20 20 20 20  rties]]..       
10b80 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
10b90 20 20 20 20 20 20 20 20 20 20 20 20 20 6c 61 70               lap
10ba0 70 65 6e 64 20 72 65 73 75 6c 74 20 5b 6c 69 73  pend result [lis
10bb0 74 20 24 6e 61 6d 65 20 24 76 61 72 56 61 6c 75  t $name $varValu
10bc0 65 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  e]..            
10bd0 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  }..          }..
10be0 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b          } else {
10bf0 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20  ..          set 
10c00 76 61 72 56 61 6c 75 65 20 5b 75 70 6c 65 76 65  varValue [upleve
10c10 6c 20 31 20 5b 6c 69 73 74 20 73 65 74 20 24 76  l 1 [list set $v
10c20 61 72 4e 61 6d 65 5d 5d 0d 0a 0d 0a 20 20 20 20  arName]]....    
10c30 20 20 20 20 20 20 69 66 20 7b 24 6f 62 6a 65 63        if {$objec
10c40 74 73 20 26 26 20 5b 69 73 4f 62 6a 65 63 74 48  ts && [isObjectH
10c50 61 6e 64 6c 65 20 24 76 61 72 56 61 6c 75 65 5d  andle $varValue]
10c60 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
10c70 20 20 20 20 20 20 75 6e 73 65 74 20 2d 6e 6f 63        unset -noc
10c80 6f 6d 70 6c 61 69 6e 20 70 72 6f 70 65 72 74 69  omplain properti
10c90 65 73 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  es..            
10ca0 67 65 74 41 6c 6c 50 72 6f 70 65 72 74 69 65 73  getAllProperties
10cb0 20 24 76 61 72 56 61 6c 75 65 20 70 72 6f 70 65   $varValue prope
10cc0 72 74 69 65 73 0d 0a 0d 0a 20 20 20 20 20 20 20  rties....       
10cd0 20 20 20 20 20 6c 61 70 70 65 6e 64 20 72 65 73       lappend res
10ce0 75 6c 74 20 5b 6c 69 73 74 20 24 76 61 72 4e 61  ult [list $varNa
10cf0 6d 65 20 5b 61 72 72 61 79 20 67 65 74 20 70 72  me [array get pr
10d00 6f 70 65 72 74 69 65 73 5d 5d 0d 0a 20 20 20 20  operties]]..    
10d10 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
10d20 20 20 20 20 20 20 20 20 20 20 20 20 6c 61 70 70              lapp
10d30 65 6e 64 20 72 65 73 75 6c 74 20 5b 6c 69 73 74  end result [list
10d40 20 24 76 61 72 4e 61 6d 65 20 24 76 61 72 56 61   $varName $varVa
10d50 6c 75 65 5d 0d 0a 20 20 20 20 20 20 20 20 20 20  lue]..          
10d60 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  }..        }..  
10d70 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 72      }....      r
10d80 65 74 75 72 6e 20 24 72 65 73 75 6c 74 0d 0a 20  eturn $result.. 
10d90 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
10da0 63 20 65 6e 75 6d 65 72 61 62 6c 65 54 6f 4c 69  c enumerableToLi
10db0 73 74 20 7b 20 65 6e 75 6d 65 72 61 62 6c 65 20  st { enumerable 
10dc0 7d 20 7b 0d 0a 20 20 20 20 20 20 73 65 74 20 72  } {..      set r
10dd0 65 73 75 6c 74 20 5b 6c 69 73 74 5d 0d 0a 0d 0a  esult [list]....
10de0 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e        if {[strin
10df0 67 20 6c 65 6e 67 74 68 20 24 65 6e 75 6d 65 72  g length $enumer
10e00 61 62 6c 65 5d 20 3d 3d 20 30 20 7c 7c 20 24 65  able] == 0 || $e
10e10 6e 75 6d 65 72 61 62 6c 65 20 65 71 20 22 6e 75  numerable eq "nu
10e20 6c 6c 22 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  ll"} then {..   
10e30 20 20 20 20 20 72 65 74 75 72 6e 20 24 72 65 73       return $res
10e40 75 6c 74 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a  ult..      }....
10e50 20 20 20 20 20 20 6f 62 6a 65 63 74 20 66 6f 72        object for
10e60 65 61 63 68 20 2d 61 6c 69 61 73 20 69 74 65 6d  each -alias item
10e70 20 24 65 6e 75 6d 65 72 61 62 6c 65 20 7b 0d 0a   $enumerable {..
10e80 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72          if {[str
10e90 69 6e 67 20 6c 65 6e 67 74 68 20 24 69 74 65 6d  ing length $item
10ea0 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20  ] > 0} then {.. 
10eb0 20 20 20 20 20 20 20 20 20 6c 61 70 70 65 6e 64           lappend
10ec0 20 72 65 73 75 6c 74 20 5b 24 69 74 65 6d 20 54   result [$item T
10ed0 6f 53 74 72 69 6e 67 5d 0d 0a 20 20 20 20 20 20  oString]..      
10ee0 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a    }..      }....
10ef0 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 72 65        return $re
10f00 73 75 6c 74 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a  sult..    }.....
10f10 20 20 20 20 70 72 6f 63 20 63 61 74 63 68 41 6e      proc catchAn
10f20 64 52 65 74 75 72 6e 20 7b 20 73 63 72 69 70 74  dReturn { script
10f30 20 7b 73 74 61 63 6b 54 72 61 63 65 20 66 61 6c   {stackTrace fal
10f40 73 65 7d 20 7b 73 74 72 69 63 74 20 74 72 75 65  se} {strict true
10f50 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a  } } {..      #..
10f60 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 45 76        # NOTE: Ev
10f70 61 6c 75 61 74 65 20 74 68 65 20 73 63 72 69 70  aluate the scrip
10f80 74 20 70 72 6f 76 69 64 65 64 20 62 79 20 6f 75  t provided by ou
10f90 72 20 63 61 6c 6c 65 72 20 69 6e 20 74 68 65 69  r caller in thei
10fa0 72 20 63 6f 6e 74 65 78 74 2c 0d 0a 20 20 20 20  r context,..    
10fb0 20 20 23 20 20 20 20 20 20 20 63 61 70 74 75 72    #       captur
10fc0 69 6e 67 20 62 6f 74 68 20 74 68 65 20 72 65 73  ing both the res
10fd0 75 6c 74 20 61 6e 64 20 74 68 65 20 72 65 74 75  ult and the retu
10fe0 72 6e 20 63 6f 64 65 2e 0d 0a 20 20 20 20 20 20  rn code...      
10ff0 23 0d 0a 20 20 20 20 20 20 73 65 74 20 63 6f 64  #..      set cod
11000 65 20 5b 63 61 74 63 68 20 7b 75 70 6c 65 76 65  e [catch {upleve
11010 6c 20 31 20 24 73 63 72 69 70 74 7d 20 72 65 73  l 1 $script} res
11020 75 6c 74 5d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d  ult]....      #.
11030 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 44  .      # NOTE: D
11040 69 64 20 74 68 65 20 73 63 72 69 70 74 20 70 72  id the script pr
11050 6f 76 69 64 65 64 20 62 79 20 6f 75 72 20 63 61  ovided by our ca
11060 6c 6c 65 72 20 4e 4f 54 20 72 61 69 73 65 20 61  ller NOT raise a
11070 6e 20 65 72 72 6f 72 3f 0d 0a 20 20 20 20 20 20  n error?..      
11080 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 24 73 74  #..      if {$st
11090 72 69 63 74 20 26 26 20 24 63 6f 64 65 20 3d 3d  rict && $code ==
110a0 20 30 20 7c 7c 20 21 24 73 74 72 69 63 74 20 26   0 || !$strict &
110b0 26 20 24 63 6f 64 65 20 21 3d 20 31 7d 20 74 68  & $code != 1} th
110c0 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d  en {..        #.
110d0 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
110e0 20 53 75 63 63 65 73 73 2e 20 20 52 65 74 75 72   Success.  Retur
110f0 6e 20 61 20 6c 69 73 74 20 77 69 74 68 20 74 68  n a list with th
11100 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20 61 6e  e return code an
11110 64 20 74 68 65 20 72 65 73 75 6c 74 2e 0d 0a 20  d the result... 
11120 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
11130 20 20 72 65 74 75 72 6e 20 5b 6c 69 73 74 20 24    return [list $
11140 63 6f 64 65 20 24 72 65 73 75 6c 74 5d 0d 0a 20  code $result].. 
11150 20 20 20 20 20 7d 20 65 6c 73 65 69 66 20 7b 24       } elseif {$
11160 73 74 61 63 6b 54 72 61 63 65 7d 20 74 68 65 6e  stackTrace} then
11170 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20   {..        #.. 
11180 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 46         # NOTE: F
11190 61 69 6c 75 72 65 2e 20 20 4f 75 72 20 63 61 6c  ailure.  Our cal
111a0 6c 65 72 20 77 61 6e 74 73 20 61 20 66 75 6c 6c  ler wants a full
111b0 20 73 74 61 63 6b 20 74 72 61 63 65 20 28 69 66   stack trace (if
111c0 20 61 70 70 6c 69 63 61 62 6c 65 29 2c 0d 0a 20   applicable),.. 
111d0 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 72         #       r
111e0 65 74 75 72 6e 20 61 20 6c 69 73 74 20 77 69 74  eturn a list wit
111f0 68 20 74 68 65 20 72 65 74 75 72 6e 20 63 6f 64  h the return cod
11200 65 20 61 6e 64 20 74 68 65 20 72 65 73 75 6c 74  e and the result
11210 20 76 65 72 62 61 74 69 6d 2e 0d 0a 20 20 20 20   verbatim...    
11220 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72      #..        r
11230 65 74 75 72 6e 20 5b 6c 69 73 74 20 24 63 6f 64  eturn [list $cod
11240 65 20 24 72 65 73 75 6c 74 5d 0d 0a 20 20 20 20  e $result]..    
11250 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
11260 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
11270 20 4e 4f 54 45 3a 20 46 61 69 6c 75 72 65 2e 20   NOTE: Failure. 
11280 20 4f 75 72 20 63 61 6c 6c 65 72 20 64 6f 65 73   Our caller does
11290 20 6e 6f 74 20 77 61 6e 74 20 61 20 66 75 6c 6c   not want a full
112a0 20 73 74 61 63 6b 20 74 72 61 63 65 20 28 69 66   stack trace (if
112b0 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
112c0 20 20 61 70 70 6c 69 63 61 62 6c 65 29 2c 20 72    applicable), r
112d0 65 74 75 72 6e 20 61 20 6c 69 73 74 20 77 69 74  eturn a list wit
112e0 68 20 74 68 65 20 72 65 74 75 72 6e 20 63 6f 64  h the return cod
112f0 65 2c 20 74 68 65 20 65 72 72 6f 72 0d 0a 20 20  e, the error..  
11300 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63 6f        #       co
11310 64 65 20 66 6f 72 20 74 68 65 20 69 6e 74 65 72  de for the inter
11320 70 72 65 74 65 72 2c 20 61 6e 64 20 74 68 65 20  preter, and the 
11330 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 75 70  error message up
11340 20 74 6f 20 74 68 65 0d 0a 20 20 20 20 20 20 20   to the..       
11350 20 23 20 20 20 20 20 20 20 70 6f 69 6e 74 20 77   #       point w
11360 68 65 72 65 20 74 68 65 20 73 74 61 63 6b 20 74  here the stack t
11370 72 61 63 65 20 73 68 6f 75 6c 64 20 73 74 61 72  race should star
11380 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  t...        #.. 
11390 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b 6c         return [l
113a0 69 73 74 20 24 63 6f 64 65 20 24 3a 3a 65 72 72  ist $code $::err
113b0 6f 72 43 6f 64 65 20 5c 0d 0a 20 20 20 20 20 20  orCode \..      
113c0 20 20 20 20 20 20 5b 65 78 74 72 61 63 74 53 79        [extractSy
113d0 73 74 65 6d 44 61 74 61 53 51 4c 69 74 65 45 78  stemDataSQLiteEx
113e0 63 65 70 74 69 6f 6e 4d 65 73 73 61 67 65 20 24  ceptionMessage $
113f0 72 65 73 75 6c 74 5d 5d 0d 0a 20 20 20 20 20 20  result]]..      
11400 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  }..    }.....   
11410 20 70 72 6f 63 20 63 6f 6d 70 69 6c 65 43 53 68   proc compileCSh
11420 61 72 70 57 69 74 68 20 7b 0d 0a 20 20 20 20 20  arpWith {..     
11430 20 20 20 20 20 20 20 74 65 78 74 20 6d 65 6d 6f         text memo
11440 72 79 20 73 79 6d 62 6f 6c 73 20 73 74 72 69 63  ry symbols stric
11450 74 20 72 65 73 75 6c 74 73 56 61 72 4e 61 6d 65  t resultsVarName
11460 20 65 72 72 6f 72 73 56 61 72 4e 61 6d 65 20 66   errorsVarName f
11470 69 6c 65 4e 61 6d 65 73 0d 0a 20 20 20 20 20 20  ileNames..      
11480 20 20 20 20 20 20 61 72 67 73 20 7d 20 7b 0d 0a        args } {..
11490 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
114a0 20 4e 4f 54 45 3a 20 53 69 6e 63 65 20 77 65 20   NOTE: Since we 
114b0 61 72 65 20 67 6f 69 6e 67 20 74 6f 20 75 73 65  are going to use
114c0 20 74 68 69 73 20 6d 65 74 68 6f 64 20 6e 61 6d   this method nam
114d0 65 20 61 20 6c 6f 74 2c 20 61 73 73 69 67 6e 20  e a lot, assign 
114e0 69 74 20 74 6f 20 61 0d 0a 20 20 20 20 20 20 23  it to a..      #
114f0 20 20 20 20 20 20 20 76 61 72 69 61 62 6c 65 20         variable 
11500 66 69 72 73 74 2e 0d 0a 20 20 20 20 20 20 23 0d  first...      #.
11510 0a 20 20 20 20 20 20 73 65 74 20 61 64 64 20 52  .      set add R
11520 65 66 65 72 65 6e 63 65 64 41 73 73 65 6d 62 6c  eferencedAssembl
11530 69 65 73 2e 41 64 64 0d 0a 0d 0a 20 20 20 20 20  ies.Add....     
11540 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
11550 3a 20 43 72 65 61 74 65 20 74 68 65 20 62 61 73  : Create the bas
11560 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 76 61  e command to eva
11570 6c 75 61 74 65 20 61 6e 64 20 61 64 64 20 74 68  luate and add th
11580 65 20 70 72 6f 70 65 72 74 79 20 73 65 74 74 69  e property setti
11590 6e 67 73 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ngs..      #    
115a0 20 20 20 74 68 61 74 20 61 72 65 20 61 6c 6d 6f     that are almo
115b0 73 74 20 61 6c 77 61 79 73 20 6e 65 65 64 65 64  st always needed
115c0 20 62 79 20 6f 75 72 20 75 6e 69 74 20 74 65 73   by our unit tes
115d0 74 73 20 28 69 2e 65 2e 20 74 68 65 20 53 79 73  ts (i.e. the Sys
115e0 74 65 6d 0d 0a 20 20 20 20 20 20 23 20 20 20 20  tem..      #    
115f0 20 20 20 61 6e 64 20 53 79 73 74 65 6d 2e 44 61     and System.Da
11600 74 61 20 61 73 73 65 6d 62 6c 79 20 72 65 66 65  ta assembly refe
11610 72 65 6e 63 65 73 29 2e 0d 0a 20 20 20 20 20 20  rences)...      
11620 23 0d 0a 20 20 20 20 20 20 73 65 74 20 63 6f 6d  #..      set com
11630 6d 61 6e 64 20 5b 6c 69 73 74 20 5c 0d 0a 20 20  mand [list \..  
11640 20 20 20 20 20 20 20 20 63 6f 6d 70 69 6c 65 43          compileC
11650 53 68 61 72 70 20 24 74 65 78 74 20 24 6d 65 6d  Sharp $text $mem
11660 6f 72 79 20 24 73 79 6d 62 6f 6c 73 20 24 73 74  ory $symbols $st
11670 72 69 63 74 20 72 65 73 75 6c 74 73 20 65 72 72  rict results err
11680 6f 72 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ors \..         
11690 20 24 61 64 64 20 53 79 73 74 65 6d 2e 64 6c 6c   $add System.dll
116a0 20 24 61 64 64 20 53 79 73 74 65 6d 2e 44 61 74   $add System.Dat
116b0 61 2e 64 6c 6c 20 24 61 64 64 20 53 79 73 74 65  a.dll $add Syste
116c0 6d 2e 54 72 61 6e 73 61 63 74 69 6f 6e 73 2e 64  m.Transactions.d
116d0 6c 6c 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  ll \..          
116e0 24 61 64 64 20 53 79 73 74 65 6d 2e 58 6d 6c 2e  $add System.Xml.
116f0 64 6c 6c 5d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d  dll]....      #.
11700 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41  .      # NOTE: A
11710 64 64 20 61 6c 6c 20 74 68 65 20 70 72 6f 76 69  dd all the provi
11720 64 65 64 20 66 69 6c 65 20 6e 61 6d 65 73 20 61  ded file names a
11730 73 20 61 73 73 65 6d 62 6c 79 20 72 65 66 65 72  s assembly refer
11740 65 6e 63 65 73 2e 0d 0a 20 20 20 20 20 20 23 0d  ences...      #.
11750 0a 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 66  .      foreach f
11760 69 6c 65 4e 61 6d 65 20 24 66 69 6c 65 4e 61 6d  ileName $fileNam
11770 65 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 6c 61  es {..        la
11780 70 70 65 6e 64 20 63 6f 6d 6d 61 6e 64 20 24 61  ppend command $a
11790 64 64 20 5b 67 65 74 42 69 6e 61 72 79 46 69 6c  dd [getBinaryFil
117a0 65 4e 61 6d 65 20 24 66 69 6c 65 4e 61 6d 65 5d  eName $fileName]
117b0 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
117c0 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
117d0 54 45 3a 20 41 64 64 20 74 68 65 20 65 78 74 72  TE: Add the extr
117e0 61 20 61 72 67 75 6d 65 6e 74 73 2c 20 69 66 20  a arguments, if 
117f0 61 6e 79 2c 20 74 6f 20 74 68 65 20 63 6f 6d 6d  any, to the comm
11800 61 6e 64 20 74 6f 20 65 76 61 6c 75 61 74 65 2e  and to evaluate.
11810 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
11820 20 65 76 61 6c 20 6c 61 70 70 65 6e 64 20 63 6f   eval lappend co
11830 6d 6d 61 6e 64 20 24 61 72 67 73 0d 0a 0d 0a 20  mmand $args.... 
11840 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
11850 4e 4f 54 45 3a 20 41 6c 69 61 73 20 74 68 65 20  NOTE: Alias the 
11860 63 6f 6d 70 69 6c 65 72 20 6c 6f 63 61 6c 20 72  compiler local r
11870 65 73 75 6c 74 73 20 61 6e 64 20 65 72 72 6f 72  esults and error
11880 73 20 76 61 72 69 61 62 6c 65 73 20 74 6f 20 74  s variables to t
11890 68 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  he..      #     
118a0 20 20 76 61 72 69 61 62 6c 65 20 6e 61 6d 65 73    variable names
118b0 20 70 72 6f 76 69 64 65 64 20 62 79 20 6f 75 72   provided by our
118c0 20 63 61 6c 6c 65 72 2e 0d 0a 20 20 20 20 20 20   caller...      
118d0 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 73 74  #..      if {[st
118e0 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 72 65 73  ring length $res
118f0 75 6c 74 73 56 61 72 4e 61 6d 65 5d 20 3e 20 30  ultsVarName] > 0
11900 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
11910 20 20 75 70 76 61 72 20 31 20 24 72 65 73 75 6c    upvar 1 $resul
11920 74 73 56 61 72 4e 61 6d 65 20 72 65 73 75 6c 74  tsVarName result
11930 73 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  s..      }....  
11940 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20      if {[string 
11950 6c 65 6e 67 74 68 20 24 65 72 72 6f 72 73 56 61  length $errorsVa
11960 72 4e 61 6d 65 5d 20 3e 20 30 7d 20 74 68 65 6e  rName] > 0} then
11970 20 7b 0d 0a 20 20 20 20 20 20 20 20 75 70 76 61   {..        upva
11980 72 20 31 20 24 65 72 72 6f 72 73 56 61 72 4e 61  r 1 $errorsVarNa
11990 6d 65 20 65 72 72 6f 72 73 0d 0a 20 20 20 20 20  me errors..     
119a0 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20   }....      #.. 
119b0 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 45 76 61       # NOTE: Eva
119c0 6c 75 61 74 65 20 74 68 65 20 63 6f 6e 73 74 72  luate the constr
119d0 75 63 74 65 64 20 5b 63 6f 6d 70 69 6c 65 43 53  ucted [compileCS
119e0 68 61 72 70 5d 20 63 6f 6d 6d 61 6e 64 20 61 6e  harp] command an
119f0 64 20 72 65 74 75 72 6e 20 74 68 65 0d 0a 20 20  d return the..  
11a00 20 20 20 20 23 20 20 20 20 20 20 20 72 65 73 75      #       resu
11a10 6c 74 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  lt...      #..  
11a20 20 20 20 20 65 76 61 6c 20 24 63 6f 6d 6d 61 6e      eval $comman
11a30 64 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  d..    }.....   
11a40 20 70 72 6f 63 20 69 73 4d 65 6d 6f 72 79 44 62   proc isMemoryDb
11a50 20 7b 20 66 69 6c 65 4e 61 6d 65 20 7d 20 7b 0d   { fileName } {.
11a60 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
11a70 23 20 4e 4f 54 45 3a 20 49 73 20 74 68 65 20 73  # NOTE: Is the s
11a80 70 65 63 69 66 69 65 64 20 64 61 74 61 62 61 73  pecified databas
11a90 65 20 66 69 6c 65 20 6e 61 6d 65 20 72 65 61 6c  e file name real
11aa0 6c 79 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  ly an in-memory 
11ab0 64 61 74 61 62 61 73 65 3f 0d 0a 20 20 20 20 20  database?..     
11ac0 20 23 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e   #..      return
11ad0 20 5b 65 78 70 72 20 7b 24 66 69 6c 65 4e 61 6d   [expr {$fileNam
11ae0 65 20 65 71 20 22 3a 6d 65 6d 6f 72 79 3a 22 20  e eq ":memory:" 
11af0 7c 7c 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  || \..          
11b00 5b 73 74 72 69 6e 67 20 72 61 6e 67 65 20 24 66  [string range $f
11b10 69 6c 65 4e 61 6d 65 20 30 20 31 32 5d 20 65 71  ileName 0 12] eq
11b20 20 22 66 69 6c 65 3a 3a 6d 65 6d 6f 72 79 3a 22   "file::memory:"
11b30 7d 5d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20  }]..    }.....  
11b40 20 20 70 72 6f 63 20 69 73 54 61 62 6c 65 49 6e    proc isTableIn
11b50 44 62 20 7b 20 6e 61 6d 65 20 7b 76 61 72 4e 61  Db { name {varNa
11b60 6d 65 20 64 62 7d 20 7d 20 7b 0d 0a 20 20 20 20  me db} } {..    
11b70 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
11b80 45 3a 20 52 65 66 65 72 20 74 6f 20 74 68 65 20  E: Refer to the 
11b90 73 70 65 63 69 66 69 65 64 20 76 61 72 69 61 62  specified variab
11ba0 6c 65 20 28 65 2e 67 2e 20 22 64 62 22 29 20 69  le (e.g. "db") i
11bb0 6e 20 74 68 65 20 63 6f 6e 74 65 78 74 20 6f 66  n the context of
11bc0 20 6f 75 72 0d 0a 20 20 20 20 20 20 23 20 20 20   our..      #   
11bd0 20 20 20 20 63 61 6c 6c 65 72 2e 20 20 49 74 20      caller.  It 
11be0 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 64 61 74  contains the dat
11bf0 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
11c00 20 68 61 6e 64 6c 65 20 74 68 61 74 20 77 69 6c   handle that wil
11c10 6c 20 62 65 0d 0a 20 20 20 20 20 20 23 20 20 20  l be..      #   
11c20 20 20 20 20 75 73 65 64 20 74 6f 20 65 78 65 63      used to exec
11c30 75 74 65 20 74 68 65 20 71 75 65 72 79 20 75 73  ute the query us
11c40 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  ed to determine 
11c50 69 66 20 74 68 65 20 6e 61 6d 65 64 20 74 61 62  if the named tab
11c60 6c 65 20 69 73 0d 0a 20 20 20 20 20 20 23 20 20  le is..      #  
11c70 20 20 20 20 20 70 72 65 73 65 6e 74 20 69 6e 20       present in 
11c80 74 68 61 74 20 64 61 74 61 62 61 73 65 2e 0d 0a  that database...
11c90 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 75        #..      u
11ca0 70 76 61 72 20 31 20 24 76 61 72 4e 61 6d 65 20  pvar 1 $varName 
11cb0 64 62 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20  db....      #.. 
11cc0 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 55 73 65       # NOTE: Use
11cd0 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74   the sqlite_mast
11ce0 65 72 20 74 61 62 6c 65 20 74 6f 20 64 65 74 65  er table to dete
11cf0 72 6d 69 6e 65 20 69 66 20 74 68 65 20 6e 61 6d  rmine if the nam
11d00 65 64 20 74 61 62 6c 65 20 69 73 0d 0a 20 20 20  ed table is..   
11d10 20 20 20 23 20 20 20 20 20 20 20 70 72 65 73 65     #       prese
11d20 6e 74 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  nt in the databa
11d30 73 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  se...      #..  
11d40 20 20 20 20 73 65 74 20 73 71 6c 20 7b 0d 0a 20      set sql {.. 
11d50 20 20 20 20 20 20 20 53 45 4c 45 43 54 20 43 4f         SELECT CO
11d60 55 4e 54 28 2a 29 20 46 52 4f 4d 20 73 71 6c 69  UNT(*) FROM sqli
11d70 74 65 5f 6d 61 73 74 65 72 20 57 48 45 52 45 20  te_master WHERE 
11d80 74 79 70 65 20 3d 20 27 74 61 62 6c 65 27 20 41  type = 'table' A
11d90 4e 44 20 6e 61 6d 65 20 3d 20 3f 3b 0d 0a 20 20  ND name = ?;..  
11da0 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23      }....      #
11db0 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
11dc0 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20  Return non-zero 
11dd0 69 66 20 74 68 65 20 6e 61 6d 65 64 20 74 61 62  if the named tab
11de0 6c 65 20 69 73 20 70 72 65 73 65 6e 74 2e 0d 0a  le is present...
11df0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 72        #..      r
11e00 65 74 75 72 6e 20 5b 65 78 70 72 20 7b 0d 0a 20  eturn [expr {.. 
11e10 20 20 20 20 20 20 20 5b 73 71 6c 20 65 78 65 63         [sql exec
11e20 75 74 65 20 2d 65 78 65 63 75 74 65 20 73 63 61  ute -execute sca
11e30 6c 61 72 20 24 64 62 20 24 73 71 6c 20 5b 6c 69  lar $db $sql [li
11e40 73 74 20 70 61 72 61 6d 31 20 53 74 72 69 6e 67  st param1 String
11e50 20 24 6e 61 6d 65 5d 5d 20 3e 20 30 0d 0a 20 20   $name]] > 0..  
11e60 20 20 20 20 7d 5d 0d 0a 20 20 20 20 7d 0d 0a 0c      }]..    }...
11e70 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74 44 62  ..    proc getDb
11e80 44 65 66 61 75 6c 74 50 61 67 65 53 69 7a 65 20  DefaultPageSize 
11e90 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 74 72 79 20  {} {..      try 
11ea0 7b 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 64  {..        set d
11eb0 62 20 5b 73 71 6c 20 6f 70 65 6e 20 2d 74 79 70  b [sql open -typ
11ec0 65 20 53 51 4c 69 74 65 20 7b 44 61 74 61 20 53  e SQLite {Data S
11ed0 6f 75 72 63 65 3d 3a 6d 65 6d 6f 72 79 3a 3b 7d  ource=:memory:;}
11ee0 5d 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ]..        retur
11ef0 6e 20 5b 73 71 6c 20 65 78 65 63 75 74 65 20 2d  n [sql execute -
11f00 65 78 65 63 75 74 65 20 73 63 61 6c 61 72 20 24  execute scalar $
11f10 64 62 20 22 50 52 41 47 4d 41 20 70 61 67 65 5f  db "PRAGMA page_
11f20 73 69 7a 65 3b 22 5d 0d 0a 20 20 20 20 20 20 7d  size;"]..      }
11f30 20 66 69 6e 61 6c 6c 79 20 7b 0d 0a 20 20 20 20   finally {..    
11f40 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78      if {[info ex
11f50 69 73 74 73 20 64 62 5d 7d 20 74 68 65 6e 20 7b  ists db]} then {
11f60 0d 0a 20 20 20 20 20 20 20 20 20 20 63 61 74 63  ..          catc
11f70 68 20 7b 73 71 6c 20 63 6c 6f 73 65 20 24 64 62  h {sql close $db
11f80 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 75 6e 73  }..          uns
11f90 65 74 20 2d 6e 6f 63 6f 6d 70 6c 61 69 6e 20 64  et -nocomplain d
11fa0 62 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  b..        }..  
11fb0 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d      }..    }....
11fc0 0a 20 20 20 20 70 72 6f 63 20 67 65 74 44 62 44  .    proc getDbD
11fd0 65 66 61 75 6c 74 43 61 63 68 65 53 69 7a 65 20  efaultCacheSize 
11fe0 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 74 72 79 20  {} {..      try 
11ff0 7b 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 64  {..        set d
12000 62 20 5b 73 71 6c 20 6f 70 65 6e 20 2d 74 79 70  b [sql open -typ
12010 65 20 53 51 4c 69 74 65 20 7b 44 61 74 61 20 53  e SQLite {Data S
12020 6f 75 72 63 65 3d 3a 6d 65 6d 6f 72 79 3a 3b 7d  ource=:memory:;}
12030 5d 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ]..        retur
12040 6e 20 5b 73 71 6c 20 65 78 65 63 75 74 65 20 2d  n [sql execute -
12050 65 78 65 63 75 74 65 20 73 63 61 6c 61 72 20 24  execute scalar $
12060 64 62 20 22 50 52 41 47 4d 41 20 63 61 63 68 65  db "PRAGMA cache
12070 5f 73 69 7a 65 3b 22 5d 0d 0a 20 20 20 20 20 20  _size;"]..      
12080 7d 20 66 69 6e 61 6c 6c 79 20 7b 0d 0a 20 20 20  } finally {..   
12090 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65       if {[info e
120a0 78 69 73 74 73 20 64 62 5d 7d 20 74 68 65 6e 20  xists db]} then 
120b0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 63 61 74  {..          cat
120c0 63 68 20 7b 73 71 6c 20 63 6c 6f 73 65 20 24 64  ch {sql close $d
120d0 62 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 75 6e  b}..          un
120e0 73 65 74 20 2d 6e 6f 63 6f 6d 70 6c 61 69 6e 20  set -nocomplain 
120f0 64 62 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20  db..        }.. 
12100 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c       }..    }...
12110 0d 0a 20 20 20 20 70 72 6f 63 20 75 73 65 4c 65  ..    proc useLe
12120 67 61 63 79 44 62 50 61 67 65 41 6e 64 43 61 63  gacyDbPageAndCac
12130 68 65 53 69 7a 65 73 20 7b 20 76 61 72 4e 61 6d  heSizes { varNam
12140 65 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a  e } {..      #..
12150 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 52 65        # NOTE: Re
12160 66 65 72 20 74 6f 20 74 68 65 20 73 70 65 63 69  fer to the speci
12170 66 69 65 64 20 76 61 72 69 61 62 6c 65 20 28 65  fied variable (e
12180 2e 67 2e 20 22 64 62 22 29 20 69 6e 20 74 68 65  .g. "db") in the
12190 20 63 6f 6e 74 65 78 74 20 6f 66 20 6f 75 72 0d   context of our.
121a0 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63  .      #       c
121b0 61 6c 6c 65 72 2e 20 20 49 74 20 63 6f 6e 74 61  aller.  It conta
121c0 69 6e 73 20 74 68 65 20 64 61 74 61 62 61 73 65  ins the database
121d0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 6e 64   connection hand
121e0 6c 65 20 74 68 61 74 20 77 69 6c 6c 20 62 65 0d  le that will be.
121f0 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 75  .      #       u
12200 73 65 64 20 74 6f 20 65 78 65 63 75 74 65 20 71  sed to execute q
12210 75 65 72 69 65 73 20 75 73 65 64 20 74 6f 20 73  ueries used to s
12220 65 74 20 74 68 65 20 70 61 67 65 20 61 6e 64 20  et the page and 
12230 63 61 63 68 65 20 73 69 7a 65 73 2e 0d 0a 20 20  cache sizes...  
12240 20 20 20 20 23 0d 0a 20 20 20 20 20 20 75 70 76      #..      upv
12250 61 72 20 31 20 24 76 61 72 4e 61 6d 65 20 64 62  ar 1 $varName db
12260 0d 0a 0d 0a 20 20 20 20 20 20 73 71 6c 20 65 78  ....      sql ex
12270 65 63 75 74 65 20 24 64 62 20 7b 0d 0a 20 20 20  ecute $db {..   
12280 20 20 20 20 20 50 52 41 47 4d 41 20 70 61 67 65       PRAGMA page
12290 5f 73 69 7a 65 20 3d 20 31 30 32 34 3b 0d 0a 20  _size = 1024;.. 
122a0 20 20 20 20 20 20 20 50 52 41 47 4d 41 20 63 61         PRAGMA ca
122b0 63 68 65 5f 73 69 7a 65 20 3d 20 32 30 30 30 3b  che_size = 2000;
122c0 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
122d0 20 20 20 72 65 74 75 72 6e 20 5b 6c 69 73 74 20     return [list 
122e0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 73 71  \..          [sq
122f0 6c 20 65 78 65 63 75 74 65 20 2d 65 78 65 63 75  l execute -execu
12300 74 65 20 73 63 61 6c 61 72 20 24 64 62 20 22 50  te scalar $db "P
12310 52 41 47 4d 41 20 70 61 67 65 5f 73 69 7a 65 3b  RAGMA page_size;
12320 22 5d 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  "] \..          
12330 5b 73 71 6c 20 65 78 65 63 75 74 65 20 2d 65 78  [sql execute -ex
12340 65 63 75 74 65 20 73 63 61 6c 61 72 20 24 64 62  ecute scalar $db
12350 20 22 50 52 41 47 4d 41 20 63 61 63 68 65 5f 73   "PRAGMA cache_s
12360 69 7a 65 3b 22 5d 5d 0d 0a 20 20 20 20 7d 0d 0a  ize;"]]..    }..
12370 0c 0d 0a 20 20 20 20 70 72 6f 63 20 65 78 74 72  ...    proc extr
12380 61 63 74 53 79 73 74 65 6d 44 61 74 61 53 51 4c  actSystemDataSQL
12390 69 74 65 45 78 63 65 70 74 69 6f 6e 4d 65 73 73  iteExceptionMess
123a0 61 67 65 20 7b 20 76 61 6c 75 65 20 7d 20 7b 0d  age { value } {.
123b0 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
123c0 23 20 4e 4f 54 45 3a 20 49 66 20 74 68 65 20 73  # NOTE: If the s
123d0 74 72 69 6e 67 20 63 6f 6e 66 6f 72 6d 73 20 74  tring conforms t
123e0 6f 20 66 6f 72 6d 61 74 20 6f 66 20 74 68 65 20  o format of the 
123f0 6e 6f 72 6d 61 6c 20 65 78 63 65 70 74 69 6f 6e  normal exception
12400 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
12410 65 72 72 6f 72 20 73 74 72 69 6e 67 73 2c 20 65  error strings, e
12420 78 74 72 61 63 74 20 61 6e 64 20 72 65 74 75 72  xtract and retur
12430 6e 20 6f 6e 6c 79 20 74 68 65 20 65 72 72 6f 72  n only the error
12440 20 6d 65 73 73 61 67 65 0d 0a 20 20 20 20 20 20   message..      
12450 23 20 20 20 20 20 20 20 70 6f 72 74 69 6f 6e 20  #       portion 
12460 69 74 73 65 6c 66 2e 0d 0a 20 20 20 20 20 20 23  itself...      #
12470 0d 0a 20 20 20 20 20 20 73 65 74 20 70 61 74 74  ..      set patt
12480 65 72 6e 73 20 5b 6c 69 73 74 20 5c 0d 0a 20 20  erns [list \..  
12490 20 20 20 20 7b 53 79 73 74 65 6d 5c 2e 44 61 74      {System\.Dat
124a0 61 5c 2e 53 51 4c 69 74 65 5c 2e 53 51 4c 69 74  a\.SQLite\.SQLit
124b0 65 45 78 63 65 70 74 69 6f 6e 20 5c 28 30 78 38  eException \(0x8
124c0 30 30 30 34 30 30 35 5c 29 3a 20 28 2e 2b 3f 29  0004005\): (.+?)
124d0 20 20 28 3f 3a 20 29 3f 61 74 7d 20 5c 0d 0a 20    (?: )?at} \.. 
124e0 20 20 20 20 20 7b 53 79 73 74 65 6d 5c 2e 44 61       {System\.Da
124f0 74 61 5c 2e 53 51 4c 69 74 65 5c 2e 53 51 4c 69  ta\.SQLite\.SQLi
12500 74 65 45 78 63 65 70 74 69 6f 6e 3a 20 28 2e 2b  teException: (.+
12510 3f 29 20 20 28 3f 3a 20 29 3f 61 74 7d 5d 0d 0a  ?)  (?: )?at}]..
12520 0d 0a 20 20 20 20 20 20 66 6f 72 65 61 63 68 20  ..      foreach 
12530 70 61 74 74 65 72 6e 20 24 70 61 74 74 65 72 6e  pattern $pattern
12540 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20  s {..        if 
12550 7b 5b 72 65 67 65 78 70 20 2d 2d 20 24 70 61 74  {[regexp -- $pat
12560 74 65 72 6e 20 24 76 61 6c 75 65 20 64 75 6d 6d  tern $value dumm
12570 79 20 6d 65 73 73 61 67 65 5d 7d 20 74 68 65 6e  y message]} then
12580 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65   {..          se
12590 74 20 6d 65 73 73 61 67 65 20 5b 73 74 72 69 6e  t message [strin
125a0 67 20 6d 61 70 20 5b 6c 69 73 74 20 5c 72 5c 6e  g map [list \r\n
125b0 20 5c 6e 5d 20 5b 73 74 72 69 6e 67 20 74 72 69   \n] [string tri
125c0 6d 20 24 6d 65 73 73 61 67 65 5d 5d 0d 0a 20 20  m $message]]..  
125d0 20 20 20 20 20 20 20 20 73 65 74 20 6c 69 6e 65          set line
125e0 73 20 5b 73 70 6c 69 74 20 24 6d 65 73 73 61 67  s [split $messag
125f0 65 20 5c 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  e \n]....       
12600 20 20 20 69 66 20 7b 5b 6c 6c 65 6e 67 74 68 20     if {[llength 
12610 24 6c 69 6e 65 73 5d 20 3d 3d 20 32 7d 20 74 68  $lines] == 2} th
12620 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
12630 20 20 69 66 20 7b 5b 6c 69 6e 64 65 78 20 24 6c    if {[lindex $l
12640 69 6e 65 73 20 30 5d 20 65 71 20 5b 6c 69 6e 64  ines 0] eq [lind
12650 65 78 20 24 6c 69 6e 65 73 20 31 5d 7d 20 74 68  ex $lines 1]} th
12660 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
12670 20 20 20 20 72 65 74 75 72 6e 20 5b 6c 69 6e 64      return [lind
12680 65 78 20 24 6c 69 6e 65 73 20 30 5d 0d 0a 20 20  ex $lines 0]..  
12690 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20            }.... 
126a0 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
126b0 6e 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5b 6c  n [appendArgs [l
126c0 69 6e 64 65 78 20 24 6c 69 6e 65 73 20 30 5d 20  index $lines 0] 
126d0 22 20 2d 2d 20 22 20 5b 6c 69 6e 64 65 78 20 24  " -- " [lindex $
126e0 6c 69 6e 65 73 20 31 5d 5d 0d 0a 20 20 20 20 20  lines 1]]..     
126f0 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
12700 20 20 20 20 72 65 74 75 72 6e 20 24 6d 65 73 73      return $mess
12710 61 67 65 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  age..        }..
12720 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
12730 20 72 65 74 75 72 6e 20 24 76 61 6c 75 65 0d 0a   return $value..
12740 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
12750 6f 63 20 74 72 69 6d 53 71 6c 20 7b 20 73 71 6c  oc trimSql { sql
12760 20 7d 20 7b 0d 0a 20 20 20 20 20 20 72 65 74 75   } {..      retu
12770 72 6e 20 5b 72 65 67 73 75 62 20 2d 61 6c 6c 20  rn [regsub -all 
12780 2d 2d 20 7b 5c 73 2b 7d 20 5b 73 74 72 69 6e 67  -- {\s+} [string
12790 20 74 72 69 6d 20 24 73 71 6c 5d 20 22 20 22 5d   trim $sql] " "]
127a0 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
127b0 70 72 6f 63 20 65 78 65 63 75 74 65 53 71 6c 20  proc executeSql 
127c0 7b 20 73 71 6c 20 7b 65 78 65 63 75 74 65 20 6e  { sql {execute n
127d0 6f 6e 65 7d 20 7b 66 6f 72 6d 61 74 20 6e 6f 6e  one} {format non
127e0 65 7d 20 7b 66 69 6c 65 4e 61 6d 65 20 22 22 7d  e} {fileName ""}
127f0 20 7d 20 7b 0d 0a 20 20 20 20 20 20 69 66 20 7b   } {..      if {
12800 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
12810 66 69 6c 65 4e 61 6d 65 5d 20 3d 3d 20 30 7d 20  fileName] == 0} 
12820 74 68 65 6e 20 7b 73 65 74 20 66 69 6c 65 4e 61  then {set fileNa
12830 6d 65 20 3a 6d 65 6d 6f 72 79 3a 7d 0d 0a 20 20  me :memory:}..  
12840 20 20 20 20 73 65 74 75 70 44 62 20 24 66 69 6c      setupDb $fil
12850 65 4e 61 6d 65 20 22 22 20 22 22 20 22 22 20 22  eName "" "" "" "
12860 22 20 22 22 20 66 61 6c 73 65 20 66 61 6c 73 65  " "" false false
12870 20 66 61 6c 73 65 20 66 61 6c 73 65 20 64 62 20   false false db 
12880 74 72 75 65 0d 0a 0d 0a 20 20 20 20 20 20 74 72  true....      tr
12890 79 20 7b 0d 0a 20 20 20 20 20 20 20 20 72 65 74  y {..        ret
128a0 75 72 6e 20 5b 75 70 6c 65 76 65 6c 20 31 20 5b  urn [uplevel 1 [
128b0 6c 69 73 74 20 5c 0d 0a 20 20 20 20 20 20 20 20  list \..        
128c0 20 20 20 20 73 71 6c 20 65 78 65 63 75 74 65 20      sql execute 
128d0 2d 65 78 65 63 75 74 65 20 24 65 78 65 63 75 74  -execute $execut
128e0 65 20 2d 66 6f 72 6d 61 74 20 24 66 6f 72 6d 61  e -format $forma
128f0 74 20 24 64 62 20 24 73 71 6c 5d 5d 0d 0a 20 20  t $db $sql]]..  
12900 20 20 20 20 7d 20 66 69 6e 61 6c 6c 79 20 7b 0d      } finally {.
12910 0a 20 20 20 20 20 20 20 20 63 6c 65 61 6e 75 70  .        cleanup
12920 44 62 20 24 66 69 6c 65 4e 61 6d 65 20 64 62 20  Db $fileName db 
12930 66 61 6c 73 65 20 66 61 6c 73 65 20 66 61 6c 73  false false fals
12940 65 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  e..      }..    
12950 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 68  }.....    proc h
12960 61 73 4e 6f 46 6c 61 67 73 20 7b 20 76 61 72 4e  asNoFlags { varN
12970 61 6d 65 20 6e 6f 6e 65 20 7d 20 7b 0d 0a 20 20  ame none } {..  
12980 20 20 20 20 75 70 76 61 72 20 31 20 24 76 61 72      upvar 1 $var
12990 4e 61 6d 65 20 66 6c 61 67 73 0d 0a 0d 0a 20 20  Name flags....  
129a0 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65      if {![info e
129b0 78 69 73 74 73 20 66 6c 61 67 73 5d 7d 20 74 68  xists flags]} th
129c0 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 72 65  en {..        re
129d0 74 75 72 6e 20 74 72 75 65 0d 0a 20 20 20 20 20  turn true..     
129e0 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b   }....      if {
129f0 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
12a00 66 6c 61 67 73 5d 20 3d 3d 20 30 7d 20 74 68 65  flags] == 0} the
12a10 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 72 65 74  n {..        ret
12a20 75 72 6e 20 74 72 75 65 0d 0a 20 20 20 20 20 20  urn true..      
12a30 7d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 24  }....      if {$
12a40 6e 6f 6e 65 20 26 26 20 24 66 6c 61 67 73 20 65  none && $flags e
12a50 71 20 22 4e 6f 6e 65 22 7d 20 74 68 65 6e 20 7b  q "None"} then {
12a60 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ..        return
12a70 20 74 72 75 65 0d 0a 20 20 20 20 20 20 7d 0d 0a   true..      }..
12a80 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 66  ..      return f
12a90 61 6c 73 65 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a  alse..    }.....
12aa0 20 20 20 20 70 72 6f 63 20 67 65 74 43 6f 6e 6e      proc getConn
12ab0 65 63 74 69 6f 6e 46 6c 61 67 73 20 7b 20 66 69  ectionFlags { fi
12ac0 6c 65 4e 61 6d 65 20 66 6c 61 67 73 20 7b 71 75  leName flags {qu
12ad0 69 65 74 20 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a  iet false} } {..
12ae0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
12af0 20 4e 4f 54 45 3a 20 46 69 67 75 72 65 20 6f 75   NOTE: Figure ou
12b00 74 20 77 68 69 63 68 20 64 61 74 61 62 61 73 65  t which database
12b10 20 66 69 6c 65 20 6e 61 6d 65 20 6f 72 20 63 6f   file name or co
12b20 6e 6e 65 63 74 69 6f 6e 20 73 74 72 69 6e 67 20  nnection string 
12b30 74 68 65 73 65 0d 0a 20 20 20 20 20 20 23 20 20  these..      #  
12b40 20 20 20 20 20 63 6f 6e 6e 65 63 74 69 6f 6e 20       connection 
12b50 66 6c 61 67 73 20 77 69 6c 6c 20 61 63 74 75 61  flags will actua
12b60 6c 6c 79 20 61 70 70 6c 79 20 74 6f 2e 20 20 54  lly apply to.  T
12b70 68 69 73 20 69 73 20 6e 6f 74 20 6e 65 63 65 73  his is not neces
12b80 73 61 72 79 0d 0a 20 20 20 20 20 20 23 20 20 20  sary..      #   
12b90 20 20 20 20 69 6e 20 71 75 69 65 74 20 6d 6f 64      in quiet mod
12ba0 65 20 62 65 63 61 75 73 65 20 74 68 69 73 20 69  e because this i
12bb0 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 6f 6e  nformation is on
12bc0 6c 79 20 75 73 65 64 20 66 6f 72 20 6c 6f 67 67  ly used for logg
12bd0 69 6e 67 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ing..      #    
12be0 20 20 20 61 6e 64 20 72 65 70 6f 72 74 69 6e 67     and reporting
12bf0 20 70 75 72 70 6f 73 65 73 2e 0d 0a 20 20 20 20   purposes...    
12c00 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 21    #..      if {!
12c10 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a  $quiet} then {..
12c20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72          if {[str
12c30 69 6e 67 20 6c 65 6e 67 74 68 20 24 66 69 6c 65  ing length $file
12c40 4e 61 6d 65 5d 20 3e 20 30 7d 20 74 68 65 6e 20  Name] > 0} then 
12c50 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74  {..          set
12c60 20 64 61 74 61 62 61 73 65 20 5b 61 70 70 65 6e   database [appen
12c70 64 41 72 67 73 20 22 66 69 6c 65 20 6e 61 6d 65  dArgs "file name
12c80 20 5c 22 22 20 24 66 69 6c 65 4e 61 6d 65 20 5c   \"" $fileName \
12c90 22 5d 0d 0a 20 20 20 20 20 20 20 20 7d 20 65 6c  "]..        } el
12ca0 73 65 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73  seif {[info exis
12cb0 74 73 20 3a 3a 64 61 74 61 53 6f 75 72 63 65 5d  ts ::dataSource]
12cc0 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20   && \..         
12cd0 20 20 20 21 5b 61 72 72 61 79 20 65 78 69 73 74     ![array exist
12ce0 73 20 3a 3a 64 61 74 61 53 6f 75 72 63 65 5d 7d  s ::dataSource]}
12cf0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
12d00 20 20 20 73 65 74 20 64 61 74 61 62 61 73 65 20     set database 
12d10 5b 61 70 70 65 6e 64 41 72 67 73 20 22 64 61 74  [appendArgs "dat
12d20 61 20 73 6f 75 72 63 65 20 5c 22 22 20 24 3a 3a  a source \"" $::
12d30 64 61 74 61 53 6f 75 72 63 65 20 5c 22 5d 0d 0a  dataSource \"]..
12d40 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b          } else {
12d50 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20  ..          set 
12d60 64 61 74 61 62 61 73 65 20 3c 75 6e 6b 6e 6f 77  database <unknow
12d70 6e 3e 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20  n>..        }.. 
12d80 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
12d90 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
12da0 20 53 68 6f 77 20 28 61 6e 64 20 6c 6f 67 29 20   Show (and log) 
12db0 74 68 65 20 6c 6f 63 61 6c 20 63 6f 6e 6e 65 63  the local connec
12dc0 74 69 6f 6e 20 66 6c 61 67 73 20 61 6e 64 20 74  tion flags and t
12dd0 68 65 20 61 73 73 6f 63 69 61 74 65 64 0d 0a 20  he associated.. 
12de0 20 20 20 20 20 23 20 20 20 20 20 20 20 64 61 74       #       dat
12df0 61 20 73 6f 75 72 63 65 20 6f 72 20 66 69 6c 65  a source or file
12e00 20 6e 61 6d 65 2e 0d 0a 20 20 20 20 20 20 23 0d   name...      #.
12e10 0a 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69  .      if {!$qui
12e20 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  et} then {..    
12e30 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65      if {![info e
12e40 78 69 73 74 73 20 3a 3a 6e 6f 28 65 6d 69 74 4c  xists ::no(emitL
12e50 6f 63 61 6c 46 6c 61 67 73 29 5d 20 26 26 20 5c  ocalFlags)] && \
12e60 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 28 21  ..            (!
12e70 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e  [info exists ::n
12e80 6f 28 65 6d 69 74 4c 6f 63 61 6c 46 6c 61 67 73  o(emitLocalFlags
12e90 49 66 4e 6f 6e 65 29 5d 20 7c 7c 20 5c 0d 0a 20  IfNone)] || \.. 
12ea0 20 20 20 20 20 20 20 20 20 20 20 20 21 5b 68 61              ![ha
12eb0 73 4e 6f 46 6c 61 67 73 20 66 6c 61 67 73 20 66  sNoFlags flags f
12ec0 61 6c 73 65 5d 29 7d 20 74 68 65 6e 20 7b 0d 0a  alse])} then {..
12ed0 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
12ee0 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
12ef0 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
12f00 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d               "--
12f10 2d 2d 20 6c 6f 63 61 6c 20 63 6f 6e 6e 65 63 74  -- local connect
12f20 69 6f 6e 20 66 6c 61 67 73 20 66 6f 72 20 22 20  ion flags for " 
12f30 24 64 61 74 61 62 61 73 65 20 5c 0d 0a 20 20 20  $database \..   
12f40 20 20 20 20 20 20 20 20 20 20 20 22 20 61 72 65             " are
12f50 3a 20 22 20 5b 65 78 70 72 20 7b 21 5b 68 61 73  : " [expr {![has
12f60 4e 6f 46 6c 61 67 73 20 66 6c 61 67 73 20 66 61  NoFlags flags fa
12f70 6c 73 65 5d 20 3f 20 5c 0d 0a 20 20 20 20 20 20  lse] ? \..      
12f80 20 20 20 20 20 20 20 20 5b 61 70 70 65 6e 64 41          [appendA
12f90 72 67 73 20 5c 22 20 24 66 6c 61 67 73 20 5c 22  rgs \" $flags \"
12fa0 5d 20 3a 20 22 3c 6e 6f 6e 65 3e 22 7d 5d 20 5c  ] : "<none>"}] \
12fb0 6e 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20  n]..        }.. 
12fc0 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
12fd0 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
12fe0 20 53 68 6f 77 20 28 61 6e 64 20 6c 6f 67 29 20   Show (and log) 
12ff0 74 68 65 20 73 68 61 72 65 64 20 63 6f 6e 6e 65  the shared conne
13000 63 74 69 6f 6e 20 66 6c 61 67 73 2e 0d 0a 20 20  ction flags...  
13010 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20      #..      if 
13020 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b  {!$quiet} then {
13030 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63  ..        if {[c
13040 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20  atch {..        
13050 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20    object invoke 
13060 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
13070 74 65 2e 53 51 4c 69 74 65 43 6f 6e 6e 65 63 74  te.SQLiteConnect
13080 69 6f 6e 20 53 68 61 72 65 64 46 6c 61 67 73 0d  ion SharedFlags.
13090 0a 20 20 20 20 20 20 20 20 7d 20 73 68 61 72 65  .        } share
130a0 64 46 6c 61 67 73 5d 20 3d 3d 20 30 7d 20 74 68  dFlags] == 0} th
130b0 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
130c0 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74  if {![info exist
130d0 73 20 3a 3a 6e 6f 28 65 6d 69 74 53 68 61 72 65  s ::no(emitShare
130e0 64 46 6c 61 67 73 29 5d 20 26 26 20 5c 0d 0a 20  dFlags)] && \.. 
130f0 20 20 20 20 20 20 20 20 20 20 20 20 20 28 21 5b               (![
13100 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f  info exists ::no
13110 28 65 6d 69 74 53 68 61 72 65 64 46 6c 61 67 73  (emitSharedFlags
13120 49 66 4e 6f 6e 65 29 5d 20 7c 7c 20 5c 0d 0a 20  IfNone)] || \.. 
13130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 21 5b                ![
13140 68 61 73 4e 6f 46 6c 61 67 73 20 73 68 61 72 65  hasNoFlags share
13150 64 46 6c 61 67 73 20 74 72 75 65 5d 29 7d 20 74  dFlags true])} t
13160 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
13170 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
13180 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  _channel [append
13190 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
131a0 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 73 68          "---- sh
131b0 61 72 65 64 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  ared connection 
131c0 66 6c 61 67 73 20 66 6f 72 20 22 20 24 64 61 74  flags for " $dat
131d0 61 62 61 73 65 20 5c 0d 0a 20 20 20 20 20 20 20  abase \..       
131e0 20 20 20 20 20 20 20 20 20 22 20 61 72 65 3a 20           " are: 
131f0 22 20 5b 65 78 70 72 20 7b 21 5b 68 61 73 4e 6f  " [expr {![hasNo
13200 46 6c 61 67 73 20 73 68 61 72 65 64 46 6c 61 67  Flags sharedFlag
13210 73 20 74 72 75 65 5d 20 3f 20 5c 0d 0a 20 20 20  s true] ? \..   
13220 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 61 70               [ap
13230 70 65 6e 64 41 72 67 73 20 5c 22 20 24 73 68 61  pendArgs \" $sha
13240 72 65 64 46 6c 61 67 73 20 5c 22 5d 20 3a 20 22  redFlags \"] : "
13250 3c 6e 6f 6e 65 3e 22 7d 5d 20 5c 6e 5d 0d 0a 20  <none>"}] \n].. 
13260 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
13270 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
13280 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e          if {![in
13290 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 65  fo exists ::no(e
132a0 6d 69 74 53 68 61 72 65 64 46 6c 61 67 73 29 5d  mitSharedFlags)]
132b0 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20   && \..         
132c0 20 20 20 20 20 21 5b 69 6e 66 6f 20 65 78 69 73       ![info exis
132d0 74 73 20 3a 3a 6e 6f 28 65 6d 69 74 53 68 61 72  ts ::no(emitShar
132e0 65 64 46 6c 61 67 73 49 66 55 6e 61 76 61 69 6c  edFlagsIfUnavail
132f0 61 62 6c 65 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a  able)]} then {..
13300 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
13310 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
13320 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
13330 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
13340 20 22 2d 2d 2d 2d 20 73 68 61 72 65 64 20 63 6f   "---- shared co
13350 6e 6e 65 63 74 69 6f 6e 20 66 6c 61 67 73 20 66  nnection flags f
13360 6f 72 20 22 20 24 64 61 74 61 62 61 73 65 20 5c  or " $database \
13370 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
13380 20 20 22 20 61 72 65 3a 20 3c 75 6e 61 76 61 69    " are: <unavai
13390 6c 61 62 6c 65 3e 5c 6e 22 5d 0d 0a 20 20 20 20  lable>\n"]..    
133a0 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
133b0 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20   }..      }.... 
133c0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
133d0 4e 4f 54 45 3a 20 53 68 6f 77 20 28 61 6e 64 20  NOTE: Show (and 
133e0 6c 6f 67 29 20 74 68 65 20 64 65 74 65 63 74 65  log) the detecte
133f0 64 20 67 6c 6f 62 61 6c 20 63 6f 6e 6e 65 63 74  d global connect
13400 69 6f 6e 20 66 6c 61 67 73 2c 20 69 66 20 61 6e  ion flags, if an
13410 79 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  y...      #..   
13420 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20     if {!$quiet} 
13430 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
13440 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74  if {![info exist
13450 73 20 3a 3a 6e 6f 28 65 6d 69 74 47 6c 6f 62 61  s ::no(emitGloba
13460 6c 46 6c 61 67 73 29 5d 20 26 26 20 5c 0d 0a 20  lFlags)] && \.. 
13470 20 20 20 20 20 20 20 20 20 20 20 28 21 5b 69 6e             (![in
13480 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 65  fo exists ::no(e
13490 6d 69 74 47 6c 6f 62 61 6c 46 6c 61 67 73 49 66  mitGlobalFlagsIf
134a0 4e 6f 6e 65 29 5d 20 7c 7c 20 5c 0d 0a 20 20 20  None)] || \..   
134b0 20 20 20 20 20 20 20 20 20 20 21 5b 68 61 73 4e            ![hasN
134c0 6f 46 6c 61 67 73 20 3a 3a 63 6f 6e 6e 65 63 74  oFlags ::connect
134d0 69 6f 6e 5f 66 6c 61 67 73 20 66 61 6c 73 65 5d  ion_flags false]
134e0 29 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  )} then {..     
134f0 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
13500 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
13510 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
13520 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 67 6c          "---- gl
13530 6f 62 61 6c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  obal connection 
13540 66 6c 61 67 73 20 61 72 65 3a 20 22 20 5c 0d 0a  flags are: " \..
13550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 65                [e
13560 78 70 72 20 7b 21 5b 68 61 73 4e 6f 46 6c 61 67  xpr {![hasNoFlag
13570 73 20 3a 3a 63 6f 6e 6e 65 63 74 69 6f 6e 5f 66  s ::connection_f
13580 6c 61 67 73 20 66 61 6c 73 65 5d 20 3f 20 5c 0d  lags false] ? \.
13590 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b  .              [
135a0 61 70 70 65 6e 64 41 72 67 73 20 5c 22 20 24 3a  appendArgs \" $:
135b0 3a 63 6f 6e 6e 65 63 74 69 6f 6e 5f 66 6c 61 67  :connection_flag
135c0 73 20 5c 22 5d 20 3a 20 22 3c 6e 6f 6e 65 3e 22  s \"] : "<none>"
135d0 7d 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20  }] \n]..        
135e0 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  }..      }....  
135f0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
13600 4f 54 45 3a 20 49 66 20 74 68 65 72 65 20 61 72  OTE: If there ar
13610 65 20 61 6e 79 20 67 6c 6f 62 61 6c 20 28 70 65  e any global (pe
13620 72 20 74 65 73 74 20 72 75 6e 29 20 63 6f 6e 6e  r test run) conn
13630 65 63 74 69 6f 6e 20 66 6c 61 67 73 20 63 75 72  ection flags cur
13640 72 65 6e 74 6c 79 0d 0a 20 20 20 20 20 20 23 20  rently..      # 
13650 20 20 20 20 20 20 73 65 74 2c 20 75 73 65 20 74        set, use t
13660 68 65 6d 20 6e 6f 77 20 28 69 2e 65 2e 20 62 79  hem now (i.e. by
13670 20 63 6f 6d 62 69 6e 69 6e 67 20 74 68 65 6d 20   combining them 
13680 77 69 74 68 20 74 68 65 20 6f 6e 65 73 20 66 6f  with the ones fo
13690 72 20 74 68 69 73 0d 0a 20 20 20 20 20 20 23 20  r this..      # 
136a0 20 20 20 20 20 20 63 6f 6e 6e 65 63 74 69 6f 6e        connection
136b0 29 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  )...      #..   
136c0 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69     if {[info exi
136d0 73 74 73 20 3a 3a 63 6f 6e 6e 65 63 74 69 6f 6e  sts ::connection
136e0 5f 66 6c 61 67 73 5d 7d 20 74 68 65 6e 20 7b 0d  _flags]} then {.
136f0 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
13700 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 6f 6d 62      # NOTE: Comb
13710 69 6e 65 20 61 6e 64 2f 6f 72 20 72 65 70 6c 61  ine and/or repla
13720 63 65 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  ce the connectio
13730 6e 20 66 6c 61 67 73 20 61 6e 64 20 74 68 65 6e  n flags and then
13740 20 73 68 6f 77 20 74 68 65 0d 0a 20 20 20 20 20   show the..     
13750 20 20 20 23 20 20 20 20 20 20 20 6e 65 77 20 76     #       new v
13760 61 6c 75 65 2e 0d 0a 20 20 20 20 20 20 20 20 23  alue...        #
13770 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 66 6c  ..        set fl
13780 61 67 73 20 5b 63 6f 6d 62 69 6e 65 46 6c 61 67  ags [combineFlag
13790 73 20 24 66 6c 61 67 73 20 24 3a 3a 63 6f 6e 6e  s $flags $::conn
137a0 65 63 74 69 6f 6e 5f 66 6c 61 67 73 5d 0d 0a 0d  ection_flags]...
137b0 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
137c0 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 68 6f 77      # NOTE: Show
137d0 20 28 61 6e 64 20 6c 6f 67 29 20 74 68 65 20 6e   (and log) the n
137e0 65 77 20 65 66 66 65 63 74 69 76 65 20 63 6f 6e  ew effective con
137f0 6e 65 63 74 69 6f 6e 20 66 6c 61 67 73 2e 0d 0a  nection flags...
13800 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
13810 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20     if {!$quiet} 
13820 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
13830 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69    if {![info exi
13840 73 74 73 20 3a 3a 6e 6f 28 65 6d 69 74 43 6f 6d  sts ::no(emitCom
13850 62 69 6e 65 64 46 6c 61 67 73 29 5d 20 26 26 20  binedFlags)] && 
13860 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
13870 20 28 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20   (![info exists 
13880 3a 3a 6e 6f 28 65 6d 69 74 43 6f 6d 62 69 6e 65  ::no(emitCombine
13890 64 46 6c 61 67 73 49 66 4e 6f 6e 65 29 5d 20 7c  dFlagsIfNone)] |
138a0 7c 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  | \..           
138b0 20 20 20 20 21 5b 68 61 73 4e 6f 46 6c 61 67 73      ![hasNoFlags
138c0 20 66 6c 61 67 73 20 66 61 6c 73 65 5d 29 7d 20   flags false])} 
138d0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
138e0 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
138f0 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e  t_channel [appen
13900 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
13910 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63           "---- c
13920 6f 6d 62 69 6e 65 64 20 63 6f 6e 6e 65 63 74 69  ombined connecti
13930 6f 6e 20 66 6c 61 67 73 20 66 6f 72 20 22 20 24  on flags for " $
13940 64 61 74 61 62 61 73 65 20 5c 0d 0a 20 20 20 20  database \..    
13950 20 20 20 20 20 20 20 20 20 20 20 20 22 20 61 72              " ar
13960 65 3a 20 22 20 5b 65 78 70 72 20 7b 21 5b 68 61  e: " [expr {![ha
13970 73 4e 6f 46 6c 61 67 73 20 66 6c 61 67 73 20 66  sNoFlags flags f
13980 61 6c 73 65 5d 20 3f 20 5c 0d 0a 20 20 20 20 20  alse] ? \..     
13990 20 20 20 20 20 20 20 20 20 20 20 5b 61 70 70 65             [appe
139a0 6e 64 41 72 67 73 20 5c 22 20 24 66 6c 61 67 73  ndArgs \" $flags
139b0 20 5c 22 5d 20 3a 20 22 3c 6e 6f 6e 65 3e 22 7d   \"] : "<none>"}
139c0 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20  ] \n]..         
139d0 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20   }..        }.. 
139e0 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
139f0 72 65 74 75 72 6e 20 24 66 6c 61 67 73 0d 0a 20  return $flags.. 
13a00 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
13a10 63 20 67 65 74 46 6c 61 67 73 50 72 6f 70 65 72  c getFlagsProper
13a20 74 79 20 7b 20 7b 66 6c 61 67 73 20 22 22 7d 20  ty { {flags ""} 
13a30 7b 71 75 69 65 74 20 66 61 6c 73 65 7d 20 7d 20  {quiet false} } 
13a40 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  {..      #..    
13a50 20 20 23 20 4e 4f 54 45 3a 20 44 65 74 65 72 6d    # NOTE: Determ
13a60 69 6e 65 20 77 68 61 74 20 74 68 65 20 63 6f 6d  ine what the com
13a70 62 69 6e 65 64 20 28 67 6c 6f 62 61 6c 20 61 6e  bined (global an
13a80 64 20 6c 6f 63 61 6c 29 20 63 6f 6e 6e 65 63 74  d local) connect
13a90 69 6f 6e 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ion..      #    
13aa0 20 20 20 66 6c 61 67 73 20 73 68 6f 75 6c 64 20     flags should 
13ab0 62 65 2c 20 70 6f 73 73 69 62 6c 79 20 71 75 69  be, possibly qui
13ac0 65 74 6c 79 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  etly...      #..
13ad0 20 20 20 20 20 20 73 65 74 20 66 6c 61 67 73 20        set flags 
13ae0 5b 67 65 74 43 6f 6e 6e 65 63 74 69 6f 6e 46 6c  [getConnectionFl
13af0 61 67 73 20 22 22 20 24 66 6c 61 67 73 20 24 71  ags "" $flags $q
13b00 75 69 65 74 5d 0d 0a 0d 0a 20 20 20 20 20 20 23  uiet]....      #
13b10 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
13b20 49 66 20 6e 6f 20 67 6c 6f 62 61 6c 20 6f 72 20  If no global or 
13b30 6c 6f 63 61 6c 20 63 6f 6e 6e 65 63 74 69 6f 6e  local connection
13b40 20 66 6c 61 67 73 20 77 65 72 65 20 73 70 65 63   flags were spec
13b50 69 66 69 65 64 2c 20 74 68 65 0d 0a 20 20 20 20  ified, the..    
13b60 20 20 23 20 20 20 20 20 20 20 64 65 66 61 75 6c    #       defaul
13b70 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 6c 61  t connection fla
13b80 67 73 20 73 68 6f 75 6c 64 20 62 65 20 75 73 65  gs should be use
13b90 64 3b 20 74 68 65 72 65 66 6f 72 65 2c 20 72 65  d; therefore, re
13ba0 74 75 72 6e 0d 0a 20 20 20 20 20 20 23 20 20 20  turn..      #   
13bb0 20 20 20 20 61 6e 20 65 6d 70 74 79 20 73 74 72      an empty str
13bc0 69 6e 67 20 69 6e 20 74 68 61 74 20 63 61 73 65  ing in that case
13bd0 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
13be0 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65    if {[string le
13bf0 6e 67 74 68 20 24 66 6c 61 67 73 5d 20 3d 3d 20  ngth $flags] == 
13c00 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
13c10 20 20 20 72 65 74 75 72 6e 20 22 22 0d 0a 20 20     return ""..  
13c20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23      }....      #
13c30 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
13c40 49 6e 20 6f 72 64 65 72 20 74 6f 20 63 68 65 63  In order to chec
13c50 6b 20 69 66 20 74 68 65 20 64 65 66 61 75 6c 74  k if the default
13c60 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 6c 61 67   connection flag
13c70 73 20 61 72 65 20 62 65 69 6e 67 20 75 73 65 64  s are being used
13c80 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
13c90 69 74 20 69 73 20 6e 65 63 65 73 73 61 72 79 20  it is necessary 
13ca0 74 6f 20 61 74 74 65 6d 70 74 20 61 20 63 6f 6e  to attempt a con
13cb0 76 65 72 73 69 6f 6e 20 74 6f 20 74 68 65 20 61  version to the a
13cc0 63 74 75 61 6c 20 65 6e 75 6d 65 72 61 74 65 64  ctual enumerated
13cd0 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
13ce0 74 79 70 65 2e 20 20 46 61 69 6c 69 6e 67 20 74  type.  Failing t
13cf0 68 61 74 2c 20 74 68 65 20 63 68 65 63 6b 20 61  hat, the check a
13d00 67 61 69 6e 73 74 20 74 68 65 20 64 65 66 61 75  gainst the defau
13d10 6c 74 20 76 61 6c 75 65 20 77 69 6c 6c 20 62 65  lt value will be
13d20 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
13d30 73 6b 69 70 70 65 64 2e 0d 0a 20 20 20 20 20 20  skipped...      
13d40 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 63 61  #..      if {[ca
13d50 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 73  tch {..        s
13d60 65 74 20 65 72 72 6f 72 20 6e 75 6c 6c 3b 20 23  et error null; #
13d70 20 49 47 4e 4f 52 45 44 0d 0a 0d 0a 20 20 20 20   IGNORED....    
13d80 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b      object invok
13d90 65 20 55 74 69 6c 69 74 79 20 54 72 79 50 61 72  e Utility TryPar
13da0 73 65 46 6c 61 67 73 45 6e 75 6d 20 22 22 20 5c  seFlagsEnum "" \
13db0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 53 79  ..            Sy
13dc0 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
13dd0 2e 53 51 4c 69 74 65 43 6f 6e 6e 65 63 74 69 6f  .SQLiteConnectio
13de0 6e 46 6c 61 67 73 20 22 22 20 24 66 6c 61 67 73  nFlags "" $flags
13df0 20 6e 75 6c 6c 20 74 72 75 65 20 5c 0d 0a 20 20   null true \..  
13e00 20 20 20 20 20 20 20 20 20 20 74 72 75 65 20 65            true e
13e10 72 72 6f 72 0d 0a 20 20 20 20 20 20 7d 20 76 61  rror..      } va
13e20 6c 75 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  lue]} then {..  
13e30 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
13e40 20 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74   # NOTE: Attempt
13e50 69 6e 67 20 74 6f 20 70 61 72 73 65 20 74 68 65  ing to parse the
13e60 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 6c 61 67   connection flag
13e70 73 20 63 61 75 73 65 64 20 61 20 73 63 72 69 70  s caused a scrip
13e80 74 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  t..        #    
13e90 20 20 20 65 72 72 6f 72 2e 20 20 45 6d 69 74 20     error.  Emit 
13ea0 61 20 77 61 72 6e 69 6e 67 20 74 6f 20 74 68 65  a warning to the
13eb0 20 74 65 73 74 20 6c 6f 67 20 66 69 6c 65 20 61   test log file a
13ec0 6e 64 20 63 6f 6e 74 69 6e 75 65 0d 0a 20 20 20  nd continue..   
13ed0 20 20 20 20 20 23 20 20 20 20 20 20 20 75 73 69       #       usi
13ee0 6e 67 20 61 6e 20 65 6d 74 70 79 20 73 74 72 69  ng an emtpy stri
13ef0 6e 67 20 69 6e 73 74 65 61 64 2e 0d 0a 20 20 20  ng instead...   
13f00 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
13f10 74 6c 6f 67 20 5b 61 70 70 65 6e 64 41 72 67 73  tlog [appendArgs
13f20 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
13f30 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66  "==== WARNING: f
13f40 61 69 6c 65 64 20 74 6f 20 70 61 72 73 65 20 63  ailed to parse c
13f50 6f 6e 6e 65 63 74 69 6f 6e 20 66 6c 61 67 73 2c  onnection flags,
13f60 20 65 72 72 6f 72 3a 20 22 20 5c 0d 0a 20 20 20   error: " \..   
13f70 20 20 20 20 20 20 20 20 20 5c 6e 5c 74 20 24 76           \n\t $v
13f80 61 6c 75 65 20 5c 6e 5d 0d 0a 0d 0a 20 20 20 20  alue \n]....    
13f90 20 20 20 20 73 65 74 20 76 61 6c 75 65 20 22 22      set value ""
13fa0 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
13fb0 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
13fc0 54 45 3a 20 49 66 20 74 68 65 20 63 6f 6d 62 69  TE: If the combi
13fd0 6e 65 64 20 66 6c 61 67 73 20 73 74 72 69 6e 67  ned flags string
13fe0 20 63 6f 75 6c 64 20 6e 6f 74 20 61 63 74 75 61   could not actua
13ff0 6c 6c 79 20 62 65 20 63 6f 6e 76 65 72 74 65 64  lly be converted
14000 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
14010 74 6f 20 74 68 65 20 65 6e 75 6d 65 72 61 74 65  to the enumerate
14020 64 20 74 79 70 65 20 69 74 20 69 73 20 74 68 65  d type it is the
14030 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 2c 20   default value, 
14040 74 68 65 6e 20 6a 75 73 74 20 75 73 65 0d 0a 20  then just use.. 
14050 20 20 20 20 20 23 20 20 20 20 20 20 20 69 74 20       #       it 
14060 76 65 72 62 61 74 69 6d 3b 20 6f 74 68 65 72 77  verbatim; otherw
14070 69 73 65 2c 20 6a 75 73 74 20 72 65 74 75 72 6e  ise, just return
14080 20 61 6e 20 65 6d 70 74 79 20 73 74 72 69 6e 67   an empty string
14090 2e 20 20 49 6e 20 74 68 61 74 0d 0a 20 20 20 20  .  In that..    
140a0 20 20 23 20 20 20 20 20 20 20 63 61 73 65 2c 20    #       case, 
140b0 74 68 65 20 64 65 66 61 75 6c 74 20 63 6f 6e 6e  the default conn
140c0 65 63 74 69 6f 6e 20 66 6c 61 67 73 20 77 69 6c  ection flags wil
140d0 6c 20 62 65 20 75 73 65 64 2e 0d 0a 20 20 20 20  l be used...    
140e0 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b    #..      if {[
140f0 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 76  string length $v
14100 61 6c 75 65 5d 20 3d 3d 20 30 20 7c 7c 20 24 76  alue] == 0 || $v
14110 61 6c 75 65 20 6e 65 20 22 44 65 66 61 75 6c 74  alue ne "Default
14120 22 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  "} then {..     
14130 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
14140 57 41 52 4e 49 4e 47 3a 20 54 68 69 73 20 72 65  WARNING: This re
14150 74 75 72 6e 73 20 74 68 65 20 73 74 72 69 6e 67  turns the string
14160 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 63 6f   value of the co
14170 6d 62 69 6e 65 64 20 66 6c 61 67 73 2c 20 6e 6f  mbined flags, no
14180 74 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  t..        #    
14190 20 20 20 20 20 20 74 68 65 20 65 6e 75 6d 65 72        the enumer
141a0 61 74 65 64 20 76 61 6c 75 65 2e 20 20 54 68 69  ated value.  Thi
141b0 73 20 69 73 20 62 79 20 64 65 73 69 67 6e 20 61  s is by design a
141c0 6e 64 20 73 68 6f 75 6c 64 20 6e 6f 74 0d 0a 20  nd should not.. 
141d0 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 20         #        
141e0 20 20 62 65 20 63 68 61 6e 67 65 64 20 77 69 74    be changed wit
141f0 68 6f 75 74 20 63 61 72 65 66 75 6c 20 63 6f 6e  hout careful con
14200 73 69 64 65 72 61 74 69 6f 6e 20 28 65 2e 67 2e  sideration (e.g.
14210 20 69 74 20 77 6f 75 6c 64 0d 0a 20 20 20 20 20   it would..     
14220 20 20 20 23 20 20 20 20 20 20 20 20 20 20 70 72     #          pr
14230 65 76 65 6e 74 20 74 68 65 20 53 51 4c 69 74 65  event the SQLite
14240 43 6f 6e 6e 65 63 74 69 6f 6e 20 63 6c 61 73 73  Connection class
14250 20 66 72 6f 6d 20 61 6c 6c 6f 77 69 6e 67 20 69   from allowing i
14260 6e 76 61 6c 69 64 0d 0a 20 20 20 20 20 20 20 20  nvalid..        
14270 23 20 20 20 20 20 20 20 20 20 20 5b 22 6d 61 67  #          ["mag
14280 69 63 61 6c 22 5d 20 6d 65 74 61 2d 66 6c 61 67  ical"] meta-flag
14290 73 29 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  s)...        #..
142a0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b          return [
142b0 61 70 70 65 6e 64 41 72 67 73 20 22 46 6c 61 67  appendArgs "Flag
142c0 73 3d 22 20 24 66 6c 61 67 73 20 5c 3b 5d 0d 0a  s=" $flags \;]..
142d0 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
142e0 20 72 65 74 75 72 6e 20 22 22 0d 0a 20 20 20 20   return ""..    
142f0 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 65  }.....    proc e
14300 6e 61 62 6c 65 53 68 61 72 65 64 43 61 63 68 65  nableSharedCache
14310 20 7b 20 63 68 61 6e 6e 65 6c 20 65 6e 61 62 6c   { channel enabl
14320 65 20 7b 71 75 69 65 74 20 66 61 6c 73 65 7d 20  e {quiet false} 
14330 7d 20 7b 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b  } {..      if {[
14340 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20  catch {..       
14350 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d   object invoke -
14360 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63  flags +NonPublic
14370 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
14380 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
14390 74 65 2e 55 6e 73 61 66 65 4e 61 74 69 76 65 4d  te.UnsafeNativeM
143a0 65 74 68 6f 64 73 20 5c 0d 0a 20 20 20 20 20 20  ethods \..      
143b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 65 6e        sqlite3_en
143c0 61 62 6c 65 5f 73 68 61 72 65 64 5f 63 61 63 68  able_shared_cach
143d0 65 20 5b 65 78 70 72 20 69 6e 74 28 24 65 6e 61  e [expr int($ena
143e0 62 6c 65 29 5d 0d 0a 20 20 20 20 20 20 7d 20 72  ble)]..      } r
143f0 65 73 75 6c 74 5d 20 3d 3d 20 30 7d 20 74 68 65  esult] == 0} the
14400 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20  n {..        if 
14410 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b  {!$quiet} then {
14420 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70 75 74  ..          tput
14430 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  s $channel [appe
14440 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
14450 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 61          "---- ca
14460 6c 6c 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c  ll sqlite3_enabl
14470 65 5f 73 68 61 72 65 64 5f 63 61 63 68 65 28 22  e_shared_cache("
14480 20 24 65 6e 61 62 6c 65 20 5c 0d 0a 20 20 20 20   $enable \..    
14490 20 20 20 20 20 20 20 20 20 20 22 29 2e 2e 2e 20            ")... 
144a0 6f 6b 3a 20 22 20 24 72 65 73 75 6c 74 20 5c 6e  ok: " $result \n
144b0 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  ]..        }..  
144c0 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
144d0 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65        if {!$quie
144e0 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  t} then {..     
144f0 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
14500 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
14510 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
14520 20 22 2d 2d 2d 2d 20 63 61 6c 6c 20 73 71 6c 69   "---- call sqli
14530 74 65 33 5f 65 6e 61 62 6c 65 5f 73 68 61 72 65  te3_enable_share
14540 64 5f 63 61 63 68 65 28 22 20 24 65 6e 61 62 6c  d_cache(" $enabl
14550 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e \..           
14560 20 20 20 22 29 2e 2e 2e 20 65 72 72 6f 72 3a 20     ")... error: 
14570 22 20 5c 6e 5c 74 20 24 72 65 73 75 6c 74 20 5c  " \n\t $result \
14580 6e 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20  n]..        }.. 
14590 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c       }..    }...
145a0 0d 0a 20 20 20 20 70 72 6f 63 20 73 65 74 75 70  ..    proc setup
145b0 44 62 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  Db {..          
145c0 20 20 66 69 6c 65 4e 61 6d 65 20 7b 6d 6f 64 65    fileName {mode
145d0 20 22 22 7d 20 7b 64 61 74 65 54 69 6d 65 46 6f   ""} {dateTimeFo
145e0 72 6d 61 74 20 22 22 7d 20 7b 64 61 74 65 54 69  rmat ""} {dateTi
145f0 6d 65 4b 69 6e 64 20 22 22 7d 20 7b 66 6c 61 67  meKind ""} {flag
14600 73 20 22 22 7d 0d 0a 20 20 20 20 20 20 20 20 20  s ""}..         
14610 20 20 20 7b 65 78 74 72 61 20 22 22 7d 20 7b 71     {extra ""} {q
14620 75 61 6c 69 66 79 20 74 72 75 65 7d 20 7b 64 65  ualify true} {de
14630 6c 65 74 65 20 74 72 75 65 7d 20 7b 75 72 69 20  lete true} {uri 
14640 66 61 6c 73 65 7d 0d 0a 20 20 20 20 20 20 20 20  false}..        
14650 20 20 20 20 7b 74 65 6d 70 6f 72 61 72 79 20 74      {temporary t
14660 72 75 65 7d 20 7b 76 61 72 4e 61 6d 65 20 64 62  rue} {varName db
14670 7d 20 7b 71 75 69 65 74 20 66 61 6c 73 65 7d 20  } {quiet false} 
14680 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  } {..      #..  
14690 20 20 20 20 23 20 4e 4f 54 45 3a 20 46 69 72 73      # NOTE: Firs
146a0 74 2c 20 73 65 65 20 69 66 20 6f 75 72 20 63 61  t, see if our ca
146b0 6c 6c 65 72 20 68 61 73 20 72 65 71 75 65 73 74  ller has request
146c0 65 64 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  ed an in-memory 
146d0 64 61 74 61 62 61 73 65 2e 0d 0a 20 20 20 20 20  database...     
146e0 20 23 0d 0a 20 20 20 20 20 20 73 65 74 20 69 73   #..      set is
146f0 4d 65 6d 6f 72 79 20 5b 69 73 4d 65 6d 6f 72 79  Memory [isMemory
14700 44 62 20 24 66 69 6c 65 4e 61 6d 65 5d 0d 0a 0d  Db $fileName]...
14710 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
14720 23 20 4e 4f 54 45 3a 20 46 6f 72 20 6e 6f 77 2c  # NOTE: For now,
14730 20 61 6c 6c 20 74 65 73 74 20 64 61 74 61 62 61   all test databa
14740 73 65 73 20 75 73 65 64 20 62 79 20 74 68 65 20  ses used by the 
14750 74 65 73 74 20 73 75 69 74 65 20 61 72 65 20 70  test suite are p
14760 6c 61 63 65 64 0d 0a 20 20 20 20 20 20 23 20 20  laced..      #  
14770 20 20 20 20 20 69 6e 74 6f 20 74 68 65 20 64 61       into the da
14780 74 61 62 61 73 65 20 64 69 72 65 63 74 6f 72 79  tabase directory
14790 2e 20 20 45 61 63 68 20 64 61 74 61 62 61 73 65  .  Each database
147a0 20 61 6e 64 20 72 65 6c 61 74 65 64 20 66 69 6c   and related fil
147b0 65 73 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  es..      #     
147c0 20 20 75 73 65 64 20 62 79 20 61 20 74 65 73 74    used by a test
147d0 20 73 68 6f 75 6c 64 20 62 65 20 63 6c 65 61 6e   should be clean
147e0 65 64 20 75 70 20 62 79 20 74 68 61 74 20 74 65  ed up by that te
147f0 73 74 20 75 73 69 6e 67 20 74 68 65 0d 0a 20 20  st using the..  
14800 20 20 20 20 23 20 20 20 20 20 20 20 22 63 6c 65      #       "cle
14810 61 6e 75 70 44 62 22 20 70 72 6f 63 65 64 75 72  anupDb" procedur
14820 65 2c 20 62 65 6c 6f 77 2e 0d 0a 20 20 20 20 20  e, below...     
14830 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 21 24   #..      if {!$
14840 69 73 4d 65 6d 6f 72 79 20 26 26 20 24 71 75 61  isMemory && $qua
14850 6c 69 66 79 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  lify} then {..  
14860 20 20 20 20 20 20 73 65 74 20 66 69 6c 65 4e 61        set fileNa
14870 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5b 67  me [file join [g
14880 65 74 44 61 74 61 62 61 73 65 44 69 72 65 63 74  etDatabaseDirect
14890 6f 72 79 5d 20 5b 66 69 6c 65 20 74 61 69 6c 20  ory] [file tail 
148a0 24 66 69 6c 65 4e 61 6d 65 5d 5d 0d 0a 20 20 20  $fileName]]..   
148b0 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d     }....      #.
148c0 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 42  .      # NOTE: B
148d0 79 20 64 65 66 61 75 6c 74 2c 20 64 65 6c 65 74  y default, delet
148e0 65 20 61 6e 79 20 70 72 65 2d 65 78 69 73 74 69  e any pre-existi
148f0 6e 67 20 64 61 74 61 62 61 73 65 20 77 69 74 68  ng database with
14900 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65 0d 0a   the same file..
14910 20 20 20 20 20 20 23 20 20 20 20 20 20 20 6e 61        #       na
14920 6d 65 20 69 66 20 69 74 20 63 75 72 72 65 6e 74  me if it current
14930 6c 79 20 65 78 69 73 74 73 2e 0d 0a 20 20 20 20  ly exists...    
14940 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 21    #..      if {!
14950 24 69 73 4d 65 6d 6f 72 79 20 26 26 20 24 64 65  $isMemory && $de
14960 6c 65 74 65 20 26 26 20 5b 66 69 6c 65 20 65 78  lete && [file ex
14970 69 73 74 73 20 24 66 69 6c 65 4e 61 6d 65 5d 7d  ists $fileName]}
14980 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
14990 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
149a0 54 45 3a 20 41 74 74 65 6d 70 74 20 74 6f 20 64  TE: Attempt to d
149b0 65 6c 65 74 65 20 61 6e 79 20 70 72 65 2d 65 78  elete any pre-ex
149c0 69 73 74 69 6e 67 20 64 61 74 61 62 61 73 65 20  isting database 
149d0 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 66 69  with the same fi
149e0 6c 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  le..        #   
149f0 20 20 20 20 6e 61 6d 65 2e 0d 0a 20 20 20 20 20      name...     
14a00 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 69 66     #..        if
14a10 20 7b 5b 63 61 74 63 68 20 7b 66 69 6c 65 20 64   {[catch {file d
14a20 65 6c 65 74 65 20 24 66 69 6c 65 4e 61 6d 65 7d  elete $fileName}
14a30 20 65 72 72 6f 72 5d 7d 20 74 68 65 6e 20 7b 0d   error]} then {.
14a40 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
14a50 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
14a60 57 65 20 73 6f 6d 65 68 6f 77 20 66 61 69 6c 65  We somehow faile
14a70 64 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20  d to delete the 
14a80 66 69 6c 65 2c 20 72 65 70 6f 72 74 20 77 68 79  file, report why
14a90 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a  ...          #..
14aa0 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 24            if {!$
14ab0 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20  quiet} then {.. 
14ac0 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
14ad0 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
14ae0 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
14af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14b00 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66  "==== WARNING: f
14b10 61 69 6c 65 64 20 74 6f 20 64 65 6c 65 74 65 20  ailed to delete 
14b20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 5c 22  database file \"
14b30 22 20 24 66 69 6c 65 4e 61 6d 65 20 5c 0d 0a 20  " $fileName \.. 
14b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
14b50 5c 22 20 64 75 72 69 6e 67 20 73 65 74 75 70 2c  \" during setup,
14b60 20 65 72 72 6f 72 3a 20 22 20 5c 6e 5c 74 20 24   error: " \n\t $
14b70 65 72 72 6f 72 20 5c 6e 5d 0d 0a 20 20 20 20 20  error \n]..     
14b80 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
14b90 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  }..      }....  
14ba0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
14bb0 4f 54 45 3a 20 52 65 66 65 72 20 74 6f 20 74 68  OTE: Refer to th
14bc0 65 20 73 70 65 63 69 66 69 65 64 20 76 61 72 69  e specified vari
14bd0 61 62 6c 65 20 28 65 2e 67 2e 20 22 64 62 22 29  able (e.g. "db")
14be0 20 69 6e 20 74 68 65 20 63 6f 6e 74 65 78 74 20   in the context 
14bf0 6f 66 20 6f 75 72 0d 0a 20 20 20 20 20 20 23 20  of our..      # 
14c00 20 20 20 20 20 20 63 61 6c 6c 65 72 2e 20 20 54        caller.  T
14c10 68 65 20 68 61 6e 64 6c 65 20 74 6f 20 74 68 65  he handle to the
14c20 20 6f 70 65 6e 65 64 20 64 61 74 61 62 61 73 65   opened database
14c30 20 77 69 6c 6c 20 62 65 20 73 74 6f 72 65 64 20   will be stored 
14c40 74 68 65 72 65 2e 0d 0a 20 20 20 20 20 20 23 0d  there...      #.
14c50 0a 20 20 20 20 20 20 75 70 76 61 72 20 31 20 24  .      upvar 1 $
14c60 76 61 72 4e 61 6d 65 20 64 62 0d 0a 0d 0a 20 20  varName db....  
14c70 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
14c80 4f 54 45 3a 20 53 74 61 72 74 20 62 75 69 6c 64  OTE: Start build
14c90 69 6e 67 20 74 68 65 20 63 6f 6e 6e 65 63 74 69  ing the connecti
14ca0 6f 6e 20 73 74 72 69 6e 67 2e 20 20 54 68 65 20  on string.  The 
14cb0 6f 6e 6c 79 20 72 65 71 75 69 72 65 64 20 70 6f  only required po
14cc0 72 74 69 6f 6e 0d 0a 20 20 20 20 20 20 23 20 20  rtion..      #  
14cd0 20 20 20 20 20 6f 66 20 74 68 65 20 63 6f 6e 6e       of the conn
14ce0 65 63 74 69 6f 6e 20 73 74 72 69 6e 67 20 69 73  ection string is
14cf0 20 74 68 65 20 64 61 74 61 20 73 6f 75 72 63 65   the data source
14d00 2c 20 77 68 69 63 68 20 63 6f 6e 74 61 69 6e 73  , which contains
14d10 20 74 68 65 0d 0a 20 20 20 20 20 20 23 20 20 20   the..      #   
14d20 20 20 20 20 64 61 74 61 62 61 73 65 20 66 69 6c      database fil
14d30 65 20 6e 61 6d 65 20 69 74 73 65 6c 66 2e 20 20  e name itself.  
14d40 49 66 20 6f 75 72 20 63 61 6c 6c 65 72 20 77 61  If our caller wa
14d50 6e 74 73 20 74 6f 20 75 73 65 20 61 20 55 52 49  nts to use a URI
14d60 20 61 73 0d 0a 20 20 20 20 20 20 23 20 20 20 20   as..      #    
14d70 20 20 20 74 68 65 20 64 61 74 61 20 73 6f 75 72     the data sour
14d80 63 65 2c 20 75 73 65 20 74 68 65 20 46 75 6c 6c  ce, use the Full
14d90 55 72 69 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73  Uri connection s
14da0 74 72 69 6e 67 20 70 72 6f 70 65 72 74 79 20 74  tring property t
14db0 6f 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  o..      #      
14dc0 20 70 72 65 76 65 6e 74 20 74 68 65 20 64 61 74   prevent the dat
14dd0 61 20 73 6f 75 72 63 65 20 73 74 72 69 6e 67 20  a source string 
14de0 66 72 6f 6d 20 62 65 69 6e 67 20 6d 61 6e 67 6c  from being mangl
14df0 65 64 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  ed...      #..  
14e00 20 20 20 20 69 66 20 7b 24 75 72 69 7d 20 74 68      if {$uri} th
14e10 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 65  en {..        se
14e20 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 7b 46 75  t connection {Fu
14e30 6c 6c 55 72 69 3d 24 7b 66 69 6c 65 4e 61 6d 65  llUri=${fileName
14e40 7d 7d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65  }}..      } else
14e50 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20   {..        set 
14e60 63 6f 6e 6e 65 63 74 69 6f 6e 20 7b 44 61 74 61  connection {Data
14e70 20 53 6f 75 72 63 65 3d 24 7b 66 69 6c 65 4e 61   Source=${fileNa
14e80 6d 65 7d 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d  me}}..      }...
14e90 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
14ea0 23 20 4e 4f 54 45 3a 20 53 69 6e 63 65 20 74 68  # NOTE: Since th
14eb0 69 73 20 70 72 6f 63 65 64 75 72 65 20 68 61 73  is procedure has
14ec0 20 6e 6f 20 73 70 65 63 69 61 6c 20 6b 6e 6f 77   no special know
14ed0 6c 65 64 67 65 20 6f 66 20 77 68 61 74 20 74 68  ledge of what th
14ee0 65 20 64 65 66 61 75 6c 74 0d 0a 20 20 20 20 20  e default..     
14ef0 20 23 20 20 20 20 20 20 20 73 65 74 74 69 6e 67   #       setting
14f00 20 69 73 20 66 6f 72 20 74 68 65 20 54 6f 46 75   is for the ToFu
14f10 6c 6c 50 61 74 68 20 63 6f 6e 6e 65 63 74 69 6f  llPath connectio
14f20 6e 20 73 74 72 69 6e 67 20 70 72 6f 70 65 72 79  n string propery
14f30 2c 20 61 6c 77 61 79 73 0d 0a 20 20 20 20 20 20  , always..      
14f40 23 20 20 20 20 20 20 20 61 64 64 20 74 68 65 20  #       add the 
14f50 76 61 6c 75 65 20 77 65 20 6b 6e 6f 77 20 61 62  value we know ab
14f60 6f 75 74 20 74 6f 20 74 68 65 20 63 6f 6e 6e 65  out to the conne
14f70 63 74 69 6f 6e 20 73 74 72 69 6e 67 2e 0d 0a 20  ction string... 
14f80 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 61 70       #..      ap
14f90 70 65 6e 64 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  pend connection 
14fa0 7b 3b 54 6f 46 75 6c 6c 50 61 74 68 3d 24 7b 71  {;ToFullPath=${q
14fb0 75 61 6c 69 66 79 7d 7d 0d 0a 0d 0a 20 20 20 20  ualify}}....    
14fc0 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
14fd0 45 3a 20 49 66 20 6f 75 72 20 63 61 6c 6c 65 72  E: If our caller
14fe0 20 73 70 65 63 69 66 69 65 64 20 61 20 6a 6f 75   specified a jou
14ff0 72 6e 61 6c 20 6d 6f 64 65 2c 20 61 64 64 20 74  rnal mode, add t
15000 68 65 20 6e 65 63 65 73 73 61 72 79 20 70 6f 72  he necessary por
15010 74 69 6f 6e 0d 0a 20 20 20 20 20 20 23 20 20 20  tion..      #   
15020 20 20 20 20 6f 66 20 74 68 65 20 63 6f 6e 6e 65      of the conne
15030 63 74 69 6f 6e 20 73 74 72 69 6e 67 20 6e 6f 77  ction string now
15040 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
15050 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65    if {[string le
15060 6e 67 74 68 20 24 6d 6f 64 65 5d 20 3e 20 30 7d  ngth $mode] > 0}
15070 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
15080 20 61 70 70 65 6e 64 20 63 6f 6e 6e 65 63 74 69   append connecti
15090 6f 6e 20 7b 3b 4a 6f 75 72 6e 61 6c 20 4d 6f 64  on {;Journal Mod
150a0 65 3d 24 7b 6d 6f 64 65 7d 7d 0d 0a 20 20 20 20  e=${mode}}..    
150b0 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a    }....      #..
150c0 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 66        # NOTE: If
150d0 20 6f 75 72 20 63 61 6c 6c 65 72 20 73 70 65 63   our caller spec
150e0 69 66 69 65 64 20 61 20 44 61 74 65 54 69 6d 65  ified a DateTime
150f0 20 66 6f 72 6d 61 74 2c 20 61 64 64 20 74 68 65   format, add the
15100 20 6e 65 63 65 73 73 61 72 79 0d 0a 20 20 20 20   necessary..    
15110 20 20 23 20 20 20 20 20 20 20 70 6f 72 74 69 6f    #       portio
15120 6e 20 6f 66 20 74 68 65 20 63 6f 6e 6e 65 63 74  n of the connect
15130 69 6f 6e 20 73 74 72 69 6e 67 20 6e 6f 77 2e 0d  ion string now..
15140 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
15150 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67  if {[string leng
15160 74 68 20 24 64 61 74 65 54 69 6d 65 46 6f 72 6d  th $dateTimeForm
15170 61 74 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d  at] > 0} then {.
15180 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 20  .        append 
15190 63 6f 6e 6e 65 63 74 69 6f 6e 20 7b 3b 44 61 74  connection {;Dat
151a0 65 54 69 6d 65 46 6f 72 6d 61 74 3d 24 7b 64 61  eTimeFormat=${da
151b0 74 65 54 69 6d 65 46 6f 72 6d 61 74 7d 7d 0d 0a  teTimeFormat}}..
151c0 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
151d0 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
151e0 3a 20 49 66 20 6f 75 72 20 63 61 6c 6c 65 72 20  : If our caller 
151f0 73 70 65 63 69 66 69 65 64 20 61 20 44 61 74 65  specified a Date
15200 54 69 6d 65 4b 69 6e 64 2c 20 61 64 64 20 74 68  TimeKind, add th
15210 65 20 6e 65 63 65 73 73 61 72 79 20 70 6f 72 74  e necessary port
15220 69 6f 6e 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ion..      #    
15230 20 20 20 6f 66 20 74 68 65 20 63 6f 6e 6e 65 63     of the connec
15240 74 69 6f 6e 20 73 74 72 69 6e 67 20 6e 6f 77 2e  tion string now.
15250 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
15260 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e   if {[string len
15270 67 74 68 20 24 64 61 74 65 54 69 6d 65 4b 69 6e  gth $dateTimeKin
15280 64 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  d] > 0} then {..
15290 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 20 63          append c
152a0 6f 6e 6e 65 63 74 69 6f 6e 20 7b 3b 44 61 74 65  onnection {;Date
152b0 54 69 6d 65 4b 69 6e 64 3d 24 7b 64 61 74 65 54  TimeKind=${dateT
152c0 69 6d 65 4b 69 6e 64 7d 7d 0d 0a 20 20 20 20 20  imeKind}}..     
152d0 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20   }....      #.. 
152e0 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 46 69 67       # NOTE: Fig
152f0 75 72 65 20 6f 75 74 20 77 68 61 74 20 74 68 65  ure out what the
15300 20 66 69 6e 61 6c 20 66 6c 61 67 73 20 66 6f 72   final flags for
15310 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e   this connection
15320 20 6e 65 65 64 20 74 6f 20 62 65 2e 0d 0a 20 20   need to be...  
15330 20 20 20 20 23 0d 0a 20 20 20 20 20 20 73 65 74      #..      set
15340 20 66 6c 61 67 73 20 5b 67 65 74 43 6f 6e 6e 65   flags [getConne
15350 63 74 69 6f 6e 46 6c 61 67 73 20 24 66 69 6c 65  ctionFlags $file
15360 4e 61 6d 65 20 24 66 6c 61 67 73 20 24 71 75 69  Name $flags $qui
15370 65 74 5d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a  et]....      #..
15380 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 66        # NOTE: If
15390 20 6f 75 72 20 63 61 6c 6c 65 72 20 73 70 65 63   our caller spec
153a0 69 66 69 65 64 20 73 6f 6d 65 20 53 51 4c 69 74  ified some SQLit
153b0 65 43 6f 6e 6e 65 63 74 69 6f 6e 46 6c 61 67 73  eConnectionFlags
153c0 2c 20 61 64 64 20 74 68 65 0d 0a 20 20 20 20 20  , add the..     
153d0 20 23 20 20 20 20 20 20 20 6e 65 63 65 73 73 61   #       necessa
153e0 72 79 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68  ry portion of th
153f0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 74 72  e connection str
15400 69 6e 67 20 6e 6f 77 2e 0d 0a 20 20 20 20 20 20  ing now...      
15410 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 73 74  #..      if {[st
15420 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 66 6c 61  ring length $fla
15430 67 73 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d  gs] > 0} then {.
15440 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 20  .        append 
15450 63 6f 6e 6e 65 63 74 69 6f 6e 20 7b 3b 46 6c 61  connection {;Fla
15460 67 73 3d 24 7b 66 6c 61 67 73 7d 7d 0d 0a 20 20  gs=${flags}}..  
15470 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23      }....      #
15480 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
15490 49 66 20 6f 75 72 20 63 61 6c 6c 65 72 20 73 70  If our caller sp
154a0 65 63 69 66 69 65 64 20 61 6e 20 65 78 74 72 61  ecified an extra
154b0 20 70 61 79 6c 6f 61 64 20 74 6f 20 74 68 65 20   payload to the 
154c0 63 6f 6e 6e 65 63 74 69 6f 6e 0d 0a 20 20 20 20  connection..    
154d0 20 20 23 20 20 20 20 20 20 20 73 74 72 69 6e 67    #       string
154e0 2c 20 61 70 70 65 6e 64 20 69 74 20 6e 6f 77 2e  , append it now.
154f0 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
15500 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e   if {[string len
15510 67 74 68 20 24 65 78 74 72 61 5d 20 3e 20 30 7d  gth $extra] > 0}
15520 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
15530 20 61 70 70 65 6e 64 20 63 6f 6e 6e 65 63 74 69   append connecti
15540 6f 6e 20 5c 3b 20 24 65 78 74 72 61 0d 0a 20 20  on \; $extra..  
15550 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23      }....      #
15560 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
15570 4f 70 65 6e 20 74 68 65 20 64 61 74 61 62 61 73  Open the databas
15580 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6e 6f 77  e connection now
15590 2c 20 70 6c 61 63 69 6e 67 20 74 68 65 20 6f 70  , placing the op
155a0 61 71 75 65 20 68 61 6e 64 6c 65 20 76 61 6c 75  aque handle valu
155b0 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  e..      #      
155c0 20 69 6e 74 6f 20 74 68 65 20 76 61 72 69 61 62   into the variab
155d0 6c 65 20 73 70 65 63 69 66 69 65 64 20 62 79 20  le specified by 
155e0 6f 75 72 20 63 61 6c 6c 65 72 2e 0d 0a 20 20 20  our caller...   
155f0 20 20 20 23 0d 0a 20 20 20 20 20 20 73 65 74 20     #..      set 
15600 64 62 20 5b 73 71 6c 20 6f 70 65 6e 20 2d 74 79  db [sql open -ty
15610 70 65 20 53 51 4c 69 74 65 20 5b 73 75 62 73 74  pe SQLite [subst
15620 20 24 63 6f 6e 6e 65 63 74 69 6f 6e 5d 5d 0d 0a   $connection]]..
15630 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
15640 20 23 20 4e 4f 54 45 3a 20 43 6f 6e 66 69 67 75   # NOTE: Configu
15650 72 65 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  re the temporary
15660 20 64 69 72 65 63 74 6f 72 79 20 66 6f 72 20 74   directory for t
15670 68 65 20 6e 65 77 6c 79 20 6f 70 65 6e 65 64 20  he newly opened 
15680 64 61 74 61 62 61 73 65 0d 0a 20 20 20 20 20 20  database..      
15690 23 20 20 20 20 20 20 20 63 6f 6e 6e 65 63 74 69  #       connecti
156a0 6f 6e 20 6e 6f 77 20 75 6e 6c 65 73 73 20 6f 75  on now unless ou
156b0 72 20 63 61 6c 6c 65 72 20 66 6f 72 62 69 64 73  r caller forbids
156c0 20 69 74 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20   it...      #.. 
156d0 20 20 20 20 20 69 66 20 7b 24 74 65 6d 70 6f 72       if {$tempor
156e0 61 72 79 20 26 26 20 21 5b 69 6e 66 6f 20 65 78  ary && ![info ex
156f0 69 73 74 73 20 3a 3a 6e 6f 28 73 65 74 54 65 6d  ists ::no(setTem
15700 70 6f 72 61 72 79 44 69 72 65 63 74 6f 72 79 29  poraryDirectory)
15710 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
15720 20 20 20 73 71 6c 20 65 78 65 63 75 74 65 20 24     sql execute $
15730 64 62 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  db [appendArgs \
15740 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 50  ..            "P
15750 52 41 47 4d 41 20 74 65 6d 70 5f 73 74 6f 72 65  RAGMA temp_store
15760 5f 64 69 72 65 63 74 6f 72 79 20 3d 20 5c 22 22  _directory = \""
15770 20 5b 67 65 74 54 65 6d 70 6f 72 61 72 79 44 69   [getTemporaryDi
15780 72 65 63 74 6f 72 79 5d 20 5c 22 5c 3b 5d 0d 0a  rectory] \"\;]..
15790 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
157a0 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
157b0 3a 20 50 65 72 66 6f 72 6d 20 61 6e 79 20 65 78  : Perform any ex
157c0 74 72 61 20 70 65 72 2d 63 6f 6e 6e 65 63 74 69  tra per-connecti
157d0 6f 6e 20 73 65 74 75 70 20 66 6f 72 20 74 68 65  on setup for the
157e0 20 6e 65 77 6c 79 20 6f 70 65 6e 65 64 0d 0a 20   newly opened.. 
157f0 20 20 20 20 20 23 20 20 20 20 20 20 20 64 61 74       #       dat
15800 61 62 61 73 65 20 6e 6f 77 20 75 6e 6c 65 73 73  abase now unless
15810 20 6f 75 72 20 63 61 6c 6c 65 72 20 66 6f 72 62   our caller forb
15820 69 64 73 20 69 74 2e 0d 0a 20 20 20 20 20 20 23  ids it...      #
15830 0d 0a 20 20 20 20 20 20 73 65 74 20 65 78 65 63  ..      set exec
15840 75 74 65 4f 6e 53 65 74 75 70 20 5b 67 65 74 45  uteOnSetup [getE
15850 78 65 63 75 74 65 4f 6e 53 65 74 75 70 5d 0d 0a  xecuteOnSetup]..
15860 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72  ..      if {[str
15870 69 6e 67 20 6c 65 6e 67 74 68 20 24 65 78 65 63  ing length $exec
15880 75 74 65 4f 6e 53 65 74 75 70 5d 20 3e 20 30 20  uteOnSetup] > 0 
15890 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  && \..          
158a0 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  ![info exists ::
158b0 6e 6f 28 65 78 65 63 75 74 65 4f 6e 53 65 74 75  no(executeOnSetu
158c0 70 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  p)]} then {..   
158d0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
158e0 23 20 4e 4f 54 45 3a 20 54 68 69 73 20 63 6f 6d  # NOTE: This com
158f0 6d 61 6e 64 20 6d 61 79 20 72 61 69 73 65 20 61  mand may raise a
15900 6e 20 65 72 72 6f 72 3b 20 69 66 20 73 6f 2c 20  n error; if so, 
15910 74 68 61 74 20 69 73 20 66 69 6e 65 2c 20 61 73  that is fine, as
15920 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
15930 20 20 74 68 65 20 65 6e 63 6c 6f 73 69 6e 67 20    the enclosing 
15940 74 65 73 74 20 77 69 6c 6c 20 74 68 65 6e 20 66  test will then f
15950 61 69 6c 2e 20 20 54 68 65 20 5b 73 75 62 73 74  ail.  The [subst
15960 5d 20 63 6f 6d 6d 61 6e 64 20 69 73 0d 0a 20 20  ] command is..  
15970 20 20 20 20 20 20 23 20 20 20 20 20 20 20 75 73        #       us
15980 65 64 20 6f 6e 20 74 68 65 20 53 51 4c 20 69 6e  ed on the SQL in
15990 20 63 61 73 65 20 69 74 20 6e 65 65 64 73 20 74   case it needs t
159a0 6f 20 72 65 66 65 72 20 74 6f 20 73 74 61 74 65  o refer to state
159b0 20 69 6e 20 6f 75 72 0d 0a 20 20 20 20 20 20 20   in our..       
159c0 20 23 20 20 20 20 20 20 20 63 6f 6e 74 65 78 74   #       context
159d0 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
159e0 20 20 20 20 20 20 73 71 6c 20 65 78 65 63 75 74        sql execut
159f0 65 20 24 64 62 20 5b 73 75 62 73 74 20 24 65 78  e $db [subst $ex
15a00 65 63 75 74 65 4f 6e 53 65 74 75 70 5d 0d 0a 20  ecuteOnSetup].. 
15a10 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
15a20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
15a30 20 41 6c 77 61 79 73 20 72 65 74 75 72 6e 20 74   Always return t
15a40 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61  he connection ha
15a50 6e 64 6c 65 20 75 70 6f 6e 20 73 75 63 63 65 73  ndle upon succes
15a60 73 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  s...      #..   
15a70 20 20 20 72 65 74 75 72 6e 20 24 64 62 0d 0a 20     return $db.. 
15a80 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
15a90 63 20 67 65 74 44 62 43 6f 6e 6e 65 63 74 69 6f  c getDbConnectio
15aa0 6e 20 7b 20 7b 76 61 72 4e 61 6d 65 20 64 62 7d  n { {varName db}
15ab0 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20   } {..      #.. 
15ac0 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 52 65 66       # NOTE: Ref
15ad0 65 72 20 74 6f 20 74 68 65 20 73 70 65 63 69 66  er to the specif
15ae0 69 65 64 20 76 61 72 69 61 62 6c 65 20 28 65 2e  ied variable (e.
15af0 67 2e 20 22 64 62 22 29 20 69 6e 20 74 68 65 20  g. "db") in the 
15b00 63 6f 6e 74 65 78 74 20 6f 66 20 6f 75 72 0d 0a  context of our..
15b10 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63 61        #       ca
15b20 6c 6c 65 72 2e 20 20 54 68 65 20 68 61 6e 64 6c  ller.  The handl
15b30 65 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  e to the databas
15b40 65 20 70 72 65 76 69 6f 75 73 6c 79 20 6f 70 65  e previously ope
15b50 6e 65 64 20 76 69 61 20 74 68 65 0d 0a 20 20 20  ned via the..   
15b60 20 20 20 23 20 20 20 20 20 20 20 5b 73 65 74 75     #       [setu
15b70 70 44 62 5d 20 70 72 6f 63 65 64 75 72 65 20 73  pDb] procedure s
15b80 68 6f 75 6c 64 20 62 65 20 73 74 6f 72 65 64 20  hould be stored 
15b90 74 68 65 72 65 2e 0d 0a 20 20 20 20 20 20 23 0d  there...      #.
15ba0 0a 20 20 20 20 20 20 75 70 76 61 72 20 31 20 24  .      upvar 1 $
15bb0 76 61 72 4e 61 6d 65 20 64 62 0d 0a 0d 0a 20 20  varName db....  
15bc0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
15bd0 4f 54 45 3a 20 54 68 69 73 20 72 65 74 75 72 6e  OTE: This return
15be0 73 20 74 68 65 20 41 44 4f 2e 4e 45 54 20 49 44  s the ADO.NET ID
15bf0 62 43 6f 6e 6e 65 63 74 69 6f 6e 20 6f 62 6a 65  bConnection obje
15c00 63 74 20 69 6e 73 74 61 6e 63 65 20 66 6f 72 20  ct instance for 
15c10 74 68 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20  the..      #    
15c20 20 20 20 73 70 65 63 69 66 69 65 64 20 64 61 74     specified dat
15c30 61 62 73 65 20 68 61 6e 64 6c 65 2e 20 20 53 69  abse handle.  Si
15c40 6e 63 65 20 67 65 74 74 69 6e 67 20 74 68 69 73  nce getting this
15c50 20 6f 62 6a 65 63 74 20 72 65 6c 69 65 73 20 75   object relies u
15c60 70 6f 6e 0d 0a 20 20 20 20 20 20 23 20 20 20 20  pon..      #    
15c70 20 20 20 45 61 67 6c 65 20 69 6e 74 65 72 6e 61     Eagle interna
15c80 6c 73 2c 20 67 72 65 61 74 20 63 61 72 65 20 73  ls, great care s
15c90 68 6f 75 6c 64 20 62 65 20 74 61 6b 65 6e 20 74  hould be taken t
15ca0 6f 20 61 76 6f 69 64 20 64 69 73 70 6f 73 69 6e  o avoid disposin
15cb0 67 20 6f 66 0d 0a 20 20 20 20 20 20 23 20 20 20  g of..      #   
15cc0 20 20 20 20 74 68 69 73 20 6f 62 6a 65 63 74 20      this object 
15cd0 6f 72 20 6f 74 68 65 72 77 69 73 65 20 70 75 74  or otherwise put
15ce0 74 69 6e 67 20 69 74 20 69 6e 74 6f 20 61 6e 20  ting it into an 
15cf0 69 6e 76 61 6c 69 64 20 73 74 61 74 65 2e 0d 0a  invalid state...
15d00 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69        #..      i
15d10 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20  f {[info exists 
15d20 64 62 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  db]} then {..   
15d30 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20       if {[catch 
15d40 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 6f 62 6a  {..          obj
15d50 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67  ect invoke -flag
15d60 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 2d 6f 62  s +NonPublic -ob
15d70 6a 65 63 74 66 6c 61 67 73 20 2b 4e 6f 44 69 73  jectflags +NoDis
15d80 70 6f 73 65 20 2d 61 6c 69 61 73 20 5c 0d 0a 20  pose -alias \.. 
15d90 20 20 20 20 20 20 20 20 20 20 20 20 20 49 6e 74               Int
15da0 65 72 70 72 65 74 65 72 2e 47 65 74 41 63 74 69  erpreter.GetActi
15db0 76 65 2e 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 49  ve.connections I
15dc0 74 65 6d 20 24 64 62 0d 0a 20 20 20 20 20 20 20  tem $db..       
15dd0 20 7d 20 72 65 73 75 6c 74 5d 20 3d 3d 20 30 7d   } result] == 0}
15de0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
15df0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
15e00 23 20 4e 4f 54 45 3a 20 53 75 63 63 65 73 73 2c  # NOTE: Success,
15e10 20 72 65 74 75 72 6e 20 74 68 65 20 6f 70 61 71   return the opaq
15e20 75 65 20 6f 62 6a 65 63 74 20 68 61 6e 64 6c 65  ue object handle
15e30 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a  ...          #..
15e40 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
15e50 20 24 72 65 73 75 6c 74 0d 0a 20 20 20 20 20 20   $result..      
15e60 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
15e70 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
15e80 20 20 20 23 20 4e 4f 54 45 3a 20 46 61 69 6c 75     # NOTE: Failu
15e90 72 65 2c 20 72 65 70 6f 72 74 20 77 68 79 2e 0d  re, report why..
15ea0 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
15eb0 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
15ec0 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61  :test_channel [a
15ed0 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
15ee0 20 20 20 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d             "====
15ef0 20 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64   WARNING: failed
15f00 20 74 6f 20 67 65 74 20 63 6f 6e 6e 65 63 74 69   to get connecti
15f10 6f 6e 20 68 61 6e 64 6c 65 20 66 6f 72 20 64 61  on handle for da
15f20 74 61 62 61 73 65 20 5c 22 22 20 5c 0d 0a 20 20  tabase \"" \..  
15f30 20 20 20 20 20 20 20 20 20 20 20 20 24 64 62 20              $db 
15f40 22 5c 22 2c 20 65 72 72 6f 72 3a 20 22 20 5c 6e  "\", error: " \n
15f50 5c 74 20 24 72 65 73 75 6c 74 20 5c 6e 5d 0d 0a  \t $result \n]..
15f60 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
15f70 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20   }....      #.. 
15f80 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 46 61 69       # NOTE: Fai
15f90 6c 75 72 65 2c 20 72 65 74 75 72 6e 20 61 6e 20  lure, return an 
15fa0 6f 62 76 69 6f 75 73 6c 79 20 69 6e 76 61 6c 69  obviously invali
15fb0 64 20 6f 70 61 71 75 65 20 6f 62 6a 65 63 74 20  d opaque object 
15fc0 68 61 6e 64 6c 65 2e 0d 0a 20 20 20 20 20 20 23  handle...      #
15fd0 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 22  ..      return "
15fe0 22 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  "..    }.....   
15ff0 20 70 72 6f 63 20 66 72 65 65 44 62 43 6f 6e 6e   proc freeDbConn
16000 65 63 74 69 6f 6e 20 7b 20 7b 76 61 72 4e 61 6d  ection { {varNam
16010 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 7d 20 7d 20  e connection} } 
16020 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  {..      #..    
16030 20 20 23 20 4e 4f 54 45 3a 20 52 65 66 65 72 20    # NOTE: Refer 
16040 74 6f 20 74 68 65 20 73 70 65 63 69 66 69 65 64  to the specified
16050 20 76 61 72 69 61 62 6c 65 20 28 65 2e 67 2e 20   variable (e.g. 
16060 22 63 6f 6e 6e 65 63 74 69 6f 6e 22 29 20 69 6e  "connection") in
16070 20 74 68 65 0d 0a 20 20 20 20 20 20 23 20 20 20   the..      #   
16080 20 20 20 20 63 6f 6e 74 65 78 74 20 6f 66 20 6f      context of o
16090 75 72 20 63 61 6c 6c 65 72 2e 20 20 54 68 65 20  ur caller.  The 
160a0 6f 70 61 71 75 65 20 6f 62 6a 65 63 74 20 68 61  opaque object ha
160b0 6e 64 6c 65 20 66 6f 72 20 61 6e 20 41 44 4f 2e  ndle for an ADO.
160c0 4e 45 54 0d 0a 20 20 20 20 20 20 23 20 20 20 20  NET..      #    
160d0 20 20 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 72     connection pr
160e0 65 76 69 6f 75 73 6c 79 20 72 65 74 75 72 6e 65  eviously returne
160f0 64 20 62 79 20 5b 67 65 74 44 62 43 6f 6e 6e 65  d by [getDbConne
16100 63 74 69 6f 6e 5d 20 73 68 6f 75 6c 64 20 62 65  ction] should be
16110 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
16120 73 74 6f 72 65 64 20 74 68 65 72 65 2e 0d 0a 20  stored there... 
16130 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 75 70       #..      up
16140 76 61 72 20 31 20 24 76 61 72 4e 61 6d 65 20 63  var 1 $varName c
16150 6f 6e 6e 65 63 74 69 6f 6e 0d 0a 0d 0a 20 20 20  onnection....   
16160 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
16170 54 45 3a 20 41 74 74 65 6d 70 74 20 74 6f 20 72  TE: Attempt to r
16180 65 6d 6f 76 65 20 74 68 65 20 6f 70 61 71 75 65  emove the opaque
16190 20 6f 62 6a 65 63 74 20 68 61 6e 64 6c 65 20 66   object handle f
161a0 72 6f 6d 20 74 68 65 20 69 6e 74 65 72 70 72 65  rom the interpre
161b0 74 65 72 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ter..      #    
161c0 20 20 20 6e 6f 77 2e 20 20 54 68 69 73 20 5b 6f     now.  This [o
161d0 62 6a 65 63 74 20 64 69 73 70 6f 73 65 5d 20 63  bject dispose] c
161e0 61 6c 6c 20 77 69 6c 6c 20 6e 6f 74 20 61 63 74  all will not act
161f0 75 61 6c 6c 79 20 64 69 73 70 6f 73 65 20 6f 66  ually dispose of
16200 20 74 68 65 0d 0a 20 20 20 20 20 20 23 20 20 20   the..      #   
16210 20 20 20 20 75 6e 64 65 72 6c 79 69 6e 67 20 6f      underlying o
16220 62 6a 65 63 74 20 62 65 63 61 75 73 65 20 74 68  bject because th
16230 65 20 2b 4e 6f 44 69 73 70 6f 73 65 20 66 6c 61  e +NoDispose fla
16240 67 20 77 61 73 20 73 65 74 20 6f 6e 20 69 74 0d  g was set on it.
16250 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 64  .      #       d
16260 75 72 69 6e 67 20 63 72 65 61 74 69 6f 6e 20 6f  uring creation o
16270 66 20 74 68 65 20 6f 70 61 71 75 65 20 6f 62 6a  f the opaque obj
16280 65 63 74 20 68 61 6e 64 6c 65 2e 0d 0a 20 20 20  ect handle...   
16290 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
162a0 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 63 6f 6e  [info exists con
162b0 6e 65 63 74 69 6f 6e 5d 20 26 26 20 5c 0d 0a 20  nection] && \.. 
162c0 20 20 20 20 20 20 20 20 20 5b 63 61 74 63 68 20           [catch 
162d0 7b 6f 62 6a 65 63 74 20 64 69 73 70 6f 73 65 20  {object dispose 
162e0 24 63 6f 6e 6e 65 63 74 69 6f 6e 7d 20 65 72 72  $connection} err
162f0 6f 72 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  or]} then {..   
16300 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
16310 23 20 4e 4f 54 45 3a 20 57 65 20 73 6f 6d 65 68  # NOTE: We someh
16320 6f 77 20 66 61 69 6c 65 64 20 74 6f 20 72 65 6d  ow failed to rem
16330 6f 76 65 20 74 68 65 20 68 61 6e 64 6c 65 2c 20  ove the handle, 
16340 72 65 70 6f 72 74 20 77 68 79 2e 0d 0a 20 20 20  report why...   
16350 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
16360 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
16370 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
16380 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
16390 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20   "==== WARNING: 
163a0 66 61 69 6c 65 64 20 74 6f 20 72 65 6d 6f 76 65  failed to remove
163b0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 6e 64   connection hand
163c0 6c 65 20 5c 22 22 20 24 63 6f 6e 6e 65 63 74 69  le \"" $connecti
163d0 6f 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  on \..          
163e0 20 20 22 5c 22 2c 20 65 72 72 6f 72 3a 20 22 20    "\", error: " 
163f0 5c 6e 5c 74 20 24 65 72 72 6f 72 20 5c 6e 5d 0d  \n\t $error \n].
16400 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d  .      }..    }.
16410 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 61 64 64  ....    proc add
16420 44 62 43 6f 6e 6e 65 63 74 69 6f 6e 20 7b 20 63  DbConnection { c
16430 6f 6e 6e 65 63 74 69 6f 6e 20 7b 76 61 72 4e 61  onnection {varNa
16440 6d 65 20 64 62 7d 20 7d 20 7b 0d 0a 20 20 20 20  me db} } {..    
16450 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
16460 45 3a 20 52 65 66 65 72 20 74 6f 20 74 68 65 20  E: Refer to the 
16470 73 70 65 63 69 66 69 65 64 20 76 61 72 69 61 62  specified variab
16480 6c 65 20 28 65 2e 67 2e 20 22 64 62 22 29 20 69  le (e.g. "db") i
16490 6e 20 74 68 65 20 63 6f 6e 74 65 78 74 20 6f 66  n the context of
164a0 20 6f 75 72 0d 0a 20 20 20 20 20 20 23 20 20 20   our..      #   
164b0 20 20 20 20 63 61 6c 6c 65 72 2e 0d 0a 20 20 20      caller...   
164c0 20 20 20 23 0d 0a 20 20 20 20 20 20 75 70 76 61     #..      upva
164d0 72 20 31 20 24 76 61 72 4e 61 6d 65 20 64 62 0d  r 1 $varName db.
164e0 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
164f0 20 20 23 20 4e 4f 54 45 3a 20 43 72 65 61 74 65    # NOTE: Create
16500 20 61 20 63 6f 72 72 65 63 74 6c 79 20 66 6f 72   a correctly for
16510 6d 61 74 74 65 64 20 6e 61 6d 65 20 66 6f 72 20  matted name for 
16520 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e  the database con
16530 6e 65 63 74 69 6f 6e 20 74 6f 0d 0a 20 20 20 20  nection to..    
16540 20 20 23 20 20 20 20 20 20 20 62 65 20 61 64 64    #       be add
16550 65 64 20 74 6f 20 74 68 65 20 6c 69 73 74 20 6d  ed to the list m
16560 61 6e 61 67 65 64 20 62 79 20 74 68 65 20 45 61  anaged by the Ea
16570 67 6c 65 20 69 6e 74 65 72 70 72 65 74 65 72 2e  gle interpreter.
16580 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
16590 20 73 65 74 20 64 62 20 5b 6f 62 6a 65 63 74 20   set db [object 
165a0 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e  invoke -flags +N
165b0 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20  onPublic \..    
165c0 20 20 20 20 20 20 45 61 67 6c 65 2e 5f 43 6f 6d        Eagle._Com
165d0 70 6f 6e 65 6e 74 73 2e 50 72 69 76 61 74 65 2e  ponents.Private.
165e0 46 6f 72 6d 61 74 4f 70 73 20 44 61 74 61 62 61  FormatOps Databa
165f0 73 65 4f 62 6a 65 63 74 4e 61 6d 65 20 24 63 6f  seObjectName $co
16600 6e 6e 65 63 74 69 6f 6e 20 5c 0d 0a 20 20 20 20  nnection \..    
16610 20 20 20 20 20 20 53 51 4c 69 74 65 43 6f 6e 6e        SQLiteConn
16620 65 63 74 69 6f 6e 20 5b 6f 62 6a 65 63 74 20 69  ection [object i
16630 6e 76 6f 6b 65 20 49 6e 74 65 72 70 72 65 74 65  nvoke Interprete
16640 72 2e 47 65 74 41 63 74 69 76 65 20 4e 65 78 74  r.GetActive Next
16650 49 64 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d  Id]]....      #.
16660 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41  .      # NOTE: A
16670 64 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20  dd the database 
16680 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 72 6f 76 69  connection provi
16690 64 65 64 20 62 79 20 6f 75 72 20 63 61 6c 6c 65  ded by our calle
166a0 72 20 74 6f 20 74 68 65 20 6c 69 73 74 0d 0a 20  r to the list.. 
166b0 20 20 20 20 20 23 20 20 20 20 20 20 20 6f 66 20       #       of 
166c0 74 68 6f 73 65 20 6b 6e 6f 77 6e 20 74 6f 20 74  those known to t
166d0 68 65 20 45 61 67 6c 65 20 69 6e 74 65 72 70 72  he Eagle interpr
166e0 65 74 65 72 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  eter...      #..
166f0 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76        object inv
16700 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50  oke -flags +NonP
16710 75 62 6c 69 63 20 49 6e 74 65 72 70 72 65 74 65  ublic Interprete
16720 72 2e 47 65 74 41 63 74 69 76 65 2e 63 6f 6e 6e  r.GetActive.conn
16730 65 63 74 69 6f 6e 73 20 41 64 64 20 5c 0d 0a 20  ections Add \.. 
16740 20 20 20 20 20 20 20 20 20 24 64 62 20 24 63 6f           $db $co
16750 6e 6e 65 63 74 69 6f 6e 0d 0a 20 20 20 20 7d 0d  nnection..    }.
16760 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74  ....    proc get
16770 52 6f 77 73 46 72 6f 6d 44 61 74 61 54 61 62 6c  RowsFromDataTabl
16780 65 20 7b 20 64 61 74 61 54 61 62 6c 65 20 7d 20  e { dataTable } 
16790 7b 0d 0a 20 20 20 20 20 20 73 65 74 20 72 6f 77  {..      set row
167a0 73 20 5b 6c 69 73 74 5d 0d 0a 20 20 20 20 20 20  s [list]..      
167b0 73 65 74 20 63 6f 75 6e 74 20 5b 24 64 61 74 61  set count [$data
167c0 54 61 62 6c 65 20 43 6f 6c 75 6d 6e 73 2e 43 6f  Table Columns.Co
167d0 75 6e 74 5d 0d 0a 0d 0a 20 20 20 20 20 20 66 6f  unt]....      fo
167e0 72 20 7b 73 65 74 20 69 6e 64 65 78 20 30 7d 20  r {set index 0} 
167f0 7b 24 69 6e 64 65 78 20 3c 20 24 63 6f 75 6e 74  {$index < $count
16800 7d 20 7b 69 6e 63 72 20 69 6e 64 65 78 7d 20 7b  } {incr index} {
16810 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 64 61  ..        set da
16820 74 61 43 6f 6c 75 6d 6e 20 5b 24 64 61 74 61 54  taColumn [$dataT
16830 61 62 6c 65 20 2d 61 6c 69 61 73 20 43 6f 6c 75  able -alias Colu
16840 6d 6e 73 2e 67 65 74 5f 49 74 65 6d 20 24 69 6e  mns.get_Item $in
16850 64 65 78 5d 0d 0a 20 20 20 20 20 20 20 20 73 65  dex]..        se
16860 74 20 6e 61 6d 65 73 28 24 69 6e 64 65 78 29 20  t names($index) 
16870 5b 24 64 61 74 61 43 6f 6c 75 6d 6e 20 43 6f 6c  [$dataColumn Col
16880 75 6d 6e 4e 61 6d 65 5d 0d 0a 20 20 20 20 20 20  umnName]..      
16890 7d 0d 0a 0d 0a 20 20 20 20 20 20 6f 62 6a 65 63  }....      objec
168a0 74 20 66 6f 72 65 61 63 68 20 2d 61 6c 69 61 73  t foreach -alias
168b0 20 64 61 74 61 52 6f 77 20 5b 73 65 74 20 64 61   dataRow [set da
168c0 74 61 52 6f 77 73 20 5b 24 64 61 74 61 54 61 62  taRows [$dataTab
168d0 6c 65 20 52 6f 77 73 5d 5d 20 7b 0d 0a 20 20 20  le Rows]] {..   
168e0 20 20 20 20 20 73 65 74 20 72 6f 77 20 5b 6c 69       set row [li
168f0 73 74 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 66  st]....        f
16900 6f 72 20 7b 73 65 74 20 69 6e 64 65 78 20 30 7d  or {set index 0}
16910 20 7b 24 69 6e 64 65 78 20 3c 20 24 63 6f 75 6e   {$index < $coun
16920 74 7d 20 7b 69 6e 63 72 20 69 6e 64 65 78 7d 20  t} {incr index} 
16930 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74  {..          set
16940 20 76 61 6c 75 65 20 5b 24 64 61 74 61 52 6f 77   value [$dataRow
16950 20 2d 63 72 65 61 74 65 20 2d 61 6c 69 61 73 20   -create -alias 
16960 67 65 74 5f 49 74 65 6d 20 24 69 6e 64 65 78 5d  get_Item $index]
16970 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66  ....          if
16980 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68   {[string length
16990 20 24 76 61 6c 75 65 5d 20 3e 20 30 20 26 26 20   $value] > 0 && 
169a0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
169b0 20 21 5b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65   ![object invoke
169c0 20 43 6f 6e 76 65 72 74 20 49 73 44 42 4e 75 6c   Convert IsDBNul
169d0 6c 20 24 76 61 6c 75 65 5d 7d 20 74 68 65 6e 20  l $value]} then 
169e0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 6c  {..            l
169f0 61 70 70 65 6e 64 20 72 6f 77 20 5b 6c 69 73 74  append row [list
16a00 20 24 6e 61 6d 65 73 28 24 69 6e 64 65 78 29 20   $names($index) 
16a10 5b 24 76 61 6c 75 65 20 54 6f 53 74 72 69 6e 67  [$value ToString
16a20 5d 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 20  ]]..          } 
16a30 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
16a40 20 20 20 20 6c 61 70 70 65 6e 64 20 72 6f 77 20      lappend row 
16a50 5b 6c 69 73 74 20 24 6e 61 6d 65 73 28 24 69 6e  [list $names($in
16a60 64 65 78 29 5d 0d 0a 20 20 20 20 20 20 20 20 20  dex)]..         
16a70 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d   }..        }...
16a80 0a 20 20 20 20 20 20 20 20 6c 61 70 70 65 6e 64  .        lappend
16a90 20 72 6f 77 73 20 24 72 6f 77 0d 0a 20 20 20 20   rows $row..    
16aa0 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65 74    }....      ret
16ab0 75 72 6e 20 24 72 6f 77 73 0d 0a 20 20 20 20 7d  urn $rows..    }
16ac0 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 64 75  .....    proc du
16ad0 6d 70 52 6f 77 73 46 72 6f 6d 44 61 74 61 54 61  mpRowsFromDataTa
16ae0 62 6c 65 20 7b 20 63 68 61 6e 6e 65 6c 20 72 6f  ble { channel ro
16af0 77 73 20 7d 20 7b 0d 0a 20 20 20 20 20 20 73 65  ws } {..      se
16b00 74 20 73 65 71 75 65 6e 63 65 20 31 0d 0a 0d 0a  t sequence 1....
16b10 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f        foreach ro
16b20 77 20 24 72 6f 77 73 20 7b 0d 0a 20 20 20 20 20  w $rows {..     
16b30 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
16b40 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
16b50 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 65 78  .            [ex
16b60 70 72 20 7b 24 73 65 71 75 65 6e 63 65 20 3e 20  pr {$sequence > 
16b70 31 20 3f 20 22 5c 6e 22 20 3a 20 22 22 7d 5d 20  1 ? "\n" : ""}] 
16b80 22 2d 2d 2d 2d 20 52 4f 57 20 23 22 20 24 73 65  "---- ROW #" $se
16b90 71 75 65 6e 63 65 20 3a 5c 6e 5d 0d 0a 0d 0a 20  quence :\n].... 
16ba0 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 70         foreach p
16bb0 61 69 72 20 24 72 6f 77 20 7b 0d 0a 20 20 20 20  air $row {..    
16bc0 20 20 20 20 20 20 69 66 20 7b 5b 6c 6c 65 6e 67        if {[lleng
16bd0 74 68 20 24 70 61 69 72 5d 20 3e 3d 20 32 7d 20  th $pair] >= 2} 
16be0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
16bf0 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
16c00 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
16c10 74 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  t \..           
16c20 20 20 20 20 20 5b 6c 69 73 74 20 5b 6c 69 6e 64       [list [lind
16c30 65 78 20 24 70 61 69 72 20 30 5d 5d 20 22 3a 20  ex $pair 0]] ": 
16c40 22 20 5b 6c 69 73 74 20 5b 6c 69 6e 64 65 78 20  " [list [lindex 
16c50 24 70 61 69 72 20 31 5d 5d 20 5c 6e 5d 0d 0a 20  $pair 1]] \n].. 
16c60 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 69           } elsei
16c70 66 20 7b 5b 6c 6c 65 6e 67 74 68 20 24 70 61 69  f {[llength $pai
16c80 72 5d 20 3d 3d 20 31 7d 20 74 68 65 6e 20 7b 0d  r] == 1} then {.
16c90 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75  .            tpu
16ca0 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70  ts $channel [app
16cb0 65 6e 64 41 72 67 73 20 5c 74 20 5c 0d 0a 20 20  endArgs \t \..  
16cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 6c                [l
16cd0 69 73 74 20 5b 6c 69 6e 64 65 78 20 24 70 61 69  ist [lindex $pai
16ce0 72 20 30 5d 5d 20 22 3a 20 3c 6e 75 6c 6c 3e 5c  r 0]] ": <null>\
16cf0 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  n"]..          }
16d00 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
16d10 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
16d20 6e 65 6c 20 5c 74 3c 65 6d 70 74 79 3e 5c 6e 3b  nel \t<empty>\n;
16d30 20 23 20 4e 4f 54 45 3a 20 4e 6f 20 64 61 74 61   # NOTE: No data
16d40 3f 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  ?..          }..
16d50 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
16d60 20 20 20 20 20 69 6e 63 72 20 73 65 71 75 65 6e       incr sequen
16d70 63 65 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20  ce..      }..   
16d80 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
16d90 63 6c 65 61 6e 75 70 44 62 20 7b 20 66 69 6c 65  cleanupDb { file
16da0 4e 61 6d 65 20 7b 76 61 72 4e 61 6d 65 20 64 62  Name {varName db
16db0 7d 20 7b 63 6f 6c 6c 65 63 74 20 74 72 75 65 7d  } {collect true}
16dc0 20 7b 71 75 61 6c 69 66 79 20 74 72 75 65 7d 0d   {qualify true}.
16dd0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
16de0 20 20 20 20 20 20 7b 64 65 6c 65 74 65 20 74 72        {delete tr
16df0 75 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23  ue} } {..      #
16e00 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
16e10 41 74 74 65 6d 70 74 20 74 6f 20 66 6f 72 63 65  Attempt to force
16e20 20 61 6c 6c 20 70 65 6e 64 69 6e 67 20 22 67 61   all pending "ga
16e30 72 62 61 67 65 22 20 6f 62 6a 65 63 74 73 20 74  rbage" objects t
16e40 6f 20 62 65 20 63 6f 6c 6c 65 63 74 65 64 2c 0d  o be collected,.
16e50 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 69  .      #       i
16e60 6e 63 6c 75 64 69 6e 67 20 53 51 4c 69 74 65 20  ncluding SQLite 
16e70 73 74 61 74 65 6d 65 6e 74 73 20 61 6e 64 20 62  statements and b
16e80 61 63 6b 75 70 20 6f 62 6a 65 63 74 73 3b 20 74  ackup objects; t
16e90 68 69 73 20 73 68 6f 75 6c 64 20 61 6c 6c 6f 77  his should allow
16ea0 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
16eb0 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 64  the underlying d
16ec0 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20  atabase file to 
16ed0 62 65 20 64 65 6c 65 74 65 64 2e 0d 0a 20 20 20  be deleted...   
16ee0 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
16ef0 24 63 6f 6c 6c 65 63 74 7d 20 74 68 65 6e 20 7b  $collect} then {
16f00 0d 0a 20 20 20 20 20 20 20 20 63 6f 6c 6c 65 63  ..        collec
16f10 74 47 61 72 62 61 67 65 20 24 3a 3a 74 65 73 74  tGarbage $::test
16f20 5f 63 68 61 6e 6e 65 6c 0d 0a 20 20 20 20 20 20  _channel..      
16f30 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  }....      #..  
16f40 20 20 20 20 23 20 4e 4f 54 45 3a 20 52 65 66 65      # NOTE: Refe
16f50 72 20 74 6f 20 74 68 65 20 73 70 65 63 69 66 69  r to the specifi
16f60 65 64 20 76 61 72 69 61 62 6c 65 20 28 65 2e 67  ed variable (e.g
16f70 2e 20 22 64 62 22 29 20 69 6e 20 74 68 65 20 63  . "db") in the c
16f80 6f 6e 74 65 78 74 20 6f 66 20 6f 75 72 0d 0a 20  ontext of our.. 
16f90 20 20 20 20 20 23 20 20 20 20 20 20 20 63 61 6c       #       cal
16fa0 6c 65 72 2e 20 20 54 68 65 20 68 61 6e 64 6c 65  ler.  The handle
16fb0 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
16fc0 20 70 72 65 76 69 6f 75 73 6c 79 20 6f 70 65 6e   previously open
16fd0 65 64 20 76 69 61 20 74 68 65 0d 0a 20 20 20 20  ed via the..    
16fe0 20 20 23 20 20 20 20 20 20 20 5b 73 65 74 75 70    #       [setup
16ff0 44 62 5d 20 70 72 6f 63 65 64 75 72 65 20 73 68  Db] procedure sh
17000 6f 75 6c 64 20 62 65 20 73 74 6f 72 65 64 20 74  ould be stored t
17010 68 65 72 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  here...      #..
17020 20 20 20 20 20 20 75 70 76 61 72 20 31 20 24 76        upvar 1 $v
17030 61 72 4e 61 6d 65 20 64 62 0d 0a 0d 0a 20 20 20  arName db....   
17040 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
17050 54 45 3a 20 43 6c 6f 73 65 20 74 68 65 20 63 6f  TE: Close the co
17060 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 74 68 65 20  nnection to the 
17070 64 61 74 61 62 61 73 65 20 6e 6f 77 2e 20 20 54  database now.  T
17080 68 69 73 20 73 68 6f 75 6c 64 20 61 6c 6c 6f 77  his should allow
17090 20 75 73 0d 0a 20 20 20 20 20 20 23 20 20 20 20   us..      #    
170a0 20 20 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65     to delete the
170b0 20 75 6e 64 65 72 6c 79 69 6e 67 20 64 61 74 61   underlying data
170c0 62 61 73 65 20 66 69 6c 65 2e 0d 0a 20 20 20 20  base file...    
170d0 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b    #..      if {[
170e0 69 6e 66 6f 20 65 78 69 73 74 73 20 64 62 5d 20  info exists db] 
170f0 26 26 20 5b 63 61 74 63 68 20 7b 73 71 6c 20 63  && [catch {sql c
17100 6c 6f 73 65 20 24 64 62 7d 20 65 72 72 6f 72 5d  lose $db} error]
17110 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
17120 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
17130 4f 54 45 3a 20 57 65 20 73 6f 6d 65 68 6f 77 20  OTE: We somehow 
17140 66 61 69 6c 65 64 20 74 6f 20 63 6c 6f 73 65 20  failed to close 
17150 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 72 65  the database, re
17160 70 6f 72 74 20 77 68 79 2e 0d 0a 20 20 20 20 20  port why...     
17170 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 74 70     #..        tp
17180 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  uts $::test_chan
17190 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
171a0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22  \..            "
171b0 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61  ==== WARNING: fa
171c0 69 6c 65 64 20 74 6f 20 63 6c 6f 73 65 20 64 61  iled to close da
171d0 74 61 62 61 73 65 20 5c 22 22 20 24 64 62 20 22  tabase \"" $db "
171e0 5c 22 2c 20 65 72 72 6f 72 3a 20 22 20 5c 0d 0a  \", error: " \..
171f0 20 20 20 20 20 20 20 20 20 20 20 20 5c 6e 5c 74              \n\t
17200 20 24 65 72 72 6f 72 20 5c 6e 5d 0d 0a 20 20 20   $error \n]..   
17210 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d     }....      #.
17220 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 46  .      # NOTE: F
17230 69 72 73 74 2c 20 73 65 65 20 69 66 20 6f 75 72  irst, see if our
17240 20 63 61 6c 6c 65 72 20 68 61 73 20 72 65 71 75   caller has requ
17250 65 73 74 65 64 20 61 6e 20 69 6e 2d 6d 65 6d 6f  ested an in-memo
17260 72 79 20 64 61 74 61 62 61 73 65 2e 0d 0a 20 20  ry database...  
17270 20 20 20 20 23 0d 0a 20 20 20 20 20 20 73 65 74      #..      set
17280 20 69 73 4d 65 6d 6f 72 79 20 5b 69 73 4d 65 6d   isMemory [isMem
17290 6f 72 79 44 62 20 24 66 69 6c 65 4e 61 6d 65 5d  oryDb $fileName]
172a0 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  ....      #..   
172b0 20 20 20 23 20 4e 4f 54 45 3a 20 42 75 69 6c 64     # NOTE: Build
172c0 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68 20 74   the full path t
172d0 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
172e0 69 6c 65 20 6e 61 6d 65 2e 20 20 46 6f 72 20 6e  ile name.  For n
172f0 6f 77 2c 20 61 6c 6c 20 74 65 73 74 0d 0a 20 20  ow, all test..  
17300 20 20 20 20 23 20 20 20 20 20 20 20 64 61 74 61      #       data
17310 62 61 73 65 20 66 69 6c 65 73 20 61 72 65 20 73  base files are s
17320 74 6f 72 65 64 20 69 6e 20 74 68 65 20 74 65 6d  tored in the tem
17330 70 6f 72 61 72 79 20 64 69 72 65 63 74 6f 72 79  porary directory
17340 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
17350 20 20 69 66 20 7b 21 24 69 73 4d 65 6d 6f 72 79    if {!$isMemory
17360 20 26 26 20 24 71 75 61 6c 69 66 79 7d 20 74 68   && $qualify} th
17370 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 65  en {..        se
17380 74 20 66 69 6c 65 4e 61 6d 65 20 5b 66 69 6c 65  t fileName [file
17390 20 6a 6f 69 6e 20 5b 67 65 74 44 61 74 61 62 61   join [getDataba
173a0 73 65 44 69 72 65 63 74 6f 72 79 5d 20 5b 66 69  seDirectory] [fi
173b0 6c 65 20 74 61 69 6c 20 24 66 69 6c 65 4e 61 6d  le tail $fileNam
173c0 65 5d 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a  e]]..      }....
173d0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
173e0 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 69 66 20   NOTE: Check if 
173f0 74 68 65 20 66 69 6c 65 20 73 74 69 6c 6c 20 65  the file still e
17400 78 69 73 74 73 2e 0d 0a 20 20 20 20 20 20 23 0d  xists...      #.
17410 0a 20 20 20 20 20 20 69 66 20 7b 21 24 69 73 4d  .      if {!$isM
17420 65 6d 6f 72 79 20 26 26 20 24 64 65 6c 65 74 65  emory && $delete
17430 20 26 26 20 5b 66 69 6c 65 20 65 78 69 73 74 73   && [file exists
17440 20 24 66 69 6c 65 4e 61 6d 65 5d 7d 20 74 68 65   $fileName]} the
17450 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  n {..        #..
17460 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
17470 53 6b 69 70 20 64 65 6c 65 74 69 6e 67 20 64 61  Skip deleting da
17480 74 61 62 61 73 65 20 66 69 6c 65 73 20 69 66 20  tabase files if 
17490 73 6f 6d 65 62 6f 64 79 20 73 65 74 73 20 74 68  somebody sets th
174a0 65 20 67 6c 6f 62 61 6c 0d 0a 20 20 20 20 20 20  e global..      
174b0 20 20 23 20 20 20 20 20 20 20 76 61 72 69 61 62    #       variab
174c0 6c 65 20 74 6f 20 70 72 65 76 65 6e 74 20 69 74  le to prevent it
174d0 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
174e0 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f        if {![info
174f0 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 63 6c 65   exists ::no(cle
17500 61 6e 75 70 44 62 46 69 6c 65 29 5d 7d 20 74 68  anupDbFile)]} th
17510 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
17520 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e  #..          # N
17530 4f 54 45 3a 20 41 74 74 65 6d 70 74 20 74 6f 20  OTE: Attempt to 
17540 64 65 6c 65 74 65 20 74 68 65 20 74 65 73 74 20  delete the test 
17550 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6e 6f  database file no
17560 77 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d  w...          #.
17570 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b  .          if {[
17580 73 65 74 20 63 6f 64 65 20 5b 63 61 74 63 68 20  set code [catch 
17590 7b 66 69 6c 65 20 64 65 6c 65 74 65 20 24 66 69  {file delete $fi
175a0 6c 65 4e 61 6d 65 7d 20 65 72 72 6f 72 5d 5d 7d  leName} error]]}
175b0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
175c0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
175d0 20 20 20 20 23 20 4e 4f 54 45 3a 20 57 65 20 73      # NOTE: We s
175e0 6f 6d 65 68 6f 77 20 66 61 69 6c 65 64 20 74 6f  omehow failed to
175f0 20 64 65 6c 65 74 65 20 74 68 65 20 66 69 6c 65   delete the file
17600 2c 20 72 65 70 6f 72 74 20 77 68 79 2e 0d 0a 20  , report why... 
17610 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
17620 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
17630 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
17640 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
17650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
17660 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61  ==== WARNING: fa
17670 69 6c 65 64 20 74 6f 20 64 65 6c 65 74 65 20 64  iled to delete d
17680 61 74 61 62 61 73 65 20 66 69 6c 65 20 5c 22 22  atabase file \""
17690 20 24 66 69 6c 65 4e 61 6d 65 20 5c 0d 0a 20 20   $fileName \..  
176a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 5c                "\
176b0 22 20 64 75 72 69 6e 67 20 63 6c 65 61 6e 75 70  " during cleanup
176c0 2c 20 65 72 72 6f 72 3a 20 22 20 5c 6e 5c 74 20  , error: " \n\t 
176d0 24 65 72 72 6f 72 20 5c 6e 5d 0d 0a 20 20 20 20  $error \n]..    
176e0 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
176f0 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
17700 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
17710 20 20 23 20 4e 4f 54 45 3a 20 53 68 6f 77 20 74    # NOTE: Show t
17720 68 61 74 20 77 65 20 73 6b 69 70 70 65 64 20 64  hat we skipped d
17730 65 6c 65 74 69 6e 67 20 74 68 65 20 66 69 6c 65  eleting the file
17740 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a  ...          #..
17750 20 20 20 20 20 20 20 20 20 20 73 65 74 20 63 6f            set co
17760 64 65 20 30 0d 0a 0d 0a 20 20 20 20 20 20 20 20  de 0....        
17770 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
17780 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
17790 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
177a0 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49       "==== WARNI
177b0 4e 47 3a 20 73 6b 69 70 70 65 64 20 64 65 6c 65  NG: skipped dele
177c0 74 69 6e 67 20 64 61 74 61 62 61 73 65 20 66 69  ting database fi
177d0 6c 65 20 5c 22 22 20 24 66 69 6c 65 4e 61 6d 65  le \"" $fileName
177e0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
177f0 20 20 22 5c 22 20 64 75 72 69 6e 67 20 63 6c 65    "\" during cle
17800 61 6e 75 70 5c 6e 22 5d 0d 0a 20 20 20 20 20 20  anup\n"]..      
17810 20 20 7d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73    }..      } els
17820 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  e {..        #..
17830 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
17840 54 68 65 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f  The file does no
17850 74 20 65 78 69 73 74 2c 20 73 75 63 63 65 73 73  t exist, success
17860 21 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  !..        #..  
17870 20 20 20 20 20 20 73 65 74 20 63 6f 64 65 20 30        set code 0
17880 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
17890 20 20 20 72 65 74 75 72 6e 20 24 63 6f 64 65 0d     return $code.
178a0 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70  .    }.....    p
178b0 72 6f 63 20 73 61 76 65 45 6e 76 69 72 6f 6e 6d  roc saveEnvironm
178c0 65 6e 74 56 61 72 69 61 62 6c 65 73 20 7b 20 6e  entVariables { n
178d0 61 6d 65 73 20 7b 76 61 72 4e 61 6d 65 20 22 22  ames {varName ""
178e0 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a  } } {..      #..
178f0 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 46 6f        # NOTE: Fo
17900 72 20 65 61 63 68 20 6e 61 6d 65 2c 20 64 6f 65  r each name, doe
17910 73 20 74 68 65 20 6c 69 76 65 20 65 6e 76 69 72  s the live envir
17920 6f 6e 6d 65 6e 74 20 76 61 72 69 61 62 6c 65 20  onment variable 
17930 65 78 69 73 74 3f 20 20 49 66 0d 0a 20 20 20 20  exist?  If..    
17940 20 20 23 20 20 20 20 20 20 20 73 6f 2c 20 73 61    #       so, sa
17950 76 65 20 74 68 65 20 76 61 6c 75 65 20 66 6f 72  ve the value for
17960 20 6c 61 74 65 72 3b 20 6f 74 68 65 72 77 69 73   later; otherwis
17970 65 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65  e, make sure the
17980 20 73 61 76 65 64 0d 0a 20 20 20 20 20 20 23 20   saved..      # 
17990 20 20 20 20 20 20 76 61 6c 75 65 20 64 6f 65 73        value does
179a0 20 6e 6f 74 20 65 78 69 73 74 20 65 69 74 68 65   not exist eithe
179b0 72 2e 20 20 54 68 65 20 6c 69 76 65 20 65 6e 76  r.  The live env
179c0 69 72 6f 6e 6d 65 6e 74 20 76 61 72 69 61 62 6c  ironment variabl
179d0 65 73 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  es..      #     
179e0 20 20 41 52 45 20 4e 4f 54 20 63 68 61 6e 67 65    ARE NOT change
179f0 64 20 62 79 20 74 68 69 73 20 70 72 6f 63 65 64  d by this proced
17a00 75 72 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ure...      #.. 
17a10 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67       if {[string
17a20 20 6c 65 6e 67 74 68 20 24 76 61 72 4e 61 6d 65   length $varName
17a30 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  ] == 0} then {..
17a40 20 20 20 20 20 20 20 20 73 65 74 20 76 61 72 4e          set varN
17a50 61 6d 65 20 73 61 76 65 64 45 6e 76 0d 0a 20 20  ame savedEnv..  
17a60 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 75      }....      u
17a70 70 76 61 72 20 31 20 24 76 61 72 4e 61 6d 65 20  pvar 1 $varName 
17a80 73 61 76 65 64 45 6e 76 0d 0a 0d 0a 20 20 20 20  savedEnv....    
17a90 20 20 66 6f 72 65 61 63 68 20 6e 61 6d 65 20 24    foreach name $
17aa0 6e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20 20  names {..       
17ab0 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74   if {[info exist
17ac0 73 20 3a 3a 65 6e 76 28 24 6e 61 6d 65 29 5d 7d  s ::env($name)]}
17ad0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
17ae0 20 20 20 73 65 74 20 73 61 76 65 64 45 6e 76 28     set savedEnv(
17af0 24 6e 61 6d 65 29 20 24 3a 3a 65 6e 76 28 24 6e  $name) $::env($n
17b00 61 6d 65 29 0d 0a 20 20 20 20 20 20 20 20 7d 20  ame)..        } 
17b10 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
17b20 20 20 75 6e 73 65 74 20 2d 6e 6f 63 6f 6d 70 6c    unset -nocompl
17b30 61 69 6e 20 73 61 76 65 64 45 6e 76 28 24 6e 61  ain savedEnv($na
17b40 6d 65 29 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  me)..        }..
17b50 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
17b60 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
17b70 3a 20 54 68 69 73 20 69 73 20 73 65 6c 66 2d 63  : This is self-c
17b80 6c 65 61 6e 69 6e 67 2e 20 20 49 66 20 6e 6f 20  leaning.  If no 
17b90 73 61 76 65 64 20 65 6e 76 69 72 6f 6e 6d 65 6e  saved environmen
17ba0 74 20 76 61 72 69 61 62 6c 65 73 20 6e 6f 77 0d  t variables now.
17bb0 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 65  .      #       e
17bc0 78 69 73 74 2c 20 72 65 6d 6f 76 65 20 74 68 65  xist, remove the
17bd0 20 61 72 72 61 79 2e 0d 0a 20 20 20 20 20 20 23   array...      #
17be0 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 61 72 72  ..      if {[arr
17bf0 61 79 20 73 69 7a 65 20 73 61 76 65 64 45 6e 76  ay size savedEnv
17c00 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  ] == 0} then {..
17c10 20 20 20 20 20 20 20 20 75 6e 73 65 74 20 2d 6e          unset -n
17c20 6f 63 6f 6d 70 6c 61 69 6e 20 73 61 76 65 64 45  ocomplain savedE
17c30 6e 76 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20  nv..      }..   
17c40 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
17c50 72 65 73 74 6f 72 65 45 6e 76 69 72 6f 6e 6d 65  restoreEnvironme
17c60 6e 74 56 61 72 69 61 62 6c 65 73 20 7b 20 6e 61  ntVariables { na
17c70 6d 65 73 20 7b 76 61 72 4e 61 6d 65 20 22 22 7d  mes {varName ""}
17c80 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20   } {..      #.. 
17c90 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 46 6f 72       # NOTE: For
17ca0 20 65 61 63 68 20 6e 61 6d 65 2c 20 64 6f 65 73   each name, does
17cb0 20 74 68 65 20 73 61 76 65 64 20 65 6e 76 69 72   the saved envir
17cc0 6f 6e 6d 65 6e 74 20 76 61 72 69 61 62 6c 65 20  onment variable 
17cd0 65 78 69 73 74 3f 20 20 49 66 0d 0a 20 20 20 20  exist?  If..    
17ce0 20 20 23 20 20 20 20 20 20 20 73 6f 2c 20 72 65    #       so, re
17cf0 73 74 6f 72 65 20 74 68 65 20 73 61 76 65 64 20  store the saved 
17d00 76 61 6c 75 65 20 61 6e 64 20 75 6e 73 65 74 20  value and unset 
17d10 69 74 3b 20 6f 74 68 65 72 77 69 73 65 2c 20 6d  it; otherwise, m
17d20 61 6b 65 20 73 75 72 65 0d 0a 20 20 20 20 20 20  ake sure..      
17d30 23 20 20 20 20 20 20 20 74 68 65 20 6c 69 76 65  #       the live
17d40 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 20 76 61 72   environment var
17d50 69 61 62 6c 65 20 64 6f 65 73 20 6e 6f 74 20 65  iable does not e
17d60 78 69 73 74 20 65 69 74 68 65 72 20 28 69 2e 65  xist either (i.e
17d70 2e 20 69 74 0d 0a 20 20 20 20 20 20 23 20 20 20  . it..      #   
17d80 20 20 20 20 77 61 73 20 6e 6f 74 20 73 65 74 20      was not set 
17d90 74 6f 20 62 65 67 69 6e 20 77 69 74 68 29 2e 20  to begin with). 
17da0 20 42 6f 74 68 20 73 61 76 65 64 20 61 6e 64 20   Both saved and 
17db0 6c 69 76 65 20 65 6e 76 69 72 6f 6e 6d 65 6e 74  live environment
17dc0 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
17dd0 76 61 72 69 61 62 6c 65 73 20 41 52 45 20 63 68  variables ARE ch
17de0 61 6e 67 65 64 20 62 79 20 74 68 69 73 20 70 72  anged by this pr
17df0 6f 63 65 64 75 72 65 2e 0d 0a 20 20 20 20 20 20  ocedure...      
17e00 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 73 74  #..      if {[st
17e10 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 76 61 72  ring length $var
17e20 4e 61 6d 65 5d 20 3d 3d 20 30 7d 20 74 68 65 6e  Name] == 0} then
17e30 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20   {..        set 
17e40 76 61 72 4e 61 6d 65 20 73 61 76 65 64 45 6e 76  varName savedEnv
17e50 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
17e60 20 20 20 75 70 76 61 72 20 31 20 24 76 61 72 4e     upvar 1 $varN
17e70 61 6d 65 20 73 61 76 65 64 45 6e 76 0d 0a 0d 0a  ame savedEnv....
17e80 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 6e 61        foreach na
17e90 6d 65 20 24 6e 61 6d 65 73 20 7b 0d 0a 20 20 20  me $names {..   
17ea0 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65       if {[info e
17eb0 78 69 73 74 73 20 73 61 76 65 64 45 6e 76 28 24  xists savedEnv($
17ec0 6e 61 6d 65 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a  name)]} then {..
17ed0 20 20 20 20 20 20 20 20 20 20 73 65 74 20 3a 3a            set ::
17ee0 65 6e 76 28 24 6e 61 6d 65 29 20 24 73 61 76 65  env($name) $save
17ef0 64 45 6e 76 28 24 6e 61 6d 65 29 0d 0a 20 20 20  dEnv($name)..   
17f00 20 20 20 20 20 20 20 75 6e 73 65 74 20 2d 6e 6f         unset -no
17f10 63 6f 6d 70 6c 61 69 6e 20 73 61 76 65 64 45 6e  complain savedEn
17f20 76 28 24 6e 61 6d 65 29 0d 0a 20 20 20 20 20 20  v($name)..      
17f30 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
17f40 20 20 20 20 20 20 75 6e 73 65 74 20 2d 6e 6f 63        unset -noc
17f50 6f 6d 70 6c 61 69 6e 20 3a 3a 65 6e 76 28 24 6e  omplain ::env($n
17f60 61 6d 65 29 0d 0a 20 20 20 20 20 20 20 20 7d 0d  ame)..        }.
17f70 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
17f80 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
17f90 45 3a 20 54 68 69 73 20 69 73 20 73 65 6c 66 2d  E: This is self-
17fa0 63 6c 65 61 6e 69 6e 67 2e 20 20 49 66 20 6e 6f  cleaning.  If no
17fb0 20 73 61 76 65 64 20 65 6e 76 69 72 6f 6e 6d 65   saved environme
17fc0 6e 74 20 76 61 72 69 61 62 6c 65 73 20 6e 6f 77  nt variables now
17fd0 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
17fe0 65 78 69 73 74 2c 20 72 65 6d 6f 76 65 20 74 68  exist, remove th
17ff0 65 20 61 72 72 61 79 2e 0d 0a 20 20 20 20 20 20  e array...      
18000 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 61 72  #..      if {[ar
18010 72 61 79 20 73 69 7a 65 20 73 61 76 65 64 45 6e  ray size savedEn
18020 76 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d  v] == 0} then {.
18030 0a 20 20 20 20 20 20 20 20 75 6e 73 65 74 20 2d  .        unset -
18040 6e 6f 63 6f 6d 70 6c 61 69 6e 20 73 61 76 65 64  nocomplain saved
18050 45 6e 76 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20  Env..      }..  
18060 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
18070 20 73 61 76 65 53 51 4c 69 74 65 43 6f 6e 6e 65   saveSQLiteConne
18080 63 74 69 6f 6e 45 6e 76 69 72 6f 6e 6d 65 6e 74  ctionEnvironment
18090 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 75 70 76   {} {..      upv
180a0 61 72 20 31 20 73 61 76 65 64 45 6e 76 20 73 61  ar 1 savedEnv sa
180b0 76 65 64 45 6e 76 0d 0a 0d 0a 20 20 20 20 20 20  vedEnv....      
180c0 73 61 76 65 45 6e 76 69 72 6f 6e 6d 65 6e 74 56  saveEnvironmentV
180d0 61 72 69 61 62 6c 65 73 20 5b 6c 69 73 74 20 5c  ariables [list \
180e0 0d 0a 20 20 20 20 20 20 20 20 20 20 44 65 66 61  ..          Defa
180f0 75 6c 74 46 6c 61 67 73 5f 53 51 4c 69 74 65 43  ultFlags_SQLiteC
18100 6f 6e 6e 65 63 74 69 6f 6e 20 4e 6f 5f 53 51 4c  onnection No_SQL
18110 69 74 65 43 6f 6e 6e 65 63 74 69 6f 6e 4e 65 77  iteConnectionNew
18120 50 61 72 73 65 72 5d 20 5c 0d 0a 20 20 20 20 20  Parser] \..     
18130 20 20 20 20 20 73 61 76 65 64 45 6e 76 0d 0a 20       savedEnv.. 
18140 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
18150 63 20 72 65 73 74 6f 72 65 53 51 4c 69 74 65 43  c restoreSQLiteC
18160 6f 6e 6e 65 63 74 69 6f 6e 45 6e 76 69 72 6f 6e  onnectionEnviron
18170 6d 65 6e 74 20 7b 7d 20 7b 0d 0a 20 20 20 20 20  ment {} {..     
18180 20 75 70 76 61 72 20 31 20 73 61 76 65 64 45 6e   upvar 1 savedEn
18190 76 20 73 61 76 65 64 45 6e 76 0d 0a 0d 0a 20 20  v savedEnv....  
181a0 20 20 20 20 72 65 73 74 6f 72 65 45 6e 76 69 72      restoreEnvir
181b0 6f 6e 6d 65 6e 74 56 61 72 69 61 62 6c 65 73 20  onmentVariables 
181c0 5b 6c 69 73 74 20 5c 0d 0a 20 20 20 20 20 20 20  [list \..       
181d0 20 20 20 44 65 66 61 75 6c 74 46 6c 61 67 73 5f     DefaultFlags_
181e0 53 51 4c 69 74 65 43 6f 6e 6e 65 63 74 69 6f 6e  SQLiteConnection
181f0 20 4e 6f 5f 53 51 4c 69 74 65 43 6f 6e 6e 65 63   No_SQLiteConnec
18200 74 69 6f 6e 4e 65 77 50 61 72 73 65 72 5d 20 5c  tionNewParser] \
18210 0d 0a 20 20 20 20 20 20 20 20 20 20 73 61 76 65  ..          save
18220 64 45 6e 76 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a  dEnv..    }.....
18230 20 20 20 20 70 72 6f 63 20 73 61 76 65 53 51 4c      proc saveSQL
18240 69 74 65 43 6f 6e 76 65 72 74 45 6e 76 69 72 6f  iteConvertEnviro
18250 6e 6d 65 6e 74 20 7b 7d 20 7b 0d 0a 20 20 20 20  nment {} {..    
18260 20 20 75 70 76 61 72 20 31 20 73 61 76 65 64 45    upvar 1 savedE
18270 6e 76 20 73 61 76 65 64 45 6e 76 0d 0a 0d 0a 20  nv savedEnv.... 
18280 20 20 20 20 20 73 61 76 65 45 6e 76 69 72 6f 6e       saveEnviron
18290 6d 65 6e 74 56 61 72 69 61 62 6c 65 73 20 5b 6c  mentVariables [l
182a0 69 73 74 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ist \..         
182b0 20 55 73 65 5f 53 51 4c 69 74 65 43 6f 6e 76 65   Use_SQLiteConve
182c0 72 74 5f 44 65 66 61 75 6c 74 44 62 54 79 70 65  rt_DefaultDbType
182d0 20 55 73 65 5f 53 51 4c 69 74 65 43 6f 6e 76 65   Use_SQLiteConve
182e0 72 74 5f 44 65 66 61 75 6c 74 54 79 70 65 4e 61  rt_DefaultTypeNa
182f0 6d 65 5d 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  me] \..         
18300 20 73 61 76 65 64 45 6e 76 0d 0a 20 20 20 20 7d   savedEnv..    }
18310 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 72 65  .....    proc re
18320 73 74 6f 72 65 53 51 4c 69 74 65 43 6f 6e 76 65  storeSQLiteConve
18330 72 74 45 6e 76 69 72 6f 6e 6d 65 6e 74 20 7b 7d  rtEnvironment {}
18340 20 7b 0d 0a 20 20 20 20 20 20 75 70 76 61 72 20   {..      upvar 
18350 31 20 73 61 76 65 64 45 6e 76 20 73 61 76 65 64  1 savedEnv saved
18360 45 6e 76 0d 0a 0d 0a 20 20 20 20 20 20 72 65 73  Env....      res
18370 74 6f 72 65 45 6e 76 69 72 6f 6e 6d 65 6e 74 56  toreEnvironmentV
18380 61 72 69 61 62 6c 65 73 20 5b 6c 69 73 74 20 5c  ariables [list \
18390 0d 0a 20 20 20 20 20 20 20 20 20 20 55 73 65 5f  ..          Use_
183a0 53 51 4c 69 74 65 43 6f 6e 76 65 72 74 5f 44 65  SQLiteConvert_De
183b0 66 61 75 6c 74 44 62 54 79 70 65 20 55 73 65 5f  faultDbType Use_
183c0 53 51 4c 69 74 65 43 6f 6e 76 65 72 74 5f 44 65  SQLiteConvert_De
183d0 66 61 75 6c 74 54 79 70 65 4e 61 6d 65 5d 20 5c  faultTypeName] \
183e0 0d 0a 20 20 20 20 20 20 20 20 20 20 73 61 76 65  ..          save
183f0 64 45 6e 76 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a  dEnv..    }.....
18400 20 20 20 20 70 72 6f 63 20 73 65 74 75 70 44 62      proc setupDb
18410 49 6e 74 65 72 72 75 70 74 43 61 6c 6c 62 61 63  InterruptCallbac
18420 6b 20 7b 20 63 68 61 6e 6e 65 6c 20 6c 6f 67 20  k { channel log 
18430 7d 20 7b 0d 0a 20 20 20 20 20 20 74 70 75 74 73  } {..      tputs
18440 20 24 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20   $channel "---- 
18450 73 65 74 74 69 6e 67 20 75 70 20 64 65 62 75 67  setting up debug
18460 67 65 72 20 69 6e 74 65 72 72 75 70 74 20 63 61  ger interrupt ca
18470 6c 6c 62 61 63 6b 2e 2e 2e 20 22 0d 0a 0d 0a 20  llback... ".... 
18480 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20       if {[catch 
18490 7b 0d 0a 20 20 20 20 20 20 20 20 73 61 76 65 45  {..        saveE
184a0 6e 76 69 72 6f 6e 6d 65 6e 74 56 61 72 69 61 62  nvironmentVariab
184b0 6c 65 73 20 5b 6c 69 73 74 20 5c 0d 0a 20 20 20  les [list \..   
184c0 20 20 20 20 20 20 20 20 20 71 75 69 65 74 46 69           quietFi
184d0 6e 64 49 6e 74 65 72 70 72 65 74 65 72 54 65 73  ndInterpreterTes
184e0 74 50 61 74 68 20 71 75 69 65 74 53 65 74 75 70  tPath quietSetup
184f0 49 6e 74 65 72 70 72 65 74 65 72 54 65 73 74 50  InterpreterTestP
18500 61 74 68 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  ath]....        
18510 74 72 79 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  try {..         
18520 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20   #..          # 
18530 4e 4f 54 45 3a 20 50 72 65 76 65 6e 74 20 74 68  NOTE: Prevent th
18540 65 20 76 65 6e 64 6f 72 20 73 63 72 69 70 74 20  e vendor script 
18550 66 72 6f 6d 20 62 65 69 6e 67 20 6e 6f 69 73 79  from being noisy
18560 20 77 68 65 6e 20 63 72 65 61 74 69 6e 67 0d 0a   when creating..
18570 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20            #     
18580 20 20 74 68 65 20 69 73 6f 6c 61 74 65 64 20 69    the isolated i
18590 6e 74 65 72 70 72 65 74 65 72 2e 0d 0a 20 20 20  nterpreter...   
185a0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
185b0 20 20 20 20 73 65 74 20 3a 3a 65 6e 76 28 71 75      set ::env(qu
185c0 69 65 74 46 69 6e 64 49 6e 74 65 72 70 72 65 74  ietFindInterpret
185d0 65 72 54 65 73 74 50 61 74 68 29 20 31 0d 0a 20  erTestPath) 1.. 
185e0 20 20 20 20 20 20 20 20 20 73 65 74 20 3a 3a 65           set ::e
185f0 6e 76 28 71 75 69 65 74 53 65 74 75 70 49 6e 74  nv(quietSetupInt
18600 65 72 70 72 65 74 65 72 54 65 73 74 50 61 74 68  erpreterTestPath
18610 29 20 31 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  ) 1....         
18620 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20   #..          # 
18630 4e 4f 54 45 3a 20 4d 61 6b 65 20 73 75 72 65 20  NOTE: Make sure 
18640 74 68 65 20 73 63 72 69 70 74 20 64 65 62 75 67  the script debug
18650 67 65 72 20 61 6e 64 20 74 68 65 20 69 73 6f 6c  ger and the isol
18660 61 74 65 64 20 69 6e 74 65 72 70 72 65 74 65 72  ated interpreter
18670 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 20 20  ..          #   
18680 20 20 20 20 61 72 65 20 73 65 74 75 70 20 61 6e      are setup an
18690 64 20 72 65 61 64 79 20 66 6f 72 20 75 73 65 2e  d ready for use.
186a0 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20  ..          #.. 
186b0 20 20 20 20 20 20 20 20 20 64 65 62 75 67 20 73           debug s
186c0 65 74 75 70 20 74 72 75 65 20 74 72 75 65 0d 0a  etup true true..
186d0 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20  ..          #.. 
186e0 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a           # NOTE:
186f0 20 4c 6f 61 64 20 74 68 65 20 6e 65 63 65 73 73   Load the necess
18700 61 72 79 20 70 61 63 6b 61 67 65 73 20 69 6e 74  ary packages int
18710 6f 20 74 68 65 20 69 73 6f 6c 61 74 65 64 20 69  o the isolated i
18720 6e 74 65 72 70 72 65 74 65 72 2e 0d 0a 20 20 20  nterpreter...   
18730 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
18740 20 20 20 20 64 65 62 75 67 20 65 76 61 6c 20 7b      debug eval {
18750 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 61  ..            pa
18760 63 6b 61 67 65 20 72 65 71 75 69 72 65 20 45 61  ckage require Ea
18770 67 6c 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20  gle..           
18780 20 70 61 63 6b 61 67 65 20 72 65 71 75 69 72 65   package require
18790 20 45 61 67 6c 65 2e 4c 69 62 72 61 72 79 0d 0a   Eagle.Library..
187a0 20 20 20 20 20 20 20 20 20 20 20 20 70 61 63 6b              pack
187b0 61 67 65 20 72 65 71 75 69 72 65 20 45 61 67 6c  age require Eagl
187c0 65 2e 54 65 73 74 0d 0a 20 20 20 20 20 20 20 20  e.Test..        
187d0 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20    }....         
187e0 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20   #..          # 
187f0 4e 4f 54 45 3a 20 43 6f 70 79 20 74 68 65 20 6e  NOTE: Copy the n
18800 65 63 65 73 73 61 72 79 20 76 61 72 69 61 62 6c  ecessary variabl
18810 65 73 20 69 6e 74 6f 20 74 68 65 20 69 73 6f 6c  es into the isol
18820 61 74 65 64 20 69 6e 74 65 72 70 72 65 74 65 72  ated interpreter
18830 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a  ...          #..
18840 20 20 20 20 20 20 20 20 20 20 64 65 62 75 67 20            debug 
18850 69 6e 76 6f 6b 65 20 30 20 73 65 74 20 3a 3a 74  invoke 0 set ::t
18860 65 73 74 5f 63 68 61 6e 6e 65 6c 20 24 63 68 61  est_channel $cha
18870 6e 6e 65 6c 3b 20 23 20 4e 4f 54 45 3a 20 46 6f  nnel; # NOTE: Fo
18880 72 20 5b 74 70 75 74 73 5d 2e 0d 0a 20 20 20 20  r [tputs]...    
18890 20 20 20 20 20 20 64 65 62 75 67 20 69 6e 76 6f        debug invo
188a0 6b 65 20 30 20 73 65 74 20 3a 3a 74 65 73 74 5f  ke 0 set ::test_
188b0 6c 6f 67 20 24 6c 6f 67 3b 20 23 20 4e 4f 54 45  log $log; # NOTE
188c0 3a 20 46 6f 72 20 5b 74 6c 6f 67 5d 2e 0d 0a 0d  : For [tlog]....
188d0 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
188e0 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
188f0 49 6e 73 74 61 6c 6c 20 74 68 65 20 63 61 6c 6c  Install the call
18900 62 61 63 6b 20 73 63 72 69 70 74 20 74 6f 20 62  back script to b
18910 65 20 65 76 61 6c 75 61 74 65 64 20 69 6e 20 74  e evaluated in t
18920 68 65 20 69 73 6f 6c 61 74 65 64 0d 0a 20 20 20  he isolated..   
18930 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 69         #       i
18940 6e 74 65 72 70 72 65 74 65 72 20 77 68 65 6e 20  nterpreter when 
18950 74 68 69 73 20 69 6e 74 65 72 70 72 65 74 65 72  this interpreter
18960 20 69 73 20 69 6e 74 65 72 72 75 70 74 65 64 20   is interrupted 
18970 62 79 20 73 63 72 69 70 74 0d 0a 20 20 20 20 20  by script..     
18980 20 20 20 20 20 23 20 20 20 20 20 20 20 63 61 6e       #       can
18990 63 65 6c 6c 61 74 69 6f 6e 2c 20 65 74 63 2e 0d  cellation, etc..
189a0 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
189b0 20 20 20 20 20 20 20 20 64 65 62 75 67 20 63 61          debug ca
189c0 6c 6c 62 61 63 6b 20 61 70 70 6c 79 20 7b 7b 73  llback apply {{s
189d0 65 6e 64 65 72 20 65 7d 20 7b 0d 0a 20 20 20 20  ender e} {..    
189e0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
189f0 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43         # NOTE: C
18a00 68 65 63 6b 20 69 66 20 74 68 69 73 20 64 65 62  heck if this deb
18a10 75 67 67 65 72 20 63 61 6c 6c 62 61 63 6b 20 69  ugger callback i
18a20 73 20 6f 6e 65 20 74 68 61 74 20 77 65 20 63 61  s one that we ca
18a30 72 65 20 61 62 6f 75 74 2e 0d 0a 20 20 20 20 20  re about...     
18a40 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
18a50 20 20 20 20 20 20 73 65 74 20 69 6e 74 65 72 72        set interr
18a60 75 70 74 54 79 70 65 73 20 5b 73 70 6c 69 74 20  uptTypes [split 
18a70 5b 24 65 20 49 6e 74 65 72 72 75 70 74 54 79 70  [$e InterruptTyp
18a80 65 5d 20 22 2c 20 22 5d 0d 0a 0d 0a 20 20 20 20  e] ", "]....    
18a90 20 20 20 20 20 20 20 20 69 66 20 7b 22 43 61 6e          if {"Can
18aa0 63 65 6c 65 64 22 20 69 6e 20 24 69 6e 74 65 72  celed" in $inter
18ab0 72 75 70 74 54 79 70 65 73 20 7c 7c 20 5c 0d 0a  ruptTypes || \..
18ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18ad0 22 55 6e 77 6f 75 6e 64 22 20 69 6e 20 24 69 6e  "Unwound" in $in
18ae0 74 65 72 72 75 70 74 54 79 70 65 73 7d 20 74 68  terruptTypes} th
18af0 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
18b00 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
18b10 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4d 61 6b       # NOTE: Mak
18b20 65 20 73 75 72 65 20 74 68 65 20 5b 6f 62 6a 65  e sure the [obje
18b30 63 74 5d 20 63 6f 6d 6d 61 6e 64 20 69 73 20 61  ct] command is a
18b40 76 61 69 6c 61 62 6c 65 2e 20 20 53 69 6e 63 65  vailable.  Since
18b50 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
18b60 23 20 20 20 20 20 20 20 74 68 69 73 20 69 73 20  #       this is 
18b70 61 6e 20 69 73 6f 6c 61 74 65 64 20 69 6e 74 65  an isolated inte
18b80 72 70 72 65 74 65 72 2c 20 63 68 65 63 6b 20 66  rpreter, check f
18b90 6f 72 20 69 74 20 74 68 65 20 68 61 72 64 0d 0a  or it the hard..
18ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20                # 
18bb0 20 20 20 20 20 20 77 61 79 2e 0d 0a 20 20 20 20        way...    
18bc0 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
18bd0 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b             if {[
18be0 6c 6c 65 6e 67 74 68 20 5b 69 6e 66 6f 20 63 6f  llength [info co
18bf0 6d 6d 61 6e 64 73 20 6f 62 6a 65 63 74 5d 5d 20  mmands object]] 
18c00 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  > 0} then {..   
18c10 20 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a               #..
18c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18c30 23 20 4e 4f 54 45 3a 20 49 74 65 72 61 74 65 20  # NOTE: Iterate 
18c40 74 68 72 6f 75 67 68 20 61 6c 6c 20 64 61 74 61  through all data
18c50 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  base connections
18c60 20 6b 6e 6f 77 6e 20 74 6f 20 74 68 65 0d 0a 20   known to the.. 
18c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23                 #
18c80 20 20 20 20 20 20 20 70 61 72 65 6e 74 20 69 6e         parent in
18c90 74 65 72 70 72 65 74 65 72 2e 0d 0a 20 20 20 20  terpreter...    
18ca0 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20              #.. 
18cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f                 o
18cc0 62 6a 65 63 74 20 66 6f 72 65 61 63 68 20 2d 61  bject foreach -a
18cd0 6c 69 61 73 20 70 61 69 72 20 5b 6f 62 6a 65 63  lias pair [objec
18ce0 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20  t invoke -flags 
18cf0 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20  +NonPublic \..  
18d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18d10 20 20 24 65 20 49 6e 74 65 72 70 72 65 74 65 72    $e Interpreter
18d20 2e 63 6f 6e 6e 65 63 74 69 6f 6e 73 5d 20 7b 0d  .connections] {.
18d30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
18d40 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
18d50 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
18d60 41 74 74 65 6d 70 74 20 74 6f 20 63 61 6e 63 65  Attempt to cance
18d70 6c 20 61 6e 79 20 53 51 4c 20 71 75 65 72 69 65  l any SQL querie
18d80 73 20 69 6e 20 70 72 6f 67 72 65 73 73 20 6f 6e  s in progress on
18d90 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
18da0 20 20 20 20 23 20 20 20 20 20 20 20 74 68 69 73      #       this
18db0 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
18dc0 74 69 6f 6e 2e 0d 0a 20 20 20 20 20 20 20 20 20  tion...         
18dd0 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
18de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
18df0 20 7b 5b 63 61 74 63 68 20 7b 24 70 61 69 72 20   {[catch {$pair 
18e00 56 61 6c 75 65 2e 43 61 6e 63 65 6c 7d 20 65 72  Value.Cancel} er
18e10 72 6f 72 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ror]} then {..  
18e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18e30 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
18e40 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
18e50 72 67 73 20 5c 6e 20 5c 0d 0a 20 20 20 20 20 20  rgs \n \..      
18e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18e70 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a    "==== WARNING:
18e80 20 66 61 69 6c 65 64 20 74 6f 20 63 61 6e 63 65   failed to cance
18e90 6c 20 71 75 65 72 79 20 66 6f 72 20 22 20 5c 0d  l query for " \.
18ea0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
18eb0 20 20 20 20 20 20 20 20 20 22 63 6f 6e 6e 65 63           "connec
18ec0 74 69 6f 6e 20 5c 22 22 20 5b 24 70 61 69 72 20  tion \"" [$pair 
18ed0 4b 65 79 5d 20 22 5c 22 2c 20 65 72 72 6f 72 3a  Key] "\", error:
18ee0 20 22 20 5c 6e 5c 74 20 5c 0d 0a 20 20 20 20 20   " \n\t \..     
18ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18f00 20 20 20 24 65 72 72 6f 72 20 5c 6e 5d 0d 0a 20     $error \n].. 
18f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18f20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   }..            
18f30 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
18f40 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
18f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
18f60 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
18f70 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
18f80 20 5c 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20   \n \..         
18f90 20 20 20 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d             "====
18fa0 20 57 41 52 4e 49 4e 47 3a 20 63 61 6e 6e 6f 74   WARNING: cannot
18fb0 20 63 61 6e 63 65 6c 20 61 6e 79 20 71 75 65 72   cancel any quer
18fc0 69 65 73 3a 20 22 20 5c 0d 0a 20 20 20 20 20 20  ies: " \..      
18fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 74                "t
18fe0 68 65 20 5c 22 6f 62 6a 65 63 74 5c 22 20 63 6f  he \"object\" co
18ff0 6d 6d 61 6e 64 20 69 73 20 6e 6f 74 20 61 76 61  mmand is not ava
19000 69 6c 61 62 6c 65 5c 6e 22 5d 0d 0a 20 20 20 20  ilable\n"]..    
19010 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
19020 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
19030 20 20 20 20 20 20 7d 7d 0d 0a 20 20 20 20 20 20        }}..      
19040 20 20 7d 20 66 69 6e 61 6c 6c 79 20 7b 0d 0a 20    } finally {.. 
19050 20 20 20 20 20 20 20 20 20 72 65 73 74 6f 72 65           restore
19060 45 6e 76 69 72 6f 6e 6d 65 6e 74 56 61 72 69 61  EnvironmentVaria
19070 62 6c 65 73 20 5b 6c 69 73 74 20 5c 0d 0a 20 20  bles [list \..  
19080 20 20 20 20 20 20 20 20 20 20 20 20 71 75 69 65              quie
19090 74 46 69 6e 64 49 6e 74 65 72 70 72 65 74 65 72  tFindInterpreter
190a0 54 65 73 74 50 61 74 68 20 71 75 69 65 74 53 65  TestPath quietSe
190b0 74 75 70 49 6e 74 65 72 70 72 65 74 65 72 54 65  tupInterpreterTe
190c0 73 74 50 61 74 68 5d 0d 0a 20 20 20 20 20 20 20  stPath]..       
190d0 20 7d 0d 0a 20 20 20 20 20 20 7d 20 65 72 72 6f   }..      } erro
190e0 72 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d  r] == 0} then {.
190f0 0a 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73  .        addCons
19100 74 72 61 69 6e 74 20 69 6e 74 65 72 72 75 70 74  traint interrupt
19110 43 61 6c 6c 62 61 63 6b 2e 73 71 6c 69 74 65 33  Callback.sqlite3
19120 0d 0a 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74  ....        tput
19130 73 20 24 63 68 61 6e 6e 65 6c 20 79 65 73 5c 6e  s $channel yes\n
19140 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b  ..      } else {
19150 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20  ..        tputs 
19160 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  $channel [append
19170 41 72 67 73 20 22 6e 6f 2c 20 65 72 72 6f 72 3a  Args "no, error:
19180 20 22 20 5c 6e 5c 74 20 24 65 72 72 6f 72 20 5c   " \n\t $error \
19190 6e 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20  n]..      }..   
191a0 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
191b0 63 6c 65 61 6e 75 70 46 69 6c 65 20 7b 20 66 69  cleanupFile { fi
191c0 6c 65 4e 61 6d 65 20 7b 63 6f 6c 6c 65 63 74 20  leName {collect 
191d0 74 72 75 65 7d 20 7b 66 6f 72 63 65 20 66 61 6c  true} {force fal
191e0 73 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23  se} } {..      #
191f0 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
19200 41 74 74 65 6d 70 74 20 74 6f 20 66 6f 72 63 65  Attempt to force
19210 20 61 6c 6c 20 70 65 6e 64 69 6e 67 20 22 67 61   all pending "ga
19220 72 62 61 67 65 22 20 6f 62 6a 65 63 74 73 20 74  rbage" objects t
19230 6f 20 62 65 20 63 6f 6c 6c 65 63 74 65 64 2c 0d  o be collected,.
19240 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 69  .      #       i
19250 6e 63 6c 75 64 69 6e 67 20 53 51 4c 69 74 65 20  ncluding SQLite 
19260 73 74 61 74 65 6d 65 6e 74 73 20 61 6e 64 20 62  statements and b
19270 61 63 6b 75 70 20 6f 62 6a 65 63 74 73 3b 20 74  ackup objects; t
19280 68 69 73 20 73 68 6f 75 6c 64 20 61 6c 6c 6f 77  his should allow
19290 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
192a0 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 64  the underlying d
192b0 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20  atabase file to 
192c0 62 65 20 64 65 6c 65 74 65 64 2e 0d 0a 20 20 20  be deleted...   
192d0 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
192e0 24 63 6f 6c 6c 65 63 74 7d 20 74 68 65 6e 20 7b  $collect} then {
192f0 0d 0a 20 20 20 20 20 20 20 20 63 6f 6c 6c 65 63  ..        collec
19300 74 47 61 72 62 61 67 65 20 24 3a 3a 74 65 73 74  tGarbage $::test
19310 5f 63 68 61 6e 6e 65 6c 0d 0a 20 20 20 20 20 20  _channel..      
19320 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  }....      #..  
19330 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68 65 63      # NOTE: Chec
19340 6b 20 69 66 20 74 68 65 20 66 69 6c 65 20 73 74  k if the file st
19350 69 6c 6c 20 65 78 69 73 74 73 2e 0d 0a 20 20 20  ill exists...   
19360 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
19370 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24 66 69  [file exists $fi
19380 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d  leName]} then {.
19390 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
193a0 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 6b 69 70      # NOTE: Skip
193b0 20 64 65 6c 65 74 69 6e 67 20 74 65 73 74 20 66   deleting test f
193c0 69 6c 65 73 20 69 66 20 73 6f 6d 65 62 6f 64 79  iles if somebody
193d0 20 73 65 74 73 20 74 68 65 20 67 6c 6f 62 61 6c   sets the global
193e0 20 76 61 72 69 61 62 6c 65 0d 0a 20 20 20 20 20   variable..     
193f0 20 20 20 23 20 20 20 20 20 20 20 74 6f 20 70 72     #       to pr
19400 65 76 65 6e 74 20 69 74 2e 0d 0a 20 20 20 20 20  event it...     
19410 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 69 66     #..        if
19420 20 7b 24 66 6f 72 63 65 20 7c 7c 20 21 5b 69 6e   {$force || ![in
19430 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 63  fo exists ::no(c
19440 6c 65 61 6e 75 70 46 69 6c 65 29 5d 7d 20 74 68  leanupFile)]} th
19450 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
19460 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e  #..          # N
19470 4f 54 45 3a 20 41 74 74 65 6d 70 74 20 74 6f 20  OTE: Attempt to 
19480 64 65 6c 65 74 65 20 74 68 65 20 74 65 73 74 20  delete the test 
19490 66 69 6c 65 20 6e 6f 77 2e 0d 0a 20 20 20 20 20  file now...     
194a0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
194b0 20 20 69 66 20 7b 5b 73 65 74 20 63 6f 64 65 20    if {[set code 
194c0 5b 63 61 74 63 68 20 7b 66 69 6c 65 20 64 65 6c  [catch {file del
194d0 65 74 65 20 24 66 69 6c 65 4e 61 6d 65 7d 20 65  ete $fileName} e
194e0 72 72 6f 72 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a  rror]]} then {..
194f0 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20              #.. 
19500 20 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54             # NOT
19510 45 3a 20 57 65 20 73 6f 6d 65 68 6f 77 20 66 61  E: We somehow fa
19520 69 6c 65 64 20 74 6f 20 64 65 6c 65 74 65 20 74  iled to delete t
19530 68 65 20 66 69 6c 65 2c 20 72 65 70 6f 72 74 20  he file, report 
19540 77 68 79 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  why...          
19550 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20    #..           
19560 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
19570 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
19580 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
19590 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e        "==== WARN
195a0 49 4e 47 3a 20 66 61 69 6c 65 64 20 74 6f 20 64  ING: failed to d
195b0 65 6c 65 74 65 20 74 65 73 74 20 66 69 6c 65 20  elete test file 
195c0 5c 22 22 20 24 66 69 6c 65 4e 61 6d 65 20 5c 0d  \"" $fileName \.
195d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
195e0 20 22 5c 22 20 64 75 72 69 6e 67 20 63 6c 65 61   "\" during clea
195f0 6e 75 70 2c 20 65 72 72 6f 72 3a 20 22 20 5c 6e  nup, error: " \n
19600 5c 74 20 24 65 72 72 6f 72 20 5c 6e 5d 0d 0a 20  \t $error \n].. 
19610 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
19620 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
19630 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
19640 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 68 6f       # NOTE: Sho
19650 77 20 74 68 61 74 20 77 65 20 73 6b 69 70 70 65  w that we skippe
19660 64 20 64 65 6c 65 74 69 6e 67 20 74 68 65 20 66  d deleting the f
19670 69 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  ile...          
19680 23 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74  #..          set
19690 20 63 6f 64 65 20 30 0d 0a 0d 0a 20 20 20 20 20   code 0....     
196a0 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
196b0 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
196c0 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
196d0 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41          "==== WA
196e0 52 4e 49 4e 47 3a 20 73 6b 69 70 70 65 64 20 64  RNING: skipped d
196f0 65 6c 65 74 69 6e 67 20 74 65 73 74 20 66 69 6c  eleting test fil
19700 65 20 5c 22 22 20 24 66 69 6c 65 4e 61 6d 65 20  e \"" $fileName 
19710 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
19720 20 22 5c 22 20 64 75 72 69 6e 67 20 63 6c 65 61   "\" during clea
19730 6e 75 70 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20  nup\n"]..       
19740 20 7d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65   }..      } else
19750 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20   {..        #.. 
19760 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54         # NOTE: T
19770 68 65 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74  he file does not
19780 20 65 78 69 73 74 2c 20 73 75 63 63 65 73 73 21   exist, success!
19790 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
197a0 20 20 20 20 20 73 65 74 20 63 6f 64 65 20 30 0d       set code 0.
197b0 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
197c0 20 20 72 65 74 75 72 6e 20 24 63 6f 64 65 0d 0a    return $code..
197d0 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
197e0 6f 63 20 63 6c 65 61 6e 75 70 4d 65 6d 6f 72 79  oc cleanupMemory
197f0 20 7b 20 76 61 72 4e 61 6d 65 20 7b 71 75 69 65   { varName {quie
19800 74 20 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a 20 20  t false} } {..  
19810 20 20 20 20 69 66 20 7b 5b 68 61 76 65 53 51 4c      if {[haveSQL
19820 69 74 65 4f 62 6a 65 63 74 43 6f 6d 6d 61 6e 64  iteObjectCommand
19830 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20  ] && \..        
19840 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68    [string length
19850 20 24 76 61 72 4e 61 6d 65 5d 20 3e 20 30 7d 20   $varName] > 0} 
19860 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
19870 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
19880 45 3a 20 52 65 66 65 72 20 74 6f 20 74 68 65 20  E: Refer to the 
19890 73 70 65 63 69 66 69 65 64 20 76 61 72 69 61 62  specified variab
198a0 6c 65 20 28 65 2e 67 2e 20 22 63 6f 6e 6e 65 63  le (e.g. "connec
198b0 74 69 6f 6e 22 29 20 69 6e 20 74 68 65 0d 0a 20  tion") in the.. 
198c0 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63         #       c
198d0 6f 6e 74 65 78 74 20 6f 66 20 6f 75 72 20 63 61  ontext of our ca
198e0 6c 6c 65 72 2e 20 20 54 68 65 20 6f 70 61 71 75  ller.  The opaqu
198f0 65 20 6f 62 6a 65 63 74 20 68 61 6e 64 6c 65 20  e object handle 
19900 66 6f 72 20 61 6e 0d 0a 20 20 20 20 20 20 20 20  for an..        
19910 23 20 20 20 20 20 20 20 41 44 4f 2e 4e 45 54 20  #       ADO.NET 
19920 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 72 65 76 69  connection previ
19930 6f 75 73 6c 79 20 72 65 74 75 72 6e 65 64 20 62  ously returned b
19940 79 20 5b 67 65 74 44 62 43 6f 6e 6e 65 63 74 69  y [getDbConnecti
19950 6f 6e 5d 0d 0a 20 20 20 20 20 20 20 20 23 20 20  on]..        #  
19960 20 20 20 20 20 73 68 6f 75 6c 64 20 62 65 20 73       should be s
19970 74 6f 72 65 64 20 74 68 65 72 65 2e 0d 0a 20 20  tored there...  
19980 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
19990 20 75 70 76 61 72 20 31 20 24 76 61 72 4e 61 6d   upvar 1 $varNam
199a0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0d 0a 0d 0a  e connection....
199b0 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74          if {[cat
199c0 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  ch {..          
199d0 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 24 63  object invoke $c
199e0 6f 6e 6e 65 63 74 69 6f 6e 20 52 65 6c 65 61 73  onnection Releas
199f0 65 4d 65 6d 6f 72 79 0d 0a 20 20 20 20 20 20 20  eMemory..       
19a00 20 7d 20 72 65 73 75 6c 74 5d 7d 20 74 68 65 6e   } result]} then
19a10 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66   {..          if
19a20 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20   {!$quiet} then 
19a30 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  {..            t
19a40 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
19a50 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
19a60 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
19a70 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e      "==== WARNIN
19a80 47 3a 20 66 61 69 6c 65 64 20 74 6f 20 72 65 6c  G: failed to rel
19a90 65 61 73 65 20 64 61 74 61 62 61 73 65 20 6d 65  ease database me
19aa0 6d 6f 72 79 2c 20 65 72 72 6f 72 3a 20 22 20 5c  mory, error: " \
19ab0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
19ac0 20 20 5c 6e 5c 74 20 24 72 65 73 75 6c 74 20 5c    \n\t $result \
19ad0 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d  n]..          }.
19ae0 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  .        }..    
19af0 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20    }....      if 
19b00 7b 5b 6c 6c 65 6e 67 74 68 20 5b 69 6e 66 6f 20  {[llength [info 
19b10 63 6f 6d 6d 61 6e 64 73 20 64 65 62 75 67 5d 5d  commands debug]]
19b20 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20   > 0} then {..  
19b30 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68        if {[catch
19b40 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 75 70   {..          up
19b50 6c 65 76 65 6c 20 31 20 5b 6c 69 73 74 20 64 65  level 1 [list de
19b60 62 75 67 20 70 75 72 67 65 5d 0d 0a 20 20 20 20  bug purge]..    
19b70 20 20 20 20 7d 20 72 65 73 75 6c 74 5d 7d 20 74      } result]} t
19b80 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
19b90 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68   if {!$quiet} th
19ba0 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
19bb0 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
19bc0 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
19bd0 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
19be0 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52         "==== WAR
19bf0 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20 74 6f 20  NING: failed to 
19c00 70 75 72 67 65 20 63 61 6c 6c 20 66 72 61 6d 65  purge call frame
19c10 2c 20 65 72 72 6f 72 3a 20 22 20 5c 0d 0a 20 20  , error: " \..  
19c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 6e                \n
19c30 5c 74 20 24 72 65 73 75 6c 74 20 5c 6e 5d 0d 0a  \t $result \n]..
19c40 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
19c50 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
19c60 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a    if {[catch {..
19c70 20 20 20 20 20 20 20 20 20 20 75 70 6c 65 76 65            upleve
19c80 6c 20 31 20 5b 6c 69 73 74 20 64 65 62 75 67 20  l 1 [list debug 
19c90 63 6c 65 61 6e 75 70 5d 0d 0a 20 20 20 20 20 20  cleanup]..      
19ca0 20 20 7d 20 72 65 73 75 6c 74 5d 7d 20 74 68 65    } result]} the
19cb0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69  n {..          i
19cc0 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e  f {!$quiet} then
19cd0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
19ce0 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
19cf0 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
19d00 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
19d10 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49       "==== WARNI
19d20 4e 47 3a 20 66 61 69 6c 65 64 20 74 6f 20 63 6c  NG: failed to cl
19d30 65 61 6e 75 70 20 69 6e 74 65 72 70 72 65 74 65  eanup interprete
19d40 72 2c 20 65 72 72 6f 72 3a 20 22 20 5c 0d 0a 20  r, error: " \.. 
19d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
19d60 6e 5c 74 20 24 72 65 73 75 6c 74 20 5c 6e 5d 0d  n\t $result \n].
19d70 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  .          }..  
19d80 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
19d90 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d     if {[catch {.
19da0 0a 20 20 20 20 20 20 20 20 20 20 75 70 6c 65 76  .          uplev
19db0 65 6c 20 31 20 5b 6c 69 73 74 20 64 65 62 75 67  el 1 [list debug
19dc0 20 63 6f 6c 6c 65 63 74 5d 0d 0a 20 20 20 20 20   collect]..     
19dd0 20 20 20 7d 20 72 65 73 75 6c 74 5d 7d 20 74 68     } result]} th
19de0 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
19df0 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65  if {!$quiet} the
19e00 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
19e10 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
19e20 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
19e30 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
19e40 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e        "==== WARN
19e50 49 4e 47 3a 20 66 61 69 6c 65 64 20 74 6f 20 63  ING: failed to c
19e60 6f 6c 6c 65 63 74 20 67 61 72 62 61 67 65 2c 20  ollect garbage, 
19e70 65 72 72 6f 72 3a 20 22 20 5c 0d 0a 20 20 20 20  error: " \..    
19e80 20 20 20 20 20 20 20 20 20 20 20 20 5c 6e 5c 74              \n\t
19e90 20 24 72 65 73 75 6c 74 20 5c 6e 5d 0d 0a 20 20   $result \n]..  
19ea0 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
19eb0 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20     }..      }.. 
19ec0 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
19ed0 63 20 73 65 74 75 70 4d 65 6d 6f 72 79 43 6f 75  c setupMemoryCou
19ee0 6e 74 65 72 73 20 7b 20 76 61 72 4e 61 6d 65 20  nters { varName 
19ef0 7d 20 7b 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b  } {..      if {[
19f00 68 61 76 65 53 51 4c 69 74 65 4f 62 6a 65 63 74  haveSQLiteObject
19f10 43 6f 6d 6d 61 6e 64 5d 7d 20 74 68 65 6e 20 7b  Command]} then {
19f20 0d 0a 20 20 20 20 20 20 20 20 75 70 76 61 72 20  ..        upvar 
19f30 31 20 24 76 61 72 4e 61 6d 65 20 63 6f 75 6e 74  1 $varName count
19f40 65 72 0d 0a 0d 0a 20 20 20 20 20 20 20 20 73 65  er....        se
19f50 74 20 63 6f 75 6e 74 65 72 28 31 29 20 5b 6f 62  t counter(1) [ob
19f60 6a 65 63 74 20 63 72 65 61 74 65 20 2d 61 6c 69  ject create -ali
19f70 61 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  as \..          
19f80 20 20 53 79 73 74 65 6d 2e 44 69 61 67 6e 6f 73    System.Diagnos
19f90 74 69 63 73 2e 50 65 72 66 6f 72 6d 61 6e 63 65  tics.Performance
19fa0 43 6f 75 6e 74 65 72 20 50 72 6f 63 65 73 73 20  Counter Process 
19fb0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22  \..            "
19fc0 57 6f 72 6b 69 6e 67 20 53 65 74 22 20 5b 66 69  Working Set" [fi
19fd0 6c 65 20 72 6f 6f 74 6e 61 6d 65 20 5b 66 69 6c  le rootname [fil
19fe0 65 20 74 61 69 6c 20 24 3a 3a 62 69 6e 5f 66 69  e tail $::bin_fi
19ff0 6c 65 5d 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  le]]]....       
1a000 20 73 65 74 20 63 6f 75 6e 74 65 72 28 32 29 20   set counter(2) 
1a010 5b 6f 62 6a 65 63 74 20 63 72 65 61 74 65 20 2d  [object create -
1a020 61 6c 69 61 73 20 5c 0d 0a 20 20 20 20 20 20 20  alias \..       
1a030 20 20 20 20 20 53 79 73 74 65 6d 2e 44 69 61 67       System.Diag
1a040 6e 6f 73 74 69 63 73 2e 50 65 72 66 6f 72 6d 61  nostics.Performa
1a050 6e 63 65 43 6f 75 6e 74 65 72 20 50 72 6f 63 65  nceCounter Proce
1a060 73 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  ss \..          
1a070 20 20 22 57 6f 72 6b 69 6e 67 20 53 65 74 20 50    "Working Set P
1a080 65 61 6b 22 20 5b 66 69 6c 65 20 72 6f 6f 74 6e  eak" [file rootn
1a090 61 6d 65 20 5b 66 69 6c 65 20 74 61 69 6c 20 24  ame [file tail $
1a0a0 3a 3a 62 69 6e 5f 66 69 6c 65 5d 5d 5d 0d 0a 0d  ::bin_file]]]...
1a0b0 0a 20 20 20 20 20 20 20 20 73 65 74 20 63 6f 75  .        set cou
1a0c0 6e 74 65 72 28 33 29 20 5b 6f 62 6a 65 63 74 20  nter(3) [object 
1a0d0 63 72 65 61 74 65 20 2d 61 6c 69 61 73 20 5c 0d  create -alias \.
1a0e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 53 79 73  .            Sys
1a0f0 74 65 6d 2e 44 69 61 67 6e 6f 73 74 69 63 73 2e  tem.Diagnostics.
1a100 50 65 72 66 6f 72 6d 61 6e 63 65 43 6f 75 6e 74  PerformanceCount
1a110 65 72 20 50 72 6f 63 65 73 73 20 5c 0d 0a 20 20  er Process \..  
1a120 20 20 20 20 20 20 20 20 20 20 22 50 72 69 76 61            "Priva
1a130 74 65 20 42 79 74 65 73 22 20 5b 66 69 6c 65 20  te Bytes" [file 
1a140 72 6f 6f 74 6e 61 6d 65 20 5b 66 69 6c 65 20 74  rootname [file t
1a150 61 69 6c 20 24 3a 3a 62 69 6e 5f 66 69 6c 65 5d  ail $::bin_file]
1a160 5d 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  ]]..      }.... 
1a170 20 20 20 20 20 72 65 74 75 72 6e 20 22 22 0d 0a       return ""..
1a180 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
1a190 6f 63 20 72 65 70 6f 72 74 4d 65 6d 6f 72 79 43  oc reportMemoryC
1a1a0 6f 75 6e 74 65 72 73 20 7b 20 63 68 61 6e 6e 65  ounters { channe
1a1b0 6c 20 76 61 72 4e 61 6d 65 20 70 72 65 66 69 78  l varName prefix
1a1c0 20 7d 20 7b 0d 0a 20 20 20 20 20 20 69 66 20 7b   } {..      if {
1a1d0 5b 68 61 76 65 53 51 4c 69 74 65 4f 62 6a 65 63  [haveSQLiteObjec
1a1e0 74 43 6f 6d 6d 61 6e 64 5d 7d 20 74 68 65 6e 20  tCommand]} then 
1a1f0 7b 0d 0a 20 20 20 20 20 20 20 20 75 70 76 61 72  {..        upvar
1a200 20 31 20 24 76 61 72 4e 61 6d 65 20 63 6f 75 6e   1 $varName coun
1a210 74 65 72 0d 0a 0d 0a 20 20 20 20 20 20 20 20 74  ter....        t
1a220 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61  puts $channel [a
1a230 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
1a240 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 22           "---- "
1a250 20 24 70 72 65 66 69 78 20 22 20 63 6f 75 6e 74   $prefix " count
1a260 65 72 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20  er \"" \..      
1a270 20 20 20 20 20 20 5b 6f 62 6a 65 63 74 20 69 6e        [object in
1a280 76 6f 6b 65 20 24 63 6f 75 6e 74 65 72 28 31 29  voke $counter(1)
1a290 20 43 6f 75 6e 74 65 72 4e 61 6d 65 5d 20 22 5c   CounterName] "\
1a2a0 22 20 76 61 6c 75 65 20 69 73 20 22 20 5c 0d 0a  " value is " \..
1a2b0 20 20 20 20 20 20 20 20 20 20 20 20 5b 6f 62 6a              [obj
1a2c0 65 63 74 20 69 6e 76 6f 6b 65 20 24 63 6f 75 6e  ect invoke $coun
1a2d0 74 65 72 28 31 29 20 52 61 77 56 61 6c 75 65 5d  ter(1) RawValue]
1a2e0 20 5c 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20   \n]....        
1a2f0 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b  tputs $channel [
1a300 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
1a310 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
1a320 22 20 24 70 72 65 66 69 78 20 22 20 63 6f 75 6e  " $prefix " coun
1a330 74 65 72 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20  ter \"" \..     
1a340 20 20 20 20 20 20 20 5b 6f 62 6a 65 63 74 20 69         [object i
1a350 6e 76 6f 6b 65 20 24 63 6f 75 6e 74 65 72 28 32  nvoke $counter(2
1a360 29 20 43 6f 75 6e 74 65 72 4e 61 6d 65 5d 20 22  ) CounterName] "
1a370 5c 22 20 76 61 6c 75 65 20 69 73 20 22 20 5c 0d  \" value is " \.
1a380 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 6f 62  .            [ob
1a390 6a 65 63 74 20 69 6e 76 6f 6b 65 20 24 63 6f 75  ject invoke $cou
1a3a0 6e 74 65 72 28 32 29 20 52 61 77 56 61 6c 75 65  nter(2) RawValue
1a3b0 5d 20 5c 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  ] \n]....       
1a3c0 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
1a3d0 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
1a3e0 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
1a3f0 20 22 20 24 70 72 65 66 69 78 20 22 20 63 6f 75   " $prefix " cou
1a400 6e 74 65 72 20 5c 22 22 20 5c 0d 0a 20 20 20 20  nter \"" \..    
1a410 20 20 20 20 20 20 20 20 5b 6f 62 6a 65 63 74 20          [object 
1a420 69 6e 76 6f 6b 65 20 24 63 6f 75 6e 74 65 72 28  invoke $counter(
1a430 33 29 20 43 6f 75 6e 74 65 72 4e 61 6d 65 5d 20  3) CounterName] 
1a440 22 5c 22 20 76 61 6c 75 65 20 69 73 20 22 20 5c  "\" value is " \
1a450 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 6f  ..            [o
1a460 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 24 63 6f  bject invoke $co
1a470 75 6e 74 65 72 28 33 29 20 52 61 77 56 61 6c 75  unter(3) RawValu
1a480 65 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d 0d  e] \n]..      }.
1a490 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70  .    }.....    p
1a4a0 72 6f 63 20 63 6f 6c 6c 65 63 74 47 61 72 62 61  roc collectGarba
1a4b0 67 65 20 7b 20 63 68 61 6e 6e 65 6c 20 7b 6d 69  ge { channel {mi
1a4c0 6c 6c 69 73 65 63 6f 6e 64 73 20 31 30 30 30 7d  lliseconds 1000}
1a4d0 20 7b 71 75 69 65 74 20 74 72 75 65 7d 20 7d 20   {quiet true} } 
1a4e0 7b 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 68 61  {..      if {[ha
1a4f0 76 65 53 51 4c 69 74 65 4f 62 6a 65 63 74 43 6f  veSQLiteObjectCo
1a500 6d 6d 61 6e 64 5d 7d 20 74 68 65 6e 20 7b 0d 0a  mmand]} then {..
1a510 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74          if {[cat
1a520 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  ch {..          
1a530 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 47 43  object invoke GC
1a540 20 47 65 74 54 6f 74 61 6c 4d 65 6d 6f 72 79 20   GetTotalMemory 
1a550 66 61 6c 73 65 0d 0a 20 20 20 20 20 20 20 20 7d  false..        }
1a560 20 72 65 73 75 6c 74 5d 20 3d 3d 20 30 7d 20 74   result] == 0} t
1a570 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
1a580 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68   if {!$quiet} th
1a590 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
1a5a0 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
1a5b0 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
1a5c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a5d0 22 2d 2d 2d 2d 20 6d 65 6d 6f 72 79 20 69 6e 20  "---- memory in 
1a5e0 75 73 65 20 62 79 20 74 68 65 20 43 4c 52 20 62  use by the CLR b
1a5f0 65 66 6f 72 65 20 63 6f 6c 6c 65 63 74 69 6f 6e  efore collection
1a600 2e 2e 2e 20 22 20 5c 0d 0a 20 20 20 20 20 20 20  ... " \..       
1a610 20 20 20 20 20 20 20 20 20 24 72 65 73 75 6c 74           $result
1a620 20 22 20 62 79 74 65 73 5c 6e 22 5d 0d 0a 20 20   " bytes\n"]..  
1a630 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
1a640 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
1a650 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
1a660 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
1a670 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
1a680 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47     "==== WARNING
1a690 3a 20 66 61 69 6c 65 64 20 74 6f 20 67 65 74 20  : failed to get 
1a6a0 43 4c 52 20 6d 65 6d 6f 72 79 20 75 73 61 67 65  CLR memory usage
1a6b0 2c 20 65 72 72 6f 72 3a 20 22 20 5c 0d 0a 20 20  , error: " \..  
1a6c0 20 20 20 20 20 20 20 20 20 20 20 20 5c 6e 5c 74              \n\t
1a6d0 20 24 72 65 73 75 6c 74 20 5c 6e 5d 0d 0a 20 20   $result \n]..  
1a6e0 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d        }..      }
1a6f0 0d 0a 0d 0a 20 20 20 20 20 20 23 23 23 23 23 23  ....      ######
1a700 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1a710 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1a720 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1a730 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1a740 23 23 23 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a  ###....      #..
1a750 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 52 65        # NOTE: Re
1a760 70 65 61 74 65 64 6c 79 20 61 74 74 65 6d 70 74  peatedly attempt
1a770 20 74 6f 20 63 6f 6c 6c 65 63 74 20 67 61 72 62   to collect garb
1a780 61 67 65 20 75 6e 74 69 6c 20 74 68 65 20 61 6c  age until the al
1a790 6c 6f 74 74 65 64 20 6e 75 6d 62 65 72 0d 0a 20  lotted number.. 
1a7a0 20 20 20 20 20 23 20 20 20 20 20 20 20 6f 66 20       #       of 
1a7b0 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20 68 61 73  milliseconds has
1a7c0 20 65 6c 61 70 73 65 64 2e 20 20 41 6c 77 61 79   elapsed.  Alway
1a7d0 73 20 61 74 74 65 6d 70 74 20 74 6f 20 63 6f 6c  s attempt to col
1a7e0 6c 65 63 74 20 67 61 72 62 61 67 65 0d 0a 20 20  lect garbage..  
1a7f0 20 20 20 20 23 20 20 20 20 20 20 20 61 74 20 6c      #       at l
1a800 65 61 73 74 20 6f 6e 63 65 2e 0d 0a 20 20 20 20  east once...    
1a810 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b    #..      if {[
1a820 68 61 76 65 53 51 4c 69 74 65 4f 62 6a 65 63 74  haveSQLiteObject
1a830 43 6f 6d 6d 61 6e 64 5d 7d 20 74 68 65 6e 20 7b  Command]} then {
1a840 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 73 74  ..        set st
1a850 61 72 74 20 5b 63 6c 6f 63 6b 20 73 65 63 6f 6e  art [clock secon
1a860 64 73 5d 0d 0a 20 20 20 20 20 20 20 20 73 65 74  ds]..        set
1a870 20 73 74 6f 70 20 5b 65 78 70 72 20 7b 24 73 74   stop [expr {$st
1a880 61 72 74 20 2b 20 28 24 6d 69 6c 6c 69 73 65 63  art + ($millisec
1a890 6f 6e 64 73 20 2f 20 31 30 30 30 29 7d 5d 0d 0a  onds / 1000)}]..
1a8a0 0d 0a 20 20 20 20 20 20 20 20 64 6f 20 7b 0d 0a  ..        do {..
1a8b0 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
1a8c0 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41         # NOTE: A
1a8d0 74 74 65 6d 70 74 20 74 6f 20 66 6f 72 63 65 20  ttempt to force 
1a8e0 61 20 66 75 6c 6c 20 67 61 72 62 61 67 65 20 63  a full garbage c
1a8f0 6f 6c 6c 65 63 74 69 6f 6e 20 6e 6f 77 2e 20 20  ollection now.  
1a900 52 65 70 6f 72 74 20 61 6e 79 0d 0a 20 20 20 20  Report any..    
1a910 20 20 20 20 20 20 23 20 20 20 20 20 20 20 65 72        #       er
1a920 72 6f 72 20 74 68 61 74 20 69 73 20 65 6e 63 6f  ror that is enco
1a930 75 6e 74 65 72 65 64 20 69 66 20 77 65 20 66 61  untered if we fa
1a940 69 6c 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23  il...          #
1a950 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b  ..          if {
1a960 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20  [catch {..      
1a970 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76        object inv
1a980 6f 6b 65 20 47 43 20 47 65 74 54 6f 74 61 6c 4d  oke GC GetTotalM
1a990 65 6d 6f 72 79 20 74 72 75 65 0d 0a 20 20 20 20  emory true..    
1a9a0 20 20 20 20 20 20 7d 20 65 72 72 6f 72 5d 7d 20        } error]} 
1a9b0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
1a9c0 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
1a9d0 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
1a9e0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1a9f0 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a    "==== WARNING:
1aa00 20 66 61 69 6c 65 64 20 66 75 6c 6c 20 67 61 72   failed full gar
1aa10 62 61 67 65 20 63 6f 6c 6c 65 63 74 69 6f 6e 2c  bage collection,
1aa20 20 65 72 72 6f 72 3a 20 22 20 5c 0d 0a 20 20 20   error: " \..   
1aa30 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 6e 5c               \n\
1aa40 74 20 24 65 72 72 6f 72 20 5c 6e 5d 0d 0a 20 20  t $error \n]..  
1aa50 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
1aa60 20 20 20 20 20 20 20 73 65 74 20 6e 6f 77 20 5b         set now [
1aa70 63 6c 6f 63 6b 20 73 65 63 6f 6e 64 73 5d 0d 0a  clock seconds]..
1aa80 20 20 20 20 20 20 20 20 7d 20 77 68 69 6c 65 20          } while 
1aa90 7b 24 73 74 61 72 74 20 3c 3d 20 24 6e 6f 77 20  {$start <= $now 
1aaa0 26 26 20 24 6e 6f 77 20 3c 20 24 73 74 6f 70 7d  && $now < $stop}
1aab0 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
1aac0 20 20 20 23 23 23 23 23 23 23 23 23 23 23 23 23     #############
1aad0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1aae0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1aaf0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1ab00 23 23 23 23 23 23 23 23 23 23 23 23 0d 0a 0d 0a  ############....
1ab10 20 20 20 20 20 20 69 66 20 7b 5b 68 61 76 65 53        if {[haveS
1ab20 51 4c 69 74 65 4f 62 6a 65 63 74 43 6f 6d 6d 61  QLiteObjectComma
1ab30 6e 64 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  nd]} then {..   
1ab40 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20       if {[catch 
1ab50 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 6f 62 6a  {..          obj
1ab60 65 63 74 20 69 6e 76 6f 6b 65 20 47 43 20 47 65  ect invoke GC Ge
1ab70 74 54 6f 74 61 6c 4d 65 6d 6f 72 79 20 66 61 6c  tTotalMemory fal
1ab80 73 65 0d 0a 20 20 20 20 20 20 20 20 7d 20 72 65  se..        } re
1ab90 73 75 6c 74 5d 20 3d 3d 20 30 7d 20 74 68 65 6e  sult] == 0} then
1aba0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66   {..          if
1abb0 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20   {!$quiet} then 
1abc0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  {..            t
1abd0 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61  puts $channel [a
1abe0 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
1abf0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d               "--
1ac00 2d 2d 20 6d 65 6d 6f 72 79 20 69 6e 20 75 73 65  -- memory in use
1ac10 20 62 79 20 74 68 65 20 43 4c 52 20 61 66 74 65   by the CLR afte
1ac20 72 20 63 6f 6c 6c 65 63 74 69 6f 6e 2e 2e 2e 20  r collection... 
1ac30 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  " \..           
1ac40 20 20 20 20 20 24 72 65 73 75 6c 74 20 22 20 62       $result " b
1ac50 79 74 65 73 5c 6e 22 5d 0d 0a 20 20 20 20 20 20  ytes\n"]..      
1ac60 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d      }..        }
1ac70 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
1ac80 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
1ac90 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
1aca0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22  .              "
1acb0 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61  ==== WARNING: fa
1acc0 69 6c 65 64 20 74 6f 20 67 65 74 20 43 4c 52 20  iled to get CLR 
1acd0 6d 65 6d 6f 72 79 20 75 73 61 67 65 2c 20 65 72  memory usage, er
1ace0 72 6f 72 3a 20 22 20 5c 0d 0a 20 20 20 20 20 20  ror: " \..      
1acf0 20 20 20 20 20 20 20 20 5c 6e 5c 74 20 24 72 65          \n\t $re
1ad00 73 75 6c 74 20 5c 6e 5d 0d 0a 20 20 20 20 20 20  sult \n]..      
1ad10 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20    }..      }..  
1ad20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
1ad30 20 67 65 74 53 51 4c 69 74 65 48 61 6e 64 6c 65   getSQLiteHandle
1ad40 43 6f 75 6e 74 73 20 7b 20 63 68 61 6e 6e 65 6c  Counts { channel
1ad50 20 7b 71 75 69 65 74 20 66 61 6c 73 65 7d 20 7d   {quiet false} }
1ad60 20 7b 0d 0a 20 20 20 20 20 20 73 65 74 20 72 65   {..      set re
1ad70 73 75 6c 74 20 5b 6c 69 73 74 5d 0d 0a 0d 0a 20  sult [list].... 
1ad80 20 20 20 20 20 69 66 20 7b 5b 68 61 76 65 53 51       if {[haveSQ
1ad90 4c 69 74 65 4f 62 6a 65 63 74 43 6f 6d 6d 61 6e  LiteObjectComman
1ada0 64 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20  d] && \..       
1adb0 20 20 20 5b 68 61 76 65 53 51 4c 69 74 65 44 65     [haveSQLiteDe
1adc0 66 69 6e 65 43 6f 6e 73 74 61 6e 74 20 43 4f 55  fineConstant COU
1add0 4e 54 5f 48 41 4e 44 4c 45 5d 7d 20 74 68 65 6e  NT_HANDLE]} then
1ade0 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20   {..        #.. 
1adf0 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41         # NOTE: A
1ae00 64 64 20 65 61 63 68 20 63 72 69 74 69 63 61 6c  dd each critical
1ae10 20 68 61 6e 64 6c 65 20 63 6f 75 6e 74 20 74 6f   handle count to
1ae20 20 74 68 65 20 72 65 73 75 6c 74 69 6e 67 20 6c   the resulting l
1ae30 69 73 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  ist...        #.
1ae40 0a 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68  .        foreach
1ae50 20 6e 61 6d 65 20 5b 6c 69 73 74 20 63 6f 6e 6e   name [list conn
1ae60 65 63 74 69 6f 6e 43 6f 75 6e 74 20 73 74 61 74  ectionCount stat
1ae70 65 6d 65 6e 74 43 6f 75 6e 74 20 62 61 63 6b 75  ementCount backu
1ae80 70 43 6f 75 6e 74 5d 20 7b 0d 0a 20 20 20 20 20  pCount] {..     
1ae90 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20       if {[catch 
1aea0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 6f  {..            o
1aeb0 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c  bject invoke -fl
1aec0 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c  ags +NonPublic \
1aed0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1aee0 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51    System.Data.SQ
1aef0 4c 69 74 65 2e 44 65 62 75 67 44 61 74 61 20 24  Lite.DebugData $
1af00 6e 61 6d 65 0d 0a 20 20 20 20 20 20 20 20 20 20  name..          
1af10 7d 20 76 61 6c 75 65 5d 20 3d 3d 20 30 7d 20 74  } value] == 0} t
1af20 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
1af30 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20     if {!$quiet} 
1af40 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
1af50 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
1af60 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
1af70 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
1af80 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 72 69 74        "---- crit
1af90 69 63 61 6c 20 68 61 6e 64 6c 65 20 63 6f 75 6e  ical handle coun
1afa0 74 20 5c 22 22 20 24 6e 61 6d 65 20 22 5c 22 20  t \"" $name "\" 
1afb0 69 73 20 22 20 24 76 61 6c 75 65 20 5c 6e 5d 0d  is " $value \n].
1afc0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  .            }..
1afd0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 6c 61  ..            la
1afe0 70 70 65 6e 64 20 72 65 73 75 6c 74 20 24 76 61  ppend result $va
1aff0 6c 75 65 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  lue..          }
1b000 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
1b010 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
1b020 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
1b030 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
1b040 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47     "==== WARNING
1b050 3a 20 66 61 69 6c 65 64 20 74 6f 20 67 65 74 20  : failed to get 
1b060 63 72 69 74 69 63 61 6c 20 68 61 6e 64 6c 65 20  critical handle 
1b070 63 6f 75 6e 74 20 5c 22 22 20 5c 0d 0a 20 20 20  count \"" \..   
1b080 20 20 20 20 20 20 20 20 20 20 20 20 20 24 6e 61               $na
1b090 6d 65 20 22 5c 22 2c 20 65 72 72 6f 72 3a 20 22  me "\", error: "
1b0a0 20 5c 6e 5c 74 20 24 76 61 6c 75 65 20 5c 6e 5d   \n\t $value \n]
1b0b0 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20  ..          }.. 
1b0c0 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
1b0d0 7d 20 65 6c 73 65 69 66 20 7b 21 24 71 75 69 65  } elseif {!$quie
1b0e0 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  t} then {..     
1b0f0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
1b100 4e 4f 54 45 3a 20 54 68 65 20 61 63 74 75 61 6c  NOTE: The actual
1b110 20 68 61 6e 64 6c 65 20 63 6f 75 6e 74 73 20 61   handle counts a
1b120 72 65 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65  re not available
1b130 3b 20 74 68 65 72 65 66 6f 72 65 2c 20 6a 75 73  ; therefore, jus
1b140 74 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  t..        #    
1b150 20 20 20 72 65 74 75 72 6e 20 61 6e 20 65 6d 70     return an emp
1b160 74 79 20 6c 69 73 74 2e 0d 0a 20 20 20 20 20 20  ty list...      
1b170 20 20 23 0d 0a 20 20 20 20 20 20 20 20 74 70 75    #..        tpu
1b180 74 73 20 24 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d  ts $channel "---
1b190 2d 20 63 72 69 74 69 63 61 6c 20 68 61 6e 64 6c  - critical handl
1b1a0 65 20 63 6f 75 6e 74 73 20 75 6e 61 76 61 69 6c  e counts unavail
1b1b0 61 62 6c 65 5c 6e 22 0d 0a 20 20 20 20 20 20 7d  able\n"..      }
1b1c0 0d 0a 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ....      return
1b1d0 20 24 72 65 73 75 6c 74 0d 0a 20 20 20 20 7d 0d   $result..    }.
1b1e0 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 73 68 75  ....    proc shu
1b1f0 74 64 6f 77 6e 53 51 4c 69 74 65 20 7b 20 63 68  tdownSQLite { ch
1b200 61 6e 6e 65 6c 20 7b 66 6f 72 63 65 20 66 61 6c  annel {force fal
1b210 73 65 7d 20 7b 71 75 69 65 74 20 66 61 6c 73 65  se} {quiet false
1b220 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a  } } {..      #..
1b230 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4d 61        # NOTE: Ma
1b240 6b 65 20 73 75 72 65 20 74 68 61 74 20 53 51 4c  ke sure that SQL
1b250 69 74 65 20 63 6f 72 65 20 6c 69 62 72 61 72 79  ite core library
1b260 20 69 73 20 63 6f 6d 70 6c 65 74 65 6c 79 20 73   is completely s
1b270 68 75 74 64 6f 77 6e 2e 20 20 54 68 69 73 0d 0a  hutdown.  This..
1b280 20 20 20 20 20 20 23 20 20 20 20 20 20 20 69 73        #       is
1b290 20 75 73 65 64 20 62 79 20 74 65 73 74 73 20 74   used by tests t
1b2a0 68 61 74 20 63 68 61 6e 67 65 20 63 6f 6e 66 69  hat change confi
1b2b0 67 75 72 61 74 69 6f 6e 20 6f 70 74 69 6f 6e 73  guration options
1b2c0 20 61 6e 64 2f 6f 72 20 74 68 6f 73 65 0d 0a 20   and/or those.. 
1b2d0 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68 61       #       tha
1b2e0 74 20 6e 65 65 64 20 74 6f 20 6d 61 6b 65 20 73  t need to make s
1b2f0 75 72 65 20 6c 6f 67 67 69 6e 67 20 69 73 20 69  ure logging is i
1b300 6e 69 74 69 61 6c 69 7a 65 64 20 28 69 2e 65 2e  nitialized (i.e.
1b310 20 6a 75 73 74 20 69 6e 20 63 61 73 65 0d 0a 20   just in case.. 
1b320 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68 65       #       the
1b330 20 53 51 4c 69 74 65 20 63 6f 72 65 20 6c 69 62   SQLite core lib
1b340 72 61 72 79 20 77 61 73 20 69 6e 69 74 69 61 6c  rary was initial
1b350 69 7a 65 64 20 69 6e 20 74 68 65 20 70 72 6f 63  ized in the proc
1b360 65 73 73 20 70 72 69 6f 72 20 74 6f 0d 0a 20 20  ess prior to..  
1b370 20 20 20 20 23 20 20 20 20 20 20 20 74 68 65 20      #       the 
1b380 53 51 4c 69 74 65 4c 6f 67 20 63 6c 61 73 73 20  SQLiteLog class 
1b390 62 65 69 6e 67 20 61 62 6c 65 20 74 6f 20 73 65  being able to se
1b3a0 74 75 70 20 69 74 73 20 6c 6f 67 67 69 6e 67 20  tup its logging 
1b3b0 63 61 6c 6c 62 61 63 6b 29 2e 0d 0a 20 20 20 20  callback)...    
1b3c0 20 20 23 20 20 20 20 20 20 20 4e 6f 72 6d 61 6c    #       Normal
1b3d0 6c 79 2c 20 74 68 69 73 20 73 68 6f 75 6c 64 20  ly, this should 
1b3e0 6f 6e 6c 79 20 62 65 20 70 65 72 66 6f 72 6d 65  only be performe
1b3f0 64 20 69 66 20 53 51 4c 69 74 65 20 69 73 20 6c  d if SQLite is l
1b400 6f 61 64 65 64 20 61 6e 64 0d 0a 20 20 20 20 20  oaded and..     
1b410 20 23 20 20 20 20 20 20 20 72 65 61 64 79 20 66   #       ready f
1b420 6f 72 20 75 73 65 20 62 79 20 74 68 65 20 74 65  or use by the te
1b430 73 74 20 73 75 69 74 65 2e 0d 0a 20 20 20 20 20  st suite...     
1b440 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 24 66   #..      if {$f
1b450 6f 72 63 65 20 7c 7c 20 5b 69 73 53 51 4c 69 74  orce || [isSQLit
1b460 65 52 65 61 64 79 5d 7d 20 74 68 65 6e 20 7b 0d  eReady]} then {.
1b470 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
1b480 20 20 20 20 23 20 42 55 47 46 49 58 3a 20 4d 61      # BUGFIX: Ma
1b490 6b 65 20 73 75 72 65 20 74 68 61 74 20 61 6e 79  ke sure that any
1b4a0 20 22 6c 65 61 6b 65 64 22 20 74 72 61 6e 73 61   "leaked" transa
1b4b0 63 74 69 6f 6e 73 20 61 6e 64 2f 6f 72 20 63 6f  ctions and/or co
1b4c0 6e 6e 65 63 74 69 6f 6e 73 0d 0a 20 20 20 20 20  nnections..     
1b4d0 20 20 20 23 20 20 20 20 20 20 20 20 20 61 72 65     #         are
1b4e0 20 63 6c 65 61 6e 65 64 20 75 70 20 62 65 66 6f   cleaned up befo
1b4f0 72 65 20 63 61 6c 6c 69 6e 67 20 74 68 65 20 6e  re calling the n
1b500 61 74 69 76 65 20 73 68 75 74 64 6f 77 6e 20 66  ative shutdown f
1b510 75 6e 63 74 69 6f 6e 2e 0d 0a 20 20 20 20 20 20  unction...      
1b520 20 20 23 0d 0a 20 20 20 20 20 20 20 20 66 6f 72    #..        for
1b530 65 61 63 68 20 74 72 61 6e 73 61 63 74 69 6f 6e  each transaction
1b540 20 5b 69 6e 66 6f 20 74 72 61 6e 73 61 63 74 69   [info transacti
1b550 6f 6e 73 5d 20 7b 0d 0a 20 20 20 20 20 20 20 20  ons] {..        
1b560 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6d 61    if {[string ma
1b570 74 63 68 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  tch \..         
1b580 20 20 20 20 20 53 79 73 74 65 6d 23 44 61 74 61       System#Data
1b590 23 53 51 4c 69 74 65 23 53 51 4c 69 74 65 54 72  #SQLite#SQLiteTr
1b5a0 61 6e 73 61 63 74 69 6f 6e 23 2a 20 24 74 72 61  ansaction#* $tra
1b5b0 6e 73 61 63 74 69 6f 6e 5d 7d 20 74 68 65 6e 20  nsaction]} then 
1b5c0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  {..            i
1b5d0 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20  f {[catch {..   
1b5e0 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 20 74             sql t
1b5f0 72 61 6e 73 61 63 74 69 6f 6e 20 72 6f 6c 6c 62  ransaction rollb
1b600 61 63 6b 20 24 74 72 61 6e 73 61 63 74 69 6f 6e  ack $transaction
1b610 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 20  ..            } 
1b620 65 72 72 6f 72 5d 20 3d 3d 20 30 7d 20 74 68 65  error] == 0} the
1b630 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
1b640 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20     if {!$quiet} 
1b650 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
1b660 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
1b670 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
1b680 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
1b690 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
1b6a0 72 6f 6c 6c 65 64 20 62 61 63 6b 20 6c 65 61 6b  rolled back leak
1b6b0 65 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 5c  ed transaction \
1b6c0 22 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  "" \..          
1b6d0 20 20 20 20 20 20 20 20 20 20 24 74 72 61 6e 73            $trans
1b6e0 61 63 74 69 6f 6e 20 5c 22 5c 6e 5d 0d 0a 20 20  action \"\n]..  
1b6f0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
1b700 20 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73             } els
1b710 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e {..           
1b720 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20     if {!$quiet} 
1b730 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
1b740 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
1b750 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
1b760 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
1b770 20 20 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20            "==== 
1b780 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20  WARNING: failed 
1b790 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 6c 65 61 6b  to rollback leak
1b7a0 65 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 5c  ed transaction \
1b7b0 22 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  "" \..          
1b7c0 20 20 20 20 20 20 20 20 20 20 24 74 72 61 6e 73            $trans
1b7d0 61 63 74 69 6f 6e 20 22 5c 22 2c 20 65 72 72 6f  action "\", erro
1b7e0 72 3a 20 22 20 5c 6e 5c 74 20 24 65 72 72 6f 72  r: " \n\t $error
1b7f0 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20   \n]..          
1b800 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
1b810 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
1b820 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  }..        }....
1b830 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20          foreach 
1b840 64 62 20 5b 69 6e 66 6f 20 63 6f 6e 6e 65 63 74  db [info connect
1b850 69 6f 6e 73 5d 20 7b 0d 0a 20 20 20 20 20 20 20  ions] {..       
1b860 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6d     if {[string m
1b870 61 74 63 68 20 5c 0d 0a 20 20 20 20 20 20 20 20  atch \..        
1b880 20 20 20 20 20 20 53 79 73 74 65 6d 23 44 61 74        System#Dat
1b890 61 23 53 51 4c 69 74 65 23 53 51 4c 69 74 65 43  a#SQLite#SQLiteC
1b8a0 6f 6e 6e 65 63 74 69 6f 6e 23 2a 20 24 64 62 5d  onnection#* $db]
1b8b0 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
1b8c0 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68        if {[catch
1b8d0 20 7b 73 71 6c 20 63 6c 6f 73 65 20 24 64 62 7d   {sql close $db}
1b8e0 20 65 72 72 6f 72 5d 20 3d 3d 20 30 7d 20 74 68   error] == 0} th
1b8f0 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
1b900 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d      if {!$quiet}
1b910 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
1b920 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
1b930 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
1b940 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
1b950 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
1b960 20 63 6c 6f 73 65 64 20 6c 65 61 6b 65 64 20 64   closed leaked d
1b970 61 74 61 62 61 73 65 20 5c 22 22 20 24 64 62 20  atabase \"" $db 
1b980 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20  \"\n]..         
1b990 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
1b9a0 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
1b9b0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b              if {
1b9c0 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d  !$quiet} then {.
1b9d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1b9e0 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
1b9f0 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
1ba00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ba10 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47     "==== WARNING
1ba20 3a 20 66 61 69 6c 65 64 20 74 6f 20 63 6c 6f 73  : failed to clos
1ba30 65 20 6c 65 61 6b 65 64 20 64 61 74 61 62 61 73  e leaked databas
1ba40 65 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20 20  e \"" \..       
1ba50 20 20 20 20 20 20 20 20 20 20 20 20 20 24 64 62               $db
1ba60 20 22 5c 22 2c 20 65 72 72 6f 72 3a 20 22 20 5c   "\", error: " \
1ba70 6e 5c 74 20 24 65 72 72 6f 72 20 5c 6e 5d 0d 0a  n\t $error \n]..
1ba80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d                }.
1ba90 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  .            }..
1baa0 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
1bab0 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
1bac0 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 42    #..        # B
1bad0 55 47 46 49 58 3a 20 42 65 66 6f 72 65 20 63 61  UGFIX: Before ca
1bae0 6c 6c 69 6e 67 20 74 68 65 20 6e 61 74 69 76 65  lling the native
1baf0 20 73 68 75 74 64 6f 77 6e 20 66 75 6e 63 74 69   shutdown functi
1bb00 6f 6e 2c 20 6d 61 6b 65 20 73 75 72 65 20 62 6f  on, make sure bo
1bb10 74 68 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  th..        #   
1bb20 20 20 20 20 20 20 6f 66 20 74 68 65 20 50 52 41        of the PRA
1bb30 47 4d 41 20 72 65 6c 61 74 65 64 20 64 69 72 65  GMA related dire
1bb40 63 74 6f 72 79 20 6e 61 6d 65 73 20 61 72 65 20  ctory names are 
1bb50 66 72 65 65 64 2e 0d 0a 20 20 20 20 20 20 20 20  freed...        
1bb60 23 0d 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b  #..        check
1bb70 46 6f 72 53 51 4c 69 74 65 44 69 72 65 63 74 6f  ForSQLiteDirecto
1bb80 72 69 65 73 20 24 63 68 61 6e 6e 65 6c 20 74 72  ries $channel tr
1bb90 75 65 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66  ue....        if
1bba0 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20   {[catch {..    
1bbb0 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76        object inv
1bbc0 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50  oke -flags +NonP
1bbd0 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20 20  ublic \..       
1bbe0 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61         System.Da
1bbf0 74 61 2e 53 51 4c 69 74 65 2e 55 6e 73 61 66 65  ta.SQLite.Unsafe
1bc00 4e 61 74 69 76 65 4d 65 74 68 6f 64 73 20 73 71  NativeMethods sq
1bc10 6c 69 74 65 33 5f 73 68 75 74 64 6f 77 6e 0d 0a  lite3_shutdown..
1bc20 20 20 20 20 20 20 20 20 7d 20 72 65 73 75 6c 74          } result
1bc30 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  ] == 0} then {..
1bc40 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 24            if {!$
1bc50 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20  quiet} then {.. 
1bc60 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
1bc70 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e   $channel [appen
1bc80 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
1bc90 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63           "---- c
1bca0 61 6c 6c 20 73 71 6c 69 74 65 33 5f 73 68 75 74  all sqlite3_shut
1bcb0 64 6f 77 6e 28 29 2e 2e 2e 20 6f 6b 3a 20 22 20  down()... ok: " 
1bcc0 24 72 65 73 75 6c 74 20 5c 6e 5d 0d 0a 20 20 20  $result \n]..   
1bcd0 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
1bce0 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
1bcf0 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65        if {!$quie
1bd00 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  t} then {..     
1bd10 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
1bd20 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
1bd30 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
1bd40 20 20 20 20 20 22 2d 2d 2d 2d 20 63 61 6c 6c 20       "---- call 
1bd50 73 71 6c 69 74 65 33 5f 73 68 75 74 64 6f 77 6e  sqlite3_shutdown
1bd60 28 29 2e 2e 2e 20 65 72 72 6f 72 3a 20 22 20 5c  ()... error: " \
1bd70 6e 5c 74 20 24 72 65 73 75 6c 74 20 5c 6e 5d 0d  n\t $result \n].
1bd80 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  .          }..  
1bd90 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d        }..      }
1bda0 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
1bdb0 70 72 6f 63 20 72 65 70 6f 72 74 53 51 4c 69 74  proc reportSQLit
1bdc0 65 52 65 73 6f 75 72 63 65 73 20 7b 0d 0a 20 20  eResources {..  
1bdd0 20 20 20 20 20 20 20 20 20 20 63 68 61 6e 6e 65            channe
1bde0 6c 20 7b 71 75 69 65 74 20 66 61 6c 73 65 7d 20  l {quiet false} 
1bdf0 7b 72 65 73 65 74 20 74 72 75 65 7d 20 7b 63 6f  {reset true} {co
1be00 6c 6c 65 63 74 20 74 72 75 65 7d 20 7d 20 7b 0d  llect true} } {.
1be10 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
1be20 23 20 4e 4f 54 45 3a 20 49 66 20 61 76 61 69 6c  # NOTE: If avail
1be30 61 62 6c 65 2c 20 72 65 70 6f 72 74 20 6f 6e 20  able, report on 
1be40 28 61 6e 64 20 70 6f 73 73 69 62 6c 79 20 72 65  (and possibly re
1be50 73 65 74 29 20 74 68 65 20 72 75 6e 74 69 6d 65  set) the runtime
1be60 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
1be70 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 73 74  configuration st
1be80 61 74 69 73 74 69 63 73 2e 0d 0a 20 20 20 20 20  atistics...     
1be90 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 68   #..      if {[h
1bea0 61 76 65 53 51 4c 69 74 65 4f 62 6a 65 63 74 43  aveSQLiteObjectC
1beb0 6f 6d 6d 61 6e 64 5d 20 26 26 20 5c 0d 0a 20 20  ommand] && \..  
1bec0 20 20 20 20 20 20 20 20 5b 68 61 76 65 43 6f 6e          [haveCon
1bed0 73 74 72 61 69 6e 74 20 62 75 69 6c 64 43 6f 6e  straint buildCon
1bee0 66 69 67 75 72 61 74 69 6f 6e 2e 44 65 62 75 67  figuration.Debug
1bef0 5d 20 26 26 20 5b 63 61 74 63 68 20 7b 0d 0a 20  ] && [catch {.. 
1bf00 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e         object in
1bf10 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e  voke -flags +Non
1bf20 50 75 62 6c 69 63 20 2d 61 6c 69 61 73 20 5c 0d  Public -alias \.
1bf30 0a 20 20 20 20 20 20 20 20 20 20 20 20 53 79 73  .            Sys
1bf40 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e  tem.Data.SQLite.
1bf50 44 65 62 75 67 44 61 74 61 20 73 65 74 74 69 6e  DebugData settin
1bf60 67 52 65 61 64 43 6f 75 6e 74 73 0d 0a 20 20 20  gReadCounts..   
1bf70 20 20 20 7d 20 73 65 74 74 69 6e 67 52 65 61 64     } settingRead
1bf80 43 6f 75 6e 74 73 5d 20 3d 3d 20 30 7d 20 74 68  Counts] == 0} th
1bf90 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 65  en {..        se
1bfa0 74 20 6e 61 6d 65 43 6f 75 6e 74 20 5b 24 73 65  t nameCount [$se
1bfb0 74 74 69 6e 67 52 65 61 64 43 6f 75 6e 74 73 20  ttingReadCounts 
1bfc0 43 6f 75 6e 74 5d 0d 0a 20 20 20 20 20 20 20 20  Count]..        
1bfd0 73 65 74 20 76 61 6c 75 65 43 6f 75 6e 74 20 30  set valueCount 0
1bfe0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 6f 62 6a 65  ....        obje
1bff0 63 74 20 66 6f 72 65 61 63 68 20 2d 61 6c 69 61  ct foreach -alia
1c000 73 20 70 61 69 72 20 24 73 65 74 74 69 6e 67 52  s pair $settingR
1c010 65 61 64 43 6f 75 6e 74 73 20 7b 0d 0a 20 20 20  eadCounts {..   
1c020 20 20 20 20 20 20 20 69 6e 63 72 20 76 61 6c 75         incr valu
1c030 65 43 6f 75 6e 74 20 5b 24 70 61 69 72 20 56 61  eCount [$pair Va
1c040 6c 75 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  lue]....        
1c050 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74    if {!$quiet} t
1c060 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
1c070 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
1c080 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
1c090 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1c0a0 20 22 2d 2d 2d 2d 20 73 65 74 74 69 6e 67 20 5c   "---- setting \
1c0b0 22 22 20 5b 24 70 61 69 72 20 4b 65 79 5d 20 22  "" [$pair Key] "
1c0c0 5c 22 20 77 61 73 20 72 65 61 64 20 22 20 5c 0d  \" was read " \.
1c0d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1c0e0 20 5b 24 70 61 69 72 20 56 61 6c 75 65 5d 20 22   [$pair Value] "
1c0f0 20 74 69 6d 65 73 5c 6e 22 5d 0d 0a 20 20 20 20   times\n"]..    
1c100 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
1c110 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66   }....        if
1c120 20 7b 24 72 65 73 65 74 7d 20 74 68 65 6e 20 7b   {$reset} then {
1c130 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b  ..          if {
1c140 5b 63 61 74 63 68 20 7b 24 73 65 74 74 69 6e 67  [catch {$setting
1c150 52 65 61 64 43 6f 75 6e 74 73 20 43 6c 65 61 72  ReadCounts Clear
1c160 7d 20 65 72 72 6f 72 5d 20 3d 3d 20 30 7d 20 74  } error] == 0} t
1c170 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
1c180 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20     if {!$quiet} 
1c190 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
1c1a0 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
1c1b0 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
1c1c0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
1c1d0 20 20 20 20 20 20 22 2d 2d 2d 2d 20 72 65 73 65        "---- rese
1c1e0 74 20 73 65 74 74 69 6e 67 20 73 74 61 74 69 73  t setting statis
1c1f0 74 69 63 73 20 66 6f 72 20 74 68 65 20 70 72 65  tics for the pre
1c200 76 69 6f 75 73 20 22 20 5c 0d 0a 20 20 20 20 20  vious " \..     
1c210 20 20 20 20 20 20 20 20 20 20 20 20 20 24 6e 61               $na
1c220 6d 65 43 6f 75 6e 74 20 22 20 6e 61 6d 65 73 20  meCount " names 
1c230 61 6e 64 20 22 20 24 76 61 6c 75 65 43 6f 75 6e  and " $valueCoun
1c240 74 20 22 20 76 61 6c 75 65 73 20 72 65 61 64 5c  t " values read\
1c250 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n"]..           
1c260 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 20   }..          } 
1c270 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
1c280 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
1c290 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
1c2a0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1c2b0 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a    "==== WARNING:
1c2c0 20 66 61 69 6c 65 64 20 74 6f 20 72 65 73 65 74   failed to reset
1c2d0 20 73 65 74 74 69 6e 67 20 73 74 61 74 69 73 74   setting statist
1c2e0 69 63 73 20 66 6f 72 20 22 20 5c 0d 0a 20 20 20  ics for " \..   
1c2f0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 74 68               "th
1c300 65 20 70 72 65 76 69 6f 75 73 20 22 20 24 6e 61  e previous " $na
1c310 6d 65 43 6f 75 6e 74 20 22 20 6e 61 6d 65 73 20  meCount " names 
1c320 61 6e 64 20 22 20 24 76 61 6c 75 65 43 6f 75 6e  and " $valueCoun
1c330 74 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  t \..           
1c340 20 20 20 20 20 22 20 76 61 6c 75 65 73 20 72 65       " values re
1c350 61 64 2c 20 65 72 72 6f 72 3a 20 22 20 5c 6e 5c  ad, error: " \n\
1c360 74 20 24 65 72 72 6f 72 20 5c 6e 5d 0d 0a 20 20  t $error \n]..  
1c370 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
1c380 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d     }..      }...
1c390 0a 20 20 20 20 20 20 69 66 20 7b 5b 68 61 76 65  .      if {[have
1c3a0 53 51 4c 69 74 65 4f 62 6a 65 63 74 43 6f 6d 6d  SQLiteObjectComm
1c3b0 61 6e 64 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20  and] && \..     
1c3c0 20 20 20 20 20 5b 68 61 76 65 53 51 4c 69 74 65       [haveSQLite
1c3d0 44 65 66 69 6e 65 43 6f 6e 73 74 61 6e 74 20 49  DefineConstant I
1c3e0 4e 54 45 52 4f 50 5f 56 49 52 54 55 41 4c 5f 54  NTEROP_VIRTUAL_T
1c3f0 41 42 4c 45 5d 20 26 26 20 5c 0d 0a 20 20 20 20  ABLE] && \..    
1c400 20 20 20 20 20 20 5b 68 61 76 65 53 51 4c 69 74        [haveSQLit
1c410 65 44 65 66 69 6e 65 43 6f 6e 73 74 61 6e 74 20  eDefineConstant 
1c420 54 52 41 43 4b 5f 4d 45 4d 4f 52 59 5f 42 59 54  TRACK_MEMORY_BYT
1c430 45 53 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  ES]} then {..   
1c440 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74       if {!$quiet
1c450 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
1c460 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
1c470 65 6c 20 22 2d 2d 2d 2d 20 63 75 72 72 65 6e 74  el "---- current
1c480 20 6d 65 6d 6f 72 79 20 69 6e 20 75 73 65 20 62   memory in use b
1c490 79 20 53 51 4c 69 74 65 4d 65 6d 6f 72 79 2e 2e  y SQLiteMemory..
1c4a0 2e 20 22 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  . "..        }..
1c4b0 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63  ..        if {[c
1c4c0 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20  atch {..        
1c4d0 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20    object invoke 
1c4e0 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69  -flags +NonPubli
1c4f0 63 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  c \..           
1c500 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53     System.Data.S
1c510 51 4c 69 74 65 2e 53 51 4c 69 74 65 4d 65 6d 6f  QLite.SQLiteMemo
1c520 72 79 20 62 79 74 65 73 41 6c 6c 6f 63 61 74 65  ry bytesAllocate
1c530 64 0d 0a 20 20 20 20 20 20 20 20 7d 20 6d 65 6d  d..        } mem
1c540 6f 72 79 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20  ory] == 0} then 
1c550 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20  {..          if 
1c560 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b  {!$quiet} then {
1c570 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70  ..            tp
1c580 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70  uts $channel [ap
1c590 70 65 6e 64 41 72 67 73 20 24 6d 65 6d 6f 72 79  pendArgs $memory
1c5a0 20 22 20 62 79 74 65 73 5c 6e 22 5d 0d 0a 20 20   " bytes\n"]..  
1c5b0 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
1c5c0 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
1c5d0 20 20 20 20 20 20 20 73 65 74 20 6d 65 6d 6f 72         set memor
1c5e0 79 20 75 6e 6b 6e 6f 77 6e 0d 0a 0d 0a 20 20 20  y unknown....   
1c5f0 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69         if {!$qui
1c600 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  et} then {..    
1c610 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
1c620 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
1c630 67 73 20 24 6d 65 6d 6f 72 79 20 5c 6e 5d 0d 0a  gs $memory \n]..
1c640 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
1c650 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
1c660 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74    if {!$quiet} t
1c670 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
1c680 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
1c690 22 2d 2d 2d 2d 20 6d 61 78 69 6d 75 6d 20 6d 65  "---- maximum me
1c6a0 6d 6f 72 79 20 69 6e 20 75 73 65 20 62 79 20 53  mory in use by S
1c6b0 51 4c 69 74 65 4d 65 6d 6f 72 79 2e 2e 2e 20 22  QLiteMemory... "
1c6c0 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  ..        }.... 
1c6d0 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63         if {[catc
1c6e0 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 6f  h {..          o
1c6f0 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c  bject invoke -fl
1c700 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c  ags +NonPublic \
1c710 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1c720 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
1c730 74 65 2e 53 51 4c 69 74 65 4d 65 6d 6f 72 79 20  te.SQLiteMemory 
1c740 6d 61 78 69 6d 75 6d 42 79 74 65 73 41 6c 6c 6f  maximumBytesAllo
1c750 63 61 74 65 64 0d 0a 20 20 20 20 20 20 20 20 7d  cated..        }
1c760 20 6d 65 6d 6f 72 79 5d 20 3d 3d 20 30 7d 20 74   memory] == 0} t
1c770 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
1c780 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68   if {!$quiet} th
1c790 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
1c7a0 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
1c7b0 20 5b 61 70 70 65 6e 64 41 72 67 73 20 24 6d 65   [appendArgs $me
1c7c0 6d 6f 72 79 20 22 20 62 79 74 65 73 5c 6e 22 5d  mory " bytes\n"]
1c7d0 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20  ..          }.. 
1c7e0 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d         } else {.
1c7f0 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20 6d  .          set m
1c800 65 6d 6f 72 79 20 75 6e 6b 6e 6f 77 6e 0d 0a 0d  emory unknown...
1c810 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21  .          if {!
1c820 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a  $quiet} then {..
1c830 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
1c840 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  s $channel [appe
1c850 6e 64 41 72 67 73 20 24 6d 65 6d 6f 72 79 20 5c  ndArgs $memory \
1c860 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d  n]..          }.
1c870 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  .        }..    
1c880 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20    }....      if 
1c890 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b  {!$quiet} then {
1c8a0 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20  ..        tputs 
1c8b0 24 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 63  $channel "---- c
1c8c0 75 72 72 65 6e 74 20 6d 65 6d 6f 72 79 20 69 6e  urrent memory in
1c8d0 20 75 73 65 20 62 79 20 53 51 4c 69 74 65 2e 2e   use by SQLite..
1c8e0 2e 20 22 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a  . "..      }....
1c8f0 20 20 20 20 20 20 69 66 20 7b 5b 68 61 76 65 53        if {[haveS
1c900 51 4c 69 74 65 4f 62 6a 65 63 74 43 6f 6d 6d 61  QLiteObjectComma
1c910 6e 64 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  nd]} then {..   
1c920 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20       if {[catch 
1c930 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 6f 62 6a  {..          obj
1c940 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67  ect invoke -flag
1c950 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a  s +NonPublic \..
1c960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 79                Sy
1c970 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
1c980 2e 55 6e 73 61 66 65 4e 61 74 69 76 65 4d 65 74  .UnsafeNativeMet
1c990 68 6f 64 73 20 73 71 6c 69 74 65 33 5f 6d 65 6d  hods sqlite3_mem
1c9a0 6f 72 79 5f 75 73 65 64 0d 0a 20 20 20 20 20 20  ory_used..      
1c9b0 20 20 7d 20 6d 65 6d 6f 72 79 5d 20 3d 3d 20 30    } memory] == 0
1c9c0 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
1c9d0 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d      if {!$quiet}
1c9e0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
1c9f0 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
1ca00 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
1ca10 24 6d 65 6d 6f 72 79 20 22 20 62 79 74 65 73 5c  $memory " bytes\
1ca20 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  n"]..          }
1ca30 0d 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65  ..        } else
1ca40 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d   {..          #.
1ca50 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54  .          # NOT
1ca60 45 3a 20 4d 61 79 62 65 20 74 68 65 20 53 51 4c  E: Maybe the SQL
1ca70 69 74 65 20 63 6f 72 65 20 6c 69 62 72 61 72 79  ite core library
1ca80 20 69 73 20 75 6e 61 76 61 69 6c 61 62 6c 65 3f   is unavailable?
1ca90 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20  ..          #.. 
1caa0 20 20 20 20 20 20 20 20 20 73 65 74 20 6d 65 6d           set mem
1cab0 6f 72 79 20 75 6e 6b 6e 6f 77 6e 0d 0a 0d 0a 20  ory unknown.... 
1cac0 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71           if {!$q
1cad0 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  uiet} then {..  
1cae0 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
1caf0 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  $channel [append
1cb00 41 72 67 73 20 24 6d 65 6d 6f 72 79 20 5c 6e 5d  Args $memory \n]
1cb10 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20  ..          }.. 
1cb20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
1cb30 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
1cb40 20 20 73 65 74 20 6d 65 6d 6f 72 79 20 75 6e 61    set memory una
1cb50 76 61 69 6c 61 62 6c 65 0d 0a 0d 0a 20 20 20 20  vailable....    
1cb60 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d      if {!$quiet}
1cb70 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
1cb80 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
1cb90 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 24 6d  l [appendArgs $m
1cba0 65 6d 6f 72 79 20 5c 6e 5d 0d 0a 20 20 20 20 20  emory \n]..     
1cbb0 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d     }..      }...
1cbc0 0a 20 20 20 20 20 20 73 65 74 20 72 65 73 75 6c  .      set resul
1cbd0 74 20 24 6d 65 6d 6f 72 79 3b 20 23 20 4e 4f 54  t $memory; # NOT
1cbe0 45 3a 20 52 65 74 75 72 6e 20 6d 65 6d 6f 72 79  E: Return memory
1cbf0 20 69 6e 2d 75 73 65 20 74 6f 20 6f 75 72 20 63   in-use to our c
1cc00 61 6c 6c 65 72 2e 0d 0a 0d 0a 20 20 20 20 20 20  aller.....      
1cc10 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65  if {!$quiet} the
1cc20 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75  n {..        tpu
1cc30 74 73 20 24 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d  ts $channel "---
1cc40 2d 20 6d 61 78 69 6d 75 6d 20 6d 65 6d 6f 72 79  - maximum memory
1cc50 20 69 6e 20 75 73 65 20 62 79 20 53 51 4c 69 74   in use by SQLit
1cc60 65 2e 2e 2e 20 22 0d 0a 20 20 20 20 20 20 7d 0d  e... "..      }.
1cc70 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 68 61  ...      if {[ha
1cc80 76 65 53 51 4c 69 74 65 4f 62 6a 65 63 74 43 6f  veSQLiteObjectCo
1cc90 6d 6d 61 6e 64 5d 7d 20 74 68 65 6e 20 7b 0d 0a  mmand]} then {..
1cca0 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74          if {[cat
1ccb0 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  ch {..          
1ccc0 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66  object invoke -f
1ccd0 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20  lags +NonPublic 
1cce0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
1ccf0 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c   System.Data.SQL
1cd00 69 74 65 2e 55 6e 73 61 66 65 4e 61 74 69 76 65  ite.UnsafeNative
1cd10 4d 65 74 68 6f 64 73 20 5c 0d 0a 20 20 20 20 20  Methods \..     
1cd20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
1cd30 5f 6d 65 6d 6f 72 79 5f 68 69 67 68 77 61 74 65  _memory_highwate
1cd40 72 20 30 0d 0a 20 20 20 20 20 20 20 20 7d 20 6d  r 0..        } m
1cd50 65 6d 6f 72 79 5d 20 3d 3d 20 30 7d 20 74 68 65  emory] == 0} the
1cd60 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69  n {..          i
1cd70 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e  f {!$quiet} then
1cd80 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
1cd90 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b  tputs $channel [
1cda0 61 70 70 65 6e 64 41 72 67 73 20 24 6d 65 6d 6f  appendArgs $memo
1cdb0 72 79 20 22 20 62 79 74 65 73 5c 6e 22 5d 0d 0a  ry " bytes\n"]..
1cdc0 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
1cdd0 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
1cde0 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
1cdf0 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4d 61        # NOTE: Ma
1ce00 79 62 65 20 74 68 65 20 53 51 4c 69 74 65 20 63  ybe the SQLite c
1ce10 6f 72 65 20 6c 69 62 72 61 72 79 20 69 73 20 75  ore library is u
1ce20 6e 61 76 61 69 6c 61 62 6c 65 3f 0d 0a 20 20 20  navailable?..   
1ce30 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
1ce40 20 20 20 20 73 65 74 20 6d 65 6d 6f 72 79 20 75      set memory u
1ce50 6e 6b 6e 6f 77 6e 0d 0a 0d 0a 20 20 20 20 20 20  nknown....      
1ce60 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d      if {!$quiet}
1ce70 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
1ce80 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
1ce90 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
1cea0 24 6d 65 6d 6f 72 79 20 5c 6e 5d 0d 0a 20 20 20  $memory \n]..   
1ceb0 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
1cec0 20 20 7d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73    }..      } els
1ced0 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 65 74  e {..        set
1cee0 20 6d 65 6d 6f 72 79 20 75 6e 61 76 61 69 6c 61   memory unavaila
1cef0 62 6c 65 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69  ble....        i
1cf00 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e  f {!$quiet} then
1cf10 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70   {..          tp
1cf20 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70  uts $channel [ap
1cf30 70 65 6e 64 41 72 67 73 20 24 6d 65 6d 6f 72 79  pendArgs $memory
1cf40 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d   \n]..        }.
1cf50 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
1cf60 20 20 69 66 20 7b 24 63 6f 6c 6c 65 63 74 7d 20    if {$collect} 
1cf70 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
1cf80 63 6f 6c 6c 65 63 74 47 61 72 62 61 67 65 20 24  collectGarbage $
1cf90 63 68 61 6e 6e 65 6c 0d 0a 20 20 20 20 20 20 7d  channel..      }
1cfa0 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 21 24  ....      if {!$
1cfb0 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20  quiet} then {.. 
1cfc0 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
1cfd0 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 63 75 72 72  annel "---- curr
1cfe0 65 6e 74 20 6d 65 6d 6f 72 79 20 69 6e 20 75 73  ent memory in us
1cff0 65 20 62 79 20 74 68 65 20 43 4c 52 2e 2e 2e 20  e by the CLR... 
1d000 22 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  "..      }....  
1d010 20 20 20 20 69 66 20 7b 5b 68 61 76 65 53 51 4c      if {[haveSQL
1d020 69 74 65 4f 62 6a 65 63 74 43 6f 6d 6d 61 6e 64  iteObjectCommand
1d030 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
1d040 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d     if {[catch {.
1d050 0a 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63  .          objec
1d060 74 20 69 6e 76 6f 6b 65 20 47 43 20 47 65 74 54  t invoke GC GetT
1d070 6f 74 61 6c 4d 65 6d 6f 72 79 20 66 61 6c 73 65  otalMemory false
1d080 0d 0a 20 20 20 20 20 20 20 20 7d 20 6d 65 6d 6f  ..        } memo
1d090 72 79 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b  ry] == 0} then {
1d0a0 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b  ..          if {
1d0b0 5b 73 74 72 69 6e 67 20 69 73 20 69 6e 74 65 67  [string is integ
1d0c0 65 72 20 2d 73 74 72 69 63 74 20 24 6d 65 6d 6f  er -strict $memo
1d0d0 72 79 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  ry]} then {..   
1d0e0 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71           if {!$q
1d0f0 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  uiet} then {..  
1d100 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
1d110 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  s $channel [appe
1d120 6e 64 41 72 67 73 20 24 6d 65 6d 6f 72 79 20 22  ndArgs $memory "
1d130 20 62 79 74 65 73 5c 6e 22 5d 0d 0a 20 20 20 20   bytes\n"]..    
1d140 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
1d150 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
1d160 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20 6d             set m
1d170 65 6d 6f 72 79 20 69 6e 76 61 6c 69 64 0d 0a 0d  emory invalid...
1d180 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20  .            if 
1d190 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b  {!$quiet} then {
1d1a0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1d1b0 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b  tputs $channel [
1d1c0 61 70 70 65 6e 64 41 72 67 73 20 24 6d 65 6d 6f  appendArgs $memo
1d1d0 72 79 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20  ry \n]..        
1d1e0 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
1d1f0 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 20 65 6c   }..        } el
1d200 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  se {..          
1d210 73 65 74 20 6d 65 6d 6f 72 79 20 75 6e 6b 6e 6f  set memory unkno
1d220 77 6e 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  wn....          
1d230 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65  if {!$quiet} the
1d240 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
1d250 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
1d260 5b 61 70 70 65 6e 64 41 72 67 73 20 24 6d 65 6d  [appendArgs $mem
1d270 6f 72 79 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20  ory \n]..       
1d280 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d     }..        }.
1d290 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d  .      } else {.
1d2a0 0a 20 20 20 20 20 20 20 20 73 65 74 20 6d 65 6d  .        set mem
1d2b0 6f 72 79 20 75 6e 61 76 61 69 6c 61 62 6c 65 0d  ory unavailable.
1d2c0 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21  ...        if {!
1d2d0 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a  $quiet} then {..
1d2e0 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
1d2f0 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  $channel [append
1d300 41 72 67 73 20 24 6d 65 6d 6f 72 79 20 5c 6e 5d  Args $memory \n]
1d310 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20  ..        }..   
1d320 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65     }....      re
1d330 74 75 72 6e 20 24 72 65 73 75 6c 74 0d 0a 20 20  turn $result..  
1d340 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
1d350 20 63 68 65 63 6b 46 6f 72 53 51 4c 69 74 65 44   checkForSQLiteD
1d360 69 72 65 63 74 6f 72 69 65 73 20 7b 20 63 68 61  irectories { cha
1d370 6e 6e 65 6c 20 7b 72 65 73 65 74 20 66 61 6c 73  nnel {reset fals
1d380 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d  e} } {..      #.
1d390 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43  .      # NOTE: C
1d3a0 68 65 63 6b 20 69 66 20 74 68 65 20 73 71 6c 69  heck if the sqli
1d3b0 74 65 33 5f 77 69 6e 33 32 5f 73 65 74 5f 64 69  te3_win32_set_di
1d3c0 72 65 63 74 6f 72 79 20 66 75 6e 63 74 69 6f 6e  rectory function
1d3d0 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2e 0d 0a   is available...
1d3e0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 74        #..      t
1d3f0 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5c 0d  puts $channel \.
1d400 0a 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d  .          "----
1d410 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 66 75   checking for fu
1d420 6e 63 74 69 6f 6e 20 73 71 6c 69 74 65 33 5f 77  nction sqlite3_w
1d430 69 6e 33 32 5f 73 65 74 5f 64 69 72 65 63 74 6f  in32_set_directo
1d440 72 79 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 20  ry... "....     
1d450 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
1d460 3a 20 54 68 69 73 20 63 61 6c 6c 20 74 6f 20 74  : This call to t
1d470 68 65 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32  he sqlite3_win32
1d480 5f 73 65 74 5f 64 69 72 65 63 74 6f 72 79 20 66  _set_directory f
1d490 75 6e 63 74 69 6f 6e 20 75 73 65 73 20 74 68 65  unction uses the
1d4a0 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
1d4b0 69 6e 76 61 6c 69 64 20 76 61 6c 75 65 20 30 20  invalid value 0 
1d4c0 66 6f 72 20 74 68 65 20 66 69 72 73 74 20 61 72  for the first ar
1d4d0 67 75 6d 65 6e 74 2e 20 20 54 68 69 73 20 63 6f  gument.  This co
1d4e0 64 65 20 69 73 20 64 65 73 69 67 6e 65 64 0d 0a  de is designed..
1d4f0 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74 6f        #       to
1d500 20 63 68 65 63 6b 20 69 66 20 63 61 6c 6c 69 6e   check if callin
1d510 67 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 77  g the function w
1d520 69 6c 6c 20 72 61 69 73 65 20 61 6e 20 65 78 63  ill raise an exc
1d530 65 70 74 69 6f 6e 20 28 69 2e 65 2e 0d 0a 20 20  eption (i.e...  
1d540 20 20 20 20 23 20 20 20 20 20 20 20 74 68 65 20      #       the 
1d550 61 63 74 75 61 6c 20 72 65 73 75 6c 74 20 6f 66  actual result of
1d560 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 64 6f   the function do
1d570 65 73 20 6e 6f 74 20 6d 61 74 74 65 72 20 61 73  es not matter as
1d580 20 6c 6f 6e 67 20 61 73 20 6e 6f 0d 0a 20 20 20   long as no..   
1d590 20 20 20 23 20 20 20 20 20 20 20 64 69 72 65 63     #       direc
1d5a0 74 6f 72 79 20 69 73 20 63 68 61 6e 67 65 64 29  tory is changed)
1d5b0 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
1d5c0 20 20 69 66 20 7b 5b 69 73 57 69 6e 64 6f 77 73    if {[isWindows
1d5d0 5d 20 26 26 20 5b 63 61 74 63 68 20 7b 0d 0a 20  ] && [catch {.. 
1d5e0 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e         object in
1d5f0 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e  voke -flags +Non
1d600 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20  Public \..      
1d610 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74        System.Dat
1d620 61 2e 53 51 4c 69 74 65 2e 55 6e 73 61 66 65 4e  a.SQLite.UnsafeN
1d630 61 74 69 76 65 4d 65 74 68 6f 64 73 20 5c 0d 0a  ativeMethods \..
1d640 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
1d650 74 65 33 5f 77 69 6e 33 32 5f 73 65 74 5f 64 69  te3_win32_set_di
1d660 72 65 63 74 6f 72 79 20 30 20 6e 75 6c 6c 0d 0a  rectory 0 null..
1d670 20 20 20 20 20 20 7d 5d 20 3d 3d 20 30 7d 20 74        }] == 0} t
1d680 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  hen {..        #
1d690 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
1d6a0 3a 20 43 61 6c 6c 69 6e 67 20 74 68 65 20 73 71  : Calling the sq
1d6b0 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 65 74 5f  lite3_win32_set_
1d6c0 64 69 72 65 63 74 6f 72 79 20 66 75 6e 63 74 69  directory functi
1d6d0 6f 6e 20 64 6f 65 73 20 6e 6f 74 0d 0a 20 20 20  on does not..   
1d6e0 20 20 20 20 20 23 20 20 20 20 20 20 20 63 61 75       #       cau
1d6f0 73 65 20 61 6e 20 65 78 63 65 70 74 69 6f 6e 3b  se an exception;
1d700 20 74 68 65 72 65 66 6f 72 65 2c 20 69 74 20 6d   therefore, it m
1d710 75 73 74 20 62 65 20 61 76 61 69 6c 61 62 6c 65  ust be available
1d720 20 28 69 2e 65 2e 0d 0a 20 20 20 20 20 20 20 20   (i.e...        
1d730 23 20 20 20 20 20 20 20 65 76 65 6e 20 74 68 6f  #       even tho
1d740 75 67 68 20 69 74 20 73 68 6f 75 6c 64 20 72 65  ugh it should re
1d750 74 75 72 6e 20 61 20 66 61 69 6c 75 72 65 20 72  turn a failure r
1d760 65 74 75 72 6e 20 63 6f 64 65 20 69 6e 20 74 68  eturn code in th
1d770 69 73 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  is..        #   
1d780 20 20 20 20 63 61 73 65 29 2e 0d 0a 20 20 20 20      case)...    
1d790 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 61      #..        a
1d7a0 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 73 71 6c  ddConstraint sql
1d7b0 69 74 65 33 5f 77 69 6e 33 32 5f 73 65 74 5f 64  ite3_win32_set_d
1d7c0 69 72 65 63 74 6f 72 79 0d 0a 0d 0a 20 20 20 20  irectory....    
1d7d0 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
1d7e0 65 6c 20 79 65 73 5c 6e 0d 0a 0d 0a 20 20 20 20  el yes\n....    
1d7f0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
1d800 20 4e 4f 54 45 3a 20 44 6f 65 73 20 6f 75 72 20   NOTE: Does our 
1d810 63 61 6c 6c 65 72 20 77 61 6e 74 20 74 6f 20 72  caller want to r
1d820 65 73 65 74 20 74 68 65 20 64 69 72 65 63 74 6f  eset the directo
1d830 72 69 65 73 3f 0d 0a 20 20 20 20 20 20 20 20 23  ries?..        #
1d840 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 24 72  ..        if {$r
1d850 65 73 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  eset} then {..  
1d860 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
1d870 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4e 6f 77       # NOTE: Now
1d880 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20 64   make sure the d
1d890 61 74 61 62 61 73 65 20 61 6e 64 20 74 65 6d 70  atabase and temp
1d8a0 6f 72 61 72 79 20 64 69 72 65 63 74 6f 72 69 65  orary directorie
1d8b0 73 20 61 72 65 0d 0a 20 20 20 20 20 20 20 20 20  s are..         
1d8c0 20 23 20 20 20 20 20 20 20 72 65 73 65 74 20 74   #       reset t
1d8d0 68 65 69 72 20 64 65 66 61 75 6c 74 20 76 61 6c  heir default val
1d8e0 75 65 73 2c 20 77 68 69 63 68 20 73 68 6f 75 6c  ues, which shoul
1d8f0 64 20 62 65 20 6e 75 6c 6c 20 66 6f 72 20 62 6f  d be null for bo
1d900 74 68 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23  th...          #
1d910 20 20 20 20 20 20 20 53 69 6e 63 65 20 74 68 65         Since the
1d920 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73   sqlite3_win32_s
1d930 65 74 5f 64 69 72 65 63 74 6f 72 79 20 66 75 6e  et_directory fun
1d940 63 74 69 6f 6e 20 69 73 20 61 76 61 69 6c 61 62  ction is availab
1d950 6c 65 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 23  le,..          #
1d960 20 20 20 20 20 20 20 75 73 65 20 69 74 2e 0d 0a         use it...
1d970 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
1d980 20 20 20 20 20 20 20 66 6f 72 20 7b 73 65 74 20         for {set 
1d990 69 6e 64 65 78 20 31 7d 20 7b 24 69 6e 64 65 78  index 1} {$index
1d9a0 20 3c 20 33 7d 20 7b 69 6e 63 72 20 69 6e 64 65   < 3} {incr inde
1d9b0 78 7d 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  x} {..          
1d9c0 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a    if {[catch {..
1d9d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 62                ob
1d9e0 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61  ject invoke -fla
1d9f0 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d  gs +NonPublic \.
1da00 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1da10 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53     System.Data.S
1da20 51 4c 69 74 65 2e 55 6e 73 61 66 65 4e 61 74 69  QLite.UnsafeNati
1da30 76 65 4d 65 74 68 6f 64 73 20 5c 0d 0a 20 20 20  veMethods \..   
1da40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
1da50 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 65 74  qlite3_win32_set
1da60 5f 64 69 72 65 63 74 6f 72 79 20 24 69 6e 64 65  _directory $inde
1da70 78 20 6e 75 6c 6c 0d 0a 20 20 20 20 20 20 20 20  x null..        
1da80 20 20 20 20 7d 20 72 65 73 75 6c 74 5d 20 3d 3d      } result] ==
1da90 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
1daa0 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
1dab0 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  $channel [append
1dac0 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
1dad0 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
1dae0 63 61 6c 6c 20 73 71 6c 69 74 65 33 5f 77 69 6e  call sqlite3_win
1daf0 33 32 5f 73 65 74 5f 64 69 72 65 63 74 6f 72 79  32_set_directory
1db00 28 22 20 24 69 6e 64 65 78 20 5c 0d 0a 20 20 20  (" $index \..   
1db10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
1db20 2c 20 6e 75 6c 6c 29 2e 2e 2e 20 6f 6b 3a 20 22  , null)... ok: "
1db30 20 24 72 65 73 75 6c 74 20 5c 6e 5d 0d 0a 20 20   $result \n]..  
1db40 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65            } else
1db50 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
1db60 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
1db70 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
1db80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1db90 20 20 22 2d 2d 2d 2d 20 63 61 6c 6c 20 73 71 6c    "---- call sql
1dba0 69 74 65 33 5f 77 69 6e 33 32 5f 73 65 74 5f 64  ite3_win32_set_d
1dbb0 69 72 65 63 74 6f 72 79 28 22 20 24 69 6e 64 65  irectory(" $inde
1dbc0 78 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  x \..           
1dbd0 20 20 20 20 20 20 20 22 2c 20 6e 75 6c 6c 29 2e         ", null).
1dbe0 2e 2e 20 65 72 72 6f 72 3a 20 22 20 5c 6e 5c 74  .. error: " \n\t
1dbf0 20 24 72 65 73 75 6c 74 20 5c 6e 5d 0d 0a 20 20   $result \n]..  
1dc00 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
1dc10 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
1dc20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73    }..      } els
1dc30 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75  e {..        tpu
1dc40 74 73 20 24 63 68 61 6e 6e 65 6c 20 6e 6f 5c 6e  ts $channel no\n
1dc50 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  ....        #.. 
1dc60 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 44         # NOTE: D
1dc70 6f 65 73 20 6f 75 72 20 63 61 6c 6c 65 72 20 77  oes our caller w
1dc80 61 6e 74 20 74 6f 20 72 65 73 65 74 20 74 68 65  ant to reset the
1dc90 20 64 69 72 65 63 74 6f 72 69 65 73 3f 20 20 54   directories?  T
1dca0 68 69 73 20 63 61 6e 20 6f 6e 6c 79 0d 0a 20 20  his can only..  
1dcb0 20 20 20 20 20 20 23 20 20 20 20 20 20 20 62 65        #       be
1dcc0 20 70 65 72 66 6f 72 6d 65 64 20 69 66 20 53 51   performed if SQ
1dcd0 4c 69 74 65 20 69 73 20 6c 6f 61 64 65 64 20 61  Lite is loaded a
1dce0 6e 64 20 72 65 61 64 79 20 66 6f 72 20 75 73 65  nd ready for use
1dcf0 20 62 79 20 74 68 65 20 74 65 73 74 0d 0a 20 20   by the test..  
1dd00 20 20 20 20 20 20 23 20 20 20 20 20 20 20 73 75        #       su
1dd10 69 74 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  ite...        #.
1dd20 0a 20 20 20 20 20 20 20 20 69 66 20 7b 24 72 65  .        if {$re
1dd30 73 65 74 20 26 26 20 5b 69 73 53 51 4c 69 74 65  set && [isSQLite
1dd40 52 65 61 64 79 5d 7d 20 74 68 65 6e 20 7b 0d 0a  Ready]} then {..
1dd50 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
1dd60 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4e         # NOTE: N
1dd70 6f 77 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65  ow make sure the
1dd80 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 74 65   database and te
1dd90 6d 70 6f 72 61 72 79 20 64 69 72 65 63 74 6f 72  mporary director
1dda0 69 65 73 20 61 72 65 0d 0a 20 20 20 20 20 20 20  ies are..       
1ddb0 20 20 20 23 20 20 20 20 20 20 20 72 65 73 65 74     #       reset
1ddc0 20 74 68 65 69 72 20 64 65 66 61 75 6c 74 20 76   their default v
1ddd0 61 6c 75 65 73 2c 20 77 68 69 63 68 20 73 68 6f  alues, which sho
1dde0 75 6c 64 20 62 65 20 6e 75 6c 6c 20 66 6f 72 20  uld be null for 
1ddf0 62 6f 74 68 2e 0d 0a 20 20 20 20 20 20 20 20 20  both...         
1de00 20 23 20 20 20 20 20 20 20 53 69 6e 63 65 20 74   #       Since t
1de10 68 65 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32  he sqlite3_win32
1de20 5f 73 65 74 5f 64 69 72 65 63 74 6f 72 79 20 66  _set_directory f
1de30 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74  unction does not
1de40 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 20 20  ..          #   
1de50 20 20 20 20 61 70 70 65 61 72 20 74 6f 20 62 65      appear to be
1de60 20 61 76 61 69 6c 61 62 6c 65 2c 20 75 73 65 20   available, use 
1de70 74 68 65 20 61 73 73 6f 63 69 61 74 65 64 20 50  the associated P
1de80 52 41 47 4d 41 20 63 6f 6d 6d 61 6e 64 73 0d 0a  RAGMA commands..
1de90 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20            #     
1dea0 20 20 69 6e 73 74 65 61 64 2e 0d 0a 20 20 20 20    instead...    
1deb0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
1dec0 20 20 20 66 6f 72 65 61 63 68 20 64 69 72 65 63     foreach direc
1ded0 74 6f 72 79 20 5b 6c 69 73 74 20 64 61 74 61 5f  tory [list data_
1dee0 73 74 6f 72 65 5f 64 69 72 65 63 74 6f 72 79 20  store_directory 
1def0 74 65 6d 70 5f 73 74 6f 72 65 5f 64 69 72 65 63  temp_store_direc
1df00 74 6f 72 79 5d 20 7b 0d 0a 20 20 20 20 20 20 20  tory] {..       
1df10 20 20 20 20 20 73 65 74 20 73 71 6c 20 5b 61 70       set sql [ap
1df20 70 65 6e 64 41 72 67 73 20 22 50 52 41 47 4d 41  pendArgs "PRAGMA
1df30 20 22 20 24 64 69 72 65 63 74 6f 72 79 20 22 20   " $directory " 
1df40 3d 20 5c 22 5c 22 3b 22 5d 0d 0a 0d 0a 20 20 20  = \"\";"]....   
1df50 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61           if {[ca
1df60 74 63 68 20 7b 65 78 65 63 75 74 65 53 71 6c 20  tch {executeSql 
1df70 24 73 71 6c 7d 20 72 65 73 75 6c 74 5d 20 3d 3d  $sql} result] ==
1df80 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
1df90 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
1dfa0 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  $channel [append
1dfb0 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
1dfc0 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
1dfd0 65 78 65 63 75 74 65 20 50 52 41 47 4d 41 20 22  execute PRAGMA "
1dfe0 20 24 64 69 72 65 63 74 6f 72 79 20 22 2e 2e 2e   $directory "...
1dff0 20 6f 6b 3a 20 5c 22 22 20 5c 0d 0a 20 20 20 20   ok: \"" \..    
1e000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 24 72                $r
1e010 65 73 75 6c 74 20 5c 22 5c 6e 5d 0d 0a 20 20 20  esult \"\n]..   
1e020 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20           } else 
1e030 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
1e040 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
1e050 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
1e060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e070 20 22 2d 2d 2d 2d 20 65 78 65 63 75 74 65 20 50   "---- execute P
1e080 52 41 47 4d 41 20 22 20 24 64 69 72 65 63 74 6f  RAGMA " $directo
1e090 72 79 20 22 2e 2e 2e 20 65 72 72 6f 72 3a 20 22  ry "... error: "
1e0a0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
1e0b0 20 20 20 20 20 20 5c 6e 5c 74 20 24 72 65 73 75        \n\t $resu
1e0c0 6c 74 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20  lt \n]..        
1e0d0 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
1e0e0 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20   }..        }.. 
1e0f0 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
1e100 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
1e110 20 46 69 6e 61 6c 6c 79 2c 20 73 68 6f 77 20 74   Finally, show t
1e120 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65  he current value
1e130 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
1e140 20 61 6e 64 20 74 65 6d 70 6f 72 61 72 79 0d 0a   and temporary..
1e150 20 20 20 20 20 20 23 20 20 20 20 20 20 20 64 69        #       di
1e160 72 65 63 74 6f 72 69 65 73 2e 20 20 54 68 69 73  rectories.  This
1e170 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20 70 65 72   can only be per
1e180 66 6f 72 6d 65 64 20 69 66 20 53 51 4c 69 74 65  formed if SQLite
1e190 20 69 73 20 6c 6f 61 64 65 64 0d 0a 20 20 20 20   is loaded..    
1e1a0 20 20 23 20 20 20 20 20 20 20 61 6e 64 20 72 65    #       and re
1e1b0 61 64 79 20 66 6f 72 20 75 73 65 20 62 79 20 74  ady for use by t
1e1c0 68 65 20 74 65 73 74 20 73 75 69 74 65 2e 0d 0a  he test suite...
1e1d0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69        #..      i
1e1e0 66 20 7b 5b 69 73 53 51 4c 69 74 65 52 65 61 64  f {[isSQLiteRead
1e1f0 79 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  y]} then {..    
1e200 20 20 20 20 66 6f 72 65 61 63 68 20 64 69 72 65      foreach dire
1e210 63 74 6f 72 79 20 5b 6c 69 73 74 20 64 61 74 61  ctory [list data
1e220 5f 73 74 6f 72 65 5f 64 69 72 65 63 74 6f 72 79  _store_directory
1e230 20 74 65 6d 70 5f 73 74 6f 72 65 5f 64 69 72 65   temp_store_dire
1e240 63 74 6f 72 79 5d 20 7b 0d 0a 20 20 20 20 20 20  ctory] {..      
1e250 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
1e260 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 22  el [appendArgs "
1e270 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e 67 20 22 20  ---- checking " 
1e280 24 64 69 72 65 63 74 6f 72 79 20 22 2e 2e 2e 20  $directory "... 
1e290 22 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  "]....          
1e2a0 73 65 74 20 73 71 6c 20 5b 61 70 70 65 6e 64 41  set sql [appendA
1e2b0 72 67 73 20 22 50 52 41 47 4d 41 20 22 20 24 64  rgs "PRAGMA " $d
1e2c0 69 72 65 63 74 6f 72 79 20 5c 3b 5d 0d 0a 0d 0a  irectory \;]....
1e2d0 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63            if {[c
1e2e0 61 74 63 68 20 7b 65 78 65 63 75 74 65 53 71 6c  atch {executeSql
1e2f0 20 24 73 71 6c 20 73 63 61 6c 61 72 7d 20 72 65   $sql scalar} re
1e300 73 75 6c 74 5d 20 3d 3d 20 30 7d 20 74 68 65 6e  sult] == 0} then
1e310 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
1e320 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b  tputs $channel [
1e330 61 70 70 65 6e 64 41 72 67 73 20 22 6f 6b 3a 20  appendArgs "ok: 
1e340 5c 22 22 20 24 72 65 73 75 6c 74 20 5c 22 5c 6e  \"" $result \"\n
1e350 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 20 65  ]..          } e
1e360 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  lse {..         
1e370 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
1e380 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 22 65  l [appendArgs "e
1e390 72 72 6f 72 3a 20 22 20 5c 6e 5c 74 20 24 72 65  rror: " \n\t $re
1e3a0 73 75 6c 74 20 5c 6e 5d 0d 0a 20 20 20 20 20 20  sult \n]..      
1e3b0 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d      }..        }
1e3c0 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d  ..      }..    }
1e3d0 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 6c 6f  .....    proc lo
1e3e0 61 64 53 51 4c 69 74 65 54 65 73 74 53 65 74 74  adSQLiteTestSett
1e3f0 69 6e 67 73 20 7b 20 63 68 61 6e 6e 65 6c 20 7b  ings { channel {
1e400 73 75 66 66 69 78 20 22 22 7d 20 7b 71 75 69 65  suffix ""} {quie
1e410 74 20 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a 20 20  t false} } {..  
1e420 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
1e430 4f 54 45 3a 20 53 6b 69 70 20 6c 6f 61 64 69 6e  OTE: Skip loadin
1e440 67 20 74 68 65 20 73 65 74 74 69 6e 67 73 20 69  g the settings i
1e450 66 20 74 68 65 69 72 20 75 73 61 67 65 20 68 61  f their usage ha
1e460 73 20 62 65 65 6e 20 64 69 73 61 62 6c 65 64 2e  s been disabled.
1e470 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
1e480 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73   if {![info exis
1e490 74 73 20 3a 3a 6e 6f 28 73 71 6c 69 74 65 54 65  ts ::no(sqliteTe
1e4a0 73 74 53 65 74 74 69 6e 67 73 29 5d 7d 20 74 68  stSettings)]} th
1e4b0 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d  en {..        #.
1e4c0 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
1e4d0 20 4c 6f 61 64 20 63 75 73 74 6f 6d 20 70 65 72   Load custom per
1e4e0 2d 75 73 65 72 20 61 6e 64 2f 6f 72 20 70 65 72  -user and/or per
1e4f0 2d 68 6f 73 74 20 74 65 73 74 20 73 65 74 74 69  -host test setti
1e500 6e 67 73 20 6e 6f 77 2e 0d 0a 20 20 20 20 20 20  ngs now...      
1e510 20 20 23 0d 0a 20 20 20 20 20 20 20 20 69 66 20    #..        if 
1e520 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  {[info exists ::
1e530 74 63 6c 5f 70 6c 61 74 66 6f 72 6d 28 75 73 65  tcl_platform(use
1e540 72 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  r)]} then {..   
1e550 20 20 20 20 20 20 20 73 65 74 20 75 73 65 72 53         set userS
1e560 65 74 74 69 6e 67 73 46 69 6c 65 4e 61 6d 65 20  ettingsFileName 
1e570 5b 66 69 6c 65 20 6a 6f 69 6e 20 5b 67 65 74 43  [file join [getC
1e580 6f 6d 6d 6f 6e 44 69 72 65 63 74 6f 72 79 5d 20  ommonDirectory] 
1e590 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
1e5a0 20 5b 61 70 70 65 6e 64 41 72 67 73 20 73 65 74   [appendArgs set
1e5b0 74 69 6e 67 73 20 24 73 75 66 66 69 78 20 2e 20  tings $suffix . 
1e5c0 24 3a 3a 74 63 6c 5f 70 6c 61 74 66 6f 72 6d 28  $::tcl_platform(
1e5d0 75 73 65 72 29 20 2e 65 61 67 6c 65 5d 5d 0d 0a  user) .eagle]]..
1e5e0 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b  ..          if {
1e5f0 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24 75 73  [file exists $us
1e600 65 72 53 65 74 74 69 6e 67 73 46 69 6c 65 4e 61  erSettingsFileNa
1e610 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  me]} then {..   
1e620 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71           if {!$q
1e630 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  uiet} then {..  
1e640 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
1e650 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  s $channel [appe
1e660 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
1e670 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
1e680 2d 20 6c 6f 61 64 69 6e 67 20 70 65 72 2d 75 73  - loading per-us
1e690 65 72 20 74 65 73 74 20 73 65 74 74 69 6e 67 73  er test settings
1e6a0 20 66 69 6c 65 20 5c 22 22 20 5c 0d 0a 20 20 20   file \"" \..   
1e6b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 24                 $
1e6c0 75 73 65 72 53 65 74 74 69 6e 67 73 46 69 6c 65  userSettingsFile
1e6d0 4e 61 6d 65 20 5c 22 2e 2e 2e 5c 6e 5d 0d 0a 20  Name \"...\n].. 
1e6e0 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a             }....
1e6f0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b              if {
1e700 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20  [catch {..      
1e710 20 20 20 20 20 20 20 20 75 70 6c 65 76 65 6c 20          uplevel 
1e720 31 20 5b 6c 69 73 74 20 73 6f 75 72 63 65 20 24  1 [list source $
1e730 75 73 65 72 53 65 74 74 69 6e 67 73 46 69 6c 65  userSettingsFile
1e740 4e 61 6d 65 5d 0d 0a 20 20 20 20 20 20 20 20 20  Name]..         
1e750 20 20 20 7d 20 65 72 72 6f 72 5d 7d 20 74 68 65     } error]} the
1e760 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
1e770 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20     if {!$quiet} 
1e780 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
1e790 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
1e7a0 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
1e7b0 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
1e7c0 20 20 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20            "==== 
1e7d0 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20  WARNING: failed 
1e7e0 74 6f 20 6c 6f 61 64 20 70 65 72 2d 75 73 65 72  to load per-user
1e7f0 20 73 65 74 74 69 6e 67 73 20 66 69 6c 65 20 5c   settings file \
1e800 22 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  "" \..          
1e810 20 20 20 20 20 20 20 20 20 20 24 75 73 65 72 53            $userS
1e820 65 74 74 69 6e 67 73 46 69 6c 65 4e 61 6d 65 20  ettingsFileName 
1e830 22 5c 22 2c 20 65 72 72 6f 72 3a 20 22 20 5c 6e  "\", error: " \n
1e840 5c 74 20 24 65 72 72 6f 72 20 5c 6e 5d 0d 0a 20  \t $error \n].. 
1e850 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a               }..
1e860 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
1e870 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20           } else 
1e880 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  {..            i
1e890 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e  f {!$quiet} then
1e8a0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
1e8b0 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
1e8c0 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
1e8d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e8e0 20 20 22 2d 2d 2d 2d 20 73 6b 69 70 70 65 64 20    "---- skipped 
1e8f0 6c 6f 61 64 69 6e 67 20 70 65 72 2d 75 73 65 72  loading per-user
1e900 20 74 65 73 74 20 73 65 74 74 69 6e 67 73 20 66   test settings f
1e910 69 6c 65 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20  ile \"" \..     
1e920 20 20 20 20 20 20 20 20 20 20 20 20 20 24 75 73               $us
1e930 65 72 53 65 74 74 69 6e 67 73 46 69 6c 65 4e 61  erSettingsFileNa
1e940 6d 65 20 22 5c 22 2c 20 69 74 20 64 6f 65 73 20  me "\", it does 
1e950 6e 6f 74 20 65 78 69 73 74 5c 6e 22 5d 0d 0a 20  not exist\n"].. 
1e960 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
1e970 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
1e980 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
1e990 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1e9a0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1e9b0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1e9c0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1e9d0 23 23 23 23 23 23 23 0d 0a 0d 0a 20 20 20 20 20  #######....     
1e9e0 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69     if {[info exi
1e9f0 73 74 73 20 3a 3a 74 63 6c 5f 70 6c 61 74 66 6f  sts ::tcl_platfo
1ea00 72 6d 28 68 6f 73 74 29 5d 7d 20 74 68 65 6e 20  rm(host)]} then 
1ea10 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74  {..          set
1ea20 20 68 6f 73 74 53 65 74 74 69 6e 67 73 46 69 6c   hostSettingsFil
1ea30 65 4e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e  eName [file join
1ea40 20 5b 67 65 74 43 6f 6d 6d 6f 6e 44 69 72 65 63   [getCommonDirec
1ea50 74 6f 72 79 5d 20 5c 0d 0a 20 20 20 20 20 20 20  tory] \..       
1ea60 20 20 20 20 20 20 20 5b 61 70 70 65 6e 64 41 72         [appendAr
1ea70 67 73 20 73 65 74 74 69 6e 67 73 20 24 73 75 66  gs settings $suf
1ea80 66 69 78 20 2e 20 24 3a 3a 74 63 6c 5f 70 6c 61  fix . $::tcl_pla
1ea90 74 66 6f 72 6d 28 68 6f 73 74 29 20 2e 65 61 67  tform(host) .eag
1eaa0 6c 65 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  le]]....        
1eab0 20 20 69 66 20 7b 5b 66 69 6c 65 20 65 78 69 73    if {[file exis
1eac0 74 73 20 24 68 6f 73 74 53 65 74 74 69 6e 67 73  ts $hostSettings
1ead0 46 69 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20  FileName]} then 
1eae0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  {..            i
1eaf0 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e  f {!$quiet} then
1eb00 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
1eb10 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
1eb20 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
1eb30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eb40 20 20 22 2d 2d 2d 2d 20 6c 6f 61 64 69 6e 67 20    "---- loading 
1eb50 70 65 72 2d 68 6f 73 74 20 74 65 73 74 20 73 65  per-host test se
1eb60 74 74 69 6e 67 73 20 66 69 6c 65 20 5c 22 22 20  ttings file \"" 
1eb70 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
1eb80 20 20 20 20 20 24 68 6f 73 74 53 65 74 74 69 6e       $hostSettin
1eb90 67 73 46 69 6c 65 4e 61 6d 65 20 5c 22 2e 2e 2e  gsFileName \"...
1eba0 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20  \n]..           
1ebb0 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   }....          
1ebc0 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a    if {[catch {..
1ebd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 75 70                up
1ebe0 6c 65 76 65 6c 20 31 20 5b 6c 69 73 74 20 73 6f  level 1 [list so
1ebf0 75 72 63 65 20 24 68 6f 73 74 53 65 74 74 69 6e  urce $hostSettin
1ec00 67 73 46 69 6c 65 4e 61 6d 65 5d 0d 0a 20 20 20  gsFileName]..   
1ec10 20 20 20 20 20 20 20 20 20 7d 20 65 72 72 6f 72           } error
1ec20 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
1ec30 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71           if {!$q
1ec40 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  uiet} then {..  
1ec50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 70                tp
1ec60 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70  uts $channel [ap
1ec70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
1ec80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ec90 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66  "==== WARNING: f
1eca0 61 69 6c 65 64 20 74 6f 20 6c 6f 61 64 20 70 65  ailed to load pe
1ecb0 72 2d 68 6f 73 74 20 73 65 74 74 69 6e 67 73 20  r-host settings 
1ecc0 66 69 6c 65 20 5c 22 22 20 5c 0d 0a 20 20 20 20  file \"" \..    
1ecd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ece0 24 68 6f 73 74 53 65 74 74 69 6e 67 73 46 69 6c  $hostSettingsFil
1ecf0 65 4e 61 6d 65 20 22 5c 22 2c 20 65 72 72 6f 72  eName "\", error
1ed00 3a 20 22 20 5c 6e 5c 74 20 24 65 72 72 6f 72 20  : " \n\t $error 
1ed10 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20  \n]..           
1ed20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
1ed30 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d    }..          }
1ed40 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
1ed50 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74       if {!$quiet
1ed60 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
1ed70 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
1ed80 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
1ed90 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
1eda0 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 73 6b          "---- sk
1edb0 69 70 70 65 64 20 6c 6f 61 64 69 6e 67 20 70 65  ipped loading pe
1edc0 72 2d 68 6f 73 74 20 74 65 73 74 20 73 65 74 74  r-host test sett
1edd0 69 6e 67 73 20 66 69 6c 65 20 5c 22 22 20 5c 0d  ings file \"" \.
1ede0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1edf0 20 20 20 24 68 6f 73 74 53 65 74 74 69 6e 67 73     $hostSettings
1ee00 46 69 6c 65 4e 61 6d 65 20 22 5c 22 2c 20 69 74  FileName "\", it
1ee10 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 5c   does not exist\
1ee20 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n"]..           
1ee30 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d   }..          }.
1ee40 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  .        }..    
1ee50 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20    }..    }..... 
1ee60 20 20 20 70 72 6f 63 20 72 75 6e 53 51 4c 69 74     proc runSQLit
1ee70 65 54 65 73 74 50 72 6f 6c 6f 67 75 65 20 7b 7d  eTestPrologue {}
1ee80 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20   {..      #..   
1ee90 20 20 20 23 20 4e 4f 54 45 3a 20 53 6b 69 70 20     # NOTE: Skip 
1eea0 72 75 6e 6e 69 6e 67 20 6f 75 72 20 63 75 73 74  running our cust
1eeb0 6f 6d 20 70 72 6f 6c 6f 67 75 65 20 69 66 20 74  om prologue if t
1eec0 68 65 20 6d 61 69 6e 20 6f 6e 65 20 68 61 73 20  he main one has 
1eed0 62 65 65 6e 0d 0a 20 20 20 20 20 20 23 20 20 20  been..      #   
1eee0 20 20 20 20 73 6b 69 70 70 65 64 2e 0d 0a 20 20      skipped...  
1eef0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20      #..      if 
1ef00 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a  {![info exists :
1ef10 3a 6e 6f 28 70 72 6f 6c 6f 67 75 65 2e 65 61 67  :no(prologue.eag
1ef20 6c 65 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  le)]} then {..  
1ef30 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
1ef40 20 23 20 4e 4f 54 45 3a 20 4c 6f 61 64 20 74 68   # NOTE: Load th
1ef50 65 20 22 62 65 66 6f 72 65 2d 63 6f 6e 73 74 72  e "before-constr
1ef60 61 69 6e 74 73 22 20 63 75 73 74 6f 6d 20 70 65  aints" custom pe
1ef70 72 2d 75 73 65 72 20 61 6e 64 2f 6f 72 20 70 65  r-user and/or pe
1ef80 72 2d 68 6f 73 74 0d 0a 20 20 20 20 20 20 20 20  r-host..        
1ef90 23 20 20 20 20 20 20 20 74 65 73 74 20 73 65 74  #       test set
1efa0 74 69 6e 67 73 20 6e 6f 77 2e 0d 0a 20 20 20 20  tings now...    
1efb0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 75      #..        u
1efc0 70 6c 65 76 65 6c 20 31 20 5b 6c 69 73 74 20 6c  plevel 1 [list l
1efd0 6f 61 64 53 51 4c 69 74 65 54 65 73 74 53 65 74  oadSQLiteTestSet
1efe0 74 69 6e 67 73 20 24 3a 3a 74 65 73 74 5f 63 68  tings $::test_ch
1eff0 61 6e 6e 65 6c 20 2e 62 65 66 6f 72 65 5d 0d 0a  annel .before]..
1f000 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
1f010 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68 65       # NOTE: Che
1f020 63 6b 20 69 66 20 74 68 65 20 5b 6f 62 6a 65 63  ck if the [objec
1f030 74 5d 20 63 6f 6d 6d 61 6e 64 20 69 73 20 61 76  t] command is av
1f040 61 69 6c 61 62 6c 65 3b 20 69 66 20 6e 6f 74 2c  ailable; if not,
1f050 20 61 64 64 20 73 6f 6d 65 0d 0a 20 20 20 20 20   add some..     
1f060 20 20 20 23 20 20 20 20 20 20 20 73 68 69 6d 73     #       shims
1f070 20 74 6f 20 6d 61 6b 65 20 74 68 65 20 74 65 73   to make the tes
1f080 74 20 73 75 69 74 65 20 72 75 6e 20 73 6d 6f 6f  t suite run smoo
1f090 74 68 65 72 2e 0d 0a 20 20 20 20 20 20 20 20 23  ther...        #
1f0a0 0d 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b 46  ..        checkF
1f0b0 6f 72 53 51 4c 69 74 65 4f 62 6a 65 63 74 43 6f  orSQLiteObjectCo
1f0c0 6d 6d 61 6e 64 20 24 3a 3a 74 65 73 74 5f 63 68  mmand $::test_ch
1f0d0 61 6e 6e 65 6c 0d 0a 0d 0a 20 20 20 20 20 20 20  annel....       
1f0e0 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
1f0f0 54 45 3a 20 44 65 74 65 72 6d 69 6e 65 20 74 68  TE: Determine th
1f100 65 20 6e 61 6d 65 73 20 6f 66 20 74 68 65 20 6e  e names of the n
1f110 61 74 69 76 65 20 70 6c 61 74 66 6f 72 6d 20 61  ative platform a
1f120 6e 64 20 61 72 63 68 69 74 65 63 74 75 72 65 2e  nd architecture.
1f130 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
1f140 20 20 20 20 20 73 65 74 20 70 6c 61 74 66 6f 72       set platfor
1f150 6d 20 5b 67 65 74 42 75 69 6c 64 50 6c 61 74 66  m [getBuildPlatf
1f160 6f 72 6d 20 74 72 75 65 5d 0d 0a 20 20 20 20 20  orm true]..     
1f170 20 20 20 73 65 74 20 61 72 63 68 69 74 65 63 74     set architect
1f180 75 72 65 20 5b 61 72 63 68 69 74 65 63 74 75 72  ure [architectur
1f190 65 46 6f 72 50 6c 61 74 66 6f 72 6d 20 24 70 6c  eForPlatform $pl
1f1a0 61 74 66 6f 72 6d 5d 0d 0a 0d 0a 20 20 20 20 20  atform]....     
1f1b0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
1f1c0 4e 4f 54 45 3a 20 53 68 6f 77 20 74 68 65 20 70  NOTE: Show the p
1f1d0 6c 61 74 66 6f 72 6d 20 61 6e 64 20 61 72 63 68  latform and arch
1f1e0 69 74 65 63 74 75 72 65 20 75 73 65 64 20 74 6f  itecture used to
1f1f0 20 68 65 6c 70 20 6c 6f 63 61 74 65 20 74 68 65   help locate the
1f200 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
1f210 20 20 6e 61 74 69 76 65 20 62 75 69 6c 64 20 66    native build f
1f220 69 6c 65 73 2e 0d 0a 20 20 20 20 20 20 20 20 23  iles...        #
1f230 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20  ..        tputs 
1f240 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
1f250 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
1f260 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
1f270 20 70 6c 61 74 66 6f 72 6d 20 66 6f 72 20 6c 6f   platform for lo
1f280 63 61 74 69 6e 67 20 6e 61 74 69 76 65 20 62 75  cating native bu
1f290 69 6c 64 20 66 69 6c 65 73 20 69 73 20 5c 22 22  ild files is \""
1f2a0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
1f2b0 24 70 6c 61 74 66 6f 72 6d 20 5c 22 5c 6e 5d 0d  $platform \"\n].
1f2c0 0a 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73  ...        tputs
1f2d0 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
1f2e0 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
1f2f0 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
1f300 2d 20 61 72 63 68 69 74 65 63 74 75 72 65 20 66  - architecture f
1f310 6f 72 20 6c 6f 63 61 74 69 6e 67 20 6e 61 74 69  or locating nati
1f320 76 65 20 62 75 69 6c 64 20 66 69 6c 65 73 20 69  ve build files i
1f330 73 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20 20  s \"" \..       
1f340 20 20 20 20 20 24 61 72 63 68 69 74 65 63 74 75       $architectu
1f350 72 65 20 5c 22 5c 6e 5d 0d 0a 0d 0a 20 20 20 20  re \"\n]....    
1f360 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
1f370 20 4e 4f 54 45 3a 20 42 75 69 6c 64 20 61 20 6c   NOTE: Build a l
1f380 69 73 74 20 6f 66 20 63 6f 6e 66 69 67 75 72 61  ist of configura
1f390 74 69 6f 6e 20 66 69 6c 65 73 20 74 68 61 74 20  tion files that 
1f3a0 77 65 20 68 61 6e 64 6c 65 2e 0d 0a 20 20 20 20  we handle...    
1f3b0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 73      #..        s
1f3c0 65 74 20 63 6f 6e 66 69 67 46 69 6c 65 4e 61 6d  et configFileNam
1f3d0 65 73 20 5b 6c 69 73 74 20 5c 0d 0a 20 20 20 20  es [list \..    
1f3e0 20 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44          System.D
1f3f0 61 74 61 2e 53 51 4c 69 74 65 2e 64 6c 6c 2e 63  ata.SQLite.dll.c
1f400 6f 6e 66 69 67 5d 0d 0a 0d 0a 20 20 20 20 20 20  onfig]....      
1f410 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
1f420 4f 54 45 3a 20 42 75 69 6c 64 20 61 20 6c 69 73  OTE: Build a lis
1f430 74 20 6f 66 20 61 75 78 69 6c 69 61 72 79 20 4d  t of auxiliary M
1f440 61 6e 61 67 65 64 20 44 65 62 75 67 67 69 6e 67  anaged Debugging
1f450 20 41 73 73 69 73 74 61 6e 74 73 20 28 4d 44 41   Assistants (MDA
1f460 29 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  )..        #    
1f470 20 20 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e     configuration
1f480 20 66 69 6c 65 73 20 74 68 61 74 20 77 65 20 68   files that we h
1f490 61 6e 64 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20  andle...        
1f4a0 23 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 6d  #..        set m
1f4b0 64 61 43 6f 6e 66 69 67 46 69 6c 65 4e 61 6d 65  daConfigFileName
1f4c0 73 20 5b 6c 69 73 74 20 5c 0d 0a 20 20 20 20 20  s [list \..     
1f4d0 20 20 20 20 20 20 20 45 61 67 6c 65 53 68 65 6c         EagleShel
1f4e0 6c 33 32 2e 65 78 65 2e 6d 64 61 2e 63 6f 6e 66  l32.exe.mda.conf
1f4f0 69 67 20 49 6e 73 74 61 6c 6c 65 72 2e 65 78 65  ig Installer.exe
1f500 2e 6d 64 61 2e 63 6f 6e 66 69 67 20 5c 0d 0a 20  .mda.config \.. 
1f510 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 2e             test.
1f520 65 78 65 2e 6d 64 61 2e 63 6f 6e 66 69 67 20 74  exe.mda.config t
1f530 65 73 74 6c 69 6e 71 2e 65 78 65 2e 6d 64 61 2e  estlinq.exe.mda.
1f540 63 6f 6e 66 69 67 20 5c 0d 0a 20 20 20 20 20 20  config \..      
1f550 20 20 20 20 20 20 74 65 73 74 65 66 36 2e 65 78        testef6.ex
1f560 65 2e 6d 64 61 2e 63 6f 6e 66 69 67 5d 0d 0a 0d  e.mda.config]...
1f570 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
1f580 20 20 20 20 23 20 4e 4f 54 45 3a 20 42 75 69 6c      # NOTE: Buil
1f590 64 20 74 68 65 20 6c 69 73 74 20 6f 66 20 65 78  d the list of ex
1f5a0 74 65 72 6e 61 6c 20 66 69 6c 65 73 20 74 68 61  ternal files tha
1f5b0 74 20 77 65 20 68 61 6e 64 6c 65 2e 20 20 53 6f  t we handle.  So
1f5c0 6d 65 20 6f 66 0d 0a 20 20 20 20 20 20 20 20 23  me of..        #
1f5d0 20 20 20 20 20 20 20 74 68 65 73 65 20 66 69 6c         these fil
1f5e0 65 73 20 6d 61 79 20 62 65 20 6e 61 74 69 76 65  es may be native
1f5f0 20 61 6e 64 2f 6f 72 20 6d 61 6e 61 67 65 64 20   and/or managed 
1f600 61 73 73 65 6d 62 6c 69 65 73 20 74 68 61 74 20  assemblies that 
1f610 61 72 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20  are..        #  
1f620 20 20 20 20 20 72 65 71 75 69 72 65 64 20 74 6f       required to
1f630 20 70 65 72 66 6f 72 6d 20 76 61 72 69 6f 75 73   perform various
1f640 20 74 65 73 74 73 2e 0d 0a 20 20 20 20 20 20 20   tests...       
1f650 20 23 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20   #..        set 
1f660 65 78 74 65 72 6e 61 6c 46 69 6c 65 4e 61 6d 65  externalFileName
1f670 73 20 5b 6c 69 73 74 20 5c 0d 0a 20 20 20 20 20  s [list \..     
1f680 20 20 20 20 20 20 20 5b 66 69 6c 65 20 6a 6f 69         [file joi
1f690 6e 20 45 6e 74 69 74 79 46 72 61 6d 65 77 6f 72  n EntityFramewor
1f6a0 6b 20 6c 69 62 20 5b 73 74 72 69 6e 67 20 6d 61  k lib [string ma
1f6b0 70 20 5b 6c 69 73 74 20 46 78 20 22 22 5d 20 5b  p [list Fx ""] [
1f6c0 73 74 72 69 6e 67 20 5c 0d 0a 20 20 20 20 20 20  string \..      
1f6d0 20 20 20 20 20 20 6d 61 70 20 5b 6c 69 73 74 20        map [list 
1f6e0 6e 65 74 46 78 34 35 31 20 6e 65 74 46 78 34 35  netFx451 netFx45
1f6f0 20 6e 65 74 46 78 34 35 32 20 6e 65 74 46 78 34   netFx452 netFx4
1f700 35 20 6e 65 74 46 78 34 36 20 6e 65 74 46 78 34  5 netFx46 netFx4
1f710 35 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  5 \..           
1f720 20 6e 65 74 46 78 34 36 31 20 6e 65 74 46 78 34   netFx461 netFx4
1f730 35 5d 20 5b 67 65 74 42 75 69 6c 64 4e 65 74 46  5] [getBuildNetF
1f740 78 5d 5d 5d 20 45 6e 74 69 74 79 46 72 61 6d 65  x]]] EntityFrame
1f750 77 6f 72 6b 2e 64 6c 6c 5d 5d 0d 0a 0d 0a 20 20  work.dll]]....  
1f760 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
1f770 20 23 20 4e 4f 54 45 3a 20 42 75 69 6c 64 20 74   # NOTE: Build t
1f780 68 65 20 6c 69 73 74 20 6f 66 20 6e 61 74 69 76  he list of nativ
1f790 65 20 61 73 73 65 6d 62 6c 79 20 66 69 6c 65 73  e assembly files
1f7a0 20 74 68 61 74 20 77 65 20 68 61 6e 64 6c 65 2e   that we handle.
1f7b0 20 20 54 68 65 0d 0a 20 20 20 20 20 20 20 20 23    The..        #
1f7c0 20 20 20 20 20 20 20 72 65 61 73 6f 6e 20 74 68         reason th
1f7d0 65 20 22 53 79 73 74 65 6d 2e 44 61 74 61 2e 53  e "System.Data.S
1f7e0 51 4c 69 74 65 2e 64 6c 6c 22 20 66 69 6c 65 20  QLite.dll" file 
1f7f0 69 73 20 69 6e 63 6c 75 64 65 64 20 68 65 72 65  is included here
1f800 20 69 73 0d 0a 20 20 20 20 20 20 20 20 23 20 20   is..        #  
1f810 20 20 20 20 20 62 65 63 61 75 73 65 20 69 74 20       because it 
1f820 63 6f 75 6c 64 20 62 65 20 74 68 65 20 6d 69 78  could be the mix
1f830 65 64 2d 6d 6f 64 65 20 61 73 73 65 6d 62 6c 79  ed-mode assembly
1f840 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
1f850 20 20 20 20 20 20 73 65 74 20 6e 61 74 69 76 65        set native
1f860 46 69 6c 65 4e 61 6d 65 73 20 5b 6c 69 73 74 5d  FileNames [list]
1f870 0d 0a 0d 0a 20 20 20 20 20 20 20 20 65 76 61 6c  ....        eval
1f880 20 6c 61 70 70 65 6e 64 20 6e 61 74 69 76 65 46   lappend nativeF
1f890 69 6c 65 4e 61 6d 65 73 20 5b 67 65 74 4e 61 74  ileNames [getNat
1f8a0 69 76 65 4c 69 62 72 61 72 79 46 69 6c 65 4e 61  iveLibraryFileNa
1f8b0 6d 65 73 4f 6e 6c 79 5d 0d 0a 20 20 20 20 20 20  mesOnly]..      
1f8c0 20 20 65 76 61 6c 20 6c 61 70 70 65 6e 64 20 6e    eval lappend n
1f8d0 61 74 69 76 65 46 69 6c 65 4e 61 6d 65 73 20 5b  ativeFileNames [
1f8e0 67 65 74 49 6e 74 65 72 6f 70 41 73 73 65 6d 62  getInteropAssemb
1f8f0 6c 79 46 69 6c 65 4e 61 6d 65 73 4f 6e 6c 79 5d  lyFileNamesOnly]
1f900 0d 0a 0d 0a 20 20 20 20 20 20 20 20 6c 61 70 70  ....        lapp
1f910 65 6e 64 20 6e 61 74 69 76 65 46 69 6c 65 4e 61  end nativeFileNa
1f920 6d 65 73 20 53 79 73 74 65 6d 2e 44 61 74 61 2e  mes System.Data.
1f930 53 51 4c 69 74 65 2e 64 6c 6c 0d 0a 0d 0a 20 20  SQLite.dll....  
1f940 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
1f950 20 23 20 4e 4f 54 45 3a 20 42 75 69 6c 64 20 74   # NOTE: Build t
1f960 68 65 20 6c 69 73 74 20 6f 66 20 6d 61 6e 61 67  he list of manag
1f970 65 64 20 61 73 73 65 6d 62 6c 79 20 66 69 6c 65  ed assembly file
1f980 73 20 74 68 61 74 20 77 65 20 68 61 6e 64 6c 65  s that we handle
1f990 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
1f9a0 20 20 20 20 20 20 73 65 74 20 6d 61 6e 61 67 65        set manage
1f9b0 64 46 69 6c 65 4e 61 6d 65 73 20 5b 6c 69 73 74  dFileNames [list
1f9c0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
1f9d0 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
1f9e0 74 65 2e 64 6c 6c 20 53 79 73 74 65 6d 2e 44 61  te.dll System.Da
1f9f0 74 61 2e 53 51 4c 69 74 65 2e 4c 69 6e 71 2e 64  ta.SQLite.Linq.d
1fa00 6c 6c 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  ll \..          
1fa10 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51    System.Data.SQ
1fa20 4c 69 74 65 2e 45 46 36 2e 64 6c 6c 5d 0d 0a 0d  Lite.EF6.dll]...
1fa30 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
1fa40 20 20 20 20 23 20 4e 4f 54 45 3a 20 52 65 6d 6f      # NOTE: Remo
1fa50 76 65 20 61 6e 79 20 74 65 73 74 20 63 6f 6e 73  ve any test cons
1fa60 74 72 61 69 6e 74 73 20 74 68 61 74 20 72 65 66  traints that ref
1fa70 65 72 20 74 6f 20 74 68 65 20 6e 61 74 69 76 65  er to the native
1fa80 20 61 6e 64 2f 6f 72 0d 0a 20 20 20 20 20 20 20   and/or..       
1fa90 20 23 20 20 20 20 20 20 20 6d 61 6e 61 67 65 64   #       managed
1faa0 20 61 73 73 65 6d 62 6c 79 20 66 69 6c 65 73 20   assembly files 
1fab0 74 68 61 74 20 77 65 20 68 61 6e 64 6c 65 20 75  that we handle u
1fac0 6e 6c 65 73 73 20 66 6f 72 62 69 64 64 65 6e 20  nless forbidden 
1fad0 66 72 6f 6d 0d 0a 20 20 20 20 20 20 20 20 23 20  from..        # 
1fae0 20 20 20 20 20 20 64 6f 69 6e 67 20 73 6f 2e 0d        doing so..
1faf0 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
1fb00 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65      if {![info e
1fb10 78 69 73 74 73 20 3a 3a 6e 6f 28 73 71 6c 69 74  xists ::no(sqlit
1fb20 65 52 65 6d 6f 76 65 43 6f 6e 73 74 72 61 69 6e  eRemoveConstrain
1fb30 74 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ts)]} then {..  
1fb40 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20          foreach 
1fb50 66 69 6c 65 4e 61 6d 65 20 24 63 6f 6e 66 69 67  fileName $config
1fb60 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20  FileNames {..   
1fb70 20 20 20 20 20 20 20 20 20 72 65 6d 6f 76 65 43           removeC
1fb80 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e  onstraint [appen
1fb90 64 41 72 67 73 20 66 69 6c 65 5f 20 24 66 69 6c  dArgs file_ $fil
1fba0 65 4e 61 6d 65 5d 0d 0a 20 20 20 20 20 20 20 20  eName]..        
1fbb0 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20    }....         
1fbc0 20 66 6f 72 65 61 63 68 20 66 69 6c 65 4e 61 6d   foreach fileNam
1fbd0 65 20 24 6d 64 61 43 6f 6e 66 69 67 46 69 6c 65  e $mdaConfigFile
1fbe0 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20 20  Names {..       
1fbf0 20 20 20 20 20 72 65 6d 6f 76 65 43 6f 6e 73 74       removeConst
1fc00 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67  raint [appendArg
1fc10 73 20 66 69 6c 65 5f 20 24 66 69 6c 65 4e 61 6d  s file_ $fileNam
1fc20 65 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d  e]..          }.
1fc30 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72  ...          for
1fc40 65 61 63 68 20 66 69 6c 65 4e 61 6d 65 20 24 65  each fileName $e
1fc50 78 74 65 72 6e 61 6c 46 69 6c 65 4e 61 6d 65 73  xternalFileNames
1fc60 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
1fc70 72 65 6d 6f 76 65 43 6f 6e 73 74 72 61 69 6e 74  removeConstraint
1fc80 20 5b 61 70 70 65 6e 64 41 72 67 73 20 66 69 6c   [appendArgs fil
1fc90 65 5f 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 66  e_ [file tail $f
1fca0 69 6c 65 4e 61 6d 65 5d 5d 0d 0a 20 20 20 20 20  ileName]]..     
1fcb0 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
1fcc0 20 20 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65      foreach file
1fcd0 4e 61 6d 65 20 24 6e 61 74 69 76 65 46 69 6c 65  Name $nativeFile
1fce0 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20 20  Names {..       
1fcf0 20 20 20 20 20 72 65 6d 6f 76 65 43 6f 6e 73 74       removeConst
1fd00 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67  raint [appendArg
1fd10 73 20 66 69 6c 65 5f 20 24 66 69 6c 65 4e 61 6d  s file_ $fileNam
1fd20 65 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d  e]..          }.
1fd30 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72  ...          for
1fd40 65 61 63 68 20 66 69 6c 65 4e 61 6d 65 20 24 6d  each fileName $m
1fd50 61 6e 61 67 65 64 46 69 6c 65 4e 61 6d 65 73 20  anagedFileNames 
1fd60 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  {..            r
1fd70 65 6d 6f 76 65 43 6f 6e 73 74 72 61 69 6e 74 20  emoveConstraint 
1fd80 5b 61 70 70 65 6e 64 41 72 67 73 20 66 69 6c 65  [appendArgs file
1fd90 5f 20 24 66 69 6c 65 4e 61 6d 65 5d 0d 0a 20 20  _ $fileName]..  
1fda0 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
1fdb0 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
1fdc0 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
1fdd0 45 3a 20 53 6b 69 70 20 61 6c 6c 20 53 79 73 74  E: Skip all Syst
1fde0 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 20 72  em.Data.SQLite r
1fdf0 65 6c 61 74 65 64 20 66 69 6c 65 20 68 61 6e 64  elated file hand
1fe00 6c 69 6e 67 20 28 64 65 6c 65 74 69 6e 67 2c 0d  ling (deleting,.
1fe10 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
1fe20 20 63 6f 70 79 69 6e 67 2c 20 61 6e 64 20 6c 6f   copying, and lo
1fe30 61 64 69 6e 67 29 20 69 66 20 69 6e 73 74 72 75  ading) if instru
1fe40 63 74 65 64 2e 0d 0a 20 20 20 20 20 20 20 20 23  cted...        #
1fe50 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b  ..        if {![
1fe60 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f  info exists ::no
1fe70 28 73 71 6c 69 74 65 46 69 6c 65 73 29 5d 7d 20  (sqliteFiles)]} 
1fe80 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
1fe90 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23    #..          #
1fea0 20 4e 4f 54 45 3a 20 53 6b 69 70 20 74 72 79 69   NOTE: Skip tryi
1feb0 6e 67 20 74 6f 20 64 65 6c 65 74 65 20 61 6e 79  ng to delete any
1fec0 20 66 69 6c 65 73 20 69 66 20 69 6e 73 74 72 75   files if instru
1fed0 63 74 65 64 2e 0d 0a 20 20 20 20 20 20 20 20 20  cted...         
1fee0 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66   #..          if
1fef0 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20   {![info exists 
1ff00 3a 3a 6e 6f 28 64 65 6c 65 74 65 53 71 6c 69 74  ::no(deleteSqlit
1ff10 65 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e 20 7b  eFiles)]} then {
1ff20 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ..            if
1ff30 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20   {![info exists 
1ff40 3a 3a 6e 6f 28 64 65 6c 65 74 65 53 71 6c 69 74  ::no(deleteSqlit
1ff50 65 43 6f 6e 66 69 67 46 69 6c 65 73 29 5d 7d 20  eConfigFiles)]} 
1ff60 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
1ff70 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 66 69        foreach fi
1ff80 6c 65 4e 61 6d 65 20 24 63 6f 6e 66 69 67 46 69  leName $configFi
1ff90 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20  leNames {..     
1ffa0 20 20 20 20 20 20 20 20 20 20 20 74 72 79 44 65             tryDe
1ffb0 6c 65 74 65 42 69 6e 61 72 79 46 69 6c 65 20 24  leteBinaryFile $
1ffc0 66 69 6c 65 4e 61 6d 65 0d 0a 20 20 20 20 20 20  fileName..      
1ffd0 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
1ffe0 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
1fff0 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e          if {![in
20000 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 64  fo exists ::no(d
20010 65 6c 65 74 65 53 71 6c 69 74 65 45 78 74 65 72  eleteSqliteExter
20020 6e 61 6c 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e  nalFiles)]} then
20030 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
20040 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65 4e 61    foreach fileNa
20050 6d 65 20 24 6d 64 61 43 6f 6e 66 69 67 46 69 6c  me $mdaConfigFil
20060 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20  eNames {..      
20070 20 20 20 20 20 20 20 20 20 20 74 72 79 44 65 6c            tryDel
20080 65 74 65 42 75 69 6c 64 46 69 6c 65 20 24 66 69  eteBuildFile $fi
20090 6c 65 4e 61 6d 65 0d 0a 20 20 20 20 20 20 20 20  leName..        
200a0 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
200b0 20 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68           foreach
200c0 20 66 69 6c 65 4e 61 6d 65 20 24 65 78 74 65 72   fileName $exter
200d0 6e 61 6c 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a  nalFileNames {..
200e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
200f0 74 72 79 44 65 6c 65 74 65 42 69 6e 61 72 79 46  tryDeleteBinaryF
20100 69 6c 65 20 24 66 69 6c 65 4e 61 6d 65 0d 0a 20  ile $fileName.. 
20110 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a               }..
20120 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d              }...
20130 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20  .            if 
20140 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a  {![info exists :
20150 3a 6e 6f 28 64 65 6c 65 74 65 53 71 6c 69 74 65  :no(deleteSqlite
20160 4e 61 74 69 76 65 46 69 6c 65 73 29 5d 7d 20 74  NativeFiles)]} t
20170 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
20180 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20       if {![info 
20190 65 78 69 73 74 73 20 3a 3a 6e 6f 28 64 65 6c 65  exists ::no(dele
201a0 74 65 53 71 6c 69 74 65 49 6d 70 6c 69 63 69 74  teSqliteImplicit
201b0 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d  Files)]} then {.
201c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
201d0 20 66 6f 72 65 61 63 68 20 66 69 6c 65 4e 61 6d   foreach fileNam
201e0 65 20 24 6e 61 74 69 76 65 46 69 6c 65 4e 61 6d  e $nativeFileNam
201f0 65 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  es {..          
20200 20 20 20 20 20 20 20 20 74 72 79 44 65 6c 65 74          tryDelet
20210 65 41 73 73 65 6d 62 6c 79 20 24 66 69 6c 65 4e  eAssembly $fileN
20220 61 6d 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ame..           
20230 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
20240 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
20250 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69           if {![i
20260 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28  nfo exists ::no(
20270 64 65 6c 65 74 65 53 71 6c 69 74 65 4e 6f 6e 49  deleteSqliteNonI
20280 6d 70 6c 69 63 69 74 46 69 6c 65 73 29 5d 7d 20  mplicitFiles)]} 
20290 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
202a0 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e          if {![in
202b0 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 64  fo exists ::no(d
202c0 65 6c 65 74 65 53 71 6c 69 74 65 50 6c 61 74 66  eleteSqlitePlatf
202d0 6f 72 6d 46 69 6c 65 73 29 5d 20 26 26 20 5c 0d  ormFiles)] && \.
202e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
202f0 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e       [string len
20300 67 74 68 20 24 70 6c 61 74 66 6f 72 6d 5d 20 3e  gth $platform] >
20310 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
20320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f                fo
20330 72 65 61 63 68 20 66 69 6c 65 4e 61 6d 65 20 24  reach fileName $
20340 6e 61 74 69 76 65 46 69 6c 65 4e 61 6d 65 73 20  nativeFileNames 
20350 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
20360 20 20 20 20 20 20 20 74 72 79 44 65 6c 65 74 65         tryDelete
20370 41 73 73 65 6d 62 6c 79 20 24 66 69 6c 65 4e 61  Assembly $fileNa
20380 6d 65 20 24 70 6c 61 74 66 6f 72 6d 0d 0a 20 20  me $platform..  
20390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
203a0 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  }..             
203b0 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
203c0 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e          if {![in
203d0 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 64  fo exists ::no(d
203e0 65 6c 65 74 65 53 71 6c 69 74 65 41 72 63 68 69  eleteSqliteArchi
203f0 74 65 63 74 75 72 65 46 69 6c 65 73 29 5d 20 26  tectureFiles)] &
20400 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  & \..           
20410 20 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67           [string
20420 20 6c 65 6e 67 74 68 20 24 61 72 63 68 69 74 65   length $archite
20430 63 74 75 72 65 5d 20 3e 20 30 7d 20 74 68 65 6e  cture] > 0} then
20440 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
20450 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 66 69        foreach fi
20460 6c 65 4e 61 6d 65 20 24 6e 61 74 69 76 65 46 69  leName $nativeFi
20470 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20  leNames {..     
20480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
20490 72 79 44 65 6c 65 74 65 41 73 73 65 6d 62 6c 79  ryDeleteAssembly
204a0 20 24 66 69 6c 65 4e 61 6d 65 20 24 61 72 63 68   $fileName $arch
204b0 69 74 65 63 74 75 72 65 0d 0a 20 20 20 20 20 20  itecture..      
204c0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
204d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
204e0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
204f0 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  }..            }
20500 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
20510 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74  if {![info exist
20520 73 20 3a 3a 6e 6f 28 64 65 6c 65 74 65 53 71 6c  s ::no(deleteSql
20530 69 74 65 4d 61 6e 61 67 65 64 46 69 6c 65 73 29  iteManagedFiles)
20540 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
20550 20 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68           foreach
20560 20 66 69 6c 65 4e 61 6d 65 20 24 6d 61 6e 61 67   fileName $manag
20570 65 64 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20  edFileNames {.. 
20580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
20590 72 79 44 65 6c 65 74 65 41 73 73 65 6d 62 6c 79  ryDeleteAssembly
205a0 20 24 66 69 6c 65 4e 61 6d 65 0d 0a 20 20 20 20   $fileName..    
205b0 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
205c0 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
205d0 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
205e0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
205f0 20 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20    # NOTE: Check 
20600 66 6f 72 20 74 68 65 20 22 61 75 74 6f 53 65 6c  for the "autoSel
20610 65 63 74 22 20 72 75 6e 74 69 6d 65 20 6f 70 74  ect" runtime opt
20620 69 6f 6e 2e 20 20 49 66 20 70 72 65 73 65 6e 74  ion.  If present
20630 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 20  ,..          #  
20640 20 20 20 20 20 61 74 74 65 6d 70 74 20 74 6f 20       attempt to 
20650 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 73 65  automatically se
20660 6c 65 63 74 20 74 68 65 20 66 69 72 73 74 20 61  lect the first a
20670 76 61 69 6c 61 62 6c 65 0d 0a 20 20 20 20 20 20  vailable..      
20680 20 20 20 20 23 20 20 20 20 20 20 20 62 75 69 6c      #       buil
20690 64 20 28 6f 72 20 22 72 65 6c 65 61 73 65 22 29  d (or "release")
206a0 20 6f 66 20 53 51 4c 69 74 65 20 61 6e 64 20 53   of SQLite and S
206b0 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
206c0 65 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 20  e..          #  
206d0 20 20 20 20 20 66 6f 72 20 75 73 65 20 77 69 74       for use wit
206e0 68 20 74 68 65 20 74 65 73 74 20 73 75 69 74 65  h the test suite
206f0 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a  ...          #..
20700 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 68            if {[h
20710 61 73 52 75 6e 74 69 6d 65 4f 70 74 69 6f 6e 20  asRuntimeOption 
20720 61 75 74 6f 53 65 6c 65 63 74 5d 7d 20 74 68 65  autoSelect]} the
20730 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
20740 20 69 66 20 7b 21 5b 63 68 65 63 6b 46 6f 72 53   if {![checkForS
20750 51 4c 69 74 65 42 75 69 6c 64 73 20 24 3a 3a 74  QLiteBuilds $::t
20760 65 73 74 5f 63 68 61 6e 6e 65 6c 20 74 72 75 65  est_channel true
20770 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
20780 20 20 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f           checkFo
20790 72 53 51 4c 69 74 65 52 65 6c 65 61 73 65 73 20  rSQLiteReleases 
207a0 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
207b0 74 72 75 65 0d 0a 20 20 20 20 20 20 20 20 20 20  true..          
207c0 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d    }..          }
207d0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d  ....          #.
207e0 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54  .          # NOT
207f0 45 3a 20 53 6b 69 70 20 74 72 79 69 6e 67 20 74  E: Skip trying t
20800 6f 20 76 65 72 69 66 79 20 74 68 65 20 62 75 69  o verify the bui
20810 6c 64 20 64 69 72 65 63 74 6f 72 79 20 69 66 20  ld directory if 
20820 69 6e 73 74 72 75 63 74 65 64 3b 0d 0a 20 20 20  instructed;..   
20830 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 6f         #       o
20840 74 68 65 72 77 69 73 65 2c 20 6d 61 6b 65 20 73  therwise, make s
20850 75 72 65 20 69 74 20 61 63 74 75 61 6c 6c 79 20  ure it actually 
20860 65 78 69 73 74 73 20 6f 72 20 68 61 6c 74 20 74  exists or halt t
20870 68 65 20 65 6e 74 69 72 65 0d 0a 20 20 20 20 20  he entire..     
20880 20 20 20 20 20 23 20 20 20 20 20 20 20 74 65 73       #       tes
20890 74 69 6e 67 20 70 72 6f 63 65 73 73 20 69 66 20  ting process if 
208a0 69 74 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73  it does not exis
208b0 74 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d  t...          #.
208c0 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21  .          if {!
208d0 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e  [info exists ::n
208e0 6f 28 76 65 72 69 66 79 42 75 69 6c 64 44 69 72  o(verifyBuildDir
208f0 65 63 74 6f 72 79 29 5d 7d 20 74 68 65 6e 20 7b  ectory)]} then {
20900 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 0d  ..            #.
20910 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4e  .            # N
20920 4f 54 45 3a 20 41 74 20 74 68 69 73 20 70 6f 69  OTE: At this poi
20930 6e 74 2c 20 74 68 65 20 62 75 69 6c 64 20 64 69  nt, the build di
20940 72 65 63 74 6f 72 79 20 4d 55 53 54 20 65 78 69  rectory MUST exi
20950 73 74 20 61 73 20 61 0d 0a 20 20 20 20 20 20 20  st as a..       
20960 20 20 20 20 20 23 20 20 20 20 20 20 20 76 61 6c       #       val
20970 69 64 20 64 69 72 65 63 74 6f 72 79 20 66 6f 72  id directory for
20980 20 74 68 65 20 74 65 73 74 69 6e 67 20 70 72 6f   the testing pro
20990 63 65 73 73 20 74 6f 20 63 6f 6e 74 69 6e 75 65  cess to continue
209a0 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23  ...            #
209b0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 65  ..            se
209c0 74 20 64 69 72 65 63 74 6f 72 79 20 5b 67 65 74  t directory [get
209d0 42 75 69 6c 64 44 69 72 65 63 74 6f 72 79 5d 0d  BuildDirectory].
209e0 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ...            i
209f0 66 20 7b 21 5b 66 69 6c 65 20 65 78 69 73 74 73  f {![file exists
20a00 20 24 64 69 72 65 63 74 6f 72 79 5d 20 7c 7c 20   $directory] || 
20a10 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
20a20 20 20 20 21 5b 66 69 6c 65 20 69 73 64 69 72 65     ![file isdire
20a30 63 74 6f 72 79 20 24 64 69 72 65 63 74 6f 72 79  ctory $directory
20a40 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
20a50 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
20a60 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45            # NOTE
20a70 3a 20 4a 75 73 74 20 70 72 69 6f 72 20 74 6f 20  : Just prior to 
20a80 61 63 74 75 61 6c 6c 79 20 68 61 6c 74 69 6e 67  actually halting
20a90 20 74 68 65 20 74 65 73 74 69 6e 67 20 70 72 6f   the testing pro
20aa0 63 65 73 73 2c 0d 0a 20 20 20 20 20 20 20 20 20  cess,..         
20ab0 20 20 20 20 20 23 20 20 20 20 20 20 20 61 64 64       #       add
20ac0 20 61 6e 20 65 72 72 6f 72 20 74 6f 20 74 68 65   an error to the
20ad0 20 74 65 73 74 20 6c 6f 67 20 66 69 6c 65 2e 0d   test log file..
20ae0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23  .              #
20af0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
20b00 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
20b10 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
20b20 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
20b30 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 6f 75         "---- cou
20b40 6c 64 20 6e 6f 74 20 76 65 72 69 66 79 20 62 75  ld not verify bu
20b50 69 6c 64 20 64 69 72 65 63 74 6f 72 79 20 5c 22  ild directory \"
20b60 22 20 24 64 69 72 65 63 74 6f 72 79 20 5c 0d 0a  " $directory \..
20b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20b80 20 20 22 5c 22 2c 20 61 6c 6c 20 74 65 73 74 69    "\", all testi
20b90 6e 67 20 68 61 6c 74 65 64 5c 6e 22 5d 0d 0a 0d  ng halted\n"]...
20ba0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23  .              #
20bb0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
20bc0 23 20 4e 4f 54 45 3a 20 52 61 69 73 69 6e 67 20  # NOTE: Raising 
20bd0 61 20 73 63 72 69 70 74 20 65 72 72 6f 72 20 66  a script error f
20be0 72 6f 6d 20 74 68 69 73 20 70 6f 69 6e 74 20 73  rom this point s
20bf0 68 6f 75 6c 64 20 68 61 6c 74 0d 0a 20 20 20 20  hould halt..    
20c00 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20            #     
20c10 20 20 74 68 65 20 74 65 73 74 69 6e 67 20 70 72    the testing pr
20c20 6f 63 65 73 73 2e 0d 0a 20 20 20 20 20 20 20 20  ocess...        
20c30 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
20c40 20 20 20 20 20 20 20 65 72 72 6f 72 20 5b 61 70         error [ap
20c50 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
20c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 63                "c
20c70 6f 75 6c 64 20 6e 6f 74 20 76 65 72 69 66 79 20  ould not verify 
20c80 62 75 69 6c 64 20 64 69 72 65 63 74 6f 72 79 20  build directory 
20c90 5c 22 22 20 24 64 69 72 65 63 74 6f 72 79 20 5c  \"" $directory \
20ca0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
20cb0 20 20 20 20 22 5c 22 2c 20 61 6c 6c 20 74 65 73      "\", all tes
20cc0 74 69 6e 67 20 68 61 6c 74 65 64 22 5d 0d 0a 20  ting halted"].. 
20cd0 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
20ce0 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
20cf0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
20d00 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 6b 69 70      # NOTE: Skip
20d10 20 74 72 79 69 6e 67 20 74 6f 20 63 6f 70 79 20   trying to copy 
20d20 61 6e 79 20 66 69 6c 65 73 20 69 66 20 69 6e 73  any files if ins
20d30 74 72 75 63 74 65 64 2e 0d 0a 20 20 20 20 20 20  tructed...      
20d40 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
20d50 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73   if {![info exis
20d60 74 73 20 3a 3a 6e 6f 28 63 6f 70 79 53 71 6c 69  ts ::no(copySqli
20d70 74 65 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e 20  teFiles)]} then 
20d80 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  {..            i
20d90 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73  f {![info exists
20da0 20 3a 3a 6e 6f 28 63 6f 70 79 53 71 6c 69 74 65   ::no(copySqlite
20db0 43 6f 6e 66 69 67 46 69 6c 65 73 29 5d 7d 20 74  ConfigFiles)]} t
20dc0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
20dd0 20 20 20 20 20 66 6f 72 65 61 63 68 20 66 69 6c       foreach fil
20de0 65 4e 61 6d 65 20 24 63 6f 6e 66 69 67 46 69 6c  eName $configFil
20df0 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20  eNames {..      
20e00 20 20 20 20 20 20 20 20 20 20 74 72 79 43 6f 70            tryCop
20e10 79 42 75 69 6c 64 46 69 6c 65 20 24 66 69 6c 65  yBuildFile $file
20e20 4e 61 6d 65 0d 0a 20 20 20 20 20 20 20 20 20 20  Name..          
20e30 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
20e40 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
20e50 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65      if {![info e
20e60 78 69 73 74 73 20 3a 3a 6e 6f 28 63 6f 70 79 53  xists ::no(copyS
20e70 71 6c 69 74 65 45 78 74 65 72 6e 61 6c 46 69 6c  qliteExternalFil
20e80 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  es)]} then {..  
20e90 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20              #.. 
20ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4e               # N
20eb0 4f 54 45 3a 20 43 6f 70 79 20 74 68 65 20 4d 61  OTE: Copy the Ma
20ec0 6e 61 67 65 64 20 44 65 62 75 67 67 69 6e 67 20  naged Debugging 
20ed0 41 73 73 69 73 74 61 6e 74 73 20 28 4d 44 41 29  Assistants (MDA)
20ee0 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 0d 0a   configuration..
20ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20                # 
20f00 20 20 20 20 20 20 66 69 6c 65 20 66 6f 72 20 74        file for t
20f10 68 65 20 45 61 67 6c 65 20 73 68 65 6c 6c 20 74  he Eagle shell t
20f20 6f 20 74 68 65 20 62 75 69 6c 64 20 6f 75 74 70  o the build outp
20f30 75 74 20 64 69 72 65 63 74 6f 72 79 2c 0d 0a 20  ut directory,.. 
20f40 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20 20               #  
20f50 20 20 20 20 20 77 68 69 6c 65 20 75 73 69 6e 67       while using
20f60 20 65 61 63 68 20 6f 66 20 74 68 65 20 6e 61 6d   each of the nam
20f70 65 73 20 6f 66 20 74 68 65 20 76 61 72 69 6f 75  es of the variou
20f80 73 20 6c 65 67 61 63 79 20 74 65 73 74 0d 0a 20  s legacy test.. 
20f90 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20 20               #  
20fa0 20 20 20 20 20 65 78 65 63 75 74 61 62 6c 65 73       executables
20fb0 2e 20 20 54 68 69 73 20 77 69 6c 6c 20 68 65 6c  .  This will hel
20fc0 70 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74  p to make sure t
20fd0 68 61 74 20 61 6c 6c 20 74 68 65 0d 0a 20 20 20  hat all the..   
20fe0 20 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20             #    
20ff0 20 20 20 6c 65 67 61 63 79 20 74 65 73 74 73 20     legacy tests 
21000 72 75 6e 20 77 69 74 68 20 65 78 61 63 74 6c 79  run with exactly
21010 20 74 68 65 20 73 61 6d 65 20 73 65 74 20 6f 66   the same set of
21020 20 4d 61 6e 61 67 65 64 0d 0a 20 20 20 20 20 20   Managed..      
21030 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
21040 44 65 62 75 67 67 69 6e 67 20 41 73 73 69 73 74  Debugging Assist
21050 61 6e 74 73 20 63 6f 6e 66 69 67 75 72 65 64 2e  ants configured.
21060 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
21070 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  #..             
21080 20 66 6f 72 65 61 63 68 20 66 69 6c 65 4e 61 6d   foreach fileNam
21090 65 20 24 6d 64 61 43 6f 6e 66 69 67 46 69 6c 65  e $mdaConfigFile
210a0 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20 20  Names {..       
210b0 20 20 20 20 20 20 20 20 20 74 72 79 43 6f 70 79           tryCopy
210c0 42 69 6e 61 72 79 46 69 6c 65 20 45 61 67 6c 65  BinaryFile Eagle
210d0 53 68 65 6c 6c 2e 65 78 65 2e 6d 64 61 2e 63 6f  Shell.exe.mda.co
210e0 6e 66 69 67 20 22 22 20 24 66 69 6c 65 4e 61 6d  nfig "" $fileNam
210f0 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e..             
21100 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   }....          
21110 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
21120 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 6f 70       # NOTE: Cop
21130 79 20 74 68 65 20 65 78 74 65 72 6e 61 6c 20 62  y the external b
21140 69 6e 61 72 69 65 73 2c 20 69 66 20 61 6e 79 2c  inaries, if any,
21150 20 74 6f 20 74 68 65 20 64 69 72 65 63 74 6f 72   to the director
21160 79 20 74 68 61 74 0d 0a 20 20 20 20 20 20 20 20  y that..        
21170 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63 6f        #       co
21180 6e 74 61 69 6e 73 20 74 68 65 20 45 61 67 6c 65  ntains the Eagle
21190 20 73 68 65 6c 6c 2e 20 20 54 68 69 73 20 69 73   shell.  This is
211a0 20 74 79 70 69 63 61 6c 6c 79 20 75 73 65 64 20   typically used 
211b0 74 6f 20 6d 61 6b 65 0d 0a 20 20 20 20 20 20 20  to make..       
211c0 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 73         #       s
211d0 75 72 65 20 61 73 73 65 6d 62 6c 69 65 73 20 72  ure assemblies r
211e0 65 66 65 72 65 6e 63 65 64 20 62 79 20 74 68 65  eferenced by the
211f0 20 6f 6e 65 73 20 62 65 69 6e 67 20 74 65 73 74   ones being test
21200 65 64 20 61 72 65 0d 0a 20 20 20 20 20 20 20 20  ed are..        
21210 20 20 20 20 20 20 23 20 20 20 20 20 20 20 61 76        #       av
21220 61 69 6c 61 62 6c 65 20 64 75 72 69 6e 67 20 74  ailable during t
21230 68 65 20 74 65 73 74 69 6e 67 20 70 72 6f 63 65  he testing proce
21240 73 73 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ss...           
21250 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
21260 20 20 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65      foreach file
21270 4e 61 6d 65 20 24 65 78 74 65 72 6e 61 6c 46 69  Name $externalFi
21280 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20  leNames {..     
21290 20 20 20 20 20 20 20 20 20 20 20 74 72 79 43 6f             tryCo
212a0 70 79 45 78 74 65 72 6e 61 6c 46 69 6c 65 20 24  pyExternalFile $
212b0 66 69 6c 65 4e 61 6d 65 0d 0a 20 20 20 20 20 20  fileName..      
212c0 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
212d0 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
212e0 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e          if {![in
212f0 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 63  fo exists ::no(c
21300 6f 70 79 53 71 6c 69 74 65 4e 61 74 69 76 65 46  opySqliteNativeF
21310 69 6c 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a  iles)]} then {..
21320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 0d                #.
21330 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23  .              #
21340 20 4e 4f 54 45 3a 20 49 66 20 74 68 65 20 74 65   NOTE: If the te
21350 73 74 20 70 6c 61 74 66 6f 72 6d 20 69 73 20 6c  st platform is l
21360 69 6b 65 6c 79 20 74 68 65 20 64 65 66 61 75 6c  ikely the defaul
21370 74 20 66 6f 72 20 74 68 69 73 0d 0a 20 20 20 20  t for this..    
21380 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20            #     
21390 20 20 6d 61 63 68 69 6e 65 2c 20 61 6c 73 6f 20    machine, also 
213a0 74 72 79 20 74 6f 20 63 6f 70 79 20 74 68 65 20  try to copy the 
213b0 6e 61 74 69 76 65 20 66 69 6c 65 73 20 74 6f 20  native files to 
213c0 74 68 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20  the..           
213d0 20 20 20 23 20 20 20 20 20 20 20 62 69 6e 61 72     #       binar
213e0 79 20 6c 6f 63 61 74 69 6f 6e 2e 0d 0a 20 20 20  y location...   
213f0 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
21400 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b              if {
21410 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  ![info exists ::
21420 6e 6f 28 63 6f 70 79 53 71 6c 69 74 65 49 6d 70  no(copySqliteImp
21430 6c 69 63 69 74 46 69 6c 65 73 29 5d 20 26 26 20  licitFiles)] && 
21440 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
21450 20 20 20 20 20 5b 69 73 44 65 66 61 75 6c 74 42       [isDefaultB
21460 75 69 6c 64 50 6c 61 74 66 6f 72 6d 20 74 72 75  uildPlatform tru
21470 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  e]} then {..    
21480 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 65              fore
21490 61 63 68 20 66 69 6c 65 4e 61 6d 65 20 24 6e 61  ach fileName $na
214a0 74 69 76 65 46 69 6c 65 4e 61 6d 65 73 20 7b 0d  tiveFileNames {.
214b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
214c0 20 20 20 74 72 79 43 6f 70 79 41 73 73 65 6d 62     tryCopyAssemb
214d0 6c 79 20 24 66 69 6c 65 4e 61 6d 65 0d 0a 20 20  ly $fileName..  
214e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d                }.
214f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
21500 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
21510 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69    if {![info exi
21520 73 74 73 20 3a 3a 6e 6f 28 63 6f 70 79 53 71 6c  sts ::no(copySql
21530 69 74 65 4e 6f 6e 49 6d 70 6c 69 63 69 74 46 69  iteNonImplicitFi
21540 6c 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  les)]} then {.. 
21550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
21560 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73  f {![info exists
21570 20 3a 3a 6e 6f 28 63 6f 70 79 53 71 6c 69 74 65   ::no(copySqlite
21580 50 6c 61 74 66 6f 72 6d 46 69 6c 65 73 29 5d 20  PlatformFiles)] 
21590 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  && \..          
215a0 20 20 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e            [strin
215b0 67 20 6c 65 6e 67 74 68 20 24 70 6c 61 74 66 6f  g length $platfo
215c0 72 6d 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d  rm] > 0} then {.
215d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
215e0 20 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65 4e     foreach fileN
215f0 61 6d 65 20 24 6e 61 74 69 76 65 46 69 6c 65 4e  ame $nativeFileN
21600 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20 20 20  ames {..        
21610 20 20 20 20 20 20 20 20 20 20 20 20 74 72 79 43              tryC
21620 6f 70 79 41 73 73 65 6d 62 6c 79 20 24 66 69 6c  opyAssembly $fil
21630 65 4e 61 6d 65 20 24 70 6c 61 74 66 6f 72 6d 0d  eName $platform.
21640 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
21650 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
21660 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
21670 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21             if {!
21680 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e  [info exists ::n
21690 6f 28 63 6f 70 79 53 71 6c 69 74 65 41 72 63 68  o(copySqliteArch
216a0 69 74 65 63 74 75 72 65 46 69 6c 65 73 29 5d 20  itectureFiles)] 
216b0 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  && \..          
216c0 20 20 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e            [strin
216d0 67 20 6c 65 6e 67 74 68 20 24 61 72 63 68 69 74  g length $archit
216e0 65 63 74 75 72 65 5d 20 3e 20 30 7d 20 74 68 65  ecture] > 0} the
216f0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
21700 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 66         foreach f
21710 69 6c 65 4e 61 6d 65 20 24 6e 61 74 69 76 65 46  ileName $nativeF
21720 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20  ileNames {..    
21730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21740 74 72 79 43 6f 70 79 41 73 73 65 6d 62 6c 79 20  tryCopyAssembly 
21750 24 66 69 6c 65 4e 61 6d 65 20 24 61 72 63 68 69  $fileName $archi
21760 74 65 63 74 75 72 65 0d 0a 20 20 20 20 20 20 20  tecture..       
21770 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
21780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d                }.
21790 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
217a0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
217b0 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ...            i
217c0 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73  f {![info exists
217d0 20 3a 3a 6e 6f 28 63 6f 70 79 53 71 6c 69 74 65   ::no(copySqlite
217e0 4d 61 6e 61 67 65 64 46 69 6c 65 73 29 5d 7d 20  ManagedFiles)]} 
217f0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
21800 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 66 69        foreach fi
21810 6c 65 4e 61 6d 65 20 24 6d 61 6e 61 67 65 64 46  leName $managedF
21820 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20  ileNames {..    
21830 20 20 20 20 20 20 20 20 20 20 20 20 74 72 79 43              tryC
21840 6f 70 79 41 73 73 65 6d 62 6c 79 20 24 66 69 6c  opyAssembly $fil
21850 65 4e 61 6d 65 0d 0a 20 20 20 20 20 20 20 20 20  eName..         
21860 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
21870 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
21880 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   }....          
21890 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e  #..          # N
218a0 4f 54 45 3a 20 53 6b 69 70 20 74 72 79 69 6e 67  OTE: Skip trying
218b0 20 74 6f 20 6c 6f 61 64 20 61 6e 79 20 66 69 6c   to load any fil
218c0 65 73 20 69 66 20 69 6e 73 74 72 75 63 74 65 64  es if instructed
218d0 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a  ...          #..
218e0 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b            if {![
218f0 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f  info exists ::no
21900 28 6c 6f 61 64 53 71 6c 69 74 65 46 69 6c 65 73  (loadSqliteFiles
21910 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  )]} then {..    
21920 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e          if {![in
21930 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 6c  fo exists ::no(l
21940 6f 61 64 53 71 6c 69 74 65 49 6d 70 6c 69 63 69  oadSqliteImplici
21950 74 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e 20 7b  tFiles)]} then {
21960 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
21970 74 72 79 4c 6f 61 64 41 73 73 65 6d 62 6c 79 20  tryLoadAssembly 
21980 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
21990 74 65 2e 64 6c 6c 0d 0a 20 20 20 20 20 20 20 20  te.dll..        
219a0 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
219b0 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20       if {![info 
219c0 65 78 69 73 74 73 20 3a 3a 6e 6f 28 6c 6f 61 64  exists ::no(load
219d0 53 71 6c 69 74 65 4c 69 6e 71 46 69 6c 65 73 29  SqliteLinqFiles)
219e0 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
219f0 20 20 20 20 20 20 20 20 20 74 72 79 4c 6f 61 64           tryLoad
21a00 41 73 73 65 6d 62 6c 79 20 53 79 73 74 65 6d 2e  Assembly System.
21a10 44 61 74 61 2e 53 51 4c 69 74 65 2e 4c 69 6e 71  Data.SQLite.Linq
21a20 2e 64 6c 6c 0d 0a 20 20 20 20 20 20 20 20 20 20  .dll..          
21a30 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20    }....         
21a40 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78     if {![info ex
21a50 69 73 74 73 20 3a 3a 6e 6f 28 6c 6f 61 64 53 71  ists ::no(loadSq
21a60 6c 69 74 65 45 66 36 46 69 6c 65 73 29 5d 7d 20  liteEf6Files)]} 
21a70 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
21a80 20 20 20 20 20 20 74 72 79 4c 6f 61 64 41 73 73        tryLoadAss
21a90 65 6d 62 6c 79 20 53 79 73 74 65 6d 2e 44 61 74  embly System.Dat
21aa0 61 2e 53 51 4c 69 74 65 2e 45 46 36 2e 64 6c 6c  a.SQLite.EF6.dll
21ab0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
21ac0 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ...            i
21ad0 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73  f {![info exists
21ae0 20 3a 3a 6e 6f 28 6c 6f 61 64 53 71 6c 69 74 65   ::no(loadSqlite
21af0 4e 6f 6e 49 6d 70 6c 69 63 69 74 46 69 6c 65 73  NonImplicitFiles
21b00 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  )]} then {..    
21b10 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b            if {![
21b20 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f  info exists ::no
21b30 28 6c 6f 61 64 53 71 6c 69 74 65 50 6c 61 74 66  (loadSqlitePlatf
21b40 6f 72 6d 46 69 6c 65 73 29 5d 20 26 26 20 5c 0d  ormFiles)] && \.
21b50 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
21b60 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74     [string lengt
21b70 68 20 24 70 6c 61 74 66 6f 72 6d 5d 20 3e 20 30  h $platform] > 0
21b80 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
21b90 20 20 20 20 20 20 20 20 20 20 74 72 79 4c 6f 61            tryLoa
21ba0 64 41 73 73 65 6d 62 6c 79 20 53 79 73 74 65 6d  dAssembly System
21bb0 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 64 6c 6c  .Data.SQLite.dll
21bc0 20 24 70 6c 61 74 66 6f 72 6d 0d 0a 20 20 20 20   $platform..    
21bd0 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20            }.... 
21be0 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20               if 
21bf0 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a  {![info exists :
21c00 3a 6e 6f 28 6c 6f 61 64 53 71 6c 69 74 65 41 72  :no(loadSqliteAr
21c10 63 68 69 74 65 63 74 75 72 65 46 69 6c 65 73 29  chitectureFiles)
21c20 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20  ] && \..        
21c30 20 20 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e            [strin
21c40 67 20 6c 65 6e 67 74 68 20 24 61 72 63 68 69 74  g length $archit
21c50 65 63 74 75 72 65 5d 20 3e 20 30 7d 20 74 68 65  ecture] > 0} the
21c60 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
21c70 20 20 20 20 20 74 72 79 4c 6f 61 64 41 73 73 65       tryLoadAsse
21c80 6d 62 6c 79 20 53 79 73 74 65 6d 2e 44 61 74 61  mbly System.Data
21c90 2e 53 51 4c 69 74 65 2e 64 6c 6c 20 24 61 72 63  .SQLite.dll $arc
21ca0 68 69 74 65 63 74 75 72 65 0d 0a 20 20 20 20 20  hitecture..     
21cb0 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
21cc0 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
21cd0 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
21ce0 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 66 6f 72  }....        for
21cf0 65 61 63 68 20 66 69 6c 65 4e 61 6d 65 4f 6e 6c  each fileNameOnl
21d00 79 20 5b 67 65 74 4e 61 74 69 76 65 4c 69 62 72  y [getNativeLibr
21d10 61 72 79 46 69 6c 65 4e 61 6d 65 73 4f 6e 6c 79  aryFileNamesOnly
21d20 5d 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 63  ] {..          c
21d30 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20  atch {..        
21d40 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
21d50 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e  t_channel [appen
21d60 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
21d70 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 66           "---- f
21d80 69 6c 65 20 76 65 72 73 69 6f 6e 20 6f 66 20 5c  ile version of \
21d90 22 22 20 24 66 69 6c 65 4e 61 6d 65 4f 6e 6c 79  "" $fileNameOnly
21da0 20 22 5c 22 2e 2e 2e 20 5c 22 22 20 5c 0d 0a 20   "\"... \"" \.. 
21db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b                 [
21dc0 66 69 6c 65 20 76 65 72 73 69 6f 6e 20 5b 67 65  file version [ge
21dd0 74 42 69 6e 61 72 79 46 69 6c 65 4e 61 6d 65 20  tBinaryFileName 
21de0 24 66 69 6c 65 4e 61 6d 65 4f 6e 6c 79 5d 5d 20  $fileNameOnly]] 
21df0 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20  \"\n]..         
21e00 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d   }..        }...
21e10 0a 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68  .        foreach
21e20 20 66 69 6c 65 4e 61 6d 65 4f 6e 6c 79 20 5b 67   fileNameOnly [g
21e30 65 74 49 6e 74 65 72 6f 70 41 73 73 65 6d 62 6c  etInteropAssembl
21e40 79 46 69 6c 65 4e 61 6d 65 73 4f 6e 6c 79 5d 20  yFileNamesOnly] 
21e50 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 63 61 74  {..          cat
21e60 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  ch {..          
21e70 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
21e80 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
21e90 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
21ea0 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 66 69 6c         "---- fil
21eb0 65 20 76 65 72 73 69 6f 6e 20 6f 66 20 5c 22 22  e version of \""
21ec0 20 24 66 69 6c 65 4e 61 6d 65 4f 6e 6c 79 20 22   $fileNameOnly "
21ed0 5c 22 2e 2e 2e 20 5c 22 22 20 5c 0d 0a 20 20 20  \"... \"" \..   
21ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 66 69               [fi
21ef0 6c 65 20 76 65 72 73 69 6f 6e 20 5b 67 65 74 42  le version [getB
21f00 69 6e 61 72 79 46 69 6c 65 4e 61 6d 65 20 24 66  inaryFileName $f
21f10 69 6c 65 4e 61 6d 65 4f 6e 6c 79 5d 5d 20 5c 22  ileNameOnly]] \"
21f20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  \n]..          }
21f30 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  ..        }.... 
21f40 20 20 20 20 20 20 20 63 61 74 63 68 20 7b 0d 0a         catch {..
21f50 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
21f60 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
21f70 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
21f80 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d               "--
21f90 2d 2d 20 66 69 6c 65 20 76 65 72 73 69 6f 6e 20  -- file version 
21fa0 6f 66 20 5c 22 53 79 73 74 65 6d 2e 44 61 74 61  of \"System.Data
21fb0 2e 53 51 4c 69 74 65 2e 64 6c 6c 5c 22 2e 2e 2e  .SQLite.dll\"...
21fc0 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20 20 20   \"" \..        
21fd0 20 20 20 20 20 20 5b 66 69 6c 65 20 76 65 72 73        [file vers
21fe0 69 6f 6e 20 5b 67 65 74 42 69 6e 61 72 79 46 69  ion [getBinaryFi
21ff0 6c 65 4e 61 6d 65 20 53 79 73 74 65 6d 2e 44 61  leName System.Da
22000 74 61 2e 53 51 4c 69 74 65 2e 64 6c 6c 5d 5d 20  ta.SQLite.dll]] 
22010 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 7d  \"\n]..        }
22020 0d 0a 0d 0a 20 20 20 20 20 20 20 20 63 61 74 63  ....        catc
22030 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74  h {..          t
22040 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
22050 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
22060 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
22070 20 20 22 2d 2d 2d 2d 20 66 69 6c 65 20 76 65 72    "---- file ver
22080 73 69 6f 6e 20 6f 66 20 5c 22 53 79 73 74 65 6d  sion of \"System
22090 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 4c 69 6e  .Data.SQLite.Lin
220a0 71 2e 64 6c 6c 5c 22 2e 2e 2e 20 5c 22 22 20 5c  q.dll\"... \"" \
220b0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
220c0 5b 66 69 6c 65 20 76 65 72 73 69 6f 6e 20 5b 67  [file version [g
220d0 65 74 42 69 6e 61 72 79 46 69 6c 65 4e 61 6d 65  etBinaryFileName
220e0 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c   System.Data.SQL
220f0 69 74 65 2e 4c 69 6e 71 2e 64 6c 6c 5d 5d 20 5c  ite.Linq.dll]] \
22100 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
22110 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 7d  \"\n]..        }
22120 0d 0a 0d 0a 20 20 20 20 20 20 20 20 63 61 74 63  ....        catc
22130 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74  h {..          t
22140 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
22150 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
22160 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
22170 20 20 22 2d 2d 2d 2d 20 66 69 6c 65 20 76 65 72    "---- file ver
22180 73 69 6f 6e 20 6f 66 20 5c 22 53 79 73 74 65 6d  sion of \"System
22190 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 45 46 36  .Data.SQLite.EF6
221a0 2e 64 6c 6c 5c 22 2e 2e 2e 20 5c 22 22 20 5c 0d  .dll\"... \"" \.
221b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b  .              [
221c0 66 69 6c 65 20 76 65 72 73 69 6f 6e 20 5b 67 65  file version [ge
221d0 74 42 69 6e 61 72 79 46 69 6c 65 4e 61 6d 65 20  tBinaryFileName 
221e0 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
221f0 74 65 2e 45 46 36 2e 64 6c 6c 5d 5d 20 5c 0d 0a  te.EF6.dll]] \..
22200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 22                \"
22210 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  \n]..        }..
22220 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73  ..        if {[s
22230 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 70 6c  tring length $pl
22240 61 74 66 6f 72 6d 5d 20 3e 20 30 7d 20 74 68 65  atform] > 0} the
22250 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 66  n {..          f
22260 6f 72 65 61 63 68 20 66 69 6c 65 4e 61 6d 65 4f  oreach fileNameO
22270 6e 6c 79 20 5b 67 65 74 4e 61 74 69 76 65 4c 69  nly [getNativeLi
22280 62 72 61 72 79 46 69 6c 65 4e 61 6d 65 73 4f 6e  braryFileNamesOn
22290 6c 79 5d 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  ly] {..         
222a0 20 20 20 63 61 74 63 68 20 7b 0d 0a 20 20 20 20     catch {..    
222b0 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
222c0 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
222d0 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
222e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
222f0 20 22 2d 2d 2d 2d 20 66 69 6c 65 20 76 65 72 73   "---- file vers
22300 69 6f 6e 20 6f 66 20 5c 22 22 20 24 70 6c 61 74  ion of \"" $plat
22310 66 6f 72 6d 20 5c 0d 0a 20 20 20 20 20 20 20 20  form \..        
22320 20 20 20 20 20 20 20 20 20 20 2f 20 24 66 69 6c            / $fil
22330 65 4e 61 6d 65 4f 6e 6c 79 20 22 5c 22 2e 2e 2e  eNameOnly "\"...
22340 20 5c 22 22 20 5b 66 69 6c 65 20 76 65 72 73 69   \"" [file versi
22350 6f 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  on \..          
22360 20 20 20 20 20 20 20 20 5b 67 65 74 42 69 6e 61          [getBina
22370 72 79 46 69 6c 65 4e 61 6d 65 20 24 66 69 6c 65  ryFileName $file
22380 4e 61 6d 65 4f 6e 6c 79 20 24 70 6c 61 74 66 6f  NameOnly $platfo
22390 72 6d 5d 5d 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20  rm]] \"\n]..    
223a0 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
223b0 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
223c0 20 20 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65      foreach file
223d0 4e 61 6d 65 4f 6e 6c 79 20 5b 67 65 74 49 6e 74  NameOnly [getInt
223e0 65 72 6f 70 41 73 73 65 6d 62 6c 79 46 69 6c 65  eropAssemblyFile
223f0 4e 61 6d 65 73 4f 6e 6c 79 5d 20 7b 0d 0a 20 20  NamesOnly] {..  
22400 20 20 20 20 20 20 20 20 20 20 63 61 74 63 68 20            catch 
22410 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
22420 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
22430 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
22440 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
22450 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 66 69          "---- fi
22460 6c 65 20 76 65 72 73 69 6f 6e 20 6f 66 20 5c 22  le version of \"
22470 22 20 24 70 6c 61 74 66 6f 72 6d 20 5c 0d 0a 20  " $platform \.. 
22480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22490 20 2f 20 24 66 69 6c 65 4e 61 6d 65 4f 6e 6c 79   / $fileNameOnly
224a0 20 22 5c 22 2e 2e 2e 20 5c 22 22 20 5b 66 69 6c   "\"... \"" [fil
224b0 65 20 76 65 72 73 69 6f 6e 20 5c 0d 0a 20 20 20  e version \..   
224c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b                 [
224d0 67 65 74 42 69 6e 61 72 79 46 69 6c 65 4e 61 6d  getBinaryFileNam
224e0 65 20 24 66 69 6c 65 4e 61 6d 65 4f 6e 6c 79 20  e $fileNameOnly 
224f0 24 70 6c 61 74 66 6f 72 6d 5d 5d 20 5c 22 5c 6e  $platform]] \"\n
22500 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  ]..            }
22510 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d  ..          }...
22520 0a 20 20 20 20 20 20 20 20 20 20 63 61 74 63 68  .          catch
22530 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
22540 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
22550 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
22560 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
22570 20 20 20 20 20 22 2d 2d 2d 2d 20 66 69 6c 65 20       "---- file 
22580 76 65 72 73 69 6f 6e 20 6f 66 20 5c 22 22 20 24  version of \"" $
22590 70 6c 61 74 66 6f 72 6d 20 5c 0d 0a 20 20 20 20  platform \..    
225a0 20 20 20 20 20 20 20 20 20 20 20 20 22 2f 53 79              "/Sy
225b0 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
225c0 2e 64 6c 6c 5c 22 2e 2e 2e 20 5c 22 22 20 5b 66  .dll\"... \"" [f
225d0 69 6c 65 20 76 65 72 73 69 6f 6e 20 5c 0d 0a 20  ile version \.. 
225e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b                 [
225f0 67 65 74 42 69 6e 61 72 79 46 69 6c 65 4e 61 6d  getBinaryFileNam
22600 65 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51  e System.Data.SQ
22610 4c 69 74 65 2e 64 6c 6c 20 24 70 6c 61 74 66 6f  Lite.dll $platfo
22620 72 6d 5d 5d 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20  rm]] \"\n]..    
22630 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
22640 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66   }....        if
22650 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68   {[string length
22660 20 24 61 72 63 68 69 74 65 63 74 75 72 65 5d 20   $architecture] 
22670 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  > 0} then {..   
22680 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 66         foreach f
22690 69 6c 65 4e 61 6d 65 4f 6e 6c 79 20 5b 67 65 74  ileNameOnly [get
226a0 4e 61 74 69 76 65 4c 69 62 72 61 72 79 46 69 6c  NativeLibraryFil
226b0 65 4e 61 6d 65 73 4f 6e 6c 79 5d 20 7b 0d 0a 20  eNamesOnly] {.. 
226c0 20 20 20 20 20 20 20 20 20 20 20 63 61 74 63 68             catch
226d0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
226e0 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
226f0 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
22700 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
22710 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 66           "---- f
22720 69 6c 65 20 76 65 72 73 69 6f 6e 20 6f 66 20 5c  ile version of \
22730 22 22 20 24 61 72 63 68 69 74 65 63 74 75 72 65  "" $architecture
22740 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
22750 20 20 20 20 20 20 2f 20 24 66 69 6c 65 4e 61 6d        / $fileNam
22760 65 4f 6e 6c 79 20 22 5c 22 2e 2e 2e 20 5c 22 22  eOnly "\"... \""
22770 20 5b 66 69 6c 65 20 76 65 72 73 69 6f 6e 20 5c   [file version \
22780 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
22790 20 20 20 20 5b 67 65 74 42 69 6e 61 72 79 46 69      [getBinaryFi
227a0 6c 65 4e 61 6d 65 20 24 66 69 6c 65 4e 61 6d 65  leName $fileName
227b0 4f 6e 6c 79 20 24 61 72 63 68 69 74 65 63 74 75  Only $architectu
227c0 72 65 5d 5d 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20  re]] \"\n]..    
227d0 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
227e0 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
227f0 20 20 20 20 63 61 74 63 68 20 7b 0d 0a 20 20 20      catch {..   
22800 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
22810 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b  ::test_channel [
22820 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
22830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d                "-
22840 2d 2d 2d 20 66 69 6c 65 20 76 65 72 73 69 6f 6e  --- file version
22850 20 6f 66 20 5c 22 22 20 24 61 72 63 68 69 74 65   of \"" $archite
22860 63 74 75 72 65 20 5c 0d 0a 20 20 20 20 20 20 20  cture \..       
22870 20 20 20 20 20 20 20 20 20 2f 20 24 66 69 6c 65           / $file
22880 4e 61 6d 65 4f 6e 6c 79 20 22 5c 22 2e 2e 2e 20  NameOnly "\"... 
22890 5c 22 22 20 5b 66 69 6c 65 20 76 65 72 73 69 6f  \"" [file versio
228a0 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n \..           
228b0 20 20 20 20 20 5b 67 65 74 42 69 6e 61 72 79 46       [getBinaryF
228c0 69 6c 65 4e 61 6d 65 20 24 66 69 6c 65 4e 61 6d  ileName $fileNam
228d0 65 4f 6e 6c 79 20 24 61 72 63 68 69 74 65 63 74  eOnly $architect
228e0 75 72 65 5d 5d 20 5c 22 5c 6e 5d 0d 0a 20 20 20  ure]] \"\n]..   
228f0 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
22900 20 20 20 20 20 20 63 61 74 63 68 20 7b 0d 0a 20        catch {.. 
22910 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
22920 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
22930 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
22940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22950 22 2d 2d 2d 2d 20 66 69 6c 65 20 76 65 72 73 69  "---- file versi
22960 6f 6e 20 6f 66 20 5c 22 22 20 24 61 72 63 68 69  on of \"" $archi
22970 74 65 63 74 75 72 65 20 5c 0d 0a 20 20 20 20 20  tecture \..     
22980 20 20 20 20 20 20 20 20 20 20 20 22 2f 53 79 73             "/Sys
22990 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e  tem.Data.SQLite.
229a0 64 6c 6c 5c 22 2e 2e 2e 20 5c 22 22 20 5b 66 69  dll\"... \"" [fi
229b0 6c 65 20 76 65 72 73 69 6f 6e 20 5c 0d 0a 20 20  le version \..  
229c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 67                [g
229d0 65 74 42 69 6e 61 72 79 46 69 6c 65 4e 61 6d 65  etBinaryFileName
229e0 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c   System.Data.SQL
229f0 69 74 65 2e 64 6c 6c 20 24 61 72 63 68 69 74 65  ite.dll $archite
22a00 63 74 75 72 65 5d 5d 20 5c 0d 0a 20 20 20 20 20  cture]] \..     
22a10 20 20 20 20 20 20 20 20 20 20 20 5c 22 5c 6e 5d             \"\n]
22a20 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20  ..          }.. 
22a30 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
22a40 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
22a50 20 4e 4f 54 45 3a 20 47 72 61 62 20 74 68 65 20   NOTE: Grab the 
22a60 6c 69 73 74 20 6f 66 20 6d 61 6e 61 67 65 64 20  list of managed 
22a70 61 73 73 65 6d 62 6c 69 65 73 20 66 6f 72 20 74  assemblies for t
22a80 68 65 20 63 75 72 72 65 6e 74 20 70 72 6f 63 65  he current proce
22a90 73 73 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  ss..        #   
22aa0 20 20 20 20 61 6e 64 20 72 65 70 6f 72 74 20 6f      and report o
22ab0 6e 20 74 68 65 20 53 79 73 74 65 6d 2e 44 61 74  n the System.Dat
22ac0 61 2e 53 51 4c 69 74 65 20 72 65 6c 61 74 65 64  a.SQLite related
22ad0 20 6f 6e 65 73 2e 0d 0a 20 20 20 20 20 20 20 20   ones...        
22ae0 23 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b  #..        if {[
22af0 68 61 76 65 53 51 4c 69 74 65 4f 62 6a 65 63 74  haveSQLiteObject
22b00 43 6f 6d 6d 61 6e 64 5d 7d 20 74 68 65 6e 20 7b  Command]} then {
22b10 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20  ..          set 
22b20 61 73 73 65 6d 62 6c 69 65 73 20 5b 6f 62 6a 65  assemblies [obje
22b30 63 74 20 69 6e 76 6f 6b 65 20 41 70 70 44 6f 6d  ct invoke AppDom
22b40 61 69 6e 2e 43 75 72 72 65 6e 74 44 6f 6d 61 69  ain.CurrentDomai
22b50 6e 20 47 65 74 41 73 73 65 6d 62 6c 69 65 73 5d  n GetAssemblies]
22b60 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 6f 62  ....          ob
22b70 6a 65 63 74 20 66 6f 72 65 61 63 68 20 61 73 73  ject foreach ass
22b80 65 6d 62 6c 79 20 24 61 73 73 65 6d 62 6c 69 65  embly $assemblie
22b90 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s {..           
22ba0 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6d 61 74   if {[string mat
22bb0 63 68 20 5c 7b 53 79 73 74 65 6d 2e 44 61 74 61  ch \{System.Data
22bc0 2e 53 51 4c 69 74 65 2a 20 24 61 73 73 65 6d 62  .SQLite* $assemb
22bd0 6c 79 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  ly]} then {..   
22be0 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
22bf0 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
22c00 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
22c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22c20 20 20 22 2d 2d 2d 2d 20 66 6f 75 6e 64 20 6c 6f    "---- found lo
22c30 61 64 65 64 20 61 73 73 65 6d 62 6c 79 3a 20 22  aded assembly: "
22c40 20 24 61 73 73 65 6d 62 6c 79 20 5c 6e 5d 0d 0a   $assembly \n]..
22c50 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
22c60 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
22c70 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
22c80 20 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20   catch {..      
22c90 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
22ca0 74 5f 63 68 61 6e 6e 65 6c 20 5c 0d 0a 20 20 20  t_channel \..   
22cb0 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
22cc0 20 64 65 66 69 6e 65 20 63 6f 6e 73 74 61 6e 74   define constant
22cd0 73 20 66 6f 72 20 5c 22 53 79 73 74 65 6d 2e 44  s for \"System.D
22ce0 61 74 61 2e 53 51 4c 69 74 65 5c 22 2e 2e 2e 20  ata.SQLite\"... 
22cf0 22 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 69  "....          i
22d00 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20  f {[catch {..   
22d10 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20           object 
22d20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e  invoke -flags +N
22d30 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20  onPublic \..    
22d40 20 20 20 20 20 20 20 20 20 20 20 20 53 79 73 74              Syst
22d50 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 53  em.Data.SQLite.S
22d60 51 4c 69 74 65 33 20 44 65 66 69 6e 65 43 6f 6e  QLite3 DefineCon
22d70 73 74 61 6e 74 73 0d 0a 20 20 20 20 20 20 20 20  stants..        
22d80 20 20 7d 20 64 65 66 69 6e 65 43 6f 6e 73 74 61    } defineConsta
22d90 6e 74 73 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20  nts] == 0} then 
22da0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  {..            t
22db0 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
22dc0 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
22dd0 20 5b 66 6f 72 6d 61 74 4c 69 73 74 20 5b 6c 73   [formatList [ls
22de0 6f 72 74 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ort \..         
22df0 20 20 20 20 20 20 20 24 64 65 66 69 6e 65 43 6f         $defineCo
22e00 6e 73 74 61 6e 74 73 5d 20 3c 6e 6f 6e 65 3e 5d  nstants] <none>]
22e10 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20   \n]..          
22e20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
22e30 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
22e40 65 73 74 5f 63 68 61 6e 6e 65 6c 20 75 6e 6b 6e  est_channel unkn
22e50 6f 77 6e 5c 6e 0d 0a 20 20 20 20 20 20 20 20 20  own\n..         
22e60 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d   }..        }...
22e70 0a 20 20 20 20 20 20 20 20 63 61 74 63 68 20 7b  .        catch {
22e80 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70 75 74  ..          tput
22e90 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
22ea0 6c 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  l \..           
22eb0 20 20 20 22 2d 2d 2d 2d 20 73 6f 75 72 63 65 20     "---- source 
22ec0 76 65 72 73 69 6f 6e 20 6f 66 20 5c 22 53 79 73  version of \"Sys
22ed0 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e  tem.Data.SQLite.
22ee0 64 6c 6c 5c 22 2e 2e 2e 20 22 0d 0a 0d 0a 20 20  dll\"... "....  
22ef0 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74          if {[cat
22f00 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  ch {..          
22f10 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20    object invoke 
22f20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69  -flags +NonPubli
22f30 63 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  c \..           
22f40 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61       System.Data
22f50 2e 53 51 4c 69 74 65 2e 53 51 4c 69 74 65 43 6f  .SQLite.SQLiteCo
22f60 6e 6e 65 63 74 69 6f 6e 20 50 72 6f 76 69 64 65  nnection Provide
22f70 72 56 65 72 73 69 6f 6e 0d 0a 20 20 20 20 20 20  rVersion..      
22f80 20 20 20 20 7d 20 76 65 72 73 69 6f 6e 5d 20 3d      } version] =
22f90 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  = 0} then {..   
22fa0 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73 74           if {[st
22fb0 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 76 65 72  ring length $ver
22fc0 73 69 6f 6e 5d 20 3d 3d 20 30 7d 20 74 68 65 6e  sion] == 0} then
22fd0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
22fe0 20 20 73 65 74 20 76 65 72 73 69 6f 6e 20 6e 75    set version nu
22ff0 6c 6c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ll..            
23000 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  }..            t
23010 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
23020 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
23030 20 24 76 65 72 73 69 6f 6e 20 5c 6e 5d 0d 0a 20   $version \n].. 
23040 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20           } else 
23050 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  {..            t
23060 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
23070 6e 6e 65 6c 20 75 6e 6b 6e 6f 77 6e 5c 6e 0d 0a  nnel unknown\n..
23080 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
23090 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
230a0 20 20 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20    catch {..     
230b0 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
230c0 73 74 5f 63 68 61 6e 6e 65 6c 20 5c 0d 0a 20 20  st_channel \..  
230d0 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
230e0 2d 20 73 6f 75 72 63 65 20 63 68 65 63 6b 6f 75  - source checkou
230f0 74 20 6f 66 20 5c 22 53 79 73 74 65 6d 2e 44 61  t of \"System.Da
23100 74 61 2e 53 51 4c 69 74 65 2e 64 6c 6c 5c 22 2e  ta.SQLite.dll\".
23110 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 20 20 20 20  .. "....        
23120 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a    if {[catch {..
23130 20 20 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65              obje
23140 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73  ct invoke -flags
23150 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20   +NonPublic \.. 
23160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
23170 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
23180 65 2e 53 51 4c 69 74 65 43 6f 6e 6e 65 63 74 69  e.SQLiteConnecti
23190 6f 6e 20 50 72 6f 76 69 64 65 72 53 6f 75 72 63  on ProviderSourc
231a0 65 49 64 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  eId..          }
231b0 20 73 6f 75 72 63 65 49 64 5d 20 3d 3d 20 30 7d   sourceId] == 0}
231c0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
231d0 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67       if {[string
231e0 20 6c 65 6e 67 74 68 20 24 73 6f 75 72 63 65 49   length $sourceI
231f0 64 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d  d] == 0} then {.
23200 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
23210 65 74 20 73 6f 75 72 63 65 49 64 20 6e 75 6c 6c  et sourceId null
23220 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
23230 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75  .            tpu
23240 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
23250 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 24  el [appendArgs $
23260 73 6f 75 72 63 65 49 64 20 5c 6e 5d 0d 0a 20 20  sourceId \n]..  
23270 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b          } else {
23280 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70  ..            tp
23290 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  uts $::test_chan
232a0 6e 65 6c 20 75 6e 6b 6e 6f 77 6e 5c 6e 0d 0a 20  nel unknown\n.. 
232b0 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
232c0 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
232d0 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
232e0 54 45 3a 20 43 68 65 63 6b 20 74 68 65 20 61 76  TE: Check the av
232f0 61 69 6c 61 62 6c 65 20 62 75 69 6c 64 73 20 28  ailable builds (
23300 61 6e 64 20 22 72 65 6c 65 61 73 65 73 22 29 20  and "releases") 
23310 6f 66 20 53 51 4c 69 74 65 20 61 6e 64 0d 0a 20  of SQLite and.. 
23320 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 53         #       S
23330 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
23340 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  e...        #.. 
23350 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72 53         checkForS
23360 51 4c 69 74 65 42 75 69 6c 64 73 20 24 3a 3a 74  QLiteBuilds $::t
23370 65 73 74 5f 63 68 61 6e 6e 65 6c 0d 0a 20 20 20  est_channel..   
23380 20 20 20 20 20 63 68 65 63 6b 46 6f 72 53 51 4c       checkForSQL
23390 69 74 65 52 65 6c 65 61 73 65 73 20 24 3a 3a 74  iteReleases $::t
233a0 65 73 74 5f 63 68 61 6e 6e 65 6c 0d 0a 0d 0a 20  est_channel.... 
233b0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
233c0 20 20 23 20 4e 4f 54 45 3a 20 4e 6f 77 2c 20 77    # NOTE: Now, w
233d0 65 20 6e 65 65 64 20 74 6f 20 6b 6e 6f 77 20 69  e need to know i
233e0 66 20 74 68 65 20 53 51 4c 69 74 65 20 63 6f 72  f the SQLite cor
233f0 65 20 6c 69 62 72 61 72 79 20 69 73 20 61 76 61  e library is ava
23400 69 6c 61 62 6c 65 0d 0a 20 20 20 20 20 20 20 20  ilable..        
23410 23 20 20 20 20 20 20 20 28 69 2e 65 2e 20 62 65  #       (i.e. be
23420 63 61 75 73 65 20 74 68 65 20 6d 61 6e 61 67 65  cause the manage
23430 64 2d 6f 6e 6c 79 20 53 79 73 74 65 6d 2e 44 61  d-only System.Da
23440 74 61 2e 53 51 4c 69 74 65 20 61 73 73 65 6d 62  ta.SQLite assemb
23450 6c 79 20 63 61 6e 0d 0a 20 20 20 20 20 20 20 20  ly can..        
23460 23 20 20 20 20 20 20 20 6c 6f 61 64 20 77 69 74  #       load wit
23470 68 6f 75 74 20 69 74 3b 20 68 6f 77 65 76 65 72  hout it; however
23480 2c 20 69 74 20 63 61 6e 6e 6f 74 20 64 6f 20 61  , it cannot do a
23490 6e 79 74 68 69 6e 67 20 75 73 65 66 75 6c 20 77  nything useful w
234a0 69 74 68 6f 75 74 0d 0a 20 20 20 20 20 20 20 20  ithout..        
234b0 23 20 20 20 20 20 20 20 69 74 29 2e 20 20 49 66  #       it).  If
234c0 20 77 65 20 61 72 65 20 75 73 69 6e 67 20 74 68   we are using th
234d0 65 20 6d 69 78 65 64 2d 6d 6f 64 65 20 61 73 73  e mixed-mode ass
234e0 65 6d 62 6c 79 20 61 6e 64 20 77 65 20 61 6c 72  embly and we alr
234f0 65 61 64 79 0d 0a 20 20 20 20 20 20 20 20 23 20  eady..        # 
23500 20 20 20 20 20 20 66 6f 75 6e 64 20 69 74 20 28        found it (
23510 61 62 6f 76 65 29 2c 20 74 68 69 73 20 73 68 6f  above), this sho
23520 75 6c 64 20 61 6c 77 61 79 73 20 73 75 63 63 65  uld always succe
23530 65 64 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  ed...        #..
23540 20 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72          checkFor
23550 53 51 4c 69 74 65 4c 69 62 72 61 72 79 20 24 3a  SQLiteLibrary $:
23560 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 0d 0a 0d  :test_channel...
23570 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
23580 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68 65 63      # NOTE: Chec
23590 6b 20 69 66 20 74 68 65 20 53 51 4c 69 74 65 20  k if the SQLite 
235a0 69 6e 74 65 72 6f 70 20 61 73 73 65 6d 62 6c 79  interop assembly
235b0 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2e 0d 0a   is available...
235c0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
235d0 20 20 20 63 68 65 63 6b 46 6f 72 53 51 4c 69 74     checkForSQLit
235e0 65 49 6e 74 65 72 6f 70 20 24 3a 3a 74 65 73 74  eInterop $::test
235f0 5f 63 68 61 6e 6e 65 6c 0d 0a 0d 0a 20 20 20 20  _channel....    
23600 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
23610 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 74 68 65   NOTE: Check the
23620 20 53 51 4c 69 74 65 20 64 61 74 61 62 61 73 65   SQLite database
23630 20 61 6e 64 20 74 65 6d 70 6f 72 61 72 79 20 64   and temporary d
23640 69 72 65 63 74 6f 72 69 65 73 2e 0d 0a 20 20 20  irectories...   
23650 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
23660 63 68 65 63 6b 46 6f 72 53 51 4c 69 74 65 44 69  checkForSQLiteDi
23670 72 65 63 74 6f 72 69 65 73 20 24 3a 3a 74 65 73  rectories $::tes
23680 74 5f 63 68 61 6e 6e 65 6c 0d 0a 0d 0a 20 20 20  t_channel....   
23690 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
236a0 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74 20  # NOTE: Attempt 
236b0 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20  to determine if 
236c0 76 61 72 69 6f 75 73 20 63 6f 6d 70 69 6c 65 2d  various compile-
236d0 74 69 6d 65 20 6f 70 74 69 6f 6e 73 20 6e 65 65  time options nee
236e0 64 65 64 20 66 6f 72 0d 0a 20 20 20 20 20 20 20  ded for..       
236f0 20 23 20 20 20 20 20 20 20 74 65 73 74 20 63 6f   #       test co
23700 6e 73 74 72 61 69 6e 74 73 20 77 65 72 65 20 65  nstraints were e
23710 6e 61 62 6c 65 64 20 66 6f 72 20 74 68 65 20 6d  nabled for the m
23720 61 6e 61 67 65 64 20 61 73 73 65 6d 62 6c 79 2e  anaged assembly.
23730 20 20 54 68 65 72 65 0d 0a 20 20 20 20 20 20 20    There..       
23740 20 23 20 20 20 20 20 20 20 61 72 65 20 73 6f 6d   #       are som
23750 65 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f  e compile-time o
23760 70 74 69 6f 6e 73 20 74 68 61 74 20 6d 75 73 74  ptions that must
23770 20 61 6c 73 6f 20 68 61 76 65 20 62 65 65 6e 20   also have been 
23780 65 6e 61 62 6c 65 64 0d 0a 20 20 20 20 20 20 20  enabled..       
23790 20 23 20 20 20 20 20 20 20 66 6f 72 20 74 68 65   #       for the
237a0 20 69 6e 74 65 72 6f 70 20 61 73 73 65 6d 62 6c   interop assembl
237b0 79 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 62 65  y in order to be
237c0 20 65 66 66 65 63 74 69 76 65 2e 20 20 46 6f 72   effective.  For
237d0 20 74 68 6f 73 65 0d 0a 20 20 20 20 20 20 20 20   those..        
237e0 23 20 20 20 20 20 20 20 6f 70 74 69 6f 6e 73 2c  #       options,
237f0 20 69 74 20 77 69 6c 6c 20 62 65 20 61 73 73 75   it will be assu
23800 6d 65 64 20 74 68 61 74 20 69 74 20 77 61 73 20  med that it was 
23810 65 6e 61 62 6c 65 64 20 66 6f 72 20 74 68 65 20  enabled for the 
23820 69 6e 74 65 72 6f 70 0d 0a 20 20 20 20 20 20 20  interop..       
23830 20 23 20 20 20 20 20 20 20 61 73 73 65 6d 62 6c   #       assembl
23840 79 20 69 66 20 69 74 20 77 61 73 20 65 6e 61 62  y if it was enab
23850 6c 65 64 20 66 6f 72 20 74 68 65 20 6d 61 6e 61  led for the mana
23860 67 65 64 20 61 73 73 65 6d 62 6c 79 2e 0d 0a 20  ged assembly... 
23870 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
23880 20 20 66 6f 72 65 61 63 68 20 64 65 66 69 6e 65    foreach define
23890 43 6f 6e 73 74 61 6e 74 20 5b 6c 69 73 74 20 5c  Constant [list \
238a0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 43 48  ..            CH
238b0 45 43 4b 5f 53 54 41 54 45 20 43 4f 55 4e 54 5f  ECK_STATE COUNT_
238c0 48 41 4e 44 4c 45 20 44 45 42 55 47 20 49 4e 54  HANDLE DEBUG INT
238d0 45 52 4f 50 5f 43 4f 44 45 43 20 49 4e 54 45 52  EROP_CODEC INTER
238e0 4f 50 5f 44 45 42 55 47 20 5c 0d 0a 20 20 20 20  OP_DEBUG \..    
238f0 20 20 20 20 20 20 20 20 49 4e 54 45 52 4f 50 5f          INTEROP_
23900 45 58 54 45 4e 53 49 4f 4e 5f 46 55 4e 43 54 49  EXTENSION_FUNCTI
23910 4f 4e 53 20 49 4e 54 45 52 4f 50 5f 46 54 53 35  ONS INTEROP_FTS5
23920 5f 45 58 54 45 4e 53 49 4f 4e 20 5c 0d 0a 20 20  _EXTENSION \..  
23930 20 20 20 20 20 20 20 20 20 20 49 4e 54 45 52 4f            INTERO
23940 50 5f 49 4e 43 4c 55 44 45 5f 43 45 52 4f 44 20  P_INCLUDE_CEROD 
23950 49 4e 54 45 52 4f 50 5f 49 4e 43 4c 55 44 45 5f  INTEROP_INCLUDE_
23960 45 58 54 52 41 20 49 4e 54 45 52 4f 50 5f 49 4e  EXTRA INTEROP_IN
23970 43 4c 55 44 45 5f 53 45 45 20 5c 0d 0a 20 20 20  CLUDE_SEE \..   
23980 20 20 20 20 20 20 20 20 20 49 4e 54 45 52 4f 50           INTEROP
23990 5f 49 4e 43 4c 55 44 45 5f 5a 49 50 56 46 53 20  _INCLUDE_ZIPVFS 
239a0 49 4e 54 45 52 4f 50 5f 4a 53 4f 4e 31 5f 45 58  INTEROP_JSON1_EX
239b0 54 45 4e 53 49 4f 4e 20 5c 0d 0a 20 20 20 20 20  TENSION \..     
239c0 20 20 20 20 20 20 20 49 4e 54 45 52 4f 50 5f 4c         INTEROP_L
239d0 45 47 41 43 59 5f 43 4c 4f 53 45 20 49 4e 54 45  EGACY_CLOSE INTE
239e0 52 4f 50 5f 4c 4f 47 20 49 4e 54 45 52 4f 50 5f  ROP_LOG INTEROP_
239f0 50 45 52 43 45 4e 54 49 4c 45 5f 45 58 54 45 4e  PERCENTILE_EXTEN
23a00 53 49 4f 4e 20 5c 0d 0a 20 20 20 20 20 20 20 20  SION \..        
23a10 20 20 20 20 49 4e 54 45 52 4f 50 5f 52 45 47 45      INTEROP_REGE
23a20 58 50 5f 45 58 54 45 4e 53 49 4f 4e 20 49 4e 54  XP_EXTENSION INT
23a30 45 52 4f 50 5f 54 45 53 54 5f 45 58 54 45 4e 53  EROP_TEST_EXTENS
23a40 49 4f 4e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ION \..         
23a50 20 20 20 49 4e 54 45 52 4f 50 5f 54 4f 54 59 50     INTEROP_TOTYP
23a60 45 5f 45 58 54 45 4e 53 49 4f 4e 20 49 4e 54 45  E_EXTENSION INTE
23a70 52 4f 50 5f 56 49 52 54 55 41 4c 5f 54 41 42 4c  ROP_VIRTUAL_TABL
23a80 45 20 4e 45 54 5f 32 30 20 4e 45 54 5f 33 35 20  E NET_20 NET_35 
23a90 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 4e  \..            N
23aa0 45 54 5f 34 30 20 4e 45 54 5f 34 35 20 4e 45 54  ET_40 NET_45 NET
23ab0 5f 34 35 31 20 4e 45 54 5f 34 35 32 20 4e 45 54  _451 NET_452 NET
23ac0 5f 34 36 20 4e 45 54 5f 34 36 31 20 4e 45 54 5f  _46 NET_461 NET_
23ad0 43 4f 4d 50 41 43 54 5f 32 30 20 5c 0d 0a 20 20  COMPACT_20 \..  
23ae0 20 20 20 20 20 20 20 20 20 20 50 4c 41 54 46 4f            PLATFO
23af0 52 4d 5f 43 4f 4d 50 41 43 54 46 52 41 4d 45 57  RM_COMPACTFRAMEW
23b00 4f 52 4b 20 50 52 45 4c 4f 41 44 5f 4e 41 54 49  ORK PRELOAD_NATI
23b10 56 45 5f 4c 49 42 52 41 52 59 20 52 45 54 41 52  VE_LIBRARY RETAR
23b20 47 45 54 41 42 4c 45 20 5c 0d 0a 20 20 20 20 20  GETABLE \..     
23b30 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 53 54         SQLITE_ST
23b40 41 4e 44 41 52 44 20 54 48 52 4f 57 5f 4f 4e 5f  ANDARD THROW_ON_
23b50 44 49 53 50 4f 53 45 44 20 54 52 41 43 45 20 54  DISPOSED TRACE T
23b60 52 41 43 45 5f 43 4f 4e 4e 45 43 54 49 4f 4e 20  RACE_CONNECTION 
23b70 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 54  \..            T
23b80 52 41 43 45 5f 44 45 54 45 43 54 49 4f 4e 20 54  RACE_DETECTION T
23b90 52 41 43 45 5f 48 41 4e 44 4c 45 20 54 52 41 43  RACE_HANDLE TRAC
23ba0 45 5f 50 52 45 4c 4f 41 44 20 54 52 41 43 45 5f  E_PRELOAD TRACE_
23bb0 53 48 41 52 45 44 20 5c 0d 0a 20 20 20 20 20 20  SHARED \..      
23bc0 20 20 20 20 20 20 54 52 41 43 45 5f 53 54 41 54        TRACE_STAT
23bd0 45 4d 45 4e 54 20 54 52 41 43 45 5f 57 41 52 4e  EMENT TRACE_WARN
23be0 49 4e 47 20 54 52 41 43 4b 5f 4d 45 4d 4f 52 59  ING TRACK_MEMORY
23bf0 5f 42 59 54 45 53 20 5c 0d 0a 20 20 20 20 20 20  _BYTES \..      
23c00 20 20 20 20 20 20 55 53 45 5f 45 4e 54 49 54 59        USE_ENTITY
23c10 5f 46 52 41 4d 45 57 4f 52 4b 5f 36 20 55 53 45  _FRAMEWORK_6 USE
23c20 5f 49 4e 54 45 52 4f 50 5f 44 4c 4c 20 55 53 45  _INTEROP_DLL USE
23c30 5f 50 52 45 50 41 52 45 5f 56 32 20 57 49 4e 44  _PREPARE_V2 WIND
23c40 4f 57 53 5d 20 7b 0d 0a 20 20 20 20 20 20 20 20  OWS] {..        
23c50 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23    #..          #
23c60 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 69 66 20   NOTE: Check if 
23c70 74 68 65 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65  the compile-time
23c80 20 6f 70 74 69 6f 6e 20 69 73 20 6c 69 73 74 65   option is liste
23c90 64 20 69 6e 20 74 68 65 20 6c 69 73 74 20 6f 66  d in the list of
23ca0 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 20 20  ..          #   
23cb0 20 20 20 20 22 64 65 66 69 6e 65 20 63 6f 6e 73      "define cons
23cc0 74 61 6e 74 73 22 20 6b 65 70 74 20 74 72 61 63  tants" kept trac
23cd0 6b 20 6f 66 20 62 79 20 74 68 65 20 6d 61 6e 61  k of by the mana
23ce0 67 65 64 20 61 73 73 65 6d 62 6c 79 2e 0d 0a 20  ged assembly... 
23cf0 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
23d00 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72 53 51        checkForSQ
23d10 4c 69 74 65 44 65 66 69 6e 65 43 6f 6e 73 74 61  LiteDefineConsta
23d20 6e 74 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  nt $::test_chann
23d30 65 6c 20 24 64 65 66 69 6e 65 43 6f 6e 73 74 61  el $defineConsta
23d40 6e 74 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d  nt..        }...
23d50 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
23d60 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68 65 63      # NOTE: Chec
23d70 6b 20 69 66 20 74 68 65 20 53 79 73 74 65 6d 2e  k if the System.
23d80 44 61 74 61 2e 53 51 4c 69 74 65 20 70 72 6f 76  Data.SQLite prov
23d90 69 64 65 72 20 77 61 73 20 63 6f 6d 70 69 6c 65  ider was compile
23da0 64 20 77 69 74 68 0d 0a 20 20 20 20 20 20 20 20  d with..        
23db0 23 20 20 20 20 20 20 20 73 75 70 70 6f 72 74 20  #       support 
23dc0 66 6f 72 20 61 6e 79 20 65 6e 63 72 79 70 74 65  for any encrypte
23dd0 64 20 64 61 74 61 62 61 73 65 73 2e 0d 0a 20 20  d databases...  
23de0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
23df0 20 69 66 20 7b 5b 68 61 76 65 53 51 4c 69 74 65   if {[haveSQLite
23e00 44 65 66 69 6e 65 43 6f 6e 73 74 61 6e 74 20 49  DefineConstant I
23e10 4e 54 45 52 4f 50 5f 43 4f 44 45 43 5d 20 7c 7c  NTEROP_CODEC] ||
23e20 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
23e30 5b 68 61 76 65 53 51 4c 69 74 65 44 65 66 69 6e  [haveSQLiteDefin
23e40 65 43 6f 6e 73 74 61 6e 74 20 49 4e 54 45 52 4f  eConstant INTERO
23e50 50 5f 49 4e 43 4c 55 44 45 5f 53 45 45 5d 7d 20  P_INCLUDE_SEE]} 
23e60 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
23e70 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23    #..          #
23e80 20 4e 4f 54 45 3a 20 59 65 73 2c 20 61 64 64 20   NOTE: Yes, add 
23e90 67 65 6e 65 72 69 63 20 63 6f 6e 73 74 72 61 69  generic constrai
23ea0 6e 74 20 66 6f 72 20 75 73 65 20 62 79 20 74 68  nt for use by th
23eb0 65 20 74 65 73 74 20 73 75 69 74 65 2e 0d 0a 20  e test suite... 
23ec0 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
23ed0 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61        addConstra
23ee0 69 6e 74 20 53 79 73 74 65 6d 2e 44 61 74 61 2e  int System.Data.
23ef0 53 51 4c 69 74 65 2e 45 6e 63 72 79 70 74 69 6f  SQLite.Encryptio
23f00 6e 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  n..        }....
23f10 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
23f20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b     # NOTE: Check
23f30 20 74 68 65 20 63 75 72 72 65 6e 74 20 62 75 69   the current bui
23f40 6c 64 20 79 65 61 72 2e 20 20 42 61 73 69 63 61  ld year.  Basica
23f50 6c 6c 79 2c 20 74 68 69 73 20 69 6e 64 69 63 61  lly, this indica
23f60 74 65 73 0d 0a 20 20 20 20 20 20 20 20 23 20 20  tes..        #  
23f70 20 20 20 20 20 77 68 69 63 68 20 76 65 72 73 69       which versi
23f80 6f 6e 20 6f 66 20 4d 53 42 75 69 6c 64 20 61 6e  on of MSBuild an
23f90 64 2f 6f 72 20 56 69 73 75 61 6c 20 53 74 75 64  d/or Visual Stud
23fa0 69 6f 20 77 61 73 20 75 73 65 64 20 74 6f 0d 0a  io was used to..
23fb0 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
23fc0 63 6f 6d 70 69 6c 65 20 74 68 65 20 61 73 73 65  compile the asse
23fd0 6d 62 6c 79 20 62 69 6e 61 72 69 65 73 20 75 6e  mbly binaries un
23fe0 64 65 72 20 74 65 73 74 2e 0d 0a 20 20 20 20 20  der test...     
23ff0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 74 70     #..        tp
24000 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  uts $::test_chan
24010 6e 65 6c 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  nel \..         
24020 20 20 20 22 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e     "---- checkin
24030 67 20 66 6f 72 20 53 79 73 74 65 6d 2e 44 61 74  g for System.Dat
24040 61 2e 53 51 4c 69 74 65 20 62 75 69 6c 64 20 79  a.SQLite build y
24050 65 61 72 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20  ear... "....    
24060 20 20 20 20 73 65 74 20 79 65 61 72 20 5b 67 65      set year [ge
24070 74 42 75 69 6c 64 59 65 61 72 5d 0d 0a 20 20 20  tBuildYear]..   
24080 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69       addConstrai
24090 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20 62  nt [appendArgs b
240a0 75 69 6c 64 59 65 61 72 2e 20 24 79 65 61 72 5d  uildYear. $year]
240b0 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20  ..        tputs 
240c0 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
240d0 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 22 20 24  [appendArgs \" $
240e0 79 65 61 72 20 5c 22 5c 6e 5d 0d 0a 0d 0a 20 20  year \"\n]....  
240f0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
24100 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 74   # NOTE: Check t
24110 68 65 20 63 75 72 72 65 6e 74 20 62 75 69 6c 64  he current build
24120 20 2e 4e 45 54 20 46 72 61 6d 65 77 6f 72 6b 2e   .NET Framework.
24130 20 20 42 61 73 69 63 61 6c 6c 79 2c 20 74 68 69    Basically, thi
24140 73 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  s..        #    
24150 20 20 20 69 6e 64 69 63 61 74 65 73 20 77 68 69     indicates whi
24160 63 68 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68  ch version of th
24170 65 20 2e 4e 45 54 20 46 72 61 6d 65 77 6f 72 6b  e .NET Framework
24180 20 69 73 20 62 65 69 6e 67 0d 0a 20 20 20 20 20   is being..     
24190 20 20 20 23 20 20 20 20 20 20 20 75 73 65 64 20     #       used 
241a0 62 79 20 74 68 65 20 61 73 73 65 6d 62 6c 79 20  by the assembly 
241b0 62 69 6e 61 72 69 65 73 20 75 6e 64 65 72 20 74  binaries under t
241c0 65 73 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  est...        #.
241d0 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24  .        tputs $
241e0 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5c  ::test_channel \
241f0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 2d  ..            "-
24200 2d 2d 2d 20 63 68 65 63 6b 69 6e 67 20 66 6f 72  --- checking for
24210 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c   System.Data.SQL
24220 69 74 65 20 62 75 69 6c 64 20 2e 4e 45 54 20 46  ite build .NET F
24230 72 61 6d 65 77 6f 72 6b 2e 2e 2e 20 22 0d 0a 0d  ramework... "...
24240 0a 20 20 20 20 20 20 20 20 73 65 74 20 6e 65 74  .        set net
24250 46 78 20 5b 67 65 74 42 75 69 6c 64 4e 65 74 46  Fx [getBuildNetF
24260 78 5d 0d 0a 20 20 20 20 20 20 20 20 61 64 64 43  x]..        addC
24270 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e  onstraint [appen
24280 64 41 72 67 73 20 62 75 69 6c 64 46 72 61 6d 65  dArgs buildFrame
24290 77 6f 72 6b 2e 20 24 6e 65 74 46 78 5d 0d 0a 20  work. $netFx].. 
242a0 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
242b0 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70  test_channel [ap
242c0 70 65 6e 64 41 72 67 73 20 5c 22 20 24 6e 65 74  pendArgs \" $net
242d0 46 78 20 5c 22 5c 6e 5d 0d 0a 0d 0a 20 20 20 20  Fx \"\n]....    
242e0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
242f0 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 74 68 65   NOTE: Check the
24300 20 63 75 72 72 65 6e 74 20 62 75 69 6c 64 20 63   current build c
24310 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e 20 20 54  onfiguration.  T
24320 68 69 73 20 73 68 6f 75 6c 64 20 6e 6f 72 6d 61  his should norma
24330 6c 6c 79 0d 0a 20 20 20 20 20 20 20 20 23 20 20  lly..        #  
24340 20 20 20 20 20 62 65 20 65 69 74 68 65 72 20 22       be either "
24350 44 65 62 75 67 22 20 6f 72 20 22 52 65 6c 65 61  Debug" or "Relea
24360 73 65 22 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  se"...        #.
24370 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24  .        tputs $
24380 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5c  ::test_channel \
24390 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 2d  ..            "-
243a0 2d 2d 2d 20 63 68 65 63 6b 69 6e 67 20 66 6f 72  --- checking for
243b0 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c   System.Data.SQL
243c0 69 74 65 20 62 75 69 6c 64 20 63 6f 6e 66 69 67  ite build config
243d0 75 72 61 74 69 6f 6e 2e 2e 2e 20 22 0d 0a 0d 0a  uration... "....
243e0 20 20 20 20 20 20 20 20 73 65 74 20 63 6f 6e 66          set conf
243f0 69 67 75 72 61 74 69 6f 6e 20 5b 67 65 74 42 75  iguration [getBu
24400 69 6c 64 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e  ildConfiguration
24410 5d 0d 0a 20 20 20 20 20 20 20 20 61 64 64 43 6f  ]..        addCo
24420 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64  nstraint [append
24430 41 72 67 73 20 62 75 69 6c 64 43 6f 6e 66 69 67  Args buildConfig
24440 75 72 61 74 69 6f 6e 2e 20 24 63 6f 6e 66 69 67  uration. $config
24450 75 72 61 74 69 6f 6e 5d 0d 0a 20 20 20 20 20 20  uration]..      
24460 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
24470 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
24480 72 67 73 20 5c 22 20 24 63 6f 6e 66 69 67 75 72  rgs \" $configur
24490 61 74 69 6f 6e 20 5c 22 5c 6e 5d 0d 0a 0d 0a 20  ation \"\n].... 
244a0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
244b0 20 20 23 20 4e 4f 54 45 3a 20 54 72 79 20 74 6f    # NOTE: Try to
244c0 20 73 65 74 75 70 20 61 6e 20 69 6e 74 65 72 72   setup an interr
244d0 75 70 74 20 63 61 6c 6c 62 61 63 6b 20 75 73 69  upt callback usi
244e0 6e 67 20 74 68 65 20 73 63 72 69 70 74 20 64 65  ng the script de
244f0 62 75 67 67 65 72 0d 0a 20 20 20 20 20 20 20 20  bugger..        
24500 23 20 20 20 20 20 20 20 74 68 61 74 20 77 69 6c  #       that wil
24510 6c 20 63 61 6e 63 65 6c 20 61 6c 6c 20 53 51 4c  l cancel all SQL
24520 20 71 75 65 72 69 65 73 20 69 6e 20 70 72 6f 67   queries in prog
24530 72 65 73 73 20 66 6f 72 20 61 6c 6c 20 64 61 74  ress for all dat
24540 61 62 61 73 65 0d 0a 20 20 20 20 20 20 20 20 23  abase..        #
24550 20 20 20 20 20 20 20 63 6f 6e 6e 65 63 74 69 6f         connectio
24560 6e 73 20 6b 6e 6f 77 6e 20 74 6f 20 74 68 69 73  ns known to this
24570 20 69 6e 74 65 72 70 72 65 74 65 72 2e 0d 0a 20   interpreter... 
24580 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
24590 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69    if {![info exi
245a0 73 74 73 20 3a 3a 6e 6f 28 73 71 6c 69 74 65 49  sts ::no(sqliteI
245b0 6e 74 65 72 72 75 70 74 43 61 6c 6c 62 61 63 6b  nterruptCallback
245c0 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  )]} then {..    
245d0 20 20 20 20 20 20 73 65 74 75 70 44 62 49 6e 74        setupDbInt
245e0 65 72 72 75 70 74 43 61 6c 6c 62 61 63 6b 20 24  erruptCallback $
245f0 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 24  ::test_channel $
24600 3a 3a 74 65 73 74 5f 6c 6f 67 0d 0a 20 20 20 20  ::test_log..    
24610 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
24620 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
24630 54 45 3a 20 43 68 65 63 6b 20 66 6f 72 20 74 68  TE: Check for th
24640 65 20 6e 61 74 69 76 65 20 72 75 6e 74 69 6d 65  e native runtime
24650 20 6f 70 74 69 6f 6e 2c 20 77 68 69 63 68 20 77   option, which w
24660 6f 75 6c 64 20 6d 65 61 6e 20 77 65 20 61 72 65  ould mean we are
24670 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
24680 20 20 75 73 69 6e 67 20 74 68 65 20 6d 69 78 65    using the mixe
24690 64 2d 6d 6f 64 65 20 61 73 73 65 6d 62 6c 79 2e  d-mode assembly.
246a0 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
246b0 20 20 20 20 20 63 68 65 63 6b 46 6f 72 52 75 6e       checkForRun
246c0 74 69 6d 65 4f 70 74 69 6f 6e 20 24 3a 3a 74 65  timeOption $::te
246d0 73 74 5f 63 68 61 6e 6e 65 6c 20 6e 61 74 69 76  st_channel nativ
246e0 65 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  e....        #..
246f0 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
24700 43 68 65 63 6b 20 69 66 20 74 68 65 20 74 65 73  Check if the tes
24710 74 20 73 75 69 74 65 20 73 68 6f 75 6c 64 20 63  t suite should c
24720 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20  ount the number 
24730 6f 66 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 0d 0a  of connections..
24740 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
24750 22 6f 70 65 6e 65 64 22 20 61 6e 64 20 22 63 6c  "opened" and "cl
24760 6f 73 65 64 22 20 66 72 6f 6d 20 74 68 65 20 70  osed" from the p
24770 6f 6f 6c 20 77 68 65 6e 20 64 65 74 65 72 6d 69  ool when determi
24780 6e 69 6e 67 20 69 66 20 61 20 74 65 73 74 0d 0a  ning if a test..
24790 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
247a0 70 61 73 73 65 64 2e 20 20 44 69 73 61 62 6c 69  passed.  Disabli
247b0 6e 67 20 74 68 69 73 20 62 65 68 61 76 69 6f 72  ng this behavior
247c0 20 69 73 20 73 6f 6d 65 74 69 6d 65 73 20 6e 65   is sometimes ne
247d0 63 65 73 73 61 72 79 20 28 65 2e 67 2e 0d 0a 20  cessary (e.g... 
247e0 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 64         #       d
247f0 75 72 69 6e 67 20 74 68 65 20 72 65 6c 65 61 73  uring the releas
24800 65 20 74 65 73 74 69 6e 67 20 70 72 6f 63 65 73  e testing proces
24810 73 29 20 62 65 63 61 75 73 65 20 74 68 65 72 65  s) because there
24820 20 61 72 65 20 73 65 76 65 72 61 6c 0d 0a 20 20   are several..  
24830 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74 65        #       te
24840 73 74 73 20 74 68 61 74 20 72 65 6c 79 20 6f 6e  sts that rely on
24850 20 74 68 65 20 22 6f 70 65 6e 65 64 20 66 72 6f   the "opened fro
24860 6d 20 70 6f 6f 6c 22 20 63 6f 75 6e 74 20 62 65  m pool" count be
24870 69 6e 67 20 67 72 65 61 74 65 72 0d 0a 20 20 20  ing greater..   
24880 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68 61       #       tha
24890 6e 20 7a 65 72 6f 2e 20 20 54 68 65 73 65 20 74  n zero.  These t
248a0 65 73 74 73 20 6d 61 79 20 66 61 69 6c 20 64 75  ests may fail du
248b0 65 20 74 6f 20 74 68 65 20 6e 6f 6e 2d 64 65 74  e to the non-det
248c0 65 72 6d 69 6e 69 73 74 69 63 0d 0a 20 20 20 20  erministic..    
248d0 20 20 20 20 23 20 20 20 20 20 20 20 62 65 68 61      #       beha
248e0 76 69 6f 72 20 6f 66 20 74 68 65 20 43 4c 52 20  vior of the CLR 
248f0 47 43 2c 20 65 76 65 6e 20 77 68 65 6e 20 74 68  GC, even when th
24900 65 72 65 20 69 73 20 6e 6f 20 62 75 67 20 69 6e  ere is no bug in
24910 20 74 68 65 20 63 6f 64 65 0d 0a 20 20 20 20 20   the code..     
24920 20 20 20 23 20 20 20 20 20 20 20 62 65 69 6e 67     #       being
24930 20 74 65 73 74 65 64 2e 0d 0a 20 20 20 20 20 20   tested...      
24940 20 20 23 0d 0a 20 20 20 20 20 20 20 20 63 68 65    #..        che
24950 63 6b 46 6f 72 52 75 6e 74 69 6d 65 4f 70 74 69  ckForRuntimeOpti
24960 6f 6e 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  on $::test_chann
24970 65 6c 20 6e 6f 50 6f 6f 6c 43 6f 75 6e 74 73 0d  el noPoolCounts.
24980 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
24990 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68        # NOTE: Ch
249a0 65 63 6b 20 69 66 20 74 68 65 20 74 65 73 74 20  eck if the test 
249b0 73 75 69 74 65 20 73 68 6f 75 6c 64 20 75 73 65  suite should use
249c0 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 6d 6f   shared-cache mo
249d0 64 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  de...        #..
249e0 20 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72          checkFor
249f0 52 75 6e 74 69 6d 65 4f 70 74 69 6f 6e 20 24 3a  RuntimeOption $:
24a00 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 73 68  :test_channel sh
24a10 61 72 65 64 43 61 63 68 65 0d 0a 0d 0a 20 20 20  aredCache....   
24a20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
24a30 23 20 4e 4f 54 45 3a 20 52 65 70 6f 72 74 20 74  # NOTE: Report t
24a40 68 65 20 72 65 73 6f 75 72 63 65 20 75 73 61 67  he resource usag
24a50 65 20 70 72 69 6f 72 20 74 6f 20 72 75 6e 6e 69  e prior to runni
24a60 6e 67 20 61 6e 79 20 74 65 73 74 73 2e 0d 0a 20  ng any tests... 
24a70 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
24a80 20 20 72 65 70 6f 72 74 53 51 4c 69 74 65 52 65    reportSQLiteRe
24a90 73 6f 75 72 63 65 73 20 24 3a 3a 74 65 73 74 5f  sources $::test_
24aa0 63 68 61 6e 6e 65 6c 0d 0a 0d 0a 20 20 20 20 20  channel....     
24ab0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
24ac0 4e 4f 54 45 3a 20 47 72 61 62 20 74 68 65 20 6c  NOTE: Grab the l
24ad0 69 73 74 20 6f 66 20 6e 61 74 69 76 65 20 6d 6f  ist of native mo
24ae0 64 75 6c 65 73 20 66 6f 72 20 74 68 65 20 63 75  dules for the cu
24af0 72 72 65 6e 74 20 70 72 6f 63 65 73 73 20 61 6e  rrent process an
24b00 64 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  d..        #    
24b10 20 20 20 72 65 70 6f 72 74 20 6f 6e 20 74 68 65     report on the
24b20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c   System.Data.SQL
24b30 69 74 65 20 72 65 6c 61 74 65 64 20 6f 6e 65 73  ite related ones
24b40 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
24b50 20 20 20 20 20 20 69 66 20 7b 5b 68 61 76 65 53        if {[haveS
24b60 51 4c 69 74 65 4f 62 6a 65 63 74 43 6f 6d 6d 61  QLiteObjectComma
24b70 6e 64 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  nd]} then {..   
24b80 20 20 20 20 20 20 20 73 65 74 20 6d 6f 64 75 6c         set modul
24b90 65 73 20 5b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b  es [object invok
24ba0 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e \..           
24bb0 20 20 20 53 79 73 74 65 6d 2e 44 69 61 67 6e 6f     System.Diagno
24bc0 73 74 69 63 73 2e 50 72 6f 63 65 73 73 2e 47 65  stics.Process.Ge
24bd0 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 20  tCurrentProcess 
24be0 4d 6f 64 75 6c 65 73 5d 0d 0a 0d 0a 20 20 20 20  Modules]....    
24bf0 20 20 20 20 20 20 6f 62 6a 65 63 74 20 66 6f 72        object for
24c00 65 61 63 68 20 2d 61 6c 69 61 73 20 6d 6f 64 75  each -alias modu
24c10 6c 65 20 24 6d 6f 64 75 6c 65 73 20 7b 0d 0a 20  le $modules {.. 
24c20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
24c30 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45            # NOTE
24c40 3a 20 54 68 65 20 6d 6f 64 75 6c 65 20 66 69 6c  : The module fil
24c50 65 20 6e 61 6d 65 20 68 65 72 65 20 6d 75 73 74  e name here must
24c60 20 62 65 20 6e 6f 72 6d 61 6c 69 7a 65 64 2e 0d   be normalized..
24c70 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a  .            #..
24c80 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20              set 
24c90 66 69 6c 65 4e 61 6d 65 20 5b 66 69 6c 65 20 6e  fileName [file n
24ca0 6f 72 6d 61 6c 69 7a 65 20 5b 24 6d 6f 64 75 6c  ormalize [$modul
24cb0 65 20 46 69 6c 65 4e 61 6d 65 5d 5d 0d 0a 20 20  e FileName]]..  
24cc0 20 20 20 20 20 20 20 20 20 20 73 65 74 20 66 69            set fi
24cd0 6c 65 4e 61 6d 65 4f 6e 6c 79 20 5b 66 69 6c 65  leNameOnly [file
24ce0 20 74 61 69 6c 20 24 66 69 6c 65 4e 61 6d 65 5d   tail $fileName]
24cf0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
24d00 69 66 20 7b 5b 6c 73 65 61 72 63 68 20 2d 65 78  if {[lsearch -ex
24d10 61 63 74 20 2d 6e 6f 63 61 73 65 20 2d 2d 20 5c  act -nocase -- \
24d20 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
24d30 20 20 5b 67 65 74 4e 61 74 69 76 65 4c 69 62 72    [getNativeLibr
24d40 61 72 79 46 69 6c 65 4e 61 6d 65 73 4f 6e 6c 79  aryFileNamesOnly
24d50 5d 20 24 66 69 6c 65 4e 61 6d 65 4f 6e 6c 79 5d  ] $fileNameOnly]
24d60 20 21 3d 20 2d 31 7d 20 74 68 65 6e 20 7b 0d 0a   != -1} then {..
24d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 70                tp
24d80 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  uts $::test_chan
24d90 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
24da0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
24db0 20 20 20 20 20 22 2d 2d 2d 2d 20 66 6f 75 6e 64       "---- found
24dc0 20 6c 6f 61 64 65 64 20 53 51 4c 69 74 65 20 6e   loaded SQLite n
24dd0 61 74 69 76 65 20 6c 69 62 72 61 72 79 20 6d 6f  ative library mo
24de0 64 75 6c 65 3a 20 22 20 5c 0d 0a 20 20 20 20 20  dule: " \..     
24df0 20 20 20 20 20 20 20 20 20 20 20 20 20 24 66 69               $fi
24e00 6c 65 4e 61 6d 65 20 5c 6e 5d 0d 0a 20 20 20 20  leName \n]..    
24e10 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 69 66          } elseif
24e20 20 7b 5b 6c 73 65 61 72 63 68 20 2d 65 78 61 63   {[lsearch -exac
24e30 74 20 2d 6e 6f 63 61 73 65 20 2d 2d 20 5c 0d 0a  t -nocase -- \..
24e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24e50 5b 67 65 74 49 6e 74 65 72 6f 70 41 73 73 65 6d  [getInteropAssem
24e60 62 6c 79 46 69 6c 65 4e 61 6d 65 73 4f 6e 6c 79  blyFileNamesOnly
24e70 5d 20 24 66 69 6c 65 4e 61 6d 65 4f 6e 6c 79 5d  ] $fileNameOnly]
24e80 20 21 3d 20 2d 31 7d 20 74 68 65 6e 20 7b 0d 0a   != -1} then {..
24e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 70                tp
24ea0 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  uts $::test_chan
24eb0 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
24ec0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
24ed0 20 20 20 20 20 22 2d 2d 2d 2d 20 66 6f 75 6e 64       "---- found
24ee0 20 6c 6f 61 64 65 64 20 53 51 4c 69 74 65 20 69   loaded SQLite i
24ef0 6e 74 65 72 6f 70 20 61 73 73 65 6d 62 6c 79 20  nterop assembly 
24f00 6d 6f 64 75 6c 65 3a 20 22 20 5c 0d 0a 20 20 20  module: " \..   
24f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 24                 $
24f20 66 69 6c 65 4e 61 6d 65 20 5c 6e 5d 0d 0a 20 20  fileName \n]..  
24f30 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
24f40 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
24f50 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 63    }....        c
24f60 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20  atch {..        
24f70 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
24f80 63 68 61 6e 6e 65 6c 20 5c 0d 0a 20 20 20 20 20  channel \..     
24f90 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63           "---- c
24fa0 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69  ompile-time opti
24fb0 6f 6e 73 20 66 6f 72 20 53 51 4c 69 74 65 20 63  ons for SQLite c
24fc0 6f 72 65 20 6c 69 62 72 61 72 79 2e 2e 2e 20 22  ore library... "
24fd0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66  ....          if
24fe0 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20   {[catch {..    
24ff0 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69          object i
25000 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f  nvoke -flags +No
25010 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20  nPublic \..     
25020 20 20 20 20 20 20 20 20 20 20 20 53 79 73 74 65             Syste
25030 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 53 51  m.Data.SQLite.SQ
25040 4c 69 74 65 33 20 53 51 4c 69 74 65 43 6f 6d 70  Lite3 SQLiteComp
25050 69 6c 65 4f 70 74 69 6f 6e 73 0d 0a 20 20 20 20  ileOptions..    
25060 20 20 20 20 20 20 7d 20 63 6f 6d 70 69 6c 65 4f        } compileO
25070 70 74 69 6f 6e 73 5d 20 3d 3d 20 30 7d 20 74 68  ptions] == 0} th
25080 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
25090 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
250a0 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
250b0 72 67 73 20 5b 66 6f 72 6d 61 74 4c 69 73 74 20  rgs [formatList 
250c0 5b 6c 73 6f 72 74 20 5c 0d 0a 20 20 20 20 20 20  [lsort \..      
250d0 20 20 20 20 20 20 20 20 20 20 24 63 6f 6d 70 69            $compi
250e0 6c 65 4f 70 74 69 6f 6e 73 5d 20 3c 6e 6f 6e 65  leOptions] <none
250f0 3e 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20  >] \n]..        
25100 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
25110 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
25120 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 75 6e  :test_channel un
25130 6b 6e 6f 77 6e 5c 6e 0d 0a 20 20 20 20 20 20 20  known\n..       
25140 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d     }..        }.
25150 0a 0d 0a 20 20 20 20 20 20 20 20 63 61 74 63 68  ...        catch
25160 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70   {..          tp
25170 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  uts $::test_chan
25180 6e 65 6c 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  nel \..         
25190 20 20 20 20 20 22 2d 2d 2d 2d 20 63 6f 6d 70 69       "---- compi
251a0 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 73 20  le-time options 
251b0 66 6f 72 20 53 51 4c 69 74 65 20 69 6e 74 65 72  for SQLite inter
251c0 6f 70 20 61 73 73 65 6d 62 6c 79 2e 2e 2e 20 22  op assembly... "
251d0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66  ....          if
251e0 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20   {[catch {..    
251f0 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69          object i
25200 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f  nvoke -flags +No
25210 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20  nPublic \..     
25220 20 20 20 20 20 20 20 20 20 20 20 53 79 73 74 65             Syste
25230 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 53 51  m.Data.SQLite.SQ
25240 4c 69 74 65 33 20 49 6e 74 65 72 6f 70 43 6f 6d  Lite3 InteropCom
25250 70 69 6c 65 4f 70 74 69 6f 6e 73 0d 0a 20 20 20  pileOptions..   
25260 20 20 20 20 20 20 20 7d 20 63 6f 6d 70 69 6c 65         } compile
25270 4f 70 74 69 6f 6e 73 5d 20 3d 3d 20 30 7d 20 74  Options] == 0} t
25280 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
25290 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
252a0 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  _channel [append
252b0 41 72 67 73 20 5b 66 6f 72 6d 61 74 4c 69 73 74  Args [formatList
252c0 20 5b 6c 73 6f 72 74 20 5c 0d 0a 20 20 20 20 20   [lsort \..     
252d0 20 20 20 20 20 20 20 20 20 20 20 24 63 6f 6d 70             $comp
252e0 69 6c 65 4f 70 74 69 6f 6e 73 5d 20 3c 6e 6f 6e  ileOptions] <non
252f0 65 3e 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20  e>] \n]..       
25300 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
25310 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
25320 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 75  ::test_channel u
25330 6e 6b 6e 6f 77 6e 5c 6e 0d 0a 20 20 20 20 20 20  nknown\n..      
25340 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d      }..        }
25350 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  ....        #.. 
25360 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53         # NOTE: S
25370 68 6f 77 20 74 68 65 20 61 63 74 69 76 65 20 74  how the active t
25380 65 73 74 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e  est constraints.
25390 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
253a0 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
253b0 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
253c0 6e 64 41 72 67 73 20 22 2d 2d 2d 2d 20 63 6f 6e  ndArgs "---- con
253d0 73 74 72 61 69 6e 74 73 3a 20 22 20 5c 0d 0a 20  straints: " \.. 
253e0 20 20 20 20 20 20 20 20 20 20 20 5b 66 6f 72 6d             [form
253f0 61 74 4c 69 73 74 20 5b 6c 73 6f 72 74 20 5b 67  atList [lsort [g
25400 65 74 43 6f 6e 73 74 72 61 69 6e 74 73 5d 5d 20  etConstraints]] 
25410 3c 6e 6f 6e 65 3e 5d 20 5c 6e 5d 0d 0a 0d 0a 20  <none>] \n].... 
25420 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
25430 20 20 23 20 4e 4f 54 45 3a 20 53 61 76 65 20 74    # NOTE: Save t
25440 68 65 20 74 65 73 74 20 63 6f 6e 73 74 72 61 69  he test constrai
25450 6e 74 73 20 66 6f 72 20 75 73 65 20 62 79 20 74  nts for use by t
25460 68 72 65 61 64 73 20 63 72 65 61 74 65 64 20 69  hreads created i
25470 6e 20 74 68 69 73 0d 0a 20 20 20 20 20 20 20 20  n this..        
25480 23 20 20 20 20 20 20 20 61 70 70 6c 69 63 61 74  #       applicat
25490 69 6f 6e 20 64 6f 6d 61 69 6e 2e 20 20 54 68 69  ion domain.  Thi
254a0 73 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 62  s is necessary b
254b0 65 63 61 75 73 65 20 61 6c 6c 20 74 68 65 20 45  ecause all the E
254c0 61 67 6c 65 0d 0a 20 20 20 20 20 20 20 20 23 20  agle..        # 
254d0 20 20 20 20 20 20 22 74 65 73 74 20 63 6f 6e 74        "test cont
254e0 65 78 74 22 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  ext" information
254f0 20 69 73 20 70 65 72 2d 74 68 72 65 61 64 2e 0d   is per-thread..
25500 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
25510 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65      if {![info e
25520 78 69 73 74 73 20 3a 3a 74 65 73 74 5f 63 6f 6e  xists ::test_con
25530 73 74 72 61 69 6e 74 73 5d 7d 20 74 68 65 6e 20  straints]} then 
25540 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74  {..          set
25550 20 3a 3a 74 65 73 74 5f 63 6f 6e 73 74 72 61 69   ::test_constrai
25560 6e 74 73 20 24 3a 3a 65 61 67 6c 65 5f 74 65 73  nts $::eagle_tes
25570 74 73 28 63 6f 6e 73 74 72 61 69 6e 74 73 29 0d  ts(constraints).
25580 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  .        }....  
25590 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
255a0 20 23 20 4e 4f 54 45 3a 20 4c 6f 61 64 20 74 68   # NOTE: Load th
255b0 65 20 22 61 66 74 65 72 2d 63 6f 6e 73 74 72 61  e "after-constra
255c0 69 6e 74 73 22 20 63 75 73 74 6f 6d 20 70 65 72  ints" custom per
255d0 2d 75 73 65 72 20 61 6e 64 2f 6f 72 20 70 65 72  -user and/or per
255e0 2d 68 6f 73 74 0d 0a 20 20 20 20 20 20 20 20 23  -host..        #
255f0 20 20 20 20 20 20 20 74 65 73 74 20 73 65 74 74         test sett
25600 69 6e 67 73 20 6e 6f 77 2e 0d 0a 20 20 20 20 20  ings now...     
25610 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 75 70     #..        up
25620 6c 65 76 65 6c 20 31 20 5b 6c 69 73 74 20 6c 6f  level 1 [list lo
25630 61 64 53 51 4c 69 74 65 54 65 73 74 53 65 74 74  adSQLiteTestSett
25640 69 6e 67 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  ings $::test_cha
25650 6e 6e 65 6c 20 2e 61 66 74 65 72 5d 0d 0a 0d 0a  nnel .after]....
25660 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
25670 20 20 20 23 20 4e 4f 54 45 3a 20 49 66 20 6e 65     # NOTE: If ne
25680 63 65 73 73 61 72 79 2c 20 65 6e 61 62 6c 65 20  cessary, enable 
25690 73 68 61 72 65 64 2d 63 61 63 68 65 20 6d 6f 64  shared-cache mod
256a0 65 20 6e 6f 77 2e 0d 0a 20 20 20 20 20 20 20 20  e now...        
256b0 23 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b  #..        if {[
256c0 68 61 73 52 75 6e 74 69 6d 65 4f 70 74 69 6f 6e  hasRuntimeOption
256d0 20 73 68 61 72 65 64 43 61 63 68 65 5d 7d 20 74   sharedCache]} t
256e0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
256f0 20 65 6e 61 62 6c 65 53 68 61 72 65 64 43 61 63   enableSharedCac
25700 68 65 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  he $::test_chann
25710 65 6c 20 74 72 75 65 0d 0a 20 20 20 20 20 20 20  el true..       
25720 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d   }....        #.
25730 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
25740 20 53 68 6f 77 20 77 68 65 6e 20 6f 75 72 20 74   Show when our t
25750 65 73 74 73 20 61 63 74 75 61 6c 6c 79 20 62 65  ests actually be
25760 67 61 6e 20 28 6e 6f 77 29 2e 0d 0a 20 20 20 20  gan (now)...    
25770 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 74      #..        t
25780 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
25790 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
257a0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
257b0 22 2d 2d 2d 2d 20 53 79 73 74 65 6d 2e 44 61 74  "---- System.Dat
257c0 61 2e 53 51 4c 69 74 65 20 74 65 73 74 73 20 62  a.SQLite tests b
257d0 65 67 61 6e 20 61 74 20 22 20 5c 0d 0a 20 20 20  egan at " \..   
257e0 20 20 20 20 20 20 20 20 20 5b 63 6c 6f 63 6b 20           [clock 
257f0 66 6f 72 6d 61 74 20 5b 63 6c 6f 63 6b 20 73 65  format [clock se
25800 63 6f 6e 64 73 5d 5d 20 5c 6e 5d 0d 0a 20 20 20  conds]] \n]..   
25810 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a     }..    }.....
25820 20 20 20 20 70 72 6f 63 20 72 75 6e 53 51 4c 69      proc runSQLi
25830 74 65 54 65 73 74 46 69 6c 65 73 50 72 6f 6c 6f  teTestFilesProlo
25840 67 75 65 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20  gue {} {..      
25850 75 70 6c 65 76 65 6c 20 31 20 7b 0d 0a 20 20 20  uplevel 1 {..   
25860 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
25870 23 20 4e 4f 54 45 3a 20 53 65 74 75 70 20 74 68  # NOTE: Setup th
25880 65 20 76 61 72 69 61 62 6c 65 73 20 74 68 61 74  e variables that
25890 20 72 65 66 65 72 20 74 6f 20 74 68 65 20 76 61   refer to the va
258a0 72 69 6f 75 73 20 6e 6f 6e 2d 64 61 74 61 20 66  rious non-data f
258b0 69 6c 65 73 0d 0a 20 20 20 20 20 20 20 20 23 20  iles..        # 
258c0 20 20 20 20 20 20 72 65 71 75 69 72 65 64 20 62        required b
258d0 79 20 74 68 65 20 74 65 73 74 73 20 69 6e 20 74  y the tests in t
258e0 68 69 73 20 66 69 6c 65 2e 0d 0a 20 20 20 20 20  his file...     
258f0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 73 65     #..        se
25900 74 20 65 6e 74 69 74 79 46 72 61 6d 65 77 6f 72  t entityFramewor
25910 6b 44 6c 6c 46 69 6c 65 20 5c 0d 0a 20 20 20 20  kDllFile \..    
25920 20 20 20 20 20 20 20 20 5b 67 65 74 42 75 69 6c          [getBuil
25930 64 46 69 6c 65 4e 61 6d 65 20 45 6e 74 69 74 79  dFileName Entity
25940 46 72 61 6d 65 77 6f 72 6b 2e 64 6c 6c 5d 0d 0a  Framework.dll]..
25950 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 69 6e  ..        set in
25960 73 74 61 6c 6c 65 72 45 78 65 46 69 6c 65 20 5b  stallerExeFile [
25970 67 65 74 42 75 69 6c 64 46 69 6c 65 4e 61 6d 65  getBuildFileName
25980 20 49 6e 73 74 61 6c 6c 65 72 2e 65 78 65 5d 0d   Installer.exe].
25990 0a 20 20 20 20 20 20 20 20 73 65 74 20 73 71 6c  .        set sql
259a0 69 74 65 44 65 73 69 67 6e 65 72 44 6c 6c 46 69  iteDesignerDllFi
259b0 6c 65 20 5b 67 65 74 42 75 69 6c 64 46 69 6c 65  le [getBuildFile
259c0 4e 61 6d 65 20 53 51 4c 69 74 65 2e 44 65 73 69  Name SQLite.Desi
259d0 67 6e 65 72 2e 64 6c 6c 5d 0d 0a 0d 0a 20 20 20  gner.dll]....   
259e0 20 20 20 20 20 73 65 74 20 73 79 73 74 65 6d 44       set systemD
259f0 61 74 61 53 51 4c 69 74 65 44 6c 6c 46 69 6c 65  ataSQLiteDllFile
25a00 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
25a10 5b 67 65 74 42 75 69 6c 64 46 69 6c 65 4e 61 6d  [getBuildFileNam
25a20 65 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51  e System.Data.SQ
25a30 4c 69 74 65 2e 64 6c 6c 5d 0d 0a 0d 0a 20 20 20  Lite.dll]....   
25a40 20 20 20 20 20 73 65 74 20 73 79 73 74 65 6d 44       set systemD
25a50 61 74 61 53 51 4c 69 74 65 4c 69 6e 71 44 6c 6c  ataSQLiteLinqDll
25a60 46 69 6c 65 20 5c 0d 0a 20 20 20 20 20 20 20 20  File \..        
25a70 20 20 20 20 5b 67 65 74 42 75 69 6c 64 46 69 6c      [getBuildFil
25a80 65 4e 61 6d 65 20 53 79 73 74 65 6d 2e 44 61 74  eName System.Dat
25a90 61 2e 53 51 4c 69 74 65 2e 4c 69 6e 71 2e 64 6c  a.SQLite.Linq.dl
25aa0 6c 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 73 65  l]....        se
25ab0 74 20 73 79 73 74 65 6d 44 61 74 61 53 51 4c 69  t systemDataSQLi
25ac0 74 65 45 66 36 44 6c 6c 46 69 6c 65 20 5c 0d 0a  teEf6DllFile \..
25ad0 20 20 20 20 20 20 20 20 20 20 20 20 5b 67 65 74              [get
25ae0 42 75 69 6c 64 46 69 6c 65 4e 61 6d 65 20 53 79  BuildFileName Sy
25af0 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
25b00 2e 45 46 36 2e 64 6c 6c 5d 0d 0a 0d 0a 20 20 20  .EF6.dll]....   
25b10 20 20 20 20 20 73 65 74 20 74 65 73 74 45 78 65       set testExe
25b20 46 69 6c 65 20 5b 67 65 74 42 75 69 6c 64 46 69  File [getBuildFi
25b30 6c 65 4e 61 6d 65 20 74 65 73 74 2e 65 78 65 5d  leName test.exe]
25b40 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 74 65  ..        set te
25b50 73 74 4c 69 6e 71 45 78 65 46 69 6c 65 20 5b 67  stLinqExeFile [g
25b60 65 74 42 75 69 6c 64 46 69 6c 65 4e 61 6d 65 20  etBuildFileName 
25b70 74 65 73 74 6c 69 6e 71 2e 65 78 65 5d 0d 0a 20  testlinq.exe].. 
25b80 20 20 20 20 20 20 20 73 65 74 20 74 65 73 74 45         set testE
25b90 66 36 45 78 65 46 69 6c 65 20 5b 67 65 74 42 75  f6ExeFile [getBu
25ba0 69 6c 64 46 69 6c 65 4e 61 6d 65 20 74 65 73 74  ildFileName test
25bb0 65 66 36 2e 65 78 65 5d 0d 0a 0d 0a 20 20 20 20  ef6.exe]....    
25bc0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
25bd0 20 4e 4f 54 45 3a 20 53 65 74 75 70 20 74 68 65   NOTE: Setup the
25be0 20 76 61 72 69 61 62 6c 65 73 20 74 68 61 74 20   variables that 
25bf0 72 65 66 65 72 20 74 6f 20 74 68 65 20 76 61 72  refer to the var
25c00 69 6f 75 73 20 64 61 74 61 20 66 69 6c 65 73 0d  ious data files.
25c10 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
25c20 20 72 65 71 75 69 72 65 64 20 62 79 20 74 68 65   required by the
25c30 20 74 65 73 74 73 20 69 6e 20 74 68 69 73 20 66   tests in this f
25c40 69 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  ile...        #.
25c50 0a 20 20 20 20 20 20 20 20 73 65 74 20 74 65 73  .        set tes
25c60 74 4c 69 6e 71 4f 75 74 46 69 6c 65 20 5b 66 69  tLinqOutFile [fi
25c70 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65 20 5b 66  le nativename [f
25c80 69 6c 65 20 6a 6f 69 6e 20 5c 0d 0a 20 20 20 20  ile join \..    
25c90 20 20 20 20 20 20 20 20 5b 67 65 74 53 51 4c 69          [getSQLi
25ca0 74 65 54 65 73 74 44 61 74 61 50 61 74 68 5d 20  teTestDataPath] 
25cb0 74 65 73 74 6c 69 6e 71 2e 6f 75 74 5d 5d 0d 0a  testlinq.out]]..
25cc0 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 6e 6f  ..        set no
25cd0 72 74 68 77 69 6e 64 45 66 44 62 46 69 6c 65 20  rthwindEfDbFile 
25ce0 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65  [file nativename
25cf0 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5c 0d 0a 20   [file join \.. 
25d00 20 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65             [file
25d10 20 64 69 72 6e 61 6d 65 20 5b 66 69 6c 65 20 64   dirname [file d
25d20 69 72 6e 61 6d 65 20 5b 67 65 74 53 51 4c 69 74  irname [getSQLit
25d30 65 54 65 73 74 44 61 74 61 50 61 74 68 5d 5d 5d  eTestDataPath]]]
25d40 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
25d50 74 65 73 74 6c 69 6e 71 20 6e 6f 72 74 68 77 69  testlinq northwi
25d60 6e 64 45 46 2e 64 62 5d 5d 0d 0a 0d 0a 20 20 20  ndEF.db]]....   
25d70 20 20 20 20 20 73 65 74 20 6e 6f 6e 57 61 6c 44       set nonWalD
25d80 62 46 69 6c 65 20 5b 66 69 6c 65 20 6e 61 74 69  bFile [file nati
25d90 76 65 6e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69  vename [file joi
25da0 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n \..           
25db0 20 5b 67 65 74 53 51 4c 69 74 65 54 65 73 74 44   [getSQLiteTestD
25dc0 61 74 61 50 61 74 68 5d 20 6e 6f 6e 57 61 6c 2e  ataPath] nonWal.
25dd0 64 62 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  db]]....        
25de0 73 65 74 20 77 61 6c 44 62 46 69 6c 65 20 5b 66  set walDbFile [f
25df0 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65 20 5b  ile nativename [
25e00 66 69 6c 65 20 6a 6f 69 6e 20 5c 0d 0a 20 20 20  file join \..   
25e10 20 20 20 20 20 20 20 20 20 5b 67 65 74 53 51 4c           [getSQL
25e20 69 74 65 54 65 73 74 44 61 74 61 50 61 74 68 5d  iteTestDataPath]
25e30 20 77 61 6c 2e 64 62 5d 5d 0d 0a 0d 0a 20 20 20   wal.db]]....   
25e40 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
25e50 23 20 4e 4f 54 45 3a 20 54 68 65 20 76 61 72 69  # NOTE: The vari
25e60 6f 75 73 20 69 6e 73 74 61 6c 6c 2f 75 6e 69 6e  ous install/unin
25e70 73 74 61 6c 6c 20 6c 6f 67 20 66 69 6c 65 73 20  stall log files 
25e80 75 73 65 64 20 74 6f 20 74 65 73 74 20 74 68 65  used to test the
25e90 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
25ea0 20 20 64 65 73 69 67 6e 2d 74 69 6d 65 20 63 6f    design-time co
25eb0 6d 70 6f 6e 65 6e 74 20 69 6e 73 74 61 6c 6c 65  mponent installe
25ec0 72 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  r...        #.. 
25ed0 20 20 20 20 20 20 20 73 65 74 20 74 65 73 74 49         set testI
25ee0 6e 73 74 61 6c 6c 56 73 32 30 30 35 4c 6f 67 46  nstallVs2005LogF
25ef0 69 6c 65 20 5b 66 69 6c 65 20 6e 61 74 69 76 65  ile [file native
25f00 6e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20  name [file join 
25f10 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b  \..            [
25f20 67 65 74 53 51 4c 69 74 65 54 65 73 74 44 61 74  getSQLiteTestDat
25f30 61 50 61 74 68 5d 20 49 6e 73 74 61 6c 6c 65 72  aPath] Installer
25f40 5f 54 65 73 74 5f 56 73 32 30 30 35 2e 6c 6f 67  _Test_Vs2005.log
25f50 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 73 65  ]]....        se
25f60 74 20 74 65 73 74 49 6e 73 74 61 6c 6c 56 73 32  t testInstallVs2
25f70 30 30 38 4c 6f 67 46 69 6c 65 20 5b 66 69 6c 65  008LogFile [file
25f80 20 6e 61 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c   nativename [fil
25f90 65 20 6a 6f 69 6e 20 5c 0d 0a 20 20 20 20 20 20  e join \..      
25fa0 20 20 20 20 20 20 5b 67 65 74 53 51 4c 69 74 65        [getSQLite
25fb0 54 65 73 74 44 61 74 61 50 61 74 68 5d 20 49 6e  TestDataPath] In
25fc0 73 74 61 6c 6c 65 72 5f 54 65 73 74 5f 56 73 32  staller_Test_Vs2
25fd0 30 30 38 2e 6c 6f 67 5d 5d 0d 0a 0d 0a 20 20 20  008.log]]....   
25fe0 20 20 20 20 20 73 65 74 20 74 65 73 74 49 6e 73       set testIns
25ff0 74 61 6c 6c 56 73 32 30 31 30 4c 6f 67 46 69 6c  tallVs2010LogFil
26000 65 20 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e 61  e [file nativena
26010 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5c 0d  me [file join \.
26020 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 67 65  .            [ge
26030 74 53 51 4c 69 74 65 54 65 73 74 44 61 74 61 50  tSQLiteTestDataP
26040 61 74 68 5d 20 49 6e 73 74 61 6c 6c 65 72 5f 54  ath] Installer_T
26050 65 73 74 5f 56 73 32 30 31 30 2e 6c 6f 67 5d 5d  est_Vs2010.log]]
26060 0d 0a 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20  ....        set 
26070 74 65 73 74 49 6e 73 74 61 6c 6c 56 73 32 30 31  testInstallVs201
26080 32 4c 6f 67 46 69 6c 65 20 5b 66 69 6c 65 20 6e  2LogFile [file n
26090 61 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c 65 20  ativename [file 
260a0 6a 6f 69 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20  join \..        
260b0 20 20 20 20 5b 67 65 74 53 51 4c 69 74 65 54 65      [getSQLiteTe
260c0 73 74 44 61 74 61 50 61 74 68 5d 20 49 6e 73 74  stDataPath] Inst
260d0 61 6c 6c 65 72 5f 54 65 73 74 5f 56 73 32 30 31  aller_Test_Vs201
260e0 32 2e 6c 6f 67 5d 5d 0d 0a 0d 0a 20 20 20 20 20  2.log]]....     
260f0 20 20 20 73 65 74 20 74 65 73 74 49 6e 73 74 61     set testInsta
26100 6c 6c 56 73 32 30 31 33 4c 6f 67 46 69 6c 65 20  llVs2013LogFile 
26110 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65  [file nativename
26120 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5c 0d 0a 20   [file join \.. 
26130 20 20 20 20 20 20 20 20 20 20 20 5b 67 65 74 53             [getS
26140 51 4c 69 74 65 54 65 73 74 44 61 74 61 50 61 74  QLiteTestDataPat
26150 68 5d 20 49 6e 73 74 61 6c 6c 65 72 5f 54 65 73  h] Installer_Tes
26160 74 5f 56 73 32 30 31 33 2e 6c 6f 67 5d 5d 0d 0a  t_Vs2013.log]]..
26170 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 74 65  ..        set te
26180 73 74 49 6e 73 74 61 6c 6c 56 73 32 30 31 35 4c  stInstallVs2015L
26190 6f 67 46 69 6c 65 20 5b 66 69 6c 65 20 6e 61 74  ogFile [file nat
261a0 69 76 65 6e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f  ivename [file jo
261b0 69 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  in \..          
261c0 20 20 5b 67 65 74 53 51 4c 69 74 65 54 65 73 74    [getSQLiteTest
261d0 44 61 74 61 50 61 74 68 5d 20 49 6e 73 74 61 6c  DataPath] Instal
261e0 6c 65 72 5f 54 65 73 74 5f 56 73 32 30 31 35 2e  ler_Test_Vs2015.
261f0 6c 6f 67 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  log]]....       
26200 20 73 65 74 20 74 65 73 74 55 6e 69 6e 73 74 61   set testUninsta
26210 6c 6c 56 73 32 30 30 35 4c 6f 67 46 69 6c 65 20  llVs2005LogFile 
26220 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65  [file nativename
26230 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5c 0d 0a 20   [file join \.. 
26240 20 20 20 20 20 20 20 20 20 20 20 5b 67 65 74 53             [getS
26250 51 4c 69 74 65 54 65 73 74 44 61 74 61 50 61 74  QLiteTestDataPat
26260 68 5d 20 55 6e 69 6e 73 74 61 6c 6c 65 72 5f 54  h] Uninstaller_T
26270 65 73 74 5f 56 73 32 30 30 35 2e 6c 6f 67 5d 5d  est_Vs2005.log]]
26280 0d 0a 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20  ....        set 
26290 74 65 73 74 55 6e 69 6e 73 74 61 6c 6c 56 73 32  testUninstallVs2
262a0 30 30 38 4c 6f 67 46 69 6c 65 20 5b 66 69 6c 65  008LogFile [file
262b0 20 6e 61 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c   nativename [fil
262c0 65 20 6a 6f 69 6e 20 5c 0d 0a 20 20 20 20 20 20  e join \..      
262d0 20 20 20 20 20 20 5b 67 65 74 53 51 4c 69 74 65        [getSQLite
262e0 54 65 73 74 44 61 74 61 50 61 74 68 5d 20 55 6e  TestDataPath] Un
262f0 69 6e 73 74 61 6c 6c 65 72 5f 54 65 73 74 5f 56  installer_Test_V
26300 73 32 30 30 38 2e 6c 6f 67 5d 5d 0d 0a 0d 0a 20  s2008.log]].... 
26310 20 20 20 20 20 20 20 73 65 74 20 74 65 73 74 55         set testU
26320 6e 69 6e 73 74 61 6c 6c 56 73 32 30 31 30 4c 6f  ninstallVs2010Lo
26330 67 46 69 6c 65 20 5b 66 69 6c 65 20 6e 61 74 69  gFile [file nati
26340 76 65 6e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69  vename [file joi
26350 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n \..           
26360 20 5b 67 65 74 53 51 4c 69 74 65 54 65 73 74 44   [getSQLiteTestD
26370 61 74 61 50 61 74 68 5d 20 55 6e 69 6e 73 74 61  ataPath] Uninsta
26380 6c 6c 65 72 5f 54 65 73 74 5f 56 73 32 30 31 30  ller_Test_Vs2010
26390 2e 6c 6f 67 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20  .log]]....      
263a0 20 20 73 65 74 20 74 65 73 74 55 6e 69 6e 73 74    set testUninst
263b0 61 6c 6c 56 73 32 30 31 32 4c 6f 67 46 69 6c 65  allVs2012LogFile
263c0 20 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d   [file nativenam
263d0 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5c 0d 0a  e [file join \..
263e0 20 20 20 20 20 20 20 20 20 20 20 20 5b 67 65 74              [get
263f0 53 51 4c 69 74 65 54 65 73 74 44 61 74 61 50 61  SQLiteTestDataPa
26400 74 68 5d 20 55 6e 69 6e 73 74 61 6c 6c 65 72 5f  th] Uninstaller_
26410 54 65 73 74 5f 56 73 32 30 31 32 2e 6c 6f 67 5d  Test_Vs2012.log]
26420 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 73 65 74  ]....        set
26430 20 74 65 73 74 55 6e 69 6e 73 74 61 6c 6c 56 73   testUninstallVs
26440 32 30 31 33 4c 6f 67 46 69 6c 65 20 5b 66 69 6c  2013LogFile [fil
26450 65 20 6e 61 74 69 76 65 6e 61 6d 65 20 5b 66 69  e nativename [fi
26460 6c 65 20 6a 6f 69 6e 20 5c 0d 0a 20 20 20 20 20  le join \..     
26470 20 20 20 20 20 20 20 5b 67 65 74 53 51 4c 69 74         [getSQLit
26480 65 54 65 73 74 44 61 74 61 50 61 74 68 5d 20 55  eTestDataPath] U
26490 6e 69 6e 73 74 61 6c 6c 65 72 5f 54 65 73 74 5f  ninstaller_Test_
264a0 56 73 32 30 31 33 2e 6c 6f 67 5d 5d 0d 0a 0d 0a  Vs2013.log]]....
264b0 20 20 20 20 20 20 20 20 73 65 74 20 74 65 73 74          set test
264c0 55 6e 69 6e 73 74 61 6c 6c 56 73 32 30 31 35 4c  UninstallVs2015L
264d0 6f 67 46 69 6c 65 20 5b 66 69 6c 65 20 6e 61 74  ogFile [file nat
264e0 69 76 65 6e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f  ivename [file jo
264f0 69 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  in \..          
26500 20 20 5b 67 65 74 53 51 4c 69 74 65 54 65 73 74    [getSQLiteTest
26510 44 61 74 61 50 61 74 68 5d 20 55 6e 69 6e 73 74  DataPath] Uninst
26520 61 6c 6c 65 72 5f 54 65 73 74 5f 56 73 32 30 31  aller_Test_Vs201
26530 35 2e 6c 6f 67 5d 5d 0d 0a 0d 0a 20 20 20 20 20  5.log]]....     
26540 20 20 20 23 23 23 23 23 23 23 23 23 23 23 23 23     #############
26550 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
26560 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
26570 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
26580 23 23 23 23 23 23 23 23 23 23 0d 0a 0d 0a 20 20  ##########....  
26590 20 20 20 20 20 20 69 66 20 7b 21 5b 68 61 76 65        if {![have
265a0 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65  Constraint [appe
265b0 6e 64 41 72 67 73 20 66 69 6c 65 5f 20 5c 0d 0a  ndArgs file_ \..
265c0 20 20 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c              [fil
265d0 65 20 74 61 69 6c 20 24 65 6e 74 69 74 79 46 72  e tail $entityFr
265e0 61 6d 65 77 6f 72 6b 44 6c 6c 46 69 6c 65 5d 5d  ameworkDllFile]]
265f0 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
26600 20 20 20 20 20 63 68 65 63 6b 46 6f 72 46 69 6c       checkForFil
26610 65 20 24 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  e $test_channel 
26620 24 65 6e 74 69 74 79 46 72 61 6d 65 77 6f 72 6b  $entityFramework
26630 44 6c 6c 46 69 6c 65 0d 0a 20 20 20 20 20 20 20  DllFile..       
26640 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66   }....        if
26650 20 7b 21 5b 68 61 76 65 43 6f 6e 73 74 72 61 69   {![haveConstrai
26660 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20 66  nt [appendArgs f
26670 69 6c 65 5f 20 5c 0d 0a 20 20 20 20 20 20 20 20  ile_ \..        
26680 20 20 20 20 5b 66 69 6c 65 20 74 61 69 6c 20 24      [file tail $
26690 69 6e 73 74 61 6c 6c 65 72 45 78 65 46 69 6c 65  installerExeFile
266a0 5d 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  ]]]} then {..   
266b0 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72 46         checkForF
266c0 69 6c 65 20 24 74 65 73 74 5f 63 68 61 6e 6e 65  ile $test_channe
266d0 6c 20 24 69 6e 73 74 61 6c 6c 65 72 45 78 65 46  l $installerExeF
266e0 69 6c 65 20 49 6e 73 74 61 6c 6c 65 72 2e 65 78  ile Installer.ex
266f0 65 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  e..        }....
26700 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 68 61          if {![ha
26710 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70  veConstraint [ap
26720 70 65 6e 64 41 72 67 73 20 66 69 6c 65 5f 20 5c  pendArgs file_ \
26730 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 66  ..            [f
26740 69 6c 65 20 74 61 69 6c 20 24 73 71 6c 69 74 65  ile tail $sqlite
26750 44 65 73 69 67 6e 65 72 44 6c 6c 46 69 6c 65 5d  DesignerDllFile]
26760 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  ]]} then {..    
26770 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72 46 69        checkForFi
26780 6c 65 20 24 74 65 73 74 5f 63 68 61 6e 6e 65 6c  le $test_channel
26790 20 24 73 71 6c 69 74 65 44 65 73 69 67 6e 65 72   $sqliteDesigner
267a0 44 6c 6c 46 69 6c 65 0d 0a 20 20 20 20 20 20 20  DllFile..       
267b0 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66   }....        if
267c0 20 7b 21 5b 68 61 76 65 43 6f 6e 73 74 72 61 69   {![haveConstrai
267d0 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20 66  nt [appendArgs f
267e0 69 6c 65 5f 20 5c 0d 0a 20 20 20 20 20 20 20 20  ile_ \..        
267f0 20 20 20 20 5b 66 69 6c 65 20 74 61 69 6c 20 24      [file tail $
26800 73 79 73 74 65 6d 44 61 74 61 53 51 4c 69 74 65  systemDataSQLite
26810 44 6c 6c 46 69 6c 65 5d 5d 5d 7d 20 74 68 65 6e  DllFile]]]} then
26820 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 63 68   {..          ch
26830 65 63 6b 46 6f 72 46 69 6c 65 20 24 74 65 73 74  eckForFile $test
26840 5f 63 68 61 6e 6e 65 6c 20 24 73 79 73 74 65 6d  _channel $system
26850 44 61 74 61 53 51 4c 69 74 65 44 6c 6c 46 69 6c  DataSQLiteDllFil
26860 65 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  e..        }....
26870 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 68 61          if {![ha
26880 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70  veConstraint [ap
26890 70 65 6e 64 41 72 67 73 20 66 69 6c 65 5f 20 5c  pendArgs file_ \
268a0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 66  ..            [f
268b0 69 6c 65 20 74 61 69 6c 20 24 73 79 73 74 65 6d  ile tail $system
268c0 44 61 74 61 53 51 4c 69 74 65 4c 69 6e 71 44 6c  DataSQLiteLinqDl
268d0 6c 46 69 6c 65 5d 5d 5d 7d 20 74 68 65 6e 20 7b  lFile]]]} then {
268e0 0d 0a 20 20 20 20 20 20 20 20 20 20 63 68 65 63  ..          chec
268f0 6b 46 6f 72 46 69 6c 65 20 24 74 65 73 74 5f 63  kForFile $test_c
26900 68 61 6e 6e 65 6c 20 24 73 79 73 74 65 6d 44 61  hannel $systemDa
26910 74 61 53 51 4c 69 74 65 4c 69 6e 71 44 6c 6c 46  taSQLiteLinqDllF
26920 69 6c 65 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  ile..        }..
26930 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b  ..        if {![
26940 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b  haveConstraint [
26950 61 70 70 65 6e 64 41 72 67 73 20 66 69 6c 65 5f  appendArgs file_
26960 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
26970 5b 66 69 6c 65 20 74 61 69 6c 20 24 73 79 73 74  [file tail $syst
26980 65 6d 44 61 74 61 53 51 4c 69 74 65 45 66 36 44  emDataSQLiteEf6D
26990 6c 6c 46 69 6c 65 5d 5d 5d 7d 20 74 68 65 6e 20  llFile]]]} then 
269a0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 63 68 65  {..          che
269b0 63 6b 46 6f 72 46 69 6c 65 20 24 74 65 73 74 5f  ckForFile $test_
269c0 63 68 61 6e 6e 65 6c 20 24 73 79 73 74 65 6d 44  channel $systemD
269d0 61 74 61 53 51 4c 69 74 65 45 66 36 44 6c 6c 46  ataSQLiteEf6DllF
269e0 69 6c 65 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  ile..        }..
269f0 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b  ..        if {![
26a00 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b  haveConstraint [
26a10 61 70 70 65 6e 64 41 72 67 73 20 66 69 6c 65 5f  appendArgs file_
26a20 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
26a30 5b 66 69 6c 65 20 74 61 69 6c 20 24 74 65 73 74  [file tail $test
26a40 45 78 65 46 69 6c 65 5d 5d 5d 7d 20 74 68 65 6e  ExeFile]]]} then
26a50 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 63 68   {..          ch
26a60 65 63 6b 46 6f 72 46 69 6c 65 20 24 74 65 73 74  eckForFile $test
26a70 5f 63 68 61 6e 6e 65 6c 20 24 74 65 73 74 45 78  _channel $testEx
26a80 65 46 69 6c 65 20 74 65 73 74 2e 65 78 65 0d 0a  eFile test.exe..
26a90 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
26aa0 20 20 20 20 20 69 66 20 7b 21 5b 68 61 76 65 43       if {![haveC
26ab0 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e  onstraint [appen
26ac0 64 41 72 67 73 20 66 69 6c 65 5f 20 5c 0d 0a 20  dArgs file_ \.. 
26ad0 20 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65             [file
26ae0 20 74 61 69 6c 20 24 74 65 73 74 4c 69 6e 71 45   tail $testLinqE
26af0 78 65 46 69 6c 65 5d 5d 5d 7d 20 74 68 65 6e 20  xeFile]]]} then 
26b00 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 63 68 65  {..          che
26b10 63 6b 46 6f 72 46 69 6c 65 20 24 74 65 73 74 5f  ckForFile $test_
26b20 63 68 61 6e 6e 65 6c 20 24 74 65 73 74 4c 69 6e  channel $testLin
26b30 71 45 78 65 46 69 6c 65 20 74 65 73 74 6c 69 6e  qExeFile testlin
26b40 71 2e 65 78 65 0d 0a 20 20 20 20 20 20 20 20 7d  q.exe..        }
26b50 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b  ....        if {
26b60 21 5b 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74  ![haveConstraint
26b70 20 5b 61 70 70 65 6e 64 41 72 67 73 20 66 69 6c   [appendArgs fil
26b80 65 5f 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  e_ \..          
26b90 20 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 74 65    [file tail $te
26ba0 73 74 45 66 36 45 78 65 46 69 6c 65 5d 5d 5d 7d  stEf6ExeFile]]]}
26bb0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
26bc0 20 20 20 63 68 65 63 6b 46 6f 72 46 69 6c 65 20     checkForFile 
26bd0 24 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 24 74  $test_channel $t
26be0 65 73 74 45 66 36 45 78 65 46 69 6c 65 20 74 65  estEf6ExeFile te
26bf0 73 74 65 66 36 2e 65 78 65 0d 0a 20 20 20 20 20  stef6.exe..     
26c00 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
26c10 69 66 20 7b 21 5b 68 61 76 65 43 6f 6e 73 74 72  if {![haveConstr
26c20 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73  aint [appendArgs
26c30 20 66 69 6c 65 5f 20 5c 0d 0a 20 20 20 20 20 20   file_ \..      
26c40 20 20 20 20 20 20 5b 66 69 6c 65 20 74 61 69 6c        [file tail
26c50 20 24 74 65 73 74 4c 69 6e 71 4f 75 74 46 69 6c   $testLinqOutFil
26c60 65 5d 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  e]]]} then {..  
26c70 20 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72          checkFor
26c80 46 69 6c 65 20 24 74 65 73 74 5f 63 68 61 6e 6e  File $test_chann
26c90 65 6c 20 24 74 65 73 74 4c 69 6e 71 4f 75 74 46  el $testLinqOutF
26ca0 69 6c 65 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  ile..        }..
26cb0 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b  ..        if {![
26cc0 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b  haveConstraint [
26cd0 61 70 70 65 6e 64 41 72 67 73 20 66 69 6c 65 5f  appendArgs file_
26ce0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
26cf0 5b 66 69 6c 65 20 74 61 69 6c 20 24 6e 6f 72 74  [file tail $nort
26d00 68 77 69 6e 64 45 66 44 62 46 69 6c 65 5d 5d 5d  hwindEfDbFile]]]
26d10 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
26d20 20 20 20 20 63 68 65 63 6b 46 6f 72 46 69 6c 65      checkForFile
26d30 20 24 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 24   $test_channel $
26d40 6e 6f 72 74 68 77 69 6e 64 45 66 44 62 46 69 6c  northwindEfDbFil
26d50 65 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  e..        }....
26d60 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 68 61          if {![ha
26d70 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70  veConstraint [ap
26d80 70 65 6e 64 41 72 67 73 20 66 69 6c 65 5f 20 5c  pendArgs file_ \
26d90 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 66  ..            [f
26da0 69 6c 65 20 74 61 69 6c 20 24 6e 6f 6e 57 61 6c  ile tail $nonWal
26db0 44 62 46 69 6c 65 5d 5d 5d 7d 20 74 68 65 6e 20  DbFile]]]} then 
26dc0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 63 68 65  {..          che
26dd0 63 6b 46 6f 72 46 69 6c 65 20 24 74 65 73 74 5f  ckForFile $test_
26de0 63 68 61 6e 6e 65 6c 20 24 6e 6f 6e 57 61 6c 44  channel $nonWalD
26df0 62 46 69 6c 65 0d 0a 20 20 20 20 20 20 20 20 7d  bFile..        }
26e00 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b  ....        if {
26e10 21 5b 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74  ![haveConstraint
26e20 20 5b 61 70 70 65 6e 64 41 72 67 73 20 66 69 6c   [appendArgs fil
26e30 65 5f 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  e_ \..          
26e40 20 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 77 61    [file tail $wa
26e50 6c 44 62 46 69 6c 65 5d 5d 5d 7d 20 74 68 65 6e  lDbFile]]]} then
26e60 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 63 68   {..          ch
26e70 65 63 6b 46 6f 72 46 69 6c 65 20 24 74 65 73 74  eckForFile $test
26e80 5f 63 68 61 6e 6e 65 6c 20 24 77 61 6c 44 62 46  _channel $walDbF
26e90 69 6c 65 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  ile..        }..
26ea0 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b  ..        if {![
26eb0 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b  haveConstraint [
26ec0 61 70 70 65 6e 64 41 72 67 73 20 66 69 6c 65 5f  appendArgs file_
26ed0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
26ee0 5b 66 69 6c 65 20 74 61 69 6c 20 24 74 65 73 74  [file tail $test
26ef0 49 6e 73 74 61 6c 6c 56 73 32 30 30 35 4c 6f 67  InstallVs2005Log
26f00 46 69 6c 65 5d 5d 5d 7d 20 74 68 65 6e 20 7b 0d  File]]]} then {.
26f10 0a 20 20 20 20 20 20 20 20 20 20 63 68 65 63 6b  .          check
26f20 46 6f 72 46 69 6c 65 20 24 74 65 73 74 5f 63 68  ForFile $test_ch
26f30 61 6e 6e 65 6c 20 24 74 65 73 74 49 6e 73 74 61  annel $testInsta
26f40 6c 6c 56 73 32 30 30 35 4c 6f 67 46 69 6c 65 0d  llVs2005LogFile.
26f50 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  .        }....  
26f60 20 20 20 20 20 20 69 66 20 7b 21 5b 68 61 76 65        if {![have
26f70 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65  Constraint [appe
26f80 6e 64 41 72 67 73 20 66 69 6c 65 5f 20 5c 0d 0a  ndArgs file_ \..
26f90 20 20 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c              [fil
26fa0 65 20 74 61 69 6c 20 24 74 65 73 74 49 6e 73 74  e tail $testInst
26fb0 61 6c 6c 56 73 32 30 30 38 4c 6f 67 46 69 6c 65  allVs2008LogFile
26fc0 5d 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  ]]]} then {..   
26fd0 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72 46         checkForF
26fe0 69 6c 65 20 24 74 65 73 74 5f 63 68 61 6e 6e 65  ile $test_channe
26ff0 6c 20 24 74 65 73 74 49 6e 73 74 61 6c 6c 56 73  l $testInstallVs
27000 32 30 30 38 4c 6f 67 46 69 6c 65 0d 0a 20 20 20  2008LogFile..   
27010 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
27020 20 20 69 66 20 7b 21 5b 68 61 76 65 43 6f 6e 73    if {![haveCons
27030 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72  traint [appendAr
27040 67 73 20 66 69 6c 65 5f 20 5c 0d 0a 20 20 20 20  gs file_ \..    
27050 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20 74 61          [file ta
27060 69 6c 20 24 74 65 73 74 49 6e 73 74 61 6c 6c 56  il $testInstallV
27070 73 32 30 31 30 4c 6f 67 46 69 6c 65 5d 5d 5d 7d  s2010LogFile]]]}
27080 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
27090 20 20 20 63 68 65 63 6b 46 6f 72 46 69 6c 65 20     checkForFile 
270a0 24 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 24 74  $test_channel $t
270b0 65 73 74 49 6e 73 74 61 6c 6c 56 73 32 30 31 30  estInstallVs2010
270c0 4c 6f 67 46 69 6c 65 0d 0a 20 20 20 20 20 20 20  LogFile..       
270d0 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66   }....        if
270e0 20 7b 21 5b 68 61 76 65 43 6f 6e 73 74 72 61 69   {![haveConstrai
270f0 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20 66  nt [appendArgs f
27100 69 6c 65 5f 20 5c 0d 0a 20 20 20 20 20 20 20 20  ile_ \..        
27110 20 20 20 20 5b 66 69 6c 65 20 74 61 69 6c 20 24      [file tail $
27120 74 65 73 74 49 6e 73 74 61 6c 6c 56 73 32 30 31  testInstallVs201
27130 32 4c 6f 67 46 69 6c 65 5d 5d 5d 7d 20 74 68 65  2LogFile]]]} the
27140 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 63  n {..          c
27150 68 65 63 6b 46 6f 72 46 69 6c 65 20 24 74 65 73  heckForFile $tes
27160 74 5f 63 68 61 6e 6e 65 6c 20 24 74 65 73 74 49  t_channel $testI
27170 6e 73 74 61 6c 6c 56 73 32 30 31 32 4c 6f 67 46  nstallVs2012LogF
27180 69 6c 65 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  ile..        }..
27190 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b  ..        if {![
271a0 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b  haveConstraint [
271b0 61 70 70 65 6e 64 41 72 67 73 20 66 69 6c 65 5f  appendArgs file_
271c0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
271d0 5b 66 69 6c 65 20 74 61 69 6c 20 24 74 65 73 74  [file tail $test
271e0 49 6e 73 74 61 6c 6c 56 73 32 30 31 33 4c 6f 67  InstallVs2013Log
271f0 46 69 6c 65 5d 5d 5d 7d 20 74 68 65 6e 20 7b 0d  File]]]} then {.
27200 0a 20 20 20 20 20 20 20 20 20 20 63 68 65 63 6b  .          check
27210 46 6f 72 46 69 6c 65 20 24 74 65 73 74 5f 63 68  ForFile $test_ch
27220 61 6e 6e 65 6c 20 24 74 65 73 74 49 6e 73 74 61  annel $testInsta
27230 6c 6c 56 73 32 30 31 33 4c 6f 67 46 69 6c 65 0d  llVs2013LogFile.
27240 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  .        }....  
27250 20 20 20 20 20 20 69 66 20 7b 21 5b 68 61 76 65        if {![have
27260 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65  Constraint [appe
27270 6e 64 41 72 67 73 20 66 69 6c 65 5f 20 5c 0d 0a  ndArgs file_ \..
27280 20 20 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c              [fil
27290 65 20 74 61 69 6c 20 24 74 65 73 74 49 6e 73 74  e tail $testInst
272a0 61 6c 6c 56 73 32 30 31 35 4c 6f 67 46 69 6c 65  allVs2015LogFile
272b0 5d 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  ]]]} then {..   
272c0 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72 46         checkForF
272d0 69 6c 65 20 24 74 65 73 74 5f 63 68 61 6e 6e 65  ile $test_channe
272e0 6c 20 24 74 65 73 74 49 6e 73 74 61 6c 6c 56 73  l $testInstallVs
272f0 32 30 31 35 4c 6f 67 46 69 6c 65 0d 0a 20 20 20  2015LogFile..   
27300 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
27310 20 20 69 66 20 7b 21 5b 68 61 76 65 43 6f 6e 73    if {![haveCons
27320 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72  traint [appendAr
27330 67 73 20 66 69 6c 65 5f 20 5c 0d 0a 20 20 20 20  gs file_ \..    
27340 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20 74 61          [file ta
27350 69 6c 20 24 74 65 73 74 55 6e 69 6e 73 74 61 6c  il $testUninstal
27360 6c 56 73 32 30 30 35 4c 6f 67 46 69 6c 65 5d 5d  lVs2005LogFile]]
27370 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
27380 20 20 20 20 20 63 68 65 63 6b 46 6f 72 46 69 6c       checkForFil
27390 65 20 24 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  e $test_channel 
273a0 24 74 65 73 74 55 6e 69 6e 73 74 61 6c 6c 56 73  $testUninstallVs
273b0 32 30 30 35 4c 6f 67 46 69 6c 65 0d 0a 20 20 20  2005LogFile..   
273c0 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
273d0 20 20 69 66 20 7b 21 5b 68 61 76 65 43 6f 6e 73    if {![haveCons
273e0 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72  traint [appendAr
273f0 67 73 20 66 69 6c 65 5f 20 5c 0d 0a 20 20 20 20  gs file_ \..    
27400 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20 74 61          [file ta
27410 69 6c 20 24 74 65 73 74 55 6e 69 6e 73 74 61 6c  il $testUninstal
27420 6c 56 73 32 30 30 38 4c 6f 67 46 69 6c 65 5d 5d  lVs2008LogFile]]
27430 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
27440 20 20 20 20 20 63 68 65 63 6b 46 6f 72 46 69 6c       checkForFil
27450 65 20 24 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  e $test_channel 
27460 24 74 65 73 74 55 6e 69 6e 73 74 61 6c 6c 56 73  $testUninstallVs
27470 32 30 30 38 4c 6f 67 46 69 6c 65 0d 0a 20 20 20  2008LogFile..   
27480 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
27490 20 20 69 66 20 7b 21 5b 68 61 76 65 43 6f 6e 73    if {![haveCons
274a0 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72  traint [appendAr
274b0 67 73 20 66 69 6c 65 5f 20 5c 0d 0a 20 20 20 20  gs file_ \..    
274c0 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20 74 61          [file ta
274d0 69 6c 20 24 74 65 73 74 55 6e 69 6e 73 74 61 6c  il $testUninstal
274e0 6c 56 73 32 30 31 30 4c 6f 67 46 69 6c 65 5d 5d  lVs2010LogFile]]
274f0 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
27500 20 20 20 20 20 63 68 65 63 6b 46 6f 72 46 69 6c       checkForFil
27510 65 20 24 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  e $test_channel 
27520 24 74 65 73 74 55 6e 69 6e 73 74 61 6c 6c 56 73  $testUninstallVs
27530 32 30 31 30 4c 6f 67 46 69 6c 65 0d 0a 20 20 20  2010LogFile..   
27540 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
27550 20 20 69 66 20 7b 21 5b 68 61 76 65 43 6f 6e 73    if {![haveCons
27560 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72  traint [appendAr
27570 67 73 20 66 69 6c 65 5f 20 5c 0d 0a 20 20 20 20  gs file_ \..    
27580 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20 74 61          [file ta
27590 69 6c 20 24 74 65 73 74 55 6e 69 6e 73 74 61 6c  il $testUninstal
275a0 6c 56 73 32 30 31 32 4c 6f 67 46 69 6c 65 5d 5d  lVs2012LogFile]]
275b0 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
275c0 20 20 20 20 20 63 68 65 63 6b 46 6f 72 46 69 6c       checkForFil
275d0 65 20 24 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  e $test_channel 
275e0 24 74 65 73 74 55 6e 69 6e 73 74 61 6c 6c 56 73  $testUninstallVs
275f0 32 30 31 32 4c 6f 67 46 69 6c 65 0d 0a 20 20 20  2012LogFile..   
27600 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
27610 20 20 69 66 20 7b 21 5b 68 61 76 65 43 6f 6e 73    if {![haveCons
27620 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72  traint [appendAr
27630 67 73 20 66 69 6c 65 5f 20 5c 0d 0a 20 20 20 20  gs file_ \..    
27640 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20 74 61          [file ta
27650 69 6c 20 24 74 65 73 74 55 6e 69 6e 73 74 61 6c  il $testUninstal
27660 6c 56 73 32 30 31 33 4c 6f 67 46 69 6c 65 5d 5d  lVs2013LogFile]]
27670 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
27680 20 20 20 20 20 63 68 65 63 6b 46 6f 72 46 69 6c       checkForFil
27690 65 20 24 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  e $test_channel 
276a0 24 74 65 73 74 55 6e 69 6e 73 74 61 6c 6c 56 73  $testUninstallVs
276b0 32 30 31 33 4c 6f 67 46 69 6c 65 0d 0a 20 20 20  2013LogFile..   
276c0 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
276d0 20 20 69 66 20 7b 21 5b 68 61 76 65 43 6f 6e 73    if {![haveCons
276e0 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72  traint [appendAr
276f0 67 73 20 66 69 6c 65 5f 20 5c 0d 0a 20 20 20 20  gs file_ \..    
27700 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20 74 61          [file ta
27710 69 6c 20 24 74 65 73 74 55 6e 69 6e 73 74 61 6c  il $testUninstal
27720 6c 56 73 32 30 31 35 4c 6f 67 46 69 6c 65 5d 5d  lVs2015LogFile]]
27730 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
27740 20 20 20 20 20 63 68 65 63 6b 46 6f 72 46 69 6c       checkForFil
27750 65 20 24 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  e $test_channel 
27760 24 74 65 73 74 55 6e 69 6e 73 74 61 6c 6c 56 73  $testUninstallVs
27770 32 30 31 35 4c 6f 67 46 69 6c 65 0d 0a 20 20 20  2015LogFile..   
27780 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d       }..      }.
27790 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70  .    }.....    p
277a0 72 6f 63 20 72 75 6e 53 51 4c 69 74 65 54 65 73  roc runSQLiteTes
277b0 74 46 69 6c 65 73 45 70 69 6c 6f 67 75 65 20 7b  tFilesEpilogue {
277c0 7d 20 7b 0d 0a 20 20 20 20 20 20 75 70 6c 65 76  } {..      uplev
277d0 65 6c 20 31 20 7b 0d 0a 20 20 20 20 20 20 20 20  el 1 {..        
277e0 75 6e 73 65 74 20 2d 6e 6f 63 6f 6d 70 6c 61 69  unset -nocomplai
277f0 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n \..           
27800 20 74 65 73 74 55 6e 69 6e 73 74 61 6c 6c 56 73   testUninstallVs
27810 32 30 31 35 4c 6f 67 46 69 6c 65 20 74 65 73 74  2015LogFile test
27820 55 6e 69 6e 73 74 61 6c 6c 56 73 32 30 31 33 4c  UninstallVs2013L
27830 6f 67 46 69 6c 65 20 5c 0d 0a 20 20 20 20 20 20  ogFile \..      
27840 20 20 20 20 20 20 74 65 73 74 55 6e 69 6e 73 74        testUninst
27850 61 6c 6c 56 73 32 30 31 32 4c 6f 67 46 69 6c 65  allVs2012LogFile
27860 20 74 65 73 74 55 6e 69 6e 73 74 61 6c 6c 56 73   testUninstallVs
27870 32 30 31 30 4c 6f 67 46 69 6c 65 20 5c 0d 0a 20  2010LogFile \.. 
27880 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 55             testU
27890 6e 69 6e 73 74 61 6c 6c 56 73 32 30 30 38 4c 6f  ninstallVs2008Lo
278a0 67 46 69 6c 65 20 74 65 73 74 55 6e 69 6e 73 74  gFile testUninst
278b0 61 6c 6c 56 73 32 30 30 35 4c 6f 67 46 69 6c 65  allVs2005LogFile
278c0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
278d0 74 65 73 74 49 6e 73 74 61 6c 6c 56 73 32 30 31  testInstallVs201
278e0 35 4c 6f 67 46 69 6c 65 20 74 65 73 74 49 6e 73  5LogFile testIns
278f0 74 61 6c 6c 56 73 32 30 31 33 4c 6f 67 46 69 6c  tallVs2013LogFil
27900 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e \..           
27910 20 74 65 73 74 49 6e 73 74 61 6c 6c 56 73 32 30   testInstallVs20
27920 31 32 4c 6f 67 46 69 6c 65 20 74 65 73 74 49 6e  12LogFile testIn
27930 73 74 61 6c 6c 56 73 32 30 31 30 4c 6f 67 46 69  stallVs2010LogFi
27940 6c 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  le \..          
27950 20 20 74 65 73 74 49 6e 73 74 61 6c 6c 56 73 32    testInstallVs2
27960 30 30 38 4c 6f 67 46 69 6c 65 20 74 65 73 74 49  008LogFile testI
27970 6e 73 74 61 6c 6c 56 73 32 30 30 35 4c 6f 67 46  nstallVs2005LogF
27980 69 6c 65 0d 0a 0d 0a 20 20 20 20 20 20 20 20 75  ile....        u
27990 6e 73 65 74 20 2d 6e 6f 63 6f 6d 70 6c 61 69 6e  nset -nocomplain
279a0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
279b0 6e 6f 72 74 68 77 69 6e 64 45 66 44 62 46 69 6c  northwindEfDbFil
279c0 65 20 74 65 73 74 4c 69 6e 71 4f 75 74 46 69 6c  e testLinqOutFil
279d0 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e \..           
279e0 20 77 61 6c 44 62 46 69 6c 65 20 6e 6f 6e 57 61   walDbFile nonWa
279f0 6c 44 62 46 69 6c 65 0d 0a 0d 0a 20 20 20 20 20  lDbFile....     
27a00 20 20 20 75 6e 73 65 74 20 2d 6e 6f 63 6f 6d 70     unset -nocomp
27a10 6c 61 69 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20  lain \..        
27a20 20 20 20 20 74 65 73 74 45 66 36 45 78 65 46 69      testEf6ExeFi
27a30 6c 65 20 74 65 73 74 4c 69 6e 71 45 78 65 46 69  le testLinqExeFi
27a40 6c 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  le \..          
27a50 20 20 74 65 73 74 45 78 65 46 69 6c 65 20 73 79    testExeFile sy
27a60 73 74 65 6d 44 61 74 61 53 51 4c 69 74 65 45 66  stemDataSQLiteEf
27a70 36 44 6c 6c 46 69 6c 65 20 5c 0d 0a 20 20 20 20  6DllFile \..    
27a80 20 20 20 20 20 20 20 20 73 79 73 74 65 6d 44 61          systemDa
27a90 74 61 53 51 4c 69 74 65 4c 69 6e 71 44 6c 6c 46  taSQLiteLinqDllF
27aa0 69 6c 65 20 73 79 73 74 65 6d 44 61 74 61 53 51  ile systemDataSQ
27ab0 4c 69 74 65 44 6c 6c 46 69 6c 65 20 5c 0d 0a 20  LiteDllFile \.. 
27ac0 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
27ad0 65 44 65 73 69 67 6e 65 72 44 6c 6c 46 69 6c 65  eDesignerDllFile
27ae0 20 69 6e 73 74 61 6c 6c 65 72 45 78 65 46 69 6c   installerExeFil
27af0 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e \..           
27b00 20 65 6e 74 69 74 79 46 72 61 6d 65 77 6f 72 6b   entityFramework
27b10 44 6c 6c 46 69 6c 65 0d 0a 20 20 20 20 20 20 7d  DllFile..      }
27b20 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
27b30 70 72 6f 63 20 72 75 6e 53 51 4c 69 74 65 54 65  proc runSQLiteTe
27b40 73 74 45 70 69 6c 6f 67 75 65 20 7b 7d 20 7b 0d  stEpilogue {} {.
27b50 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
27b60 23 20 4e 4f 54 45 3a 20 53 6b 69 70 20 72 75 6e  # NOTE: Skip run
27b70 6e 69 6e 67 20 6f 75 72 20 63 75 73 74 6f 6d 20  ning our custom 
27b80 65 70 69 6c 6f 67 75 65 20 69 66 20 74 68 65 20  epilogue if the 
27b90 6d 61 69 6e 20 6f 6e 65 20 68 61 73 20 62 65 65  main one has bee
27ba0 6e 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  n..      #      
27bb0 20 73 6b 69 70 70 65 64 2e 0d 0a 20 20 20 20 20   skipped...     
27bc0 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 21 5b   #..      if {![
27bd0 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f  info exists ::no
27be0 28 65 70 69 6c 6f 67 75 65 2e 65 61 67 6c 65 29  (epilogue.eagle)
27bf0 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
27c00 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
27c10 4e 4f 54 45 3a 20 53 68 6f 77 20 77 68 65 6e 20  NOTE: Show when 
27c20 6f 75 72 20 74 65 73 74 73 20 61 63 74 75 61 6c  our tests actual
27c30 6c 79 20 65 6e 64 65 64 20 28 6e 6f 77 29 2e 0d  ly ended (now)..
27c40 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
27c50 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
27c60 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e  t_channel [appen
27c70 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
27c80 20 20 20 20 20 22 2d 2d 2d 2d 20 53 79 73 74 65       "---- Syste
27c90 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 20 74 65  m.Data.SQLite te
27ca0 73 74 73 20 65 6e 64 65 64 20 61 74 20 22 20 5c  sts ended at " \
27cb0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 63  ..            [c
27cc0 6c 6f 63 6b 20 66 6f 72 6d 61 74 20 5b 63 6c 6f  lock format [clo
27cd0 63 6b 20 73 65 63 6f 6e 64 73 5d 5d 20 5c 6e 5d  ck seconds]] \n]
27ce0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  ....        #.. 
27cf0 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4c         # NOTE: L
27d00 6f 61 64 20 74 68 65 20 22 65 70 69 6c 6f 67 75  oad the "epilogu
27d10 65 22 20 63 75 73 74 6f 6d 20 70 65 72 2d 75 73  e" custom per-us
27d20 65 72 20 61 6e 64 2f 6f 72 20 70 65 72 2d 68 6f  er and/or per-ho
27d30 73 74 20 74 65 73 74 0d 0a 20 20 20 20 20 20 20  st test..       
27d40 20 23 20 20 20 20 20 20 20 73 65 74 74 69 6e 67   #       setting
27d50 73 20 6e 6f 77 2e 0d 0a 20 20 20 20 20 20 20 20  s now...        
27d60 23 0d 0a 20 20 20 20 20 20 20 20 75 70 6c 65 76  #..        uplev
27d70 65 6c 20 31 20 5b 6c 69 73 74 20 6c 6f 61 64 53  el 1 [list loadS
27d80 51 4c 69 74 65 54 65 73 74 53 65 74 74 69 6e 67  QLiteTestSetting
27d90 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
27da0 6c 20 2e 65 70 69 6c 6f 67 75 65 5d 0d 0a 0d 0a  l .epilogue]....
27db0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
27dc0 20 20 20 23 20 42 55 47 46 49 58 3a 20 42 65 66     # BUGFIX: Bef
27dd0 6f 72 65 20 63 68 65 63 6b 69 6e 67 20 74 68 65  ore checking the
27de0 20 66 69 6e 61 6c 20 72 65 73 6f 75 72 63 65 73   final resources
27df0 20 69 6e 20 75 73 65 20 62 79 20 53 51 4c 69 74   in use by SQLit
27e00 65 2c 20 6d 61 6b 65 0d 0a 20 20 20 20 20 20 20  e, make..       
27e10 20 23 20 20 20 20 20 20 20 20 20 73 75 72 65 20   #         sure 
27e20 62 6f 74 68 20 6f 66 20 74 68 65 20 50 52 41 47  both of the PRAG
27e30 4d 41 20 72 65 6c 61 74 65 64 20 64 69 72 65 63  MA related direc
27e40 74 6f 72 79 20 6e 61 6d 65 73 20 61 72 65 20 66  tory names are f
27e50 72 65 65 64 2e 0d 0a 20 20 20 20 20 20 20 20 23  reed...        #
27e60 0d 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b 46  ..        checkF
27e70 6f 72 53 51 4c 69 74 65 44 69 72 65 63 74 6f 72  orSQLiteDirector
27e80 69 65 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  ies $::test_chan
27e90 6e 65 6c 20 74 72 75 65 0d 0a 0d 0a 20 20 20 20  nel true....    
27ea0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
27eb0 20 4e 4f 54 45 3a 20 41 6c 73 6f 20 72 65 70 6f   NOTE: Also repo
27ec0 72 74 20 74 68 65 20 72 65 73 6f 75 72 63 65 20  rt the resource 
27ed0 75 73 61 67 65 20 61 66 74 65 72 20 72 75 6e 6e  usage after runn
27ee0 69 6e 67 20 74 68 65 20 74 65 73 74 73 2e 0d 0a  ing the tests...
27ef0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
27f00 20 20 20 72 65 70 6f 72 74 53 51 4c 69 74 65 52     reportSQLiteR
27f10 65 73 6f 75 72 63 65 73 20 24 3a 3a 74 65 73 74  esources $::test
27f20 5f 63 68 61 6e 6e 65 6c 0d 0a 0d 0a 20 20 20 20  _channel....    
27f30 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
27f40 20 4e 4f 54 45 3a 20 52 65 70 6f 72 74 20 74 68   NOTE: Report th
27f50 65 20 63 72 69 74 69 63 61 6c 20 68 61 6e 64 6c  e critical handl
27f60 65 20 63 6f 75 6e 74 73 20 61 66 74 65 72 20 72  e counts after r
27f70 75 6e 6e 69 6e 67 20 74 68 65 20 74 65 73 74 73  unning the tests
27f80 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
27f90 20 20 20 20 20 20 67 65 74 53 51 4c 69 74 65 48        getSQLiteH
27fa0 61 6e 64 6c 65 43 6f 75 6e 74 73 20 24 3a 3a 74  andleCounts $::t
27fb0 65 73 74 5f 63 68 61 6e 6e 65 6c 0d 0a 0d 0a 20  est_channel.... 
27fc0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
27fd0 20 20 23 20 4e 4f 54 45 3a 20 49 66 20 6e 65 63    # NOTE: If nec
27fe0 65 73 73 61 72 79 2c 20 64 69 73 61 62 6c 65 20  essary, disable 
27ff0 73 68 61 72 65 64 2d 63 61 63 68 65 20 6d 6f 64  shared-cache mod
28000 65 20 6e 6f 77 2e 0d 0a 20 20 20 20 20 20 20 20  e now...        
28010 23 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b  #..        if {[
28020 68 61 73 52 75 6e 74 69 6d 65 4f 70 74 69 6f 6e  hasRuntimeOption
28030 20 73 68 61 72 65 64 43 61 63 68 65 5d 7d 20 74   sharedCache]} t
28040 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
28050 20 65 6e 61 62 6c 65 53 68 61 72 65 64 43 61 63   enableSharedCac
28060 68 65 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  he $::test_chann
28070 65 6c 20 66 61 6c 73 65 0d 0a 20 20 20 20 20 20  el false..      
28080 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20    }..      }..  
28090 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 23 23 23 23    }.....    ####
280a0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
280b0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
280c0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
280d0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
280e0 23 23 23 23 23 23 23 0d 0a 20 20 20 20 23 23 23  #######..    ###
280f0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
28100 23 23 23 23 23 23 23 23 23 23 20 45 4e 44 20 45  ########## END E
28110 61 67 6c 65 20 4f 4e 4c 59 20 23 23 23 23 23 23  agle ONLY ######
28120 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
28130 23 23 23 23 23 23 23 23 0d 0a 20 20 20 20 23 23  ########..    ##
28140 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
28150 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
28160 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
28170 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
28180 23 23 23 23 23 23 23 23 23 0d 0a 20 20 7d 0d 0a  #########..  }..
28190 0d 0a 20 20 23 0d 0a 20 20 23 20 4e 4f 54 45 3a  ..  #..  # NOTE:
281a0 20 53 61 76 65 20 74 68 65 20 6e 61 6d 65 20 6f   Save the name o
281b0 66 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20  f the directory 
281c0 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 69 73 20  containing this 
281d0 66 69 6c 65 2e 0d 0a 20 20 23 0d 0a 20 20 69 66  file...  #..  if
281e0 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20   {![info exists 
281f0 63 6f 6d 6d 6f 6e 5f 64 69 72 65 63 74 6f 72 79  common_directory
28200 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 73  ]} then {..    s
28210 65 74 20 63 6f 6d 6d 6f 6e 5f 64 69 72 65 63 74  et common_direct
28220 6f 72 79 20 5b 66 69 6c 65 20 64 69 72 6e 61 6d  ory [file dirnam
28230 65 20 5b 69 6e 66 6f 20 73 63 72 69 70 74 5d 5d  e [info script]]
28240 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 23 0d 0a 20 20  ..  }....  #..  
28250 23 20 4e 4f 54 45 3a 20 50 72 6f 76 69 64 65 20  # NOTE: Provide 
28260 74 68 65 20 53 79 73 74 65 6d 2e 44 61 74 61 2e  the System.Data.
28270 53 51 4c 69 74 65 20 74 65 73 74 20 70 61 63 6b  SQLite test pack
28280 61 67 65 20 74 6f 20 74 68 65 20 69 6e 74 65 72  age to the inter
28290 70 72 65 74 65 72 2e 0d 0a 20 20 23 0d 0a 20 20  preter...  #..  
282a0 70 61 63 6b 61 67 65 20 70 72 6f 76 69 64 65 20  package provide 
282b0 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
282c0 74 65 2e 54 65 73 74 20 31 2e 30 0d 0a 7d 0d 0a  te.Test 1.0..}..