System.Data.SQLite
Hex Artifact Content
Not logged in

Artifact 12441f71f4ded0a99502ab9562d2003ff4405df1:


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 42 75 69 6c 64 59 65 61 72 20 7b 7d 20 7b  etBuildYear {} {
0340: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
0350: 20 23 20 4e 4f 54 45 3a 20 53 65 65 20 69 66 20   # NOTE: See if 
0360: 74 68 65 20 22 79 65 61 72 22 20 73 65 74 74 69  the "year" setti
0370: 6e 67 20 68 61 73 20 62 65 65 6e 20 6f 76 65 72  ng has been over
0380: 72 69 64 64 65 6e 20 62 79 20 74 68 65 20 75 73  ridden by the us
0390: 65 72 20 28 65 2e 67 2e 0d 0a 20 20 20 20 20 20  er (e.g...      
03a0: 23 20 20 20 20 20 20 20 6f 6e 20 74 68 65 20 63  #       on the c
03b0: 6f 6d 6d 61 6e 64 20 6c 69 6e 65 29 2e 20 20 54  ommand line).  T
03c0: 68 69 73 20 68 65 6c 70 73 20 63 6f 6e 74 72 6f  his helps contro
03d0: 6c 20 65 78 61 63 74 6c 79 20 77 68 69 63 68 20  l exactly which 
03e0: 73 65 74 20 6f 66 0d 0a 20 20 20 20 20 20 23 20  set of..      # 
03f0: 20 20 20 20 20 20 62 69 6e 61 72 69 65 73 20 77        binaries w
0400: 65 20 61 72 65 20 74 65 73 74 69 6e 67 2c 20 74  e are testing, t
0410: 68 6f 73 65 20 70 72 6f 64 75 63 65 64 20 75 73  hose produced us
0420: 69 6e 67 20 74 68 65 20 56 69 73 75 61 6c 20 53  ing the Visual S
0430: 74 75 64 69 6f 0d 0a 20 20 20 20 20 20 23 20 20  tudio..      #  
0440: 20 20 20 20 20 32 30 30 35 2c 20 32 30 30 38 2c       2005, 2008,
0450: 20 32 30 31 30 2c 20 32 30 31 32 2c 20 6f 72 20   2010, 2012, or 
0460: 32 30 31 33 20 62 75 69 6c 64 20 73 79 73 74 65  2013 build syste
0470: 6d 73 2e 20 20 54 6f 20 6f 76 65 72 72 69 64 65  ms.  To override
0480: 20 74 68 69 73 0d 0a 20 20 20 20 20 20 23 20 20   this..      #  
0490: 20 20 20 20 20 76 61 6c 75 65 20 76 69 61 20 74       value via t
04a0: 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 2c  he command line,
04b0: 20 65 6e 74 65 72 20 61 20 63 6f 6d 6d 61 6e 64   enter a command
04c0: 20 73 69 6d 69 6c 61 72 20 74 6f 20 6f 6e 65 20   similar to one 
04d0: 6f 66 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  of..      #     
04e0: 20 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20    the following 
04f0: 28 61 6c 6c 20 6f 6e 20 6f 6e 65 20 6c 69 6e 65  (all on one line
0500: 29 3a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  ):..      #..   
0510: 20 20 20 23 20 20 20 20 20 20 20 45 61 67 6c 65     #       Eagle
0520: 53 68 65 6c 6c 2e 65 78 65 20 2d 61 6e 79 49 6e  Shell.exe -anyIn
0530: 69 74 69 61 6c 69 7a 65 20 22 73 65 74 20 74 65  itialize "set te
0540: 73 74 5f 79 65 61 72 20 32 30 30 35 22 0d 0a 20  st_year 2005".. 
0550: 20 20 20 20 20 23 20 20 20 20 20 20 20 20 20 2d       #         -
0560: 66 69 6c 65 20 2e 5c 70 61 74 68 5c 74 6f 5c 61  file .\path\to\a
0570: 6c 6c 2e 65 61 67 6c 65 0d 0a 20 20 20 20 20 20  ll.eagle..      
0580: 23 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  #..      #      
0590: 20 45 61 67 6c 65 53 68 65 6c 6c 2e 65 78 65 20   EagleShell.exe 
05a0: 2d 61 6e 79 49 6e 69 74 69 61 6c 69 7a 65 20 22  -anyInitialize "
05b0: 73 65 74 20 74 65 73 74 5f 79 65 61 72 20 32 30  set test_year 20
05c0: 30 38 22 0d 0a 20 20 20 20 20 20 23 20 20 20 20  08"..      #    
05d0: 20 20 20 20 20 2d 66 69 6c 65 20 2e 5c 70 61 74       -file .\pat
05e0: 68 5c 74 6f 5c 61 6c 6c 2e 65 61 67 6c 65 0d 0a  h\to\all.eagle..
05f0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
0600: 20 20 20 20 20 20 20 45 61 67 6c 65 53 68 65 6c         EagleShel
0610: 6c 2e 65 78 65 20 2d 61 6e 79 49 6e 69 74 69 61  l.exe -anyInitia
0620: 6c 69 7a 65 20 22 73 65 74 20 74 65 73 74 5f 79  lize "set test_y
0630: 65 61 72 20 32 30 31 30 22 0d 0a 20 20 20 20 20  ear 2010"..     
0640: 20 23 20 20 20 20 20 20 20 20 20 2d 66 69 6c 65   #         -file
0650: 20 2e 5c 70 61 74 68 5c 74 6f 5c 61 6c 6c 2e 65   .\path\to\all.e
0660: 61 67 6c 65 0d 0a 20 20 20 20 20 20 23 0d 0a 20  agle..      #.. 
0670: 20 20 20 20 20 23 20 20 20 20 20 20 20 45 61 67       #       Eag
0680: 6c 65 53 68 65 6c 6c 2e 65 78 65 20 2d 61 6e 79  leShell.exe -any
0690: 49 6e 69 74 69 61 6c 69 7a 65 20 22 73 65 74 20  Initialize "set 
06a0: 74 65 73 74 5f 79 65 61 72 20 32 30 31 32 22 0d  test_year 2012".
06b0: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 20  .      #        
06c0: 20 2d 66 69 6c 65 20 2e 5c 70 61 74 68 5c 74 6f   -file .\path\to
06d0: 5c 61 6c 6c 2e 65 61 67 6c 65 0d 0a 20 20 20 20  \all.eagle..    
06e0: 20 20 23 0d 0a 20 20 20 20 20 20 23 20 20 20 20    #..      #    
06f0: 20 20 20 45 61 67 6c 65 53 68 65 6c 6c 2e 65 78     EagleShell.ex
0700: 65 20 2d 61 6e 79 49 6e 69 74 69 61 6c 69 7a 65  e -anyInitialize
0710: 20 22 73 65 74 20 74 65 73 74 5f 79 65 61 72 20   "set test_year 
0720: 32 30 31 33 22 0d 0a 20 20 20 20 20 20 23 20 20  2013"..      #  
0730: 20 20 20 20 20 20 20 2d 66 69 6c 65 20 2e 5c 70         -file .\p
0740: 61 74 68 5c 74 6f 5c 61 6c 6c 2e 65 61 67 6c 65  ath\to\all.eagle
0750: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
0760: 20 23 20 20 20 20 20 20 20 45 61 67 6c 65 53 68   #       EagleSh
0770: 65 6c 6c 2e 65 78 65 20 2d 61 6e 79 49 6e 69 74  ell.exe -anyInit
0780: 69 61 6c 69 7a 65 20 22 75 6e 73 65 74 20 2d 6e  ialize "unset -n
0790: 6f 63 6f 6d 70 6c 61 69 6e 20 74 65 73 74 5f 79  ocomplain test_y
07a0: 65 61 72 22 0d 0a 20 20 20 20 20 20 23 20 20 20  ear"..      #   
07b0: 20 20 20 20 20 20 2d 66 69 6c 65 20 2e 5c 70 61        -file .\pa
07c0: 74 68 5c 74 6f 5c 61 6c 6c 2e 65 61 67 6c 65 0d  th\to\all.eagle.
07d0: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
07e0: 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73  if {[info exists
07f0: 20 3a 3a 74 65 73 74 5f 79 65 61 72 5d 20 26 26   ::test_year] &&
0800: 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20   [string length 
0810: 24 3a 3a 74 65 73 74 5f 79 65 61 72 5d 20 3e 20  $::test_year] > 
0820: 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
0830: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
0840: 4e 4f 54 45 3a 20 55 73 65 20 74 68 65 20 73 70  NOTE: Use the sp
0850: 65 63 69 66 69 65 64 20 74 65 73 74 20 79 65 61  ecified test yea
0860: 72 2e 20 20 49 66 20 74 68 69 73 20 76 61 72 69  r.  If this vari
0870: 61 62 6c 65 20 69 73 20 6e 6f 74 20 73 65 74 2c  able is not set,
0880: 20 74 68 65 0d 0a 20 20 20 20 20 20 20 20 23 20   the..        # 
0890: 20 20 20 20 20 20 64 65 66 61 75 6c 74 20 76 61        default va
08a0: 6c 75 65 20 77 69 6c 6c 20 62 65 20 62 61 73 65  lue will be base
08b0: 64 20 6f 6e 20 77 68 65 74 68 65 72 20 6f 72 20  d on whether or 
08c0: 6e 6f 74 20 45 61 67 6c 65 20 68 61 73 20 62 65  not Eagle has be
08d0: 65 6e 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  en..        #   
08e0: 20 20 20 20 63 6f 6d 70 69 6c 65 64 20 61 67 61      compiled aga
08f0: 69 6e 73 74 20 74 68 65 20 43 4c 52 20 76 32 2e  inst the CLR v2.
0900: 30 20 6f 72 20 43 4c 52 20 76 34 2e 30 2e 0d 0a  0 or CLR v4.0...
0910: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
0920: 20 20 20 72 65 74 75 72 6e 20 24 3a 3a 74 65 73     return $::tes
0930: 74 5f 79 65 61 72 0d 0a 20 20 20 20 20 20 7d 20  t_year..      } 
0940: 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
0950: 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
0960: 45 3a 20 49 66 20 45 61 67 6c 65 20 68 61 73 20  E: If Eagle has 
0970: 62 65 65 6e 20 63 6f 6d 70 69 6c 65 64 20 61 67  been compiled ag
0980: 61 69 6e 73 74 20 74 68 65 20 43 4c 52 20 76 34  ainst the CLR v4
0990: 2e 30 2c 20 75 73 65 20 22 32 30 31 30 22 20 62  .0, use "2010" b
09a0: 79 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  y..        #    
09b0: 20 20 20 64 65 66 61 75 6c 74 20 28 77 65 20 63     default (we c
09c0: 6f 75 6c 64 20 75 73 65 20 22 32 30 31 32 22 20  ould use "2012" 
09d0: 6f 72 20 22 32 30 31 33 22 20 69 6e 20 74 68 61  or "2013" in tha
09e0: 74 20 63 61 73 65 20 61 73 20 77 65 6c 6c 29 20  t case as well) 
09f0: 61 73 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  as..        #   
0a00: 20 20 20 20 74 68 65 20 74 65 73 74 20 79 65 61      the test yea
0a10: 72 3b 20 6f 74 68 65 72 77 69 73 65 2c 20 75 73  r; otherwise, us
0a20: 65 20 22 32 30 30 38 22 20 62 79 20 64 65 66 61  e "2008" by defa
0a30: 75 6c 74 20 28 77 65 20 63 6f 75 6c 64 20 75 73  ult (we could us
0a40: 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  e..        #    
0a50: 20 20 20 22 32 30 30 35 22 20 69 6e 20 74 68 61     "2005" in tha
0a60: 74 20 63 61 73 65 20 61 73 20 77 65 6c 6c 29 2e  t case as well).
0a70: 20 20 49 66 20 61 6e 6f 74 68 65 72 20 6d 61 6a    If another maj
0a80: 6f 72 20 5b 69 6e 63 6f 6d 70 61 74 69 62 6c 65  or [incompatible
0a90: 5d 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  ]..        #    
0aa0: 20 20 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68     version of th
0ab0: 65 20 43 4c 52 20 69 73 20 72 65 6c 65 61 73 65  e CLR is release
0ac0: 64 2c 20 74 68 69 73 20 63 68 65 63 6b 20 77 69  d, this check wi
0ad0: 6c 6c 20 68 61 76 65 20 74 6f 20 62 65 0d 0a 20  ll have to be.. 
0ae0: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63         #       c
0af0: 68 61 6e 67 65 64 2e 20 20 54 68 65 20 64 65 66  hanged.  The def
0b00: 61 75 6c 74 20 74 65 73 74 20 79 65 61 72 20 74  ault test year t
0b10: 6f 20 75 73 65 20 66 6f 72 20 61 20 70 61 72 74  o use for a part
0b20: 69 63 75 6c 61 72 20 43 4c 52 0d 0a 20 20 20 20  icular CLR..    
0b30: 20 20 20 20 23 20 20 20 20 20 20 20 76 65 72 73      #       vers
0b40: 69 6f 6e 20 6d 61 79 20 62 65 20 6f 76 65 72 72  ion may be overr
0b50: 69 64 64 65 6e 20 62 79 20 73 65 74 74 69 6e 67  idden by setting
0b60: 20 74 68 65 20 67 6c 6f 62 61 6c 20 76 61 72 69   the global vari
0b70: 61 62 6c 65 0d 0a 20 20 20 20 20 20 20 20 23 20  able..        # 
0b80: 20 20 20 20 20 20 22 74 65 73 74 5f 79 65 61 72        "test_year
0b90: 5f 63 6c 72 5f 76 24 58 22 2c 20 77 68 65 72 65  _clr_v$X", where
0ba0: 20 22 24 58 22 20 6d 61 79 20 5b 63 75 72 72 65   "$X" may [curre
0bb0: 6e 74 6c 79 5d 20 62 65 20 65 69 74 68 65 72 20  ntly] be either 
0bc0: 22 32 22 0d 0a 20 20 20 20 20 20 20 20 23 20 20  "2"..        #  
0bd0: 20 20 20 20 20 6f 72 20 22 34 22 2e 0d 0a 20 20       or "4"...  
0be0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
0bf0: 20 69 66 20 7b 5b 68 61 76 65 43 6f 6e 73 74 72   if {[haveConstr
0c00: 61 69 6e 74 20 69 6d 61 67 65 52 75 6e 74 69 6d  aint imageRuntim
0c10: 65 34 30 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  e40]} then {..  
0c20: 20 20 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66          if {[inf
0c30: 6f 20 65 78 69 73 74 73 20 3a 3a 74 65 73 74 5f  o exists ::test_
0c40: 79 65 61 72 5f 63 6c 72 5f 76 34 5d 20 26 26 20  year_clr_v4] && 
0c50: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
0c60: 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20   [string length 
0c70: 24 3a 3a 74 65 73 74 5f 79 65 61 72 5f 63 6c 72  $::test_year_clr
0c80: 5f 76 34 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b  _v4] > 0} then {
0c90: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 0d  ..            #.
0ca0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4e  .            # N
0cb0: 4f 54 45 3a 20 55 73 65 20 74 68 65 20 73 70 65  OTE: Use the spe
0cc0: 63 69 66 69 65 64 20 74 65 73 74 20 79 65 61 72  cified test year
0cd0: 20 66 6f 72 20 74 68 65 20 43 4c 52 20 76 34 2e   for the CLR v4.
0ce0: 30 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  0...            
0cf0: 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  #..            r
0d00: 65 74 75 72 6e 20 24 3a 3a 74 65 73 74 5f 79 65  eturn $::test_ye
0d10: 61 72 5f 63 6c 72 5f 76 34 0d 0a 20 20 20 20 20  ar_clr_v4..     
0d20: 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
0d30: 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
0d40: 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45            # NOTE
0d50: 3a 20 55 73 65 20 74 68 65 20 64 65 66 61 75 6c  : Use the defaul
0d60: 74 20 74 65 73 74 20 79 65 61 72 20 66 6f 72 20  t test year for 
0d70: 74 68 65 20 43 4c 52 20 76 34 2e 30 2e 0d 0a 20  the CLR v4.0... 
0d80: 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
0d90: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
0da0: 20 32 30 31 30 3b 20 23 20 54 4f 44 4f 3a 20 47   2010; # TODO: G
0db0: 6f 6f 64 20 22 66 61 6c 6c 62 61 63 6b 22 20 64  ood "fallback" d
0dc0: 65 66 61 75 6c 74 3f 0d 0a 20 20 20 20 20 20 20  efault?..       
0dd0: 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 20     }..        } 
0de0: 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
0df0: 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73    if {[info exis
0e00: 74 73 20 3a 3a 74 65 73 74 5f 79 65 61 72 5f 63  ts ::test_year_c
0e10: 6c 72 5f 76 32 5d 20 26 26 20 5c 0d 0a 20 20 20  lr_v2] && \..   
0e20: 20 20 20 20 20 20 20 20 20 20 20 5b 73 74 72 69             [stri
0e30: 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a 74 65 73  ng length $::tes
0e40: 74 5f 79 65 61 72 5f 63 6c 72 5f 76 32 5d 20 3e  t_year_clr_v2] >
0e50: 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
0e60: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
0e70: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 55         # NOTE: U
0e80: 73 65 20 74 68 65 20 73 70 65 63 69 66 69 65 64  se the specified
0e90: 20 74 65 73 74 20 79 65 61 72 20 66 6f 72 20 74   test year for t
0ea0: 68 65 20 43 4c 52 20 76 32 2e 30 2e 0d 0a 20 20  he CLR v2.0...  
0eb0: 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
0ec0: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
0ed0: 24 3a 3a 74 65 73 74 5f 79 65 61 72 5f 63 6c 72  $::test_year_clr
0ee0: 5f 76 32 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  _v2..          }
0ef0: 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
0f00: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
0f10: 20 20 20 20 23 20 4e 4f 54 45 3a 20 55 73 65 20      # NOTE: Use 
0f20: 74 68 65 20 64 65 66 61 75 6c 74 20 74 65 73 74  the default test
0f30: 20 79 65 61 72 20 66 6f 72 20 74 68 65 20 43 4c   year for the CL
0f40: 52 20 76 32 2e 30 2e 0d 0a 20 20 20 20 20 20 20  R v2.0...       
0f50: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
0f60: 20 20 20 20 72 65 74 75 72 6e 20 32 30 30 38 3b      return 2008;
0f70: 20 23 20 54 4f 44 4f 3a 20 47 6f 6f 64 20 22 66   # TODO: Good "f
0f80: 61 6c 6c 62 61 63 6b 22 20 64 65 66 61 75 6c 74  allback" default
0f90: 3f 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  ?..          }..
0fa0: 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
0fb0: 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20   }..    }.....  
0fc0: 20 20 70 72 6f 63 20 67 65 74 42 75 69 6c 64 59    proc getBuildY
0fd0: 65 61 72 73 20 7b 7d 20 7b 0d 0a 20 20 20 20 20  ears {} {..     
0fe0: 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
0ff0: 3a 20 53 65 65 20 69 66 20 74 68 65 20 6c 69 73  : See if the lis
1000: 74 20 6f 66 20 74 65 73 74 20 79 65 61 72 73 20  t of test years 
1010: 68 61 73 20 62 65 65 6e 20 6f 76 65 72 72 69 64  has been overrid
1020: 64 65 6e 20 62 79 20 74 68 65 20 75 73 65 72 0d  den by the user.
1030: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 28  .      #       (
1040: 65 2e 67 2e 20 6f 6e 20 74 68 65 20 63 6f 6d 6d  e.g. on the comm
1050: 61 6e 64 20 6c 69 6e 65 29 2e 0d 0a 20 20 20 20  and line)...    
1060: 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b    #..      if {[
1070: 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 74 65  info exists ::te
1080: 73 74 5f 79 65 61 72 73 5d 20 26 26 20 5b 6c 6c  st_years] && [ll
1090: 65 6e 67 74 68 20 24 3a 3a 74 65 73 74 5f 79 65  ength $::test_ye
10a0: 61 72 73 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b  ars] > 0} then {
10b0: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
10c0: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 55 73 65       # NOTE: Use
10d0: 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 6c   the specified l
10e0: 69 73 74 20 6f 66 20 74 65 73 74 20 79 65 61 72  ist of test year
10f0: 73 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  s...        #.. 
1100: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 3a         return $:
1110: 3a 74 65 73 74 5f 79 65 61 72 73 0d 0a 20 20 20  :test_years..   
1120: 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
1130: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
1140: 23 20 4e 4f 54 45 3a 20 55 73 65 20 74 68 65 20  # NOTE: Use the 
1150: 64 65 66 61 75 6c 74 20 6c 69 73 74 20 6f 66 20  default list of 
1160: 74 65 73 74 20 79 65 61 72 73 20 28 69 2e 65 2e  test years (i.e.
1170: 20 61 6c 6c 29 2e 0d 0a 20 20 20 20 20 20 20 20   all)...        
1180: 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  #..        retur
1190: 6e 20 5b 6c 69 73 74 20 32 30 30 35 20 32 30 30  n [list 2005 200
11a0: 38 20 32 30 31 30 20 32 30 31 32 20 32 30 31 33  8 2010 2012 2013
11b0: 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  ]..      }..    
11c0: 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67  }.....    proc g
11d0: 65 74 42 75 69 6c 64 4e 65 74 46 78 20 7b 7d 20  etBuildNetFx {} 
11e0: 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  {..      #..    
11f0: 20 20 23 20 4e 4f 54 45 3a 20 53 65 65 20 69 66    # NOTE: See if
1200: 20 74 68 65 20 74 65 73 74 20 2e 4e 45 54 20 46   the test .NET F
1210: 72 61 6d 65 77 6f 72 6b 20 73 65 74 74 69 6e 67  ramework setting
1220: 20 68 61 73 20 62 65 65 6e 20 6f 76 65 72 72 69   has been overri
1230: 64 64 65 6e 20 62 79 0d 0a 20 20 20 20 20 20 23  dden by..      #
1240: 20 20 20 20 20 20 20 74 68 65 20 75 73 65 72 20         the user 
1250: 28 65 2e 67 2e 20 6f 6e 20 74 68 65 20 63 6f 6d  (e.g. on the com
1260: 6d 61 6e 64 20 6c 69 6e 65 29 2e 0d 0a 20 20 20  mand line)...   
1270: 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
1280: 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 74  [info exists ::t
1290: 65 73 74 5f 6e 65 74 5f 66 78 5d 20 26 26 20 5c  est_net_fx] && \
12a0: 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 73 74 72  ..          [str
12b0: 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a 74 65  ing length $::te
12c0: 73 74 5f 6e 65 74 5f 66 78 5d 20 3e 20 30 7d 20  st_net_fx] > 0} 
12d0: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
12e0: 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
12f0: 45 3a 20 55 73 65 20 74 68 65 20 73 70 65 63 69  E: Use the speci
1300: 66 69 65 64 20 74 65 73 74 20 2e 4e 45 54 20 46  fied test .NET F
1310: 72 61 6d 65 77 6f 72 6b 2e 0d 0a 20 20 20 20 20  ramework...     
1320: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65     #..        re
1330: 74 75 72 6e 20 24 3a 3a 74 65 73 74 5f 6e 65 74  turn $::test_net
1340: 5f 66 78 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73  _fx..      } els
1350: 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 65 74  e {..        set
1360: 20 79 65 61 72 20 5b 67 65 74 42 75 69 6c 64 59   year [getBuildY
1370: 65 61 72 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  ear]....        
1380: 73 77 69 74 63 68 20 2d 65 78 61 63 74 20 2d 2d  switch -exact --
1390: 20 24 79 65 61 72 20 7b 0d 0a 20 20 20 20 20 20   $year {..      
13a0: 20 20 20 20 32 30 30 35 20 7b 0d 0a 20 20 20 20      2005 {..    
13b0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 6e          return n
13c0: 65 74 46 78 32 30 0d 0a 20 20 20 20 20 20 20 20  etFx20..        
13d0: 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 32    }..          2
13e0: 30 30 38 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  008 {..         
13f0: 20 20 20 72 65 74 75 72 6e 20 6e 65 74 46 78 33     return netFx3
1400: 35 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  5..          }..
1410: 20 20 20 20 20 20 20 20 20 20 32 30 31 30 20 7b            2010 {
1420: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65  ..            re
1430: 74 75 72 6e 20 6e 65 74 46 78 34 30 0d 0a 20 20  turn netFx40..  
1440: 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
1450: 20 20 20 20 20 32 30 31 32 20 7b 0d 0a 20 20 20       2012 {..   
1460: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
1470: 6e 65 74 46 78 34 35 0d 0a 20 20 20 20 20 20 20  netFx45..       
1480: 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
1490: 32 30 31 33 20 7b 0d 0a 20 20 20 20 20 20 20 20  2013 {..        
14a0: 20 20 20 20 72 65 74 75 72 6e 20 6e 65 74 46 78      return netFx
14b0: 34 35 31 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  451..          }
14c0: 0d 0a 20 20 20 20 20 20 20 20 20 20 64 65 66 61  ..          defa
14d0: 75 6c 74 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  ult {..         
14e0: 20 20 20 72 65 74 75 72 6e 20 6e 65 74 46 78 33     return netFx3
14f0: 35 3b 20 23 20 54 4f 44 4f 3a 20 47 6f 6f 64 20  5; # TODO: Good 
1500: 22 66 61 6c 6c 62 61 63 6b 22 20 64 65 66 61 75  "fallback" defau
1510: 6c 74 3f 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  lt?..          }
1520: 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20  ..        }..   
1530: 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a     }..    }.....
1540: 20 20 20 20 23 0d 0a 20 20 20 20 23 20 4e 4f 54      #..    # NOT
1550: 45 3a 20 54 68 69 73 20 70 72 6f 63 65 64 75 72  E: This procedur
1560: 65 20 73 68 6f 75 6c 64 20 72 65 74 75 72 6e 20  e should return 
1570: 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 20  non-zero if the 
1580: 63 6f 6e 66 69 67 75 72 65 64 20 74 65 73 74 0d  configured test.
1590: 0a 20 20 20 20 23 20 20 20 20 20 20 20 70 6c 61  .    #       pla
15a0: 74 66 6f 72 6d 20 69 73 20 6d 6f 73 74 20 6c 69  tform is most li
15b0: 6b 65 6c 79 20 74 68 65 20 64 65 66 61 75 6c 74  kely the default
15c0: 20 66 6f 72 20 74 68 69 73 20 6d 61 63 68 69 6e   for this machin
15d0: 65 2e 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20 70  e...    #..    p
15e0: 72 6f 63 20 69 73 44 65 66 61 75 6c 74 42 75 69  roc isDefaultBui
15f0: 6c 64 50 6c 61 74 66 6f 72 6d 20 7b 20 7b 76 65  ldPlatform { {ve
1600: 72 62 6f 73 65 20 66 61 6c 73 65 7d 20 7d 20 7b  rbose false} } {
1610: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
1620: 20 23 20 4e 4f 54 45 3a 20 52 75 6e 6e 69 6e 67   # NOTE: Running
1630: 20 6f 6e 20 57 6f 57 36 34 20 69 73 20 6e 65 76   on WoW64 is nev
1640: 65 72 20 74 68 65 20 64 65 66 61 75 6c 74 20 70  er the default p
1650: 6c 61 74 66 6f 72 6d 2e 0d 0a 20 20 20 20 20 20  latform...      
1660: 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 73  #..      if {[is
1670: 52 75 6e 6e 69 6e 67 57 6f 57 36 34 5d 7d 20 74  RunningWoW64]} t
1680: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 69  hen {..        i
1690: 66 20 7b 24 76 65 72 62 6f 73 65 7d 20 74 68 65  f {$verbose} the
16a0: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74  n {..          t
16b0: 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
16c0: 6e 6e 65 6c 20 5c 0d 0a 20 20 20 20 20 20 20 20  nnel \..        
16d0: 20 20 20 20 20 20 22 2d 2d 2d 2d 20 64 65 74 65        "---- dete
16e0: 63 74 65 64 20 6e 6f 6e 2d 64 65 66 61 75 6c 74  cted non-default
16f0: 20 70 6c 61 74 66 6f 72 6d 20 28 57 6f 57 36 34   platform (WoW64
1700: 29 5c 6e 22 0d 0a 20 20 20 20 20 20 20 20 7d 0d  )\n"..        }.
1710: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
1720: 66 61 6c 73 65 0d 0a 20 20 20 20 20 20 7d 0d 0a  false..      }..
1730: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
1740: 20 23 20 4e 4f 54 45 3a 20 54 68 69 73 20 68 61   # NOTE: This ha
1750: 73 20 61 20 67 6f 6f 64 20 63 68 61 6e 63 65 20  s a good chance 
1760: 6f 66 20 62 65 69 6e 67 20 74 68 65 20 64 65 66  of being the def
1770: 61 75 6c 74 20 70 6c 61 74 66 6f 72 6d 2e 0d 0a  ault platform...
1780: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69        #..      i
1790: 66 20 7b 24 76 65 72 62 6f 73 65 7d 20 74 68 65  f {$verbose} the
17a0: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75  n {..        tpu
17b0: 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
17c0: 65 6c 20 22 2d 2d 2d 2d 20 64 65 74 65 63 74 65  el "---- detecte
17d0: 64 20 64 65 66 61 75 6c 74 20 70 6c 61 74 66 6f  d default platfo
17e0: 72 6d 5c 6e 22 0d 0a 20 20 20 20 20 20 7d 0d 0a  rm\n"..      }..
17f0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 72 75        return tru
1800: 65 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  e..    }.....   
1810: 20 70 72 6f 63 20 67 65 74 42 75 69 6c 64 50 6c   proc getBuildPl
1820: 61 74 66 6f 72 6d 20 7b 20 6e 61 74 69 76 65 20  atform { native 
1830: 7d 20 7b 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b  } {..      if {[
1840: 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 74 65  info exists ::te
1850: 73 74 5f 70 6c 61 74 66 6f 72 6d 5d 20 26 26 20  st_platform] && 
1860: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 73 74  \..          [st
1870: 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a 74  ring length $::t
1880: 65 73 74 5f 70 6c 61 74 66 6f 72 6d 5d 20 3e 20  est_platform] > 
1890: 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
18a0: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
18b0: 4e 4f 54 45 3a 20 55 73 65 20 74 68 65 20 73 70  NOTE: Use the sp
18c0: 65 63 69 66 69 65 64 20 74 65 73 74 20 70 6c 61  ecified test pla
18d0: 74 66 6f 72 6d 2e 20 20 49 66 20 74 68 69 73 20  tform.  If this 
18e0: 76 61 72 69 61 62 6c 65 20 69 73 20 6e 6f 74 20  variable is not 
18f0: 73 65 74 2c 0d 0a 20 20 20 20 20 20 20 20 23 20  set,..        # 
1900: 20 20 20 20 20 20 74 68 65 20 64 65 66 61 75 6c        the defaul
1910: 74 20 76 61 6c 75 65 20 77 69 6c 6c 20 62 65 20  t value will be 
1920: 62 61 73 65 64 20 6f 6e 20 74 68 65 20 6d 61 63  based on the mac
1930: 68 69 6e 65 20 61 72 63 68 69 74 65 63 74 75 72  hine architectur
1940: 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  e...        #.. 
1950: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b 65         return [e
1960: 78 70 72 20 7b 24 6e 61 74 69 76 65 20 3f 20 24  xpr {$native ? $
1970: 3a 3a 74 65 73 74 5f 70 6c 61 74 66 6f 72 6d 20  ::test_platform 
1980: 3a 20 22 22 7d 5d 0d 0a 20 20 20 20 20 20 7d 20  : ""}]..      } 
1990: 65 6c 73 65 69 66 20 7b 5b 69 6e 66 6f 20 65 78  elseif {[info ex
19a0: 69 73 74 73 20 3a 3a 74 65 73 74 5f 6d 61 63 68  ists ::test_mach
19b0: 69 6e 65 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20  ine] && \..     
19c0: 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e       [string len
19d0: 67 74 68 20 24 3a 3a 74 65 73 74 5f 6d 61 63 68  gth $::test_mach
19e0: 69 6e 65 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b  ine] > 0} then {
19f0: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
1a00: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 46 6f 72       # NOTE: For
1a10: 20 6e 61 74 69 76 65 20 62 75 69 6c 64 73 2c 20   native builds, 
1a20: 72 65 74 75 72 6e 20 74 68 65 20 70 6c 61 74 66  return the platf
1a30: 6f 72 6d 20 6e 61 6d 65 20 63 6f 72 72 65 73 70  orm name corresp
1a40: 6f 6e 64 69 6e 67 20 74 6f 0d 0a 20 20 20 20 20  onding to..     
1a50: 20 20 20 23 20 20 20 20 20 20 20 74 68 65 20 74     #       the t
1a60: 65 73 74 20 6d 61 63 68 69 6e 65 20 61 72 63 68  est machine arch
1a70: 69 74 65 63 74 75 72 65 3b 20 6f 74 68 65 72 77  itecture; otherw
1a80: 69 73 65 2c 20 72 65 74 75 72 6e 20 61 6e 20 65  ise, return an e
1a90: 6d 70 74 79 0d 0a 20 20 20 20 20 20 20 20 23 20  mpty..        # 
1aa0: 20 20 20 20 20 20 73 74 72 69 6e 67 2e 0d 0a 20        string... 
1ab0: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
1ac0: 20 20 72 65 74 75 72 6e 20 5b 65 78 70 72 20 7b    return [expr {
1ad0: 0d 0a 20 20 20 20 20 20 20 20 20 20 24 6e 61 74  ..          $nat
1ae0: 69 76 65 20 3f 20 5b 6d 61 63 68 69 6e 65 54 6f  ive ? [machineTo
1af0: 50 6c 61 74 66 6f 72 6d 20 24 3a 3a 74 65 73 74  Platform $::test
1b00: 5f 6d 61 63 68 69 6e 65 5d 20 3a 20 22 22 0d 0a  _machine] : ""..
1b10: 20 20 20 20 20 20 20 20 7d 5d 0d 0a 20 20 20 20          }]..    
1b20: 20 20 7d 20 65 6c 73 65 69 66 20 7b 5b 69 6e 66    } elseif {[inf
1b30: 6f 20 65 78 69 73 74 73 20 3a 3a 74 63 6c 5f 70  o exists ::tcl_p
1b40: 6c 61 74 66 6f 72 6d 28 6d 61 63 68 69 6e 65 29  latform(machine)
1b50: 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
1b60: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
1b70: 4e 4f 54 45 3a 20 46 6f 72 20 6e 61 74 69 76 65  NOTE: For native
1b80: 20 62 75 69 6c 64 73 2c 20 72 65 74 75 72 6e 20   builds, return 
1b90: 74 68 65 20 70 6c 61 74 66 6f 72 6d 20 6e 61 6d  the platform nam
1ba0: 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  e corresponding 
1bb0: 74 6f 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  to..        #   
1bc0: 20 20 20 20 74 68 65 20 6d 61 63 68 69 6e 65 20      the machine 
1bd0: 61 72 63 68 69 74 65 63 74 75 72 65 3b 20 6f 74  architecture; ot
1be0: 68 65 72 77 69 73 65 2c 20 72 65 74 75 72 6e 20  herwise, return 
1bf0: 61 6e 20 65 6d 70 74 79 20 73 74 72 69 6e 67 2e  an empty string.
1c00: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
1c10: 20 20 20 20 20 72 65 74 75 72 6e 20 5b 65 78 70       return [exp
1c20: 72 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 24  r {..          $
1c30: 6e 61 74 69 76 65 20 3f 20 5b 6d 61 63 68 69 6e  native ? [machin
1c40: 65 54 6f 50 6c 61 74 66 6f 72 6d 20 24 3a 3a 74  eToPlatform $::t
1c50: 63 6c 5f 70 6c 61 74 66 6f 72 6d 28 6d 61 63 68  cl_platform(mach
1c60: 69 6e 65 29 5d 20 3a 20 22 22 0d 0a 20 20 20 20  ine)] : ""..    
1c70: 20 20 20 20 7d 5d 0d 0a 20 20 20 20 20 20 7d 20      }]..      } 
1c80: 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
1c90: 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
1ca0: 45 3a 20 4e 6f 20 6d 61 63 68 69 6e 65 20 61 72  E: No machine ar
1cb0: 63 68 69 74 65 63 74 75 72 65 20 69 73 20 61 76  chitecture is av
1cc0: 61 69 6c 61 62 6c 65 2c 20 72 65 74 75 72 6e 20  ailable, return 
1cd0: 61 6e 20 65 6d 70 74 79 20 73 74 72 69 6e 67 2e  an empty string.
1ce0: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
1cf0: 20 20 49 74 20 69 73 20 69 6d 70 6f 72 74 61 6e    It is importan
1d00: 74 20 74 6f 20 72 65 74 75 72 6e 20 61 6e 20 65  t to return an e
1d10: 6d 70 74 79 20 73 74 72 69 6e 67 20 68 65 72 65  mpty string here
1d20: 20 62 65 63 61 75 73 65 20 74 68 65 0d 0a 20 20   because the..  
1d30: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 72 65        #       re
1d40: 73 75 6c 74 20 6f 66 20 74 68 69 73 20 70 72 6f  sult of this pro
1d50: 63 65 64 75 72 65 20 6d 61 79 20 62 65 20 75 73  cedure may be us
1d60: 65 64 20 77 69 74 68 20 5b 66 69 6c 65 20 6a 6f  ed with [file jo
1d70: 69 6e 5d 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  in]...        #.
1d80: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
1d90: 22 22 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20  ""..      }..   
1da0: 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
1db0: 67 65 74 42 75 69 6c 64 43 6f 6e 66 69 67 75 72  getBuildConfigur
1dc0: 61 74 69 6f 6e 20 7b 7d 20 7b 0d 0a 20 20 20 20  ation {} {..    
1dd0: 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
1de0: 45 3a 20 53 65 65 20 69 66 20 74 68 65 20 22 63  E: See if the "c
1df0: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 22 20 73 65  onfiguration" se
1e00: 74 74 69 6e 67 20 68 61 73 20 62 65 65 6e 20 6f  tting has been o
1e10: 76 65 72 72 69 64 64 65 6e 20 62 79 20 74 68 65  verridden by the
1e20: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
1e30: 75 73 65 72 20 28 65 2e 67 2e 20 6f 6e 20 74 68  user (e.g. on th
1e40: 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 29 2e  e command line).
1e50: 20 20 54 68 69 73 20 68 65 6c 70 73 20 63 6f 6e    This helps con
1e60: 74 72 6f 6c 20 65 78 61 63 74 6c 79 0d 0a 20 20  trol exactly..  
1e70: 20 20 20 20 23 20 20 20 20 20 20 20 77 68 69 63      #       whic
1e80: 68 20 73 65 74 20 6f 66 20 62 69 6e 61 72 69 65  h set of binarie
1e90: 73 20 77 65 20 61 72 65 20 74 65 73 74 69 6e 67  s we are testing
1ea0: 20 28 69 2e 65 2e 20 74 68 6f 73 65 20 62 75 69   (i.e. those bui
1eb0: 6c 74 20 69 6e 20 74 68 65 0d 0a 20 20 20 20 20  lt in the..     
1ec0: 20 23 20 20 20 20 20 20 20 22 44 65 62 75 67 22   #       "Debug"
1ed0: 20 6f 72 20 22 52 65 6c 65 61 73 65 22 20 62 75   or "Release" bu
1ee0: 69 6c 64 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  ild configuratio
1ef0: 6e 73 29 2e 20 20 54 6f 20 6f 76 65 72 72 69 64  ns).  To overrid
1f00: 65 20 74 68 69 73 0d 0a 20 20 20 20 20 20 23 20  e this..      # 
1f10: 20 20 20 20 20 20 76 61 6c 75 65 20 76 69 61 20        value via 
1f20: 74 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65  the command line
1f30: 2c 20 65 6e 74 65 72 20 61 20 63 6f 6d 6d 61 6e  , enter a comman
1f40: 64 20 73 69 6d 69 6c 61 72 20 74 6f 20 6f 6e 65  d similar to one
1f50: 20 6f 66 0d 0a 20 20 20 20 20 20 23 20 20 20 20   of..      #    
1f60: 20 20 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67     the following
1f70: 20 28 61 6c 6c 20 6f 6e 20 6f 6e 65 20 6c 69 6e   (all on one lin
1f80: 65 29 3a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  e):..      #..  
1f90: 20 20 20 20 23 20 20 20 20 20 20 20 45 61 67 6c      #       Eagl
1fa0: 65 53 68 65 6c 6c 2e 65 78 65 20 2d 61 6e 79 49  eShell.exe -anyI
1fb0: 6e 69 74 69 61 6c 69 7a 65 20 22 73 65 74 20 74  nitialize "set t
1fc0: 65 73 74 5f 63 6f 6e 66 69 67 75 72 61 74 69 6f  est_configuratio
1fd0: 6e 20 44 65 62 75 67 22 0d 0a 20 20 20 20 20 20  n Debug"..      
1fe0: 23 20 20 20 20 20 20 20 20 20 2d 66 69 6c 65 20  #         -file 
1ff0: 2e 5c 70 61 74 68 5c 74 6f 5c 61 6c 6c 2e 65 61  .\path\to\all.ea
2000: 67 6c 65 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  gle..      #..  
2010: 20 20 20 20 23 20 20 20 20 20 20 20 45 61 67 6c      #       Eagl
2020: 65 53 68 65 6c 6c 2e 65 78 65 20 2d 61 6e 79 49  eShell.exe -anyI
2030: 6e 69 74 69 61 6c 69 7a 65 20 22 73 65 74 20 74  nitialize "set t
2040: 65 73 74 5f 63 6f 6e 66 69 67 75 72 61 74 69 6f  est_configuratio
2050: 6e 20 52 65 6c 65 61 73 65 22 0d 0a 20 20 20 20  n Release"..    
2060: 20 20 23 20 20 20 20 20 20 20 20 20 2d 66 69 6c    #         -fil
2070: 65 20 2e 5c 70 61 74 68 5c 74 6f 5c 61 6c 6c 2e  e .\path\to\all.
2080: 65 61 67 6c 65 0d 0a 20 20 20 20 20 20 23 0d 0a  eagle..      #..
2090: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 45 61        #       Ea
20a0: 67 6c 65 53 68 65 6c 6c 2e 65 78 65 20 2d 66 69  gleShell.exe -fi
20b0: 6c 65 20 2e 5c 70 61 74 68 5c 74 6f 5c 61 6c 6c  le .\path\to\all
20c0: 2e 65 61 67 6c 65 20 2d 70 72 65 54 65 73 74 0d  .eagle -preTest.
20d0: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 20  .      #        
20e0: 20 22 75 6e 73 65 74 20 2d 6e 6f 63 6f 6d 70 6c   "unset -nocompl
20f0: 61 69 6e 20 74 65 73 74 5f 63 6f 6e 66 69 67 75  ain test_configu
2100: 72 61 74 69 6f 6e 22 0d 0a 20 20 20 20 20 20 23  ration"..      #
2110: 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66  ..      if {[inf
2120: 6f 20 65 78 69 73 74 73 20 3a 3a 74 65 73 74 5f  o exists ::test_
2130: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 5d 20 26  configuration] &
2140: 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b  & \..          [
2150: 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a  string length $:
2160: 3a 74 65 73 74 5f 63 6f 6e 66 69 67 75 72 61 74  :test_configurat
2170: 69 6f 6e 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b  ion] > 0} then {
2180: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
2190: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 55 73 65       # NOTE: Use
21a0: 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 74   the specified t
21b0: 65 73 74 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  est configuratio
21c0: 6e 2e 20 20 54 68 65 20 64 65 66 61 75 6c 74 20  n.  The default 
21d0: 76 61 6c 75 65 20 75 73 65 64 0d 0a 20 20 20 20  value used..    
21e0: 20 20 20 20 23 20 20 20 20 20 20 20 66 6f 72 20      #       for 
21f0: 74 68 69 73 20 76 61 72 69 61 62 6c 65 20 69 73  this variable is
2200: 20 74 79 70 69 63 61 6c 6c 79 20 22 52 65 6c 65   typically "Rele
2210: 61 73 65 22 2c 20 61 73 20 73 65 74 20 62 79 20  ase", as set by 
2220: 74 68 65 20 74 65 73 74 0d 0a 20 20 20 20 20 20  the test..      
2230: 20 20 23 20 20 20 20 20 20 20 73 75 69 74 65 20    #       suite 
2240: 69 74 73 65 6c 66 2e 0d 0a 20 20 20 20 20 20 20  itself...       
2250: 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75   #..        retu
2260: 72 6e 20 24 3a 3a 74 65 73 74 5f 63 6f 6e 66 69  rn $::test_confi
2270: 67 75 72 61 74 69 6f 6e 0d 0a 20 20 20 20 20 20  guration..      
2280: 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
2290: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
22a0: 4f 54 45 3a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 77  OTE: Normally, w
22b0: 65 20 77 69 6c 6c 20 6e 65 76 65 72 20 68 69 74  e will never hit
22c0: 20 74 68 69 73 20 63 61 73 65 20 62 65 63 61 75   this case becau
22d0: 73 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  se the value of 
22e0: 74 68 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20  the..        #  
22f0: 20 20 20 20 20 74 65 73 74 20 63 6f 6e 66 69 67       test config
2300: 75 72 61 74 69 6f 6e 20 76 61 72 69 61 62 6c 65  uration variable
2310: 20 69 73 20 61 6c 77 61 79 73 20 73 65 74 20 62   is always set b
2320: 79 20 74 68 65 20 74 65 73 74 20 73 75 69 74 65  y the test suite
2330: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
2340: 20 20 69 74 73 65 6c 66 3b 20 68 6f 77 65 76 65    itself; howeve
2350: 72 2c 20 69 74 20 63 61 6e 20 62 65 20 6f 76 65  r, it can be ove
2360: 72 72 69 64 64 65 6e 20 75 73 69 6e 67 20 74 68  rridden using th
2370: 65 20 75 6e 73 65 74 20 63 6f 6d 6d 61 6e 64 0d  e unset command.
2380: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
2390: 20 66 72 6f 6d 20 74 68 65 20 2d 70 72 65 54 65   from the -preTe
23a0: 73 74 20 6f 70 74 69 6f 6e 20 74 6f 20 74 68 65  st option to the
23b0: 20 74 65 73 74 20 73 75 69 74 65 2e 0d 0a 20 20   test suite...  
23c0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
23d0: 20 72 65 74 75 72 6e 20 24 3a 3a 65 61 67 6c 65   return $::eagle
23e0: 5f 70 6c 61 74 66 6f 72 6d 28 63 6f 6e 66 69 67  _platform(config
23f0: 75 72 61 74 69 6f 6e 29 0d 0a 20 20 20 20 20 20  uration)..      
2400: 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  }..    }.....   
2410: 20 70 72 6f 63 20 67 65 74 42 75 69 6c 64 43 6f   proc getBuildCo
2420: 6e 66 69 67 75 72 61 74 69 6f 6e 73 20 7b 7d 20  nfigurations {} 
2430: 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  {..      #..    
2440: 20 20 23 20 4e 4f 54 45 3a 20 53 65 65 20 69 66    # NOTE: See if
2450: 20 74 68 65 20 6c 69 73 74 20 6f 66 20 74 65 73   the list of tes
2460: 74 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 73  t configurations
2470: 20 68 61 73 20 62 65 65 6e 20 6f 76 65 72 72 69   has been overri
2480: 64 64 65 6e 20 62 79 0d 0a 20 20 20 20 20 20 23  dden by..      #
2490: 20 20 20 20 20 20 20 74 68 65 20 75 73 65 72 20         the user 
24a0: 28 65 2e 67 2e 20 6f 6e 20 74 68 65 20 63 6f 6d  (e.g. on the com
24b0: 6d 61 6e 64 20 6c 69 6e 65 29 2e 0d 0a 20 20 20  mand line)...   
24c0: 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
24d0: 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 74  [info exists ::t
24e0: 65 73 74 5f 63 6f 6e 66 69 67 75 72 61 74 69 6f  est_configuratio
24f0: 6e 73 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20  ns] && \..      
2500: 20 20 20 20 5b 6c 6c 65 6e 67 74 68 20 24 3a 3a      [llength $::
2510: 74 65 73 74 5f 63 6f 6e 66 69 67 75 72 61 74 69  test_configurati
2520: 6f 6e 73 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b  ons] > 0} then {
2530: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
2540: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 55 73 65       # NOTE: Use
2550: 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 6c   the specified l
2560: 69 73 74 20 6f 66 20 74 65 73 74 20 63 6f 6e 66  ist of test conf
2570: 69 67 75 72 61 74 69 6f 6e 73 2e 0d 0a 20 20 20  igurations...   
2580: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
2590: 72 65 74 75 72 6e 20 24 3a 3a 74 65 73 74 5f 63  return $::test_c
25a0: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 73 0d 0a 20  onfigurations.. 
25b0: 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
25c0: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
25d0: 20 20 23 20 4e 4f 54 45 3a 20 55 73 65 20 74 68    # NOTE: Use th
25e0: 65 20 64 65 66 61 75 6c 74 20 6c 69 73 74 20 6f  e default list o
25f0: 66 20 74 65 73 74 20 63 6f 6e 66 69 67 75 72 61  f test configura
2600: 74 69 6f 6e 73 2e 0d 0a 20 20 20 20 20 20 20 20  tions...        
2610: 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  #..        retur
2620: 6e 20 5b 6c 69 73 74 20 44 65 62 75 67 20 52 65  n [list Debug Re
2630: 6c 65 61 73 65 5d 0d 0a 20 20 20 20 20 20 7d 0d  lease]..      }.
2640: 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70  .    }.....    p
2650: 72 6f 63 20 67 65 74 42 75 69 6c 64 42 61 73 65  roc getBuildBase
2660: 44 69 72 65 63 74 6f 72 79 20 7b 7d 20 7b 0d 0a  Directory {} {..
2670: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
2680: 20 4e 4f 54 45 3a 20 46 69 67 75 72 65 20 6f 75   NOTE: Figure ou
2690: 74 20 74 68 65 20 62 61 73 65 20 64 69 72 65 63  t the base direc
26a0: 74 6f 72 79 20 77 68 65 72 65 20 61 6c 6c 20 74  tory where all t
26b0: 68 65 20 62 75 69 6c 64 73 20 73 68 6f 75 6c 64  he builds should
26c0: 20 62 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20   be..      #    
26d0: 20 20 20 6c 6f 63 61 74 65 64 2e 20 20 54 68 69     located.  Thi
26e0: 73 20 77 69 6c 6c 20 62 65 20 74 68 65 20 64 69  s will be the di
26f0: 72 65 63 74 6f 72 79 20 74 68 61 74 20 63 6f 6e  rectory that con
2700: 74 61 69 6e 73 20 74 68 65 20 61 63 74 75 61 6c  tains the actual
2710: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
2720: 62 75 69 6c 64 20 6f 75 74 70 75 74 20 64 69 72  build output dir
2730: 65 63 74 6f 72 79 20 28 65 2e 67 2e 20 70 61 72  ectory (e.g. par
2740: 65 6e 74 20 6f 66 20 22 62 69 6e 22 29 2e 0d 0a  ent of "bin")...
2750: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69        #..      i
2760: 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20  f {[info exists 
2770: 3a 3a 62 75 69 6c 64 5f 62 61 73 65 5f 64 69 72  ::build_base_dir
2780: 65 63 74 6f 72 79 5d 20 26 26 20 5c 0d 0a 20 20  ectory] && \..  
2790: 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20          [string 
27a0: 6c 65 6e 67 74 68 20 24 3a 3a 62 75 69 6c 64 5f  length $::build_
27b0: 62 61 73 65 5f 64 69 72 65 63 74 6f 72 79 5d 20  base_directory] 
27c0: 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  > 0} then {..   
27d0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
27e0: 23 20 4e 4f 54 45 3a 20 54 68 65 20 6c 6f 63 61  # NOTE: The loca
27f0: 74 69 6f 6e 20 6f 66 20 74 68 65 20 62 75 69 6c  tion of the buil
2800: 64 20 62 61 73 65 20 64 69 72 65 63 74 6f 72 79  d base directory
2810: 20 68 61 73 20 62 65 65 6e 20 6f 76 65 72 72 69   has been overri
2820: 64 64 65 6e 3b 0d 0a 20 20 20 20 20 20 20 20 23  dden;..        #
2830: 20 20 20 20 20 20 20 74 68 65 72 65 66 6f 72 65         therefore
2840: 2c 20 75 73 65 20 69 74 20 76 65 72 62 61 74 69  , use it verbati
2850: 6d 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  m...        #.. 
2860: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 3a         return $:
2870: 3a 62 75 69 6c 64 5f 62 61 73 65 5f 64 69 72 65  :build_base_dire
2880: 63 74 6f 72 79 0d 0a 20 20 20 20 20 20 7d 20 65  ctory..      } e
2890: 6c 73 65 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69  lseif {[info exi
28a0: 73 74 73 20 3a 3a 63 6f 6d 6d 6f 6e 5f 64 69 72  sts ::common_dir
28b0: 65 63 74 6f 72 79 5d 20 26 26 20 5c 0d 0a 20 20  ectory] && \..  
28c0: 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20          [string 
28d0: 6c 65 6e 67 74 68 20 24 3a 3a 63 6f 6d 6d 6f 6e  length $::common
28e0: 5f 64 69 72 65 63 74 6f 72 79 5d 20 3e 20 30 7d  _directory] > 0}
28f0: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
2900: 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
2910: 54 45 3a 20 4e 65 78 74 2c 20 66 61 6c 6c 62 61  TE: Next, fallba
2920: 63 6b 20 74 6f 20 74 68 65 20 70 61 72 65 6e 74  ck to the parent
2930: 20 64 69 72 65 63 74 6f 72 79 20 6f 66 20 74 68   directory of th
2940: 65 20 6f 6e 65 20 63 6f 6e 74 61 69 6e 69 6e 67  e one containing
2950: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
2960: 20 20 74 68 69 73 20 66 69 6c 65 20 28 69 2e 65    this file (i.e
2970: 2e 20 22 63 6f 6d 6d 6f 6e 2e 65 61 67 6c 65 22  . "common.eagle"
2980: 29 2c 20 69 66 20 61 76 61 69 6c 61 62 6c 65 2e  ), if available.
2990: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
29a0: 20 20 20 20 20 72 65 74 75 72 6e 20 5b 66 69 6c       return [fil
29b0: 65 20 64 69 72 6e 61 6d 65 20 24 3a 3a 63 6f 6d  e dirname $::com
29c0: 6d 6f 6e 5f 64 69 72 65 63 74 6f 72 79 5d 0d 0a  mon_directory]..
29d0: 20 20 20 20 20 20 7d 20 65 6c 73 65 69 66 20 7b        } elseif {
29e0: 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 70  [info exists ::p
29f0: 61 74 68 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20  ath] && \..     
2a00: 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e       [string len
2a10: 67 74 68 20 24 3a 3a 70 61 74 68 5d 20 3e 20 30  gth $::path] > 0
2a20: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
2a30: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
2a40: 4f 54 45 3a 20 46 69 6e 61 6c 6c 79 2c 20 66 61  OTE: Finally, fa
2a50: 6c 6c 62 61 63 6b 20 74 6f 20 74 68 65 20 70 61  llback to the pa
2a60: 72 65 6e 74 20 64 69 72 65 63 74 6f 72 79 20 6f  rent directory o
2a70: 66 20 74 68 65 20 45 61 67 6c 65 54 65 73 74 0d  f the EagleTest.
2a80: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
2a90: 20 70 61 74 68 2e 20 20 54 68 65 20 45 61 67 6c   path.  The Eagl
2aa0: 65 54 65 73 74 20 70 61 63 6b 61 67 65 20 67 75  eTest package gu
2ab0: 61 72 61 6e 74 65 65 73 20 74 68 61 74 20 74 68  arantees that th
2ac0: 69 73 20 76 61 72 69 61 62 6c 65 0d 0a 20 20 20  is variable..   
2ad0: 20 20 20 20 20 23 20 20 20 20 20 20 20 77 69 6c       #       wil
2ae0: 6c 20 62 65 20 73 65 74 20 74 6f 20 74 68 65 20  l be set to the 
2af0: 64 69 72 65 63 74 6f 72 79 20 63 6f 6e 74 61 69  directory contai
2b00: 6e 69 6e 67 20 74 68 65 20 66 69 72 73 74 20 66  ning the first f
2b10: 69 6c 65 20 74 6f 0d 0a 20 20 20 20 20 20 20 20  ile to..        
2b20: 23 20 20 20 20 20 20 20 65 78 65 63 75 74 65 20  #       execute 
2b30: 74 68 65 20 5b 72 75 6e 54 65 73 74 50 72 6f 6c  the [runTestProl
2b40: 6f 67 75 65 5d 20 73 63 72 69 70 74 20 6c 69 62  ogue] script lib
2b50: 72 61 72 79 20 70 72 6f 63 65 64 75 72 65 2e 0d  rary procedure..
2b60: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
2b70: 20 20 20 20 72 65 74 75 72 6e 20 5b 66 69 6c 65      return [file
2b80: 20 64 69 72 6e 61 6d 65 20 24 3a 3a 70 61 74 68   dirname $::path
2b90: 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20  ]..      } else 
2ba0: 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
2bb0: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4e 6f        # NOTE: No
2bc0: 20 70 61 74 68 20 69 73 20 61 76 61 69 6c 61 62   path is availab
2bd0: 6c 65 2c 20 72 65 74 75 72 6e 20 61 6e 20 65 6d  le, return an em
2be0: 70 74 79 20 73 74 72 69 6e 67 2e 20 20 54 68 69  pty string.  Thi
2bf0: 73 20 70 6f 69 6e 74 0d 0a 20 20 20 20 20 20 20  s point..       
2c00: 20 23 20 20 20 20 20 20 20 73 68 6f 75 6c 64 20   #       should 
2c10: 6e 6f 74 20 62 65 20 72 65 61 63 68 65 64 2e 0d  not be reached..
2c20: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
2c30: 20 20 20 20 72 65 74 75 72 6e 20 22 22 0d 0a 20      return "".. 
2c40: 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c       }..    }...
2c50: 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74 53 51  ..    proc getSQ
2c60: 4c 69 74 65 54 65 73 74 44 61 74 61 50 61 74 68  LiteTestDataPath
2c70: 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a   {} {..      #..
2c80: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 46 69        # NOTE: Fi
2c90: 67 75 72 65 20 6f 75 74 20 74 68 65 20 64 69 72  gure out the dir
2ca0: 65 63 74 6f 72 79 20 77 68 65 72 65 20 61 6c 6c  ectory where all
2cb0: 20 74 68 65 20 74 65 73 74 20 64 61 74 61 20 66   the test data f
2cc0: 69 6c 65 73 20 73 68 6f 75 6c 64 0d 0a 20 20 20  iles should..   
2cd0: 20 20 20 23 20 20 20 20 20 20 20 62 65 20 6c 6f     #       be lo
2ce0: 63 61 74 65 64 2e 20 20 54 68 69 73 20 73 68 6f  cated.  This sho
2cf0: 75 6c 64 20 62 65 20 74 68 65 20 22 64 61 74 61  uld be the "data
2d00: 22 20 64 69 72 65 63 74 6f 72 79 20 62 65 6e 65  " directory bene
2d10: 61 74 68 20 74 68 65 0d 0a 20 20 20 20 20 20 23  ath the..      #
2d20: 20 20 20 20 20 20 20 64 69 72 65 63 74 6f 72 79         directory
2d30: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
2d40: 61 63 74 75 61 6c 20 74 65 73 74 20 73 63 72 69  actual test scri
2d50: 70 74 73 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  pts...      #.. 
2d60: 20 20 20 20 20 72 65 74 75 72 6e 20 5b 66 69 6c       return [fil
2d70: 65 20 6a 6f 69 6e 20 24 3a 3a 70 61 74 68 20 64  e join $::path d
2d80: 61 74 61 5d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a  ata]..    }.....
2d90: 20 20 20 20 70 72 6f 63 20 69 73 52 75 6e 6e 69      proc isRunni
2da0: 6e 67 57 6f 57 36 34 20 7b 7d 20 7b 0d 0a 20 20  ngWoW64 {} {..  
2db0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
2dc0: 4f 54 45 3a 20 46 6f 72 20 6e 6f 77 2c 20 6a 75  OTE: For now, ju
2dd0: 73 74 20 75 73 65 20 74 68 65 20 65 78 69 73 74  st use the exist
2de0: 69 6e 67 20 74 65 73 74 20 63 6f 6e 73 74 72 61  ing test constra
2df0: 69 6e 74 20 66 6f 72 20 64 65 74 65 63 74 69 6e  int for detectin
2e00: 67 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  g..      #      
2e10: 20 61 20 57 6f 57 36 34 20 70 72 6f 63 65 73 73   a WoW64 process
2e20: 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
2e30: 20 20 72 65 74 75 72 6e 20 5b 68 61 76 65 43 6f    return [haveCo
2e40: 6e 73 74 72 61 69 6e 74 20 77 6f 77 36 34 5d 0d  nstraint wow64].
2e50: 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70  .    }.....    p
2e60: 72 6f 63 20 69 73 4d 69 78 65 64 4d 6f 64 65 41  roc isMixedModeA
2e70: 73 73 65 6d 62 6c 79 20 7b 20 66 69 6c 65 4e 61  ssembly { fileNa
2e80: 6d 65 20 7b 76 61 72 4e 61 6d 65 20 22 22 7d 20  me {varName ""} 
2e90: 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  } {..      #..  
2ea0: 20 20 20 20 23 20 4e 4f 54 45 3a 20 46 69 72 73      # NOTE: Firs
2eb0: 74 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65  t, make sure the
2ec0: 20 74 65 73 74 20 73 75 69 74 65 20 69 6e 66 72   test suite infr
2ed0: 61 73 74 72 75 63 74 75 72 65 20 69 73 20 61 6c  astructure is al
2ee0: 6c 6f 77 65 64 20 74 6f 0d 0a 20 20 20 20 20 20  lowed to..      
2ef0: 23 20 20 20 20 20 20 20 75 73 65 20 74 68 65 20  #       use the 
2f00: 5b 65 78 65 63 5d 20 63 6f 6d 6d 61 6e 64 2e 0d  [exec] command..
2f10: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
2f20: 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74  if {![info exist
2f30: 73 20 3a 3a 6e 6f 28 65 78 65 63 29 5d 20 26 26  s ::no(exec)] &&
2f40: 20 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a   ![info exists :
2f50: 3a 6e 6f 28 63 6f 72 46 6c 61 67 73 29 5d 7d 20  :no(corFlags)]} 
2f60: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
2f70: 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
2f80: 45 3a 20 49 66 20 74 68 65 20 6c 6f 63 61 74 69  E: If the locati
2f90: 6f 6e 20 6f 66 20 43 6f 72 46 6c 61 67 73 20 69  on of CorFlags i
2fa0: 73 20 70 72 65 73 65 6e 74 20 69 6e 20 74 68 65  s present in the
2fb0: 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 2c 0d 0a 20   environment,.. 
2fc0: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 75         #       u
2fd0: 73 65 20 69 74 3b 20 6f 74 68 65 72 77 69 73 65  se it; otherwise
2fe0: 20 61 73 73 75 6d 65 20 69 74 20 69 73 20 69 6e   assume it is in
2ff0: 20 74 68 65 20 50 41 54 48 2e 0d 0a 20 20 20 20   the PATH...    
3000: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 73      #..        s
3010: 65 74 20 63 6f 72 46 6c 61 67 73 20 5b 65 78 70  et corFlags [exp
3020: 72 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 5b  r {..          [
3030: 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 65 6e  info exists ::en
3040: 76 28 43 6f 72 46 6c 61 67 73 29 5d 20 3f 20 24  v(CorFlags)] ? $
3050: 3a 3a 65 6e 76 28 43 6f 72 46 6c 61 67 73 29 20  ::env(CorFlags) 
3060: 3a 20 22 43 6f 72 46 6c 61 67 73 22 0d 0a 20 20  : "CorFlags"..  
3070: 20 20 20 20 20 20 7d 5d 0d 0a 0d 0a 20 20 20 20        }]....    
3080: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
3090: 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74 20 74   NOTE: Attempt t
30a0: 6f 20 65 78 65 63 75 74 65 20 43 6f 72 46 6c 61  o execute CorFla
30b0: 67 73 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66  gs on the specif
30c0: 69 65 64 20 66 69 6c 65 2e 0d 0a 20 20 20 20 20  ied file...     
30d0: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 69 66     #..        if
30e0: 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20   {[catch {..    
30f0: 20 20 20 20 20 20 65 78 65 63 20 2d 2d 20 24 63        exec -- $c
3100: 6f 72 46 6c 61 67 73 20 5b 66 69 6c 65 20 6e 61  orFlags [file na
3110: 74 69 76 65 6e 61 6d 65 20 24 66 69 6c 65 4e 61  tivename $fileNa
3120: 6d 65 5d 0d 0a 20 20 20 20 20 20 20 20 7d 20 65  me]..        } e
3130: 78 65 63 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20  xec] == 0} then 
3140: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a  {..          #..
3150: 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45            # NOTE
3160: 3a 20 49 66 20 72 65 71 75 65 73 74 65 64 20 62  : If requested b
3170: 79 20 6f 75 72 20 63 61 6c 6c 65 72 2c 20 61 74  y our caller, at
3180: 74 65 6d 70 74 20 74 6f 20 64 65 74 65 72 6d 69  tempt to determi
3190: 6e 65 20 74 68 65 0d 0a 20 20 20 20 20 20 20 20  ne the..        
31a0: 20 20 23 20 20 20 20 20 20 20 70 6c 61 74 66 6f    #       platfo
31b0: 72 6d 20 66 6f 72 20 74 68 65 20 73 70 65 63 69  rm for the speci
31c0: 66 69 65 64 20 66 69 6c 65 20 61 73 20 77 65 6c  fied file as wel
31d0: 6c 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d  l...          #.
31e0: 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b  .          if {[
31f0: 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 76  string length $v
3200: 61 72 4e 61 6d 65 5d 20 3e 20 30 7d 20 74 68 65  arName] > 0} the
3210: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
3220: 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   #..            
3230: 23 20 4e 4f 54 45 3a 20 53 74 6f 72 65 20 74 68  # NOTE: Store th
3240: 65 20 70 6c 61 74 66 6f 72 6d 20 69 6e 20 74 68  e platform in th
3250: 65 20 6e 61 6d 65 64 20 76 61 72 69 61 62 6c 65  e named variable
3260: 20 69 6e 20 74 68 65 0d 0a 20 20 20 20 20 20 20   in the..       
3270: 20 20 20 20 20 23 20 20 20 20 20 20 20 63 6f 6e       #       con
3280: 74 65 78 74 20 6f 66 20 6f 75 72 20 63 61 6c 6c  text of our call
3290: 65 72 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20  er...           
32a0: 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   #..            
32b0: 75 70 76 61 72 20 31 20 24 76 61 72 4e 61 6d 65  upvar 1 $varName
32c0: 20 70 6c 61 74 66 6f 72 6d 0d 0a 0d 0a 20 20 20   platform....   
32d0: 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
32e0: 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
32f0: 41 74 74 65 6d 70 74 20 74 6f 20 65 78 74 72 61  Attempt to extra
3300: 63 74 20 74 68 65 20 50 45 20 6c 69 6e 65 20 66  ct the PE line f
3310: 72 6f 6d 20 74 68 65 20 63 61 70 74 75 72 65 64  rom the captured
3320: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 20  ..            # 
3330: 20 20 20 20 20 20 6f 75 74 70 75 74 2e 20 20 49        output.  I
3340: 66 20 74 68 69 73 20 76 61 6c 75 65 20 69 73 20  f this value is 
3350: 22 50 45 33 32 22 20 6f 72 20 22 50 45 33 32 2b  "PE32" or "PE32+
3360: 22 2c 20 74 68 65 0d 0a 20 20 20 20 20 20 20 20  ", the..        
3370: 20 20 20 20 23 20 20 20 20 20 20 20 61 73 73 65      #       asse
3380: 6d 62 6c 79 20 66 69 6c 65 20 69 73 20 33 32 2d  mbly file is 32-
3390: 62 69 74 20 6f 72 20 36 34 2d 62 69 74 2c 20 72  bit or 64-bit, r
33a0: 65 73 70 65 63 74 69 76 65 6c 79 3b 0d 0a 20 20  espectively;..  
33b0: 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20            #     
33c0: 20 20 6f 74 68 65 72 77 69 73 65 2c 20 69 74 73    otherwise, its
33d0: 20 74 79 70 65 20 69 73 20 75 6e 6b 6e 6f 77 6e   type is unknown
33e0: 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23  ...            #
33f0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 65  ..            se
3400: 74 20 70 61 74 74 65 72 6e 20 7b 5e 50 45 20 20  t pattern {^PE  
3410: 20 20 20 20 20 20 3a 20 28 50 45 33 32 7c 50 45        : (PE32|PE
3420: 33 32 5c 2b 29 5c 73 2b 24 7d 0d 0a 0d 0a 20 20  32\+)\s+$}....  
3430: 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 72            if {[r
3440: 65 67 65 78 70 20 2d 6c 69 6e 65 20 2d 2d 20 24  egexp -line -- $
3450: 70 61 74 74 65 72 6e 20 24 65 78 65 63 20 64 75  pattern $exec du
3460: 6d 6d 79 20 70 65 33 32 5d 7d 20 74 68 65 6e 20  mmy pe32]} then 
3470: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
3480: 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   #..            
3490: 20 20 23 20 48 41 43 4b 3a 20 54 68 69 73 20 5b    # HACK: This [
34a0: 73 77 69 74 63 68 5d 20 61 73 73 75 6d 65 73 20  switch] assumes 
34b0: 74 68 61 74 20 33 32 2d 62 69 74 20 65 78 65 63  that 32-bit exec
34c0: 75 74 61 62 6c 65 73 20 61 72 65 0d 0a 20 20 20  utables are..   
34d0: 20 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20             #    
34e0: 20 20 20 61 6c 77 61 79 73 20 78 38 36 20 61 6e     always x86 an
34f0: 64 20 74 68 61 74 20 36 34 2d 62 69 74 20 65 78  d that 64-bit ex
3500: 65 63 75 74 61 62 6c 65 73 20 61 72 65 20 61 6c  ecutables are al
3510: 77 61 79 73 0d 0a 20 20 20 20 20 20 20 20 20 20  ways..          
3520: 20 20 20 20 23 20 20 20 20 20 20 20 78 36 34 2e      #       x64.
3530: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
3540: 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  #..             
3550: 20 73 77 69 74 63 68 20 2d 65 78 61 63 74 20 2d   switch -exact -
3560: 2d 20 24 70 65 33 32 20 7b 0d 0a 20 20 20 20 20  - $pe32 {..     
3570: 20 20 20 20 20 20 20 20 20 20 20 50 45 33 32 20             PE32 
3580: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
3590: 20 20 20 20 20 73 65 74 20 70 6c 61 74 66 6f 72       set platfor
35a0: 6d 20 57 69 6e 33 32 0d 0a 20 20 20 20 20 20 20  m Win32..       
35b0: 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
35c0: 20 20 20 20 20 20 20 20 20 20 20 20 50 45 33 32              PE32
35d0: 2b 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  + {..           
35e0: 20 20 20 20 20 20 20 73 65 74 20 70 6c 61 74 66         set platf
35f0: 6f 72 6d 20 78 36 34 0d 0a 20 20 20 20 20 20 20  orm x64..       
3600: 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
3610: 20 20 20 20 20 20 20 20 20 20 20 20 64 65 66 61              defa
3620: 75 6c 74 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  ult {..         
3630: 20 20 20 20 20 20 20 20 20 73 65 74 20 70 6c 61           set pla
3640: 74 66 6f 72 6d 20 22 22 0d 0a 20 20 20 20 20 20  tform ""..      
3650: 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
3660: 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
3670: 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65            } else
3680: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
3690: 20 20 73 65 74 20 70 6c 61 74 66 6f 72 6d 20 22    set platform "
36a0: 22 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  "..            }
36b0: 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d  ..          }...
36c0: 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
36d0: 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
36e0: 41 74 74 65 6d 70 74 20 74 6f 20 65 78 74 72 61  Attempt to extra
36f0: 63 74 20 74 68 65 20 49 4c 4f 4e 4c 59 20 6c 69  ct the ILONLY li
3700: 6e 65 20 66 72 6f 6d 20 74 68 65 20 63 61 70 74  ne from the capt
3710: 75 72 65 64 0d 0a 20 20 20 20 20 20 20 20 20 20  ured..          
3720: 23 20 20 20 20 20 20 20 6f 75 74 70 75 74 2e 20  #       output. 
3730: 20 49 66 20 74 68 69 73 20 76 61 6c 75 65 20 69   If this value i
3740: 73 20 7a 65 72 6f 2c 20 74 68 65 20 73 70 65 63  s zero, the spec
3750: 69 66 69 65 64 20 66 69 6c 65 20 6d 75 73 74 0d  ified file must.
3760: 0a 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20  .          #    
3770: 20 20 20 62 65 20 61 20 6d 69 78 65 64 2d 6d 6f     be a mixed-mo
3780: 64 65 20 61 73 73 65 6d 62 6c 79 3b 20 6f 74 68  de assembly; oth
3790: 65 72 77 69 73 65 2c 20 69 74 20 63 6f 6e 74 61  erwise, it conta
37a0: 69 6e 73 20 6f 6e 6c 79 0d 0a 20 20 20 20 20 20  ins only..      
37b0: 20 20 20 20 23 20 20 20 20 20 20 20 6d 61 6e 61      #       mana
37c0: 67 65 64 20 63 6f 6d 70 6f 6e 65 6e 74 73 2e 0d  ged components..
37d0: 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
37e0: 20 20 20 20 20 20 20 20 73 65 74 20 70 61 74 74          set patt
37f0: 65 72 6e 20 7b 5e 49 4c 4f 4e 4c 59 20 20 20 20  ern {^ILONLY    
3800: 3a 20 28 30 7c 31 29 5c 73 2b 24 7d 0d 0a 0d 0a  : (0|1)\s+$}....
3810: 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b            if {![
3820: 72 65 67 65 78 70 20 2d 6c 69 6e 65 20 2d 2d 20  regexp -line -- 
3830: 24 70 61 74 74 65 72 6e 20 24 65 78 65 63 20 64  $pattern $exec d
3840: 75 6d 6d 79 20 69 6c 4f 6e 6c 79 5d 7d 20 74 68  ummy ilOnly]} th
3850: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
3860: 20 20 72 65 74 75 72 6e 20 66 61 6c 73 65 0d 0a    return false..
3870: 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20            }.... 
3880: 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 69           if {!$i
3890: 6c 4f 6e 6c 79 7d 20 74 68 65 6e 20 7b 0d 0a 20  lOnly} then {.. 
38a0: 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
38b0: 6e 20 74 72 75 65 0d 0a 20 20 20 20 20 20 20 20  n true..        
38c0: 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a    }..        }..
38d0: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
38e0: 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
38f0: 3a 20 49 66 20 74 68 65 20 74 65 73 74 20 73 75  : If the test su
3900: 69 74 65 20 63 61 6e 6e 6f 74 20 75 73 65 20 5b  ite cannot use [
3910: 65 78 65 63 5d 20 6f 72 20 65 78 65 63 75 74 69  exec] or executi
3920: 6f 6e 20 6f 66 20 43 6f 72 46 6c 61 67 73 0d 0a  on of CorFlags..
3930: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 66 61        #       fa
3940: 69 6c 65 64 2c 20 72 65 74 75 72 6e 20 66 61 6c  iled, return fal
3950: 73 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  se...      #..  
3960: 20 20 20 20 72 65 74 75 72 6e 20 66 61 6c 73 65      return false
3970: 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
3980: 70 72 6f 63 20 69 73 42 75 69 6c 64 41 76 61 69  proc isBuildAvai
3990: 6c 61 62 6c 65 20 7b 20 6e 61 74 69 76 65 20 64  lable { native d
39a0: 69 72 65 63 74 6f 72 79 20 7b 76 61 72 4e 61 6d  irectory {varNam
39b0: 65 20 22 22 7d 20 7d 20 7b 0d 0a 20 20 20 20 20  e ""} } {..     
39c0: 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
39d0: 3a 20 42 75 69 6c 64 20 74 68 65 20 66 75 6c 6c  : Build the full
39e0: 79 20 71 75 61 6c 69 66 69 65 64 20 66 69 6c 65  y qualified file
39f0: 20 6e 61 6d 65 20 66 6f 72 20 74 68 65 20 70 72   name for the pr
3a00: 69 6d 61 72 79 20 61 73 73 65 6d 62 6c 79 0d 0a  imary assembly..
3a10: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63 6f        #       co
3a20: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 53 79 73  ntaining the Sys
3a30: 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 20  tem.Data.SQLite 
3a40: 6d 61 6e 61 67 65 64 20 63 6f 6d 70 6f 6e 65 6e  managed componen
3a50: 74 73 2e 20 20 49 74 0d 0a 20 20 20 20 20 20 23  ts.  It..      #
3a60: 20 20 20 20 20 20 20 73 68 6f 75 6c 64 20 62 65         should be
3a70: 20 6e 6f 74 65 64 20 74 68 61 74 20 74 68 69 73   noted that this
3a80: 20 61 73 73 65 6d 62 6c 79 20 66 69 6c 65 20 6d   assembly file m
3a90: 61 79 20 61 6c 73 6f 20 63 6f 6e 74 61 69 6e 20  ay also contain 
3aa0: 74 68 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20  the..      #    
3ab0: 20 20 20 6e 61 74 69 76 65 20 63 6f 6d 70 6f 6e     native compon
3ac0: 65 6e 74 73 2c 20 69 66 20 61 20 6e 61 74 69 76  ents, if a nativ
3ad0: 65 20 62 75 69 6c 64 20 69 73 20 69 6e 20 75 73  e build is in us
3ae0: 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  e...      #..   
3af0: 20 20 20 73 65 74 20 66 69 6c 65 4e 61 6d 65 20     set fileName 
3b00: 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65  [file nativename
3b10: 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 24 64 69 72   [file join $dir
3b20: 65 63 74 6f 72 79 20 5c 0d 0a 20 20 20 20 20 20  ectory \..      
3b30: 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e      System.Data.
3b40: 53 51 4c 69 74 65 2e 64 6c 6c 5d 5d 0d 0a 0d 0a  SQLite.dll]]....
3b50: 20 20 20 20 20 20 69 66 20 7b 21 5b 66 69 6c 65        if {![file
3b60: 20 65 78 69 73 74 73 20 24 66 69 6c 65 4e 61 6d   exists $fileNam
3b70: 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  e]} then {..    
3b80: 20 20 20 20 72 65 74 75 72 6e 20 66 61 6c 73 65      return false
3b90: 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
3ba0: 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
3bb0: 54 45 3a 20 41 74 74 65 6d 70 74 20 74 6f 20 61  TE: Attempt to a
3bc0: 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 74  utomatically det
3bd0: 65 63 74 20 69 66 20 74 68 65 20 70 72 69 6d 61  ect if the prima
3be0: 72 79 20 61 73 73 65 6d 62 6c 79 0d 0a 20 20 20  ry assembly..   
3bf0: 20 20 20 23 20 20 20 20 20 20 20 63 6f 6e 74 61     #       conta
3c00: 69 6e 73 20 61 6e 79 20 6e 61 74 69 76 65 20 63  ins any native c
3c10: 6f 6d 70 6f 6e 65 6e 74 73 2c 20 69 66 20 6e 65  omponents, if ne
3c20: 63 65 73 73 61 72 79 2e 0d 0a 20 20 20 20 20 20  cessary...      
3c30: 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 73 74  #..      if {[st
3c40: 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 6e 61 74  ring length $nat
3c50: 69 76 65 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20  ive] == 0} then 
3c60: 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b  {..        if {[
3c70: 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 76  string length $v
3c80: 61 72 4e 61 6d 65 5d 20 3e 20 30 7d 20 74 68 65  arName] > 0} the
3c90: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 75  n {..          u
3ca0: 70 76 61 72 20 31 20 24 76 61 72 4e 61 6d 65 20  pvar 1 $varName 
3cb0: 24 76 61 72 4e 61 6d 65 0d 0a 20 20 20 20 20 20  $varName..      
3cc0: 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 73    }....        s
3cd0: 65 74 20 6e 61 74 69 76 65 20 5b 69 73 4d 69 78  et native [isMix
3ce0: 65 64 4d 6f 64 65 41 73 73 65 6d 62 6c 79 20 24  edModeAssembly $
3cf0: 66 69 6c 65 4e 61 6d 65 20 24 76 61 72 4e 61 6d  fileName $varNam
3d00: 65 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  e]..      }.... 
3d10: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
3d20: 4e 4f 54 45 3a 20 49 66 20 74 68 65 20 70 72 69  NOTE: If the pri
3d30: 6d 61 72 79 20 61 73 73 65 6d 62 6c 79 20 61 6c  mary assembly al
3d40: 73 6f 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  so contains the 
3d50: 6e 61 74 69 76 65 20 63 6f 6d 70 6f 6e 65 6e 74  native component
3d60: 73 2c 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  s,..      #     
3d70: 20 20 77 65 20 68 61 76 65 20 65 76 65 72 79 74    we have everyt
3d80: 68 69 6e 67 20 77 65 20 6e 65 65 64 2e 0d 0a 20  hing we need... 
3d90: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66       #..      if
3da0: 20 7b 24 6e 61 74 69 76 65 7d 20 74 68 65 6e 20   {$native} then 
3db0: 7b 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  {..        retur
3dc0: 6e 20 74 72 75 65 0d 0a 20 20 20 20 20 20 7d 0d  n true..      }.
3dd0: 0a 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 42 75 69 6c 64 20    # NOTE: Build 
3df0: 74 68 65 20 66 75 6c 6c 79 20 71 75 61 6c 69 66  the fully qualif
3e00: 69 65 64 20 66 69 6c 65 20 6e 61 6d 65 20 66 6f  ied file name fo
3e10: 72 20 74 68 65 20 69 6e 74 65 72 6f 70 20 61 73  r the interop as
3e20: 73 65 6d 62 6c 79 0d 0a 20 20 20 20 20 20 23 20  sembly..      # 
3e30: 20 20 20 20 20 20 63 6f 6e 74 61 69 6e 69 6e 67        containing
3e40: 20 74 68 65 20 53 79 73 74 65 6d 2e 44 61 74 61   the System.Data
3e50: 2e 53 51 4c 69 74 65 20 6e 61 74 69 76 65 20 63  .SQLite native c
3e60: 6f 6d 70 6f 6e 65 6e 74 73 2e 20 20 49 66 20 74  omponents.  If t
3e70: 68 69 73 0d 0a 20 20 20 20 20 20 23 20 20 20 20  his..      #    
3e80: 20 20 20 66 69 6c 65 20 65 78 69 73 74 73 2c 20     file exists, 
3e90: 77 65 20 73 68 6f 75 6c 64 20 68 61 76 65 20 65  we should have e
3ea0: 76 65 72 79 74 68 69 6e 67 20 77 65 20 6e 65 65  verything we nee
3eb0: 64 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  d...      #..   
3ec0: 20 20 20 73 65 74 20 66 69 6c 65 4e 61 6d 65 20     set fileName 
3ed0: 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65  [file nativename
3ee0: 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 24 64 69 72   [file join $dir
3ef0: 65 63 74 6f 72 79 20 5c 0d 0a 20 20 20 20 20 20  ectory \..      
3f00: 20 20 20 20 53 51 4c 69 74 65 2e 49 6e 74 65 72      SQLite.Inter
3f10: 6f 70 2e 64 6c 6c 5d 5d 0d 0a 0d 0a 20 20 20 20  op.dll]]....    
3f20: 20 20 69 66 20 7b 5b 66 69 6c 65 20 65 78 69 73    if {[file exis
3f30: 74 73 20 24 66 69 6c 65 4e 61 6d 65 5d 7d 20 74  ts $fileName]} t
3f40: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 72  hen {..        r
3f50: 65 74 75 72 6e 20 74 72 75 65 0d 0a 20 20 20 20  eturn true..    
3f60: 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a    }....      #..
3f70: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 42 75        # NOTE: Bu
3f80: 69 6c 64 20 74 68 65 20 66 75 6c 6c 79 20 71 75  ild the fully qu
3f90: 61 6c 69 66 69 65 64 20 66 69 6c 65 20 6e 61 6d  alified file nam
3fa0: 65 20 66 6f 72 20 74 68 65 20 53 51 4c 69 74 65  e for the SQLite
3fb0: 20 63 6f 72 65 0d 0a 20 20 20 20 20 20 23 20 20   core..      #  
3fc0: 20 20 20 20 20 6c 69 62 72 61 72 79 2e 20 20 49       library.  I
3fd0: 66 20 74 68 69 73 20 66 69 6c 65 20 65 78 69 73  f this file exis
3fe0: 74 73 2c 20 77 65 20 73 68 6f 75 6c 64 20 68 61  ts, we should ha
3ff0: 76 65 20 65 76 65 72 79 74 68 69 6e 67 20 77 65  ve everything we
4000: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
4010: 6e 65 65 64 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  need...      #..
4020: 20 20 20 20 20 20 73 65 74 20 66 69 6c 65 4e 61        set fileNa
4030: 6d 65 20 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e  me [file nativen
4040: 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 24  ame [file join $
4050: 64 69 72 65 63 74 6f 72 79 20 5c 0d 0a 20 20 20  directory \..   
4060: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 2e 64         sqlite3.d
4070: 6c 6c 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 69 66  ll]]....      if
4080: 20 7b 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24   {[file exists $
4090: 66 69 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20  fileName]} then 
40a0: 7b 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  {..        retur
40b0: 6e 20 74 72 75 65 0d 0a 20 20 20 20 20 20 7d 0d  n true..      }.
40c0: 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
40d0: 20 20 23 20 4e 4f 54 45 3a 20 4f 6e 65 20 6f 72    # NOTE: One or
40e0: 20 6d 6f 72 65 20 6e 61 74 69 76 65 20 63 6f 6d   more native com
40f0: 70 6f 6e 65 6e 74 73 20 6e 65 65 64 65 64 20 62  ponents needed b
4100: 79 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51  y System.Data.SQ
4110: 4c 69 74 65 0d 0a 20 20 20 20 20 20 23 20 20 20  Lite..      #   
4120: 20 20 20 20 61 72 65 20 6d 69 73 73 69 6e 67 2e      are missing.
4130: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
4140: 20 72 65 74 75 72 6e 20 66 61 6c 73 65 0d 0a 20   return false.. 
4150: 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
4160: 63 20 69 73 52 65 6c 65 61 73 65 41 76 61 69 6c  c isReleaseAvail
4170: 61 62 6c 65 20 7b 20 64 69 72 65 63 74 6f 72 79  able { directory
4180: 20 7b 76 61 72 4e 61 6d 65 20 22 22 7d 20 7d 20   {varName ""} } 
4190: 7b 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 73 74  {..      if {[st
41a0: 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 76 61 72  ring length $var
41b0: 4e 61 6d 65 5d 20 3e 20 30 7d 20 74 68 65 6e 20  Name] > 0} then 
41c0: 7b 0d 0a 20 20 20 20 20 20 20 20 75 70 76 61 72  {..        upvar
41d0: 20 31 20 24 76 61 72 4e 61 6d 65 20 24 76 61 72   1 $varName $var
41e0: 4e 61 6d 65 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d  Name..      }...
41f0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b 69  .      return [i
4200: 73 42 75 69 6c 64 41 76 61 69 6c 61 62 6c 65 20  sBuildAvailable 
4210: 22 22 20 24 64 69 72 65 63 74 6f 72 79 20 24 76  "" $directory $v
4220: 61 72 4e 61 6d 65 5d 0d 0a 20 20 20 20 7d 0d 0a  arName]..    }..
4230: 0c 0d 0a 20 20 20 20 70 72 6f 63 20 6a 6f 69 6e  ...    proc join
4240: 42 75 69 6c 64 44 69 72 65 63 74 6f 72 79 20 7b  BuildDirectory {
4250: 20 6e 61 74 69 76 65 20 70 61 74 68 20 79 65 61   native path yea
4260: 72 20 70 6c 61 74 66 6f 72 6d 20 63 6f 6e 66 69  r platform confi
4270: 67 75 72 61 74 69 6f 6e 20 7d 20 7b 0d 0a 20 20  guration } {..  
4280: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
4290: 4f 54 45 3a 20 46 69 67 75 72 65 20 6f 75 74 20  OTE: Figure out 
42a0: 61 6e 64 20 74 68 65 6e 20 72 65 74 75 72 6e 20  and then return 
42b0: 74 68 65 20 66 75 6c 6c 79 20 71 75 61 6c 69 66  the fully qualif
42c0: 69 65 64 20 70 61 74 68 20 74 6f 20 74 68 65 20  ied path to the 
42d0: 62 75 69 6c 64 0d 0a 20 20 20 20 20 20 23 20 20  build..      #  
42e0: 20 20 20 20 20 64 69 72 65 63 74 6f 72 79 20 62       directory b
42f0: 61 73 65 64 20 6f 6e 20 61 6c 6c 20 74 68 65 20  ased on all the 
4300: 61 72 67 75 6d 65 6e 74 73 20 70 72 6f 76 69 64  arguments provid
4310: 65 64 20 62 79 20 6f 75 72 20 63 61 6c 6c 65 72  ed by our caller
4320: 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
4330: 20 20 69 66 20 7b 24 6e 61 74 69 76 65 7d 20 74    if {$native} t
4340: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 72  hen {..        r
4350: 65 74 75 72 6e 20 5b 66 69 6c 65 20 6a 6f 69 6e  eturn [file join
4360: 20 24 70 61 74 68 20 62 69 6e 20 24 79 65 61 72   $path bin $year
4370: 20 24 70 6c 61 74 66 6f 72 6d 20 24 63 6f 6e 66   $platform $conf
4380: 69 67 75 72 61 74 69 6f 6e 5d 0d 0a 20 20 20 20  iguration]..    
4390: 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
43a0: 20 20 20 20 72 65 74 75 72 6e 20 5b 66 69 6c 65      return [file
43b0: 20 6a 6f 69 6e 20 24 70 61 74 68 20 62 69 6e 20   join $path bin 
43c0: 24 79 65 61 72 20 24 63 6f 6e 66 69 67 75 72 61  $year $configura
43d0: 74 69 6f 6e 20 62 69 6e 5d 0d 0a 20 20 20 20 20  tion bin]..     
43e0: 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20   }..    }.....  
43f0: 20 20 70 72 6f 63 20 67 65 74 42 75 69 6c 64 44    proc getBuildD
4400: 69 72 65 63 74 6f 72 79 20 7b 7d 20 7b 0d 0a 20  irectory {} {.. 
4410: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
4420: 4e 4f 54 45 3a 20 53 65 65 20 69 66 20 74 68 65  NOTE: See if the
4430: 20 22 6e 61 74 69 76 65 22 20 72 75 6e 74 69 6d   "native" runtim
4440: 65 20 6f 70 74 69 6f 6e 20 68 61 73 20 62 65 65  e option has bee
4450: 6e 20 73 65 74 2e 20 20 49 66 20 73 6f 2c 20 75  n set.  If so, u
4460: 73 65 20 74 68 65 0d 0a 20 20 20 20 20 20 23 20  se the..      # 
4470: 20 20 20 20 20 20 64 69 72 65 63 74 6f 72 79 20        directory 
4480: 66 6f 72 20 74 68 65 20 6d 69 78 65 64 2d 6d 6f  for the mixed-mo
4490: 64 65 20 61 73 73 65 6d 62 6c 79 20 28 61 2e 6b  de assembly (a.k
44a0: 2e 61 2e 20 74 68 65 20 6e 61 74 69 76 65 20 69  .a. the native i
44b0: 6e 74 65 72 6f 70 0d 0a 20 20 20 20 20 20 23 20  nterop..      # 
44c0: 20 20 20 20 20 20 61 73 73 65 6d 62 6c 79 29 2e        assembly).
44d0: 20 20 54 6f 20 65 6e 61 62 6c 65 20 74 68 69 73    To enable this
44e0: 20 6f 70 74 69 6f 6e 20 76 69 61 20 74 68 65 20   option via the 
44f0: 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 2c 20 65 6e  command line, en
4500: 74 65 72 20 61 0d 0a 20 20 20 20 20 20 23 20 20  ter a..      #  
4510: 20 20 20 20 20 63 6f 6d 6d 61 6e 64 20 73 69 6d       command sim
4520: 69 6c 61 72 20 74 6f 20 6f 6e 65 20 6f 66 20 74  ilar to one of t
4530: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 28 61 6c  he following (al
4540: 6c 20 6f 6e 20 6f 6e 65 20 6c 69 6e 65 29 3a 0d  l on one line):.
4550: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
4560: 23 20 20 20 20 20 20 20 45 61 67 6c 65 53 68 65  #       EagleShe
4570: 6c 6c 2e 65 78 65 20 2d 69 6e 69 74 69 61 6c 69  ll.exe -initiali
4580: 7a 65 20 2d 72 75 6e 74 69 6d 65 4f 70 74 69 6f  ze -runtimeOptio
4590: 6e 20 6e 61 74 69 76 65 0d 0a 20 20 20 20 20 20  n native..      
45a0: 23 20 20 20 20 20 20 20 20 20 2d 66 69 6c 65 20  #         -file 
45b0: 2e 5c 70 61 74 68 5c 74 6f 5c 61 6c 6c 2e 65 61  .\path\to\all.ea
45c0: 67 6c 65 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  gle..      #..  
45d0: 20 20 20 20 23 20 20 20 20 20 20 20 54 6f 20 65      #       To e
45e0: 6e 61 62 6c 65 20 74 68 69 73 20 6f 70 74 69 6f  nable this optio
45f0: 6e 20 76 69 61 20 74 68 65 20 63 6f 6d 6d 61 6e  n via the comman
4600: 64 20 6c 69 6e 65 20 70 72 69 6f 72 20 74 6f 20  d line prior to 
4610: 74 68 65 20 22 62 65 74 61 20 31 36 22 0d 0a 20  the "beta 16".. 
4620: 20 20 20 20 20 23 20 20 20 20 20 20 20 72 65 6c       #       rel
4630: 65 61 73 65 20 6f 66 20 45 61 67 6c 65 2c 20 74  ease of Eagle, t
4640: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6d  he following com
4650: 6d 61 6e 64 20 6d 75 73 74 20 62 65 20 75 73 65  mand must be use
4660: 64 20 69 6e 73 74 65 61 64 0d 0a 20 20 20 20 20  d instead..     
4670: 20 23 20 20 20 20 20 20 20 28 61 6c 73 6f 20 61   #       (also a
4680: 6c 6c 20 6f 6e 20 6f 6e 65 20 6c 69 6e 65 29 3a  ll on one line):
4690: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
46a0: 20 23 20 20 20 20 20 20 20 45 61 67 6c 65 53 68   #       EagleSh
46b0: 65 6c 6c 2e 65 78 65 20 2d 69 6e 69 74 69 61 6c  ell.exe -initial
46c0: 69 7a 65 20 2d 70 6f 73 74 49 6e 69 74 69 61 6c  ize -postInitial
46d0: 69 7a 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ize..      #    
46e0: 20 20 20 20 20 22 6f 62 6a 65 63 74 20 69 6e 76       "object inv
46f0: 6f 6b 65 20 49 6e 74 65 72 70 72 65 74 65 72 2e  oke Interpreter.
4700: 47 65 74 41 63 74 69 76 65 20 41 64 64 52 75 6e  GetActive AddRun
4710: 74 69 6d 65 4f 70 74 69 6f 6e 20 6e 61 74 69 76  timeOption nativ
4720: 65 22 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  e"..      #     
4730: 20 20 20 20 2d 66 69 6c 65 20 2e 5c 70 61 74 68      -file .\path
4740: 5c 74 6f 5c 61 6c 6c 2e 65 61 67 6c 65 0d 0a 20  \to\all.eagle.. 
4750: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66       #..      if
4760: 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a   {[info exists :
4770: 3a 62 75 69 6c 64 5f 64 69 72 65 63 74 6f 72 79  :build_directory
4780: 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20  ] && \..        
4790: 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68    [string length
47a0: 20 24 3a 3a 62 75 69 6c 64 5f 64 69 72 65 63 74   $::build_direct
47b0: 6f 72 79 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b  ory] > 0} then {
47c0: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
47d0: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 65       # NOTE: The
47e0: 20 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 74 68 65   location of the
47f0: 20 62 75 69 6c 64 20 64 69 72 65 63 74 6f 72 79   build directory
4800: 20 68 61 73 20 62 65 65 6e 20 6f 76 65 72 72 69   has been overri
4810: 64 64 65 6e 3b 0d 0a 20 20 20 20 20 20 20 20 23  dden;..        #
4820: 20 20 20 20 20 20 20 74 68 65 72 65 66 6f 72 65         therefore
4830: 2c 20 75 73 65 20 69 74 20 76 65 72 62 61 74 69  , use it verbati
4840: 6d 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  m...        #.. 
4850: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 3a         return $:
4860: 3a 62 75 69 6c 64 5f 64 69 72 65 63 74 6f 72 79  :build_directory
4870: 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b  ..      } else {
4880: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
4890: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 66 20       # NOTE: If 
48a0: 74 68 65 20 22 6e 61 74 69 76 65 22 20 72 75 6e  the "native" run
48b0: 74 69 6d 65 20 6f 70 74 69 6f 6e 20 69 73 20 73  time option is s
48c0: 65 74 2c 20 74 68 65 20 6d 69 78 65 64 2d 6d 6f  et, the mixed-mo
48d0: 64 65 20 61 73 73 65 6d 62 6c 79 0d 0a 20 20 20  de assembly..   
48e0: 20 20 20 20 20 23 20 20 20 20 20 20 20 69 73 20       #       is 
48f0: 62 65 69 6e 67 20 74 65 73 74 65 64 2e 20 20 49  being tested.  I
4900: 6e 20 74 68 61 74 20 63 61 73 65 2c 20 74 68 65  n that case, the
4910: 20 70 61 74 68 20 74 6f 20 74 68 65 20 62 75 69   path to the bui
4920: 6c 64 20 64 69 72 65 63 74 6f 72 79 0d 0a 20 20  ld directory..  
4930: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 77 69        #       wi
4940: 6c 6c 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 70  ll contain the p
4950: 6c 61 74 66 6f 72 6d 20 6e 61 6d 65 20 61 6e 64  latform name and
4960: 20 61 6c 6c 20 74 68 65 20 62 69 6e 61 72 69 65   all the binarie
4970: 73 20 75 6e 64 65 72 20 74 65 73 74 0d 0a 20 20  s under test..  
4980: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 73 68        #       sh
4990: 6f 75 6c 64 20 62 65 20 70 72 65 73 65 6e 74 20  ould be present 
49a0: 69 6e 20 74 68 61 74 20 64 69 72 65 63 74 6f 72  in that director
49b0: 79 2e 20 20 49 66 20 74 68 65 20 22 6e 61 74 69  y.  If the "nati
49c0: 76 65 22 20 72 75 6e 74 69 6d 65 0d 0a 20 20 20  ve" runtime..   
49d0: 20 20 20 20 20 23 20 20 20 20 20 20 20 6f 70 74       #       opt
49e0: 69 6f 6e 20 69 73 20 6e 6f 74 20 73 65 74 2c 20  ion is not set, 
49f0: 74 68 65 20 62 75 69 6c 64 20 64 69 72 65 63 74  the build direct
4a00: 6f 72 79 20 77 69 6c 6c 20 62 65 20 63 6f 6e 73  ory will be cons
4a10: 69 64 65 72 65 64 20 74 6f 20 62 65 0d 0a 20 20  idered to be..  
4a20: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 22 70        #       "p
4a30: 6c 61 74 66 6f 72 6d 2d 6e 65 75 74 72 61 6c 22  latform-neutral"
4a40: 2c 20 77 69 74 68 20 74 68 65 20 6e 6f 74 61 62  , with the notab
4a50: 6c 65 20 65 78 63 65 70 74 69 6f 6e 20 6f 66 20  le exception of 
4a60: 61 6e 79 20 6e 61 74 69 76 65 0d 0a 20 20 20 20  any native..    
4a70: 20 20 20 20 23 20 20 20 20 20 20 20 61 73 73 65      #       asse
4a80: 6d 62 6c 79 20 28 65 2e 67 2e 20 22 53 51 4c 69  mbly (e.g. "SQLi
4a90: 74 65 2e 49 6e 74 65 72 6f 70 2e 64 6c 6c 22 29  te.Interop.dll")
4aa0: 20 63 6f 70 69 65 64 20 74 68 65 72 65 20 64 75   copied there du
4ab0: 72 69 6e 67 20 74 68 65 0d 0a 20 20 20 20 20 20  ring the..      
4ac0: 20 20 23 20 20 20 20 20 20 20 62 75 69 6c 64 20    #       build 
4ad0: 70 72 6f 63 65 73 73 20 69 74 73 65 6c 66 2e 20  process itself. 
4ae0: 20 49 66 20 74 68 65 20 62 75 69 6c 64 20 70 72   If the build pr
4af0: 6f 63 65 73 73 20 73 6f 6d 65 68 6f 77 20 64 6f  ocess somehow do
4b00: 65 73 20 6e 6f 74 0d 0a 20 20 20 20 20 20 20 20  es not..        
4b10: 23 20 20 20 20 20 20 20 63 6f 70 79 20 74 68 65  #       copy the
4b20: 20 6e 61 74 69 76 65 20 61 73 73 65 6d 62 6c 79   native assembly
4b30: 20 66 6f 72 20 74 68 69 73 20 70 6c 61 74 66 6f   for this platfo
4b40: 72 6d 2c 20 6d 6f 73 74 20 6f 66 20 74 68 65 20  rm, most of the 
4b50: 74 65 73 74 73 0d 0a 20 20 20 20 20 20 20 20 23  tests..        #
4b60: 20 20 20 20 20 20 20 69 6e 20 74 68 65 20 73 75         in the su
4b70: 69 74 65 20 77 69 6c 6c 20 73 69 6d 70 6c 79 20  ite will simply 
4b80: 62 65 20 73 6b 69 70 70 65 64 2e 20 20 47 65 6e  be skipped.  Gen
4b90: 65 72 61 6c 6c 79 20 73 70 65 61 6b 69 6e 67 2c  erally speaking,
4ba0: 20 74 68 65 72 65 0d 0a 20 20 20 20 20 20 20 20   there..        
4bb0: 23 20 20 20 20 20 20 20 61 72 65 20 74 77 6f 20  #       are two 
4bc0: 77 61 79 73 20 74 6f 20 62 75 69 6c 64 20 74 68  ways to build th
4bd0: 65 20 62 69 6e 61 72 69 65 73 20 77 68 65 6e 20  e binaries when 
4be0: 70 72 65 70 61 72 69 6e 67 20 74 6f 20 72 75 6e  preparing to run
4bf0: 20 74 68 65 0d 0a 20 20 20 20 20 20 20 20 23 20   the..        # 
4c00: 20 20 20 20 20 20 74 65 73 74 20 73 75 69 74 65        test suite
4c10: 3a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  :..        #..  
4c20: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 31 2e        #       1.
4c30: 20 42 75 69 6c 64 20 74 68 65 20 73 65 70 61 72   Build the separ
4c40: 61 74 65 20 6d 61 6e 61 67 65 64 20 61 6e 64 20  ate managed and 
4c50: 6e 61 74 69 76 65 20 61 73 73 65 6d 62 6c 69 65  native assemblie
4c60: 73 20 75 73 69 6e 67 20 73 6f 6d 65 0d 0a 20 20  s using some..  
4c70: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 20 20        #         
4c80: 20 63 6f 6d 6d 61 6e 64 73 20 73 69 6d 69 6c 61   commands simila
4c90: 72 20 74 6f 3a 0d 0a 20 20 20 20 20 20 20 20 23  r to:..        #
4ca0: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
4cb0: 20 20 20 20 20 62 75 69 6c 64 2e 62 61 74 20 24       build.bat $
4cc0: 7b 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 7d 4d  {Configuration}M
4cd0: 61 6e 61 67 65 64 4f 6e 6c 79 20 24 7b 50 6c 61  anagedOnly ${Pla
4ce0: 74 66 6f 72 6d 7d 0d 0a 20 20 20 20 20 20 20 20  tform}..        
4cf0: 23 20 20 20 20 20 20 20 20 20 20 62 75 69 6c 64  #          build
4d00: 2e 62 61 74 20 24 7b 43 6f 6e 66 69 67 75 72 61  .bat ${Configura
4d10: 74 69 6f 6e 7d 4e 61 74 69 76 65 4f 6e 6c 79 20  tion}NativeOnly 
4d20: 24 7b 50 6c 61 74 66 6f 72 6d 7d 0d 0a 20 20 20  ${Platform}..   
4d30: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
4d40: 23 20 20 20 20 20 20 20 20 20 20 57 68 65 72 65  #          Where
4d50: 20 24 7b 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e   ${Configuration
4d60: 7d 20 69 73 20 65 69 74 68 65 72 20 22 44 65 62  } is either "Deb
4d70: 75 67 22 20 6f 72 20 22 52 65 6c 65 61 73 65 22  ug" or "Release"
4d80: 20 61 6e 64 0d 0a 20 20 20 20 20 20 20 20 23 20   and..        # 
4d90: 20 20 20 20 20 20 20 20 20 24 7b 50 6c 61 74 66           ${Platf
4da0: 6f 72 6d 7d 20 69 73 20 65 69 74 68 65 72 20 22  orm} is either "
4db0: 57 69 6e 33 32 22 20 6f 72 20 22 78 36 34 22 2e  Win32" or "x64".
4dc0: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
4dd0: 20 20 20 20 20 23 20 20 20 20 20 20 20 32 2e 20       #       2. 
4de0: 42 75 69 6c 64 20 74 68 65 20 6d 69 78 65 64 2d  Build the mixed-
4df0: 6d 6f 64 65 20 61 73 73 65 6d 62 6c 79 20 75 73  mode assembly us
4e00: 69 6e 67 20 61 20 63 6f 6d 6d 61 6e 64 20 73 69  ing a command si
4e10: 6d 69 6c 61 72 20 74 6f 3a 0d 0a 20 20 20 20 20  milar to:..     
4e20: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
4e30: 20 20 20 20 20 20 20 20 20 62 75 69 6c 64 2e 62           build.b
4e40: 61 74 20 24 7b 43 6f 6e 66 69 67 75 72 61 74 69  at ${Configurati
4e50: 6f 6e 7d 20 24 7b 50 6c 61 74 66 6f 72 6d 7d 0d  on} ${Platform}.
4e60: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
4e70: 20 20 20 20 23 20 20 20 20 20 20 20 20 20 20 57      #          W
4e80: 68 65 72 65 20 24 7b 43 6f 6e 66 69 67 75 72 61  here ${Configura
4e90: 74 69 6f 6e 7d 20 69 73 20 65 69 74 68 65 72 20  tion} is either 
4ea0: 22 44 65 62 75 67 22 20 6f 72 20 22 52 65 6c 65  "Debug" or "Rele
4eb0: 61 73 65 22 20 61 6e 64 0d 0a 20 20 20 20 20 20  ase" and..      
4ec0: 20 20 23 20 20 20 20 20 20 20 20 20 20 24 7b 50    #          ${P
4ed0: 6c 61 74 66 6f 72 6d 7d 20 69 73 20 65 69 74 68  latform} is eith
4ee0: 65 72 20 22 57 69 6e 33 32 22 20 6f 72 20 22 78  er "Win32" or "x
4ef0: 36 34 22 2e 20 20 49 66 20 74 68 69 73 20 63 6f  64".  If this co
4f00: 6d 6d 61 6e 64 20 69 73 0d 0a 20 20 20 20 20 20  mmand is..      
4f10: 20 20 23 20 20 20 20 20 20 20 20 20 20 75 73 65    #          use
4f20: 64 2c 20 76 61 72 69 6f 75 73 20 74 65 73 74 73  d, various tests
4f30: 20 74 68 61 74 20 72 65 71 75 69 72 65 20 73 75   that require su
4f40: 70 70 6c 65 6d 65 6e 74 61 72 79 20 6d 61 6e 61  pplementary mana
4f50: 67 65 64 0d 0a 20 20 20 20 20 20 20 20 23 20 20  ged..        #  
4f60: 20 20 20 20 20 20 20 20 61 73 73 65 6d 62 6c 69          assembli
4f70: 65 73 20 28 65 2e 67 2e 20 4c 49 4e 51 29 20 6d  es (e.g. LINQ) m
4f80: 61 79 20 62 65 20 73 6b 69 70 70 65 64 20 75 6e  ay be skipped un
4f90: 6c 65 73 73 20 74 68 6f 73 65 20 62 69 6e 61 72  less those binar
4fa0: 69 65 73 0d 0a 20 20 20 20 20 20 20 20 23 20 20  ies..        #  
4fb0: 20 20 20 20 20 20 20 20 61 72 65 20 73 75 62 73          are subs
4fc0: 65 71 75 65 6e 74 6c 79 20 63 6f 70 69 65 64 20  equently copied 
4fd0: 69 6e 74 6f 20 74 68 65 20 63 6f 72 72 65 63 74  into the correct
4fe0: 20 64 69 72 65 63 74 6f 72 79 20 28 69 2e 65 2e   directory (i.e.
4ff0: 20 62 79 0d 0a 20 20 20 20 20 20 20 20 23 20 20   by..        #  
5000: 20 20 20 20 20 20 20 20 22 74 65 73 74 5f 61 6c          "test_al
5010: 6c 2e 62 61 74 22 29 2e 0d 0a 20 20 20 20 20 20  l.bat")...      
5020: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 20    #..        #  
5030: 20 20 20 20 20 4e 6f 74 65 20 74 68 61 74 20 61       Note that a
5040: 6c 6c 20 6f 66 20 74 68 65 20 62 75 69 6c 64 20  ll of the build 
5050: 63 6f 6d 6d 61 6e 64 73 20 61 62 6f 76 65 20 77  commands above w
5060: 69 6c 6c 20 64 65 66 61 75 6c 74 20 74 6f 20 75  ill default to u
5070: 73 69 6e 67 0d 0a 20 20 20 20 20 20 20 20 23 20  sing..        # 
5080: 20 20 20 20 20 20 74 68 65 20 6c 61 74 65 73 74        the latest
5090: 20 76 65 72 73 69 6f 6e 20 6f 66 20 4d 53 42 75   version of MSBu
50a0: 69 6c 64 20 61 76 61 69 6c 61 62 6c 65 20 61 6e  ild available an
50b0: 64 20 74 68 65 20 22 74 65 73 74 5f 79 65 61 72  d the "test_year
50c0: 22 20 6d 61 79 0d 0a 20 20 20 20 20 20 20 20 23  " may..        #
50d0: 20 20 20 20 20 20 20 6e 65 65 64 20 74 6f 20 62         need to b
50e0: 65 20 61 64 6a 75 73 74 65 64 20 61 63 63 6f 72  e adjusted accor
50f0: 64 69 6e 67 6c 79 20 74 6f 20 61 63 74 75 61 6c  dingly to actual
5100: 6c 79 20 72 75 6e 20 74 68 65 20 74 65 73 74 20  ly run the test 
5110: 73 75 69 74 65 2e 0d 0a 20 20 20 20 20 20 20 20  suite...        
5120: 23 20 20 20 20 20 20 20 52 65 66 65 72 20 74 6f  #       Refer to
5130: 20 74 68 65 20 63 6f 6d 6d 65 6e 74 73 20 69 6e   the comments in
5140: 20 5b 67 65 74 42 75 69 6c 64 59 65 61 72 5d 20   [getBuildYear] 
5150: 66 6f 72 20 6d 6f 72 65 20 69 6e 66 6f 72 6d 61  for more informa
5160: 74 69 6f 6e 20 6f 6e 0d 0a 20 20 20 20 20 20 20  tion on..       
5170: 20 23 20 20 20 20 20 20 20 68 6f 77 20 74 6f 20   #       how to 
5180: 73 65 74 20 74 68 69 73 20 76 61 72 69 61 62 6c  set this variabl
5190: 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  e...        #.. 
51a0: 20 20 20 20 20 20 20 73 65 74 20 6e 61 74 69 76         set nativ
51b0: 65 20 5b 68 61 73 52 75 6e 74 69 6d 65 4f 70 74  e [hasRuntimeOpt
51c0: 69 6f 6e 20 6e 61 74 69 76 65 5d 0d 0a 0d 0a 20  ion native].... 
51d0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b 6a         return [j
51e0: 6f 69 6e 42 75 69 6c 64 44 69 72 65 63 74 6f 72  oinBuildDirector
51f0: 79 20 24 6e 61 74 69 76 65 20 5b 67 65 74 42 75  y $native [getBu
5200: 69 6c 64 42 61 73 65 44 69 72 65 63 74 6f 72 79  ildBaseDirectory
5210: 5d 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ] \..           
5220: 20 5b 67 65 74 42 75 69 6c 64 59 65 61 72 5d 20   [getBuildYear] 
5230: 5b 67 65 74 42 75 69 6c 64 50 6c 61 74 66 6f 72  [getBuildPlatfor
5240: 6d 20 24 6e 61 74 69 76 65 5d 20 5b 67 65 74 42  m $native] [getB
5250: 75 69 6c 64 43 6f 6e 66 69 67 75 72 61 74 69 6f  uildConfiguratio
5260: 6e 5d 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20  n]]..      }..  
5270: 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
5280: 20 67 65 74 52 65 6c 65 61 73 65 56 65 72 73 69   getReleaseVersi
5290: 6f 6e 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 23  on {} {..      #
52a0: 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
52b0: 46 69 67 75 72 65 20 6f 75 74 20 74 68 65 20 72  Figure out the r
52c0: 65 6c 65 61 73 65 20 76 65 72 73 69 6f 6e 20 66  elease version f
52d0: 6f 72 20 75 73 65 20 77 69 74 68 20 74 68 65 20  or use with the 
52e0: 62 75 69 6c 64 20 64 69 72 65 63 74 6f 72 79 0d  build directory.
52f0: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 77  .      #       w
5300: 68 65 6e 20 63 68 65 63 6b 69 6e 67 20 66 6f 72  hen checking for
5310: 20 61 76 61 69 6c 61 62 6c 65 20 72 65 6c 65 61   available relea
5320: 73 65 73 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ses...      #.. 
5330: 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65       if {[info e
5340: 78 69 73 74 73 20 3a 3a 72 65 6c 65 61 73 65 5f  xists ::release_
5350: 76 65 72 73 69 6f 6e 5d 20 26 26 20 5c 0d 0a 20  version] && \.. 
5360: 20 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67           [string
5370: 20 6c 65 6e 67 74 68 20 24 3a 3a 72 65 6c 65 61   length $::relea
5380: 73 65 5f 76 65 72 73 69 6f 6e 5d 20 3e 20 30 7d  se_version] > 0}
5390: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
53a0: 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
53b0: 54 45 3a 20 54 68 65 20 72 65 6c 65 61 73 65 20  TE: The release 
53c0: 76 65 72 73 69 6f 6e 20 68 61 73 20 62 65 65 6e  version has been
53d0: 20 6f 76 65 72 72 69 64 64 65 6e 3b 20 74 68 65   overridden; the
53e0: 72 65 66 6f 72 65 2c 20 75 73 65 20 69 74 0d 0a  refore, use it..
53f0: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
5400: 76 65 72 62 61 74 69 6d 2e 0d 0a 20 20 20 20 20  verbatim...     
5410: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65     #..        re
5420: 74 75 72 6e 20 24 3a 3a 72 65 6c 65 61 73 65 5f  turn $::release_
5430: 76 65 72 73 69 6f 6e 0d 0a 20 20 20 20 20 20 7d  version..      }
5440: 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
5450: 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
5460: 54 45 3a 20 4e 6f 20 72 65 6c 65 61 73 65 20 76  TE: No release v
5470: 65 72 73 69 6f 6e 20 69 73 20 61 76 61 69 6c 61  ersion is availa
5480: 62 6c 65 2c 20 72 65 74 75 72 6e 20 61 6e 20 65  ble, return an e
5490: 6d 70 74 79 20 73 74 72 69 6e 67 2e 0d 0a 20 20  mpty string...  
54a0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 49 74        #       It
54b0: 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f   is important to
54c0: 20 72 65 74 75 72 6e 20 61 6e 20 65 6d 70 74 79   return an empty
54d0: 20 73 74 72 69 6e 67 20 68 65 72 65 20 62 65 63   string here bec
54e0: 61 75 73 65 20 74 68 65 0d 0a 20 20 20 20 20 20  ause the..      
54f0: 20 20 23 20 20 20 20 20 20 20 72 65 73 75 6c 74    #       result
5500: 20 6f 66 20 74 68 69 73 20 70 72 6f 63 65 64 75   of this procedu
5510: 72 65 20 6d 61 79 20 62 65 20 75 73 65 64 20 77  re may be used w
5520: 69 74 68 20 5b 66 69 6c 65 20 6a 6f 69 6e 5d 2e  ith [file join].
5530: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
5540: 20 20 20 20 20 72 65 74 75 72 6e 20 22 22 0d 0a       return ""..
5550: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a        }..    }..
5560: 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74 42  ...    proc getB
5570: 75 69 6c 64 46 69 6c 65 4e 61 6d 65 20 7b 20 66  uildFileName { f
5580: 69 6c 65 4e 61 6d 65 20 7b 70 6c 61 74 66 6f 72  ileName {platfor
5590: 6d 20 22 22 7d 20 7d 20 7b 0d 0a 20 20 20 20 20  m ""} } {..     
55a0: 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
55b0: 3a 20 52 65 74 75 72 6e 73 20 74 68 65 20 73 70  : Returns the sp
55c0: 65 63 69 66 69 65 64 20 66 69 6c 65 20 6e 61 6d  ecified file nam
55d0: 65 20 61 73 20 69 66 20 69 74 20 77 65 72 65 20  e as if it were 
55e0: 6c 6f 63 61 74 65 64 20 69 6e 20 74 68 65 0d 0a  located in the..
55f0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 62 75        #       bu
5600: 69 6c 64 20 64 69 72 65 63 74 6f 72 79 2c 20 64  ild directory, d
5610: 69 73 63 61 72 64 69 6e 67 20 61 6e 79 20 64 69  iscarding any di
5620: 72 65 63 74 6f 72 79 20 69 6e 66 6f 72 6d 61 74  rectory informat
5630: 69 6f 6e 20 70 72 65 73 65 6e 74 0d 0a 20 20 20  ion present..   
5640: 20 20 20 23 20 20 20 20 20 20 20 69 6e 20 74 68     #       in th
5650: 65 20 66 69 6c 65 20 6e 61 6d 65 20 61 73 20 70  e file name as p
5660: 72 6f 76 69 64 65 64 20 62 79 20 6f 75 72 20 63  rovided by our c
5670: 61 6c 6c 65 72 2e 0d 0a 20 20 20 20 20 20 23 0d  aller...      #.
5680: 0a 20 20 20 20 20 20 73 65 74 20 72 65 73 75 6c  .      set resul
5690: 74 20 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e 61  t [file nativena
56a0: 6d 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  me \..          
56b0: 5b 66 69 6c 65 20 6a 6f 69 6e 20 5b 67 65 74 42  [file join [getB
56c0: 75 69 6c 64 44 69 72 65 63 74 6f 72 79 5d 20 24  uildDirectory] $
56d0: 70 6c 61 74 66 6f 72 6d 20 5b 66 69 6c 65 20 74  platform [file t
56e0: 61 69 6c 20 24 66 69 6c 65 4e 61 6d 65 5d 5d 5d  ail $fileName]]]
56f0: 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  ....      #..   
5700: 20 20 20 23 20 48 41 43 4b 3a 20 57 68 65 6e 20     # HACK: When 
5710: 72 75 6e 6e 69 6e 67 20 6f 6e 20 57 6f 57 36 34  running on WoW64
5720: 2c 20 61 73 73 75 6d 65 20 74 68 65 20 74 65 73  , assume the tes
5730: 74 20 65 78 65 63 75 74 61 62 6c 65 73 20 61 72  t executables ar
5740: 65 20 70 72 65 73 65 6e 74 0d 0a 20 20 20 20 20  e present..     
5750: 20 23 20 20 20 20 20 20 20 77 69 74 68 20 74 68   #       with th
5760: 65 20 22 33 32 22 20 73 75 66 66 69 78 20 6f 6e  e "32" suffix on
5770: 20 74 68 65 6d 2e 0d 0a 20 20 20 20 20 20 23 0d   them...      #.
5780: 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 73 52 75  .      if {[isRu
5790: 6e 6e 69 6e 67 57 6f 57 36 34 5d 20 26 26 20 5b  nningWoW64] && [
57a0: 66 69 6c 65 20 65 78 74 65 6e 73 69 6f 6e 20 24  file extension $
57b0: 72 65 73 75 6c 74 5d 20 65 71 20 22 2e 65 78 65  result] eq ".exe
57c0: 22 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  "} then {..     
57d0: 20 20 20 73 65 74 20 72 65 73 75 6c 74 20 5b 61     set result [a
57e0: 70 70 65 6e 64 41 72 67 73 20 5b 66 69 6c 65 20  ppendArgs [file 
57f0: 72 6f 6f 74 6e 61 6d 65 20 24 72 65 73 75 6c 74  rootname $result
5800: 5d 20 33 32 2e 65 78 65 5d 0d 0a 20 20 20 20 20  ] 32.exe]..     
5810: 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65 74 75   }....      retu
5820: 72 6e 20 24 72 65 73 75 6c 74 0d 0a 20 20 20 20  rn $result..    
5830: 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67  }.....    proc g
5840: 65 74 45 78 74 65 72 6e 61 6c 44 69 72 65 63 74  etExternalDirect
5850: 6f 72 79 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20  ory {} {..      
5860: 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
5870: 20 54 68 69 73 20 70 72 6f 63 65 64 75 72 65 20   This procedure 
5880: 72 65 74 75 72 6e 73 20 74 68 65 20 64 69 72 65  returns the dire
5890: 63 74 6f 72 79 20 77 68 65 72 65 20 74 68 65 20  ctory where the 
58a0: 65 78 74 65 72 6e 61 6c 20 62 69 6e 61 72 79 0d  external binary.
58b0: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 66  .      #       f
58c0: 69 6c 65 73 20 61 72 65 20 6c 6f 63 61 74 65 64  iles are located
58d0: 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
58e0: 20 20 72 65 74 75 72 6e 20 5b 66 69 6c 65 20 6e    return [file n
58f0: 61 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c 65 20  ativename [file 
5900: 64 69 72 6e 61 6d 65 20 5b 66 69 6c 65 20 64 69  dirname [file di
5910: 72 6e 61 6d 65 20 5b 69 6e 66 6f 20 62 69 6e 61  rname [info bina
5920: 72 79 5d 5d 5d 5d 0d 0a 20 20 20 20 7d 0d 0a 0c  ry]]]]..    }...
5930: 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74 42 69  ..    proc getBi
5940: 6e 61 72 79 44 69 72 65 63 74 6f 72 79 20 7b 7d  naryDirectory {}
5950: 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20   {..      #..   
5960: 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 69 73 20     # NOTE: This 
5970: 70 72 6f 63 65 64 75 72 65 20 72 65 74 75 72 6e  procedure return
5980: 73 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20  s the directory 
5990: 77 68 65 72 65 20 74 68 65 20 74 65 73 74 20 61  where the test a
59a0: 70 70 6c 69 63 61 74 69 6f 6e 0d 0a 20 20 20 20  pplication..    
59b0: 20 20 23 20 20 20 20 20 20 20 69 74 73 65 6c 66    #       itself
59c0: 20 28 69 2e 65 2e 20 74 68 65 20 45 61 67 6c 65   (i.e. the Eagle
59d0: 20 73 68 65 6c 6c 29 20 69 73 20 6c 6f 63 61 74   shell) is locat
59e0: 65 64 2e 20 20 54 68 69 73 20 77 69 6c 6c 20 62  ed.  This will b
59f0: 65 20 75 73 65 64 20 61 73 0d 0a 20 20 20 20 20  e used as..     
5a00: 20 23 20 20 20 20 20 20 20 74 68 65 20 64 65 73   #       the des
5a10: 74 69 6e 61 74 69 6f 6e 20 66 6f 72 20 74 68 65  tination for the
5a20: 20 63 6f 70 69 65 64 20 53 79 73 74 65 6d 2e 44   copied System.D
5a30: 61 74 61 2e 53 51 4c 69 74 65 20 6e 61 74 69 76  ata.SQLite nativ
5a40: 65 20 61 6e 64 0d 0a 20 20 20 20 20 20 23 20 20  e and..      #  
5a50: 20 20 20 20 20 6d 61 6e 61 67 65 64 20 61 73 73       managed ass
5a60: 65 6d 62 6c 69 65 73 20 28 69 2e 65 2e 20 62 65  emblies (i.e. be
5a70: 63 61 75 73 65 20 74 68 69 73 20 69 73 20 6f 6e  cause this is on
5a80: 65 20 6f 66 20 74 68 65 20 66 65 77 20 70 6c 61  e of the few pla
5a90: 63 65 73 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ces..      #    
5aa0: 20 20 20 77 68 65 72 65 20 74 68 65 20 43 4c 52     where the CLR
5ab0: 20 77 69 6c 6c 20 61 63 74 75 61 6c 6c 79 20 66   will actually f
5ac0: 69 6e 64 20 61 6e 64 20 6c 6f 61 64 20 74 68 65  ind and load the
5ad0: 6d 20 70 72 6f 70 65 72 6c 79 29 2e 0d 0a 20 20  m properly)...  
5ae0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20      #..      if 
5af0: 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  {[info exists ::
5b00: 62 69 6e 61 72 79 5f 64 69 72 65 63 74 6f 72 79  binary_directory
5b10: 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20  ] && \..        
5b20: 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68    [string length
5b30: 20 24 3a 3a 62 69 6e 61 72 79 5f 64 69 72 65 63   $::binary_direc
5b40: 74 6f 72 79 5d 20 3e 20 30 7d 20 74 68 65 6e 20  tory] > 0} then 
5b50: 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
5b60: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68        # NOTE: Th
5b70: 65 20 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 74 68  e location of th
5b80: 65 20 62 69 6e 61 72 79 20 64 69 72 65 63 74 6f  e binary directo
5b90: 72 79 20 68 61 73 20 62 65 65 6e 20 6f 76 65 72  ry has been over
5ba0: 72 69 64 64 65 6e 3b 0d 0a 20 20 20 20 20 20 20  ridden;..       
5bb0: 20 23 20 20 20 20 20 20 20 74 68 65 72 65 66 6f   #       therefo
5bc0: 72 65 2c 20 75 73 65 20 69 74 20 76 65 72 62 61  re, use it verba
5bd0: 74 69 6d 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  tim...        #.
5be0: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
5bf0: 24 3a 3a 62 69 6e 61 72 79 5f 64 69 72 65 63 74  $::binary_direct
5c00: 6f 72 79 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73  ory..      } els
5c10: 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 72 65 74  e {..        ret
5c20: 75 72 6e 20 5b 69 6e 66 6f 20 62 69 6e 61 72 79  urn [info binary
5c30: 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  ]..      }..    
5c40: 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67  }.....    proc g
5c50: 65 74 45 78 74 65 72 6e 61 6c 46 69 6c 65 4e 61  etExternalFileNa
5c60: 6d 65 20 7b 20 66 69 6c 65 4e 61 6d 65 20 7d 20  me { fileName } 
5c70: 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  {..      #..    
5c80: 20 20 23 20 4e 4f 54 45 3a 20 52 65 74 75 72 6e    # NOTE: Return
5c90: 73 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  s the specified 
5ca0: 66 69 6c 65 20 6e 61 6d 65 20 61 73 20 69 66 20  file name as if 
5cb0: 69 74 20 77 65 72 65 20 6c 6f 63 61 74 65 64 20  it were located 
5cc0: 69 6e 20 74 68 65 0d 0a 20 20 20 20 20 20 23 20  in the..      # 
5cd0: 20 20 20 20 20 20 64 69 72 65 63 74 6f 72 79 20        directory 
5ce0: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 65  containing the e
5cf0: 78 74 65 72 6e 61 6c 20 62 69 6e 61 72 69 65 73  xternal binaries
5d00: 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
5d10: 20 20 72 65 74 75 72 6e 20 5b 66 69 6c 65 20 6e    return [file n
5d20: 61 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c 65 20  ativename [file 
5d30: 6a 6f 69 6e 20 5b 67 65 74 45 78 74 65 72 6e 61  join [getExterna
5d40: 6c 44 69 72 65 63 74 6f 72 79 5d 20 24 66 69 6c  lDirectory] $fil
5d50: 65 4e 61 6d 65 5d 5d 0d 0a 20 20 20 20 7d 0d 0a  eName]]..    }..
5d60: 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74 42  ...    proc getB
5d70: 69 6e 61 72 79 46 69 6c 65 4e 61 6d 65 20 7b 20  inaryFileName { 
5d80: 66 69 6c 65 4e 61 6d 65 20 7b 70 6c 61 74 66 6f  fileName {platfo
5d90: 72 6d 20 22 22 7d 20 7d 20 7b 0d 0a 20 20 20 20  rm ""} } {..    
5da0: 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
5db0: 45 3a 20 52 65 74 75 72 6e 73 20 74 68 65 20 73  E: Returns the s
5dc0: 70 65 63 69 66 69 65 64 20 66 69 6c 65 20 6e 61  pecified file na
5dd0: 6d 65 20 61 73 20 69 66 20 69 74 20 77 65 72 65  me as if it were
5de0: 20 6c 6f 63 61 74 65 64 20 69 6e 20 74 68 65 0d   located in the.
5df0: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 62  .      #       b
5e00: 69 6e 61 72 79 20 64 69 72 65 63 74 6f 72 79 2c  inary directory,
5e10: 20 64 69 73 63 61 72 64 69 6e 67 20 61 6e 79 20   discarding any 
5e20: 64 69 72 65 63 74 6f 72 79 20 69 6e 66 6f 72 6d  directory inform
5e30: 61 74 69 6f 6e 20 70 72 65 73 65 6e 74 0d 0a 20  ation present.. 
5e40: 20 20 20 20 20 23 20 20 20 20 20 20 20 69 6e 20       #       in 
5e50: 74 68 65 20 66 69 6c 65 20 6e 61 6d 65 20 61 73  the file name as
5e60: 20 70 72 6f 76 69 64 65 64 20 62 79 20 6f 75 72   provided by our
5e70: 20 63 61 6c 6c 65 72 2e 0d 0a 20 20 20 20 20 20   caller...      
5e80: 23 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  #..      return 
5e90: 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65  [file nativename
5ea0: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 66   \..          [f
5eb0: 69 6c 65 20 6a 6f 69 6e 20 5b 67 65 74 42 69 6e  ile join [getBin
5ec0: 61 72 79 44 69 72 65 63 74 6f 72 79 5d 20 24 70  aryDirectory] $p
5ed0: 6c 61 74 66 6f 72 6d 20 5b 66 69 6c 65 20 74 61  latform [file ta
5ee0: 69 6c 20 24 66 69 6c 65 4e 61 6d 65 5d 5d 5d 0d  il $fileName]]].
5ef0: 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70  .    }.....    p
5f00: 72 6f 63 20 67 65 74 43 6f 72 65 42 69 6e 61 72  roc getCoreBinar
5f10: 79 46 69 6c 65 4e 61 6d 65 20 7b 20 7b 70 6c 61  yFileName { {pla
5f20: 74 66 6f 72 6d 20 22 22 7d 20 7b 73 74 61 6e 64  tform ""} {stand
5f30: 61 72 64 20 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a  ard false} } {..
5f40: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
5f50: 20 4e 4f 54 45 3a 20 52 65 74 75 72 6e 73 20 74   NOTE: Returns t
5f60: 68 65 20 66 75 6c 6c 20 70 61 74 68 20 66 6f 72  he full path for
5f70: 20 74 68 65 20 66 69 6c 65 20 63 6f 6e 74 61 69   the file contai
5f80: 6e 69 6e 67 20 74 68 65 20 53 51 4c 69 74 65 20  ning the SQLite 
5f90: 63 6f 72 65 0d 0a 20 20 20 20 20 20 23 20 20 20  core..      #   
5fa0: 20 20 20 20 6e 61 74 69 76 65 20 6c 69 62 72 61      native libra
5fb0: 72 79 20 63 6f 64 65 20 66 6f 72 20 74 68 69 73  ry code for this
5fc0: 20 70 6c 61 74 66 6f 72 6d 2e 20 20 46 69 72 73   platform.  Firs
5fd0: 74 2c 20 63 68 65 63 6b 20 61 6e 64 20 73 65 65  t, check and see
5fe0: 20 69 66 0d 0a 20 20 20 20 20 20 23 20 20 20 20   if..      #    
5ff0: 20 20 20 74 68 65 20 53 51 4c 69 74 65 20 63 6f     the SQLite co
6000: 72 65 20 6e 61 74 69 76 65 20 6c 69 62 72 61 72  re native librar
6010: 79 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  y has already be
6020: 65 6e 20 6c 6f 61 64 65 64 2e 20 20 4e 65 78 74  en loaded.  Next
6030: 2c 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  ,..      #      
6040: 20 66 61 6c 6c 62 61 63 6b 20 74 6f 20 77 68 61   fallback to wha
6050: 74 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68 20  t the full path 
6060: 73 68 6f 75 6c 64 20 62 65 2c 20 62 61 73 65 64  should be, based
6070: 20 6f 6e 20 77 68 65 74 68 65 72 20 74 68 65 0d   on whether the.
6080: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 6d  .      #       m
6090: 69 78 65 64 2d 6d 6f 64 65 20 61 73 73 65 6d 62  ixed-mode assemb
60a0: 6c 79 20 69 73 20 62 65 69 6e 67 20 75 73 65 64  ly is being used
60b0: 20 61 6e 64 20 74 68 65 20 6e 61 6d 65 20 6f 66   and the name of
60c0: 20 74 68 65 20 63 75 72 72 65 6e 74 0d 0a 20 20   the current..  
60d0: 20 20 20 20 23 20 20 20 20 20 20 20 70 6c 61 74      #       plat
60e0: 66 6f 72 6d 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  form...      #..
60f0: 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68        if {[catch
6100: 20 7b 0d 0a 20 20 20 20 20 20 20 20 6f 62 6a 65   {..        obje
6110: 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73  ct invoke -flags
6120: 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20   +NonPublic \.. 
6130: 20 20 20 20 20 20 20 20 20 20 20 53 79 73 74 65             Syste
6140: 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 55 6e  m.Data.SQLite.Un
6150: 73 61 66 65 4e 61 74 69 76 65 4d 65 74 68 6f 64  safeNativeMethod
6160: 73 20 5f 53 51 4c 69 74 65 4e 61 74 69 76 65 4d  s _SQLiteNativeM
6170: 6f 64 75 6c 65 46 69 6c 65 4e 61 6d 65 0d 0a 20  oduleFileName.. 
6180: 20 20 20 20 20 7d 20 66 69 6c 65 4e 61 6d 65 5d       } fileName]
6190: 20 3d 3d 20 30 20 26 26 20 5b 73 74 72 69 6e 67   == 0 && [string
61a0: 20 6c 65 6e 67 74 68 20 24 66 69 6c 65 4e 61 6d   length $fileNam
61b0: 65 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  e] > 0} then {..
61c0: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
61d0: 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 65 20 53     # NOTE: The S
61e0: 51 4c 69 74 65 20 63 6f 72 65 20 6e 61 74 69 76  QLite core nativ
61f0: 65 20 6c 69 62 72 61 72 79 20 68 61 73 20 61 6c  e library has al
6200: 72 65 61 64 79 20 62 65 65 6e 20 6c 6f 61 64 65  ready been loade
6210: 64 20 76 69 61 0d 0a 20 20 20 20 20 20 20 20 23  d via..        #
6220: 20 20 20 20 20 20 20 74 68 65 20 6e 61 74 69 76         the nativ
6230: 65 20 6c 69 62 72 61 72 79 20 70 72 65 2d 6c 6f  e library pre-lo
6240: 61 64 65 72 2e 20 20 52 65 74 75 72 6e 20 74 68  ader.  Return th
6250: 61 74 20 66 69 6c 65 20 6e 61 6d 65 20 6e 6f 77  at file name now
6260: 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
6270: 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 66 69        return $fi
6280: 6c 65 4e 61 6d 65 0d 0a 20 20 20 20 20 20 7d 0d  leName..      }.
6290: 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 68 61  ...      if {[ha
62a0: 73 52 75 6e 74 69 6d 65 4f 70 74 69 6f 6e 20 6e  sRuntimeOption n
62b0: 61 74 69 76 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a  ative]} then {..
62c0: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
62d0: 20 20 20 23 20 4e 4f 54 45 3a 20 52 65 74 75 72     # NOTE: Retur
62e0: 6e 20 74 68 65 20 6d 69 78 65 64 2d 6d 6f 64 65  n the mixed-mode
62f0: 20 61 73 73 65 6d 62 6c 79 20 66 69 6c 65 20 6e   assembly file n
6300: 61 6d 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  ame...        #.
6310: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
6320: 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65  [file nativename
6330: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
6340: 5b 66 69 6c 65 20 6a 6f 69 6e 20 5b 67 65 74 42  [file join [getB
6350: 69 6e 61 72 79 44 69 72 65 63 74 6f 72 79 5d 20  inaryDirectory] 
6360: 24 70 6c 61 74 66 6f 72 6d 20 53 79 73 74 65 6d  $platform System
6370: 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 64 6c 6c  .Data.SQLite.dll
6380: 5d 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65  ]]..      } else
6390: 69 66 20 7b 24 73 74 61 6e 64 61 72 64 7d 20 74  if {$standard} t
63a0: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  hen {..        #
63b0: 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
63c0: 3a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 61 74  : Return the nat
63d0: 69 76 65 2d 6f 6e 6c 79 20 73 74 61 6e 64 61 72  ive-only standar
63e0: 64 20 53 51 4c 69 74 65 20 6c 69 62 72 61 72 79  d SQLite library
63f0: 20 66 69 6c 65 20 6e 61 6d 65 2e 0d 0a 20 20 20   file name...   
6400: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
6410: 72 65 74 75 72 6e 20 5b 66 69 6c 65 20 6e 61 74  return [file nat
6420: 69 76 65 6e 61 6d 65 20 5c 0d 0a 20 20 20 20 20  ivename \..     
6430: 20 20 20 20 20 20 20 5b 66 69 6c 65 20 6a 6f 69         [file joi
6440: 6e 20 5b 67 65 74 42 69 6e 61 72 79 44 69 72 65  n [getBinaryDire
6450: 63 74 6f 72 79 5d 20 24 70 6c 61 74 66 6f 72 6d  ctory] $platform
6460: 20 73 71 6c 69 74 65 33 2e 64 6c 6c 5d 5d 0d 0a   sqlite3.dll]]..
6470: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
6480: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
6490: 20 20 20 23 20 4e 4f 54 45 3a 20 52 65 74 75 72     # NOTE: Retur
64a0: 6e 20 74 68 65 20 6e 61 74 69 76 65 2d 6f 6e 6c  n the native-onl
64b0: 79 20 69 6e 74 65 72 6f 70 20 61 73 73 65 6d 62  y interop assemb
64c0: 6c 79 20 66 69 6c 65 20 6e 61 6d 65 2e 0d 0a 20  ly file name... 
64d0: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
64e0: 20 20 72 65 74 75 72 6e 20 5b 66 69 6c 65 20 6e    return [file n
64f0: 61 74 69 76 65 6e 61 6d 65 20 5c 0d 0a 20 20 20  ativename \..   
6500: 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20 6a           [file j
6510: 6f 69 6e 20 5b 67 65 74 42 69 6e 61 72 79 44 69  oin [getBinaryDi
6520: 72 65 63 74 6f 72 79 5d 20 24 70 6c 61 74 66 6f  rectory] $platfo
6530: 72 6d 20 53 51 4c 69 74 65 2e 49 6e 74 65 72 6f  rm SQLite.Intero
6540: 70 2e 64 6c 6c 5d 5d 0d 0a 20 20 20 20 20 20 7d  p.dll]]..      }
6550: 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
6560: 70 72 6f 63 20 67 65 74 43 6f 6d 6d 6f 6e 44 69  proc getCommonDi
6570: 72 65 63 74 6f 72 79 20 7b 7d 20 7b 0d 0a 20 20  rectory {} {..  
6580: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
6590: 4f 54 45 3a 20 54 68 69 73 20 70 72 6f 63 65 64  OTE: This proced
65a0: 75 72 65 20 72 65 74 75 72 6e 73 20 74 68 65 20  ure returns the 
65b0: 64 69 72 65 63 74 6f 72 79 20 77 68 65 72 65 20  directory where 
65c0: 74 68 65 20 74 65 73 74 20 73 63 72 69 70 74 73  the test scripts
65d0: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
65e0: 73 68 6f 75 6c 64 20 62 65 20 6c 6f 63 61 74 65  should be locate
65f0: 64 2e 20 20 42 79 20 64 65 66 61 75 6c 74 2c 20  d.  By default, 
6600: 74 68 69 73 20 6a 75 73 74 20 72 65 74 75 72 6e  this just return
6610: 73 20 74 68 65 20 45 61 67 6c 65 0d 0a 20 20 20  s the Eagle..   
6620: 20 20 20 23 20 20 20 20 20 20 20 62 69 6e 61 72     #       binar
6630: 79 20 64 69 72 65 63 74 6f 72 79 2e 0d 0a 20 20  y directory...  
6640: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20      #..      if 
6650: 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  {[info exists ::
6660: 63 6f 6d 6d 6f 6e 5f 64 69 72 65 63 74 6f 72 79  common_directory
6670: 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20  ] && \..        
6680: 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68    [string length
6690: 20 24 3a 3a 63 6f 6d 6d 6f 6e 5f 64 69 72 65 63   $::common_direc
66a0: 74 6f 72 79 5d 20 3e 20 30 7d 20 74 68 65 6e 20  tory] > 0} then 
66b0: 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
66c0: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68        # NOTE: Th
66d0: 65 20 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 74 68  e location of th
66e0: 65 20 63 6f 6d 6d 6f 6e 20 64 69 72 65 63 74 6f  e common directo
66f0: 72 79 20 68 61 73 20 62 65 65 6e 20 73 65 74 3b  ry has been set;
6700: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
6710: 20 20 74 68 65 72 65 66 6f 72 65 2c 20 75 73 65    therefore, use
6720: 20 69 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d   it...        #.
6730: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
6740: 24 3a 3a 63 6f 6d 6d 6f 6e 5f 64 69 72 65 63 74  $::common_direct
6750: 6f 72 79 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73  ory..      } els
6760: 65 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74  eif {[info exist
6770: 73 20 3a 3a 76 65 6e 64 6f 72 5f 64 69 72 65 63  s ::vendor_direc
6780: 74 6f 72 79 5d 20 26 26 20 5c 0d 0a 20 20 20 20  tory] && \..    
6790: 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65        [string le
67a0: 6e 67 74 68 20 24 3a 3a 76 65 6e 64 6f 72 5f 64  ngth $::vendor_d
67b0: 69 72 65 63 74 6f 72 79 5d 20 3e 20 30 7d 20 74  irectory] > 0} t
67c0: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  hen {..        #
67d0: 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
67e0: 3a 20 54 68 65 20 6c 6f 63 61 74 69 6f 6e 20 6f  : The location o
67f0: 66 20 74 68 65 20 76 65 6e 64 6f 72 20 64 69 72  f the vendor dir
6800: 65 63 74 6f 72 79 20 68 61 73 20 62 65 65 6e 20  ectory has been 
6810: 73 65 74 3b 0d 0a 20 20 20 20 20 20 20 20 23 20  set;..        # 
6820: 20 20 20 20 20 20 74 68 65 72 65 66 6f 72 65 2c        therefore,
6830: 20 75 73 65 20 69 74 2e 0d 0a 20 20 20 20 20 20   use it...      
6840: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74    #..        ret
6850: 75 72 6e 20 24 3a 3a 76 65 6e 64 6f 72 5f 64 69  urn $::vendor_di
6860: 72 65 63 74 6f 72 79 0d 0a 20 20 20 20 20 20 7d  rectory..      }
6870: 20 65 6c 73 65 69 66 20 7b 5b 69 6e 66 6f 20 65   elseif {[info e
6880: 78 69 73 74 73 20 3a 3a 74 63 6c 5f 6c 69 62 72  xists ::tcl_libr
6890: 61 72 79 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20  ary] && \..     
68a0: 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e       [string len
68b0: 67 74 68 20 24 3a 3a 74 63 6c 5f 6c 69 62 72 61  gth $::tcl_libra
68c0: 72 79 5d 20 3e 20 30 20 26 26 20 5c 0d 0a 20 20  ry] > 0 && \..  
68d0: 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20 69 73          [file is
68e0: 64 69 72 65 63 74 6f 72 79 20 24 3a 3a 74 63 6c  directory $::tcl
68f0: 5f 6c 69 62 72 61 72 79 5d 7d 20 74 68 65 6e 20  _library]} then 
6900: 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
6910: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68        # NOTE: Th
6920: 65 20 76 61 72 69 61 62 6c 65 20 77 69 74 68 20  e variable with 
6930: 74 68 65 20 6c 6f 63 61 74 69 6f 6e 20 6f 66 20  the location of 
6940: 74 68 65 20 73 63 72 69 70 74 20 6c 69 62 72 61  the script libra
6950: 72 79 20 69 73 0d 0a 20 20 20 20 20 20 20 20 23  ry is..        #
6960: 20 20 20 20 20 20 20 73 65 74 20 61 6e 64 20 61         set and a
6970: 70 70 65 61 72 73 20 74 6f 20 62 65 20 61 20 72  ppears to be a r
6980: 65 61 6c 20 64 69 72 65 63 74 6f 72 79 20 28 69  eal directory (i
6990: 2e 65 2e 20 6e 6f 74 20 65 6d 62 65 64 64 65 64  .e. not embedded
69a0: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
69b0: 20 20 77 69 74 68 69 6e 20 61 20 66 69 6c 65 29    within a file)
69c0: 3b 20 74 68 65 72 65 66 6f 72 65 2c 20 75 73 65  ; therefore, use
69d0: 20 69 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d   it...        #.
69e0: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
69f0: 24 3a 3a 74 63 6c 5f 6c 69 62 72 61 72 79 0d 0a  $::tcl_library..
6a00: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
6a10: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
6a20: 20 20 20 23 20 4e 4f 54 45 3a 20 46 61 6c 6c 62     # NOTE: Fallb
6a30: 61 63 6b 20 74 6f 20 74 68 65 20 64 69 72 65 63  ack to the direc
6a40: 74 6f 72 79 20 63 6f 6e 74 61 69 6e 69 6e 67 20  tory containing 
6a50: 74 68 65 20 65 78 65 63 75 74 61 62 6c 65 2e 0d  the executable..
6a60: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
6a70: 20 20 20 20 72 65 74 75 72 6e 20 5b 69 6e 66 6f      return [info
6a80: 20 62 69 6e 61 72 79 5d 0d 0a 20 20 20 20 20 20   binary]..      
6a90: 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  }..    }.....   
6aa0: 20 70 72 6f 63 20 67 65 74 44 61 74 61 62 61 73   proc getDatabas
6ab0: 65 44 69 72 65 63 74 6f 72 79 20 7b 7d 20 7b 0d  eDirectory {} {.
6ac0: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
6ad0: 23 20 4e 4f 54 45 3a 20 54 68 69 73 20 70 72 6f  # NOTE: This pro
6ae0: 63 65 64 75 72 65 20 72 65 74 75 72 6e 73 20 74  cedure returns t
6af0: 68 65 20 64 69 72 65 63 74 6f 72 79 20 77 68 65  he directory whe
6b00: 72 65 20 74 68 65 20 74 65 73 74 20 64 61 74 61  re the test data
6b10: 62 61 73 65 73 0d 0a 20 20 20 20 20 20 23 20 20  bases..      #  
6b20: 20 20 20 20 20 73 68 6f 75 6c 64 20 62 65 20 6c       should be l
6b30: 6f 63 61 74 65 64 2e 20 20 42 79 20 64 65 66 61  ocated.  By defa
6b40: 75 6c 74 2c 20 74 68 69 73 20 6a 75 73 74 20 75  ult, this just u
6b50: 73 65 73 20 74 68 65 20 74 65 6d 70 6f 72 61 72  ses the temporar
6b60: 79 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  y..      #      
6b70: 20 64 69 72 65 63 74 6f 72 79 20 63 6f 6e 66 69   directory confi
6b80: 67 75 72 65 64 20 66 6f 72 20 74 68 69 73 20 73  gured for this s
6b90: 79 73 74 65 6d 2e 0d 0a 20 20 20 20 20 20 23 0d  ystem...      #.
6ba0: 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f  .      if {[info
6bb0: 20 65 78 69 73 74 73 20 3a 3a 64 61 74 61 62 61   exists ::databa
6bc0: 73 65 5f 64 69 72 65 63 74 6f 72 79 5d 20 26 26  se_directory] &&
6bd0: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 73   \..          [s
6be0: 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a  tring length $::
6bf0: 64 61 74 61 62 61 73 65 5f 64 69 72 65 63 74 6f  database_directo
6c00: 72 79 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d  ry] > 0} then {.
6c10: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
6c20: 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 65 20      # NOTE: The 
6c30: 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  location of the 
6c40: 64 61 74 61 62 61 73 65 20 64 69 72 65 63 74 6f  database directo
6c50: 72 79 20 68 61 73 20 62 65 65 6e 20 6f 76 65 72  ry has been over
6c60: 72 69 64 64 65 6e 3b 0d 0a 20 20 20 20 20 20 20  ridden;..       
6c70: 20 23 20 20 20 20 20 20 20 74 68 65 72 65 66 6f   #       therefo
6c80: 72 65 2c 20 75 73 65 20 69 74 2e 0d 0a 20 20 20  re, use it...   
6c90: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
6ca0: 72 65 74 75 72 6e 20 24 3a 3a 64 61 74 61 62 61  return $::databa
6cb0: 73 65 5f 64 69 72 65 63 74 6f 72 79 0d 0a 20 20  se_directory..  
6cc0: 20 20 20 20 7d 20 65 6c 73 65 69 66 20 7b 5b 69      } elseif {[i
6cd0: 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 73 63 72  nfo exists ::scr
6ce0: 61 74 63 68 5f 64 69 72 65 63 74 6f 72 79 5d 20  atch_directory] 
6cf0: 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  && \..          
6d00: 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
6d10: 3a 3a 73 63 72 61 74 63 68 5f 64 69 72 65 63 74  ::scratch_direct
6d20: 6f 72 79 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b  ory] > 0} then {
6d30: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
6d40: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 65       # NOTE: The
6d50: 20 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 74 68 65   location of the
6d60: 20 73 63 72 61 74 63 68 20 64 69 72 65 63 74 6f   scratch directo
6d70: 72 79 20 68 61 73 20 62 65 65 6e 20 6f 76 65 72  ry has been over
6d80: 72 69 64 64 65 6e 3b 0d 0a 20 20 20 20 20 20 20  ridden;..       
6d90: 20 23 20 20 20 20 20 20 20 74 68 65 72 65 66 6f   #       therefo
6da0: 72 65 2c 20 75 73 65 20 69 74 2e 0d 0a 20 20 20  re, use it...   
6db0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
6dc0: 72 65 74 75 72 6e 20 24 3a 3a 73 63 72 61 74 63  return $::scratc
6dd0: 68 5f 64 69 72 65 63 74 6f 72 79 0d 0a 20 20 20  h_directory..   
6de0: 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
6df0: 20 20 20 20 20 72 65 74 75 72 6e 20 5b 67 65 74       return [get
6e00: 54 65 6d 70 6f 72 61 72 79 50 61 74 68 5d 0d 0a  TemporaryPath]..
6e10: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a        }..    }..
6e20: 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74 54  ...    proc getT
6e30: 65 6d 70 6f 72 61 72 79 44 69 72 65 63 74 6f 72  emporaryDirector
6e40: 79 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d  y {} {..      #.
6e50: 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54  .      # NOTE: T
6e60: 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 72 65  his procedure re
6e70: 74 75 72 6e 73 20 74 68 65 20 64 69 72 65 63 74  turns the direct
6e80: 6f 72 79 20 77 68 65 72 65 20 74 68 65 20 74 65  ory where the te
6e90: 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 0d 0a 20  mporary files.. 
6ea0: 20 20 20 20 20 23 20 20 20 20 20 20 20 73 68 6f       #       sho
6eb0: 75 6c 64 20 62 65 20 6c 6f 63 61 74 65 64 2e 20  uld be located. 
6ec0: 20 42 79 20 64 65 66 61 75 6c 74 2c 20 74 68 69   By default, thi
6ed0: 73 20 6a 75 73 74 20 75 73 65 73 20 74 68 65 20  s just uses the 
6ee0: 74 65 6d 70 6f 72 61 72 79 0d 0a 20 20 20 20 20  temporary..     
6ef0: 20 23 20 20 20 20 20 20 20 64 69 72 65 63 74 6f   #       directo
6f00: 72 79 20 63 6f 6e 66 69 67 75 72 65 64 20 66 6f  ry configured fo
6f10: 72 20 74 68 69 73 20 73 79 73 74 65 6d 2e 0d 0a  r this system...
6f20: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69        #..      i
6f30: 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20  f {[info exists 
6f40: 3a 3a 74 65 6d 70 6f 72 61 72 79 5f 64 69 72 65  ::temporary_dire
6f50: 63 74 6f 72 79 5d 20 26 26 20 5c 0d 0a 20 20 20  ctory] && \..   
6f60: 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c         [string l
6f70: 65 6e 67 74 68 20 24 3a 3a 74 65 6d 70 6f 72 61  ength $::tempora
6f80: 72 79 5f 64 69 72 65 63 74 6f 72 79 5d 20 3e 20  ry_directory] > 
6f90: 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
6fa0: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
6fb0: 4e 4f 54 45 3a 20 54 68 65 20 6c 6f 63 61 74 69  NOTE: The locati
6fc0: 6f 6e 20 6f 66 20 74 68 65 20 74 65 6d 70 6f 72  on of the tempor
6fd0: 61 72 79 20 64 69 72 65 63 74 6f 72 79 20 68 61  ary directory ha
6fe0: 73 20 62 65 65 6e 20 6f 76 65 72 72 69 64 64 65  s been overridde
6ff0: 6e 3b 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  n;..        #   
7000: 20 20 20 20 74 68 65 72 65 66 6f 72 65 2c 20 75      therefore, u
7010: 73 65 20 69 74 2e 0d 0a 20 20 20 20 20 20 20 20  se it...        
7020: 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  #..        retur
7030: 6e 20 24 3a 3a 74 65 6d 70 6f 72 61 72 79 5f 64  n $::temporary_d
7040: 69 72 65 63 74 6f 72 79 0d 0a 20 20 20 20 20 20  irectory..      
7050: 7d 20 65 6c 73 65 69 66 20 7b 5b 69 6e 66 6f 20  } elseif {[info 
7060: 65 78 69 73 74 73 20 3a 3a 73 63 72 61 74 63 68  exists ::scratch
7070: 5f 64 69 72 65 63 74 6f 72 79 5d 20 26 26 20 5c  _directory] && \
7080: 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 73 74 72  ..          [str
7090: 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a 73 63  ing length $::sc
70a0: 72 61 74 63 68 5f 64 69 72 65 63 74 6f 72 79 5d  ratch_directory]
70b0: 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20   > 0} then {..  
70c0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
70d0: 20 23 20 4e 4f 54 45 3a 20 54 68 65 20 6c 6f 63   # NOTE: The loc
70e0: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 63 72  ation of the scr
70f0: 61 74 63 68 20 64 69 72 65 63 74 6f 72 79 20 68  atch directory h
7100: 61 73 20 62 65 65 6e 20 6f 76 65 72 72 69 64 64  as been overridd
7110: 65 6e 3b 0d 0a 20 20 20 20 20 20 20 20 23 20 20  en;..        #  
7120: 20 20 20 20 20 74 68 65 72 65 66 6f 72 65 2c 20       therefore, 
7130: 75 73 65 20 69 74 2e 0d 0a 20 20 20 20 20 20 20  use it...       
7140: 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75   #..        retu
7150: 72 6e 20 24 3a 3a 73 63 72 61 74 63 68 5f 64 69  rn $::scratch_di
7160: 72 65 63 74 6f 72 79 0d 0a 20 20 20 20 20 20 7d  rectory..      }
7170: 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
7180: 20 72 65 74 75 72 6e 20 5b 67 65 74 54 65 6d 70   return [getTemp
7190: 6f 72 61 72 79 50 61 74 68 5d 0d 0a 20 20 20 20  oraryPath]..    
71a0: 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20    }..    }..... 
71b0: 20 20 20 70 72 6f 63 20 67 65 74 54 65 73 74 4f     proc getTestO
71c0: 76 65 72 72 69 64 65 73 50 72 65 61 6d 62 6c 65  verridesPreamble
71d0: 20 7b 20 7b 65 78 74 72 61 56 61 72 4e 61 6d 65   { {extraVarName
71e0: 73 20 22 22 7d 20 7d 20 7b 0d 0a 20 20 20 20 20  s ""} } {..     
71f0: 20 73 65 74 20 76 61 72 4e 61 6d 65 73 20 5b 6c   set varNames [l
7200: 69 73 74 5d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d  ist]....      #.
7210: 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49  .      # NOTE: I
7220: 66 20 61 76 61 69 6c 61 62 6c 65 2c 20 73 74 61  f available, sta
7230: 72 74 20 77 69 74 68 20 74 68 65 20 6d 61 73 74  rt with the mast
7240: 65 72 20 6c 69 73 74 20 6f 66 20 74 65 73 74 20  er list of test 
7250: 6f 76 65 72 72 69 64 65 0d 0a 20 20 20 20 20 20  override..      
7260: 23 20 20 20 20 20 20 20 76 61 72 69 61 62 6c 65  #       variable
7270: 73 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  s...      #..   
7280: 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69     if {[info exi
7290: 73 74 73 20 3a 3a 74 65 73 74 5f 6f 76 65 72 72  sts ::test_overr
72a0: 69 64 65 73 5d 20 26 26 20 5c 0d 0a 20 20 20 20  ides] && \..    
72b0: 20 20 20 20 20 20 5b 6c 6c 65 6e 67 74 68 20 24        [llength $
72c0: 3a 3a 74 65 73 74 5f 6f 76 65 72 72 69 64 65 73  ::test_overrides
72d0: 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20  ] > 0} then {.. 
72e0: 20 20 20 20 20 20 20 65 76 61 6c 20 6c 61 70 70         eval lapp
72f0: 65 6e 64 20 76 61 72 4e 61 6d 65 73 20 24 3a 3a  end varNames $::
7300: 74 65 73 74 5f 6f 76 65 72 72 69 64 65 73 0d 0a  test_overrides..
7310: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
7320: 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
7330: 3a 20 49 66 20 72 65 71 75 65 73 74 65 64 20 62  : If requested b
7340: 79 20 6f 75 72 20 63 61 6c 6c 65 72 2c 20 61 64  y our caller, ad
7350: 64 20 61 6e 79 20 61 64 64 69 74 69 6f 6e 61 6c  d any additional
7360: 20 76 61 72 69 61 62 6c 65 0d 0a 20 20 20 20 20   variable..     
7370: 20 23 20 20 20 20 20 20 20 6e 61 6d 65 73 20 74   #       names t
7380: 6f 20 63 6f 70 79 20 6e 6f 77 2e 0d 0a 20 20 20  o copy now...   
7390: 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
73a0: 5b 6c 6c 65 6e 67 74 68 20 24 65 78 74 72 61 56  [llength $extraV
73b0: 61 72 4e 61 6d 65 73 5d 20 3e 20 30 7d 20 74 68  arNames] > 0} th
73c0: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 65 76  en {..        ev
73d0: 61 6c 20 6c 61 70 70 65 6e 64 20 76 61 72 4e 61  al lappend varNa
73e0: 6d 65 73 20 24 65 78 74 72 61 56 61 72 4e 61 6d  mes $extraVarNam
73f0: 65 73 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  es..      }.... 
7400: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
7410: 4e 4f 54 45 3a 20 42 75 69 6c 64 20 74 68 65 20  NOTE: Build the 
7420: 73 63 72 69 70 74 20 66 72 61 67 6d 65 6e 74 20  script fragment 
7430: 74 6f 20 62 65 20 72 65 74 75 72 6e 65 64 20 62  to be returned b
7440: 79 20 70 72 6f 63 65 73 73 69 6e 67 20 65 61 63  y processing eac
7450: 68 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  h..      #      
7460: 20 76 61 72 69 61 62 6c 65 20 6e 61 6d 65 20 61   variable name a
7470: 6e 64 20 61 64 64 69 6e 67 20 74 68 65 20 6e 65  nd adding the ne
7480: 63 65 63 65 73 73 61 72 79 20 73 63 72 69 70 74  cecessary script
7490: 20 66 72 61 67 6d 65 6e 74 73 20 66 6f 72 0d 0a   fragments for..
74a0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 65 61        #       ea
74b0: 63 68 20 6f 6e 65 2e 0d 0a 20 20 20 20 20 20 23  ch one...      #
74c0: 0d 0a 20 20 20 20 20 20 73 65 74 20 72 65 73 75  ..      set resu
74d0: 6c 74 20 22 22 0d 0a 0d 0a 20 20 20 20 20 20 66  lt ""....      f
74e0: 6f 72 65 61 63 68 20 76 61 72 4e 61 6d 65 20 24  oreach varName $
74f0: 76 61 72 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20  varNames {..    
7500: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
7510: 20 4e 4f 54 45 3a 20 42 75 69 6c 64 20 74 68 65   NOTE: Build the
7520: 20 71 75 61 6c 69 66 69 65 64 20 67 6c 6f 62 61   qualified globa
7530: 6c 20 76 61 72 69 61 62 6c 65 20 6e 61 6d 65 2e  l variable name.
7540: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
7550: 20 20 20 20 20 73 65 74 20 66 75 6c 6c 56 61 72       set fullVar
7560: 4e 61 6d 65 20 5b 61 70 70 65 6e 64 41 72 67 73  Name [appendArgs
7570: 20 3a 3a 20 24 76 61 72 4e 61 6d 65 5d 0d 0a 0d   :: $varName]...
7580: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
7590: 20 20 20 20 23 20 4e 4f 54 45 3a 20 44 6f 65 73      # NOTE: Does
75a0: 20 74 68 65 20 76 61 72 69 61 62 6c 65 20 65 78   the variable ex
75b0: 69 73 74 20 69 6e 20 74 68 69 73 20 69 6e 74 65  ist in this inte
75c0: 72 70 72 65 74 65 72 20 63 6f 6e 74 65 78 74 3f  rpreter context?
75d0: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
75e0: 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65       if {[info e
75f0: 78 69 73 74 73 20 24 66 75 6c 6c 56 61 72 4e 61  xists $fullVarNa
7600: 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  me]} then {..   
7610: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
7620: 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 70 70 65      # NOTE: Appe
7630: 6e 64 20 61 20 73 63 72 69 70 74 20 66 72 61 67  nd a script frag
7640: 6d 65 6e 74 20 74 6f 20 74 68 65 20 72 65 73 75  ment to the resu
7650: 6c 74 20 74 68 61 74 20 77 69 6c 6c 20 63 6f 72  lt that will cor
7660: 72 65 63 74 6c 79 0d 0a 20 20 20 20 20 20 20 20  rectly..        
7670: 20 20 23 20 20 20 20 20 20 20 63 6f 70 79 20 61    #       copy a
7680: 6e 79 20 63 6f 6e 74 61 69 6e 65 64 20 76 61 6c  ny contained val
7690: 75 65 20 74 6f 20 61 6e 6f 74 68 65 72 20 69 6e  ue to another in
76a0: 74 65 72 70 72 65 74 65 72 20 63 6f 6e 74 65 78  terpreter contex
76b0: 74 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d  t...          #.
76c0: 0a 20 20 20 20 20 20 20 20 20 20 61 70 70 65 6e  .          appen
76d0: 64 20 72 65 73 75 6c 74 20 5c 6e 20 22 73 65 74  d result \n "set
76e0: 20 22 20 24 66 75 6c 6c 56 61 72 4e 61 6d 65 20   " $fullVarName 
76f0: 22 20 5c 7b 22 20 5b 73 65 74 20 24 66 75 6c 6c  " \{" [set $full
7700: 56 61 72 4e 61 6d 65 5d 20 5c 7d 0d 0a 20 20 20  VarName] \}..   
7710: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d       }..      }.
7720: 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
7730: 20 20 23 20 4e 4f 54 45 3a 20 49 66 20 74 68 65    # NOTE: If the
7740: 20 72 65 73 75 6c 74 20 63 6f 6e 74 61 69 6e 73   result contains
7750: 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 73 63 72   one or more scr
7760: 69 70 74 20 66 72 61 67 6d 65 6e 74 73 2c 20 61  ipt fragments, a
7770: 70 70 65 6e 64 20 61 0d 0a 20 20 20 20 20 20 23  ppend a..      #
7780: 20 20 20 20 20 20 20 6e 65 77 6c 69 6e 65 2e 0d         newline..
7790: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
77a0: 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67  if {[string leng
77b0: 74 68 20 24 72 65 73 75 6c 74 5d 20 3e 20 30 7d  th $result] > 0}
77c0: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
77d0: 20 61 70 70 65 6e 64 20 72 65 73 75 6c 74 20 5c   append result \
77e0: 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  n..      }....  
77f0: 20 20 20 20 72 65 74 75 72 6e 20 24 72 65 73 75      return $resu
7800: 6c 74 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20  lt..    }.....  
7810: 20 20 70 72 6f 63 20 67 65 74 41 70 70 44 6f 6d    proc getAppDom
7820: 61 69 6e 50 72 65 61 6d 62 6c 65 20 7b 20 7b 70  ainPreamble { {p
7830: 72 65 66 69 78 20 22 22 7d 20 7b 73 75 66 66 69  refix ""} {suffi
7840: 78 20 22 22 7d 20 7d 20 7b 0d 0a 20 20 20 20 20  x ""} } {..     
7850: 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
7860: 3a 20 54 68 69 73 20 70 72 6f 63 65 64 75 72 65  : This procedure
7870: 20 72 65 74 75 72 6e 73 20 61 20 74 65 73 74 20   returns a test 
7880: 73 65 74 75 70 20 73 63 72 69 70 74 20 66 72 61  setup script fra
7890: 67 6d 65 6e 74 20 73 75 69 74 61 62 6c 65 20 66  gment suitable f
78a0: 6f 72 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  or..      #     
78b0: 20 20 65 76 61 6c 75 61 74 69 6f 6e 20 62 79 20    evaluation by 
78c0: 61 6e 20 69 6e 74 65 72 70 72 65 74 65 72 20 63  an interpreter c
78d0: 72 65 61 74 65 64 20 69 6e 20 61 6e 20 69 73 6f  reated in an iso
78e0: 6c 61 74 65 64 20 61 70 70 6c 69 63 61 74 69 6f  lated applicatio
78f0: 6e 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  n..      #      
7900: 20 64 6f 6d 61 69 6e 2e 20 20 54 68 65 20 73 63   domain.  The sc
7910: 72 69 70 74 20 66 72 61 67 6d 65 6e 74 20 62 65  ript fragment be
7920: 69 6e 67 20 72 65 74 75 72 6e 65 64 20 77 69 6c  ing returned wil
7930: 6c 20 62 65 20 73 75 72 72 6f 75 6e 64 65 64 20  l be surrounded 
7940: 62 79 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  by..      #     
7950: 20 20 74 68 65 20 70 72 65 66 69 78 20 61 6e 64    the prefix and
7960: 20 73 75 66 66 69 78 20 22 73 63 72 69 70 74 20   suffix "script 
7970: 66 72 61 67 6d 65 6e 74 73 22 20 73 70 65 63 69  fragments" speci
7980: 66 69 65 64 20 62 79 20 6f 75 72 20 63 61 6c 6c  fied by our call
7990: 65 72 2c 0d 0a 20 20 20 20 20 20 23 20 20 20 20  er,..      #    
79a0: 20 20 20 69 66 20 61 6e 79 2e 20 20 54 68 65 20     if any.  The 
79b0: 65 6e 74 69 72 65 20 73 63 72 69 70 74 20 62 65  entire script be
79c0: 69 6e 67 20 72 65 74 75 72 6e 65 64 20 77 69 6c  ing returned wil
79d0: 6c 20 62 65 20 73 75 62 73 74 69 74 75 74 65 64  l be substituted
79e0: 20 76 69 61 0d 0a 20 20 20 20 20 20 23 20 20 20   via..      #   
79f0: 20 20 20 20 5b 73 75 62 73 74 5d 2c 20 69 6e 20      [subst], in 
7a00: 74 68 65 20 63 6f 6e 74 65 78 74 20 6f 66 20 6f  the context of o
7a10: 75 72 20 63 61 6c 6c 65 72 2c 20 62 65 66 6f 72  ur caller, befor
7a20: 65 20 62 65 69 6e 67 20 72 65 74 75 72 6e 65 64  e being returned
7a30: 2e 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  ...      #      
7a40: 20 54 68 69 73 20 73 74 65 70 20 69 73 20 6e 65   This step is ne
7a50: 63 65 73 73 61 72 79 20 73 6f 20 74 68 61 74 20  cessary so that 
7a60: 73 6f 6d 65 20 6c 69 6d 69 74 65 64 20 63 6f 6e  some limited con
7a70: 74 65 78 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  text information
7a80: 2c 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  ,..      #      
7a90: 20 70 72 69 6d 61 72 69 6c 79 20 72 65 6c 61 74   primarily relat
7aa0: 65 64 20 74 6f 20 74 68 65 20 74 65 73 74 69 6e  ed to the testin
7ab0: 67 20 64 69 72 65 63 74 6f 72 69 65 73 2c 20 63  g directories, c
7ac0: 61 6e 20 62 65 20 74 72 61 6e 73 66 65 72 72 65  an be transferre
7ad0: 64 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  d..      #      
7ae0: 20 74 6f 20 74 68 65 20 69 6e 74 65 72 70 72 65   to the interpre
7af0: 74 65 72 20 69 6e 20 74 68 65 20 69 73 6f 6c 61  ter in the isola
7b00: 74 65 64 20 61 70 70 6c 69 63 61 74 69 6f 6e 20  ted application 
7b10: 64 6f 6d 61 69 6e 2c 20 6d 61 6b 69 6e 67 20 69  domain, making i
7b20: 74 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  t..      #      
7b30: 20 61 62 6c 65 20 74 6f 20 73 75 63 63 65 73 73   able to success
7b40: 66 75 6c 6c 79 20 72 75 6e 20 74 65 73 74 73 20  fully run tests 
7b50: 74 68 61 74 20 72 65 71 75 69 72 65 20 6f 6e 65  that require one
7b60: 20 6f 72 20 6d 6f 72 65 20 6f 66 20 74 68 65 0d   or more of the.
7b70: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 66  .      #       f
7b80: 69 6c 65 73 20 69 6e 20 6f 6e 65 20 6f 66 20 74  iles in one of t
7b90: 68 65 20 74 65 73 74 69 6e 67 20 64 69 72 65 63  he testing direc
7ba0: 74 6f 72 69 65 73 2e 20 20 43 61 6c 6c 65 72 73  tories.  Callers
7bb0: 20 73 68 6f 75 6c 64 20 6b 65 65 70 20 69 6e 0d   should keep in.
7bc0: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 6d  .      #       m
7bd0: 69 6e 64 20 74 68 61 74 20 74 68 65 20 74 65 73  ind that the tes
7be0: 74 20 73 63 72 69 70 74 20 66 72 61 67 6d 65 6e  t script fragmen
7bf0: 74 20 62 65 69 6e 67 20 72 65 74 75 72 6e 65 64  t being returned
7c00: 20 63 61 6e 6e 6f 74 20 72 65 6c 79 20 6f 6e 0d   cannot rely on.
7c10: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 61  .      #       a
7c20: 6e 79 20 73 63 72 69 70 74 20 6c 69 62 72 61 72  ny script librar
7c30: 79 20 70 72 6f 63 65 64 75 72 65 73 20 74 68 61  y procedures tha
7c40: 74 20 61 72 65 20 6e 6f 74 20 70 72 6f 76 69 64  t are not provid
7c50: 65 64 20 62 79 20 74 68 65 20 45 61 67 6c 65 0d  ed by the Eagle.
7c60: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 6c  .      #       l
7c70: 69 62 72 61 72 79 20 70 61 63 6b 61 67 65 20 28  ibrary package (
7c80: 69 2e 65 2e 20 22 69 6e 69 74 2e 65 61 67 6c 65  i.e. "init.eagle
7c90: 22 29 2c 20 69 6e 63 6c 75 64 69 6e 67 20 74 68  "), including th
7ca0: 6f 73 65 20 70 72 6f 76 69 64 65 64 20 62 79 0d  ose provided by.
7cb0: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74  .      #       t
7cc0: 68 65 20 45 61 67 6c 65 20 74 65 73 74 20 70 61  he Eagle test pa
7cd0: 63 6b 61 67 65 2c 20 75 6e 6c 65 73 73 20 74 68  ckage, unless th
7ce0: 65 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 69 6e  e file containin
7cf0: 67 20 74 68 65 6d 20 69 73 20 6c 6f 61 64 65 64  g them is loaded
7d00: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
7d10: 6d 61 6e 75 61 6c 6c 79 20 76 69 61 20 73 6f 6d  manually via som
7d20: 65 20 6f 74 68 65 72 20 6d 65 63 68 61 6e 69 73  e other mechanis
7d30: 6d 20 28 65 2e 67 2e 20 62 79 20 69 6e 63 6c 75  m (e.g. by inclu
7d40: 64 69 6e 67 20 61 70 70 72 6f 70 72 69 61 74 65  ding appropriate
7d50: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
7d60: 5b 70 61 63 6b 61 67 65 20 72 65 71 75 69 72 65  [package require
7d70: 5d 20 6f 72 20 5b 73 6f 75 72 63 65 5d 20 63 6f  ] or [source] co
7d80: 6d 6d 61 6e 64 73 20 69 6e 20 74 68 65 20 70 72  mmands in the pr
7d90: 65 66 69 78 20 6f 72 20 73 75 66 66 69 78 0d 0a  efix or suffix..
7da0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 73 63        #       sc
7db0: 72 69 70 74 20 66 72 61 67 6d 65 6e 74 73 29 2e  ript fragments).
7dc0: 20 20 41 6c 73 6f 2c 20 61 6c 6c 20 76 61 72 69    Also, all vari
7dd0: 61 62 6c 65 20 72 65 66 65 72 65 6e 63 65 73 20  able references 
7de0: 61 6e 64 20 61 6c 6c 20 6e 65 73 74 65 64 0d 0a  and all nested..
7df0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63 6f        #       co
7e00: 6d 6d 61 6e 64 73 20 28 69 2e 65 2e 20 74 68 6f  mmands (i.e. tho
7e10: 73 65 20 69 6e 20 73 71 75 61 72 65 20 62 72 61  se in square bra
7e20: 63 6b 65 74 73 29 20 63 6f 6e 74 61 69 6e 65 64  ckets) contained
7e30: 20 69 6e 20 74 68 65 20 66 69 6e 61 6c 0d 0a 20   in the final.. 
7e40: 20 20 20 20 20 23 20 20 20 20 20 20 20 73 63 72       #       scr
7e50: 69 70 74 20 66 72 61 67 6d 65 6e 74 20 77 69 6c  ipt fragment wil
7e60: 6c 20 65 6e 64 20 75 70 20 62 65 69 6e 67 20 65  l end up being e
7e70: 76 61 6c 75 61 74 65 64 20 69 6e 20 74 68 65 20  valuated in the 
7e80: 63 6f 6e 74 65 78 74 20 6f 66 20 74 68 65 0d 0a  context of the..
7e90: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63 61        #       ca
7ea0: 6c 6c 69 6e 67 20 69 6e 74 65 72 70 72 65 74 65  lling interprete
7eb0: 72 20 61 6e 64 20 6e 6f 74 20 74 68 65 20 74 61  r and not the ta
7ec0: 72 67 65 74 20 69 6e 74 65 72 70 72 65 74 65 72  rget interpreter
7ed0: 20 63 72 65 61 74 65 64 20 69 6e 20 74 68 65 0d   created in the.
7ee0: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 69  .      #       i
7ef0: 73 6f 6c 61 74 65 64 20 61 70 70 6c 69 63 61 74  solated applicat
7f00: 69 6f 6e 20 64 6f 6d 61 69 6e 20 75 6e 6c 65 73  ion domain unles
7f10: 73 20 74 68 65 20 64 6f 6c 6c 61 72 20 73 69 67  s the dollar sig
7f20: 6e 73 20 61 6e 64 2f 6f 72 20 73 71 75 61 72 65  ns and/or square
7f30: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
7f40: 62 72 61 63 6b 65 74 73 20 61 72 65 20 73 70 65  brackets are spe
7f50: 63 69 61 6c 6c 79 20 71 75 6f 74 65 64 20 77 69  cially quoted wi
7f60: 74 68 20 62 61 63 6b 73 6c 61 73 68 65 73 2e 0d  th backslashes..
7f70: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
7f80: 72 65 74 75 72 6e 20 5b 75 70 6c 65 76 65 6c 20  return [uplevel 
7f90: 31 20 5b 6c 69 73 74 20 73 75 62 73 74 20 5b 61  1 [list subst [a
7fa0: 70 70 65 6e 64 41 72 67 73 20 24 70 72 65 66 69  ppendArgs $prefi
7fb0: 78 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20  x {..        if 
7fc0: 7b 5b 68 61 73 52 75 6e 74 69 6d 65 4f 70 74 69  {[hasRuntimeOpti
7fd0: 6f 6e 20 6e 61 74 69 76 65 5d 7d 20 74 68 65 6e  on native]} then
7fe0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 6f 62   {..          ob
7ff0: 6a 65 63 74 20 69 6e 76 6f 6b 65 20 49 6e 74 65  ject invoke Inte
8000: 72 70 72 65 74 65 72 2e 47 65 74 41 63 74 69 76  rpreter.GetActiv
8010: 65 20 41 64 64 52 75 6e 74 69 6d 65 4f 70 74 69  e AddRuntimeOpti
8020: 6f 6e 20 6e 61 74 69 76 65 0d 0a 20 20 20 20 20  on native..     
8030: 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 20 5b 67     }..      } [g
8040: 65 74 54 65 73 74 4f 76 65 72 72 69 64 65 73 50  etTestOverridesP
8050: 72 65 61 6d 62 6c 65 20 5b 6c 69 73 74 20 70 61  reamble [list pa
8060: 74 68 20 74 65 73 74 5f 63 68 61 6e 6e 65 6c 5d  th test_channel]
8070: 5d 20 24 73 75 66 66 69 78 5d 5d 5d 0d 0a 20 20  ] $suffix]]]..  
8080: 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
8090: 20 74 72 79 43 6f 70 79 45 78 74 65 72 6e 61 6c   tryCopyExternal
80a0: 46 69 6c 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  File {..        
80b0: 20 20 20 20 66 69 6c 65 4e 61 6d 65 20 7b 70 6c      fileName {pl
80c0: 61 74 66 6f 72 6d 20 22 22 7d 20 7b 6e 65 77 46  atform ""} {newF
80d0: 69 6c 65 4e 61 6d 65 20 22 22 7d 20 7b 76 65 72  ileName ""} {ver
80e0: 62 6f 73 65 20 66 61 6c 73 65 7d 20 7d 20 7b 0d  bose false} } {.
80f0: 0a 20 20 20 20 20 20 73 65 74 20 73 6f 75 72 63  .      set sourc
8100: 65 46 69 6c 65 4e 61 6d 65 20 5b 67 65 74 45 78  eFileName [getEx
8110: 74 65 72 6e 61 6c 46 69 6c 65 4e 61 6d 65 20 24  ternalFileName $
8120: 66 69 6c 65 4e 61 6d 65 5d 0d 0a 0d 0a 20 20 20  fileName]....   
8130: 20 20 20 69 66 20 7b 21 5b 66 69 6c 65 20 65 78     if {![file ex
8140: 69 73 74 73 20 24 73 6f 75 72 63 65 46 69 6c 65  ists $sourceFile
8150: 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  Name]} then {.. 
8160: 20 20 20 20 20 20 20 69 66 20 7b 24 76 65 72 62         if {$verb
8170: 6f 73 65 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  ose} then {..   
8180: 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
8190: 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70  test_channel [ap
81a0: 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
81b0: 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
81c0: 73 6b 69 70 70 65 64 20 63 6f 70 79 69 6e 67 20  skipped copying 
81d0: 65 78 74 65 72 6e 61 6c 20 66 69 6c 65 20 5c 22  external file \"
81e0: 22 20 24 73 6f 75 72 63 65 46 69 6c 65 4e 61 6d  " $sourceFileNam
81f0: 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e \..           
8200: 20 20 20 22 5c 22 2c 20 69 74 20 64 6f 65 73 20     "\", it does 
8210: 6e 6f 74 20 65 78 69 73 74 5c 6e 22 5d 0d 0a 20  not exist\n"].. 
8220: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
8230: 20 20 72 65 74 75 72 6e 0d 0a 20 20 20 20 20 20    return..      
8240: 7d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b  }....      if {[
8250: 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 6e  string length $n
8260: 65 77 46 69 6c 65 4e 61 6d 65 5d 20 3e 20 30 7d  ewFileName] > 0}
8270: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
8280: 20 73 65 74 20 74 61 72 67 65 74 46 69 6c 65 4e   set targetFileN
8290: 61 6d 65 20 5b 67 65 74 42 69 6e 61 72 79 46 69  ame [getBinaryFi
82a0: 6c 65 4e 61 6d 65 20 24 6e 65 77 46 69 6c 65 4e  leName $newFileN
82b0: 61 6d 65 20 24 70 6c 61 74 66 6f 72 6d 5d 0d 0a  ame $platform]..
82c0: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
82d0: 20 20 20 20 20 20 20 20 73 65 74 20 74 61 72 67          set targ
82e0: 65 74 46 69 6c 65 4e 61 6d 65 20 5b 67 65 74 42  etFileName [getB
82f0: 69 6e 61 72 79 46 69 6c 65 4e 61 6d 65 20 24 66  inaryFileName $f
8300: 69 6c 65 4e 61 6d 65 20 24 70 6c 61 74 66 6f 72  ileName $platfor
8310: 6d 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  m]..      }.... 
8320: 20 20 20 20 20 73 65 74 20 74 61 72 67 65 74 44       set targetD
8330: 69 72 65 63 74 6f 72 79 20 5b 66 69 6c 65 20 64  irectory [file d
8340: 69 72 6e 61 6d 65 20 24 74 61 72 67 65 74 46 69  irname $targetFi
8350: 6c 65 4e 61 6d 65 5d 0d 0a 0d 0a 20 20 20 20 20  leName]....     
8360: 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20   if {[catch {.. 
8370: 20 20 20 20 20 20 20 69 66 20 7b 21 5b 66 69 6c         if {![fil
8380: 65 20 65 78 69 73 74 73 20 24 74 61 72 67 65 74  e exists $target
8390: 44 69 72 65 63 74 6f 72 79 5d 7d 20 74 68 65 6e  Directory]} then
83a0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 66 69   {..          fi
83b0: 6c 65 20 6d 6b 64 69 72 20 24 74 61 72 67 65 74  le mkdir $target
83c0: 44 69 72 65 63 74 6f 72 79 0d 0a 20 20 20 20 20  Directory..     
83d0: 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 66 69     }..        fi
83e0: 6c 65 20 63 6f 70 79 20 2d 66 6f 72 63 65 20 24  le copy -force $
83f0: 73 6f 75 72 63 65 46 69 6c 65 4e 61 6d 65 20 24  sourceFileName $
8400: 74 61 72 67 65 74 46 69 6c 65 4e 61 6d 65 0d 0a  targetFileName..
8410: 20 20 20 20 20 20 7d 5d 20 3d 3d 20 30 7d 20 74        }] == 0} t
8420: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 74  hen {..        t
8430: 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
8440: 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
8450: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
8460: 22 2d 2d 2d 2d 20 63 6f 70 69 65 64 20 65 78 74  "---- copied ext
8470: 65 72 6e 61 6c 20 66 69 6c 65 20 66 72 6f 6d 20  ernal file from 
8480: 5c 22 22 20 24 73 6f 75 72 63 65 46 69 6c 65 4e  \"" $sourceFileN
8490: 61 6d 65 20 22 5c 22 20 74 6f 20 5c 22 22 20 5c  ame "\" to \"" \
84a0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 24 74  ..            $t
84b0: 61 72 67 65 74 46 69 6c 65 4e 61 6d 65 20 5c 22  argetFileName \"
84c0: 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73  \n]..      } els
84d0: 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75  e {..        tpu
84e0: 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
84f0: 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
8500: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 2d  ..            "-
8510: 2d 2d 2d 20 66 61 69 6c 65 64 20 74 6f 20 63 6f  --- failed to co
8520: 70 79 20 65 78 74 65 72 6e 61 6c 20 66 69 6c 65  py external file
8530: 20 66 72 6f 6d 20 5c 22 22 20 24 73 6f 75 72 63   from \"" $sourc
8540: 65 46 69 6c 65 4e 61 6d 65 20 5c 0d 0a 20 20 20  eFileName \..   
8550: 20 20 20 20 20 20 20 20 20 22 5c 22 20 74 6f 20           "\" to 
8560: 5c 22 22 20 24 74 61 72 67 65 74 46 69 6c 65 4e  \"" $targetFileN
8570: 61 6d 65 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20  ame \"\n]..     
8580: 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20   }..    }.....  
8590: 20 20 70 72 6f 63 20 74 72 79 43 6f 70 79 42 69    proc tryCopyBi
85a0: 6e 61 72 79 46 69 6c 65 20 7b 0d 0a 20 20 20 20  naryFile {..    
85b0: 20 20 20 20 20 20 20 20 66 69 6c 65 4e 61 6d 65          fileName
85c0: 20 7b 70 6c 61 74 66 6f 72 6d 20 22 22 7d 20 7b   {platform ""} {
85d0: 6e 65 77 46 69 6c 65 4e 61 6d 65 20 22 22 7d 20  newFileName ""} 
85e0: 7b 76 65 72 62 6f 73 65 20 66 61 6c 73 65 7d 20  {verbose false} 
85f0: 7d 20 7b 0d 0a 20 20 20 20 20 20 73 65 74 20 73  } {..      set s
8600: 6f 75 72 63 65 46 69 6c 65 4e 61 6d 65 20 5b 67  ourceFileName [g
8610: 65 74 42 69 6e 61 72 79 46 69 6c 65 4e 61 6d 65  etBinaryFileName
8620: 20 24 66 69 6c 65 4e 61 6d 65 20 24 70 6c 61 74   $fileName $plat
8630: 66 6f 72 6d 5d 0d 0a 0d 0a 20 20 20 20 20 20 69  form]....      i
8640: 66 20 7b 21 5b 66 69 6c 65 20 65 78 69 73 74 73  f {![file exists
8650: 20 24 73 6f 75 72 63 65 46 69 6c 65 4e 61 6d 65   $sourceFileName
8660: 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
8670: 20 20 20 69 66 20 7b 24 76 65 72 62 6f 73 65 7d     if {$verbose}
8680: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
8690: 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
86a0: 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  _channel [append
86b0: 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
86c0: 20 20 20 20 20 20 22 2d 2d 2d 2d 20 73 6b 69 70        "---- skip
86d0: 70 65 64 20 63 6f 70 79 69 6e 67 20 62 69 6e 61  ped copying bina
86e0: 72 79 20 66 69 6c 65 20 5c 22 22 20 24 73 6f 75  ry file \"" $sou
86f0: 72 63 65 46 69 6c 65 4e 61 6d 65 20 5c 0d 0a 20  rceFileName \.. 
8700: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 5c 22               "\"
8710: 2c 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 65 78  , it does not ex
8720: 69 73 74 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20  ist\n"]..       
8730: 20 7d 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75   }..        retu
8740: 72 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  rn..      }.... 
8750: 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67       if {[string
8760: 20 6c 65 6e 67 74 68 20 24 6e 65 77 46 69 6c 65   length $newFile
8770: 4e 61 6d 65 5d 20 3e 20 30 7d 20 74 68 65 6e 20  Name] > 0} then 
8780: 7b 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 74  {..        set t
8790: 61 72 67 65 74 46 69 6c 65 4e 61 6d 65 20 5b 67  argetFileName [g
87a0: 65 74 42 75 69 6c 64 46 69 6c 65 4e 61 6d 65 20  etBuildFileName 
87b0: 24 6e 65 77 46 69 6c 65 4e 61 6d 65 20 24 70 6c  $newFileName $pl
87c0: 61 74 66 6f 72 6d 5d 0d 0a 20 20 20 20 20 20 7d  atform]..      }
87d0: 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
87e0: 20 73 65 74 20 74 61 72 67 65 74 46 69 6c 65 4e   set targetFileN
87f0: 61 6d 65 20 5b 67 65 74 42 75 69 6c 64 46 69 6c  ame [getBuildFil
8800: 65 4e 61 6d 65 20 24 66 69 6c 65 4e 61 6d 65 20  eName $fileName 
8810: 24 70 6c 61 74 66 6f 72 6d 5d 0d 0a 20 20 20 20  $platform]..    
8820: 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 73 65 74    }....      set
8830: 20 74 61 72 67 65 74 44 69 72 65 63 74 6f 72 79   targetDirectory
8840: 20 5b 66 69 6c 65 20 64 69 72 6e 61 6d 65 20 24   [file dirname $
8850: 74 61 72 67 65 74 46 69 6c 65 4e 61 6d 65 5d 0d  targetFileName].
8860: 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 63 61  ...      if {[ca
8870: 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 69  tch {..        i
8880: 66 20 7b 21 5b 66 69 6c 65 20 65 78 69 73 74 73  f {![file exists
8890: 20 24 74 61 72 67 65 74 44 69 72 65 63 74 6f 72   $targetDirector
88a0: 79 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  y]} then {..    
88b0: 20 20 20 20 20 20 66 69 6c 65 20 6d 6b 64 69 72        file mkdir
88c0: 20 24 74 61 72 67 65 74 44 69 72 65 63 74 6f 72   $targetDirector
88d0: 79 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  y..        }..  
88e0: 20 20 20 20 20 20 66 69 6c 65 20 63 6f 70 79 20        file copy 
88f0: 2d 66 6f 72 63 65 20 24 73 6f 75 72 63 65 46 69  -force $sourceFi
8900: 6c 65 4e 61 6d 65 20 24 74 61 72 67 65 74 46 69  leName $targetFi
8910: 6c 65 4e 61 6d 65 0d 0a 20 20 20 20 20 20 7d 5d  leName..      }]
8920: 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20   == 0} then {.. 
8930: 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
8940: 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70  test_channel [ap
8950: 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
8960: 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 6f          "---- co
8970: 70 69 65 64 20 62 69 6e 61 72 79 20 66 69 6c 65  pied binary file
8980: 20 66 72 6f 6d 20 5c 22 22 20 24 73 6f 75 72 63   from \"" $sourc
8990: 65 46 69 6c 65 4e 61 6d 65 20 22 5c 22 20 74 6f  eFileName "\" to
89a0: 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20 20 20   \"" \..        
89b0: 20 20 20 20 24 74 61 72 67 65 74 46 69 6c 65 4e      $targetFileN
89c0: 61 6d 65 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20  ame \"\n]..     
89d0: 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
89e0: 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
89f0: 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  _channel [append
8a00: 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
8a10: 20 20 20 20 22 2d 2d 2d 2d 20 66 61 69 6c 65 64      "---- failed
8a20: 20 74 6f 20 63 6f 70 79 20 62 69 6e 61 72 79 20   to copy binary 
8a30: 66 69 6c 65 20 66 72 6f 6d 20 5c 22 22 20 24 73  file from \"" $s
8a40: 6f 75 72 63 65 46 69 6c 65 4e 61 6d 65 20 5c 0d  ourceFileName \.
8a50: 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 5c 22  .            "\"
8a60: 20 74 6f 20 5c 22 22 20 24 74 61 72 67 65 74 46   to \"" $targetF
8a70: 69 6c 65 4e 61 6d 65 20 5c 22 5c 6e 5d 0d 0a 20  ileName \"\n].. 
8a80: 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c       }..    }...
8a90: 0d 0a 20 20 20 20 70 72 6f 63 20 74 72 79 43 6f  ..    proc tryCo
8aa0: 70 79 42 75 69 6c 64 46 69 6c 65 20 7b 0d 0a 20  pyBuildFile {.. 
8ab0: 20 20 20 20 20 20 20 20 20 20 20 66 69 6c 65 4e             fileN
8ac0: 61 6d 65 20 7b 70 6c 61 74 66 6f 72 6d 20 22 22  ame {platform ""
8ad0: 7d 20 7b 6e 65 77 46 69 6c 65 4e 61 6d 65 20 22  } {newFileName "
8ae0: 22 7d 20 7b 76 65 72 62 6f 73 65 20 66 61 6c 73  "} {verbose fals
8af0: 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 73 65  e} } {..      se
8b00: 74 20 73 6f 75 72 63 65 46 69 6c 65 4e 61 6d 65  t sourceFileName
8b10: 20 5b 67 65 74 42 75 69 6c 64 46 69 6c 65 4e 61   [getBuildFileNa
8b20: 6d 65 20 24 66 69 6c 65 4e 61 6d 65 20 24 70 6c  me $fileName $pl
8b30: 61 74 66 6f 72 6d 5d 0d 0a 0d 0a 20 20 20 20 20  atform]....     
8b40: 20 69 66 20 7b 21 5b 66 69 6c 65 20 65 78 69 73   if {![file exis
8b50: 74 73 20 24 73 6f 75 72 63 65 46 69 6c 65 4e 61  ts $sourceFileNa
8b60: 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  me]} then {..   
8b70: 20 20 20 20 20 69 66 20 7b 24 76 65 72 62 6f 73       if {$verbos
8b80: 65 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  e} then {..     
8b90: 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
8ba0: 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
8bb0: 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
8bc0: 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 73 6b          "---- sk
8bd0: 69 70 70 65 64 20 63 6f 70 79 69 6e 67 20 62 75  ipped copying bu
8be0: 69 6c 64 20 66 69 6c 65 20 5c 22 22 20 24 73 6f  ild file \"" $so
8bf0: 75 72 63 65 46 69 6c 65 4e 61 6d 65 20 5c 0d 0a  urceFileName \..
8c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 5c                "\
8c10: 22 2c 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 65  ", it does not e
8c20: 78 69 73 74 5c 6e 22 5d 0d 0a 20 20 20 20 20 20  xist\n"]..      
8c30: 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 72 65 74    }..        ret
8c40: 75 72 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a  urn..      }....
8c50: 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e        if {[strin
8c60: 67 20 6c 65 6e 67 74 68 20 24 6e 65 77 46 69 6c  g length $newFil
8c70: 65 4e 61 6d 65 5d 20 3e 20 30 7d 20 74 68 65 6e  eName] > 0} then
8c80: 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20   {..        set 
8c90: 74 61 72 67 65 74 46 69 6c 65 4e 61 6d 65 20 5b  targetFileName [
8ca0: 67 65 74 42 69 6e 61 72 79 46 69 6c 65 4e 61 6d  getBinaryFileNam
8cb0: 65 20 24 6e 65 77 46 69 6c 65 4e 61 6d 65 20 24  e $newFileName $
8cc0: 70 6c 61 74 66 6f 72 6d 5d 0d 0a 20 20 20 20 20  platform]..     
8cd0: 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
8ce0: 20 20 20 73 65 74 20 74 61 72 67 65 74 46 69 6c     set targetFil
8cf0: 65 4e 61 6d 65 20 5b 67 65 74 42 69 6e 61 72 79  eName [getBinary
8d00: 46 69 6c 65 4e 61 6d 65 20 24 66 69 6c 65 4e 61  FileName $fileNa
8d10: 6d 65 20 24 70 6c 61 74 66 6f 72 6d 5d 0d 0a 20  me $platform].. 
8d20: 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
8d30: 73 65 74 20 74 61 72 67 65 74 44 69 72 65 63 74  set targetDirect
8d40: 6f 72 79 20 5b 66 69 6c 65 20 64 69 72 6e 61 6d  ory [file dirnam
8d50: 65 20 24 74 61 72 67 65 74 46 69 6c 65 4e 61 6d  e $targetFileNam
8d60: 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b  e]....      if {
8d70: 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20  [catch {..      
8d80: 20 20 69 66 20 7b 21 5b 66 69 6c 65 20 65 78 69    if {![file exi
8d90: 73 74 73 20 24 74 61 72 67 65 74 44 69 72 65 63  sts $targetDirec
8da0: 74 6f 72 79 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  tory]} then {.. 
8db0: 20 20 20 20 20 20 20 20 20 66 69 6c 65 20 6d 6b           file mk
8dc0: 64 69 72 20 24 74 61 72 67 65 74 44 69 72 65 63  dir $targetDirec
8dd0: 74 6f 72 79 0d 0a 20 20 20 20 20 20 20 20 7d 0d  tory..        }.
8de0: 0a 20 20 20 20 20 20 20 20 66 69 6c 65 20 63 6f  .        file co
8df0: 70 79 20 2d 66 6f 72 63 65 20 24 73 6f 75 72 63  py -force $sourc
8e00: 65 46 69 6c 65 4e 61 6d 65 20 24 74 61 72 67 65  eFileName $targe
8e10: 74 46 69 6c 65 4e 61 6d 65 0d 0a 20 20 20 20 20  tFileName..     
8e20: 20 7d 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b   }] == 0} then {
8e30: 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20  ..        tputs 
8e40: 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
8e50: 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
8e60: 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
8e70: 20 63 6f 70 69 65 64 20 62 75 69 6c 64 20 66 69   copied build fi
8e80: 6c 65 20 66 72 6f 6d 20 5c 22 22 20 24 73 6f 75  le from \"" $sou
8e90: 72 63 65 46 69 6c 65 4e 61 6d 65 20 22 5c 22 20  rceFileName "\" 
8ea0: 74 6f 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20  to \"" \..      
8eb0: 20 20 20 20 20 20 24 74 61 72 67 65 74 46 69 6c        $targetFil
8ec0: 65 4e 61 6d 65 20 5c 22 5c 6e 5d 0d 0a 20 20 20  eName \"\n]..   
8ed0: 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
8ee0: 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
8ef0: 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
8f00: 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
8f10: 20 20 20 20 20 20 22 2d 2d 2d 2d 20 66 61 69 6c        "---- fail
8f20: 65 64 20 74 6f 20 63 6f 70 79 20 62 75 69 6c 64  ed to copy build
8f30: 20 66 69 6c 65 20 66 72 6f 6d 20 5c 22 22 20 24   file from \"" $
8f40: 73 6f 75 72 63 65 46 69 6c 65 4e 61 6d 65 20 5c  sourceFileName \
8f50: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 5c  ..            "\
8f60: 22 20 74 6f 20 5c 22 22 20 24 74 61 72 67 65 74  " to \"" $target
8f70: 46 69 6c 65 4e 61 6d 65 20 5c 22 5c 6e 5d 0d 0a  FileName \"\n]..
8f80: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a        }..    }..
8f90: 0c 0d 0a 20 20 20 20 70 72 6f 63 20 74 72 79 44  ...    proc tryD
8fa0: 65 6c 65 74 65 42 69 6e 61 72 79 46 69 6c 65 20  eleteBinaryFile 
8fb0: 7b 20 66 69 6c 65 4e 61 6d 65 20 7b 70 6c 61 74  { fileName {plat
8fc0: 66 6f 72 6d 20 22 22 7d 20 7b 76 65 72 62 6f 73  form ""} {verbos
8fd0: 65 20 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a 20 20  e false} } {..  
8fe0: 20 20 20 20 73 65 74 20 66 69 6c 65 4e 61 6d 65      set fileName
8ff0: 20 5b 67 65 74 42 69 6e 61 72 79 46 69 6c 65 4e   [getBinaryFileN
9000: 61 6d 65 20 24 66 69 6c 65 4e 61 6d 65 20 24 70  ame $fileName $p
9010: 6c 61 74 66 6f 72 6d 5d 0d 0a 0d 0a 20 20 20 20  latform]....    
9020: 20 20 69 66 20 7b 21 5b 66 69 6c 65 20 65 78 69    if {![file exi
9030: 73 74 73 20 24 66 69 6c 65 4e 61 6d 65 5d 7d 20  sts $fileName]} 
9040: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
9050: 69 66 20 7b 24 76 65 72 62 6f 73 65 7d 20 74 68  if {$verbose} th
9060: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
9070: 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
9080: 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
9090: 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
90a0: 20 20 20 22 2d 2d 2d 2d 20 73 6b 69 70 70 65 64     "---- skipped
90b0: 20 64 65 6c 65 74 69 6e 67 20 62 69 6e 61 72 79   deleting binary
90c0: 20 66 69 6c 65 20 5c 22 22 20 24 66 69 6c 65 4e   file \"" $fileN
90d0: 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ame \..         
90e0: 20 20 20 20 20 22 5c 22 2c 20 69 74 20 64 6f 65       "\", it doe
90f0: 73 20 6e 6f 74 20 65 78 69 73 74 5c 6e 22 5d 0d  s not exist\n"].
9100: 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  .        }..    
9110: 20 20 20 20 72 65 74 75 72 6e 0d 0a 20 20 20 20      return..    
9120: 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20    }....      if 
9130: 7b 5b 63 61 74 63 68 20 7b 66 69 6c 65 20 64 65  {[catch {file de
9140: 6c 65 74 65 20 24 66 69 6c 65 4e 61 6d 65 7d 5d  lete $fileName}]
9150: 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20   == 0} then {.. 
9160: 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
9170: 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70  test_channel [ap
9180: 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
9190: 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 64 65          "---- de
91a0: 6c 65 74 65 64 20 62 69 6e 61 72 79 20 66 69 6c  leted binary fil
91b0: 65 20 5c 22 22 20 24 66 69 6c 65 4e 61 6d 65 20  e \"" $fileName 
91c0: 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d 20 65  \"\n]..      } e
91d0: 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 74  lse {..        t
91e0: 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
91f0: 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
9200: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
9210: 22 2d 2d 2d 2d 20 66 61 69 6c 65 64 20 74 6f 20  "---- failed to 
9220: 64 65 6c 65 74 65 20 62 69 6e 61 72 79 20 66 69  delete binary fi
9230: 6c 65 20 5c 22 22 20 24 66 69 6c 65 4e 61 6d 65  le \"" $fileName
9240: 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d 0d   \"\n]..      }.
9250: 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70  .    }.....    p
9260: 72 6f 63 20 74 72 79 44 65 6c 65 74 65 42 75 69  roc tryDeleteBui
9270: 6c 64 46 69 6c 65 20 7b 20 66 69 6c 65 4e 61 6d  ldFile { fileNam
9280: 65 20 7b 70 6c 61 74 66 6f 72 6d 20 22 22 7d 20  e {platform ""} 
9290: 7b 76 65 72 62 6f 73 65 20 66 61 6c 73 65 7d 20  {verbose false} 
92a0: 7d 20 7b 0d 0a 20 20 20 20 20 20 73 65 74 20 66  } {..      set f
92b0: 69 6c 65 4e 61 6d 65 20 5b 67 65 74 42 75 69 6c  ileName [getBuil
92c0: 64 46 69 6c 65 4e 61 6d 65 20 24 66 69 6c 65 4e  dFileName $fileN
92d0: 61 6d 65 20 24 70 6c 61 74 66 6f 72 6d 5d 0d 0a  ame $platform]..
92e0: 0d 0a 20 20 20 20 20 20 69 66 20 7b 21 5b 66 69  ..      if {![fi
92f0: 6c 65 20 65 78 69 73 74 73 20 24 66 69 6c 65 4e  le exists $fileN
9300: 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ame]} then {..  
9310: 20 20 20 20 20 20 69 66 20 7b 24 76 65 72 62 6f        if {$verbo
9320: 73 65 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  se} then {..    
9330: 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
9340: 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70  est_channel [app
9350: 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
9360: 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 73           "---- s
9370: 6b 69 70 70 65 64 20 64 65 6c 65 74 69 6e 67 20  kipped deleting 
9380: 62 75 69 6c 64 20 66 69 6c 65 20 5c 22 22 20 24  build file \"" $
9390: 66 69 6c 65 4e 61 6d 65 20 5c 0d 0a 20 20 20 20  fileName \..    
93a0: 20 20 20 20 20 20 20 20 20 20 22 5c 22 2c 20 69            "\", i
93b0: 74 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74  t does not exist
93c0: 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d  \n"]..        }.
93d0: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 0d  .        return.
93e0: 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
93f0: 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 66 69    if {[catch {fi
9400: 6c 65 20 64 65 6c 65 74 65 20 24 66 69 6c 65 4e  le delete $fileN
9410: 61 6d 65 7d 5d 20 3d 3d 20 30 7d 20 74 68 65 6e  ame}] == 0} then
9420: 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74   {..        tput
9430: 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
9440: 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
9450: 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d  .            "--
9460: 2d 2d 20 64 65 6c 65 74 65 64 20 62 75 69 6c 64  -- deleted build
9470: 20 66 69 6c 65 20 5c 22 22 20 24 66 69 6c 65 4e   file \"" $fileN
9480: 61 6d 65 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20  ame \"\n]..     
9490: 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
94a0: 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
94b0: 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  _channel [append
94c0: 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
94d0: 20 20 20 20 22 2d 2d 2d 2d 20 66 61 69 6c 65 64      "---- failed
94e0: 20 74 6f 20 64 65 6c 65 74 65 20 62 75 69 6c 64   to delete build
94f0: 20 66 69 6c 65 20 5c 22 22 20 24 66 69 6c 65 4e   file \"" $fileN
9500: 61 6d 65 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20  ame \"\n]..     
9510: 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20   }..    }.....  
9520: 20 20 70 72 6f 63 20 74 72 79 43 6f 70 79 41 73    proc tryCopyAs
9530: 73 65 6d 62 6c 79 20 7b 0d 0a 20 20 20 20 20 20  sembly {..      
9540: 20 20 20 20 20 20 66 69 6c 65 4e 61 6d 65 20 7b        fileName {
9550: 70 6c 61 74 66 6f 72 6d 20 22 22 7d 20 7b 70 64  platform ""} {pd
9560: 62 20 74 72 75 65 7d 20 7b 76 65 72 62 6f 73 65  b true} {verbose
9570: 20 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a 20 20 20   false} } {..   
9580: 20 20 20 74 72 79 43 6f 70 79 42 75 69 6c 64 46     tryCopyBuildF
9590: 69 6c 65 20 24 66 69 6c 65 4e 61 6d 65 20 24 70  ile $fileName $p
95a0: 6c 61 74 66 6f 72 6d 20 22 22 20 24 76 65 72 62  latform "" $verb
95b0: 6f 73 65 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20  ose....      if 
95c0: 7b 24 70 64 62 7d 20 74 68 65 6e 20 7b 0d 0a 20  {$pdb} then {.. 
95d0: 20 20 20 20 20 20 20 74 72 79 43 6f 70 79 42 75         tryCopyBu
95e0: 69 6c 64 46 69 6c 65 20 5b 61 70 70 65 6e 64 41  ildFile [appendA
95f0: 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
9600: 20 20 20 5b 66 69 6c 65 20 72 6f 6f 74 6e 61 6d     [file rootnam
9610: 65 20 24 66 69 6c 65 4e 61 6d 65 5d 20 2e 70 64  e $fileName] .pd
9620: 62 5d 20 24 70 6c 61 74 66 6f 72 6d 20 22 22 20  b] $platform "" 
9630: 24 76 65 72 62 6f 73 65 0d 0a 20 20 20 20 20 20  $verbose..      
9640: 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  }..    }.....   
9650: 20 70 72 6f 63 20 74 72 79 44 65 6c 65 74 65 41   proc tryDeleteA
9660: 73 73 65 6d 62 6c 79 20 7b 0d 0a 20 20 20 20 20  ssembly {..     
9670: 20 20 20 20 20 20 20 66 69 6c 65 4e 61 6d 65 20         fileName 
9680: 7b 70 6c 61 74 66 6f 72 6d 20 22 22 7d 20 7b 70  {platform ""} {p
9690: 64 62 20 74 72 75 65 7d 20 7b 76 65 72 62 6f 73  db true} {verbos
96a0: 65 20 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a 20 20  e false} } {..  
96b0: 20 20 20 20 74 72 79 44 65 6c 65 74 65 42 69 6e      tryDeleteBin
96c0: 61 72 79 46 69 6c 65 20 24 66 69 6c 65 4e 61 6d  aryFile $fileNam
96d0: 65 20 24 70 6c 61 74 66 6f 72 6d 20 24 76 65 72  e $platform $ver
96e0: 62 6f 73 65 0d 0a 0d 0a 20 20 20 20 20 20 69 66  bose....      if
96f0: 20 7b 24 70 64 62 7d 20 74 68 65 6e 20 7b 0d 0a   {$pdb} then {..
9700: 20 20 20 20 20 20 20 20 74 72 79 44 65 6c 65 74          tryDelet
9710: 65 42 69 6e 61 72 79 46 69 6c 65 20 5b 61 70 70  eBinaryFile [app
9720: 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
9730: 20 20 20 20 20 20 20 5b 66 69 6c 65 20 72 6f 6f         [file roo
9740: 74 6e 61 6d 65 20 24 66 69 6c 65 4e 61 6d 65 5d  tname $fileName]
9750: 20 2e 70 64 62 5d 20 24 70 6c 61 74 66 6f 72 6d   .pdb] $platform
9760: 20 24 76 65 72 62 6f 73 65 0d 0a 20 20 20 20 20   $verbose..     
9770: 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20   }..    }.....  
9780: 20 20 70 72 6f 63 20 74 72 79 4c 6f 61 64 41 73    proc tryLoadAs
9790: 73 65 6d 62 6c 79 20 7b 20 66 69 6c 65 4e 61 6d  sembly { fileNam
97a0: 65 20 7b 70 6c 61 74 66 6f 72 6d 20 22 22 7d 20  e {platform ""} 
97b0: 7d 20 7b 0d 0a 20 20 20 20 20 20 73 65 74 20 66  } {..      set f
97c0: 69 6c 65 4e 61 6d 65 20 5b 67 65 74 42 69 6e 61  ileName [getBina
97d0: 72 79 46 69 6c 65 4e 61 6d 65 20 24 66 69 6c 65  ryFileName $file
97e0: 4e 61 6d 65 20 24 70 6c 61 74 66 6f 72 6d 5d 0d  Name $platform].
97f0: 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 63 61  ...      if {[ca
9800: 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 73  tch {..        s
9810: 65 74 20 61 73 73 65 6d 62 6c 79 20 5b 6f 62 6a  et assembly [obj
9820: 65 63 74 20 6c 6f 61 64 20 2d 6c 6f 61 64 74 79  ect load -loadty
9830: 70 65 20 46 69 6c 65 20 2d 61 6c 69 61 73 20 24  pe File -alias $
9840: 66 69 6c 65 4e 61 6d 65 5d 0d 0a 20 20 20 20 20  fileName]..     
9850: 20 7d 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b   }] == 0} then {
9860: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
9870: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4e 6f 77       # NOTE: Now
9880: 2c 20 61 64 64 20 74 68 65 20 6e 65 63 65 73 73  , add the necess
9890: 61 72 79 20 74 65 73 74 20 63 6f 6e 73 74 72 61  ary test constra
98a0: 69 6e 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  int...        #.
98b0: 0a 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73  .        addCons
98c0: 74 72 61 69 6e 74 20 5b 66 69 6c 65 20 72 6f 6f  traint [file roo
98d0: 74 6e 61 6d 65 20 5b 66 69 6c 65 20 74 61 69 6c  tname [file tail
98e0: 20 24 66 69 6c 65 4e 61 6d 65 5d 5d 0d 0a 0d 0a   $fileName]]....
98f0: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
9900: 20 20 20 23 20 4e 4f 54 45 3a 20 47 72 61 62 20     # NOTE: Grab 
9910: 74 68 65 20 69 6d 61 67 65 20 72 75 6e 74 69 6d  the image runtim
9920: 65 20 76 65 72 73 69 6f 6e 20 66 72 6f 6d 20 74  e version from t
9930: 68 65 20 61 73 73 65 6d 62 6c 79 20 62 65 63 61  he assembly beca
9940: 75 73 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20  use..        #  
9950: 20 20 20 20 20 73 65 76 65 72 61 6c 20 74 65 73       several tes
9960: 74 73 20 72 65 6c 79 20 6f 6e 20 69 74 20 68 61  ts rely on it ha
9970: 76 69 6e 67 20 61 20 63 65 72 74 61 69 6e 20 76  ving a certain v
9980: 61 6c 75 65 2e 0d 0a 20 20 20 20 20 20 20 20 23  alue...        #
9990: 0d 0a 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e  ..        addCon
99a0: 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41  straint [appendA
99b0: 72 67 73 20 5b 66 69 6c 65 20 74 61 69 6c 20 24  rgs [file tail $
99c0: 66 69 6c 65 4e 61 6d 65 5d 20 5f 20 5c 0d 0a 20  fileName] _ \.. 
99d0: 20 20 20 20 20 20 20 20 20 20 20 5b 24 61 73 73             [$ass
99e0: 65 6d 62 6c 79 20 49 6d 61 67 65 52 75 6e 74 69  embly ImageRunti
99f0: 6d 65 56 65 72 73 69 6f 6e 5d 5d 0d 0a 0d 0a 20  meVersion]].... 
9a00: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
9a10: 20 20 23 20 4e 4f 54 45 3a 20 52 65 74 75 72 6e    # NOTE: Return
9a20: 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68 20 6f   the full path o
9a30: 66 20 74 68 65 20 6c 6f 61 64 65 64 20 66 69 6c  f the loaded fil
9a40: 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  e...        #.. 
9a50: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 66         return $f
9a60: 69 6c 65 4e 61 6d 65 0d 0a 20 20 20 20 20 20 7d  ileName..      }
9a70: 0d 0a 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ....      return
9a80: 20 22 22 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20   ""..    }..... 
9a90: 20 20 20 70 72 6f 63 20 69 73 53 51 4c 69 74 65     proc isSQLite
9aa0: 52 65 61 64 79 20 7b 7d 20 7b 0d 0a 20 20 20 20  Ready {} {..    
9ab0: 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
9ac0: 45 3a 20 54 68 69 73 20 70 72 6f 63 65 64 75 72  E: This procedur
9ad0: 65 20 6d 75 73 74 20 72 65 74 75 72 6e 20 6e 6f  e must return no
9ae0: 6e 2d 7a 65 72 6f 20 6f 6e 6c 79 20 69 66 20 74  n-zero only if t
9af0: 68 65 20 53 51 4c 69 74 65 20 6e 61 74 69 76 65  he SQLite native
9b00: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
9b10: 6c 69 62 72 61 72 79 20 61 6e 64 20 74 68 65 20  library and the 
9b20: 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
9b30: 74 65 20 6d 61 6e 61 67 65 64 20 61 73 73 65 6d  te managed assem
9b40: 62 6c 79 20 61 72 65 20 6c 6f 61 64 65 64 0d 0a  bly are loaded..
9b50: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 61 6e        #       an
9b60: 64 20 72 65 61 64 79 20 66 6f 72 20 75 73 65 20  d ready for use 
9b70: 62 79 20 74 68 65 20 74 65 73 74 20 73 75 69 74  by the test suit
9b80: 65 2e 20 20 43 75 72 72 65 6e 74 6c 79 2c 20 74  e.  Currently, t
9b90: 68 69 73 20 70 72 6f 63 65 64 75 72 65 0d 0a 20  his procedure.. 
9ba0: 20 20 20 20 20 23 20 20 20 20 20 20 20 73 68 6f       #       sho
9bb0: 75 6c 64 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e  uld be called on
9bc0: 6c 79 20 61 66 74 65 72 20 74 68 65 20 5b 74 72  ly after the [tr
9bd0: 79 4c 6f 61 64 41 73 73 65 6d 62 6c 79 5d 20 70  yLoadAssembly] p
9be0: 72 6f 63 65 64 75 72 65 20 68 61 73 0d 0a 20 20  rocedure has..  
9bf0: 20 20 20 20 23 20 20 20 20 20 20 20 62 65 65 6e      #       been
9c00: 20 63 61 6c 6c 65 64 20 74 6f 20 70 72 6f 62 65   called to probe
9c10: 20 66 6f 72 20 74 68 65 20 53 79 73 74 65 6d 2e   for the System.
9c20: 44 61 74 61 2e 53 51 4c 69 74 65 20 6d 61 6e 61  Data.SQLite mana
9c30: 67 65 64 20 61 73 73 65 6d 62 6c 79 0d 0a 20 20  ged assembly..  
9c40: 20 20 20 20 23 20 20 20 20 20 20 20 61 6e 64 20      #       and 
9c50: 74 68 65 20 5b 63 68 65 63 6b 46 6f 72 53 51 4c  the [checkForSQL
9c60: 69 74 65 5d 20 70 72 6f 63 65 64 75 72 65 20 68  ite] procedure h
9c70: 61 73 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 74  as been called t
9c80: 6f 20 70 72 6f 62 65 20 66 6f 72 0d 0a 20 20 20  o probe for..   
9c90: 20 20 20 23 20 20 20 20 20 20 20 74 68 65 20 53     #       the S
9ca0: 51 4c 69 74 65 20 6e 61 74 69 76 65 20 6c 69 62  QLite native lib
9cb0: 72 61 72 79 3b 20 6f 74 68 65 72 77 69 73 65 2c  rary; otherwise,
9cc0: 20 74 68 69 73 20 70 72 6f 63 65 64 75 72 65 20   this procedure 
9cd0: 77 69 6c 6c 20 73 69 6d 70 6c 79 0d 0a 20 20 20  will simply..   
9ce0: 20 20 20 23 20 20 20 20 20 20 20 61 6c 77 61 79     #       alway
9cf0: 73 20 72 65 74 75 72 6e 20 7a 65 72 6f 2e 0d 0a  s return zero...
9d00: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 72        #..      r
9d10: 65 74 75 72 6e 20 5b 65 78 70 72 20 7b 0d 0a 20  eturn [expr {.. 
9d20: 20 20 20 20 20 20 20 5b 68 61 76 65 43 6f 6e 73         [haveCons
9d30: 74 72 61 69 6e 74 20 53 79 73 74 65 6d 2e 44 61  traint System.Da
9d40: 74 61 2e 53 51 4c 69 74 65 5d 20 26 26 20 5b 68  ta.SQLite] && [h
9d50: 61 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 53 51  aveConstraint SQ
9d60: 4c 69 74 65 5d 0d 0a 20 20 20 20 20 20 7d 5d 0d  Lite]..      }].
9d70: 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70  .    }.....    p
9d80: 72 6f 63 20 6d 61 74 63 68 4d 61 63 68 69 6e 65  roc matchMachine
9d90: 20 7b 20 70 6c 61 74 66 6f 72 6d 20 7d 20 7b 0d   { platform } {.
9da0: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
9db0: 23 20 4e 4f 54 45 3a 20 41 6e 20 65 6d 70 74 79  # NOTE: An empty
9dc0: 20 73 74 72 69 6e 67 20 66 6f 72 20 74 68 65 20   string for the 
9dd0: 70 6c 61 74 66 6f 72 6d 20 6d 65 61 6e 73 20 74  platform means t
9de0: 68 61 74 20 74 68 65 20 62 75 69 6c 64 20 69 73  hat the build is
9df0: 20 6e 6f 74 0d 0a 20 20 20 20 20 20 23 20 20 20   not..      #   
9e00: 20 20 20 20 5b 70 72 69 6d 61 72 69 6c 79 5d 20      [primarily] 
9e10: 61 20 6e 61 74 69 76 65 20 62 75 69 6c 64 3b 20  a native build; 
9e20: 74 68 65 72 65 66 6f 72 65 2c 20 69 74 20 61 6c  therefore, it al
9e30: 77 61 79 73 20 6d 61 74 63 68 65 73 2e 0d 0a 20  ways matches... 
9e40: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66       #..      if
9e50: 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68   {[string length
9e60: 20 24 70 6c 61 74 66 6f 72 6d 5d 20 3d 3d 20 30   $platform] == 0
9e70: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
9e80: 20 20 72 65 74 75 72 6e 20 74 72 75 65 0d 0a 20    return true.. 
9e90: 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
9ea0: 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
9eb0: 20 44 6f 65 73 20 74 68 65 20 73 70 65 63 69 66   Does the specif
9ec0: 69 65 64 20 70 6c 61 74 66 6f 72 6d 20 6d 61 74  ied platform mat
9ed0: 63 68 20 75 70 20 74 6f 20 74 68 65 20 63 75 72  ch up to the cur
9ee0: 72 65 6e 74 20 70 72 6f 63 65 73 73 3f 0d 0a 20  rent process?.. 
9ef0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66       #..      if
9f00: 20 7b 24 70 6c 61 74 66 6f 72 6d 20 65 71 20 5b   {$platform eq [
9f10: 6d 61 63 68 69 6e 65 54 6f 50 6c 61 74 66 6f 72  machineToPlatfor
9f20: 6d 20 24 3a 3a 74 63 6c 5f 70 6c 61 74 66 6f 72  m $::tcl_platfor
9f30: 6d 28 6d 61 63 68 69 6e 65 29 5d 7d 20 74 68 65  m(machine)]} the
9f40: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 72 65 74  n {..        ret
9f50: 75 72 6e 20 74 72 75 65 0d 0a 20 20 20 20 20 20  urn true..      
9f60: 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  }....      #..  
9f70: 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 65 20      # NOTE: The 
9f80: 73 70 65 63 69 66 69 65 64 20 70 6c 61 74 66 6f  specified platfo
9f90: 72 6d 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63  rm does not matc
9fa0: 68 20 75 70 20 77 69 74 68 20 74 68 65 20 70 6c  h up with the pl
9fb0: 61 74 66 6f 72 6d 0d 0a 20 20 20 20 20 20 23 20  atform..      # 
9fc0: 20 20 20 20 20 20 66 6f 72 20 74 68 65 20 63 75        for the cu
9fd0: 72 72 65 6e 74 20 70 72 6f 63 65 73 73 2e 0d 0a  rrent process...
9fe0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 72        #..      r
9ff0: 65 74 75 72 6e 20 66 61 6c 73 65 0d 0a 20 20 20  eturn false..   
a000: 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
a010: 63 68 65 63 6b 46 6f 72 53 51 4c 69 74 65 42 75  checkForSQLiteBu
a020: 69 6c 64 73 20 7b 20 63 68 61 6e 6e 65 6c 20 7b  ilds { channel {
a030: 73 65 6c 65 63 74 20 66 61 6c 73 65 7d 20 7d 20  select false} } 
a040: 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  {..      #..    
a050: 20 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20    # NOTE: Check 
a060: 66 6f 72 20 65 76 65 72 79 20 70 6f 73 73 69 62  for every possib
a070: 6c 65 20 76 61 6c 69 64 20 63 6f 6d 62 69 6e 61  le valid combina
a080: 74 69 6f 6e 20 6f 66 20 76 61 6c 75 65 73 20 75  tion of values u
a090: 73 65 64 20 77 68 65 6e 0d 0a 20 20 20 20 20 20  sed when..      
a0a0: 23 20 20 20 20 20 20 20 6c 6f 63 61 74 69 6e 67  #       locating
a0b0: 20 6f 75 74 20 74 68 65 20 62 75 69 6c 64 20 6f   out the build o
a0c0: 75 74 70 75 74 20 64 69 72 65 63 74 6f 72 79 2c  utput directory,
a0d0: 20 73 68 6f 77 69 6e 67 20 65 61 63 68 20 61 76   showing each av
a0e0: 61 69 6c 61 62 6c 65 0d 0a 20 20 20 20 20 20 23  ailable..      #
a0f0: 20 20 20 20 20 20 20 62 75 69 6c 64 20 76 61 72         build var
a100: 69 61 74 69 6f 6e 20 61 6c 6f 6e 67 20 74 68 65  iation along the
a110: 20 77 61 79 2e 0d 0a 20 20 20 20 20 20 23 0d 0a   way...      #..
a120: 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 6e 61        foreach na
a130: 74 69 76 65 20 5b 6c 69 73 74 20 66 61 6c 73 65  tive [list false
a140: 20 74 72 75 65 5d 20 7b 0d 0a 20 20 20 20 20 20   true] {..      
a150: 20 20 66 6f 72 65 61 63 68 20 79 65 61 72 20 5b    foreach year [
a160: 67 65 74 42 75 69 6c 64 59 65 61 72 73 5d 20 7b  getBuildYears] {
a170: 0d 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 65  ..          fore
a180: 61 63 68 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  ach configuratio
a190: 6e 20 5b 67 65 74 42 75 69 6c 64 43 6f 6e 66 69  n [getBuildConfi
a1a0: 67 75 72 61 74 69 6f 6e 73 5d 20 7b 0d 0a 20 20  gurations] {..  
a1b0: 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
a1c0: 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a           # NOTE:
a1d0: 20 46 69 67 75 72 65 20 6f 75 74 20 74 68 65 20   Figure out the 
a1e0: 65 66 66 65 63 74 69 76 65 20 62 75 69 6c 64 20  effective build 
a1f0: 70 6c 61 74 66 6f 72 6d 2e 20 20 54 68 69 73 20  platform.  This 
a200: 69 73 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  is..            
a210: 23 20 20 20 20 20 20 20 62 61 73 65 64 20 6f 6e  #       based on
a220: 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   whether or not 
a230: 61 20 5b 70 72 69 6d 61 72 69 6c 79 5d 20 6e 61  a [primarily] na
a240: 74 69 76 65 20 62 75 69 6c 64 0d 0a 20 20 20 20  tive build..    
a250: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
a260: 69 73 20 62 65 69 6e 67 20 75 73 65 64 2e 20 20  is being used.  
a270: 46 6f 72 20 5b 70 72 69 6d 61 72 69 6c 79 5d 20  For [primarily] 
a280: 6e 6f 6e 2d 6e 61 74 69 76 65 20 62 75 69 6c 64  non-native build
a290: 73 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  s,..            
a2a0: 23 20 20 20 20 20 20 20 74 68 69 73 20 77 69 6c  #       this wil
a2b0: 6c 20 62 65 20 61 6e 20 65 6d 70 74 79 20 73 74  l be an empty st
a2c0: 72 69 6e 67 2e 0d 0a 20 20 20 20 20 20 20 20 20  ring...         
a2d0: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
a2e0: 20 20 73 65 74 20 70 6c 61 74 66 6f 72 6d 20 5b    set platform [
a2f0: 67 65 74 42 75 69 6c 64 50 6c 61 74 66 6f 72 6d  getBuildPlatform
a300: 20 24 6e 61 74 69 76 65 5d 0d 0a 0d 0a 20 20 20   $native]....   
a310: 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
a320: 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
a330: 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
a340: 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 68 65         "---- che
a350: 63 6b 69 6e 67 20 66 6f 72 20 53 79 73 74 65 6d  cking for System
a360: 2e 44 61 74 61 2e 53 51 4c 69 74 65 20 62 75 69  .Data.SQLite bui
a370: 6c 64 20 5c 22 22 20 5b 65 78 70 72 20 5c 0d 0a  ld \"" [expr \..
a380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a390: 7b 24 6e 61 74 69 76 65 20 3f 20 22 6e 61 74 69  {$native ? "nati
a3a0: 76 65 2f 22 20 3a 20 22 22 7d 5d 20 5b 65 78 70  ve/" : ""}] [exp
a3b0: 72 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74  r {[string lengt
a3c0: 68 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  h \..           
a3d0: 20 20 20 20 20 24 70 6c 61 74 66 6f 72 6d 5d 20       $platform] 
a3e0: 3e 20 30 20 3f 20 5b 61 70 70 65 6e 64 41 72 67  > 0 ? [appendArg
a3f0: 73 20 24 70 6c 61 74 66 6f 72 6d 20 2f 5d 20 3a  s $platform /] :
a400: 20 22 22 7d 5d 20 24 79 65 61 72 20 5c 0d 0a 20   ""}] $year \.. 
a410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
a420: 20 24 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20   $configuration 
a430: 22 5c 22 2e 2e 2e 20 22 5d 0d 0a 0d 0a 20 20 20  "\"... "]....   
a440: 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
a450: 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
a460: 42 75 69 6c 64 20 74 68 65 20 66 75 6c 6c 79 20  Build the fully 
a470: 71 75 61 6c 69 66 69 65 64 20 64 69 72 65 63 74  qualified direct
a480: 6f 72 79 20 77 68 65 72 65 20 74 68 65 20 6e 65  ory where the ne
a490: 63 65 73 73 61 72 79 0d 0a 20 20 20 20 20 20 20  cessary..       
a4a0: 20 20 20 20 20 23 20 20 20 20 20 20 20 63 6f 6d       #       com
a4b0: 70 6f 6e 65 6e 74 73 20 66 6f 72 20 53 79 73 74  ponents for Syst
a4c0: 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 20 73  em.Data.SQLite s
a4d0: 68 6f 75 6c 64 20 62 65 20 66 6f 75 6e 64 2e 0d  hould be found..
a4e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a  .            #..
a4f0: 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20              set 
a500: 64 69 72 65 63 74 6f 72 79 20 5b 6a 6f 69 6e 42  directory [joinB
a510: 75 69 6c 64 44 69 72 65 63 74 6f 72 79 20 24 6e  uildDirectory $n
a520: 61 74 69 76 65 20 5c 0d 0a 20 20 20 20 20 20 20  ative \..       
a530: 20 20 20 20 20 20 20 20 20 5b 67 65 74 42 75 69           [getBui
a540: 6c 64 42 61 73 65 44 69 72 65 63 74 6f 72 79 5d  ldBaseDirectory]
a550: 20 24 79 65 61 72 20 24 70 6c 61 74 66 6f 72 6d   $year $platform
a560: 20 24 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 5d   $configuration]
a570: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
a580: 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23  #..            #
a590: 20 4e 4f 54 45 3a 20 44 6f 20 74 68 65 20 6e 65   NOTE: Do the ne
a5a0: 63 65 73 73 61 72 79 20 66 69 6c 65 73 20 65 78  cessary files ex
a5b0: 69 73 74 3f 20 20 43 75 72 72 65 6e 74 6c 79 2c  ist?  Currently,
a5c0: 20 6e 6f 20 6f 74 68 65 72 20 73 74 65 70 73 0d   no other steps.
a5d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 20 20  .            #  
a5e0: 20 20 20 20 20 61 72 65 20 74 61 6b 65 6e 20 74       are taken t
a5f0: 6f 20 76 65 72 69 66 79 20 74 68 69 73 20 62 75  o verify this bu
a600: 69 6c 64 20 69 73 20 61 63 74 75 61 6c 6c 79 20  ild is actually 
a610: 76 69 61 62 6c 65 2e 0d 0a 20 20 20 20 20 20 20  viable...       
a620: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
a630: 20 20 20 20 69 66 20 7b 5b 69 73 42 75 69 6c 64      if {[isBuild
a640: 41 76 61 69 6c 61 62 6c 65 20 24 6e 61 74 69 76  Available $nativ
a650: 65 20 24 64 69 72 65 63 74 6f 72 79 5d 7d 20 74  e $directory]} t
a660: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
a670: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
a680: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 57 68        # NOTE: Wh
a690: 65 6e 20 69 6e 20 22 73 65 6c 65 63 74 22 20 6d  en in "select" m
a6a0: 6f 64 65 2c 20 61 75 74 6f 6d 61 74 69 63 61 6c  ode, automatical
a6b0: 6c 79 20 73 65 6c 65 63 74 20 74 68 65 20 66 69  ly select the fi
a6c0: 72 73 74 0d 0a 20 20 20 20 20 20 20 20 20 20 20  rst..           
a6d0: 20 20 20 23 20 20 20 20 20 20 20 61 76 61 69 6c     #       avail
a6e0: 61 62 6c 65 20 62 75 69 6c 64 20 6f 66 20 53 79  able build of Sy
a6f0: 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
a700: 20 61 6e 64 20 74 68 65 6e 20 72 65 74 75 72 6e   and then return
a710: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
a720: 23 20 20 20 20 20 20 20 69 6d 6d 65 64 69 61 74  #       immediat
a730: 65 6c 79 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  ely...          
a740: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
a750: 20 20 20 20 20 69 66 20 7b 24 73 65 6c 65 63 74       if {$select
a760: 20 26 26 20 5b 6d 61 74 63 68 4d 61 63 68 69 6e   && [matchMachin
a770: 65 20 24 70 6c 61 74 66 6f 72 6d 5d 7d 20 74 68  e $platform]} th
a780: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
a790: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
a7a0: 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a           # NOTE:
a7b0: 20 4d 61 6e 75 61 6c 6c 79 20 6f 76 65 72 72 69   Manually overri
a7c0: 64 65 20 61 6c 6c 20 74 68 65 20 62 75 69 6c 64  de all the build
a7d0: 20 64 69 72 65 63 74 6f 72 79 20 73 65 6c 65 63   directory selec
a7e0: 74 69 6f 6e 0d 0a 20 20 20 20 20 20 20 20 20 20  tion..          
a7f0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 72 65        #       re
a800: 6c 61 74 65 64 20 74 65 73 74 20 73 65 74 74 69  lated test setti
a810: 6e 67 73 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ngs in order to 
a820: 66 6f 72 63 65 20 74 68 69 73 20 62 75 69 6c 64  force this build
a830: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
a840: 20 20 23 20 20 20 20 20 20 20 6f 66 20 53 79 73    #       of Sys
a850: 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 20  tem.Data.SQLite 
a860: 74 6f 20 62 65 20 75 73 65 64 2e 0d 0a 20 20 20  to be used...   
a870: 20 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a               #..
a880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a890: 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 49 6e  object invoke In
a8a0: 74 65 72 70 72 65 74 65 72 2e 47 65 74 41 63 74  terpreter.GetAct
a8b0: 69 76 65 20 5b 65 78 70 72 20 7b 24 6e 61 74 69  ive [expr {$nati
a8c0: 76 65 20 3f 20 5c 0d 0a 20 20 20 20 20 20 20 20  ve ? \..        
a8d0: 20 20 20 20 20 20 20 20 20 20 20 20 22 41 64 64              "Add
a8e0: 52 75 6e 74 69 6d 65 4f 70 74 69 6f 6e 22 20 3a  RuntimeOption" :
a8f0: 20 22 52 65 6d 6f 76 65 52 75 6e 74 69 6d 65 4f   "RemoveRuntimeO
a900: 70 74 69 6f 6e 22 7d 5d 20 6e 61 74 69 76 65 0d  ption"}] native.
a910: 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
a920: 20 20 20 73 65 74 20 3a 3a 74 65 73 74 5f 79 65     set ::test_ye
a930: 61 72 20 24 79 65 61 72 0d 0a 20 20 20 20 20 20  ar $year..      
a940: 20 20 20 20 20 20 20 20 20 20 73 65 74 20 3a 3a            set ::
a950: 74 65 73 74 5f 70 6c 61 74 66 6f 72 6d 20 24 70  test_platform $p
a960: 6c 61 74 66 6f 72 6d 0d 0a 20 20 20 20 20 20 20  latform..       
a970: 20 20 20 20 20 20 20 20 20 73 65 74 20 3a 3a 74           set ::t
a980: 65 73 74 5f 63 6f 6e 66 69 67 75 72 61 74 69 6f  est_configuratio
a990: 6e 20 24 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  n $configuration
a9a0: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
a9b0: 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
a9c0: 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
a9d0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
a9e0: 20 20 20 20 20 20 22 79 65 73 2c 20 73 65 6c 65        "yes, sele
a9f0: 63 74 65 64 20 28 22 20 5b 65 78 70 72 20 7b 24  cted (" [expr {$
aa00: 6e 61 74 69 76 65 20 3f 20 22 6e 61 74 69 76 65  native ? "native
aa10: 2f 22 20 3a 20 22 22 7d 5d 20 5c 0d 0a 20 20 20  /" : ""}] \..   
aa20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aa30: 20 5b 65 78 70 72 20 7b 5b 73 74 72 69 6e 67 20   [expr {[string 
aa40: 6c 65 6e 67 74 68 20 24 70 6c 61 74 66 6f 72 6d  length $platform
aa50: 5d 20 3e 20 30 20 3f 20 5b 61 70 70 65 6e 64 41  ] > 0 ? [appendA
aa60: 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
aa70: 20 20 20 20 20 20 20 20 20 20 20 24 70 6c 61 74             $plat
aa80: 66 6f 72 6d 20 2f 5d 20 3a 20 22 22 7d 5d 20 24  form /] : ""}] $
aa90: 79 65 61 72 20 2f 20 24 63 6f 6e 66 69 67 75 72  year / $configur
aaa0: 61 74 69 6f 6e 20 22 29 5c 6e 22 5d 0d 0a 0d 0a  ation ")\n"]....
aab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aac0: 72 65 74 75 72 6e 20 74 72 75 65 0d 0a 20 20 20  return true..   
aad0: 20 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73             } els
aae0: 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e {..           
aaf0: 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
ab00: 6e 65 6c 20 79 65 73 5c 6e 0d 0a 20 20 20 20 20  nel yes\n..     
ab10: 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
ab20: 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b          } else {
ab30: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
ab40: 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 6e  tputs $channel n
ab50: 6f 5c 6e 0d 0a 20 20 20 20 20 20 20 20 20 20 20  o\n..           
ab60: 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d   }..          }.
ab70: 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  .        }..    
ab80: 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65 74    }....      ret
ab90: 75 72 6e 20 66 61 6c 73 65 0d 0a 20 20 20 20 7d  urn false..    }
aba0: 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 63 68  .....    proc ch
abb0: 65 63 6b 46 6f 72 53 51 4c 69 74 65 52 65 6c 65  eckForSQLiteRele
abc0: 61 73 65 73 20 7b 20 63 68 61 6e 6e 65 6c 20 7b  ases { channel {
abd0: 73 65 6c 65 63 74 20 66 61 6c 73 65 7d 20 7d 20  select false} } 
abe0: 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  {..      #..    
abf0: 20 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20    # NOTE: Check 
ac00: 66 6f 72 20 70 61 73 74 20 72 65 6c 65 61 73 65  for past release
ac10: 73 20 6f 66 20 53 79 73 74 65 6d 2e 44 61 74 61  s of System.Data
ac20: 2e 53 51 4c 69 74 65 20 69 6e 20 74 68 65 20 64  .SQLite in the d
ac30: 69 72 65 63 74 6f 72 79 0d 0a 20 20 20 20 20 20  irectory..      
ac40: 23 20 20 20 20 20 20 20 63 6f 6e 74 61 69 6e 65  #       containe
ac50: 64 20 69 6e 20 74 68 65 20 22 53 79 73 74 65 6d  d in the "System
ac60: 2e 44 61 74 61 2e 53 51 4c 69 74 65 22 20 65 6e  .Data.SQLite" en
ac70: 76 69 72 6f 6e 6d 65 6e 74 20 76 61 72 69 61 62  vironment variab
ac80: 6c 65 2c 20 69 66 0d 0a 20 20 20 20 20 20 23 20  le, if..      # 
ac90: 20 20 20 20 20 20 70 72 65 73 65 6e 74 2e 0d 0a        present...
aca0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69        #..      i
acb0: 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20  f {[info exists 
acc0: 3a 3a 65 6e 76 28 53 79 73 74 65 6d 2e 44 61 74  ::env(System.Dat
acd0: 61 2e 53 51 4c 69 74 65 29 5d 20 26 26 20 5c 0d  a.SQLite)] && \.
ace0: 0a 20 20 20 20 20 20 20 20 20 20 5b 73 74 72 69  .          [stri
acf0: 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a 65 6e 76  ng length $::env
ad00: 28 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c  (System.Data.SQL
ad10: 69 74 65 29 5d 20 3e 20 30 7d 20 74 68 65 6e 20  ite)] > 0} then 
ad20: 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
ad30: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 42 75        # NOTE: Bu
ad40: 69 6c 64 20 74 68 65 20 66 75 6c 6c 79 20 71 75  ild the fully qu
ad50: 61 6c 69 66 69 65 64 20 64 69 72 65 63 74 6f 72  alified director
ad60: 79 20 77 68 65 72 65 20 74 68 65 20 6e 65 63 65  y where the nece
ad70: 73 73 61 72 79 0d 0a 20 20 20 20 20 20 20 20 23  ssary..        #
ad80: 20 20 20 20 20 20 20 63 6f 6d 70 6f 6e 65 6e 74         component
ad90: 73 20 66 6f 72 20 53 79 73 74 65 6d 2e 44 61 74  s for System.Dat
ada0: 61 2e 53 51 4c 69 74 65 20 73 68 6f 75 6c 64 20  a.SQLite should 
adb0: 62 65 20 66 6f 75 6e 64 2e 0d 0a 20 20 20 20 20  be found...     
adc0: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 73 65     #..        se
add0: 74 20 64 69 72 65 63 74 6f 72 79 20 5b 66 69 6c  t directory [fil
ade0: 65 20 6e 61 74 69 76 65 6e 61 6d 65 20 5b 66 69  e nativename [fi
adf0: 6c 65 20 6a 6f 69 6e 20 5c 0d 0a 20 20 20 20 20  le join \..     
ae00: 20 20 20 20 20 20 20 24 3a 3a 65 6e 76 28 53 79         $::env(Sy
ae10: 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
ae20: 29 20 5b 67 65 74 52 65 6c 65 61 73 65 56 65 72  ) [getReleaseVer
ae30: 73 69 6f 6e 5d 5d 5d 0d 0a 0d 0a 20 20 20 20 20  sion]]]....     
ae40: 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
ae50: 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
ae60: 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d  .            "--
ae70: 2d 2d 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20  -- checking for 
ae80: 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
ae90: 74 65 20 72 65 6c 65 61 73 65 20 5c 22 22 20 5c  te release \"" \
aea0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 24 64  ..            $d
aeb0: 69 72 65 63 74 6f 72 79 20 22 5c 22 2e 2e 2e 20  irectory "\"... 
aec0: 22 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66  "]....        if
aed0: 20 7b 5b 69 73 52 65 6c 65 61 73 65 41 76 61 69   {[isReleaseAvai
aee0: 6c 61 62 6c 65 20 24 64 69 72 65 63 74 6f 72 79  lable $directory
aef0: 20 70 6c 61 74 66 6f 72 6d 5d 7d 20 74 68 65 6e   platform]} then
af00: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66   {..          if
af10: 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68   {[string length
af20: 20 24 70 6c 61 74 66 6f 72 6d 5d 20 3d 3d 20 30   $platform] == 0
af30: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
af40: 20 20 20 20 20 20 73 65 74 20 70 6c 61 74 66 6f        set platfo
af50: 72 6d 20 75 6e 6b 6e 6f 77 6e 0d 0a 20 20 20 20  rm unknown..    
af60: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
af70: 20 20 20 20 20 69 66 20 7b 24 73 65 6c 65 63 74       if {$select
af80: 20 26 26 20 5b 6d 61 74 63 68 4d 61 63 68 69 6e   && [matchMachin
af90: 65 20 24 70 6c 61 74 66 6f 72 6d 5d 7d 20 74 68  e $platform]} th
afa0: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
afb0: 20 20 73 65 74 20 3a 3a 62 75 69 6c 64 5f 64 69    set ::build_di
afc0: 72 65 63 74 6f 72 79 20 24 64 69 72 65 63 74 6f  rectory $directo
afd0: 72 79 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  ry....          
afe0: 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
aff0: 20 5b 61 70 70 65 6e 64 41 72 67 73 20 22 79 65   [appendArgs "ye
b000: 73 2c 20 73 65 6c 65 63 74 65 64 20 28 22 20 24  s, selected (" $
b010: 70 6c 61 74 66 6f 72 6d 20 22 29 5c 6e 22 5d 0d  platform ")\n"].
b020: 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  ...            r
b030: 65 74 75 72 6e 20 74 72 75 65 0d 0a 20 20 20 20  eturn true..    
b040: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
b050: 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
b060: 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  s $channel [appe
b070: 6e 64 41 72 67 73 20 22 79 65 73 20 28 22 20 24  ndArgs "yes (" $
b080: 70 6c 61 74 66 6f 72 6d 20 22 29 5c 6e 22 5d 0d  platform ")\n"].
b090: 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  .          }..  
b0a0: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
b0b0: 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
b0c0: 24 63 68 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d 0a 0d  $channel no\n...
b0d0: 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 65 61  .          forea
b0e0: 63 68 20 70 61 74 68 20 5b 6c 73 6f 72 74 20 2d  ch path [lsort -
b0f0: 64 65 63 72 65 61 73 69 6e 67 20 5b 66 69 6c 65  decreasing [file
b100: 20 6c 69 73 74 20 24 64 69 72 65 63 74 6f 72 79   list $directory
b110: 20 2a 5d 5d 20 7b 0d 0a 20 20 20 20 20 20 20 20   *]] {..        
b120: 20 20 20 20 69 66 20 7b 5b 66 69 6c 65 20 65 78      if {[file ex
b130: 69 73 74 73 20 24 70 61 74 68 5d 20 26 26 20 5b  ists $path] && [
b140: 66 69 6c 65 20 69 73 64 69 72 65 63 74 6f 72 79  file isdirectory
b150: 20 24 70 61 74 68 5d 7d 20 74 68 65 6e 20 7b 0d   $path]} then {.
b160: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74  .              t
b170: 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61  puts $channel [a
b180: 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
b190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
b1a0: 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e 67 20 66 6f  ---- checking fo
b1b0: 72 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51  r System.Data.SQ
b1c0: 4c 69 74 65 20 72 65 6c 65 61 73 65 20 5c 22 22  Lite release \""
b1d0: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
b1e0: 20 20 20 20 20 20 24 70 61 74 68 20 22 5c 22 2e        $path "\".
b1f0: 2e 2e 20 22 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  .. "]....       
b200: 20 20 20 20 20 20 20 69 66 20 7b 5b 69 73 52 65         if {[isRe
b210: 6c 65 61 73 65 41 76 61 69 6c 61 62 6c 65 20 24  leaseAvailable $
b220: 70 61 74 68 20 70 6c 61 74 66 6f 72 6d 5d 7d 20  path platform]} 
b230: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
b240: 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72          if {[str
b250: 69 6e 67 20 6c 65 6e 67 74 68 20 24 70 6c 61 74  ing length $plat
b260: 66 6f 72 6d 5d 20 3d 3d 20 30 7d 20 74 68 65 6e  form] == 0} then
b270: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
b280: 20 20 20 20 20 20 73 65 74 20 70 6c 61 74 66 6f        set platfo
b290: 72 6d 20 75 6e 6b 6e 6f 77 6e 0d 0a 20 20 20 20  rm unknown..    
b2a0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d              }...
b2b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
b2c0: 20 69 66 20 7b 24 73 65 6c 65 63 74 20 26 26 20   if {$select && 
b2d0: 5b 6d 61 74 63 68 4d 61 63 68 69 6e 65 20 24 70  [matchMachine $p
b2e0: 6c 61 74 66 6f 72 6d 5d 7d 20 74 68 65 6e 20 7b  latform]} then {
b2f0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
b300: 20 20 20 20 73 65 74 20 3a 3a 62 75 69 6c 64 5f      set ::build_
b310: 64 69 72 65 63 74 6f 72 79 20 24 70 61 74 68 0d  directory $path.
b320: 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
b330: 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
b340: 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
b350: 22 79 65 73 2c 20 73 65 6c 65 63 74 65 64 20 28  "yes, selected (
b360: 22 20 24 70 6c 61 74 66 6f 72 6d 20 22 29 5c 6e  " $platform ")\n
b370: 22 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  "]....          
b380: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 74          return t
b390: 72 75 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20  rue..           
b3a0: 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
b3b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b3c0: 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
b3d0: 5b 61 70 70 65 6e 64 41 72 67 73 20 22 79 65 73  [appendArgs "yes
b3e0: 20 28 22 20 24 70 6c 61 74 66 6f 72 6d 20 22 29   (" $platform ")
b3f0: 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20 20 20  \n"]..          
b400: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
b410: 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d         } else {.
b420: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
b430: 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
b440: 6e 6f 5c 6e 0d 0a 20 20 20 20 20 20 20 20 20 20  no\n..          
b450: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
b460: 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
b470: 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  }..        }..  
b480: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
b490: 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
b4a0: 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
b4b0: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
b4c0: 22 2d 2d 2d 2d 20 65 6e 76 69 72 6f 6e 6d 65 6e  "---- environmen
b4d0: 74 20 76 61 72 69 61 62 6c 65 20 5c 22 53 79 73  t variable \"Sys
b4e0: 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 5c  tem.Data.SQLite\
b4f0: 22 20 69 73 20 6e 6f 74 20 22 20 5c 0d 0a 20 20  " is not " \..  
b500: 20 20 20 20 20 20 20 20 20 20 22 73 65 74 2c 20            "set, 
b510: 73 6b 69 70 70 69 6e 67 20 63 68 65 63 6b 20 66  skipping check f
b520: 6f 72 20 72 65 6c 65 61 73 65 73 2e 2e 2e 5c 6e  or releases...\n
b530: 22 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  "]..      }.... 
b540: 20 20 20 20 20 72 65 74 75 72 6e 20 66 61 6c 73       return fals
b550: 65 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  e..    }.....   
b560: 20 70 72 6f 63 20 63 68 65 63 6b 46 6f 72 53 51   proc checkForSQ
b570: 4c 69 74 65 4c 69 62 72 61 72 79 20 7b 20 63 68  LiteLibrary { ch
b580: 61 6e 6e 65 6c 20 7d 20 7b 0d 0a 20 20 20 20 20  annel } {..     
b590: 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
b5a0: 22 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e 67 20 66  "---- checking f
b5b0: 6f 72 20 53 51 4c 69 74 65 20 63 6f 72 65 20 6c  or SQLite core l
b5c0: 69 62 72 61 72 79 2e 2e 2e 20 22 0d 0a 0d 0a 20  ibrary... ".... 
b5d0: 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20       if {[catch 
b5e0: 7b 0d 0a 20 20 20 20 20 20 20 20 6f 62 6a 65 63  {..        objec
b5f0: 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20  t invoke -flags 
b600: 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20  +NonPublic \..  
b610: 20 20 20 20 20 20 20 20 20 20 53 79 73 74 65 6d            System
b620: 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 53 51 4c  .Data.SQLite.SQL
b630: 69 74 65 33 20 53 51 4c 69 74 65 56 65 72 73 69  ite3 SQLiteVersi
b640: 6f 6e 0d 0a 20 20 20 20 20 20 7d 20 76 65 72 73  on..      } vers
b650: 69 6f 6e 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20  ion] == 0} then 
b660: 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
b670: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68        # NOTE: Ch
b680: 65 63 6b 20 69 66 20 74 68 65 20 72 65 74 75 72  eck if the retur
b690: 6e 65 64 20 76 65 72 73 69 6f 6e 20 77 61 73 20  ned version was 
b6a0: 6e 75 6c 6c 2e 20 20 49 66 20 73 6f 2c 20 6d 61  null.  If so, ma
b6b0: 6b 65 20 69 74 20 65 61 73 79 0d 0a 20 20 20 20  ke it easy..    
b6c0: 20 20 20 20 23 20 20 20 20 20 20 20 74 6f 20 73      #       to s
b6d0: 70 6f 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  pot...        #.
b6e0: 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73 74  .        if {[st
b6f0: 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 76 65 72  ring length $ver
b700: 73 69 6f 6e 5d 20 3d 3d 20 30 7d 20 74 68 65 6e  sion] == 0} then
b710: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65   {..          se
b720: 74 20 76 65 72 73 69 6f 6e 20 6e 75 6c 6c 0d 0a  t version null..
b730: 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
b740: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
b750: 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74 20  # NOTE: Attempt 
b760: 74 6f 20 71 75 65 72 79 20 74 68 65 20 46 6f 73  to query the Fos
b770: 73 69 6c 20 73 6f 75 72 63 65 20 69 64 65 6e 74  sil source ident
b780: 69 66 69 65 72 20 66 6f 72 20 74 68 65 20 53 51  ifier for the SQ
b790: 4c 69 74 65 0d 0a 20 20 20 20 20 20 20 20 23 20  Lite..        # 
b7a0: 20 20 20 20 20 20 63 6f 72 65 20 6c 69 62 72 61        core libra
b7b0: 72 79 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  ry...        #..
b7c0: 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74          if {[cat
b7d0: 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  ch {..          
b7e0: 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66  object invoke -f
b7f0: 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20  lags +NonPublic 
b800: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
b810: 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c   System.Data.SQL
b820: 69 74 65 2e 53 51 4c 69 74 65 33 20 53 51 4c 69  ite.SQLite3 SQLi
b830: 74 65 53 6f 75 72 63 65 49 64 0d 0a 20 20 20 20  teSourceId..    
b840: 20 20 20 20 7d 20 73 6f 75 72 63 65 49 64 5d 7d      } sourceId]}
b850: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
b860: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
b870: 23 20 4e 4f 54 45 3a 20 57 65 20 66 61 69 6c 65  # NOTE: We faile
b880: 64 20 74 6f 20 71 75 65 72 79 20 74 68 65 20 46  d to query the F
b890: 6f 73 73 69 6c 20 73 6f 75 72 63 65 20 69 64 65  ossil source ide
b8a0: 6e 74 69 66 69 65 72 2e 0d 0a 20 20 20 20 20 20  ntifier...      
b8b0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
b8c0: 20 73 65 74 20 73 6f 75 72 63 65 49 64 20 75 6e   set sourceId un
b8d0: 6b 6e 6f 77 6e 0d 0a 20 20 20 20 20 20 20 20 7d  known..        }
b8e0: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  ....        #.. 
b8f0: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43         # NOTE: C
b900: 68 65 63 6b 20 69 66 20 74 68 65 20 72 65 74 75  heck if the retu
b910: 72 6e 65 64 20 46 6f 73 73 69 6c 20 73 6f 75 72  rned Fossil sour
b920: 63 65 20 69 64 65 6e 74 69 66 69 65 72 20 77 61  ce identifier wa
b930: 73 20 6e 75 6c 6c 2e 20 20 49 66 0d 0a 20 20 20  s null.  If..   
b940: 20 20 20 20 20 23 20 20 20 20 20 20 20 73 6f 2c       #       so,
b950: 20 6d 61 6b 65 20 69 74 20 65 61 73 79 20 74 6f   make it easy to
b960: 20 73 70 6f 74 2e 0d 0a 20 20 20 20 20 20 20 20   spot...        
b970: 23 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b  #..        if {[
b980: 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 73  string length $s
b990: 6f 75 72 63 65 49 64 5d 20 3d 3d 20 30 7d 20 74  ourceId] == 0} t
b9a0: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
b9b0: 20 73 65 74 20 73 6f 75 72 63 65 49 64 20 6e 75   set sourceId nu
b9c0: 6c 6c 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d  ll..        }...
b9d0: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
b9e0: 20 20 20 20 23 20 4e 4f 54 45 3a 20 59 65 73 2c      # NOTE: Yes,
b9f0: 20 74 68 65 20 53 51 4c 69 74 65 20 63 6f 72 65   the SQLite core
ba00: 20 6c 69 62 72 61 72 79 20 61 70 70 65 61 72 73   library appears
ba10: 20 74 6f 20 62 65 20 61 76 61 69 6c 61 62 6c 65   to be available
ba20: 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
ba30: 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61        addConstra
ba40: 69 6e 74 20 53 51 4c 69 74 65 0d 0a 0d 0a 20 20  int SQLite....  
ba50: 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
ba60: 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
ba70: 20 22 79 65 73 20 28 22 20 24 76 65 72 73 69 6f   "yes (" $versio
ba80: 6e 20 22 20 22 20 24 73 6f 75 72 63 65 49 64 20  n " " $sourceId 
ba90: 22 29 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 7d 20  ")\n"]..      } 
baa0: 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
bab0: 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 6e  tputs $channel n
bac0: 6f 5c 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20  o\n..      }..  
bad0: 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
bae0: 20 63 68 65 63 6b 46 6f 72 53 51 4c 69 74 65 49   checkForSQLiteI
baf0: 6e 74 65 72 6f 70 20 7b 20 63 68 61 6e 6e 65 6c  nterop { channel
bb00: 20 7d 20 7b 0d 0a 20 20 20 20 20 20 74 70 75 74   } {..      tput
bb10: 73 20 24 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d  s $channel "----
bb20: 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 53 51   checking for SQ
bb30: 4c 69 74 65 20 69 6e 74 65 72 6f 70 20 61 73 73  Lite interop ass
bb40: 65 6d 62 6c 79 2e 2e 2e 20 22 0d 0a 0d 0a 20 20  embly... "....  
bb50: 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b      if {[catch {
bb60: 0d 0a 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74  ..        object
bb70: 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b   invoke -flags +
bb80: 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20  NonPublic \..   
bb90: 20 20 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e           System.
bba0: 44 61 74 61 2e 53 51 4c 69 74 65 2e 53 51 4c 69  Data.SQLite.SQLi
bbb0: 74 65 33 20 49 6e 74 65 72 6f 70 56 65 72 73 69  te3 InteropVersi
bbc0: 6f 6e 0d 0a 20 20 20 20 20 20 7d 20 76 65 72 73  on..      } vers
bbd0: 69 6f 6e 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20  ion] == 0} then 
bbe0: 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
bbf0: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68        # NOTE: Ch
bc00: 65 63 6b 20 69 66 20 74 68 65 20 72 65 74 75 72  eck if the retur
bc10: 6e 65 64 20 76 65 72 73 69 6f 6e 20 77 61 73 20  ned version was 
bc20: 6e 75 6c 6c 2e 20 20 49 66 20 73 6f 2c 20 6d 61  null.  If so, ma
bc30: 6b 65 20 69 74 20 65 61 73 79 0d 0a 20 20 20 20  ke it easy..    
bc40: 20 20 20 20 23 20 20 20 20 20 20 20 74 6f 20 73      #       to s
bc50: 70 6f 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  pot...        #.
bc60: 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73 74  .        if {[st
bc70: 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 76 65 72  ring length $ver
bc80: 73 69 6f 6e 5d 20 3d 3d 20 30 7d 20 74 68 65 6e  sion] == 0} then
bc90: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65   {..          se
bca0: 74 20 76 65 72 73 69 6f 6e 20 6e 75 6c 6c 0d 0a  t version null..
bcb0: 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
bcc0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
bcd0: 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74 20  # NOTE: Attempt 
bce0: 74 6f 20 71 75 65 72 79 20 74 68 65 20 46 6f 73  to query the Fos
bcf0: 73 69 6c 20 73 6f 75 72 63 65 20 69 64 65 6e 74  sil source ident
bd00: 69 66 69 65 72 20 66 6f 72 20 74 68 65 20 53 51  ifier for the SQ
bd10: 4c 69 74 65 0d 0a 20 20 20 20 20 20 20 20 23 20  Lite..        # 
bd20: 20 20 20 20 20 20 63 6f 72 65 20 6c 69 62 72 61        core libra
bd30: 72 79 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  ry...        #..
bd40: 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74          if {[cat
bd50: 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  ch {..          
bd60: 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66  object invoke -f
bd70: 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20  lags +NonPublic 
bd80: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
bd90: 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c   System.Data.SQL
bda0: 69 74 65 2e 53 51 4c 69 74 65 33 20 49 6e 74 65  ite.SQLite3 Inte
bdb0: 72 6f 70 53 6f 75 72 63 65 49 64 0d 0a 20 20 20  ropSourceId..   
bdc0: 20 20 20 20 20 7d 20 73 6f 75 72 63 65 49 64 5d       } sourceId]
bdd0: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
bde0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
bdf0: 20 23 20 4e 4f 54 45 3a 20 57 65 20 66 61 69 6c   # NOTE: We fail
be00: 65 64 20 74 6f 20 71 75 65 72 79 20 74 68 65 20  ed to query the 
be10: 46 6f 73 73 69 6c 20 73 6f 75 72 63 65 20 69 64  Fossil source id
be20: 65 6e 74 69 66 69 65 72 2e 0d 0a 20 20 20 20 20  entifier...     
be30: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
be40: 20 20 73 65 74 20 73 6f 75 72 63 65 49 64 20 75    set sourceId u
be50: 6e 6b 6e 6f 77 6e 0d 0a 20 20 20 20 20 20 20 20  nknown..        
be60: 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  }....        #..
be70: 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
be80: 43 68 65 63 6b 20 69 66 20 74 68 65 20 72 65 74  Check if the ret
be90: 75 72 6e 65 64 20 46 6f 73 73 69 6c 20 73 6f 75  urned Fossil sou
bea0: 72 63 65 20 69 64 65 6e 74 69 66 69 65 72 20 77  rce identifier w
beb0: 61 73 20 6e 75 6c 6c 2e 20 20 49 66 0d 0a 20 20  as null.  If..  
bec0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 73 6f        #       so
bed0: 2c 20 6d 61 6b 65 20 69 74 20 65 61 73 79 20 74  , make it easy t
bee0: 6f 20 73 70 6f 74 2e 0d 0a 20 20 20 20 20 20 20  o spot...       
bef0: 20 23 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b   #..        if {
bf00: 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
bf10: 73 6f 75 72 63 65 49 64 5d 20 3d 3d 20 30 7d 20  sourceId] == 0} 
bf20: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
bf30: 20 20 73 65 74 20 73 6f 75 72 63 65 49 64 20 6e    set sourceId n
bf40: 75 6c 6c 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  ull..        }..
bf50: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
bf60: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 59 65 73       # NOTE: Yes
bf70: 2c 20 74 68 65 20 53 51 4c 69 74 65 20 69 6e 74  , the SQLite int
bf80: 65 72 6f 70 20 61 73 73 65 6d 62 6c 79 20 61 70  erop assembly ap
bf90: 70 65 61 72 73 20 74 6f 20 62 65 20 61 76 61 69  pears to be avai
bfa0: 6c 61 62 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20  lable...        
bfb0: 23 0d 0a 20 20 20 20 20 20 20 20 61 64 64 43 6f  #..        addCo
bfc0: 6e 73 74 72 61 69 6e 74 20 53 51 4c 69 74 65 49  nstraint SQLiteI
bfd0: 6e 74 65 72 6f 70 0d 0a 0d 0a 20 20 20 20 20 20  nterop....      
bfe0: 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
bff0: 20 5b 61 70 70 65 6e 64 41 72 67 73 20 22 79 65   [appendArgs "ye
c000: 73 20 28 22 20 24 76 65 72 73 69 6f 6e 20 22 20  s (" $version " 
c010: 22 20 24 73 6f 75 72 63 65 49 64 20 22 29 5c 6e  " $sourceId ")\n
c020: 22 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65  "]..      } else
c030: 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74   {..        tput
c040: 73 20 24 63 68 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d  s $channel no\n.
c050: 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d  .      }..    }.
c060: 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 63 68 65  ....    proc che
c070: 63 6b 46 6f 72 53 51 4c 69 74 65 44 65 66 69 6e  ckForSQLiteDefin
c080: 65 43 6f 6e 73 74 61 6e 74 20 7b 20 63 68 61 6e  eConstant { chan
c090: 6e 65 6c 20 6e 61 6d 65 20 7d 20 7b 0d 0a 20 20  nel name } {..  
c0a0: 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
c0b0: 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
c0c0: 0d 0a 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d  ..          "---
c0d0: 2d 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 53  - checking for S
c0e0: 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
c0f0: 65 20 64 65 66 69 6e 65 20 63 6f 6e 73 74 61 6e  e define constan
c100: 74 20 5c 22 22 20 24 6e 61 6d 65 20 5c 0d 0a 20  t \"" $name \.. 
c110: 20 20 20 20 20 20 20 20 20 22 5c 22 2e 2e 2e 20           "\"... 
c120: 22 5d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b  "]....      if {
c130: 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20  [catch {..      
c140: 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20    object invoke 
c150: 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69  -flags +NonPubli
c160: 63 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  c \..           
c170: 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c   System.Data.SQL
c180: 69 74 65 2e 53 51 4c 69 74 65 33 20 44 65 66 69  ite.SQLite3 Defi
c190: 6e 65 43 6f 6e 73 74 61 6e 74 73 0d 0a 20 20 20  neConstants..   
c1a0: 20 20 20 7d 20 64 65 66 69 6e 65 43 6f 6e 73 74     } defineConst
c1b0: 61 6e 74 73 5d 20 3d 3d 20 30 7d 20 74 68 65 6e  ants] == 0} then
c1c0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b   {..        if {
c1d0: 5b 6c 73 65 61 72 63 68 20 2d 65 78 61 63 74 20  [lsearch -exact 
c1e0: 2d 6e 6f 63 61 73 65 20 24 64 65 66 69 6e 65 43  -nocase $defineC
c1f0: 6f 6e 73 74 61 6e 74 73 20 24 6e 61 6d 65 5d 20  onstants $name] 
c200: 21 3d 20 2d 31 7d 20 74 68 65 6e 20 7b 0d 0a 20  != -1} then {.. 
c210: 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
c220: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 59 65        # NOTE: Ye
c230: 73 2c 20 74 68 69 73 20 64 65 66 69 6e 65 20 63  s, this define c
c240: 6f 6e 73 74 61 6e 74 20 77 61 73 20 65 6e 61 62  onstant was enab
c250: 6c 65 64 20 77 68 65 6e 20 74 68 65 20 6d 61 6e  led when the man
c260: 61 67 65 64 0d 0a 20 20 20 20 20 20 20 20 20 20  aged..          
c270: 23 20 20 20 20 20 20 20 61 73 73 65 6d 62 6c 79  #       assembly
c280: 20 77 61 73 20 63 6f 6d 70 69 6c 65 64 2e 0d 0a   was compiled...
c290: 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
c2a0: 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72         addConstr
c2b0: 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73  aint [appendArgs
c2c0: 20 64 65 66 69 6e 65 43 6f 6e 73 74 61 6e 74 2e   defineConstant.
c2d0: 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
c2e0: 74 65 2e 20 24 6e 61 6d 65 5d 0d 0a 0d 0a 20 20  te. $name]....  
c2f0: 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
c300: 68 61 6e 6e 65 6c 20 79 65 73 5c 6e 0d 0a 20 20  hannel yes\n..  
c310: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
c320: 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
c330: 24 63 68 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d 0a 20  $channel no\n.. 
c340: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
c350: 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
c360: 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
c370: 20 65 72 72 6f 72 5c 6e 0d 0a 20 20 20 20 20 20   error\n..      
c380: 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  }..    }.....   
c390: 20 70 72 6f 63 20 67 65 74 44 61 74 65 54 69 6d   proc getDateTim
c3a0: 65 46 6f 72 6d 61 74 20 7b 7d 20 7b 0d 0a 20 20  eFormat {} {..  
c3b0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
c3c0: 4f 54 45 3a 20 54 68 69 73 20 70 72 6f 63 65 64  OTE: This proced
c3d0: 75 72 65 20 73 69 6d 70 6c 79 20 72 65 74 75 72  ure simply retur
c3e0: 6e 73 20 74 68 65 20 22 64 65 66 61 75 6c 74 22  ns the "default"
c3f0: 20 44 61 74 65 54 69 6d 65 20 66 6f 72 6d 61 74   DateTime format
c400: 20 75 73 65 64 0d 0a 20 20 20 20 20 20 23 20 20   used..      #  
c410: 20 20 20 20 20 62 79 20 74 68 65 20 74 65 73 74       by the test
c420: 20 73 75 69 74 65 2e 0d 0a 20 20 20 20 20 20 23   suite...      #
c430: 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66  ..      if {[inf
c440: 6f 20 65 78 69 73 74 73 20 3a 3a 64 61 74 65 74  o exists ::datet
c450: 69 6d 65 5f 66 6f 72 6d 61 74 5d 20 26 26 20 5c  ime_format] && \
c460: 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 73 74 72  ..          [str
c470: 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a 64 61  ing length $::da
c480: 74 65 74 69 6d 65 5f 66 6f 72 6d 61 74 5d 20 3e  tetime_format] >
c490: 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
c4a0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
c4b0: 20 4e 4f 54 45 3a 20 52 65 74 75 72 6e 20 74 68   NOTE: Return th
c4c0: 65 20 6d 61 6e 75 61 6c 6c 79 20 6f 76 65 72 72  e manually overr
c4d0: 69 64 64 65 6e 20 76 61 6c 75 65 20 66 6f 72 20  idden value for 
c4e0: 74 68 65 20 44 61 74 65 54 69 6d 65 20 66 6f 72  the DateTime for
c4f0: 6d 61 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  mat...        #.
c500: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
c510: 24 3a 3a 64 61 74 65 74 69 6d 65 5f 66 6f 72 6d  $::datetime_form
c520: 61 74 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65  at..      } else
c530: 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20   {..        #.. 
c540: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 52         # NOTE: R
c550: 65 74 75 72 6e 20 61 6e 20 49 53 4f 38 36 30 31  eturn an ISO8601
c560: 20 44 61 74 65 54 69 6d 65 20 66 6f 72 6d 61 74   DateTime format
c570: 20 63 6f 6d 70 61 74 69 62 6c 65 20 77 69 74 68   compatible with
c580: 20 53 51 4c 69 74 65 2c 0d 0a 20 20 20 20 20 20   SQLite,..      
c590: 20 20 23 20 20 20 20 20 20 20 53 79 73 74 65 6d    #       System
c5a0: 2e 44 61 74 61 2e 53 51 4c 69 74 65 2c 20 61 6e  .Data.SQLite, an
c5b0: 64 20 73 75 69 74 61 62 6c 65 20 66 6f 72 20 72  d suitable for r
c5c0: 6f 75 6e 64 2d 74 72 69 70 70 69 6e 67 20 77 69  ound-tripping wi
c5d0: 74 68 20 74 68 65 0d 0a 20 20 20 20 20 20 20 20  th the..        
c5e0: 23 20 20 20 20 20 20 20 44 61 74 65 54 69 6d 65  #       DateTime
c5f0: 20 63 6c 61 73 73 20 6f 66 20 74 68 65 20 66 72   class of the fr
c600: 61 6d 65 77 6f 72 6b 2e 20 20 49 66 20 74 68 69  amework.  If thi
c610: 73 20 76 61 6c 75 65 20 69 73 20 63 68 61 6e 67  s value is chang
c620: 65 64 2c 0d 0a 20 20 20 20 20 20 20 20 23 20 20  ed,..        #  
c630: 20 20 20 20 20 76 61 72 69 6f 75 73 20 74 65 73       various tes
c640: 74 73 20 6d 61 79 20 66 61 69 6c 2e 0d 0a 20 20  ts may fail...  
c650: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
c660: 20 72 65 74 75 72 6e 20 22 79 79 79 79 2d 4d 4d   return "yyyy-MM
c670: 2d 64 64 20 48 48 3a 6d 6d 3a 73 73 2e 46 46 46  -dd HH:mm:ss.FFF
c680: 46 46 46 46 4b 22 0d 0a 20 20 20 20 20 20 7d 0d  FFFFK"..      }.
c690: 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70  .    }.....    p
c6a0: 72 6f 63 20 65 6e 75 6d 65 72 61 62 6c 65 54 6f  roc enumerableTo
c6b0: 4c 69 73 74 20 7b 20 65 6e 75 6d 65 72 61 62 6c  List { enumerabl
c6c0: 65 20 7d 20 7b 0d 0a 20 20 20 20 20 20 73 65 74  e } {..      set
c6d0: 20 72 65 73 75 6c 74 20 5b 6c 69 73 74 5d 0d 0a   result [list]..
c6e0: 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72  ..      if {[str
c6f0: 69 6e 67 20 6c 65 6e 67 74 68 20 24 65 6e 75 6d  ing length $enum
c700: 65 72 61 62 6c 65 5d 20 3d 3d 20 30 20 7c 7c 20  erable] == 0 || 
c710: 24 65 6e 75 6d 65 72 61 62 6c 65 20 65 71 20 22  $enumerable eq "
c720: 6e 75 6c 6c 22 7d 20 74 68 65 6e 20 7b 0d 0a 20  null"} then {.. 
c730: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 72         return $r
c740: 65 73 75 6c 74 0d 0a 20 20 20 20 20 20 7d 0d 0a  esult..      }..
c750: 0d 0a 20 20 20 20 20 20 6f 62 6a 65 63 74 20 66  ..      object f
c760: 6f 72 65 61 63 68 20 2d 61 6c 69 61 73 20 69 74  oreach -alias it
c770: 65 6d 20 24 65 6e 75 6d 65 72 61 62 6c 65 20 7b  em $enumerable {
c780: 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73  ..        if {[s
c790: 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 69 74  tring length $it
c7a0: 65 6d 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d  em] > 0} then {.
c7b0: 0a 20 20 20 20 20 20 20 20 20 20 6c 61 70 70 65  .          lappe
c7c0: 6e 64 20 72 65 73 75 6c 74 20 5b 24 69 74 65 6d  nd result [$item
c7d0: 20 54 6f 53 74 72 69 6e 67 5d 0d 0a 20 20 20 20   ToString]..    
c7e0: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a      }..      }..
c7f0: 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 24  ..      return $
c800: 72 65 73 75 6c 74 0d 0a 20 20 20 20 7d 0d 0a 0c  result..    }...
c810: 0d 0a 20 20 20 20 70 72 6f 63 20 63 61 74 63 68  ..    proc catch
c820: 41 6e 64 52 65 74 75 72 6e 20 7b 20 73 63 72 69  AndReturn { scri
c830: 70 74 20 7b 73 74 61 63 6b 54 72 61 63 65 20 66  pt {stackTrace f
c840: 61 6c 73 65 7d 20 7b 73 74 72 69 63 74 20 74 72  alse} {strict tr
c850: 75 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23  ue} } {..      #
c860: 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
c870: 45 76 61 6c 75 61 74 65 20 74 68 65 20 73 63 72  Evaluate the scr
c880: 69 70 74 20 70 72 6f 76 69 64 65 64 20 62 79 20  ipt provided by 
c890: 6f 75 72 20 63 61 6c 6c 65 72 20 69 6e 20 74 68  our caller in th
c8a0: 65 69 72 20 63 6f 6e 74 65 78 74 2c 0d 0a 20 20  eir context,..  
c8b0: 20 20 20 20 23 20 20 20 20 20 20 20 63 61 70 74      #       capt
c8c0: 75 72 69 6e 67 20 62 6f 74 68 20 74 68 65 20 72  uring both the r
c8d0: 65 73 75 6c 74 20 61 6e 64 20 74 68 65 20 72 65  esult and the re
c8e0: 74 75 72 6e 20 63 6f 64 65 2e 0d 0a 20 20 20 20  turn code...    
c8f0: 20 20 23 0d 0a 20 20 20 20 20 20 73 65 74 20 63    #..      set c
c900: 6f 64 65 20 5b 63 61 74 63 68 20 7b 75 70 6c 65  ode [catch {uple
c910: 76 65 6c 20 31 20 24 73 63 72 69 70 74 7d 20 72  vel 1 $script} r
c920: 65 73 75 6c 74 5d 0d 0a 0d 0a 20 20 20 20 20 20  esult]....      
c930: 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
c940: 20 44 69 64 20 74 68 65 20 73 63 72 69 70 74 20   Did the script 
c950: 70 72 6f 76 69 64 65 64 20 62 79 20 6f 75 72 20  provided by our 
c960: 63 61 6c 6c 65 72 20 4e 4f 54 20 72 61 69 73 65  caller NOT raise
c970: 20 61 6e 20 65 72 72 6f 72 3f 0d 0a 20 20 20 20   an error?..    
c980: 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 24    #..      if {$
c990: 73 74 72 69 63 74 20 26 26 20 24 63 6f 64 65 20  strict && $code 
c9a0: 3d 3d 20 30 20 7c 7c 20 21 24 73 74 72 69 63 74  == 0 || !$strict
c9b0: 20 26 26 20 24 63 6f 64 65 20 21 3d 20 31 7d 20   && $code != 1} 
c9c0: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
c9d0: 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
c9e0: 45 3a 20 53 75 63 63 65 73 73 2e 20 20 52 65 74  E: Success.  Ret
c9f0: 75 72 6e 20 61 20 6c 69 73 74 20 77 69 74 68 20  urn a list with 
ca00: 74 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20  the return code 
ca10: 61 6e 64 20 74 68 65 20 72 65 73 75 6c 74 2e 0d  and the result..
ca20: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
ca30: 20 20 20 20 72 65 74 75 72 6e 20 5b 6c 69 73 74      return [list
ca40: 20 24 63 6f 64 65 20 24 72 65 73 75 6c 74 5d 0d   $code $result].
ca50: 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 69 66 20  .      } elseif 
ca60: 7b 24 73 74 61 63 6b 54 72 61 63 65 7d 20 74 68  {$stackTrace} th
ca70: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d  en {..        #.
ca80: 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
ca90: 20 46 61 69 6c 75 72 65 2e 20 20 4f 75 72 20 63   Failure.  Our c
caa0: 61 6c 6c 65 72 20 77 61 6e 74 73 20 61 20 66 75  aller wants a fu
cab0: 6c 6c 20 73 74 61 63 6b 20 74 72 61 63 65 20 28  ll stack trace (
cac0: 69 66 20 61 70 70 6c 69 63 61 62 6c 65 29 2c 0d  if applicable),.
cad0: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
cae0: 20 72 65 74 75 72 6e 20 61 20 6c 69 73 74 20 77   return a list w
caf0: 69 74 68 20 74 68 65 20 72 65 74 75 72 6e 20 63  ith the return c
cb00: 6f 64 65 20 61 6e 64 20 74 68 65 20 72 65 73 75  ode and the resu
cb10: 6c 74 20 76 65 72 62 61 74 69 6d 2e 0d 0a 20 20  lt verbatim...  
cb20: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
cb30: 20 72 65 74 75 72 6e 20 5b 6c 69 73 74 20 24 63   return [list $c
cb40: 6f 64 65 20 24 72 65 73 75 6c 74 5d 0d 0a 20 20  ode $result]..  
cb50: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
cb60: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
cb70: 20 23 20 4e 4f 54 45 3a 20 46 61 69 6c 75 72 65   # NOTE: Failure
cb80: 2e 20 20 4f 75 72 20 63 61 6c 6c 65 72 20 64 6f  .  Our caller do
cb90: 65 73 20 6e 6f 74 20 77 61 6e 74 20 61 20 66 75  es not want a fu
cba0: 6c 6c 20 73 74 61 63 6b 20 74 72 61 63 65 20 28  ll stack trace (
cbb0: 69 66 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  if..        #   
cbc0: 20 20 20 20 61 70 70 6c 69 63 61 62 6c 65 29 2c      applicable),
cbd0: 20 72 65 74 75 72 6e 20 61 20 6c 69 73 74 20 77   return a list w
cbe0: 69 74 68 20 74 68 65 20 72 65 74 75 72 6e 20 63  ith the return c
cbf0: 6f 64 65 2c 20 74 68 65 20 65 72 72 6f 72 0d 0a  ode, the error..
cc00: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
cc10: 63 6f 64 65 20 66 6f 72 20 74 68 65 20 69 6e 74  code for the int
cc20: 65 72 70 72 65 74 65 72 2c 20 61 6e 64 20 74 68  erpreter, and th
cc30: 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  e error message 
cc40: 75 70 20 74 6f 20 74 68 65 0d 0a 20 20 20 20 20  up to the..     
cc50: 20 20 20 23 20 20 20 20 20 20 20 70 6f 69 6e 74     #       point
cc60: 20 77 68 65 72 65 20 74 68 65 20 73 74 61 63 6b   where the stack
cc70: 20 74 72 61 63 65 20 73 68 6f 75 6c 64 20 73 74   trace should st
cc80: 61 72 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  art...        #.
cc90: 0a 20 20 20 20 20 20 20 20 73 65 74 20 69 6e 64  .        set ind
cca0: 65 78 20 5b 73 74 72 69 6e 67 20 66 69 72 73 74  ex [string first
ccb0: 20 22 20 20 20 61 74 20 22 20 24 72 65 73 75 6c   "   at " $resul
ccc0: 74 5d 3b 20 23 20 48 41 43 4b 3a 20 52 65 6c 69  t]; # HACK: Reli
ccd0: 61 62 6c 65 3f 0d 0a 0d 0a 20 20 20 20 20 20 20  able?....       
cce0: 20 72 65 74 75 72 6e 20 5b 6c 69 73 74 20 24 63   return [list $c
ccf0: 6f 64 65 20 24 3a 3a 65 72 72 6f 72 43 6f 64 65  ode $::errorCode
cd00: 20 5b 65 78 70 72 20 7b 24 69 6e 64 65 78 20 21   [expr {$index !
cd10: 3d 20 2d 31 20 3f 20 5c 0d 0a 20 20 20 20 20 20  = -1 ? \..      
cd20: 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20 74 72        [string tr
cd30: 69 6d 20 5b 73 74 72 69 6e 67 20 72 61 6e 67 65  im [string range
cd40: 20 24 72 65 73 75 6c 74 20 30 20 24 69 6e 64 65   $result 0 $inde
cd50: 78 5d 5d 20 3a 20 24 72 65 73 75 6c 74 7d 5d 5d  x]] : $result}]]
cd60: 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d  ..      }..    }
cd70: 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 63 6f  .....    proc co
cd80: 6d 70 69 6c 65 43 53 68 61 72 70 57 69 74 68 20  mpileCSharpWith 
cd90: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  {..            t
cda0: 65 78 74 20 6d 65 6d 6f 72 79 20 73 79 6d 62 6f  ext memory symbo
cdb0: 6c 73 20 73 74 72 69 63 74 20 72 65 73 75 6c 74  ls strict result
cdc0: 73 56 61 72 4e 61 6d 65 20 65 72 72 6f 72 73 56  sVarName errorsV
cdd0: 61 72 4e 61 6d 65 20 66 69 6c 65 4e 61 6d 65 73  arName fileNames
cde0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 72  ..            ar
cdf0: 67 73 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d  gs } {..      #.
ce00: 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53  .      # NOTE: S
ce10: 69 6e 63 65 20 77 65 20 61 72 65 20 67 6f 69 6e  ince we are goin
ce20: 67 20 74 6f 20 75 73 65 20 74 68 69 73 20 6d 65  g to use this me
ce30: 74 68 6f 64 20 6e 61 6d 65 20 61 20 6c 6f 74 2c  thod name a lot,
ce40: 20 61 73 73 69 67 6e 20 69 74 20 74 6f 20 61 0d   assign it to a.
ce50: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 76  .      #       v
ce60: 61 72 69 61 62 6c 65 20 66 69 72 73 74 2e 0d 0a  ariable first...
ce70: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 73        #..      s
ce80: 65 74 20 61 64 64 20 52 65 66 65 72 65 6e 63 65  et add Reference
ce90: 64 41 73 73 65 6d 62 6c 69 65 73 2e 41 64 64 0d  dAssemblies.Add.
cea0: 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
ceb0: 20 20 23 20 4e 4f 54 45 3a 20 43 72 65 61 74 65    # NOTE: Create
cec0: 20 74 68 65 20 62 61 73 65 20 63 6f 6d 6d 61 6e   the base comman
ced0: 64 20 74 6f 20 65 76 61 6c 75 61 74 65 20 61 6e  d to evaluate an
cee0: 64 20 61 64 64 20 74 68 65 20 70 72 6f 70 65 72  d add the proper
cef0: 74 79 20 73 65 74 74 69 6e 67 73 0d 0a 20 20 20  ty settings..   
cf00: 20 20 20 23 20 20 20 20 20 20 20 74 68 61 74 20     #       that 
cf10: 61 72 65 20 61 6c 6d 6f 73 74 20 61 6c 77 61 79  are almost alway
cf20: 73 20 6e 65 65 64 65 64 20 62 79 20 6f 75 72 20  s needed by our 
cf30: 75 6e 69 74 20 74 65 73 74 73 20 28 69 2e 65 2e  unit tests (i.e.
cf40: 20 74 68 65 20 53 79 73 74 65 6d 0d 0a 20 20 20   the System..   
cf50: 20 20 20 23 20 20 20 20 20 20 20 61 6e 64 20 53     #       and S
cf60: 79 73 74 65 6d 2e 44 61 74 61 20 61 73 73 65 6d  ystem.Data assem
cf70: 62 6c 79 20 72 65 66 65 72 65 6e 63 65 73 29 2e  bly references).
cf80: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
cf90: 20 73 65 74 20 63 6f 6d 6d 61 6e 64 20 5b 6c 69   set command [li
cfa0: 73 74 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  st \..          
cfb0: 63 6f 6d 70 69 6c 65 43 53 68 61 72 70 20 24 74  compileCSharp $t
cfc0: 65 78 74 20 24 6d 65 6d 6f 72 79 20 24 73 79 6d  ext $memory $sym
cfd0: 62 6f 6c 73 20 24 73 74 72 69 63 74 20 72 65 73  bols $strict res
cfe0: 75 6c 74 73 20 65 72 72 6f 72 73 20 5c 0d 0a 20  ults errors \.. 
cff0: 20 20 20 20 20 20 20 20 20 24 61 64 64 20 53 79           $add Sy
d000: 73 74 65 6d 2e 64 6c 6c 20 24 61 64 64 20 53 79  stem.dll $add Sy
d010: 73 74 65 6d 2e 44 61 74 61 2e 64 6c 6c 20 24 61  stem.Data.dll $a
d020: 64 64 20 53 79 73 74 65 6d 2e 54 72 61 6e 73 61  dd System.Transa
d030: 63 74 69 6f 6e 73 2e 64 6c 6c 20 5c 0d 0a 20 20  ctions.dll \..  
d040: 20 20 20 20 20 20 20 20 24 61 64 64 20 53 79 73          $add Sys
d050: 74 65 6d 2e 58 6d 6c 2e 64 6c 6c 5d 0d 0a 0d 0a  tem.Xml.dll]....
d060: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
d070: 20 4e 4f 54 45 3a 20 41 64 64 20 61 6c 6c 20 74   NOTE: Add all t
d080: 68 65 20 70 72 6f 76 69 64 65 64 20 66 69 6c 65  he provided file
d090: 20 6e 61 6d 65 73 20 61 73 20 61 73 73 65 6d 62   names as assemb
d0a0: 6c 79 20 72 65 66 65 72 65 6e 63 65 73 2e 0d 0a  ly references...
d0b0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 66        #..      f
d0c0: 6f 72 65 61 63 68 20 66 69 6c 65 4e 61 6d 65 20  oreach fileName 
d0d0: 24 66 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20  $fileNames {..  
d0e0: 20 20 20 20 20 20 6c 61 70 70 65 6e 64 20 63 6f        lappend co
d0f0: 6d 6d 61 6e 64 20 24 61 64 64 20 5b 67 65 74 42  mmand $add [getB
d100: 69 6e 61 72 79 46 69 6c 65 4e 61 6d 65 20 24 66  inaryFileName $f
d110: 69 6c 65 4e 61 6d 65 5d 0d 0a 20 20 20 20 20 20  ileName]..      
d120: 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  }....      #..  
d130: 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 64 64 20      # NOTE: Add 
d140: 74 68 65 20 65 78 74 72 61 20 61 72 67 75 6d 65  the extra argume
d150: 6e 74 73 2c 20 69 66 20 61 6e 79 2c 20 74 6f 20  nts, if any, to 
d160: 74 68 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65  the command to e
d170: 76 61 6c 75 61 74 65 2e 0d 0a 20 20 20 20 20 20  valuate...      
d180: 23 0d 0a 20 20 20 20 20 20 65 76 61 6c 20 6c 61  #..      eval la
d190: 70 70 65 6e 64 20 63 6f 6d 6d 61 6e 64 20 24 61  ppend command $a
d1a0: 72 67 73 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a  rgs....      #..
d1b0: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 6c        # NOTE: Al
d1c0: 69 61 73 20 74 68 65 20 63 6f 6d 70 69 6c 65 72  ias the compiler
d1d0: 20 6c 6f 63 61 6c 20 72 65 73 75 6c 74 73 20 61   local results a
d1e0: 6e 64 20 65 72 72 6f 72 73 20 76 61 72 69 61 62  nd errors variab
d1f0: 6c 65 73 20 74 6f 20 74 68 65 0d 0a 20 20 20 20  les to the..    
d200: 20 20 23 20 20 20 20 20 20 20 76 61 72 69 61 62    #       variab
d210: 6c 65 20 6e 61 6d 65 73 20 70 72 6f 76 69 64 65  le names provide
d220: 64 20 62 79 20 6f 75 72 20 63 61 6c 6c 65 72 2e  d by our caller.
d230: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
d240: 20 75 70 76 61 72 20 31 20 24 72 65 73 75 6c 74   upvar 1 $result
d250: 73 56 61 72 4e 61 6d 65 20 72 65 73 75 6c 74 73  sVarName results
d260: 0d 0a 20 20 20 20 20 20 75 70 76 61 72 20 31 20  ..      upvar 1 
d270: 24 65 72 72 6f 72 73 56 61 72 4e 61 6d 65 20 65  $errorsVarName e
d280: 72 72 6f 72 73 0d 0a 0d 0a 20 20 20 20 20 20 23  rrors....      #
d290: 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
d2a0: 45 76 61 6c 75 61 74 65 20 74 68 65 20 63 6f 6e  Evaluate the con
d2b0: 73 74 72 75 63 74 65 64 20 5b 63 6f 6d 70 69 6c  structed [compil
d2c0: 65 43 53 68 61 72 70 5d 20 63 6f 6d 6d 61 6e 64  eCSharp] command
d2d0: 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65 0d   and return the.
d2e0: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 72  .      #       r
d2f0: 65 73 75 6c 74 2e 0d 0a 20 20 20 20 20 20 23 0d  esult...      #.
d300: 0a 20 20 20 20 20 20 65 76 61 6c 20 24 63 6f 6d  .      eval $com
d310: 6d 61 6e 64 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a  mand..    }.....
d320: 20 20 20 20 70 72 6f 63 20 69 73 4d 65 6d 6f 72      proc isMemor
d330: 79 44 62 20 7b 20 66 69 6c 65 4e 61 6d 65 20 7d  yDb { fileName }
d340: 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20   {..      #..   
d350: 20 20 20 23 20 4e 4f 54 45 3a 20 49 73 20 74 68     # NOTE: Is th
d360: 65 20 73 70 65 63 69 66 69 65 64 20 64 61 74 61  e specified data
d370: 62 61 73 65 20 66 69 6c 65 20 6e 61 6d 65 20 72  base file name r
d380: 65 61 6c 6c 79 20 61 6e 20 69 6e 2d 6d 65 6d 6f  eally an in-memo
d390: 72 79 20 64 61 74 61 62 61 73 65 3f 0d 0a 20 20  ry database?..  
d3a0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 72 65 74      #..      ret
d3b0: 75 72 6e 20 5b 65 78 70 72 20 7b 24 66 69 6c 65  urn [expr {$file
d3c0: 4e 61 6d 65 20 65 71 20 22 3a 6d 65 6d 6f 72 79  Name eq ":memory
d3d0: 3a 22 20 7c 7c 20 5c 0d 0a 20 20 20 20 20 20 20  :" || \..       
d3e0: 20 20 20 5b 73 74 72 69 6e 67 20 72 61 6e 67 65     [string range
d3f0: 20 24 66 69 6c 65 4e 61 6d 65 20 30 20 31 32 5d   $fileName 0 12]
d400: 20 65 71 20 22 66 69 6c 65 3a 3a 6d 65 6d 6f 72   eq "file::memor
d410: 79 3a 22 7d 5d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d  y:"}]..    }....
d420: 0a 20 20 20 20 70 72 6f 63 20 69 73 54 61 62 6c  .    proc isTabl
d430: 65 49 6e 44 62 20 7b 20 6e 61 6d 65 20 7b 76 61  eInDb { name {va
d440: 72 4e 61 6d 65 20 64 62 7d 20 7d 20 7b 0d 0a 20  rName db} } {.. 
d450: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
d460: 4e 4f 54 45 3a 20 52 65 66 65 72 20 74 6f 20 74  NOTE: Refer to t
d470: 68 65 20 73 70 65 63 69 66 69 65 64 20 76 61 72  he specified var
d480: 69 61 62 6c 65 20 28 65 2e 67 2e 20 22 64 62 22  iable (e.g. "db"
d490: 29 20 69 6e 20 74 68 65 20 63 6f 6e 74 65 78 74  ) in the context
d4a0: 20 6f 66 20 6f 75 72 0d 0a 20 20 20 20 20 20 23   of our..      #
d4b0: 20 20 20 20 20 20 20 63 61 6c 6c 65 72 2e 20 20         caller.  
d4c0: 49 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  It contains the 
d4d0: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
d4e0: 69 6f 6e 20 68 61 6e 64 6c 65 20 74 68 61 74 20  ion handle that 
d4f0: 77 69 6c 6c 20 62 65 0d 0a 20 20 20 20 20 20 23  will be..      #
d500: 20 20 20 20 20 20 20 75 73 65 64 20 74 6f 20 65         used to e
d510: 78 65 63 75 74 65 20 74 68 65 20 71 75 65 72 79  xecute the query
d520: 20 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69   used to determi
d530: 6e 65 20 69 66 20 74 68 65 20 6e 61 6d 65 64 20  ne if the named 
d540: 74 61 62 6c 65 20 69 73 0d 0a 20 20 20 20 20 20  table is..      
d550: 23 20 20 20 20 20 20 20 70 72 65 73 65 6e 74 20  #       present 
d560: 69 6e 20 74 68 61 74 20 64 61 74 61 62 61 73 65  in that database
d570: 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
d580: 20 20 75 70 76 61 72 20 31 20 24 76 61 72 4e 61    upvar 1 $varNa
d590: 6d 65 20 64 62 0d 0a 0d 0a 20 20 20 20 20 20 23  me db....      #
d5a0: 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
d5b0: 55 73 65 20 74 68 65 20 73 71 6c 69 74 65 5f 6d  Use the sqlite_m
d5c0: 61 73 74 65 72 20 74 61 62 6c 65 20 74 6f 20 64  aster table to d
d5d0: 65 74 65 72 6d 69 6e 65 20 69 66 20 74 68 65 20  etermine if the 
d5e0: 6e 61 6d 65 64 20 74 61 62 6c 65 20 69 73 0d 0a  named table is..
d5f0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 70 72        #       pr
d600: 65 73 65 6e 74 20 69 6e 20 74 68 65 20 64 61 74  esent in the dat
d610: 61 62 61 73 65 2e 0d 0a 20 20 20 20 20 20 23 0d  abase...      #.
d620: 0a 20 20 20 20 20 20 73 65 74 20 73 71 6c 20 7b  .      set sql {
d630: 0d 0a 20 20 20 20 20 20 20 20 53 45 4c 45 43 54  ..        SELECT
d640: 20 43 4f 55 4e 54 28 2a 29 20 46 52 4f 4d 20 73   COUNT(*) FROM s
d650: 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 57 48 45  qlite_master WHE
d660: 52 45 20 74 79 70 65 20 3d 20 27 74 61 62 6c 65  RE type = 'table
d670: 27 20 41 4e 44 20 6e 61 6d 65 20 3d 20 3f 3b 0d  ' AND name = ?;.
d680: 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
d690: 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
d6a0: 45 3a 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65  E: Return non-ze
d6b0: 72 6f 20 69 66 20 74 68 65 20 6e 61 6d 65 64 20  ro if the named 
d6c0: 74 61 62 6c 65 20 69 73 20 70 72 65 73 65 6e 74  table is present
d6d0: 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
d6e0: 20 20 72 65 74 75 72 6e 20 5b 65 78 70 72 20 7b    return [expr {
d6f0: 0d 0a 20 20 20 20 20 20 20 20 5b 73 71 6c 20 65  ..        [sql e
d700: 78 65 63 75 74 65 20 2d 65 78 65 63 75 74 65 20  xecute -execute 
d710: 73 63 61 6c 61 72 20 24 64 62 20 24 73 71 6c 20  scalar $db $sql 
d720: 5b 6c 69 73 74 20 70 61 72 61 6d 31 20 53 74 72  [list param1 Str
d730: 69 6e 67 20 24 6e 61 6d 65 5d 5d 20 3e 20 30 0d  ing $name]] > 0.
d740: 0a 20 20 20 20 20 20 7d 5d 0d 0a 20 20 20 20 7d  .      }]..    }
d750: 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 74 72  .....    proc tr
d760: 69 6d 53 71 6c 20 7b 20 73 71 6c 20 7d 20 7b 0d  imSql { sql } {.
d770: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b 72  .      return [r
d780: 65 67 73 75 62 20 2d 61 6c 6c 20 2d 2d 20 7b 5c  egsub -all -- {\
d790: 73 2b 7d 20 5b 73 74 72 69 6e 67 20 74 72 69 6d  s+} [string trim
d7a0: 20 24 73 71 6c 5d 20 22 20 22 5d 0d 0a 20 20 20   $sql] " "]..   
d7b0: 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
d7c0: 65 78 65 63 75 74 65 53 71 6c 20 7b 20 73 71 6c  executeSql { sql
d7d0: 20 7b 65 78 65 63 75 74 65 20 6e 6f 6e 65 7d 20   {execute none} 
d7e0: 7b 66 6f 72 6d 61 74 20 6e 6f 6e 65 7d 20 7b 66  {format none} {f
d7f0: 69 6c 65 4e 61 6d 65 20 22 22 7d 20 7d 20 7b 0d  ileName ""} } {.
d800: 0a 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69  .      if {[stri
d810: 6e 67 20 6c 65 6e 67 74 68 20 24 66 69 6c 65 4e  ng length $fileN
d820: 61 6d 65 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20  ame] == 0} then 
d830: 7b 73 65 74 20 66 69 6c 65 4e 61 6d 65 20 3a 6d  {set fileName :m
d840: 65 6d 6f 72 79 3a 7d 0d 0a 20 20 20 20 20 20 73  emory:}..      s
d850: 65 74 75 70 44 62 20 24 66 69 6c 65 4e 61 6d 65  etupDb $fileName
d860: 20 22 22 20 22 22 20 22 22 20 22 22 20 22 22 20   "" "" "" "" "" 
d870: 66 61 6c 73 65 20 66 61 6c 73 65 20 66 61 6c 73  false false fals
d880: 65 20 66 61 6c 73 65 20 64 62 20 74 72 75 65 0d  e false db true.
d890: 0a 0d 0a 20 20 20 20 20 20 74 72 79 20 7b 0d 0a  ...      try {..
d8a0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b          return [
d8b0: 75 70 6c 65 76 65 6c 20 31 20 5b 6c 69 73 74 20  uplevel 1 [list 
d8c0: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  \..            s
d8d0: 71 6c 20 65 78 65 63 75 74 65 20 2d 65 78 65 63  ql execute -exec
d8e0: 75 74 65 20 24 65 78 65 63 75 74 65 20 2d 66 6f  ute $execute -fo
d8f0: 72 6d 61 74 20 24 66 6f 72 6d 61 74 20 24 64 62  rmat $format $db
d900: 20 24 73 71 6c 5d 5d 0d 0a 20 20 20 20 20 20 7d   $sql]]..      }
d910: 20 66 69 6e 61 6c 6c 79 20 7b 0d 0a 20 20 20 20   finally {..    
d920: 20 20 20 20 63 6c 65 61 6e 75 70 44 62 20 24 66      cleanupDb $f
d930: 69 6c 65 4e 61 6d 65 20 64 62 20 66 61 6c 73 65  ileName db false
d940: 20 66 61 6c 73 65 20 66 61 6c 73 65 0d 0a 20 20   false false..  
d950: 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d      }..    }....
d960: 0a 20 20 20 20 70 72 6f 63 20 67 65 74 43 6f 6e  .    proc getCon
d970: 6e 65 63 74 69 6f 6e 46 6c 61 67 73 20 7b 20 66  nectionFlags { f
d980: 69 6c 65 4e 61 6d 65 20 66 6c 61 67 73 20 7b 71  ileName flags {q
d990: 75 69 65 74 20 66 61 6c 73 65 7d 20 7d 20 7b 0d  uiet false} } {.
d9a0: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
d9b0: 23 20 4e 4f 54 45 3a 20 46 69 67 75 72 65 20 6f  # NOTE: Figure o
d9c0: 75 74 20 77 68 69 63 68 20 64 61 74 61 62 61 73  ut which databas
d9d0: 65 20 66 69 6c 65 20 6e 61 6d 65 20 6f 72 20 63  e file name or c
d9e0: 6f 6e 6e 65 63 74 69 6f 6e 20 73 74 72 69 6e 67  onnection string
d9f0: 20 74 68 65 73 65 0d 0a 20 20 20 20 20 20 23 20   these..      # 
da00: 20 20 20 20 20 20 63 6f 6e 6e 65 63 74 69 6f 6e        connection
da10: 20 66 6c 61 67 73 20 77 69 6c 6c 20 61 63 74 75   flags will actu
da20: 61 6c 6c 79 20 61 70 70 6c 79 20 74 6f 2e 20 20  ally apply to.  
da30: 54 68 69 73 20 69 73 20 6e 6f 74 20 6e 65 63 65  This is not nece
da40: 73 73 61 72 79 0d 0a 20 20 20 20 20 20 23 20 20  ssary..      #  
da50: 20 20 20 20 20 69 6e 20 71 75 69 65 74 20 6d 6f       in quiet mo
da60: 64 65 20 62 65 63 61 75 73 65 20 74 68 69 73 20  de because this 
da70: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 6f  information is o
da80: 6e 6c 79 20 75 73 65 64 20 66 6f 72 20 6c 6f 67  nly used for log
da90: 67 69 6e 67 0d 0a 20 20 20 20 20 20 23 20 20 20  ging..      #   
daa0: 20 20 20 20 61 6e 64 20 72 65 70 6f 72 74 69 6e      and reportin
dab0: 67 20 70 75 72 70 6f 73 65 73 2e 0d 0a 20 20 20  g purposes...   
dac0: 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
dad0: 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d  !$quiet} then {.
dae0: 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73 74  .        if {[st
daf0: 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 66 69 6c  ring length $fil
db00: 65 4e 61 6d 65 5d 20 3e 20 30 7d 20 74 68 65 6e  eName] > 0} then
db10: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65   {..          se
db20: 74 20 64 61 74 61 62 61 73 65 20 5b 61 70 70 65  t database [appe
db30: 6e 64 41 72 67 73 20 22 66 69 6c 65 20 6e 61 6d  ndArgs "file nam
db40: 65 20 5c 22 22 20 24 66 69 6c 65 4e 61 6d 65 20  e \"" $fileName 
db50: 5c 22 5d 0d 0a 20 20 20 20 20 20 20 20 7d 20 65  \"]..        } e
db60: 6c 73 65 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69  lseif {[info exi
db70: 73 74 73 20 3a 3a 64 61 74 61 53 6f 75 72 63 65  sts ::dataSource
db80: 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20  ] && \..        
db90: 20 20 20 20 21 5b 61 72 72 61 79 20 65 78 69 73      ![array exis
dba0: 74 73 20 3a 3a 64 61 74 61 53 6f 75 72 63 65 5d  ts ::dataSource]
dbb0: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
dbc0: 20 20 20 20 73 65 74 20 64 61 74 61 62 61 73 65      set database
dbd0: 20 5b 61 70 70 65 6e 64 41 72 67 73 20 22 64 61   [appendArgs "da
dbe0: 74 61 20 73 6f 75 72 63 65 20 5c 22 22 20 24 3a  ta source \"" $:
dbf0: 3a 64 61 74 61 53 6f 75 72 63 65 20 5c 22 5d 0d  :dataSource \"].
dc00: 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20  .        } else 
dc10: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74  {..          set
dc20: 20 64 61 74 61 62 61 73 65 20 3c 75 6e 6b 6e 6f   database <unkno
dc30: 77 6e 3e 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  wn>..        }..
dc40: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
dc50: 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
dc60: 3a 20 53 68 6f 77 20 28 61 6e 64 20 6c 6f 67 29  : Show (and log)
dc70: 20 74 68 65 20 6c 6f 63 61 6c 20 63 6f 6e 6e 65   the local conne
dc80: 63 74 69 6f 6e 20 66 6c 61 67 73 20 61 6e 64 20  ction flags and 
dc90: 74 68 65 20 61 73 73 6f 63 69 61 74 65 64 0d 0a  the associated..
dca0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 64 61        #       da
dcb0: 74 61 20 73 6f 75 72 63 65 20 6f 72 20 66 69 6c  ta source or fil
dcc0: 65 20 6e 61 6d 65 2e 0d 0a 20 20 20 20 20 20 23  e name...      #
dcd0: 0d 0a 20 20 20 20 20 20 69 66 20 7b 21 24 71 75  ..      if {!$qu
dce0: 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  iet} then {..   
dcf0: 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
dd00: 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
dd10: 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
dd20: 20 20 20 20 20 20 22 2d 2d 2d 2d 20 6c 6f 63 61        "---- loca
dd30: 6c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 6c 61  l connection fla
dd40: 67 73 20 66 6f 72 20 22 20 24 64 61 74 61 62 61  gs for " $databa
dd50: 73 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  se \..          
dd60: 20 20 22 20 61 72 65 3a 20 22 20 5b 65 78 70 72    " are: " [expr
dd70: 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68   {[string length
dd80: 20 24 66 6c 61 67 73 5d 20 3e 20 30 20 3f 20 5c   $flags] > 0 ? \
dd90: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 61  ..            [a
dda0: 70 70 65 6e 64 41 72 67 73 20 5c 22 20 24 66 6c  ppendArgs \" $fl
ddb0: 61 67 73 20 5c 22 5d 20 3a 20 22 3c 6e 6f 6e 65  ags \"] : "<none
ddc0: 3e 22 7d 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20 20  >"}] \n]..      
ddd0: 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  }....      #..  
dde0: 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 68 6f 77      # NOTE: Show
ddf0: 20 28 61 6e 64 20 6c 6f 67 29 20 74 68 65 20 73   (and log) the s
de00: 68 61 72 65 64 20 63 6f 6e 6e 65 63 74 69 6f 6e  hared connection
de10: 20 66 6c 61 67 73 2e 0d 0a 20 20 20 20 20 20 23   flags...      #
de20: 0d 0a 20 20 20 20 20 20 69 66 20 7b 21 24 71 75  ..      if {!$qu
de30: 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  iet} then {..   
de40: 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20       if {[catch 
de50: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 6f 62 6a  {..          obj
de60: 65 63 74 20 69 6e 76 6f 6b 65 20 53 79 73 74 65  ect invoke Syste
de70: 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 53 51  m.Data.SQLite.SQ
de80: 4c 69 74 65 43 6f 6e 6e 65 63 74 69 6f 6e 20 53  LiteConnection S
de90: 68 61 72 65 64 46 6c 61 67 73 0d 0a 20 20 20 20  haredFlags..    
dea0: 20 20 20 20 7d 20 73 68 61 72 65 64 46 6c 61 67      } sharedFlag
deb0: 73 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d  s] == 0} then {.
dec0: 0a 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73  .          tputs
ded0: 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
dee0: 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
def0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d                "-
df00: 2d 2d 2d 20 73 68 61 72 65 64 20 63 6f 6e 6e 65  --- shared conne
df10: 63 74 69 6f 6e 20 66 6c 61 67 73 20 66 6f 72 20  ction flags for 
df20: 22 20 24 64 61 74 61 62 61 73 65 20 5c 0d 0a 20  " $database \.. 
df30: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20 61               " a
df40: 72 65 3a 20 22 20 5b 65 78 70 72 20 7b 5b 73 74  re: " [expr {[st
df50: 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 73 68 61  ring length $sha
df60: 72 65 64 46 6c 61 67 73 5d 20 3e 20 30 20 26 26  redFlags] > 0 &&
df70: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
df80: 20 20 24 73 68 61 72 65 64 46 6c 61 67 73 20 6e    $sharedFlags n
df90: 65 20 22 4e 6f 6e 65 22 20 3f 20 5c 0d 0a 20 20  e "None" ? \..  
dfa0: 20 20 20 20 20 20 20 20 20 20 20 20 5b 61 70 70              [app
dfb0: 65 6e 64 41 72 67 73 20 5c 22 20 24 73 68 61 72  endArgs \" $shar
dfc0: 65 64 46 6c 61 67 73 20 5c 22 5d 20 3a 20 22 3c  edFlags \"] : "<
dfd0: 6e 6f 6e 65 3e 22 7d 5d 20 5c 6e 5d 0d 0a 20 20  none>"}] \n]..  
dfe0: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
dff0: 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
e000: 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
e010: 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
e020: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d               "--
e030: 2d 2d 20 73 68 61 72 65 64 20 63 6f 6e 6e 65 63  -- shared connec
e040: 74 69 6f 6e 20 66 6c 61 67 73 20 66 6f 72 20 22  tion flags for "
e050: 20 24 64 61 74 61 62 61 73 65 20 5c 0d 0a 20 20   $database \..  
e060: 20 20 20 20 20 20 20 20 20 20 20 20 22 20 61 72              " ar
e070: 65 3a 20 3c 75 6e 61 76 61 69 6c 61 62 6c 65 3e  e: <unavailable>
e080: 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d  \n"]..        }.
e090: 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
e0a0: 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
e0b0: 45 3a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  E: If there are 
e0c0: 61 6e 79 20 67 6c 6f 62 61 6c 20 28 70 65 72 20  any global (per 
e0d0: 74 65 73 74 20 72 75 6e 29 20 63 6f 6e 6e 65 63  test run) connec
e0e0: 74 69 6f 6e 20 66 6c 61 67 73 20 63 75 72 72 65  tion flags curre
e0f0: 6e 74 6c 79 0d 0a 20 20 20 20 20 20 23 20 20 20  ntly..      #   
e100: 20 20 20 20 73 65 74 2c 20 75 73 65 20 74 68 65      set, use the
e110: 6d 20 6e 6f 77 20 28 69 2e 65 2e 20 62 79 20 63  m now (i.e. by c
e120: 6f 6d 62 69 6e 69 6e 67 20 74 68 65 6d 20 77 69  ombining them wi
e130: 74 68 20 74 68 65 20 6f 6e 65 73 20 66 6f 72 20  th the ones for 
e140: 74 68 69 73 0d 0a 20 20 20 20 20 20 23 20 20 20  this..      #   
e150: 20 20 20 20 63 6f 6e 6e 65 63 74 69 6f 6e 29 2e      connection).
e160: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
e170: 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74   if {[info exist
e180: 73 20 3a 3a 63 6f 6e 6e 65 63 74 69 6f 6e 5f 66  s ::connection_f
e190: 6c 61 67 73 5d 20 26 26 20 5c 0d 0a 20 20 20 20  lags] && \..    
e1a0: 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65        [string le
e1b0: 6e 67 74 68 20 24 3a 3a 63 6f 6e 6e 65 63 74 69  ngth $::connecti
e1c0: 6f 6e 5f 66 6c 61 67 73 5d 20 3e 20 30 7d 20 74  on_flags] > 0} t
e1d0: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  hen {..        #
e1e0: 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
e1f0: 3a 20 53 68 6f 77 20 28 61 6e 64 20 6c 6f 67 29  : Show (and log)
e200: 20 74 68 65 20 64 65 74 65 63 74 65 64 20 67 6c   the detected gl
e210: 6f 62 61 6c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  obal connection 
e220: 66 6c 61 67 73 2e 0d 0a 20 20 20 20 20 20 20 20  flags...        
e230: 23 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21  #..        if {!
e240: 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a  $quiet} then {..
e250: 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
e260: 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
e270: 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
e280: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d               "--
e290: 2d 2d 20 67 6c 6f 62 61 6c 20 63 6f 6e 6e 65 63  -- global connec
e2a0: 74 69 6f 6e 20 66 6c 61 67 73 20 64 65 74 65 63  tion flags detec
e2b0: 74 65 64 3a 20 22 20 5c 0d 0a 20 20 20 20 20 20  ted: " \..      
e2c0: 20 20 20 20 20 20 20 20 5b 65 78 70 72 20 7b 5b          [expr {[
e2d0: 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 63 6f  info exists ::co
e2e0: 6e 6e 65 63 74 69 6f 6e 5f 66 6c 61 67 73 5d 20  nnection_flags] 
e2f0: 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  && \..          
e300: 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67      [string leng
e310: 74 68 20 24 3a 3a 63 6f 6e 6e 65 63 74 69 6f 6e  th $::connection
e320: 5f 66 6c 61 67 73 5d 20 3e 20 30 20 3f 20 5c 0d  _flags] > 0 ? \.
e330: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b  .              [
e340: 61 70 70 65 6e 64 41 72 67 73 20 5c 22 20 24 3a  appendArgs \" $:
e350: 3a 63 6f 6e 6e 65 63 74 69 6f 6e 5f 66 6c 61 67  :connection_flag
e360: 73 20 5c 22 5d 20 3a 20 22 3c 6e 6f 6e 65 3e 22  s \"] : "<none>"
e370: 7d 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20  }] \n]..        
e380: 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  }....        #..
e390: 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
e3a0: 43 6f 6d 62 69 6e 65 20 61 6e 64 2f 6f 72 20 72  Combine and/or r
e3b0: 65 70 6c 61 63 65 20 74 68 65 20 63 6f 6e 6e 65  eplace the conne
e3c0: 63 74 69 6f 6e 20 66 6c 61 67 73 20 61 6e 64 20  ction flags and 
e3d0: 74 68 65 6e 20 73 68 6f 77 20 74 68 65 0d 0a 20  then show the.. 
e3e0: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 6e         #       n
e3f0: 65 77 20 76 61 6c 75 65 2e 0d 0a 20 20 20 20 20  ew value...     
e400: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 73 65     #..        se
e410: 74 20 66 6c 61 67 73 20 5b 63 6f 6d 62 69 6e 65  t flags [combine
e420: 46 6c 61 67 73 20 24 66 6c 61 67 73 20 24 3a 3a  Flags $flags $::
e430: 63 6f 6e 6e 65 63 74 69 6f 6e 5f 66 6c 61 67 73  connection_flags
e440: 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  ]....        #..
e450: 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
e460: 53 68 6f 77 20 28 61 6e 64 20 6c 6f 67 29 20 74  Show (and log) t
e470: 68 65 20 6e 65 77 20 65 66 66 65 63 74 69 76 65  he new effective
e480: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 6c 61 67   connection flag
e490: 73 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  s...        #.. 
e4a0: 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69         if {!$qui
e4b0: 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  et} then {..    
e4c0: 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
e4d0: 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70  est_channel [app
e4e0: 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
e4f0: 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63           "---- c
e500: 6f 6d 62 69 6e 65 64 20 63 6f 6e 6e 65 63 74 69  ombined connecti
e510: 6f 6e 20 66 6c 61 67 73 20 66 6f 72 20 22 20 24  on flags for " $
e520: 64 61 74 61 62 61 73 65 20 5c 0d 0a 20 20 20 20  database \..    
e530: 20 20 20 20 20 20 20 20 20 20 22 20 61 72 65 3a            " are:
e540: 20 22 20 5b 65 78 70 72 20 7b 5b 73 74 72 69 6e   " [expr {[strin
e550: 67 20 6c 65 6e 67 74 68 20 24 66 6c 61 67 73 5d  g length $flags]
e560: 20 3e 20 30 20 3f 20 5c 0d 0a 20 20 20 20 20 20   > 0 ? \..      
e570: 20 20 20 20 20 20 20 20 5b 61 70 70 65 6e 64 41          [appendA
e580: 72 67 73 20 5c 22 20 24 66 6c 61 67 73 20 5c 22  rgs \" $flags \"
e590: 5d 20 3a 20 22 3c 6e 6f 6e 65 3e 22 7d 5d 20 5c  ] : "<none>"}] \
e5a0: 6e 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20  n]..        }.. 
e5b0: 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
e5c0: 72 65 74 75 72 6e 20 24 66 6c 61 67 73 0d 0a 20  return $flags.. 
e5d0: 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
e5e0: 63 20 67 65 74 46 6c 61 67 73 50 72 6f 70 65 72  c getFlagsProper
e5f0: 74 79 20 7b 20 7b 66 6c 61 67 73 20 22 22 7d 20  ty { {flags ""} 
e600: 7b 71 75 69 65 74 20 66 61 6c 73 65 7d 20 7d 20  {quiet false} } 
e610: 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  {..      #..    
e620: 20 20 23 20 4e 4f 54 45 3a 20 44 65 74 65 72 6d    # NOTE: Determ
e630: 69 6e 65 20 77 68 61 74 20 74 68 65 20 63 6f 6d  ine what the com
e640: 62 69 6e 65 64 20 28 67 6c 6f 62 61 6c 20 61 6e  bined (global an
e650: 64 20 6c 6f 63 61 6c 29 20 63 6f 6e 6e 65 63 74  d local) connect
e660: 69 6f 6e 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ion..      #    
e670: 20 20 20 66 6c 61 67 73 20 73 68 6f 75 6c 64 20     flags should 
e680: 62 65 2c 20 70 6f 73 73 69 62 6c 79 20 71 75 69  be, possibly qui
e690: 65 74 6c 79 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  etly...      #..
e6a0: 20 20 20 20 20 20 73 65 74 20 66 6c 61 67 73 20        set flags 
e6b0: 5b 67 65 74 43 6f 6e 6e 65 63 74 69 6f 6e 46 6c  [getConnectionFl
e6c0: 61 67 73 20 22 22 20 24 66 6c 61 67 73 20 24 71  ags "" $flags $q
e6d0: 75 69 65 74 5d 0d 0a 0d 0a 20 20 20 20 20 20 23  uiet]....      #
e6e0: 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
e6f0: 49 66 20 6e 6f 20 67 6c 6f 62 61 6c 20 6f 72 20  If no global or 
e700: 6c 6f 63 61 6c 20 63 6f 6e 6e 65 63 74 69 6f 6e  local connection
e710: 20 66 6c 61 67 73 20 77 65 72 65 20 73 70 65 63   flags were spec
e720: 69 66 69 65 64 2c 20 74 68 65 0d 0a 20 20 20 20  ified, the..    
e730: 20 20 23 20 20 20 20 20 20 20 64 65 66 61 75 6c    #       defaul
e740: 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 6c 61  t connection fla
e750: 67 73 20 73 68 6f 75 6c 64 20 62 65 20 75 73 65  gs should be use
e760: 64 3b 20 74 68 65 72 65 66 6f 72 65 2c 20 72 65  d; therefore, re
e770: 74 75 72 6e 0d 0a 20 20 20 20 20 20 23 20 20 20  turn..      #   
e780: 20 20 20 20 61 6e 20 65 6d 70 74 79 20 73 74 72      an empty str
e790: 69 6e 67 20 69 6e 20 74 68 61 74 20 63 61 73 65  ing in that case
e7a0: 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
e7b0: 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65    if {[string le
e7c0: 6e 67 74 68 20 24 66 6c 61 67 73 5d 20 3d 3d 20  ngth $flags] == 
e7d0: 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
e7e0: 20 20 20 72 65 74 75 72 6e 20 22 22 0d 0a 20 20     return ""..  
e7f0: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23      }....      #
e800: 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
e810: 49 6e 20 6f 72 64 65 72 20 74 6f 20 63 68 65 63  In order to chec
e820: 6b 20 69 66 20 74 68 65 20 64 65 66 61 75 6c 74  k if the default
e830: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 6c 61 67   connection flag
e840: 73 20 61 72 65 20 62 65 69 6e 67 20 75 73 65 64  s are being used
e850: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
e860: 69 74 20 69 73 20 6e 65 63 65 73 73 61 72 79 20  it is necessary 
e870: 74 6f 20 61 74 74 65 6d 70 74 20 61 20 63 6f 6e  to attempt a con
e880: 76 65 72 73 69 6f 6e 20 74 6f 20 74 68 65 20 61  version to the a
e890: 63 74 75 61 6c 20 65 6e 75 6d 65 72 61 74 65 64  ctual enumerated
e8a0: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
e8b0: 74 79 70 65 2e 20 20 46 61 69 6c 69 6e 67 20 74  type.  Failing t
e8c0: 68 61 74 2c 20 74 68 65 20 63 68 65 63 6b 20 61  hat, the check a
e8d0: 67 61 69 6e 73 74 20 74 68 65 20 64 65 66 61 75  gainst the defau
e8e0: 6c 74 20 76 61 6c 75 65 20 77 69 6c 6c 20 62 65  lt value will be
e8f0: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
e900: 73 6b 69 70 70 65 64 2e 0d 0a 20 20 20 20 20 20  skipped...      
e910: 23 0d 0a 20 20 20 20 20 20 73 65 74 20 65 72 72  #..      set err
e920: 6f 72 20 6e 75 6c 6c 3b 20 23 20 49 47 4e 4f 52  or null; # IGNOR
e930: 45 44 0d 0a 20 20 20 20 20 20 73 65 74 20 76 61  ED..      set va
e940: 6c 75 65 20 5b 6f 62 6a 65 63 74 20 69 6e 76 6f  lue [object invo
e950: 6b 65 20 55 74 69 6c 69 74 79 20 54 72 79 50 61  ke Utility TryPa
e960: 72 73 65 46 6c 61 67 73 45 6e 75 6d 20 22 22 20  rseFlagsEnum "" 
e970: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 53 79 73  \..          Sys
e980: 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e  tem.Data.SQLite.
e990: 53 51 4c 69 74 65 43 6f 6e 6e 65 63 74 69 6f 6e  SQLiteConnection
e9a0: 46 6c 61 67 73 20 22 22 20 24 66 6c 61 67 73 20  Flags "" $flags 
e9b0: 6e 75 6c 6c 20 74 72 75 65 20 5c 0d 0a 20 20 20  null true \..   
e9c0: 20 20 20 20 20 20 20 65 72 72 6f 72 5d 0d 0a 0d         error]...
e9d0: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
e9e0: 23 20 4e 4f 54 45 3a 20 49 66 20 74 68 65 20 63  # NOTE: If the c
e9f0: 6f 6d 62 69 6e 65 64 20 66 6c 61 67 73 20 73 74  ombined flags st
ea00: 72 69 6e 67 20 63 6f 75 6c 64 20 6e 6f 74 20 61  ring could not a
ea10: 63 74 75 61 6c 6c 79 20 62 65 20 63 6f 6e 76 65  ctually be conve
ea20: 72 74 65 64 0d 0a 20 20 20 20 20 20 23 20 20 20  rted..      #   
ea30: 20 20 20 20 74 6f 20 74 68 65 20 65 6e 75 6d 65      to the enume
ea40: 72 61 74 65 64 20 74 79 70 65 20 69 74 20 69 73  rated type it is
ea50: 20 74 68 65 20 64 65 66 61 75 6c 74 20 76 61 6c   the default val
ea60: 75 65 2c 20 74 68 65 6e 20 6a 75 73 74 20 75 73  ue, then just us
ea70: 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  e..      #      
ea80: 20 69 74 20 76 65 72 62 61 74 69 6d 3b 20 6f 74   it verbatim; ot
ea90: 68 65 72 77 69 73 65 2c 20 6a 75 73 74 20 72 65  herwise, just re
eaa0: 74 75 72 6e 20 61 6e 20 65 6d 70 74 79 20 73 74  turn an empty st
eab0: 72 69 6e 67 2e 20 20 49 6e 20 74 68 61 74 0d 0a  ring.  In that..
eac0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63 61        #       ca
ead0: 73 65 2c 20 74 68 65 20 64 65 66 61 75 6c 74 20  se, the default 
eae0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 6c 61 67 73  connection flags
eaf0: 20 77 69 6c 6c 20 62 65 20 75 73 65 64 2e 0d 0a   will be used...
eb00: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69        #..      i
eb10: 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74  f {[string lengt
eb20: 68 20 24 76 61 6c 75 65 5d 20 3d 3d 20 30 20 7c  h $value] == 0 |
eb30: 7c 20 24 76 61 6c 75 65 20 6e 65 20 22 44 65 66  | $value ne "Def
eb40: 61 75 6c 74 22 7d 20 74 68 65 6e 20 7b 0d 0a 20  ault"} then {.. 
eb50: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
eb60: 20 20 23 20 57 41 52 4e 49 4e 47 3a 20 54 68 69    # WARNING: Thi
eb70: 73 20 72 65 74 75 72 6e 73 20 74 68 65 20 73 74  s returns the st
eb80: 72 69 6e 67 20 76 61 6c 75 65 20 6f 66 20 74 68  ring value of th
eb90: 65 20 63 6f 6d 62 69 6e 65 64 20 66 6c 61 67 73  e combined flags
eba0: 2c 20 6e 6f 74 0d 0a 20 20 20 20 20 20 20 20 23  , not..        #
ebb0: 20 20 20 20 20 20 20 20 20 20 74 68 65 20 65 6e            the en
ebc0: 75 6d 65 72 61 74 65 64 20 76 61 6c 75 65 2e 20  umerated value. 
ebd0: 20 54 68 69 73 20 69 73 20 62 79 20 64 65 73 69   This is by desi
ebe0: 67 6e 20 61 6e 64 20 73 68 6f 75 6c 64 20 6e 6f  gn and should no
ebf0: 74 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  t..        #    
ec00: 20 20 20 20 20 20 62 65 20 63 68 61 6e 67 65 64        be changed
ec10: 20 77 69 74 68 6f 75 74 20 63 61 72 65 66 75 6c   without careful
ec20: 20 63 6f 6e 73 69 64 65 72 61 74 69 6f 6e 20 28   consideration (
ec30: 65 2e 67 2e 20 69 74 20 77 6f 75 6c 64 0d 0a 20  e.g. it would.. 
ec40: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 20         #        
ec50: 20 20 70 72 65 76 65 6e 74 20 74 68 65 20 53 51    prevent the SQ
ec60: 4c 69 74 65 43 6f 6e 6e 65 63 74 69 6f 6e 20 63  LiteConnection c
ec70: 6c 61 73 73 20 66 72 6f 6d 20 61 6c 6c 6f 77 69  lass from allowi
ec80: 6e 67 20 69 6e 76 61 6c 69 64 0d 0a 20 20 20 20  ng invalid..    
ec90: 20 20 20 20 23 20 20 20 20 20 20 20 20 20 20 5b      #          [
eca0: 22 6d 61 67 69 63 61 6c 22 5d 20 6d 65 74 61 2d  "magical"] meta-
ecb0: 66 6c 61 67 73 29 2e 0d 0a 20 20 20 20 20 20 20  flags)...       
ecc0: 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75   #..        retu
ecd0: 72 6e 20 5b 61 70 70 65 6e 64 41 72 67 73 20 22  rn [appendArgs "
ece0: 46 6c 61 67 73 3d 22 20 24 66 6c 61 67 73 20 5c  Flags=" $flags \
ecf0: 3b 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  ;]..      }.... 
ed00: 20 20 20 20 20 72 65 74 75 72 6e 20 22 22 0d 0a       return ""..
ed10: 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
ed20: 6f 63 20 73 65 74 75 70 44 62 20 7b 0d 0a 20 20  oc setupDb {..  
ed30: 20 20 20 20 20 20 20 20 20 20 66 69 6c 65 4e 61            fileNa
ed40: 6d 65 20 7b 6d 6f 64 65 20 22 22 7d 20 7b 64 61  me {mode ""} {da
ed50: 74 65 54 69 6d 65 46 6f 72 6d 61 74 20 22 22 7d  teTimeFormat ""}
ed60: 20 7b 64 61 74 65 54 69 6d 65 4b 69 6e 64 20 22   {dateTimeKind "
ed70: 22 7d 20 7b 66 6c 61 67 73 20 22 22 7d 0d 0a 20  "} {flags ""}.. 
ed80: 20 20 20 20 20 20 20 20 20 20 20 7b 65 78 74 72             {extr
ed90: 61 20 22 22 7d 20 7b 71 75 61 6c 69 66 79 20 74  a ""} {qualify t
eda0: 72 75 65 7d 20 7b 64 65 6c 65 74 65 20 74 72 75  rue} {delete tru
edb0: 65 7d 20 7b 75 72 69 20 66 61 6c 73 65 7d 0d 0a  e} {uri false}..
edc0: 20 20 20 20 20 20 20 20 20 20 20 20 7b 74 65 6d              {tem
edd0: 70 6f 72 61 72 79 20 74 72 75 65 7d 20 7b 76 61  porary true} {va
ede0: 72 4e 61 6d 65 20 64 62 7d 20 7b 71 75 69 65 74  rName db} {quiet
edf0: 20 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a 20 20 20   false} } {..   
ee00: 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
ee10: 54 45 3a 20 46 69 72 73 74 2c 20 73 65 65 20 69  TE: First, see i
ee20: 66 20 6f 75 72 20 63 61 6c 6c 65 72 20 68 61 73  f our caller has
ee30: 20 72 65 71 75 65 73 74 65 64 20 61 6e 20 69 6e   requested an in
ee40: 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
ee50: 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
ee60: 20 20 73 65 74 20 69 73 4d 65 6d 6f 72 79 20 5b    set isMemory [
ee70: 69 73 4d 65 6d 6f 72 79 44 62 20 24 66 69 6c 65  isMemoryDb $file
ee80: 4e 61 6d 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 23  Name]....      #
ee90: 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
eea0: 46 6f 72 20 6e 6f 77 2c 20 61 6c 6c 20 74 65 73  For now, all tes
eeb0: 74 20 64 61 74 61 62 61 73 65 73 20 75 73 65 64  t databases used
eec0: 20 62 79 20 74 68 65 20 74 65 73 74 20 73 75 69   by the test sui
eed0: 74 65 20 61 72 65 20 70 6c 61 63 65 64 0d 0a 20  te are placed.. 
eee0: 20 20 20 20 20 23 20 20 20 20 20 20 20 69 6e 74       #       int
eef0: 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 64  o the database d
ef00: 69 72 65 63 74 6f 72 79 2e 20 20 45 61 63 68 20  irectory.  Each 
ef10: 64 61 74 61 62 61 73 65 20 61 6e 64 20 72 65 6c  database and rel
ef20: 61 74 65 64 20 66 69 6c 65 73 0d 0a 20 20 20 20  ated files..    
ef30: 20 20 23 20 20 20 20 20 20 20 75 73 65 64 20 62    #       used b
ef40: 79 20 61 20 74 65 73 74 20 73 68 6f 75 6c 64 20  y a test should 
ef50: 62 65 20 63 6c 65 61 6e 65 64 20 75 70 20 62 79  be cleaned up by
ef60: 20 74 68 61 74 20 74 65 73 74 20 75 73 69 6e 67   that test using
ef70: 20 74 68 65 0d 0a 20 20 20 20 20 20 23 20 20 20   the..      #   
ef80: 20 20 20 20 22 63 6c 65 61 6e 75 70 44 62 22 20      "cleanupDb" 
ef90: 70 72 6f 63 65 64 75 72 65 2c 20 62 65 6c 6f 77  procedure, below
efa0: 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
efb0: 20 20 69 66 20 7b 21 24 69 73 4d 65 6d 6f 72 79    if {!$isMemory
efc0: 20 26 26 20 24 71 75 61 6c 69 66 79 7d 20 74 68   && $qualify} th
efd0: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 65  en {..        se
efe0: 74 20 66 69 6c 65 4e 61 6d 65 20 5b 66 69 6c 65  t fileName [file
eff0: 20 6a 6f 69 6e 20 5b 67 65 74 44 61 74 61 62 61   join [getDataba
f000: 73 65 44 69 72 65 63 74 6f 72 79 5d 20 5b 66 69  seDirectory] [fi
f010: 6c 65 20 74 61 69 6c 20 24 66 69 6c 65 4e 61 6d  le tail $fileNam
f020: 65 5d 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a  e]]..      }....
f030: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
f040: 20 4e 4f 54 45 3a 20 42 79 20 64 65 66 61 75 6c   NOTE: By defaul
f050: 74 2c 20 64 65 6c 65 74 65 20 61 6e 79 20 70 72  t, delete any pr
f060: 65 2d 65 78 69 73 74 69 6e 67 20 64 61 74 61 62  e-existing datab
f070: 61 73 65 20 77 69 74 68 20 74 68 65 20 73 61 6d  ase with the sam
f080: 65 20 66 69 6c 65 0d 0a 20 20 20 20 20 20 23 20  e file..      # 
f090: 20 20 20 20 20 20 6e 61 6d 65 20 69 66 20 69 74        name if it
f0a0: 20 63 75 72 72 65 6e 74 6c 79 20 65 78 69 73 74   currently exist
f0b0: 73 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  s...      #..   
f0c0: 20 20 20 69 66 20 7b 21 24 69 73 4d 65 6d 6f 72     if {!$isMemor
f0d0: 79 20 26 26 20 24 64 65 6c 65 74 65 20 26 26 20  y && $delete && 
f0e0: 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24 66 69  [file exists $fi
f0f0: 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d  leName]} then {.
f100: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
f110: 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 74 74 65      # NOTE: Atte
f120: 6d 70 74 20 74 6f 20 64 65 6c 65 74 65 20 61 6e  mpt to delete an
f130: 79 20 70 72 65 2d 65 78 69 73 74 69 6e 67 20 64  y pre-existing d
f140: 61 74 61 62 61 73 65 20 77 69 74 68 20 74 68 65  atabase with the
f150: 20 73 61 6d 65 20 66 69 6c 65 0d 0a 20 20 20 20   same file..    
f160: 20 20 20 20 23 20 20 20 20 20 20 20 6e 61 6d 65      #       name
f170: 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
f180: 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68        if {[catch
f190: 20 7b 66 69 6c 65 20 64 65 6c 65 74 65 20 24 66   {file delete $f
f1a0: 69 6c 65 4e 61 6d 65 7d 20 65 72 72 6f 72 5d 7d  ileName} error]}
f1b0: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
f1c0: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
f1d0: 23 20 4e 4f 54 45 3a 20 57 65 20 73 6f 6d 65 68  # NOTE: We someh
f1e0: 6f 77 20 66 61 69 6c 65 64 20 74 6f 20 64 65 6c  ow failed to del
f1f0: 65 74 65 20 74 68 65 20 66 69 6c 65 2c 20 72 65  ete the file, re
f200: 70 6f 72 74 20 77 68 79 2e 0d 0a 20 20 20 20 20  port why...     
f210: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
f220: 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74    if {!$quiet} t
f230: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
f240: 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
f250: 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  _channel [append
f260: 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
f270: 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41          "==== WA
f280: 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20 74 6f  RNING: failed to
f290: 20 64 65 6c 65 74 65 20 64 61 74 61 62 61 73 65   delete database
f2a0: 20 66 69 6c 65 20 5c 22 22 20 24 66 69 6c 65 4e   file \"" $fileN
f2b0: 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ame \..         
f2c0: 20 20 20 20 20 20 20 22 5c 22 20 64 75 72 69 6e         "\" durin
f2d0: 67 20 73 65 74 75 70 2c 20 65 72 72 6f 72 3a 20  g setup, error: 
f2e0: 22 20 5c 6e 5c 74 20 24 65 72 72 6f 72 20 5c 6e  " \n\t $error \n
f2f0: 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  ]..          }..
f300: 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
f310: 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20   }....      #.. 
f320: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 52 65 66       # NOTE: Ref
f330: 65 72 20 74 6f 20 74 68 65 20 73 70 65 63 69 66  er to the specif
f340: 69 65 64 20 76 61 72 69 61 62 6c 65 20 28 65 2e  ied variable (e.
f350: 67 2e 20 22 64 62 22 29 20 69 6e 20 74 68 65 20  g. "db") in the 
f360: 63 6f 6e 74 65 78 74 20 6f 66 20 6f 75 72 0d 0a  context of our..
f370: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63 61        #       ca
f380: 6c 6c 65 72 2e 20 20 54 68 65 20 68 61 6e 64 6c  ller.  The handl
f390: 65 20 74 6f 20 74 68 65 20 6f 70 65 6e 65 64 20  e to the opened 
f3a0: 64 61 74 61 62 61 73 65 20 77 69 6c 6c 20 62 65  database will be
f3b0: 20 73 74 6f 72 65 64 20 74 68 65 72 65 2e 0d 0a   stored there...
f3c0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 75        #..      u
f3d0: 70 76 61 72 20 31 20 24 76 61 72 4e 61 6d 65 20  pvar 1 $varName 
f3e0: 64 62 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20  db....      #.. 
f3f0: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 74 61       # NOTE: Sta
f400: 72 74 20 62 75 69 6c 64 69 6e 67 20 74 68 65 20  rt building the 
f410: 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 74 72 69 6e  connection strin
f420: 67 2e 20 20 54 68 65 20 6f 6e 6c 79 20 72 65 71  g.  The only req
f430: 75 69 72 65 64 20 70 6f 72 74 69 6f 6e 0d 0a 20  uired portion.. 
f440: 20 20 20 20 20 23 20 20 20 20 20 20 20 6f 66 20       #       of 
f450: 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73  the connection s
f460: 74 72 69 6e 67 20 69 73 20 74 68 65 20 64 61 74  tring is the dat
f470: 61 20 73 6f 75 72 63 65 2c 20 77 68 69 63 68 20  a source, which 
f480: 63 6f 6e 74 61 69 6e 73 20 74 68 65 0d 0a 20 20  contains the..  
f490: 20 20 20 20 23 20 20 20 20 20 20 20 64 61 74 61      #       data
f4a0: 62 61 73 65 20 66 69 6c 65 20 6e 61 6d 65 20 69  base file name i
f4b0: 74 73 65 6c 66 2e 20 20 49 66 20 6f 75 72 20 63  tself.  If our c
f4c0: 61 6c 6c 65 72 20 77 61 6e 74 73 20 74 6f 20 75  aller wants to u
f4d0: 73 65 20 61 20 55 52 49 20 61 73 0d 0a 20 20 20  se a URI as..   
f4e0: 20 20 20 23 20 20 20 20 20 20 20 74 68 65 20 64     #       the d
f4f0: 61 74 61 20 73 6f 75 72 63 65 2c 20 75 73 65 20  ata source, use 
f500: 74 68 65 20 46 75 6c 6c 55 72 69 20 63 6f 6e 6e  the FullUri conn
f510: 65 63 74 69 6f 6e 20 73 74 72 69 6e 67 20 70 72  ection string pr
f520: 6f 70 65 72 74 79 20 74 6f 0d 0a 20 20 20 20 20  operty to..     
f530: 20 23 20 20 20 20 20 20 20 70 72 65 76 65 6e 74   #       prevent
f540: 20 74 68 65 20 64 61 74 61 20 73 6f 75 72 63 65   the data source
f550: 20 73 74 72 69 6e 67 20 66 72 6f 6d 20 62 65 69   string from bei
f560: 6e 67 20 6d 61 6e 67 6c 65 64 2e 0d 0a 20 20 20  ng mangled...   
f570: 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
f580: 24 75 72 69 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  $uri} then {..  
f590: 20 20 20 20 20 20 73 65 74 20 63 6f 6e 6e 65 63        set connec
f5a0: 74 69 6f 6e 20 7b 46 75 6c 6c 55 72 69 3d 24 7b  tion {FullUri=${
f5b0: 66 69 6c 65 4e 61 6d 65 7d 7d 0d 0a 20 20 20 20  fileName}}..    
f5c0: 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
f5d0: 20 20 20 20 73 65 74 20 63 6f 6e 6e 65 63 74 69      set connecti
f5e0: 6f 6e 20 7b 44 61 74 61 20 53 6f 75 72 63 65 3d  on {Data Source=
f5f0: 24 7b 66 69 6c 65 4e 61 6d 65 7d 7d 0d 0a 20 20  ${fileName}}..  
f600: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23      }....      #
f610: 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
f620: 53 69 6e 63 65 20 74 68 69 73 20 70 72 6f 63 65  Since this proce
f630: 64 75 72 65 20 68 61 73 20 6e 6f 20 73 70 65 63  dure has no spec
f640: 69 61 6c 20 6b 6e 6f 77 6c 65 64 67 65 20 6f 66  ial knowledge of
f650: 20 77 68 61 74 20 74 68 65 20 64 65 66 61 75 6c   what the defaul
f660: 74 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  t..      #      
f670: 20 73 65 74 74 69 6e 67 20 69 73 20 66 6f 72 20   setting is for 
f680: 74 68 65 20 54 6f 46 75 6c 6c 50 61 74 68 20 63  the ToFullPath c
f690: 6f 6e 6e 65 63 74 69 6f 6e 20 73 74 72 69 6e 67  onnection string
f6a0: 20 70 72 6f 70 65 72 79 2c 20 61 6c 77 61 79 73   propery, always
f6b0: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
f6c0: 61 64 64 20 74 68 65 20 76 61 6c 75 65 20 77 65  add the value we
f6d0: 20 6b 6e 6f 77 20 61 62 6f 75 74 20 74 6f 20 74   know about to t
f6e0: 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 74  he connection st
f6f0: 72 69 6e 67 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  ring...      #..
f700: 20 20 20 20 20 20 61 70 70 65 6e 64 20 63 6f 6e        append con
f710: 6e 65 63 74 69 6f 6e 20 7b 3b 54 6f 46 75 6c 6c  nection {;ToFull
f720: 50 61 74 68 3d 24 7b 71 75 61 6c 69 66 79 7d 7d  Path=${qualify}}
f730: 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  ....      #..   
f740: 20 20 20 23 20 4e 4f 54 45 3a 20 49 66 20 6f 75     # NOTE: If ou
f750: 72 20 63 61 6c 6c 65 72 20 73 70 65 63 69 66 69  r caller specifi
f760: 65 64 20 61 20 6a 6f 75 72 6e 61 6c 20 6d 6f 64  ed a journal mod
f770: 65 2c 20 61 64 64 20 74 68 65 20 6e 65 63 65 73  e, add the neces
f780: 73 61 72 79 20 70 6f 72 74 69 6f 6e 0d 0a 20 20  sary portion..  
f790: 20 20 20 20 23 20 20 20 20 20 20 20 6f 66 20 74      #       of t
f7a0: 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 74  he connection st
f7b0: 72 69 6e 67 20 6e 6f 77 2e 0d 0a 20 20 20 20 20  ring now...     
f7c0: 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 73   #..      if {[s
f7d0: 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 6d 6f  tring length $mo
f7e0: 64 65 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d  de] > 0} then {.
f7f0: 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 20  .        append 
f800: 63 6f 6e 6e 65 63 74 69 6f 6e 20 7b 3b 4a 6f 75  connection {;Jou
f810: 72 6e 61 6c 20 4d 6f 64 65 3d 24 7b 6d 6f 64 65  rnal Mode=${mode
f820: 7d 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  }}..      }.... 
f830: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
f840: 4e 4f 54 45 3a 20 49 66 20 6f 75 72 20 63 61 6c  NOTE: If our cal
f850: 6c 65 72 20 73 70 65 63 69 66 69 65 64 20 61 20  ler specified a 
f860: 44 61 74 65 54 69 6d 65 20 66 6f 72 6d 61 74 2c  DateTime format,
f870: 20 61 64 64 20 74 68 65 20 6e 65 63 65 73 73 61   add the necessa
f880: 72 79 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  ry..      #     
f890: 20 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65    portion of the
f8a0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 74 72 69   connection stri
f8b0: 6e 67 20 6e 6f 77 2e 0d 0a 20 20 20 20 20 20 23  ng now...      #
f8c0: 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72  ..      if {[str
f8d0: 69 6e 67 20 6c 65 6e 67 74 68 20 24 64 61 74 65  ing length $date
f8e0: 54 69 6d 65 46 6f 72 6d 61 74 5d 20 3e 20 30 7d  TimeFormat] > 0}
f8f0: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
f900: 20 61 70 70 65 6e 64 20 63 6f 6e 6e 65 63 74 69   append connecti
f910: 6f 6e 20 7b 3b 44 61 74 65 54 69 6d 65 46 6f 72  on {;DateTimeFor
f920: 6d 61 74 3d 24 7b 64 61 74 65 54 69 6d 65 46 6f  mat=${dateTimeFo
f930: 72 6d 61 74 7d 7d 0d 0a 20 20 20 20 20 20 7d 0d  rmat}}..      }.
f940: 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
f950: 20 20 23 20 4e 4f 54 45 3a 20 49 66 20 6f 75 72    # NOTE: If our
f960: 20 63 61 6c 6c 65 72 20 73 70 65 63 69 66 69 65   caller specifie
f970: 64 20 61 20 44 61 74 65 54 69 6d 65 4b 69 6e 64  d a DateTimeKind
f980: 2c 20 61 64 64 20 74 68 65 20 6e 65 63 65 73 73  , add the necess
f990: 61 72 79 20 70 6f 72 74 69 6f 6e 0d 0a 20 20 20  ary portion..   
f9a0: 20 20 20 23 20 20 20 20 20 20 20 6f 66 20 74 68     #       of th
f9b0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 74 72  e connection str
f9c0: 69 6e 67 20 6e 6f 77 2e 0d 0a 20 20 20 20 20 20  ing now...      
f9d0: 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 73 74  #..      if {[st
f9e0: 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 64 61 74  ring length $dat
f9f0: 65 54 69 6d 65 4b 69 6e 64 5d 20 3e 20 30 7d 20  eTimeKind] > 0} 
fa00: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
fa10: 61 70 70 65 6e 64 20 63 6f 6e 6e 65 63 74 69 6f  append connectio
fa20: 6e 20 7b 3b 44 61 74 65 54 69 6d 65 4b 69 6e 64  n {;DateTimeKind
fa30: 3d 24 7b 64 61 74 65 54 69 6d 65 4b 69 6e 64 7d  =${dateTimeKind}
fa40: 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  }..      }....  
fa50: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
fa60: 4f 54 45 3a 20 46 69 67 75 72 65 20 6f 75 74 20  OTE: Figure out 
fa70: 77 68 61 74 20 74 68 65 20 66 69 6e 61 6c 20 66  what the final f
fa80: 6c 61 67 73 20 66 6f 72 20 74 68 69 73 20 63 6f  lags for this co
fa90: 6e 6e 65 63 74 69 6f 6e 20 6e 65 65 64 20 74 6f  nnection need to
faa0: 20 62 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20   be...      #.. 
fab0: 20 20 20 20 20 73 65 74 20 66 6c 61 67 73 20 5b       set flags [
fac0: 67 65 74 43 6f 6e 6e 65 63 74 69 6f 6e 46 6c 61  getConnectionFla
fad0: 67 73 20 24 66 69 6c 65 4e 61 6d 65 20 24 66 6c  gs $fileName $fl
fae0: 61 67 73 20 24 71 75 69 65 74 5d 0d 0a 0d 0a 20  ags $quiet].... 
faf0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
fb00: 4e 4f 54 45 3a 20 49 66 20 6f 75 72 20 63 61 6c  NOTE: If our cal
fb10: 6c 65 72 20 73 70 65 63 69 66 69 65 64 20 73 6f  ler specified so
fb20: 6d 65 20 53 51 4c 69 74 65 43 6f 6e 6e 65 63 74  me SQLiteConnect
fb30: 69 6f 6e 46 6c 61 67 73 2c 20 61 64 64 20 74 68  ionFlags, add th
fb40: 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  e..      #      
fb50: 20 6e 65 63 65 73 73 61 72 79 20 70 6f 72 74 69   necessary porti
fb60: 6f 6e 20 6f 66 20 74 68 65 20 63 6f 6e 6e 65 63  on of the connec
fb70: 74 69 6f 6e 20 73 74 72 69 6e 67 20 6e 6f 77 2e  tion string now.
fb80: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
fb90: 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e   if {[string len
fba0: 67 74 68 20 24 66 6c 61 67 73 5d 20 3e 20 30 7d  gth $flags] > 0}
fbb0: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
fbc0: 20 61 70 70 65 6e 64 20 63 6f 6e 6e 65 63 74 69   append connecti
fbd0: 6f 6e 20 7b 3b 46 6c 61 67 73 3d 24 7b 66 6c 61  on {;Flags=${fla
fbe0: 67 73 7d 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d  gs}}..      }...
fbf0: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
fc00: 23 20 4e 4f 54 45 3a 20 49 66 20 6f 75 72 20 63  # NOTE: If our c
fc10: 61 6c 6c 65 72 20 73 70 65 63 69 66 69 65 64 20  aller specified 
fc20: 61 6e 20 65 78 74 72 61 20 70 61 79 6c 6f 61 64  an extra payload
fc30: 20 74 6f 20 74 68 65 20 63 6f 6e 6e 65 63 74 69   to the connecti
fc40: 6f 6e 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  on..      #     
fc50: 20 20 73 74 72 69 6e 67 2c 20 61 70 70 65 6e 64    string, append
fc60: 20 69 74 20 6e 6f 77 2e 0d 0a 20 20 20 20 20 20   it now...      
fc70: 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 73 74  #..      if {[st
fc80: 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 65 78 74  ring length $ext
fc90: 72 61 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d  ra] > 0} then {.
fca0: 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 20  .        append 
fcb0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 5c 3b 20 24 65  connection \; $e
fcc0: 78 74 72 61 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d  xtra..      }...
fcd0: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
fce0: 23 20 4e 4f 54 45 3a 20 4f 70 65 6e 20 74 68 65  # NOTE: Open the
fcf0: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
fd00: 74 69 6f 6e 20 6e 6f 77 2c 20 70 6c 61 63 69 6e  tion now, placin
fd10: 67 20 74 68 65 20 6f 70 61 71 75 65 20 68 61 6e  g the opaque han
fd20: 64 6c 65 20 76 61 6c 75 65 0d 0a 20 20 20 20 20  dle value..     
fd30: 20 23 20 20 20 20 20 20 20 69 6e 74 6f 20 74 68   #       into th
fd40: 65 20 76 61 72 69 61 62 6c 65 20 73 70 65 63 69  e variable speci
fd50: 66 69 65 64 20 62 79 20 6f 75 72 20 63 61 6c 6c  fied by our call
fd60: 65 72 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  er...      #..  
fd70: 20 20 20 20 73 65 74 20 64 62 20 5b 73 71 6c 20      set db [sql 
fd80: 6f 70 65 6e 20 2d 74 79 70 65 20 53 51 4c 69 74  open -type SQLit
fd90: 65 20 5b 73 75 62 73 74 20 24 63 6f 6e 6e 65 63  e [subst $connec
fda0: 74 69 6f 6e 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20  tion]]....      
fdb0: 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
fdc0: 20 43 6f 6e 66 69 67 75 72 65 20 74 68 65 20 74   Configure the t
fdd0: 65 6d 70 6f 72 61 72 79 20 64 69 72 65 63 74 6f  emporary directo
fde0: 72 79 20 66 6f 72 20 74 68 65 20 6e 65 77 6c 79  ry for the newly
fdf0: 20 6f 70 65 6e 65 64 20 64 61 74 61 62 61 73 65   opened database
fe00: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
fe10: 63 6f 6e 6e 65 63 74 69 6f 6e 20 6e 6f 77 20 75  connection now u
fe20: 6e 6c 65 73 73 20 6f 75 72 20 63 61 6c 6c 65 72  nless our caller
fe30: 20 66 6f 72 62 69 64 73 20 69 74 2e 0d 0a 20 20   forbids it...  
fe40: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20      #..      if 
fe50: 7b 24 74 65 6d 70 6f 72 61 72 79 20 26 26 20 21  {$temporary && !
fe60: 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e  [info exists ::n
fe70: 6f 28 73 65 74 54 65 6d 70 6f 72 61 72 79 44 69  o(setTemporaryDi
fe80: 72 65 63 74 6f 72 79 29 5d 7d 20 74 68 65 6e 20  rectory)]} then 
fe90: 7b 0d 0a 20 20 20 20 20 20 20 20 73 71 6c 20 65  {..        sql e
fea0: 78 65 63 75 74 65 20 24 64 62 20 5b 61 70 70 65  xecute $db [appe
feb0: 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
fec0: 20 20 20 20 20 20 22 50 52 41 47 4d 41 20 74 65        "PRAGMA te
fed0: 6d 70 5f 73 74 6f 72 65 5f 64 69 72 65 63 74 6f  mp_store_directo
fee0: 72 79 20 3d 20 5c 22 22 20 5b 67 65 74 54 65 6d  ry = \"" [getTem
fef0: 70 6f 72 61 72 79 44 69 72 65 63 74 6f 72 79 5d  poraryDirectory]
ff00: 20 5c 22 5c 3b 5d 0d 0a 20 20 20 20 20 20 7d 0d   \"\;]..      }.
ff10: 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
ff20: 20 20 23 20 4e 4f 54 45 3a 20 41 6c 77 61 79 73    # NOTE: Always
ff30: 20 72 65 74 75 72 6e 20 74 68 65 20 63 6f 6e 6e   return the conn
ff40: 65 63 74 69 6f 6e 20 68 61 6e 64 6c 65 20 75 70  ection handle up
ff50: 6f 6e 20 73 75 63 63 65 73 73 2e 0d 0a 20 20 20  on success...   
ff60: 20 20 20 23 0d 0a 20 20 20 20 20 20 72 65 74 75     #..      retu
ff70: 72 6e 20 24 64 62 0d 0a 20 20 20 20 7d 0d 0a 0c  rn $db..    }...
ff80: 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74 44 62  ..    proc getDb
ff90: 43 6f 6e 6e 65 63 74 69 6f 6e 20 7b 20 7b 76 61  Connection { {va
ffa0: 72 4e 61 6d 65 20 64 62 7d 20 7d 20 7b 0d 0a 20  rName db} } {.. 
ffb0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
ffc0: 4e 4f 54 45 3a 20 52 65 66 65 72 20 74 6f 20 74  NOTE: Refer to t
ffd0: 68 65 20 73 70 65 63 69 66 69 65 64 20 76 61 72  he specified var
ffe0: 69 61 62 6c 65 20 28 65 2e 67 2e 20 22 64 62 22  iable (e.g. "db"
fff0: 29 20 69 6e 20 74 68 65 20 63 6f 6e 74 65 78 74  ) in the context
10000 20 6f 66 20 6f 75 72 0d 0a 20 20 20 20 20 20 23   of our..      #
10010 20 20 20 20 20 20 20 63 61 6c 6c 65 72 2e 20 20         caller.  
10020 54 68 65 20 68 61 6e 64 6c 65 20 74 6f 20 74 68  The handle to th
10030 65 20 64 61 74 61 62 61 73 65 20 70 72 65 76 69  e database previ
10040 6f 75 73 6c 79 20 6f 70 65 6e 65 64 20 76 69 61  ously opened via
10050 20 74 68 65 0d 0a 20 20 20 20 20 20 23 20 20 20   the..      #   
10060 20 20 20 20 5b 73 65 74 75 70 44 62 5d 20 70 72      [setupDb] pr
10070 6f 63 65 64 75 72 65 20 73 68 6f 75 6c 64 20 62  ocedure should b
10080 65 20 73 74 6f 72 65 64 20 74 68 65 72 65 2e 0d  e stored there..
10090 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
100a0 75 70 76 61 72 20 31 20 24 76 61 72 4e 61 6d 65  upvar 1 $varName
100b0 20 64 62 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a   db....      #..
100c0 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68        # NOTE: Th
100d0 69 73 20 72 65 74 75 72 6e 73 20 74 68 65 20 41  is returns the A
100e0 44 4f 2e 4e 45 54 20 49 44 62 43 6f 6e 6e 65 63  DO.NET IDbConnec
100f0 74 69 6f 6e 20 6f 62 6a 65 63 74 20 69 6e 73 74  tion object inst
10100 61 6e 63 65 20 66 6f 72 20 74 68 65 0d 0a 20 20  ance for the..  
10110 20 20 20 20 23 20 20 20 20 20 20 20 73 70 65 63      #       spec
10120 69 66 69 65 64 20 64 61 74 61 62 73 65 20 68 61  ified databse ha
10130 6e 64 6c 65 2e 20 20 53 69 6e 63 65 20 67 65 74  ndle.  Since get
10140 74 69 6e 67 20 74 68 69 73 20 6f 62 6a 65 63 74  ting this object
10150 20 72 65 6c 69 65 73 20 75 70 6f 6e 0d 0a 20 20   relies upon..  
10160 20 20 20 20 23 20 20 20 20 20 20 20 45 61 67 6c      #       Eagl
10170 65 20 69 6e 74 65 72 6e 61 6c 73 2c 20 67 72 65  e internals, gre
10180 61 74 20 63 61 72 65 20 73 68 6f 75 6c 64 20 62  at care should b
10190 65 20 74 61 6b 65 6e 20 74 6f 20 61 76 6f 69 64  e taken to avoid
101a0 20 64 69 73 70 6f 73 69 6e 67 20 6f 66 0d 0a 20   disposing of.. 
101b0 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68 69       #       thi
101c0 73 20 6f 62 6a 65 63 74 20 6f 72 20 6f 74 68 65  s object or othe
101d0 72 77 69 73 65 20 70 75 74 74 69 6e 67 20 69 74  rwise putting it
101e0 20 69 6e 74 6f 20 61 6e 20 69 6e 76 61 6c 69 64   into an invalid
101f0 20 73 74 61 74 65 2e 0d 0a 20 20 20 20 20 20 23   state...      #
10200 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66  ..      if {[inf
10210 6f 20 65 78 69 73 74 73 20 64 62 5d 7d 20 74 68  o exists db]} th
10220 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66  en {..        if
10230 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20   {[catch {..    
10240 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76        object inv
10250 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50  oke -flags +NonP
10260 75 62 6c 69 63 20 2d 6f 62 6a 65 63 74 66 6c 61  ublic -objectfla
10270 67 73 20 2b 4e 6f 44 69 73 70 6f 73 65 20 2d 61  gs +NoDispose -a
10280 6c 69 61 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  lias \..        
10290 20 20 20 20 20 20 49 6e 74 65 72 70 72 65 74 65        Interprete
102a0 72 2e 47 65 74 41 63 74 69 76 65 2e 63 6f 6e 6e  r.GetActive.conn
102b0 65 63 74 69 6f 6e 73 20 49 74 65 6d 20 24 64 62  ections Item $db
102c0 0d 0a 20 20 20 20 20 20 20 20 7d 20 72 65 73 75  ..        } resu
102d0 6c 74 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b  lt] == 0} then {
102e0 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20  ..          #.. 
102f0 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a           # NOTE:
10300 20 53 75 63 63 65 73 73 2c 20 72 65 74 75 72 6e   Success, return
10310 20 74 68 65 20 6f 70 61 71 75 65 20 6f 62 6a 65   the opaque obje
10320 63 74 20 68 61 6e 64 6c 65 2e 0d 0a 20 20 20 20  ct handle...    
10330 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
10340 20 20 20 72 65 74 75 72 6e 20 24 72 65 73 75 6c     return $resul
10350 74 0d 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73  t..        } els
10360 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 23  e {..          #
10370 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f  ..          # NO
10380 54 45 3a 20 46 61 69 6c 75 72 65 2c 20 72 65 70  TE: Failure, rep
10390 6f 72 74 20 77 68 79 2e 0d 0a 20 20 20 20 20 20  ort why...      
103a0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
103b0 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
103c0 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
103d0 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
103e0 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e      "==== WARNIN
103f0 47 3a 20 66 61 69 6c 65 64 20 74 6f 20 67 65 74  G: failed to get
10400 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 6e 64   connection hand
10410 6c 65 20 66 6f 72 20 64 61 74 61 62 61 73 65 20  le for database 
10420 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  \"" \..         
10430 20 20 20 20 20 24 64 62 20 22 5c 22 2c 20 65 72       $db "\", er
10440 72 6f 72 3a 20 22 20 5c 6e 5c 74 20 24 72 65 73  ror: " \n\t $res
10450 75 6c 74 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20  ult \n]..       
10460 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20   }..      }..   
10470 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
10480 66 72 65 65 44 62 43 6f 6e 6e 65 63 74 69 6f 6e  freeDbConnection
10490 20 7b 20 7b 76 61 72 4e 61 6d 65 20 63 6f 6e 6e   { {varName conn
104a0 65 63 74 69 6f 6e 7d 20 7d 20 7b 0d 0a 20 20 20  ection} } {..   
104b0 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
104c0 54 45 3a 20 52 65 66 65 72 20 74 6f 20 74 68 65  TE: Refer to the
104d0 20 73 70 65 63 69 66 69 65 64 20 76 61 72 69 61   specified varia
104e0 62 6c 65 20 28 65 2e 67 2e 20 22 63 6f 6e 6e 65  ble (e.g. "conne
104f0 63 74 69 6f 6e 22 29 20 69 6e 20 74 68 65 0d 0a  ction") in the..
10500 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63 6f        #       co
10510 6e 74 65 78 74 20 6f 66 20 6f 75 72 20 63 61 6c  ntext of our cal
10520 6c 65 72 2e 20 20 54 68 65 20 6f 70 61 71 75 65  ler.  The opaque
10530 20 6f 62 6a 65 63 74 20 68 61 6e 64 6c 65 20 66   object handle f
10540 6f 72 20 61 6e 20 41 44 4f 2e 4e 45 54 0d 0a 20  or an ADO.NET.. 
10550 20 20 20 20 20 23 20 20 20 20 20 20 20 63 6f 6e       #       con
10560 6e 65 63 74 69 6f 6e 20 70 72 65 76 69 6f 75 73  nection previous
10570 6c 79 20 72 65 74 75 72 6e 65 64 20 62 79 20 5b  ly returned by [
10580 67 65 74 44 62 43 6f 6e 6e 65 63 74 69 6f 6e 5d  getDbConnection]
10590 20 73 68 6f 75 6c 64 20 62 65 0d 0a 20 20 20 20   should be..    
105a0 20 20 23 20 20 20 20 20 20 20 73 74 6f 72 65 64    #       stored
105b0 20 74 68 65 72 65 2e 0d 0a 20 20 20 20 20 20 23   there...      #
105c0 0d 0a 20 20 20 20 20 20 75 70 76 61 72 20 31 20  ..      upvar 1 
105d0 24 76 61 72 4e 61 6d 65 20 63 6f 6e 6e 65 63 74  $varName connect
105e0 69 6f 6e 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a  ion....      #..
105f0 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 74        # NOTE: At
10600 74 65 6d 70 74 20 74 6f 20 72 65 6d 6f 76 65 20  tempt to remove 
10610 74 68 65 20 6f 70 61 71 75 65 20 6f 62 6a 65 63  the opaque objec
10620 74 20 68 61 6e 64 6c 65 20 66 72 6f 6d 20 74 68  t handle from th
10630 65 20 69 6e 74 65 72 70 72 65 74 65 72 0d 0a 20  e interpreter.. 
10640 20 20 20 20 20 23 20 20 20 20 20 20 20 6e 6f 77       #       now
10650 2e 20 20 54 68 69 73 20 5b 6f 62 6a 65 63 74 20  .  This [object 
10660 64 69 73 70 6f 73 65 5d 20 63 61 6c 6c 20 77 69  dispose] call wi
10670 6c 6c 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20  ll not actually 
10680 64 69 73 70 6f 73 65 20 6f 66 20 74 68 65 0d 0a  dispose of the..
10690 20 20 20 20 20 20 23 20 20 20 20 20 20 20 75 6e        #       un
106a0 64 65 72 6c 79 69 6e 67 20 6f 62 6a 65 63 74 20  derlying object 
106b0 62 65 63 61 75 73 65 20 74 68 65 20 2b 4e 6f 44  because the +NoD
106c0 69 73 70 6f 73 65 20 66 6c 61 67 20 77 61 73 20  ispose flag was 
106d0 73 65 74 20 6f 6e 20 69 74 0d 0a 20 20 20 20 20  set on it..     
106e0 20 23 20 20 20 20 20 20 20 64 75 72 69 6e 67 20   #       during 
106f0 63 72 65 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  creation of the 
10700 6f 70 61 71 75 65 20 6f 62 6a 65 63 74 20 68 61  opaque object ha
10710 6e 64 6c 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  ndle...      #..
10720 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20        if {[info 
10730 65 78 69 73 74 73 20 63 6f 6e 6e 65 63 74 69 6f  exists connectio
10740 6e 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20  n] && \..       
10750 20 20 20 5b 63 61 74 63 68 20 7b 6f 62 6a 65 63     [catch {objec
10760 74 20 64 69 73 70 6f 73 65 20 24 63 6f 6e 6e 65  t dispose $conne
10770 63 74 69 6f 6e 7d 20 65 72 72 6f 72 5d 7d 20 74  ction} error]} t
10780 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  hen {..        #
10790 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
107a0 3a 20 57 65 20 73 6f 6d 65 68 6f 77 20 66 61 69  : We somehow fai
107b0 6c 65 64 20 74 6f 20 72 65 6d 6f 76 65 20 74 68  led to remove th
107c0 65 20 68 61 6e 64 6c 65 2c 20 72 65 70 6f 72 74  e handle, report
107d0 20 77 68 79 2e 0d 0a 20 20 20 20 20 20 20 20 23   why...        #
107e0 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20  ..        tputs 
107f0 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
10800 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
10810 20 20 20 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d             "====
10820 20 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64   WARNING: failed
10830 20 74 6f 20 72 65 6d 6f 76 65 20 63 6f 6e 6e 65   to remove conne
10840 63 74 69 6f 6e 20 68 61 6e 64 6c 65 20 5c 22 22  ction handle \""
10850 20 24 63 6f 6e 6e 65 63 74 69 6f 6e 20 5c 0d 0a   $connection \..
10860 20 20 20 20 20 20 20 20 20 20 20 20 22 5c 22 2c              "\",
10870 20 65 72 72 6f 72 3a 20 22 20 5c 6e 5c 74 20 24   error: " \n\t $
10880 65 72 72 6f 72 20 5c 6e 5d 0d 0a 20 20 20 20 20  error \n]..     
10890 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20   }..    }.....  
108a0 20 20 70 72 6f 63 20 61 64 64 44 62 43 6f 6e 6e    proc addDbConn
108b0 65 63 74 69 6f 6e 20 7b 20 63 6f 6e 6e 65 63 74  ection { connect
108c0 69 6f 6e 20 7b 76 61 72 4e 61 6d 65 20 64 62 7d  ion {varName db}
108d0 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20   } {..      #.. 
108e0 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 52 65 66       # NOTE: Ref
108f0 65 72 20 74 6f 20 74 68 65 20 73 70 65 63 69 66  er to the specif
10900 69 65 64 20 76 61 72 69 61 62 6c 65 20 28 65 2e  ied variable (e.
10910 67 2e 20 22 64 62 22 29 20 69 6e 20 74 68 65 20  g. "db") in the 
10920 63 6f 6e 74 65 78 74 20 6f 66 20 6f 75 72 0d 0a  context of our..
10930 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63 61        #       ca
10940 6c 6c 65 72 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  ller...      #..
10950 20 20 20 20 20 20 75 70 76 61 72 20 31 20 24 76        upvar 1 $v
10960 61 72 4e 61 6d 65 20 64 62 0d 0a 0d 0a 20 20 20  arName db....   
10970 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
10980 54 45 3a 20 43 72 65 61 74 65 20 61 20 63 6f 72  TE: Create a cor
10990 72 65 63 74 6c 79 20 66 6f 72 6d 61 74 74 65 64  rectly formatted
109a0 20 6e 61 6d 65 20 66 6f 72 20 74 68 65 20 64 61   name for the da
109b0 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
109c0 6e 20 74 6f 0d 0a 20 20 20 20 20 20 23 20 20 20  n to..      #   
109d0 20 20 20 20 62 65 20 61 64 64 65 64 20 74 6f 20      be added to 
109e0 74 68 65 20 6c 69 73 74 20 6d 61 6e 61 67 65 64  the list managed
109f0 20 62 79 20 74 68 65 20 45 61 67 6c 65 20 69 6e   by the Eagle in
10a00 74 65 72 70 72 65 74 65 72 2e 0d 0a 20 20 20 20  terpreter...    
10a10 20 20 23 0d 0a 20 20 20 20 20 20 73 65 74 20 64    #..      set d
10a20 62 20 5b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65  b [object invoke
10a30 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c   -flags +NonPubl
10a40 69 63 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  ic \..          
10a50 45 61 67 6c 65 2e 5f 43 6f 6d 70 6f 6e 65 6e 74  Eagle._Component
10a60 73 2e 50 72 69 76 61 74 65 2e 46 6f 72 6d 61 74  s.Private.Format
10a70 4f 70 73 20 44 61 74 61 62 61 73 65 4f 62 6a 65  Ops DatabaseObje
10a80 63 74 4e 61 6d 65 20 24 63 6f 6e 6e 65 63 74 69  ctName $connecti
10a90 6f 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  on \..          
10aa0 53 51 4c 69 74 65 43 6f 6e 6e 65 63 74 69 6f 6e  SQLiteConnection
10ab0 20 5b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20   [object invoke 
10ac0 49 6e 74 65 72 70 72 65 74 65 72 2e 47 65 74 41  Interpreter.GetA
10ad0 63 74 69 76 65 20 4e 65 78 74 49 64 5d 5d 0d 0a  ctive NextId]]..
10ae0 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
10af0 20 23 20 4e 4f 54 45 3a 20 41 64 64 20 74 68 65   # NOTE: Add the
10b00 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
10b10 74 69 6f 6e 20 70 72 6f 76 69 64 65 64 20 62 79  tion provided by
10b20 20 6f 75 72 20 63 61 6c 6c 65 72 20 74 6f 20 74   our caller to t
10b30 68 65 20 6c 69 73 74 0d 0a 20 20 20 20 20 20 23  he list..      #
10b40 20 20 20 20 20 20 20 6f 66 20 74 68 6f 73 65 20         of those 
10b50 6b 6e 6f 77 6e 20 74 6f 20 74 68 65 20 45 61 67  known to the Eag
10b60 6c 65 20 69 6e 74 65 72 70 72 65 74 65 72 2e 0d  le interpreter..
10b70 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
10b80 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66  object invoke -f
10b90 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20  lags +NonPublic 
10ba0 49 6e 74 65 72 70 72 65 74 65 72 2e 47 65 74 41  Interpreter.GetA
10bb0 63 74 69 76 65 2e 63 6f 6e 6e 65 63 74 69 6f 6e  ctive.connection
10bc0 73 20 41 64 64 20 5c 0d 0a 20 20 20 20 20 20 20  s Add \..       
10bd0 20 20 20 24 64 62 20 24 63 6f 6e 6e 65 63 74 69     $db $connecti
10be0 6f 6e 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20  on..    }.....  
10bf0 20 20 70 72 6f 63 20 63 6c 65 61 6e 75 70 44 62    proc cleanupDb
10c00 20 7b 20 66 69 6c 65 4e 61 6d 65 20 7b 76 61 72   { fileName {var
10c10 4e 61 6d 65 20 64 62 7d 20 7b 63 6f 6c 6c 65 63  Name db} {collec
10c20 74 20 74 72 75 65 7d 20 7b 71 75 61 6c 69 66 79  t true} {qualify
10c30 20 74 72 75 65 7d 0d 0a 20 20 20 20 20 20 20 20   true}..        
10c40 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 64 65               {de
10c50 6c 65 74 65 20 74 72 75 65 7d 20 7d 20 7b 0d 0a  lete true} } {..
10c60 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
10c70 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74 20 74   NOTE: Attempt t
10c80 6f 20 66 6f 72 63 65 20 61 6c 6c 20 70 65 6e 64  o force all pend
10c90 69 6e 67 20 22 67 61 72 62 61 67 65 22 20 6f 62  ing "garbage" ob
10ca0 6a 65 63 74 73 20 74 6f 20 62 65 20 63 6f 6c 6c  jects to be coll
10cb0 65 63 74 65 64 2c 0d 0a 20 20 20 20 20 20 23 20  ected,..      # 
10cc0 20 20 20 20 20 20 69 6e 63 6c 75 64 69 6e 67 20        including 
10cd0 53 51 4c 69 74 65 20 73 74 61 74 65 6d 65 6e 74  SQLite statement
10ce0 73 20 61 6e 64 20 62 61 63 6b 75 70 20 6f 62 6a  s and backup obj
10cf0 65 63 74 73 3b 20 74 68 69 73 20 73 68 6f 75 6c  ects; this shoul
10d00 64 20 61 6c 6c 6f 77 0d 0a 20 20 20 20 20 20 23  d allow..      #
10d10 20 20 20 20 20 20 20 74 68 65 20 75 6e 64 65 72         the under
10d20 6c 79 69 6e 67 20 64 61 74 61 62 61 73 65 20 66  lying database f
10d30 69 6c 65 20 74 6f 20 62 65 20 64 65 6c 65 74 65  ile to be delete
10d40 64 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  d...      #..   
10d50 20 20 20 69 66 20 7b 24 63 6f 6c 6c 65 63 74 7d     if {$collect}
10d60 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
10d70 20 63 6f 6c 6c 65 63 74 47 61 72 62 61 67 65 20   collectGarbage 
10d80 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 0d  $::test_channel.
10d90 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
10da0 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
10db0 45 3a 20 52 65 66 65 72 20 74 6f 20 74 68 65 20  E: Refer to the 
10dc0 73 70 65 63 69 66 69 65 64 20 76 61 72 69 61 62  specified variab
10dd0 6c 65 20 28 65 2e 67 2e 20 22 64 62 22 29 20 69  le (e.g. "db") i
10de0 6e 20 74 68 65 20 63 6f 6e 74 65 78 74 20 6f 66  n the context of
10df0 20 6f 75 72 0d 0a 20 20 20 20 20 20 23 20 20 20   our..      #   
10e00 20 20 20 20 63 61 6c 6c 65 72 2e 20 20 54 68 65      caller.  The
10e10 20 68 61 6e 64 6c 65 20 74 6f 20 74 68 65 20 64   handle to the d
10e20 61 74 61 62 61 73 65 20 70 72 65 76 69 6f 75 73  atabase previous
10e30 6c 79 20 6f 70 65 6e 65 64 20 76 69 61 20 74 68  ly opened via th
10e40 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  e..      #      
10e50 20 5b 73 65 74 75 70 44 62 5d 20 70 72 6f 63 65   [setupDb] proce
10e60 64 75 72 65 20 73 68 6f 75 6c 64 20 62 65 20 73  dure should be s
10e70 74 6f 72 65 64 20 74 68 65 72 65 2e 0d 0a 20 20  tored there...  
10e80 20 20 20 20 23 0d 0a 20 20 20 20 20 20 75 70 76      #..      upv
10e90 61 72 20 31 20 24 76 61 72 4e 61 6d 65 20 64 62  ar 1 $varName db
10ea0 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  ....      #..   
10eb0 20 20 20 23 20 4e 4f 54 45 3a 20 43 6c 6f 73 65     # NOTE: Close
10ec0 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
10ed0 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
10ee0 6e 6f 77 2e 20 20 54 68 69 73 20 73 68 6f 75 6c  now.  This shoul
10ef0 64 20 61 6c 6c 6f 77 20 75 73 0d 0a 20 20 20 20  d allow us..    
10f00 20 20 23 20 20 20 20 20 20 20 74 6f 20 64 65 6c    #       to del
10f10 65 74 65 20 74 68 65 20 75 6e 64 65 72 6c 79 69  ete the underlyi
10f20 6e 67 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ng database file
10f30 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
10f40 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73    if {[info exis
10f50 74 73 20 64 62 5d 20 26 26 20 5b 63 61 74 63 68  ts db] && [catch
10f60 20 7b 73 71 6c 20 63 6c 6f 73 65 20 24 64 62 7d   {sql close $db}
10f70 20 65 72 72 6f 72 5d 7d 20 74 68 65 6e 20 7b 0d   error]} then {.
10f80 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
10f90 20 20 20 20 23 20 4e 4f 54 45 3a 20 57 65 20 73      # NOTE: We s
10fa0 6f 6d 65 68 6f 77 20 66 61 69 6c 65 64 20 74 6f  omehow failed to
10fb0 20 63 6c 6f 73 65 20 74 68 65 20 64 61 74 61 62   close the datab
10fc0 61 73 65 2c 20 72 65 70 6f 72 74 20 77 68 79 2e  ase, report why.
10fd0 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
10fe0 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
10ff0 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
11000 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
11010 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e        "==== WARN
11020 49 4e 47 3a 20 66 61 69 6c 65 64 20 74 6f 20 63  ING: failed to c
11030 6c 6f 73 65 20 64 61 74 61 62 61 73 65 20 5c 22  lose database \"
11040 22 20 24 64 62 20 22 5c 22 2c 20 65 72 72 6f 72  " $db "\", error
11050 3a 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  : " \..         
11060 20 20 20 5c 6e 5c 74 20 24 65 72 72 6f 72 20 5c     \n\t $error \
11070 6e 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  n]..      }.... 
11080 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
11090 4e 4f 54 45 3a 20 46 69 72 73 74 2c 20 73 65 65  NOTE: First, see
110a0 20 69 66 20 6f 75 72 20 63 61 6c 6c 65 72 20 68   if our caller h
110b0 61 73 20 72 65 71 75 65 73 74 65 64 20 61 6e 20  as requested an 
110c0 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
110d0 73 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  se...      #..  
110e0 20 20 20 20 73 65 74 20 69 73 4d 65 6d 6f 72 79      set isMemory
110f0 20 5b 69 73 4d 65 6d 6f 72 79 44 62 20 24 66 69   [isMemoryDb $fi
11100 6c 65 4e 61 6d 65 5d 0d 0a 0d 0a 20 20 20 20 20  leName]....     
11110 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
11120 3a 20 42 75 69 6c 64 20 74 68 65 20 66 75 6c 6c  : Build the full
11130 20 70 61 74 68 20 74 6f 20 74 68 65 20 64 61 74   path to the dat
11140 61 62 61 73 65 20 66 69 6c 65 20 6e 61 6d 65 2e  abase file name.
11150 20 20 46 6f 72 20 6e 6f 77 2c 20 61 6c 6c 20 74    For now, all t
11160 65 73 74 0d 0a 20 20 20 20 20 20 23 20 20 20 20  est..      #    
11170 20 20 20 64 61 74 61 62 61 73 65 20 66 69 6c 65     database file
11180 73 20 61 72 65 20 73 74 6f 72 65 64 20 69 6e 20  s are stored in 
11190 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 64 69  the temporary di
111a0 72 65 63 74 6f 72 79 2e 0d 0a 20 20 20 20 20 20  rectory...      
111b0 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 21 24 69  #..      if {!$i
111c0 73 4d 65 6d 6f 72 79 20 26 26 20 24 71 75 61 6c  sMemory && $qual
111d0 69 66 79 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  ify} then {..   
111e0 20 20 20 20 20 73 65 74 20 66 69 6c 65 4e 61 6d       set fileNam
111f0 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5b 67 65  e [file join [ge
11200 74 44 61 74 61 62 61 73 65 44 69 72 65 63 74 6f  tDatabaseDirecto
11210 72 79 5d 20 5b 66 69 6c 65 20 74 61 69 6c 20 24  ry] [file tail $
11220 66 69 6c 65 4e 61 6d 65 5d 5d 0d 0a 20 20 20 20  fileName]]..    
11230 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a    }....      #..
11240 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68        # NOTE: Ch
11250 65 63 6b 20 69 66 20 74 68 65 20 66 69 6c 65 20  eck if the file 
11260 73 74 69 6c 6c 20 65 78 69 73 74 73 2e 0d 0a 20  still exists... 
11270 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66       #..      if
11280 20 7b 21 24 69 73 4d 65 6d 6f 72 79 20 26 26 20   {!$isMemory && 
11290 24 64 65 6c 65 74 65 20 26 26 20 5b 66 69 6c 65  $delete && [file
112a0 20 65 78 69 73 74 73 20 24 66 69 6c 65 4e 61 6d   exists $fileNam
112b0 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  e]} then {..    
112c0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
112d0 20 4e 4f 54 45 3a 20 53 6b 69 70 20 64 65 6c 65   NOTE: Skip dele
112e0 74 69 6e 67 20 64 61 74 61 62 61 73 65 20 66 69  ting database fi
112f0 6c 65 73 20 69 66 20 73 6f 6d 65 62 6f 64 79 20  les if somebody 
11300 73 65 74 73 20 74 68 65 20 67 6c 6f 62 61 6c 0d  sets the global.
11310 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
11320 20 76 61 72 69 61 62 6c 65 20 74 6f 20 70 72 65   variable to pre
11330 76 65 6e 74 20 69 74 2e 0d 0a 20 20 20 20 20 20  vent it...      
11340 20 20 23 0d 0a 20 20 20 20 20 20 20 20 69 66 20    #..        if 
11350 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a  {![info exists :
11360 3a 6e 6f 28 63 6c 65 61 6e 75 70 44 62 46 69 6c  :no(cleanupDbFil
11370 65 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  e)]} then {..   
11380 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
11390 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 74 74 65      # NOTE: Atte
113a0 6d 70 74 20 74 6f 20 64 65 6c 65 74 65 20 74 68  mpt to delete th
113b0 65 20 74 65 73 74 20 64 61 74 61 62 61 73 65 20  e test database 
113c0 66 69 6c 65 20 6e 6f 77 2e 0d 0a 20 20 20 20 20  file now...     
113d0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
113e0 20 20 69 66 20 7b 5b 73 65 74 20 63 6f 64 65 20    if {[set code 
113f0 5b 63 61 74 63 68 20 7b 66 69 6c 65 20 64 65 6c  [catch {file del
11400 65 74 65 20 24 66 69 6c 65 4e 61 6d 65 7d 20 65  ete $fileName} e
11410 72 72 6f 72 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a  rror]]} then {..
11420 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20              #.. 
11430 20 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54             # NOT
11440 45 3a 20 57 65 20 73 6f 6d 65 68 6f 77 20 66 61  E: We somehow fa
11450 69 6c 65 64 20 74 6f 20 64 65 6c 65 74 65 20 74  iled to delete t
11460 68 65 20 66 69 6c 65 2c 20 72 65 70 6f 72 74 20  he file, report 
11470 77 68 79 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  why...          
11480 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20    #..           
11490 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
114a0 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
114b0 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
114c0 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e        "==== WARN
114d0 49 4e 47 3a 20 66 61 69 6c 65 64 20 74 6f 20 64  ING: failed to d
114e0 65 6c 65 74 65 20 64 61 74 61 62 61 73 65 20 66  elete database f
114f0 69 6c 65 20 5c 22 22 20 24 66 69 6c 65 4e 61 6d  ile \"" $fileNam
11500 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e \..           
11510 20 20 20 20 20 22 5c 22 20 64 75 72 69 6e 67 20       "\" during 
11520 63 6c 65 61 6e 75 70 2c 20 65 72 72 6f 72 3a 20  cleanup, error: 
11530 22 20 5c 6e 5c 74 20 24 65 72 72 6f 72 20 5c 6e  " \n\t $error \n
11540 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  ]..          }..
11550 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b          } else {
11560 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20  ..          #.. 
11570 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a           # NOTE:
11580 20 53 68 6f 77 20 74 68 61 74 20 77 65 20 73 6b   Show that we sk
11590 69 70 70 65 64 20 64 65 6c 65 74 69 6e 67 20 74  ipped deleting t
115a0 68 65 20 66 69 6c 65 2e 0d 0a 20 20 20 20 20 20  he file...      
115b0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
115c0 20 73 65 74 20 63 6f 64 65 20 30 0d 0a 0d 0a 20   set code 0.... 
115d0 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
115e0 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b  ::test_channel [
115f0 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
11600 20 20 20 20 20 20 20 20 20 20 20 20 22 3d 3d 3d              "===
11610 3d 20 57 41 52 4e 49 4e 47 3a 20 73 6b 69 70 70  = WARNING: skipp
11620 65 64 20 64 65 6c 65 74 69 6e 67 20 64 61 74 61  ed deleting data
11630 62 61 73 65 20 66 69 6c 65 20 5c 22 22 20 24 66  base file \"" $f
11640 69 6c 65 4e 61 6d 65 20 5c 0d 0a 20 20 20 20 20  ileName \..     
11650 20 20 20 20 20 20 20 20 20 22 5c 22 20 64 75 72           "\" dur
11660 69 6e 67 20 63 6c 65 61 6e 75 70 5c 6e 22 5d 0d  ing cleanup\n"].
11670 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  .        }..    
11680 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
11690 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
116a0 20 4e 4f 54 45 3a 20 54 68 65 20 66 69 6c 65 20   NOTE: The file 
116b0 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2c 20  does not exist, 
116c0 73 75 63 63 65 73 73 21 0d 0a 20 20 20 20 20 20  success!..      
116d0 20 20 23 0d 0a 20 20 20 20 20 20 20 20 73 65 74    #..        set
116e0 20 63 6f 64 65 20 30 0d 0a 20 20 20 20 20 20 7d   code 0..      }
116f0 0d 0a 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ....      return
11700 20 24 63 6f 64 65 0d 0a 20 20 20 20 7d 0d 0a 0c   $code..    }...
11710 0d 0a 20 20 20 20 70 72 6f 63 20 73 65 74 75 70  ..    proc setup
11720 44 62 49 6e 74 65 72 72 75 70 74 43 61 6c 6c 62  DbInterruptCallb
11730 61 63 6b 20 7b 20 63 68 61 6e 6e 65 6c 20 6c 6f  ack { channel lo
11740 67 20 7d 20 7b 0d 0a 20 20 20 20 20 20 74 70 75  g } {..      tpu
11750 74 73 20 24 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d  ts $channel "---
11760 2d 20 73 65 74 74 69 6e 67 20 75 70 20 64 65 62  - setting up deb
11770 75 67 67 65 72 20 69 6e 74 65 72 72 75 70 74 20  ugger interrupt 
11780 63 61 6c 6c 62 61 63 6b 2e 2e 2e 20 22 0d 0a 0d  callback... "...
11790 0a 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63  .      if {[catc
117a0 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  h {..        #..
117b0 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
117c0 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 73 63  Make sure the sc
117d0 72 69 70 74 20 64 65 62 75 67 67 65 72 20 61 6e  ript debugger an
117e0 64 20 74 68 65 20 69 73 6f 6c 61 74 65 64 20 69  d the isolated i
117f0 6e 74 65 72 70 72 65 74 65 72 20 61 72 65 0d 0a  nterpreter are..
11800 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
11810 73 65 74 75 70 20 61 6e 64 20 72 65 61 64 79 20  setup and ready 
11820 66 6f 72 20 75 73 65 2e 0d 0a 20 20 20 20 20 20  for use...      
11830 20 20 23 0d 0a 20 20 20 20 20 20 20 20 64 65 62    #..        deb
11840 75 67 20 73 65 74 75 70 20 74 72 75 65 20 74 72  ug setup true tr
11850 75 65 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d  ue....        #.
11860 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
11870 20 4c 6f 61 64 20 74 68 65 20 6e 65 63 65 73 73   Load the necess
11880 61 72 79 20 70 61 63 6b 61 67 65 73 20 69 6e 74  ary packages int
11890 6f 20 74 68 65 20 69 73 6f 6c 61 74 65 64 20 69  o the isolated i
118a0 6e 74 65 72 70 72 65 74 65 72 2e 0d 0a 20 20 20  nterpreter...   
118b0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
118c0 64 65 62 75 67 20 65 76 61 6c 20 7b 0d 0a 20 20  debug eval {..  
118d0 20 20 20 20 20 20 20 20 70 61 63 6b 61 67 65 20          package 
118e0 72 65 71 75 69 72 65 20 45 61 67 6c 65 0d 0a 20  require Eagle.. 
118f0 20 20 20 20 20 20 20 20 20 70 61 63 6b 61 67 65           package
11900 20 72 65 71 75 69 72 65 20 45 61 67 6c 65 2e 4c   require Eagle.L
11910 69 62 72 61 72 79 0d 0a 20 20 20 20 20 20 20 20  ibrary..        
11920 20 20 70 61 63 6b 61 67 65 20 72 65 71 75 69 72    package requir
11930 65 20 45 61 67 6c 65 2e 54 65 73 74 0d 0a 20 20  e Eagle.Test..  
11940 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
11950 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
11960 4e 4f 54 45 3a 20 43 6f 70 79 20 74 68 65 20 6e  NOTE: Copy the n
11970 65 63 65 73 73 61 72 79 20 76 61 72 69 61 62 6c  ecessary variabl
11980 65 73 20 69 6e 74 6f 20 74 68 65 20 69 73 6f 6c  es into the isol
11990 61 74 65 64 20 69 6e 74 65 72 70 72 65 74 65 72  ated interpreter
119a0 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
119b0 20 20 20 20 20 20 64 65 62 75 67 20 69 6e 76 6f        debug invo
119c0 6b 65 20 30 20 73 65 74 20 3a 3a 74 65 73 74 5f  ke 0 set ::test_
119d0 63 68 61 6e 6e 65 6c 20 24 63 68 61 6e 6e 65 6c  channel $channel
119e0 3b 20 23 20 4e 4f 54 45 3a 20 46 6f 72 20 5b 74  ; # NOTE: For [t
119f0 70 75 74 73 5d 2e 0d 0a 20 20 20 20 20 20 20 20  puts]...        
11a00 64 65 62 75 67 20 69 6e 76 6f 6b 65 20 30 20 73  debug invoke 0 s
11a10 65 74 20 3a 3a 74 65 73 74 5f 6c 6f 67 20 24 6c  et ::test_log $l
11a20 6f 67 3b 20 23 20 4e 4f 54 45 3a 20 46 6f 72 20  og; # NOTE: For 
11a30 5b 74 6c 6f 67 5d 2e 0d 0a 0d 0a 20 20 20 20 20  [tlog].....     
11a40 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
11a50 4e 4f 54 45 3a 20 49 6e 73 74 61 6c 6c 20 74 68  NOTE: Install th
11a60 65 20 63 61 6c 6c 62 61 63 6b 20 73 63 72 69 70  e callback scrip
11a70 74 20 74 6f 20 62 65 20 65 76 61 6c 75 61 74 65  t to be evaluate
11a80 64 20 69 6e 20 74 68 65 20 69 73 6f 6c 61 74 65  d in the isolate
11a90 64 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  d..        #    
11aa0 20 20 20 69 6e 74 65 72 70 72 65 74 65 72 20 77     interpreter w
11ab0 68 65 6e 20 74 68 69 73 20 69 6e 74 65 72 70 72  hen this interpr
11ac0 65 74 65 72 20 69 73 20 69 6e 74 65 72 72 75 70  eter is interrup
11ad0 74 65 64 20 62 79 20 73 63 72 69 70 74 0d 0a 20  ted by script.. 
11ae0 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63         #       c
11af0 61 6e 63 65 6c 6c 61 74 69 6f 6e 2c 20 65 74 63  ancellation, etc
11b00 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
11b10 20 20 20 20 20 20 64 65 62 75 67 20 63 61 6c 6c        debug call
11b20 62 61 63 6b 20 61 70 70 6c 79 20 7b 7b 73 65 6e  back apply {{sen
11b30 64 65 72 20 65 7d 20 7b 0d 0a 20 20 20 20 20 20  der e} {..      
11b40 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
11b50 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 69   # NOTE: Check i
11b60 66 20 74 68 69 73 20 63 61 6c 6c 62 61 63 6b 20  f this callback 
11b70 69 73 20 6f 6e 65 20 74 68 61 74 20 77 65 20 63  is one that we c
11b80 61 72 65 20 61 62 6f 75 74 2e 0d 0a 20 20 20 20  are about...    
11b90 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
11ba0 20 20 20 69 66 20 7b 22 43 61 6e 63 65 6c 65 64     if {"Canceled
11bb0 22 20 69 6e 20 5b 73 70 6c 69 74 20 5b 24 65 20  " in [split [$e 
11bc0 49 6e 74 65 72 72 75 70 74 54 79 70 65 5d 20 22  InterruptType] "
11bd0 2c 20 22 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  , "]} then {..  
11be0 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
11bf0 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a           # NOTE:
11c00 20 49 74 65 72 61 74 65 20 74 68 72 6f 75 67 68   Iterate through
11c10 20 61 6c 6c 20 64 61 74 61 62 61 73 65 20 63 6f   all database co
11c20 6e 6e 65 63 74 69 6f 6e 73 20 6b 6e 6f 77 6e 20  nnections known 
11c30 74 6f 20 74 68 65 0d 0a 20 20 20 20 20 20 20 20  to the..        
11c40 20 20 20 20 23 20 20 20 20 20 20 20 70 61 72 65      #       pare
11c50 6e 74 20 69 6e 74 65 72 70 72 65 74 65 72 2e 0d  nt interpreter..
11c60 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a  .            #..
11c70 20 20 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65              obje
11c80 63 74 20 66 6f 72 65 61 63 68 20 2d 61 6c 69 61  ct foreach -alia
11c90 73 20 70 61 69 72 20 5c 0d 0a 20 20 20 20 20 20  s pair \..      
11ca0 20 20 20 20 20 20 20 20 20 20 5b 6f 62 6a 65 63            [objec
11cb0 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20  t invoke -flags 
11cc0 2b 4e 6f 6e 50 75 62 6c 69 63 20 24 65 20 49 6e  +NonPublic $e In
11cd0 74 65 72 70 72 65 74 65 72 2e 63 6f 6e 6e 65 63  terpreter.connec
11ce0 74 69 6f 6e 73 5d 20 7b 0d 0a 20 20 20 20 20 20  tions] {..      
11cf0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
11d00 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a           # NOTE:
11d10 20 41 74 74 65 6d 70 74 20 74 6f 20 63 61 6e 63   Attempt to canc
11d20 65 6c 20 61 6e 79 20 53 51 4c 20 71 75 65 72 69  el any SQL queri
11d30 65 73 20 69 6e 20 70 72 6f 67 72 65 73 73 20 6f  es in progress o
11d40 6e 20 74 68 69 73 0d 0a 20 20 20 20 20 20 20 20  n this..        
11d50 20 20 20 20 20 20 23 20 20 20 20 20 20 20 64 61        #       da
11d60 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
11d70 6e 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  n...            
11d80 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20    #..           
11d90 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 24     if {[catch {$
11da0 70 61 69 72 20 56 61 6c 75 65 2e 43 61 6e 63 65  pair Value.Cance
11db0 6c 7d 20 65 72 72 6f 72 5d 7d 20 74 68 65 6e 20  l} error]} then 
11dc0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
11dd0 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
11de0 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  _channel [append
11df0 41 72 67 73 20 5c 6e 20 5c 0d 0a 20 20 20 20 20  Args \n \..     
11e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
11e10 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61  ==== WARNING: fa
11e20 69 6c 65 64 20 74 6f 20 63 61 6e 63 65 6c 20 71  iled to cancel q
11e30 75 65 72 79 20 66 6f 72 20 63 6f 6e 6e 65 63 74  uery for connect
11e40 69 6f 6e 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20  ion \"" \..     
11e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b                 [
11e60 24 70 61 69 72 20 4b 65 79 5d 20 22 5c 22 2c 20  $pair Key] "\", 
11e70 65 72 72 6f 72 3a 20 22 20 5c 6e 5c 74 20 24 65  error: " \n\t $e
11e80 72 72 6f 72 20 5c 6e 5d 0d 0a 20 20 20 20 20 20  rror \n]..      
11e90 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
11ea0 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
11eb0 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d      }..        }
11ec0 7d 0d 0a 20 20 20 20 20 20 7d 20 65 72 72 6f 72  }..      } error
11ed0 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  ] == 0} then {..
11ee0 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74          addConst
11ef0 72 61 69 6e 74 20 69 6e 74 65 72 72 75 70 74 43  raint interruptC
11f00 61 6c 6c 62 61 63 6b 2e 73 71 6c 69 74 65 33 0d  allback.sqlite3.
11f10 0a 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73  ...        tputs
11f20 20 24 63 68 61 6e 6e 65 6c 20 79 65 73 5c 6e 0d   $channel yes\n.
11f30 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d  .      } else {.
11f40 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24  .        tputs $
11f50 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
11f60 72 67 73 20 22 6e 6f 2c 20 65 72 72 6f 72 3a 20  rgs "no, error: 
11f70 22 20 5c 6e 5c 74 20 24 65 72 72 6f 72 20 5c 6e  " \n\t $error \n
11f80 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  ]..      }..    
11f90 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 63  }.....    proc c
11fa0 6c 65 61 6e 75 70 46 69 6c 65 20 7b 20 66 69 6c  leanupFile { fil
11fb0 65 4e 61 6d 65 20 7b 63 6f 6c 6c 65 63 74 20 74  eName {collect t
11fc0 72 75 65 7d 20 7b 66 6f 72 63 65 20 66 61 6c 73  rue} {force fals
11fd0 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d  e} } {..      #.
11fe0 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41  .      # NOTE: A
11ff0 74 74 65 6d 70 74 20 74 6f 20 66 6f 72 63 65 20  ttempt to force 
12000 61 6c 6c 20 70 65 6e 64 69 6e 67 20 22 67 61 72  all pending "gar
12010 62 61 67 65 22 20 6f 62 6a 65 63 74 73 20 74 6f  bage" objects to
12020 20 62 65 20 63 6f 6c 6c 65 63 74 65 64 2c 0d 0a   be collected,..
12030 20 20 20 20 20 20 23 20 20 20 20 20 20 20 69 6e        #       in
12040 63 6c 75 64 69 6e 67 20 53 51 4c 69 74 65 20 73  cluding SQLite s
12050 74 61 74 65 6d 65 6e 74 73 20 61 6e 64 20 62 61  tatements and ba
12060 63 6b 75 70 20 6f 62 6a 65 63 74 73 3b 20 74 68  ckup objects; th
12070 69 73 20 73 68 6f 75 6c 64 20 61 6c 6c 6f 77 0d  is should allow.
12080 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74  .      #       t
12090 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 64 61  he underlying da
120a0 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 62  tabase file to b
120b0 65 20 64 65 6c 65 74 65 64 2e 0d 0a 20 20 20 20  e deleted...    
120c0 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 24    #..      if {$
120d0 63 6f 6c 6c 65 63 74 7d 20 74 68 65 6e 20 7b 0d  collect} then {.
120e0 0a 20 20 20 20 20 20 20 20 63 6f 6c 6c 65 63 74  .        collect
120f0 47 61 72 62 61 67 65 20 24 3a 3a 74 65 73 74 5f  Garbage $::test_
12100 63 68 61 6e 6e 65 6c 0d 0a 20 20 20 20 20 20 7d  channel..      }
12110 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  ....      #..   
12120 20 20 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b     # NOTE: Check
12130 20 69 66 20 74 68 65 20 66 69 6c 65 20 73 74 69   if the file sti
12140 6c 6c 20 65 78 69 73 74 73 2e 0d 0a 20 20 20 20  ll exists...    
12150 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b    #..      if {[
12160 66 69 6c 65 20 65 78 69 73 74 73 20 24 66 69 6c  file exists $fil
12170 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a  eName]} then {..
12180 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
12190 20 20 20 23 20 4e 4f 54 45 3a 20 53 6b 69 70 20     # NOTE: Skip 
121a0 64 65 6c 65 74 69 6e 67 20 74 65 73 74 20 66 69  deleting test fi
121b0 6c 65 73 20 69 66 20 73 6f 6d 65 62 6f 64 79 20  les if somebody 
121c0 73 65 74 73 20 74 68 65 20 67 6c 6f 62 61 6c 20  sets the global 
121d0 76 61 72 69 61 62 6c 65 0d 0a 20 20 20 20 20 20  variable..      
121e0 20 20 23 20 20 20 20 20 20 20 74 6f 20 70 72 65    #       to pre
121f0 76 65 6e 74 20 69 74 2e 0d 0a 20 20 20 20 20 20  vent it...      
12200 20 20 23 0d 0a 20 20 20 20 20 20 20 20 69 66 20    #..        if 
12210 7b 24 66 6f 72 63 65 20 7c 7c 20 21 5b 69 6e 66  {$force || ![inf
12220 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 63 6c  o exists ::no(cl
12230 65 61 6e 75 70 46 69 6c 65 29 5d 7d 20 74 68 65  eanupFile)]} the
12240 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 23  n {..          #
12250 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f  ..          # NO
12260 54 45 3a 20 41 74 74 65 6d 70 74 20 74 6f 20 64  TE: Attempt to d
12270 65 6c 65 74 65 20 74 68 65 20 74 65 73 74 20 66  elete the test f
12280 69 6c 65 20 6e 6f 77 2e 0d 0a 20 20 20 20 20 20  ile now...      
12290 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
122a0 20 69 66 20 7b 5b 73 65 74 20 63 6f 64 65 20 5b   if {[set code [
122b0 63 61 74 63 68 20 7b 66 69 6c 65 20 64 65 6c 65  catch {file dele
122c0 74 65 20 24 66 69 6c 65 4e 61 6d 65 7d 20 65 72  te $fileName} er
122d0 72 6f 72 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  ror]]} then {.. 
122e0 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
122f0 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45            # NOTE
12300 3a 20 57 65 20 73 6f 6d 65 68 6f 77 20 66 61 69  : We somehow fai
12310 6c 65 64 20 74 6f 20 64 65 6c 65 74 65 20 74 68  led to delete th
12320 65 20 66 69 6c 65 2c 20 72 65 70 6f 72 74 20 77  e file, report w
12330 68 79 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20  hy...           
12340 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   #..            
12350 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
12360 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
12370 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
12380 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49       "==== WARNI
12390 4e 47 3a 20 66 61 69 6c 65 64 20 74 6f 20 64 65  NG: failed to de
123a0 6c 65 74 65 20 74 65 73 74 20 66 69 6c 65 20 5c  lete test file \
123b0 22 22 20 24 66 69 6c 65 4e 61 6d 65 20 5c 0d 0a  "" $fileName \..
123c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
123d0 22 5c 22 20 64 75 72 69 6e 67 20 63 6c 65 61 6e  "\" during clean
123e0 75 70 2c 20 65 72 72 6f 72 3a 20 22 20 5c 6e 5c  up, error: " \n\
123f0 74 20 24 65 72 72 6f 72 20 5c 6e 5d 0d 0a 20 20  t $error \n]..  
12400 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
12410 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
12420 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
12430 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 68 6f 77      # NOTE: Show
12440 20 74 68 61 74 20 77 65 20 73 6b 69 70 70 65 64   that we skipped
12450 20 64 65 6c 65 74 69 6e 67 20 74 68 65 20 66 69   deleting the fi
12460 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23  le...          #
12470 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20  ..          set 
12480 63 6f 64 65 20 30 0d 0a 0d 0a 20 20 20 20 20 20  code 0....      
12490 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
124a0 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e  t_channel [appen
124b0 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
124c0 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52         "==== WAR
124d0 4e 49 4e 47 3a 20 73 6b 69 70 70 65 64 20 64 65  NING: skipped de
124e0 6c 65 74 69 6e 67 20 74 65 73 74 20 66 69 6c 65  leting test file
124f0 20 5c 22 22 20 24 66 69 6c 65 4e 61 6d 65 20 5c   \"" $fileName \
12500 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
12510 22 5c 22 20 64 75 72 69 6e 67 20 63 6c 65 61 6e  "\" during clean
12520 75 70 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20  up\n"]..        
12530 7d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20  }..      } else 
12540 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
12550 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68        # NOTE: Th
12560 65 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20  e file does not 
12570 65 78 69 73 74 2c 20 73 75 63 63 65 73 73 21 0d  exist, success!.
12580 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
12590 20 20 20 20 73 65 74 20 63 6f 64 65 20 30 0d 0a      set code 0..
125a0 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
125b0 20 72 65 74 75 72 6e 20 24 63 6f 64 65 0d 0a 20   return $code.. 
125c0 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
125d0 63 20 63 6f 6c 6c 65 63 74 47 61 72 62 61 67 65  c collectGarbage
125e0 20 7b 20 63 68 61 6e 6e 65 6c 20 7b 6d 69 6c 6c   { channel {mill
125f0 69 73 65 63 6f 6e 64 73 20 31 30 30 30 7d 20 7b  iseconds 1000} {
12600 71 75 69 65 74 20 74 72 75 65 7d 20 7d 20 7b 0d  quiet true} } {.
12610 0a 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63  .      if {[catc
12620 68 20 7b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65  h {object invoke
12630 20 47 43 20 47 65 74 54 6f 74 61 6c 4d 65 6d 6f   GC GetTotalMemo
12640 72 79 20 66 61 6c 73 65 7d 20 72 65 73 75 6c 74  ry false} result
12650 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  ] == 0} then {..
12660 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75          if {!$qu
12670 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  iet} then {..   
12680 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
12690 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
126a0 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
126b0 20 20 20 22 2d 2d 2d 2d 20 6d 65 6d 6f 72 79 20     "---- memory 
126c0 69 6e 20 75 73 65 20 62 79 20 74 68 65 20 43 4c  in use by the CL
126d0 52 20 62 65 66 6f 72 65 20 63 6f 6c 6c 65 63 74  R before collect
126e0 69 6f 6e 2e 2e 2e 20 22 20 5c 0d 0a 20 20 20 20  ion... " \..    
126f0 20 20 20 20 20 20 20 20 20 20 24 72 65 73 75 6c            $resul
12700 74 20 22 20 62 79 74 65 73 5c 6e 22 5d 0d 0a 20  t " bytes\n"].. 
12710 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
12720 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
12730 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
12740 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
12750 20 20 20 20 20 20 20 20 20 20 20 20 22 3d 3d 3d              "===
12760 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65  = WARNING: faile
12770 64 20 74 6f 20 67 65 74 20 43 4c 52 20 6d 65 6d  d to get CLR mem
12780 6f 72 79 20 75 73 61 67 65 2c 20 65 72 72 6f 72  ory usage, error
12790 3a 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  : " \..         
127a0 20 20 20 5c 6e 5c 74 20 24 72 65 73 75 6c 74 20     \n\t $result 
127b0 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a  \n]..      }....
127c0 20 20 20 20 20 20 23 23 23 23 23 23 23 23 23 23        ##########
127d0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
127e0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
127f0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
12800 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0d  ###############.
12810 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
12820 20 20 23 20 4e 4f 54 45 3a 20 52 65 70 65 61 74    # NOTE: Repeat
12830 65 64 6c 79 20 61 74 74 65 6d 70 74 20 74 6f 20  edly attempt to 
12840 63 6f 6c 6c 65 63 74 20 67 61 72 62 61 67 65 20  collect garbage 
12850 75 6e 74 69 6c 20 74 68 65 20 61 6c 6c 6f 74 74  until the allott
12860 65 64 20 6e 75 6d 62 65 72 0d 0a 20 20 20 20 20  ed number..     
12870 20 23 20 20 20 20 20 20 20 6f 66 20 6d 69 6c 6c   #       of mill
12880 69 73 65 63 6f 6e 64 73 20 68 61 73 20 65 6c 61  iseconds has ela
12890 70 73 65 64 2e 20 20 41 6c 77 61 79 73 20 61 74  psed.  Always at
128a0 74 65 6d 70 74 20 74 6f 20 63 6f 6c 6c 65 63 74  tempt to collect
128b0 20 67 61 72 62 61 67 65 0d 0a 20 20 20 20 20 20   garbage..      
128c0 23 20 20 20 20 20 20 20 61 74 20 6c 65 61 73 74  #       at least
128d0 20 6f 6e 63 65 2e 0d 0a 20 20 20 20 20 20 23 0d   once...      #.
128e0 0a 20 20 20 20 20 20 73 65 74 20 73 74 61 72 74  .      set start
128f0 20 5b 63 6c 6f 63 6b 20 73 65 63 6f 6e 64 73 5d   [clock seconds]
12900 0d 0a 20 20 20 20 20 20 73 65 74 20 73 74 6f 70  ..      set stop
12910 20 5b 65 78 70 72 20 7b 24 73 74 61 72 74 20 2b   [expr {$start +
12920 20 28 24 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20   ($milliseconds 
12930 2f 20 31 30 30 30 29 7d 5d 0d 0a 0d 0a 20 20 20  / 1000)}]....   
12940 20 20 20 64 6f 20 7b 0d 0a 20 20 20 20 20 20 20     do {..       
12950 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
12960 54 45 3a 20 41 74 74 65 6d 70 74 20 74 6f 20 66  TE: Attempt to f
12970 6f 72 63 65 20 61 20 66 75 6c 6c 20 67 61 72 62  orce a full garb
12980 61 67 65 20 63 6f 6c 6c 65 63 74 69 6f 6e 20 6e  age collection n
12990 6f 77 2e 20 20 52 65 70 6f 72 74 20 61 6e 79 0d  ow.  Report any.
129a0 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
129b0 20 65 72 72 6f 72 20 74 68 61 74 20 69 73 20 65   error that is e
129c0 6e 63 6f 75 6e 74 65 72 65 64 20 69 66 20 77 65  ncountered if we
129d0 20 66 61 69 6c 2e 0d 0a 20 20 20 20 20 20 20 20   fail...        
129e0 23 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b  #..        if {[
129f0 63 61 74 63 68 20 7b 6f 62 6a 65 63 74 20 69 6e  catch {object in
12a00 76 6f 6b 65 20 47 43 20 47 65 74 54 6f 74 61 6c  voke GC GetTotal
12a10 4d 65 6d 6f 72 79 20 74 72 75 65 7d 20 65 72 72  Memory true} err
12a20 6f 72 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  or]} then {..   
12a30 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
12a40 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
12a50 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
12a60 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47     "==== WARNING
12a70 3a 20 66 61 69 6c 65 64 20 66 75 6c 6c 20 67 61  : failed full ga
12a80 72 62 61 67 65 20 63 6f 6c 6c 65 63 74 69 6f 6e  rbage collection
12a90 2c 20 65 72 72 6f 72 3a 20 22 20 5c 0d 0a 20 20  , error: " \..  
12aa0 20 20 20 20 20 20 20 20 20 20 20 20 5c 6e 5c 74              \n\t
12ab0 20 24 65 72 72 6f 72 20 5c 6e 5d 0d 0a 20 20 20   $error \n]..   
12ac0 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
12ad0 20 20 73 65 74 20 6e 6f 77 20 5b 63 6c 6f 63 6b    set now [clock
12ae0 20 73 65 63 6f 6e 64 73 5d 0d 0a 20 20 20 20 20   seconds]..     
12af0 20 7d 20 77 68 69 6c 65 20 7b 24 73 74 61 72 74   } while {$start
12b00 20 3c 3d 20 24 6e 6f 77 20 26 26 20 24 6e 6f 77   <= $now && $now
12b10 20 3c 20 24 73 74 6f 70 7d 0d 0a 0d 0a 20 20 20   < $stop}....   
12b20 20 20 20 23 23 23 23 23 23 23 23 23 23 23 23 23     #############
12b30 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
12b40 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
12b50 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
12b60 23 23 23 23 23 23 23 23 23 23 23 23 0d 0a 0d 0a  ############....
12b70 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68        if {[catch
12b80 20 7b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20   {object invoke 
12b90 47 43 20 47 65 74 54 6f 74 61 6c 4d 65 6d 6f 72  GC GetTotalMemor
12ba0 79 20 66 61 6c 73 65 7d 20 72 65 73 75 6c 74 5d  y false} result]
12bb0 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20   == 0} then {.. 
12bc0 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69         if {!$qui
12bd0 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  et} then {..    
12be0 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
12bf0 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
12c00 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
12c10 20 20 22 2d 2d 2d 2d 20 6d 65 6d 6f 72 79 20 69    "---- memory i
12c20 6e 20 75 73 65 20 62 79 20 74 68 65 20 43 4c 52  n use by the CLR
12c30 20 61 66 74 65 72 20 63 6f 6c 6c 65 63 74 69 6f   after collectio
12c40 6e 2e 2e 2e 20 22 20 5c 0d 0a 20 20 20 20 20 20  n... " \..      
12c50 20 20 20 20 20 20 20 20 24 72 65 73 75 6c 74 20          $result 
12c60 22 20 62 79 74 65 73 5c 6e 22 5d 0d 0a 20 20 20  " bytes\n"]..   
12c70 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 20       }..      } 
12c80 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
12c90 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b  tputs $channel [
12ca0 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
12cb0 20 20 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20            "==== 
12cc0 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20  WARNING: failed 
12cd0 74 6f 20 67 65 74 20 43 4c 52 20 6d 65 6d 6f 72  to get CLR memor
12ce0 79 20 75 73 61 67 65 2c 20 65 72 72 6f 72 3a 20  y usage, error: 
12cf0 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  " \..           
12d00 20 5c 6e 5c 74 20 24 72 65 73 75 6c 74 20 5c 6e   \n\t $result \n
12d10 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  ]..      }..    
12d20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67  }.....    proc g
12d30 65 74 53 51 4c 69 74 65 48 61 6e 64 6c 65 43 6f  etSQLiteHandleCo
12d40 75 6e 74 73 20 7b 20 63 68 61 6e 6e 65 6c 20 7b  unts { channel {
12d50 71 75 69 65 74 20 66 61 6c 73 65 7d 20 7d 20 7b  quiet false} } {
12d60 0d 0a 20 20 20 20 20 20 73 65 74 20 72 65 73 75  ..      set resu
12d70 6c 74 20 5b 6c 69 73 74 5d 0d 0a 0d 0a 20 20 20  lt [list]....   
12d80 20 20 20 69 66 20 7b 5b 68 61 76 65 43 6f 6e 73     if {[haveCons
12d90 74 72 61 69 6e 74 20 5c 0d 0a 20 20 20 20 20 20  traint \..      
12da0 20 20 20 20 20 20 20 20 64 65 66 69 6e 65 43 6f          defineCo
12db0 6e 73 74 61 6e 74 2e 53 79 73 74 65 6d 2e 44 61  nstant.System.Da
12dc0 74 61 2e 53 51 4c 69 74 65 2e 43 4f 55 4e 54 5f  ta.SQLite.COUNT_
12dd0 48 41 4e 44 4c 45 5d 7d 20 74 68 65 6e 20 7b 0d  HANDLE]} then {.
12de0 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
12df0 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 64 64 20      # NOTE: Add 
12e00 65 61 63 68 20 63 72 69 74 69 63 61 6c 20 68 61  each critical ha
12e10 6e 64 6c 65 20 63 6f 75 6e 74 20 74 6f 20 74 68  ndle count to th
12e20 65 20 72 65 73 75 6c 74 69 6e 67 20 6c 69 73 74  e resulting list
12e30 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
12e40 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 6e 61        foreach na
12e50 6d 65 20 5b 6c 69 73 74 20 63 6f 6e 6e 65 63 74  me [list connect
12e60 69 6f 6e 43 6f 75 6e 74 20 73 74 61 74 65 6d 65  ionCount stateme
12e70 6e 74 43 6f 75 6e 74 20 62 61 63 6b 75 70 43 6f  ntCount backupCo
12e80 75 6e 74 5d 20 7b 0d 0a 20 20 20 20 20 20 20 20  unt] {..        
12e90 20 20 73 65 74 20 76 61 6c 75 65 20 5b 6f 62 6a    set value [obj
12ea0 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67  ect invoke -flag
12eb0 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a  s +NonPublic \..
12ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 79                Sy
12ed0 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
12ee0 2e 55 6e 73 61 66 65 4e 61 74 69 76 65 4d 65 74  .UnsafeNativeMet
12ef0 68 6f 64 73 20 24 6e 61 6d 65 5d 0d 0a 0d 0a 20  hods $name].... 
12f00 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71           if {!$q
12f10 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  uiet} then {..  
12f20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
12f30 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  $channel [append
12f40 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
12f50 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 72          "---- cr
12f60 69 74 69 63 61 6c 20 68 61 6e 64 6c 65 20 63 6f  itical handle co
12f70 75 6e 74 20 5c 22 22 20 24 6e 61 6d 65 20 22 5c  unt \"" $name "\
12f80 22 20 69 73 20 22 20 24 76 61 6c 75 65 20 5c 6e  " is " $value \n
12f90 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  ]..          }..
12fa0 0d 0a 20 20 20 20 20 20 20 20 20 20 6c 61 70 70  ..          lapp
12fb0 65 6e 64 20 72 65 73 75 6c 74 20 24 76 61 6c 75  end result $valu
12fc0 65 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  e..        }..  
12fd0 20 20 20 20 7d 20 65 6c 73 65 69 66 20 7b 21 24      } elseif {!$
12fe0 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20  quiet} then {.. 
12ff0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
13000 20 20 23 20 4e 4f 54 45 3a 20 54 68 65 20 61 63    # NOTE: The ac
13010 74 75 61 6c 20 68 61 6e 64 6c 65 20 63 6f 75 6e  tual handle coun
13020 74 73 20 61 72 65 20 6e 6f 74 20 61 76 61 69 6c  ts are not avail
13030 61 62 6c 65 3b 20 74 68 65 72 65 66 6f 72 65 2c  able; therefore,
13040 20 6a 75 73 74 0d 0a 20 20 20 20 20 20 20 20 23   just..        #
13050 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 61 6e         return an
13060 20 65 6d 70 74 79 20 6c 69 73 74 2e 0d 0a 20 20   empty list...  
13070 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
13080 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
13090 22 2d 2d 2d 2d 20 63 72 69 74 69 63 61 6c 20 68  "---- critical h
130a0 61 6e 64 6c 65 20 63 6f 75 6e 74 73 20 75 6e 61  andle counts una
130b0 76 61 69 6c 61 62 6c 65 5c 6e 22 0d 0a 20 20 20  vailable\n"..   
130c0 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65     }....      re
130d0 74 75 72 6e 20 24 72 65 73 75 6c 74 0d 0a 20 20  turn $result..  
130e0 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
130f0 20 73 68 75 74 64 6f 77 6e 53 51 4c 69 74 65 20   shutdownSQLite 
13100 7b 20 63 68 61 6e 6e 65 6c 20 7b 66 6f 72 63 65  { channel {force
13110 20 66 61 6c 73 65 7d 20 7b 71 75 69 65 74 20 66   false} {quiet f
13120 61 6c 73 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20  alse} } {..     
13130 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
13140 3a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 61 74  : Make sure that
13150 20 53 51 4c 69 74 65 20 63 6f 72 65 20 6c 69 62   SQLite core lib
13160 72 61 72 79 20 69 73 20 63 6f 6d 70 6c 65 74 65  rary is complete
13170 6c 79 20 73 68 75 74 64 6f 77 6e 2e 20 20 54 68  ly shutdown.  Th
13180 69 73 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  is..      #     
13190 20 20 69 73 20 75 73 65 64 20 62 79 20 74 65 73    is used by tes
131a0 74 73 20 74 68 61 74 20 63 68 61 6e 67 65 20 63  ts that change c
131b0 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 6f 70 74  onfiguration opt
131c0 69 6f 6e 73 20 61 6e 64 2f 6f 72 20 74 68 6f 73  ions and/or thos
131d0 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  e..      #      
131e0 20 74 68 61 74 20 6e 65 65 64 20 74 6f 20 6d 61   that need to ma
131f0 6b 65 20 73 75 72 65 20 6c 6f 67 67 69 6e 67 20  ke sure logging 
13200 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 28  is initialized (
13210 69 2e 65 2e 20 6a 75 73 74 20 69 6e 20 63 61 73  i.e. just in cas
13220 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  e..      #      
13230 20 74 68 65 20 53 51 4c 69 74 65 20 63 6f 72 65   the SQLite core
13240 20 6c 69 62 72 61 72 79 20 77 61 73 20 69 6e 69   library was ini
13250 74 69 61 6c 69 7a 65 64 20 69 6e 20 74 68 65 20  tialized in the 
13260 70 72 6f 63 65 73 73 20 70 72 69 6f 72 20 74 6f  process prior to
13270 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
13280 74 68 65 20 53 51 4c 69 74 65 4c 6f 67 20 63 6c  the SQLiteLog cl
13290 61 73 73 20 62 65 69 6e 67 20 61 62 6c 65 20 74  ass being able t
132a0 6f 20 73 65 74 75 70 20 69 74 73 20 6c 6f 67 67  o setup its logg
132b0 69 6e 67 20 63 61 6c 6c 62 61 63 6b 29 2e 0d 0a  ing callback)...
132c0 20 20 20 20 20 20 23 20 20 20 20 20 20 20 4e 6f        #       No
132d0 72 6d 61 6c 6c 79 2c 20 74 68 69 73 20 73 68 6f  rmally, this sho
132e0 75 6c 64 20 6f 6e 6c 79 20 62 65 20 70 65 72 66  uld only be perf
132f0 6f 72 6d 65 64 20 69 66 20 53 51 4c 69 74 65 20  ormed if SQLite 
13300 69 73 20 6c 6f 61 64 65 64 20 61 6e 64 0d 0a 20  is loaded and.. 
13310 20 20 20 20 20 23 20 20 20 20 20 20 20 72 65 61       #       rea
13320 64 79 20 66 6f 72 20 75 73 65 20 62 79 20 74 68  dy for use by th
13330 65 20 74 65 73 74 20 73 75 69 74 65 2e 0d 0a 20  e test suite... 
13340 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66       #..      if
13350 20 7b 24 66 6f 72 63 65 20 7c 7c 20 5b 69 73 53   {$force || [isS
13360 51 4c 69 74 65 52 65 61 64 79 5d 7d 20 74 68 65  QLiteReady]} the
13370 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  n {..        #..
13380 20 20 20 20 20 20 20 20 23 20 42 55 47 46 49 58          # BUGFIX
13390 3a 20 42 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67  : Before calling
133a0 20 74 68 65 20 6e 61 74 69 76 65 20 73 68 75 74   the native shut
133b0 64 6f 77 6e 20 66 75 6e 63 74 69 6f 6e 2c 20 6d  down function, m
133c0 61 6b 65 20 73 75 72 65 20 62 6f 74 68 0d 0a 20  ake sure both.. 
133d0 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 20         #        
133e0 20 6f 66 20 74 68 65 20 50 52 41 47 4d 41 20 72   of the PRAGMA r
133f0 65 6c 61 74 65 64 20 64 69 72 65 63 74 6f 72 79  elated directory
13400 20 6e 61 6d 65 73 20 61 72 65 20 66 72 65 65 64   names are freed
13410 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
13420 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72 53 51        checkForSQ
13430 4c 69 74 65 44 69 72 65 63 74 6f 72 69 65 73 20  LiteDirectories 
13440 24 63 68 61 6e 6e 65 6c 20 74 72 75 65 0d 0a 0d  $channel true...
13450 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61  .        if {[ca
13460 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  tch {..         
13470 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d   object invoke -
13480 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63  flags +NonPublic
13490 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
134a0 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51    System.Data.SQ
134b0 4c 69 74 65 2e 55 6e 73 61 66 65 4e 61 74 69 76  Lite.UnsafeNativ
134c0 65 4d 65 74 68 6f 64 73 20 73 71 6c 69 74 65 33  eMethods sqlite3
134d0 5f 73 68 75 74 64 6f 77 6e 0d 0a 20 20 20 20 20  _shutdown..     
134e0 20 20 20 7d 20 72 65 73 75 6c 74 5d 20 3d 3d 20     } result] == 
134f0 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
13500 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74       if {!$quiet
13510 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
13520 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
13530 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
13540 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
13550 20 20 20 20 22 2d 2d 2d 2d 20 63 61 6c 6c 20 73      "---- call s
13560 71 6c 69 74 65 33 5f 73 68 75 74 64 6f 77 6e 28  qlite3_shutdown(
13570 29 2e 2e 2e 20 6f 6b 3a 20 22 20 24 72 65 73 75  )... ok: " $resu
13580 6c 74 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20  lt \n]..        
13590 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 20 65    }..        } e
135a0 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  lse {..         
135b0 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68   if {!$quiet} th
135c0 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
135d0 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
135e0 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
135f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13600 22 2d 2d 2d 2d 20 63 61 6c 6c 20 73 71 6c 69 74  "---- call sqlit
13610 65 33 5f 73 68 75 74 64 6f 77 6e 28 29 2e 2e 2e  e3_shutdown()...
13620 20 65 72 72 6f 72 3a 20 22 20 5c 6e 5c 74 20 24   error: " \n\t $
13630 72 65 73 75 6c 74 20 5c 6e 5d 0d 0a 20 20 20 20  result \n]..    
13640 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
13650 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20   }..      }..   
13660 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
13670 72 65 70 6f 72 74 53 51 4c 69 74 65 52 65 73 6f  reportSQLiteReso
13680 75 72 63 65 73 20 7b 0d 0a 20 20 20 20 20 20 20  urces {..       
13690 20 20 20 20 20 63 68 61 6e 6e 65 6c 20 7b 71 75       channel {qu
136a0 69 65 74 20 66 61 6c 73 65 7d 20 7b 72 65 73 65  iet false} {rese
136b0 74 20 74 72 75 65 7d 20 7b 63 6f 6c 6c 65 63 74  t true} {collect
136c0 20 74 72 75 65 7d 20 7d 20 7b 0d 0a 20 20 20 20   true} } {..    
136d0 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
136e0 45 3a 20 49 66 20 61 76 61 69 6c 61 62 6c 65 2c  E: If available,
136f0 20 72 65 70 6f 72 74 20 6f 6e 20 28 61 6e 64 20   report on (and 
13700 70 6f 73 73 69 62 6c 79 20 72 65 73 65 74 29 20  possibly reset) 
13710 74 68 65 20 72 75 6e 74 69 6d 65 0d 0a 20 20 20  the runtime..   
13720 20 20 20 23 20 20 20 20 20 20 20 63 6f 6e 66 69     #       confi
13730 67 75 72 61 74 69 6f 6e 20 73 74 61 74 69 73 74  guration statist
13740 69 63 73 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ics...      #.. 
13750 20 20 20 20 20 69 66 20 7b 5b 68 61 76 65 43 6f       if {[haveCo
13760 6e 73 74 72 61 69 6e 74 20 62 75 69 6c 64 43 6f  nstraint buildCo
13770 6e 66 69 67 75 72 61 74 69 6f 6e 2e 44 65 62 75  nfiguration.Debu
13780 67 5d 20 26 26 20 5b 63 61 74 63 68 20 7b 0d 0a  g] && [catch {..
13790 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69          object i
137a0 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f  nvoke -flags +No
137b0 6e 50 75 62 6c 69 63 20 2d 61 6c 69 61 73 20 5c  nPublic -alias \
137c0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 53 79  ..            Sy
137d0 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
137e0 2e 55 6e 73 61 66 65 4e 61 74 69 76 65 4d 65 74  .UnsafeNativeMet
137f0 68 6f 64 73 20 73 65 74 74 69 6e 67 52 65 61 64  hods settingRead
13800 43 6f 75 6e 74 73 0d 0a 20 20 20 20 20 20 7d 20  Counts..      } 
13810 73 65 74 74 69 6e 67 52 65 61 64 43 6f 75 6e 74  settingReadCount
13820 73 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d  s] == 0} then {.
13830 0a 20 20 20 20 20 20 20 20 73 65 74 20 6e 61 6d  .        set nam
13840 65 43 6f 75 6e 74 20 5b 24 73 65 74 74 69 6e 67  eCount [$setting
13850 52 65 61 64 43 6f 75 6e 74 73 20 43 6f 75 6e 74  ReadCounts Count
13860 5d 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 76  ]..        set v
13870 61 6c 75 65 43 6f 75 6e 74 20 30 0d 0a 0d 0a 20  alueCount 0.... 
13880 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20 66 6f         object fo
13890 72 65 61 63 68 20 2d 61 6c 69 61 73 20 70 61 69  reach -alias pai
138a0 72 20 24 73 65 74 74 69 6e 67 52 65 61 64 43 6f  r $settingReadCo
138b0 75 6e 74 73 20 7b 0d 0a 20 20 20 20 20 20 20 20  unts {..        
138c0 20 20 69 6e 63 72 20 76 61 6c 75 65 43 6f 75 6e    incr valueCoun
138d0 74 20 5b 24 70 61 69 72 20 56 61 6c 75 65 5d 0d  t [$pair Value].
138e0 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20  ...          if 
138f0 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b  {!$quiet} then {
13900 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70  ..            tp
13910 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70  uts $channel [ap
13920 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
13930 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
13940 2d 20 73 65 74 74 69 6e 67 20 5c 22 22 20 5b 24  - setting \"" [$
13950 70 61 69 72 20 4b 65 79 5d 20 22 5c 22 20 77 61  pair Key] "\" wa
13960 73 20 72 65 61 64 20 22 20 5c 0d 0a 20 20 20 20  s read " \..    
13970 20 20 20 20 20 20 20 20 20 20 20 20 5b 24 70 61              [$pa
13980 69 72 20 56 61 6c 75 65 5d 20 22 20 74 69 6d 65  ir Value] " time
13990 73 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20 20  s\n"]..         
139a0 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d   }..        }...
139b0 0a 20 20 20 20 20 20 20 20 69 66 20 7b 24 72 65  .        if {$re
139c0 73 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  set} then {..   
139d0 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63         if {[catc
139e0 68 20 7b 24 73 65 74 74 69 6e 67 52 65 61 64 43  h {$settingReadC
139f0 6f 75 6e 74 73 20 43 6c 65 61 72 7d 20 65 72 72  ounts Clear} err
13a00 6f 72 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b  or] == 0} then {
13a10 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ..            if
13a20 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20   {!$quiet} then 
13a30 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
13a40 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
13a50 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
13a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13a70 20 22 2d 2d 2d 2d 20 72 65 73 65 74 20 73 65 74   "---- reset set
13a80 74 69 6e 67 20 73 74 61 74 69 73 74 69 63 73 20  ting statistics 
13a90 66 6f 72 20 74 68 65 20 70 72 65 76 69 6f 75 73  for the previous
13aa0 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20   " \..          
13ab0 20 20 20 20 20 20 20 20 24 6e 61 6d 65 43 6f 75          $nameCou
13ac0 6e 74 20 22 20 6e 61 6d 65 73 20 61 6e 64 20 22  nt " names and "
13ad0 20 24 76 61 6c 75 65 43 6f 75 6e 74 20 22 20 76   $valueCount " v
13ae0 61 6c 75 65 73 20 72 65 61 64 5c 6e 22 5d 0d 0a  alues read\n"]..
13af0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
13b00 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20           } else 
13b10 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  {..            t
13b20 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61  puts $channel [a
13b30 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
13b40 20 20 20 20 20 20 20 20 20 20 20 20 20 22 3d 3d               "==
13b50 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c  == WARNING: fail
13b60 65 64 20 74 6f 20 72 65 73 65 74 20 73 65 74 74  ed to reset sett
13b70 69 6e 67 20 73 74 61 74 69 73 74 69 63 73 20 66  ing statistics f
13b80 6f 72 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20  or " \..        
13b90 20 20 20 20 20 20 20 20 22 74 68 65 20 70 72 65          "the pre
13ba0 76 69 6f 75 73 20 22 20 24 6e 61 6d 65 43 6f 75  vious " $nameCou
13bb0 6e 74 20 22 20 6e 61 6d 65 73 20 61 6e 64 20 22  nt " names and "
13bc0 20 24 76 61 6c 75 65 43 6f 75 6e 74 20 5c 0d 0a   $valueCount \..
13bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13be0 22 20 76 61 6c 75 65 73 20 72 65 61 64 2c 20 65  " values read, e
13bf0 72 72 6f 72 3a 20 22 20 5c 6e 5c 74 20 24 65 72  rror: " \n\t $er
13c00 72 6f 72 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20  ror \n]..       
13c10 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d     }..        }.
13c20 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
13c30 20 20 69 66 20 7b 5b 68 61 76 65 43 6f 6e 73 74    if {[haveConst
13c40 72 61 69 6e 74 20 5c 0d 0a 20 20 20 20 20 20 20  raint \..       
13c50 20 20 20 20 20 20 20 64 65 66 69 6e 65 43 6f 6e         defineCon
13c60 73 74 61 6e 74 2e 53 79 73 74 65 6d 2e 44 61 74  stant.System.Dat
13c70 61 2e 53 51 4c 69 74 65 2e 49 4e 54 45 52 4f 50  a.SQLite.INTEROP
13c80 5f 56 49 52 54 55 41 4c 5f 54 41 42 4c 45 5d 20  _VIRTUAL_TABLE] 
13c90 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  && \..          
13ca0 5b 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74 20  [haveConstraint 
13cb0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
13cc0 20 64 65 66 69 6e 65 43 6f 6e 73 74 61 6e 74 2e   defineConstant.
13cd0 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
13ce0 74 65 2e 54 52 41 43 4b 5f 4d 45 4d 4f 52 59 5f  te.TRACK_MEMORY_
13cf0 42 59 54 45 53 5d 7d 20 74 68 65 6e 20 7b 0d 0a  BYTES]} then {..
13d00 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75          if {!$qu
13d10 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  iet} then {..   
13d20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
13d30 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 63 75 72 72  annel "---- curr
13d40 65 6e 74 20 6d 65 6d 6f 72 79 20 69 6e 20 75 73  ent memory in us
13d50 65 20 62 79 20 53 51 4c 69 74 65 4d 65 6d 6f 72  e by SQLiteMemor
13d60 79 2e 2e 2e 20 22 0d 0a 20 20 20 20 20 20 20 20  y... "..        
13d70 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20  }....        if 
13d80 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20  {[catch {..     
13d90 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f       object invo
13da0 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75  ke -flags +NonPu
13db0 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20 20 20  blic \..        
13dc0 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74        System.Dat
13dd0 61 2e 53 51 4c 69 74 65 2e 53 51 4c 69 74 65 4d  a.SQLite.SQLiteM
13de0 65 6d 6f 72 79 20 62 79 74 65 73 41 6c 6c 6f 63  emory bytesAlloc
13df0 61 74 65 64 0d 0a 20 20 20 20 20 20 20 20 7d 20  ated..        } 
13e00 6d 65 6d 6f 72 79 5d 20 3d 3d 20 30 7d 20 74 68  memory] == 0} th
13e10 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
13e20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65  if {!$quiet} the
13e30 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
13e40 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
13e50 5b 61 70 70 65 6e 64 41 72 67 73 20 24 6d 65 6d  [appendArgs $mem
13e60 6f 72 79 20 22 20 62 79 74 65 73 5c 6e 22 5d 0d  ory " bytes\n"].
13e70 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  .          }..  
13e80 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
13e90 20 20 20 20 20 20 20 20 20 20 73 65 74 20 6d 65            set me
13ea0 6d 6f 72 79 20 75 6e 6b 6e 6f 77 6e 0d 0a 0d 0a  mory unknown....
13eb0 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 24            if {!$
13ec0 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20  quiet} then {.. 
13ed0 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
13ee0 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e   $channel [appen
13ef0 64 41 72 67 73 20 24 6d 65 6d 6f 72 79 20 5c 6e  dArgs $memory \n
13f00 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  ]..          }..
13f10 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
13f20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74       if {!$quiet
13f30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
13f40 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
13f50 65 6c 20 22 2d 2d 2d 2d 20 6d 61 78 69 6d 75 6d  el "---- maximum
13f60 20 6d 65 6d 6f 72 79 20 69 6e 20 75 73 65 20 62   memory in use b
13f70 79 20 53 51 4c 69 74 65 4d 65 6d 6f 72 79 2e 2e  y SQLiteMemory..
13f80 2e 20 22 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  . "..        }..
13f90 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63  ..        if {[c
13fa0 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20  atch {..        
13fb0 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20    object invoke 
13fc0 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69  -flags +NonPubli
13fd0 63 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  c \..           
13fe0 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53     System.Data.S
13ff0 51 4c 69 74 65 2e 53 51 4c 69 74 65 4d 65 6d 6f  QLite.SQLiteMemo
14000 72 79 20 6d 61 78 69 6d 75 6d 42 79 74 65 73 41  ry maximumBytesA
14010 6c 6c 6f 63 61 74 65 64 0d 0a 20 20 20 20 20 20  llocated..      
14020 20 20 7d 20 6d 65 6d 6f 72 79 5d 20 3d 3d 20 30    } memory] == 0
14030 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
14040 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d      if {!$quiet}
14050 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
14060 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
14070 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
14080 24 6d 65 6d 6f 72 79 20 22 20 62 79 74 65 73 5c  $memory " bytes\
14090 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  n"]..          }
140a0 0d 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65  ..        } else
140b0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65   {..          se
140c0 74 20 6d 65 6d 6f 72 79 20 75 6e 6b 6e 6f 77 6e  t memory unknown
140d0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66  ....          if
140e0 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20   {!$quiet} then 
140f0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  {..            t
14100 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61  puts $channel [a
14110 70 70 65 6e 64 41 72 67 73 20 24 6d 65 6d 6f 72  ppendArgs $memor
14120 79 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20  y \n]..         
14130 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20   }..        }.. 
14140 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
14150 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65  if {!$quiet} the
14160 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75  n {..        tpu
14170 74 73 20 24 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d  ts $channel "---
14180 2d 20 63 75 72 72 65 6e 74 20 6d 65 6d 6f 72 79  - current memory
14190 20 69 6e 20 75 73 65 20 62 79 20 53 51 4c 69 74   in use by SQLit
141a0 65 2e 2e 2e 20 22 0d 0a 20 20 20 20 20 20 7d 0d  e... "..      }.
141b0 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 63 61  ...      if {[ca
141c0 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 6f  tch {..        o
141d0 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c  bject invoke -fl
141e0 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c  ags +NonPublic \
141f0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 53 79  ..            Sy
14200 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
14210 2e 55 6e 73 61 66 65 4e 61 74 69 76 65 4d 65 74  .UnsafeNativeMet
14220 68 6f 64 73 20 73 71 6c 69 74 65 33 5f 6d 65 6d  hods sqlite3_mem
14230 6f 72 79 5f 75 73 65 64 0d 0a 20 20 20 20 20 20  ory_used..      
14240 7d 20 6d 65 6d 6f 72 79 5d 20 3d 3d 20 30 7d 20  } memory] == 0} 
14250 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
14260 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65  if {!$quiet} the
14270 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74  n {..          t
14280 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61  puts $channel [a
14290 70 70 65 6e 64 41 72 67 73 20 24 6d 65 6d 6f 72  ppendArgs $memor
142a0 79 20 22 20 62 79 74 65 73 5c 6e 22 5d 0d 0a 20  y " bytes\n"].. 
142b0 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
142c0 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
142d0 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
142e0 4f 54 45 3a 20 4d 61 79 62 65 20 74 68 65 20 53  OTE: Maybe the S
142f0 51 4c 69 74 65 20 63 6f 72 65 20 6c 69 62 72 61  QLite core libra
14300 72 79 20 69 73 20 75 6e 61 76 61 69 6c 61 62 6c  ry is unavailabl
14310 65 3f 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  e?..        #.. 
14320 20 20 20 20 20 20 20 73 65 74 20 6d 65 6d 6f 72         set memor
14330 79 20 75 6e 6b 6e 6f 77 6e 0d 0a 0d 0a 20 20 20  y unknown....   
14340 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74       if {!$quiet
14350 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
14360 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
14370 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 24  el [appendArgs $
14380 6d 65 6d 6f 72 79 20 5c 6e 5d 0d 0a 20 20 20 20  memory \n]..    
14390 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a      }..      }..
143a0 0d 0a 20 20 20 20 20 20 73 65 74 20 72 65 73 75  ..      set resu
143b0 6c 74 20 24 6d 65 6d 6f 72 79 3b 20 23 20 4e 4f  lt $memory; # NO
143c0 54 45 3a 20 52 65 74 75 72 6e 20 6d 65 6d 6f 72  TE: Return memor
143d0 79 20 69 6e 2d 75 73 65 20 74 6f 20 6f 75 72 20  y in-use to our 
143e0 63 61 6c 6c 65 72 2e 0d 0a 0d 0a 20 20 20 20 20  caller.....     
143f0 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68   if {!$quiet} th
14400 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70  en {..        tp
14410 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 22 2d 2d  uts $channel "--
14420 2d 2d 20 6d 61 78 69 6d 75 6d 20 6d 65 6d 6f 72  -- maximum memor
14430 79 20 69 6e 20 75 73 65 20 62 79 20 53 51 4c 69  y in use by SQLi
14440 74 65 2e 2e 2e 20 22 0d 0a 20 20 20 20 20 20 7d  te... "..      }
14450 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 63  ....      if {[c
14460 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20  atch {..        
14470 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66  object invoke -f
14480 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20  lags +NonPublic 
14490 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 53  \..            S
144a0 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
144b0 65 2e 55 6e 73 61 66 65 4e 61 74 69 76 65 4d 65  e.UnsafeNativeMe
144c0 74 68 6f 64 73 20 73 71 6c 69 74 65 33 5f 6d 65  thods sqlite3_me
144d0 6d 6f 72 79 5f 68 69 67 68 77 61 74 65 72 20 30  mory_highwater 0
144e0 0d 0a 20 20 20 20 20 20 7d 20 6d 65 6d 6f 72 79  ..      } memory
144f0 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  ] == 0} then {..
14500 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75          if {!$qu
14510 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  iet} then {..   
14520 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
14530 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
14540 73 20 24 6d 65 6d 6f 72 79 20 22 20 62 79 74 65  s $memory " byte
14550 73 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20 7d  s\n"]..        }
14560 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b  ..      } else {
14570 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
14580 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4d 61 79       # NOTE: May
14590 62 65 20 74 68 65 20 53 51 4c 69 74 65 20 63 6f  be the SQLite co
145a0 72 65 20 6c 69 62 72 61 72 79 20 69 73 20 75 6e  re library is un
145b0 61 76 61 69 6c 61 62 6c 65 3f 0d 0a 20 20 20 20  available?..    
145c0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 73      #..        s
145d0 65 74 20 6d 65 6d 6f 72 79 20 75 6e 6b 6e 6f 77  et memory unknow
145e0 6e 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20  n....        if 
145f0 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b  {!$quiet} then {
14600 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70 75 74  ..          tput
14610 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  s $channel [appe
14620 6e 64 41 72 67 73 20 24 6d 65 6d 6f 72 79 20 5c  ndArgs $memory \
14630 6e 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20  n]..        }.. 
14640 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
14650 69 66 20 7b 24 63 6f 6c 6c 65 63 74 7d 20 74 68  if {$collect} th
14660 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 63 6f  en {..        co
14670 6c 6c 65 63 74 47 61 72 62 61 67 65 20 24 63 68  llectGarbage $ch
14680 61 6e 6e 65 6c 0d 0a 20 20 20 20 20 20 7d 0d 0a  annel..      }..
14690 0d 0a 20 20 20 20 20 20 69 66 20 7b 21 24 71 75  ..      if {!$qu
146a0 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  iet} then {..   
146b0 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
146c0 6e 65 6c 20 22 2d 2d 2d 2d 20 63 75 72 72 65 6e  nel "---- curren
146d0 74 20 6d 65 6d 6f 72 79 20 69 6e 20 75 73 65 20  t memory in use 
146e0 62 79 20 74 68 65 20 43 4c 52 2e 2e 2e 20 22 0d  by the CLR... ".
146f0 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
14700 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 6f 62    if {[catch {ob
14710 6a 65 63 74 20 69 6e 76 6f 6b 65 20 47 43 20 47  ject invoke GC G
14720 65 74 54 6f 74 61 6c 4d 65 6d 6f 72 79 20 66 61  etTotalMemory fa
14730 6c 73 65 7d 20 6d 65 6d 6f 72 79 5d 20 3d 3d 20  lse} memory] == 
14740 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
14750 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 69     if {[string i
14760 73 20 69 6e 74 65 67 65 72 20 2d 73 74 72 69 63  s integer -stric
14770 74 20 24 6d 65 6d 6f 72 79 5d 7d 20 74 68 65 6e  t $memory]} then
14780 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66   {..          if
14790 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20   {!$quiet} then 
147a0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  {..            t
147b0 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61  puts $channel [a
147c0 70 70 65 6e 64 41 72 67 73 20 24 6d 65 6d 6f 72  ppendArgs $memor
147d0 79 20 22 20 62 79 74 65 73 5c 6e 22 5d 0d 0a 20  y " bytes\n"].. 
147e0 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
147f0 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
14800 20 20 20 20 20 20 20 20 73 65 74 20 6d 65 6d 6f          set memo
14810 72 79 20 69 6e 76 61 6c 69 64 0d 0a 0d 0a 20 20  ry invalid....  
14820 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75          if {!$qu
14830 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  iet} then {..   
14840 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
14850 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
14860 72 67 73 20 24 6d 65 6d 6f 72 79 20 5c 6e 5d 0d  rgs $memory \n].
14870 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  .          }..  
14880 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d        }..      }
14890 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
148a0 20 73 65 74 20 6d 65 6d 6f 72 79 20 75 6e 6b 6e   set memory unkn
148b0 6f 77 6e 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69  own....        i
148c0 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e  f {!$quiet} then
148d0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70   {..          tp
148e0 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70  uts $channel [ap
148f0 70 65 6e 64 41 72 67 73 20 24 6d 65 6d 6f 72 79  pendArgs $memory
14900 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d   \n]..        }.
14910 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
14920 20 20 72 65 74 75 72 6e 20 24 72 65 73 75 6c 74    return $result
14930 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
14940 70 72 6f 63 20 63 68 65 63 6b 46 6f 72 53 51 4c  proc checkForSQL
14950 69 74 65 44 69 72 65 63 74 6f 72 69 65 73 20 7b  iteDirectories {
14960 20 63 68 61 6e 6e 65 6c 20 7b 72 65 73 65 74 20   channel {reset 
14970 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a 20 20 20 20  false} } {..    
14980 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
14990 45 3a 20 43 68 65 63 6b 20 69 66 20 74 68 65 20  E: Check if the 
149a0 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 65  sqlite3_win32_se
149b0 74 5f 64 69 72 65 63 74 6f 72 79 20 66 75 6e 63  t_directory func
149c0 74 69 6f 6e 20 69 73 20 61 76 61 69 6c 61 62 6c  tion is availabl
149d0 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  e...      #..   
149e0 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
149f0 6c 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 22  l \..          "
14a00 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e 67 20 66 6f  ---- checking fo
14a10 72 20 66 75 6e 63 74 69 6f 6e 20 73 71 6c 69 74  r function sqlit
14a20 65 33 5f 77 69 6e 33 32 5f 73 65 74 5f 64 69 72  e3_win32_set_dir
14a30 65 63 74 6f 72 79 2e 2e 2e 20 22 0d 0a 0d 0a 20  ectory... ".... 
14a40 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
14a50 4e 4f 54 45 3a 20 54 68 69 73 20 63 61 6c 6c 20  NOTE: This call 
14a60 74 6f 20 74 68 65 20 73 71 6c 69 74 65 33 5f 77  to the sqlite3_w
14a70 69 6e 33 32 5f 73 65 74 5f 64 69 72 65 63 74 6f  in32_set_directo
14a80 72 79 20 66 75 6e 63 74 69 6f 6e 20 75 73 65 73  ry function uses
14a90 20 74 68 65 0d 0a 20 20 20 20 20 20 23 20 20 20   the..      #   
14aa0 20 20 20 20 69 6e 76 61 6c 69 64 20 76 61 6c 75      invalid valu
14ab0 65 20 30 20 66 6f 72 20 74 68 65 20 66 69 72 73  e 0 for the firs
14ac0 74 20 61 72 67 75 6d 65 6e 74 2e 20 20 54 68 69  t argument.  Thi
14ad0 73 20 63 6f 64 65 20 69 73 20 64 65 73 69 67 6e  s code is design
14ae0 65 64 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  ed..      #     
14af0 20 20 74 6f 20 63 68 65 63 6b 20 69 66 20 63 61    to check if ca
14b00 6c 6c 69 6e 67 20 74 68 65 20 66 75 6e 63 74 69  lling the functi
14b10 6f 6e 20 77 69 6c 6c 20 72 61 69 73 65 20 61 6e  on will raise an
14b20 20 65 78 63 65 70 74 69 6f 6e 20 28 69 2e 65 2e   exception (i.e.
14b30 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
14b40 74 68 65 20 61 63 74 75 61 6c 20 72 65 73 75 6c  the actual resul
14b50 74 20 6f 66 20 74 68 65 20 66 75 6e 63 74 69 6f  t of the functio
14b60 6e 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 74 65  n does not matte
14b70 72 20 61 73 20 6c 6f 6e 67 20 61 73 20 6e 6f 0d  r as long as no.
14b80 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 64  .      #       d
14b90 69 72 65 63 74 6f 72 79 20 69 73 20 63 68 61 6e  irectory is chan
14ba0 67 65 64 29 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  ged)...      #..
14bb0 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68        if {[catch
14bc0 20 7b 0d 0a 20 20 20 20 20 20 20 20 6f 62 6a 65   {..        obje
14bd0 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73  ct invoke -flags
14be0 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20   +NonPublic \.. 
14bf0 20 20 20 20 20 20 20 20 20 20 20 53 79 73 74 65             Syste
14c00 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 55 6e  m.Data.SQLite.Un
14c10 73 61 66 65 4e 61 74 69 76 65 4d 65 74 68 6f 64  safeNativeMethod
14c20 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
14c30 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73   sqlite3_win32_s
14c40 65 74 5f 64 69 72 65 63 74 6f 72 79 20 30 20 6e  et_directory 0 n
14c50 75 6c 6c 0d 0a 20 20 20 20 20 20 7d 5d 20 3d 3d  ull..      }] ==
14c60 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
14c70 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
14c80 20 4e 4f 54 45 3a 20 43 61 6c 6c 69 6e 67 20 74   NOTE: Calling t
14c90 68 65 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32  he sqlite3_win32
14ca0 5f 73 65 74 5f 64 69 72 65 63 74 6f 72 79 20 66  _set_directory f
14cb0 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74  unction does not
14cc0 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
14cd0 20 20 63 61 75 73 65 20 61 6e 20 65 78 63 65 70    cause an excep
14ce0 74 69 6f 6e 3b 20 74 68 65 72 65 66 6f 72 65 2c  tion; therefore,
14cf0 20 69 74 20 6d 75 73 74 20 62 65 20 61 76 61 69   it must be avai
14d00 6c 61 62 6c 65 20 28 69 2e 65 2e 0d 0a 20 20 20  lable (i.e...   
14d10 20 20 20 20 20 23 20 20 20 20 20 20 20 65 76 65       #       eve
14d20 6e 20 74 68 6f 75 67 68 20 69 74 20 73 68 6f 75  n though it shou
14d30 6c 64 20 72 65 74 75 72 6e 20 61 20 66 61 69 6c  ld return a fail
14d40 75 72 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20  ure return code 
14d50 69 6e 20 74 68 69 73 0d 0a 20 20 20 20 20 20 20  in this..       
14d60 20 23 20 20 20 20 20 20 20 63 61 73 65 29 2e 0d   #       case)..
14d70 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
14d80 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e      addConstrain
14d90 74 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f  t sqlite3_win32_
14da0 73 65 74 5f 64 69 72 65 63 74 6f 72 79 0d 0a 0d  set_directory...
14db0 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24  .        tputs $
14dc0 63 68 61 6e 6e 65 6c 20 79 65 73 5c 6e 0d 0a 0d  channel yes\n...
14dd0 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
14de0 20 20 20 20 23 20 4e 4f 54 45 3a 20 44 6f 65 73      # NOTE: Does
14df0 20 6f 75 72 20 63 61 6c 6c 65 72 20 77 61 6e 74   our caller want
14e00 20 74 6f 20 72 65 73 65 74 20 74 68 65 20 64 69   to reset the di
14e10 72 65 63 74 6f 72 69 65 73 3f 0d 0a 20 20 20 20  rectories?..    
14e20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 69      #..        i
14e30 66 20 7b 24 72 65 73 65 74 7d 20 74 68 65 6e 20  f {$reset} then 
14e40 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a  {..          #..
14e50 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45            # NOTE
14e60 3a 20 4e 6f 77 20 6d 61 6b 65 20 73 75 72 65 20  : Now make sure 
14e70 74 68 65 20 64 61 74 61 62 61 73 65 20 61 6e 64  the database and
14e80 20 74 65 6d 70 6f 72 61 72 79 20 64 69 72 65 63   temporary direc
14e90 74 6f 72 69 65 73 20 61 72 65 0d 0a 20 20 20 20  tories are..    
14ea0 20 20 20 20 20 20 23 20 20 20 20 20 20 20 72 65        #       re
14eb0 73 65 74 20 74 68 65 69 72 20 64 65 66 61 75 6c  set their defaul
14ec0 74 20 76 61 6c 75 65 73 2c 20 77 68 69 63 68 20  t values, which 
14ed0 73 68 6f 75 6c 64 20 62 65 20 6e 75 6c 6c 20 66  should be null f
14ee0 6f 72 20 62 6f 74 68 2e 0d 0a 20 20 20 20 20 20  or both...      
14ef0 20 20 20 20 23 20 20 20 20 20 20 20 53 69 6e 63      #       Sinc
14f00 65 20 74 68 65 20 73 71 6c 69 74 65 33 5f 77 69  e the sqlite3_wi
14f10 6e 33 32 5f 73 65 74 5f 64 69 72 65 63 74 6f 72  n32_set_director
14f20 79 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 76  y function is av
14f30 61 69 6c 61 62 6c 65 2c 0d 0a 20 20 20 20 20 20  ailable,..      
14f40 20 20 20 20 23 20 20 20 20 20 20 20 75 73 65 20      #       use 
14f50 69 74 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23  it...          #
14f60 0d 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 20  ..          for 
14f70 7b 73 65 74 20 69 6e 64 65 78 20 31 7d 20 7b 24  {set index 1} {$
14f80 69 6e 64 65 78 20 3c 20 33 7d 20 7b 69 6e 63 72  index < 3} {incr
14f90 20 69 6e 64 65 78 7d 20 7b 0d 0a 20 20 20 20 20   index} {..     
14fa0 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63         if {[catc
14fb0 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  h {..           
14fc0 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65     object invoke
14fd0 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c   -flags +NonPubl
14fe0 69 63 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  ic \..          
14ff0 20 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44          System.D
15000 61 74 61 2e 53 51 4c 69 74 65 2e 55 6e 73 61 66  ata.SQLite.Unsaf
15010 65 4e 61 74 69 76 65 4d 65 74 68 6f 64 73 20 5c  eNativeMethods \
15020 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
15030 20 20 20 20 73 71 6c 69 74 65 33 5f 77 69 6e 33      sqlite3_win3
15040 32 5f 73 65 74 5f 64 69 72 65 63 74 6f 72 79 20  2_set_directory 
15050 24 69 6e 64 65 78 20 6e 75 6c 6c 0d 0a 20 20 20  $index null..   
15060 20 20 20 20 20 20 20 20 20 7d 20 72 65 73 75 6c           } resul
15070 74 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d  t] == 0} then {.
15080 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74  .              t
15090 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61  puts $channel [a
150a0 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
150b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
150c0 2d 2d 2d 2d 20 63 61 6c 6c 20 73 71 6c 69 74 65  ---- call sqlite
150d0 33 5f 77 69 6e 33 32 5f 73 65 74 5f 64 69 72 65  3_win32_set_dire
150e0 63 74 6f 72 79 28 22 20 24 69 6e 64 65 78 20 5c  ctory(" $index \
150f0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
15100 20 20 20 20 22 2c 20 6e 75 6c 6c 29 2e 2e 2e 20      ", null)... 
15110 6f 6b 3a 20 22 20 24 72 65 73 75 6c 74 20 5c 6e  ok: " $result \n
15120 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  ]..            }
15130 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
15140 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
15150 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
15160 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
15170 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 61 6c         "---- cal
15180 6c 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f  l sqlite3_win32_
15190 73 65 74 5f 64 69 72 65 63 74 6f 72 79 28 22 20  set_directory(" 
151a0 24 69 6e 64 65 78 20 5c 0d 0a 20 20 20 20 20 20  $index \..      
151b0 20 20 20 20 20 20 20 20 20 20 20 20 22 2c 20 6e              ", n
151c0 75 6c 6c 29 2e 2e 2e 20 65 72 72 6f 72 3a 20 22  ull)... error: "
151d0 20 5c 6e 5c 74 20 24 72 65 73 75 6c 74 20 5c 6e   \n\t $result \n
151e0 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  ]..            }
151f0 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20  ..          }.. 
15200 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
15210 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
15220 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
15230 20 6e 6f 5c 6e 0d 0a 0d 0a 20 20 20 20 20 20 20   no\n....       
15240 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
15250 54 45 3a 20 44 6f 65 73 20 6f 75 72 20 63 61 6c  TE: Does our cal
15260 6c 65 72 20 77 61 6e 74 20 74 6f 20 72 65 73 65  ler want to rese
15270 74 20 74 68 65 20 64 69 72 65 63 74 6f 72 69 65  t the directorie
15280 73 3f 20 20 54 68 69 73 20 63 61 6e 20 6f 6e 6c  s?  This can onl
15290 79 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  y..        #    
152a0 20 20 20 62 65 20 70 65 72 66 6f 72 6d 65 64 20     be performed 
152b0 69 66 20 53 51 4c 69 74 65 20 69 73 20 6c 6f 61  if SQLite is loa
152c0 64 65 64 20 61 6e 64 20 72 65 61 64 79 20 66 6f  ded and ready fo
152d0 72 20 75 73 65 20 62 79 20 74 68 65 20 74 65 73  r use by the tes
152e0 74 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  t..        #    
152f0 20 20 20 73 75 69 74 65 2e 0d 0a 20 20 20 20 20     suite...     
15300 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 69 66     #..        if
15310 20 7b 24 72 65 73 65 74 20 26 26 20 5b 69 73 53   {$reset && [isS
15320 51 4c 69 74 65 52 65 61 64 79 5d 7d 20 74 68 65  QLiteReady]} the
15330 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 23  n {..          #
15340 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f  ..          # NO
15350 54 45 3a 20 4e 6f 77 20 6d 61 6b 65 20 73 75 72  TE: Now make sur
15360 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61  e the database a
15370 6e 64 20 74 65 6d 70 6f 72 61 72 79 20 64 69 72  nd temporary dir
15380 65 63 74 6f 72 69 65 73 20 61 72 65 0d 0a 20 20  ectories are..  
15390 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
153a0 72 65 73 65 74 20 74 68 65 69 72 20 64 65 66 61  reset their defa
153b0 75 6c 74 20 76 61 6c 75 65 73 2c 20 77 68 69 63  ult values, whic
153c0 68 20 73 68 6f 75 6c 64 20 62 65 20 6e 75 6c 6c  h should be null
153d0 20 66 6f 72 20 62 6f 74 68 2e 0d 0a 20 20 20 20   for both...    
153e0 20 20 20 20 20 20 23 20 20 20 20 20 20 20 53 69        #       Si
153f0 6e 63 65 20 74 68 65 20 73 71 6c 69 74 65 33 5f  nce the sqlite3_
15400 77 69 6e 33 32 5f 73 65 74 5f 64 69 72 65 63 74  win32_set_direct
15410 6f 72 79 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65  ory function doe
15420 73 20 6e 6f 74 0d 0a 20 20 20 20 20 20 20 20 20  s not..         
15430 20 23 20 20 20 20 20 20 20 61 70 70 65 61 72 20   #       appear 
15440 74 6f 20 62 65 20 61 76 61 69 6c 61 62 6c 65 2c  to be available,
15450 20 75 73 65 20 74 68 65 20 61 73 73 6f 63 69 61   use the associa
15460 74 65 64 20 50 52 41 47 4d 41 20 63 6f 6d 6d 61  ted PRAGMA comma
15470 6e 64 73 0d 0a 20 20 20 20 20 20 20 20 20 20 23  nds..          #
15480 20 20 20 20 20 20 20 69 6e 73 74 65 61 64 2e 0d         instead..
15490 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
154a0 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20          foreach 
154b0 64 69 72 65 63 74 6f 72 79 20 5b 6c 69 73 74 20  directory [list 
154c0 64 61 74 61 5f 73 74 6f 72 65 5f 64 69 72 65 63  data_store_direc
154d0 74 6f 72 79 20 74 65 6d 70 5f 73 74 6f 72 65 5f  tory temp_store_
154e0 64 69 72 65 63 74 6f 72 79 5d 20 7b 0d 0a 20 20  directory] {..  
154f0 20 20 20 20 20 20 20 20 20 20 73 65 74 20 73 71            set sq
15500 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 22 50  l [appendArgs "P
15510 52 41 47 4d 41 20 22 20 24 64 69 72 65 63 74 6f  RAGMA " $directo
15520 72 79 20 22 20 3d 20 5c 22 5c 22 3b 22 5d 0d 0a  ry " = \"\";"]..
15530 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ..            if
15540 20 7b 5b 63 61 74 63 68 20 7b 65 78 65 63 75 74   {[catch {execut
15550 65 53 71 6c 20 24 73 71 6c 7d 20 72 65 73 75 6c  eSql $sql} resul
15560 74 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d  t] == 0} then {.
15570 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74  .              t
15580 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61  puts $channel [a
15590 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
155a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
155b0 2d 2d 2d 2d 20 65 78 65 63 75 74 65 20 50 52 41  ---- execute PRA
155c0 47 4d 41 20 22 20 24 64 69 72 65 63 74 6f 72 79  GMA " $directory
155d0 20 22 2e 2e 2e 20 6f 6b 3a 20 5c 22 22 20 5c 0d   "... ok: \"" \.
155e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
155f0 20 20 20 24 72 65 73 75 6c 74 20 5c 22 5c 6e 5d     $result \"\n]
15600 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 20  ..            } 
15610 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
15620 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
15630 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
15640 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
15650 20 20 20 20 20 20 22 2d 2d 2d 2d 20 65 78 65 63        "---- exec
15660 75 74 65 20 50 52 41 47 4d 41 20 22 20 24 64 69  ute PRAGMA " $di
15670 72 65 63 74 6f 72 79 20 22 2e 2e 2e 20 65 72 72  rectory "... err
15680 6f 72 3a 20 22 20 5c 0d 0a 20 20 20 20 20 20 20  or: " \..       
15690 20 20 20 20 20 20 20 20 20 20 20 5c 6e 5c 74 20             \n\t 
156a0 24 72 65 73 75 6c 74 20 5c 6e 5d 0d 0a 20 20 20  $result \n]..   
156b0 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
156c0 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
156d0 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20   }..      }.... 
156e0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
156f0 4e 4f 54 45 3a 20 46 69 6e 61 6c 6c 79 2c 20 73  NOTE: Finally, s
15700 68 6f 77 20 74 68 65 20 63 75 72 72 65 6e 74 20  how the current 
15710 76 61 6c 75 65 20 6f 66 20 74 68 65 20 64 61 74  value of the dat
15720 61 62 61 73 65 20 61 6e 64 20 74 65 6d 70 6f 72  abase and tempor
15730 61 72 79 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ary..      #    
15740 20 20 20 64 69 72 65 63 74 6f 72 69 65 73 2e 20     directories. 
15750 20 54 68 69 73 20 63 61 6e 20 6f 6e 6c 79 20 62   This can only b
15760 65 20 70 65 72 66 6f 72 6d 65 64 20 69 66 20 53  e performed if S
15770 51 4c 69 74 65 20 69 73 20 6c 6f 61 64 65 64 0d  QLite is loaded.
15780 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 61  .      #       a
15790 6e 64 20 72 65 61 64 79 20 66 6f 72 20 75 73 65  nd ready for use
157a0 20 62 79 20 74 68 65 20 74 65 73 74 20 73 75 69   by the test sui
157b0 74 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  te...      #..  
157c0 20 20 20 20 69 66 20 7b 5b 69 73 53 51 4c 69 74      if {[isSQLit
157d0 65 52 65 61 64 79 5d 7d 20 74 68 65 6e 20 7b 0d  eReady]} then {.
157e0 0a 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68  .        foreach
157f0 20 64 69 72 65 63 74 6f 72 79 20 5b 6c 69 73 74   directory [list
15800 20 64 61 74 61 5f 73 74 6f 72 65 5f 64 69 72 65   data_store_dire
15810 63 74 6f 72 79 20 74 65 6d 70 5f 73 74 6f 72 65  ctory temp_store
15820 5f 64 69 72 65 63 74 6f 72 79 5d 20 7b 0d 0a 20  _directory] {.. 
15830 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
15840 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
15850 72 67 73 20 22 2d 2d 2d 2d 20 63 68 65 63 6b 69  rgs "---- checki
15860 6e 67 20 22 20 24 64 69 72 65 63 74 6f 72 79 20  ng " $directory 
15870 22 2e 2e 2e 20 22 5d 0d 0a 0d 0a 20 20 20 20 20  "... "]....     
15880 20 20 20 20 20 73 65 74 20 73 71 6c 20 5b 61 70       set sql [ap
15890 70 65 6e 64 41 72 67 73 20 22 50 52 41 47 4d 41  pendArgs "PRAGMA
158a0 20 22 20 24 64 69 72 65 63 74 6f 72 79 20 5c 3b   " $directory \;
158b0 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 69  ]....          i
158c0 66 20 7b 5b 63 61 74 63 68 20 7b 65 78 65 63 75  f {[catch {execu
158d0 74 65 53 71 6c 20 24 73 71 6c 20 73 63 61 6c 61  teSql $sql scala
158e0 72 7d 20 72 65 73 75 6c 74 5d 20 3d 3d 20 30 7d  r} result] == 0}
158f0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
15900 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
15910 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
15920 22 6f 6b 3a 20 5c 22 22 20 24 72 65 73 75 6c 74  "ok: \"" $result
15930 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20   \"\n]..        
15940 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
15950 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
15960 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
15970 67 73 20 22 65 72 72 6f 72 3a 20 22 20 5c 6e 5c  gs "error: " \n\
15980 74 20 24 72 65 73 75 6c 74 20 5c 6e 5d 0d 0a 20  t $result \n].. 
15990 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
159a0 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a      }..      }..
159b0 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
159c0 6f 63 20 6c 6f 61 64 53 51 4c 69 74 65 54 65 73  oc loadSQLiteTes
159d0 74 53 65 74 74 69 6e 67 73 20 7b 20 63 68 61 6e  tSettings { chan
159e0 6e 65 6c 20 7b 73 75 66 66 69 78 20 22 22 7d 20  nel {suffix ""} 
159f0 7b 71 75 69 65 74 20 66 61 6c 73 65 7d 20 7d 20  {quiet false} } 
15a00 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  {..      #..    
15a10 20 20 23 20 4e 4f 54 45 3a 20 53 6b 69 70 20 6c    # NOTE: Skip l
15a20 6f 61 64 69 6e 67 20 74 68 65 20 73 65 74 74 69  oading the setti
15a30 6e 67 73 20 69 66 20 74 68 65 69 72 20 75 73 61  ngs if their usa
15a40 67 65 20 68 61 73 20 62 65 65 6e 20 64 69 73 61  ge has been disa
15a50 62 6c 65 64 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  bled...      #..
15a60 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f        if {![info
15a70 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 73 71 6c   exists ::no(sql
15a80 69 74 65 54 65 73 74 53 65 74 74 69 6e 67 73 29  iteTestSettings)
15a90 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
15aa0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
15ab0 4e 4f 54 45 3a 20 4c 6f 61 64 20 63 75 73 74 6f  NOTE: Load custo
15ac0 6d 20 70 65 72 2d 75 73 65 72 20 61 6e 64 2f 6f  m per-user and/o
15ad0 72 20 70 65 72 2d 68 6f 73 74 20 74 65 73 74 20  r per-host test 
15ae0 73 65 74 74 69 6e 67 73 20 6e 6f 77 2e 0d 0a 20  settings now... 
15af0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
15b00 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73    if {[info exis
15b10 74 73 20 3a 3a 74 63 6c 5f 70 6c 61 74 66 6f 72  ts ::tcl_platfor
15b20 6d 28 75 73 65 72 29 5d 7d 20 74 68 65 6e 20 7b  m(user)]} then {
15b30 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20  ..          set 
15b40 75 73 65 72 53 65 74 74 69 6e 67 73 46 69 6c 65  userSettingsFile
15b50 4e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20  Name [file join 
15b60 5b 67 65 74 43 6f 6d 6d 6f 6e 44 69 72 65 63 74  [getCommonDirect
15b70 6f 72 79 5d 20 5c 0d 0a 20 20 20 20 20 20 20 20  ory] \..        
15b80 20 20 20 20 20 20 5b 61 70 70 65 6e 64 41 72 67        [appendArg
15b90 73 20 73 65 74 74 69 6e 67 73 20 24 73 75 66 66  s settings $suff
15ba0 69 78 20 2e 20 24 3a 3a 74 63 6c 5f 70 6c 61 74  ix . $::tcl_plat
15bb0 66 6f 72 6d 28 75 73 65 72 29 20 2e 65 61 67 6c  form(user) .eagl
15bc0 65 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  e]]....         
15bd0 20 69 66 20 7b 5b 66 69 6c 65 20 65 78 69 73 74   if {[file exist
15be0 73 20 24 75 73 65 72 53 65 74 74 69 6e 67 73 46  s $userSettingsF
15bf0 69 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b  ileName]} then {
15c00 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ..            if
15c10 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20   {!$quiet} then 
15c20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
15c30 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
15c40 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
15c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15c60 20 22 2d 2d 2d 2d 20 6c 6f 61 64 69 6e 67 20 70   "---- loading p
15c70 65 72 2d 75 73 65 72 20 74 65 73 74 20 73 65 74  er-user test set
15c80 74 69 6e 67 73 20 66 69 6c 65 20 5c 22 22 20 5c  tings file \"" \
15c90 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
15ca0 20 20 20 20 24 75 73 65 72 53 65 74 74 69 6e 67      $userSetting
15cb0 73 46 69 6c 65 4e 61 6d 65 20 5c 22 2e 2e 2e 5c  sFileName \"...\
15cc0 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  n]..            
15cd0 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  }....           
15ce0 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20   if {[catch {.. 
15cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 75 70 6c               upl
15d00 65 76 65 6c 20 31 20 5b 6c 69 73 74 20 73 6f 75  evel 1 [list sou
15d10 72 63 65 20 24 75 73 65 72 53 65 74 74 69 6e 67  rce $userSetting
15d20 73 46 69 6c 65 4e 61 6d 65 5d 0d 0a 20 20 20 20  sFileName]..    
15d30 20 20 20 20 20 20 20 20 7d 20 65 72 72 6f 72 5d          } error]
15d40 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
15d50 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75          if {!$qu
15d60 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  iet} then {..   
15d70 20 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75               tpu
15d80 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70  ts $channel [app
15d90 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
15da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
15db0 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61  ==== WARNING: fa
15dc0 69 6c 65 64 20 74 6f 20 6c 6f 61 64 20 70 65 72  iled to load per
15dd0 2d 75 73 65 72 20 73 65 74 74 69 6e 67 73 20 66  -user settings f
15de0 69 6c 65 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20  ile \"" \..     
15df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 24                 $
15e00 75 73 65 72 53 65 74 74 69 6e 67 73 46 69 6c 65  userSettingsFile
15e10 4e 61 6d 65 20 22 5c 22 2c 20 65 72 72 6f 72 3a  Name "\", error:
15e20 20 22 20 5c 6e 5c 74 20 24 65 72 72 6f 72 20 5c   " \n\t $error \
15e30 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  n]..            
15e40 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20    }..           
15e50 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 20   }..          } 
15e60 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
15e70 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d      if {!$quiet}
15e80 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
15e90 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
15ea0 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
15eb0 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
15ec0 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 73 6b 69         "---- ski
15ed0 70 70 65 64 20 6c 6f 61 64 69 6e 67 20 70 65 72  pped loading per
15ee0 2d 75 73 65 72 20 74 65 73 74 20 73 65 74 74 69  -user test setti
15ef0 6e 67 73 20 66 69 6c 65 20 5c 22 22 20 5c 0d 0a  ngs file \"" \..
15f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15f10 20 20 24 75 73 65 72 53 65 74 74 69 6e 67 73 46    $userSettingsF
15f20 69 6c 65 4e 61 6d 65 20 22 5c 22 2c 20 69 74 20  ileName "\", it 
15f30 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 5c 6e  does not exist\n
15f40 22 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  "]..            
15f50 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  }..          }..
15f60 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
15f70 20 20 20 20 20 23 23 23 23 23 23 23 23 23 23 23       ###########
15f80 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
15f90 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
15fa0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
15fb0 23 23 23 23 23 23 23 23 23 23 23 23 0d 0a 0d 0a  ############....
15fc0 20 20 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66          if {[inf
15fd0 6f 20 65 78 69 73 74 73 20 3a 3a 74 63 6c 5f 70  o exists ::tcl_p
15fe0 6c 61 74 66 6f 72 6d 28 68 6f 73 74 29 5d 7d 20  latform(host)]} 
15ff0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
16000 20 20 73 65 74 20 68 6f 73 74 53 65 74 74 69 6e    set hostSettin
16010 67 73 46 69 6c 65 4e 61 6d 65 20 5b 66 69 6c 65  gsFileName [file
16020 20 6a 6f 69 6e 20 5b 67 65 74 43 6f 6d 6d 6f 6e   join [getCommon
16030 44 69 72 65 63 74 6f 72 79 5d 20 5c 0d 0a 20 20  Directory] \..  
16040 20 20 20 20 20 20 20 20 20 20 20 20 5b 61 70 70              [app
16050 65 6e 64 41 72 67 73 20 73 65 74 74 69 6e 67 73  endArgs settings
16060 20 24 73 75 66 66 69 78 20 2e 20 24 3a 3a 74 63   $suffix . $::tc
16070 6c 5f 70 6c 61 74 66 6f 72 6d 28 68 6f 73 74 29  l_platform(host)
16080 20 2e 65 61 67 6c 65 5d 5d 0d 0a 0d 0a 20 20 20   .eagle]]....   
16090 20 20 20 20 20 20 20 69 66 20 7b 5b 66 69 6c 65         if {[file
160a0 20 65 78 69 73 74 73 20 24 68 6f 73 74 53 65 74   exists $hostSet
160b0 74 69 6e 67 73 46 69 6c 65 4e 61 6d 65 5d 7d 20  tingsFileName]} 
160c0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
160d0 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d      if {!$quiet}
160e0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
160f0 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
16100 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
16110 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
16120 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 6c 6f 61         "---- loa
16130 64 69 6e 67 20 70 65 72 2d 68 6f 73 74 20 74 65  ding per-host te
16140 73 74 20 73 65 74 74 69 6e 67 73 20 66 69 6c 65  st settings file
16150 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20 20 20   \"" \..        
16160 20 20 20 20 20 20 20 20 20 20 24 68 6f 73 74 53            $hostS
16170 65 74 74 69 6e 67 73 46 69 6c 65 4e 61 6d 65 20  ettingsFileName 
16180 5c 22 2e 2e 2e 5c 6e 5d 0d 0a 20 20 20 20 20 20  \"...\n]..      
16190 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
161a0 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63         if {[catc
161b0 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  h {..           
161c0 20 20 20 75 70 6c 65 76 65 6c 20 31 20 5b 6c 69     uplevel 1 [li
161d0 73 74 20 73 6f 75 72 63 65 20 24 68 6f 73 74 53  st source $hostS
161e0 65 74 74 69 6e 67 73 46 69 6c 65 4e 61 6d 65 5d  ettingsFileName]
161f0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 20  ..            } 
16200 65 72 72 6f 72 5d 7d 20 74 68 65 6e 20 7b 0d 0a  error]} then {..
16210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
16220 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20   {!$quiet} then 
16230 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
16240 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
16250 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
16260 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
16270 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49       "==== WARNI
16280 4e 47 3a 20 66 61 69 6c 65 64 20 74 6f 20 6c 6f  NG: failed to lo
16290 61 64 20 70 65 72 2d 68 6f 73 74 20 73 65 74 74  ad per-host sett
162a0 69 6e 67 73 20 66 69 6c 65 20 5c 22 22 20 5c 0d  ings file \"" \.
162b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
162c0 20 20 20 20 20 24 68 6f 73 74 53 65 74 74 69 6e       $hostSettin
162d0 67 73 46 69 6c 65 4e 61 6d 65 20 22 5c 22 2c 20  gsFileName "\", 
162e0 65 72 72 6f 72 3a 20 22 20 5c 6e 5c 74 20 24 65  error: " \n\t $e
162f0 72 72 6f 72 20 5c 6e 5d 0d 0a 20 20 20 20 20 20  rror \n]..      
16300 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
16310 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
16320 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
16330 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 24            if {!$
16340 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20  quiet} then {.. 
16350 20 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75               tpu
16360 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70  ts $channel [app
16370 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
16380 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d               "--
16390 2d 2d 20 73 6b 69 70 70 65 64 20 6c 6f 61 64 69  -- skipped loadi
163a0 6e 67 20 70 65 72 2d 68 6f 73 74 20 74 65 73 74  ng per-host test
163b0 20 73 65 74 74 69 6e 67 73 20 66 69 6c 65 20 5c   settings file \
163c0 22 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  "" \..          
163d0 20 20 20 20 20 20 20 20 24 68 6f 73 74 53 65 74          $hostSet
163e0 74 69 6e 67 73 46 69 6c 65 4e 61 6d 65 20 22 5c  tingsFileName "\
163f0 22 2c 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 65  ", it does not e
16400 78 69 73 74 5c 6e 22 5d 0d 0a 20 20 20 20 20 20  xist\n"]..      
16410 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
16420 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d     }..        }.
16430 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d  .      }..    }.
16440 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 72 75 6e  ....    proc run
16450 53 51 4c 69 74 65 54 65 73 74 50 72 6f 6c 6f 67  SQLiteTestProlog
16460 75 65 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 23  ue {} {..      #
16470 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
16480 53 6b 69 70 20 72 75 6e 6e 69 6e 67 20 6f 75 72  Skip running our
16490 20 63 75 73 74 6f 6d 20 70 72 6f 6c 6f 67 75 65   custom prologue
164a0 20 69 66 20 74 68 65 20 6d 61 69 6e 20 6f 6e 65   if the main one
164b0 20 68 61 73 20 62 65 65 6e 0d 0a 20 20 20 20 20   has been..     
164c0 20 23 20 20 20 20 20 20 20 73 6b 69 70 70 65 64   #       skipped
164d0 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
164e0 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69    if {![info exi
164f0 73 74 73 20 3a 3a 6e 6f 28 70 72 6f 6c 6f 67 75  sts ::no(prologu
16500 65 2e 65 61 67 6c 65 29 5d 7d 20 74 68 65 6e 20  e.eagle)]} then 
16510 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
16520 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4c 6f        # NOTE: Lo
16530 61 64 20 74 68 65 20 22 62 65 66 6f 72 65 2d 63  ad the "before-c
16540 6f 6e 73 74 72 61 69 6e 74 73 22 20 63 75 73 74  onstraints" cust
16550 6f 6d 20 70 65 72 2d 75 73 65 72 20 61 6e 64 2f  om per-user and/
16560 6f 72 20 70 65 72 2d 68 6f 73 74 0d 0a 20 20 20  or per-host..   
16570 20 20 20 20 20 23 20 20 20 20 20 20 20 74 65 73       #       tes
16580 74 20 73 65 74 74 69 6e 67 73 20 6e 6f 77 2e 0d  t settings now..
16590 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
165a0 20 20 20 20 75 70 6c 65 76 65 6c 20 31 20 5b 6c      uplevel 1 [l
165b0 69 73 74 20 6c 6f 61 64 53 51 4c 69 74 65 54 65  ist loadSQLiteTe
165c0 73 74 53 65 74 74 69 6e 67 73 20 24 3a 3a 74 65  stSettings $::te
165d0 73 74 5f 63 68 61 6e 6e 65 6c 20 2e 62 65 66 6f  st_channel .befo
165e0 72 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23  re]....        #
165f0 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
16600 3a 20 44 65 74 65 72 6d 69 6e 65 20 74 68 65 20  : Determine the 
16610 6e 61 6d 65 73 20 6f 66 20 74 68 65 20 6e 61 74  names of the nat
16620 69 76 65 20 70 6c 61 74 66 6f 72 6d 20 61 6e 64  ive platform and
16630 20 61 72 63 68 69 74 65 63 74 75 72 65 2e 0d 0a   architecture...
16640 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
16650 20 20 20 73 65 74 20 70 6c 61 74 66 6f 72 6d 20     set platform 
16660 5b 67 65 74 42 75 69 6c 64 50 6c 61 74 66 6f 72  [getBuildPlatfor
16670 6d 20 74 72 75 65 5d 0d 0a 20 20 20 20 20 20 20  m true]..       
16680 20 73 65 74 20 61 72 63 68 69 74 65 63 74 75 72   set architectur
16690 65 20 5b 61 72 63 68 69 74 65 63 74 75 72 65 46  e [architectureF
166a0 6f 72 50 6c 61 74 66 6f 72 6d 20 24 70 6c 61 74  orPlatform $plat
166b0 66 6f 72 6d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  form]....       
166c0 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
166d0 54 45 3a 20 53 68 6f 77 20 74 68 65 20 70 6c 61  TE: Show the pla
166e0 74 66 6f 72 6d 20 61 6e 64 20 61 72 63 68 69 74  tform and archit
166f0 65 63 74 75 72 65 20 75 73 65 64 20 74 6f 20 68  ecture used to h
16700 65 6c 70 20 6c 6f 63 61 74 65 20 74 68 65 0d 0a  elp locate the..
16710 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
16720 6e 61 74 69 76 65 20 62 75 69 6c 64 20 66 69 6c  native build fil
16730 65 73 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  es...        #..
16740 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
16750 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61  :test_channel [a
16760 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
16770 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 70           "---- p
16780 6c 61 74 66 6f 72 6d 20 66 6f 72 20 6c 6f 63 61  latform for loca
16790 74 69 6e 67 20 6e 61 74 69 76 65 20 62 75 69 6c  ting native buil
167a0 64 20 66 69 6c 65 73 20 69 73 20 5c 22 22 20 5c  d files is \"" \
167b0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 24 70  ..            $p
167c0 6c 61 74 66 6f 72 6d 20 5c 22 5c 6e 5d 0d 0a 0d  latform \"\n]...
167d0 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24  .        tputs $
167e0 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b  ::test_channel [
167f0 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
16800 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
16810 61 72 63 68 69 74 65 63 74 75 72 65 20 66 6f 72  architecture for
16820 20 6c 6f 63 61 74 69 6e 67 20 6e 61 74 69 76 65   locating native
16830 20 62 75 69 6c 64 20 66 69 6c 65 73 20 69 73 20   build files is 
16840 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  \"" \..         
16850 20 20 20 24 61 72 63 68 69 74 65 63 74 75 72 65     $architecture
16860 20 5c 22 5c 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20   \"\n]....      
16870 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
16880 4f 54 45 3a 20 42 75 69 6c 64 20 61 20 6c 69 73  OTE: Build a lis
16890 74 20 6f 66 20 63 6f 6e 66 69 67 75 72 61 74 69  t of configurati
168a0 6f 6e 20 66 69 6c 65 73 20 74 68 61 74 20 77 65  on files that we
168b0 20 68 61 6e 64 6c 65 2e 0d 0a 20 20 20 20 20 20   handle...      
168c0 20 20 23 0d 0a 20 20 20 20 20 20 20 20 73 65 74    #..        set
168d0 20 63 6f 6e 66 69 67 46 69 6c 65 4e 61 6d 65 73   configFileNames
168e0 20 5b 6c 69 73 74 20 5c 0d 0a 20 20 20 20 20 20   [list \..      
168f0 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74        System.Dat
16900 61 2e 53 51 4c 69 74 65 2e 64 6c 6c 2e 63 6f 6e  a.SQLite.dll.con
16910 66 69 67 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  fig]....        
16920 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
16930 45 3a 20 42 75 69 6c 64 20 61 20 6c 69 73 74 20  E: Build a list 
16940 6f 66 20 61 75 78 69 6c 69 61 72 79 20 4d 61 6e  of auxiliary Man
16950 61 67 65 64 20 44 65 62 75 67 67 69 6e 67 20 41  aged Debugging A
16960 73 73 69 73 74 61 6e 74 73 20 28 4d 44 41 29 0d  ssistants (MDA).
16970 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
16980 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 66   configuration f
16990 69 6c 65 73 20 74 68 61 74 20 77 65 20 68 61 6e  iles that we han
169a0 64 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  dle...        #.
169b0 0a 20 20 20 20 20 20 20 20 73 65 74 20 6d 64 61  .        set mda
169c0 43 6f 6e 66 69 67 46 69 6c 65 4e 61 6d 65 73 20  ConfigFileNames 
169d0 5b 6c 69 73 74 20 5c 0d 0a 20 20 20 20 20 20 20  [list \..       
169e0 20 20 20 20 20 45 61 67 6c 65 53 68 65 6c 6c 33       EagleShell3
169f0 32 2e 65 78 65 2e 6d 64 61 2e 63 6f 6e 66 69 67  2.exe.mda.config
16a00 20 49 6e 73 74 61 6c 6c 65 72 2e 65 78 65 2e 6d   Installer.exe.m
16a10 64 61 2e 63 6f 6e 66 69 67 20 5c 0d 0a 20 20 20  da.config \..   
16a20 20 20 20 20 20 20 20 20 20 74 65 73 74 2e 65 78           test.ex
16a30 65 2e 6d 64 61 2e 63 6f 6e 66 69 67 20 74 65 73  e.mda.config tes
16a40 74 6c 69 6e 71 2e 65 78 65 2e 6d 64 61 2e 63 6f  tlinq.exe.mda.co
16a50 6e 66 69 67 20 5c 0d 0a 20 20 20 20 20 20 20 20  nfig \..        
16a60 20 20 20 20 74 65 73 74 65 66 36 2e 65 78 65 2e      testef6.exe.
16a70 6d 64 61 2e 63 6f 6e 66 69 67 5d 0d 0a 0d 0a 20  mda.config].... 
16a80 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
16a90 20 20 23 20 4e 4f 54 45 3a 20 42 75 69 6c 64 20    # NOTE: Build 
16aa0 74 68 65 20 6c 69 73 74 20 6f 66 20 65 78 74 65  the list of exte
16ab0 72 6e 61 6c 20 66 69 6c 65 73 20 74 68 61 74 20  rnal files that 
16ac0 77 65 20 68 61 6e 64 6c 65 2e 20 20 53 6f 6d 65  we handle.  Some
16ad0 20 6f 66 0d 0a 20 20 20 20 20 20 20 20 23 20 20   of..        #  
16ae0 20 20 20 20 20 74 68 65 73 65 20 66 69 6c 65 73       these files
16af0 20 6d 61 79 20 62 65 20 6e 61 74 69 76 65 20 61   may be native a
16b00 6e 64 2f 6f 72 20 6d 61 6e 61 67 65 64 20 61 73  nd/or managed as
16b10 73 65 6d 62 6c 69 65 73 20 74 68 61 74 20 61 72  semblies that ar
16b20 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  e..        #    
16b30 20 20 20 72 65 71 75 69 72 65 64 20 74 6f 20 70     required to p
16b40 65 72 66 6f 72 6d 20 76 61 72 69 6f 75 73 20 74  erform various t
16b50 65 73 74 73 2e 0d 0a 20 20 20 20 20 20 20 20 23  ests...        #
16b60 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 65 78  ..        set ex
16b70 74 65 72 6e 61 6c 46 69 6c 65 4e 61 6d 65 73 20  ternalFileNames 
16b80 5b 6c 69 73 74 20 5c 0d 0a 20 20 20 20 20 20 20  [list \..       
16b90 20 20 20 20 20 5b 66 69 6c 65 20 6a 6f 69 6e 20       [file join 
16ba0 45 6e 74 69 74 79 46 72 61 6d 65 77 6f 72 6b 20  EntityFramework 
16bb0 6c 69 62 20 5b 73 74 72 69 6e 67 20 6d 61 70 20  lib [string map 
16bc0 5b 6c 69 73 74 20 46 78 20 22 22 5d 20 5b 73 74  [list Fx ""] [st
16bd0 72 69 6e 67 20 5c 0d 0a 20 20 20 20 20 20 20 20  ring \..        
16be0 20 20 20 20 6d 61 70 20 5b 6c 69 73 74 20 6e 65      map [list ne
16bf0 74 46 78 34 35 31 20 6e 65 74 46 78 34 35 5d 20  tFx451 netFx45] 
16c00 5b 67 65 74 42 75 69 6c 64 4e 65 74 46 78 5d 5d  [getBuildNetFx]]
16c10 5d 20 45 6e 74 69 74 79 46 72 61 6d 65 77 6f 72  ] EntityFramewor
16c20 6b 2e 64 6c 6c 5d 5d 0d 0a 0d 0a 20 20 20 20 20  k.dll]]....     
16c30 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
16c40 4e 4f 54 45 3a 20 42 75 69 6c 64 20 74 68 65 20  NOTE: Build the 
16c50 6c 69 73 74 20 6f 66 20 6e 61 74 69 76 65 20 61  list of native a
16c60 73 73 65 6d 62 6c 79 20 66 69 6c 65 73 20 74 68  ssembly files th
16c70 61 74 20 77 65 20 68 61 6e 64 6c 65 2e 20 20 54  at we handle.  T
16c80 68 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  he..        #   
16c90 20 20 20 20 72 65 61 73 6f 6e 20 74 68 65 20 22      reason the "
16ca0 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
16cb0 74 65 2e 64 6c 6c 22 20 66 69 6c 65 20 69 73 20  te.dll" file is 
16cc0 69 6e 63 6c 75 64 65 64 20 68 65 72 65 20 69 73  included here is
16cd0 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
16ce0 20 20 62 65 63 61 75 73 65 20 69 74 20 63 6f 75    because it cou
16cf0 6c 64 20 62 65 20 74 68 65 20 6d 69 78 65 64 2d  ld be the mixed-
16d00 6d 6f 64 65 20 61 73 73 65 6d 62 6c 79 2e 0d 0a  mode assembly...
16d10 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
16d20 20 20 20 73 65 74 20 6e 61 74 69 76 65 46 69 6c     set nativeFil
16d30 65 4e 61 6d 65 73 20 5b 6c 69 73 74 20 5c 0d 0a  eNames [list \..
16d40 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
16d50 74 65 33 2e 64 6c 6c 20 53 51 4c 69 74 65 2e 49  te3.dll SQLite.I
16d60 6e 74 65 72 6f 70 2e 64 6c 6c 20 53 79 73 74 65  nterop.dll Syste
16d70 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 64 6c  m.Data.SQLite.dl
16d80 6c 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d  l]....        #.
16d90 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
16da0 20 42 75 69 6c 64 20 74 68 65 20 6c 69 73 74 20   Build the list 
16db0 6f 66 20 6d 61 6e 61 67 65 64 20 61 73 73 65 6d  of managed assem
16dc0 62 6c 79 20 66 69 6c 65 73 20 74 68 61 74 20 77  bly files that w
16dd0 65 20 68 61 6e 64 6c 65 2e 0d 0a 20 20 20 20 20  e handle...     
16de0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 73 65     #..        se
16df0 74 20 6d 61 6e 61 67 65 64 46 69 6c 65 4e 61 6d  t managedFileNam
16e00 65 73 20 5b 6c 69 73 74 20 5c 0d 0a 20 20 20 20  es [list \..    
16e10 20 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44          System.D
16e20 61 74 61 2e 53 51 4c 69 74 65 2e 64 6c 6c 20 53  ata.SQLite.dll S
16e30 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
16e40 65 2e 4c 69 6e 71 2e 64 6c 6c 20 5c 0d 0a 20 20  e.Linq.dll \..  
16e50 20 20 20 20 20 20 20 20 20 20 53 79 73 74 65 6d            System
16e60 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 45 46 36  .Data.SQLite.EF6
16e70 2e 64 6c 6c 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  .dll]....       
16e80 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
16e90 54 45 3a 20 52 65 6d 6f 76 65 20 61 6e 79 20 74  TE: Remove any t
16ea0 65 73 74 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  est constraints 
16eb0 74 68 61 74 20 72 65 66 65 72 20 74 6f 20 74 68  that refer to th
16ec0 65 20 6e 61 74 69 76 65 20 61 6e 64 2f 6f 72 0d  e native and/or.
16ed0 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
16ee0 20 6d 61 6e 61 67 65 64 20 61 73 73 65 6d 62 6c   managed assembl
16ef0 79 20 66 69 6c 65 73 20 74 68 61 74 20 77 65 20  y files that we 
16f00 68 61 6e 64 6c 65 20 75 6e 6c 65 73 73 20 66 6f  handle unless fo
16f10 72 62 69 64 64 65 6e 20 66 72 6f 6d 0d 0a 20 20  rbidden from..  
16f20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 64 6f        #       do
16f30 69 6e 67 20 73 6f 2e 0d 0a 20 20 20 20 20 20 20  ing so...       
16f40 20 23 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b   #..        if {
16f50 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  ![info exists ::
16f60 6e 6f 28 73 71 6c 69 74 65 52 65 6d 6f 76 65 43  no(sqliteRemoveC
16f70 6f 6e 73 74 72 61 69 6e 74 73 29 5d 7d 20 74 68  onstraints)]} th
16f80 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
16f90 66 6f 72 65 61 63 68 20 66 69 6c 65 4e 61 6d 65  foreach fileName
16fa0 20 24 63 6f 6e 66 69 67 46 69 6c 65 4e 61 6d 65   $configFileName
16fb0 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s {..           
16fc0 20 72 65 6d 6f 76 65 43 6f 6e 73 74 72 61 69 6e   removeConstrain
16fd0 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20 66 69  t [appendArgs fi
16fe0 6c 65 5f 20 24 66 69 6c 65 4e 61 6d 65 5d 0d 0a  le_ $fileName]..
16ff0 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20            }.... 
17000 20 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68           foreach
17010 20 66 69 6c 65 4e 61 6d 65 20 24 6d 64 61 43 6f   fileName $mdaCo
17020 6e 66 69 67 46 69 6c 65 4e 61 6d 65 73 20 7b 0d  nfigFileNames {.
17030 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 6d  .            rem
17040 6f 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61  oveConstraint [a
17050 70 70 65 6e 64 41 72 67 73 20 66 69 6c 65 5f 20  ppendArgs file_ 
17060 24 66 69 6c 65 4e 61 6d 65 5d 0d 0a 20 20 20 20  $fileName]..    
17070 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
17080 20 20 20 20 20 66 6f 72 65 61 63 68 20 66 69 6c       foreach fil
17090 65 4e 61 6d 65 20 24 65 78 74 65 72 6e 61 6c 46  eName $externalF
170a0 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20  ileNames {..    
170b0 20 20 20 20 20 20 20 20 72 65 6d 6f 76 65 43 6f          removeCo
170c0 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64  nstraint [append
170d0 41 72 67 73 20 66 69 6c 65 5f 20 5b 66 69 6c 65  Args file_ [file
170e0 20 74 61 69 6c 20 24 66 69 6c 65 4e 61 6d 65 5d   tail $fileName]
170f0 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  ]..          }..
17100 0d 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 65  ..          fore
17110 61 63 68 20 66 69 6c 65 4e 61 6d 65 20 24 6e 61  ach fileName $na
17120 74 69 76 65 46 69 6c 65 4e 61 6d 65 73 20 7b 0d  tiveFileNames {.
17130 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 6d  .            rem
17140 6f 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61  oveConstraint [a
17150 70 70 65 6e 64 41 72 67 73 20 66 69 6c 65 5f 20  ppendArgs file_ 
17160 24 66 69 6c 65 4e 61 6d 65 5d 0d 0a 20 20 20 20  $fileName]..    
17170 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
17180 20 20 20 20 20 66 6f 72 65 61 63 68 20 66 69 6c       foreach fil
17190 65 4e 61 6d 65 20 24 6d 61 6e 61 67 65 64 46 69  eName $managedFi
171a0 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20  leNames {..     
171b0 20 20 20 20 20 20 20 72 65 6d 6f 76 65 43 6f 6e         removeCon
171c0 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41  straint [appendA
171d0 72 67 73 20 66 69 6c 65 5f 20 24 66 69 6c 65 4e  rgs file_ $fileN
171e0 61 6d 65 5d 0d 0a 20 20 20 20 20 20 20 20 20 20  ame]..          
171f0 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  }..        }....
17200 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
17210 20 20 20 23 20 4e 4f 54 45 3a 20 53 6b 69 70 20     # NOTE: Skip 
17220 61 6c 6c 20 53 79 73 74 65 6d 2e 44 61 74 61 2e  all System.Data.
17230 53 51 4c 69 74 65 20 72 65 6c 61 74 65 64 20 66  SQLite related f
17240 69 6c 65 20 68 61 6e 64 6c 69 6e 67 20 28 64 65  ile handling (de
17250 6c 65 74 69 6e 67 2c 0d 0a 20 20 20 20 20 20 20  leting,..       
17260 20 23 20 20 20 20 20 20 20 63 6f 70 79 69 6e 67   #       copying
17270 2c 20 61 6e 64 20 6c 6f 61 64 69 6e 67 29 20 69  , and loading) i
17280 66 20 69 6e 73 74 72 75 63 74 65 64 2e 0d 0a 20  f instructed... 
17290 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
172a0 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69    if {![info exi
172b0 73 74 73 20 3a 3a 6e 6f 28 73 71 6c 69 74 65 46  sts ::no(sqliteF
172c0 69 6c 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a  iles)]} then {..
172d0 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
172e0 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53         # NOTE: S
172f0 6b 69 70 20 74 72 79 69 6e 67 20 74 6f 20 64 65  kip trying to de
17300 6c 65 74 65 20 61 6e 79 20 66 69 6c 65 73 20 69  lete any files i
17310 66 20 69 6e 73 74 72 75 63 74 65 64 2e 0d 0a 20  f instructed... 
17320 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
17330 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f        if {![info
17340 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 64 65 6c   exists ::no(del
17350 65 74 65 53 71 6c 69 74 65 46 69 6c 65 73 29 5d  eteSqliteFiles)]
17360 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
17370 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f        if {![info
17380 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 64 65 6c   exists ::no(del
17390 65 74 65 53 71 6c 69 74 65 43 6f 6e 66 69 67 46  eteSqliteConfigF
173a0 69 6c 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a  iles)]} then {..
173b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f                fo
173c0 72 65 61 63 68 20 66 69 6c 65 4e 61 6d 65 20 24  reach fileName $
173d0 63 6f 6e 66 69 67 46 69 6c 65 4e 61 6d 65 73 20  configFileNames 
173e0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
173f0 20 20 20 74 72 79 44 65 6c 65 74 65 42 69 6e 61     tryDeleteBina
17400 72 79 46 69 6c 65 20 24 66 69 6c 65 4e 61 6d 65  ryFile $fileName
17410 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
17420 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  }..            }
17430 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
17440 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74  if {![info exist
17450 73 20 3a 3a 6e 6f 28 64 65 6c 65 74 65 53 71 6c  s ::no(deleteSql
17460 69 74 65 45 78 74 65 72 6e 61 6c 46 69 6c 65 73  iteExternalFiles
17470 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  )]} then {..    
17480 20 20 20 20 20 20 20 20 20 20 66 6f 72 65 61 63            foreac
17490 68 20 66 69 6c 65 4e 61 6d 65 20 24 6d 64 61 43  h fileName $mdaC
174a0 6f 6e 66 69 67 46 69 6c 65 4e 61 6d 65 73 20 7b  onfigFileNames {
174b0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
174c0 20 20 74 72 79 44 65 6c 65 74 65 42 75 69 6c 64    tryDeleteBuild
174d0 46 69 6c 65 20 24 66 69 6c 65 4e 61 6d 65 0d 0a  File $fileName..
174e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d                }.
174f0 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
17500 20 66 6f 72 65 61 63 68 20 66 69 6c 65 4e 61 6d   foreach fileNam
17510 65 20 24 65 78 74 65 72 6e 61 6c 46 69 6c 65 4e  e $externalFileN
17520 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20 20 20  ames {..        
17530 20 20 20 20 20 20 20 20 74 72 79 44 65 6c 65 74          tryDelet
17540 65 42 69 6e 61 72 79 46 69 6c 65 20 24 66 69 6c  eBinaryFile $fil
17550 65 4e 61 6d 65 0d 0a 20 20 20 20 20 20 20 20 20  eName..         
17560 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
17570 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
17580 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20       if {![info 
17590 65 78 69 73 74 73 20 3a 3a 6e 6f 28 64 65 6c 65  exists ::no(dele
175a0 74 65 53 71 6c 69 74 65 4e 61 74 69 76 65 46 69  teSqliteNativeFi
175b0 6c 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  les)]} then {.. 
175c0 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20               if 
175d0 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a  {![info exists :
175e0 3a 6e 6f 28 64 65 6c 65 74 65 53 71 6c 69 74 65  :no(deleteSqlite
175f0 49 6d 70 6c 69 63 69 74 46 69 6c 65 73 29 5d 7d  ImplicitFiles)]}
17600 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
17610 20 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68           foreach
17620 20 66 69 6c 65 4e 61 6d 65 20 24 6e 61 74 69 76   fileName $nativ
17630 65 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20  eFileNames {..  
17640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17650 74 72 79 44 65 6c 65 74 65 41 73 73 65 6d 62 6c  tryDeleteAssembl
17660 79 20 24 66 69 6c 65 4e 61 6d 65 0d 0a 20 20 20  y $fileName..   
17670 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a               }..
17680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d                }.
17690 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
176a0 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73   if {![info exis
176b0 74 73 20 3a 3a 6e 6f 28 64 65 6c 65 74 65 53 71  ts ::no(deleteSq
176c0 6c 69 74 65 4e 6f 6e 49 6d 70 6c 69 63 69 74 46  liteNonImplicitF
176d0 69 6c 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a  iles)]} then {..
176e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
176f0 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74  if {![info exist
17700 73 20 3a 3a 6e 6f 28 64 65 6c 65 74 65 53 71 6c  s ::no(deleteSql
17710 69 74 65 50 6c 61 74 66 6f 72 6d 46 69 6c 65 73  itePlatformFiles
17720 29 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20  )] && \..       
17730 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 73 74               [st
17740 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 70 6c 61  ring length $pla
17750 74 66 6f 72 6d 5d 20 3e 20 30 7d 20 74 68 65 6e  tform] > 0} then
17760 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
17770 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 66 69        foreach fi
17780 6c 65 4e 61 6d 65 20 24 6e 61 74 69 76 65 46 69  leName $nativeFi
17790 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20  leNames {..     
177a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
177b0 72 79 44 65 6c 65 74 65 41 73 73 65 6d 62 6c 79  ryDeleteAssembly
177c0 20 24 66 69 6c 65 4e 61 6d 65 20 24 70 6c 61 74   $fileName $plat
177d0 66 6f 72 6d 0d 0a 20 20 20 20 20 20 20 20 20 20  form..          
177e0 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
177f0 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a             }....
17800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17810 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74  if {![info exist
17820 73 20 3a 3a 6e 6f 28 64 65 6c 65 74 65 53 71 6c  s ::no(deleteSql
17830 69 74 65 41 72 63 68 69 74 65 63 74 75 72 65 46  iteArchitectureF
17840 69 6c 65 73 29 5d 20 26 26 20 5c 0d 0a 20 20 20  iles)] && \..   
17850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17860 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20   [string length 
17870 24 61 72 63 68 69 74 65 63 74 75 72 65 5d 20 3e  $architecture] >
17880 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
17890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f                fo
178a0 72 65 61 63 68 20 66 69 6c 65 4e 61 6d 65 20 24  reach fileName $
178b0 6e 61 74 69 76 65 46 69 6c 65 4e 61 6d 65 73 20  nativeFileNames 
178c0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
178d0 20 20 20 20 20 20 20 74 72 79 44 65 6c 65 74 65         tryDelete
178e0 41 73 73 65 6d 62 6c 79 20 24 66 69 6c 65 4e 61  Assembly $fileNa
178f0 6d 65 20 24 61 72 63 68 69 74 65 63 74 75 72 65  me $architecture
17900 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
17910 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
17920 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
17930 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
17940 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
17950 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e          if {![in
17960 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 64  fo exists ::no(d
17970 65 6c 65 74 65 53 71 6c 69 74 65 4d 61 6e 61 67  eleteSqliteManag
17980 65 64 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e 20  edFiles)]} then 
17990 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
179a0 20 66 6f 72 65 61 63 68 20 66 69 6c 65 4e 61 6d   foreach fileNam
179b0 65 20 24 6d 61 6e 61 67 65 64 46 69 6c 65 4e 61  e $managedFileNa
179c0 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  mes {..         
179d0 20 20 20 20 20 20 20 74 72 79 44 65 6c 65 74 65         tryDelete
179e0 41 73 73 65 6d 62 6c 79 20 24 66 69 6c 65 4e 61  Assembly $fileNa
179f0 6d 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  me..            
17a00 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20    }..           
17a10 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d   }..          }.
17a20 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a  ...          #..
17a30 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45            # NOTE
17a40 3a 20 43 68 65 63 6b 20 66 6f 72 20 74 68 65 20  : Check for the 
17a50 22 61 75 74 6f 53 65 6c 65 63 74 22 20 72 75 6e  "autoSelect" run
17a60 74 69 6d 65 20 6f 70 74 69 6f 6e 2e 20 20 49 66  time option.  If
17a70 20 70 72 65 73 65 6e 74 2c 0d 0a 20 20 20 20 20   present,..     
17a80 20 20 20 20 20 23 20 20 20 20 20 20 20 61 74 74       #       att
17a90 65 6d 70 74 20 74 6f 20 61 75 74 6f 6d 61 74 69  empt to automati
17aa0 63 61 6c 6c 79 20 73 65 6c 65 63 74 20 74 68 65  cally select the
17ab0 20 66 69 72 73 74 20 61 76 61 69 6c 61 62 6c 65   first available
17ac0 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 20 20  ..          #   
17ad0 20 20 20 20 62 75 69 6c 64 20 28 6f 72 20 22 72      build (or "r
17ae0 65 6c 65 61 73 65 22 29 20 6f 66 20 53 51 4c 69  elease") of SQLi
17af0 74 65 20 61 6e 64 20 53 79 73 74 65 6d 2e 44 61  te and System.Da
17b00 74 61 2e 53 51 4c 69 74 65 0d 0a 20 20 20 20 20  ta.SQLite..     
17b10 20 20 20 20 20 23 20 20 20 20 20 20 20 66 6f 72       #       for
17b20 20 75 73 65 20 77 69 74 68 20 74 68 65 20 74 65   use with the te
17b30 73 74 20 73 75 69 74 65 2e 0d 0a 20 20 20 20 20  st suite...     
17b40 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
17b50 20 20 69 66 20 7b 5b 68 61 73 52 75 6e 74 69 6d    if {[hasRuntim
17b60 65 4f 70 74 69 6f 6e 20 61 75 74 6f 53 65 6c 65  eOption autoSele
17b70 63 74 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  ct]} then {..   
17b80 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 63           if {![c
17b90 68 65 63 6b 46 6f 72 53 51 4c 69 74 65 42 75 69  heckForSQLiteBui
17ba0 6c 64 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  lds $::test_chan
17bb0 6e 65 6c 20 74 72 75 65 5d 7d 20 74 68 65 6e 20  nel true]} then 
17bc0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
17bd0 20 63 68 65 63 6b 46 6f 72 53 51 4c 69 74 65 52   checkForSQLiteR
17be0 65 6c 65 61 73 65 73 20 24 3a 3a 74 65 73 74 5f  eleases $::test_
17bf0 63 68 61 6e 6e 65 6c 20 74 72 75 65 0d 0a 20 20  channel true..  
17c00 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
17c10 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
17c20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
17c30 20 20 20 23 20 4e 4f 54 45 3a 20 53 6b 69 70 20     # NOTE: Skip 
17c40 74 72 79 69 6e 67 20 74 6f 20 76 65 72 69 66 79  trying to verify
17c50 20 74 68 65 20 62 75 69 6c 64 20 64 69 72 65 63   the build direc
17c60 74 6f 72 79 20 69 66 20 69 6e 73 74 72 75 63 74  tory if instruct
17c70 65 64 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 23  ed;..          #
17c80 20 20 20 20 20 20 20 6f 74 68 65 72 77 69 73 65         otherwise
17c90 2c 20 6d 61 6b 65 20 73 75 72 65 20 69 74 20 61  , make sure it a
17ca0 63 74 75 61 6c 6c 79 20 65 78 69 73 74 73 20 6f  ctually exists o
17cb0 72 20 68 61 6c 74 20 74 68 65 20 65 6e 74 69 72  r halt the entir
17cc0 65 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 20  e..          #  
17cd0 20 20 20 20 20 74 65 73 74 69 6e 67 20 70 72 6f       testing pro
17ce0 63 65 73 73 20 69 66 20 69 74 20 64 6f 65 73 20  cess if it does 
17cf0 6e 6f 74 20 65 78 69 73 74 2e 0d 0a 20 20 20 20  not exist...    
17d00 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
17d10 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78     if {![info ex
17d20 69 73 74 73 20 3a 3a 6e 6f 28 76 65 72 69 66 79  ists ::no(verify
17d30 42 75 69 6c 64 44 69 72 65 63 74 6f 72 79 29 5d  BuildDirectory)]
17d40 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
17d50 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
17d60 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 74 20       # NOTE: At 
17d70 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 20  this point, the 
17d80 62 75 69 6c 64 20 64 69 72 65 63 74 6f 72 79 20  build directory 
17d90 4d 55 53 54 20 65 78 69 73 74 20 61 73 20 61 0d  MUST exist as a.
17da0 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 20 20  .            #  
17db0 20 20 20 20 20 76 61 6c 69 64 20 64 69 72 65 63       valid direc
17dc0 74 6f 72 79 20 66 6f 72 20 74 68 65 20 74 65 73  tory for the tes
17dd0 74 69 6e 67 20 70 72 6f 63 65 73 73 20 74 6f 20  ting process to 
17de0 63 6f 6e 74 69 6e 75 65 2e 0d 0a 20 20 20 20 20  continue...     
17df0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
17e00 20 20 20 20 20 20 73 65 74 20 64 69 72 65 63 74        set direct
17e10 6f 72 79 20 5b 67 65 74 42 75 69 6c 64 44 69 72  ory [getBuildDir
17e20 65 63 74 6f 72 79 5d 0d 0a 0d 0a 20 20 20 20 20  ectory]....     
17e30 20 20 20 20 20 20 20 69 66 20 7b 21 5b 66 69 6c         if {![fil
17e40 65 20 65 78 69 73 74 73 20 24 64 69 72 65 63 74  e exists $direct
17e50 6f 72 79 5d 20 7c 7c 20 5c 0d 0a 20 20 20 20 20  ory] || \..     
17e60 20 20 20 20 20 20 20 20 20 20 20 21 5b 66 69 6c             ![fil
17e70 65 20 69 73 64 69 72 65 63 74 6f 72 79 20 24 64  e isdirectory $d
17e80 69 72 65 63 74 6f 72 79 5d 7d 20 74 68 65 6e 20  irectory]} then 
17e90 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
17ea0 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   #..            
17eb0 20 20 23 20 4e 4f 54 45 3a 20 4a 75 73 74 20 70    # NOTE: Just p
17ec0 72 69 6f 72 20 74 6f 20 61 63 74 75 61 6c 6c 79  rior to actually
17ed0 20 68 61 6c 74 69 6e 67 20 74 68 65 20 74 65 73   halting the tes
17ee0 74 69 6e 67 20 70 72 6f 63 65 73 73 2c 0d 0a 20  ting process,.. 
17ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20 20               #  
17f00 20 20 20 20 20 61 64 64 20 61 6e 20 65 72 72 6f       add an erro
17f10 72 20 74 6f 20 74 68 65 20 74 65 73 74 20 6c 6f  r to the test lo
17f20 67 20 66 69 6c 65 2e 0d 0a 20 20 20 20 20 20 20  g file...       
17f30 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
17f40 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
17f50 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61  :test_channel [a
17f60 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
17f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
17f80 2d 2d 2d 2d 20 63 6f 75 6c 64 20 6e 6f 74 20 76  ---- could not v
17f90 65 72 69 66 79 20 62 75 69 6c 64 20 64 69 72 65  erify build dire
17fa0 63 74 6f 72 79 20 5c 22 22 20 24 64 69 72 65 63  ctory \"" $direc
17fb0 74 6f 72 79 20 5c 0d 0a 20 20 20 20 20 20 20 20  tory \..        
17fc0 20 20 20 20 20 20 20 20 20 20 22 5c 22 2c 20 61            "\", a
17fd0 6c 6c 20 74 65 73 74 69 6e 67 20 68 61 6c 74 65  ll testing halte
17fe0 64 5c 6e 22 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  d\n"]....       
17ff0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
18000 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
18010 52 61 69 73 69 6e 67 20 61 20 73 63 72 69 70 74  Raising a script
18020 20 65 72 72 6f 72 20 66 72 6f 6d 20 74 68 69 73   error from this
18030 20 70 6f 69 6e 74 20 73 68 6f 75 6c 64 20 68 61   point should ha
18040 6c 74 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  lt..            
18050 20 20 23 20 20 20 20 20 20 20 74 68 65 20 74 65    #       the te
18060 73 74 69 6e 67 20 70 72 6f 63 65 73 73 2e 0d 0a  sting process...
18070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 0d                #.
18080 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65  .              e
18090 72 72 6f 72 20 5b 61 70 70 65 6e 64 41 72 67 73  rror [appendArgs
180a0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
180b0 20 20 20 20 20 20 22 63 6f 75 6c 64 20 6e 6f 74        "could not
180c0 20 76 65 72 69 66 79 20 62 75 69 6c 64 20 64 69   verify build di
180d0 72 65 63 74 6f 72 79 20 5c 22 22 20 24 64 69 72  rectory \"" $dir
180e0 65 63 74 6f 72 79 20 5c 0d 0a 20 20 20 20 20 20  ectory \..      
180f0 20 20 20 20 20 20 20 20 20 20 20 20 22 5c 22 2c              "\",
18100 20 61 6c 6c 20 74 65 73 74 69 6e 67 20 68 61 6c   all testing hal
18110 74 65 64 22 5d 0d 0a 20 20 20 20 20 20 20 20 20  ted"]..         
18120 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
18130 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 23  }....          #
18140 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f  ..          # NO
18150 54 45 3a 20 53 6b 69 70 20 74 72 79 69 6e 67 20  TE: Skip trying 
18160 74 6f 20 63 6f 70 79 20 61 6e 79 20 66 69 6c 65  to copy any file
18170 73 20 69 66 20 69 6e 73 74 72 75 63 74 65 64 2e  s if instructed.
18180 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20  ..          #.. 
18190 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69           if {![i
181a0 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28  nfo exists ::no(
181b0 63 6f 70 79 53 71 6c 69 74 65 46 69 6c 65 73 29  copySqliteFiles)
181c0 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
181d0 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66         if {![inf
181e0 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 63 6f  o exists ::no(co
181f0 70 79 53 71 6c 69 74 65 43 6f 6e 66 69 67 46 69  pySqliteConfigFi
18200 6c 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  les)]} then {.. 
18210 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72               for
18220 65 61 63 68 20 66 69 6c 65 4e 61 6d 65 20 24 63  each fileName $c
18230 6f 6e 66 69 67 46 69 6c 65 4e 61 6d 65 73 20 7b  onfigFileNames {
18240 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
18250 20 20 74 72 79 43 6f 70 79 42 75 69 6c 64 46 69    tryCopyBuildFi
18260 6c 65 20 24 66 69 6c 65 4e 61 6d 65 0d 0a 20 20  le $fileName..  
18270 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
18280 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a             }....
18290 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b              if {
182a0 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  ![info exists ::
182b0 6e 6f 28 63 6f 70 79 53 71 6c 69 74 65 45 78 74  no(copySqliteExt
182c0 65 72 6e 61 6c 46 69 6c 65 73 29 5d 7d 20 74 68  ernalFiles)]} th
182d0 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
182e0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
182f0 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 6f 70       # NOTE: Cop
18300 79 20 74 68 65 20 4d 61 6e 61 67 65 64 20 44 65  y the Managed De
18310 62 75 67 67 69 6e 67 20 41 73 73 69 73 74 61 6e  bugging Assistan
18320 74 73 20 28 4d 44 41 29 20 63 6f 6e 66 69 67 75  ts (MDA) configu
18330 72 61 74 69 6f 6e 0d 0a 20 20 20 20 20 20 20 20  ration..        
18340 20 20 20 20 20 20 23 20 20 20 20 20 20 20 66 69        #       fi
18350 6c 65 20 66 6f 72 20 74 68 65 20 45 61 67 6c 65  le for the Eagle
18360 20 73 68 65 6c 6c 20 74 6f 20 74 68 65 20 62 75   shell to the bu
18370 69 6c 64 20 6f 75 74 70 75 74 20 64 69 72 65 63  ild output direc
18380 74 6f 72 79 2c 0d 0a 20 20 20 20 20 20 20 20 20  tory,..         
18390 20 20 20 20 20 23 20 20 20 20 20 20 20 77 68 69       #       whi
183a0 6c 65 20 75 73 69 6e 67 20 65 61 63 68 20 6f 66  le using each of
183b0 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 74 68   the names of th
183c0 65 20 76 61 72 69 6f 75 73 20 6c 65 67 61 63 79  e various legacy
183d0 20 74 65 73 74 0d 0a 20 20 20 20 20 20 20 20 20   test..         
183e0 20 20 20 20 20 23 20 20 20 20 20 20 20 65 78 65       #       exe
183f0 63 75 74 61 62 6c 65 73 2e 20 20 54 68 69 73 20  cutables.  This 
18400 77 69 6c 6c 20 68 65 6c 70 20 74 6f 20 6d 61 6b  will help to mak
18410 65 20 73 75 72 65 20 74 68 61 74 20 61 6c 6c 20  e sure that all 
18420 74 68 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20  the..           
18430 20 20 20 23 20 20 20 20 20 20 20 6c 65 67 61 63     #       legac
18440 79 20 74 65 73 74 73 20 72 75 6e 20 77 69 74 68  y tests run with
18450 20 65 78 61 63 74 6c 79 20 74 68 65 20 73 61 6d   exactly the sam
18460 65 20 73 65 74 20 6f 66 20 4d 61 6e 61 67 65 64  e set of Managed
18470 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
18480 23 20 20 20 20 20 20 20 44 65 62 75 67 67 69 6e  #       Debuggin
18490 67 20 41 73 73 69 73 74 61 6e 74 73 20 63 6f 6e  g Assistants con
184a0 66 69 67 75 72 65 64 2e 0d 0a 20 20 20 20 20 20  figured...      
184b0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
184c0 20 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68           foreach
184d0 20 66 69 6c 65 4e 61 6d 65 20 24 6d 64 61 43 6f   fileName $mdaCo
184e0 6e 66 69 67 46 69 6c 65 4e 61 6d 65 73 20 7b 0d  nfigFileNames {.
184f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
18500 20 74 72 79 43 6f 70 79 42 69 6e 61 72 79 46 69   tryCopyBinaryFi
18510 6c 65 20 45 61 67 6c 65 53 68 65 6c 6c 2e 65 78  le EagleShell.ex
18520 65 2e 6d 64 61 2e 63 6f 6e 66 69 67 20 22 22 20  e.mda.config "" 
18530 24 66 69 6c 65 4e 61 6d 65 0d 0a 20 20 20 20 20  $fileName..     
18540 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20           }....  
18550 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20              #.. 
18560 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4e               # N
18570 4f 54 45 3a 20 43 6f 70 79 20 74 68 65 20 65 78  OTE: Copy the ex
18580 74 65 72 6e 61 6c 20 62 69 6e 61 72 69 65 73 2c  ternal binaries,
18590 20 69 66 20 61 6e 79 2c 20 74 6f 20 74 68 65 20   if any, to the 
185a0 64 69 72 65 63 74 6f 72 79 20 74 68 61 74 0d 0a  directory that..
185b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20                # 
185c0 20 20 20 20 20 20 63 6f 6e 74 61 69 6e 73 20 74        contains t
185d0 68 65 20 45 61 67 6c 65 20 73 68 65 6c 6c 2e 20  he Eagle shell. 
185e0 20 54 68 69 73 20 69 73 20 74 79 70 69 63 61 6c   This is typical
185f0 6c 79 20 75 73 65 64 20 74 6f 20 6d 61 6b 65 0d  ly used to make.
18600 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23  .              #
18610 20 20 20 20 20 20 20 73 75 72 65 20 61 73 73 65         sure asse
18620 6d 62 6c 69 65 73 20 72 65 66 65 72 65 6e 63 65  mblies reference
18630 64 20 62 79 20 74 68 65 20 6f 6e 65 73 20 62 65  d by the ones be
18640 69 6e 67 20 74 65 73 74 65 64 20 61 72 65 0d 0a  ing tested are..
18650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20                # 
18660 20 20 20 20 20 20 61 76 61 69 6c 61 62 6c 65 20        available 
18670 64 75 72 69 6e 67 20 74 68 65 20 74 65 73 74 69  during the testi
18680 6e 67 20 70 72 6f 63 65 73 73 2e 0d 0a 20 20 20  ng process...   
18690 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
186a0 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 65              fore
186b0 61 63 68 20 66 69 6c 65 4e 61 6d 65 20 24 65 78  ach fileName $ex
186c0 74 65 72 6e 61 6c 46 69 6c 65 4e 61 6d 65 73 20  ternalFileNames 
186d0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
186e0 20 20 20 74 72 79 43 6f 70 79 45 78 74 65 72 6e     tryCopyExtern
186f0 61 6c 46 69 6c 65 20 24 66 69 6c 65 4e 61 6d 65  alFile $fileName
18700 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
18710 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  }..            }
18720 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
18730 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74  if {![info exist
18740 73 20 3a 3a 6e 6f 28 63 6f 70 79 53 71 6c 69 74  s ::no(copySqlit
18750 65 4e 61 74 69 76 65 46 69 6c 65 73 29 5d 7d 20  eNativeFiles)]} 
18760 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
18770 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
18780 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49         # NOTE: I
18790 66 20 74 68 65 20 74 65 73 74 20 70 6c 61 74 66  f the test platf
187a0 6f 72 6d 20 69 73 20 6c 69 6b 65 6c 79 20 74 68  orm is likely th
187b0 65 20 64 65 66 61 75 6c 74 20 66 6f 72 20 74 68  e default for th
187c0 69 73 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  is..            
187d0 20 20 23 20 20 20 20 20 20 20 6d 61 63 68 69 6e    #       machin
187e0 65 2c 20 61 6c 73 6f 20 74 72 79 20 74 6f 20 63  e, also try to c
187f0 6f 70 79 20 74 68 65 20 6e 61 74 69 76 65 20 66  opy the native f
18800 69 6c 65 73 20 74 6f 20 74 68 65 0d 0a 20 20 20  iles to the..   
18810 20 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20             #    
18820 20 20 20 62 69 6e 61 72 79 20 6c 6f 63 61 74 69     binary locati
18830 6f 6e 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20  on...           
18840 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
18850 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65      if {![info e
18860 78 69 73 74 73 20 3a 3a 6e 6f 28 63 6f 70 79 53  xists ::no(copyS
18870 71 6c 69 74 65 49 6d 70 6c 69 63 69 74 46 69 6c  qliteImplicitFil
18880 65 73 29 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20  es)] && \..     
18890 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 69 73               [is
188a0 44 65 66 61 75 6c 74 42 75 69 6c 64 50 6c 61 74  DefaultBuildPlat
188b0 66 6f 72 6d 20 74 72 75 65 5d 7d 20 74 68 65 6e  form true]} then
188c0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
188d0 20 20 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65      foreach file
188e0 4e 61 6d 65 20 24 6e 61 74 69 76 65 46 69 6c 65  Name $nativeFile
188f0 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20 20  Names {..       
18900 20 20 20 20 20 20 20 20 20 20 20 74 72 79 43 6f             tryCo
18910 70 79 41 73 73 65 6d 62 6c 79 20 24 66 69 6c 65  pyAssembly $file
18920 4e 61 6d 65 0d 0a 20 20 20 20 20 20 20 20 20 20  Name..          
18930 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
18940 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
18950 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b            if {![
18960 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f  info exists ::no
18970 28 63 6f 70 79 53 71 6c 69 74 65 4e 6f 6e 49 6d  (copySqliteNonIm
18980 70 6c 69 63 69 74 46 69 6c 65 73 29 5d 7d 20 74  plicitFiles)]} t
18990 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
189a0 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66         if {![inf
189b0 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 63 6f  o exists ::no(co
189c0 70 79 53 71 6c 69 74 65 50 6c 61 74 66 6f 72 6d  pySqlitePlatform
189d0 46 69 6c 65 73 29 5d 20 26 26 20 5c 0d 0a 20 20  Files)] && \..  
189e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
189f0 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68    [string length
18a00 20 24 70 6c 61 74 66 6f 72 6d 5d 20 3e 20 30 7d   $platform] > 0}
18a10 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
18a20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 65 61             forea
18a30 63 68 20 66 69 6c 65 4e 61 6d 65 20 24 6e 61 74  ch fileName $nat
18a40 69 76 65 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a  iveFileNames {..
18a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18a60 20 20 20 20 74 72 79 43 6f 70 79 41 73 73 65 6d      tryCopyAssem
18a70 62 6c 79 20 24 66 69 6c 65 4e 61 6d 65 20 24 70  bly $fileName $p
18a80 6c 61 74 66 6f 72 6d 0d 0a 20 20 20 20 20 20 20  latform..       
18a90 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
18aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d                }.
18ab0 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
18ac0 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78     if {![info ex
18ad0 69 73 74 73 20 3a 3a 6e 6f 28 63 6f 70 79 53 71  ists ::no(copySq
18ae0 6c 69 74 65 41 72 63 68 69 74 65 63 74 75 72 65  liteArchitecture
18af0 46 69 6c 65 73 29 5d 20 26 26 20 5c 0d 0a 20 20  Files)] && \..  
18b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18b10 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68    [string length
18b20 20 24 61 72 63 68 69 74 65 63 74 75 72 65 5d 20   $architecture] 
18b30 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  > 0} then {..   
18b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66                 f
18b50 6f 72 65 61 63 68 20 66 69 6c 65 4e 61 6d 65 20  oreach fileName 
18b60 24 6e 61 74 69 76 65 46 69 6c 65 4e 61 6d 65 73  $nativeFileNames
18b70 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
18b80 20 20 20 20 20 20 20 20 74 72 79 43 6f 70 79 41          tryCopyA
18b90 73 73 65 6d 62 6c 79 20 24 66 69 6c 65 4e 61 6d  ssembly $fileNam
18ba0 65 20 24 61 72 63 68 69 74 65 63 74 75 72 65 0d  e $architecture.
18bb0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
18bc0 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
18bd0 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
18be0 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
18bf0 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
18c00 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66         if {![inf
18c10 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 63 6f  o exists ::no(co
18c20 70 79 53 71 6c 69 74 65 4d 61 6e 61 67 65 64 46  pySqliteManagedF
18c30 69 6c 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a  iles)]} then {..
18c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f                fo
18c50 72 65 61 63 68 20 66 69 6c 65 4e 61 6d 65 20 24  reach fileName $
18c60 6d 61 6e 61 67 65 64 46 69 6c 65 4e 61 6d 65 73  managedFileNames
18c70 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
18c80 20 20 20 20 74 72 79 43 6f 70 79 41 73 73 65 6d      tryCopyAssem
18c90 62 6c 79 20 24 66 69 6c 65 4e 61 6d 65 0d 0a 20  bly $fileName.. 
18ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a               }..
18cb0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
18cc0 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20           }....  
18cd0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
18ce0 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 6b 69       # NOTE: Ski
18cf0 70 20 74 72 79 69 6e 67 20 74 6f 20 6c 6f 61 64  p trying to load
18d00 20 61 6e 79 20 66 69 6c 65 73 20 69 66 20 69 6e   any files if in
18d10 73 74 72 75 63 74 65 64 2e 0d 0a 20 20 20 20 20  structed...     
18d20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
18d30 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69    if {![info exi
18d40 73 74 73 20 3a 3a 6e 6f 28 6c 6f 61 64 53 71 6c  sts ::no(loadSql
18d50 69 74 65 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e  iteFiles)]} then
18d60 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
18d70 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74  if {![info exist
18d80 73 20 3a 3a 6e 6f 28 6c 6f 61 64 53 71 6c 69 74  s ::no(loadSqlit
18d90 65 49 6d 70 6c 69 63 69 74 46 69 6c 65 73 29 5d  eImplicitFiles)]
18da0 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
18db0 20 20 20 20 20 20 20 20 74 72 79 4c 6f 61 64 41          tryLoadA
18dc0 73 73 65 6d 62 6c 79 20 53 79 73 74 65 6d 2e 44  ssembly System.D
18dd0 61 74 61 2e 53 51 4c 69 74 65 2e 64 6c 6c 0d 0a  ata.SQLite.dll..
18de0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d              }...
18df0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20  .            if 
18e00 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a  {![info exists :
18e10 3a 6e 6f 28 6c 6f 61 64 53 71 6c 69 74 65 4c 69  :no(loadSqliteLi
18e20 6e 71 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e 20  nqFiles)]} then 
18e30 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
18e40 20 74 72 79 4c 6f 61 64 41 73 73 65 6d 62 6c 79   tryLoadAssembly
18e50 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c   System.Data.SQL
18e60 69 74 65 2e 4c 69 6e 71 2e 64 6c 6c 0d 0a 20 20  ite.Linq.dll..  
18e70 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20            }.... 
18e80 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21             if {!
18e90 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e  [info exists ::n
18ea0 6f 28 6c 6f 61 64 53 71 6c 69 74 65 45 66 36 46  o(loadSqliteEf6F
18eb0 69 6c 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a  iles)]} then {..
18ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 72                tr
18ed0 79 4c 6f 61 64 41 73 73 65 6d 62 6c 79 20 53 79  yLoadAssembly Sy
18ee0 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
18ef0 2e 45 46 36 2e 64 6c 6c 0d 0a 20 20 20 20 20 20  .EF6.dll..      
18f00 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
18f10 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66         if {![inf
18f20 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 6c 6f  o exists ::no(lo
18f30 61 64 53 71 6c 69 74 65 4e 6f 6e 49 6d 70 6c 69  adSqliteNonImpli
18f40 63 69 74 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e  citFiles)]} then
18f50 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
18f60 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69    if {![info exi
18f70 73 74 73 20 3a 3a 6e 6f 28 6c 6f 61 64 53 71 6c  sts ::no(loadSql
18f80 69 74 65 50 6c 61 74 66 6f 72 6d 46 69 6c 65 73  itePlatformFiles
18f90 29 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20  )] && \..       
18fa0 20 20 20 20 20 20 20 20 20 20 20 5b 73 74 72 69             [stri
18fb0 6e 67 20 6c 65 6e 67 74 68 20 24 70 6c 61 74 66  ng length $platf
18fc0 6f 72 6d 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b  orm] > 0} then {
18fd0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
18fe0 20 20 74 72 79 4c 6f 61 64 41 73 73 65 6d 62 6c    tryLoadAssembl
18ff0 79 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51  y System.Data.SQ
19000 4c 69 74 65 2e 64 6c 6c 20 24 70 6c 61 74 66 6f  Lite.dll $platfo
19010 72 6d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  rm..            
19020 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20    }....         
19030 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20       if {![info 
19040 65 78 69 73 74 73 20 3a 3a 6e 6f 28 6c 6f 61 64  exists ::no(load
19050 53 71 6c 69 74 65 41 72 63 68 69 74 65 63 74 75  SqliteArchitectu
19060 72 65 46 69 6c 65 73 29 5d 20 26 26 20 5c 0d 0a  reFiles)] && \..
19070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19080 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68    [string length
19090 20 24 61 72 63 68 69 74 65 63 74 75 72 65 5d 20   $architecture] 
190a0 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  > 0} then {..   
190b0 20 20 20 20 20 20 20 20 20 20 20 20 20 74 72 79               try
190c0 4c 6f 61 64 41 73 73 65 6d 62 6c 79 20 53 79 73  LoadAssembly Sys
190d0 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e  tem.Data.SQLite.
190e0 64 6c 6c 20 24 61 72 63 68 69 74 65 63 74 75 72  dll $architectur
190f0 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e..             
19100 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   }..            
19110 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  }..          }..
19120 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
19130 20 20 20 20 20 63 61 74 63 68 20 7b 0d 0a 20 20       catch {..  
19140 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
19150 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61  :test_channel [a
19160 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
19170 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
19180 20 66 69 6c 65 20 76 65 72 73 69 6f 6e 20 6f 66   file version of
19190 20 5c 22 73 71 6c 69 74 65 33 2e 64 6c 6c 5c 22   \"sqlite3.dll\"
191a0 2e 2e 2e 20 22 20 5c 0d 0a 20 20 20 20 20 20 20  ... " \..       
191b0 20 20 20 20 20 20 20 5b 66 69 6c 65 20 76 65 72         [file ver
191c0 73 69 6f 6e 20 5b 67 65 74 42 69 6e 61 72 79 46  sion [getBinaryF
191d0 69 6c 65 4e 61 6d 65 20 73 71 6c 69 74 65 33 2e  ileName sqlite3.
191e0 64 6c 6c 5d 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20  dll]] \n]..     
191f0 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
19200 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20  catch {..       
19210 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
19220 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  _channel [append
19230 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
19240 20 20 20 20 20 20 22 2d 2d 2d 2d 20 66 69 6c 65        "---- file
19250 20 76 65 72 73 69 6f 6e 20 6f 66 20 5c 22 53 51   version of \"SQ
19260 4c 69 74 65 2e 49 6e 74 65 72 6f 70 2e 64 6c 6c  Lite.Interop.dll
19270 5c 22 2e 2e 2e 20 22 20 5c 0d 0a 20 20 20 20 20  \"... " \..     
19280 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20 76           [file v
19290 65 72 73 69 6f 6e 20 5b 67 65 74 42 69 6e 61 72  ersion [getBinar
192a0 79 46 69 6c 65 4e 61 6d 65 20 53 51 4c 69 74 65  yFileName SQLite
192b0 2e 49 6e 74 65 72 6f 70 2e 64 6c 6c 5d 5d 20 5c  .Interop.dll]] \
192c0 6e 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d  n]..        }...
192d0 0a 20 20 20 20 20 20 20 20 63 61 74 63 68 20 7b  .        catch {
192e0 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70 75 74  ..          tput
192f0 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
19300 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
19310 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22  .              "
19320 2d 2d 2d 2d 20 66 69 6c 65 20 76 65 72 73 69 6f  ---- file versio
19330 6e 20 6f 66 20 5c 22 53 79 73 74 65 6d 2e 44 61  n of \"System.Da
19340 74 61 2e 53 51 4c 69 74 65 2e 64 6c 6c 5c 22 2e  ta.SQLite.dll\".
19350 2e 2e 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20  .. " \..        
19360 20 20 20 20 20 20 5b 66 69 6c 65 20 76 65 72 73        [file vers
19370 69 6f 6e 20 5b 67 65 74 42 69 6e 61 72 79 46 69  ion [getBinaryFi
19380 6c 65 4e 61 6d 65 20 53 79 73 74 65 6d 2e 44 61  leName System.Da
19390 74 61 2e 53 51 4c 69 74 65 2e 64 6c 6c 5d 5d 20  ta.SQLite.dll]] 
193a0 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  \n]..        }..
193b0 0d 0a 20 20 20 20 20 20 20 20 63 61 74 63 68 20  ..        catch 
193c0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70 75  {..          tpu
193d0 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
193e0 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
193f0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
19400 22 2d 2d 2d 2d 20 66 69 6c 65 20 76 65 72 73 69  "---- file versi
19410 6f 6e 20 6f 66 20 5c 22 53 79 73 74 65 6d 2e 44  on of \"System.D
19420 61 74 61 2e 53 51 4c 69 74 65 2e 4c 69 6e 71 2e  ata.SQLite.Linq.
19430 64 6c 6c 5c 22 2e 2e 2e 20 22 20 5c 0d 0a 20 20  dll\"... " \..  
19440 20 20 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c              [fil
19450 65 20 76 65 72 73 69 6f 6e 20 5b 67 65 74 42 69  e version [getBi
19460 6e 61 72 79 46 69 6c 65 4e 61 6d 65 20 53 79 73  naryFileName Sys
19470 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e  tem.Data.SQLite.
19480 4c 69 6e 71 2e 64 6c 6c 5d 5d 20 5c 6e 5d 0d 0a  Linq.dll]] \n]..
19490 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
194a0 20 20 20 20 20 63 61 74 63 68 20 7b 0d 0a 20 20       catch {..  
194b0 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
194c0 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61  :test_channel [a
194d0 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
194e0 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
194f0 20 66 69 6c 65 20 76 65 72 73 69 6f 6e 20 6f 66   file version of
19500 20 5c 22 53 79 73 74 65 6d 2e 44 61 74 61 2e 53   \"System.Data.S
19510 51 4c 69 74 65 2e 45 46 36 2e 64 6c 6c 5c 22 2e  QLite.EF6.dll\".
19520 2e 2e 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20  .. " \..        
19530 20 20 20 20 20 20 5b 66 69 6c 65 20 76 65 72 73        [file vers
19540 69 6f 6e 20 5b 67 65 74 42 69 6e 61 72 79 46 69  ion [getBinaryFi
19550 6c 65 4e 61 6d 65 20 53 79 73 74 65 6d 2e 44 61  leName System.Da
19560 74 61 2e 53 51 4c 69 74 65 2e 45 46 36 2e 64 6c  ta.SQLite.EF6.dl
19570 6c 5d 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20  l]] \n]..       
19580 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66   }....        if
19590 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68   {[string length
195a0 20 24 70 6c 61 74 66 6f 72 6d 5d 20 3e 20 30 7d   $platform] > 0}
195b0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
195c0 20 20 20 63 61 74 63 68 20 7b 0d 0a 20 20 20 20     catch {..    
195d0 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
195e0 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61  :test_channel [a
195f0 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
19600 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d               "--
19610 2d 2d 20 66 69 6c 65 20 76 65 72 73 69 6f 6e 20  -- file version 
19620 6f 66 20 5c 22 22 20 24 70 6c 61 74 66 6f 72 6d  of \"" $platform
19630 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
19640 20 20 20 20 22 2f 73 71 6c 69 74 65 33 2e 64 6c      "/sqlite3.dl
19650 6c 5c 22 2e 2e 2e 20 22 20 5b 66 69 6c 65 20 76  l\"... " [file v
19660 65 72 73 69 6f 6e 20 5c 0d 0a 20 20 20 20 20 20  ersion \..      
19670 20 20 20 20 20 20 20 20 20 20 5b 67 65 74 42 69            [getBi
19680 6e 61 72 79 46 69 6c 65 4e 61 6d 65 20 73 71 6c  naryFileName sql
19690 69 74 65 33 2e 64 6c 6c 20 24 70 6c 61 74 66 6f  ite3.dll $platfo
196a0 72 6d 5d 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20 20  rm]] \n]..      
196b0 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
196c0 20 20 20 63 61 74 63 68 20 7b 0d 0a 20 20 20 20     catch {..    
196d0 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
196e0 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61  :test_channel [a
196f0 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
19700 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d               "--
19710 2d 2d 20 66 69 6c 65 20 76 65 72 73 69 6f 6e 20  -- file version 
19720 6f 66 20 5c 22 22 20 24 70 6c 61 74 66 6f 72 6d  of \"" $platform
19730 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
19740 20 20 20 20 22 2f 53 51 4c 69 74 65 2e 49 6e 74      "/SQLite.Int
19750 65 72 6f 70 2e 64 6c 6c 5c 22 2e 2e 2e 20 22 20  erop.dll\"... " 
19760 5b 66 69 6c 65 20 76 65 72 73 69 6f 6e 20 5c 0d  [file version \.
19770 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
19780 20 5b 67 65 74 42 69 6e 61 72 79 46 69 6c 65 4e   [getBinaryFileN
19790 61 6d 65 20 53 51 4c 69 74 65 2e 49 6e 74 65 72  ame SQLite.Inter
197a0 6f 70 2e 64 6c 6c 20 24 70 6c 61 74 66 6f 72 6d  op.dll $platform
197b0 5d 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20  ]] \n]..        
197c0 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20    }....         
197d0 20 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20   catch {..      
197e0 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
197f0 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70  est_channel [app
19800 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
19810 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
19820 20 66 69 6c 65 20 76 65 72 73 69 6f 6e 20 6f 66   file version of
19830 20 5c 22 22 20 24 70 6c 61 74 66 6f 72 6d 20 5c   \"" $platform \
19840 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
19850 20 20 22 2f 53 79 73 74 65 6d 2e 44 61 74 61 2e    "/System.Data.
19860 53 51 4c 69 74 65 2e 64 6c 6c 5c 22 2e 2e 2e 20  SQLite.dll\"... 
19870 22 20 5b 66 69 6c 65 20 76 65 72 73 69 6f 6e 20  " [file version 
19880 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
19890 20 20 20 5b 67 65 74 42 69 6e 61 72 79 46 69 6c     [getBinaryFil
198a0 65 4e 61 6d 65 20 53 79 73 74 65 6d 2e 44 61 74  eName System.Dat
198b0 61 2e 53 51 4c 69 74 65 2e 64 6c 6c 20 24 70 6c  a.SQLite.dll $pl
198c0 61 74 66 6f 72 6d 5d 5d 20 5c 6e 5d 0d 0a 20 20  atform]] \n]..  
198d0 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
198e0 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
198f0 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67  if {[string leng
19900 74 68 20 24 61 72 63 68 69 74 65 63 74 75 72 65  th $architecture
19910 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20  ] > 0} then {.. 
19920 20 20 20 20 20 20 20 20 20 63 61 74 63 68 20 7b           catch {
19930 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70  ..            tp
19940 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  uts $::test_chan
19950 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
19960 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
19970 20 20 20 22 2d 2d 2d 2d 20 66 69 6c 65 20 76 65     "---- file ve
19980 72 73 69 6f 6e 20 6f 66 20 5c 22 22 20 24 61 72  rsion of \"" $ar
19990 63 68 69 74 65 63 74 75 72 65 20 5c 0d 0a 20 20  chitecture \..  
199a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2f                "/
199b0 73 71 6c 69 74 65 33 2e 64 6c 6c 5c 22 2e 2e 2e  sqlite3.dll\"...
199c0 20 22 20 5b 66 69 6c 65 20 76 65 72 73 69 6f 6e   " [file version
199d0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
199e0 20 20 20 20 5b 67 65 74 42 69 6e 61 72 79 46 69      [getBinaryFi
199f0 6c 65 4e 61 6d 65 20 73 71 6c 69 74 65 33 2e 64  leName sqlite3.d
19a00 6c 6c 20 24 61 72 63 68 69 74 65 63 74 75 72 65  ll $architecture
19a10 5d 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20  ]] \n]..        
19a20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20    }....         
19a30 20 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20   catch {..      
19a40 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
19a50 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70  est_channel [app
19a60 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
19a70 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
19a80 20 66 69 6c 65 20 76 65 72 73 69 6f 6e 20 6f 66   file version of
19a90 20 5c 22 22 20 24 61 72 63 68 69 74 65 63 74 75   \"" $architectu
19aa0 72 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  re \..          
19ab0 20 20 20 20 20 20 22 2f 53 51 4c 69 74 65 2e 49        "/SQLite.I
19ac0 6e 74 65 72 6f 70 2e 64 6c 6c 5c 22 2e 2e 2e 20  nterop.dll\"... 
19ad0 22 20 5b 66 69 6c 65 20 76 65 72 73 69 6f 6e 20  " [file version 
19ae0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
19af0 20 20 20 5b 67 65 74 42 69 6e 61 72 79 46 69 6c     [getBinaryFil
19b00 65 4e 61 6d 65 20 53 51 4c 69 74 65 2e 49 6e 74  eName SQLite.Int
19b10 65 72 6f 70 2e 64 6c 6c 20 24 61 72 63 68 69 74  erop.dll $archit
19b20 65 63 74 75 72 65 5d 5d 20 5c 6e 5d 0d 0a 20 20  ecture]] \n]..  
19b30 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
19b40 20 20 20 20 20 20 20 63 61 74 63 68 20 7b 0d 0a         catch {..
19b50 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
19b60 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
19b70 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
19b80 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
19b90 20 22 2d 2d 2d 2d 20 66 69 6c 65 20 76 65 72 73   "---- file vers
19ba0 69 6f 6e 20 6f 66 20 5c 22 22 20 24 61 72 63 68  ion of \"" $arch
19bb0 69 74 65 63 74 75 72 65 20 5c 0d 0a 20 20 20 20  itecture \..    
19bc0 20 20 20 20 20 20 20 20 20 20 20 20 22 2f 53 79              "/Sy
19bd0 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
19be0 2e 64 6c 6c 5c 22 2e 2e 2e 20 22 20 5b 66 69 6c  .dll\"... " [fil
19bf0 65 20 76 65 72 73 69 6f 6e 20 5c 0d 0a 20 20 20  e version \..   
19c00 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 67 65               [ge
19c10 74 42 69 6e 61 72 79 46 69 6c 65 4e 61 6d 65 20  tBinaryFileName 
19c20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
19c30 74 65 2e 64 6c 6c 20 24 61 72 63 68 69 74 65 63  te.dll $architec
19c40 74 75 72 65 5d 5d 20 5c 6e 5d 0d 0a 20 20 20 20  ture]] \n]..    
19c50 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
19c60 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d   }....        #.
19c70 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
19c80 20 47 72 61 62 20 74 68 65 20 6c 69 73 74 20 6f   Grab the list o
19c90 66 20 6d 61 6e 61 67 65 64 20 61 73 73 65 6d 62  f managed assemb
19ca0 6c 69 65 73 20 66 6f 72 20 74 68 65 20 63 75 72  lies for the cur
19cb0 72 65 6e 74 20 70 72 6f 63 65 73 73 0d 0a 20 20  rent process..  
19cc0 20 20 20 20 20 20 23 20 20 20 20 20 20 20 61 6e        #       an
19cd0 64 20 72 65 70 6f 72 74 20 6f 6e 20 74 68 65 20  d report on the 
19ce0 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
19cf0 74 65 20 72 65 6c 61 74 65 64 20 6f 6e 65 73 2e  te related ones.
19d00 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
19d10 20 20 20 20 20 73 65 74 20 61 73 73 65 6d 62 6c       set assembl
19d20 69 65 73 20 5b 6f 62 6a 65 63 74 20 69 6e 76 6f  ies [object invo
19d30 6b 65 20 41 70 70 44 6f 6d 61 69 6e 2e 43 75 72  ke AppDomain.Cur
19d40 72 65 6e 74 44 6f 6d 61 69 6e 20 47 65 74 41 73  rentDomain GetAs
19d50 73 65 6d 62 6c 69 65 73 5d 0d 0a 0d 0a 20 20 20  semblies]....   
19d60 20 20 20 20 20 6f 62 6a 65 63 74 20 66 6f 72 65       object fore
19d70 61 63 68 20 61 73 73 65 6d 62 6c 79 20 24 61 73  ach assembly $as
19d80 73 65 6d 62 6c 69 65 73 20 7b 0d 0a 20 20 20 20  semblies {..    
19d90 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e        if {[strin
19da0 67 20 6d 61 74 63 68 20 5c 7b 53 79 73 74 65 6d  g match \{System
19db0 2e 44 61 74 61 2e 53 51 4c 69 74 65 2a 20 24 61  .Data.SQLite* $a
19dc0 73 73 65 6d 62 6c 79 5d 7d 20 74 68 65 6e 20 7b  ssembly]} then {
19dd0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70  ..            tp
19de0 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  uts $::test_chan
19df0 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
19e00 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
19e10 20 20 20 22 2d 2d 2d 2d 20 66 6f 75 6e 64 20 6c     "---- found l
19e20 6f 61 64 65 64 20 61 73 73 65 6d 62 6c 79 3a 20  oaded assembly: 
19e30 22 20 24 61 73 73 65 6d 62 6c 79 20 5c 6e 5d 0d  " $assembly \n].
19e40 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  .          }..  
19e50 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
19e60 20 20 20 63 61 74 63 68 20 7b 0d 0a 20 20 20 20     catch {..    
19e70 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
19e80 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5c 0d 0a 20  est_channel \.. 
19e90 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d               "--
19ea0 2d 2d 20 64 65 66 69 6e 65 20 63 6f 6e 73 74 61  -- define consta
19eb0 6e 74 73 20 66 6f 72 20 5c 22 53 79 73 74 65 6d  nts for \"System
19ec0 2e 44 61 74 61 2e 53 51 4c 69 74 65 5c 22 2e 2e  .Data.SQLite\"..
19ed0 2e 20 22 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  . "....         
19ee0 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20   if {[catch {.. 
19ef0 20 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63             objec
19f00 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20  t invoke -flags 
19f10 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20  +NonPublic \..  
19f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 79                Sy
19f30 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
19f40 2e 53 51 4c 69 74 65 33 20 44 65 66 69 6e 65 43  .SQLite3 DefineC
19f50 6f 6e 73 74 61 6e 74 73 0d 0a 20 20 20 20 20 20  onstants..      
19f60 20 20 20 20 7d 20 64 65 66 69 6e 65 43 6f 6e 73      } defineCons
19f70 74 61 6e 74 73 5d 20 3d 3d 20 30 7d 20 74 68 65  tants] == 0} the
19f80 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
19f90 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
19fa0 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
19fb0 67 73 20 5b 66 6f 72 6d 61 74 4c 69 73 74 20 5b  gs [formatList [
19fc0 6c 73 6f 72 74 20 5c 0d 0a 20 20 20 20 20 20 20  lsort \..       
19fd0 20 20 20 20 20 20 20 20 20 24 64 65 66 69 6e 65           $define
19fe0 43 6f 6e 73 74 61 6e 74 73 5d 20 3c 6e 6f 6e 65  Constants] <none
19ff0 3e 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20  >] \n]..        
1a000 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
1a010 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
1a020 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 75 6e  :test_channel un
1a030 6b 6e 6f 77 6e 5c 6e 0d 0a 20 20 20 20 20 20 20  known\n..       
1a040 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d     }..        }.
1a050 0a 0d 0a 20 20 20 20 20 20 20 20 63 61 74 63 68  ...        catch
1a060 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70   {..          tp
1a070 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  uts $::test_chan
1a080 6e 65 6c 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  nel \..         
1a090 20 20 20 20 20 22 2d 2d 2d 2d 20 73 6f 75 72 63       "---- sourc
1a0a0 65 20 76 65 72 73 69 6f 6e 20 6f 66 20 5c 22 53  e version of \"S
1a0b0 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
1a0c0 65 2e 64 6c 6c 5c 22 2e 2e 2e 20 22 0d 0a 0d 0a  e.dll\"... "....
1a0d0 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63            if {[c
1a0e0 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20  atch {..        
1a0f0 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b      object invok
1a100 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62  e -flags +NonPub
1a110 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  lic \..         
1a120 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61         System.Da
1a130 74 61 2e 53 51 4c 69 74 65 2e 53 51 4c 69 74 65  ta.SQLite.SQLite
1a140 43 6f 6e 6e 65 63 74 69 6f 6e 20 50 72 6f 76 69  Connection Provi
1a150 64 65 72 56 65 72 73 69 6f 6e 0d 0a 20 20 20 20  derVersion..    
1a160 20 20 20 20 20 20 7d 20 76 65 72 73 69 6f 6e 5d        } version]
1a170 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20   == 0} then {.. 
1a180 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b             if {[
1a190 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 76  string length $v
1a1a0 65 72 73 69 6f 6e 5d 20 3d 3d 20 30 7d 20 74 68  ersion] == 0} th
1a1b0 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
1a1c0 20 20 20 20 73 65 74 20 76 65 72 73 69 6f 6e 20      set version 
1a1d0 6e 75 6c 6c 0d 0a 20 20 20 20 20 20 20 20 20 20  null..          
1a1e0 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20    }..           
1a1f0 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
1a200 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
1a210 67 73 20 24 76 65 72 73 69 6f 6e 20 5c 6e 5d 0d  gs $version \n].
1a220 0a 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73  .          } els
1a230 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e {..           
1a240 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
1a250 68 61 6e 6e 65 6c 20 75 6e 6b 6e 6f 77 6e 5c 6e  hannel unknown\n
1a260 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20  ..          }.. 
1a270 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
1a280 20 20 20 20 63 61 74 63 68 20 7b 0d 0a 20 20 20      catch {..   
1a290 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
1a2a0 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5c 0d 0a  test_channel \..
1a2b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d                "-
1a2c0 2d 2d 2d 20 73 6f 75 72 63 65 20 63 68 65 63 6b  --- source check
1a2d0 6f 75 74 20 6f 66 20 5c 22 53 79 73 74 65 6d 2e  out of \"System.
1a2e0 44 61 74 61 2e 53 51 4c 69 74 65 2e 64 6c 6c 5c  Data.SQLite.dll\
1a2f0 22 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 20 20  "... "....      
1a300 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b      if {[catch {
1a310 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 6f 62  ..            ob
1a320 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61  ject invoke -fla
1a330 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d  gs +NonPublic \.
1a340 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1a350 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c   System.Data.SQL
1a360 69 74 65 2e 53 51 4c 69 74 65 43 6f 6e 6e 65 63  ite.SQLiteConnec
1a370 74 69 6f 6e 20 50 72 6f 76 69 64 65 72 53 6f 75  tion ProviderSou
1a380 72 63 65 49 64 0d 0a 20 20 20 20 20 20 20 20 20  rceId..         
1a390 20 7d 20 73 6f 75 72 63 65 49 64 5d 20 3d 3d 20   } sourceId] == 
1a3a0 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
1a3b0 20 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69         if {[stri
1a3c0 6e 67 20 6c 65 6e 67 74 68 20 24 73 6f 75 72 63  ng length $sourc
1a3d0 65 49 64 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20  eId] == 0} then 
1a3e0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
1a3f0 20 73 65 74 20 73 6f 75 72 63 65 49 64 20 6e 75   set sourceId nu
1a400 6c 6c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ll..            
1a410 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  }..            t
1a420 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
1a430 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
1a440 20 24 73 6f 75 72 63 65 49 64 20 5c 6e 5d 0d 0a   $sourceId \n]..
1a450 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65            } else
1a460 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
1a470 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
1a480 61 6e 6e 65 6c 20 75 6e 6b 6e 6f 77 6e 5c 6e 0d  annel unknown\n.
1a490 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  .          }..  
1a4a0 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
1a4b0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
1a4c0 4e 4f 54 45 3a 20 43 68 65 63 6b 20 74 68 65 20  NOTE: Check the 
1a4d0 61 76 61 69 6c 61 62 6c 65 20 62 75 69 6c 64 73  available builds
1a4e0 20 28 61 6e 64 20 22 72 65 6c 65 61 73 65 73 22   (and "releases"
1a4f0 29 20 6f 66 20 53 51 4c 69 74 65 20 61 6e 64 0d  ) of SQLite and.
1a500 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
1a510 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c   System.Data.SQL
1a520 69 74 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  ite...        #.
1a530 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f  .        checkFo
1a540 72 53 51 4c 69 74 65 42 75 69 6c 64 73 20 24 3a  rSQLiteBuilds $:
1a550 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 0d 0a 20  :test_channel.. 
1a560 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72 53         checkForS
1a570 51 4c 69 74 65 52 65 6c 65 61 73 65 73 20 24 3a  QLiteReleases $:
1a580 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 0d 0a 0d  :test_channel...
1a590 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
1a5a0 20 20 20 20 23 20 4e 4f 54 45 3a 20 4e 6f 77 2c      # NOTE: Now,
1a5b0 20 77 65 20 6e 65 65 64 20 74 6f 20 6b 6e 6f 77   we need to know
1a5c0 20 69 66 20 74 68 65 20 53 51 4c 69 74 65 20 63   if the SQLite c
1a5d0 6f 72 65 20 6c 69 62 72 61 72 79 20 69 73 20 61  ore library is a
1a5e0 76 61 69 6c 61 62 6c 65 0d 0a 20 20 20 20 20 20  vailable..      
1a5f0 20 20 23 20 20 20 20 20 20 20 28 69 2e 65 2e 20    #       (i.e. 
1a600 62 65 63 61 75 73 65 20 74 68 65 20 6d 61 6e 61  because the mana
1a610 67 65 64 2d 6f 6e 6c 79 20 53 79 73 74 65 6d 2e  ged-only System.
1a620 44 61 74 61 2e 53 51 4c 69 74 65 20 61 73 73 65  Data.SQLite asse
1a630 6d 62 6c 79 20 63 61 6e 0d 0a 20 20 20 20 20 20  mbly can..      
1a640 20 20 23 20 20 20 20 20 20 20 6c 6f 61 64 20 77    #       load w
1a650 69 74 68 6f 75 74 20 69 74 3b 20 68 6f 77 65 76  ithout it; howev
1a660 65 72 2c 20 69 74 20 63 61 6e 6e 6f 74 20 64 6f  er, it cannot do
1a670 20 61 6e 79 74 68 69 6e 67 20 75 73 65 66 75 6c   anything useful
1a680 20 77 69 74 68 6f 75 74 0d 0a 20 20 20 20 20 20   without..      
1a690 20 20 23 20 20 20 20 20 20 20 69 74 29 2e 20 20    #       it).  
1a6a0 49 66 20 77 65 20 61 72 65 20 75 73 69 6e 67 20  If we are using 
1a6b0 74 68 65 20 6d 69 78 65 64 2d 6d 6f 64 65 20 61  the mixed-mode a
1a6c0 73 73 65 6d 62 6c 79 20 61 6e 64 20 77 65 20 61  ssembly and we a
1a6d0 6c 72 65 61 64 79 0d 0a 20 20 20 20 20 20 20 20  lready..        
1a6e0 23 20 20 20 20 20 20 20 66 6f 75 6e 64 20 69 74  #       found it
1a6f0 20 28 61 62 6f 76 65 29 2c 20 74 68 69 73 20 73   (above), this s
1a700 68 6f 75 6c 64 20 61 6c 77 61 79 73 20 73 75 63  hould always suc
1a710 63 65 65 64 2e 0d 0a 20 20 20 20 20 20 20 20 23  ceed...        #
1a720 0d 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b 46  ..        checkF
1a730 6f 72 53 51 4c 69 74 65 4c 69 62 72 61 72 79 20  orSQLiteLibrary 
1a740 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 0d  $::test_channel.
1a750 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
1a760 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68        # NOTE: Ch
1a770 65 63 6b 20 69 66 20 74 68 65 20 53 51 4c 69 74  eck if the SQLit
1a780 65 20 69 6e 74 65 72 6f 70 20 61 73 73 65 6d 62  e interop assemb
1a790 6c 79 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2e  ly is available.
1a7a0 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
1a7b0 20 20 20 20 20 63 68 65 63 6b 46 6f 72 53 51 4c       checkForSQL
1a7c0 69 74 65 49 6e 74 65 72 6f 70 20 24 3a 3a 74 65  iteInterop $::te
1a7d0 73 74 5f 63 68 61 6e 6e 65 6c 0d 0a 0d 0a 20 20  st_channel....  
1a7e0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
1a7f0 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 74   # NOTE: Check t
1a800 68 65 20 53 51 4c 69 74 65 20 64 61 74 61 62 61  he SQLite databa
1a810 73 65 20 61 6e 64 20 74 65 6d 70 6f 72 61 72 79  se and temporary
1a820 20 64 69 72 65 63 74 6f 72 69 65 73 2e 0d 0a 20   directories... 
1a830 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
1a840 20 20 63 68 65 63 6b 46 6f 72 53 51 4c 69 74 65    checkForSQLite
1a850 44 69 72 65 63 74 6f 72 69 65 73 20 24 3a 3a 74  Directories $::t
1a860 65 73 74 5f 63 68 61 6e 6e 65 6c 0d 0a 0d 0a 20  est_channel.... 
1a870 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
1a880 20 20 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70    # NOTE: Attemp
1a890 74 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 69  t to determine i
1a8a0 66 20 76 61 72 69 6f 75 73 20 63 6f 6d 70 69 6c  f various compil
1a8b0 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 73 20 6e  e-time options n
1a8c0 65 65 64 65 64 20 66 6f 72 0d 0a 20 20 20 20 20  eeded for..     
1a8d0 20 20 20 23 20 20 20 20 20 20 20 74 65 73 74 20     #       test 
1a8e0 63 6f 6e 73 74 72 61 69 6e 74 73 20 77 65 72 65  constraints were
1a8f0 20 65 6e 61 62 6c 65 64 20 66 6f 72 20 74 68 65   enabled for the
1a900 20 6d 61 6e 61 67 65 64 20 61 73 73 65 6d 62 6c   managed assembl
1a910 79 2e 20 20 54 68 65 72 65 0d 0a 20 20 20 20 20  y.  There..     
1a920 20 20 20 23 20 20 20 20 20 20 20 61 72 65 20 73     #       are s
1a930 6f 6d 65 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65  ome compile-time
1a940 20 6f 70 74 69 6f 6e 73 20 74 68 61 74 20 6d 75   options that mu
1a950 73 74 20 61 6c 73 6f 20 68 61 76 65 20 62 65 65  st also have bee
1a960 6e 20 65 6e 61 62 6c 65 64 0d 0a 20 20 20 20 20  n enabled..     
1a970 20 20 20 23 20 20 20 20 20 20 20 66 6f 72 20 74     #       for t
1a980 68 65 20 69 6e 74 65 72 6f 70 20 61 73 73 65 6d  he interop assem
1a990 62 6c 79 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  bly in order to 
1a9a0 62 65 20 65 66 66 65 63 74 69 76 65 2e 20 20 46  be effective.  F
1a9b0 6f 72 20 74 68 6f 73 65 0d 0a 20 20 20 20 20 20  or those..      
1a9c0 20 20 23 20 20 20 20 20 20 20 6f 70 74 69 6f 6e    #       option
1a9d0 73 2c 20 69 74 20 77 69 6c 6c 20 62 65 20 61 73  s, it will be as
1a9e0 73 75 6d 65 64 20 74 68 61 74 20 69 74 20 77 61  sumed that it wa
1a9f0 73 20 65 6e 61 62 6c 65 64 20 66 6f 72 20 74 68  s enabled for th
1aa00 65 20 69 6e 74 65 72 6f 70 0d 0a 20 20 20 20 20  e interop..     
1aa10 20 20 20 23 20 20 20 20 20 20 20 61 73 73 65 6d     #       assem
1aa20 62 6c 79 20 69 66 20 69 74 20 77 61 73 20 65 6e  bly if it was en
1aa30 61 62 6c 65 64 20 66 6f 72 20 74 68 65 20 6d 61  abled for the ma
1aa40 6e 61 67 65 64 20 61 73 73 65 6d 62 6c 79 2e 0d  naged assembly..
1aa50 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
1aa60 20 20 20 20 66 6f 72 65 61 63 68 20 64 65 66 69      foreach defi
1aa70 6e 65 43 6f 6e 73 74 61 6e 74 20 5b 6c 69 73 74  neConstant [list
1aa80 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
1aa90 43 48 45 43 4b 5f 53 54 41 54 45 20 43 4f 55 4e  CHECK_STATE COUN
1aaa0 54 5f 48 41 4e 44 4c 45 20 44 45 42 55 47 20 49  T_HANDLE DEBUG I
1aab0 4e 54 45 52 4f 50 5f 43 4f 44 45 43 20 49 4e 54  NTEROP_CODEC INT
1aac0 45 52 4f 50 5f 44 45 42 55 47 20 5c 0d 0a 20 20  EROP_DEBUG \..  
1aad0 20 20 20 20 20 20 20 20 20 20 49 4e 54 45 52 4f            INTERO
1aae0 50 5f 45 58 54 45 4e 53 49 4f 4e 5f 46 55 4e 43  P_EXTENSION_FUNC
1aaf0 54 49 4f 4e 53 20 49 4e 54 45 52 4f 50 5f 4c 45  TIONS INTEROP_LE
1ab00 47 41 43 59 5f 43 4c 4f 53 45 20 49 4e 54 45 52  GACY_CLOSE INTER
1ab10 4f 50 5f 4c 4f 47 20 5c 0d 0a 20 20 20 20 20 20  OP_LOG \..      
1ab20 20 20 20 20 20 20 49 4e 54 45 52 4f 50 5f 54 45        INTEROP_TE
1ab30 53 54 5f 45 58 54 45 4e 53 49 4f 4e 20 49 4e 54  ST_EXTENSION INT
1ab40 45 52 4f 50 5f 56 49 52 54 55 41 4c 5f 54 41 42  EROP_VIRTUAL_TAB
1ab50 4c 45 20 4e 45 54 5f 32 30 20 4e 45 54 5f 33 35  LE NET_20 NET_35
1ab60 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
1ab70 4e 45 54 5f 34 30 20 4e 45 54 5f 34 35 20 4e 45  NET_40 NET_45 NE
1ab80 54 5f 34 35 31 20 4e 45 54 5f 43 4f 4d 50 41 43  T_451 NET_COMPAC
1ab90 54 5f 32 30 20 50 4c 41 54 46 4f 52 4d 5f 43 4f  T_20 PLATFORM_CO
1aba0 4d 50 41 43 54 46 52 41 4d 45 57 4f 52 4b 20 5c  MPACTFRAMEWORK \
1abb0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 50 52  ..            PR
1abc0 45 4c 4f 41 44 5f 4e 41 54 49 56 45 5f 4c 49 42  ELOAD_NATIVE_LIB
1abd0 52 41 52 59 20 52 45 54 41 52 47 45 54 41 42 4c  RARY RETARGETABL
1abe0 45 20 53 51 4c 49 54 45 5f 53 54 41 4e 44 41 52  E SQLITE_STANDAR
1abf0 44 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  D \..           
1ac00 20 54 48 52 4f 57 5f 4f 4e 5f 44 49 53 50 4f 53   THROW_ON_DISPOS
1ac10 45 44 20 54 52 41 43 45 20 54 52 41 43 45 5f 43  ED TRACE TRACE_C
1ac20 4f 4e 4e 45 43 54 49 4f 4e 20 54 52 41 43 45 5f  ONNECTION TRACE_
1ac30 44 45 54 45 43 54 49 4f 4e 20 5c 0d 0a 20 20 20  DETECTION \..   
1ac40 20 20 20 20 20 20 20 20 20 54 52 41 43 45 5f 48           TRACE_H
1ac50 41 4e 44 4c 45 20 54 52 41 43 45 5f 50 52 45 4c  ANDLE TRACE_PREL
1ac60 4f 41 44 20 54 52 41 43 45 5f 53 48 41 52 45 44  OAD TRACE_SHARED
1ac70 20 54 52 41 43 45 5f 53 54 41 54 45 4d 45 4e 54   TRACE_STATEMENT
1ac80 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
1ac90 54 52 41 43 45 5f 57 41 52 4e 49 4e 47 20 54 52  TRACE_WARNING TR
1aca0 41 43 4b 5f 4d 45 4d 4f 52 59 5f 42 59 54 45 53  ACK_MEMORY_BYTES
1acb0 20 55 53 45 5f 45 4e 54 49 54 59 5f 46 52 41 4d   USE_ENTITY_FRAM
1acc0 45 57 4f 52 4b 5f 36 20 5c 0d 0a 20 20 20 20 20  EWORK_6 \..     
1acd0 20 20 20 20 20 20 20 55 53 45 5f 49 4e 54 45 52         USE_INTER
1ace0 4f 50 5f 44 4c 4c 20 55 53 45 5f 50 52 45 50 41  OP_DLL USE_PREPA
1acf0 52 45 5f 56 32 20 57 49 4e 44 4f 57 53 5d 20 7b  RE_V2 WINDOWS] {
1ad00 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20  ..          #.. 
1ad10 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a           # NOTE:
1ad20 20 43 68 65 63 6b 20 69 66 20 74 68 65 20 63 6f   Check if the co
1ad30 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f  mpile-time optio
1ad40 6e 20 69 73 20 6c 69 73 74 65 64 20 69 6e 20 74  n is listed in t
1ad50 68 65 20 6c 69 73 74 20 6f 66 0d 0a 20 20 20 20  he list of..    
1ad60 20 20 20 20 20 20 23 20 20 20 20 20 20 20 22 64        #       "d
1ad70 65 66 69 6e 65 20 63 6f 6e 73 74 61 6e 74 73 22  efine constants"
1ad80 20 6b 65 70 74 20 74 72 61 63 6b 20 6f 66 20 62   kept track of b
1ad90 79 20 74 68 65 20 6d 61 6e 61 67 65 64 20 61 73  y the managed as
1ada0 73 65 6d 62 6c 79 2e 0d 0a 20 20 20 20 20 20 20  sembly...       
1adb0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
1adc0 63 68 65 63 6b 46 6f 72 53 51 4c 69 74 65 44 65  checkForSQLiteDe
1add0 66 69 6e 65 43 6f 6e 73 74 61 6e 74 20 24 3a 3a  fineConstant $::
1ade0 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 24 64 65  test_channel $de
1adf0 66 69 6e 65 43 6f 6e 73 74 61 6e 74 0d 0a 20 20  fineConstant..  
1ae00 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
1ae10 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
1ae20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 74 68 65 20  NOTE: Check the 
1ae30 63 75 72 72 65 6e 74 20 62 75 69 6c 64 20 79 65  current build ye
1ae40 61 72 2e 20 20 42 61 73 69 63 61 6c 6c 79 2c 20  ar.  Basically, 
1ae50 74 68 69 73 20 69 6e 64 69 63 61 74 65 73 0d 0a  this indicates..
1ae60 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
1ae70 77 68 69 63 68 20 76 65 72 73 69 6f 6e 20 6f 66  which version of
1ae80 20 4d 53 42 75 69 6c 64 20 61 6e 64 2f 6f 72 20   MSBuild and/or 
1ae90 56 69 73 75 61 6c 20 53 74 75 64 69 6f 20 77 61  Visual Studio wa
1aea0 73 20 75 73 65 64 20 74 6f 0d 0a 20 20 20 20 20  s used to..     
1aeb0 20 20 20 23 20 20 20 20 20 20 20 63 6f 6d 70 69     #       compi
1aec0 6c 65 20 74 68 65 20 61 73 73 65 6d 62 6c 79 20  le the assembly 
1aed0 62 69 6e 61 72 69 65 73 20 75 6e 64 65 72 20 74  binaries under t
1aee0 65 73 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  est...        #.
1aef0 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24  .        tputs $
1af00 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5c  ::test_channel \
1af10 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 2d  ..            "-
1af20 2d 2d 2d 20 63 68 65 63 6b 69 6e 67 20 66 6f 72  --- checking for
1af30 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c   System.Data.SQL
1af40 69 74 65 20 62 75 69 6c 64 20 79 65 61 72 2e 2e  ite build year..
1af50 2e 20 22 0d 0a 0d 0a 20 20 20 20 20 20 20 20 73  . "....        s
1af60 65 74 20 79 65 61 72 20 5b 67 65 74 42 75 69 6c  et year [getBuil
1af70 64 59 65 61 72 5d 0d 0a 20 20 20 20 20 20 20 20  dYear]..        
1af80 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61  addConstraint [a
1af90 70 70 65 6e 64 41 72 67 73 20 62 75 69 6c 64 59  ppendArgs buildY
1afa0 65 61 72 2e 20 24 79 65 61 72 5d 0d 0a 20 20 20  ear. $year]..   
1afb0 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
1afc0 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
1afd0 6e 64 41 72 67 73 20 5c 22 20 24 79 65 61 72 20  ndArgs \" $year 
1afe0 5c 22 5c 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  \"\n]....       
1aff0 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
1b000 54 45 3a 20 43 68 65 63 6b 20 74 68 65 20 63 75  TE: Check the cu
1b010 72 72 65 6e 74 20 62 75 69 6c 64 20 2e 4e 45 54  rrent build .NET
1b020 20 46 72 61 6d 65 77 6f 72 6b 2e 20 20 42 61 73   Framework.  Bas
1b030 69 63 61 6c 6c 79 2c 20 74 68 69 73 0d 0a 20 20  ically, this..  
1b040 20 20 20 20 20 20 23 20 20 20 20 20 20 20 69 6e        #       in
1b050 64 69 63 61 74 65 73 20 77 68 69 63 68 20 76 65  dicates which ve
1b060 72 73 69 6f 6e 20 6f 66 20 74 68 65 20 2e 4e 45  rsion of the .NE
1b070 54 20 46 72 61 6d 65 77 6f 72 6b 20 69 73 20 62  T Framework is b
1b080 65 69 6e 67 0d 0a 20 20 20 20 20 20 20 20 23 20  eing..        # 
1b090 20 20 20 20 20 20 75 73 65 64 20 62 79 20 74 68        used by th
1b0a0 65 20 61 73 73 65 6d 62 6c 79 20 62 69 6e 61 72  e assembly binar
1b0b0 69 65 73 20 75 6e 64 65 72 20 74 65 73 74 2e 0d  ies under test..
1b0c0 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
1b0d0 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
1b0e0 74 5f 63 68 61 6e 6e 65 6c 20 5c 0d 0a 20 20 20  t_channel \..   
1b0f0 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63           "---- c
1b100 68 65 63 6b 69 6e 67 20 66 6f 72 20 53 79 73 74  hecking for Syst
1b110 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 20 62  em.Data.SQLite b
1b120 75 69 6c 64 20 2e 4e 45 54 20 46 72 61 6d 65 77  uild .NET Framew
1b130 6f 72 6b 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20  ork... "....    
1b140 20 20 20 20 73 65 74 20 6e 65 74 46 78 20 5b 67      set netFx [g
1b150 65 74 42 75 69 6c 64 4e 65 74 46 78 5d 0d 0a 20  etBuildNetFx].. 
1b160 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72         addConstr
1b170 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73  aint [appendArgs
1b180 20 62 75 69 6c 64 46 72 61 6d 65 77 6f 72 6b 2e   buildFramework.
1b190 20 24 6e 65 74 46 78 5d 0d 0a 20 20 20 20 20 20   $netFx]..      
1b1a0 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
1b1b0 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
1b1c0 72 67 73 20 5c 22 20 24 6e 65 74 46 78 20 5c 22  rgs \" $netFx \"
1b1d0 5c 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23  \n]....        #
1b1e0 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
1b1f0 3a 20 43 68 65 63 6b 20 74 68 65 20 63 75 72 72  : Check the curr
1b200 65 6e 74 20 62 75 69 6c 64 20 63 6f 6e 66 69 67  ent build config
1b210 75 72 61 74 69 6f 6e 2e 20 20 54 68 69 73 20 73  uration.  This s
1b220 68 6f 75 6c 64 20 6e 6f 72 6d 61 6c 6c 79 0d 0a  hould normally..
1b230 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
1b240 62 65 20 65 69 74 68 65 72 20 22 44 65 62 75 67  be either "Debug
1b250 22 20 6f 72 20 22 52 65 6c 65 61 73 65 22 2e 0d  " or "Release"..
1b260 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
1b270 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
1b280 74 5f 63 68 61 6e 6e 65 6c 20 5c 0d 0a 20 20 20  t_channel \..   
1b290 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63           "---- c
1b2a0 68 65 63 6b 69 6e 67 20 66 6f 72 20 53 79 73 74  hecking for Syst
1b2b0 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 20 62  em.Data.SQLite b
1b2c0 75 69 6c 64 20 63 6f 6e 66 69 67 75 72 61 74 69  uild configurati
1b2d0 6f 6e 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 20  on... "....     
1b2e0 20 20 20 73 65 74 20 63 6f 6e 66 69 67 75 72 61     set configura
1b2f0 74 69 6f 6e 20 5b 67 65 74 42 75 69 6c 64 43 6f  tion [getBuildCo
1b300 6e 66 69 67 75 72 61 74 69 6f 6e 5d 0d 0a 20 20  nfiguration]..  
1b310 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61        addConstra
1b320 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20  int [appendArgs 
1b330 62 75 69 6c 64 43 6f 6e 66 69 67 75 72 61 74 69  buildConfigurati
1b340 6f 6e 2e 20 24 63 6f 6e 66 69 67 75 72 61 74 69  on. $configurati
1b350 6f 6e 5d 0d 0a 20 20 20 20 20 20 20 20 74 70 75  on]..        tpu
1b360 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
1b370 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
1b380 22 20 24 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  " $configuration
1b390 20 5c 22 5c 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20   \"\n]....      
1b3a0 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
1b3b0 4f 54 45 3a 20 54 72 79 20 74 6f 20 73 65 74 75  OTE: Try to setu
1b3c0 70 20 61 6e 20 69 6e 74 65 72 72 75 70 74 20 63  p an interrupt c
1b3d0 61 6c 6c 62 61 63 6b 20 75 73 69 6e 67 20 74 68  allback using th
1b3e0 65 20 73 63 72 69 70 74 20 64 65 62 75 67 67 65  e script debugge
1b3f0 72 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  r..        #    
1b400 20 20 20 74 68 61 74 20 77 69 6c 6c 20 63 61 6e     that will can
1b410 63 65 6c 20 61 6c 6c 20 53 51 4c 20 71 75 65 72  cel all SQL quer
1b420 69 65 73 20 69 6e 20 70 72 6f 67 72 65 73 73 20  ies in progress 
1b430 66 6f 72 20 61 6c 6c 20 64 61 74 61 62 61 73 65  for all database
1b440 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
1b450 20 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 6b 6e    connections kn
1b460 6f 77 6e 20 74 6f 20 74 68 69 73 20 69 6e 74 65  own to this inte
1b470 72 70 72 65 74 65 72 2e 0d 0a 20 20 20 20 20 20  rpreter...      
1b480 20 20 23 0d 0a 20 20 20 20 20 20 20 20 69 66 20    #..        if 
1b490 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a  {![info exists :
1b4a0 3a 6e 6f 28 73 71 6c 69 74 65 49 6e 74 65 72 72  :no(sqliteInterr
1b4b0 75 70 74 43 61 6c 6c 62 61 63 6b 29 5d 7d 20 74  uptCallback)]} t
1b4c0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
1b4d0 20 73 65 74 75 70 44 62 49 6e 74 65 72 72 75 70   setupDbInterrup
1b4e0 74 43 61 6c 6c 62 61 63 6b 20 24 3a 3a 74 65 73  tCallback $::tes
1b4f0 74 5f 63 68 61 6e 6e 65 6c 20 24 3a 3a 74 65 73  t_channel $::tes
1b500 74 5f 6c 6f 67 0d 0a 20 20 20 20 20 20 20 20 7d  t_log..        }
1b510 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  ....        #.. 
1b520 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43         # NOTE: C
1b530 68 65 63 6b 20 66 6f 72 20 74 68 65 20 6e 61 74  heck for the nat
1b540 69 76 65 20 72 75 6e 74 69 6d 65 20 6f 70 74 69  ive runtime opti
1b550 6f 6e 2c 20 77 68 69 63 68 20 77 6f 75 6c 64 20  on, which would 
1b560 6d 65 61 6e 20 77 65 20 61 72 65 0d 0a 20 20 20  mean we are..   
1b570 20 20 20 20 20 23 20 20 20 20 20 20 20 75 73 69       #       usi
1b580 6e 67 20 74 68 65 20 6d 69 78 65 64 2d 6d 6f 64  ng the mixed-mod
1b590 65 20 61 73 73 65 6d 62 6c 79 2e 0d 0a 20 20 20  e assembly...   
1b5a0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
1b5b0 63 68 65 63 6b 46 6f 72 52 75 6e 74 69 6d 65 4f  checkForRuntimeO
1b5c0 70 74 69 6f 6e 20 24 3a 3a 74 65 73 74 5f 63 68  ption $::test_ch
1b5d0 61 6e 6e 65 6c 20 6e 61 74 69 76 65 0d 0a 0d 0a  annel native....
1b5e0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
1b5f0 20 20 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b     # NOTE: Check
1b600 20 69 66 20 74 68 65 20 74 65 73 74 20 73 75 69   if the test sui
1b610 74 65 20 73 68 6f 75 6c 64 20 63 6f 75 6e 74 20  te should count 
1b620 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f  the number of co
1b630 6e 6e 65 63 74 69 6f 6e 73 0d 0a 20 20 20 20 20  nnections..     
1b640 20 20 20 23 20 20 20 20 20 20 20 22 6f 70 65 6e     #       "open
1b650 65 64 22 20 61 6e 64 20 22 63 6c 6f 73 65 64 22  ed" and "closed"
1b660 20 66 72 6f 6d 20 74 68 65 20 70 6f 6f 6c 20 77   from the pool w
1b670 68 65 6e 20 64 65 74 65 72 6d 69 6e 69 6e 67 20  hen determining 
1b680 69 66 20 61 20 74 65 73 74 0d 0a 20 20 20 20 20  if a test..     
1b690 20 20 20 23 20 20 20 20 20 20 20 70 61 73 73 65     #       passe
1b6a0 64 2e 20 20 44 69 73 61 62 6c 69 6e 67 20 74 68  d.  Disabling th
1b6b0 69 73 20 62 65 68 61 76 69 6f 72 20 69 73 20 73  is behavior is s
1b6c0 6f 6d 65 74 69 6d 65 73 20 6e 65 63 65 73 73 61  ometimes necessa
1b6d0 72 79 20 28 65 2e 67 2e 0d 0a 20 20 20 20 20 20  ry (e.g...      
1b6e0 20 20 23 20 20 20 20 20 20 20 64 75 72 69 6e 67    #       during
1b6f0 20 74 68 65 20 72 65 6c 65 61 73 65 20 74 65 73   the release tes
1b700 74 69 6e 67 20 70 72 6f 63 65 73 73 29 20 62 65  ting process) be
1b710 63 61 75 73 65 20 74 68 65 72 65 20 61 72 65 20  cause there are 
1b720 73 65 76 65 72 61 6c 0d 0a 20 20 20 20 20 20 20  several..       
1b730 20 23 20 20 20 20 20 20 20 74 65 73 74 73 20 74   #       tests t
1b740 68 61 74 20 72 65 6c 79 20 6f 6e 20 74 68 65 20  hat rely on the 
1b750 22 6f 70 65 6e 65 64 20 66 72 6f 6d 20 70 6f 6f  "opened from poo
1b760 6c 22 20 63 6f 75 6e 74 20 62 65 69 6e 67 20 67  l" count being g
1b770 72 65 61 74 65 72 0d 0a 20 20 20 20 20 20 20 20  reater..        
1b780 23 20 20 20 20 20 20 20 74 68 61 6e 20 7a 65 72  #       than zer
1b790 6f 2e 20 20 54 68 65 73 65 20 74 65 73 74 73 20  o.  These tests 
1b7a0 6d 61 79 20 66 61 69 6c 20 64 75 65 20 74 6f 20  may fail due to 
1b7b0 74 68 65 20 6e 6f 6e 2d 64 65 74 65 72 6d 69 6e  the non-determin
1b7c0 69 73 74 69 63 0d 0a 20 20 20 20 20 20 20 20 23  istic..        #
1b7d0 20 20 20 20 20 20 20 62 65 68 61 76 69 6f 72 20         behavior 
1b7e0 6f 66 20 74 68 65 20 43 4c 52 20 47 43 2c 20 65  of the CLR GC, e
1b7f0 76 65 6e 20 77 68 65 6e 20 74 68 65 72 65 20 69  ven when there i
1b800 73 20 6e 6f 20 62 75 67 20 69 6e 20 74 68 65 20  s no bug in the 
1b810 63 6f 64 65 0d 0a 20 20 20 20 20 20 20 20 23 20  code..        # 
1b820 20 20 20 20 20 20 62 65 69 6e 67 20 74 65 73 74        being test
1b830 65 64 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  ed...        #..
1b840 20 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72          checkFor
1b850 52 75 6e 74 69 6d 65 4f 70 74 69 6f 6e 20 24 3a  RuntimeOption $:
1b860 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 6e 6f  :test_channel no
1b870 50 6f 6f 6c 43 6f 75 6e 74 73 0d 0a 0d 0a 20 20  PoolCounts....  
1b880 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
1b890 20 23 20 4e 4f 54 45 3a 20 52 65 70 6f 72 74 20   # NOTE: Report 
1b8a0 74 68 65 20 72 65 73 6f 75 72 63 65 20 75 73 61  the resource usa
1b8b0 67 65 20 70 72 69 6f 72 20 74 6f 20 72 75 6e 6e  ge prior to runn
1b8c0 69 6e 67 20 61 6e 79 20 74 65 73 74 73 2e 0d 0a  ing any tests...
1b8d0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
1b8e0 20 20 20 72 65 70 6f 72 74 53 51 4c 69 74 65 52     reportSQLiteR
1b8f0 65 73 6f 75 72 63 65 73 20 24 3a 3a 74 65 73 74  esources $::test
1b900 5f 63 68 61 6e 6e 65 6c 0d 0a 0d 0a 20 20 20 20  _channel....    
1b910 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
1b920 20 4e 4f 54 45 3a 20 47 72 61 62 20 74 68 65 20   NOTE: Grab the 
1b930 6c 69 73 74 20 6f 66 20 6e 61 74 69 76 65 20 6d  list of native m
1b940 6f 64 75 6c 65 73 20 66 6f 72 20 74 68 65 20 63  odules for the c
1b950 75 72 72 65 6e 74 20 70 72 6f 63 65 73 73 20 61  urrent process a
1b960 6e 64 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  nd..        #   
1b970 20 20 20 20 72 65 70 6f 72 74 20 6f 6e 20 74 68      report on th
1b980 65 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51  e System.Data.SQ
1b990 4c 69 74 65 20 72 65 6c 61 74 65 64 20 6f 6e 65  Lite related one
1b9a0 73 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  s...        #.. 
1b9b0 20 20 20 20 20 20 20 73 65 74 20 6d 6f 64 75 6c         set modul
1b9c0 65 73 20 5b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b  es [object invok
1b9d0 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e \..           
1b9e0 20 53 79 73 74 65 6d 2e 44 69 61 67 6e 6f 73 74   System.Diagnost
1b9f0 69 63 73 2e 50 72 6f 63 65 73 73 2e 47 65 74 43  ics.Process.GetC
1ba00 75 72 72 65 6e 74 50 72 6f 63 65 73 73 20 4d 6f  urrentProcess Mo
1ba10 64 75 6c 65 73 5d 0d 0a 0d 0a 20 20 20 20 20 20  dules]....      
1ba20 20 20 6f 62 6a 65 63 74 20 66 6f 72 65 61 63 68    object foreach
1ba30 20 2d 61 6c 69 61 73 20 6d 6f 64 75 6c 65 20 24   -alias module $
1ba40 6d 6f 64 75 6c 65 73 20 7b 0d 0a 20 20 20 20 20  modules {..     
1ba50 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
1ba60 20 20 23 20 4e 4f 54 45 3a 20 54 68 65 20 6d 6f    # NOTE: The mo
1ba70 64 75 6c 65 20 66 69 6c 65 20 6e 61 6d 65 20 68  dule file name h
1ba80 65 72 65 20 6d 75 73 74 20 62 65 20 6e 6f 72 6d  ere must be norm
1ba90 61 6c 69 7a 65 64 2e 0d 0a 20 20 20 20 20 20 20  alized...       
1baa0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
1bab0 73 65 74 20 66 69 6c 65 4e 61 6d 65 20 5b 66 69  set fileName [fi
1bac0 6c 65 20 6e 6f 72 6d 61 6c 69 7a 65 20 5b 24 6d  le normalize [$m
1bad0 6f 64 75 6c 65 20 46 69 6c 65 4e 61 6d 65 5d 5d  odule FileName]]
1bae0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66  ....          if
1baf0 20 7b 5b 73 74 72 69 6e 67 20 6d 61 74 63 68 20   {[string match 
1bb00 2d 6e 6f 63 61 73 65 20 2a 2f 73 71 6c 69 74 65  -nocase */sqlite
1bb10 33 2e 64 6c 6c 20 24 66 69 6c 65 4e 61 6d 65 5d  3.dll $fileName]
1bb20 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
1bb30 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
1bb40 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70  est_channel [app
1bb50 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
1bb60 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
1bb70 20 66 6f 75 6e 64 20 6c 6f 61 64 65 64 20 53 51   found loaded SQ
1bb80 4c 69 74 65 20 6e 61 74 69 76 65 20 6c 69 62 72  Lite native libr
1bb90 61 72 79 20 6d 6f 64 75 6c 65 3a 20 22 20 5c 0d  ary module: " \.
1bba0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1bbb0 20 24 66 69 6c 65 4e 61 6d 65 20 5c 6e 5d 0d 0a   $fileName \n]..
1bbc0 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65            } else
1bbd0 69 66 20 7b 5b 73 74 72 69 6e 67 20 6d 61 74 63  if {[string matc
1bbe0 68 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  h \..           
1bbf0 20 20 20 2d 6e 6f 63 61 73 65 20 2a 2f 53 51 4c     -nocase */SQL
1bc00 69 74 65 2e 49 6e 74 65 72 6f 70 2e 64 6c 6c 20  ite.Interop.dll 
1bc10 24 66 69 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e  $fileName]} then
1bc20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
1bc30 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
1bc40 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
1bc50 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
1bc60 20 20 20 20 20 22 2d 2d 2d 2d 20 66 6f 75 6e 64       "---- found
1bc70 20 6c 6f 61 64 65 64 20 53 51 4c 69 74 65 20 69   loaded SQLite i
1bc80 6e 74 65 72 6f 70 20 61 73 73 65 6d 62 6c 79 20  nterop assembly 
1bc90 6d 6f 64 75 6c 65 3a 20 22 20 5c 0d 0a 20 20 20  module: " \..   
1bca0 20 20 20 20 20 20 20 20 20 20 20 20 20 24 66 69               $fi
1bcb0 6c 65 4e 61 6d 65 20 5c 6e 5d 0d 0a 20 20 20 20  leName \n]..    
1bcc0 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
1bcd0 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 63 61   }....        ca
1bce0 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  tch {..         
1bcf0 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
1bd00 68 61 6e 6e 65 6c 20 5c 0d 0a 20 20 20 20 20 20  hannel \..      
1bd10 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 6f          "---- co
1bd20 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f  mpile-time optio
1bd30 6e 73 20 66 6f 72 20 53 51 4c 69 74 65 20 63 6f  ns for SQLite co
1bd40 72 65 20 6c 69 62 72 61 72 79 2e 2e 2e 20 22 0d  re library... ".
1bd50 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20  ...          if 
1bd60 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20  {[catch {..     
1bd70 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e         object in
1bd80 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e  voke -flags +Non
1bd90 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20  Public \..      
1bda0 20 20 20 20 20 20 20 20 20 20 53 79 73 74 65 6d            System
1bdb0 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 53 51 4c  .Data.SQLite.SQL
1bdc0 69 74 65 33 20 53 51 4c 69 74 65 43 6f 6d 70 69  ite3 SQLiteCompi
1bdd0 6c 65 4f 70 74 69 6f 6e 73 0d 0a 20 20 20 20 20  leOptions..     
1bde0 20 20 20 20 20 7d 20 63 6f 6d 70 69 6c 65 4f 70       } compileOp
1bdf0 74 69 6f 6e 73 5d 20 3d 3d 20 30 7d 20 74 68 65  tions] == 0} the
1be00 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
1be10 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
1be20 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
1be30 67 73 20 5b 66 6f 72 6d 61 74 4c 69 73 74 20 5b  gs [formatList [
1be40 6c 73 6f 72 74 20 5c 0d 0a 20 20 20 20 20 20 20  lsort \..       
1be50 20 20 20 20 20 20 20 20 20 24 63 6f 6d 70 69 6c           $compil
1be60 65 4f 70 74 69 6f 6e 73 5d 20 3c 6e 6f 6e 65 3e  eOptions] <none>
1be70 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20  ] \n]..         
1be80 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
1be90 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
1bea0 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 75 6e 6b  test_channel unk
1beb0 6e 6f 77 6e 5c 6e 0d 0a 20 20 20 20 20 20 20 20  nown\n..        
1bec0 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a    }..        }..
1bed0 0d 0a 20 20 20 20 20 20 20 20 63 61 74 63 68 20  ..        catch 
1bee0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70 75  {..          tpu
1bef0 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
1bf00 65 6c 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  el \..          
1bf10 20 20 20 20 22 2d 2d 2d 2d 20 63 6f 6d 70 69 6c      "---- compil
1bf20 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 73 20 66  e-time options f
1bf30 6f 72 20 53 51 4c 69 74 65 20 69 6e 74 65 72 6f  or SQLite intero
1bf40 70 20 61 73 73 65 6d 62 6c 79 2e 2e 2e 20 22 0d  p assembly... ".
1bf50 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20  ...          if 
1bf60 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20  {[catch {..     
1bf70 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e         object in
1bf80 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e  voke -flags +Non
1bf90 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20  Public \..      
1bfa0 20 20 20 20 20 20 20 20 20 20 53 79 73 74 65 6d            System
1bfb0 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 53 51 4c  .Data.SQLite.SQL
1bfc0 69 74 65 33 20 49 6e 74 65 72 6f 70 43 6f 6d 70  ite3 InteropComp
1bfd0 69 6c 65 4f 70 74 69 6f 6e 73 0d 0a 20 20 20 20  ileOptions..    
1bfe0 20 20 20 20 20 20 7d 20 63 6f 6d 70 69 6c 65 4f        } compileO
1bff0 70 74 69 6f 6e 73 5d 20 3d 3d 20 30 7d 20 74 68  ptions] == 0} th
1c000 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
1c010 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
1c020 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
1c030 72 67 73 20 5b 66 6f 72 6d 61 74 4c 69 73 74 20  rgs [formatList 
1c040 5b 6c 73 6f 72 74 20 5c 0d 0a 20 20 20 20 20 20  [lsort \..      
1c050 20 20 20 20 20 20 20 20 20 20 24 63 6f 6d 70 69            $compi
1c060 6c 65 4f 70 74 69 6f 6e 73 5d 20 3c 6e 6f 6e 65  leOptions] <none
1c070 3e 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20  >] \n]..        
1c080 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
1c090 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
1c0a0 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 75 6e  :test_channel un
1c0b0 6b 6e 6f 77 6e 5c 6e 0d 0a 20 20 20 20 20 20 20  known\n..       
1c0c0 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d     }..        }.
1c0d0 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
1c0e0 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 68        # NOTE: Sh
1c0f0 6f 77 20 74 68 65 20 61 63 74 69 76 65 20 74 65  ow the active te
1c100 73 74 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e 0d  st constraints..
1c110 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
1c120 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
1c130 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e  t_channel [appen
1c140 64 41 72 67 73 20 22 2d 2d 2d 2d 20 63 6f 6e 73  dArgs "---- cons
1c150 74 72 61 69 6e 74 73 3a 20 22 20 5c 0d 0a 20 20  traints: " \..  
1c160 20 20 20 20 20 20 20 20 20 20 5b 66 6f 72 6d 61            [forma
1c170 74 4c 69 73 74 20 5b 6c 73 6f 72 74 20 5b 67 65  tList [lsort [ge
1c180 74 43 6f 6e 73 74 72 61 69 6e 74 73 5d 5d 20 3c  tConstraints]] <
1c190 6e 6f 6e 65 3e 5d 20 5c 6e 5d 0d 0a 0d 0a 20 20  none>] \n]....  
1c1a0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
1c1b0 20 23 20 4e 4f 54 45 3a 20 53 61 76 65 20 74 68   # NOTE: Save th
1c1c0 65 20 74 65 73 74 20 63 6f 6e 73 74 72 61 69 6e  e test constrain
1c1d0 74 73 20 66 6f 72 20 75 73 65 20 62 79 20 74 68  ts for use by th
1c1e0 72 65 61 64 73 20 63 72 65 61 74 65 64 20 69 6e  reads created in
1c1f0 20 74 68 69 73 0d 0a 20 20 20 20 20 20 20 20 23   this..        #
1c200 20 20 20 20 20 20 20 61 70 70 6c 69 63 61 74 69         applicati
1c210 6f 6e 20 64 6f 6d 61 69 6e 2e 20 20 54 68 69 73  on domain.  This
1c220 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 62 65   is necessary be
1c230 63 61 75 73 65 20 61 6c 6c 20 74 68 65 20 45 61  cause all the Ea
1c240 67 6c 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20  gle..        #  
1c250 20 20 20 20 20 22 74 65 73 74 20 63 6f 6e 74 65       "test conte
1c260 78 74 22 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  xt" information 
1c270 69 73 20 70 65 72 2d 74 68 72 65 61 64 2e 0d 0a  is per-thread...
1c280 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
1c290 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78     if {![info ex
1c2a0 69 73 74 73 20 3a 3a 74 65 73 74 5f 63 6f 6e 73  ists ::test_cons
1c2b0 74 72 61 69 6e 74 73 5d 7d 20 74 68 65 6e 20 7b  traints]} then {
1c2c0 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20  ..          set 
1c2d0 3a 3a 74 65 73 74 5f 63 6f 6e 73 74 72 61 69 6e  ::test_constrain
1c2e0 74 73 20 24 3a 3a 65 61 67 6c 65 5f 74 65 73 74  ts $::eagle_test
1c2f0 73 28 63 6f 6e 73 74 72 61 69 6e 74 73 29 0d 0a  s(constraints)..
1c300 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
1c310 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
1c320 23 20 4e 4f 54 45 3a 20 4c 6f 61 64 20 74 68 65  # NOTE: Load the
1c330 20 22 61 66 74 65 72 2d 63 6f 6e 73 74 72 61 69   "after-constrai
1c340 6e 74 73 22 20 63 75 73 74 6f 6d 20 70 65 72 2d  nts" custom per-
1c350 75 73 65 72 20 61 6e 64 2f 6f 72 20 70 65 72 2d  user and/or per-
1c360 68 6f 73 74 0d 0a 20 20 20 20 20 20 20 20 23 20  host..        # 
1c370 20 20 20 20 20 20 74 65 73 74 20 73 65 74 74 69        test setti
1c380 6e 67 73 20 6e 6f 77 2e 0d 0a 20 20 20 20 20 20  ngs now...      
1c390 20 20 23 0d 0a 20 20 20 20 20 20 20 20 75 70 6c    #..        upl
1c3a0 65 76 65 6c 20 31 20 5b 6c 69 73 74 20 6c 6f 61  evel 1 [list loa
1c3b0 64 53 51 4c 69 74 65 54 65 73 74 53 65 74 74 69  dSQLiteTestSetti
1c3c0 6e 67 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  ngs $::test_chan
1c3d0 6e 65 6c 20 2e 61 66 74 65 72 5d 0d 0a 0d 0a 20  nel .after].... 
1c3e0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
1c3f0 20 20 23 20 4e 4f 54 45 3a 20 53 68 6f 77 20 77    # NOTE: Show w
1c400 68 65 6e 20 6f 75 72 20 74 65 73 74 73 20 61 63  hen our tests ac
1c410 74 75 61 6c 6c 79 20 62 65 67 61 6e 20 28 6e 6f  tually began (no
1c420 77 29 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  w)...        #..
1c430 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
1c440 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61  :test_channel [a
1c450 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
1c460 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 53           "---- S
1c470 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
1c480 65 20 74 65 73 74 73 20 62 65 67 61 6e 20 61 74  e tests began at
1c490 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20   " \..          
1c4a0 20 20 5b 63 6c 6f 63 6b 20 66 6f 72 6d 61 74 20    [clock format 
1c4b0 5b 63 6c 6f 63 6b 20 73 65 63 6f 6e 64 73 5d 5d  [clock seconds]]
1c4c0 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20   \n]..      }.. 
1c4d0 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
1c4e0 63 20 72 75 6e 53 51 4c 69 74 65 54 65 73 74 45  c runSQLiteTestE
1c4f0 70 69 6c 6f 67 75 65 20 7b 7d 20 7b 0d 0a 20 20  pilogue {} {..  
1c500 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
1c510 4f 54 45 3a 20 53 6b 69 70 20 72 75 6e 6e 69 6e  OTE: Skip runnin
1c520 67 20 6f 75 72 20 63 75 73 74 6f 6d 20 65 70 69  g our custom epi
1c530 6c 6f 67 75 65 20 69 66 20 74 68 65 20 6d 61 69  logue if the mai
1c540 6e 20 6f 6e 65 20 68 61 73 20 62 65 65 6e 0d 0a  n one has been..
1c550 20 20 20 20 20 20 23 20 20 20 20 20 20 20 73 6b        #       sk
1c560 69 70 70 65 64 2e 0d 0a 20 20 20 20 20 20 23 0d  ipped...      #.
1c570 0a 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66  .      if {![inf
1c580 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 65 70  o exists ::no(ep
1c590 69 6c 6f 67 75 65 2e 65 61 67 6c 65 29 5d 7d 20  ilogue.eagle)]} 
1c5a0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
1c5b0 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
1c5c0 45 3a 20 53 68 6f 77 20 77 68 65 6e 20 6f 75 72  E: Show when our
1c5d0 20 74 65 73 74 73 20 61 63 74 75 61 6c 6c 79 20   tests actually 
1c5e0 65 6e 64 65 64 20 28 6e 6f 77 29 2e 0d 0a 20 20  ended (now)...  
1c5f0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
1c600 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
1c610 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
1c620 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
1c630 20 20 22 2d 2d 2d 2d 20 53 79 73 74 65 6d 2e 44    "---- System.D
1c640 61 74 61 2e 53 51 4c 69 74 65 20 74 65 73 74 73  ata.SQLite tests
1c650 20 65 6e 64 65 64 20 61 74 20 22 20 5c 0d 0a 20   ended at " \.. 
1c660 20 20 20 20 20 20 20 20 20 20 20 5b 63 6c 6f 63             [cloc
1c670 6b 20 66 6f 72 6d 61 74 20 5b 63 6c 6f 63 6b 20  k format [clock 
1c680 73 65 63 6f 6e 64 73 5d 5d 20 5c 6e 5d 0d 0a 0d  seconds]] \n]...
1c690 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
1c6a0 20 20 20 20 23 20 4e 4f 54 45 3a 20 4c 6f 61 64      # NOTE: Load
1c6b0 20 74 68 65 20 22 65 70 69 6c 6f 67 75 65 22 20   the "epilogue" 
1c6c0 63 75 73 74 6f 6d 20 70 65 72 2d 75 73 65 72 20  custom per-user 
1c6d0 61 6e 64 2f 6f 72 20 70 65 72 2d 68 6f 73 74 20  and/or per-host 
1c6e0 74 65 73 74 0d 0a 20 20 20 20 20 20 20 20 23 20  test..        # 
1c6f0 20 20 20 20 20 20 73 65 74 74 69 6e 67 73 20 6e        settings n
1c700 6f 77 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  ow...        #..
1c710 20 20 20 20 20 20 20 20 75 70 6c 65 76 65 6c 20          uplevel 
1c720 31 20 5b 6c 69 73 74 20 6c 6f 61 64 53 51 4c 69  1 [list loadSQLi
1c730 74 65 54 65 73 74 53 65 74 74 69 6e 67 73 20 24  teTestSettings $
1c740 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 2e  ::test_channel .
1c750 65 70 69 6c 6f 67 75 65 5d 0d 0a 0d 0a 20 20 20  epilogue]....   
1c760 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
1c770 23 20 42 55 47 46 49 58 3a 20 42 65 66 6f 72 65  # BUGFIX: Before
1c780 20 63 68 65 63 6b 69 6e 67 20 74 68 65 20 66 69   checking the fi
1c790 6e 61 6c 20 72 65 73 6f 75 72 63 65 73 20 69 6e  nal resources in
1c7a0 20 75 73 65 20 62 79 20 53 51 4c 69 74 65 2c 20   use by SQLite, 
1c7b0 6d 61 6b 65 0d 0a 20 20 20 20 20 20 20 20 23 20  make..        # 
1c7c0 20 20 20 20 20 20 20 20 73 75 72 65 20 62 6f 74          sure bot
1c7d0 68 20 6f 66 20 74 68 65 20 50 52 41 47 4d 41 20  h of the PRAGMA 
1c7e0 72 65 6c 61 74 65 64 20 64 69 72 65 63 74 6f 72  related director
1c7f0 79 20 6e 61 6d 65 73 20 61 72 65 20 66 72 65 65  y names are free
1c800 64 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  d...        #.. 
1c810 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72 53         checkForS
1c820 51 4c 69 74 65 44 69 72 65 63 74 6f 72 69 65 73  QLiteDirectories
1c830 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
1c840 20 74 72 75 65 0d 0a 0d 0a 20 20 20 20 20 20 20   true....       
1c850 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
1c860 54 45 3a 20 41 6c 73 6f 20 72 65 70 6f 72 74 20  TE: Also report 
1c870 74 68 65 20 72 65 73 6f 75 72 63 65 20 75 73 61  the resource usa
1c880 67 65 20 61 66 74 65 72 20 72 75 6e 6e 69 6e 67  ge after running
1c890 20 74 68 65 20 74 65 73 74 73 2e 0d 0a 20 20 20   the tests...   
1c8a0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
1c8b0 72 65 70 6f 72 74 53 51 4c 69 74 65 52 65 73 6f  reportSQLiteReso
1c8c0 75 72 63 65 73 20 24 3a 3a 74 65 73 74 5f 63 68  urces $::test_ch
1c8d0 61 6e 6e 65 6c 0d 0a 0d 0a 20 20 20 20 20 20 20  annel....       
1c8e0 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
1c8f0 54 45 3a 20 52 65 70 6f 72 74 20 74 68 65 20 63  TE: Report the c
1c900 72 69 74 69 63 61 6c 20 68 61 6e 64 6c 65 20 63  ritical handle c
1c910 6f 75 6e 74 73 20 61 66 74 65 72 20 72 75 6e 6e  ounts after runn
1c920 69 6e 67 20 74 68 65 20 74 65 73 74 73 2e 0d 0a  ing the tests...
1c930 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
1c940 20 20 20 67 65 74 53 51 4c 69 74 65 48 61 6e 64     getSQLiteHand
1c950 6c 65 43 6f 75 6e 74 73 20 24 3a 3a 74 65 73 74  leCounts $::test
1c960 5f 63 68 61 6e 6e 65 6c 0d 0a 20 20 20 20 20 20  _channel..      
1c970 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  }..    }.....   
1c980 20 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23   ###############
1c990 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1c9a0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1c9b0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1c9c0 23 23 23 23 23 23 23 23 23 23 23 23 0d 0a 20 20  ############..  
1c9d0 20 20 23 23 23 23 23 23 23 23 23 23 23 23 23 23    ##############
1c9e0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 20  ############### 
1c9f0 45 4e 44 20 45 61 67 6c 65 20 4f 4e 4c 59 20 23  END Eagle ONLY #
1ca00 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1ca10 23 23 23 23 23 23 23 23 23 23 23 23 23 0d 0a 20  #############.. 
1ca20 20 20 20 23 23 23 23 23 23 23 23 23 23 23 23 23     #############
1ca30 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1ca40 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1ca50 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1ca60 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0d 0a  ##############..
1ca70 20 20 7d 0d 0a 0d 0a 20 20 23 0d 0a 20 20 23 20    }....  #..  # 
1ca80 4e 4f 54 45 3a 20 53 61 76 65 20 74 68 65 20 6e  NOTE: Save the n
1ca90 61 6d 65 20 6f 66 20 74 68 65 20 64 69 72 65 63  ame of the direc
1caa0 74 6f 72 79 20 63 6f 6e 74 61 69 6e 69 6e 67 20  tory containing 
1cab0 74 68 69 73 20 66 69 6c 65 2e 0d 0a 20 20 23 0d  this file...  #.
1cac0 0a 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78  .  if {![info ex
1cad0 69 73 74 73 20 63 6f 6d 6d 6f 6e 5f 64 69 72 65  ists common_dire
1cae0 63 74 6f 72 79 5d 7d 20 74 68 65 6e 20 7b 0d 0a  ctory]} then {..
1caf0 20 20 20 20 73 65 74 20 63 6f 6d 6d 6f 6e 5f 64      set common_d
1cb00 69 72 65 63 74 6f 72 79 20 5b 66 69 6c 65 20 64  irectory [file d
1cb10 69 72 6e 61 6d 65 20 5b 69 6e 66 6f 20 73 63 72  irname [info scr
1cb20 69 70 74 5d 5d 0d 0a 20 20 7d 0d 0a 0d 0a 20 20  ipt]]..  }....  
1cb30 23 0d 0a 20 20 23 20 4e 4f 54 45 3a 20 50 72 6f  #..  # NOTE: Pro
1cb40 76 69 64 65 20 74 68 65 20 53 79 73 74 65 6d 2e  vide the System.
1cb50 44 61 74 61 2e 53 51 4c 69 74 65 20 74 65 73 74  Data.SQLite test
1cb60 20 70 61 63 6b 61 67 65 20 74 6f 20 74 68 65 20   package to the 
1cb70 69 6e 74 65 72 70 72 65 74 65 72 2e 0d 0a 20 20  interpreter...  
1cb80 23 0d 0a 20 20 70 61 63 6b 61 67 65 20 70 72 6f  #..  package pro
1cb90 76 69 64 65 20 53 79 73 74 65 6d 2e 44 61 74 61  vide System.Data
1cba0 2e 53 51 4c 69 74 65 2e 54 65 73 74 20 31 2e 30  .SQLite.Test 1.0
1cbb0 0d 0a 7d 0d 0a                                   ..}..