System.Data.SQLite
Hex Artifact Content
Not logged in

Artifact 184bef09d3d626b877e711c7147c802d53953626:


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 74 72 75 65 20 65 72 72 6f         true erro
e9d0: 72 5d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20  r]....      #.. 
e9e0: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 66 20       # NOTE: If 
e9f0: 74 68 65 20 63 6f 6d 62 69 6e 65 64 20 66 6c 61  the combined fla
ea00: 67 73 20 73 74 72 69 6e 67 20 63 6f 75 6c 64 20  gs string could 
ea10: 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 62 65 20  not actually be 
ea20: 63 6f 6e 76 65 72 74 65 64 0d 0a 20 20 20 20 20  converted..     
ea30: 20 23 20 20 20 20 20 20 20 74 6f 20 74 68 65 20   #       to the 
ea40: 65 6e 75 6d 65 72 61 74 65 64 20 74 79 70 65 20  enumerated type 
ea50: 69 74 20 69 73 20 74 68 65 20 64 65 66 61 75 6c  it is the defaul
ea60: 74 20 76 61 6c 75 65 2c 20 74 68 65 6e 20 6a 75  t value, then ju
ea70: 73 74 20 75 73 65 0d 0a 20 20 20 20 20 20 23 20  st use..      # 
ea80: 20 20 20 20 20 20 69 74 20 76 65 72 62 61 74 69        it verbati
ea90: 6d 3b 20 6f 74 68 65 72 77 69 73 65 2c 20 6a 75  m; otherwise, ju
eaa0: 73 74 20 72 65 74 75 72 6e 20 61 6e 20 65 6d 70  st return an emp
eab0: 74 79 20 73 74 72 69 6e 67 2e 20 20 49 6e 20 74  ty string.  In t
eac0: 68 61 74 0d 0a 20 20 20 20 20 20 23 20 20 20 20  hat..      #    
ead0: 20 20 20 63 61 73 65 2c 20 74 68 65 20 64 65 66     case, the def
eae0: 61 75 6c 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  ault connection 
eaf0: 66 6c 61 67 73 20 77 69 6c 6c 20 62 65 20 75 73  flags will be us
eb00: 65 64 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  ed...      #..  
eb10: 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20      if {[string 
eb20: 6c 65 6e 67 74 68 20 24 76 61 6c 75 65 5d 20 3d  length $value] =
eb30: 3d 20 30 20 7c 7c 20 24 76 61 6c 75 65 20 6e 65  = 0 || $value ne
eb40: 20 22 44 65 66 61 75 6c 74 22 7d 20 74 68 65 6e   "Default"} then
eb50: 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20   {..        #.. 
eb60: 20 20 20 20 20 20 20 23 20 57 41 52 4e 49 4e 47         # WARNING
eb70: 3a 20 54 68 69 73 20 72 65 74 75 72 6e 73 20 74  : This returns t
eb80: 68 65 20 73 74 72 69 6e 67 20 76 61 6c 75 65 20  he string value 
eb90: 6f 66 20 74 68 65 20 63 6f 6d 62 69 6e 65 64 20  of the combined 
eba0: 66 6c 61 67 73 2c 20 6e 6f 74 0d 0a 20 20 20 20  flags, not..    
ebb0: 20 20 20 20 23 20 20 20 20 20 20 20 20 20 20 74      #          t
ebc0: 68 65 20 65 6e 75 6d 65 72 61 74 65 64 20 76 61  he enumerated va
ebd0: 6c 75 65 2e 20 20 54 68 69 73 20 69 73 20 62 79  lue.  This is by
ebe0: 20 64 65 73 69 67 6e 20 61 6e 64 20 73 68 6f 75   design and shou
ebf0: 6c 64 20 6e 6f 74 0d 0a 20 20 20 20 20 20 20 20  ld not..        
ec00: 23 20 20 20 20 20 20 20 20 20 20 62 65 20 63 68  #          be ch
ec10: 61 6e 67 65 64 20 77 69 74 68 6f 75 74 20 63 61  anged without ca
ec20: 72 65 66 75 6c 20 63 6f 6e 73 69 64 65 72 61 74  reful considerat
ec30: 69 6f 6e 20 28 65 2e 67 2e 20 69 74 20 77 6f 75  ion (e.g. it wou
ec40: 6c 64 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  ld..        #   
ec50: 20 20 20 20 20 20 20 70 72 65 76 65 6e 74 20 74         prevent t
ec60: 68 65 20 53 51 4c 69 74 65 43 6f 6e 6e 65 63 74  he SQLiteConnect
ec70: 69 6f 6e 20 63 6c 61 73 73 20 66 72 6f 6d 20 61  ion class from a
ec80: 6c 6c 6f 77 69 6e 67 20 69 6e 76 61 6c 69 64 0d  llowing invalid.
ec90: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
eca0: 20 20 20 20 5b 22 6d 61 67 69 63 61 6c 22 5d 20      ["magical"] 
ecb0: 6d 65 74 61 2d 66 6c 61 67 73 29 2e 0d 0a 20 20  meta-flags)...  
ecc0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
ecd0: 20 72 65 74 75 72 6e 20 5b 61 70 70 65 6e 64 41   return [appendA
ece0: 72 67 73 20 22 46 6c 61 67 73 3d 22 20 24 66 6c  rgs "Flags=" $fl
ecf0: 61 67 73 20 5c 3b 5d 0d 0a 20 20 20 20 20 20 7d  ags \;]..      }
ed00: 0d 0a 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ....      return
ed10: 20 22 22 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20   ""..    }..... 
ed20: 20 20 20 70 72 6f 63 20 73 65 74 75 70 44 62 20     proc setupDb 
ed30: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 66  {..            f
ed40: 69 6c 65 4e 61 6d 65 20 7b 6d 6f 64 65 20 22 22  ileName {mode ""
ed50: 7d 20 7b 64 61 74 65 54 69 6d 65 46 6f 72 6d 61  } {dateTimeForma
ed60: 74 20 22 22 7d 20 7b 64 61 74 65 54 69 6d 65 4b  t ""} {dateTimeK
ed70: 69 6e 64 20 22 22 7d 20 7b 66 6c 61 67 73 20 22  ind ""} {flags "
ed80: 22 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  "}..            
ed90: 7b 65 78 74 72 61 20 22 22 7d 20 7b 71 75 61 6c  {extra ""} {qual
eda0: 69 66 79 20 74 72 75 65 7d 20 7b 64 65 6c 65 74  ify true} {delet
edb0: 65 20 74 72 75 65 7d 20 7b 75 72 69 20 66 61 6c  e true} {uri fal
edc0: 73 65 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20  se}..           
edd0: 20 7b 74 65 6d 70 6f 72 61 72 79 20 74 72 75 65   {temporary true
ede0: 7d 20 7b 76 61 72 4e 61 6d 65 20 64 62 7d 20 7b  } {varName db} {
edf0: 71 75 69 65 74 20 66 61 6c 73 65 7d 20 7d 20 7b  quiet false} } {
ee00: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
ee10: 20 23 20 4e 4f 54 45 3a 20 46 69 72 73 74 2c 20   # NOTE: First, 
ee20: 73 65 65 20 69 66 20 6f 75 72 20 63 61 6c 6c 65  see if our calle
ee30: 72 20 68 61 73 20 72 65 71 75 65 73 74 65 64 20  r has requested 
ee40: 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  an in-memory dat
ee50: 61 62 61 73 65 2e 0d 0a 20 20 20 20 20 20 23 0d  abase...      #.
ee60: 0a 20 20 20 20 20 20 73 65 74 20 69 73 4d 65 6d  .      set isMem
ee70: 6f 72 79 20 5b 69 73 4d 65 6d 6f 72 79 44 62 20  ory [isMemoryDb 
ee80: 24 66 69 6c 65 4e 61 6d 65 5d 0d 0a 0d 0a 20 20  $fileName]....  
ee90: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
eea0: 4f 54 45 3a 20 46 6f 72 20 6e 6f 77 2c 20 61 6c  OTE: For now, al
eeb0: 6c 20 74 65 73 74 20 64 61 74 61 62 61 73 65 73  l test databases
eec0: 20 75 73 65 64 20 62 79 20 74 68 65 20 74 65 73   used by the tes
eed0: 74 20 73 75 69 74 65 20 61 72 65 20 70 6c 61 63  t suite are plac
eee0: 65 64 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  ed..      #     
eef0: 20 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62    into the datab
ef00: 61 73 65 20 64 69 72 65 63 74 6f 72 79 2e 20 20  ase directory.  
ef10: 45 61 63 68 20 64 61 74 61 62 61 73 65 20 61 6e  Each database an
ef20: 64 20 72 65 6c 61 74 65 64 20 66 69 6c 65 73 0d  d related files.
ef30: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 75  .      #       u
ef40: 73 65 64 20 62 79 20 61 20 74 65 73 74 20 73 68  sed by a test sh
ef50: 6f 75 6c 64 20 62 65 20 63 6c 65 61 6e 65 64 20  ould be cleaned 
ef60: 75 70 20 62 79 20 74 68 61 74 20 74 65 73 74 20  up by that test 
ef70: 75 73 69 6e 67 20 74 68 65 0d 0a 20 20 20 20 20  using the..     
ef80: 20 23 20 20 20 20 20 20 20 22 63 6c 65 61 6e 75   #       "cleanu
ef90: 70 44 62 22 20 70 72 6f 63 65 64 75 72 65 2c 20  pDb" procedure, 
efa0: 62 65 6c 6f 77 2e 0d 0a 20 20 20 20 20 20 23 0d  below...      #.
efb0: 0a 20 20 20 20 20 20 69 66 20 7b 21 24 69 73 4d  .      if {!$isM
efc0: 65 6d 6f 72 79 20 26 26 20 24 71 75 61 6c 69 66  emory && $qualif
efd0: 79 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  y} then {..     
efe0: 20 20 20 73 65 74 20 66 69 6c 65 4e 61 6d 65 20     set fileName 
eff0: 5b 66 69 6c 65 20 6a 6f 69 6e 20 5b 67 65 74 44  [file join [getD
f000: 61 74 61 62 61 73 65 44 69 72 65 63 74 6f 72 79  atabaseDirectory
f010: 5d 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 66 69  ] [file tail $fi
f020: 6c 65 4e 61 6d 65 5d 5d 0d 0a 20 20 20 20 20 20  leName]]..      
f030: 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  }....      #..  
f040: 20 20 20 20 23 20 4e 4f 54 45 3a 20 42 79 20 64      # NOTE: By d
f050: 65 66 61 75 6c 74 2c 20 64 65 6c 65 74 65 20 61  efault, delete a
f060: 6e 79 20 70 72 65 2d 65 78 69 73 74 69 6e 67 20  ny pre-existing 
f070: 64 61 74 61 62 61 73 65 20 77 69 74 68 20 74 68  database with th
f080: 65 20 73 61 6d 65 20 66 69 6c 65 0d 0a 20 20 20  e same file..   
f090: 20 20 20 23 20 20 20 20 20 20 20 6e 61 6d 65 20     #       name 
f0a0: 69 66 20 69 74 20 63 75 72 72 65 6e 74 6c 79 20  if it currently 
f0b0: 65 78 69 73 74 73 2e 0d 0a 20 20 20 20 20 20 23  exists...      #
f0c0: 0d 0a 20 20 20 20 20 20 69 66 20 7b 21 24 69 73  ..      if {!$is
f0d0: 4d 65 6d 6f 72 79 20 26 26 20 24 64 65 6c 65 74  Memory && $delet
f0e0: 65 20 26 26 20 5b 66 69 6c 65 20 65 78 69 73 74  e && [file exist
f0f0: 73 20 24 66 69 6c 65 4e 61 6d 65 5d 7d 20 74 68  s $fileName]} th
f100: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d  en {..        #.
f110: 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
f120: 20 41 74 74 65 6d 70 74 20 74 6f 20 64 65 6c 65   Attempt to dele
f130: 74 65 20 61 6e 79 20 70 72 65 2d 65 78 69 73 74  te any pre-exist
f140: 69 6e 67 20 64 61 74 61 62 61 73 65 20 77 69 74  ing database wit
f150: 68 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65 0d  h the same file.
f160: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
f170: 20 6e 61 6d 65 2e 0d 0a 20 20 20 20 20 20 20 20   name...        
f180: 23 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b  #..        if {[
f190: 63 61 74 63 68 20 7b 66 69 6c 65 20 64 65 6c 65  catch {file dele
f1a0: 74 65 20 24 66 69 6c 65 4e 61 6d 65 7d 20 65 72  te $fileName} er
f1b0: 72 6f 72 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ror]} then {..  
f1c0: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
f1d0: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 57 65 20       # NOTE: We 
f1e0: 73 6f 6d 65 68 6f 77 20 66 61 69 6c 65 64 20 74  somehow failed t
f1f0: 6f 20 64 65 6c 65 74 65 20 74 68 65 20 66 69 6c  o delete the fil
f200: 65 2c 20 72 65 70 6f 72 74 20 77 68 79 2e 0d 0a  e, report why...
f210: 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
f220: 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69         if {!$qui
f230: 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  et} then {..    
f240: 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
f250: 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61  :test_channel [a
f260: 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
f270: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 3d 3d               "==
f280: 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c  == WARNING: fail
f290: 65 64 20 74 6f 20 64 65 6c 65 74 65 20 64 61 74  ed to delete dat
f2a0: 61 62 61 73 65 20 66 69 6c 65 20 5c 22 22 20 24  abase file \"" $
f2b0: 66 69 6c 65 4e 61 6d 65 20 5c 0d 0a 20 20 20 20  fileName \..    
f2c0: 20 20 20 20 20 20 20 20 20 20 20 20 22 5c 22 20              "\" 
f2d0: 64 75 72 69 6e 67 20 73 65 74 75 70 2c 20 65 72  during setup, er
f2e0: 72 6f 72 3a 20 22 20 5c 6e 5c 74 20 24 65 72 72  ror: " \n\t $err
f2f0: 6f 72 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20  or \n]..        
f300: 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a    }..        }..
f310: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
f320: 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
f330: 3a 20 52 65 66 65 72 20 74 6f 20 74 68 65 20 73  : Refer to the s
f340: 70 65 63 69 66 69 65 64 20 76 61 72 69 61 62 6c  pecified variabl
f350: 65 20 28 65 2e 67 2e 20 22 64 62 22 29 20 69 6e  e (e.g. "db") in
f360: 20 74 68 65 20 63 6f 6e 74 65 78 74 20 6f 66 20   the context of 
f370: 6f 75 72 0d 0a 20 20 20 20 20 20 23 20 20 20 20  our..      #    
f380: 20 20 20 63 61 6c 6c 65 72 2e 20 20 54 68 65 20     caller.  The 
f390: 68 61 6e 64 6c 65 20 74 6f 20 74 68 65 20 6f 70  handle to the op
f3a0: 65 6e 65 64 20 64 61 74 61 62 61 73 65 20 77 69  ened database wi
f3b0: 6c 6c 20 62 65 20 73 74 6f 72 65 64 20 74 68 65  ll be stored the
f3c0: 72 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  re...      #..  
f3d0: 20 20 20 20 75 70 76 61 72 20 31 20 24 76 61 72      upvar 1 $var
f3e0: 4e 61 6d 65 20 64 62 0d 0a 0d 0a 20 20 20 20 20  Name db....     
f3f0: 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
f400: 3a 20 53 74 61 72 74 20 62 75 69 6c 64 69 6e 67  : Start building
f410: 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
f420: 73 74 72 69 6e 67 2e 20 20 54 68 65 20 6f 6e 6c  string.  The onl
f430: 79 20 72 65 71 75 69 72 65 64 20 70 6f 72 74 69  y required porti
f440: 6f 6e 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  on..      #     
f450: 20 20 6f 66 20 74 68 65 20 63 6f 6e 6e 65 63 74    of the connect
f460: 69 6f 6e 20 73 74 72 69 6e 67 20 69 73 20 74 68  ion string is th
f470: 65 20 64 61 74 61 20 73 6f 75 72 63 65 2c 20 77  e data source, w
f480: 68 69 63 68 20 63 6f 6e 74 61 69 6e 73 20 74 68  hich contains th
f490: 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  e..      #      
f4a0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6e   database file n
f4b0: 61 6d 65 20 69 74 73 65 6c 66 2e 20 20 49 66 20  ame itself.  If 
f4c0: 6f 75 72 20 63 61 6c 6c 65 72 20 77 61 6e 74 73  our caller wants
f4d0: 20 74 6f 20 75 73 65 20 61 20 55 52 49 20 61 73   to use a URI as
f4e0: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
f4f0: 74 68 65 20 64 61 74 61 20 73 6f 75 72 63 65 2c  the data source,
f500: 20 75 73 65 20 74 68 65 20 46 75 6c 6c 55 72 69   use the FullUri
f510: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 74 72 69   connection stri
f520: 6e 67 20 70 72 6f 70 65 72 74 79 20 74 6f 0d 0a  ng property to..
f530: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 70 72        #       pr
f540: 65 76 65 6e 74 20 74 68 65 20 64 61 74 61 20 73  event the data s
f550: 6f 75 72 63 65 20 73 74 72 69 6e 67 20 66 72 6f  ource string fro
f560: 6d 20 62 65 69 6e 67 20 6d 61 6e 67 6c 65 64 2e  m being mangled.
f570: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
f580: 20 69 66 20 7b 24 75 72 69 7d 20 74 68 65 6e 20   if {$uri} then 
f590: 7b 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 63  {..        set c
f5a0: 6f 6e 6e 65 63 74 69 6f 6e 20 7b 46 75 6c 6c 55  onnection {FullU
f5b0: 72 69 3d 24 7b 66 69 6c 65 4e 61 6d 65 7d 7d 0d  ri=${fileName}}.
f5c0: 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d  .      } else {.
f5d0: 0a 20 20 20 20 20 20 20 20 73 65 74 20 63 6f 6e  .        set con
f5e0: 6e 65 63 74 69 6f 6e 20 7b 44 61 74 61 20 53 6f  nection {Data So
f5f0: 75 72 63 65 3d 24 7b 66 69 6c 65 4e 61 6d 65 7d  urce=${fileName}
f600: 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  }..      }....  
f610: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
f620: 4f 54 45 3a 20 53 69 6e 63 65 20 74 68 69 73 20  OTE: Since this 
f630: 70 72 6f 63 65 64 75 72 65 20 68 61 73 20 6e 6f  procedure has no
f640: 20 73 70 65 63 69 61 6c 20 6b 6e 6f 77 6c 65 64   special knowled
f650: 67 65 20 6f 66 20 77 68 61 74 20 74 68 65 20 64  ge of what the d
f660: 65 66 61 75 6c 74 0d 0a 20 20 20 20 20 20 23 20  efault..      # 
f670: 20 20 20 20 20 20 73 65 74 74 69 6e 67 20 69 73        setting is
f680: 20 66 6f 72 20 74 68 65 20 54 6f 46 75 6c 6c 50   for the ToFullP
f690: 61 74 68 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73  ath connection s
f6a0: 74 72 69 6e 67 20 70 72 6f 70 65 72 79 2c 20 61  tring propery, a
f6b0: 6c 77 61 79 73 0d 0a 20 20 20 20 20 20 23 20 20  lways..      #  
f6c0: 20 20 20 20 20 61 64 64 20 74 68 65 20 76 61 6c       add the val
f6d0: 75 65 20 77 65 20 6b 6e 6f 77 20 61 62 6f 75 74  ue we know about
f6e0: 20 74 6f 20 74 68 65 20 63 6f 6e 6e 65 63 74 69   to the connecti
f6f0: 6f 6e 20 73 74 72 69 6e 67 2e 0d 0a 20 20 20 20  on string...    
f700: 20 20 23 0d 0a 20 20 20 20 20 20 61 70 70 65 6e    #..      appen
f710: 64 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 7b 3b 54  d connection {;T
f720: 6f 46 75 6c 6c 50 61 74 68 3d 24 7b 71 75 61 6c  oFullPath=${qual
f730: 69 66 79 7d 7d 0d 0a 0d 0a 20 20 20 20 20 20 23  ify}}....      #
f740: 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
f750: 49 66 20 6f 75 72 20 63 61 6c 6c 65 72 20 73 70  If our caller sp
f760: 65 63 69 66 69 65 64 20 61 20 6a 6f 75 72 6e 61  ecified a journa
f770: 6c 20 6d 6f 64 65 2c 20 61 64 64 20 74 68 65 20  l mode, add the 
f780: 6e 65 63 65 73 73 61 72 79 20 70 6f 72 74 69 6f  necessary portio
f790: 6e 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  n..      #      
f7a0: 20 6f 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69   of the connecti
f7b0: 6f 6e 20 73 74 72 69 6e 67 20 6e 6f 77 2e 0d 0a  on string now...
f7c0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69        #..      i
f7d0: 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74  f {[string lengt
f7e0: 68 20 24 6d 6f 64 65 5d 20 3e 20 30 7d 20 74 68  h $mode] > 0} th
f7f0: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 61 70  en {..        ap
f800: 70 65 6e 64 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  pend connection 
f810: 7b 3b 4a 6f 75 72 6e 61 6c 20 4d 6f 64 65 3d 24  {;Journal Mode=$
f820: 7b 6d 6f 64 65 7d 7d 0d 0a 20 20 20 20 20 20 7d  {mode}}..      }
f830: 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  ....      #..   
f840: 20 20 20 23 20 4e 4f 54 45 3a 20 49 66 20 6f 75     # NOTE: If ou
f850: 72 20 63 61 6c 6c 65 72 20 73 70 65 63 69 66 69  r caller specifi
f860: 65 64 20 61 20 44 61 74 65 54 69 6d 65 20 66 6f  ed a DateTime fo
f870: 72 6d 61 74 2c 20 61 64 64 20 74 68 65 20 6e 65  rmat, add the ne
f880: 63 65 73 73 61 72 79 0d 0a 20 20 20 20 20 20 23  cessary..      #
f890: 20 20 20 20 20 20 20 70 6f 72 74 69 6f 6e 20 6f         portion o
f8a0: 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  f the connection
f8b0: 20 73 74 72 69 6e 67 20 6e 6f 77 2e 0d 0a 20 20   string now...  
f8c0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20      #..      if 
f8d0: 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20  {[string length 
f8e0: 24 64 61 74 65 54 69 6d 65 46 6f 72 6d 61 74 5d  $dateTimeFormat]
f8f0: 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20   > 0} then {..  
f900: 20 20 20 20 20 20 61 70 70 65 6e 64 20 63 6f 6e        append con
f910: 6e 65 63 74 69 6f 6e 20 7b 3b 44 61 74 65 54 69  nection {;DateTi
f920: 6d 65 46 6f 72 6d 61 74 3d 24 7b 64 61 74 65 54  meFormat=${dateT
f930: 69 6d 65 46 6f 72 6d 61 74 7d 7d 0d 0a 20 20 20  imeFormat}}..   
f940: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d     }....      #.
f950: 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49  .      # NOTE: I
f960: 66 20 6f 75 72 20 63 61 6c 6c 65 72 20 73 70 65  f our caller spe
f970: 63 69 66 69 65 64 20 61 20 44 61 74 65 54 69 6d  cified a DateTim
f980: 65 4b 69 6e 64 2c 20 61 64 64 20 74 68 65 20 6e  eKind, add the n
f990: 65 63 65 73 73 61 72 79 20 70 6f 72 74 69 6f 6e  ecessary portion
f9a0: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
f9b0: 6f 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  of the connectio
f9c0: 6e 20 73 74 72 69 6e 67 20 6e 6f 77 2e 0d 0a 20  n string now... 
f9d0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66       #..      if
f9e0: 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68   {[string length
f9f0: 20 24 64 61 74 65 54 69 6d 65 4b 69 6e 64 5d 20   $dateTimeKind] 
fa00: 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  > 0} then {..   
fa10: 20 20 20 20 20 61 70 70 65 6e 64 20 63 6f 6e 6e       append conn
fa20: 65 63 74 69 6f 6e 20 7b 3b 44 61 74 65 54 69 6d  ection {;DateTim
fa30: 65 4b 69 6e 64 3d 24 7b 64 61 74 65 54 69 6d 65  eKind=${dateTime
fa40: 4b 69 6e 64 7d 7d 0d 0a 20 20 20 20 20 20 7d 0d  Kind}}..      }.
fa50: 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
fa60: 20 20 23 20 4e 4f 54 45 3a 20 46 69 67 75 72 65    # NOTE: Figure
fa70: 20 6f 75 74 20 77 68 61 74 20 74 68 65 20 66 69   out what the fi
fa80: 6e 61 6c 20 66 6c 61 67 73 20 66 6f 72 20 74 68  nal flags for th
fa90: 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6e 65  is connection ne
faa0: 65 64 20 74 6f 20 62 65 2e 0d 0a 20 20 20 20 20  ed to be...     
fab0: 20 23 0d 0a 20 20 20 20 20 20 73 65 74 20 66 6c   #..      set fl
fac0: 61 67 73 20 5b 67 65 74 43 6f 6e 6e 65 63 74 69  ags [getConnecti
fad0: 6f 6e 46 6c 61 67 73 20 24 66 69 6c 65 4e 61 6d  onFlags $fileNam
fae0: 65 20 24 66 6c 61 67 73 20 24 71 75 69 65 74 5d  e $flags $quiet]
faf0: 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  ....      #..   
fb00: 20 20 20 23 20 4e 4f 54 45 3a 20 49 66 20 6f 75     # NOTE: If ou
fb10: 72 20 63 61 6c 6c 65 72 20 73 70 65 63 69 66 69  r caller specifi
fb20: 65 64 20 73 6f 6d 65 20 53 51 4c 69 74 65 43 6f  ed some SQLiteCo
fb30: 6e 6e 65 63 74 69 6f 6e 46 6c 61 67 73 2c 20 61  nnectionFlags, a
fb40: 64 64 20 74 68 65 0d 0a 20 20 20 20 20 20 23 20  dd the..      # 
fb50: 20 20 20 20 20 20 6e 65 63 65 73 73 61 72 79 20        necessary 
fb60: 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65 20 63  portion of the c
fb70: 6f 6e 6e 65 63 74 69 6f 6e 20 73 74 72 69 6e 67  onnection string
fb80: 20 6e 6f 77 2e 0d 0a 20 20 20 20 20 20 23 0d 0a   now...      #..
fb90: 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e        if {[strin
fba0: 67 20 6c 65 6e 67 74 68 20 24 66 6c 61 67 73 5d  g length $flags]
fbb0: 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20   > 0} then {..  
fbc0: 20 20 20 20 20 20 61 70 70 65 6e 64 20 63 6f 6e        append con
fbd0: 6e 65 63 74 69 6f 6e 20 7b 3b 46 6c 61 67 73 3d  nection {;Flags=
fbe0: 24 7b 66 6c 61 67 73 7d 7d 0d 0a 20 20 20 20 20  ${flags}}..     
fbf0: 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20   }....      #.. 
fc00: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 66 20       # NOTE: If 
fc10: 6f 75 72 20 63 61 6c 6c 65 72 20 73 70 65 63 69  our caller speci
fc20: 66 69 65 64 20 61 6e 20 65 78 74 72 61 20 70 61  fied an extra pa
fc30: 79 6c 6f 61 64 20 74 6f 20 74 68 65 20 63 6f 6e  yload to the con
fc40: 6e 65 63 74 69 6f 6e 0d 0a 20 20 20 20 20 20 23  nection..      #
fc50: 20 20 20 20 20 20 20 73 74 72 69 6e 67 2c 20 61         string, a
fc60: 70 70 65 6e 64 20 69 74 20 6e 6f 77 2e 0d 0a 20  ppend it now... 
fc70: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66       #..      if
fc80: 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68   {[string length
fc90: 20 24 65 78 74 72 61 5d 20 3e 20 30 7d 20 74 68   $extra] > 0} th
fca0: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 61 70  en {..        ap
fcb0: 70 65 6e 64 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  pend connection 
fcc0: 5c 3b 20 24 65 78 74 72 61 0d 0a 20 20 20 20 20  \; $extra..     
fcd0: 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20   }....      #.. 
fce0: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4f 70 65       # NOTE: Ope
fcf0: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63  n the database c
fd00: 6f 6e 6e 65 63 74 69 6f 6e 20 6e 6f 77 2c 20 70  onnection now, p
fd10: 6c 61 63 69 6e 67 20 74 68 65 20 6f 70 61 71 75  lacing the opaqu
fd20: 65 20 68 61 6e 64 6c 65 20 76 61 6c 75 65 0d 0a  e handle value..
fd30: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 69 6e        #       in
fd40: 74 6f 20 74 68 65 20 76 61 72 69 61 62 6c 65 20  to the variable 
fd50: 73 70 65 63 69 66 69 65 64 20 62 79 20 6f 75 72  specified by our
fd60: 20 63 61 6c 6c 65 72 2e 0d 0a 20 20 20 20 20 20   caller...      
fd70: 23 0d 0a 20 20 20 20 20 20 73 65 74 20 64 62 20  #..      set db 
fd80: 5b 73 71 6c 20 6f 70 65 6e 20 2d 74 79 70 65 20  [sql open -type 
fd90: 53 51 4c 69 74 65 20 5b 73 75 62 73 74 20 24 63  SQLite [subst $c
fda0: 6f 6e 6e 65 63 74 69 6f 6e 5d 5d 0d 0a 0d 0a 20  onnection]].... 
fdb0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
fdc0: 4e 4f 54 45 3a 20 43 6f 6e 66 69 67 75 72 65 20  NOTE: Configure 
fdd0: 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 64 69  the temporary di
fde0: 72 65 63 74 6f 72 79 20 66 6f 72 20 74 68 65 20  rectory for the 
fdf0: 6e 65 77 6c 79 20 6f 70 65 6e 65 64 20 64 61 74  newly opened dat
fe00: 61 62 61 73 65 0d 0a 20 20 20 20 20 20 23 20 20  abase..      #  
fe10: 20 20 20 20 20 63 6f 6e 6e 65 63 74 69 6f 6e 20       connection 
fe20: 6e 6f 77 20 75 6e 6c 65 73 73 20 6f 75 72 20 63  now unless our c
fe30: 61 6c 6c 65 72 20 66 6f 72 62 69 64 73 20 69 74  aller forbids it
fe40: 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
fe50: 20 20 69 66 20 7b 24 74 65 6d 70 6f 72 61 72 79    if {$temporary
fe60: 20 26 26 20 21 5b 69 6e 66 6f 20 65 78 69 73 74   && ![info exist
fe70: 73 20 3a 3a 6e 6f 28 73 65 74 54 65 6d 70 6f 72  s ::no(setTempor
fe80: 61 72 79 44 69 72 65 63 74 6f 72 79 29 5d 7d 20  aryDirectory)]} 
fe90: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
fea0: 73 71 6c 20 65 78 65 63 75 74 65 20 24 64 62 20  sql execute $db 
feb0: 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
fec0: 20 20 20 20 20 20 20 20 20 20 20 22 50 52 41 47             "PRAG
fed0: 4d 41 20 74 65 6d 70 5f 73 74 6f 72 65 5f 64 69  MA temp_store_di
fee0: 72 65 63 74 6f 72 79 20 3d 20 5c 22 22 20 5b 67  rectory = \"" [g
fef0: 65 74 54 65 6d 70 6f 72 61 72 79 44 69 72 65 63  etTemporaryDirec
ff00: 74 6f 72 79 5d 20 5c 22 5c 3b 5d 0d 0a 20 20 20  tory] \"\;]..   
ff10: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d     }....      #.
ff20: 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41  .      # NOTE: A
ff30: 6c 77 61 79 73 20 72 65 74 75 72 6e 20 74 68 65  lways return the
ff40: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 6e 64   connection hand
ff50: 6c 65 20 75 70 6f 6e 20 73 75 63 63 65 73 73 2e  le upon success.
ff60: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
ff70: 20 72 65 74 75 72 6e 20 24 64 62 0d 0a 20 20 20   return $db..   
ff80: 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
ff90: 67 65 74 44 62 43 6f 6e 6e 65 63 74 69 6f 6e 20  getDbConnection 
ffa0: 7b 20 7b 76 61 72 4e 61 6d 65 20 64 62 7d 20 7d  { {varName db} }
ffb0: 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20   {..      #..   
ffc0: 20 20 20 23 20 4e 4f 54 45 3a 20 52 65 66 65 72     # NOTE: Refer
ffd0: 20 74 6f 20 74 68 65 20 73 70 65 63 69 66 69 65   to the specifie
ffe0: 64 20 76 61 72 69 61 62 6c 65 20 28 65 2e 67 2e  d variable (e.g.
fff0: 20 22 64 62 22 29 20 69 6e 20 74 68 65 20 63 6f   "db") in the co
10000 6e 74 65 78 74 20 6f 66 20 6f 75 72 0d 0a 20 20  ntext of our..  
10010 20 20 20 20 23 20 20 20 20 20 20 20 63 61 6c 6c      #       call
10020 65 72 2e 20 20 54 68 65 20 68 61 6e 64 6c 65 20  er.  The handle 
10030 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
10040 70 72 65 76 69 6f 75 73 6c 79 20 6f 70 65 6e 65  previously opene
10050 64 20 76 69 61 20 74 68 65 0d 0a 20 20 20 20 20  d via the..     
10060 20 23 20 20 20 20 20 20 20 5b 73 65 74 75 70 44   #       [setupD
10070 62 5d 20 70 72 6f 63 65 64 75 72 65 20 73 68 6f  b] procedure sho
10080 75 6c 64 20 62 65 20 73 74 6f 72 65 64 20 74 68  uld be stored th
10090 65 72 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ere...      #.. 
100a0 20 20 20 20 20 75 70 76 61 72 20 31 20 24 76 61       upvar 1 $va
100b0 72 4e 61 6d 65 20 64 62 0d 0a 0d 0a 20 20 20 20  rName db....    
100c0 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
100d0 45 3a 20 54 68 69 73 20 72 65 74 75 72 6e 73 20  E: This returns 
100e0 74 68 65 20 41 44 4f 2e 4e 45 54 20 49 44 62 43  the ADO.NET IDbC
100f0 6f 6e 6e 65 63 74 69 6f 6e 20 6f 62 6a 65 63 74  onnection object
10100 20 69 6e 73 74 61 6e 63 65 20 66 6f 72 20 74 68   instance for th
10110 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  e..      #      
10120 20 73 70 65 63 69 66 69 65 64 20 64 61 74 61 62   specified datab
10130 73 65 20 68 61 6e 64 6c 65 2e 20 20 53 69 6e 63  se handle.  Sinc
10140 65 20 67 65 74 74 69 6e 67 20 74 68 69 73 20 6f  e getting this o
10150 62 6a 65 63 74 20 72 65 6c 69 65 73 20 75 70 6f  bject relies upo
10160 6e 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  n..      #      
10170 20 45 61 67 6c 65 20 69 6e 74 65 72 6e 61 6c 73   Eagle internals
10180 2c 20 67 72 65 61 74 20 63 61 72 65 20 73 68 6f  , great care sho
10190 75 6c 64 20 62 65 20 74 61 6b 65 6e 20 74 6f 20  uld be taken to 
101a0 61 76 6f 69 64 20 64 69 73 70 6f 73 69 6e 67 20  avoid disposing 
101b0 6f 66 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  of..      #     
101c0 20 20 74 68 69 73 20 6f 62 6a 65 63 74 20 6f 72    this object or
101d0 20 6f 74 68 65 72 77 69 73 65 20 70 75 74 74 69   otherwise putti
101e0 6e 67 20 69 74 20 69 6e 74 6f 20 61 6e 20 69 6e  ng it into an in
101f0 76 61 6c 69 64 20 73 74 61 74 65 2e 0d 0a 20 20  valid state...  
10200 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20      #..      if 
10210 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 64 62  {[info exists db
10220 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
10230 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d     if {[catch {.
10240 0a 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63  .          objec
10250 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20  t invoke -flags 
10260 2b 4e 6f 6e 50 75 62 6c 69 63 20 2d 6f 62 6a 65  +NonPublic -obje
10270 63 74 66 6c 61 67 73 20 2b 4e 6f 44 69 73 70 6f  ctflags +NoDispo
10280 73 65 20 2d 61 6c 69 61 73 20 5c 0d 0a 20 20 20  se -alias \..   
10290 20 20 20 20 20 20 20 20 20 20 20 49 6e 74 65 72             Inter
102a0 70 72 65 74 65 72 2e 47 65 74 41 63 74 69 76 65  preter.GetActive
102b0 2e 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 49 74 65  .connections Ite
102c0 6d 20 24 64 62 0d 0a 20 20 20 20 20 20 20 20 7d  m $db..        }
102d0 20 72 65 73 75 6c 74 5d 20 3d 3d 20 30 7d 20 74   result] == 0} t
102e0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
102f0 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20   #..          # 
10300 4e 4f 54 45 3a 20 53 75 63 63 65 73 73 2c 20 72  NOTE: Success, r
10310 65 74 75 72 6e 20 74 68 65 20 6f 70 61 71 75 65  eturn the opaque
10320 20 6f 62 6a 65 63 74 20 68 61 6e 64 6c 65 2e 0d   object handle..
10330 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
10340 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 24          return $
10350 72 65 73 75 6c 74 0d 0a 20 20 20 20 20 20 20 20  result..        
10360 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
10370 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
10380 20 23 20 4e 4f 54 45 3a 20 46 61 69 6c 75 72 65   # NOTE: Failure
10390 2c 20 72 65 70 6f 72 74 20 77 68 79 2e 0d 0a 20  , report why... 
103a0 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
103b0 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
103c0 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70  est_channel [app
103d0 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
103e0 20 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57           "==== W
103f0 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20 74  ARNING: failed t
10400 6f 20 67 65 74 20 63 6f 6e 6e 65 63 74 69 6f 6e  o get connection
10410 20 68 61 6e 64 6c 65 20 66 6f 72 20 64 61 74 61   handle for data
10420 62 61 73 65 20 5c 22 22 20 5c 0d 0a 20 20 20 20  base \"" \..    
10430 20 20 20 20 20 20 20 20 20 20 24 64 62 20 22 5c            $db "\
10440 22 2c 20 65 72 72 6f 72 3a 20 22 20 5c 6e 5c 74  ", error: " \n\t
10450 20 24 72 65 73 75 6c 74 20 5c 6e 5d 0d 0a 20 20   $result \n]..  
10460 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d        }..      }
10470 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
10480 70 72 6f 63 20 66 72 65 65 44 62 43 6f 6e 6e 65  proc freeDbConne
10490 63 74 69 6f 6e 20 7b 20 7b 76 61 72 4e 61 6d 65  ction { {varName
104a0 20 63 6f 6e 6e 65 63 74 69 6f 6e 7d 20 7d 20 7b   connection} } {
104b0 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
104c0 20 23 20 4e 4f 54 45 3a 20 52 65 66 65 72 20 74   # NOTE: Refer t
104d0 6f 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  o the specified 
104e0 76 61 72 69 61 62 6c 65 20 28 65 2e 67 2e 20 22  variable (e.g. "
104f0 63 6f 6e 6e 65 63 74 69 6f 6e 22 29 20 69 6e 20  connection") in 
10500 74 68 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20  the..      #    
10510 20 20 20 63 6f 6e 74 65 78 74 20 6f 66 20 6f 75     context of ou
10520 72 20 63 61 6c 6c 65 72 2e 20 20 54 68 65 20 6f  r caller.  The o
10530 70 61 71 75 65 20 6f 62 6a 65 63 74 20 68 61 6e  paque object han
10540 64 6c 65 20 66 6f 72 20 61 6e 20 41 44 4f 2e 4e  dle for an ADO.N
10550 45 54 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  ET..      #     
10560 20 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 72 65    connection pre
10570 76 69 6f 75 73 6c 79 20 72 65 74 75 72 6e 65 64  viously returned
10580 20 62 79 20 5b 67 65 74 44 62 43 6f 6e 6e 65 63   by [getDbConnec
10590 74 69 6f 6e 5d 20 73 68 6f 75 6c 64 20 62 65 0d  tion] should be.
105a0 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 73  .      #       s
105b0 74 6f 72 65 64 20 74 68 65 72 65 2e 0d 0a 20 20  tored there...  
105c0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 75 70 76      #..      upv
105d0 61 72 20 31 20 24 76 61 72 4e 61 6d 65 20 63 6f  ar 1 $varName co
105e0 6e 6e 65 63 74 69 6f 6e 0d 0a 0d 0a 20 20 20 20  nnection....    
105f0 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
10600 45 3a 20 41 74 74 65 6d 70 74 20 74 6f 20 72 65  E: Attempt to re
10610 6d 6f 76 65 20 74 68 65 20 6f 70 61 71 75 65 20  move the opaque 
10620 6f 62 6a 65 63 74 20 68 61 6e 64 6c 65 20 66 72  object handle fr
10630 6f 6d 20 74 68 65 20 69 6e 74 65 72 70 72 65 74  om the interpret
10640 65 72 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  er..      #     
10650 20 20 6e 6f 77 2e 20 20 54 68 69 73 20 5b 6f 62    now.  This [ob
10660 6a 65 63 74 20 64 69 73 70 6f 73 65 5d 20 63 61  ject dispose] ca
10670 6c 6c 20 77 69 6c 6c 20 6e 6f 74 20 61 63 74 75  ll will not actu
10680 61 6c 6c 79 20 64 69 73 70 6f 73 65 20 6f 66 20  ally dispose of 
10690 74 68 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20  the..      #    
106a0 20 20 20 75 6e 64 65 72 6c 79 69 6e 67 20 6f 62     underlying ob
106b0 6a 65 63 74 20 62 65 63 61 75 73 65 20 74 68 65  ject because the
106c0 20 2b 4e 6f 44 69 73 70 6f 73 65 20 66 6c 61 67   +NoDispose flag
106d0 20 77 61 73 20 73 65 74 20 6f 6e 20 69 74 0d 0a   was set on it..
106e0 20 20 20 20 20 20 23 20 20 20 20 20 20 20 64 75        #       du
106f0 72 69 6e 67 20 63 72 65 61 74 69 6f 6e 20 6f 66  ring creation of
10700 20 74 68 65 20 6f 70 61 71 75 65 20 6f 62 6a 65   the opaque obje
10710 63 74 20 68 61 6e 64 6c 65 2e 0d 0a 20 20 20 20  ct handle...    
10720 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b    #..      if {[
10730 69 6e 66 6f 20 65 78 69 73 74 73 20 63 6f 6e 6e  info exists conn
10740 65 63 74 69 6f 6e 5d 20 26 26 20 5c 0d 0a 20 20  ection] && \..  
10750 20 20 20 20 20 20 20 20 5b 63 61 74 63 68 20 7b          [catch {
10760 6f 62 6a 65 63 74 20 64 69 73 70 6f 73 65 20 24  object dispose $
10770 63 6f 6e 6e 65 63 74 69 6f 6e 7d 20 65 72 72 6f  connection} erro
10780 72 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  r]} then {..    
10790 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
107a0 20 4e 4f 54 45 3a 20 57 65 20 73 6f 6d 65 68 6f   NOTE: We someho
107b0 77 20 66 61 69 6c 65 64 20 74 6f 20 72 65 6d 6f  w failed to remo
107c0 76 65 20 74 68 65 20 68 61 6e 64 6c 65 2c 20 72  ve the handle, r
107d0 65 70 6f 72 74 20 77 68 79 2e 0d 0a 20 20 20 20  eport why...    
107e0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 74      #..        t
107f0 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
10800 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
10810 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
10820 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66  "==== WARNING: f
10830 61 69 6c 65 64 20 74 6f 20 72 65 6d 6f 76 65 20  ailed to remove 
10840 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 6e 64 6c  connection handl
10850 65 20 5c 22 22 20 24 63 6f 6e 6e 65 63 74 69 6f  e \"" $connectio
10860 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n \..           
10870 20 22 5c 22 2c 20 65 72 72 6f 72 3a 20 22 20 5c   "\", error: " \
10880 6e 5c 74 20 24 65 72 72 6f 72 20 5c 6e 5d 0d 0a  n\t $error \n]..
10890 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a        }..    }..
108a0 0c 0d 0a 20 20 20 20 70 72 6f 63 20 61 64 64 44  ...    proc addD
108b0 62 43 6f 6e 6e 65 63 74 69 6f 6e 20 7b 20 63 6f  bConnection { co
108c0 6e 6e 65 63 74 69 6f 6e 20 7b 76 61 72 4e 61 6d  nnection {varNam
108d0 65 20 64 62 7d 20 7d 20 7b 0d 0a 20 20 20 20 20  e db} } {..     
108e0 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
108f0 3a 20 52 65 66 65 72 20 74 6f 20 74 68 65 20 73  : Refer to the s
10900 70 65 63 69 66 69 65 64 20 76 61 72 69 61 62 6c  pecified variabl
10910 65 20 28 65 2e 67 2e 20 22 64 62 22 29 20 69 6e  e (e.g. "db") in
10920 20 74 68 65 20 63 6f 6e 74 65 78 74 20 6f 66 20   the context of 
10930 6f 75 72 0d 0a 20 20 20 20 20 20 23 20 20 20 20  our..      #    
10940 20 20 20 63 61 6c 6c 65 72 2e 0d 0a 20 20 20 20     caller...    
10950 20 20 23 0d 0a 20 20 20 20 20 20 75 70 76 61 72    #..      upvar
10960 20 31 20 24 76 61 72 4e 61 6d 65 20 64 62 0d 0a   1 $varName db..
10970 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
10980 20 23 20 4e 4f 54 45 3a 20 43 72 65 61 74 65 20   # NOTE: Create 
10990 61 20 63 6f 72 72 65 63 74 6c 79 20 66 6f 72 6d  a correctly form
109a0 61 74 74 65 64 20 6e 61 6d 65 20 66 6f 72 20 74  atted name for t
109b0 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  he database conn
109c0 65 63 74 69 6f 6e 20 74 6f 0d 0a 20 20 20 20 20  ection to..     
109d0 20 23 20 20 20 20 20 20 20 62 65 20 61 64 64 65   #       be adde
109e0 64 20 74 6f 20 74 68 65 20 6c 69 73 74 20 6d 61  d to the list ma
109f0 6e 61 67 65 64 20 62 79 20 74 68 65 20 45 61 67  naged by the Eag
10a00 6c 65 20 69 6e 74 65 72 70 72 65 74 65 72 2e 0d  le interpreter..
10a10 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
10a20 73 65 74 20 64 62 20 5b 6f 62 6a 65 63 74 20 69  set db [object i
10a30 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f  nvoke -flags +No
10a40 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20  nPublic \..     
10a50 20 20 20 20 20 45 61 67 6c 65 2e 5f 43 6f 6d 70       Eagle._Comp
10a60 6f 6e 65 6e 74 73 2e 50 72 69 76 61 74 65 2e 46  onents.Private.F
10a70 6f 72 6d 61 74 4f 70 73 20 44 61 74 61 62 61 73  ormatOps Databas
10a80 65 4f 62 6a 65 63 74 4e 61 6d 65 20 24 63 6f 6e  eObjectName $con
10a90 6e 65 63 74 69 6f 6e 20 5c 0d 0a 20 20 20 20 20  nection \..     
10aa0 20 20 20 20 20 53 51 4c 69 74 65 43 6f 6e 6e 65       SQLiteConne
10ab0 63 74 69 6f 6e 20 5b 6f 62 6a 65 63 74 20 69 6e  ction [object in
10ac0 76 6f 6b 65 20 49 6e 74 65 72 70 72 65 74 65 72  voke Interpreter
10ad0 2e 47 65 74 41 63 74 69 76 65 20 4e 65 78 74 49  .GetActive NextI
10ae0 64 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a  d]]....      #..
10af0 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 64        # NOTE: Ad
10b00 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63  d the database c
10b10 6f 6e 6e 65 63 74 69 6f 6e 20 70 72 6f 76 69 64  onnection provid
10b20 65 64 20 62 79 20 6f 75 72 20 63 61 6c 6c 65 72  ed by our caller
10b30 20 74 6f 20 74 68 65 20 6c 69 73 74 0d 0a 20 20   to the list..  
10b40 20 20 20 20 23 20 20 20 20 20 20 20 6f 66 20 74      #       of t
10b50 68 6f 73 65 20 6b 6e 6f 77 6e 20 74 6f 20 74 68  hose known to th
10b60 65 20 45 61 67 6c 65 20 69 6e 74 65 72 70 72 65  e Eagle interpre
10b70 74 65 72 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ter...      #.. 
10b80 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f       object invo
10b90 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75  ke -flags +NonPu
10ba0 62 6c 69 63 20 49 6e 74 65 72 70 72 65 74 65 72  blic Interpreter
10bb0 2e 47 65 74 41 63 74 69 76 65 2e 63 6f 6e 6e 65  .GetActive.conne
10bc0 63 74 69 6f 6e 73 20 41 64 64 20 5c 0d 0a 20 20  ctions Add \..  
10bd0 20 20 20 20 20 20 20 20 24 64 62 20 24 63 6f 6e          $db $con
10be0 6e 65 63 74 69 6f 6e 0d 0a 20 20 20 20 7d 0d 0a  nection..    }..
10bf0 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74 52  ...    proc getR
10c00 6f 77 73 46 72 6f 6d 44 61 74 61 54 61 62 6c 65  owsFromDataTable
10c10 20 7b 20 64 61 74 61 54 61 62 6c 65 20 7d 20 7b   { dataTable } {
10c20 0d 0a 20 20 20 20 20 20 73 65 74 20 72 6f 77 73  ..      set rows
10c30 20 5b 6c 69 73 74 5d 0d 0a 20 20 20 20 20 20 73   [list]..      s
10c40 65 74 20 63 6f 75 6e 74 20 5b 24 64 61 74 61 54  et count [$dataT
10c50 61 62 6c 65 20 43 6f 6c 75 6d 6e 73 2e 43 6f 75  able Columns.Cou
10c60 6e 74 5d 0d 0a 0d 0a 20 20 20 20 20 20 66 6f 72  nt]....      for
10c70 20 7b 73 65 74 20 69 6e 64 65 78 20 30 7d 20 7b   {set index 0} {
10c80 24 69 6e 64 65 78 20 3c 20 24 63 6f 75 6e 74 7d  $index < $count}
10c90 20 7b 69 6e 63 72 20 69 6e 64 65 78 7d 20 7b 0d   {incr index} {.
10ca0 0a 20 20 20 20 20 20 20 20 73 65 74 20 64 61 74  .        set dat
10cb0 61 43 6f 6c 75 6d 6e 20 5b 24 64 61 74 61 54 61  aColumn [$dataTa
10cc0 62 6c 65 20 2d 61 6c 69 61 73 20 43 6f 6c 75 6d  ble -alias Colum
10cd0 6e 73 2e 67 65 74 5f 49 74 65 6d 20 24 69 6e 64  ns.get_Item $ind
10ce0 65 78 5d 0d 0a 20 20 20 20 20 20 20 20 73 65 74  ex]..        set
10cf0 20 6e 61 6d 65 73 28 24 69 6e 64 65 78 29 20 5b   names($index) [
10d00 24 64 61 74 61 43 6f 6c 75 6d 6e 20 43 6f 6c 75  $dataColumn Colu
10d10 6d 6e 4e 61 6d 65 5d 0d 0a 20 20 20 20 20 20 7d  mnName]..      }
10d20 0d 0a 0d 0a 20 20 20 20 20 20 6f 62 6a 65 63 74  ....      object
10d30 20 66 6f 72 65 61 63 68 20 2d 61 6c 69 61 73 20   foreach -alias 
10d40 64 61 74 61 52 6f 77 20 5b 73 65 74 20 64 61 74  dataRow [set dat
10d50 61 52 6f 77 73 20 5b 24 64 61 74 61 54 61 62 6c  aRows [$dataTabl
10d60 65 20 52 6f 77 73 5d 5d 20 7b 0d 0a 20 20 20 20  e Rows]] {..    
10d70 20 20 20 20 73 65 74 20 72 6f 77 20 5b 6c 69 73      set row [lis
10d80 74 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 66 6f  t]....        fo
10d90 72 20 7b 73 65 74 20 69 6e 64 65 78 20 30 7d 20  r {set index 0} 
10da0 7b 24 69 6e 64 65 78 20 3c 20 24 63 6f 75 6e 74  {$index < $count
10db0 7d 20 7b 69 6e 63 72 20 69 6e 64 65 78 7d 20 7b  } {incr index} {
10dc0 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20  ..          set 
10dd0 76 61 6c 75 65 20 5b 24 64 61 74 61 52 6f 77 20  value [$dataRow 
10de0 2d 63 72 65 61 74 65 20 2d 61 6c 69 61 73 20 67  -create -alias g
10df0 65 74 5f 49 74 65 6d 20 24 69 6e 64 65 78 5d 0d  et_Item $index].
10e00 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20  ...          if 
10e10 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20  {[string length 
10e20 24 76 61 6c 75 65 5d 20 3e 20 30 20 26 26 20 5c  $value] > 0 && \
10e30 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
10e40 21 5b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20  ![object invoke 
10e50 43 6f 6e 76 65 72 74 20 49 73 44 42 4e 75 6c 6c  Convert IsDBNull
10e60 20 24 76 61 6c 75 65 5d 7d 20 74 68 65 6e 20 7b   $value]} then {
10e70 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 6c 61  ..            la
10e80 70 70 65 6e 64 20 72 6f 77 20 5b 6c 69 73 74 20  ppend row [list 
10e90 24 6e 61 6d 65 73 28 24 69 6e 64 65 78 29 20 5b  $names($index) [
10ea0 24 76 61 6c 75 65 20 54 6f 53 74 72 69 6e 67 5d  $value ToString]
10eb0 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 20 65  ]..          } e
10ec0 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  lse {..         
10ed0 20 20 20 6c 61 70 70 65 6e 64 20 72 6f 77 20 5b     lappend row [
10ee0 6c 69 73 74 20 24 6e 61 6d 65 73 28 24 69 6e 64  list $names($ind
10ef0 65 78 29 5d 0d 0a 20 20 20 20 20 20 20 20 20 20  ex)]..          
10f00 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  }..        }....
10f10 20 20 20 20 20 20 20 20 6c 61 70 70 65 6e 64 20          lappend 
10f20 72 6f 77 73 20 24 72 6f 77 0d 0a 20 20 20 20 20  rows $row..     
10f30 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65 74 75   }....      retu
10f40 72 6e 20 24 72 6f 77 73 0d 0a 20 20 20 20 7d 0d  rn $rows..    }.
10f50 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 64 75 6d  ....    proc dum
10f60 70 52 6f 77 73 46 72 6f 6d 44 61 74 61 54 61 62  pRowsFromDataTab
10f70 6c 65 20 7b 20 63 68 61 6e 6e 65 6c 20 72 6f 77  le { channel row
10f80 73 20 7d 20 7b 0d 0a 20 20 20 20 20 20 73 65 74  s } {..      set
10f90 20 73 65 71 75 65 6e 63 65 20 31 0d 0a 0d 0a 20   sequence 1.... 
10fa0 20 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77       foreach row
10fb0 20 24 72 6f 77 73 20 7b 0d 0a 20 20 20 20 20 20   $rows {..      
10fc0 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
10fd0 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
10fe0 20 20 20 20 20 20 20 20 20 20 20 20 5b 65 78 70              [exp
10ff0 72 20 7b 24 73 65 71 75 65 6e 63 65 20 3e 20 31  r {$sequence > 1
11000 20 3f 20 22 5c 6e 22 20 3a 20 22 22 7d 5d 20 22   ? "\n" : ""}] "
11010 2d 2d 2d 2d 20 52 4f 57 20 23 22 20 24 73 65 71  ---- ROW #" $seq
11020 75 65 6e 63 65 20 3a 5c 6e 5d 0d 0a 0d 0a 20 20  uence :\n]....  
11030 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 70 61        foreach pa
11040 69 72 20 24 72 6f 77 20 7b 0d 0a 20 20 20 20 20  ir $row {..     
11050 20 20 20 20 20 69 66 20 7b 5b 6c 6c 65 6e 67 74       if {[llengt
11060 68 20 24 70 61 69 72 5d 20 3e 3d 20 32 7d 20 74  h $pair] >= 2} t
11070 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
11080 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
11090 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 74  l [appendArgs \t
110a0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
110b0 20 20 20 20 5b 6c 69 73 74 20 5b 6c 69 6e 64 65      [list [linde
110c0 78 20 24 70 61 69 72 20 30 5d 5d 20 22 3a 20 22  x $pair 0]] ": "
110d0 20 5b 6c 69 73 74 20 5b 6c 69 6e 64 65 78 20 24   [list [lindex $
110e0 70 61 69 72 20 31 5d 5d 20 5c 6e 5d 0d 0a 20 20  pair 1]] \n]..  
110f0 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 69 66          } elseif
11100 20 7b 5b 6c 6c 65 6e 67 74 68 20 24 70 61 69 72   {[llength $pair
11110 5d 20 3d 3d 20 31 7d 20 74 68 65 6e 20 7b 0d 0a  ] == 1} then {..
11120 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
11130 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  s $channel [appe
11140 6e 64 41 72 67 73 20 5c 74 20 5c 0d 0a 20 20 20  ndArgs \t \..   
11150 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 6c 69               [li
11160 73 74 20 5b 6c 69 6e 64 65 78 20 24 70 61 69 72  st [lindex $pair
11170 20 30 5d 5d 20 22 3a 20 3c 6e 75 6c 6c 3e 5c 6e   0]] ": <null>\n
11180 22 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 20  "]..          } 
11190 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
111a0 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
111b0 65 6c 20 5c 74 3c 65 6d 70 74 79 3e 5c 6e 3b 20  el \t<empty>\n; 
111c0 23 20 4e 4f 54 45 3a 20 4e 6f 20 64 61 74 61 3f  # NOTE: No data?
111d0 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20  ..          }.. 
111e0 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
111f0 20 20 20 20 69 6e 63 72 20 73 65 71 75 65 6e 63      incr sequenc
11200 65 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  e..      }..    
11210 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 63  }.....    proc c
11220 6c 65 61 6e 75 70 44 62 20 7b 20 66 69 6c 65 4e  leanupDb { fileN
11230 61 6d 65 20 7b 76 61 72 4e 61 6d 65 20 64 62 7d  ame {varName db}
11240 20 7b 63 6f 6c 6c 65 63 74 20 74 72 75 65 7d 20   {collect true} 
11250 7b 71 75 61 6c 69 66 79 20 74 72 75 65 7d 0d 0a  {qualify true}..
11260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11270 20 20 20 20 20 7b 64 65 6c 65 74 65 20 74 72 75       {delete tru
11280 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d  e} } {..      #.
11290 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41  .      # NOTE: A
112a0 74 74 65 6d 70 74 20 74 6f 20 66 6f 72 63 65 20  ttempt to force 
112b0 61 6c 6c 20 70 65 6e 64 69 6e 67 20 22 67 61 72  all pending "gar
112c0 62 61 67 65 22 20 6f 62 6a 65 63 74 73 20 74 6f  bage" objects to
112d0 20 62 65 20 63 6f 6c 6c 65 63 74 65 64 2c 0d 0a   be collected,..
112e0 20 20 20 20 20 20 23 20 20 20 20 20 20 20 69 6e        #       in
112f0 63 6c 75 64 69 6e 67 20 53 51 4c 69 74 65 20 73  cluding SQLite s
11300 74 61 74 65 6d 65 6e 74 73 20 61 6e 64 20 62 61  tatements and ba
11310 63 6b 75 70 20 6f 62 6a 65 63 74 73 3b 20 74 68  ckup objects; th
11320 69 73 20 73 68 6f 75 6c 64 20 61 6c 6c 6f 77 0d  is should allow.
11330 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74  .      #       t
11340 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 64 61  he underlying da
11350 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 62  tabase file to b
11360 65 20 64 65 6c 65 74 65 64 2e 0d 0a 20 20 20 20  e deleted...    
11370 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 24    #..      if {$
11380 63 6f 6c 6c 65 63 74 7d 20 74 68 65 6e 20 7b 0d  collect} then {.
11390 0a 20 20 20 20 20 20 20 20 63 6f 6c 6c 65 63 74  .        collect
113a0 47 61 72 62 61 67 65 20 24 3a 3a 74 65 73 74 5f  Garbage $::test_
113b0 63 68 61 6e 6e 65 6c 0d 0a 20 20 20 20 20 20 7d  channel..      }
113c0 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  ....      #..   
113d0 20 20 20 23 20 4e 4f 54 45 3a 20 52 65 66 65 72     # NOTE: Refer
113e0 20 74 6f 20 74 68 65 20 73 70 65 63 69 66 69 65   to the specifie
113f0 64 20 76 61 72 69 61 62 6c 65 20 28 65 2e 67 2e  d variable (e.g.
11400 20 22 64 62 22 29 20 69 6e 20 74 68 65 20 63 6f   "db") in the co
11410 6e 74 65 78 74 20 6f 66 20 6f 75 72 0d 0a 20 20  ntext of our..  
11420 20 20 20 20 23 20 20 20 20 20 20 20 63 61 6c 6c      #       call
11430 65 72 2e 20 20 54 68 65 20 68 61 6e 64 6c 65 20  er.  The handle 
11440 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
11450 70 72 65 76 69 6f 75 73 6c 79 20 6f 70 65 6e 65  previously opene
11460 64 20 76 69 61 20 74 68 65 0d 0a 20 20 20 20 20  d via the..     
11470 20 23 20 20 20 20 20 20 20 5b 73 65 74 75 70 44   #       [setupD
11480 62 5d 20 70 72 6f 63 65 64 75 72 65 20 73 68 6f  b] procedure sho
11490 75 6c 64 20 62 65 20 73 74 6f 72 65 64 20 74 68  uld be stored th
114a0 65 72 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ere...      #.. 
114b0 20 20 20 20 20 75 70 76 61 72 20 31 20 24 76 61       upvar 1 $va
114c0 72 4e 61 6d 65 20 64 62 0d 0a 0d 0a 20 20 20 20  rName db....    
114d0 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
114e0 45 3a 20 43 6c 6f 73 65 20 74 68 65 20 63 6f 6e  E: Close the con
114f0 6e 65 63 74 69 6f 6e 20 74 6f 20 74 68 65 20 64  nection to the d
11500 61 74 61 62 61 73 65 20 6e 6f 77 2e 20 20 54 68  atabase now.  Th
11510 69 73 20 73 68 6f 75 6c 64 20 61 6c 6c 6f 77 20  is should allow 
11520 75 73 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  us..      #     
11530 20 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20    to delete the 
11540 75 6e 64 65 72 6c 79 69 6e 67 20 64 61 74 61 62  underlying datab
11550 61 73 65 20 66 69 6c 65 2e 0d 0a 20 20 20 20 20  ase file...     
11560 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69   #..      if {[i
11570 6e 66 6f 20 65 78 69 73 74 73 20 64 62 5d 20 26  nfo exists db] &
11580 26 20 5b 63 61 74 63 68 20 7b 73 71 6c 20 63 6c  & [catch {sql cl
11590 6f 73 65 20 24 64 62 7d 20 65 72 72 6f 72 5d 7d  ose $db} error]}
115a0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
115b0 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
115c0 54 45 3a 20 57 65 20 73 6f 6d 65 68 6f 77 20 66  TE: We somehow f
115d0 61 69 6c 65 64 20 74 6f 20 63 6c 6f 73 65 20 74  ailed to close t
115e0 68 65 20 64 61 74 61 62 61 73 65 2c 20 72 65 70  he database, rep
115f0 6f 72 74 20 77 68 79 2e 0d 0a 20 20 20 20 20 20  ort why...      
11600 20 20 23 0d 0a 20 20 20 20 20 20 20 20 74 70 75    #..        tpu
11610 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
11620 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
11630 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 3d  ..            "=
11640 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61 69  === WARNING: fai
11650 6c 65 64 20 74 6f 20 63 6c 6f 73 65 20 64 61 74  led to close dat
11660 61 62 61 73 65 20 5c 22 22 20 24 64 62 20 22 5c  abase \"" $db "\
11670 22 2c 20 65 72 72 6f 72 3a 20 22 20 5c 0d 0a 20  ", error: " \.. 
11680 20 20 20 20 20 20 20 20 20 20 20 5c 6e 5c 74 20             \n\t 
11690 24 65 72 72 6f 72 20 5c 6e 5d 0d 0a 20 20 20 20  $error \n]..    
116a0 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a    }....      #..
116b0 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 46 69        # NOTE: Fi
116c0 72 73 74 2c 20 73 65 65 20 69 66 20 6f 75 72 20  rst, see if our 
116d0 63 61 6c 6c 65 72 20 68 61 73 20 72 65 71 75 65  caller has reque
116e0 73 74 65 64 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  sted an in-memor
116f0 79 20 64 61 74 61 62 61 73 65 2e 0d 0a 20 20 20  y database...   
11700 20 20 20 23 0d 0a 20 20 20 20 20 20 73 65 74 20     #..      set 
11710 69 73 4d 65 6d 6f 72 79 20 5b 69 73 4d 65 6d 6f  isMemory [isMemo
11720 72 79 44 62 20 24 66 69 6c 65 4e 61 6d 65 5d 0d  ryDb $fileName].
11730 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
11740 20 20 23 20 4e 4f 54 45 3a 20 42 75 69 6c 64 20    # NOTE: Build 
11750 74 68 65 20 66 75 6c 6c 20 70 61 74 68 20 74 6f  the full path to
11760 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
11770 6c 65 20 6e 61 6d 65 2e 20 20 46 6f 72 20 6e 6f  le name.  For no
11780 77 2c 20 61 6c 6c 20 74 65 73 74 0d 0a 20 20 20  w, all test..   
11790 20 20 20 23 20 20 20 20 20 20 20 64 61 74 61 62     #       datab
117a0 61 73 65 20 66 69 6c 65 73 20 61 72 65 20 73 74  ase files are st
117b0 6f 72 65 64 20 69 6e 20 74 68 65 20 74 65 6d 70  ored in the temp
117c0 6f 72 61 72 79 20 64 69 72 65 63 74 6f 72 79 2e  orary directory.
117d0 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
117e0 20 69 66 20 7b 21 24 69 73 4d 65 6d 6f 72 79 20   if {!$isMemory 
117f0 26 26 20 24 71 75 61 6c 69 66 79 7d 20 74 68 65  && $qualify} the
11800 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 65 74  n {..        set
11810 20 66 69 6c 65 4e 61 6d 65 20 5b 66 69 6c 65 20   fileName [file 
11820 6a 6f 69 6e 20 5b 67 65 74 44 61 74 61 62 61 73  join [getDatabas
11830 65 44 69 72 65 63 74 6f 72 79 5d 20 5b 66 69 6c  eDirectory] [fil
11840 65 20 74 61 69 6c 20 24 66 69 6c 65 4e 61 6d 65  e tail $fileName
11850 5d 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  ]]..      }.... 
11860 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
11870 4e 4f 54 45 3a 20 43 68 65 63 6b 20 69 66 20 74  NOTE: Check if t
11880 68 65 20 66 69 6c 65 20 73 74 69 6c 6c 20 65 78  he file still ex
11890 69 73 74 73 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  ists...      #..
118a0 20 20 20 20 20 20 69 66 20 7b 21 24 69 73 4d 65        if {!$isMe
118b0 6d 6f 72 79 20 26 26 20 24 64 65 6c 65 74 65 20  mory && $delete 
118c0 26 26 20 5b 66 69 6c 65 20 65 78 69 73 74 73 20  && [file exists 
118d0 24 66 69 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e  $fileName]} then
118e0 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20   {..        #.. 
118f0 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53         # NOTE: S
11900 6b 69 70 20 64 65 6c 65 74 69 6e 67 20 64 61 74  kip deleting dat
11910 61 62 61 73 65 20 66 69 6c 65 73 20 69 66 20 73  abase files if s
11920 6f 6d 65 62 6f 64 79 20 73 65 74 73 20 74 68 65  omebody sets the
11930 20 67 6c 6f 62 61 6c 0d 0a 20 20 20 20 20 20 20   global..       
11940 20 23 20 20 20 20 20 20 20 76 61 72 69 61 62 6c   #       variabl
11950 65 20 74 6f 20 70 72 65 76 65 6e 74 20 69 74 2e  e to prevent it.
11960 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
11970 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20       if {![info 
11980 65 78 69 73 74 73 20 3a 3a 6e 6f 28 63 6c 65 61  exists ::no(clea
11990 6e 75 70 44 62 46 69 6c 65 29 5d 7d 20 74 68 65  nupDbFile)]} the
119a0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 23  n {..          #
119b0 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f  ..          # NO
119c0 54 45 3a 20 41 74 74 65 6d 70 74 20 74 6f 20 64  TE: Attempt to d
119d0 65 6c 65 74 65 20 74 68 65 20 74 65 73 74 20 64  elete the test d
119e0 61 74 61 62 61 73 65 20 66 69 6c 65 20 6e 6f 77  atabase file now
119f0 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a  ...          #..
11a00 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73            if {[s
11a10 65 74 20 63 6f 64 65 20 5b 63 61 74 63 68 20 7b  et code [catch {
11a20 66 69 6c 65 20 64 65 6c 65 74 65 20 24 66 69 6c  file delete $fil
11a30 65 4e 61 6d 65 7d 20 65 72 72 6f 72 5d 5d 7d 20  eName} error]]} 
11a40 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
11a50 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
11a60 20 20 20 23 20 4e 4f 54 45 3a 20 57 65 20 73 6f     # NOTE: We so
11a70 6d 65 68 6f 77 20 66 61 69 6c 65 64 20 74 6f 20  mehow failed to 
11a80 64 65 6c 65 74 65 20 74 68 65 20 66 69 6c 65 2c  delete the file,
11a90 20 72 65 70 6f 72 74 20 77 68 79 2e 0d 0a 20 20   report why...  
11aa0 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
11ab0 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
11ac0 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b  ::test_channel [
11ad0 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
11ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 3d                "=
11af0 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61 69  === WARNING: fai
11b00 6c 65 64 20 74 6f 20 64 65 6c 65 74 65 20 64 61  led to delete da
11b10 74 61 62 61 73 65 20 66 69 6c 65 20 5c 22 22 20  tabase file \"" 
11b20 24 66 69 6c 65 4e 61 6d 65 20 5c 0d 0a 20 20 20  $fileName \..   
11b30 20 20 20 20 20 20 20 20 20 20 20 20 20 22 5c 22               "\"
11b40 20 64 75 72 69 6e 67 20 63 6c 65 61 6e 75 70 2c   during cleanup,
11b50 20 65 72 72 6f 72 3a 20 22 20 5c 6e 5c 74 20 24   error: " \n\t $
11b60 65 72 72 6f 72 20 5c 6e 5d 0d 0a 20 20 20 20 20  error \n]..     
11b70 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
11b80 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
11b90 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
11ba0 20 23 20 4e 4f 54 45 3a 20 53 68 6f 77 20 74 68   # NOTE: Show th
11bb0 61 74 20 77 65 20 73 6b 69 70 70 65 64 20 64 65  at we skipped de
11bc0 6c 65 74 69 6e 67 20 74 68 65 20 66 69 6c 65 2e  leting the file.
11bd0 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20  ..          #.. 
11be0 20 20 20 20 20 20 20 20 20 73 65 74 20 63 6f 64           set cod
11bf0 65 20 30 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  e 0....         
11c00 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
11c10 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
11c20 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
11c30 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e      "==== WARNIN
11c40 47 3a 20 73 6b 69 70 70 65 64 20 64 65 6c 65 74  G: skipped delet
11c50 69 6e 67 20 64 61 74 61 62 61 73 65 20 66 69 6c  ing database fil
11c60 65 20 5c 22 22 20 24 66 69 6c 65 4e 61 6d 65 20  e \"" $fileName 
11c70 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
11c80 20 22 5c 22 20 64 75 72 69 6e 67 20 63 6c 65 61   "\" during clea
11c90 6e 75 70 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20  nup\n"]..       
11ca0 20 7d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65   }..      } else
11cb0 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20   {..        #.. 
11cc0 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54         # NOTE: T
11cd0 68 65 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74  he file does not
11ce0 20 65 78 69 73 74 2c 20 73 75 63 63 65 73 73 21   exist, success!
11cf0 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
11d00 20 20 20 20 20 73 65 74 20 63 6f 64 65 20 30 0d       set code 0.
11d10 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
11d20 20 20 72 65 74 75 72 6e 20 24 63 6f 64 65 0d 0a    return $code..
11d30 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
11d40 6f 63 20 73 65 74 75 70 44 62 49 6e 74 65 72 72  oc setupDbInterr
11d50 75 70 74 43 61 6c 6c 62 61 63 6b 20 7b 20 63 68  uptCallback { ch
11d60 61 6e 6e 65 6c 20 6c 6f 67 20 7d 20 7b 0d 0a 20  annel log } {.. 
11d70 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
11d80 6e 65 6c 20 22 2d 2d 2d 2d 20 73 65 74 74 69 6e  nel "---- settin
11d90 67 20 75 70 20 64 65 62 75 67 67 65 72 20 69 6e  g up debugger in
11da0 74 65 72 72 75 70 74 20 63 61 6c 6c 62 61 63 6b  terrupt callback
11db0 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 20 20 69  ... "....      i
11dc0 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20  f {[catch {..   
11dd0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
11de0 23 20 4e 4f 54 45 3a 20 4d 61 6b 65 20 73 75 72  # NOTE: Make sur
11df0 65 20 74 68 65 20 73 63 72 69 70 74 20 64 65 62  e the script deb
11e00 75 67 67 65 72 20 61 6e 64 20 74 68 65 20 69 73  ugger and the is
11e10 6f 6c 61 74 65 64 20 69 6e 74 65 72 70 72 65 74  olated interpret
11e20 65 72 20 61 72 65 0d 0a 20 20 20 20 20 20 20 20  er are..        
11e30 23 20 20 20 20 20 20 20 73 65 74 75 70 20 61 6e  #       setup an
11e40 64 20 72 65 61 64 79 20 66 6f 72 20 75 73 65 2e  d ready for use.
11e50 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
11e60 20 20 20 20 20 64 65 62 75 67 20 73 65 74 75 70       debug setup
11e70 20 74 72 75 65 20 74 72 75 65 0d 0a 0d 0a 20 20   true true....  
11e80 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
11e90 20 23 20 4e 4f 54 45 3a 20 4c 6f 61 64 20 74 68   # NOTE: Load th
11ea0 65 20 6e 65 63 65 73 73 61 72 79 20 70 61 63 6b  e necessary pack
11eb0 61 67 65 73 20 69 6e 74 6f 20 74 68 65 20 69 73  ages into the is
11ec0 6f 6c 61 74 65 64 20 69 6e 74 65 72 70 72 65 74  olated interpret
11ed0 65 72 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  er...        #..
11ee0 20 20 20 20 20 20 20 20 64 65 62 75 67 20 65 76          debug ev
11ef0 61 6c 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  al {..          
11f00 70 61 63 6b 61 67 65 20 72 65 71 75 69 72 65 20  package require 
11f10 45 61 67 6c 65 0d 0a 20 20 20 20 20 20 20 20 20  Eagle..         
11f20 20 70 61 63 6b 61 67 65 20 72 65 71 75 69 72 65   package require
11f30 20 45 61 67 6c 65 2e 4c 69 62 72 61 72 79 0d 0a   Eagle.Library..
11f40 20 20 20 20 20 20 20 20 20 20 70 61 63 6b 61 67            packag
11f50 65 20 72 65 71 75 69 72 65 20 45 61 67 6c 65 2e  e require Eagle.
11f60 54 65 73 74 0d 0a 20 20 20 20 20 20 20 20 7d 0d  Test..        }.
11f70 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
11f80 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 6f        # NOTE: Co
11f90 70 79 20 74 68 65 20 6e 65 63 65 73 73 61 72 79  py the necessary
11fa0 20 76 61 72 69 61 62 6c 65 73 20 69 6e 74 6f 20   variables into 
11fb0 74 68 65 20 69 73 6f 6c 61 74 65 64 20 69 6e 74  the isolated int
11fc0 65 72 70 72 65 74 65 72 2e 0d 0a 20 20 20 20 20  erpreter...     
11fd0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 64 65     #..        de
11fe0 62 75 67 20 69 6e 76 6f 6b 65 20 30 20 73 65 74  bug invoke 0 set
11ff0 20 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20   ::test_channel 
12000 24 63 68 61 6e 6e 65 6c 3b 20 23 20 4e 4f 54 45  $channel; # NOTE
12010 3a 20 46 6f 72 20 5b 74 70 75 74 73 5d 2e 0d 0a  : For [tputs]...
12020 20 20 20 20 20 20 20 20 64 65 62 75 67 20 69 6e          debug in
12030 76 6f 6b 65 20 30 20 73 65 74 20 3a 3a 74 65 73  voke 0 set ::tes
12040 74 5f 6c 6f 67 20 24 6c 6f 67 3b 20 23 20 4e 4f  t_log $log; # NO
12050 54 45 3a 20 46 6f 72 20 5b 74 6c 6f 67 5d 2e 0d  TE: For [tlog]..
12060 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
12070 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 6e        # NOTE: In
12080 73 74 61 6c 6c 20 74 68 65 20 63 61 6c 6c 62 61  stall the callba
12090 63 6b 20 73 63 72 69 70 74 20 74 6f 20 62 65 20  ck script to be 
120a0 65 76 61 6c 75 61 74 65 64 20 69 6e 20 74 68 65  evaluated in the
120b0 20 69 73 6f 6c 61 74 65 64 0d 0a 20 20 20 20 20   isolated..     
120c0 20 20 20 23 20 20 20 20 20 20 20 69 6e 74 65 72     #       inter
120d0 70 72 65 74 65 72 20 77 68 65 6e 20 74 68 69 73  preter when this
120e0 20 69 6e 74 65 72 70 72 65 74 65 72 20 69 73 20   interpreter is 
120f0 69 6e 74 65 72 72 75 70 74 65 64 20 62 79 20 73  interrupted by s
12100 63 72 69 70 74 0d 0a 20 20 20 20 20 20 20 20 23  cript..        #
12110 20 20 20 20 20 20 20 63 61 6e 63 65 6c 6c 61 74         cancellat
12120 69 6f 6e 2c 20 65 74 63 2e 0d 0a 20 20 20 20 20  ion, etc...     
12130 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 64 65     #..        de
12140 62 75 67 20 63 61 6c 6c 62 61 63 6b 20 61 70 70  bug callback app
12150 6c 79 20 7b 7b 73 65 6e 64 65 72 20 65 7d 20 7b  ly {{sender e} {
12160 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20  ..          #.. 
12170 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a           # NOTE:
12180 20 43 68 65 63 6b 20 69 66 20 74 68 69 73 20 63   Check if this c
12190 61 6c 6c 62 61 63 6b 20 69 73 20 6f 6e 65 20 74  allback is one t
121a0 68 61 74 20 77 65 20 63 61 72 65 20 61 62 6f 75  hat we care abou
121b0 74 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d  t...          #.
121c0 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 22  .          if {"
121d0 43 61 6e 63 65 6c 65 64 22 20 69 6e 20 5b 73 70  Canceled" in [sp
121e0 6c 69 74 20 5b 24 65 20 49 6e 74 65 72 72 75 70  lit [$e Interrup
121f0 74 54 79 70 65 5d 20 22 2c 20 22 5d 7d 20 74 68  tType] ", "]} th
12200 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
12210 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20    #..           
12220 20 23 20 4e 4f 54 45 3a 20 49 74 65 72 61 74 65   # NOTE: Iterate
12230 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 64 61 74   through all dat
12240 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
12250 73 20 6b 6e 6f 77 6e 20 74 6f 20 74 68 65 0d 0a  s known to the..
12260 20 20 20 20 20 20 20 20 20 20 20 20 23 20 20 20              #   
12270 20 20 20 20 70 61 72 65 6e 74 20 69 6e 74 65 72      parent inter
12280 70 72 65 74 65 72 2e 0d 0a 20 20 20 20 20 20 20  preter...       
12290 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
122a0 20 20 20 20 6f 62 6a 65 63 74 20 66 6f 72 65 61      object forea
122b0 63 68 20 2d 61 6c 69 61 73 20 70 61 69 72 20 5c  ch -alias pair \
122c0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
122d0 20 20 5b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65    [object invoke
122e0 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c   -flags +NonPubl
122f0 69 63 20 24 65 20 49 6e 74 65 72 70 72 65 74 65  ic $e Interprete
12300 72 2e 63 6f 6e 6e 65 63 74 69 6f 6e 73 5d 20 7b  r.connections] {
12310 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
12320 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  #..             
12330 20 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74   # NOTE: Attempt
12340 20 74 6f 20 63 61 6e 63 65 6c 20 61 6e 79 20 53   to cancel any S
12350 51 4c 20 71 75 65 72 69 65 73 20 69 6e 20 70 72  QL queries in pr
12360 6f 67 72 65 73 73 20 6f 6e 20 74 68 69 73 0d 0a  ogress on this..
12370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20                # 
12380 20 20 20 20 20 20 64 61 74 61 62 61 73 65 20 63        database c
12390 6f 6e 6e 65 63 74 69 6f 6e 2e 0d 0a 20 20 20 20  onnection...    
123a0 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
123b0 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b             if {[
123c0 63 61 74 63 68 20 7b 24 70 61 69 72 20 56 61 6c  catch {$pair Val
123d0 75 65 2e 43 61 6e 63 65 6c 7d 20 65 72 72 6f 72  ue.Cancel} error
123e0 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
123f0 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
12400 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
12410 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 6e 20   [appendArgs \n 
12420 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
12430 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52         "==== WAR
12440 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20 74 6f 20  NING: failed to 
12450 63 61 6e 63 65 6c 20 71 75 65 72 79 20 66 6f 72  cancel query for
12460 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 5c 22 22 20   connection \"" 
12470 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
12480 20 20 20 20 20 20 20 5b 24 70 61 69 72 20 4b 65         [$pair Ke
12490 79 5d 20 22 5c 22 2c 20 65 72 72 6f 72 3a 20 22  y] "\", error: "
124a0 20 5c 6e 5c 74 20 24 65 72 72 6f 72 20 5c 6e 5d   \n\t $error \n]
124b0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
124c0 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  }..            }
124d0 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20  ..          }.. 
124e0 20 20 20 20 20 20 20 7d 7d 0d 0a 20 20 20 20 20         }}..     
124f0 20 7d 20 65 72 72 6f 72 5d 20 3d 3d 20 30 7d 20   } error] == 0} 
12500 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
12510 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 69 6e  addConstraint in
12520 74 65 72 72 75 70 74 43 61 6c 6c 62 61 63 6b 2e  terruptCallback.
12530 73 71 6c 69 74 65 33 0d 0a 0d 0a 20 20 20 20 20  sqlite3....     
12540 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
12550 6c 20 79 65 73 5c 6e 0d 0a 20 20 20 20 20 20 7d  l yes\n..      }
12560 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
12570 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
12580 5b 61 70 70 65 6e 64 41 72 67 73 20 22 6e 6f 2c  [appendArgs "no,
12590 20 65 72 72 6f 72 3a 20 22 20 5c 6e 5c 74 20 24   error: " \n\t $
125a0 65 72 72 6f 72 20 5c 6e 5d 0d 0a 20 20 20 20 20  error \n]..     
125b0 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20   }..    }.....  
125c0 20 20 70 72 6f 63 20 63 6c 65 61 6e 75 70 46 69    proc cleanupFi
125d0 6c 65 20 7b 20 66 69 6c 65 4e 61 6d 65 20 7b 63  le { fileName {c
125e0 6f 6c 6c 65 63 74 20 74 72 75 65 7d 20 7b 66 6f  ollect true} {fo
125f0 72 63 65 20 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a  rce false} } {..
12600 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
12610 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74 20 74   NOTE: Attempt t
12620 6f 20 66 6f 72 63 65 20 61 6c 6c 20 70 65 6e 64  o force all pend
12630 69 6e 67 20 22 67 61 72 62 61 67 65 22 20 6f 62  ing "garbage" ob
12640 6a 65 63 74 73 20 74 6f 20 62 65 20 63 6f 6c 6c  jects to be coll
12650 65 63 74 65 64 2c 0d 0a 20 20 20 20 20 20 23 20  ected,..      # 
12660 20 20 20 20 20 20 69 6e 63 6c 75 64 69 6e 67 20        including 
12670 53 51 4c 69 74 65 20 73 74 61 74 65 6d 65 6e 74  SQLite statement
12680 73 20 61 6e 64 20 62 61 63 6b 75 70 20 6f 62 6a  s and backup obj
12690 65 63 74 73 3b 20 74 68 69 73 20 73 68 6f 75 6c  ects; this shoul
126a0 64 20 61 6c 6c 6f 77 0d 0a 20 20 20 20 20 20 23  d allow..      #
126b0 20 20 20 20 20 20 20 74 68 65 20 75 6e 64 65 72         the under
126c0 6c 79 69 6e 67 20 64 61 74 61 62 61 73 65 20 66  lying database f
126d0 69 6c 65 20 74 6f 20 62 65 20 64 65 6c 65 74 65  ile to be delete
126e0 64 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  d...      #..   
126f0 20 20 20 69 66 20 7b 24 63 6f 6c 6c 65 63 74 7d     if {$collect}
12700 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
12710 20 63 6f 6c 6c 65 63 74 47 61 72 62 61 67 65 20   collectGarbage 
12720 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 0d  $::test_channel.
12730 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
12740 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
12750 45 3a 20 43 68 65 63 6b 20 69 66 20 74 68 65 20  E: Check if the 
12760 66 69 6c 65 20 73 74 69 6c 6c 20 65 78 69 73 74  file still exist
12770 73 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  s...      #..   
12780 20 20 20 69 66 20 7b 5b 66 69 6c 65 20 65 78 69     if {[file exi
12790 73 74 73 20 24 66 69 6c 65 4e 61 6d 65 5d 7d 20  sts $fileName]} 
127a0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
127b0 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
127c0 45 3a 20 53 6b 69 70 20 64 65 6c 65 74 69 6e 67  E: Skip deleting
127d0 20 74 65 73 74 20 66 69 6c 65 73 20 69 66 20 73   test files if s
127e0 6f 6d 65 62 6f 64 79 20 73 65 74 73 20 74 68 65  omebody sets the
127f0 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65   global variable
12800 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
12810 20 20 74 6f 20 70 72 65 76 65 6e 74 20 69 74 2e    to prevent it.
12820 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
12830 20 20 20 20 20 69 66 20 7b 24 66 6f 72 63 65 20       if {$force 
12840 7c 7c 20 21 5b 69 6e 66 6f 20 65 78 69 73 74 73  || ![info exists
12850 20 3a 3a 6e 6f 28 63 6c 65 61 6e 75 70 46 69 6c   ::no(cleanupFil
12860 65 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  e)]} then {..   
12870 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
12880 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 74 74 65      # NOTE: Atte
12890 6d 70 74 20 74 6f 20 64 65 6c 65 74 65 20 74 68  mpt to delete th
128a0 65 20 74 65 73 74 20 66 69 6c 65 20 6e 6f 77 2e  e test file now.
128b0 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20  ..          #.. 
128c0 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73 65           if {[se
128d0 74 20 63 6f 64 65 20 5b 63 61 74 63 68 20 7b 66  t code [catch {f
128e0 69 6c 65 20 64 65 6c 65 74 65 20 24 66 69 6c 65  ile delete $file
128f0 4e 61 6d 65 7d 20 65 72 72 6f 72 5d 5d 7d 20 74  Name} error]]} t
12900 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
12910 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
12920 20 20 23 20 4e 4f 54 45 3a 20 57 65 20 73 6f 6d    # NOTE: We som
12930 65 68 6f 77 20 66 61 69 6c 65 64 20 74 6f 20 64  ehow failed to d
12940 65 6c 65 74 65 20 74 68 65 20 66 69 6c 65 2c 20  elete the file, 
12950 72 65 70 6f 72 74 20 77 68 79 2e 0d 0a 20 20 20  report why...   
12960 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
12970 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
12980 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61  :test_channel [a
12990 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
129a0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 3d 3d               "==
129b0 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c  == WARNING: fail
129c0 65 64 20 74 6f 20 64 65 6c 65 74 65 20 74 65 73  ed to delete tes
129d0 74 20 66 69 6c 65 20 5c 22 22 20 24 66 69 6c 65  t file \"" $file
129e0 4e 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20 20 20  Name \..        
129f0 20 20 20 20 20 20 20 20 22 5c 22 20 64 75 72 69          "\" duri
12a00 6e 67 20 63 6c 65 61 6e 75 70 2c 20 65 72 72 6f  ng cleanup, erro
12a10 72 3a 20 22 20 5c 6e 5c 74 20 24 65 72 72 6f 72  r: " \n\t $error
12a20 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20   \n]..          
12a30 7d 0d 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73  }..        } els
12a40 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 23  e {..          #
12a50 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f  ..          # NO
12a60 54 45 3a 20 53 68 6f 77 20 74 68 61 74 20 77 65  TE: Show that we
12a70 20 73 6b 69 70 70 65 64 20 64 65 6c 65 74 69 6e   skipped deletin
12a80 67 20 74 68 65 20 66 69 6c 65 2e 0d 0a 20 20 20  g the file...   
12a90 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
12aa0 20 20 20 20 73 65 74 20 63 6f 64 65 20 30 0d 0a      set code 0..
12ab0 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70 75 74  ..          tput
12ac0 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
12ad0 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
12ae0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22  .              "
12af0 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 73 6b  ==== WARNING: sk
12b00 69 70 70 65 64 20 64 65 6c 65 74 69 6e 67 20 74  ipped deleting t
12b10 65 73 74 20 66 69 6c 65 20 5c 22 22 20 24 66 69  est file \"" $fi
12b20 6c 65 4e 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20  leName \..      
12b30 20 20 20 20 20 20 20 20 22 5c 22 20 64 75 72 69          "\" duri
12b40 6e 67 20 63 6c 65 61 6e 75 70 5c 6e 22 5d 0d 0a  ng cleanup\n"]..
12b50 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
12b60 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
12b70 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
12b80 4e 4f 54 45 3a 20 54 68 65 20 66 69 6c 65 20 64  NOTE: The file d
12b90 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2c 20 73  oes not exist, s
12ba0 75 63 63 65 73 73 21 0d 0a 20 20 20 20 20 20 20  uccess!..       
12bb0 20 23 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20   #..        set 
12bc0 63 6f 64 65 20 30 0d 0a 20 20 20 20 20 20 7d 0d  code 0..      }.
12bd0 0a 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ...      return 
12be0 24 63 6f 64 65 0d 0a 20 20 20 20 7d 0d 0a 0c 0d  $code..    }....
12bf0 0a 20 20 20 20 70 72 6f 63 20 63 6f 6c 6c 65 63  .    proc collec
12c00 74 47 61 72 62 61 67 65 20 7b 20 63 68 61 6e 6e  tGarbage { chann
12c10 65 6c 20 7b 6d 69 6c 6c 69 73 65 63 6f 6e 64 73  el {milliseconds
12c20 20 31 30 30 30 7d 20 7b 71 75 69 65 74 20 74 72   1000} {quiet tr
12c30 75 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 69  ue} } {..      i
12c40 66 20 7b 5b 63 61 74 63 68 20 7b 6f 62 6a 65 63  f {[catch {objec
12c50 74 20 69 6e 76 6f 6b 65 20 47 43 20 47 65 74 54  t invoke GC GetT
12c60 6f 74 61 6c 4d 65 6d 6f 72 79 20 66 61 6c 73 65  otalMemory false
12c70 7d 20 72 65 73 75 6c 74 5d 20 3d 3d 20 30 7d 20  } result] == 0} 
12c80 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
12c90 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65  if {!$quiet} the
12ca0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74  n {..          t
12cb0 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61  puts $channel [a
12cc0 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
12cd0 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
12ce0 20 6d 65 6d 6f 72 79 20 69 6e 20 75 73 65 20 62   memory in use b
12cf0 79 20 74 68 65 20 43 4c 52 20 62 65 66 6f 72 65  y the CLR before
12d00 20 63 6f 6c 6c 65 63 74 69 6f 6e 2e 2e 2e 20 22   collection... "
12d10 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
12d20 20 20 24 72 65 73 75 6c 74 20 22 20 62 79 74 65    $result " byte
12d30 73 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20 7d  s\n"]..        }
12d40 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b  ..      } else {
12d50 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20  ..        tputs 
12d60 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  $channel [append
12d70 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
12d80 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e      "==== WARNIN
12d90 47 3a 20 66 61 69 6c 65 64 20 74 6f 20 67 65 74  G: failed to get
12da0 20 43 4c 52 20 6d 65 6d 6f 72 79 20 75 73 61 67   CLR memory usag
12db0 65 2c 20 65 72 72 6f 72 3a 20 22 20 5c 0d 0a 20  e, error: " \.. 
12dc0 20 20 20 20 20 20 20 20 20 20 20 5c 6e 5c 74 20             \n\t 
12dd0 24 72 65 73 75 6c 74 20 5c 6e 5d 0d 0a 20 20 20  $result \n]..   
12de0 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 23     }....      ##
12df0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
12e00 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
12e10 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
12e20 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
12e30 23 23 23 23 23 23 23 0d 0a 0d 0a 20 20 20 20 20  #######....     
12e40 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
12e50 3a 20 52 65 70 65 61 74 65 64 6c 79 20 61 74 74  : Repeatedly att
12e60 65 6d 70 74 20 74 6f 20 63 6f 6c 6c 65 63 74 20  empt to collect 
12e70 67 61 72 62 61 67 65 20 75 6e 74 69 6c 20 74 68  garbage until th
12e80 65 20 61 6c 6c 6f 74 74 65 64 20 6e 75 6d 62 65  e allotted numbe
12e90 72 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  r..      #      
12ea0 20 6f 66 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73   of milliseconds
12eb0 20 68 61 73 20 65 6c 61 70 73 65 64 2e 20 20 41   has elapsed.  A
12ec0 6c 77 61 79 73 20 61 74 74 65 6d 70 74 20 74 6f  lways attempt to
12ed0 20 63 6f 6c 6c 65 63 74 20 67 61 72 62 61 67 65   collect garbage
12ee0 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
12ef0 61 74 20 6c 65 61 73 74 20 6f 6e 63 65 2e 0d 0a  at least once...
12f00 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 73        #..      s
12f10 65 74 20 73 74 61 72 74 20 5b 63 6c 6f 63 6b 20  et start [clock 
12f20 73 65 63 6f 6e 64 73 5d 0d 0a 20 20 20 20 20 20  seconds]..      
12f30 73 65 74 20 73 74 6f 70 20 5b 65 78 70 72 20 7b  set stop [expr {
12f40 24 73 74 61 72 74 20 2b 20 28 24 6d 69 6c 6c 69  $start + ($milli
12f50 73 65 63 6f 6e 64 73 20 2f 20 31 30 30 30 29 7d  seconds / 1000)}
12f60 5d 0d 0a 0d 0a 20 20 20 20 20 20 64 6f 20 7b 0d  ]....      do {.
12f70 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
12f80 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 74 74 65      # NOTE: Atte
12f90 6d 70 74 20 74 6f 20 66 6f 72 63 65 20 61 20 66  mpt to force a f
12fa0 75 6c 6c 20 67 61 72 62 61 67 65 20 63 6f 6c 6c  ull garbage coll
12fb0 65 63 74 69 6f 6e 20 6e 6f 77 2e 20 20 52 65 70  ection now.  Rep
12fc0 6f 72 74 20 61 6e 79 0d 0a 20 20 20 20 20 20 20  ort any..       
12fd0 20 23 20 20 20 20 20 20 20 65 72 72 6f 72 20 74   #       error t
12fe0 68 61 74 20 69 73 20 65 6e 63 6f 75 6e 74 65 72  hat is encounter
12ff0 65 64 20 69 66 20 77 65 20 66 61 69 6c 2e 0d 0a  ed if we fail...
13000 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
13010 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 6f     if {[catch {o
13020 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 47 43 20  bject invoke GC 
13030 47 65 74 54 6f 74 61 6c 4d 65 6d 6f 72 79 20 74  GetTotalMemory t
13040 72 75 65 7d 20 65 72 72 6f 72 5d 7d 20 74 68 65  rue} error]} the
13050 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74  n {..          t
13060 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61  puts $channel [a
13070 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
13080 20 20 20 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d             "====
13090 20 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64   WARNING: failed
130a0 20 66 75 6c 6c 20 67 61 72 62 61 67 65 20 63 6f   full garbage co
130b0 6c 6c 65 63 74 69 6f 6e 2c 20 65 72 72 6f 72 3a  llection, error:
130c0 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20   " \..          
130d0 20 20 20 20 5c 6e 5c 74 20 24 65 72 72 6f 72 20      \n\t $error 
130e0 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  \n]..        }..
130f0 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 6e 6f  ..        set no
13100 77 20 5b 63 6c 6f 63 6b 20 73 65 63 6f 6e 64 73  w [clock seconds
13110 5d 0d 0a 20 20 20 20 20 20 7d 20 77 68 69 6c 65  ]..      } while
13120 20 7b 24 73 74 61 72 74 20 3c 3d 20 24 6e 6f 77   {$start <= $now
13130 20 26 26 20 24 6e 6f 77 20 3c 20 24 73 74 6f 70   && $now < $stop
13140 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 23 23 23 23  }....      #####
13150 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
13160 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
13170 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
13180 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
13190 23 23 23 23 0d 0a 0d 0a 20 20 20 20 20 20 69 66  ####....      if
131a0 20 7b 5b 63 61 74 63 68 20 7b 6f 62 6a 65 63 74   {[catch {object
131b0 20 69 6e 76 6f 6b 65 20 47 43 20 47 65 74 54 6f   invoke GC GetTo
131c0 74 61 6c 4d 65 6d 6f 72 79 20 66 61 6c 73 65 7d  talMemory false}
131d0 20 72 65 73 75 6c 74 5d 20 3d 3d 20 30 7d 20 74   result] == 0} t
131e0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 69  hen {..        i
131f0 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e  f {!$quiet} then
13200 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70   {..          tp
13210 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70  uts $channel [ap
13220 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
13230 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
13240 6d 65 6d 6f 72 79 20 69 6e 20 75 73 65 20 62 79  memory in use by
13250 20 74 68 65 20 43 4c 52 20 61 66 74 65 72 20 63   the CLR after c
13260 6f 6c 6c 65 63 74 69 6f 6e 2e 2e 2e 20 22 20 5c  ollection... " \
13270 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
13280 24 72 65 73 75 6c 74 20 22 20 62 79 74 65 73 5c  $result " bytes\
13290 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  n"]..        }..
132a0 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
132b0 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
132c0 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
132d0 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
132e0 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a    "==== WARNING:
132f0 20 66 61 69 6c 65 64 20 74 6f 20 67 65 74 20 43   failed to get C
13300 4c 52 20 6d 65 6d 6f 72 79 20 75 73 61 67 65 2c  LR memory usage,
13310 20 65 72 72 6f 72 3a 20 22 20 5c 0d 0a 20 20 20   error: " \..   
13320 20 20 20 20 20 20 20 20 20 5c 6e 5c 74 20 24 72           \n\t $r
13330 65 73 75 6c 74 20 5c 6e 5d 0d 0a 20 20 20 20 20  esult \n]..     
13340 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20   }..    }.....  
13350 20 20 70 72 6f 63 20 67 65 74 53 51 4c 69 74 65    proc getSQLite
13360 48 61 6e 64 6c 65 43 6f 75 6e 74 73 20 7b 20 63  HandleCounts { c
13370 68 61 6e 6e 65 6c 20 7b 71 75 69 65 74 20 66 61  hannel {quiet fa
13380 6c 73 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20  lse} } {..      
13390 73 65 74 20 72 65 73 75 6c 74 20 5b 6c 69 73 74  set result [list
133a0 5d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b  ]....      if {[
133b0 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 5c  haveConstraint \
133c0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
133d0 64 65 66 69 6e 65 43 6f 6e 73 74 61 6e 74 2e 53  defineConstant.S
133e0 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
133f0 65 2e 43 4f 55 4e 54 5f 48 41 4e 44 4c 45 5d 7d  e.COUNT_HANDLE]}
13400 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
13410 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
13420 54 45 3a 20 41 64 64 20 65 61 63 68 20 63 72 69  TE: Add each cri
13430 74 69 63 61 6c 20 68 61 6e 64 6c 65 20 63 6f 75  tical handle cou
13440 6e 74 20 74 6f 20 74 68 65 20 72 65 73 75 6c 74  nt to the result
13450 69 6e 67 20 6c 69 73 74 2e 0d 0a 20 20 20 20 20  ing list...     
13460 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 66 6f     #..        fo
13470 72 65 61 63 68 20 6e 61 6d 65 20 5b 6c 69 73 74  reach name [list
13480 20 63 6f 6e 6e 65 63 74 69 6f 6e 43 6f 75 6e 74   connectionCount
13490 20 73 74 61 74 65 6d 65 6e 74 43 6f 75 6e 74 20   statementCount 
134a0 62 61 63 6b 75 70 43 6f 75 6e 74 5d 20 7b 0d 0a  backupCount] {..
134b0 20 20 20 20 20 20 20 20 20 20 73 65 74 20 76 61            set va
134c0 6c 75 65 20 5b 6f 62 6a 65 63 74 20 69 6e 76 6f  lue [object invo
134d0 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75  ke -flags +NonPu
134e0 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20 20 20  blic \..        
134f0 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74        System.Dat
13500 61 2e 53 51 4c 69 74 65 2e 55 6e 73 61 66 65 4e  a.SQLite.UnsafeN
13510 61 74 69 76 65 4d 65 74 68 6f 64 73 20 24 6e 61  ativeMethods $na
13520 6d 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  me]....         
13530 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68   if {!$quiet} th
13540 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
13550 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
13560 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
13570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13580 22 2d 2d 2d 2d 20 63 72 69 74 69 63 61 6c 20 68  "---- critical h
13590 61 6e 64 6c 65 20 63 6f 75 6e 74 20 5c 22 22 20  andle count \"" 
135a0 24 6e 61 6d 65 20 22 5c 22 20 69 73 20 22 20 24  $name "\" is " $
135b0 76 61 6c 75 65 20 5c 6e 5d 0d 0a 20 20 20 20 20  value \n]..     
135c0 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
135d0 20 20 20 20 6c 61 70 70 65 6e 64 20 72 65 73 75      lappend resu
135e0 6c 74 20 24 76 61 6c 75 65 0d 0a 20 20 20 20 20  lt $value..     
135f0 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 20 65 6c     }..      } el
13600 73 65 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74  seif {!$quiet} t
13610 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  hen {..        #
13620 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
13630 3a 20 54 68 65 20 61 63 74 75 61 6c 20 68 61 6e  : The actual han
13640 64 6c 65 20 63 6f 75 6e 74 73 20 61 72 65 20 6e  dle counts are n
13650 6f 74 20 61 76 61 69 6c 61 62 6c 65 3b 20 74 68  ot available; th
13660 65 72 65 66 6f 72 65 2c 20 6a 75 73 74 0d 0a 20  erefore, just.. 
13670 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 72         #       r
13680 65 74 75 72 6e 20 61 6e 20 65 6d 70 74 79 20 6c  eturn an empty l
13690 69 73 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  ist...        #.
136a0 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24  .        tputs $
136b0 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 63 72  channel "---- cr
136c0 69 74 69 63 61 6c 20 68 61 6e 64 6c 65 20 63 6f  itical handle co
136d0 75 6e 74 73 20 75 6e 61 76 61 69 6c 61 62 6c 65  unts unavailable
136e0 5c 6e 22 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a  \n"..      }....
136f0 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 72 65        return $re
13700 73 75 6c 74 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a  sult..    }.....
13710 20 20 20 20 70 72 6f 63 20 73 68 75 74 64 6f 77      proc shutdow
13720 6e 53 51 4c 69 74 65 20 7b 20 63 68 61 6e 6e 65  nSQLite { channe
13730 6c 20 7b 66 6f 72 63 65 20 66 61 6c 73 65 7d 20  l {force false} 
13740 7b 71 75 69 65 74 20 66 61 6c 73 65 7d 20 7d 20  {quiet false} } 
13750 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  {..      #..    
13760 20 20 23 20 4e 4f 54 45 3a 20 4d 61 6b 65 20 73    # NOTE: Make s
13770 75 72 65 20 74 68 61 74 20 53 51 4c 69 74 65 20  ure that SQLite 
13780 63 6f 72 65 20 6c 69 62 72 61 72 79 20 69 73 20  core library is 
13790 63 6f 6d 70 6c 65 74 65 6c 79 20 73 68 75 74 64  completely shutd
137a0 6f 77 6e 2e 20 20 54 68 69 73 0d 0a 20 20 20 20  own.  This..    
137b0 20 20 23 20 20 20 20 20 20 20 69 73 20 75 73 65    #       is use
137c0 64 20 62 79 20 74 65 73 74 73 20 74 68 61 74 20  d by tests that 
137d0 63 68 61 6e 67 65 20 63 6f 6e 66 69 67 75 72 61  change configura
137e0 74 69 6f 6e 20 6f 70 74 69 6f 6e 73 20 61 6e 64  tion options and
137f0 2f 6f 72 20 74 68 6f 73 65 0d 0a 20 20 20 20 20  /or those..     
13800 20 23 20 20 20 20 20 20 20 74 68 61 74 20 6e 65   #       that ne
13810 65 64 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20  ed to make sure 
13820 6c 6f 67 67 69 6e 67 20 69 73 20 69 6e 69 74 69  logging is initi
13830 61 6c 69 7a 65 64 20 28 69 2e 65 2e 20 6a 75 73  alized (i.e. jus
13840 74 20 69 6e 20 63 61 73 65 0d 0a 20 20 20 20 20  t in case..     
13850 20 23 20 20 20 20 20 20 20 74 68 65 20 53 51 4c   #       the SQL
13860 69 74 65 20 63 6f 72 65 20 6c 69 62 72 61 72 79  ite core library
13870 20 77 61 73 20 69 6e 69 74 69 61 6c 69 7a 65 64   was initialized
13880 20 69 6e 20 74 68 65 20 70 72 6f 63 65 73 73 20   in the process 
13890 70 72 69 6f 72 20 74 6f 0d 0a 20 20 20 20 20 20  prior to..      
138a0 23 20 20 20 20 20 20 20 74 68 65 20 53 51 4c 69  #       the SQLi
138b0 74 65 4c 6f 67 20 63 6c 61 73 73 20 62 65 69 6e  teLog class bein
138c0 67 20 61 62 6c 65 20 74 6f 20 73 65 74 75 70 20  g able to setup 
138d0 69 74 73 20 6c 6f 67 67 69 6e 67 20 63 61 6c 6c  its logging call
138e0 62 61 63 6b 29 2e 0d 0a 20 20 20 20 20 20 23 20  back)...      # 
138f0 20 20 20 20 20 20 4e 6f 72 6d 61 6c 6c 79 2c 20        Normally, 
13900 74 68 69 73 20 73 68 6f 75 6c 64 20 6f 6e 6c 79  this should only
13910 20 62 65 20 70 65 72 66 6f 72 6d 65 64 20 69 66   be performed if
13920 20 53 51 4c 69 74 65 20 69 73 20 6c 6f 61 64 65   SQLite is loade
13930 64 20 61 6e 64 0d 0a 20 20 20 20 20 20 23 20 20  d and..      #  
13940 20 20 20 20 20 72 65 61 64 79 20 66 6f 72 20 75       ready for u
13950 73 65 20 62 79 20 74 68 65 20 74 65 73 74 20 73  se by the test s
13960 75 69 74 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  uite...      #..
13970 20 20 20 20 20 20 69 66 20 7b 24 66 6f 72 63 65        if {$force
13980 20 7c 7c 20 5b 69 73 53 51 4c 69 74 65 52 65 61   || [isSQLiteRea
13990 64 79 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  dy]} then {..   
139a0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
139b0 23 20 42 55 47 46 49 58 3a 20 42 65 66 6f 72 65  # BUGFIX: Before
139c0 20 63 61 6c 6c 69 6e 67 20 74 68 65 20 6e 61 74   calling the nat
139d0 69 76 65 20 73 68 75 74 64 6f 77 6e 20 66 75 6e  ive shutdown fun
139e0 63 74 69 6f 6e 2c 20 6d 61 6b 65 20 73 75 72 65  ction, make sure
139f0 20 62 6f 74 68 0d 0a 20 20 20 20 20 20 20 20 23   both..        #
13a00 20 20 20 20 20 20 20 20 20 6f 66 20 74 68 65 20           of the 
13a10 50 52 41 47 4d 41 20 72 65 6c 61 74 65 64 20 64  PRAGMA related d
13a20 69 72 65 63 74 6f 72 79 20 6e 61 6d 65 73 20 61  irectory names a
13a30 72 65 20 66 72 65 65 64 2e 0d 0a 20 20 20 20 20  re freed...     
13a40 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 63 68     #..        ch
13a50 65 63 6b 46 6f 72 53 51 4c 69 74 65 44 69 72 65  eckForSQLiteDire
13a60 63 74 6f 72 69 65 73 20 24 63 68 61 6e 6e 65 6c  ctories $channel
13a70 20 74 72 75 65 0d 0a 0d 0a 20 20 20 20 20 20 20   true....       
13a80 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20   if {[catch {.. 
13a90 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20           object 
13aa0 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e  invoke -flags +N
13ab0 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20  onPublic \..    
13ac0 20 20 20 20 20 20 20 20 20 20 53 79 73 74 65 6d            System
13ad0 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 55 6e 73  .Data.SQLite.Uns
13ae0 61 66 65 4e 61 74 69 76 65 4d 65 74 68 6f 64 73  afeNativeMethods
13af0 20 73 71 6c 69 74 65 33 5f 73 68 75 74 64 6f 77   sqlite3_shutdow
13b00 6e 0d 0a 20 20 20 20 20 20 20 20 7d 20 72 65 73  n..        } res
13b10 75 6c 74 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20  ult] == 0} then 
13b20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20  {..          if 
13b30 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b  {!$quiet} then {
13b40 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70  ..            tp
13b50 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70  uts $channel [ap
13b60 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
13b70 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
13b80 2d 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 5f 73  - call sqlite3_s
13b90 68 75 74 64 6f 77 6e 28 29 2e 2e 2e 20 6f 6b 3a  hutdown()... ok:
13ba0 20 22 20 24 72 65 73 75 6c 74 20 5c 6e 5d 0d 0a   " $result \n]..
13bb0 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
13bc0 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
13bd0 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71           if {!$q
13be0 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  uiet} then {..  
13bf0 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
13c00 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  $channel [append
13c10 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
13c20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 61          "---- ca
13c30 6c 6c 20 73 71 6c 69 74 65 33 5f 73 68 75 74 64  ll sqlite3_shutd
13c40 6f 77 6e 28 29 2e 2e 2e 20 65 72 72 6f 72 3a 20  own()... error: 
13c50 22 20 5c 6e 5c 74 20 24 72 65 73 75 6c 74 20 5c  " \n\t $result \
13c60 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d  n]..          }.
13c70 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  .        }..    
13c80 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20    }..    }..... 
13c90 20 20 20 70 72 6f 63 20 72 65 70 6f 72 74 53 51     proc reportSQ
13ca0 4c 69 74 65 52 65 73 6f 75 72 63 65 73 20 7b 0d  LiteResources {.
13cb0 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 68 61  .            cha
13cc0 6e 6e 65 6c 20 7b 71 75 69 65 74 20 66 61 6c 73  nnel {quiet fals
13cd0 65 7d 20 7b 72 65 73 65 74 20 74 72 75 65 7d 20  e} {reset true} 
13ce0 7b 63 6f 6c 6c 65 63 74 20 74 72 75 65 7d 20 7d  {collect true} }
13cf0 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20   {..      #..   
13d00 20 20 20 23 20 4e 4f 54 45 3a 20 49 66 20 61 76     # NOTE: If av
13d10 61 69 6c 61 62 6c 65 2c 20 72 65 70 6f 72 74 20  ailable, report 
13d20 6f 6e 20 28 61 6e 64 20 70 6f 73 73 69 62 6c 79  on (and possibly
13d30 20 72 65 73 65 74 29 20 74 68 65 20 72 75 6e 74   reset) the runt
13d40 69 6d 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ime..      #    
13d50 20 20 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e     configuration
13d60 20 73 74 61 74 69 73 74 69 63 73 2e 0d 0a 20 20   statistics...  
13d70 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20      #..      if 
13d80 7b 5b 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74  {[haveConstraint
13d90 20 62 75 69 6c 64 43 6f 6e 66 69 67 75 72 61 74   buildConfigurat
13da0 69 6f 6e 2e 44 65 62 75 67 5d 20 26 26 20 5b 63  ion.Debug] && [c
13db0 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20  atch {..        
13dc0 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66  object invoke -f
13dd0 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20  lags +NonPublic 
13de0 2d 61 6c 69 61 73 20 5c 0d 0a 20 20 20 20 20 20  -alias \..      
13df0 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74        System.Dat
13e00 61 2e 53 51 4c 69 74 65 2e 55 6e 73 61 66 65 4e  a.SQLite.UnsafeN
13e10 61 74 69 76 65 4d 65 74 68 6f 64 73 20 73 65 74  ativeMethods set
13e20 74 69 6e 67 52 65 61 64 43 6f 75 6e 74 73 0d 0a  tingReadCounts..
13e30 20 20 20 20 20 20 7d 20 73 65 74 74 69 6e 67 52        } settingR
13e40 65 61 64 43 6f 75 6e 74 73 5d 20 3d 3d 20 30 7d  eadCounts] == 0}
13e50 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
13e60 20 73 65 74 20 6e 61 6d 65 43 6f 75 6e 74 20 5b   set nameCount [
13e70 24 73 65 74 74 69 6e 67 52 65 61 64 43 6f 75 6e  $settingReadCoun
13e80 74 73 20 43 6f 75 6e 74 5d 0d 0a 20 20 20 20 20  ts Count]..     
13e90 20 20 20 73 65 74 20 76 61 6c 75 65 43 6f 75 6e     set valueCoun
13ea0 74 20 30 0d 0a 0d 0a 20 20 20 20 20 20 20 20 6f  t 0....        o
13eb0 62 6a 65 63 74 20 66 6f 72 65 61 63 68 20 2d 61  bject foreach -a
13ec0 6c 69 61 73 20 70 61 69 72 20 24 73 65 74 74 69  lias pair $setti
13ed0 6e 67 52 65 61 64 43 6f 75 6e 74 73 20 7b 0d 0a  ngReadCounts {..
13ee0 20 20 20 20 20 20 20 20 20 20 69 6e 63 72 20 76            incr v
13ef0 61 6c 75 65 43 6f 75 6e 74 20 5b 24 70 61 69 72  alueCount [$pair
13f00 20 56 61 6c 75 65 5d 0d 0a 0d 0a 20 20 20 20 20   Value]....     
13f10 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74       if {!$quiet
13f20 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
13f30 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
13f40 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
13f50 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
13f60 20 20 20 20 22 2d 2d 2d 2d 20 73 65 74 74 69 6e      "---- settin
13f70 67 20 5c 22 22 20 5b 24 70 61 69 72 20 4b 65 79  g \"" [$pair Key
13f80 5d 20 22 5c 22 20 77 61 73 20 72 65 61 64 20 22  ] "\" was read "
13f90 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
13fa0 20 20 20 20 5b 24 70 61 69 72 20 56 61 6c 75 65      [$pair Value
13fb0 5d 20 22 20 74 69 6d 65 73 5c 6e 22 5d 0d 0a 20  ] " times\n"].. 
13fc0 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
13fd0 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
13fe0 20 69 66 20 7b 24 72 65 73 65 74 7d 20 74 68 65   if {$reset} the
13ff0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69  n {..          i
14000 66 20 7b 5b 63 61 74 63 68 20 7b 24 73 65 74 74  f {[catch {$sett
14010 69 6e 67 52 65 61 64 43 6f 75 6e 74 73 20 43 6c  ingReadCounts Cl
14020 65 61 72 7d 20 65 72 72 6f 72 5d 20 3d 3d 20 30  ear} error] == 0
14030 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
14040 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65        if {!$quie
14050 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  t} then {..     
14060 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
14070 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
14080 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
14090 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 72           "---- r
140a0 65 73 65 74 20 73 65 74 74 69 6e 67 20 73 74 61  eset setting sta
140b0 74 69 73 74 69 63 73 20 66 6f 72 20 74 68 65 20  tistics for the 
140c0 70 72 65 76 69 6f 75 73 20 22 20 5c 0d 0a 20 20  previous " \..  
140d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
140e0 24 6e 61 6d 65 43 6f 75 6e 74 20 22 20 6e 61 6d  $nameCount " nam
140f0 65 73 20 61 6e 64 20 22 20 24 76 61 6c 75 65 43  es and " $valueC
14100 6f 75 6e 74 20 22 20 76 61 6c 75 65 73 20 72 65  ount " values re
14110 61 64 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20  ad\n"]..        
14120 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
14130 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
14140 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
14150 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
14160 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
14170 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49       "==== WARNI
14180 4e 47 3a 20 66 61 69 6c 65 64 20 74 6f 20 72 65  NG: failed to re
14190 73 65 74 20 73 65 74 74 69 6e 67 20 73 74 61 74  set setting stat
141a0 69 73 74 69 63 73 20 66 6f 72 20 22 20 5c 0d 0a  istics for " \..
141b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
141c0 22 74 68 65 20 70 72 65 76 69 6f 75 73 20 22 20  "the previous " 
141d0 24 6e 61 6d 65 43 6f 75 6e 74 20 22 20 6e 61 6d  $nameCount " nam
141e0 65 73 20 61 6e 64 20 22 20 24 76 61 6c 75 65 43  es and " $valueC
141f0 6f 75 6e 74 20 5c 0d 0a 20 20 20 20 20 20 20 20  ount \..        
14200 20 20 20 20 20 20 20 20 22 20 76 61 6c 75 65 73          " values
14210 20 72 65 61 64 2c 20 65 72 72 6f 72 3a 20 22 20   read, error: " 
14220 5c 6e 5c 74 20 24 65 72 72 6f 72 20 5c 6e 5d 0d  \n\t $error \n].
14230 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  .          }..  
14240 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d        }..      }
14250 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 68  ....      if {[h
14260 61 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 5c 0d  aveConstraint \.
14270 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64  .              d
14280 65 66 69 6e 65 43 6f 6e 73 74 61 6e 74 2e 53 79  efineConstant.Sy
14290 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
142a0 2e 49 4e 54 45 52 4f 50 5f 56 49 52 54 55 41 4c  .INTEROP_VIRTUAL
142b0 5f 54 41 42 4c 45 5d 20 26 26 20 5c 0d 0a 20 20  _TABLE] && \..  
142c0 20 20 20 20 20 20 20 20 5b 68 61 76 65 43 6f 6e          [haveCon
142d0 73 74 72 61 69 6e 74 20 5c 0d 0a 20 20 20 20 20  straint \..     
142e0 20 20 20 20 20 20 20 20 20 64 65 66 69 6e 65 43           defineC
142f0 6f 6e 73 74 61 6e 74 2e 53 79 73 74 65 6d 2e 44  onstant.System.D
14300 61 74 61 2e 53 51 4c 69 74 65 2e 54 52 41 43 4b  ata.SQLite.TRACK
14310 5f 4d 45 4d 4f 52 59 5f 42 59 54 45 53 5d 7d 20  _MEMORY_BYTES]} 
14320 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
14330 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65  if {!$quiet} the
14340 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74  n {..          t
14350 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 22 2d  puts $channel "-
14360 2d 2d 2d 20 63 75 72 72 65 6e 74 20 6d 65 6d 6f  --- current memo
14370 72 79 20 69 6e 20 75 73 65 20 62 79 20 53 51 4c  ry in use by SQL
14380 69 74 65 4d 65 6d 6f 72 79 2e 2e 2e 20 22 0d 0a  iteMemory... "..
14390 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
143a0 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20       if {[catch 
143b0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 6f 62 6a  {..          obj
143c0 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67  ect invoke -flag
143d0 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a  s +NonPublic \..
143e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 79                Sy
143f0 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
14400 2e 53 51 4c 69 74 65 4d 65 6d 6f 72 79 20 62 79  .SQLiteMemory by
14410 74 65 73 41 6c 6c 6f 63 61 74 65 64 0d 0a 20 20  tesAllocated..  
14420 20 20 20 20 20 20 7d 20 6d 65 6d 6f 72 79 5d 20        } memory] 
14430 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  == 0} then {..  
14440 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75          if {!$qu
14450 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  iet} then {..   
14460 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
14470 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
14480 72 67 73 20 24 6d 65 6d 6f 72 79 20 22 20 62 79  rgs $memory " by
14490 74 65 73 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20  tes\n"]..       
144a0 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 20     }..        } 
144b0 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
144c0 20 20 73 65 74 20 6d 65 6d 6f 72 79 20 75 6e 6b    set memory unk
144d0 6e 6f 77 6e 0d 0a 0d 0a 20 20 20 20 20 20 20 20  nown....        
144e0 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74    if {!$quiet} t
144f0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
14500 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
14510 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 24 6d  l [appendArgs $m
14520 65 6d 6f 72 79 20 5c 6e 5d 0d 0a 20 20 20 20 20  emory \n]..     
14530 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
14540 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20  }....        if 
14550 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b  {!$quiet} then {
14560 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70 75 74  ..          tput
14570 73 20 24 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d  s $channel "----
14580 20 6d 61 78 69 6d 75 6d 20 6d 65 6d 6f 72 79 20   maximum memory 
14590 69 6e 20 75 73 65 20 62 79 20 53 51 4c 69 74 65  in use by SQLite
145a0 4d 65 6d 6f 72 79 2e 2e 2e 20 22 0d 0a 20 20 20  Memory... "..   
145b0 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
145c0 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a    if {[catch {..
145d0 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74            object
145e0 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b   invoke -flags +
145f0 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20  NonPublic \..   
14600 20 20 20 20 20 20 20 20 20 20 20 53 79 73 74 65             Syste
14610 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 53 51  m.Data.SQLite.SQ
14620 4c 69 74 65 4d 65 6d 6f 72 79 20 6d 61 78 69 6d  LiteMemory maxim
14630 75 6d 42 79 74 65 73 41 6c 6c 6f 63 61 74 65 64  umBytesAllocated
14640 0d 0a 20 20 20 20 20 20 20 20 7d 20 6d 65 6d 6f  ..        } memo
14650 72 79 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b  ry] == 0} then {
14660 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b  ..          if {
14670 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d  !$quiet} then {.
14680 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75  .            tpu
14690 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70  ts $channel [app
146a0 65 6e 64 41 72 67 73 20 24 6d 65 6d 6f 72 79 20  endArgs $memory 
146b0 22 20 62 79 74 65 73 5c 6e 22 5d 0d 0a 20 20 20  " bytes\n"]..   
146c0 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
146d0 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
146e0 20 20 20 20 20 20 73 65 74 20 6d 65 6d 6f 72 79        set memory
146f0 20 75 6e 6b 6e 6f 77 6e 0d 0a 0d 0a 20 20 20 20   unknown....    
14700 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65        if {!$quie
14710 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  t} then {..     
14720 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
14730 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
14740 73 20 24 6d 65 6d 6f 72 79 20 5c 6e 5d 0d 0a 20  s $memory \n].. 
14750 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
14760 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a      }..      }..
14770 0d 0a 20 20 20 20 20 20 69 66 20 7b 21 24 71 75  ..      if {!$qu
14780 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  iet} then {..   
14790 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
147a0 6e 65 6c 20 22 2d 2d 2d 2d 20 63 75 72 72 65 6e  nel "---- curren
147b0 74 20 6d 65 6d 6f 72 79 20 69 6e 20 75 73 65 20  t memory in use 
147c0 62 79 20 53 51 4c 69 74 65 2e 2e 2e 20 22 0d 0a  by SQLite... "..
147d0 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
147e0 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20   if {[catch {.. 
147f0 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e         object in
14800 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e  voke -flags +Non
14810 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20  Public \..      
14820 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74        System.Dat
14830 61 2e 53 51 4c 69 74 65 2e 55 6e 73 61 66 65 4e  a.SQLite.UnsafeN
14840 61 74 69 76 65 4d 65 74 68 6f 64 73 20 73 71 6c  ativeMethods sql
14850 69 74 65 33 5f 6d 65 6d 6f 72 79 5f 75 73 65 64  ite3_memory_used
14860 0d 0a 20 20 20 20 20 20 7d 20 6d 65 6d 6f 72 79  ..      } memory
14870 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  ] == 0} then {..
14880 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75          if {!$qu
14890 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  iet} then {..   
148a0 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
148b0 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
148c0 73 20 24 6d 65 6d 6f 72 79 20 22 20 62 79 74 65  s $memory " byte
148d0 73 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20 7d  s\n"]..        }
148e0 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b  ..      } else {
148f0 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
14900 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4d 61 79       # NOTE: May
14910 62 65 20 74 68 65 20 53 51 4c 69 74 65 20 63 6f  be the SQLite co
14920 72 65 20 6c 69 62 72 61 72 79 20 69 73 20 75 6e  re library is un
14930 61 76 61 69 6c 61 62 6c 65 3f 0d 0a 20 20 20 20  available?..    
14940 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 73      #..        s
14950 65 74 20 6d 65 6d 6f 72 79 20 75 6e 6b 6e 6f 77  et memory unknow
14960 6e 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20  n....        if 
14970 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b  {!$quiet} then {
14980 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70 75 74  ..          tput
14990 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  s $channel [appe
149a0 6e 64 41 72 67 73 20 24 6d 65 6d 6f 72 79 20 5c  ndArgs $memory \
149b0 6e 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20  n]..        }.. 
149c0 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
149d0 73 65 74 20 72 65 73 75 6c 74 20 24 6d 65 6d 6f  set result $memo
149e0 72 79 3b 20 23 20 4e 4f 54 45 3a 20 52 65 74 75  ry; # NOTE: Retu
149f0 72 6e 20 6d 65 6d 6f 72 79 20 69 6e 2d 75 73 65  rn memory in-use
14a00 20 74 6f 20 6f 75 72 20 63 61 6c 6c 65 72 2e 0d   to our caller..
14a10 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 21 24 71  ...      if {!$q
14a20 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  uiet} then {..  
14a30 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
14a40 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 6d 61 78 69 6d  nnel "---- maxim
14a50 75 6d 20 6d 65 6d 6f 72 79 20 69 6e 20 75 73 65  um memory in use
14a60 20 62 79 20 53 51 4c 69 74 65 2e 2e 2e 20 22 0d   by SQLite... ".
14a70 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
14a80 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a    if {[catch {..
14a90 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69          object i
14aa0 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f  nvoke -flags +No
14ab0 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20  nPublic \..     
14ac0 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61         System.Da
14ad0 74 61 2e 53 51 4c 69 74 65 2e 55 6e 73 61 66 65  ta.SQLite.Unsafe
14ae0 4e 61 74 69 76 65 4d 65 74 68 6f 64 73 20 73 71  NativeMethods sq
14af0 6c 69 74 65 33 5f 6d 65 6d 6f 72 79 5f 68 69 67  lite3_memory_hig
14b00 68 77 61 74 65 72 20 30 0d 0a 20 20 20 20 20 20  hwater 0..      
14b10 7d 20 6d 65 6d 6f 72 79 5d 20 3d 3d 20 30 7d 20  } memory] == 0} 
14b20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
14b30 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65  if {!$quiet} the
14b40 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74  n {..          t
14b50 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61  puts $channel [a
14b60 70 70 65 6e 64 41 72 67 73 20 24 6d 65 6d 6f 72  ppendArgs $memor
14b70 79 20 22 20 62 79 74 65 73 5c 6e 22 5d 0d 0a 20  y " bytes\n"].. 
14b80 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
14b90 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
14ba0 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
14bb0 4f 54 45 3a 20 4d 61 79 62 65 20 74 68 65 20 53  OTE: Maybe the S
14bc0 51 4c 69 74 65 20 63 6f 72 65 20 6c 69 62 72 61  QLite core libra
14bd0 72 79 20 69 73 20 75 6e 61 76 61 69 6c 61 62 6c  ry is unavailabl
14be0 65 3f 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  e?..        #.. 
14bf0 20 20 20 20 20 20 20 73 65 74 20 6d 65 6d 6f 72         set memor
14c00 79 20 75 6e 6b 6e 6f 77 6e 0d 0a 0d 0a 20 20 20  y unknown....   
14c10 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74       if {!$quiet
14c20 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
14c30 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
14c40 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 24  el [appendArgs $
14c50 6d 65 6d 6f 72 79 20 5c 6e 5d 0d 0a 20 20 20 20  memory \n]..    
14c60 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a      }..      }..
14c70 0d 0a 20 20 20 20 20 20 69 66 20 7b 24 63 6f 6c  ..      if {$col
14c80 6c 65 63 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  lect} then {..  
14c90 20 20 20 20 20 20 63 6f 6c 6c 65 63 74 47 61 72        collectGar
14ca0 62 61 67 65 20 24 63 68 61 6e 6e 65 6c 0d 0a 20  bage $channel.. 
14cb0 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
14cc0 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65  if {!$quiet} the
14cd0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75  n {..        tpu
14ce0 74 73 20 24 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d  ts $channel "---
14cf0 2d 20 63 75 72 72 65 6e 74 20 6d 65 6d 6f 72 79  - current memory
14d00 20 69 6e 20 75 73 65 20 62 79 20 74 68 65 20 43   in use by the C
14d10 4c 52 2e 2e 2e 20 22 0d 0a 20 20 20 20 20 20 7d  LR... "..      }
14d20 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 63  ....      if {[c
14d30 61 74 63 68 20 7b 6f 62 6a 65 63 74 20 69 6e 76  atch {object inv
14d40 6f 6b 65 20 47 43 20 47 65 74 54 6f 74 61 6c 4d  oke GC GetTotalM
14d50 65 6d 6f 72 79 20 66 61 6c 73 65 7d 20 6d 65 6d  emory false} mem
14d60 6f 72 79 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20  ory] == 0} then 
14d70 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b  {..        if {[
14d80 73 74 72 69 6e 67 20 69 73 20 69 6e 74 65 67 65  string is intege
14d90 72 20 2d 73 74 72 69 63 74 20 24 6d 65 6d 6f 72  r -strict $memor
14da0 79 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  y]} then {..    
14db0 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65        if {!$quie
14dc0 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  t} then {..     
14dd0 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
14de0 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
14df0 73 20 24 6d 65 6d 6f 72 79 20 22 20 62 79 74 65  s $memory " byte
14e00 73 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20 20  s\n"]..         
14e10 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 20 65 6c   }..        } el
14e20 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  se {..          
14e30 73 65 74 20 6d 65 6d 6f 72 79 20 69 6e 76 61 6c  set memory inval
14e40 69 64 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  id....          
14e50 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65  if {!$quiet} the
14e60 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
14e70 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
14e80 5b 61 70 70 65 6e 64 41 72 67 73 20 24 6d 65 6d  [appendArgs $mem
14e90 6f 72 79 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20  ory \n]..       
14ea0 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d     }..        }.
14eb0 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d  .      } else {.
14ec0 0a 20 20 20 20 20 20 20 20 73 65 74 20 6d 65 6d  .        set mem
14ed0 6f 72 79 20 75 6e 6b 6e 6f 77 6e 0d 0a 0d 0a 20  ory unknown.... 
14ee0 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69         if {!$qui
14ef0 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  et} then {..    
14f00 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
14f10 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
14f20 20 24 6d 65 6d 6f 72 79 20 5c 6e 5d 0d 0a 20 20   $memory \n]..  
14f30 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d        }..      }
14f40 0d 0a 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ....      return
14f50 20 24 72 65 73 75 6c 74 0d 0a 20 20 20 20 7d 0d   $result..    }.
14f60 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 63 68 65  ....    proc che
14f70 63 6b 46 6f 72 53 51 4c 69 74 65 44 69 72 65 63  ckForSQLiteDirec
14f80 74 6f 72 69 65 73 20 7b 20 63 68 61 6e 6e 65 6c  tories { channel
14f90 20 7b 72 65 73 65 74 20 66 61 6c 73 65 7d 20 7d   {reset false} }
14fa0 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20   {..      #..   
14fb0 20 20 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b     # NOTE: Check
14fc0 20 69 66 20 74 68 65 20 73 71 6c 69 74 65 33 5f   if the sqlite3_
14fd0 77 69 6e 33 32 5f 73 65 74 5f 64 69 72 65 63 74  win32_set_direct
14fe0 6f 72 79 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  ory function is 
14ff0 61 76 61 69 6c 61 62 6c 65 2e 0d 0a 20 20 20 20  available...    
15000 20 20 23 0d 0a 20 20 20 20 20 20 74 70 75 74 73    #..      tputs
15010 20 24 63 68 61 6e 6e 65 6c 20 5c 0d 0a 20 20 20   $channel \..   
15020 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 68 65         "---- che
15030 63 6b 69 6e 67 20 66 6f 72 20 66 75 6e 63 74 69  cking for functi
15040 6f 6e 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32  on sqlite3_win32
15050 5f 73 65 74 5f 64 69 72 65 63 74 6f 72 79 2e 2e  _set_directory..
15060 2e 20 22 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a  . "....      #..
15070 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68        # NOTE: Th
15080 69 73 20 63 61 6c 6c 20 74 6f 20 74 68 65 20 73  is call to the s
15090 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 65 74  qlite3_win32_set
150a0 5f 64 69 72 65 63 74 6f 72 79 20 66 75 6e 63 74  _directory funct
150b0 69 6f 6e 20 75 73 65 73 20 74 68 65 0d 0a 20 20  ion uses the..  
150c0 20 20 20 20 23 20 20 20 20 20 20 20 69 6e 76 61      #       inva
150d0 6c 69 64 20 76 61 6c 75 65 20 30 20 66 6f 72 20  lid value 0 for 
150e0 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  the first argume
150f0 6e 74 2e 20 20 54 68 69 73 20 63 6f 64 65 20 69  nt.  This code i
15100 73 20 64 65 73 69 67 6e 65 64 0d 0a 20 20 20 20  s designed..    
15110 20 20 23 20 20 20 20 20 20 20 74 6f 20 63 68 65    #       to che
15120 63 6b 20 69 66 20 63 61 6c 6c 69 6e 67 20 74 68  ck if calling th
15130 65 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20  e function will 
15140 72 61 69 73 65 20 61 6e 20 65 78 63 65 70 74 69  raise an excepti
15150 6f 6e 20 28 69 2e 65 2e 0d 0a 20 20 20 20 20 20  on (i.e...      
15160 23 20 20 20 20 20 20 20 74 68 65 20 61 63 74 75  #       the actu
15170 61 6c 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65  al result of the
15180 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e   function does n
15190 6f 74 20 6d 61 74 74 65 72 20 61 73 20 6c 6f 6e  ot matter as lon
151a0 67 20 61 73 20 6e 6f 0d 0a 20 20 20 20 20 20 23  g as no..      #
151b0 20 20 20 20 20 20 20 64 69 72 65 63 74 6f 72 79         directory
151c0 20 69 73 20 63 68 61 6e 67 65 64 29 2e 0d 0a 20   is changed)... 
151d0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66       #..      if
151e0 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20   {[catch {..    
151f0 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b      object invok
15200 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62  e -flags +NonPub
15210 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  lic \..         
15220 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53     System.Data.S
15230 51 4c 69 74 65 2e 55 6e 73 61 66 65 4e 61 74 69  QLite.UnsafeNati
15240 76 65 4d 65 74 68 6f 64 73 20 5c 0d 0a 20 20 20  veMethods \..   
15250 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
15260 5f 77 69 6e 33 32 5f 73 65 74 5f 64 69 72 65 63  _win32_set_direc
15270 74 6f 72 79 20 30 20 6e 75 6c 6c 0d 0a 20 20 20  tory 0 null..   
15280 20 20 20 7d 5d 20 3d 3d 20 30 7d 20 74 68 65 6e     }] == 0} then
15290 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20   {..        #.. 
152a0 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43         # NOTE: C
152b0 61 6c 6c 69 6e 67 20 74 68 65 20 73 71 6c 69 74  alling the sqlit
152c0 65 33 5f 77 69 6e 33 32 5f 73 65 74 5f 64 69 72  e3_win32_set_dir
152d0 65 63 74 6f 72 79 20 66 75 6e 63 74 69 6f 6e 20  ectory function 
152e0 64 6f 65 73 20 6e 6f 74 0d 0a 20 20 20 20 20 20  does not..      
152f0 20 20 23 20 20 20 20 20 20 20 63 61 75 73 65 20    #       cause 
15300 61 6e 20 65 78 63 65 70 74 69 6f 6e 3b 20 74 68  an exception; th
15310 65 72 65 66 6f 72 65 2c 20 69 74 20 6d 75 73 74  erefore, it must
15320 20 62 65 20 61 76 61 69 6c 61 62 6c 65 20 28 69   be available (i
15330 2e 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 20 20  .e...        #  
15340 20 20 20 20 20 65 76 65 6e 20 74 68 6f 75 67 68       even though
15350 20 69 74 20 73 68 6f 75 6c 64 20 72 65 74 75 72   it should retur
15360 6e 20 61 20 66 61 69 6c 75 72 65 20 72 65 74 75  n a failure retu
15370 72 6e 20 63 6f 64 65 20 69 6e 20 74 68 69 73 0d  rn code in this.
15380 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
15390 20 63 61 73 65 29 2e 0d 0a 20 20 20 20 20 20 20   case)...       
153a0 20 23 0d 0a 20 20 20 20 20 20 20 20 61 64 64 43   #..        addC
153b0 6f 6e 73 74 72 61 69 6e 74 20 73 71 6c 69 74 65  onstraint sqlite
153c0 33 5f 77 69 6e 33 32 5f 73 65 74 5f 64 69 72 65  3_win32_set_dire
153d0 63 74 6f 72 79 0d 0a 0d 0a 20 20 20 20 20 20 20  ctory....       
153e0 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
153f0 79 65 73 5c 6e 0d 0a 0d 0a 20 20 20 20 20 20 20  yes\n....       
15400 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
15410 54 45 3a 20 44 6f 65 73 20 6f 75 72 20 63 61 6c  TE: Does our cal
15420 6c 65 72 20 77 61 6e 74 20 74 6f 20 72 65 73 65  ler want to rese
15430 74 20 74 68 65 20 64 69 72 65 63 74 6f 72 69 65  t the directorie
15440 73 3f 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  s?..        #.. 
15450 20 20 20 20 20 20 20 69 66 20 7b 24 72 65 73 65         if {$rese
15460 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  t} then {..     
15470 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
15480 20 20 23 20 4e 4f 54 45 3a 20 4e 6f 77 20 6d 61    # NOTE: Now ma
15490 6b 65 20 73 75 72 65 20 74 68 65 20 64 61 74 61  ke sure the data
154a0 62 61 73 65 20 61 6e 64 20 74 65 6d 70 6f 72 61  base and tempora
154b0 72 79 20 64 69 72 65 63 74 6f 72 69 65 73 20 61  ry directories a
154c0 72 65 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20  re..          # 
154d0 20 20 20 20 20 20 72 65 73 65 74 20 74 68 65 69        reset thei
154e0 72 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 73  r default values
154f0 2c 20 77 68 69 63 68 20 73 68 6f 75 6c 64 20 62  , which should b
15500 65 20 6e 75 6c 6c 20 66 6f 72 20 62 6f 74 68 2e  e null for both.
15510 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 20 20  ..          #   
15520 20 20 20 20 53 69 6e 63 65 20 74 68 65 20 73 71      Since the sq
15530 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 65 74 5f  lite3_win32_set_
15540 64 69 72 65 63 74 6f 72 79 20 66 75 6e 63 74 69  directory functi
15550 6f 6e 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2c  on is available,
15560 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 20 20  ..          #   
15570 20 20 20 20 75 73 65 20 69 74 2e 0d 0a 20 20 20      use it...   
15580 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
15590 20 20 20 20 66 6f 72 20 7b 73 65 74 20 69 6e 64      for {set ind
155a0 65 78 20 31 7d 20 7b 24 69 6e 64 65 78 20 3c 20  ex 1} {$index < 
155b0 33 7d 20 7b 69 6e 63 72 20 69 6e 64 65 78 7d 20  3} {incr index} 
155c0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  {..            i
155d0 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20  f {[catch {..   
155e0 20 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63             objec
155f0 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20  t invoke -flags 
15600 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20  +NonPublic \..  
15610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15620 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
15630 74 65 2e 55 6e 73 61 66 65 4e 61 74 69 76 65 4d  te.UnsafeNativeM
15640 65 74 68 6f 64 73 20 5c 0d 0a 20 20 20 20 20 20  ethods \..      
15650 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
15660 74 65 33 5f 77 69 6e 33 32 5f 73 65 74 5f 64 69  te3_win32_set_di
15670 72 65 63 74 6f 72 79 20 24 69 6e 64 65 78 20 6e  rectory $index n
15680 75 6c 6c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ull..           
15690 20 7d 20 72 65 73 75 6c 74 5d 20 3d 3d 20 30 7d   } result] == 0}
156a0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
156b0 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
156c0 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
156d0 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
156e0 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 61 6c         "---- cal
156f0 6c 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f  l sqlite3_win32_
15700 73 65 74 5f 64 69 72 65 63 74 6f 72 79 28 22 20  set_directory(" 
15710 24 69 6e 64 65 78 20 5c 0d 0a 20 20 20 20 20 20  $index \..      
15720 20 20 20 20 20 20 20 20 20 20 20 20 22 2c 20 6e              ", n
15730 75 6c 6c 29 2e 2e 2e 20 6f 6b 3a 20 22 20 24 72  ull)... ok: " $r
15740 65 73 75 6c 74 20 5c 6e 5d 0d 0a 20 20 20 20 20  esult \n]..     
15750 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d         } else {.
15760 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74  .              t
15770 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61  puts $channel [a
15780 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
15790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
157a0 2d 2d 2d 2d 20 63 61 6c 6c 20 73 71 6c 69 74 65  ---- call sqlite
157b0 33 5f 77 69 6e 33 32 5f 73 65 74 5f 64 69 72 65  3_win32_set_dire
157c0 63 74 6f 72 79 28 22 20 24 69 6e 64 65 78 20 5c  ctory(" $index \
157d0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
157e0 20 20 20 20 22 2c 20 6e 75 6c 6c 29 2e 2e 2e 20      ", null)... 
157f0 65 72 72 6f 72 3a 20 22 20 5c 6e 5c 74 20 24 72  error: " \n\t $r
15800 65 73 75 6c 74 20 5c 6e 5d 0d 0a 20 20 20 20 20  esult \n]..     
15810 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
15820 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d      }..        }
15830 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b  ..      } else {
15840 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20  ..        tputs 
15850 24 63 68 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d 0a 0d  $channel no\n...
15860 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
15870 20 20 20 20 23 20 4e 4f 54 45 3a 20 44 6f 65 73      # NOTE: Does
15880 20 6f 75 72 20 63 61 6c 6c 65 72 20 77 61 6e 74   our caller want
15890 20 74 6f 20 72 65 73 65 74 20 74 68 65 20 64 69   to reset the di
158a0 72 65 63 74 6f 72 69 65 73 3f 20 20 54 68 69 73  rectories?  This
158b0 20 63 61 6e 20 6f 6e 6c 79 0d 0a 20 20 20 20 20   can only..     
158c0 20 20 20 23 20 20 20 20 20 20 20 62 65 20 70 65     #       be pe
158d0 72 66 6f 72 6d 65 64 20 69 66 20 53 51 4c 69 74  rformed if SQLit
158e0 65 20 69 73 20 6c 6f 61 64 65 64 20 61 6e 64 20  e is loaded and 
158f0 72 65 61 64 79 20 66 6f 72 20 75 73 65 20 62 79  ready for use by
15900 20 74 68 65 20 74 65 73 74 0d 0a 20 20 20 20 20   the test..     
15910 20 20 20 23 20 20 20 20 20 20 20 73 75 69 74 65     #       suite
15920 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
15930 20 20 20 20 20 20 69 66 20 7b 24 72 65 73 65 74        if {$reset
15940 20 26 26 20 5b 69 73 53 51 4c 69 74 65 52 65 61   && [isSQLiteRea
15950 64 79 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  dy]} then {..   
15960 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
15970 20 20 20 20 23 20 4e 4f 54 45 3a 20 4e 6f 77 20      # NOTE: Now 
15980 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20 64 61  make sure the da
15990 74 61 62 61 73 65 20 61 6e 64 20 74 65 6d 70 6f  tabase and tempo
159a0 72 61 72 79 20 64 69 72 65 63 74 6f 72 69 65 73  rary directories
159b0 20 61 72 65 0d 0a 20 20 20 20 20 20 20 20 20 20   are..          
159c0 23 20 20 20 20 20 20 20 72 65 73 65 74 20 74 68  #       reset th
159d0 65 69 72 20 64 65 66 61 75 6c 74 20 76 61 6c 75  eir default valu
159e0 65 73 2c 20 77 68 69 63 68 20 73 68 6f 75 6c 64  es, which should
159f0 20 62 65 20 6e 75 6c 6c 20 66 6f 72 20 62 6f 74   be null for bot
15a00 68 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20  h...          # 
15a10 20 20 20 20 20 20 53 69 6e 63 65 20 74 68 65 20        Since the 
15a20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 65  sqlite3_win32_se
15a30 74 5f 64 69 72 65 63 74 6f 72 79 20 66 75 6e 63  t_directory func
15a40 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 0d 0a 20  tion does not.. 
15a50 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20           #      
15a60 20 61 70 70 65 61 72 20 74 6f 20 62 65 20 61 76   appear to be av
15a70 61 69 6c 61 62 6c 65 2c 20 75 73 65 20 74 68 65  ailable, use the
15a80 20 61 73 73 6f 63 69 61 74 65 64 20 50 52 41 47   associated PRAG
15a90 4d 41 20 63 6f 6d 6d 61 6e 64 73 0d 0a 20 20 20  MA commands..   
15aa0 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 69         #       i
15ab0 6e 73 74 65 61 64 2e 0d 0a 20 20 20 20 20 20 20  nstead...       
15ac0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
15ad0 66 6f 72 65 61 63 68 20 64 69 72 65 63 74 6f 72  foreach director
15ae0 79 20 5b 6c 69 73 74 20 64 61 74 61 5f 73 74 6f  y [list data_sto
15af0 72 65 5f 64 69 72 65 63 74 6f 72 79 20 74 65 6d  re_directory tem
15b00 70 5f 73 74 6f 72 65 5f 64 69 72 65 63 74 6f 72  p_store_director
15b10 79 5d 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  y] {..          
15b20 20 20 73 65 74 20 73 71 6c 20 5b 61 70 70 65 6e    set sql [appen
15b30 64 41 72 67 73 20 22 50 52 41 47 4d 41 20 22 20  dArgs "PRAGMA " 
15b40 24 64 69 72 65 63 74 6f 72 79 20 22 20 3d 20 5c  $directory " = \
15b50 22 5c 22 3b 22 5d 0d 0a 0d 0a 20 20 20 20 20 20  "\";"]....      
15b60 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68        if {[catch
15b70 20 7b 65 78 65 63 75 74 65 53 71 6c 20 24 73 71   {executeSql $sq
15b80 6c 7d 20 72 65 73 75 6c 74 5d 20 3d 3d 20 30 7d  l} result] == 0}
15b90 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
15ba0 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
15bb0 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
15bc0 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
15bd0 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 65 78 65         "---- exe
15be0 63 75 74 65 20 50 52 41 47 4d 41 20 22 20 24 64  cute PRAGMA " $d
15bf0 69 72 65 63 74 6f 72 79 20 22 2e 2e 2e 20 6f 6b  irectory "... ok
15c00 3a 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20 20  : \"" \..       
15c10 20 20 20 20 20 20 20 20 20 20 20 24 72 65 73 75             $resu
15c20 6c 74 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20  lt \"\n]..      
15c30 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
15c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 70                tp
15c50 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70  uts $channel [ap
15c60 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
15c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d                "-
15c80 2d 2d 2d 20 65 78 65 63 75 74 65 20 50 52 41 47  --- execute PRAG
15c90 4d 41 20 22 20 24 64 69 72 65 63 74 6f 72 79 20  MA " $directory 
15ca0 22 2e 2e 2e 20 65 72 72 6f 72 3a 20 22 20 5c 0d  "... error: " \.
15cb0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
15cc0 20 20 20 5c 6e 5c 74 20 24 72 65 73 75 6c 74 20     \n\t $result 
15cd0 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20  \n]..           
15ce0 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d   }..          }.
15cf0 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  .        }..    
15d00 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a    }....      #..
15d10 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 46 69        # NOTE: Fi
15d20 6e 61 6c 6c 79 2c 20 73 68 6f 77 20 74 68 65 20  nally, show the 
15d30 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20 6f 66  current value of
15d40 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61 6e   the database an
15d50 64 20 74 65 6d 70 6f 72 61 72 79 0d 0a 20 20 20  d temporary..   
15d60 20 20 20 23 20 20 20 20 20 20 20 64 69 72 65 63     #       direc
15d70 74 6f 72 69 65 73 2e 20 20 54 68 69 73 20 63 61  tories.  This ca
15d80 6e 20 6f 6e 6c 79 20 62 65 20 70 65 72 66 6f 72  n only be perfor
15d90 6d 65 64 20 69 66 20 53 51 4c 69 74 65 20 69 73  med if SQLite is
15da0 20 6c 6f 61 64 65 64 0d 0a 20 20 20 20 20 20 23   loaded..      #
15db0 20 20 20 20 20 20 20 61 6e 64 20 72 65 61 64 79         and ready
15dc0 20 66 6f 72 20 75 73 65 20 62 79 20 74 68 65 20   for use by the 
15dd0 74 65 73 74 20 73 75 69 74 65 2e 0d 0a 20 20 20  test suite...   
15de0 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
15df0 5b 69 73 53 51 4c 69 74 65 52 65 61 64 79 5d 7d  [isSQLiteReady]}
15e00 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
15e10 20 66 6f 72 65 61 63 68 20 64 69 72 65 63 74 6f   foreach directo
15e20 72 79 20 5b 6c 69 73 74 20 64 61 74 61 5f 73 74  ry [list data_st
15e30 6f 72 65 5f 64 69 72 65 63 74 6f 72 79 20 74 65  ore_directory te
15e40 6d 70 5f 73 74 6f 72 65 5f 64 69 72 65 63 74 6f  mp_store_directo
15e50 72 79 5d 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  ry] {..         
15e60 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
15e70 5b 61 70 70 65 6e 64 41 72 67 73 20 22 2d 2d 2d  [appendArgs "---
15e80 2d 20 63 68 65 63 6b 69 6e 67 20 22 20 24 64 69  - checking " $di
15e90 72 65 63 74 6f 72 79 20 22 2e 2e 2e 20 22 5d 0d  rectory "... "].
15ea0 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74  ...          set
15eb0 20 73 71 6c 20 5b 61 70 70 65 6e 64 41 72 67 73   sql [appendArgs
15ec0 20 22 50 52 41 47 4d 41 20 22 20 24 64 69 72 65   "PRAGMA " $dire
15ed0 63 74 6f 72 79 20 5c 3b 5d 0d 0a 0d 0a 20 20 20  ctory \;]....   
15ee0 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63         if {[catc
15ef0 68 20 7b 65 78 65 63 75 74 65 53 71 6c 20 24 73  h {executeSql $s
15f00 71 6c 20 73 63 61 6c 61 72 7d 20 72 65 73 75 6c  ql scalar} resul
15f10 74 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d  t] == 0} then {.
15f20 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75  .            tpu
15f30 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70  ts $channel [app
15f40 65 6e 64 41 72 67 73 20 22 6f 6b 3a 20 5c 22 22  endArgs "ok: \""
15f50 20 24 72 65 73 75 6c 74 20 5c 22 5c 6e 5d 0d 0a   $result \"\n]..
15f60 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65            } else
15f70 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
15f80 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b  tputs $channel [
15f90 61 70 70 65 6e 64 41 72 67 73 20 22 65 72 72 6f  appendArgs "erro
15fa0 72 3a 20 22 20 5c 6e 5c 74 20 24 72 65 73 75 6c  r: " \n\t $resul
15fb0 74 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20  t \n]..         
15fc0 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20   }..        }.. 
15fd0 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c       }..    }...
15fe0 0d 0a 20 20 20 20 70 72 6f 63 20 6c 6f 61 64 53  ..    proc loadS
15ff0 51 4c 69 74 65 54 65 73 74 53 65 74 74 69 6e 67  QLiteTestSetting
16000 73 20 7b 20 63 68 61 6e 6e 65 6c 20 7b 73 75 66  s { channel {suf
16010 66 69 78 20 22 22 7d 20 7b 71 75 69 65 74 20 66  fix ""} {quiet f
16020 61 6c 73 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20  alse} } {..     
16030 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
16040 3a 20 53 6b 69 70 20 6c 6f 61 64 69 6e 67 20 74  : Skip loading t
16050 68 65 20 73 65 74 74 69 6e 67 73 20 69 66 20 74  he settings if t
16060 68 65 69 72 20 75 73 61 67 65 20 68 61 73 20 62  heir usage has b
16070 65 65 6e 20 64 69 73 61 62 6c 65 64 2e 0d 0a 20  een disabled... 
16080 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66       #..      if
16090 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20   {![info exists 
160a0 3a 3a 6e 6f 28 73 71 6c 69 74 65 54 65 73 74 53  ::no(sqliteTestS
160b0 65 74 74 69 6e 67 73 29 5d 7d 20 74 68 65 6e 20  ettings)]} then 
160c0 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
160d0 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4c 6f        # NOTE: Lo
160e0 61 64 20 63 75 73 74 6f 6d 20 70 65 72 2d 75 73  ad custom per-us
160f0 65 72 20 61 6e 64 2f 6f 72 20 70 65 72 2d 68 6f  er and/or per-ho
16100 73 74 20 74 65 73 74 20 73 65 74 74 69 6e 67 73  st test settings
16110 20 6e 6f 77 2e 0d 0a 20 20 20 20 20 20 20 20 23   now...        #
16120 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 69  ..        if {[i
16130 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 74 63 6c  nfo exists ::tcl
16140 5f 70 6c 61 74 66 6f 72 6d 28 75 73 65 72 29 5d  _platform(user)]
16150 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
16160 20 20 20 20 73 65 74 20 75 73 65 72 53 65 74 74      set userSett
16170 69 6e 67 73 46 69 6c 65 4e 61 6d 65 20 5b 66 69  ingsFileName [fi
16180 6c 65 20 6a 6f 69 6e 20 5b 67 65 74 43 6f 6d 6d  le join [getComm
16190 6f 6e 44 69 72 65 63 74 6f 72 79 5d 20 5c 0d 0a  onDirectory] \..
161a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 61                [a
161b0 70 70 65 6e 64 41 72 67 73 20 73 65 74 74 69 6e  ppendArgs settin
161c0 67 73 20 24 73 75 66 66 69 78 20 2e 20 24 3a 3a  gs $suffix . $::
161d0 74 63 6c 5f 70 6c 61 74 66 6f 72 6d 28 75 73 65  tcl_platform(use
161e0 72 29 20 2e 65 61 67 6c 65 5d 5d 0d 0a 0d 0a 20  r) .eagle]].... 
161f0 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 66 69           if {[fi
16200 6c 65 20 65 78 69 73 74 73 20 24 75 73 65 72 53  le exists $userS
16210 65 74 74 69 6e 67 73 46 69 6c 65 4e 61 6d 65 5d  ettingsFileName]
16220 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
16230 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65        if {!$quie
16240 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  t} then {..     
16250 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
16260 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
16270 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
16280 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 6c           "---- l
16290 6f 61 64 69 6e 67 20 70 65 72 2d 75 73 65 72 20  oading per-user 
162a0 74 65 73 74 20 73 65 74 74 69 6e 67 73 20 66 69  test settings fi
162b0 6c 65 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20  le \"" \..      
162c0 20 20 20 20 20 20 20 20 20 20 20 20 24 75 73 65              $use
162d0 72 53 65 74 74 69 6e 67 73 46 69 6c 65 4e 61 6d  rSettingsFileNam
162e0 65 20 5c 22 2e 2e 2e 5c 6e 5d 0d 0a 20 20 20 20  e \"...\n]..    
162f0 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
16300 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61           if {[ca
16310 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  tch {..         
16320 20 20 20 20 20 75 70 6c 65 76 65 6c 20 31 20 5b       uplevel 1 [
16330 6c 69 73 74 20 73 6f 75 72 63 65 20 24 75 73 65  list source $use
16340 72 53 65 74 74 69 6e 67 73 46 69 6c 65 4e 61 6d  rSettingsFileNam
16350 65 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  e]..            
16360 7d 20 65 72 72 6f 72 5d 7d 20 74 68 65 6e 20 7b  } error]} then {
16370 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
16380 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65  if {!$quiet} the
16390 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
163a0 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
163b0 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
163c0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
163d0 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52         "==== WAR
163e0 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20 74 6f 20  NING: failed to 
163f0 6c 6f 61 64 20 70 65 72 2d 75 73 65 72 20 73 65  load per-user se
16400 74 74 69 6e 67 73 20 66 69 6c 65 20 5c 22 22 20  ttings file \"" 
16410 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
16420 20 20 20 20 20 20 20 24 75 73 65 72 53 65 74 74         $userSett
16430 69 6e 67 73 46 69 6c 65 4e 61 6d 65 20 22 5c 22  ingsFileName "\"
16440 2c 20 65 72 72 6f 72 3a 20 22 20 5c 6e 5c 74 20  , error: " \n\t 
16450 24 65 72 72 6f 72 20 5c 6e 5d 0d 0a 20 20 20 20  $error \n]..    
16460 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
16470 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
16480 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
16490 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b              if {
164a0 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d  !$quiet} then {.
164b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74  .              t
164c0 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61  puts $channel [a
164d0 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
164e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
164f0 2d 2d 2d 2d 20 73 6b 69 70 70 65 64 20 6c 6f 61  ---- skipped loa
16500 64 69 6e 67 20 70 65 72 2d 75 73 65 72 20 74 65  ding per-user te
16510 73 74 20 73 65 74 74 69 6e 67 73 20 66 69 6c 65  st settings file
16520 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20 20 20   \"" \..        
16530 20 20 20 20 20 20 20 20 20 20 24 75 73 65 72 53            $userS
16540 65 74 74 69 6e 67 73 46 69 6c 65 4e 61 6d 65 20  ettingsFileName 
16550 22 5c 22 2c 20 69 74 20 64 6f 65 73 20 6e 6f 74  "\", it does not
16560 20 65 78 69 73 74 5c 6e 22 5d 0d 0a 20 20 20 20   exist\n"]..    
16570 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
16580 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
16590 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 23 23  }....        ###
165a0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
165b0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
165c0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
165d0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
165e0 23 23 23 23 0d 0a 0d 0a 20 20 20 20 20 20 20 20  ####....        
165f0 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73  if {[info exists
16600 20 3a 3a 74 63 6c 5f 70 6c 61 74 66 6f 72 6d 28   ::tcl_platform(
16610 68 6f 73 74 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a  host)]} then {..
16620 20 20 20 20 20 20 20 20 20 20 73 65 74 20 68 6f            set ho
16630 73 74 53 65 74 74 69 6e 67 73 46 69 6c 65 4e 61  stSettingsFileNa
16640 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5b 67  me [file join [g
16650 65 74 43 6f 6d 6d 6f 6e 44 69 72 65 63 74 6f 72  etCommonDirector
16660 79 5d 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  y] \..          
16670 20 20 20 20 5b 61 70 70 65 6e 64 41 72 67 73 20      [appendArgs 
16680 73 65 74 74 69 6e 67 73 20 24 73 75 66 66 69 78  settings $suffix
16690 20 2e 20 24 3a 3a 74 63 6c 5f 70 6c 61 74 66 6f   . $::tcl_platfo
166a0 72 6d 28 68 6f 73 74 29 20 2e 65 61 67 6c 65 5d  rm(host) .eagle]
166b0 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 69  ]....          i
166c0 66 20 7b 5b 66 69 6c 65 20 65 78 69 73 74 73 20  f {[file exists 
166d0 24 68 6f 73 74 53 65 74 74 69 6e 67 73 46 69 6c  $hostSettingsFil
166e0 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a  eName]} then {..
166f0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b              if {
16700 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d  !$quiet} then {.
16710 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74  .              t
16720 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61  puts $channel [a
16730 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
16740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
16750 2d 2d 2d 2d 20 6c 6f 61 64 69 6e 67 20 70 65 72  ---- loading per
16760 2d 68 6f 73 74 20 74 65 73 74 20 73 65 74 74 69  -host test setti
16770 6e 67 73 20 66 69 6c 65 20 5c 22 22 20 5c 0d 0a  ngs file \"" \..
16780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16790 20 20 24 68 6f 73 74 53 65 74 74 69 6e 67 73 46    $hostSettingsF
167a0 69 6c 65 4e 61 6d 65 20 5c 22 2e 2e 2e 5c 6e 5d  ileName \"...\n]
167b0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
167c0 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ...            i
167d0 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20  f {[catch {..   
167e0 20 20 20 20 20 20 20 20 20 20 20 75 70 6c 65 76             uplev
167f0 65 6c 20 31 20 5b 6c 69 73 74 20 73 6f 75 72 63  el 1 [list sourc
16800 65 20 24 68 6f 73 74 53 65 74 74 69 6e 67 73 46  e $hostSettingsF
16810 69 6c 65 4e 61 6d 65 5d 0d 0a 20 20 20 20 20 20  ileName]..      
16820 20 20 20 20 20 20 7d 20 65 72 72 6f 72 5d 7d 20        } error]} 
16830 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
16840 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65        if {!$quie
16850 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  t} then {..     
16860 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
16870 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e   $channel [appen
16880 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
16890 20 20 20 20 20 20 20 20 20 20 20 20 20 22 3d 3d               "==
168a0 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c  == WARNING: fail
168b0 65 64 20 74 6f 20 6c 6f 61 64 20 70 65 72 2d 68  ed to load per-h
168c0 6f 73 74 20 73 65 74 74 69 6e 67 73 20 66 69 6c  ost settings fil
168d0 65 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20 20  e \"" \..       
168e0 20 20 20 20 20 20 20 20 20 20 20 20 20 24 68 6f               $ho
168f0 73 74 53 65 74 74 69 6e 67 73 46 69 6c 65 4e 61  stSettingsFileNa
16900 6d 65 20 22 5c 22 2c 20 65 72 72 6f 72 3a 20 22  me "\", error: "
16910 20 5c 6e 5c 74 20 24 65 72 72 6f 72 20 5c 6e 5d   \n\t $error \n]
16920 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
16930 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  }..            }
16940 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c  ..          } el
16950 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  se {..          
16960 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74    if {!$quiet} t
16970 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
16980 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
16990 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
169a0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
169b0 20 20 20 20 20 22 2d 2d 2d 2d 20 73 6b 69 70 70       "---- skipp
169c0 65 64 20 6c 6f 61 64 69 6e 67 20 70 65 72 2d 68  ed loading per-h
169d0 6f 73 74 20 74 65 73 74 20 73 65 74 74 69 6e 67  ost test setting
169e0 73 20 66 69 6c 65 20 5c 22 22 20 5c 0d 0a 20 20  s file \"" \..  
169f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16a00 24 68 6f 73 74 53 65 74 74 69 6e 67 73 46 69 6c  $hostSettingsFil
16a10 65 4e 61 6d 65 20 22 5c 22 2c 20 69 74 20 64 6f  eName "\", it do
16a20 65 73 20 6e 6f 74 20 65 78 69 73 74 5c 6e 22 5d  es not exist\n"]
16a30 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
16a40 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  .          }..  
16a50 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d        }..      }
16a60 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
16a70 70 72 6f 63 20 72 75 6e 53 51 4c 69 74 65 54 65  proc runSQLiteTe
16a80 73 74 50 72 6f 6c 6f 67 75 65 20 7b 7d 20 7b 0d  stPrologue {} {.
16a90 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
16aa0 23 20 4e 4f 54 45 3a 20 53 6b 69 70 20 72 75 6e  # NOTE: Skip run
16ab0 6e 69 6e 67 20 6f 75 72 20 63 75 73 74 6f 6d 20  ning our custom 
16ac0 70 72 6f 6c 6f 67 75 65 20 69 66 20 74 68 65 20  prologue if the 
16ad0 6d 61 69 6e 20 6f 6e 65 20 68 61 73 20 62 65 65  main one has bee
16ae0 6e 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  n..      #      
16af0 20 73 6b 69 70 70 65 64 2e 0d 0a 20 20 20 20 20   skipped...     
16b00 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 21 5b   #..      if {![
16b10 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f  info exists ::no
16b20 28 70 72 6f 6c 6f 67 75 65 2e 65 61 67 6c 65 29  (prologue.eagle)
16b30 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
16b40 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
16b50 4e 4f 54 45 3a 20 4c 6f 61 64 20 74 68 65 20 22  NOTE: Load the "
16b60 62 65 66 6f 72 65 2d 63 6f 6e 73 74 72 61 69 6e  before-constrain
16b70 74 73 22 20 63 75 73 74 6f 6d 20 70 65 72 2d 75  ts" custom per-u
16b80 73 65 72 20 61 6e 64 2f 6f 72 20 70 65 72 2d 68  ser and/or per-h
16b90 6f 73 74 0d 0a 20 20 20 20 20 20 20 20 23 20 20  ost..        #  
16ba0 20 20 20 20 20 74 65 73 74 20 73 65 74 74 69 6e       test settin
16bb0 67 73 20 6e 6f 77 2e 0d 0a 20 20 20 20 20 20 20  gs now...       
16bc0 20 23 0d 0a 20 20 20 20 20 20 20 20 75 70 6c 65   #..        uple
16bd0 76 65 6c 20 31 20 5b 6c 69 73 74 20 6c 6f 61 64  vel 1 [list load
16be0 53 51 4c 69 74 65 54 65 73 74 53 65 74 74 69 6e  SQLiteTestSettin
16bf0 67 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  gs $::test_chann
16c00 65 6c 20 2e 62 65 66 6f 72 65 5d 0d 0a 0d 0a 20  el .before].... 
16c10 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
16c20 20 20 23 20 4e 4f 54 45 3a 20 44 65 74 65 72 6d    # NOTE: Determ
16c30 69 6e 65 20 74 68 65 20 6e 61 6d 65 73 20 6f 66  ine the names of
16c40 20 74 68 65 20 6e 61 74 69 76 65 20 70 6c 61 74   the native plat
16c50 66 6f 72 6d 20 61 6e 64 20 61 72 63 68 69 74 65  form and archite
16c60 63 74 75 72 65 2e 0d 0a 20 20 20 20 20 20 20 20  cture...        
16c70 23 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 70  #..        set p
16c80 6c 61 74 66 6f 72 6d 20 5b 67 65 74 42 75 69 6c  latform [getBuil
16c90 64 50 6c 61 74 66 6f 72 6d 20 74 72 75 65 5d 0d  dPlatform true].
16ca0 0a 20 20 20 20 20 20 20 20 73 65 74 20 61 72 63  .        set arc
16cb0 68 69 74 65 63 74 75 72 65 20 5b 61 72 63 68 69  hitecture [archi
16cc0 74 65 63 74 75 72 65 46 6f 72 50 6c 61 74 66 6f  tectureForPlatfo
16cd0 72 6d 20 24 70 6c 61 74 66 6f 72 6d 5d 0d 0a 0d  rm $platform]...
16ce0 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
16cf0 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 68 6f 77      # NOTE: Show
16d00 20 74 68 65 20 70 6c 61 74 66 6f 72 6d 20 61 6e   the platform an
16d10 64 20 61 72 63 68 69 74 65 63 74 75 72 65 20 75  d architecture u
16d20 73 65 64 20 74 6f 20 68 65 6c 70 20 6c 6f 63 61  sed to help loca
16d30 74 65 20 74 68 65 0d 0a 20 20 20 20 20 20 20 20  te the..        
16d40 23 20 20 20 20 20 20 20 6e 61 74 69 76 65 20 62  #       native b
16d50 75 69 6c 64 20 66 69 6c 65 73 2e 0d 0a 20 20 20  uild files...   
16d60 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
16d70 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
16d80 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
16d90 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
16da0 20 22 2d 2d 2d 2d 20 70 6c 61 74 66 6f 72 6d 20   "---- platform 
16db0 66 6f 72 20 6c 6f 63 61 74 69 6e 67 20 6e 61 74  for locating nat
16dc0 69 76 65 20 62 75 69 6c 64 20 66 69 6c 65 73 20  ive build files 
16dd0 69 73 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20  is \"" \..      
16de0 20 20 20 20 20 20 24 70 6c 61 74 66 6f 72 6d 20        $platform 
16df0 5c 22 5c 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  \"\n]....       
16e00 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
16e10 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
16e20 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
16e30 20 20 22 2d 2d 2d 2d 20 61 72 63 68 69 74 65 63    "---- architec
16e40 74 75 72 65 20 66 6f 72 20 6c 6f 63 61 74 69 6e  ture for locatin
16e50 67 20 6e 61 74 69 76 65 20 62 75 69 6c 64 20 66  g native build f
16e60 69 6c 65 73 20 69 73 20 5c 22 22 20 5c 0d 0a 20  iles is \"" \.. 
16e70 20 20 20 20 20 20 20 20 20 20 20 24 61 72 63 68             $arch
16e80 69 74 65 63 74 75 72 65 20 5c 22 5c 6e 5d 0d 0a  itecture \"\n]..
16e90 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
16ea0 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 42 75 69       # NOTE: Bui
16eb0 6c 64 20 61 20 6c 69 73 74 20 6f 66 20 63 6f 6e  ld a list of con
16ec0 66 69 67 75 72 61 74 69 6f 6e 20 66 69 6c 65 73  figuration files
16ed0 20 74 68 61 74 20 77 65 20 68 61 6e 64 6c 65 2e   that we handle.
16ee0 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
16ef0 20 20 20 20 20 73 65 74 20 63 6f 6e 66 69 67 46       set configF
16f00 69 6c 65 4e 61 6d 65 73 20 5b 6c 69 73 74 20 5c  ileNames [list \
16f10 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 53 79  ..            Sy
16f20 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
16f30 2e 64 6c 6c 2e 63 6f 6e 66 69 67 5d 0d 0a 0d 0a  .dll.config]....
16f40 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
16f50 20 20 20 23 20 4e 4f 54 45 3a 20 42 75 69 6c 64     # NOTE: Build
16f60 20 61 20 6c 69 73 74 20 6f 66 20 61 75 78 69 6c   a list of auxil
16f70 69 61 72 79 20 4d 61 6e 61 67 65 64 20 44 65 62  iary Managed Deb
16f80 75 67 67 69 6e 67 20 41 73 73 69 73 74 61 6e 74  ugging Assistant
16f90 73 20 28 4d 44 41 29 0d 0a 20 20 20 20 20 20 20  s (MDA)..       
16fa0 20 23 20 20 20 20 20 20 20 63 6f 6e 66 69 67 75   #       configu
16fb0 72 61 74 69 6f 6e 20 66 69 6c 65 73 20 74 68 61  ration files tha
16fc0 74 20 77 65 20 68 61 6e 64 6c 65 2e 0d 0a 20 20  t we handle...  
16fd0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
16fe0 20 73 65 74 20 6d 64 61 43 6f 6e 66 69 67 46 69   set mdaConfigFi
16ff0 6c 65 4e 61 6d 65 73 20 5b 6c 69 73 74 20 5c 0d  leNames [list \.
17000 0a 20 20 20 20 20 20 20 20 20 20 20 20 45 61 67  .            Eag
17010 6c 65 53 68 65 6c 6c 33 32 2e 65 78 65 2e 6d 64  leShell32.exe.md
17020 61 2e 63 6f 6e 66 69 67 20 49 6e 73 74 61 6c 6c  a.config Install
17030 65 72 2e 65 78 65 2e 6d 64 61 2e 63 6f 6e 66 69  er.exe.mda.confi
17040 67 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  g \..           
17050 20 74 65 73 74 2e 65 78 65 2e 6d 64 61 2e 63 6f   test.exe.mda.co
17060 6e 66 69 67 20 74 65 73 74 6c 69 6e 71 2e 65 78  nfig testlinq.ex
17070 65 2e 6d 64 61 2e 63 6f 6e 66 69 67 20 5c 0d 0a  e.mda.config \..
17080 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74              test
17090 65 66 36 2e 65 78 65 2e 6d 64 61 2e 63 6f 6e 66  ef6.exe.mda.conf
170a0 69 67 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23  ig]....        #
170b0 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
170c0 3a 20 42 75 69 6c 64 20 74 68 65 20 6c 69 73 74  : Build the list
170d0 20 6f 66 20 65 78 74 65 72 6e 61 6c 20 66 69 6c   of external fil
170e0 65 73 20 74 68 61 74 20 77 65 20 68 61 6e 64 6c  es that we handl
170f0 65 2e 20 20 53 6f 6d 65 20 6f 66 0d 0a 20 20 20  e.  Some of..   
17100 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68 65       #       the
17110 73 65 20 66 69 6c 65 73 20 6d 61 79 20 62 65 20  se files may be 
17120 6e 61 74 69 76 65 20 61 6e 64 2f 6f 72 20 6d 61  native and/or ma
17130 6e 61 67 65 64 20 61 73 73 65 6d 62 6c 69 65 73  naged assemblies
17140 20 74 68 61 74 20 61 72 65 0d 0a 20 20 20 20 20   that are..     
17150 20 20 20 23 20 20 20 20 20 20 20 72 65 71 75 69     #       requi
17160 72 65 64 20 74 6f 20 70 65 72 66 6f 72 6d 20 76  red to perform v
17170 61 72 69 6f 75 73 20 74 65 73 74 73 2e 0d 0a 20  arious tests... 
17180 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
17190 20 20 73 65 74 20 65 78 74 65 72 6e 61 6c 46 69    set externalFi
171a0 6c 65 4e 61 6d 65 73 20 5b 6c 69 73 74 20 5c 0d  leNames [list \.
171b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 66 69  .            [fi
171c0 6c 65 20 6a 6f 69 6e 20 45 6e 74 69 74 79 46 72  le join EntityFr
171d0 61 6d 65 77 6f 72 6b 20 6c 69 62 20 5b 73 74 72  amework lib [str
171e0 69 6e 67 20 6d 61 70 20 5b 6c 69 73 74 20 46 78  ing map [list Fx
171f0 20 22 22 5d 20 5b 73 74 72 69 6e 67 20 5c 0d 0a   ""] [string \..
17200 20 20 20 20 20 20 20 20 20 20 20 20 6d 61 70 20              map 
17210 5b 6c 69 73 74 20 6e 65 74 46 78 34 35 31 20 6e  [list netFx451 n
17220 65 74 46 78 34 35 5d 20 5b 67 65 74 42 75 69 6c  etFx45] [getBuil
17230 64 4e 65 74 46 78 5d 5d 5d 20 45 6e 74 69 74 79  dNetFx]]] Entity
17240 46 72 61 6d 65 77 6f 72 6b 2e 64 6c 6c 5d 5d 0d  Framework.dll]].
17250 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
17260 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 42 75        # NOTE: Bu
17270 69 6c 64 20 74 68 65 20 6c 69 73 74 20 6f 66 20  ild the list of 
17280 6e 61 74 69 76 65 20 61 73 73 65 6d 62 6c 79 20  native assembly 
17290 66 69 6c 65 73 20 74 68 61 74 20 77 65 20 68 61  files that we ha
172a0 6e 64 6c 65 2e 20 20 54 68 65 0d 0a 20 20 20 20  ndle.  The..    
172b0 20 20 20 20 23 20 20 20 20 20 20 20 72 65 61 73      #       reas
172c0 6f 6e 20 74 68 65 20 22 53 79 73 74 65 6d 2e 44  on the "System.D
172d0 61 74 61 2e 53 51 4c 69 74 65 2e 64 6c 6c 22 20  ata.SQLite.dll" 
172e0 66 69 6c 65 20 69 73 20 69 6e 63 6c 75 64 65 64  file is included
172f0 20 68 65 72 65 20 69 73 0d 0a 20 20 20 20 20 20   here is..      
17300 20 20 23 20 20 20 20 20 20 20 62 65 63 61 75 73    #       becaus
17310 65 20 69 74 20 63 6f 75 6c 64 20 62 65 20 74 68  e it could be th
17320 65 20 6d 69 78 65 64 2d 6d 6f 64 65 20 61 73 73  e mixed-mode ass
17330 65 6d 62 6c 79 2e 0d 0a 20 20 20 20 20 20 20 20  embly...        
17340 23 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 6e  #..        set n
17350 61 74 69 76 65 46 69 6c 65 4e 61 6d 65 73 20 5b  ativeFileNames [
17360 6c 69 73 74 20 5c 0d 0a 20 20 20 20 20 20 20 20  list \..        
17370 20 20 20 20 73 71 6c 69 74 65 33 2e 64 6c 6c 20      sqlite3.dll 
17380 53 51 4c 69 74 65 2e 49 6e 74 65 72 6f 70 2e 64  SQLite.Interop.d
17390 6c 6c 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53  ll System.Data.S
173a0 51 4c 69 74 65 2e 64 6c 6c 5d 0d 0a 0d 0a 20 20  QLite.dll]....  
173b0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
173c0 20 23 20 4e 4f 54 45 3a 20 42 75 69 6c 64 20 74   # NOTE: Build t
173d0 68 65 20 6c 69 73 74 20 6f 66 20 6d 61 6e 61 67  he list of manag
173e0 65 64 20 61 73 73 65 6d 62 6c 79 20 66 69 6c 65  ed assembly file
173f0 73 20 74 68 61 74 20 77 65 20 68 61 6e 64 6c 65  s that we handle
17400 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
17410 20 20 20 20 20 20 73 65 74 20 6d 61 6e 61 67 65        set manage
17420 64 46 69 6c 65 4e 61 6d 65 73 20 5b 6c 69 73 74  dFileNames [list
17430 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
17440 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
17450 74 65 2e 64 6c 6c 20 53 79 73 74 65 6d 2e 44 61  te.dll System.Da
17460 74 61 2e 53 51 4c 69 74 65 2e 4c 69 6e 71 2e 64  ta.SQLite.Linq.d
17470 6c 6c 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  ll \..          
17480 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51    System.Data.SQ
17490 4c 69 74 65 2e 45 46 36 2e 64 6c 6c 5d 0d 0a 0d  Lite.EF6.dll]...
174a0 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
174b0 20 20 20 20 23 20 4e 4f 54 45 3a 20 52 65 6d 6f      # NOTE: Remo
174c0 76 65 20 61 6e 79 20 74 65 73 74 20 63 6f 6e 73  ve any test cons
174d0 74 72 61 69 6e 74 73 20 74 68 61 74 20 72 65 66  traints that ref
174e0 65 72 20 74 6f 20 74 68 65 20 6e 61 74 69 76 65  er to the native
174f0 20 61 6e 64 2f 6f 72 0d 0a 20 20 20 20 20 20 20   and/or..       
17500 20 23 20 20 20 20 20 20 20 6d 61 6e 61 67 65 64   #       managed
17510 20 61 73 73 65 6d 62 6c 79 20 66 69 6c 65 73 20   assembly files 
17520 74 68 61 74 20 77 65 20 68 61 6e 64 6c 65 20 75  that we handle u
17530 6e 6c 65 73 73 20 66 6f 72 62 69 64 64 65 6e 20  nless forbidden 
17540 66 72 6f 6d 0d 0a 20 20 20 20 20 20 20 20 23 20  from..        # 
17550 20 20 20 20 20 20 64 6f 69 6e 67 20 73 6f 2e 0d        doing so..
17560 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
17570 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65      if {![info e
17580 78 69 73 74 73 20 3a 3a 6e 6f 28 73 71 6c 69 74  xists ::no(sqlit
17590 65 52 65 6d 6f 76 65 43 6f 6e 73 74 72 61 69 6e  eRemoveConstrain
175a0 74 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ts)]} then {..  
175b0 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20          foreach 
175c0 66 69 6c 65 4e 61 6d 65 20 24 63 6f 6e 66 69 67  fileName $config
175d0 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20  FileNames {..   
175e0 20 20 20 20 20 20 20 20 20 72 65 6d 6f 76 65 43           removeC
175f0 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e  onstraint [appen
17600 64 41 72 67 73 20 66 69 6c 65 5f 20 24 66 69 6c  dArgs file_ $fil
17610 65 4e 61 6d 65 5d 0d 0a 20 20 20 20 20 20 20 20  eName]..        
17620 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20    }....         
17630 20 66 6f 72 65 61 63 68 20 66 69 6c 65 4e 61 6d   foreach fileNam
17640 65 20 24 6d 64 61 43 6f 6e 66 69 67 46 69 6c 65  e $mdaConfigFile
17650 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20 20  Names {..       
17660 20 20 20 20 20 72 65 6d 6f 76 65 43 6f 6e 73 74       removeConst
17670 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67  raint [appendArg
17680 73 20 66 69 6c 65 5f 20 24 66 69 6c 65 4e 61 6d  s file_ $fileNam
17690 65 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d  e]..          }.
176a0 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72  ...          for
176b0 65 61 63 68 20 66 69 6c 65 4e 61 6d 65 20 24 65  each fileName $e
176c0 78 74 65 72 6e 61 6c 46 69 6c 65 4e 61 6d 65 73  xternalFileNames
176d0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
176e0 72 65 6d 6f 76 65 43 6f 6e 73 74 72 61 69 6e 74  removeConstraint
176f0 20 5b 61 70 70 65 6e 64 41 72 67 73 20 66 69 6c   [appendArgs fil
17700 65 5f 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 66  e_ [file tail $f
17710 69 6c 65 4e 61 6d 65 5d 5d 0d 0a 20 20 20 20 20  ileName]]..     
17720 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
17730 20 20 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65      foreach file
17740 4e 61 6d 65 20 24 6e 61 74 69 76 65 46 69 6c 65  Name $nativeFile
17750 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20 20  Names {..       
17760 20 20 20 20 20 72 65 6d 6f 76 65 43 6f 6e 73 74       removeConst
17770 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67  raint [appendArg
17780 73 20 66 69 6c 65 5f 20 24 66 69 6c 65 4e 61 6d  s file_ $fileNam
17790 65 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d  e]..          }.
177a0 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72  ...          for
177b0 65 61 63 68 20 66 69 6c 65 4e 61 6d 65 20 24 6d  each fileName $m
177c0 61 6e 61 67 65 64 46 69 6c 65 4e 61 6d 65 73 20  anagedFileNames 
177d0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  {..            r
177e0 65 6d 6f 76 65 43 6f 6e 73 74 72 61 69 6e 74 20  emoveConstraint 
177f0 5b 61 70 70 65 6e 64 41 72 67 73 20 66 69 6c 65  [appendArgs file
17800 5f 20 24 66 69 6c 65 4e 61 6d 65 5d 0d 0a 20 20  _ $fileName]..  
17810 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
17820 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
17830 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
17840 45 3a 20 53 6b 69 70 20 61 6c 6c 20 53 79 73 74  E: Skip all Syst
17850 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 20 72  em.Data.SQLite r
17860 65 6c 61 74 65 64 20 66 69 6c 65 20 68 61 6e 64  elated file hand
17870 6c 69 6e 67 20 28 64 65 6c 65 74 69 6e 67 2c 0d  ling (deleting,.
17880 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
17890 20 63 6f 70 79 69 6e 67 2c 20 61 6e 64 20 6c 6f   copying, and lo
178a0 61 64 69 6e 67 29 20 69 66 20 69 6e 73 74 72 75  ading) if instru
178b0 63 74 65 64 2e 0d 0a 20 20 20 20 20 20 20 20 23  cted...        #
178c0 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b  ..        if {![
178d0 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f  info exists ::no
178e0 28 73 71 6c 69 74 65 46 69 6c 65 73 29 5d 7d 20  (sqliteFiles)]} 
178f0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
17900 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23    #..          #
17910 20 4e 4f 54 45 3a 20 53 6b 69 70 20 74 72 79 69   NOTE: Skip tryi
17920 6e 67 20 74 6f 20 64 65 6c 65 74 65 20 61 6e 79  ng to delete any
17930 20 66 69 6c 65 73 20 69 66 20 69 6e 73 74 72 75   files if instru
17940 63 74 65 64 2e 0d 0a 20 20 20 20 20 20 20 20 20  cted...         
17950 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66   #..          if
17960 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20   {![info exists 
17970 3a 3a 6e 6f 28 64 65 6c 65 74 65 53 71 6c 69 74  ::no(deleteSqlit
17980 65 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e 20 7b  eFiles)]} then {
17990 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ..            if
179a0 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20   {![info exists 
179b0 3a 3a 6e 6f 28 64 65 6c 65 74 65 53 71 6c 69 74  ::no(deleteSqlit
179c0 65 43 6f 6e 66 69 67 46 69 6c 65 73 29 5d 7d 20  eConfigFiles)]} 
179d0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
179e0 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 66 69        foreach fi
179f0 6c 65 4e 61 6d 65 20 24 63 6f 6e 66 69 67 46 69  leName $configFi
17a00 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20  leNames {..     
17a10 20 20 20 20 20 20 20 20 20 20 20 74 72 79 44 65             tryDe
17a20 6c 65 74 65 42 69 6e 61 72 79 46 69 6c 65 20 24  leteBinaryFile $
17a30 66 69 6c 65 4e 61 6d 65 0d 0a 20 20 20 20 20 20  fileName..      
17a40 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
17a50 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
17a60 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e          if {![in
17a70 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 64  fo exists ::no(d
17a80 65 6c 65 74 65 53 71 6c 69 74 65 45 78 74 65 72  eleteSqliteExter
17a90 6e 61 6c 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e  nalFiles)]} then
17aa0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
17ab0 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65 4e 61    foreach fileNa
17ac0 6d 65 20 24 6d 64 61 43 6f 6e 66 69 67 46 69 6c  me $mdaConfigFil
17ad0 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20  eNames {..      
17ae0 20 20 20 20 20 20 20 20 20 20 74 72 79 44 65 6c            tryDel
17af0 65 74 65 42 75 69 6c 64 46 69 6c 65 20 24 66 69  eteBuildFile $fi
17b00 6c 65 4e 61 6d 65 0d 0a 20 20 20 20 20 20 20 20  leName..        
17b10 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
17b20 20 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68           foreach
17b30 20 66 69 6c 65 4e 61 6d 65 20 24 65 78 74 65 72   fileName $exter
17b40 6e 61 6c 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a  nalFileNames {..
17b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17b60 74 72 79 44 65 6c 65 74 65 42 69 6e 61 72 79 46  tryDeleteBinaryF
17b70 69 6c 65 20 24 66 69 6c 65 4e 61 6d 65 0d 0a 20  ile $fileName.. 
17b80 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a               }..
17b90 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d              }...
17ba0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20  .            if 
17bb0 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a  {![info exists :
17bc0 3a 6e 6f 28 64 65 6c 65 74 65 53 71 6c 69 74 65  :no(deleteSqlite
17bd0 4e 61 74 69 76 65 46 69 6c 65 73 29 5d 7d 20 74  NativeFiles)]} t
17be0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
17bf0 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20       if {![info 
17c00 65 78 69 73 74 73 20 3a 3a 6e 6f 28 64 65 6c 65  exists ::no(dele
17c10 74 65 53 71 6c 69 74 65 49 6d 70 6c 69 63 69 74  teSqliteImplicit
17c20 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d  Files)]} then {.
17c30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
17c40 20 66 6f 72 65 61 63 68 20 66 69 6c 65 4e 61 6d   foreach fileNam
17c50 65 20 24 6e 61 74 69 76 65 46 69 6c 65 4e 61 6d  e $nativeFileNam
17c60 65 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  es {..          
17c70 20 20 20 20 20 20 20 20 74 72 79 44 65 6c 65 74          tryDelet
17c80 65 41 73 73 65 6d 62 6c 79 20 24 66 69 6c 65 4e  eAssembly $fileN
17c90 61 6d 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ame..           
17ca0 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
17cb0 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
17cc0 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69           if {![i
17cd0 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28  nfo exists ::no(
17ce0 64 65 6c 65 74 65 53 71 6c 69 74 65 4e 6f 6e 49  deleteSqliteNonI
17cf0 6d 70 6c 69 63 69 74 46 69 6c 65 73 29 5d 7d 20  mplicitFiles)]} 
17d00 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
17d10 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e          if {![in
17d20 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 64  fo exists ::no(d
17d30 65 6c 65 74 65 53 71 6c 69 74 65 50 6c 61 74 66  eleteSqlitePlatf
17d40 6f 72 6d 46 69 6c 65 73 29 5d 20 26 26 20 5c 0d  ormFiles)] && \.
17d50 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
17d60 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e       [string len
17d70 67 74 68 20 24 70 6c 61 74 66 6f 72 6d 5d 20 3e  gth $platform] >
17d80 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
17d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f                fo
17da0 72 65 61 63 68 20 66 69 6c 65 4e 61 6d 65 20 24  reach fileName $
17db0 6e 61 74 69 76 65 46 69 6c 65 4e 61 6d 65 73 20  nativeFileNames 
17dc0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
17dd0 20 20 20 20 20 20 20 74 72 79 44 65 6c 65 74 65         tryDelete
17de0 41 73 73 65 6d 62 6c 79 20 24 66 69 6c 65 4e 61  Assembly $fileNa
17df0 6d 65 20 24 70 6c 61 74 66 6f 72 6d 0d 0a 20 20  me $platform..  
17e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17e10 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  }..             
17e20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
17e30 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e          if {![in
17e40 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 64  fo exists ::no(d
17e50 65 6c 65 74 65 53 71 6c 69 74 65 41 72 63 68 69  eleteSqliteArchi
17e60 74 65 63 74 75 72 65 46 69 6c 65 73 29 5d 20 26  tectureFiles)] &
17e70 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  & \..           
17e80 20 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67           [string
17e90 20 6c 65 6e 67 74 68 20 24 61 72 63 68 69 74 65   length $archite
17ea0 63 74 75 72 65 5d 20 3e 20 30 7d 20 74 68 65 6e  cture] > 0} then
17eb0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
17ec0 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 66 69        foreach fi
17ed0 6c 65 4e 61 6d 65 20 24 6e 61 74 69 76 65 46 69  leName $nativeFi
17ee0 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20  leNames {..     
17ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
17f00 72 79 44 65 6c 65 74 65 41 73 73 65 6d 62 6c 79  ryDeleteAssembly
17f10 20 24 66 69 6c 65 4e 61 6d 65 20 24 61 72 63 68   $fileName $arch
17f20 69 74 65 63 74 75 72 65 0d 0a 20 20 20 20 20 20  itecture..      
17f30 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
17f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
17f50 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
17f60 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  }..            }
17f70 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
17f80 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74  if {![info exist
17f90 73 20 3a 3a 6e 6f 28 64 65 6c 65 74 65 53 71 6c  s ::no(deleteSql
17fa0 69 74 65 4d 61 6e 61 67 65 64 46 69 6c 65 73 29  iteManagedFiles)
17fb0 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
17fc0 20 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68           foreach
17fd0 20 66 69 6c 65 4e 61 6d 65 20 24 6d 61 6e 61 67   fileName $manag
17fe0 65 64 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20  edFileNames {.. 
17ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
18000 72 79 44 65 6c 65 74 65 41 73 73 65 6d 62 6c 79  ryDeleteAssembly
18010 20 24 66 69 6c 65 4e 61 6d 65 0d 0a 20 20 20 20   $fileName..    
18020 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
18030 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
18040 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
18050 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
18060 20 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20    # NOTE: Check 
18070 66 6f 72 20 74 68 65 20 22 61 75 74 6f 53 65 6c  for the "autoSel
18080 65 63 74 22 20 72 75 6e 74 69 6d 65 20 6f 70 74  ect" runtime opt
18090 69 6f 6e 2e 20 20 49 66 20 70 72 65 73 65 6e 74  ion.  If present
180a0 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 20  ,..          #  
180b0 20 20 20 20 20 61 74 74 65 6d 70 74 20 74 6f 20       attempt to 
180c0 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 73 65  automatically se
180d0 6c 65 63 74 20 74 68 65 20 66 69 72 73 74 20 61  lect the first a
180e0 76 61 69 6c 61 62 6c 65 0d 0a 20 20 20 20 20 20  vailable..      
180f0 20 20 20 20 23 20 20 20 20 20 20 20 62 75 69 6c      #       buil
18100 64 20 28 6f 72 20 22 72 65 6c 65 61 73 65 22 29  d (or "release")
18110 20 6f 66 20 53 51 4c 69 74 65 20 61 6e 64 20 53   of SQLite and S
18120 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
18130 65 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 20  e..          #  
18140 20 20 20 20 20 66 6f 72 20 75 73 65 20 77 69 74       for use wit
18150 68 20 74 68 65 20 74 65 73 74 20 73 75 69 74 65  h the test suite
18160 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a  ...          #..
18170 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 68            if {[h
18180 61 73 52 75 6e 74 69 6d 65 4f 70 74 69 6f 6e 20  asRuntimeOption 
18190 61 75 74 6f 53 65 6c 65 63 74 5d 7d 20 74 68 65  autoSelect]} the
181a0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
181b0 20 69 66 20 7b 21 5b 63 68 65 63 6b 46 6f 72 53   if {![checkForS
181c0 51 4c 69 74 65 42 75 69 6c 64 73 20 24 3a 3a 74  QLiteBuilds $::t
181d0 65 73 74 5f 63 68 61 6e 6e 65 6c 20 74 72 75 65  est_channel true
181e0 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
181f0 20 20 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f           checkFo
18200 72 53 51 4c 69 74 65 52 65 6c 65 61 73 65 73 20  rSQLiteReleases 
18210 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
18220 74 72 75 65 0d 0a 20 20 20 20 20 20 20 20 20 20  true..          
18230 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d    }..          }
18240 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d  ....          #.
18250 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54  .          # NOT
18260 45 3a 20 53 6b 69 70 20 74 72 79 69 6e 67 20 74  E: Skip trying t
18270 6f 20 76 65 72 69 66 79 20 74 68 65 20 62 75 69  o verify the bui
18280 6c 64 20 64 69 72 65 63 74 6f 72 79 20 69 66 20  ld directory if 
18290 69 6e 73 74 72 75 63 74 65 64 3b 0d 0a 20 20 20  instructed;..   
182a0 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 6f         #       o
182b0 74 68 65 72 77 69 73 65 2c 20 6d 61 6b 65 20 73  therwise, make s
182c0 75 72 65 20 69 74 20 61 63 74 75 61 6c 6c 79 20  ure it actually 
182d0 65 78 69 73 74 73 20 6f 72 20 68 61 6c 74 20 74  exists or halt t
182e0 68 65 20 65 6e 74 69 72 65 0d 0a 20 20 20 20 20  he entire..     
182f0 20 20 20 20 20 23 20 20 20 20 20 20 20 74 65 73       #       tes
18300 74 69 6e 67 20 70 72 6f 63 65 73 73 20 69 66 20  ting process if 
18310 69 74 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73  it does not exis
18320 74 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d  t...          #.
18330 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21  .          if {!
18340 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e  [info exists ::n
18350 6f 28 76 65 72 69 66 79 42 75 69 6c 64 44 69 72  o(verifyBuildDir
18360 65 63 74 6f 72 79 29 5d 7d 20 74 68 65 6e 20 7b  ectory)]} then {
18370 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 0d  ..            #.
18380 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4e  .            # N
18390 4f 54 45 3a 20 41 74 20 74 68 69 73 20 70 6f 69  OTE: At this poi
183a0 6e 74 2c 20 74 68 65 20 62 75 69 6c 64 20 64 69  nt, the build di
183b0 72 65 63 74 6f 72 79 20 4d 55 53 54 20 65 78 69  rectory MUST exi
183c0 73 74 20 61 73 20 61 0d 0a 20 20 20 20 20 20 20  st as a..       
183d0 20 20 20 20 20 23 20 20 20 20 20 20 20 76 61 6c       #       val
183e0 69 64 20 64 69 72 65 63 74 6f 72 79 20 66 6f 72  id directory for
183f0 20 74 68 65 20 74 65 73 74 69 6e 67 20 70 72 6f   the testing pro
18400 63 65 73 73 20 74 6f 20 63 6f 6e 74 69 6e 75 65  cess to continue
18410 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23  ...            #
18420 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 65  ..            se
18430 74 20 64 69 72 65 63 74 6f 72 79 20 5b 67 65 74  t directory [get
18440 42 75 69 6c 64 44 69 72 65 63 74 6f 72 79 5d 0d  BuildDirectory].
18450 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ...            i
18460 66 20 7b 21 5b 66 69 6c 65 20 65 78 69 73 74 73  f {![file exists
18470 20 24 64 69 72 65 63 74 6f 72 79 5d 20 7c 7c 20   $directory] || 
18480 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
18490 20 20 20 21 5b 66 69 6c 65 20 69 73 64 69 72 65     ![file isdire
184a0 63 74 6f 72 79 20 24 64 69 72 65 63 74 6f 72 79  ctory $directory
184b0 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
184c0 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
184d0 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45            # NOTE
184e0 3a 20 4a 75 73 74 20 70 72 69 6f 72 20 74 6f 20  : Just prior to 
184f0 61 63 74 75 61 6c 6c 79 20 68 61 6c 74 69 6e 67  actually halting
18500 20 74 68 65 20 74 65 73 74 69 6e 67 20 70 72 6f   the testing pro
18510 63 65 73 73 2c 0d 0a 20 20 20 20 20 20 20 20 20  cess,..         
18520 20 20 20 20 20 23 20 20 20 20 20 20 20 61 64 64       #       add
18530 20 61 6e 20 65 72 72 6f 72 20 74 6f 20 74 68 65   an error to the
18540 20 74 65 73 74 20 6c 6f 67 20 66 69 6c 65 2e 0d   test log file..
18550 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23  .              #
18560 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
18570 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
18580 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
18590 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
185a0 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 6f 75         "---- cou
185b0 6c 64 20 6e 6f 74 20 76 65 72 69 66 79 20 62 75  ld not verify bu
185c0 69 6c 64 20 64 69 72 65 63 74 6f 72 79 20 5c 22  ild directory \"
185d0 22 20 24 64 69 72 65 63 74 6f 72 79 20 5c 0d 0a  " $directory \..
185e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
185f0 20 20 22 5c 22 2c 20 61 6c 6c 20 74 65 73 74 69    "\", all testi
18600 6e 67 20 68 61 6c 74 65 64 5c 6e 22 5d 0d 0a 0d  ng halted\n"]...
18610 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23  .              #
18620 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
18630 23 20 4e 4f 54 45 3a 20 52 61 69 73 69 6e 67 20  # NOTE: Raising 
18640 61 20 73 63 72 69 70 74 20 65 72 72 6f 72 20 66  a script error f
18650 72 6f 6d 20 74 68 69 73 20 70 6f 69 6e 74 20 73  rom this point s
18660 68 6f 75 6c 64 20 68 61 6c 74 0d 0a 20 20 20 20  hould halt..    
18670 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20            #     
18680 20 20 74 68 65 20 74 65 73 74 69 6e 67 20 70 72    the testing pr
18690 6f 63 65 73 73 2e 0d 0a 20 20 20 20 20 20 20 20  ocess...        
186a0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
186b0 20 20 20 20 20 20 20 65 72 72 6f 72 20 5b 61 70         error [ap
186c0 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
186d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 63                "c
186e0 6f 75 6c 64 20 6e 6f 74 20 76 65 72 69 66 79 20  ould not verify 
186f0 62 75 69 6c 64 20 64 69 72 65 63 74 6f 72 79 20  build directory 
18700 5c 22 22 20 24 64 69 72 65 63 74 6f 72 79 20 5c  \"" $directory \
18710 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
18720 20 20 20 20 22 5c 22 2c 20 61 6c 6c 20 74 65 73      "\", all tes
18730 74 69 6e 67 20 68 61 6c 74 65 64 22 5d 0d 0a 20  ting halted"].. 
18740 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
18750 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
18760 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
18770 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 6b 69 70      # NOTE: Skip
18780 20 74 72 79 69 6e 67 20 74 6f 20 63 6f 70 79 20   trying to copy 
18790 61 6e 79 20 66 69 6c 65 73 20 69 66 20 69 6e 73  any files if ins
187a0 74 72 75 63 74 65 64 2e 0d 0a 20 20 20 20 20 20  tructed...      
187b0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
187c0 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73   if {![info exis
187d0 74 73 20 3a 3a 6e 6f 28 63 6f 70 79 53 71 6c 69  ts ::no(copySqli
187e0 74 65 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e 20  teFiles)]} then 
187f0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  {..            i
18800 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73  f {![info exists
18810 20 3a 3a 6e 6f 28 63 6f 70 79 53 71 6c 69 74 65   ::no(copySqlite
18820 43 6f 6e 66 69 67 46 69 6c 65 73 29 5d 7d 20 74  ConfigFiles)]} t
18830 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
18840 20 20 20 20 20 66 6f 72 65 61 63 68 20 66 69 6c       foreach fil
18850 65 4e 61 6d 65 20 24 63 6f 6e 66 69 67 46 69 6c  eName $configFil
18860 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20  eNames {..      
18870 20 20 20 20 20 20 20 20 20 20 74 72 79 43 6f 70            tryCop
18880 79 42 75 69 6c 64 46 69 6c 65 20 24 66 69 6c 65  yBuildFile $file
18890 4e 61 6d 65 0d 0a 20 20 20 20 20 20 20 20 20 20  Name..          
188a0 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
188b0 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
188c0 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65      if {![info e
188d0 78 69 73 74 73 20 3a 3a 6e 6f 28 63 6f 70 79 53  xists ::no(copyS
188e0 71 6c 69 74 65 45 78 74 65 72 6e 61 6c 46 69 6c  qliteExternalFil
188f0 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  es)]} then {..  
18900 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20              #.. 
18910 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4e               # N
18920 4f 54 45 3a 20 43 6f 70 79 20 74 68 65 20 4d 61  OTE: Copy the Ma
18930 6e 61 67 65 64 20 44 65 62 75 67 67 69 6e 67 20  naged Debugging 
18940 41 73 73 69 73 74 61 6e 74 73 20 28 4d 44 41 29  Assistants (MDA)
18950 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 0d 0a   configuration..
18960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20                # 
18970 20 20 20 20 20 20 66 69 6c 65 20 66 6f 72 20 74        file for t
18980 68 65 20 45 61 67 6c 65 20 73 68 65 6c 6c 20 74  he Eagle shell t
18990 6f 20 74 68 65 20 62 75 69 6c 64 20 6f 75 74 70  o the build outp
189a0 75 74 20 64 69 72 65 63 74 6f 72 79 2c 0d 0a 20  ut directory,.. 
189b0 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20 20               #  
189c0 20 20 20 20 20 77 68 69 6c 65 20 75 73 69 6e 67       while using
189d0 20 65 61 63 68 20 6f 66 20 74 68 65 20 6e 61 6d   each of the nam
189e0 65 73 20 6f 66 20 74 68 65 20 76 61 72 69 6f 75  es of the variou
189f0 73 20 6c 65 67 61 63 79 20 74 65 73 74 0d 0a 20  s legacy test.. 
18a00 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20 20               #  
18a10 20 20 20 20 20 65 78 65 63 75 74 61 62 6c 65 73       executables
18a20 2e 20 20 54 68 69 73 20 77 69 6c 6c 20 68 65 6c  .  This will hel
18a30 70 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74  p to make sure t
18a40 68 61 74 20 61 6c 6c 20 74 68 65 0d 0a 20 20 20  hat all the..   
18a50 20 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20             #    
18a60 20 20 20 6c 65 67 61 63 79 20 74 65 73 74 73 20     legacy tests 
18a70 72 75 6e 20 77 69 74 68 20 65 78 61 63 74 6c 79  run with exactly
18a80 20 74 68 65 20 73 61 6d 65 20 73 65 74 20 6f 66   the same set of
18a90 20 4d 61 6e 61 67 65 64 0d 0a 20 20 20 20 20 20   Managed..      
18aa0 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
18ab0 44 65 62 75 67 67 69 6e 67 20 41 73 73 69 73 74  Debugging Assist
18ac0 61 6e 74 73 20 63 6f 6e 66 69 67 75 72 65 64 2e  ants configured.
18ad0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
18ae0 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  #..             
18af0 20 66 6f 72 65 61 63 68 20 66 69 6c 65 4e 61 6d   foreach fileNam
18b00 65 20 24 6d 64 61 43 6f 6e 66 69 67 46 69 6c 65  e $mdaConfigFile
18b10 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20 20  Names {..       
18b20 20 20 20 20 20 20 20 20 20 74 72 79 43 6f 70 79           tryCopy
18b30 42 69 6e 61 72 79 46 69 6c 65 20 45 61 67 6c 65  BinaryFile Eagle
18b40 53 68 65 6c 6c 2e 65 78 65 2e 6d 64 61 2e 63 6f  Shell.exe.mda.co
18b50 6e 66 69 67 20 22 22 20 24 66 69 6c 65 4e 61 6d  nfig "" $fileNam
18b60 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e..             
18b70 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   }....          
18b80 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
18b90 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 6f 70       # NOTE: Cop
18ba0 79 20 74 68 65 20 65 78 74 65 72 6e 61 6c 20 62  y the external b
18bb0 69 6e 61 72 69 65 73 2c 20 69 66 20 61 6e 79 2c  inaries, if any,
18bc0 20 74 6f 20 74 68 65 20 64 69 72 65 63 74 6f 72   to the director
18bd0 79 20 74 68 61 74 0d 0a 20 20 20 20 20 20 20 20  y that..        
18be0 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63 6f        #       co
18bf0 6e 74 61 69 6e 73 20 74 68 65 20 45 61 67 6c 65  ntains the Eagle
18c00 20 73 68 65 6c 6c 2e 20 20 54 68 69 73 20 69 73   shell.  This is
18c10 20 74 79 70 69 63 61 6c 6c 79 20 75 73 65 64 20   typically used 
18c20 74 6f 20 6d 61 6b 65 0d 0a 20 20 20 20 20 20 20  to make..       
18c30 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 73         #       s
18c40 75 72 65 20 61 73 73 65 6d 62 6c 69 65 73 20 72  ure assemblies r
18c50 65 66 65 72 65 6e 63 65 64 20 62 79 20 74 68 65  eferenced by the
18c60 20 6f 6e 65 73 20 62 65 69 6e 67 20 74 65 73 74   ones being test
18c70 65 64 20 61 72 65 0d 0a 20 20 20 20 20 20 20 20  ed are..        
18c80 20 20 20 20 20 20 23 20 20 20 20 20 20 20 61 76        #       av
18c90 61 69 6c 61 62 6c 65 20 64 75 72 69 6e 67 20 74  ailable during t
18ca0 68 65 20 74 65 73 74 69 6e 67 20 70 72 6f 63 65  he testing proce
18cb0 73 73 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ss...           
18cc0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
18cd0 20 20 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65      foreach file
18ce0 4e 61 6d 65 20 24 65 78 74 65 72 6e 61 6c 46 69  Name $externalFi
18cf0 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20  leNames {..     
18d00 20 20 20 20 20 20 20 20 20 20 20 74 72 79 43 6f             tryCo
18d10 70 79 45 78 74 65 72 6e 61 6c 46 69 6c 65 20 24  pyExternalFile $
18d20 66 69 6c 65 4e 61 6d 65 0d 0a 20 20 20 20 20 20  fileName..      
18d30 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
18d40 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
18d50 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e          if {![in
18d60 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 63  fo exists ::no(c
18d70 6f 70 79 53 71 6c 69 74 65 4e 61 74 69 76 65 46  opySqliteNativeF
18d80 69 6c 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a  iles)]} then {..
18d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 0d                #.
18da0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23  .              #
18db0 20 4e 4f 54 45 3a 20 49 66 20 74 68 65 20 74 65   NOTE: If the te
18dc0 73 74 20 70 6c 61 74 66 6f 72 6d 20 69 73 20 6c  st platform is l
18dd0 69 6b 65 6c 79 20 74 68 65 20 64 65 66 61 75 6c  ikely the defaul
18de0 74 20 66 6f 72 20 74 68 69 73 0d 0a 20 20 20 20  t for this..    
18df0 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20            #     
18e00 20 20 6d 61 63 68 69 6e 65 2c 20 61 6c 73 6f 20    machine, also 
18e10 74 72 79 20 74 6f 20 63 6f 70 79 20 74 68 65 20  try to copy the 
18e20 6e 61 74 69 76 65 20 66 69 6c 65 73 20 74 6f 20  native files to 
18e30 74 68 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20  the..           
18e40 20 20 20 23 20 20 20 20 20 20 20 62 69 6e 61 72     #       binar
18e50 79 20 6c 6f 63 61 74 69 6f 6e 2e 0d 0a 20 20 20  y location...   
18e60 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
18e70 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b              if {
18e80 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  ![info exists ::
18e90 6e 6f 28 63 6f 70 79 53 71 6c 69 74 65 49 6d 70  no(copySqliteImp
18ea0 6c 69 63 69 74 46 69 6c 65 73 29 5d 20 26 26 20  licitFiles)] && 
18eb0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
18ec0 20 20 20 20 20 5b 69 73 44 65 66 61 75 6c 74 42       [isDefaultB
18ed0 75 69 6c 64 50 6c 61 74 66 6f 72 6d 20 74 72 75  uildPlatform tru
18ee0 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  e]} then {..    
18ef0 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 65              fore
18f00 61 63 68 20 66 69 6c 65 4e 61 6d 65 20 24 6e 61  ach fileName $na
18f10 74 69 76 65 46 69 6c 65 4e 61 6d 65 73 20 7b 0d  tiveFileNames {.
18f20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
18f30 20 20 20 74 72 79 43 6f 70 79 41 73 73 65 6d 62     tryCopyAssemb
18f40 6c 79 20 24 66 69 6c 65 4e 61 6d 65 0d 0a 20 20  ly $fileName..  
18f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d                }.
18f60 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
18f70 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
18f80 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69    if {![info exi
18f90 73 74 73 20 3a 3a 6e 6f 28 63 6f 70 79 53 71 6c  sts ::no(copySql
18fa0 69 74 65 4e 6f 6e 49 6d 70 6c 69 63 69 74 46 69  iteNonImplicitFi
18fb0 6c 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  les)]} then {.. 
18fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
18fd0 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73  f {![info exists
18fe0 20 3a 3a 6e 6f 28 63 6f 70 79 53 71 6c 69 74 65   ::no(copySqlite
18ff0 50 6c 61 74 66 6f 72 6d 46 69 6c 65 73 29 5d 20  PlatformFiles)] 
19000 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  && \..          
19010 20 20 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e            [strin
19020 67 20 6c 65 6e 67 74 68 20 24 70 6c 61 74 66 6f  g length $platfo
19030 72 6d 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d  rm] > 0} then {.
19040 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
19050 20 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65 4e     foreach fileN
19060 61 6d 65 20 24 6e 61 74 69 76 65 46 69 6c 65 4e  ame $nativeFileN
19070 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20 20 20  ames {..        
19080 20 20 20 20 20 20 20 20 20 20 20 20 74 72 79 43              tryC
19090 6f 70 79 41 73 73 65 6d 62 6c 79 20 24 66 69 6c  opyAssembly $fil
190a0 65 4e 61 6d 65 20 24 70 6c 61 74 66 6f 72 6d 0d  eName $platform.
190b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
190c0 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
190d0 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
190e0 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21             if {!
190f0 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e  [info exists ::n
19100 6f 28 63 6f 70 79 53 71 6c 69 74 65 41 72 63 68  o(copySqliteArch
19110 69 74 65 63 74 75 72 65 46 69 6c 65 73 29 5d 20  itectureFiles)] 
19120 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  && \..          
19130 20 20 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e            [strin
19140 67 20 6c 65 6e 67 74 68 20 24 61 72 63 68 69 74  g length $archit
19150 65 63 74 75 72 65 5d 20 3e 20 30 7d 20 74 68 65  ecture] > 0} the
19160 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
19170 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 66         foreach f
19180 69 6c 65 4e 61 6d 65 20 24 6e 61 74 69 76 65 46  ileName $nativeF
19190 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20  ileNames {..    
191a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
191b0 74 72 79 43 6f 70 79 41 73 73 65 6d 62 6c 79 20  tryCopyAssembly 
191c0 24 66 69 6c 65 4e 61 6d 65 20 24 61 72 63 68 69  $fileName $archi
191d0 74 65 63 74 75 72 65 0d 0a 20 20 20 20 20 20 20  tecture..       
191e0 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
191f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d                }.
19200 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
19210 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
19220 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ...            i
19230 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73  f {![info exists
19240 20 3a 3a 6e 6f 28 63 6f 70 79 53 71 6c 69 74 65   ::no(copySqlite
19250 4d 61 6e 61 67 65 64 46 69 6c 65 73 29 5d 7d 20  ManagedFiles)]} 
19260 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
19270 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 66 69        foreach fi
19280 6c 65 4e 61 6d 65 20 24 6d 61 6e 61 67 65 64 46  leName $managedF
19290 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20  ileNames {..    
192a0 20 20 20 20 20 20 20 20 20 20 20 20 74 72 79 43              tryC
192b0 6f 70 79 41 73 73 65 6d 62 6c 79 20 24 66 69 6c  opyAssembly $fil
192c0 65 4e 61 6d 65 0d 0a 20 20 20 20 20 20 20 20 20  eName..         
192d0 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
192e0 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
192f0 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   }....          
19300 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e  #..          # N
19310 4f 54 45 3a 20 53 6b 69 70 20 74 72 79 69 6e 67  OTE: Skip trying
19320 20 74 6f 20 6c 6f 61 64 20 61 6e 79 20 66 69 6c   to load any fil
19330 65 73 20 69 66 20 69 6e 73 74 72 75 63 74 65 64  es if instructed
19340 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a  ...          #..
19350 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b            if {![
19360 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f  info exists ::no
19370 28 6c 6f 61 64 53 71 6c 69 74 65 46 69 6c 65 73  (loadSqliteFiles
19380 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  )]} then {..    
19390 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e          if {![in
193a0 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 6c  fo exists ::no(l
193b0 6f 61 64 53 71 6c 69 74 65 49 6d 70 6c 69 63 69  oadSqliteImplici
193c0 74 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e 20 7b  tFiles)]} then {
193d0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
193e0 74 72 79 4c 6f 61 64 41 73 73 65 6d 62 6c 79 20  tryLoadAssembly 
193f0 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
19400 74 65 2e 64 6c 6c 0d 0a 20 20 20 20 20 20 20 20  te.dll..        
19410 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
19420 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20       if {![info 
19430 65 78 69 73 74 73 20 3a 3a 6e 6f 28 6c 6f 61 64  exists ::no(load
19440 53 71 6c 69 74 65 4c 69 6e 71 46 69 6c 65 73 29  SqliteLinqFiles)
19450 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
19460 20 20 20 20 20 20 20 20 20 74 72 79 4c 6f 61 64           tryLoad
19470 41 73 73 65 6d 62 6c 79 20 53 79 73 74 65 6d 2e  Assembly System.
19480 44 61 74 61 2e 53 51 4c 69 74 65 2e 4c 69 6e 71  Data.SQLite.Linq
19490 2e 64 6c 6c 0d 0a 20 20 20 20 20 20 20 20 20 20  .dll..          
194a0 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20    }....         
194b0 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78     if {![info ex
194c0 69 73 74 73 20 3a 3a 6e 6f 28 6c 6f 61 64 53 71  ists ::no(loadSq
194d0 6c 69 74 65 45 66 36 46 69 6c 65 73 29 5d 7d 20  liteEf6Files)]} 
194e0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
194f0 20 20 20 20 20 20 74 72 79 4c 6f 61 64 41 73 73        tryLoadAss
19500 65 6d 62 6c 79 20 53 79 73 74 65 6d 2e 44 61 74  embly System.Dat
19510 61 2e 53 51 4c 69 74 65 2e 45 46 36 2e 64 6c 6c  a.SQLite.EF6.dll
19520 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
19530 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ...            i
19540 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73  f {![info exists
19550 20 3a 3a 6e 6f 28 6c 6f 61 64 53 71 6c 69 74 65   ::no(loadSqlite
19560 4e 6f 6e 49 6d 70 6c 69 63 69 74 46 69 6c 65 73  NonImplicitFiles
19570 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  )]} then {..    
19580 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b            if {![
19590 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f  info exists ::no
195a0 28 6c 6f 61 64 53 71 6c 69 74 65 50 6c 61 74 66  (loadSqlitePlatf
195b0 6f 72 6d 46 69 6c 65 73 29 5d 20 26 26 20 5c 0d  ormFiles)] && \.
195c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
195d0 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74     [string lengt
195e0 68 20 24 70 6c 61 74 66 6f 72 6d 5d 20 3e 20 30  h $platform] > 0
195f0 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
19600 20 20 20 20 20 20 20 20 20 20 74 72 79 4c 6f 61            tryLoa
19610 64 41 73 73 65 6d 62 6c 79 20 53 79 73 74 65 6d  dAssembly System
19620 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 64 6c 6c  .Data.SQLite.dll
19630 20 24 70 6c 61 74 66 6f 72 6d 0d 0a 20 20 20 20   $platform..    
19640 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20            }.... 
19650 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20               if 
19660 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a  {![info exists :
19670 3a 6e 6f 28 6c 6f 61 64 53 71 6c 69 74 65 41 72  :no(loadSqliteAr
19680 63 68 69 74 65 63 74 75 72 65 46 69 6c 65 73 29  chitectureFiles)
19690 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20  ] && \..        
196a0 20 20 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e            [strin
196b0 67 20 6c 65 6e 67 74 68 20 24 61 72 63 68 69 74  g length $archit
196c0 65 63 74 75 72 65 5d 20 3e 20 30 7d 20 74 68 65  ecture] > 0} the
196d0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
196e0 20 20 20 20 20 74 72 79 4c 6f 61 64 41 73 73 65       tryLoadAsse
196f0 6d 62 6c 79 20 53 79 73 74 65 6d 2e 44 61 74 61  mbly System.Data
19700 2e 53 51 4c 69 74 65 2e 64 6c 6c 20 24 61 72 63  .SQLite.dll $arc
19710 68 69 74 65 63 74 75 72 65 0d 0a 20 20 20 20 20  hitecture..     
19720 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
19730 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
19740 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
19750 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 63 61 74  }....        cat
19760 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  ch {..          
19770 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
19780 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
19790 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
197a0 20 20 20 22 2d 2d 2d 2d 20 66 69 6c 65 20 76 65     "---- file ve
197b0 72 73 69 6f 6e 20 6f 66 20 5c 22 73 71 6c 69 74  rsion of \"sqlit
197c0 65 33 2e 64 6c 6c 5c 22 2e 2e 2e 20 22 20 5c 0d  e3.dll\"... " \.
197d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b  .              [
197e0 66 69 6c 65 20 76 65 72 73 69 6f 6e 20 5b 67 65  file version [ge
197f0 74 42 69 6e 61 72 79 46 69 6c 65 4e 61 6d 65 20  tBinaryFileName 
19800 73 71 6c 69 74 65 33 2e 64 6c 6c 5d 5d 20 5c 6e  sqlite3.dll]] \n
19810 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  ]..        }....
19820 20 20 20 20 20 20 20 20 63 61 74 63 68 20 7b 0d          catch {.
19830 0a 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73  .          tputs
19840 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
19850 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
19860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d                "-
19870 2d 2d 2d 20 66 69 6c 65 20 76 65 72 73 69 6f 6e  --- file version
19880 20 6f 66 20 5c 22 53 51 4c 69 74 65 2e 49 6e 74   of \"SQLite.Int
19890 65 72 6f 70 2e 64 6c 6c 5c 22 2e 2e 2e 20 22 20  erop.dll\"... " 
198a0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
198b0 20 5b 66 69 6c 65 20 76 65 72 73 69 6f 6e 20 5b   [file version [
198c0 67 65 74 42 69 6e 61 72 79 46 69 6c 65 4e 61 6d  getBinaryFileNam
198d0 65 20 53 51 4c 69 74 65 2e 49 6e 74 65 72 6f 70  e SQLite.Interop
198e0 2e 64 6c 6c 5d 5d 20 5c 6e 5d 0d 0a 20 20 20 20  .dll]] \n]..    
198f0 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
19900 20 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20   catch {..      
19910 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
19920 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e  t_channel [appen
19930 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
19940 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 66 69 6c         "---- fil
19950 65 20 76 65 72 73 69 6f 6e 20 6f 66 20 5c 22 53  e version of \"S
19960 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
19970 65 2e 64 6c 6c 5c 22 2e 2e 2e 20 22 20 5c 0d 0a  e.dll\"... " \..
19980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 66                [f
19990 69 6c 65 20 76 65 72 73 69 6f 6e 20 5b 67 65 74  ile version [get
199a0 42 69 6e 61 72 79 46 69 6c 65 4e 61 6d 65 20 53  BinaryFileName S
199b0 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
199c0 65 2e 64 6c 6c 5d 5d 20 5c 6e 5d 0d 0a 20 20 20  e.dll]] \n]..   
199d0 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
199e0 20 20 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20    catch {..     
199f0 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
19a00 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
19a10 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
19a20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 66 69          "---- fi
19a30 6c 65 20 76 65 72 73 69 6f 6e 20 6f 66 20 5c 22  le version of \"
19a40 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
19a50 74 65 2e 4c 69 6e 71 2e 64 6c 6c 5c 22 2e 2e 2e  te.Linq.dll\"...
19a60 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20   " \..          
19a70 20 20 20 20 5b 66 69 6c 65 20 76 65 72 73 69 6f      [file versio
19a80 6e 20 5b 67 65 74 42 69 6e 61 72 79 46 69 6c 65  n [getBinaryFile
19a90 4e 61 6d 65 20 53 79 73 74 65 6d 2e 44 61 74 61  Name System.Data
19aa0 2e 53 51 4c 69 74 65 2e 4c 69 6e 71 2e 64 6c 6c  .SQLite.Linq.dll
19ab0 5d 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20  ]] \n]..        
19ac0 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 63 61 74  }....        cat
19ad0 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  ch {..          
19ae0 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
19af0 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
19b00 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
19b10 20 20 20 22 2d 2d 2d 2d 20 66 69 6c 65 20 76 65     "---- file ve
19b20 72 73 69 6f 6e 20 6f 66 20 5c 22 53 79 73 74 65  rsion of \"Syste
19b30 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 45 46  m.Data.SQLite.EF
19b40 36 2e 64 6c 6c 5c 22 2e 2e 2e 20 22 20 5c 0d 0a  6.dll\"... " \..
19b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 66                [f
19b60 69 6c 65 20 76 65 72 73 69 6f 6e 20 5b 67 65 74  ile version [get
19b70 42 69 6e 61 72 79 46 69 6c 65 4e 61 6d 65 20 53  BinaryFileName S
19b80 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
19b90 65 2e 45 46 36 2e 64 6c 6c 5d 5d 20 5c 6e 5d 0d  e.EF6.dll]] \n].
19ba0 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  .        }....  
19bb0 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e        if {[strin
19bc0 67 20 6c 65 6e 67 74 68 20 24 70 6c 61 74 66 6f  g length $platfo
19bd0 72 6d 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d  rm] > 0} then {.
19be0 0a 20 20 20 20 20 20 20 20 20 20 63 61 74 63 68  .          catch
19bf0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
19c00 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
19c10 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
19c20 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
19c30 20 20 20 20 20 22 2d 2d 2d 2d 20 66 69 6c 65 20       "---- file 
19c40 76 65 72 73 69 6f 6e 20 6f 66 20 5c 22 22 20 24  version of \"" $
19c50 70 6c 61 74 66 6f 72 6d 20 5c 0d 0a 20 20 20 20  platform \..    
19c60 20 20 20 20 20 20 20 20 20 20 20 20 22 2f 73 71              "/sq
19c70 6c 69 74 65 33 2e 64 6c 6c 5c 22 2e 2e 2e 20 22  lite3.dll\"... "
19c80 20 5b 66 69 6c 65 20 76 65 72 73 69 6f 6e 20 5c   [file version \
19c90 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
19ca0 20 20 5b 67 65 74 42 69 6e 61 72 79 46 69 6c 65    [getBinaryFile
19cb0 4e 61 6d 65 20 73 71 6c 69 74 65 33 2e 64 6c 6c  Name sqlite3.dll
19cc0 20 24 70 6c 61 74 66 6f 72 6d 5d 5d 20 5c 6e 5d   $platform]] \n]
19cd0 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d  ..          }...
19ce0 0a 20 20 20 20 20 20 20 20 20 20 63 61 74 63 68  .          catch
19cf0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
19d00 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
19d10 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
19d20 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
19d30 20 20 20 20 20 22 2d 2d 2d 2d 20 66 69 6c 65 20       "---- file 
19d40 76 65 72 73 69 6f 6e 20 6f 66 20 5c 22 22 20 24  version of \"" $
19d50 70 6c 61 74 66 6f 72 6d 20 5c 0d 0a 20 20 20 20  platform \..    
19d60 20 20 20 20 20 20 20 20 20 20 20 20 22 2f 53 51              "/SQ
19d70 4c 69 74 65 2e 49 6e 74 65 72 6f 70 2e 64 6c 6c  Lite.Interop.dll
19d80 5c 22 2e 2e 2e 20 22 20 5b 66 69 6c 65 20 76 65  \"... " [file ve
19d90 72 73 69 6f 6e 20 5c 0d 0a 20 20 20 20 20 20 20  rsion \..       
19da0 20 20 20 20 20 20 20 20 20 5b 67 65 74 42 69 6e           [getBin
19db0 61 72 79 46 69 6c 65 4e 61 6d 65 20 53 51 4c 69  aryFileName SQLi
19dc0 74 65 2e 49 6e 74 65 72 6f 70 2e 64 6c 6c 20 24  te.Interop.dll $
19dd0 70 6c 61 74 66 6f 72 6d 5d 5d 20 5c 6e 5d 0d 0a  platform]] \n]..
19de0 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20            }.... 
19df0 20 20 20 20 20 20 20 20 20 63 61 74 63 68 20 7b           catch {
19e00 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70  ..            tp
19e10 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  uts $::test_chan
19e20 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
19e30 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
19e40 20 20 20 22 2d 2d 2d 2d 20 66 69 6c 65 20 76 65     "---- file ve
19e50 72 73 69 6f 6e 20 6f 66 20 5c 22 22 20 24 70 6c  rsion of \"" $pl
19e60 61 74 66 6f 72 6d 20 5c 0d 0a 20 20 20 20 20 20  atform \..      
19e70 20 20 20 20 20 20 20 20 20 20 22 2f 53 79 73 74            "/Syst
19e80 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 64  em.Data.SQLite.d
19e90 6c 6c 5c 22 2e 2e 2e 20 22 20 5b 66 69 6c 65 20  ll\"... " [file 
19ea0 76 65 72 73 69 6f 6e 20 5c 0d 0a 20 20 20 20 20  version \..     
19eb0 20 20 20 20 20 20 20 20 20 20 20 5b 67 65 74 42             [getB
19ec0 69 6e 61 72 79 46 69 6c 65 4e 61 6d 65 20 53 79  inaryFileName Sy
19ed0 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
19ee0 2e 64 6c 6c 20 24 70 6c 61 74 66 6f 72 6d 5d 5d  .dll $platform]]
19ef0 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20   \n]..          
19f00 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  }..        }....
19f10 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72          if {[str
19f20 69 6e 67 20 6c 65 6e 67 74 68 20 24 61 72 63 68  ing length $arch
19f30 69 74 65 63 74 75 72 65 5d 20 3e 20 30 7d 20 74  itecture] > 0} t
19f40 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
19f50 20 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20   catch {..      
19f60 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
19f70 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70  est_channel [app
19f80 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
19f90 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
19fa0 20 66 69 6c 65 20 76 65 72 73 69 6f 6e 20 6f 66   file version of
19fb0 20 5c 22 22 20 24 61 72 63 68 69 74 65 63 74 75   \"" $architectu
19fc0 72 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  re \..          
19fd0 20 20 20 20 20 20 22 2f 73 71 6c 69 74 65 33 2e        "/sqlite3.
19fe0 64 6c 6c 5c 22 2e 2e 2e 20 22 20 5b 66 69 6c 65  dll\"... " [file
19ff0 20 76 65 72 73 69 6f 6e 20 5c 0d 0a 20 20 20 20   version \..    
1a000 20 20 20 20 20 20 20 20 20 20 20 20 5b 67 65 74              [get
1a010 42 69 6e 61 72 79 46 69 6c 65 4e 61 6d 65 20 73  BinaryFileName s
1a020 71 6c 69 74 65 33 2e 64 6c 6c 20 24 61 72 63 68  qlite3.dll $arch
1a030 69 74 65 63 74 75 72 65 5d 5d 20 5c 6e 5d 0d 0a  itecture]] \n]..
1a040 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20            }.... 
1a050 20 20 20 20 20 20 20 20 20 63 61 74 63 68 20 7b           catch {
1a060 0d 0a 20 20 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 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
1a090 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
1a0a0 20 20 20 22 2d 2d 2d 2d 20 66 69 6c 65 20 76 65     "---- file ve
1a0b0 72 73 69 6f 6e 20 6f 66 20 5c 22 22 20 24 61 72  rsion of \"" $ar
1a0c0 63 68 69 74 65 63 74 75 72 65 20 5c 0d 0a 20 20  chitecture \..  
1a0d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2f                "/
1a0e0 53 51 4c 69 74 65 2e 49 6e 74 65 72 6f 70 2e 64  SQLite.Interop.d
1a0f0 6c 6c 5c 22 2e 2e 2e 20 22 20 5b 66 69 6c 65 20  ll\"... " [file 
1a100 76 65 72 73 69 6f 6e 20 5c 0d 0a 20 20 20 20 20  version \..     
1a110 20 20 20 20 20 20 20 20 20 20 20 5b 67 65 74 42             [getB
1a120 69 6e 61 72 79 46 69 6c 65 4e 61 6d 65 20 53 51  inaryFileName SQ
1a130 4c 69 74 65 2e 49 6e 74 65 72 6f 70 2e 64 6c 6c  Lite.Interop.dll
1a140 20 24 61 72 63 68 69 74 65 63 74 75 72 65 5d 5d   $architecture]]
1a150 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20   \n]..          
1a160 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 63  }....          c
1a170 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20  atch {..        
1a180 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
1a190 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e  t_channel [appen
1a1a0 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
1a1b0 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 66           "---- f
1a1c0 69 6c 65 20 76 65 72 73 69 6f 6e 20 6f 66 20 5c  ile version of \
1a1d0 22 22 20 24 61 72 63 68 69 74 65 63 74 75 72 65  "" $architecture
1a1e0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
1a1f0 20 20 20 20 22 2f 53 79 73 74 65 6d 2e 44 61 74      "/System.Dat
1a200 61 2e 53 51 4c 69 74 65 2e 64 6c 6c 5c 22 2e 2e  a.SQLite.dll\"..
1a210 2e 20 22 20 5b 66 69 6c 65 20 76 65 72 73 69 6f  . " [file versio
1a220 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n \..           
1a230 20 20 20 20 20 5b 67 65 74 42 69 6e 61 72 79 46       [getBinaryF
1a240 69 6c 65 4e 61 6d 65 20 53 79 73 74 65 6d 2e 44  ileName System.D
1a250 61 74 61 2e 53 51 4c 69 74 65 2e 64 6c 6c 20 24  ata.SQLite.dll $
1a260 61 72 63 68 69 74 65 63 74 75 72 65 5d 5d 20 5c  architecture]] \
1a270 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d  n]..          }.
1a280 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  .        }....  
1a290 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
1a2a0 20 23 20 4e 4f 54 45 3a 20 47 72 61 62 20 74 68   # NOTE: Grab th
1a2b0 65 20 6c 69 73 74 20 6f 66 20 6d 61 6e 61 67 65  e list of manage
1a2c0 64 20 61 73 73 65 6d 62 6c 69 65 73 20 66 6f 72  d assemblies for
1a2d0 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 72 6f   the current pro
1a2e0 63 65 73 73 0d 0a 20 20 20 20 20 20 20 20 23 20  cess..        # 
1a2f0 20 20 20 20 20 20 61 6e 64 20 72 65 70 6f 72 74        and report
1a300 20 6f 6e 20 74 68 65 20 53 79 73 74 65 6d 2e 44   on the System.D
1a310 61 74 61 2e 53 51 4c 69 74 65 20 72 65 6c 61 74  ata.SQLite relat
1a320 65 64 20 6f 6e 65 73 2e 0d 0a 20 20 20 20 20 20  ed ones...      
1a330 20 20 23 0d 0a 20 20 20 20 20 20 20 20 73 65 74    #..        set
1a340 20 61 73 73 65 6d 62 6c 69 65 73 20 5b 6f 62 6a   assemblies [obj
1a350 65 63 74 20 69 6e 76 6f 6b 65 20 41 70 70 44 6f  ect invoke AppDo
1a360 6d 61 69 6e 2e 43 75 72 72 65 6e 74 44 6f 6d 61  main.CurrentDoma
1a370 69 6e 20 47 65 74 41 73 73 65 6d 62 6c 69 65 73  in GetAssemblies
1a380 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 6f 62 6a  ]....        obj
1a390 65 63 74 20 66 6f 72 65 61 63 68 20 61 73 73 65  ect foreach asse
1a3a0 6d 62 6c 79 20 24 61 73 73 65 6d 62 6c 69 65 73  mbly $assemblies
1a3b0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66   {..          if
1a3c0 20 7b 5b 73 74 72 69 6e 67 20 6d 61 74 63 68 20   {[string match 
1a3d0 5c 7b 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51  \{System.Data.SQ
1a3e0 4c 69 74 65 2a 20 24 61 73 73 65 6d 62 6c 79 5d  Lite* $assembly]
1a3f0 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
1a400 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
1a410 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70  est_channel [app
1a420 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
1a430 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
1a440 20 66 6f 75 6e 64 20 6c 6f 61 64 65 64 20 61 73   found loaded as
1a450 73 65 6d 62 6c 79 3a 20 22 20 24 61 73 73 65 6d  sembly: " $assem
1a460 62 6c 79 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20  bly \n]..       
1a470 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d     }..        }.
1a480 0a 0d 0a 20 20 20 20 20 20 20 20 63 61 74 63 68  ...        catch
1a490 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70   {..          tp
1a4a0 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  uts $::test_chan
1a4b0 6e 65 6c 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  nel \..         
1a4c0 20 20 20 20 20 22 2d 2d 2d 2d 20 64 65 66 69 6e       "---- defin
1a4d0 65 20 63 6f 6e 73 74 61 6e 74 73 20 66 6f 72 20  e constants for 
1a4e0 5c 22 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51  \"System.Data.SQ
1a4f0 4c 69 74 65 5c 22 2e 2e 2e 20 22 0d 0a 0d 0a 20  Lite\"... ".... 
1a500 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61           if {[ca
1a510 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  tch {..         
1a520 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65     object invoke
1a530 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c   -flags +NonPubl
1a540 69 63 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  ic \..          
1a550 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74        System.Dat
1a560 61 2e 53 51 4c 69 74 65 2e 53 51 4c 69 74 65 33  a.SQLite.SQLite3
1a570 20 44 65 66 69 6e 65 43 6f 6e 73 74 61 6e 74 73   DefineConstants
1a580 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 20 64 65  ..          } de
1a590 66 69 6e 65 43 6f 6e 73 74 61 6e 74 73 5d 20 3d  fineConstants] =
1a5a0 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  = 0} then {..   
1a5b0 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
1a5c0 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b  ::test_channel [
1a5d0 61 70 70 65 6e 64 41 72 67 73 20 5b 66 6f 72 6d  appendArgs [form
1a5e0 61 74 4c 69 73 74 20 5b 6c 73 6f 72 74 20 5c 0d  atList [lsort \.
1a5f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1a600 20 24 64 65 66 69 6e 65 43 6f 6e 73 74 61 6e 74   $defineConstant
1a610 73 5d 20 3c 6e 6f 6e 65 3e 5d 20 5c 6e 5d 0d 0a  s] <none>] \n]..
1a620 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65            } else
1a630 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
1a640 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
1a650 61 6e 6e 65 6c 20 75 6e 6b 6e 6f 77 6e 5c 6e 0d  annel unknown\n.
1a660 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  .          }..  
1a670 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
1a680 20 20 20 63 61 74 63 68 20 7b 0d 0a 20 20 20 20     catch {..    
1a690 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
1a6a0 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5c 0d 0a 20  est_channel \.. 
1a6b0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d               "--
1a6c0 2d 2d 20 73 6f 75 72 63 65 20 76 65 72 73 69 6f  -- source versio
1a6d0 6e 20 6f 66 20 5c 22 53 79 73 74 65 6d 2e 44 61  n of \"System.Da
1a6e0 74 61 2e 53 51 4c 69 74 65 2e 64 6c 6c 5c 22 2e  ta.SQLite.dll\".
1a6f0 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 20 20 20 20  .. "....        
1a700 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a    if {[catch {..
1a710 20 20 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65              obje
1a720 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73  ct invoke -flags
1a730 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20   +NonPublic \.. 
1a740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
1a750 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
1a760 65 2e 53 51 4c 69 74 65 43 6f 6e 6e 65 63 74 69  e.SQLiteConnecti
1a770 6f 6e 20 50 72 6f 76 69 64 65 72 56 65 72 73 69  on ProviderVersi
1a780 6f 6e 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 20  on..          } 
1a790 76 65 72 73 69 6f 6e 5d 20 3d 3d 20 30 7d 20 74  version] == 0} t
1a7a0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
1a7b0 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c     if {[string l
1a7c0 65 6e 67 74 68 20 24 76 65 72 73 69 6f 6e 5d 20  ength $version] 
1a7d0 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  == 0} then {..  
1a7e0 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20              set 
1a7f0 76 65 72 73 69 6f 6e 20 6e 75 6c 6c 0d 0a 20 20  version null..  
1a800 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
1a810 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
1a820 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b  ::test_channel [
1a830 61 70 70 65 6e 64 41 72 67 73 20 24 76 65 72 73  appendArgs $vers
1a840 69 6f 6e 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20  ion \n]..       
1a850 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
1a860 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
1a870 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 75  ::test_channel u
1a880 6e 6b 6e 6f 77 6e 5c 6e 0d 0a 20 20 20 20 20 20  nknown\n..      
1a890 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d      }..        }
1a8a0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 63 61 74 63  ....        catc
1a8b0 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74  h {..          t
1a8c0 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
1a8d0 6e 6e 65 6c 20 5c 0d 0a 20 20 20 20 20 20 20 20  nnel \..        
1a8e0 20 20 20 20 20 20 22 2d 2d 2d 2d 20 73 6f 75 72        "---- sour
1a8f0 63 65 20 63 68 65 63 6b 6f 75 74 20 6f 66 20 5c  ce checkout of \
1a900 22 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c  "System.Data.SQL
1a910 69 74 65 2e 64 6c 6c 5c 22 2e 2e 2e 20 22 0d 0a  ite.dll\"... "..
1a920 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b  ..          if {
1a930 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20  [catch {..      
1a940 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76        object inv
1a950 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50  oke -flags +NonP
1a960 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20 20  ublic \..       
1a970 20 20 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e           System.
1a980 44 61 74 61 2e 53 51 4c 69 74 65 2e 53 51 4c 69  Data.SQLite.SQLi
1a990 74 65 43 6f 6e 6e 65 63 74 69 6f 6e 20 50 72 6f  teConnection Pro
1a9a0 76 69 64 65 72 53 6f 75 72 63 65 49 64 0d 0a 20  viderSourceId.. 
1a9b0 20 20 20 20 20 20 20 20 20 7d 20 73 6f 75 72 63           } sourc
1a9c0 65 49 64 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20  eId] == 0} then 
1a9d0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  {..            i
1a9e0 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74  f {[string lengt
1a9f0 68 20 24 73 6f 75 72 63 65 49 64 5d 20 3d 3d 20  h $sourceId] == 
1aa00 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
1aa10 20 20 20 20 20 20 20 20 20 73 65 74 20 73 6f 75           set sou
1aa20 72 63 65 49 64 20 6e 75 6c 6c 0d 0a 20 20 20 20  rceId null..    
1aa30 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
1aa40 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
1aa50 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70  test_channel [ap
1aa60 70 65 6e 64 41 72 67 73 20 24 73 6f 75 72 63 65  pendArgs $source
1aa70 49 64 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20  Id \n]..        
1aa80 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
1aa90 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
1aaa0 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 75 6e  :test_channel un
1aab0 6b 6e 6f 77 6e 5c 6e 0d 0a 20 20 20 20 20 20 20  known\n..       
1aac0 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d     }..        }.
1aad0 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
1aae0 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68        # NOTE: Ch
1aaf0 65 63 6b 20 74 68 65 20 61 76 61 69 6c 61 62 6c  eck the availabl
1ab00 65 20 62 75 69 6c 64 73 20 28 61 6e 64 20 22 72  e builds (and "r
1ab10 65 6c 65 61 73 65 73 22 29 20 6f 66 20 53 51 4c  eleases") of SQL
1ab20 69 74 65 20 61 6e 64 0d 0a 20 20 20 20 20 20 20  ite and..       
1ab30 20 23 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e   #       System.
1ab40 44 61 74 61 2e 53 51 4c 69 74 65 2e 0d 0a 20 20  Data.SQLite...  
1ab50 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
1ab60 20 63 68 65 63 6b 46 6f 72 53 51 4c 69 74 65 42   checkForSQLiteB
1ab70 75 69 6c 64 73 20 24 3a 3a 74 65 73 74 5f 63 68  uilds $::test_ch
1ab80 61 6e 6e 65 6c 0d 0a 20 20 20 20 20 20 20 20 63  annel..        c
1ab90 68 65 63 6b 46 6f 72 53 51 4c 69 74 65 52 65 6c  heckForSQLiteRel
1aba0 65 61 73 65 73 20 24 3a 3a 74 65 73 74 5f 63 68  eases $::test_ch
1abb0 61 6e 6e 65 6c 0d 0a 0d 0a 20 20 20 20 20 20 20  annel....       
1abc0 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
1abd0 54 45 3a 20 4e 6f 77 2c 20 77 65 20 6e 65 65 64  TE: Now, we need
1abe0 20 74 6f 20 6b 6e 6f 77 20 69 66 20 74 68 65 20   to know if the 
1abf0 53 51 4c 69 74 65 20 63 6f 72 65 20 6c 69 62 72  SQLite core libr
1ac00 61 72 79 20 69 73 20 61 76 61 69 6c 61 62 6c 65  ary is available
1ac10 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
1ac20 20 20 28 69 2e 65 2e 20 62 65 63 61 75 73 65 20    (i.e. because 
1ac30 74 68 65 20 6d 61 6e 61 67 65 64 2d 6f 6e 6c 79  the managed-only
1ac40 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c   System.Data.SQL
1ac50 69 74 65 20 61 73 73 65 6d 62 6c 79 20 63 61 6e  ite assembly can
1ac60 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
1ac70 20 20 6c 6f 61 64 20 77 69 74 68 6f 75 74 20 69    load without i
1ac80 74 3b 20 68 6f 77 65 76 65 72 2c 20 69 74 20 63  t; however, it c
1ac90 61 6e 6e 6f 74 20 64 6f 20 61 6e 79 74 68 69 6e  annot do anythin
1aca0 67 20 75 73 65 66 75 6c 20 77 69 74 68 6f 75 74  g useful without
1acb0 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
1acc0 20 20 69 74 29 2e 20 20 49 66 20 77 65 20 61 72    it).  If we ar
1acd0 65 20 75 73 69 6e 67 20 74 68 65 20 6d 69 78 65  e using the mixe
1ace0 64 2d 6d 6f 64 65 20 61 73 73 65 6d 62 6c 79 20  d-mode assembly 
1acf0 61 6e 64 20 77 65 20 61 6c 72 65 61 64 79 0d 0a  and we already..
1ad00 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
1ad10 66 6f 75 6e 64 20 69 74 20 28 61 62 6f 76 65 29  found it (above)
1ad20 2c 20 74 68 69 73 20 73 68 6f 75 6c 64 20 61 6c  , this should al
1ad30 77 61 79 73 20 73 75 63 63 65 65 64 2e 0d 0a 20  ways succeed... 
1ad40 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
1ad50 20 20 63 68 65 63 6b 46 6f 72 53 51 4c 69 74 65    checkForSQLite
1ad60 4c 69 62 72 61 72 79 20 24 3a 3a 74 65 73 74 5f  Library $::test_
1ad70 63 68 61 6e 6e 65 6c 0d 0a 0d 0a 20 20 20 20 20  channel....     
1ad80 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
1ad90 4e 4f 54 45 3a 20 43 68 65 63 6b 20 69 66 20 74  NOTE: Check if t
1ada0 68 65 20 53 51 4c 69 74 65 20 69 6e 74 65 72 6f  he SQLite intero
1adb0 70 20 61 73 73 65 6d 62 6c 79 20 69 73 20 61 76  p assembly is av
1adc0 61 69 6c 61 62 6c 65 2e 0d 0a 20 20 20 20 20 20  ailable...      
1add0 20 20 23 0d 0a 20 20 20 20 20 20 20 20 63 68 65    #..        che
1ade0 63 6b 46 6f 72 53 51 4c 69 74 65 49 6e 74 65 72  ckForSQLiteInter
1adf0 6f 70 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  op $::test_chann
1ae00 65 6c 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d  el....        #.
1ae10 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
1ae20 20 43 68 65 63 6b 20 74 68 65 20 53 51 4c 69 74   Check the SQLit
1ae30 65 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 74  e database and t
1ae40 65 6d 70 6f 72 61 72 79 20 64 69 72 65 63 74 6f  emporary directo
1ae50 72 69 65 73 2e 0d 0a 20 20 20 20 20 20 20 20 23  ries...        #
1ae60 0d 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b 46  ..        checkF
1ae70 6f 72 53 51 4c 69 74 65 44 69 72 65 63 74 6f 72  orSQLiteDirector
1ae80 69 65 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  ies $::test_chan
1ae90 6e 65 6c 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23  nel....        #
1aea0 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
1aeb0 3a 20 41 74 74 65 6d 70 74 20 74 6f 20 64 65 74  : Attempt to det
1aec0 65 72 6d 69 6e 65 20 69 66 20 76 61 72 69 6f 75  ermine if variou
1aed0 73 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f  s compile-time o
1aee0 70 74 69 6f 6e 73 20 6e 65 65 64 65 64 20 66 6f  ptions needed fo
1aef0 72 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  r..        #    
1af00 20 20 20 74 65 73 74 20 63 6f 6e 73 74 72 61 69     test constrai
1af10 6e 74 73 20 77 65 72 65 20 65 6e 61 62 6c 65 64  nts were enabled
1af20 20 66 6f 72 20 74 68 65 20 6d 61 6e 61 67 65 64   for the managed
1af30 20 61 73 73 65 6d 62 6c 79 2e 20 20 54 68 65 72   assembly.  Ther
1af40 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  e..        #    
1af50 20 20 20 61 72 65 20 73 6f 6d 65 20 63 6f 6d 70     are some comp
1af60 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 73  ile-time options
1af70 20 74 68 61 74 20 6d 75 73 74 20 61 6c 73 6f 20   that must also 
1af80 68 61 76 65 20 62 65 65 6e 20 65 6e 61 62 6c 65  have been enable
1af90 64 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  d..        #    
1afa0 20 20 20 66 6f 72 20 74 68 65 20 69 6e 74 65 72     for the inter
1afb0 6f 70 20 61 73 73 65 6d 62 6c 79 20 69 6e 20 6f  op assembly in o
1afc0 72 64 65 72 20 74 6f 20 62 65 20 65 66 66 65 63  rder to be effec
1afd0 74 69 76 65 2e 20 20 46 6f 72 20 74 68 6f 73 65  tive.  For those
1afe0 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
1aff0 20 20 6f 70 74 69 6f 6e 73 2c 20 69 74 20 77 69    options, it wi
1b000 6c 6c 20 62 65 20 61 73 73 75 6d 65 64 20 74 68  ll be assumed th
1b010 61 74 20 69 74 20 77 61 73 20 65 6e 61 62 6c 65  at it was enable
1b020 64 20 66 6f 72 20 74 68 65 20 69 6e 74 65 72 6f  d for the intero
1b030 70 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  p..        #    
1b040 20 20 20 61 73 73 65 6d 62 6c 79 20 69 66 20 69     assembly if i
1b050 74 20 77 61 73 20 65 6e 61 62 6c 65 64 20 66 6f  t was enabled fo
1b060 72 20 74 68 65 20 6d 61 6e 61 67 65 64 20 61 73  r the managed as
1b070 73 65 6d 62 6c 79 2e 0d 0a 20 20 20 20 20 20 20  sembly...       
1b080 20 23 0d 0a 20 20 20 20 20 20 20 20 66 6f 72 65   #..        fore
1b090 61 63 68 20 64 65 66 69 6e 65 43 6f 6e 73 74 61  ach defineConsta
1b0a0 6e 74 20 5b 6c 69 73 74 20 5c 0d 0a 20 20 20 20  nt [list \..    
1b0b0 20 20 20 20 20 20 20 20 43 48 45 43 4b 5f 53 54          CHECK_ST
1b0c0 41 54 45 20 43 4f 55 4e 54 5f 48 41 4e 44 4c 45  ATE COUNT_HANDLE
1b0d0 20 44 45 42 55 47 20 49 4e 54 45 52 4f 50 5f 43   DEBUG INTEROP_C
1b0e0 4f 44 45 43 20 49 4e 54 45 52 4f 50 5f 44 45 42  ODEC INTEROP_DEB
1b0f0 55 47 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  UG \..          
1b100 20 20 49 4e 54 45 52 4f 50 5f 45 58 54 45 4e 53    INTEROP_EXTENS
1b110 49 4f 4e 5f 46 55 4e 43 54 49 4f 4e 53 20 49 4e  ION_FUNCTIONS IN
1b120 54 45 52 4f 50 5f 4c 45 47 41 43 59 5f 43 4c 4f  TEROP_LEGACY_CLO
1b130 53 45 20 49 4e 54 45 52 4f 50 5f 4c 4f 47 20 5c  SE INTEROP_LOG \
1b140 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 49 4e  ..            IN
1b150 54 45 52 4f 50 5f 54 45 53 54 5f 45 58 54 45 4e  TEROP_TEST_EXTEN
1b160 53 49 4f 4e 20 49 4e 54 45 52 4f 50 5f 56 49 52  SION INTEROP_VIR
1b170 54 55 41 4c 5f 54 41 42 4c 45 20 4e 45 54 5f 32  TUAL_TABLE NET_2
1b180 30 20 4e 45 54 5f 33 35 20 5c 0d 0a 20 20 20 20  0 NET_35 \..    
1b190 20 20 20 20 20 20 20 20 4e 45 54 5f 34 30 20 4e          NET_40 N
1b1a0 45 54 5f 34 35 20 4e 45 54 5f 34 35 31 20 4e 45  ET_45 NET_451 NE
1b1b0 54 5f 43 4f 4d 50 41 43 54 5f 32 30 20 50 4c 41  T_COMPACT_20 PLA
1b1c0 54 46 4f 52 4d 5f 43 4f 4d 50 41 43 54 46 52 41  TFORM_COMPACTFRA
1b1d0 4d 45 57 4f 52 4b 20 5c 0d 0a 20 20 20 20 20 20  MEWORK \..      
1b1e0 20 20 20 20 20 20 50 52 45 4c 4f 41 44 5f 4e 41        PRELOAD_NA
1b1f0 54 49 56 45 5f 4c 49 42 52 41 52 59 20 52 45 54  TIVE_LIBRARY RET
1b200 41 52 47 45 54 41 42 4c 45 20 53 51 4c 49 54 45  ARGETABLE SQLITE
1b210 5f 53 54 41 4e 44 41 52 44 20 5c 0d 0a 20 20 20  _STANDARD \..   
1b220 20 20 20 20 20 20 20 20 20 54 48 52 4f 57 5f 4f           THROW_O
1b230 4e 5f 44 49 53 50 4f 53 45 44 20 54 52 41 43 45  N_DISPOSED TRACE
1b240 20 54 52 41 43 45 5f 43 4f 4e 4e 45 43 54 49 4f   TRACE_CONNECTIO
1b250 4e 20 54 52 41 43 45 5f 44 45 54 45 43 54 49 4f  N TRACE_DETECTIO
1b260 4e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  N \..           
1b270 20 54 52 41 43 45 5f 48 41 4e 44 4c 45 20 54 52   TRACE_HANDLE TR
1b280 41 43 45 5f 50 52 45 4c 4f 41 44 20 54 52 41 43  ACE_PRELOAD TRAC
1b290 45 5f 53 48 41 52 45 44 20 54 52 41 43 45 5f 53  E_SHARED TRACE_S
1b2a0 54 41 54 45 4d 45 4e 54 20 5c 0d 0a 20 20 20 20  TATEMENT \..    
1b2b0 20 20 20 20 20 20 20 20 54 52 41 43 45 5f 57 41          TRACE_WA
1b2c0 52 4e 49 4e 47 20 54 52 41 43 4b 5f 4d 45 4d 4f  RNING TRACK_MEMO
1b2d0 52 59 5f 42 59 54 45 53 20 55 53 45 5f 45 4e 54  RY_BYTES USE_ENT
1b2e0 49 54 59 5f 46 52 41 4d 45 57 4f 52 4b 5f 36 20  ITY_FRAMEWORK_6 
1b2f0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 55  \..            U
1b300 53 45 5f 49 4e 54 45 52 4f 50 5f 44 4c 4c 20 55  SE_INTEROP_DLL U
1b310 53 45 5f 50 52 45 50 41 52 45 5f 56 32 20 57 49  SE_PREPARE_V2 WI
1b320 4e 44 4f 57 53 5d 20 7b 0d 0a 20 20 20 20 20 20  NDOWS] {..      
1b330 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
1b340 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 69   # NOTE: Check i
1b350 66 20 74 68 65 20 63 6f 6d 70 69 6c 65 2d 74 69  f the compile-ti
1b360 6d 65 20 6f 70 74 69 6f 6e 20 69 73 20 6c 69 73  me option is lis
1b370 74 65 64 20 69 6e 20 74 68 65 20 6c 69 73 74 20  ted in the list 
1b380 6f 66 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20  of..          # 
1b390 20 20 20 20 20 20 22 64 65 66 69 6e 65 20 63 6f        "define co
1b3a0 6e 73 74 61 6e 74 73 22 20 6b 65 70 74 20 74 72  nstants" kept tr
1b3b0 61 63 6b 20 6f 66 20 62 79 20 74 68 65 20 6d 61  ack of by the ma
1b3c0 6e 61 67 65 64 20 61 73 73 65 6d 62 6c 79 2e 0d  naged assembly..
1b3d0 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
1b3e0 20 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72          checkFor
1b3f0 53 51 4c 69 74 65 44 65 66 69 6e 65 43 6f 6e 73  SQLiteDefineCons
1b400 74 61 6e 74 20 24 3a 3a 74 65 73 74 5f 63 68 61  tant $::test_cha
1b410 6e 6e 65 6c 20 24 64 65 66 69 6e 65 43 6f 6e 73  nnel $defineCons
1b420 74 61 6e 74 0d 0a 20 20 20 20 20 20 20 20 7d 0d  tant..        }.
1b430 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
1b440 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68        # NOTE: Ch
1b450 65 63 6b 20 74 68 65 20 63 75 72 72 65 6e 74 20  eck the current 
1b460 62 75 69 6c 64 20 79 65 61 72 2e 20 20 42 61 73  build year.  Bas
1b470 69 63 61 6c 6c 79 2c 20 74 68 69 73 20 69 6e 64  ically, this ind
1b480 69 63 61 74 65 73 0d 0a 20 20 20 20 20 20 20 20  icates..        
1b490 23 20 20 20 20 20 20 20 77 68 69 63 68 20 76 65  #       which ve
1b4a0 72 73 69 6f 6e 20 6f 66 20 4d 53 42 75 69 6c 64  rsion of MSBuild
1b4b0 20 61 6e 64 2f 6f 72 20 56 69 73 75 61 6c 20 53   and/or Visual S
1b4c0 74 75 64 69 6f 20 77 61 73 20 75 73 65 64 20 74  tudio was used t
1b4d0 6f 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  o..        #    
1b4e0 20 20 20 63 6f 6d 70 69 6c 65 20 74 68 65 20 61     compile the a
1b4f0 73 73 65 6d 62 6c 79 20 62 69 6e 61 72 69 65 73  ssembly binaries
1b500 20 75 6e 64 65 72 20 74 65 73 74 2e 0d 0a 20 20   under test...  
1b510 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
1b520 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
1b530 68 61 6e 6e 65 6c 20 5c 0d 0a 20 20 20 20 20 20  hannel \..      
1b540 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 68 65 63        "---- chec
1b550 6b 69 6e 67 20 66 6f 72 20 53 79 73 74 65 6d 2e  king for System.
1b560 44 61 74 61 2e 53 51 4c 69 74 65 20 62 75 69 6c  Data.SQLite buil
1b570 64 20 79 65 61 72 2e 2e 2e 20 22 0d 0a 0d 0a 20  d year... ".... 
1b580 20 20 20 20 20 20 20 73 65 74 20 79 65 61 72 20         set year 
1b590 5b 67 65 74 42 75 69 6c 64 59 65 61 72 5d 0d 0a  [getBuildYear]..
1b5a0 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74          addConst
1b5b0 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67  raint [appendArg
1b5c0 73 20 62 75 69 6c 64 59 65 61 72 2e 20 24 79 65  s buildYear. $ye
1b5d0 61 72 5d 0d 0a 20 20 20 20 20 20 20 20 74 70 75  ar]..        tpu
1b5e0 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
1b5f0 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
1b600 22 20 24 79 65 61 72 20 5c 22 5c 6e 5d 0d 0a 0d  " $year \"\n]...
1b610 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
1b620 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68 65 63      # NOTE: Chec
1b630 6b 20 74 68 65 20 63 75 72 72 65 6e 74 20 62 75  k the current bu
1b640 69 6c 64 20 2e 4e 45 54 20 46 72 61 6d 65 77 6f  ild .NET Framewo
1b650 72 6b 2e 20 20 42 61 73 69 63 61 6c 6c 79 2c 20  rk.  Basically, 
1b660 74 68 69 73 0d 0a 20 20 20 20 20 20 20 20 23 20  this..        # 
1b670 20 20 20 20 20 20 69 6e 64 69 63 61 74 65 73 20        indicates 
1b680 77 68 69 63 68 20 76 65 72 73 69 6f 6e 20 6f 66  which version of
1b690 20 74 68 65 20 2e 4e 45 54 20 46 72 61 6d 65 77   the .NET Framew
1b6a0 6f 72 6b 20 69 73 20 62 65 69 6e 67 0d 0a 20 20  ork is being..  
1b6b0 20 20 20 20 20 20 23 20 20 20 20 20 20 20 75 73        #       us
1b6c0 65 64 20 62 79 20 74 68 65 20 61 73 73 65 6d 62  ed by the assemb
1b6d0 6c 79 20 62 69 6e 61 72 69 65 73 20 75 6e 64 65  ly binaries unde
1b6e0 72 20 74 65 73 74 2e 0d 0a 20 20 20 20 20 20 20  r test...       
1b6f0 20 23 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74   #..        tput
1b700 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
1b710 6c 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  l \..           
1b720 20 22 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e 67 20   "---- checking 
1b730 66 6f 72 20 53 79 73 74 65 6d 2e 44 61 74 61 2e  for System.Data.
1b740 53 51 4c 69 74 65 20 62 75 69 6c 64 20 2e 4e 45  SQLite build .NE
1b750 54 20 46 72 61 6d 65 77 6f 72 6b 2e 2e 2e 20 22  T Framework... "
1b760 0d 0a 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20  ....        set 
1b770 6e 65 74 46 78 20 5b 67 65 74 42 75 69 6c 64 4e  netFx [getBuildN
1b780 65 74 46 78 5d 0d 0a 20 20 20 20 20 20 20 20 61  etFx]..        a
1b790 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70  ddConstraint [ap
1b7a0 70 65 6e 64 41 72 67 73 20 62 75 69 6c 64 46 72  pendArgs buildFr
1b7b0 61 6d 65 77 6f 72 6b 2e 20 24 6e 65 74 46 78 5d  amework. $netFx]
1b7c0 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20  ..        tputs 
1b7d0 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
1b7e0 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 22 20 24  [appendArgs \" $
1b7f0 6e 65 74 46 78 20 5c 22 5c 6e 5d 0d 0a 0d 0a 20  netFx \"\n].... 
1b800 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
1b810 20 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20    # NOTE: Check 
1b820 74 68 65 20 63 75 72 72 65 6e 74 20 62 75 69 6c  the current buil
1b830 64 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e  d configuration.
1b840 20 20 54 68 69 73 20 73 68 6f 75 6c 64 20 6e 6f    This should no
1b850 72 6d 61 6c 6c 79 0d 0a 20 20 20 20 20 20 20 20  rmally..        
1b860 23 20 20 20 20 20 20 20 62 65 20 65 69 74 68 65  #       be eithe
1b870 72 20 22 44 65 62 75 67 22 20 6f 72 20 22 52 65  r "Debug" or "Re
1b880 6c 65 61 73 65 22 2e 0d 0a 20 20 20 20 20 20 20  lease"...       
1b890 20 23 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74   #..        tput
1b8a0 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
1b8b0 6c 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  l \..           
1b8c0 20 22 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e 67 20   "---- checking 
1b8d0 66 6f 72 20 53 79 73 74 65 6d 2e 44 61 74 61 2e  for System.Data.
1b8e0 53 51 4c 69 74 65 20 62 75 69 6c 64 20 63 6f 6e  SQLite build con
1b8f0 66 69 67 75 72 61 74 69 6f 6e 2e 2e 2e 20 22 0d  figuration... ".
1b900 0a 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 63  ...        set c
1b910 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 5b 67 65  onfiguration [ge
1b920 74 42 75 69 6c 64 43 6f 6e 66 69 67 75 72 61 74  tBuildConfigurat
1b930 69 6f 6e 5d 0d 0a 20 20 20 20 20 20 20 20 61 64  ion]..        ad
1b940 64 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70  dConstraint [app
1b950 65 6e 64 41 72 67 73 20 62 75 69 6c 64 43 6f 6e  endArgs buildCon
1b960 66 69 67 75 72 61 74 69 6f 6e 2e 20 24 63 6f 6e  figuration. $con
1b970 66 69 67 75 72 61 74 69 6f 6e 5d 0d 0a 20 20 20  figuration]..   
1b980 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
1b990 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
1b9a0 6e 64 41 72 67 73 20 5c 22 20 24 63 6f 6e 66 69  ndArgs \" $confi
1b9b0 67 75 72 61 74 69 6f 6e 20 5c 22 5c 6e 5d 0d 0a  guration \"\n]..
1b9c0 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
1b9d0 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 72 79       # NOTE: Try
1b9e0 20 74 6f 20 73 65 74 75 70 20 61 6e 20 69 6e 74   to setup an int
1b9f0 65 72 72 75 70 74 20 63 61 6c 6c 62 61 63 6b 20  errupt callback 
1ba00 75 73 69 6e 67 20 74 68 65 20 73 63 72 69 70 74  using the script
1ba10 20 64 65 62 75 67 67 65 72 0d 0a 20 20 20 20 20   debugger..     
1ba20 20 20 20 23 20 20 20 20 20 20 20 74 68 61 74 20     #       that 
1ba30 77 69 6c 6c 20 63 61 6e 63 65 6c 20 61 6c 6c 20  will cancel all 
1ba40 53 51 4c 20 71 75 65 72 69 65 73 20 69 6e 20 70  SQL queries in p
1ba50 72 6f 67 72 65 73 73 20 66 6f 72 20 61 6c 6c 20  rogress for all 
1ba60 64 61 74 61 62 61 73 65 0d 0a 20 20 20 20 20 20  database..      
1ba70 20 20 23 20 20 20 20 20 20 20 63 6f 6e 6e 65 63    #       connec
1ba80 74 69 6f 6e 73 20 6b 6e 6f 77 6e 20 74 6f 20 74  tions known to t
1ba90 68 69 73 20 69 6e 74 65 72 70 72 65 74 65 72 2e  his interpreter.
1baa0 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
1bab0 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20       if {![info 
1bac0 65 78 69 73 74 73 20 3a 3a 6e 6f 28 73 71 6c 69  exists ::no(sqli
1bad0 74 65 49 6e 74 65 72 72 75 70 74 43 61 6c 6c 62  teInterruptCallb
1bae0 61 63 6b 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  ack)]} then {.. 
1baf0 20 20 20 20 20 20 20 20 20 73 65 74 75 70 44 62           setupDb
1bb00 49 6e 74 65 72 72 75 70 74 43 61 6c 6c 62 61 63  InterruptCallbac
1bb10 6b 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  k $::test_channe
1bb20 6c 20 24 3a 3a 74 65 73 74 5f 6c 6f 67 0d 0a 20  l $::test_log.. 
1bb30 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
1bb40 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
1bb50 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 66 6f 72   NOTE: Check for
1bb60 20 74 68 65 20 6e 61 74 69 76 65 20 72 75 6e 74   the native runt
1bb70 69 6d 65 20 6f 70 74 69 6f 6e 2c 20 77 68 69 63  ime option, whic
1bb80 68 20 77 6f 75 6c 64 20 6d 65 61 6e 20 77 65 20  h would mean we 
1bb90 61 72 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20  are..        #  
1bba0 20 20 20 20 20 75 73 69 6e 67 20 74 68 65 20 6d       using the m
1bbb0 69 78 65 64 2d 6d 6f 64 65 20 61 73 73 65 6d 62  ixed-mode assemb
1bbc0 6c 79 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  ly...        #..
1bbd0 20 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72          checkFor
1bbe0 52 75 6e 74 69 6d 65 4f 70 74 69 6f 6e 20 24 3a  RuntimeOption $:
1bbf0 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 6e 61  :test_channel na
1bc00 74 69 76 65 0d 0a 0d 0a 20 20 20 20 20 20 20 20  tive....        
1bc10 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
1bc20 45 3a 20 43 68 65 63 6b 20 69 66 20 74 68 65 20  E: Check if the 
1bc30 74 65 73 74 20 73 75 69 74 65 20 73 68 6f 75 6c  test suite shoul
1bc40 64 20 63 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62  d count the numb
1bc50 65 72 20 6f 66 20 63 6f 6e 6e 65 63 74 69 6f 6e  er of connection
1bc60 73 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  s..        #    
1bc70 20 20 20 22 6f 70 65 6e 65 64 22 20 61 6e 64 20     "opened" and 
1bc80 22 63 6c 6f 73 65 64 22 20 66 72 6f 6d 20 74 68  "closed" from th
1bc90 65 20 70 6f 6f 6c 20 77 68 65 6e 20 64 65 74 65  e pool when dete
1bca0 72 6d 69 6e 69 6e 67 20 69 66 20 61 20 74 65 73  rmining if a tes
1bcb0 74 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  t..        #    
1bcc0 20 20 20 70 61 73 73 65 64 2e 20 20 44 69 73 61     passed.  Disa
1bcd0 62 6c 69 6e 67 20 74 68 69 73 20 62 65 68 61 76  bling this behav
1bce0 69 6f 72 20 69 73 20 73 6f 6d 65 74 69 6d 65 73  ior is sometimes
1bcf0 20 6e 65 63 65 73 73 61 72 79 20 28 65 2e 67 2e   necessary (e.g.
1bd00 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
1bd10 20 20 64 75 72 69 6e 67 20 74 68 65 20 72 65 6c    during the rel
1bd20 65 61 73 65 20 74 65 73 74 69 6e 67 20 70 72 6f  ease testing pro
1bd30 63 65 73 73 29 20 62 65 63 61 75 73 65 20 74 68  cess) because th
1bd40 65 72 65 20 61 72 65 20 73 65 76 65 72 61 6c 0d  ere are several.
1bd50 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
1bd60 20 74 65 73 74 73 20 74 68 61 74 20 72 65 6c 79   tests that rely
1bd70 20 6f 6e 20 74 68 65 20 22 6f 70 65 6e 65 64 20   on the "opened 
1bd80 66 72 6f 6d 20 70 6f 6f 6c 22 20 63 6f 75 6e 74  from pool" count
1bd90 20 62 65 69 6e 67 20 67 72 65 61 74 65 72 0d 0a   being greater..
1bda0 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
1bdb0 74 68 61 6e 20 7a 65 72 6f 2e 20 20 54 68 65 73  than zero.  Thes
1bdc0 65 20 74 65 73 74 73 20 6d 61 79 20 66 61 69 6c  e tests may fail
1bdd0 20 64 75 65 20 74 6f 20 74 68 65 20 6e 6f 6e 2d   due to the non-
1bde0 64 65 74 65 72 6d 69 6e 69 73 74 69 63 0d 0a 20  deterministic.. 
1bdf0 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 62         #       b
1be00 65 68 61 76 69 6f 72 20 6f 66 20 74 68 65 20 43  ehavior of the C
1be10 4c 52 20 47 43 2c 20 65 76 65 6e 20 77 68 65 6e  LR GC, even when
1be20 20 74 68 65 72 65 20 69 73 20 6e 6f 20 62 75 67   there is no bug
1be30 20 69 6e 20 74 68 65 20 63 6f 64 65 0d 0a 20 20   in the code..  
1be40 20 20 20 20 20 20 23 20 20 20 20 20 20 20 62 65        #       be
1be50 69 6e 67 20 74 65 73 74 65 64 2e 0d 0a 20 20 20  ing tested...   
1be60 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
1be70 63 68 65 63 6b 46 6f 72 52 75 6e 74 69 6d 65 4f  checkForRuntimeO
1be80 70 74 69 6f 6e 20 24 3a 3a 74 65 73 74 5f 63 68  ption $::test_ch
1be90 61 6e 6e 65 6c 20 6e 6f 50 6f 6f 6c 43 6f 75 6e  annel noPoolCoun
1bea0 74 73 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d  ts....        #.
1beb0 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
1bec0 20 52 65 70 6f 72 74 20 74 68 65 20 72 65 73 6f   Report the reso
1bed0 75 72 63 65 20 75 73 61 67 65 20 70 72 69 6f 72  urce usage prior
1bee0 20 74 6f 20 72 75 6e 6e 69 6e 67 20 61 6e 79 20   to running any 
1bef0 74 65 73 74 73 2e 0d 0a 20 20 20 20 20 20 20 20  tests...        
1bf00 23 0d 0a 20 20 20 20 20 20 20 20 72 65 70 6f 72  #..        repor
1bf10 74 53 51 4c 69 74 65 52 65 73 6f 75 72 63 65 73  tSQLiteResources
1bf20 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
1bf30 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  ....        #.. 
1bf40 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 47         # NOTE: G
1bf50 72 61 62 20 74 68 65 20 6c 69 73 74 20 6f 66 20  rab the list of 
1bf60 6e 61 74 69 76 65 20 6d 6f 64 75 6c 65 73 20 66  native modules f
1bf70 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 70  or the current p
1bf80 72 6f 63 65 73 73 20 61 6e 64 0d 0a 20 20 20 20  rocess and..    
1bf90 20 20 20 20 23 20 20 20 20 20 20 20 72 65 70 6f      #       repo
1bfa0 72 74 20 6f 6e 20 74 68 65 20 53 79 73 74 65 6d  rt on the System
1bfb0 2e 44 61 74 61 2e 53 51 4c 69 74 65 20 72 65 6c  .Data.SQLite rel
1bfc0 61 74 65 64 20 6f 6e 65 73 2e 0d 0a 20 20 20 20  ated ones...    
1bfd0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 73      #..        s
1bfe0 65 74 20 6d 6f 64 75 6c 65 73 20 5b 6f 62 6a 65  et modules [obje
1bff0 63 74 20 69 6e 76 6f 6b 65 20 5c 0d 0a 20 20 20  ct invoke \..   
1c000 20 20 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e           System.
1c010 44 69 61 67 6e 6f 73 74 69 63 73 2e 50 72 6f 63  Diagnostics.Proc
1c020 65 73 73 2e 47 65 74 43 75 72 72 65 6e 74 50 72  ess.GetCurrentPr
1c030 6f 63 65 73 73 20 4d 6f 64 75 6c 65 73 5d 0d 0a  ocess Modules]..
1c040 0d 0a 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74  ..        object
1c050 20 66 6f 72 65 61 63 68 20 2d 61 6c 69 61 73 20   foreach -alias 
1c060 6d 6f 64 75 6c 65 20 24 6d 6f 64 75 6c 65 73 20  module $modules 
1c070 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a  {..          #..
1c080 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45            # NOTE
1c090 3a 20 54 68 65 20 6d 6f 64 75 6c 65 20 66 69 6c  : The module fil
1c0a0 65 20 6e 61 6d 65 20 68 65 72 65 20 6d 75 73 74  e name here must
1c0b0 20 62 65 20 6e 6f 72 6d 61 6c 69 7a 65 64 2e 0d   be normalized..
1c0c0 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
1c0d0 20 20 20 20 20 20 20 20 73 65 74 20 66 69 6c 65          set file
1c0e0 4e 61 6d 65 20 5b 66 69 6c 65 20 6e 6f 72 6d 61  Name [file norma
1c0f0 6c 69 7a 65 20 5b 24 6d 6f 64 75 6c 65 20 46 69  lize [$module Fi
1c100 6c 65 4e 61 6d 65 5d 5d 0d 0a 0d 0a 20 20 20 20  leName]]....    
1c110 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e        if {[strin
1c120 67 20 6d 61 74 63 68 20 2d 6e 6f 63 61 73 65 20  g match -nocase 
1c130 2a 2f 73 71 6c 69 74 65 33 2e 64 6c 6c 20 24 66  */sqlite3.dll $f
1c140 69 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b  ileName]} then {
1c150 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70  ..            tp
1c160 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  uts $::test_chan
1c170 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
1c180 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
1c190 20 20 20 22 2d 2d 2d 2d 20 66 6f 75 6e 64 20 6c     "---- found l
1c1a0 6f 61 64 65 64 20 53 51 4c 69 74 65 20 6e 61 74  oaded SQLite nat
1c1b0 69 76 65 20 6c 69 62 72 61 72 79 20 6d 6f 64 75  ive library modu
1c1c0 6c 65 3a 20 22 20 5c 0d 0a 20 20 20 20 20 20 20  le: " \..       
1c1d0 20 20 20 20 20 20 20 20 20 24 66 69 6c 65 4e 61           $fileNa
1c1e0 6d 65 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20  me \n]..        
1c1f0 20 20 7d 20 65 6c 73 65 69 66 20 7b 5b 73 74 72    } elseif {[str
1c200 69 6e 67 20 6d 61 74 63 68 20 5c 0d 0a 20 20 20  ing match \..   
1c210 20 20 20 20 20 20 20 20 20 20 20 2d 6e 6f 63 61             -noca
1c220 73 65 20 2a 2f 53 51 4c 69 74 65 2e 49 6e 74 65  se */SQLite.Inte
1c230 72 6f 70 2e 64 6c 6c 20 24 66 69 6c 65 4e 61 6d  rop.dll $fileNam
1c240 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  e]} then {..    
1c250 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
1c260 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61  :test_channel [a
1c270 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
1c280 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d               "--
1c290 2d 2d 20 66 6f 75 6e 64 20 6c 6f 61 64 65 64 20  -- found loaded 
1c2a0 53 51 4c 69 74 65 20 69 6e 74 65 72 6f 70 20 61  SQLite interop a
1c2b0 73 73 65 6d 62 6c 79 20 6d 6f 64 75 6c 65 3a 20  ssembly module: 
1c2c0 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  " \..           
1c2d0 20 20 20 20 20 24 66 69 6c 65 4e 61 6d 65 20 5c       $fileName \
1c2e0 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d  n]..          }.
1c2f0 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  .        }....  
1c300 20 20 20 20 20 20 63 61 74 63 68 20 7b 0d 0a 20        catch {.. 
1c310 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
1c320 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5c  ::test_channel \
1c330 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1c340 22 2d 2d 2d 2d 20 63 6f 6d 70 69 6c 65 2d 74 69  "---- compile-ti
1c350 6d 65 20 6f 70 74 69 6f 6e 73 20 66 6f 72 20 53  me options for S
1c360 51 4c 69 74 65 20 63 6f 72 65 20 6c 69 62 72 61  QLite core libra
1c370 72 79 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 20  ry... "....     
1c380 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20       if {[catch 
1c390 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 6f  {..            o
1c3a0 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c  bject invoke -fl
1c3b0 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c  ags +NonPublic \
1c3c0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1c3d0 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51    System.Data.SQ
1c3e0 4c 69 74 65 2e 53 51 4c 69 74 65 33 20 53 51 4c  Lite.SQLite3 SQL
1c3f0 69 74 65 43 6f 6d 70 69 6c 65 4f 70 74 69 6f 6e  iteCompileOption
1c400 73 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 20 63  s..          } c
1c410 6f 6d 70 69 6c 65 4f 70 74 69 6f 6e 73 5d 20 3d  ompileOptions] =
1c420 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  = 0} then {..   
1c430 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
1c440 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b  ::test_channel [
1c450 61 70 70 65 6e 64 41 72 67 73 20 5b 66 6f 72 6d  appendArgs [form
1c460 61 74 4c 69 73 74 20 5b 6c 73 6f 72 74 20 5c 0d  atList [lsort \.
1c470 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1c480 20 24 63 6f 6d 70 69 6c 65 4f 70 74 69 6f 6e 73   $compileOptions
1c490 5d 20 3c 6e 6f 6e 65 3e 5d 20 5c 6e 5d 0d 0a 20  ] <none>] \n].. 
1c4a0 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20           } else 
1c4b0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  {..            t
1c4c0 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
1c4d0 6e 6e 65 6c 20 75 6e 6b 6e 6f 77 6e 5c 6e 0d 0a  nnel unknown\n..
1c4e0 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
1c4f0 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
1c500 20 20 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20    catch {..     
1c510 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
1c520 73 74 5f 63 68 61 6e 6e 65 6c 20 5c 0d 0a 20 20  st_channel \..  
1c530 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
1c540 2d 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f  - compile-time o
1c550 70 74 69 6f 6e 73 20 66 6f 72 20 53 51 4c 69 74  ptions for SQLit
1c560 65 20 69 6e 74 65 72 6f 70 20 61 73 73 65 6d 62  e interop assemb
1c570 6c 79 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 20  ly... "....     
1c580 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20       if {[catch 
1c590 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 6f  {..            o
1c5a0 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c  bject invoke -fl
1c5b0 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c  ags +NonPublic \
1c5c0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1c5d0 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51    System.Data.SQ
1c5e0 4c 69 74 65 2e 53 51 4c 69 74 65 33 20 49 6e 74  Lite.SQLite3 Int
1c5f0 65 72 6f 70 43 6f 6d 70 69 6c 65 4f 70 74 69 6f  eropCompileOptio
1c600 6e 73 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 20  ns..          } 
1c610 63 6f 6d 70 69 6c 65 4f 70 74 69 6f 6e 73 5d 20  compileOptions] 
1c620 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  == 0} then {..  
1c630 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
1c640 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
1c650 5b 61 70 70 65 6e 64 41 72 67 73 20 5b 66 6f 72  [appendArgs [for
1c660 6d 61 74 4c 69 73 74 20 5b 6c 73 6f 72 74 20 5c  matList [lsort \
1c670 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1c680 20 20 24 63 6f 6d 70 69 6c 65 4f 70 74 69 6f 6e    $compileOption
1c690 73 5d 20 3c 6e 6f 6e 65 3e 5d 20 5c 6e 5d 0d 0a  s] <none>] \n]..
1c6a0 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65            } else
1c6b0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
1c6c0 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
1c6d0 61 6e 6e 65 6c 20 75 6e 6b 6e 6f 77 6e 5c 6e 0d  annel unknown\n.
1c6e0 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  .          }..  
1c6f0 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
1c700 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
1c710 4e 4f 54 45 3a 20 53 68 6f 77 20 74 68 65 20 61  NOTE: Show the a
1c720 63 74 69 76 65 20 74 65 73 74 20 63 6f 6e 73 74  ctive test const
1c730 72 61 69 6e 74 73 2e 0d 0a 20 20 20 20 20 20 20  raints...       
1c740 20 23 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74   #..        tput
1c750 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
1c760 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 22 2d  l [appendArgs "-
1c770 2d 2d 2d 20 63 6f 6e 73 74 72 61 69 6e 74 73 3a  --- constraints:
1c780 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20   " \..          
1c790 20 20 5b 66 6f 72 6d 61 74 4c 69 73 74 20 5b 6c    [formatList [l
1c7a0 73 6f 72 74 20 5b 67 65 74 43 6f 6e 73 74 72 61  sort [getConstra
1c7b0 69 6e 74 73 5d 5d 20 3c 6e 6f 6e 65 3e 5d 20 5c  ints]] <none>] \
1c7c0 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d  n]....        #.
1c7d0 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
1c7e0 20 53 61 76 65 20 74 68 65 20 74 65 73 74 20 63   Save the test c
1c7f0 6f 6e 73 74 72 61 69 6e 74 73 20 66 6f 72 20 75  onstraints for u
1c800 73 65 20 62 79 20 74 68 72 65 61 64 73 20 63 72  se by threads cr
1c810 65 61 74 65 64 20 69 6e 20 74 68 69 73 0d 0a 20  eated in this.. 
1c820 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 61         #       a
1c830 70 70 6c 69 63 61 74 69 6f 6e 20 64 6f 6d 61 69  pplication domai
1c840 6e 2e 20 20 54 68 69 73 20 69 73 20 6e 65 63 65  n.  This is nece
1c850 73 73 61 72 79 20 62 65 63 61 75 73 65 20 61 6c  ssary because al
1c860 6c 20 74 68 65 20 45 61 67 6c 65 0d 0a 20 20 20  l the Eagle..   
1c870 20 20 20 20 20 23 20 20 20 20 20 20 20 22 74 65       #       "te
1c880 73 74 20 63 6f 6e 74 65 78 74 22 20 69 6e 66 6f  st context" info
1c890 72 6d 61 74 69 6f 6e 20 69 73 20 70 65 72 2d 74  rmation is per-t
1c8a0 68 72 65 61 64 2e 0d 0a 20 20 20 20 20 20 20 20  hread...        
1c8b0 23 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21  #..        if {!
1c8c0 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 74  [info exists ::t
1c8d0 65 73 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 5d  est_constraints]
1c8e0 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
1c8f0 20 20 20 20 73 65 74 20 3a 3a 74 65 73 74 5f 63      set ::test_c
1c900 6f 6e 73 74 72 61 69 6e 74 73 20 24 3a 3a 65 61  onstraints $::ea
1c910 67 6c 65 5f 74 65 73 74 73 28 63 6f 6e 73 74 72  gle_tests(constr
1c920 61 69 6e 74 73 29 0d 0a 20 20 20 20 20 20 20 20  aints)..        
1c930 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  }....        #..
1c940 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
1c950 4c 6f 61 64 20 74 68 65 20 22 61 66 74 65 72 2d  Load the "after-
1c960 63 6f 6e 73 74 72 61 69 6e 74 73 22 20 63 75 73  constraints" cus
1c970 74 6f 6d 20 70 65 72 2d 75 73 65 72 20 61 6e 64  tom per-user and
1c980 2f 6f 72 20 70 65 72 2d 68 6f 73 74 0d 0a 20 20  /or per-host..  
1c990 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74 65        #       te
1c9a0 73 74 20 73 65 74 74 69 6e 67 73 20 6e 6f 77 2e  st settings now.
1c9b0 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
1c9c0 20 20 20 20 20 75 70 6c 65 76 65 6c 20 31 20 5b       uplevel 1 [
1c9d0 6c 69 73 74 20 6c 6f 61 64 53 51 4c 69 74 65 54  list loadSQLiteT
1c9e0 65 73 74 53 65 74 74 69 6e 67 73 20 24 3a 3a 74  estSettings $::t
1c9f0 65 73 74 5f 63 68 61 6e 6e 65 6c 20 2e 61 66 74  est_channel .aft
1ca00 65 72 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23  er]....        #
1ca10 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
1ca20 3a 20 53 68 6f 77 20 77 68 65 6e 20 6f 75 72 20  : Show when our 
1ca30 74 65 73 74 73 20 61 63 74 75 61 6c 6c 79 20 62  tests actually b
1ca40 65 67 61 6e 20 28 6e 6f 77 29 2e 0d 0a 20 20 20  egan (now)...   
1ca50 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
1ca60 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
1ca70 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
1ca80 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
1ca90 20 22 2d 2d 2d 2d 20 53 79 73 74 65 6d 2e 44 61   "---- System.Da
1caa0 74 61 2e 53 51 4c 69 74 65 20 74 65 73 74 73 20  ta.SQLite tests 
1cab0 62 65 67 61 6e 20 61 74 20 22 20 5c 0d 0a 20 20  began at " \..  
1cac0 20 20 20 20 20 20 20 20 20 20 5b 63 6c 6f 63 6b            [clock
1cad0 20 66 6f 72 6d 61 74 20 5b 63 6c 6f 63 6b 20 73   format [clock s
1cae0 65 63 6f 6e 64 73 5d 5d 20 5c 6e 5d 0d 0a 20 20  econds]] \n]..  
1caf0 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d      }..    }....
1cb00 0a 20 20 20 20 70 72 6f 63 20 72 75 6e 53 51 4c  .    proc runSQL
1cb10 69 74 65 54 65 73 74 45 70 69 6c 6f 67 75 65 20  iteTestEpilogue 
1cb20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20  {} {..      #.. 
1cb30 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 6b 69       # NOTE: Ski
1cb40 70 20 72 75 6e 6e 69 6e 67 20 6f 75 72 20 63 75  p running our cu
1cb50 73 74 6f 6d 20 65 70 69 6c 6f 67 75 65 20 69 66  stom epilogue if
1cb60 20 74 68 65 20 6d 61 69 6e 20 6f 6e 65 20 68 61   the main one ha
1cb70 73 20 62 65 65 6e 0d 0a 20 20 20 20 20 20 23 20  s been..      # 
1cb80 20 20 20 20 20 20 73 6b 69 70 70 65 64 2e 0d 0a        skipped...
1cb90 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69        #..      i
1cba0 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73  f {![info exists
1cbb0 20 3a 3a 6e 6f 28 65 70 69 6c 6f 67 75 65 2e 65   ::no(epilogue.e
1cbc0 61 67 6c 65 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a  agle)]} then {..
1cbd0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
1cbe0 20 20 20 23 20 4e 4f 54 45 3a 20 53 68 6f 77 20     # NOTE: Show 
1cbf0 77 68 65 6e 20 6f 75 72 20 74 65 73 74 73 20 61  when our tests a
1cc00 63 74 75 61 6c 6c 79 20 65 6e 64 65 64 20 28 6e  ctually ended (n
1cc10 6f 77 29 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  ow)...        #.
1cc20 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24  .        tputs $
1cc30 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b  ::test_channel [
1cc40 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
1cc50 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
1cc60 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
1cc70 74 65 20 74 65 73 74 73 20 65 6e 64 65 64 20 61  te tests ended a
1cc80 74 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  t " \..         
1cc90 20 20 20 5b 63 6c 6f 63 6b 20 66 6f 72 6d 61 74     [clock format
1cca0 20 5b 63 6c 6f 63 6b 20 73 65 63 6f 6e 64 73 5d   [clock seconds]
1ccb0 5d 20 5c 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  ] \n]....       
1ccc0 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
1ccd0 54 45 3a 20 4c 6f 61 64 20 74 68 65 20 22 65 70  TE: Load the "ep
1cce0 69 6c 6f 67 75 65 22 20 63 75 73 74 6f 6d 20 70  ilogue" custom p
1ccf0 65 72 2d 75 73 65 72 20 61 6e 64 2f 6f 72 20 70  er-user and/or p
1cd00 65 72 2d 68 6f 73 74 20 74 65 73 74 0d 0a 20 20  er-host test..  
1cd10 20 20 20 20 20 20 23 20 20 20 20 20 20 20 73 65        #       se
1cd20 74 74 69 6e 67 73 20 6e 6f 77 2e 0d 0a 20 20 20  ttings now...   
1cd30 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
1cd40 75 70 6c 65 76 65 6c 20 31 20 5b 6c 69 73 74 20  uplevel 1 [list 
1cd50 6c 6f 61 64 53 51 4c 69 74 65 54 65 73 74 53 65  loadSQLiteTestSe
1cd60 74 74 69 6e 67 73 20 24 3a 3a 74 65 73 74 5f 63  ttings $::test_c
1cd70 68 61 6e 6e 65 6c 20 2e 65 70 69 6c 6f 67 75 65  hannel .epilogue
1cd80 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  ]....        #..
1cd90 20 20 20 20 20 20 20 20 23 20 42 55 47 46 49 58          # BUGFIX
1cda0 3a 20 42 65 66 6f 72 65 20 63 68 65 63 6b 69 6e  : Before checkin
1cdb0 67 20 74 68 65 20 66 69 6e 61 6c 20 72 65 73 6f  g the final reso
1cdc0 75 72 63 65 73 20 69 6e 20 75 73 65 20 62 79 20  urces in use by 
1cdd0 53 51 4c 69 74 65 2c 20 6d 61 6b 65 0d 0a 20 20  SQLite, make..  
1cde0 20 20 20 20 20 20 23 20 20 20 20 20 20 20 20 20        #         
1cdf0 73 75 72 65 20 62 6f 74 68 20 6f 66 20 74 68 65  sure both of the
1ce00 20 50 52 41 47 4d 41 20 72 65 6c 61 74 65 64 20   PRAGMA related 
1ce10 64 69 72 65 63 74 6f 72 79 20 6e 61 6d 65 73 20  directory names 
1ce20 61 72 65 20 66 72 65 65 64 2e 0d 0a 20 20 20 20  are freed...    
1ce30 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 63      #..        c
1ce40 68 65 63 6b 46 6f 72 53 51 4c 69 74 65 44 69 72  heckForSQLiteDir
1ce50 65 63 74 6f 72 69 65 73 20 24 3a 3a 74 65 73 74  ectories $::test
1ce60 5f 63 68 61 6e 6e 65 6c 20 74 72 75 65 0d 0a 0d  _channel true...
1ce70 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
1ce80 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 6c 73 6f      # NOTE: Also
1ce90 20 72 65 70 6f 72 74 20 74 68 65 20 72 65 73 6f   report the reso
1cea0 75 72 63 65 20 75 73 61 67 65 20 61 66 74 65 72  urce usage after
1ceb0 20 72 75 6e 6e 69 6e 67 20 74 68 65 20 74 65 73   running the tes
1cec0 74 73 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  ts...        #..
1ced0 20 20 20 20 20 20 20 20 72 65 70 6f 72 74 53 51          reportSQ
1cee0 4c 69 74 65 52 65 73 6f 75 72 63 65 73 20 24 3a  LiteResources $:
1cef0 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 0d 0a 0d  :test_channel...
1cf00 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
1cf10 20 20 20 20 23 20 4e 4f 54 45 3a 20 52 65 70 6f      # NOTE: Repo
1cf20 72 74 20 74 68 65 20 63 72 69 74 69 63 61 6c 20  rt the critical 
1cf30 68 61 6e 64 6c 65 20 63 6f 75 6e 74 73 20 61 66  handle counts af
1cf40 74 65 72 20 72 75 6e 6e 69 6e 67 20 74 68 65 20  ter running the 
1cf50 74 65 73 74 73 2e 0d 0a 20 20 20 20 20 20 20 20  tests...        
1cf60 23 0d 0a 20 20 20 20 20 20 20 20 67 65 74 53 51  #..        getSQ
1cf70 4c 69 74 65 48 61 6e 64 6c 65 43 6f 75 6e 74 73  LiteHandleCounts
1cf80 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
1cf90 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d  ..      }..    }
1cfa0 0d 0a 0c 0d 0a 20 20 20 20 23 23 23 23 23 23 23  .....    #######
1cfb0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1cfc0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1cfd0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1cfe0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1cff0 23 23 23 23 0d 0a 20 20 20 20 23 23 23 23 23 23  ####..    ######
1d000 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1d010 23 23 23 23 23 23 23 20 45 4e 44 20 45 61 67 6c  ####### END Eagl
1d020 65 20 4f 4e 4c 59 20 23 23 23 23 23 23 23 23 23  e ONLY #########
1d030 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1d040 23 23 23 23 23 0d 0a 20 20 20 20 23 23 23 23 23  #####..    #####
1d050 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1d060 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1d070 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1d080 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1d090 23 23 23 23 23 23 0d 0a 20 20 7d 0d 0a 0d 0a 20  ######..  }.... 
1d0a0 20 23 0d 0a 20 20 23 20 4e 4f 54 45 3a 20 53 61   #..  # NOTE: Sa
1d0b0 76 65 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  ve the name of t
1d0c0 68 65 20 64 69 72 65 63 74 6f 72 79 20 63 6f 6e  he directory con
1d0d0 74 61 69 6e 69 6e 67 20 74 68 69 73 20 66 69 6c  taining this fil
1d0e0 65 2e 0d 0a 20 20 23 0d 0a 20 20 69 66 20 7b 21  e...  #..  if {!
1d0f0 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 63 6f 6d  [info exists com
1d100 6d 6f 6e 5f 64 69 72 65 63 74 6f 72 79 5d 7d 20  mon_directory]} 
1d110 74 68 65 6e 20 7b 0d 0a 20 20 20 20 73 65 74 20  then {..    set 
1d120 63 6f 6d 6d 6f 6e 5f 64 69 72 65 63 74 6f 72 79  common_directory
1d130 20 5b 66 69 6c 65 20 64 69 72 6e 61 6d 65 20 5b   [file dirname [
1d140 69 6e 66 6f 20 73 63 72 69 70 74 5d 5d 0d 0a 20  info script]].. 
1d150 20 7d 0d 0a 0d 0a 20 20 23 0d 0a 20 20 23 20 4e   }....  #..  # N
1d160 4f 54 45 3a 20 50 72 6f 76 69 64 65 20 74 68 65  OTE: Provide the
1d170 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c   System.Data.SQL
1d180 69 74 65 20 74 65 73 74 20 70 61 63 6b 61 67 65  ite test package
1d190 20 74 6f 20 74 68 65 20 69 6e 74 65 72 70 72 65   to the interpre
1d1a0 74 65 72 2e 0d 0a 20 20 23 0d 0a 20 20 70 61 63  ter...  #..  pac
1d1b0 6b 61 67 65 20 70 72 6f 76 69 64 65 20 53 79 73  kage provide Sys
1d1c0 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e  tem.Data.SQLite.
1d1d0 54 65 73 74 20 31 2e 30 0d 0a 7d 0d 0a           Test 1.0..}..