System.Data.SQLite
Hex Artifact Content
Not logged in

Artifact 01fca0bf121222804699cb62f8e33a8ecb64dcf0:


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 32 30 31 35 2c 20 6f 72 20 32 30  013, 2015, or 20
0760: 31 37 20 62 75 69 6c 64 20 73 79 73 74 65 6d 73  17 build systems
0770: 2e 20 20 54 6f 0d 0a 20 20 20 20 20 20 23 20 20  .  To..      #  
0780: 20 20 20 20 20 6f 76 65 72 72 69 64 65 20 74 68       override th
0790: 69 73 20 76 61 6c 75 65 20 76 69 61 20 74 68 65  is value via the
07a0: 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 2c 20 65   command line, e
07b0: 6e 74 65 72 20 61 20 63 6f 6d 6d 61 6e 64 20 73  nter a command s
07c0: 69 6d 69 6c 61 72 0d 0a 20 20 20 20 20 20 23 20  imilar..      # 
07d0: 20 20 20 20 20 20 74 6f 20 6f 6e 65 20 6f 66 20        to one of 
07e0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 28 61  the following (a
07f0: 6c 6c 20 6f 6e 20 6f 6e 65 20 6c 69 6e 65 29 3a  ll on one line):
0800: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
0810: 20 23 20 20 20 20 20 20 20 45 61 67 6c 65 53 68   #       EagleSh
0820: 65 6c 6c 2e 65 78 65 20 2d 61 6e 79 49 6e 69 74  ell.exe -anyInit
0830: 69 61 6c 69 7a 65 20 22 73 65 74 20 74 65 73 74  ialize "set test
0840: 5f 79 65 61 72 20 32 30 30 35 22 0d 0a 20 20 20  _year 2005"..   
0850: 20 20 20 23 20 20 20 20 20 20 20 20 20 2d 66 69     #         -fi
0860: 6c 65 20 2e 5c 70 61 74 68 5c 74 6f 5c 61 6c 6c  le .\path\to\all
0870: 2e 65 61 67 6c 65 0d 0a 20 20 20 20 20 20 23 0d  .eagle..      #.
0880: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 45  .      #       E
0890: 61 67 6c 65 53 68 65 6c 6c 2e 65 78 65 20 2d 61  agleShell.exe -a
08a0: 6e 79 49 6e 69 74 69 61 6c 69 7a 65 20 22 73 65  nyInitialize "se
08b0: 74 20 74 65 73 74 5f 79 65 61 72 20 32 30 30 38  t test_year 2008
08c0: 22 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  "..      #      
08d0: 20 20 20 2d 66 69 6c 65 20 2e 5c 70 61 74 68 5c     -file .\path\
08e0: 74 6f 5c 61 6c 6c 2e 65 61 67 6c 65 0d 0a 20 20  to\all.eagle..  
08f0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 20      #..      #  
0900: 20 20 20 20 20 45 61 67 6c 65 53 68 65 6c 6c 2e       EagleShell.
0910: 65 78 65 20 2d 61 6e 79 49 6e 69 74 69 61 6c 69  exe -anyInitiali
0920: 7a 65 20 22 73 65 74 20 74 65 73 74 5f 79 65 61  ze "set test_yea
0930: 72 20 32 30 31 30 22 0d 0a 20 20 20 20 20 20 23  r 2010"..      #
0940: 20 20 20 20 20 20 20 20 20 2d 66 69 6c 65 20 2e           -file .
0950: 5c 70 61 74 68 5c 74 6f 5c 61 6c 6c 2e 65 61 67  \path\to\all.eag
0960: 6c 65 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  le..      #..   
0970: 20 20 20 23 20 20 20 20 20 20 20 45 61 67 6c 65     #       Eagle
0980: 53 68 65 6c 6c 2e 65 78 65 20 2d 61 6e 79 49 6e  Shell.exe -anyIn
0990: 69 74 69 61 6c 69 7a 65 20 22 73 65 74 20 74 65  itialize "set te
09a0: 73 74 5f 79 65 61 72 20 32 30 31 32 22 0d 0a 20  st_year 2012".. 
09b0: 20 20 20 20 20 23 20 20 20 20 20 20 20 20 20 2d       #         -
09c0: 66 69 6c 65 20 2e 5c 70 61 74 68 5c 74 6f 5c 61  file .\path\to\a
09d0: 6c 6c 2e 65 61 67 6c 65 0d 0a 20 20 20 20 20 20  ll.eagle..      
09e0: 23 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  #..      #      
09f0: 20 45 61 67 6c 65 53 68 65 6c 6c 2e 65 78 65 20   EagleShell.exe 
0a00: 2d 61 6e 79 49 6e 69 74 69 61 6c 69 7a 65 20 22  -anyInitialize "
0a10: 73 65 74 20 74 65 73 74 5f 79 65 61 72 20 32 30  set test_year 20
0a20: 31 33 22 0d 0a 20 20 20 20 20 20 23 20 20 20 20  13"..      #    
0a30: 20 20 20 20 20 2d 66 69 6c 65 20 2e 5c 70 61 74       -file .\pat
0a40: 68 5c 74 6f 5c 61 6c 6c 2e 65 61 67 6c 65 0d 0a  h\to\all.eagle..
0a50: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
0a60: 20 20 20 20 20 20 20 45 61 67 6c 65 53 68 65 6c         EagleShel
0a70: 6c 2e 65 78 65 20 2d 61 6e 79 49 6e 69 74 69 61  l.exe -anyInitia
0a80: 6c 69 7a 65 20 22 73 65 74 20 74 65 73 74 5f 79  lize "set test_y
0a90: 65 61 72 20 32 30 31 35 22 0d 0a 20 20 20 20 20  ear 2015"..     
0aa0: 20 23 20 20 20 20 20 20 20 20 20 2d 66 69 6c 65   #         -file
0ab0: 20 2e 5c 70 61 74 68 5c 74 6f 5c 61 6c 6c 2e 65   .\path\to\all.e
0ac0: 61 67 6c 65 0d 0a 20 20 20 20 20 20 23 0d 0a 20  agle..      #.. 
0ad0: 20 20 20 20 20 23 20 20 20 20 20 20 20 45 61 67       #       Eag
0ae0: 6c 65 53 68 65 6c 6c 2e 65 78 65 20 2d 61 6e 79  leShell.exe -any
0af0: 49 6e 69 74 69 61 6c 69 7a 65 20 22 73 65 74 20  Initialize "set 
0b00: 74 65 73 74 5f 79 65 61 72 20 32 30 31 37 22 0d  test_year 2017".
0b10: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 20  .      #        
0b20: 20 2d 66 69 6c 65 20 2e 5c 70 61 74 68 5c 74 6f   -file .\path\to
0b30: 5c 61 6c 6c 2e 65 61 67 6c 65 0d 0a 20 20 20 20  \all.eagle..    
0b40: 20 20 23 0d 0a 20 20 20 20 20 20 23 20 20 20 20    #..      #    
0b50: 20 20 20 45 61 67 6c 65 53 68 65 6c 6c 2e 65 78     EagleShell.ex
0b60: 65 20 2d 61 6e 79 49 6e 69 74 69 61 6c 69 7a 65  e -anyInitialize
0b70: 20 22 75 6e 73 65 74 20 2d 6e 6f 63 6f 6d 70 6c   "unset -nocompl
0b80: 61 69 6e 20 74 65 73 74 5f 79 65 61 72 22 0d 0a  ain test_year"..
0b90: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 20 20        #         
0ba0: 2d 66 69 6c 65 20 2e 5c 70 61 74 68 5c 74 6f 5c  -file .\path\to\
0bb0: 61 6c 6c 2e 65 61 67 6c 65 0d 0a 20 20 20 20 20  all.eagle..     
0bc0: 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69   #..      if {[i
0bd0: 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 74 65 73  nfo exists ::tes
0be0: 74 5f 79 65 61 72 5d 20 26 26 20 5b 73 74 72 69  t_year] && [stri
0bf0: 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a 74 65 73  ng length $::tes
0c00: 74 5f 79 65 61 72 5d 20 3e 20 30 7d 20 74 68 65  t_year] > 0} the
0c10: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  n {..        #..
0c20: 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
0c30: 55 73 65 20 74 68 65 20 73 70 65 63 69 66 69 65  Use the specifie
0c40: 64 20 74 65 73 74 20 79 65 61 72 2e 20 20 49 66  d test year.  If
0c50: 20 74 68 69 73 20 76 61 72 69 61 62 6c 65 20 69   this variable i
0c60: 73 20 6e 6f 74 20 73 65 74 2c 20 74 68 65 0d 0a  s not set, the..
0c70: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
0c80: 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20 77 69  default value wi
0c90: 6c 6c 20 62 65 20 62 61 73 65 64 20 6f 6e 20 77  ll be based on w
0ca0: 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 45 61  hether or not Ea
0cb0: 67 6c 65 20 68 61 73 20 62 65 65 6e 0d 0a 20 20  gle has been..  
0cc0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63 6f        #       co
0cd0: 6d 70 69 6c 65 64 20 61 67 61 69 6e 73 74 20 74  mpiled against t
0ce0: 68 65 20 43 4c 52 20 76 32 2e 30 20 6f 72 20 43  he CLR v2.0 or C
0cf0: 4c 52 20 76 34 2e 30 2e 0d 0a 20 20 20 20 20 20  LR v4.0...      
0d00: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74    #..        ret
0d10: 75 72 6e 20 24 3a 3a 74 65 73 74 5f 79 65 61 72  urn $::test_year
0d20: 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b  ..      } else {
0d30: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
0d40: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 66 20       # NOTE: If 
0d50: 45 61 67 6c 65 20 68 61 73 20 62 65 65 6e 20 63  Eagle has been c
0d60: 6f 6d 70 69 6c 65 64 20 61 67 61 69 6e 73 74 20  ompiled against 
0d70: 74 68 65 20 43 4c 52 20 76 34 2e 30 2c 20 75 73  the CLR v4.0, us
0d80: 65 20 22 32 30 31 30 22 20 62 79 0d 0a 20 20 20  e "2010" by..   
0d90: 20 20 20 20 20 23 20 20 20 20 20 20 20 64 65 66       #       def
0da0: 61 75 6c 74 20 28 77 65 20 63 6f 75 6c 64 20 75  ault (we could u
0db0: 73 65 20 22 32 30 31 32 22 2c 20 22 32 30 31 33  se "2012", "2013
0dc0: 22 2c 20 22 32 30 31 35 22 2c 20 6f 72 20 22 32  ", "2015", or "2
0dd0: 30 31 37 22 20 69 6e 20 74 68 61 74 0d 0a 20 20  017" in that..  
0de0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63 61        #       ca
0df0: 73 65 20 61 73 20 77 65 6c 6c 29 20 61 73 20 74  se as well) as t
0e00: 68 65 20 74 65 73 74 20 79 65 61 72 3b 20 6f 74  he test year; ot
0e10: 68 65 72 77 69 73 65 2c 20 75 73 65 20 22 32 30  herwise, use "20
0e20: 30 38 22 20 62 79 20 64 65 66 61 75 6c 74 0d 0a  08" by default..
0e30: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
0e40: 28 77 65 20 63 6f 75 6c 64 20 75 73 65 20 22 32  (we could use "2
0e50: 30 30 35 22 20 69 6e 20 74 68 61 74 20 63 61 73  005" in that cas
0e60: 65 20 61 73 20 77 65 6c 6c 29 2e 20 20 49 66 20  e as well).  If 
0e70: 61 6e 6f 74 68 65 72 20 6d 61 6a 6f 72 0d 0a 20  another major.. 
0e80: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 5b         #       [
0e90: 69 6e 63 6f 6d 70 61 74 69 62 6c 65 5d 20 76 65  incompatible] ve
0ea0: 72 73 69 6f 6e 20 6f 66 20 74 68 65 20 43 4c 52  rsion of the CLR
0eb0: 20 69 73 20 72 65 6c 65 61 73 65 64 2c 20 74 68   is released, th
0ec0: 69 73 20 63 68 65 63 6b 20 77 69 6c 6c 0d 0a 20  is check will.. 
0ed0: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 68         #       h
0ee0: 61 76 65 20 74 6f 20 62 65 20 63 68 61 6e 67 65  ave to be change
0ef0: 64 2e 20 20 54 68 65 20 64 65 66 61 75 6c 74 20  d.  The default 
0f00: 74 65 73 74 20 79 65 61 72 20 74 6f 20 75 73 65  test year to use
0f10: 20 66 6f 72 20 61 0d 0a 20 20 20 20 20 20 20 20   for a..        
0f20: 23 20 20 20 20 20 20 20 70 61 72 74 69 63 75 6c  #       particul
0f30: 61 72 20 43 4c 52 20 76 65 72 73 69 6f 6e 20 6d  ar CLR version m
0f40: 61 79 20 62 65 20 6f 76 65 72 72 69 64 64 65 6e  ay be overridden
0f50: 20 62 79 20 73 65 74 74 69 6e 67 20 74 68 65 20   by setting the 
0f60: 67 6c 6f 62 61 6c 0d 0a 20 20 20 20 20 20 20 20  global..        
0f70: 23 20 20 20 20 20 20 20 76 61 72 69 61 62 6c 65  #       variable
0f80: 20 22 74 65 73 74 5f 79 65 61 72 5f 63 6c 72 5f   "test_year_clr_
0f90: 76 24 58 22 2c 20 77 68 65 72 65 20 22 24 58 22  v$X", where "$X"
0fa0: 20 6d 61 79 20 5b 63 75 72 72 65 6e 74 6c 79 5d   may [currently]
0fb0: 20 62 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20   be..        #  
0fc0: 20 20 20 20 20 65 69 74 68 65 72 20 22 32 22 20       either "2" 
0fd0: 6f 72 20 22 34 22 2e 0d 0a 20 20 20 20 20 20 20  or "4"...       
0fe0: 20 23 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b   #..        if {
0ff0: 5b 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74 20  [haveConstraint 
1000: 69 6d 61 67 65 52 75 6e 74 69 6d 65 34 30 5d 7d  imageRuntime40]}
1010: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
1020: 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69     if {[info exi
1030: 73 74 73 20 3a 3a 74 65 73 74 5f 79 65 61 72 5f  sts ::test_year_
1040: 63 6c 72 5f 76 34 5d 20 26 26 20 5c 0d 0a 20 20  clr_v4] && \..  
1050: 20 20 20 20 20 20 20 20 20 20 20 20 5b 73 74 72              [str
1060: 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a 74 65  ing length $::te
1070: 73 74 5f 79 65 61 72 5f 63 6c 72 5f 76 34 5d 20  st_year_clr_v4] 
1080: 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  > 0} then {..   
1090: 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
10a0: 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
10b0: 55 73 65 20 74 68 65 20 73 70 65 63 69 66 69 65  Use the specifie
10c0: 64 20 74 65 73 74 20 79 65 61 72 20 66 6f 72 20  d test year for 
10d0: 74 68 65 20 43 4c 52 20 76 34 2e 30 2e 0d 0a 20  the CLR v4.0... 
10e0: 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
10f0: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
1100: 20 24 3a 3a 74 65 73 74 5f 79 65 61 72 5f 63 6c   $::test_year_cl
1110: 72 5f 76 34 0d 0a 20 20 20 20 20 20 20 20 20 20  r_v4..          
1120: 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
1130: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
1140: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 55 73 65       # NOTE: Use
1150: 20 74 68 65 20 64 65 66 61 75 6c 74 20 74 65 73   the default tes
1160: 74 20 79 65 61 72 20 66 6f 72 20 74 68 65 20 43  t year for the C
1170: 4c 52 20 76 34 2e 30 2e 0d 0a 20 20 20 20 20 20  LR v4.0...      
1180: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
1190: 20 20 20 20 20 72 65 74 75 72 6e 20 32 30 31 30       return 2010
11a0: 3b 20 23 20 54 4f 44 4f 3a 20 47 6f 6f 64 20 22  ; # TODO: Good "
11b0: 66 61 6c 6c 62 61 63 6b 22 20 64 65 66 61 75 6c  fallback" defaul
11c0: 74 3f 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d  t?..          }.
11d0: 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20  .        } else 
11e0: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20  {..          if 
11f0: 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  {[info exists ::
1200: 74 65 73 74 5f 79 65 61 72 5f 63 6c 72 5f 76 32  test_year_clr_v2
1210: 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20  ] && \..        
1220: 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65        [string le
1230: 6e 67 74 68 20 24 3a 3a 74 65 73 74 5f 79 65 61  ngth $::test_yea
1240: 72 5f 63 6c 72 5f 76 32 5d 20 3e 20 30 7d 20 74  r_clr_v2] > 0} t
1250: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
1260: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
1270: 20 20 23 20 4e 4f 54 45 3a 20 55 73 65 20 74 68    # NOTE: Use th
1280: 65 20 73 70 65 63 69 66 69 65 64 20 74 65 73 74  e specified test
1290: 20 79 65 61 72 20 66 6f 72 20 74 68 65 20 43 4c   year for the CL
12a0: 52 20 76 32 2e 30 2e 0d 0a 20 20 20 20 20 20 20  R v2.0...       
12b0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
12c0: 20 20 20 20 72 65 74 75 72 6e 20 24 3a 3a 74 65      return $::te
12d0: 73 74 5f 79 65 61 72 5f 63 6c 72 5f 76 32 0d 0a  st_year_clr_v2..
12e0: 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65            } else
12f0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
1300: 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23  #..            #
1310: 20 4e 4f 54 45 3a 20 55 73 65 20 74 68 65 20 64   NOTE: Use the d
1320: 65 66 61 75 6c 74 20 74 65 73 74 20 79 65 61 72  efault test year
1330: 20 66 6f 72 20 74 68 65 20 43 4c 52 20 76 32 2e   for the CLR v2.
1340: 30 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  0...            
1350: 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  #..            r
1360: 65 74 75 72 6e 20 32 30 30 38 3b 20 23 20 54 4f  eturn 2008; # TO
1370: 44 4f 3a 20 47 6f 6f 64 20 22 66 61 6c 6c 62 61  DO: Good "fallba
1380: 63 6b 22 20 64 65 66 61 75 6c 74 3f 0d 0a 20 20  ck" default?..  
1390: 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
13a0: 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20     }..      }.. 
13b0: 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 23 0d 0a     }.....    #..
13c0: 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 69 73      # NOTE: This
13d0: 20 70 72 6f 63 65 64 75 72 65 20 69 73 20 6f 6e   procedure is on
13e0: 6c 79 20 75 73 65 64 20 77 68 65 6e 20 61 64 64  ly used when add
13f0: 69 6e 67 20 73 68 69 6d 6d 65 64 20 74 65 73 74  ing shimmed test
1400: 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e 0d 0a 20   constraints... 
1410: 20 20 20 23 0d 0a 20 20 20 20 70 72 6f 63 20 67     #..    proc g
1420: 65 74 42 75 69 6c 64 43 6c 72 56 65 72 73 69 6f  etBuildClrVersio
1430: 6e 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 69 66  n {} {..      if
1440: 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a   {[info exists :
1450: 3a 74 65 73 74 5f 63 6c 72 5d 20 26 26 20 5b 73  :test_clr] && [s
1460: 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a  tring length $::
1470: 74 65 73 74 5f 63 6c 72 5d 20 3e 20 30 7d 20 74  test_clr] > 0} t
1480: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  hen {..        #
1490: 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
14a0: 3a 20 55 73 65 20 74 68 65 20 73 70 65 63 69 66  : Use the specif
14b0: 69 65 64 20 74 65 73 74 20 76 65 72 73 69 6f 6e  ied test version
14c0: 20 66 6f 72 20 74 68 65 20 43 4c 52 2e 20 20 49   for the CLR.  I
14d0: 66 20 74 68 69 73 20 76 61 72 69 61 62 6c 65 0d  f this variable.
14e0: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
14f0: 20 69 73 20 6e 6f 74 20 73 65 74 2c 20 74 68 65   is not set, the
1500: 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20 77   default value w
1510: 69 6c 6c 20 62 65 20 62 61 73 65 64 20 6f 6e 20  ill be based on 
1520: 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 0d 0a  whether or not..
1530: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
1540: 45 61 67 6c 65 20 68 61 73 20 62 65 65 6e 20 63  Eagle has been c
1550: 6f 6d 70 69 6c 65 64 20 61 67 61 69 6e 73 74 20  ompiled against 
1560: 74 68 65 20 43 4c 52 20 76 32 2e 30 20 6f 72 20  the CLR v2.0 or 
1570: 43 4c 52 20 76 34 2e 30 2e 0d 0a 20 20 20 20 20  CLR v4.0...     
1580: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65     #..        re
1590: 74 75 72 6e 20 24 3a 3a 74 65 73 74 5f 63 6c 72  turn $::test_clr
15a0: 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b  ..      } else {
15b0: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
15c0: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68 65       # NOTE: Che
15d0: 63 6b 20 69 66 20 45 61 67 6c 65 20 68 61 73 20  ck if Eagle has 
15e0: 62 65 65 6e 20 63 6f 6d 70 69 6c 65 64 20 61 67  been compiled ag
15f0: 61 69 6e 73 74 20 74 68 65 20 43 4c 52 20 76 34  ainst the CLR v4
1600: 2e 30 2e 20 20 49 66 20 73 6f 2c 0d 0a 20 20 20  .0.  If so,..   
1610: 20 20 20 20 20 23 20 20 20 20 20 20 20 6a 75 73       #       jus
1620: 74 20 75 73 65 20 74 68 61 74 20 43 4c 52 20 76  t use that CLR v
1630: 65 72 73 69 6f 6e 2e 20 20 4f 74 68 65 72 77 69  ersion.  Otherwi
1640: 73 65 2c 20 75 73 65 20 74 68 65 20 76 65 72 73  se, use the vers
1650: 69 6f 6e 20 66 6f 72 20 74 68 65 0d 0a 20 20 20  ion for the..   
1660: 20 20 20 20 20 23 20 20 20 20 20 20 20 43 4c 52       #       CLR
1670: 20 76 32 2e 30 2e 20 20 49 66 20 61 6e 6f 74 68   v2.0.  If anoth
1680: 65 72 20 6d 61 6a 6f 72 20 5b 69 6e 63 6f 6d 70  er major [incomp
1690: 61 74 69 62 6c 65 5d 20 76 65 72 73 69 6f 6e 20  atible] version 
16a0: 6f 66 20 74 68 65 20 43 4c 52 0d 0a 20 20 20 20  of the CLR..    
16b0: 20 20 20 20 23 20 20 20 20 20 20 20 69 73 20 72      #       is r
16c0: 65 6c 65 61 73 65 64 2c 20 74 68 69 73 20 63 68  eleased, this ch
16d0: 65 63 6b 20 77 69 6c 6c 20 68 61 76 65 20 74 6f  eck will have to
16e0: 20 62 65 20 63 68 61 6e 67 65 64 2e 20 20 54 68   be changed.  Th
16f0: 65 20 64 65 66 61 75 6c 74 0d 0a 20 20 20 20 20  e default..     
1700: 20 20 20 23 20 20 20 20 20 20 20 76 65 72 73 69     #       versi
1710: 6f 6e 20 76 61 6c 75 65 20 66 6f 72 20 61 20 70  on value for a p
1720: 61 72 74 69 63 75 6c 61 72 20 43 4c 52 20 76 65  articular CLR ve
1730: 72 73 69 6f 6e 20 6d 61 79 20 62 65 20 6f 76 65  rsion may be ove
1740: 72 72 69 64 64 65 6e 0d 0a 20 20 20 20 20 20 20  rridden..       
1750: 20 23 20 20 20 20 20 20 20 62 79 20 73 65 74 74   #       by sett
1760: 69 6e 67 20 74 68 65 20 67 6c 6f 62 61 6c 20 76  ing the global v
1770: 61 72 69 61 62 6c 65 20 22 74 65 73 74 5f 63 6c  ariable "test_cl
1780: 72 5f 76 24 58 22 2c 20 77 68 65 72 65 20 22 24  r_v$X", where "$
1790: 58 22 20 6d 61 79 0d 0a 20 20 20 20 20 20 20 20  X" may..        
17a0: 23 20 20 20 20 20 20 20 5b 63 75 72 72 65 6e 74  #       [current
17b0: 6c 79 5d 20 62 65 20 65 69 74 68 65 72 20 22 32  ly] be either "2
17c0: 22 20 6f 72 20 22 34 22 2e 0d 0a 20 20 20 20 20  " or "4"...     
17d0: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 69 66     #..        if
17e0: 20 7b 5b 68 61 76 65 43 6f 6e 73 74 72 61 69 6e   {[haveConstrain
17f0: 74 20 69 6d 61 67 65 52 75 6e 74 69 6d 65 34 30  t imageRuntime40
1800: 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
1810: 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65       if {[info e
1820: 78 69 73 74 73 20 3a 3a 74 65 73 74 5f 63 6c 72  xists ::test_clr
1830: 5f 76 34 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20  _v4] && \..     
1840: 20 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67           [string
1850: 20 6c 65 6e 67 74 68 20 24 3a 3a 74 65 73 74 5f   length $::test_
1860: 63 6c 72 5f 76 34 5d 20 3e 20 30 7d 20 74 68 65  clr_v4] > 0} the
1870: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
1880: 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   #..            
1890: 23 20 4e 4f 54 45 3a 20 55 73 65 20 74 68 65 20  # NOTE: Use the 
18a0: 73 70 65 63 69 66 69 65 64 20 74 65 73 74 20 76  specified test v
18b0: 65 72 73 69 6f 6e 20 66 6f 72 20 74 68 65 20 43  ersion for the C
18c0: 4c 52 20 76 34 2e 30 2e 0d 0a 20 20 20 20 20 20  LR v4.0...      
18d0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
18e0: 20 20 20 20 20 72 65 74 75 72 6e 20 24 3a 3a 74       return $::t
18f0: 65 73 74 5f 63 6c 72 5f 76 34 0d 0a 20 20 20 20  est_clr_v4..    
1900: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
1910: 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20              #.. 
1920: 20 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54             # NOT
1930: 45 3a 20 55 73 65 20 74 68 65 20 64 65 66 61 75  E: Use the defau
1940: 6c 74 20 74 65 73 74 20 76 65 72 73 69 6f 6e 20  lt test version 
1950: 66 6f 72 20 74 68 65 20 43 4c 52 20 76 34 2e 30  for the CLR v4.0
1960: 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23  ...            #
1970: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65  ..            re
1980: 74 75 72 6e 20 34 2e 30 2e 33 30 33 31 39 3b 20  turn 4.0.30319; 
1990: 23 20 54 4f 44 4f 3a 20 47 6f 6f 64 20 22 66 61  # TODO: Good "fa
19a0: 6c 6c 62 61 63 6b 22 20 64 65 66 61 75 6c 74 3f  llback" default?
19b0: 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20  ..          }.. 
19c0: 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d         } else {.
19d0: 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b  .          if {[
19e0: 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 74 65  info exists ::te
19f0: 73 74 5f 63 6c 72 5f 76 32 5d 20 26 26 20 5c 0d  st_clr_v2] && \.
1a00: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b  .              [
1a10: 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a  string length $:
1a20: 3a 74 65 73 74 5f 63 6c 72 5f 76 32 5d 20 3e 20  :test_clr_v2] > 
1a30: 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
1a40: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
1a50: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 55 73        # NOTE: Us
1a60: 65 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  e the specified 
1a70: 74 65 73 74 20 76 65 72 73 69 6f 6e 20 66 6f 72  test version for
1a80: 20 74 68 65 20 43 4c 52 20 76 32 2e 30 2e 0d 0a   the CLR v2.0...
1a90: 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20              #.. 
1aa0: 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
1ab0: 6e 20 24 3a 3a 74 65 73 74 5f 63 6c 72 5f 76 32  n $::test_clr_v2
1ac0: 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c  ..          } el
1ad0: 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  se {..          
1ae0: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20    #..           
1af0: 20 23 20 4e 4f 54 45 3a 20 55 73 65 20 74 68 65   # NOTE: Use the
1b00: 20 64 65 66 61 75 6c 74 20 74 65 73 74 20 76 65   default test ve
1b10: 72 73 69 6f 6e 20 66 6f 72 20 74 68 65 20 43 4c  rsion for the CL
1b20: 52 20 76 32 2e 30 2e 0d 0a 20 20 20 20 20 20 20  R v2.0...       
1b30: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
1b40: 20 20 20 20 72 65 74 75 72 6e 20 32 2e 30 2e 35      return 2.0.5
1b50: 30 37 32 37 3b 20 23 20 54 4f 44 4f 3a 20 47 6f  0727; # TODO: Go
1b60: 6f 64 20 22 66 61 6c 6c 62 61 63 6b 22 20 64 65  od "fallback" de
1b70: 66 61 75 6c 74 3f 0d 0a 20 20 20 20 20 20 20 20  fault?..        
1b80: 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a    }..        }..
1b90: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a        }..    }..
1ba0: 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74 42  ...    proc getB
1bb0: 75 69 6c 64 59 65 61 72 73 20 7b 7d 20 7b 0d 0a  uildYears {} {..
1bc0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
1bd0: 20 4e 4f 54 45 3a 20 53 65 65 20 69 66 20 74 68   NOTE: See if th
1be0: 65 20 6c 69 73 74 20 6f 66 20 74 65 73 74 20 79  e list of test y
1bf0: 65 61 72 73 20 68 61 73 20 62 65 65 6e 20 6f 76  ears has been ov
1c00: 65 72 72 69 64 64 65 6e 20 62 79 20 74 68 65 20  erridden by the 
1c10: 75 73 65 72 0d 0a 20 20 20 20 20 20 23 20 20 20  user..      #   
1c20: 20 20 20 20 28 65 2e 67 2e 20 6f 6e 20 74 68 65      (e.g. on the
1c30: 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 29 2e 0d   command line)..
1c40: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
1c50: 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73  if {[info exists
1c60: 20 3a 3a 74 65 73 74 5f 79 65 61 72 73 5d 20 26   ::test_years] &
1c70: 26 20 5b 6c 6c 65 6e 67 74 68 20 24 3a 3a 74 65  & [llength $::te
1c80: 73 74 5f 79 65 61 72 73 5d 20 3e 20 30 7d 20 74  st_years] > 0} t
1c90: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  hen {..        #
1ca0: 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
1cb0: 3a 20 55 73 65 20 74 68 65 20 73 70 65 63 69 66  : Use the specif
1cc0: 69 65 64 20 6c 69 73 74 20 6f 66 20 74 65 73 74  ied list of test
1cd0: 20 79 65 61 72 73 2e 0d 0a 20 20 20 20 20 20 20   years...       
1ce0: 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75   #..        retu
1cf0: 72 6e 20 24 3a 3a 74 65 73 74 5f 79 65 61 72 73  rn $::test_years
1d00: 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b  ..      } else {
1d10: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
1d20: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 55 73 65       # NOTE: Use
1d30: 20 74 68 65 20 64 65 66 61 75 6c 74 20 6c 69 73   the default lis
1d40: 74 20 6f 66 20 74 65 73 74 20 79 65 61 72 73 20  t of test years 
1d50: 28 69 2e 65 2e 20 61 6c 6c 29 2e 0d 0a 20 20 20  (i.e. all)...   
1d60: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
1d70: 72 65 74 75 72 6e 20 5b 6c 69 73 74 20 32 30 30  return [list 200
1d80: 35 20 32 30 30 38 20 32 30 31 30 20 32 30 31 32  5 2008 2010 2012
1d90: 20 32 30 31 33 20 32 30 31 35 20 32 30 31 37 5d   2013 2015 2017]
1da0: 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d  ..      }..    }
1db0: 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65  .....    proc ge
1dc0: 74 42 75 69 6c 64 4e 65 74 46 78 20 7b 7d 20 7b  tBuildNetFx {} {
1dd0: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
1de0: 20 23 20 4e 4f 54 45 3a 20 53 65 65 20 69 66 20   # NOTE: See if 
1df0: 74 68 65 20 74 65 73 74 20 2e 4e 45 54 20 46 72  the test .NET Fr
1e00: 61 6d 65 77 6f 72 6b 20 73 65 74 74 69 6e 67 20  amework setting 
1e10: 68 61 73 20 62 65 65 6e 20 6f 76 65 72 72 69 64  has been overrid
1e20: 64 65 6e 20 62 79 0d 0a 20 20 20 20 20 20 23 20  den by..      # 
1e30: 20 20 20 20 20 20 74 68 65 20 75 73 65 72 20 28        the user (
1e40: 65 2e 67 2e 20 6f 6e 20 74 68 65 20 63 6f 6d 6d  e.g. on the comm
1e50: 61 6e 64 20 6c 69 6e 65 29 2e 0d 0a 20 20 20 20  and line)...    
1e60: 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b    #..      if {[
1e70: 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 74 65  info exists ::te
1e80: 73 74 5f 6e 65 74 5f 66 78 5d 20 26 26 20 5c 0d  st_net_fx] && \.
1e90: 0a 20 20 20 20 20 20 20 20 20 20 5b 73 74 72 69  .          [stri
1ea0: 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a 74 65 73  ng length $::tes
1eb0: 74 5f 6e 65 74 5f 66 78 5d 20 3e 20 30 7d 20 74  t_net_fx] > 0} t
1ec0: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  hen {..        #
1ed0: 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
1ee0: 3a 20 55 73 65 20 74 68 65 20 73 70 65 63 69 66  : Use the specif
1ef0: 69 65 64 20 74 65 73 74 20 2e 4e 45 54 20 46 72  ied test .NET Fr
1f00: 61 6d 65 77 6f 72 6b 2e 0d 0a 20 20 20 20 20 20  amework...      
1f10: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74    #..        ret
1f20: 75 72 6e 20 24 3a 3a 74 65 73 74 5f 6e 65 74 5f  urn $::test_net_
1f30: 66 78 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65  fx..      } else
1f40: 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20   {..        set 
1f50: 79 65 61 72 20 5b 67 65 74 42 75 69 6c 64 59 65  year [getBuildYe
1f60: 61 72 5d 0d 0a 20 20 20 20 20 20 20 20 73 65 74  ar]..        set
1f70: 20 79 65 61 72 56 61 72 4e 61 6d 65 20 5b 61 70   yearVarName [ap
1f80: 70 65 6e 64 41 72 67 73 20 3a 3a 74 65 73 74 5f  pendArgs ::test_
1f90: 6e 65 74 5f 66 78 5f 20 24 79 65 61 72 5d 0d 0a  net_fx_ $year]..
1fa0: 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 69  ..        if {[i
1fb0: 6e 66 6f 20 65 78 69 73 74 73 20 24 79 65 61 72  nfo exists $year
1fc0: 56 61 72 4e 61 6d 65 5d 20 26 26 20 5c 0d 0a 20  VarName] && \.. 
1fd0: 20 20 20 20 20 20 20 20 20 20 20 5b 73 74 72 69             [stri
1fe0: 6e 67 20 6c 65 6e 67 74 68 20 5b 73 65 74 20 24  ng length [set $
1ff0: 79 65 61 72 56 61 72 4e 61 6d 65 5d 5d 20 3e 20  yearVarName]] > 
2000: 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
2010: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
2020: 20 20 23 20 4e 4f 54 45 3a 20 55 73 65 20 74 68    # NOTE: Use th
2030: 65 20 73 70 65 63 69 66 69 65 64 20 74 65 73 74  e specified test
2040: 20 2e 4e 45 54 20 46 72 61 6d 65 77 6f 72 6b 2c   .NET Framework,
2050: 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 62 75   based on the bu
2060: 69 6c 64 0d 0a 20 20 20 20 20 20 20 20 20 20 23  ild..          #
2070: 20 20 20 20 20 20 20 79 65 61 72 2e 0d 0a 20 20         year...  
2080: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
2090: 20 20 20 20 20 72 65 74 75 72 6e 20 5b 73 65 74       return [set
20a0: 20 24 79 65 61 72 56 61 72 4e 61 6d 65 5d 0d 0a   $yearVarName]..
20b0: 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b          } else {
20c0: 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20  ..          #.. 
20d0: 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a           # NOTE:
20e0: 20 46 61 6c 6c 62 61 63 6b 20 74 6f 20 74 68 65   Fallback to the
20f0: 20 22 77 65 6c 6c 20 6b 6e 6f 77 6e 22 20 2e 4e   "well known" .N
2100: 45 54 20 46 72 61 6d 65 77 6f 72 6b 20 76 65 72  ET Framework ver
2110: 73 69 6f 6e 20 74 68 61 74 0d 0a 20 20 20 20 20  sion that..     
2120: 20 20 20 20 20 23 20 20 20 20 20 20 20 69 73 20       #       is 
2130: 6d 6f 73 74 20 63 6c 6f 73 65 6c 79 20 61 73 73  most closely ass
2140: 6f 63 69 61 74 65 64 20 77 69 74 68 20 61 20 70  ociated with a p
2150: 61 72 74 69 63 75 6c 61 72 20 76 65 72 73 69 6f  articular versio
2160: 6e 20 6f 66 0d 0a 20 20 20 20 20 20 20 20 20 20  n of..          
2170: 23 20 20 20 20 20 20 20 56 69 73 75 61 6c 20 53  #       Visual S
2180: 74 75 64 69 6f 2e 0d 0a 20 20 20 20 20 20 20 20  tudio...        
2190: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 73    #..          s
21a0: 77 69 74 63 68 20 2d 65 78 61 63 74 20 2d 2d 20  witch -exact -- 
21b0: 24 79 65 61 72 20 7b 0d 0a 20 20 20 20 20 20 20  $year {..       
21c0: 20 20 20 20 20 32 30 30 35 20 7b 0d 0a 20 20 20       2005 {..   
21d0: 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
21e0: 6e 20 6e 65 74 46 78 32 30 0d 0a 20 20 20 20 20  n netFx20..     
21f0: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
2200: 20 20 20 20 20 20 32 30 30 38 20 7b 0d 0a 20 20        2008 {..  
2210: 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
2220: 72 6e 20 6e 65 74 46 78 33 35 0d 0a 20 20 20 20  rn netFx35..    
2230: 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
2240: 20 20 20 20 20 20 20 32 30 31 30 20 7b 0d 0a 20         2010 {.. 
2250: 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74               ret
2260: 75 72 6e 20 6e 65 74 46 78 34 30 0d 0a 20 20 20  urn netFx40..   
2270: 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
2280: 20 20 20 20 20 20 20 20 32 30 31 32 20 7b 0d 0a          2012 {..
2290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
22a0: 74 75 72 6e 20 6e 65 74 46 78 34 35 0d 0a 20 20  turn netFx45..  
22b0: 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
22c0: 20 20 20 20 20 20 20 20 20 32 30 31 33 20 7b 0d           2013 {.
22d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72  .              r
22e0: 65 74 75 72 6e 20 6e 65 74 46 78 34 35 31 3b 20  eturn netFx451; 
22f0: 23 20 54 4f 44 4f 3a 20 4f 72 20 22 6e 65 74 46  # TODO: Or "netF
2300: 78 34 35 32 22 3f 0d 0a 20 20 20 20 20 20 20 20  x452"?..        
2310: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
2320: 20 20 20 32 30 31 35 20 7b 0d 0a 20 20 20 20 20     2015 {..     
2330: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
2340: 6e 65 74 46 78 34 36 3b 20 23 20 54 4f 44 4f 3a  netFx46; # TODO:
2350: 20 4f 72 20 22 6e 65 74 46 78 34 36 31 22 20 2f   Or "netFx461" /
2360: 20 22 6e 65 74 46 78 34 36 32 22 3f 0d 0a 20 20   "netFx462"?..  
2370: 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
2380: 20 20 20 20 20 20 20 20 20 32 30 31 37 20 7b 0d           2017 {.
2390: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72  .              r
23a0: 65 74 75 72 6e 20 6e 65 74 46 78 34 37 3b 20 23  eturn netFx47; #
23b0: 20 54 4f 44 4f 3a 20 4f 72 20 22 6e 65 74 46 78   TODO: Or "netFx
23c0: 34 37 31 22 3f 0d 0a 20 20 20 20 20 20 20 20 20  471"?..         
23d0: 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
23e0: 20 20 64 65 66 61 75 6c 74 20 7b 0d 0a 20 20 20    default {..   
23f0: 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
2400: 6e 20 6e 65 74 46 78 33 35 3b 20 23 20 54 4f 44  n netFx35; # TOD
2410: 4f 3a 20 47 6f 6f 64 20 22 66 61 6c 6c 62 61 63  O: Good "fallbac
2420: 6b 22 20 64 65 66 61 75 6c 74 3f 0d 0a 20 20 20  k" default?..   
2430: 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
2440: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
2450: 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20   }..      }..   
2460: 20 7d 0d 0a 0c 0d 0a 20 20 20 20 23 0d 0a 20 20   }.....    #..  
2470: 20 20 23 20 4e 4f 54 45 3a 20 54 68 69 73 20 70    # NOTE: This p
2480: 72 6f 63 65 64 75 72 65 20 73 68 6f 75 6c 64 20  rocedure should 
2490: 72 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20  return non-zero 
24a0: 69 66 20 74 68 65 20 63 6f 6e 66 69 67 75 72 65  if the configure
24b0: 64 20 74 65 73 74 0d 0a 20 20 20 20 23 20 20 20  d test..    #   
24c0: 20 20 20 20 70 6c 61 74 66 6f 72 6d 20 69 73 20      platform is 
24d0: 6d 6f 73 74 20 6c 69 6b 65 6c 79 20 74 68 65 20  most likely the 
24e0: 64 65 66 61 75 6c 74 20 66 6f 72 20 74 68 69 73  default for this
24f0: 20 6d 61 63 68 69 6e 65 2e 0d 0a 20 20 20 20 23   machine...    #
2500: 0d 0a 20 20 20 20 70 72 6f 63 20 69 73 44 65 66  ..    proc isDef
2510: 61 75 6c 74 42 75 69 6c 64 50 6c 61 74 66 6f 72  aultBuildPlatfor
2520: 6d 20 7b 20 7b 76 65 72 62 6f 73 65 20 74 72 75  m { {verbose tru
2530: 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d  e} } {..      #.
2540: 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 52  .      # NOTE: R
2550: 75 6e 6e 69 6e 67 20 6f 6e 20 57 6f 57 36 34 20  unning on WoW64 
2560: 69 73 20 6e 65 76 65 72 20 74 68 65 20 64 65 66  is never the def
2570: 61 75 6c 74 20 70 6c 61 74 66 6f 72 6d 2e 0d 0a  ault platform...
2580: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69        #..      i
2590: 66 20 7b 5b 69 73 52 75 6e 6e 69 6e 67 57 6f 57  f {[isRunningWoW
25a0: 36 34 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  64]} then {..   
25b0: 20 20 20 20 20 69 66 20 7b 24 76 65 72 62 6f 73       if {$verbos
25c0: 65 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  e} then {..     
25d0: 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
25e0: 73 74 5f 63 68 61 6e 6e 65 6c 20 5c 0d 0a 20 20  st_channel \..  
25f0: 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
2600: 2d 20 64 65 74 65 63 74 65 64 20 6e 6f 6e 2d 64  - detected non-d
2610: 65 66 61 75 6c 74 20 70 6c 61 74 66 6f 72 6d 20  efault platform 
2620: 28 57 6f 57 36 34 29 5c 6e 22 0d 0a 20 20 20 20  (WoW64)\n"..    
2630: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
2640: 20 72 65 74 75 72 6e 20 66 61 6c 73 65 0d 0a 20   return false.. 
2650: 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
2660: 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
2670: 20 54 68 69 73 20 68 61 73 20 61 20 67 6f 6f 64   This has a good
2680: 20 63 68 61 6e 63 65 20 6f 66 20 62 65 69 6e 67   chance of being
2690: 20 74 68 65 20 64 65 66 61 75 6c 74 20 70 6c 61   the default pla
26a0: 74 66 6f 72 6d 2e 0d 0a 20 20 20 20 20 20 23 0d  tform...      #.
26b0: 0a 20 20 20 20 20 20 69 66 20 7b 24 76 65 72 62  .      if {$verb
26c0: 6f 73 65 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  ose} then {..   
26d0: 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
26e0: 73 74 5f 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d  st_channel "----
26f0: 20 64 65 74 65 63 74 65 64 20 64 65 66 61 75 6c   detected defaul
2700: 74 20 70 6c 61 74 66 6f 72 6d 5c 6e 22 0d 0a 20  t platform\n".. 
2710: 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
2720: 72 65 74 75 72 6e 20 74 72 75 65 0d 0a 20 20 20  return true..   
2730: 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
2740: 67 65 74 42 75 69 6c 64 50 6c 61 74 66 6f 72 6d  getBuildPlatform
2750: 20 7b 20 6e 61 74 69 76 65 20 7d 20 7b 0d 0a 20   { native } {.. 
2760: 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65       if {[info e
2770: 78 69 73 74 73 20 3a 3a 74 65 73 74 5f 70 6c 61  xists ::test_pla
2780: 74 66 6f 72 6d 5d 20 26 26 20 5c 0d 0a 20 20 20  tform] && \..   
2790: 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c         [string l
27a0: 65 6e 67 74 68 20 24 3a 3a 74 65 73 74 5f 70 6c  ength $::test_pl
27b0: 61 74 66 6f 72 6d 5d 20 3e 20 30 7d 20 74 68 65  atform] > 0} the
27c0: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  n {..        #..
27d0: 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
27e0: 55 73 65 20 74 68 65 20 73 70 65 63 69 66 69 65  Use the specifie
27f0: 64 20 74 65 73 74 20 70 6c 61 74 66 6f 72 6d 2e  d test platform.
2800: 20 20 49 66 20 74 68 69 73 20 76 61 72 69 61 62    If this variab
2810: 6c 65 20 69 73 20 6e 6f 74 20 73 65 74 2c 0d 0a  le is not set,..
2820: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
2830: 74 68 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75  the default valu
2840: 65 20 77 69 6c 6c 20 62 65 20 62 61 73 65 64 20  e will be based 
2850: 6f 6e 20 74 68 65 20 6d 61 63 68 69 6e 65 20 61  on the machine a
2860: 72 63 68 69 74 65 63 74 75 72 65 2e 0d 0a 20 20  rchitecture...  
2870: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
2880: 20 72 65 74 75 72 6e 20 5b 65 78 70 72 20 7b 24   return [expr {$
2890: 6e 61 74 69 76 65 20 3f 20 24 3a 3a 74 65 73 74  native ? $::test
28a0: 5f 70 6c 61 74 66 6f 72 6d 20 3a 20 22 22 7d 5d  _platform : ""}]
28b0: 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 69 66  ..      } elseif
28c0: 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a   {[info exists :
28d0: 3a 74 65 73 74 5f 6d 61 63 68 69 6e 65 5d 20 26  :test_machine] &
28e0: 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b  & \..          [
28f0: 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a  string length $:
2900: 3a 74 65 73 74 5f 6d 61 63 68 69 6e 65 5d 20 3e  :test_machine] >
2910: 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
2920: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
2930: 20 4e 4f 54 45 3a 20 46 6f 72 20 6e 61 74 69 76   NOTE: For nativ
2940: 65 20 62 75 69 6c 64 73 2c 20 72 65 74 75 72 6e  e builds, return
2950: 20 74 68 65 20 70 6c 61 74 66 6f 72 6d 20 6e 61   the platform na
2960: 6d 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  me corresponding
2970: 20 74 6f 0d 0a 20 20 20 20 20 20 20 20 23 20 20   to..        #  
2980: 20 20 20 20 20 74 68 65 20 74 65 73 74 20 6d 61       the test ma
2990: 63 68 69 6e 65 20 61 72 63 68 69 74 65 63 74 75  chine architectu
29a0: 72 65 3b 20 6f 74 68 65 72 77 69 73 65 2c 20 72  re; otherwise, r
29b0: 65 74 75 72 6e 20 61 6e 20 65 6d 70 74 79 0d 0a  eturn an empty..
29c0: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
29d0: 73 74 72 69 6e 67 2e 0d 0a 20 20 20 20 20 20 20  string...       
29e0: 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75   #..        retu
29f0: 72 6e 20 5b 65 78 70 72 20 7b 0d 0a 20 20 20 20  rn [expr {..    
2a00: 20 20 20 20 20 20 24 6e 61 74 69 76 65 20 3f 20        $native ? 
2a10: 5b 6d 61 63 68 69 6e 65 54 6f 50 6c 61 74 66 6f  [machineToPlatfo
2a20: 72 6d 20 24 3a 3a 74 65 73 74 5f 6d 61 63 68 69  rm $::test_machi
2a30: 6e 65 5d 20 3a 20 22 22 0d 0a 20 20 20 20 20 20  ne] : ""..      
2a40: 20 20 7d 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c    }]..      } el
2a50: 73 65 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73  seif {[info exis
2a60: 74 73 20 3a 3a 74 63 6c 5f 70 6c 61 74 66 6f 72  ts ::tcl_platfor
2a70: 6d 28 6d 61 63 68 69 6e 65 29 5d 7d 20 74 68 65  m(machine)]} the
2a80: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  n {..        #..
2a90: 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
2aa0: 46 6f 72 20 6e 61 74 69 76 65 20 62 75 69 6c 64  For native build
2ab0: 73 2c 20 72 65 74 75 72 6e 20 74 68 65 20 70 6c  s, return the pl
2ac0: 61 74 66 6f 72 6d 20 6e 61 6d 65 20 63 6f 72 72  atform name corr
2ad0: 65 73 70 6f 6e 64 69 6e 67 20 74 6f 0d 0a 20 20  esponding to..  
2ae0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68        #       th
2af0: 65 20 6d 61 63 68 69 6e 65 20 61 72 63 68 69 74  e machine archit
2b00: 65 63 74 75 72 65 3b 20 6f 74 68 65 72 77 69 73  ecture; otherwis
2b10: 65 2c 20 72 65 74 75 72 6e 20 61 6e 20 65 6d 70  e, return an emp
2b20: 74 79 20 73 74 72 69 6e 67 2e 0d 0a 20 20 20 20  ty string...    
2b30: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72      #..        r
2b40: 65 74 75 72 6e 20 5b 65 78 70 72 20 7b 0d 0a 20  eturn [expr {.. 
2b50: 20 20 20 20 20 20 20 20 20 24 6e 61 74 69 76 65           $native
2b60: 20 3f 20 5b 6d 61 63 68 69 6e 65 54 6f 50 6c 61   ? [machineToPla
2b70: 74 66 6f 72 6d 20 24 3a 3a 74 63 6c 5f 70 6c 61  tform $::tcl_pla
2b80: 74 66 6f 72 6d 28 6d 61 63 68 69 6e 65 29 5d 20  tform(machine)] 
2b90: 3a 20 22 22 0d 0a 20 20 20 20 20 20 20 20 7d 5d  : ""..        }]
2ba0: 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b  ..      } else {
2bb0: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
2bc0: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4e 6f 20       # NOTE: No 
2bd0: 6d 61 63 68 69 6e 65 20 61 72 63 68 69 74 65 63  machine architec
2be0: 74 75 72 65 20 69 73 20 61 76 61 69 6c 61 62 6c  ture is availabl
2bf0: 65 2c 20 72 65 74 75 72 6e 20 61 6e 20 65 6d 70  e, return an emp
2c00: 74 79 20 73 74 72 69 6e 67 2e 0d 0a 20 20 20 20  ty string...    
2c10: 20 20 20 20 23 20 20 20 20 20 20 20 49 74 20 69      #       It i
2c20: 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 72  s important to r
2c30: 65 74 75 72 6e 20 61 6e 20 65 6d 70 74 79 20 73  eturn an empty s
2c40: 74 72 69 6e 67 20 68 65 72 65 20 62 65 63 61 75  tring here becau
2c50: 73 65 20 74 68 65 0d 0a 20 20 20 20 20 20 20 20  se the..        
2c60: 23 20 20 20 20 20 20 20 72 65 73 75 6c 74 20 6f  #       result o
2c70: 66 20 74 68 69 73 20 70 72 6f 63 65 64 75 72 65  f this procedure
2c80: 20 6d 61 79 20 62 65 20 75 73 65 64 20 77 69 74   may be used wit
2c90: 68 20 5b 66 69 6c 65 20 6a 6f 69 6e 5d 2e 0d 0a  h [file join]...
2ca0: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
2cb0: 20 20 20 72 65 74 75 72 6e 20 22 22 0d 0a 20 20     return ""..  
2cc0: 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d      }..    }....
2cd0: 0a 20 20 20 20 70 72 6f 63 20 67 65 74 42 75 69  .    proc getBui
2ce0: 6c 64 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  ldConfiguration 
2cf0: 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20  {} {..      #.. 
2d00: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 65 65       # NOTE: See
2d10: 20 69 66 20 74 68 65 20 22 63 6f 6e 66 69 67 75   if the "configu
2d20: 72 61 74 69 6f 6e 22 20 73 65 74 74 69 6e 67 20  ration" setting 
2d30: 68 61 73 20 62 65 65 6e 20 6f 76 65 72 72 69 64  has been overrid
2d40: 64 65 6e 20 62 79 20 74 68 65 0d 0a 20 20 20 20  den by the..    
2d50: 20 20 23 20 20 20 20 20 20 20 75 73 65 72 20 28    #       user (
2d60: 65 2e 67 2e 20 6f 6e 20 74 68 65 20 63 6f 6d 6d  e.g. on the comm
2d70: 61 6e 64 20 6c 69 6e 65 29 2e 20 20 54 68 69 73  and line).  This
2d80: 20 68 65 6c 70 73 20 63 6f 6e 74 72 6f 6c 20 65   helps control e
2d90: 78 61 63 74 6c 79 0d 0a 20 20 20 20 20 20 23 20  xactly..      # 
2da0: 20 20 20 20 20 20 77 68 69 63 68 20 73 65 74 20        which set 
2db0: 6f 66 20 62 69 6e 61 72 69 65 73 20 77 65 20 61  of binaries we a
2dc0: 72 65 20 74 65 73 74 69 6e 67 20 28 69 2e 65 2e  re testing (i.e.
2dd0: 20 74 68 6f 73 65 20 62 75 69 6c 74 20 69 6e 20   those built in 
2de0: 74 68 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20  the..      #    
2df0: 20 20 20 22 44 65 62 75 67 22 20 6f 72 20 22 52     "Debug" or "R
2e00: 65 6c 65 61 73 65 22 20 62 75 69 6c 64 20 63 6f  elease" build co
2e10: 6e 66 69 67 75 72 61 74 69 6f 6e 73 29 2e 20 20  nfigurations).  
2e20: 54 6f 20 6f 76 65 72 72 69 64 65 20 74 68 69 73  To override this
2e30: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
2e40: 76 61 6c 75 65 20 76 69 61 20 74 68 65 20 63 6f  value via the co
2e50: 6d 6d 61 6e 64 20 6c 69 6e 65 2c 20 65 6e 74 65  mmand line, ente
2e60: 72 20 61 20 63 6f 6d 6d 61 6e 64 20 73 69 6d 69  r a command simi
2e70: 6c 61 72 20 74 6f 20 6f 6e 65 20 6f 66 0d 0a 20  lar to one of.. 
2e80: 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68 65       #       the
2e90: 20 66 6f 6c 6c 6f 77 69 6e 67 20 28 61 6c 6c 20   following (all 
2ea0: 6f 6e 20 6f 6e 65 20 6c 69 6e 65 29 3a 0d 0a 20  on one line):.. 
2eb0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
2ec0: 20 20 20 20 20 20 45 61 67 6c 65 53 68 65 6c 6c        EagleShell
2ed0: 2e 65 78 65 20 2d 61 6e 79 49 6e 69 74 69 61 6c  .exe -anyInitial
2ee0: 69 7a 65 20 22 73 65 74 20 74 65 73 74 5f 63 6f  ize "set test_co
2ef0: 6e 66 69 67 75 72 61 74 69 6f 6e 20 44 65 62 75  nfiguration Debu
2f00: 67 22 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  g"..      #     
2f10: 20 20 20 20 2d 66 69 6c 65 20 2e 5c 70 61 74 68      -file .\path
2f20: 5c 74 6f 5c 61 6c 6c 2e 65 61 67 6c 65 0d 0a 20  \to\all.eagle.. 
2f30: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
2f40: 20 20 20 20 20 20 45 61 67 6c 65 53 68 65 6c 6c        EagleShell
2f50: 2e 65 78 65 20 2d 61 6e 79 49 6e 69 74 69 61 6c  .exe -anyInitial
2f60: 69 7a 65 20 22 73 65 74 20 74 65 73 74 5f 63 6f  ize "set test_co
2f70: 6e 66 69 67 75 72 61 74 69 6f 6e 20 52 65 6c 65  nfiguration Rele
2f80: 61 73 65 22 0d 0a 20 20 20 20 20 20 23 20 20 20  ase"..      #   
2f90: 20 20 20 20 20 20 2d 66 69 6c 65 20 2e 5c 70 61        -file .\pa
2fa0: 74 68 5c 74 6f 5c 61 6c 6c 2e 65 61 67 6c 65 0d  th\to\all.eagle.
2fb0: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
2fc0: 23 20 20 20 20 20 20 20 45 61 67 6c 65 53 68 65  #       EagleShe
2fd0: 6c 6c 2e 65 78 65 20 2d 66 69 6c 65 20 2e 5c 70  ll.exe -file .\p
2fe0: 61 74 68 5c 74 6f 5c 61 6c 6c 2e 65 61 67 6c 65  ath\to\all.eagle
2ff0: 20 2d 70 72 65 54 65 73 74 0d 0a 20 20 20 20 20   -preTest..     
3000: 20 23 20 20 20 20 20 20 20 20 20 22 75 6e 73 65   #         "unse
3010: 74 20 2d 6e 6f 63 6f 6d 70 6c 61 69 6e 20 74 65  t -nocomplain te
3020: 73 74 5f 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  st_configuration
3030: 22 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  "..      #..    
3040: 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73    if {[info exis
3050: 74 73 20 3a 3a 74 65 73 74 5f 63 6f 6e 66 69 67  ts ::test_config
3060: 75 72 61 74 69 6f 6e 5d 20 26 26 20 5c 0d 0a 20  uration] && \.. 
3070: 20 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67           [string
3080: 20 6c 65 6e 67 74 68 20 24 3a 3a 74 65 73 74 5f   length $::test_
3090: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 5d 20 3e  configuration] >
30a0: 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
30b0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
30c0: 20 4e 4f 54 45 3a 20 55 73 65 20 74 68 65 20 73   NOTE: Use the s
30d0: 70 65 63 69 66 69 65 64 20 74 65 73 74 20 63 6f  pecified test co
30e0: 6e 66 69 67 75 72 61 74 69 6f 6e 2e 20 20 54 68  nfiguration.  Th
30f0: 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20  e default value 
3100: 75 73 65 64 0d 0a 20 20 20 20 20 20 20 20 23 20  used..        # 
3110: 20 20 20 20 20 20 66 6f 72 20 74 68 69 73 20 76        for this v
3120: 61 72 69 61 62 6c 65 20 69 73 20 74 79 70 69 63  ariable is typic
3130: 61 6c 6c 79 20 22 52 65 6c 65 61 73 65 22 2c 20  ally "Release", 
3140: 61 73 20 73 65 74 20 62 79 20 74 68 65 20 74 65  as set by the te
3150: 73 74 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  st..        #   
3160: 20 20 20 20 73 75 69 74 65 20 69 74 73 65 6c 66      suite itself
3170: 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
3180: 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 3a 3a        return $::
3190: 74 65 73 74 5f 63 6f 6e 66 69 67 75 72 61 74 69  test_configurati
31a0: 6f 6e 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65  on..      } else
31b0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20   {..        #.. 
31c0: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4e         # NOTE: N
31d0: 6f 72 6d 61 6c 6c 79 2c 20 77 65 20 77 69 6c 6c  ormally, we will
31e0: 20 6e 65 76 65 72 20 68 69 74 20 74 68 69 73 20   never hit this 
31f0: 63 61 73 65 20 62 65 63 61 75 73 65 20 74 68 65  case because the
3200: 20 76 61 6c 75 65 20 6f 66 20 74 68 65 0d 0a 20   value of the.. 
3210: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74         #       t
3220: 65 73 74 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  est configuratio
3230: 6e 20 76 61 72 69 61 62 6c 65 20 69 73 20 61 6c  n variable is al
3240: 77 61 79 73 20 73 65 74 20 62 79 20 74 68 65 20  ways set by the 
3250: 74 65 73 74 20 73 75 69 74 65 0d 0a 20 20 20 20  test suite..    
3260: 20 20 20 20 23 20 20 20 20 20 20 20 69 74 73 65      #       itse
3270: 6c 66 3b 20 68 6f 77 65 76 65 72 2c 20 69 74 20  lf; however, it 
3280: 63 61 6e 20 62 65 20 6f 76 65 72 72 69 64 64 65  can be overridde
3290: 6e 20 75 73 69 6e 67 20 74 68 65 20 75 6e 73 65  n using the unse
32a0: 74 20 63 6f 6d 6d 61 6e 64 0d 0a 20 20 20 20 20  t command..     
32b0: 20 20 20 23 20 20 20 20 20 20 20 66 72 6f 6d 20     #       from 
32c0: 74 68 65 20 2d 70 72 65 54 65 73 74 20 6f 70 74  the -preTest opt
32d0: 69 6f 6e 20 74 6f 20 74 68 65 20 74 65 73 74 20  ion to the test 
32e0: 73 75 69 74 65 2e 0d 0a 20 20 20 20 20 20 20 20  suite...        
32f0: 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  #..        retur
3300: 6e 20 24 3a 3a 65 61 67 6c 65 5f 70 6c 61 74 66  n $::eagle_platf
3310: 6f 72 6d 28 63 6f 6e 66 69 67 75 72 61 74 69 6f  orm(configuratio
3320: 6e 29 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20  n)..      }..   
3330: 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
3340: 67 65 74 42 75 69 6c 64 43 6f 6e 66 69 67 75 72  getBuildConfigur
3350: 61 74 69 6f 6e 73 20 7b 7d 20 7b 0d 0a 20 20 20  ations {} {..   
3360: 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
3370: 54 45 3a 20 53 65 65 20 69 66 20 74 68 65 20 6c  TE: See if the l
3380: 69 73 74 20 6f 66 20 74 65 73 74 20 63 6f 6e 66  ist of test conf
3390: 69 67 75 72 61 74 69 6f 6e 73 20 68 61 73 20 62  igurations has b
33a0: 65 65 6e 20 6f 76 65 72 72 69 64 64 65 6e 20 62  een overridden b
33b0: 79 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  y..      #      
33c0: 20 74 68 65 20 75 73 65 72 20 28 65 2e 67 2e 20   the user (e.g. 
33d0: 6f 6e 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20 6c  on the command l
33e0: 69 6e 65 29 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  ine)...      #..
33f0: 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20        if {[info 
3400: 65 78 69 73 74 73 20 3a 3a 74 65 73 74 5f 63 6f  exists ::test_co
3410: 6e 66 69 67 75 72 61 74 69 6f 6e 73 5d 20 26 26  nfigurations] &&
3420: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 6c   \..          [l
3430: 6c 65 6e 67 74 68 20 24 3a 3a 74 65 73 74 5f 63  length $::test_c
3440: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 73 5d 20 3e  onfigurations] >
3450: 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
3460: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
3470: 20 4e 4f 54 45 3a 20 55 73 65 20 74 68 65 20 73   NOTE: Use the s
3480: 70 65 63 69 66 69 65 64 20 6c 69 73 74 20 6f 66  pecified list of
3490: 20 74 65 73 74 20 63 6f 6e 66 69 67 75 72 61 74   test configurat
34a0: 69 6f 6e 73 2e 0d 0a 20 20 20 20 20 20 20 20 23  ions...        #
34b0: 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ..        return
34c0: 20 24 3a 3a 74 65 73 74 5f 63 6f 6e 66 69 67 75   $::test_configu
34d0: 72 61 74 69 6f 6e 73 0d 0a 20 20 20 20 20 20 7d  rations..      }
34e0: 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
34f0: 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
3500: 54 45 3a 20 55 73 65 20 74 68 65 20 64 65 66 61  TE: Use the defa
3510: 75 6c 74 20 6c 69 73 74 20 6f 66 20 74 65 73 74  ult list of test
3520: 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 73 2e   configurations.
3530: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
3540: 20 20 20 20 20 72 65 74 75 72 6e 20 5b 6c 69 73       return [lis
3550: 74 20 44 65 62 75 67 20 52 65 6c 65 61 73 65 5d  t Debug Release]
3560: 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d  ..      }..    }
3570: 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65  .....    proc ge
3580: 74 42 75 69 6c 64 42 61 73 65 44 69 72 65 63 74  tBuildBaseDirect
3590: 6f 72 79 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20  ory {} {..      
35a0: 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
35b0: 20 46 69 67 75 72 65 20 6f 75 74 20 74 68 65 20   Figure out the 
35c0: 62 61 73 65 20 64 69 72 65 63 74 6f 72 79 20 77  base directory w
35d0: 68 65 72 65 20 61 6c 6c 20 74 68 65 20 62 75 69  here all the bui
35e0: 6c 64 73 20 73 68 6f 75 6c 64 20 62 65 0d 0a 20  lds should be.. 
35f0: 20 20 20 20 20 23 20 20 20 20 20 20 20 6c 6f 63       #       loc
3600: 61 74 65 64 2e 20 20 54 68 69 73 20 77 69 6c 6c  ated.  This will
3610: 20 62 65 20 74 68 65 20 64 69 72 65 63 74 6f 72   be the director
3620: 79 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20  y that contains 
3630: 74 68 65 20 61 63 74 75 61 6c 0d 0a 20 20 20 20  the actual..    
3640: 20 20 23 20 20 20 20 20 20 20 62 75 69 6c 64 20    #       build 
3650: 6f 75 74 70 75 74 20 64 69 72 65 63 74 6f 72 79  output directory
3660: 20 28 65 2e 67 2e 20 70 61 72 65 6e 74 20 6f 66   (e.g. parent of
3670: 20 22 62 69 6e 22 29 2e 0d 0a 20 20 20 20 20 20   "bin")...      
3680: 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 6e  #..      if {[in
3690: 66 6f 20 65 78 69 73 74 73 20 3a 3a 62 75 69 6c  fo exists ::buil
36a0: 64 5f 62 61 73 65 5f 64 69 72 65 63 74 6f 72 79  d_base_directory
36b0: 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20  ] && \..        
36c0: 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68    [string length
36d0: 20 24 3a 3a 62 75 69 6c 64 5f 62 61 73 65 5f 64   $::build_base_d
36e0: 69 72 65 63 74 6f 72 79 5d 20 3e 20 30 7d 20 74  irectory] > 0} t
36f0: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  hen {..        #
3700: 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
3710: 3a 20 54 68 65 20 6c 6f 63 61 74 69 6f 6e 20 6f  : The location o
3720: 66 20 74 68 65 20 62 75 69 6c 64 20 62 61 73 65  f the build base
3730: 20 64 69 72 65 63 74 6f 72 79 20 68 61 73 20 62   directory has b
3740: 65 65 6e 20 6f 76 65 72 72 69 64 64 65 6e 3b 0d  een overridden;.
3750: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
3760: 20 74 68 65 72 65 66 6f 72 65 2c 20 75 73 65 20   therefore, use 
3770: 69 74 20 76 65 72 62 61 74 69 6d 2e 0d 0a 20 20  it verbatim...  
3780: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
3790: 20 72 65 74 75 72 6e 20 24 3a 3a 62 75 69 6c 64   return $::build
37a0: 5f 62 61 73 65 5f 64 69 72 65 63 74 6f 72 79 0d  _base_directory.
37b0: 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 69 66 20  .      } elseif 
37c0: 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  {[info exists ::
37d0: 63 6f 6d 6d 6f 6e 5f 64 69 72 65 63 74 6f 72 79  common_directory
37e0: 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20  ] && \..        
37f0: 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68    [string length
3800: 20 24 3a 3a 63 6f 6d 6d 6f 6e 5f 64 69 72 65 63   $::common_direc
3810: 74 6f 72 79 5d 20 3e 20 30 7d 20 74 68 65 6e 20  tory] > 0} then 
3820: 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
3830: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4e 65        # NOTE: Ne
3840: 78 74 2c 20 66 61 6c 6c 62 61 63 6b 20 74 6f 20  xt, fallback to 
3850: 74 68 65 20 67 72 61 6e 64 70 61 72 65 6e 74 20  the grandparent 
3860: 64 69 72 65 63 74 6f 72 79 20 6f 66 20 74 68 65  directory of the
3870: 20 6f 6e 65 0d 0a 20 20 20 20 20 20 20 20 23 20   one..        # 
3880: 20 20 20 20 20 20 63 6f 6e 74 61 69 6e 69 6e 67        containing
3890: 20 74 68 69 73 20 66 69 6c 65 20 28 69 2e 65 2e   this file (i.e.
38a0: 20 22 63 6f 6d 6d 6f 6e 2e 65 61 67 6c 65 22 29   "common.eagle")
38b0: 2c 20 69 66 20 61 76 61 69 6c 61 62 6c 65 2e 0d  , if available..
38c0: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
38d0: 20 20 20 20 72 65 74 75 72 6e 20 5b 66 69 6c 65      return [file
38e0: 20 64 69 72 6e 61 6d 65 20 5b 66 69 6c 65 20 64   dirname [file d
38f0: 69 72 6e 61 6d 65 20 24 3a 3a 63 6f 6d 6d 6f 6e  irname $::common
3900: 5f 64 69 72 65 63 74 6f 72 79 5d 5d 0d 0a 20 20  _directory]]..  
3910: 20 20 20 20 7d 20 65 6c 73 65 69 66 20 7b 5b 69      } elseif {[i
3920: 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 70 61 74  nfo exists ::pat
3930: 68 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20  h] && \..       
3940: 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74     [string lengt
3950: 68 20 24 3a 3a 70 61 74 68 5d 20 3e 20 30 7d 20  h $::path] > 0} 
3960: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
3970: 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
3980: 45 3a 20 46 69 6e 61 6c 6c 79 2c 20 66 61 6c 6c  E: Finally, fall
3990: 62 61 63 6b 20 74 6f 20 74 68 65 20 70 61 72 65  back to the pare
39a0: 6e 74 20 64 69 72 65 63 74 6f 72 79 20 6f 66 20  nt directory of 
39b0: 74 68 65 20 45 61 67 6c 65 54 65 73 74 0d 0a 20  the EagleTest.. 
39c0: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 70         #       p
39d0: 61 74 68 2e 20 20 54 68 65 20 45 61 67 6c 65 54  ath.  The EagleT
39e0: 65 73 74 20 70 61 63 6b 61 67 65 20 67 75 61 72  est package guar
39f0: 61 6e 74 65 65 73 20 74 68 61 74 20 74 68 69 73  antees that this
3a00: 20 76 61 72 69 61 62 6c 65 0d 0a 20 20 20 20 20   variable..     
3a10: 20 20 20 23 20 20 20 20 20 20 20 77 69 6c 6c 20     #       will 
3a20: 62 65 20 73 65 74 20 74 6f 20 74 68 65 20 64 69  be set to the di
3a30: 72 65 63 74 6f 72 79 20 63 6f 6e 74 61 69 6e 69  rectory containi
3a40: 6e 67 20 74 68 65 20 66 69 72 73 74 20 66 69 6c  ng the first fil
3a50: 65 20 74 6f 0d 0a 20 20 20 20 20 20 20 20 23 20  e to..        # 
3a60: 20 20 20 20 20 20 65 78 65 63 75 74 65 20 74 68        execute th
3a70: 65 20 5b 72 75 6e 54 65 73 74 50 72 6f 6c 6f 67  e [runTestProlog
3a80: 75 65 5d 20 73 63 72 69 70 74 20 6c 69 62 72 61  ue] script libra
3a90: 72 79 20 70 72 6f 63 65 64 75 72 65 2e 0d 0a 20  ry procedure... 
3aa0: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
3ab0: 20 20 72 65 74 75 72 6e 20 5b 66 69 6c 65 20 64    return [file d
3ac0: 69 72 6e 61 6d 65 20 24 3a 3a 70 61 74 68 5d 0d  irname $::path].
3ad0: 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d  .      } else {.
3ae0: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
3af0: 20 20 20 20 23 20 4e 4f 54 45 3a 20 4e 6f 20 70      # NOTE: No p
3b00: 61 74 68 20 69 73 20 61 76 61 69 6c 61 62 6c 65  ath is available
3b10: 2c 20 72 65 74 75 72 6e 20 61 6e 20 65 6d 70 74  , return an empt
3b20: 79 20 73 74 72 69 6e 67 2e 20 20 54 68 69 73 20  y string.  This 
3b30: 70 6f 69 6e 74 0d 0a 20 20 20 20 20 20 20 20 23  point..        #
3b40: 20 20 20 20 20 20 20 73 68 6f 75 6c 64 20 6e 6f         should no
3b50: 74 20 62 65 20 72 65 61 63 68 65 64 2e 0d 0a 20  t be reached... 
3b60: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
3b70: 20 20 72 65 74 75 72 6e 20 22 22 0d 0a 20 20 20    return ""..   
3b80: 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a     }..    }.....
3b90: 20 20 20 20 70 72 6f 63 20 67 65 74 53 51 4c 69      proc getSQLi
3ba0: 74 65 54 65 73 74 44 61 74 61 50 61 74 68 20 7b  teTestDataPath {
3bb0: 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  } {..      #..  
3bc0: 20 20 20 20 23 20 4e 4f 54 45 3a 20 46 69 67 75      # NOTE: Figu
3bd0: 72 65 20 6f 75 74 20 74 68 65 20 64 69 72 65 63  re out the direc
3be0: 74 6f 72 79 20 77 68 65 72 65 20 61 6c 6c 20 74  tory where all t
3bf0: 68 65 20 74 65 73 74 20 64 61 74 61 20 66 69 6c  he test data fil
3c00: 65 73 20 73 68 6f 75 6c 64 0d 0a 20 20 20 20 20  es should..     
3c10: 20 23 20 20 20 20 20 20 20 62 65 20 6c 6f 63 61   #       be loca
3c20: 74 65 64 2e 20 20 54 68 69 73 20 73 68 6f 75 6c  ted.  This shoul
3c30: 64 20 62 65 20 74 68 65 20 22 64 61 74 61 22 20  d be the "data" 
3c40: 64 69 72 65 63 74 6f 72 79 20 62 65 6e 65 61 74  directory beneat
3c50: 68 20 74 68 65 0d 0a 20 20 20 20 20 20 23 20 20  h the..      #  
3c60: 20 20 20 20 20 64 69 72 65 63 74 6f 72 79 20 63       directory c
3c70: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 61 63  ontaining the ac
3c80: 74 75 61 6c 20 74 65 73 74 20 73 63 72 69 70 74  tual test script
3c90: 73 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  s...      #..   
3ca0: 20 20 20 72 65 74 75 72 6e 20 5b 66 69 6c 65 20     return [file 
3cb0: 6a 6f 69 6e 20 24 3a 3a 70 61 74 68 20 64 61 74  join $::path dat
3cc0: 61 5d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20  a]..    }.....  
3cd0: 20 20 70 72 6f 63 20 69 73 52 75 6e 6e 69 6e 67    proc isRunning
3ce0: 57 6f 57 36 34 20 7b 7d 20 7b 0d 0a 20 20 20 20  WoW64 {} {..    
3cf0: 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
3d00: 45 3a 20 46 6f 72 20 6e 6f 77 2c 20 6a 75 73 74  E: For now, just
3d10: 20 75 73 65 20 74 68 65 20 65 78 69 73 74 69 6e   use the existin
3d20: 67 20 74 65 73 74 20 63 6f 6e 73 74 72 61 69 6e  g test constrain
3d30: 74 20 66 6f 72 20 64 65 74 65 63 74 69 6e 67 0d  t for detecting.
3d40: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 61  .      #       a
3d50: 20 57 6f 57 36 34 20 70 72 6f 63 65 73 73 2e 0d   WoW64 process..
3d60: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
3d70: 72 65 74 75 72 6e 20 5b 68 61 76 65 43 6f 6e 73  return [haveCons
3d80: 74 72 61 69 6e 74 20 77 6f 77 36 34 5d 0d 0a 20  traint wow64].. 
3d90: 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
3da0: 63 20 69 73 4d 69 78 65 64 4d 6f 64 65 41 73 73  c isMixedModeAss
3db0: 65 6d 62 6c 79 20 7b 20 66 69 6c 65 4e 61 6d 65  embly { fileName
3dc0: 20 7b 76 61 72 4e 61 6d 65 20 22 22 7d 20 7d 20   {varName ""} } 
3dd0: 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  {..      #..    
3de0: 20 20 23 20 4e 4f 54 45 3a 20 46 69 72 73 74 2c    # NOTE: First,
3df0: 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20 74   make sure the t
3e00: 65 73 74 20 73 75 69 74 65 20 69 6e 66 72 61 73  est suite infras
3e10: 74 72 75 63 74 75 72 65 20 69 73 20 61 6c 6c 6f  tructure is allo
3e20: 77 65 64 20 74 6f 0d 0a 20 20 20 20 20 20 23 20  wed to..      # 
3e30: 20 20 20 20 20 20 75 73 65 20 74 68 65 20 5b 65        use the [e
3e40: 78 65 63 5d 20 63 6f 6d 6d 61 6e 64 2e 0d 0a 20  xec] command... 
3e50: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66       #..      if
3e60: 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20   {![info exists 
3e70: 3a 3a 6e 6f 28 65 78 65 63 29 5d 20 26 26 20 21  ::no(exec)] && !
3e80: 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e  [info exists ::n
3e90: 6f 28 63 6f 72 46 6c 61 67 73 29 5d 7d 20 74 68  o(corFlags)]} th
3ea0: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d  en {..        #.
3eb0: 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
3ec0: 20 49 66 20 74 68 65 20 6c 6f 63 61 74 69 6f 6e   If the location
3ed0: 20 6f 66 20 43 6f 72 46 6c 61 67 73 20 69 73 20   of CorFlags is 
3ee0: 70 72 65 73 65 6e 74 20 69 6e 20 74 68 65 20 65  present in the e
3ef0: 6e 76 69 72 6f 6e 6d 65 6e 74 2c 0d 0a 20 20 20  nvironment,..   
3f00: 20 20 20 20 20 23 20 20 20 20 20 20 20 75 73 65       #       use
3f10: 20 69 74 3b 20 6f 74 68 65 72 77 69 73 65 20 61   it; otherwise a
3f20: 73 73 75 6d 65 20 69 74 20 69 73 20 69 6e 20 74  ssume it is in t
3f30: 68 65 20 50 41 54 48 2e 0d 0a 20 20 20 20 20 20  he PATH...      
3f40: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 73 65 74    #..        set
3f50: 20 63 6f 72 46 6c 61 67 73 20 5b 65 78 70 72 20   corFlags [expr 
3f60: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 69 6e  {..          [in
3f70: 66 6f 20 65 78 69 73 74 73 20 3a 3a 65 6e 76 28  fo exists ::env(
3f80: 43 6f 72 46 6c 61 67 73 29 5d 20 3f 20 24 3a 3a  CorFlags)] ? $::
3f90: 65 6e 76 28 43 6f 72 46 6c 61 67 73 29 20 3a 20  env(CorFlags) : 
3fa0: 22 43 6f 72 46 6c 61 67 73 22 0d 0a 20 20 20 20  "CorFlags"..    
3fb0: 20 20 20 20 7d 5d 0d 0a 0d 0a 20 20 20 20 20 20      }]....      
3fc0: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
3fd0: 4f 54 45 3a 20 41 74 74 65 6d 70 74 20 74 6f 20  OTE: Attempt to 
3fe0: 65 78 65 63 75 74 65 20 43 6f 72 46 6c 61 67 73  execute CorFlags
3ff0: 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69 65   on the specifie
4000: 64 20 66 69 6c 65 2e 0d 0a 20 20 20 20 20 20 20  d file...       
4010: 20 23 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b   #..        if {
4020: 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20  [catch {..      
4030: 20 20 20 20 65 78 65 63 20 2d 2d 20 24 63 6f 72      exec -- $cor
4040: 46 6c 61 67 73 20 5b 66 69 6c 65 20 6e 61 74 69  Flags [file nati
4050: 76 65 6e 61 6d 65 20 24 66 69 6c 65 4e 61 6d 65  vename $fileName
4060: 5d 0d 0a 20 20 20 20 20 20 20 20 7d 20 65 78 65  ]..        } exe
4070: 63 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d  c] == 0} then {.
4080: 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
4090: 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
40a0: 49 66 20 72 65 71 75 65 73 74 65 64 20 62 79 20  If requested by 
40b0: 6f 75 72 20 63 61 6c 6c 65 72 2c 20 61 74 74 65  our caller, atte
40c0: 6d 70 74 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  mpt to determine
40d0: 20 74 68 65 0d 0a 20 20 20 20 20 20 20 20 20 20   the..          
40e0: 23 20 20 20 20 20 20 20 70 6c 61 74 66 6f 72 6d  #       platform
40f0: 20 66 6f 72 20 74 68 65 20 73 70 65 63 69 66 69   for the specifi
4100: 65 64 20 66 69 6c 65 20 61 73 20 77 65 6c 6c 2e  ed file as well.
4110: 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20  ..          #.. 
4120: 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73 74           if {[st
4130: 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 76 61 72  ring length $var
4140: 4e 61 6d 65 5d 20 3e 20 30 7d 20 74 68 65 6e 20  Name] > 0} then 
4150: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23  {..            #
4160: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 20  ..            # 
4170: 4e 4f 54 45 3a 20 53 74 6f 72 65 20 74 68 65 20  NOTE: Store the 
4180: 70 6c 61 74 66 6f 72 6d 20 69 6e 20 74 68 65 20  platform in the 
4190: 6e 61 6d 65 64 20 76 61 72 69 61 62 6c 65 20 69  named variable i
41a0: 6e 20 74 68 65 0d 0a 20 20 20 20 20 20 20 20 20  n the..         
41b0: 20 20 20 23 20 20 20 20 20 20 20 63 6f 6e 74 65     #       conte
41c0: 78 74 20 6f 66 20 6f 75 72 20 63 61 6c 6c 65 72  xt of our caller
41d0: 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23  ...            #
41e0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 75 70  ..            up
41f0: 76 61 72 20 31 20 24 76 61 72 4e 61 6d 65 20 70  var 1 $varName p
4200: 6c 61 74 66 6f 72 6d 0d 0a 0d 0a 20 20 20 20 20  latform....     
4210: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
4220: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 74        # NOTE: At
4230: 74 65 6d 70 74 20 74 6f 20 65 78 74 72 61 63 74  tempt to extract
4240: 20 74 68 65 20 50 45 20 6c 69 6e 65 20 66 72 6f   the PE line fro
4250: 6d 20 74 68 65 20 63 61 70 74 75 72 65 64 0d 0a  m the captured..
4260: 20 20 20 20 20 20 20 20 20 20 20 20 23 20 20 20              #   
4270: 20 20 20 20 6f 75 74 70 75 74 2e 20 20 49 66 20      output.  If 
4280: 74 68 69 73 20 76 61 6c 75 65 20 69 73 20 22 50  this value is "P
4290: 45 33 32 22 20 6f 72 20 22 50 45 33 32 2b 22 2c  E32" or "PE32+",
42a0: 20 74 68 65 0d 0a 20 20 20 20 20 20 20 20 20 20   the..          
42b0: 20 20 23 20 20 20 20 20 20 20 61 73 73 65 6d 62    #       assemb
42c0: 6c 79 20 66 69 6c 65 20 69 73 20 33 32 2d 62 69  ly file is 32-bi
42d0: 74 20 6f 72 20 36 34 2d 62 69 74 2c 20 72 65 73  t or 64-bit, res
42e0: 70 65 63 74 69 76 65 6c 79 3b 0d 0a 20 20 20 20  pectively;..    
42f0: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
4300: 6f 74 68 65 72 77 69 73 65 2c 20 69 74 73 20 74  otherwise, its t
4310: 79 70 65 20 69 73 20 75 6e 6b 6e 6f 77 6e 2e 0d  ype is unknown..
4320: 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a  .            #..
4330: 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20              set 
4340: 70 61 74 74 65 72 6e 20 7b 5e 50 45 20 20 20 20  pattern {^PE    
4350: 20 20 20 20 3a 20 28 50 45 33 32 7c 50 45 33 32      : (PE32|PE32
4360: 5c 2b 29 5c 73 2b 24 7d 0d 0a 0d 0a 20 20 20 20  \+)\s+$}....    
4370: 20 20 20 20 20 20 20 20 69 66 20 7b 5b 72 65 67          if {[reg
4380: 65 78 70 20 2d 6c 69 6e 65 20 2d 2d 20 24 70 61  exp -line -- $pa
4390: 74 74 65 72 6e 20 24 65 78 65 63 20 64 75 6d 6d  ttern $exec dumm
43a0: 79 20 70 65 33 32 5d 7d 20 74 68 65 6e 20 7b 0d  y pe32]} then {.
43b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23  .              #
43c0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
43d0: 23 20 48 41 43 4b 3a 20 54 68 69 73 20 5b 73 77  # HACK: This [sw
43e0: 69 74 63 68 5d 20 61 73 73 75 6d 65 73 20 74 68  itch] assumes th
43f0: 61 74 20 33 32 2d 62 69 74 20 65 78 65 63 75 74  at 32-bit execut
4400: 61 62 6c 65 73 20 61 72 65 0d 0a 20 20 20 20 20  ables are..     
4410: 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20           #      
4420: 20 61 6c 77 61 79 73 20 78 38 36 20 61 6e 64 20   always x86 and 
4430: 74 68 61 74 20 36 34 2d 62 69 74 20 65 78 65 63  that 64-bit exec
4440: 75 74 61 62 6c 65 73 20 61 72 65 20 61 6c 77 61  utables are alwa
4450: 79 73 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ys..            
4460: 20 20 23 20 20 20 20 20 20 20 78 36 34 2e 0d 0a    #       x64...
4470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 0d                #.
4480: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
4490: 77 69 74 63 68 20 2d 65 78 61 63 74 20 2d 2d 20  witch -exact -- 
44a0: 24 70 65 33 32 20 7b 0d 0a 20 20 20 20 20 20 20  $pe32 {..       
44b0: 20 20 20 20 20 20 20 20 20 50 45 33 32 20 7b 0d           PE32 {.
44c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
44d0: 20 20 20 73 65 74 20 70 6c 61 74 66 6f 72 6d 20     set platform 
44e0: 57 69 6e 33 32 0d 0a 20 20 20 20 20 20 20 20 20  Win32..         
44f0: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
4500: 20 20 20 20 20 20 20 20 20 20 50 45 33 32 2b 20            PE32+ 
4510: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
4520: 20 20 20 20 20 73 65 74 20 70 6c 61 74 66 6f 72       set platfor
4530: 6d 20 78 36 34 0d 0a 20 20 20 20 20 20 20 20 20  m x64..         
4540: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
4550: 20 20 20 20 20 20 20 20 20 20 64 65 66 61 75 6c            defaul
4560: 74 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  t {..           
4570: 20 20 20 20 20 20 20 73 65 74 20 70 6c 61 74 66         set platf
4580: 6f 72 6d 20 22 22 0d 0a 20 20 20 20 20 20 20 20  orm ""..        
4590: 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
45a0: 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
45b0: 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b          } else {
45c0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
45d0: 73 65 74 20 70 6c 61 74 66 6f 72 6d 20 22 22 0d  set platform "".
45e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  .            }..
45f0: 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20            }.... 
4600: 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
4610: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 74        # NOTE: At
4620: 74 65 6d 70 74 20 74 6f 20 65 78 74 72 61 63 74  tempt to extract
4630: 20 74 68 65 20 49 4c 4f 4e 4c 59 20 6c 69 6e 65   the ILONLY line
4640: 20 66 72 6f 6d 20 74 68 65 20 63 61 70 74 75 72   from the captur
4650: 65 64 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20  ed..          # 
4660: 20 20 20 20 20 20 6f 75 74 70 75 74 2e 20 20 49        output.  I
4670: 66 20 74 68 69 73 20 76 61 6c 75 65 20 69 73 20  f this value is 
4680: 7a 65 72 6f 2c 20 74 68 65 20 73 70 65 63 69 66  zero, the specif
4690: 69 65 64 20 66 69 6c 65 20 6d 75 73 74 0d 0a 20  ied file must.. 
46a0: 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20           #      
46b0: 20 62 65 20 61 20 6d 69 78 65 64 2d 6d 6f 64 65   be a mixed-mode
46c0: 20 61 73 73 65 6d 62 6c 79 3b 20 6f 74 68 65 72   assembly; other
46d0: 77 69 73 65 2c 20 69 74 20 63 6f 6e 74 61 69 6e  wise, it contain
46e0: 73 20 6f 6e 6c 79 0d 0a 20 20 20 20 20 20 20 20  s only..        
46f0: 20 20 23 20 20 20 20 20 20 20 6d 61 6e 61 67 65    #       manage
4700: 64 20 63 6f 6d 70 6f 6e 65 6e 74 73 2e 0d 0a 20  d components... 
4710: 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
4720: 20 20 20 20 20 20 73 65 74 20 70 61 74 74 65 72        set patter
4730: 6e 20 7b 5e 49 4c 4f 4e 4c 59 20 20 20 20 3a 20  n {^ILONLY    : 
4740: 28 30 7c 31 29 5c 73 2b 24 7d 0d 0a 0d 0a 20 20  (0|1)\s+$}....  
4750: 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 72 65          if {![re
4760: 67 65 78 70 20 2d 6c 69 6e 65 20 2d 2d 20 24 70  gexp -line -- $p
4770: 61 74 74 65 72 6e 20 24 65 78 65 63 20 64 75 6d  attern $exec dum
4780: 6d 79 20 69 6c 4f 6e 6c 79 5d 7d 20 74 68 65 6e  my ilOnly]} then
4790: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
47a0: 72 65 74 75 72 6e 20 66 61 6c 73 65 0d 0a 20 20  return false..  
47b0: 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
47c0: 20 20 20 20 20 20 20 69 66 20 7b 21 24 69 6c 4f         if {!$ilO
47d0: 6e 6c 79 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  nly} then {..   
47e0: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
47f0: 74 72 75 65 0d 0a 20 20 20 20 20 20 20 20 20 20  true..          
4800: 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  }..        }..  
4810: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23      }....      #
4820: 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
4830: 49 66 20 74 68 65 20 74 65 73 74 20 73 75 69 74  If the test suit
4840: 65 20 63 61 6e 6e 6f 74 20 75 73 65 20 5b 65 78  e cannot use [ex
4850: 65 63 5d 20 6f 72 20 65 78 65 63 75 74 69 6f 6e  ec] or execution
4860: 20 6f 66 20 43 6f 72 46 6c 61 67 73 0d 0a 20 20   of CorFlags..  
4870: 20 20 20 20 23 20 20 20 20 20 20 20 66 61 69 6c      #       fail
4880: 65 64 2c 20 72 65 74 75 72 6e 20 66 61 6c 73 65  ed, return false
4890: 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
48a0: 20 20 72 65 74 75 72 6e 20 66 61 6c 73 65 0d 0a    return false..
48b0: 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
48c0: 6f 63 20 67 65 74 4e 61 74 69 76 65 4c 69 62 72  oc getNativeLibr
48d0: 61 72 79 46 69 6c 65 4e 61 6d 65 73 4f 6e 6c 79  aryFileNamesOnly
48e0: 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a   {} {..      #..
48f0: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 46 69        # NOTE: Fi
4900: 72 73 74 2c 20 63 68 65 63 6b 20 69 66 20 74 68  rst, check if th
4910: 65 20 6c 69 73 74 20 6f 66 20 6e 61 74 69 76 65  e list of native
4920: 20 6c 69 62 72 61 72 79 20 66 69 6c 65 20 6e 61   library file na
4930: 6d 65 73 20 68 61 73 20 62 65 65 6e 0d 0a 20 20  mes has been..  
4940: 20 20 20 20 23 20 20 20 20 20 20 20 6d 61 6e 75      #       manu
4950: 61 6c 6c 79 20 6f 76 65 72 72 69 64 64 65 6e 2e  ally overridden.
4960: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
4970: 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74   if {[info exist
4980: 73 20 3a 3a 6e 61 74 69 76 65 5f 6c 69 62 72 61  s ::native_libra
4990: 72 79 5f 66 69 6c 65 5f 6e 61 6d 65 73 5d 20 26  ry_file_names] &
49a0: 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b  & \..          [
49b0: 6c 6c 65 6e 67 74 68 20 24 3a 3a 6e 61 74 69 76  llength $::nativ
49c0: 65 5f 6c 69 62 72 61 72 79 5f 66 69 6c 65 5f 6e  e_library_file_n
49d0: 61 6d 65 73 5d 20 3e 20 30 7d 20 74 68 65 6e 20  ames] > 0} then 
49e0: 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
49f0: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68        # NOTE: Th
4a00: 65 20 6c 69 73 74 20 6f 66 20 6e 61 74 69 76 65  e list of native
4a10: 20 6c 69 62 72 61 72 79 20 66 69 6c 65 20 6e 61   library file na
4a20: 6d 65 73 20 68 61 73 20 62 65 65 6e 20 6f 76 65  mes has been ove
4a30: 72 72 69 64 64 65 6e 3b 0d 0a 20 20 20 20 20 20  rridden;..      
4a40: 20 20 23 20 20 20 20 20 20 20 74 68 65 72 65 66    #       theref
4a50: 6f 72 65 2c 20 75 73 65 20 69 74 20 76 65 72 62  ore, use it verb
4a60: 61 74 69 6d 2e 0d 0a 20 20 20 20 20 20 20 20 23  atim...        #
4a70: 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ..        return
4a80: 20 24 3a 3a 6e 61 74 69 76 65 5f 6c 69 62 72 61   $::native_libra
4a90: 72 79 5f 66 69 6c 65 5f 6e 61 6d 65 73 0d 0a 20  ry_file_names.. 
4aa0: 20 20 20 20 20 7d 20 65 6c 73 65 69 66 20 7b 5b       } elseif {[
4ab0: 69 73 57 69 6e 64 6f 77 73 5d 7d 20 74 68 65 6e  isWindows]} then
4ac0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20   {..        #.. 
4ad0: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4f         # NOTE: O
4ae0: 74 68 65 72 77 69 73 65 2c 20 6f 6e 20 57 69 6e  therwise, on Win
4af0: 64 6f 77 73 2c 20 61 6c 77 61 79 73 20 75 73 65  dows, always use
4b00: 20 74 68 65 20 64 65 66 61 75 6c 74 20 66 69 6c   the default fil
4b10: 65 20 6e 61 6d 65 0d 0a 20 20 20 20 20 20 20 20  e name..        
4b20: 23 20 20 20 20 20 20 20 22 73 71 6c 69 74 65 33  #       "sqlite3
4b30: 2e 64 6c 6c 22 2e 0d 0a 20 20 20 20 20 20 20 20  .dll"...        
4b40: 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  #..        retur
4b50: 6e 20 5b 6c 69 73 74 20 73 71 6c 69 74 65 33 2e  n [list sqlite3.
4b60: 64 6c 6c 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c  dll]..      } el
4b70: 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d  se {..        #.
4b80: 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
4b90: 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65 74 75   Otherwise, retu
4ba0: 72 6e 20 62 6f 74 68 20 74 68 65 20 67 65 6e 65  rn both the gene
4bb0: 72 69 63 20 50 4f 53 49 58 20 66 69 6c 65 20 6e  ric POSIX file n
4bc0: 61 6d 65 20 61 6e 64 20 74 68 65 0d 0a 20 20 20  ame and the..   
4bd0: 20 20 20 20 20 23 20 20 20 20 20 20 20 4d 61 63       #       Mac
4be0: 20 4f 53 20 58 20 66 69 6c 65 20 6e 61 6d 65 2c   OS X file name,
4bf0: 20 73 69 6e 63 65 20 77 65 20 64 6f 20 6e 6f 74   since we do not
4c00: 20 63 75 72 72 65 6e 74 6c 79 20 68 61 76 65 20   currently have 
4c10: 61 6e 20 65 61 73 79 0d 0a 20 20 20 20 20 20 20  an easy..       
4c20: 20 23 20 20 20 20 20 20 20 77 61 79 20 74 6f 20   #       way to 
4c30: 64 65 74 65 63 74 20 77 68 69 63 68 20 6f 66 20  detect which of 
4c40: 74 68 6f 73 65 20 70 6c 61 74 66 6f 72 6d 73 20  those platforms 
4c50: 77 65 20 61 72 65 20 72 75 6e 6e 69 6e 67 20 6f  we are running o
4c60: 6e 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  n...        #.. 
4c70: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b 6c         return [l
4c80: 69 73 74 20 6c 69 62 73 71 6c 69 74 65 33 2e 64  ist libsqlite3.d
4c90: 79 6c 69 62 20 6c 69 62 73 71 6c 69 74 65 33 2e  ylib libsqlite3.
4ca0: 73 6f 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20  so]..      }..  
4cb0: 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
4cc0: 20 67 65 74 49 6e 74 65 72 6f 70 41 73 73 65 6d   getInteropAssem
4cd0: 62 6c 79 46 69 6c 65 4e 61 6d 65 73 4f 6e 6c 79  blyFileNamesOnly
4ce0: 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a   {} {..      #..
4cf0: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 46 69        # NOTE: Fi
4d00: 72 73 74 2c 20 63 68 65 63 6b 20 69 66 20 74 68  rst, check if th
4d10: 65 20 6c 69 73 74 20 6f 66 20 69 6e 74 65 72 6f  e list of intero
4d20: 70 20 61 73 73 65 6d 62 6c 79 20 66 69 6c 65 20  p assembly file 
4d30: 6e 61 6d 65 73 20 68 61 73 20 62 65 65 6e 0d 0a  names has been..
4d40: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 6d 61        #       ma
4d50: 6e 75 61 6c 6c 79 20 6f 76 65 72 72 69 64 64 65  nually overridde
4d60: 6e 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  n...      #..   
4d70: 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69     if {[info exi
4d80: 73 74 73 20 3a 3a 69 6e 74 65 72 6f 70 5f 61 73  sts ::interop_as
4d90: 73 65 6d 62 6c 79 5f 66 69 6c 65 5f 6e 61 6d 65  sembly_file_name
4da0: 73 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20  s] && \..       
4db0: 20 20 20 5b 6c 6c 65 6e 67 74 68 20 24 3a 3a 69     [llength $::i
4dc0: 6e 74 65 72 6f 70 5f 61 73 73 65 6d 62 6c 79 5f  nterop_assembly_
4dd0: 66 69 6c 65 5f 6e 61 6d 65 73 5d 20 3e 20 30 7d  file_names] > 0}
4de0: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
4df0: 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
4e00: 54 45 3a 20 54 68 65 20 6c 69 73 74 20 6f 66 20  TE: The list of 
4e10: 69 6e 74 65 72 6f 70 20 61 73 73 65 6d 62 6c 79  interop assembly
4e20: 20 66 69 6c 65 20 6e 61 6d 65 73 20 68 61 73 20   file names has 
4e30: 62 65 65 6e 20 6f 76 65 72 72 69 64 64 65 6e 3b  been overridden;
4e40: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
4e50: 20 20 74 68 65 72 65 66 6f 72 65 2c 20 75 73 65    therefore, use
4e60: 20 69 74 20 76 65 72 62 61 74 69 6d 2e 0d 0a 20   it verbatim... 
4e70: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
4e80: 20 20 72 65 74 75 72 6e 20 24 3a 3a 69 6e 74 65    return $::inte
4e90: 72 6f 70 5f 61 73 73 65 6d 62 6c 79 5f 66 69 6c  rop_assembly_fil
4ea0: 65 5f 6e 61 6d 65 73 0d 0a 20 20 20 20 20 20 7d  e_names..      }
4eb0: 20 65 6c 73 65 69 66 20 7b 5b 69 73 57 69 6e 64   elseif {[isWind
4ec0: 6f 77 73 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ows]} then {..  
4ed0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
4ee0: 20 23 20 4e 4f 54 45 3a 20 4f 74 68 65 72 77 69   # NOTE: Otherwi
4ef0: 73 65 2c 20 6f 6e 20 57 69 6e 64 6f 77 73 2c 20  se, on Windows, 
4f00: 61 6c 77 61 79 73 20 75 73 65 20 74 68 65 20 64  always use the d
4f10: 65 66 61 75 6c 74 20 66 69 6c 65 20 6e 61 6d 65  efault file name
4f20: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
4f30: 20 20 22 53 51 4c 69 74 65 2e 49 6e 74 65 72 6f    "SQLite.Intero
4f40: 70 2e 64 6c 6c 22 2e 0d 0a 20 20 20 20 20 20 20  p.dll"...       
4f50: 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75   #..        retu
4f60: 72 6e 20 5b 6c 69 73 74 20 53 51 4c 69 74 65 2e  rn [list SQLite.
4f70: 49 6e 74 65 72 6f 70 2e 64 6c 6c 5d 0d 0a 20 20  Interop.dll]..  
4f80: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
4f90: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
4fa0: 20 23 20 4e 4f 54 45 3a 20 4f 74 68 65 72 77 69   # NOTE: Otherwi
4fb0: 73 65 2c 20 72 65 74 75 72 6e 20 62 6f 74 68 20  se, return both 
4fc0: 74 68 65 20 67 65 6e 65 72 69 63 20 50 4f 53 49  the generic POSI
4fd0: 58 20 66 69 6c 65 20 6e 61 6d 65 20 61 6e 64 20  X file name and 
4fe0: 74 68 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20  the..        #  
4ff0: 20 20 20 20 20 4d 61 63 20 4f 53 20 58 20 66 69       Mac OS X fi
5000: 6c 65 20 6e 61 6d 65 2c 20 73 69 6e 63 65 20 77  le name, since w
5010: 65 20 64 6f 20 6e 6f 74 20 63 75 72 72 65 6e 74  e do not current
5020: 6c 79 20 68 61 76 65 20 61 6e 20 65 61 73 79 0d  ly have an easy.
5030: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
5040: 20 77 61 79 20 74 6f 20 64 65 74 65 63 74 20 77   way to detect w
5050: 68 69 63 68 20 6f 66 20 74 68 6f 73 65 20 70 6c  hich of those pl
5060: 61 74 66 6f 72 6d 73 20 77 65 20 61 72 65 20 72  atforms we are r
5070: 75 6e 6e 69 6e 67 20 6f 6e 2e 0d 0a 20 20 20 20  unning on...    
5080: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72      #..        r
5090: 65 74 75 72 6e 20 5b 6c 69 73 74 20 6c 69 62 53  eturn [list libS
50a0: 51 4c 69 74 65 2e 49 6e 74 65 72 6f 70 2e 64 79  QLite.Interop.dy
50b0: 6c 69 62 20 6c 69 62 53 51 4c 69 74 65 2e 49 6e  lib libSQLite.In
50c0: 74 65 72 6f 70 2e 73 6f 5d 0d 0a 20 20 20 20 20  terop.so]..     
50d0: 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20   }..    }.....  
50e0: 20 20 70 72 6f 63 20 67 65 74 43 6f 72 65 45 78    proc getCoreEx
50f0: 74 65 6e 73 69 6f 6e 42 69 6e 61 72 79 46 69 6c  tensionBinaryFil
5100: 65 4e 61 6d 65 20 7b 20 7b 64 65 66 61 75 6c 74  eName { {default
5110: 20 22 22 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20   ""} } {..      
5120: 73 65 74 20 66 69 6c 65 4e 61 6d 65 20 5b 67 65  set fileName [ge
5130: 74 43 6f 72 65 42 69 6e 61 72 79 46 69 6c 65 4e  tCoreBinaryFileN
5140: 61 6d 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 69 66  ame]....      if
5150: 20 7b 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24   {[file exists $
5160: 66 69 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20  fileName]} then 
5170: 7b 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  {..        retur
5180: 6e 20 24 66 69 6c 65 4e 61 6d 65 0d 0a 20 20 20  n $fileName..   
5190: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65     }....      re
51a0: 74 75 72 6e 20 24 64 65 66 61 75 6c 74 0d 0a 20  turn $default.. 
51b0: 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
51c0: 63 20 69 73 42 75 69 6c 64 41 76 61 69 6c 61 62  c isBuildAvailab
51d0: 6c 65 20 7b 20 6e 61 74 69 76 65 20 64 69 72 65  le { native dire
51e0: 63 74 6f 72 79 20 7b 76 61 72 4e 61 6d 65 20 22  ctory {varName "
51f0: 22 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d  "} } {..      #.
5200: 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 42  .      # NOTE: B
5210: 75 69 6c 64 20 74 68 65 20 66 75 6c 6c 79 20 71  uild the fully q
5220: 75 61 6c 69 66 69 65 64 20 66 69 6c 65 20 6e 61  ualified file na
5230: 6d 65 20 66 6f 72 20 74 68 65 20 70 72 69 6d 61  me for the prima
5240: 72 79 20 61 73 73 65 6d 62 6c 79 0d 0a 20 20 20  ry assembly..   
5250: 20 20 20 23 20 20 20 20 20 20 20 63 6f 6e 74 61     #       conta
5260: 69 6e 69 6e 67 20 74 68 65 20 53 79 73 74 65 6d  ining the System
5270: 2e 44 61 74 61 2e 53 51 4c 69 74 65 20 6d 61 6e  .Data.SQLite man
5280: 61 67 65 64 20 63 6f 6d 70 6f 6e 65 6e 74 73 2e  aged components.
5290: 20 20 49 74 0d 0a 20 20 20 20 20 20 23 20 20 20    It..      #   
52a0: 20 20 20 20 73 68 6f 75 6c 64 20 62 65 20 6e 6f      should be no
52b0: 74 65 64 20 74 68 61 74 20 74 68 69 73 20 61 73  ted that this as
52c0: 73 65 6d 62 6c 79 20 66 69 6c 65 20 6d 61 79 20  sembly file may 
52d0: 61 6c 73 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65  also contain the
52e0: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
52f0: 6e 61 74 69 76 65 20 63 6f 6d 70 6f 6e 65 6e 74  native component
5300: 73 2c 20 69 66 20 61 20 6e 61 74 69 76 65 20 62  s, if a native b
5310: 75 69 6c 64 20 69 73 20 69 6e 20 75 73 65 2e 0d  uild is in use..
5320: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
5330: 73 65 74 20 66 69 6c 65 4e 61 6d 65 20 5b 66 69  set fileName [fi
5340: 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65 20 5b 66  le nativename [f
5350: 69 6c 65 20 6a 6f 69 6e 20 24 64 69 72 65 63 74  ile join $direct
5360: 6f 72 79 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ory \..         
5370: 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c   System.Data.SQL
5380: 69 74 65 2e 64 6c 6c 5d 5d 0d 0a 0d 0a 20 20 20  ite.dll]]....   
5390: 20 20 20 69 66 20 7b 21 5b 66 69 6c 65 20 65 78     if {![file ex
53a0: 69 73 74 73 20 24 66 69 6c 65 4e 61 6d 65 5d 7d  ists $fileName]}
53b0: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
53c0: 20 72 65 74 75 72 6e 20 66 61 6c 73 65 0d 0a 20   return false.. 
53d0: 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
53e0: 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
53f0: 20 41 74 74 65 6d 70 74 20 74 6f 20 61 75 74 6f   Attempt to auto
5400: 6d 61 74 69 63 61 6c 6c 79 20 64 65 74 65 63 74  matically detect
5410: 20 69 66 20 74 68 65 20 70 72 69 6d 61 72 79 20   if the primary 
5420: 61 73 73 65 6d 62 6c 79 0d 0a 20 20 20 20 20 20  assembly..      
5430: 23 20 20 20 20 20 20 20 63 6f 6e 74 61 69 6e 73  #       contains
5440: 20 61 6e 79 20 6e 61 74 69 76 65 20 63 6f 6d 70   any native comp
5450: 6f 6e 65 6e 74 73 2c 20 69 66 20 6e 65 63 65 73  onents, if neces
5460: 73 61 72 79 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  sary...      #..
5470: 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e        if {[strin
5480: 67 20 6c 65 6e 67 74 68 20 24 6e 61 74 69 76 65  g length $native
5490: 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  ] == 0} then {..
54a0: 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72          if {[str
54b0: 69 6e 67 20 6c 65 6e 67 74 68 20 24 76 61 72 4e  ing length $varN
54c0: 61 6d 65 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b  ame] > 0} then {
54d0: 0d 0a 20 20 20 20 20 20 20 20 20 20 75 70 76 61  ..          upva
54e0: 72 20 31 20 24 76 61 72 4e 61 6d 65 20 24 76 61  r 1 $varName $va
54f0: 72 4e 61 6d 65 0d 0a 20 20 20 20 20 20 20 20 7d  rName..        }
5500: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20  ....        set 
5510: 6e 61 74 69 76 65 20 5b 69 73 4d 69 78 65 64 4d  native [isMixedM
5520: 6f 64 65 41 73 73 65 6d 62 6c 79 20 24 66 69 6c  odeAssembly $fil
5530: 65 4e 61 6d 65 20 24 76 61 72 4e 61 6d 65 5d 0d  eName $varName].
5540: 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
5550: 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
5560: 45 3a 20 49 66 20 74 68 65 20 70 72 69 6d 61 72  E: If the primar
5570: 79 20 61 73 73 65 6d 62 6c 79 20 61 6c 73 6f 20  y assembly also 
5580: 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6e 61 74  contains the nat
5590: 69 76 65 20 63 6f 6d 70 6f 6e 65 6e 74 73 2c 0d  ive components,.
55a0: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 77  .      #       w
55b0: 65 20 68 61 76 65 20 65 76 65 72 79 74 68 69 6e  e have everythin
55c0: 67 20 77 65 20 6e 65 65 64 2e 0d 0a 20 20 20 20  g we need...    
55d0: 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 24    #..      if {$
55e0: 6e 61 74 69 76 65 7d 20 74 68 65 6e 20 7b 0d 0a  native} then {..
55f0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 74          return t
5600: 72 75 65 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a  rue..      }....
5610: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
5620: 20 4e 4f 54 45 3a 20 49 66 20 74 68 65 20 6d 61   NOTE: If the ma
5630: 63 68 69 6e 65 20 6e 61 6d 65 20 69 73 20 75 6e  chine name is un
5640: 61 76 61 69 6c 61 62 6c 65 2c 20 74 68 65 72 65  available, there
5650: 20 69 73 20 6e 6f 74 68 69 67 6e 20 65 6c 73 65   is nothign else
5660: 20 77 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20   we..      #    
5670: 20 20 20 63 61 6e 20 64 6f 2e 0d 0a 20 20 20 20     can do...    
5680: 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 21    #..      if {!
5690: 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 74  [info exists ::t
56a0: 63 6c 5f 70 6c 61 74 66 6f 72 6d 28 6d 61 63 68  cl_platform(mach
56b0: 69 6e 65 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  ine)]} then {.. 
56c0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 66 61         return fa
56d0: 6c 73 65 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a  lse..      }....
56e0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
56f0: 20 4e 4f 54 45 3a 20 57 68 61 74 20 69 73 20 74   NOTE: What is t
5700: 68 65 20 61 72 63 68 69 74 65 63 74 75 72 65 20  he architecture 
5710: 66 6f 72 20 74 68 69 73 20 6d 61 63 68 69 6e 65  for this machine
5720: 3f 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ?..      #..    
5730: 20 20 73 65 74 20 61 72 63 68 69 74 65 63 74 75    set architectu
5740: 72 65 20 5b 6d 61 63 68 69 6e 65 54 6f 50 6c 61  re [machineToPla
5750: 74 66 6f 72 6d 20 24 3a 3a 74 63 6c 5f 70 6c 61  tform $::tcl_pla
5760: 74 66 6f 72 6d 28 6d 61 63 68 69 6e 65 29 20 74  tform(machine) t
5770: 72 75 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d  rue]....      #.
5780: 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 57  .      # NOTE: W
5790: 68 61 74 20 69 73 20 74 68 65 20 70 6c 61 74 66  hat is the platf
57a0: 6f 72 6d 20 66 6f 72 20 74 68 69 73 20 6d 61 63  orm for this mac
57b0: 68 69 6e 65 3f 0d 0a 20 20 20 20 20 20 23 0d 0a  hine?..      #..
57c0: 20 20 20 20 20 20 73 65 74 20 70 6c 61 74 66 6f        set platfo
57d0: 72 6d 20 5b 6d 61 63 68 69 6e 65 54 6f 50 6c 61  rm [machineToPla
57e0: 74 66 6f 72 6d 20 24 3a 3a 74 63 6c 5f 70 6c 61  tform $::tcl_pla
57f0: 74 66 6f 72 6d 28 6d 61 63 68 69 6e 65 29 5d 0d  tform(machine)].
5800: 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
5810: 20 20 23 20 4e 4f 54 45 3a 20 42 75 69 6c 64 20    # NOTE: Build 
5820: 74 68 65 20 66 75 6c 6c 79 20 71 75 61 6c 69 66  the fully qualif
5830: 69 65 64 20 66 69 6c 65 20 6e 61 6d 65 20 66 6f  ied file name fo
5840: 72 20 74 68 65 20 69 6e 74 65 72 6f 70 20 61 73  r the interop as
5850: 73 65 6d 62 6c 79 0d 0a 20 20 20 20 20 20 23 20  sembly..      # 
5860: 20 20 20 20 20 20 63 6f 6e 74 61 69 6e 69 6e 67        containing
5870: 20 74 68 65 20 53 79 73 74 65 6d 2e 44 61 74 61   the System.Data
5880: 2e 53 51 4c 69 74 65 20 6e 61 74 69 76 65 20 63  .SQLite native c
5890: 6f 6d 70 6f 6e 65 6e 74 73 2e 20 20 49 66 20 74  omponents.  If t
58a0: 68 69 73 0d 0a 20 20 20 20 20 20 23 20 20 20 20  his..      #    
58b0: 20 20 20 66 69 6c 65 20 65 78 69 73 74 73 2c 20     file exists, 
58c0: 77 65 20 73 68 6f 75 6c 64 20 68 61 76 65 20 65  we should have e
58d0: 76 65 72 79 74 68 69 6e 67 20 77 65 20 6e 65 65  verything we nee
58e0: 64 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  d...      #..   
58f0: 20 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65 4e     foreach fileN
5900: 61 6d 65 4f 6e 6c 79 20 5b 67 65 74 49 6e 74 65  ameOnly [getInte
5910: 72 6f 70 41 73 73 65 6d 62 6c 79 46 69 6c 65 4e  ropAssemblyFileN
5920: 61 6d 65 73 4f 6e 6c 79 5d 20 7b 0d 0a 20 20 20  amesOnly] {..   
5930: 20 20 20 20 20 73 65 74 20 66 69 6c 65 4e 61 6d       set fileNam
5940: 65 20 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e 61  e [file nativena
5950: 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 24 64  me [file join $d
5960: 69 72 65 63 74 6f 72 79 20 5c 0d 0a 20 20 20 20  irectory \..    
5970: 20 20 20 20 20 20 20 20 24 61 72 63 68 69 74 65          $archite
5980: 63 74 75 72 65 20 24 66 69 6c 65 4e 61 6d 65 4f  cture $fileNameO
5990: 6e 6c 79 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  nly]]....       
59a0: 20 69 66 20 7b 5b 66 69 6c 65 20 65 78 69 73 74   if {[file exist
59b0: 73 20 24 66 69 6c 65 4e 61 6d 65 5d 7d 20 74 68  s $fileName]} th
59c0: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
59d0: 72 65 74 75 72 6e 20 74 72 75 65 0d 0a 20 20 20  return true..   
59e0: 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
59f0: 20 20 73 65 74 20 66 69 6c 65 4e 61 6d 65 20 5b    set fileName [
5a00: 66 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65 20  file nativename 
5a10: 5b 66 69 6c 65 20 6a 6f 69 6e 20 24 64 69 72 65  [file join $dire
5a20: 63 74 6f 72 79 20 5c 0d 0a 20 20 20 20 20 20 20  ctory \..       
5a30: 20 20 20 20 20 24 70 6c 61 74 66 6f 72 6d 20 24       $platform $
5a40: 66 69 6c 65 4e 61 6d 65 4f 6e 6c 79 5d 5d 0d 0a  fileNameOnly]]..
5a50: 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 66  ..        if {[f
5a60: 69 6c 65 20 65 78 69 73 74 73 20 24 66 69 6c 65  ile exists $file
5a70: 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  Name]} then {.. 
5a80: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
5a90: 74 72 75 65 0d 0a 20 20 20 20 20 20 20 20 7d 0d  true..        }.
5aa0: 0a 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 66  ...        set f
5ab0: 69 6c 65 4e 61 6d 65 20 5b 66 69 6c 65 20 6e 61  ileName [file na
5ac0: 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c 65 20 6a  tivename [file j
5ad0: 6f 69 6e 20 24 64 69 72 65 63 74 6f 72 79 20 5c  oin $directory \
5ae0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 24 66  ..            $f
5af0: 69 6c 65 4e 61 6d 65 4f 6e 6c 79 5d 5d 0d 0a 0d  ileNameOnly]]...
5b00: 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 66 69  .        if {[fi
5b10: 6c 65 20 65 78 69 73 74 73 20 24 66 69 6c 65 4e  le exists $fileN
5b20: 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ame]} then {..  
5b30: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 74          return t
5b40: 72 75 65 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  rue..        }..
5b50: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
5b60: 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
5b70: 3a 20 42 75 69 6c 64 20 74 68 65 20 66 75 6c 6c  : Build the full
5b80: 79 20 71 75 61 6c 69 66 69 65 64 20 66 69 6c 65  y qualified file
5b90: 20 6e 61 6d 65 20 66 6f 72 20 74 68 65 20 53 51   name for the SQ
5ba0: 4c 69 74 65 20 63 6f 72 65 0d 0a 20 20 20 20 20  Lite core..     
5bb0: 20 23 20 20 20 20 20 20 20 6c 69 62 72 61 72 79   #       library
5bc0: 2e 20 20 49 66 20 74 68 69 73 20 66 69 6c 65 20  .  If this file 
5bd0: 65 78 69 73 74 73 2c 20 77 65 20 73 68 6f 75 6c  exists, we shoul
5be0: 64 20 68 61 76 65 20 65 76 65 72 79 74 68 69 6e  d have everythin
5bf0: 67 20 77 65 0d 0a 20 20 20 20 20 20 23 20 20 20  g we..      #   
5c00: 20 20 20 20 6e 65 65 64 2e 0d 0a 20 20 20 20 20      need...     
5c10: 20 23 0d 0a 20 20 20 20 20 20 66 6f 72 65 61 63   #..      foreac
5c20: 68 20 66 69 6c 65 4e 61 6d 65 4f 6e 6c 79 20 5b  h fileNameOnly [
5c30: 67 65 74 4e 61 74 69 76 65 4c 69 62 72 61 72 79  getNativeLibrary
5c40: 46 69 6c 65 4e 61 6d 65 73 4f 6e 6c 79 5d 20 7b  FileNamesOnly] {
5c50: 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 66 69  ..        set fi
5c60: 6c 65 4e 61 6d 65 20 5b 66 69 6c 65 20 6e 61 74  leName [file nat
5c70: 69 76 65 6e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f  ivename [file jo
5c80: 69 6e 20 24 64 69 72 65 63 74 6f 72 79 20 5c 0d  in $directory \.
5c90: 0a 20 20 20 20 20 20 20 20 20 20 20 20 24 61 72  .            $ar
5ca0: 63 68 69 74 65 63 74 75 72 65 20 24 66 69 6c 65  chitecture $file
5cb0: 4e 61 6d 65 4f 6e 6c 79 5d 5d 0d 0a 0d 0a 20 20  NameOnly]]....  
5cc0: 20 20 20 20 20 20 69 66 20 7b 5b 66 69 6c 65 20        if {[file 
5cd0: 65 78 69 73 74 73 20 24 66 69 6c 65 4e 61 6d 65  exists $fileName
5ce0: 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
5cf0: 20 20 20 20 20 72 65 74 75 72 6e 20 74 72 75 65       return true
5d00: 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  ..        }.... 
5d10: 20 20 20 20 20 20 20 73 65 74 20 66 69 6c 65 4e         set fileN
5d20: 61 6d 65 20 5b 66 69 6c 65 20 6e 61 74 69 76 65  ame [file native
5d30: 6e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20  name [file join 
5d40: 24 64 69 72 65 63 74 6f 72 79 20 5c 0d 0a 20 20  $directory \..  
5d50: 20 20 20 20 20 20 20 20 20 20 24 70 6c 61 74 66            $platf
5d60: 6f 72 6d 20 24 66 69 6c 65 4e 61 6d 65 4f 6e 6c  orm $fileNameOnl
5d70: 79 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69  y]]....        i
5d80: 66 20 7b 5b 66 69 6c 65 20 65 78 69 73 74 73 20  f {[file exists 
5d90: 24 66 69 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e  $fileName]} then
5da0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 72 65   {..          re
5db0: 74 75 72 6e 20 74 72 75 65 0d 0a 20 20 20 20 20  turn true..     
5dc0: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
5dd0: 73 65 74 20 66 69 6c 65 4e 61 6d 65 20 5b 66 69  set fileName [fi
5de0: 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65 20 5b 66  le nativename [f
5df0: 69 6c 65 20 6a 6f 69 6e 20 24 64 69 72 65 63 74  ile join $direct
5e00: 6f 72 79 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ory \..         
5e10: 20 20 20 24 66 69 6c 65 4e 61 6d 65 4f 6e 6c 79     $fileNameOnly
5e20: 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66  ]]....        if
5e30: 20 7b 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24   {[file exists $
5e40: 66 69 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20  fileName]} then 
5e50: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  {..          ret
5e60: 75 72 6e 20 74 72 75 65 0d 0a 20 20 20 20 20 20  urn true..      
5e70: 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a    }..      }....
5e80: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
5e90: 20 4e 4f 54 45 3a 20 4f 6e 65 20 6f 72 20 6d 6f   NOTE: One or mo
5ea0: 72 65 20 6e 61 74 69 76 65 20 63 6f 6d 70 6f 6e  re native compon
5eb0: 65 6e 74 73 20 6e 65 65 64 65 64 20 62 79 20 53  ents needed by S
5ec0: 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
5ed0: 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  e..      #      
5ee0: 20 61 72 65 20 6d 69 73 73 69 6e 67 2e 0d 0a 20   are missing... 
5ef0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 72 65       #..      re
5f00: 74 75 72 6e 20 66 61 6c 73 65 0d 0a 20 20 20 20  turn false..    
5f10: 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 69  }.....    proc i
5f20: 73 52 65 6c 65 61 73 65 41 76 61 69 6c 61 62 6c  sReleaseAvailabl
5f30: 65 20 7b 20 64 69 72 65 63 74 6f 72 79 20 7b 76  e { directory {v
5f40: 61 72 4e 61 6d 65 20 22 22 7d 20 7d 20 7b 0d 0a  arName ""} } {..
5f50: 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e        if {[strin
5f60: 67 20 6c 65 6e 67 74 68 20 24 76 61 72 4e 61 6d  g length $varNam
5f70: 65 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  e] > 0} then {..
5f80: 20 20 20 20 20 20 20 20 75 70 76 61 72 20 31 20          upvar 1 
5f90: 24 76 61 72 4e 61 6d 65 20 24 76 61 72 4e 61 6d  $varName $varNam
5fa0: 65 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  e..      }....  
5fb0: 20 20 20 20 72 65 74 75 72 6e 20 5b 69 73 42 75      return [isBu
5fc0: 69 6c 64 41 76 61 69 6c 61 62 6c 65 20 22 22 20  ildAvailable "" 
5fd0: 24 64 69 72 65 63 74 6f 72 79 20 24 76 61 72 4e  $directory $varN
5fe0: 61 6d 65 5d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a  ame]..    }.....
5ff0: 20 20 20 20 70 72 6f 63 20 6a 6f 69 6e 42 75 69      proc joinBui
6000: 6c 64 44 69 72 65 63 74 6f 72 79 20 7b 20 6e 61  ldDirectory { na
6010: 74 69 76 65 20 70 61 74 68 20 79 65 61 72 20 70  tive path year p
6020: 6c 61 74 66 6f 72 6d 20 63 6f 6e 66 69 67 75 72  latform configur
6030: 61 74 69 6f 6e 20 7d 20 7b 0d 0a 20 20 20 20 20  ation } {..     
6040: 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
6050: 3a 20 46 69 67 75 72 65 20 6f 75 74 20 61 6e 64  : Figure out and
6060: 20 74 68 65 6e 20 72 65 74 75 72 6e 20 74 68 65   then return the
6070: 20 66 75 6c 6c 79 20 71 75 61 6c 69 66 69 65 64   fully qualified
6080: 20 70 61 74 68 20 74 6f 20 74 68 65 20 62 75 69   path to the bui
6090: 6c 64 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  ld..      #     
60a0: 20 20 64 69 72 65 63 74 6f 72 79 20 62 61 73 65    directory base
60b0: 64 20 6f 6e 20 61 6c 6c 20 74 68 65 20 61 72 67  d on all the arg
60c0: 75 6d 65 6e 74 73 20 70 72 6f 76 69 64 65 64 20  uments provided 
60d0: 62 79 20 6f 75 72 20 63 61 6c 6c 65 72 2e 0d 0a  by our caller...
60e0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69        #..      i
60f0: 66 20 7b 24 6e 61 74 69 76 65 7d 20 74 68 65 6e  f {$native} then
6100: 20 7b 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75   {..        retu
6110: 72 6e 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 24 70  rn [file join $p
6120: 61 74 68 20 62 69 6e 20 24 79 65 61 72 20 24 70  ath bin $year $p
6130: 6c 61 74 66 6f 72 6d 20 24 63 6f 6e 66 69 67 75  latform $configu
6140: 72 61 74 69 6f 6e 5d 0d 0a 20 20 20 20 20 20 7d  ration]..      }
6150: 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
6160: 20 72 65 74 75 72 6e 20 5b 66 69 6c 65 20 6a 6f   return [file jo
6170: 69 6e 20 24 70 61 74 68 20 62 69 6e 20 24 79 65  in $path bin $ye
6180: 61 72 20 24 63 6f 6e 66 69 67 75 72 61 74 69 6f  ar $configuratio
6190: 6e 20 62 69 6e 5d 0d 0a 20 20 20 20 20 20 7d 0d  n bin]..      }.
61a0: 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70  .    }.....    p
61b0: 72 6f 63 20 67 65 74 42 75 69 6c 64 44 69 72 65  roc getBuildDire
61c0: 63 74 6f 72 79 20 7b 20 6d 61 6e 61 67 65 64 4f  ctory { managedO
61d0: 6e 6c 79 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23  nly } {..      #
61e0: 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
61f0: 53 65 65 20 69 66 20 74 68 65 20 22 6e 61 74 69  See if the "nati
6200: 76 65 22 20 72 75 6e 74 69 6d 65 20 6f 70 74 69  ve" runtime opti
6210: 6f 6e 20 68 61 73 20 62 65 65 6e 20 73 65 74 2e  on has been set.
6220: 20 20 49 66 20 73 6f 2c 20 75 73 65 20 74 68 65    If so, use the
6230: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
6240: 64 69 72 65 63 74 6f 72 79 20 66 6f 72 20 74 68  directory for th
6250: 65 20 6d 69 78 65 64 2d 6d 6f 64 65 20 61 73 73  e mixed-mode ass
6260: 65 6d 62 6c 79 20 28 61 2e 6b 2e 61 2e 20 74 68  embly (a.k.a. th
6270: 65 20 6e 61 74 69 76 65 20 69 6e 74 65 72 6f 70  e native interop
6280: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
6290: 61 73 73 65 6d 62 6c 79 29 2e 20 20 54 6f 20 65  assembly).  To e
62a0: 6e 61 62 6c 65 20 74 68 69 73 20 6f 70 74 69 6f  nable this optio
62b0: 6e 20 76 69 61 20 74 68 65 20 63 6f 6d 6d 61 6e  n via the comman
62c0: 64 20 6c 69 6e 65 2c 20 65 6e 74 65 72 20 61 0d  d line, enter a.
62d0: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63  .      #       c
62e0: 6f 6d 6d 61 6e 64 20 73 69 6d 69 6c 61 72 20 74  ommand similar t
62f0: 6f 20 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c  o one of the fol
6300: 6c 6f 77 69 6e 67 20 28 61 6c 6c 20 6f 6e 20 6f  lowing (all on o
6310: 6e 65 20 6c 69 6e 65 29 3a 0d 0a 20 20 20 20 20  ne line):..     
6320: 20 23 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20   #..      #     
6330: 20 20 45 61 67 6c 65 53 68 65 6c 6c 2e 65 78 65    EagleShell.exe
6340: 20 2d 69 6e 69 74 69 61 6c 69 7a 65 20 2d 72 75   -initialize -ru
6350: 6e 74 69 6d 65 4f 70 74 69 6f 6e 20 6e 61 74 69  ntimeOption nati
6360: 76 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  ve..      #     
6370: 20 20 20 20 2d 66 69 6c 65 20 2e 5c 70 61 74 68      -file .\path
6380: 5c 74 6f 5c 61 6c 6c 2e 65 61 67 6c 65 0d 0a 20  \to\all.eagle.. 
6390: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
63a0: 20 20 20 20 20 20 54 6f 20 65 6e 61 62 6c 65 20        To enable 
63b0: 74 68 69 73 20 6f 70 74 69 6f 6e 20 76 69 61 20  this option via 
63c0: 74 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65  the command line
63d0: 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20 22 62   prior to the "b
63e0: 65 74 61 20 31 36 22 0d 0a 20 20 20 20 20 20 23  eta 16"..      #
63f0: 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 20 6f         release o
6400: 66 20 45 61 67 6c 65 2c 20 74 68 65 20 66 6f 6c  f Eagle, the fol
6410: 6c 6f 77 69 6e 67 20 63 6f 6d 6d 61 6e 64 20 6d  lowing command m
6420: 75 73 74 20 62 65 20 75 73 65 64 20 69 6e 73 74  ust be used inst
6430: 65 61 64 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ead..      #    
6440: 20 20 20 28 61 6c 73 6f 20 61 6c 6c 20 6f 6e 20     (also all on 
6450: 6f 6e 65 20 6c 69 6e 65 29 3a 0d 0a 20 20 20 20  one line):..    
6460: 20 20 23 0d 0a 20 20 20 20 20 20 23 20 20 20 20    #..      #    
6470: 20 20 20 45 61 67 6c 65 53 68 65 6c 6c 2e 65 78     EagleShell.ex
6480: 65 20 2d 69 6e 69 74 69 61 6c 69 7a 65 20 2d 70  e -initialize -p
6490: 6f 73 74 49 6e 69 74 69 61 6c 69 7a 65 0d 0a 20  ostInitialize.. 
64a0: 20 20 20 20 20 23 20 20 20 20 20 20 20 20 20 22       #         "
64b0: 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 49 6e  object invoke In
64c0: 74 65 72 70 72 65 74 65 72 2e 47 65 74 41 63 74  terpreter.GetAct
64d0: 69 76 65 20 41 64 64 52 75 6e 74 69 6d 65 4f 70  ive AddRuntimeOp
64e0: 74 69 6f 6e 20 6e 61 74 69 76 65 22 0d 0a 20 20  tion native"..  
64f0: 20 20 20 20 23 20 20 20 20 20 20 20 20 20 2d 66      #         -f
6500: 69 6c 65 20 2e 5c 70 61 74 68 5c 74 6f 5c 61 6c  ile .\path\to\al
6510: 6c 2e 65 61 67 6c 65 0d 0a 20 20 20 20 20 20 23  l.eagle..      #
6520: 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66  ..      if {[inf
6530: 6f 20 65 78 69 73 74 73 20 3a 3a 62 75 69 6c 64  o exists ::build
6540: 5f 64 69 72 65 63 74 6f 72 79 5d 20 26 26 20 5c  _directory] && \
6550: 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 73 74 72  ..          [str
6560: 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a 62 75  ing length $::bu
6570: 69 6c 64 5f 64 69 72 65 63 74 6f 72 79 5d 20 3e  ild_directory] >
6580: 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
6590: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
65a0: 20 4e 4f 54 45 3a 20 54 68 65 20 6c 6f 63 61 74   NOTE: The locat
65b0: 69 6f 6e 20 6f 66 20 74 68 65 20 62 75 69 6c 64  ion of the build
65c0: 20 64 69 72 65 63 74 6f 72 79 20 68 61 73 20 62   directory has b
65d0: 65 65 6e 20 6f 76 65 72 72 69 64 64 65 6e 3b 0d  een overridden;.
65e0: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
65f0: 20 74 68 65 72 65 66 6f 72 65 2c 20 75 73 65 20   therefore, use 
6600: 69 74 20 76 65 72 62 61 74 69 6d 2e 0d 0a 20 20  it verbatim...  
6610: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
6620: 20 72 65 74 75 72 6e 20 24 3a 3a 62 75 69 6c 64   return $::build
6630: 5f 64 69 72 65 63 74 6f 72 79 0d 0a 20 20 20 20  _directory..    
6640: 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
6650: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
6660: 20 4e 4f 54 45 3a 20 49 66 20 74 68 65 20 22 6e   NOTE: If the "n
6670: 61 74 69 76 65 22 20 72 75 6e 74 69 6d 65 20 6f  ative" runtime o
6680: 70 74 69 6f 6e 20 69 73 20 73 65 74 2c 20 74 68  ption is set, th
6690: 65 20 6d 69 78 65 64 2d 6d 6f 64 65 20 61 73 73  e mixed-mode ass
66a0: 65 6d 62 6c 79 0d 0a 20 20 20 20 20 20 20 20 23  embly..        #
66b0: 20 20 20 20 20 20 20 69 73 20 62 65 69 6e 67 20         is being 
66c0: 74 65 73 74 65 64 2e 20 20 49 6e 20 74 68 61 74  tested.  In that
66d0: 20 63 61 73 65 2c 20 74 68 65 20 70 61 74 68 20   case, the path 
66e0: 74 6f 20 74 68 65 20 62 75 69 6c 64 20 64 69 72  to the build dir
66f0: 65 63 74 6f 72 79 0d 0a 20 20 20 20 20 20 20 20  ectory..        
6700: 23 20 20 20 20 20 20 20 77 69 6c 6c 20 63 6f 6e  #       will con
6710: 74 61 69 6e 20 74 68 65 20 70 6c 61 74 66 6f 72  tain the platfor
6720: 6d 20 6e 61 6d 65 20 61 6e 64 20 61 6c 6c 20 74  m name and all t
6730: 68 65 20 62 69 6e 61 72 69 65 73 20 75 6e 64 65  he binaries unde
6740: 72 20 74 65 73 74 0d 0a 20 20 20 20 20 20 20 20  r test..        
6750: 23 20 20 20 20 20 20 20 73 68 6f 75 6c 64 20 62  #       should b
6760: 65 20 70 72 65 73 65 6e 74 20 69 6e 20 74 68 61  e present in tha
6770: 74 20 64 69 72 65 63 74 6f 72 79 2e 20 20 49 66  t directory.  If
6780: 20 74 68 65 20 22 6e 61 74 69 76 65 22 20 72 75   the "native" ru
6790: 6e 74 69 6d 65 0d 0a 20 20 20 20 20 20 20 20 23  ntime..        #
67a0: 20 20 20 20 20 20 20 6f 70 74 69 6f 6e 20 69 73         option is
67b0: 20 6e 6f 74 20 73 65 74 2c 20 74 68 65 20 62 75   not set, the bu
67c0: 69 6c 64 20 64 69 72 65 63 74 6f 72 79 20 77 69  ild directory wi
67d0: 6c 6c 20 62 65 20 63 6f 6e 73 69 64 65 72 65 64  ll be considered
67e0: 20 74 6f 20 62 65 0d 0a 20 20 20 20 20 20 20 20   to be..        
67f0: 23 20 20 20 20 20 20 20 22 70 6c 61 74 66 6f 72  #       "platfor
6800: 6d 2d 6e 65 75 74 72 61 6c 22 2c 20 77 69 74 68  m-neutral", with
6810: 20 74 68 65 20 6e 6f 74 61 62 6c 65 20 65 78 63   the notable exc
6820: 65 70 74 69 6f 6e 20 6f 66 20 61 6e 79 20 6e 61  eption of any na
6830: 74 69 76 65 0d 0a 20 20 20 20 20 20 20 20 23 20  tive..        # 
6840: 20 20 20 20 20 20 61 73 73 65 6d 62 6c 79 20 28        assembly (
6850: 65 2e 67 2e 20 22 53 51 4c 69 74 65 2e 49 6e 74  e.g. "SQLite.Int
6860: 65 72 6f 70 2e 64 6c 6c 22 29 20 63 6f 70 69 65  erop.dll") copie
6870: 64 20 74 68 65 72 65 20 64 75 72 69 6e 67 20 74  d there during t
6880: 68 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  he..        #   
6890: 20 20 20 20 62 75 69 6c 64 20 70 72 6f 63 65 73      build proces
68a0: 73 20 69 74 73 65 6c 66 2e 20 20 49 66 20 74 68  s itself.  If th
68b0: 65 20 62 75 69 6c 64 20 70 72 6f 63 65 73 73 20  e build process 
68c0: 73 6f 6d 65 68 6f 77 20 64 6f 65 73 20 6e 6f 74  somehow does not
68d0: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
68e0: 20 20 63 6f 70 79 20 74 68 65 20 6e 61 74 69 76    copy the nativ
68f0: 65 20 61 73 73 65 6d 62 6c 79 20 66 6f 72 20 74  e assembly for t
6900: 68 69 73 20 70 6c 61 74 66 6f 72 6d 2c 20 6d 6f  his platform, mo
6910: 73 74 20 6f 66 20 74 68 65 20 74 65 73 74 73 0d  st of the tests.
6920: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
6930: 20 69 6e 20 74 68 65 20 73 75 69 74 65 20 77 69   in the suite wi
6940: 6c 6c 20 73 69 6d 70 6c 79 20 62 65 20 73 6b 69  ll simply be ski
6950: 70 70 65 64 2e 20 20 47 65 6e 65 72 61 6c 6c 79  pped.  Generally
6960: 20 73 70 65 61 6b 69 6e 67 2c 20 74 68 65 72 65   speaking, there
6970: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
6980: 20 20 61 72 65 20 74 77 6f 20 77 61 79 73 20 74    are two ways t
6990: 6f 20 62 75 69 6c 64 20 74 68 65 20 62 69 6e 61  o build the bina
69a0: 72 69 65 73 20 77 68 65 6e 20 70 72 65 70 61 72  ries when prepar
69b0: 69 6e 67 20 74 6f 20 72 75 6e 20 74 68 65 0d 0a  ing to run the..
69c0: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
69d0: 74 65 73 74 20 73 75 69 74 65 3a 0d 0a 20 20 20  test suite:..   
69e0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
69f0: 23 20 20 20 20 20 20 20 31 2e 20 42 75 69 6c 64  #       1. Build
6a00: 20 74 68 65 20 73 65 70 61 72 61 74 65 20 6d 61   the separate ma
6a10: 6e 61 67 65 64 20 61 6e 64 20 6e 61 74 69 76 65  naged and native
6a20: 20 61 73 73 65 6d 62 6c 69 65 73 20 75 73 69 6e   assemblies usin
6a30: 67 20 73 6f 6d 65 0d 0a 20 20 20 20 20 20 20 20  g some..        
6a40: 23 20 20 20 20 20 20 20 20 20 20 63 6f 6d 6d 61  #          comma
6a50: 6e 64 73 20 73 69 6d 69 6c 61 72 20 74 6f 3a 0d  nds similar to:.
6a60: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
6a70: 20 20 20 20 23 20 20 20 20 20 20 20 20 20 20 62      #          b
6a80: 75 69 6c 64 2e 62 61 74 20 24 7b 43 6f 6e 66 69  uild.bat ${Confi
6a90: 67 75 72 61 74 69 6f 6e 7d 4d 61 6e 61 67 65 64  guration}Managed
6aa0: 4f 6e 6c 79 20 24 7b 50 6c 61 74 66 6f 72 6d 7d  Only ${Platform}
6ab0: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
6ac0: 20 20 20 20 20 62 75 69 6c 64 2e 62 61 74 20 24       build.bat $
6ad0: 7b 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 7d 4e  {Configuration}N
6ae0: 61 74 69 76 65 4f 6e 6c 79 20 24 7b 50 6c 61 74  ativeOnly ${Plat
6af0: 66 6f 72 6d 7d 0d 0a 20 20 20 20 20 20 20 20 23  form}..        #
6b00: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
6b10: 20 20 20 20 20 57 68 65 72 65 20 24 7b 43 6f 6e       Where ${Con
6b20: 66 69 67 75 72 61 74 69 6f 6e 7d 20 69 73 20 65  figuration} is e
6b30: 69 74 68 65 72 20 22 44 65 62 75 67 22 20 6f 72  ither "Debug" or
6b40: 20 22 52 65 6c 65 61 73 65 22 20 61 6e 64 0d 0a   "Release" and..
6b50: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
6b60: 20 20 20 24 7b 50 6c 61 74 66 6f 72 6d 7d 20 69     ${Platform} i
6b70: 73 20 65 69 74 68 65 72 20 22 57 69 6e 33 32 22  s either "Win32"
6b80: 20 6f 72 20 22 78 36 34 22 2e 0d 0a 20 20 20 20   or "x64"...    
6b90: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
6ba0: 20 20 20 20 20 20 20 32 2e 20 42 75 69 6c 64 20         2. Build 
6bb0: 74 68 65 20 6d 69 78 65 64 2d 6d 6f 64 65 20 61  the mixed-mode a
6bc0: 73 73 65 6d 62 6c 79 20 75 73 69 6e 67 20 61 20  ssembly using a 
6bd0: 63 6f 6d 6d 61 6e 64 20 73 69 6d 69 6c 61 72 20  command similar 
6be0: 74 6f 3a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  to:..        #..
6bf0: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
6c00: 20 20 20 62 75 69 6c 64 2e 62 61 74 20 24 7b 43     build.bat ${C
6c10: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 7d 20 24 7b  onfiguration} ${
6c20: 50 6c 61 74 66 6f 72 6d 7d 0d 0a 20 20 20 20 20  Platform}..     
6c30: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
6c40: 20 20 20 20 20 20 20 20 20 57 68 65 72 65 20 24           Where $
6c50: 7b 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 7d 20  {Configuration} 
6c60: 69 73 20 65 69 74 68 65 72 20 22 44 65 62 75 67  is either "Debug
6c70: 22 20 6f 72 20 22 52 65 6c 65 61 73 65 22 20 61  " or "Release" a
6c80: 6e 64 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  nd..        #   
6c90: 20 20 20 20 20 20 20 24 7b 50 6c 61 74 66 6f 72         ${Platfor
6ca0: 6d 7d 20 69 73 20 65 69 74 68 65 72 20 22 57 69  m} is either "Wi
6cb0: 6e 33 32 22 20 6f 72 20 22 78 36 34 22 2e 20 20  n32" or "x64".  
6cc0: 49 66 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20  If this command 
6cd0: 69 73 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  is..        #   
6ce0: 20 20 20 20 20 20 20 75 73 65 64 2c 20 76 61 72         used, var
6cf0: 69 6f 75 73 20 74 65 73 74 73 20 74 68 61 74 20  ious tests that 
6d00: 72 65 71 75 69 72 65 20 73 75 70 70 6c 65 6d 65  require suppleme
6d10: 6e 74 61 72 79 20 6d 61 6e 61 67 65 64 0d 0a 20  ntary managed.. 
6d20: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 20         #        
6d30: 20 20 61 73 73 65 6d 62 6c 69 65 73 20 28 65 2e    assemblies (e.
6d40: 67 2e 20 4c 49 4e 51 29 20 6d 61 79 20 62 65 20  g. LINQ) may be 
6d50: 73 6b 69 70 70 65 64 20 75 6e 6c 65 73 73 20 74  skipped unless t
6d60: 68 6f 73 65 20 62 69 6e 61 72 69 65 73 0d 0a 20  hose binaries.. 
6d70: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 20         #        
6d80: 20 20 61 72 65 20 73 75 62 73 65 71 75 65 6e 74    are subsequent
6d90: 6c 79 20 63 6f 70 69 65 64 20 69 6e 74 6f 20 74  ly copied into t
6da0: 68 65 20 63 6f 72 72 65 63 74 20 64 69 72 65 63  he correct direc
6db0: 74 6f 72 79 20 28 69 2e 65 2e 20 62 79 0d 0a 20  tory (i.e. by.. 
6dc0: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 20         #        
6dd0: 20 20 22 74 65 73 74 5f 61 6c 6c 2e 62 61 74 22    "test_all.bat"
6de0: 29 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  )...        #.. 
6df0: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 4e         #       N
6e00: 6f 74 65 20 74 68 61 74 20 61 6c 6c 20 6f 66 20  ote that all of 
6e10: 74 68 65 20 62 75 69 6c 64 20 63 6f 6d 6d 61 6e  the build comman
6e20: 64 73 20 61 62 6f 76 65 20 77 69 6c 6c 20 64 65  ds above will de
6e30: 66 61 75 6c 74 20 74 6f 20 75 73 69 6e 67 0d 0a  fault to using..
6e40: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
6e50: 74 68 65 20 6c 61 74 65 73 74 20 76 65 72 73 69  the latest versi
6e60: 6f 6e 20 6f 66 20 4d 53 42 75 69 6c 64 20 61 76  on of MSBuild av
6e70: 61 69 6c 61 62 6c 65 20 61 6e 64 20 74 68 65 20  ailable and the 
6e80: 22 74 65 73 74 5f 79 65 61 72 22 20 6d 61 79 0d  "test_year" may.
6e90: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
6ea0: 20 6e 65 65 64 20 74 6f 20 62 65 20 61 64 6a 75   need to be adju
6eb0: 73 74 65 64 20 61 63 63 6f 72 64 69 6e 67 6c 79  sted accordingly
6ec0: 20 74 6f 20 61 63 74 75 61 6c 6c 79 20 72 75 6e   to actually run
6ed0: 20 74 68 65 20 74 65 73 74 20 73 75 69 74 65 2e   the test suite.
6ee0: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
6ef0: 20 20 52 65 66 65 72 20 74 6f 20 74 68 65 20 63    Refer to the c
6f00: 6f 6d 6d 65 6e 74 73 20 69 6e 20 5b 67 65 74 42  omments in [getB
6f10: 75 69 6c 64 59 65 61 72 5d 20 66 6f 72 20 6d 6f  uildYear] for mo
6f20: 72 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f  re information o
6f30: 6e 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  n..        #    
6f40: 20 20 20 68 6f 77 20 74 6f 20 73 65 74 20 74 68     how to set th
6f50: 69 73 20 76 61 72 69 61 62 6c 65 2e 0d 0a 20 20  is variable...  
6f60: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
6f70: 20 73 65 74 20 6e 61 74 69 76 65 20 5b 65 78 70   set native [exp
6f80: 72 20 7b 21 24 6d 61 6e 61 67 65 64 4f 6e 6c 79  r {!$managedOnly
6f90: 20 26 26 20 5b 68 61 73 52 75 6e 74 69 6d 65 4f   && [hasRuntimeO
6fa0: 70 74 69 6f 6e 20 6e 61 74 69 76 65 5d 7d 5d 0d  ption native]}].
6fb0: 0a 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ...        retur
6fc0: 6e 20 5b 6a 6f 69 6e 42 75 69 6c 64 44 69 72 65  n [joinBuildDire
6fd0: 63 74 6f 72 79 20 24 6e 61 74 69 76 65 20 5b 67  ctory $native [g
6fe0: 65 74 42 75 69 6c 64 42 61 73 65 44 69 72 65 63  etBuildBaseDirec
6ff0: 74 6f 72 79 5d 20 5c 0d 0a 20 20 20 20 20 20 20  tory] \..       
7000: 20 20 20 20 20 5b 67 65 74 42 75 69 6c 64 59 65       [getBuildYe
7010: 61 72 5d 20 5b 67 65 74 42 75 69 6c 64 50 6c 61  ar] [getBuildPla
7020: 74 66 6f 72 6d 20 24 6e 61 74 69 76 65 5d 20 5b  tform $native] [
7030: 67 65 74 42 75 69 6c 64 43 6f 6e 66 69 67 75 72  getBuildConfigur
7040: 61 74 69 6f 6e 5d 5d 0d 0a 20 20 20 20 20 20 7d  ation]]..      }
7050: 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
7060: 70 72 6f 63 20 67 65 74 52 65 6c 65 61 73 65 56  proc getReleaseV
7070: 65 72 73 69 6f 6e 20 7b 7d 20 7b 0d 0a 20 20 20  ersion {} {..   
7080: 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
7090: 54 45 3a 20 46 69 67 75 72 65 20 6f 75 74 20 74  TE: Figure out t
70a0: 68 65 20 72 65 6c 65 61 73 65 20 76 65 72 73 69  he release versi
70b0: 6f 6e 20 66 6f 72 20 75 73 65 20 77 69 74 68 20  on for use with 
70c0: 74 68 65 20 62 75 69 6c 64 20 64 69 72 65 63 74  the build direct
70d0: 6f 72 79 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ory..      #    
70e0: 20 20 20 77 68 65 6e 20 63 68 65 63 6b 69 6e 67     when checking
70f0: 20 66 6f 72 20 61 76 61 69 6c 61 62 6c 65 20 72   for available r
7100: 65 6c 65 61 73 65 73 2e 0d 0a 20 20 20 20 20 20  eleases...      
7110: 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 6e  #..      if {[in
7120: 66 6f 20 65 78 69 73 74 73 20 3a 3a 72 65 6c 65  fo exists ::rele
7130: 61 73 65 5f 76 65 72 73 69 6f 6e 5d 20 26 26 20  ase_version] && 
7140: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 73 74  \..          [st
7150: 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a 72  ring length $::r
7160: 65 6c 65 61 73 65 5f 76 65 72 73 69 6f 6e 5d 20  elease_version] 
7170: 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  > 0} then {..   
7180: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
7190: 23 20 4e 4f 54 45 3a 20 54 68 65 20 72 65 6c 65  # NOTE: The rele
71a0: 61 73 65 20 76 65 72 73 69 6f 6e 20 68 61 73 20  ase version has 
71b0: 62 65 65 6e 20 6f 76 65 72 72 69 64 64 65 6e 3b  been overridden;
71c0: 20 74 68 65 72 65 66 6f 72 65 2c 20 75 73 65 20   therefore, use 
71d0: 69 74 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  it..        #   
71e0: 20 20 20 20 76 65 72 62 61 74 69 6d 2e 0d 0a 20      verbatim... 
71f0: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
7200: 20 20 72 65 74 75 72 6e 20 24 3a 3a 72 65 6c 65    return $::rele
7210: 61 73 65 5f 76 65 72 73 69 6f 6e 0d 0a 20 20 20  ase_version..   
7220: 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
7230: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
7240: 23 20 4e 4f 54 45 3a 20 4e 6f 20 72 65 6c 65 61  # NOTE: No relea
7250: 73 65 20 76 65 72 73 69 6f 6e 20 69 73 20 61 76  se version is av
7260: 61 69 6c 61 62 6c 65 2c 20 72 65 74 75 72 6e 20  ailable, return 
7270: 61 6e 20 65 6d 70 74 79 20 73 74 72 69 6e 67 2e  an empty string.
7280: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
7290: 20 20 49 74 20 69 73 20 69 6d 70 6f 72 74 61 6e    It is importan
72a0: 74 20 74 6f 20 72 65 74 75 72 6e 20 61 6e 20 65  t to return an e
72b0: 6d 70 74 79 20 73 74 72 69 6e 67 20 68 65 72 65  mpty string here
72c0: 20 62 65 63 61 75 73 65 20 74 68 65 0d 0a 20 20   because the..  
72d0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 72 65        #       re
72e0: 73 75 6c 74 20 6f 66 20 74 68 69 73 20 70 72 6f  sult of this pro
72f0: 63 65 64 75 72 65 20 6d 61 79 20 62 65 20 75 73  cedure may be us
7300: 65 64 20 77 69 74 68 20 5b 66 69 6c 65 20 6a 6f  ed with [file jo
7310: 69 6e 5d 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  in]...        #.
7320: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
7330: 22 22 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20  ""..      }..   
7340: 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
7350: 67 65 74 42 75 69 6c 64 46 69 6c 65 4e 61 6d 65  getBuildFileName
7360: 20 7b 20 66 69 6c 65 4e 61 6d 65 20 6d 61 6e 61   { fileName mana
7370: 67 65 64 4f 6e 6c 79 20 7b 70 6c 61 74 66 6f 72  gedOnly {platfor
7380: 6d 20 22 22 7d 20 7d 20 7b 0d 0a 20 20 20 20 20  m ""} } {..     
7390: 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
73a0: 3a 20 52 65 74 75 72 6e 73 20 74 68 65 20 73 70  : Returns the sp
73b0: 65 63 69 66 69 65 64 20 66 69 6c 65 20 6e 61 6d  ecified file nam
73c0: 65 20 61 73 20 69 66 20 69 74 20 77 65 72 65 20  e as if it were 
73d0: 6c 6f 63 61 74 65 64 20 69 6e 20 74 68 65 0d 0a  located in the..
73e0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 62 75        #       bu
73f0: 69 6c 64 20 64 69 72 65 63 74 6f 72 79 2c 20 64  ild directory, d
7400: 69 73 63 61 72 64 69 6e 67 20 61 6e 79 20 64 69  iscarding any di
7410: 72 65 63 74 6f 72 79 20 69 6e 66 6f 72 6d 61 74  rectory informat
7420: 69 6f 6e 20 70 72 65 73 65 6e 74 0d 0a 20 20 20  ion present..   
7430: 20 20 20 23 20 20 20 20 20 20 20 69 6e 20 74 68     #       in th
7440: 65 20 66 69 6c 65 20 6e 61 6d 65 20 61 73 20 70  e file name as p
7450: 72 6f 76 69 64 65 64 20 62 79 20 6f 75 72 20 63  rovided by our c
7460: 61 6c 6c 65 72 2e 0d 0a 20 20 20 20 20 20 23 0d  aller...      #.
7470: 0a 20 20 20 20 20 20 73 65 74 20 72 65 73 75 6c  .      set resul
7480: 74 20 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e 61  t [file nativena
7490: 6d 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  me \..          
74a0: 5b 66 69 6c 65 20 6a 6f 69 6e 20 5b 67 65 74 42  [file join [getB
74b0: 75 69 6c 64 44 69 72 65 63 74 6f 72 79 20 24 6d  uildDirectory $m
74c0: 61 6e 61 67 65 64 4f 6e 6c 79 5d 20 24 70 6c 61  anagedOnly] $pla
74d0: 74 66 6f 72 6d 20 5c 0d 0a 20 20 20 20 20 20 20  tform \..       
74e0: 20 20 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 66     [file tail $f
74f0: 69 6c 65 4e 61 6d 65 5d 5d 5d 0d 0a 0d 0a 20 20  ileName]]]....  
7500: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 48      #..      # H
7510: 41 43 4b 3a 20 57 68 65 6e 20 72 75 6e 6e 69 6e  ACK: When runnin
7520: 67 20 6f 6e 20 57 6f 57 36 34 2c 20 61 73 73 75  g on WoW64, assu
7530: 6d 65 20 74 68 65 20 74 65 73 74 20 65 78 65 63  me the test exec
7540: 75 74 61 62 6c 65 73 20 61 72 65 20 70 72 65 73  utables are pres
7550: 65 6e 74 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ent..      #    
7560: 20 20 20 77 69 74 68 20 74 68 65 20 22 33 32 22     with the "32"
7570: 20 73 75 66 66 69 78 20 6f 6e 20 74 68 65 6d 2e   suffix on them.
7580: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
7590: 20 69 66 20 7b 5b 69 73 52 75 6e 6e 69 6e 67 57   if {[isRunningW
75a0: 6f 57 36 34 5d 20 26 26 20 5b 66 69 6c 65 20 65  oW64] && [file e
75b0: 78 74 65 6e 73 69 6f 6e 20 24 72 65 73 75 6c 74  xtension $result
75c0: 5d 20 65 71 20 22 2e 65 78 65 22 7d 20 74 68 65  ] eq ".exe"} the
75d0: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 65 74  n {..        set
75e0: 20 72 65 73 75 6c 74 20 5b 61 70 70 65 6e 64 41   result [appendA
75f0: 72 67 73 20 5b 66 69 6c 65 20 72 6f 6f 74 6e 61  rgs [file rootna
7600: 6d 65 20 24 72 65 73 75 6c 74 5d 20 33 32 2e 65  me $result] 32.e
7610: 78 65 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a  xe]..      }....
7620: 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 72 65        return $re
7630: 73 75 6c 74 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a  sult..    }.....
7640: 20 20 20 20 70 72 6f 63 20 67 65 74 45 78 74 65      proc getExte
7650: 72 6e 61 6c 44 69 72 65 63 74 6f 72 79 20 7b 7d  rnalDirectory {}
7660: 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20   {..      #..   
7670: 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 69 73 20     # NOTE: This 
7680: 70 72 6f 63 65 64 75 72 65 20 72 65 74 75 72 6e  procedure return
7690: 73 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20  s the directory 
76a0: 77 68 65 72 65 20 74 68 65 20 65 78 74 65 72 6e  where the extern
76b0: 61 6c 20 62 69 6e 61 72 79 0d 0a 20 20 20 20 20  al binary..     
76c0: 20 23 20 20 20 20 20 20 20 66 69 6c 65 73 20 61   #       files a
76d0: 72 65 20 6c 6f 63 61 74 65 64 2e 0d 0a 20 20 20  re located...   
76e0: 20 20 20 23 0d 0a 20 20 20 20 20 20 72 65 74 75     #..      retu
76f0: 72 6e 20 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e  rn [file nativen
7700: 61 6d 65 20 5b 66 69 6c 65 20 64 69 72 6e 61 6d  ame [file dirnam
7710: 65 20 5b 66 69 6c 65 20 64 69 72 6e 61 6d 65 20  e [file dirname 
7720: 5b 69 6e 66 6f 20 62 69 6e 61 72 79 5d 5d 5d 5d  [info binary]]]]
7730: 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
7740: 70 72 6f 63 20 67 65 74 42 69 6e 61 72 79 44 69  proc getBinaryDi
7750: 72 65 63 74 6f 72 79 20 7b 7d 20 7b 0d 0a 20 20  rectory {} {..  
7760: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
7770: 4f 54 45 3a 20 54 68 69 73 20 70 72 6f 63 65 64  OTE: This proced
7780: 75 72 65 20 72 65 74 75 72 6e 73 20 74 68 65 20  ure returns the 
7790: 64 69 72 65 63 74 6f 72 79 20 77 68 65 72 65 20  directory where 
77a0: 74 68 65 20 74 65 73 74 20 61 70 70 6c 69 63 61  the test applica
77b0: 74 69 6f 6e 0d 0a 20 20 20 20 20 20 23 20 20 20  tion..      #   
77c0: 20 20 20 20 69 74 73 65 6c 66 20 28 69 2e 65 2e      itself (i.e.
77d0: 20 74 68 65 20 45 61 67 6c 65 20 73 68 65 6c 6c   the Eagle shell
77e0: 29 20 69 73 20 6c 6f 63 61 74 65 64 2e 20 20 54  ) is located.  T
77f0: 68 69 73 20 77 69 6c 6c 20 62 65 20 75 73 65 64  his will be used
7800: 20 61 73 0d 0a 20 20 20 20 20 20 23 20 20 20 20   as..      #    
7810: 20 20 20 74 68 65 20 64 65 73 74 69 6e 61 74 69     the destinati
7820: 6f 6e 20 66 6f 72 20 74 68 65 20 63 6f 70 69 65  on for the copie
7830: 64 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51  d System.Data.SQ
7840: 4c 69 74 65 20 6e 61 74 69 76 65 20 61 6e 64 0d  Lite native and.
7850: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 6d  .      #       m
7860: 61 6e 61 67 65 64 20 61 73 73 65 6d 62 6c 69 65  anaged assemblie
7870: 73 20 28 69 2e 65 2e 20 62 65 63 61 75 73 65 20  s (i.e. because 
7880: 74 68 69 73 20 69 73 20 6f 6e 65 20 6f 66 20 74  this is one of t
7890: 68 65 20 66 65 77 20 70 6c 61 63 65 73 0d 0a 20  he few places.. 
78a0: 20 20 20 20 20 23 20 20 20 20 20 20 20 77 68 65       #       whe
78b0: 72 65 20 74 68 65 20 43 4c 52 20 77 69 6c 6c 20  re the CLR will 
78c0: 61 63 74 75 61 6c 6c 79 20 66 69 6e 64 20 61 6e  actually find an
78d0: 64 20 6c 6f 61 64 20 74 68 65 6d 20 70 72 6f 70  d load them prop
78e0: 65 72 6c 79 29 2e 0d 0a 20 20 20 20 20 20 23 0d  erly)...      #.
78f0: 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f  .      if {[info
7900: 20 65 78 69 73 74 73 20 3a 3a 62 69 6e 61 72 79   exists ::binary
7910: 5f 64 69 72 65 63 74 6f 72 79 5d 20 26 26 20 5c  _directory] && \
7920: 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 73 74 72  ..          [str
7930: 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a 62 69  ing length $::bi
7940: 6e 61 72 79 5f 64 69 72 65 63 74 6f 72 79 5d 20  nary_directory] 
7950: 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  > 0} then {..   
7960: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
7970: 23 20 4e 4f 54 45 3a 20 54 68 65 20 6c 6f 63 61  # NOTE: The loca
7980: 74 69 6f 6e 20 6f 66 20 74 68 65 20 62 69 6e 61  tion of the bina
7990: 72 79 20 64 69 72 65 63 74 6f 72 79 20 68 61 73  ry directory has
79a0: 20 62 65 65 6e 20 6f 76 65 72 72 69 64 64 65 6e   been overridden
79b0: 3b 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  ;..        #    
79c0: 20 20 20 74 68 65 72 65 66 6f 72 65 2c 20 75 73     therefore, us
79d0: 65 20 69 74 20 76 65 72 62 61 74 69 6d 2e 0d 0a  e it verbatim...
79e0: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
79f0: 20 20 20 72 65 74 75 72 6e 20 24 3a 3a 62 69 6e     return $::bin
7a00: 61 72 79 5f 64 69 72 65 63 74 6f 72 79 0d 0a 20  ary_directory.. 
7a10: 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
7a20: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b 69         return [i
7a30: 6e 66 6f 20 62 69 6e 61 72 79 5d 0d 0a 20 20 20  nfo binary]..   
7a40: 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a     }..    }.....
7a50: 20 20 20 20 70 72 6f 63 20 67 65 74 45 78 74 65      proc getExte
7a60: 72 6e 61 6c 46 69 6c 65 4e 61 6d 65 20 7b 20 66  rnalFileName { f
7a70: 69 6c 65 4e 61 6d 65 20 7d 20 7b 0d 0a 20 20 20  ileName } {..   
7a80: 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
7a90: 54 45 3a 20 52 65 74 75 72 6e 73 20 74 68 65 20  TE: Returns the 
7aa0: 73 70 65 63 69 66 69 65 64 20 66 69 6c 65 20 6e  specified file n
7ab0: 61 6d 65 20 61 73 20 69 66 20 69 74 20 77 65 72  ame as if it wer
7ac0: 65 20 6c 6f 63 61 74 65 64 20 69 6e 20 74 68 65  e located in the
7ad0: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
7ae0: 64 69 72 65 63 74 6f 72 79 20 63 6f 6e 74 61 69  directory contai
7af0: 6e 69 6e 67 20 74 68 65 20 65 78 74 65 72 6e 61  ning the externa
7b00: 6c 20 62 69 6e 61 72 69 65 73 2e 0d 0a 20 20 20  l binaries...   
7b10: 20 20 20 23 0d 0a 20 20 20 20 20 20 72 65 74 75     #..      retu
7b20: 72 6e 20 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e  rn [file nativen
7b30: 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5b  ame [file join [
7b40: 67 65 74 45 78 74 65 72 6e 61 6c 44 69 72 65 63  getExternalDirec
7b50: 74 6f 72 79 5d 20 24 66 69 6c 65 4e 61 6d 65 5d  tory] $fileName]
7b60: 5d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  ]..    }.....   
7b70: 20 70 72 6f 63 20 67 65 74 42 69 6e 61 72 79 46   proc getBinaryF
7b80: 69 6c 65 4e 61 6d 65 20 7b 20 66 69 6c 65 4e 61  ileName { fileNa
7b90: 6d 65 20 7b 70 6c 61 74 66 6f 72 6d 20 22 22 7d  me {platform ""}
7ba0: 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20   } {..      #.. 
7bb0: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 52 65 74       # NOTE: Ret
7bc0: 75 72 6e 73 20 74 68 65 20 73 70 65 63 69 66 69  urns the specifi
7bd0: 65 64 20 66 69 6c 65 20 6e 61 6d 65 20 61 73 20  ed file name as 
7be0: 69 66 20 69 74 20 77 65 72 65 20 6c 6f 63 61 74  if it were locat
7bf0: 65 64 20 69 6e 20 74 68 65 0d 0a 20 20 20 20 20  ed in the..     
7c00: 20 23 20 20 20 20 20 20 20 62 69 6e 61 72 79 20   #       binary 
7c10: 64 69 72 65 63 74 6f 72 79 2c 20 64 69 73 63 61  directory, disca
7c20: 72 64 69 6e 67 20 61 6e 79 20 64 69 72 65 63 74  rding any direct
7c30: 6f 72 79 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ory information 
7c40: 70 72 65 73 65 6e 74 0d 0a 20 20 20 20 20 20 23  present..      #
7c50: 20 20 20 20 20 20 20 69 6e 20 74 68 65 20 66 69         in the fi
7c60: 6c 65 20 6e 61 6d 65 20 61 73 20 70 72 6f 76 69  le name as provi
7c70: 64 65 64 20 62 79 20 6f 75 72 20 63 61 6c 6c 65  ded by our calle
7c80: 72 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  r...      #..   
7c90: 20 20 20 72 65 74 75 72 6e 20 5b 66 69 6c 65 20     return [file 
7ca0: 6e 61 74 69 76 65 6e 61 6d 65 20 5c 0d 0a 20 20  nativename \..  
7cb0: 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20 6a 6f          [file jo
7cc0: 69 6e 20 5b 67 65 74 42 69 6e 61 72 79 44 69 72  in [getBinaryDir
7cd0: 65 63 74 6f 72 79 5d 20 24 70 6c 61 74 66 6f 72  ectory] $platfor
7ce0: 6d 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 66 69  m [file tail $fi
7cf0: 6c 65 4e 61 6d 65 5d 5d 5d 0d 0a 20 20 20 20 7d  leName]]]..    }
7d00: 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65  .....    proc ge
7d10: 74 43 6f 72 65 42 69 6e 61 72 79 46 69 6c 65 4e  tCoreBinaryFileN
7d20: 61 6d 65 20 7b 20 7b 70 6c 61 74 66 6f 72 6d 20  ame { {platform 
7d30: 22 22 7d 20 7b 73 74 61 6e 64 61 72 64 20 22 22  ""} {standard ""
7d40: 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a  } } {..      #..
7d50: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 52 65        # NOTE: Re
7d60: 74 75 72 6e 73 20 74 68 65 20 66 75 6c 6c 20 70  turns the full p
7d70: 61 74 68 20 66 6f 72 20 74 68 65 20 66 69 6c 65  ath for the file
7d80: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
7d90: 53 51 4c 69 74 65 20 63 6f 72 65 0d 0a 20 20 20  SQLite core..   
7da0: 20 20 20 23 20 20 20 20 20 20 20 6e 61 74 69 76     #       nativ
7db0: 65 20 6c 69 62 72 61 72 79 20 63 6f 64 65 20 66  e library code f
7dc0: 6f 72 20 74 68 69 73 20 70 6c 61 74 66 6f 72 6d  or this platform
7dd0: 2e 20 20 46 69 72 73 74 2c 20 63 68 65 63 6b 20  .  First, check 
7de0: 61 6e 64 20 73 65 65 20 69 66 0d 0a 20 20 20 20  and see if..    
7df0: 20 20 23 20 20 20 20 20 20 20 74 68 65 20 53 51    #       the SQ
7e00: 4c 69 74 65 20 63 6f 72 65 20 6e 61 74 69 76 65  Lite core native
7e10: 20 6c 69 62 72 61 72 79 20 68 61 73 20 61 6c 72   library has alr
7e20: 65 61 64 79 20 62 65 65 6e 20 6c 6f 61 64 65 64  eady been loaded
7e30: 2e 20 20 4e 65 78 74 2c 0d 0a 20 20 20 20 20 20  .  Next,..      
7e40: 23 20 20 20 20 20 20 20 66 61 6c 6c 62 61 63 6b  #       fallback
7e50: 20 74 6f 20 77 68 61 74 20 74 68 65 20 66 75 6c   to what the ful
7e60: 6c 20 70 61 74 68 20 73 68 6f 75 6c 64 20 62 65  l path should be
7e70: 2c 20 62 61 73 65 64 20 6f 6e 20 77 68 65 74 68  , based on wheth
7e80: 65 72 20 74 68 65 0d 0a 20 20 20 20 20 20 23 20  er the..      # 
7e90: 20 20 20 20 20 20 6d 69 78 65 64 2d 6d 6f 64 65        mixed-mode
7ea0: 20 61 73 73 65 6d 62 6c 79 20 69 73 20 62 65 69   assembly is bei
7eb0: 6e 67 20 75 73 65 64 20 61 6e 64 20 74 68 65 20  ng used and the 
7ec0: 6e 61 6d 65 20 6f 66 20 74 68 65 20 63 75 72 72  name of the curr
7ed0: 65 6e 74 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ent..      #    
7ee0: 20 20 20 70 6c 61 74 66 6f 72 6d 2e 0d 0a 20 20     platform...  
7ef0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20      #..      if 
7f00: 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20  {[catch {..     
7f10: 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65     object invoke
7f20: 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c   -flags +NonPubl
7f30: 69 63 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  ic \..          
7f40: 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51    System.Data.SQ
7f50: 4c 69 74 65 2e 55 6e 73 61 66 65 4e 61 74 69 76  Lite.UnsafeNativ
7f60: 65 4d 65 74 68 6f 64 73 20 5f 53 51 4c 69 74 65  eMethods _SQLite
7f70: 4e 61 74 69 76 65 4d 6f 64 75 6c 65 46 69 6c 65  NativeModuleFile
7f80: 4e 61 6d 65 0d 0a 20 20 20 20 20 20 7d 20 66 69  Name..      } fi
7f90: 6c 65 4e 61 6d 65 5d 20 3d 3d 20 30 20 26 26 20  leName] == 0 && 
7fa0: 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
7fb0: 66 69 6c 65 4e 61 6d 65 5d 20 3e 20 30 7d 20 74  fileName] > 0} t
7fc0: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  hen {..        #
7fd0: 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
7fe0: 3a 20 54 68 65 20 53 51 4c 69 74 65 20 63 6f 72  : The SQLite cor
7ff0: 65 20 6e 61 74 69 76 65 20 6c 69 62 72 61 72 79  e native library
8000: 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
8010: 6e 20 6c 6f 61 64 65 64 20 76 69 61 0d 0a 20 20  n loaded via..  
8020: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68        #       th
8030: 65 20 6e 61 74 69 76 65 20 6c 69 62 72 61 72 79  e native library
8040: 20 70 72 65 2d 6c 6f 61 64 65 72 2e 20 20 52 65   pre-loader.  Re
8050: 74 75 72 6e 20 74 68 61 74 20 66 69 6c 65 20 6e  turn that file n
8060: 61 6d 65 20 6e 6f 77 2e 0d 0a 20 20 20 20 20 20  ame now...      
8070: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74    #..        ret
8080: 75 72 6e 20 24 66 69 6c 65 4e 61 6d 65 0d 0a 20  urn $fileName.. 
8090: 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
80a0: 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
80b0: 20 49 66 20 74 68 65 20 22 6e 61 74 69 76 65 22   If the "native"
80c0: 20 72 75 6e 74 69 6d 65 20 6f 70 74 69 6f 6e 20   runtime option 
80d0: 68 61 73 20 62 65 65 6e 20 73 65 74 2c 20 61 6c  has been set, al
80e0: 77 61 79 73 20 72 65 74 75 72 6e 20 74 68 65 0d  ways return the.
80f0: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 66  .      #       f
8100: 69 6c 65 20 6e 61 6d 65 20 66 6f 72 20 74 68 65  ile name for the
8110: 20 6d 69 78 65 64 2d 6d 6f 64 65 20 61 73 73 65   mixed-mode asse
8120: 6d 62 6c 79 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  mbly...      #..
8130: 20 20 20 20 20 20 69 66 20 7b 5b 68 61 73 52 75        if {[hasRu
8140: 6e 74 69 6d 65 4f 70 74 69 6f 6e 20 6e 61 74 69  ntimeOption nati
8150: 76 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  ve]} then {..   
8160: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
8170: 23 20 4e 4f 54 45 3a 20 52 65 74 75 72 6e 20 74  # NOTE: Return t
8180: 68 65 20 6d 69 78 65 64 2d 6d 6f 64 65 20 61 73  he mixed-mode as
8190: 73 65 6d 62 6c 79 20 66 69 6c 65 20 6e 61 6d 65  sembly file name
81a0: 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
81b0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b 66 69        return [fi
81c0: 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65 20 5c 0d  le nativename \.
81d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 66 69  .            [fi
81e0: 6c 65 20 6a 6f 69 6e 20 5b 67 65 74 42 69 6e 61  le join [getBina
81f0: 72 79 44 69 72 65 63 74 6f 72 79 5d 20 24 70 6c  ryDirectory] $pl
8200: 61 74 66 6f 72 6d 20 53 79 73 74 65 6d 2e 44 61  atform System.Da
8210: 74 61 2e 53 51 4c 69 74 65 2e 64 6c 6c 5d 5d 0d  ta.SQLite.dll]].
8220: 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
8230: 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
8240: 45 3a 20 41 72 65 20 77 65 20 61 74 74 65 6d 70  E: Are we attemp
8250: 74 69 6e 67 20 74 6f 20 61 75 74 6f 6d 61 74 69  ting to automati
8260: 63 61 6c 6c 79 20 64 65 74 65 63 74 20 77 68 65  cally detect whe
8270: 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 0d  ther or not the.
8280: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 69  .      #       i
8290: 6e 74 65 72 6f 70 20 61 73 73 65 6d 62 6c 79 20  nterop assembly 
82a0: 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64 3f 0d  should be used?.
82b0: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
82c0: 73 65 74 20 61 75 74 6f 6d 61 74 69 63 20 5b 65  set automatic [e
82d0: 78 70 72 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e  xpr {[string len
82e0: 67 74 68 20 24 73 74 61 6e 64 61 72 64 5d 20 3d  gth $standard] =
82f0: 3d 20 30 7d 5d 0d 0a 0d 0a 20 20 20 20 20 20 23  = 0}]....      #
8300: 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
8310: 46 69 72 73 74 2c 20 69 6e 20 65 69 74 68 65 72  First, in either
8320: 20 22 61 75 74 6f 6d 61 74 69 63 22 20 6f 72 20   "automatic" or 
8330: 22 6e 6f 6e 2d 73 74 61 6e 64 61 72 64 22 20 6d  "non-standard" m
8340: 6f 64 65 73 2c 20 61 74 74 65 6d 70 74 0d 0a 20  odes, attempt.. 
8350: 20 20 20 20 20 23 20 20 20 20 20 20 20 74 6f 20       #       to 
8360: 66 69 6e 64 20 74 68 65 20 6e 61 74 69 76 65 2d  find the native-
8370: 6f 6e 6c 79 20 69 6e 74 65 72 6f 70 20 61 73 73  only interop ass
8380: 65 6d 62 6c 79 2e 0d 0a 20 20 20 20 20 20 23 0d  embly...      #.
8390: 0a 20 20 20 20 20 20 69 66 20 7b 24 61 75 74 6f  .      if {$auto
83a0: 6d 61 74 69 63 20 7c 7c 20 21 24 73 74 61 6e 64  matic || !$stand
83b0: 61 72 64 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  ard} then {..   
83c0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
83d0: 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74 20  # NOTE: Attempt 
83e0: 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65  to determine the
83f0: 20 6e 61 74 69 76 65 2d 6f 6e 6c 79 20 69 6e 74   native-only int
8400: 65 72 6f 70 20 61 73 73 65 6d 62 6c 79 20 66 69  erop assembly fi
8410: 6c 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  le..        #   
8420: 20 20 20 20 6e 61 6d 65 20 66 6f 72 20 74 68 69      name for thi
8430: 73 20 70 6c 61 74 66 6f 72 6d 20 61 6e 64 20 74  s platform and t
8440: 68 65 6e 20 72 65 74 75 72 6e 20 69 74 2e 0d 0a  hen return it...
8450: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
8460: 20 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65 4e     foreach fileN
8470: 61 6d 65 4f 6e 6c 79 20 5b 67 65 74 49 6e 74 65  ameOnly [getInte
8480: 72 6f 70 41 73 73 65 6d 62 6c 79 46 69 6c 65 4e  ropAssemblyFileN
8490: 61 6d 65 73 4f 6e 6c 79 5d 20 7b 0d 0a 20 20 20  amesOnly] {..   
84a0: 20 20 20 20 20 20 20 73 65 74 20 66 69 6c 65 4e         set fileN
84b0: 61 6d 65 20 5b 66 69 6c 65 20 6e 61 74 69 76 65  ame [file native
84c0: 6e 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20 20 20  name \..        
84d0: 20 20 20 20 20 20 5b 66 69 6c 65 20 6a 6f 69 6e        [file join
84e0: 20 5b 67 65 74 42 69 6e 61 72 79 44 69 72 65 63   [getBinaryDirec
84f0: 74 6f 72 79 5d 20 24 70 6c 61 74 66 6f 72 6d 20  tory] $platform 
8500: 24 66 69 6c 65 4e 61 6d 65 4f 6e 6c 79 5d 5d 0d  $fileNameOnly]].
8510: 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20  ...          if 
8520: 7b 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24 66  {[file exists $f
8530: 69 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b  ileName]} then {
8540: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65  ..            re
8550: 74 75 72 6e 20 24 66 69 6c 65 4e 61 6d 65 0d 0a  turn $fileName..
8560: 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
8570: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d       }..      }.
8580: 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
8590: 20 20 23 20 4e 4f 54 45 3a 20 54 68 65 6e 2c 20    # NOTE: Then, 
85a0: 69 6e 20 65 69 74 68 65 72 20 22 61 75 74 6f 6d  in either "autom
85b0: 61 74 69 63 22 20 6f 72 20 22 73 74 61 6e 64 61  atic" or "standa
85c0: 72 64 22 20 6d 6f 64 65 73 2c 20 61 74 74 65 6d  rd" modes, attem
85d0: 70 74 20 74 6f 0d 0a 20 20 20 20 20 20 23 20 20  pt to..      #  
85e0: 20 20 20 20 20 66 69 6e 64 20 74 68 65 20 73 74       find the st
85f0: 61 6e 64 61 72 64 20 53 51 4c 69 74 65 20 6c 69  andard SQLite li
8600: 62 72 61 72 79 2e 0d 0a 20 20 20 20 20 20 23 0d  brary...      #.
8610: 0a 20 20 20 20 20 20 69 66 20 7b 24 61 75 74 6f  .      if {$auto
8620: 6d 61 74 69 63 20 7c 7c 20 24 73 74 61 6e 64 61  matic || $standa
8630: 72 64 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  rd} then {..    
8640: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
8650: 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74 20 74   NOTE: Attempt t
8660: 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20  o determine the 
8670: 6e 61 74 69 76 65 2d 6f 6e 6c 79 20 73 74 61 6e  native-only stan
8680: 64 61 72 64 20 53 51 4c 69 74 65 20 6c 69 62 72  dard SQLite libr
8690: 61 72 79 0d 0a 20 20 20 20 20 20 20 20 23 20 20  ary..        #  
86a0: 20 20 20 20 20 66 69 6c 65 20 6e 61 6d 65 20 66       file name f
86b0: 6f 72 20 74 68 69 73 20 70 6c 61 74 66 6f 72 6d  or this platform
86c0: 20 61 6e 64 20 74 68 65 6e 20 72 65 74 75 72 6e   and then return
86d0: 20 69 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d   it...        #.
86e0: 0a 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68  .        foreach
86f0: 20 66 69 6c 65 4e 61 6d 65 4f 6e 6c 79 20 5b 67   fileNameOnly [g
8700: 65 74 4e 61 74 69 76 65 4c 69 62 72 61 72 79 46  etNativeLibraryF
8710: 69 6c 65 4e 61 6d 65 73 4f 6e 6c 79 5d 20 7b 0d  ileNamesOnly] {.
8720: 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20 66  .          set f
8730: 69 6c 65 4e 61 6d 65 20 5b 66 69 6c 65 20 6e 61  ileName [file na
8740: 74 69 76 65 6e 61 6d 65 20 5c 0d 0a 20 20 20 20  tivename \..    
8750: 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20            [file 
8760: 6a 6f 69 6e 20 5b 67 65 74 42 69 6e 61 72 79 44  join [getBinaryD
8770: 69 72 65 63 74 6f 72 79 5d 20 24 70 6c 61 74 66  irectory] $platf
8780: 6f 72 6d 20 24 66 69 6c 65 4e 61 6d 65 4f 6e 6c  orm $fileNameOnl
8790: 79 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  y]]....         
87a0: 20 69 66 20 7b 5b 66 69 6c 65 20 65 78 69 73 74   if {[file exist
87b0: 73 20 24 66 69 6c 65 4e 61 6d 65 5d 7d 20 74 68  s $fileName]} th
87c0: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
87d0: 20 20 72 65 74 75 72 6e 20 24 66 69 6c 65 4e 61    return $fileNa
87e0: 6d 65 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d  me..          }.
87f0: 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  .        }..    
8800: 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a    }....      #..
8810: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 57 61        # NOTE: Wa
8820: 73 20 74 68 65 20 6d 61 6e 61 67 65 64 20 61 73  s the managed as
8830: 73 65 6d 62 6c 79 20 63 6f 6d 70 69 6c 65 64 20  sembly compiled 
8840: 65 78 70 65 63 74 69 6e 67 20 74 6f 20 64 65 61  expecting to dea
8850: 6c 20 77 69 74 68 20 74 68 65 0d 0a 20 20 20 20  l with the..    
8860: 20 20 23 20 20 20 20 20 20 20 73 74 61 6e 64 61    #       standa
8870: 72 64 20 63 6f 72 65 20 6c 69 62 72 61 72 79 3f  rd core library?
8880: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
8890: 20 69 66 20 7b 5b 68 61 76 65 53 51 4c 69 74 65   if {[haveSQLite
88a0: 44 65 66 69 6e 65 43 6f 6e 73 74 61 6e 74 20 53  DefineConstant S
88b0: 51 4c 49 54 45 5f 53 54 41 4e 44 41 52 44 5d 7d  QLITE_STANDARD]}
88c0: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
88d0: 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
88e0: 54 45 3a 20 46 61 6c 6c 62 61 63 6b 20 74 6f 20  TE: Fallback to 
88f0: 72 65 74 75 72 6e 69 6e 67 20 74 68 65 20 6e 61  returning the na
8900: 74 69 76 65 2d 6f 6e 6c 79 20 73 74 61 6e 64 61  tive-only standa
8910: 72 64 20 53 51 4c 69 74 65 20 6c 69 62 72 61 72  rd SQLite librar
8920: 79 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  y..        #    
8930: 20 20 20 66 69 6c 65 20 6e 61 6d 65 20 66 6f 72     file name for
8940: 20 74 68 65 20 70 6c 61 74 66 6f 72 6d 2e 0d 0a   the platform...
8950: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
8960: 20 20 20 73 65 74 20 66 69 6c 65 4e 61 6d 65 73     set fileNames
8970: 4f 6e 6c 79 20 5b 67 65 74 4e 61 74 69 76 65 4c  Only [getNativeL
8980: 69 62 72 61 72 79 46 69 6c 65 4e 61 6d 65 73 4f  ibraryFileNamesO
8990: 6e 6c 79 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  nly]....        
89a0: 69 66 20 7b 5b 6c 6c 65 6e 67 74 68 20 24 66 69  if {[llength $fi
89b0: 6c 65 4e 61 6d 65 73 4f 6e 6c 79 5d 20 3d 3d 20  leNamesOnly] == 
89c0: 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
89d0: 20 20 20 20 20 72 65 74 75 72 6e 20 22 22 0d 0a       return ""..
89e0: 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
89f0: 20 20 20 20 20 72 65 74 75 72 6e 20 5b 66 69 6c       return [fil
8a00: 65 20 6e 61 74 69 76 65 6e 61 6d 65 20 5b 66 69  e nativename [fi
8a10: 6c 65 20 6a 6f 69 6e 20 5c 0d 0a 20 20 20 20 20  le join \..     
8a20: 20 20 20 20 20 20 20 5b 67 65 74 42 69 6e 61 72         [getBinar
8a30: 79 44 69 72 65 63 74 6f 72 79 5d 20 24 70 6c 61  yDirectory] $pla
8a40: 74 66 6f 72 6d 20 5b 6c 69 6e 64 65 78 20 24 66  tform [lindex $f
8a50: 69 6c 65 4e 61 6d 65 73 4f 6e 6c 79 20 30 5d 5d  ileNamesOnly 0]]
8a60: 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20  ]..      } else 
8a70: 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
8a80: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 46 61        # NOTE: Fa
8a90: 6c 6c 62 61 63 6b 20 74 6f 20 72 65 74 75 72 6e  llback to return
8aa0: 69 6e 67 20 74 68 65 20 6e 61 74 69 76 65 2d 6f  ing the native-o
8ab0: 6e 6c 79 20 69 6e 74 65 72 6f 70 20 61 73 73 65  nly interop asse
8ac0: 6d 62 6c 79 20 66 69 6c 65 0d 0a 20 20 20 20 20  mbly file..     
8ad0: 20 20 20 23 20 20 20 20 20 20 20 6e 61 6d 65 20     #       name 
8ae0: 66 6f 72 20 74 68 65 20 70 6c 61 74 66 6f 72 6d  for the platform
8af0: 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
8b00: 20 20 20 20 20 20 73 65 74 20 66 69 6c 65 4e 61        set fileNa
8b10: 6d 65 73 4f 6e 6c 79 20 5b 67 65 74 49 6e 74 65  mesOnly [getInte
8b20: 72 6f 70 41 73 73 65 6d 62 6c 79 46 69 6c 65 4e  ropAssemblyFileN
8b30: 61 6d 65 73 4f 6e 6c 79 5d 0d 0a 0d 0a 20 20 20  amesOnly]....   
8b40: 20 20 20 20 20 69 66 20 7b 5b 6c 6c 65 6e 67 74       if {[llengt
8b50: 68 20 24 66 69 6c 65 4e 61 6d 65 73 4f 6e 6c 79  h $fileNamesOnly
8b60: 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  ] == 0} then {..
8b70: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
8b80: 20 22 22 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a   ""..        }..
8b90: 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ..        return
8ba0: 20 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d   [file nativenam
8bb0: 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5c 0d 0a  e [file join \..
8bc0: 20 20 20 20 20 20 20 20 20 20 20 20 5b 67 65 74              [get
8bd0: 42 69 6e 61 72 79 44 69 72 65 63 74 6f 72 79 5d  BinaryDirectory]
8be0: 20 24 70 6c 61 74 66 6f 72 6d 20 5b 6c 69 6e 64   $platform [lind
8bf0: 65 78 20 24 66 69 6c 65 4e 61 6d 65 73 4f 6e 6c  ex $fileNamesOnl
8c00: 79 20 30 5d 5d 5d 0d 0a 20 20 20 20 20 20 7d 0d  y 0]]]..      }.
8c10: 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70  .    }.....    p
8c20: 72 6f 63 20 67 65 74 43 6f 6d 6d 6f 6e 44 69 72  roc getCommonDir
8c30: 65 63 74 6f 72 79 20 7b 7d 20 7b 0d 0a 20 20 20  ectory {} {..   
8c40: 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
8c50: 54 45 3a 20 54 68 69 73 20 70 72 6f 63 65 64 75  TE: This procedu
8c60: 72 65 20 72 65 74 75 72 6e 73 20 74 68 65 20 64  re returns the d
8c70: 69 72 65 63 74 6f 72 79 20 77 68 65 72 65 20 74  irectory where t
8c80: 68 65 20 74 65 73 74 20 73 63 72 69 70 74 73 0d  he test scripts.
8c90: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 73  .      #       s
8ca0: 68 6f 75 6c 64 20 62 65 20 6c 6f 63 61 74 65 64  hould be located
8cb0: 2e 20 20 42 79 20 64 65 66 61 75 6c 74 2c 20 74  .  By default, t
8cc0: 68 69 73 20 6a 75 73 74 20 72 65 74 75 72 6e 73  his just returns
8cd0: 20 74 68 65 20 45 61 67 6c 65 0d 0a 20 20 20 20   the Eagle..    
8ce0: 20 20 23 20 20 20 20 20 20 20 62 69 6e 61 72 79    #       binary
8cf0: 20 64 69 72 65 63 74 6f 72 79 2e 0d 0a 20 20 20   directory...   
8d00: 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
8d10: 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 63  [info exists ::c
8d20: 6f 6d 6d 6f 6e 5f 64 69 72 65 63 74 6f 72 79 5d  ommon_directory]
8d30: 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20   && \..         
8d40: 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20   [string length 
8d50: 24 3a 3a 63 6f 6d 6d 6f 6e 5f 64 69 72 65 63 74  $::common_direct
8d60: 6f 72 79 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b  ory] > 0} then {
8d70: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
8d80: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 65       # NOTE: The
8d90: 20 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 74 68 65   location of the
8da0: 20 63 6f 6d 6d 6f 6e 20 64 69 72 65 63 74 6f 72   common director
8db0: 79 20 68 61 73 20 62 65 65 6e 20 73 65 74 3b 0d  y has been set;.
8dc0: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
8dd0: 20 74 68 65 72 65 66 6f 72 65 2c 20 75 73 65 20   therefore, use 
8de0: 69 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  it...        #..
8df0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 24          return $
8e00: 3a 3a 63 6f 6d 6d 6f 6e 5f 64 69 72 65 63 74 6f  ::common_directo
8e10: 72 79 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65  ry..      } else
8e20: 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73  if {[info exists
8e30: 20 3a 3a 76 65 6e 64 6f 72 5f 64 69 72 65 63 74   ::vendor_direct
8e40: 6f 72 79 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20  ory] && \..     
8e50: 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e       [string len
8e60: 67 74 68 20 24 3a 3a 76 65 6e 64 6f 72 5f 64 69  gth $::vendor_di
8e70: 72 65 63 74 6f 72 79 5d 20 3e 20 30 7d 20 74 68  rectory] > 0} th
8e80: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d  en {..        #.
8e90: 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
8ea0: 20 54 68 65 20 6c 6f 63 61 74 69 6f 6e 20 6f 66   The location of
8eb0: 20 74 68 65 20 76 65 6e 64 6f 72 20 64 69 72 65   the vendor dire
8ec0: 63 74 6f 72 79 20 68 61 73 20 62 65 65 6e 20 73  ctory has been s
8ed0: 65 74 3b 0d 0a 20 20 20 20 20 20 20 20 23 20 20  et;..        #  
8ee0: 20 20 20 20 20 74 68 65 72 65 66 6f 72 65 2c 20       therefore, 
8ef0: 75 73 65 20 69 74 2e 0d 0a 20 20 20 20 20 20 20  use it...       
8f00: 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75   #..        retu
8f10: 72 6e 20 24 3a 3a 76 65 6e 64 6f 72 5f 64 69 72  rn $::vendor_dir
8f20: 65 63 74 6f 72 79 0d 0a 20 20 20 20 20 20 7d 20  ectory..      } 
8f30: 65 6c 73 65 69 66 20 7b 5b 69 6e 66 6f 20 65 78  elseif {[info ex
8f40: 69 73 74 73 20 3a 3a 74 63 6c 5f 6c 69 62 72 61  ists ::tcl_libra
8f50: 72 79 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20  ry] && \..      
8f60: 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67      [string leng
8f70: 74 68 20 24 3a 3a 74 63 6c 5f 6c 69 62 72 61 72  th $::tcl_librar
8f80: 79 5d 20 3e 20 30 20 26 26 20 5c 0d 0a 20 20 20  y] > 0 && \..   
8f90: 20 20 20 20 20 20 20 5b 66 69 6c 65 20 69 73 64         [file isd
8fa0: 69 72 65 63 74 6f 72 79 20 24 3a 3a 74 63 6c 5f  irectory $::tcl_
8fb0: 6c 69 62 72 61 72 79 5d 7d 20 74 68 65 6e 20 7b  library]} then {
8fc0: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
8fd0: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 65       # NOTE: The
8fe0: 20 76 61 72 69 61 62 6c 65 20 77 69 74 68 20 74   variable with t
8ff0: 68 65 20 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 74  he location of t
9000: 68 65 20 73 63 72 69 70 74 20 6c 69 62 72 61 72  he script librar
9010: 79 20 69 73 0d 0a 20 20 20 20 20 20 20 20 23 20  y is..        # 
9020: 20 20 20 20 20 20 73 65 74 20 61 6e 64 20 61 70        set and ap
9030: 70 65 61 72 73 20 74 6f 20 62 65 20 61 20 72 65  pears to be a re
9040: 61 6c 20 64 69 72 65 63 74 6f 72 79 20 28 69 2e  al directory (i.
9050: 65 2e 20 6e 6f 74 20 65 6d 62 65 64 64 65 64 0d  e. not embedded.
9060: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
9070: 20 77 69 74 68 69 6e 20 61 20 66 69 6c 65 29 3b   within a file);
9080: 20 74 68 65 72 65 66 6f 72 65 2c 20 75 73 65 20   therefore, use 
9090: 69 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  it...        #..
90a0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 24          return $
90b0: 3a 3a 74 63 6c 5f 6c 69 62 72 61 72 79 0d 0a 20  ::tcl_library.. 
90c0: 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
90d0: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
90e0: 20 20 23 20 4e 4f 54 45 3a 20 46 61 6c 6c 62 61    # NOTE: Fallba
90f0: 63 6b 20 74 6f 20 74 68 65 20 64 69 72 65 63 74  ck to the direct
9100: 6f 72 79 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ory containing t
9110: 68 65 20 65 78 65 63 75 74 61 62 6c 65 2e 0d 0a  he executable...
9120: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
9130: 20 20 20 72 65 74 75 72 6e 20 5b 69 6e 66 6f 20     return [info 
9140: 62 69 6e 61 72 79 5d 0d 0a 20 20 20 20 20 20 7d  binary]..      }
9150: 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
9160: 70 72 6f 63 20 67 65 74 44 61 74 61 62 61 73 65  proc getDatabase
9170: 44 69 72 65 63 74 6f 72 79 20 7b 7d 20 7b 0d 0a  Directory {} {..
9180: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
9190: 20 4e 4f 54 45 3a 20 54 68 69 73 20 70 72 6f 63   NOTE: This proc
91a0: 65 64 75 72 65 20 72 65 74 75 72 6e 73 20 74 68  edure returns th
91b0: 65 20 64 69 72 65 63 74 6f 72 79 20 77 68 65 72  e directory wher
91c0: 65 20 74 68 65 20 74 65 73 74 20 64 61 74 61 62  e the test datab
91d0: 61 73 65 73 0d 0a 20 20 20 20 20 20 23 20 20 20  ases..      #   
91e0: 20 20 20 20 73 68 6f 75 6c 64 20 62 65 20 6c 6f      should be lo
91f0: 63 61 74 65 64 2e 20 20 42 79 20 64 65 66 61 75  cated.  By defau
9200: 6c 74 2c 20 74 68 69 73 20 6a 75 73 74 20 75 73  lt, this just us
9210: 65 73 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  es the temporary
9220: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
9230: 64 69 72 65 63 74 6f 72 79 20 63 6f 6e 66 69 67  directory config
9240: 75 72 65 64 20 66 6f 72 20 74 68 69 73 20 73 79  ured for this sy
9250: 73 74 65 6d 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  stem...      #..
9260: 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20        if {[info 
9270: 65 78 69 73 74 73 20 3a 3a 64 61 74 61 62 61 73  exists ::databas
9280: 65 5f 64 69 72 65 63 74 6f 72 79 5d 20 26 26 20  e_directory] && 
9290: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 73 74  \..          [st
92a0: 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a 64  ring length $::d
92b0: 61 74 61 62 61 73 65 5f 64 69 72 65 63 74 6f 72  atabase_director
92c0: 79 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  y] > 0} then {..
92d0: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
92e0: 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 65 20 6c     # NOTE: The l
92f0: 6f 63 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 64  ocation of the d
9300: 61 74 61 62 61 73 65 20 64 69 72 65 63 74 6f 72  atabase director
9310: 79 20 68 61 73 20 62 65 65 6e 20 6f 76 65 72 72  y has been overr
9320: 69 64 64 65 6e 3b 0d 0a 20 20 20 20 20 20 20 20  idden;..        
9330: 23 20 20 20 20 20 20 20 74 68 65 72 65 66 6f 72  #       therefor
9340: 65 2c 20 75 73 65 20 69 74 2e 0d 0a 20 20 20 20  e, use it...    
9350: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72      #..        r
9360: 65 74 75 72 6e 20 24 3a 3a 64 61 74 61 62 61 73  eturn $::databas
9370: 65 5f 64 69 72 65 63 74 6f 72 79 0d 0a 20 20 20  e_directory..   
9380: 20 20 20 7d 20 65 6c 73 65 69 66 20 7b 5b 69 6e     } elseif {[in
9390: 66 6f 20 65 78 69 73 74 73 20 3a 3a 73 63 72 61  fo exists ::scra
93a0: 74 63 68 5f 64 69 72 65 63 74 6f 72 79 5d 20 26  tch_directory] &
93b0: 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b  & \..          [
93c0: 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a  string length $:
93d0: 3a 73 63 72 61 74 63 68 5f 64 69 72 65 63 74 6f  :scratch_directo
93e0: 72 79 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d  ry] > 0} then {.
93f0: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
9400: 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 65 20      # NOTE: The 
9410: 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  location of the 
9420: 73 63 72 61 74 63 68 20 64 69 72 65 63 74 6f 72  scratch director
9430: 79 20 68 61 73 20 62 65 65 6e 20 6f 76 65 72 72  y has been overr
9440: 69 64 64 65 6e 3b 0d 0a 20 20 20 20 20 20 20 20  idden;..        
9450: 23 20 20 20 20 20 20 20 74 68 65 72 65 66 6f 72  #       therefor
9460: 65 2c 20 75 73 65 20 69 74 2e 0d 0a 20 20 20 20  e, use it...    
9470: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72      #..        r
9480: 65 74 75 72 6e 20 24 3a 3a 73 63 72 61 74 63 68  eturn $::scratch
9490: 5f 64 69 72 65 63 74 6f 72 79 0d 0a 20 20 20 20  _directory..    
94a0: 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
94b0: 20 20 20 20 72 65 74 75 72 6e 20 5b 67 65 74 54      return [getT
94c0: 65 6d 70 6f 72 61 72 79 50 61 74 68 5d 0d 0a 20  emporaryPath].. 
94d0: 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c       }..    }...
94e0: 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74 54 65  ..    proc getTe
94f0: 6d 70 6f 72 61 72 79 44 69 72 65 63 74 6f 72 79  mporaryDirectory
9500: 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a   {} {..      #..
9510: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68        # NOTE: Th
9520: 69 73 20 70 72 6f 63 65 64 75 72 65 20 72 65 74  is procedure ret
9530: 75 72 6e 73 20 74 68 65 20 64 69 72 65 63 74 6f  urns the directo
9540: 72 79 20 77 68 65 72 65 20 74 68 65 20 74 65 6d  ry where the tem
9550: 70 6f 72 61 72 79 20 66 69 6c 65 73 0d 0a 20 20  porary files..  
9560: 20 20 20 20 23 20 20 20 20 20 20 20 73 68 6f 75      #       shou
9570: 6c 64 20 62 65 20 6c 6f 63 61 74 65 64 2e 20 20  ld be located.  
9580: 42 79 20 64 65 66 61 75 6c 74 2c 20 74 68 69 73  By default, this
9590: 20 6a 75 73 74 20 75 73 65 73 20 74 68 65 20 74   just uses the t
95a0: 65 6d 70 6f 72 61 72 79 0d 0a 20 20 20 20 20 20  emporary..      
95b0: 23 20 20 20 20 20 20 20 64 69 72 65 63 74 6f 72  #       director
95c0: 79 20 63 6f 6e 66 69 67 75 72 65 64 20 66 6f 72  y configured for
95d0: 20 74 68 69 73 20 73 79 73 74 65 6d 2e 0d 0a 20   this system... 
95e0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66       #..      if
95f0: 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a   {[info exists :
9600: 3a 74 65 6d 70 6f 72 61 72 79 5f 64 69 72 65 63  :temporary_direc
9610: 74 6f 72 79 5d 20 26 26 20 5c 0d 0a 20 20 20 20  tory] && \..    
9620: 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65        [string le
9630: 6e 67 74 68 20 24 3a 3a 74 65 6d 70 6f 72 61 72  ngth $::temporar
9640: 79 5f 64 69 72 65 63 74 6f 72 79 5d 20 3e 20 30  y_directory] > 0
9650: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
9660: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
9670: 4f 54 45 3a 20 54 68 65 20 6c 6f 63 61 74 69 6f  OTE: The locatio
9680: 6e 20 6f 66 20 74 68 65 20 74 65 6d 70 6f 72 61  n of the tempora
9690: 72 79 20 64 69 72 65 63 74 6f 72 79 20 68 61 73  ry directory has
96a0: 20 62 65 65 6e 20 6f 76 65 72 72 69 64 64 65 6e   been overridden
96b0: 3b 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  ;..        #    
96c0: 20 20 20 74 68 65 72 65 66 6f 72 65 2c 20 75 73     therefore, us
96d0: 65 20 69 74 2e 0d 0a 20 20 20 20 20 20 20 20 23  e it...        #
96e0: 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ..        return
96f0: 20 24 3a 3a 74 65 6d 70 6f 72 61 72 79 5f 64 69   $::temporary_di
9700: 72 65 63 74 6f 72 79 0d 0a 20 20 20 20 20 20 7d  rectory..      }
9710: 20 65 6c 73 65 69 66 20 7b 5b 69 6e 66 6f 20 65   elseif {[info e
9720: 78 69 73 74 73 20 3a 3a 73 63 72 61 74 63 68 5f  xists ::scratch_
9730: 64 69 72 65 63 74 6f 72 79 5d 20 26 26 20 5c 0d  directory] && \.
9740: 0a 20 20 20 20 20 20 20 20 20 20 5b 73 74 72 69  .          [stri
9750: 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a 73 63 72  ng length $::scr
9760: 61 74 63 68 5f 64 69 72 65 63 74 6f 72 79 5d 20  atch_directory] 
9770: 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  > 0} then {..   
9780: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
9790: 23 20 4e 4f 54 45 3a 20 54 68 65 20 6c 6f 63 61  # NOTE: The loca
97a0: 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 63 72 61  tion of the scra
97b0: 74 63 68 20 64 69 72 65 63 74 6f 72 79 20 68 61  tch directory ha
97c0: 73 20 62 65 65 6e 20 6f 76 65 72 72 69 64 64 65  s been overridde
97d0: 6e 3b 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  n;..        #   
97e0: 20 20 20 20 74 68 65 72 65 66 6f 72 65 2c 20 75      therefore, u
97f0: 73 65 20 69 74 2e 0d 0a 20 20 20 20 20 20 20 20  se it...        
9800: 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  #..        retur
9810: 6e 20 24 3a 3a 73 63 72 61 74 63 68 5f 64 69 72  n $::scratch_dir
9820: 65 63 74 6f 72 79 0d 0a 20 20 20 20 20 20 7d 20  ectory..      } 
9830: 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
9840: 72 65 74 75 72 6e 20 5b 67 65 74 54 65 6d 70 6f  return [getTempo
9850: 72 61 72 79 50 61 74 68 5d 0d 0a 20 20 20 20 20  raryPath]..     
9860: 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20   }..    }.....  
9870: 20 20 70 72 6f 63 20 67 65 74 45 78 65 63 75 74    proc getExecut
9880: 65 4f 6e 53 65 74 75 70 20 7b 7d 20 7b 0d 0a 20  eOnSetup {} {.. 
9890: 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65       if {[info e
98a0: 78 69 73 74 73 20 3a 3a 65 78 65 63 75 74 65 5f  xists ::execute_
98b0: 6f 6e 5f 73 65 74 75 70 5d 20 26 26 20 5c 0d 0a  on_setup] && \..
98c0: 20 20 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e            [strin
98d0: 67 20 6c 65 6e 67 74 68 20 24 3a 3a 65 78 65 63  g length $::exec
98e0: 75 74 65 5f 6f 6e 5f 73 65 74 75 70 5d 20 3e 20  ute_on_setup] > 
98f0: 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
9900: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
9910: 4e 4f 54 45 3a 20 52 65 74 75 72 6e 20 74 68 65  NOTE: Return the
9920: 20 63 6f 6e 66 69 67 75 72 65 64 20 53 51 4c 20   configured SQL 
9930: 74 6f 20 65 78 65 63 75 74 65 20 64 75 72 69 6e  to execute durin
9940: 67 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  g the connection
9950: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
9960: 20 20 73 65 74 75 70 20 70 72 6f 63 65 64 75 72    setup procedur
9970: 65 20 28 69 2e 65 2e 20 66 6f 72 20 65 76 65 72  e (i.e. for ever
9980: 79 20 74 65 73 74 20 64 61 74 61 62 61 73 65 20  y test database 
9990: 63 6f 6e 6e 65 63 74 69 6f 6e 29 2e 0d 0a 20 20  connection)...  
99a0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
99b0: 20 72 65 74 75 72 6e 20 24 3a 3a 65 78 65 63 75   return $::execu
99c0: 74 65 5f 6f 6e 5f 73 65 74 75 70 0d 0a 20 20 20  te_on_setup..   
99d0: 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
99e0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
99f0: 23 20 4e 4f 54 45 3a 20 42 79 20 64 65 66 61 75  # NOTE: By defau
9a00: 6c 74 2c 20 74 68 65 72 65 20 69 73 20 6e 6f 20  lt, there is no 
9a10: 53 51 4c 20 74 6f 20 65 78 65 63 75 74 65 20 64  SQL to execute d
9a20: 75 72 69 6e 67 20 74 68 65 20 63 6f 6e 6e 65 63  uring the connec
9a30: 74 69 6f 6e 0d 0a 20 20 20 20 20 20 20 20 23 20  tion..        # 
9a40: 20 20 20 20 20 20 73 65 74 75 70 20 70 72 6f 63        setup proc
9a50: 65 64 75 72 65 20 28 69 2e 65 2e 20 66 6f 72 20  edure (i.e. for 
9a60: 65 76 65 72 79 20 74 65 73 74 20 64 61 74 61 62  every test datab
9a70: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 29 2e  ase connection).
9a80: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
9a90: 20 20 20 20 20 72 65 74 75 72 6e 20 22 22 0d 0a       return ""..
9aa0: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a        }..    }..
9ab0: 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74 53  ...    proc getS
9ac0: 74 72 69 6e 67 4d 61 70 46 6f 72 54 63 6c 45 73  tringMapForTclEs
9ad0: 63 61 70 65 20 7b 7d 20 7b 0d 0a 20 20 20 20 20  cape {} {..     
9ae0: 20 72 65 74 75 72 6e 20 5b 6c 69 73 74 20 5c 5c   return [list \\
9af0: 20 5c 5c 5c 5c 20 5c 5b 20 5c 5c 5c 5b 20 5c 5d   \\\\ \[ \\\[ \]
9b00: 20 5c 5c 5c 5d 20 5c 24 20 5c 5c 5c 24 5d 0d 0a   \\\] \$ \\\$]..
9b10: 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
9b20: 6f 63 20 67 65 74 54 65 73 74 4f 76 65 72 72 69  oc getTestOverri
9b30: 64 65 73 50 72 65 61 6d 62 6c 65 20 7b 20 7b 65  desPreamble { {e
9b40: 78 74 72 61 56 61 72 4e 61 6d 65 73 20 22 22 7d  xtraVarNames ""}
9b50: 20 7d 20 7b 0d 0a 20 20 20 20 20 20 73 65 74 20   } {..      set 
9b60: 76 61 72 4e 61 6d 65 73 20 5b 6c 69 73 74 5d 0d  varNames [list].
9b70: 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
9b80: 20 20 23 20 4e 4f 54 45 3a 20 49 66 20 61 76 61    # NOTE: If ava
9b90: 69 6c 61 62 6c 65 2c 20 73 74 61 72 74 20 77 69  ilable, start wi
9ba0: 74 68 20 74 68 65 20 6d 61 73 74 65 72 20 6c 69  th the master li
9bb0: 73 74 20 6f 66 20 74 65 73 74 20 6f 76 65 72 72  st of test overr
9bc0: 69 64 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ide..      #    
9bd0: 20 20 20 76 61 72 69 61 62 6c 65 73 2e 0d 0a 20     variables... 
9be0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66       #..      if
9bf0: 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a   {[info exists :
9c00: 3a 74 65 73 74 5f 6f 76 65 72 72 69 64 65 73 5d  :test_overrides]
9c10: 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20   && \..         
9c20: 20 5b 6c 6c 65 6e 67 74 68 20 24 3a 3a 74 65 73   [llength $::tes
9c30: 74 5f 6f 76 65 72 72 69 64 65 73 5d 20 3e 20 30  t_overrides] > 0
9c40: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
9c50: 20 20 65 76 61 6c 20 6c 61 70 70 65 6e 64 20 76    eval lappend v
9c60: 61 72 4e 61 6d 65 73 20 24 3a 3a 74 65 73 74 5f  arNames $::test_
9c70: 6f 76 65 72 72 69 64 65 73 0d 0a 20 20 20 20 20  overrides..     
9c80: 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20   }....      #.. 
9c90: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 66 20       # NOTE: If 
9ca0: 72 65 71 75 65 73 74 65 64 20 62 79 20 6f 75 72  requested by our
9cb0: 20 63 61 6c 6c 65 72 2c 20 61 64 64 20 61 6e 79   caller, add any
9cc0: 20 61 64 64 69 74 69 6f 6e 61 6c 20 76 61 72 69   additional vari
9cd0: 61 62 6c 65 0d 0a 20 20 20 20 20 20 23 20 20 20  able..      #   
9ce0: 20 20 20 20 6e 61 6d 65 73 20 74 6f 20 63 6f 70      names to cop
9cf0: 79 20 6e 6f 77 2e 0d 0a 20 20 20 20 20 20 23 0d  y now...      #.
9d00: 0a 20 20 20 20 20 20 69 66 20 7b 5b 6c 6c 65 6e  .      if {[llen
9d10: 67 74 68 20 24 65 78 74 72 61 56 61 72 4e 61 6d  gth $extraVarNam
9d20: 65 73 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d  es] > 0} then {.
9d30: 0a 20 20 20 20 20 20 20 20 65 76 61 6c 20 6c 61  .        eval la
9d40: 70 70 65 6e 64 20 76 61 72 4e 61 6d 65 73 20 24  ppend varNames $
9d50: 65 78 74 72 61 56 61 72 4e 61 6d 65 73 0d 0a 20  extraVarNames.. 
9d60: 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
9d70: 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
9d80: 20 42 75 69 6c 64 20 74 68 65 20 73 63 72 69 70   Build the scrip
9d90: 74 20 66 72 61 67 6d 65 6e 74 20 74 6f 20 62 65  t fragment to be
9da0: 20 72 65 74 75 72 6e 65 64 20 62 79 20 70 72 6f   returned by pro
9db0: 63 65 73 73 69 6e 67 20 65 61 63 68 0d 0a 20 20  cessing each..  
9dc0: 20 20 20 20 23 20 20 20 20 20 20 20 76 61 72 69      #       vari
9dd0: 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64 20 61 64  able name and ad
9de0: 64 69 6e 67 20 74 68 65 20 6e 65 63 65 63 65 73  ding the nececes
9df0: 73 61 72 79 20 73 63 72 69 70 74 20 66 72 61 67  sary script frag
9e00: 6d 65 6e 74 73 20 66 6f 72 0d 0a 20 20 20 20 20  ments for..     
9e10: 20 23 20 20 20 20 20 20 20 65 61 63 68 20 6f 6e   #       each on
9e20: 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  e...      #..   
9e30: 20 20 20 73 65 74 20 72 65 73 75 6c 74 20 22 22     set result ""
9e40: 0d 0a 0d 0a 20 20 20 20 20 20 66 6f 72 65 61 63  ....      foreac
9e50: 68 20 76 61 72 4e 61 6d 65 20 24 76 61 72 4e 61  h varName $varNa
9e60: 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  mes {..        #
9e70: 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
9e80: 3a 20 42 75 69 6c 64 20 74 68 65 20 71 75 61 6c  : Build the qual
9e90: 69 66 69 65 64 20 67 6c 6f 62 61 6c 20 76 61 72  ified global var
9ea0: 69 61 62 6c 65 20 6e 61 6d 65 2e 0d 0a 20 20 20  iable name...   
9eb0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
9ec0: 73 65 74 20 66 75 6c 6c 56 61 72 4e 61 6d 65 20  set fullVarName 
9ed0: 5b 61 70 70 65 6e 64 41 72 67 73 20 3a 3a 20 24  [appendArgs :: $
9ee0: 76 61 72 4e 61 6d 65 5d 0d 0a 0d 0a 20 20 20 20  varName]....    
9ef0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
9f00: 20 4e 4f 54 45 3a 20 44 6f 65 73 20 74 68 65 20   NOTE: Does the 
9f10: 76 61 72 69 61 62 6c 65 20 65 78 69 73 74 20 69  variable exist i
9f20: 6e 20 74 68 69 73 20 69 6e 74 65 72 70 72 65 74  n this interpret
9f30: 65 72 20 63 6f 6e 74 65 78 74 3f 0d 0a 20 20 20  er context?..   
9f40: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
9f50: 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73  if {[info exists
9f60: 20 24 66 75 6c 6c 56 61 72 4e 61 6d 65 5d 7d 20   $fullVarName]} 
9f70: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
9f80: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23    #..          #
9f90: 20 4e 4f 54 45 3a 20 41 70 70 65 6e 64 20 61 20   NOTE: Append a 
9fa0: 73 63 72 69 70 74 20 66 72 61 67 6d 65 6e 74 20  script fragment 
9fb0: 74 6f 20 74 68 65 20 72 65 73 75 6c 74 20 74 68  to the result th
9fc0: 61 74 20 77 69 6c 6c 20 63 6f 72 72 65 63 74 6c  at will correctl
9fd0: 79 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 20  y..          #  
9fe0: 20 20 20 20 20 63 6f 70 79 20 61 6e 79 20 63 6f       copy any co
9ff0: 6e 74 61 69 6e 65 64 20 76 61 6c 75 65 20 74 6f  ntained value to
a000: 20 61 6e 6f 74 68 65 72 20 69 6e 74 65 72 70 72   another interpr
a010: 65 74 65 72 20 63 6f 6e 74 65 78 74 2e 0d 0a 20  eter context... 
a020: 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
a030: 20 20 20 20 20 20 61 70 70 65 6e 64 20 72 65 73        append res
a040: 75 6c 74 20 5c 6e 20 22 73 65 74 20 22 20 24 66  ult \n "set " $f
a050: 75 6c 6c 56 61 72 4e 61 6d 65 20 22 20 5c 7b 22  ullVarName " \{"
a060: 20 5b 73 74 72 69 6e 67 20 6d 61 70 20 5c 0d 0a   [string map \..
a070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 67                [g
a080: 65 74 53 74 72 69 6e 67 4d 61 70 46 6f 72 54 63  etStringMapForTc
a090: 6c 45 73 63 61 70 65 5d 20 5b 73 65 74 20 24 66  lEscape] [set $f
a0a0: 75 6c 6c 56 61 72 4e 61 6d 65 5d 5d 20 5c 7d 0d  ullVarName]] \}.
a0b0: 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  .        }..    
a0c0: 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a    }....      #..
a0d0: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 66        # NOTE: If
a0e0: 20 74 68 65 20 72 65 73 75 6c 74 20 63 6f 6e 74   the result cont
a0f0: 61 69 6e 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  ains one or more
a100: 20 73 63 72 69 70 74 20 66 72 61 67 6d 65 6e 74   script fragment
a110: 73 2c 20 61 70 70 65 6e 64 20 61 0d 0a 20 20 20  s, append a..   
a120: 20 20 20 23 20 20 20 20 20 20 20 6e 65 77 6c 69     #       newli
a130: 6e 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  ne...      #..  
a140: 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20      if {[string 
a150: 6c 65 6e 67 74 68 20 24 72 65 73 75 6c 74 5d 20  length $result] 
a160: 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  > 0} then {..   
a170: 20 20 20 20 20 61 70 70 65 6e 64 20 72 65 73 75       append resu
a180: 6c 74 20 5c 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a  lt \n..      }..
a190: 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 24  ..      return $
a1a0: 72 65 73 75 6c 74 0d 0a 20 20 20 20 7d 0d 0a 0c  result..    }...
a1b0: 0d 0a 20 20 20 20 70 72 6f 63 20 6d 6f 76 65 53  ..    proc moveS
a1c0: 79 73 74 65 6d 44 61 74 61 53 51 4c 69 74 65 44  ystemDataSQLiteD
a1d0: 6c 6c 43 6f 6e 66 69 67 20 7b 20 7b 72 65 73 74  llConfig { {rest
a1e0: 6f 72 65 20 66 61 6c 73 65 7d 20 7b 76 65 72 62  ore false} {verb
a1f0: 6f 73 65 20 74 72 75 65 7d 20 7d 20 7b 0d 0a 20  ose true} } {.. 
a200: 20 20 20 20 20 73 65 74 20 64 69 72 65 63 74 6f       set directo
a210: 72 79 20 5b 67 65 74 42 69 6e 61 72 79 44 69 72  ry [getBinaryDir
a220: 65 63 74 6f 72 79 5d 0d 0a 0d 0a 20 20 20 20 20  ectory]....     
a230: 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e   if {[string len
a240: 67 74 68 20 24 64 69 72 65 63 74 6f 72 79 5d 20  gth $directory] 
a250: 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  == 0} then {..  
a260: 20 20 20 20 20 20 69 66 20 7b 24 76 65 72 62 6f        if {$verbo
a270: 73 65 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  se} then {..    
a280: 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
a290: 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70  est_channel [app
a2a0: 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
a2b0: 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 73           "---- s
a2c0: 6b 69 70 70 65 64 20 6d 6f 76 69 6e 67 20 5c 22  kipped moving \"
a2d0: 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
a2e0: 74 65 2e 64 6c 6c 2e 63 6f 6e 66 69 67 5c 22 2c  te.dll.config\",
a2f0: 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20   " \..          
a300: 20 20 20 20 22 6e 6f 20 62 69 6e 61 72 79 20 64      "no binary d
a310: 69 72 65 63 74 6f 72 79 5c 6e 22 5d 0d 0a 20 20  irectory\n"]..  
a320: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
a330: 20 20 20 72 65 74 75 72 6e 0d 0a 20 20 20 20 20     return..     
a340: 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 73 65 74 20   }....      set 
a350: 66 69 6c 65 4e 61 6d 65 28 31 29 20 5b 66 69 6c  fileName(1) [fil
a360: 65 20 6e 6f 72 6d 61 6c 69 7a 65 20 5c 0d 0a 20  e normalize \.. 
a370: 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20 6a           [file j
a380: 6f 69 6e 20 24 64 69 72 65 63 74 6f 72 79 20 53  oin $directory S
a390: 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
a3a0: 65 2e 64 6c 6c 2e 63 6f 6e 66 69 67 5d 5d 0d 0a  e.dll.config]]..
a3b0: 0d 0a 20 20 20 20 20 20 73 65 74 20 66 69 6c 65  ..      set file
a3c0: 4e 61 6d 65 28 32 29 20 5b 61 70 70 65 6e 64 41  Name(2) [appendA
a3d0: 72 67 73 20 24 66 69 6c 65 4e 61 6d 65 28 31 29  rgs $fileName(1)
a3e0: 20 2e 6d 6f 76 65 64 5d 0d 0a 0d 0a 20 20 20 20   .moved]....    
a3f0: 20 20 69 66 20 7b 24 72 65 73 74 6f 72 65 7d 20    if {$restore} 
a400: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
a410: 69 66 20 7b 5b 66 69 6c 65 20 65 78 69 73 74 73  if {[file exists
a420: 20 24 66 69 6c 65 4e 61 6d 65 28 32 29 5d 7d 20   $fileName(2)]} 
a430: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
a440: 20 20 66 69 6c 65 20 72 65 6e 61 6d 65 20 24 66    file rename $f
a450: 69 6c 65 4e 61 6d 65 28 32 29 20 24 66 69 6c 65  ileName(2) $file
a460: 4e 61 6d 65 28 31 29 0d 0a 0d 0a 20 20 20 20 20  Name(1)....     
a470: 20 20 20 20 20 69 66 20 7b 24 76 65 72 62 6f 73       if {$verbos
a480: 65 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  e} then {..     
a490: 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
a4a0: 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70  test_channel [ap
a4b0: 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
a4c0: 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
a4d0: 2d 20 6d 6f 76 65 64 20 5c 22 22 20 24 66 69 6c  - moved \"" $fil
a4e0: 65 4e 61 6d 65 28 32 29 20 22 5c 22 20 74 6f 20  eName(2) "\" to 
a4f0: 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  \"" \..         
a500: 20 20 20 20 20 20 20 24 66 69 6c 65 4e 61 6d 65         $fileName
a510: 28 31 29 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20  (1) \"\n]..     
a520: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
a530: 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
a540: 20 20 20 20 69 66 20 7b 24 76 65 72 62 6f 73 65      if {$verbose
a550: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
a560: 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
a570: 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70  est_channel [app
a580: 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
a590: 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
a5a0: 20 73 6b 69 70 70 65 64 20 6d 6f 76 69 6e 67 20   skipped moving 
a5b0: 5c 22 22 20 24 66 69 6c 65 4e 61 6d 65 28 32 29  \"" $fileName(2)
a5c0: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
a5d0: 20 20 20 20 22 5c 22 2c 20 69 74 20 64 6f 65 73      "\", it does
a5e0: 20 6e 6f 74 20 65 78 69 73 74 5c 6e 22 5d 0d 0a   not exist\n"]..
a5f0: 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
a600: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 20       }..      } 
a610: 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
a620: 69 66 20 7b 5b 66 69 6c 65 20 65 78 69 73 74 73  if {[file exists
a630: 20 24 66 69 6c 65 4e 61 6d 65 28 31 29 5d 7d 20   $fileName(1)]} 
a640: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
a650: 20 20 66 69 6c 65 20 72 65 6e 61 6d 65 20 24 66    file rename $f
a660: 69 6c 65 4e 61 6d 65 28 31 29 20 24 66 69 6c 65  ileName(1) $file
a670: 4e 61 6d 65 28 32 29 0d 0a 0d 0a 20 20 20 20 20  Name(2)....     
a680: 20 20 20 20 20 69 66 20 7b 24 76 65 72 62 6f 73       if {$verbos
a690: 65 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  e} then {..     
a6a0: 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
a6b0: 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70  test_channel [ap
a6c0: 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
a6d0: 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
a6e0: 2d 20 6d 6f 76 65 64 20 5c 22 22 20 24 66 69 6c  - moved \"" $fil
a6f0: 65 4e 61 6d 65 28 31 29 20 22 5c 22 20 74 6f 20  eName(1) "\" to 
a700: 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  \"" \..         
a710: 20 20 20 20 20 20 20 24 66 69 6c 65 4e 61 6d 65         $fileName
a720: 28 32 29 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20  (2) \"\n]..     
a730: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
a740: 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
a750: 20 20 20 20 69 66 20 7b 24 76 65 72 62 6f 73 65      if {$verbose
a760: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
a770: 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
a780: 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70  est_channel [app
a790: 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
a7a0: 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
a7b0: 20 73 6b 69 70 70 65 64 20 6d 6f 76 69 6e 67 20   skipped moving 
a7c0: 5c 22 22 20 24 66 69 6c 65 4e 61 6d 65 28 31 29  \"" $fileName(1)
a7d0: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
a7e0: 20 20 20 20 22 5c 22 2c 20 69 74 20 64 6f 65 73      "\", it does
a7f0: 20 6e 6f 74 20 65 78 69 73 74 5c 6e 22 5d 0d 0a   not exist\n"]..
a800: 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
a810: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d       }..      }.
a820: 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70  .    }.....    p
a830: 72 6f 63 20 77 72 69 74 65 53 79 73 74 65 6d 44  roc writeSystemD
a840: 61 74 61 53 51 4c 69 74 65 44 6c 6c 43 6f 6e 66  ataSQLiteDllConf
a850: 69 67 20 7b 20 64 61 74 61 20 7b 76 65 72 62 6f  ig { data {verbo
a860: 73 65 20 74 72 75 65 7d 20 7d 20 7b 0d 0a 20 20  se true} } {..  
a870: 20 20 20 20 73 65 74 20 64 69 72 65 63 74 6f 72      set director
a880: 79 20 5b 67 65 74 42 69 6e 61 72 79 44 69 72 65  y [getBinaryDire
a890: 63 74 6f 72 79 5d 0d 0a 0d 0a 20 20 20 20 20 20  ctory]....      
a8a0: 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67  if {[string leng
a8b0: 74 68 20 24 64 69 72 65 63 74 6f 72 79 5d 20 3d  th $directory] =
a8c0: 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  = 0} then {..   
a8d0: 20 20 20 20 20 69 66 20 7b 24 76 65 72 62 6f 73       if {$verbos
a8e0: 65 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  e} then {..     
a8f0: 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
a900: 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
a910: 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
a920: 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 73 6b          "---- sk
a930: 69 70 70 65 64 20 6d 6f 76 69 6e 67 20 5c 22 53  ipped moving \"S
a940: 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
a950: 65 2e 64 6c 6c 2e 63 6f 6e 66 69 67 5c 22 2c 20  e.dll.config\", 
a960: 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  " \..           
a970: 20 20 20 22 6e 6f 20 62 69 6e 61 72 79 20 64 69     "no binary di
a980: 72 65 63 74 6f 72 79 5c 6e 22 5d 0d 0a 20 20 20  rectory\n"]..   
a990: 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
a9a0: 20 20 72 65 74 75 72 6e 0d 0a 20 20 20 20 20 20    return..      
a9b0: 7d 0d 0a 0d 0a 20 20 20 20 20 20 73 65 74 20 66  }....      set f
a9c0: 69 6c 65 4e 61 6d 65 20 5b 66 69 6c 65 20 6e 6f  ileName [file no
a9d0: 72 6d 61 6c 69 7a 65 20 5c 0d 0a 20 20 20 20 20  rmalize \..     
a9e0: 20 20 20 20 20 5b 66 69 6c 65 20 6a 6f 69 6e 20       [file join 
a9f0: 24 64 69 72 65 63 74 6f 72 79 20 53 79 73 74 65  $directory Syste
aa00: 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 64 6c  m.Data.SQLite.dl
aa10: 6c 2e 63 6f 6e 66 69 67 5d 5d 0d 0a 0d 0a 20 20  l.config]]....  
aa20: 20 20 20 20 77 72 69 74 65 46 69 6c 65 20 24 66      writeFile $f
aa30: 69 6c 65 4e 61 6d 65 20 24 64 61 74 61 0d 0a 0d  ileName $data...
aa40: 0a 20 20 20 20 20 20 69 66 20 7b 24 76 65 72 62  .      if {$verb
aa50: 6f 73 65 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  ose} then {..   
aa60: 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
aa70: 73 74 5f 63 68 61 6e 6e 65 6c 20 5c 0d 0a 20 20  st_channel \..  
aa80: 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
aa90: 77 72 6f 74 65 20 5c 22 53 79 73 74 65 6d 2e 44  wrote \"System.D
aaa0: 61 74 61 2e 53 51 4c 69 74 65 2e 64 6c 6c 2e 63  ata.SQLite.dll.c
aab0: 6f 6e 66 69 67 5c 22 5c 6e 22 0d 0a 20 20 20 20  onfig\"\n"..    
aac0: 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65 74    }....      ret
aad0: 75 72 6e 20 24 66 69 6c 65 4e 61 6d 65 0d 0a 20  urn $fileName.. 
aae0: 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
aaf0: 63 20 6d 6f 76 65 45 61 67 6c 65 53 68 65 6c 6c  c moveEagleShell
ab00: 4d 64 61 43 6f 6e 66 69 67 20 7b 20 7b 72 65 73  MdaConfig { {res
ab10: 74 6f 72 65 20 66 61 6c 73 65 7d 20 7b 76 65 72  tore false} {ver
ab20: 62 6f 73 65 20 74 72 75 65 7d 20 7d 20 7b 0d 0a  bose true} } {..
ab30: 20 20 20 20 20 20 73 65 74 20 64 69 72 65 63 74        set direct
ab40: 6f 72 79 20 5b 67 65 74 42 69 6e 61 72 79 44 69  ory [getBinaryDi
ab50: 72 65 63 74 6f 72 79 5d 0d 0a 0d 0a 20 20 20 20  rectory]....    
ab60: 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65    if {[string le
ab70: 6e 67 74 68 20 24 64 69 72 65 63 74 6f 72 79 5d  ngth $directory]
ab80: 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20   == 0} then {.. 
ab90: 20 20 20 20 20 20 20 69 66 20 7b 24 76 65 72 62         if {$verb
aba0: 6f 73 65 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  ose} then {..   
abb0: 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
abc0: 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70  test_channel [ap
abd0: 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
abe0: 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
abf0: 73 6b 69 70 70 65 64 20 6d 6f 76 69 6e 67 20 5c  skipped moving \
ac00: 22 45 61 67 6c 65 53 68 65 6c 6c 2e 65 78 65 2e  "EagleShell.exe.
ac10: 6d 64 61 2e 63 6f 6e 66 69 67 5c 22 2c 20 22 20  mda.config\", " 
ac20: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
ac30: 20 22 6e 6f 20 62 69 6e 61 72 79 20 64 69 72 65   "no binary dire
ac40: 63 74 6f 72 79 5c 6e 22 5d 0d 0a 20 20 20 20 20  ctory\n"]..     
ac50: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
ac60: 72 65 74 75 72 6e 0d 0a 20 20 20 20 20 20 7d 0d  return..      }.
ac70: 0a 0d 0a 20 20 20 20 20 20 73 65 74 20 66 69 6c  ...      set fil
ac80: 65 4e 61 6d 65 28 31 29 20 5b 66 69 6c 65 20 6e  eName(1) [file n
ac90: 6f 72 6d 61 6c 69 7a 65 20 5c 0d 0a 20 20 20 20  ormalize \..    
aca0: 20 20 20 20 20 20 5b 66 69 6c 65 20 6a 6f 69 6e        [file join
acb0: 20 24 64 69 72 65 63 74 6f 72 79 20 45 61 67 6c   $directory Eagl
acc0: 65 53 68 65 6c 6c 2e 65 78 65 2e 6d 64 61 2e 63  eShell.exe.mda.c
acd0: 6f 6e 66 69 67 5d 5d 0d 0a 0d 0a 20 20 20 20 20  onfig]]....     
ace0: 20 73 65 74 20 66 69 6c 65 4e 61 6d 65 28 32 29   set fileName(2)
acf0: 20 5b 61 70 70 65 6e 64 41 72 67 73 20 24 66 69   [appendArgs $fi
ad00: 6c 65 4e 61 6d 65 28 31 29 20 2e 6d 6f 76 65 64  leName(1) .moved
ad10: 5d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 24  ]....      if {$
ad20: 72 65 73 74 6f 72 65 7d 20 74 68 65 6e 20 7b 0d  restore} then {.
ad30: 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 66 69  .        if {[fi
ad40: 6c 65 20 65 78 69 73 74 73 20 24 66 69 6c 65 4e  le exists $fileN
ad50: 61 6d 65 28 32 29 5d 7d 20 74 68 65 6e 20 7b 0d  ame(2)]} then {.
ad60: 0a 20 20 20 20 20 20 20 20 20 20 66 69 6c 65 20  .          file 
ad70: 72 65 6e 61 6d 65 20 24 66 69 6c 65 4e 61 6d 65  rename $fileName
ad80: 28 32 29 20 24 66 69 6c 65 4e 61 6d 65 28 31 29  (2) $fileName(1)
ad90: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66  ....          if
ada0: 20 7b 24 76 65 72 62 6f 73 65 7d 20 74 68 65 6e   {$verbose} then
adb0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
adc0: 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
add0: 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
ade0: 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
adf0: 20 20 20 20 20 22 2d 2d 2d 2d 20 6d 6f 76 65 64       "---- moved
ae00: 20 5c 22 22 20 24 66 69 6c 65 4e 61 6d 65 28 32   \"" $fileName(2
ae10: 29 20 22 5c 22 20 74 6f 20 5c 22 22 20 5c 0d 0a  ) "\" to \"" \..
ae20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ae30: 24 66 69 6c 65 4e 61 6d 65 28 31 29 20 5c 22 5c  $fileName(1) \"\
ae40: 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d  n]..          }.
ae50: 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20  .        } else 
ae60: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20  {..          if 
ae70: 7b 24 76 65 72 62 6f 73 65 7d 20 74 68 65 6e 20  {$verbose} then 
ae80: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  {..            t
ae90: 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
aea0: 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
aeb0: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
aec0: 20 20 20 20 22 2d 2d 2d 2d 20 73 6b 69 70 70 65      "---- skippe
aed0: 64 20 6d 6f 76 69 6e 67 20 5c 22 22 20 24 66 69  d moving \"" $fi
aee0: 6c 65 4e 61 6d 65 28 32 29 20 5c 0d 0a 20 20 20  leName(2) \..   
aef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 5c 22               "\"
af00: 2c 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 65 78  , it does not ex
af10: 69 73 74 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20  ist\n"]..       
af20: 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d     }..        }.
af30: 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d  .      } else {.
af40: 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 66 69  .        if {[fi
af50: 6c 65 20 65 78 69 73 74 73 20 24 66 69 6c 65 4e  le exists $fileN
af60: 61 6d 65 28 31 29 5d 7d 20 74 68 65 6e 20 7b 0d  ame(1)]} then {.
af70: 0a 20 20 20 20 20 20 20 20 20 20 66 69 6c 65 20  .          file 
af80: 72 65 6e 61 6d 65 20 24 66 69 6c 65 4e 61 6d 65  rename $fileName
af90: 28 31 29 20 24 66 69 6c 65 4e 61 6d 65 28 32 29  (1) $fileName(2)
afa0: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66  ....          if
afb0: 20 7b 24 76 65 72 62 6f 73 65 7d 20 74 68 65 6e   {$verbose} then
afc0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
afd0: 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
afe0: 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
aff0: 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
b000: 20 20 20 20 20 22 2d 2d 2d 2d 20 6d 6f 76 65 64       "---- moved
b010: 20 5c 22 22 20 24 66 69 6c 65 4e 61 6d 65 28 31   \"" $fileName(1
b020: 29 20 22 5c 22 20 74 6f 20 5c 22 22 20 5c 0d 0a  ) "\" to \"" \..
b030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b040: 24 66 69 6c 65 4e 61 6d 65 28 32 29 20 5c 22 5c  $fileName(2) \"\
b050: 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d  n]..          }.
b060: 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20  .        } else 
b070: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20  {..          if 
b080: 7b 24 76 65 72 62 6f 73 65 7d 20 74 68 65 6e 20  {$verbose} then 
b090: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  {..            t
b0a0: 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
b0b0: 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
b0c0: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
b0d0: 20 20 20 20 22 2d 2d 2d 2d 20 73 6b 69 70 70 65      "---- skippe
b0e0: 64 20 6d 6f 76 69 6e 67 20 5c 22 22 20 24 66 69  d moving \"" $fi
b0f0: 6c 65 4e 61 6d 65 28 31 29 20 5c 0d 0a 20 20 20  leName(1) \..   
b100: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 5c 22               "\"
b110: 2c 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 65 78  , it does not ex
b120: 69 73 74 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20  ist\n"]..       
b130: 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d     }..        }.
b140: 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d  .      }..    }.
b150: 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 77 72 69  ....    proc wri
b160: 74 65 45 61 67 6c 65 53 68 65 6c 6c 4d 64 61 43  teEagleShellMdaC
b170: 6f 6e 66 69 67 20 7b 20 64 61 74 61 20 7b 76 65  onfig { data {ve
b180: 72 62 6f 73 65 20 74 72 75 65 7d 20 7d 20 7b 0d  rbose true} } {.
b190: 0a 20 20 20 20 20 20 73 65 74 20 64 69 72 65 63  .      set direc
b1a0: 74 6f 72 79 20 5b 67 65 74 42 69 6e 61 72 79 44  tory [getBinaryD
b1b0: 69 72 65 63 74 6f 72 79 5d 0d 0a 0d 0a 20 20 20  irectory]....   
b1c0: 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c     if {[string l
b1d0: 65 6e 67 74 68 20 24 64 69 72 65 63 74 6f 72 79  ength $directory
b1e0: 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  ] == 0} then {..
b1f0: 20 20 20 20 20 20 20 20 69 66 20 7b 24 76 65 72          if {$ver
b200: 62 6f 73 65 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  bose} then {..  
b210: 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
b220: 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61  :test_channel [a
b230: 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
b240: 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
b250: 20 73 6b 69 70 70 65 64 20 6d 6f 76 69 6e 67 20   skipped moving 
b260: 5c 22 45 61 67 6c 65 53 68 65 6c 6c 2e 65 78 65  \"EagleShell.exe
b270: 2e 6d 64 61 2e 63 6f 6e 66 69 67 5c 22 2c 20 22  .mda.config\", "
b280: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
b290: 20 20 22 6e 6f 20 62 69 6e 61 72 79 20 64 69 72    "no binary dir
b2a0: 65 63 74 6f 72 79 5c 6e 22 5d 0d 0a 20 20 20 20  ectory\n"]..    
b2b0: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
b2c0: 20 72 65 74 75 72 6e 0d 0a 20 20 20 20 20 20 7d   return..      }
b2d0: 0d 0a 0d 0a 20 20 20 20 20 20 73 65 74 20 66 69  ....      set fi
b2e0: 6c 65 4e 61 6d 65 20 5b 66 69 6c 65 20 6e 6f 72  leName [file nor
b2f0: 6d 61 6c 69 7a 65 20 5c 0d 0a 20 20 20 20 20 20  malize \..      
b300: 20 20 20 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 24      [file join $
b310: 64 69 72 65 63 74 6f 72 79 20 45 61 67 6c 65 53  directory EagleS
b320: 68 65 6c 6c 2e 65 78 65 2e 6d 64 61 2e 63 6f 6e  hell.exe.mda.con
b330: 66 69 67 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 77  fig]]....      w
b340: 72 69 74 65 46 69 6c 65 20 24 66 69 6c 65 4e 61  riteFile $fileNa
b350: 6d 65 20 24 64 61 74 61 0d 0a 0d 0a 20 20 20 20  me $data....    
b360: 20 20 69 66 20 7b 24 76 65 72 62 6f 73 65 7d 20    if {$verbose} 
b370: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
b380: 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
b390: 61 6e 6e 65 6c 20 5c 0d 0a 20 20 20 20 20 20 20  annel \..       
b3a0: 20 20 20 20 20 22 2d 2d 2d 2d 20 77 72 6f 74 65       "---- wrote
b3b0: 20 5c 22 45 61 67 6c 65 53 68 65 6c 6c 2e 65 78   \"EagleShell.ex
b3c0: 65 2e 6d 64 61 2e 63 6f 6e 66 69 67 5c 22 5c 6e  e.mda.config\"\n
b3d0: 22 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  "..      }....  
b3e0: 20 20 20 20 72 65 74 75 72 6e 20 24 66 69 6c 65      return $file
b3f0: 4e 61 6d 65 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a  Name..    }.....
b400: 20 20 20 20 70 72 6f 63 20 67 65 74 41 70 70 44      proc getAppD
b410: 6f 6d 61 69 6e 50 72 65 61 6d 62 6c 65 20 7b 20  omainPreamble { 
b420: 7b 70 72 65 66 69 78 20 22 22 7d 20 7b 73 75 66  {prefix ""} {suf
b430: 66 69 78 20 22 22 7d 20 7d 20 7b 0d 0a 20 20 20  fix ""} } {..   
b440: 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
b450: 54 45 3a 20 54 68 69 73 20 70 72 6f 63 65 64 75  TE: This procedu
b460: 72 65 20 72 65 74 75 72 6e 73 20 61 20 74 65 73  re returns a tes
b470: 74 20 73 65 74 75 70 20 73 63 72 69 70 74 20 66  t setup script f
b480: 72 61 67 6d 65 6e 74 20 73 75 69 74 61 62 6c 65  ragment suitable
b490: 20 66 6f 72 0d 0a 20 20 20 20 20 20 23 20 20 20   for..      #   
b4a0: 20 20 20 20 65 76 61 6c 75 61 74 69 6f 6e 20 62      evaluation b
b4b0: 79 20 61 6e 20 69 6e 74 65 72 70 72 65 74 65 72  y an interpreter
b4c0: 20 63 72 65 61 74 65 64 20 69 6e 20 61 6e 20 69   created in an i
b4d0: 73 6f 6c 61 74 65 64 20 61 70 70 6c 69 63 61 74  solated applicat
b4e0: 69 6f 6e 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ion..      #    
b4f0: 20 20 20 64 6f 6d 61 69 6e 2e 20 20 54 68 65 20     domain.  The 
b500: 73 63 72 69 70 74 20 66 72 61 67 6d 65 6e 74 20  script fragment 
b510: 62 65 69 6e 67 20 72 65 74 75 72 6e 65 64 20 77  being returned w
b520: 69 6c 6c 20 62 65 20 73 75 72 72 6f 75 6e 64 65  ill be surrounde
b530: 64 20 62 79 0d 0a 20 20 20 20 20 20 23 20 20 20  d by..      #   
b540: 20 20 20 20 74 68 65 20 70 72 65 66 69 78 20 61      the prefix a
b550: 6e 64 20 73 75 66 66 69 78 20 22 73 63 72 69 70  nd suffix "scrip
b560: 74 20 66 72 61 67 6d 65 6e 74 73 22 20 73 70 65  t fragments" spe
b570: 63 69 66 69 65 64 20 62 79 20 6f 75 72 20 63 61  cified by our ca
b580: 6c 6c 65 72 2c 0d 0a 20 20 20 20 20 20 23 20 20  ller,..      #  
b590: 20 20 20 20 20 69 66 20 61 6e 79 2e 20 20 54 68       if any.  Th
b5a0: 65 20 65 6e 74 69 72 65 20 73 63 72 69 70 74 20  e entire script 
b5b0: 62 65 69 6e 67 20 72 65 74 75 72 6e 65 64 20 77  being returned w
b5c0: 69 6c 6c 20 62 65 20 73 75 62 73 74 69 74 75 74  ill be substitut
b5d0: 65 64 20 76 69 61 0d 0a 20 20 20 20 20 20 23 20  ed via..      # 
b5e0: 20 20 20 20 20 20 5b 73 75 62 73 74 5d 2c 20 69        [subst], i
b5f0: 6e 20 74 68 65 20 63 6f 6e 74 65 78 74 20 6f 66  n the context of
b600: 20 6f 75 72 20 63 61 6c 6c 65 72 2c 20 62 65 66   our caller, bef
b610: 6f 72 65 20 62 65 69 6e 67 20 72 65 74 75 72 6e  ore being return
b620: 65 64 2e 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ed...      #    
b630: 20 20 20 54 68 69 73 20 73 74 65 70 20 69 73 20     This step is 
b640: 6e 65 63 65 73 73 61 72 79 20 73 6f 20 74 68 61  necessary so tha
b650: 74 20 73 6f 6d 65 20 6c 69 6d 69 74 65 64 20 63  t some limited c
b660: 6f 6e 74 65 78 74 20 69 6e 66 6f 72 6d 61 74 69  ontext informati
b670: 6f 6e 2c 0d 0a 20 20 20 20 20 20 23 20 20 20 20  on,..      #    
b680: 20 20 20 70 72 69 6d 61 72 69 6c 79 20 72 65 6c     primarily rel
b690: 61 74 65 64 20 74 6f 20 74 68 65 20 74 65 73 74  ated to the test
b6a0: 69 6e 67 20 64 69 72 65 63 74 6f 72 69 65 73 2c  ing directories,
b6b0: 20 63 61 6e 20 62 65 20 74 72 61 6e 73 66 65 72   can be transfer
b6c0: 72 65 64 0d 0a 20 20 20 20 20 20 23 20 20 20 20  red..      #    
b6d0: 20 20 20 74 6f 20 74 68 65 20 69 6e 74 65 72 70     to the interp
b6e0: 72 65 74 65 72 20 69 6e 20 74 68 65 20 69 73 6f  reter in the iso
b6f0: 6c 61 74 65 64 20 61 70 70 6c 69 63 61 74 69 6f  lated applicatio
b700: 6e 20 64 6f 6d 61 69 6e 2c 20 6d 61 6b 69 6e 67  n domain, making
b710: 20 69 74 0d 0a 20 20 20 20 20 20 23 20 20 20 20   it..      #    
b720: 20 20 20 61 62 6c 65 20 74 6f 20 73 75 63 63 65     able to succe
b730: 73 73 66 75 6c 6c 79 20 72 75 6e 20 74 65 73 74  ssfully run test
b740: 73 20 74 68 61 74 20 72 65 71 75 69 72 65 20 6f  s that require o
b750: 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 66 20 74 68  ne or more of th
b760: 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  e..      #      
b770: 20 66 69 6c 65 73 20 69 6e 20 6f 6e 65 20 6f 66   files in one of
b780: 20 74 68 65 20 74 65 73 74 69 6e 67 20 64 69 72   the testing dir
b790: 65 63 74 6f 72 69 65 73 2e 20 20 43 61 6c 6c 65  ectories.  Calle
b7a0: 72 73 20 73 68 6f 75 6c 64 20 6b 65 65 70 20 69  rs should keep i
b7b0: 6e 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  n..      #      
b7c0: 20 6d 69 6e 64 20 74 68 61 74 20 74 68 65 20 74   mind that the t
b7d0: 65 73 74 20 73 63 72 69 70 74 20 66 72 61 67 6d  est script fragm
b7e0: 65 6e 74 20 62 65 69 6e 67 20 72 65 74 75 72 6e  ent being return
b7f0: 65 64 20 63 61 6e 6e 6f 74 20 72 65 6c 79 20 6f  ed cannot rely o
b800: 6e 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  n..      #      
b810: 20 61 6e 79 20 73 63 72 69 70 74 20 6c 69 62 72   any script libr
b820: 61 72 79 20 70 72 6f 63 65 64 75 72 65 73 20 74  ary procedures t
b830: 68 61 74 20 61 72 65 20 6e 6f 74 20 70 72 6f 76  hat are not prov
b840: 69 64 65 64 20 62 79 20 74 68 65 20 45 61 67 6c  ided by the Eagl
b850: 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  e..      #      
b860: 20 6c 69 62 72 61 72 79 20 70 61 63 6b 61 67 65   library package
b870: 20 28 69 2e 65 2e 20 22 69 6e 69 74 2e 65 61 67   (i.e. "init.eag
b880: 6c 65 22 29 2c 20 69 6e 63 6c 75 64 69 6e 67 20  le"), including 
b890: 74 68 6f 73 65 20 70 72 6f 76 69 64 65 64 20 62  those provided b
b8a0: 79 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  y..      #      
b8b0: 20 74 68 65 20 45 61 67 6c 65 20 74 65 73 74 20   the Eagle test 
b8c0: 70 61 63 6b 61 67 65 2c 20 75 6e 6c 65 73 73 20  package, unless 
b8d0: 74 68 65 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e  the file contain
b8e0: 69 6e 67 20 74 68 65 6d 20 69 73 20 6c 6f 61 64  ing them is load
b8f0: 65 64 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  ed..      #     
b900: 20 20 6d 61 6e 75 61 6c 6c 79 20 76 69 61 20 73    manually via s
b910: 6f 6d 65 20 6f 74 68 65 72 20 6d 65 63 68 61 6e  ome other mechan
b920: 69 73 6d 20 28 65 2e 67 2e 20 62 79 20 69 6e 63  ism (e.g. by inc
b930: 6c 75 64 69 6e 67 20 61 70 70 72 6f 70 72 69 61  luding appropria
b940: 74 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  te..      #     
b950: 20 20 5b 70 61 63 6b 61 67 65 20 72 65 71 75 69    [package requi
b960: 72 65 5d 20 6f 72 20 5b 73 6f 75 72 63 65 5d 20  re] or [source] 
b970: 63 6f 6d 6d 61 6e 64 73 20 69 6e 20 74 68 65 20  commands in the 
b980: 70 72 65 66 69 78 20 6f 72 20 73 75 66 66 69 78  prefix or suffix
b990: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
b9a0: 73 63 72 69 70 74 20 66 72 61 67 6d 65 6e 74 73  script fragments
b9b0: 29 2e 20 20 41 6c 73 6f 2c 20 61 6c 6c 20 76 61  ).  Also, all va
b9c0: 72 69 61 62 6c 65 20 72 65 66 65 72 65 6e 63 65  riable reference
b9d0: 73 20 61 6e 64 20 61 6c 6c 20 6e 65 73 74 65 64  s and all nested
b9e0: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
b9f0: 63 6f 6d 6d 61 6e 64 73 20 28 69 2e 65 2e 20 74  commands (i.e. t
ba00: 68 6f 73 65 20 69 6e 20 73 71 75 61 72 65 20 62  hose in square b
ba10: 72 61 63 6b 65 74 73 29 20 63 6f 6e 74 61 69 6e  rackets) contain
ba20: 65 64 20 69 6e 20 74 68 65 20 66 69 6e 61 6c 0d  ed in the final.
ba30: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 73  .      #       s
ba40: 63 72 69 70 74 20 66 72 61 67 6d 65 6e 74 20 77  cript fragment w
ba50: 69 6c 6c 20 65 6e 64 20 75 70 20 62 65 69 6e 67  ill end up being
ba60: 20 65 76 61 6c 75 61 74 65 64 20 69 6e 20 74 68   evaluated in th
ba70: 65 20 63 6f 6e 74 65 78 74 20 6f 66 20 74 68 65  e context of the
ba80: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
ba90: 63 61 6c 6c 69 6e 67 20 69 6e 74 65 72 70 72 65  calling interpre
baa0: 74 65 72 20 61 6e 64 20 6e 6f 74 20 74 68 65 20  ter and not the 
bab0: 74 61 72 67 65 74 20 69 6e 74 65 72 70 72 65 74  target interpret
bac0: 65 72 20 63 72 65 61 74 65 64 20 69 6e 20 74 68  er created in th
bad0: 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  e..      #      
bae0: 20 69 73 6f 6c 61 74 65 64 20 61 70 70 6c 69 63   isolated applic
baf0: 61 74 69 6f 6e 20 64 6f 6d 61 69 6e 20 75 6e 6c  ation domain unl
bb00: 65 73 73 20 74 68 65 20 64 6f 6c 6c 61 72 20 73  ess the dollar s
bb10: 69 67 6e 73 20 61 6e 64 2f 6f 72 20 73 71 75 61  igns and/or squa
bb20: 72 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  re..      #     
bb30: 20 20 62 72 61 63 6b 65 74 73 20 61 72 65 20 73    brackets are s
bb40: 70 65 63 69 61 6c 6c 79 20 71 75 6f 74 65 64 20  pecially quoted 
bb50: 77 69 74 68 20 62 61 63 6b 73 6c 61 73 68 65 73  with backslashes
bb60: 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
bb70: 20 20 72 65 74 75 72 6e 20 5b 75 70 6c 65 76 65    return [upleve
bb80: 6c 20 31 20 5b 6c 69 73 74 20 73 75 62 73 74 20  l 1 [list subst 
bb90: 5b 61 70 70 65 6e 64 41 72 67 73 20 24 70 72 65  [appendArgs $pre
bba0: 66 69 78 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  fix {..        #
bbb0: 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
bbc0: 3a 20 54 68 65 20 5c 5b 6f 62 6a 65 63 74 5c 5d  : The \[object\]
bbd0: 20 63 6f 6d 6d 61 6e 64 20 6d 61 79 20 62 65 20   command may be 
bbe0: 6d 69 73 73 69 6e 67 20 69 6e 20 73 6f 6d 65 20  missing in some 
bbf0: 45 61 67 6c 65 20 63 6f 72 65 0d 0a 20 20 20 20  Eagle core..    
bc00: 20 20 20 20 23 20 20 20 20 20 20 20 6c 69 62 72      #       libr
bc10: 61 72 79 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  ary configuratio
bc20: 6e 73 2e 20 20 43 6c 6f 6e 69 6e 67 20 61 6e 64  ns.  Cloning and
bc30: 20 75 73 69 6e 67 20 74 68 65 20 70 72 6f 63 65   using the proce
bc40: 64 75 72 65 0d 0a 20 20 20 20 20 20 20 20 23 20  dure..        # 
bc50: 20 20 20 20 20 20 5c 5b 63 68 61 6e 67 65 4e 61        \[changeNa
bc60: 74 69 76 65 52 75 6e 74 69 6d 65 4f 70 74 69 6f  tiveRuntimeOptio
bc70: 6e 5c 5d 20 6d 61 79 20 68 65 6c 70 20 74 6f 20  n\] may help to 
bc80: 6d 69 74 69 67 61 74 65 20 74 68 69 73 2e 0d 0a  mitigate this...
bc90: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
bca0: 20 20 20 70 72 6f 63 20 63 68 61 6e 67 65 4e 61     proc changeNa
bcb0: 74 69 76 65 52 75 6e 74 69 6d 65 4f 70 74 69 6f  tiveRuntimeOptio
bcc0: 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n \..           
bcd0: 20 7b 5b 69 6e 66 6f 20 61 72 67 73 20 63 68 61   {[info args cha
bce0: 6e 67 65 4e 61 74 69 76 65 52 75 6e 74 69 6d 65  ngeNativeRuntime
bcf0: 4f 70 74 69 6f 6e 5d 7d 20 5c 0d 0a 20 20 20 20  Option]} \..    
bd00: 20 20 20 20 20 20 20 20 7b 5b 69 6e 66 6f 20 62          {[info b
bd10: 6f 64 79 20 63 68 61 6e 67 65 4e 61 74 69 76 65  ody changeNative
bd20: 52 75 6e 74 69 6d 65 4f 70 74 69 6f 6e 5d 7d 0d  RuntimeOption]}.
bd30: 0a 0d 0a 20 20 20 20 20 20 20 20 63 61 74 63 68  ...        catch
bd40: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 63 68   {..          ch
bd50: 61 6e 67 65 4e 61 74 69 76 65 52 75 6e 74 69 6d  angeNativeRuntim
bd60: 65 4f 70 74 69 6f 6e 20 5b 68 61 73 52 75 6e 74  eOption [hasRunt
bd70: 69 6d 65 4f 70 74 69 6f 6e 20 6e 61 74 69 76 65  imeOption native
bd80: 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  ]..        }..  
bd90: 20 20 20 20 7d 20 5b 67 65 74 54 65 73 74 4f 76      } [getTestOv
bda0: 65 72 72 69 64 65 73 50 72 65 61 6d 62 6c 65 20  erridesPreamble 
bdb0: 5b 6c 69 73 74 20 70 61 74 68 20 74 65 73 74 5f  [list path test_
bdc0: 63 68 61 6e 6e 65 6c 5d 5d 20 24 73 75 66 66 69  channel]] $suffi
bdd0: 78 5d 5d 5d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a  x]]]..    }.....
bde0: 20 20 20 20 70 72 6f 63 20 74 72 79 43 6f 70 79      proc tryCopy
bdf0: 45 78 74 65 72 6e 61 6c 46 69 6c 65 20 7b 0d 0a  ExternalFile {..
be00: 20 20 20 20 20 20 20 20 20 20 20 20 66 69 6c 65              file
be10: 4e 61 6d 65 20 7b 70 6c 61 74 66 6f 72 6d 20 22  Name {platform "
be20: 22 7d 20 7b 6e 65 77 46 69 6c 65 4e 61 6d 65 20  "} {newFileName 
be30: 22 22 7d 20 7b 76 65 72 62 6f 73 65 20 74 72 75  ""} {verbose tru
be40: 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 73 65  e} } {..      se
be50: 74 20 73 6f 75 72 63 65 46 69 6c 65 4e 61 6d 65  t sourceFileName
be60: 20 5b 67 65 74 45 78 74 65 72 6e 61 6c 46 69 6c   [getExternalFil
be70: 65 4e 61 6d 65 20 24 66 69 6c 65 4e 61 6d 65 5d  eName $fileName]
be80: 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 21 5b  ....      if {![
be90: 66 69 6c 65 20 65 78 69 73 74 73 20 24 73 6f 75  file exists $sou
bea0: 72 63 65 46 69 6c 65 4e 61 6d 65 5d 7d 20 74 68  rceFileName]} th
beb0: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66  en {..        if
bec0: 20 7b 24 76 65 72 62 6f 73 65 7d 20 74 68 65 6e   {$verbose} then
bed0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70   {..          tp
bee0: 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  uts $::test_chan
bef0: 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
bf00: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
bf10: 20 22 2d 2d 2d 2d 20 73 6b 69 70 70 65 64 20 63   "---- skipped c
bf20: 6f 70 79 69 6e 67 20 65 78 74 65 72 6e 61 6c 20  opying external 
bf30: 66 69 6c 65 20 5c 22 22 20 24 73 6f 75 72 63 65  file \"" $source
bf40: 46 69 6c 65 4e 61 6d 65 20 5c 0d 0a 20 20 20 20  FileName \..    
bf50: 20 20 20 20 20 20 20 20 20 20 22 5c 22 2c 20 69            "\", i
bf60: 74 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74  t does not exist
bf70: 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d  \n"]..        }.
bf80: 0a 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ...        retur
bf90: 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  n..      }....  
bfa0: 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20      if {[string 
bfb0: 6c 65 6e 67 74 68 20 24 6e 65 77 46 69 6c 65 4e  length $newFileN
bfc0: 61 6d 65 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b  ame] > 0} then {
bfd0: 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 74 61  ..        set ta
bfe0: 72 67 65 74 46 69 6c 65 4e 61 6d 65 20 5b 67 65  rgetFileName [ge
bff0: 74 42 69 6e 61 72 79 46 69 6c 65 4e 61 6d 65 20  tBinaryFileName 
c000: 24 6e 65 77 46 69 6c 65 4e 61 6d 65 20 24 70 6c  $newFileName $pl
c010: 61 74 66 6f 72 6d 5d 0d 0a 20 20 20 20 20 20 7d  atform]..      }
c020: 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
c030: 20 73 65 74 20 74 61 72 67 65 74 46 69 6c 65 4e   set targetFileN
c040: 61 6d 65 20 5b 67 65 74 42 69 6e 61 72 79 46 69  ame [getBinaryFi
c050: 6c 65 4e 61 6d 65 20 24 66 69 6c 65 4e 61 6d 65  leName $fileName
c060: 20 24 70 6c 61 74 66 6f 72 6d 5d 0d 0a 20 20 20   $platform]..   
c070: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 73 65     }....      se
c080: 74 20 74 61 72 67 65 74 44 69 72 65 63 74 6f 72  t targetDirector
c090: 79 20 5b 66 69 6c 65 20 64 69 72 6e 61 6d 65 20  y [file dirname 
c0a0: 24 74 61 72 67 65 74 46 69 6c 65 4e 61 6d 65 5d  $targetFileName]
c0b0: 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 63  ....      if {[c
c0c0: 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20  atch {..        
c0d0: 69 66 20 7b 21 5b 66 69 6c 65 20 65 78 69 73 74  if {![file exist
c0e0: 73 20 24 74 61 72 67 65 74 44 69 72 65 63 74 6f  s $targetDirecto
c0f0: 72 79 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  ry]} then {..   
c100: 20 20 20 20 20 20 20 66 69 6c 65 20 6d 6b 64 69         file mkdi
c110: 72 20 24 74 61 72 67 65 74 44 69 72 65 63 74 6f  r $targetDirecto
c120: 72 79 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d  ry..        }...
c130: 0a 20 20 20 20 20 20 20 20 66 69 6c 65 20 63 6f  .        file co
c140: 70 79 20 2d 66 6f 72 63 65 20 24 73 6f 75 72 63  py -force $sourc
c150: 65 46 69 6c 65 4e 61 6d 65 20 24 74 61 72 67 65  eFileName $targe
c160: 74 46 69 6c 65 4e 61 6d 65 0d 0a 20 20 20 20 20  tFileName..     
c170: 20 7d 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b   }] == 0} then {
c180: 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20  ..        tputs 
c190: 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
c1a0: 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
c1b0: 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
c1c0: 20 63 6f 70 69 65 64 20 65 78 74 65 72 6e 61 6c   copied external
c1d0: 20 66 69 6c 65 20 66 72 6f 6d 20 5c 22 22 20 24   file from \"" $
c1e0: 73 6f 75 72 63 65 46 69 6c 65 4e 61 6d 65 20 22  sourceFileName "
c1f0: 5c 22 20 74 6f 20 5c 22 22 20 5c 0d 0a 20 20 20  \" to \"" \..   
c200: 20 20 20 20 20 20 20 20 20 24 74 61 72 67 65 74           $target
c210: 46 69 6c 65 4e 61 6d 65 20 5c 22 5c 6e 5d 0d 0a  FileName \"\n]..
c220: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
c230: 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
c240: 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61  :test_channel [a
c250: 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
c260: 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 66           "---- f
c270: 61 69 6c 65 64 20 74 6f 20 63 6f 70 79 20 65 78  ailed to copy ex
c280: 74 65 72 6e 61 6c 20 66 69 6c 65 20 66 72 6f 6d  ternal file from
c290: 20 5c 22 22 20 24 73 6f 75 72 63 65 46 69 6c 65   \"" $sourceFile
c2a0: 4e 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20 20 20  Name \..        
c2b0: 20 20 20 20 22 5c 22 20 74 6f 20 5c 22 22 20 24      "\" to \"" $
c2c0: 74 61 72 67 65 74 46 69 6c 65 4e 61 6d 65 20 5c  targetFileName \
c2d0: 22 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20  "\n]..      }.. 
c2e0: 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
c2f0: 63 20 74 72 79 43 6f 70 79 42 69 6e 61 72 79 46  c tryCopyBinaryF
c300: 69 6c 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  ile {..         
c310: 20 20 20 66 69 6c 65 4e 61 6d 65 20 6d 61 6e 61     fileName mana
c320: 67 65 64 4f 6e 6c 79 20 7b 70 6c 61 74 66 6f 72  gedOnly {platfor
c330: 6d 20 22 22 7d 20 7b 6e 65 77 46 69 6c 65 4e 61  m ""} {newFileNa
c340: 6d 65 20 22 22 7d 0d 0a 20 20 20 20 20 20 20 20  me ""}..        
c350: 20 20 20 20 7b 76 65 72 62 6f 73 65 20 74 72 75      {verbose tru
c360: 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 73 65  e} } {..      se
c370: 74 20 73 6f 75 72 63 65 46 69 6c 65 4e 61 6d 65  t sourceFileName
c380: 20 5b 67 65 74 42 69 6e 61 72 79 46 69 6c 65 4e   [getBinaryFileN
c390: 61 6d 65 20 24 66 69 6c 65 4e 61 6d 65 20 24 70  ame $fileName $p
c3a0: 6c 61 74 66 6f 72 6d 5d 0d 0a 0d 0a 20 20 20 20  latform]....    
c3b0: 20 20 69 66 20 7b 21 5b 66 69 6c 65 20 65 78 69    if {![file exi
c3c0: 73 74 73 20 24 73 6f 75 72 63 65 46 69 6c 65 4e  sts $sourceFileN
c3d0: 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ame]} then {..  
c3e0: 20 20 20 20 20 20 69 66 20 7b 24 76 65 72 62 6f        if {$verbo
c3f0: 73 65 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  se} then {..    
c400: 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
c410: 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70  est_channel [app
c420: 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
c430: 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 73           "---- s
c440: 6b 69 70 70 65 64 20 63 6f 70 79 69 6e 67 20 62  kipped copying b
c450: 69 6e 61 72 79 20 66 69 6c 65 20 5c 22 22 20 24  inary file \"" $
c460: 73 6f 75 72 63 65 46 69 6c 65 4e 61 6d 65 20 5c  sourceFileName \
c470: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
c480: 22 5c 22 2c 20 69 74 20 64 6f 65 73 20 6e 6f 74  "\", it does not
c490: 20 65 78 69 73 74 5c 6e 22 5d 0d 0a 20 20 20 20   exist\n"]..    
c4a0: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
c4b0: 20 72 65 74 75 72 6e 0d 0a 20 20 20 20 20 20 7d   return..      }
c4c0: 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 73  ....      if {[s
c4d0: 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 6e 65  tring length $ne
c4e0: 77 46 69 6c 65 4e 61 6d 65 5d 20 3e 20 30 7d 20  wFileName] > 0} 
c4f0: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
c500: 73 65 74 20 74 61 72 67 65 74 46 69 6c 65 4e 61  set targetFileNa
c510: 6d 65 20 5b 67 65 74 42 75 69 6c 64 46 69 6c 65  me [getBuildFile
c520: 4e 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20 20 20  Name \..        
c530: 20 20 20 20 24 6e 65 77 46 69 6c 65 4e 61 6d 65      $newFileName
c540: 20 24 6d 61 6e 61 67 65 64 4f 6e 6c 79 20 24 70   $managedOnly $p
c550: 6c 61 74 66 6f 72 6d 5d 0d 0a 20 20 20 20 20 20  latform]..      
c560: 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
c570: 20 20 73 65 74 20 74 61 72 67 65 74 46 69 6c 65    set targetFile
c580: 4e 61 6d 65 20 5b 67 65 74 42 75 69 6c 64 46 69  Name [getBuildFi
c590: 6c 65 4e 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20  leName \..      
c5a0: 20 20 20 20 20 20 24 66 69 6c 65 4e 61 6d 65 20        $fileName 
c5b0: 24 6d 61 6e 61 67 65 64 4f 6e 6c 79 20 24 70 6c  $managedOnly $pl
c5c0: 61 74 66 6f 72 6d 5d 0d 0a 20 20 20 20 20 20 7d  atform]..      }
c5d0: 0d 0a 0d 0a 20 20 20 20 20 20 73 65 74 20 74 61  ....      set ta
c5e0: 72 67 65 74 44 69 72 65 63 74 6f 72 79 20 5b 66  rgetDirectory [f
c5f0: 69 6c 65 20 64 69 72 6e 61 6d 65 20 24 74 61 72  ile dirname $tar
c600: 67 65 74 46 69 6c 65 4e 61 6d 65 5d 0d 0a 0d 0a  getFileName]....
c610: 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68        if {[catch
c620: 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b   {..        if {
c630: 21 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24 74  ![file exists $t
c640: 61 72 67 65 74 44 69 72 65 63 74 6f 72 79 5d 7d  argetDirectory]}
c650: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
c660: 20 20 20 66 69 6c 65 20 6d 6b 64 69 72 20 24 74     file mkdir $t
c670: 61 72 67 65 74 44 69 72 65 63 74 6f 72 79 0d 0a  argetDirectory..
c680: 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
c690: 20 20 20 20 20 66 69 6c 65 20 63 6f 70 79 20 2d       file copy -
c6a0: 66 6f 72 63 65 20 24 73 6f 75 72 63 65 46 69 6c  force $sourceFil
c6b0: 65 4e 61 6d 65 20 24 74 61 72 67 65 74 46 69 6c  eName $targetFil
c6c0: 65 4e 61 6d 65 0d 0a 20 20 20 20 20 20 7d 5d 20  eName..      }] 
c6d0: 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  == 0} then {..  
c6e0: 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
c6f0: 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70  est_channel [app
c700: 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
c710: 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 6f 70         "---- cop
c720: 69 65 64 20 62 69 6e 61 72 79 20 66 69 6c 65 20  ied binary file 
c730: 66 72 6f 6d 20 5c 22 22 20 24 73 6f 75 72 63 65  from \"" $source
c740: 46 69 6c 65 4e 61 6d 65 20 22 5c 22 20 74 6f 20  FileName "\" to 
c750: 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  \"" \..         
c760: 20 20 20 24 74 61 72 67 65 74 46 69 6c 65 4e 61     $targetFileNa
c770: 6d 65 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20  me \"\n]..      
c780: 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
c790: 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
c7a0: 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
c7b0: 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
c7c0: 20 20 20 22 2d 2d 2d 2d 20 66 61 69 6c 65 64 20     "---- failed 
c7d0: 74 6f 20 63 6f 70 79 20 62 69 6e 61 72 79 20 66  to copy binary f
c7e0: 69 6c 65 20 66 72 6f 6d 20 5c 22 22 20 24 73 6f  ile from \"" $so
c7f0: 75 72 63 65 46 69 6c 65 4e 61 6d 65 20 5c 0d 0a  urceFileName \..
c800: 20 20 20 20 20 20 20 20 20 20 20 20 22 5c 22 20              "\" 
c810: 74 6f 20 5c 22 22 20 24 74 61 72 67 65 74 46 69  to \"" $targetFi
c820: 6c 65 4e 61 6d 65 20 5c 22 5c 6e 5d 0d 0a 20 20  leName \"\n]..  
c830: 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d      }..    }....
c840: 0a 20 20 20 20 70 72 6f 63 20 74 72 79 43 6f 70  .    proc tryCop
c850: 79 42 75 69 6c 64 46 69 6c 65 20 7b 0d 0a 20 20  yBuildFile {..  
c860: 20 20 20 20 20 20 20 20 20 20 66 69 6c 65 4e 61            fileNa
c870: 6d 65 20 6d 61 6e 61 67 65 64 4f 6e 6c 79 20 7b  me managedOnly {
c880: 70 6c 61 74 66 6f 72 6d 20 22 22 7d 20 7b 6e 65  platform ""} {ne
c890: 77 46 69 6c 65 4e 61 6d 65 20 22 22 7d 0d 0a 20  wFileName ""}.. 
c8a0: 20 20 20 20 20 20 20 20 20 20 20 7b 76 65 72 62             {verb
c8b0: 6f 73 65 20 74 72 75 65 7d 20 7d 20 7b 0d 0a 20  ose true} } {.. 
c8c0: 20 20 20 20 20 73 65 74 20 73 6f 75 72 63 65 46       set sourceF
c8d0: 69 6c 65 4e 61 6d 65 20 5b 67 65 74 42 75 69 6c  ileName [getBuil
c8e0: 64 46 69 6c 65 4e 61 6d 65 20 24 66 69 6c 65 4e  dFileName $fileN
c8f0: 61 6d 65 20 24 6d 61 6e 61 67 65 64 4f 6e 6c 79  ame $managedOnly
c900: 20 24 70 6c 61 74 66 6f 72 6d 5d 0d 0a 0d 0a 20   $platform].... 
c910: 20 20 20 20 20 69 66 20 7b 21 5b 66 69 6c 65 20       if {![file 
c920: 65 78 69 73 74 73 20 24 73 6f 75 72 63 65 46 69  exists $sourceFi
c930: 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d  leName]} then {.
c940: 0a 20 20 20 20 20 20 20 20 69 66 20 7b 24 76 65  .        if {$ve
c950: 72 62 6f 73 65 7d 20 74 68 65 6e 20 7b 0d 0a 20  rbose} then {.. 
c960: 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
c970: 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b  ::test_channel [
c980: 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
c990: 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
c9a0: 2d 20 73 6b 69 70 70 65 64 20 63 6f 70 79 69 6e  - skipped copyin
c9b0: 67 20 62 75 69 6c 64 20 66 69 6c 65 20 5c 22 22  g build file \""
c9c0: 20 24 73 6f 75 72 63 65 46 69 6c 65 4e 61 6d 65   $sourceFileName
c9d0: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
c9e0: 20 20 22 5c 22 2c 20 69 74 20 64 6f 65 73 20 6e    "\", it does n
c9f0: 6f 74 20 65 78 69 73 74 5c 6e 22 5d 0d 0a 20 20  ot exist\n"]..  
ca00: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
ca10: 20 20 20 72 65 74 75 72 6e 0d 0a 20 20 20 20 20     return..     
ca20: 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b   }....      if {
ca30: 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
ca40: 6e 65 77 46 69 6c 65 4e 61 6d 65 5d 20 3e 20 30  newFileName] > 0
ca50: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
ca60: 20 20 73 65 74 20 74 61 72 67 65 74 46 69 6c 65    set targetFile
ca70: 4e 61 6d 65 20 5b 67 65 74 42 69 6e 61 72 79 46  Name [getBinaryF
ca80: 69 6c 65 4e 61 6d 65 20 24 6e 65 77 46 69 6c 65  ileName $newFile
ca90: 4e 61 6d 65 20 24 70 6c 61 74 66 6f 72 6d 5d 0d  Name $platform].
caa0: 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d  .      } else {.
cab0: 0a 20 20 20 20 20 20 20 20 73 65 74 20 74 61 72  .        set tar
cac0: 67 65 74 46 69 6c 65 4e 61 6d 65 20 5b 67 65 74  getFileName [get
cad0: 42 69 6e 61 72 79 46 69 6c 65 4e 61 6d 65 20 24  BinaryFileName $
cae0: 66 69 6c 65 4e 61 6d 65 20 24 70 6c 61 74 66 6f  fileName $platfo
caf0: 72 6d 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a  rm]..      }....
cb00: 20 20 20 20 20 20 73 65 74 20 74 61 72 67 65 74        set target
cb10: 44 69 72 65 63 74 6f 72 79 20 5b 66 69 6c 65 20  Directory [file 
cb20: 64 69 72 6e 61 6d 65 20 24 74 61 72 67 65 74 46  dirname $targetF
cb30: 69 6c 65 4e 61 6d 65 5d 0d 0a 0d 0a 20 20 20 20  ileName]....    
cb40: 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a    if {[catch {..
cb50: 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 66 69          if {![fi
cb60: 6c 65 20 65 78 69 73 74 73 20 24 74 61 72 67 65  le exists $targe
cb70: 74 44 69 72 65 63 74 6f 72 79 5d 7d 20 74 68 65  tDirectory]} the
cb80: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 66  n {..          f
cb90: 69 6c 65 20 6d 6b 64 69 72 20 24 74 61 72 67 65  ile mkdir $targe
cba0: 74 44 69 72 65 63 74 6f 72 79 0d 0a 20 20 20 20  tDirectory..    
cbb0: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
cbc0: 20 66 69 6c 65 20 63 6f 70 79 20 2d 66 6f 72 63   file copy -forc
cbd0: 65 20 24 73 6f 75 72 63 65 46 69 6c 65 4e 61 6d  e $sourceFileNam
cbe0: 65 20 24 74 61 72 67 65 74 46 69 6c 65 4e 61 6d  e $targetFileNam
cbf0: 65 0d 0a 20 20 20 20 20 20 7d 5d 20 3d 3d 20 30  e..      }] == 0
cc00: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
cc10: 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
cc20: 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
cc30: 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
cc40: 20 20 20 22 2d 2d 2d 2d 20 63 6f 70 69 65 64 20     "---- copied 
cc50: 62 75 69 6c 64 20 66 69 6c 65 20 66 72 6f 6d 20  build file from 
cc60: 5c 22 22 20 24 73 6f 75 72 63 65 46 69 6c 65 4e  \"" $sourceFileN
cc70: 61 6d 65 20 22 5c 22 20 74 6f 20 5c 22 22 20 5c  ame "\" to \"" \
cc80: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 24 74  ..            $t
cc90: 61 72 67 65 74 46 69 6c 65 4e 61 6d 65 20 5c 22  argetFileName \"
cca0: 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73  \n]..      } els
ccb0: 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75  e {..        tpu
ccc0: 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
ccd0: 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
cce0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 2d  ..            "-
ccf0: 2d 2d 2d 20 66 61 69 6c 65 64 20 74 6f 20 63 6f  --- failed to co
cd00: 70 79 20 62 75 69 6c 64 20 66 69 6c 65 20 66 72  py build file fr
cd10: 6f 6d 20 5c 22 22 20 24 73 6f 75 72 63 65 46 69  om \"" $sourceFi
cd20: 6c 65 4e 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20  leName \..      
cd30: 20 20 20 20 20 20 22 5c 22 20 74 6f 20 5c 22 22        "\" to \""
cd40: 20 24 74 61 72 67 65 74 46 69 6c 65 4e 61 6d 65   $targetFileName
cd50: 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d 0d   \"\n]..      }.
cd60: 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70  .    }.....    p
cd70: 72 6f 63 20 74 72 79 44 65 6c 65 74 65 42 69 6e  roc tryDeleteBin
cd80: 61 72 79 46 69 6c 65 20 7b 20 66 69 6c 65 4e 61  aryFile { fileNa
cd90: 6d 65 20 7b 70 6c 61 74 66 6f 72 6d 20 22 22 7d  me {platform ""}
cda0: 20 7b 76 65 72 62 6f 73 65 20 74 72 75 65 7d 20   {verbose true} 
cdb0: 7d 20 7b 0d 0a 20 20 20 20 20 20 73 65 74 20 66  } {..      set f
cdc0: 69 6c 65 4e 61 6d 65 20 5b 67 65 74 42 69 6e 61  ileName [getBina
cdd0: 72 79 46 69 6c 65 4e 61 6d 65 20 24 66 69 6c 65  ryFileName $file
cde0: 4e 61 6d 65 20 24 70 6c 61 74 66 6f 72 6d 5d 0d  Name $platform].
cdf0: 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 21 5b 66  ...      if {![f
ce00: 69 6c 65 20 65 78 69 73 74 73 20 24 66 69 6c 65  ile exists $file
ce10: 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  Name]} then {.. 
ce20: 20 20 20 20 20 20 20 69 66 20 7b 24 76 65 72 62         if {$verb
ce30: 6f 73 65 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  ose} then {..   
ce40: 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
ce50: 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70  test_channel [ap
ce60: 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
ce70: 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
ce80: 73 6b 69 70 70 65 64 20 64 65 6c 65 74 69 6e 67  skipped deleting
ce90: 20 62 69 6e 61 72 79 20 66 69 6c 65 20 5c 22 22   binary file \""
cea0: 20 24 66 69 6c 65 4e 61 6d 65 20 5c 0d 0a 20 20   $fileName \..  
ceb0: 20 20 20 20 20 20 20 20 20 20 20 20 22 5c 22 2c              "\",
cec0: 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 65 78 69   it does not exi
ced0: 73 74 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20  st\n"]..        
cee0: 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 72 65 74  }....        ret
cef0: 75 72 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a  urn..      }....
cf00: 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68        if {[catch
cf10: 20 7b 66 69 6c 65 20 64 65 6c 65 74 65 20 24 66   {file delete $f
cf20: 69 6c 65 4e 61 6d 65 7d 5d 20 3d 3d 20 30 7d 20  ileName}] == 0} 
cf30: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
cf40: 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
cf50: 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
cf60: 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
cf70: 20 22 2d 2d 2d 2d 20 64 65 6c 65 74 65 64 20 62   "---- deleted b
cf80: 69 6e 61 72 79 20 66 69 6c 65 20 5c 22 22 20 24  inary file \"" $
cf90: 66 69 6c 65 4e 61 6d 65 20 5c 22 5c 6e 5d 0d 0a  fileName \"\n]..
cfa0: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
cfb0: 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
cfc0: 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61  :test_channel [a
cfd0: 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
cfe0: 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 66           "---- f
cff0: 61 69 6c 65 64 20 74 6f 20 64 65 6c 65 74 65 20  ailed to delete 
d000: 62 69 6e 61 72 79 20 66 69 6c 65 20 5c 22 22 20  binary file \"" 
d010: 24 66 69 6c 65 4e 61 6d 65 20 5c 22 5c 6e 5d 0d  $fileName \"\n].
d020: 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d  .      }..    }.
d030: 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 74 72 79  ....    proc try
d040: 44 65 6c 65 74 65 42 75 69 6c 64 46 69 6c 65 20  DeleteBuildFile 
d050: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 66  {..            f
d060: 69 6c 65 4e 61 6d 65 20 6d 61 6e 61 67 65 64 4f  ileName managedO
d070: 6e 6c 79 20 7b 70 6c 61 74 66 6f 72 6d 20 22 22  nly {platform ""
d080: 7d 20 7b 76 65 72 62 6f 73 65 20 74 72 75 65 7d  } {verbose true}
d090: 20 7d 20 7b 0d 0a 20 20 20 20 20 20 73 65 74 20   } {..      set 
d0a0: 66 69 6c 65 4e 61 6d 65 20 5b 67 65 74 42 75 69  fileName [getBui
d0b0: 6c 64 46 69 6c 65 4e 61 6d 65 20 24 66 69 6c 65  ldFileName $file
d0c0: 4e 61 6d 65 20 24 6d 61 6e 61 67 65 64 4f 6e 6c  Name $managedOnl
d0d0: 79 20 24 70 6c 61 74 66 6f 72 6d 5d 0d 0a 0d 0a  y $platform]....
d0e0: 20 20 20 20 20 20 69 66 20 7b 21 5b 66 69 6c 65        if {![file
d0f0: 20 65 78 69 73 74 73 20 24 66 69 6c 65 4e 61 6d   exists $fileNam
d100: 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  e]} then {..    
d110: 20 20 20 20 69 66 20 7b 24 76 65 72 62 6f 73 65      if {$verbose
d120: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
d130: 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
d140: 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e  t_channel [appen
d150: 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
d160: 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 73 6b 69         "---- ski
d170: 70 70 65 64 20 64 65 6c 65 74 69 6e 67 20 62 75  pped deleting bu
d180: 69 6c 64 20 66 69 6c 65 20 5c 22 22 20 24 66 69  ild file \"" $fi
d190: 6c 65 4e 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20  leName \..      
d1a0: 20 20 20 20 20 20 20 20 22 5c 22 2c 20 69 74 20          "\", it 
d1b0: 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 5c 6e  does not exist\n
d1c0: 22 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d  "]..        }...
d1d0: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 0d  .        return.
d1e0: 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
d1f0: 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 66 69    if {[catch {fi
d200: 6c 65 20 64 65 6c 65 74 65 20 24 66 69 6c 65 4e  le delete $fileN
d210: 61 6d 65 7d 5d 20 3d 3d 20 30 7d 20 74 68 65 6e  ame}] == 0} then
d220: 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74   {..        tput
d230: 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
d240: 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
d250: 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d  .            "--
d260: 2d 2d 20 64 65 6c 65 74 65 64 20 62 75 69 6c 64  -- deleted build
d270: 20 66 69 6c 65 20 5c 22 22 20 24 66 69 6c 65 4e   file \"" $fileN
d280: 61 6d 65 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20  ame \"\n]..     
d290: 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
d2a0: 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
d2b0: 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  _channel [append
d2c0: 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
d2d0: 20 20 20 20 22 2d 2d 2d 2d 20 66 61 69 6c 65 64      "---- failed
d2e0: 20 74 6f 20 64 65 6c 65 74 65 20 62 75 69 6c 64   to delete build
d2f0: 20 66 69 6c 65 20 5c 22 22 20 24 66 69 6c 65 4e   file \"" $fileN
d300: 61 6d 65 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20  ame \"\n]..     
d310: 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20   }..    }.....  
d320: 20 20 70 72 6f 63 20 74 72 79 43 6f 70 79 41 73    proc tryCopyAs
d330: 73 65 6d 62 6c 79 20 7b 0d 0a 20 20 20 20 20 20  sembly {..      
d340: 20 20 20 20 20 20 66 69 6c 65 4e 61 6d 65 20 6d        fileName m
d350: 61 6e 61 67 65 64 4f 6e 6c 79 20 7b 70 6c 61 74  anagedOnly {plat
d360: 66 6f 72 6d 20 22 22 7d 20 7b 70 64 62 20 74 72  form ""} {pdb tr
d370: 75 65 7d 20 7b 76 65 72 62 6f 73 65 20 74 72 75  ue} {verbose tru
d380: 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 74 72  e} } {..      tr
d390: 79 43 6f 70 79 42 75 69 6c 64 46 69 6c 65 20 24  yCopyBuildFile $
d3a0: 66 69 6c 65 4e 61 6d 65 20 24 6d 61 6e 61 67 65  fileName $manage
d3b0: 64 4f 6e 6c 79 20 24 70 6c 61 74 66 6f 72 6d 20  dOnly $platform 
d3c0: 22 22 20 24 76 65 72 62 6f 73 65 0d 0a 0d 0a 20  "" $verbose.... 
d3d0: 20 20 20 20 20 69 66 20 7b 24 70 64 62 7d 20 74       if {$pdb} t
d3e0: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 74  hen {..        t
d3f0: 72 79 43 6f 70 79 42 75 69 6c 64 46 69 6c 65 20  ryCopyBuildFile 
d400: 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
d410: 20 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65             [file
d420: 20 72 6f 6f 74 6e 61 6d 65 20 24 66 69 6c 65 4e   rootname $fileN
d430: 61 6d 65 5d 20 2e 70 64 62 5d 20 24 6d 61 6e 61  ame] .pdb] $mana
d440: 67 65 64 4f 6e 6c 79 20 24 70 6c 61 74 66 6f 72  gedOnly $platfor
d450: 6d 20 22 22 20 24 76 65 72 62 6f 73 65 0d 0a 20  m "" $verbose.. 
d460: 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c       }..    }...
d470: 0d 0a 20 20 20 20 70 72 6f 63 20 74 72 79 44 65  ..    proc tryDe
d480: 6c 65 74 65 41 73 73 65 6d 62 6c 79 20 7b 0d 0a  leteAssembly {..
d490: 20 20 20 20 20 20 20 20 20 20 20 20 66 69 6c 65              file
d4a0: 4e 61 6d 65 20 7b 70 6c 61 74 66 6f 72 6d 20 22  Name {platform "
d4b0: 22 7d 20 7b 70 64 62 20 74 72 75 65 7d 20 7b 76  "} {pdb true} {v
d4c0: 65 72 62 6f 73 65 20 74 72 75 65 7d 20 7d 20 7b  erbose true} } {
d4d0: 0d 0a 20 20 20 20 20 20 74 72 79 44 65 6c 65 74  ..      tryDelet
d4e0: 65 42 69 6e 61 72 79 46 69 6c 65 20 24 66 69 6c  eBinaryFile $fil
d4f0: 65 4e 61 6d 65 20 24 70 6c 61 74 66 6f 72 6d 20  eName $platform 
d500: 24 76 65 72 62 6f 73 65 0d 0a 0d 0a 20 20 20 20  $verbose....    
d510: 20 20 69 66 20 7b 24 70 64 62 7d 20 74 68 65 6e    if {$pdb} then
d520: 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 72 79 44   {..        tryD
d530: 65 6c 65 74 65 42 69 6e 61 72 79 46 69 6c 65 20  eleteBinaryFile 
d540: 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
d550: 20 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65             [file
d560: 20 72 6f 6f 74 6e 61 6d 65 20 24 66 69 6c 65 4e   rootname $fileN
d570: 61 6d 65 5d 20 2e 70 64 62 5d 20 24 70 6c 61 74  ame] .pdb] $plat
d580: 66 6f 72 6d 20 24 76 65 72 62 6f 73 65 0d 0a 20  form $verbose.. 
d590: 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c       }..    }...
d5a0: 0d 0a 20 20 20 20 70 72 6f 63 20 74 72 79 4c 6f  ..    proc tryLo
d5b0: 61 64 41 73 73 65 6d 62 6c 79 20 7b 20 66 69 6c  adAssembly { fil
d5c0: 65 4e 61 6d 65 20 7b 70 6c 61 74 66 6f 72 6d 20  eName {platform 
d5d0: 22 22 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 73  ""} } {..      s
d5e0: 65 74 20 66 69 6c 65 4e 61 6d 65 20 5b 67 65 74  et fileName [get
d5f0: 42 69 6e 61 72 79 46 69 6c 65 4e 61 6d 65 20 24  BinaryFileName $
d600: 66 69 6c 65 4e 61 6d 65 20 24 70 6c 61 74 66 6f  fileName $platfo
d610: 72 6d 5d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20  rm]....      if 
d620: 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20  {[catch {..     
d630: 20 20 20 73 65 74 20 61 73 73 65 6d 62 6c 79 20     set assembly 
d640: 5b 6f 62 6a 65 63 74 20 6c 6f 61 64 20 2d 6c 6f  [object load -lo
d650: 61 64 74 79 70 65 20 46 69 6c 65 20 2d 61 6c 69  adtype File -ali
d660: 61 73 20 24 66 69 6c 65 4e 61 6d 65 5d 0d 0a 20  as $fileName].. 
d670: 20 20 20 20 20 7d 5d 20 3d 3d 20 30 7d 20 74 68       }] == 0} th
d680: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d  en {..        #.
d690: 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
d6a0: 20 4e 6f 77 2c 20 61 64 64 20 74 68 65 20 6e 65   Now, add the ne
d6b0: 63 65 73 73 61 72 79 20 74 65 73 74 20 63 6f 6e  cessary test con
d6c0: 73 74 72 61 69 6e 74 2e 0d 0a 20 20 20 20 20 20  straint...      
d6d0: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 61 64 64    #..        add
d6e0: 43 6f 6e 73 74 72 61 69 6e 74 20 5b 66 69 6c 65  Constraint [file
d6f0: 20 72 6f 6f 74 6e 61 6d 65 20 5b 66 69 6c 65 20   rootname [file 
d700: 74 61 69 6c 20 24 66 69 6c 65 4e 61 6d 65 5d 5d  tail $fileName]]
d710: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  ....        #.. 
d720: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 47         # NOTE: G
d730: 72 61 62 20 74 68 65 20 69 6d 61 67 65 20 72 75  rab the image ru
d740: 6e 74 69 6d 65 20 76 65 72 73 69 6f 6e 20 66 72  ntime version fr
d750: 6f 6d 20 74 68 65 20 61 73 73 65 6d 62 6c 79 20  om the assembly 
d760: 62 65 63 61 75 73 65 0d 0a 20 20 20 20 20 20 20  because..       
d770: 20 23 20 20 20 20 20 20 20 73 65 76 65 72 61 6c   #       several
d780: 20 74 65 73 74 73 20 72 65 6c 79 20 6f 6e 20 69   tests rely on i
d790: 74 20 68 61 76 69 6e 67 20 61 20 63 65 72 74 61  t having a certa
d7a0: 69 6e 20 76 61 6c 75 65 2e 0d 0a 20 20 20 20 20  in value...     
d7b0: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 61 64     #..        ad
d7c0: 64 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70  dConstraint [app
d7d0: 65 6e 64 41 72 67 73 20 5b 66 69 6c 65 20 74 61  endArgs [file ta
d7e0: 69 6c 20 24 66 69 6c 65 4e 61 6d 65 5d 20 5f 20  il $fileName] _ 
d7f0: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b  \..            [
d800: 24 61 73 73 65 6d 62 6c 79 20 49 6d 61 67 65 52  $assembly ImageR
d810: 75 6e 74 69 6d 65 56 65 72 73 69 6f 6e 5d 5d 0d  untimeVersion]].
d820: 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
d830: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 52 65        # NOTE: Re
d840: 74 75 72 6e 20 74 68 65 20 66 75 6c 6c 20 70 61  turn the full pa
d850: 74 68 20 6f 66 20 74 68 65 20 6c 6f 61 64 65 64  th of the loaded
d860: 20 66 69 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20   file...        
d870: 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  #..        retur
d880: 6e 20 24 66 69 6c 65 4e 61 6d 65 0d 0a 20 20 20  n $fileName..   
d890: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65     }....      re
d8a0: 74 75 72 6e 20 22 22 0d 0a 20 20 20 20 7d 0d 0a  turn ""..    }..
d8b0: 0c 0d 0a 20 20 20 20 70 72 6f 63 20 69 73 53 51  ...    proc isSQ
d8c0: 4c 69 74 65 52 65 61 64 79 20 7b 7d 20 7b 0d 0a  LiteReady {} {..
d8d0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
d8e0: 20 4e 4f 54 45 3a 20 54 68 69 73 20 70 72 6f 63   NOTE: This proc
d8f0: 65 64 75 72 65 20 6d 75 73 74 20 72 65 74 75 72  edure must retur
d900: 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 6f 6e 6c 79 20  n non-zero only 
d910: 69 66 20 74 68 65 20 53 51 4c 69 74 65 20 6e 61  if the SQLite na
d920: 74 69 76 65 0d 0a 20 20 20 20 20 20 23 20 20 20  tive..      #   
d930: 20 20 20 20 6c 69 62 72 61 72 79 20 61 6e 64 20      library and 
d940: 74 68 65 20 53 79 73 74 65 6d 2e 44 61 74 61 2e  the System.Data.
d950: 53 51 4c 69 74 65 20 6d 61 6e 61 67 65 64 20 61  SQLite managed a
d960: 73 73 65 6d 62 6c 79 20 61 72 65 20 6c 6f 61 64  ssembly are load
d970: 65 64 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  ed..      #     
d980: 20 20 61 6e 64 20 72 65 61 64 79 20 66 6f 72 20    and ready for 
d990: 75 73 65 20 62 79 20 74 68 65 20 74 65 73 74 20  use by the test 
d9a0: 73 75 69 74 65 2e 20 20 43 75 72 72 65 6e 74 6c  suite.  Currentl
d9b0: 79 2c 20 74 68 69 73 20 70 72 6f 63 65 64 75 72  y, this procedur
d9c0: 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  e..      #      
d9d0: 20 73 68 6f 75 6c 64 20 62 65 20 63 61 6c 6c 65   should be calle
d9e0: 64 20 6f 6e 6c 79 20 61 66 74 65 72 20 74 68 65  d only after the
d9f0: 20 5b 74 72 79 4c 6f 61 64 41 73 73 65 6d 62 6c   [tryLoadAssembl
da00: 79 5d 20 70 72 6f 63 65 64 75 72 65 20 68 61 73  y] procedure has
da10: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
da20: 62 65 65 6e 20 63 61 6c 6c 65 64 20 74 6f 20 70  been called to p
da30: 72 6f 62 65 20 66 6f 72 20 74 68 65 20 53 79 73  robe for the Sys
da40: 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 20  tem.Data.SQLite 
da50: 6d 61 6e 61 67 65 64 20 61 73 73 65 6d 62 6c 79  managed assembly
da60: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
da70: 61 6e 64 20 74 68 65 20 5b 63 68 65 63 6b 46 6f  and the [checkFo
da80: 72 53 51 4c 69 74 65 5d 20 70 72 6f 63 65 64 75  rSQLite] procedu
da90: 72 65 20 68 61 73 20 62 65 65 6e 20 63 61 6c 6c  re has been call
daa0: 65 64 20 74 6f 20 70 72 6f 62 65 20 66 6f 72 0d  ed to probe for.
dab0: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74  .      #       t
dac0: 68 65 20 53 51 4c 69 74 65 20 6e 61 74 69 76 65  he SQLite native
dad0: 20 6c 69 62 72 61 72 79 3b 20 6f 74 68 65 72 77   library; otherw
dae0: 69 73 65 2c 20 74 68 69 73 20 70 72 6f 63 65 64  ise, this proced
daf0: 75 72 65 20 77 69 6c 6c 20 73 69 6d 70 6c 79 0d  ure will simply.
db00: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 61  .      #       a
db10: 6c 77 61 79 73 20 72 65 74 75 72 6e 20 7a 65 72  lways return zer
db20: 6f 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  o...      #..   
db30: 20 20 20 72 65 74 75 72 6e 20 5b 65 78 70 72 20     return [expr 
db40: 7b 0d 0a 20 20 20 20 20 20 20 20 5b 68 61 76 65  {..        [have
db50: 43 6f 6e 73 74 72 61 69 6e 74 20 53 79 73 74 65  Constraint Syste
db60: 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 5d 20 26  m.Data.SQLite] &
db70: 26 20 5b 68 61 76 65 43 6f 6e 73 74 72 61 69 6e  & [haveConstrain
db80: 74 20 53 51 4c 69 74 65 5d 0d 0a 20 20 20 20 20  t SQLite]..     
db90: 20 7d 5d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20   }]..    }..... 
dba0: 20 20 20 70 72 6f 63 20 6d 61 74 63 68 50 6c 61     proc matchPla
dbb0: 74 66 6f 72 6d 20 7b 20 70 6c 61 74 66 6f 72 6d  tform { platform
dbc0: 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20   } {..      #.. 
dbd0: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 6e 20       # NOTE: An 
dbe0: 65 6d 70 74 79 20 73 74 72 69 6e 67 20 66 6f 72  empty string for
dbf0: 20 74 68 65 20 70 6c 61 74 66 6f 72 6d 20 6d 65   the platform me
dc00: 61 6e 73 20 74 68 61 74 20 74 68 65 20 62 75 69  ans that the bui
dc10: 6c 64 20 69 73 20 6e 6f 74 0d 0a 20 20 20 20 20  ld is not..     
dc20: 20 23 20 20 20 20 20 20 20 5b 70 72 69 6d 61 72   #       [primar
dc30: 69 6c 79 5d 20 61 20 6e 61 74 69 76 65 20 62 75  ily] a native bu
dc40: 69 6c 64 3b 20 74 68 65 72 65 66 6f 72 65 2c 20  ild; therefore, 
dc50: 69 74 20 61 6c 77 61 79 73 20 6d 61 74 63 68 65  it always matche
dc60: 73 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  s...      #..   
dc70: 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c     if {[string l
dc80: 65 6e 67 74 68 20 24 70 6c 61 74 66 6f 72 6d 5d  ength $platform]
dc90: 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20   == 0} then {.. 
dca0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 72         return tr
dcb0: 75 65 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  ue..      }.... 
dcc0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
dcd0: 4e 4f 54 45 3a 20 49 66 20 74 68 65 20 6d 61 63  NOTE: If the mac
dce0: 68 69 6e 65 20 6e 61 6d 65 20 69 73 20 75 6e 61  hine name is una
dcf0: 76 61 69 6c 61 62 6c 65 2c 20 74 68 65 72 65 20  vailable, there 
dd00: 69 73 20 6e 6f 74 68 69 67 6e 20 65 6c 73 65 20  is nothign else 
dd10: 77 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  we..      #     
dd20: 20 20 63 61 6e 20 64 6f 2e 0d 0a 20 20 20 20 20    can do...     
dd30: 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 21 5b   #..      if {![
dd40: 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 74 63  info exists ::tc
dd50: 6c 5f 70 6c 61 74 66 6f 72 6d 28 6d 61 63 68 69  l_platform(machi
dd60: 6e 65 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ne)]} then {..  
dd70: 20 20 20 20 20 20 72 65 74 75 72 6e 20 66 61 6c        return fal
dd80: 73 65 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  se..      }.... 
dd90: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
dda0: 4e 4f 54 45 3a 20 44 6f 65 73 20 74 68 65 20 73  NOTE: Does the s
ddb0: 70 65 63 69 66 69 65 64 20 70 6c 61 74 66 6f 72  pecified platfor
ddc0: 6d 20 6d 61 74 63 68 20 75 70 20 74 6f 20 74 68  m match up to th
ddd0: 65 20 63 75 72 72 65 6e 74 20 70 72 6f 63 65 73  e current proces
dde0: 73 3f 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  s?..      #..   
ddf0: 20 20 20 69 66 20 7b 24 70 6c 61 74 66 6f 72 6d     if {$platform
de00: 20 65 71 20 5b 6d 61 63 68 69 6e 65 54 6f 50 6c   eq [machineToPl
de10: 61 74 66 6f 72 6d 20 24 3a 3a 74 63 6c 5f 70 6c  atform $::tcl_pl
de20: 61 74 66 6f 72 6d 28 6d 61 63 68 69 6e 65 29 5d  atform(machine)]
de30: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
de40: 20 20 72 65 74 75 72 6e 20 74 72 75 65 0d 0a 20    return true.. 
de50: 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
de60: 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
de70: 20 54 68 65 20 73 70 65 63 69 66 69 65 64 20 70   The specified p
de80: 6c 61 74 66 6f 72 6d 20 64 6f 65 73 20 6e 6f 74  latform does not
de90: 20 6d 61 74 63 68 20 75 70 20 77 69 74 68 20 74   match up with t
dea0: 68 65 20 70 6c 61 74 66 6f 72 6d 0d 0a 20 20 20  he platform..   
deb0: 20 20 20 23 20 20 20 20 20 20 20 66 6f 72 20 74     #       for t
dec0: 68 65 20 63 75 72 72 65 6e 74 20 70 72 6f 63 65  he current proce
ded0: 73 73 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  ss...      #..  
dee0: 20 20 20 20 72 65 74 75 72 6e 20 66 61 6c 73 65      return false
def0: 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
df00: 70 72 6f 63 20 68 61 76 65 53 51 4c 69 74 65 4f  proc haveSQLiteO
df10: 62 6a 65 63 74 43 6f 6d 6d 61 6e 64 20 7b 7d 20  bjectCommand {} 
df20: 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  {..      #..    
df30: 20 20 23 20 4e 4f 54 45 3a 20 49 73 20 74 68 65    # NOTE: Is the
df40: 20 5b 6f 62 6a 65 63 74 5d 20 63 6f 6d 6d 61 6e   [object] comman
df50: 64 20 63 75 72 72 65 6e 74 6c 79 20 61 76 61 69  d currently avai
df60: 6c 61 62 6c 65 3f 0d 0a 20 20 20 20 20 20 23 0d  lable?..      #.
df70: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b 65  .      return [e
df80: 78 70 72 20 7b 5b 6c 6c 65 6e 67 74 68 20 5b 69  xpr {[llength [i
df90: 6e 66 6f 20 63 6f 6d 6d 61 6e 64 73 20 6f 62 6a  nfo commands obj
dfa0: 65 63 74 5d 5d 20 3e 20 30 7d 5d 0d 0a 20 20 20  ect]] > 0}]..   
dfb0: 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
dfc0: 63 68 65 63 6b 46 6f 72 53 51 4c 69 74 65 4f 62  checkForSQLiteOb
dfd0: 6a 65 63 74 43 6f 6d 6d 61 6e 64 20 7b 20 63 68  jectCommand { ch
dfe0: 61 6e 6e 65 6c 20 7d 20 7b 0d 0a 20 20 20 20 20  annel } {..     
dff0: 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
e000: 22 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e 67 20 66  "---- checking f
e010: 6f 72 20 5c 22 6f 62 6a 65 63 74 5c 22 20 63 6f  or \"object\" co
e020: 6d 6d 61 6e 64 20 75 73 61 67 65 2e 2e 2e 20 22  mmand usage... "
e030: 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 21 5b  ....      if {![
e040: 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f  info exists ::no
e050: 28 73 71 6c 69 74 65 4f 62 6a 65 63 74 43 6f 6d  (sqliteObjectCom
e060: 6d 61 6e 64 29 5d 20 26 26 20 5c 0d 0a 20 20 20  mand)] && \..   
e070: 20 20 20 20 20 20 20 5b 68 61 76 65 53 51 4c 69         [haveSQLi
e080: 74 65 4f 62 6a 65 63 74 43 6f 6d 6d 61 6e 64 5d  teObjectCommand]
e090: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
e0a0: 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
e0b0: 20 79 65 73 5c 6e 0d 0a 20 20 20 20 20 20 7d 20   yes\n..      } 
e0c0: 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
e0d0: 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
e0e0: 45 3a 20 55 6e 6c 65 73 73 20 77 65 20 61 72 65  E: Unless we are
e0f0: 20 66 6f 72 62 69 64 64 65 6e 20 66 72 6f 6d 20   forbidden from 
e100: 64 6f 69 6e 67 20 73 6f 2c 20 61 64 64 20 73 6f  doing so, add so
e110: 6d 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 0d 0a  me constraints..
e120: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
e130: 74 68 61 74 20 77 69 6c 6c 20 61 6c 6c 6f 77 20  that will allow 
e140: 6d 6f 73 74 20 6f 66 20 74 68 65 20 74 65 73 74  most of the test
e150: 20 73 75 69 74 65 20 74 6f 20 72 75 6e 20 28 69   suite to run (i
e160: 2e 65 2e 20 74 68 6f 73 65 0d 0a 20 20 20 20 20  .e. those..     
e170: 20 20 20 23 20 20 20 20 20 20 20 74 65 73 74 73     #       tests
e180: 20 74 68 61 74 20 64 6f 20 6e 6f 74 20 64 69 72   that do not dir
e190: 65 63 74 6c 79 20 72 65 6c 79 20 75 70 6f 6e 20  ectly rely upon 
e1a0: 74 68 65 20 5b 6f 62 6a 65 63 74 5d 20 63 6f 6d  the [object] com
e1b0: 6d 61 6e 64 29 2e 0d 0a 20 20 20 20 20 20 20 20  mand)...        
e1c0: 23 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21  #..        if {!
e1d0: 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e  [info exists ::n
e1e0: 6f 28 73 68 69 6d 53 51 4c 69 74 65 41 73 73 65  o(shimSQLiteAsse
e1f0: 6d 62 6c 79 43 6f 6e 73 74 72 61 69 6e 74 73 29  mblyConstraints)
e200: 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
e210: 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69       addConstrai
e220: 6e 74 20 53 51 4c 69 74 65 0d 0a 20 20 20 20 20  nt SQLite..     
e230: 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69       addConstrai
e240: 6e 74 20 53 51 4c 69 74 65 49 6e 74 65 72 6f 70  nt SQLiteInterop
e250: 0d 0a 20 20 20 20 20 20 20 20 20 20 61 64 64 43  ..          addC
e260: 6f 6e 73 74 72 61 69 6e 74 20 53 79 73 74 65 6d  onstraint System
e270: 2e 44 61 74 61 2e 53 51 4c 69 74 65 0d 0a 20 20  .Data.SQLite..  
e280: 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74          addConst
e290: 72 61 69 6e 74 20 53 79 73 74 65 6d 2e 44 61 74  raint System.Dat
e2a0: 61 2e 53 51 4c 69 74 65 2e 45 6e 63 72 79 70 74  a.SQLite.Encrypt
e2b0: 69 6f 6e 0d 0a 20 20 20 20 20 20 20 20 20 20 61  ion..          a
e2c0: 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 53 79 73  ddConstraint Sys
e2d0: 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e  tem.Data.SQLite.
e2e0: 4c 69 6e 71 0d 0a 0d 0a 20 20 20 20 20 20 20 20  Linq....        
e2f0: 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20    addConstraint 
e300: 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
e310: 20 20 20 20 20 20 20 20 20 20 20 20 20 53 79 73               Sys
e320: 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e  tem.Data.SQLite.
e330: 64 6c 6c 5f 76 20 5b 67 65 74 42 75 69 6c 64 43  dll_v [getBuildC
e340: 6c 72 56 65 72 73 69 6f 6e 5d 5d 0d 0a 20 20 20  lrVersion]]..   
e350: 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
e360: 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69    if {![info exi
e370: 73 74 73 20 3a 3a 6e 6f 28 73 68 69 6d 53 51 4c  sts ::no(shimSQL
e380: 69 74 65 44 65 66 69 6e 65 43 6f 6e 73 74 61 6e  iteDefineConstan
e390: 74 43 6f 6e 73 74 72 61 69 6e 74 73 29 5d 7d 20  tConstraints)]} 
e3a0: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
e3b0: 20 20 66 6f 72 65 61 63 68 20 64 65 66 69 6e 65    foreach define
e3c0: 43 6f 6e 73 74 61 6e 74 20 5b 6c 69 73 74 20 5c  Constant [list \
e3d0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
e3e0: 49 4e 54 45 52 4f 50 5f 45 58 54 45 4e 53 49 4f  INTEROP_EXTENSIO
e3f0: 4e 5f 46 55 4e 43 54 49 4f 4e 53 20 49 4e 54 45  N_FUNCTIONS INTE
e400: 52 4f 50 5f 46 54 53 35 5f 45 58 54 45 4e 53 49  ROP_FTS5_EXTENSI
e410: 4f 4e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  ON \..          
e420: 20 20 20 20 49 4e 54 45 52 4f 50 5f 4a 53 4f 4e      INTEROP_JSON
e430: 31 5f 45 58 54 45 4e 53 49 4f 4e 20 49 4e 54 45  1_EXTENSION INTE
e440: 52 4f 50 5f 50 45 52 43 45 4e 54 49 4c 45 5f 45  ROP_PERCENTILE_E
e450: 58 54 45 4e 53 49 4f 4e 20 5c 0d 0a 20 20 20 20  XTENSION \..    
e460: 20 20 20 20 20 20 20 20 20 20 49 4e 54 45 52 4f            INTERO
e470: 50 5f 52 45 47 45 58 50 5f 45 58 54 45 4e 53 49  P_REGEXP_EXTENSI
e480: 4f 4e 20 49 4e 54 45 52 4f 50 5f 54 45 53 54 5f  ON INTEROP_TEST_
e490: 45 58 54 45 4e 53 49 4f 4e 20 5c 0d 0a 20 20 20  EXTENSION \..   
e4a0: 20 20 20 20 20 20 20 20 20 20 20 49 4e 54 45 52             INTER
e4b0: 4f 50 5f 53 45 53 53 49 4f 4e 5f 45 58 54 45 4e  OP_SESSION_EXTEN
e4c0: 53 49 4f 4e 20 49 4e 54 45 52 4f 50 5f 53 48 41  SION INTEROP_SHA
e4d0: 31 5f 45 58 54 45 4e 53 49 4f 4e 20 5c 0d 0a 20  1_EXTENSION \.. 
e4e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 49 4e 54               INT
e4f0: 45 52 4f 50 5f 54 4f 54 59 50 45 5f 45 58 54 45  EROP_TOTYPE_EXTE
e500: 4e 53 49 4f 4e 20 49 4e 54 45 52 4f 50 5f 56 49  NSION INTEROP_VI
e510: 52 54 55 41 4c 5f 54 41 42 4c 45 20 5c 0d 0a 20  RTUAL_TABLE \.. 
e520: 20 20 20 20 20 20 20 20 20 20 20 20 20 55 53 45               USE
e530: 5f 49 4e 54 45 52 4f 50 5f 44 4c 4c 5d 20 7b 0d  _INTEROP_DLL] {.
e540: 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 64 64  .            add
e550: 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65  Constraint [appe
e560: 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
e570: 20 20 20 20 20 20 20 20 20 20 5b 67 65 74 53 51            [getSQ
e580: 4c 69 74 65 44 65 66 69 6e 65 43 6f 6e 73 74 61  LiteDefineConsta
e590: 6e 74 50 72 65 66 69 78 5d 20 24 64 65 66 69 6e  ntPrefix] $defin
e5a0: 65 43 6f 6e 73 74 61 6e 74 5d 0d 0a 20 20 20 20  eConstant]..    
e5b0: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
e5c0: 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66   }....        if
e5d0: 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20   {![info exists 
e5e0: 3a 3a 6e 6f 28 73 68 69 6d 53 51 4c 69 74 65 56  ::no(shimSQLiteV
e5f0: 69 73 75 61 6c 53 74 75 64 69 6f 43 6f 6e 73 74  isualStudioConst
e600: 72 61 69 6e 74 73 29 5d 7d 20 74 68 65 6e 20 7b  raints)]} then {
e610: 0d 0a 20 20 20 20 20 20 20 20 20 20 61 64 64 43  ..          addC
e620: 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e  onstraint [appen
e630: 64 41 72 67 73 20 76 69 73 75 61 6c 53 74 75 64  dArgs visualStud
e640: 69 6f 20 5b 67 65 74 42 75 69 6c 64 59 65 61 72  io [getBuildYear
e650: 5d 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d  ]]..        }...
e660: 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24  .        tputs $
e670: 63 68 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d 0a 20 20  channel no\n..  
e680: 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d      }..    }....
e690: 0a 20 20 20 20 70 72 6f 63 20 63 68 61 6e 67 65  .    proc change
e6a0: 4e 61 74 69 76 65 52 75 6e 74 69 6d 65 4f 70 74  NativeRuntimeOpt
e6b0: 69 6f 6e 20 7b 20 6e 61 74 69 76 65 20 7d 20 7b  ion { native } {
e6c0: 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 6c 6c 65  ..      if {[lle
e6d0: 6e 67 74 68 20 5b 69 6e 66 6f 20 63 6f 6d 6d 61  ngth [info comma
e6e0: 6e 64 73 20 64 65 62 75 67 5d 5d 20 3e 20 30 20  nds debug]] > 0 
e6f0: 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  && \..          
e700: 5b 6c 6c 65 6e 67 74 68 20 5b 69 6e 66 6f 20 73  [llength [info s
e710: 75 62 63 6f 6d 6d 61 6e 64 73 20 64 65 62 75 67  ubcommands debug
e720: 20 72 75 6e 74 69 6d 65 6f 70 74 69 6f 6e 5d 5d   runtimeoption]]
e730: 20 3e 20 30 20 26 26 20 5b 63 61 74 63 68 20 7b   > 0 && [catch {
e740: 0d 0a 20 20 20 20 20 20 20 20 64 65 62 75 67 20  ..        debug 
e750: 72 75 6e 74 69 6d 65 6f 70 74 69 6f 6e 20 5b 65  runtimeoption [e
e760: 78 70 72 20 7b 24 6e 61 74 69 76 65 20 3f 20 22  xpr {$native ? "
e770: 61 64 64 22 20 3a 20 22 72 65 6d 6f 76 65 22 7d  add" : "remove"}
e780: 5d 20 6e 61 74 69 76 65 0d 0a 20 20 20 20 20 20  ] native..      
e790: 7d 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d  }] == 0} then {.
e7a0: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
e7b0: 74 72 75 65 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d  true..      }...
e7c0: 0a 20 20 20 20 20 20 69 66 20 7b 5b 68 61 76 65  .      if {[have
e7d0: 53 51 4c 69 74 65 4f 62 6a 65 63 74 43 6f 6d 6d  SQLiteObjectComm
e7e0: 61 6e 64 5d 20 26 26 20 5b 63 61 74 63 68 20 7b  and] && [catch {
e7f0: 0d 0a 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74  ..        object
e800: 20 69 6e 76 6f 6b 65 20 49 6e 74 65 72 70 72 65   invoke Interpre
e810: 74 65 72 2e 47 65 74 41 63 74 69 76 65 20 5b 65  ter.GetActive [e
e820: 78 70 72 20 7b 24 6e 61 74 69 76 65 20 3f 20 5c  xpr {$native ? \
e830: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 41  ..            "A
e840: 64 64 52 75 6e 74 69 6d 65 4f 70 74 69 6f 6e 22  ddRuntimeOption"
e850: 20 3a 20 22 52 65 6d 6f 76 65 52 75 6e 74 69 6d   : "RemoveRuntim
e860: 65 4f 70 74 69 6f 6e 22 7d 5d 20 6e 61 74 69 76  eOption"}] nativ
e870: 65 0d 0a 20 20 20 20 20 20 7d 5d 20 3d 3d 20 30  e..      }] == 0
e880: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
e890: 20 20 72 65 74 75 72 6e 20 74 72 75 65 0d 0a 20    return true.. 
e8a0: 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
e8b0: 72 65 74 75 72 6e 20 66 61 6c 73 65 0d 0a 20 20  return false..  
e8c0: 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
e8d0: 20 63 68 65 63 6b 46 6f 72 53 51 4c 69 74 65 42   checkForSQLiteB
e8e0: 75 69 6c 64 73 20 7b 20 63 68 61 6e 6e 65 6c 20  uilds { channel 
e8f0: 7b 73 65 6c 65 63 74 20 66 61 6c 73 65 7d 20 7d  {select false} }
e900: 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20   {..      #..   
e910: 20 20 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b     # NOTE: Check
e920: 20 66 6f 72 20 65 76 65 72 79 20 70 6f 73 73 69   for every possi
e930: 62 6c 65 20 76 61 6c 69 64 20 63 6f 6d 62 69 6e  ble valid combin
e940: 61 74 69 6f 6e 20 6f 66 20 76 61 6c 75 65 73 20  ation of values 
e950: 75 73 65 64 20 77 68 65 6e 0d 0a 20 20 20 20 20  used when..     
e960: 20 23 20 20 20 20 20 20 20 6c 6f 63 61 74 69 6e   #       locatin
e970: 67 20 6f 75 74 20 74 68 65 20 62 75 69 6c 64 20  g out the build 
e980: 6f 75 74 70 75 74 20 64 69 72 65 63 74 6f 72 79  output directory
e990: 2c 20 73 68 6f 77 69 6e 67 20 65 61 63 68 20 61  , showing each a
e9a0: 76 61 69 6c 61 62 6c 65 0d 0a 20 20 20 20 20 20  vailable..      
e9b0: 23 20 20 20 20 20 20 20 62 75 69 6c 64 20 76 61  #       build va
e9c0: 72 69 61 74 69 6f 6e 20 61 6c 6f 6e 67 20 74 68  riation along th
e9d0: 65 20 77 61 79 2e 0d 0a 20 20 20 20 20 20 23 0d  e way...      #.
e9e0: 0a 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 6e  .      foreach n
e9f0: 61 74 69 76 65 20 5b 6c 69 73 74 20 66 61 6c 73  ative [list fals
ea00: 65 20 74 72 75 65 5d 20 7b 0d 0a 20 20 20 20 20  e true] {..     
ea10: 20 20 20 66 6f 72 65 61 63 68 20 79 65 61 72 20     foreach year 
ea20: 5b 67 65 74 42 75 69 6c 64 59 65 61 72 73 5d 20  [getBuildYears] 
ea30: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72  {..          for
ea40: 65 61 63 68 20 63 6f 6e 66 69 67 75 72 61 74 69  each configurati
ea50: 6f 6e 20 5b 67 65 74 42 75 69 6c 64 43 6f 6e 66  on [getBuildConf
ea60: 69 67 75 72 61 74 69 6f 6e 73 5d 20 7b 0d 0a 20  igurations] {.. 
ea70: 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
ea80: 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45            # NOTE
ea90: 3a 20 46 69 67 75 72 65 20 6f 75 74 20 74 68 65  : Figure out the
eaa0: 20 65 66 66 65 63 74 69 76 65 20 62 75 69 6c 64   effective build
eab0: 20 70 6c 61 74 66 6f 72 6d 2e 20 20 54 68 69 73   platform.  This
eac0: 20 69 73 0d 0a 20 20 20 20 20 20 20 20 20 20 20   is..           
ead0: 20 23 20 20 20 20 20 20 20 62 61 73 65 64 20 6f   #       based o
eae0: 6e 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  n whether or not
eaf0: 20 61 20 5b 70 72 69 6d 61 72 69 6c 79 5d 20 6e   a [primarily] n
eb00: 61 74 69 76 65 20 62 75 69 6c 64 0d 0a 20 20 20  ative build..   
eb10: 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20           #      
eb20: 20 69 73 20 62 65 69 6e 67 20 75 73 65 64 2e 20   is being used. 
eb30: 20 46 6f 72 20 5b 70 72 69 6d 61 72 69 6c 79 5d   For [primarily]
eb40: 20 6e 6f 6e 2d 6e 61 74 69 76 65 20 62 75 69 6c   non-native buil
eb50: 64 73 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ds,..           
eb60: 20 23 20 20 20 20 20 20 20 74 68 69 73 20 77 69   #       this wi
eb70: 6c 6c 20 62 65 20 61 6e 20 65 6d 70 74 79 20 73  ll be an empty s
eb80: 74 72 69 6e 67 2e 0d 0a 20 20 20 20 20 20 20 20  tring...        
eb90: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
eba0: 20 20 20 73 65 74 20 70 6c 61 74 66 6f 72 6d 20     set platform 
ebb0: 5b 67 65 74 42 75 69 6c 64 50 6c 61 74 66 6f 72  [getBuildPlatfor
ebc0: 6d 20 24 6e 61 74 69 76 65 5d 0d 0a 0d 0a 20 20  m $native]....  
ebd0: 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
ebe0: 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  $channel [append
ebf0: 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
ec00: 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 68          "---- ch
ec10: 65 63 6b 69 6e 67 20 66 6f 72 20 53 79 73 74 65  ecking for Syste
ec20: 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 20 62 75  m.Data.SQLite bu
ec30: 69 6c 64 20 5c 22 22 20 5b 65 78 70 72 20 5c 0d  ild \"" [expr \.
ec40: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
ec50: 20 7b 24 6e 61 74 69 76 65 20 3f 20 22 6e 61 74   {$native ? "nat
ec60: 69 76 65 2f 22 20 3a 20 22 22 7d 5d 20 5b 65 78  ive/" : ""}] [ex
ec70: 70 72 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67  pr {[string leng
ec80: 74 68 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  th \..          
ec90: 20 20 20 20 20 20 24 70 6c 61 74 66 6f 72 6d 5d        $platform]
eca0: 20 3e 20 30 20 3f 20 5b 61 70 70 65 6e 64 41 72   > 0 ? [appendAr
ecb0: 67 73 20 24 70 6c 61 74 66 6f 72 6d 20 2f 5d 20  gs $platform /] 
ecc0: 3a 20 22 22 7d 5d 20 24 79 65 61 72 20 5c 0d 0a  : ""}] $year \..
ecd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ece0: 2f 20 24 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  / $configuration
ecf0: 20 22 5c 22 2e 2e 2e 20 22 5d 0d 0a 0d 0a 20 20   "\"... "]....  
ed00: 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
ed10: 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a           # NOTE:
ed20: 20 42 75 69 6c 64 20 74 68 65 20 66 75 6c 6c 79   Build the fully
ed30: 20 71 75 61 6c 69 66 69 65 64 20 64 69 72 65 63   qualified direc
ed40: 74 6f 72 79 20 77 68 65 72 65 20 74 68 65 20 6e  tory where the n
ed50: 65 63 65 73 73 61 72 79 0d 0a 20 20 20 20 20 20  ecessary..      
ed60: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63 6f        #       co
ed70: 6d 70 6f 6e 65 6e 74 73 20 66 6f 72 20 53 79 73  mponents for Sys
ed80: 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 20  tem.Data.SQLite 
ed90: 73 68 6f 75 6c 64 20 62 65 20 66 6f 75 6e 64 2e  should be found.
eda0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 0d  ..            #.
edb0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74  .            set
edc0: 20 64 69 72 65 63 74 6f 72 79 20 5b 6a 6f 69 6e   directory [join
edd0: 42 75 69 6c 64 44 69 72 65 63 74 6f 72 79 20 24  BuildDirectory $
ede0: 6e 61 74 69 76 65 20 5c 0d 0a 20 20 20 20 20 20  native \..      
edf0: 20 20 20 20 20 20 20 20 20 20 5b 67 65 74 42 75            [getBu
ee00: 69 6c 64 42 61 73 65 44 69 72 65 63 74 6f 72 79  ildBaseDirectory
ee10: 5d 20 24 79 65 61 72 20 24 70 6c 61 74 66 6f 72  ] $year $platfor
ee20: 6d 20 24 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  m $configuration
ee30: 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ]....           
ee40: 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   #..            
ee50: 23 20 4e 4f 54 45 3a 20 44 6f 20 74 68 65 20 6e  # NOTE: Do the n
ee60: 65 63 65 73 73 61 72 79 20 66 69 6c 65 73 20 65  ecessary files e
ee70: 78 69 73 74 3f 20 20 43 75 72 72 65 6e 74 6c 79  xist?  Currently
ee80: 2c 20 6e 6f 20 6f 74 68 65 72 20 73 74 65 70 73  , no other steps
ee90: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 20  ..            # 
eea0: 20 20 20 20 20 20 61 72 65 20 74 61 6b 65 6e 20        are taken 
eeb0: 74 6f 20 76 65 72 69 66 79 20 74 68 69 73 20 62  to verify this b
eec0: 75 69 6c 64 20 69 73 20 61 63 74 75 61 6c 6c 79  uild is actually
eed0: 20 76 69 61 62 6c 65 2e 0d 0a 20 20 20 20 20 20   viable...      
eee0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
eef0: 20 20 20 20 20 69 66 20 7b 5b 69 73 42 75 69 6c       if {[isBuil
ef00: 64 41 76 61 69 6c 61 62 6c 65 20 24 6e 61 74 69  dAvailable $nati
ef10: 76 65 20 24 64 69 72 65 63 74 6f 72 79 5d 7d 20  ve $directory]} 
ef20: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
ef30: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
ef40: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 57         # NOTE: W
ef50: 68 65 6e 20 69 6e 20 22 73 65 6c 65 63 74 22 20  hen in "select" 
ef60: 6d 6f 64 65 2c 20 61 75 74 6f 6d 61 74 69 63 61  mode, automatica
ef70: 6c 6c 79 20 73 65 6c 65 63 74 20 74 68 65 20 66  lly select the f
ef80: 69 72 73 74 0d 0a 20 20 20 20 20 20 20 20 20 20  irst..          
ef90: 20 20 20 20 23 20 20 20 20 20 20 20 61 76 61 69      #       avai
efa0: 6c 61 62 6c 65 20 62 75 69 6c 64 20 6f 66 20 53  lable build of S
efb0: 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
efc0: 65 20 61 6e 64 20 74 68 65 6e 20 72 65 74 75 72  e and then retur
efd0: 6e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n..             
efe0: 20 23 20 20 20 20 20 20 20 69 6d 6d 65 64 69 61   #       immedia
eff0: 74 65 6c 79 2e 0d 0a 20 20 20 20 20 20 20 20 20  tely...         
f000: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
f010: 20 20 20 20 20 20 69 66 20 7b 24 73 65 6c 65 63        if {$selec
f020: 74 20 26 26 20 5b 6d 61 74 63 68 50 6c 61 74 66  t && [matchPlatf
f030: 6f 72 6d 20 24 70 6c 61 74 66 6f 72 6d 5d 7d 20  orm $platform]} 
f040: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
f050: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
f060: 20 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54             # NOT
f070: 45 3a 20 4d 61 6e 75 61 6c 6c 79 20 6f 76 65 72  E: Manually over
f080: 72 69 64 65 20 61 6c 6c 20 74 68 65 20 62 75 69  ride all the bui
f090: 6c 64 20 64 69 72 65 63 74 6f 72 79 20 73 65 6c  ld directory sel
f0a0: 65 63 74 69 6f 6e 0d 0a 20 20 20 20 20 20 20 20  ection..        
f0b0: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
f0c0: 72 65 6c 61 74 65 64 20 74 65 73 74 20 73 65 74  related test set
f0d0: 74 69 6e 67 73 20 69 6e 20 6f 72 64 65 72 20 74  tings in order t
f0e0: 6f 20 66 6f 72 63 65 20 74 68 69 73 20 62 75 69  o force this bui
f0f0: 6c 64 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ld..            
f100: 20 20 20 20 23 20 20 20 20 20 20 20 6f 66 20 53      #       of S
f110: 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
f120: 65 20 74 6f 20 62 65 20 75 73 65 64 2e 0d 0a 20  e to be used... 
f130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23                 #
f140: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
f150: 20 20 69 66 20 7b 21 5b 63 68 61 6e 67 65 4e 61    if {![changeNa
f160: 74 69 76 65 52 75 6e 74 69 6d 65 4f 70 74 69 6f  tiveRuntimeOptio
f170: 6e 20 24 6e 61 74 69 76 65 5d 7d 20 74 68 65 6e  n $native]} then
f180: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
f190: 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
f1a0: 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
f1b0: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
f1c0: 20 20 20 20 20 20 20 20 20 20 22 6e 6f 2c 20 66            "no, f
f1d0: 61 69 6c 65 64 20 74 6f 20 22 20 5b 65 78 70 72  ailed to " [expr
f1e0: 20 7b 24 6e 61 74 69 76 65 20 3f 20 22 61 64 64   {$native ? "add
f1f0: 22 20 3a 20 22 72 65 6d 6f 76 65 22 7d 5d 20 5c  " : "remove"}] \
f200: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
f210: 20 20 20 20 20 20 20 20 22 20 74 68 65 20 5c 22          " the \"
f220: 6e 61 74 69 76 65 5c 22 20 72 75 6e 74 69 6d 65  native\" runtime
f230: 20 6f 70 74 69 6f 6e 5c 6e 22 5d 0d 0a 0d 0a 20   option\n"].... 
f240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f250: 20 72 65 74 75 72 6e 20 66 61 6c 73 65 0d 0a 20   return false.. 
f260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
f270: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
f280: 20 20 20 20 73 65 74 20 3a 3a 74 65 73 74 5f 79      set ::test_y
f290: 65 61 72 20 24 79 65 61 72 0d 0a 20 20 20 20 20  ear $year..     
f2a0: 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20 3a             set :
f2b0: 3a 74 65 73 74 5f 70 6c 61 74 66 6f 72 6d 20 24  :test_platform $
f2c0: 70 6c 61 74 66 6f 72 6d 0d 0a 20 20 20 20 20 20  platform..      
f2d0: 20 20 20 20 20 20 20 20 20 20 73 65 74 20 3a 3a            set ::
f2e0: 74 65 73 74 5f 63 6f 6e 66 69 67 75 72 61 74 69  test_configurati
f2f0: 6f 6e 20 24 63 6f 6e 66 69 67 75 72 61 74 69 6f  on $configuratio
f300: 6e 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n....           
f310: 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
f320: 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
f330: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
f340: 20 20 20 20 20 20 20 22 79 65 73 2c 20 73 65 6c         "yes, sel
f350: 65 63 74 65 64 20 28 22 20 5b 65 78 70 72 20 7b  ected (" [expr {
f360: 24 6e 61 74 69 76 65 20 3f 20 22 6e 61 74 69 76  $native ? "nativ
f370: 65 2f 22 20 3a 20 22 22 7d 5d 20 5c 0d 0a 20 20  e/" : ""}] \..  
f380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f390: 20 20 5b 65 78 70 72 20 7b 5b 73 74 72 69 6e 67    [expr {[string
f3a0: 20 6c 65 6e 67 74 68 20 24 70 6c 61 74 66 6f 72   length $platfor
f3b0: 6d 5d 20 3e 20 30 20 3f 20 5b 61 70 70 65 6e 64  m] > 0 ? [append
f3c0: 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
f3d0: 20 20 20 20 20 20 20 20 20 20 20 20 24 70 6c 61              $pla
f3e0: 74 66 6f 72 6d 20 2f 5d 20 3a 20 22 22 7d 5d 20  tform /] : ""}] 
f3f0: 24 79 65 61 72 20 2f 20 24 63 6f 6e 66 69 67 75  $year / $configu
f400: 72 61 74 69 6f 6e 20 22 29 5c 6e 22 5d 0d 0a 0d  ration ")\n"]...
f410: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
f420: 20 72 65 74 75 72 6e 20 74 72 75 65 0d 0a 20 20   return true..  
f430: 20 20 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c              } el
f440: 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  se {..          
f450: 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
f460: 6e 6e 65 6c 20 79 65 73 5c 6e 0d 0a 20 20 20 20  nnel yes\n..    
f470: 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
f480: 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20           } else 
f490: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
f4a0: 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
f4b0: 6e 6f 5c 6e 0d 0a 20 20 20 20 20 20 20 20 20 20  no\n..          
f4c0: 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d    }..          }
f4d0: 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20  ..        }..   
f4e0: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65     }....      re
f4f0: 74 75 72 6e 20 66 61 6c 73 65 0d 0a 20 20 20 20  turn false..    
f500: 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 63  }.....    proc c
f510: 68 65 63 6b 46 6f 72 53 51 4c 69 74 65 52 65 6c  heckForSQLiteRel
f520: 65 61 73 65 73 20 7b 20 63 68 61 6e 6e 65 6c 20  eases { channel 
f530: 7b 73 65 6c 65 63 74 20 66 61 6c 73 65 7d 20 7d  {select false} }
f540: 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20   {..      #..   
f550: 20 20 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b     # NOTE: Check
f560: 20 66 6f 72 20 70 61 73 74 20 72 65 6c 65 61 73   for past releas
f570: 65 73 20 6f 66 20 53 79 73 74 65 6d 2e 44 61 74  es of System.Dat
f580: 61 2e 53 51 4c 69 74 65 20 69 6e 20 74 68 65 20  a.SQLite in the 
f590: 64 69 72 65 63 74 6f 72 79 0d 0a 20 20 20 20 20  directory..     
f5a0: 20 23 20 20 20 20 20 20 20 63 6f 6e 74 61 69 6e   #       contain
f5b0: 65 64 20 69 6e 20 74 68 65 20 22 53 79 73 74 65  ed in the "Syste
f5c0: 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 22 20 65  m.Data.SQLite" e
f5d0: 6e 76 69 72 6f 6e 6d 65 6e 74 20 76 61 72 69 61  nvironment varia
f5e0: 62 6c 65 2c 20 69 66 0d 0a 20 20 20 20 20 20 23  ble, if..      #
f5f0: 20 20 20 20 20 20 20 70 72 65 73 65 6e 74 2e 0d         present..
f600: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
f610: 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73  if {[info exists
f620: 20 3a 3a 65 6e 76 28 53 79 73 74 65 6d 2e 44 61   ::env(System.Da
f630: 74 61 2e 53 51 4c 69 74 65 29 5d 20 26 26 20 5c  ta.SQLite)] && \
f640: 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 73 74 72  ..          [str
f650: 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a 65 6e  ing length $::en
f660: 76 28 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51  v(System.Data.SQ
f670: 4c 69 74 65 29 5d 20 3e 20 30 7d 20 74 68 65 6e  Lite)] > 0} then
f680: 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20   {..        #.. 
f690: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 42         # NOTE: B
f6a0: 75 69 6c 64 20 74 68 65 20 66 75 6c 6c 79 20 71  uild the fully q
f6b0: 75 61 6c 69 66 69 65 64 20 64 69 72 65 63 74 6f  ualified directo
f6c0: 72 79 20 77 68 65 72 65 20 74 68 65 20 6e 65 63  ry where the nec
f6d0: 65 73 73 61 72 79 0d 0a 20 20 20 20 20 20 20 20  essary..        
f6e0: 23 20 20 20 20 20 20 20 63 6f 6d 70 6f 6e 65 6e  #       componen
f6f0: 74 73 20 66 6f 72 20 53 79 73 74 65 6d 2e 44 61  ts for System.Da
f700: 74 61 2e 53 51 4c 69 74 65 20 73 68 6f 75 6c 64  ta.SQLite should
f710: 20 62 65 20 66 6f 75 6e 64 2e 0d 0a 20 20 20 20   be found...    
f720: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 73      #..        s
f730: 65 74 20 64 69 72 65 63 74 6f 72 79 20 5b 66 69  et directory [fi
f740: 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65 20 5b 66  le nativename [f
f750: 69 6c 65 20 6a 6f 69 6e 20 5c 0d 0a 20 20 20 20  ile join \..    
f760: 20 20 20 20 20 20 20 20 24 3a 3a 65 6e 76 28 53          $::env(S
f770: 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
f780: 65 29 20 5b 67 65 74 52 65 6c 65 61 73 65 56 65  e) [getReleaseVe
f790: 72 73 69 6f 6e 5d 5d 5d 0d 0a 0d 0a 20 20 20 20  rsion]]]....    
f7a0: 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
f7b0: 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
f7c0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 2d  ..            "-
f7d0: 2d 2d 2d 20 63 68 65 63 6b 69 6e 67 20 66 6f 72  --- checking for
f7e0: 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c   System.Data.SQL
f7f0: 69 74 65 20 72 65 6c 65 61 73 65 20 5c 22 22 20  ite release \"" 
f800: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 24  \..            $
f810: 64 69 72 65 63 74 6f 72 79 20 22 5c 22 2e 2e 2e  directory "\"...
f820: 20 22 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69   "]....        i
f830: 66 20 7b 5b 69 73 52 65 6c 65 61 73 65 41 76 61  f {[isReleaseAva
f840: 69 6c 61 62 6c 65 20 24 64 69 72 65 63 74 6f 72  ilable $director
f850: 79 20 70 6c 61 74 66 6f 72 6d 5d 7d 20 74 68 65  y platform]} the
f860: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69  n {..          i
f870: 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74  f {[string lengt
f880: 68 20 24 70 6c 61 74 66 6f 72 6d 5d 20 3d 3d 20  h $platform] == 
f890: 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
f8a0: 20 20 20 20 20 20 20 73 65 74 20 70 6c 61 74 66         set platf
f8b0: 6f 72 6d 20 75 6e 6b 6e 6f 77 6e 0d 0a 20 20 20  orm unknown..   
f8c0: 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
f8d0: 20 20 20 20 20 20 69 66 20 7b 24 73 65 6c 65 63        if {$selec
f8e0: 74 20 26 26 20 5b 6d 61 74 63 68 50 6c 61 74 66  t && [matchPlatf
f8f0: 6f 72 6d 20 24 70 6c 61 74 66 6f 72 6d 5d 7d 20  orm $platform]} 
f900: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
f910: 20 20 20 20 73 65 74 20 3a 3a 62 75 69 6c 64 5f      set ::build_
f920: 64 69 72 65 63 74 6f 72 79 20 24 64 69 72 65 63  directory $direc
f930: 74 6f 72 79 0d 0a 0d 0a 20 20 20 20 20 20 20 20  tory....        
f940: 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
f950: 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 22  el [appendArgs "
f960: 79 65 73 2c 20 73 65 6c 65 63 74 65 64 20 28 22  yes, selected ("
f970: 20 24 70 6c 61 74 66 6f 72 6d 20 22 29 5c 6e 22   $platform ")\n"
f980: 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ]....           
f990: 20 72 65 74 75 72 6e 20 74 72 75 65 0d 0a 20 20   return true..  
f9a0: 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b          } else {
f9b0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70  ..            tp
f9c0: 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70  uts $channel [ap
f9d0: 70 65 6e 64 41 72 67 73 20 22 79 65 73 20 28 22  pendArgs "yes ("
f9e0: 20 24 70 6c 61 74 66 6f 72 6d 20 22 29 5c 6e 22   $platform ")\n"
f9f0: 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  ]..          }..
fa00: 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b          } else {
fa10: 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70 75 74  ..          tput
fa20: 73 20 24 63 68 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d  s $channel no\n.
fa30: 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20  ...          if 
fa40: 7b 21 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24  {![file exists $
fa50: 64 69 72 65 63 74 6f 72 79 5d 20 7c 7c 20 5c 0d  directory] || \.
fa60: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 21  .              !
fa70: 5b 66 69 6c 65 20 69 73 64 69 72 65 63 74 6f 72  [file isdirector
fa80: 79 20 24 64 69 72 65 63 74 6f 72 79 5d 7d 20 74  y $directory]} t
fa90: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
faa0: 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
fab0: 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
fac0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
fad0: 20 22 2d 2d 2d 2d 20 65 6e 76 69 72 6f 6e 6d 65   "---- environme
fae0: 6e 74 20 76 61 72 69 61 62 6c 65 20 5c 22 53 79  nt variable \"Sy
faf0: 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
fb00: 5c 22 20 69 73 20 61 6e 20 22 20 5c 0d 0a 20 20  \" is an " \..  
fb10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 69                "i
fb20: 6e 76 61 6c 69 64 20 64 69 72 65 63 74 6f 72 79  nvalid directory
fb30: 2c 20 73 6b 69 70 70 69 6e 67 20 63 68 65 63 6b  , skipping check
fb40: 20 66 6f 72 20 72 65 6c 65 61 73 65 73 2e 2e 2e   for releases...
fb50: 5c 6e 22 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  \n"]....        
fb60: 20 20 20 20 72 65 74 75 72 6e 20 66 61 6c 73 65      return false
fb70: 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d  ..          }...
fb80: 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 65 61  .          forea
fb90: 63 68 20 70 61 74 68 20 5b 6c 73 6f 72 74 20 2d  ch path [lsort -
fba0: 64 65 63 72 65 61 73 69 6e 67 20 5b 66 69 6c 65  decreasing [file
fbb0: 20 6c 69 73 74 20 24 64 69 72 65 63 74 6f 72 79   list $directory
fbc0: 20 2a 5d 5d 20 7b 0d 0a 20 20 20 20 20 20 20 20   *]] {..        
fbd0: 20 20 20 20 69 66 20 7b 5b 66 69 6c 65 20 65 78      if {[file ex
fbe0: 69 73 74 73 20 24 70 61 74 68 5d 20 26 26 20 5b  ists $path] && [
fbf0: 66 69 6c 65 20 69 73 64 69 72 65 63 74 6f 72 79  file isdirectory
fc00: 20 24 70 61 74 68 5d 7d 20 74 68 65 6e 20 7b 0d   $path]} then {.
fc10: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74  .              t
fc20: 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61  puts $channel [a
fc30: 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
fc40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
fc50: 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e 67 20 66 6f  ---- checking fo
fc60: 72 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51  r System.Data.SQ
fc70: 4c 69 74 65 20 72 65 6c 65 61 73 65 20 5c 22 22  Lite release \""
fc80: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
fc90: 20 20 20 20 20 20 24 70 61 74 68 20 22 5c 22 2e        $path "\".
fca0: 2e 2e 20 22 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  .. "]....       
fcb0: 20 20 20 20 20 20 20 69 66 20 7b 5b 69 73 52 65         if {[isRe
fcc0: 6c 65 61 73 65 41 76 61 69 6c 61 62 6c 65 20 24  leaseAvailable $
fcd0: 70 61 74 68 20 70 6c 61 74 66 6f 72 6d 5d 7d 20  path platform]} 
fce0: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
fcf0: 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72          if {[str
fd00: 69 6e 67 20 6c 65 6e 67 74 68 20 24 70 6c 61 74  ing length $plat
fd10: 66 6f 72 6d 5d 20 3d 3d 20 30 7d 20 74 68 65 6e  form] == 0} then
fd20: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
fd30: 20 20 20 20 20 20 73 65 74 20 70 6c 61 74 66 6f        set platfo
fd40: 72 6d 20 75 6e 6b 6e 6f 77 6e 0d 0a 20 20 20 20  rm unknown..    
fd50: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d              }...
fd60: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
fd70: 20 69 66 20 7b 24 73 65 6c 65 63 74 20 26 26 20   if {$select && 
fd80: 5b 6d 61 74 63 68 50 6c 61 74 66 6f 72 6d 20 24  [matchPlatform $
fd90: 70 6c 61 74 66 6f 72 6d 5d 7d 20 74 68 65 6e 20  platform]} then 
fda0: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
fdb0: 20 20 20 20 20 73 65 74 20 3a 3a 62 75 69 6c 64       set ::build
fdc0: 5f 64 69 72 65 63 74 6f 72 79 20 24 70 61 74 68  _directory $path
fdd0: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
fde0: 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
fdf0: 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
fe00: 20 22 79 65 73 2c 20 73 65 6c 65 63 74 65 64 20   "yes, selected 
fe10: 28 22 20 24 70 6c 61 74 66 6f 72 6d 20 22 29 5c  (" $platform ")\
fe20: 6e 22 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  n"]....         
fe30: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
fe40: 74 72 75 65 0d 0a 20 20 20 20 20 20 20 20 20 20  true..          
fe50: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
fe60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fe70: 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
fe80: 20 5b 61 70 70 65 6e 64 41 72 67 73 20 22 79 65   [appendArgs "ye
fe90: 73 20 28 22 20 24 70 6c 61 74 66 6f 72 6d 20 22  s (" $platform "
fea0: 29 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20 20  )\n"]..         
feb0: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
fec0: 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b          } else {
fed0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
fee0: 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
fef0: 20 6e 6f 5c 6e 0d 0a 20 20 20 20 20 20 20 20 20   no\n..         
ff00: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
ff10: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
ff20: 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20   }..        }.. 
ff30: 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
ff40: 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
ff50: 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
ff60: 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
ff70: 20 22 2d 2d 2d 2d 20 65 6e 76 69 72 6f 6e 6d 65   "---- environme
ff80: 6e 74 20 76 61 72 69 61 62 6c 65 20 5c 22 53 79  nt variable \"Sy
ff90: 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
ffa0: 5c 22 20 69 73 20 6e 6f 74 20 22 20 5c 0d 0a 20  \" is not " \.. 
ffb0: 20 20 20 20 20 20 20 20 20 20 20 22 73 65 74 2c             "set,
ffc0: 20 73 6b 69 70 70 69 6e 67 20 63 68 65 63 6b 20   skipping check 
ffd0: 66 6f 72 20 72 65 6c 65 61 73 65 73 2e 2e 2e 5c  for releases...\
ffe0: 6e 22 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a  n"]..      }....
fff0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 66 61 6c        return fal
10000 73 65 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20  se..    }.....  
10010 20 20 70 72 6f 63 20 63 68 65 63 6b 46 6f 72 53    proc checkForS
10020 51 4c 69 74 65 4c 69 62 72 61 72 79 20 7b 20 63  QLiteLibrary { c
10030 68 61 6e 6e 65 6c 20 7d 20 7b 0d 0a 20 20 20 20  hannel } {..    
10040 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
10050 20 22 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e 67 20   "---- checking 
10060 66 6f 72 20 53 51 4c 69 74 65 20 63 6f 72 65 20  for SQLite core 
10070 6c 69 62 72 61 72 79 2e 2e 2e 20 22 0d 0a 0d 0a  library... "....
10080 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68        if {[catch
10090 20 7b 0d 0a 20 20 20 20 20 20 20 20 6f 62 6a 65   {..        obje
100a0 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73  ct invoke -flags
100b0 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20   +NonPublic \.. 
100c0 20 20 20 20 20 20 20 20 20 20 20 53 79 73 74 65             Syste
100d0 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 53 51  m.Data.SQLite.SQ
100e0 4c 69 74 65 33 20 53 51 4c 69 74 65 56 65 72 73  Lite3 SQLiteVers
100f0 69 6f 6e 0d 0a 20 20 20 20 20 20 7d 20 76 65 72  ion..      } ver
10100 73 69 6f 6e 5d 20 3d 3d 20 30 7d 20 74 68 65 6e  sion] == 0} then
10110 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20   {..        #.. 
10120 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43         # NOTE: C
10130 68 65 63 6b 20 69 66 20 74 68 65 20 72 65 74 75  heck if the retu
10140 72 6e 65 64 20 76 65 72 73 69 6f 6e 20 77 61 73  rned version was
10150 20 6e 75 6c 6c 2e 20 20 49 66 20 73 6f 2c 20 6d   null.  If so, m
10160 61 6b 65 20 69 74 20 65 61 73 79 0d 0a 20 20 20  ake it easy..   
10170 20 20 20 20 20 23 20 20 20 20 20 20 20 74 6f 20       #       to 
10180 73 70 6f 74 2e 0d 0a 20 20 20 20 20 20 20 20 23  spot...        #
10190 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73  ..        if {[s
101a0 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 76 65  tring length $ve
101b0 72 73 69 6f 6e 5d 20 3d 3d 20 30 7d 20 74 68 65  rsion] == 0} the
101c0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73  n {..          s
101d0 65 74 20 76 65 72 73 69 6f 6e 20 6e 75 6c 6c 0d  et version null.
101e0 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  .        }....  
101f0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
10200 20 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74   # NOTE: Attempt
10210 20 74 6f 20 71 75 65 72 79 20 74 68 65 20 46 6f   to query the Fo
10220 73 73 69 6c 20 73 6f 75 72 63 65 20 69 64 65 6e  ssil source iden
10230 74 69 66 69 65 72 20 66 6f 72 20 74 68 65 20 53  tifier for the S
10240 51 4c 69 74 65 0d 0a 20 20 20 20 20 20 20 20 23  QLite..        #
10250 20 20 20 20 20 20 20 63 6f 72 65 20 6c 69 62 72         core libr
10260 61 72 79 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  ary...        #.
10270 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61  .        if {[ca
10280 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  tch {..         
10290 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d   object invoke -
102a0 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63  flags +NonPublic
102b0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
102c0 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51    System.Data.SQ
102d0 4c 69 74 65 2e 53 51 4c 69 74 65 33 20 53 51 4c  Lite.SQLite3 SQL
102e0 69 74 65 53 6f 75 72 63 65 49 64 0d 0a 20 20 20  iteSourceId..   
102f0 20 20 20 20 20 7d 20 73 6f 75 72 63 65 49 64 5d       } sourceId]
10300 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
10310 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
10320 20 23 20 4e 4f 54 45 3a 20 57 65 20 66 61 69 6c   # NOTE: We fail
10330 65 64 20 74 6f 20 71 75 65 72 79 20 74 68 65 20  ed to query the 
10340 46 6f 73 73 69 6c 20 73 6f 75 72 63 65 20 69 64  Fossil source id
10350 65 6e 74 69 66 69 65 72 2e 0d 0a 20 20 20 20 20  entifier...     
10360 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
10370 20 20 73 65 74 20 73 6f 75 72 63 65 49 64 20 75    set sourceId u
10380 6e 6b 6e 6f 77 6e 0d 0a 20 20 20 20 20 20 20 20  nknown..        
10390 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  }....        #..
103a0 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
103b0 43 68 65 63 6b 20 69 66 20 74 68 65 20 72 65 74  Check if the ret
103c0 75 72 6e 65 64 20 46 6f 73 73 69 6c 20 73 6f 75  urned Fossil sou
103d0 72 63 65 20 69 64 65 6e 74 69 66 69 65 72 20 77  rce identifier w
103e0 61 73 20 6e 75 6c 6c 2e 20 20 49 66 0d 0a 20 20  as null.  If..  
103f0 20 20 20 20 20 20 23 20 20 20 20 20 20 20 73 6f        #       so
10400 2c 20 6d 61 6b 65 20 69 74 20 65 61 73 79 20 74  , make it easy t
10410 6f 20 73 70 6f 74 2e 0d 0a 20 20 20 20 20 20 20  o spot...       
10420 20 23 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b   #..        if {
10430 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
10440 73 6f 75 72 63 65 49 64 5d 20 3d 3d 20 30 7d 20  sourceId] == 0} 
10450 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
10460 20 20 73 65 74 20 73 6f 75 72 63 65 49 64 20 6e    set sourceId n
10470 75 6c 6c 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  ull..        }..
10480 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
10490 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 59 65 73       # NOTE: Yes
104a0 2c 20 74 68 65 20 53 51 4c 69 74 65 20 63 6f 72  , the SQLite cor
104b0 65 20 6c 69 62 72 61 72 79 20 61 70 70 65 61 72  e library appear
104c0 73 20 74 6f 20 62 65 20 61 76 61 69 6c 61 62 6c  s to be availabl
104d0 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  e...        #.. 
104e0 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72         addConstr
104f0 61 69 6e 74 20 53 51 4c 69 74 65 0d 0a 0d 0a 20  aint SQLite.... 
10500 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
10510 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
10520 73 20 22 79 65 73 20 28 22 20 24 76 65 72 73 69  s "yes (" $versi
10530 6f 6e 20 22 20 22 20 24 73 6f 75 72 63 65 49 64  on " " $sourceId
10540 20 22 29 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 7d   ")\n"]..      }
10550 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
10560 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
10570 6e 6f 5c 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a 20  no\n..      }.. 
10580 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
10590 63 20 63 68 65 63 6b 46 6f 72 53 51 4c 69 74 65  c checkForSQLite
105a0 49 6e 74 65 72 6f 70 20 7b 20 63 68 61 6e 6e 65  Interop { channe
105b0 6c 20 7d 20 7b 0d 0a 20 20 20 20 20 20 74 70 75  l } {..      tpu
105c0 74 73 20 24 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d  ts $channel "---
105d0 2d 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 53  - checking for S
105e0 51 4c 69 74 65 20 69 6e 74 65 72 6f 70 20 61 73  QLite interop as
105f0 73 65 6d 62 6c 79 2e 2e 2e 20 22 0d 0a 0d 0a 20  sembly... ".... 
10600 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20       if {[catch 
10610 7b 0d 0a 20 20 20 20 20 20 20 20 6f 62 6a 65 63  {..        objec
10620 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20  t invoke -flags 
10630 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20  +NonPublic \..  
10640 20 20 20 20 20 20 20 20 20 20 53 79 73 74 65 6d            System
10650 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 53 51 4c  .Data.SQLite.SQL
10660 69 74 65 33 20 49 6e 74 65 72 6f 70 56 65 72 73  ite3 InteropVers
10670 69 6f 6e 0d 0a 20 20 20 20 20 20 7d 20 76 65 72  ion..      } ver
10680 73 69 6f 6e 5d 20 3d 3d 20 30 7d 20 74 68 65 6e  sion] == 0} then
10690 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20   {..        #.. 
106a0 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43         # NOTE: C
106b0 68 65 63 6b 20 69 66 20 74 68 65 20 72 65 74 75  heck if the retu
106c0 72 6e 65 64 20 76 65 72 73 69 6f 6e 20 77 61 73  rned version was
106d0 20 6e 75 6c 6c 2e 20 20 49 66 20 73 6f 2c 20 6d   null.  If so, m
106e0 61 6b 65 20 69 74 20 65 61 73 79 0d 0a 20 20 20  ake it easy..   
106f0 20 20 20 20 20 23 20 20 20 20 20 20 20 74 6f 20       #       to 
10700 73 70 6f 74 2e 0d 0a 20 20 20 20 20 20 20 20 23  spot...        #
10710 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73  ..        if {[s
10720 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 76 65  tring length $ve
10730 72 73 69 6f 6e 5d 20 3d 3d 20 30 7d 20 74 68 65  rsion] == 0} the
10740 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73  n {..          s
10750 65 74 20 76 65 72 73 69 6f 6e 20 6e 75 6c 6c 0d  et version null.
10760 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  .        }....  
10770 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
10780 20 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74   # NOTE: Attempt
10790 20 74 6f 20 71 75 65 72 79 20 74 68 65 20 46 6f   to query the Fo
107a0 73 73 69 6c 20 73 6f 75 72 63 65 20 69 64 65 6e  ssil source iden
107b0 74 69 66 69 65 72 20 66 6f 72 20 74 68 65 20 53  tifier for the S
107c0 51 4c 69 74 65 0d 0a 20 20 20 20 20 20 20 20 23  QLite..        #
107d0 20 20 20 20 20 20 20 63 6f 72 65 20 6c 69 62 72         core libr
107e0 61 72 79 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  ary...        #.
107f0 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61  .        if {[ca
10800 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  tch {..         
10810 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d   object invoke -
10820 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63  flags +NonPublic
10830 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
10840 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51    System.Data.SQ
10850 4c 69 74 65 2e 53 51 4c 69 74 65 33 20 49 6e 74  Lite.SQLite3 Int
10860 65 72 6f 70 53 6f 75 72 63 65 49 64 0d 0a 20 20  eropSourceId..  
10870 20 20 20 20 20 20 7d 20 73 6f 75 72 63 65 49 64        } sourceId
10880 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
10890 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
108a0 20 20 23 20 4e 4f 54 45 3a 20 57 65 20 66 61 69    # NOTE: We fai
108b0 6c 65 64 20 74 6f 20 71 75 65 72 79 20 74 68 65  led to query the
108c0 20 46 6f 73 73 69 6c 20 73 6f 75 72 63 65 20 69   Fossil source i
108d0 64 65 6e 74 69 66 69 65 72 2e 0d 0a 20 20 20 20  dentifier...    
108e0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
108f0 20 20 20 73 65 74 20 73 6f 75 72 63 65 49 64 20     set sourceId 
10900 75 6e 6b 6e 6f 77 6e 0d 0a 20 20 20 20 20 20 20  unknown..       
10910 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d   }....        #.
10920 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
10930 20 43 68 65 63 6b 20 69 66 20 74 68 65 20 72 65   Check if the re
10940 74 75 72 6e 65 64 20 46 6f 73 73 69 6c 20 73 6f  turned Fossil so
10950 75 72 63 65 20 69 64 65 6e 74 69 66 69 65 72 20  urce identifier 
10960 77 61 73 20 6e 75 6c 6c 2e 20 20 49 66 0d 0a 20  was null.  If.. 
10970 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 73         #       s
10980 6f 2c 20 6d 61 6b 65 20 69 74 20 65 61 73 79 20  o, make it easy 
10990 74 6f 20 73 70 6f 74 2e 0d 0a 20 20 20 20 20 20  to spot...      
109a0 20 20 23 0d 0a 20 20 20 20 20 20 20 20 69 66 20    #..        if 
109b0 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20  {[string length 
109c0 24 73 6f 75 72 63 65 49 64 5d 20 3d 3d 20 30 7d  $sourceId] == 0}
109d0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
109e0 20 20 20 73 65 74 20 73 6f 75 72 63 65 49 64 20     set sourceId 
109f0 6e 75 6c 6c 0d 0a 20 20 20 20 20 20 20 20 7d 0d  null..        }.
10a00 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
10a10 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 42 65        # NOTE: Be
10a20 66 6f 72 65 20 61 63 74 75 61 6c 6c 79 20 61 64  fore actually ad
10a30 64 69 6e 67 20 74 68 65 20 74 65 73 74 20 63 6f  ding the test co
10a40 6e 73 74 72 61 69 6e 74 2c 20 6d 61 6b 65 20 73  nstraint, make s
10a50 75 72 65 20 74 68 65 0d 0a 20 20 20 20 20 20 20  ure the..       
10a60 20 23 20 20 20 20 20 20 20 76 65 72 73 69 6f 6e   #       version
10a70 20 69 73 20 76 61 6c 69 64 20 28 69 2e 65 2e 20   is valid (i.e. 
10a80 6e 6f 74 20 6a 75 73 74 20 74 68 61 74 20 77 65  not just that we
10a90 20 63 6f 75 6c 64 20 71 75 65 72 79 20 69 74 29   could query it)
10aa0 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
10ab0 20 20 20 20 20 20 69 66 20 7b 24 76 65 72 73 69        if {$versi
10ac0 6f 6e 20 6e 65 20 22 6e 75 6c 6c 22 7d 20 74 68  on ne "null"} th
10ad0 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
10ae0 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e  #..          # N
10af0 4f 54 45 3a 20 59 65 73 2c 20 74 68 65 20 53 51  OTE: Yes, the SQ
10b00 4c 69 74 65 20 69 6e 74 65 72 6f 70 20 61 73 73  Lite interop ass
10b10 65 6d 62 6c 79 20 61 70 70 65 61 72 73 20 74 6f  embly appears to
10b20 20 62 65 20 61 76 61 69 6c 61 62 6c 65 2e 0d 0a   be available...
10b30 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
10b40 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72         addConstr
10b50 61 69 6e 74 20 53 51 4c 69 74 65 49 6e 74 65 72  aint SQLiteInter
10b60 6f 70 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  op....          
10b70 73 65 74 20 61 6e 73 77 65 72 20 79 65 73 0d 0a  set answer yes..
10b80 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b          } else {
10b90 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20  ..          set 
10ba0 61 6e 73 77 65 72 20 6e 6f 0d 0a 20 20 20 20 20  answer no..     
10bb0 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
10bc0 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b  tputs $channel [
10bd0 61 70 70 65 6e 64 41 72 67 73 20 24 61 6e 73 77  appendArgs $answ
10be0 65 72 20 22 20 28 22 20 24 76 65 72 73 69 6f 6e  er " (" $version
10bf0 20 22 20 22 20 24 73 6f 75 72 63 65 49 64 20 22   " " $sourceId "
10c00 29 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 7d 20 65  )\n"]..      } e
10c10 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 74  lse {..        t
10c20 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 6e 6f  puts $channel no
10c30 5c 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20  \n..      }..   
10c40 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
10c50 63 68 65 63 6b 46 6f 72 53 51 4c 69 74 65 44 65  checkForSQLiteDe
10c60 66 69 6e 65 43 6f 6e 73 74 61 6e 74 20 7b 20 63  fineConstant { c
10c70 68 61 6e 6e 65 6c 20 6e 61 6d 65 20 7d 20 7b 0d  hannel name } {.
10c80 0a 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68  .      tputs $ch
10c90 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
10ca0 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 22  s \..          "
10cb0 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e 67 20 66 6f  ---- checking fo
10cc0 72 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51  r System.Data.SQ
10cd0 4c 69 74 65 20 64 65 66 69 6e 65 20 63 6f 6e 73  Lite define cons
10ce0 74 61 6e 74 20 5c 22 22 20 24 6e 61 6d 65 20 5c  tant \"" $name \
10cf0 0d 0a 20 20 20 20 20 20 20 20 20 20 22 5c 22 2e  ..          "\".
10d00 2e 2e 20 22 5d 0d 0a 0d 0a 20 20 20 20 20 20 69  .. "]....      i
10d10 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20  f {[catch {..   
10d20 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f       object invo
10d30 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75  ke -flags +NonPu
10d40 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20 20 20  blic \..        
10d50 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e      System.Data.
10d60 53 51 4c 69 74 65 2e 53 51 4c 69 74 65 33 20 44  SQLite.SQLite3 D
10d70 65 66 69 6e 65 43 6f 6e 73 74 61 6e 74 73 0d 0a  efineConstants..
10d80 20 20 20 20 20 20 7d 20 64 65 66 69 6e 65 43 6f        } defineCo
10d90 6e 73 74 61 6e 74 73 5d 20 3d 3d 20 30 7d 20 74  nstants] == 0} t
10da0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 69  hen {..        i
10db0 66 20 7b 5b 6c 73 65 61 72 63 68 20 2d 65 78 61  f {[lsearch -exa
10dc0 63 74 20 2d 6e 6f 63 61 73 65 20 24 64 65 66 69  ct -nocase $defi
10dd0 6e 65 43 6f 6e 73 74 61 6e 74 73 20 24 6e 61 6d  neConstants $nam
10de0 65 5d 20 21 3d 20 2d 31 7d 20 74 68 65 6e 20 7b  e] != -1} then {
10df0 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20  ..          #.. 
10e00 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a           # NOTE:
10e10 20 59 65 73 2c 20 74 68 69 73 20 64 65 66 69 6e   Yes, this defin
10e20 65 20 63 6f 6e 73 74 61 6e 74 20 77 61 73 20 65  e constant was e
10e30 6e 61 62 6c 65 64 20 77 68 65 6e 20 74 68 65 20  nabled when the 
10e40 6d 61 6e 61 67 65 64 0d 0a 20 20 20 20 20 20 20  managed..       
10e50 20 20 20 23 20 20 20 20 20 20 20 61 73 73 65 6d     #       assem
10e60 62 6c 79 20 77 61 73 20 63 6f 6d 70 69 6c 65 64  bly was compiled
10e70 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a  ...          #..
10e80 20 20 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e            addCon
10e90 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41  straint [appendA
10ea0 72 67 73 20 5b 67 65 74 53 51 4c 69 74 65 44 65  rgs [getSQLiteDe
10eb0 66 69 6e 65 43 6f 6e 73 74 61 6e 74 50 72 65 66  fineConstantPref
10ec0 69 78 5d 20 24 6e 61 6d 65 5d 0d 0a 0d 0a 20 20  ix] $name]....  
10ed0 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
10ee0 68 61 6e 6e 65 6c 20 79 65 73 5c 6e 0d 0a 20 20  hannel yes\n..  
10ef0 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
10f00 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
10f10 24 63 68 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d 0a 20  $channel no\n.. 
10f20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
10f30 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
10f40 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
10f50 20 65 72 72 6f 72 5c 6e 0d 0a 20 20 20 20 20 20   error\n..      
10f60 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  }..    }.....   
10f70 20 70 72 6f 63 20 67 65 74 44 61 74 65 54 69 6d   proc getDateTim
10f80 65 46 6f 72 6d 61 74 20 7b 20 7b 74 69 6d 65 5a  eFormat { {timeZ
10f90 6f 6e 65 20 74 72 75 65 7d 20 7d 20 7b 0d 0a 20  one true} } {.. 
10fa0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
10fb0 4e 4f 54 45 3a 20 54 68 69 73 20 70 72 6f 63 65  NOTE: This proce
10fc0 64 75 72 65 20 73 69 6d 70 6c 79 20 72 65 74 75  dure simply retu
10fd0 72 6e 73 20 74 68 65 20 22 64 65 66 61 75 6c 74  rns the "default
10fe0 22 20 44 61 74 65 54 69 6d 65 20 66 6f 72 6d 61  " DateTime forma
10ff0 74 20 75 73 65 64 0d 0a 20 20 20 20 20 20 23 20  t used..      # 
11000 20 20 20 20 20 20 62 79 20 74 68 65 20 74 65 73        by the tes
11010 74 20 73 75 69 74 65 2e 0d 0a 20 20 20 20 20 20  t suite...      
11020 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 6e  #..      if {[in
11030 66 6f 20 65 78 69 73 74 73 20 3a 3a 64 61 74 65  fo exists ::date
11040 74 69 6d 65 5f 66 6f 72 6d 61 74 5d 20 26 26 20  time_format] && 
11050 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 73 74  \..          [st
11060 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a 64  ring length $::d
11070 61 74 65 74 69 6d 65 5f 66 6f 72 6d 61 74 5d 20  atetime_format] 
11080 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  > 0} then {..   
11090 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
110a0 23 20 4e 4f 54 45 3a 20 52 65 74 75 72 6e 20 74  # NOTE: Return t
110b0 68 65 20 6d 61 6e 75 61 6c 6c 79 20 6f 76 65 72  he manually over
110c0 72 69 64 64 65 6e 20 76 61 6c 75 65 20 66 6f 72  ridden value for
110d0 20 74 68 65 20 44 61 74 65 54 69 6d 65 20 66 6f   the DateTime fo
110e0 72 6d 61 74 2e 0d 0a 20 20 20 20 20 20 20 20 23  rmat...        #
110f0 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ..        return
11100 20 24 3a 3a 64 61 74 65 74 69 6d 65 5f 66 6f 72   $::datetime_for
11110 6d 61 74 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73  mat..      } els
11120 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  e {..        #..
11130 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
11140 52 65 74 75 72 6e 20 61 6e 20 49 53 4f 38 36 30  Return an ISO860
11150 31 20 44 61 74 65 54 69 6d 65 20 66 6f 72 6d 61  1 DateTime forma
11160 74 20 63 6f 6d 70 61 74 69 62 6c 65 20 77 69 74  t compatible wit
11170 68 20 53 51 4c 69 74 65 2c 0d 0a 20 20 20 20 20  h SQLite,..     
11180 20 20 20 23 20 20 20 20 20 20 20 53 79 73 74 65     #       Syste
11190 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2c 20 61  m.Data.SQLite, a
111a0 6e 64 20 73 75 69 74 61 62 6c 65 20 66 6f 72 20  nd suitable for 
111b0 72 6f 75 6e 64 2d 74 72 69 70 70 69 6e 67 20 77  round-tripping w
111c0 69 74 68 20 74 68 65 0d 0a 20 20 20 20 20 20 20  ith the..       
111d0 20 23 20 20 20 20 20 20 20 44 61 74 65 54 69 6d   #       DateTim
111e0 65 20 63 6c 61 73 73 20 6f 66 20 74 68 65 20 66  e class of the f
111f0 72 61 6d 65 77 6f 72 6b 2e 20 20 49 66 20 74 68  ramework.  If th
11200 69 73 20 76 61 6c 75 65 20 69 73 20 63 68 61 6e  is value is chan
11210 67 65 64 2c 0d 0a 20 20 20 20 20 20 20 20 23 20  ged,..        # 
11220 20 20 20 20 20 20 76 61 72 69 6f 75 73 20 74 65        various te
11230 73 74 73 20 6d 61 79 20 66 61 69 6c 2e 0d 0a 20  sts may fail... 
11240 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
11250 20 20 72 65 74 75 72 6e 20 5b 61 70 70 65 6e 64    return [append
11260 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
11270 20 20 20 20 22 79 79 79 79 2d 4d 4d 2d 64 64 20      "yyyy-MM-dd 
11280 48 48 3a 6d 6d 3a 73 73 2e 46 46 46 46 46 46 46  HH:mm:ss.FFFFFFF
11290 22 20 5b 65 78 70 72 20 7b 24 74 69 6d 65 5a 6f  " [expr {$timeZo
112a0 6e 65 20 3f 20 22 4b 22 20 3a 20 22 22 7d 5d 5d  ne ? "K" : ""}]]
112b0 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d  ..      }..    }
112c0 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65  .....    proc ge
112d0 74 44 61 74 65 54 69 6d 65 54 69 63 6b 73 20 7b  tDateTimeTicks {
112e0 20 76 61 6c 75 65 20 7b 6c 6f 63 61 6c 20 22 22   value {local ""
112f0 7d 20 7b 64 65 66 61 75 6c 74 20 22 22 7d 20 7d  } {default ""} }
11300 20 7b 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 73   {..      if {[s
11310 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 76 61  tring length $va
11320 6c 75 65 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20  lue] == 0} then 
11330 7b 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  {..        retur
11340 6e 20 24 64 65 66 61 75 6c 74 0d 0a 20 20 20 20  n $default..    
11350 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20    }....      if 
11360 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20  {[catch {..     
11370 20 20 20 73 65 74 20 64 61 74 65 54 69 6d 65 20     set dateTime 
11380 5b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d  [object invoke -
11390 63 72 65 61 74 65 20 5c 0d 0a 20 20 20 20 20 20  create \..      
113a0 20 20 20 20 20 20 2d 70 61 72 61 6d 65 74 65 72        -parameter
113b0 74 79 70 65 73 20 5b 6c 69 73 74 20 53 74 72 69  types [list Stri
113c0 6e 67 20 53 74 72 69 6e 67 20 49 46 6f 72 6d 61  ng String IForma
113d0 74 50 72 6f 76 69 64 65 72 20 5c 0d 0a 20 20 20  tProvider \..   
113e0 20 20 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e           System.
113f0 47 6c 6f 62 61 6c 69 7a 61 74 69 6f 6e 2e 44 61  Globalization.Da
11400 74 65 54 69 6d 65 53 74 79 6c 65 73 5d 20 44 61  teTimeStyles] Da
11410 74 65 54 69 6d 65 20 50 61 72 73 65 45 78 61 63  teTime ParseExac
11420 74 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  t \..           
11430 20 24 76 61 6c 75 65 20 5b 67 65 74 44 61 74 65   $value [getDate
11440 54 69 6d 65 46 6f 72 6d 61 74 5d 20 6e 75 6c 6c  TimeFormat] null
11450 20 41 64 6a 75 73 74 54 6f 55 6e 69 76 65 72 73   AdjustToUnivers
11460 61 6c 5d 0d 0a 20 20 20 20 20 20 7d 5d 7d 20 74  al]..      }]} t
11470 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 72  hen {..        r
11480 65 74 75 72 6e 20 24 64 65 66 61 75 6c 74 0d 0a  eturn $default..
11490 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
114a0 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 69 73 20   if {[string is 
114b0 62 6f 6f 6c 65 61 6e 20 2d 73 74 72 69 63 74 20  boolean -strict 
114c0 24 6c 6f 63 61 6c 5d 7d 20 74 68 65 6e 20 7b 0d  $local]} then {.
114d0 0a 20 20 20 20 20 20 20 20 73 65 74 20 64 61 74  .        set dat
114e0 65 54 69 6d 65 20 5b 6f 62 6a 65 63 74 20 69 6e  eTime [object in
114f0 76 6f 6b 65 20 2d 63 72 65 61 74 65 20 44 61 74  voke -create Dat
11500 65 54 69 6d 65 20 53 70 65 63 69 66 79 4b 69 6e  eTime SpecifyKin
11510 64 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  d \..           
11520 20 24 64 61 74 65 54 69 6d 65 20 55 74 63 5d 0d   $dateTime Utc].
11530 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d  .      } else {.
11540 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
11550 5b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 24  [object invoke $
11560 64 61 74 65 54 69 6d 65 20 54 69 63 6b 73 5d 0d  dateTime Ticks].
11570 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
11580 20 20 69 66 20 7b 24 6c 6f 63 61 6c 7d 20 74 68    if {$local} th
11590 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 72 65  en {..        re
115a0 74 75 72 6e 20 5b 6f 62 6a 65 63 74 20 69 6e 76  turn [object inv
115b0 6f 6b 65 20 24 64 61 74 65 54 69 6d 65 20 54 6f  oke $dateTime To
115c0 4c 6f 63 61 6c 54 69 6d 65 2e 54 69 63 6b 73 5d  LocalTime.Ticks]
115d0 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b  ..      } else {
115e0 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ..        return
115f0 20 5b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20   [object invoke 
11600 24 64 61 74 65 54 69 6d 65 20 54 6f 55 6e 69 76  $dateTime ToUniv
11610 65 72 73 61 6c 54 69 6d 65 2e 54 69 63 6b 73 5d  ersalTime.Ticks]
11620 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d  ..      }..    }
11630 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65  .....    proc ge
11640 74 50 72 6f 70 65 72 74 69 65 73 20 7b 20 6f 62  tProperties { ob
11650 6a 65 63 74 20 76 61 72 4e 61 6d 65 20 7d 20 7b  ject varName } {
11660 0d 0a 20 20 20 20 20 20 75 70 76 61 72 20 31 20  ..      upvar 1 
11670 24 76 61 72 4e 61 6d 65 20 70 72 6f 70 65 72 74  $varName propert
11680 69 65 73 0d 0a 0d 0a 20 20 20 20 20 20 73 65 74  ies....      set
11690 20 63 6f 75 6e 74 20 30 0d 0a 20 20 20 20 20 20   count 0..      
116a0 73 65 74 20 6e 61 6d 65 73 20 5b 6c 69 73 74 5d  set names [list]
116b0 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69  ....      if {[i
116c0 73 4f 62 6a 65 63 74 48 61 6e 64 6c 65 20 24 6f  sObjectHandle $o
116d0 62 6a 65 63 74 5d 20 26 26 20 24 6f 62 6a 65 63  bject] && $objec
116e0 74 20 6e 65 20 22 6e 75 6c 6c 22 7d 20 74 68 65  t ne "null"} the
116f0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 65 76 61  n {..        eva
11700 6c 20 6c 61 70 70 65 6e 64 20 6e 61 6d 65 73 20  l lappend names 
11710 5b 6f 62 6a 65 63 74 20 6d 65 6d 62 65 72 73 20  [object members 
11720 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 2d  \..            -
11730 6d 65 6d 62 65 72 74 79 70 65 73 20 50 72 6f 70  membertypes Prop
11740 65 72 74 79 20 2d 6e 61 6d 65 6f 6e 6c 79 20 24  erty -nameonly $
11750 6f 62 6a 65 63 74 5d 0d 0a 0d 0a 20 20 20 20 20  object]....     
11760 20 20 20 65 76 61 6c 20 6c 61 70 70 65 6e 64 20     eval lappend 
11770 6e 61 6d 65 73 20 5b 6f 62 6a 65 63 74 20 6d 65  names [object me
11780 6d 62 65 72 73 20 5c 0d 0a 20 20 20 20 20 20 20  mbers \..       
11790 20 20 20 20 20 2d 6d 65 6d 62 65 72 74 79 70 65       -membertype
117a0 73 20 46 69 65 6c 64 20 2d 6e 61 6d 65 6f 6e 6c  s Field -nameonl
117b0 79 20 24 6f 62 6a 65 63 74 5d 0d 0a 20 20 20 20  y $object]..    
117c0 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 66 6f 72    }....      for
117d0 65 61 63 68 20 6e 61 6d 65 20 24 6e 61 6d 65 73  each name $names
117e0 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b   {..        if {
117f0 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20  [catch {..      
11800 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b      object invok
11810 65 20 2d 6f 62 6a 65 63 74 66 6c 61 67 73 20 2b  e -objectflags +
11820 4e 6f 44 69 73 70 6f 73 65 20 24 6f 62 6a 65 63  NoDispose $objec
11830 74 20 24 6e 61 6d 65 0d 0a 20 20 20 20 20 20 20  t $name..       
11840 20 7d 20 76 61 6c 75 65 5d 20 3d 3d 20 30 7d 20   } value] == 0} 
11850 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
11860 20 20 69 66 20 7b 5b 69 73 4f 62 6a 65 63 74 48    if {[isObjectH
11870 61 6e 64 6c 65 20 24 76 61 6c 75 65 5d 20 26 26  andle $value] &&
11880 20 24 76 61 6c 75 65 20 6e 65 20 22 6e 75 6c 6c   $value ne "null
11890 22 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  "} then {..     
118a0 20 20 20 20 20 20 20 73 65 74 20 65 72 72 6f 72         set error
118b0 20 6e 75 6c 6c 3b 20 6f 62 6a 65 63 74 20 69 6e   null; object in
118c0 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e  voke -flags +Non
118d0 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20  Public \..      
118e0 20 20 20 20 20 20 20 20 20 20 2d 6d 61 72 73 68            -marsh
118f0 61 6c 66 6c 61 67 73 20 2b 4e 6f 48 61 6e 64 6c  alflags +NoHandl
11900 65 20 49 6e 74 65 72 70 72 65 74 65 72 2e 47 65  e Interpreter.Ge
11910 74 41 63 74 69 76 65 20 5c 0d 0a 20 20 20 20 20  tActive \..     
11920 20 20 20 20 20 20 20 20 20 20 20 41 64 64 4f 62             AddOb
11930 6a 65 63 74 52 65 66 65 72 65 6e 63 65 20 4f 6b  jectReference Ok
11940 20 24 76 61 6c 75 65 20 65 72 72 6f 72 0d 0a 0d   $value error...
11950 0a 20 20 20 20 20 20 20 20 20 20 20 20 6c 61 70  .            lap
11960 70 65 6e 64 20 70 72 6f 70 65 72 74 69 65 73 28  pend properties(
11970 6f 62 6a 65 63 74 73 29 20 5b 6c 69 73 74 20 24  objects) [list $
11980 6e 61 6d 65 20 24 76 61 6c 75 65 5d 0d 0a 20 20  name $value]..  
11990 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b          } else {
119a0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 6c 61  ..            la
119b0 70 70 65 6e 64 20 70 72 6f 70 65 72 74 69 65 73  ppend properties
119c0 28 76 61 6c 75 65 73 29 20 5b 6c 69 73 74 20 24  (values) [list $
119d0 6e 61 6d 65 20 24 76 61 6c 75 65 5d 0d 0a 20 20  name $value]..  
119e0 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
119f0 20 20 20 20 20 20 20 69 6e 63 72 20 63 6f 75 6e         incr coun
11a00 74 0d 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73  t..        } els
11a10 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 6c  e {..          l
11a20 61 70 70 65 6e 64 20 70 72 6f 70 65 72 74 69 65  append propertie
11a30 73 28 65 72 72 6f 72 73 29 20 5b 6c 69 73 74 20  s(errors) [list 
11a40 24 6e 61 6d 65 20 24 3a 3a 65 72 72 6f 72 43 6f  $name $::errorCo
11a50 64 65 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  de]..        }..
11a60 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
11a70 20 72 65 74 75 72 6e 20 24 63 6f 75 6e 74 0d 0a   return $count..
11a80 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
11a90 6f 63 20 67 65 74 41 6c 6c 50 72 6f 70 65 72 74  oc getAllPropert
11aa0 69 65 73 20 7b 20 6f 62 6a 65 63 74 20 76 61 72  ies { object var
11ab0 4e 61 6d 65 20 7d 20 7b 0d 0a 20 20 20 20 20 20  Name } {..      
11ac0 75 70 76 61 72 20 31 20 24 76 61 72 4e 61 6d 65  upvar 1 $varName
11ad0 20 70 72 6f 70 65 72 74 69 65 73 0d 0a 20 20 20   properties..   
11ae0 20 20 20 73 65 74 20 76 61 6c 75 65 20 24 6f 62     set value $ob
11af0 6a 65 63 74 0d 0a 0d 0a 20 20 20 20 20 20 77 68  ject....      wh
11b00 69 6c 65 20 7b 74 72 75 65 7d 20 7b 0d 0a 20 20  ile {true} {..  
11b10 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f        if {![info
11b20 20 65 78 69 73 74 73 20 70 72 6f 70 65 72 74 69   exists properti
11b30 65 73 28 73 65 65 6e 4f 62 6a 65 63 74 73 29 5d  es(seenObjects)]
11b40 20 7c 7c 20 5c 0d 0a 20 20 20 20 20 20 20 20 20   || \..         
11b50 20 20 20 24 76 61 6c 75 65 20 6e 69 20 24 70 72     $value ni $pr
11b60 6f 70 65 72 74 69 65 73 28 73 65 65 6e 4f 62 6a  operties(seenObj
11b70 65 63 74 73 29 7d 20 74 68 65 6e 20 7b 0d 0a 20  ects)} then {.. 
11b80 20 20 20 20 20 20 20 20 20 67 65 74 50 72 6f 70           getProp
11b90 65 72 74 69 65 73 20 24 76 61 6c 75 65 20 70 72  erties $value pr
11ba0 6f 70 65 72 74 69 65 73 0d 0a 20 20 20 20 20 20  operties..      
11bb0 20 20 20 20 6c 61 70 70 65 6e 64 20 70 72 6f 70      lappend prop
11bc0 65 72 74 69 65 73 28 73 65 65 6e 4f 62 6a 65 63  erties(seenObjec
11bd0 74 73 29 20 24 76 61 6c 75 65 0d 0a 20 20 20 20  ts) $value..    
11be0 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
11bf0 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73   if {![info exis
11c00 74 73 20 70 72 6f 70 65 72 74 69 65 73 28 6f 62  ts properties(ob
11c10 6a 65 63 74 73 29 5d 7d 20 74 68 65 6e 20 7b 0d  jects)]} then {.
11c20 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
11c30 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  ..        }.... 
11c40 20 20 20 20 20 20 20 69 66 20 7b 5b 6c 6c 65 6e         if {[llen
11c50 67 74 68 20 24 70 72 6f 70 65 72 74 69 65 73 28  gth $properties(
11c60 6f 62 6a 65 63 74 73 29 5d 20 3d 3d 20 30 7d 20  objects)] == 0} 
11c70 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
11c80 20 20 75 6e 73 65 74 20 70 72 6f 70 65 72 74 69    unset properti
11c90 65 73 28 6f 62 6a 65 63 74 73 29 3b 20 62 72 65  es(objects); bre
11ca0 61 6b 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d  ak..        }...
11cb0 0a 20 20 20 20 20 20 20 20 73 65 74 20 76 61 6c  .        set val
11cc0 75 65 20 5b 6c 69 6e 64 65 78 20 5b 6c 69 6e 64  ue [lindex [lind
11cd0 65 78 20 24 70 72 6f 70 65 72 74 69 65 73 28 6f  ex $properties(o
11ce0 62 6a 65 63 74 73 29 20 30 5d 20 65 6e 64 5d 0d  bjects) 0] end].
11cf0 0a 20 20 20 20 20 20 20 20 73 65 74 20 70 72 6f  .        set pro
11d00 70 65 72 74 69 65 73 28 6f 62 6a 65 63 74 73 29  perties(objects)
11d10 20 5b 6c 72 61 6e 67 65 20 24 70 72 6f 70 65 72   [lrange $proper
11d20 74 69 65 73 28 6f 62 6a 65 63 74 73 29 20 31 20  ties(objects) 1 
11d30 65 6e 64 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d  end]..      }...
11d40 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f  .      if {[info
11d50 20 65 78 69 73 74 73 20 70 72 6f 70 65 72 74 69   exists properti
11d60 65 73 28 73 65 65 6e 4f 62 6a 65 63 74 73 29 5d  es(seenObjects)]
11d70 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
11d80 20 20 66 6f 72 65 61 63 68 20 76 61 6c 75 65 20    foreach value 
11d90 24 70 72 6f 70 65 72 74 69 65 73 28 73 65 65 6e  $properties(seen
11da0 4f 62 6a 65 63 74 73 29 20 7b 0d 0a 20 20 20 20  Objects) {..    
11db0 20 20 20 20 20 20 69 66 20 7b 24 76 61 6c 75 65        if {$value
11dc0 20 65 71 20 24 6f 62 6a 65 63 74 7d 20 63 6f 6e   eq $object} con
11dd0 74 69 6e 75 65 0d 0a 20 20 20 20 20 20 20 20 20  tinue..         
11de0 20 63 61 74 63 68 20 7b 6f 62 6a 65 63 74 20 64   catch {object d
11df0 69 73 70 6f 73 65 20 24 76 61 6c 75 65 7d 0d 0a  ispose $value}..
11e00 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
11e10 20 20 20 20 20 75 6e 73 65 74 20 70 72 6f 70 65       unset prope
11e20 72 74 69 65 73 28 73 65 65 6e 4f 62 6a 65 63 74  rties(seenObject
11e30 73 29 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20  s)..      }..   
11e40 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
11e50 67 65 74 56 61 72 69 61 62 6c 65 73 20 7b 20 76  getVariables { v
11e60 61 72 4e 61 6d 65 73 20 7b 6f 62 6a 65 63 74 73  arNames {objects
11e70 20 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a 20 20 20   false} } {..   
11e80 20 20 20 73 65 74 20 72 65 73 75 6c 74 20 5b 6c     set result [l
11e90 69 73 74 5d 0d 0a 0d 0a 20 20 20 20 20 20 66 6f  ist]....      fo
11ea0 72 65 61 63 68 20 76 61 72 4e 61 6d 65 20 24 76  reach varName $v
11eb0 61 72 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20  arNames {..     
11ec0 20 20 20 69 66 20 7b 5b 75 70 6c 65 76 65 6c 20     if {[uplevel 
11ed0 31 20 5b 6c 69 73 74 20 61 72 72 61 79 20 65 78  1 [list array ex
11ee0 69 73 74 73 20 24 76 61 72 4e 61 6d 65 5d 5d 7d  ists $varName]]}
11ef0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
11f00 20 20 20 73 65 74 20 61 72 72 61 79 4e 61 6d 65     set arrayName
11f10 20 24 76 61 72 4e 61 6d 65 0d 0a 0d 0a 20 20 20   $varName....   
11f20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 65         foreach e
11f30 6c 65 6d 65 6e 74 4e 61 6d 65 20 5b 75 70 6c 65  lementName [uple
11f40 76 65 6c 20 31 20 5b 6c 69 73 74 20 61 72 72 61  vel 1 [list arra
11f50 79 20 6e 61 6d 65 73 20 24 61 72 72 61 79 4e 61  y names $arrayNa
11f60 6d 65 5d 5d 20 7b 0d 0a 20 20 20 20 20 20 20 20  me]] {..        
11f70 20 20 20 20 73 65 74 20 6e 61 6d 65 20 5b 61 70      set name [ap
11f80 70 65 6e 64 41 72 67 73 20 24 61 72 72 61 79 4e  pendArgs $arrayN
11f90 61 6d 65 20 28 20 24 65 6c 65 6d 65 6e 74 4e 61  ame ( $elementNa
11fa0 6d 65 20 29 5d 0d 0a 20 20 20 20 20 20 20 20 20  me )]..         
11fb0 20 20 20 73 65 74 20 76 61 72 56 61 6c 75 65 20     set varValue 
11fc0 5b 75 70 6c 65 76 65 6c 20 31 20 5b 6c 69 73 74  [uplevel 1 [list
11fd0 20 73 65 74 20 24 6e 61 6d 65 5d 5d 0d 0a 0d 0a   set $name]]....
11fe0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b              if {
11ff0 24 6f 62 6a 65 63 74 73 20 26 26 20 5b 69 73 4f  $objects && [isO
12000 62 6a 65 63 74 48 61 6e 64 6c 65 20 24 76 61 72  bjectHandle $var
12010 56 61 6c 75 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a  Value]} then {..
12020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 75 6e                un
12030 73 65 74 20 2d 6e 6f 63 6f 6d 70 6c 61 69 6e 20  set -nocomplain 
12040 70 72 6f 70 65 72 74 69 65 73 0d 0a 20 20 20 20  properties..    
12050 20 20 20 20 20 20 20 20 20 20 67 65 74 41 6c 6c            getAll
12060 50 72 6f 70 65 72 74 69 65 73 20 24 76 61 72 56  Properties $varV
12070 61 6c 75 65 20 70 72 6f 70 65 72 74 69 65 73 0d  alue properties.
12080 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
12090 20 6c 61 70 70 65 6e 64 20 72 65 73 75 6c 74 20   lappend result 
120a0 5b 6c 69 73 74 20 24 6e 61 6d 65 20 5b 61 72 72  [list $name [arr
120b0 61 79 20 67 65 74 20 70 72 6f 70 65 72 74 69 65  ay get propertie
120c0 73 5d 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s]]..           
120d0 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
120e0 20 20 20 20 20 20 20 20 20 6c 61 70 70 65 6e 64           lappend
120f0 20 72 65 73 75 6c 74 20 5b 6c 69 73 74 20 24 6e   result [list $n
12100 61 6d 65 20 24 76 61 72 56 61 6c 75 65 5d 0d 0a  ame $varValue]..
12110 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
12120 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
12130 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
12140 20 20 20 20 20 20 20 20 73 65 74 20 76 61 72 56          set varV
12150 61 6c 75 65 20 5b 75 70 6c 65 76 65 6c 20 31 20  alue [uplevel 1 
12160 5b 6c 69 73 74 20 73 65 74 20 24 76 61 72 4e 61  [list set $varNa
12170 6d 65 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  me]]....        
12180 20 20 69 66 20 7b 24 6f 62 6a 65 63 74 73 20 26    if {$objects &
12190 26 20 5b 69 73 4f 62 6a 65 63 74 48 61 6e 64 6c  & [isObjectHandl
121a0 65 20 24 76 61 72 56 61 6c 75 65 5d 7d 20 74 68  e $varValue]} th
121b0 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
121c0 20 20 75 6e 73 65 74 20 2d 6e 6f 63 6f 6d 70 6c    unset -nocompl
121d0 61 69 6e 20 70 72 6f 70 65 72 74 69 65 73 0d 0a  ain properties..
121e0 20 20 20 20 20 20 20 20 20 20 20 20 67 65 74 41              getA
121f0 6c 6c 50 72 6f 70 65 72 74 69 65 73 20 24 76 61  llProperties $va
12200 72 56 61 6c 75 65 20 70 72 6f 70 65 72 74 69 65  rValue propertie
12210 73 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s....           
12220 20 6c 61 70 70 65 6e 64 20 72 65 73 75 6c 74 20   lappend result 
12230 5b 6c 69 73 74 20 24 76 61 72 4e 61 6d 65 20 5b  [list $varName [
12240 61 72 72 61 79 20 67 65 74 20 70 72 6f 70 65 72  array get proper
12250 74 69 65 73 5d 5d 0d 0a 20 20 20 20 20 20 20 20  ties]]..        
12260 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
12270 20 20 20 20 20 20 20 20 6c 61 70 70 65 6e 64 20          lappend 
12280 72 65 73 75 6c 74 20 5b 6c 69 73 74 20 24 76 61  result [list $va
12290 72 4e 61 6d 65 20 24 76 61 72 56 61 6c 75 65 5d  rName $varValue]
122a0 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20  ..          }.. 
122b0 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
122c0 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65 74 75 72  }....      retur
122d0 6e 20 24 72 65 73 75 6c 74 0d 0a 20 20 20 20 7d  n $result..    }
122e0 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 65 6e  .....    proc en
122f0 75 6d 65 72 61 62 6c 65 54 6f 4c 69 73 74 20 7b  umerableToList {
12300 20 65 6e 75 6d 65 72 61 62 6c 65 20 7d 20 7b 0d   enumerable } {.
12310 0a 20 20 20 20 20 20 73 65 74 20 72 65 73 75 6c  .      set resul
12320 74 20 5b 6c 69 73 74 5d 0d 0a 0d 0a 20 20 20 20  t [list]....    
12330 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65    if {[string le
12340 6e 67 74 68 20 24 65 6e 75 6d 65 72 61 62 6c 65  ngth $enumerable
12350 5d 20 3d 3d 20 30 20 7c 7c 20 24 65 6e 75 6d 65  ] == 0 || $enume
12360 72 61 62 6c 65 20 65 71 20 22 6e 75 6c 6c 22 7d  rable eq "null"}
12370 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
12380 20 72 65 74 75 72 6e 20 24 72 65 73 75 6c 74 0d   return $result.
12390 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
123a0 20 20 6f 62 6a 65 63 74 20 66 6f 72 65 61 63 68    object foreach
123b0 20 2d 61 6c 69 61 73 20 69 74 65 6d 20 24 65 6e   -alias item $en
123c0 75 6d 65 72 61 62 6c 65 20 7b 0d 0a 20 20 20 20  umerable {..    
123d0 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20      if {[string 
123e0 6c 65 6e 67 74 68 20 24 69 74 65 6d 5d 20 3e 20  length $item] > 
123f0 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
12400 20 20 20 20 20 6c 61 70 70 65 6e 64 20 72 65 73       lappend res
12410 75 6c 74 20 5b 24 69 74 65 6d 20 54 6f 53 74 72  ult [$item ToStr
12420 69 6e 67 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d  ing]..        }.
12430 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
12440 20 20 72 65 74 75 72 6e 20 24 72 65 73 75 6c 74    return $result
12450 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
12460 70 72 6f 63 20 63 61 74 63 68 41 6e 64 52 65 74  proc catchAndRet
12470 75 72 6e 20 7b 20 73 63 72 69 70 74 20 7b 73 74  urn { script {st
12480 61 63 6b 54 72 61 63 65 20 66 61 6c 73 65 7d 20  ackTrace false} 
12490 7b 73 74 72 69 63 74 20 74 72 75 65 7d 20 7d 20  {strict true} } 
124a0 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  {..      #..    
124b0 20 20 23 20 4e 4f 54 45 3a 20 45 76 61 6c 75 61    # NOTE: Evalua
124c0 74 65 20 74 68 65 20 73 63 72 69 70 74 20 70 72  te the script pr
124d0 6f 76 69 64 65 64 20 62 79 20 6f 75 72 20 63 61  ovided by our ca
124e0 6c 6c 65 72 20 69 6e 20 74 68 65 69 72 20 63 6f  ller in their co
124f0 6e 74 65 78 74 2c 0d 0a 20 20 20 20 20 20 23 20  ntext,..      # 
12500 20 20 20 20 20 20 63 61 70 74 75 72 69 6e 67 20        capturing 
12510 62 6f 74 68 20 74 68 65 20 72 65 73 75 6c 74 20  both the result 
12520 61 6e 64 20 74 68 65 20 72 65 74 75 72 6e 20 63  and the return c
12530 6f 64 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ode...      #.. 
12540 20 20 20 20 20 73 65 74 20 63 6f 64 65 20 5b 63       set code [c
12550 61 74 63 68 20 7b 75 70 6c 65 76 65 6c 20 31 20  atch {uplevel 1 
12560 24 73 63 72 69 70 74 7d 20 72 65 73 75 6c 74 5d  $script} result]
12570 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  ....      #..   
12580 20 20 20 23 20 4e 4f 54 45 3a 20 44 69 64 20 74     # NOTE: Did t
12590 68 65 20 73 63 72 69 70 74 20 70 72 6f 76 69 64  he script provid
125a0 65 64 20 62 79 20 6f 75 72 20 63 61 6c 6c 65 72  ed by our caller
125b0 20 4e 4f 54 20 72 61 69 73 65 20 61 6e 20 65 72   NOT raise an er
125c0 72 6f 72 3f 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ror?..      #.. 
125d0 20 20 20 20 20 69 66 20 7b 24 73 74 72 69 63 74       if {$strict
125e0 20 26 26 20 24 63 6f 64 65 20 3d 3d 20 30 20 7c   && $code == 0 |
125f0 7c 20 21 24 73 74 72 69 63 74 20 26 26 20 24 63  | !$strict && $c
12600 6f 64 65 20 21 3d 20 31 7d 20 74 68 65 6e 20 7b  ode != 1} then {
12610 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
12620 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 75 63       # NOTE: Suc
12630 63 65 73 73 2e 20 20 52 65 74 75 72 6e 20 61 20  cess.  Return a 
12640 6c 69 73 74 20 77 69 74 68 20 74 68 65 20 72 65  list with the re
12650 74 75 72 6e 20 63 6f 64 65 20 61 6e 64 20 74 68  turn code and th
12660 65 20 72 65 73 75 6c 74 2e 0d 0a 20 20 20 20 20  e result...     
12670 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65     #..        re
12680 74 75 72 6e 20 5b 6c 69 73 74 20 24 63 6f 64 65  turn [list $code
12690 20 24 72 65 73 75 6c 74 5d 0d 0a 20 20 20 20 20   $result]..     
126a0 20 7d 20 65 6c 73 65 69 66 20 7b 24 73 74 61 63   } elseif {$stac
126b0 6b 54 72 61 63 65 7d 20 74 68 65 6e 20 7b 0d 0a  kTrace} then {..
126c0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
126d0 20 20 20 23 20 4e 4f 54 45 3a 20 46 61 69 6c 75     # NOTE: Failu
126e0 72 65 2e 20 20 4f 75 72 20 63 61 6c 6c 65 72 20  re.  Our caller 
126f0 77 61 6e 74 73 20 61 20 66 75 6c 6c 20 73 74 61  wants a full sta
12700 63 6b 20 74 72 61 63 65 20 28 69 66 20 61 70 70  ck trace (if app
12710 6c 69 63 61 62 6c 65 29 2c 0d 0a 20 20 20 20 20  licable),..     
12720 20 20 20 23 20 20 20 20 20 20 20 72 65 74 75 72     #       retur
12730 6e 20 61 20 6c 69 73 74 20 77 69 74 68 20 74 68  n a list with th
12740 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20 61 6e  e return code an
12750 64 20 74 68 65 20 72 65 73 75 6c 74 20 76 65 72  d the result ver
12760 62 61 74 69 6d 2e 0d 0a 20 20 20 20 20 20 20 20  batim...        
12770 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  #..        retur
12780 6e 20 5b 6c 69 73 74 20 24 63 6f 64 65 20 24 72  n [list $code $r
12790 65 73 75 6c 74 5d 0d 0a 20 20 20 20 20 20 7d 20  esult]..      } 
127a0 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
127b0 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
127c0 45 3a 20 46 61 69 6c 75 72 65 2e 20 20 4f 75 72  E: Failure.  Our
127d0 20 63 61 6c 6c 65 72 20 64 6f 65 73 20 6e 6f 74   caller does not
127e0 20 77 61 6e 74 20 61 20 66 75 6c 6c 20 73 74 61   want a full sta
127f0 63 6b 20 74 72 61 63 65 20 28 69 66 0d 0a 20 20  ck trace (if..  
12800 20 20 20 20 20 20 23 20 20 20 20 20 20 20 61 70        #       ap
12810 70 6c 69 63 61 62 6c 65 29 2c 20 72 65 74 75 72  plicable), retur
12820 6e 20 61 20 6c 69 73 74 20 77 69 74 68 20 74 68  n a list with th
12830 65 20 72 65 74 75 72 6e 20 63 6f 64 65 2c 20 74  e return code, t
12840 68 65 20 65 72 72 6f 72 0d 0a 20 20 20 20 20 20  he error..      
12850 20 20 23 20 20 20 20 20 20 20 63 6f 64 65 20 66    #       code f
12860 6f 72 20 74 68 65 20 69 6e 74 65 72 70 72 65 74  or the interpret
12870 65 72 2c 20 61 6e 64 20 74 68 65 20 65 72 72 6f  er, and the erro
12880 72 20 6d 65 73 73 61 67 65 20 75 70 20 74 6f 20  r message up to 
12890 74 68 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20  the..        #  
128a0 20 20 20 20 20 70 6f 69 6e 74 20 77 68 65 72 65       point where
128b0 20 74 68 65 20 73 74 61 63 6b 20 74 72 61 63 65   the stack trace
128c0 20 73 68 6f 75 6c 64 20 73 74 61 72 74 2e 0d 0a   should start...
128d0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
128e0 20 20 20 72 65 74 75 72 6e 20 5b 6c 69 73 74 20     return [list 
128f0 24 63 6f 64 65 20 24 3a 3a 65 72 72 6f 72 43 6f  $code $::errorCo
12900 64 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  de \..          
12910 20 20 5b 65 78 74 72 61 63 74 53 79 73 74 65 6d    [extractSystem
12920 44 61 74 61 53 51 4c 69 74 65 45 78 63 65 70 74  DataSQLiteExcept
12930 69 6f 6e 4d 65 73 73 61 67 65 20 24 72 65 73 75  ionMessage $resu
12940 6c 74 5d 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20  lt]]..      }.. 
12950 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
12960 63 20 63 6f 6d 70 69 6c 65 43 53 68 61 72 70 57  c compileCSharpW
12970 69 74 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  ith {..         
12980 20 20 20 74 65 78 74 20 6d 65 6d 6f 72 79 20 73     text memory s
12990 79 6d 62 6f 6c 73 20 73 74 72 69 63 74 20 72 65  ymbols strict re
129a0 73 75 6c 74 73 56 61 72 4e 61 6d 65 20 65 72 72  sultsVarName err
129b0 6f 72 73 56 61 72 4e 61 6d 65 20 66 69 6c 65 4e  orsVarName fileN
129c0 61 6d 65 73 0d 0a 20 20 20 20 20 20 20 20 20 20  ames..          
129d0 20 20 61 72 67 73 20 7d 20 7b 0d 0a 20 20 20 20    args } {..    
129e0 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
129f0 45 3a 20 53 69 6e 63 65 20 77 65 20 61 72 65 20  E: Since we are 
12a00 67 6f 69 6e 67 20 74 6f 20 75 73 65 20 74 68 69  going to use thi
12a10 73 20 6d 65 74 68 6f 64 20 6e 61 6d 65 20 61 20  s method name a 
12a20 6c 6f 74 2c 20 61 73 73 69 67 6e 20 69 74 20 74  lot, assign it t
12a30 6f 20 61 0d 0a 20 20 20 20 20 20 23 20 20 20 20  o a..      #    
12a40 20 20 20 76 61 72 69 61 62 6c 65 20 66 69 72 73     variable firs
12a50 74 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  t...      #..   
12a60 20 20 20 73 65 74 20 61 64 64 20 52 65 66 65 72     set add Refer
12a70 65 6e 63 65 64 41 73 73 65 6d 62 6c 69 65 73 2e  encedAssemblies.
12a80 41 64 64 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a  Add....      #..
12a90 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 72        # NOTE: Cr
12aa0 65 61 74 65 20 74 68 65 20 62 61 73 65 20 63 6f  eate the base co
12ab0 6d 6d 61 6e 64 20 74 6f 20 65 76 61 6c 75 61 74  mmand to evaluat
12ac0 65 20 61 6e 64 20 61 64 64 20 74 68 65 20 70 72  e and add the pr
12ad0 6f 70 65 72 74 79 20 73 65 74 74 69 6e 67 73 0d  operty settings.
12ae0 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74  .      #       t
12af0 68 61 74 20 61 72 65 20 61 6c 6d 6f 73 74 20 61  hat are almost a
12b00 6c 77 61 79 73 20 6e 65 65 64 65 64 20 62 79 20  lways needed by 
12b10 6f 75 72 20 75 6e 69 74 20 74 65 73 74 73 20 28  our unit tests (
12b20 69 2e 65 2e 20 74 68 65 20 53 79 73 74 65 6d 0d  i.e. the System.
12b30 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 61  .      #       a
12b40 6e 64 20 53 79 73 74 65 6d 2e 44 61 74 61 20 61  nd System.Data a
12b50 73 73 65 6d 62 6c 79 20 72 65 66 65 72 65 6e 63  ssembly referenc
12b60 65 73 29 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  es)...      #.. 
12b70 20 20 20 20 20 73 65 74 20 63 6f 6d 6d 61 6e 64       set command
12b80 20 5b 6c 69 73 74 20 5c 0d 0a 20 20 20 20 20 20   [list \..      
12b90 20 20 20 20 63 6f 6d 70 69 6c 65 43 53 68 61 72      compileCShar
12ba0 70 20 24 74 65 78 74 20 24 6d 65 6d 6f 72 79 20  p $text $memory 
12bb0 24 73 79 6d 62 6f 6c 73 20 24 73 74 72 69 63 74  $symbols $strict
12bc0 20 72 65 73 75 6c 74 73 20 65 72 72 6f 72 73 20   results errors 
12bd0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 24 61 64  \..          $ad
12be0 64 20 53 79 73 74 65 6d 2e 64 6c 6c 20 24 61 64  d System.dll $ad
12bf0 64 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 64 6c  d System.Data.dl
12c00 6c 20 24 61 64 64 20 53 79 73 74 65 6d 2e 54 72  l $add System.Tr
12c10 61 6e 73 61 63 74 69 6f 6e 73 2e 64 6c 6c 20 5c  ansactions.dll \
12c20 0d 0a 20 20 20 20 20 20 20 20 20 20 24 61 64 64  ..          $add
12c30 20 53 79 73 74 65 6d 2e 58 6d 6c 2e 64 6c 6c 5d   System.Xml.dll]
12c40 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  ....      #..   
12c50 20 20 20 23 20 4e 4f 54 45 3a 20 41 64 64 20 61     # NOTE: Add a
12c60 6c 6c 20 74 68 65 20 70 72 6f 76 69 64 65 64 20  ll the provided 
12c70 66 69 6c 65 20 6e 61 6d 65 73 20 61 73 20 61 73  file names as as
12c80 73 65 6d 62 6c 79 20 72 65 66 65 72 65 6e 63 65  sembly reference
12c90 73 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  s...      #..   
12ca0 20 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65 4e     foreach fileN
12cb0 61 6d 65 20 24 66 69 6c 65 4e 61 6d 65 73 20 7b  ame $fileNames {
12cc0 0d 0a 20 20 20 20 20 20 20 20 6c 61 70 70 65 6e  ..        lappen
12cd0 64 20 63 6f 6d 6d 61 6e 64 20 24 61 64 64 20 5b  d command $add [
12ce0 67 65 74 42 69 6e 61 72 79 46 69 6c 65 4e 61 6d  getBinaryFileNam
12cf0 65 20 24 66 69 6c 65 4e 61 6d 65 5d 0d 0a 20 20  e $fileName]..  
12d00 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23      }....      #
12d10 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
12d20 41 64 64 20 74 68 65 20 65 78 74 72 61 20 61 72  Add the extra ar
12d30 67 75 6d 65 6e 74 73 2c 20 69 66 20 61 6e 79 2c  guments, if any,
12d40 20 74 6f 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20   to the command 
12d50 74 6f 20 65 76 61 6c 75 61 74 65 2e 0d 0a 20 20  to evaluate...  
12d60 20 20 20 20 23 0d 0a 20 20 20 20 20 20 65 76 61      #..      eva
12d70 6c 20 6c 61 70 70 65 6e 64 20 63 6f 6d 6d 61 6e  l lappend comman
12d80 64 20 24 61 72 67 73 0d 0a 0d 0a 20 20 20 20 20  d $args....     
12d90 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
12da0 3a 20 41 6c 69 61 73 20 74 68 65 20 63 6f 6d 70  : Alias the comp
12db0 69 6c 65 72 20 6c 6f 63 61 6c 20 72 65 73 75 6c  iler local resul
12dc0 74 73 20 61 6e 64 20 65 72 72 6f 72 73 20 76 61  ts and errors va
12dd0 72 69 61 62 6c 65 73 20 74 6f 20 74 68 65 0d 0a  riables to the..
12de0 20 20 20 20 20 20 23 20 20 20 20 20 20 20 76 61        #       va
12df0 72 69 61 62 6c 65 20 6e 61 6d 65 73 20 70 72 6f  riable names pro
12e00 76 69 64 65 64 20 62 79 20 6f 75 72 20 63 61 6c  vided by our cal
12e10 6c 65 72 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ler...      #.. 
12e20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67       if {[string
12e30 20 6c 65 6e 67 74 68 20 24 72 65 73 75 6c 74 73   length $results
12e40 56 61 72 4e 61 6d 65 5d 20 3e 20 30 7d 20 74 68  VarName] > 0} th
12e50 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 75 70  en {..        up
12e60 76 61 72 20 31 20 24 72 65 73 75 6c 74 73 56 61  var 1 $resultsVa
12e70 72 4e 61 6d 65 20 72 65 73 75 6c 74 73 0d 0a 20  rName results.. 
12e80 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
12e90 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67  if {[string leng
12ea0 74 68 20 24 65 72 72 6f 72 73 56 61 72 4e 61 6d  th $errorsVarNam
12eb0 65 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  e] > 0} then {..
12ec0 20 20 20 20 20 20 20 20 75 70 76 61 72 20 31 20          upvar 1 
12ed0 24 65 72 72 6f 72 73 56 61 72 4e 61 6d 65 20 65  $errorsVarName e
12ee0 72 72 6f 72 73 0d 0a 20 20 20 20 20 20 7d 0d 0a  rrors..      }..
12ef0 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
12f00 20 23 20 4e 4f 54 45 3a 20 45 76 61 6c 75 61 74   # NOTE: Evaluat
12f10 65 20 74 68 65 20 63 6f 6e 73 74 72 75 63 74 65  e the constructe
12f20 64 20 5b 63 6f 6d 70 69 6c 65 43 53 68 61 72 70  d [compileCSharp
12f30 5d 20 63 6f 6d 6d 61 6e 64 20 61 6e 64 20 72 65  ] command and re
12f40 74 75 72 6e 20 74 68 65 0d 0a 20 20 20 20 20 20  turn the..      
12f50 23 20 20 20 20 20 20 20 72 65 73 75 6c 74 2e 0d  #       result..
12f60 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
12f70 65 76 61 6c 20 24 63 6f 6d 6d 61 6e 64 0d 0a 20  eval $command.. 
12f80 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
12f90 63 20 69 73 4d 65 6d 6f 72 79 44 62 20 7b 20 66  c isMemoryDb { f
12fa0 69 6c 65 4e 61 6d 65 20 7d 20 7b 0d 0a 20 20 20  ileName } {..   
12fb0 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
12fc0 54 45 3a 20 49 73 20 74 68 65 20 73 70 65 63 69  TE: Is the speci
12fd0 66 69 65 64 20 64 61 74 61 62 61 73 65 20 66 69  fied database fi
12fe0 6c 65 20 6e 61 6d 65 20 72 65 61 6c 6c 79 20 61  le name really a
12ff0 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  n in-memory data
13000 62 61 73 65 3f 0d 0a 20 20 20 20 20 20 23 0d 0a  base?..      #..
13010 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b 65 78        return [ex
13020 70 72 20 7b 24 66 69 6c 65 4e 61 6d 65 20 65 71  pr {$fileName eq
13030 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 7c 7c 20 5c   ":memory:" || \
13040 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 73 74 72  ..          [str
13050 69 6e 67 20 72 61 6e 67 65 20 24 66 69 6c 65 4e  ing range $fileN
13060 61 6d 65 20 30 20 31 32 5d 20 65 71 20 22 66 69  ame 0 12] eq "fi
13070 6c 65 3a 3a 6d 65 6d 6f 72 79 3a 22 7d 5d 0d 0a  le::memory:"}]..
13080 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
13090 6f 63 20 69 73 54 61 62 6c 65 49 6e 44 62 20 7b  oc isTableInDb {
130a0 20 6e 61 6d 65 20 7b 76 61 72 4e 61 6d 65 20 64   name {varName d
130b0 62 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d  b} } {..      #.
130c0 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 52  .      # NOTE: R
130d0 65 66 65 72 20 74 6f 20 74 68 65 20 73 70 65 63  efer to the spec
130e0 69 66 69 65 64 20 76 61 72 69 61 62 6c 65 20 28  ified variable (
130f0 65 2e 67 2e 20 22 64 62 22 29 20 69 6e 20 74 68  e.g. "db") in th
13100 65 20 63 6f 6e 74 65 78 74 20 6f 66 20 6f 75 72  e context of our
13110 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
13120 63 61 6c 6c 65 72 2e 20 20 49 74 20 63 6f 6e 74  caller.  It cont
13130 61 69 6e 73 20 74 68 65 20 64 61 74 61 62 61 73  ains the databas
13140 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 6e  e connection han
13150 64 6c 65 20 74 68 61 74 20 77 69 6c 6c 20 62 65  dle that will be
13160 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
13170 75 73 65 64 20 74 6f 20 65 78 65 63 75 74 65 20  used to execute 
13180 74 68 65 20 71 75 65 72 79 20 75 73 65 64 20 74  the query used t
13190 6f 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20 74  o determine if t
131a0 68 65 20 6e 61 6d 65 64 20 74 61 62 6c 65 20 69  he named table i
131b0 73 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  s..      #      
131c0 20 70 72 65 73 65 6e 74 20 69 6e 20 74 68 61 74   present in that
131d0 20 64 61 74 61 62 61 73 65 2e 0d 0a 20 20 20 20   database...    
131e0 20 20 23 0d 0a 20 20 20 20 20 20 75 70 76 61 72    #..      upvar
131f0 20 31 20 24 76 61 72 4e 61 6d 65 20 64 62 0d 0a   1 $varName db..
13200 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
13210 20 23 20 4e 4f 54 45 3a 20 55 73 65 20 74 68 65   # NOTE: Use the
13220 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74   sqlite_master t
13230 61 62 6c 65 20 74 6f 20 64 65 74 65 72 6d 69 6e  able to determin
13240 65 20 69 66 20 74 68 65 20 6e 61 6d 65 64 20 74  e if the named t
13250 61 62 6c 65 20 69 73 0d 0a 20 20 20 20 20 20 23  able is..      #
13260 20 20 20 20 20 20 20 70 72 65 73 65 6e 74 20 69         present i
13270 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0d  n the database..
13280 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
13290 73 65 74 20 73 71 6c 20 7b 0d 0a 20 20 20 20 20  set sql {..     
132a0 20 20 20 53 45 4c 45 43 54 20 43 4f 55 4e 54 28     SELECT COUNT(
132b0 2a 29 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d  *) FROM sqlite_m
132c0 61 73 74 65 72 20 57 48 45 52 45 20 74 79 70 65  aster WHERE type
132d0 20 3d 20 27 74 61 62 6c 65 27 20 41 4e 44 20 6e   = 'table' AND n
132e0 61 6d 65 20 3d 20 3f 3b 0d 0a 20 20 20 20 20 20  ame = ?;..      
132f0 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  }....      #..  
13300 20 20 20 20 23 20 4e 4f 54 45 3a 20 52 65 74 75      # NOTE: Retu
13310 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74  rn non-zero if t
13320 68 65 20 6e 61 6d 65 64 20 74 61 62 6c 65 20 69  he named table i
13330 73 20 70 72 65 73 65 6e 74 2e 0d 0a 20 20 20 20  s present...    
13340 20 20 23 0d 0a 20 20 20 20 20 20 72 65 74 75 72    #..      retur
13350 6e 20 5b 65 78 70 72 20 7b 0d 0a 20 20 20 20 20  n [expr {..     
13360 20 20 20 5b 73 71 6c 20 65 78 65 63 75 74 65 20     [sql execute 
13370 2d 65 78 65 63 75 74 65 20 73 63 61 6c 61 72 20  -execute scalar 
13380 24 64 62 20 24 73 71 6c 20 5b 6c 69 73 74 20 70  $db $sql [list p
13390 61 72 61 6d 31 20 53 74 72 69 6e 67 20 24 6e 61  aram1 String $na
133a0 6d 65 5d 5d 20 3e 20 30 0d 0a 20 20 20 20 20 20  me]] > 0..      
133b0 7d 5d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20  }]..    }.....  
133c0 20 20 70 72 6f 63 20 67 65 74 44 62 44 65 66 61    proc getDbDefa
133d0 75 6c 74 50 61 67 65 53 69 7a 65 20 7b 7d 20 7b  ultPageSize {} {
133e0 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74  ..      if {[cat
133f0 63 68 20 7b 65 78 65 63 75 74 65 53 71 6c 20 22  ch {executeSql "
13400 50 52 41 47 4d 41 20 70 61 67 65 5f 73 69 7a 65  PRAGMA page_size
13410 3b 22 20 73 63 61 6c 61 72 7d 20 72 65 73 75 6c  ;" scalar} resul
13420 74 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d  t] == 0} then {.
13430 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
13440 24 72 65 73 75 6c 74 0d 0a 20 20 20 20 20 20 7d  $result..      }
13450 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
13460 20 72 65 74 75 72 6e 20 30 0d 0a 20 20 20 20 20   return 0..     
13470 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20   }..    }.....  
13480 20 20 70 72 6f 63 20 67 65 74 44 62 44 65 66 61    proc getDbDefa
13490 75 6c 74 43 61 63 68 65 53 69 7a 65 20 7b 7d 20  ultCacheSize {} 
134a0 7b 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 63 61  {..      if {[ca
134b0 74 63 68 20 7b 65 78 65 63 75 74 65 53 71 6c 20  tch {executeSql 
134c0 22 50 52 41 47 4d 41 20 63 61 63 68 65 5f 73 69  "PRAGMA cache_si
134d0 7a 65 3b 22 20 73 63 61 6c 61 72 7d 20 72 65 73  ze;" scalar} res
134e0 75 6c 74 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20  ult] == 0} then 
134f0 7b 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  {..        retur
13500 6e 20 24 72 65 73 75 6c 74 0d 0a 20 20 20 20 20  n $result..     
13510 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
13520 20 20 20 72 65 74 75 72 6e 20 30 0d 0a 20 20 20     return 0..   
13530 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a     }..    }.....
13540 20 20 20 20 70 72 6f 63 20 75 73 65 4c 65 67 61      proc useLega
13550 63 79 44 62 50 61 67 65 41 6e 64 43 61 63 68 65  cyDbPageAndCache
13560 53 69 7a 65 73 20 7b 20 76 61 72 4e 61 6d 65 20  Sizes { varName 
13570 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  } {..      #..  
13580 20 20 20 20 23 20 4e 4f 54 45 3a 20 52 65 66 65      # NOTE: Refe
13590 72 20 74 6f 20 74 68 65 20 73 70 65 63 69 66 69  r to the specifi
135a0 65 64 20 76 61 72 69 61 62 6c 65 20 28 65 2e 67  ed variable (e.g
135b0 2e 20 22 64 62 22 29 20 69 6e 20 74 68 65 20 63  . "db") in the c
135c0 6f 6e 74 65 78 74 20 6f 66 20 6f 75 72 0d 0a 20  ontext of our.. 
135d0 20 20 20 20 20 23 20 20 20 20 20 20 20 63 61 6c       #       cal
135e0 6c 65 72 2e 20 20 49 74 20 63 6f 6e 74 61 69 6e  ler.  It contain
135f0 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63  s the database c
13600 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 6e 64 6c 65  onnection handle
13610 20 74 68 61 74 20 77 69 6c 6c 20 62 65 0d 0a 20   that will be.. 
13620 20 20 20 20 20 23 20 20 20 20 20 20 20 75 73 65       #       use
13630 64 20 74 6f 20 65 78 65 63 75 74 65 20 71 75 65  d to execute que
13640 72 69 65 73 20 75 73 65 64 20 74 6f 20 73 65 74  ries used to set
13650 20 74 68 65 20 70 61 67 65 20 61 6e 64 20 63 61   the page and ca
13660 63 68 65 20 73 69 7a 65 73 2e 0d 0a 20 20 20 20  che sizes...    
13670 20 20 23 0d 0a 20 20 20 20 20 20 75 70 76 61 72    #..      upvar
13680 20 31 20 24 76 61 72 4e 61 6d 65 20 64 62 0d 0a   1 $varName db..
13690 0d 0a 20 20 20 20 20 20 73 71 6c 20 65 78 65 63  ..      sql exec
136a0 75 74 65 20 24 64 62 20 7b 0d 0a 20 20 20 20 20  ute $db {..     
136b0 20 20 20 50 52 41 47 4d 41 20 70 61 67 65 5f 73     PRAGMA page_s
136c0 69 7a 65 20 3d 20 31 30 32 34 3b 0d 0a 20 20 20  ize = 1024;..   
136d0 20 20 20 20 20 50 52 41 47 4d 41 20 63 61 63 68       PRAGMA cach
136e0 65 5f 73 69 7a 65 20 3d 20 32 30 30 30 3b 0d 0a  e_size = 2000;..
136f0 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
13700 20 72 65 74 75 72 6e 20 5b 6c 69 73 74 20 5c 0d   return [list \.
13710 0a 20 20 20 20 20 20 20 20 20 20 5b 73 71 6c 20  .          [sql 
13720 65 78 65 63 75 74 65 20 2d 65 78 65 63 75 74 65  execute -execute
13730 20 73 63 61 6c 61 72 20 24 64 62 20 22 50 52 41   scalar $db "PRA
13740 47 4d 41 20 70 61 67 65 5f 73 69 7a 65 3b 22 5d  GMA page_size;"]
13750 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 73   \..          [s
13760 71 6c 20 65 78 65 63 75 74 65 20 2d 65 78 65 63  ql execute -exec
13770 75 74 65 20 73 63 61 6c 61 72 20 24 64 62 20 22  ute scalar $db "
13780 50 52 41 47 4d 41 20 63 61 63 68 65 5f 73 69 7a  PRAGMA cache_siz
13790 65 3b 22 5d 5d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d  e;"]]..    }....
137a0 0a 20 20 20 20 70 72 6f 63 20 65 78 74 72 61 63  .    proc extrac
137b0 74 53 79 73 74 65 6d 44 61 74 61 53 51 4c 69 74  tSystemDataSQLit
137c0 65 45 78 63 65 70 74 69 6f 6e 4d 65 73 73 61 67  eExceptionMessag
137d0 65 20 7b 20 76 61 6c 75 65 20 7d 20 7b 0d 0a 20  e { value } {.. 
137e0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
137f0 4e 4f 54 45 3a 20 49 66 20 74 68 65 20 73 74 72  NOTE: If the str
13800 69 6e 67 20 63 6f 6e 66 6f 72 6d 73 20 74 6f 20  ing conforms to 
13810 66 6f 72 6d 61 74 20 6f 66 20 74 68 65 20 6e 6f  format of the no
13820 72 6d 61 6c 20 65 78 63 65 70 74 69 6f 6e 0d 0a  rmal exception..
13830 20 20 20 20 20 20 23 20 20 20 20 20 20 20 65 72        #       er
13840 72 6f 72 20 73 74 72 69 6e 67 73 2c 20 65 78 74  ror strings, ext
13850 72 61 63 74 20 61 6e 64 20 72 65 74 75 72 6e 20  ract and return 
13860 6f 6e 6c 79 20 74 68 65 20 65 72 72 6f 72 20 6d  only the error m
13870 65 73 73 61 67 65 0d 0a 20 20 20 20 20 20 23 20  essage..      # 
13880 20 20 20 20 20 20 70 6f 72 74 69 6f 6e 20 69 74        portion it
13890 73 65 6c 66 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  self...      #..
138a0 20 20 20 20 20 20 73 65 74 20 70 61 74 74 65 72        set patter
138b0 6e 73 20 5b 6c 69 73 74 20 5c 0d 0a 20 20 20 20  ns [list \..    
138c0 20 20 7b 53 79 73 74 65 6d 5c 2e 44 61 74 61 5c    {System\.Data\
138d0 2e 53 51 4c 69 74 65 5c 2e 53 51 4c 69 74 65 45  .SQLite\.SQLiteE
138e0 78 63 65 70 74 69 6f 6e 20 5c 28 30 78 38 30 30  xception \(0x800
138f0 30 34 30 30 35 5c 29 3a 20 28 2e 2b 3f 29 20 20  04005\): (.+?)  
13900 28 3f 3a 20 29 3f 61 74 7d 20 5c 0d 0a 20 20 20  (?: )?at} \..   
13910 20 20 20 7b 53 79 73 74 65 6d 5c 2e 44 61 74 61     {System\.Data
13920 5c 2e 53 51 4c 69 74 65 5c 2e 53 51 4c 69 74 65  \.SQLite\.SQLite
13930 45 78 63 65 70 74 69 6f 6e 3a 20 28 2e 2b 3f 29  Exception: (.+?)
13940 20 20 28 3f 3a 20 29 3f 61 74 7d 20 5c 0d 0a 20    (?: )?at} \.. 
13950 20 20 20 20 20 7b 45 61 67 6c 65 5c 2e 5f 43 6f       {Eagle\._Co
13960 6d 70 6f 6e 65 6e 74 73 5c 2e 50 75 62 6c 69 63  mponents\.Public
13970 5c 2e 53 63 72 69 70 74 45 78 63 65 70 74 69 6f  \.ScriptExceptio
13980 6e 3a 20 28 2e 2b 3f 29 20 20 28 3f 3a 20 29 3f  n: (.+?)  (?: )?
13990 61 74 7d 5d 0d 0a 0d 0a 20 20 20 20 20 20 66 6f  at}]....      fo
139a0 72 65 61 63 68 20 70 61 74 74 65 72 6e 20 24 70  reach pattern $p
139b0 61 74 74 65 72 6e 73 20 7b 0d 0a 20 20 20 20 20  atterns {..     
139c0 20 20 20 69 66 20 7b 5b 72 65 67 65 78 70 20 2d     if {[regexp -
139d0 2d 20 24 70 61 74 74 65 72 6e 20 24 76 61 6c 75  - $pattern $valu
139e0 65 20 64 75 6d 6d 79 20 6d 65 73 73 61 67 65 5d  e dummy message]
139f0 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
13a00 20 20 20 20 73 65 74 20 6d 65 73 73 61 67 65 20      set message 
13a10 5b 73 74 72 69 6e 67 20 6d 61 70 20 5b 6c 69 73  [string map [lis
13a20 74 20 5c 72 5c 6e 20 5c 6e 5d 20 5b 73 74 72 69  t \r\n \n] [stri
13a30 6e 67 20 74 72 69 6d 20 24 6d 65 73 73 61 67 65  ng trim $message
13a40 5d 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65  ]]..          se
13a50 74 20 6c 69 6e 65 73 20 5b 73 70 6c 69 74 20 24  t lines [split $
13a60 6d 65 73 73 61 67 65 20 5c 6e 5d 0d 0a 0d 0a 20  message \n].... 
13a70 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 6c 6c           if {[ll
13a80 65 6e 67 74 68 20 24 6c 69 6e 65 73 5d 20 3d 3d  ength $lines] ==
13a90 20 32 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   2} then {..    
13aa0 20 20 20 20 20 20 20 20 69 66 20 7b 5b 6c 69 6e          if {[lin
13ab0 64 65 78 20 24 6c 69 6e 65 73 20 30 5d 20 65 71  dex $lines 0] eq
13ac0 20 5b 6c 69 6e 64 65 78 20 24 6c 69 6e 65 73 20   [lindex $lines 
13ad0 31 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  1]} then {..    
13ae0 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
13af0 20 5b 6c 69 6e 64 65 78 20 24 6c 69 6e 65 73 20   [lindex $lines 
13b00 30 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  0]..            
13b10 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  }....           
13b20 20 72 65 74 75 72 6e 20 5b 61 70 70 65 6e 64 41   return [appendA
13b30 72 67 73 20 5b 6c 69 6e 64 65 78 20 24 6c 69 6e  rgs [lindex $lin
13b40 65 73 20 30 5d 20 22 20 2d 2d 20 22 20 5b 6c 69  es 0] " -- " [li
13b50 6e 64 65 78 20 24 6c 69 6e 65 73 20 31 5d 5d 0d  ndex $lines 1]].
13b60 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  .          }....
13b70 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
13b80 20 24 6d 65 73 73 61 67 65 0d 0a 20 20 20 20 20   $message..     
13b90 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d     }..      }...
13ba0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 76  .      return $v
13bb0 61 6c 75 65 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a  alue..    }.....
13bc0 20 20 20 20 70 72 6f 63 20 74 72 69 6d 53 71 6c      proc trimSql
13bd0 20 7b 20 73 71 6c 20 7d 20 7b 0d 0a 20 20 20 20   { sql } {..    
13be0 20 20 72 65 74 75 72 6e 20 5b 72 65 67 73 75 62    return [regsub
13bf0 20 2d 61 6c 6c 20 2d 2d 20 7b 5c 73 2b 7d 20 5b   -all -- {\s+} [
13c00 73 74 72 69 6e 67 20 74 72 69 6d 20 24 73 71 6c  string trim $sql
13c10 5d 20 22 20 22 5d 0d 0a 20 20 20 20 7d 0d 0a 0c  ] " "]..    }...
13c20 0d 0a 20 20 20 20 70 72 6f 63 20 65 78 65 63 75  ..    proc execu
13c30 74 65 53 71 6c 20 7b 20 73 71 6c 20 7b 65 78 65  teSql { sql {exe
13c40 63 75 74 65 20 6e 6f 6e 65 7d 20 7b 66 6f 72 6d  cute none} {form
13c50 61 74 20 6e 6f 6e 65 7d 20 7b 66 69 6c 65 4e 61  at none} {fileNa
13c60 6d 65 20 22 22 7d 20 7d 20 7b 0d 0a 20 20 20 20  me ""} } {..    
13c70 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65    if {[string le
13c80 6e 67 74 68 20 24 66 69 6c 65 4e 61 6d 65 5d 20  ngth $fileName] 
13c90 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 73 65 74 20  == 0} then {set 
13ca0 66 69 6c 65 4e 61 6d 65 20 3a 6d 65 6d 6f 72 79  fileName :memory
13cb0 3a 7d 0d 0a 20 20 20 20 20 20 73 65 74 75 70 44  :}..      setupD
13cc0 62 20 24 66 69 6c 65 4e 61 6d 65 20 22 22 20 22  b $fileName "" "
13cd0 22 20 22 22 20 22 22 20 22 22 20 66 61 6c 73 65  " "" "" "" false
13ce0 20 66 61 6c 73 65 20 66 61 6c 73 65 20 66 61 6c   false false fal
13cf0 73 65 20 64 62 20 74 72 75 65 0d 0a 0d 0a 20 20  se db true....  
13d00 20 20 20 20 74 72 79 20 7b 0d 0a 20 20 20 20 20      try {..     
13d10 20 20 20 72 65 74 75 72 6e 20 5b 75 70 6c 65 76     return [uplev
13d20 65 6c 20 31 20 5b 6c 69 73 74 20 5c 0d 0a 20 20  el 1 [list \..  
13d30 20 20 20 20 20 20 20 20 20 20 73 71 6c 20 65 78            sql ex
13d40 65 63 75 74 65 20 2d 65 78 65 63 75 74 65 20 24  ecute -execute $
13d50 65 78 65 63 75 74 65 20 2d 66 6f 72 6d 61 74 20  execute -format 
13d60 24 66 6f 72 6d 61 74 20 24 64 62 20 24 73 71 6c  $format $db $sql
13d70 5d 5d 0d 0a 20 20 20 20 20 20 7d 20 66 69 6e 61  ]]..      } fina
13d80 6c 6c 79 20 7b 0d 0a 20 20 20 20 20 20 20 20 73  lly {..        s
13d90 65 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 5b 67  et connection [g
13da0 65 74 44 62 43 6f 6e 6e 65 63 74 69 6f 6e 5d 0d  etDbConnection].
13db0 0a 0d 0a 20 20 20 20 20 20 20 20 74 72 79 20 7b  ...        try {
13dc0 0d 0a 20 20 20 20 20 20 20 20 20 20 63 6c 65 61  ..          clea
13dd0 6e 75 70 44 62 20 24 66 69 6c 65 4e 61 6d 65 20  nupDb $fileName 
13de0 64 62 20 66 61 6c 73 65 20 66 61 6c 73 65 20 66  db false false f
13df0 61 6c 73 65 0d 0a 20 20 20 20 20 20 20 20 7d 20  alse..        } 
13e00 66 69 6e 61 6c 6c 79 20 7b 0d 0a 20 20 20 20 20  finally {..     
13e10 20 20 20 20 20 6f 62 6a 65 63 74 20 66 6c 61 67       object flag
13e20 73 20 24 63 6f 6e 6e 65 63 74 69 6f 6e 20 2d 4e  s $connection -N
13e30 6f 44 69 73 70 6f 73 65 3b 20 66 72 65 65 44 62  oDispose; freeDb
13e40 43 6f 6e 6e 65 63 74 69 6f 6e 0d 0a 20 20 20 20  Connection..    
13e50 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a      }..      }..
13e60 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
13e70 6f 63 20 68 61 73 4e 6f 46 6c 61 67 73 20 7b 20  oc hasNoFlags { 
13e80 76 61 72 4e 61 6d 65 20 6e 6f 6e 65 20 7d 20 7b  varName none } {
13e90 0d 0a 20 20 20 20 20 20 75 70 76 61 72 20 31 20  ..      upvar 1 
13ea0 24 76 61 72 4e 61 6d 65 20 66 6c 61 67 73 0d 0a  $varName flags..
13eb0 0d 0a 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e  ..      if {![in
13ec0 66 6f 20 65 78 69 73 74 73 20 66 6c 61 67 73 5d  fo exists flags]
13ed0 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
13ee0 20 20 72 65 74 75 72 6e 20 74 72 75 65 0d 0a 20    return true.. 
13ef0 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
13f00 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67  if {[string leng
13f10 74 68 20 24 66 6c 61 67 73 5d 20 3d 3d 20 30 7d  th $flags] == 0}
13f20 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
13f30 20 72 65 74 75 72 6e 20 74 72 75 65 0d 0a 20 20   return true..  
13f40 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 69      }....      i
13f50 66 20 7b 24 6e 6f 6e 65 20 26 26 20 24 66 6c 61  f {$none && $fla
13f60 67 73 20 65 71 20 22 4e 6f 6e 65 22 7d 20 74 68  gs eq "None"} th
13f70 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 72 65  en {..        re
13f80 74 75 72 6e 20 74 72 75 65 0d 0a 20 20 20 20 20  turn true..     
13f90 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65 74 75   }....      retu
13fa0 72 6e 20 66 61 6c 73 65 0d 0a 20 20 20 20 7d 0d  rn false..    }.
13fb0 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74  ....    proc get
13fc0 43 6f 6e 6e 65 63 74 69 6f 6e 46 6c 61 67 73 20  ConnectionFlags 
13fd0 7b 20 66 69 6c 65 4e 61 6d 65 20 66 6c 61 67 73  { fileName flags
13fe0 20 7b 71 75 69 65 74 20 66 61 6c 73 65 7d 20 7d   {quiet false} }
13ff0 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20   {..      #..   
14000 20 20 20 23 20 4e 4f 54 45 3a 20 46 69 67 75 72     # NOTE: Figur
14010 65 20 6f 75 74 20 77 68 69 63 68 20 64 61 74 61  e out which data
14020 62 61 73 65 20 66 69 6c 65 20 6e 61 6d 65 20 6f  base file name o
14030 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 74 72  r connection str
14040 69 6e 67 20 74 68 65 73 65 0d 0a 20 20 20 20 20  ing these..     
14050 20 23 20 20 20 20 20 20 20 63 6f 6e 6e 65 63 74   #       connect
14060 69 6f 6e 20 66 6c 61 67 73 20 77 69 6c 6c 20 61  ion flags will a
14070 63 74 75 61 6c 6c 79 20 61 70 70 6c 79 20 74 6f  ctually apply to
14080 2e 20 20 54 68 69 73 20 69 73 20 6e 6f 74 20 6e  .  This is not n
14090 65 63 65 73 73 61 72 79 0d 0a 20 20 20 20 20 20  ecessary..      
140a0 23 20 20 20 20 20 20 20 69 6e 20 71 75 69 65 74  #       in quiet
140b0 20 6d 6f 64 65 20 62 65 63 61 75 73 65 20 74 68   mode because th
140c0 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69  is information i
140d0 73 20 6f 6e 6c 79 20 75 73 65 64 20 66 6f 72 20  s only used for 
140e0 6c 6f 67 67 69 6e 67 0d 0a 20 20 20 20 20 20 23  logging..      #
140f0 20 20 20 20 20 20 20 61 6e 64 20 72 65 70 6f 72         and repor
14100 74 69 6e 67 20 70 75 72 70 6f 73 65 73 2e 0d 0a  ting purposes...
14110 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69        #..      i
14120 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e  f {!$quiet} then
14130 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b   {..        if {
14140 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
14150 66 69 6c 65 4e 61 6d 65 5d 20 3e 20 30 7d 20 74  fileName] > 0} t
14160 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
14170 20 73 65 74 20 64 61 74 61 62 61 73 65 20 5b 61   set database [a
14180 70 70 65 6e 64 41 72 67 73 20 22 66 69 6c 65 20  ppendArgs "file 
14190 6e 61 6d 65 20 5c 22 22 20 24 66 69 6c 65 4e 61  name \"" $fileNa
141a0 6d 65 20 5c 22 5d 0d 0a 20 20 20 20 20 20 20 20  me \"]..        
141b0 7d 20 65 6c 73 65 69 66 20 7b 5b 69 6e 66 6f 20  } elseif {[info 
141c0 65 78 69 73 74 73 20 3a 3a 64 61 74 61 53 6f 75  exists ::dataSou
141d0 72 63 65 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20  rce] && \..     
141e0 20 20 20 20 20 20 20 21 5b 61 72 72 61 79 20 65         ![array e
141f0 78 69 73 74 73 20 3a 3a 64 61 74 61 53 6f 75 72  xists ::dataSour
14200 63 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  ce]} then {..   
14210 20 20 20 20 20 20 20 73 65 74 20 64 61 74 61 62         set datab
14220 61 73 65 20 5b 61 70 70 65 6e 64 41 72 67 73 20  ase [appendArgs 
14230 22 64 61 74 61 20 73 6f 75 72 63 65 20 5c 22 22  "data source \""
14240 20 24 3a 3a 64 61 74 61 53 6f 75 72 63 65 20 5c   $::dataSource \
14250 22 5d 0d 0a 20 20 20 20 20 20 20 20 7d 20 65 6c  "]..        } el
14260 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  se {..          
14270 73 65 74 20 64 61 74 61 62 61 73 65 20 3c 75 6e  set database <un
14280 6b 6e 6f 77 6e 3e 0d 0a 20 20 20 20 20 20 20 20  known>..        
14290 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  }..      }....  
142a0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
142b0 4f 54 45 3a 20 45 76 65 6e 20 74 68 6f 75 67 68  OTE: Even though
142c0 20 74 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 6f   there is only o
142d0 6e 65 20 73 6f 75 72 63 65 20 6f 66 20 66 6c 61  ne source of fla
142e0 67 73 20 73 6f 20 66 61 72 2c 20 74 68 65 79 0d  gs so far, they.
142f0 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 6d  .      #       m
14300 75 73 74 20 62 65 20 63 6f 6d 62 69 6e 65 64 20  ust be combined 
14310 75 73 69 6e 67 20 74 68 65 20 63 6f 72 72 65 63  using the correc
14320 74 20 73 79 6e 74 61 78 20 66 6f 72 20 65 6e 75  t syntax for enu
14330 6d 65 72 61 74 65 64 0d 0a 20 20 20 20 20 20 23  merated..      #
14340 20 20 20 20 20 20 20 66 6c 61 67 20 76 61 6c 75         flag valu
14350 65 73 20 66 6f 72 20 74 68 65 20 2e 4e 45 54 20  es for the .NET 
14360 46 72 61 6d 65 77 6f 72 6b 2e 0d 0a 20 20 20 20  Framework...    
14370 20 20 23 0d 0a 20 20 20 20 20 20 73 65 74 20 66    #..      set f
14380 6c 61 67 73 20 5b 63 6f 6d 62 69 6e 65 46 6c 61  lags [combineFla
14390 67 73 20 24 66 6c 61 67 73 20 22 22 5d 0d 0a 0d  gs $flags ""]...
143a0 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
143b0 23 20 4e 4f 54 45 3a 20 53 68 6f 77 20 28 61 6e  # NOTE: Show (an
143c0 64 20 6c 6f 67 29 20 74 68 65 20 6c 6f 63 61 6c  d log) the local
143d0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 6c 61 67   connection flag
143e0 73 20 61 6e 64 20 74 68 65 20 61 73 73 6f 63 69  s and the associ
143f0 61 74 65 64 0d 0a 20 20 20 20 20 20 23 20 20 20  ated..      #   
14400 20 20 20 20 64 61 74 61 20 73 6f 75 72 63 65 20      data source 
14410 6f 72 20 66 69 6c 65 20 6e 61 6d 65 2e 0d 0a 20  or file name... 
14420 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66       #..      if
14430 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20   {!$quiet} then 
14440 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21  {..        if {!
14450 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e  [info exists ::n
14460 6f 28 65 6d 69 74 4c 6f 63 61 6c 46 6c 61 67 73  o(emitLocalFlags
14470 29 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20  )] && \..       
14480 20 20 20 20 20 28 21 5b 69 6e 66 6f 20 65 78 69       (![info exi
14490 73 74 73 20 3a 3a 6e 6f 28 65 6d 69 74 4c 6f 63  sts ::no(emitLoc
144a0 61 6c 46 6c 61 67 73 49 66 4e 6f 6e 65 29 5d 20  alFlagsIfNone)] 
144b0 7c 7c 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  || \..          
144c0 20 20 20 21 5b 68 61 73 4e 6f 46 6c 61 67 73 20     ![hasNoFlags 
144d0 66 6c 61 67 73 20 66 61 6c 73 65 5d 29 7d 20 74  flags false])} t
144e0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
144f0 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
14500 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
14510 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
14520 20 20 20 20 22 2d 2d 2d 2d 20 6c 6f 63 61 6c 20      "---- local 
14530 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 6c 61 67 73  connection flags
14540 20 66 6f 72 20 22 20 24 64 61 74 61 62 61 73 65   for " $database
14550 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
14560 20 20 22 20 61 72 65 3a 20 22 20 5b 65 78 70 72    " are: " [expr
14570 20 7b 21 5b 68 61 73 4e 6f 46 6c 61 67 73 20 66   {![hasNoFlags f
14580 6c 61 67 73 20 66 61 6c 73 65 5d 20 3f 20 5c 0d  lags false] ? \.
14590 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b  .              [
145a0 61 70 70 65 6e 64 41 72 67 73 20 5c 22 20 24 66  appendArgs \" $f
145b0 6c 61 67 73 20 5c 22 5d 20 3a 20 22 3c 6e 6f 6e  lags \"] : "<non
145c0 65 3e 22 7d 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20  e>"}] \n]..     
145d0 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d     }..      }...
145e0 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
145f0 23 20 4e 4f 54 45 3a 20 53 68 6f 77 20 28 61 6e  # NOTE: Show (an
14600 64 20 6c 6f 67 29 20 74 68 65 20 73 68 61 72 65  d log) the share
14610 64 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 6c 61  d connection fla
14620 67 73 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  gs...      #..  
14630 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d      if {!$quiet}
14640 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
14650 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20   if {[catch {.. 
14660 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20           object 
14670 69 6e 76 6f 6b 65 20 53 79 73 74 65 6d 2e 44 61  invoke System.Da
14680 74 61 2e 53 51 4c 69 74 65 2e 53 51 4c 69 74 65  ta.SQLite.SQLite
14690 43 6f 6e 6e 65 63 74 69 6f 6e 20 53 68 61 72 65  Connection Share
146a0 64 46 6c 61 67 73 0d 0a 20 20 20 20 20 20 20 20  dFlags..        
146b0 7d 20 73 68 61 72 65 64 46 6c 61 67 73 5d 20 3d  } sharedFlags] =
146c0 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  = 0} then {..   
146d0 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66         if {![inf
146e0 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 65 6d  o exists ::no(em
146f0 69 74 53 68 61 72 65 64 46 6c 61 67 73 29 5d 20  itSharedFlags)] 
14700 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  && \..          
14710 20 20 20 20 28 21 5b 69 6e 66 6f 20 65 78 69 73      (![info exis
14720 74 73 20 3a 3a 6e 6f 28 65 6d 69 74 53 68 61 72  ts ::no(emitShar
14730 65 64 46 6c 61 67 73 49 66 4e 6f 6e 65 29 5d 20  edFlagsIfNone)] 
14740 7c 7c 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  || \..          
14750 20 20 20 20 20 21 5b 68 61 73 4e 6f 46 6c 61 67       ![hasNoFlag
14760 73 20 73 68 61 72 65 64 46 6c 61 67 73 20 74 72  s sharedFlags tr
14770 75 65 5d 29 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ue])} then {..  
14780 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
14790 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
147a0 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
147b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
147c0 2d 2d 2d 2d 20 73 68 61 72 65 64 20 63 6f 6e 6e  ---- shared conn
147d0 65 63 74 69 6f 6e 20 66 6c 61 67 73 20 66 6f 72  ection flags for
147e0 20 22 20 24 64 61 74 61 62 61 73 65 20 5c 0d 0a   " $database \..
147f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14800 22 20 61 72 65 3a 20 22 20 5b 65 78 70 72 20 7b  " are: " [expr {
14810 21 5b 68 61 73 4e 6f 46 6c 61 67 73 20 73 68 61  ![hasNoFlags sha
14820 72 65 64 46 6c 61 67 73 20 74 72 75 65 5d 20 3f  redFlags true] ?
14830 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
14840 20 20 20 20 5b 61 70 70 65 6e 64 41 72 67 73 20      [appendArgs 
14850 5c 22 20 24 73 68 61 72 65 64 46 6c 61 67 73 20  \" $sharedFlags 
14860 5c 22 5d 20 3a 20 22 3c 6e 6f 6e 65 3e 22 7d 5d  \"] : "<none>"}]
14870 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20   \n]..          
14880 7d 0d 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73  }..        } els
14890 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69  e {..          i
148a0 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73  f {![info exists
148b0 20 3a 3a 6e 6f 28 65 6d 69 74 53 68 61 72 65 64   ::no(emitShared
148c0 46 6c 61 67 73 29 5d 20 26 26 20 5c 0d 0a 20 20  Flags)] && \..  
148d0 20 20 20 20 20 20 20 20 20 20 20 20 21 5b 69 6e              ![in
148e0 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 65  fo exists ::no(e
148f0 6d 69 74 53 68 61 72 65 64 46 6c 61 67 73 49 66  mitSharedFlagsIf
14900 55 6e 61 76 61 69 6c 61 62 6c 65 29 5d 7d 20 74  Unavailable)]} t
14910 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
14920 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
14930 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  _channel [append
14940 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
14950 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 73 68          "---- sh
14960 61 72 65 64 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  ared connection 
14970 66 6c 61 67 73 20 66 6f 72 20 22 20 24 64 61 74  flags for " $dat
14980 61 62 61 73 65 20 5c 0d 0a 20 20 20 20 20 20 20  abase \..       
14990 20 20 20 20 20 20 20 20 20 22 20 61 72 65 3a 20           " are: 
149a0 3c 75 6e 61 76 61 69 6c 61 62 6c 65 3e 5c 6e 22  <unavailable>\n"
149b0 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  ]..          }..
149c0 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
149d0 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20   }....      #.. 
149e0 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 68 6f       # NOTE: Sho
149f0 77 20 28 61 6e 64 20 6c 6f 67 29 20 74 68 65 20  w (and log) the 
14a00 64 65 74 65 63 74 65 64 20 67 6c 6f 62 61 6c 20  detected global 
14a10 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 6c 61 67 73  connection flags
14a20 2c 20 69 66 20 61 6e 79 2e 0d 0a 20 20 20 20 20  , if any...     
14a30 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 21 24   #..      if {!$
14a40 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20  quiet} then {.. 
14a50 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66         if {![inf
14a60 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 65 6d  o exists ::no(em
14a70 69 74 47 6c 6f 62 61 6c 46 6c 61 67 73 29 5d 20  itGlobalFlags)] 
14a80 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  && \..          
14a90 20 20 28 21 5b 69 6e 66 6f 20 65 78 69 73 74 73    (![info exists
14aa0 20 3a 3a 6e 6f 28 65 6d 69 74 47 6c 6f 62 61 6c   ::no(emitGlobal
14ab0 46 6c 61 67 73 49 66 4e 6f 6e 65 29 5d 20 7c 7c  FlagsIfNone)] ||
14ac0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
14ad0 20 21 5b 68 61 73 4e 6f 46 6c 61 67 73 20 3a 3a   ![hasNoFlags ::
14ae0 63 6f 6e 6e 65 63 74 69 6f 6e 5f 66 6c 61 67 73  connection_flags
14af0 20 66 61 6c 73 65 5d 29 7d 20 74 68 65 6e 20 7b   false])} then {
14b00 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70 75 74  ..          tput
14b10 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
14b20 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
14b30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22  .              "
14b40 2d 2d 2d 2d 20 67 6c 6f 62 61 6c 20 63 6f 6e 6e  ---- global conn
14b50 65 63 74 69 6f 6e 20 66 6c 61 67 73 20 61 72 65  ection flags are
14b60 3a 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  : " \..         
14b70 20 20 20 20 20 5b 65 78 70 72 20 7b 21 5b 68 61       [expr {![ha
14b80 73 4e 6f 46 6c 61 67 73 20 3a 3a 63 6f 6e 6e 65  sNoFlags ::conne
14b90 63 74 69 6f 6e 5f 66 6c 61 67 73 20 66 61 6c 73  ction_flags fals
14ba0 65 5d 20 3f 20 5c 0d 0a 20 20 20 20 20 20 20 20  e] ? \..        
14bb0 20 20 20 20 20 20 5b 61 70 70 65 6e 64 41 72 67        [appendArg
14bc0 73 20 5c 22 20 24 3a 3a 63 6f 6e 6e 65 63 74 69  s \" $::connecti
14bd0 6f 6e 5f 66 6c 61 67 73 20 5c 22 5d 20 3a 20 22  on_flags \"] : "
14be0 3c 6e 6f 6e 65 3e 22 7d 5d 20 5c 6e 5d 0d 0a 20  <none>"}] \n].. 
14bf0 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
14c00 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  }....      #..  
14c10 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 66 20 74      # NOTE: If t
14c20 68 65 72 65 20 61 72 65 20 61 6e 79 20 67 6c 6f  here are any glo
14c30 62 61 6c 20 28 70 65 72 20 74 65 73 74 20 72 75  bal (per test ru
14c40 6e 29 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 6c  n) connection fl
14c50 61 67 73 20 63 75 72 72 65 6e 74 6c 79 0d 0a 20  ags currently.. 
14c60 20 20 20 20 20 23 20 20 20 20 20 20 20 73 65 74       #       set
14c70 2c 20 75 73 65 20 74 68 65 6d 20 6e 6f 77 20 28  , use them now (
14c80 69 2e 65 2e 20 62 79 20 63 6f 6d 62 69 6e 69 6e  i.e. by combinin
14c90 67 20 74 68 65 6d 20 77 69 74 68 20 74 68 65 20  g them with the 
14ca0 6f 6e 65 73 20 66 6f 72 20 74 68 69 73 0d 0a 20  ones for this.. 
14cb0 20 20 20 20 20 23 20 20 20 20 20 20 20 63 6f 6e       #       con
14cc0 6e 65 63 74 69 6f 6e 29 2e 0d 0a 20 20 20 20 20  nection)...     
14cd0 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69   #..      if {[i
14ce0 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 63 6f 6e  nfo exists ::con
14cf0 6e 65 63 74 69 6f 6e 5f 66 6c 61 67 73 5d 7d 20  nection_flags]} 
14d00 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
14d10 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
14d20 45 3a 20 43 6f 6d 62 69 6e 65 20 61 6e 64 2f 6f  E: Combine and/o
14d30 72 20 72 65 70 6c 61 63 65 20 74 68 65 20 63 6f  r replace the co
14d40 6e 6e 65 63 74 69 6f 6e 20 66 6c 61 67 73 20 61  nnection flags a
14d50 6e 64 20 74 68 65 6e 20 73 68 6f 77 20 74 68 65  nd then show the
14d60 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
14d70 20 20 6e 65 77 20 76 61 6c 75 65 2e 0d 0a 20 20    new value...  
14d80 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
14d90 20 73 65 74 20 66 6c 61 67 73 20 5b 63 6f 6d 62   set flags [comb
14da0 69 6e 65 46 6c 61 67 73 20 24 66 6c 61 67 73 20  ineFlags $flags 
14db0 24 3a 3a 63 6f 6e 6e 65 63 74 69 6f 6e 5f 66 6c  $::connection_fl
14dc0 61 67 73 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  ags]....        
14dd0 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
14de0 45 3a 20 53 68 6f 77 20 28 61 6e 64 20 6c 6f 67  E: Show (and log
14df0 29 20 74 68 65 20 6e 65 77 20 65 66 66 65 63 74  ) the new effect
14e00 69 76 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66  ive connection f
14e10 6c 61 67 73 2e 0d 0a 20 20 20 20 20 20 20 20 23  lags...        #
14e20 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21 24  ..        if {!$
14e30 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20  quiet} then {.. 
14e40 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69           if {![i
14e50 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28  nfo exists ::no(
14e60 65 6d 69 74 43 6f 6d 62 69 6e 65 64 46 6c 61 67  emitCombinedFlag
14e70 73 29 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20  s)] && \..      
14e80 20 20 20 20 20 20 20 20 28 21 5b 69 6e 66 6f 20          (![info 
14e90 65 78 69 73 74 73 20 3a 3a 6e 6f 28 65 6d 69 74  exists ::no(emit
14ea0 43 6f 6d 62 69 6e 65 64 46 6c 61 67 73 49 66 4e  CombinedFlagsIfN
14eb0 6f 6e 65 29 5d 20 7c 7c 20 5c 0d 0a 20 20 20 20  one)] || \..    
14ec0 20 20 20 20 20 20 20 20 20 20 20 21 5b 68 61 73             ![has
14ed0 4e 6f 46 6c 61 67 73 20 66 6c 61 67 73 20 66 61  NoFlags flags fa
14ee0 6c 73 65 5d 29 7d 20 74 68 65 6e 20 7b 0d 0a 20  lse])} then {.. 
14ef0 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
14f00 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
14f10 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
14f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14f30 22 2d 2d 2d 2d 20 63 6f 6d 62 69 6e 65 64 20 63  "---- combined c
14f40 6f 6e 6e 65 63 74 69 6f 6e 20 66 6c 61 67 73 20  onnection flags 
14f50 66 6f 72 20 22 20 24 64 61 74 61 62 61 73 65 20  for " $database 
14f60 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
14f70 20 20 20 22 20 61 72 65 3a 20 22 20 5b 65 78 70     " are: " [exp
14f80 72 20 7b 21 5b 68 61 73 4e 6f 46 6c 61 67 73 20  r {![hasNoFlags 
14f90 66 6c 61 67 73 20 66 61 6c 73 65 5d 20 3f 20 5c  flags false] ? \
14fa0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
14fb0 20 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 22    [appendArgs \"
14fc0 20 24 66 6c 61 67 73 20 5c 22 5d 20 3a 20 22 3c   $flags \"] : "<
14fd0 6e 6f 6e 65 3e 22 7d 5d 20 5c 6e 5d 0d 0a 20 20  none>"}] \n]..  
14fe0 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
14ff0 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d     }..      }...
15000 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 66  .      return $f
15010 6c 61 67 73 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a  lags..    }.....
15020 20 20 20 20 70 72 6f 63 20 67 65 74 46 6c 61 67      proc getFlag
15030 73 50 72 6f 70 65 72 74 79 20 7b 20 7b 66 6c 61  sProperty { {fla
15040 67 73 20 22 22 7d 20 7b 71 75 69 65 74 20 66 61  gs ""} {quiet fa
15050 6c 73 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20  lse} } {..      
15060 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
15070 20 44 65 74 65 72 6d 69 6e 65 20 77 68 61 74 20   Determine what 
15080 74 68 65 20 63 6f 6d 62 69 6e 65 64 20 28 67 6c  the combined (gl
15090 6f 62 61 6c 20 61 6e 64 20 6c 6f 63 61 6c 29 20  obal and local) 
150a0 63 6f 6e 6e 65 63 74 69 6f 6e 0d 0a 20 20 20 20  connection..    
150b0 20 20 23 20 20 20 20 20 20 20 66 6c 61 67 73 20    #       flags 
150c0 73 68 6f 75 6c 64 20 62 65 2c 20 70 6f 73 73 69  should be, possi
150d0 62 6c 79 20 71 75 69 65 74 6c 79 2e 0d 0a 20 20  bly quietly...  
150e0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 73 65 74      #..      set
150f0 20 66 6c 61 67 73 20 5b 67 65 74 43 6f 6e 6e 65   flags [getConne
15100 63 74 69 6f 6e 46 6c 61 67 73 20 22 22 20 24 66  ctionFlags "" $f
15110 6c 61 67 73 20 24 71 75 69 65 74 5d 0d 0a 0d 0a  lags $quiet]....
15120 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
15130 20 4e 4f 54 45 3a 20 49 66 20 6e 6f 20 67 6c 6f   NOTE: If no glo
15140 62 61 6c 20 6f 72 20 6c 6f 63 61 6c 20 63 6f 6e  bal or local con
15150 6e 65 63 74 69 6f 6e 20 66 6c 61 67 73 20 77 65  nection flags we
15160 72 65 20 73 70 65 63 69 66 69 65 64 2c 20 74 68  re specified, th
15170 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  e..      #      
15180 20 64 65 66 61 75 6c 74 20 63 6f 6e 6e 65 63 74   default connect
15190 69 6f 6e 20 66 6c 61 67 73 20 73 68 6f 75 6c 64  ion flags should
151a0 20 62 65 20 75 73 65 64 3b 20 74 68 65 72 65 66   be used; theref
151b0 6f 72 65 2c 20 72 65 74 75 72 6e 0d 0a 20 20 20  ore, return..   
151c0 20 20 20 23 20 20 20 20 20 20 20 61 6e 20 65 6d     #       an em
151d0 70 74 79 20 73 74 72 69 6e 67 20 69 6e 20 74 68  pty string in th
151e0 61 74 20 63 61 73 65 2e 0d 0a 20 20 20 20 20 20  at case...      
151f0 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 73 74  #..      if {[st
15200 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 66 6c 61  ring length $fla
15210 67 73 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b  gs] == 0} then {
15220 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ..        return
15230 20 22 22 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a   ""..      }....
15240 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
15250 20 4e 4f 54 45 3a 20 49 6e 20 6f 72 64 65 72 20   NOTE: In order 
15260 74 6f 20 63 68 65 63 6b 20 69 66 20 74 68 65 20  to check if the 
15270 64 65 66 61 75 6c 74 20 63 6f 6e 6e 65 63 74 69  default connecti
15280 6f 6e 20 66 6c 61 67 73 20 61 72 65 20 62 65 69  on flags are bei
15290 6e 67 20 75 73 65 64 0d 0a 20 20 20 20 20 20 23  ng used..      #
152a0 20 20 20 20 20 20 20 69 74 20 69 73 20 6e 65 63         it is nec
152b0 65 73 73 61 72 79 20 74 6f 20 61 74 74 65 6d 70  essary to attemp
152c0 74 20 61 20 63 6f 6e 76 65 72 73 69 6f 6e 20 74  t a conversion t
152d0 6f 20 74 68 65 20 61 63 74 75 61 6c 20 65 6e 75  o the actual enu
152e0 6d 65 72 61 74 65 64 0d 0a 20 20 20 20 20 20 23  merated..      #
152f0 20 20 20 20 20 20 20 74 79 70 65 2e 20 20 46 61         type.  Fa
15300 69 6c 69 6e 67 20 74 68 61 74 2c 20 74 68 65 20  iling that, the 
15310 63 68 65 63 6b 20 61 67 61 69 6e 73 74 20 74 68  check against th
15320 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20  e default value 
15330 77 69 6c 6c 20 62 65 0d 0a 20 20 20 20 20 20 23  will be..      #
15340 20 20 20 20 20 20 20 73 6b 69 70 70 65 64 2e 0d         skipped..
15350 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
15360 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20  if {[catch {..  
15370 20 20 20 20 20 20 73 65 74 20 65 72 72 6f 72 20        set error 
15380 6e 75 6c 6c 3b 20 23 20 49 47 4e 4f 52 45 44 0d  null; # IGNORED.
15390 0a 0d 0a 20 20 20 20 20 20 20 20 6f 62 6a 65 63  ...        objec
153a0 74 20 69 6e 76 6f 6b 65 20 55 74 69 6c 69 74 79  t invoke Utility
153b0 20 54 72 79 50 61 72 73 65 46 6c 61 67 73 45 6e   TryParseFlagsEn
153c0 75 6d 20 22 22 20 5c 0d 0a 20 20 20 20 20 20 20  um "" \..       
153d0 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61       System.Data
153e0 2e 53 51 4c 69 74 65 2e 53 51 4c 69 74 65 43 6f  .SQLite.SQLiteCo
153f0 6e 6e 65 63 74 69 6f 6e 46 6c 61 67 73 20 22 22  nnectionFlags ""
15400 20 24 66 6c 61 67 73 20 6e 75 6c 6c 20 74 72 75   $flags null tru
15410 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e \..           
15420 20 74 72 75 65 20 74 72 75 65 20 65 72 72 6f 72   true true error
15430 0d 0a 20 20 20 20 20 20 7d 20 76 61 6c 75 65 5d  ..      } value]
15440 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
15450 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
15460 4f 54 45 3a 20 41 74 74 65 6d 70 74 69 6e 67 20  OTE: Attempting 
15470 74 6f 20 70 61 72 73 65 20 74 68 65 20 63 6f 6e  to parse the con
15480 6e 65 63 74 69 6f 6e 20 66 6c 61 67 73 20 63 61  nection flags ca
15490 75 73 65 64 20 61 20 73 63 72 69 70 74 0d 0a 20  used a script.. 
154a0 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 65         #       e
154b0 72 72 6f 72 2e 20 20 45 6d 69 74 20 61 20 77 61  rror.  Emit a wa
154c0 72 6e 69 6e 67 20 74 6f 20 74 68 65 20 74 65 73  rning to the tes
154d0 74 20 6c 6f 67 20 66 69 6c 65 20 61 6e 64 20 63  t log file and c
154e0 6f 6e 74 69 6e 75 65 0d 0a 20 20 20 20 20 20 20  ontinue..       
154f0 20 23 20 20 20 20 20 20 20 75 73 69 6e 67 20 61   #       using a
15500 6e 20 65 6d 74 70 79 20 73 74 72 69 6e 67 20 69  n emtpy string i
15510 6e 73 74 65 61 64 2e 0d 0a 20 20 20 20 20 20 20  nstead...       
15520 20 23 0d 0a 20 20 20 20 20 20 20 20 74 6c 6f 67   #..        tlog
15530 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
15540 20 20 20 20 20 20 20 20 20 20 20 20 22 3d 3d 3d              "===
15550 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65  = WARNING: faile
15560 64 20 74 6f 20 70 61 72 73 65 20 63 6f 6e 6e 65  d to parse conne
15570 63 74 69 6f 6e 20 66 6c 61 67 73 2c 20 65 72 72  ction flags, err
15580 6f 72 3a 20 22 20 5c 0d 0a 20 20 20 20 20 20 20  or: " \..       
15590 20 20 20 20 20 5c 6e 5c 74 20 24 76 61 6c 75 65       \n\t $value
155a0 20 5c 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20   \n]....        
155b0 73 65 74 20 76 61 6c 75 65 20 22 22 0d 0a 20 20  set value ""..  
155c0 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23      }....      #
155d0 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
155e0 49 66 20 74 68 65 20 63 6f 6d 62 69 6e 65 64 20  If the combined 
155f0 66 6c 61 67 73 20 73 74 72 69 6e 67 20 63 6f 75  flags string cou
15600 6c 64 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20  ld not actually 
15610 62 65 20 63 6f 6e 76 65 72 74 65 64 0d 0a 20 20  be converted..  
15620 20 20 20 20 23 20 20 20 20 20 20 20 74 6f 20 74      #       to t
15630 68 65 20 65 6e 75 6d 65 72 61 74 65 64 20 74 79  he enumerated ty
15640 70 65 20 69 74 20 69 73 20 74 68 65 20 64 65 66  pe it is the def
15650 61 75 6c 74 20 76 61 6c 75 65 2c 20 74 68 65 6e  ault value, then
15660 20 6a 75 73 74 20 75 73 65 0d 0a 20 20 20 20 20   just use..     
15670 20 23 20 20 20 20 20 20 20 69 74 20 76 65 72 62   #       it verb
15680 61 74 69 6d 3b 20 6f 74 68 65 72 77 69 73 65 2c  atim; otherwise,
15690 20 6a 75 73 74 20 72 65 74 75 72 6e 20 61 6e 20   just return an 
156a0 65 6d 70 74 79 20 73 74 72 69 6e 67 2e 20 20 49  empty string.  I
156b0 6e 20 74 68 61 74 0d 0a 20 20 20 20 20 20 23 20  n that..      # 
156c0 20 20 20 20 20 20 63 61 73 65 2c 20 74 68 65 20        case, the 
156d0 64 65 66 61 75 6c 74 20 63 6f 6e 6e 65 63 74 69  default connecti
156e0 6f 6e 20 66 6c 61 67 73 20 77 69 6c 6c 20 62 65  on flags will be
156f0 20 75 73 65 64 2e 0d 0a 20 20 20 20 20 20 23 0d   used...      #.
15700 0a 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69  .      if {[stri
15710 6e 67 20 6c 65 6e 67 74 68 20 24 76 61 6c 75 65  ng length $value
15720 5d 20 3d 3d 20 30 20 7c 7c 20 24 76 61 6c 75 65  ] == 0 || $value
15730 20 6e 65 20 22 44 65 66 61 75 6c 74 22 7d 20 74   ne "Default"} t
15740 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  hen {..        #
15750 0d 0a 20 20 20 20 20 20 20 20 23 20 57 41 52 4e  ..        # WARN
15760 49 4e 47 3a 20 54 68 69 73 20 72 65 74 75 72 6e  ING: This return
15770 73 20 74 68 65 20 73 74 72 69 6e 67 20 76 61 6c  s the string val
15780 75 65 20 6f 66 20 74 68 65 20 63 6f 6d 62 69 6e  ue of the combin
15790 65 64 20 66 6c 61 67 73 2c 20 6e 6f 74 0d 0a 20  ed flags, not.. 
157a0 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 20         #        
157b0 20 20 74 68 65 20 65 6e 75 6d 65 72 61 74 65 64    the enumerated
157c0 20 76 61 6c 75 65 2e 20 20 54 68 69 73 20 69 73   value.  This is
157d0 20 62 79 20 64 65 73 69 67 6e 20 61 6e 64 20 73   by design and s
157e0 68 6f 75 6c 64 20 6e 6f 74 0d 0a 20 20 20 20 20  hould not..     
157f0 20 20 20 23 20 20 20 20 20 20 20 20 20 20 62 65     #          be
15800 20 63 68 61 6e 67 65 64 20 77 69 74 68 6f 75 74   changed without
15810 20 63 61 72 65 66 75 6c 20 63 6f 6e 73 69 64 65   careful conside
15820 72 61 74 69 6f 6e 20 28 65 2e 67 2e 20 69 74 20  ration (e.g. it 
15830 77 6f 75 6c 64 0d 0a 20 20 20 20 20 20 20 20 23  would..        #
15840 20 20 20 20 20 20 20 20 20 20 70 72 65 76 65 6e            preven
15850 74 20 74 68 65 20 53 51 4c 69 74 65 43 6f 6e 6e  t the SQLiteConn
15860 65 63 74 69 6f 6e 20 63 6c 61 73 73 20 66 72 6f  ection class fro
15870 6d 20 61 6c 6c 6f 77 69 6e 67 20 69 6e 76 61 6c  m allowing inval
15880 69 64 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  id..        #   
15890 20 20 20 20 20 20 20 5b 22 6d 61 67 69 63 61 6c         ["magical
158a0 22 5d 20 6d 65 74 61 2d 66 6c 61 67 73 29 2e 0d  "] meta-flags)..
158b0 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
158c0 20 20 20 20 72 65 74 75 72 6e 20 5b 61 70 70 65      return [appe
158d0 6e 64 41 72 67 73 20 22 46 6c 61 67 73 3d 22 20  ndArgs "Flags=" 
158e0 24 66 6c 61 67 73 20 5c 3b 5d 0d 0a 20 20 20 20  $flags \;]..    
158f0 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65 74    }....      ret
15900 75 72 6e 20 22 22 0d 0a 20 20 20 20 7d 0d 0a 0c  urn ""..    }...
15910 0d 0a 20 20 20 20 70 72 6f 63 20 65 6e 61 62 6c  ..    proc enabl
15920 65 53 68 61 72 65 64 43 61 63 68 65 20 7b 20 63  eSharedCache { c
15930 68 61 6e 6e 65 6c 20 65 6e 61 62 6c 65 20 7b 71  hannel enable {q
15940 75 69 65 74 20 66 61 6c 73 65 7d 20 7d 20 7b 0d  uiet false} } {.
15950 0a 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63  .      if {[catc
15960 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 6f 62 6a  h {..        obj
15970 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67  ect invoke -flag
15980 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a  s +NonPublic \..
15990 20 20 20 20 20 20 20 20 20 20 20 20 53 79 73 74              Syst
159a0 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 55  em.Data.SQLite.U
159b0 6e 73 61 66 65 4e 61 74 69 76 65 4d 65 74 68 6f  nsafeNativeMetho
159c0 64 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  ds \..          
159d0 20 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65    sqlite3_enable
159e0 5f 73 68 61 72 65 64 5f 63 61 63 68 65 20 5b 65  _shared_cache [e
159f0 78 70 72 20 69 6e 74 28 24 65 6e 61 62 6c 65 29  xpr int($enable)
15a00 5d 0d 0a 20 20 20 20 20 20 7d 20 72 65 73 75 6c  ]..      } resul
15a10 74 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d  t] == 0} then {.
15a20 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71  .        if {!$q
15a30 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  uiet} then {..  
15a40 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
15a50 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
15a60 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
15a70 20 20 20 20 22 2d 2d 2d 2d 20 63 61 6c 6c 20 73      "---- call s
15a80 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 73 68  qlite3_enable_sh
15a90 61 72 65 64 5f 63 61 63 68 65 28 22 20 24 65 6e  ared_cache(" $en
15aa0 61 62 6c 65 20 5c 0d 0a 20 20 20 20 20 20 20 20  able \..        
15ab0 20 20 20 20 20 20 22 29 2e 2e 2e 20 6f 6b 3a 20        ")... ok: 
15ac0 22 20 24 72 65 73 75 6c 74 20 5c 6e 5d 0d 0a 20  " $result \n].. 
15ad0 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
15ae0 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
15af0 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74    if {!$quiet} t
15b00 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
15b10 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
15b20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
15b30 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d               "--
15b40 2d 2d 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 5f  -- call sqlite3_
15b50 65 6e 61 62 6c 65 5f 73 68 61 72 65 64 5f 63 61  enable_shared_ca
15b60 63 68 65 28 22 20 24 65 6e 61 62 6c 65 20 5c 0d  che(" $enable \.
15b70 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22  .              "
15b80 29 2e 2e 2e 20 65 72 72 6f 72 3a 20 22 20 5c 6e  )... error: " \n
15b90 5c 74 20 24 72 65 73 75 6c 74 20 5c 6e 5d 0d 0a  \t $result \n]..
15ba0 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
15bb0 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20   }..    }.....  
15bc0 20 20 70 72 6f 63 20 73 65 74 75 70 44 62 20 7b    proc setupDb {
15bd0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 69  ..            fi
15be0 6c 65 4e 61 6d 65 20 7b 6d 6f 64 65 20 22 22 7d  leName {mode ""}
15bf0 20 7b 64 61 74 65 54 69 6d 65 46 6f 72 6d 61 74   {dateTimeFormat
15c00 20 22 22 7d 20 7b 64 61 74 65 54 69 6d 65 4b 69   ""} {dateTimeKi
15c10 6e 64 20 22 22 7d 20 7b 66 6c 61 67 73 20 22 22  nd ""} {flags ""
15c20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b  }..            {
15c30 65 78 74 72 61 20 22 22 7d 20 7b 71 75 61 6c 69  extra ""} {quali
15c40 66 79 20 74 72 75 65 7d 20 7b 64 65 6c 65 74 65  fy true} {delete
15c50 20 74 72 75 65 7d 20 7b 75 72 69 20 66 61 6c 73   true} {uri fals
15c60 65 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  e}..            
15c70 7b 74 65 6d 70 6f 72 61 72 79 20 74 72 75 65 7d  {temporary true}
15c80 20 7b 76 61 72 4e 61 6d 65 20 64 62 7d 20 7b 71   {varName db} {q
15c90 75 69 65 74 20 66 61 6c 73 65 7d 20 7d 20 7b 0d  uiet false} } {.
15ca0 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
15cb0 23 20 4e 4f 54 45 3a 20 46 69 72 73 74 2c 20 73  # NOTE: First, s
15cc0 65 65 20 69 66 20 6f 75 72 20 63 61 6c 6c 65 72  ee if our caller
15cd0 20 68 61 73 20 72 65 71 75 65 73 74 65 64 20 61   has requested a
15ce0 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  n in-memory data
15cf0 62 61 73 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  base...      #..
15d00 20 20 20 20 20 20 73 65 74 20 69 73 4d 65 6d 6f        set isMemo
15d10 72 79 20 5b 69 73 4d 65 6d 6f 72 79 44 62 20 24  ry [isMemoryDb $
15d20 66 69 6c 65 4e 61 6d 65 5d 0d 0a 0d 0a 20 20 20  fileName]....   
15d30 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
15d40 54 45 3a 20 46 6f 72 20 6e 6f 77 2c 20 61 6c 6c  TE: For now, all
15d50 20 74 65 73 74 20 64 61 74 61 62 61 73 65 73 20   test databases 
15d60 75 73 65 64 20 62 79 20 74 68 65 20 74 65 73 74  used by the test
15d70 20 73 75 69 74 65 20 61 72 65 20 70 6c 61 63 65   suite are place
15d80 64 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  d..      #      
15d90 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61   into the databa
15da0 73 65 20 64 69 72 65 63 74 6f 72 79 2e 20 20 45  se directory.  E
15db0 61 63 68 20 64 61 74 61 62 61 73 65 20 61 6e 64  ach database and
15dc0 20 72 65 6c 61 74 65 64 20 66 69 6c 65 73 0d 0a   related files..
15dd0 20 20 20 20 20 20 23 20 20 20 20 20 20 20 75 73        #       us
15de0 65 64 20 62 79 20 61 20 74 65 73 74 20 73 68 6f  ed by a test sho
15df0 75 6c 64 20 62 65 20 63 6c 65 61 6e 65 64 20 75  uld be cleaned u
15e00 70 20 62 79 20 74 68 61 74 20 74 65 73 74 20 75  p by that test u
15e10 73 69 6e 67 20 74 68 65 0d 0a 20 20 20 20 20 20  sing the..      
15e20 23 20 20 20 20 20 20 20 22 63 6c 65 61 6e 75 70  #       "cleanup
15e30 44 62 22 20 70 72 6f 63 65 64 75 72 65 2c 20 62  Db" procedure, b
15e40 65 6c 6f 77 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  elow...      #..
15e50 20 20 20 20 20 20 69 66 20 7b 21 24 69 73 4d 65        if {!$isMe
15e60 6d 6f 72 79 20 26 26 20 24 71 75 61 6c 69 66 79  mory && $qualify
15e70 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
15e80 20 20 73 65 74 20 66 69 6c 65 4e 61 6d 65 20 5b    set fileName [
15e90 66 69 6c 65 20 6a 6f 69 6e 20 5b 67 65 74 44 61  file join [getDa
15ea0 74 61 62 61 73 65 44 69 72 65 63 74 6f 72 79 5d  tabaseDirectory]
15eb0 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 66 69 6c   [file tail $fil
15ec0 65 4e 61 6d 65 5d 5d 0d 0a 20 20 20 20 20 20 7d  eName]]..      }
15ed0 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  ....      #..   
15ee0 20 20 20 23 20 4e 4f 54 45 3a 20 42 79 20 64 65     # NOTE: By de
15ef0 66 61 75 6c 74 2c 20 64 65 6c 65 74 65 20 61 6e  fault, delete an
15f00 79 20 70 72 65 2d 65 78 69 73 74 69 6e 67 20 64  y pre-existing d
15f10 61 74 61 62 61 73 65 20 77 69 74 68 20 74 68 65  atabase with the
15f20 20 73 61 6d 65 20 66 69 6c 65 0d 0a 20 20 20 20   same file..    
15f30 20 20 23 20 20 20 20 20 20 20 6e 61 6d 65 20 69    #       name i
15f40 66 20 69 74 20 63 75 72 72 65 6e 74 6c 79 20 65  f it currently e
15f50 78 69 73 74 73 2e 0d 0a 20 20 20 20 20 20 23 0d  xists...      #.
15f60 0a 20 20 20 20 20 20 69 66 20 7b 21 24 69 73 4d  .      if {!$isM
15f70 65 6d 6f 72 79 20 26 26 20 24 64 65 6c 65 74 65  emory && $delete
15f80 20 26 26 20 5b 66 69 6c 65 20 65 78 69 73 74 73   && [file exists
15f90 20 24 66 69 6c 65 4e 61 6d 65 5d 7d 20 74 68 65   $fileName]} the
15fa0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  n {..        #..
15fb0 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
15fc0 41 74 74 65 6d 70 74 20 74 6f 20 64 65 6c 65 74  Attempt to delet
15fd0 65 20 61 6e 79 20 70 72 65 2d 65 78 69 73 74 69  e any pre-existi
15fe0 6e 67 20 64 61 74 61 62 61 73 65 20 77 69 74 68  ng database with
15ff0 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65 0d 0a   the same file..
16000 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
16010 6e 61 6d 65 2e 0d 0a 20 20 20 20 20 20 20 20 23  name...        #
16020 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63  ..        if {[c
16030 61 74 63 68 20 7b 66 69 6c 65 20 64 65 6c 65 74  atch {file delet
16040 65 20 24 66 69 6c 65 4e 61 6d 65 7d 20 65 72 72  e $fileName} err
16050 6f 72 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  or]} then {..   
16060 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
16070 20 20 20 20 23 20 4e 4f 54 45 3a 20 57 65 20 73      # NOTE: We s
16080 6f 6d 65 68 6f 77 20 66 61 69 6c 65 64 20 74 6f  omehow failed to
16090 20 64 65 6c 65 74 65 20 74 68 65 20 66 69 6c 65   delete the file
160a0 2c 20 72 65 70 6f 72 74 20 77 68 79 2e 0d 0a 20  , report why... 
160b0 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
160c0 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65        if {!$quie
160d0 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  t} then {..     
160e0 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
160f0 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70  test_channel [ap
16100 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
16110 20 20 20 20 20 20 20 20 20 20 20 20 22 3d 3d 3d              "===
16120 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65  = WARNING: faile
16130 64 20 74 6f 20 64 65 6c 65 74 65 20 64 61 74 61  d to delete data
16140 62 61 73 65 20 66 69 6c 65 20 5c 22 22 20 24 66  base file \"" $f
16150 69 6c 65 4e 61 6d 65 20 5c 0d 0a 20 20 20 20 20  ileName \..     
16160 20 20 20 20 20 20 20 20 20 20 20 22 5c 22 20 64             "\" d
16170 75 72 69 6e 67 20 73 65 74 75 70 2c 20 65 72 72  uring setup, err
16180 6f 72 3a 20 22 20 5c 6e 5c 74 20 24 65 72 72 6f  or: " \n\t $erro
16190 72 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20  r \n]..         
161a0 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20   }..        }.. 
161b0 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
161c0 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
161d0 20 52 65 66 65 72 20 74 6f 20 74 68 65 20 73 70   Refer to the sp
161e0 65 63 69 66 69 65 64 20 76 61 72 69 61 62 6c 65  ecified variable
161f0 20 28 65 2e 67 2e 20 22 64 62 22 29 20 69 6e 20   (e.g. "db") in 
16200 74 68 65 20 63 6f 6e 74 65 78 74 20 6f 66 20 6f  the context of o
16210 75 72 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  ur..      #     
16220 20 20 63 61 6c 6c 65 72 2e 20 20 54 68 65 20 68    caller.  The h
16230 61 6e 64 6c 65 20 74 6f 20 74 68 65 20 6f 70 65  andle to the ope
16240 6e 65 64 20 64 61 74 61 62 61 73 65 20 77 69 6c  ned database wil
16250 6c 20 62 65 20 73 74 6f 72 65 64 20 74 68 65 72  l be stored ther
16260 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  e...      #..   
16270 20 20 20 75 70 76 61 72 20 31 20 24 76 61 72 4e     upvar 1 $varN
16280 61 6d 65 20 64 62 0d 0a 0d 0a 20 20 20 20 20 20  ame db....      
16290 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
162a0 20 53 74 61 72 74 20 62 75 69 6c 64 69 6e 67 20   Start building 
162b0 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73  the connection s
162c0 74 72 69 6e 67 2e 20 20 54 68 65 20 6f 6e 6c 79  tring.  The only
162d0 20 72 65 71 75 69 72 65 64 20 70 6f 72 74 69 6f   required portio
162e0 6e 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  n..      #      
162f0 20 6f 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69   of the connecti
16300 6f 6e 20 73 74 72 69 6e 67 20 69 73 20 74 68 65  on string is the
16310 20 64 61 74 61 20 73 6f 75 72 63 65 2c 20 77 68   data source, wh
16320 69 63 68 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  ich contains the
16330 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
16340 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6e 61  database file na
16350 6d 65 20 69 74 73 65 6c 66 2e 20 20 49 66 20 6f  me itself.  If o
16360 75 72 20 63 61 6c 6c 65 72 20 77 61 6e 74 73 20  ur caller wants 
16370 74 6f 20 75 73 65 20 61 20 55 52 49 20 61 73 0d  to use a URI as.
16380 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74  .      #       t
16390 68 65 20 64 61 74 61 20 73 6f 75 72 63 65 2c 20  he data source, 
163a0 75 73 65 20 74 68 65 20 46 75 6c 6c 55 72 69 20  use the FullUri 
163b0 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 74 72 69 6e  connection strin
163c0 67 20 70 72 6f 70 65 72 74 79 20 74 6f 0d 0a 20  g property to.. 
163d0 20 20 20 20 20 23 20 20 20 20 20 20 20 70 72 65       #       pre
163e0 76 65 6e 74 20 74 68 65 20 64 61 74 61 20 73 6f  vent the data so
163f0 75 72 63 65 20 73 74 72 69 6e 67 20 66 72 6f 6d  urce string from
16400 20 62 65 69 6e 67 20 6d 61 6e 67 6c 65 64 2e 0d   being mangled..
16410 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
16420 69 66 20 7b 24 75 72 69 7d 20 74 68 65 6e 20 7b  if {$uri} then {
16430 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 63 6f  ..        set co
16440 6e 6e 65 63 74 69 6f 6e 20 7b 46 75 6c 6c 55 72  nnection {FullUr
16450 69 3d 24 7b 66 69 6c 65 4e 61 6d 65 7d 7d 0d 0a  i=${fileName}}..
16460 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
16470 20 20 20 20 20 20 20 20 73 65 74 20 63 6f 6e 6e          set conn
16480 65 63 74 69 6f 6e 20 7b 44 61 74 61 20 53 6f 75  ection {Data Sou
16490 72 63 65 3d 24 7b 66 69 6c 65 4e 61 6d 65 7d 7d  rce=${fileName}}
164a0 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
164b0 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
164c0 54 45 3a 20 53 69 6e 63 65 20 74 68 69 73 20 70  TE: Since this p
164d0 72 6f 63 65 64 75 72 65 20 68 61 73 20 6e 6f 20  rocedure has no 
164e0 73 70 65 63 69 61 6c 20 6b 6e 6f 77 6c 65 64 67  special knowledg
164f0 65 20 6f 66 20 77 68 61 74 20 74 68 65 20 64 65  e of what the de
16500 66 61 75 6c 74 0d 0a 20 20 20 20 20 20 23 20 20  fault..      #  
16510 20 20 20 20 20 73 65 74 74 69 6e 67 20 69 73 20       setting is 
16520 66 6f 72 20 74 68 65 20 54 6f 46 75 6c 6c 50 61  for the ToFullPa
16530 74 68 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 74  th connection st
16540 72 69 6e 67 20 70 72 6f 70 65 72 79 2c 20 61 6c  ring propery, al
16550 77 61 79 73 0d 0a 20 20 20 20 20 20 23 20 20 20  ways..      #   
16560 20 20 20 20 61 64 64 20 74 68 65 20 76 61 6c 75      add the valu
16570 65 20 77 65 20 6b 6e 6f 77 20 61 62 6f 75 74 20  e we know about 
16580 74 6f 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  to the connectio
16590 6e 20 73 74 72 69 6e 67 2e 0d 0a 20 20 20 20 20  n string...     
165a0 20 23 0d 0a 20 20 20 20 20 20 61 70 70 65 6e 64   #..      append
165b0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 7b 3b 54 6f   connection {;To
165c0 46 75 6c 6c 50 61 74 68 3d 24 7b 71 75 61 6c 69  FullPath=${quali
165d0 66 79 7d 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d  fy}}....      #.
165e0 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49  .      # NOTE: I
165f0 66 20 6f 75 72 20 63 61 6c 6c 65 72 20 73 70 65  f our caller spe
16600 63 69 66 69 65 64 20 61 20 6a 6f 75 72 6e 61 6c  cified a journal
16610 20 6d 6f 64 65 2c 20 61 64 64 20 74 68 65 20 6e   mode, add the n
16620 65 63 65 73 73 61 72 79 20 70 6f 72 74 69 6f 6e  ecessary portion
16630 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
16640 6f 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  of the connectio
16650 6e 20 73 74 72 69 6e 67 20 6e 6f 77 2e 0d 0a 20  n string now... 
16660 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66       #..      if
16670 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68   {[string length
16680 20 24 6d 6f 64 65 5d 20 3e 20 30 7d 20 74 68 65   $mode] > 0} the
16690 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 61 70 70  n {..        app
166a0 65 6e 64 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 7b  end connection {
166b0 3b 4a 6f 75 72 6e 61 6c 20 4d 6f 64 65 3d 24 7b  ;Journal Mode=${
166c0 6d 6f 64 65 7d 7d 0d 0a 20 20 20 20 20 20 7d 0d  mode}}..      }.
166d0 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
166e0 20 20 23 20 4e 4f 54 45 3a 20 49 66 20 6f 75 72    # NOTE: If our
166f0 20 63 61 6c 6c 65 72 20 73 70 65 63 69 66 69 65   caller specifie
16700 64 20 61 20 44 61 74 65 54 69 6d 65 20 66 6f 72  d a DateTime for
16710 6d 61 74 2c 20 61 64 64 20 74 68 65 20 6e 65 63  mat, add the nec
16720 65 73 73 61 72 79 0d 0a 20 20 20 20 20 20 23 20  essary..      # 
16730 20 20 20 20 20 20 70 6f 72 74 69 6f 6e 20 6f 66        portion of
16740 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
16750 73 74 72 69 6e 67 20 6e 6f 77 2e 0d 0a 20 20 20  string now...   
16760 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
16770 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
16780 64 61 74 65 54 69 6d 65 46 6f 72 6d 61 74 5d 20  dateTimeFormat] 
16790 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  > 0} then {..   
167a0 20 20 20 20 20 61 70 70 65 6e 64 20 63 6f 6e 6e       append conn
167b0 65 63 74 69 6f 6e 20 7b 3b 44 61 74 65 54 69 6d  ection {;DateTim
167c0 65 46 6f 72 6d 61 74 3d 24 7b 64 61 74 65 54 69  eFormat=${dateTi
167d0 6d 65 46 6f 72 6d 61 74 7d 7d 0d 0a 20 20 20 20  meFormat}}..    
167e0 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a    }....      #..
167f0 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 66        # NOTE: If
16800 20 6f 75 72 20 63 61 6c 6c 65 72 20 73 70 65 63   our caller spec
16810 69 66 69 65 64 20 61 20 44 61 74 65 54 69 6d 65  ified a DateTime
16820 4b 69 6e 64 2c 20 61 64 64 20 74 68 65 20 6e 65  Kind, add the ne
16830 63 65 73 73 61 72 79 20 70 6f 72 74 69 6f 6e 0d  cessary portion.
16840 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 6f  .      #       o
16850 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  f the connection
16860 20 73 74 72 69 6e 67 20 6e 6f 77 2e 0d 0a 20 20   string now...  
16870 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20      #..      if 
16880 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20  {[string length 
16890 24 64 61 74 65 54 69 6d 65 4b 69 6e 64 5d 20 3e  $dateTimeKind] >
168a0 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
168b0 20 20 20 20 61 70 70 65 6e 64 20 63 6f 6e 6e 65      append conne
168c0 63 74 69 6f 6e 20 7b 3b 44 61 74 65 54 69 6d 65  ction {;DateTime
168d0 4b 69 6e 64 3d 24 7b 64 61 74 65 54 69 6d 65 4b  Kind=${dateTimeK
168e0 69 6e 64 7d 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a  ind}}..      }..
168f0 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
16900 20 23 20 4e 4f 54 45 3a 20 46 69 67 75 72 65 20   # NOTE: Figure 
16910 6f 75 74 20 77 68 61 74 20 74 68 65 20 66 69 6e  out what the fin
16920 61 6c 20 66 6c 61 67 73 20 66 6f 72 20 74 68 69  al flags for thi
16930 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6e 65 65  s connection nee
16940 64 20 74 6f 20 62 65 2e 0d 0a 20 20 20 20 20 20  d to be...      
16950 23 0d 0a 20 20 20 20 20 20 73 65 74 20 66 6c 61  #..      set fla
16960 67 73 20 5b 67 65 74 43 6f 6e 6e 65 63 74 69 6f  gs [getConnectio
16970 6e 46 6c 61 67 73 20 24 66 69 6c 65 4e 61 6d 65  nFlags $fileName
16980 20 24 66 6c 61 67 73 20 24 71 75 69 65 74 5d 0d   $flags $quiet].
16990 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
169a0 20 20 23 20 4e 4f 54 45 3a 20 49 66 20 6f 75 72    # NOTE: If our
169b0 20 63 61 6c 6c 65 72 20 73 70 65 63 69 66 69 65   caller specifie
169c0 64 20 73 6f 6d 65 20 53 51 4c 69 74 65 43 6f 6e  d some SQLiteCon
169d0 6e 65 63 74 69 6f 6e 46 6c 61 67 73 2c 20 61 64  nectionFlags, ad
169e0 64 20 74 68 65 0d 0a 20 20 20 20 20 20 23 20 20  d the..      #  
169f0 20 20 20 20 20 6e 65 63 65 73 73 61 72 79 20 70       necessary p
16a00 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65 20 63 6f  ortion of the co
16a10 6e 6e 65 63 74 69 6f 6e 20 73 74 72 69 6e 67 20  nnection string 
16a20 6e 6f 77 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  now...      #.. 
16a30 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67       if {[string
16a40 20 6c 65 6e 67 74 68 20 24 66 6c 61 67 73 5d 20   length $flags] 
16a50 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  > 0} then {..   
16a60 20 20 20 20 20 61 70 70 65 6e 64 20 63 6f 6e 6e       append conn
16a70 65 63 74 69 6f 6e 20 7b 3b 46 6c 61 67 73 3d 24  ection {;Flags=$
16a80 7b 66 6c 61 67 73 7d 7d 0d 0a 20 20 20 20 20 20  {flags}}..      
16a90 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  }....      #..  
16aa0 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 66 20 6f      # NOTE: If o
16ab0 75 72 20 63 61 6c 6c 65 72 20 73 70 65 63 69 66  ur caller specif
16ac0 69 65 64 20 61 6e 20 65 78 74 72 61 20 70 61 79  ied an extra pay
16ad0 6c 6f 61 64 20 74 6f 20 74 68 65 20 63 6f 6e 6e  load to the conn
16ae0 65 63 74 69 6f 6e 0d 0a 20 20 20 20 20 20 23 20  ection..      # 
16af0 20 20 20 20 20 20 73 74 72 69 6e 67 2c 20 61 70        string, ap
16b00 70 65 6e 64 20 69 74 20 6e 6f 77 2e 0d 0a 20 20  pend it now...  
16b10 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20      #..      if 
16b20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20  {[string length 
16b30 24 65 78 74 72 61 5d 20 3e 20 30 7d 20 74 68 65  $extra] > 0} the
16b40 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 61 70 70  n {..        app
16b50 65 6e 64 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 5c  end connection \
16b60 3b 20 24 65 78 74 72 61 0d 0a 20 20 20 20 20 20  ; $extra..      
16b70 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  }....      #..  
16b80 20 20 20 20 23 20 4e 4f 54 45 3a 20 46 6f 72 20      # NOTE: For 
16b90 63 6c 61 72 69 74 79 2c 20 61 70 70 65 6e 64 20  clarity, append 
16ba0 61 20 66 69 6e 61 6c 20 73 65 6d 69 63 6f 6c 6f  a final semicolo
16bb0 6e 20 74 6f 20 74 68 65 20 63 6f 6e 6e 65 63 74  n to the connect
16bc0 69 6f 6e 20 73 74 72 69 6e 67 2e 0d 0a 20 20 20  ion string...   
16bd0 20 20 20 23 0d 0a 20 20 20 20 20 20 61 70 70 65     #..      appe
16be0 6e 64 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 5c 3b  nd connection \;
16bf0 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  ....      #..   
16c00 20 20 20 23 20 4e 4f 54 45 3a 20 4f 70 65 6e 20     # NOTE: Open 
16c10 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e  the database con
16c20 6e 65 63 74 69 6f 6e 20 6e 6f 77 2c 20 70 6c 61  nection now, pla
16c30 63 69 6e 67 20 74 68 65 20 6f 70 61 71 75 65 20  cing the opaque 
16c40 68 61 6e 64 6c 65 20 76 61 6c 75 65 0d 0a 20 20  handle value..  
16c50 20 20 20 20 23 20 20 20 20 20 20 20 69 6e 74 6f      #       into
16c60 20 74 68 65 20 76 61 72 69 61 62 6c 65 20 73 70   the variable sp
16c70 65 63 69 66 69 65 64 20 62 79 20 6f 75 72 20 63  ecified by our c
16c80 61 6c 6c 65 72 2e 0d 0a 20 20 20 20 20 20 23 0d  aller...      #.
16c90 0a 20 20 20 20 20 20 73 65 74 20 64 62 20 5b 73  .      set db [s
16ca0 71 6c 20 6f 70 65 6e 20 2d 74 79 70 65 20 53 51  ql open -type SQ
16cb0 4c 69 74 65 20 5b 73 75 62 73 74 20 24 63 6f 6e  Lite [subst $con
16cc0 6e 65 63 74 69 6f 6e 5d 5d 0d 0a 0d 0a 20 20 20  nection]]....   
16cd0 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
16ce0 54 45 3a 20 43 6f 6e 66 69 67 75 72 65 20 74 68  TE: Configure th
16cf0 65 20 74 65 6d 70 6f 72 61 72 79 20 64 69 72 65  e temporary dire
16d00 63 74 6f 72 79 20 66 6f 72 20 74 68 65 20 6e 65  ctory for the ne
16d10 77 6c 79 20 6f 70 65 6e 65 64 20 64 61 74 61 62  wly opened datab
16d20 61 73 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ase..      #    
16d30 20 20 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6e 6f     connection no
16d40 77 20 75 6e 6c 65 73 73 20 6f 75 72 20 63 61 6c  w unless our cal
16d50 6c 65 72 20 66 6f 72 62 69 64 73 20 69 74 2e 0d  ler forbids it..
16d60 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
16d70 69 66 20 7b 24 74 65 6d 70 6f 72 61 72 79 20 26  if {$temporary &
16d80 26 20 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20  & ![info exists 
16d90 3a 3a 6e 6f 28 73 65 74 54 65 6d 70 6f 72 61 72  ::no(setTemporar
16da0 79 44 69 72 65 63 74 6f 72 79 29 5d 7d 20 74 68  yDirectory)]} th
16db0 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 71  en {..        sq
16dc0 6c 20 65 78 65 63 75 74 65 20 24 64 62 20 5b 61  l execute $db [a
16dd0 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
16de0 20 20 20 20 20 20 20 20 20 22 50 52 41 47 4d 41           "PRAGMA
16df0 20 74 65 6d 70 5f 73 74 6f 72 65 5f 64 69 72 65   temp_store_dire
16e00 63 74 6f 72 79 20 3d 20 5c 22 22 20 5b 67 65 74  ctory = \"" [get
16e10 54 65 6d 70 6f 72 61 72 79 44 69 72 65 63 74 6f  TemporaryDirecto
16e20 72 79 5d 20 5c 22 5c 3b 5d 0d 0a 20 20 20 20 20  ry] \"\;]..     
16e30 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20   }....      #.. 
16e40 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 50 65 72       # NOTE: Per
16e50 66 6f 72 6d 20 61 6e 79 20 65 78 74 72 61 20 70  form any extra p
16e60 65 72 2d 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 65  er-connection se
16e70 74 75 70 20 66 6f 72 20 74 68 65 20 6e 65 77 6c  tup for the newl
16e80 79 20 6f 70 65 6e 65 64 0d 0a 20 20 20 20 20 20  y opened..      
16e90 23 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65  #       database
16ea0 20 6e 6f 77 20 75 6e 6c 65 73 73 20 6f 75 72 20   now unless our 
16eb0 63 61 6c 6c 65 72 20 66 6f 72 62 69 64 73 20 69  caller forbids i
16ec0 74 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  t...      #..   
16ed0 20 20 20 73 65 74 20 65 78 65 63 75 74 65 4f 6e     set executeOn
16ee0 53 65 74 75 70 20 5b 67 65 74 45 78 65 63 75 74  Setup [getExecut
16ef0 65 4f 6e 53 65 74 75 70 5d 0d 0a 0d 0a 20 20 20  eOnSetup]....   
16f00 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c     if {[string l
16f10 65 6e 67 74 68 20 24 65 78 65 63 75 74 65 4f 6e  ength $executeOn
16f20 53 65 74 75 70 5d 20 3e 20 30 20 26 26 20 5c 0d  Setup] > 0 && \.
16f30 0a 20 20 20 20 20 20 20 20 20 20 21 5b 69 6e 66  .          ![inf
16f40 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 65 78  o exists ::no(ex
16f50 65 63 75 74 65 4f 6e 53 65 74 75 70 29 5d 7d 20  ecuteOnSetup)]} 
16f60 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
16f70 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
16f80 45 3a 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64 20  E: This command 
16f90 6d 61 79 20 72 61 69 73 65 20 61 6e 20 65 72 72  may raise an err
16fa0 6f 72 3b 20 69 66 20 73 6f 2c 20 74 68 61 74 20  or; if so, that 
16fb0 69 73 20 66 69 6e 65 2c 20 61 73 0d 0a 20 20 20  is fine, as..   
16fc0 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68 65       #       the
16fd0 20 65 6e 63 6c 6f 73 69 6e 67 20 74 65 73 74 20   enclosing test 
16fe0 77 69 6c 6c 20 74 68 65 6e 20 66 61 69 6c 2e 20  will then fail. 
16ff0 20 54 68 65 20 5b 73 75 62 73 74 5d 20 63 6f 6d   The [subst] com
17000 6d 61 6e 64 20 69 73 0d 0a 20 20 20 20 20 20 20  mand is..       
17010 20 23 20 20 20 20 20 20 20 75 73 65 64 20 6f 6e   #       used on
17020 20 74 68 65 20 53 51 4c 20 69 6e 20 63 61 73 65   the SQL in case
17030 20 69 74 20 6e 65 65 64 73 20 74 6f 20 72 65 66   it needs to ref
17040 65 72 20 74 6f 20 73 74 61 74 65 20 69 6e 20 6f  er to state in o
17050 75 72 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  ur..        #   
17060 20 20 20 20 63 6f 6e 74 65 78 74 2e 0d 0a 20 20      context...  
17070 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
17080 20 73 71 6c 20 65 78 65 63 75 74 65 20 24 64 62   sql execute $db
17090 20 5b 73 75 62 73 74 20 24 65 78 65 63 75 74 65   [subst $execute
170a0 4f 6e 53 65 74 75 70 5d 0d 0a 20 20 20 20 20 20  OnSetup]..      
170b0 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  }....      #..  
170c0 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 6c 77 61      # NOTE: Alwa
170d0 79 73 20 72 65 74 75 72 6e 20 74 68 65 20 63 6f  ys return the co
170e0 6e 6e 65 63 74 69 6f 6e 20 68 61 6e 64 6c 65 20  nnection handle 
170f0 75 70 6f 6e 20 73 75 63 63 65 73 73 2e 0d 0a 20  upon success... 
17100 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 72 65       #..      re
17110 74 75 72 6e 20 24 64 62 0d 0a 20 20 20 20 7d 0d  turn $db..    }.
17120 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74  ....    proc get
17130 44 62 43 6f 6e 6e 65 63 74 69 6f 6e 20 7b 20 7b  DbConnection { {
17140 76 61 72 4e 61 6d 65 20 64 62 7d 20 7d 20 7b 0d  varName db} } {.
17150 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
17160 23 20 4e 4f 54 45 3a 20 52 65 66 65 72 20 74 6f  # NOTE: Refer to
17170 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 76   the specified v
17180 61 72 69 61 62 6c 65 20 28 65 2e 67 2e 20 22 64  ariable (e.g. "d
17190 62 22 29 20 69 6e 20 74 68 65 20 63 6f 6e 74 65  b") in the conte
171a0 78 74 20 6f 66 20 6f 75 72 0d 0a 20 20 20 20 20  xt of our..     
171b0 20 23 20 20 20 20 20 20 20 63 61 6c 6c 65 72 2e   #       caller.
171c0 20 20 54 68 65 20 68 61 6e 64 6c 65 20 74 6f 20    The handle to 
171d0 74 68 65 20 64 61 74 61 62 61 73 65 20 70 72 65  the database pre
171e0 76 69 6f 75 73 6c 79 20 6f 70 65 6e 65 64 20 76  viously opened v
171f0 69 61 20 74 68 65 0d 0a 20 20 20 20 20 20 23 20  ia the..      # 
17200 20 20 20 20 20 20 5b 73 65 74 75 70 44 62 5d 20        [setupDb] 
17210 70 72 6f 63 65 64 75 72 65 20 73 68 6f 75 6c 64  procedure should
17220 20 62 65 20 73 74 6f 72 65 64 20 74 68 65 72 65   be stored there
17230 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
17240 20 20 75 70 76 61 72 20 31 20 24 76 61 72 4e 61    upvar 1 $varNa
17250 6d 65 20 64 62 0d 0a 0d 0a 20 20 20 20 20 20 23  me db....      #
17260 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
17270 54 68 69 73 20 72 65 74 75 72 6e 73 20 74 68 65  This returns the
17280 20 41 44 4f 2e 4e 45 54 20 49 44 62 43 6f 6e 6e   ADO.NET IDbConn
17290 65 63 74 69 6f 6e 20 6f 62 6a 65 63 74 20 69 6e  ection object in
172a0 73 74 61 6e 63 65 20 66 6f 72 20 74 68 65 0d 0a  stance for the..
172b0 20 20 20 20 20 20 23 20 20 20 20 20 20 20 73 70        #       sp
172c0 65 63 69 66 69 65 64 20 64 61 74 61 62 73 65 20  ecified databse 
172d0 68 61 6e 64 6c 65 2e 20 20 53 69 6e 63 65 20 67  handle.  Since g
172e0 65 74 74 69 6e 67 20 74 68 69 73 20 6f 62 6a 65  etting this obje
172f0 63 74 20 72 65 6c 69 65 73 20 75 70 6f 6e 0d 0a  ct relies upon..
17300 20 20 20 20 20 20 23 20 20 20 20 20 20 20 45 61        #       Ea
17310 67 6c 65 20 69 6e 74 65 72 6e 61 6c 73 2c 20 67  gle internals, g
17320 72 65 61 74 20 63 61 72 65 20 73 68 6f 75 6c 64  reat care should
17330 20 62 65 20 74 61 6b 65 6e 20 74 6f 20 61 76 6f   be taken to avo
17340 69 64 20 64 69 73 70 6f 73 69 6e 67 20 6f 66 0d  id disposing of.
17350 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74  .      #       t
17360 68 69 73 20 6f 62 6a 65 63 74 20 6f 72 20 6f 74  his object or ot
17370 68 65 72 77 69 73 65 20 70 75 74 74 69 6e 67 20  herwise putting 
17380 69 74 20 69 6e 74 6f 20 61 6e 20 69 6e 76 61 6c  it into an inval
17390 69 64 20 73 74 61 74 65 2e 0d 0a 20 20 20 20 20  id state...     
173a0 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69   #..      if {[i
173b0 6e 66 6f 20 65 78 69 73 74 73 20 64 62 5d 7d 20  nfo exists db]} 
173c0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
173d0 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20  if {[catch {..  
173e0 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69          object i
173f0 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f  nvoke -flags +No
17400 6e 50 75 62 6c 69 63 20 2d 6f 62 6a 65 63 74 66  nPublic -objectf
17410 6c 61 67 73 20 2b 4e 6f 44 69 73 70 6f 73 65 20  lags +NoDispose 
17420 2d 61 6c 69 61 73 20 5c 0d 0a 20 20 20 20 20 20  -alias \..      
17430 20 20 20 20 20 20 20 20 49 6e 74 65 72 70 72 65          Interpre
17440 74 65 72 2e 47 65 74 41 63 74 69 76 65 2e 63 6f  ter.GetActive.co
17450 6e 6e 65 63 74 69 6f 6e 73 20 49 74 65 6d 20 24  nnections Item $
17460 64 62 0d 0a 20 20 20 20 20 20 20 20 7d 20 72 65  db..        } re
17470 73 75 6c 74 5d 20 3d 3d 20 30 7d 20 74 68 65 6e  sult] == 0} then
17480 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d   {..          #.
17490 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54  .          # NOT
174a0 45 3a 20 53 75 63 63 65 73 73 2c 20 72 65 74 75  E: Success, retu
174b0 72 6e 20 74 68 65 20 6f 70 61 71 75 65 20 6f 62  rn the opaque ob
174c0 6a 65 63 74 20 68 61 6e 64 6c 65 2e 0d 0a 20 20  ject handle...  
174d0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
174e0 20 20 20 20 20 72 65 74 75 72 6e 20 24 72 65 73       return $res
174f0 75 6c 74 0d 0a 20 20 20 20 20 20 20 20 7d 20 65  ult..        } e
17500 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  lse {..         
17510 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20   #..          # 
17520 4e 4f 54 45 3a 20 46 61 69 6c 75 72 65 2c 20 72  NOTE: Failure, r
17530 65 70 6f 72 74 20 77 68 79 2e 0d 0a 20 20 20 20  eport why...    
17540 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
17550 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
17560 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  _channel [append
17570 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
17580 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e        "==== WARN
17590 49 4e 47 3a 20 66 61 69 6c 65 64 20 74 6f 20 67  ING: failed to g
175a0 65 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61  et connection ha
175b0 6e 64 6c 65 20 66 6f 72 20 64 61 74 61 62 61 73  ndle for databas
175c0 65 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20 20  e \"" \..       
175d0 20 20 20 20 20 20 20 24 64 62 20 22 5c 22 2c 20         $db "\", 
175e0 65 72 72 6f 72 3a 20 22 20 5c 6e 5c 74 20 24 72  error: " \n\t $r
175f0 65 73 75 6c 74 20 5c 6e 5d 0d 0a 20 20 20 20 20  esult \n]..     
17600 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d     }..      }...
17610 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
17620 23 20 4e 4f 54 45 3a 20 46 61 69 6c 75 72 65 2c  # NOTE: Failure,
17630 20 72 65 74 75 72 6e 20 61 6e 20 6f 62 76 69 6f   return an obvio
17640 75 73 6c 79 20 69 6e 76 61 6c 69 64 20 6f 70 61  usly invalid opa
17650 71 75 65 20 6f 62 6a 65 63 74 20 68 61 6e 64 6c  que object handl
17660 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  e...      #..   
17670 20 20 20 72 65 74 75 72 6e 20 22 22 0d 0a 20 20     return ""..  
17680 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
17690 20 66 72 65 65 44 62 43 6f 6e 6e 65 63 74 69 6f   freeDbConnectio
176a0 6e 20 7b 20 7b 76 61 72 4e 61 6d 65 20 63 6f 6e  n { {varName con
176b0 6e 65 63 74 69 6f 6e 7d 20 7d 20 7b 0d 0a 20 20  nection} } {..  
176c0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
176d0 4f 54 45 3a 20 52 65 66 65 72 20 74 6f 20 74 68  OTE: Refer to th
176e0 65 20 73 70 65 63 69 66 69 65 64 20 76 61 72 69  e specified vari
176f0 61 62 6c 65 20 28 65 2e 67 2e 20 22 63 6f 6e 6e  able (e.g. "conn
17700 65 63 74 69 6f 6e 22 29 20 69 6e 20 74 68 65 0d  ection") in the.
17710 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63  .      #       c
17720 6f 6e 74 65 78 74 20 6f 66 20 6f 75 72 20 63 61  ontext of our ca
17730 6c 6c 65 72 2e 20 20 54 68 65 20 6f 70 61 71 75  ller.  The opaqu
17740 65 20 6f 62 6a 65 63 74 20 68 61 6e 64 6c 65 20  e object handle 
17750 66 6f 72 20 61 6e 20 41 44 4f 2e 4e 45 54 0d 0a  for an ADO.NET..
17760 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63 6f        #       co
17770 6e 6e 65 63 74 69 6f 6e 20 70 72 65 76 69 6f 75  nnection previou
17780 73 6c 79 20 72 65 74 75 72 6e 65 64 20 62 79 20  sly returned by 
17790 5b 67 65 74 44 62 43 6f 6e 6e 65 63 74 69 6f 6e  [getDbConnection
177a0 5d 20 73 68 6f 75 6c 64 20 62 65 0d 0a 20 20 20  ] should be..   
177b0 20 20 20 23 20 20 20 20 20 20 20 73 74 6f 72 65     #       store
177c0 64 20 74 68 65 72 65 2e 0d 0a 20 20 20 20 20 20  d there...      
177d0 23 0d 0a 20 20 20 20 20 20 75 70 76 61 72 20 31  #..      upvar 1
177e0 20 24 76 61 72 4e 61 6d 65 20 63 6f 6e 6e 65 63   $varName connec
177f0 74 69 6f 6e 0d 0a 0d 0a 20 20 20 20 20 20 23 0d  tion....      #.
17800 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41  .      # NOTE: A
17810 74 74 65 6d 70 74 20 74 6f 20 72 65 6d 6f 76 65  ttempt to remove
17820 20 74 68 65 20 6f 70 61 71 75 65 20 6f 62 6a 65   the opaque obje
17830 63 74 20 68 61 6e 64 6c 65 20 66 72 6f 6d 20 74  ct handle from t
17840 68 65 20 69 6e 74 65 72 70 72 65 74 65 72 0d 0a  he interpreter..
17850 20 20 20 20 20 20 23 20 20 20 20 20 20 20 6e 6f        #       no
17860 77 2e 20 20 54 68 69 73 20 5b 6f 62 6a 65 63 74  w.  This [object
17870 20 64 69 73 70 6f 73 65 5d 20 63 61 6c 6c 20 77   dispose] call w
17880 69 6c 6c 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79  ill not actually
17890 20 64 69 73 70 6f 73 65 20 6f 66 20 74 68 65 0d   dispose of the.
178a0 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 75  .      #       u
178b0 6e 64 65 72 6c 79 69 6e 67 20 6f 62 6a 65 63 74  nderlying object
178c0 20 62 65 63 61 75 73 65 20 74 68 65 20 2b 4e 6f   because the +No
178d0 44 69 73 70 6f 73 65 20 66 6c 61 67 20 77 61 73  Dispose flag was
178e0 20 73 65 74 20 6f 6e 20 69 74 0d 0a 20 20 20 20   set on it..    
178f0 20 20 23 20 20 20 20 20 20 20 64 75 72 69 6e 67    #       during
17900 20 63 72 65 61 74 69 6f 6e 20 6f 66 20 74 68 65   creation of the
17910 20 6f 70 61 71 75 65 20 6f 62 6a 65 63 74 20 68   opaque object h
17920 61 6e 64 6c 65 2e 0d 0a 20 20 20 20 20 20 23 0d  andle...      #.
17930 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f  .      if {[info
17940 20 65 78 69 73 74 73 20 63 6f 6e 6e 65 63 74 69   exists connecti
17950 6f 6e 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20  on] && \..      
17960 20 20 20 20 5b 63 61 74 63 68 20 7b 6f 62 6a 65      [catch {obje
17970 63 74 20 64 69 73 70 6f 73 65 20 24 63 6f 6e 6e  ct dispose $conn
17980 65 63 74 69 6f 6e 7d 20 65 72 72 6f 72 5d 7d 20  ection} error]} 
17990 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
179a0 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
179b0 45 3a 20 57 65 20 73 6f 6d 65 68 6f 77 20 66 61  E: We somehow fa
179c0 69 6c 65 64 20 74 6f 20 72 65 6d 6f 76 65 20 74  iled to remove t
179d0 68 65 20 68 61 6e 64 6c 65 2c 20 72 65 70 6f 72  he handle, repor
179e0 74 20 77 68 79 2e 0d 0a 20 20 20 20 20 20 20 20  t why...        
179f0 23 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73  #..        tputs
17a00 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
17a10 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
17a20 20 20 20 20 20 20 20 20 20 20 20 20 22 3d 3d 3d              "===
17a30 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65  = WARNING: faile
17a40 64 20 74 6f 20 72 65 6d 6f 76 65 20 63 6f 6e 6e  d to remove conn
17a50 65 63 74 69 6f 6e 20 68 61 6e 64 6c 65 20 5c 22  ection handle \"
17a60 22 20 24 63 6f 6e 6e 65 63 74 69 6f 6e 20 5c 0d  " $connection \.
17a70 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 5c 22  .            "\"
17a80 2c 20 65 72 72 6f 72 3a 20 22 20 5c 6e 5c 74 20  , error: " \n\t 
17a90 24 65 72 72 6f 72 20 5c 6e 5d 0d 0a 20 20 20 20  $error \n]..    
17aa0 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20    }..    }..... 
17ab0 20 20 20 70 72 6f 63 20 61 64 64 44 62 43 6f 6e     proc addDbCon
17ac0 6e 65 63 74 69 6f 6e 20 7b 20 63 6f 6e 6e 65 63  nection { connec
17ad0 74 69 6f 6e 20 7b 76 61 72 4e 61 6d 65 20 64 62  tion {varName db
17ae0 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a  } } {..      #..
17af0 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 52 65        # NOTE: Re
17b00 66 65 72 20 74 6f 20 74 68 65 20 73 70 65 63 69  fer to the speci
17b10 66 69 65 64 20 76 61 72 69 61 62 6c 65 20 28 65  fied variable (e
17b20 2e 67 2e 20 22 64 62 22 29 20 69 6e 20 74 68 65  .g. "db") in the
17b30 20 63 6f 6e 74 65 78 74 20 6f 66 20 6f 75 72 0d   context of our.
17b40 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63  .      #       c
17b50 61 6c 6c 65 72 2e 0d 0a 20 20 20 20 20 20 23 0d  aller...      #.
17b60 0a 20 20 20 20 20 20 75 70 76 61 72 20 31 20 24  .      upvar 1 $
17b70 76 61 72 4e 61 6d 65 20 64 62 0d 0a 0d 0a 20 20  varName db....  
17b80 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
17b90 4f 54 45 3a 20 43 72 65 61 74 65 20 61 20 63 6f  OTE: Create a co
17ba0 72 72 65 63 74 6c 79 20 66 6f 72 6d 61 74 74 65  rrectly formatte
17bb0 64 20 6e 61 6d 65 20 66 6f 72 20 74 68 65 20 64  d name for the d
17bc0 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
17bd0 6f 6e 20 74 6f 0d 0a 20 20 20 20 20 20 23 20 20  on to..      #  
17be0 20 20 20 20 20 62 65 20 61 64 64 65 64 20 74 6f       be added to
17bf0 20 74 68 65 20 6c 69 73 74 20 6d 61 6e 61 67 65   the list manage
17c00 64 20 62 79 20 74 68 65 20 45 61 67 6c 65 20 69  d by the Eagle i
17c10 6e 74 65 72 70 72 65 74 65 72 2e 0d 0a 20 20 20  nterpreter...   
17c20 20 20 20 23 0d 0a 20 20 20 20 20 20 73 65 74 20     #..      set 
17c30 64 62 20 5b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b  db [object invok
17c40 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62  e -flags +NonPub
17c50 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  lic \..         
17c60 20 45 61 67 6c 65 2e 5f 43 6f 6d 70 6f 6e 65 6e   Eagle._Componen
17c70 74 73 2e 50 72 69 76 61 74 65 2e 46 6f 72 6d 61  ts.Private.Forma
17c80 74 4f 70 73 20 44 61 74 61 62 61 73 65 4f 62 6a  tOps DatabaseObj
17c90 65 63 74 4e 61 6d 65 20 24 63 6f 6e 6e 65 63 74  ectName $connect
17ca0 69 6f 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ion \..         
17cb0 20 53 51 4c 69 74 65 43 6f 6e 6e 65 63 74 69 6f   SQLiteConnectio
17cc0 6e 20 5b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65  n [object invoke
17cd0 20 49 6e 74 65 72 70 72 65 74 65 72 2e 47 65 74   Interpreter.Get
17ce0 41 63 74 69 76 65 20 4e 65 78 74 49 64 5d 5d 0d  Active NextId]].
17cf0 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
17d00 20 20 23 20 4e 4f 54 45 3a 20 41 64 64 20 74 68    # NOTE: Add th
17d10 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
17d20 63 74 69 6f 6e 20 70 72 6f 76 69 64 65 64 20 62  ction provided b
17d30 79 20 6f 75 72 20 63 61 6c 6c 65 72 20 74 6f 20  y our caller to 
17d40 74 68 65 20 6c 69 73 74 0d 0a 20 20 20 20 20 20  the list..      
17d50 23 20 20 20 20 20 20 20 6f 66 20 74 68 6f 73 65  #       of those
17d60 20 6b 6e 6f 77 6e 20 74 6f 20 74 68 65 20 45 61   known to the Ea
17d70 67 6c 65 20 69 6e 74 65 72 70 72 65 74 65 72 2e  gle interpreter.
17d80 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
17d90 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d   object invoke -
17da0 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63  flags +NonPublic
17db0 20 49 6e 74 65 72 70 72 65 74 65 72 2e 47 65 74   Interpreter.Get
17dc0 41 63 74 69 76 65 2e 63 6f 6e 6e 65 63 74 69 6f  Active.connectio
17dd0 6e 73 20 41 64 64 20 5c 0d 0a 20 20 20 20 20 20  ns Add \..      
17de0 20 20 20 20 24 64 62 20 24 63 6f 6e 6e 65 63 74      $db $connect
17df0 69 6f 6e 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20  ion..    }..... 
17e00 20 20 20 70 72 6f 63 20 72 65 6d 6f 76 65 44 62     proc removeDb
17e10 54 72 61 6e 73 61 63 74 69 6f 6e 20 7b 20 74 72  Transaction { tr
17e20 61 6e 73 61 63 74 69 6f 6e 20 7d 20 7b 0d 0a 20  ansaction } {.. 
17e30 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
17e40 4e 4f 54 45 3a 20 52 65 6d 6f 76 65 20 74 68 65  NOTE: Remove the
17e50 20 64 61 74 61 62 61 73 65 20 74 72 61 6e 73 61   database transa
17e60 63 74 69 6f 6e 20 70 72 6f 76 69 64 65 64 20 62  ction provided b
17e70 79 20 6f 75 72 20 63 61 6c 6c 65 72 20 66 72 6f  y our caller fro
17e80 6d 20 74 68 65 0d 0a 20 20 20 20 20 20 23 20 20  m the..      #  
17e90 20 20 20 20 20 6c 69 73 74 20 6f 66 20 74 68 6f       list of tho
17ea0 73 65 20 6b 6e 6f 77 6e 20 74 6f 20 74 68 65 20  se known to the 
17eb0 45 61 67 6c 65 20 69 6e 74 65 72 70 72 65 74 65  Eagle interprete
17ec0 72 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  r...      #..   
17ed0 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65     object invoke
17ee0 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c   -flags +NonPubl
17ef0 69 63 20 49 6e 74 65 72 70 72 65 74 65 72 2e 47  ic Interpreter.G
17f00 65 74 41 63 74 69 76 65 2e 74 72 61 6e 73 61 63  etActive.transac
17f10 74 69 6f 6e 73 20 5c 0d 0a 20 20 20 20 20 20 20  tions \..       
17f20 20 20 20 52 65 6d 6f 76 65 20 24 74 72 61 6e 73     Remove $trans
17f30 61 63 74 69 6f 6e 0d 0a 20 20 20 20 7d 0d 0a 0c  action..    }...
17f40 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74 52 6f  ..    proc getRo
17f50 77 73 46 72 6f 6d 44 61 74 61 54 61 62 6c 65 20  wsFromDataTable 
17f60 7b 20 64 61 74 61 54 61 62 6c 65 20 7b 76 61 6c  { dataTable {val
17f70 75 65 43 61 6c 6c 62 61 63 6b 20 22 22 7d 20 7d  ueCallback ""} }
17f80 20 7b 0d 0a 20 20 20 20 20 20 73 65 74 20 72 6f   {..      set ro
17f90 77 73 20 5b 6c 69 73 74 5d 0d 0a 20 20 20 20 20  ws [list]..     
17fa0 20 73 65 74 20 63 6f 75 6e 74 20 5b 24 64 61 74   set count [$dat
17fb0 61 54 61 62 6c 65 20 43 6f 6c 75 6d 6e 73 2e 43  aTable Columns.C
17fc0 6f 75 6e 74 5d 0d 0a 0d 0a 20 20 20 20 20 20 66  ount]....      f
17fd0 6f 72 20 7b 73 65 74 20 69 6e 64 65 78 20 30 7d  or {set index 0}
17fe0 20 7b 24 69 6e 64 65 78 20 3c 20 24 63 6f 75 6e   {$index < $coun
17ff0 74 7d 20 7b 69 6e 63 72 20 69 6e 64 65 78 7d 20  t} {incr index} 
18000 7b 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 64  {..        set d
18010 61 74 61 43 6f 6c 75 6d 6e 20 5b 24 64 61 74 61  ataColumn [$data
18020 54 61 62 6c 65 20 2d 61 6c 69 61 73 20 43 6f 6c  Table -alias Col
18030 75 6d 6e 73 2e 67 65 74 5f 49 74 65 6d 20 24 69  umns.get_Item $i
18040 6e 64 65 78 5d 0d 0a 20 20 20 20 20 20 20 20 73  ndex]..        s
18050 65 74 20 6e 61 6d 65 73 28 24 69 6e 64 65 78 29  et names($index)
18060 20 5b 24 64 61 74 61 43 6f 6c 75 6d 6e 20 43 6f   [$dataColumn Co
18070 6c 75 6d 6e 4e 61 6d 65 5d 0d 0a 20 20 20 20 20  lumnName]..     
18080 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20   }....      #.. 
18090 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 65 74       # NOTE: Set
180a0 75 70 20 73 6f 6d 65 20 54 63 6c 20 72 65 74 75  up some Tcl retu
180b0 72 6e 20 63 6f 64 65 20 63 6f 6e 73 74 61 6e 74  rn code constant
180c0 73 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  s...      #..   
180d0 20 20 20 73 65 74 20 4f 6b 20 30 3b 20 73 65 74     set Ok 0; set
180e0 20 45 72 72 6f 72 20 31 3b 20 73 65 74 20 52 65   Error 1; set Re
180f0 74 75 72 6e 20 32 3b 20 73 65 74 20 42 72 65 61  turn 2; set Brea
18100 6b 20 33 3b 20 73 65 74 20 43 6f 6e 74 69 6e 75  k 3; set Continu
18110 65 20 34 0d 0a 0d 0a 20 20 20 20 20 20 6f 62 6a  e 4....      obj
18120 65 63 74 20 66 6f 72 65 61 63 68 20 2d 61 6c 69  ect foreach -ali
18130 61 73 20 64 61 74 61 52 6f 77 20 5b 73 65 74 20  as dataRow [set 
18140 64 61 74 61 52 6f 77 73 20 5b 24 64 61 74 61 54  dataRows [$dataT
18150 61 62 6c 65 20 52 6f 77 73 5d 5d 20 7b 0d 0a 20  able Rows]] {.. 
18160 20 20 20 20 20 20 20 73 65 74 20 72 6f 77 20 5b         set row [
18170 6c 69 73 74 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  list]....       
18180 20 66 6f 72 20 7b 73 65 74 20 69 6e 64 65 78 20   for {set index 
18190 30 7d 20 7b 24 69 6e 64 65 78 20 3c 20 24 63 6f  0} {$index < $co
181a0 75 6e 74 7d 20 7b 69 6e 63 72 20 69 6e 64 65 78  unt} {incr index
181b0 7d 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73  } {..          s
181c0 65 74 20 76 61 6c 75 65 20 5b 24 64 61 74 61 52  et value [$dataR
181d0 6f 77 20 2d 63 72 65 61 74 65 20 2d 61 6c 69 61  ow -create -alia
181e0 73 20 67 65 74 5f 49 74 65 6d 20 24 69 6e 64 65  s get_Item $inde
181f0 78 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  x]....          
18200 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67  if {[string leng
18210 74 68 20 24 76 61 6c 75 65 43 61 6c 6c 62 61 63  th $valueCallbac
18220 6b 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  k] > 0} then {..
18230 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20              set 
18240 63 6f 64 65 20 5b 63 61 74 63 68 20 7b 0d 0a 20  code [catch {.. 
18250 20 20 20 20 20 20 20 20 20 20 20 20 20 24 76 61               $va
18260 6c 75 65 43 61 6c 6c 62 61 63 6b 20 24 64 61 74  lueCallback $dat
18270 61 54 61 62 6c 65 20 24 64 61 74 61 52 6f 77 20  aTable $dataRow 
18280 24 69 6e 64 65 78 20 24 76 61 6c 75 65 0d 0a 20  $index $value.. 
18290 20 20 20 20 20 20 20 20 20 20 20 7d 20 6e 65 77             } new
182a0 56 61 6c 75 65 5d 0d 0a 0d 0a 20 20 20 20 20 20  Value]....      
182b0 20 20 20 20 20 20 69 66 20 7b 24 63 6f 64 65 20        if {$code 
182c0 3d 3d 20 24 4f 6b 7d 20 74 68 65 6e 20 7b 0d 0a  == $Ok} then {..
182d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 0d                #.
182e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23  .              #
182f0 20 4e 4f 54 45 3a 20 55 73 65 20 74 68 65 20 73   NOTE: Use the s
18300 70 65 63 69 66 69 65 64 20 28 6e 65 77 3f 29 20  pecified (new?) 
18310 72 6f 77 20 76 61 6c 75 65 2e 0d 0a 20 20 20 20  row value...    
18320 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
18330 20 20 20 20 20 20 20 20 20 20 20 6c 61 70 70 65             lappe
18340 6e 64 20 72 6f 77 20 5b 6c 69 73 74 20 24 6e 61  nd row [list $na
18350 6d 65 73 28 24 69 6e 64 65 78 29 20 24 6e 65 77  mes($index) $new
18360 56 61 6c 75 65 5d 0d 0a 20 20 20 20 20 20 20 20  Value]..        
18370 20 20 20 20 7d 20 65 6c 73 65 69 66 20 7b 24 63      } elseif {$c
18380 6f 64 65 20 3d 3d 20 24 45 72 72 6f 72 7d 20 74  ode == $Error} t
18390 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
183a0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
183b0 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 55 73        # NOTE: Us
183c0 65 20 74 68 65 20 28 6e 65 77 3f 29 20 4e 55 4c  e the (new?) NUL
183d0 4c 20 72 6f 77 20 76 61 6c 75 65 2e 0d 0a 20 20  L row value...  
183e0 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20              #.. 
183f0 20 20 20 20 20 20 20 20 20 20 20 20 20 6c 61 70               lap
18400 70 65 6e 64 20 72 6f 77 20 5b 6c 69 73 74 20 24  pend row [list $
18410 6e 61 6d 65 73 28 24 69 6e 64 65 78 29 5d 0d 0a  names($index)]..
18420 20 20 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c              } el
18430 73 65 69 66 20 7b 24 63 6f 64 65 20 3d 3d 20 24  seif {$code == $
18440 52 65 74 75 72 6e 7d 20 74 68 65 6e 20 7b 0d 0a  Return} then {..
18450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 0d                #.
18460 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23  .              #
18470 20 4e 4f 54 45 3a 20 53 6b 69 70 20 72 65 6d 61   NOTE: Skip rema
18480 69 6e 69 6e 67 20 76 61 6c 75 65 73 20 66 6f 72  ining values for
18490 20 74 68 69 73 20 72 6f 77 2e 0d 0a 20 20 20 20   this row...    
184a0 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
184b0 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
184c0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 20  ..            } 
184d0 65 6c 73 65 69 66 20 7b 24 63 6f 64 65 20 3d 3d  elseif {$code ==
184e0 20 24 42 72 65 61 6b 7d 20 74 68 65 6e 20 7b 0d   $Break} then {.
184f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23  .              #
18500 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
18510 23 20 4e 4f 54 45 3a 20 53 6b 69 70 20 70 72 6f  # NOTE: Skip pro
18520 63 65 73 73 69 6e 67 20 74 68 69 73 20 72 6f 77  cessing this row
18530 20 76 61 6c 75 65 2e 0d 0a 20 20 20 20 20 20 20   value...       
18540 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
18550 20 20 20 20 20 20 7d 20 65 6c 73 65 69 66 20 7b        } elseif {
18560 24 63 6f 64 65 20 3d 3d 20 24 43 6f 6e 74 69 6e  $code == $Contin
18570 75 65 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  ue} then {..    
18580 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
18590 20 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54             # NOT
185a0 45 3a 20 55 73 65 20 64 65 66 61 75 6c 74 20 72  E: Use default r
185b0 6f 77 20 76 61 6c 75 65 20 68 61 6e 64 6c 69 6e  ow value handlin
185c0 67 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  g...            
185d0 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20    #..           
185e0 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 20   }..          } 
185f0 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
18600 20 20 20 20 73 65 74 20 63 6f 64 65 20 24 43 6f      set code $Co
18610 6e 74 69 6e 75 65 0d 0a 20 20 20 20 20 20 20 20  ntinue..        
18620 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20    }....         
18630 20 69 66 20 7b 24 63 6f 64 65 20 3d 3d 20 24 43   if {$code == $C
18640 6f 6e 74 69 6e 75 65 7d 20 74 68 65 6e 20 7b 0d  ontinue} then {.
18650 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20  .            if 
18660 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20  {[string length 
18670 24 76 61 6c 75 65 5d 20 3e 20 30 20 26 26 20 5c  $value] > 0 && \
18680 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
18690 20 20 21 5b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b    ![object invok
186a0 65 20 43 6f 6e 76 65 72 74 20 49 73 44 42 4e 75  e Convert IsDBNu
186b0 6c 6c 20 24 76 61 6c 75 65 5d 7d 20 74 68 65 6e  ll $value]} then
186c0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
186d0 20 20 6c 61 70 70 65 6e 64 20 72 6f 77 20 5b 6c    lappend row [l
186e0 69 73 74 20 24 6e 61 6d 65 73 28 24 69 6e 64 65  ist $names($inde
186f0 78 29 20 5b 24 76 61 6c 75 65 20 54 6f 53 74 72  x) [$value ToStr
18700 69 6e 67 5d 5d 0d 0a 20 20 20 20 20 20 20 20 20  ing]]..         
18710 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
18720 20 20 20 20 20 20 20 20 20 20 20 6c 61 70 70 65             lappe
18730 6e 64 20 72 6f 77 20 5b 6c 69 73 74 20 24 6e 61  nd row [list $na
18740 6d 65 73 28 24 69 6e 64 65 78 29 5d 0d 0a 20 20  mes($index)]..  
18750 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
18760 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
18770 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 6c    }....        l
18780 61 70 70 65 6e 64 20 72 6f 77 73 20 24 72 6f 77  append rows $row
18790 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
187a0 20 20 20 72 65 74 75 72 6e 20 24 72 6f 77 73 0d     return $rows.
187b0 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70  .    }.....    p
187c0 72 6f 63 20 64 75 6d 70 52 6f 77 73 46 72 6f 6d  roc dumpRowsFrom
187d0 44 61 74 61 54 61 62 6c 65 20 7b 20 63 68 61 6e  DataTable { chan
187e0 6e 65 6c 20 72 6f 77 73 20 7d 20 7b 0d 0a 20 20  nel rows } {..  
187f0 20 20 20 20 73 65 74 20 73 65 71 75 65 6e 63 65      set sequence
18800 20 31 0d 0a 0d 0a 20 20 20 20 20 20 66 6f 72 65   1....      fore
18810 61 63 68 20 72 6f 77 20 24 72 6f 77 73 20 7b 0d  ach row $rows {.
18820 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24  .        tputs $
18830 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
18840 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
18850 20 20 20 5b 65 78 70 72 20 7b 24 73 65 71 75 65     [expr {$seque
18860 6e 63 65 20 3e 20 31 20 3f 20 22 5c 6e 22 20 3a  nce > 1 ? "\n" :
18870 20 22 22 7d 5d 20 22 2d 2d 2d 2d 20 52 4f 57 20   ""}] "---- ROW 
18880 23 22 20 24 73 65 71 75 65 6e 63 65 20 3a 5c 6e  #" $sequence :\n
18890 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 66 6f 72  ]....        for
188a0 65 61 63 68 20 70 61 69 72 20 24 72 6f 77 20 7b  each pair $row {
188b0 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b  ..          if {
188c0 5b 6c 6c 65 6e 67 74 68 20 24 70 61 69 72 5d 20  [llength $pair] 
188d0 3e 3d 20 32 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  >= 2} then {..  
188e0 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
188f0 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  $channel [append
18900 41 72 67 73 20 5c 74 20 5c 0d 0a 20 20 20 20 20  Args \t \..     
18910 20 20 20 20 20 20 20 20 20 20 20 5b 6c 69 73 74             [list
18920 20 5b 6c 69 6e 64 65 78 20 24 70 61 69 72 20 30   [lindex $pair 0
18930 5d 5d 20 22 3a 20 22 20 5b 6c 69 73 74 20 5b 6c  ]] ": " [list [l
18940 69 6e 64 65 78 20 24 70 61 69 72 20 31 5d 5d 20  index $pair 1]] 
18950 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  \n]..          }
18960 20 65 6c 73 65 69 66 20 7b 5b 6c 6c 65 6e 67 74   elseif {[llengt
18970 68 20 24 70 61 69 72 5d 20 3d 3d 20 31 7d 20 74  h $pair] == 1} t
18980 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
18990 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
189a0 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 74  l [appendArgs \t
189b0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
189c0 20 20 20 20 5b 6c 69 73 74 20 5b 6c 69 6e 64 65      [list [linde
189d0 78 20 24 70 61 69 72 20 30 5d 5d 20 22 3a 20 3c  x $pair 0]] ": <
189e0 6e 75 6c 6c 3e 5c 6e 22 5d 0d 0a 20 20 20 20 20  null>\n"]..     
189f0 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
18a00 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
18a10 20 24 63 68 61 6e 6e 65 6c 20 5c 74 3c 65 6d 70   $channel \t<emp
18a20 74 79 3e 5c 6e 3b 20 23 20 4e 4f 54 45 3a 20 4e  ty>\n; # NOTE: N
18a30 6f 20 64 61 74 61 3f 0d 0a 20 20 20 20 20 20 20  o data?..       
18a40 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d     }..        }.
18a50 0a 0d 0a 20 20 20 20 20 20 20 20 69 6e 63 72 20  ...        incr 
18a60 73 65 71 75 65 6e 63 65 0d 0a 20 20 20 20 20 20  sequence..      
18a70 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  }..    }.....   
18a80 20 70 72 6f 63 20 63 6c 65 61 6e 75 70 44 62 20   proc cleanupDb 
18a90 7b 20 66 69 6c 65 4e 61 6d 65 20 7b 76 61 72 4e  { fileName {varN
18aa0 61 6d 65 20 64 62 7d 20 7b 63 6f 6c 6c 65 63 74  ame db} {collect
18ab0 20 74 72 75 65 7d 20 7b 71 75 61 6c 69 66 79 20   true} {qualify 
18ac0 74 72 75 65 7d 0d 0a 20 20 20 20 20 20 20 20 20  true}..         
18ad0 20 20 20 20 20 20 20 20 20 20 20 20 7b 64 65 6c              {del
18ae0 65 74 65 20 74 72 75 65 7d 20 7d 20 7b 0d 0a 20  ete true} } {.. 
18af0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
18b00 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74 20 74 6f  NOTE: Attempt to
18b10 20 66 6f 72 63 65 20 61 6c 6c 20 70 65 6e 64 69   force all pendi
18b20 6e 67 20 22 67 61 72 62 61 67 65 22 20 6f 62 6a  ng "garbage" obj
18b30 65 63 74 73 20 74 6f 20 62 65 20 63 6f 6c 6c 65  ects to be colle
18b40 63 74 65 64 2c 0d 0a 20 20 20 20 20 20 23 20 20  cted,..      #  
18b50 20 20 20 20 20 69 6e 63 6c 75 64 69 6e 67 20 53       including S
18b60 51 4c 69 74 65 20 73 74 61 74 65 6d 65 6e 74 73  QLite statements
18b70 20 61 6e 64 20 62 61 63 6b 75 70 20 6f 62 6a 65   and backup obje
18b80 63 74 73 3b 20 74 68 69 73 20 73 68 6f 75 6c 64  cts; this should
18b90 20 61 6c 6c 6f 77 0d 0a 20 20 20 20 20 20 23 20   allow..      # 
18ba0 20 20 20 20 20 20 74 68 65 20 75 6e 64 65 72 6c        the underl
18bb0 79 69 6e 67 20 64 61 74 61 62 61 73 65 20 66 69  ying database fi
18bc0 6c 65 20 74 6f 20 62 65 20 64 65 6c 65 74 65 64  le to be deleted
18bd0 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
18be0 20 20 69 66 20 7b 24 63 6f 6c 6c 65 63 74 7d 20    if {$collect} 
18bf0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
18c00 63 6f 6c 6c 65 63 74 47 61 72 62 61 67 65 20 24  collectGarbage $
18c10 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 0d 0a  ::test_channel..
18c20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
18c30 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
18c40 3a 20 52 65 66 65 72 20 74 6f 20 74 68 65 20 73  : Refer to the s
18c50 70 65 63 69 66 69 65 64 20 76 61 72 69 61 62 6c  pecified variabl
18c60 65 20 28 65 2e 67 2e 20 22 64 62 22 29 20 69 6e  e (e.g. "db") in
18c70 20 74 68 65 20 63 6f 6e 74 65 78 74 20 6f 66 20   the context of 
18c80 6f 75 72 0d 0a 20 20 20 20 20 20 23 20 20 20 20  our..      #    
18c90 20 20 20 63 61 6c 6c 65 72 2e 20 20 54 68 65 20     caller.  The 
18ca0 68 61 6e 64 6c 65 20 74 6f 20 74 68 65 20 64 61  handle to the da
18cb0 74 61 62 61 73 65 20 70 72 65 76 69 6f 75 73 6c  tabase previousl
18cc0 79 20 6f 70 65 6e 65 64 20 76 69 61 20 74 68 65  y opened via the
18cd0 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
18ce0 5b 73 65 74 75 70 44 62 5d 20 70 72 6f 63 65 64  [setupDb] proced
18cf0 75 72 65 20 73 68 6f 75 6c 64 20 62 65 20 73 74  ure should be st
18d00 6f 72 65 64 20 74 68 65 72 65 2e 0d 0a 20 20 20  ored there...   
18d10 20 20 20 23 0d 0a 20 20 20 20 20 20 75 70 76 61     #..      upva
18d20 72 20 31 20 24 76 61 72 4e 61 6d 65 20 64 62 0d  r 1 $varName db.
18d30 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
18d40 20 20 23 20 4e 4f 54 45 3a 20 43 6c 6f 73 65 20    # NOTE: Close 
18d50 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74  the connection t
18d60 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e  o the database n
18d70 6f 77 2e 20 20 54 68 69 73 20 73 68 6f 75 6c 64  ow.  This should
18d80 20 61 6c 6c 6f 77 20 75 73 0d 0a 20 20 20 20 20   allow us..     
18d90 20 23 20 20 20 20 20 20 20 74 6f 20 64 65 6c 65   #       to dele
18da0 74 65 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e  te the underlyin
18db0 67 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  g database file.
18dc0 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
18dd0 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74   if {[info exist
18de0 73 20 64 62 5d 20 26 26 20 5b 63 61 74 63 68 20  s db] && [catch 
18df0 7b 73 71 6c 20 63 6c 6f 73 65 20 24 64 62 7d 20  {sql close $db} 
18e00 65 72 72 6f 72 5d 7d 20 74 68 65 6e 20 7b 0d 0a  error]} then {..
18e10 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
18e20 20 20 20 23 20 4e 4f 54 45 3a 20 57 65 20 73 6f     # NOTE: We so
18e30 6d 65 68 6f 77 20 66 61 69 6c 65 64 20 74 6f 20  mehow failed to 
18e40 63 6c 6f 73 65 20 74 68 65 20 64 61 74 61 62 61  close the databa
18e50 73 65 2c 20 72 65 70 6f 72 74 20 77 68 79 2e 0d  se, report why..
18e60 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
18e70 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
18e80 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e  t_channel [appen
18e90 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
18ea0 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49       "==== WARNI
18eb0 4e 47 3a 20 66 61 69 6c 65 64 20 74 6f 20 63 6c  NG: failed to cl
18ec0 6f 73 65 20 64 61 74 61 62 61 73 65 20 5c 22 22  ose database \""
18ed0 20 24 64 62 20 22 5c 22 2c 20 65 72 72 6f 72 3a   $db "\", error:
18ee0 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20   " \..          
18ef0 20 20 5c 6e 5c 74 20 24 65 72 72 6f 72 20 5c 6e    \n\t $error \n
18f00 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  ]..      }....  
18f10 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
18f20 4f 54 45 3a 20 46 69 72 73 74 2c 20 73 65 65 20  OTE: First, see 
18f30 69 66 20 6f 75 72 20 63 61 6c 6c 65 72 20 68 61  if our caller ha
18f40 73 20 72 65 71 75 65 73 74 65 64 20 61 6e 20 69  s requested an i
18f50 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
18f60 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  e...      #..   
18f70 20 20 20 73 65 74 20 69 73 4d 65 6d 6f 72 79 20     set isMemory 
18f80 5b 69 73 4d 65 6d 6f 72 79 44 62 20 24 66 69 6c  [isMemoryDb $fil
18f90 65 4e 61 6d 65 5d 0d 0a 0d 0a 20 20 20 20 20 20  eName]....      
18fa0 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
18fb0 20 42 75 69 6c 64 20 74 68 65 20 66 75 6c 6c 20   Build the full 
18fc0 70 61 74 68 20 74 6f 20 74 68 65 20 64 61 74 61  path to the data
18fd0 62 61 73 65 20 66 69 6c 65 20 6e 61 6d 65 2e 20  base file name. 
18fe0 20 46 6f 72 20 6e 6f 77 2c 20 61 6c 6c 20 74 65   For now, all te
18ff0 73 74 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  st..      #     
19000 20 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73    database files
19010 20 61 72 65 20 73 74 6f 72 65 64 20 69 6e 20 74   are stored in t
19020 68 65 20 74 65 6d 70 6f 72 61 72 79 20 64 69 72  he temporary dir
19030 65 63 74 6f 72 79 2e 0d 0a 20 20 20 20 20 20 23  ectory...      #
19040 0d 0a 20 20 20 20 20 20 69 66 20 7b 21 24 69 73  ..      if {!$is
19050 4d 65 6d 6f 72 79 20 26 26 20 24 71 75 61 6c 69  Memory && $quali
19060 66 79 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  fy} then {..    
19070 20 20 20 20 73 65 74 20 66 69 6c 65 4e 61 6d 65      set fileName
19080 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5b 67 65 74   [file join [get
19090 44 61 74 61 62 61 73 65 44 69 72 65 63 74 6f 72  DatabaseDirector
190a0 79 5d 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 66  y] [file tail $f
190b0 69 6c 65 4e 61 6d 65 5d 5d 0d 0a 20 20 20 20 20  ileName]]..     
190c0 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20   }....      #.. 
190d0 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68 65       # NOTE: Che
190e0 63 6b 20 69 66 20 74 68 65 20 66 69 6c 65 20 73  ck if the file s
190f0 74 69 6c 6c 20 65 78 69 73 74 73 2e 0d 0a 20 20  till exists...  
19100 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20      #..      if 
19110 7b 21 24 69 73 4d 65 6d 6f 72 79 20 26 26 20 24  {!$isMemory && $
19120 64 65 6c 65 74 65 20 26 26 20 5b 66 69 6c 65 20  delete && [file 
19130 65 78 69 73 74 73 20 24 66 69 6c 65 4e 61 6d 65  exists $fileName
19140 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
19150 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
19160 4e 4f 54 45 3a 20 53 6b 69 70 20 64 65 6c 65 74  NOTE: Skip delet
19170 69 6e 67 20 64 61 74 61 62 61 73 65 20 66 69 6c  ing database fil
19180 65 73 20 69 66 20 73 6f 6d 65 62 6f 64 79 20 73  es if somebody s
19190 65 74 73 20 74 68 65 20 67 6c 6f 62 61 6c 0d 0a  ets the global..
191a0 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
191b0 76 61 72 69 61 62 6c 65 20 74 6f 20 70 72 65 76  variable to prev
191c0 65 6e 74 20 69 74 2e 0d 0a 20 20 20 20 20 20 20  ent it...       
191d0 20 23 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b   #..        if {
191e0 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  ![info exists ::
191f0 6e 6f 28 63 6c 65 61 6e 75 70 44 62 46 69 6c 65  no(cleanupDbFile
19200 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  )]} then {..    
19210 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
19220 20 20 20 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d     # NOTE: Attem
19230 70 74 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65  pt to delete the
19240 20 74 65 73 74 20 64 61 74 61 62 61 73 65 20 66   test database f
19250 69 6c 65 20 6e 6f 77 2e 0d 0a 20 20 20 20 20 20  ile now...      
19260 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
19270 20 69 66 20 7b 5b 73 65 74 20 63 6f 64 65 20 5b   if {[set code [
19280 63 61 74 63 68 20 7b 66 69 6c 65 20 64 65 6c 65  catch {file dele
19290 74 65 20 24 66 69 6c 65 4e 61 6d 65 7d 20 65 72  te $fileName} er
192a0 72 6f 72 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  ror]]} then {.. 
192b0 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
192c0 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45            # NOTE
192d0 3a 20 57 65 20 73 6f 6d 65 68 6f 77 20 66 61 69  : We somehow fai
192e0 6c 65 64 20 74 6f 20 64 65 6c 65 74 65 20 74 68  led to delete th
192f0 65 20 66 69 6c 65 2c 20 72 65 70 6f 72 74 20 77  e file, report w
19300 68 79 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20  hy...           
19310 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   #..            
19320 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
19330 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
19340 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
19350 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49       "==== WARNI
19360 4e 47 3a 20 66 61 69 6c 65 64 20 74 6f 20 64 65  NG: failed to de
19370 6c 65 74 65 20 64 61 74 61 62 61 73 65 20 66 69  lete database fi
19380 6c 65 20 5c 22 22 20 24 66 69 6c 65 4e 61 6d 65  le \"" $fileName
19390 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
193a0 20 20 20 20 22 5c 22 20 64 75 72 69 6e 67 20 63      "\" during c
193b0 6c 65 61 6e 75 70 2c 20 65 72 72 6f 72 3a 20 22  leanup, error: "
193c0 20 5c 6e 5c 74 20 24 65 72 72 6f 72 20 5c 6e 5d   \n\t $error \n]
193d0 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20  ..          }.. 
193e0 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d         } else {.
193f0 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
19400 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
19410 53 68 6f 77 20 74 68 61 74 20 77 65 20 73 6b 69  Show that we ski
19420 70 70 65 64 20 64 65 6c 65 74 69 6e 67 20 74 68  pped deleting th
19430 65 20 66 69 6c 65 2e 0d 0a 20 20 20 20 20 20 20  e file...       
19440 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
19450 73 65 74 20 63 6f 64 65 20 30 0d 0a 0d 0a 20 20  set code 0....  
19460 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
19470 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61  :test_channel [a
19480 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
19490 20 20 20 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d             "====
194a0 20 57 41 52 4e 49 4e 47 3a 20 73 6b 69 70 70 65   WARNING: skippe
194b0 64 20 64 65 6c 65 74 69 6e 67 20 64 61 74 61 62  d deleting datab
194c0 61 73 65 20 66 69 6c 65 20 5c 22 22 20 24 66 69  ase file \"" $fi
194d0 6c 65 4e 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20  leName \..      
194e0 20 20 20 20 20 20 20 20 22 5c 22 20 64 75 72 69          "\" duri
194f0 6e 67 20 63 6c 65 61 6e 75 70 5c 6e 22 5d 0d 0a  ng cleanup\n"]..
19500 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
19510 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
19520 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
19530 4e 4f 54 45 3a 20 54 68 65 20 66 69 6c 65 20 64  NOTE: The file d
19540 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2c 20 73  oes not exist, s
19550 75 63 63 65 73 73 21 0d 0a 20 20 20 20 20 20 20  uccess!..       
19560 20 23 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20   #..        set 
19570 63 6f 64 65 20 30 0d 0a 20 20 20 20 20 20 7d 0d  code 0..      }.
19580 0a 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ...      return 
19590 24 63 6f 64 65 0d 0a 20 20 20 20 7d 0d 0a 0c 0d  $code..    }....
195a0 0a 20 20 20 20 70 72 6f 63 20 73 61 76 65 45 6e  .    proc saveEn
195b0 76 69 72 6f 6e 6d 65 6e 74 56 61 72 69 61 62 6c  vironmentVariabl
195c0 65 73 20 7b 20 6e 61 6d 65 73 20 7b 76 61 72 4e  es { names {varN
195d0 61 6d 65 20 22 22 7d 20 7d 20 7b 0d 0a 20 20 20  ame ""} } {..   
195e0 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
195f0 54 45 3a 20 46 6f 72 20 65 61 63 68 20 6e 61 6d  TE: For each nam
19600 65 2c 20 64 6f 65 73 20 74 68 65 20 6c 69 76 65  e, does the live
19610 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 20 76 61 72   environment var
19620 69 61 62 6c 65 20 65 78 69 73 74 3f 20 20 49 66  iable exist?  If
19630 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
19640 73 6f 2c 20 73 61 76 65 20 74 68 65 20 76 61 6c  so, save the val
19650 75 65 20 66 6f 72 20 6c 61 74 65 72 3b 20 6f 74  ue for later; ot
19660 68 65 72 77 69 73 65 2c 20 6d 61 6b 65 20 73 75  herwise, make su
19670 72 65 20 74 68 65 20 73 61 76 65 64 0d 0a 20 20  re the saved..  
19680 20 20 20 20 23 20 20 20 20 20 20 20 76 61 6c 75      #       valu
19690 65 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74  e does not exist
196a0 20 65 69 74 68 65 72 2e 20 20 54 68 65 20 6c 69   either.  The li
196b0 76 65 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 20 76  ve environment v
196c0 61 72 69 61 62 6c 65 73 0d 0a 20 20 20 20 20 20  ariables..      
196d0 23 20 20 20 20 20 20 20 41 52 45 20 4e 4f 54 20  #       ARE NOT 
196e0 63 68 61 6e 67 65 64 20 62 79 20 74 68 69 73 20  changed by this 
196f0 70 72 6f 63 65 64 75 72 65 2e 0d 0a 20 20 20 20  procedure...    
19700 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b    #..      if {[
19710 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 76  string length $v
19720 61 72 4e 61 6d 65 5d 20 3d 3d 20 30 7d 20 74 68  arName] == 0} th
19730 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 65  en {..        se
19740 74 20 76 61 72 4e 61 6d 65 20 73 61 76 65 64 45  t varName savedE
19750 6e 76 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  nv..      }.... 
19760 20 20 20 20 20 75 70 76 61 72 20 31 20 24 76 61       upvar 1 $va
19770 72 4e 61 6d 65 20 73 61 76 65 64 45 6e 76 0d 0a  rName savedEnv..
19780 0d 0a 20 20 20 20 20 20 66 6f 72 65 61 63 68 20  ..      foreach 
19790 6e 61 6d 65 20 24 6e 61 6d 65 73 20 7b 0d 0a 20  name $names {.. 
197a0 20 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f         if {[info
197b0 20 65 78 69 73 74 73 20 3a 3a 65 6e 76 28 24 6e   exists ::env($n
197c0 61 6d 65 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  ame)]} then {.. 
197d0 20 20 20 20 20 20 20 20 20 73 65 74 20 73 61 76           set sav
197e0 65 64 45 6e 76 28 24 6e 61 6d 65 29 20 24 3a 3a  edEnv($name) $::
197f0 65 6e 76 28 24 6e 61 6d 65 29 0d 0a 20 20 20 20  env($name)..    
19800 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
19810 20 20 20 20 20 20 20 20 75 6e 73 65 74 20 2d 6e          unset -n
19820 6f 63 6f 6d 70 6c 61 69 6e 20 73 61 76 65 64 45  ocomplain savedE
19830 6e 76 28 24 6e 61 6d 65 29 0d 0a 20 20 20 20 20  nv($name)..     
19840 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d     }..      }...
19850 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
19860 23 20 4e 4f 54 45 3a 20 54 68 69 73 20 69 73 20  # NOTE: This is 
19870 73 65 6c 66 2d 63 6c 65 61 6e 69 6e 67 2e 20 20  self-cleaning.  
19880 49 66 20 6e 6f 20 73 61 76 65 64 20 65 6e 76 69  If no saved envi
19890 72 6f 6e 6d 65 6e 74 20 76 61 72 69 61 62 6c 65  ronment variable
198a0 73 20 6e 6f 77 0d 0a 20 20 20 20 20 20 23 20 20  s now..      #  
198b0 20 20 20 20 20 65 78 69 73 74 2c 20 72 65 6d 6f       exist, remo
198c0 76 65 20 74 68 65 20 61 72 72 61 79 2e 0d 0a 20  ve the array... 
198d0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66       #..      if
198e0 20 7b 5b 61 72 72 61 79 20 73 69 7a 65 20 73 61   {[array size sa
198f0 76 65 64 45 6e 76 5d 20 3d 3d 20 30 7d 20 74 68  vedEnv] == 0} th
19900 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 75 6e  en {..        un
19910 73 65 74 20 2d 6e 6f 63 6f 6d 70 6c 61 69 6e 20  set -nocomplain 
19920 73 61 76 65 64 45 6e 76 0d 0a 20 20 20 20 20 20  savedEnv..      
19930 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  }..    }.....   
19940 20 70 72 6f 63 20 72 65 73 74 6f 72 65 45 6e 76   proc restoreEnv
19950 69 72 6f 6e 6d 65 6e 74 56 61 72 69 61 62 6c 65  ironmentVariable
19960 73 20 7b 20 6e 61 6d 65 73 20 7b 76 61 72 4e 61  s { names {varNa
19970 6d 65 20 22 22 7d 20 7d 20 7b 0d 0a 20 20 20 20  me ""} } {..    
19980 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
19990 45 3a 20 46 6f 72 20 65 61 63 68 20 6e 61 6d 65  E: For each name
199a0 2c 20 64 6f 65 73 20 74 68 65 20 73 61 76 65 64  , does the saved
199b0 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 20 76 61 72   environment var
199c0 69 61 62 6c 65 20 65 78 69 73 74 3f 20 20 49 66  iable exist?  If
199d0 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
199e0 73 6f 2c 20 72 65 73 74 6f 72 65 20 74 68 65 20  so, restore the 
199f0 73 61 76 65 64 20 76 61 6c 75 65 20 61 6e 64 20  saved value and 
19a00 75 6e 73 65 74 20 69 74 3b 20 6f 74 68 65 72 77  unset it; otherw
19a10 69 73 65 2c 20 6d 61 6b 65 20 73 75 72 65 0d 0a  ise, make sure..
19a20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68        #       th
19a30 65 20 6c 69 76 65 20 65 6e 76 69 72 6f 6e 6d 65  e live environme
19a40 6e 74 20 76 61 72 69 61 62 6c 65 20 64 6f 65 73  nt variable does
19a50 20 6e 6f 74 20 65 78 69 73 74 20 65 69 74 68 65   not exist eithe
19a60 72 20 28 69 2e 65 2e 20 69 74 0d 0a 20 20 20 20  r (i.e. it..    
19a70 20 20 23 20 20 20 20 20 20 20 77 61 73 20 6e 6f    #       was no
19a80 74 20 73 65 74 20 74 6f 20 62 65 67 69 6e 20 77  t set to begin w
19a90 69 74 68 29 2e 20 20 42 6f 74 68 20 73 61 76 65  ith).  Both save
19aa0 64 20 61 6e 64 20 6c 69 76 65 20 65 6e 76 69 72  d and live envir
19ab0 6f 6e 6d 65 6e 74 0d 0a 20 20 20 20 20 20 23 20  onment..      # 
19ac0 20 20 20 20 20 20 76 61 72 69 61 62 6c 65 73 20        variables 
19ad0 41 52 45 20 63 68 61 6e 67 65 64 20 62 79 20 74  ARE changed by t
19ae0 68 69 73 20 70 72 6f 63 65 64 75 72 65 2e 0d 0a  his procedure...
19af0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69        #..      i
19b00 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74  f {[string lengt
19b10 68 20 24 76 61 72 4e 61 6d 65 5d 20 3d 3d 20 30  h $varName] == 0
19b20 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
19b30 20 20 73 65 74 20 76 61 72 4e 61 6d 65 20 73 61    set varName sa
19b40 76 65 64 45 6e 76 0d 0a 20 20 20 20 20 20 7d 0d  vedEnv..      }.
19b50 0a 0d 0a 20 20 20 20 20 20 75 70 76 61 72 20 31  ...      upvar 1
19b60 20 24 76 61 72 4e 61 6d 65 20 73 61 76 65 64 45   $varName savedE
19b70 6e 76 0d 0a 0d 0a 20 20 20 20 20 20 66 6f 72 65  nv....      fore
19b80 61 63 68 20 6e 61 6d 65 20 24 6e 61 6d 65 73 20  ach name $names 
19b90 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b  {..        if {[
19ba0 69 6e 66 6f 20 65 78 69 73 74 73 20 73 61 76 65  info exists save
19bb0 64 45 6e 76 28 24 6e 61 6d 65 29 5d 7d 20 74 68  dEnv($name)]} th
19bc0 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
19bd0 73 65 74 20 3a 3a 65 6e 76 28 24 6e 61 6d 65 29  set ::env($name)
19be0 20 24 73 61 76 65 64 45 6e 76 28 24 6e 61 6d 65   $savedEnv($name
19bf0 29 0d 0a 20 20 20 20 20 20 20 20 20 20 75 6e 73  )..          uns
19c00 65 74 20 2d 6e 6f 63 6f 6d 70 6c 61 69 6e 20 73  et -nocomplain s
19c10 61 76 65 64 45 6e 76 28 24 6e 61 6d 65 29 0d 0a  avedEnv($name)..
19c20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b          } else {
19c30 0d 0a 20 20 20 20 20 20 20 20 20 20 75 6e 73 65  ..          unse
19c40 74 20 2d 6e 6f 63 6f 6d 70 6c 61 69 6e 20 3a 3a  t -nocomplain ::
19c50 65 6e 76 28 24 6e 61 6d 65 29 0d 0a 20 20 20 20  env($name)..    
19c60 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a      }..      }..
19c70 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
19c80 20 23 20 4e 4f 54 45 3a 20 54 68 69 73 20 69 73   # NOTE: This is
19c90 20 73 65 6c 66 2d 63 6c 65 61 6e 69 6e 67 2e 20   self-cleaning. 
19ca0 20 49 66 20 6e 6f 20 73 61 76 65 64 20 65 6e 76   If no saved env
19cb0 69 72 6f 6e 6d 65 6e 74 20 76 61 72 69 61 62 6c  ironment variabl
19cc0 65 73 20 6e 6f 77 0d 0a 20 20 20 20 20 20 23 20  es now..      # 
19cd0 20 20 20 20 20 20 65 78 69 73 74 2c 20 72 65 6d        exist, rem
19ce0 6f 76 65 20 74 68 65 20 61 72 72 61 79 2e 0d 0a  ove the array...
19cf0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69        #..      i
19d00 66 20 7b 5b 61 72 72 61 79 20 73 69 7a 65 20 73  f {[array size s
19d10 61 76 65 64 45 6e 76 5d 20 3d 3d 20 30 7d 20 74  avedEnv] == 0} t
19d20 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 75  hen {..        u
19d30 6e 73 65 74 20 2d 6e 6f 63 6f 6d 70 6c 61 69 6e  nset -nocomplain
19d40 20 73 61 76 65 64 45 6e 76 0d 0a 20 20 20 20 20   savedEnv..     
19d50 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20   }..    }.....  
19d60 20 20 70 72 6f 63 20 73 61 76 65 4d 64 61 43 6f    proc saveMdaCo
19d70 6e 66 69 67 45 6e 76 69 72 6f 6e 6d 65 6e 74 20  nfigEnvironment 
19d80 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 75 70 76 61  {} {..      upva
19d90 72 20 31 20 73 61 76 65 64 45 6e 76 20 73 61 76  r 1 savedEnv sav
19da0 65 64 45 6e 76 0d 0a 0d 0a 20 20 20 20 20 20 73  edEnv....      s
19db0 61 76 65 45 6e 76 69 72 6f 6e 6d 65 6e 74 56 61  aveEnvironmentVa
19dc0 72 69 61 62 6c 65 73 20 5b 6c 69 73 74 20 43 4f  riables [list CO
19dd0 4d 50 4c 55 53 5f 4d 44 41 5d 20 73 61 76 65 64  MPLUS_MDA] saved
19de0 45 6e 76 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20  Env..    }..... 
19df0 20 20 20 70 72 6f 63 20 72 65 73 74 6f 72 65 4d     proc restoreM
19e00 64 61 43 6f 6e 66 69 67 45 6e 76 69 72 6f 6e 6d  daConfigEnvironm
19e10 65 6e 74 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20  ent {} {..      
19e20 75 70 76 61 72 20 31 20 73 61 76 65 64 45 6e 76  upvar 1 savedEnv
19e30 20 73 61 76 65 64 45 6e 76 0d 0a 0d 0a 20 20 20   savedEnv....   
19e40 20 20 20 72 65 73 74 6f 72 65 45 6e 76 69 72 6f     restoreEnviro
19e50 6e 6d 65 6e 74 56 61 72 69 61 62 6c 65 73 20 5b  nmentVariables [
19e60 6c 69 73 74 20 43 4f 4d 50 4c 55 53 5f 4d 44 41  list COMPLUS_MDA
19e70 5d 20 73 61 76 65 64 45 6e 76 0d 0a 20 20 20 20  ] savedEnv..    
19e80 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 73  }.....    proc s
19e90 61 76 65 47 65 74 53 65 74 74 69 6e 67 56 61 6c  aveGetSettingVal
19ea0 75 65 45 6e 76 69 72 6f 6e 6d 65 6e 74 20 7b 7d  ueEnvironment {}
19eb0 20 7b 0d 0a 20 20 20 20 20 20 75 70 76 61 72 20   {..      upvar 
19ec0 31 20 73 61 76 65 64 45 6e 76 20 73 61 76 65 64  1 savedEnv saved
19ed0 45 6e 76 0d 0a 0d 0a 20 20 20 20 20 20 73 61 76  Env....      sav
19ee0 65 45 6e 76 69 72 6f 6e 6d 65 6e 74 56 61 72 69  eEnvironmentVari
19ef0 61 62 6c 65 73 20 5b 6c 69 73 74 20 5c 0d 0a 20  ables [list \.. 
19f00 20 20 20 20 20 20 20 20 20 4e 6f 5f 45 78 70 61           No_Expa
19f10 6e 64 20 4e 6f 5f 53 51 4c 69 74 65 47 65 74 53  nd No_SQLiteGetS
19f20 65 74 74 69 6e 67 56 61 6c 75 65 20 4e 6f 5f 53  ettingValue No_S
19f30 51 4c 69 74 65 58 6d 6c 43 6f 6e 66 69 67 46 69  QLiteXmlConfigFi
19f40 6c 65 5d 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  le] \..         
19f50 20 73 61 76 65 64 45 6e 76 0d 0a 20 20 20 20 7d   savedEnv..    }
19f60 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 72 65  .....    proc re
19f70 73 74 6f 72 65 47 65 74 53 65 74 74 69 6e 67 56  storeGetSettingV
19f80 61 6c 75 65 45 6e 76 69 72 6f 6e 6d 65 6e 74 20  alueEnvironment 
19f90 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 75 70 76 61  {} {..      upva
19fa0 72 20 31 20 73 61 76 65 64 45 6e 76 20 73 61 76  r 1 savedEnv sav
19fb0 65 64 45 6e 76 0d 0a 0d 0a 20 20 20 20 20 20 72  edEnv....      r
19fc0 65 73 74 6f 72 65 45 6e 76 69 72 6f 6e 6d 65 6e  estoreEnvironmen
19fd0 74 56 61 72 69 61 62 6c 65 73 20 5b 6c 69 73 74  tVariables [list
19fe0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 4e 6f   \..          No
19ff0 5f 45 78 70 61 6e 64 20 4e 6f 5f 53 51 4c 69 74  _Expand No_SQLit
1a000 65 47 65 74 53 65 74 74 69 6e 67 56 61 6c 75 65  eGetSettingValue
1a010 20 4e 6f 5f 53 51 4c 69 74 65 58 6d 6c 43 6f 6e   No_SQLiteXmlCon
1a020 66 69 67 46 69 6c 65 5d 20 5c 0d 0a 20 20 20 20  figFile] \..    
1a030 20 20 20 20 20 20 73 61 76 65 64 45 6e 76 0d 0a        savedEnv..
1a040 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
1a050 6f 63 20 73 61 76 65 53 51 4c 69 74 65 43 6f 6e  oc saveSQLiteCon
1a060 6e 65 63 74 69 6f 6e 45 6e 76 69 72 6f 6e 6d 65  nectionEnvironme
1a070 6e 74 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 75  nt {} {..      u
1a080 70 76 61 72 20 31 20 73 61 76 65 64 45 6e 76 20  pvar 1 savedEnv 
1a090 73 61 76 65 64 45 6e 76 0d 0a 0d 0a 20 20 20 20  savedEnv....    
1a0a0 20 20 73 61 76 65 45 6e 76 69 72 6f 6e 6d 65 6e    saveEnvironmen
1a0b0 74 56 61 72 69 61 62 6c 65 73 20 5b 6c 69 73 74  tVariables [list
1a0c0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 44 65   \..          De
1a0d0 66 61 75 6c 74 46 6c 61 67 73 5f 53 51 4c 69 74  faultFlags_SQLit
1a0e0 65 43 6f 6e 6e 65 63 74 69 6f 6e 20 4e 6f 5f 53  eConnection No_S
1a0f0 51 4c 69 74 65 43 6f 6e 6e 65 63 74 69 6f 6e 4e  QLiteConnectionN
1a100 65 77 50 61 72 73 65 72 5d 20 5c 0d 0a 20 20 20  ewParser] \..   
1a110 20 20 20 20 20 20 20 73 61 76 65 64 45 6e 76 0d         savedEnv.
1a120 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70  .    }.....    p
1a130 72 6f 63 20 72 65 73 74 6f 72 65 53 51 4c 69 74  roc restoreSQLit
1a140 65 43 6f 6e 6e 65 63 74 69 6f 6e 45 6e 76 69 72  eConnectionEnvir
1a150 6f 6e 6d 65 6e 74 20 7b 7d 20 7b 0d 0a 20 20 20  onment {} {..   
1a160 20 20 20 75 70 76 61 72 20 31 20 73 61 76 65 64     upvar 1 saved
1a170 45 6e 76 20 73 61 76 65 64 45 6e 76 0d 0a 0d 0a  Env savedEnv....
1a180 20 20 20 20 20 20 72 65 73 74 6f 72 65 45 6e 76        restoreEnv
1a190 69 72 6f 6e 6d 65 6e 74 56 61 72 69 61 62 6c 65  ironmentVariable
1a1a0 73 20 5b 6c 69 73 74 20 5c 0d 0a 20 20 20 20 20  s [list \..     
1a1b0 20 20 20 20 20 44 65 66 61 75 6c 74 46 6c 61 67       DefaultFlag
1a1c0 73 5f 53 51 4c 69 74 65 43 6f 6e 6e 65 63 74 69  s_SQLiteConnecti
1a1d0 6f 6e 20 4e 6f 5f 53 51 4c 69 74 65 43 6f 6e 6e  on No_SQLiteConn
1a1e0 65 63 74 69 6f 6e 4e 65 77 50 61 72 73 65 72 5d  ectionNewParser]
1a1f0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 73 61   \..          sa
1a200 76 65 64 45 6e 76 0d 0a 20 20 20 20 7d 0d 0a 0c  vedEnv..    }...
1a210 0d 0a 20 20 20 20 70 72 6f 63 20 73 61 76 65 53  ..    proc saveS
1a220 51 4c 69 74 65 43 6f 6e 76 65 72 74 45 6e 76 69  QLiteConvertEnvi
1a230 72 6f 6e 6d 65 6e 74 20 7b 7d 20 7b 0d 0a 20 20  ronment {} {..  
1a240 20 20 20 20 75 70 76 61 72 20 31 20 73 61 76 65      upvar 1 save
1a250 64 45 6e 76 20 73 61 76 65 64 45 6e 76 0d 0a 0d  dEnv savedEnv...
1a260 0a 20 20 20 20 20 20 73 61 76 65 45 6e 76 69 72  .      saveEnvir
1a270 6f 6e 6d 65 6e 74 56 61 72 69 61 62 6c 65 73 20  onmentVariables 
1a280 5b 6c 69 73 74 20 5c 0d 0a 20 20 20 20 20 20 20  [list \..       
1a290 20 20 20 55 73 65 5f 53 51 4c 69 74 65 43 6f 6e     Use_SQLiteCon
1a2a0 76 65 72 74 5f 44 65 66 61 75 6c 74 44 62 54 79  vert_DefaultDbTy
1a2b0 70 65 20 55 73 65 5f 53 51 4c 69 74 65 43 6f 6e  pe Use_SQLiteCon
1a2c0 76 65 72 74 5f 44 65 66 61 75 6c 74 54 79 70 65  vert_DefaultType
1a2d0 4e 61 6d 65 5d 20 5c 0d 0a 20 20 20 20 20 20 20  Name] \..       
1a2e0 20 20 20 73 61 76 65 64 45 6e 76 0d 0a 20 20 20     savedEnv..   
1a2f0 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
1a300 72 65 73 74 6f 72 65 53 51 4c 69 74 65 43 6f 6e  restoreSQLiteCon
1a310 76 65 72 74 45 6e 76 69 72 6f 6e 6d 65 6e 74 20  vertEnvironment 
1a320 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 75 70 76 61  {} {..      upva
1a330 72 20 31 20 73 61 76 65 64 45 6e 76 20 73 61 76  r 1 savedEnv sav
1a340 65 64 45 6e 76 0d 0a 0d 0a 20 20 20 20 20 20 72  edEnv....      r
1a350 65 73 74 6f 72 65 45 6e 76 69 72 6f 6e 6d 65 6e  estoreEnvironmen
1a360 74 56 61 72 69 61 62 6c 65 73 20 5b 6c 69 73 74  tVariables [list
1a370 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 55 73   \..          Us
1a380 65 5f 53 51 4c 69 74 65 43 6f 6e 76 65 72 74 5f  e_SQLiteConvert_
1a390 44 65 66 61 75 6c 74 44 62 54 79 70 65 20 55 73  DefaultDbType Us
1a3a0 65 5f 53 51 4c 69 74 65 43 6f 6e 76 65 72 74 5f  e_SQLiteConvert_
1a3b0 44 65 66 61 75 6c 74 54 79 70 65 4e 61 6d 65 5d  DefaultTypeName]
1a3c0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 73 61   \..          sa
1a3d0 76 65 64 45 6e 76 0d 0a 20 20 20 20 7d 0d 0a 0c  vedEnv..    }...
1a3e0 0d 0a 20 20 20 20 70 72 6f 63 20 73 65 74 75 70  ..    proc setup
1a3f0 44 62 49 6e 74 65 72 72 75 70 74 43 61 6c 6c 62  DbInterruptCallb
1a400 61 63 6b 20 7b 20 63 68 61 6e 6e 65 6c 20 6c 6f  ack { channel lo
1a410 67 20 7d 20 7b 0d 0a 20 20 20 20 20 20 74 70 75  g } {..      tpu
1a420 74 73 20 24 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d  ts $channel "---
1a430 2d 20 73 65 74 74 69 6e 67 20 75 70 20 64 65 62  - setting up deb
1a440 75 67 67 65 72 20 69 6e 74 65 72 72 75 70 74 20  ugger interrupt 
1a450 63 61 6c 6c 62 61 63 6b 2e 2e 2e 20 22 0d 0a 0d  callback... "...
1a460 0a 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63  .      if {[catc
1a470 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 61 76  h {..        sav
1a480 65 45 6e 76 69 72 6f 6e 6d 65 6e 74 56 61 72 69  eEnvironmentVari
1a490 61 62 6c 65 73 20 5b 6c 69 73 74 20 5c 0d 0a 20  ables [list \.. 
1a4a0 20 20 20 20 20 20 20 20 20 20 20 71 75 69 65 74             quiet
1a4b0 46 69 6e 64 49 6e 74 65 72 70 72 65 74 65 72 54  FindInterpreterT
1a4c0 65 73 74 50 61 74 68 20 71 75 69 65 74 53 65 74  estPath quietSet
1a4d0 75 70 49 6e 74 65 72 70 72 65 74 65 72 54 65 73  upInterpreterTes
1a4e0 74 50 61 74 68 5d 0d 0a 0d 0a 20 20 20 20 20 20  tPath]....      
1a4f0 20 20 74 72 79 20 7b 0d 0a 20 20 20 20 20 20 20    try {..       
1a500 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
1a510 23 20 4e 4f 54 45 3a 20 50 72 65 76 65 6e 74 20  # NOTE: Prevent 
1a520 74 68 65 20 76 65 6e 64 6f 72 20 73 63 72 69 70  the vendor scrip
1a530 74 20 66 72 6f 6d 20 62 65 69 6e 67 20 6e 6f 69  t from being noi
1a540 73 79 20 77 68 65 6e 20 63 72 65 61 74 69 6e 67  sy when creating
1a550 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 20 20  ..          #   
1a560 20 20 20 20 74 68 65 20 69 73 6f 6c 61 74 65 64      the isolated
1a570 20 69 6e 74 65 72 70 72 65 74 65 72 2e 0d 0a 20   interpreter... 
1a580 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
1a590 20 20 20 20 20 20 73 65 74 20 3a 3a 65 6e 76 28        set ::env(
1a5a0 71 75 69 65 74 46 69 6e 64 49 6e 74 65 72 70 72  quietFindInterpr
1a5b0 65 74 65 72 54 65 73 74 50 61 74 68 29 20 31 0d  eterTestPath) 1.
1a5c0 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20 3a  .          set :
1a5d0 3a 65 6e 76 28 71 75 69 65 74 53 65 74 75 70 49  :env(quietSetupI
1a5e0 6e 74 65 72 70 72 65 74 65 72 54 65 73 74 50 61  nterpreterTestPa
1a5f0 74 68 29 20 31 0d 0a 0d 0a 20 20 20 20 20 20 20  th) 1....       
1a600 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
1a610 23 20 4e 4f 54 45 3a 20 4d 61 6b 65 20 73 75 72  # NOTE: Make sur
1a620 65 20 74 68 65 20 73 63 72 69 70 74 20 64 65 62  e the script deb
1a630 75 67 67 65 72 20 61 6e 64 20 74 68 65 20 69 73  ugger and the is
1a640 6f 6c 61 74 65 64 20 69 6e 74 65 72 70 72 65 74  olated interpret
1a650 65 72 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20  er..          # 
1a660 20 20 20 20 20 20 61 72 65 20 73 65 74 75 70 20        are setup 
1a670 61 6e 64 20 72 65 61 64 79 20 66 6f 72 20 75 73  and ready for us
1a680 65 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d  e...          #.
1a690 0a 20 20 20 20 20 20 20 20 20 20 64 65 62 75 67  .          debug
1a6a0 20 73 65 74 75 70 20 74 72 75 65 20 74 72 75 65   setup true true
1a6b0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d  ....          #.
1a6c0 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54  .          # NOT
1a6d0 45 3a 20 4c 6f 61 64 20 74 68 65 20 6e 65 63 65  E: Load the nece
1a6e0 73 73 61 72 79 20 70 61 63 6b 61 67 65 73 20 69  ssary packages i
1a6f0 6e 74 6f 20 74 68 65 20 69 73 6f 6c 61 74 65 64  nto the isolated
1a700 20 69 6e 74 65 72 70 72 65 74 65 72 2e 0d 0a 20   interpreter... 
1a710 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
1a720 20 20 20 20 20 20 64 65 62 75 67 20 65 76 61 6c        debug eval
1a730 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
1a740 70 61 63 6b 61 67 65 20 72 65 71 75 69 72 65 20  package require 
1a750 45 61 67 6c 65 0d 0a 20 20 20 20 20 20 20 20 20  Eagle..         
1a760 20 20 20 70 61 63 6b 61 67 65 20 72 65 71 75 69     package requi
1a770 72 65 20 45 61 67 6c 65 2e 4c 69 62 72 61 72 79  re Eagle.Library
1a780 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 61  ..            pa
1a790 63 6b 61 67 65 20 72 65 71 75 69 72 65 20 45 61  ckage require Ea
1a7a0 67 6c 65 2e 54 65 73 74 0d 0a 20 20 20 20 20 20  gle.Test..      
1a7b0 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
1a7c0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
1a7d0 23 20 4e 4f 54 45 3a 20 43 6f 70 79 20 74 68 65  # NOTE: Copy the
1a7e0 20 6e 65 63 65 73 73 61 72 79 20 76 61 72 69 61   necessary varia
1a7f0 62 6c 65 73 20 69 6e 74 6f 20 74 68 65 20 69 73  bles into the is
1a800 6f 6c 61 74 65 64 20 69 6e 74 65 72 70 72 65 74  olated interpret
1a810 65 72 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23  er...          #
1a820 0d 0a 20 20 20 20 20 20 20 20 20 20 64 65 62 75  ..          debu
1a830 67 20 69 6e 76 6f 6b 65 20 30 20 73 65 74 20 3a  g invoke 0 set :
1a840 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 24 63  :test_channel $c
1a850 68 61 6e 6e 65 6c 3b 20 23 20 4e 4f 54 45 3a 20  hannel; # NOTE: 
1a860 46 6f 72 20 5b 74 70 75 74 73 5d 2e 0d 0a 20 20  For [tputs]...  
1a870 20 20 20 20 20 20 20 20 64 65 62 75 67 20 69 6e          debug in
1a880 76 6f 6b 65 20 30 20 73 65 74 20 3a 3a 74 65 73  voke 0 set ::tes
1a890 74 5f 6c 6f 67 20 24 6c 6f 67 3b 20 23 20 4e 4f  t_log $log; # NO
1a8a0 54 45 3a 20 46 6f 72 20 5b 74 6c 6f 67 5d 2e 0d  TE: For [tlog]..
1a8b0 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a  ...          #..
1a8c0 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45            # NOTE
1a8d0 3a 20 49 6e 73 74 61 6c 6c 20 74 68 65 20 63 61  : Install the ca
1a8e0 6c 6c 62 61 63 6b 20 73 63 72 69 70 74 20 74 6f  llback script to
1a8f0 20 62 65 20 65 76 61 6c 75 61 74 65 64 20 69 6e   be evaluated in
1a900 20 74 68 65 20 69 73 6f 6c 61 74 65 64 0d 0a 20   the isolated.. 
1a910 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20           #      
1a920 20 69 6e 74 65 72 70 72 65 74 65 72 20 77 68 65   interpreter whe
1a930 6e 20 74 68 69 73 20 69 6e 74 65 72 70 72 65 74  n this interpret
1a940 65 72 20 69 73 20 69 6e 74 65 72 72 75 70 74 65  er is interrupte
1a950 64 20 62 79 20 73 63 72 69 70 74 0d 0a 20 20 20  d by script..   
1a960 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63         #       c
1a970 61 6e 63 65 6c 6c 61 74 69 6f 6e 2c 20 65 74 63  ancellation, etc
1a980 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a  ...          #..
1a990 20 20 20 20 20 20 20 20 20 20 64 65 62 75 67 20            debug 
1a9a0 63 61 6c 6c 62 61 63 6b 20 61 70 70 6c 79 20 7b  callback apply {
1a9b0 7b 73 65 6e 64 65 72 20 65 7d 20 7b 0d 0a 20 20  {sender e} {..  
1a9c0 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
1a9d0 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a           # NOTE:
1a9e0 20 43 68 65 63 6b 20 69 66 20 74 68 69 73 20 64   Check if this d
1a9f0 65 62 75 67 67 65 72 20 63 61 6c 6c 62 61 63 6b  ebugger callback
1aa00 20 69 73 20 6f 6e 65 20 74 68 61 74 20 77 65 20   is one that we 
1aa10 63 61 72 65 20 61 62 6f 75 74 2e 0d 0a 20 20 20  care about...   
1aa20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
1aa30 20 20 20 20 20 20 20 20 73 65 74 20 69 6e 74 65          set inte
1aa40 72 72 75 70 74 54 79 70 65 73 20 5b 73 70 6c 69  rruptTypes [spli
1aa50 74 20 5b 24 65 20 49 6e 74 65 72 72 75 70 74 54  t [$e InterruptT
1aa60 79 70 65 5d 20 22 2c 20 22 5d 0d 0a 0d 0a 20 20  ype] ", "]....  
1aa70 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 22 43            if {"C
1aa80 61 6e 63 65 6c 65 64 22 20 69 6e 20 24 69 6e 74  anceled" in $int
1aa90 65 72 72 75 70 74 54 79 70 65 73 20 7c 7c 20 5c  erruptTypes || \
1aaa0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1aab0 20 20 22 55 6e 77 6f 75 6e 64 22 20 69 6e 20 24    "Unwound" in $
1aac0 69 6e 74 65 72 72 75 70 74 54 79 70 65 73 7d 20  interruptTypes} 
1aad0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
1aae0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
1aaf0 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4d         # NOTE: M
1ab00 61 6b 65 20 73 75 72 65 20 74 68 65 20 5b 6f 62  ake sure the [ob
1ab10 6a 65 63 74 5d 20 63 6f 6d 6d 61 6e 64 20 69 73  ject] command is
1ab20 20 61 76 61 69 6c 61 62 6c 65 2e 20 20 53 69 6e   available.  Sin
1ab30 63 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ce..            
1ab40 20 20 23 20 20 20 20 20 20 20 74 68 69 73 20 69    #       this i
1ab50 73 20 61 6e 20 69 73 6f 6c 61 74 65 64 20 69 6e  s an isolated in
1ab60 74 65 72 70 72 65 74 65 72 2c 20 63 68 65 63 6b  terpreter, check
1ab70 20 66 6f 72 20 69 74 20 74 68 65 20 68 61 72 64   for it the hard
1ab80 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1ab90 23 20 20 20 20 20 20 20 77 61 79 2e 0d 0a 20 20  #       way...  
1aba0 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20              #.. 
1abb0 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20               if 
1abc0 7b 5b 6c 6c 65 6e 67 74 68 20 5b 69 6e 66 6f 20  {[llength [info 
1abd0 63 6f 6d 6d 61 6e 64 73 20 6f 62 6a 65 63 74 5d  commands object]
1abe0 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20  ] > 0} then {.. 
1abf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23                 #
1ac00 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1ac10 20 20 23 20 4e 4f 54 45 3a 20 49 74 65 72 61 74    # NOTE: Iterat
1ac20 65 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 64 61  e through all da
1ac30 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
1ac40 6e 73 20 6b 6e 6f 77 6e 20 74 6f 20 74 68 65 0d  ns known to the.
1ac50 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1ac60 20 23 20 20 20 20 20 20 20 70 61 72 65 6e 74 20   #       parent 
1ac70 69 6e 74 65 72 70 72 65 74 65 72 2e 0d 0a 20 20  interpreter...  
1ac80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 0d                #.
1ac90 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1aca0 20 6f 62 6a 65 63 74 20 66 6f 72 65 61 63 68 20   object foreach 
1acb0 2d 61 6c 69 61 73 20 70 61 69 72 20 5b 6f 62 6a  -alias pair [obj
1acc0 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67  ect invoke -flag
1acd0 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a  s +NonPublic \..
1ace0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1acf0 20 20 20 20 24 65 20 49 6e 74 65 72 70 72 65 74      $e Interpret
1ad00 65 72 2e 63 6f 6e 6e 65 63 74 69 6f 6e 73 5d 20  er.connections] 
1ad10 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
1ad20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
1ad30 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45            # NOTE
1ad40 3a 20 41 74 74 65 6d 70 74 20 74 6f 20 63 61 6e  : Attempt to can
1ad50 63 65 6c 20 61 6e 79 20 53 51 4c 20 71 75 65 72  cel any SQL quer
1ad60 69 65 73 20 69 6e 20 70 72 6f 67 72 65 73 73 20  ies in progress 
1ad70 6f 6e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  on..            
1ad80 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68        #       th
1ad90 69 73 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  is database conn
1ada0 65 63 74 69 6f 6e 2e 0d 0a 20 20 20 20 20 20 20  ection...       
1adb0 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
1adc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1add0 69 66 20 7b 5b 63 61 74 63 68 20 7b 24 70 61 69  if {[catch {$pai
1ade0 72 20 56 61 6c 75 65 2e 43 61 6e 63 65 6c 7d 20  r Value.Cancel} 
1adf0 65 72 72 6f 72 5d 7d 20 74 68 65 6e 20 7b 0d 0a  error]} then {..
1ae00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ae10 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
1ae20 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e  t_channel [appen
1ae30 64 41 72 67 73 20 5c 6e 20 5c 0d 0a 20 20 20 20  dArgs \n \..    
1ae40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ae50 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e      "==== WARNIN
1ae60 47 3a 20 66 61 69 6c 65 64 20 74 6f 20 63 61 6e  G: failed to can
1ae70 63 65 6c 20 71 75 65 72 79 20 66 6f 72 20 22 20  cel query for " 
1ae80 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
1ae90 20 20 20 20 20 20 20 20 20 20 20 22 63 6f 6e 6e             "conn
1aea0 65 63 74 69 6f 6e 20 5c 22 22 20 5b 24 70 61 69  ection \"" [$pai
1aeb0 72 20 4b 65 79 5d 20 22 5c 22 2c 20 65 72 72 6f  r Key] "\", erro
1aec0 72 3a 20 22 20 5c 6e 5c 74 20 5c 0d 0a 20 20 20  r: " \n\t \..   
1aed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aee0 20 20 20 20 20 24 65 72 72 6f 72 20 5c 6e 5d 0d       $error \n].
1aef0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1af00 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
1af10 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
1af20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d         } else {.
1af30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1af40 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
1af50 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
1af60 67 73 20 5c 6e 20 5c 0d 0a 20 20 20 20 20 20 20  gs \n \..       
1af70 20 20 20 20 20 20 20 20 20 20 20 20 20 22 3d 3d               "==
1af80 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 63 61 6e 6e  == WARNING: cann
1af90 6f 74 20 63 61 6e 63 65 6c 20 61 6e 79 20 71 75  ot cancel any qu
1afa0 65 72 69 65 73 3a 20 22 20 5c 0d 0a 20 20 20 20  eries: " \..    
1afb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1afc0 22 74 68 65 20 5c 22 6f 62 6a 65 63 74 5c 22 20  "the \"object\" 
1afd0 63 6f 6d 6d 61 6e 64 20 69 73 20 6e 6f 74 20 61  command is not a
1afe0 76 61 69 6c 61 62 6c 65 5c 6e 22 5d 0d 0a 20 20  vailable\n"]..  
1aff0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
1b000 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
1b010 20 20 20 20 20 20 20 20 7d 7d 0d 0a 20 20 20 20          }}..    
1b020 20 20 20 20 7d 20 66 69 6e 61 6c 6c 79 20 7b 0d      } finally {.
1b030 0a 20 20 20 20 20 20 20 20 20 20 72 65 73 74 6f  .          resto
1b040 72 65 45 6e 76 69 72 6f 6e 6d 65 6e 74 56 61 72  reEnvironmentVar
1b050 69 61 62 6c 65 73 20 5b 6c 69 73 74 20 5c 0d 0a  iables [list \..
1b060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 71 75                qu
1b070 69 65 74 46 69 6e 64 49 6e 74 65 72 70 72 65 74  ietFindInterpret
1b080 65 72 54 65 73 74 50 61 74 68 20 71 75 69 65 74  erTestPath quiet
1b090 53 65 74 75 70 49 6e 74 65 72 70 72 65 74 65 72  SetupInterpreter
1b0a0 54 65 73 74 50 61 74 68 5d 0d 0a 20 20 20 20 20  TestPath]..     
1b0b0 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 20 65 72     }..      } er
1b0c0 72 6f 72 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20  ror] == 0} then 
1b0d0 7b 0d 0a 20 20 20 20 20 20 20 20 61 64 64 43 6f  {..        addCo
1b0e0 6e 73 74 72 61 69 6e 74 20 69 6e 74 65 72 72 75  nstraint interru
1b0f0 70 74 43 61 6c 6c 62 61 63 6b 2e 73 71 6c 69 74  ptCallback.sqlit
1b100 65 33 0d 0a 0d 0a 20 20 20 20 20 20 20 20 74 70  e3....        tp
1b110 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 79 65 73  uts $channel yes
1b120 5c 6e 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65  \n..      } else
1b130 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74   {..        tput
1b140 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  s $channel [appe
1b150 6e 64 41 72 67 73 20 22 6e 6f 2c 20 65 72 72 6f  ndArgs "no, erro
1b160 72 3a 20 22 20 5c 6e 5c 74 20 24 65 72 72 6f 72  r: " \n\t $error
1b170 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20   \n]..      }.. 
1b180 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
1b190 63 20 63 6c 65 61 6e 75 70 46 69 6c 65 20 7b 20  c cleanupFile { 
1b1a0 66 69 6c 65 4e 61 6d 65 20 7b 63 6f 6c 6c 65 63  fileName {collec
1b1b0 74 20 74 72 75 65 7d 20 7b 66 6f 72 63 65 20 66  t true} {force f
1b1c0 61 6c 73 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20  alse} } {..     
1b1d0 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
1b1e0 3a 20 41 74 74 65 6d 70 74 20 74 6f 20 66 6f 72  : Attempt to for
1b1f0 63 65 20 61 6c 6c 20 70 65 6e 64 69 6e 67 20 22  ce all pending "
1b200 67 61 72 62 61 67 65 22 20 6f 62 6a 65 63 74 73  garbage" objects
1b210 20 74 6f 20 62 65 20 63 6f 6c 6c 65 63 74 65 64   to be collected
1b220 2c 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  ,..      #      
1b230 20 69 6e 63 6c 75 64 69 6e 67 20 53 51 4c 69 74   including SQLit
1b240 65 20 73 74 61 74 65 6d 65 6e 74 73 20 61 6e 64  e statements and
1b250 20 62 61 63 6b 75 70 20 6f 62 6a 65 63 74 73 3b   backup objects;
1b260 20 74 68 69 73 20 73 68 6f 75 6c 64 20 61 6c 6c   this should all
1b270 6f 77 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  ow..      #     
1b280 20 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67    the underlying
1b290 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74   database file t
1b2a0 6f 20 62 65 20 64 65 6c 65 74 65 64 2e 0d 0a 20  o be deleted... 
1b2b0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66       #..      if
1b2c0 20 7b 24 63 6f 6c 6c 65 63 74 7d 20 74 68 65 6e   {$collect} then
1b2d0 20 7b 0d 0a 20 20 20 20 20 20 20 20 63 6f 6c 6c   {..        coll
1b2e0 65 63 74 47 61 72 62 61 67 65 20 24 3a 3a 74 65  ectGarbage $::te
1b2f0 73 74 5f 63 68 61 6e 6e 65 6c 0d 0a 20 20 20 20  st_channel..    
1b300 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a    }....      #..
1b310 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68        # NOTE: Ch
1b320 65 63 6b 20 69 66 20 74 68 65 20 66 69 6c 65 20  eck if the file 
1b330 73 74 69 6c 6c 20 65 78 69 73 74 73 2e 0d 0a 20  still exists... 
1b340 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66       #..      if
1b350 20 7b 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24   {[file exists $
1b360 66 69 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20  fileName]} then 
1b370 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
1b380 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 6b        # NOTE: Sk
1b390 69 70 20 64 65 6c 65 74 69 6e 67 20 74 65 73 74  ip deleting test
1b3a0 20 66 69 6c 65 73 20 69 66 20 73 6f 6d 65 62 6f   files if somebo
1b3b0 64 79 20 73 65 74 73 20 74 68 65 20 67 6c 6f 62  dy sets the glob
1b3c0 61 6c 20 76 61 72 69 61 62 6c 65 0d 0a 20 20 20  al variable..   
1b3d0 20 20 20 20 20 23 20 20 20 20 20 20 20 74 6f 20       #       to 
1b3e0 70 72 65 76 65 6e 74 20 69 74 2e 0d 0a 20 20 20  prevent it...   
1b3f0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
1b400 69 66 20 7b 24 66 6f 72 63 65 20 7c 7c 20 21 5b  if {$force || ![
1b410 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f  info exists ::no
1b420 28 63 6c 65 61 6e 75 70 46 69 6c 65 29 5d 7d 20  (cleanupFile)]} 
1b430 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
1b440 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23    #..          #
1b450 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74 20 74   NOTE: Attempt t
1b460 6f 20 64 65 6c 65 74 65 20 74 68 65 20 74 65 73  o delete the tes
1b470 74 20 66 69 6c 65 20 6e 6f 77 2e 0d 0a 20 20 20  t file now...   
1b480 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
1b490 20 20 20 20 69 66 20 7b 5b 73 65 74 20 63 6f 64      if {[set cod
1b4a0 65 20 5b 63 61 74 63 68 20 7b 66 69 6c 65 20 64  e [catch {file d
1b4b0 65 6c 65 74 65 20 24 66 69 6c 65 4e 61 6d 65 7d  elete $fileName}
1b4c0 20 65 72 72 6f 72 5d 5d 7d 20 74 68 65 6e 20 7b   error]]} then {
1b4d0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 0d  ..            #.
1b4e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4e  .            # N
1b4f0 4f 54 45 3a 20 57 65 20 73 6f 6d 65 68 6f 77 20  OTE: We somehow 
1b500 66 61 69 6c 65 64 20 74 6f 20 64 65 6c 65 74 65  failed to delete
1b510 20 74 68 65 20 66 69 6c 65 2c 20 72 65 70 6f 72   the file, repor
1b520 74 20 77 68 79 2e 0d 0a 20 20 20 20 20 20 20 20  t why...        
1b530 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
1b540 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
1b550 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  _channel [append
1b560 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
1b570 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41          "==== WA
1b580 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20 74 6f  RNING: failed to
1b590 20 64 65 6c 65 74 65 20 74 65 73 74 20 66 69 6c   delete test fil
1b5a0 65 20 5c 22 22 20 24 66 69 6c 65 4e 61 6d 65 20  e \"" $fileName 
1b5b0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
1b5c0 20 20 20 22 5c 22 20 64 75 72 69 6e 67 20 63 6c     "\" during cl
1b5d0 65 61 6e 75 70 2c 20 65 72 72 6f 72 3a 20 22 20  eanup, error: " 
1b5e0 5c 6e 5c 74 20 24 65 72 72 6f 72 20 5c 6e 5d 0d  \n\t $error \n].
1b5f0 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  .          }..  
1b600 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
1b610 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
1b620 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53         # NOTE: S
1b630 68 6f 77 20 74 68 61 74 20 77 65 20 73 6b 69 70  how that we skip
1b640 70 65 64 20 64 65 6c 65 74 69 6e 67 20 74 68 65  ped deleting the
1b650 20 66 69 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20   file...        
1b660 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 73    #..          s
1b670 65 74 20 63 6f 64 65 20 30 0d 0a 0d 0a 20 20 20  et code 0....   
1b680 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
1b690 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70  test_channel [ap
1b6a0 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
1b6b0 20 20 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20            "==== 
1b6c0 57 41 52 4e 49 4e 47 3a 20 73 6b 69 70 70 65 64  WARNING: skipped
1b6d0 20 64 65 6c 65 74 69 6e 67 20 74 65 73 74 20 66   deleting test f
1b6e0 69 6c 65 20 5c 22 22 20 24 66 69 6c 65 4e 61 6d  ile \"" $fileNam
1b6f0 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e \..           
1b700 20 20 20 22 5c 22 20 64 75 72 69 6e 67 20 63 6c     "\" during cl
1b710 65 61 6e 75 70 5c 6e 22 5d 0d 0a 20 20 20 20 20  eanup\n"]..     
1b720 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 20 65 6c     }..      } el
1b730 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d  se {..        #.
1b740 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
1b750 20 54 68 65 20 66 69 6c 65 20 64 6f 65 73 20 6e   The file does n
1b760 6f 74 20 65 78 69 73 74 2c 20 73 75 63 63 65 73  ot exist, succes
1b770 73 21 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  s!..        #.. 
1b780 20 20 20 20 20 20 20 73 65 74 20 63 6f 64 65 20         set code 
1b790 30 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  0..      }....  
1b7a0 20 20 20 20 72 65 74 75 72 6e 20 24 63 6f 64 65      return $code
1b7b0 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
1b7c0 70 72 6f 63 20 63 6c 65 61 6e 75 70 4d 65 6d 6f  proc cleanupMemo
1b7d0 72 79 20 7b 20 76 61 72 4e 61 6d 65 20 7b 71 75  ry { varName {qu
1b7e0 69 65 74 20 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a  iet false} } {..
1b7f0 20 20 20 20 20 20 69 66 20 7b 5b 68 61 76 65 53        if {[haveS
1b800 51 4c 69 74 65 4f 62 6a 65 63 74 43 6f 6d 6d 61  QLiteObjectComma
1b810 6e 64 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20  nd] && \..      
1b820 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67      [string leng
1b830 74 68 20 24 76 61 72 4e 61 6d 65 5d 20 3e 20 30  th $varName] > 0
1b840 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
1b850 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
1b860 4f 54 45 3a 20 52 65 66 65 72 20 74 6f 20 74 68  OTE: Refer to th
1b870 65 20 73 70 65 63 69 66 69 65 64 20 76 61 72 69  e specified vari
1b880 61 62 6c 65 20 28 65 2e 67 2e 20 22 63 6f 6e 6e  able (e.g. "conn
1b890 65 63 74 69 6f 6e 22 29 20 69 6e 20 74 68 65 0d  ection") in the.
1b8a0 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
1b8b0 20 63 6f 6e 74 65 78 74 20 6f 66 20 6f 75 72 20   context of our 
1b8c0 63 61 6c 6c 65 72 2e 20 20 54 68 65 20 6f 70 61  caller.  The opa
1b8d0 71 75 65 20 6f 62 6a 65 63 74 20 68 61 6e 64 6c  que object handl
1b8e0 65 20 66 6f 72 20 61 6e 0d 0a 20 20 20 20 20 20  e for an..      
1b8f0 20 20 23 20 20 20 20 20 20 20 41 44 4f 2e 4e 45    #       ADO.NE
1b900 54 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 72 65  T connection pre
1b910 76 69 6f 75 73 6c 79 20 72 65 74 75 72 6e 65 64  viously returned
1b920 20 62 79 20 5b 67 65 74 44 62 43 6f 6e 6e 65 63   by [getDbConnec
1b930 74 69 6f 6e 5d 0d 0a 20 20 20 20 20 20 20 20 23  tion]..        #
1b940 20 20 20 20 20 20 20 73 68 6f 75 6c 64 20 62 65         should be
1b950 20 73 74 6f 72 65 64 20 74 68 65 72 65 2e 0d 0a   stored there...
1b960 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
1b970 20 20 20 75 70 76 61 72 20 31 20 24 76 61 72 4e     upvar 1 $varN
1b980 61 6d 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0d 0a  ame connection..
1b990 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63  ..        if {[c
1b9a0 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20  atch {..        
1b9b0 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20    object invoke 
1b9c0 24 63 6f 6e 6e 65 63 74 69 6f 6e 20 52 65 6c 65  $connection Rele
1b9d0 61 73 65 4d 65 6d 6f 72 79 0d 0a 20 20 20 20 20  aseMemory..     
1b9e0 20 20 20 7d 20 72 65 73 75 6c 74 5d 7d 20 74 68     } result]} th
1b9f0 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
1ba00 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65  if {!$quiet} the
1ba10 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
1ba20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
1ba30 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
1ba40 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
1ba50 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e        "==== WARN
1ba60 49 4e 47 3a 20 66 61 69 6c 65 64 20 74 6f 20 72  ING: failed to r
1ba70 65 6c 65 61 73 65 20 64 61 74 61 62 61 73 65 20  elease database 
1ba80 6d 65 6d 6f 72 79 2c 20 65 72 72 6f 72 3a 20 22  memory, error: "
1ba90 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
1baa0 20 20 20 20 5c 6e 5c 74 20 24 72 65 73 75 6c 74      \n\t $result
1bab0 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20   \n]..          
1bac0 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  }..        }..  
1bad0 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 69      }....      i
1bae0 66 20 7b 5b 6c 6c 65 6e 67 74 68 20 5b 69 6e 66  f {[llength [inf
1baf0 6f 20 63 6f 6d 6d 61 6e 64 73 20 64 65 62 75 67  o commands debug
1bb00 5d 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  ]] > 0} then {..
1bb10 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74          if {[cat
1bb20 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  ch {..          
1bb30 75 70 6c 65 76 65 6c 20 31 20 5b 6c 69 73 74 20  uplevel 1 [list 
1bb40 64 65 62 75 67 20 70 75 72 67 65 5d 0d 0a 20 20  debug purge]..  
1bb50 20 20 20 20 20 20 7d 20 72 65 73 75 6c 74 5d 7d        } result]}
1bb60 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
1bb70 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20     if {!$quiet} 
1bb80 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
1bb90 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
1bba0 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e  t_channel [appen
1bbb0 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
1bbc0 20 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57           "==== W
1bbd0 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20 74  ARNING: failed t
1bbe0 6f 20 70 75 72 67 65 20 63 61 6c 6c 20 66 72 61  o purge call fra
1bbf0 6d 65 2c 20 65 72 72 6f 72 3a 20 22 20 5c 0d 0a  me, error: " \..
1bc00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bc10 5c 6e 5c 74 20 24 72 65 73 75 6c 74 20 5c 6e 5d  \n\t $result \n]
1bc20 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20  ..          }.. 
1bc30 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
1bc40 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b      if {[catch {
1bc50 0d 0a 20 20 20 20 20 20 20 20 20 20 75 70 6c 65  ..          uple
1bc60 76 65 6c 20 31 20 5b 6c 69 73 74 20 64 65 62 75  vel 1 [list debu
1bc70 67 20 63 6c 65 61 6e 75 70 5d 0d 0a 20 20 20 20  g cleanup]..    
1bc80 20 20 20 20 7d 20 72 65 73 75 6c 74 5d 7d 20 74      } result]} t
1bc90 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
1bca0 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68   if {!$quiet} th
1bcb0 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
1bcc0 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
1bcd0 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
1bce0 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
1bcf0 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52         "==== WAR
1bd00 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20 74 6f 20  NING: failed to 
1bd10 63 6c 65 61 6e 75 70 20 69 6e 74 65 72 70 72 65  cleanup interpre
1bd20 74 65 72 2c 20 65 72 72 6f 72 3a 20 22 20 5c 0d  ter, error: " \.
1bd30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1bd40 20 5c 6e 5c 74 20 24 72 65 73 75 6c 74 20 5c 6e   \n\t $result \n
1bd50 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  ]..          }..
1bd60 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
1bd70 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20       if {[catch 
1bd80 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 75 70 6c  {..          upl
1bd90 65 76 65 6c 20 31 20 5b 6c 69 73 74 20 64 65 62  evel 1 [list deb
1bda0 75 67 20 63 6f 6c 6c 65 63 74 5d 0d 0a 20 20 20  ug collect]..   
1bdb0 20 20 20 20 20 7d 20 72 65 73 75 6c 74 5d 7d 20       } result]} 
1bdc0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
1bdd0 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74    if {!$quiet} t
1bde0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
1bdf0 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
1be00 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  _channel [append
1be10 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
1be20 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41          "==== WA
1be30 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20 74 6f  RNING: failed to
1be40 20 63 6f 6c 6c 65 63 74 20 67 61 72 62 61 67 65   collect garbage
1be50 2c 20 65 72 72 6f 72 3a 20 22 20 5c 0d 0a 20 20  , error: " \..  
1be60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 6e                \n
1be70 5c 74 20 24 72 65 73 75 6c 74 20 5c 6e 5d 0d 0a  \t $result \n]..
1be80 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
1be90 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d       }..      }.
1bea0 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70  .    }.....    p
1beb0 72 6f 63 20 73 65 74 75 70 4d 65 6d 6f 72 79 43  roc setupMemoryC
1bec0 6f 75 6e 74 65 72 73 20 7b 20 76 61 72 4e 61 6d  ounters { varNam
1bed0 65 20 7d 20 7b 0d 0a 20 20 20 20 20 20 69 66 20  e } {..      if 
1bee0 7b 5b 68 61 76 65 53 51 4c 69 74 65 4f 62 6a 65  {[haveSQLiteObje
1bef0 63 74 43 6f 6d 6d 61 6e 64 5d 7d 20 74 68 65 6e  ctCommand]} then
1bf00 20 7b 0d 0a 20 20 20 20 20 20 20 20 75 70 76 61   {..        upva
1bf10 72 20 31 20 24 76 61 72 4e 61 6d 65 20 63 6f 75  r 1 $varName cou
1bf20 6e 74 65 72 0d 0a 0d 0a 20 20 20 20 20 20 20 20  nter....        
1bf30 73 65 74 20 63 6f 75 6e 74 65 72 28 31 29 20 5b  set counter(1) [
1bf40 6f 62 6a 65 63 74 20 63 72 65 61 74 65 20 2d 61  object create -a
1bf50 6c 69 61 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  lias \..        
1bf60 20 20 20 20 53 79 73 74 65 6d 2e 44 69 61 67 6e      System.Diagn
1bf70 6f 73 74 69 63 73 2e 50 65 72 66 6f 72 6d 61 6e  ostics.Performan
1bf80 63 65 43 6f 75 6e 74 65 72 20 50 72 6f 63 65 73  ceCounter Proces
1bf90 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
1bfa0 20 22 57 6f 72 6b 69 6e 67 20 53 65 74 22 20 5b   "Working Set" [
1bfb0 66 69 6c 65 20 72 6f 6f 74 6e 61 6d 65 20 5b 66  file rootname [f
1bfc0 69 6c 65 20 74 61 69 6c 20 24 3a 3a 62 69 6e 5f  ile tail $::bin_
1bfd0 66 69 6c 65 5d 5d 5d 0d 0a 0d 0a 20 20 20 20 20  file]]]....     
1bfe0 20 20 20 73 65 74 20 63 6f 75 6e 74 65 72 28 32     set counter(2
1bff0 29 20 5b 6f 62 6a 65 63 74 20 63 72 65 61 74 65  ) [object create
1c000 20 2d 61 6c 69 61 73 20 5c 0d 0a 20 20 20 20 20   -alias \..     
1c010 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44 69         System.Di
1c020 61 67 6e 6f 73 74 69 63 73 2e 50 65 72 66 6f 72  agnostics.Perfor
1c030 6d 61 6e 63 65 43 6f 75 6e 74 65 72 20 50 72 6f  manceCounter Pro
1c040 63 65 73 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  cess \..        
1c050 20 20 20 20 22 57 6f 72 6b 69 6e 67 20 53 65 74      "Working Set
1c060 20 50 65 61 6b 22 20 5b 66 69 6c 65 20 72 6f 6f   Peak" [file roo
1c070 74 6e 61 6d 65 20 5b 66 69 6c 65 20 74 61 69 6c  tname [file tail
1c080 20 24 3a 3a 62 69 6e 5f 66 69 6c 65 5d 5d 5d 0d   $::bin_file]]].
1c090 0a 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 63  ...        set c
1c0a0 6f 75 6e 74 65 72 28 33 29 20 5b 6f 62 6a 65 63  ounter(3) [objec
1c0b0 74 20 63 72 65 61 74 65 20 2d 61 6c 69 61 73 20  t create -alias 
1c0c0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 53  \..            S
1c0d0 79 73 74 65 6d 2e 44 69 61 67 6e 6f 73 74 69 63  ystem.Diagnostic
1c0e0 73 2e 50 65 72 66 6f 72 6d 61 6e 63 65 43 6f 75  s.PerformanceCou
1c0f0 6e 74 65 72 20 50 72 6f 63 65 73 73 20 5c 0d 0a  nter Process \..
1c100 20 20 20 20 20 20 20 20 20 20 20 20 22 50 72 69              "Pri
1c110 76 61 74 65 20 42 79 74 65 73 22 20 5b 66 69 6c  vate Bytes" [fil
1c120 65 20 72 6f 6f 74 6e 61 6d 65 20 5b 66 69 6c 65  e rootname [file
1c130 20 74 61 69 6c 20 24 3a 3a 62 69 6e 5f 66 69 6c   tail $::bin_fil
1c140 65 5d 5d 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d  e]]]..      }...
1c150 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 22 22  .      return ""
1c160 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
1c170 70 72 6f 63 20 72 65 70 6f 72 74 4d 65 6d 6f 72  proc reportMemor
1c180 79 43 6f 75 6e 74 65 72 73 20 7b 20 63 68 61 6e  yCounters { chan
1c190 6e 65 6c 20 76 61 72 4e 61 6d 65 20 70 72 65 66  nel varName pref
1c1a0 69 78 20 7d 20 7b 0d 0a 20 20 20 20 20 20 69 66  ix } {..      if
1c1b0 20 7b 5b 68 61 76 65 53 51 4c 69 74 65 4f 62 6a   {[haveSQLiteObj
1c1c0 65 63 74 43 6f 6d 6d 61 6e 64 5d 7d 20 74 68 65  ectCommand]} the
1c1d0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 75 70 76  n {..        upv
1c1e0 61 72 20 31 20 24 76 61 72 4e 61 6d 65 20 63 6f  ar 1 $varName co
1c1f0 75 6e 74 65 72 0d 0a 0d 0a 20 20 20 20 20 20 20  unter....       
1c200 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
1c210 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
1c220 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
1c230 20 22 20 24 70 72 65 66 69 78 20 22 20 63 6f 75   " $prefix " cou
1c240 6e 74 65 72 20 5c 22 22 20 5c 0d 0a 20 20 20 20  nter \"" \..    
1c250 20 20 20 20 20 20 20 20 5b 6f 62 6a 65 63 74 20          [object 
1c260 69 6e 76 6f 6b 65 20 24 63 6f 75 6e 74 65 72 28  invoke $counter(
1c270 31 29 20 43 6f 75 6e 74 65 72 4e 61 6d 65 5d 20  1) CounterName] 
1c280 22 5c 22 20 76 61 6c 75 65 20 69 73 20 22 20 5c  "\" value is " \
1c290 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 6f  ..            [o
1c2a0 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 24 63 6f  bject invoke $co
1c2b0 75 6e 74 65 72 28 31 29 20 52 61 77 56 61 6c 75  unter(1) RawValu
1c2c0 65 5d 20 5c 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20  e] \n]....      
1c2d0 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
1c2e0 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
1c2f0 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
1c300 2d 20 22 20 24 70 72 65 66 69 78 20 22 20 63 6f  - " $prefix " co
1c310 75 6e 74 65 72 20 5c 22 22 20 5c 0d 0a 20 20 20  unter \"" \..   
1c320 20 20 20 20 20 20 20 20 20 5b 6f 62 6a 65 63 74           [object
1c330 20 69 6e 76 6f 6b 65 20 24 63 6f 75 6e 74 65 72   invoke $counter
1c340 28 32 29 20 43 6f 75 6e 74 65 72 4e 61 6d 65 5d  (2) CounterName]
1c350 20 22 5c 22 20 76 61 6c 75 65 20 69 73 20 22 20   "\" value is " 
1c360 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b  \..            [
1c370 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 24 63  object invoke $c
1c380 6f 75 6e 74 65 72 28 32 29 20 52 61 77 56 61 6c  ounter(2) RawVal
1c390 75 65 5d 20 5c 6e 5d 0d 0a 0d 0a 20 20 20 20 20  ue] \n]....     
1c3a0 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
1c3b0 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
1c3c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d  .            "--
1c3d0 2d 2d 20 22 20 24 70 72 65 66 69 78 20 22 20 63  -- " $prefix " c
1c3e0 6f 75 6e 74 65 72 20 5c 22 22 20 5c 0d 0a 20 20  ounter \"" \..  
1c3f0 20 20 20 20 20 20 20 20 20 20 5b 6f 62 6a 65 63            [objec
1c400 74 20 69 6e 76 6f 6b 65 20 24 63 6f 75 6e 74 65  t invoke $counte
1c410 72 28 33 29 20 43 6f 75 6e 74 65 72 4e 61 6d 65  r(3) CounterName
1c420 5d 20 22 5c 22 20 76 61 6c 75 65 20 69 73 20 22  ] "\" value is "
1c430 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
1c440 5b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 24  [object invoke $
1c450 63 6f 75 6e 74 65 72 28 33 29 20 52 61 77 56 61  counter(3) RawVa
1c460 6c 75 65 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20 20  lue] \n]..      
1c470 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  }..    }.....   
1c480 20 70 72 6f 63 20 63 6f 6c 6c 65 63 74 47 61 72   proc collectGar
1c490 62 61 67 65 20 7b 20 63 68 61 6e 6e 65 6c 20 7b  bage { channel {
1c4a0 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20 31 30 30  milliseconds 100
1c4b0 30 7d 20 7b 71 75 69 65 74 20 74 72 75 65 7d 20  0} {quiet true} 
1c4c0 7d 20 7b 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b  } {..      if {[
1c4d0 68 61 76 65 53 51 4c 69 74 65 4f 62 6a 65 63 74  haveSQLiteObject
1c4e0 43 6f 6d 6d 61 6e 64 5d 7d 20 74 68 65 6e 20 7b  Command]} then {
1c4f0 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63  ..        if {[c
1c500 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20  atch {..        
1c510 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20    object invoke 
1c520 47 43 20 47 65 74 54 6f 74 61 6c 4d 65 6d 6f 72  GC GetTotalMemor
1c530 79 20 66 61 6c 73 65 0d 0a 20 20 20 20 20 20 20  y false..       
1c540 20 7d 20 72 65 73 75 6c 74 5d 20 3d 3d 20 30 7d   } result] == 0}
1c550 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
1c560 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20     if {!$quiet} 
1c570 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
1c580 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
1c590 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
1c5a0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1c5b0 20 20 22 2d 2d 2d 2d 20 6d 65 6d 6f 72 79 20 69    "---- memory i
1c5c0 6e 20 75 73 65 20 62 79 20 74 68 65 20 43 4c 52  n use by the CLR
1c5d0 20 62 65 66 6f 72 65 20 63 6f 6c 6c 65 63 74 69   before collecti
1c5e0 6f 6e 2e 2e 2e 20 22 20 5c 0d 0a 20 20 20 20 20  on... " \..     
1c5f0 20 20 20 20 20 20 20 20 20 20 20 24 72 65 73 75             $resu
1c600 6c 74 20 22 20 62 79 74 65 73 5c 6e 22 5d 0d 0a  lt " bytes\n"]..
1c610 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
1c620 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
1c630 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71           if {!$q
1c640 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  uiet} then {..  
1c650 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
1c660 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  $channel [append
1c670 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
1c680 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41          "==== WA
1c690 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20 74 6f  RNING: failed to
1c6a0 20 67 65 74 20 43 4c 52 20 6d 65 6d 6f 72 79 20   get CLR memory 
1c6b0 75 73 61 67 65 2c 20 65 72 72 6f 72 3a 20 22 20  usage, error: " 
1c6c0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
1c6d0 20 20 20 5c 6e 5c 74 20 24 72 65 73 75 6c 74 20     \n\t $result 
1c6e0 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  \n]..          }
1c6f0 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20  ..        }..   
1c700 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 23     }....      ##
1c710 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1c720 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1c730 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1c740 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1c750 23 23 23 23 23 23 23 0d 0a 0d 0a 20 20 20 20 20  #######....     
1c760 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
1c770 3a 20 52 65 70 65 61 74 65 64 6c 79 20 61 74 74  : Repeatedly att
1c780 65 6d 70 74 20 74 6f 20 63 6f 6c 6c 65 63 74 20  empt to collect 
1c790 67 61 72 62 61 67 65 20 75 6e 74 69 6c 20 74 68  garbage until th
1c7a0 65 20 61 6c 6c 6f 74 74 65 64 20 6e 75 6d 62 65  e allotted numbe
1c7b0 72 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  r..      #      
1c7c0 20 6f 66 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73   of milliseconds
1c7d0 20 68 61 73 20 65 6c 61 70 73 65 64 2e 20 20 41   has elapsed.  A
1c7e0 6c 77 61 79 73 20 61 74 74 65 6d 70 74 20 74 6f  lways attempt to
1c7f0 20 63 6f 6c 6c 65 63 74 20 67 61 72 62 61 67 65   collect garbage
1c800 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
1c810 61 74 20 6c 65 61 73 74 20 6f 6e 63 65 2e 0d 0a  at least once...
1c820 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69        #..      i
1c830 66 20 7b 5b 68 61 76 65 53 51 4c 69 74 65 4f 62  f {[haveSQLiteOb
1c840 6a 65 63 74 43 6f 6d 6d 61 6e 64 5d 7d 20 74 68  jectCommand]} th
1c850 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 65  en {..        se
1c860 74 20 73 74 61 72 74 20 5b 63 6c 6f 63 6b 20 73  t start [clock s
1c870 65 63 6f 6e 64 73 5d 0d 0a 20 20 20 20 20 20 20  econds]..       
1c880 20 73 65 74 20 73 74 6f 70 20 5b 65 78 70 72 20   set stop [expr 
1c890 7b 24 73 74 61 72 74 20 2b 20 28 24 6d 69 6c 6c  {$start + ($mill
1c8a0 69 73 65 63 6f 6e 64 73 20 2f 20 31 30 30 30 29  iseconds / 1000)
1c8b0 7d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 64 6f  }]....        do
1c8c0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d   {..          #.
1c8d0 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54  .          # NOT
1c8e0 45 3a 20 41 74 74 65 6d 70 74 20 74 6f 20 66 6f  E: Attempt to fo
1c8f0 72 63 65 20 61 20 66 75 6c 6c 20 67 61 72 62 61  rce a full garba
1c900 67 65 20 63 6f 6c 6c 65 63 74 69 6f 6e 20 6e 6f  ge collection no
1c910 77 2e 20 20 52 65 70 6f 72 74 20 61 6e 79 0d 0a  w.  Report any..
1c920 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20            #     
1c930 20 20 65 72 72 6f 72 20 74 68 61 74 20 69 73 20    error that is 
1c940 65 6e 63 6f 75 6e 74 65 72 65 64 20 69 66 20 77  encountered if w
1c950 65 20 66 61 69 6c 2e 0d 0a 20 20 20 20 20 20 20  e fail...       
1c960 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
1c970 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20  if {[catch {..  
1c980 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74            object
1c990 20 69 6e 76 6f 6b 65 20 47 43 20 47 65 74 54 6f   invoke GC GetTo
1c9a0 74 61 6c 4d 65 6d 6f 72 79 20 74 72 75 65 0d 0a  talMemory true..
1c9b0 20 20 20 20 20 20 20 20 20 20 7d 20 65 72 72 6f            } erro
1c9c0 72 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  r]} then {..    
1c9d0 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75          if {!$qu
1c9e0 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  iet} then {..   
1c9f0 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
1ca00 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e   $channel [appen
1ca10 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
1ca20 20 20 20 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d             "====
1ca30 20 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64   WARNING: failed
1ca40 20 66 75 6c 6c 20 67 61 72 62 61 67 65 20 63 6f   full garbage co
1ca50 6c 6c 65 63 74 69 6f 6e 2c 20 65 72 72 6f 72 3a  llection, error:
1ca60 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20   " \..          
1ca70 20 20 20 20 20 20 20 20 5c 6e 5c 74 20 24 65 72          \n\t $er
1ca80 72 6f 72 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20  ror \n]..       
1ca90 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
1caa0 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20    }....         
1cab0 20 73 65 74 20 6e 6f 77 20 5b 63 6c 6f 63 6b 20   set now [clock 
1cac0 73 65 63 6f 6e 64 73 5d 0d 0a 20 20 20 20 20 20  seconds]..      
1cad0 20 20 7d 20 77 68 69 6c 65 20 7b 24 73 74 61 72    } while {$star
1cae0 74 20 3c 3d 20 24 6e 6f 77 20 26 26 20 24 6e 6f  t <= $now && $no
1caf0 77 20 3c 20 24 73 74 6f 70 7d 0d 0a 20 20 20 20  w < $stop}..    
1cb00 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 23 23    }....      ###
1cb10 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1cb20 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1cb30 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1cb40 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1cb50 23 23 23 23 23 23 0d 0a 0d 0a 20 20 20 20 20 20  ######....      
1cb60 69 66 20 7b 5b 68 61 76 65 53 51 4c 69 74 65 4f  if {[haveSQLiteO
1cb70 62 6a 65 63 74 43 6f 6d 6d 61 6e 64 5d 7d 20 74  bjectCommand]} t
1cb80 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 69  hen {..        i
1cb90 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20  f {[catch {..   
1cba0 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e         object in
1cbb0 76 6f 6b 65 20 47 43 20 47 65 74 54 6f 74 61 6c  voke GC GetTotal
1cbc0 4d 65 6d 6f 72 79 20 66 61 6c 73 65 0d 0a 20 20  Memory false..  
1cbd0 20 20 20 20 20 20 7d 20 72 65 73 75 6c 74 5d 20        } result] 
1cbe0 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  == 0} then {..  
1cbf0 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75          if {!$qu
1cc00 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  iet} then {..   
1cc10 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
1cc20 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
1cc30 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
1cc40 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 6d 65 6d         "---- mem
1cc50 6f 72 79 20 69 6e 20 75 73 65 20 62 79 20 74 68  ory in use by th
1cc60 65 20 43 4c 52 20 61 66 74 65 72 20 63 6f 6c 6c  e CLR after coll
1cc70 65 63 74 69 6f 6e 2e 2e 2e 20 22 20 5c 0d 0a 20  ection... " \.. 
1cc80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 24                 $
1cc90 72 65 73 75 6c 74 20 22 20 62 79 74 65 73 5c 6e  result " bytes\n
1cca0 22 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d  "]..          }.
1ccb0 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20  .        } else 
1ccc0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20  {..          if 
1ccd0 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b  {!$quiet} then {
1cce0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70  ..            tp
1ccf0 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70  uts $channel [ap
1cd00 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
1cd10 20 20 20 20 20 20 20 20 20 20 20 20 22 3d 3d 3d              "===
1cd20 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65  = WARNING: faile
1cd30 64 20 74 6f 20 67 65 74 20 43 4c 52 20 6d 65 6d  d to get CLR mem
1cd40 6f 72 79 20 75 73 61 67 65 2c 20 65 72 72 6f 72  ory usage, error
1cd50 3a 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  : " \..         
1cd60 20 20 20 20 20 20 20 5c 6e 5c 74 20 24 72 65 73         \n\t $res
1cd70 75 6c 74 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20  ult \n]..       
1cd80 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d     }..        }.
1cd90 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d  .      }..    }.
1cda0 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74  ....    proc get
1cdb0 53 51 4c 69 74 65 48 61 6e 64 6c 65 43 6f 75 6e  SQLiteHandleCoun
1cdc0 74 73 20 7b 20 63 68 61 6e 6e 65 6c 20 7b 71 75  ts { channel {qu
1cdd0 69 65 74 20 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a  iet false} } {..
1cde0 20 20 20 20 20 20 73 65 74 20 72 65 73 75 6c 74        set result
1cdf0 20 5b 6c 69 73 74 5d 0d 0a 0d 0a 20 20 20 20 20   [list]....     
1ce00 20 69 66 20 7b 5b 68 61 76 65 53 51 4c 69 74 65   if {[haveSQLite
1ce10 4f 62 6a 65 63 74 43 6f 6d 6d 61 6e 64 5d 20 26  ObjectCommand] &
1ce20 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b  & \..          [
1ce30 68 61 76 65 53 51 4c 69 74 65 44 65 66 69 6e 65  haveSQLiteDefine
1ce40 43 6f 6e 73 74 61 6e 74 20 43 4f 55 4e 54 5f 48  Constant COUNT_H
1ce50 41 4e 44 4c 45 5d 7d 20 74 68 65 6e 20 7b 0d 0a  ANDLE]} then {..
1ce60 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
1ce70 20 20 20 23 20 4e 4f 54 45 3a 20 41 64 64 20 65     # NOTE: Add e
1ce80 61 63 68 20 63 72 69 74 69 63 61 6c 20 68 61 6e  ach critical han
1ce90 64 6c 65 20 63 6f 75 6e 74 20 74 6f 20 74 68 65  dle count to the
1cea0 20 72 65 73 75 6c 74 69 6e 67 20 6c 69 73 74 2e   resulting list.
1ceb0 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
1cec0 20 20 20 20 20 66 6f 72 65 61 63 68 20 6e 61 6d       foreach nam
1ced0 65 20 5b 6c 69 73 74 20 5c 0d 0a 20 20 20 20 20  e [list \..     
1cee0 20 20 20 20 20 20 20 63 6f 6e 6e 65 63 74 69 6f         connectio
1cef0 6e 43 6f 75 6e 74 20 73 74 61 74 65 6d 65 6e 74  nCount statement
1cf00 43 6f 75 6e 74 20 62 61 63 6b 75 70 43 6f 75 6e  Count backupCoun
1cf10 74 20 62 6c 6f 62 43 6f 75 6e 74 5d 20 7b 0d 0a  t blobCount] {..
1cf20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63            if {[c
1cf30 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20  atch {..        
1cf40 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b      object invok
1cf50 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62  e -flags +NonPub
1cf60 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  lic \..         
1cf70 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61         System.Da
1cf80 74 61 2e 53 51 4c 69 74 65 2e 44 65 62 75 67 44  ta.SQLite.DebugD
1cf90 61 74 61 20 24 6e 61 6d 65 0d 0a 20 20 20 20 20  ata $name..     
1cfa0 20 20 20 20 20 7d 20 76 61 6c 75 65 5d 20 3d 3d       } value] ==
1cfb0 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
1cfc0 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75          if {!$qu
1cfd0 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  iet} then {..   
1cfe0 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
1cff0 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e   $channel [appen
1d000 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
1d010 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
1d020 20 63 72 69 74 69 63 61 6c 20 68 61 6e 64 6c 65   critical handle
1d030 20 63 6f 75 6e 74 20 5c 22 22 20 24 6e 61 6d 65   count \"" $name
1d040 20 22 5c 22 20 69 73 20 22 20 24 76 61 6c 75 65   "\" is " $value
1d050 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20   \n]..          
1d060 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20    }....         
1d070 20 20 20 6c 61 70 70 65 6e 64 20 72 65 73 75 6c     lappend resul
1d080 74 20 24 76 61 6c 75 65 0d 0a 20 20 20 20 20 20  t $value..      
1d090 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
1d0a0 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 24            if {!$
1d0b0 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20  quiet} then {.. 
1d0c0 20 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75               tpu
1d0d0 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70  ts $channel [app
1d0e0 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
1d0f0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 3d 3d               "==
1d100 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c  == WARNING: fail
1d110 65 64 20 74 6f 20 67 65 74 20 63 72 69 74 69 63  ed to get critic
1d120 61 6c 20 68 61 6e 64 6c 65 20 63 6f 75 6e 74 20  al handle count 
1d130 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  \"" \..         
1d140 20 20 20 20 20 20 20 20 20 24 6e 61 6d 65 20 22           $name "
1d150 5c 22 2c 20 65 72 72 6f 72 3a 20 22 20 5c 6e 5c  \", error: " \n\
1d160 74 20 24 76 61 6c 75 65 20 5c 6e 5d 0d 0a 20 20  t $value \n]..  
1d170 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
1d180 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
1d190 20 20 7d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73    }..      } els
1d1a0 65 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68  eif {!$quiet} th
1d1b0 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d  en {..        #.
1d1c0 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
1d1d0 20 54 68 65 20 61 63 74 75 61 6c 20 68 61 6e 64   The actual hand
1d1e0 6c 65 20 63 6f 75 6e 74 73 20 61 72 65 20 6e 6f  le counts are no
1d1f0 74 20 61 76 61 69 6c 61 62 6c 65 3b 20 74 68 65  t available; the
1d200 72 65 66 6f 72 65 2c 20 6a 75 73 74 0d 0a 20 20  refore, just..  
1d210 20 20 20 20 20 20 23 20 20 20 20 20 20 20 72 65        #       re
1d220 74 75 72 6e 20 61 6e 20 65 6d 70 74 79 20 6c 69  turn an empty li
1d230 73 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  st...        #..
1d240 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
1d250 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 63 72 69  hannel "---- cri
1d260 74 69 63 61 6c 20 68 61 6e 64 6c 65 20 63 6f 75  tical handle cou
1d270 6e 74 73 20 75 6e 61 76 61 69 6c 61 62 6c 65 5c  nts unavailable\
1d280 6e 22 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  n"..      }.... 
1d290 20 20 20 20 20 72 65 74 75 72 6e 20 24 72 65 73       return $res
1d2a0 75 6c 74 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20  ult..    }..... 
1d2b0 20 20 20 70 72 6f 63 20 73 68 75 74 64 6f 77 6e     proc shutdown
1d2c0 53 51 4c 69 74 65 20 7b 20 63 68 61 6e 6e 65 6c  SQLite { channel
1d2d0 20 7b 66 6f 72 63 65 20 66 61 6c 73 65 7d 20 7b   {force false} {
1d2e0 71 75 69 65 74 20 66 61 6c 73 65 7d 20 7d 20 7b  quiet false} } {
1d2f0 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
1d300 20 23 20 4e 4f 54 45 3a 20 4d 61 6b 65 20 73 75   # NOTE: Make su
1d310 72 65 20 74 68 61 74 20 53 51 4c 69 74 65 20 63  re that SQLite c
1d320 6f 72 65 20 6c 69 62 72 61 72 79 20 69 73 20 63  ore library is c
1d330 6f 6d 70 6c 65 74 65 6c 79 20 73 68 75 74 64 6f  ompletely shutdo
1d340 77 6e 2e 20 20 54 68 69 73 0d 0a 20 20 20 20 20  wn.  This..     
1d350 20 23 20 20 20 20 20 20 20 69 73 20 75 73 65 64   #       is used
1d360 20 62 79 20 74 65 73 74 73 20 74 68 61 74 20 63   by tests that c
1d370 68 61 6e 67 65 20 63 6f 6e 66 69 67 75 72 61 74  hange configurat
1d380 69 6f 6e 20 6f 70 74 69 6f 6e 73 20 61 6e 64 2f  ion options and/
1d390 6f 72 20 74 68 6f 73 65 0d 0a 20 20 20 20 20 20  or those..      
1d3a0 23 20 20 20 20 20 20 20 74 68 61 74 20 6e 65 65  #       that nee
1d3b0 64 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 6c  d to make sure l
1d3c0 6f 67 67 69 6e 67 20 69 73 20 69 6e 69 74 69 61  ogging is initia
1d3d0 6c 69 7a 65 64 20 28 69 2e 65 2e 20 6a 75 73 74  lized (i.e. just
1d3e0 20 69 6e 20 63 61 73 65 0d 0a 20 20 20 20 20 20   in case..      
1d3f0 23 20 20 20 20 20 20 20 74 68 65 20 53 51 4c 69  #       the SQLi
1d400 74 65 20 63 6f 72 65 20 6c 69 62 72 61 72 79 20  te core library 
1d410 77 61 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20  was initialized 
1d420 69 6e 20 74 68 65 20 70 72 6f 63 65 73 73 20 70  in the process p
1d430 72 69 6f 72 20 74 6f 0d 0a 20 20 20 20 20 20 23  rior to..      #
1d440 20 20 20 20 20 20 20 74 68 65 20 53 51 4c 69 74         the SQLit
1d450 65 4c 6f 67 20 63 6c 61 73 73 20 62 65 69 6e 67  eLog class being
1d460 20 61 62 6c 65 20 74 6f 20 73 65 74 75 70 20 69   able to setup i
1d470 74 73 20 6c 6f 67 67 69 6e 67 20 63 61 6c 6c 62  ts logging callb
1d480 61 63 6b 29 2e 0d 0a 20 20 20 20 20 20 23 20 20  ack)...      #  
1d490 20 20 20 20 20 4e 6f 72 6d 61 6c 6c 79 2c 20 74       Normally, t
1d4a0 68 69 73 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20  his should only 
1d4b0 62 65 20 70 65 72 66 6f 72 6d 65 64 20 69 66 20  be performed if 
1d4c0 53 51 4c 69 74 65 20 69 73 20 6c 6f 61 64 65 64  SQLite is loaded
1d4d0 20 61 6e 64 0d 0a 20 20 20 20 20 20 23 20 20 20   and..      #   
1d4e0 20 20 20 20 72 65 61 64 79 20 66 6f 72 20 75 73      ready for us
1d4f0 65 20 62 79 20 74 68 65 20 74 65 73 74 20 73 75  e by the test su
1d500 69 74 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ite...      #.. 
1d510 20 20 20 20 20 69 66 20 7b 24 66 6f 72 63 65 20       if {$force 
1d520 7c 7c 20 5b 69 73 53 51 4c 69 74 65 52 65 61 64  || [isSQLiteRead
1d530 79 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  y]} then {..    
1d540 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
1d550 20 42 55 47 46 49 58 3a 20 4d 61 6b 65 20 73 75   BUGFIX: Make su
1d560 72 65 20 74 68 61 74 20 61 6e 79 20 22 6c 65 61  re that any "lea
1d570 6b 65 64 22 20 74 72 61 6e 73 61 63 74 69 6f 6e  ked" transaction
1d580 73 20 61 6e 64 2f 6f 72 20 63 6f 6e 6e 65 63 74  s and/or connect
1d590 69 6f 6e 73 0d 0a 20 20 20 20 20 20 20 20 23 20  ions..        # 
1d5a0 20 20 20 20 20 20 20 20 61 72 65 20 63 6c 65 61          are clea
1d5b0 6e 65 64 20 75 70 20 62 65 66 6f 72 65 20 63 61  ned up before ca
1d5c0 6c 6c 69 6e 67 20 74 68 65 20 6e 61 74 69 76 65  lling the native
1d5d0 20 73 68 75 74 64 6f 77 6e 20 66 75 6e 63 74 69   shutdown functi
1d5e0 6f 6e 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  on...        #..
1d5f0 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20          foreach 
1d600 74 72 61 6e 73 61 63 74 69 6f 6e 20 5b 69 6e 66  transaction [inf
1d610 6f 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 5d 20  o transactions] 
1d620 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20  {..          if 
1d630 7b 5b 73 74 72 69 6e 67 20 6d 61 74 63 68 20 5c  {[string match \
1d640 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1d650 53 79 73 74 65 6d 23 44 61 74 61 23 53 51 4c 69  System#Data#SQLi
1d660 74 65 23 53 51 4c 69 74 65 54 72 61 6e 73 61 63  te#SQLiteTransac
1d670 74 69 6f 6e 23 2a 20 24 74 72 61 6e 73 61 63 74  tion#* $transact
1d680 69 6f 6e 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ion]} then {..  
1d690 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63            if {[c
1d6a0 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20  atch {..        
1d6b0 20 20 20 20 20 20 73 71 6c 20 74 72 61 6e 73 61        sql transa
1d6c0 63 74 69 6f 6e 20 72 6f 6c 6c 62 61 63 6b 20 24  ction rollback $
1d6d0 74 72 61 6e 73 61 63 74 69 6f 6e 0d 0a 20 20 20  transaction..   
1d6e0 20 20 20 20 20 20 20 20 20 7d 20 65 72 72 6f 72           } error
1d6f0 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  ] == 0} then {..
1d700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
1d710 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20   {!$quiet} then 
1d720 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
1d730 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
1d740 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
1d750 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1d760 20 20 20 20 20 22 2d 2d 2d 2d 20 72 6f 6c 6c 65       "---- rolle
1d770 64 20 62 61 63 6b 20 6c 65 61 6b 65 64 20 74 72  d back leaked tr
1d780 61 6e 73 61 63 74 69 6f 6e 20 5c 22 22 20 5c 0d  ansaction \"" \.
1d790 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1d7a0 20 20 20 20 20 24 74 72 61 6e 73 61 63 74 69 6f       $transactio
1d7b0 6e 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20 20  n \"\n]..       
1d7c0 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
1d7d0 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
1d7e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
1d7f0 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20   {!$quiet} then 
1d800 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
1d810 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
1d820 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
1d830 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1d840 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49       "==== WARNI
1d850 4e 47 3a 20 66 61 69 6c 65 64 20 74 6f 20 72 6f  NG: failed to ro
1d860 6c 6c 62 61 63 6b 20 6c 65 61 6b 65 64 20 74 72  llback leaked tr
1d870 61 6e 73 61 63 74 69 6f 6e 20 5c 22 22 20 5c 0d  ansaction \"" \.
1d880 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1d890 20 20 20 20 20 24 74 72 61 6e 73 61 63 74 69 6f       $transactio
1d8a0 6e 20 22 5c 22 2c 20 65 72 72 6f 72 3a 20 22 20  n "\", error: " 
1d8b0 5c 6e 5c 74 20 24 65 72 72 6f 72 20 5c 6e 5d 0d  \n\t $error \n].
1d8c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
1d8d0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
1d8e0 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  .          }..  
1d8f0 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
1d900 20 20 20 66 6f 72 65 61 63 68 20 64 62 20 5b 69     foreach db [i
1d910 6e 66 6f 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 5d  nfo connections]
1d920 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66   {..          if
1d930 20 7b 5b 73 74 72 69 6e 67 20 6d 61 74 63 68 20   {[string match 
1d940 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
1d950 20 53 79 73 74 65 6d 23 44 61 74 61 23 53 51 4c   System#Data#SQL
1d960 69 74 65 23 53 51 4c 69 74 65 43 6f 6e 6e 65 63  ite#SQLiteConnec
1d970 74 69 6f 6e 23 2a 20 24 64 62 5d 7d 20 74 68 65  tion#* $db]} the
1d980 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
1d990 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 73 71 6c   if {[catch {sql
1d9a0 20 63 6c 6f 73 65 20 24 64 62 7d 20 65 72 72 6f   close $db} erro
1d9b0 72 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d  r] == 0} then {.
1d9c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
1d9d0 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e  f {!$quiet} then
1d9e0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
1d9f0 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
1da00 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
1da10 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1da20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 6c 6f 73        "---- clos
1da30 65 64 20 6c 65 61 6b 65 64 20 64 61 74 61 62 61  ed leaked databa
1da40 73 65 20 5c 22 22 20 24 64 62 20 5c 22 5c 6e 5d  se \"" $db \"\n]
1da50 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1da60 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  }..            }
1da70 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
1da80 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69         if {!$qui
1da90 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  et} then {..    
1daa0 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
1dab0 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  s $channel [appe
1dac0 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
1dad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 3d                "=
1dae0 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61 69  === WARNING: fai
1daf0 6c 65 64 20 74 6f 20 63 6c 6f 73 65 20 6c 65 61  led to close lea
1db00 6b 65 64 20 64 61 74 61 62 61 73 65 20 5c 22 22  ked database \""
1db10 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
1db20 20 20 20 20 20 20 20 20 24 64 62 20 22 5c 22 2c          $db "\",
1db30 20 65 72 72 6f 72 3a 20 22 20 5c 6e 5c 74 20 24   error: " \n\t $
1db40 65 72 72 6f 72 20 5c 6e 5d 0d 0a 20 20 20 20 20  error \n]..     
1db50 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
1db60 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
1db70 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
1db80 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  }....        #..
1db90 20 20 20 20 20 20 20 20 23 20 42 55 47 46 49 58          # BUGFIX
1dba0 3a 20 42 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67  : Before calling
1dbb0 20 74 68 65 20 6e 61 74 69 76 65 20 73 68 75 74   the native shut
1dbc0 64 6f 77 6e 20 66 75 6e 63 74 69 6f 6e 2c 20 6d  down function, m
1dbd0 61 6b 65 20 73 75 72 65 20 62 6f 74 68 0d 0a 20  ake sure both.. 
1dbe0 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 20         #        
1dbf0 20 6f 66 20 74 68 65 20 50 52 41 47 4d 41 20 72   of the PRAGMA r
1dc00 65 6c 61 74 65 64 20 64 69 72 65 63 74 6f 72 79  elated directory
1dc10 20 6e 61 6d 65 73 20 61 72 65 20 66 72 65 65 64   names are freed
1dc20 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
1dc30 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72 53 51        checkForSQ
1dc40 4c 69 74 65 44 69 72 65 63 74 6f 72 69 65 73 20  LiteDirectories 
1dc50 24 63 68 61 6e 6e 65 6c 20 74 72 75 65 0d 0a 0d  $channel true...
1dc60 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61  .        if {[ca
1dc70 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  tch {..         
1dc80 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d   object invoke -
1dc90 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63  flags +NonPublic
1dca0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
1dcb0 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51    System.Data.SQ
1dcc0 4c 69 74 65 2e 55 6e 73 61 66 65 4e 61 74 69 76  Lite.UnsafeNativ
1dcd0 65 4d 65 74 68 6f 64 73 20 73 71 6c 69 74 65 33  eMethods sqlite3
1dce0 5f 73 68 75 74 64 6f 77 6e 0d 0a 20 20 20 20 20  _shutdown..     
1dcf0 20 20 20 7d 20 72 65 73 75 6c 74 5d 20 3d 3d 20     } result] == 
1dd00 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
1dd10 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74       if {!$quiet
1dd20 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
1dd30 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
1dd40 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
1dd50 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
1dd60 20 20 20 20 22 2d 2d 2d 2d 20 63 61 6c 6c 20 73      "---- call s
1dd70 71 6c 69 74 65 33 5f 73 68 75 74 64 6f 77 6e 28  qlite3_shutdown(
1dd80 29 2e 2e 2e 20 6f 6b 3a 20 22 20 24 72 65 73 75  )... ok: " $resu
1dd90 6c 74 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20  lt \n]..        
1dda0 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 20 65    }..        } e
1ddb0 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  lse {..         
1ddc0 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68   if {!$quiet} th
1ddd0 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
1dde0 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
1ddf0 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
1de00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1de10 22 2d 2d 2d 2d 20 63 61 6c 6c 20 73 71 6c 69 74  "---- call sqlit
1de20 65 33 5f 73 68 75 74 64 6f 77 6e 28 29 2e 2e 2e  e3_shutdown()...
1de30 20 65 72 72 6f 72 3a 20 22 20 5c 6e 5c 74 20 24   error: " \n\t $
1de40 72 65 73 75 6c 74 20 5c 6e 5d 0d 0a 20 20 20 20  result \n]..    
1de50 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
1de60 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20   }..      }..   
1de70 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
1de80 67 65 74 53 65 74 74 69 6e 67 52 65 61 64 43 6f  getSettingReadCo
1de90 75 6e 74 20 7b 20 6e 61 6d 65 20 7b 76 69 61 46  unt { name {viaF
1dea0 69 6c 65 20 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a  ile false} } {..
1deb0 20 20 20 20 20 20 69 66 20 7b 5b 68 61 76 65 43        if {[haveC
1dec0 6f 6e 73 74 72 61 69 6e 74 20 62 75 69 6c 64 43  onstraint buildC
1ded0 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e 44 65 62  onfiguration.Deb
1dee0 75 67 5d 20 26 26 20 5b 63 61 74 63 68 20 7b 0d  ug] && [catch {.
1def0 0a 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20  .        object 
1df00 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e  invoke -flags +N
1df10 6f 6e 50 75 62 6c 69 63 20 2d 61 6c 69 61 73 20  onPublic -alias 
1df20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 53  \..            S
1df30 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
1df40 65 2e 44 65 62 75 67 44 61 74 61 20 5b 65 78 70  e.DebugData [exp
1df50 72 20 7b 24 76 69 61 46 69 6c 65 20 3f 20 5c 0d  r {$viaFile ? \.
1df60 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 73 65  .            "se
1df70 74 74 69 6e 67 46 69 6c 65 52 65 61 64 43 6f 75  ttingFileReadCou
1df80 6e 74 73 22 20 3a 20 22 73 65 74 74 69 6e 67 52  nts" : "settingR
1df90 65 61 64 43 6f 75 6e 74 73 22 7d 5d 0d 0a 20 20  eadCounts"}]..  
1dfa0 20 20 20 20 7d 20 73 65 74 74 69 6e 67 52 65 61      } settingRea
1dfb0 64 43 6f 75 6e 74 73 5d 20 3d 3d 20 30 7d 20 74  dCounts] == 0} t
1dfc0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 69  hen {..        i
1dfd0 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74  f {[string lengt
1dfe0 68 20 24 6e 61 6d 65 5d 20 3e 20 30 7d 20 74 68  h $name] > 0} th
1dff0 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
1e000 69 66 20 7b 5b 24 73 65 74 74 69 6e 67 52 65 61  if {[$settingRea
1e010 64 43 6f 75 6e 74 73 20 54 72 79 47 65 74 56 61  dCounts TryGetVa
1e020 6c 75 65 20 24 6e 61 6d 65 20 76 61 6c 75 65 5d  lue $name value]
1e030 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
1e040 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
1e050 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70  est_channel [app
1e060 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
1e070 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
1e080 20 73 65 74 74 69 6e 67 20 5c 22 22 20 24 6e 61   setting \"" $na
1e090 6d 65 20 22 5c 22 20 77 61 73 20 72 65 61 64 20  me "\" was read 
1e0a0 22 20 24 76 61 6c 75 65 20 22 20 74 69 6d 65 73  " $value " times
1e0b0 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  " \..           
1e0c0 20 20 20 20 20 5b 65 78 70 72 20 7b 24 76 69 61       [expr {$via
1e0d0 46 69 6c 65 20 3f 20 22 20 66 72 6f 6d 20 74 68  File ? " from th
1e0e0 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  e configuration 
1e0f0 66 69 6c 65 22 20 3a 20 22 22 7d 5d 20 5c 6e 5d  file" : ""}] \n]
1e100 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
1e110 72 65 74 75 72 6e 20 24 76 61 6c 75 65 0d 0a 20  return $value.. 
1e120 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
1e130 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
1e140 20 20 20 20 20 20 20 20 73 65 74 20 6e 61 6d 65          set name
1e150 43 6f 75 6e 74 20 5b 24 73 65 74 74 69 6e 67 52  Count [$settingR
1e160 65 61 64 43 6f 75 6e 74 73 20 43 6f 75 6e 74 5d  eadCounts Count]
1e170 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20  ..          set 
1e180 76 61 6c 75 65 43 6f 75 6e 74 20 30 0d 0a 0d 0a  valueCount 0....
1e190 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74            object
1e1a0 20 66 6f 72 65 61 63 68 20 2d 61 6c 69 61 73 20   foreach -alias 
1e1b0 70 61 69 72 20 24 73 65 74 74 69 6e 67 52 65 61  pair $settingRea
1e1c0 64 43 6f 75 6e 74 73 20 7b 0d 0a 20 20 20 20 20  dCounts {..     
1e1d0 20 20 20 20 20 20 20 69 6e 63 72 20 76 61 6c 75         incr valu
1e1e0 65 43 6f 75 6e 74 20 5b 24 70 61 69 72 20 56 61  eCount [$pair Va
1e1f0 6c 75 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  lue]....        
1e200 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
1e210 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e  t_channel [appen
1e220 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
1e230 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 73           "---- s
1e240 65 74 74 69 6e 67 20 5c 22 22 20 5b 24 70 61 69  etting \"" [$pai
1e250 72 20 4b 65 79 5d 20 22 5c 22 20 77 61 73 20 72  r Key] "\" was r
1e260 65 61 64 20 22 20 5b 24 70 61 69 72 20 56 61 6c  ead " [$pair Val
1e270 75 65 5d 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ue] \..         
1e280 20 20 20 20 20 20 20 22 20 74 69 6d 65 73 22 20         " times" 
1e290 5b 65 78 70 72 20 7b 24 76 69 61 46 69 6c 65 20  [expr {$viaFile 
1e2a0 3f 20 22 20 66 72 6f 6d 20 74 68 65 20 63 6f 6e  ? " from the con
1e2b0 66 69 67 75 72 61 74 69 6f 6e 20 66 69 6c 65 22  figuration file"
1e2c0 20 3a 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20   : \..          
1e2d0 20 20 20 20 20 20 22 22 7d 5d 20 5c 6e 5d 0d 0a        ""}] \n]..
1e2e0 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20            }.... 
1e2f0 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
1e300 5b 6c 69 73 74 20 24 6e 61 6d 65 43 6f 75 6e 74  [list $nameCount
1e310 20 24 76 61 6c 75 65 43 6f 75 6e 74 5d 0d 0a 20   $valueCount].. 
1e320 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
1e330 7d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b  }....      if {[
1e340 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 6e  string length $n
1e350 61 6d 65 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b  ame] > 0} then {
1e360 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20  ..        tputs 
1e370 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
1e380 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
1e390 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
1e3a0 20 73 65 74 74 69 6e 67 20 5c 22 22 20 24 6e 61   setting \"" $na
1e3b0 6d 65 20 22 5c 22 20 77 61 73 20 6e 6f 74 20 72  me "\" was not r
1e3c0 65 61 64 22 20 5b 65 78 70 72 20 7b 24 76 69 61  ead" [expr {$via
1e3d0 46 69 6c 65 20 3f 20 5c 0d 0a 20 20 20 20 20 20  File ? \..      
1e3e0 20 20 20 20 20 20 22 20 66 72 6f 6d 20 74 68 65        " from the
1e3f0 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 66   configuration f
1e400 69 6c 65 22 20 3a 20 22 22 7d 5d 20 5c 6e 5d 0d  ile" : ""}] \n].
1e410 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d  .      } else {.
1e420 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24  .        tputs $
1e430 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b  ::test_channel [
1e440 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
1e450 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
1e460 6e 6f 20 73 65 74 74 69 6e 67 73 20 77 65 72 65  no settings were
1e470 20 72 65 61 64 22 20 5b 65 78 70 72 20 7b 24 76   read" [expr {$v
1e480 69 61 46 69 6c 65 20 3f 20 5c 0d 0a 20 20 20 20  iaFile ? \..    
1e490 20 20 20 20 20 20 20 20 22 20 66 72 6f 6d 20 74          " from t
1e4a0 68 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  he configuration
1e4b0 20 66 69 6c 65 22 20 3a 20 22 22 7d 5d 20 5c 6e   file" : ""}] \n
1e4c0 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  ]..      }....  
1e4d0 20 20 20 20 72 65 74 75 72 6e 20 2d 31 0d 0a 20      return -1.. 
1e4e0 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
1e4f0 63 20 67 65 74 4f 74 68 65 72 43 6f 75 6e 74 20  c getOtherCount 
1e500 7b 20 6e 61 6d 65 20 7d 20 7b 0d 0a 20 20 20 20  { name } {..    
1e510 20 20 69 66 20 7b 5b 68 61 76 65 43 6f 6e 73 74    if {[haveConst
1e520 72 61 69 6e 74 20 62 75 69 6c 64 43 6f 6e 66 69  raint buildConfi
1e530 67 75 72 61 74 69 6f 6e 2e 44 65 62 75 67 5d 20  guration.Debug] 
1e540 26 26 20 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20  && [catch {..   
1e550 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f       object invo
1e560 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75  ke -flags +NonPu
1e570 62 6c 69 63 20 2d 61 6c 69 61 73 20 5c 0d 0a 20  blic -alias \.. 
1e580 20 20 20 20 20 20 20 20 20 20 20 53 79 73 74 65             Syste
1e590 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 44 65  m.Data.SQLite.De
1e5a0 62 75 67 44 61 74 61 20 6f 74 68 65 72 43 6f 75  bugData otherCou
1e5b0 6e 74 73 0d 0a 20 20 20 20 20 20 7d 20 6f 74 68  nts..      } oth
1e5c0 65 72 43 6f 75 6e 74 73 5d 20 3d 3d 20 30 7d 20  erCounts] == 0} 
1e5d0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
1e5e0 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67  if {[string leng
1e5f0 74 68 20 24 6e 61 6d 65 5d 20 3e 20 30 7d 20 74  th $name] > 0} t
1e600 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
1e610 20 69 66 20 7b 5b 24 6f 74 68 65 72 43 6f 75 6e   if {[$otherCoun
1e620 74 73 20 54 72 79 47 65 74 56 61 6c 75 65 20 24  ts TryGetValue $
1e630 6e 61 6d 65 20 76 61 6c 75 65 5d 7d 20 74 68 65  name value]} the
1e640 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
1e650 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
1e660 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
1e670 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
1e680 20 20 20 20 20 20 22 2d 2d 2d 2d 20 6f 74 68 65        "---- othe
1e690 72 20 63 6f 75 6e 74 65 72 20 5c 22 22 20 24 6e  r counter \"" $n
1e6a0 61 6d 65 20 22 5c 22 20 68 61 73 20 76 61 6c 75  ame "\" has valu
1e6b0 65 20 22 20 24 76 61 6c 75 65 20 5c 6e 5d 0d 0a  e " $value \n]..
1e6c0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65  ..            re
1e6d0 74 75 72 6e 20 24 76 61 6c 75 65 0d 0a 20 20 20  turn $value..   
1e6e0 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
1e6f0 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
1e700 20 20 20 20 20 20 73 65 74 20 6e 61 6d 65 43 6f        set nameCo
1e710 75 6e 74 20 5b 24 6f 74 68 65 72 43 6f 75 6e 74  unt [$otherCount
1e720 73 20 43 6f 75 6e 74 5d 0d 0a 20 20 20 20 20 20  s Count]..      
1e730 20 20 20 20 73 65 74 20 76 61 6c 75 65 43 6f 75      set valueCou
1e740 6e 74 20 30 0d 0a 0d 0a 20 20 20 20 20 20 20 20  nt 0....        
1e750 20 20 6f 62 6a 65 63 74 20 66 6f 72 65 61 63 68    object foreach
1e760 20 2d 61 6c 69 61 73 20 70 61 69 72 20 24 6f 74   -alias pair $ot
1e770 68 65 72 43 6f 75 6e 74 73 20 7b 0d 0a 20 20 20  herCounts {..   
1e780 20 20 20 20 20 20 20 20 20 69 6e 63 72 20 76 61           incr va
1e790 6c 75 65 43 6f 75 6e 74 20 5b 24 70 61 69 72 20  lueCount [$pair 
1e7a0 56 61 6c 75 65 5d 0d 0a 0d 0a 20 20 20 20 20 20  Value]....      
1e7b0 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
1e7c0 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70  est_channel [app
1e7d0 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
1e7e0 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
1e7f0 20 6f 74 68 65 72 20 63 6f 75 6e 74 65 72 20 5c   other counter \
1e800 22 22 20 5b 24 70 61 69 72 20 4b 65 79 5d 20 22  "" [$pair Key] "
1e810 5c 22 20 68 61 73 20 76 61 6c 75 65 20 22 20 5c  \" has value " \
1e820 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1e830 20 20 5b 24 70 61 69 72 20 56 61 6c 75 65 5d 20    [$pair Value] 
1e840 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  \n]..          }
1e850 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 72 65  ....          re
1e860 74 75 72 6e 20 5b 6c 69 73 74 20 24 6e 61 6d 65  turn [list $name
1e870 43 6f 75 6e 74 20 24 76 61 6c 75 65 43 6f 75 6e  Count $valueCoun
1e880 74 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20  t]..        }.. 
1e890 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
1e8a0 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67  if {[string leng
1e8b0 74 68 20 24 6e 61 6d 65 5d 20 3e 20 30 7d 20 74  th $name] > 0} t
1e8c0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 74  hen {..        t
1e8d0 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
1e8e0 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
1e8f0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
1e900 22 2d 2d 2d 2d 20 6f 74 68 65 72 20 63 6f 75 6e  "---- other coun
1e910 74 65 72 20 5c 22 22 20 24 6e 61 6d 65 20 22 5c  ter \"" $name "\
1e920 22 20 68 61 73 20 6e 6f 20 76 61 6c 75 65 5c 6e  " has no value\n
1e930 22 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65  "]..      } else
1e940 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74   {..        tput
1e950 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
1e960 6c 20 22 2d 2d 2d 2d 20 74 68 65 72 65 20 61 72  l "---- there ar
1e970 65 20 6e 6f 20 6f 74 68 65 72 20 63 6f 75 6e 74  e no other count
1e980 65 72 73 5c 6e 22 0d 0a 20 20 20 20 20 20 7d 0d  ers\n"..      }.
1e990 0a 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ...      return 
1e9a0 2d 31 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20  -1..    }.....  
1e9b0 20 20 70 72 6f 63 20 72 65 70 6f 72 74 53 51 4c    proc reportSQL
1e9c0 69 74 65 52 65 73 6f 75 72 63 65 73 20 7b 0d 0a  iteResources {..
1e9d0 20 20 20 20 20 20 20 20 20 20 20 20 63 68 61 6e              chan
1e9e0 6e 65 6c 20 7b 71 75 69 65 74 20 66 61 6c 73 65  nel {quiet false
1e9f0 7d 20 7b 72 65 73 65 74 20 74 72 75 65 7d 20 7b  } {reset true} {
1ea00 63 6f 6c 6c 65 63 74 20 74 72 75 65 7d 20 7d 20  collect true} } 
1ea10 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  {..      #..    
1ea20 20 20 23 20 4e 4f 54 45 3a 20 49 66 20 70 6f 73    # NOTE: If pos
1ea30 73 69 62 6c 65 2c 20 61 6c 77 61 79 73 20 72 65  sible, always re
1ea40 73 65 74 20 74 68 65 20 63 61 63 68 65 64 20 61  set the cached a
1ea50 73 73 65 6d 62 6c 79 20 64 69 72 65 63 74 6f 72  ssembly director
1ea60 79 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  y..      #      
1ea70 20 61 6e 64 20 74 68 65 20 63 61 63 68 65 64 20   and the cached 
1ea80 58 4d 4c 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  XML configuratio
1ea90 6e 20 66 69 6c 65 20 6e 61 6d 65 2e 0d 0a 20 20  n file name...  
1eaa0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20      #..      if 
1eab0 7b 5b 68 61 76 65 53 51 4c 69 74 65 4f 62 6a 65  {[haveSQLiteObje
1eac0 63 74 43 6f 6d 6d 61 6e 64 5d 7d 20 74 68 65 6e  ctCommand]} then
1ead0 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b   {..        if {
1eae0 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20  [catch {..      
1eaf0 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b      object invok
1eb00 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62  e -flags +NonPub
1eb10 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  lic \..         
1eb20 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61       System.Data
1eb30 2e 53 51 4c 69 74 65 2e 55 6e 73 61 66 65 4e 61  .SQLite.UnsafeNa
1eb40 74 69 76 65 4d 65 74 68 6f 64 73 20 5c 0d 0a 20  tiveMethods \.. 
1eb50 20 20 20 20 20 20 20 20 20 20 20 20 20 52 65 73               Res
1eb60 65 74 43 61 63 68 65 64 41 73 73 65 6d 62 6c 79  etCachedAssembly
1eb70 44 69 72 65 63 74 6f 72 79 0d 0a 20 20 20 20 20  Directory..     
1eb80 20 20 20 7d 20 65 72 72 6f 72 5d 20 3d 3d 20 30     } error] == 0
1eb90 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
1eba0 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d      if {!$quiet}
1ebb0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
1ebc0 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
1ebd0 6e 65 6c 20 22 2d 2d 2d 2d 20 72 65 73 65 74 20  nel "---- reset 
1ebe0 63 61 63 68 65 64 20 61 73 73 65 6d 62 6c 79 20  cached assembly 
1ebf0 64 69 72 65 63 74 6f 72 79 5c 6e 22 0d 0a 20 20  directory\n"..  
1ec00 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
1ec10 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
1ec20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69         if {!$qui
1ec30 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  et} then {..    
1ec40 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
1ec50 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
1ec60 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
1ec70 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e        "==== WARN
1ec80 49 4e 47 3a 20 66 61 69 6c 65 64 20 74 6f 20 72  ING: failed to r
1ec90 65 73 65 74 20 63 61 63 68 65 64 20 61 73 73 65  eset cached asse
1eca0 6d 62 6c 79 20 64 69 72 65 63 74 6f 72 79 2c 20  mbly directory, 
1ecb0 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  " \..           
1ecc0 20 20 20 20 20 22 65 72 72 6f 72 3a 20 22 20 5c       "error: " \
1ecd0 6e 5c 74 20 24 65 72 72 6f 72 20 5c 6e 5d 0d 0a  n\t $error \n]..
1ece0 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
1ecf0 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
1ed00 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a    if {[catch {..
1ed10 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74            object
1ed20 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b   invoke -flags +
1ed30 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20  NonPublic \..   
1ed40 20 20 20 20 20 20 20 20 20 20 20 53 79 73 74 65             Syste
1ed50 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 55 6e  m.Data.SQLite.Un
1ed60 73 61 66 65 4e 61 74 69 76 65 4d 65 74 68 6f 64  safeNativeMethod
1ed70 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
1ed80 20 20 20 52 65 73 65 74 43 61 63 68 65 64 58 6d     ResetCachedXm
1ed90 6c 43 6f 6e 66 69 67 46 69 6c 65 4e 61 6d 65 0d  lConfigFileName.
1eda0 0a 20 20 20 20 20 20 20 20 7d 20 65 72 72 6f 72  .        } error
1edb0 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  ] == 0} then {..
1edc0 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 24            if {!$
1edd0 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20  quiet} then {.. 
1ede0 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
1edf0 20 24 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20   $channel "---- 
1ee00 72 65 73 65 74 20 63 61 63 68 65 64 20 58 4d 4c  reset cached XML
1ee10 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 66   configuration f
1ee20 69 6c 65 20 6e 61 6d 65 5c 6e 22 0d 0a 20 20 20  ile name\n"..   
1ee30 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
1ee40 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
1ee50 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65        if {!$quie
1ee60 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  t} then {..     
1ee70 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
1ee80 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
1ee90 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
1eea0 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49       "==== WARNI
1eeb0 4e 47 3a 20 66 61 69 6c 65 64 20 74 6f 20 72 65  NG: failed to re
1eec0 73 65 74 20 63 61 63 68 65 64 20 58 4d 4c 20 63  set cached XML c
1eed0 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 22 20 5c  onfiguration " \
1eee0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1eef0 20 20 22 66 69 6c 65 20 6e 61 6d 65 2c 20 65 72    "file name, er
1ef00 72 6f 72 3a 20 22 20 5c 6e 5c 74 20 24 65 72 72  ror: " \n\t $err
1ef10 6f 72 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20  or \n]..        
1ef20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a    }..        }..
1ef30 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
1ef40 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
1ef50 3a 20 49 66 20 61 76 61 69 6c 61 62 6c 65 2c 20  : If available, 
1ef60 72 65 70 6f 72 74 20 6f 6e 20 28 61 6e 64 20 70  report on (and p
1ef70 6f 73 73 69 62 6c 79 20 72 65 73 65 74 29 20 74  ossibly reset) t
1ef80 68 65 20 72 75 6e 74 69 6d 65 0d 0a 20 20 20 20  he runtime..    
1ef90 20 20 23 20 20 20 20 20 20 20 63 6f 6e 66 69 67    #       config
1efa0 75 72 61 74 69 6f 6e 20 73 74 61 74 69 73 74 69  uration statisti
1efb0 63 73 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  cs...      #..  
1efc0 20 20 20 20 69 66 20 7b 5b 68 61 76 65 53 51 4c      if {[haveSQL
1efd0 69 74 65 4f 62 6a 65 63 74 43 6f 6d 6d 61 6e 64  iteObjectCommand
1efe0 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20  ] && \..        
1eff0 20 20 5b 68 61 76 65 43 6f 6e 73 74 72 61 69 6e    [haveConstrain
1f000 74 20 62 75 69 6c 64 43 6f 6e 66 69 67 75 72 61  t buildConfigura
1f010 74 69 6f 6e 2e 44 65 62 75 67 5d 7d 20 74 68 65  tion.Debug]} the
1f020 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20  n {..        if 
1f030 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20  {[catch {..     
1f040 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f       object invo
1f050 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75  ke -flags +NonPu
1f060 62 6c 69 63 20 2d 61 6c 69 61 73 20 5c 0d 0a 20  blic -alias \.. 
1f070 20 20 20 20 20 20 20 20 20 20 20 20 20 53 79 73               Sys
1f080 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e  tem.Data.SQLite.
1f090 44 65 62 75 67 44 61 74 61 20 73 65 74 74 69 6e  DebugData settin
1f0a0 67 52 65 61 64 43 6f 75 6e 74 73 0d 0a 20 20 20  gReadCounts..   
1f0b0 20 20 20 20 20 7d 20 73 65 74 74 69 6e 67 52 65       } settingRe
1f0c0 61 64 43 6f 75 6e 74 73 5d 20 3d 3d 20 30 7d 20  adCounts] == 0} 
1f0d0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
1f0e0 20 20 73 65 74 20 6e 61 6d 65 43 6f 75 6e 74 20    set nameCount 
1f0f0 5b 24 73 65 74 74 69 6e 67 52 65 61 64 43 6f 75  [$settingReadCou
1f100 6e 74 73 20 43 6f 75 6e 74 5d 0d 0a 20 20 20 20  nts Count]..    
1f110 20 20 20 20 20 20 73 65 74 20 76 61 6c 75 65 43        set valueC
1f120 6f 75 6e 74 20 30 0d 0a 0d 0a 20 20 20 20 20 20  ount 0....      
1f130 20 20 20 20 6f 62 6a 65 63 74 20 66 6f 72 65 61      object forea
1f140 63 68 20 2d 61 6c 69 61 73 20 70 61 69 72 20 24  ch -alias pair $
1f150 73 65 74 74 69 6e 67 52 65 61 64 43 6f 75 6e 74  settingReadCount
1f160 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s {..           
1f170 20 69 6e 63 72 20 76 61 6c 75 65 43 6f 75 6e 74   incr valueCount
1f180 20 5b 24 70 61 69 72 20 56 61 6c 75 65 5d 0d 0a   [$pair Value]..
1f190 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ..            if
1f1a0 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20   {!$quiet} then 
1f1b0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
1f1c0 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
1f1d0 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
1f1e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f1f0 20 22 2d 2d 2d 2d 20 73 65 74 74 69 6e 67 20 5c   "---- setting \
1f200 22 22 20 5b 24 70 61 69 72 20 4b 65 79 5d 20 22  "" [$pair Key] "
1f210 5c 22 20 77 61 73 20 72 65 61 64 20 22 20 5c 0d  \" was read " \.
1f220 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1f230 20 20 20 5b 24 70 61 69 72 20 56 61 6c 75 65 5d     [$pair Value]
1f240 20 22 20 74 69 6d 65 73 5c 6e 22 5d 0d 0a 20 20   " times\n"]..  
1f250 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
1f260 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
1f270 20 20 20 20 20 20 69 66 20 7b 24 72 65 73 65 74        if {$reset
1f280 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
1f290 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68        if {[catch
1f2a0 20 7b 24 73 65 74 74 69 6e 67 52 65 61 64 43 6f   {$settingReadCo
1f2b0 75 6e 74 73 20 43 6c 65 61 72 7d 20 65 72 72 6f  unts Clear} erro
1f2c0 72 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d  r] == 0} then {.
1f2d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
1f2e0 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e  f {!$quiet} then
1f2f0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
1f300 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
1f310 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
1f320 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1f330 20 20 20 20 20 20 22 2d 2d 2d 2d 20 72 65 73 65        "---- rese
1f340 74 20 73 65 74 74 69 6e 67 20 73 74 61 74 69 73  t setting statis
1f350 74 69 63 73 20 66 6f 72 20 74 68 65 20 70 72 65  tics for the pre
1f360 76 69 6f 75 73 20 22 20 5c 0d 0a 20 20 20 20 20  vious " \..     
1f370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 24                 $
1f380 6e 61 6d 65 43 6f 75 6e 74 20 22 20 6e 61 6d 65  nameCount " name
1f390 73 20 61 6e 64 20 22 20 24 76 61 6c 75 65 43 6f  s and " $valueCo
1f3a0 75 6e 74 20 22 20 76 61 6c 75 65 73 20 72 65 61  unt " values rea
1f3b0 64 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20 20  d\n"]..         
1f3c0 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
1f3d0 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
1f3e0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b              if {
1f3f0 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d  !$quiet} then {.
1f400 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1f410 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
1f420 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
1f430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f440 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47     "==== WARNING
1f450 3a 20 66 61 69 6c 65 64 20 74 6f 20 72 65 73 65  : failed to rese
1f460 74 20 73 65 74 74 69 6e 67 20 73 74 61 74 69 73  t setting statis
1f470 74 69 63 73 20 66 6f 72 20 22 20 5c 0d 0a 20 20  tics for " \..  
1f480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f490 20 20 22 74 68 65 20 70 72 65 76 69 6f 75 73 20    "the previous 
1f4a0 22 20 24 6e 61 6d 65 43 6f 75 6e 74 20 22 20 6e  " $nameCount " n
1f4b0 61 6d 65 73 20 61 6e 64 20 22 20 24 76 61 6c 75  ames and " $valu
1f4c0 65 43 6f 75 6e 74 20 5c 0d 0a 20 20 20 20 20 20  eCount \..      
1f4d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20                " 
1f4e0 76 61 6c 75 65 73 20 72 65 61 64 2c 20 65 72 72  values read, err
1f4f0 6f 72 3a 20 22 20 5c 6e 5c 74 20 24 65 72 72 6f  or: " \n\t $erro
1f500 72 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20  r \n]..         
1f510 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
1f520 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
1f530 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d   }..        }...
1f540 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61  .        if {[ca
1f550 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  tch {..         
1f560 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d   object invoke -
1f570 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63  flags +NonPublic
1f580 20 2d 61 6c 69 61 73 20 5c 0d 0a 20 20 20 20 20   -alias \..     
1f590 20 20 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e           System.
1f5a0 44 61 74 61 2e 53 51 4c 69 74 65 2e 44 65 62 75  Data.SQLite.Debu
1f5b0 67 44 61 74 61 20 73 65 74 74 69 6e 67 46 69 6c  gData settingFil
1f5c0 65 52 65 61 64 43 6f 75 6e 74 73 0d 0a 20 20 20  eReadCounts..   
1f5d0 20 20 20 20 20 7d 20 73 65 74 74 69 6e 67 46 69       } settingFi
1f5e0 6c 65 52 65 61 64 43 6f 75 6e 74 73 5d 20 3d 3d  leReadCounts] ==
1f5f0 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
1f600 20 20 20 20 20 20 73 65 74 20 6e 61 6d 65 43 6f        set nameCo
1f610 75 6e 74 20 5b 24 73 65 74 74 69 6e 67 46 69 6c  unt [$settingFil
1f620 65 52 65 61 64 43 6f 75 6e 74 73 20 43 6f 75 6e  eReadCounts Coun
1f630 74 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65  t]..          se
1f640 74 20 76 61 6c 75 65 43 6f 75 6e 74 20 30 0d 0a  t valueCount 0..
1f650 0d 0a 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65  ..          obje
1f660 63 74 20 66 6f 72 65 61 63 68 20 2d 61 6c 69 61  ct foreach -alia
1f670 73 20 70 61 69 72 20 24 73 65 74 74 69 6e 67 46  s pair $settingF
1f680 69 6c 65 52 65 61 64 43 6f 75 6e 74 73 20 7b 0d  ileReadCounts {.
1f690 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 63  .            inc
1f6a0 72 20 76 61 6c 75 65 43 6f 75 6e 74 20 5b 24 70  r valueCount [$p
1f6b0 61 69 72 20 56 61 6c 75 65 5d 0d 0a 0d 0a 20 20  air Value]....  
1f6c0 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 24            if {!$
1f6d0 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20  quiet} then {.. 
1f6e0 20 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75               tpu
1f6f0 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70  ts $channel [app
1f700 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
1f710 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d               "--
1f720 2d 2d 20 73 65 74 74 69 6e 67 20 5c 22 22 20 5b  -- setting \"" [
1f730 24 70 61 69 72 20 4b 65 79 5d 20 22 5c 22 20 77  $pair Key] "\" w
1f740 61 73 20 72 65 61 64 20 22 20 5c 0d 0a 20 20 20  as read " \..   
1f750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b                 [
1f760 24 70 61 69 72 20 56 61 6c 75 65 5d 20 22 20 74  $pair Value] " t
1f770 69 6d 65 73 20 66 72 6f 6d 20 74 68 65 20 63 6f  imes from the co
1f780 6e 66 69 67 75 72 61 74 69 6f 6e 20 66 69 6c 65  nfiguration file
1f790 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20 20 20  \n"]..          
1f7a0 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d    }..          }
1f7b0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66  ....          if
1f7c0 20 7b 24 72 65 73 65 74 7d 20 74 68 65 6e 20 7b   {$reset} then {
1f7d0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ..            if
1f7e0 20 7b 5b 63 61 74 63 68 20 7b 24 73 65 74 74 69   {[catch {$setti
1f7f0 6e 67 46 69 6c 65 52 65 61 64 43 6f 75 6e 74 73  ngFileReadCounts
1f800 20 43 6c 65 61 72 7d 20 65 72 72 6f 72 5d 20 3d   Clear} error] =
1f810 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  = 0} then {..   
1f820 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21             if {!
1f830 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a  $quiet} then {..
1f840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f850 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b  tputs $channel [
1f860 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
1f870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f880 20 20 22 2d 2d 2d 2d 20 72 65 73 65 74 20 73 65    "---- reset se
1f890 74 74 69 6e 67 20 73 74 61 74 69 73 74 69 63 73  tting statistics
1f8a0 20 66 6f 72 20 74 68 65 20 70 72 65 76 69 6f 75   for the previou
1f8b0 73 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  s " \..         
1f8c0 20 20 20 20 20 20 20 20 20 20 20 24 6e 61 6d 65             $name
1f8d0 43 6f 75 6e 74 20 22 20 6e 61 6d 65 73 20 61 6e  Count " names an
1f8e0 64 20 22 20 24 76 61 6c 75 65 43 6f 75 6e 74 20  d " $valueCount 
1f8f0 22 20 76 61 6c 75 65 73 20 72 65 61 64 20 22 20  " values read " 
1f900 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
1f910 20 20 20 20 20 20 20 22 66 72 6f 6d 20 74 68 65         "from the
1f920 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 66   configuration f
1f930 69 6c 65 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20  ile\n"]..       
1f940 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
1f950 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
1f960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
1f970 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20   {!$quiet} then 
1f980 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
1f990 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
1f9a0 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
1f9b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1f9c0 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49       "==== WARNI
1f9d0 4e 47 3a 20 66 61 69 6c 65 64 20 74 6f 20 72 65  NG: failed to re
1f9e0 73 65 74 20 73 65 74 74 69 6e 67 20 73 74 61 74  set setting stat
1f9f0 69 73 74 69 63 73 20 66 6f 72 20 22 20 5c 0d 0a  istics for " \..
1fa00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fa10 20 20 20 20 22 74 68 65 20 70 72 65 76 69 6f 75      "the previou
1fa20 73 20 22 20 24 6e 61 6d 65 43 6f 75 6e 74 20 22  s " $nameCount "
1fa30 20 6e 61 6d 65 73 20 61 6e 64 20 22 20 24 76 61   names and " $va
1fa40 6c 75 65 43 6f 75 6e 74 20 5c 0d 0a 20 20 20 20  lueCount \..    
1fa50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fa60 22 20 76 61 6c 75 65 73 20 72 65 61 64 20 66 72  " values read fr
1fa70 6f 6d 20 74 68 65 20 63 6f 6e 66 69 67 75 72 61  om the configura
1fa80 74 69 6f 6e 20 66 69 6c 65 2c 20 65 72 72 6f 72  tion file, error
1fa90 3a 20 22 20 5c 6e 5c 74 20 5c 0d 0a 20 20 20 20  : " \n\t \..    
1faa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fab0 24 65 72 72 6f 72 20 5c 6e 5d 0d 0a 20 20 20 20  $error \n]..    
1fac0 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
1fad0 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
1fae0 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
1faf0 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66   }....        if
1fb00 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20   {[catch {..    
1fb10 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76        object inv
1fb20 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50  oke -flags +NonP
1fb30 75 62 6c 69 63 20 2d 61 6c 69 61 73 20 5c 0d 0a  ublic -alias \..
1fb40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 79                Sy
1fb50 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
1fb60 2e 44 65 62 75 67 44 61 74 61 20 6f 74 68 65 72  .DebugData other
1fb70 43 6f 75 6e 74 73 0d 0a 20 20 20 20 20 20 20 20  Counts..        
1fb80 7d 20 6f 74 68 65 72 43 6f 75 6e 74 73 5d 20 3d  } otherCounts] =
1fb90 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  = 0} then {..   
1fba0 20 20 20 20 20 20 20 73 65 74 20 6e 61 6d 65 43         set nameC
1fbb0 6f 75 6e 74 20 5b 24 6f 74 68 65 72 43 6f 75 6e  ount [$otherCoun
1fbc0 74 73 20 43 6f 75 6e 74 5d 0d 0a 20 20 20 20 20  ts Count]..     
1fbd0 20 20 20 20 20 73 65 74 20 76 61 6c 75 65 43 6f       set valueCo
1fbe0 75 6e 74 20 30 0d 0a 0d 0a 20 20 20 20 20 20 20  unt 0....       
1fbf0 20 20 20 6f 62 6a 65 63 74 20 66 6f 72 65 61 63     object foreac
1fc00 68 20 2d 61 6c 69 61 73 20 70 61 69 72 20 24 6f  h -alias pair $o
1fc10 74 68 65 72 43 6f 75 6e 74 73 20 7b 0d 0a 20 20  therCounts {..  
1fc20 20 20 20 20 20 20 20 20 20 20 69 6e 63 72 20 76            incr v
1fc30 61 6c 75 65 43 6f 75 6e 74 20 5b 24 70 61 69 72  alueCount [$pair
1fc40 20 56 61 6c 75 65 5d 0d 0a 0d 0a 20 20 20 20 20   Value]....     
1fc50 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69         if {!$qui
1fc60 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  et} then {..    
1fc70 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
1fc80 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  $channel [append
1fc90 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
1fca0 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
1fcb0 6f 74 68 65 72 20 63 6f 75 6e 74 65 72 20 5c 22  other counter \"
1fcc0 22 20 5b 24 70 61 69 72 20 4b 65 79 5d 20 22 5c  " [$pair Key] "\
1fcd0 22 20 68 61 73 20 76 61 6c 75 65 20 22 20 5c 0d  " has value " \.
1fce0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1fcf0 20 20 20 5b 24 70 61 69 72 20 56 61 6c 75 65 5d     [$pair Value]
1fd00 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20   \n]..          
1fd10 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d    }..          }
1fd20 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66  ....          if
1fd30 20 7b 24 72 65 73 65 74 7d 20 74 68 65 6e 20 7b   {$reset} then {
1fd40 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ..            if
1fd50 20 7b 5b 63 61 74 63 68 20 7b 24 6f 74 68 65 72   {[catch {$other
1fd60 43 6f 75 6e 74 73 20 43 6c 65 61 72 7d 20 65 72  Counts Clear} er
1fd70 72 6f 72 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20  ror] == 0} then 
1fd80 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
1fd90 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68   if {!$quiet} th
1fda0 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
1fdb0 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
1fdc0 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
1fdd0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
1fde0 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 72 65          "---- re
1fdf0 73 65 74 20 6f 74 68 65 72 20 63 6f 75 6e 74 65  set other counte
1fe00 72 73 20 66 6f 72 20 74 68 65 20 70 72 65 76 69  rs for the previ
1fe10 6f 75 73 20 22 20 5c 0d 0a 20 20 20 20 20 20 20  ous " \..       
1fe20 20 20 20 20 20 20 20 20 20 20 20 20 20 24 6e 61               $na
1fe30 6d 65 43 6f 75 6e 74 20 22 20 6e 61 6d 65 73 20  meCount " names 
1fe40 61 6e 64 20 22 20 24 76 61 6c 75 65 43 6f 75 6e  and " $valueCoun
1fe50 74 20 22 20 76 61 6c 75 65 73 5c 6e 22 5d 0d 0a  t " values\n"]..
1fe60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d                }.
1fe70 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 20 65  .            } e
1fe80 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  lse {..         
1fe90 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74       if {!$quiet
1fea0 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
1feb0 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
1fec0 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  $channel [append
1fed0 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
1fee0 20 20 20 20 20 20 20 20 20 20 20 20 22 3d 3d 3d              "===
1fef0 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65  = WARNING: faile
1ff00 64 20 74 6f 20 72 65 73 65 74 20 6f 74 68 65 72  d to reset other
1ff10 20 63 6f 75 6e 74 65 72 73 20 66 6f 72 20 22 20   counters for " 
1ff20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
1ff30 20 20 20 20 20 20 20 22 74 68 65 20 70 72 65 76         "the prev
1ff40 69 6f 75 73 20 22 20 24 6e 61 6d 65 43 6f 75 6e  ious " $nameCoun
1ff50 74 20 22 20 6e 61 6d 65 73 20 61 6e 64 20 22 20  t " names and " 
1ff60 24 76 61 6c 75 65 43 6f 75 6e 74 20 5c 0d 0a 20  $valueCount \.. 
1ff70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ff80 20 20 20 22 20 76 61 6c 75 65 73 2c 20 65 72 72     " values, err
1ff90 6f 72 3a 20 22 20 5c 6e 5c 74 20 24 65 72 72 6f  or: " \n\t $erro
1ffa0 72 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20  r \n]..         
1ffb0 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
1ffc0 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
1ffd0 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20   }..        }.. 
1ffe0 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
1fff0 69 66 20 7b 5b 68 61 76 65 53 51 4c 69 74 65 4f  if {[haveSQLiteO
20000 62 6a 65 63 74 43 6f 6d 6d 61 6e 64 5d 20 26 26  bjectCommand] &&
20010 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 68   \..          [h
20020 61 76 65 53 51 4c 69 74 65 44 65 66 69 6e 65 43  aveSQLiteDefineC
20030 6f 6e 73 74 61 6e 74 20 49 4e 54 45 52 4f 50 5f  onstant INTEROP_
20040 56 49 52 54 55 41 4c 5f 54 41 42 4c 45 5d 20 26  VIRTUAL_TABLE] &
20050 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b  & \..          [
20060 68 61 76 65 53 51 4c 69 74 65 44 65 66 69 6e 65  haveSQLiteDefine
20070 43 6f 6e 73 74 61 6e 74 20 54 52 41 43 4b 5f 4d  Constant TRACK_M
20080 45 4d 4f 52 59 5f 42 59 54 45 53 5d 7d 20 74 68  EMORY_BYTES]} th
20090 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66  en {..        if
200a0 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20   {!$quiet} then 
200b0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70 75  {..          tpu
200c0 74 73 20 24 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d  ts $channel "---
200d0 2d 20 63 75 72 72 65 6e 74 20 6d 65 6d 6f 72 79  - current memory
200e0 20 69 6e 20 75 73 65 20 62 79 20 53 51 4c 69 74   in use by SQLit
200f0 65 4d 65 6d 6f 72 79 2e 2e 2e 20 22 0d 0a 20 20  eMemory... "..  
20100 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
20110 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d     if {[catch {.
20120 0a 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63  .          objec
20130 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20  t invoke -flags 
20140 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20  +NonPublic \..  
20150 20 20 20 20 20 20 20 20 20 20 20 20 53 79 73 74              Syst
20160 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 53  em.Data.SQLite.S
20170 51 4c 69 74 65 4d 65 6d 6f 72 79 20 62 79 74 65  QLiteMemory byte
20180 73 41 6c 6c 6f 63 61 74 65 64 0d 0a 20 20 20 20  sAllocated..    
20190 20 20 20 20 7d 20 6d 65 6d 6f 72 79 5d 20 3d 3d      } memory] ==
201a0 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
201b0 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65        if {!$quie
201c0 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  t} then {..     
201d0 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
201e0 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
201f0 73 20 24 6d 65 6d 6f 72 79 20 22 20 62 79 74 65  s $memory " byte
20200 73 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20 20  s\n"]..         
20210 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 20 65 6c   }..        } el
20220 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  se {..          
20230 73 65 74 20 6d 65 6d 6f 72 79 20 75 6e 6b 6e 6f  set memory unkno
20240 77 6e 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  wn....          
20250 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65  if {!$quiet} the
20260 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
20270 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
20280 5b 61 70 70 65 6e 64 41 72 67 73 20 24 6d 65 6d  [appendArgs $mem
20290 6f 72 79 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20  ory \n]..       
202a0 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d     }..        }.
202b0 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21  ...        if {!
202c0 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a  $quiet} then {..
202d0 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
202e0 24 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 6d  $channel "---- m
202f0 61 78 69 6d 75 6d 20 6d 65 6d 6f 72 79 20 69 6e  aximum memory in
20300 20 75 73 65 20 62 79 20 53 51 4c 69 74 65 4d 65   use by SQLiteMe
20310 6d 6f 72 79 2e 2e 2e 20 22 0d 0a 20 20 20 20 20  mory... "..     
20320 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
20330 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20  if {[catch {..  
20340 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69          object i
20350 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f  nvoke -flags +No
20360 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20  nPublic \..     
20370 20 20 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e           System.
20380 44 61 74 61 2e 53 51 4c 69 74 65 2e 53 51 4c 69  Data.SQLite.SQLi
20390 74 65 4d 65 6d 6f 72 79 20 6d 61 78 69 6d 75 6d  teMemory maximum
203a0 42 79 74 65 73 41 6c 6c 6f 63 61 74 65 64 0d 0a  BytesAllocated..
203b0 20 20 20 20 20 20 20 20 7d 20 6d 65 6d 6f 72 79          } memory
203c0 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  ] == 0} then {..
203d0 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 24            if {!$
203e0 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20  quiet} then {.. 
203f0 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
20400 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e   $channel [appen
20410 64 41 72 67 73 20 24 6d 65 6d 6f 72 79 20 22 20  dArgs $memory " 
20420 62 79 74 65 73 5c 6e 22 5d 0d 0a 20 20 20 20 20  bytes\n"]..     
20430 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
20440 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
20450 20 20 20 20 73 65 74 20 6d 65 6d 6f 72 79 20 75      set memory u
20460 6e 6b 6e 6f 77 6e 0d 0a 0d 0a 20 20 20 20 20 20  nknown....      
20470 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d      if {!$quiet}
20480 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
20490 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
204a0 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
204b0 24 6d 65 6d 6f 72 79 20 5c 6e 5d 0d 0a 20 20 20  $memory \n]..   
204c0 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
204d0 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a    }..      }....
204e0 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65        if {!$quie
204f0 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  t} then {..     
20500 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
20510 6c 20 22 2d 2d 2d 2d 20 63 75 72 72 65 6e 74 20  l "---- current 
20520 6d 65 6d 6f 72 79 20 69 6e 20 75 73 65 20 62 79  memory in use by
20530 20 53 51 4c 69 74 65 2e 2e 2e 20 22 0d 0a 20 20   SQLite... "..  
20540 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 69      }....      i
20550 66 20 7b 5b 68 61 76 65 53 51 4c 69 74 65 4f 62  f {[haveSQLiteOb
20560 6a 65 63 74 43 6f 6d 6d 61 6e 64 5d 7d 20 74 68  jectCommand]} th
20570 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66  en {..        if
20580 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20   {[catch {..    
20590 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76        object inv
205a0 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50  oke -flags +NonP
205b0 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20 20  ublic \..       
205c0 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61         System.Da
205d0 74 61 2e 53 51 4c 69 74 65 2e 55 6e 73 61 66 65  ta.SQLite.Unsafe
205e0 4e 61 74 69 76 65 4d 65 74 68 6f 64 73 20 73 71  NativeMethods sq
205f0 6c 69 74 65 33 5f 6d 65 6d 6f 72 79 5f 75 73 65  lite3_memory_use
20600 64 0d 0a 20 20 20 20 20 20 20 20 7d 20 6d 65 6d  d..        } mem
20610 6f 72 79 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20  ory] == 0} then 
20620 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20  {..          if 
20630 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b  {!$quiet} then {
20640 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70  ..            tp
20650 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70  uts $channel [ap
20660 70 65 6e 64 41 72 67 73 20 24 6d 65 6d 6f 72 79  pendArgs $memory
20670 20 22 20 62 79 74 65 73 5c 6e 22 5d 0d 0a 20 20   " bytes\n"]..  
20680 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
20690 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
206a0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
206b0 20 20 20 20 23 20 4e 4f 54 45 3a 20 4d 61 79 62      # NOTE: Mayb
206c0 65 20 74 68 65 20 53 51 4c 69 74 65 20 63 6f 72  e the SQLite cor
206d0 65 20 6c 69 62 72 61 72 79 20 69 73 20 75 6e 61  e library is una
206e0 76 61 69 6c 61 62 6c 65 3f 0d 0a 20 20 20 20 20  vailable?..     
206f0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
20700 20 20 73 65 74 20 6d 65 6d 6f 72 79 20 75 6e 6b    set memory unk
20710 6e 6f 77 6e 0d 0a 0d 0a 20 20 20 20 20 20 20 20  nown....        
20720 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74    if {!$quiet} t
20730 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
20740 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
20750 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 24 6d  l [appendArgs $m
20760 65 6d 6f 72 79 20 5c 6e 5d 0d 0a 20 20 20 20 20  emory \n]..     
20770 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
20780 7d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20  }..      } else 
20790 7b 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 6d  {..        set m
207a0 65 6d 6f 72 79 20 75 6e 61 76 61 69 6c 61 62 6c  emory unavailabl
207b0 65 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20  e....        if 
207c0 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b  {!$quiet} then {
207d0 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70 75 74  ..          tput
207e0 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  s $channel [appe
207f0 6e 64 41 72 67 73 20 24 6d 65 6d 6f 72 79 20 5c  ndArgs $memory \
20800 6e 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20  n]..        }.. 
20810 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
20820 73 65 74 20 72 65 73 75 6c 74 20 24 6d 65 6d 6f  set result $memo
20830 72 79 3b 20 23 20 4e 4f 54 45 3a 20 52 65 74 75  ry; # NOTE: Retu
20840 72 6e 20 6d 65 6d 6f 72 79 20 69 6e 2d 75 73 65  rn memory in-use
20850 20 74 6f 20 6f 75 72 20 63 61 6c 6c 65 72 2e 0d   to our caller..
20860 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 21 24 71  ...      if {!$q
20870 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  uiet} then {..  
20880 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
20890 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 6d 61 78 69 6d  nnel "---- maxim
208a0 75 6d 20 6d 65 6d 6f 72 79 20 69 6e 20 75 73 65  um memory in use
208b0 20 62 79 20 53 51 4c 69 74 65 2e 2e 2e 20 22 0d   by SQLite... ".
208c0 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
208d0 20 20 69 66 20 7b 5b 68 61 76 65 53 51 4c 69 74    if {[haveSQLit
208e0 65 4f 62 6a 65 63 74 43 6f 6d 6d 61 6e 64 5d 7d  eObjectCommand]}
208f0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
20900 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20   if {[catch {.. 
20910 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20           object 
20920 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e  invoke -flags +N
20930 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20  onPublic \..    
20940 20 20 20 20 20 20 20 20 20 20 53 79 73 74 65 6d            System
20950 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 55 6e 73  .Data.SQLite.Uns
20960 61 66 65 4e 61 74 69 76 65 4d 65 74 68 6f 64 73  afeNativeMethods
20970 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
20980 20 20 73 71 6c 69 74 65 33 5f 6d 65 6d 6f 72 79    sqlite3_memory
20990 5f 68 69 67 68 77 61 74 65 72 20 30 0d 0a 20 20  _highwater 0..  
209a0 20 20 20 20 20 20 7d 20 6d 65 6d 6f 72 79 5d 20        } memory] 
209b0 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  == 0} then {..  
209c0 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75          if {!$qu
209d0 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  iet} then {..   
209e0 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
209f0 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
20a00 72 67 73 20 24 6d 65 6d 6f 72 79 20 22 20 62 79  rgs $memory " by
20a10 74 65 73 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20  tes\n"]..       
20a20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 20     }..        } 
20a30 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
20a40 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23    #..          #
20a50 20 4e 4f 54 45 3a 20 4d 61 79 62 65 20 74 68 65   NOTE: Maybe the
20a60 20 53 51 4c 69 74 65 20 63 6f 72 65 20 6c 69 62   SQLite core lib
20a70 72 61 72 79 20 69 73 20 75 6e 61 76 61 69 6c 61  rary is unavaila
20a80 62 6c 65 3f 0d 0a 20 20 20 20 20 20 20 20 20 20  ble?..          
20a90 23 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74  #..          set
20aa0 20 6d 65 6d 6f 72 79 20 75 6e 6b 6e 6f 77 6e 0d   memory unknown.
20ab0 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20  ...          if 
20ac0 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b  {!$quiet} then {
20ad0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70  ..            tp
20ae0 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70  uts $channel [ap
20af0 70 65 6e 64 41 72 67 73 20 24 6d 65 6d 6f 72 79  pendArgs $memory
20b00 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20   \n]..          
20b10 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  }..        }..  
20b20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
20b30 20 20 20 20 20 20 73 65 74 20 6d 65 6d 6f 72 79        set memory
20b40 20 75 6e 61 76 61 69 6c 61 62 6c 65 0d 0a 0d 0a   unavailable....
20b50 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75          if {!$qu
20b60 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  iet} then {..   
20b70 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
20b80 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
20b90 73 20 24 6d 65 6d 6f 72 79 20 5c 6e 5d 0d 0a 20  s $memory \n].. 
20ba0 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
20bb0 7d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 24  }....      if {$
20bc0 63 6f 6c 6c 65 63 74 7d 20 74 68 65 6e 20 7b 0d  collect} then {.
20bd0 0a 20 20 20 20 20 20 20 20 63 6f 6c 6c 65 63 74  .        collect
20be0 47 61 72 62 61 67 65 20 24 63 68 61 6e 6e 65 6c  Garbage $channel
20bf0 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
20c00 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20     if {!$quiet} 
20c10 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
20c20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 22  tputs $channel "
20c30 2d 2d 2d 2d 20 63 75 72 72 65 6e 74 20 6d 65 6d  ---- current mem
20c40 6f 72 79 20 69 6e 20 75 73 65 20 62 79 20 74 68  ory in use by th
20c50 65 20 43 4c 52 2e 2e 2e 20 22 0d 0a 20 20 20 20  e CLR... "..    
20c60 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20    }....      if 
20c70 7b 5b 68 61 76 65 53 51 4c 69 74 65 4f 62 6a 65  {[haveSQLiteObje
20c80 63 74 43 6f 6d 6d 61 6e 64 5d 7d 20 74 68 65 6e  ctCommand]} then
20c90 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b   {..        if {
20ca0 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20  [catch {..      
20cb0 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b      object invok
20cc0 65 20 47 43 20 47 65 74 54 6f 74 61 6c 4d 65 6d  e GC GetTotalMem
20cd0 6f 72 79 20 66 61 6c 73 65 0d 0a 20 20 20 20 20  ory false..     
20ce0 20 20 20 7d 20 6d 65 6d 6f 72 79 5d 20 3d 3d 20     } memory] == 
20cf0 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
20d00 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67       if {[string
20d10 20 69 73 20 69 6e 74 65 67 65 72 20 2d 73 74 72   is integer -str
20d20 69 63 74 20 24 6d 65 6d 6f 72 79 5d 7d 20 74 68  ict $memory]} th
20d30 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
20d40 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74    if {!$quiet} t
20d50 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
20d60 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
20d70 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
20d80 24 6d 65 6d 6f 72 79 20 22 20 62 79 74 65 73 5c  $memory " bytes\
20d90 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n"]..           
20da0 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 20   }..          } 
20db0 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
20dc0 20 20 20 20 73 65 74 20 6d 65 6d 6f 72 79 20 69      set memory i
20dd0 6e 76 61 6c 69 64 0d 0a 0d 0a 20 20 20 20 20 20  nvalid....      
20de0 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65        if {!$quie
20df0 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  t} then {..     
20e00 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
20e10 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
20e20 72 67 73 20 24 6d 65 6d 6f 72 79 20 5c 6e 5d 0d  rgs $memory \n].
20e30 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  .            }..
20e40 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
20e50 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
20e60 20 20 20 20 20 20 20 20 20 73 65 74 20 6d 65 6d           set mem
20e70 6f 72 79 20 75 6e 6b 6e 6f 77 6e 0d 0a 0d 0a 20  ory unknown.... 
20e80 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71           if {!$q
20e90 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  uiet} then {..  
20ea0 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
20eb0 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  $channel [append
20ec0 41 72 67 73 20 24 6d 65 6d 6f 72 79 20 5c 6e 5d  Args $memory \n]
20ed0 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20  ..          }.. 
20ee0 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
20ef0 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
20f00 20 20 73 65 74 20 6d 65 6d 6f 72 79 20 75 6e 61    set memory una
20f10 76 61 69 6c 61 62 6c 65 0d 0a 0d 0a 20 20 20 20  vailable....    
20f20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d      if {!$quiet}
20f30 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
20f40 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
20f50 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 24 6d  l [appendArgs $m
20f60 65 6d 6f 72 79 20 5c 6e 5d 0d 0a 20 20 20 20 20  emory \n]..     
20f70 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d     }..      }...
20f80 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 72  .      return $r
20f90 65 73 75 6c 74 0d 0a 20 20 20 20 7d 0d 0a 0c 0d  esult..    }....
20fa0 0a 20 20 20 20 70 72 6f 63 20 63 68 65 63 6b 46  .    proc checkF
20fb0 6f 72 53 51 4c 69 74 65 44 69 72 65 63 74 6f 72  orSQLiteDirector
20fc0 69 65 73 20 7b 20 63 68 61 6e 6e 65 6c 20 7b 72  ies { channel {r
20fd0 65 73 65 74 20 66 61 6c 73 65 7d 20 7d 20 7b 0d  eset false} } {.
20fe0 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
20ff0 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 69 66  # NOTE: Check if
21000 20 74 68 65 20 73 71 6c 69 74 65 33 5f 77 69 6e   the sqlite3_win
21010 33 32 5f 73 65 74 5f 64 69 72 65 63 74 6f 72 79  32_set_directory
21020 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 76 61   function is ava
21030 69 6c 61 62 6c 65 2e 0d 0a 20 20 20 20 20 20 23  ilable...      #
21040 0d 0a 20 20 20 20 20 20 74 70 75 74 73 20 24 63  ..      tputs $c
21050 68 61 6e 6e 65 6c 20 5c 0d 0a 20 20 20 20 20 20  hannel \..      
21060 20 20 20 20 22 2d 2d 2d 2d 20 63 68 65 63 6b 69      "---- checki
21070 6e 67 20 66 6f 72 20 66 75 6e 63 74 69 6f 6e 20  ng for function 
21080 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 65  sqlite3_win32_se
21090 74 5f 64 69 72 65 63 74 6f 72 79 2e 2e 2e 20 22  t_directory... "
210a0 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  ....      #..   
210b0 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 69 73 20     # NOTE: This 
210c0 63 61 6c 6c 20 74 6f 20 74 68 65 20 73 71 6c 69  call to the sqli
210d0 74 65 33 5f 77 69 6e 33 32 5f 73 65 74 5f 64 69  te3_win32_set_di
210e0 72 65 63 74 6f 72 79 20 66 75 6e 63 74 69 6f 6e  rectory function
210f0 20 75 73 65 73 20 74 68 65 0d 0a 20 20 20 20 20   uses the..     
21100 20 23 20 20 20 20 20 20 20 69 6e 76 61 6c 69 64   #       invalid
21110 20 76 61 6c 75 65 20 30 20 66 6f 72 20 74 68 65   value 0 for the
21120 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e   first argument.
21130 20 20 54 68 69 73 20 63 6f 64 65 20 69 73 20 64    This code is d
21140 65 73 69 67 6e 65 64 0d 0a 20 20 20 20 20 20 23  esigned..      #
21150 20 20 20 20 20 20 20 74 6f 20 63 68 65 63 6b 20         to check 
21160 69 66 20 63 61 6c 6c 69 6e 67 20 74 68 65 20 66  if calling the f
21170 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 72 61 69  unction will rai
21180 73 65 20 61 6e 20 65 78 63 65 70 74 69 6f 6e 20  se an exception 
21190 28 69 2e 65 2e 0d 0a 20 20 20 20 20 20 23 20 20  (i.e...      #  
211a0 20 20 20 20 20 74 68 65 20 61 63 74 75 61 6c 20       the actual 
211b0 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 66 75  result of the fu
211c0 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20  nction does not 
211d0 6d 61 74 74 65 72 20 61 73 20 6c 6f 6e 67 20 61  matter as long a
211e0 73 20 6e 6f 0d 0a 20 20 20 20 20 20 23 20 20 20  s no..      #   
211f0 20 20 20 20 64 69 72 65 63 74 6f 72 79 20 69 73      directory is
21200 20 63 68 61 6e 67 65 64 29 2e 0d 0a 20 20 20 20   changed)...    
21210 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b    #..      if {[
21220 69 73 57 69 6e 64 6f 77 73 5d 20 26 26 20 5b 63  isWindows] && [c
21230 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20  atch {..        
21240 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66  object invoke -f
21250 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20  lags +NonPublic 
21260 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 53  \..            S
21270 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
21280 65 2e 55 6e 73 61 66 65 4e 61 74 69 76 65 4d 65  e.UnsafeNativeMe
21290 74 68 6f 64 73 20 5c 0d 0a 20 20 20 20 20 20 20  thods \..       
212a0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 77 69 6e       sqlite3_win
212b0 33 32 5f 73 65 74 5f 64 69 72 65 63 74 6f 72 79  32_set_directory
212c0 20 30 20 6e 75 6c 6c 0d 0a 20 20 20 20 20 20 7d   0 null..      }
212d0 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  ] == 0} then {..
212e0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
212f0 20 20 20 23 20 4e 4f 54 45 3a 20 43 61 6c 6c 69     # NOTE: Calli
21300 6e 67 20 74 68 65 20 73 71 6c 69 74 65 33 5f 77  ng the sqlite3_w
21310 69 6e 33 32 5f 73 65 74 5f 64 69 72 65 63 74 6f  in32_set_directo
21320 72 79 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73  ry function does
21330 20 6e 6f 74 0d 0a 20 20 20 20 20 20 20 20 23 20   not..        # 
21340 20 20 20 20 20 20 63 61 75 73 65 20 61 6e 20 65        cause an e
21350 78 63 65 70 74 69 6f 6e 3b 20 74 68 65 72 65 66  xception; theref
21360 6f 72 65 2c 20 69 74 20 6d 75 73 74 20 62 65 20  ore, it must be 
21370 61 76 61 69 6c 61 62 6c 65 20 28 69 2e 65 2e 0d  available (i.e..
21380 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
21390 20 65 76 65 6e 20 74 68 6f 75 67 68 20 69 74 20   even though it 
213a0 73 68 6f 75 6c 64 20 72 65 74 75 72 6e 20 61 20  should return a 
213b0 66 61 69 6c 75 72 65 20 72 65 74 75 72 6e 20 63  failure return c
213c0 6f 64 65 20 69 6e 20 74 68 69 73 0d 0a 20 20 20  ode in this..   
213d0 20 20 20 20 20 23 20 20 20 20 20 20 20 63 61 73       #       cas
213e0 65 29 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  e)...        #..
213f0 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74          addConst
21400 72 61 69 6e 74 20 73 71 6c 69 74 65 33 5f 77 69  raint sqlite3_wi
21410 6e 33 32 5f 73 65 74 5f 64 69 72 65 63 74 6f 72  n32_set_director
21420 79 0d 0a 0d 0a 20 20 20 20 20 20 20 20 74 70 75  y....        tpu
21430 74 73 20 24 63 68 61 6e 6e 65 6c 20 79 65 73 5c  ts $channel yes\
21440 6e 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  n....        #..
21450 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
21460 44 6f 65 73 20 6f 75 72 20 63 61 6c 6c 65 72 20  Does our caller 
21470 77 61 6e 74 20 74 6f 20 72 65 73 65 74 20 74 68  want to reset th
21480 65 20 64 69 72 65 63 74 6f 72 69 65 73 3f 0d 0a  e directories?..
21490 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
214a0 20 20 20 69 66 20 7b 24 72 65 73 65 74 7d 20 74     if {$reset} t
214b0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
214c0 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20   #..          # 
214d0 4e 4f 54 45 3a 20 4e 6f 77 20 6d 61 6b 65 20 73  NOTE: Now make s
214e0 75 72 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ure the database
214f0 20 61 6e 64 20 74 65 6d 70 6f 72 61 72 79 20 64   and temporary d
21500 69 72 65 63 74 6f 72 69 65 73 20 61 72 65 0d 0a  irectories are..
21510 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20            #     
21520 20 20 72 65 73 65 74 20 74 68 65 69 72 20 64 65    reset their de
21530 66 61 75 6c 74 20 76 61 6c 75 65 73 2c 20 77 68  fault values, wh
21540 69 63 68 20 73 68 6f 75 6c 64 20 62 65 20 6e 75  ich should be nu
21550 6c 6c 20 66 6f 72 20 62 6f 74 68 2e 0d 0a 20 20  ll for both...  
21560 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
21570 53 69 6e 63 65 20 74 68 65 20 73 71 6c 69 74 65  Since the sqlite
21580 33 5f 77 69 6e 33 32 5f 73 65 74 5f 64 69 72 65  3_win32_set_dire
21590 63 74 6f 72 79 20 66 75 6e 63 74 69 6f 6e 20 69  ctory function i
215a0 73 20 61 76 61 69 6c 61 62 6c 65 2c 0d 0a 20 20  s available,..  
215b0 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
215c0 75 73 65 20 69 74 2e 0d 0a 20 20 20 20 20 20 20  use it...       
215d0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
215e0 66 6f 72 20 7b 73 65 74 20 69 6e 64 65 78 20 31  for {set index 1
215f0 7d 20 7b 24 69 6e 64 65 78 20 3c 20 33 7d 20 7b  } {$index < 3} {
21600 69 6e 63 72 20 69 6e 64 65 78 7d 20 7b 0d 0a 20  incr index} {.. 
21610 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b             if {[
21620 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20  catch {..       
21630 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e         object in
21640 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e  voke -flags +Non
21650 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20  Public \..      
21660 20 20 20 20 20 20 20 20 20 20 20 20 53 79 73 74              Syst
21670 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 55  em.Data.SQLite.U
21680 6e 73 61 66 65 4e 61 74 69 76 65 4d 65 74 68 6f  nsafeNativeMetho
21690 64 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  ds \..          
216a0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
216b0 77 69 6e 33 32 5f 73 65 74 5f 64 69 72 65 63 74  win32_set_direct
216c0 6f 72 79 20 24 69 6e 64 65 78 20 6e 75 6c 6c 0d  ory $index null.
216d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 20 72  .            } r
216e0 65 73 75 6c 74 5d 20 3d 3d 20 30 7d 20 74 68 65  esult] == 0} the
216f0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
21700 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
21710 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
21720 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
21730 20 20 20 22 2d 2d 2d 2d 20 63 61 6c 6c 20 73 71     "---- call sq
21740 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 65 74 5f  lite3_win32_set_
21750 64 69 72 65 63 74 6f 72 79 28 22 20 24 69 6e 64  directory(" $ind
21760 65 78 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  ex \..          
21770 20 20 20 20 20 20 20 20 22 2c 20 6e 75 6c 6c 29          ", null)
21780 2e 2e 2e 20 6f 6b 3a 20 22 20 24 72 65 73 75 6c  ... ok: " $resul
21790 74 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20  t \n]..         
217a0 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
217b0 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
217c0 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e   $channel [appen
217d0 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
217e0 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
217f0 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 5f 77 69   call sqlite3_wi
21800 6e 33 32 5f 73 65 74 5f 64 69 72 65 63 74 6f 72  n32_set_director
21810 79 28 22 20 24 69 6e 64 65 78 20 5c 0d 0a 20 20  y(" $index \..  
21820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21830 22 2c 20 6e 75 6c 6c 29 2e 2e 2e 20 65 72 72 6f  ", null)... erro
21840 72 3a 20 22 20 5c 6e 5c 74 20 24 72 65 73 75 6c  r: " \n\t $resul
21850 74 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20  t \n]..         
21860 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
21870 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  }..        }..  
21880 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
21890 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
218a0 6e 6e 65 6c 20 6e 6f 5c 6e 0d 0a 0d 0a 20 20 20  nnel no\n....   
218b0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
218c0 23 20 4e 4f 54 45 3a 20 44 6f 65 73 20 6f 75 72  # NOTE: Does our
218d0 20 63 61 6c 6c 65 72 20 77 61 6e 74 20 74 6f 20   caller want to 
218e0 72 65 73 65 74 20 74 68 65 20 64 69 72 65 63 74  reset the direct
218f0 6f 72 69 65 73 3f 20 20 54 68 69 73 20 63 61 6e  ories?  This can
21900 20 6f 6e 6c 79 0d 0a 20 20 20 20 20 20 20 20 23   only..        #
21910 20 20 20 20 20 20 20 62 65 20 70 65 72 66 6f 72         be perfor
21920 6d 65 64 20 69 66 20 53 51 4c 69 74 65 20 69 73  med if SQLite is
21930 20 6c 6f 61 64 65 64 20 61 6e 64 20 72 65 61 64   loaded and read
21940 79 20 66 6f 72 20 75 73 65 20 62 79 20 74 68 65  y for use by the
21950 20 74 65 73 74 0d 0a 20 20 20 20 20 20 20 20 23   test..        #
21960 20 20 20 20 20 20 20 73 75 69 74 65 2e 0d 0a 20         suite... 
21970 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
21980 20 20 69 66 20 7b 24 72 65 73 65 74 20 26 26 20    if {$reset && 
21990 5b 69 73 53 51 4c 69 74 65 52 65 61 64 79 5d 7d  [isSQLiteReady]}
219a0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
219b0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
219c0 23 20 4e 4f 54 45 3a 20 4e 6f 77 20 6d 61 6b 65  # NOTE: Now make
219d0 20 73 75 72 65 20 74 68 65 20 64 61 74 61 62 61   sure the databa
219e0 73 65 20 61 6e 64 20 74 65 6d 70 6f 72 61 72 79  se and temporary
219f0 20 64 69 72 65 63 74 6f 72 69 65 73 20 61 72 65   directories are
21a00 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 20 20  ..          #   
21a10 20 20 20 20 72 65 73 65 74 20 74 68 65 69 72 20      reset their 
21a20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 73 2c 20  default values, 
21a30 77 68 69 63 68 20 73 68 6f 75 6c 64 20 62 65 20  which should be 
21a40 6e 75 6c 6c 20 66 6f 72 20 62 6f 74 68 2e 0d 0a  null for both...
21a50 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20            #     
21a60 20 20 53 69 6e 63 65 20 74 68 65 20 73 71 6c 69    Since the sqli
21a70 74 65 33 5f 77 69 6e 33 32 5f 73 65 74 5f 64 69  te3_win32_set_di
21a80 72 65 63 74 6f 72 79 20 66 75 6e 63 74 69 6f 6e  rectory function
21a90 20 64 6f 65 73 20 6e 6f 74 0d 0a 20 20 20 20 20   does not..     
21aa0 20 20 20 20 20 23 20 20 20 20 20 20 20 61 70 70       #       app
21ab0 65 61 72 20 74 6f 20 62 65 20 61 76 61 69 6c 61  ear to be availa
21ac0 62 6c 65 2c 20 75 73 65 20 74 68 65 20 61 73 73  ble, use the ass
21ad0 6f 63 69 61 74 65 64 20 50 52 41 47 4d 41 20 63  ociated PRAGMA c
21ae0 6f 6d 6d 61 6e 64 73 0d 0a 20 20 20 20 20 20 20  ommands..       
21af0 20 20 20 23 20 20 20 20 20 20 20 69 6e 73 74 65     #       inste
21b00 61 64 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23  ad...          #
21b10 0d 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 65  ..          fore
21b20 61 63 68 20 64 69 72 65 63 74 6f 72 79 20 5b 6c  ach directory [l
21b30 69 73 74 20 64 61 74 61 5f 73 74 6f 72 65 5f 64  ist data_store_d
21b40 69 72 65 63 74 6f 72 79 20 74 65 6d 70 5f 73 74  irectory temp_st
21b50 6f 72 65 5f 64 69 72 65 63 74 6f 72 79 5d 20 7b  ore_directory] {
21b60 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 65  ..            se
21b70 74 20 73 71 6c 20 5b 61 70 70 65 6e 64 41 72 67  t sql [appendArg
21b80 73 20 22 50 52 41 47 4d 41 20 22 20 24 64 69 72  s "PRAGMA " $dir
21b90 65 63 74 6f 72 79 20 22 20 3d 20 5c 22 5c 22 3b  ectory " = \"\";
21ba0 22 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  "]....          
21bb0 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 65 78    if {[catch {ex
21bc0 65 63 75 74 65 53 71 6c 20 24 73 71 6c 7d 20 72  ecuteSql $sql} r
21bd0 65 73 75 6c 74 5d 20 3d 3d 20 30 7d 20 74 68 65  esult] == 0} the
21be0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
21bf0 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
21c00 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
21c10 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
21c20 20 20 20 22 2d 2d 2d 2d 20 65 78 65 63 75 74 65     "---- execute
21c30 20 50 52 41 47 4d 41 20 22 20 24 64 69 72 65 63   PRAGMA " $direc
21c40 74 6f 72 79 20 22 2e 2e 2e 20 6f 6b 3a 20 5c 22  tory "... ok: \"
21c50 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  " \..           
21c60 20 20 20 20 20 20 20 24 72 65 73 75 6c 74 20 5c         $result \
21c70 22 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20  "\n]..          
21c80 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
21c90 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
21ca0 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  $channel [append
21cb0 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
21cc0 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
21cd0 65 78 65 63 75 74 65 20 50 52 41 47 4d 41 20 22  execute PRAGMA "
21ce0 20 24 64 69 72 65 63 74 6f 72 79 20 22 2e 2e 2e   $directory "...
21cf0 20 65 72 72 6f 72 3a 20 22 20 5c 0d 0a 20 20 20   error: " \..   
21d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
21d10 6e 5c 74 20 24 72 65 73 75 6c 74 20 5c 6e 5d 0d  n\t $result \n].
21d20 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  .            }..
21d30 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
21d40 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d       }..      }.
21d50 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
21d60 20 20 23 20 4e 4f 54 45 3a 20 46 69 6e 61 6c 6c    # NOTE: Finall
21d70 79 2c 20 73 68 6f 77 20 74 68 65 20 63 75 72 72  y, show the curr
21d80 65 6e 74 20 76 61 6c 75 65 20 6f 66 20 74 68 65  ent value of the
21d90 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 74 65   database and te
21da0 6d 70 6f 72 61 72 79 0d 0a 20 20 20 20 20 20 23  mporary..      #
21db0 20 20 20 20 20 20 20 64 69 72 65 63 74 6f 72 69         directori
21dc0 65 73 2e 20 20 54 68 69 73 20 63 61 6e 20 6f 6e  es.  This can on
21dd0 6c 79 20 62 65 20 70 65 72 66 6f 72 6d 65 64 20  ly be performed 
21de0 69 66 20 53 51 4c 69 74 65 20 69 73 20 6c 6f 61  if SQLite is loa
21df0 64 65 64 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ded..      #    
21e00 20 20 20 61 6e 64 20 72 65 61 64 79 20 66 6f 72     and ready for
21e10 20 75 73 65 20 62 79 20 74 68 65 20 74 65 73 74   use by the test
21e20 20 73 75 69 74 65 2e 0d 0a 20 20 20 20 20 20 23   suite...      #
21e30 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 73 53  ..      if {[isS
21e40 51 4c 69 74 65 52 65 61 64 79 5d 7d 20 74 68 65  QLiteReady]} the
21e50 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 66 6f 72  n {..        for
21e60 65 61 63 68 20 64 69 72 65 63 74 6f 72 79 20 5b  each directory [
21e70 6c 69 73 74 20 64 61 74 61 5f 73 74 6f 72 65 5f  list data_store_
21e80 64 69 72 65 63 74 6f 72 79 20 74 65 6d 70 5f 73  directory temp_s
21e90 74 6f 72 65 5f 64 69 72 65 63 74 6f 72 79 5d 20  tore_directory] 
21ea0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70 75  {..          tpu
21eb0 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70  ts $channel [app
21ec0 65 6e 64 41 72 67 73 20 22 2d 2d 2d 2d 20 63 68  endArgs "---- ch
21ed0 65 63 6b 69 6e 67 20 22 20 24 64 69 72 65 63 74  ecking " $direct
21ee0 6f 72 79 20 22 2e 2e 2e 20 22 5d 0d 0a 0d 0a 20  ory "... "].... 
21ef0 20 20 20 20 20 20 20 20 20 73 65 74 20 73 71 6c           set sql
21f00 20 5b 61 70 70 65 6e 64 41 72 67 73 20 22 50 52   [appendArgs "PR
21f10 41 47 4d 41 20 22 20 24 64 69 72 65 63 74 6f 72  AGMA " $director
21f20 79 20 5c 3b 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  y \;]....       
21f30 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 65     if {[catch {e
21f40 78 65 63 75 74 65 53 71 6c 20 24 73 71 6c 20 73  xecuteSql $sql s
21f50 63 61 6c 61 72 7d 20 72 65 73 75 6c 74 5d 20 3d  calar} result] =
21f60 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  = 0} then {..   
21f70 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
21f80 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
21f90 72 67 73 20 22 6f 6b 3a 20 5c 22 22 20 24 72 65  rgs "ok: \"" $re
21fa0 73 75 6c 74 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20  sult \"\n]..    
21fb0 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
21fc0 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
21fd0 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  s $channel [appe
21fe0 6e 64 41 72 67 73 20 22 65 72 72 6f 72 3a 20 22  ndArgs "error: "
21ff0 20 5c 6e 5c 74 20 24 72 65 73 75 6c 74 20 5c 6e   \n\t $result \n
22000 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  ]..          }..
22010 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
22020 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20   }..    }.....  
22030 20 20 70 72 6f 63 20 6c 6f 61 64 53 51 4c 69 74    proc loadSQLit
22040 65 54 65 73 74 53 65 74 74 69 6e 67 73 20 7b 20  eTestSettings { 
22050 63 68 61 6e 6e 65 6c 20 7b 73 75 66 66 69 78 20  channel {suffix 
22060 22 22 7d 20 7b 71 75 69 65 74 20 66 61 6c 73 65  ""} {quiet false
22070 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a  } } {..      #..
22080 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 6b        # NOTE: Sk
22090 69 70 20 6c 6f 61 64 69 6e 67 20 74 68 65 20 73  ip loading the s
220a0 65 74 74 69 6e 67 73 20 69 66 20 74 68 65 69 72  ettings if their
220b0 20 75 73 61 67 65 20 68 61 73 20 62 65 65 6e 20   usage has been 
220c0 64 69 73 61 62 6c 65 64 2e 0d 0a 20 20 20 20 20  disabled...     
220d0 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 21 5b   #..      if {![
220e0 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f  info exists ::no
220f0 28 73 71 6c 69 74 65 54 65 73 74 53 65 74 74 69  (sqliteTestSetti
22100 6e 67 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  ngs)]} then {.. 
22110 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
22120 20 20 23 20 4e 4f 54 45 3a 20 4c 6f 61 64 20 63    # NOTE: Load c
22130 75 73 74 6f 6d 20 70 65 72 2d 75 73 65 72 20 61  ustom per-user a
22140 6e 64 2f 6f 72 20 70 65 72 2d 68 6f 73 74 20 74  nd/or per-host t
22150 65 73 74 20 73 65 74 74 69 6e 67 73 20 6e 6f 77  est settings now
22160 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
22170 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20        if {[info 
22180 65 78 69 73 74 73 20 3a 3a 74 63 6c 5f 70 6c 61  exists ::tcl_pla
22190 74 66 6f 72 6d 28 75 73 65 72 29 5d 7d 20 74 68  tform(user)]} th
221a0 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
221b0 73 65 74 20 75 73 65 72 53 65 74 74 69 6e 67 73  set userSettings
221c0 46 69 6c 65 4e 61 6d 65 20 5b 66 69 6c 65 20 6a  FileName [file j
221d0 6f 69 6e 20 5b 67 65 74 43 6f 6d 6d 6f 6e 44 69  oin [getCommonDi
221e0 72 65 63 74 6f 72 79 5d 20 5c 0d 0a 20 20 20 20  rectory] \..    
221f0 20 20 20 20 20 20 20 20 20 20 5b 61 70 70 65 6e            [appen
22200 64 41 72 67 73 20 73 65 74 74 69 6e 67 73 20 24  dArgs settings $
22210 73 75 66 66 69 78 20 2e 20 24 3a 3a 74 63 6c 5f  suffix . $::tcl_
22220 70 6c 61 74 66 6f 72 6d 28 75 73 65 72 29 20 2e  platform(user) .
22230 65 61 67 6c 65 5d 5d 0d 0a 0d 0a 20 20 20 20 20  eagle]]....     
22240 20 20 20 20 20 69 66 20 7b 5b 66 69 6c 65 20 65       if {[file e
22250 78 69 73 74 73 20 24 75 73 65 72 53 65 74 74 69  xists $userSetti
22260 6e 67 73 46 69 6c 65 4e 61 6d 65 5d 7d 20 74 68  ngsFileName]} th
22270 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
22280 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74    if {!$quiet} t
22290 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
222a0 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
222b0 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
222c0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
222d0 20 20 20 20 20 22 2d 2d 2d 2d 20 6c 6f 61 64 69       "---- loadi
222e0 6e 67 20 70 65 72 2d 75 73 65 72 20 74 65 73 74  ng per-user test
222f0 20 73 65 74 74 69 6e 67 73 20 66 69 6c 65 20 5c   settings file \
22300 22 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  "" \..          
22310 20 20 20 20 20 20 20 20 24 75 73 65 72 53 65 74          $userSet
22320 74 69 6e 67 73 46 69 6c 65 4e 61 6d 65 20 5c 22  tingsFileName \"
22330 2e 2e 2e 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20  ...\n]..        
22340 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
22350 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20       if {[catch 
22360 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
22370 20 75 70 6c 65 76 65 6c 20 31 20 5b 6c 69 73 74   uplevel 1 [list
22380 20 73 6f 75 72 63 65 20 24 75 73 65 72 53 65 74   source $userSet
22390 74 69 6e 67 73 46 69 6c 65 4e 61 6d 65 5d 0d 0a  tingsFileName]..
223a0 20 20 20 20 20 20 20 20 20 20 20 20 7d 20 65 72              } er
223b0 72 6f 72 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ror]} then {..  
223c0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b              if {
223d0 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d  !$quiet} then {.
223e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
223f0 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
22400 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
22410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22420 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47     "==== WARNING
22430 3a 20 66 61 69 6c 65 64 20 74 6f 20 6c 6f 61 64  : failed to load
22440 20 70 65 72 2d 75 73 65 72 20 73 65 74 74 69 6e   per-user settin
22450 67 73 20 66 69 6c 65 20 5c 22 22 20 5c 0d 0a 20  gs file \"" \.. 
22460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22470 20 20 20 24 75 73 65 72 53 65 74 74 69 6e 67 73     $userSettings
22480 46 69 6c 65 4e 61 6d 65 20 22 5c 22 2c 20 65 72  FileName "\", er
22490 72 6f 72 3a 20 22 20 5c 6e 5c 74 20 24 65 72 72  ror: " \n\t $err
224a0 6f 72 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20  or \n]..        
224b0 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
224c0 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
224d0 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
224e0 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75          if {!$qu
224f0 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  iet} then {..   
22500 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
22510 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e   $channel [appen
22520 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
22530 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
22540 20 73 6b 69 70 70 65 64 20 6c 6f 61 64 69 6e 67   skipped loading
22550 20 70 65 72 2d 75 73 65 72 20 74 65 73 74 20 73   per-user test s
22560 65 74 74 69 6e 67 73 20 66 69 6c 65 20 5c 22 22  ettings file \""
22570 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
22580 20 20 20 20 20 20 24 75 73 65 72 53 65 74 74 69        $userSetti
22590 6e 67 73 46 69 6c 65 4e 61 6d 65 20 22 5c 22 2c  ngsFileName "\",
225a0 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 65 78 69   it does not exi
225b0 73 74 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20  st\n"]..        
225c0 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
225d0 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d   }..        }...
225e0 0a 20 20 20 20 20 20 20 20 23 23 23 23 23 23 23  .        #######
225f0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
22600 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
22610 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
22620 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
22630 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b  ....        if {
22640 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 74  [info exists ::t
22650 63 6c 5f 70 6c 61 74 66 6f 72 6d 28 68 6f 73 74  cl_platform(host
22660 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  )]} then {..    
22670 20 20 20 20 20 20 73 65 74 20 68 6f 73 74 53 65        set hostSe
22680 74 74 69 6e 67 73 46 69 6c 65 4e 61 6d 65 20 5b  ttingsFileName [
22690 66 69 6c 65 20 6a 6f 69 6e 20 5b 67 65 74 43 6f  file join [getCo
226a0 6d 6d 6f 6e 44 69 72 65 63 74 6f 72 79 5d 20 5c  mmonDirectory] \
226b0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
226c0 5b 61 70 70 65 6e 64 41 72 67 73 20 73 65 74 74  [appendArgs sett
226d0 69 6e 67 73 20 24 73 75 66 66 69 78 20 2e 20 24  ings $suffix . $
226e0 3a 3a 74 63 6c 5f 70 6c 61 74 66 6f 72 6d 28 68  ::tcl_platform(h
226f0 6f 73 74 29 20 2e 65 61 67 6c 65 5d 5d 0d 0a 0d  ost) .eagle]]...
22700 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b  .          if {[
22710 66 69 6c 65 20 65 78 69 73 74 73 20 24 68 6f 73  file exists $hos
22720 74 53 65 74 74 69 6e 67 73 46 69 6c 65 4e 61 6d  tSettingsFileNam
22730 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  e]} then {..    
22740 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75          if {!$qu
22750 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  iet} then {..   
22760 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
22770 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e   $channel [appen
22780 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
22790 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
227a0 20 6c 6f 61 64 69 6e 67 20 70 65 72 2d 68 6f 73   loading per-hos
227b0 74 20 74 65 73 74 20 73 65 74 74 69 6e 67 73 20  t test settings 
227c0 66 69 6c 65 20 5c 22 22 20 5c 0d 0a 20 20 20 20  file \"" \..    
227d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 24 68                $h
227e0 6f 73 74 53 65 74 74 69 6e 67 73 46 69 6c 65 4e  ostSettingsFileN
227f0 61 6d 65 20 5c 22 2e 2e 2e 5c 6e 5d 0d 0a 20 20  ame \"...\n]..  
22800 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20            }.... 
22810 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b             if {[
22820 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20  catch {..       
22830 20 20 20 20 20 20 20 75 70 6c 65 76 65 6c 20 31         uplevel 1
22840 20 5b 6c 69 73 74 20 73 6f 75 72 63 65 20 24 68   [list source $h
22850 6f 73 74 53 65 74 74 69 6e 67 73 46 69 6c 65 4e  ostSettingsFileN
22860 61 6d 65 5d 0d 0a 20 20 20 20 20 20 20 20 20 20  ame]..          
22870 20 20 7d 20 65 72 72 6f 72 5d 7d 20 74 68 65 6e    } error]} then
22880 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
22890 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74    if {!$quiet} t
228a0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
228b0 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
228c0 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
228d0 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
228e0 20 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57           "==== W
228f0 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20 74  ARNING: failed t
22900 6f 20 6c 6f 61 64 20 70 65 72 2d 68 6f 73 74 20  o load per-host 
22910 73 65 74 74 69 6e 67 73 20 66 69 6c 65 20 5c 22  settings file \"
22920 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  " \..           
22930 20 20 20 20 20 20 20 20 20 24 68 6f 73 74 53 65           $hostSe
22940 74 74 69 6e 67 73 46 69 6c 65 4e 61 6d 65 20 22  ttingsFileName "
22950 5c 22 2c 20 65 72 72 6f 72 3a 20 22 20 5c 6e 5c  \", error: " \n\
22960 74 20 24 65 72 72 6f 72 20 5c 6e 5d 0d 0a 20 20  t $error \n]..  
22970 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
22980 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
22990 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b          } else {
229a0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ..            if
229b0 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20   {!$quiet} then 
229c0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
229d0 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
229e0 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
229f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22a00 20 22 2d 2d 2d 2d 20 73 6b 69 70 70 65 64 20 6c   "---- skipped l
22a10 6f 61 64 69 6e 67 20 70 65 72 2d 68 6f 73 74 20  oading per-host 
22a20 74 65 73 74 20 73 65 74 74 69 6e 67 73 20 66 69  test settings fi
22a30 6c 65 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20  le \"" \..      
22a40 20 20 20 20 20 20 20 20 20 20 20 20 24 68 6f 73              $hos
22a50 74 53 65 74 74 69 6e 67 73 46 69 6c 65 4e 61 6d  tSettingsFileNam
22a60 65 20 22 5c 22 2c 20 69 74 20 64 6f 65 73 20 6e  e "\", it does n
22a70 6f 74 20 65 78 69 73 74 5c 6e 22 5d 0d 0a 20 20  ot exist\n"]..  
22a80 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
22a90 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
22aa0 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20    }..      }..  
22ab0 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
22ac0 20 63 6f 70 79 53 61 6d 70 6c 65 44 61 74 61 62   copySampleDatab
22ad0 61 73 65 46 69 6c 65 73 20 7b 7d 20 7b 0d 0a 20  aseFiles {} {.. 
22ae0 20 20 20 20 20 75 70 6c 65 76 65 6c 20 31 20 7b       uplevel 1 {
22af0 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
22b00 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 6f 70       # NOTE: Cop
22b10 79 20 28 6f 72 20 72 65 2d 63 6f 70 79 29 20 74  y (or re-copy) t
22b20 68 65 20 72 65 66 65 72 65 6e 63 65 20 64 61 74  he reference dat
22b30 61 62 61 73 65 20 66 69 6c 65 20 75 73 65 64 20  abase file used 
22b40 66 6f 72 20 74 68 69 73 0d 0a 20 20 20 20 20 20  for this..      
22b50 20 20 23 20 20 20 20 20 20 20 75 6e 69 74 20 74    #       unit t
22b60 65 73 74 20 74 6f 20 74 68 65 20 62 75 69 6c 64  est to the build
22b70 20 64 69 72 65 63 74 6f 72 79 20 69 6e 20 63 61   directory in ca
22b80 73 65 20 69 74 20 68 61 73 20 62 65 65 6e 20 63  se it has been c
22b90 68 61 6e 67 65 64 0d 0a 20 20 20 20 20 20 20 20  hanged..        
22ba0 23 20 20 20 20 20 20 20 62 79 20 61 20 70 72 65  #       by a pre
22bb0 76 69 6f 75 73 20 74 65 73 74 20 72 75 6e 2e 0d  vious test run..
22bc0 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
22bd0 20 20 20 20 66 69 6c 65 20 63 6f 70 79 20 2d 66      file copy -f
22be0 6f 72 63 65 20 24 6e 6f 72 74 68 77 69 6e 64 45  orce $northwindE
22bf0 66 44 62 46 69 6c 65 20 5c 0d 0a 20 20 20 20 20  fDbFile \..     
22c00 20 20 20 20 20 5b 66 69 6c 65 20 6a 6f 69 6e 20       [file join 
22c10 5b 67 65 74 42 75 69 6c 64 44 69 72 65 63 74 6f  [getBuildDirecto
22c20 72 79 20 66 61 6c 73 65 5d 20 5b 66 69 6c 65 20  ry false] [file 
22c30 74 61 69 6c 20 24 6e 6f 72 74 68 77 69 6e 64 45  tail $northwindE
22c40 66 44 62 46 69 6c 65 5d 5d 0d 0a 20 20 20 20 20  fDbFile]]..     
22c50 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20   }..    }.....  
22c60 20 20 70 72 6f 63 20 72 75 6e 53 51 4c 69 74 65    proc runSQLite
22c70 54 65 73 74 50 72 6f 6c 6f 67 75 65 20 7b 7d 20  TestPrologue {} 
22c80 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  {..      #..    
22c90 20 20 23 20 4e 4f 54 45 3a 20 53 6b 69 70 20 72    # NOTE: Skip r
22ca0 75 6e 6e 69 6e 67 20 6f 75 72 20 63 75 73 74 6f  unning our custo
22cb0 6d 20 70 72 6f 6c 6f 67 75 65 20 69 66 20 74 68  m prologue if th
22cc0 65 20 6d 61 69 6e 20 6f 6e 65 20 68 61 73 20 62  e main one has b
22cd0 65 65 6e 0d 0a 20 20 20 20 20 20 23 20 20 20 20  een..      #    
22ce0 20 20 20 73 6b 69 70 70 65 64 2e 0d 0a 20 20 20     skipped...   
22cf0 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
22d00 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  ![info exists ::
22d10 6e 6f 28 70 72 6f 6c 6f 67 75 65 2e 65 61 67 6c  no(prologue.eagl
22d20 65 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  e)]} then {..   
22d30 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
22d40 23 20 4e 4f 54 45 3a 20 4c 6f 61 64 20 74 68 65  # NOTE: Load the
22d50 20 22 62 65 66 6f 72 65 2d 63 6f 6e 73 74 72 61   "before-constra
22d60 69 6e 74 73 22 20 63 75 73 74 6f 6d 20 70 65 72  ints" custom per
22d70 2d 75 73 65 72 20 61 6e 64 2f 6f 72 20 70 65 72  -user and/or per
22d80 2d 68 6f 73 74 0d 0a 20 20 20 20 20 20 20 20 23  -host..        #
22d90 20 20 20 20 20 20 20 74 65 73 74 20 73 65 74 74         test sett
22da0 69 6e 67 73 20 6e 6f 77 2e 0d 0a 20 20 20 20 20  ings now...     
22db0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 75 70     #..        up
22dc0 6c 65 76 65 6c 20 31 20 5b 6c 69 73 74 20 6c 6f  level 1 [list lo
22dd0 61 64 53 51 4c 69 74 65 54 65 73 74 53 65 74 74  adSQLiteTestSett
22de0 69 6e 67 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  ings $::test_cha
22df0 6e 6e 65 6c 20 2e 62 65 66 6f 72 65 5d 0d 0a 0d  nnel .before]...
22e00 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
22e10 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68 65 63      # NOTE: Chec
22e20 6b 20 69 66 20 74 68 65 20 5b 6f 62 6a 65 63 74  k if the [object
22e30 5d 20 63 6f 6d 6d 61 6e 64 20 69 73 20 61 76 61  ] command is ava
22e40 69 6c 61 62 6c 65 3b 20 69 66 20 6e 6f 74 2c 20  ilable; if not, 
22e50 61 64 64 20 73 6f 6d 65 0d 0a 20 20 20 20 20 20  add some..      
22e60 20 20 23 20 20 20 20 20 20 20 73 68 69 6d 73 20    #       shims 
22e70 74 6f 20 6d 61 6b 65 20 74 68 65 20 74 65 73 74  to make the test
22e80 20 73 75 69 74 65 20 72 75 6e 20 73 6d 6f 6f 74   suite run smoot
22e90 68 65 72 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  her...        #.
22ea0 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f  .        checkFo
22eb0 72 53 51 4c 69 74 65 4f 62 6a 65 63 74 43 6f 6d  rSQLiteObjectCom
22ec0 6d 61 6e 64 20 24 3a 3a 74 65 73 74 5f 63 68 61  mand $::test_cha
22ed0 6e 6e 65 6c 0d 0a 0d 0a 20 20 20 20 20 20 20 20  nnel....        
22ee0 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
22ef0 45 3a 20 44 65 74 65 72 6d 69 6e 65 20 74 68 65  E: Determine the
22f00 20 6e 61 6d 65 73 20 6f 66 20 74 68 65 20 6e 61   names of the na
22f10 74 69 76 65 20 70 6c 61 74 66 6f 72 6d 20 61 6e  tive platform an
22f20 64 20 61 72 63 68 69 74 65 63 74 75 72 65 2e 0d  d architecture..
22f30 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
22f40 20 20 20 20 73 65 74 20 70 6c 61 74 66 6f 72 6d      set platform
22f50 20 5b 67 65 74 42 75 69 6c 64 50 6c 61 74 66 6f   [getBuildPlatfo
22f60 72 6d 20 74 72 75 65 5d 0d 0a 20 20 20 20 20 20  rm true]..      
22f70 20 20 73 65 74 20 61 72 63 68 69 74 65 63 74 75    set architectu
22f80 72 65 20 5b 61 72 63 68 69 74 65 63 74 75 72 65  re [architecture
22f90 46 6f 72 50 6c 61 74 66 6f 72 6d 20 24 70 6c 61  ForPlatform $pla
22fa0 74 66 6f 72 6d 5d 0d 0a 0d 0a 20 20 20 20 20 20  tform]....      
22fb0 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
22fc0 4f 54 45 3a 20 53 68 6f 77 20 74 68 65 20 70 6c  OTE: Show the pl
22fd0 61 74 66 6f 72 6d 20 61 6e 64 20 61 72 63 68 69  atform and archi
22fe0 74 65 63 74 75 72 65 20 75 73 65 64 20 74 6f 20  tecture used to 
22ff0 68 65 6c 70 20 6c 6f 63 61 74 65 20 74 68 65 0d  help locate the.
23000 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
23010 20 6e 61 74 69 76 65 20 62 75 69 6c 64 20 66 69   native build fi
23020 6c 65 73 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  les...        #.
23030 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24  .        tputs $
23040 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b  ::test_channel [
23050 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
23060 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
23070 70 6c 61 74 66 6f 72 6d 20 66 6f 72 20 6c 6f 63  platform for loc
23080 61 74 69 6e 67 20 6e 61 74 69 76 65 20 62 75 69  ating native bui
23090 6c 64 20 66 69 6c 65 73 20 69 73 20 5c 22 22 20  ld files is \"" 
230a0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 24  \..            $
230b0 70 6c 61 74 66 6f 72 6d 20 5c 22 5c 6e 5d 0d 0a  platform \"\n]..
230c0 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20  ..        tputs 
230d0 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
230e0 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
230f0 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
23100 20 61 72 63 68 69 74 65 63 74 75 72 65 20 66 6f   architecture fo
23110 72 20 6c 6f 63 61 74 69 6e 67 20 6e 61 74 69 76  r locating nativ
23120 65 20 62 75 69 6c 64 20 66 69 6c 65 73 20 69 73  e build files is
23130 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20 20 20   \"" \..        
23140 20 20 20 20 24 61 72 63 68 69 74 65 63 74 75 72      $architectur
23150 65 20 5c 22 5c 6e 5d 0d 0a 0d 0a 20 20 20 20 20  e \"\n]....     
23160 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
23170 4e 4f 54 45 3a 20 42 75 69 6c 64 20 61 20 6c 69  NOTE: Build a li
23180 73 74 20 6f 66 20 63 6f 6e 66 69 67 75 72 61 74  st of configurat
23190 69 6f 6e 20 66 69 6c 65 73 20 74 68 61 74 20 77  ion files that w
231a0 65 20 68 61 6e 64 6c 65 2e 0d 0a 20 20 20 20 20  e handle...     
231b0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 73 65     #..        se
231c0 74 20 63 6f 6e 66 69 67 46 69 6c 65 4e 61 6d 65  t configFileName
231d0 73 20 5b 6c 69 73 74 20 5c 0d 0a 20 20 20 20 20  s [list \..     
231e0 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61         System.Da
231f0 74 61 2e 53 51 4c 69 74 65 2e 64 6c 6c 2e 63 6f  ta.SQLite.dll.co
23200 6e 66 69 67 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  nfig]....       
23210 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
23220 54 45 3a 20 42 75 69 6c 64 20 61 20 6c 69 73 74  TE: Build a list
23230 20 6f 66 20 61 75 78 69 6c 69 61 72 79 20 4d 61   of auxiliary Ma
23240 6e 61 67 65 64 20 44 65 62 75 67 67 69 6e 67 20  naged Debugging 
23250 41 73 73 69 73 74 61 6e 74 73 20 28 4d 44 41 29  Assistants (MDA)
23260 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
23270 20 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20    configuration 
23280 66 69 6c 65 73 20 74 68 61 74 20 77 65 20 68 61  files that we ha
23290 6e 64 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20 23  ndle...        #
232a0 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 6d 64  ..        set md
232b0 61 43 6f 6e 66 69 67 46 69 6c 65 4e 61 6d 65 73  aConfigFileNames
232c0 20 5b 6c 69 73 74 20 5c 0d 0a 20 20 20 20 20 20   [list \..      
232d0 20 20 20 20 20 20 45 61 67 6c 65 53 68 65 6c 6c        EagleShell
232e0 33 32 2e 65 78 65 2e 6d 64 61 2e 63 6f 6e 66 69  32.exe.mda.confi
232f0 67 20 49 6e 73 74 61 6c 6c 65 72 2e 65 78 65 2e  g Installer.exe.
23300 6d 64 61 2e 63 6f 6e 66 69 67 20 5c 0d 0a 20 20  mda.config \..  
23310 20 20 20 20 20 20 20 20 20 20 74 65 73 74 2e 65            test.e
23320 78 65 2e 6d 64 61 2e 63 6f 6e 66 69 67 20 74 65  xe.mda.config te
23330 73 74 6c 69 6e 71 2e 65 78 65 2e 6d 64 61 2e 63  stlinq.exe.mda.c
23340 6f 6e 66 69 67 20 5c 0d 0a 20 20 20 20 20 20 20  onfig \..       
23350 20 20 20 20 20 74 65 73 74 65 66 36 2e 65 78 65       testef6.exe
23360 2e 6d 64 61 2e 63 6f 6e 66 69 67 5d 0d 0a 0d 0a  .mda.config]....
23370 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
23380 20 20 20 23 20 4e 4f 54 45 3a 20 42 75 69 6c 64     # NOTE: Build
23390 20 74 68 65 20 6c 69 73 74 20 6f 66 20 65 78 74   the list of ext
233a0 65 72 6e 61 6c 20 66 69 6c 65 73 20 74 68 61 74  ernal files that
233b0 20 77 65 20 68 61 6e 64 6c 65 2e 20 20 53 6f 6d   we handle.  Som
233c0 65 20 6f 66 0d 0a 20 20 20 20 20 20 20 20 23 20  e of..        # 
233d0 20 20 20 20 20 20 74 68 65 73 65 20 66 69 6c 65        these file
233e0 73 20 6d 61 79 20 62 65 20 6e 61 74 69 76 65 20  s may be native 
233f0 61 6e 64 2f 6f 72 20 6d 61 6e 61 67 65 64 20 61  and/or managed a
23400 73 73 65 6d 62 6c 69 65 73 20 74 68 61 74 20 61  ssemblies that a
23410 72 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  re..        #   
23420 20 20 20 20 72 65 71 75 69 72 65 64 20 74 6f 20      required to 
23430 70 65 72 66 6f 72 6d 20 76 61 72 69 6f 75 73 20  perform various 
23440 74 65 73 74 73 2e 0d 0a 20 20 20 20 20 20 20 20  tests...        
23450 23 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 65  #..        set e
23460 78 74 65 72 6e 61 6c 46 69 6c 65 4e 61 6d 65 73  xternalFileNames
23470 20 5b 6c 69 73 74 20 5c 0d 0a 20 20 20 20 20 20   [list \..      
23480 20 20 20 20 20 20 5b 66 69 6c 65 20 6a 6f 69 6e        [file join
23490 20 45 6e 74 69 74 79 46 72 61 6d 65 77 6f 72 6b   EntityFramework
234a0 20 6c 69 62 20 5b 73 74 72 69 6e 67 20 6d 61 70   lib [string map
234b0 20 5b 6c 69 73 74 20 46 78 20 22 22 5d 20 5c 0d   [list Fx ""] \.
234c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 73 74  .            [st
234d0 72 69 6e 67 20 6d 61 70 20 5b 6c 69 73 74 20 6e  ring map [list n
234e0 65 74 46 78 34 35 31 20 6e 65 74 46 78 34 35 20  etFx451 netFx45 
234f0 6e 65 74 46 78 34 35 32 20 6e 65 74 46 78 34 35  netFx452 netFx45
23500 20 6e 65 74 46 78 34 36 20 5c 0d 0a 20 20 20 20   netFx46 \..    
23510 20 20 20 20 20 20 20 20 6e 65 74 46 78 34 35 20          netFx45 
23520 6e 65 74 46 78 34 36 31 20 6e 65 74 46 78 34 35  netFx461 netFx45
23530 20 6e 65 74 46 78 34 36 32 20 6e 65 74 46 78 34   netFx462 netFx4
23540 35 20 6e 65 74 46 78 34 37 20 6e 65 74 46 78 34  5 netFx47 netFx4
23550 35 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  5 \..           
23560 20 6e 65 74 46 78 34 37 31 20 6e 65 74 46 78 34   netFx471 netFx4
23570 35 5d 20 5b 67 65 74 42 75 69 6c 64 4e 65 74 46  5] [getBuildNetF
23580 78 5d 5d 5d 20 45 6e 74 69 74 79 46 72 61 6d 65  x]]] EntityFrame
23590 77 6f 72 6b 2e 64 6c 6c 5d 5d 0d 0a 0d 0a 20 20  work.dll]]....  
235a0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
235b0 20 23 20 4e 4f 54 45 3a 20 42 75 69 6c 64 20 74   # NOTE: Build t
235c0 68 65 20 6c 69 73 74 20 6f 66 20 6e 61 74 69 76  he list of nativ
235d0 65 20 61 73 73 65 6d 62 6c 79 20 66 69 6c 65 73  e assembly files
235e0 20 74 68 61 74 20 77 65 20 68 61 6e 64 6c 65 2e   that we handle.
235f0 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
23600 20 20 20 20 20 73 65 74 20 6e 61 74 69 76 65 46       set nativeF
23610 69 6c 65 4e 61 6d 65 73 20 5b 6c 69 73 74 5d 0d  ileNames [list].
23620 0a 0d 0a 20 20 20 20 20 20 20 20 65 76 61 6c 20  ...        eval 
23630 6c 61 70 70 65 6e 64 20 6e 61 74 69 76 65 46 69  lappend nativeFi
23640 6c 65 4e 61 6d 65 73 20 5b 67 65 74 4e 61 74 69  leNames [getNati
23650 76 65 4c 69 62 72 61 72 79 46 69 6c 65 4e 61 6d  veLibraryFileNam
23660 65 73 4f 6e 6c 79 5d 0d 0a 20 20 20 20 20 20 20  esOnly]..       
23670 20 65 76 61 6c 20 6c 61 70 70 65 6e 64 20 6e 61   eval lappend na
23680 74 69 76 65 46 69 6c 65 4e 61 6d 65 73 20 5b 67  tiveFileNames [g
23690 65 74 49 6e 74 65 72 6f 70 41 73 73 65 6d 62 6c  etInteropAssembl
236a0 79 46 69 6c 65 4e 61 6d 65 73 4f 6e 6c 79 5d 0d  yFileNamesOnly].
236b0 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
236c0 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 42 75        # NOTE: Bu
236d0 69 6c 64 20 74 68 65 20 6c 69 73 74 20 6f 66 20  ild the list of 
236e0 6d 69 78 65 64 2d 6d 6f 64 65 20 61 73 73 65 6d  mixed-mode assem
236f0 62 6c 79 20 66 69 6c 65 73 20 74 68 61 74 20 77  bly files that w
23700 65 20 68 61 6e 64 6c 65 2e 0d 0a 20 20 20 20 20  e handle...     
23710 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 73 65     #..        se
23720 74 20 6d 69 78 65 64 46 69 6c 65 4e 61 6d 65 73  t mixedFileNames
23730 20 5b 6c 69 73 74 5d 0d 0a 0d 0a 20 20 20 20 20   [list]....     
23740 20 20 20 69 66 20 7b 5b 68 61 73 52 75 6e 74 69     if {[hasRunti
23750 6d 65 4f 70 74 69 6f 6e 20 6e 61 74 69 76 65 5d  meOption native]
23760 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
23770 20 20 20 20 6c 61 70 70 65 6e 64 20 6d 69 78 65      lappend mixe
23780 64 46 69 6c 65 4e 61 6d 65 73 20 53 79 73 74 65  dFileNames Syste
23790 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 64 6c  m.Data.SQLite.dl
237a0 6c 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  l..        }....
237b0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
237c0 20 20 20 23 20 4e 4f 54 45 3a 20 42 75 69 6c 64     # NOTE: Build
237d0 20 74 68 65 20 6c 69 73 74 20 6f 66 20 6d 61 6e   the list of man
237e0 61 67 65 64 20 61 73 73 65 6d 62 6c 79 20 66 69  aged assembly fi
237f0 6c 65 73 20 74 68 61 74 20 77 65 20 68 61 6e 64  les that we hand
23800 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  le...        #..
23810 20 20 20 20 20 20 20 20 73 65 74 20 6d 61 6e 61          set mana
23820 67 65 64 46 69 6c 65 4e 61 6d 65 73 20 5b 6c 69  gedFileNames [li
23830 73 74 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  st \..          
23840 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51    System.Data.SQ
23850 4c 69 74 65 2e 4c 69 6e 71 2e 64 6c 6c 20 53 79  Lite.Linq.dll Sy
23860 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
23870 2e 45 46 36 2e 64 6c 6c 5d 0d 0a 0d 0a 20 20 20  .EF6.dll]....   
23880 20 20 20 20 20 69 66 20 7b 21 5b 68 61 73 52 75       if {![hasRu
23890 6e 74 69 6d 65 4f 70 74 69 6f 6e 20 6e 61 74 69  ntimeOption nati
238a0 76 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  ve]} then {..   
238b0 20 20 20 20 20 20 20 6c 61 70 70 65 6e 64 20 6d         lappend m
238c0 61 6e 61 67 65 64 46 69 6c 65 4e 61 6d 65 73 20  anagedFileNames 
238d0 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
238e0 74 65 2e 64 6c 6c 0d 0a 20 20 20 20 20 20 20 20  te.dll..        
238f0 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  }....        #..
23900 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
23910 53 68 6f 77 20 74 68 65 20 76 61 72 69 6f 75 73  Show the various
23920 20 6c 69 73 74 73 20 6f 66 20 66 69 6c 65 20 6e   lists of file n
23930 61 6d 65 73 20 74 68 61 74 20 61 72 65 20 68 61  ames that are ha
23940 6e 64 6c 65 64 20 62 79 20 74 68 69 73 0d 0a 20  ndled by this.. 
23950 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 70         #       p
23960 72 6f 63 65 64 75 72 65 2e 0d 0a 20 20 20 20 20  rocedure...     
23970 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 74 70     #..        tp
23980 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  uts $::test_chan
23990 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
239a0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22  \..            "
239b0 2d 2d 2d 2d 20 6c 69 73 74 20 6f 66 20 5c 22 63  ---- list of \"c
239c0 6f 6e 66 69 67 75 72 61 74 69 6f 6e 5c 22 20 66  onfiguration\" f
239d0 69 6c 65 20 6e 61 6d 65 73 20 69 73 3a 20 22 20  ile names is: " 
239e0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 24  \..            $
239f0 63 6f 6e 66 69 67 46 69 6c 65 4e 61 6d 65 73 20  configFileNames 
23a00 5c 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 74  \n]....        t
23a10 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
23a20 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
23a30 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
23a40 22 2d 2d 2d 2d 20 6c 69 73 74 20 6f 66 20 5c 22  "---- list of \"
23a50 4d 44 41 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  MDA configuratio
23a60 6e 5c 22 20 66 69 6c 65 20 6e 61 6d 65 73 20 69  n\" file names i
23a70 73 3a 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20  s: " \..        
23a80 20 20 20 20 24 6d 64 61 43 6f 6e 66 69 67 46 69      $mdaConfigFi
23a90 6c 65 4e 61 6d 65 73 20 5c 6e 5d 0d 0a 0d 0a 20  leNames \n].... 
23aa0 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
23ab0 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70  test_channel [ap
23ac0 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
23ad0 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 6c 69          "---- li
23ae0 73 74 20 6f 66 20 5c 22 65 78 74 65 72 6e 61 6c  st of \"external
23af0 5c 22 20 66 69 6c 65 20 6e 61 6d 65 73 20 69 73  \" file names is
23b00 3a 20 22 20 24 65 78 74 65 72 6e 61 6c 46 69 6c  : " $externalFil
23b10 65 4e 61 6d 65 73 20 5c 6e 5d 0d 0a 0d 0a 20 20  eNames \n]....  
23b20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
23b30 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70  est_channel [app
23b40 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
23b50 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 6c 69 73         "---- lis
23b60 74 20 6f 66 20 5c 22 6e 61 74 69 76 65 5c 22 20  t of \"native\" 
23b70 66 69 6c 65 20 6e 61 6d 65 73 20 69 73 3a 20 22  file names is: "
23b80 20 24 6e 61 74 69 76 65 46 69 6c 65 4e 61 6d 65   $nativeFileName
23b90 73 20 5c 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  s \n]....       
23ba0 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
23bb0 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
23bc0 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
23bd0 20 20 22 2d 2d 2d 2d 20 6c 69 73 74 20 6f 66 20    "---- list of 
23be0 5c 22 6d 69 78 65 64 5c 22 20 66 69 6c 65 20 6e  \"mixed\" file n
23bf0 61 6d 65 73 20 69 73 3a 20 22 20 24 6d 69 78 65  ames is: " $mixe
23c00 64 46 69 6c 65 4e 61 6d 65 73 20 5c 6e 5d 0d 0a  dFileNames \n]..
23c10 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20  ..        tputs 
23c20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
23c30 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
23c40 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
23c50 20 6c 69 73 74 20 6f 66 20 5c 22 6d 61 6e 61 67   list of \"manag
23c60 65 64 5c 22 20 66 69 6c 65 20 6e 61 6d 65 73 20  ed\" file names 
23c70 69 73 3a 20 22 20 24 6d 61 6e 61 67 65 64 46 69  is: " $managedFi
23c80 6c 65 4e 61 6d 65 73 20 5c 6e 5d 0d 0a 0d 0a 20  leNames \n].... 
23c90 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
23ca0 20 20 23 20 4e 4f 54 45 3a 20 52 65 6d 6f 76 65    # NOTE: Remove
23cb0 20 61 6e 79 20 74 65 73 74 20 63 6f 6e 73 74 72   any test constr
23cc0 61 69 6e 74 73 20 74 68 61 74 20 72 65 66 65 72  aints that refer
23cd0 20 74 6f 20 74 68 65 20 6e 61 74 69 76 65 20 61   to the native a
23ce0 6e 64 2f 6f 72 0d 0a 20 20 20 20 20 20 20 20 23  nd/or..        #
23cf0 20 20 20 20 20 20 20 6d 61 6e 61 67 65 64 20 61         managed a
23d00 73 73 65 6d 62 6c 79 20 66 69 6c 65 73 20 74 68  ssembly files th
23d10 61 74 20 77 65 20 68 61 6e 64 6c 65 20 75 6e 6c  at we handle unl
23d20 65 73 73 20 66 6f 72 62 69 64 64 65 6e 20 66 72  ess forbidden fr
23d30 6f 6d 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  om..        #   
23d40 20 20 20 20 64 6f 69 6e 67 20 73 6f 2e 0d 0a 20      doing so... 
23d50 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
23d60 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69    if {![info exi
23d70 73 74 73 20 3a 3a 6e 6f 28 73 71 6c 69 74 65 52  sts ::no(sqliteR
23d80 65 6d 6f 76 65 43 6f 6e 73 74 72 61 69 6e 74 73  emoveConstraints
23d90 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  )]} then {..    
23da0 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 66 69        foreach fi
23db0 6c 65 4e 61 6d 65 20 24 63 6f 6e 66 69 67 46 69  leName $configFi
23dc0 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20  leNames {..     
23dd0 20 20 20 20 20 20 20 72 65 6d 6f 76 65 43 6f 6e         removeCon
23de0 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41  straint [appendA
23df0 72 67 73 20 66 69 6c 65 5f 20 24 66 69 6c 65 4e  rgs file_ $fileN
23e00 61 6d 65 5d 0d 0a 20 20 20 20 20 20 20 20 20 20  ame]..          
23e10 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 66  }....          f
23e20 6f 72 65 61 63 68 20 66 69 6c 65 4e 61 6d 65 20  oreach fileName 
23e30 24 6d 64 61 43 6f 6e 66 69 67 46 69 6c 65 4e 61  $mdaConfigFileNa
23e40 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  mes {..         
23e50 20 20 20 72 65 6d 6f 76 65 43 6f 6e 73 74 72 61     removeConstra
23e60 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20  int [appendArgs 
23e70 66 69 6c 65 5f 20 24 66 69 6c 65 4e 61 6d 65 5d  file_ $fileName]
23e80 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d  ..          }...
23e90 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 65 61  .          forea
23ea0 63 68 20 66 69 6c 65 4e 61 6d 65 20 24 65 78 74  ch fileName $ext
23eb0 65 72 6e 61 6c 46 69 6c 65 4e 61 6d 65 73 20 7b  ernalFileNames {
23ec0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65  ..            re
23ed0 6d 6f 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b  moveConstraint [
23ee0 61 70 70 65 6e 64 41 72 67 73 20 66 69 6c 65 5f  appendArgs file_
23ef0 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 66 69 6c   [file tail $fil
23f00 65 4e 61 6d 65 5d 5d 0d 0a 20 20 20 20 20 20 20  eName]]..       
23f10 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
23f20 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65 4e 61    foreach fileNa
23f30 6d 65 20 24 6e 61 74 69 76 65 46 69 6c 65 4e 61  me $nativeFileNa
23f40 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  mes {..         
23f50 20 20 20 72 65 6d 6f 76 65 43 6f 6e 73 74 72 61     removeConstra
23f60 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20  int [appendArgs 
23f70 66 69 6c 65 5f 20 24 66 69 6c 65 4e 61 6d 65 5d  file_ $fileName]
23f80 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d  ..          }...
23f90 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 65 61  .          forea
23fa0 63 68 20 66 69 6c 65 4e 61 6d 65 20 24 6d 69 78  ch fileName $mix
23fb0 65 64 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20  edFileNames {.. 
23fc0 20 20 20 20 20 20 20 20 20 20 20 72 65 6d 6f 76             remov
23fd0 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70  eConstraint [app
23fe0 65 6e 64 41 72 67 73 20 66 69 6c 65 5f 20 24 66  endArgs file_ $f
23ff0 69 6c 65 4e 61 6d 65 5d 0d 0a 20 20 20 20 20 20  ileName]..      
24000 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
24010 20 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65 4e     foreach fileN
24020 61 6d 65 20 24 6d 61 6e 61 67 65 64 46 69 6c 65  ame $managedFile
24030 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20 20  Names {..       
24040 20 20 20 20 20 72 65 6d 6f 76 65 43 6f 6e 73 74       removeConst
24050 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67  raint [appendArg
24060 73 20 66 69 6c 65 5f 20 24 66 69 6c 65 4e 61 6d  s file_ $fileNam
24070 65 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d  e]..          }.
24080 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  .        }....  
24090 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
240a0 20 23 20 4e 4f 54 45 3a 20 53 6b 69 70 20 61 6c   # NOTE: Skip al
240b0 6c 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51  l System.Data.SQ
240c0 4c 69 74 65 20 72 65 6c 61 74 65 64 20 66 69 6c  Lite related fil
240d0 65 20 68 61 6e 64 6c 69 6e 67 20 28 64 65 6c 65  e handling (dele
240e0 74 69 6e 67 2c 0d 0a 20 20 20 20 20 20 20 20 23  ting,..        #
240f0 20 20 20 20 20 20 20 63 6f 70 79 69 6e 67 2c 20         copying, 
24100 61 6e 64 20 6c 6f 61 64 69 6e 67 29 20 69 66 20  and loading) if 
24110 69 6e 73 74 72 75 63 74 65 64 2e 0d 0a 20 20 20  instructed...   
24120 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
24130 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74  if {![info exist
24140 73 20 3a 3a 6e 6f 28 73 71 6c 69 74 65 46 69 6c  s ::no(sqliteFil
24150 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  es)]} then {..  
24160 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
24170 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 6b 69       # NOTE: Ski
24180 70 20 74 72 79 69 6e 67 20 74 6f 20 64 65 6c 65  p trying to dele
24190 74 65 20 61 6e 79 20 66 69 6c 65 73 20 69 66 20  te any files if 
241a0 69 6e 73 74 72 75 63 74 65 64 2e 0d 0a 20 20 20  instructed...   
241b0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
241c0 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65      if {![info e
241d0 78 69 73 74 73 20 3a 3a 6e 6f 28 64 65 6c 65 74  xists ::no(delet
241e0 65 53 71 6c 69 74 65 46 69 6c 65 73 29 5d 7d 20  eSqliteFiles)]} 
241f0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
24200 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65      if {![info e
24210 78 69 73 74 73 20 3a 3a 6e 6f 28 64 65 6c 65 74  xists ::no(delet
24220 65 53 71 6c 69 74 65 43 6f 6e 66 69 67 46 69 6c  eSqliteConfigFil
24230 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  es)]} then {..  
24240 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 65              fore
24250 61 63 68 20 66 69 6c 65 4e 61 6d 65 20 24 63 6f  ach fileName $co
24260 6e 66 69 67 46 69 6c 65 4e 61 6d 65 73 20 7b 0d  nfigFileNames {.
24270 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
24280 20 74 72 79 44 65 6c 65 74 65 42 69 6e 61 72 79   tryDeleteBinary
24290 46 69 6c 65 20 24 66 69 6c 65 4e 61 6d 65 0d 0a  File $fileName..
242a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d                }.
242b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  .            }..
242c0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ..            if
242d0 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20   {![info exists 
242e0 3a 3a 6e 6f 28 64 65 6c 65 74 65 53 71 6c 69 74  ::no(deleteSqlit
242f0 65 45 78 74 65 72 6e 61 6c 46 69 6c 65 73 29 5d  eExternalFiles)]
24300 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
24310 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20          foreach 
24320 66 69 6c 65 4e 61 6d 65 20 24 6d 64 61 43 6f 6e  fileName $mdaCon
24330 66 69 67 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a  figFileNames {..
24340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24350 74 72 79 44 65 6c 65 74 65 42 75 69 6c 64 46 69  tryDeleteBuildFi
24360 6c 65 20 24 66 69 6c 65 4e 61 6d 65 20 66 61 6c  le $fileName fal
24370 73 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  se..            
24380 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20    }....         
24390 20 20 20 20 20 66 6f 72 65 61 63 68 20 66 69 6c       foreach fil
243a0 65 4e 61 6d 65 20 24 65 78 74 65 72 6e 61 6c 46  eName $externalF
243b0 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20  ileNames {..    
243c0 20 20 20 20 20 20 20 20 20 20 20 20 74 72 79 44              tryD
243d0 65 6c 65 74 65 42 69 6e 61 72 79 46 69 6c 65 20  eleteBinaryFile 
243e0 24 66 69 6c 65 4e 61 6d 65 0d 0a 20 20 20 20 20  $fileName..     
243f0 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
24400 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
24410 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69           if {![i
24420 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28  nfo exists ::no(
24430 64 65 6c 65 74 65 53 71 6c 69 74 65 4e 61 74 69  deleteSqliteNati
24440 76 65 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e 20  veFiles)]} then 
24450 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
24460 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73   if {![info exis
24470 74 73 20 3a 3a 6e 6f 28 64 65 6c 65 74 65 53 71  ts ::no(deleteSq
24480 6c 69 74 65 49 6d 70 6c 69 63 69 74 4e 61 74 69  liteImplicitNati
24490 76 65 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e 20  veFiles)]} then 
244a0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
244b0 20 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65 4e     foreach fileN
244c0 61 6d 65 20 24 6e 61 74 69 76 65 46 69 6c 65 4e  ame $nativeFileN
244d0 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20 20 20  ames {..        
244e0 20 20 20 20 20 20 20 20 20 20 74 72 79 44 65 6c            tryDel
244f0 65 74 65 41 73 73 65 6d 62 6c 79 20 24 66 69 6c  eteAssembly $fil
24500 65 4e 61 6d 65 0d 0a 20 20 20 20 20 20 20 20 20  eName..         
24510 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
24520 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
24530 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21             if {!
24540 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e  [info exists ::n
24550 6f 28 64 65 6c 65 74 65 53 71 6c 69 74 65 4e 6f  o(deleteSqliteNo
24560 6e 49 6d 70 6c 69 63 69 74 46 69 6c 65 73 29 5d  nImplicitFiles)]
24570 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
24580 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b            if {![
24590 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f  info exists ::no
245a0 28 64 65 6c 65 74 65 53 71 6c 69 74 65 50 6c 61  (deleteSqlitePla
245b0 74 66 6f 72 6d 46 69 6c 65 73 29 5d 20 26 26 20  tformFiles)] && 
245c0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
245d0 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c         [string l
245e0 65 6e 67 74 68 20 24 70 6c 61 74 66 6f 72 6d 5d  ength $platform]
245f0 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20   > 0} then {..  
24600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24610 66 6f 72 65 61 63 68 20 66 69 6c 65 4e 61 6d 65  foreach fileName
24620 20 24 6e 61 74 69 76 65 46 69 6c 65 4e 61 6d 65   $nativeFileName
24630 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s {..           
24640 20 20 20 20 20 20 20 20 20 74 72 79 44 65 6c 65           tryDele
24650 74 65 41 73 73 65 6d 62 6c 79 20 24 66 69 6c 65  teAssembly $file
24660 4e 61 6d 65 20 24 70 6c 61 74 66 6f 72 6d 0d 0a  Name $platform..
24670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24680 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20    }..           
24690 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
246a0 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b            if {![
246b0 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f  info exists ::no
246c0 28 64 65 6c 65 74 65 53 71 6c 69 74 65 41 72 63  (deleteSqliteArc
246d0 68 69 74 65 63 74 75 72 65 46 69 6c 65 73 29 5d  hitectureFiles)]
246e0 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20   && \..         
246f0 20 20 20 20 20 20 20 20 20 20 20 5b 73 74 72 69             [stri
24700 6e 67 20 6c 65 6e 67 74 68 20 24 61 72 63 68 69  ng length $archi
24710 74 65 63 74 75 72 65 5d 20 3e 20 30 7d 20 74 68  tecture] > 0} th
24720 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
24730 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20          foreach 
24740 66 69 6c 65 4e 61 6d 65 20 24 6e 61 74 69 76 65  fileName $native
24750 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20  FileNames {..   
24760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24770 20 74 72 79 44 65 6c 65 74 65 41 73 73 65 6d 62   tryDeleteAssemb
24780 6c 79 20 24 66 69 6c 65 4e 61 6d 65 20 24 61 72  ly $fileName $ar
24790 63 68 69 74 65 63 74 75 72 65 0d 0a 20 20 20 20  chitecture..    
247a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d                }.
247b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
247c0 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   }..            
247d0 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20    }..           
247e0 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   }....          
247f0 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69    if {![info exi
24800 73 74 73 20 3a 3a 6e 6f 28 64 65 6c 65 74 65 53  sts ::no(deleteS
24810 71 6c 69 74 65 4d 69 78 65 64 46 69 6c 65 73 29  qliteMixedFiles)
24820 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
24830 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
24840 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45            # NOTE
24850 3a 20 49 66 20 74 68 65 20 22 6e 61 74 69 76 65  : If the "native
24860 22 20 72 75 6e 74 69 6d 65 20 6f 70 74 69 6f 6e  " runtime option
24870 20 69 73 20 73 65 74 2c 20 64 65 6c 65 74 65 20   is set, delete 
24880 69 6d 70 6c 69 63 69 74 0d 0a 20 20 20 20 20 20  implicit..      
24890 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
248a0 6d 69 78 65 64 2d 6d 6f 64 65 20 61 73 73 65 6d  mixed-mode assem
248b0 62 6c 79 20 66 69 6c 65 73 20 61 73 20 77 65 6c  bly files as wel
248c0 6c 2e 20 20 54 68 69 73 20 72 75 6e 74 69 6d 65  l.  This runtime
248d0 20 6f 70 74 69 6f 6e 0d 0a 20 20 20 20 20 20 20   option..       
248e0 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63         #       c
248f0 68 65 63 6b 20 69 73 20 68 61 6e 64 6c 65 64 20  heck is handled 
24900 77 68 65 6e 20 62 75 69 6c 64 69 6e 67 20 74 68  when building th
24910 65 20 6c 69 73 74 20 6f 66 20 6d 69 78 65 64 2d  e list of mixed-
24920 6d 6f 64 65 0d 0a 20 20 20 20 20 20 20 20 20 20  mode..          
24930 20 20 20 20 23 20 20 20 20 20 20 20 61 73 73 65      #       asse
24940 6d 62 6c 79 20 66 69 6c 65 20 6e 61 6d 65 73 2e  mbly file names.
24950 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
24960 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  #..             
24970 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73   if {![info exis
24980 74 73 20 3a 3a 6e 6f 28 64 65 6c 65 74 65 53 71  ts ::no(deleteSq
24990 6c 69 74 65 49 6d 70 6c 69 63 69 74 4d 69 78 65  liteImplicitMixe
249a0 64 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e 20 7b  dFiles)]} then {
249b0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
249c0 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65 4e 61    foreach fileNa
249d0 6d 65 20 24 6d 69 78 65 64 46 69 6c 65 4e 61 6d  me $mixedFileNam
249e0 65 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  es {..          
249f0 20 20 20 20 20 20 20 20 74 72 79 44 65 6c 65 74          tryDelet
24a00 65 41 73 73 65 6d 62 6c 79 20 24 66 69 6c 65 4e  eAssembly $fileN
24a10 61 6d 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ame..           
24a20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
24a30 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
24a40 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69           if {![i
24a50 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28  nfo exists ::no(
24a60 64 65 6c 65 74 65 53 71 6c 69 74 65 4e 6f 6e 49  deleteSqliteNonI
24a70 6d 70 6c 69 63 69 74 46 69 6c 65 73 29 5d 7d 20  mplicitFiles)]} 
24a80 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
24a90 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e          if {![in
24aa0 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 64  fo exists ::no(d
24ab0 65 6c 65 74 65 53 71 6c 69 74 65 50 6c 61 74 66  eleteSqlitePlatf
24ac0 6f 72 6d 46 69 6c 65 73 29 5d 20 26 26 20 5c 0d  ormFiles)] && \.
24ad0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
24ae0 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e       [string len
24af0 67 74 68 20 24 70 6c 61 74 66 6f 72 6d 5d 20 3e  gth $platform] >
24b00 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
24b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f                fo
24b20 72 65 61 63 68 20 66 69 6c 65 4e 61 6d 65 20 24  reach fileName $
24b30 6d 69 78 65 64 46 69 6c 65 4e 61 6d 65 73 20 7b  mixedFileNames {
24b40 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
24b50 20 20 20 20 20 20 74 72 79 44 65 6c 65 74 65 41        tryDeleteA
24b60 73 73 65 6d 62 6c 79 20 24 66 69 6c 65 4e 61 6d  ssembly $fileNam
24b70 65 20 24 70 6c 61 74 66 6f 72 6d 0d 0a 20 20 20  e $platform..   
24b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
24b90 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
24ba0 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20    }....         
24bb0 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66         if {![inf
24bc0 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 64 65  o exists ::no(de
24bd0 6c 65 74 65 53 71 6c 69 74 65 41 72 63 68 69 74  leteSqliteArchit
24be0 65 63 74 75 72 65 46 69 6c 65 73 29 5d 20 26 26  ectureFiles)] &&
24bf0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
24c00 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20          [string 
24c10 6c 65 6e 67 74 68 20 24 61 72 63 68 69 74 65 63  length $architec
24c20 74 75 72 65 5d 20 3e 20 30 7d 20 74 68 65 6e 20  ture] > 0} then 
24c30 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
24c40 20 20 20 20 20 66 6f 72 65 61 63 68 20 66 69 6c       foreach fil
24c50 65 4e 61 6d 65 20 24 6d 69 78 65 64 46 69 6c 65  eName $mixedFile
24c60 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20 20  Names {..       
24c70 20 20 20 20 20 20 20 20 20 20 20 20 20 74 72 79               try
24c80 44 65 6c 65 74 65 41 73 73 65 6d 62 6c 79 20 24  DeleteAssembly $
24c90 66 69 6c 65 4e 61 6d 65 20 24 61 72 63 68 69 74  fileName $archit
24ca0 65 63 74 75 72 65 0d 0a 20 20 20 20 20 20 20 20  ecture..        
24cb0 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
24cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a               }..
24cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d                }.
24ce0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  .            }..
24cf0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ..            if
24d00 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20   {![info exists 
24d10 3a 3a 6e 6f 28 64 65 6c 65 74 65 53 71 6c 69 74  ::no(deleteSqlit
24d20 65 4d 61 6e 61 67 65 64 46 69 6c 65 73 29 5d 7d  eManagedFiles)]}
24d30 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
24d40 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 66         foreach f
24d50 69 6c 65 4e 61 6d 65 20 24 6d 61 6e 61 67 65 64  ileName $managed
24d60 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20  FileNames {..   
24d70 20 20 20 20 20 20 20 20 20 20 20 20 20 74 72 79               try
24d80 44 65 6c 65 74 65 41 73 73 65 6d 62 6c 79 20 24  DeleteAssembly $
24d90 66 69 6c 65 4e 61 6d 65 0d 0a 20 20 20 20 20 20  fileName..      
24da0 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
24db0 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
24dc0 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
24dd0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
24de0 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 66 6f  # NOTE: Check fo
24df0 72 20 74 68 65 20 22 61 75 74 6f 53 65 6c 65 63  r the "autoSelec
24e00 74 22 20 72 75 6e 74 69 6d 65 20 6f 70 74 69 6f  t" runtime optio
24e10 6e 2e 20 20 49 66 20 70 72 65 73 65 6e 74 2c 0d  n.  If present,.
24e20 0a 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20  .          #    
24e30 20 20 20 61 74 74 65 6d 70 74 20 74 6f 20 61 75     attempt to au
24e40 74 6f 6d 61 74 69 63 61 6c 6c 79 20 73 65 6c 65  tomatically sele
24e50 63 74 20 74 68 65 20 66 69 72 73 74 20 61 76 61  ct the first ava
24e60 69 6c 61 62 6c 65 0d 0a 20 20 20 20 20 20 20 20  ilable..        
24e70 20 20 23 20 20 20 20 20 20 20 62 75 69 6c 64 20    #       build 
24e80 28 6f 72 20 22 72 65 6c 65 61 73 65 22 29 20 6f  (or "release") o
24e90 66 20 53 51 4c 69 74 65 20 61 6e 64 20 53 79 73  f SQLite and Sys
24ea0 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 0d  tem.Data.SQLite.
24eb0 0a 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20  .          #    
24ec0 20 20 20 66 6f 72 20 75 73 65 20 77 69 74 68 20     for use with 
24ed0 74 68 65 20 74 65 73 74 20 73 75 69 74 65 2e 0d  the test suite..
24ee0 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
24ef0 20 20 20 20 20 20 20 20 69 66 20 7b 5b 68 61 73          if {[has
24f00 52 75 6e 74 69 6d 65 4f 70 74 69 6f 6e 20 61 75  RuntimeOption au
24f10 74 6f 53 65 6c 65 63 74 5d 7d 20 74 68 65 6e 20  toSelect]} then 
24f20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  {..            i
24f30 66 20 7b 21 5b 63 68 65 63 6b 46 6f 72 53 51 4c  f {![checkForSQL
24f40 69 74 65 42 75 69 6c 64 73 20 24 3a 3a 74 65 73  iteBuilds $::tes
24f50 74 5f 63 68 61 6e 6e 65 6c 20 74 72 75 65 5d 7d  t_channel true]}
24f60 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
24f70 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72 53         checkForS
24f80 51 4c 69 74 65 52 65 6c 65 61 73 65 73 20 24 3a  QLiteReleases $:
24f90 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 74 72  :test_channel tr
24fa0 75 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ue..            
24fb0 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  }..          }..
24fc0 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20  ..          #.. 
24fd0 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a           # NOTE:
24fe0 20 53 6b 69 70 20 74 72 79 69 6e 67 20 74 6f 20   Skip trying to 
24ff0 76 65 72 69 66 79 20 74 68 65 20 62 75 69 6c 64  verify the build
25000 20 64 69 72 65 63 74 6f 72 79 20 69 66 20 69 6e   directory if in
25010 73 74 72 75 63 74 65 64 3b 0d 0a 20 20 20 20 20  structed;..     
25020 20 20 20 20 20 23 20 20 20 20 20 20 20 6f 74 68       #       oth
25030 65 72 77 69 73 65 2c 20 6d 61 6b 65 20 73 75 72  erwise, make sur
25040 65 20 69 74 20 61 63 74 75 61 6c 6c 79 20 65 78  e it actually ex
25050 69 73 74 73 20 6f 72 20 68 61 6c 74 20 74 68 65  ists or halt the
25060 20 65 6e 74 69 72 65 0d 0a 20 20 20 20 20 20 20   entire..       
25070 20 20 20 23 20 20 20 20 20 20 20 74 65 73 74 69     #       testi
25080 6e 67 20 70 72 6f 63 65 73 73 20 69 66 20 69 74  ng process if it
25090 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2e   does not exist.
250a0 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20  ..          #.. 
250b0 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69           if {![i
250c0 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28  nfo exists ::no(
250d0 76 65 72 69 66 79 42 75 69 6c 64 44 69 72 65 63  verifyBuildDirec
250e0 74 6f 72 79 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a  tory)]} then {..
250f0 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20              #.. 
25100 20 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54             # NOT
25110 45 3a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74  E: At this point
25120 2c 20 74 68 65 20 62 75 69 6c 64 20 64 69 72 65  , the build dire
25130 63 74 6f 72 79 20 4d 55 53 54 20 65 78 69 73 74  ctory MUST exist
25140 20 61 73 20 61 0d 0a 20 20 20 20 20 20 20 20 20   as a..         
25150 20 20 20 23 20 20 20 20 20 20 20 76 61 6c 69 64     #       valid
25160 20 64 69 72 65 63 74 6f 72 79 20 66 6f 72 20 74   directory for t
25170 68 65 20 74 65 73 74 69 6e 67 20 70 72 6f 63 65  he testing proce
25180 73 73 20 74 6f 20 63 6f 6e 74 69 6e 75 65 2e 0d  ss to continue..
25190 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a  .            #..
251a0 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20              set 
251b0 64 69 72 65 63 74 6f 72 79 20 5b 67 65 74 42 75  directory [getBu
251c0 69 6c 64 44 69 72 65 63 74 6f 72 79 20 66 61 6c  ildDirectory fal
251d0 73 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  se]....         
251e0 20 20 20 69 66 20 7b 21 5b 66 69 6c 65 20 65 78     if {![file ex
251f0 69 73 74 73 20 24 64 69 72 65 63 74 6f 72 79 5d  ists $directory]
25200 20 7c 7c 20 5c 0d 0a 20 20 20 20 20 20 20 20 20   || \..         
25210 20 20 20 20 20 20 20 21 5b 66 69 6c 65 20 69 73         ![file is
25220 64 69 72 65 63 74 6f 72 79 20 24 64 69 72 65 63  directory $direc
25230 74 6f 72 79 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  tory]} then {.. 
25240 20 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a               #..
25250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20                # 
25260 4e 4f 54 45 3a 20 4a 75 73 74 20 70 72 69 6f 72  NOTE: Just prior
25270 20 74 6f 20 61 63 74 75 61 6c 6c 79 20 68 61 6c   to actually hal
25280 74 69 6e 67 20 74 68 65 20 74 65 73 74 69 6e 67  ting the testing
25290 20 70 72 6f 63 65 73 73 2c 0d 0a 20 20 20 20 20   process,..     
252a0 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20           #      
252b0 20 61 64 64 20 61 6e 20 65 72 72 6f 72 20 74 6f   add an error to
252c0 20 74 68 65 20 74 65 73 74 20 6c 6f 67 20 66 69   the test log fi
252d0 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20  le...           
252e0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
252f0 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
25300 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e  t_channel [appen
25310 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
25320 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
25330 20 63 6f 75 6c 64 20 6e 6f 74 20 76 65 72 69 66   could not verif
25340 79 20 62 75 69 6c 64 20 64 69 72 65 63 74 6f 72  y build director
25350 79 20 5c 22 22 20 24 64 69 72 65 63 74 6f 72 79  y \"" $directory
25360 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
25370 20 20 20 20 20 20 22 5c 22 2c 20 61 6c 6c 20 74        "\", all t
25380 65 73 74 69 6e 67 20 68 61 6c 74 65 64 5c 6e 22  esting halted\n"
25390 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ]....           
253a0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
253b0 20 20 20 20 23 20 4e 4f 54 45 3a 20 52 61 69 73      # NOTE: Rais
253c0 69 6e 67 20 61 20 73 63 72 69 70 74 20 65 72 72  ing a script err
253d0 6f 72 20 66 72 6f 6d 20 74 68 69 73 20 70 6f 69  or from this poi
253e0 6e 74 20 73 68 6f 75 6c 64 20 68 61 6c 74 0d 0a  nt should halt..
253f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20                # 
25400 20 20 20 20 20 20 74 68 65 20 74 65 73 74 69 6e        the testin
25410 67 20 70 72 6f 63 65 73 73 2e 0d 0a 20 20 20 20  g process...    
25420 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
25430 20 20 20 20 20 20 20 20 20 20 20 65 72 72 6f 72             error
25440 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
25450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25460 20 20 22 63 6f 75 6c 64 20 6e 6f 74 20 76 65 72    "could not ver
25470 69 66 79 20 62 75 69 6c 64 20 64 69 72 65 63 74  ify build direct
25480 6f 72 79 20 5c 22 22 20 24 64 69 72 65 63 74 6f  ory \"" $directo
25490 72 79 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  ry \..          
254a0 20 20 20 20 20 20 20 20 22 5c 22 2c 20 61 6c 6c          "\", all
254b0 20 74 65 73 74 69 6e 67 20 68 61 6c 74 65 64 22   testing halted"
254c0 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  ]..            }
254d0 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d  ..          }...
254e0 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
254f0 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
25500 53 6b 69 70 20 74 72 79 69 6e 67 20 74 6f 20 63  Skip trying to c
25510 6f 70 79 20 61 6e 79 20 66 69 6c 65 73 20 69 66  opy any files if
25520 20 69 6e 73 74 72 75 63 74 65 64 2e 0d 0a 20 20   instructed...  
25530 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
25540 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20       if {![info 
25550 65 78 69 73 74 73 20 3a 3a 6e 6f 28 63 6f 70 79  exists ::no(copy
25560 53 71 6c 69 74 65 46 69 6c 65 73 29 5d 7d 20 74  SqliteFiles)]} t
25570 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
25580 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78     if {![info ex
25590 69 73 74 73 20 3a 3a 6e 6f 28 63 6f 70 79 53 71  ists ::no(copySq
255a0 6c 69 74 65 43 6f 6e 66 69 67 46 69 6c 65 73 29  liteConfigFiles)
255b0 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
255c0 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
255d0 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5c  ::test_channel \
255e0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
255f0 20 20 20 20 22 2d 2d 2d 2d 20 63 6f 70 79 69 6e      "---- copyin
25600 67 20 5c 22 63 6f 6e 66 69 67 75 72 61 74 69 6f  g \"configuratio
25610 6e 5c 22 20 66 69 6c 65 73 2e 2e 2e 5c 6e 22 0d  n\" files...\n".
25620 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
25630 20 66 6f 72 65 61 63 68 20 66 69 6c 65 4e 61 6d   foreach fileNam
25640 65 20 24 63 6f 6e 66 69 67 46 69 6c 65 4e 61 6d  e $configFileNam
25650 65 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  es {..          
25660 20 20 20 20 20 20 74 72 79 43 6f 70 79 42 75 69        tryCopyBui
25670 6c 64 46 69 6c 65 20 24 66 69 6c 65 4e 61 6d 65  ldFile $fileName
25680 20 66 61 6c 73 65 0d 0a 20 20 20 20 20 20 20 20   false..        
25690 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
256a0 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
256b0 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f        if {![info
256c0 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 63 6f 70   exists ::no(cop
256d0 79 53 71 6c 69 74 65 45 78 74 65 72 6e 61 6c 46  ySqliteExternalF
256e0 69 6c 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a  iles)]} then {..
256f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 0d                #.
25700 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23  .              #
25710 20 4e 4f 54 45 3a 20 43 6f 70 79 20 74 68 65 20   NOTE: Copy the 
25720 4d 61 6e 61 67 65 64 20 44 65 62 75 67 67 69 6e  Managed Debuggin
25730 67 20 41 73 73 69 73 74 61 6e 74 73 20 28 4d 44  g Assistants (MD
25740 41 29 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  A) configuration
25750 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
25760 23 20 20 20 20 20 20 20 66 69 6c 65 20 66 6f 72  #       file for
25770 20 74 68 65 20 45 61 67 6c 65 20 73 68 65 6c 6c   the Eagle shell
25780 20 74 6f 20 74 68 65 20 62 75 69 6c 64 20 6f 75   to the build ou
25790 74 70 75 74 20 64 69 72 65 63 74 6f 72 79 2c 0d  tput directory,.
257a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23  .              #
257b0 20 20 20 20 20 20 20 77 68 69 6c 65 20 75 73 69         while usi
257c0 6e 67 20 65 61 63 68 20 6f 66 20 74 68 65 20 6e  ng each of the n
257d0 61 6d 65 73 20 6f 66 20 74 68 65 20 76 61 72 69  ames of the vari
257e0 6f 75 73 20 6c 65 67 61 63 79 20 74 65 73 74 0d  ous legacy test.
257f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23  .              #
25800 20 20 20 20 20 20 20 65 78 65 63 75 74 61 62 6c         executabl
25810 65 73 2e 20 20 54 68 69 73 20 77 69 6c 6c 20 68  es.  This will h
25820 65 6c 70 20 74 6f 20 6d 61 6b 65 20 73 75 72 65  elp to make sure
25830 20 74 68 61 74 20 61 6c 6c 20 74 68 65 0d 0a 20   that all the.. 
25840 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20 20               #  
25850 20 20 20 20 20 6c 65 67 61 63 79 20 74 65 73 74       legacy test
25860 73 20 72 75 6e 20 77 69 74 68 20 65 78 61 63 74  s run with exact
25870 6c 79 20 74 68 65 20 73 61 6d 65 20 73 65 74 20  ly the same set 
25880 6f 66 20 4d 61 6e 61 67 65 64 0d 0a 20 20 20 20  of Managed..    
25890 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20            #     
258a0 20 20 44 65 62 75 67 67 69 6e 67 20 41 73 73 69    Debugging Assi
258b0 73 74 61 6e 74 73 20 63 6f 6e 66 69 67 75 72 65  stants configure
258c0 64 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  d...            
258d0 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20    #..           
258e0 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
258f0 5f 63 68 61 6e 6e 65 6c 20 5c 0d 0a 20 20 20 20  _channel \..    
25900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d                "-
25910 2d 2d 2d 20 63 6f 70 79 69 6e 67 20 5c 22 4d 44  --- copying \"MD
25920 41 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 5c  A configuration\
25930 22 20 66 69 6c 65 73 2e 2e 2e 5c 6e 22 0d 0a 0d  " files...\n"...
25940 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66  .              f
25950 6f 72 65 61 63 68 20 66 69 6c 65 4e 61 6d 65 20  oreach fileName 
25960 24 6d 64 61 43 6f 6e 66 69 67 46 69 6c 65 4e 61  $mdaConfigFileNa
25970 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  mes {..         
25980 20 20 20 20 20 20 20 74 72 79 43 6f 70 79 42 69         tryCopyBi
25990 6e 61 72 79 46 69 6c 65 20 45 61 67 6c 65 53 68  naryFile EagleSh
259a0 65 6c 6c 2e 65 78 65 2e 6d 64 61 2e 63 6f 6e 66  ell.exe.mda.conf
259b0 69 67 20 74 72 75 65 20 22 22 20 24 66 69 6c 65  ig true "" $file
259c0 4e 61 6d 65 0d 0a 20 20 20 20 20 20 20 20 20 20  Name..          
259d0 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
259e0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
259f0 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
25a00 43 6f 70 79 20 74 68 65 20 65 78 74 65 72 6e 61  Copy the externa
25a10 6c 20 62 69 6e 61 72 69 65 73 2c 20 69 66 20 61  l binaries, if a
25a20 6e 79 2c 20 74 6f 20 74 68 65 20 64 69 72 65 63  ny, to the direc
25a30 74 6f 72 79 20 74 68 61 74 0d 0a 20 20 20 20 20  tory that..     
25a40 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20           #      
25a50 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 45 61   contains the Ea
25a60 67 6c 65 20 73 68 65 6c 6c 2e 20 20 54 68 69 73  gle shell.  This
25a70 20 69 73 20 74 79 70 69 63 61 6c 6c 79 20 75 73   is typically us
25a80 65 64 20 74 6f 20 6d 61 6b 65 0d 0a 20 20 20 20  ed to make..    
25a90 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20            #     
25aa0 20 20 73 75 72 65 20 61 73 73 65 6d 62 6c 69 65    sure assemblie
25ab0 73 20 72 65 66 65 72 65 6e 63 65 64 20 62 79 20  s referenced by 
25ac0 74 68 65 20 6f 6e 65 73 20 62 65 69 6e 67 20 74  the ones being t
25ad0 65 73 74 65 64 20 61 72 65 0d 0a 20 20 20 20 20  ested are..     
25ae0 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20           #      
25af0 20 61 76 61 69 6c 61 62 6c 65 20 64 75 72 69 6e   available durin
25b00 67 20 74 68 65 20 74 65 73 74 69 6e 67 20 70 72  g the testing pr
25b10 6f 63 65 73 73 2e 0d 0a 20 20 20 20 20 20 20 20  ocess...        
25b20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
25b30 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
25b40 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 22 2d 2d  test_channel "--
25b50 2d 2d 20 63 6f 70 79 69 6e 67 20 5c 22 65 78 74  -- copying \"ext
25b60 65 72 6e 61 6c 5c 22 20 66 69 6c 65 73 2e 2e 2e  ernal\" files...
25b70 5c 6e 22 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  \n"....         
25b80 20 20 20 20 20 66 6f 72 65 61 63 68 20 66 69 6c       foreach fil
25b90 65 4e 61 6d 65 20 24 65 78 74 65 72 6e 61 6c 46  eName $externalF
25ba0 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20  ileNames {..    
25bb0 20 20 20 20 20 20 20 20 20 20 20 20 74 72 79 43              tryC
25bc0 6f 70 79 45 78 74 65 72 6e 61 6c 46 69 6c 65 20  opyExternalFile 
25bd0 24 66 69 6c 65 4e 61 6d 65 0d 0a 20 20 20 20 20  $fileName..     
25be0 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
25bf0 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
25c00 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69           if {![i
25c10 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28  nfo exists ::no(
25c20 63 6f 70 79 53 71 6c 69 74 65 4e 61 74 69 76 65  copySqliteNative
25c30 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d  Files)]} then {.
25c40 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23  .              #
25c50 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
25c60 23 20 4e 4f 54 45 3a 20 49 66 20 74 68 65 20 74  # NOTE: If the t
25c70 65 73 74 20 70 6c 61 74 66 6f 72 6d 20 69 73 20  est platform is 
25c80 6c 69 6b 65 6c 79 20 74 68 65 20 64 65 66 61 75  likely the defau
25c90 6c 74 20 66 6f 72 20 74 68 69 73 0d 0a 20 20 20  lt for this..   
25ca0 20 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20             #    
25cb0 20 20 20 6d 61 63 68 69 6e 65 2c 20 61 6c 73 6f     machine, also
25cc0 20 74 72 79 20 74 6f 20 63 6f 70 79 20 74 68 65   try to copy the
25cd0 20 6e 61 74 69 76 65 20 66 69 6c 65 73 20 74 6f   native files to
25ce0 20 74 68 65 0d 0a 20 20 20 20 20 20 20 20 20 20   the..          
25cf0 20 20 20 20 23 20 20 20 20 20 20 20 62 69 6e 61      #       bina
25d00 72 79 20 6c 6f 63 61 74 69 6f 6e 2e 0d 0a 20 20  ry location...  
25d10 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20              #.. 
25d20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20               if 
25d30 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a  {![info exists :
25d40 3a 6e 6f 28 63 6f 70 79 53 71 6c 69 74 65 49 6d  :no(copySqliteIm
25d50 70 6c 69 63 69 74 4e 61 74 69 76 65 46 69 6c 65  plicitNativeFile
25d60 73 29 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20  s)] && \..      
25d70 20 20 20 20 20 20 20 20 20 20 20 20 5b 69 73 44              [isD
25d80 65 66 61 75 6c 74 42 75 69 6c 64 50 6c 61 74 66  efaultBuildPlatf
25d90 6f 72 6d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  orm]} then {..  
25da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 70                tp
25db0 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  uts $::test_chan
25dc0 6e 65 6c 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  nel \..         
25dd0 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
25de0 20 63 6f 70 79 69 6e 67 20 69 6d 70 6c 69 63 69   copying implici
25df0 74 20 5c 22 6e 61 74 69 76 65 5c 22 20 66 69 6c  t \"native\" fil
25e00 65 73 2e 2e 2e 5c 6e 22 0d 0a 0d 0a 20 20 20 20  es...\n"....    
25e10 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 65              fore
25e20 61 63 68 20 66 69 6c 65 4e 61 6d 65 20 24 6e 61  ach fileName $na
25e30 74 69 76 65 46 69 6c 65 4e 61 6d 65 73 20 7b 0d  tiveFileNames {.
25e40 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
25e50 20 20 20 74 72 79 43 6f 70 79 41 73 73 65 6d 62     tryCopyAssemb
25e60 6c 79 20 24 66 69 6c 65 4e 61 6d 65 20 66 61 6c  ly $fileName fal
25e70 73 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  se..            
25e80 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
25e90 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
25ea0 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e          if {![in
25eb0 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 63  fo exists ::no(c
25ec0 6f 70 79 53 71 6c 69 74 65 4e 6f 6e 49 6d 70 6c  opySqliteNonImpl
25ed0 69 63 69 74 46 69 6c 65 73 29 5d 7d 20 74 68 65  icitFiles)]} the
25ee0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
25ef0 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20       if {![info 
25f00 65 78 69 73 74 73 20 3a 3a 6e 6f 28 63 6f 70 79  exists ::no(copy
25f10 53 71 6c 69 74 65 50 6c 61 74 66 6f 72 6d 46 69  SqlitePlatformFi
25f20 6c 65 73 29 5d 20 26 26 20 5c 0d 0a 20 20 20 20  les)] && \..    
25f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25f40 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
25f50 70 6c 61 74 66 6f 72 6d 5d 20 3e 20 30 7d 20 74  platform] > 0} t
25f60 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
25f70 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
25f80 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b  ::test_channel [
25f90 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
25fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25fb0 20 20 20 20 22 2d 2d 2d 2d 20 63 6f 70 79 69 6e      "---- copyin
25fc0 67 20 5c 22 6e 61 74 69 76 65 5c 22 20 66 69 6c  g \"native\" fil
25fd0 65 73 20 66 6f 72 20 70 6c 61 74 66 6f 72 6d 20  es for platform 
25fe0 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  \"" \..         
25ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 24 70 6c               $pl
26000 61 74 66 6f 72 6d 20 5c 22 2e 2e 2e 5c 6e 5d 0d  atform \"...\n].
26010 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
26020 20 20 20 20 20 66 6f 72 65 61 63 68 20 66 69 6c       foreach fil
26030 65 4e 61 6d 65 20 24 6e 61 74 69 76 65 46 69 6c  eName $nativeFil
26040 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20  eNames {..      
26050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 72                tr
26060 79 43 6f 70 79 41 73 73 65 6d 62 6c 79 20 24 66  yCopyAssembly $f
26070 69 6c 65 4e 61 6d 65 20 66 61 6c 73 65 20 24 70  ileName false $p
26080 6c 61 74 66 6f 72 6d 0d 0a 20 20 20 20 20 20 20  latform..       
26090 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
260a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d                }.
260b0 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
260c0 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78     if {![info ex
260d0 69 73 74 73 20 3a 3a 6e 6f 28 63 6f 70 79 53 71  ists ::no(copySq
260e0 6c 69 74 65 41 72 63 68 69 74 65 63 74 75 72 65  liteArchitecture
260f0 46 69 6c 65 73 29 5d 20 26 26 20 5c 0d 0a 20 20  Files)] && \..  
26100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26110 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68    [string length
26120 20 24 61 72 63 68 69 74 65 63 74 75 72 65 5d 20   $architecture] 
26130 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  > 0} then {..   
26140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
26150 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
26160 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
26170 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
26180 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
26190 63 6f 70 79 69 6e 67 20 5c 22 6e 61 74 69 76 65  copying \"native
261a0 5c 22 20 66 69 6c 65 73 20 66 6f 72 20 61 72 63  \" files for arc
261b0 68 69 74 65 63 74 75 72 65 20 5c 22 22 20 5c 0d  hitecture \"" \.
261c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
261d0 20 20 20 20 20 20 20 24 61 72 63 68 69 74 65 63         $architec
261e0 74 75 72 65 20 5c 22 2e 2e 2e 5c 6e 5d 0d 0a 0d  ture \"...\n]...
261f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
26200 20 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65 4e     foreach fileN
26210 61 6d 65 20 24 6e 61 74 69 76 65 46 69 6c 65 4e  ame $nativeFileN
26220 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20 20 20  ames {..        
26230 20 20 20 20 20 20 20 20 20 20 20 20 74 72 79 43              tryC
26240 6f 70 79 41 73 73 65 6d 62 6c 79 20 24 66 69 6c  opyAssembly $fil
26250 65 4e 61 6d 65 20 66 61 6c 73 65 20 24 61 72 63  eName false $arc
26260 68 69 74 65 63 74 75 72 65 0d 0a 20 20 20 20 20  hitecture..     
26270 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a               }..
26280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26290 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  }..             
262a0 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   }..            
262b0 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  }....           
262c0 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73   if {![info exis
262d0 74 73 20 3a 3a 6e 6f 28 63 6f 70 79 53 71 6c 69  ts ::no(copySqli
262e0 74 65 4d 69 78 65 64 46 69 6c 65 73 29 5d 7d 20  teMixedFiles)]} 
262f0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
26300 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
26310 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49         # NOTE: I
26320 66 20 74 68 65 20 22 6e 61 74 69 76 65 22 20 72  f the "native" r
26330 75 6e 74 69 6d 65 20 6f 70 74 69 6f 6e 20 69 73  untime option is
26340 20 73 65 74 2c 20 63 6f 70 79 20 69 6d 70 6c 69   set, copy impli
26350 63 69 74 0d 0a 20 20 20 20 20 20 20 20 20 20 20  cit..           
26360 20 20 20 23 20 20 20 20 20 20 20 6d 69 78 65 64     #       mixed
26370 2d 6d 6f 64 65 20 61 73 73 65 6d 62 6c 79 20 66  -mode assembly f
26380 69 6c 65 73 20 61 73 20 77 65 6c 6c 2e 20 20 54  iles as well.  T
26390 68 65 20 72 75 6e 74 69 6d 65 20 6f 70 74 69 6f  he runtime optio
263a0 6e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n..             
263b0 20 23 20 20 20 20 20 20 20 63 68 65 63 6b 20 69   #       check i
263c0 73 20 68 61 6e 64 6c 65 64 20 77 68 65 6e 20 62  s handled when b
263d0 75 69 6c 64 69 6e 67 20 74 68 65 20 6c 69 73 74  uilding the list
263e0 20 6f 66 20 6d 69 78 65 64 2d 6d 6f 64 65 0d 0a   of mixed-mode..
263f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20                # 
26400 20 20 20 20 20 20 61 73 73 65 6d 62 6c 79 20 66        assembly f
26410 69 6c 65 20 6e 61 6d 65 73 2e 0d 0a 20 20 20 20  ile names...    
26420 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
26430 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21             if {!
26440 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e  [info exists ::n
26450 6f 28 63 6f 70 79 53 71 6c 69 74 65 49 6d 70 6c  o(copySqliteImpl
26460 69 63 69 74 4d 69 78 65 64 46 69 6c 65 73 29 5d  icitMixedFiles)]
26470 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
26480 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
26490 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
264a0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
264b0 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 6f 70         "---- cop
264c0 79 69 6e 67 20 69 6d 70 6c 69 63 69 74 20 5c 22  ying implicit \"
264d0 6d 69 78 65 64 5c 22 20 66 69 6c 65 73 2e 2e 2e  mixed\" files...
264e0 5c 6e 22 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  \n"....         
264f0 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 66         foreach f
26500 69 6c 65 4e 61 6d 65 20 24 6d 69 78 65 64 46 69  ileName $mixedFi
26510 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20  leNames {..     
26520 20 20 20 20 20 20 20 20 20 20 20 20 20 74 72 79               try
26530 43 6f 70 79 41 73 73 65 6d 62 6c 79 20 24 66 69  CopyAssembly $fi
26540 6c 65 4e 61 6d 65 20 66 61 6c 73 65 0d 0a 20 20  leName false..  
26550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d                }.
26560 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
26570 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
26580 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69    if {![info exi
26590 73 74 73 20 3a 3a 6e 6f 28 63 6f 70 79 53 71 6c  sts ::no(copySql
265a0 69 74 65 4e 6f 6e 49 6d 70 6c 69 63 69 74 46 69  iteNonImplicitFi
265b0 6c 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  les)]} then {.. 
265c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
265d0 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73  f {![info exists
265e0 20 3a 3a 6e 6f 28 63 6f 70 79 53 71 6c 69 74 65   ::no(copySqlite
265f0 50 6c 61 74 66 6f 72 6d 46 69 6c 65 73 29 5d 20  PlatformFiles)] 
26600 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  && \..          
26610 20 20 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e            [strin
26620 67 20 6c 65 6e 67 74 68 20 24 70 6c 61 74 66 6f  g length $platfo
26630 72 6d 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d  rm] > 0} then {.
26640 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
26650 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
26660 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  _channel [append
26670 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
26680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d                "-
26690 2d 2d 2d 20 63 6f 70 79 69 6e 67 20 5c 22 6d 69  --- copying \"mi
266a0 78 65 64 5c 22 20 66 69 6c 65 73 20 66 6f 72 20  xed\" files for 
266b0 70 6c 61 74 66 6f 72 6d 20 5c 22 22 20 5c 0d 0a  platform \"" \..
266c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
266d0 20 20 20 20 20 20 24 70 6c 61 74 66 6f 72 6d 20        $platform 
266e0 5c 22 2e 2e 2e 5c 6e 5d 0d 0a 0d 0a 20 20 20 20  \"...\n]....    
266f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f                fo
26700 72 65 61 63 68 20 66 69 6c 65 4e 61 6d 65 20 24  reach fileName $
26710 6d 69 78 65 64 46 69 6c 65 4e 61 6d 65 73 20 7b  mixedFileNames {
26720 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
26730 20 20 20 20 20 20 74 72 79 43 6f 70 79 41 73 73        tryCopyAss
26740 65 6d 62 6c 79 20 24 66 69 6c 65 4e 61 6d 65 20  embly $fileName 
26750 66 61 6c 73 65 20 24 70 6c 61 74 66 6f 72 6d 0d  false $platform.
26760 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
26770 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
26780 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
26790 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21             if {!
267a0 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e  [info exists ::n
267b0 6f 28 63 6f 70 79 53 71 6c 69 74 65 41 72 63 68  o(copySqliteArch
267c0 69 74 65 63 74 75 72 65 46 69 6c 65 73 29 5d 20  itectureFiles)] 
267d0 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  && \..          
267e0 20 20 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e            [strin
267f0 67 20 6c 65 6e 67 74 68 20 24 61 72 63 68 69 74  g length $archit
26800 65 63 74 75 72 65 5d 20 3e 20 30 7d 20 74 68 65  ecture] > 0} the
26810 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
26820 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
26830 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70  test_channel [ap
26840 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
26850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26860 20 20 22 2d 2d 2d 2d 20 63 6f 70 79 69 6e 67 20    "---- copying 
26870 5c 22 6d 69 78 65 64 5c 22 20 66 69 6c 65 73 20  \"mixed\" files 
26880 66 6f 72 20 61 72 63 68 69 74 65 63 74 75 72 65  for architecture
26890 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20 20 20   \"" \..        
268a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 24 61                $a
268b0 72 63 68 69 74 65 63 74 75 72 65 20 5c 22 2e 2e  rchitecture \"..
268c0 2e 5c 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  .\n]....        
268d0 20 20 20 20 20 20 20 20 20 20 66 6f 72 65 61 63            foreac
268e0 68 20 66 69 6c 65 4e 61 6d 65 20 24 6d 69 78 65  h fileName $mixe
268f0 64 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20  dFileNames {..  
26900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26910 20 20 74 72 79 43 6f 70 79 41 73 73 65 6d 62 6c    tryCopyAssembl
26920 79 20 24 66 69 6c 65 4e 61 6d 65 20 66 61 6c 73  y $fileName fals
26930 65 20 24 61 72 63 68 69 74 65 63 74 75 72 65 0d  e $architecture.
26940 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
26950 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
26960 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
26970 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
26980 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
26990 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66         if {![inf
269a0 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 63 6f  o exists ::no(co
269b0 70 79 53 71 6c 69 74 65 4d 61 6e 61 67 65 64 46  pySqliteManagedF
269c0 69 6c 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a  iles)]} then {..
269d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 70                tp
269e0 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  uts $::test_chan
269f0 6e 65 6c 20 22 2d 2d 2d 2d 20 63 6f 70 79 69 6e  nel "---- copyin
26a00 67 20 5c 22 6d 61 6e 61 67 65 64 5c 22 20 66 69  g \"managed\" fi
26a10 6c 65 73 2e 2e 2e 5c 6e 22 0d 0a 0d 0a 20 20 20  les...\n"....   
26a20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 65 61             forea
26a30 63 68 20 66 69 6c 65 4e 61 6d 65 20 24 6d 61 6e  ch fileName $man
26a40 61 67 65 64 46 69 6c 65 4e 61 6d 65 73 20 7b 0d  agedFileNames {.
26a50 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
26a60 20 74 72 79 43 6f 70 79 41 73 73 65 6d 62 6c 79   tryCopyAssembly
26a70 20 24 66 69 6c 65 4e 61 6d 65 20 74 72 75 65 0d   $fileName true.
26a80 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
26a90 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
26aa0 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  .          }....
26ab0 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
26ac0 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53         # NOTE: S
26ad0 6b 69 70 20 74 72 79 69 6e 67 20 74 6f 20 6c 6f  kip trying to lo
26ae0 61 64 20 61 6e 79 20 66 69 6c 65 73 20 69 66 20  ad any files if 
26af0 69 6e 73 74 72 75 63 74 65 64 2e 0d 0a 20 20 20  instructed...   
26b00 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
26b10 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65      if {![info e
26b20 78 69 73 74 73 20 3a 3a 6e 6f 28 6c 6f 61 64 53  xists ::no(loadS
26b30 71 6c 69 74 65 46 69 6c 65 73 29 5d 7d 20 74 68  qliteFiles)]} th
26b40 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
26b50 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69    if {![info exi
26b60 73 74 73 20 3a 3a 6e 6f 28 6c 6f 61 64 53 71 6c  sts ::no(loadSql
26b70 69 74 65 49 6d 70 6c 69 63 69 74 46 69 6c 65 73  iteImplicitFiles
26b80 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  )]} then {..    
26b90 20 20 20 20 20 20 20 20 20 20 74 72 79 4c 6f 61            tryLoa
26ba0 64 41 73 73 65 6d 62 6c 79 20 53 79 73 74 65 6d  dAssembly System
26bb0 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 64 6c 6c  .Data.SQLite.dll
26bc0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
26bd0 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ...            i
26be0 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73  f {![info exists
26bf0 20 3a 3a 6e 6f 28 6c 6f 61 64 53 71 6c 69 74 65   ::no(loadSqlite
26c00 4c 69 6e 71 46 69 6c 65 73 29 5d 7d 20 74 68 65  LinqFiles)]} the
26c10 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
26c20 20 20 20 74 72 79 4c 6f 61 64 41 73 73 65 6d 62     tryLoadAssemb
26c30 6c 79 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53  ly System.Data.S
26c40 51 4c 69 74 65 2e 4c 69 6e 71 2e 64 6c 6c 0d 0a  QLite.Linq.dll..
26c50 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d              }...
26c60 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20  .            if 
26c70 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a  {![info exists :
26c80 3a 6e 6f 28 6c 6f 61 64 53 71 6c 69 74 65 45 66  :no(loadSqliteEf
26c90 36 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e 20 7b  6Files)]} then {
26ca0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
26cb0 74 72 79 4c 6f 61 64 41 73 73 65 6d 62 6c 79 20  tryLoadAssembly 
26cc0 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
26cd0 74 65 2e 45 46 36 2e 64 6c 6c 0d 0a 20 20 20 20  te.EF6.dll..    
26ce0 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
26cf0 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69           if {![i
26d00 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28  nfo exists ::no(
26d10 6c 6f 61 64 53 71 6c 69 74 65 4e 6f 6e 49 6d 70  loadSqliteNonImp
26d20 6c 69 63 69 74 46 69 6c 65 73 29 5d 7d 20 74 68  licitFiles)]} th
26d30 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
26d40 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65      if {![info e
26d50 78 69 73 74 73 20 3a 3a 6e 6f 28 6c 6f 61 64 53  xists ::no(loadS
26d60 71 6c 69 74 65 50 6c 61 74 66 6f 72 6d 46 69 6c  qlitePlatformFil
26d70 65 73 29 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20  es)] && \..     
26d80 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 73 74               [st
26d90 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 70 6c 61  ring length $pla
26da0 74 66 6f 72 6d 5d 20 3e 20 30 7d 20 74 68 65 6e  tform] > 0} then
26db0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
26dc0 20 20 20 20 74 72 79 4c 6f 61 64 41 73 73 65 6d      tryLoadAssem
26dd0 62 6c 79 20 53 79 73 74 65 6d 2e 44 61 74 61 2e  bly System.Data.
26de0 53 51 4c 69 74 65 2e 64 6c 6c 20 24 70 6c 61 74  SQLite.dll $plat
26df0 66 6f 72 6d 0d 0a 20 20 20 20 20 20 20 20 20 20  form..          
26e00 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
26e10 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66         if {![inf
26e20 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 6c 6f  o exists ::no(lo
26e30 61 64 53 71 6c 69 74 65 41 72 63 68 69 74 65 63  adSqliteArchitec
26e40 74 75 72 65 46 69 6c 65 73 29 5d 20 26 26 20 5c  tureFiles)] && \
26e50 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
26e60 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67      [string leng
26e70 74 68 20 24 61 72 63 68 69 74 65 63 74 75 72 65  th $architecture
26e80 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20  ] > 0} then {.. 
26e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
26ea0 72 79 4c 6f 61 64 41 73 73 65 6d 62 6c 79 20 53  ryLoadAssembly S
26eb0 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
26ec0 65 2e 64 6c 6c 20 24 61 72 63 68 69 74 65 63 74  e.dll $architect
26ed0 75 72 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ure..           
26ee0 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
26ef0 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d    }..          }
26f00 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  ..        }.... 
26f10 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 66         foreach f
26f20 69 6c 65 4e 61 6d 65 4f 6e 6c 79 20 24 6e 61 74  ileNameOnly $nat
26f30 69 76 65 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a  iveFileNames {..
26f40 20 20 20 20 20 20 20 20 20 20 63 61 74 63 68 20            catch 
26f50 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  {..            t
26f60 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
26f70 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
26f80 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
26f90 20 20 20 20 22 2d 2d 2d 2d 20 66 69 6c 65 20 76      "---- file v
26fa0 65 72 73 69 6f 6e 20 6f 66 20 5c 22 22 20 24 66  ersion of \"" $f
26fb0 69 6c 65 4e 61 6d 65 4f 6e 6c 79 20 22 5c 22 2e  ileNameOnly "\".
26fc0 2e 2e 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20  .. \"" \..      
26fd0 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20            [file 
26fe0 76 65 72 73 69 6f 6e 20 5b 67 65 74 42 69 6e 61  version [getBina
26ff0 72 79 46 69 6c 65 4e 61 6d 65 20 24 66 69 6c 65  ryFileName $file
27000 4e 61 6d 65 4f 6e 6c 79 5d 5d 20 5c 22 5c 6e 5d  NameOnly]] \"\n]
27010 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20  ..          }.. 
27020 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
27030 20 20 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65      foreach file
27040 4e 61 6d 65 4f 6e 6c 79 20 24 6d 69 78 65 64 46  NameOnly $mixedF
27050 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20  ileNames {..    
27060 20 20 20 20 20 20 63 61 74 63 68 20 7b 0d 0a 20        catch {.. 
27070 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
27080 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
27090 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
270a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
270b0 22 2d 2d 2d 2d 20 66 69 6c 65 20 76 65 72 73 69  "---- file versi
270c0 6f 6e 20 6f 66 20 5c 22 22 20 24 66 69 6c 65 4e  on of \"" $fileN
270d0 61 6d 65 4f 6e 6c 79 20 22 5c 22 2e 2e 2e 20 5c  ameOnly "\"... \
270e0 22 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  "" \..          
270f0 20 20 20 20 20 20 5b 66 69 6c 65 20 76 65 72 73        [file vers
27100 69 6f 6e 20 5b 67 65 74 42 69 6e 61 72 79 46 69  ion [getBinaryFi
27110 6c 65 4e 61 6d 65 20 24 66 69 6c 65 4e 61 6d 65  leName $fileName
27120 4f 6e 6c 79 5d 5d 20 5c 22 5c 6e 5d 0d 0a 20 20  Only]] \"\n]..  
27130 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
27140 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
27150 66 6f 72 65 61 63 68 20 66 69 6c 65 4e 61 6d 65  foreach fileName
27160 4f 6e 6c 79 20 24 6d 61 6e 61 67 65 64 46 69 6c  Only $managedFil
27170 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20  eNames {..      
27180 20 20 20 20 63 61 74 63 68 20 7b 0d 0a 20 20 20      catch {..   
27190 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
271a0 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b  ::test_channel [
271b0 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
271c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d                "-
271d0 2d 2d 2d 20 66 69 6c 65 20 76 65 72 73 69 6f 6e  --- file version
271e0 20 6f 66 20 5c 22 22 20 24 66 69 6c 65 4e 61 6d   of \"" $fileNam
271f0 65 4f 6e 6c 79 20 22 5c 22 2e 2e 2e 20 5c 22 22  eOnly "\"... \""
27200 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
27210 20 20 20 20 5b 66 69 6c 65 20 76 65 72 73 69 6f      [file versio
27220 6e 20 5b 67 65 74 42 69 6e 61 72 79 46 69 6c 65  n [getBinaryFile
27230 4e 61 6d 65 20 24 66 69 6c 65 4e 61 6d 65 4f 6e  Name $fileNameOn
27240 6c 79 5d 5d 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20  ly]] \"\n]..    
27250 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
27260 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66   }....        if
27270 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68   {[string length
27280 20 24 70 6c 61 74 66 6f 72 6d 5d 20 3e 20 30 7d   $platform] > 0}
27290 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
272a0 20 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65 4e     foreach fileN
272b0 61 6d 65 4f 6e 6c 79 20 24 6e 61 74 69 76 65 46  ameOnly $nativeF
272c0 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20  ileNames {..    
272d0 20 20 20 20 20 20 20 20 63 61 74 63 68 20 7b 0d          catch {.
272e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74  .              t
272f0 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
27300 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
27310 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
27320 20 20 20 20 20 20 22 2d 2d 2d 2d 20 66 69 6c 65        "---- file
27330 20 76 65 72 73 69 6f 6e 20 6f 66 20 5c 22 22 20   version of \"" 
27340 24 70 6c 61 74 66 6f 72 6d 20 5c 0d 0a 20 20 20  $platform \..   
27350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
27360 20 24 66 69 6c 65 4e 61 6d 65 4f 6e 6c 79 20 22   $fileNameOnly "
27370 5c 22 2e 2e 2e 20 5c 22 22 20 5b 66 69 6c 65 20  \"... \"" [file 
27380 76 65 72 73 69 6f 6e 20 5c 0d 0a 20 20 20 20 20  version \..     
27390 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 67 65               [ge
273a0 74 42 69 6e 61 72 79 46 69 6c 65 4e 61 6d 65 20  tBinaryFileName 
273b0 24 66 69 6c 65 4e 61 6d 65 4f 6e 6c 79 20 24 70  $fileNameOnly $p
273c0 6c 61 74 66 6f 72 6d 5d 5d 20 5c 22 5c 6e 5d 0d  latform]] \"\n].
273d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  .            }..
273e0 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20            }.... 
273f0 20 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68           foreach
27400 20 66 69 6c 65 4e 61 6d 65 4f 6e 6c 79 20 24 6d   fileNameOnly $m
27410 69 78 65 64 46 69 6c 65 4e 61 6d 65 73 20 7b 0d  ixedFileNames {.
27420 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 61 74  .            cat
27430 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  ch {..          
27440 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
27450 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e  t_channel [appen
27460 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
27470 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
27480 20 66 69 6c 65 20 76 65 72 73 69 6f 6e 20 6f 66   file version of
27490 20 5c 22 22 20 24 70 6c 61 74 66 6f 72 6d 20 5c   \"" $platform \
274a0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
274b0 20 20 20 20 2f 20 24 66 69 6c 65 4e 61 6d 65 4f      / $fileNameO
274c0 6e 6c 79 20 22 5c 22 2e 2e 2e 20 5c 22 22 20 5b  nly "\"... \"" [
274d0 66 69 6c 65 20 76 65 72 73 69 6f 6e 20 5c 0d 0a  file version \..
274e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
274f0 20 20 5b 67 65 74 42 69 6e 61 72 79 46 69 6c 65    [getBinaryFile
27500 4e 61 6d 65 20 24 66 69 6c 65 4e 61 6d 65 4f 6e  Name $fileNameOn
27510 6c 79 20 24 70 6c 61 74 66 6f 72 6d 5d 5d 20 5c  ly $platform]] \
27520 22 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20  "\n]..          
27530 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d    }..          }
27540 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  ..        }.... 
27550 20 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69         if {[stri
27560 6e 67 20 6c 65 6e 67 74 68 20 24 61 72 63 68 69  ng length $archi
27570 74 65 63 74 75 72 65 5d 20 3e 20 30 7d 20 74 68  tecture] > 0} th
27580 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
27590 66 6f 72 65 61 63 68 20 66 69 6c 65 4e 61 6d 65  foreach fileName
275a0 4f 6e 6c 79 20 24 6e 61 74 69 76 65 46 69 6c 65  Only $nativeFile
275b0 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20 20  Names {..       
275c0 20 20 20 20 20 63 61 74 63 68 20 7b 0d 0a 20 20       catch {..  
275d0 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
275e0 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
275f0 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
27600 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
27610 20 20 20 22 2d 2d 2d 2d 20 66 69 6c 65 20 76 65     "---- file ve
27620 72 73 69 6f 6e 20 6f 66 20 5c 22 22 20 24 61 72  rsion of \"" $ar
27630 63 68 69 74 65 63 74 75 72 65 20 5c 0d 0a 20 20  chitecture \..  
27640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27650 2f 20 24 66 69 6c 65 4e 61 6d 65 4f 6e 6c 79 20  / $fileNameOnly 
27660 22 5c 22 2e 2e 2e 20 5c 22 22 20 5b 66 69 6c 65  "\"... \"" [file
27670 20 76 65 72 73 69 6f 6e 20 5c 0d 0a 20 20 20 20   version \..    
27680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 67                [g
27690 65 74 42 69 6e 61 72 79 46 69 6c 65 4e 61 6d 65  etBinaryFileName
276a0 20 24 66 69 6c 65 4e 61 6d 65 4f 6e 6c 79 20 24   $fileNameOnly $
276b0 61 72 63 68 69 74 65 63 74 75 72 65 5d 5d 20 5c  architecture]] \
276c0 22 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20  "\n]..          
276d0 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d    }..          }
276e0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 66 6f  ....          fo
276f0 72 65 61 63 68 20 66 69 6c 65 4e 61 6d 65 4f 6e  reach fileNameOn
27700 6c 79 20 24 6d 69 78 65 64 46 69 6c 65 4e 61 6d  ly $mixedFileNam
27710 65 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  es {..          
27720 20 20 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20    catch {..     
27730 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
27740 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b  ::test_channel [
27750 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
27760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27770 22 2d 2d 2d 2d 20 66 69 6c 65 20 76 65 72 73 69  "---- file versi
27780 6f 6e 20 6f 66 20 5c 22 22 20 24 61 72 63 68 69  on of \"" $archi
27790 74 65 63 74 75 72 65 20 5c 0d 0a 20 20 20 20 20  tecture \..     
277a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 20 24               / $
277b0 66 69 6c 65 4e 61 6d 65 4f 6e 6c 79 20 22 5c 22  fileNameOnly "\"
277c0 2e 2e 2e 20 5c 22 22 20 5b 66 69 6c 65 20 76 65  ... \"" [file ve
277d0 72 73 69 6f 6e 20 5c 0d 0a 20 20 20 20 20 20 20  rsion \..       
277e0 20 20 20 20 20 20 20 20 20 20 20 5b 67 65 74 42             [getB
277f0 69 6e 61 72 79 46 69 6c 65 4e 61 6d 65 20 24 66  inaryFileName $f
27800 69 6c 65 4e 61 6d 65 4f 6e 6c 79 20 24 61 72 63  ileNameOnly $arc
27810 68 69 74 65 63 74 75 72 65 5d 5d 20 5c 22 5c 6e  hitecture]] \"\n
27820 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  ]..            }
27830 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20  ..          }.. 
27840 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
27850 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
27860 20 4e 4f 54 45 3a 20 47 72 61 62 20 74 68 65 20   NOTE: Grab the 
27870 6c 69 73 74 20 6f 66 20 6d 61 6e 61 67 65 64 20  list of managed 
27880 61 73 73 65 6d 62 6c 69 65 73 20 66 6f 72 20 74  assemblies for t
27890 68 65 20 63 75 72 72 65 6e 74 20 70 72 6f 63 65  he current proce
278a0 73 73 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  ss..        #   
278b0 20 20 20 20 61 6e 64 20 72 65 70 6f 72 74 20 6f      and report o
278c0 6e 20 74 68 65 20 53 79 73 74 65 6d 2e 44 61 74  n the System.Dat
278d0 61 2e 53 51 4c 69 74 65 20 72 65 6c 61 74 65 64  a.SQLite related
278e0 20 6f 6e 65 73 2e 0d 0a 20 20 20 20 20 20 20 20   ones...        
278f0 23 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b  #..        if {[
27900 68 61 76 65 53 51 4c 69 74 65 4f 62 6a 65 63 74  haveSQLiteObject
27910 43 6f 6d 6d 61 6e 64 5d 7d 20 74 68 65 6e 20 7b  Command]} then {
27920 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20  ..          set 
27930 61 73 73 65 6d 62 6c 69 65 73 20 5b 6f 62 6a 65  assemblies [obje
27940 63 74 20 69 6e 76 6f 6b 65 20 41 70 70 44 6f 6d  ct invoke AppDom
27950 61 69 6e 2e 43 75 72 72 65 6e 74 44 6f 6d 61 69  ain.CurrentDomai
27960 6e 20 47 65 74 41 73 73 65 6d 62 6c 69 65 73 5d  n GetAssemblies]
27970 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 6f 62  ....          ob
27980 6a 65 63 74 20 66 6f 72 65 61 63 68 20 61 73 73  ject foreach ass
27990 65 6d 62 6c 79 20 24 61 73 73 65 6d 62 6c 69 65  embly $assemblie
279a0 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s {..           
279b0 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6d 61 74   if {[string mat
279c0 63 68 20 5c 7b 53 79 73 74 65 6d 2e 44 61 74 61  ch \{System.Data
279d0 2e 53 51 4c 69 74 65 2a 20 24 61 73 73 65 6d 62  .SQLite* $assemb
279e0 6c 79 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  ly]} then {..   
279f0 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
27a00 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
27a10 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
27a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27a30 20 20 22 2d 2d 2d 2d 20 66 6f 75 6e 64 20 6c 6f    "---- found lo
27a40 61 64 65 64 20 61 73 73 65 6d 62 6c 79 3a 20 22  aded assembly: "
27a50 20 24 61 73 73 65 6d 62 6c 79 20 5c 6e 5d 0d 0a   $assembly \n]..
27a60 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
27a70 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
27a80 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
27a90 20 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20   catch {..      
27aa0 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
27ab0 74 5f 63 68 61 6e 6e 65 6c 20 5c 0d 0a 20 20 20  t_channel \..   
27ac0 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
27ad0 20 64 65 66 69 6e 65 20 63 6f 6e 73 74 61 6e 74   define constant
27ae0 73 20 66 6f 72 20 5c 22 53 79 73 74 65 6d 2e 44  s for \"System.D
27af0 61 74 61 2e 53 51 4c 69 74 65 5c 22 2e 2e 2e 20  ata.SQLite\"... 
27b00 22 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 69  "....          i
27b10 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20  f {[catch {..   
27b20 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20           object 
27b30 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e  invoke -flags +N
27b40 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20  onPublic \..    
27b50 20 20 20 20 20 20 20 20 20 20 20 20 53 79 73 74              Syst
27b60 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 53  em.Data.SQLite.S
27b70 51 4c 69 74 65 33 20 44 65 66 69 6e 65 43 6f 6e  QLite3 DefineCon
27b80 73 74 61 6e 74 73 0d 0a 20 20 20 20 20 20 20 20  stants..        
27b90 20 20 7d 20 64 65 66 69 6e 65 43 6f 6e 73 74 61    } defineConsta
27ba0 6e 74 73 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20  nts] == 0} then 
27bb0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  {..            t
27bc0 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
27bd0 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
27be0 20 5b 66 6f 72 6d 61 74 4c 69 73 74 20 5b 6c 73   [formatList [ls
27bf0 6f 72 74 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ort \..         
27c00 20 20 20 20 20 20 20 24 64 65 66 69 6e 65 43 6f         $defineCo
27c10 6e 73 74 61 6e 74 73 5d 20 3c 6e 6f 6e 65 3e 5d  nstants] <none>]
27c20 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20   \n]..          
27c30 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
27c40 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
27c50 65 73 74 5f 63 68 61 6e 6e 65 6c 20 75 6e 6b 6e  est_channel unkn
27c60 6f 77 6e 5c 6e 0d 0a 20 20 20 20 20 20 20 20 20  own\n..         
27c70 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d   }..        }...
27c80 0a 20 20 20 20 20 20 20 20 63 61 74 63 68 20 7b  .        catch {
27c90 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70 75 74  ..          tput
27ca0 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
27cb0 6c 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  l \..           
27cc0 20 20 20 22 2d 2d 2d 2d 20 73 6f 75 72 63 65 20     "---- source 
27cd0 76 65 72 73 69 6f 6e 20 6f 66 20 5c 22 53 79 73  version of \"Sys
27ce0 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e  tem.Data.SQLite.
27cf0 64 6c 6c 5c 22 2e 2e 2e 20 22 0d 0a 0d 0a 20 20  dll\"... "....  
27d00 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74          if {[cat
27d10 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  ch {..          
27d20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20    object invoke 
27d30 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69  -flags +NonPubli
27d40 63 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  c \..           
27d50 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61       System.Data
27d60 2e 53 51 4c 69 74 65 2e 53 51 4c 69 74 65 43 6f  .SQLite.SQLiteCo
27d70 6e 6e 65 63 74 69 6f 6e 20 50 72 6f 76 69 64 65  nnection Provide
27d80 72 56 65 72 73 69 6f 6e 0d 0a 20 20 20 20 20 20  rVersion..      
27d90 20 20 20 20 7d 20 76 65 72 73 69 6f 6e 5d 20 3d      } version] =
27da0 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  = 0} then {..   
27db0 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73 74           if {[st
27dc0 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 76 65 72  ring length $ver
27dd0 73 69 6f 6e 5d 20 3d 3d 20 30 7d 20 74 68 65 6e  sion] == 0} then
27de0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
27df0 20 20 73 65 74 20 76 65 72 73 69 6f 6e 20 6e 75    set version nu
27e00 6c 6c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ll..            
27e10 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  }..            t
27e20 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
27e30 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
27e40 20 24 76 65 72 73 69 6f 6e 20 5c 6e 5d 0d 0a 20   $version \n].. 
27e50 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20           } else 
27e60 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  {..            t
27e70 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
27e80 6e 6e 65 6c 20 75 6e 6b 6e 6f 77 6e 5c 6e 0d 0a  nnel unknown\n..
27e90 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
27ea0 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
27eb0 20 20 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20    catch {..     
27ec0 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
27ed0 73 74 5f 63 68 61 6e 6e 65 6c 20 5c 0d 0a 20 20  st_channel \..  
27ee0 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
27ef0 2d 20 73 6f 75 72 63 65 20 63 68 65 63 6b 6f 75  - source checkou
27f00 74 20 6f 66 20 5c 22 53 79 73 74 65 6d 2e 44 61  t of \"System.Da
27f10 74 61 2e 53 51 4c 69 74 65 2e 64 6c 6c 5c 22 2e  ta.SQLite.dll\".
27f20 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 20 20 20 20  .. "....        
27f30 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a    if {[catch {..
27f40 20 20 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65              obje
27f50 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73  ct invoke -flags
27f60 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20   +NonPublic \.. 
27f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
27f80 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
27f90 65 2e 53 51 4c 69 74 65 43 6f 6e 6e 65 63 74 69  e.SQLiteConnecti
27fa0 6f 6e 20 50 72 6f 76 69 64 65 72 53 6f 75 72 63  on ProviderSourc
27fb0 65 49 64 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  eId..          }
27fc0 20 73 6f 75 72 63 65 49 64 5d 20 3d 3d 20 30 7d   sourceId] == 0}
27fd0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
27fe0 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67       if {[string
27ff0 20 6c 65 6e 67 74 68 20 24 73 6f 75 72 63 65 49   length $sourceI
28000 64 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d  d] == 0} then {.
28010 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
28020 65 74 20 73 6f 75 72 63 65 49 64 20 6e 75 6c 6c  et sourceId null
28030 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
28040 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75  .            tpu
28050 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
28060 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 24  el [appendArgs $
28070 73 6f 75 72 63 65 49 64 20 5c 6e 5d 0d 0a 20 20  sourceId \n]..  
28080 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b          } else {
28090 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70  ..            tp
280a0 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  uts $::test_chan
280b0 6e 65 6c 20 75 6e 6b 6e 6f 77 6e 5c 6e 0d 0a 20  nel unknown\n.. 
280c0 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
280d0 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
280e0 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
280f0 54 45 3a 20 43 68 65 63 6b 20 74 68 65 20 61 76  TE: Check the av
28100 61 69 6c 61 62 6c 65 20 62 75 69 6c 64 73 20 28  ailable builds (
28110 61 6e 64 20 22 72 65 6c 65 61 73 65 73 22 29 20  and "releases") 
28120 6f 66 20 53 51 4c 69 74 65 20 61 6e 64 0d 0a 20  of SQLite and.. 
28130 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 53         #       S
28140 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
28150 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  e...        #.. 
28160 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72 53         checkForS
28170 51 4c 69 74 65 42 75 69 6c 64 73 20 24 3a 3a 74  QLiteBuilds $::t
28180 65 73 74 5f 63 68 61 6e 6e 65 6c 0d 0a 20 20 20  est_channel..   
28190 20 20 20 20 20 63 68 65 63 6b 46 6f 72 53 51 4c       checkForSQL
281a0 69 74 65 52 65 6c 65 61 73 65 73 20 24 3a 3a 74  iteReleases $::t
281b0 65 73 74 5f 63 68 61 6e 6e 65 6c 0d 0a 0d 0a 20  est_channel.... 
281c0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
281d0 20 20 23 20 4e 4f 54 45 3a 20 4e 6f 77 2c 20 77    # NOTE: Now, w
281e0 65 20 6e 65 65 64 20 74 6f 20 6b 6e 6f 77 20 69  e need to know i
281f0 66 20 74 68 65 20 53 51 4c 69 74 65 20 63 6f 72  f the SQLite cor
28200 65 20 6c 69 62 72 61 72 79 20 69 73 20 61 76 61  e library is ava
28210 69 6c 61 62 6c 65 0d 0a 20 20 20 20 20 20 20 20  ilable..        
28220 23 20 20 20 20 20 20 20 28 69 2e 65 2e 20 62 65  #       (i.e. be
28230 63 61 75 73 65 20 74 68 65 20 6d 61 6e 61 67 65  cause the manage
28240 64 2d 6f 6e 6c 79 20 53 79 73 74 65 6d 2e 44 61  d-only System.Da
28250 74 61 2e 53 51 4c 69 74 65 20 61 73 73 65 6d 62  ta.SQLite assemb
28260 6c 79 20 63 61 6e 0d 0a 20 20 20 20 20 20 20 20  ly can..        
28270 23 20 20 20 20 20 20 20 6c 6f 61 64 20 77 69 74  #       load wit
28280 68 6f 75 74 20 69 74 3b 20 68 6f 77 65 76 65 72  hout it; however
28290 2c 20 69 74 20 63 61 6e 6e 6f 74 20 64 6f 20 61  , it cannot do a
282a0 6e 79 74 68 69 6e 67 20 75 73 65 66 75 6c 20 77  nything useful w
282b0 69 74 68 6f 75 74 0d 0a 20 20 20 20 20 20 20 20  ithout..        
282c0 23 20 20 20 20 20 20 20 69 74 29 2e 20 20 49 66  #       it).  If
282d0 20 77 65 20 61 72 65 20 75 73 69 6e 67 20 74 68   we are using th
282e0 65 20 6d 69 78 65 64 2d 6d 6f 64 65 20 61 73 73  e mixed-mode ass
282f0 65 6d 62 6c 79 20 61 6e 64 20 77 65 20 61 6c 72  embly and we alr
28300 65 61 64 79 0d 0a 20 20 20 20 20 20 20 20 23 20  eady..        # 
28310 20 20 20 20 20 20 66 6f 75 6e 64 20 69 74 20 28        found it (
28320 61 62 6f 76 65 29 2c 20 74 68 69 73 20 73 68 6f  above), this sho
28330 75 6c 64 20 61 6c 77 61 79 73 20 73 75 63 63 65  uld always succe
28340 65 64 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  ed...        #..
28350 20 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72          checkFor
28360 53 51 4c 69 74 65 4c 69 62 72 61 72 79 20 24 3a  SQLiteLibrary $:
28370 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 0d 0a 0d  :test_channel...
28380 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
28390 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68 65 63      # NOTE: Chec
283a0 6b 20 69 66 20 74 68 65 20 53 51 4c 69 74 65 20  k if the SQLite 
283b0 69 6e 74 65 72 6f 70 20 61 73 73 65 6d 62 6c 79  interop assembly
283c0 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2e 0d 0a   is available...
283d0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
283e0 20 20 20 63 68 65 63 6b 46 6f 72 53 51 4c 69 74     checkForSQLit
283f0 65 49 6e 74 65 72 6f 70 20 24 3a 3a 74 65 73 74  eInterop $::test
28400 5f 63 68 61 6e 6e 65 6c 0d 0a 0d 0a 20 20 20 20  _channel....    
28410 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
28420 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 74 68 65   NOTE: Check the
28430 20 53 51 4c 69 74 65 20 64 61 74 61 62 61 73 65   SQLite database
28440 20 61 6e 64 20 74 65 6d 70 6f 72 61 72 79 20 64   and temporary d
28450 69 72 65 63 74 6f 72 69 65 73 2e 0d 0a 20 20 20  irectories...   
28460 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
28470 63 68 65 63 6b 46 6f 72 53 51 4c 69 74 65 44 69  checkForSQLiteDi
28480 72 65 63 74 6f 72 69 65 73 20 24 3a 3a 74 65 73  rectories $::tes
28490 74 5f 63 68 61 6e 6e 65 6c 0d 0a 0d 0a 20 20 20  t_channel....   
284a0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
284b0 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74 20  # NOTE: Attempt 
284c0 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20  to determine if 
284d0 76 61 72 69 6f 75 73 20 63 6f 6d 70 69 6c 65 2d  various compile-
284e0 74 69 6d 65 20 6f 70 74 69 6f 6e 73 20 6e 65 65  time options nee
284f0 64 65 64 20 66 6f 72 0d 0a 20 20 20 20 20 20 20  ded for..       
28500 20 23 20 20 20 20 20 20 20 74 65 73 74 20 63 6f   #       test co
28510 6e 73 74 72 61 69 6e 74 73 20 77 65 72 65 20 65  nstraints were e
28520 6e 61 62 6c 65 64 20 66 6f 72 20 74 68 65 20 6d  nabled for the m
28530 61 6e 61 67 65 64 20 61 73 73 65 6d 62 6c 79 2e  anaged assembly.
28540 20 20 54 68 65 72 65 0d 0a 20 20 20 20 20 20 20    There..       
28550 20 23 20 20 20 20 20 20 20 61 72 65 20 73 6f 6d   #       are som
28560 65 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f  e compile-time o
28570 70 74 69 6f 6e 73 20 74 68 61 74 20 6d 75 73 74  ptions that must
28580 20 61 6c 73 6f 20 68 61 76 65 20 62 65 65 6e 20   also have been 
28590 65 6e 61 62 6c 65 64 0d 0a 20 20 20 20 20 20 20  enabled..       
285a0 20 23 20 20 20 20 20 20 20 66 6f 72 20 74 68 65   #       for the
285b0 20 69 6e 74 65 72 6f 70 20 61 73 73 65 6d 62 6c   interop assembl
285c0 79 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 62 65  y in order to be
285d0 20 65 66 66 65 63 74 69 76 65 2e 20 20 46 6f 72   effective.  For
285e0 20 74 68 6f 73 65 0d 0a 20 20 20 20 20 20 20 20   those..        
285f0 23 20 20 20 20 20 20 20 6f 70 74 69 6f 6e 73 2c  #       options,
28600 20 69 74 20 77 69 6c 6c 20 62 65 20 61 73 73 75   it will be assu
28610 6d 65 64 20 74 68 61 74 20 69 74 20 77 61 73 20  med that it was 
28620 65 6e 61 62 6c 65 64 20 66 6f 72 20 74 68 65 20  enabled for the 
28630 69 6e 74 65 72 6f 70 0d 0a 20 20 20 20 20 20 20  interop..       
28640 20 23 20 20 20 20 20 20 20 61 73 73 65 6d 62 6c   #       assembl
28650 79 20 69 66 20 69 74 20 77 61 73 20 65 6e 61 62  y if it was enab
28660 6c 65 64 20 66 6f 72 20 74 68 65 20 6d 61 6e 61  led for the mana
28670 67 65 64 20 61 73 73 65 6d 62 6c 79 2e 0d 0a 20  ged assembly... 
28680 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
28690 20 20 66 6f 72 65 61 63 68 20 64 65 66 69 6e 65    foreach define
286a0 43 6f 6e 73 74 61 6e 74 20 5b 6c 69 73 74 20 5c  Constant [list \
286b0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 43 48  ..            CH
286c0 45 43 4b 5f 53 54 41 54 45 20 43 4f 55 4e 54 5f  ECK_STATE COUNT_
286d0 48 41 4e 44 4c 45 20 44 45 42 55 47 20 49 4e 54  HANDLE DEBUG INT
286e0 45 52 4f 50 5f 43 4f 44 45 43 20 49 4e 54 45 52  EROP_CODEC INTER
286f0 4f 50 5f 44 45 42 55 47 20 5c 0d 0a 20 20 20 20  OP_DEBUG \..    
28700 20 20 20 20 20 20 20 20 49 4e 54 45 52 4f 50 5f          INTEROP_
28710 45 58 54 45 4e 53 49 4f 4e 5f 46 55 4e 43 54 49  EXTENSION_FUNCTI
28720 4f 4e 53 20 49 4e 54 45 52 4f 50 5f 46 54 53 35  ONS INTEROP_FTS5
28730 5f 45 58 54 45 4e 53 49 4f 4e 20 5c 0d 0a 20 20  _EXTENSION \..  
28740 20 20 20 20 20 20 20 20 20 20 49 4e 54 45 52 4f            INTERO
28750 50 5f 49 4e 43 4c 55 44 45 5f 43 45 52 4f 44 20  P_INCLUDE_CEROD 
28760 49 4e 54 45 52 4f 50 5f 49 4e 43 4c 55 44 45 5f  INTEROP_INCLUDE_
28770 45 58 54 52 41 20 49 4e 54 45 52 4f 50 5f 49 4e  EXTRA INTEROP_IN
28780 43 4c 55 44 45 5f 53 45 45 20 5c 0d 0a 20 20 20  CLUDE_SEE \..   
28790 20 20 20 20 20 20 20 20 20 49 4e 54 45 52 4f 50           INTEROP
287a0 5f 49 4e 43 4c 55 44 45 5f 5a 49 50 56 46 53 20  _INCLUDE_ZIPVFS 
287b0 49 4e 54 45 52 4f 50 5f 4a 53 4f 4e 31 5f 45 58  INTEROP_JSON1_EX
287c0 54 45 4e 53 49 4f 4e 20 5c 0d 0a 20 20 20 20 20  TENSION \..     
287d0 20 20 20 20 20 20 20 49 4e 54 45 52 4f 50 5f 4c         INTEROP_L
287e0 45 47 41 43 59 5f 43 4c 4f 53 45 20 49 4e 54 45  EGACY_CLOSE INTE
287f0 52 4f 50 5f 4c 4f 47 20 49 4e 54 45 52 4f 50 5f  ROP_LOG INTEROP_
28800 50 45 52 43 45 4e 54 49 4c 45 5f 45 58 54 45 4e  PERCENTILE_EXTEN
28810 53 49 4f 4e 20 5c 0d 0a 20 20 20 20 20 20 20 20  SION \..        
28820 20 20 20 20 49 4e 54 45 52 4f 50 5f 52 45 47 45      INTEROP_REGE
28830 58 50 5f 45 58 54 45 4e 53 49 4f 4e 20 49 4e 54  XP_EXTENSION INT
28840 45 52 4f 50 5f 53 45 53 53 49 4f 4e 5f 45 58 54  EROP_SESSION_EXT
28850 45 4e 53 49 4f 4e 20 5c 0d 0a 20 20 20 20 20 20  ENSION \..      
28860 20 20 20 20 20 20 49 4e 54 45 52 4f 50 5f 53 48        INTEROP_SH
28870 41 31 5f 45 58 54 45 4e 53 49 4f 4e 20 49 4e 54  A1_EXTENSION INT
28880 45 52 4f 50 5f 54 45 53 54 5f 45 58 54 45 4e 53  EROP_TEST_EXTENS
28890 49 4f 4e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ION \..         
288a0 20 20 20 49 4e 54 45 52 4f 50 5f 54 4f 54 59 50     INTEROP_TOTYP
288b0 45 5f 45 58 54 45 4e 53 49 4f 4e 20 49 4e 54 45  E_EXTENSION INTE
288c0 52 4f 50 5f 56 49 52 54 55 41 4c 5f 54 41 42 4c  ROP_VIRTUAL_TABL
288d0 45 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  E \..           
288e0 20 4e 45 54 5f 32 30 20 4e 45 54 5f 33 35 20 4e   NET_20 NET_35 N
288f0 45 54 5f 34 30 20 4e 45 54 5f 34 35 20 4e 45 54  ET_40 NET_45 NET
28900 5f 34 35 31 20 4e 45 54 5f 34 35 32 20 4e 45 54  _451 NET_452 NET
28910 5f 34 36 20 4e 45 54 5f 34 36 31 20 5c 0d 0a 20  _46 NET_461 \.. 
28920 20 20 20 20 20 20 20 20 20 20 20 4e 45 54 5f 34             NET_4
28930 36 32 20 4e 45 54 5f 34 37 20 4e 45 54 5f 34 37  62 NET_47 NET_47
28940 31 20 4e 45 54 5f 43 4f 4d 50 41 43 54 5f 32 30  1 NET_COMPACT_20
28950 20 50 4c 41 54 46 4f 52 4d 5f 43 4f 4d 50 41 43   PLATFORM_COMPAC
28960 54 46 52 41 4d 45 57 4f 52 4b 20 5c 0d 0a 20 20  TFRAMEWORK \..  
28970 20 20 20 20 20 20 20 20 20 20 50 52 45 4c 4f 41            PRELOA
28980 44 5f 4e 41 54 49 56 45 5f 4c 49 42 52 41 52 59  D_NATIVE_LIBRARY
28990 20 52 45 54 41 52 47 45 54 41 42 4c 45 20 53 51   RETARGETABLE SQ
289a0 4c 49 54 45 5f 53 54 41 4e 44 41 52 44 20 5c 0d  LITE_STANDARD \.
289b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 54 48 52  .            THR
289c0 4f 57 5f 4f 4e 5f 44 49 53 50 4f 53 45 44 20 54  OW_ON_DISPOSED T
289d0 52 41 43 45 20 54 52 41 43 45 5f 43 4f 4e 4e 45  RACE TRACE_CONNE
289e0 43 54 49 4f 4e 20 54 52 41 43 45 5f 44 45 54 45  CTION TRACE_DETE
289f0 43 54 49 4f 4e 20 5c 0d 0a 20 20 20 20 20 20 20  CTION \..       
28a00 20 20 20 20 20 54 52 41 43 45 5f 48 41 4e 44 4c       TRACE_HANDL
28a10 45 20 54 52 41 43 45 5f 50 52 45 4c 4f 41 44 20  E TRACE_PRELOAD 
28a20 54 52 41 43 45 5f 53 48 41 52 45 44 20 54 52 41  TRACE_SHARED TRA
28a30 43 45 5f 53 54 41 54 45 4d 45 4e 54 20 5c 0d 0a  CE_STATEMENT \..
28a40 20 20 20 20 20 20 20 20 20 20 20 20 54 52 41 43              TRAC
28a50 45 5f 57 41 52 4e 49 4e 47 20 54 52 41 43 4b 5f  E_WARNING TRACK_
28a60 4d 45 4d 4f 52 59 5f 42 59 54 45 53 20 55 53 45  MEMORY_BYTES USE
28a70 5f 45 4e 54 49 54 59 5f 46 52 41 4d 45 57 4f 52  _ENTITY_FRAMEWOR
28a80 4b 5f 36 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  K_6 \..         
28a90 20 20 20 55 53 45 5f 49 4e 54 45 52 4f 50 5f 44     USE_INTEROP_D
28aa0 4c 4c 20 55 53 45 5f 50 52 45 50 41 52 45 5f 56  LL USE_PREPARE_V
28ab0 32 20 57 49 4e 44 4f 57 53 5d 20 7b 0d 0a 20 20  2 WINDOWS] {..  
28ac0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
28ad0 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68 65       # NOTE: Che
28ae0 63 6b 20 69 66 20 74 68 65 20 63 6f 6d 70 69 6c  ck if the compil
28af0 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 20 69 73  e-time option is
28b00 20 6c 69 73 74 65 64 20 69 6e 20 74 68 65 20 6c   listed in the l
28b10 69 73 74 20 6f 66 0d 0a 20 20 20 20 20 20 20 20  ist of..        
28b20 20 20 23 20 20 20 20 20 20 20 22 64 65 66 69 6e    #       "defin
28b30 65 20 63 6f 6e 73 74 61 6e 74 73 22 20 6b 65 70  e constants" kep
28b40 74 20 74 72 61 63 6b 20 6f 66 20 62 79 20 74 68  t track of by th
28b50 65 20 6d 61 6e 61 67 65 64 20 61 73 73 65 6d 62  e managed assemb
28b60 6c 79 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23  ly...          #
28b70 0d 0a 20 20 20 20 20 20 20 20 20 20 63 68 65 63  ..          chec
28b80 6b 46 6f 72 53 51 4c 69 74 65 44 65 66 69 6e 65  kForSQLiteDefine
28b90 43 6f 6e 73 74 61 6e 74 20 24 3a 3a 74 65 73 74  Constant $::test
28ba0 5f 63 68 61 6e 6e 65 6c 20 24 64 65 66 69 6e 65  _channel $define
28bb0 43 6f 6e 73 74 61 6e 74 0d 0a 20 20 20 20 20 20  Constant..      
28bc0 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23    }....        #
28bd0 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
28be0 3a 20 43 68 65 63 6b 20 69 66 20 74 68 65 20 53  : Check if the S
28bf0 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
28c00 65 20 70 72 6f 76 69 64 65 72 20 77 61 73 20 63  e provider was c
28c10 6f 6d 70 69 6c 65 64 20 77 69 74 68 0d 0a 20 20  ompiled with..  
28c20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 73 75        #       su
28c30 70 70 6f 72 74 20 66 6f 72 20 61 6e 79 20 65 6e  pport for any en
28c40 63 72 79 70 74 65 64 20 64 61 74 61 62 61 73 65  crypted database
28c50 73 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  s...        #.. 
28c60 20 20 20 20 20 20 20 69 66 20 7b 5b 68 61 76 65         if {[have
28c70 53 51 4c 69 74 65 44 65 66 69 6e 65 43 6f 6e 73  SQLiteDefineCons
28c80 74 61 6e 74 20 49 4e 54 45 52 4f 50 5f 43 4f 44  tant INTEROP_COD
28c90 45 43 5d 20 7c 7c 20 5c 0d 0a 20 20 20 20 20 20  EC] || \..      
28ca0 20 20 20 20 20 20 5b 68 61 76 65 53 51 4c 69 74        [haveSQLit
28cb0 65 44 65 66 69 6e 65 43 6f 6e 73 74 61 6e 74 20  eDefineConstant 
28cc0 49 4e 54 45 52 4f 50 5f 49 4e 43 4c 55 44 45 5f  INTEROP_INCLUDE_
28cd0 53 45 45 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  SEE]} then {..  
28ce0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
28cf0 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 59 65 73       # NOTE: Yes
28d00 2c 20 61 64 64 20 67 65 6e 65 72 69 63 20 63 6f  , add generic co
28d10 6e 73 74 72 61 69 6e 74 20 66 6f 72 20 75 73 65  nstraint for use
28d20 20 62 79 20 74 68 65 20 74 65 73 74 20 73 75 69   by the test sui
28d30 74 65 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23  te...          #
28d40 0d 0a 20 20 20 20 20 20 20 20 20 20 61 64 64 43  ..          addC
28d50 6f 6e 73 74 72 61 69 6e 74 20 53 79 73 74 65 6d  onstraint System
28d60 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 45 6e 63  .Data.SQLite.Enc
28d70 72 79 70 74 69 6f 6e 0d 0a 20 20 20 20 20 20 20  ryption..       
28d80 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d   }....        #.
28d90 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
28da0 20 43 68 65 63 6b 20 74 68 65 20 63 75 72 72 65   Check the curre
28db0 6e 74 20 62 75 69 6c 64 20 79 65 61 72 2e 20 20  nt build year.  
28dc0 42 61 73 69 63 61 6c 6c 79 2c 20 74 68 69 73 20  Basically, this 
28dd0 69 6e 64 69 63 61 74 65 73 0d 0a 20 20 20 20 20  indicates..     
28de0 20 20 20 23 20 20 20 20 20 20 20 77 68 69 63 68     #       which
28df0 20 76 65 72 73 69 6f 6e 20 6f 66 20 4d 53 42 75   version of MSBu
28e00 69 6c 64 20 61 6e 64 2f 6f 72 20 56 69 73 75 61  ild and/or Visua
28e10 6c 20 53 74 75 64 69 6f 20 77 61 73 20 75 73 65  l Studio was use
28e20 64 20 74 6f 0d 0a 20 20 20 20 20 20 20 20 23 20  d to..        # 
28e30 20 20 20 20 20 20 63 6f 6d 70 69 6c 65 20 74 68        compile th
28e40 65 20 61 73 73 65 6d 62 6c 79 20 62 69 6e 61 72  e assembly binar
28e50 69 65 73 20 75 6e 64 65 72 20 74 65 73 74 2e 0d  ies under test..
28e60 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
28e70 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
28e80 74 5f 63 68 61 6e 6e 65 6c 20 5c 0d 0a 20 20 20  t_channel \..   
28e90 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63           "---- c
28ea0 68 65 63 6b 69 6e 67 20 66 6f 72 20 53 79 73 74  hecking for Syst
28eb0 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 20 62  em.Data.SQLite b
28ec0 75 69 6c 64 20 79 65 61 72 2e 2e 2e 20 22 0d 0a  uild year... "..
28ed0 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 79 65  ..        set ye
28ee0 61 72 20 5b 67 65 74 42 75 69 6c 64 59 65 61 72  ar [getBuildYear
28ef0 5d 0d 0a 20 20 20 20 20 20 20 20 61 64 64 43 6f  ]..        addCo
28f00 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64  nstraint [append
28f10 41 72 67 73 20 62 75 69 6c 64 59 65 61 72 2e 20  Args buildYear. 
28f20 24 79 65 61 72 5d 0d 0a 20 20 20 20 20 20 20 20  $year]..        
28f30 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
28f40 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
28f50 73 20 5c 22 20 24 79 65 61 72 20 5c 22 5c 6e 5d  s \" $year \"\n]
28f60 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  ....        #.. 
28f70 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43         # NOTE: C
28f80 68 65 63 6b 20 74 68 65 20 63 75 72 72 65 6e 74  heck the current
28f90 20 62 75 69 6c 64 20 2e 4e 45 54 20 46 72 61 6d   build .NET Fram
28fa0 65 77 6f 72 6b 2e 20 20 42 61 73 69 63 61 6c 6c  ework.  Basicall
28fb0 79 2c 20 74 68 69 73 0d 0a 20 20 20 20 20 20 20  y, this..       
28fc0 20 23 20 20 20 20 20 20 20 69 6e 64 69 63 61 74   #       indicat
28fd0 65 73 20 77 68 69 63 68 20 76 65 72 73 69 6f 6e  es which version
28fe0 20 6f 66 20 74 68 65 20 2e 4e 45 54 20 46 72 61   of the .NET Fra
28ff0 6d 65 77 6f 72 6b 20 69 73 20 62 65 69 6e 67 0d  mework is being.
29000 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
29010 20 75 73 65 64 20 62 79 20 74 68 65 20 61 73 73   used by the ass
29020 65 6d 62 6c 79 20 62 69 6e 61 72 69 65 73 20 75  embly binaries u
29030 6e 64 65 72 20 74 65 73 74 2e 0d 0a 20 20 20 20  nder test...    
29040 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 74      #..        t
29050 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
29060 6e 6e 65 6c 20 5c 0d 0a 20 20 20 20 20 20 20 20  nnel \..        
29070 20 20 20 20 22 2d 2d 2d 2d 20 63 68 65 63 6b 69      "---- checki
29080 6e 67 20 66 6f 72 20 53 79 73 74 65 6d 2e 44 61  ng for System.Da
29090 74 61 2e 53 51 4c 69 74 65 20 62 75 69 6c 64 20  ta.SQLite build 
290a0 2e 4e 45 54 20 46 72 61 6d 65 77 6f 72 6b 2e 2e  .NET Framework..
290b0 2e 20 22 0d 0a 0d 0a 20 20 20 20 20 20 20 20 73  . "....        s
290c0 65 74 20 6e 65 74 46 78 20 5b 67 65 74 42 75 69  et netFx [getBui
290d0 6c 64 4e 65 74 46 78 5d 0d 0a 20 20 20 20 20 20  ldNetFx]..      
290e0 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20    addConstraint 
290f0 5b 61 70 70 65 6e 64 41 72 67 73 20 62 75 69 6c  [appendArgs buil
29100 64 46 72 61 6d 65 77 6f 72 6b 2e 20 24 6e 65 74  dFramework. $net
29110 46 78 5d 0d 0a 20 20 20 20 20 20 20 20 74 70 75  Fx]..        tpu
29120 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
29130 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
29140 22 20 24 6e 65 74 46 78 20 5c 22 5c 6e 5d 0d 0a  " $netFx \"\n]..
29150 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
29160 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68 65       # NOTE: Che
29170 63 6b 20 74 68 65 20 63 75 72 72 65 6e 74 20 62  ck the current b
29180 75 69 6c 64 20 63 6f 6e 66 69 67 75 72 61 74 69  uild configurati
29190 6f 6e 2e 20 20 54 68 69 73 20 73 68 6f 75 6c 64  on.  This should
291a0 20 6e 6f 72 6d 61 6c 6c 79 0d 0a 20 20 20 20 20   normally..     
291b0 20 20 20 23 20 20 20 20 20 20 20 62 65 20 65 69     #       be ei
291c0 74 68 65 72 20 22 44 65 62 75 67 22 20 6f 72 20  ther "Debug" or 
291d0 22 52 65 6c 65 61 73 65 22 2e 0d 0a 20 20 20 20  "Release"...    
291e0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 74      #..        t
291f0 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
29200 6e 6e 65 6c 20 5c 0d 0a 20 20 20 20 20 20 20 20  nnel \..        
29210 20 20 20 20 22 2d 2d 2d 2d 20 63 68 65 63 6b 69      "---- checki
29220 6e 67 20 66 6f 72 20 53 79 73 74 65 6d 2e 44 61  ng for System.Da
29230 74 61 2e 53 51 4c 69 74 65 20 62 75 69 6c 64 20  ta.SQLite build 
29240 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e 2e 2e  configuration...
29250 20 22 0d 0a 0d 0a 20 20 20 20 20 20 20 20 73 65   "....        se
29260 74 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  t configuration 
29270 5b 67 65 74 42 75 69 6c 64 43 6f 6e 66 69 67 75  [getBuildConfigu
29280 72 61 74 69 6f 6e 5d 0d 0a 20 20 20 20 20 20 20  ration]..       
29290 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 5b   addConstraint [
292a0 61 70 70 65 6e 64 41 72 67 73 20 62 75 69 6c 64  appendArgs build
292b0 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e 20 24  Configuration. $
292c0 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 5d 0d 0a  configuration]..
292d0 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
292e0 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61  :test_channel [a
292f0 70 70 65 6e 64 41 72 67 73 20 5c 22 20 24 63 6f  ppendArgs \" $co
29300 6e 66 69 67 75 72 61 74 69 6f 6e 20 5c 22 5c 6e  nfiguration \"\n
29310 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  ]....        #..
29320 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
29330 54 72 79 20 74 6f 20 73 65 74 75 70 20 61 6e 20  Try to setup an 
29340 69 6e 74 65 72 72 75 70 74 20 63 61 6c 6c 62 61  interrupt callba
29350 63 6b 20 75 73 69 6e 67 20 74 68 65 20 73 63 72  ck using the scr
29360 69 70 74 20 64 65 62 75 67 67 65 72 0d 0a 20 20  ipt debugger..  
29370 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68        #       th
29380 61 74 20 77 69 6c 6c 20 63 61 6e 63 65 6c 20 61  at will cancel a
29390 6c 6c 20 53 51 4c 20 71 75 65 72 69 65 73 20 69  ll SQL queries i
293a0 6e 20 70 72 6f 67 72 65 73 73 20 66 6f 72 20 61  n progress for a
293b0 6c 6c 20 64 61 74 61 62 61 73 65 0d 0a 20 20 20  ll database..   
293c0 20 20 20 20 20 23 20 20 20 20 20 20 20 63 6f 6e       #       con
293d0 6e 65 63 74 69 6f 6e 73 20 6b 6e 6f 77 6e 20 74  nections known t
293e0 6f 20 74 68 69 73 20 69 6e 74 65 72 70 72 65 74  o this interpret
293f0 65 72 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  er...        #..
29400 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e          if {![in
29410 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 73  fo exists ::no(s
29420 71 6c 69 74 65 49 6e 74 65 72 72 75 70 74 43 61  qliteInterruptCa
29430 6c 6c 62 61 63 6b 29 5d 7d 20 74 68 65 6e 20 7b  llback)]} then {
29440 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 75  ..          setu
29450 70 44 62 49 6e 74 65 72 72 75 70 74 43 61 6c 6c  pDbInterruptCall
29460 62 61 63 6b 20 24 3a 3a 74 65 73 74 5f 63 68 61  back $::test_cha
29470 6e 6e 65 6c 20 24 3a 3a 74 65 73 74 5f 6c 6f 67  nnel $::test_log
29480 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  ..        }.... 
29490 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
294a0 20 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20    # NOTE: Check 
294b0 66 6f 72 20 74 68 65 20 6e 61 74 69 76 65 20 72  for the native r
294c0 75 6e 74 69 6d 65 20 6f 70 74 69 6f 6e 2c 20 77  untime option, w
294d0 68 69 63 68 20 77 6f 75 6c 64 20 6d 65 61 6e 20  hich would mean 
294e0 77 65 20 61 72 65 0d 0a 20 20 20 20 20 20 20 20  we are..        
294f0 23 20 20 20 20 20 20 20 75 73 69 6e 67 20 74 68  #       using th
29500 65 20 6d 69 78 65 64 2d 6d 6f 64 65 20 61 73 73  e mixed-mode ass
29510 65 6d 62 6c 79 2e 0d 0a 20 20 20 20 20 20 20 20  embly...        
29520 23 0d 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b  #..        check
29530 46 6f 72 52 75 6e 74 69 6d 65 4f 70 74 69 6f 6e  ForRuntimeOption
29540 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
29550 20 6e 61 74 69 76 65 0d 0a 0d 0a 20 20 20 20 20   native....     
29560 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
29570 4e 4f 54 45 3a 20 43 68 65 63 6b 20 69 66 20 74  NOTE: Check if t
29580 68 65 20 74 65 73 74 20 73 75 69 74 65 20 73 68  he test suite sh
29590 6f 75 6c 64 20 63 6f 75 6e 74 20 74 68 65 20 6e  ould count the n
295a0 75 6d 62 65 72 20 6f 66 20 63 6f 6e 6e 65 63 74  umber of connect
295b0 69 6f 6e 73 0d 0a 20 20 20 20 20 20 20 20 23 20  ions..        # 
295c0 20 20 20 20 20 20 22 6f 70 65 6e 65 64 22 20 61        "opened" a
295d0 6e 64 20 22 63 6c 6f 73 65 64 22 20 66 72 6f 6d  nd "closed" from
295e0 20 74 68 65 20 70 6f 6f 6c 20 77 68 65 6e 20 64   the pool when d
295f0 65 74 65 72 6d 69 6e 69 6e 67 20 69 66 20 61 20  etermining if a 
29600 74 65 73 74 0d 0a 20 20 20 20 20 20 20 20 23 20  test..        # 
29610 20 20 20 20 20 20 70 61 73 73 65 64 2e 20 20 44        passed.  D
29620 69 73 61 62 6c 69 6e 67 20 74 68 69 73 20 62 65  isabling this be
29630 68 61 76 69 6f 72 20 69 73 20 73 6f 6d 65 74 69  havior is someti
29640 6d 65 73 20 6e 65 63 65 73 73 61 72 79 20 28 65  mes necessary (e
29650 2e 67 2e 0d 0a 20 20 20 20 20 20 20 20 23 20 20  .g...        #  
29660 20 20 20 20 20 64 75 72 69 6e 67 20 74 68 65 20       during the 
29670 72 65 6c 65 61 73 65 20 74 65 73 74 69 6e 67 20  release testing 
29680 70 72 6f 63 65 73 73 29 20 62 65 63 61 75 73 65  process) because
29690 20 74 68 65 72 65 20 61 72 65 20 73 65 76 65 72   there are sever
296a0 61 6c 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  al..        #   
296b0 20 20 20 20 74 65 73 74 73 20 74 68 61 74 20 72      tests that r
296c0 65 6c 79 20 6f 6e 20 74 68 65 20 22 6f 70 65 6e  ely on the "open
296d0 65 64 20 66 72 6f 6d 20 70 6f 6f 6c 22 20 63 6f  ed from pool" co
296e0 75 6e 74 20 62 65 69 6e 67 20 67 72 65 61 74 65  unt being greate
296f0 72 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  r..        #    
29700 20 20 20 74 68 61 6e 20 7a 65 72 6f 2e 20 20 54     than zero.  T
29710 68 65 73 65 20 74 65 73 74 73 20 6d 61 79 20 66  hese tests may f
29720 61 69 6c 20 64 75 65 20 74 6f 20 74 68 65 20 6e  ail due to the n
29730 6f 6e 2d 64 65 74 65 72 6d 69 6e 69 73 74 69 63  on-deterministic
29740 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
29750 20 20 62 65 68 61 76 69 6f 72 20 6f 66 20 74 68    behavior of th
29760 65 20 43 4c 52 20 47 43 2c 20 65 76 65 6e 20 77  e CLR GC, even w
29770 68 65 6e 20 74 68 65 72 65 20 69 73 20 6e 6f 20  hen there is no 
29780 62 75 67 20 69 6e 20 74 68 65 20 63 6f 64 65 0d  bug in the code.
29790 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
297a0 20 62 65 69 6e 67 20 74 65 73 74 65 64 2e 0d 0a   being tested...
297b0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
297c0 20 20 20 63 68 65 63 6b 46 6f 72 52 75 6e 74 69     checkForRunti
297d0 6d 65 4f 70 74 69 6f 6e 20 24 3a 3a 74 65 73 74  meOption $::test
297e0 5f 63 68 61 6e 6e 65 6c 20 6e 6f 50 6f 6f 6c 43  _channel noPoolC
297f0 6f 75 6e 74 73 0d 0a 0d 0a 20 20 20 20 20 20 20  ounts....       
29800 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
29810 54 45 3a 20 43 68 65 63 6b 20 69 66 20 74 68 65  TE: Check if the
29820 20 74 65 73 74 20 73 75 69 74 65 20 73 68 6f 75   test suite shou
29830 6c 64 20 75 73 65 20 73 68 61 72 65 64 2d 63 61  ld use shared-ca
29840 63 68 65 20 6d 6f 64 65 2e 0d 0a 20 20 20 20 20  che mode...     
29850 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 63 68     #..        ch
29860 65 63 6b 46 6f 72 52 75 6e 74 69 6d 65 4f 70 74  eckForRuntimeOpt
29870 69 6f 6e 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  ion $::test_chan
29880 6e 65 6c 20 73 68 61 72 65 64 43 61 63 68 65 0d  nel sharedCache.
29890 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
298a0 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 52 65        # NOTE: Re
298b0 70 6f 72 74 20 74 68 65 20 72 65 73 6f 75 72 63  port the resourc
298c0 65 20 75 73 61 67 65 20 70 72 69 6f 72 20 74 6f  e usage prior to
298d0 20 72 75 6e 6e 69 6e 67 20 61 6e 79 20 74 65 73   running any tes
298e0 74 73 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  ts...        #..
298f0 20 20 20 20 20 20 20 20 72 65 70 6f 72 74 53 51          reportSQ
29900 4c 69 74 65 52 65 73 6f 75 72 63 65 73 20 24 3a  LiteResources $:
29910 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 0d 0a 0d  :test_channel...
29920 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
29930 20 20 20 20 23 20 4e 4f 54 45 3a 20 47 72 61 62      # NOTE: Grab
29940 20 74 68 65 20 6c 69 73 74 20 6f 66 20 6e 61 74   the list of nat
29950 69 76 65 20 6d 6f 64 75 6c 65 73 20 66 6f 72 20  ive modules for 
29960 74 68 65 20 63 75 72 72 65 6e 74 20 70 72 6f 63  the current proc
29970 65 73 73 20 61 6e 64 0d 0a 20 20 20 20 20 20 20  ess and..       
29980 20 23 20 20 20 20 20 20 20 72 65 70 6f 72 74 20   #       report 
29990 6f 6e 20 74 68 65 20 53 79 73 74 65 6d 2e 44 61  on the System.Da
299a0 74 61 2e 53 51 4c 69 74 65 20 72 65 6c 61 74 65  ta.SQLite relate
299b0 64 20 6f 6e 65 73 2e 0d 0a 20 20 20 20 20 20 20  d ones...       
299c0 20 23 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b   #..        if {
299d0 5b 68 61 76 65 53 51 4c 69 74 65 4f 62 6a 65 63  [haveSQLiteObjec
299e0 74 43 6f 6d 6d 61 6e 64 5d 7d 20 74 68 65 6e 20  tCommand]} then 
299f0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74  {..          set
29a00 20 6d 6f 64 75 6c 65 73 20 5b 6f 62 6a 65 63 74   modules [object
29a10 20 69 6e 76 6f 6b 65 20 5c 0d 0a 20 20 20 20 20   invoke \..     
29a20 20 20 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e           System.
29a30 44 69 61 67 6e 6f 73 74 69 63 73 2e 50 72 6f 63  Diagnostics.Proc
29a40 65 73 73 2e 47 65 74 43 75 72 72 65 6e 74 50 72  ess.GetCurrentPr
29a50 6f 63 65 73 73 20 4d 6f 64 75 6c 65 73 5d 0d 0a  ocess Modules]..
29a60 0d 0a 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65  ..          obje
29a70 63 74 20 66 6f 72 65 61 63 68 20 2d 61 6c 69 61  ct foreach -alia
29a80 73 20 6d 6f 64 75 6c 65 20 24 6d 6f 64 75 6c 65  s module $module
29a90 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s {..           
29aa0 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   #..            
29ab0 23 20 4e 4f 54 45 3a 20 54 68 65 20 6d 6f 64 75  # NOTE: The modu
29ac0 6c 65 20 66 69 6c 65 20 6e 61 6d 65 20 68 65 72  le file name her
29ad0 65 20 6d 75 73 74 20 62 65 20 6e 6f 72 6d 61 6c  e must be normal
29ae0 69 7a 65 64 2e 0d 0a 20 20 20 20 20 20 20 20 20  ized...         
29af0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
29b00 20 20 73 65 74 20 66 69 6c 65 4e 61 6d 65 20 5b    set fileName [
29b10 66 69 6c 65 20 6e 6f 72 6d 61 6c 69 7a 65 20 5b  file normalize [
29b20 24 6d 6f 64 75 6c 65 20 46 69 6c 65 4e 61 6d 65  $module FileName
29b30 5d 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ]]..            
29b40 73 65 74 20 66 69 6c 65 4e 61 6d 65 4f 6e 6c 79  set fileNameOnly
29b50 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 66 69 6c   [file tail $fil
29b60 65 4e 61 6d 65 5d 0d 0a 0d 0a 20 20 20 20 20 20  eName]....      
29b70 20 20 20 20 20 20 69 66 20 7b 5b 6c 73 65 61 72        if {[lsear
29b80 63 68 20 2d 65 78 61 63 74 20 2d 6e 6f 63 61 73  ch -exact -nocas
29b90 65 20 2d 2d 20 5c 0d 0a 20 20 20 20 20 20 20 20  e -- \..        
29ba0 20 20 20 20 20 20 20 20 5b 67 65 74 4e 61 74 69          [getNati
29bb0 76 65 4c 69 62 72 61 72 79 46 69 6c 65 4e 61 6d  veLibraryFileNam
29bc0 65 73 4f 6e 6c 79 5d 20 24 66 69 6c 65 4e 61 6d  esOnly] $fileNam
29bd0 65 4f 6e 6c 79 5d 20 21 3d 20 2d 31 7d 20 74 68  eOnly] != -1} th
29be0 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
29bf0 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
29c00 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e  t_channel [appen
29c10 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
29c20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
29c30 20 66 6f 75 6e 64 20 6c 6f 61 64 65 64 20 53 51   found loaded SQ
29c40 4c 69 74 65 20 6e 61 74 69 76 65 20 6c 69 62 72  Lite native libr
29c50 61 72 79 20 6d 6f 64 75 6c 65 3a 20 22 20 5c 0d  ary module: " \.
29c60 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
29c70 20 20 20 24 66 69 6c 65 4e 61 6d 65 20 5c 6e 5d     $fileName \n]
29c80 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 20  ..            } 
29c90 65 6c 73 65 69 66 20 7b 5b 6c 73 65 61 72 63 68  elseif {[lsearch
29ca0 20 2d 65 78 61 63 74 20 2d 6e 6f 63 61 73 65 20   -exact -nocase 
29cb0 2d 2d 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  -- \..          
29cc0 20 20 20 20 20 20 5b 67 65 74 49 6e 74 65 72 6f        [getIntero
29cd0 70 41 73 73 65 6d 62 6c 79 46 69 6c 65 4e 61 6d  pAssemblyFileNam
29ce0 65 73 4f 6e 6c 79 5d 20 24 66 69 6c 65 4e 61 6d  esOnly] $fileNam
29cf0 65 4f 6e 6c 79 5d 20 21 3d 20 2d 31 7d 20 74 68  eOnly] != -1} th
29d00 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
29d10 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
29d20 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e  t_channel [appen
29d30 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
29d40 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
29d50 20 66 6f 75 6e 64 20 6c 6f 61 64 65 64 20 53 51   found loaded SQ
29d60 4c 69 74 65 20 69 6e 74 65 72 6f 70 20 61 73 73  Lite interop ass
29d70 65 6d 62 6c 79 20 6d 6f 64 75 6c 65 3a 20 22 20  embly module: " 
29d80 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
29d90 20 20 20 20 20 24 66 69 6c 65 4e 61 6d 65 20 5c       $fileName \
29da0 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  n]..            
29db0 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  }..          }..
29dc0 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
29dd0 20 20 20 20 20 63 61 74 63 68 20 7b 0d 0a 20 20       catch {..  
29de0 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
29df0 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5c 0d  :test_channel \.
29e00 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22  .              "
29e10 2d 2d 2d 2d 20 63 6f 6d 70 69 6c 65 2d 74 69 6d  ---- compile-tim
29e20 65 20 6f 70 74 69 6f 6e 73 20 66 6f 72 20 53 51  e options for SQ
29e30 4c 69 74 65 20 63 6f 72 65 20 6c 69 62 72 61 72  Lite core librar
29e40 79 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 20 20  y... "....      
29e50 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b      if {[catch {
29e60 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 6f 62  ..            ob
29e70 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61  ject invoke -fla
29e80 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d  gs +NonPublic \.
29e90 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
29ea0 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c   System.Data.SQL
29eb0 69 74 65 2e 53 51 4c 69 74 65 33 20 53 51 4c 69  ite.SQLite3 SQLi
29ec0 74 65 43 6f 6d 70 69 6c 65 4f 70 74 69 6f 6e 73  teCompileOptions
29ed0 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 20 63 6f  ..          } co
29ee0 6d 70 69 6c 65 4f 70 74 69 6f 6e 73 5d 20 3d 3d  mpileOptions] ==
29ef0 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
29f00 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
29f10 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61  :test_channel [a
29f20 70 70 65 6e 64 41 72 67 73 20 5b 66 6f 72 6d 61  ppendArgs [forma
29f30 74 4c 69 73 74 20 5b 6c 73 6f 72 74 20 5c 0d 0a  tList [lsort \..
29f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29f50 24 63 6f 6d 70 69 6c 65 4f 70 74 69 6f 6e 73 5d  $compileOptions]
29f60 20 3c 6e 6f 6e 65 3e 5d 20 5c 6e 5d 0d 0a 20 20   <none>] \n]..  
29f70 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b          } else {
29f80 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70  ..            tp
29f90 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  uts $::test_chan
29fa0 6e 65 6c 20 75 6e 6b 6e 6f 77 6e 5c 6e 0d 0a 20  nel unknown\n.. 
29fb0 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
29fc0 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
29fd0 20 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20   catch {..      
29fe0 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
29ff0 74 5f 63 68 61 6e 6e 65 6c 20 5c 0d 0a 20 20 20  t_channel \..   
2a000 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
2a010 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70   compile-time op
2a020 74 69 6f 6e 73 20 66 6f 72 20 53 51 4c 69 74 65  tions for SQLite
2a030 20 69 6e 74 65 72 6f 70 20 61 73 73 65 6d 62 6c   interop assembl
2a040 79 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 20 20  y... "....      
2a050 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b      if {[catch {
2a060 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 6f 62  ..            ob
2a070 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61  ject invoke -fla
2a080 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d  gs +NonPublic \.
2a090 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2a0a0 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c   System.Data.SQL
2a0b0 69 74 65 2e 53 51 4c 69 74 65 33 20 49 6e 74 65  ite.SQLite3 Inte
2a0c0 72 6f 70 43 6f 6d 70 69 6c 65 4f 70 74 69 6f 6e  ropCompileOption
2a0d0 73 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 20 63  s..          } c
2a0e0 6f 6d 70 69 6c 65 4f 70 74 69 6f 6e 73 5d 20 3d  ompileOptions] =
2a0f0 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  = 0} then {..   
2a100 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
2a110 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b  ::test_channel [
2a120 61 70 70 65 6e 64 41 72 67 73 20 5b 66 6f 72 6d  appendArgs [form
2a130 61 74 4c 69 73 74 20 5b 6c 73 6f 72 74 20 5c 0d  atList [lsort \.
2a140 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2a150 20 24 63 6f 6d 70 69 6c 65 4f 70 74 69 6f 6e 73   $compileOptions
2a160 5d 20 3c 6e 6f 6e 65 3e 5d 20 5c 6e 5d 0d 0a 20  ] <none>] \n].. 
2a170 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20           } else 
2a180 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  {..            t
2a190 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
2a1a0 6e 6e 65 6c 20 75 6e 6b 6e 6f 77 6e 5c 6e 0d 0a  nnel unknown\n..
2a1b0 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
2a1c0 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
2a1d0 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
2a1e0 4f 54 45 3a 20 53 68 6f 77 20 74 68 65 20 61 63  OTE: Show the ac
2a1f0 74 69 76 65 20 74 65 73 74 20 63 6f 6e 73 74 72  tive test constr
2a200 61 69 6e 74 73 2e 0d 0a 20 20 20 20 20 20 20 20  aints...        
2a210 23 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73  #..        tputs
2a220 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
2a230 20 5b 61 70 70 65 6e 64 41 72 67 73 20 22 2d 2d   [appendArgs "--
2a240 2d 2d 20 63 6f 6e 73 74 72 61 69 6e 74 73 3a 20  -- constraints: 
2a250 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  " \..           
2a260 20 5b 66 6f 72 6d 61 74 4c 69 73 74 20 5b 6c 73   [formatList [ls
2a270 6f 72 74 20 5b 67 65 74 43 6f 6e 73 74 72 61 69  ort [getConstrai
2a280 6e 74 73 5d 5d 20 3c 6e 6f 6e 65 3e 5d 20 5c 6e  nts]] <none>] \n
2a290 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  ]....        #..
2a2a0 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
2a2b0 53 61 76 65 20 74 68 65 20 74 65 73 74 20 63 6f  Save the test co
2a2c0 6e 73 74 72 61 69 6e 74 73 20 66 6f 72 20 75 73  nstraints for us
2a2d0 65 20 62 79 20 74 68 72 65 61 64 73 20 63 72 65  e by threads cre
2a2e0 61 74 65 64 20 69 6e 20 74 68 69 73 0d 0a 20 20  ated in this..  
2a2f0 20 20 20 20 20 20 23 20 20 20 20 20 20 20 61 70        #       ap
2a300 70 6c 69 63 61 74 69 6f 6e 20 64 6f 6d 61 69 6e  plication domain
2a310 2e 20 20 54 68 69 73 20 69 73 20 6e 65 63 65 73  .  This is neces
2a320 73 61 72 79 20 62 65 63 61 75 73 65 20 61 6c 6c  sary because all
2a330 20 74 68 65 20 45 61 67 6c 65 0d 0a 20 20 20 20   the Eagle..    
2a340 20 20 20 20 23 20 20 20 20 20 20 20 22 74 65 73      #       "tes
2a350 74 20 63 6f 6e 74 65 78 74 22 20 69 6e 66 6f 72  t context" infor
2a360 6d 61 74 69 6f 6e 20 69 73 20 70 65 72 2d 74 68  mation is per-th
2a370 72 65 61 64 2e 0d 0a 20 20 20 20 20 20 20 20 23  read...        #
2a380 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b  ..        if {![
2a390 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 74 65  info exists ::te
2a3a0 73 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 5d 7d  st_constraints]}
2a3b0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
2a3c0 20 20 20 73 65 74 20 3a 3a 74 65 73 74 5f 63 6f     set ::test_co
2a3d0 6e 73 74 72 61 69 6e 74 73 20 24 3a 3a 65 61 67  nstraints $::eag
2a3e0 6c 65 5f 74 65 73 74 73 28 63 6f 6e 73 74 72 61  le_tests(constra
2a3f0 69 6e 74 73 29 0d 0a 20 20 20 20 20 20 20 20 7d  ints)..        }
2a400 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  ....        #.. 
2a410 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4c         # NOTE: L
2a420 6f 61 64 20 74 68 65 20 22 61 66 74 65 72 2d 63  oad the "after-c
2a430 6f 6e 73 74 72 61 69 6e 74 73 22 20 63 75 73 74  onstraints" cust
2a440 6f 6d 20 70 65 72 2d 75 73 65 72 20 61 6e 64 2f  om per-user and/
2a450 6f 72 20 70 65 72 2d 68 6f 73 74 0d 0a 20 20 20  or per-host..   
2a460 20 20 20 20 20 23 20 20 20 20 20 20 20 74 65 73       #       tes
2a470 74 20 73 65 74 74 69 6e 67 73 20 6e 6f 77 2e 0d  t settings now..
2a480 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
2a490 20 20 20 20 75 70 6c 65 76 65 6c 20 31 20 5b 6c      uplevel 1 [l
2a4a0 69 73 74 20 6c 6f 61 64 53 51 4c 69 74 65 54 65  ist loadSQLiteTe
2a4b0 73 74 53 65 74 74 69 6e 67 73 20 24 3a 3a 74 65  stSettings $::te
2a4c0 73 74 5f 63 68 61 6e 6e 65 6c 20 2e 61 66 74 65  st_channel .afte
2a4d0 72 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d  r]....        #.
2a4e0 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
2a4f0 20 49 66 20 6e 65 63 65 73 73 61 72 79 2c 20 65   If necessary, e
2a500 6e 61 62 6c 65 20 73 68 61 72 65 64 2d 63 61 63  nable shared-cac
2a510 68 65 20 6d 6f 64 65 20 6e 6f 77 2e 0d 0a 20 20  he mode now...  
2a520 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
2a530 20 69 66 20 7b 5b 68 61 73 52 75 6e 74 69 6d 65   if {[hasRuntime
2a540 4f 70 74 69 6f 6e 20 73 68 61 72 65 64 43 61 63  Option sharedCac
2a550 68 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  he]} then {..   
2a560 20 20 20 20 20 20 20 65 6e 61 62 6c 65 53 68 61         enableSha
2a570 72 65 64 43 61 63 68 65 20 24 3a 3a 74 65 73 74  redCache $::test
2a580 5f 63 68 61 6e 6e 65 6c 20 74 72 75 65 0d 0a 20  _channel true.. 
2a590 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
2a5a0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
2a5b0 20 4e 4f 54 45 3a 20 53 68 6f 77 20 77 68 65 6e   NOTE: Show when
2a5c0 20 6f 75 72 20 74 65 73 74 73 20 61 63 74 75 61   our tests actua
2a5d0 6c 6c 79 20 62 65 67 61 6e 20 28 6e 6f 77 29 2e  lly began (now).
2a5e0 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
2a5f0 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
2a600 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
2a610 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
2a620 20 20 20 20 20 20 22 2d 2d 2d 2d 20 53 79 73 74        "---- Syst
2a630 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 20 74  em.Data.SQLite t
2a640 65 73 74 73 20 62 65 67 61 6e 20 61 74 20 22 20  ests began at " 
2a650 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b  \..            [
2a660 63 6c 6f 63 6b 20 66 6f 72 6d 61 74 20 5b 63 6c  clock format [cl
2a670 6f 63 6b 20 73 65 63 6f 6e 64 73 5d 5d 20 5c 6e  ock seconds]] \n
2a680 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  ]..      }..    
2a690 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 72  }.....    proc r
2a6a0 75 6e 53 51 4c 69 74 65 54 65 73 74 46 69 6c 65  unSQLiteTestFile
2a6b0 73 50 72 6f 6c 6f 67 75 65 20 7b 7d 20 7b 0d 0a  sPrologue {} {..
2a6c0 20 20 20 20 20 20 75 70 6c 65 76 65 6c 20 31 20        uplevel 1 
2a6d0 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
2a6e0 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 65        # NOTE: Se
2a6f0 74 75 70 20 74 68 65 20 76 61 72 69 61 62 6c 65  tup the variable
2a700 73 20 74 68 61 74 20 72 65 66 65 72 20 74 6f 20  s that refer to 
2a710 74 68 65 20 76 61 72 69 6f 75 73 20 6e 6f 6e 2d  the various non-
2a720 64 61 74 61 20 66 69 6c 65 73 0d 0a 20 20 20 20  data files..    
2a730 20 20 20 20 23 20 20 20 20 20 20 20 72 65 71 75      #       requ
2a740 69 72 65 64 20 62 79 20 74 68 65 20 74 65 73 74  ired by the test
2a750 73 20 69 6e 20 74 68 69 73 20 66 69 6c 65 2e 0d  s in this file..
2a760 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
2a770 20 20 20 20 73 65 74 20 65 6e 74 69 74 79 46 72      set entityFr
2a780 61 6d 65 77 6f 72 6b 44 6c 6c 46 69 6c 65 20 5c  ameworkDllFile \
2a790 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 67  ..            [g
2a7a0 65 74 42 75 69 6c 64 46 69 6c 65 4e 61 6d 65 20  etBuildFileName 
2a7b0 45 6e 74 69 74 79 46 72 61 6d 65 77 6f 72 6b 2e  EntityFramework.
2a7c0 64 6c 6c 20 66 61 6c 73 65 5d 0d 0a 0d 0a 20 20  dll false]....  
2a7d0 20 20 20 20 20 20 73 65 74 20 69 6e 73 74 61 6c        set instal
2a7e0 6c 65 72 45 78 65 46 69 6c 65 20 5c 0d 0a 20 20  lerExeFile \..  
2a7f0 20 20 20 20 20 20 20 20 20 20 5b 67 65 74 42 75            [getBu
2a800 69 6c 64 46 69 6c 65 4e 61 6d 65 20 49 6e 73 74  ildFileName Inst
2a810 61 6c 6c 65 72 2e 65 78 65 20 66 61 6c 73 65 5d  aller.exe false]
2a820 0d 0a 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20  ....        set 
2a830 73 71 6c 69 74 65 44 65 73 69 67 6e 65 72 44 6c  sqliteDesignerDl
2a840 6c 46 69 6c 65 20 5c 0d 0a 20 20 20 20 20 20 20  lFile \..       
2a850 20 20 20 20 20 5b 67 65 74 42 75 69 6c 64 46 69       [getBuildFi
2a860 6c 65 4e 61 6d 65 20 53 51 4c 69 74 65 2e 44 65  leName SQLite.De
2a870 73 69 67 6e 65 72 2e 64 6c 6c 20 66 61 6c 73 65  signer.dll false
2a880 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 73 65 74  ]....        set
2a890 20 73 79 73 74 65 6d 44 61 74 61 53 51 4c 69 74   systemDataSQLit
2a8a0 65 44 6c 6c 46 69 6c 65 20 5c 0d 0a 20 20 20 20  eDllFile \..    
2a8b0 20 20 20 20 20 20 20 20 5b 67 65 74 42 75 69 6c          [getBuil
2a8c0 64 46 69 6c 65 4e 61 6d 65 20 53 79 73 74 65 6d  dFileName System
2a8d0 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 64 6c 6c  .Data.SQLite.dll
2a8e0 20 66 61 6c 73 65 5d 0d 0a 0d 0a 20 20 20 20 20   false]....     
2a8f0 20 20 20 73 65 74 20 73 79 73 74 65 6d 44 61 74     set systemDat
2a900 61 53 51 4c 69 74 65 4c 69 6e 71 44 6c 6c 46 69  aSQLiteLinqDllFi
2a910 6c 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  le \..          
2a920 20 20 5b 67 65 74 42 75 69 6c 64 46 69 6c 65 4e    [getBuildFileN
2a930 61 6d 65 20 53 79 73 74 65 6d 2e 44 61 74 61 2e  ame System.Data.
2a940 53 51 4c 69 74 65 2e 4c 69 6e 71 2e 64 6c 6c 20  SQLite.Linq.dll 
2a950 66 61 6c 73 65 5d 0d 0a 0d 0a 20 20 20 20 20 20  false]....      
2a960 20 20 73 65 74 20 73 79 73 74 65 6d 44 61 74 61    set systemData
2a970 53 51 4c 69 74 65 45 66 36 44 6c 6c 46 69 6c 65  SQLiteEf6DllFile
2a980 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
2a990 5b 67 65 74 42 75 69 6c 64 46 69 6c 65 4e 61 6d  [getBuildFileNam
2a9a0 65 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51  e System.Data.SQ
2a9b0 4c 69 74 65 2e 45 46 36 2e 64 6c 6c 20 66 61 6c  Lite.EF6.dll fal
2a9c0 73 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 73  se]....        s
2a9d0 65 74 20 74 65 73 74 45 78 65 46 69 6c 65 20 5b  et testExeFile [
2a9e0 67 65 74 42 75 69 6c 64 46 69 6c 65 4e 61 6d 65  getBuildFileName
2a9f0 20 74 65 73 74 2e 65 78 65 20 66 61 6c 73 65 5d   test.exe false]
2aa00 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 74 65  ..        set te
2aa10 73 74 4c 69 6e 71 45 78 65 46 69 6c 65 20 5b 67  stLinqExeFile [g
2aa20 65 74 42 75 69 6c 64 46 69 6c 65 4e 61 6d 65 20  etBuildFileName 
2aa30 74 65 73 74 6c 69 6e 71 2e 65 78 65 20 66 61 6c  testlinq.exe fal
2aa40 73 65 5d 0d 0a 20 20 20 20 20 20 20 20 73 65 74  se]..        set
2aa50 20 74 65 73 74 45 66 36 45 78 65 46 69 6c 65 20   testEf6ExeFile 
2aa60 5b 67 65 74 42 75 69 6c 64 46 69 6c 65 4e 61 6d  [getBuildFileNam
2aa70 65 20 74 65 73 74 65 66 36 2e 65 78 65 20 66 61  e testef6.exe fa
2aa80 6c 73 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  lse]....        
2aa90 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
2aaa0 45 3a 20 53 65 74 75 70 20 74 68 65 20 76 61 72  E: Setup the var
2aab0 69 61 62 6c 65 73 20 74 68 61 74 20 72 65 66 65  iables that refe
2aac0 72 20 74 6f 20 74 68 65 20 76 61 72 69 6f 75 73  r to the various
2aad0 20 64 61 74 61 20 66 69 6c 65 73 0d 0a 20 20 20   data files..   
2aae0 20 20 20 20 20 23 20 20 20 20 20 20 20 72 65 71       #       req
2aaf0 75 69 72 65 64 20 62 79 20 74 68 65 20 74 65 73  uired by the tes
2ab00 74 73 20 69 6e 20 74 68 69 73 20 66 69 6c 65 2e  ts in this file.
2ab10 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
2ab20 20 20 20 20 20 73 65 74 20 74 65 73 74 4c 69 6e       set testLin
2ab30 71 4f 75 74 46 69 6c 65 20 5b 66 69 6c 65 20 6e  qOutFile [file n
2ab40 61 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c 65 20  ativename [file 
2ab50 6a 6f 69 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20  join \..        
2ab60 20 20 20 20 5b 67 65 74 53 51 4c 69 74 65 54 65      [getSQLiteTe
2ab70 73 74 44 61 74 61 50 61 74 68 5d 20 74 65 73 74  stDataPath] test
2ab80 6c 69 6e 71 2e 6f 75 74 5d 5d 0d 0a 0d 0a 20 20  linq.out]]....  
2ab90 20 20 20 20 20 20 73 65 74 20 6e 6f 72 74 68 77        set northw
2aba0 69 6e 64 45 66 44 62 46 69 6c 65 20 5b 66 69 6c  indEfDbFile [fil
2abb0 65 20 6e 61 74 69 76 65 6e 61 6d 65 20 5b 66 69  e nativename [fi
2abc0 6c 65 20 6a 6f 69 6e 20 5c 0d 0a 20 20 20 20 20  le join \..     
2abd0 20 20 20 20 20 20 20 5b 66 69 6c 65 20 64 69 72         [file dir
2abe0 6e 61 6d 65 20 5b 66 69 6c 65 20 64 69 72 6e 61  name [file dirna
2abf0 6d 65 20 5b 67 65 74 53 51 4c 69 74 65 54 65 73  me [getSQLiteTes
2ac00 74 44 61 74 61 50 61 74 68 5d 5d 5d 20 5c 0d 0a  tDataPath]]] \..
2ac10 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74              test
2ac20 6c 69 6e 71 20 6e 6f 72 74 68 77 69 6e 64 45 46  linq northwindEF
2ac30 2e 64 62 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  .db]]....       
2ac40 20 73 65 74 20 6e 6f 6e 57 61 6c 44 62 46 69 6c   set nonWalDbFil
2ac50 65 20 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e 61  e [file nativena
2ac60 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5c 0d  me [file join \.
2ac70 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 67 65  .            [ge
2ac80 74 53 51 4c 69 74 65 54 65 73 74 44 61 74 61 50  tSQLiteTestDataP
2ac90 61 74 68 5d 20 6e 6f 6e 57 61 6c 2e 64 62 5d 5d  ath] nonWal.db]]
2aca0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20  ....        set 
2acb0 77 61 6c 44 62 46 69 6c 65 20 5b 66 69 6c 65 20  walDbFile [file 
2acc0 6e 61 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c 65  nativename [file
2acd0 20 6a 6f 69 6e 20 5c 0d 0a 20 20 20 20 20 20 20   join \..       
2ace0 20 20 20 20 20 5b 67 65 74 53 51 4c 69 74 65 54       [getSQLiteT
2acf0 65 73 74 44 61 74 61 50 61 74 68 5d 20 77 61 6c  estDataPath] wal
2ad00 2e 64 62 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  .db]]....       
2ad10 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
2ad20 54 45 3a 20 54 68 65 20 76 61 72 69 6f 75 73 20  TE: The various 
2ad30 69 6e 73 74 61 6c 6c 2f 75 6e 69 6e 73 74 61 6c  install/uninstal
2ad40 6c 20 6c 6f 67 20 66 69 6c 65 73 20 75 73 65 64  l log files used
2ad50 20 74 6f 20 74 65 73 74 20 74 68 65 0d 0a 20 20   to test the..  
2ad60 20 20 20 20 20 20 23 20 20 20 20 20 20 20 64 65        #       de
2ad70 73 69 67 6e 2d 74 69 6d 65 20 63 6f 6d 70 6f 6e  sign-time compon
2ad80 65 6e 74 20 69 6e 73 74 61 6c 6c 65 72 2e 0d 0a  ent installer...
2ad90 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
2ada0 20 20 20 73 65 74 20 74 65 73 74 49 6e 73 74 61     set testInsta
2adb0 6c 6c 56 73 32 30 30 35 4c 6f 67 46 69 6c 65 20  llVs2005LogFile 
2adc0 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65  [file nativename
2add0 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5c 0d 0a 20   [file join \.. 
2ade0 20 20 20 20 20 20 20 20 20 20 20 5b 67 65 74 53             [getS
2adf0 51 4c 69 74 65 54 65 73 74 44 61 74 61 50 61 74  QLiteTestDataPat
2ae00 68 5d 20 49 6e 73 74 61 6c 6c 65 72 5f 54 65 73  h] Installer_Tes
2ae10 74 5f 56 73 32 30 30 35 2e 6c 6f 67 5d 5d 0d 0a  t_Vs2005.log]]..
2ae20 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 74 65  ..        set te
2ae30 73 74 49 6e 73 74 61 6c 6c 56 73 32 30 30 38 4c  stInstallVs2008L
2ae40 6f 67 46 69 6c 65 20 5b 66 69 6c 65 20 6e 61 74  ogFile [file nat
2ae50 69 76 65 6e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f  ivename [file jo
2ae60 69 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  in \..          
2ae70 20 20 5b 67 65 74 53 51 4c 69 74 65 54 65 73 74    [getSQLiteTest
2ae80 44 61 74 61 50 61 74 68 5d 20 49 6e 73 74 61 6c  DataPath] Instal
2ae90 6c 65 72 5f 54 65 73 74 5f 56 73 32 30 30 38 2e  ler_Test_Vs2008.
2aea0 6c 6f 67 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  log]]....       
2aeb0 20 73 65 74 20 74 65 73 74 49 6e 73 74 61 6c 6c   set testInstall
2aec0 56 73 32 30 31 30 4c 6f 67 46 69 6c 65 20 5b 66  Vs2010LogFile [f
2aed0 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65 20 5b  ile nativename [
2aee0 66 69 6c 65 20 6a 6f 69 6e 20 5c 0d 0a 20 20 20  file join \..   
2aef0 20 20 20 20 20 20 20 20 20 5b 67 65 74 53 51 4c           [getSQL
2af00 69 74 65 54 65 73 74 44 61 74 61 50 61 74 68 5d  iteTestDataPath]
2af10 20 49 6e 73 74 61 6c 6c 65 72 5f 54 65 73 74 5f   Installer_Test_
2af20 56 73 32 30 31 30 2e 6c 6f 67 5d 5d 0d 0a 0d 0a  Vs2010.log]]....
2af30 20 20 20 20 20 20 20 20 73 65 74 20 74 65 73 74          set test
2af40 49 6e 73 74 61 6c 6c 56 73 32 30 31 32 4c 6f 67  InstallVs2012Log
2af50 46 69 6c 65 20 5b 66 69 6c 65 20 6e 61 74 69 76  File [file nativ
2af60 65 6e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e  ename [file join
2af70 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
2af80 5b 67 65 74 53 51 4c 69 74 65 54 65 73 74 44 61  [getSQLiteTestDa
2af90 74 61 50 61 74 68 5d 20 49 6e 73 74 61 6c 6c 65  taPath] Installe
2afa0 72 5f 54 65 73 74 5f 56 73 32 30 31 32 2e 6c 6f  r_Test_Vs2012.lo
2afb0 67 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 73  g]]....        s
2afc0 65 74 20 74 65 73 74 49 6e 73 74 61 6c 6c 56 73  et testInstallVs
2afd0 32 30 31 33 4c 6f 67 46 69 6c 65 20 5b 66 69 6c  2013LogFile [fil
2afe0 65 20 6e 61 74 69 76 65 6e 61 6d 65 20 5b 66 69  e nativename [fi
2aff0 6c 65 20 6a 6f 69 6e 20 5c 0d 0a 20 20 20 20 20  le join \..     
2b000 20 20 20 20 20 20 20 5b 67 65 74 53 51 4c 69 74         [getSQLit
2b010 65 54 65 73 74 44 61 74 61 50 61 74 68 5d 20 49  eTestDataPath] I
2b020 6e 73 74 61 6c 6c 65 72 5f 54 65 73 74 5f 56 73  nstaller_Test_Vs
2b030 32 30 31 33 2e 6c 6f 67 5d 5d 0d 0a 0d 0a 20 20  2013.log]]....  
2b040 20 20 20 20 20 20 73 65 74 20 74 65 73 74 49 6e        set testIn
2b050 73 74 61 6c 6c 56 73 32 30 31 35 4c 6f 67 46 69  stallVs2015LogFi
2b060 6c 65 20 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e  le [file nativen
2b070 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5c  ame [file join \
2b080 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 67  ..            [g
2b090 65 74 53 51 4c 69 74 65 54 65 73 74 44 61 74 61  etSQLiteTestData
2b0a0 50 61 74 68 5d 20 49 6e 73 74 61 6c 6c 65 72 5f  Path] Installer_
2b0b0 54 65 73 74 5f 56 73 32 30 31 35 2e 6c 6f 67 5d  Test_Vs2015.log]
2b0c0 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 73 65 74  ]....        set
2b0d0 20 74 65 73 74 49 6e 73 74 61 6c 6c 56 73 32 30   testInstallVs20
2b0e0 31 37 4c 6f 67 46 69 6c 65 20 5b 66 69 6c 65 20  17LogFile [file 
2b0f0 6e 61 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c 65  nativename [file
2b100 20 6a 6f 69 6e 20 5c 0d 0a 20 20 20 20 20 20 20   join \..       
2b110 20 20 20 20 20 5b 67 65 74 53 51 4c 69 74 65 54       [getSQLiteT
2b120 65 73 74 44 61 74 61 50 61 74 68 5d 20 49 6e 73  estDataPath] Ins
2b130 74 61 6c 6c 65 72 5f 54 65 73 74 5f 56 73 32 30  taller_Test_Vs20
2b140 31 37 2e 6c 6f 67 5d 5d 0d 0a 0d 0a 20 20 20 20  17.log]]....    
2b150 20 20 20 20 73 65 74 20 74 65 73 74 55 6e 69 6e      set testUnin
2b160 73 74 61 6c 6c 56 73 32 30 30 35 4c 6f 67 46 69  stallVs2005LogFi
2b170 6c 65 20 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e  le [file nativen
2b180 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5c  ame [file join \
2b190 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 67  ..            [g
2b1a0 65 74 53 51 4c 69 74 65 54 65 73 74 44 61 74 61  etSQLiteTestData
2b1b0 50 61 74 68 5d 20 55 6e 69 6e 73 74 61 6c 6c 65  Path] Uninstalle
2b1c0 72 5f 54 65 73 74 5f 56 73 32 30 30 35 2e 6c 6f  r_Test_Vs2005.lo
2b1d0 67 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 73  g]]....        s
2b1e0 65 74 20 74 65 73 74 55 6e 69 6e 73 74 61 6c 6c  et testUninstall
2b1f0 56 73 32 30 30 38 4c 6f 67 46 69 6c 65 20 5b 66  Vs2008LogFile [f
2b200 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65 20 5b  ile nativename [
2b210 66 69 6c 65 20 6a 6f 69 6e 20 5c 0d 0a 20 20 20  file join \..   
2b220 20 20 20 20 20 20 20 20 20 5b 67 65 74 53 51 4c           [getSQL
2b230 69 74 65 54 65 73 74 44 61 74 61 50 61 74 68 5d  iteTestDataPath]
2b240 20 55 6e 69 6e 73 74 61 6c 6c 65 72 5f 54 65 73   Uninstaller_Tes
2b250 74 5f 56 73 32 30 30 38 2e 6c 6f 67 5d 5d 0d 0a  t_Vs2008.log]]..
2b260 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 74 65  ..        set te
2b270 73 74 55 6e 69 6e 73 74 61 6c 6c 56 73 32 30 31  stUninstallVs201
2b280 30 4c 6f 67 46 69 6c 65 20 5b 66 69 6c 65 20 6e  0LogFile [file n
2b290 61 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c 65 20  ativename [file 
2b2a0 6a 6f 69 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20  join \..        
2b2b0 20 20 20 20 5b 67 65 74 53 51 4c 69 74 65 54 65      [getSQLiteTe
2b2c0 73 74 44 61 74 61 50 61 74 68 5d 20 55 6e 69 6e  stDataPath] Unin
2b2d0 73 74 61 6c 6c 65 72 5f 54 65 73 74 5f 56 73 32  staller_Test_Vs2
2b2e0 30 31 30 2e 6c 6f 67 5d 5d 0d 0a 0d 0a 20 20 20  010.log]]....   
2b2f0 20 20 20 20 20 73 65 74 20 74 65 73 74 55 6e 69       set testUni
2b300 6e 73 74 61 6c 6c 56 73 32 30 31 32 4c 6f 67 46  nstallVs2012LogF
2b310 69 6c 65 20 5b 66 69 6c 65 20 6e 61 74 69 76 65  ile [file native
2b320 6e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20  name [file join 
2b330 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b  \..            [
2b340 67 65 74 53 51 4c 69 74 65 54 65 73 74 44 61 74  getSQLiteTestDat
2b350 61 50 61 74 68 5d 20 55 6e 69 6e 73 74 61 6c 6c  aPath] Uninstall
2b360 65 72 5f 54 65 73 74 5f 56 73 32 30 31 32 2e 6c  er_Test_Vs2012.l
2b370 6f 67 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  og]]....        
2b380 73 65 74 20 74 65 73 74 55 6e 69 6e 73 74 61 6c  set testUninstal
2b390 6c 56 73 32 30 31 33 4c 6f 67 46 69 6c 65 20 5b  lVs2013LogFile [
2b3a0 66 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65 20  file nativename 
2b3b0 5b 66 69 6c 65 20 6a 6f 69 6e 20 5c 0d 0a 20 20  [file join \..  
2b3c0 20 20 20 20 20 20 20 20 20 20 5b 67 65 74 53 51            [getSQ
2b3d0 4c 69 74 65 54 65 73 74 44 61 74 61 50 61 74 68  LiteTestDataPath
2b3e0 5d 20 55 6e 69 6e 73 74 61 6c 6c 65 72 5f 54 65  ] Uninstaller_Te
2b3f0 73 74 5f 56 73 32 30 31 33 2e 6c 6f 67 5d 5d 0d  st_Vs2013.log]].
2b400 0a 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 74  ...        set t
2b410 65 73 74 55 6e 69 6e 73 74 61 6c 6c 56 73 32 30  estUninstallVs20
2b420 31 35 4c 6f 67 46 69 6c 65 20 5b 66 69 6c 65 20  15LogFile [file 
2b430 6e 61 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c 65  nativename [file
2b440 20 6a 6f 69 6e 20 5c 0d 0a 20 20 20 20 20 20 20   join \..       
2b450 20 20 20 20 20 5b 67 65 74 53 51 4c 69 74 65 54       [getSQLiteT
2b460 65 73 74 44 61 74 61 50 61 74 68 5d 20 55 6e 69  estDataPath] Uni
2b470 6e 73 74 61 6c 6c 65 72 5f 54 65 73 74 5f 56 73  nstaller_Test_Vs
2b480 32 30 31 35 2e 6c 6f 67 5d 5d 0d 0a 0d 0a 20 20  2015.log]]....  
2b490 20 20 20 20 20 20 73 65 74 20 74 65 73 74 55 6e        set testUn
2b4a0 69 6e 73 74 61 6c 6c 56 73 32 30 31 37 4c 6f 67  installVs2017Log
2b4b0 46 69 6c 65 20 5b 66 69 6c 65 20 6e 61 74 69 76  File [file nativ
2b4c0 65 6e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e  ename [file join
2b4d0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
2b4e0 5b 67 65 74 53 51 4c 69 74 65 54 65 73 74 44 61  [getSQLiteTestDa
2b4f0 74 61 50 61 74 68 5d 20 55 6e 69 6e 73 74 61 6c  taPath] Uninstal
2b500 6c 65 72 5f 54 65 73 74 5f 56 73 32 30 31 37 2e  ler_Test_Vs2017.
2b510 6c 6f 67 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  log]]....       
2b520 20 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23   ###############
2b530 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2b540 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2b550 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2b560 23 23 23 23 23 23 23 23 0d 0a 0d 0a 20 20 20 20  ########....    
2b570 20 20 20 20 69 66 20 7b 21 5b 68 61 76 65 43 6f      if {![haveCo
2b580 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64  nstraint [append
2b590 41 72 67 73 20 66 69 6c 65 5f 20 5c 0d 0a 20 20  Args file_ \..  
2b5a0 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20            [file 
2b5b0 74 61 69 6c 20 24 65 6e 74 69 74 79 46 72 61 6d  tail $entityFram
2b5c0 65 77 6f 72 6b 44 6c 6c 46 69 6c 65 5d 5d 5d 7d  eworkDllFile]]]}
2b5d0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
2b5e0 20 20 20 63 68 65 63 6b 46 6f 72 46 69 6c 65 20     checkForFile 
2b5f0 24 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 24 65  $test_channel $e
2b600 6e 74 69 74 79 46 72 61 6d 65 77 6f 72 6b 44 6c  ntityFrameworkDl
2b610 6c 46 69 6c 65 0d 0a 20 20 20 20 20 20 20 20 7d  lFile..        }
2b620 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b  ....        if {
2b630 21 5b 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74  ![haveConstraint
2b640 20 5b 61 70 70 65 6e 64 41 72 67 73 20 66 69 6c   [appendArgs fil
2b650 65 5f 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  e_ \..          
2b660 20 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 69 6e    [file tail $in
2b670 73 74 61 6c 6c 65 72 45 78 65 46 69 6c 65 5d 5d  stallerExeFile]]
2b680 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
2b690 20 20 20 20 20 63 68 65 63 6b 46 6f 72 46 69 6c       checkForFil
2b6a0 65 20 24 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  e $test_channel 
2b6b0 24 69 6e 73 74 61 6c 6c 65 72 45 78 65 46 69 6c  $installerExeFil
2b6c0 65 20 49 6e 73 74 61 6c 6c 65 72 2e 65 78 65 0d  e Installer.exe.
2b6d0 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  .        }....  
2b6e0 20 20 20 20 20 20 69 66 20 7b 21 5b 68 61 76 65        if {![have
2b6f0 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65  Constraint [appe
2b700 6e 64 41 72 67 73 20 66 69 6c 65 5f 20 5c 0d 0a  ndArgs file_ \..
2b710 20 20 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c              [fil
2b720 65 20 74 61 69 6c 20 24 73 71 6c 69 74 65 44 65  e tail $sqliteDe
2b730 73 69 67 6e 65 72 44 6c 6c 46 69 6c 65 5d 5d 5d  signerDllFile]]]
2b740 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
2b750 20 20 20 20 63 68 65 63 6b 46 6f 72 46 69 6c 65      checkForFile
2b760 20 24 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 24   $test_channel $
2b770 73 71 6c 69 74 65 44 65 73 69 67 6e 65 72 44 6c  sqliteDesignerDl
2b780 6c 46 69 6c 65 0d 0a 20 20 20 20 20 20 20 20 7d  lFile..        }
2b790 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b  ....        if {
2b7a0 21 5b 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74  ![haveConstraint
2b7b0 20 5b 61 70 70 65 6e 64 41 72 67 73 20 66 69 6c   [appendArgs fil
2b7c0 65 5f 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  e_ \..          
2b7d0 20 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 73 79    [file tail $sy
2b7e0 73 74 65 6d 44 61 74 61 53 51 4c 69 74 65 44 6c  stemDataSQLiteDl
2b7f0 6c 46 69 6c 65 5d 5d 5d 7d 20 74 68 65 6e 20 7b  lFile]]]} then {
2b800 0d 0a 20 20 20 20 20 20 20 20 20 20 63 68 65 63  ..          chec
2b810 6b 46 6f 72 46 69 6c 65 20 24 74 65 73 74 5f 63  kForFile $test_c
2b820 68 61 6e 6e 65 6c 20 24 73 79 73 74 65 6d 44 61  hannel $systemDa
2b830 74 61 53 51 4c 69 74 65 44 6c 6c 46 69 6c 65 0d  taSQLiteDllFile.
2b840 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  .        }....  
2b850 20 20 20 20 20 20 69 66 20 7b 21 5b 68 61 76 65        if {![have
2b860 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65  Constraint [appe
2b870 6e 64 41 72 67 73 20 66 69 6c 65 5f 20 5c 0d 0a  ndArgs file_ \..
2b880 20 20 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c              [fil
2b890 65 20 74 61 69 6c 20 24 73 79 73 74 65 6d 44 61  e tail $systemDa
2b8a0 74 61 53 51 4c 69 74 65 4c 69 6e 71 44 6c 6c 46  taSQLiteLinqDllF
2b8b0 69 6c 65 5d 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a  ile]]]} then {..
2b8c0 20 20 20 20 20 20 20 20 20 20 63 68 65 63 6b 46            checkF
2b8d0 6f 72 46 69 6c 65 20 24 74 65 73 74 5f 63 68 61  orFile $test_cha
2b8e0 6e 6e 65 6c 20 24 73 79 73 74 65 6d 44 61 74 61  nnel $systemData
2b8f0 53 51 4c 69 74 65 4c 69 6e 71 44 6c 6c 46 69 6c  SQLiteLinqDllFil
2b900 65 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  e..        }....
2b910 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 68 61          if {![ha
2b920 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70  veConstraint [ap
2b930 70 65 6e 64 41 72 67 73 20 66 69 6c 65 5f 20 5c  pendArgs file_ \
2b940 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 66  ..            [f
2b950 69 6c 65 20 74 61 69 6c 20 24 73 79 73 74 65 6d  ile tail $system
2b960 44 61 74 61 53 51 4c 69 74 65 45 66 36 44 6c 6c  DataSQLiteEf6Dll
2b970 46 69 6c 65 5d 5d 5d 7d 20 74 68 65 6e 20 7b 0d  File]]]} then {.
2b980 0a 20 20 20 20 20 20 20 20 20 20 63 68 65 63 6b  .          check
2b990 46 6f 72 46 69 6c 65 20 24 74 65 73 74 5f 63 68  ForFile $test_ch
2b9a0 61 6e 6e 65 6c 20 24 73 79 73 74 65 6d 44 61 74  annel $systemDat
2b9b0 61 53 51 4c 69 74 65 45 66 36 44 6c 6c 46 69 6c  aSQLiteEf6DllFil
2b9c0 65 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  e..        }....
2b9d0 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 68 61          if {![ha
2b9e0 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70  veConstraint [ap
2b9f0 70 65 6e 64 41 72 67 73 20 66 69 6c 65 5f 20 5c  pendArgs file_ \
2ba00 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 66  ..            [f
2ba10 69 6c 65 20 74 61 69 6c 20 24 74 65 73 74 45 78  ile tail $testEx
2ba20 65 46 69 6c 65 5d 5d 5d 7d 20 74 68 65 6e 20 7b  eFile]]]} then {
2ba30 0d 0a 20 20 20 20 20 20 20 20 20 20 63 68 65 63  ..          chec
2ba40 6b 46 6f 72 46 69 6c 65 20 24 74 65 73 74 5f 63  kForFile $test_c
2ba50 68 61 6e 6e 65 6c 20 24 74 65 73 74 45 78 65 46  hannel $testExeF
2ba60 69 6c 65 20 74 65 73 74 2e 65 78 65 0d 0a 20 20  ile test.exe..  
2ba70 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
2ba80 20 20 20 69 66 20 7b 21 5b 68 61 76 65 43 6f 6e     if {![haveCon
2ba90 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41  straint [appendA
2baa0 72 67 73 20 66 69 6c 65 5f 20 5c 0d 0a 20 20 20  rgs file_ \..   
2bab0 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20 74           [file t
2bac0 61 69 6c 20 24 74 65 73 74 4c 69 6e 71 45 78 65  ail $testLinqExe
2bad0 46 69 6c 65 5d 5d 5d 7d 20 74 68 65 6e 20 7b 0d  File]]]} then {.
2bae0 0a 20 20 20 20 20 20 20 20 20 20 63 68 65 63 6b  .          check
2baf0 46 6f 72 46 69 6c 65 20 24 74 65 73 74 5f 63 68  ForFile $test_ch
2bb00 61 6e 6e 65 6c 20 24 74 65 73 74 4c 69 6e 71 45  annel $testLinqE
2bb10 78 65 46 69 6c 65 20 74 65 73 74 6c 69 6e 71 2e  xeFile testlinq.
2bb20 65 78 65 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  exe..        }..
2bb30 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b  ..        if {![
2bb40 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b  haveConstraint [
2bb50 61 70 70 65 6e 64 41 72 67 73 20 66 69 6c 65 5f  appendArgs file_
2bb60 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
2bb70 5b 66 69 6c 65 20 74 61 69 6c 20 24 74 65 73 74  [file tail $test
2bb80 45 66 36 45 78 65 46 69 6c 65 5d 5d 5d 7d 20 74  Ef6ExeFile]]]} t
2bb90 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
2bba0 20 63 68 65 63 6b 46 6f 72 46 69 6c 65 20 24 74   checkForFile $t
2bbb0 65 73 74 5f 63 68 61 6e 6e 65 6c 20 24 74 65 73  est_channel $tes
2bbc0 74 45 66 36 45 78 65 46 69 6c 65 20 74 65 73 74  tEf6ExeFile test
2bbd0 65 66 36 2e 65 78 65 0d 0a 20 20 20 20 20 20 20  ef6.exe..       
2bbe0 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66   }....        if
2bbf0 20 7b 21 5b 68 61 76 65 43 6f 6e 73 74 72 61 69   {![haveConstrai
2bc00 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20 66  nt [appendArgs f
2bc10 69 6c 65 5f 20 5c 0d 0a 20 20 20 20 20 20 20 20  ile_ \..        
2bc20 20 20 20 20 5b 66 69 6c 65 20 74 61 69 6c 20 24      [file tail $
2bc30 74 65 73 74 4c 69 6e 71 4f 75 74 46 69 6c 65 5d  testLinqOutFile]
2bc40 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  ]]} then {..    
2bc50 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72 46 69        checkForFi
2bc60 6c 65 20 24 74 65 73 74 5f 63 68 61 6e 6e 65 6c  le $test_channel
2bc70 20 24 74 65 73 74 4c 69 6e 71 4f 75 74 46 69 6c   $testLinqOutFil
2bc80 65 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  e..        }....
2bc90 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 68 61          if {![ha
2bca0 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70  veConstraint [ap
2bcb0 70 65 6e 64 41 72 67 73 20 66 69 6c 65 5f 20 5c  pendArgs file_ \
2bcc0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 66  ..            [f
2bcd0 69 6c 65 20 74 61 69 6c 20 24 6e 6f 72 74 68 77  ile tail $northw
2bce0 69 6e 64 45 66 44 62 46 69 6c 65 5d 5d 5d 7d 20  indEfDbFile]]]} 
2bcf0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
2bd00 20 20 63 68 65 63 6b 46 6f 72 46 69 6c 65 20 24    checkForFile $
2bd10 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 24 6e 6f  test_channel $no
2bd20 72 74 68 77 69 6e 64 45 66 44 62 46 69 6c 65 0d  rthwindEfDbFile.
2bd30 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  .        }....  
2bd40 20 20 20 20 20 20 69 66 20 7b 21 5b 68 61 76 65        if {![have
2bd50 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65  Constraint [appe
2bd60 6e 64 41 72 67 73 20 66 69 6c 65 5f 20 5c 0d 0a  ndArgs file_ \..
2bd70 20 20 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c              [fil
2bd80 65 20 74 61 69 6c 20 24 6e 6f 6e 57 61 6c 44 62  e tail $nonWalDb
2bd90 46 69 6c 65 5d 5d 5d 7d 20 74 68 65 6e 20 7b 0d  File]]]} then {.
2bda0 0a 20 20 20 20 20 20 20 20 20 20 63 68 65 63 6b  .          check
2bdb0 46 6f 72 46 69 6c 65 20 24 74 65 73 74 5f 63 68  ForFile $test_ch
2bdc0 61 6e 6e 65 6c 20 24 6e 6f 6e 57 61 6c 44 62 46  annel $nonWalDbF
2bdd0 69 6c 65 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  ile..        }..
2bde0 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b  ..        if {![
2bdf0 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b  haveConstraint [
2be00 61 70 70 65 6e 64 41 72 67 73 20 66 69 6c 65 5f  appendArgs file_
2be10 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
2be20 5b 66 69 6c 65 20 74 61 69 6c 20 24 77 61 6c 44  [file tail $walD
2be30 62 46 69 6c 65 5d 5d 5d 7d 20 74 68 65 6e 20 7b  bFile]]]} then {
2be40 0d 0a 20 20 20 20 20 20 20 20 20 20 63 68 65 63  ..          chec
2be50 6b 46 6f 72 46 69 6c 65 20 24 74 65 73 74 5f 63  kForFile $test_c
2be60 68 61 6e 6e 65 6c 20 24 77 61 6c 44 62 46 69 6c  hannel $walDbFil
2be70 65 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  e..        }....
2be80 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 68 61          if {![ha
2be90 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70  veConstraint [ap
2bea0 70 65 6e 64 41 72 67 73 20 66 69 6c 65 5f 20 5c  pendArgs file_ \
2beb0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 66  ..            [f
2bec0 69 6c 65 20 74 61 69 6c 20 24 74 65 73 74 49 6e  ile tail $testIn
2bed0 73 74 61 6c 6c 56 73 32 30 30 35 4c 6f 67 46 69  stallVs2005LogFi
2bee0 6c 65 5d 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  le]]]} then {.. 
2bef0 20 20 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f           checkFo
2bf00 72 46 69 6c 65 20 24 74 65 73 74 5f 63 68 61 6e  rFile $test_chan
2bf10 6e 65 6c 20 24 74 65 73 74 49 6e 73 74 61 6c 6c  nel $testInstall
2bf20 56 73 32 30 30 35 4c 6f 67 46 69 6c 65 0d 0a 20  Vs2005LogFile.. 
2bf30 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
2bf40 20 20 20 20 69 66 20 7b 21 5b 68 61 76 65 43 6f      if {![haveCo
2bf50 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64  nstraint [append
2bf60 41 72 67 73 20 66 69 6c 65 5f 20 5c 0d 0a 20 20  Args file_ \..  
2bf70 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20            [file 
2bf80 74 61 69 6c 20 24 74 65 73 74 49 6e 73 74 61 6c  tail $testInstal
2bf90 6c 56 73 32 30 30 38 4c 6f 67 46 69 6c 65 5d 5d  lVs2008LogFile]]
2bfa0 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
2bfb0 20 20 20 20 20 63 68 65 63 6b 46 6f 72 46 69 6c       checkForFil
2bfc0 65 20 24 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  e $test_channel 
2bfd0 24 74 65 73 74 49 6e 73 74 61 6c 6c 56 73 32 30  $testInstallVs20
2bfe0 30 38 4c 6f 67 46 69 6c 65 0d 0a 20 20 20 20 20  08LogFile..     
2bff0 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
2c000 69 66 20 7b 21 5b 68 61 76 65 43 6f 6e 73 74 72  if {![haveConstr
2c010 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73  aint [appendArgs
2c020 20 66 69 6c 65 5f 20 5c 0d 0a 20 20 20 20 20 20   file_ \..      
2c030 20 20 20 20 20 20 5b 66 69 6c 65 20 74 61 69 6c        [file tail
2c040 20 24 74 65 73 74 49 6e 73 74 61 6c 6c 56 73 32   $testInstallVs2
2c050 30 31 30 4c 6f 67 46 69 6c 65 5d 5d 5d 7d 20 74  010LogFile]]]} t
2c060 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
2c070 20 63 68 65 63 6b 46 6f 72 46 69 6c 65 20 24 74   checkForFile $t
2c080 65 73 74 5f 63 68 61 6e 6e 65 6c 20 24 74 65 73  est_channel $tes
2c090 74 49 6e 73 74 61 6c 6c 56 73 32 30 31 30 4c 6f  tInstallVs2010Lo
2c0a0 67 46 69 6c 65 0d 0a 20 20 20 20 20 20 20 20 7d  gFile..        }
2c0b0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b  ....        if {
2c0c0 21 5b 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74  ![haveConstraint
2c0d0 20 5b 61 70 70 65 6e 64 41 72 67 73 20 66 69 6c   [appendArgs fil
2c0e0 65 5f 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  e_ \..          
2c0f0 20 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 74 65    [file tail $te
2c100 73 74 49 6e 73 74 61 6c 6c 56 73 32 30 31 32 4c  stInstallVs2012L
2c110 6f 67 46 69 6c 65 5d 5d 5d 7d 20 74 68 65 6e 20  ogFile]]]} then 
2c120 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 63 68 65  {..          che
2c130 63 6b 46 6f 72 46 69 6c 65 20 24 74 65 73 74 5f  ckForFile $test_
2c140 63 68 61 6e 6e 65 6c 20 24 74 65 73 74 49 6e 73  channel $testIns
2c150 74 61 6c 6c 56 73 32 30 31 32 4c 6f 67 46 69 6c  tallVs2012LogFil
2c160 65 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  e..        }....
2c170 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 68 61          if {![ha
2c180 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70  veConstraint [ap
2c190 70 65 6e 64 41 72 67 73 20 66 69 6c 65 5f 20 5c  pendArgs file_ \
2c1a0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 66  ..            [f
2c1b0 69 6c 65 20 74 61 69 6c 20 24 74 65 73 74 49 6e  ile tail $testIn
2c1c0 73 74 61 6c 6c 56 73 32 30 31 33 4c 6f 67 46 69  stallVs2013LogFi
2c1d0 6c 65 5d 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  le]]]} then {.. 
2c1e0 20 20 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f           checkFo
2c1f0 72 46 69 6c 65 20 24 74 65 73 74 5f 63 68 61 6e  rFile $test_chan
2c200 6e 65 6c 20 24 74 65 73 74 49 6e 73 74 61 6c 6c  nel $testInstall
2c210 56 73 32 30 31 33 4c 6f 67 46 69 6c 65 0d 0a 20  Vs2013LogFile.. 
2c220 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
2c230 20 20 20 20 69 66 20 7b 21 5b 68 61 76 65 43 6f      if {![haveCo
2c240 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64  nstraint [append
2c250 41 72 67 73 20 66 69 6c 65 5f 20 5c 0d 0a 20 20  Args file_ \..  
2c260 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20            [file 
2c270 74 61 69 6c 20 24 74 65 73 74 49 6e 73 74 61 6c  tail $testInstal
2c280 6c 56 73 32 30 31 35 4c 6f 67 46 69 6c 65 5d 5d  lVs2015LogFile]]
2c290 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
2c2a0 20 20 20 20 20 63 68 65 63 6b 46 6f 72 46 69 6c       checkForFil
2c2b0 65 20 24 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  e $test_channel 
2c2c0 24 74 65 73 74 49 6e 73 74 61 6c 6c 56 73 32 30  $testInstallVs20
2c2d0 31 35 4c 6f 67 46 69 6c 65 0d 0a 20 20 20 20 20  15LogFile..     
2c2e0 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
2c2f0 69 66 20 7b 21 5b 68 61 76 65 43 6f 6e 73 74 72  if {![haveConstr
2c300 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73  aint [appendArgs
2c310 20 66 69 6c 65 5f 20 5c 0d 0a 20 20 20 20 20 20   file_ \..      
2c320 20 20 20 20 20 20 5b 66 69 6c 65 20 74 61 69 6c        [file tail
2c330 20 24 74 65 73 74 49 6e 73 74 61 6c 6c 56 73 32   $testInstallVs2
2c340 30 31 37 4c 6f 67 46 69 6c 65 5d 5d 5d 7d 20 74  017LogFile]]]} t
2c350 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
2c360 20 63 68 65 63 6b 46 6f 72 46 69 6c 65 20 24 74   checkForFile $t
2c370 65 73 74 5f 63 68 61 6e 6e 65 6c 20 24 74 65 73  est_channel $tes
2c380 74 49 6e 73 74 61 6c 6c 56 73 32 30 31 37 4c 6f  tInstallVs2017Lo
2c390 67 46 69 6c 65 0d 0a 20 20 20 20 20 20 20 20 7d  gFile..        }
2c3a0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b  ....        if {
2c3b0 21 5b 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74  ![haveConstraint
2c3c0 20 5b 61 70 70 65 6e 64 41 72 67 73 20 66 69 6c   [appendArgs fil
2c3d0 65 5f 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  e_ \..          
2c3e0 20 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 74 65    [file tail $te
2c3f0 73 74 55 6e 69 6e 73 74 61 6c 6c 56 73 32 30 30  stUninstallVs200
2c400 35 4c 6f 67 46 69 6c 65 5d 5d 5d 7d 20 74 68 65  5LogFile]]]} the
2c410 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 63  n {..          c
2c420 68 65 63 6b 46 6f 72 46 69 6c 65 20 24 74 65 73  heckForFile $tes
2c430 74 5f 63 68 61 6e 6e 65 6c 20 24 74 65 73 74 55  t_channel $testU
2c440 6e 69 6e 73 74 61 6c 6c 56 73 32 30 30 35 4c 6f  ninstallVs2005Lo
2c450 67 46 69 6c 65 0d 0a 20 20 20 20 20 20 20 20 7d  gFile..        }
2c460 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b  ....        if {
2c470 21 5b 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74  ![haveConstraint
2c480 20 5b 61 70 70 65 6e 64 41 72 67 73 20 66 69 6c   [appendArgs fil
2c490 65 5f 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  e_ \..          
2c4a0 20 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 74 65    [file tail $te
2c4b0 73 74 55 6e 69 6e 73 74 61 6c 6c 56 73 32 30 30  stUninstallVs200
2c4c0 38 4c 6f 67 46 69 6c 65 5d 5d 5d 7d 20 74 68 65  8LogFile]]]} the
2c4d0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 63  n {..          c
2c4e0 68 65 63 6b 46 6f 72 46 69 6c 65 20 24 74 65 73  heckForFile $tes
2c4f0 74 5f 63 68 61 6e 6e 65 6c 20 24 74 65 73 74 55  t_channel $testU
2c500 6e 69 6e 73 74 61 6c 6c 56 73 32 30 30 38 4c 6f  ninstallVs2008Lo
2c510 67 46 69 6c 65 0d 0a 20 20 20 20 20 20 20 20 7d  gFile..        }
2c520 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b  ....        if {
2c530 21 5b 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74  ![haveConstraint
2c540 20 5b 61 70 70 65 6e 64 41 72 67 73 20 66 69 6c   [appendArgs fil
2c550 65 5f 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  e_ \..          
2c560 20 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 74 65    [file tail $te
2c570 73 74 55 6e 69 6e 73 74 61 6c 6c 56 73 32 30 31  stUninstallVs201
2c580 30 4c 6f 67 46 69 6c 65 5d 5d 5d 7d 20 74 68 65  0LogFile]]]} the
2c590 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 63  n {..          c
2c5a0 68 65 63 6b 46 6f 72 46 69 6c 65 20 24 74 65 73  heckForFile $tes
2c5b0 74 5f 63 68 61 6e 6e 65 6c 20 24 74 65 73 74 55  t_channel $testU
2c5c0 6e 69 6e 73 74 61 6c 6c 56 73 32 30 31 30 4c 6f  ninstallVs2010Lo
2c5d0 67 46 69 6c 65 0d 0a 20 20 20 20 20 20 20 20 7d  gFile..        }
2c5e0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b  ....        if {
2c5f0 21 5b 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74  ![haveConstraint
2c600 20 5b 61 70 70 65 6e 64 41 72 67 73 20 66 69 6c   [appendArgs fil
2c610 65 5f 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  e_ \..          
2c620 20 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 74 65    [file tail $te
2c630 73 74 55 6e 69 6e 73 74 61 6c 6c 56 73 32 30 31  stUninstallVs201
2c640 32 4c 6f 67 46 69 6c 65 5d 5d 5d 7d 20 74 68 65  2LogFile]]]} the
2c650 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 63  n {..          c
2c660 68 65 63 6b 46 6f 72 46 69 6c 65 20 24 74 65 73  heckForFile $tes
2c670 74 5f 63 68 61 6e 6e 65 6c 20 24 74 65 73 74 55  t_channel $testU
2c680 6e 69 6e 73 74 61 6c 6c 56 73 32 30 31 32 4c 6f  ninstallVs2012Lo
2c690 67 46 69 6c 65 0d 0a 20 20 20 20 20 20 20 20 7d  gFile..        }
2c6a0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b  ....        if {
2c6b0 21 5b 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74  ![haveConstraint
2c6c0 20 5b 61 70 70 65 6e 64 41 72 67 73 20 66 69 6c   [appendArgs fil
2c6d0 65 5f 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  e_ \..          
2c6e0 20 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 74 65    [file tail $te
2c6f0 73 74 55 6e 69 6e 73 74 61 6c 6c 56 73 32 30 31  stUninstallVs201
2c700 33 4c 6f 67 46 69 6c 65 5d 5d 5d 7d 20 74 68 65  3LogFile]]]} the
2c710 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 63  n {..          c
2c720 68 65 63 6b 46 6f 72 46 69 6c 65 20 24 74 65 73  heckForFile $tes
2c730 74 5f 63 68 61 6e 6e 65 6c 20 24 74 65 73 74 55  t_channel $testU
2c740 6e 69 6e 73 74 61 6c 6c 56 73 32 30 31 33 4c 6f  ninstallVs2013Lo
2c750 67 46 69 6c 65 0d 0a 20 20 20 20 20 20 20 20 7d  gFile..        }
2c760 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b  ....        if {
2c770 21 5b 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74  ![haveConstraint
2c780 20 5b 61 70 70 65 6e 64 41 72 67 73 20 66 69 6c   [appendArgs fil
2c790 65 5f 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  e_ \..          
2c7a0 20 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 74 65    [file tail $te
2c7b0 73 74 55 6e 69 6e 73 74 61 6c 6c 56 73 32 30 31  stUninstallVs201
2c7c0 35 4c 6f 67 46 69 6c 65 5d 5d 5d 7d 20 74 68 65  5LogFile]]]} the
2c7d0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 63  n {..          c
2c7e0 68 65 63 6b 46 6f 72 46 69 6c 65 20 24 74 65 73  heckForFile $tes
2c7f0 74 5f 63 68 61 6e 6e 65 6c 20 24 74 65 73 74 55  t_channel $testU
2c800 6e 69 6e 73 74 61 6c 6c 56 73 32 30 31 35 4c 6f  ninstallVs2015Lo
2c810 67 46 69 6c 65 0d 0a 20 20 20 20 20 20 20 20 7d  gFile..        }
2c820 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b  ....        if {
2c830 21 5b 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74  ![haveConstraint
2c840 20 5b 61 70 70 65 6e 64 41 72 67 73 20 66 69 6c   [appendArgs fil
2c850 65 5f 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  e_ \..          
2c860 20 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 74 65    [file tail $te
2c870 73 74 55 6e 69 6e 73 74 61 6c 6c 56 73 32 30 31  stUninstallVs201
2c880 37 4c 6f 67 46 69 6c 65 5d 5d 5d 7d 20 74 68 65  7LogFile]]]} the
2c890 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 63  n {..          c
2c8a0 68 65 63 6b 46 6f 72 46 69 6c 65 20 24 74 65 73  heckForFile $tes
2c8b0 74 5f 63 68 61 6e 6e 65 6c 20 24 74 65 73 74 55  t_channel $testU
2c8c0 6e 69 6e 73 74 61 6c 6c 56 73 32 30 31 37 4c 6f  ninstallVs2017Lo
2c8d0 67 46 69 6c 65 0d 0a 20 20 20 20 20 20 20 20 7d  gFile..        }
2c8e0 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d  ..      }..    }
2c8f0 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 72 75  .....    proc ru
2c900 6e 53 51 4c 69 74 65 54 65 73 74 46 69 6c 65 73  nSQLiteTestFiles
2c910 45 70 69 6c 6f 67 75 65 20 7b 7d 20 7b 0d 0a 20  Epilogue {} {.. 
2c920 20 20 20 20 20 75 70 6c 65 76 65 6c 20 31 20 7b       uplevel 1 {
2c930 0d 0a 20 20 20 20 20 20 20 20 75 6e 73 65 74 20  ..        unset 
2c940 2d 6e 6f 63 6f 6d 70 6c 61 69 6e 20 5c 0d 0a 20  -nocomplain \.. 
2c950 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 55             testU
2c960 6e 69 6e 73 74 61 6c 6c 56 73 32 30 31 37 4c 6f  ninstallVs2017Lo
2c970 67 46 69 6c 65 20 74 65 73 74 55 6e 69 6e 73 74  gFile testUninst
2c980 61 6c 6c 56 73 32 30 31 35 4c 6f 67 46 69 6c 65  allVs2015LogFile
2c990 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
2c9a0 74 65 73 74 55 6e 69 6e 73 74 61 6c 6c 56 73 32  testUninstallVs2
2c9b0 30 31 33 4c 6f 67 46 69 6c 65 20 74 65 73 74 55  013LogFile testU
2c9c0 6e 69 6e 73 74 61 6c 6c 56 73 32 30 31 32 4c 6f  ninstallVs2012Lo
2c9d0 67 46 69 6c 65 20 5c 0d 0a 20 20 20 20 20 20 20  gFile \..       
2c9e0 20 20 20 20 20 74 65 73 74 55 6e 69 6e 73 74 61       testUninsta
2c9f0 6c 6c 56 73 32 30 31 30 4c 6f 67 46 69 6c 65 20  llVs2010LogFile 
2ca00 74 65 73 74 55 6e 69 6e 73 74 61 6c 6c 56 73 32  testUninstallVs2
2ca10 30 30 38 4c 6f 67 46 69 6c 65 20 5c 0d 0a 20 20  008LogFile \..  
2ca20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 55 6e            testUn
2ca30 69 6e 73 74 61 6c 6c 56 73 32 30 30 35 4c 6f 67  installVs2005Log
2ca40 46 69 6c 65 20 74 65 73 74 49 6e 73 74 61 6c 6c  File testInstall
2ca50 56 73 32 30 31 37 4c 6f 67 46 69 6c 65 20 5c 0d  Vs2017LogFile \.
2ca60 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73  .            tes
2ca70 74 49 6e 73 74 61 6c 6c 56 73 32 30 31 35 4c 6f  tInstallVs2015Lo
2ca80 67 46 69 6c 65 20 74 65 73 74 49 6e 73 74 61 6c  gFile testInstal
2ca90 6c 56 73 32 30 31 33 4c 6f 67 46 69 6c 65 20 5c  lVs2013LogFile \
2caa0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 65  ..            te
2cab0 73 74 49 6e 73 74 61 6c 6c 56 73 32 30 31 32 4c  stInstallVs2012L
2cac0 6f 67 46 69 6c 65 20 74 65 73 74 49 6e 73 74 61  ogFile testInsta
2cad0 6c 6c 56 73 32 30 31 30 4c 6f 67 46 69 6c 65 20  llVs2010LogFile 
2cae0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  \..            t
2caf0 65 73 74 49 6e 73 74 61 6c 6c 56 73 32 30 30 38  estInstallVs2008
2cb00 4c 6f 67 46 69 6c 65 20 74 65 73 74 49 6e 73 74  LogFile testInst
2cb10 61 6c 6c 56 73 32 30 30 35 4c 6f 67 46 69 6c 65  allVs2005LogFile
2cb20 0d 0a 0d 0a 20 20 20 20 20 20 20 20 75 6e 73 65  ....        unse
2cb30 74 20 2d 6e 6f 63 6f 6d 70 6c 61 69 6e 20 5c 0d  t -nocomplain \.
2cb40 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e 6f 72  .            nor
2cb50 74 68 77 69 6e 64 45 66 44 62 46 69 6c 65 20 74  thwindEfDbFile t
2cb60 65 73 74 4c 69 6e 71 4f 75 74 46 69 6c 65 20 5c  estLinqOutFile \
2cb70 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 77 61  ..            wa
2cb80 6c 44 62 46 69 6c 65 20 6e 6f 6e 57 61 6c 44 62  lDbFile nonWalDb
2cb90 46 69 6c 65 0d 0a 0d 0a 20 20 20 20 20 20 20 20  File....        
2cba0 75 6e 73 65 74 20 2d 6e 6f 63 6f 6d 70 6c 61 69  unset -nocomplai
2cbb0 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n \..           
2cbc0 20 74 65 73 74 45 66 36 45 78 65 46 69 6c 65 20   testEf6ExeFile 
2cbd0 74 65 73 74 4c 69 6e 71 45 78 65 46 69 6c 65 20  testLinqExeFile 
2cbe0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  \..            t
2cbf0 65 73 74 45 78 65 46 69 6c 65 20 73 79 73 74 65  estExeFile syste
2cc00 6d 44 61 74 61 53 51 4c 69 74 65 45 66 36 44 6c  mDataSQLiteEf6Dl
2cc10 6c 46 69 6c 65 20 5c 0d 0a 20 20 20 20 20 20 20  lFile \..       
2cc20 20 20 20 20 20 73 79 73 74 65 6d 44 61 74 61 53       systemDataS
2cc30 51 4c 69 74 65 4c 69 6e 71 44 6c 6c 46 69 6c 65  QLiteLinqDllFile
2cc40 20 73 79 73 74 65 6d 44 61 74 61 53 51 4c 69 74   systemDataSQLit
2cc50 65 44 6c 6c 46 69 6c 65 20 5c 0d 0a 20 20 20 20  eDllFile \..    
2cc60 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 44 65          sqliteDe
2cc70 73 69 67 6e 65 72 44 6c 6c 46 69 6c 65 20 69 6e  signerDllFile in
2cc80 73 74 61 6c 6c 65 72 45 78 65 46 69 6c 65 20 5c  stallerExeFile \
2cc90 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 65 6e  ..            en
2cca0 74 69 74 79 46 72 61 6d 65 77 6f 72 6b 44 6c 6c  tityFrameworkDll
2ccb0 46 69 6c 65 0d 0a 20 20 20 20 20 20 7d 0d 0a 20  File..      }.. 
2ccc0 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
2ccd0 63 20 72 75 6e 53 51 4c 69 74 65 54 65 73 74 45  c runSQLiteTestE
2cce0 70 69 6c 6f 67 75 65 20 7b 7d 20 7b 0d 0a 20 20  pilogue {} {..  
2ccf0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
2cd00 4f 54 45 3a 20 53 6b 69 70 20 72 75 6e 6e 69 6e  OTE: Skip runnin
2cd10 67 20 6f 75 72 20 63 75 73 74 6f 6d 20 65 70 69  g our custom epi
2cd20 6c 6f 67 75 65 20 69 66 20 74 68 65 20 6d 61 69  logue if the mai
2cd30 6e 20 6f 6e 65 20 68 61 73 20 62 65 65 6e 0d 0a  n one has been..
2cd40 20 20 20 20 20 20 23 20 20 20 20 20 20 20 73 6b        #       sk
2cd50 69 70 70 65 64 2e 0d 0a 20 20 20 20 20 20 23 0d  ipped...      #.
2cd60 0a 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66  .      if {![inf
2cd70 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 65 70  o exists ::no(ep
2cd80 69 6c 6f 67 75 65 2e 65 61 67 6c 65 29 5d 7d 20  ilogue.eagle)]} 
2cd90 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
2cda0 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
2cdb0 45 3a 20 53 68 6f 77 20 77 68 65 6e 20 6f 75 72  E: Show when our
2cdc0 20 74 65 73 74 73 20 61 63 74 75 61 6c 6c 79 20   tests actually 
2cdd0 65 6e 64 65 64 20 28 6e 6f 77 29 2e 0d 0a 20 20  ended (now)...  
2cde0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
2cdf0 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
2ce00 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
2ce10 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
2ce20 20 20 22 2d 2d 2d 2d 20 53 79 73 74 65 6d 2e 44    "---- System.D
2ce30 61 74 61 2e 53 51 4c 69 74 65 20 74 65 73 74 73  ata.SQLite tests
2ce40 20 65 6e 64 65 64 20 61 74 20 22 20 5c 0d 0a 20   ended at " \.. 
2ce50 20 20 20 20 20 20 20 20 20 20 20 5b 63 6c 6f 63             [cloc
2ce60 6b 20 66 6f 72 6d 61 74 20 5b 63 6c 6f 63 6b 20  k format [clock 
2ce70 73 65 63 6f 6e 64 73 5d 5d 20 5c 6e 5d 0d 0a 0d  seconds]] \n]...
2ce80 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
2ce90 20 20 20 20 23 20 4e 4f 54 45 3a 20 4c 6f 61 64      # NOTE: Load
2cea0 20 74 68 65 20 22 65 70 69 6c 6f 67 75 65 22 20   the "epilogue" 
2ceb0 63 75 73 74 6f 6d 20 70 65 72 2d 75 73 65 72 20  custom per-user 
2cec0 61 6e 64 2f 6f 72 20 70 65 72 2d 68 6f 73 74 20  and/or per-host 
2ced0 74 65 73 74 0d 0a 20 20 20 20 20 20 20 20 23 20  test..        # 
2cee0 20 20 20 20 20 20 73 65 74 74 69 6e 67 73 20 6e        settings n
2cef0 6f 77 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  ow...        #..
2cf00 20 20 20 20 20 20 20 20 75 70 6c 65 76 65 6c 20          uplevel 
2cf10 31 20 5b 6c 69 73 74 20 6c 6f 61 64 53 51 4c 69  1 [list loadSQLi
2cf20 74 65 54 65 73 74 53 65 74 74 69 6e 67 73 20 24  teTestSettings $
2cf30 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 2e  ::test_channel .
2cf40 65 70 69 6c 6f 67 75 65 5d 0d 0a 0d 0a 20 20 20  epilogue]....   
2cf50 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
2cf60 23 20 42 55 47 46 49 58 3a 20 42 65 66 6f 72 65  # BUGFIX: Before
2cf70 20 63 68 65 63 6b 69 6e 67 20 74 68 65 20 66 69   checking the fi
2cf80 6e 61 6c 20 72 65 73 6f 75 72 63 65 73 20 69 6e  nal resources in
2cf90 20 75 73 65 20 62 79 20 53 51 4c 69 74 65 2c 20   use by SQLite, 
2cfa0 6d 61 6b 65 0d 0a 20 20 20 20 20 20 20 20 23 20  make..        # 
2cfb0 20 20 20 20 20 20 20 20 73 75 72 65 20 62 6f 74          sure bot
2cfc0 68 20 6f 66 20 74 68 65 20 50 52 41 47 4d 41 20  h of the PRAGMA 
2cfd0 72 65 6c 61 74 65 64 20 64 69 72 65 63 74 6f 72  related director
2cfe0 79 20 6e 61 6d 65 73 20 61 72 65 20 66 72 65 65  y names are free
2cff0 64 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  d...        #.. 
2d000 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72 53         checkForS
2d010 51 4c 69 74 65 44 69 72 65 63 74 6f 72 69 65 73  QLiteDirectories
2d020 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
2d030 20 74 72 75 65 0d 0a 0d 0a 20 20 20 20 20 20 20   true....       
2d040 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
2d050 54 45 3a 20 41 6c 73 6f 20 72 65 70 6f 72 74 20  TE: Also report 
2d060 74 68 65 20 72 65 73 6f 75 72 63 65 20 75 73 61  the resource usa
2d070 67 65 20 61 66 74 65 72 20 72 75 6e 6e 69 6e 67  ge after running
2d080 20 74 68 65 20 74 65 73 74 73 2e 0d 0a 20 20 20   the tests...   
2d090 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
2d0a0 72 65 70 6f 72 74 53 51 4c 69 74 65 52 65 73 6f  reportSQLiteReso
2d0b0 75 72 63 65 73 20 24 3a 3a 74 65 73 74 5f 63 68  urces $::test_ch
2d0c0 61 6e 6e 65 6c 0d 0a 0d 0a 20 20 20 20 20 20 20  annel....       
2d0d0 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
2d0e0 54 45 3a 20 52 65 70 6f 72 74 20 74 68 65 20 63  TE: Report the c
2d0f0 72 69 74 69 63 61 6c 20 68 61 6e 64 6c 65 20 63  ritical handle c
2d100 6f 75 6e 74 73 20 61 66 74 65 72 20 72 75 6e 6e  ounts after runn
2d110 69 6e 67 20 74 68 65 20 74 65 73 74 73 2e 0d 0a  ing the tests...
2d120 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
2d130 20 20 20 67 65 74 53 51 4c 69 74 65 48 61 6e 64     getSQLiteHand
2d140 6c 65 43 6f 75 6e 74 73 20 24 3a 3a 74 65 73 74  leCounts $::test
2d150 5f 63 68 61 6e 6e 65 6c 0d 0a 0d 0a 20 20 20 20  _channel....    
2d160 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
2d170 20 4e 4f 54 45 3a 20 49 66 20 6e 65 63 65 73 73   NOTE: If necess
2d180 61 72 79 2c 20 64 69 73 61 62 6c 65 20 73 68 61  ary, disable sha
2d190 72 65 64 2d 63 61 63 68 65 20 6d 6f 64 65 20 6e  red-cache mode n
2d1a0 6f 77 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  ow...        #..
2d1b0 20 20 20 20 20 20 20 20 69 66 20 7b 5b 68 61 73          if {[has
2d1c0 52 75 6e 74 69 6d 65 4f 70 74 69 6f 6e 20 73 68  RuntimeOption sh
2d1d0 61 72 65 64 43 61 63 68 65 5d 7d 20 74 68 65 6e  aredCache]} then
2d1e0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 65 6e   {..          en
2d1f0 61 62 6c 65 53 68 61 72 65 64 43 61 63 68 65 20  ableSharedCache 
2d200 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
2d210 66 61 6c 73 65 0d 0a 20 20 20 20 20 20 20 20 7d  false..        }
2d220 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d  ..      }..    }
2d230 0d 0a 0c 0d 0a 20 20 20 20 23 23 23 23 23 23 23  .....    #######
2d240 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2d250 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2d260 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2d270 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2d280 23 23 23 23 0d 0a 20 20 20 20 23 23 23 23 23 23  ####..    ######
2d290 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2d2a0 23 23 23 23 23 23 23 20 45 4e 44 20 45 61 67 6c  ####### END Eagl
2d2b0 65 20 4f 4e 4c 59 20 23 23 23 23 23 23 23 23 23  e ONLY #########
2d2c0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2d2d0 23 23 23 23 23 0d 0a 20 20 20 20 23 23 23 23 23  #####..    #####
2d2e0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2d2f0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2d300 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2d310 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2d320 23 23 23 23 23 23 0d 0a 20 20 7d 0d 0a 0d 0a 20  ######..  }.... 
2d330 20 23 0d 0a 20 20 23 20 4e 4f 54 45 3a 20 53 61   #..  # NOTE: Sa
2d340 76 65 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  ve the name of t
2d350 68 65 20 64 69 72 65 63 74 6f 72 79 20 63 6f 6e  he directory con
2d360 74 61 69 6e 69 6e 67 20 74 68 69 73 20 66 69 6c  taining this fil
2d370 65 2e 0d 0a 20 20 23 0d 0a 20 20 69 66 20 7b 21  e...  #..  if {!
2d380 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 63 6f 6d  [info exists com
2d390 6d 6f 6e 5f 64 69 72 65 63 74 6f 72 79 5d 7d 20  mon_directory]} 
2d3a0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 73 65 74 20  then {..    set 
2d3b0 63 6f 6d 6d 6f 6e 5f 64 69 72 65 63 74 6f 72 79  common_directory
2d3c0 20 5b 66 69 6c 65 20 64 69 72 6e 61 6d 65 20 5b   [file dirname [
2d3d0 69 6e 66 6f 20 73 63 72 69 70 74 5d 5d 0d 0a 20  info script]].. 
2d3e0 20 7d 0d 0a 0d 0a 20 20 23 0d 0a 20 20 23 20 4e   }....  #..  # N
2d3f0 4f 54 45 3a 20 50 72 6f 76 69 64 65 20 74 68 65  OTE: Provide the
2d400 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c   System.Data.SQL
2d410 69 74 65 20 74 65 73 74 20 70 61 63 6b 61 67 65  ite test package
2d420 20 74 6f 20 74 68 65 20 69 6e 74 65 72 70 72 65   to the interpre
2d430 74 65 72 2e 0d 0a 20 20 23 0d 0a 20 20 70 61 63  ter...  #..  pac
2d440 6b 61 67 65 20 70 72 6f 76 69 64 65 20 53 79 73  kage provide Sys
2d450 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e  tem.Data.SQLite.
2d460 54 65 73 74 20 31 2e 30 0d 0a 7d 0d 0a           Test 1.0..}..