System.Data.SQLite
Hex Artifact Content
Not logged in

Artifact f69fa8646a29a015111f6a95c739fc3180d635b2:


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 2e 0d 0a 20 20 20  test years...   
1170: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
1180: 72 65 74 75 72 6e 20 5b 6c 69 73 74 20 32 30 30  return [list 200
1190: 35 20 32 30 30 38 20 32 30 31 30 20 32 30 31 32  5 2008 2010 2012
11a0: 20 32 30 31 33 5d 0d 0a 20 20 20 20 20 20 7d 0d   2013]..      }.
11b0: 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70  .    }.....    p
11c0: 72 6f 63 20 67 65 74 42 75 69 6c 64 50 6c 61 74  roc getBuildPlat
11d0: 66 6f 72 6d 20 7b 20 6e 61 74 69 76 65 20 7d 20  form { native } 
11e0: 7b 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 6e  {..      if {[in
11f0: 66 6f 20 65 78 69 73 74 73 20 3a 3a 74 65 73 74  fo exists ::test
1200: 5f 70 6c 61 74 66 6f 72 6d 5d 20 26 26 20 5c 0d  _platform] && \.
1210: 0a 20 20 20 20 20 20 20 20 20 20 5b 73 74 72 69  .          [stri
1220: 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a 74 65 73  ng length $::tes
1230: 74 5f 70 6c 61 74 66 6f 72 6d 5d 20 3e 20 30 7d  t_platform] > 0}
1240: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
1250: 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
1260: 54 45 3a 20 55 73 65 20 74 68 65 20 73 70 65 63  TE: Use the spec
1270: 69 66 69 65 64 20 74 65 73 74 20 70 6c 61 74 66  ified test platf
1280: 6f 72 6d 2e 20 20 49 66 20 74 68 69 73 20 76 61  orm.  If this va
1290: 72 69 61 62 6c 65 20 69 73 20 6e 6f 74 20 73 65  riable is not se
12a0: 74 2c 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  t,..        #   
12b0: 20 20 20 20 74 68 65 20 64 65 66 61 75 6c 74 20      the default 
12c0: 76 61 6c 75 65 20 77 69 6c 6c 20 62 65 20 62 61  value will be ba
12d0: 73 65 64 20 6f 6e 20 74 68 65 20 6d 61 63 68 69  sed on the machi
12e0: 6e 65 20 61 72 63 68 69 74 65 63 74 75 72 65 2e  ne architecture.
12f0: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
1300: 20 20 20 20 20 72 65 74 75 72 6e 20 5b 65 78 70       return [exp
1310: 72 20 7b 24 6e 61 74 69 76 65 20 3f 20 24 3a 3a  r {$native ? $::
1320: 74 65 73 74 5f 70 6c 61 74 66 6f 72 6d 20 3a 20  test_platform : 
1330: 22 22 7d 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c  ""}]..      } el
1340: 73 65 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73  seif {[info exis
1350: 74 73 20 3a 3a 74 65 73 74 5f 6d 61 63 68 69 6e  ts ::test_machin
1360: 65 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20  e] && \..       
1370: 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74     [string lengt
1380: 68 20 24 3a 3a 74 65 73 74 5f 6d 61 63 68 69 6e  h $::test_machin
1390: 65 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  e] > 0} then {..
13a0: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
13b0: 20 20 20 23 20 4e 4f 54 45 3a 20 46 6f 72 20 6e     # NOTE: For n
13c0: 61 74 69 76 65 20 62 75 69 6c 64 73 2c 20 72 65  ative builds, re
13d0: 74 75 72 6e 20 74 68 65 20 70 6c 61 74 66 6f 72  turn the platfor
13e0: 6d 20 6e 61 6d 65 20 63 6f 72 72 65 73 70 6f 6e  m name correspon
13f0: 64 69 6e 67 20 74 6f 0d 0a 20 20 20 20 20 20 20  ding to..       
1400: 20 23 20 20 20 20 20 20 20 74 68 65 20 74 65 73   #       the tes
1410: 74 20 6d 61 63 68 69 6e 65 20 61 72 63 68 69 74  t machine archit
1420: 65 63 74 75 72 65 3b 20 6f 74 68 65 72 77 69 73  ecture; otherwis
1430: 65 2c 20 72 65 74 75 72 6e 20 61 6e 20 65 6d 70  e, return an emp
1440: 74 79 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  ty..        #   
1450: 20 20 20 20 73 74 72 69 6e 67 2e 0d 0a 20 20 20      string...   
1460: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
1470: 72 65 74 75 72 6e 20 5b 65 78 70 72 20 7b 0d 0a  return [expr {..
1480: 20 20 20 20 20 20 20 20 20 20 24 6e 61 74 69 76            $nativ
1490: 65 20 3f 20 5b 6d 61 63 68 69 6e 65 54 6f 50 6c  e ? [machineToPl
14a0: 61 74 66 6f 72 6d 20 24 3a 3a 74 65 73 74 5f 6d  atform $::test_m
14b0: 61 63 68 69 6e 65 5d 20 3a 20 22 22 0d 0a 20 20  achine] : ""..  
14c0: 20 20 20 20 20 20 7d 5d 0d 0a 20 20 20 20 20 20        }]..      
14d0: 7d 20 65 6c 73 65 69 66 20 7b 5b 69 6e 66 6f 20  } elseif {[info 
14e0: 65 78 69 73 74 73 20 3a 3a 74 63 6c 5f 70 6c 61  exists ::tcl_pla
14f0: 74 66 6f 72 6d 28 6d 61 63 68 69 6e 65 29 5d 7d  tform(machine)]}
1500: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
1510: 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
1520: 54 45 3a 20 46 6f 72 20 6e 61 74 69 76 65 20 62  TE: For native b
1530: 75 69 6c 64 73 2c 20 72 65 74 75 72 6e 20 74 68  uilds, return th
1540: 65 20 70 6c 61 74 66 6f 72 6d 20 6e 61 6d 65 20  e platform name 
1550: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f  corresponding to
1560: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
1570: 20 20 74 68 65 20 6d 61 63 68 69 6e 65 20 61 72    the machine ar
1580: 63 68 69 74 65 63 74 75 72 65 3b 20 6f 74 68 65  chitecture; othe
1590: 72 77 69 73 65 2c 20 72 65 74 75 72 6e 20 61 6e  rwise, return an
15a0: 20 65 6d 70 74 79 20 73 74 72 69 6e 67 2e 0d 0a   empty string...
15b0: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
15c0: 20 20 20 72 65 74 75 72 6e 20 5b 65 78 70 72 20     return [expr 
15d0: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 24 6e 61  {..          $na
15e0: 74 69 76 65 20 3f 20 5b 6d 61 63 68 69 6e 65 54  tive ? [machineT
15f0: 6f 50 6c 61 74 66 6f 72 6d 20 24 3a 3a 74 63 6c  oPlatform $::tcl
1600: 5f 70 6c 61 74 66 6f 72 6d 28 6d 61 63 68 69 6e  _platform(machin
1610: 65 29 5d 20 3a 20 22 22 0d 0a 20 20 20 20 20 20  e)] : ""..      
1620: 20 20 7d 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c    }]..      } el
1630: 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d  se {..        #.
1640: 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
1650: 20 4e 6f 20 6d 61 63 68 69 6e 65 20 61 72 63 68   No machine arch
1660: 69 74 65 63 74 75 72 65 20 69 73 20 61 76 61 69  itecture is avai
1670: 6c 61 62 6c 65 2c 20 72 65 74 75 72 6e 20 61 6e  lable, return an
1680: 20 65 6d 70 74 79 20 73 74 72 69 6e 67 2e 0d 0a   empty string...
1690: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
16a0: 20 20 20 72 65 74 75 72 6e 20 22 22 0d 0a 20 20     return ""..  
16b0: 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d      }..    }....
16c0: 0a 20 20 20 20 70 72 6f 63 20 67 65 74 42 75 69  .    proc getBui
16d0: 6c 64 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  ldConfiguration 
16e0: 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20  {} {..      #.. 
16f0: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 65 65       # NOTE: See
1700: 20 69 66 20 74 68 65 20 22 63 6f 6e 66 69 67 75   if the "configu
1710: 72 61 74 69 6f 6e 22 20 73 65 74 74 69 6e 67 20  ration" setting 
1720: 68 61 73 20 62 65 65 6e 20 6f 76 65 72 72 69 64  has been overrid
1730: 64 65 6e 20 62 79 20 74 68 65 0d 0a 20 20 20 20  den by the..    
1740: 20 20 23 20 20 20 20 20 20 20 75 73 65 72 20 28    #       user (
1750: 65 2e 67 2e 20 6f 6e 20 74 68 65 20 63 6f 6d 6d  e.g. on the comm
1760: 61 6e 64 20 6c 69 6e 65 29 2e 20 20 54 68 69 73  and line).  This
1770: 20 68 65 6c 70 73 20 63 6f 6e 74 72 6f 6c 20 65   helps control e
1780: 78 61 63 74 6c 79 0d 0a 20 20 20 20 20 20 23 20  xactly..      # 
1790: 20 20 20 20 20 20 77 68 69 63 68 20 73 65 74 20        which set 
17a0: 6f 66 20 62 69 6e 61 72 69 65 73 20 77 65 20 61  of binaries we a
17b0: 72 65 20 74 65 73 74 69 6e 67 20 28 69 2e 65 2e  re testing (i.e.
17c0: 20 74 68 6f 73 65 20 62 75 69 6c 74 20 69 6e 20   those built in 
17d0: 74 68 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20  the..      #    
17e0: 20 20 20 22 44 65 62 75 67 22 20 6f 72 20 22 52     "Debug" or "R
17f0: 65 6c 65 61 73 65 22 20 62 75 69 6c 64 20 63 6f  elease" build co
1800: 6e 66 69 67 75 72 61 74 69 6f 6e 73 29 2e 20 20  nfigurations).  
1810: 54 6f 20 6f 76 65 72 72 69 64 65 20 74 68 69 73  To override this
1820: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
1830: 76 61 6c 75 65 20 76 69 61 20 74 68 65 20 63 6f  value via the co
1840: 6d 6d 61 6e 64 20 6c 69 6e 65 2c 20 65 6e 74 65  mmand line, ente
1850: 72 20 61 20 63 6f 6d 6d 61 6e 64 20 73 69 6d 69  r a command simi
1860: 6c 61 72 20 74 6f 20 6f 6e 65 20 6f 66 0d 0a 20  lar to one of.. 
1870: 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68 65       #       the
1880: 20 66 6f 6c 6c 6f 77 69 6e 67 20 28 61 6c 6c 20   following (all 
1890: 6f 6e 20 6f 6e 65 20 6c 69 6e 65 29 3a 0d 0a 20  on one line):.. 
18a0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
18b0: 20 20 20 20 20 20 45 61 67 6c 65 53 68 65 6c 6c        EagleShell
18c0: 2e 65 78 65 20 2d 61 6e 79 49 6e 69 74 69 61 6c  .exe -anyInitial
18d0: 69 7a 65 20 22 73 65 74 20 74 65 73 74 5f 63 6f  ize "set test_co
18e0: 6e 66 69 67 75 72 61 74 69 6f 6e 20 44 65 62 75  nfiguration Debu
18f0: 67 22 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  g"..      #     
1900: 20 20 20 20 2d 66 69 6c 65 20 2e 5c 70 61 74 68      -file .\path
1910: 5c 74 6f 5c 61 6c 6c 2e 65 61 67 6c 65 0d 0a 20  \to\all.eagle.. 
1920: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
1930: 20 20 20 20 20 20 45 61 67 6c 65 53 68 65 6c 6c        EagleShell
1940: 2e 65 78 65 20 2d 61 6e 79 49 6e 69 74 69 61 6c  .exe -anyInitial
1950: 69 7a 65 20 22 73 65 74 20 74 65 73 74 5f 63 6f  ize "set test_co
1960: 6e 66 69 67 75 72 61 74 69 6f 6e 20 52 65 6c 65  nfiguration Rele
1970: 61 73 65 22 0d 0a 20 20 20 20 20 20 23 20 20 20  ase"..      #   
1980: 20 20 20 20 20 20 2d 66 69 6c 65 20 2e 5c 70 61        -file .\pa
1990: 74 68 5c 74 6f 5c 61 6c 6c 2e 65 61 67 6c 65 0d  th\to\all.eagle.
19a0: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
19b0: 23 20 20 20 20 20 20 20 45 61 67 6c 65 53 68 65  #       EagleShe
19c0: 6c 6c 2e 65 78 65 20 2d 66 69 6c 65 20 2e 5c 70  ll.exe -file .\p
19d0: 61 74 68 5c 74 6f 5c 61 6c 6c 2e 65 61 67 6c 65  ath\to\all.eagle
19e0: 20 2d 70 72 65 54 65 73 74 0d 0a 20 20 20 20 20   -preTest..     
19f0: 20 23 20 20 20 20 20 20 20 20 20 22 75 6e 73 65   #         "unse
1a00: 74 20 2d 6e 6f 63 6f 6d 70 6c 61 69 6e 20 74 65  t -nocomplain te
1a10: 73 74 5f 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  st_configuration
1a20: 22 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  "..      #..    
1a30: 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73    if {[info exis
1a40: 74 73 20 3a 3a 74 65 73 74 5f 63 6f 6e 66 69 67  ts ::test_config
1a50: 75 72 61 74 69 6f 6e 5d 20 26 26 20 5c 0d 0a 20  uration] && \.. 
1a60: 20 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67           [string
1a70: 20 6c 65 6e 67 74 68 20 24 3a 3a 74 65 73 74 5f   length $::test_
1a80: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 5d 20 3e  configuration] >
1a90: 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
1aa0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
1ab0: 20 4e 4f 54 45 3a 20 55 73 65 20 74 68 65 20 73   NOTE: Use the s
1ac0: 70 65 63 69 66 69 65 64 20 74 65 73 74 20 63 6f  pecified test co
1ad0: 6e 66 69 67 75 72 61 74 69 6f 6e 2e 20 20 54 68  nfiguration.  Th
1ae0: 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20  e default value 
1af0: 75 73 65 64 0d 0a 20 20 20 20 20 20 20 20 23 20  used..        # 
1b00: 20 20 20 20 20 20 66 6f 72 20 74 68 69 73 20 76        for this v
1b10: 61 72 69 61 62 6c 65 20 69 73 20 74 79 70 69 63  ariable is typic
1b20: 61 6c 6c 79 20 22 52 65 6c 65 61 73 65 22 2c 20  ally "Release", 
1b30: 61 73 20 73 65 74 20 62 79 20 74 68 65 20 74 65  as set by the te
1b40: 73 74 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  st..        #   
1b50: 20 20 20 20 73 75 69 74 65 20 69 74 73 65 6c 66      suite itself
1b60: 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
1b70: 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 3a 3a        return $::
1b80: 74 65 73 74 5f 63 6f 6e 66 69 67 75 72 61 74 69  test_configurati
1b90: 6f 6e 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65  on..      } else
1ba0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20   {..        #.. 
1bb0: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4e         # NOTE: N
1bc0: 6f 72 6d 61 6c 6c 79 2c 20 77 65 20 77 69 6c 6c  ormally, we will
1bd0: 20 6e 65 76 65 72 20 68 69 74 20 74 68 69 73 20   never hit this 
1be0: 63 61 73 65 20 62 65 63 61 75 73 65 20 74 68 65  case because the
1bf0: 20 76 61 6c 75 65 20 6f 66 20 74 68 65 0d 0a 20   value of the.. 
1c00: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74         #       t
1c10: 65 73 74 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  est configuratio
1c20: 6e 20 76 61 72 69 61 62 6c 65 20 69 73 20 61 6c  n variable is al
1c30: 77 61 79 73 20 73 65 74 20 62 79 20 74 68 65 20  ways set by the 
1c40: 74 65 73 74 20 73 75 69 74 65 0d 0a 20 20 20 20  test suite..    
1c50: 20 20 20 20 23 20 20 20 20 20 20 20 69 74 73 65      #       itse
1c60: 6c 66 3b 20 68 6f 77 65 76 65 72 2c 20 69 74 20  lf; however, it 
1c70: 63 61 6e 20 62 65 20 6f 76 65 72 72 69 64 64 65  can be overridde
1c80: 6e 20 75 73 69 6e 67 20 74 68 65 20 75 6e 73 65  n using the unse
1c90: 74 20 63 6f 6d 6d 61 6e 64 0d 0a 20 20 20 20 20  t command..     
1ca0: 20 20 20 23 20 20 20 20 20 20 20 66 72 6f 6d 20     #       from 
1cb0: 74 68 65 20 2d 70 72 65 54 65 73 74 20 6f 70 74  the -preTest opt
1cc0: 69 6f 6e 20 74 6f 20 74 68 65 20 74 65 73 74 20  ion to the test 
1cd0: 73 75 69 74 65 2e 0d 0a 20 20 20 20 20 20 20 20  suite...        
1ce0: 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  #..        retur
1cf0: 6e 20 24 3a 3a 65 61 67 6c 65 5f 70 6c 61 74 66  n $::eagle_platf
1d00: 6f 72 6d 28 63 6f 6e 66 69 67 75 72 61 74 69 6f  orm(configuratio
1d10: 6e 29 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20  n)..      }..   
1d20: 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
1d30: 67 65 74 42 75 69 6c 64 43 6f 6e 66 69 67 75 72  getBuildConfigur
1d40: 61 74 69 6f 6e 73 20 7b 7d 20 7b 0d 0a 20 20 20  ations {} {..   
1d50: 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
1d60: 54 45 3a 20 53 65 65 20 69 66 20 74 68 65 20 6c  TE: See if the l
1d70: 69 73 74 20 6f 66 20 74 65 73 74 20 63 6f 6e 66  ist of test conf
1d80: 69 67 75 72 61 74 69 6f 6e 73 20 68 61 73 20 62  igurations has b
1d90: 65 65 6e 20 6f 76 65 72 72 69 64 64 65 6e 20 62  een overridden b
1da0: 79 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  y..      #      
1db0: 20 74 68 65 20 75 73 65 72 20 28 65 2e 67 2e 20   the user (e.g. 
1dc0: 6f 6e 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20 6c  on the command l
1dd0: 69 6e 65 29 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  ine)...      #..
1de0: 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20        if {[info 
1df0: 65 78 69 73 74 73 20 3a 3a 74 65 73 74 5f 63 6f  exists ::test_co
1e00: 6e 66 69 67 75 72 61 74 69 6f 6e 73 5d 20 26 26  nfigurations] &&
1e10: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 6c   \..          [l
1e20: 6c 65 6e 67 74 68 20 24 3a 3a 74 65 73 74 5f 63  length $::test_c
1e30: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 73 5d 20 3e  onfigurations] >
1e40: 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
1e50: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
1e60: 20 4e 4f 54 45 3a 20 55 73 65 20 74 68 65 20 73   NOTE: Use the s
1e70: 70 65 63 69 66 69 65 64 20 6c 69 73 74 20 6f 66  pecified list of
1e80: 20 74 65 73 74 20 63 6f 6e 66 69 67 75 72 61 74   test configurat
1e90: 69 6f 6e 73 2e 0d 0a 20 20 20 20 20 20 20 20 23  ions...        #
1ea0: 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ..        return
1eb0: 20 24 3a 3a 74 65 73 74 5f 63 6f 6e 66 69 67 75   $::test_configu
1ec0: 72 61 74 69 6f 6e 73 0d 0a 20 20 20 20 20 20 7d  rations..      }
1ed0: 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
1ee0: 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
1ef0: 54 45 3a 20 55 73 65 20 74 68 65 20 64 65 66 61  TE: Use the defa
1f00: 75 6c 74 20 6c 69 73 74 20 6f 66 20 74 65 73 74  ult list of test
1f10: 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 73 2e   configurations.
1f20: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
1f30: 20 20 20 20 20 72 65 74 75 72 6e 20 5b 6c 69 73       return [lis
1f40: 74 20 44 65 62 75 67 20 52 65 6c 65 61 73 65 5d  t Debug Release]
1f50: 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d  ..      }..    }
1f60: 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65  .....    proc ge
1f70: 74 42 75 69 6c 64 42 61 73 65 44 69 72 65 63 74  tBuildBaseDirect
1f80: 6f 72 79 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20  ory {} {..      
1f90: 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
1fa0: 20 46 69 67 75 72 65 20 6f 75 74 20 74 68 65 20   Figure out the 
1fb0: 62 61 73 65 20 64 69 72 65 63 74 6f 72 79 20 77  base directory w
1fc0: 68 65 72 65 20 61 6c 6c 20 74 68 65 20 62 75 69  here all the bui
1fd0: 6c 64 73 20 73 68 6f 75 6c 64 20 62 65 0d 0a 20  lds should be.. 
1fe0: 20 20 20 20 20 23 20 20 20 20 20 20 20 6c 6f 63       #       loc
1ff0: 61 74 65 64 2e 20 20 54 68 69 73 20 77 69 6c 6c  ated.  This will
2000: 20 62 65 20 74 68 65 20 64 69 72 65 63 74 6f 72   be the director
2010: 79 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20  y that contains 
2020: 74 68 65 20 61 63 74 75 61 6c 0d 0a 20 20 20 20  the actual..    
2030: 20 20 23 20 20 20 20 20 20 20 62 75 69 6c 64 20    #       build 
2040: 6f 75 74 70 75 74 20 64 69 72 65 63 74 6f 72 79  output directory
2050: 20 28 65 2e 67 2e 20 70 61 72 65 6e 74 20 6f 66   (e.g. parent of
2060: 20 22 62 69 6e 22 29 2e 0d 0a 20 20 20 20 20 20   "bin")...      
2070: 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 6e  #..      if {[in
2080: 66 6f 20 65 78 69 73 74 73 20 3a 3a 62 75 69 6c  fo exists ::buil
2090: 64 5f 62 61 73 65 5f 64 69 72 65 63 74 6f 72 79  d_base_directory
20a0: 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20  ] && \..        
20b0: 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68    [string length
20c0: 20 24 3a 3a 62 75 69 6c 64 5f 62 61 73 65 5f 64   $::build_base_d
20d0: 69 72 65 63 74 6f 72 79 5d 20 3e 20 30 7d 20 74  irectory] > 0} t
20e0: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  hen {..        #
20f0: 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
2100: 3a 20 54 68 65 20 6c 6f 63 61 74 69 6f 6e 20 6f  : The location o
2110: 66 20 74 68 65 20 62 75 69 6c 64 20 62 61 73 65  f the build base
2120: 20 64 69 72 65 63 74 6f 72 79 20 68 61 73 20 62   directory has b
2130: 65 65 6e 20 6f 76 65 72 72 69 64 64 65 6e 3b 0d  een overridden;.
2140: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
2150: 20 74 68 65 72 65 66 6f 72 65 2c 20 75 73 65 20   therefore, use 
2160: 69 74 20 76 65 72 62 61 74 69 6d 2e 0d 0a 20 20  it verbatim...  
2170: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
2180: 20 72 65 74 75 72 6e 20 24 3a 3a 62 75 69 6c 64   return $::build
2190: 5f 62 61 73 65 5f 64 69 72 65 63 74 6f 72 79 0d  _base_directory.
21a0: 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 69 66 20  .      } elseif 
21b0: 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  {[info exists ::
21c0: 63 6f 6d 6d 6f 6e 5f 64 69 72 65 63 74 6f 72 79  common_directory
21d0: 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20  ] && \..        
21e0: 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68    [string length
21f0: 20 24 3a 3a 63 6f 6d 6d 6f 6e 5f 64 69 72 65 63   $::common_direc
2200: 74 6f 72 79 5d 20 3e 20 30 7d 20 74 68 65 6e 20  tory] > 0} then 
2210: 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
2220: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4e 65        # NOTE: Ne
2230: 78 74 2c 20 66 61 6c 6c 62 61 63 6b 20 74 6f 20  xt, fallback to 
2240: 74 68 65 20 70 61 72 65 6e 74 20 64 69 72 65 63  the parent direc
2250: 74 6f 72 79 20 6f 66 20 74 68 65 20 6f 6e 65 20  tory of the one 
2260: 63 6f 6e 74 61 69 6e 69 6e 67 0d 0a 20 20 20 20  containing..    
2270: 20 20 20 20 23 20 20 20 20 20 20 20 74 68 69 73      #       this
2280: 20 66 69 6c 65 20 28 69 2e 65 2e 20 22 63 6f 6d   file (i.e. "com
2290: 6d 6f 6e 2e 65 61 67 6c 65 22 29 2c 20 69 66 20  mon.eagle"), if 
22a0: 61 76 61 69 6c 61 62 6c 65 2e 0d 0a 20 20 20 20  available...    
22b0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72      #..        r
22c0: 65 74 75 72 6e 20 5b 66 69 6c 65 20 64 69 72 6e  eturn [file dirn
22d0: 61 6d 65 20 24 3a 3a 63 6f 6d 6d 6f 6e 5f 64 69  ame $::common_di
22e0: 72 65 63 74 6f 72 79 5d 0d 0a 20 20 20 20 20 20  rectory]..      
22f0: 7d 20 65 6c 73 65 69 66 20 7b 5b 69 6e 66 6f 20  } elseif {[info 
2300: 65 78 69 73 74 73 20 3a 3a 70 61 74 68 5d 20 26  exists ::path] &
2310: 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b  & \..          [
2320: 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a  string length $:
2330: 3a 70 61 74 68 5d 20 3e 20 30 7d 20 74 68 65 6e  :path] > 0} then
2340: 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20   {..        #.. 
2350: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 46         # NOTE: F
2360: 69 6e 61 6c 6c 79 2c 20 66 61 6c 6c 62 61 63 6b  inally, fallback
2370: 20 74 6f 20 74 68 65 20 70 61 72 65 6e 74 20 64   to the parent d
2380: 69 72 65 63 74 6f 72 79 20 6f 66 20 74 68 65 20  irectory of the 
2390: 45 61 67 6c 65 54 65 73 74 0d 0a 20 20 20 20 20  EagleTest..     
23a0: 20 20 20 23 20 20 20 20 20 20 20 70 61 74 68 2e     #       path.
23b0: 20 20 54 68 65 20 45 61 67 6c 65 54 65 73 74 20    The EagleTest 
23c0: 70 61 63 6b 61 67 65 20 67 75 61 72 61 6e 74 65  package guarante
23d0: 65 73 20 74 68 61 74 20 74 68 69 73 20 76 61 72  es that this var
23e0: 69 61 62 6c 65 0d 0a 20 20 20 20 20 20 20 20 23  iable..        #
23f0: 20 20 20 20 20 20 20 77 69 6c 6c 20 62 65 20 73         will be s
2400: 65 74 20 74 6f 20 74 68 65 20 64 69 72 65 63 74  et to the direct
2410: 6f 72 79 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ory containing t
2420: 68 65 20 66 69 72 73 74 20 66 69 6c 65 20 74 6f  he first file to
2430: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
2440: 20 20 65 78 65 63 75 74 65 20 74 68 65 20 5b 72    execute the [r
2450: 75 6e 54 65 73 74 50 72 6f 6c 6f 67 75 65 5d 20  unTestPrologue] 
2460: 73 63 72 69 70 74 20 6c 69 62 72 61 72 79 20 70  script library p
2470: 72 6f 63 65 64 75 72 65 2e 0d 0a 20 20 20 20 20  rocedure...     
2480: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65     #..        re
2490: 74 75 72 6e 20 5b 66 69 6c 65 20 64 69 72 6e 61  turn [file dirna
24a0: 6d 65 20 24 3a 3a 70 61 74 68 5d 0d 0a 20 20 20  me $::path]..   
24b0: 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
24c0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
24d0: 23 20 4e 4f 54 45 3a 20 4e 6f 20 70 61 74 68 20  # NOTE: No path 
24e0: 69 73 20 61 76 61 69 6c 61 62 6c 65 2c 20 72 65  is available, re
24f0: 74 75 72 6e 20 61 6e 20 65 6d 70 74 79 20 73 74  turn an empty st
2500: 72 69 6e 67 2e 20 20 54 68 69 73 20 70 6f 69 6e  ring.  This poin
2510: 74 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  t..        #    
2520: 20 20 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65     should not be
2530: 20 72 65 61 63 68 65 64 2e 0d 0a 20 20 20 20 20   reached...     
2540: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65     #..        re
2550: 74 75 72 6e 20 22 22 0d 0a 20 20 20 20 20 20 7d  turn ""..      }
2560: 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
2570: 70 72 6f 63 20 69 73 4d 69 78 65 64 4d 6f 64 65  proc isMixedMode
2580: 41 73 73 65 6d 62 6c 79 20 7b 20 66 69 6c 65 4e  Assembly { fileN
2590: 61 6d 65 20 7b 76 61 72 4e 61 6d 65 20 22 22 7d  ame {varName ""}
25a0: 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20   } {..      #.. 
25b0: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 46 69 72       # NOTE: Fir
25c0: 73 74 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68  st, make sure th
25d0: 65 20 74 65 73 74 20 73 75 69 74 65 20 69 6e 66  e test suite inf
25e0: 72 61 73 74 72 75 63 74 75 72 65 20 69 73 20 61  rastructure is a
25f0: 6c 6c 6f 77 65 64 20 74 6f 0d 0a 20 20 20 20 20  llowed to..     
2600: 20 23 20 20 20 20 20 20 20 75 73 65 20 74 68 65   #       use the
2610: 20 5b 65 78 65 63 5d 20 63 6f 6d 6d 61 6e 64 2e   [exec] command.
2620: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
2630: 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73   if {![info exis
2640: 74 73 20 3a 3a 6e 6f 28 65 78 65 63 29 5d 20 26  ts ::no(exec)] &
2650: 26 20 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20  & ![info exists 
2660: 3a 3a 6e 6f 28 63 6f 72 46 6c 61 67 73 29 5d 7d  ::no(corFlags)]}
2670: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
2680: 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
2690: 54 45 3a 20 49 66 20 74 68 65 20 6c 6f 63 61 74  TE: If the locat
26a0: 69 6f 6e 20 6f 66 20 43 6f 72 46 6c 61 67 73 20  ion of CorFlags 
26b0: 69 73 20 70 72 65 73 65 6e 74 20 69 6e 20 74 68  is present in th
26c0: 65 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 2c 0d 0a  e environment,..
26d0: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
26e0: 75 73 65 20 69 74 3b 20 6f 74 68 65 72 77 69 73  use it; otherwis
26f0: 65 20 61 73 73 75 6d 65 20 69 74 20 69 73 20 69  e assume it is i
2700: 6e 20 74 68 65 20 50 41 54 48 2e 0d 0a 20 20 20  n the PATH...   
2710: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
2720: 73 65 74 20 63 6f 72 46 6c 61 67 73 20 5b 65 78  set corFlags [ex
2730: 70 72 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  pr {..          
2740: 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 65  [info exists ::e
2750: 6e 76 28 43 6f 72 46 6c 61 67 73 29 5d 20 3f 20  nv(CorFlags)] ? 
2760: 24 3a 3a 65 6e 76 28 43 6f 72 46 6c 61 67 73 29  $::env(CorFlags)
2770: 20 3a 20 22 43 6f 72 46 6c 61 67 73 22 0d 0a 20   : "CorFlags".. 
2780: 20 20 20 20 20 20 20 7d 5d 0d 0a 0d 0a 20 20 20         }]....   
2790: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
27a0: 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74 20  # NOTE: Attempt 
27b0: 74 6f 20 65 78 65 63 75 74 65 20 43 6f 72 46 6c  to execute CorFl
27c0: 61 67 73 20 6f 6e 20 74 68 65 20 73 70 65 63 69  ags on the speci
27d0: 66 69 65 64 20 66 69 6c 65 2e 0d 0a 20 20 20 20  fied file...    
27e0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 69      #..        i
27f0: 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20  f {[catch {..   
2800: 20 20 20 20 20 20 20 65 78 65 63 20 2d 2d 20 24         exec -- $
2810: 63 6f 72 46 6c 61 67 73 20 5b 66 69 6c 65 20 6e  corFlags [file n
2820: 61 74 69 76 65 6e 61 6d 65 20 24 66 69 6c 65 4e  ativename $fileN
2830: 61 6d 65 5d 0d 0a 20 20 20 20 20 20 20 20 7d 20  ame]..        } 
2840: 65 78 65 63 5d 20 3d 3d 20 30 7d 20 74 68 65 6e  exec] == 0} then
2850: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d   {..          #.
2860: 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54  .          # NOT
2870: 45 3a 20 49 66 20 72 65 71 75 65 73 74 65 64 20  E: If requested 
2880: 62 79 20 6f 75 72 20 63 61 6c 6c 65 72 2c 20 61  by our caller, a
2890: 74 74 65 6d 70 74 20 74 6f 20 64 65 74 65 72 6d  ttempt to determ
28a0: 69 6e 65 20 74 68 65 0d 0a 20 20 20 20 20 20 20  ine the..       
28b0: 20 20 20 23 20 20 20 20 20 20 20 70 6c 61 74 66     #       platf
28c0: 6f 72 6d 20 66 6f 72 20 74 68 65 20 73 70 65 63  orm for the spec
28d0: 69 66 69 65 64 20 66 69 6c 65 20 61 73 20 77 65  ified file as we
28e0: 6c 6c 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23  ll...          #
28f0: 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b  ..          if {
2900: 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
2910: 76 61 72 4e 61 6d 65 5d 20 3e 20 30 7d 20 74 68  varName] > 0} th
2920: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
2930: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20    #..           
2940: 20 23 20 4e 4f 54 45 3a 20 53 74 6f 72 65 20 74   # NOTE: Store t
2950: 68 65 20 70 6c 61 74 66 6f 72 6d 20 69 6e 20 74  he platform in t
2960: 68 65 20 6e 61 6d 65 64 20 76 61 72 69 61 62 6c  he named variabl
2970: 65 20 69 6e 20 74 68 65 0d 0a 20 20 20 20 20 20  e in the..      
2980: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63 6f        #       co
2990: 6e 74 65 78 74 20 6f 66 20 6f 75 72 20 63 61 6c  ntext of our cal
29a0: 6c 65 72 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  ler...          
29b0: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20    #..           
29c0: 20 75 70 76 61 72 20 31 20 24 76 61 72 4e 61 6d   upvar 1 $varNam
29d0: 65 20 70 6c 61 74 66 6f 72 6d 0d 0a 0d 0a 20 20  e platform....  
29e0: 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
29f0: 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a           # NOTE:
2a00: 20 41 74 74 65 6d 70 74 20 74 6f 20 65 78 74 72   Attempt to extr
2a10: 61 63 74 20 74 68 65 20 50 45 20 6c 69 6e 65 20  act the PE line 
2a20: 66 72 6f 6d 20 74 68 65 20 63 61 70 74 75 72 65  from the capture
2a30: 64 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23  d..            #
2a40: 20 20 20 20 20 20 20 6f 75 74 70 75 74 2e 20 20         output.  
2a50: 49 66 20 74 68 69 73 20 76 61 6c 75 65 20 69 73  If this value is
2a60: 20 22 50 45 33 32 22 20 6f 72 20 22 50 45 33 32   "PE32" or "PE32
2a70: 2b 22 2c 20 74 68 65 0d 0a 20 20 20 20 20 20 20  +", the..       
2a80: 20 20 20 20 20 23 20 20 20 20 20 20 20 61 73 73       #       ass
2a90: 65 6d 62 6c 79 20 66 69 6c 65 20 69 73 20 33 32  embly file is 32
2aa0: 2d 62 69 74 20 6f 72 20 36 34 2d 62 69 74 2c 20  -bit or 64-bit, 
2ab0: 72 65 73 70 65 63 74 69 76 65 6c 79 3b 0d 0a 20  respectively;.. 
2ac0: 20 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20             #    
2ad0: 20 20 20 6f 74 68 65 72 77 69 73 65 2c 20 69 74     otherwise, it
2ae0: 73 20 74 79 70 65 20 69 73 20 75 6e 6b 6e 6f 77  s type is unknow
2af0: 6e 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  n...            
2b00: 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  #..            s
2b10: 65 74 20 70 61 74 74 65 72 6e 20 7b 5e 50 45 20  et pattern {^PE 
2b20: 20 20 20 20 20 20 20 3a 20 28 50 45 33 32 7c 50         : (PE32|P
2b30: 45 33 32 5c 2b 29 5c 73 2b 24 7d 0d 0a 0d 0a 20  E32\+)\s+$}.... 
2b40: 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b             if {[
2b50: 72 65 67 65 78 70 20 2d 6c 69 6e 65 20 2d 2d 20  regexp -line -- 
2b60: 24 70 61 74 74 65 72 6e 20 24 65 78 65 63 20 64  $pattern $exec d
2b70: 75 6d 6d 79 20 70 65 33 32 5d 7d 20 74 68 65 6e  ummy pe32]} then
2b80: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
2b90: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20    #..           
2ba0: 20 20 20 23 20 48 41 43 4b 3a 20 54 68 69 73 20     # HACK: This 
2bb0: 5b 73 77 69 74 63 68 5d 20 61 73 73 75 6d 65 73  [switch] assumes
2bc0: 20 74 68 61 74 20 33 32 2d 62 69 74 20 65 78 65   that 32-bit exe
2bd0: 63 75 74 61 62 6c 65 73 20 61 72 65 0d 0a 20 20  cutables are..  
2be0: 20 20 20 20 20 20 20 20 20 20 20 20 23 20 20 20              #   
2bf0: 20 20 20 20 61 6c 77 61 79 73 20 78 38 36 20 61      always x86 a
2c00: 6e 64 20 74 68 61 74 20 36 34 2d 62 69 74 20 65  nd that 64-bit e
2c10: 78 65 63 75 74 61 62 6c 65 73 20 61 72 65 20 61  xecutables are a
2c20: 6c 77 61 79 73 0d 0a 20 20 20 20 20 20 20 20 20  lways..         
2c30: 20 20 20 20 20 23 20 20 20 20 20 20 20 78 36 34       #       x64
2c40: 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
2c50: 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   #..            
2c60: 20 20 73 77 69 74 63 68 20 2d 65 78 61 63 74 20    switch -exact 
2c70: 2d 2d 20 24 70 65 33 32 20 7b 0d 0a 20 20 20 20  -- $pe32 {..    
2c80: 20 20 20 20 20 20 20 20 20 20 20 20 50 45 33 32              PE32
2c90: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
2ca0: 20 20 20 20 20 20 73 65 74 20 70 6c 61 74 66 6f        set platfo
2cb0: 72 6d 20 57 69 6e 33 32 0d 0a 20 20 20 20 20 20  rm Win32..      
2cc0: 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
2cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 50 45 33               PE3
2ce0: 32 2b 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  2+ {..          
2cf0: 20 20 20 20 20 20 20 20 73 65 74 20 70 6c 61 74          set plat
2d00: 66 6f 72 6d 20 78 36 34 0d 0a 20 20 20 20 20 20  form x64..      
2d10: 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
2d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 64 65 66               def
2d30: 61 75 6c 74 20 7b 0d 0a 20 20 20 20 20 20 20 20  ault {..        
2d40: 20 20 20 20 20 20 20 20 20 20 73 65 74 20 70 6c            set pl
2d50: 61 74 66 6f 72 6d 20 22 22 0d 0a 20 20 20 20 20  atform ""..     
2d60: 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
2d70: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
2d80: 20 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73             } els
2d90: 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e {..           
2da0: 20 20 20 73 65 74 20 70 6c 61 74 66 6f 72 6d 20     set platform 
2db0: 22 22 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ""..            
2dc0: 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  }..          }..
2dd0: 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20  ..          #.. 
2de0: 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a           # NOTE:
2df0: 20 41 74 74 65 6d 70 74 20 74 6f 20 65 78 74 72   Attempt to extr
2e00: 61 63 74 20 74 68 65 20 49 4c 4f 4e 4c 59 20 6c  act the ILONLY l
2e10: 69 6e 65 20 66 72 6f 6d 20 74 68 65 20 63 61 70  ine from the cap
2e20: 74 75 72 65 64 0d 0a 20 20 20 20 20 20 20 20 20  tured..         
2e30: 20 23 20 20 20 20 20 20 20 6f 75 74 70 75 74 2e   #       output.
2e40: 20 20 49 66 20 74 68 69 73 20 76 61 6c 75 65 20    If this value 
2e50: 69 73 20 7a 65 72 6f 2c 20 74 68 65 20 73 70 65  is zero, the spe
2e60: 63 69 66 69 65 64 20 66 69 6c 65 20 6d 75 73 74  cified file must
2e70: 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 20 20  ..          #   
2e80: 20 20 20 20 62 65 20 61 20 6d 69 78 65 64 2d 6d      be a mixed-m
2e90: 6f 64 65 20 61 73 73 65 6d 62 6c 79 3b 20 6f 74  ode assembly; ot
2ea0: 68 65 72 77 69 73 65 2c 20 69 74 20 63 6f 6e 74  herwise, it cont
2eb0: 61 69 6e 73 20 6f 6e 6c 79 0d 0a 20 20 20 20 20  ains only..     
2ec0: 20 20 20 20 20 23 20 20 20 20 20 20 20 6d 61 6e       #       man
2ed0: 61 67 65 64 20 63 6f 6d 70 6f 6e 65 6e 74 73 2e  aged components.
2ee0: 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20  ..          #.. 
2ef0: 20 20 20 20 20 20 20 20 20 73 65 74 20 70 61 74           set pat
2f00: 74 65 72 6e 20 7b 5e 49 4c 4f 4e 4c 59 20 20 20  tern {^ILONLY   
2f10: 20 3a 20 28 30 7c 31 29 5c 73 2b 24 7d 0d 0a 0d   : (0|1)\s+$}...
2f20: 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21  .          if {!
2f30: 5b 72 65 67 65 78 70 20 2d 6c 69 6e 65 20 2d 2d  [regexp -line --
2f40: 20 24 70 61 74 74 65 72 6e 20 24 65 78 65 63 20   $pattern $exec 
2f50: 64 75 6d 6d 79 20 69 6c 4f 6e 6c 79 5d 7d 20 74  dummy ilOnly]} t
2f60: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
2f70: 20 20 20 72 65 74 75 72 6e 20 66 61 6c 73 65 0d     return false.
2f80: 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  .          }....
2f90: 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 24            if {!$
2fa0: 69 6c 4f 6e 6c 79 7d 20 74 68 65 6e 20 7b 0d 0a  ilOnly} then {..
2fb0: 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
2fc0: 72 6e 20 74 72 75 65 0d 0a 20 20 20 20 20 20 20  rn true..       
2fd0: 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d     }..        }.
2fe0: 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
2ff0: 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
3000: 45 3a 20 49 66 20 74 68 65 20 74 65 73 74 20 73  E: If the test s
3010: 75 69 74 65 20 63 61 6e 6e 6f 74 20 75 73 65 20  uite cannot use 
3020: 5b 65 78 65 63 5d 20 6f 72 20 65 78 65 63 75 74  [exec] or execut
3030: 69 6f 6e 20 6f 66 20 43 6f 72 46 6c 61 67 73 0d  ion of CorFlags.
3040: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 66  .      #       f
3050: 61 69 6c 65 64 2c 20 72 65 74 75 72 6e 20 66 61  ailed, return fa
3060: 6c 73 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  lse...      #.. 
3070: 20 20 20 20 20 72 65 74 75 72 6e 20 66 61 6c 73       return fals
3080: 65 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  e..    }.....   
3090: 20 70 72 6f 63 20 69 73 42 75 69 6c 64 41 76 61   proc isBuildAva
30a0: 69 6c 61 62 6c 65 20 7b 20 6e 61 74 69 76 65 20  ilable { native 
30b0: 64 69 72 65 63 74 6f 72 79 20 7b 76 61 72 4e 61  directory {varNa
30c0: 6d 65 20 22 22 7d 20 7d 20 7b 0d 0a 20 20 20 20  me ""} } {..    
30d0: 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
30e0: 45 3a 20 42 75 69 6c 64 20 74 68 65 20 66 75 6c  E: Build the ful
30f0: 6c 79 20 71 75 61 6c 69 66 69 65 64 20 66 69 6c  ly qualified fil
3100: 65 20 6e 61 6d 65 20 66 6f 72 20 74 68 65 20 70  e name for the p
3110: 72 69 6d 61 72 79 20 61 73 73 65 6d 62 6c 79 0d  rimary assembly.
3120: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63  .      #       c
3130: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 53 79  ontaining the Sy
3140: 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
3150: 20 6d 61 6e 61 67 65 64 20 63 6f 6d 70 6f 6e 65   managed compone
3160: 6e 74 73 2e 20 20 49 74 0d 0a 20 20 20 20 20 20  nts.  It..      
3170: 23 20 20 20 20 20 20 20 73 68 6f 75 6c 64 20 62  #       should b
3180: 65 20 6e 6f 74 65 64 20 74 68 61 74 20 74 68 69  e noted that thi
3190: 73 20 61 73 73 65 6d 62 6c 79 20 66 69 6c 65 20  s assembly file 
31a0: 6d 61 79 20 61 6c 73 6f 20 63 6f 6e 74 61 69 6e  may also contain
31b0: 20 74 68 65 0d 0a 20 20 20 20 20 20 23 20 20 20   the..      #   
31c0: 20 20 20 20 6e 61 74 69 76 65 20 63 6f 6d 70 6f      native compo
31d0: 6e 65 6e 74 73 2c 20 69 66 20 61 20 6e 61 74 69  nents, if a nati
31e0: 76 65 20 62 75 69 6c 64 20 69 73 20 69 6e 20 75  ve build is in u
31f0: 73 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  se...      #..  
3200: 20 20 20 20 73 65 74 20 66 69 6c 65 4e 61 6d 65      set fileName
3210: 20 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d   [file nativenam
3220: 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 24 64 69  e [file join $di
3230: 72 65 63 74 6f 72 79 20 5c 0d 0a 20 20 20 20 20  rectory \..     
3240: 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61       System.Data
3250: 2e 53 51 4c 69 74 65 2e 64 6c 6c 5d 5d 0d 0a 0d  .SQLite.dll]]...
3260: 0a 20 20 20 20 20 20 69 66 20 7b 21 5b 66 69 6c  .      if {![fil
3270: 65 20 65 78 69 73 74 73 20 24 66 69 6c 65 4e 61  e exists $fileNa
3280: 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  me]} then {..   
3290: 20 20 20 20 20 72 65 74 75 72 6e 20 66 61 6c 73       return fals
32a0: 65 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  e..      }....  
32b0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
32c0: 4f 54 45 3a 20 41 74 74 65 6d 70 74 20 74 6f 20  OTE: Attempt to 
32d0: 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65  automatically de
32e0: 74 65 63 74 20 69 66 20 74 68 65 20 70 72 69 6d  tect if the prim
32f0: 61 72 79 20 61 73 73 65 6d 62 6c 79 0d 0a 20 20  ary assembly..  
3300: 20 20 20 20 23 20 20 20 20 20 20 20 63 6f 6e 74      #       cont
3310: 61 69 6e 73 20 61 6e 79 20 6e 61 74 69 76 65 20  ains any native 
3320: 63 6f 6d 70 6f 6e 65 6e 74 73 2c 20 69 66 20 6e  components, if n
3330: 65 63 65 73 73 61 72 79 2e 0d 0a 20 20 20 20 20  ecessary...     
3340: 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 73   #..      if {[s
3350: 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 6e 61  tring length $na
3360: 74 69 76 65 5d 20 3d 3d 20 30 7d 20 74 68 65 6e  tive] == 0} then
3370: 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b   {..        if {
3380: 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
3390: 76 61 72 4e 61 6d 65 5d 20 3e 20 30 7d 20 74 68  varName] > 0} th
33a0: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
33b0: 75 70 76 61 72 20 31 20 24 76 61 72 4e 61 6d 65  upvar 1 $varName
33c0: 20 24 76 61 72 4e 61 6d 65 0d 0a 20 20 20 20 20   $varName..     
33d0: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
33e0: 73 65 74 20 6e 61 74 69 76 65 20 5b 69 73 4d 69  set native [isMi
33f0: 78 65 64 4d 6f 64 65 41 73 73 65 6d 62 6c 79 20  xedModeAssembly 
3400: 24 66 69 6c 65 4e 61 6d 65 20 24 76 61 72 4e 61  $fileName $varNa
3410: 6d 65 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a  me]..      }....
3420: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
3430: 20 4e 4f 54 45 3a 20 49 66 20 74 68 65 20 70 72   NOTE: If the pr
3440: 69 6d 61 72 79 20 61 73 73 65 6d 62 6c 79 20 61  imary assembly a
3450: 6c 73 6f 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  lso contains the
3460: 20 6e 61 74 69 76 65 20 63 6f 6d 70 6f 6e 65 6e   native componen
3470: 74 73 2c 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ts,..      #    
3480: 20 20 20 77 65 20 68 61 76 65 20 65 76 65 72 79     we have every
3490: 74 68 69 6e 67 20 77 65 20 6e 65 65 64 2e 0d 0a  thing we need...
34a0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69        #..      i
34b0: 66 20 7b 24 6e 61 74 69 76 65 7d 20 74 68 65 6e  f {$native} then
34c0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75   {..        retu
34d0: 72 6e 20 74 72 75 65 0d 0a 20 20 20 20 20 20 7d  rn true..      }
34e0: 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  ....      #..   
34f0: 20 20 20 23 20 4e 4f 54 45 3a 20 42 75 69 6c 64     # NOTE: Build
3500: 20 74 68 65 20 66 75 6c 6c 79 20 71 75 61 6c 69   the fully quali
3510: 66 69 65 64 20 66 69 6c 65 20 6e 61 6d 65 20 66  fied file name f
3520: 6f 72 20 74 68 65 20 69 6e 74 65 72 6f 70 20 61  or the interop a
3530: 73 73 65 6d 62 6c 79 0d 0a 20 20 20 20 20 20 23  ssembly..      #
3540: 20 20 20 20 20 20 20 63 6f 6e 74 61 69 6e 69 6e         containin
3550: 67 20 74 68 65 20 53 79 73 74 65 6d 2e 44 61 74  g the System.Dat
3560: 61 2e 53 51 4c 69 74 65 20 6e 61 74 69 76 65 20  a.SQLite native 
3570: 63 6f 6d 70 6f 6e 65 6e 74 73 2e 20 20 49 66 20  components.  If 
3580: 74 68 69 73 0d 0a 20 20 20 20 20 20 23 20 20 20  this..      #   
3590: 20 20 20 20 66 69 6c 65 20 65 78 69 73 74 73 2c      file exists,
35a0: 20 77 65 20 73 68 6f 75 6c 64 20 68 61 76 65 20   we should have 
35b0: 65 76 65 72 79 74 68 69 6e 67 20 77 65 20 6e 65  everything we ne
35c0: 65 64 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  ed...      #..  
35d0: 20 20 20 20 73 65 74 20 66 69 6c 65 4e 61 6d 65      set fileName
35e0: 20 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d   [file nativenam
35f0: 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 24 64 69  e [file join $di
3600: 72 65 63 74 6f 72 79 20 5c 0d 0a 20 20 20 20 20  rectory \..     
3610: 20 20 20 20 20 53 51 4c 69 74 65 2e 49 6e 74 65       SQLite.Inte
3620: 72 6f 70 2e 64 6c 6c 5d 5d 0d 0a 0d 0a 20 20 20  rop.dll]]....   
3630: 20 20 20 69 66 20 7b 5b 66 69 6c 65 20 65 78 69     if {[file exi
3640: 73 74 73 20 24 66 69 6c 65 4e 61 6d 65 5d 7d 20  sts $fileName]} 
3650: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
3660: 72 65 74 75 72 6e 20 74 72 75 65 0d 0a 20 20 20  return true..   
3670: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d     }....      #.
3680: 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 42  .      # NOTE: B
3690: 75 69 6c 64 20 74 68 65 20 66 75 6c 6c 79 20 71  uild the fully q
36a0: 75 61 6c 69 66 69 65 64 20 66 69 6c 65 20 6e 61  ualified file na
36b0: 6d 65 20 66 6f 72 20 74 68 65 20 53 51 4c 69 74  me for the SQLit
36c0: 65 20 63 6f 72 65 0d 0a 20 20 20 20 20 20 23 20  e core..      # 
36d0: 20 20 20 20 20 20 6c 69 62 72 61 72 79 2e 20 20        library.  
36e0: 49 66 20 74 68 69 73 20 66 69 6c 65 20 65 78 69  If this file exi
36f0: 73 74 73 2c 20 77 65 20 73 68 6f 75 6c 64 20 68  sts, we should h
3700: 61 76 65 20 65 76 65 72 79 74 68 69 6e 67 20 77  ave everything w
3710: 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  e..      #      
3720: 20 6e 65 65 64 2e 0d 0a 20 20 20 20 20 20 23 0d   need...      #.
3730: 0a 20 20 20 20 20 20 73 65 74 20 66 69 6c 65 4e  .      set fileN
3740: 61 6d 65 20 5b 66 69 6c 65 20 6e 61 74 69 76 65  ame [file native
3750: 6e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20  name [file join 
3760: 24 64 69 72 65 63 74 6f 72 79 20 5c 0d 0a 20 20  $directory \..  
3770: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 2e          sqlite3.
3780: 64 6c 6c 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 69  dll]]....      i
3790: 66 20 7b 5b 66 69 6c 65 20 65 78 69 73 74 73 20  f {[file exists 
37a0: 24 66 69 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e  $fileName]} then
37b0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75   {..        retu
37c0: 72 6e 20 74 72 75 65 0d 0a 20 20 20 20 20 20 7d  rn true..      }
37d0: 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  ....      #..   
37e0: 20 20 20 23 20 4e 4f 54 45 3a 20 4f 6e 65 20 6f     # NOTE: One o
37f0: 72 20 6d 6f 72 65 20 6e 61 74 69 76 65 20 63 6f  r more native co
3800: 6d 70 6f 6e 65 6e 74 73 20 6e 65 65 64 65 64 20  mponents needed 
3810: 62 79 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53  by System.Data.S
3820: 51 4c 69 74 65 0d 0a 20 20 20 20 20 20 23 20 20  QLite..      #  
3830: 20 20 20 20 20 61 72 65 20 6d 69 73 73 69 6e 67       are missing
3840: 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
3850: 20 20 72 65 74 75 72 6e 20 66 61 6c 73 65 0d 0a    return false..
3860: 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
3870: 6f 63 20 69 73 52 65 6c 65 61 73 65 41 76 61 69  oc isReleaseAvai
3880: 6c 61 62 6c 65 20 7b 20 64 69 72 65 63 74 6f 72  lable { director
3890: 79 20 7b 76 61 72 4e 61 6d 65 20 22 22 7d 20 7d  y {varName ""} }
38a0: 20 7b 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 73   {..      if {[s
38b0: 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 76 61  tring length $va
38c0: 72 4e 61 6d 65 5d 20 3e 20 30 7d 20 74 68 65 6e  rName] > 0} then
38d0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 75 70 76 61   {..        upva
38e0: 72 20 31 20 24 76 61 72 4e 61 6d 65 20 24 76 61  r 1 $varName $va
38f0: 72 4e 61 6d 65 0d 0a 20 20 20 20 20 20 7d 0d 0a  rName..      }..
3900: 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b  ..      return [
3910: 69 73 42 75 69 6c 64 41 76 61 69 6c 61 62 6c 65  isBuildAvailable
3920: 20 22 22 20 24 64 69 72 65 63 74 6f 72 79 20 24   "" $directory $
3930: 76 61 72 4e 61 6d 65 5d 0d 0a 20 20 20 20 7d 0d  varName]..    }.
3940: 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 6a 6f 69  ....    proc joi
3950: 6e 42 75 69 6c 64 44 69 72 65 63 74 6f 72 79 20  nBuildDirectory 
3960: 7b 20 6e 61 74 69 76 65 20 70 61 74 68 20 79 65  { native path ye
3970: 61 72 20 70 6c 61 74 66 6f 72 6d 20 63 6f 6e 66  ar platform conf
3980: 69 67 75 72 61 74 69 6f 6e 20 7d 20 7b 0d 0a 20  iguration } {.. 
3990: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
39a0: 4e 4f 54 45 3a 20 46 69 67 75 72 65 20 6f 75 74  NOTE: Figure out
39b0: 20 61 6e 64 20 74 68 65 6e 20 72 65 74 75 72 6e   and then return
39c0: 20 74 68 65 20 66 75 6c 6c 79 20 71 75 61 6c 69   the fully quali
39d0: 66 69 65 64 20 70 61 74 68 20 74 6f 20 74 68 65  fied path to the
39e0: 20 62 75 69 6c 64 0d 0a 20 20 20 20 20 20 23 20   build..      # 
39f0: 20 20 20 20 20 20 64 69 72 65 63 74 6f 72 79 20        directory 
3a00: 62 61 73 65 64 20 6f 6e 20 61 6c 6c 20 74 68 65  based on all the
3a10: 20 61 72 67 75 6d 65 6e 74 73 20 70 72 6f 76 69   arguments provi
3a20: 64 65 64 20 62 79 20 6f 75 72 20 63 61 6c 6c 65  ded by our calle
3a30: 72 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  r...      #..   
3a40: 20 20 20 69 66 20 7b 24 6e 61 74 69 76 65 7d 20     if {$native} 
3a50: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
3a60: 72 65 74 75 72 6e 20 5b 66 69 6c 65 20 6a 6f 69  return [file joi
3a70: 6e 20 24 70 61 74 68 20 62 69 6e 20 24 79 65 61  n $path bin $yea
3a80: 72 20 24 70 6c 61 74 66 6f 72 6d 20 24 63 6f 6e  r $platform $con
3a90: 66 69 67 75 72 61 74 69 6f 6e 5d 0d 0a 20 20 20  figuration]..   
3aa0: 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
3ab0: 20 20 20 20 20 72 65 74 75 72 6e 20 5b 66 69 6c       return [fil
3ac0: 65 20 6a 6f 69 6e 20 24 70 61 74 68 20 62 69 6e  e join $path bin
3ad0: 20 24 79 65 61 72 20 24 63 6f 6e 66 69 67 75 72   $year $configur
3ae0: 61 74 69 6f 6e 20 62 69 6e 5d 0d 0a 20 20 20 20  ation bin]..    
3af0: 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20    }..    }..... 
3b00: 20 20 20 70 72 6f 63 20 67 65 74 42 75 69 6c 64     proc getBuild
3b10: 44 69 72 65 63 74 6f 72 79 20 7b 7d 20 7b 0d 0a  Directory {} {..
3b20: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
3b30: 20 4e 4f 54 45 3a 20 53 65 65 20 69 66 20 74 68   NOTE: See if th
3b40: 65 20 22 6e 61 74 69 76 65 22 20 72 75 6e 74 69  e "native" runti
3b50: 6d 65 20 6f 70 74 69 6f 6e 20 68 61 73 20 62 65  me option has be
3b60: 65 6e 20 73 65 74 2e 20 20 49 66 20 73 6f 2c 20  en set.  If so, 
3b70: 75 73 65 20 74 68 65 0d 0a 20 20 20 20 20 20 23  use the..      #
3b80: 20 20 20 20 20 20 20 64 69 72 65 63 74 6f 72 79         directory
3b90: 20 66 6f 72 20 74 68 65 20 6d 69 78 65 64 2d 6d   for the mixed-m
3ba0: 6f 64 65 20 61 73 73 65 6d 62 6c 79 20 28 61 2e  ode assembly (a.
3bb0: 6b 2e 61 2e 20 74 68 65 20 6e 61 74 69 76 65 20  k.a. the native 
3bc0: 69 6e 74 65 72 6f 70 0d 0a 20 20 20 20 20 20 23  interop..      #
3bd0: 20 20 20 20 20 20 20 61 73 73 65 6d 62 6c 79 29         assembly)
3be0: 2e 20 20 54 6f 20 65 6e 61 62 6c 65 20 74 68 69  .  To enable thi
3bf0: 73 20 6f 70 74 69 6f 6e 20 76 69 61 20 74 68 65  s option via the
3c00: 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 2c 20 65   command line, e
3c10: 6e 74 65 72 20 61 0d 0a 20 20 20 20 20 20 23 20  nter a..      # 
3c20: 20 20 20 20 20 20 63 6f 6d 6d 61 6e 64 20 73 69        command si
3c30: 6d 69 6c 61 72 20 74 6f 20 6f 6e 65 20 6f 66 20  milar to one of 
3c40: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 28 61  the following (a
3c50: 6c 6c 20 6f 6e 20 6f 6e 65 20 6c 69 6e 65 29 3a  ll on one line):
3c60: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
3c70: 20 23 20 20 20 20 20 20 20 45 61 67 6c 65 53 68   #       EagleSh
3c80: 65 6c 6c 2e 65 78 65 20 2d 69 6e 69 74 69 61 6c  ell.exe -initial
3c90: 69 7a 65 20 2d 72 75 6e 74 69 6d 65 4f 70 74 69  ize -runtimeOpti
3ca0: 6f 6e 20 6e 61 74 69 76 65 0d 0a 20 20 20 20 20  on native..     
3cb0: 20 23 20 20 20 20 20 20 20 20 20 2d 66 69 6c 65   #         -file
3cc0: 20 2e 5c 70 61 74 68 5c 74 6f 5c 61 6c 6c 2e 65   .\path\to\all.e
3cd0: 61 67 6c 65 0d 0a 20 20 20 20 20 20 23 0d 0a 20  agle..      #.. 
3ce0: 20 20 20 20 20 23 20 20 20 20 20 20 20 54 6f 20       #       To 
3cf0: 65 6e 61 62 6c 65 20 74 68 69 73 20 6f 70 74 69  enable this opti
3d00: 6f 6e 20 76 69 61 20 74 68 65 20 63 6f 6d 6d 61  on via the comma
3d10: 6e 64 20 6c 69 6e 65 20 70 72 69 6f 72 20 74 6f  nd line prior to
3d20: 20 74 68 65 20 22 62 65 74 61 20 31 36 22 0d 0a   the "beta 16"..
3d30: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 72 65        #       re
3d40: 6c 65 61 73 65 20 6f 66 20 45 61 67 6c 65 2c 20  lease of Eagle, 
3d50: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f  the following co
3d60: 6d 6d 61 6e 64 20 6d 75 73 74 20 62 65 20 75 73  mmand must be us
3d70: 65 64 20 69 6e 73 74 65 61 64 0d 0a 20 20 20 20  ed instead..    
3d80: 20 20 23 20 20 20 20 20 20 20 28 61 6c 73 6f 20    #       (also 
3d90: 61 6c 6c 20 6f 6e 20 6f 6e 65 20 6c 69 6e 65 29  all on one line)
3da0: 3a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  :..      #..    
3db0: 20 20 23 20 20 20 20 20 20 20 45 61 67 6c 65 53    #       EagleS
3dc0: 68 65 6c 6c 2e 65 78 65 20 2d 69 6e 69 74 69 61  hell.exe -initia
3dd0: 6c 69 7a 65 20 2d 70 6f 73 74 49 6e 69 74 69 61  lize -postInitia
3de0: 6c 69 7a 65 0d 0a 20 20 20 20 20 20 23 20 20 20  lize..      #   
3df0: 20 20 20 20 20 20 22 6f 62 6a 65 63 74 20 69 6e        "object in
3e00: 76 6f 6b 65 20 49 6e 74 65 72 70 72 65 74 65 72  voke Interpreter
3e10: 2e 47 65 74 41 63 74 69 76 65 20 41 64 64 52 75  .GetActive AddRu
3e20: 6e 74 69 6d 65 4f 70 74 69 6f 6e 20 6e 61 74 69  ntimeOption nati
3e30: 76 65 22 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ve"..      #    
3e40: 20 20 20 20 20 2d 66 69 6c 65 20 2e 5c 70 61 74       -file .\pat
3e50: 68 5c 74 6f 5c 61 6c 6c 2e 65 61 67 6c 65 0d 0a  h\to\all.eagle..
3e60: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69        #..      i
3e70: 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20  f {[info exists 
3e80: 3a 3a 62 75 69 6c 64 5f 64 69 72 65 63 74 6f 72  ::build_director
3e90: 79 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20  y] && \..       
3ea0: 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74     [string lengt
3eb0: 68 20 24 3a 3a 62 75 69 6c 64 5f 64 69 72 65 63  h $::build_direc
3ec0: 74 6f 72 79 5d 20 3e 20 30 7d 20 74 68 65 6e 20  tory] > 0} then 
3ed0: 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
3ee0: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68        # NOTE: Th
3ef0: 65 20 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 74 68  e location of th
3f00: 65 20 62 75 69 6c 64 20 64 69 72 65 63 74 6f 72  e build director
3f10: 79 20 68 61 73 20 62 65 65 6e 20 6f 76 65 72 72  y has been overr
3f20: 69 64 64 65 6e 3b 0d 0a 20 20 20 20 20 20 20 20  idden;..        
3f30: 23 20 20 20 20 20 20 20 74 68 65 72 65 66 6f 72  #       therefor
3f40: 65 2c 20 75 73 65 20 69 74 20 76 65 72 62 61 74  e, use it verbat
3f50: 69 6d 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  im...        #..
3f60: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 24          return $
3f70: 3a 3a 62 75 69 6c 64 5f 64 69 72 65 63 74 6f 72  ::build_director
3f80: 79 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20  y..      } else 
3f90: 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
3fa0: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 66        # NOTE: If
3fb0: 20 74 68 65 20 22 6e 61 74 69 76 65 22 20 72 75   the "native" ru
3fc0: 6e 74 69 6d 65 20 6f 70 74 69 6f 6e 20 69 73 20  ntime option is 
3fd0: 73 65 74 2c 20 74 68 65 20 6d 69 78 65 64 2d 6d  set, the mixed-m
3fe0: 6f 64 65 20 61 73 73 65 6d 62 6c 79 0d 0a 20 20  ode assembly..  
3ff0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 69 73        #       is
4000: 20 62 65 69 6e 67 20 74 65 73 74 65 64 2e 20 20   being tested.  
4010: 49 6e 20 74 68 61 74 20 63 61 73 65 2c 20 74 68  In that case, th
4020: 65 20 70 61 74 68 20 74 6f 20 74 68 65 20 62 75  e path to the bu
4030: 69 6c 64 20 64 69 72 65 63 74 6f 72 79 0d 0a 20  ild directory.. 
4040: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 77         #       w
4050: 69 6c 6c 20 63 6f 6e 74 61 69 6e 20 74 68 65 20  ill contain the 
4060: 70 6c 61 74 66 6f 72 6d 20 6e 61 6d 65 20 61 6e  platform name an
4070: 64 20 61 6c 6c 20 74 68 65 20 62 69 6e 61 72 69  d all the binari
4080: 65 73 20 75 6e 64 65 72 20 74 65 73 74 0d 0a 20  es under test.. 
4090: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 73         #       s
40a0: 68 6f 75 6c 64 20 62 65 20 70 72 65 73 65 6e 74  hould be present
40b0: 20 69 6e 20 74 68 61 74 20 64 69 72 65 63 74 6f   in that directo
40c0: 72 79 2e 20 20 49 66 20 74 68 65 20 22 6e 61 74  ry.  If the "nat
40d0: 69 76 65 22 20 72 75 6e 74 69 6d 65 0d 0a 20 20  ive" runtime..  
40e0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 6f 70        #       op
40f0: 74 69 6f 6e 20 69 73 20 6e 6f 74 20 73 65 74 2c  tion is not set,
4100: 20 74 68 65 20 62 75 69 6c 64 20 64 69 72 65 63   the build direc
4110: 74 6f 72 79 20 77 69 6c 6c 20 62 65 20 63 6f 6e  tory will be con
4120: 73 69 64 65 72 65 64 20 74 6f 20 62 65 0d 0a 20  sidered to be.. 
4130: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 22         #       "
4140: 70 6c 61 74 66 6f 72 6d 2d 6e 65 75 74 72 61 6c  platform-neutral
4150: 22 2c 20 77 69 74 68 20 74 68 65 20 6e 6f 74 61  ", with the nota
4160: 62 6c 65 20 65 78 63 65 70 74 69 6f 6e 20 6f 66  ble exception of
4170: 20 61 6e 79 20 6e 61 74 69 76 65 0d 0a 20 20 20   any native..   
4180: 20 20 20 20 20 23 20 20 20 20 20 20 20 61 73 73       #       ass
4190: 65 6d 62 6c 79 20 28 65 2e 67 2e 20 22 53 51 4c  embly (e.g. "SQL
41a0: 69 74 65 2e 49 6e 74 65 72 6f 70 2e 64 6c 6c 22  ite.Interop.dll"
41b0: 29 20 63 6f 70 69 65 64 20 74 68 65 72 65 20 64  ) copied there d
41c0: 75 72 69 6e 67 20 74 68 65 0d 0a 20 20 20 20 20  uring the..     
41d0: 20 20 20 23 20 20 20 20 20 20 20 62 75 69 6c 64     #       build
41e0: 20 70 72 6f 63 65 73 73 20 69 74 73 65 6c 66 2e   process itself.
41f0: 20 20 49 66 20 74 68 65 20 62 75 69 6c 64 20 70    If the build p
4200: 72 6f 63 65 73 73 20 73 6f 6d 65 68 6f 77 20 64  rocess somehow d
4210: 6f 65 73 20 6e 6f 74 0d 0a 20 20 20 20 20 20 20  oes not..       
4220: 20 23 20 20 20 20 20 20 20 63 6f 70 79 20 74 68   #       copy th
4230: 65 20 6e 61 74 69 76 65 20 61 73 73 65 6d 62 6c  e native assembl
4240: 79 20 66 6f 72 20 74 68 69 73 20 70 6c 61 74 66  y for this platf
4250: 6f 72 6d 2c 20 6d 6f 73 74 20 6f 66 20 74 68 65  orm, most of the
4260: 20 74 65 73 74 73 0d 0a 20 20 20 20 20 20 20 20   tests..        
4270: 23 20 20 20 20 20 20 20 69 6e 20 74 68 65 20 73  #       in the s
4280: 75 69 74 65 20 77 69 6c 6c 20 73 69 6d 70 6c 79  uite will simply
4290: 20 62 65 20 73 6b 69 70 70 65 64 2e 20 20 47 65   be skipped.  Ge
42a0: 6e 65 72 61 6c 6c 79 20 73 70 65 61 6b 69 6e 67  nerally speaking
42b0: 2c 20 74 68 65 72 65 0d 0a 20 20 20 20 20 20 20  , there..       
42c0: 20 23 20 20 20 20 20 20 20 61 72 65 20 74 77 6f   #       are two
42d0: 20 77 61 79 73 20 74 6f 20 62 75 69 6c 64 20 74   ways to build t
42e0: 68 65 20 62 69 6e 61 72 69 65 73 20 77 68 65 6e  he binaries when
42f0: 20 70 72 65 70 61 72 69 6e 67 20 74 6f 20 72 75   preparing to ru
4300: 6e 20 74 68 65 0d 0a 20 20 20 20 20 20 20 20 23  n the..        #
4310: 20 20 20 20 20 20 20 74 65 73 74 20 73 75 69 74         test suit
4320: 65 3a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  e:..        #.. 
4330: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 31         #       1
4340: 2e 20 42 75 69 6c 64 20 74 68 65 20 73 65 70 61  . Build the sepa
4350: 72 61 74 65 20 6d 61 6e 61 67 65 64 20 61 6e 64  rate managed and
4360: 20 6e 61 74 69 76 65 20 61 73 73 65 6d 62 6c 69   native assembli
4370: 65 73 20 75 73 69 6e 67 20 73 6f 6d 65 0d 0a 20  es using some.. 
4380: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 20         #        
4390: 20 20 63 6f 6d 6d 61 6e 64 73 20 73 69 6d 69 6c    commands simil
43a0: 61 72 20 74 6f 3a 0d 0a 20 20 20 20 20 20 20 20  ar to:..        
43b0: 23 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  #..        #    
43c0: 20 20 20 20 20 20 62 75 69 6c 64 2e 62 61 74 20        build.bat 
43d0: 24 7b 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 7d  ${Configuration}
43e0: 4d 61 6e 61 67 65 64 4f 6e 6c 79 20 24 7b 50 6c  ManagedOnly ${Pl
43f0: 61 74 66 6f 72 6d 7d 0d 0a 20 20 20 20 20 20 20  atform}..       
4400: 20 23 20 20 20 20 20 20 20 20 20 20 62 75 69 6c   #          buil
4410: 64 2e 62 61 74 20 24 7b 43 6f 6e 66 69 67 75 72  d.bat ${Configur
4420: 61 74 69 6f 6e 7d 4e 61 74 69 76 65 4f 6e 6c 79  ation}NativeOnly
4430: 20 24 7b 50 6c 61 74 66 6f 72 6d 7d 0d 0a 20 20   ${Platform}..  
4440: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
4450: 20 23 20 20 20 20 20 20 20 20 20 20 57 68 65 72   #          Wher
4460: 65 20 24 7b 43 6f 6e 66 69 67 75 72 61 74 69 6f  e ${Configuratio
4470: 6e 7d 20 69 73 20 65 69 74 68 65 72 20 22 44 65  n} is either "De
4480: 62 75 67 22 20 6f 72 20 22 52 65 6c 65 61 73 65  bug" or "Release
4490: 22 20 61 6e 64 0d 0a 20 20 20 20 20 20 20 20 23  " and..        #
44a0: 20 20 20 20 20 20 20 20 20 20 24 7b 50 6c 61 74            ${Plat
44b0: 66 6f 72 6d 7d 20 69 73 20 65 69 74 68 65 72 20  form} is either 
44c0: 22 57 69 6e 33 32 22 20 6f 72 20 22 78 36 34 22  "Win32" or "x64"
44d0: 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
44e0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 32 2e        #       2.
44f0: 20 42 75 69 6c 64 20 74 68 65 20 6d 69 78 65 64   Build the mixed
4500: 2d 6d 6f 64 65 20 61 73 73 65 6d 62 6c 79 20 75  -mode assembly u
4510: 73 69 6e 67 20 61 20 63 6f 6d 6d 61 6e 64 20 73  sing a command s
4520: 69 6d 69 6c 61 72 20 74 6f 3a 0d 0a 20 20 20 20  imilar to:..    
4530: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
4540: 20 20 20 20 20 20 20 20 20 20 62 75 69 6c 64 2e            build.
4550: 62 61 74 20 24 7b 43 6f 6e 66 69 67 75 72 61 74  bat ${Configurat
4560: 69 6f 6e 7d 20 24 7b 50 6c 61 74 66 6f 72 6d 7d  ion} ${Platform}
4570: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
4580: 20 20 20 20 20 23 20 20 20 20 20 20 20 20 20 20       #          
4590: 57 68 65 72 65 20 24 7b 43 6f 6e 66 69 67 75 72  Where ${Configur
45a0: 61 74 69 6f 6e 7d 20 69 73 20 65 69 74 68 65 72  ation} is either
45b0: 20 22 44 65 62 75 67 22 20 6f 72 20 22 52 65 6c   "Debug" or "Rel
45c0: 65 61 73 65 22 20 61 6e 64 0d 0a 20 20 20 20 20  ease" and..     
45d0: 20 20 20 23 20 20 20 20 20 20 20 20 20 20 24 7b     #          ${
45e0: 50 6c 61 74 66 6f 72 6d 7d 20 69 73 20 65 69 74  Platform} is eit
45f0: 68 65 72 20 22 57 69 6e 33 32 22 20 6f 72 20 22  her "Win32" or "
4600: 78 36 34 22 2e 20 20 49 66 20 74 68 69 73 20 63  x64".  If this c
4610: 6f 6d 6d 61 6e 64 20 69 73 0d 0a 20 20 20 20 20  ommand is..     
4620: 20 20 20 23 20 20 20 20 20 20 20 20 20 20 75 73     #          us
4630: 65 64 2c 20 76 61 72 69 6f 75 73 20 74 65 73 74  ed, various test
4640: 73 20 74 68 61 74 20 72 65 71 75 69 72 65 20 73  s that require s
4650: 75 70 70 6c 65 6d 65 6e 74 61 72 79 20 6d 61 6e  upplementary man
4660: 61 67 65 64 0d 0a 20 20 20 20 20 20 20 20 23 20  aged..        # 
4670: 20 20 20 20 20 20 20 20 20 61 73 73 65 6d 62 6c           assembl
4680: 69 65 73 20 28 65 2e 67 2e 20 4c 49 4e 51 29 20  ies (e.g. LINQ) 
4690: 6d 61 79 20 62 65 20 73 6b 69 70 70 65 64 20 75  may be skipped u
46a0: 6e 6c 65 73 73 20 74 68 6f 73 65 20 62 69 6e 61  nless those bina
46b0: 72 69 65 73 0d 0a 20 20 20 20 20 20 20 20 23 20  ries..        # 
46c0: 20 20 20 20 20 20 20 20 20 61 72 65 20 73 75 62           are sub
46d0: 73 65 71 75 65 6e 74 6c 79 20 63 6f 70 69 65 64  sequently copied
46e0: 20 69 6e 74 6f 20 74 68 65 20 63 6f 72 72 65 63   into the correc
46f0: 74 20 64 69 72 65 63 74 6f 72 79 20 28 69 2e 65  t directory (i.e
4700: 2e 20 62 79 0d 0a 20 20 20 20 20 20 20 20 23 20  . by..        # 
4710: 20 20 20 20 20 20 20 20 20 22 74 65 73 74 5f 61           "test_a
4720: 6c 6c 2e 62 61 74 22 29 2e 0d 0a 20 20 20 20 20  ll.bat")...     
4730: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
4740: 20 20 20 20 20 20 4e 6f 74 65 20 74 68 61 74 20        Note that 
4750: 61 6c 6c 20 6f 66 20 74 68 65 20 62 75 69 6c 64  all of the build
4760: 20 63 6f 6d 6d 61 6e 64 73 20 61 62 6f 76 65 20   commands above 
4770: 77 69 6c 6c 20 64 65 66 61 75 6c 74 20 74 6f 20  will default to 
4780: 75 73 69 6e 67 0d 0a 20 20 20 20 20 20 20 20 23  using..        #
4790: 20 20 20 20 20 20 20 74 68 65 20 6c 61 74 65 73         the lates
47a0: 74 20 76 65 72 73 69 6f 6e 20 6f 66 20 4d 53 42  t version of MSB
47b0: 75 69 6c 64 20 61 76 61 69 6c 61 62 6c 65 20 61  uild available a
47c0: 6e 64 20 74 68 65 20 22 74 65 73 74 5f 79 65 61  nd the "test_yea
47d0: 72 22 20 6d 61 79 0d 0a 20 20 20 20 20 20 20 20  r" may..        
47e0: 23 20 20 20 20 20 20 20 6e 65 65 64 20 74 6f 20  #       need to 
47f0: 62 65 20 61 64 6a 75 73 74 65 64 20 61 63 63 6f  be adjusted acco
4800: 72 64 69 6e 67 6c 79 20 74 6f 20 61 63 74 75 61  rdingly to actua
4810: 6c 6c 79 20 72 75 6e 20 74 68 65 20 74 65 73 74  lly run the test
4820: 20 73 75 69 74 65 2e 0d 0a 20 20 20 20 20 20 20   suite...       
4830: 20 23 20 20 20 20 20 20 20 52 65 66 65 72 20 74   #       Refer t
4840: 6f 20 74 68 65 20 63 6f 6d 6d 65 6e 74 73 20 69  o the comments i
4850: 6e 20 5b 67 65 74 42 75 69 6c 64 59 65 61 72 5d  n [getBuildYear]
4860: 20 66 6f 72 20 6d 6f 72 65 20 69 6e 66 6f 72 6d   for more inform
4870: 61 74 69 6f 6e 20 6f 6e 0d 0a 20 20 20 20 20 20  ation on..      
4880: 20 20 23 20 20 20 20 20 20 20 68 6f 77 20 74 6f    #       how to
4890: 20 73 65 74 20 74 68 69 73 20 76 61 72 69 61 62   set this variab
48a0: 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  le...        #..
48b0: 20 20 20 20 20 20 20 20 73 65 74 20 6e 61 74 69          set nati
48c0: 76 65 20 5b 68 61 73 52 75 6e 74 69 6d 65 4f 70  ve [hasRuntimeOp
48d0: 74 69 6f 6e 20 6e 61 74 69 76 65 5d 0d 0a 0d 0a  tion native]....
48e0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b          return [
48f0: 6a 6f 69 6e 42 75 69 6c 64 44 69 72 65 63 74 6f  joinBuildDirecto
4900: 72 79 20 24 6e 61 74 69 76 65 20 5b 67 65 74 42  ry $native [getB
4910: 75 69 6c 64 42 61 73 65 44 69 72 65 63 74 6f 72  uildBaseDirector
4920: 79 5d 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  y] \..          
4930: 20 20 5b 67 65 74 42 75 69 6c 64 59 65 61 72 5d    [getBuildYear]
4940: 20 5b 67 65 74 42 75 69 6c 64 50 6c 61 74 66 6f   [getBuildPlatfo
4950: 72 6d 20 24 6e 61 74 69 76 65 5d 20 5b 67 65 74  rm $native] [get
4960: 42 75 69 6c 64 43 6f 6e 66 69 67 75 72 61 74 69  BuildConfigurati
4970: 6f 6e 5d 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20  on]]..      }.. 
4980: 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
4990: 63 20 67 65 74 52 65 6c 65 61 73 65 56 65 72 73  c getReleaseVers
49a0: 69 6f 6e 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20  ion {} {..      
49b0: 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
49c0: 20 46 69 67 75 72 65 20 6f 75 74 20 74 68 65 20   Figure out the 
49d0: 72 65 6c 65 61 73 65 20 76 65 72 73 69 6f 6e 20  release version 
49e0: 66 6f 72 20 75 73 65 20 77 69 74 68 20 74 68 65  for use with the
49f0: 20 62 75 69 6c 64 20 64 69 72 65 63 74 6f 72 79   build directory
4a00: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
4a10: 77 68 65 6e 20 63 68 65 63 6b 69 6e 67 20 66 6f  when checking fo
4a20: 72 20 61 76 61 69 6c 61 62 6c 65 20 72 65 6c 65  r available rele
4a30: 61 73 65 73 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  ases...      #..
4a40: 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20        if {[info 
4a50: 65 78 69 73 74 73 20 3a 3a 72 65 6c 65 61 73 65  exists ::release
4a60: 5f 76 65 72 73 69 6f 6e 5d 20 26 26 20 5c 0d 0a  _version] && \..
4a70: 20 20 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e            [strin
4a80: 67 20 6c 65 6e 67 74 68 20 24 3a 3a 72 65 6c 65  g length $::rele
4a90: 61 73 65 5f 76 65 72 73 69 6f 6e 5d 20 3e 20 30  ase_version] > 0
4aa0: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
4ab0: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
4ac0: 4f 54 45 3a 20 54 68 65 20 72 65 6c 65 61 73 65  OTE: The release
4ad0: 20 76 65 72 73 69 6f 6e 20 68 61 73 20 62 65 65   version has bee
4ae0: 6e 20 6f 76 65 72 72 69 64 64 65 6e 3b 20 74 68  n overridden; th
4af0: 65 72 65 66 6f 72 65 2c 20 75 73 65 20 69 74 0d  erefore, use it.
4b00: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
4b10: 20 76 65 72 62 61 74 69 6d 2e 0d 0a 20 20 20 20   verbatim...    
4b20: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72      #..        r
4b30: 65 74 75 72 6e 20 24 3a 3a 72 65 6c 65 61 73 65  eturn $::release
4b40: 5f 76 65 72 73 69 6f 6e 0d 0a 20 20 20 20 20 20  _version..      
4b50: 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
4b60: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
4b70: 4f 54 45 3a 20 4e 6f 20 72 65 6c 65 61 73 65 20  OTE: No release 
4b80: 76 65 72 73 69 6f 6e 20 69 73 20 61 76 61 69 6c  version is avail
4b90: 61 62 6c 65 2c 20 72 65 74 75 72 6e 20 61 6e 20  able, return an 
4ba0: 65 6d 70 74 79 20 73 74 72 69 6e 67 2e 0d 0a 20  empty string... 
4bb0: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
4bc0: 20 20 72 65 74 75 72 6e 20 22 22 0d 0a 20 20 20    return ""..   
4bd0: 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a     }..    }.....
4be0: 20 20 20 20 70 72 6f 63 20 67 65 74 42 75 69 6c      proc getBuil
4bf0: 64 46 69 6c 65 4e 61 6d 65 20 7b 20 66 69 6c 65  dFileName { file
4c00: 4e 61 6d 65 20 7b 70 6c 61 74 66 6f 72 6d 20 22  Name {platform "
4c10: 22 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d  "} } {..      #.
4c20: 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 52  .      # NOTE: R
4c30: 65 74 75 72 6e 73 20 74 68 65 20 73 70 65 63 69  eturns the speci
4c40: 66 69 65 64 20 66 69 6c 65 20 6e 61 6d 65 20 61  fied file name a
4c50: 73 20 69 66 20 69 74 20 77 65 72 65 20 6c 6f 63  s if it were loc
4c60: 61 74 65 64 20 69 6e 20 74 68 65 0d 0a 20 20 20  ated in the..   
4c70: 20 20 20 23 20 20 20 20 20 20 20 62 75 69 6c 64     #       build
4c80: 20 64 69 72 65 63 74 6f 72 79 2c 20 64 69 73 63   directory, disc
4c90: 61 72 64 69 6e 67 20 61 6e 79 20 64 69 72 65 63  arding any direc
4ca0: 74 6f 72 79 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  tory information
4cb0: 20 70 72 65 73 65 6e 74 0d 0a 20 20 20 20 20 20   present..      
4cc0: 23 20 20 20 20 20 20 20 69 6e 20 74 68 65 20 66  #       in the f
4cd0: 69 6c 65 20 6e 61 6d 65 20 61 73 20 70 72 6f 76  ile name as prov
4ce0: 69 64 65 64 20 62 79 20 6f 75 72 20 63 61 6c 6c  ided by our call
4cf0: 65 72 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  er...      #..  
4d00: 20 20 20 20 72 65 74 75 72 6e 20 5b 66 69 6c 65      return [file
4d10: 20 6e 61 74 69 76 65 6e 61 6d 65 20 5c 0d 0a 20   nativename \.. 
4d20: 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20 6a           [file j
4d30: 6f 69 6e 20 5b 67 65 74 42 75 69 6c 64 44 69 72  oin [getBuildDir
4d40: 65 63 74 6f 72 79 5d 20 24 70 6c 61 74 66 6f 72  ectory] $platfor
4d50: 6d 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 66 69  m [file tail $fi
4d60: 6c 65 4e 61 6d 65 5d 5d 5d 0d 0a 20 20 20 20 7d  leName]]]..    }
4d70: 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65  .....    proc ge
4d80: 74 42 69 6e 61 72 79 44 69 72 65 63 74 6f 72 79  tBinaryDirectory
4d90: 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a   {} {..      #..
4da0: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68        # NOTE: Th
4db0: 69 73 20 70 72 6f 63 65 64 75 72 65 20 72 65 74  is procedure ret
4dc0: 75 72 6e 73 20 74 68 65 20 64 69 72 65 63 74 6f  urns the directo
4dd0: 72 79 20 77 68 65 72 65 20 74 68 65 20 74 65 73  ry where the tes
4de0: 74 20 61 70 70 6c 69 63 61 74 69 6f 6e 0d 0a 20  t application.. 
4df0: 20 20 20 20 20 23 20 20 20 20 20 20 20 69 74 73       #       its
4e00: 65 6c 66 20 28 69 2e 65 2e 20 74 68 65 20 45 61  elf (i.e. the Ea
4e10: 67 6c 65 20 73 68 65 6c 6c 29 20 69 73 20 6c 6f  gle shell) is lo
4e20: 63 61 74 65 64 2e 20 20 54 68 69 73 20 77 69 6c  cated.  This wil
4e30: 6c 20 62 65 20 75 73 65 64 20 61 73 0d 0a 20 20  l be used as..  
4e40: 20 20 20 20 23 20 20 20 20 20 20 20 74 68 65 20      #       the 
4e50: 64 65 73 74 69 6e 61 74 69 6f 6e 20 66 6f 72 20  destination for 
4e60: 74 68 65 20 63 6f 70 69 65 64 20 53 79 73 74 65  the copied Syste
4e70: 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 20 6e 61  m.Data.SQLite na
4e80: 74 69 76 65 20 61 6e 64 0d 0a 20 20 20 20 20 20  tive and..      
4e90: 23 20 20 20 20 20 20 20 6d 61 6e 61 67 65 64 20  #       managed 
4ea0: 61 73 73 65 6d 62 6c 69 65 73 20 28 69 2e 65 2e  assemblies (i.e.
4eb0: 20 62 65 63 61 75 73 65 20 74 68 69 73 20 69 73   because this is
4ec0: 20 6f 6e 65 20 6f 66 20 74 68 65 20 66 65 77 20   one of the few 
4ed0: 70 6c 61 63 65 73 0d 0a 20 20 20 20 20 20 23 20  places..      # 
4ee0: 20 20 20 20 20 20 77 68 65 72 65 20 74 68 65 20        where the 
4ef0: 43 4c 52 20 77 69 6c 6c 20 61 63 74 75 61 6c 6c  CLR will actuall
4f00: 79 20 66 69 6e 64 20 61 6e 64 20 6c 6f 61 64 20  y find and load 
4f10: 74 68 65 6d 20 70 72 6f 70 65 72 6c 79 29 2e 0d  them properly)..
4f20: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
4f30: 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73  if {[info exists
4f40: 20 3a 3a 62 69 6e 61 72 79 5f 64 69 72 65 63 74   ::binary_direct
4f50: 6f 72 79 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20  ory] && \..     
4f60: 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e       [string len
4f70: 67 74 68 20 24 3a 3a 62 69 6e 61 72 79 5f 64 69  gth $::binary_di
4f80: 72 65 63 74 6f 72 79 5d 20 3e 20 30 7d 20 74 68  rectory] > 0} th
4f90: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d  en {..        #.
4fa0: 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
4fb0: 20 54 68 65 20 6c 6f 63 61 74 69 6f 6e 20 6f 66   The location of
4fc0: 20 74 68 65 20 62 69 6e 61 72 79 20 64 69 72 65   the binary dire
4fd0: 63 74 6f 72 79 20 68 61 73 20 62 65 65 6e 20 6f  ctory has been o
4fe0: 76 65 72 72 69 64 64 65 6e 3b 0d 0a 20 20 20 20  verridden;..    
4ff0: 20 20 20 20 23 20 20 20 20 20 20 20 74 68 65 72      #       ther
5000: 65 66 6f 72 65 2c 20 75 73 65 20 69 74 20 76 65  efore, use it ve
5010: 72 62 61 74 69 6d 2e 0d 0a 20 20 20 20 20 20 20  rbatim...       
5020: 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75   #..        retu
5030: 72 6e 20 24 3a 3a 62 69 6e 61 72 79 5f 64 69 72  rn $::binary_dir
5040: 65 63 74 6f 72 79 0d 0a 20 20 20 20 20 20 7d 20  ectory..      } 
5050: 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
5060: 72 65 74 75 72 6e 20 5b 69 6e 66 6f 20 62 69 6e  return [info bin
5070: 61 72 79 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20  ary]..      }.. 
5080: 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
5090: 63 20 67 65 74 42 69 6e 61 72 79 46 69 6c 65 4e  c getBinaryFileN
50a0: 61 6d 65 20 7b 20 66 69 6c 65 4e 61 6d 65 20 7b  ame { fileName {
50b0: 70 6c 61 74 66 6f 72 6d 20 22 22 7d 20 7d 20 7b  platform ""} } {
50c0: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
50d0: 20 23 20 4e 4f 54 45 3a 20 52 65 74 75 72 6e 73   # NOTE: Returns
50e0: 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 66   the specified f
50f0: 69 6c 65 20 6e 61 6d 65 20 61 73 20 69 66 20 69  ile name as if i
5100: 74 20 77 65 72 65 20 6c 6f 63 61 74 65 64 20 69  t were located i
5110: 6e 20 74 68 65 0d 0a 20 20 20 20 20 20 23 20 20  n the..      #  
5120: 20 20 20 20 20 62 69 6e 61 72 79 20 64 69 72 65       binary dire
5130: 63 74 6f 72 79 2c 20 64 69 73 63 61 72 64 69 6e  ctory, discardin
5140: 67 20 61 6e 79 20 64 69 72 65 63 74 6f 72 79 20  g any directory 
5150: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 70 72 65 73  information pres
5160: 65 6e 74 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ent..      #    
5170: 20 20 20 69 6e 20 74 68 65 20 66 69 6c 65 20 6e     in the file n
5180: 61 6d 65 20 61 73 20 70 72 6f 76 69 64 65 64 20  ame as provided 
5190: 62 79 20 6f 75 72 20 63 61 6c 6c 65 72 2e 0d 0a  by our caller...
51a0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 72        #..      r
51b0: 65 74 75 72 6e 20 5b 66 69 6c 65 20 6e 61 74 69  eturn [file nati
51c0: 76 65 6e 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20  vename \..      
51d0: 20 20 20 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5b      [file join [
51e0: 67 65 74 42 69 6e 61 72 79 44 69 72 65 63 74 6f  getBinaryDirecto
51f0: 72 79 5d 20 24 70 6c 61 74 66 6f 72 6d 20 5b 66  ry] $platform [f
5200: 69 6c 65 20 74 61 69 6c 20 24 66 69 6c 65 4e 61  ile tail $fileNa
5210: 6d 65 5d 5d 5d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d  me]]]..    }....
5220: 0a 20 20 20 20 70 72 6f 63 20 67 65 74 43 6f 72  .    proc getCor
5230: 65 42 69 6e 61 72 79 46 69 6c 65 4e 61 6d 65 20  eBinaryFileName 
5240: 7b 20 7b 70 6c 61 74 66 6f 72 6d 20 22 22 7d 20  { {platform ""} 
5250: 7b 73 74 61 6e 64 61 72 64 20 66 61 6c 73 65 7d  {standard false}
5260: 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20   } {..      #.. 
5270: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 52 65 74       # NOTE: Ret
5280: 75 72 6e 73 20 74 68 65 20 66 75 6c 6c 20 70 61  urns the full pa
5290: 74 68 20 66 6f 72 20 74 68 65 20 66 69 6c 65 20  th for the file 
52a0: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 53  containing the S
52b0: 51 4c 69 74 65 20 63 6f 72 65 0d 0a 20 20 20 20  QLite core..    
52c0: 20 20 23 20 20 20 20 20 20 20 6e 61 74 69 76 65    #       native
52d0: 20 6c 69 62 72 61 72 79 20 63 6f 64 65 20 66 6f   library code fo
52e0: 72 20 74 68 69 73 20 70 6c 61 74 66 6f 72 6d 2e  r this platform.
52f0: 20 20 46 69 72 73 74 2c 20 63 68 65 63 6b 20 61    First, check a
5300: 6e 64 20 73 65 65 20 69 66 0d 0a 20 20 20 20 20  nd see if..     
5310: 20 23 20 20 20 20 20 20 20 74 68 65 20 53 51 4c   #       the SQL
5320: 69 74 65 20 63 6f 72 65 20 6e 61 74 69 76 65 20  ite core native 
5330: 6c 69 62 72 61 72 79 20 68 61 73 20 61 6c 72 65  library has alre
5340: 61 64 79 20 62 65 65 6e 20 6c 6f 61 64 65 64 2e  ady been loaded.
5350: 20 20 4e 65 78 74 2c 0d 0a 20 20 20 20 20 20 23    Next,..      #
5360: 20 20 20 20 20 20 20 66 61 6c 6c 62 61 63 6b 20         fallback 
5370: 74 6f 20 77 68 61 74 20 74 68 65 20 66 75 6c 6c  to what the full
5380: 20 70 61 74 68 20 73 68 6f 75 6c 64 20 62 65 2c   path should be,
5390: 20 62 61 73 65 64 20 6f 6e 20 77 68 65 74 68 65   based on whethe
53a0: 72 20 74 68 65 0d 0a 20 20 20 20 20 20 23 20 20  r the..      #  
53b0: 20 20 20 20 20 6d 69 78 65 64 2d 6d 6f 64 65 20       mixed-mode 
53c0: 61 73 73 65 6d 62 6c 79 20 69 73 20 62 65 69 6e  assembly is bein
53d0: 67 20 75 73 65 64 20 61 6e 64 20 74 68 65 20 6e  g used and the n
53e0: 61 6d 65 20 6f 66 20 74 68 65 20 63 75 72 72 65  ame of the curre
53f0: 6e 74 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  nt..      #     
5400: 20 20 70 6c 61 74 66 6f 72 6d 2e 0d 0a 20 20 20    platform...   
5410: 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
5420: 5b 63 61 74 63 68 20 7b 6f 62 6a 65 63 74 20 69  [catch {object i
5430: 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f  nvoke -flags +No
5440: 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20  nPublic \..     
5450: 20 20 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e           System.
5460: 44 61 74 61 2e 53 51 4c 69 74 65 2e 55 6e 73 61  Data.SQLite.Unsa
5470: 66 65 4e 61 74 69 76 65 4d 65 74 68 6f 64 73 20  feNativeMethods 
5480: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
5490: 20 5f 53 51 4c 69 74 65 4e 61 74 69 76 65 4d 6f   _SQLiteNativeMo
54a0: 64 75 6c 65 46 69 6c 65 4e 61 6d 65 7d 20 66 69  duleFileName} fi
54b0: 6c 65 4e 61 6d 65 5d 20 3d 3d 20 30 20 26 26 20  leName] == 0 && 
54c0: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 73 74  \..          [st
54d0: 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 66 69 6c  ring length $fil
54e0: 65 4e 61 6d 65 5d 20 3e 20 30 7d 20 74 68 65 6e  eName] > 0} then
54f0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20   {..        #.. 
5500: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54         # NOTE: T
5510: 68 65 20 53 51 4c 69 74 65 20 63 6f 72 65 20 6e  he SQLite core n
5520: 61 74 69 76 65 20 6c 69 62 72 61 72 79 20 68 61  ative library ha
5530: 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 6c  s already been l
5540: 6f 61 64 65 64 20 76 69 61 0d 0a 20 20 20 20 20  oaded via..     
5550: 20 20 20 23 20 20 20 20 20 20 20 74 68 65 20 6e     #       the n
5560: 61 74 69 76 65 20 6c 69 62 72 61 72 79 20 70 72  ative library pr
5570: 65 2d 6c 6f 61 64 65 72 2e 20 20 52 65 74 75 72  e-loader.  Retur
5580: 6e 20 74 68 61 74 20 66 69 6c 65 20 6e 61 6d 65  n that file name
5590: 20 6e 6f 77 2e 0d 0a 20 20 20 20 20 20 20 20 23   now...        #
55a0: 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ..        return
55b0: 20 24 66 69 6c 65 4e 61 6d 65 0d 0a 20 20 20 20   $fileName..    
55c0: 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20    }....      if 
55d0: 7b 5b 68 61 73 52 75 6e 74 69 6d 65 4f 70 74 69  {[hasRuntimeOpti
55e0: 6f 6e 20 6e 61 74 69 76 65 5d 7d 20 74 68 65 6e  on native]} then
55f0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20   {..        #.. 
5600: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 52         # NOTE: R
5610: 65 74 75 72 6e 20 74 68 65 20 6d 69 78 65 64 2d  eturn the mixed-
5620: 6d 6f 64 65 20 61 73 73 65 6d 62 6c 79 20 66 69  mode assembly fi
5630: 6c 65 20 6e 61 6d 65 2e 0d 0a 20 20 20 20 20 20  le name...      
5640: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74    #..        ret
5650: 75 72 6e 20 5b 66 69 6c 65 20 6e 61 74 69 76 65  urn [file native
5660: 6e 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20 20 20  name \..        
5670: 20 20 20 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5b      [file join [
5680: 67 65 74 42 69 6e 61 72 79 44 69 72 65 63 74 6f  getBinaryDirecto
5690: 72 79 5d 20 24 70 6c 61 74 66 6f 72 6d 20 53 79  ry] $platform Sy
56a0: 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
56b0: 2e 64 6c 6c 5d 5d 0d 0a 20 20 20 20 20 20 7d 20  .dll]]..      } 
56c0: 65 6c 73 65 69 66 20 7b 24 73 74 61 6e 64 61 72  elseif {$standar
56d0: 64 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  d} then {..     
56e0: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
56f0: 4e 4f 54 45 3a 20 52 65 74 75 72 6e 20 74 68 65  NOTE: Return the
5700: 20 6e 61 74 69 76 65 2d 6f 6e 6c 79 20 73 74 61   native-only sta
5710: 6e 64 61 72 64 20 53 51 4c 69 74 65 20 6c 69 62  ndard SQLite lib
5720: 72 61 72 79 20 66 69 6c 65 20 6e 61 6d 65 2e 0d  rary file name..
5730: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
5740: 20 20 20 20 72 65 74 75 72 6e 20 5b 66 69 6c 65      return [file
5750: 20 6e 61 74 69 76 65 6e 61 6d 65 20 5c 0d 0a 20   nativename \.. 
5760: 20 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65             [file
5770: 20 6a 6f 69 6e 20 5b 67 65 74 42 69 6e 61 72 79   join [getBinary
5780: 44 69 72 65 63 74 6f 72 79 5d 20 24 70 6c 61 74  Directory] $plat
5790: 66 6f 72 6d 20 73 71 6c 69 74 65 33 2e 64 6c 6c  form sqlite3.dll
57a0: 5d 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65  ]]..      } else
57b0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20   {..        #.. 
57c0: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 52         # NOTE: R
57d0: 65 74 75 72 6e 20 74 68 65 20 6e 61 74 69 76 65  eturn the native
57e0: 2d 6f 6e 6c 79 20 69 6e 74 65 72 6f 70 20 61 73  -only interop as
57f0: 73 65 6d 62 6c 79 20 66 69 6c 65 20 6e 61 6d 65  sembly file name
5800: 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
5810: 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b 66 69        return [fi
5820: 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65 20 5c 0d  le nativename \.
5830: 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 66 69  .            [fi
5840: 6c 65 20 6a 6f 69 6e 20 5b 67 65 74 42 69 6e 61  le join [getBina
5850: 72 79 44 69 72 65 63 74 6f 72 79 5d 20 24 70 6c  ryDirectory] $pl
5860: 61 74 66 6f 72 6d 20 53 51 4c 69 74 65 2e 49 6e  atform SQLite.In
5870: 74 65 72 6f 70 2e 64 6c 6c 5d 5d 0d 0a 20 20 20  terop.dll]]..   
5880: 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a     }..    }.....
5890: 20 20 20 20 70 72 6f 63 20 67 65 74 43 6f 6d 6d      proc getComm
58a0: 6f 6e 44 69 72 65 63 74 6f 72 79 20 7b 7d 20 7b  onDirectory {} {
58b0: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
58c0: 20 23 20 4e 4f 54 45 3a 20 54 68 69 73 20 70 72   # NOTE: This pr
58d0: 6f 63 65 64 75 72 65 20 72 65 74 75 72 6e 73 20  ocedure returns 
58e0: 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 77 68  the directory wh
58f0: 65 72 65 20 74 68 65 20 74 65 73 74 20 73 63 72  ere the test scr
5900: 69 70 74 73 0d 0a 20 20 20 20 20 20 23 20 20 20  ipts..      #   
5910: 20 20 20 20 73 68 6f 75 6c 64 20 62 65 20 6c 6f      should be lo
5920: 63 61 74 65 64 2e 20 20 42 79 20 64 65 66 61 75  cated.  By defau
5930: 6c 74 2c 20 74 68 69 73 20 6a 75 73 74 20 72 65  lt, this just re
5940: 74 75 72 6e 73 20 74 68 65 20 45 61 67 6c 65 0d  turns the Eagle.
5950: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 62  .      #       b
5960: 69 6e 61 72 79 20 64 69 72 65 63 74 6f 72 79 2e  inary directory.
5970: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
5980: 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74   if {[info exist
5990: 73 20 3a 3a 63 6f 6d 6d 6f 6e 5f 64 69 72 65 63  s ::common_direc
59a0: 74 6f 72 79 5d 20 26 26 20 5c 0d 0a 20 20 20 20  tory] && \..    
59b0: 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65        [string le
59c0: 6e 67 74 68 20 24 3a 3a 63 6f 6d 6d 6f 6e 5f 64  ngth $::common_d
59d0: 69 72 65 63 74 6f 72 79 5d 20 3e 20 30 7d 20 74  irectory] > 0} t
59e0: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  hen {..        #
59f0: 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
5a00: 3a 20 54 68 65 20 6c 6f 63 61 74 69 6f 6e 20 6f  : The location o
5a10: 66 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 64 69 72  f the common dir
5a20: 65 63 74 6f 72 79 20 68 61 73 20 62 65 65 6e 20  ectory has been 
5a30: 73 65 74 3b 0d 0a 20 20 20 20 20 20 20 20 23 20  set;..        # 
5a40: 20 20 20 20 20 20 74 68 65 72 65 66 6f 72 65 2c        therefore,
5a50: 20 75 73 65 20 69 74 2e 0d 0a 20 20 20 20 20 20   use it...      
5a60: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74    #..        ret
5a70: 75 72 6e 20 24 3a 3a 63 6f 6d 6d 6f 6e 5f 64 69  urn $::common_di
5a80: 72 65 63 74 6f 72 79 0d 0a 20 20 20 20 20 20 7d  rectory..      }
5a90: 20 65 6c 73 65 69 66 20 7b 5b 69 6e 66 6f 20 65   elseif {[info e
5aa0: 78 69 73 74 73 20 3a 3a 76 65 6e 64 6f 72 5f 64  xists ::vendor_d
5ab0: 69 72 65 63 74 6f 72 79 5d 20 26 26 20 5c 0d 0a  irectory] && \..
5ac0: 20 20 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e            [strin
5ad0: 67 20 6c 65 6e 67 74 68 20 24 3a 3a 76 65 6e 64  g length $::vend
5ae0: 6f 72 5f 64 69 72 65 63 74 6f 72 79 5d 20 3e 20  or_directory] > 
5af0: 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
5b00: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
5b10: 4e 4f 54 45 3a 20 54 68 65 20 6c 6f 63 61 74 69  NOTE: The locati
5b20: 6f 6e 20 6f 66 20 74 68 65 20 76 65 6e 64 6f 72  on of the vendor
5b30: 20 64 69 72 65 63 74 6f 72 79 20 68 61 73 20 62   directory has b
5b40: 65 65 6e 20 73 65 74 3b 0d 0a 20 20 20 20 20 20  een set;..      
5b50: 20 20 23 20 20 20 20 20 20 20 74 68 65 72 65 66    #       theref
5b60: 6f 72 65 2c 20 75 73 65 20 69 74 2e 0d 0a 20 20  ore, use it...  
5b70: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
5b80: 20 72 65 74 75 72 6e 20 24 3a 3a 76 65 6e 64 6f   return $::vendo
5b90: 72 5f 64 69 72 65 63 74 6f 72 79 0d 0a 20 20 20  r_directory..   
5ba0: 20 20 20 7d 20 65 6c 73 65 69 66 20 7b 5b 69 6e     } elseif {[in
5bb0: 66 6f 20 65 78 69 73 74 73 20 3a 3a 74 63 6c 5f  fo exists ::tcl_
5bc0: 6c 69 62 72 61 72 79 5d 20 26 26 20 5c 0d 0a 20  library] && \.. 
5bd0: 20 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67           [string
5be0: 20 6c 65 6e 67 74 68 20 24 3a 3a 74 63 6c 5f 6c   length $::tcl_l
5bf0: 69 62 72 61 72 79 5d 20 3e 20 30 20 26 26 20 5c  ibrary] > 0 && \
5c00: 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c  ..          [fil
5c10: 65 20 69 73 64 69 72 65 63 74 6f 72 79 20 24 3a  e isdirectory $:
5c20: 3a 74 63 6c 5f 6c 69 62 72 61 72 79 5d 7d 20 74  :tcl_library]} t
5c30: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  hen {..        #
5c40: 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
5c50: 3a 20 54 68 65 20 76 61 72 69 61 62 6c 65 20 77  : The variable w
5c60: 69 74 68 20 74 68 65 20 6c 6f 63 61 74 69 6f 6e  ith the location
5c70: 20 6f 66 20 74 68 65 20 73 63 72 69 70 74 20 6c   of the script l
5c80: 69 62 72 61 72 79 20 69 73 0d 0a 20 20 20 20 20  ibrary is..     
5c90: 20 20 20 23 20 20 20 20 20 20 20 73 65 74 20 61     #       set a
5ca0: 6e 64 20 61 70 70 65 61 72 73 20 74 6f 20 62 65  nd appears to be
5cb0: 20 61 20 72 65 61 6c 20 64 69 72 65 63 74 6f 72   a real director
5cc0: 79 20 28 69 2e 65 2e 20 6e 6f 74 20 65 6d 62 65  y (i.e. not embe
5cd0: 64 64 65 64 0d 0a 20 20 20 20 20 20 20 20 23 20  dded..        # 
5ce0: 20 20 20 20 20 20 77 69 74 68 69 6e 20 61 20 66        within a f
5cf0: 69 6c 65 29 3b 20 74 68 65 72 65 66 6f 72 65 2c  ile); therefore,
5d00: 20 75 73 65 20 69 74 2e 0d 0a 20 20 20 20 20 20   use it...      
5d10: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74    #..        ret
5d20: 75 72 6e 20 24 3a 3a 74 63 6c 5f 6c 69 62 72 61  urn $::tcl_libra
5d30: 72 79 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65  ry..      } else
5d40: 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20   {..        #.. 
5d50: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 46         # NOTE: F
5d60: 61 6c 6c 62 61 63 6b 20 74 6f 20 74 68 65 20 64  allback to the d
5d70: 69 72 65 63 74 6f 72 79 20 63 6f 6e 74 61 69 6e  irectory contain
5d80: 69 6e 67 20 74 68 65 20 65 78 65 63 75 74 61 62  ing the executab
5d90: 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  le...        #..
5da0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b          return [
5db0: 69 6e 66 6f 20 62 69 6e 61 72 79 5d 0d 0a 20 20  info binary]..  
5dc0: 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d      }..    }....
5dd0: 0a 20 20 20 20 70 72 6f 63 20 67 65 74 44 61 74  .    proc getDat
5de0: 61 62 61 73 65 44 69 72 65 63 74 6f 72 79 20 7b  abaseDirectory {
5df0: 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  } {..      #..  
5e00: 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 69 73      # NOTE: This
5e10: 20 70 72 6f 63 65 64 75 72 65 20 72 65 74 75 72   procedure retur
5e20: 6e 73 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  ns the directory
5e30: 20 77 68 65 72 65 20 74 68 65 20 74 65 73 74 20   where the test 
5e40: 64 61 74 61 62 61 73 65 73 0d 0a 20 20 20 20 20  databases..     
5e50: 20 23 20 20 20 20 20 20 20 73 68 6f 75 6c 64 20   #       should 
5e60: 62 65 20 6c 6f 63 61 74 65 64 2e 20 20 42 79 20  be located.  By 
5e70: 64 65 66 61 75 6c 74 2c 20 74 68 69 73 20 6a 75  default, this ju
5e80: 73 74 20 75 73 65 73 20 74 68 65 20 74 65 6d 70  st uses the temp
5e90: 6f 72 61 72 79 0d 0a 20 20 20 20 20 20 23 20 20  orary..      #  
5ea0: 20 20 20 20 20 64 69 72 65 63 74 6f 72 79 20 63       directory c
5eb0: 6f 6e 66 69 67 75 72 65 64 20 66 6f 72 20 74 68  onfigured for th
5ec0: 69 73 20 73 79 73 74 65 6d 2e 0d 0a 20 20 20 20  is system...    
5ed0: 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b    #..      if {[
5ee0: 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 64 61  info exists ::da
5ef0: 74 61 62 61 73 65 5f 64 69 72 65 63 74 6f 72 79  tabase_directory
5f00: 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20  ] && \..        
5f10: 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68    [string length
5f20: 20 24 3a 3a 64 61 74 61 62 61 73 65 5f 64 69 72   $::database_dir
5f30: 65 63 74 6f 72 79 5d 20 3e 20 30 7d 20 74 68 65  ectory] > 0} the
5f40: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  n {..        #..
5f50: 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
5f60: 54 68 65 20 6c 6f 63 61 74 69 6f 6e 20 6f 66 20  The location of 
5f70: 74 68 65 20 64 61 74 61 62 61 73 65 20 64 69 72  the database dir
5f80: 65 63 74 6f 72 79 20 68 61 73 20 62 65 65 6e 20  ectory has been 
5f90: 6f 76 65 72 72 69 64 64 65 6e 3b 0d 0a 20 20 20  overridden;..   
5fa0: 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68 65       #       the
5fb0: 72 65 66 6f 72 65 2c 20 75 73 65 20 69 74 2e 0d  refore, use it..
5fc0: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
5fd0: 20 20 20 20 72 65 74 75 72 6e 20 24 3a 3a 64 61      return $::da
5fe0: 74 61 62 61 73 65 5f 64 69 72 65 63 74 6f 72 79  tabase_directory
5ff0: 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 69 66  ..      } elseif
6000: 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a   {[info exists :
6010: 3a 73 63 72 61 74 63 68 5f 64 69 72 65 63 74 6f  :scratch_directo
6020: 72 79 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20  ry] && \..      
6030: 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67      [string leng
6040: 74 68 20 24 3a 3a 73 63 72 61 74 63 68 5f 64 69  th $::scratch_di
6050: 72 65 63 74 6f 72 79 5d 20 3e 20 30 7d 20 74 68  rectory] > 0} th
6060: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d  en {..        #.
6070: 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
6080: 20 54 68 65 20 6c 6f 63 61 74 69 6f 6e 20 6f 66   The location of
6090: 20 74 68 65 20 73 63 72 61 74 63 68 20 64 69 72   the scratch dir
60a0: 65 63 74 6f 72 79 20 68 61 73 20 62 65 65 6e 20  ectory has been 
60b0: 6f 76 65 72 72 69 64 64 65 6e 3b 0d 0a 20 20 20  overridden;..   
60c0: 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68 65       #       the
60d0: 72 65 66 6f 72 65 2c 20 75 73 65 20 69 74 2e 0d  refore, use it..
60e0: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
60f0: 20 20 20 20 72 65 74 75 72 6e 20 24 3a 3a 73 63      return $::sc
6100: 72 61 74 63 68 5f 64 69 72 65 63 74 6f 72 79 0d  ratch_directory.
6110: 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d  .      } else {.
6120: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
6130: 5b 67 65 74 54 65 6d 70 6f 72 61 72 79 50 61 74  [getTemporaryPat
6140: 68 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20  h]..      }..   
6150: 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
6160: 67 65 74 54 65 6d 70 6f 72 61 72 79 44 69 72 65  getTemporaryDire
6170: 63 74 6f 72 79 20 7b 7d 20 7b 0d 0a 20 20 20 20  ctory {} {..    
6180: 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
6190: 45 3a 20 54 68 69 73 20 70 72 6f 63 65 64 75 72  E: This procedur
61a0: 65 20 72 65 74 75 72 6e 73 20 74 68 65 20 64 69  e returns the di
61b0: 72 65 63 74 6f 72 79 20 77 68 65 72 65 20 74 68  rectory where th
61c0: 65 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  e temporary file
61d0: 73 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  s..      #      
61e0: 20 73 68 6f 75 6c 64 20 62 65 20 6c 6f 63 61 74   should be locat
61f0: 65 64 2e 20 20 42 79 20 64 65 66 61 75 6c 74 2c  ed.  By default,
6200: 20 74 68 69 73 20 6a 75 73 74 20 75 73 65 73 20   this just uses 
6210: 74 68 65 20 74 65 6d 70 6f 72 61 72 79 0d 0a 20  the temporary.. 
6220: 20 20 20 20 20 23 20 20 20 20 20 20 20 64 69 72       #       dir
6230: 65 63 74 6f 72 79 20 63 6f 6e 66 69 67 75 72 65  ectory configure
6240: 64 20 66 6f 72 20 74 68 69 73 20 73 79 73 74 65  d for this syste
6250: 6d 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  m...      #..   
6260: 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69     if {[info exi
6270: 73 74 73 20 3a 3a 74 65 6d 70 6f 72 61 72 79 5f  sts ::temporary_
6280: 64 69 72 65 63 74 6f 72 79 5d 20 26 26 20 5c 0d  directory] && \.
6290: 0a 20 20 20 20 20 20 20 20 20 20 5b 73 74 72 69  .          [stri
62a0: 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a 74 65 6d  ng length $::tem
62b0: 70 6f 72 61 72 79 5f 64 69 72 65 63 74 6f 72 79  porary_directory
62c0: 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20  ] > 0} then {.. 
62d0: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
62e0: 20 20 23 20 4e 4f 54 45 3a 20 54 68 65 20 6c 6f    # NOTE: The lo
62f0: 63 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 74 65  cation of the te
6300: 6d 70 6f 72 61 72 79 20 64 69 72 65 63 74 6f 72  mporary director
6310: 79 20 68 61 73 20 62 65 65 6e 20 6f 76 65 72 72  y has been overr
6320: 69 64 64 65 6e 3b 0d 0a 20 20 20 20 20 20 20 20  idden;..        
6330: 23 20 20 20 20 20 20 20 74 68 65 72 65 66 6f 72  #       therefor
6340: 65 2c 20 75 73 65 20 69 74 2e 0d 0a 20 20 20 20  e, use it...    
6350: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72      #..        r
6360: 65 74 75 72 6e 20 24 3a 3a 74 65 6d 70 6f 72 61  eturn $::tempora
6370: 72 79 5f 64 69 72 65 63 74 6f 72 79 0d 0a 20 20  ry_directory..  
6380: 20 20 20 20 7d 20 65 6c 73 65 69 66 20 7b 5b 69      } elseif {[i
6390: 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 73 63 72  nfo exists ::scr
63a0: 61 74 63 68 5f 64 69 72 65 63 74 6f 72 79 5d 20  atch_directory] 
63b0: 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  && \..          
63c0: 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
63d0: 3a 3a 73 63 72 61 74 63 68 5f 64 69 72 65 63 74  ::scratch_direct
63e0: 6f 72 79 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b  ory] > 0} then {
63f0: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
6400: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 65       # NOTE: The
6410: 20 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 74 68 65   location of the
6420: 20 73 63 72 61 74 63 68 20 64 69 72 65 63 74 6f   scratch directo
6430: 72 79 20 68 61 73 20 62 65 65 6e 20 6f 76 65 72  ry has been over
6440: 72 69 64 64 65 6e 3b 0d 0a 20 20 20 20 20 20 20  ridden;..       
6450: 20 23 20 20 20 20 20 20 20 74 68 65 72 65 66 6f   #       therefo
6460: 72 65 2c 20 75 73 65 20 69 74 2e 0d 0a 20 20 20  re, use it...   
6470: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
6480: 72 65 74 75 72 6e 20 24 3a 3a 73 63 72 61 74 63  return $::scratc
6490: 68 5f 64 69 72 65 63 74 6f 72 79 0d 0a 20 20 20  h_directory..   
64a0: 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
64b0: 20 20 20 20 20 72 65 74 75 72 6e 20 5b 67 65 74       return [get
64c0: 54 65 6d 70 6f 72 61 72 79 50 61 74 68 5d 0d 0a  TemporaryPath]..
64d0: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a        }..    }..
64e0: 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74 54  ...    proc getT
64f0: 65 73 74 4f 76 65 72 72 69 64 65 73 50 72 65 61  estOverridesPrea
6500: 6d 62 6c 65 20 7b 20 7b 65 78 74 72 61 56 61 72  mble { {extraVar
6510: 4e 61 6d 65 73 20 22 22 7d 20 7d 20 7b 0d 0a 20  Names ""} } {.. 
6520: 20 20 20 20 20 73 65 74 20 76 61 72 4e 61 6d 65       set varName
6530: 73 20 5b 6c 69 73 74 5d 0d 0a 0d 0a 20 20 20 20  s [list]....    
6540: 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
6550: 45 3a 20 49 66 20 61 76 61 69 6c 61 62 6c 65 2c  E: If available,
6560: 20 73 74 61 72 74 20 77 69 74 68 20 74 68 65 20   start with the 
6570: 6d 61 73 74 65 72 20 6c 69 73 74 20 6f 66 20 74  master list of t
6580: 65 73 74 20 6f 76 65 72 72 69 64 65 0d 0a 20 20  est override..  
6590: 20 20 20 20 23 20 20 20 20 20 20 20 76 61 72 69      #       vari
65a0: 61 62 6c 65 73 2e 0d 0a 20 20 20 20 20 20 23 0d  ables...      #.
65b0: 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f  .      if {[info
65c0: 20 65 78 69 73 74 73 20 3a 3a 74 65 73 74 5f 6f   exists ::test_o
65d0: 76 65 72 72 69 64 65 73 5d 20 26 26 20 5c 0d 0a  verrides] && \..
65e0: 20 20 20 20 20 20 20 20 20 20 5b 6c 6c 65 6e 67            [lleng
65f0: 74 68 20 24 3a 3a 74 65 73 74 5f 6f 76 65 72 72  th $::test_overr
6600: 69 64 65 73 5d 20 3e 20 30 7d 20 74 68 65 6e 20  ides] > 0} then 
6610: 7b 0d 0a 20 20 20 20 20 20 20 20 65 76 61 6c 20  {..        eval 
6620: 6c 61 70 70 65 6e 64 20 76 61 72 4e 61 6d 65 73  lappend varNames
6630: 20 24 3a 3a 74 65 73 74 5f 6f 76 65 72 72 69 64   $::test_overrid
6640: 65 73 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  es..      }.... 
6650: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
6660: 4e 4f 54 45 3a 20 49 66 20 72 65 71 75 65 73 74  NOTE: If request
6670: 65 64 20 62 79 20 6f 75 72 20 63 61 6c 6c 65 72  ed by our caller
6680: 2c 20 61 64 64 20 61 6e 79 20 61 64 64 69 74 69  , add any additi
6690: 6f 6e 61 6c 20 76 61 72 69 61 62 6c 65 0d 0a 20  onal variable.. 
66a0: 20 20 20 20 20 23 20 20 20 20 20 20 20 6e 61 6d       #       nam
66b0: 65 73 20 74 6f 20 63 6f 70 79 20 6e 6f 77 2e 0d  es to copy now..
66c0: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
66d0: 69 66 20 7b 5b 6c 6c 65 6e 67 74 68 20 24 65 78  if {[llength $ex
66e0: 74 72 61 56 61 72 4e 61 6d 65 73 5d 20 3e 20 30  traVarNames] > 0
66f0: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
6700: 20 20 65 76 61 6c 20 6c 61 70 70 65 6e 64 20 76    eval lappend v
6710: 61 72 4e 61 6d 65 73 20 24 65 78 74 72 61 56 61  arNames $extraVa
6720: 72 4e 61 6d 65 73 0d 0a 20 20 20 20 20 20 7d 0d  rNames..      }.
6730: 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
6740: 20 20 23 20 4e 4f 54 45 3a 20 42 75 69 6c 64 20    # NOTE: Build 
6750: 74 68 65 20 73 63 72 69 70 74 20 66 72 61 67 6d  the script fragm
6760: 65 6e 74 20 74 6f 20 62 65 20 72 65 74 75 72 6e  ent to be return
6770: 65 64 20 62 79 20 70 72 6f 63 65 73 73 69 6e 67  ed by processing
6780: 20 65 61 63 68 0d 0a 20 20 20 20 20 20 23 20 20   each..      #  
6790: 20 20 20 20 20 76 61 72 69 61 62 6c 65 20 6e 61       variable na
67a0: 6d 65 20 61 6e 64 20 61 64 64 69 6e 67 20 74 68  me and adding th
67b0: 65 20 6e 65 63 65 63 65 73 73 61 72 79 20 73 63  e nececessary sc
67c0: 72 69 70 74 20 66 72 61 67 6d 65 6e 74 73 20 66  ript fragments f
67d0: 6f 72 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  or..      #     
67e0: 20 20 65 61 63 68 20 6f 6e 65 2e 0d 0a 20 20 20    each one...   
67f0: 20 20 20 23 0d 0a 20 20 20 20 20 20 73 65 74 20     #..      set 
6800: 72 65 73 75 6c 74 20 22 22 0d 0a 0d 0a 20 20 20  result ""....   
6810: 20 20 20 66 6f 72 65 61 63 68 20 76 61 72 4e 61     foreach varNa
6820: 6d 65 20 24 76 61 72 4e 61 6d 65 73 20 7b 0d 0a  me $varNames {..
6830: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
6840: 20 20 20 23 20 4e 4f 54 45 3a 20 42 75 69 6c 64     # NOTE: Build
6850: 20 74 68 65 20 71 75 61 6c 69 66 69 65 64 20 67   the qualified g
6860: 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20 6e  lobal variable n
6870: 61 6d 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  ame...        #.
6880: 0a 20 20 20 20 20 20 20 20 73 65 74 20 66 75 6c  .        set ful
6890: 6c 56 61 72 4e 61 6d 65 20 5b 61 70 70 65 6e 64  lVarName [append
68a0: 41 72 67 73 20 3a 3a 20 24 76 61 72 4e 61 6d 65  Args :: $varName
68b0: 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  ]....        #..
68c0: 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
68d0: 44 6f 65 73 20 74 68 65 20 76 61 72 69 61 62 6c  Does the variabl
68e0: 65 20 65 78 69 73 74 20 69 6e 20 74 68 69 73 20  e exist in this 
68f0: 69 6e 74 65 72 70 72 65 74 65 72 20 63 6f 6e 74  interpreter cont
6900: 65 78 74 3f 0d 0a 20 20 20 20 20 20 20 20 23 0d  ext?..        #.
6910: 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 69 6e  .        if {[in
6920: 66 6f 20 65 78 69 73 74 73 20 24 66 75 6c 6c 56  fo exists $fullV
6930: 61 72 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d  arName]} then {.
6940: 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
6950: 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
6960: 41 70 70 65 6e 64 20 61 20 73 63 72 69 70 74 20  Append a script 
6970: 66 72 61 67 6d 65 6e 74 20 74 6f 20 74 68 65 20  fragment to the 
6980: 72 65 73 75 6c 74 20 74 68 61 74 20 77 69 6c 6c  result that will
6990: 20 63 6f 72 72 65 63 74 6c 79 0d 0a 20 20 20 20   correctly..    
69a0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63 6f        #       co
69b0: 70 79 20 61 6e 79 20 63 6f 6e 74 61 69 6e 65 64  py any contained
69c0: 20 76 61 6c 75 65 20 74 6f 20 61 6e 6f 74 68 65   value to anothe
69d0: 72 20 69 6e 74 65 72 70 72 65 74 65 72 20 63 6f  r interpreter co
69e0: 6e 74 65 78 74 2e 0d 0a 20 20 20 20 20 20 20 20  ntext...        
69f0: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 61    #..          a
6a00: 70 70 65 6e 64 20 72 65 73 75 6c 74 20 5c 6e 20  ppend result \n 
6a10: 22 73 65 74 20 22 20 24 66 75 6c 6c 56 61 72 4e  "set " $fullVarN
6a20: 61 6d 65 20 22 20 5c 7b 22 20 5b 73 65 74 20 24  ame " \{" [set $
6a30: 66 75 6c 6c 56 61 72 4e 61 6d 65 5d 20 5c 7d 0d  fullVarName] \}.
6a40: 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  .        }..    
6a50: 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a    }....      #..
6a60: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 66        # NOTE: If
6a70: 20 74 68 65 20 72 65 73 75 6c 74 20 63 6f 6e 74   the result cont
6a80: 61 69 6e 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  ains one or more
6a90: 20 73 63 72 69 70 74 20 66 72 61 67 6d 65 6e 74   script fragment
6aa0: 73 2c 20 61 70 70 65 6e 64 20 61 0d 0a 20 20 20  s, append a..   
6ab0: 20 20 20 23 20 20 20 20 20 20 20 6e 65 77 6c 69     #       newli
6ac0: 6e 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  ne...      #..  
6ad0: 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20      if {[string 
6ae0: 6c 65 6e 67 74 68 20 24 72 65 73 75 6c 74 5d 20  length $result] 
6af0: 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  > 0} then {..   
6b00: 20 20 20 20 20 61 70 70 65 6e 64 20 72 65 73 75       append resu
6b10: 6c 74 20 5c 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a  lt \n..      }..
6b20: 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 24  ..      return $
6b30: 72 65 73 75 6c 74 0d 0a 20 20 20 20 7d 0d 0a 0c  result..    }...
6b40: 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74 41 70  ..    proc getAp
6b50: 70 44 6f 6d 61 69 6e 50 72 65 61 6d 62 6c 65 20  pDomainPreamble 
6b60: 7b 20 7b 70 72 65 66 69 78 20 22 22 7d 20 7b 73  { {prefix ""} {s
6b70: 75 66 66 69 78 20 22 22 7d 20 7d 20 7b 0d 0a 20  uffix ""} } {.. 
6b80: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
6b90: 4e 4f 54 45 3a 20 54 68 69 73 20 70 72 6f 63 65  NOTE: This proce
6ba0: 64 75 72 65 20 72 65 74 75 72 6e 73 20 61 20 74  dure returns a t
6bb0: 65 73 74 20 73 65 74 75 70 20 73 63 72 69 70 74  est setup script
6bc0: 20 66 72 61 67 6d 65 6e 74 20 73 75 69 74 61 62   fragment suitab
6bd0: 6c 65 20 66 6f 72 0d 0a 20 20 20 20 20 20 23 20  le for..      # 
6be0: 20 20 20 20 20 20 65 76 61 6c 75 61 74 69 6f 6e        evaluation
6bf0: 20 62 79 20 61 6e 20 69 6e 74 65 72 70 72 65 74   by an interpret
6c00: 65 72 20 63 72 65 61 74 65 64 20 69 6e 20 61 6e  er created in an
6c10: 20 69 73 6f 6c 61 74 65 64 20 61 70 70 6c 69 63   isolated applic
6c20: 61 74 69 6f 6e 0d 0a 20 20 20 20 20 20 23 20 20  ation..      #  
6c30: 20 20 20 20 20 64 6f 6d 61 69 6e 2e 20 20 54 68       domain.  Th
6c40: 65 20 73 63 72 69 70 74 20 66 72 61 67 6d 65 6e  e script fragmen
6c50: 74 20 62 65 69 6e 67 20 72 65 74 75 72 6e 65 64  t being returned
6c60: 20 77 69 6c 6c 20 62 65 20 73 75 72 72 6f 75 6e   will be surroun
6c70: 64 65 64 20 62 79 0d 0a 20 20 20 20 20 20 23 20  ded by..      # 
6c80: 20 20 20 20 20 20 74 68 65 20 70 72 65 66 69 78        the prefix
6c90: 20 61 6e 64 20 73 75 66 66 69 78 20 22 73 63 72   and suffix "scr
6ca0: 69 70 74 20 66 72 61 67 6d 65 6e 74 73 22 20 73  ipt fragments" s
6cb0: 70 65 63 69 66 69 65 64 20 62 79 20 6f 75 72 20  pecified by our 
6cc0: 63 61 6c 6c 65 72 2c 0d 0a 20 20 20 20 20 20 23  caller,..      #
6cd0: 20 20 20 20 20 20 20 69 66 20 61 6e 79 2e 20 20         if any.  
6ce0: 54 68 65 20 65 6e 74 69 72 65 20 73 63 72 69 70  The entire scrip
6cf0: 74 20 62 65 69 6e 67 20 72 65 74 75 72 6e 65 64  t being returned
6d00: 20 77 69 6c 6c 20 62 65 20 73 75 62 73 74 69 74   will be substit
6d10: 75 74 65 64 20 76 69 61 0d 0a 20 20 20 20 20 20  uted via..      
6d20: 23 20 20 20 20 20 20 20 5b 73 75 62 73 74 5d 2c  #       [subst],
6d30: 20 69 6e 20 74 68 65 20 63 6f 6e 74 65 78 74 20   in the context 
6d40: 6f 66 20 6f 75 72 20 63 61 6c 6c 65 72 2c 20 62  of our caller, b
6d50: 65 66 6f 72 65 20 62 65 69 6e 67 20 72 65 74 75  efore being retu
6d60: 72 6e 65 64 2e 0d 0a 20 20 20 20 20 20 23 20 20  rned...      #  
6d70: 20 20 20 20 20 54 68 69 73 20 73 74 65 70 20 69       This step i
6d80: 73 20 6e 65 63 65 73 73 61 72 79 20 73 6f 20 74  s necessary so t
6d90: 68 61 74 20 73 6f 6d 65 20 6c 69 6d 69 74 65 64  hat some limited
6da0: 20 63 6f 6e 74 65 78 74 20 69 6e 66 6f 72 6d 61   context informa
6db0: 74 69 6f 6e 2c 0d 0a 20 20 20 20 20 20 23 20 20  tion,..      #  
6dc0: 20 20 20 20 20 70 72 69 6d 61 72 69 6c 79 20 72       primarily r
6dd0: 65 6c 61 74 65 64 20 74 6f 20 74 68 65 20 74 65  elated to the te
6de0: 73 74 69 6e 67 20 64 69 72 65 63 74 6f 72 69 65  sting directorie
6df0: 73 2c 20 63 61 6e 20 62 65 20 74 72 61 6e 73 66  s, can be transf
6e00: 65 72 72 65 64 0d 0a 20 20 20 20 20 20 23 20 20  erred..      #  
6e10: 20 20 20 20 20 74 6f 20 74 68 65 20 69 6e 74 65       to the inte
6e20: 72 70 72 65 74 65 72 20 69 6e 20 74 68 65 20 69  rpreter in the i
6e30: 73 6f 6c 61 74 65 64 20 61 70 70 6c 69 63 61 74  solated applicat
6e40: 69 6f 6e 20 64 6f 6d 61 69 6e 2c 20 6d 61 6b 69  ion domain, maki
6e50: 6e 67 20 69 74 0d 0a 20 20 20 20 20 20 23 20 20  ng it..      #  
6e60: 20 20 20 20 20 61 62 6c 65 20 74 6f 20 73 75 63       able to suc
6e70: 63 65 73 73 66 75 6c 6c 79 20 72 75 6e 20 74 65  cessfully run te
6e80: 73 74 73 20 74 68 61 74 20 72 65 71 75 69 72 65  sts that require
6e90: 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 66 20   one or more of 
6ea0: 74 68 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20  the..      #    
6eb0: 20 20 20 66 69 6c 65 73 20 69 6e 20 6f 6e 65 20     files in one 
6ec0: 6f 66 20 74 68 65 20 74 65 73 74 69 6e 67 20 64  of the testing d
6ed0: 69 72 65 63 74 6f 72 69 65 73 2e 20 20 43 61 6c  irectories.  Cal
6ee0: 6c 65 72 73 20 73 68 6f 75 6c 64 20 6b 65 65 70  lers should keep
6ef0: 20 69 6e 0d 0a 20 20 20 20 20 20 23 20 20 20 20   in..      #    
6f00: 20 20 20 6d 69 6e 64 20 74 68 61 74 20 74 68 65     mind that the
6f10: 20 74 65 73 74 20 73 63 72 69 70 74 20 66 72 61   test script fra
6f20: 67 6d 65 6e 74 20 62 65 69 6e 67 20 72 65 74 75  gment being retu
6f30: 72 6e 65 64 20 63 61 6e 6e 6f 74 20 72 65 6c 79  rned cannot rely
6f40: 20 6f 6e 0d 0a 20 20 20 20 20 20 23 20 20 20 20   on..      #    
6f50: 20 20 20 61 6e 79 20 73 63 72 69 70 74 20 6c 69     any script li
6f60: 62 72 61 72 79 20 70 72 6f 63 65 64 75 72 65 73  brary procedures
6f70: 20 74 68 61 74 20 61 72 65 20 6e 6f 74 20 70 72   that are not pr
6f80: 6f 76 69 64 65 64 20 62 79 20 74 68 65 20 45 61  ovided by the Ea
6f90: 67 6c 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20  gle..      #    
6fa0: 20 20 20 6c 69 62 72 61 72 79 20 70 61 63 6b 61     library packa
6fb0: 67 65 20 28 69 2e 65 2e 20 22 69 6e 69 74 2e 65  ge (i.e. "init.e
6fc0: 61 67 6c 65 22 29 2c 20 69 6e 63 6c 75 64 69 6e  agle"), includin
6fd0: 67 20 74 68 6f 73 65 20 70 72 6f 76 69 64 65 64  g those provided
6fe0: 20 62 79 0d 0a 20 20 20 20 20 20 23 20 20 20 20   by..      #    
6ff0: 20 20 20 74 68 65 20 45 61 67 6c 65 20 74 65 73     the Eagle tes
7000: 74 20 70 61 63 6b 61 67 65 2c 20 75 6e 6c 65 73  t package, unles
7010: 73 20 74 68 65 20 66 69 6c 65 20 63 6f 6e 74 61  s the file conta
7020: 69 6e 69 6e 67 20 74 68 65 6d 20 69 73 20 6c 6f  ining them is lo
7030: 61 64 65 64 0d 0a 20 20 20 20 20 20 23 20 20 20  aded..      #   
7040: 20 20 20 20 6d 61 6e 75 61 6c 6c 79 20 76 69 61      manually via
7050: 20 73 6f 6d 65 20 6f 74 68 65 72 20 6d 65 63 68   some other mech
7060: 61 6e 69 73 6d 20 28 65 2e 67 2e 20 62 79 20 69  anism (e.g. by i
7070: 6e 63 6c 75 64 69 6e 67 20 61 70 70 72 6f 70 72  ncluding appropr
7080: 69 61 74 65 0d 0a 20 20 20 20 20 20 23 20 20 20  iate..      #   
7090: 20 20 20 20 5b 70 61 63 6b 61 67 65 20 72 65 71      [package req
70a0: 75 69 72 65 5d 20 6f 72 20 5b 73 6f 75 72 63 65  uire] or [source
70b0: 5d 20 63 6f 6d 6d 61 6e 64 73 20 69 6e 20 74 68  ] commands in th
70c0: 65 20 70 72 65 66 69 78 20 6f 72 20 73 75 66 66  e prefix or suff
70d0: 69 78 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  ix..      #     
70e0: 20 20 73 63 72 69 70 74 20 66 72 61 67 6d 65 6e    script fragmen
70f0: 74 73 29 2e 20 20 41 6c 73 6f 2c 20 61 6c 6c 20  ts).  Also, all 
7100: 76 61 72 69 61 62 6c 65 20 72 65 66 65 72 65 6e  variable referen
7110: 63 65 73 20 61 6e 64 20 61 6c 6c 20 6e 65 73 74  ces and all nest
7120: 65 64 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  ed..      #     
7130: 20 20 63 6f 6d 6d 61 6e 64 73 20 28 69 2e 65 2e    commands (i.e.
7140: 20 74 68 6f 73 65 20 69 6e 20 73 71 75 61 72 65   those in square
7150: 20 62 72 61 63 6b 65 74 73 29 20 63 6f 6e 74 61   brackets) conta
7160: 69 6e 65 64 20 69 6e 20 74 68 65 20 66 69 6e 61  ined in the fina
7170: 6c 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  l..      #      
7180: 20 73 63 72 69 70 74 20 66 72 61 67 6d 65 6e 74   script fragment
7190: 20 77 69 6c 6c 20 65 6e 64 20 75 70 20 62 65 69   will end up bei
71a0: 6e 67 20 65 76 61 6c 75 61 74 65 64 20 69 6e 20  ng evaluated in 
71b0: 74 68 65 20 63 6f 6e 74 65 78 74 20 6f 66 20 74  the context of t
71c0: 68 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  he..      #     
71d0: 20 20 63 61 6c 6c 69 6e 67 20 69 6e 74 65 72 70    calling interp
71e0: 72 65 74 65 72 20 61 6e 64 20 6e 6f 74 20 74 68  reter and not th
71f0: 65 20 74 61 72 67 65 74 20 69 6e 74 65 72 70 72  e target interpr
7200: 65 74 65 72 20 63 72 65 61 74 65 64 20 69 6e 20  eter created in 
7210: 74 68 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20  the..      #    
7220: 20 20 20 69 73 6f 6c 61 74 65 64 20 61 70 70 6c     isolated appl
7230: 69 63 61 74 69 6f 6e 20 64 6f 6d 61 69 6e 20 75  ication domain u
7240: 6e 6c 65 73 73 20 74 68 65 20 64 6f 6c 6c 61 72  nless the dollar
7250: 20 73 69 67 6e 73 20 61 6e 64 2f 6f 72 20 73 71   signs and/or sq
7260: 75 61 72 65 0d 0a 20 20 20 20 20 20 23 20 20 20  uare..      #   
7270: 20 20 20 20 62 72 61 63 6b 65 74 73 20 61 72 65      brackets are
7280: 20 73 70 65 63 69 61 6c 6c 79 20 71 75 6f 74 65   specially quote
7290: 64 20 77 69 74 68 20 62 61 63 6b 73 6c 61 73 68  d with backslash
72a0: 65 73 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  es...      #..  
72b0: 20 20 20 20 72 65 74 75 72 6e 20 5b 75 70 6c 65      return [uple
72c0: 76 65 6c 20 31 20 5b 6c 69 73 74 20 73 75 62 73  vel 1 [list subs
72d0: 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20 24 70  t [appendArgs $p
72e0: 72 65 66 69 78 20 7b 0d 0a 20 20 20 20 20 20 20  refix {..       
72f0: 20 69 66 20 7b 5b 68 61 73 52 75 6e 74 69 6d 65   if {[hasRuntime
7300: 4f 70 74 69 6f 6e 20 6e 61 74 69 76 65 5d 7d 20  Option native]} 
7310: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
7320: 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20    object invoke 
7330: 49 6e 74 65 72 70 72 65 74 65 72 2e 47 65 74 41  Interpreter.GetA
7340: 63 74 69 76 65 20 41 64 64 52 75 6e 74 69 6d 65  ctive AddRuntime
7350: 4f 70 74 69 6f 6e 20 6e 61 74 69 76 65 0d 0a 20  Option native.. 
7360: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
7370: 7d 20 5b 67 65 74 54 65 73 74 4f 76 65 72 72 69  } [getTestOverri
7380: 64 65 73 50 72 65 61 6d 62 6c 65 20 5b 6c 69 73  desPreamble [lis
7390: 74 20 70 61 74 68 20 74 65 73 74 5f 63 68 61 6e  t path test_chan
73a0: 6e 65 6c 5d 5d 20 24 73 75 66 66 69 78 5d 5d 5d  nel]] $suffix]]]
73b0: 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
73c0: 70 72 6f 63 20 74 72 79 43 6f 70 79 42 69 6e 61  proc tryCopyBina
73d0: 72 79 46 69 6c 65 20 7b 20 66 69 6c 65 4e 61 6d  ryFile { fileNam
73e0: 65 20 7b 70 6c 61 74 66 6f 72 6d 20 22 22 7d 20  e {platform ""} 
73f0: 7b 6e 65 77 46 69 6c 65 4e 61 6d 65 20 22 22 7d  {newFileName ""}
7400: 20 7d 20 7b 0d 0a 20 20 20 20 20 20 73 65 74 20   } {..      set 
7410: 73 6f 75 72 63 65 46 69 6c 65 4e 61 6d 65 20 5b  sourceFileName [
7420: 67 65 74 42 69 6e 61 72 79 46 69 6c 65 4e 61 6d  getBinaryFileNam
7430: 65 20 24 66 69 6c 65 4e 61 6d 65 20 24 70 6c 61  e $fileName $pla
7440: 74 66 6f 72 6d 5d 0d 0a 0d 0a 20 20 20 20 20 20  tform]....      
7450: 69 66 20 7b 21 5b 66 69 6c 65 20 65 78 69 73 74  if {![file exist
7460: 73 20 24 73 6f 75 72 63 65 46 69 6c 65 4e 61 6d  s $sourceFileNam
7470: 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  e]} then {..    
7480: 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
7490: 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e  t_channel [appen
74a0: 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
74b0: 20 20 20 20 20 22 2d 2d 2d 2d 20 73 6b 69 70 70       "---- skipp
74c0: 65 64 20 63 6f 70 79 69 6e 67 20 62 69 6e 61 72  ed copying binar
74d0: 79 20 66 69 6c 65 20 5c 22 22 20 24 73 6f 75 72  y file \"" $sour
74e0: 63 65 46 69 6c 65 4e 61 6d 65 20 5c 0d 0a 20 20  ceFileName \..  
74f0: 20 20 20 20 20 20 20 20 20 20 22 5c 22 2c 20 69            "\", i
7500: 74 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74  t does not exist
7510: 5c 6e 22 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  \n"]....        
7520: 72 65 74 75 72 6e 0d 0a 20 20 20 20 20 20 7d 0d  return..      }.
7530: 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 73 74  ...      if {[st
7540: 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 6e 65 77  ring length $new
7550: 46 69 6c 65 4e 61 6d 65 5d 20 3e 20 30 7d 20 74  FileName] > 0} t
7560: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 73  hen {..        s
7570: 65 74 20 74 61 72 67 65 74 46 69 6c 65 4e 61 6d  et targetFileNam
7580: 65 20 5b 67 65 74 42 75 69 6c 64 46 69 6c 65 4e  e [getBuildFileN
7590: 61 6d 65 20 24 6e 65 77 46 69 6c 65 4e 61 6d 65  ame $newFileName
75a0: 20 24 70 6c 61 74 66 6f 72 6d 5d 0d 0a 20 20 20   $platform]..   
75b0: 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
75c0: 20 20 20 20 20 73 65 74 20 74 61 72 67 65 74 46       set targetF
75d0: 69 6c 65 4e 61 6d 65 20 5b 67 65 74 42 75 69 6c  ileName [getBuil
75e0: 64 46 69 6c 65 4e 61 6d 65 20 24 66 69 6c 65 4e  dFileName $fileN
75f0: 61 6d 65 20 24 70 6c 61 74 66 6f 72 6d 5d 0d 0a  ame $platform]..
7600: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
7610: 20 73 65 74 20 74 61 72 67 65 74 44 69 72 65 63   set targetDirec
7620: 74 6f 72 79 20 5b 66 69 6c 65 20 64 69 72 6e 61  tory [file dirna
7630: 6d 65 20 24 74 61 72 67 65 74 46 69 6c 65 4e 61  me $targetFileNa
7640: 6d 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20  me]....      if 
7650: 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20  {[catch {..     
7660: 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 66           if {![f
7670: 69 6c 65 20 65 78 69 73 74 73 20 24 74 61 72 67  ile exists $targ
7680: 65 74 44 69 72 65 63 74 6f 72 79 5d 7d 20 74 68  etDirectory]} th
7690: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
76a0: 20 20 20 20 20 20 66 69 6c 65 20 6d 6b 64 69 72        file mkdir
76b0: 20 24 74 61 72 67 65 74 44 69 72 65 63 74 6f 72   $targetDirector
76c0: 79 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  y..             
76d0: 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   }..            
76e0: 20 20 66 69 6c 65 20 63 6f 70 79 20 2d 66 6f 72    file copy -for
76f0: 63 65 20 24 73 6f 75 72 63 65 46 69 6c 65 4e 61  ce $sourceFileNa
7700: 6d 65 20 24 74 61 72 67 65 74 46 69 6c 65 4e 61  me $targetFileNa
7710: 6d 65 7d 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20  me}] == 0} then 
7720: 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73  {..        tputs
7730: 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
7740: 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
7750: 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
7760: 2d 20 63 6f 70 69 65 64 20 62 69 6e 61 72 79 20  - copied binary 
7770: 66 69 6c 65 20 66 72 6f 6d 20 5c 22 22 20 24 73  file from \"" $s
7780: 6f 75 72 63 65 46 69 6c 65 4e 61 6d 65 20 22 5c  ourceFileName "\
7790: 22 20 74 6f 20 5c 22 22 20 5c 0d 0a 20 20 20 20  " to \"" \..    
77a0: 20 20 20 20 20 20 20 20 24 74 61 72 67 65 74 46          $targetF
77b0: 69 6c 65 4e 61 6d 65 20 5c 22 5c 6e 5d 0d 0a 20  ileName \"\n].. 
77c0: 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
77d0: 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
77e0: 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70  test_channel [ap
77f0: 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
7800: 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 66 61          "---- fa
7810: 69 6c 65 64 20 74 6f 20 63 6f 70 79 20 62 69 6e  iled to copy bin
7820: 61 72 79 20 66 69 6c 65 20 66 72 6f 6d 20 5c 22  ary file from \"
7830: 22 20 24 73 6f 75 72 63 65 46 69 6c 65 4e 61 6d  " $sourceFileNam
7840: 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e \..           
7850: 20 22 5c 22 20 74 6f 20 5c 22 22 20 24 74 61 72   "\" to \"" $tar
7860: 67 65 74 46 69 6c 65 4e 61 6d 65 20 5c 22 5c 6e  getFileName \"\n
7870: 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  ]..      }..    
7880: 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 74  }.....    proc t
7890: 72 79 43 6f 70 79 42 75 69 6c 64 46 69 6c 65 20  ryCopyBuildFile 
78a0: 7b 20 66 69 6c 65 4e 61 6d 65 20 7b 70 6c 61 74  { fileName {plat
78b0: 66 6f 72 6d 20 22 22 7d 20 7b 6e 65 77 46 69 6c  form ""} {newFil
78c0: 65 4e 61 6d 65 20 22 22 7d 20 7d 20 7b 0d 0a 20  eName ""} } {.. 
78d0: 20 20 20 20 20 73 65 74 20 73 6f 75 72 63 65 46       set sourceF
78e0: 69 6c 65 4e 61 6d 65 20 5b 67 65 74 42 75 69 6c  ileName [getBuil
78f0: 64 46 69 6c 65 4e 61 6d 65 20 24 66 69 6c 65 4e  dFileName $fileN
7900: 61 6d 65 20 24 70 6c 61 74 66 6f 72 6d 5d 0d 0a  ame $platform]..
7910: 0d 0a 20 20 20 20 20 20 69 66 20 7b 21 5b 66 69  ..      if {![fi
7920: 6c 65 20 65 78 69 73 74 73 20 24 73 6f 75 72 63  le exists $sourc
7930: 65 46 69 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e  eFileName]} then
7940: 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74   {..        tput
7950: 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
7960: 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
7970: 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d  .            "--
7980: 2d 2d 20 73 6b 69 70 70 65 64 20 63 6f 70 79 69  -- skipped copyi
7990: 6e 67 20 62 75 69 6c 64 20 66 69 6c 65 20 5c 22  ng build file \"
79a0: 22 20 24 73 6f 75 72 63 65 46 69 6c 65 4e 61 6d  " $sourceFileNam
79b0: 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e \..           
79c0: 20 22 5c 22 2c 20 69 74 20 64 6f 65 73 20 6e 6f   "\", it does no
79d0: 74 20 65 78 69 73 74 5c 6e 22 5d 0d 0a 0d 0a 20  t exist\n"].... 
79e0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 0d 0a 20         return.. 
79f0: 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
7a00: 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67  if {[string leng
7a10: 74 68 20 24 6e 65 77 46 69 6c 65 4e 61 6d 65 5d  th $newFileName]
7a20: 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20   > 0} then {..  
7a30: 20 20 20 20 20 20 73 65 74 20 74 61 72 67 65 74        set target
7a40: 46 69 6c 65 4e 61 6d 65 20 5b 67 65 74 42 69 6e  FileName [getBin
7a50: 61 72 79 46 69 6c 65 4e 61 6d 65 20 24 6e 65 77  aryFileName $new
7a60: 46 69 6c 65 4e 61 6d 65 20 24 70 6c 61 74 66 6f  FileName $platfo
7a70: 72 6d 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73  rm]..      } els
7a80: 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 65 74  e {..        set
7a90: 20 74 61 72 67 65 74 46 69 6c 65 4e 61 6d 65 20   targetFileName 
7aa0: 5b 67 65 74 42 69 6e 61 72 79 46 69 6c 65 4e 61  [getBinaryFileNa
7ab0: 6d 65 20 24 66 69 6c 65 4e 61 6d 65 20 24 70 6c  me $fileName $pl
7ac0: 61 74 66 6f 72 6d 5d 0d 0a 20 20 20 20 20 20 7d  atform]..      }
7ad0: 0d 0a 0d 0a 20 20 20 20 20 20 73 65 74 20 74 61  ....      set ta
7ae0: 72 67 65 74 44 69 72 65 63 74 6f 72 79 20 5b 66  rgetDirectory [f
7af0: 69 6c 65 20 64 69 72 6e 61 6d 65 20 24 74 61 72  ile dirname $tar
7b00: 67 65 74 46 69 6c 65 4e 61 6d 65 5d 0d 0a 0d 0a  getFileName]....
7b10: 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68        if {[catch
7b20: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
7b30: 20 20 69 66 20 7b 21 5b 66 69 6c 65 20 65 78 69    if {![file exi
7b40: 73 74 73 20 24 74 61 72 67 65 74 44 69 72 65 63  sts $targetDirec
7b50: 74 6f 72 79 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  tory]} then {.. 
7b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66                 f
7b70: 69 6c 65 20 6d 6b 64 69 72 20 24 74 61 72 67 65  ile mkdir $targe
7b80: 74 44 69 72 65 63 74 6f 72 79 0d 0a 20 20 20 20  tDirectory..    
7b90: 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
7ba0: 20 20 20 20 20 20 20 20 20 20 20 66 69 6c 65 20             file 
7bb0: 63 6f 70 79 20 2d 66 6f 72 63 65 20 24 73 6f 75  copy -force $sou
7bc0: 72 63 65 46 69 6c 65 4e 61 6d 65 20 24 74 61 72  rceFileName $tar
7bd0: 67 65 74 46 69 6c 65 4e 61 6d 65 7d 5d 20 3d 3d  getFileName}] ==
7be0: 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
7bf0: 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
7c00: 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e  t_channel [appen
7c10: 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
7c20: 20 20 20 20 20 22 2d 2d 2d 2d 20 63 6f 70 69 65       "---- copie
7c30: 64 20 62 75 69 6c 64 20 66 69 6c 65 20 66 72 6f  d build file fro
7c40: 6d 20 5c 22 22 20 24 73 6f 75 72 63 65 46 69 6c  m \"" $sourceFil
7c50: 65 4e 61 6d 65 20 22 5c 22 20 74 6f 20 5c 22 22  eName "\" to \""
7c60: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
7c70: 24 74 61 72 67 65 74 46 69 6c 65 4e 61 6d 65 20  $targetFileName 
7c80: 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d 20 65  \"\n]..      } e
7c90: 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 74  lse {..        t
7ca0: 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
7cb0: 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
7cc0: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
7cd0: 22 2d 2d 2d 2d 20 66 61 69 6c 65 64 20 74 6f 20  "---- failed to 
7ce0: 63 6f 70 79 20 62 75 69 6c 64 20 66 69 6c 65 20  copy build file 
7cf0: 66 72 6f 6d 20 5c 22 22 20 24 73 6f 75 72 63 65  from \"" $source
7d00: 46 69 6c 65 4e 61 6d 65 20 5c 0d 0a 20 20 20 20  FileName \..    
7d10: 20 20 20 20 20 20 20 20 22 5c 22 20 74 6f 20 5c          "\" to \
7d20: 22 22 20 24 74 61 72 67 65 74 46 69 6c 65 4e 61  "" $targetFileNa
7d30: 6d 65 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20  me \"\n]..      
7d40: 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  }..    }.....   
7d50: 20 70 72 6f 63 20 74 72 79 44 65 6c 65 74 65 42   proc tryDeleteB
7d60: 69 6e 61 72 79 46 69 6c 65 20 7b 20 66 69 6c 65  inaryFile { file
7d70: 4e 61 6d 65 20 7b 70 6c 61 74 66 6f 72 6d 20 22  Name {platform "
7d80: 22 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 73 65  "} } {..      se
7d90: 74 20 66 69 6c 65 4e 61 6d 65 20 5b 67 65 74 42  t fileName [getB
7da0: 69 6e 61 72 79 46 69 6c 65 4e 61 6d 65 20 24 66  inaryFileName $f
7db0: 69 6c 65 4e 61 6d 65 20 24 70 6c 61 74 66 6f 72  ileName $platfor
7dc0: 6d 5d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b  m]....      if {
7dd0: 21 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24 66  ![file exists $f
7de0: 69 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b  ileName]} then {
7df0: 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20  ..        tputs 
7e00: 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
7e10: 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
7e20: 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
7e30: 20 73 6b 69 70 70 65 64 20 64 65 6c 65 74 69 6e   skipped deletin
7e40: 67 20 62 69 6e 61 72 79 20 66 69 6c 65 20 5c 22  g binary file \"
7e50: 22 20 24 66 69 6c 65 4e 61 6d 65 20 5c 0d 0a 20  " $fileName \.. 
7e60: 20 20 20 20 20 20 20 20 20 20 20 22 5c 22 2c 20             "\", 
7e70: 69 74 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73  it does not exis
7e80: 74 5c 6e 22 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  t\n"]....       
7e90: 20 72 65 74 75 72 6e 0d 0a 20 20 20 20 20 20 7d   return..      }
7ea0: 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 63  ....      if {[c
7eb0: 61 74 63 68 20 7b 66 69 6c 65 20 64 65 6c 65 74  atch {file delet
7ec0: 65 20 24 66 69 6c 65 4e 61 6d 65 7d 5d 20 3d 3d  e $fileName}] ==
7ed0: 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
7ee0: 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
7ef0: 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e  t_channel [appen
7f00: 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
7f10: 20 20 20 20 20 22 2d 2d 2d 2d 20 64 65 6c 65 74       "---- delet
7f20: 65 64 20 62 69 6e 61 72 79 20 66 69 6c 65 20 5c  ed binary file \
7f30: 22 22 20 24 66 69 6c 65 4e 61 6d 65 20 5c 22 5c  "" $fileName \"\
7f40: 6e 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65  n]..      } else
7f50: 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74   {..        tput
7f60: 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
7f70: 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
7f80: 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d  .            "--
7f90: 2d 2d 20 66 61 69 6c 65 64 20 74 6f 20 64 65 6c  -- failed to del
7fa0: 65 74 65 20 62 69 6e 61 72 79 20 66 69 6c 65 20  ete binary file 
7fb0: 5c 22 22 20 24 66 69 6c 65 4e 61 6d 65 20 5c 22  \"" $fileName \"
7fc0: 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20  \n]..      }..  
7fd0: 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
7fe0: 20 74 72 79 44 65 6c 65 74 65 42 75 69 6c 64 46   tryDeleteBuildF
7ff0: 69 6c 65 20 7b 20 66 69 6c 65 4e 61 6d 65 20 7b  ile { fileName {
8000: 70 6c 61 74 66 6f 72 6d 20 22 22 7d 20 7d 20 7b  platform ""} } {
8010: 0d 0a 20 20 20 20 20 20 73 65 74 20 66 69 6c 65  ..      set file
8020: 4e 61 6d 65 20 5b 67 65 74 42 75 69 6c 64 46 69  Name [getBuildFi
8030: 6c 65 4e 61 6d 65 20 24 66 69 6c 65 4e 61 6d 65  leName $fileName
8040: 20 24 70 6c 61 74 66 6f 72 6d 5d 0d 0a 0d 0a 20   $platform].... 
8050: 20 20 20 20 20 69 66 20 7b 21 5b 66 69 6c 65 20       if {![file 
8060: 65 78 69 73 74 73 20 24 66 69 6c 65 4e 61 6d 65  exists $fileName
8070: 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
8080: 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
8090: 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  _channel [append
80a0: 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
80b0: 20 20 20 20 22 2d 2d 2d 2d 20 73 6b 69 70 70 65      "---- skippe
80c0: 64 20 64 65 6c 65 74 69 6e 67 20 62 75 69 6c 64  d deleting build
80d0: 20 66 69 6c 65 20 5c 22 22 20 24 66 69 6c 65 4e   file \"" $fileN
80e0: 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ame \..         
80f0: 20 20 20 22 5c 22 2c 20 69 74 20 64 6f 65 73 20     "\", it does 
8100: 6e 6f 74 20 65 78 69 73 74 5c 6e 22 5d 0d 0a 0d  not exist\n"]...
8110: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 0d  .        return.
8120: 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
8130: 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 66 69    if {[catch {fi
8140: 6c 65 20 64 65 6c 65 74 65 20 24 66 69 6c 65 4e  le delete $fileN
8150: 61 6d 65 7d 5d 20 3d 3d 20 30 7d 20 74 68 65 6e  ame}] == 0} then
8160: 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74   {..        tput
8170: 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
8180: 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
8190: 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d  .            "--
81a0: 2d 2d 20 64 65 6c 65 74 65 64 20 62 75 69 6c 64  -- deleted build
81b0: 20 66 69 6c 65 20 5c 22 22 20 24 66 69 6c 65 4e   file \"" $fileN
81c0: 61 6d 65 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20  ame \"\n]..     
81d0: 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
81e0: 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
81f0: 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  _channel [append
8200: 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
8210: 20 20 20 20 22 2d 2d 2d 2d 20 66 61 69 6c 65 64      "---- failed
8220: 20 74 6f 20 64 65 6c 65 74 65 20 62 75 69 6c 64   to delete build
8230: 20 66 69 6c 65 20 5c 22 22 20 24 66 69 6c 65 4e   file \"" $fileN
8240: 61 6d 65 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20  ame \"\n]..     
8250: 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20   }..    }.....  
8260: 20 20 70 72 6f 63 20 74 72 79 43 6f 70 79 41 73    proc tryCopyAs
8270: 73 65 6d 62 6c 79 20 7b 20 66 69 6c 65 4e 61 6d  sembly { fileNam
8280: 65 20 7b 70 6c 61 74 66 6f 72 6d 20 22 22 7d 20  e {platform ""} 
8290: 7b 70 64 62 20 74 72 75 65 7d 20 7d 20 7b 0d 0a  {pdb true} } {..
82a0: 20 20 20 20 20 20 74 72 79 43 6f 70 79 42 75 69        tryCopyBui
82b0: 6c 64 46 69 6c 65 20 24 66 69 6c 65 4e 61 6d 65  ldFile $fileName
82c0: 20 24 70 6c 61 74 66 6f 72 6d 0d 0a 0d 0a 20 20   $platform....  
82d0: 20 20 20 20 69 66 20 7b 24 70 64 62 7d 20 74 68      if {$pdb} th
82e0: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 72  en {..        tr
82f0: 79 43 6f 70 79 42 75 69 6c 64 46 69 6c 65 20 5b  yCopyBuildFile [
8300: 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
8310: 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20            [file 
8320: 72 6f 6f 74 6e 61 6d 65 20 24 66 69 6c 65 4e 61  rootname $fileNa
8330: 6d 65 5d 20 2e 70 64 62 5d 20 24 70 6c 61 74 66  me] .pdb] $platf
8340: 6f 72 6d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20  orm..      }..  
8350: 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
8360: 20 74 72 79 44 65 6c 65 74 65 41 73 73 65 6d 62   tryDeleteAssemb
8370: 6c 79 20 7b 20 66 69 6c 65 4e 61 6d 65 20 7b 70  ly { fileName {p
8380: 6c 61 74 66 6f 72 6d 20 22 22 7d 20 7b 70 64 62  latform ""} {pdb
8390: 20 74 72 75 65 7d 20 7d 20 7b 0d 0a 20 20 20 20   true} } {..    
83a0: 20 20 74 72 79 44 65 6c 65 74 65 42 69 6e 61 72    tryDeleteBinar
83b0: 79 46 69 6c 65 20 24 66 69 6c 65 4e 61 6d 65 20  yFile $fileName 
83c0: 24 70 6c 61 74 66 6f 72 6d 0d 0a 0d 0a 20 20 20  $platform....   
83d0: 20 20 20 69 66 20 7b 24 70 64 62 7d 20 74 68 65     if {$pdb} the
83e0: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 72 79  n {..        try
83f0: 44 65 6c 65 74 65 42 69 6e 61 72 79 46 69 6c 65  DeleteBinaryFile
8400: 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
8410: 20 20 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c              [fil
8420: 65 20 72 6f 6f 74 6e 61 6d 65 20 24 66 69 6c 65  e rootname $file
8430: 4e 61 6d 65 5d 20 2e 70 64 62 5d 20 24 70 6c 61  Name] .pdb] $pla
8440: 74 66 6f 72 6d 0d 0a 20 20 20 20 20 20 7d 0d 0a  tform..      }..
8450: 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
8460: 6f 63 20 74 72 79 4c 6f 61 64 41 73 73 65 6d 62  oc tryLoadAssemb
8470: 6c 79 20 7b 20 66 69 6c 65 4e 61 6d 65 20 7b 70  ly { fileName {p
8480: 6c 61 74 66 6f 72 6d 20 22 22 7d 20 7d 20 7b 0d  latform ""} } {.
8490: 0a 20 20 20 20 20 20 73 65 74 20 66 69 6c 65 4e  .      set fileN
84a0: 61 6d 65 20 5b 67 65 74 42 69 6e 61 72 79 46 69  ame [getBinaryFi
84b0: 6c 65 4e 61 6d 65 20 24 66 69 6c 65 4e 61 6d 65  leName $fileName
84c0: 20 24 70 6c 61 74 66 6f 72 6d 5d 0d 0a 0d 0a 20   $platform].... 
84d0: 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20       if {[catch 
84e0: 7b 73 65 74 20 61 73 73 65 6d 62 6c 79 20 5c 0d  {set assembly \.
84f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b  .              [
8500: 6f 62 6a 65 63 74 20 6c 6f 61 64 20 2d 6c 6f 61  object load -loa
8510: 64 74 79 70 65 20 46 69 6c 65 20 2d 61 6c 69 61  dtype File -alia
8520: 73 20 24 66 69 6c 65 4e 61 6d 65 5d 7d 5d 20 3d  s $fileName]}] =
8530: 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  = 0} then {..   
8540: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
8550: 23 20 4e 4f 54 45 3a 20 4e 6f 77 2c 20 61 64 64  # NOTE: Now, add
8560: 20 74 68 65 20 6e 65 63 65 73 73 61 72 79 20 74   the necessary t
8570: 65 73 74 20 63 6f 6e 73 74 72 61 69 6e 74 2e 0d  est constraint..
8580: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
8590: 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e      addConstrain
85a0: 74 20 5b 66 69 6c 65 20 72 6f 6f 74 6e 61 6d 65  t [file rootname
85b0: 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 66 69 6c   [file tail $fil
85c0: 65 4e 61 6d 65 5d 5d 0d 0a 0d 0a 20 20 20 20 20  eName]]....     
85d0: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
85e0: 4e 4f 54 45 3a 20 47 72 61 62 20 74 68 65 20 69  NOTE: Grab the i
85f0: 6d 61 67 65 20 72 75 6e 74 69 6d 65 20 76 65 72  mage runtime ver
8600: 73 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 61 73  sion from the as
8610: 73 65 6d 62 6c 79 20 62 65 63 61 75 73 65 0d 0a  sembly because..
8620: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
8630: 73 65 76 65 72 61 6c 20 74 65 73 74 73 20 72 65  several tests re
8640: 6c 79 20 6f 6e 20 69 74 20 68 61 76 69 6e 67 20  ly on it having 
8650: 61 20 63 65 72 74 61 69 6e 20 76 61 6c 75 65 2e  a certain value.
8660: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
8670: 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69       addConstrai
8680: 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5b  nt [appendArgs [
8690: 66 69 6c 65 20 74 61 69 6c 20 24 66 69 6c 65 4e  file tail $fileN
86a0: 61 6d 65 5d 20 5f 20 5c 0d 0a 20 20 20 20 20 20  ame] _ \..      
86b0: 20 20 20 20 20 20 5b 24 61 73 73 65 6d 62 6c 79        [$assembly
86c0: 20 49 6d 61 67 65 52 75 6e 74 69 6d 65 56 65 72   ImageRuntimeVer
86d0: 73 69 6f 6e 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20  sion]]....      
86e0: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
86f0: 4f 54 45 3a 20 52 65 74 75 72 6e 20 74 68 65 20  OTE: Return the 
8700: 66 75 6c 6c 20 70 61 74 68 20 6f 66 20 74 68 65  full path of the
8710: 20 6c 6f 61 64 65 64 20 66 69 6c 65 2e 0d 0a 20   loaded file... 
8720: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
8730: 20 20 72 65 74 75 72 6e 20 24 66 69 6c 65 4e 61    return $fileNa
8740: 6d 65 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  me..      }.... 
8750: 20 20 20 20 20 72 65 74 75 72 6e 20 22 22 0d 0a       return ""..
8760: 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
8770: 6f 63 20 69 73 53 51 4c 69 74 65 52 65 61 64 79  oc isSQLiteReady
8780: 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a   {} {..      #..
8790: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68        # NOTE: Th
87a0: 69 73 20 70 72 6f 63 65 64 75 72 65 20 6d 75 73  is procedure mus
87b0: 74 20 72 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72  t return non-zer
87c0: 6f 20 6f 6e 6c 79 20 69 66 20 74 68 65 20 53 51  o only if the SQ
87d0: 4c 69 74 65 20 6e 61 74 69 76 65 0d 0a 20 20 20  Lite native..   
87e0: 20 20 20 23 20 20 20 20 20 20 20 6c 69 62 72 61     #       libra
87f0: 72 79 20 61 6e 64 20 74 68 65 20 53 79 73 74 65  ry and the Syste
8800: 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 20 6d 61  m.Data.SQLite ma
8810: 6e 61 67 65 64 20 61 73 73 65 6d 62 6c 79 20 61  naged assembly a
8820: 72 65 20 6c 6f 61 64 65 64 0d 0a 20 20 20 20 20  re loaded..     
8830: 20 23 20 20 20 20 20 20 20 61 6e 64 20 72 65 61   #       and rea
8840: 64 79 20 66 6f 72 20 75 73 65 20 62 79 20 74 68  dy for use by th
8850: 65 20 74 65 73 74 20 73 75 69 74 65 2e 20 20 43  e test suite.  C
8860: 75 72 72 65 6e 74 6c 79 2c 20 74 68 69 73 20 70  urrently, this p
8870: 72 6f 63 65 64 75 72 65 0d 0a 20 20 20 20 20 20  rocedure..      
8880: 23 20 20 20 20 20 20 20 73 68 6f 75 6c 64 20 62  #       should b
8890: 65 20 63 61 6c 6c 65 64 20 6f 6e 6c 79 20 61 66  e called only af
88a0: 74 65 72 20 74 68 65 20 5b 74 72 79 4c 6f 61 64  ter the [tryLoad
88b0: 41 73 73 65 6d 62 6c 79 5d 20 70 72 6f 63 65 64  Assembly] proced
88c0: 75 72 65 20 68 61 73 0d 0a 20 20 20 20 20 20 23  ure has..      #
88d0: 20 20 20 20 20 20 20 62 65 65 6e 20 63 61 6c 6c         been call
88e0: 65 64 20 74 6f 20 70 72 6f 62 65 20 66 6f 72 20  ed to probe for 
88f0: 74 68 65 20 53 79 73 74 65 6d 2e 44 61 74 61 2e  the System.Data.
8900: 53 51 4c 69 74 65 20 6d 61 6e 61 67 65 64 20 61  SQLite managed a
8910: 73 73 65 6d 62 6c 79 0d 0a 20 20 20 20 20 20 23  ssembly..      #
8920: 20 20 20 20 20 20 20 61 6e 64 20 74 68 65 20 5b         and the [
8930: 63 68 65 63 6b 46 6f 72 53 51 4c 69 74 65 5d 20  checkForSQLite] 
8940: 70 72 6f 63 65 64 75 72 65 20 68 61 73 20 62 65  procedure has be
8950: 65 6e 20 63 61 6c 6c 65 64 20 74 6f 20 70 72 6f  en called to pro
8960: 62 65 20 66 6f 72 0d 0a 20 20 20 20 20 20 23 20  be for..      # 
8970: 20 20 20 20 20 20 74 68 65 20 53 51 4c 69 74 65        the SQLite
8980: 20 6e 61 74 69 76 65 20 6c 69 62 72 61 72 79 3b   native library;
8990: 20 6f 74 68 65 72 77 69 73 65 2c 20 74 68 69 73   otherwise, this
89a0: 20 70 72 6f 63 65 64 75 72 65 20 77 69 6c 6c 20   procedure will 
89b0: 73 69 6d 70 6c 79 0d 0a 20 20 20 20 20 20 23 20  simply..      # 
89c0: 20 20 20 20 20 20 61 6c 77 61 79 73 20 72 65 74        always ret
89d0: 75 72 6e 20 7a 65 72 6f 2e 0d 0a 20 20 20 20 20  urn zero...     
89e0: 20 23 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e   #..      return
89f0: 20 5b 65 78 70 72 20 7b 0d 0a 20 20 20 20 20 20   [expr {..      
8a00: 20 20 5b 68 61 76 65 43 6f 6e 73 74 72 61 69 6e    [haveConstrain
8a10: 74 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51  t System.Data.SQ
8a20: 4c 69 74 65 5d 20 26 26 20 5b 68 61 76 65 43 6f  Lite] && [haveCo
8a30: 6e 73 74 72 61 69 6e 74 20 53 51 4c 69 74 65 5d  nstraint SQLite]
8a40: 0d 0a 20 20 20 20 20 20 7d 5d 0d 0a 20 20 20 20  ..      }]..    
8a50: 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 6d  }.....    proc m
8a60: 61 74 63 68 4d 61 63 68 69 6e 65 20 7b 20 70 6c  atchMachine { pl
8a70: 61 74 66 6f 72 6d 20 7d 20 7b 0d 0a 20 20 20 20  atform } {..    
8a80: 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
8a90: 45 3a 20 41 6e 20 65 6d 70 74 79 20 73 74 72 69  E: An empty stri
8aa0: 6e 67 20 66 6f 72 20 74 68 65 20 70 6c 61 74 66  ng for the platf
8ab0: 6f 72 6d 20 6d 65 61 6e 73 20 74 68 61 74 20 74  orm means that t
8ac0: 68 65 20 62 75 69 6c 64 20 69 73 20 6e 6f 74 0d  he build is not.
8ad0: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 5b  .      #       [
8ae0: 70 72 69 6d 61 72 69 6c 79 5d 20 61 20 6e 61 74  primarily] a nat
8af0: 69 76 65 20 62 75 69 6c 64 3b 20 74 68 65 72 65  ive build; there
8b00: 66 6f 72 65 2c 20 69 74 20 61 6c 77 61 79 73 20  fore, it always 
8b10: 6d 61 74 63 68 65 73 2e 0d 0a 20 20 20 20 20 20  matches...      
8b20: 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 73 74  #..      if {[st
8b30: 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 70 6c 61  ring length $pla
8b40: 74 66 6f 72 6d 5d 20 3d 3d 20 30 7d 20 74 68 65  tform] == 0} the
8b50: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 72 65 74  n {..        ret
8b60: 75 72 6e 20 74 72 75 65 0d 0a 20 20 20 20 20 20  urn true..      
8b70: 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  }....      #..  
8b80: 20 20 20 20 23 20 4e 4f 54 45 3a 20 44 6f 65 73      # NOTE: Does
8b90: 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 70   the specified p
8ba0: 6c 61 74 66 6f 72 6d 20 6d 61 74 63 68 20 75 70  latform match up
8bb0: 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20   to the current 
8bc0: 70 72 6f 63 65 73 73 3f 0d 0a 20 20 20 20 20 20  process?..      
8bd0: 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 24 70 6c  #..      if {$pl
8be0: 61 74 66 6f 72 6d 20 65 71 20 5b 6d 61 63 68 69  atform eq [machi
8bf0: 6e 65 54 6f 50 6c 61 74 66 6f 72 6d 20 24 3a 3a  neToPlatform $::
8c00: 74 63 6c 5f 70 6c 61 74 66 6f 72 6d 28 6d 61 63  tcl_platform(mac
8c10: 68 69 6e 65 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a  hine)]} then {..
8c20: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 74          return t
8c30: 72 75 65 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a  rue..      }....
8c40: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
8c50: 20 4e 4f 54 45 3a 20 54 68 65 20 73 70 65 63 69   NOTE: The speci
8c60: 66 69 65 64 20 70 6c 61 74 66 6f 72 6d 20 64 6f  fied platform do
8c70: 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 75 70 20  es not match up 
8c80: 77 69 74 68 20 74 68 65 20 70 6c 61 74 66 6f 72  with the platfor
8c90: 6d 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  m..      #      
8ca0: 20 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74   for the current
8cb0: 20 70 72 6f 63 65 73 73 2e 0d 0a 20 20 20 20 20   process...     
8cc0: 20 23 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e   #..      return
8cd0: 20 66 61 6c 73 65 0d 0a 20 20 20 20 7d 0d 0a 0c   false..    }...
8ce0: 0d 0a 20 20 20 20 70 72 6f 63 20 63 68 65 63 6b  ..    proc check
8cf0: 46 6f 72 53 51 4c 69 74 65 42 75 69 6c 64 73 20  ForSQLiteBuilds 
8d00: 7b 20 63 68 61 6e 6e 65 6c 20 7b 73 65 6c 65 63  { channel {selec
8d10: 74 20 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a 20 20  t false} } {..  
8d20: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
8d30: 4f 54 45 3a 20 43 68 65 63 6b 20 66 6f 72 20 65  OTE: Check for e
8d40: 76 65 72 79 20 70 6f 73 73 69 62 6c 65 20 76 61  very possible va
8d50: 6c 69 64 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20  lid combination 
8d60: 6f 66 20 76 61 6c 75 65 73 20 75 73 65 64 20 77  of values used w
8d70: 68 65 6e 0d 0a 20 20 20 20 20 20 23 20 20 20 20  hen..      #    
8d80: 20 20 20 6c 6f 63 61 74 69 6e 67 20 6f 75 74 20     locating out 
8d90: 74 68 65 20 62 75 69 6c 64 20 6f 75 74 70 75 74  the build output
8da0: 20 64 69 72 65 63 74 6f 72 79 2c 20 73 68 6f 77   directory, show
8db0: 69 6e 67 20 65 61 63 68 20 61 76 61 69 6c 61 62  ing each availab
8dc0: 6c 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  le..      #     
8dd0: 20 20 62 75 69 6c 64 20 76 61 72 69 61 74 69 6f    build variatio
8de0: 6e 20 61 6c 6f 6e 67 20 74 68 65 20 77 61 79 2e  n along the way.
8df0: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
8e00: 20 66 6f 72 65 61 63 68 20 6e 61 74 69 76 65 20   foreach native 
8e10: 5b 6c 69 73 74 20 66 61 6c 73 65 20 74 72 75 65  [list false true
8e20: 5d 20 7b 0d 0a 20 20 20 20 20 20 20 20 66 6f 72  ] {..        for
8e30: 65 61 63 68 20 79 65 61 72 20 5b 67 65 74 42 75  each year [getBu
8e40: 69 6c 64 59 65 61 72 73 5d 20 7b 0d 0a 20 20 20  ildYears] {..   
8e50: 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 63         foreach c
8e60: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 5b 67 65  onfiguration [ge
8e70: 74 42 75 69 6c 64 43 6f 6e 66 69 67 75 72 61 74  tBuildConfigurat
8e80: 69 6f 6e 73 5d 20 7b 0d 0a 20 20 20 20 20 20 20  ions] {..       
8e90: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
8ea0: 20 20 20 20 23 20 4e 4f 54 45 3a 20 46 69 67 75      # NOTE: Figu
8eb0: 72 65 20 6f 75 74 20 74 68 65 20 65 66 66 65 63  re out the effec
8ec0: 74 69 76 65 20 62 75 69 6c 64 20 70 6c 61 74 66  tive build platf
8ed0: 6f 72 6d 2e 20 20 54 68 69 73 20 69 73 0d 0a 20  orm.  This is.. 
8ee0: 20 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20             #    
8ef0: 20 20 20 62 61 73 65 64 20 6f 6e 20 77 68 65 74     based on whet
8f00: 68 65 72 20 6f 72 20 6e 6f 74 20 61 20 5b 70 72  her or not a [pr
8f10: 69 6d 61 72 69 6c 79 5d 20 6e 61 74 69 76 65 20  imarily] native 
8f20: 62 75 69 6c 64 0d 0a 20 20 20 20 20 20 20 20 20  build..         
8f30: 20 20 20 23 20 20 20 20 20 20 20 69 73 20 62 65     #       is be
8f40: 69 6e 67 20 75 73 65 64 2e 20 20 46 6f 72 20 5b  ing used.  For [
8f50: 70 72 69 6d 61 72 69 6c 79 5d 20 6e 6f 6e 2d 6e  primarily] non-n
8f60: 61 74 69 76 65 20 62 75 69 6c 64 73 2c 0d 0a 20  ative builds,.. 
8f70: 20 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20             #    
8f80: 20 20 20 74 68 69 73 20 77 69 6c 6c 20 62 65 20     this will be 
8f90: 61 6e 20 65 6d 70 74 79 20 73 74 72 69 6e 67 2e  an empty string.
8fa0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 0d  ..            #.
8fb0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74  .            set
8fc0: 20 70 6c 61 74 66 6f 72 6d 20 5b 67 65 74 42 75   platform [getBu
8fd0: 69 6c 64 50 6c 61 74 66 6f 72 6d 20 24 6e 61 74  ildPlatform $nat
8fe0: 69 76 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  ive]....        
8ff0: 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
9000: 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
9010: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
9020: 20 20 22 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e 67    "---- checking
9030: 20 66 6f 72 20 53 79 73 74 65 6d 2e 44 61 74 61   for System.Data
9040: 2e 53 51 4c 69 74 65 20 62 75 69 6c 64 20 5c 22  .SQLite build \"
9050: 22 20 5b 65 78 70 72 20 5c 0d 0a 20 20 20 20 20  " [expr \..     
9060: 20 20 20 20 20 20 20 20 20 20 20 7b 24 6e 61 74             {$nat
9070: 69 76 65 20 3f 20 22 6e 61 74 69 76 65 2f 22 20  ive ? "native/" 
9080: 3a 20 22 22 7d 5d 20 5b 65 78 70 72 20 7b 5b 73  : ""}] [expr {[s
9090: 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 5c 0d 0a  tring length \..
90a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
90b0: 24 70 6c 61 74 66 6f 72 6d 5d 20 3e 20 30 20 3f  $platform] > 0 ?
90c0: 20 5b 61 70 70 65 6e 64 41 72 67 73 20 24 70 6c   [appendArgs $pl
90d0: 61 74 66 6f 72 6d 20 2f 5d 20 3a 20 22 22 7d 5d  atform /] : ""}]
90e0: 20 24 79 65 61 72 20 5c 0d 0a 20 20 20 20 20 20   $year \..      
90f0: 20 20 20 20 20 20 20 20 20 20 2f 20 24 63 6f 6e            / $con
9100: 66 69 67 75 72 61 74 69 6f 6e 20 22 5c 22 2e 2e  figuration "\"..
9110: 2e 20 22 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  . "]....        
9120: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
9130: 20 20 20 23 20 4e 4f 54 45 3a 20 42 75 69 6c 64     # NOTE: Build
9140: 20 74 68 65 20 66 75 6c 6c 79 20 71 75 61 6c 69   the fully quali
9150: 66 69 65 64 20 64 69 72 65 63 74 6f 72 79 20 77  fied directory w
9160: 68 65 72 65 20 74 68 65 20 6e 65 63 65 73 73 61  here the necessa
9170: 72 79 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ry..            
9180: 23 20 20 20 20 20 20 20 63 6f 6d 70 6f 6e 65 6e  #       componen
9190: 74 73 20 66 6f 72 20 53 79 73 74 65 6d 2e 44 61  ts for System.Da
91a0: 74 61 2e 53 51 4c 69 74 65 20 73 68 6f 75 6c 64  ta.SQLite should
91b0: 20 62 65 20 66 6f 75 6e 64 2e 0d 0a 20 20 20 20   be found...    
91c0: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
91d0: 20 20 20 20 20 20 20 73 65 74 20 64 69 72 65 63         set direc
91e0: 74 6f 72 79 20 5b 6a 6f 69 6e 42 75 69 6c 64 44  tory [joinBuildD
91f0: 69 72 65 63 74 6f 72 79 20 24 6e 61 74 69 76 65  irectory $native
9200: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
9210: 20 20 20 20 5b 67 65 74 42 75 69 6c 64 42 61 73      [getBuildBas
9220: 65 44 69 72 65 63 74 6f 72 79 5d 20 24 79 65 61  eDirectory] $yea
9230: 72 20 24 70 6c 61 74 66 6f 72 6d 20 24 63 6f 6e  r $platform $con
9240: 66 69 67 75 72 61 74 69 6f 6e 5d 0d 0a 0d 0a 20  figuration].... 
9250: 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
9260: 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45            # NOTE
9270: 3a 20 44 6f 20 74 68 65 20 6e 65 63 65 73 73 61  : Do the necessa
9280: 72 79 20 66 69 6c 65 73 20 65 78 69 73 74 3f 20  ry files exist? 
9290: 20 43 75 72 72 65 6e 74 6c 79 2c 20 6e 6f 20 6f   Currently, no o
92a0: 74 68 65 72 20 73 74 65 70 73 0d 0a 20 20 20 20  ther steps..    
92b0: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
92c0: 61 72 65 20 74 61 6b 65 6e 20 74 6f 20 76 65 72  are taken to ver
92d0: 69 66 79 20 74 68 69 73 20 62 75 69 6c 64 20 69  ify this build i
92e0: 73 20 61 63 74 75 61 6c 6c 79 20 76 69 61 62 6c  s actually viabl
92f0: 65 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  e...            
9300: 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  #..            i
9310: 66 20 7b 5b 69 73 42 75 69 6c 64 41 76 61 69 6c  f {[isBuildAvail
9320: 61 62 6c 65 20 24 6e 61 74 69 76 65 20 24 64 69  able $native $di
9330: 72 65 63 74 6f 72 79 5d 7d 20 74 68 65 6e 20 7b  rectory]} then {
9340: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
9350: 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  #..             
9360: 20 23 20 4e 4f 54 45 3a 20 57 68 65 6e 20 69 6e   # NOTE: When in
9370: 20 22 73 65 6c 65 63 74 22 20 6d 6f 64 65 2c 20   "select" mode, 
9380: 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 73 65  automatically se
9390: 6c 65 63 74 20 74 68 65 20 66 69 72 73 74 0d 0a  lect the first..
93a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20                # 
93b0: 20 20 20 20 20 20 61 76 61 69 6c 61 62 6c 65 20        available 
93c0: 62 75 69 6c 64 20 6f 66 20 53 79 73 74 65 6d 2e  build of System.
93d0: 44 61 74 61 2e 53 51 4c 69 74 65 20 61 6e 64 20  Data.SQLite and 
93e0: 74 68 65 6e 20 72 65 74 75 72 6e 0d 0a 20 20 20  then return..   
93f0: 20 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20             #    
9400: 20 20 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 0d     immediately..
9410: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23  .              #
9420: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
9430: 69 66 20 7b 24 73 65 6c 65 63 74 20 26 26 20 5b  if {$select && [
9440: 6d 61 74 63 68 4d 61 63 68 69 6e 65 20 24 70 6c  matchMachine $pl
9450: 61 74 66 6f 72 6d 5d 7d 20 74 68 65 6e 20 7b 0d  atform]} then {.
9460: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
9470: 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   #..            
9480: 20 20 20 20 23 20 4e 4f 54 45 3a 20 4d 61 6e 75      # NOTE: Manu
9490: 61 6c 6c 79 20 6f 76 65 72 72 69 64 65 20 61 6c  ally override al
94a0: 6c 20 74 68 65 20 62 75 69 6c 64 20 64 69 72 65  l the build dire
94b0: 63 74 6f 72 79 20 73 65 6c 65 63 74 69 6f 6e 0d  ctory selection.
94c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
94d0: 20 23 20 20 20 20 20 20 20 72 65 6c 61 74 65 64   #       related
94e0: 20 74 65 73 74 20 73 65 74 74 69 6e 67 73 20 69   test settings i
94f0: 6e 20 6f 72 64 65 72 20 74 6f 20 66 6f 72 63 65  n order to force
9500: 20 74 68 69 73 20 62 75 69 6c 64 0d 0a 20 20 20   this build..   
9510: 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20 20               #  
9520: 20 20 20 20 20 6f 66 20 53 79 73 74 65 6d 2e 44       of System.D
9530: 61 74 61 2e 53 51 4c 69 74 65 20 74 6f 20 62 65  ata.SQLite to be
9540: 20 75 73 65 64 2e 0d 0a 20 20 20 20 20 20 20 20   used...        
9550: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
9560: 20 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63             objec
9570: 74 20 69 6e 76 6f 6b 65 20 49 6e 74 65 72 70 72  t invoke Interpr
9580: 65 74 65 72 2e 47 65 74 41 63 74 69 76 65 20 5b  eter.GetActive [
9590: 65 78 70 72 20 7b 24 6e 61 74 69 76 65 20 3f 20  expr {$native ? 
95a0: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
95b0: 20 20 20 20 20 20 20 22 41 64 64 52 75 6e 74 69         "AddRunti
95c0: 6d 65 4f 70 74 69 6f 6e 22 20 3a 20 22 52 65 6d  meOption" : "Rem
95d0: 6f 76 65 52 75 6e 74 69 6d 65 4f 70 74 69 6f 6e  oveRuntimeOption
95e0: 22 7d 5d 20 20 6e 61 74 69 76 65 0d 0a 0d 0a 20  "}]  native.... 
95f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
9600: 65 74 20 3a 3a 74 65 73 74 5f 79 65 61 72 20 24  et ::test_year $
9610: 79 65 61 72 0d 0a 20 20 20 20 20 20 20 20 20 20  year..          
9620: 20 20 20 20 20 20 73 65 74 20 3a 3a 74 65 73 74        set ::test
9630: 5f 70 6c 61 74 66 6f 72 6d 20 24 70 6c 61 74 66  _platform $platf
9640: 6f 72 6d 0d 0a 20 20 20 20 20 20 20 20 20 20 20  orm..           
9650: 20 20 20 20 20 73 65 74 20 3a 3a 74 65 73 74 5f       set ::test_
9660: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 24 63  configuration $c
9670: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 0d 0a 0d 0a  onfiguration....
9680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9690: 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b  tputs $channel [
96a0: 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
96b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
96c0: 20 20 22 79 65 73 2c 20 73 65 6c 65 63 74 65 64    "yes, selected
96d0: 20 28 22 20 5b 65 78 70 72 20 7b 24 6e 61 74 69   (" [expr {$nati
96e0: 76 65 20 3f 20 22 6e 61 74 69 76 65 2f 22 20 3a  ve ? "native/" :
96f0: 20 22 22 7d 5d 20 5c 0d 0a 20 20 20 20 20 20 20   ""}] \..       
9700: 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 65 78               [ex
9710: 70 72 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67  pr {[string leng
9720: 74 68 20 24 70 6c 61 74 66 6f 72 6d 5d 20 3e 20  th $platform] > 
9730: 30 20 3f 20 5b 61 70 70 65 6e 64 41 72 67 73 20  0 ? [appendArgs 
9740: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
9750: 20 20 20 20 20 20 20 24 70 6c 61 74 66 6f 72 6d         $platform
9760: 20 2f 5d 20 3a 20 22 22 7d 5d 20 24 79 65 61 72   /] : ""}] $year
9770: 20 2f 20 24 63 6f 6e 66 69 67 75 72 61 74 69 6f   / $configuratio
9780: 6e 20 22 29 5c 6e 22 5d 0d 0a 0d 0a 20 20 20 20  n ")\n"]....    
9790: 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
97a0: 72 6e 20 74 72 75 65 0d 0a 20 20 20 20 20 20 20  rn true..       
97b0: 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d         } else {.
97c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
97d0: 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
97e0: 79 65 73 5c 6e 0d 0a 20 20 20 20 20 20 20 20 20  yes\n..         
97f0: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
9800: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
9810: 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
9820: 73 20 24 63 68 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d  s $channel no\n.
9830: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  .            }..
9840: 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
9850: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d       }..      }.
9860: 0a 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ...      return 
9870: 66 61 6c 73 65 0d 0a 20 20 20 20 7d 0d 0a 0c 0d  false..    }....
9880: 0a 20 20 20 20 70 72 6f 63 20 63 68 65 63 6b 46  .    proc checkF
9890: 6f 72 53 51 4c 69 74 65 52 65 6c 65 61 73 65 73  orSQLiteReleases
98a0: 20 7b 20 63 68 61 6e 6e 65 6c 20 7b 73 65 6c 65   { channel {sele
98b0: 63 74 20 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a 20  ct false} } {.. 
98c0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
98d0: 4e 4f 54 45 3a 20 43 68 65 63 6b 20 66 6f 72 20  NOTE: Check for 
98e0: 70 61 73 74 20 72 65 6c 65 61 73 65 73 20 6f 66  past releases of
98f0: 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c   System.Data.SQL
9900: 69 74 65 20 69 6e 20 74 68 65 20 64 69 72 65 63  ite in the direc
9910: 74 6f 72 79 0d 0a 20 20 20 20 20 20 23 20 20 20  tory..      #   
9920: 20 20 20 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e      contained in
9930: 20 74 68 65 20 22 53 79 73 74 65 6d 2e 44 61 74   the "System.Dat
9940: 61 2e 53 51 4c 69 74 65 22 20 65 6e 76 69 72 6f  a.SQLite" enviro
9950: 6e 6d 65 6e 74 20 76 61 72 69 61 62 6c 65 2c 20  nment variable, 
9960: 69 66 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  if..      #     
9970: 20 20 70 72 65 73 65 6e 74 2e 0d 0a 20 20 20 20    present...    
9980: 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b    #..      if {[
9990: 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 65 6e  info exists ::en
99a0: 76 28 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51  v(System.Data.SQ
99b0: 4c 69 74 65 29 5d 20 26 26 20 5c 0d 0a 20 20 20  Lite)] && \..   
99c0: 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c         [string l
99d0: 65 6e 67 74 68 20 24 3a 3a 65 6e 76 28 53 79 73  ength $::env(Sys
99e0: 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 29  tem.Data.SQLite)
99f0: 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20  ] > 0} then {.. 
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 42 75 69 6c 64 20    # NOTE: Build 
9a20: 74 68 65 20 66 75 6c 6c 79 20 71 75 61 6c 69 66  the fully qualif
9a30: 69 65 64 20 64 69 72 65 63 74 6f 72 79 20 77 68  ied directory wh
9a40: 65 72 65 20 74 68 65 20 6e 65 63 65 73 73 61 72  ere the necessar
9a50: 79 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  y..        #    
9a60: 20 20 20 63 6f 6d 70 6f 6e 65 6e 74 73 20 66 6f     components fo
9a70: 72 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51  r System.Data.SQ
9a80: 4c 69 74 65 20 73 68 6f 75 6c 64 20 62 65 20 66  Lite should be f
9a90: 6f 75 6e 64 2e 0d 0a 20 20 20 20 20 20 20 20 23  ound...        #
9aa0: 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 64 69  ..        set di
9ab0: 72 65 63 74 6f 72 79 20 5b 66 69 6c 65 20 6e 61  rectory [file na
9ac0: 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c 65 20 6a  tivename [file j
9ad0: 6f 69 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  oin \..         
9ae0: 20 20 20 24 3a 3a 65 6e 76 28 53 79 73 74 65 6d     $::env(System
9af0: 2e 44 61 74 61 2e 53 51 4c 69 74 65 29 20 5b 67  .Data.SQLite) [g
9b00: 65 74 52 65 6c 65 61 73 65 56 65 72 73 69 6f 6e  etReleaseVersion
9b10: 5d 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 74  ]]]....        t
9b20: 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61  puts $channel [a
9b30: 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
9b40: 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63           "---- c
9b50: 68 65 63 6b 69 6e 67 20 66 6f 72 20 53 79 73 74  hecking for Syst
9b60: 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 20 72  em.Data.SQLite r
9b70: 65 6c 65 61 73 65 20 5c 22 22 20 5c 0d 0a 20 20  elease \"" \..  
9b80: 20 20 20 20 20 20 20 20 20 20 24 64 69 72 65 63            $direc
9b90: 74 6f 72 79 20 22 5c 22 2e 2e 2e 20 22 5d 0d 0a  tory "\"... "]..
9ba0: 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 69  ..        if {[i
9bb0: 73 52 65 6c 65 61 73 65 41 76 61 69 6c 61 62 6c  sReleaseAvailabl
9bc0: 65 20 24 64 69 72 65 63 74 6f 72 79 20 70 6c 61  e $directory pla
9bd0: 74 66 6f 72 6d 5d 7d 20 74 68 65 6e 20 7b 0d 0a  tform]} then {..
9be0: 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73            if {[s
9bf0: 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 70 6c  tring length $pl
9c00: 61 74 66 6f 72 6d 5d 20 3d 3d 20 30 7d 20 74 68  atform] == 0} th
9c10: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
9c20: 20 20 73 65 74 20 70 6c 61 74 66 6f 72 6d 20 75    set platform u
9c30: 6e 6b 6e 6f 77 6e 0d 0a 20 20 20 20 20 20 20 20  nknown..        
9c40: 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20    }....         
9c50: 20 69 66 20 7b 24 73 65 6c 65 63 74 20 26 26 20   if {$select && 
9c60: 5b 6d 61 74 63 68 4d 61 63 68 69 6e 65 20 24 70  [matchMachine $p
9c70: 6c 61 74 66 6f 72 6d 5d 7d 20 74 68 65 6e 20 7b  latform]} then {
9c80: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 65  ..            se
9c90: 74 20 3a 3a 62 75 69 6c 64 5f 64 69 72 65 63 74  t ::build_direct
9ca0: 6f 72 79 20 24 64 69 72 65 63 74 6f 72 79 0d 0a  ory $directory..
9cb0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70  ..            tp
9cc0: 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70  uts $channel [ap
9cd0: 70 65 6e 64 41 72 67 73 20 22 79 65 73 2c 20 73  pendArgs "yes, s
9ce0: 65 6c 65 63 74 65 64 20 28 22 20 24 70 6c 61 74  elected (" $plat
9cf0: 66 6f 72 6d 20 22 29 5c 6e 22 5d 0d 0a 0d 0a 20  form ")\n"].... 
9d00: 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
9d10: 6e 20 74 72 75 65 0d 0a 20 20 20 20 20 20 20 20  n true..        
9d20: 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
9d30: 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
9d40: 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
9d50: 67 73 20 22 79 65 73 20 28 22 20 24 70 6c 61 74  gs "yes (" $plat
9d60: 66 6f 72 6d 20 22 29 5c 6e 22 5d 0d 0a 20 20 20  form ")\n"]..   
9d70: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
9d80: 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
9d90: 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
9da0: 6e 6e 65 6c 20 6e 6f 5c 6e 0d 0a 0d 0a 20 20 20  nnel no\n....   
9db0: 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 70         foreach p
9dc0: 61 74 68 20 5b 6c 73 6f 72 74 20 2d 64 65 63 72  ath [lsort -decr
9dd0: 65 61 73 69 6e 67 20 5b 66 69 6c 65 20 6c 69 73  easing [file lis
9de0: 74 20 24 64 69 72 65 63 74 6f 72 79 20 2a 5d 5d  t $directory *]]
9df0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
9e00: 69 66 20 7b 5b 66 69 6c 65 20 65 78 69 73 74 73  if {[file exists
9e10: 20 24 70 61 74 68 5d 20 26 26 20 5b 66 69 6c 65   $path] && [file
9e20: 20 69 73 64 69 72 65 63 74 6f 72 79 20 24 70 61   isdirectory $pa
9e30: 74 68 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  th]} then {..   
9e40: 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
9e50: 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e   $channel [appen
9e60: 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
9e70: 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
9e80: 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 53 79   checking for Sy
9e90: 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
9ea0: 20 72 65 6c 65 61 73 65 20 5c 22 22 20 5c 0d 0a   release \"" \..
9eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9ec0: 20 20 24 70 61 74 68 20 22 5c 22 2e 2e 2e 20 22    $path "\"... "
9ed0: 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ]....           
9ee0: 20 20 20 69 66 20 7b 5b 69 73 52 65 6c 65 61 73     if {[isReleas
9ef0: 65 41 76 61 69 6c 61 62 6c 65 20 24 70 61 74 68  eAvailable $path
9f00: 20 70 6c 61 74 66 6f 72 6d 5d 7d 20 74 68 65 6e   platform]} then
9f10: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
9f20: 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20      if {[string 
9f30: 6c 65 6e 67 74 68 20 24 70 6c 61 74 66 6f 72 6d  length $platform
9f40: 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  ] == 0} then {..
9f50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9f60: 20 20 73 65 74 20 70 6c 61 74 66 6f 72 6d 20 75    set platform u
9f70: 6e 6b 6e 6f 77 6e 0d 0a 20 20 20 20 20 20 20 20  nknown..        
9f80: 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
9f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20               if 
9fa0: 7b 24 73 65 6c 65 63 74 20 26 26 20 5b 6d 61 74  {$select && [mat
9fb0: 63 68 4d 61 63 68 69 6e 65 20 24 70 6c 61 74 66  chMachine $platf
9fc0: 6f 72 6d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  orm]} then {..  
9fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9fe0: 73 65 74 20 3a 3a 62 75 69 6c 64 5f 64 69 72 65  set ::build_dire
9ff0: 63 74 6f 72 79 20 24 70 61 74 68 0d 0a 0d 0a 20  ctory $path.... 
a000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a010: 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
a020: 5b 61 70 70 65 6e 64 41 72 67 73 20 22 79 65 73  [appendArgs "yes
a030: 2c 20 73 65 6c 65 63 74 65 64 20 28 22 20 24 70  , selected (" $p
a040: 6c 61 74 66 6f 72 6d 20 22 29 5c 6e 22 5d 0d 0a  latform ")\n"]..
a050: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
a060: 20 20 20 20 72 65 74 75 72 6e 20 74 72 75 65 0d      return true.
a070: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
a080: 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
a090: 20 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75               tpu
a0a0: 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70  ts $channel [app
a0b0: 65 6e 64 41 72 67 73 20 22 79 65 73 20 28 22 20  endArgs "yes (" 
a0c0: 24 70 6c 61 74 66 6f 72 6d 20 22 29 5c 6e 22 5d  $platform ")\n"]
a0d0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
a0e0: 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20    }..           
a0f0: 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
a100: 20 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75               tpu
a110: 74 73 20 24 63 68 61 6e 6e 65 6c 20 6e 6f 5c 6e  ts $channel no\n
a120: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
a130: 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  }..            }
a140: 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20  ..          }.. 
a150: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
a160: 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
a170: 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
a180: 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
a190: 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
a1a0: 2d 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 20 76 61  - environment va
a1b0: 72 69 61 62 6c 65 20 5c 22 53 79 73 74 65 6d 2e  riable \"System.
a1c0: 44 61 74 61 2e 53 51 4c 69 74 65 5c 22 20 69 73  Data.SQLite\" is
a1d0: 20 6e 6f 74 20 22 20 5c 0d 0a 20 20 20 20 20 20   not " \..      
a1e0: 20 20 20 20 20 20 22 73 65 74 2c 20 73 6b 69 70        "set, skip
a1f0: 70 69 6e 67 20 63 68 65 63 6b 20 66 6f 72 20 72  ping check for r
a200: 65 6c 65 61 73 65 73 2e 2e 2e 5c 6e 22 5d 0d 0a  eleases...\n"]..
a210: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
a220: 20 72 65 74 75 72 6e 20 66 61 6c 73 65 0d 0a 20   return false.. 
a230: 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
a240: 63 20 63 68 65 63 6b 46 6f 72 53 51 4c 69 74 65  c checkForSQLite
a250: 4c 69 62 72 61 72 79 20 7b 20 63 68 61 6e 6e 65  Library { channe
a260: 6c 20 7d 20 7b 0d 0a 20 20 20 20 20 20 74 70 75  l } {..      tpu
a270: 74 73 20 24 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d  ts $channel "---
a280: 2d 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 53  - checking for S
a290: 51 4c 69 74 65 20 63 6f 72 65 20 6c 69 62 72 61  QLite core libra
a2a0: 72 79 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 20  ry... "....     
a2b0: 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20   if {[catch {.. 
a2c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 62 6a               obj
a2d0: 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67  ect invoke -flag
a2e0: 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 53 79 73  s +NonPublic Sys
a2f0: 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e  tem.Data.SQLite.
a300: 53 51 4c 69 74 65 33 20 5c 0d 0a 20 20 20 20 20  SQLite3 \..     
a310: 20 20 20 20 20 20 20 20 20 53 51 4c 69 74 65 56           SQLiteV
a320: 65 72 73 69 6f 6e 7d 20 76 65 72 73 69 6f 6e 5d  ersion} version]
a330: 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20   == 0} then {.. 
a340: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
a350: 20 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20    # NOTE: Check 
a360: 69 66 20 74 68 65 20 72 65 74 75 72 6e 65 64 20  if the returned 
a370: 76 65 72 73 69 6f 6e 20 77 61 73 20 6e 75 6c 6c  version was null
a380: 2e 20 20 49 66 20 73 6f 2c 20 6d 61 6b 65 20 69  .  If so, make i
a390: 74 20 65 61 73 79 0d 0a 20 20 20 20 20 20 20 20  t easy..        
a3a0: 23 20 20 20 20 20 20 20 74 6f 20 73 70 6f 74 2e  #       to spot.
a3b0: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
a3c0: 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67       if {[string
a3d0: 20 6c 65 6e 67 74 68 20 24 76 65 72 73 69 6f 6e   length $version
a3e0: 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  ] == 0} then {..
a3f0: 20 20 20 20 20 20 20 20 20 20 73 65 74 20 76 65            set ve
a400: 72 73 69 6f 6e 20 6e 75 6c 6c 0d 0a 20 20 20 20  rsion null..    
a410: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
a420: 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
a430: 54 45 3a 20 41 74 74 65 6d 70 74 20 74 6f 20 71  TE: Attempt to q
a440: 75 65 72 79 20 74 68 65 20 46 6f 73 73 69 6c 20  uery the Fossil 
a450: 73 6f 75 72 63 65 20 69 64 65 6e 74 69 66 69 65  source identifie
a460: 72 20 66 6f 72 20 74 68 65 20 53 51 4c 69 74 65  r for the SQLite
a470: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
a480: 20 20 63 6f 72 65 20 6c 69 62 72 61 72 79 2e 0d    core library..
a490: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
a4a0: 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b      if {[catch {
a4b0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
a4c0: 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20    object invoke 
a4d0: 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69  -flags +NonPubli
a4e0: 63 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51  c System.Data.SQ
a4f0: 4c 69 74 65 2e 53 51 4c 69 74 65 33 20 5c 0d 0a  Lite.SQLite3 \..
a500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a510: 53 51 4c 69 74 65 53 6f 75 72 63 65 49 64 7d 20  SQLiteSourceId} 
a520: 73 6f 75 72 63 65 49 64 5d 7d 20 74 68 65 6e 20  sourceId]} then 
a530: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a  {..          #..
a540: 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45            # NOTE
a550: 3a 20 57 65 20 66 61 69 6c 65 64 20 74 6f 20 71  : We failed to q
a560: 75 65 72 79 20 74 68 65 20 46 6f 73 73 69 6c 20  uery the Fossil 
a570: 73 6f 75 72 63 65 20 69 64 65 6e 74 69 66 69 65  source identifie
a580: 72 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d  r...          #.
a590: 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20 73  .          set s
a5a0: 6f 75 72 63 65 49 64 20 75 6e 6b 6e 6f 77 6e 0d  ourceId unknown.
a5b0: 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  .        }....  
a5c0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
a5d0: 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 69   # NOTE: Check i
a5e0: 66 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 46  f the returned F
a5f0: 6f 73 73 69 6c 20 73 6f 75 72 63 65 20 69 64 65  ossil source ide
a600: 6e 74 69 66 69 65 72 20 77 61 73 20 6e 75 6c 6c  ntifier was null
a610: 2e 20 20 49 66 0d 0a 20 20 20 20 20 20 20 20 23  .  If..        #
a620: 20 20 20 20 20 20 20 73 6f 2c 20 6d 61 6b 65 20         so, make 
a630: 69 74 20 65 61 73 79 20 74 6f 20 73 70 6f 74 2e  it easy to spot.
a640: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
a650: 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67       if {[string
a660: 20 6c 65 6e 67 74 68 20 24 73 6f 75 72 63 65 49   length $sourceI
a670: 64 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d  d] == 0} then {.
a680: 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20 73  .          set s
a690: 6f 75 72 63 65 49 64 20 6e 75 6c 6c 0d 0a 20 20  ourceId null..  
a6a0: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
a6b0: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
a6c0: 4e 4f 54 45 3a 20 59 65 73 2c 20 74 68 65 20 53  NOTE: Yes, the S
a6d0: 51 4c 69 74 65 20 63 6f 72 65 20 6c 69 62 72 61  QLite core libra
a6e0: 72 79 20 61 70 70 65 61 72 73 20 74 6f 20 62 65  ry appears to be
a6f0: 20 61 76 61 69 6c 61 62 6c 65 2e 0d 0a 20 20 20   available...   
a700: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
a710: 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 53 51  addConstraint SQ
a720: 4c 69 74 65 0d 0a 0d 0a 20 20 20 20 20 20 20 20  Lite....        
a730: 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b  tputs $channel [
a740: 61 70 70 65 6e 64 41 72 67 73 20 22 79 65 73 20  appendArgs "yes 
a750: 28 22 20 24 76 65 72 73 69 6f 6e 20 22 20 22 20  (" $version " " 
a760: 24 73 6f 75 72 63 65 49 64 20 22 29 5c 6e 22 5d  $sourceId ")\n"]
a770: 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b  ..      } else {
a780: 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20  ..        tputs 
a790: 24 63 68 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d 0a 20  $channel no\n.. 
a7a0: 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c       }..    }...
a7b0: 0d 0a 20 20 20 20 70 72 6f 63 20 63 68 65 63 6b  ..    proc check
a7c0: 46 6f 72 53 51 4c 69 74 65 49 6e 74 65 72 6f 70  ForSQLiteInterop
a7d0: 20 7b 20 63 68 61 6e 6e 65 6c 20 7d 20 7b 0d 0a   { channel } {..
a7e0: 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
a7f0: 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 63 68 65 63 6b  nnel "---- check
a800: 69 6e 67 20 66 6f 72 20 53 51 4c 69 74 65 20 69  ing for SQLite i
a810: 6e 74 65 72 6f 70 20 61 73 73 65 6d 62 6c 79 2e  nterop assembly.
a820: 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 20 20 69 66  .. "....      if
a830: 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20   {[catch {..    
a840: 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74            object
a850: 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b   invoke -flags +
a860: 4e 6f 6e 50 75 62 6c 69 63 20 53 79 73 74 65 6d  NonPublic System
a870: 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 53 51 4c  .Data.SQLite.SQL
a880: 69 74 65 33 20 5c 0d 0a 20 20 20 20 20 20 20 20  ite3 \..        
a890: 20 20 20 20 20 20 49 6e 74 65 72 6f 70 56 65 72        InteropVer
a8a0: 73 69 6f 6e 7d 20 76 65 72 73 69 6f 6e 5d 20 3d  sion} version] =
a8b0: 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  = 0} then {..   
a8c0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
a8d0: 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 69 66  # NOTE: Check if
a8e0: 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 76 65   the returned ve
a8f0: 72 73 69 6f 6e 20 77 61 73 20 6e 75 6c 6c 2e 20  rsion was null. 
a900: 20 49 66 20 73 6f 2c 20 6d 61 6b 65 20 69 74 20   If so, make it 
a910: 65 61 73 79 0d 0a 20 20 20 20 20 20 20 20 23 20  easy..        # 
a920: 20 20 20 20 20 20 74 6f 20 73 70 6f 74 2e 0d 0a        to spot...
a930: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
a940: 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c     if {[string l
a950: 65 6e 67 74 68 20 24 76 65 72 73 69 6f 6e 5d 20  ength $version] 
a960: 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  == 0} then {..  
a970: 20 20 20 20 20 20 20 20 73 65 74 20 76 65 72 73          set vers
a980: 69 6f 6e 20 6e 75 6c 6c 0d 0a 20 20 20 20 20 20  ion null..      
a990: 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23    }....        #
a9a0: 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
a9b0: 3a 20 41 74 74 65 6d 70 74 20 74 6f 20 71 75 65  : Attempt to que
a9c0: 72 79 20 74 68 65 20 46 6f 73 73 69 6c 20 73 6f  ry the Fossil so
a9d0: 75 72 63 65 20 69 64 65 6e 74 69 66 69 65 72 20  urce identifier 
a9e0: 66 6f 72 20 74 68 65 20 53 51 4c 69 74 65 0d 0a  for the SQLite..
a9f0: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
aa00: 63 6f 72 65 20 6c 69 62 72 61 72 79 2e 0d 0a 20  core library... 
aa10: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
aa20: 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a    if {[catch {..
aa30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aa40: 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66  object invoke -f
aa50: 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20  lags +NonPublic 
aa60: 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
aa70: 74 65 2e 53 51 4c 69 74 65 33 20 5c 0d 0a 20 20  te.SQLite3 \..  
aa80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 49 6e                In
aa90: 74 65 72 6f 70 53 6f 75 72 63 65 49 64 7d 20 73  teropSourceId} s
aaa0: 6f 75 72 63 65 49 64 5d 7d 20 74 68 65 6e 20 7b  ourceId]} then {
aab0: 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20  ..          #.. 
aac0: 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a           # NOTE:
aad0: 20 57 65 20 66 61 69 6c 65 64 20 74 6f 20 71 75   We failed to qu
aae0: 65 72 79 20 74 68 65 20 46 6f 73 73 69 6c 20 73  ery the Fossil s
aaf0: 6f 75 72 63 65 20 69 64 65 6e 74 69 66 69 65 72  ource identifier
ab00: 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a  ...          #..
ab10: 20 20 20 20 20 20 20 20 20 20 73 65 74 20 73 6f            set so
ab20: 75 72 63 65 49 64 20 75 6e 6b 6e 6f 77 6e 0d 0a  urceId unknown..
ab30: 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
ab40: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
ab50: 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 69 66  # NOTE: Check if
ab60: 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 46 6f   the returned Fo
ab70: 73 73 69 6c 20 73 6f 75 72 63 65 20 69 64 65 6e  ssil source iden
ab80: 74 69 66 69 65 72 20 77 61 73 20 6e 75 6c 6c 2e  tifier was null.
ab90: 20 20 49 66 0d 0a 20 20 20 20 20 20 20 20 23 20    If..        # 
aba0: 20 20 20 20 20 20 73 6f 2c 20 6d 61 6b 65 20 69        so, make i
abb0: 74 20 65 61 73 79 20 74 6f 20 73 70 6f 74 2e 0d  t easy to spot..
abc0: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
abd0: 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20      if {[string 
abe0: 6c 65 6e 67 74 68 20 24 73 6f 75 72 63 65 49 64  length $sourceId
abf0: 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  ] == 0} then {..
ac00: 20 20 20 20 20 20 20 20 20 20 73 65 74 20 73 6f            set so
ac10: 75 72 63 65 49 64 20 6e 75 6c 6c 0d 0a 20 20 20  urceId null..   
ac20: 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
ac30: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
ac40: 4f 54 45 3a 20 59 65 73 2c 20 74 68 65 20 53 51  OTE: Yes, the SQ
ac50: 4c 69 74 65 20 69 6e 74 65 72 6f 70 20 61 73 73  Lite interop ass
ac60: 65 6d 62 6c 79 20 61 70 70 65 61 72 73 20 74 6f  embly appears to
ac70: 20 62 65 20 61 76 61 69 6c 61 62 6c 65 2e 0d 0a   be available...
ac80: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
ac90: 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74     addConstraint
aca0: 20 53 51 4c 69 74 65 49 6e 74 65 72 6f 70 0d 0a   SQLiteInterop..
acb0: 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20  ..        tputs 
acc0: 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  $channel [append
acd0: 41 72 67 73 20 22 79 65 73 20 28 22 20 24 76 65  Args "yes (" $ve
ace0: 72 73 69 6f 6e 20 22 20 22 20 24 73 6f 75 72 63  rsion " " $sourc
acf0: 65 49 64 20 22 29 5c 6e 22 5d 0d 0a 20 20 20 20  eId ")\n"]..    
ad00: 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
ad10: 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
ad20: 65 6c 20 6e 6f 5c 6e 0d 0a 20 20 20 20 20 20 7d  el no\n..      }
ad30: 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
ad40: 70 72 6f 63 20 63 68 65 63 6b 46 6f 72 53 51 4c  proc checkForSQL
ad50: 69 74 65 44 65 66 69 6e 65 43 6f 6e 73 74 61 6e  iteDefineConstan
ad60: 74 20 7b 20 63 68 61 6e 6e 65 6c 20 6e 61 6d 65  t { channel name
ad70: 20 7d 20 7b 0d 0a 20 20 20 20 20 20 74 70 75 74   } {..      tput
ad80: 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  s $channel [appe
ad90: 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
ada0: 20 20 20 20 22 2d 2d 2d 2d 20 63 68 65 63 6b 69      "---- checki
adb0: 6e 67 20 66 6f 72 20 53 79 73 74 65 6d 2e 44 61  ng for System.Da
adc0: 74 61 2e 53 51 4c 69 74 65 20 64 65 66 69 6e 65  ta.SQLite define
add0: 20 63 6f 6e 73 74 61 6e 74 20 5c 22 22 20 24 6e   constant \"" $n
ade0: 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ame \..         
adf0: 20 22 5c 22 2e 2e 2e 20 22 5d 0d 0a 0d 0a 20 20   "\"... "]....  
ae00: 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b      if {[catch {
ae10: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
ae20: 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66  object invoke -f
ae30: 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20  lags +NonPublic 
ae40: 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
ae50: 74 65 2e 53 51 4c 69 74 65 33 20 5c 0d 0a 20 20  te.SQLite3 \..  
ae60: 20 20 20 20 20 20 20 20 20 20 20 20 44 65 66 69              Defi
ae70: 6e 65 43 6f 6e 73 74 61 6e 74 73 7d 20 64 65 66  neConstants} def
ae80: 69 6e 65 43 6f 6e 73 74 61 6e 74 73 5d 20 3d 3d  ineConstants] ==
ae90: 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
aea0: 20 20 20 20 69 66 20 7b 5b 6c 73 65 61 72 63 68      if {[lsearch
aeb0: 20 2d 65 78 61 63 74 20 2d 6e 6f 63 61 73 65 20   -exact -nocase 
aec0: 24 64 65 66 69 6e 65 43 6f 6e 73 74 61 6e 74 73  $defineConstants
aed0: 20 24 6e 61 6d 65 5d 20 21 3d 20 2d 31 7d 20 74   $name] != -1} t
aee0: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
aef0: 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20   #..          # 
af00: 4e 4f 54 45 3a 20 59 65 73 2c 20 74 68 69 73 20  NOTE: Yes, this 
af10: 64 65 66 69 6e 65 20 63 6f 6e 73 74 61 6e 74 20  define constant 
af20: 77 61 73 20 65 6e 61 62 6c 65 64 20 77 68 65 6e  was enabled when
af30: 20 74 68 65 20 6d 61 6e 61 67 65 64 0d 0a 20 20   the managed..  
af40: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
af50: 61 73 73 65 6d 62 6c 79 20 77 61 73 20 63 6f 6d  assembly was com
af60: 70 69 6c 65 64 2e 0d 0a 20 20 20 20 20 20 20 20  piled...        
af70: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 61    #..          a
af80: 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70  ddConstraint [ap
af90: 70 65 6e 64 41 72 67 73 20 64 65 66 69 6e 65 43  pendArgs defineC
afa0: 6f 6e 73 74 61 6e 74 2e 53 79 73 74 65 6d 2e 44  onstant.System.D
afb0: 61 74 61 2e 53 51 4c 69 74 65 2e 20 24 6e 61 6d  ata.SQLite. $nam
afc0: 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  e]....          
afd0: 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 79  tputs $channel y
afe0: 65 73 5c 6e 0d 0a 20 20 20 20 20 20 20 20 7d 20  es\n..        } 
aff0: 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
b000: 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
b010: 20 6e 6f 5c 6e 0d 0a 20 20 20 20 20 20 20 20 7d   no\n..        }
b020: 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b  ..      } else {
b030: 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20  ..        tputs 
b040: 24 63 68 61 6e 6e 65 6c 20 65 72 72 6f 72 5c 6e  $channel error\n
b050: 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d  ..      }..    }
b060: 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65  .....    proc ge
b070: 74 44 61 74 65 54 69 6d 65 46 6f 72 6d 61 74 20  tDateTimeFormat 
b080: 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20  {} {..      #.. 
b090: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 69       # NOTE: Thi
b0a0: 73 20 70 72 6f 63 65 64 75 72 65 20 73 69 6d 70  s procedure simp
b0b0: 6c 79 20 72 65 74 75 72 6e 73 20 74 68 65 20 22  ly returns the "
b0c0: 64 65 66 61 75 6c 74 22 20 44 61 74 65 54 69 6d  default" DateTim
b0d0: 65 20 66 6f 72 6d 61 74 20 75 73 65 64 0d 0a 20  e format used.. 
b0e0: 20 20 20 20 20 23 20 20 20 20 20 20 20 62 79 20       #       by 
b0f0: 74 68 65 20 74 65 73 74 20 73 75 69 74 65 2e 0d  the test suite..
b100: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
b110: 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73  if {[info exists
b120: 20 3a 3a 64 61 74 65 74 69 6d 65 5f 66 6f 72 6d   ::datetime_form
b130: 61 74 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20  at] && \..      
b140: 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67      [string leng
b150: 74 68 20 24 3a 3a 64 61 74 65 74 69 6d 65 5f 66  th $::datetime_f
b160: 6f 72 6d 61 74 5d 20 3e 20 30 7d 20 74 68 65 6e  ormat] > 0} then
b170: 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20   {..        #.. 
b180: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 52         # NOTE: R
b190: 65 74 75 72 6e 20 74 68 65 20 6d 61 6e 75 61 6c  eturn the manual
b1a0: 6c 79 20 6f 76 65 72 72 69 64 64 65 6e 20 76 61  ly overridden va
b1b0: 6c 75 65 20 66 6f 72 20 74 68 65 20 44 61 74 65  lue for the Date
b1c0: 54 69 6d 65 20 66 6f 72 6d 61 74 2e 0d 0a 20 20  Time format...  
b1d0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
b1e0: 20 72 65 74 75 72 6e 20 24 3a 3a 64 61 74 65 74   return $::datet
b1f0: 69 6d 65 5f 66 6f 72 6d 61 74 0d 0a 20 20 20 20  ime_format..    
b200: 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
b210: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
b220: 20 4e 4f 54 45 3a 20 52 65 74 75 72 6e 20 61 6e   NOTE: Return an
b230: 20 49 53 4f 38 36 30 31 20 44 61 74 65 54 69 6d   ISO8601 DateTim
b240: 65 20 66 6f 72 6d 61 74 20 63 6f 6d 70 61 74 69  e format compati
b250: 62 6c 65 20 77 69 74 68 20 53 51 4c 69 74 65 2c  ble with SQLite,
b260: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
b270: 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51    System.Data.SQ
b280: 4c 69 74 65 2c 20 61 6e 64 20 73 75 69 74 61 62  Lite, and suitab
b290: 6c 65 20 66 6f 72 20 72 6f 75 6e 64 2d 74 72 69  le for round-tri
b2a0: 70 70 69 6e 67 20 77 69 74 68 20 74 68 65 0d 0a  pping with the..
b2b0: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
b2c0: 44 61 74 65 54 69 6d 65 20 63 6c 61 73 73 20 6f  DateTime class o
b2d0: 66 20 74 68 65 20 66 72 61 6d 65 77 6f 72 6b 2e  f the framework.
b2e0: 20 20 49 66 20 74 68 69 73 20 76 61 6c 75 65 20    If this value 
b2f0: 69 73 20 63 68 61 6e 67 65 64 2c 0d 0a 20 20 20  is changed,..   
b300: 20 20 20 20 20 23 20 20 20 20 20 20 20 76 61 72       #       var
b310: 69 6f 75 73 20 74 65 73 74 73 20 6d 61 79 20 66  ious tests may f
b320: 61 69 6c 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  ail...        #.
b330: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
b340: 22 79 79 79 79 2d 4d 4d 2d 64 64 20 48 48 3a 6d  "yyyy-MM-dd HH:m
b350: 6d 3a 73 73 2e 46 46 46 46 46 46 46 4b 22 0d 0a  m:ss.FFFFFFFK"..
b360: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a        }..    }..
b370: 0c 0d 0a 20 20 20 20 70 72 6f 63 20 65 6e 75 6d  ...    proc enum
b380: 65 72 61 62 6c 65 54 6f 4c 69 73 74 20 7b 20 65  erableToList { e
b390: 6e 75 6d 65 72 61 62 6c 65 20 7d 20 7b 0d 0a 20  numerable } {.. 
b3a0: 20 20 20 20 20 73 65 74 20 72 65 73 75 6c 74 20       set result 
b3b0: 5b 6c 69 73 74 5d 0d 0a 0d 0a 20 20 20 20 20 20  [list]....      
b3c0: 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67  if {[string leng
b3d0: 74 68 20 24 65 6e 75 6d 65 72 61 62 6c 65 5d 20  th $enumerable] 
b3e0: 3d 3d 20 30 20 7c 7c 20 24 65 6e 75 6d 65 72 61  == 0 || $enumera
b3f0: 62 6c 65 20 65 71 20 22 6e 75 6c 6c 22 7d 20 74  ble eq "null"} t
b400: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 72  hen {..        r
b410: 65 74 75 72 6e 20 24 72 65 73 75 6c 74 0d 0a 20  eturn $result.. 
b420: 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
b430: 6f 62 6a 65 63 74 20 66 6f 72 65 61 63 68 20 2d  object foreach -
b440: 61 6c 69 61 73 20 69 74 65 6d 20 24 65 6e 75 6d  alias item $enum
b450: 65 72 61 62 6c 65 20 7b 0d 0a 20 20 20 20 20 20  erable {..      
b460: 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65    if {[string le
b470: 6e 67 74 68 20 24 69 74 65 6d 5d 20 3e 20 30 7d  ngth $item] > 0}
b480: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
b490: 20 20 20 6c 61 70 70 65 6e 64 20 72 65 73 75 6c     lappend resul
b4a0: 74 20 5b 24 69 74 65 6d 20 54 6f 53 74 72 69 6e  t [$item ToStrin
b4b0: 67 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20  g]..        }.. 
b4c0: 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
b4d0: 72 65 74 75 72 6e 20 24 72 65 73 75 6c 74 0d 0a  return $result..
b4e0: 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
b4f0: 6f 63 20 63 61 74 63 68 41 6e 64 52 65 74 75 72  oc catchAndRetur
b500: 6e 20 7b 20 73 63 72 69 70 74 20 7b 73 74 61 63  n { script {stac
b510: 6b 54 72 61 63 65 20 66 61 6c 73 65 7d 20 7b 73  kTrace false} {s
b520: 74 72 69 63 74 20 74 72 75 65 7d 20 7d 20 7b 0d  trict true} } {.
b530: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
b540: 23 20 4e 4f 54 45 3a 20 45 76 61 6c 75 61 74 65  # NOTE: Evaluate
b550: 20 74 68 65 20 73 63 72 69 70 74 20 70 72 6f 76   the script prov
b560: 69 64 65 64 20 62 79 20 6f 75 72 20 63 61 6c 6c  ided by our call
b570: 65 72 20 69 6e 20 74 68 65 69 72 20 63 6f 6e 74  er in their cont
b580: 65 78 74 2c 0d 0a 20 20 20 20 20 20 23 20 20 20  ext,..      #   
b590: 20 20 20 20 63 61 70 74 75 72 69 6e 67 20 62 6f      capturing bo
b5a0: 74 68 20 74 68 65 20 72 65 73 75 6c 74 20 61 6e  th the result an
b5b0: 64 20 74 68 65 20 72 65 74 75 72 6e 20 63 6f 64  d the return cod
b5c0: 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  e...      #..   
b5d0: 20 20 20 73 65 74 20 63 6f 64 65 20 5b 63 61 74     set code [cat
b5e0: 63 68 20 7b 75 70 6c 65 76 65 6c 20 31 20 24 73  ch {uplevel 1 $s
b5f0: 63 72 69 70 74 7d 20 72 65 73 75 6c 74 5d 0d 0a  cript} result]..
b600: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
b610: 20 23 20 4e 4f 54 45 3a 20 44 69 64 20 74 68 65   # NOTE: Did the
b620: 20 73 63 72 69 70 74 20 70 72 6f 76 69 64 65 64   script provided
b630: 20 62 79 20 6f 75 72 20 63 61 6c 6c 65 72 20 4e   by our caller N
b640: 4f 54 20 72 61 69 73 65 20 61 6e 20 65 72 72 6f  OT raise an erro
b650: 72 3f 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  r?..      #..   
b660: 20 20 20 69 66 20 7b 24 73 74 72 69 63 74 20 26     if {$strict &
b670: 26 20 24 63 6f 64 65 20 3d 3d 20 30 20 7c 7c 20  & $code == 0 || 
b680: 21 24 73 74 72 69 63 74 20 26 26 20 24 63 6f 64  !$strict && $cod
b690: 65 20 21 3d 20 31 7d 20 74 68 65 6e 20 7b 0d 0a  e != 1} then {..
b6a0: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
b6b0: 20 20 20 23 20 4e 4f 54 45 3a 20 53 75 63 63 65     # NOTE: Succe
b6c0: 73 73 2e 20 20 52 65 74 75 72 6e 20 61 20 6c 69  ss.  Return a li
b6d0: 73 74 20 77 69 74 68 20 74 68 65 20 72 65 74 75  st with the retu
b6e0: 72 6e 20 63 6f 64 65 20 61 6e 64 20 74 68 65 20  rn code and the 
b6f0: 72 65 73 75 6c 74 2e 0d 0a 20 20 20 20 20 20 20  result...       
b700: 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75   #..        retu
b710: 72 6e 20 5b 6c 69 73 74 20 24 63 6f 64 65 20 24  rn [list $code $
b720: 72 65 73 75 6c 74 5d 0d 0a 20 20 20 20 20 20 7d  result]..      }
b730: 20 65 6c 73 65 69 66 20 7b 24 73 74 61 63 6b 54   elseif {$stackT
b740: 72 61 63 65 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  race} then {..  
b750: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
b760: 20 23 20 4e 4f 54 45 3a 20 46 61 69 6c 75 72 65   # NOTE: Failure
b770: 2e 20 20 4f 75 72 20 63 61 6c 6c 65 72 20 77 61  .  Our caller wa
b780: 6e 74 73 20 61 20 66 75 6c 6c 20 73 74 61 63 6b  nts a full stack
b790: 20 74 72 61 63 65 20 28 69 66 20 61 70 70 6c 69   trace (if appli
b7a0: 63 61 62 6c 65 29 2c 0d 0a 20 20 20 20 20 20 20  cable),..       
b7b0: 20 23 20 20 20 20 20 20 20 72 65 74 75 72 6e 20   #       return 
b7c0: 61 20 6c 69 73 74 20 77 69 74 68 20 74 68 65 20  a list with the 
b7d0: 72 65 74 75 72 6e 20 63 6f 64 65 20 61 6e 64 20  return code and 
b7e0: 74 68 65 20 72 65 73 75 6c 74 20 76 65 72 62 61  the result verba
b7f0: 74 69 6d 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  tim...        #.
b800: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
b810: 5b 6c 69 73 74 20 24 63 6f 64 65 20 24 72 65 73  [list $code $res
b820: 75 6c 74 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c  ult]..      } el
b830: 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d  se {..        #.
b840: 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
b850: 20 46 61 69 6c 75 72 65 2e 20 20 4f 75 72 20 63   Failure.  Our c
b860: 61 6c 6c 65 72 20 64 6f 65 73 20 6e 6f 74 20 77  aller does not w
b870: 61 6e 74 20 61 20 66 75 6c 6c 20 73 74 61 63 6b  ant a full stack
b880: 20 74 72 61 63 65 20 28 69 66 0d 0a 20 20 20 20   trace (if..    
b890: 20 20 20 20 23 20 20 20 20 20 20 20 61 70 70 6c      #       appl
b8a0: 69 63 61 62 6c 65 29 2c 20 72 65 74 75 72 6e 20  icable), return 
b8b0: 61 20 6c 69 73 74 20 77 69 74 68 20 74 68 65 20  a list with the 
b8c0: 72 65 74 75 72 6e 20 63 6f 64 65 2c 20 74 68 65  return code, the
b8d0: 20 65 72 72 6f 72 0d 0a 20 20 20 20 20 20 20 20   error..        
b8e0: 23 20 20 20 20 20 20 20 63 6f 64 65 20 66 6f 72  #       code for
b8f0: 20 74 68 65 20 69 6e 74 65 72 70 72 65 74 65 72   the interpreter
b900: 2c 20 61 6e 64 20 74 68 65 20 65 72 72 6f 72 20  , and the error 
b910: 6d 65 73 73 61 67 65 20 75 70 20 74 6f 20 74 68  message up to th
b920: 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  e..        #    
b930: 20 20 20 70 6f 69 6e 74 20 77 68 65 72 65 20 74     point where t
b940: 68 65 20 73 74 61 63 6b 20 74 72 61 63 65 20 73  he stack trace s
b950: 68 6f 75 6c 64 20 73 74 61 72 74 2e 0d 0a 20 20  hould start...  
b960: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
b970: 20 73 65 74 20 69 6e 64 65 78 20 5b 73 74 72 69   set index [stri
b980: 6e 67 20 66 69 72 73 74 20 22 20 20 20 61 74 20  ng first "   at 
b990: 22 20 24 72 65 73 75 6c 74 5d 3b 20 23 20 48 41  " $result]; # HA
b9a0: 43 4b 3a 20 52 65 6c 69 61 62 6c 65 3f 0d 0a 0d  CK: Reliable?...
b9b0: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
b9c0: 5b 6c 69 73 74 20 24 63 6f 64 65 20 24 3a 3a 65  [list $code $::e
b9d0: 72 72 6f 72 43 6f 64 65 20 5b 65 78 70 72 20 7b  rrorCode [expr {
b9e0: 24 69 6e 64 65 78 20 21 3d 20 2d 31 20 3f 20 5c  $index != -1 ? \
b9f0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 73  ..            [s
ba00: 74 72 69 6e 67 20 74 72 69 6d 20 5b 73 74 72 69  tring trim [stri
ba10: 6e 67 20 72 61 6e 67 65 20 24 72 65 73 75 6c 74  ng range $result
ba20: 20 30 20 24 69 6e 64 65 78 5d 5d 20 3a 20 24 72   0 $index]] : $r
ba30: 65 73 75 6c 74 7d 5d 5d 0d 0a 20 20 20 20 20 20  esult}]]..      
ba40: 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  }..    }.....   
ba50: 20 70 72 6f 63 20 63 6f 6d 70 69 6c 65 43 53 68   proc compileCSh
ba60: 61 72 70 57 69 74 68 20 7b 0d 0a 20 20 20 20 20  arpWith {..     
ba70: 20 20 20 20 20 20 20 74 65 78 74 20 6d 65 6d 6f         text memo
ba80: 72 79 20 73 79 6d 62 6f 6c 73 20 73 74 72 69 63  ry symbols stric
ba90: 74 20 72 65 73 75 6c 74 73 56 61 72 4e 61 6d 65  t resultsVarName
baa0: 20 65 72 72 6f 72 73 56 61 72 4e 61 6d 65 20 66   errorsVarName f
bab0: 69 6c 65 4e 61 6d 65 73 0d 0a 20 20 20 20 20 20  ileNames..      
bac0: 20 20 20 20 20 20 61 72 67 73 20 7d 20 7b 0d 0a        args } {..
bad0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
bae0: 20 4e 4f 54 45 3a 20 53 69 6e 63 65 20 77 65 20   NOTE: Since we 
baf0: 61 72 65 20 67 6f 69 6e 67 20 74 6f 20 75 73 65  are going to use
bb00: 20 74 68 69 73 20 6d 65 74 68 6f 64 20 6e 61 6d   this method nam
bb10: 65 20 61 20 6c 6f 74 2c 20 61 73 73 69 67 6e 20  e a lot, assign 
bb20: 69 74 20 74 6f 20 61 0d 0a 20 20 20 20 20 20 23  it to a..      #
bb30: 20 20 20 20 20 20 20 76 61 72 69 61 62 6c 65 20         variable 
bb40: 66 69 72 73 74 2e 0d 0a 20 20 20 20 20 20 23 0d  first...      #.
bb50: 0a 20 20 20 20 20 20 73 65 74 20 61 64 64 20 52  .      set add R
bb60: 65 66 65 72 65 6e 63 65 64 41 73 73 65 6d 62 6c  eferencedAssembl
bb70: 69 65 73 2e 41 64 64 0d 0a 0d 0a 20 20 20 20 20  ies.Add....     
bb80: 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
bb90: 3a 20 43 72 65 61 74 65 20 74 68 65 20 62 61 73  : Create the bas
bba0: 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 76 61  e command to eva
bbb0: 6c 75 61 74 65 20 61 6e 64 20 61 64 64 20 74 68  luate and add th
bbc0: 65 20 70 72 6f 70 65 72 74 79 20 73 65 74 74 69  e property setti
bbd0: 6e 67 73 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ngs..      #    
bbe0: 20 20 20 74 68 61 74 20 61 72 65 20 61 6c 6d 6f     that are almo
bbf0: 73 74 20 61 6c 77 61 79 73 20 6e 65 65 64 65 64  st always needed
bc00: 20 62 79 20 6f 75 72 20 75 6e 69 74 20 74 65 73   by our unit tes
bc10: 74 73 20 28 69 2e 65 2e 20 74 68 65 20 53 79 73  ts (i.e. the Sys
bc20: 74 65 6d 0d 0a 20 20 20 20 20 20 23 20 20 20 20  tem..      #    
bc30: 20 20 20 61 6e 64 20 53 79 73 74 65 6d 2e 44 61     and System.Da
bc40: 74 61 20 61 73 73 65 6d 62 6c 79 20 72 65 66 65  ta assembly refe
bc50: 72 65 6e 63 65 73 29 2e 0d 0a 20 20 20 20 20 20  rences)...      
bc60: 23 0d 0a 20 20 20 20 20 20 73 65 74 20 63 6f 6d  #..      set com
bc70: 6d 61 6e 64 20 5b 6c 69 73 74 20 5c 0d 0a 20 20  mand [list \..  
bc80: 20 20 20 20 20 20 20 20 63 6f 6d 70 69 6c 65 43          compileC
bc90: 53 68 61 72 70 20 24 74 65 78 74 20 24 6d 65 6d  Sharp $text $mem
bca0: 6f 72 79 20 24 73 79 6d 62 6f 6c 73 20 24 73 74  ory $symbols $st
bcb0: 72 69 63 74 20 72 65 73 75 6c 74 73 20 65 72 72  rict results err
bcc0: 6f 72 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ors \..         
bcd0: 20 24 61 64 64 20 53 79 73 74 65 6d 2e 64 6c 6c   $add System.dll
bce0: 20 24 61 64 64 20 53 79 73 74 65 6d 2e 44 61 74   $add System.Dat
bcf0: 61 2e 64 6c 6c 20 24 61 64 64 20 53 79 73 74 65  a.dll $add Syste
bd00: 6d 2e 54 72 61 6e 73 61 63 74 69 6f 6e 73 2e 64  m.Transactions.d
bd10: 6c 6c 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  ll \..          
bd20: 24 61 64 64 20 53 79 73 74 65 6d 2e 58 6d 6c 2e  $add System.Xml.
bd30: 64 6c 6c 5d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d  dll]....      #.
bd40: 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41  .      # NOTE: A
bd50: 64 64 20 61 6c 6c 20 74 68 65 20 70 72 6f 76 69  dd all the provi
bd60: 64 65 64 20 66 69 6c 65 20 6e 61 6d 65 73 20 61  ded file names a
bd70: 73 20 61 73 73 65 6d 62 6c 79 20 72 65 66 65 72  s assembly refer
bd80: 65 6e 63 65 73 2e 0d 0a 20 20 20 20 20 20 23 0d  ences...      #.
bd90: 0a 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 66  .      foreach f
bda0: 69 6c 65 4e 61 6d 65 20 24 66 69 6c 65 4e 61 6d  ileName $fileNam
bdb0: 65 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 6c 61  es {..        la
bdc0: 70 70 65 6e 64 20 63 6f 6d 6d 61 6e 64 20 24 61  ppend command $a
bdd0: 64 64 20 5b 67 65 74 42 69 6e 61 72 79 46 69 6c  dd [getBinaryFil
bde0: 65 4e 61 6d 65 20 24 66 69 6c 65 4e 61 6d 65 5d  eName $fileName]
bdf0: 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
be00: 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
be10: 54 45 3a 20 41 64 64 20 74 68 65 20 65 78 74 72  TE: Add the extr
be20: 61 20 61 72 67 75 6d 65 6e 74 73 2c 20 69 66 20  a arguments, if 
be30: 61 6e 79 2c 20 74 6f 20 74 68 65 20 63 6f 6d 6d  any, to the comm
be40: 61 6e 64 20 74 6f 20 65 76 61 6c 75 61 74 65 2e  and to evaluate.
be50: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
be60: 20 65 76 61 6c 20 6c 61 70 70 65 6e 64 20 63 6f   eval lappend co
be70: 6d 6d 61 6e 64 20 24 61 72 67 73 0d 0a 0d 0a 20  mmand $args.... 
be80: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
be90: 4e 4f 54 45 3a 20 41 6c 69 61 73 20 74 68 65 20  NOTE: Alias the 
bea0: 63 6f 6d 70 69 6c 65 72 20 6c 6f 63 61 6c 20 72  compiler local r
beb0: 65 73 75 6c 74 73 20 61 6e 64 20 65 72 72 6f 72  esults and error
bec0: 73 20 76 61 72 69 61 62 6c 65 73 20 74 6f 20 74  s variables to t
bed0: 68 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  he..      #     
bee0: 20 20 76 61 72 69 61 62 6c 65 20 6e 61 6d 65 73    variable names
bef0: 20 70 72 6f 76 69 64 65 64 20 62 79 20 6f 75 72   provided by our
bf00: 20 63 61 6c 6c 65 72 2e 0d 0a 20 20 20 20 20 20   caller...      
bf10: 23 0d 0a 20 20 20 20 20 20 75 70 76 61 72 20 31  #..      upvar 1
bf20: 20 24 72 65 73 75 6c 74 73 56 61 72 4e 61 6d 65   $resultsVarName
bf30: 20 72 65 73 75 6c 74 73 0d 0a 20 20 20 20 20 20   results..      
bf40: 75 70 76 61 72 20 31 20 24 65 72 72 6f 72 73 56  upvar 1 $errorsV
bf50: 61 72 4e 61 6d 65 20 65 72 72 6f 72 73 0d 0a 0d  arName errors...
bf60: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
bf70: 23 20 4e 4f 54 45 3a 20 45 76 61 6c 75 61 74 65  # NOTE: Evaluate
bf80: 20 74 68 65 20 63 6f 6e 73 74 72 75 63 74 65 64   the constructed
bf90: 20 5b 63 6f 6d 70 69 6c 65 43 53 68 61 72 70 5d   [compileCSharp]
bfa0: 20 63 6f 6d 6d 61 6e 64 20 61 6e 64 20 72 65 74   command and ret
bfb0: 75 72 6e 20 74 68 65 0d 0a 20 20 20 20 20 20 23  urn the..      #
bfc0: 20 20 20 20 20 20 20 72 65 73 75 6c 74 2e 0d 0a         result...
bfd0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 65        #..      e
bfe0: 76 61 6c 20 24 63 6f 6d 6d 61 6e 64 0d 0a 20 20  val $command..  
bff0: 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
c000: 20 69 73 4d 65 6d 6f 72 79 44 62 20 7b 20 66 69   isMemoryDb { fi
c010: 6c 65 4e 61 6d 65 20 7d 20 7b 0d 0a 20 20 20 20  leName } {..    
c020: 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
c030: 45 3a 20 49 73 20 74 68 65 20 73 70 65 63 69 66  E: Is the specif
c040: 69 65 64 20 64 61 74 61 62 61 73 65 20 66 69 6c  ied database fil
c050: 65 20 6e 61 6d 65 20 72 65 61 6c 6c 79 20 61 6e  e name really an
c060: 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
c070: 61 73 65 3f 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ase?..      #.. 
c080: 20 20 20 20 20 72 65 74 75 72 6e 20 5b 65 78 70       return [exp
c090: 72 20 7b 24 66 69 6c 65 4e 61 6d 65 20 65 71 20  r {$fileName eq 
c0a0: 22 3a 6d 65 6d 6f 72 79 3a 22 20 7c 7c 20 5c 0d  ":memory:" || \.
c0b0: 0a 20 20 20 20 20 20 20 20 20 20 5b 73 74 72 69  .          [stri
c0c0: 6e 67 20 72 61 6e 67 65 20 24 66 69 6c 65 4e 61  ng range $fileNa
c0d0: 6d 65 20 30 20 31 32 5d 20 65 71 20 22 66 69 6c  me 0 12] eq "fil
c0e0: 65 3a 3a 6d 65 6d 6f 72 79 3a 22 7d 5d 0d 0a 20  e::memory:"}].. 
c0f0: 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
c100: 63 20 69 73 54 61 62 6c 65 49 6e 44 62 20 7b 20  c isTableInDb { 
c110: 6e 61 6d 65 20 7b 76 61 72 4e 61 6d 65 20 64 62  name {varName db
c120: 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a  } } {..      #..
c130: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 52 65        # NOTE: Re
c140: 66 65 72 20 74 6f 20 74 68 65 20 73 70 65 63 69  fer to the speci
c150: 66 69 65 64 20 76 61 72 69 61 62 6c 65 20 28 65  fied variable (e
c160: 2e 67 2e 20 22 64 62 22 29 20 69 6e 20 74 68 65  .g. "db") in the
c170: 20 63 6f 6e 74 65 78 74 20 6f 66 20 6f 75 72 0d   context of our.
c180: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63  .      #       c
c190: 61 6c 6c 65 72 2e 20 20 49 74 20 63 6f 6e 74 61  aller.  It conta
c1a0: 69 6e 73 20 74 68 65 20 64 61 74 61 62 61 73 65  ins the database
c1b0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 6e 64   connection hand
c1c0: 6c 65 20 74 68 61 74 20 77 69 6c 6c 20 62 65 0d  le that will be.
c1d0: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 75  .      #       u
c1e0: 73 65 64 20 74 6f 20 65 78 65 63 75 74 65 20 74  sed to execute t
c1f0: 68 65 20 71 75 65 72 79 20 75 73 65 64 20 74 6f  he query used to
c200: 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20 74 68   determine if th
c210: 65 20 6e 61 6d 65 64 20 74 61 62 6c 65 20 69 73  e named table is
c220: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
c230: 70 72 65 73 65 6e 74 20 69 6e 20 74 68 61 74 20  present in that 
c240: 64 61 74 61 62 61 73 65 2e 0d 0a 20 20 20 20 20  database...     
c250: 20 23 0d 0a 20 20 20 20 20 20 75 70 76 61 72 20   #..      upvar 
c260: 31 20 24 76 61 72 4e 61 6d 65 20 64 62 0d 0a 0d  1 $varName db...
c270: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
c280: 23 20 4e 4f 54 45 3a 20 55 73 65 20 74 68 65 20  # NOTE: Use the 
c290: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61  sqlite_master ta
c2a0: 62 6c 65 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  ble to determine
c2b0: 20 69 66 20 74 68 65 20 6e 61 6d 65 64 20 74 61   if the named ta
c2c0: 62 6c 65 20 69 73 0d 0a 20 20 20 20 20 20 23 20  ble is..      # 
c2d0: 20 20 20 20 20 20 70 72 65 73 65 6e 74 20 69 6e        present in
c2e0: 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0d 0a   the database...
c2f0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 73        #..      s
c300: 65 74 20 73 71 6c 20 7b 0d 0a 20 20 20 20 20 20  et sql {..      
c310: 20 20 53 45 4c 45 43 54 20 43 4f 55 4e 54 28 2a    SELECT COUNT(*
c320: 29 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61  ) FROM sqlite_ma
c330: 73 74 65 72 20 57 48 45 52 45 20 74 79 70 65 20  ster WHERE type 
c340: 3d 20 27 74 61 62 6c 65 27 20 41 4e 44 20 6e 61  = 'table' AND na
c350: 6d 65 20 3d 20 3f 3b 0d 0a 20 20 20 20 20 20 7d  me = ?;..      }
c360: 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  ....      #..   
c370: 20 20 20 23 20 4e 4f 54 45 3a 20 52 65 74 75 72     # NOTE: Retur
c380: 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68  n non-zero if th
c390: 65 20 6e 61 6d 65 64 20 74 61 62 6c 65 20 69 73  e named table is
c3a0: 20 70 72 65 73 65 6e 74 2e 0d 0a 20 20 20 20 20   present...     
c3b0: 20 23 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e   #..      return
c3c0: 20 5b 65 78 70 72 20 7b 0d 0a 20 20 20 20 20 20   [expr {..      
c3d0: 20 20 5b 73 71 6c 20 65 78 65 63 75 74 65 20 2d    [sql execute -
c3e0: 65 78 65 63 75 74 65 20 73 63 61 6c 61 72 20 24  execute scalar $
c3f0: 64 62 20 24 73 71 6c 20 5b 6c 69 73 74 20 70 61  db $sql [list pa
c400: 72 61 6d 31 20 53 74 72 69 6e 67 20 24 6e 61 6d  ram1 String $nam
c410: 65 5d 5d 20 3e 20 30 0d 0a 20 20 20 20 20 20 7d  e]] > 0..      }
c420: 5d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  ]..    }.....   
c430: 20 70 72 6f 63 20 74 72 69 6d 53 71 6c 20 7b 20   proc trimSql { 
c440: 73 71 6c 20 7d 20 7b 0d 0a 20 20 20 20 20 20 72  sql } {..      r
c450: 65 74 75 72 6e 20 5b 72 65 67 73 75 62 20 2d 61  eturn [regsub -a
c460: 6c 6c 20 2d 2d 20 7b 5c 73 2b 7d 20 5b 73 74 72  ll -- {\s+} [str
c470: 69 6e 67 20 74 72 69 6d 20 24 73 71 6c 5d 20 22  ing trim $sql] "
c480: 20 22 5d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20   "]..    }..... 
c490: 20 20 20 70 72 6f 63 20 65 78 65 63 75 74 65 53     proc executeS
c4a0: 71 6c 20 7b 20 73 71 6c 20 7b 65 78 65 63 75 74  ql { sql {execut
c4b0: 65 20 6e 6f 6e 65 7d 20 7b 66 6f 72 6d 61 74 20  e none} {format 
c4c0: 6e 6f 6e 65 7d 20 7b 66 69 6c 65 4e 61 6d 65 20  none} {fileName 
c4d0: 22 22 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 69  ""} } {..      i
c4e0: 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74  f {[string lengt
c4f0: 68 20 24 66 69 6c 65 4e 61 6d 65 5d 20 3d 3d 20  h $fileName] == 
c500: 30 7d 20 74 68 65 6e 20 7b 73 65 74 20 66 69 6c  0} then {set fil
c510: 65 4e 61 6d 65 20 3a 6d 65 6d 6f 72 79 3a 7d 0d  eName :memory:}.
c520: 0a 20 20 20 20 20 20 73 65 74 75 70 44 62 20 24  .      setupDb $
c530: 66 69 6c 65 4e 61 6d 65 20 22 22 20 22 22 20 22  fileName "" "" "
c540: 22 20 22 22 20 22 22 20 66 61 6c 73 65 20 66 61  " "" "" false fa
c550: 6c 73 65 20 66 61 6c 73 65 20 66 61 6c 73 65 0d  lse false false.
c560: 0a 0d 0a 20 20 20 20 20 20 74 72 79 20 7b 0d 0a  ...      try {..
c570: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b          return [
c580: 75 70 6c 65 76 65 6c 20 31 20 5b 6c 69 73 74 20  uplevel 1 [list 
c590: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  \..            s
c5a0: 71 6c 20 65 78 65 63 75 74 65 20 2d 65 78 65 63  ql execute -exec
c5b0: 75 74 65 20 24 65 78 65 63 75 74 65 20 2d 66 6f  ute $execute -fo
c5c0: 72 6d 61 74 20 24 66 6f 72 6d 61 74 20 24 64 62  rmat $format $db
c5d0: 20 24 73 71 6c 5d 5d 0d 0a 20 20 20 20 20 20 7d   $sql]]..      }
c5e0: 20 66 69 6e 61 6c 6c 79 20 7b 0d 0a 20 20 20 20   finally {..    
c5f0: 20 20 20 20 63 6c 65 61 6e 75 70 44 62 20 24 66      cleanupDb $f
c600: 69 6c 65 4e 61 6d 65 20 64 62 20 66 61 6c 73 65  ileName db false
c610: 20 66 61 6c 73 65 20 66 61 6c 73 65 0d 0a 20 20   false false..  
c620: 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d      }..    }....
c630: 0a 20 20 20 20 70 72 6f 63 20 73 65 74 75 70 44  .    proc setupD
c640: 62 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  b {..           
c650: 20 66 69 6c 65 4e 61 6d 65 20 7b 6d 6f 64 65 20   fileName {mode 
c660: 22 22 7d 20 7b 64 61 74 65 54 69 6d 65 46 6f 72  ""} {dateTimeFor
c670: 6d 61 74 20 22 22 7d 20 7b 64 61 74 65 54 69 6d  mat ""} {dateTim
c680: 65 4b 69 6e 64 20 22 22 7d 20 7b 66 6c 61 67 73  eKind ""} {flags
c690: 20 22 22 7d 0d 0a 20 20 20 20 20 20 20 20 20 20   ""}..          
c6a0: 20 20 7b 65 78 74 72 61 20 22 22 7d 20 7b 71 75    {extra ""} {qu
c6b0: 61 6c 69 66 79 20 74 72 75 65 7d 20 7b 64 65 6c  alify true} {del
c6c0: 65 74 65 20 74 72 75 65 7d 20 7b 75 72 69 20 66  ete true} {uri f
c6d0: 61 6c 73 65 7d 0d 0a 20 20 20 20 20 20 20 20 20  alse}..         
c6e0: 20 20 20 7b 74 65 6d 70 6f 72 61 72 79 20 74 72     {temporary tr
c6f0: 75 65 7d 20 7b 76 61 72 4e 61 6d 65 20 64 62 7d  ue} {varName db}
c700: 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20   } {..      #.. 
c710: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 46 69 72       # NOTE: Fir
c720: 73 74 2c 20 73 65 65 20 69 66 20 6f 75 72 20 63  st, see if our c
c730: 61 6c 6c 65 72 20 68 61 73 20 72 65 71 75 65 73  aller has reques
c740: 74 65 64 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79  ted an in-memory
c750: 20 64 61 74 61 62 61 73 65 2e 0d 0a 20 20 20 20   database...    
c760: 20 20 23 0d 0a 20 20 20 20 20 20 73 65 74 20 69    #..      set i
c770: 73 4d 65 6d 6f 72 79 20 5b 69 73 4d 65 6d 6f 72  sMemory [isMemor
c780: 79 44 62 20 24 66 69 6c 65 4e 61 6d 65 5d 0d 0a  yDb $fileName]..
c790: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
c7a0: 20 23 20 4e 4f 54 45 3a 20 46 6f 72 20 6e 6f 77   # NOTE: For now
c7b0: 2c 20 61 6c 6c 20 74 65 73 74 20 64 61 74 61 62  , all test datab
c7c0: 61 73 65 73 20 75 73 65 64 20 62 79 20 74 68 65  ases used by the
c7d0: 20 74 65 73 74 20 73 75 69 74 65 20 61 72 65 20   test suite are 
c7e0: 70 6c 61 63 65 64 0d 0a 20 20 20 20 20 20 23 20  placed..      # 
c7f0: 20 20 20 20 20 20 69 6e 74 6f 20 74 68 65 20 64        into the d
c800: 61 74 61 62 61 73 65 20 64 69 72 65 63 74 6f 72  atabase director
c810: 79 2e 20 20 45 61 63 68 20 64 61 74 61 62 61 73  y.  Each databas
c820: 65 20 61 6e 64 20 72 65 6c 61 74 65 64 20 66 69  e and related fi
c830: 6c 65 73 0d 0a 20 20 20 20 20 20 23 20 20 20 20  les..      #    
c840: 20 20 20 75 73 65 64 20 62 79 20 61 20 74 65 73     used by a tes
c850: 74 20 73 68 6f 75 6c 64 20 62 65 20 63 6c 65 61  t should be clea
c860: 6e 65 64 20 75 70 20 62 79 20 74 68 61 74 20 74  ned up by that t
c870: 65 73 74 20 75 73 69 6e 67 20 74 68 65 0d 0a 20  est using the.. 
c880: 20 20 20 20 20 23 20 20 20 20 20 20 20 22 63 6c       #       "cl
c890: 65 61 6e 75 70 44 62 22 20 70 72 6f 63 65 64 75  eanupDb" procedu
c8a0: 72 65 2c 20 62 65 6c 6f 77 2e 0d 0a 20 20 20 20  re, below...    
c8b0: 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 21    #..      if {!
c8c0: 24 69 73 4d 65 6d 6f 72 79 20 26 26 20 24 71 75  $isMemory && $qu
c8d0: 61 6c 69 66 79 7d 20 74 68 65 6e 20 7b 0d 0a 20  alify} then {.. 
c8e0: 20 20 20 20 20 20 20 73 65 74 20 66 69 6c 65 4e         set fileN
c8f0: 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5b  ame [file join [
c900: 67 65 74 44 61 74 61 62 61 73 65 44 69 72 65 63  getDatabaseDirec
c910: 74 6f 72 79 5d 20 5b 66 69 6c 65 20 74 61 69 6c  tory] [file tail
c920: 20 24 66 69 6c 65 4e 61 6d 65 5d 5d 0d 0a 20 20   $fileName]]..  
c930: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23      }....      #
c940: 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
c950: 42 79 20 64 65 66 61 75 6c 74 2c 20 64 65 6c 65  By default, dele
c960: 74 65 20 61 6e 79 20 70 72 65 2d 65 78 69 73 74  te any pre-exist
c970: 69 6e 67 20 64 61 74 61 62 61 73 65 20 77 69 74  ing database wit
c980: 68 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65 0d  h the same file.
c990: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 6e  .      #       n
c9a0: 61 6d 65 20 69 66 20 69 74 20 63 75 72 72 65 6e  ame if it curren
c9b0: 74 6c 79 20 65 78 69 73 74 73 2e 0d 0a 20 20 20  tly exists...   
c9c0: 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
c9d0: 21 24 69 73 4d 65 6d 6f 72 79 20 26 26 20 24 64  !$isMemory && $d
c9e0: 65 6c 65 74 65 20 26 26 20 5b 66 69 6c 65 20 65  elete && [file e
c9f0: 78 69 73 74 73 20 24 66 69 6c 65 4e 61 6d 65 5d  xists $fileName]
ca00: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
ca10: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
ca20: 4f 54 45 3a 20 41 74 74 65 6d 70 74 20 74 6f 20  OTE: Attempt to 
ca30: 64 65 6c 65 74 65 20 61 6e 79 20 70 72 65 2d 65  delete any pre-e
ca40: 78 69 73 74 69 6e 67 20 64 61 74 61 62 61 73 65  xisting database
ca50: 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 66   with the same f
ca60: 69 6c 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20  ile..        #  
ca70: 20 20 20 20 20 6e 61 6d 65 2e 0d 0a 20 20 20 20       name...    
ca80: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 69      #..        i
ca90: 66 20 7b 5b 63 61 74 63 68 20 7b 66 69 6c 65 20  f {[catch {file 
caa0: 64 65 6c 65 74 65 20 24 66 69 6c 65 4e 61 6d 65  delete $fileName
cab0: 7d 20 65 72 72 6f 72 5d 7d 20 74 68 65 6e 20 7b  } error]} then {
cac0: 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20  ..          #.. 
cad0: 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a           # NOTE:
cae0: 20 57 65 20 73 6f 6d 65 68 6f 77 20 66 61 69 6c   We somehow fail
caf0: 65 64 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65  ed to delete the
cb00: 20 66 69 6c 65 2c 20 72 65 70 6f 72 74 20 77 68   file, report wh
cb10: 79 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d  y...          #.
cb20: 0a 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73  .          tputs
cb30: 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
cb40: 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
cb50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 3d                "=
cb60: 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61 69  === WARNING: fai
cb70: 6c 65 64 20 74 6f 20 64 65 6c 65 74 65 20 64 61  led to delete da
cb80: 74 61 62 61 73 65 20 66 69 6c 65 20 5c 22 22 20  tabase file \"" 
cb90: 24 66 69 6c 65 4e 61 6d 65 20 5c 0d 0a 20 20 20  $fileName \..   
cba0: 20 20 20 20 20 20 20 20 20 20 20 22 5c 22 20 64             "\" d
cbb0: 75 72 69 6e 67 20 73 65 74 75 70 2c 20 65 72 72  uring setup, err
cbc0: 6f 72 3a 20 22 20 5c 6e 5c 74 20 24 65 72 72 6f  or: " \n\t $erro
cbd0: 72 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 7d  r \n]..        }
cbe0: 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
cbf0: 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
cc00: 54 45 3a 20 52 65 66 65 72 20 74 6f 20 74 68 65  TE: Refer to the
cc10: 20 73 70 65 63 69 66 69 65 64 20 76 61 72 69 61   specified varia
cc20: 62 6c 65 20 28 65 2e 67 2e 20 22 64 62 22 29 20  ble (e.g. "db") 
cc30: 69 6e 20 74 68 65 20 63 6f 6e 74 65 78 74 20 6f  in the context o
cc40: 66 20 6f 75 72 0d 0a 20 20 20 20 20 20 23 20 20  f our..      #  
cc50: 20 20 20 20 20 63 61 6c 6c 65 72 2e 20 20 54 68       caller.  Th
cc60: 65 20 68 61 6e 64 6c 65 20 74 6f 20 74 68 65 20  e handle to the 
cc70: 6f 70 65 6e 65 64 20 64 61 74 61 62 61 73 65 20  opened database 
cc80: 77 69 6c 6c 20 62 65 20 73 74 6f 72 65 64 20 74  will be stored t
cc90: 68 65 72 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  here...      #..
cca0: 20 20 20 20 20 20 75 70 76 61 72 20 31 20 24 76        upvar 1 $v
ccb0: 61 72 4e 61 6d 65 20 64 62 0d 0a 0d 0a 20 20 20  arName db....   
ccc0: 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
ccd0: 54 45 3a 20 53 74 61 72 74 20 62 75 69 6c 64 69  TE: Start buildi
cce0: 6e 67 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  ng the connectio
ccf0: 6e 20 73 74 72 69 6e 67 2e 20 20 54 68 65 20 6f  n string.  The o
cd00: 6e 6c 79 20 72 65 71 75 69 72 65 64 20 70 6f 72  nly required por
cd10: 74 69 6f 6e 0d 0a 20 20 20 20 20 20 23 20 20 20  tion..      #   
cd20: 20 20 20 20 6f 66 20 74 68 65 20 63 6f 6e 6e 65      of the conne
cd30: 63 74 69 6f 6e 20 73 74 72 69 6e 67 20 69 73 20  ction string is 
cd40: 74 68 65 20 64 61 74 61 20 73 6f 75 72 63 65 2c  the data source,
cd50: 20 77 68 69 63 68 20 63 6f 6e 74 61 69 6e 73 20   which contains 
cd60: 74 68 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20  the..      #    
cd70: 20 20 20 64 61 74 61 62 61 73 65 20 66 69 6c 65     database file
cd80: 20 6e 61 6d 65 20 69 74 73 65 6c 66 2e 20 20 49   name itself.  I
cd90: 66 20 6f 75 72 20 63 61 6c 6c 65 72 20 77 61 6e  f our caller wan
cda0: 74 73 20 74 6f 20 75 73 65 20 61 20 55 52 49 20  ts to use a URI 
cdb0: 61 73 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  as..      #     
cdc0: 20 20 74 68 65 20 64 61 74 61 20 73 6f 75 72 63    the data sourc
cdd0: 65 2c 20 75 73 65 20 74 68 65 20 46 75 6c 6c 55  e, use the FullU
cde0: 72 69 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 74  ri connection st
cdf0: 72 69 6e 67 20 70 72 6f 70 65 72 74 79 20 74 6f  ring property to
ce00: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
ce10: 70 72 65 76 65 6e 74 20 74 68 65 20 64 61 74 61  prevent the data
ce20: 20 73 6f 75 72 63 65 20 73 74 72 69 6e 67 20 66   source string f
ce30: 72 6f 6d 20 62 65 69 6e 67 20 6d 61 6e 67 6c 65  rom being mangle
ce40: 64 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  d...      #..   
ce50: 20 20 20 69 66 20 7b 24 75 72 69 7d 20 74 68 65     if {$uri} the
ce60: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 65 74  n {..        set
ce70: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 7b 46 75 6c   connection {Ful
ce80: 6c 55 72 69 3d 24 7b 66 69 6c 65 4e 61 6d 65 7d  lUri=${fileName}
ce90: 7d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20  }..      } else 
cea0: 7b 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 63  {..        set c
ceb0: 6f 6e 6e 65 63 74 69 6f 6e 20 7b 44 61 74 61 20  onnection {Data 
cec0: 53 6f 75 72 63 65 3d 24 7b 66 69 6c 65 4e 61 6d  Source=${fileNam
ced0: 65 7d 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a  e}}..      }....
cee0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
cef0: 20 4e 4f 54 45 3a 20 53 69 6e 63 65 20 74 68 69   NOTE: Since thi
cf00: 73 20 70 72 6f 63 65 64 75 72 65 20 68 61 73 20  s procedure has 
cf10: 6e 6f 20 73 70 65 63 69 61 6c 20 6b 6e 6f 77 6c  no special knowl
cf20: 65 64 67 65 20 6f 66 20 77 68 61 74 20 74 68 65  edge of what the
cf30: 20 64 65 66 61 75 6c 74 0d 0a 20 20 20 20 20 20   default..      
cf40: 23 20 20 20 20 20 20 20 73 65 74 74 69 6e 67 20  #       setting 
cf50: 69 73 20 66 6f 72 20 74 68 65 20 54 6f 46 75 6c  is for the ToFul
cf60: 6c 50 61 74 68 20 63 6f 6e 6e 65 63 74 69 6f 6e  lPath connection
cf70: 20 73 74 72 69 6e 67 20 70 72 6f 70 65 72 79 2c   string propery,
cf80: 20 61 6c 77 61 79 73 0d 0a 20 20 20 20 20 20 23   always..      #
cf90: 20 20 20 20 20 20 20 61 64 64 20 74 68 65 20 76         add the v
cfa0: 61 6c 75 65 20 77 65 20 6b 6e 6f 77 20 61 62 6f  alue we know abo
cfb0: 75 74 20 74 6f 20 74 68 65 20 63 6f 6e 6e 65 63  ut to the connec
cfc0: 74 69 6f 6e 20 73 74 72 69 6e 67 2e 0d 0a 20 20  tion string...  
cfd0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 61 70 70      #..      app
cfe0: 65 6e 64 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 7b  end connection {
cff0: 3b 54 6f 46 75 6c 6c 50 61 74 68 3d 24 7b 71 75  ;ToFullPath=${qu
d000: 61 6c 69 66 79 7d 7d 0d 0a 0d 0a 20 20 20 20 20  alify}}....     
d010: 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
d020: 3a 20 49 66 20 6f 75 72 20 63 61 6c 6c 65 72 20  : If our caller 
d030: 73 70 65 63 69 66 69 65 64 20 61 20 6a 6f 75 72  specified a jour
d040: 6e 61 6c 20 6d 6f 64 65 2c 20 61 64 64 20 74 68  nal mode, add th
d050: 65 20 6e 65 63 65 73 73 61 72 79 20 70 6f 72 74  e necessary port
d060: 69 6f 6e 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ion..      #    
d070: 20 20 20 6f 66 20 74 68 65 20 63 6f 6e 6e 65 63     of the connec
d080: 74 69 6f 6e 20 73 74 72 69 6e 67 20 6e 6f 77 2e  tion string now.
d090: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
d0a0: 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e   if {[string len
d0b0: 67 74 68 20 24 6d 6f 64 65 5d 20 3e 20 30 7d 20  gth $mode] > 0} 
d0c0: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
d0d0: 61 70 70 65 6e 64 20 63 6f 6e 6e 65 63 74 69 6f  append connectio
d0e0: 6e 20 7b 3b 4a 6f 75 72 6e 61 6c 20 4d 6f 64 65  n {;Journal Mode
d0f0: 3d 24 7b 6d 6f 64 65 7d 7d 0d 0a 20 20 20 20 20  =${mode}}..     
d100: 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20   }....      #.. 
d110: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 66 20       # NOTE: If 
d120: 6f 75 72 20 63 61 6c 6c 65 72 20 73 70 65 63 69  our caller speci
d130: 66 69 65 64 20 61 20 44 61 74 65 54 69 6d 65 20  fied a DateTime 
d140: 66 6f 72 6d 61 74 2c 20 61 64 64 20 74 68 65 20  format, add the 
d150: 6e 65 63 65 73 73 61 72 79 0d 0a 20 20 20 20 20  necessary..     
d160: 20 23 20 20 20 20 20 20 20 70 6f 72 74 69 6f 6e   #       portion
d170: 20 6f 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69   of the connecti
d180: 6f 6e 20 73 74 72 69 6e 67 20 6e 6f 77 2e 0d 0a  on string now...
d190: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69        #..      i
d1a0: 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74  f {[string lengt
d1b0: 68 20 24 64 61 74 65 54 69 6d 65 46 6f 72 6d 61  h $dateTimeForma
d1c0: 74 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  t] > 0} then {..
d1d0: 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 20 63          append c
d1e0: 6f 6e 6e 65 63 74 69 6f 6e 20 7b 3b 44 61 74 65  onnection {;Date
d1f0: 54 69 6d 65 46 6f 72 6d 61 74 3d 24 7b 64 61 74  TimeFormat=${dat
d200: 65 54 69 6d 65 46 6f 72 6d 61 74 7d 7d 0d 0a 20  eTimeFormat}}.. 
d210: 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
d220: 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
d230: 20 49 66 20 6f 75 72 20 63 61 6c 6c 65 72 20 73   If our caller s
d240: 70 65 63 69 66 69 65 64 20 61 20 44 61 74 65 54  pecified a DateT
d250: 69 6d 65 4b 69 6e 64 2c 20 61 64 64 20 74 68 65  imeKind, add the
d260: 20 6e 65 63 65 73 73 61 72 79 20 70 6f 72 74 69   necessary porti
d270: 6f 6e 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  on..      #     
d280: 20 20 6f 66 20 74 68 65 20 63 6f 6e 6e 65 63 74    of the connect
d290: 69 6f 6e 20 73 74 72 69 6e 67 20 6e 6f 77 2e 0d  ion string now..
d2a0: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
d2b0: 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67  if {[string leng
d2c0: 74 68 20 24 64 61 74 65 54 69 6d 65 4b 69 6e 64  th $dateTimeKind
d2d0: 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20  ] > 0} then {.. 
d2e0: 20 20 20 20 20 20 20 61 70 70 65 6e 64 20 63 6f         append co
d2f0: 6e 6e 65 63 74 69 6f 6e 20 7b 3b 44 61 74 65 54  nnection {;DateT
d300: 69 6d 65 4b 69 6e 64 3d 24 7b 64 61 74 65 54 69  imeKind=${dateTi
d310: 6d 65 4b 69 6e 64 7d 7d 0d 0a 20 20 20 20 20 20  meKind}}..      
d320: 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  }....      #..  
d330: 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 66 20 74      # NOTE: If t
d340: 68 65 72 65 20 61 72 65 20 61 6e 79 20 67 6c 6f  here are any glo
d350: 62 61 6c 20 28 70 65 72 20 74 65 73 74 20 72 75  bal (per test ru
d360: 6e 29 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 6c  n) connection fl
d370: 61 67 73 20 63 75 72 72 65 6e 74 6c 79 0d 0a 20  ags currently.. 
d380: 20 20 20 20 20 23 20 20 20 20 20 20 20 73 65 74       #       set
d390: 2c 20 75 73 65 20 74 68 65 6d 20 6e 6f 77 20 28  , use them now (
d3a0: 69 2e 65 2e 20 62 79 20 63 6f 6d 62 69 6e 69 6e  i.e. by combinin
d3b0: 67 20 74 68 65 6d 20 77 69 74 68 20 74 68 65 20  g them with the 
d3c0: 6f 6e 65 73 20 66 6f 72 20 74 68 69 73 0d 0a 20  ones for this.. 
d3d0: 20 20 20 20 20 23 20 20 20 20 20 20 20 63 6f 6e       #       con
d3e0: 6e 65 63 74 69 6f 6e 29 2e 0d 0a 20 20 20 20 20  nection)...     
d3f0: 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69   #..      if {[i
d400: 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 63 6f 6e  nfo exists ::con
d410: 6e 65 63 74 69 6f 6e 5f 66 6c 61 67 73 5d 20 26  nection_flags] &
d420: 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b  & \..          [
d430: 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a  string length $:
d440: 3a 63 6f 6e 6e 65 63 74 69 6f 6e 5f 66 6c 61 67  :connection_flag
d450: 73 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  s] > 0} then {..
d460: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
d470: 20 20 20 23 20 4e 4f 54 45 3a 20 53 68 6f 77 20     # NOTE: Show 
d480: 28 61 6e 64 20 6c 6f 67 29 20 74 68 61 74 20 77  (and log) that w
d490: 65 20 64 65 74 65 63 74 65 64 20 73 6f 6d 65 20  e detected some 
d4a0: 67 6c 6f 62 61 6c 20 63 6f 6e 6e 65 63 74 69 6f  global connectio
d4b0: 6e 20 66 6c 61 67 73 2e 0d 0a 20 20 20 20 20 20  n flags...      
d4c0: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 74 70 75    #..        tpu
d4d0: 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
d4e0: 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
d4f0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 2d  ..            "-
d500: 2d 2d 2d 20 67 6c 6f 62 61 6c 20 63 6f 6e 6e 65  --- global conne
d510: 63 74 69 6f 6e 20 66 6c 61 67 73 20 64 65 74 65  ction flags dete
d520: 63 74 65 64 3a 20 22 20 24 3a 3a 63 6f 6e 6e 65  cted: " $::conne
d530: 63 74 69 6f 6e 5f 66 6c 61 67 73 20 5c 6e 5d 0d  ction_flags \n].
d540: 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
d550: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 6f        # NOTE: Co
d560: 6d 62 69 6e 65 20 61 6e 64 2f 6f 72 20 72 65 70  mbine and/or rep
d570: 6c 61 63 65 20 74 68 65 20 63 6f 6e 6e 65 63 74  lace the connect
d580: 69 6f 6e 20 66 6c 61 67 73 20 61 6e 64 20 74 68  ion flags and th
d590: 65 6e 20 73 68 6f 77 20 74 68 65 0d 0a 20 20 20  en show the..   
d5a0: 20 20 20 20 20 23 20 20 20 20 20 20 20 6e 65 77       #       new
d5b0: 20 76 61 6c 75 65 2e 0d 0a 20 20 20 20 20 20 20   value...       
d5c0: 20 23 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20   #..        set 
d5d0: 66 6c 61 67 73 20 5b 63 6f 6d 62 69 6e 65 46 6c  flags [combineFl
d5e0: 61 67 73 20 24 66 6c 61 67 73 20 24 3a 3a 63 6f  ags $flags $::co
d5f0: 6e 6e 65 63 74 69 6f 6e 5f 66 6c 61 67 73 5d 0d  nnection_flags].
d600: 0a 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73  ...        tputs
d610: 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
d620: 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
d630: 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
d640: 2d 20 63 6f 6d 62 69 6e 65 64 20 63 6f 6e 6e 65  - combined conne
d650: 63 74 69 6f 6e 20 66 6c 61 67 73 20 61 72 65 3a  ction flags are:
d660: 20 22 20 24 66 6c 61 67 73 20 5c 6e 5d 0d 0a 20   " $flags \n].. 
d670: 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
d680: 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
d690: 20 49 66 20 6f 75 72 20 63 61 6c 6c 65 72 20 73   If our caller s
d6a0: 70 65 63 69 66 69 65 64 20 73 6f 6d 65 20 53 51  pecified some SQ
d6b0: 4c 69 74 65 43 6f 6e 6e 65 63 74 69 6f 6e 46 6c  LiteConnectionFl
d6c0: 61 67 73 2c 20 61 64 64 20 74 68 65 0d 0a 20 20  ags, add the..  
d6d0: 20 20 20 20 23 20 20 20 20 20 20 20 6e 65 63 65      #       nece
d6e0: 73 73 61 72 79 20 70 6f 72 74 69 6f 6e 20 6f 66  ssary portion of
d6f0: 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
d700: 73 74 72 69 6e 67 20 6e 6f 77 2e 0d 0a 20 20 20  string now...   
d710: 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
d720: 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
d730: 66 6c 61 67 73 5d 20 3e 20 30 7d 20 74 68 65 6e  flags] > 0} then
d740: 20 7b 0d 0a 20 20 20 20 20 20 20 20 61 70 70 65   {..        appe
d750: 6e 64 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 7b 3b  nd connection {;
d760: 46 6c 61 67 73 3d 24 7b 66 6c 61 67 73 7d 7d 0d  Flags=${flags}}.
d770: 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
d780: 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
d790: 45 3a 20 49 66 20 6f 75 72 20 63 61 6c 6c 65 72  E: If our caller
d7a0: 20 73 70 65 63 69 66 69 65 64 20 61 6e 20 65 78   specified an ex
d7b0: 74 72 61 20 70 61 79 6c 6f 61 64 20 74 6f 20 74  tra payload to t
d7c0: 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0d 0a 20  he connection.. 
d7d0: 20 20 20 20 20 23 20 20 20 20 20 20 20 73 74 72       #       str
d7e0: 69 6e 67 2c 20 61 70 70 65 6e 64 20 69 74 20 6e  ing, append it n
d7f0: 6f 77 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  ow...      #..  
d800: 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20      if {[string 
d810: 6c 65 6e 67 74 68 20 24 65 78 74 72 61 5d 20 3e  length $extra] >
d820: 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
d830: 20 20 20 20 61 70 70 65 6e 64 20 63 6f 6e 6e 65      append conne
d840: 63 74 69 6f 6e 20 5c 3b 20 24 65 78 74 72 61 0d  ction \; $extra.
d850: 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
d860: 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
d870: 45 3a 20 4f 70 65 6e 20 74 68 65 20 64 61 74 61  E: Open the data
d880: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
d890: 6e 6f 77 2c 20 70 6c 61 63 69 6e 67 20 74 68 65  now, placing the
d8a0: 20 6f 70 61 71 75 65 20 68 61 6e 64 6c 65 20 76   opaque handle v
d8b0: 61 6c 75 65 0d 0a 20 20 20 20 20 20 23 20 20 20  alue..      #   
d8c0: 20 20 20 20 69 6e 74 6f 20 74 68 65 20 76 61 72      into the var
d8d0: 69 61 62 6c 65 20 73 70 65 63 69 66 69 65 64 20  iable specified 
d8e0: 62 79 20 6f 75 72 20 63 61 6c 6c 65 72 2e 0d 0a  by our caller...
d8f0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 73        #..      s
d900: 65 74 20 64 62 20 5b 73 71 6c 20 6f 70 65 6e 20  et db [sql open 
d910: 2d 74 79 70 65 20 53 51 4c 69 74 65 20 5b 73 75  -type SQLite [su
d920: 62 73 74 20 24 63 6f 6e 6e 65 63 74 69 6f 6e 5d  bst $connection]
d930: 5d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  ]....      #..  
d940: 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 6f 6e 66      # NOTE: Conf
d950: 69 67 75 72 65 20 74 68 65 20 74 65 6d 70 6f 72  igure the tempor
d960: 61 72 79 20 64 69 72 65 63 74 6f 72 79 20 66 6f  ary directory fo
d970: 72 20 74 68 65 20 6e 65 77 6c 79 20 6f 70 65 6e  r the newly open
d980: 65 64 20 64 61 74 61 62 61 73 65 0d 0a 20 20 20  ed database..   
d990: 20 20 20 23 20 20 20 20 20 20 20 63 6f 6e 6e 65     #       conne
d9a0: 63 74 69 6f 6e 20 6e 6f 77 20 75 6e 6c 65 73 73  ction now unless
d9b0: 20 6f 75 72 20 63 61 6c 6c 65 72 20 66 6f 72 62   our caller forb
d9c0: 69 64 73 20 69 74 2e 0d 0a 20 20 20 20 20 20 23  ids it...      #
d9d0: 0d 0a 20 20 20 20 20 20 69 66 20 7b 24 74 65 6d  ..      if {$tem
d9e0: 70 6f 72 61 72 79 20 26 26 20 21 5b 69 6e 66 6f  porary && ![info
d9f0: 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 73 65 74   exists ::no(set
da00: 54 65 6d 70 6f 72 61 72 79 44 69 72 65 63 74 6f  TemporaryDirecto
da10: 72 79 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ry)]} then {..  
da20: 20 20 20 20 20 20 73 71 6c 20 65 78 65 63 75 74        sql execut
da30: 65 20 24 64 62 20 5b 61 70 70 65 6e 64 41 72 67  e $db [appendArg
da40: 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
da50: 20 22 50 52 41 47 4d 41 20 74 65 6d 70 5f 73 74   "PRAGMA temp_st
da60: 6f 72 65 5f 64 69 72 65 63 74 6f 72 79 20 3d 20  ore_directory = 
da70: 5c 22 22 20 5b 67 65 74 54 65 6d 70 6f 72 61 72  \"" [getTemporar
da80: 79 44 69 72 65 63 74 6f 72 79 5d 20 5c 22 5c 3b  yDirectory] \"\;
da90: 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  ]..      }....  
daa0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
dab0: 4f 54 45 3a 20 41 6c 77 61 79 73 20 72 65 74 75  OTE: Always retu
dac0: 72 6e 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  rn the connectio
dad0: 6e 20 68 61 6e 64 6c 65 20 75 70 6f 6e 20 73 75  n handle upon su
dae0: 63 63 65 73 73 2e 0d 0a 20 20 20 20 20 20 23 0d  ccess...      #.
daf0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 64  .      return $d
db00: 62 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  b..    }.....   
db10: 20 70 72 6f 63 20 67 65 74 44 62 43 6f 6e 6e 65   proc getDbConne
db20: 63 74 69 6f 6e 20 7b 20 7b 76 61 72 4e 61 6d 65  ction { {varName
db30: 20 64 62 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20   db} } {..      
db40: 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
db50: 20 52 65 66 65 72 20 74 6f 20 74 68 65 20 73 70   Refer to the sp
db60: 65 63 69 66 69 65 64 20 76 61 72 69 61 62 6c 65  ecified variable
db70: 20 28 65 2e 67 2e 20 22 64 62 22 29 20 69 6e 20   (e.g. "db") in 
db80: 74 68 65 20 63 6f 6e 74 65 78 74 20 6f 66 20 6f  the context of o
db90: 75 72 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  ur..      #     
dba0: 20 20 63 61 6c 6c 65 72 2e 20 20 54 68 65 20 68    caller.  The h
dbb0: 61 6e 64 6c 65 20 74 6f 20 74 68 65 20 64 61 74  andle to the dat
dbc0: 61 62 61 73 65 20 70 72 65 76 69 6f 75 73 6c 79  abase previously
dbd0: 20 6f 70 65 6e 65 64 20 76 69 61 20 74 68 65 0d   opened via the.
dbe0: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 5b  .      #       [
dbf0: 73 65 74 75 70 44 62 5d 20 70 72 6f 63 65 64 75  setupDb] procedu
dc00: 72 65 20 73 68 6f 75 6c 64 20 62 65 20 73 74 6f  re should be sto
dc10: 72 65 64 20 74 68 65 72 65 2e 0d 0a 20 20 20 20  red there...    
dc20: 20 20 23 0d 0a 20 20 20 20 20 20 75 70 76 61 72    #..      upvar
dc30: 20 31 20 24 76 61 72 4e 61 6d 65 20 64 62 0d 0a   1 $varName db..
dc40: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
dc50: 20 23 20 4e 4f 54 45 3a 20 54 68 69 73 20 72 65   # NOTE: This re
dc60: 74 75 72 6e 73 20 74 68 65 20 41 44 4f 2e 4e 45  turns the ADO.NE
dc70: 54 20 49 44 62 43 6f 6e 6e 65 63 74 69 6f 6e 20  T IDbConnection 
dc80: 6f 62 6a 65 63 74 20 69 6e 73 74 61 6e 63 65 20  object instance 
dc90: 66 6f 72 20 74 68 65 0d 0a 20 20 20 20 20 20 23  for the..      #
dca0: 20 20 20 20 20 20 20 73 70 65 63 69 66 69 65 64         specified
dcb0: 20 64 61 74 61 62 73 65 20 68 61 6e 64 6c 65 2e   databse handle.
dcc0: 20 20 53 69 6e 63 65 20 67 65 74 74 69 6e 67 20    Since getting 
dcd0: 74 68 69 73 20 6f 62 6a 65 63 74 20 72 65 6c 69  this object reli
dce0: 65 73 20 75 70 6f 6e 0d 0a 20 20 20 20 20 20 23  es upon..      #
dcf0: 20 20 20 20 20 20 20 45 61 67 6c 65 20 69 6e 74         Eagle int
dd00: 65 72 6e 61 6c 73 2c 20 67 72 65 61 74 20 63 61  ernals, great ca
dd10: 72 65 20 73 68 6f 75 6c 64 20 62 65 20 74 61 6b  re should be tak
dd20: 65 6e 20 74 6f 20 61 76 6f 69 64 20 64 69 73 70  en to avoid disp
dd30: 6f 73 69 6e 67 20 6f 66 0d 0a 20 20 20 20 20 20  osing of..      
dd40: 23 20 20 20 20 20 20 20 74 68 69 73 20 6f 62 6a  #       this obj
dd50: 65 63 74 20 6f 72 20 6f 74 68 65 72 77 69 73 65  ect or otherwise
dd60: 20 70 75 74 74 69 6e 67 20 69 74 20 69 6e 74 6f   putting it into
dd70: 20 61 6e 20 69 6e 76 61 6c 69 64 20 73 74 61 74   an invalid stat
dd80: 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  e...      #..   
dd90: 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69     if {[info exi
dda0: 73 74 73 20 64 62 5d 7d 20 74 68 65 6e 20 7b 0d  sts db]} then {.
ddb0: 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61  .        if {[ca
ddc0: 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  tch {..         
ddd0: 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e         object in
dde0: 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e  voke -flags +Non
ddf0: 50 75 62 6c 69 63 20 2d 6f 62 6a 65 63 74 66 6c  Public -objectfl
de00: 61 67 73 20 2b 4e 6f 44 69 73 70 6f 73 65 20 5c  ags +NoDispose \
de10: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
de20: 20 20 2d 61 6c 69 61 73 20 49 6e 74 65 72 70 72    -alias Interpr
de30: 65 74 65 72 2e 47 65 74 41 63 74 69 76 65 2e 63  eter.GetActive.c
de40: 6f 6e 6e 65 63 74 69 6f 6e 73 20 49 74 65 6d 20  onnections Item 
de50: 24 64 62 7d 20 5c 0d 0a 20 20 20 20 20 20 20 20  $db} \..        
de60: 20 20 20 20 20 20 20 20 72 65 73 75 6c 74 5d 20          result] 
de70: 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  == 0} then {..  
de80: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
de90: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 75 63       # NOTE: Suc
dea0: 63 65 73 73 2c 20 72 65 74 75 72 6e 20 74 68 65  cess, return the
deb0: 20 6f 70 61 71 75 65 20 6f 62 6a 65 63 74 20 68   opaque object h
dec0: 61 6e 64 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20  andle...        
ded0: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 72    #..          r
dee0: 65 74 75 72 6e 20 24 72 65 73 75 6c 74 0d 0a 20  eturn $result.. 
def0: 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d         } else {.
df00: 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
df10: 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
df20: 46 61 69 6c 75 72 65 2c 20 72 65 70 6f 72 74 20  Failure, report 
df30: 77 68 79 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  why...          
df40: 23 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70 75  #..          tpu
df50: 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
df60: 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
df70: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
df80: 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66  "==== WARNING: f
df90: 61 69 6c 65 64 20 74 6f 20 67 65 74 20 63 6f 6e  ailed to get con
dfa0: 6e 65 63 74 69 6f 6e 20 68 61 6e 64 6c 65 20 66  nection handle f
dfb0: 6f 72 20 64 61 74 61 62 61 73 65 20 5c 22 22 20  or database \"" 
dfc0: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
dfd0: 20 24 64 62 20 22 5c 22 2c 20 65 72 72 6f 72 3a   $db "\", error:
dfe0: 20 22 20 5c 6e 5c 74 20 24 72 65 73 75 6c 74 20   " \n\t $result 
dff0: 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  \n]..        }..
e000: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a        }..    }..
e010: 0c 0d 0a 20 20 20 20 70 72 6f 63 20 66 72 65 65  ...    proc free
e020: 44 62 43 6f 6e 6e 65 63 74 69 6f 6e 20 7b 20 7b  DbConnection { {
e030: 76 61 72 4e 61 6d 65 20 63 6f 6e 6e 65 63 74 69  varName connecti
e040: 6f 6e 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23  on} } {..      #
e050: 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
e060: 52 65 66 65 72 20 74 6f 20 74 68 65 20 73 70 65  Refer to the spe
e070: 63 69 66 69 65 64 20 76 61 72 69 61 62 6c 65 20  cified variable 
e080: 28 65 2e 67 2e 20 22 63 6f 6e 6e 65 63 74 69 6f  (e.g. "connectio
e090: 6e 22 29 20 69 6e 20 74 68 65 0d 0a 20 20 20 20  n") in the..    
e0a0: 20 20 23 20 20 20 20 20 20 20 63 6f 6e 74 65 78    #       contex
e0b0: 74 20 6f 66 20 6f 75 72 20 63 61 6c 6c 65 72 2e  t of our caller.
e0c0: 20 20 54 68 65 20 6f 70 61 71 75 65 20 6f 62 6a    The opaque obj
e0d0: 65 63 74 20 68 61 6e 64 6c 65 20 66 6f 72 20 61  ect handle for a
e0e0: 6e 20 41 44 4f 2e 4e 45 54 0d 0a 20 20 20 20 20  n ADO.NET..     
e0f0: 20 23 20 20 20 20 20 20 20 63 6f 6e 6e 65 63 74   #       connect
e100: 69 6f 6e 20 70 72 65 76 69 6f 75 73 6c 79 20 72  ion previously r
e110: 65 74 75 72 6e 65 64 20 62 79 20 5b 67 65 74 44  eturned by [getD
e120: 62 43 6f 6e 6e 65 63 74 69 6f 6e 5d 20 73 68 6f  bConnection] sho
e130: 75 6c 64 20 62 65 0d 0a 20 20 20 20 20 20 23 20  uld be..      # 
e140: 20 20 20 20 20 20 73 74 6f 72 65 64 20 74 68 65        stored the
e150: 72 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  re...      #..  
e160: 20 20 20 20 75 70 76 61 72 20 31 20 24 76 61 72      upvar 1 $var
e170: 4e 61 6d 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0d  Name connection.
e180: 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
e190: 20 20 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70    # NOTE: Attemp
e1a0: 74 20 74 6f 20 72 65 6d 6f 76 65 20 74 68 65 20  t to remove the 
e1b0: 6f 70 61 71 75 65 20 6f 62 6a 65 63 74 20 68 61  opaque object ha
e1c0: 6e 64 6c 65 20 66 72 6f 6d 20 74 68 65 20 69 6e  ndle from the in
e1d0: 74 65 72 70 72 65 74 65 72 0d 0a 20 20 20 20 20  terpreter..     
e1e0: 20 23 20 20 20 20 20 20 20 6e 6f 77 2e 20 20 54   #       now.  T
e1f0: 68 69 73 20 5b 6f 62 6a 65 63 74 20 64 69 73 70  his [object disp
e200: 6f 73 65 5d 20 63 61 6c 6c 20 77 69 6c 6c 20 6e  ose] call will n
e210: 6f 74 20 61 63 74 75 61 6c 6c 79 20 64 69 73 70  ot actually disp
e220: 6f 73 65 20 6f 66 20 74 68 65 0d 0a 20 20 20 20  ose of the..    
e230: 20 20 23 20 20 20 20 20 20 20 75 6e 64 65 72 6c    #       underl
e240: 79 69 6e 67 20 6f 62 6a 65 63 74 20 62 65 63 61  ying object beca
e250: 75 73 65 20 74 68 65 20 2b 4e 6f 44 69 73 70 6f  use the +NoDispo
e260: 73 65 20 66 6c 61 67 20 77 61 73 20 73 65 74 20  se flag was set 
e270: 6f 6e 20 69 74 0d 0a 20 20 20 20 20 20 23 20 20  on it..      #  
e280: 20 20 20 20 20 64 75 72 69 6e 67 20 63 72 65 61       during crea
e290: 74 69 6f 6e 20 6f 66 20 74 68 65 20 6f 70 61 71  tion of the opaq
e2a0: 75 65 20 6f 62 6a 65 63 74 20 68 61 6e 64 6c 65  ue object handle
e2b0: 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
e2c0: 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73    if {[info exis
e2d0: 74 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 5d 20 26  ts connection] &
e2e0: 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b  & \..          [
e2f0: 63 61 74 63 68 20 7b 6f 62 6a 65 63 74 20 64 69  catch {object di
e300: 73 70 6f 73 65 20 24 63 6f 6e 6e 65 63 74 69 6f  spose $connectio
e310: 6e 7d 20 65 72 72 6f 72 5d 7d 20 74 68 65 6e 20  n} error]} then 
e320: 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
e330: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 57 65        # NOTE: We
e340: 20 73 6f 6d 65 68 6f 77 20 66 61 69 6c 65 64 20   somehow failed 
e350: 74 6f 20 72 65 6d 6f 76 65 20 74 68 65 20 68 61  to remove the ha
e360: 6e 64 6c 65 2c 20 72 65 70 6f 72 74 20 77 68 79  ndle, report why
e370: 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
e380: 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
e390: 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70  est_channel [app
e3a0: 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
e3b0: 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52         "==== WAR
e3c0: 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20 74 6f 20  NING: failed to 
e3d0: 72 65 6d 6f 76 65 20 63 6f 6e 6e 65 63 74 69 6f  remove connectio
e3e0: 6e 20 68 61 6e 64 6c 65 20 5c 22 22 20 24 63 6f  n handle \"" $co
e3f0: 6e 6e 65 63 74 69 6f 6e 20 5c 0d 0a 20 20 20 20  nnection \..    
e400: 20 20 20 20 20 20 20 20 22 5c 22 2c 20 65 72 72          "\", err
e410: 6f 72 3a 20 22 20 5c 6e 5c 74 20 24 65 72 72 6f  or: " \n\t $erro
e420: 72 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a  r \n]..      }..
e430: 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
e440: 6f 63 20 61 64 64 44 62 43 6f 6e 6e 65 63 74 69  oc addDbConnecti
e450: 6f 6e 20 7b 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  on { connection 
e460: 7b 76 61 72 4e 61 6d 65 20 64 62 7d 20 7d 20 7b  {varName db} } {
e470: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
e480: 20 23 20 4e 4f 54 45 3a 20 52 65 66 65 72 20 74   # NOTE: Refer t
e490: 6f 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  o the specified 
e4a0: 76 61 72 69 61 62 6c 65 20 28 65 2e 67 2e 20 22  variable (e.g. "
e4b0: 64 62 22 29 20 69 6e 20 74 68 65 20 63 6f 6e 74  db") in the cont
e4c0: 65 78 74 20 6f 66 20 6f 75 72 0d 0a 20 20 20 20  ext of our..    
e4d0: 20 20 23 20 20 20 20 20 20 20 63 61 6c 6c 65 72    #       caller
e4e0: 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
e4f0: 20 20 75 70 76 61 72 20 31 20 24 76 61 72 4e 61    upvar 1 $varNa
e500: 6d 65 20 64 62 0d 0a 0d 0a 20 20 20 20 20 20 23  me db....      #
e510: 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
e520: 43 72 65 61 74 65 20 61 20 63 6f 72 72 65 63 74  Create a correct
e530: 6c 79 20 66 6f 72 6d 61 74 74 65 64 20 6e 61 6d  ly formatted nam
e540: 65 20 66 6f 72 20 74 68 65 20 64 61 74 61 62 61  e for the databa
e550: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f  se connection to
e560: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
e570: 62 65 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  be added to the 
e580: 6c 69 73 74 20 6d 61 6e 61 67 65 64 20 62 79 20  list managed by 
e590: 74 68 65 20 45 61 67 6c 65 20 69 6e 74 65 72 70  the Eagle interp
e5a0: 72 65 74 65 72 2e 0d 0a 20 20 20 20 20 20 23 0d  reter...      #.
e5b0: 0a 20 20 20 20 20 20 73 65 74 20 64 62 20 5b 6f  .      set db [o
e5c0: 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c  bject invoke -fl
e5d0: 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c  ags +NonPublic \
e5e0: 0d 0a 20 20 20 20 20 20 20 20 20 20 45 61 67 6c  ..          Eagl
e5f0: 65 2e 5f 43 6f 6d 70 6f 6e 65 6e 74 73 2e 50 72  e._Components.Pr
e600: 69 76 61 74 65 2e 46 6f 72 6d 61 74 4f 70 73 20  ivate.FormatOps 
e610: 44 61 74 61 62 61 73 65 4f 62 6a 65 63 74 4e 61  DatabaseObjectNa
e620: 6d 65 20 24 63 6f 6e 6e 65 63 74 69 6f 6e 20 5c  me $connection \
e630: 0d 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c 69  ..          SQLi
e640: 74 65 43 6f 6e 6e 65 63 74 69 6f 6e 20 5b 6f 62  teConnection [ob
e650: 6a 65 63 74 20 69 6e 76 6f 6b 65 20 49 6e 74 65  ject invoke Inte
e660: 72 70 72 65 74 65 72 2e 47 65 74 41 63 74 69 76  rpreter.GetActiv
e670: 65 20 4e 65 78 74 49 64 5d 5d 0d 0a 0d 0a 20 20  e NextId]]....  
e680: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
e690: 4f 54 45 3a 20 41 64 64 20 74 68 65 20 64 61 74  OTE: Add the dat
e6a0: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
e6b0: 20 70 72 6f 76 69 64 65 64 20 62 79 20 6f 75 72   provided by our
e6c0: 20 63 61 6c 6c 65 72 20 74 6f 20 74 68 65 20 6c   caller to the l
e6d0: 69 73 74 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ist..      #    
e6e0: 20 20 20 6f 66 20 74 68 6f 73 65 20 6b 6e 6f 77     of those know
e6f0: 6e 20 74 6f 20 74 68 65 20 45 61 67 6c 65 20 69  n to the Eagle i
e700: 6e 74 65 72 70 72 65 74 65 72 2e 0d 0a 20 20 20  nterpreter...   
e710: 20 20 20 23 0d 0a 20 20 20 20 20 20 6f 62 6a 65     #..      obje
e720: 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73  ct invoke -flags
e730: 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 49 6e 74 65   +NonPublic Inte
e740: 72 70 72 65 74 65 72 2e 47 65 74 41 63 74 69 76  rpreter.GetActiv
e750: 65 2e 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 41 64  e.connections Ad
e760: 64 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 24  d \..          $
e770: 64 62 20 24 63 6f 6e 6e 65 63 74 69 6f 6e 0d 0a  db $connection..
e780: 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
e790: 6f 63 20 63 6c 65 61 6e 75 70 44 62 20 7b 20 66  oc cleanupDb { f
e7a0: 69 6c 65 4e 61 6d 65 20 7b 76 61 72 4e 61 6d 65  ileName {varName
e7b0: 20 64 62 7d 20 7b 63 6f 6c 6c 65 63 74 20 74 72   db} {collect tr
e7c0: 75 65 7d 20 7b 71 75 61 6c 69 66 79 20 74 72 75  ue} {qualify tru
e7d0: 65 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  e}..            
e7e0: 20 20 20 20 20 20 20 20 20 7b 64 65 6c 65 74 65           {delete
e7f0: 20 74 72 75 65 7d 20 7d 20 7b 0d 0a 20 20 20 20   true} } {..    
e800: 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
e810: 45 3a 20 41 74 74 65 6d 70 74 20 74 6f 20 66 6f  E: Attempt to fo
e820: 72 63 65 20 61 6c 6c 20 70 65 6e 64 69 6e 67 20  rce all pending 
e830: 22 67 61 72 62 61 67 65 22 20 6f 62 6a 65 63 74  "garbage" object
e840: 73 20 74 6f 20 62 65 20 63 6f 6c 6c 65 63 74 65  s to be collecte
e850: 64 2c 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  d,..      #     
e860: 20 20 69 6e 63 6c 75 64 69 6e 67 20 53 51 4c 69    including SQLi
e870: 74 65 20 73 74 61 74 65 6d 65 6e 74 73 20 61 6e  te statements an
e880: 64 20 62 61 63 6b 75 70 20 6f 62 6a 65 63 74 73  d backup objects
e890: 3b 20 74 68 69 73 20 73 68 6f 75 6c 64 20 61 6c  ; this should al
e8a0: 6c 6f 77 0d 0a 20 20 20 20 20 20 23 20 20 20 20  low..      #    
e8b0: 20 20 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e     the underlyin
e8c0: 67 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  g database file 
e8d0: 74 6f 20 62 65 20 64 65 6c 65 74 65 64 2e 0d 0a  to be deleted...
e8e0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69        #..      i
e8f0: 66 20 7b 24 63 6f 6c 6c 65 63 74 7d 20 74 68 65  f {$collect} the
e900: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 63 6f 6c  n {..        col
e910: 6c 65 63 74 47 61 72 62 61 67 65 20 24 3a 3a 74  lectGarbage $::t
e920: 65 73 74 5f 63 68 61 6e 6e 65 6c 0d 0a 20 20 20  est_channel..   
e930: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d     }....      #.
e940: 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 52  .      # NOTE: R
e950: 65 66 65 72 20 74 6f 20 74 68 65 20 73 70 65 63  efer to the spec
e960: 69 66 69 65 64 20 76 61 72 69 61 62 6c 65 20 28  ified variable (
e970: 65 2e 67 2e 20 22 64 62 22 29 20 69 6e 20 74 68  e.g. "db") in th
e980: 65 20 63 6f 6e 74 65 78 74 20 6f 66 20 6f 75 72  e context of our
e990: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
e9a0: 63 61 6c 6c 65 72 2e 20 20 54 68 65 20 68 61 6e  caller.  The han
e9b0: 64 6c 65 20 74 6f 20 74 68 65 20 64 61 74 61 62  dle to the datab
e9c0: 61 73 65 20 70 72 65 76 69 6f 75 73 6c 79 20 6f  ase previously o
e9d0: 70 65 6e 65 64 20 76 69 61 20 74 68 65 0d 0a 20  pened via the.. 
e9e0: 20 20 20 20 20 23 20 20 20 20 20 20 20 5b 73 65       #       [se
e9f0: 74 75 70 44 62 5d 20 70 72 6f 63 65 64 75 72 65  tupDb] procedure
ea00: 20 73 68 6f 75 6c 64 20 62 65 20 73 74 6f 72 65   should be store
ea10: 64 20 74 68 65 72 65 2e 0d 0a 20 20 20 20 20 20  d there...      
ea20: 23 0d 0a 20 20 20 20 20 20 75 70 76 61 72 20 31  #..      upvar 1
ea30: 20 24 76 61 72 4e 61 6d 65 20 64 62 0d 0a 0d 0a   $varName db....
ea40: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
ea50: 20 4e 4f 54 45 3a 20 43 6c 6f 73 65 20 74 68 65   NOTE: Close the
ea60: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 74   connection to t
ea70: 68 65 20 64 61 74 61 62 61 73 65 20 6e 6f 77 2e  he database now.
ea80: 20 20 54 68 69 73 20 73 68 6f 75 6c 64 20 61 6c    This should al
ea90: 6c 6f 77 20 75 73 0d 0a 20 20 20 20 20 20 23 20  low us..      # 
eaa0: 20 20 20 20 20 20 74 6f 20 64 65 6c 65 74 65 20        to delete 
eab0: 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 64  the underlying d
eac0: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0d 0a 20  atabase file... 
ead0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66       #..      if
eae0: 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 64   {[info exists d
eaf0: 62 5d 20 26 26 20 5b 63 61 74 63 68 20 7b 73 71  b] && [catch {sq
eb00: 6c 20 63 6c 6f 73 65 20 24 64 62 7d 20 65 72 72  l close $db} err
eb10: 6f 72 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  or]} then {..   
eb20: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
eb30: 23 20 4e 4f 54 45 3a 20 57 65 20 73 6f 6d 65 68  # NOTE: We someh
eb40: 6f 77 20 66 61 69 6c 65 64 20 74 6f 20 63 6c 6f  ow failed to clo
eb50: 73 65 20 74 68 65 20 64 61 74 61 62 61 73 65 2c  se the database,
eb60: 20 72 65 70 6f 72 74 20 77 68 79 2e 0d 0a 20 20   report why...  
eb70: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
eb80: 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
eb90: 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
eba0: 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
ebb0: 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a    "==== WARNING:
ebc0: 20 66 61 69 6c 65 64 20 74 6f 20 63 6c 6f 73 65   failed to close
ebd0: 20 64 61 74 61 62 61 73 65 20 5c 22 22 20 24 64   database \"" $d
ebe0: 62 20 22 5c 22 2c 20 65 72 72 6f 72 3a 20 22 20  b "\", error: " 
ebf0: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5c  \..            \
ec00: 6e 5c 74 20 24 65 72 72 6f 72 20 5c 6e 5d 0d 0a  n\t $error \n]..
ec10: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
ec20: 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
ec30: 3a 20 46 69 72 73 74 2c 20 73 65 65 20 69 66 20  : First, see if 
ec40: 6f 75 72 20 63 61 6c 6c 65 72 20 68 61 73 20 72  our caller has r
ec50: 65 71 75 65 73 74 65 64 20 61 6e 20 69 6e 2d 6d  equested an in-m
ec60: 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e 0d  emory database..
ec70: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
ec80: 73 65 74 20 69 73 4d 65 6d 6f 72 79 20 5b 69 73  set isMemory [is
ec90: 4d 65 6d 6f 72 79 44 62 20 24 66 69 6c 65 4e 61  MemoryDb $fileNa
eca0: 6d 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a  me]....      #..
ecb0: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 42 75        # NOTE: Bu
ecc0: 69 6c 64 20 74 68 65 20 66 75 6c 6c 20 70 61 74  ild the full pat
ecd0: 68 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  h to the databas
ece0: 65 20 66 69 6c 65 20 6e 61 6d 65 2e 20 20 46 6f  e file name.  Fo
ecf0: 72 20 6e 6f 77 2c 20 61 6c 6c 20 74 65 73 74 0d  r now, all test.
ed00: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 64  .      #       d
ed10: 61 74 61 62 61 73 65 20 66 69 6c 65 73 20 61 72  atabase files ar
ed20: 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  e stored in the 
ed30: 74 65 6d 70 6f 72 61 72 79 20 64 69 72 65 63 74  temporary direct
ed40: 6f 72 79 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ory...      #.. 
ed50: 20 20 20 20 20 69 66 20 7b 21 24 69 73 4d 65 6d       if {!$isMem
ed60: 6f 72 79 20 26 26 20 24 71 75 61 6c 69 66 79 7d  ory && $qualify}
ed70: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
ed80: 20 73 65 74 20 66 69 6c 65 4e 61 6d 65 20 5b 66   set fileName [f
ed90: 69 6c 65 20 6a 6f 69 6e 20 5b 67 65 74 44 61 74  ile join [getDat
eda0: 61 62 61 73 65 44 69 72 65 63 74 6f 72 79 5d 20  abaseDirectory] 
edb0: 5b 66 69 6c 65 20 74 61 69 6c 20 24 66 69 6c 65  [file tail $file
edc0: 4e 61 6d 65 5d 5d 0d 0a 20 20 20 20 20 20 7d 0d  Name]]..      }.
edd0: 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
ede0: 20 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20    # NOTE: Check 
edf0: 69 66 20 74 68 65 20 66 69 6c 65 20 73 74 69 6c  if the file stil
ee00: 6c 20 65 78 69 73 74 73 2e 0d 0a 20 20 20 20 20  l exists...     
ee10: 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 21 24   #..      if {!$
ee20: 69 73 4d 65 6d 6f 72 79 20 26 26 20 24 64 65 6c  isMemory && $del
ee30: 65 74 65 20 26 26 20 5b 66 69 6c 65 20 65 78 69  ete && [file exi
ee40: 73 74 73 20 24 66 69 6c 65 4e 61 6d 65 5d 7d 20  sts $fileName]} 
ee50: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
ee60: 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
ee70: 45 3a 20 53 6b 69 70 20 64 65 6c 65 74 69 6e 67  E: Skip deleting
ee80: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 20   database files 
ee90: 69 66 20 73 6f 6d 65 62 6f 64 79 20 73 65 74 73  if somebody sets
eea0: 20 74 68 65 20 67 6c 6f 62 61 6c 0d 0a 20 20 20   the global..   
eeb0: 20 20 20 20 20 23 20 20 20 20 20 20 20 76 61 72       #       var
eec0: 69 61 62 6c 65 20 74 6f 20 70 72 65 76 65 6e 74  iable to prevent
eed0: 20 69 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d   it...        #.
eee0: 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69  .        if {![i
eef0: 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28  nfo exists ::no(
ef00: 63 6c 65 61 6e 75 70 44 62 46 69 6c 65 29 5d 7d  cleanupDbFile)]}
ef10: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
ef20: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
ef30: 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74 20  # NOTE: Attempt 
ef40: 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20 74 65  to delete the te
ef50: 73 74 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  st database file
ef60: 20 6e 6f 77 2e 0d 0a 20 20 20 20 20 20 20 20 20   now...         
ef70: 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66   #..          if
ef80: 20 7b 5b 73 65 74 20 63 6f 64 65 20 5b 63 61 74   {[set code [cat
ef90: 63 68 20 7b 66 69 6c 65 20 64 65 6c 65 74 65 20  ch {file delete 
efa0: 24 66 69 6c 65 4e 61 6d 65 7d 20 65 72 72 6f 72  $fileName} error
efb0: 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  ]]} then {..    
efc0: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
efd0: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 57         # NOTE: W
efe0: 65 20 73 6f 6d 65 68 6f 77 20 66 61 69 6c 65 64  e somehow failed
eff0: 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20 66   to delete the f
f000: 69 6c 65 2c 20 72 65 70 6f 72 74 20 77 68 79 2e  ile, report why.
f010: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 0d  ..            #.
f020: 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75  .            tpu
f030: 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
f040: 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
f050: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
f060: 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a    "==== WARNING:
f070: 20 66 61 69 6c 65 64 20 74 6f 20 64 65 6c 65 74   failed to delet
f080: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
f090: 5c 22 22 20 24 66 69 6c 65 4e 61 6d 65 20 5c 0d  \"" $fileName \.
f0a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
f0b0: 20 22 5c 22 20 64 75 72 69 6e 67 20 63 6c 65 61   "\" during clea
f0c0: 6e 75 70 2c 20 65 72 72 6f 72 3a 20 22 20 5c 6e  nup, error: " \n
f0d0: 5c 74 20 24 65 72 72 6f 72 20 5c 6e 5d 0d 0a 20  \t $error \n].. 
f0e0: 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
f0f0: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
f100: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
f110: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 68 6f       # NOTE: Sho
f120: 77 20 74 68 61 74 20 77 65 20 73 6b 69 70 70 65  w that we skippe
f130: 64 20 64 65 6c 65 74 69 6e 67 20 74 68 65 20 66  d deleting the f
f140: 69 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  ile...          
f150: 23 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74  #..          set
f160: 20 63 6f 64 65 20 30 0d 0a 0d 0a 20 20 20 20 20   code 0....     
f170: 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
f180: 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
f190: 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
f1a0: 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41          "==== WA
f1b0: 52 4e 49 4e 47 3a 20 73 6b 69 70 70 65 64 20 64  RNING: skipped d
f1c0: 65 6c 65 74 69 6e 67 20 64 61 74 61 62 61 73 65  eleting database
f1d0: 20 66 69 6c 65 20 5c 22 22 20 24 66 69 6c 65 4e   file \"" $fileN
f1e0: 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ame \..         
f1f0: 20 20 20 20 20 22 5c 22 20 64 75 72 69 6e 67 20       "\" during 
f200: 63 6c 65 61 6e 75 70 5c 6e 22 5d 0d 0a 20 20 20  cleanup\n"]..   
f210: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 20       }..      } 
f220: 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
f230: 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
f240: 45 3a 20 54 68 65 20 66 69 6c 65 20 64 6f 65 73  E: The file does
f250: 20 6e 6f 74 20 65 78 69 73 74 2c 20 73 75 63 63   not exist, succ
f260: 65 73 73 21 0d 0a 20 20 20 20 20 20 20 20 23 0d  ess!..        #.
f270: 0a 20 20 20 20 20 20 20 20 73 65 74 20 63 6f 64  .        set cod
f280: 65 20 30 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a  e 0..      }....
f290: 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 63 6f        return $co
f2a0: 64 65 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20  de..    }.....  
f2b0: 20 20 70 72 6f 63 20 73 65 74 75 70 44 62 49 6e    proc setupDbIn
f2c0: 74 65 72 72 75 70 74 43 61 6c 6c 62 61 63 6b 20  terruptCallback 
f2d0: 7b 20 63 68 61 6e 6e 65 6c 20 6c 6f 67 20 7d 20  { channel log } 
f2e0: 7b 0d 0a 20 20 20 20 20 20 74 70 75 74 73 20 24  {..      tputs $
f2f0: 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 73 65  channel "---- se
f300: 74 74 69 6e 67 20 75 70 20 64 65 62 75 67 67 65  tting up debugge
f310: 72 20 69 6e 74 65 72 72 75 70 74 20 63 61 6c 6c  r interrupt call
f320: 62 61 63 6b 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20  back... "....   
f330: 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d     if {[catch {.
f340: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
f350: 20 20 20 20 23 20 4e 4f 54 45 3a 20 4d 61 6b 65      # NOTE: Make
f360: 20 73 75 72 65 20 74 68 65 20 73 63 72 69 70 74   sure the script
f370: 20 64 65 62 75 67 67 65 72 20 61 6e 64 20 74 68   debugger and th
f380: 65 20 69 73 6f 6c 61 74 65 64 20 69 6e 74 65 72  e isolated inter
f390: 70 72 65 74 65 72 20 61 72 65 0d 0a 20 20 20 20  preter are..    
f3a0: 20 20 20 20 23 20 20 20 20 20 20 20 73 65 74 75      #       setu
f3b0: 70 20 61 6e 64 20 72 65 61 64 79 20 66 6f 72 20  p and ready for 
f3c0: 75 73 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  use...        #.
f3d0: 0a 20 20 20 20 20 20 20 20 64 65 62 75 67 20 73  .        debug s
f3e0: 65 74 75 70 20 74 72 75 65 20 74 72 75 65 0d 0a  etup true true..
f3f0: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
f400: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4c 6f 61       # NOTE: Loa
f410: 64 20 74 68 65 20 6e 65 63 65 73 73 61 72 79 20  d the necessary 
f420: 70 61 63 6b 61 67 65 73 20 69 6e 74 6f 20 74 68  packages into th
f430: 65 20 69 73 6f 6c 61 74 65 64 20 69 6e 74 65 72  e isolated inter
f440: 70 72 65 74 65 72 2e 0d 0a 20 20 20 20 20 20 20  preter...       
f450: 20 23 0d 0a 20 20 20 20 20 20 20 20 64 65 62 75   #..        debu
f460: 67 20 65 76 61 6c 20 7b 0d 0a 20 20 20 20 20 20  g eval {..      
f470: 20 20 20 20 70 61 63 6b 61 67 65 20 72 65 71 75      package requ
f480: 69 72 65 20 45 61 67 6c 65 0d 0a 20 20 20 20 20  ire Eagle..     
f490: 20 20 20 20 20 70 61 63 6b 61 67 65 20 72 65 71       package req
f4a0: 75 69 72 65 20 45 61 67 6c 65 2e 4c 69 62 72 61  uire Eagle.Libra
f4b0: 72 79 0d 0a 20 20 20 20 20 20 20 20 20 20 70 61  ry..          pa
f4c0: 63 6b 61 67 65 20 72 65 71 75 69 72 65 20 45 61  ckage require Ea
f4d0: 67 6c 65 2e 54 65 73 74 0d 0a 20 20 20 20 20 20  gle.Test..      
f4e0: 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23    }....        #
f4f0: 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
f500: 3a 20 43 6f 70 79 20 74 68 65 20 6e 65 63 65 73  : Copy the neces
f510: 73 61 72 79 20 76 61 72 69 61 62 6c 65 73 20 69  sary variables i
f520: 6e 74 6f 20 74 68 65 20 69 73 6f 6c 61 74 65 64  nto the isolated
f530: 20 69 6e 74 65 72 70 72 65 74 65 72 2e 0d 0a 20   interpreter... 
f540: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
f550: 20 20 64 65 62 75 67 20 69 6e 76 6f 6b 65 20 30    debug invoke 0
f560: 20 73 65 74 20 3a 3a 74 65 73 74 5f 63 68 61 6e   set ::test_chan
f570: 6e 65 6c 20 24 63 68 61 6e 6e 65 6c 3b 20 23 20  nel $channel; # 
f580: 4e 4f 54 45 3a 20 46 6f 72 20 5b 74 70 75 74 73  NOTE: For [tputs
f590: 5d 2e 0d 0a 20 20 20 20 20 20 20 20 64 65 62 75  ]...        debu
f5a0: 67 20 69 6e 76 6f 6b 65 20 30 20 73 65 74 20 3a  g invoke 0 set :
f5b0: 3a 74 65 73 74 5f 6c 6f 67 20 24 6c 6f 67 3b 20  :test_log $log; 
f5c0: 23 20 4e 4f 54 45 3a 20 46 6f 72 20 5b 74 6c 6f  # NOTE: For [tlo
f5d0: 67 5d 2e 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23  g].....        #
f5e0: 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
f5f0: 3a 20 49 6e 73 74 61 6c 6c 20 74 68 65 20 63 61  : Install the ca
f600: 6c 6c 62 61 63 6b 20 73 63 72 69 70 74 20 74 6f  llback script to
f610: 20 62 65 20 65 76 61 6c 75 61 74 65 64 20 69 6e   be evaluated in
f620: 20 74 68 65 20 69 73 6f 6c 61 74 65 64 0d 0a 20   the isolated.. 
f630: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 69         #       i
f640: 6e 74 65 72 70 72 65 74 65 72 20 77 68 65 6e 20  nterpreter when 
f650: 74 68 69 73 20 69 6e 74 65 72 70 72 65 74 65 72  this interpreter
f660: 20 69 73 20 69 6e 74 65 72 72 75 70 74 65 64 20   is interrupted 
f670: 62 79 20 73 63 72 69 70 74 0d 0a 20 20 20 20 20  by script..     
f680: 20 20 20 23 20 20 20 20 20 20 20 63 61 6e 63 65     #       cance
f690: 6c 6c 61 74 69 6f 6e 2c 20 65 74 63 2e 0d 0a 20  llation, etc... 
f6a0: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
f6b0: 20 20 64 65 62 75 67 20 63 61 6c 6c 62 61 63 6b    debug callback
f6c0: 20 61 70 70 6c 79 20 7b 7b 73 65 6e 64 65 72 20   apply {{sender 
f6d0: 65 7d 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  e} {..          
f6e0: 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e  #..          # N
f6f0: 4f 54 45 3a 20 43 68 65 63 6b 20 69 66 20 74 68  OTE: Check if th
f700: 69 73 20 63 61 6c 6c 62 61 63 6b 20 69 73 20 6f  is callback is o
f710: 6e 65 20 74 68 61 74 20 77 65 20 63 61 72 65 20  ne that we care 
f720: 61 62 6f 75 74 2e 0d 0a 20 20 20 20 20 20 20 20  about...        
f730: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 69    #..          i
f740: 66 20 7b 22 43 61 6e 63 65 6c 65 64 22 20 69 6e  f {"Canceled" in
f750: 20 5b 73 70 6c 69 74 20 5b 24 65 20 49 6e 74 65   [split [$e Inte
f760: 72 72 75 70 74 54 79 70 65 5d 20 22 2c 20 22 5d  rruptType] ", "]
f770: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
f780: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
f790: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 74 65       # NOTE: Ite
f7a0: 72 61 74 65 20 74 68 72 6f 75 67 68 20 61 6c 6c  rate through all
f7b0: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
f7c0: 74 69 6f 6e 73 20 6b 6e 6f 77 6e 20 74 6f 20 74  tions known to t
f7d0: 68 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  he..            
f7e0: 23 20 20 20 20 20 20 20 70 61 72 65 6e 74 20 69  #       parent i
f7f0: 6e 74 65 72 70 72 65 74 65 72 2e 0d 0a 20 20 20  nterpreter...   
f800: 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
f810: 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20 66          object f
f820: 6f 72 65 61 63 68 20 2d 61 6c 69 61 73 20 70 61  oreach -alias pa
f830: 69 72 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  ir \..          
f840: 20 20 20 20 20 20 5b 6f 62 6a 65 63 74 20 69 6e        [object in
f850: 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e  voke -flags +Non
f860: 50 75 62 6c 69 63 20 24 65 20 49 6e 74 65 72 70  Public $e Interp
f870: 72 65 74 65 72 2e 63 6f 6e 6e 65 63 74 69 6f 6e  reter.connection
f880: 73 5d 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  s] {..          
f890: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
f8a0: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 74 74       # NOTE: Att
f8b0: 65 6d 70 74 20 74 6f 20 63 61 6e 63 65 6c 20 61  empt to cancel a
f8c0: 6e 79 20 53 51 4c 20 71 75 65 72 69 65 73 20 69  ny SQL queries i
f8d0: 6e 20 70 72 6f 67 72 65 73 73 20 6f 6e 20 74 68  n progress on th
f8e0: 69 73 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  is..            
f8f0: 20 20 23 20 20 20 20 20 20 20 64 61 74 61 62 61    #       databa
f900: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0d 0a  se connection...
f910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 0d                #.
f920: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
f930: 66 20 7b 5b 63 61 74 63 68 20 7b 24 70 61 69 72  f {[catch {$pair
f940: 20 56 61 6c 75 65 2e 43 61 6e 63 65 6c 7d 20 65   Value.Cancel} e
f950: 72 72 6f 72 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  rror]} then {.. 
f960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
f970: 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
f980: 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
f990: 20 5c 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20   \n \..         
f9a0: 20 20 20 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d             "====
f9b0: 20 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64   WARNING: failed
f9c0: 20 74 6f 20 63 61 6e 63 65 6c 20 71 75 65 72 79   to cancel query
f9d0: 20 66 6f 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   for connection 
f9e0: 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  \"" \..         
f9f0: 20 20 20 20 20 20 20 20 20 20 20 5b 24 70 61 69             [$pai
fa00: 72 20 4b 65 79 5d 20 22 5c 22 2c 20 65 72 72 6f  r Key] "\", erro
fa10: 72 3a 20 22 20 5c 6e 5c 74 20 24 65 72 72 6f 72  r: " \n\t $error
fa20: 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20   \n]..          
fa30: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
fa40: 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
fa50: 7d 0d 0a 20 20 20 20 20 20 20 20 7d 7d 0d 0a 20  }..        }}.. 
fa60: 20 20 20 20 20 7d 20 65 72 72 6f 72 5d 20 3d 3d       } error] ==
fa70: 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
fa80: 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e      addConstrain
fa90: 74 20 69 6e 74 65 72 72 75 70 74 43 61 6c 6c 62  t interruptCallb
faa0: 61 63 6b 2e 73 71 6c 69 74 65 33 0d 0a 0d 0a 20  ack.sqlite3.... 
fab0: 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
fac0: 61 6e 6e 65 6c 20 79 65 73 5c 6e 0d 0a 20 20 20  annel yes\n..   
fad0: 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
fae0: 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
faf0: 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
fb00: 22 6e 6f 2c 20 65 72 72 6f 72 3a 20 22 20 5c 6e  "no, error: " \n
fb10: 5c 74 20 24 65 72 72 6f 72 20 5c 6e 5d 0d 0a 20  \t $error \n].. 
fb20: 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c       }..    }...
fb30: 0d 0a 20 20 20 20 70 72 6f 63 20 63 6c 65 61 6e  ..    proc clean
fb40: 75 70 46 69 6c 65 20 7b 20 66 69 6c 65 4e 61 6d  upFile { fileNam
fb50: 65 20 7b 63 6f 6c 6c 65 63 74 20 74 72 75 65 7d  e {collect true}
fb60: 20 7b 66 6f 72 63 65 20 66 61 6c 73 65 7d 20 7d   {force false} }
fb70: 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20   {..      #..   
fb80: 20 20 20 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d     # NOTE: Attem
fb90: 70 74 20 74 6f 20 66 6f 72 63 65 20 61 6c 6c 20  pt to force all 
fba0: 70 65 6e 64 69 6e 67 20 22 67 61 72 62 61 67 65  pending "garbage
fbb0: 22 20 6f 62 6a 65 63 74 73 20 74 6f 20 62 65 20  " objects to be 
fbc0: 63 6f 6c 6c 65 63 74 65 64 2c 0d 0a 20 20 20 20  collected,..    
fbd0: 20 20 23 20 20 20 20 20 20 20 69 6e 63 6c 75 64    #       includ
fbe0: 69 6e 67 20 53 51 4c 69 74 65 20 73 74 61 74 65  ing SQLite state
fbf0: 6d 65 6e 74 73 20 61 6e 64 20 62 61 63 6b 75 70  ments and backup
fc00: 20 6f 62 6a 65 63 74 73 3b 20 74 68 69 73 20 73   objects; this s
fc10: 68 6f 75 6c 64 20 61 6c 6c 6f 77 0d 0a 20 20 20  hould allow..   
fc20: 20 20 20 23 20 20 20 20 20 20 20 74 68 65 20 75     #       the u
fc30: 6e 64 65 72 6c 79 69 6e 67 20 64 61 74 61 62 61  nderlying databa
fc40: 73 65 20 66 69 6c 65 20 74 6f 20 62 65 20 64 65  se file to be de
fc50: 6c 65 74 65 64 2e 0d 0a 20 20 20 20 20 20 23 0d  leted...      #.
fc60: 0a 20 20 20 20 20 20 69 66 20 7b 24 63 6f 6c 6c  .      if {$coll
fc70: 65 63 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  ect} then {..   
fc80: 20 20 20 20 20 63 6f 6c 6c 65 63 74 47 61 72 62       collectGarb
fc90: 61 67 65 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  age $::test_chan
fca0: 6e 65 6c 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a  nel..      }....
fcb0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
fcc0: 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 69 66 20   NOTE: Check if 
fcd0: 74 68 65 20 66 69 6c 65 20 73 74 69 6c 6c 20 65  the file still e
fce0: 78 69 73 74 73 2e 0d 0a 20 20 20 20 20 20 23 0d  xists...      #.
fcf0: 0a 20 20 20 20 20 20 69 66 20 7b 5b 66 69 6c 65  .      if {[file
fd00: 20 65 78 69 73 74 73 20 24 66 69 6c 65 4e 61 6d   exists $fileNam
fd10: 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  e]} then {..    
fd20: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
fd30: 20 4e 4f 54 45 3a 20 53 6b 69 70 20 64 65 6c 65   NOTE: Skip dele
fd40: 74 69 6e 67 20 74 65 73 74 20 66 69 6c 65 73 20  ting test files 
fd50: 69 66 20 73 6f 6d 65 62 6f 64 79 20 73 65 74 73  if somebody sets
fd60: 20 74 68 65 20 67 6c 6f 62 61 6c 20 76 61 72 69   the global vari
fd70: 61 62 6c 65 0d 0a 20 20 20 20 20 20 20 20 23 20  able..        # 
fd80: 20 20 20 20 20 20 74 6f 20 70 72 65 76 65 6e 74        to prevent
fd90: 20 69 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d   it...        #.
fda0: 0a 20 20 20 20 20 20 20 20 69 66 20 7b 24 66 6f  .        if {$fo
fdb0: 72 63 65 20 7c 7c 20 21 5b 69 6e 66 6f 20 65 78  rce || ![info ex
fdc0: 69 73 74 73 20 3a 3a 6e 6f 28 63 6c 65 61 6e 75  ists ::no(cleanu
fdd0: 70 46 69 6c 65 29 5d 7d 20 74 68 65 6e 20 7b 0d  pFile)]} then {.
fde0: 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
fdf0: 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
fe00: 41 74 74 65 6d 70 74 20 74 6f 20 64 65 6c 65 74  Attempt to delet
fe10: 65 20 74 68 65 20 74 65 73 74 20 66 69 6c 65 20  e the test file 
fe20: 6e 6f 77 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  now...          
fe30: 23 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20  #..          if 
fe40: 7b 5b 73 65 74 20 63 6f 64 65 20 5b 63 61 74 63  {[set code [catc
fe50: 68 20 7b 66 69 6c 65 20 64 65 6c 65 74 65 20 24  h {file delete $
fe60: 66 69 6c 65 4e 61 6d 65 7d 20 65 72 72 6f 72 5d  fileName} error]
fe70: 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
fe80: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
fe90: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 57 65        # NOTE: We
fea0: 20 73 6f 6d 65 68 6f 77 20 66 61 69 6c 65 64 20   somehow failed 
feb0: 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20 66 69  to delete the fi
fec0: 6c 65 2c 20 72 65 70 6f 72 74 20 77 68 79 2e 0d  le, report why..
fed0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a  .            #..
fee0: 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
fef0: 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
ff00: 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
ff10: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
ff20: 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20   "==== WARNING: 
ff30: 66 61 69 6c 65 64 20 74 6f 20 64 65 6c 65 74 65  failed to delete
ff40: 20 74 65 73 74 20 66 69 6c 65 20 5c 22 22 20 24   test file \"" $
ff50: 66 69 6c 65 4e 61 6d 65 20 5c 0d 0a 20 20 20 20  fileName \..    
ff60: 20 20 20 20 20 20 20 20 20 20 20 20 22 5c 22 20              "\" 
ff70: 64 75 72 69 6e 67 20 63 6c 65 61 6e 75 70 2c 20  during cleanup, 
ff80: 65 72 72 6f 72 3a 20 22 20 5c 6e 5c 74 20 24 65  error: " \n\t $e
ff90: 72 72 6f 72 20 5c 6e 5d 0d 0a 20 20 20 20 20 20  rror \n]..      
ffa0: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d      }..        }
ffb0: 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
ffc0: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
ffd0: 23 20 4e 4f 54 45 3a 20 53 68 6f 77 20 74 68 61  # NOTE: Show tha
ffe0: 74 20 77 65 20 73 6b 69 70 70 65 64 20 64 65 6c  t we skipped del
fff0: 65 74 69 6e 67 20 74 68 65 20 66 69 6c 65 2e 0d  eting the file..
10000 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
10010 20 20 20 20 20 20 20 20 73 65 74 20 63 6f 64 65          set code
10020 20 30 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   0....          
10030 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
10040 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
10050 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
10060 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47     "==== WARNING
10070 3a 20 73 6b 69 70 70 65 64 20 64 65 6c 65 74 69  : skipped deleti
10080 6e 67 20 74 65 73 74 20 66 69 6c 65 20 5c 22 22  ng test file \""
10090 20 24 66 69 6c 65 4e 61 6d 65 20 5c 0d 0a 20 20   $fileName \..  
100a0 20 20 20 20 20 20 20 20 20 20 20 20 22 5c 22 20              "\" 
100b0 64 75 72 69 6e 67 20 63 6c 65 61 6e 75 70 5c 6e  during cleanup\n
100c0 22 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20  "]..        }.. 
100d0 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
100e0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
100f0 20 20 23 20 4e 4f 54 45 3a 20 54 68 65 20 66 69    # NOTE: The fi
10100 6c 65 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73  le does not exis
10110 74 2c 20 73 75 63 63 65 73 73 21 0d 0a 20 20 20  t, success!..   
10120 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
10130 73 65 74 20 63 6f 64 65 20 30 0d 0a 20 20 20 20  set code 0..    
10140 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65 74    }....      ret
10150 75 72 6e 20 24 63 6f 64 65 0d 0a 20 20 20 20 7d  urn $code..    }
10160 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 63 6f  .....    proc co
10170 6c 6c 65 63 74 47 61 72 62 61 67 65 20 7b 20 63  llectGarbage { c
10180 68 61 6e 6e 65 6c 20 7b 6d 69 6c 6c 69 73 65 63  hannel {millisec
10190 6f 6e 64 73 20 31 30 30 30 7d 20 7b 71 75 69 65  onds 1000} {quie
101a0 74 20 74 72 75 65 7d 20 7d 20 7b 0d 0a 20 20 20  t true} } {..   
101b0 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 6f     if {[catch {o
101c0 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 47 43 20  bject invoke GC 
101d0 47 65 74 54 6f 74 61 6c 4d 65 6d 6f 72 79 20 66  GetTotalMemory f
101e0 61 6c 73 65 7d 20 72 65 73 75 6c 74 5d 20 3d 3d  alse} result] ==
101f0 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
10200 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d      if {!$quiet}
10210 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
10220 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
10230 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
10240 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22  .              "
10250 2d 2d 2d 2d 20 6d 65 6d 6f 72 79 20 69 6e 20 75  ---- memory in u
10260 73 65 20 62 79 20 74 68 65 20 43 4c 52 20 62 65  se by the CLR be
10270 66 6f 72 65 20 63 6f 6c 6c 65 63 74 69 6f 6e 2e  fore collection.
10280 2e 2e 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20  .. " \..        
10290 20 20 20 20 20 20 24 72 65 73 75 6c 74 20 22 20        $result " 
102a0 62 79 74 65 73 5c 6e 22 5d 0d 0a 20 20 20 20 20  bytes\n"]..     
102b0 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 20 65 6c     }..      } el
102c0 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70  se {..        tp
102d0 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70  uts $channel [ap
102e0 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
102f0 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41          "==== WA
10300 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20 74 6f  RNING: failed to
10310 20 67 65 74 20 43 4c 52 20 6d 65 6d 6f 72 79 20   get CLR memory 
10320 75 73 61 67 65 2c 20 65 72 72 6f 72 3a 20 22 20  usage, error: " 
10330 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5c  \..            \
10340 6e 5c 74 20 24 72 65 73 75 6c 74 20 5c 6e 5d 0d  n\t $result \n].
10350 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
10360 20 20 23 23 23 23 23 23 23 23 23 23 23 23 23 23    ##############
10370 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
10380 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
10390 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
103a0 23 23 23 23 23 23 23 23 23 23 23 0d 0a 0d 0a 20  ###########.... 
103b0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
103c0 4e 4f 54 45 3a 20 52 65 70 65 61 74 65 64 6c 79  NOTE: Repeatedly
103d0 20 61 74 74 65 6d 70 74 20 74 6f 20 63 6f 6c 6c   attempt to coll
103e0 65 63 74 20 67 61 72 62 61 67 65 20 75 6e 74 69  ect garbage unti
103f0 6c 20 74 68 65 20 61 6c 6c 6f 74 74 65 64 20 6e  l the allotted n
10400 75 6d 62 65 72 0d 0a 20 20 20 20 20 20 23 20 20  umber..      #  
10410 20 20 20 20 20 6f 66 20 6d 69 6c 6c 69 73 65 63       of millisec
10420 6f 6e 64 73 20 68 61 73 20 65 6c 61 70 73 65 64  onds has elapsed
10430 2e 20 20 41 6c 77 61 79 73 20 61 74 74 65 6d 70  .  Always attemp
10440 74 20 74 6f 20 63 6f 6c 6c 65 63 74 20 67 61 72  t to collect gar
10450 62 61 67 65 0d 0a 20 20 20 20 20 20 23 20 20 20  bage..      #   
10460 20 20 20 20 61 74 20 6c 65 61 73 74 20 6f 6e 63      at least onc
10470 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  e...      #..   
10480 20 20 20 73 65 74 20 73 74 61 72 74 20 5b 63 6c     set start [cl
10490 6f 63 6b 20 73 65 63 6f 6e 64 73 5d 0d 0a 20 20  ock seconds]..  
104a0 20 20 20 20 73 65 74 20 73 74 6f 70 20 5b 65 78      set stop [ex
104b0 70 72 20 7b 24 73 74 61 72 74 20 2b 20 28 24 6d  pr {$start + ($m
104c0 69 6c 6c 69 73 65 63 6f 6e 64 73 20 2f 20 31 30  illiseconds / 10
104d0 30 30 29 7d 5d 0d 0a 0d 0a 20 20 20 20 20 20 64  00)}]....      d
104e0 6f 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  o {..        #..
104f0 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
10500 41 74 74 65 6d 70 74 20 74 6f 20 66 6f 72 63 65  Attempt to force
10510 20 61 20 66 75 6c 6c 20 67 61 72 62 61 67 65 20   a full garbage 
10520 63 6f 6c 6c 65 63 74 69 6f 6e 20 6e 6f 77 2e 20  collection now. 
10530 20 52 65 70 6f 72 74 20 61 6e 79 0d 0a 20 20 20   Report any..   
10540 20 20 20 20 20 23 20 20 20 20 20 20 20 65 72 72       #       err
10550 6f 72 20 74 68 61 74 20 69 73 20 65 6e 63 6f 75  or that is encou
10560 6e 74 65 72 65 64 20 69 66 20 77 65 20 66 61 69  ntered if we fai
10570 6c 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  l...        #.. 
10580 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63         if {[catc
10590 68 20 7b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65  h {object invoke
105a0 20 47 43 20 47 65 74 54 6f 74 61 6c 4d 65 6d 6f   GC GetTotalMemo
105b0 72 79 20 74 72 75 65 7d 20 65 72 72 6f 72 5d 7d  ry true} error]}
105c0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
105d0 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
105e0 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
105f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22  .              "
10600 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61  ==== WARNING: fa
10610 69 6c 65 64 20 66 75 6c 6c 20 67 61 72 62 61 67  iled full garbag
10620 65 20 63 6f 6c 6c 65 63 74 69 6f 6e 2c 20 65 72  e collection, er
10630 72 6f 72 3a 20 22 20 5c 0d 0a 20 20 20 20 20 20  ror: " \..      
10640 20 20 20 20 20 20 20 20 5c 6e 5c 74 20 24 65 72          \n\t $er
10650 72 6f 72 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20  ror \n]..       
10660 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 73 65   }....        se
10670 74 20 6e 6f 77 20 5b 63 6c 6f 63 6b 20 73 65 63  t now [clock sec
10680 6f 6e 64 73 5d 0d 0a 20 20 20 20 20 20 7d 20 77  onds]..      } w
10690 68 69 6c 65 20 7b 24 73 74 61 72 74 20 3c 3d 20  hile {$start <= 
106a0 24 6e 6f 77 20 26 26 20 24 6e 6f 77 20 3c 20 24  $now && $now < $
106b0 73 74 6f 70 7d 0d 0a 0d 0a 20 20 20 20 20 20 23  stop}....      #
106c0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
106d0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
106e0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
106f0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
10700 23 23 23 23 23 23 23 23 0d 0a 0d 0a 20 20 20 20  ########....    
10710 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 6f 62    if {[catch {ob
10720 6a 65 63 74 20 69 6e 76 6f 6b 65 20 47 43 20 47  ject invoke GC G
10730 65 74 54 6f 74 61 6c 4d 65 6d 6f 72 79 20 66 61  etTotalMemory fa
10740 6c 73 65 7d 20 72 65 73 75 6c 74 5d 20 3d 3d 20  lse} result] == 
10750 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
10760 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20     if {!$quiet} 
10770 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
10780 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
10790 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
107a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d                "-
107b0 2d 2d 2d 20 6d 65 6d 6f 72 79 20 69 6e 20 75 73  --- memory in us
107c0 65 20 62 79 20 74 68 65 20 43 4c 52 20 61 66 74  e by the CLR aft
107d0 65 72 20 63 6f 6c 6c 65 63 74 69 6f 6e 2e 2e 2e  er collection...
107e0 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20   " \..          
107f0 20 20 20 20 24 72 65 73 75 6c 74 20 22 20 62 79      $result " by
10800 74 65 73 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20  tes\n"]..       
10810 20 7d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65   }..      } else
10820 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74   {..        tput
10830 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  s $channel [appe
10840 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
10850 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e        "==== WARN
10860 49 4e 47 3a 20 66 61 69 6c 65 64 20 74 6f 20 67  ING: failed to g
10870 65 74 20 43 4c 52 20 6d 65 6d 6f 72 79 20 75 73  et CLR memory us
10880 61 67 65 2c 20 65 72 72 6f 72 3a 20 22 20 5c 0d  age, error: " \.
10890 0a 20 20 20 20 20 20 20 20 20 20 20 20 5c 6e 5c  .            \n\
108a0 74 20 24 72 65 73 75 6c 74 20 5c 6e 5d 0d 0a 20  t $result \n].. 
108b0 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c       }..    }...
108c0 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74 53 51  ..    proc getSQ
108d0 4c 69 74 65 48 61 6e 64 6c 65 43 6f 75 6e 74 73  LiteHandleCounts
108e0 20 7b 20 63 68 61 6e 6e 65 6c 20 7b 71 75 69 65   { channel {quie
108f0 74 20 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a 20 20  t false} } {..  
10900 20 20 20 20 73 65 74 20 72 65 73 75 6c 74 20 5b      set result [
10910 6c 69 73 74 5d 0d 0a 0d 0a 20 20 20 20 20 20 69  list]....      i
10920 66 20 7b 5b 68 61 76 65 43 6f 6e 73 74 72 61 69  f {[haveConstrai
10930 6e 74 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  nt \..          
10940 20 20 20 20 64 65 66 69 6e 65 43 6f 6e 73 74 61      defineConsta
10950 6e 74 2e 53 79 73 74 65 6d 2e 44 61 74 61 2e 53  nt.System.Data.S
10960 51 4c 69 74 65 2e 43 4f 55 4e 54 5f 48 41 4e 44  QLite.COUNT_HAND
10970 4c 45 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  LE]} then {..   
10980 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
10990 23 20 4e 4f 54 45 3a 20 41 64 64 20 65 61 63 68  # NOTE: Add each
109a0 20 63 72 69 74 69 63 61 6c 20 68 61 6e 64 6c 65   critical handle
109b0 20 63 6f 75 6e 74 20 74 6f 20 74 68 65 20 72 65   count to the re
109c0 73 75 6c 74 69 6e 67 20 6c 69 73 74 2e 0d 0a 20  sulting list... 
109d0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
109e0 20 20 66 6f 72 65 61 63 68 20 6e 61 6d 65 20 5b    foreach name [
109f0 6c 69 73 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 43  list connectionC
10a00 6f 75 6e 74 20 73 74 61 74 65 6d 65 6e 74 43 6f  ount statementCo
10a10 75 6e 74 20 62 61 63 6b 75 70 43 6f 75 6e 74 5d  unt backupCount]
10a20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65   {..          se
10a30 74 20 76 61 6c 75 65 20 5b 6f 62 6a 65 63 74 20  t value [object 
10a40 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e  invoke -flags +N
10a50 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20  onPublic \..    
10a60 20 20 20 20 20 20 20 20 20 20 53 79 73 74 65 6d            System
10a70 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 55 6e 73  .Data.SQLite.Uns
10a80 61 66 65 4e 61 74 69 76 65 4d 65 74 68 6f 64 73  afeNativeMethods
10a90 20 24 6e 61 6d 65 5d 0d 0a 0d 0a 20 20 20 20 20   $name]....     
10aa0 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74       if {!$quiet
10ab0 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
10ac0 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
10ad0 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
10ae0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
10af0 20 20 20 20 22 2d 2d 2d 2d 20 63 72 69 74 69 63      "---- critic
10b00 61 6c 20 68 61 6e 64 6c 65 20 63 6f 75 6e 74 20  al handle count 
10b10 5c 22 22 20 24 6e 61 6d 65 20 22 5c 22 20 69 73  \"" $name "\" is
10b20 20 22 20 24 76 61 6c 75 65 20 5c 6e 5d 0d 0a 20   " $value \n].. 
10b30 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20           }....  
10b40 20 20 20 20 20 20 20 20 6c 61 70 70 65 6e 64 20          lappend 
10b50 72 65 73 75 6c 74 20 24 76 61 6c 75 65 0d 0a 20  result $value.. 
10b60 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
10b70 7d 20 65 6c 73 65 69 66 20 7b 21 24 71 75 69 65  } elseif {!$quie
10b80 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  t} then {..     
10b90 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
10ba0 4e 4f 54 45 3a 20 54 68 65 20 61 63 74 75 61 6c  NOTE: The actual
10bb0 20 68 61 6e 64 6c 65 20 63 6f 75 6e 74 73 20 61   handle counts a
10bc0 72 65 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65  re not available
10bd0 3b 20 74 68 65 72 65 66 6f 72 65 2c 20 6a 75 73  ; therefore, jus
10be0 74 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  t..        #    
10bf0 20 20 20 72 65 74 75 72 6e 20 61 6e 20 65 6d 70     return an emp
10c00 74 79 20 6c 69 73 74 2e 0d 0a 20 20 20 20 20 20  ty list...      
10c10 20 20 23 0d 0a 20 20 20 20 20 20 20 20 74 70 75    #..        tpu
10c20 74 73 20 24 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d  ts $channel "---
10c30 2d 20 63 72 69 74 69 63 61 6c 20 68 61 6e 64 6c  - critical handl
10c40 65 20 63 6f 75 6e 74 73 20 75 6e 61 76 61 69 6c  e counts unavail
10c50 61 62 6c 65 5c 6e 22 0d 0a 20 20 20 20 20 20 7d  able\n"..      }
10c60 0d 0a 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ....      return
10c70 20 24 72 65 73 75 6c 74 0d 0a 20 20 20 20 7d 0d   $result..    }.
10c80 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 73 68 75  ....    proc shu
10c90 74 64 6f 77 6e 53 51 4c 69 74 65 20 7b 20 63 68  tdownSQLite { ch
10ca0 61 6e 6e 65 6c 20 7b 66 6f 72 63 65 20 66 61 6c  annel {force fal
10cb0 73 65 7d 20 7b 71 75 69 65 74 20 66 61 6c 73 65  se} {quiet false
10cc0 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a  } } {..      #..
10cd0 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4d 61        # NOTE: Ma
10ce0 6b 65 20 73 75 72 65 20 74 68 61 74 20 53 51 4c  ke sure that SQL
10cf0 69 74 65 20 63 6f 72 65 20 6c 69 62 72 61 72 79  ite core library
10d00 20 69 73 20 63 6f 6d 70 6c 65 74 65 6c 79 20 73   is completely s
10d10 68 75 74 64 6f 77 6e 2e 20 20 54 68 69 73 0d 0a  hutdown.  This..
10d20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 69 73        #       is
10d30 20 75 73 65 64 20 62 79 20 74 65 73 74 73 20 74   used by tests t
10d40 68 61 74 20 63 68 61 6e 67 65 20 63 6f 6e 66 69  hat change confi
10d50 67 75 72 61 74 69 6f 6e 20 6f 70 74 69 6f 6e 73  guration options
10d60 20 61 6e 64 2f 6f 72 20 74 68 6f 73 65 0d 0a 20   and/or those.. 
10d70 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68 61       #       tha
10d80 74 20 6e 65 65 64 20 74 6f 20 6d 61 6b 65 20 73  t need to make s
10d90 75 72 65 20 6c 6f 67 67 69 6e 67 20 69 73 20 69  ure logging is i
10da0 6e 69 74 69 61 6c 69 7a 65 64 20 28 69 2e 65 2e  nitialized (i.e.
10db0 20 6a 75 73 74 20 69 6e 20 63 61 73 65 0d 0a 20   just in case.. 
10dc0 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68 65       #       the
10dd0 20 53 51 4c 69 74 65 20 63 6f 72 65 20 6c 69 62   SQLite core lib
10de0 72 61 72 79 20 77 61 73 20 69 6e 69 74 69 61 6c  rary was initial
10df0 69 7a 65 64 20 69 6e 20 74 68 65 20 70 72 6f 63  ized in the proc
10e00 65 73 73 20 70 72 69 6f 72 20 74 6f 0d 0a 20 20  ess prior to..  
10e10 20 20 20 20 23 20 20 20 20 20 20 20 74 68 65 20      #       the 
10e20 53 51 4c 69 74 65 4c 6f 67 20 63 6c 61 73 73 20  SQLiteLog class 
10e30 62 65 69 6e 67 20 61 62 6c 65 20 74 6f 20 73 65  being able to se
10e40 74 75 70 20 69 74 73 20 6c 6f 67 67 69 6e 67 20  tup its logging 
10e50 63 61 6c 6c 62 61 63 6b 29 2e 0d 0a 20 20 20 20  callback)...    
10e60 20 20 23 20 20 20 20 20 20 20 4e 6f 72 6d 61 6c    #       Normal
10e70 6c 79 2c 20 74 68 69 73 20 73 68 6f 75 6c 64 20  ly, this should 
10e80 6f 6e 6c 79 20 62 65 20 70 65 72 66 6f 72 6d 65  only be performe
10e90 64 20 69 66 20 53 51 4c 69 74 65 20 69 73 20 6c  d if SQLite is l
10ea0 6f 61 64 65 64 20 61 6e 64 0d 0a 20 20 20 20 20  oaded and..     
10eb0 20 23 20 20 20 20 20 20 20 72 65 61 64 79 20 66   #       ready f
10ec0 6f 72 20 75 73 65 20 62 79 20 74 68 65 20 74 65  or use by the te
10ed0 73 74 20 73 75 69 74 65 2e 0d 0a 20 20 20 20 20  st suite...     
10ee0 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 24 66   #..      if {$f
10ef0 6f 72 63 65 20 7c 7c 20 5b 69 73 53 51 4c 69 74  orce || [isSQLit
10f00 65 52 65 61 64 79 5d 7d 20 74 68 65 6e 20 7b 0d  eReady]} then {.
10f10 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
10f20 20 20 20 20 23 20 42 55 47 46 49 58 3a 20 42 65      # BUGFIX: Be
10f30 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 74 68 65  fore calling the
10f40 20 6e 61 74 69 76 65 20 73 68 75 74 64 6f 77 6e   native shutdown
10f50 20 66 75 6e 63 74 69 6f 6e 2c 20 6d 61 6b 65 20   function, make 
10f60 73 75 72 65 20 62 6f 74 68 0d 0a 20 20 20 20 20  sure both..     
10f70 20 20 20 23 20 20 20 20 20 20 20 20 20 6f 66 20     #         of 
10f80 74 68 65 20 50 52 41 47 4d 41 20 72 65 6c 61 74  the PRAGMA relat
10f90 65 64 20 64 69 72 65 63 74 6f 72 79 20 6e 61 6d  ed directory nam
10fa0 65 73 20 61 72 65 20 66 72 65 65 64 2e 0d 0a 20  es are freed... 
10fb0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
10fc0 20 20 63 68 65 63 6b 46 6f 72 53 51 4c 69 74 65    checkForSQLite
10fd0 44 69 72 65 63 74 6f 72 69 65 73 20 24 63 68 61  Directories $cha
10fe0 6e 6e 65 6c 20 74 72 75 65 0d 0a 0d 0a 20 20 20  nnel true....   
10ff0 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20       if {[catch 
11000 7b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d  {object invoke -
11010 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63  flags +NonPublic
11020 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
11030 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e      System.Data.
11040 53 51 4c 69 74 65 2e 55 6e 73 61 66 65 4e 61 74  SQLite.UnsafeNat
11050 69 76 65 4d 65 74 68 6f 64 73 20 5c 0d 0a 20 20  iveMethods \..  
11060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
11070 6c 69 74 65 33 5f 73 68 75 74 64 6f 77 6e 7d 20  lite3_shutdown} 
11080 72 65 73 75 6c 74 5d 20 3d 3d 20 30 7d 20 74 68  result] == 0} th
11090 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
110a0 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65  if {!$quiet} the
110b0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
110c0 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
110d0 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
110e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
110f0 2d 2d 2d 2d 20 63 61 6c 6c 20 73 71 6c 69 74 65  ---- call sqlite
11100 33 5f 73 68 75 74 64 6f 77 6e 28 29 2e 2e 2e 20  3_shutdown()... 
11110 6f 6b 3a 20 22 20 24 72 65 73 75 6c 74 20 5c 6e  ok: " $result \n
11120 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  ]..          }..
11130 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b          } else {
11140 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b  ..          if {
11150 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d  !$quiet} then {.
11160 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75  .            tpu
11170 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70  ts $channel [app
11180 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
11190 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
111a0 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 5f 73 68   call sqlite3_sh
111b0 75 74 64 6f 77 6e 28 29 2e 2e 2e 20 65 72 72 6f  utdown()... erro
111c0 72 3a 20 22 20 5c 6e 5c 74 20 24 72 65 73 75 6c  r: " \n\t $resul
111d0 74 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20  t \n]..         
111e0 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20   }..        }.. 
111f0 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c       }..    }...
11200 0d 0a 20 20 20 20 70 72 6f 63 20 72 65 70 6f 72  ..    proc repor
11210 74 53 51 4c 69 74 65 52 65 73 6f 75 72 63 65 73  tSQLiteResources
11220 20 7b 20 63 68 61 6e 6e 65 6c 20 7b 71 75 69 65   { channel {quie
11230 74 20 66 61 6c 73 65 7d 20 7b 63 6f 6c 6c 65 63  t false} {collec
11240 74 20 74 72 75 65 7d 20 7d 20 7b 0d 0a 20 20 20  t true} } {..   
11250 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
11260 54 45 3a 20 53 6b 69 70 20 61 6c 6c 20 6f 75 74  TE: Skip all out
11270 70 75 74 20 69 66 20 77 65 20 61 72 65 20 72 75  put if we are ru
11280 6e 6e 69 6e 67 20 69 6e 20 22 71 75 69 65 74 22  nning in "quiet"
11290 20 6d 6f 64 65 2e 0d 0a 20 20 20 20 20 20 23 0d   mode...      #.
112a0 0a 20 20 20 20 20 20 69 66 20 7b 5b 68 61 76 65  .      if {[have
112b0 43 6f 6e 73 74 72 61 69 6e 74 20 5c 0d 0a 20 20  Constraint \..  
112c0 20 20 20 20 20 20 20 20 20 20 20 20 64 65 66 69              defi
112d0 6e 65 43 6f 6e 73 74 61 6e 74 2e 53 79 73 74 65  neConstant.Syste
112e0 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 49 4e  m.Data.SQLite.IN
112f0 54 45 52 4f 50 5f 56 49 52 54 55 41 4c 5f 54 41  TEROP_VIRTUAL_TA
11300 42 4c 45 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20  BLE] && \..     
11310 20 20 20 20 20 5b 68 61 76 65 43 6f 6e 73 74 72       [haveConstr
11320 61 69 6e 74 20 5c 0d 0a 20 20 20 20 20 20 20 20  aint \..        
11330 20 20 20 20 20 20 64 65 66 69 6e 65 43 6f 6e 73        defineCons
11340 74 61 6e 74 2e 53 79 73 74 65 6d 2e 44 61 74 61  tant.System.Data
11350 2e 53 51 4c 69 74 65 2e 54 52 41 43 4b 5f 4d 45  .SQLite.TRACK_ME
11360 4d 4f 52 59 5f 42 59 54 45 53 5d 7d 20 74 68 65  MORY_BYTES]} the
11370 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20  n {..        if 
11380 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b  {!$quiet} then {
11390 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70 75 74  ..          tput
113a0 73 20 24 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d  s $channel "----
113b0 20 63 75 72 72 65 6e 74 20 6d 65 6d 6f 72 79 20   current memory 
113c0 69 6e 20 75 73 65 20 62 79 20 53 51 4c 69 74 65  in use by SQLite
113d0 4d 65 6d 6f 72 79 2e 2e 2e 20 22 0d 0a 20 20 20  Memory... "..   
113e0 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
113f0 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 6f 62    if {[catch {ob
11400 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61  ject invoke -fla
11410 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d  gs +NonPublic \.
11420 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
11430 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c   System.Data.SQL
11440 69 74 65 2e 53 51 4c 69 74 65 4d 65 6d 6f 72 79  ite.SQLiteMemory
11450 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
11460 20 20 20 20 62 79 74 65 73 41 6c 6c 6f 63 61 74      bytesAllocat
11470 65 64 7d 20 6d 65 6d 6f 72 79 5d 20 3d 3d 20 30  ed} memory] == 0
11480 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
11490 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d      if {!$quiet}
114a0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
114b0 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
114c0 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
114d0 24 6d 65 6d 6f 72 79 20 22 20 62 79 74 65 73 5c  $memory " bytes\
114e0 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  n"]..          }
114f0 0d 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65  ..        } else
11500 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65   {..          se
11510 74 20 6d 65 6d 6f 72 79 20 75 6e 6b 6e 6f 77 6e  t memory unknown
11520 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66  ....          if
11530 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20   {!$quiet} then 
11540 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  {..            t
11550 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61  puts $channel [a
11560 70 70 65 6e 64 41 72 67 73 20 24 6d 65 6d 6f 72  ppendArgs $memor
11570 79 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20  y \n]..         
11580 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d   }..        }...
11590 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71  .        if {!$q
115a0 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  uiet} then {..  
115b0 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
115c0 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 6d 61 78  hannel "---- max
115d0 69 6d 75 6d 20 6d 65 6d 6f 72 79 20 69 6e 20 75  imum memory in u
115e0 73 65 20 62 79 20 53 51 4c 69 74 65 4d 65 6d 6f  se by SQLiteMemo
115f0 72 79 2e 2e 2e 20 22 0d 0a 20 20 20 20 20 20 20  ry... "..       
11600 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66   }....        if
11610 20 7b 5b 63 61 74 63 68 20 7b 6f 62 6a 65 63 74   {[catch {object
11620 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b   invoke -flags +
11630 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20  NonPublic \..   
11640 20 20 20 20 20 20 20 20 20 20 20 20 20 53 79 73               Sys
11650 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e  tem.Data.SQLite.
11660 53 51 4c 69 74 65 4d 65 6d 6f 72 79 20 5c 0d 0a  SQLiteMemory \..
11670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11680 6d 61 78 69 6d 75 6d 42 79 74 65 73 41 6c 6c 6f  maximumBytesAllo
11690 63 61 74 65 64 7d 20 6d 65 6d 6f 72 79 5d 20 3d  cated} memory] =
116a0 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  = 0} then {..   
116b0 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69         if {!$qui
116c0 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  et} then {..    
116d0 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
116e0 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
116f0 67 73 20 24 6d 65 6d 6f 72 79 20 22 20 62 79 74  gs $memory " byt
11700 65 73 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20  es\n"]..        
11710 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 20 65    }..        } e
11720 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  lse {..         
11730 20 73 65 74 20 6d 65 6d 6f 72 79 20 75 6e 6b 6e   set memory unkn
11740 6f 77 6e 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  own....         
11750 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68   if {!$quiet} th
11760 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
11770 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
11780 20 5b 61 70 70 65 6e 64 41 72 67 73 20 24 6d 65   [appendArgs $me
11790 6d 6f 72 79 20 5c 6e 5d 0d 0a 20 20 20 20 20 20  mory \n]..      
117a0 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d      }..        }
117b0 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
117c0 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20     if {!$quiet} 
117d0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
117e0 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 22  tputs $channel "
117f0 2d 2d 2d 2d 20 63 75 72 72 65 6e 74 20 6d 65 6d  ---- current mem
11800 6f 72 79 20 69 6e 20 75 73 65 20 62 79 20 53 51  ory in use by SQ
11810 4c 69 74 65 2e 2e 2e 20 22 0d 0a 20 20 20 20 20  Lite... "..     
11820 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b   }....      if {
11830 5b 63 61 74 63 68 20 7b 6f 62 6a 65 63 74 20 69  [catch {object i
11840 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f  nvoke -flags +No
11850 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20  nPublic \..     
11860 20 20 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e           System.
11870 44 61 74 61 2e 53 51 4c 69 74 65 2e 55 6e 73 61  Data.SQLite.Unsa
11880 66 65 4e 61 74 69 76 65 4d 65 74 68 6f 64 73 20  feNativeMethods 
11890 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
118a0 20 73 71 6c 69 74 65 33 5f 6d 65 6d 6f 72 79 5f   sqlite3_memory_
118b0 75 73 65 64 7d 20 6d 65 6d 6f 72 79 5d 20 3d 3d  used} memory] ==
118c0 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
118d0 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d      if {!$quiet}
118e0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
118f0 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
11900 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 24 6d  l [appendArgs $m
11910 65 6d 6f 72 79 20 22 20 62 79 74 65 73 5c 6e 22  emory " bytes\n"
11920 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  ]..        }..  
11930 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
11940 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
11950 20 23 20 4e 4f 54 45 3a 20 4d 61 79 62 65 20 74   # NOTE: Maybe t
11960 68 65 20 53 51 4c 69 74 65 20 63 6f 72 65 20 6c  he SQLite core l
11970 69 62 72 61 72 79 20 69 73 20 75 6e 61 76 61 69  ibrary is unavai
11980 6c 61 62 6c 65 3f 0d 0a 20 20 20 20 20 20 20 20  lable?..        
11990 23 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 6d  #..        set m
119a0 65 6d 6f 72 79 20 75 6e 6b 6e 6f 77 6e 0d 0a 0d  emory unknown...
119b0 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71  .        if {!$q
119c0 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  uiet} then {..  
119d0 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
119e0 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
119f0 67 73 20 24 6d 65 6d 6f 72 79 20 5c 6e 5d 0d 0a  gs $memory \n]..
11a00 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
11a10 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 73 65 74 20   }....      set 
11a20 72 65 73 75 6c 74 20 24 6d 65 6d 6f 72 79 3b 20  result $memory; 
11a30 23 20 4e 4f 54 45 3a 20 52 65 74 75 72 6e 20 6d  # NOTE: Return m
11a40 65 6d 6f 72 79 20 69 6e 2d 75 73 65 20 74 6f 20  emory in-use to 
11a50 6f 75 72 20 63 61 6c 6c 65 72 2e 0d 0a 0d 0a 20  our caller..... 
11a60 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74       if {!$quiet
11a70 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
11a80 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
11a90 20 22 2d 2d 2d 2d 20 6d 61 78 69 6d 75 6d 20 6d   "---- maximum m
11aa0 65 6d 6f 72 79 20 69 6e 20 75 73 65 20 62 79 20  emory in use by 
11ab0 53 51 4c 69 74 65 2e 2e 2e 20 22 0d 0a 20 20 20  SQLite... "..   
11ac0 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 69 66     }....      if
11ad0 20 7b 5b 63 61 74 63 68 20 7b 6f 62 6a 65 63 74   {[catch {object
11ae0 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b   invoke -flags +
11af0 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20  NonPublic \..   
11b00 20 20 20 20 20 20 20 20 20 20 20 53 79 73 74 65             Syste
11b10 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 55 6e  m.Data.SQLite.Un
11b20 73 61 66 65 4e 61 74 69 76 65 4d 65 74 68 6f 64  safeNativeMethod
11b30 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
11b40 20 20 20 73 71 6c 69 74 65 33 5f 6d 65 6d 6f 72     sqlite3_memor
11b50 79 5f 68 69 67 68 77 61 74 65 72 20 30 7d 20 6d  y_highwater 0} m
11b60 65 6d 6f 72 79 5d 20 3d 3d 20 30 7d 20 74 68 65  emory] == 0} the
11b70 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20  n {..        if 
11b80 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b  {!$quiet} then {
11b90 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70 75 74  ..          tput
11ba0 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  s $channel [appe
11bb0 6e 64 41 72 67 73 20 24 6d 65 6d 6f 72 79 20 22  ndArgs $memory "
11bc0 20 62 79 74 65 73 5c 6e 22 5d 0d 0a 20 20 20 20   bytes\n"]..    
11bd0 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 20 65      }..      } e
11be0 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  lse {..        #
11bf0 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
11c00 3a 20 4d 61 79 62 65 20 74 68 65 20 53 51 4c 69  : Maybe the SQLi
11c10 74 65 20 63 6f 72 65 20 6c 69 62 72 61 72 79 20  te core library 
11c20 69 73 20 75 6e 61 76 61 69 6c 61 62 6c 65 3f 0d  is unavailable?.
11c30 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
11c40 20 20 20 20 73 65 74 20 6d 65 6d 6f 72 79 20 75      set memory u
11c50 6e 6b 6e 6f 77 6e 0d 0a 0d 0a 20 20 20 20 20 20  nknown....      
11c60 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74    if {!$quiet} t
11c70 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
11c80 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
11c90 5b 61 70 70 65 6e 64 41 72 67 73 20 24 6d 65 6d  [appendArgs $mem
11ca0 6f 72 79 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20  ory \n]..       
11cb0 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20   }..      }.... 
11cc0 20 20 20 20 20 69 66 20 7b 24 63 6f 6c 6c 65 63       if {$collec
11cd0 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  t} then {..     
11ce0 20 20 20 63 6f 6c 6c 65 63 74 47 61 72 62 61 67     collectGarbag
11cf0 65 20 24 63 68 61 6e 6e 65 6c 0d 0a 20 20 20 20  e $channel..    
11d00 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20    }....      if 
11d10 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b  {!$quiet} then {
11d20 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20  ..        tputs 
11d30 24 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 63  $channel "---- c
11d40 75 72 72 65 6e 74 20 6d 65 6d 6f 72 79 20 69 6e  urrent memory in
11d50 20 75 73 65 20 62 79 20 74 68 65 20 43 4c 52 2e   use by the CLR.
11d60 2e 2e 20 22 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d  .. "..      }...
11d70 0a 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63  .      if {[catc
11d80 68 20 7b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65  h {object invoke
11d90 20 47 43 20 47 65 74 54 6f 74 61 6c 4d 65 6d 6f   GC GetTotalMemo
11da0 72 79 20 66 61 6c 73 65 7d 20 6d 65 6d 6f 72 79  ry false} memory
11db0 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  ] == 0} then {..
11dc0 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72          if {[str
11dd0 69 6e 67 20 69 73 20 69 6e 74 65 67 65 72 20 2d  ing is integer -
11de0 73 74 72 69 63 74 20 24 6d 65 6d 6f 72 79 5d 7d  strict $memory]}
11df0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
11e00 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20     if {!$quiet} 
11e10 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
11e20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
11e30 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 24  el [appendArgs $
11e40 6d 65 6d 6f 72 79 20 22 20 62 79 74 65 73 5c 6e  memory " bytes\n
11e50 22 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d  "]..          }.
11e60 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20  .        } else 
11e70 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74  {..          set
11e80 20 6d 65 6d 6f 72 79 20 69 6e 76 61 6c 69 64 0d   memory invalid.
11e90 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20  ...          if 
11ea0 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b  {!$quiet} then {
11eb0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70  ..            tp
11ec0 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70  uts $channel [ap
11ed0 70 65 6e 64 41 72 67 73 20 24 6d 65 6d 6f 72 79  pendArgs $memory
11ee0 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20   \n]..          
11ef0 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  }..        }..  
11f00 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
11f10 20 20 20 20 20 20 73 65 74 20 6d 65 6d 6f 72 79        set memory
11f20 20 75 6e 6b 6e 6f 77 6e 0d 0a 0d 0a 20 20 20 20   unknown....    
11f30 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d      if {!$quiet}
11f40 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
11f50 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
11f60 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 24 6d  l [appendArgs $m
11f70 65 6d 6f 72 79 20 5c 6e 5d 0d 0a 20 20 20 20 20  emory \n]..     
11f80 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d     }..      }...
11f90 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 72  .      return $r
11fa0 65 73 75 6c 74 0d 0a 20 20 20 20 7d 0d 0a 0c 0d  esult..    }....
11fb0 0a 20 20 20 20 70 72 6f 63 20 63 68 65 63 6b 46  .    proc checkF
11fc0 6f 72 53 51 4c 69 74 65 44 69 72 65 63 74 6f 72  orSQLiteDirector
11fd0 69 65 73 20 7b 20 63 68 61 6e 6e 65 6c 20 7b 72  ies { channel {r
11fe0 65 73 65 74 20 66 61 6c 73 65 7d 20 7d 20 7b 0d  eset false} } {.
11ff0 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
12000 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 69 66  # NOTE: Check if
12010 20 74 68 65 20 73 71 6c 69 74 65 33 5f 77 69 6e   the sqlite3_win
12020 33 32 5f 73 65 74 5f 64 69 72 65 63 74 6f 72 79  32_set_directory
12030 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 76 61   function is ava
12040 69 6c 61 62 6c 65 2e 0d 0a 20 20 20 20 20 20 23  ilable...      #
12050 0d 0a 20 20 20 20 20 20 74 70 75 74 73 20 24 63  ..      tputs $c
12060 68 61 6e 6e 65 6c 20 5c 0d 0a 20 20 20 20 20 20  hannel \..      
12070 20 20 20 20 22 2d 2d 2d 2d 20 63 68 65 63 6b 69      "---- checki
12080 6e 67 20 66 6f 72 20 66 75 6e 63 74 69 6f 6e 20  ng for function 
12090 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 65  sqlite3_win32_se
120a0 74 5f 64 69 72 65 63 74 6f 72 79 2e 2e 2e 20 22  t_directory... "
120b0 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  ....      #..   
120c0 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 69 73 20     # NOTE: This 
120d0 63 61 6c 6c 20 74 6f 20 74 68 65 20 73 71 6c 69  call to the sqli
120e0 74 65 33 5f 77 69 6e 33 32 5f 73 65 74 5f 64 69  te3_win32_set_di
120f0 72 65 63 74 6f 72 79 20 66 75 6e 63 74 69 6f 6e  rectory function
12100 20 75 73 65 73 20 74 68 65 0d 0a 20 20 20 20 20   uses the..     
12110 20 23 20 20 20 20 20 20 20 69 6e 76 61 6c 69 64   #       invalid
12120 20 76 61 6c 75 65 20 30 20 66 6f 72 20 74 68 65   value 0 for the
12130 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e   first argument.
12140 20 20 54 68 69 73 20 63 6f 64 65 20 69 73 20 64    This code is d
12150 65 73 69 67 6e 65 64 0d 0a 20 20 20 20 20 20 23  esigned..      #
12160 20 20 20 20 20 20 20 74 6f 20 63 68 65 63 6b 20         to check 
12170 69 66 20 63 61 6c 6c 69 6e 67 20 74 68 65 20 66  if calling the f
12180 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 72 61 69  unction will rai
12190 73 65 20 61 6e 20 65 78 63 65 70 74 69 6f 6e 20  se an exception 
121a0 28 69 2e 65 2e 0d 0a 20 20 20 20 20 20 23 20 20  (i.e...      #  
121b0 20 20 20 20 20 74 68 65 20 61 63 74 75 61 6c 20       the actual 
121c0 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 66 75  result of the fu
121d0 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20  nction does not 
121e0 6d 61 74 74 65 72 20 61 73 20 6c 6f 6e 67 20 61  matter as long a
121f0 73 20 6e 6f 0d 0a 20 20 20 20 20 20 23 20 20 20  s no..      #   
12200 20 20 20 20 64 69 72 65 63 74 6f 72 79 20 69 73      directory is
12210 20 63 68 61 6e 67 65 64 29 2e 0d 0a 20 20 20 20   changed)...    
12220 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b    #..      if {[
12230 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20  catch {..       
12240 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e         object in
12250 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e  voke -flags +Non
12260 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20  Public \..      
12270 20 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44          System.D
12280 61 74 61 2e 53 51 4c 69 74 65 2e 55 6e 73 61 66  ata.SQLite.Unsaf
12290 65 4e 61 74 69 76 65 4d 65 74 68 6f 64 73 20 5c  eNativeMethods \
122a0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
122b0 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 65  sqlite3_win32_se
122c0 74 5f 64 69 72 65 63 74 6f 72 79 20 30 20 6e 75  t_directory 0 nu
122d0 6c 6c 7d 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20  ll}] == 0} then 
122e0 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
122f0 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 61        # NOTE: Ca
12300 6c 6c 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65  lling the sqlite
12310 33 5f 77 69 6e 33 32 5f 73 65 74 5f 64 69 72 65  3_win32_set_dire
12320 63 74 6f 72 79 20 66 75 6e 63 74 69 6f 6e 20 64  ctory function d
12330 6f 65 73 20 6e 6f 74 0d 0a 20 20 20 20 20 20 20  oes not..       
12340 20 23 20 20 20 20 20 20 20 63 61 75 73 65 20 61   #       cause a
12350 6e 20 65 78 63 65 70 74 69 6f 6e 3b 20 74 68 65  n exception; the
12360 72 65 66 6f 72 65 2c 20 69 74 20 6d 75 73 74 20  refore, it must 
12370 62 65 20 61 76 61 69 6c 61 62 6c 65 20 28 69 2e  be available (i.
12380 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  e...        #   
12390 20 20 20 20 65 76 65 6e 20 74 68 6f 75 67 68 20      even though 
123a0 69 74 20 73 68 6f 75 6c 64 20 72 65 74 75 72 6e  it should return
123b0 20 61 20 66 61 69 6c 75 72 65 20 72 65 74 75 72   a failure retur
123c0 6e 20 63 6f 64 65 20 69 6e 20 74 68 69 73 0d 0a  n code in this..
123d0 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
123e0 63 61 73 65 29 2e 0d 0a 20 20 20 20 20 20 20 20  case)...        
123f0 23 0d 0a 20 20 20 20 20 20 20 20 61 64 64 43 6f  #..        addCo
12400 6e 73 74 72 61 69 6e 74 20 73 71 6c 69 74 65 33  nstraint sqlite3
12410 5f 77 69 6e 33 32 5f 73 65 74 5f 64 69 72 65 63  _win32_set_direc
12420 74 6f 72 79 0d 0a 0d 0a 20 20 20 20 20 20 20 20  tory....        
12430 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 79  tputs $channel y
12440 65 73 5c 6e 0d 0a 0d 0a 20 20 20 20 20 20 20 20  es\n....        
12450 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
12460 45 3a 20 44 6f 65 73 20 6f 75 72 20 63 61 6c 6c  E: Does our call
12470 65 72 20 77 61 6e 74 20 74 6f 20 72 65 73 65 74  er want to reset
12480 20 74 68 65 20 64 69 72 65 63 74 6f 72 69 65 73   the directories
12490 3f 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ?..        #..  
124a0 20 20 20 20 20 20 69 66 20 7b 24 72 65 73 65 74        if {$reset
124b0 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
124c0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
124d0 20 23 20 4e 4f 54 45 3a 20 4e 6f 77 20 6d 61 6b   # NOTE: Now mak
124e0 65 20 73 75 72 65 20 74 68 65 20 64 61 74 61 62  e sure the datab
124f0 61 73 65 20 61 6e 64 20 74 65 6d 70 6f 72 61 72  ase and temporar
12500 79 20 64 69 72 65 63 74 6f 72 69 65 73 20 61 72  y directories ar
12510 65 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 20  e..          #  
12520 20 20 20 20 20 72 65 73 65 74 20 74 68 65 69 72       reset their
12530 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 73 2c   default values,
12540 20 77 68 69 63 68 20 73 68 6f 75 6c 64 20 62 65   which should be
12550 20 6e 75 6c 6c 20 66 6f 72 20 62 6f 74 68 2e 0d   null for both..
12560 0a 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20  .          #    
12570 20 20 20 53 69 6e 63 65 20 74 68 65 20 73 71 6c     Since the sql
12580 69 74 65 33 5f 77 69 6e 33 32 5f 73 65 74 5f 64  ite3_win32_set_d
12590 69 72 65 63 74 6f 72 79 20 66 75 6e 63 74 69 6f  irectory functio
125a0 6e 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2c 0d  n is available,.
125b0 0a 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20  .          #    
125c0 20 20 20 75 73 65 20 69 74 2e 0d 0a 20 20 20 20     use it...    
125d0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
125e0 20 20 20 66 6f 72 20 7b 73 65 74 20 69 6e 64 65     for {set inde
125f0 78 20 31 7d 20 7b 24 69 6e 64 65 78 20 3c 20 33  x 1} {$index < 3
12600 7d 20 7b 69 6e 63 72 20 69 6e 64 65 78 7d 20 7b  } {incr index} {
12610 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ..            if
12620 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20   {[catch {..    
12630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12640 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66  object invoke -f
12650 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20  lags +NonPublic 
12660 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
12670 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61         System.Da
12680 74 61 2e 53 51 4c 69 74 65 2e 55 6e 73 61 66 65  ta.SQLite.Unsafe
12690 4e 61 74 69 76 65 4d 65 74 68 6f 64 73 20 5c 0d  NativeMethods \.
126a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
126b0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 77 69 6e       sqlite3_win
126c0 33 32 5f 73 65 74 5f 64 69 72 65 63 74 6f 72 79  32_set_directory
126d0 20 24 69 6e 64 65 78 20 6e 75 6c 6c 7d 20 5c 0d   $index null} \.
126e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
126f0 20 20 20 20 20 72 65 73 75 6c 74 5d 20 3d 3d 20       result] == 
12700 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
12710 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
12720 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
12730 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
12740 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63           "---- c
12750 61 6c 6c 20 73 71 6c 69 74 65 33 5f 77 69 6e 33  all sqlite3_win3
12760 32 5f 73 65 74 5f 64 69 72 65 63 74 6f 72 79 28  2_set_directory(
12770 22 20 24 69 6e 64 65 78 20 5c 0d 0a 20 20 20 20  " $index \..    
12780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2c                ",
12790 20 6e 75 6c 6c 29 2e 2e 2e 20 6f 6b 3a 20 22 20   null)... ok: " 
127a0 24 72 65 73 75 6c 74 20 5c 6e 5d 0d 0a 20 20 20  $result \n]..   
127b0 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20           } else 
127c0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
127d0 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
127e0 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
127f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12800 20 22 2d 2d 2d 2d 20 63 61 6c 6c 20 73 71 6c 69   "---- call sqli
12810 74 65 33 5f 77 69 6e 33 32 5f 73 65 74 5f 64 69  te3_win32_set_di
12820 72 65 63 74 6f 72 79 28 22 20 24 69 6e 64 65 78  rectory(" $index
12830 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
12840 20 20 20 20 20 20 22 2c 20 6e 75 6c 6c 29 2e 2e        ", null)..
12850 2e 20 65 72 72 6f 72 3a 20 22 20 5c 6e 5c 74 20  . error: " \n\t 
12860 24 72 65 73 75 6c 74 20 5c 6e 5d 0d 0a 20 20 20  $result \n]..   
12870 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
12880 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
12890 20 7d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65   }..      } else
128a0 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74   {..        tput
128b0 73 20 24 63 68 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d  s $channel no\n.
128c0 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
128d0 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 44 6f        # NOTE: Do
128e0 65 73 20 6f 75 72 20 63 61 6c 6c 65 72 20 77 61  es our caller wa
128f0 6e 74 20 74 6f 20 72 65 73 65 74 20 74 68 65 20  nt to reset the 
12900 64 69 72 65 63 74 6f 72 69 65 73 3f 20 20 54 68  directories?  Th
12910 69 73 20 63 61 6e 20 6f 6e 6c 79 0d 0a 20 20 20  is can only..   
12920 20 20 20 20 20 23 20 20 20 20 20 20 20 62 65 20       #       be 
12930 70 65 72 66 6f 72 6d 65 64 20 69 66 20 53 51 4c  performed if SQL
12940 69 74 65 20 69 73 20 6c 6f 61 64 65 64 20 61 6e  ite is loaded an
12950 64 20 72 65 61 64 79 20 66 6f 72 20 75 73 65 20  d ready for use 
12960 62 79 20 74 68 65 20 74 65 73 74 0d 0a 20 20 20  by the test..   
12970 20 20 20 20 20 23 20 20 20 20 20 20 20 73 75 69       #       sui
12980 74 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  te...        #..
12990 20 20 20 20 20 20 20 20 69 66 20 7b 24 72 65 73          if {$res
129a0 65 74 20 26 26 20 5b 69 73 53 51 4c 69 74 65 52  et && [isSQLiteR
129b0 65 61 64 79 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  eady]} then {.. 
129c0 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
129d0 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4e 6f        # NOTE: No
129e0 77 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20  w make sure the 
129f0 64 61 74 61 62 61 73 65 20 61 6e 64 20 74 65 6d  database and tem
12a00 70 6f 72 61 72 79 20 64 69 72 65 63 74 6f 72 69  porary directori
12a10 65 73 20 61 72 65 0d 0a 20 20 20 20 20 20 20 20  es are..        
12a20 20 20 23 20 20 20 20 20 20 20 72 65 73 65 74 20    #       reset 
12a30 74 68 65 69 72 20 64 65 66 61 75 6c 74 20 76 61  their default va
12a40 6c 75 65 73 2c 20 77 68 69 63 68 20 73 68 6f 75  lues, which shou
12a50 6c 64 20 62 65 20 6e 75 6c 6c 20 66 6f 72 20 62  ld be null for b
12a60 6f 74 68 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  oth...          
12a70 23 20 20 20 20 20 20 20 53 69 6e 63 65 20 74 68  #       Since th
12a80 65 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f  e sqlite3_win32_
12a90 73 65 74 5f 64 69 72 65 63 74 6f 72 79 20 66 75  set_directory fu
12aa0 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 0d  nction does not.
12ab0 0a 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20  .          #    
12ac0 20 20 20 61 70 70 65 61 72 20 74 6f 20 62 65 20     appear to be 
12ad0 61 76 61 69 6c 61 62 6c 65 2c 20 75 73 65 20 74  available, use t
12ae0 68 65 20 61 73 73 6f 63 69 61 74 65 64 20 50 52  he associated PR
12af0 41 47 4d 41 20 63 6f 6d 6d 61 6e 64 73 0d 0a 20  AGMA commands.. 
12b00 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20           #      
12b10 20 69 6e 73 74 65 61 64 2e 0d 0a 20 20 20 20 20   instead...     
12b20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
12b30 20 20 66 6f 72 65 61 63 68 20 64 69 72 65 63 74    foreach direct
12b40 6f 72 79 20 5b 6c 69 73 74 20 64 61 74 61 5f 73  ory [list data_s
12b50 74 6f 72 65 5f 64 69 72 65 63 74 6f 72 79 20 74  tore_directory t
12b60 65 6d 70 5f 73 74 6f 72 65 5f 64 69 72 65 63 74  emp_store_direct
12b70 6f 72 79 5d 20 7b 0d 0a 20 20 20 20 20 20 20 20  ory] {..        
12b80 20 20 20 20 73 65 74 20 73 71 6c 20 5b 61 70 70      set sql [app
12b90 65 6e 64 41 72 67 73 20 22 50 52 41 47 4d 41 20  endArgs "PRAGMA 
12ba0 22 20 24 64 69 72 65 63 74 6f 72 79 20 22 20 3d  " $directory " =
12bb0 20 5c 22 5c 22 3b 22 5d 0d 0a 0d 0a 20 20 20 20   \"\";"]....    
12bc0 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74          if {[cat
12bd0 63 68 20 7b 65 78 65 63 75 74 65 53 71 6c 20 24  ch {executeSql $
12be0 73 71 6c 7d 20 72 65 73 75 6c 74 5d 20 3d 3d 20  sql} result] == 
12bf0 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
12c00 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
12c10 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
12c20 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
12c30 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 65           "---- e
12c40 78 65 63 75 74 65 20 50 52 41 47 4d 41 20 22 20  xecute PRAGMA " 
12c50 24 64 69 72 65 63 74 6f 72 79 20 22 2e 2e 2e 20  $directory "... 
12c60 6f 6b 3a 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20  ok: \"" \..     
12c70 20 20 20 20 20 20 20 20 20 20 20 20 20 24 72 65               $re
12c80 73 75 6c 74 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20  sult \"\n]..    
12c90 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b          } else {
12ca0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
12cb0 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b  tputs $channel [
12cc0 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
12cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12ce0 22 2d 2d 2d 2d 20 65 78 65 63 75 74 65 20 50 52  "---- execute PR
12cf0 41 47 4d 41 20 22 20 24 64 69 72 65 63 74 6f 72  AGMA " $director
12d00 79 20 22 2e 2e 2e 20 65 72 72 6f 72 3a 20 22 20  y "... error: " 
12d10 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
12d20 20 20 20 20 20 5c 6e 5c 74 20 24 72 65 73 75 6c       \n\t $resul
12d30 74 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20  t \n]..         
12d40 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
12d50 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  }..        }..  
12d60 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23      }....      #
12d70 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
12d80 46 69 6e 61 6c 6c 79 2c 20 73 68 6f 77 20 74 68  Finally, show th
12d90 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20  e current value 
12da0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
12db0 61 6e 64 20 74 65 6d 70 6f 72 61 72 79 0d 0a 20  and temporary.. 
12dc0 20 20 20 20 20 23 20 20 20 20 20 20 20 64 69 72       #       dir
12dd0 65 63 74 6f 72 69 65 73 2e 20 20 54 68 69 73 20  ectories.  This 
12de0 63 61 6e 20 6f 6e 6c 79 20 62 65 20 70 65 72 66  can only be perf
12df0 6f 72 6d 65 64 20 69 66 20 53 51 4c 69 74 65 20  ormed if SQLite 
12e00 69 73 20 6c 6f 61 64 65 64 0d 0a 20 20 20 20 20  is loaded..     
12e10 20 23 20 20 20 20 20 20 20 61 6e 64 20 72 65 61   #       and rea
12e20 64 79 20 66 6f 72 20 75 73 65 20 62 79 20 74 68  dy for use by th
12e30 65 20 74 65 73 74 20 73 75 69 74 65 2e 0d 0a 20  e test suite... 
12e40 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66       #..      if
12e50 20 7b 5b 69 73 53 51 4c 69 74 65 52 65 61 64 79   {[isSQLiteReady
12e60 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
12e70 20 20 20 66 6f 72 65 61 63 68 20 64 69 72 65 63     foreach direc
12e80 74 6f 72 79 20 5b 6c 69 73 74 20 64 61 74 61 5f  tory [list data_
12e90 73 74 6f 72 65 5f 64 69 72 65 63 74 6f 72 79 20  store_directory 
12ea0 74 65 6d 70 5f 73 74 6f 72 65 5f 64 69 72 65 63  temp_store_direc
12eb0 74 6f 72 79 5d 20 7b 0d 0a 20 20 20 20 20 20 20  tory] {..       
12ec0 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
12ed0 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 22 2d  l [appendArgs "-
12ee0 2d 2d 2d 20 63 68 65 63 6b 69 6e 67 20 22 20 24  --- checking " $
12ef0 64 69 72 65 63 74 6f 72 79 20 22 2e 2e 2e 20 22  directory "... "
12f00 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 73  ]....          s
12f10 65 74 20 73 71 6c 20 5b 61 70 70 65 6e 64 41 72  et sql [appendAr
12f20 67 73 20 22 50 52 41 47 4d 41 20 22 20 24 64 69  gs "PRAGMA " $di
12f30 72 65 63 74 6f 72 79 20 5c 3b 5d 0d 0a 0d 0a 20  rectory \;].... 
12f40 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61           if {[ca
12f50 74 63 68 20 7b 65 78 65 63 75 74 65 53 71 6c 20  tch {executeSql 
12f60 24 73 71 6c 20 73 63 61 6c 61 72 7d 20 72 65 73  $sql scalar} res
12f70 75 6c 74 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20  ult] == 0} then 
12f80 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  {..            t
12f90 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61  puts $channel [a
12fa0 70 70 65 6e 64 41 72 67 73 20 22 6f 6b 3a 20 5c  ppendArgs "ok: \
12fb0 22 22 20 24 72 65 73 75 6c 74 20 5c 22 5c 6e 5d  "" $result \"\n]
12fc0 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c  ..          } el
12fd0 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  se {..          
12fe0 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
12ff0 20 5b 61 70 70 65 6e 64 41 72 67 73 20 22 65 72   [appendArgs "er
13000 72 6f 72 3a 20 22 20 5c 6e 5c 74 20 24 72 65 73  ror: " \n\t $res
13010 75 6c 74 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20  ult \n]..       
13020 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d     }..        }.
13030 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d  .      }..    }.
13040 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 6c 6f 61  ....    proc loa
13050 64 53 51 4c 69 74 65 54 65 73 74 53 65 74 74 69  dSQLiteTestSetti
13060 6e 67 73 20 7b 20 63 68 61 6e 6e 65 6c 20 7b 73  ngs { channel {s
13070 75 66 66 69 78 20 22 22 7d 20 7b 71 75 69 65 74  uffix ""} {quiet
13080 20 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a 20 20 20   false} } {..   
13090 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
130a0 54 45 3a 20 53 6b 69 70 20 6c 6f 61 64 69 6e 67  TE: Skip loading
130b0 20 74 68 65 20 73 65 74 74 69 6e 67 73 20 69 66   the settings if
130c0 20 74 68 65 69 72 20 75 73 61 67 65 20 68 61 73   their usage has
130d0 20 62 65 65 6e 20 64 69 73 61 62 6c 65 64 2e 0d   been disabled..
130e0 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
130f0 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74  if {![info exist
13100 73 20 3a 3a 6e 6f 28 73 71 6c 69 74 65 54 65 73  s ::no(sqliteTes
13110 74 53 65 74 74 69 6e 67 73 29 5d 7d 20 74 68 65  tSettings)]} the
13120 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  n {..        #..
13130 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
13140 4c 6f 61 64 20 63 75 73 74 6f 6d 20 70 65 72 2d  Load custom per-
13150 75 73 65 72 20 61 6e 64 2f 6f 72 20 70 65 72 2d  user and/or per-
13160 68 6f 73 74 20 74 65 73 74 20 73 65 74 74 69 6e  host test settin
13170 67 73 20 6e 6f 77 2e 0d 0a 20 20 20 20 20 20 20  gs now...       
13180 20 23 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b   #..        if {
13190 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 74  [info exists ::t
131a0 63 6c 5f 70 6c 61 74 66 6f 72 6d 28 75 73 65 72  cl_platform(user
131b0 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  )]} then {..    
131c0 20 20 20 20 20 20 73 65 74 20 75 73 65 72 53 65        set userSe
131d0 74 74 69 6e 67 73 46 69 6c 65 4e 61 6d 65 20 5b  ttingsFileName [
131e0 66 69 6c 65 20 6a 6f 69 6e 20 5b 67 65 74 43 6f  file join [getCo
131f0 6d 6d 6f 6e 44 69 72 65 63 74 6f 72 79 5d 20 5c  mmonDirectory] \
13200 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
13210 5b 61 70 70 65 6e 64 41 72 67 73 20 73 65 74 74  [appendArgs sett
13220 69 6e 67 73 20 24 73 75 66 66 69 78 20 2e 20 24  ings $suffix . $
13230 3a 3a 74 63 6c 5f 70 6c 61 74 66 6f 72 6d 28 75  ::tcl_platform(u
13240 73 65 72 29 20 2e 65 61 67 6c 65 5d 5d 0d 0a 0d  ser) .eagle]]...
13250 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b  .          if {[
13260 66 69 6c 65 20 65 78 69 73 74 73 20 24 75 73 65  file exists $use
13270 72 53 65 74 74 69 6e 67 73 46 69 6c 65 4e 61 6d  rSettingsFileNam
13280 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  e]} then {..    
13290 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75          if {!$qu
132a0 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  iet} then {..   
132b0 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
132c0 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e   $channel [appen
132d0 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
132e0 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
132f0 20 6c 6f 61 64 69 6e 67 20 70 65 72 2d 75 73 65   loading per-use
13300 72 20 74 65 73 74 20 73 65 74 74 69 6e 67 73 20  r test settings 
13310 66 69 6c 65 20 5c 22 22 20 5c 0d 0a 20 20 20 20  file \"" \..    
13320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 24 75                $u
13330 73 65 72 53 65 74 74 69 6e 67 73 46 69 6c 65 4e  serSettingsFileN
13340 61 6d 65 20 5c 22 2e 2e 2e 5c 6e 5d 0d 0a 20 20  ame \"...\n]..  
13350 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20            }.... 
13360 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b             if {[
13370 63 61 74 63 68 20 7b 75 70 6c 65 76 65 6c 20 31  catch {uplevel 1
13380 20 5b 6c 69 73 74 20 73 6f 75 72 63 65 20 24 75   [list source $u
13390 73 65 72 53 65 74 74 69 6e 67 73 46 69 6c 65 4e  serSettingsFileN
133a0 61 6d 65 5d 7d 20 5c 0d 0a 20 20 20 20 20 20 20  ame]} \..       
133b0 20 20 20 20 20 20 20 20 20 20 20 20 20 65 72 72               err
133c0 6f 72 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  or]} then {..   
133d0 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21             if {!
133e0 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a  $quiet} then {..
133f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13400 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b  tputs $channel [
13410 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
13420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13430 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a    "==== WARNING:
13440 20 66 61 69 6c 65 64 20 74 6f 20 6c 6f 61 64 20   failed to load 
13450 70 65 72 2d 75 73 65 72 20 73 65 74 74 69 6e 67  per-user setting
13460 73 20 66 69 6c 65 20 5c 22 22 20 5c 0d 0a 20 20  s file \"" \..  
13470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13480 20 20 24 75 73 65 72 53 65 74 74 69 6e 67 73 46    $userSettingsF
13490 69 6c 65 4e 61 6d 65 20 22 5c 22 2c 20 65 72 72  ileName "\", err
134a0 6f 72 3a 20 22 20 5c 6e 5c 74 20 24 65 72 72 6f  or: " \n\t $erro
134b0 72 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20  r \n]..         
134c0 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
134d0 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
134e0 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
134f0 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69         if {!$qui
13500 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  et} then {..    
13510 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
13520 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  $channel [append
13530 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
13540 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
13550 73 6b 69 70 70 65 64 20 6c 6f 61 64 69 6e 67 20  skipped loading 
13560 70 65 72 2d 75 73 65 72 20 74 65 73 74 20 73 65  per-user test se
13570 74 74 69 6e 67 73 20 66 69 6c 65 20 5c 22 22 20  ttings file \"" 
13580 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
13590 20 20 20 20 20 24 75 73 65 72 53 65 74 74 69 6e       $userSettin
135a0 67 73 46 69 6c 65 4e 61 6d 65 20 22 5c 22 2c 20  gsFileName "\", 
135b0 69 74 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73  it does not exis
135c0 74 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20 20  t\n"]..         
135d0 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
135e0 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  }..        }....
135f0 20 20 20 20 20 20 20 20 23 23 23 23 23 23 23 23          ########
13600 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
13610 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
13620 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
13630 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0d  ###############.
13640 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b  ...        if {[
13650 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 74 63  info exists ::tc
13660 6c 5f 70 6c 61 74 66 6f 72 6d 28 68 6f 73 74 29  l_platform(host)
13670 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
13680 20 20 20 20 20 73 65 74 20 68 6f 73 74 53 65 74       set hostSet
13690 74 69 6e 67 73 46 69 6c 65 4e 61 6d 65 20 5b 66  tingsFileName [f
136a0 69 6c 65 20 6a 6f 69 6e 20 5b 67 65 74 43 6f 6d  ile join [getCom
136b0 6d 6f 6e 44 69 72 65 63 74 6f 72 79 5d 20 5c 0d  monDirectory] \.
136c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b  .              [
136d0 61 70 70 65 6e 64 41 72 67 73 20 73 65 74 74 69  appendArgs setti
136e0 6e 67 73 20 24 73 75 66 66 69 78 20 2e 20 24 3a  ngs $suffix . $:
136f0 3a 74 63 6c 5f 70 6c 61 74 66 6f 72 6d 28 68 6f  :tcl_platform(ho
13700 73 74 29 20 2e 65 61 67 6c 65 5d 5d 0d 0a 0d 0a  st) .eagle]]....
13710 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 66            if {[f
13720 69 6c 65 20 65 78 69 73 74 73 20 24 68 6f 73 74  ile exists $host
13730 53 65 74 74 69 6e 67 73 46 69 6c 65 4e 61 6d 65  SettingsFileName
13740 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
13750 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69         if {!$qui
13760 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  et} then {..    
13770 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
13780 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  $channel [append
13790 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
137a0 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
137b0 6c 6f 61 64 69 6e 67 20 70 65 72 2d 68 6f 73 74  loading per-host
137c0 20 74 65 73 74 20 73 65 74 74 69 6e 67 73 20 66   test settings f
137d0 69 6c 65 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20  ile \"" \..     
137e0 20 20 20 20 20 20 20 20 20 20 20 20 20 24 68 6f               $ho
137f0 73 74 53 65 74 74 69 6e 67 73 46 69 6c 65 4e 61  stSettingsFileNa
13800 6d 65 20 5c 22 2e 2e 2e 5c 6e 5d 0d 0a 20 20 20  me \"...\n]..   
13810 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20           }....  
13820 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63            if {[c
13830 61 74 63 68 20 7b 75 70 6c 65 76 65 6c 20 31 20  atch {uplevel 1 
13840 5b 6c 69 73 74 20 73 6f 75 72 63 65 20 24 68 6f  [list source $ho
13850 73 74 53 65 74 74 69 6e 67 73 46 69 6c 65 4e 61  stSettingsFileNa
13860 6d 65 5d 7d 20 5c 0d 0a 20 20 20 20 20 20 20 20  me]} \..        
13870 20 20 20 20 20 20 20 20 20 20 20 20 65 72 72 6f              erro
13880 72 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  r]} then {..    
13890 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 24            if {!$
138a0 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20  quiet} then {.. 
138b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
138c0 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61  puts $channel [a
138d0 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
138e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
138f0 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20   "==== WARNING: 
13900 66 61 69 6c 65 64 20 74 6f 20 6c 6f 61 64 20 70  failed to load p
13910 65 72 2d 68 6f 73 74 20 73 65 74 74 69 6e 67 73  er-host settings
13920 20 66 69 6c 65 20 5c 22 22 20 5c 0d 0a 20 20 20   file \"" \..   
13930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13940 20 24 68 6f 73 74 53 65 74 74 69 6e 67 73 46 69   $hostSettingsFi
13950 6c 65 4e 61 6d 65 20 22 5c 22 2c 20 65 72 72 6f  leName "\", erro
13960 72 3a 20 22 20 5c 6e 5c 74 20 24 65 72 72 6f 72  r: " \n\t $error
13970 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20   \n]..          
13980 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
13990 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
139a0 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
139b0 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65        if {!$quie
139c0 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  t} then {..     
139d0 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
139e0 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
139f0 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
13a00 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 73           "---- s
13a10 6b 69 70 70 65 64 20 6c 6f 61 64 69 6e 67 20 70  kipped loading p
13a20 65 72 2d 68 6f 73 74 20 74 65 73 74 20 73 65 74  er-host test set
13a30 74 69 6e 67 73 20 66 69 6c 65 20 5c 22 22 20 5c  tings file \"" \
13a40 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
13a50 20 20 20 20 24 68 6f 73 74 53 65 74 74 69 6e 67      $hostSetting
13a60 73 46 69 6c 65 4e 61 6d 65 20 22 5c 22 2c 20 69  sFileName "\", i
13a70 74 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74  t does not exist
13a80 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20 20 20  \n"]..          
13a90 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d    }..          }
13aa0 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20  ..        }..   
13ab0 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a     }..    }.....
13ac0 20 20 20 20 70 72 6f 63 20 72 75 6e 53 51 4c 69      proc runSQLi
13ad0 74 65 54 65 73 74 50 72 6f 6c 6f 67 75 65 20 7b  teTestPrologue {
13ae0 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  } {..      #..  
13af0 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 6b 69 70      # NOTE: Skip
13b00 20 72 75 6e 6e 69 6e 67 20 6f 75 72 20 63 75 73   running our cus
13b10 74 6f 6d 20 70 72 6f 6c 6f 67 75 65 20 69 66 20  tom prologue if 
13b20 74 68 65 20 6d 61 69 6e 20 6f 6e 65 20 68 61 73  the main one has
13b30 20 62 65 65 6e 0d 0a 20 20 20 20 20 20 23 20 20   been..      #  
13b40 20 20 20 20 20 73 6b 69 70 70 65 64 2e 0d 0a 20       skipped... 
13b50 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66       #..      if
13b60 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20   {![info exists 
13b70 3a 3a 6e 6f 28 70 72 6f 6c 6f 67 75 65 2e 65 61  ::no(prologue.ea
13b80 67 6c 65 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  gle)]} then {.. 
13b90 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
13ba0 20 20 23 20 4e 4f 54 45 3a 20 4c 6f 61 64 20 74    # NOTE: Load t
13bb0 68 65 20 22 62 65 66 6f 72 65 2d 63 6f 6e 73 74  he "before-const
13bc0 72 61 69 6e 74 73 22 20 63 75 73 74 6f 6d 20 70  raints" custom p
13bd0 65 72 2d 75 73 65 72 20 61 6e 64 2f 6f 72 20 70  er-user and/or p
13be0 65 72 2d 68 6f 73 74 0d 0a 20 20 20 20 20 20 20  er-host..       
13bf0 20 23 20 20 20 20 20 20 20 74 65 73 74 20 73 65   #       test se
13c00 74 74 69 6e 67 73 20 6e 6f 77 2e 0d 0a 20 20 20  ttings now...   
13c10 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
13c20 75 70 6c 65 76 65 6c 20 31 20 5b 6c 69 73 74 20  uplevel 1 [list 
13c30 6c 6f 61 64 53 51 4c 69 74 65 54 65 73 74 53 65  loadSQLiteTestSe
13c40 74 74 69 6e 67 73 20 24 3a 3a 74 65 73 74 5f 63  ttings $::test_c
13c50 68 61 6e 6e 65 6c 20 2e 62 65 66 6f 72 65 5d 0d  hannel .before].
13c60 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
13c70 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 44 65        # NOTE: De
13c80 74 65 72 6d 69 6e 65 20 74 68 65 20 6e 61 6d 65  termine the name
13c90 73 20 6f 66 20 74 68 65 20 6e 61 74 69 76 65 20  s of the native 
13ca0 70 6c 61 74 66 6f 72 6d 20 61 6e 64 20 61 72 63  platform and arc
13cb0 68 69 74 65 63 74 75 72 65 2e 0d 0a 20 20 20 20  hitecture...    
13cc0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 73      #..        s
13cd0 65 74 20 70 6c 61 74 66 6f 72 6d 20 5b 67 65 74  et platform [get
13ce0 42 75 69 6c 64 50 6c 61 74 66 6f 72 6d 20 74 72  BuildPlatform tr
13cf0 75 65 5d 0d 0a 20 20 20 20 20 20 20 20 73 65 74  ue]..        set
13d00 20 61 72 63 68 69 74 65 63 74 75 72 65 20 5b 61   architecture [a
13d10 72 63 68 69 74 65 63 74 75 72 65 46 6f 72 50 6c  rchitectureForPl
13d20 61 74 66 6f 72 6d 20 24 70 6c 61 74 66 6f 72 6d  atform $platform
13d30 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  ]....        #..
13d40 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
13d50 53 68 6f 77 20 74 68 65 20 70 6c 61 74 66 6f 72  Show the platfor
13d60 6d 20 61 6e 64 20 61 72 63 68 69 74 65 63 74 75  m and architectu
13d70 72 65 20 75 73 65 64 20 74 6f 20 68 65 6c 70 20  re used to help 
13d80 6c 6f 63 61 74 65 20 74 68 65 0d 0a 20 20 20 20  locate the..    
13d90 20 20 20 20 23 20 20 20 20 20 20 20 6e 61 74 69      #       nati
13da0 76 65 20 62 75 69 6c 64 20 66 69 6c 65 73 2e 0d  ve build files..
13db0 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
13dc0 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
13dd0 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e  t_channel [appen
13de0 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
13df0 20 20 20 20 20 22 2d 2d 2d 2d 20 70 6c 61 74 66       "---- platf
13e00 6f 72 6d 20 66 6f 72 20 6c 6f 63 61 74 69 6e 67  orm for locating
13e10 20 6e 61 74 69 76 65 20 62 75 69 6c 64 20 66 69   native build fi
13e20 6c 65 73 20 69 73 20 5c 22 22 20 5c 0d 0a 20 20  les is \"" \..  
13e30 20 20 20 20 20 20 20 20 20 20 24 70 6c 61 74 66            $platf
13e40 6f 72 6d 20 5c 22 5c 6e 5d 0d 0a 0d 0a 20 20 20  orm \"\n]....   
13e50 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
13e60 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
13e70 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
13e80 20 20 20 20 20 20 22 2d 2d 2d 2d 20 61 72 63 68        "---- arch
13e90 69 74 65 63 74 75 72 65 20 66 6f 72 20 6c 6f 63  itecture for loc
13ea0 61 74 69 6e 67 20 6e 61 74 69 76 65 20 62 75 69  ating native bui
13eb0 6c 64 20 66 69 6c 65 73 20 69 73 20 5c 22 22 20  ld files is \"" 
13ec0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 24  \..            $
13ed0 61 72 63 68 69 74 65 63 74 75 72 65 20 5c 22 5c  architecture \"\
13ee0 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d  n]....        #.
13ef0 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
13f00 20 42 75 69 6c 64 20 61 20 6c 69 73 74 20 6f 66   Build a list of
13f10 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 66   configuration f
13f20 69 6c 65 73 20 74 68 61 74 20 77 65 20 68 61 6e  iles that we han
13f30 64 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  dle...        #.
13f40 0a 20 20 20 20 20 20 20 20 73 65 74 20 63 6f 6e  .        set con
13f50 66 69 67 46 69 6c 65 4e 61 6d 65 73 20 5b 6c 69  figFileNames [li
13f60 73 74 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  st \..          
13f70 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51    System.Data.SQ
13f80 4c 69 74 65 2e 64 6c 6c 2e 63 6f 6e 66 69 67 5d  Lite.dll.config]
13f90 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  ....        #.. 
13fa0 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 42         # NOTE: B
13fb0 75 69 6c 64 20 61 20 6c 69 73 74 20 6f 66 20 61  uild a list of a
13fc0 75 78 69 6c 69 61 72 79 20 4d 61 6e 61 67 65 64  uxiliary Managed
13fd0 20 44 65 62 75 67 67 69 6e 67 20 41 73 73 69 73   Debugging Assis
13fe0 74 61 6e 74 73 20 28 4d 44 41 29 0d 0a 20 20 20  tants (MDA)..   
13ff0 20 20 20 20 20 23 20 20 20 20 20 20 20 63 6f 6e       #       con
14000 66 69 67 75 72 61 74 69 6f 6e 20 66 69 6c 65 73  figuration files
14010 20 74 68 61 74 20 77 65 20 68 61 6e 64 6c 65 2e   that we handle.
14020 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
14030 20 20 20 20 20 73 65 74 20 6d 64 61 43 6f 6e 66       set mdaConf
14040 69 67 46 69 6c 65 4e 61 6d 65 73 20 5b 6c 69 73  igFileNames [lis
14050 74 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  t \..           
14060 20 49 6e 73 74 61 6c 6c 65 72 2e 65 78 65 2e 6d   Installer.exe.m
14070 64 61 2e 63 6f 6e 66 69 67 20 74 65 73 74 2e 65  da.config test.e
14080 78 65 2e 6d 64 61 2e 63 6f 6e 66 69 67 20 5c 0d  xe.mda.config \.
14090 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73  .            tes
140a0 74 6c 69 6e 71 2e 65 78 65 2e 6d 64 61 2e 63 6f  tlinq.exe.mda.co
140b0 6e 66 69 67 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  nfig]....       
140c0 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
140d0 54 45 3a 20 42 75 69 6c 64 20 74 68 65 20 6c 69  TE: Build the li
140e0 73 74 20 6f 66 20 6e 61 74 69 76 65 20 61 73 73  st of native ass
140f0 65 6d 62 6c 79 20 66 69 6c 65 73 20 74 68 61 74  embly files that
14100 20 77 65 20 68 61 6e 64 6c 65 2e 20 20 54 68 65   we handle.  The
14110 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
14120 20 20 72 65 61 73 6f 6e 20 74 68 65 20 22 53 79    reason the "Sy
14130 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
14140 2e 64 6c 6c 22 20 66 69 6c 65 20 69 73 20 69 6e  .dll" file is in
14150 63 6c 75 64 65 64 20 68 65 72 65 20 69 73 0d 0a  cluded here is..
14160 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
14170 62 65 63 61 75 73 65 20 69 74 20 63 6f 75 6c 64  because it could
14180 20 62 65 20 74 68 65 20 6d 69 78 65 64 2d 6d 6f   be the mixed-mo
14190 64 65 20 61 73 73 65 6d 62 6c 79 2e 0d 0a 20 20  de assembly...  
141a0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
141b0 20 73 65 74 20 6e 61 74 69 76 65 46 69 6c 65 4e   set nativeFileN
141c0 61 6d 65 73 20 5b 6c 69 73 74 20 5c 0d 0a 20 20  ames [list \..  
141d0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
141e0 33 2e 64 6c 6c 20 53 51 4c 69 74 65 2e 49 6e 74  3.dll SQLite.Int
141f0 65 72 6f 70 2e 64 6c 6c 20 53 79 73 74 65 6d 2e  erop.dll System.
14200 44 61 74 61 2e 53 51 4c 69 74 65 2e 64 6c 6c 5d  Data.SQLite.dll]
14210 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  ....        #.. 
14220 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 42         # NOTE: B
14230 75 69 6c 64 20 74 68 65 20 6c 69 73 74 20 6f 66  uild the list of
14240 20 6d 61 6e 61 67 65 64 20 61 73 73 65 6d 62 6c   managed assembl
14250 79 20 66 69 6c 65 73 20 74 68 61 74 20 77 65 20  y files that we 
14260 68 61 6e 64 6c 65 2e 0d 0a 20 20 20 20 20 20 20  handle...       
14270 20 23 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20   #..        set 
14280 6d 61 6e 61 67 65 64 46 69 6c 65 4e 61 6d 65 73  managedFileNames
14290 20 5b 6c 69 73 74 20 5c 0d 0a 20 20 20 20 20 20   [list \..      
142a0 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74        System.Dat
142b0 61 2e 53 51 4c 69 74 65 2e 64 6c 6c 20 53 79 73  a.SQLite.dll Sys
142c0 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e  tem.Data.SQLite.
142d0 4c 69 6e 71 2e 64 6c 6c 5d 0d 0a 0d 0a 20 20 20  Linq.dll]....   
142e0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
142f0 23 20 4e 4f 54 45 3a 20 52 65 6d 6f 76 65 20 61  # NOTE: Remove a
14300 6e 79 20 74 65 73 74 20 63 6f 6e 73 74 72 61 69  ny test constrai
14310 6e 74 73 20 74 68 61 74 20 72 65 66 65 72 20 74  nts that refer t
14320 6f 20 74 68 65 20 6e 61 74 69 76 65 20 61 6e 64  o the native and
14330 2f 6f 72 0d 0a 20 20 20 20 20 20 20 20 23 20 20  /or..        #  
14340 20 20 20 20 20 6d 61 6e 61 67 65 64 20 61 73 73       managed ass
14350 65 6d 62 6c 79 20 66 69 6c 65 73 20 74 68 61 74  embly files that
14360 20 77 65 20 68 61 6e 64 6c 65 20 75 6e 6c 65 73   we handle unles
14370 73 20 66 6f 72 62 69 64 64 65 6e 20 66 72 6f 6d  s forbidden from
14380 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
14390 20 20 64 6f 69 6e 67 20 73 6f 2e 0d 0a 20 20 20    doing so...   
143a0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
143b0 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74  if {![info exist
143c0 73 20 3a 3a 6e 6f 28 73 71 6c 69 74 65 52 65 6d  s ::no(sqliteRem
143d0 6f 76 65 43 6f 6e 73 74 72 61 69 6e 74 73 29 5d  oveConstraints)]
143e0 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
143f0 20 20 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65      foreach file
14400 4e 61 6d 65 20 24 63 6f 6e 66 69 67 46 69 6c 65  Name $configFile
14410 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20 20  Names {..       
14420 20 20 20 20 20 72 65 6d 6f 76 65 43 6f 6e 73 74       removeConst
14430 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67  raint [appendArg
14440 73 20 66 69 6c 65 5f 20 24 66 69 6c 65 4e 61 6d  s file_ $fileNam
14450 65 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d  e]..          }.
14460 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72  ...          for
14470 65 61 63 68 20 66 69 6c 65 4e 61 6d 65 20 24 6d  each fileName $m
14480 64 61 43 6f 6e 66 69 67 46 69 6c 65 4e 61 6d 65  daConfigFileName
14490 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s {..           
144a0 20 72 65 6d 6f 76 65 43 6f 6e 73 74 72 61 69 6e   removeConstrain
144b0 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20 66 69  t [appendArgs fi
144c0 6c 65 5f 20 24 66 69 6c 65 4e 61 6d 65 5d 0d 0a  le_ $fileName]..
144d0 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20            }.... 
144e0 20 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68           foreach
144f0 20 66 69 6c 65 4e 61 6d 65 20 24 6e 61 74 69 76   fileName $nativ
14500 65 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20  eFileNames {..  
14510 20 20 20 20 20 20 20 20 20 20 72 65 6d 6f 76 65            remove
14520 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65  Constraint [appe
14530 6e 64 41 72 67 73 20 66 69 6c 65 5f 20 24 66 69  ndArgs file_ $fi
14540 6c 65 4e 61 6d 65 5d 0d 0a 20 20 20 20 20 20 20  leName]..       
14550 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
14560 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65 4e 61    foreach fileNa
14570 6d 65 20 24 6d 61 6e 61 67 65 64 46 69 6c 65 4e  me $managedFileN
14580 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20 20 20  ames {..        
14590 20 20 20 20 72 65 6d 6f 76 65 43 6f 6e 73 74 72      removeConstr
145a0 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73  aint [appendArgs
145b0 20 66 69 6c 65 5f 20 24 66 69 6c 65 4e 61 6d 65   file_ $fileName
145c0 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  ]..          }..
145d0 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
145e0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
145f0 23 20 4e 4f 54 45 3a 20 53 6b 69 70 20 61 6c 6c  # NOTE: Skip all
14600 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c   System.Data.SQL
14610 69 74 65 20 72 65 6c 61 74 65 64 20 66 69 6c 65  ite related file
14620 20 68 61 6e 64 6c 69 6e 67 20 28 64 65 6c 65 74   handling (delet
14630 69 6e 67 2c 0d 0a 20 20 20 20 20 20 20 20 23 20  ing,..        # 
14640 20 20 20 20 20 20 63 6f 70 79 69 6e 67 2c 20 61        copying, a
14650 6e 64 20 6c 6f 61 64 69 6e 67 29 20 69 66 20 69  nd loading) if i
14660 6e 73 74 72 75 63 74 65 64 2e 0d 0a 20 20 20 20  nstructed...    
14670 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 69      #..        i
14680 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73  f {![info exists
14690 20 3a 3a 6e 6f 28 73 71 6c 69 74 65 46 69 6c 65   ::no(sqliteFile
146a0 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  s)]} then {..   
146b0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
146c0 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 6b 69 70      # NOTE: Skip
146d0 20 74 72 79 69 6e 67 20 74 6f 20 64 65 6c 65 74   trying to delet
146e0 65 20 61 6e 79 20 66 69 6c 65 73 20 69 66 20 69  e any files if i
146f0 6e 73 74 72 75 63 74 65 64 2e 0d 0a 20 20 20 20  nstructed...    
14700 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
14710 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78     if {![info ex
14720 69 73 74 73 20 3a 3a 6e 6f 28 64 65 6c 65 74 65  ists ::no(delete
14730 53 71 6c 69 74 65 46 69 6c 65 73 29 5d 7d 20 74  SqliteFiles)]} t
14740 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
14750 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78     if {![info ex
14760 69 73 74 73 20 3a 3a 6e 6f 28 64 65 6c 65 74 65  ists ::no(delete
14770 53 71 6c 69 74 65 43 6f 6e 66 69 67 46 69 6c 65  SqliteConfigFile
14780 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  s)]} then {..   
14790 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 65 61             forea
147a0 63 68 20 66 69 6c 65 4e 61 6d 65 20 24 63 6f 6e  ch fileName $con
147b0 66 69 67 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a  figFileNames {..
147c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
147d0 74 72 79 44 65 6c 65 74 65 42 69 6e 61 72 79 46  tryDeleteBinaryF
147e0 69 6c 65 20 24 66 69 6c 65 4e 61 6d 65 0d 0a 20  ile $fileName.. 
147f0 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a               }..
14800 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d              }...
14810 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20  .            if 
14820 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a  {![info exists :
14830 3a 6e 6f 28 64 65 6c 65 74 65 53 71 6c 69 74 65  :no(deleteSqlite
14840 4e 61 74 69 76 65 46 69 6c 65 73 29 5d 7d 20 74  NativeFiles)]} t
14850 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
14860 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20       if {![info 
14870 65 78 69 73 74 73 20 3a 3a 6e 6f 28 64 65 6c 65  exists ::no(dele
14880 74 65 53 71 6c 69 74 65 49 6d 70 6c 69 63 69 74  teSqliteImplicit
14890 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d  Files)]} then {.
148a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
148b0 20 66 6f 72 65 61 63 68 20 66 69 6c 65 4e 61 6d   foreach fileNam
148c0 65 20 24 6e 61 74 69 76 65 46 69 6c 65 4e 61 6d  e $nativeFileNam
148d0 65 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  es {..          
148e0 20 20 20 20 20 20 20 20 74 72 79 44 65 6c 65 74          tryDelet
148f0 65 41 73 73 65 6d 62 6c 79 20 24 66 69 6c 65 4e  eAssembly $fileN
14900 61 6d 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ame..           
14910 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
14920 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
14930 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69           if {![i
14940 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28  nfo exists ::no(
14950 64 65 6c 65 74 65 53 71 6c 69 74 65 50 6c 61 74  deleteSqlitePlat
14960 66 6f 72 6d 46 69 6c 65 73 29 5d 20 26 26 20 5c  formFiles)] && \
14970 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
14980 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67      [string leng
14990 74 68 20 24 70 6c 61 74 66 6f 72 6d 5d 20 3e 20  th $platform] > 
149a0 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
149b0 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 65 61             forea
149c0 63 68 20 66 69 6c 65 4e 61 6d 65 20 24 6e 61 74  ch fileName $nat
149d0 69 76 65 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a  iveFileNames {..
149e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
149f0 20 20 74 72 79 44 65 6c 65 74 65 41 73 73 65 6d    tryDeleteAssem
14a00 62 6c 79 20 24 66 69 6c 65 4e 61 6d 65 20 24 70  bly $fileName $p
14a10 6c 61 74 66 6f 72 6d 0d 0a 20 20 20 20 20 20 20  latform..       
14a20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
14a30 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20            }.... 
14a40 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20               if 
14a50 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a  {![info exists :
14a60 3a 6e 6f 28 64 65 6c 65 74 65 53 71 6c 69 74 65  :no(deleteSqlite
14a70 41 72 63 68 69 74 65 63 74 75 72 65 46 69 6c 65  ArchitectureFile
14a80 73 29 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20  s)] && \..      
14a90 20 20 20 20 20 20 20 20 20 20 20 20 5b 73 74 72              [str
14aa0 69 6e 67 20 6c 65 6e 67 74 68 20 24 61 72 63 68  ing length $arch
14ab0 69 74 65 63 74 75 72 65 5d 20 3e 20 30 7d 20 74  itecture] > 0} t
14ac0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
14ad0 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 66         foreach f
14ae0 69 6c 65 4e 61 6d 65 20 24 6e 61 74 69 76 65 46  ileName $nativeF
14af0 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20  ileNames {..    
14b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 72                tr
14b10 79 44 65 6c 65 74 65 41 73 73 65 6d 62 6c 79 20  yDeleteAssembly 
14b20 24 66 69 6c 65 4e 61 6d 65 20 24 61 72 63 68 69  $fileName $archi
14b30 74 65 63 74 75 72 65 0d 0a 20 20 20 20 20 20 20  tecture..       
14b40 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
14b50 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
14b60 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20           }....  
14b70 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b            if {![
14b80 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f  info exists ::no
14b90 28 64 65 6c 65 74 65 53 71 6c 69 74 65 4d 61 6e  (deleteSqliteMan
14ba0 61 67 65 64 46 69 6c 65 73 29 5d 7d 20 74 68 65  agedFiles)]} the
14bb0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
14bc0 20 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65 4e     foreach fileN
14bd0 61 6d 65 20 24 6d 61 6e 61 67 65 64 46 69 6c 65  ame $managedFile
14be0 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20 20  Names {..       
14bf0 20 20 20 20 20 20 20 20 20 74 72 79 44 65 6c 65           tryDele
14c00 74 65 41 73 73 65 6d 62 6c 79 20 24 66 69 6c 65  teAssembly $file
14c10 4e 61 6d 65 0d 0a 20 20 20 20 20 20 20 20 20 20  Name..          
14c20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
14c30 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
14c40 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 23  }....          #
14c50 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f  ..          # NO
14c60 54 45 3a 20 43 68 65 63 6b 20 66 6f 72 20 74 68  TE: Check for th
14c70 65 20 22 61 75 74 6f 53 65 6c 65 63 74 22 20 72  e "autoSelect" r
14c80 75 6e 74 69 6d 65 20 6f 70 74 69 6f 6e 2e 20 20  untime option.  
14c90 49 66 20 70 72 65 73 65 6e 74 2c 0d 0a 20 20 20  If present,..   
14ca0 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 61         #       a
14cb0 74 74 65 6d 70 74 20 74 6f 20 61 75 74 6f 6d 61  ttempt to automa
14cc0 74 69 63 61 6c 6c 79 20 73 65 6c 65 63 74 20 74  tically select t
14cd0 68 65 20 66 69 72 73 74 20 61 76 61 69 6c 61 62  he first availab
14ce0 6c 65 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20  le..          # 
14cf0 20 20 20 20 20 20 62 75 69 6c 64 20 28 6f 72 20        build (or 
14d00 22 72 65 6c 65 61 73 65 22 29 20 6f 66 20 53 51  "release") of SQ
14d10 4c 69 74 65 20 61 6e 64 20 53 79 73 74 65 6d 2e  Lite and System.
14d20 44 61 74 61 2e 53 51 4c 69 74 65 0d 0a 20 20 20  Data.SQLite..   
14d30 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 66         #       f
14d40 6f 72 20 75 73 65 20 77 69 74 68 20 74 68 65 20  or use with the 
14d50 74 65 73 74 20 73 75 69 74 65 2e 0d 0a 20 20 20  test suite...   
14d60 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
14d70 20 20 20 20 69 66 20 7b 5b 68 61 73 52 75 6e 74      if {[hasRunt
14d80 69 6d 65 4f 70 74 69 6f 6e 20 61 75 74 6f 53 65  imeOption autoSe
14d90 6c 65 63 74 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  lect]} then {.. 
14da0 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21             if {!
14db0 5b 63 68 65 63 6b 46 6f 72 53 51 4c 69 74 65 42  [checkForSQLiteB
14dc0 75 69 6c 64 73 20 24 3a 3a 74 65 73 74 5f 63 68  uilds $::test_ch
14dd0 61 6e 6e 65 6c 20 74 72 75 65 5d 7d 20 74 68 65  annel true]} the
14de0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
14df0 20 20 20 63 68 65 63 6b 46 6f 72 53 51 4c 69 74     checkForSQLit
14e00 65 52 65 6c 65 61 73 65 73 20 24 3a 3a 74 65 73  eReleases $::tes
14e10 74 5f 63 68 61 6e 6e 65 6c 20 74 72 75 65 0d 0a  t_channel true..
14e20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
14e30 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20           }....  
14e40 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
14e50 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 6b 69       # NOTE: Ski
14e60 70 20 74 72 79 69 6e 67 20 74 6f 20 76 65 72 69  p trying to veri
14e70 66 79 20 74 68 65 20 62 75 69 6c 64 20 64 69 72  fy the build dir
14e80 65 63 74 6f 72 79 20 69 66 20 69 6e 73 74 72 75  ectory if instru
14e90 63 74 65 64 3b 0d 0a 20 20 20 20 20 20 20 20 20  cted;..         
14ea0 20 23 20 20 20 20 20 20 20 6f 74 68 65 72 77 69   #       otherwi
14eb0 73 65 2c 20 6d 61 6b 65 20 73 75 72 65 20 69 74  se, make sure it
14ec0 20 61 63 74 75 61 6c 6c 79 20 65 78 69 73 74 73   actually exists
14ed0 20 6f 72 20 68 61 6c 74 20 74 68 65 20 65 6e 74   or halt the ent
14ee0 69 72 65 0d 0a 20 20 20 20 20 20 20 20 20 20 23  ire..          #
14ef0 20 20 20 20 20 20 20 74 65 73 74 69 6e 67 20 70         testing p
14f00 72 6f 63 65 73 73 20 69 66 20 69 74 20 64 6f 65  rocess if it doe
14f10 73 20 6e 6f 74 20 65 78 69 73 74 2e 0d 0a 20 20  s not exist...  
14f20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
14f30 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20       if {![info 
14f40 65 78 69 73 74 73 20 3a 3a 6e 6f 28 76 65 72 69  exists ::no(veri
14f50 66 79 42 75 69 6c 64 44 69 72 65 63 74 6f 72 79  fyBuildDirectory
14f60 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  )]} then {..    
14f70 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
14f80 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41         # NOTE: A
14f90 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68  t this point, th
14fa0 65 20 62 75 69 6c 64 20 64 69 72 65 63 74 6f 72  e build director
14fb0 79 20 4d 55 53 54 20 65 78 69 73 74 20 61 73 20  y MUST exist as 
14fc0 61 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23  a..            #
14fd0 20 20 20 20 20 20 20 76 61 6c 69 64 20 64 69 72         valid dir
14fe0 65 63 74 6f 72 79 20 66 6f 72 20 74 68 65 20 74  ectory for the t
14ff0 65 73 74 69 6e 67 20 70 72 6f 63 65 73 73 20 74  esting process t
15000 6f 20 63 6f 6e 74 69 6e 75 65 2e 0d 0a 20 20 20  o continue...   
15010 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
15020 20 20 20 20 20 20 20 20 73 65 74 20 64 69 72 65          set dire
15030 63 74 6f 72 79 20 5b 67 65 74 42 75 69 6c 64 44  ctory [getBuildD
15040 69 72 65 63 74 6f 72 79 5d 0d 0a 0d 0a 20 20 20  irectory]....   
15050 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 66           if {![f
15060 69 6c 65 20 65 78 69 73 74 73 20 24 64 69 72 65  ile exists $dire
15070 63 74 6f 72 79 5d 20 7c 7c 20 5c 0d 0a 20 20 20  ctory] || \..   
15080 20 20 20 20 20 20 20 20 20 20 20 20 20 21 5b 66               ![f
15090 69 6c 65 20 69 73 64 69 72 65 63 74 6f 72 79 20  ile isdirectory 
150a0 24 64 69 72 65 63 74 6f 72 79 5d 7d 20 74 68 65  $directory]} the
150b0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
150c0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
150d0 20 20 20 20 23 20 4e 4f 54 45 3a 20 4a 75 73 74      # NOTE: Just
150e0 20 70 72 69 6f 72 20 74 6f 20 61 63 74 75 61 6c   prior to actual
150f0 6c 79 20 68 61 6c 74 69 6e 67 20 74 68 65 20 74  ly halting the t
15100 65 73 74 69 6e 67 20 70 72 6f 63 65 73 73 2c 0d  esting process,.
15110 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23  .              #
15120 20 20 20 20 20 20 20 61 64 64 20 61 6e 20 65 72         add an er
15130 72 6f 72 20 74 6f 20 74 68 65 20 74 65 73 74 20  ror to the test 
15140 6c 6f 67 20 66 69 6c 65 2e 0d 0a 20 20 20 20 20  log file...     
15150 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
15160 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
15170 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
15180 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
15190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
151a0 20 22 2d 2d 2d 2d 20 63 6f 75 6c 64 20 6e 6f 74   "---- could not
151b0 20 76 65 72 69 66 79 20 62 75 69 6c 64 20 64 69   verify build di
151c0 72 65 63 74 6f 72 79 20 5c 22 22 20 24 64 69 72  rectory \"" $dir
151d0 65 63 74 6f 72 79 20 5c 0d 0a 20 20 20 20 20 20  ectory \..      
151e0 20 20 20 20 20 20 20 20 20 20 20 20 22 5c 22 2c              "\",
151f0 20 61 6c 6c 20 74 65 73 74 69 6e 67 20 68 61 6c   all testing hal
15200 74 65 64 5c 6e 22 5d 0d 0a 0d 0a 20 20 20 20 20  ted\n"]....     
15210 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
15220 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45            # NOTE
15230 3a 20 52 61 69 73 69 6e 67 20 61 20 73 63 72 69  : Raising a scri
15240 70 74 20 65 72 72 6f 72 20 66 72 6f 6d 20 74 68  pt error from th
15250 69 73 20 70 6f 69 6e 74 20 73 68 6f 75 6c 64 20  is point should 
15260 68 61 6c 74 0d 0a 20 20 20 20 20 20 20 20 20 20  halt..          
15270 20 20 20 20 23 20 20 20 20 20 20 20 74 68 65 20      #       the 
15280 74 65 73 74 69 6e 67 20 70 72 6f 63 65 73 73 2e  testing process.
15290 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
152a0 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  #..             
152b0 20 65 72 72 6f 72 20 5b 61 70 70 65 6e 64 41 72   error [appendAr
152c0 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
152d0 20 20 20 20 20 20 20 20 22 63 6f 75 6c 64 20 6e          "could n
152e0 6f 74 20 76 65 72 69 66 79 20 62 75 69 6c 64 20  ot verify build 
152f0 64 69 72 65 63 74 6f 72 79 20 5c 22 22 20 24 64  directory \"" $d
15300 69 72 65 63 74 6f 72 79 20 5c 0d 0a 20 20 20 20  irectory \..    
15310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 5c                "\
15320 22 2c 20 61 6c 6c 20 74 65 73 74 69 6e 67 20 68  ", all testing h
15330 61 6c 74 65 64 22 5d 0d 0a 20 20 20 20 20 20 20  alted"]..       
15340 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
15350 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20    }....         
15360 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20   #..          # 
15370 4e 4f 54 45 3a 20 53 6b 69 70 20 74 72 79 69 6e  NOTE: Skip tryin
15380 67 20 74 6f 20 63 6f 70 79 20 61 6e 79 20 66 69  g to copy any fi
15390 6c 65 73 20 69 66 20 69 6e 73 74 72 75 63 74 65  les if instructe
153a0 64 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d  d...          #.
153b0 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21  .          if {!
153c0 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e  [info exists ::n
153d0 6f 28 63 6f 70 79 53 71 6c 69 74 65 46 69 6c 65  o(copySqliteFile
153e0 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  s)]} then {..   
153f0 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69           if {![i
15400 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28  nfo exists ::no(
15410 63 6f 70 79 53 71 6c 69 74 65 43 6f 6e 66 69 67  copySqliteConfig
15420 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d  Files)]} then {.
15430 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66  .              f
15440 6f 72 65 61 63 68 20 66 69 6c 65 4e 61 6d 65 20  oreach fileName 
15450 24 63 6f 6e 66 69 67 46 69 6c 65 4e 61 6d 65 73  $configFileNames
15460 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
15470 20 20 20 20 74 72 79 43 6f 70 79 42 75 69 6c 64      tryCopyBuild
15480 46 69 6c 65 20 24 66 69 6c 65 4e 61 6d 65 0d 0a  File $fileName..
15490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d                }.
154a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  .            }..
154b0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ..            if
154c0 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20   {![info exists 
154d0 3a 3a 6e 6f 28 63 6f 70 79 53 71 6c 69 74 65 4e  ::no(copySqliteN
154e0 61 74 69 76 65 46 69 6c 65 73 29 5d 7d 20 74 68  ativeFiles)]} th
154f0 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
15500 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65      if {![info e
15510 78 69 73 74 73 20 3a 3a 6e 6f 28 63 6f 70 79 53  xists ::no(copyS
15520 71 6c 69 74 65 49 6d 70 6c 69 63 69 74 46 69 6c  qliteImplicitFil
15530 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  es)]} then {..  
15540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f                fo
15550 72 65 61 63 68 20 66 69 6c 65 4e 61 6d 65 20 24  reach fileName $
15560 6e 61 74 69 76 65 46 69 6c 65 4e 61 6d 65 73 20  nativeFileNames 
15570 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
15580 20 20 20 20 20 74 72 79 43 6f 70 79 41 73 73 65       tryCopyAsse
15590 6d 62 6c 79 20 24 66 69 6c 65 4e 61 6d 65 0d 0a  mbly $fileName..
155a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
155b0 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  }..             
155c0 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   }....          
155d0 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65      if {![info e
155e0 78 69 73 74 73 20 3a 3a 6e 6f 28 63 6f 70 79 53  xists ::no(copyS
155f0 71 6c 69 74 65 50 6c 61 74 66 6f 72 6d 46 69 6c  qlitePlatformFil
15600 65 73 29 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20  es)] && \..     
15610 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 73 74               [st
15620 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 70 6c 61  ring length $pla
15630 74 66 6f 72 6d 5d 20 3e 20 30 7d 20 74 68 65 6e  tform] > 0} then
15640 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
15650 20 20 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65      foreach file
15660 4e 61 6d 65 20 24 6e 61 74 69 76 65 46 69 6c 65  Name $nativeFile
15670 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20 20  Names {..       
15680 20 20 20 20 20 20 20 20 20 20 20 74 72 79 43 6f             tryCo
15690 70 79 41 73 73 65 6d 62 6c 79 20 24 66 69 6c 65  pyAssembly $file
156a0 4e 61 6d 65 20 24 70 6c 61 74 66 6f 72 6d 0d 0a  Name $platform..
156b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
156c0 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  }..             
156d0 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   }....          
156e0 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65      if {![info e
156f0 78 69 73 74 73 20 3a 3a 6e 6f 28 63 6f 70 79 53  xists ::no(copyS
15700 71 6c 69 74 65 41 72 63 68 69 74 65 63 74 75 72  qliteArchitectur
15710 65 46 69 6c 65 73 29 5d 20 26 26 20 5c 0d 0a 20  eFiles)] && \.. 
15720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15730 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20   [string length 
15740 24 61 72 63 68 69 74 65 63 74 75 72 65 5d 20 3e  $architecture] >
15750 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
15760 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 65              fore
15770 61 63 68 20 66 69 6c 65 4e 61 6d 65 20 24 6e 61  ach fileName $na
15780 74 69 76 65 46 69 6c 65 4e 61 6d 65 73 20 7b 0d  tiveFileNames {.
15790 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
157a0 20 20 20 74 72 79 43 6f 70 79 41 73 73 65 6d 62     tryCopyAssemb
157b0 6c 79 20 24 66 69 6c 65 4e 61 6d 65 20 24 61 72  ly $fileName $ar
157c0 63 68 69 74 65 63 74 75 72 65 0d 0a 20 20 20 20  chitecture..    
157d0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
157e0 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a               }..
157f0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d              }...
15800 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20  .            if 
15810 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a  {![info exists :
15820 3a 6e 6f 28 63 6f 70 79 53 71 6c 69 74 65 4d 61  :no(copySqliteMa
15830 6e 61 67 65 64 46 69 6c 65 73 29 5d 7d 20 74 68  nagedFiles)]} th
15840 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
15850 20 20 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65      foreach file
15860 4e 61 6d 65 20 24 6d 61 6e 61 67 65 64 46 69 6c  Name $managedFil
15870 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20  eNames {..      
15880 20 20 20 20 20 20 20 20 20 20 74 72 79 43 6f 70            tryCop
15890 79 41 73 73 65 6d 62 6c 79 20 24 66 69 6c 65 4e  yAssembly $fileN
158a0 61 6d 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ame..           
158b0 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
158c0 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d    }..          }
158d0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d  ....          #.
158e0 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54  .          # NOT
158f0 45 3a 20 53 6b 69 70 20 74 72 79 69 6e 67 20 74  E: Skip trying t
15900 6f 20 6c 6f 61 64 20 61 6e 79 20 66 69 6c 65 73  o load any files
15910 20 69 66 20 69 6e 73 74 72 75 63 74 65 64 2e 0d   if instructed..
15920 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
15930 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e          if {![in
15940 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 6c  fo exists ::no(l
15950 6f 61 64 53 71 6c 69 74 65 46 69 6c 65 73 29 5d  oadSqliteFiles)]
15960 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
15970 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f        if {![info
15980 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 6c 6f 61   exists ::no(loa
15990 64 53 71 6c 69 74 65 49 6d 70 6c 69 63 69 74 46  dSqliteImplicitF
159a0 69 6c 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a  iles)]} then {..
159b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 72                tr
159c0 79 4c 6f 61 64 41 73 73 65 6d 62 6c 79 20 53 79  yLoadAssembly Sy
159d0 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
159e0 2e 64 6c 6c 0d 0a 20 20 20 20 20 20 20 20 20 20  .dll..          
159f0 20 20 20 20 74 72 79 4c 6f 61 64 41 73 73 65 6d      tryLoadAssem
15a00 62 6c 79 20 53 79 73 74 65 6d 2e 44 61 74 61 2e  bly System.Data.
15a10 53 51 4c 69 74 65 2e 4c 69 6e 71 2e 64 6c 6c 0d  SQLite.Linq.dll.
15a20 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  .            }..
15a30 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ..            if
15a40 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20   {![info exists 
15a50 3a 3a 6e 6f 28 6c 6f 61 64 53 71 6c 69 74 65 50  ::no(loadSqliteP
15a60 6c 61 74 66 6f 72 6d 46 69 6c 65 73 29 5d 20 26  latformFiles)] &
15a70 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  & \..           
15a80 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e       [string len
15a90 67 74 68 20 24 70 6c 61 74 66 6f 72 6d 5d 20 3e  gth $platform] >
15aa0 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
15ab0 20 20 20 20 20 20 20 20 20 20 74 72 79 4c 6f 61            tryLoa
15ac0 64 41 73 73 65 6d 62 6c 79 20 53 79 73 74 65 6d  dAssembly System
15ad0 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 64 6c 6c  .Data.SQLite.dll
15ae0 20 24 70 6c 61 74 66 6f 72 6d 0d 0a 20 20 20 20   $platform..    
15af0 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
15b00 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69           if {![i
15b10 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28  nfo exists ::no(
15b20 6c 6f 61 64 53 71 6c 69 74 65 41 72 63 68 69 74  loadSqliteArchit
15b30 65 63 74 75 72 65 46 69 6c 65 73 29 5d 20 26 26  ectureFiles)] &&
15b40 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
15b50 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67      [string leng
15b60 74 68 20 24 61 72 63 68 69 74 65 63 74 75 72 65  th $architecture
15b70 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20  ] > 0} then {.. 
15b80 20 20 20 20 20 20 20 20 20 20 20 20 20 74 72 79               try
15b90 4c 6f 61 64 41 73 73 65 6d 62 6c 79 20 53 79 73  LoadAssembly Sys
15ba0 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e  tem.Data.SQLite.
15bb0 64 6c 6c 20 24 61 72 63 68 69 74 65 63 74 75 72  dll $architectur
15bc0 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  e..            }
15bd0 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d  ..          }...
15be0 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
15bf0 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
15c00 53 6b 69 70 20 74 72 79 69 6e 67 20 74 6f 20 64  Skip trying to d
15c10 65 6c 65 74 65 20 65 78 74 65 72 6e 61 6c 20 66  elete external f
15c20 69 6c 65 73 20 69 66 20 69 6e 73 74 72 75 63 74  iles if instruct
15c30 65 64 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23  ed...          #
15c40 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b  ..          if {
15c50 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  ![info exists ::
15c60 6e 6f 28 64 65 6c 65 74 65 53 71 6c 69 74 65 45  no(deleteSqliteE
15c70 78 74 65 72 6e 61 6c 46 69 6c 65 73 29 5d 7d 20  xternalFiles)]} 
15c80 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
15c90 20 20 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65      foreach file
15ca0 4e 61 6d 65 20 24 6d 64 61 43 6f 6e 66 69 67 46  Name $mdaConfigF
15cb0 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20  ileNames {..    
15cc0 20 20 20 20 20 20 20 20 20 20 74 72 79 44 65 6c            tryDel
15cd0 65 74 65 42 75 69 6c 64 46 69 6c 65 20 24 66 69  eteBuildFile $fi
15ce0 6c 65 4e 61 6d 65 0d 0a 20 20 20 20 20 20 20 20  leName..        
15cf0 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
15d00 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   }....          
15d10 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e  #..          # N
15d20 4f 54 45 3a 20 53 6b 69 70 20 74 72 79 69 6e 67  OTE: Skip trying
15d30 20 74 6f 20 63 6f 70 79 20 65 78 74 65 72 6e 61   to copy externa
15d40 6c 20 66 69 6c 65 73 20 69 66 20 69 6e 73 74 72  l files if instr
15d50 75 63 74 65 64 2e 0d 0a 20 20 20 20 20 20 20 20  ucted...        
15d60 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 69    #..          i
15d70 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73  f {![info exists
15d80 20 3a 3a 6e 6f 28 63 6f 70 79 53 71 6c 69 74 65   ::no(copySqlite
15d90 45 78 74 65 72 6e 61 6c 46 69 6c 65 73 29 5d 7d  ExternalFiles)]}
15da0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
15db0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
15dc0 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 6f 70 79      # NOTE: Copy
15dd0 20 74 68 65 20 4d 61 6e 61 67 65 64 20 44 65 62   the Managed Deb
15de0 75 67 67 69 6e 67 20 41 73 73 69 73 74 61 6e 74  ugging Assistant
15df0 73 20 28 4d 44 41 29 20 63 6f 6e 66 69 67 75 72  s (MDA) configur
15e00 61 74 69 6f 6e 0d 0a 20 20 20 20 20 20 20 20 20  ation..         
15e10 20 20 20 23 20 20 20 20 20 20 20 66 69 6c 65 20     #       file 
15e20 66 6f 72 20 74 68 65 20 45 61 67 6c 65 20 73 68  for the Eagle sh
15e30 65 6c 6c 20 74 6f 20 74 68 65 20 62 75 69 6c 64  ell to the build
15e40 20 6f 75 74 70 75 74 20 64 69 72 65 63 74 6f 72   output director
15e50 79 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  y,..            
15e60 23 20 20 20 20 20 20 20 77 68 69 6c 65 20 75 73  #       while us
15e70 69 6e 67 20 65 61 63 68 20 6f 66 20 74 68 65 20  ing each of the 
15e80 6e 61 6d 65 73 20 6f 66 20 74 68 65 20 76 61 72  names of the var
15e90 69 6f 75 73 20 6c 65 67 61 63 79 20 74 65 73 74  ious legacy test
15ea0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 20  ..            # 
15eb0 20 20 20 20 20 20 65 78 65 63 75 74 61 62 6c 65        executable
15ec0 73 2e 20 20 54 68 69 73 20 77 69 6c 6c 20 68 65  s.  This will he
15ed0 6c 70 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20  lp to make sure 
15ee0 74 68 61 74 20 61 6c 6c 20 74 68 65 0d 0a 20 20  that all the..  
15ef0 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20            #     
15f00 20 20 6c 65 67 61 63 79 20 74 65 73 74 73 20 72    legacy tests r
15f10 75 6e 20 77 69 74 68 20 65 78 61 63 74 6c 79 20  un with exactly 
15f20 74 68 65 20 73 61 6d 65 20 73 65 74 20 6f 66 20  the same set of 
15f30 4d 61 6e 61 67 65 64 0d 0a 20 20 20 20 20 20 20  Managed..       
15f40 20 20 20 20 20 23 20 20 20 20 20 20 20 44 65 62       #       Deb
15f50 75 67 67 69 6e 67 20 41 73 73 69 73 74 61 6e 74  ugging Assistant
15f60 73 20 63 6f 6e 66 69 67 75 72 65 64 2e 0d 0a 20  s configured... 
15f70 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
15f80 20 20 20 20 20 20 20 20 20 20 66 6f 72 65 61 63            foreac
15f90 68 20 66 69 6c 65 4e 61 6d 65 20 24 6d 64 61 43  h fileName $mdaC
15fa0 6f 6e 66 69 67 46 69 6c 65 4e 61 6d 65 73 20 7b  onfigFileNames {
15fb0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
15fc0 74 72 79 43 6f 70 79 42 69 6e 61 72 79 46 69 6c  tryCopyBinaryFil
15fd0 65 20 45 61 67 6c 65 53 68 65 6c 6c 2e 65 78 65  e EagleShell.exe
15fe0 2e 6d 64 61 2e 63 6f 6e 66 69 67 20 22 22 20 24  .mda.config "" $
15ff0 66 69 6c 65 4e 61 6d 65 0d 0a 20 20 20 20 20 20  fileName..      
16000 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
16010 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d     }..        }.
16020 0a 0d 0a 20 20 20 20 20 20 20 20 63 61 74 63 68  ...        catch
16030 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70   {..          tp
16040 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  uts $::test_chan
16050 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
16060 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
16070 20 22 2d 2d 2d 2d 20 66 69 6c 65 20 76 65 72 73   "---- file vers
16080 69 6f 6e 20 6f 66 20 5c 22 73 71 6c 69 74 65 33  ion of \"sqlite3
16090 2e 64 6c 6c 5c 22 2e 2e 2e 20 22 20 5c 0d 0a 20  .dll\"... " \.. 
160a0 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 66 69               [fi
160b0 6c 65 20 76 65 72 73 69 6f 6e 20 5b 67 65 74 42  le version [getB
160c0 69 6e 61 72 79 46 69 6c 65 4e 61 6d 65 20 73 71  inaryFileName sq
160d0 6c 69 74 65 33 2e 64 6c 6c 5d 5d 20 5c 6e 5d 0d  lite3.dll]] \n].
160e0 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  .        }....  
160f0 20 20 20 20 20 20 63 61 74 63 68 20 7b 0d 0a 20        catch {.. 
16100 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
16110 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b  ::test_channel [
16120 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
16130 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
16140 2d 20 66 69 6c 65 20 76 65 72 73 69 6f 6e 20 6f  - file version o
16150 66 20 5c 22 53 51 4c 69 74 65 2e 49 6e 74 65 72  f \"SQLite.Inter
16160 6f 70 2e 64 6c 6c 5c 22 2e 2e 2e 20 22 20 5c 0d  op.dll\"... " \.
16170 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b  .              [
16180 66 69 6c 65 20 76 65 72 73 69 6f 6e 20 5b 67 65  file version [ge
16190 74 42 69 6e 61 72 79 46 69 6c 65 4e 61 6d 65 20  tBinaryFileName 
161a0 53 51 4c 69 74 65 2e 49 6e 74 65 72 6f 70 2e 64  SQLite.Interop.d
161b0 6c 6c 5d 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20 20  ll]] \n]..      
161c0 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 63    }....        c
161d0 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20  atch {..        
161e0 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
161f0 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
16200 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
16210 20 20 20 20 20 22 2d 2d 2d 2d 20 66 69 6c 65 20       "---- file 
16220 76 65 72 73 69 6f 6e 20 6f 66 20 5c 22 53 79 73  version of \"Sys
16230 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e  tem.Data.SQLite.
16240 64 6c 6c 5c 22 2e 2e 2e 20 22 20 5c 0d 0a 20 20  dll\"... " \..  
16250 20 20 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c              [fil
16260 65 20 76 65 72 73 69 6f 6e 20 5b 67 65 74 42 69  e version [getBi
16270 6e 61 72 79 46 69 6c 65 4e 61 6d 65 20 53 79 73  naryFileName Sys
16280 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e  tem.Data.SQLite.
16290 64 6c 6c 5d 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20  dll]] \n]..     
162a0 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
162b0 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20  catch {..       
162c0 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
162d0 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  _channel [append
162e0 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
162f0 20 20 20 20 20 20 22 2d 2d 2d 2d 20 66 69 6c 65        "---- file
16300 20 76 65 72 73 69 6f 6e 20 6f 66 20 5c 22 53 79   version of \"Sy
16310 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
16320 2e 4c 69 6e 71 2e 64 6c 6c 5c 22 2e 2e 2e 20 22  .Linq.dll\"... "
16330 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
16340 20 20 5b 66 69 6c 65 20 76 65 72 73 69 6f 6e 20    [file version 
16350 5b 67 65 74 42 69 6e 61 72 79 46 69 6c 65 4e 61  [getBinaryFileNa
16360 6d 65 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53  me System.Data.S
16370 51 4c 69 74 65 2e 4c 69 6e 71 2e 64 6c 6c 5d 5d  QLite.Linq.dll]]
16380 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d   \n]..        }.
16390 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b  ...        if {[
163a0 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 70  string length $p
163b0 6c 61 74 66 6f 72 6d 5d 20 3e 20 30 7d 20 74 68  latform] > 0} th
163c0 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
163d0 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20  catch {..       
163e0 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
163f0 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
16400 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
16410 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
16420 66 69 6c 65 20 76 65 72 73 69 6f 6e 20 6f 66 20  file version of 
16430 5c 22 22 20 24 70 6c 61 74 66 6f 72 6d 20 5c 0d  \"" $platform \.
16440 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
16450 20 22 2f 73 71 6c 69 74 65 33 2e 64 6c 6c 5c 22   "/sqlite3.dll\"
16460 2e 2e 2e 20 22 20 5b 66 69 6c 65 20 76 65 72 73  ... " [file vers
16470 69 6f 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ion \..         
16480 20 20 20 20 20 20 20 5b 67 65 74 42 69 6e 61 72         [getBinar
16490 79 46 69 6c 65 4e 61 6d 65 20 73 71 6c 69 74 65  yFileName sqlite
164a0 33 2e 64 6c 6c 20 24 70 6c 61 74 66 6f 72 6d 5d  3.dll $platform]
164b0 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20  ] \n]..         
164c0 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   }....          
164d0 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20  catch {..       
164e0 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
164f0 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
16500 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
16510 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
16520 66 69 6c 65 20 76 65 72 73 69 6f 6e 20 6f 66 20  file version of 
16530 5c 22 22 20 24 70 6c 61 74 66 6f 72 6d 20 5c 0d  \"" $platform \.
16540 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
16550 20 22 2f 53 51 4c 69 74 65 2e 49 6e 74 65 72 6f   "/SQLite.Intero
16560 70 2e 64 6c 6c 5c 22 2e 2e 2e 20 22 20 5b 66 69  p.dll\"... " [fi
16570 6c 65 20 76 65 72 73 69 6f 6e 20 5c 0d 0a 20 20  le version \..  
16580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 67                [g
16590 65 74 42 69 6e 61 72 79 46 69 6c 65 4e 61 6d 65  etBinaryFileName
165a0 20 53 51 4c 69 74 65 2e 49 6e 74 65 72 6f 70 2e   SQLite.Interop.
165b0 64 6c 6c 20 24 70 6c 61 74 66 6f 72 6d 5d 5d 20  dll $platform]] 
165c0 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  \n]..          }
165d0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 63 61  ....          ca
165e0 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  tch {..         
165f0 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
16600 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  _channel [append
16610 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
16620 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 66 69          "---- fi
16630 6c 65 20 76 65 72 73 69 6f 6e 20 6f 66 20 5c 22  le version of \"
16640 22 20 24 70 6c 61 74 66 6f 72 6d 20 5c 0d 0a 20  " $platform \.. 
16650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
16660 2f 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c  /System.Data.SQL
16670 69 74 65 2e 64 6c 6c 5c 22 2e 2e 2e 20 22 20 5b  ite.dll\"... " [
16680 66 69 6c 65 20 76 65 72 73 69 6f 6e 20 5c 0d 0a  file version \..
16690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
166a0 5b 67 65 74 42 69 6e 61 72 79 46 69 6c 65 4e 61  [getBinaryFileNa
166b0 6d 65 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53  me System.Data.S
166c0 51 4c 69 74 65 2e 64 6c 6c 20 24 70 6c 61 74 66  QLite.dll $platf
166d0 6f 72 6d 5d 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20  orm]] \n]..     
166e0 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
166f0 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20  }....        if 
16700 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20  {[string length 
16710 24 61 72 63 68 69 74 65 63 74 75 72 65 5d 20 3e  $architecture] >
16720 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
16730 20 20 20 20 20 20 63 61 74 63 68 20 7b 0d 0a 20        catch {.. 
16740 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
16750 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
16760 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
16770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16780 22 2d 2d 2d 2d 20 66 69 6c 65 20 76 65 72 73 69  "---- file versi
16790 6f 6e 20 6f 66 20 5c 22 22 20 24 61 72 63 68 69  on of \"" $archi
167a0 74 65 63 74 75 72 65 20 5c 0d 0a 20 20 20 20 20  tecture \..     
167b0 20 20 20 20 20 20 20 20 20 20 20 22 2f 73 71 6c             "/sql
167c0 69 74 65 33 2e 64 6c 6c 5c 22 2e 2e 2e 20 22 20  ite3.dll\"... " 
167d0 5b 66 69 6c 65 20 76 65 72 73 69 6f 6e 20 5c 0d  [file version \.
167e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
167f0 20 5b 67 65 74 42 69 6e 61 72 79 46 69 6c 65 4e   [getBinaryFileN
16800 61 6d 65 20 73 71 6c 69 74 65 33 2e 64 6c 6c 20  ame sqlite3.dll 
16810 24 61 72 63 68 69 74 65 63 74 75 72 65 5d 5d 20  $architecture]] 
16820 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  \n]..          }
16830 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 63 61  ....          ca
16840 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  tch {..         
16850 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
16860 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  _channel [append
16870 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
16880 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 66 69          "---- fi
16890 6c 65 20 76 65 72 73 69 6f 6e 20 6f 66 20 5c 22  le version of \"
168a0 22 20 24 61 72 63 68 69 74 65 63 74 75 72 65 20  " $architecture 
168b0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
168c0 20 20 20 22 2f 53 51 4c 69 74 65 2e 49 6e 74 65     "/SQLite.Inte
168d0 72 6f 70 2e 64 6c 6c 5c 22 2e 2e 2e 20 22 20 5b  rop.dll\"... " [
168e0 66 69 6c 65 20 76 65 72 73 69 6f 6e 20 5c 0d 0a  file version \..
168f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16900 5b 67 65 74 42 69 6e 61 72 79 46 69 6c 65 4e 61  [getBinaryFileNa
16910 6d 65 20 53 51 4c 69 74 65 2e 49 6e 74 65 72 6f  me SQLite.Intero
16920 70 2e 64 6c 6c 20 24 61 72 63 68 69 74 65 63 74  p.dll $architect
16930 75 72 65 5d 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20  ure]] \n]..     
16940 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
16950 20 20 20 20 63 61 74 63 68 20 7b 0d 0a 20 20 20      catch {..   
16960 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
16970 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b  ::test_channel [
16980 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
16990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d                "-
169a0 2d 2d 2d 20 66 69 6c 65 20 76 65 72 73 69 6f 6e  --- file version
169b0 20 6f 66 20 5c 22 22 20 24 61 72 63 68 69 74 65   of \"" $archite
169c0 63 74 75 72 65 20 5c 0d 0a 20 20 20 20 20 20 20  cture \..       
169d0 20 20 20 20 20 20 20 20 20 22 2f 53 79 73 74 65           "/Syste
169e0 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 64 6c  m.Data.SQLite.dl
169f0 6c 5c 22 2e 2e 2e 20 22 20 5b 66 69 6c 65 20 76  l\"... " [file v
16a00 65 72 73 69 6f 6e 20 5c 0d 0a 20 20 20 20 20 20  ersion \..      
16a10 20 20 20 20 20 20 20 20 20 20 5b 67 65 74 42 69            [getBi
16a20 6e 61 72 79 46 69 6c 65 4e 61 6d 65 20 53 79 73  naryFileName Sys
16a30 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e  tem.Data.SQLite.
16a40 64 6c 6c 20 24 61 72 63 68 69 74 65 63 74 75 72  dll $architectur
16a50 65 5d 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20  e]] \n]..       
16a60 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d     }..        }.
16a70 0a 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 61  ...        set a
16a80 73 73 65 6d 62 6c 69 65 73 20 5b 6f 62 6a 65 63  ssemblies [objec
16a90 74 20 69 6e 76 6f 6b 65 20 41 70 70 44 6f 6d 61  t invoke AppDoma
16aa0 69 6e 2e 43 75 72 72 65 6e 74 44 6f 6d 61 69 6e  in.CurrentDomain
16ab0 20 47 65 74 41 73 73 65 6d 62 6c 69 65 73 5d 0d   GetAssemblies].
16ac0 0a 0d 0a 20 20 20 20 20 20 20 20 6f 62 6a 65 63  ...        objec
16ad0 74 20 66 6f 72 65 61 63 68 20 61 73 73 65 6d 62  t foreach assemb
16ae0 6c 79 20 24 61 73 73 65 6d 62 6c 69 65 73 20 7b  ly $assemblies {
16af0 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b  ..          if {
16b00 5b 73 74 72 69 6e 67 20 6d 61 74 63 68 20 5c 7b  [string match \{
16b10 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
16b20 74 65 2a 20 24 61 73 73 65 6d 62 6c 79 5d 7d 20  te* $assembly]} 
16b30 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
16b40 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
16b50 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e  t_channel [appen
16b60 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
16b70 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 66           "---- f
16b80 6f 75 6e 64 20 61 73 73 65 6d 62 6c 79 3a 20 22  ound assembly: "
16b90 20 24 61 73 73 65 6d 62 6c 79 20 5c 6e 5d 0d 0a   $assembly \n]..
16ba0 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
16bb0 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
16bc0 20 20 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20    catch {..     
16bd0 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
16be0 73 74 5f 63 68 61 6e 6e 65 6c 20 5c 0d 0a 20 20  st_channel \..  
16bf0 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
16c00 2d 20 64 65 66 69 6e 65 20 63 6f 6e 73 74 61 6e  - define constan
16c10 74 73 20 66 6f 72 20 5c 22 53 79 73 74 65 6d 2e  ts for \"System.
16c20 44 61 74 61 2e 53 51 4c 69 74 65 5c 22 2e 2e 2e  Data.SQLite\"...
16c30 20 22 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   "....          
16c40 69 66 20 7b 5b 63 61 74 63 68 20 7b 6f 62 6a 65  if {[catch {obje
16c50 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73  ct invoke -flags
16c60 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20   +NonPublic \.. 
16c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16c80 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c   System.Data.SQL
16c90 69 74 65 2e 53 51 4c 69 74 65 33 20 44 65 66 69  ite.SQLite3 Defi
16ca0 6e 65 43 6f 6e 73 74 61 6e 74 73 7d 20 5c 0d 0a  neConstants} \..
16cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16cc0 20 20 64 65 66 69 6e 65 43 6f 6e 73 74 61 6e 74    defineConstant
16cd0 73 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d  s] == 0} then {.
16ce0 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75  .            tpu
16cf0 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
16d00 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5b  el [appendArgs [
16d10 66 6f 72 6d 61 74 4c 69 73 74 20 5b 6c 73 6f 72  formatList [lsor
16d20 74 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  t \..           
16d30 20 20 20 20 20 24 64 65 66 69 6e 65 43 6f 6e 73       $defineCons
16d40 74 61 6e 74 73 5d 20 3c 6e 6f 6e 65 3e 5d 20 5c  tants] <none>] \
16d50 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 20  n]..          } 
16d60 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
16d70 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
16d80 74 5f 63 68 61 6e 6e 65 6c 20 75 6e 6b 6e 6f 77  t_channel unknow
16d90 6e 5c 6e 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  n\n..          }
16da0 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  ..        }.... 
16db0 20 20 20 20 20 20 20 63 61 74 63 68 20 7b 0d 0a         catch {..
16dc0 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
16dd0 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
16de0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
16df0 20 22 2d 2d 2d 2d 20 73 6f 75 72 63 65 20 76 65   "---- source ve
16e00 72 73 69 6f 6e 20 6f 66 20 5c 22 53 79 73 74 65  rsion of \"Syste
16e10 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 64 6c  m.Data.SQLite.dl
16e20 6c 5c 22 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20  l\"... "....    
16e30 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68        if {[catch
16e40 20 7b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20   {object invoke 
16e50 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69  -flags +NonPubli
16e60 63 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  c \..           
16e70 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61         System.Da
16e80 74 61 2e 53 51 4c 69 74 65 2e 53 51 4c 69 74 65  ta.SQLite.SQLite
16e90 43 6f 6e 6e 65 63 74 69 6f 6e 20 50 72 6f 76 69  Connection Provi
16ea0 64 65 72 56 65 72 73 69 6f 6e 7d 20 5c 0d 0a 20  derVersion} \.. 
16eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16ec0 20 76 65 72 73 69 6f 6e 5d 20 3d 3d 20 30 7d 20   version] == 0} 
16ed0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
16ee0 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20      if {[string 
16ef0 6c 65 6e 67 74 68 20 24 76 65 72 73 69 6f 6e 5d  length $version]
16f00 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20   == 0} then {.. 
16f10 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74               set
16f20 20 76 65 72 73 69 6f 6e 20 6e 75 6c 6c 0d 0a 20   version null.. 
16f30 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
16f40 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
16f50 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
16f60 5b 61 70 70 65 6e 64 41 72 67 73 20 24 76 65 72  [appendArgs $ver
16f70 73 69 6f 6e 20 5c 6e 5d 0d 0a 20 20 20 20 20 20  sion \n]..      
16f80 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
16f90 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
16fa0 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
16fb0 75 6e 6b 6e 6f 77 6e 5c 6e 0d 0a 20 20 20 20 20  unknown\n..     
16fc0 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
16fd0 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 63 61 74  }....        cat
16fe0 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  ch {..          
16ff0 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
17000 61 6e 6e 65 6c 20 5c 0d 0a 20 20 20 20 20 20 20  annel \..       
17010 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 73 6f 75         "---- sou
17020 72 63 65 20 63 68 65 63 6b 6f 75 74 20 6f 66 20  rce checkout of 
17030 5c 22 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51  \"System.Data.SQ
17040 4c 69 74 65 2e 64 6c 6c 5c 22 2e 2e 2e 20 22 0d  Lite.dll\"... ".
17050 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20  ...          if 
17060 7b 5b 63 61 74 63 68 20 7b 6f 62 6a 65 63 74 20  {[catch {object 
17070 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e  invoke -flags +N
17080 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20  onPublic \..    
17090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 79                Sy
170a0 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
170b0 2e 53 51 4c 69 74 65 43 6f 6e 6e 65 63 74 69 6f  .SQLiteConnectio
170c0 6e 20 50 72 6f 76 69 64 65 72 53 6f 75 72 63 65  n ProviderSource
170d0 49 64 7d 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  Id} \..         
170e0 20 20 20 20 20 20 20 20 20 73 6f 75 72 63 65 49           sourceI
170f0 64 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d  d] == 0} then {.
17100 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20  .            if 
17110 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20  {[string length 
17120 24 73 6f 75 72 63 65 49 64 5d 20 3d 3d 20 30 7d  $sourceId] == 0}
17130 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
17140 20 20 20 20 20 20 20 73 65 74 20 73 6f 75 72 63         set sourc
17150 65 49 64 20 6e 75 6c 6c 0d 0a 20 20 20 20 20 20  eId null..      
17160 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
17170 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
17180 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
17190 6e 64 41 72 67 73 20 24 73 6f 75 72 63 65 49 64  ndArgs $sourceId
171a0 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20   \n]..          
171b0 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
171c0 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
171d0 65 73 74 5f 63 68 61 6e 6e 65 6c 20 75 6e 6b 6e  est_channel unkn
171e0 6f 77 6e 5c 6e 0d 0a 20 20 20 20 20 20 20 20 20  own\n..         
171f0 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d   }..        }...
17200 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
17210 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68 65 63      # NOTE: Chec
17220 6b 20 74 68 65 20 61 76 61 69 6c 61 62 6c 65 20  k the available 
17230 62 75 69 6c 64 73 20 28 61 6e 64 20 22 72 65 6c  builds (and "rel
17240 65 61 73 65 73 22 29 20 6f 66 20 53 51 4c 69 74  eases") of SQLit
17250 65 20 61 6e 64 0d 0a 20 20 20 20 20 20 20 20 23  e and..        #
17260 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61         System.Da
17270 74 61 2e 53 51 4c 69 74 65 2e 0d 0a 20 20 20 20  ta.SQLite...    
17280 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 63      #..        c
17290 68 65 63 6b 46 6f 72 53 51 4c 69 74 65 42 75 69  heckForSQLiteBui
172a0 6c 64 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  lds $::test_chan
172b0 6e 65 6c 0d 0a 20 20 20 20 20 20 20 20 63 68 65  nel..        che
172c0 63 6b 46 6f 72 53 51 4c 69 74 65 52 65 6c 65 61  ckForSQLiteRelea
172d0 73 65 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  ses $::test_chan
172e0 6e 65 6c 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23  nel....        #
172f0 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
17300 3a 20 4e 6f 77 2c 20 77 65 20 6e 65 65 64 20 74  : Now, we need t
17310 6f 20 6b 6e 6f 77 20 69 66 20 74 68 65 20 53 51  o know if the SQ
17320 4c 69 74 65 20 63 6f 72 65 20 6c 69 62 72 61 72  Lite core librar
17330 79 20 69 73 20 61 76 61 69 6c 61 62 6c 65 0d 0a  y is available..
17340 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
17350 28 69 2e 65 2e 20 62 65 63 61 75 73 65 20 74 68  (i.e. because th
17360 65 20 6d 61 6e 61 67 65 64 2d 6f 6e 6c 79 20 53  e managed-only S
17370 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
17380 65 20 61 73 73 65 6d 62 6c 79 20 63 61 6e 0d 0a  e assembly can..
17390 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
173a0 6c 6f 61 64 20 77 69 74 68 6f 75 74 20 69 74 3b  load without it;
173b0 20 68 6f 77 65 76 65 72 2c 20 69 74 20 63 61 6e   however, it can
173c0 6e 6f 74 20 64 6f 20 61 6e 79 74 68 69 6e 67 20  not do anything 
173d0 75 73 65 66 75 6c 20 77 69 74 68 6f 75 74 0d 0a  useful without..
173e0 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
173f0 69 74 29 2e 20 20 49 66 20 77 65 20 61 72 65 20  it).  If we are 
17400 75 73 69 6e 67 20 74 68 65 20 6d 69 78 65 64 2d  using the mixed-
17410 6d 6f 64 65 20 61 73 73 65 6d 62 6c 79 20 61 6e  mode assembly an
17420 64 20 77 65 20 61 6c 72 65 61 64 79 0d 0a 20 20  d we already..  
17430 20 20 20 20 20 20 23 20 20 20 20 20 20 20 66 6f        #       fo
17440 75 6e 64 20 69 74 20 28 61 62 6f 76 65 29 2c 20  und it (above), 
17450 74 68 69 73 20 73 68 6f 75 6c 64 20 61 6c 77 61  this should alwa
17460 79 73 20 73 75 63 63 65 65 64 2e 0d 0a 20 20 20  ys succeed...   
17470 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
17480 63 68 65 63 6b 46 6f 72 53 51 4c 69 74 65 4c 69  checkForSQLiteLi
17490 62 72 61 72 79 20 24 3a 3a 74 65 73 74 5f 63 68  brary $::test_ch
174a0 61 6e 6e 65 6c 0d 0a 0d 0a 20 20 20 20 20 20 20  annel....       
174b0 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
174c0 54 45 3a 20 43 68 65 63 6b 20 69 66 20 74 68 65  TE: Check if the
174d0 20 53 51 4c 69 74 65 20 69 6e 74 65 72 6f 70 20   SQLite interop 
174e0 61 73 73 65 6d 62 6c 79 20 69 73 20 61 76 61 69  assembly is avai
174f0 6c 61 62 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20  lable...        
17500 23 0d 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b  #..        check
17510 46 6f 72 53 51 4c 69 74 65 49 6e 74 65 72 6f 70  ForSQLiteInterop
17520 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
17530 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  ....        #.. 
17540 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43         # NOTE: C
17550 68 65 63 6b 20 74 68 65 20 53 51 4c 69 74 65 20  heck the SQLite 
17560 64 61 74 61 62 61 73 65 20 61 6e 64 20 74 65 6d  database and tem
17570 70 6f 72 61 72 79 20 64 69 72 65 63 74 6f 72 69  porary directori
17580 65 73 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  es...        #..
17590 20 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72          checkFor
175a0 53 51 4c 69 74 65 44 69 72 65 63 74 6f 72 69 65  SQLiteDirectorie
175b0 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
175c0 6c 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  l....        #..
175d0 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
175e0 41 74 74 65 6d 70 74 20 74 6f 20 64 65 74 65 72  Attempt to deter
175f0 6d 69 6e 65 20 69 66 20 76 61 72 69 6f 75 73 20  mine if various 
17600 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74  compile-time opt
17610 69 6f 6e 73 20 6e 65 65 64 65 64 20 66 6f 72 0d  ions needed for.
17620 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
17630 20 74 65 73 74 20 63 6f 6e 73 74 72 61 69 6e 74   test constraint
17640 73 20 77 65 72 65 20 65 6e 61 62 6c 65 64 20 66  s were enabled f
17650 6f 72 20 74 68 65 20 6d 61 6e 61 67 65 64 20 61  or the managed a
17660 73 73 65 6d 62 6c 79 2e 20 20 54 68 65 72 65 0d  ssembly.  There.
17670 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
17680 20 61 72 65 20 73 6f 6d 65 20 63 6f 6d 70 69 6c   are some compil
17690 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 73 20 74  e-time options t
176a0 68 61 74 20 6d 75 73 74 20 61 6c 73 6f 20 68 61  hat must also ha
176b0 76 65 20 62 65 65 6e 20 65 6e 61 62 6c 65 64 0d  ve been enabled.
176c0 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
176d0 20 66 6f 72 20 74 68 65 20 69 6e 74 65 72 6f 70   for the interop
176e0 20 61 73 73 65 6d 62 6c 79 20 69 6e 20 6f 72 64   assembly in ord
176f0 65 72 20 74 6f 20 62 65 20 65 66 66 65 63 74 69  er to be effecti
17700 76 65 2e 20 20 46 6f 72 20 74 68 6f 73 65 0d 0a  ve.  For those..
17710 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
17720 6f 70 74 69 6f 6e 73 2c 20 69 74 20 77 69 6c 6c  options, it will
17730 20 62 65 20 61 73 73 75 6d 65 64 20 74 68 61 74   be assumed that
17740 20 69 74 20 77 61 73 20 65 6e 61 62 6c 65 64 20   it was enabled 
17750 66 6f 72 20 74 68 65 20 69 6e 74 65 72 6f 70 0d  for the interop.
17760 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
17770 20 61 73 73 65 6d 62 6c 79 20 69 66 20 69 74 20   assembly if it 
17780 77 61 73 20 65 6e 61 62 6c 65 64 20 66 6f 72 20  was enabled for 
17790 74 68 65 20 6d 61 6e 61 67 65 64 20 61 73 73 65  the managed asse
177a0 6d 62 6c 79 2e 0d 0a 20 20 20 20 20 20 20 20 23  mbly...        #
177b0 0d 0a 20 20 20 20 20 20 20 20 66 6f 72 65 61 63  ..        foreac
177c0 68 20 64 65 66 69 6e 65 43 6f 6e 73 74 61 6e 74  h defineConstant
177d0 20 5b 6c 69 73 74 20 5c 0d 0a 20 20 20 20 20 20   [list \..      
177e0 20 20 20 20 20 20 43 48 45 43 4b 5f 53 54 41 54        CHECK_STAT
177f0 45 20 43 4f 55 4e 54 5f 48 41 4e 44 4c 45 20 44  E COUNT_HANDLE D
17800 45 42 55 47 20 49 4e 54 45 52 4f 50 5f 43 4f 44  EBUG INTEROP_COD
17810 45 43 20 49 4e 54 45 52 4f 50 5f 44 45 42 55 47  EC INTEROP_DEBUG
17820 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
17830 49 4e 54 45 52 4f 50 5f 45 58 54 45 4e 53 49 4f  INTEROP_EXTENSIO
17840 4e 5f 46 55 4e 43 54 49 4f 4e 53 20 49 4e 54 45  N_FUNCTIONS INTE
17850 52 4f 50 5f 4c 45 47 41 43 59 5f 43 4c 4f 53 45  ROP_LEGACY_CLOSE
17860 20 49 4e 54 45 52 4f 50 5f 4c 4f 47 20 5c 0d 0a   INTEROP_LOG \..
17870 20 20 20 20 20 20 20 20 20 20 20 20 49 4e 54 45              INTE
17880 52 4f 50 5f 54 45 53 54 5f 45 58 54 45 4e 53 49  ROP_TEST_EXTENSI
17890 4f 4e 20 49 4e 54 45 52 4f 50 5f 56 49 52 54 55  ON INTEROP_VIRTU
178a0 41 4c 5f 54 41 42 4c 45 20 4e 45 54 5f 32 30 20  AL_TABLE NET_20 
178b0 4e 45 54 5f 33 35 20 5c 0d 0a 20 20 20 20 20 20  NET_35 \..      
178c0 20 20 20 20 20 20 4e 45 54 5f 34 30 20 4e 45 54        NET_40 NET
178d0 5f 34 35 20 4e 45 54 5f 34 35 31 20 4e 45 54 5f  _45 NET_451 NET_
178e0 43 4f 4d 50 41 43 54 5f 32 30 20 50 4c 41 54 46  COMPACT_20 PLATF
178f0 4f 52 4d 5f 43 4f 4d 50 41 43 54 46 52 41 4d 45  ORM_COMPACTFRAME
17900 57 4f 52 4b 20 5c 0d 0a 20 20 20 20 20 20 20 20  WORK \..        
17910 20 20 20 20 50 52 45 4c 4f 41 44 5f 4e 41 54 49      PRELOAD_NATI
17920 56 45 5f 4c 49 42 52 41 52 59 20 52 45 54 41 52  VE_LIBRARY RETAR
17930 47 45 54 41 42 4c 45 20 53 51 4c 49 54 45 5f 53  GETABLE SQLITE_S
17940 54 41 4e 44 41 52 44 20 5c 0d 0a 20 20 20 20 20  TANDARD \..     
17950 20 20 20 20 20 20 20 54 48 52 4f 57 5f 4f 4e 5f         THROW_ON_
17960 44 49 53 50 4f 53 45 44 20 54 52 41 43 45 20 54  DISPOSED TRACE T
17970 52 41 43 45 5f 43 4f 4e 4e 45 43 54 49 4f 4e 20  RACE_CONNECTION 
17980 54 52 41 43 45 5f 48 41 4e 44 4c 45 20 5c 0d 0a  TRACE_HANDLE \..
17990 20 20 20 20 20 20 20 20 20 20 20 20 54 52 41 43              TRAC
179a0 45 5f 50 52 45 4c 4f 41 44 20 54 52 41 43 45 5f  E_PRELOAD TRACE_
179b0 53 48 41 52 45 44 20 54 52 41 43 45 5f 53 54 41  SHARED TRACE_STA
179c0 54 45 4d 45 4e 54 20 54 52 41 43 45 5f 57 41 52  TEMENT TRACE_WAR
179d0 4e 49 4e 47 20 5c 0d 0a 20 20 20 20 20 20 20 20  NING \..        
179e0 20 20 20 20 54 52 41 43 4b 5f 4d 45 4d 4f 52 59      TRACK_MEMORY
179f0 5f 42 59 54 45 53 20 55 53 45 5f 49 4e 54 45 52  _BYTES USE_INTER
17a00 4f 50 5f 44 4c 4c 20 55 53 45 5f 50 52 45 50 41  OP_DLL USE_PREPA
17a10 52 45 5f 56 32 20 57 49 4e 44 4f 57 53 5d 20 7b  RE_V2 WINDOWS] {
17a20 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20  ..          #.. 
17a30 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a           # NOTE:
17a40 20 43 68 65 63 6b 20 69 66 20 74 68 65 20 63 6f   Check if the co
17a50 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f  mpile-time optio
17a60 6e 20 69 73 20 6c 69 73 74 65 64 20 69 6e 20 74  n is listed in t
17a70 68 65 20 6c 69 73 74 20 6f 66 0d 0a 20 20 20 20  he list of..    
17a80 20 20 20 20 20 20 23 20 20 20 20 20 20 20 22 64        #       "d
17a90 65 66 69 6e 65 20 63 6f 6e 73 74 61 6e 74 73 22  efine constants"
17aa0 20 6b 65 70 74 20 74 72 61 63 6b 20 6f 66 20 62   kept track of b
17ab0 79 20 74 68 65 20 6d 61 6e 61 67 65 64 20 61 73  y the managed as
17ac0 73 65 6d 62 6c 79 2e 0d 0a 20 20 20 20 20 20 20  sembly...       
17ad0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
17ae0 63 68 65 63 6b 46 6f 72 53 51 4c 69 74 65 44 65  checkForSQLiteDe
17af0 66 69 6e 65 43 6f 6e 73 74 61 6e 74 20 24 3a 3a  fineConstant $::
17b00 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 24 64 65  test_channel $de
17b10 66 69 6e 65 43 6f 6e 73 74 61 6e 74 0d 0a 20 20  fineConstant..  
17b20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
17b30 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
17b40 4e 4f 54 45 3a 20 43 68 65 63 6b 20 74 68 65 20  NOTE: Check the 
17b50 63 75 72 72 65 6e 74 20 62 75 69 6c 64 20 79 65  current build ye
17b60 61 72 2e 20 20 42 61 73 69 63 61 6c 6c 79 2c 20  ar.  Basically, 
17b70 74 68 69 73 20 69 6e 64 69 63 61 74 65 73 0d 0a  this indicates..
17b80 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
17b90 77 68 69 63 68 20 76 65 72 73 69 6f 6e 20 6f 66  which version of
17ba0 20 4d 53 42 75 69 6c 64 20 61 6e 64 2f 6f 72 20   MSBuild and/or 
17bb0 56 69 73 75 61 6c 20 53 74 75 64 69 6f 20 77 61  Visual Studio wa
17bc0 73 20 75 73 65 64 20 74 6f 0d 0a 20 20 20 20 20  s used to..     
17bd0 20 20 20 23 20 20 20 20 20 20 20 63 6f 6d 70 69     #       compi
17be0 6c 65 20 74 68 65 20 61 73 73 65 6d 62 6c 79 20  le the assembly 
17bf0 62 69 6e 61 72 69 65 73 20 75 6e 64 65 72 20 74  binaries under t
17c00 65 73 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  est...        #.
17c10 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24  .        tputs $
17c20 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5c  ::test_channel \
17c30 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 2d  ..            "-
17c40 2d 2d 2d 20 63 68 65 63 6b 69 6e 67 20 66 6f 72  --- checking for
17c50 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c   System.Data.SQL
17c60 69 74 65 20 62 75 69 6c 64 20 79 65 61 72 2e 2e  ite build year..
17c70 2e 20 22 0d 0a 0d 0a 20 20 20 20 20 20 20 20 73  . "....        s
17c80 65 74 20 79 65 61 72 20 5b 67 65 74 42 75 69 6c  et year [getBuil
17c90 64 59 65 61 72 5d 0d 0a 20 20 20 20 20 20 20 20  dYear]..        
17ca0 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61  addConstraint [a
17cb0 70 70 65 6e 64 41 72 67 73 20 62 75 69 6c 64 59  ppendArgs buildY
17cc0 65 61 72 2e 20 24 79 65 61 72 5d 0d 0a 20 20 20  ear. $year]..   
17cd0 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
17ce0 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
17cf0 6e 64 41 72 67 73 20 5c 22 20 24 79 65 61 72 20  ndArgs \" $year 
17d00 5c 22 5c 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  \"\n]....       
17d10 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
17d20 54 45 3a 20 43 68 65 63 6b 20 74 68 65 20 63 75  TE: Check the cu
17d30 72 72 65 6e 74 20 62 75 69 6c 64 20 63 6f 6e 66  rrent build conf
17d40 69 67 75 72 61 74 69 6f 6e 2e 20 20 54 68 69 73  iguration.  This
17d50 20 73 68 6f 75 6c 64 20 6e 6f 72 6d 61 6c 6c 79   should normally
17d60 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
17d70 20 20 62 65 20 65 69 74 68 65 72 20 22 44 65 62    be either "Deb
17d80 75 67 22 20 6f 72 20 22 52 65 6c 65 61 73 65 22  ug" or "Release"
17d90 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
17da0 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
17db0 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5c 0d 0a 20  est_channel \.. 
17dc0 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
17dd0 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 53 79   checking for Sy
17de0 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
17df0 20 62 75 69 6c 64 20 63 6f 6e 66 69 67 75 72 61   build configura
17e00 74 69 6f 6e 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20  tion... "....   
17e10 20 20 20 20 20 73 65 74 20 63 6f 6e 66 69 67 75       set configu
17e20 72 61 74 69 6f 6e 20 5b 67 65 74 42 75 69 6c 64  ration [getBuild
17e30 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 5d 0d 0a  Configuration]..
17e40 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74          addConst
17e50 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67  raint [appendArg
17e60 73 20 62 75 69 6c 64 43 6f 6e 66 69 67 75 72 61  s buildConfigura
17e70 74 69 6f 6e 2e 20 24 63 6f 6e 66 69 67 75 72 61  tion. $configura
17e80 74 69 6f 6e 5d 0d 0a 20 20 20 20 20 20 20 20 74  tion]..        t
17e90 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
17ea0 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
17eb0 20 5c 22 20 24 63 6f 6e 66 69 67 75 72 61 74 69   \" $configurati
17ec0 6f 6e 20 5c 22 5c 6e 5d 0d 0a 0d 0a 20 20 20 20  on \"\n]....    
17ed0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
17ee0 20 4e 4f 54 45 3a 20 54 72 79 20 74 6f 20 73 65   NOTE: Try to se
17ef0 74 75 70 20 61 6e 20 69 6e 74 65 72 72 75 70 74  tup an interrupt
17f00 20 63 61 6c 6c 62 61 63 6b 20 75 73 69 6e 67 20   callback using 
17f10 74 68 65 20 73 63 72 69 70 74 20 64 65 62 75 67  the script debug
17f20 67 65 72 0d 0a 20 20 20 20 20 20 20 20 23 20 20  ger..        #  
17f30 20 20 20 20 20 74 68 61 74 20 77 69 6c 6c 20 63       that will c
17f40 61 6e 63 65 6c 20 61 6c 6c 20 53 51 4c 20 71 75  ancel all SQL qu
17f50 65 72 69 65 73 20 69 6e 20 70 72 6f 67 72 65 73  eries in progres
17f60 73 20 66 6f 72 20 61 6c 6c 20 64 61 74 61 62 61  s for all databa
17f70 73 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  se..        #   
17f80 20 20 20 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20      connections 
17f90 6b 6e 6f 77 6e 20 74 6f 20 74 68 69 73 20 69 6e  known to this in
17fa0 74 65 72 70 72 65 74 65 72 2e 0d 0a 20 20 20 20  terpreter...    
17fb0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 69      #..        i
17fc0 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73  f {![info exists
17fd0 20 3a 3a 6e 6f 28 73 71 6c 69 74 65 49 6e 74 65   ::no(sqliteInte
17fe0 72 72 75 70 74 43 61 6c 6c 62 61 63 6b 29 5d 7d  rruptCallback)]}
17ff0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
18000 20 20 20 73 65 74 75 70 44 62 49 6e 74 65 72 72     setupDbInterr
18010 75 70 74 43 61 6c 6c 62 61 63 6b 20 24 3a 3a 74  uptCallback $::t
18020 65 73 74 5f 63 68 61 6e 6e 65 6c 20 24 3a 3a 74  est_channel $::t
18030 65 73 74 5f 6c 6f 67 0d 0a 20 20 20 20 20 20 20  est_log..       
18040 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d   }....        #.
18050 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
18060 20 43 68 65 63 6b 20 66 6f 72 20 74 68 65 20 6e   Check for the n
18070 61 74 69 76 65 20 72 75 6e 74 69 6d 65 20 6f 70  ative runtime op
18080 74 69 6f 6e 2c 20 77 68 69 63 68 20 77 6f 75 6c  tion, which woul
18090 64 20 6d 65 61 6e 20 77 65 20 61 72 65 0d 0a 20  d mean we are.. 
180a0 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 75         #       u
180b0 73 69 6e 67 20 74 68 65 20 6d 69 78 65 64 2d 6d  sing the mixed-m
180c0 6f 64 65 20 61 73 73 65 6d 62 6c 79 2e 0d 0a 20  ode assembly... 
180d0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
180e0 20 20 63 68 65 63 6b 46 6f 72 52 75 6e 74 69 6d    checkForRuntim
180f0 65 4f 70 74 69 6f 6e 20 24 3a 3a 74 65 73 74 5f  eOption $::test_
18100 63 68 61 6e 6e 65 6c 20 6e 61 74 69 76 65 0d 0a  channel native..
18110 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
18120 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68 65       # NOTE: Che
18130 63 6b 20 69 66 20 74 68 65 20 74 65 73 74 20 73  ck if the test s
18140 75 69 74 65 20 73 68 6f 75 6c 64 20 63 6f 75 6e  uite should coun
18150 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  t the number of 
18160 63 6f 6e 6e 65 63 74 69 6f 6e 73 0d 0a 20 20 20  connections..   
18170 20 20 20 20 20 23 20 20 20 20 20 20 20 22 6f 70       #       "op
18180 65 6e 65 64 22 20 61 6e 64 20 22 63 6c 6f 73 65  ened" and "close
18190 64 22 20 66 72 6f 6d 20 74 68 65 20 70 6f 6f 6c  d" from the pool
181a0 20 77 68 65 6e 20 64 65 74 65 72 6d 69 6e 69 6e   when determinin
181b0 67 20 69 66 20 61 20 74 65 73 74 0d 0a 20 20 20  g if a test..   
181c0 20 20 20 20 20 23 20 20 20 20 20 20 20 70 61 73       #       pas
181d0 73 65 64 2e 20 20 44 69 73 61 62 6c 69 6e 67 20  sed.  Disabling 
181e0 74 68 69 73 20 62 65 68 61 76 69 6f 72 20 69 73  this behavior is
181f0 20 73 6f 6d 65 74 69 6d 65 73 20 6e 65 63 65 73   sometimes neces
18200 73 61 72 79 20 28 65 2e 67 2e 0d 0a 20 20 20 20  sary (e.g...    
18210 20 20 20 20 23 20 20 20 20 20 20 20 64 75 72 69      #       duri
18220 6e 67 20 74 68 65 20 72 65 6c 65 61 73 65 20 74  ng the release t
18230 65 73 74 69 6e 67 20 70 72 6f 63 65 73 73 29 20  esting process) 
18240 62 65 63 61 75 73 65 20 74 68 65 72 65 20 61 72  because there ar
18250 65 20 73 65 76 65 72 61 6c 0d 0a 20 20 20 20 20  e several..     
18260 20 20 20 23 20 20 20 20 20 20 20 74 65 73 74 73     #       tests
18270 20 74 68 61 74 20 72 65 6c 79 20 6f 6e 20 74 68   that rely on th
18280 65 20 22 6f 70 65 6e 65 64 20 66 72 6f 6d 20 70  e "opened from p
18290 6f 6f 6c 22 20 63 6f 75 6e 74 20 62 65 69 6e 67  ool" count being
182a0 20 67 72 65 61 74 65 72 0d 0a 20 20 20 20 20 20   greater..      
182b0 20 20 23 20 20 20 20 20 20 20 74 68 61 6e 20 7a    #       than z
182c0 65 72 6f 2e 20 20 54 68 65 73 65 20 74 65 73 74  ero.  These test
182d0 73 20 6d 61 79 20 66 61 69 6c 20 64 75 65 20 74  s may fail due t
182e0 6f 20 74 68 65 20 6e 6f 6e 2d 64 65 74 65 72 6d  o the non-determ
182f0 69 6e 69 73 74 69 63 0d 0a 20 20 20 20 20 20 20  inistic..       
18300 20 23 20 20 20 20 20 20 20 62 65 68 61 76 69 6f   #       behavio
18310 72 20 6f 66 20 74 68 65 20 43 4c 52 20 47 43 2c  r of the CLR GC,
18320 20 65 76 65 6e 20 77 68 65 6e 20 74 68 65 72 65   even when there
18330 20 69 73 20 6e 6f 20 62 75 67 20 69 6e 20 74 68   is no bug in th
18340 65 20 63 6f 64 65 0d 0a 20 20 20 20 20 20 20 20  e code..        
18350 23 20 20 20 20 20 20 20 62 65 69 6e 67 20 74 65  #       being te
18360 73 74 65 64 2e 0d 0a 20 20 20 20 20 20 20 20 23  sted...        #
18370 0d 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b 46  ..        checkF
18380 6f 72 52 75 6e 74 69 6d 65 4f 70 74 69 6f 6e 20  orRuntimeOption 
18390 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
183a0 6e 6f 50 6f 6f 6c 43 6f 75 6e 74 73 0d 0a 0d 0a  noPoolCounts....
183b0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
183c0 20 20 20 23 20 4e 4f 54 45 3a 20 52 65 70 6f 72     # NOTE: Repor
183d0 74 20 74 68 65 20 72 65 73 6f 75 72 63 65 20 75  t the resource u
183e0 73 61 67 65 20 70 72 69 6f 72 20 74 6f 20 72 75  sage prior to ru
183f0 6e 6e 69 6e 67 20 61 6e 79 20 74 65 73 74 73 2e  nning any tests.
18400 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
18410 20 20 20 20 20 72 65 70 6f 72 74 53 51 4c 69 74       reportSQLit
18420 65 52 65 73 6f 75 72 63 65 73 20 24 3a 3a 74 65  eResources $::te
18430 73 74 5f 63 68 61 6e 6e 65 6c 0d 0a 0d 0a 20 20  st_channel....  
18440 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
18450 20 23 20 4e 4f 54 45 3a 20 53 68 6f 77 20 74 68   # NOTE: Show th
18460 65 20 61 63 74 69 76 65 20 74 65 73 74 20 63 6f  e active test co
18470 6e 73 74 72 61 69 6e 74 73 2e 0d 0a 20 20 20 20  nstraints...    
18480 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 74      #..        t
18490 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
184a0 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
184b0 20 22 2d 2d 2d 2d 20 63 6f 6e 73 74 72 61 69 6e   "---- constrain
184c0 74 73 3a 20 22 20 5c 0d 0a 20 20 20 20 20 20 20  ts: " \..       
184d0 20 20 20 20 20 5b 66 6f 72 6d 61 74 4c 69 73 74       [formatList
184e0 20 5b 6c 73 6f 72 74 20 5b 67 65 74 43 6f 6e 73   [lsort [getCons
184f0 74 72 61 69 6e 74 73 5d 5d 20 3c 6e 6f 6e 65 3e  traints]] <none>
18500 5d 20 5c 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  ] \n]....       
18510 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
18520 54 45 3a 20 53 61 76 65 20 74 68 65 20 74 65 73  TE: Save the tes
18530 74 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 66 6f  t constraints fo
18540 72 20 75 73 65 20 62 79 20 74 68 72 65 61 64 73  r use by threads
18550 20 63 72 65 61 74 65 64 20 69 6e 20 74 68 69 73   created in this
18560 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
18570 20 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 64 6f    application do
18580 6d 61 69 6e 2e 20 20 54 68 69 73 20 69 73 20 6e  main.  This is n
18590 65 63 65 73 73 61 72 79 20 62 65 63 61 75 73 65  ecessary because
185a0 20 61 6c 6c 20 74 68 65 20 45 61 67 6c 65 0d 0a   all the Eagle..
185b0 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
185c0 22 74 65 73 74 20 63 6f 6e 74 65 78 74 22 20 69  "test context" i
185d0 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 70 65  nformation is pe
185e0 72 2d 74 68 72 65 61 64 2e 0d 0a 20 20 20 20 20  r-thread...     
185f0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 69 66     #..        if
18600 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20   {![info exists 
18610 3a 3a 74 65 73 74 5f 63 6f 6e 73 74 72 61 69 6e  ::test_constrain
18620 74 73 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  ts]} then {..   
18630 20 20 20 20 20 20 20 73 65 74 20 3a 3a 74 65 73         set ::tes
18640 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 24 3a  t_constraints $:
18650 3a 65 61 67 6c 65 5f 74 65 73 74 73 28 63 6f 6e  :eagle_tests(con
18660 73 74 72 61 69 6e 74 73 29 0d 0a 20 20 20 20 20  straints)..     
18670 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
18680 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
18690 45 3a 20 4c 6f 61 64 20 74 68 65 20 22 61 66 74  E: Load the "aft
186a0 65 72 2d 63 6f 6e 73 74 72 61 69 6e 74 73 22 20  er-constraints" 
186b0 63 75 73 74 6f 6d 20 70 65 72 2d 75 73 65 72 20  custom per-user 
186c0 61 6e 64 2f 6f 72 20 70 65 72 2d 68 6f 73 74 0d  and/or per-host.
186d0 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
186e0 20 74 65 73 74 20 73 65 74 74 69 6e 67 73 20 6e   test settings n
186f0 6f 77 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  ow...        #..
18700 20 20 20 20 20 20 20 20 75 70 6c 65 76 65 6c 20          uplevel 
18710 31 20 5b 6c 69 73 74 20 6c 6f 61 64 53 51 4c 69  1 [list loadSQLi
18720 74 65 54 65 73 74 53 65 74 74 69 6e 67 73 20 24  teTestSettings $
18730 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 2e  ::test_channel .
18740 61 66 74 65 72 5d 0d 0a 0d 0a 20 20 20 20 20 20  after]....      
18750 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
18760 4f 54 45 3a 20 53 68 6f 77 20 77 68 65 6e 20 6f  OTE: Show when o
18770 75 72 20 74 65 73 74 73 20 61 63 74 75 61 6c 6c  ur tests actuall
18780 79 20 62 65 67 61 6e 20 28 6e 6f 77 29 2e 0d 0a  y began (now)...
18790 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
187a0 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
187b0 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  _channel [append
187c0 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
187d0 20 20 20 20 22 2d 2d 2d 2d 20 53 79 73 74 65 6d      "---- System
187e0 2e 44 61 74 61 2e 53 51 4c 69 74 65 20 74 65 73  .Data.SQLite tes
187f0 74 73 20 62 65 67 61 6e 20 61 74 20 22 20 5c 0d  ts began at " \.
18800 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 63 6c  .            [cl
18810 6f 63 6b 20 66 6f 72 6d 61 74 20 5b 63 6c 6f 63  ock format [cloc
18820 6b 20 73 65 63 6f 6e 64 73 5d 5d 20 5c 6e 5d 0d  k seconds]] \n].
18830 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d  .      }..    }.
18840 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 72 75 6e  ....    proc run
18850 53 51 4c 69 74 65 54 65 73 74 45 70 69 6c 6f 67  SQLiteTestEpilog
18860 75 65 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 23  ue {} {..      #
18870 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
18880 53 6b 69 70 20 72 75 6e 6e 69 6e 67 20 6f 75 72  Skip running our
18890 20 63 75 73 74 6f 6d 20 65 70 69 6c 6f 67 75 65   custom epilogue
188a0 20 69 66 20 74 68 65 20 6d 61 69 6e 20 6f 6e 65   if the main one
188b0 20 68 61 73 20 62 65 65 6e 0d 0a 20 20 20 20 20   has been..     
188c0 20 23 20 20 20 20 20 20 20 73 6b 69 70 70 65 64   #       skipped
188d0 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
188e0 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69    if {![info exi
188f0 73 74 73 20 3a 3a 6e 6f 28 65 70 69 6c 6f 67 75  sts ::no(epilogu
18900 65 2e 65 61 67 6c 65 29 5d 7d 20 74 68 65 6e 20  e.eagle)]} then 
18910 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
18920 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 68        # NOTE: Sh
18930 6f 77 20 77 68 65 6e 20 6f 75 72 20 74 65 73 74  ow when our test
18940 73 20 61 63 74 75 61 6c 6c 79 20 65 6e 64 65 64  s actually ended
18950 20 28 6e 6f 77 29 2e 0d 0a 20 20 20 20 20 20 20   (now)...       
18960 20 23 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74   #..        tput
18970 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
18980 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
18990 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d  .            "--
189a0 2d 2d 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53  -- System.Data.S
189b0 51 4c 69 74 65 20 74 65 73 74 73 20 65 6e 64 65  QLite tests ende
189c0 64 20 61 74 20 22 20 5c 0d 0a 20 20 20 20 20 20  d at " \..      
189d0 20 20 20 20 20 20 5b 63 6c 6f 63 6b 20 66 6f 72        [clock for
189e0 6d 61 74 20 5b 63 6c 6f 63 6b 20 73 65 63 6f 6e  mat [clock secon
189f0 64 73 5d 5d 20 5c 6e 5d 0d 0a 0d 0a 20 20 20 20  ds]] \n]....    
18a00 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
18a10 20 42 55 47 46 49 58 3a 20 42 65 66 6f 72 65 20   BUGFIX: Before 
18a20 63 68 65 63 6b 69 6e 67 20 74 68 65 20 66 69 6e  checking the fin
18a30 61 6c 20 72 65 73 6f 75 72 63 65 73 20 69 6e 20  al resources in 
18a40 75 73 65 20 62 79 20 53 51 4c 69 74 65 2c 20 6d  use by SQLite, m
18a50 61 6b 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20  ake..        #  
18a60 20 20 20 20 20 20 20 73 75 72 65 20 62 6f 74 68         sure both
18a70 20 6f 66 20 74 68 65 20 50 52 41 47 4d 41 20 72   of the PRAGMA r
18a80 65 6c 61 74 65 64 20 64 69 72 65 63 74 6f 72 79  elated directory
18a90 20 6e 61 6d 65 73 20 61 72 65 20 66 72 65 65 64   names are freed
18aa0 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
18ab0 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72 53 51        checkForSQ
18ac0 4c 69 74 65 44 69 72 65 63 74 6f 72 69 65 73 20  LiteDirectories 
18ad0 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
18ae0 74 72 75 65 0d 0a 0d 0a 20 20 20 20 20 20 20 20  true....        
18af0 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
18b00 45 3a 20 41 6c 73 6f 20 72 65 70 6f 72 74 20 74  E: Also report t
18b10 68 65 20 72 65 73 6f 75 72 63 65 20 75 73 61 67  he resource usag
18b20 65 20 61 66 74 65 72 20 72 75 6e 6e 69 6e 67 20  e after running 
18b30 74 68 65 20 74 65 73 74 73 2e 0d 0a 20 20 20 20  the tests...    
18b40 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72      #..        r
18b50 65 70 6f 72 74 53 51 4c 69 74 65 52 65 73 6f 75  eportSQLiteResou
18b60 72 63 65 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  rces $::test_cha
18b70 6e 6e 65 6c 0d 0a 0d 0a 20 20 20 20 20 20 20 20  nnel....        
18b80 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
18b90 45 3a 20 52 65 70 6f 72 74 20 74 68 65 20 63 72  E: Report the cr
18ba0 69 74 69 63 61 6c 20 68 61 6e 64 6c 65 20 63 6f  itical handle co
18bb0 75 6e 74 73 20 61 66 74 65 72 20 72 75 6e 6e 69  unts after runni
18bc0 6e 67 20 74 68 65 20 74 65 73 74 73 2e 0d 0a 20  ng the tests... 
18bd0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
18be0 20 20 67 65 74 53 51 4c 69 74 65 48 61 6e 64 6c    getSQLiteHandl
18bf0 65 43 6f 75 6e 74 73 20 24 3a 3a 74 65 73 74 5f  eCounts $::test_
18c00 63 68 61 6e 6e 65 6c 0d 0a 20 20 20 20 20 20 7d  channel..      }
18c10 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
18c20 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
18c30 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
18c40 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
18c50 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
18c60 23 23 23 23 23 23 23 23 23 23 23 0d 0a 20 20 20  ###########..   
18c70 20 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23   ###############
18c80 23 23 23 23 23 23 23 23 23 23 23 23 23 23 20 45  ############## E
18c90 4e 44 20 45 61 67 6c 65 20 4f 4e 4c 59 20 23 23  ND Eagle ONLY ##
18ca0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
18cb0 23 23 23 23 23 23 23 23 23 23 23 23 0d 0a 20 20  ############..  
18cc0 20 20 23 23 23 23 23 23 23 23 23 23 23 23 23 23    ##############
18cd0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
18ce0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
18cf0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
18d00 23 23 23 23 23 23 23 23 23 23 23 23 23 0d 0a 20  #############.. 
18d10 20 7d 0d 0a 0d 0a 20 20 23 0d 0a 20 20 23 20 4e   }....  #..  # N
18d20 4f 54 45 3a 20 53 61 76 65 20 74 68 65 20 6e 61  OTE: Save the na
18d30 6d 65 20 6f 66 20 74 68 65 20 64 69 72 65 63 74  me of the direct
18d40 6f 72 79 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ory containing t
18d50 68 69 73 20 66 69 6c 65 2e 0d 0a 20 20 23 0d 0a  his file...  #..
18d60 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69    if {![info exi
18d70 73 74 73 20 63 6f 6d 6d 6f 6e 5f 64 69 72 65 63  sts common_direc
18d80 74 6f 72 79 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  tory]} then {.. 
18d90 20 20 20 73 65 74 20 63 6f 6d 6d 6f 6e 5f 64 69     set common_di
18da0 72 65 63 74 6f 72 79 20 5b 66 69 6c 65 20 64 69  rectory [file di
18db0 72 6e 61 6d 65 20 5b 69 6e 66 6f 20 73 63 72 69  rname [info scri
18dc0 70 74 5d 5d 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 23  pt]]..  }....  #
18dd0 0d 0a 20 20 23 20 4e 4f 54 45 3a 20 50 72 6f 76  ..  # NOTE: Prov
18de0 69 64 65 20 74 68 65 20 53 79 73 74 65 6d 2e 44  ide the System.D
18df0 61 74 61 2e 53 51 4c 69 74 65 20 74 65 73 74 20  ata.SQLite test 
18e00 70 61 63 6b 61 67 65 20 74 6f 20 74 68 65 20 69  package to the i
18e10 6e 74 65 72 70 72 65 74 65 72 2e 0d 0a 20 20 23  nterpreter...  #
18e20 0d 0a 20 20 70 61 63 6b 61 67 65 20 70 72 6f 76  ..  package prov
18e30 69 64 65 20 53 79 73 74 65 6d 2e 44 61 74 61 2e  ide System.Data.
18e40 53 51 4c 69 74 65 2e 54 65 73 74 20 31 2e 30 0d  SQLite.Test 1.0.
18e50 0a 7d 0d 0a                                      .}..