System.Data.SQLite
Hex Artifact Content
Not logged in

Artifact c013b1d292385f342c7249466820d57b7d35c146:


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 6f 72 20 32 30 31 32 20 62   2010, or 2012 b
0460: 75 69 6c 64 20 73 79 73 74 65 6d 73 2e 20 20 54  uild systems.  T
0470: 6f 20 6f 76 65 72 72 69 64 65 20 74 68 69 73 20  o override this 
0480: 76 61 6c 75 65 0d 0a 20 20 20 20 20 20 23 20 20  value..      #  
0490: 20 20 20 20 20 76 69 61 20 74 68 65 20 63 6f 6d       via the com
04a0: 6d 61 6e 64 20 6c 69 6e 65 2c 20 65 6e 74 65 72  mand line, enter
04b0: 20 61 20 63 6f 6d 6d 61 6e 64 20 73 69 6d 69 6c   a command simil
04c0: 61 72 20 74 6f 20 6f 6e 65 20 6f 66 20 74 68 65  ar to one of the
04d0: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
04e0: 66 6f 6c 6c 6f 77 69 6e 67 20 28 61 6c 6c 20 6f  following (all o
04f0: 6e 20 6f 6e 65 20 6c 69 6e 65 29 3a 0d 0a 20 20  n one line):..  
0500: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 20      #..      #  
0510: 20 20 20 20 20 45 61 67 6c 65 53 68 65 6c 6c 2e       EagleShell.
0520: 65 78 65 20 2d 70 72 65 49 6e 69 74 69 61 6c 69  exe -preInitiali
0530: 7a 65 20 22 73 65 74 20 74 65 73 74 5f 79 65 61  ze "set test_yea
0540: 72 20 32 30 30 35 22 0d 0a 20 20 20 20 20 20 23  r 2005"..      #
0550: 20 20 20 20 20 20 20 20 20 2d 66 69 6c 65 20 2e           -file .
0560: 5c 70 61 74 68 5c 74 6f 5c 61 6c 6c 2e 65 61 67  \path\to\all.eag
0570: 6c 65 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  le..      #..   
0580: 20 20 20 23 20 20 20 20 20 20 20 45 61 67 6c 65     #       Eagle
0590: 53 68 65 6c 6c 2e 65 78 65 20 2d 70 72 65 49 6e  Shell.exe -preIn
05a0: 69 74 69 61 6c 69 7a 65 20 22 73 65 74 20 74 65  itialize "set te
05b0: 73 74 5f 79 65 61 72 20 32 30 30 38 22 0d 0a 20  st_year 2008".. 
05c0: 20 20 20 20 20 23 20 20 20 20 20 20 20 20 20 2d       #         -
05d0: 66 69 6c 65 20 2e 5c 70 61 74 68 5c 74 6f 5c 61  file .\path\to\a
05e0: 6c 6c 2e 65 61 67 6c 65 0d 0a 20 20 20 20 20 20  ll.eagle..      
05f0: 23 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  #..      #      
0600: 20 45 61 67 6c 65 53 68 65 6c 6c 2e 65 78 65 20   EagleShell.exe 
0610: 2d 70 72 65 49 6e 69 74 69 61 6c 69 7a 65 20 22  -preInitialize "
0620: 73 65 74 20 74 65 73 74 5f 79 65 61 72 20 32 30  set test_year 20
0630: 31 30 22 0d 0a 20 20 20 20 20 20 23 20 20 20 20  10"..      #    
0640: 20 20 20 20 20 2d 66 69 6c 65 20 2e 5c 70 61 74       -file .\pat
0650: 68 5c 74 6f 5c 61 6c 6c 2e 65 61 67 6c 65 0d 0a  h\to\all.eagle..
0660: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
0670: 20 20 20 20 20 20 20 45 61 67 6c 65 53 68 65 6c         EagleShel
0680: 6c 2e 65 78 65 20 2d 70 72 65 49 6e 69 74 69 61  l.exe -preInitia
0690: 6c 69 7a 65 20 22 73 65 74 20 74 65 73 74 5f 79  lize "set test_y
06a0: 65 61 72 20 32 30 31 32 22 0d 0a 20 20 20 20 20  ear 2012"..     
06b0: 20 23 20 20 20 20 20 20 20 20 20 2d 66 69 6c 65   #         -file
06c0: 20 2e 5c 70 61 74 68 5c 74 6f 5c 61 6c 6c 2e 65   .\path\to\all.e
06d0: 61 67 6c 65 0d 0a 20 20 20 20 20 20 23 0d 0a 20  agle..      #.. 
06e0: 20 20 20 20 20 23 20 20 20 20 20 20 20 45 61 67       #       Eag
06f0: 6c 65 53 68 65 6c 6c 2e 65 78 65 20 2d 70 72 65  leShell.exe -pre
0700: 49 6e 69 74 69 61 6c 69 7a 65 20 22 75 6e 73 65  Initialize "unse
0710: 74 20 2d 6e 6f 63 6f 6d 70 6c 61 69 6e 20 74 65  t -nocomplain te
0720: 73 74 5f 79 65 61 72 22 0d 0a 20 20 20 20 20 20  st_year"..      
0730: 23 20 20 20 20 20 20 20 20 20 2d 66 69 6c 65 20  #         -file 
0740: 2e 5c 70 61 74 68 5c 74 6f 5c 61 6c 6c 2e 65 61  .\path\to\all.ea
0750: 67 6c 65 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  gle..      #..  
0760: 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78      if {[info ex
0770: 69 73 74 73 20 3a 3a 74 65 73 74 5f 79 65 61 72  ists ::test_year
0780: 5d 20 26 26 20 5b 73 74 72 69 6e 67 20 6c 65 6e  ] && [string len
0790: 67 74 68 20 24 3a 3a 74 65 73 74 5f 79 65 61 72  gth $::test_year
07a0: 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20  ] > 0} then {.. 
07b0: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
07c0: 20 20 23 20 4e 4f 54 45 3a 20 55 73 65 20 74 68    # NOTE: Use th
07d0: 65 20 73 70 65 63 69 66 69 65 64 20 74 65 73 74  e specified test
07e0: 20 79 65 61 72 2e 20 20 49 66 20 74 68 69 73 20   year.  If this 
07f0: 76 61 72 69 61 62 6c 65 20 69 73 20 6e 6f 74 20  variable is not 
0800: 73 65 74 2c 20 74 68 65 0d 0a 20 20 20 20 20 20  set, the..      
0810: 20 20 23 20 20 20 20 20 20 20 64 65 66 61 75 6c    #       defaul
0820: 74 20 76 61 6c 75 65 20 77 69 6c 6c 20 62 65 20  t value will be 
0830: 62 61 73 65 64 20 6f 6e 20 77 68 65 74 68 65 72  based on whether
0840: 20 6f 72 20 6e 6f 74 20 45 61 67 6c 65 20 68 61   or not Eagle ha
0850: 73 20 62 65 65 6e 0d 0a 20 20 20 20 20 20 20 20  s been..        
0860: 23 20 20 20 20 20 20 20 63 6f 6d 70 69 6c 65 64  #       compiled
0870: 20 61 67 61 69 6e 73 74 20 74 68 65 20 43 4c 52   against the CLR
0880: 20 76 32 2e 30 20 6f 72 20 43 4c 52 20 76 34 2e   v2.0 or CLR v4.
0890: 30 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  0...        #.. 
08a0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 3a         return $:
08b0: 3a 74 65 73 74 5f 79 65 61 72 0d 0a 20 20 20 20  :test_year..    
08c0: 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
08d0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
08e0: 20 4e 4f 54 45 3a 20 49 66 20 45 61 67 6c 65 20   NOTE: If Eagle 
08f0: 68 61 73 20 62 65 65 6e 20 63 6f 6d 70 69 6c 65  has been compile
0900: 64 20 61 67 61 69 6e 73 74 20 74 68 65 20 43 4c  d against the CL
0910: 52 20 76 34 2e 30 2c 20 75 73 65 20 22 32 30 31  R v4.0, use "201
0920: 30 22 20 62 79 0d 0a 20 20 20 20 20 20 20 20 23  0" by..        #
0930: 20 20 20 20 20 20 20 64 65 66 61 75 6c 74 20 28         default (
0940: 77 65 20 63 6f 75 6c 64 20 75 73 65 20 22 32 30  we could use "20
0950: 31 32 22 20 69 6e 20 74 68 61 74 20 63 61 73 65  12" in that case
0960: 20 61 73 20 77 65 6c 6c 29 20 61 73 20 74 68 65   as well) as the
0970: 20 74 65 73 74 0d 0a 20 20 20 20 20 20 20 20 23   test..        #
0980: 20 20 20 20 20 20 20 79 65 61 72 3b 20 6f 74 68         year; oth
0990: 65 72 77 69 73 65 2c 20 75 73 65 20 22 32 30 30  erwise, use "200
09a0: 38 22 20 62 79 20 64 65 66 61 75 6c 74 20 28 77  8" by default (w
09b0: 65 20 63 6f 75 6c 64 20 75 73 65 20 22 32 30 30  e could use "200
09c0: 35 22 20 69 6e 0d 0a 20 20 20 20 20 20 20 20 23  5" in..        #
09d0: 20 20 20 20 20 20 20 74 68 61 74 20 63 61 73 65         that case
09e0: 20 61 73 20 77 65 6c 6c 29 2e 20 20 49 66 20 61   as well).  If a
09f0: 6e 6f 74 68 65 72 20 6d 61 6a 6f 72 20 5b 69 6e  nother major [in
0a00: 63 6f 6d 70 61 74 69 62 6c 65 5d 20 76 65 72 73  compatible] vers
0a10: 69 6f 6e 20 6f 66 0d 0a 20 20 20 20 20 20 20 20  ion of..        
0a20: 23 20 20 20 20 20 20 20 74 68 65 20 43 4c 52 20  #       the CLR 
0a30: 69 73 20 72 65 6c 65 61 73 65 64 2c 20 74 68 69  is released, thi
0a40: 73 20 63 68 65 63 6b 20 77 69 6c 6c 20 68 61 76  s check will hav
0a50: 65 20 74 6f 20 62 65 20 63 68 61 6e 67 65 64 2e  e to be changed.
0a60: 20 20 54 68 65 0d 0a 20 20 20 20 20 20 20 20 23    The..        #
0a70: 20 20 20 20 20 20 20 64 65 66 61 75 6c 74 20 74         default t
0a80: 65 73 74 20 79 65 61 72 20 74 6f 20 75 73 65 20  est year to use 
0a90: 66 6f 72 20 61 20 70 61 72 74 69 63 75 6c 61 72  for a particular
0aa0: 20 43 4c 52 20 76 65 72 73 69 6f 6e 20 6d 61 79   CLR version may
0ab0: 20 62 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20   be..        #  
0ac0: 20 20 20 20 20 6f 76 65 72 72 69 64 64 65 6e 20       overridden 
0ad0: 62 79 20 73 65 74 74 69 6e 67 20 74 68 65 20 67  by setting the g
0ae0: 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20 22  lobal variable "
0af0: 74 65 73 74 5f 79 65 61 72 5f 63 6c 72 5f 76 24  test_year_clr_v$
0b00: 58 22 2c 0d 0a 20 20 20 20 20 20 20 20 23 20 20  X",..        #  
0b10: 20 20 20 20 20 77 68 65 72 65 20 22 24 58 22 20       where "$X" 
0b20: 6d 61 79 20 5b 63 75 72 72 65 6e 74 6c 79 5d 20  may [currently] 
0b30: 62 65 20 65 69 74 68 65 72 20 22 32 22 20 6f 72  be either "2" or
0b40: 20 22 34 22 2e 0d 0a 20 20 20 20 20 20 20 20 23   "4"...        #
0b50: 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 68  ..        if {[h
0b60: 61 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 69 6d  aveConstraint im
0b70: 61 67 65 52 75 6e 74 69 6d 65 34 30 5d 7d 20 74  ageRuntime40]} t
0b80: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
0b90: 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74   if {[info exist
0ba0: 73 20 3a 3a 74 65 73 74 5f 79 65 61 72 5f 63 6c  s ::test_year_cl
0bb0: 72 5f 76 34 5d 20 26 26 20 5c 0d 0a 20 20 20 20  r_v4] && \..    
0bc0: 20 20 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e            [strin
0bd0: 67 20 6c 65 6e 67 74 68 20 24 3a 3a 74 65 73 74  g length $::test
0be0: 5f 79 65 61 72 5f 63 6c 72 5f 76 34 5d 20 3e 20  _year_clr_v4] > 
0bf0: 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
0c00: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
0c10: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 55 73        # NOTE: Us
0c20: 65 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  e the specified 
0c30: 74 65 73 74 20 79 65 61 72 20 66 6f 72 20 74 68  test year for th
0c40: 65 20 43 4c 52 20 76 34 2e 30 2e 0d 0a 20 20 20  e CLR v4.0...   
0c50: 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
0c60: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 24          return $
0c70: 3a 3a 74 65 73 74 5f 79 65 61 72 5f 63 6c 72 5f  ::test_year_clr_
0c80: 76 34 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 20  v4..          } 
0c90: 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
0ca0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
0cb0: 20 20 20 23 20 4e 4f 54 45 3a 20 55 73 65 20 74     # NOTE: Use t
0cc0: 68 65 20 64 65 66 61 75 6c 74 20 74 65 73 74 20  he default test 
0cd0: 79 65 61 72 20 66 6f 72 20 74 68 65 20 43 4c 52  year for the CLR
0ce0: 20 76 34 2e 30 2e 0d 0a 20 20 20 20 20 20 20 20   v4.0...        
0cf0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
0d00: 20 20 20 72 65 74 75 72 6e 20 32 30 31 30 3b 20     return 2010; 
0d10: 23 20 54 4f 44 4f 3a 20 47 6f 6f 64 20 22 66 61  # TODO: Good "fa
0d20: 6c 6c 62 61 63 6b 22 20 64 65 66 61 75 6c 74 3f  llback" default?
0d30: 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20  ..          }.. 
0d40: 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d         } else {.
0d50: 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b  .          if {[
0d60: 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 74 65  info exists ::te
0d70: 73 74 5f 79 65 61 72 5f 63 6c 72 5f 76 32 5d 20  st_year_clr_v2] 
0d80: 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  && \..          
0d90: 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67      [string leng
0da0: 74 68 20 24 3a 3a 74 65 73 74 5f 79 65 61 72 5f  th $::test_year_
0db0: 63 6c 72 5f 76 32 5d 20 3e 20 30 7d 20 74 68 65  clr_v2] > 0} the
0dc0: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
0dd0: 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   #..            
0de0: 23 20 4e 4f 54 45 3a 20 55 73 65 20 74 68 65 20  # NOTE: Use the 
0df0: 73 70 65 63 69 66 69 65 64 20 74 65 73 74 20 79  specified test y
0e00: 65 61 72 20 66 6f 72 20 74 68 65 20 43 4c 52 20  ear for the CLR 
0e10: 76 32 2e 30 2e 0d 0a 20 20 20 20 20 20 20 20 20  v2.0...         
0e20: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
0e30: 20 20 72 65 74 75 72 6e 20 24 3a 3a 74 65 73 74    return $::test
0e40: 5f 79 65 61 72 5f 63 6c 72 5f 76 32 0d 0a 20 20  _year_clr_v2..  
0e50: 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b          } else {
0e60: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 0d  ..            #.
0e70: 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4e  .            # N
0e80: 4f 54 45 3a 20 55 73 65 20 74 68 65 20 64 65 66  OTE: Use the def
0e90: 61 75 6c 74 20 74 65 73 74 20 79 65 61 72 20 66  ault test year f
0ea0: 6f 72 20 74 68 65 20 43 4c 52 20 76 32 2e 30 2e  or the CLR v2.0.
0eb0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 0d  ..            #.
0ec0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74  .            ret
0ed0: 75 72 6e 20 32 30 30 38 3b 20 23 20 54 4f 44 4f  urn 2008; # TODO
0ee0: 3a 20 47 6f 6f 64 20 22 66 61 6c 6c 62 61 63 6b  : Good "fallback
0ef0: 22 20 64 65 66 61 75 6c 74 3f 0d 0a 20 20 20 20  " default?..    
0f00: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
0f10: 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20   }..      }..   
0f20: 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
0f30: 67 65 74 42 75 69 6c 64 59 65 61 72 73 20 7b 7d  getBuildYears {}
0f40: 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20   {..      #..   
0f50: 20 20 20 23 20 4e 4f 54 45 3a 20 53 65 65 20 69     # NOTE: See i
0f60: 66 20 74 68 65 20 6c 69 73 74 20 6f 66 20 74 65  f the list of te
0f70: 73 74 20 79 65 61 72 73 20 68 61 73 20 62 65 65  st years has bee
0f80: 6e 20 6f 76 65 72 72 69 64 64 65 6e 20 62 79 20  n overridden by 
0f90: 74 68 65 20 75 73 65 72 0d 0a 20 20 20 20 20 20  the user..      
0fa0: 23 20 20 20 20 20 20 20 28 65 2e 67 2e 20 6f 6e  #       (e.g. on
0fb0: 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e   the command lin
0fc0: 65 29 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  e)...      #..  
0fd0: 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78      if {[info ex
0fe0: 69 73 74 73 20 3a 3a 74 65 73 74 5f 79 65 61 72  ists ::test_year
0ff0: 73 5d 20 26 26 20 5b 6c 6c 65 6e 67 74 68 20 24  s] && [llength $
1000: 3a 3a 74 65 73 74 5f 79 65 61 72 73 5d 20 3e 20  ::test_years] > 
1010: 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
1020: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
1030: 4e 4f 54 45 3a 20 55 73 65 20 74 68 65 20 73 70  NOTE: Use the sp
1040: 65 63 69 66 69 65 64 20 6c 69 73 74 20 6f 66 20  ecified list of 
1050: 74 65 73 74 20 79 65 61 72 73 2e 0d 0a 20 20 20  test years...   
1060: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
1070: 72 65 74 75 72 6e 20 24 3a 3a 74 65 73 74 5f 79  return $::test_y
1080: 65 61 72 73 0d 0a 20 20 20 20 20 20 7d 20 65 6c  ears..      } el
1090: 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d  se {..        #.
10a0: 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
10b0: 20 55 73 65 20 74 68 65 20 64 65 66 61 75 6c 74   Use the default
10c0: 20 6c 69 73 74 20 6f 66 20 74 65 73 74 20 79 65   list of test ye
10d0: 61 72 73 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  ars...        #.
10e0: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
10f0: 5b 6c 69 73 74 20 32 30 30 35 20 32 30 30 38 20  [list 2005 2008 
1100: 32 30 31 30 20 32 30 31 32 5d 0d 0a 20 20 20 20  2010 2012]..    
1110: 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20    }..    }..... 
1120: 20 20 20 70 72 6f 63 20 67 65 74 42 75 69 6c 64     proc getBuild
1130: 50 6c 61 74 66 6f 72 6d 20 7b 20 6e 61 74 69 76  Platform { nativ
1140: 65 20 7d 20 7b 0d 0a 20 20 20 20 20 20 69 66 20  e } {..      if 
1150: 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  {[info exists ::
1160: 74 65 73 74 5f 70 6c 61 74 66 6f 72 6d 5d 20 26  test_platform] &
1170: 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b  & \..          [
1180: 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a  string length $:
1190: 3a 74 65 73 74 5f 70 6c 61 74 66 6f 72 6d 5d 20  :test_platform] 
11a0: 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  > 0} then {..   
11b0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
11c0: 23 20 4e 4f 54 45 3a 20 55 73 65 20 74 68 65 20  # NOTE: Use the 
11d0: 73 70 65 63 69 66 69 65 64 20 74 65 73 74 20 70  specified test p
11e0: 6c 61 74 66 6f 72 6d 2e 20 20 49 66 20 74 68 69  latform.  If thi
11f0: 73 20 76 61 72 69 61 62 6c 65 20 69 73 20 6e 6f  s variable is no
1200: 74 20 73 65 74 2c 0d 0a 20 20 20 20 20 20 20 20  t set,..        
1210: 23 20 20 20 20 20 20 20 74 68 65 20 64 65 66 61  #       the defa
1220: 75 6c 74 20 76 61 6c 75 65 20 77 69 6c 6c 20 62  ult value will b
1230: 65 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 6d  e based on the m
1240: 61 63 68 69 6e 65 20 61 72 63 68 69 74 65 63 74  achine architect
1250: 75 72 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  ure...        #.
1260: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
1270: 5b 65 78 70 72 20 7b 24 6e 61 74 69 76 65 20 3f  [expr {$native ?
1280: 20 24 3a 3a 74 65 73 74 5f 70 6c 61 74 66 6f 72   $::test_platfor
1290: 6d 20 3a 20 22 22 7d 5d 0d 0a 20 20 20 20 20 20  m : ""}]..      
12a0: 7d 20 65 6c 73 65 69 66 20 7b 5b 69 6e 66 6f 20  } elseif {[info 
12b0: 65 78 69 73 74 73 20 3a 3a 74 65 73 74 5f 6d 61  exists ::test_ma
12c0: 63 68 69 6e 65 5d 20 26 26 20 5c 0d 0a 20 20 20  chine] && \..   
12d0: 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c         [string l
12e0: 65 6e 67 74 68 20 24 3a 3a 74 65 73 74 5f 6d 61  ength $::test_ma
12f0: 63 68 69 6e 65 5d 20 3e 20 30 7d 20 74 68 65 6e  chine] > 0} then
1300: 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20   {..        #.. 
1310: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 46         # NOTE: F
1320: 6f 72 20 6e 61 74 69 76 65 20 62 75 69 6c 64 73  or native builds
1330: 2c 20 72 65 74 75 72 6e 20 74 68 65 20 70 6c 61  , return the pla
1340: 74 66 6f 72 6d 20 6e 61 6d 65 20 63 6f 72 72 65  tform name corre
1350: 73 70 6f 6e 64 69 6e 67 20 74 6f 0d 0a 20 20 20  sponding to..   
1360: 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68 65       #       the
1370: 20 74 65 73 74 20 6d 61 63 68 69 6e 65 20 61 72   test machine ar
1380: 63 68 69 74 65 63 74 75 72 65 3b 20 6f 74 68 65  chitecture; othe
1390: 72 77 69 73 65 2c 20 72 65 74 75 72 6e 20 61 6e  rwise, return an
13a0: 20 65 6d 70 74 79 0d 0a 20 20 20 20 20 20 20 20   empty..        
13b0: 23 20 20 20 20 20 20 20 73 74 72 69 6e 67 2e 0d  #       string..
13c0: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
13d0: 20 20 20 20 72 65 74 75 72 6e 20 5b 65 78 70 72      return [expr
13e0: 20 7b 24 6e 61 74 69 76 65 20 3f 20 5b 6d 61 63   {$native ? [mac
13f0: 68 69 6e 65 54 6f 50 6c 61 74 66 6f 72 6d 20 24  hineToPlatform $
1400: 3a 3a 74 65 73 74 5f 6d 61 63 68 69 6e 65 5d 20  ::test_machine] 
1410: 3a 20 22 22 7d 5d 0d 0a 20 20 20 20 20 20 7d 20  : ""}]..      } 
1420: 65 6c 73 65 69 66 20 7b 5b 69 6e 66 6f 20 65 78  elseif {[info ex
1430: 69 73 74 73 20 3a 3a 74 63 6c 5f 70 6c 61 74 66  ists ::tcl_platf
1440: 6f 72 6d 28 6d 61 63 68 69 6e 65 29 5d 7d 20 74  orm(machine)]} t
1450: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  hen {..        #
1460: 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
1470: 3a 20 46 6f 72 20 6e 61 74 69 76 65 20 62 75 69  : For native bui
1480: 6c 64 73 2c 20 72 65 74 75 72 6e 20 74 68 65 20  lds, return the 
1490: 70 6c 61 74 66 6f 72 6d 20 6e 61 6d 65 20 63 6f  platform name co
14a0: 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 0d 0a  rresponding to..
14b0: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
14c0: 74 68 65 20 6d 61 63 68 69 6e 65 20 61 72 63 68  the machine arch
14d0: 69 74 65 63 74 75 72 65 3b 20 6f 74 68 65 72 77  itecture; otherw
14e0: 69 73 65 2c 20 72 65 74 75 72 6e 20 61 6e 20 65  ise, return an e
14f0: 6d 70 74 79 20 73 74 72 69 6e 67 2e 0d 0a 20 20  mpty string...  
1500: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
1510: 20 72 65 74 75 72 6e 20 5b 65 78 70 72 20 7b 24   return [expr {$
1520: 6e 61 74 69 76 65 20 3f 20 5c 0d 0a 20 20 20 20  native ? \..    
1530: 20 20 20 20 20 20 20 20 5b 6d 61 63 68 69 6e 65          [machine
1540: 54 6f 50 6c 61 74 66 6f 72 6d 20 24 3a 3a 74 63  ToPlatform $::tc
1550: 6c 5f 70 6c 61 74 66 6f 72 6d 28 6d 61 63 68 69  l_platform(machi
1560: 6e 65 29 5d 20 3a 20 22 22 7d 5d 0d 0a 20 20 20  ne)] : ""}]..   
1570: 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
1580: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
1590: 23 20 4e 4f 54 45 3a 20 4e 6f 20 6d 61 63 68 69  # NOTE: No machi
15a0: 6e 65 20 61 72 63 68 69 74 65 63 74 75 72 65 20  ne architecture 
15b0: 69 73 20 61 76 61 69 6c 61 62 6c 65 2c 20 72 65  is available, re
15c0: 74 75 72 6e 20 61 6e 20 65 6d 70 74 79 20 73 74  turn an empty st
15d0: 72 69 6e 67 2e 0d 0a 20 20 20 20 20 20 20 20 23  ring...        #
15e0: 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ..        return
15f0: 20 22 22 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20   ""..      }..  
1600: 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
1610: 20 67 65 74 42 75 69 6c 64 43 6f 6e 66 69 67 75   getBuildConfigu
1620: 72 61 74 69 6f 6e 20 7b 7d 20 7b 0d 0a 20 20 20  ration {} {..   
1630: 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
1640: 54 45 3a 20 53 65 65 20 69 66 20 74 68 65 20 22  TE: See if the "
1650: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 22 20 73  configuration" s
1660: 65 74 74 69 6e 67 20 68 61 73 20 62 65 65 6e 20  etting has been 
1670: 6f 76 65 72 72 69 64 64 65 6e 20 62 79 20 74 68  overridden by th
1680: 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  e..      #      
1690: 20 75 73 65 72 20 28 65 2e 67 2e 20 6f 6e 20 74   user (e.g. on t
16a0: 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 29  he command line)
16b0: 2e 20 20 54 68 69 73 20 68 65 6c 70 73 20 63 6f  .  This helps co
16c0: 6e 74 72 6f 6c 20 65 78 61 63 74 6c 79 0d 0a 20  ntrol exactly.. 
16d0: 20 20 20 20 20 23 20 20 20 20 20 20 20 77 68 69       #       whi
16e0: 63 68 20 73 65 74 20 6f 66 20 62 69 6e 61 72 69  ch set of binari
16f0: 65 73 20 77 65 20 61 72 65 20 74 65 73 74 69 6e  es we are testin
1700: 67 20 28 69 2e 65 2e 20 74 68 6f 73 65 20 62 75  g (i.e. those bu
1710: 69 6c 74 20 69 6e 20 74 68 65 0d 0a 20 20 20 20  ilt in the..    
1720: 20 20 23 20 20 20 20 20 20 20 22 44 65 62 75 67    #       "Debug
1730: 22 20 6f 72 20 22 52 65 6c 65 61 73 65 22 20 62  " or "Release" b
1740: 75 69 6c 64 20 63 6f 6e 66 69 67 75 72 61 74 69  uild configurati
1750: 6f 6e 73 29 2e 20 20 54 6f 20 6f 76 65 72 72 69  ons).  To overri
1760: 64 65 20 74 68 69 73 0d 0a 20 20 20 20 20 20 23  de this..      #
1770: 20 20 20 20 20 20 20 76 61 6c 75 65 20 76 69 61         value via
1780: 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e   the command lin
1790: 65 2c 20 65 6e 74 65 72 20 61 20 63 6f 6d 6d 61  e, enter a comma
17a0: 6e 64 20 73 69 6d 69 6c 61 72 20 74 6f 20 6f 6e  nd similar to on
17b0: 65 20 6f 66 0d 0a 20 20 20 20 20 20 23 20 20 20  e of..      #   
17c0: 20 20 20 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e      the followin
17d0: 67 20 28 61 6c 6c 20 6f 6e 20 6f 6e 65 20 6c 69  g (all on one li
17e0: 6e 65 29 3a 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ne):..      #.. 
17f0: 20 20 20 20 20 23 20 20 20 20 20 20 20 45 61 67       #       Eag
1800: 6c 65 53 68 65 6c 6c 2e 65 78 65 20 2d 70 72 65  leShell.exe -pre
1810: 49 6e 69 74 69 61 6c 69 7a 65 20 22 73 65 74 20  Initialize "set 
1820: 74 65 73 74 5f 63 6f 6e 66 69 67 75 72 61 74 69  test_configurati
1830: 6f 6e 20 44 65 62 75 67 22 0d 0a 20 20 20 20 20  on Debug"..     
1840: 20 23 20 20 20 20 20 20 20 20 20 2d 66 69 6c 65   #         -file
1850: 20 2e 5c 70 61 74 68 5c 74 6f 5c 61 6c 6c 2e 65   .\path\to\all.e
1860: 61 67 6c 65 0d 0a 20 20 20 20 20 20 23 0d 0a 20  agle..      #.. 
1870: 20 20 20 20 20 23 20 20 20 20 20 20 20 45 61 67       #       Eag
1880: 6c 65 53 68 65 6c 6c 2e 65 78 65 20 2d 70 72 65  leShell.exe -pre
1890: 49 6e 69 74 69 61 6c 69 7a 65 20 22 73 65 74 20  Initialize "set 
18a0: 74 65 73 74 5f 63 6f 6e 66 69 67 75 72 61 74 69  test_configurati
18b0: 6f 6e 20 52 65 6c 65 61 73 65 22 0d 0a 20 20 20  on Release"..   
18c0: 20 20 20 23 20 20 20 20 20 20 20 20 20 2d 66 69     #         -fi
18d0: 6c 65 20 2e 5c 70 61 74 68 5c 74 6f 5c 61 6c 6c  le .\path\to\all
18e0: 2e 65 61 67 6c 65 0d 0a 20 20 20 20 20 20 23 0d  .eagle..      #.
18f0: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 45  .      #       E
1900: 61 67 6c 65 53 68 65 6c 6c 2e 65 78 65 20 2d 66  agleShell.exe -f
1910: 69 6c 65 20 2e 5c 70 61 74 68 5c 74 6f 5c 61 6c  ile .\path\to\al
1920: 6c 2e 65 61 67 6c 65 20 2d 70 72 65 54 65 73 74  l.eagle -preTest
1930: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
1940: 20 20 22 75 6e 73 65 74 20 2d 6e 6f 63 6f 6d 70    "unset -nocomp
1950: 6c 61 69 6e 20 74 65 73 74 5f 63 6f 6e 66 69 67  lain test_config
1960: 75 72 61 74 69 6f 6e 22 0d 0a 20 20 20 20 20 20  uration"..      
1970: 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 6e  #..      if {[in
1980: 66 6f 20 65 78 69 73 74 73 20 3a 3a 74 65 73 74  fo exists ::test
1990: 5f 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 5d 20  _configuration] 
19a0: 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  && \..          
19b0: 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
19c0: 3a 3a 74 65 73 74 5f 63 6f 6e 66 69 67 75 72 61  ::test_configura
19d0: 74 69 6f 6e 5d 20 3e 20 30 7d 20 74 68 65 6e 20  tion] > 0} then 
19e0: 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
19f0: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 55 73        # NOTE: Us
1a00: 65 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  e the specified 
1a10: 74 65 73 74 20 63 6f 6e 66 69 67 75 72 61 74 69  test configurati
1a20: 6f 6e 2e 20 20 54 68 65 20 64 65 66 61 75 6c 74  on.  The default
1a30: 20 76 61 6c 75 65 20 75 73 65 64 0d 0a 20 20 20   value used..   
1a40: 20 20 20 20 20 23 20 20 20 20 20 20 20 66 6f 72       #       for
1a50: 20 74 68 69 73 20 76 61 72 69 61 62 6c 65 20 69   this variable i
1a60: 73 20 74 79 70 69 63 61 6c 6c 79 20 22 52 65 6c  s typically "Rel
1a70: 65 61 73 65 22 2c 20 61 73 20 73 65 74 20 62 79  ease", as set by
1a80: 20 74 68 65 20 74 65 73 74 0d 0a 20 20 20 20 20   the test..     
1a90: 20 20 20 23 20 20 20 20 20 20 20 73 75 69 74 65     #       suite
1aa0: 20 69 74 73 65 6c 66 2e 0d 0a 20 20 20 20 20 20   itself...      
1ab0: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74    #..        ret
1ac0: 75 72 6e 20 24 3a 3a 74 65 73 74 5f 63 6f 6e 66  urn $::test_conf
1ad0: 69 67 75 72 61 74 69 6f 6e 0d 0a 20 20 20 20 20  iguration..     
1ae0: 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
1af0: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
1b00: 4e 4f 54 45 3a 20 4e 6f 72 6d 61 6c 6c 79 2c 20  NOTE: Normally, 
1b10: 77 65 20 77 69 6c 6c 20 6e 65 76 65 72 20 68 69  we will never hi
1b20: 74 20 74 68 69 73 20 63 61 73 65 20 62 65 63 61  t this case beca
1b30: 75 73 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66  use the value of
1b40: 20 74 68 65 0d 0a 20 20 20 20 20 20 20 20 23 20   the..        # 
1b50: 20 20 20 20 20 20 74 65 73 74 20 63 6f 6e 66 69        test confi
1b60: 67 75 72 61 74 69 6f 6e 20 76 61 72 69 61 62 6c  guration variabl
1b70: 65 20 69 73 20 61 6c 77 61 79 73 20 73 65 74 20  e is always set 
1b80: 62 79 20 74 68 65 20 74 65 73 74 20 73 75 69 74  by the test suit
1b90: 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  e..        #    
1ba0: 20 20 20 69 74 73 65 6c 66 3b 20 68 6f 77 65 76     itself; howev
1bb0: 65 72 2c 20 69 74 20 63 61 6e 20 62 65 20 6f 76  er, it can be ov
1bc0: 65 72 72 69 64 64 65 6e 20 75 73 69 6e 67 20 74  erridden using t
1bd0: 68 65 20 75 6e 73 65 74 20 63 6f 6d 6d 61 6e 64  he unset command
1be0: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
1bf0: 20 20 66 72 6f 6d 20 74 68 65 20 2d 70 72 65 54    from the -preT
1c00: 65 73 74 20 6f 70 74 69 6f 6e 20 74 6f 20 74 68  est option to th
1c10: 65 20 74 65 73 74 20 73 75 69 74 65 2e 0d 0a 20  e test suite... 
1c20: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
1c30: 20 20 72 65 74 75 72 6e 20 24 3a 3a 65 61 67 6c    return $::eagl
1c40: 65 5f 70 6c 61 74 66 6f 72 6d 28 63 6f 6e 66 69  e_platform(confi
1c50: 67 75 72 61 74 69 6f 6e 29 0d 0a 20 20 20 20 20  guration)..     
1c60: 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20   }..    }.....  
1c70: 20 20 70 72 6f 63 20 67 65 74 42 75 69 6c 64 43    proc getBuildC
1c80: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 73 20 7b 7d  onfigurations {}
1c90: 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20   {..      #..   
1ca0: 20 20 20 23 20 4e 4f 54 45 3a 20 53 65 65 20 69     # NOTE: See i
1cb0: 66 20 74 68 65 20 6c 69 73 74 20 6f 66 20 74 65  f the list of te
1cc0: 73 74 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  st configuration
1cd0: 73 20 68 61 73 20 62 65 65 6e 20 6f 76 65 72 72  s has been overr
1ce0: 69 64 64 65 6e 20 62 79 0d 0a 20 20 20 20 20 20  idden by..      
1cf0: 23 20 20 20 20 20 20 20 74 68 65 20 75 73 65 72  #       the user
1d00: 20 28 65 2e 67 2e 20 6f 6e 20 74 68 65 20 63 6f   (e.g. on the co
1d10: 6d 6d 61 6e 64 20 6c 69 6e 65 29 2e 0d 0a 20 20  mmand line)...  
1d20: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20      #..      if 
1d30: 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  {[info exists ::
1d40: 74 65 73 74 5f 63 6f 6e 66 69 67 75 72 61 74 69  test_configurati
1d50: 6f 6e 73 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20  ons] && \..     
1d60: 20 20 20 20 20 5b 6c 6c 65 6e 67 74 68 20 24 3a       [llength $:
1d70: 3a 74 65 73 74 5f 63 6f 6e 66 69 67 75 72 61 74  :test_configurat
1d80: 69 6f 6e 73 5d 20 3e 20 30 7d 20 74 68 65 6e 20  ions] > 0} then 
1d90: 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
1da0: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 55 73        # NOTE: Us
1db0: 65 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  e the specified 
1dc0: 6c 69 73 74 20 6f 66 20 74 65 73 74 20 63 6f 6e  list of test con
1dd0: 66 69 67 75 72 61 74 69 6f 6e 73 2e 0d 0a 20 20  figurations...  
1de0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
1df0: 20 72 65 74 75 72 6e 20 24 3a 3a 74 65 73 74 5f   return $::test_
1e00: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 73 0d 0a  configurations..
1e10: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
1e20: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
1e30: 20 20 20 23 20 4e 4f 54 45 3a 20 55 73 65 20 74     # NOTE: Use t
1e40: 68 65 20 64 65 66 61 75 6c 74 20 6c 69 73 74 20  he default list 
1e50: 6f 66 20 74 65 73 74 20 63 6f 6e 66 69 67 75 72  of test configur
1e60: 61 74 69 6f 6e 73 2e 0d 0a 20 20 20 20 20 20 20  ations...       
1e70: 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75   #..        retu
1e80: 72 6e 20 5b 6c 69 73 74 20 44 65 62 75 67 20 52  rn [list Debug R
1e90: 65 6c 65 61 73 65 5d 0d 0a 20 20 20 20 20 20 7d  elease]..      }
1ea0: 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
1eb0: 70 72 6f 63 20 67 65 74 42 75 69 6c 64 42 61 73  proc getBuildBas
1ec0: 65 44 69 72 65 63 74 6f 72 79 20 7b 7d 20 7b 0d  eDirectory {} {.
1ed0: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
1ee0: 23 20 4e 4f 54 45 3a 20 46 69 67 75 72 65 20 6f  # NOTE: Figure o
1ef0: 75 74 20 74 68 65 20 62 61 73 65 20 64 69 72 65  ut the base dire
1f00: 63 74 6f 72 79 20 77 68 65 72 65 20 61 6c 6c 20  ctory where all 
1f10: 74 68 65 20 62 75 69 6c 64 73 20 73 68 6f 75 6c  the builds shoul
1f20: 64 20 62 65 0d 0a 20 20 20 20 20 20 23 20 20 20  d be..      #   
1f30: 20 20 20 20 6c 6f 63 61 74 65 64 2e 20 20 54 68      located.  Th
1f40: 69 73 20 77 69 6c 6c 20 62 65 20 74 68 65 20 64  is will be the d
1f50: 69 72 65 63 74 6f 72 79 20 74 68 61 74 20 63 6f  irectory that co
1f60: 6e 74 61 69 6e 73 20 74 68 65 20 61 63 74 75 61  ntains the actua
1f70: 6c 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  l..      #      
1f80: 20 62 75 69 6c 64 20 6f 75 74 70 75 74 20 64 69   build output di
1f90: 72 65 63 74 6f 72 79 20 28 65 2e 67 2e 20 70 61  rectory (e.g. pa
1fa0: 72 65 6e 74 20 6f 66 20 22 62 69 6e 22 29 2e 0d  rent of "bin")..
1fb0: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
1fc0: 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73  if {[info exists
1fd0: 20 3a 3a 62 75 69 6c 64 5f 62 61 73 65 5f 64 69   ::build_base_di
1fe0: 72 65 63 74 6f 72 79 5d 20 26 26 20 5c 0d 0a 20  rectory] && \.. 
1ff0: 20 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67           [string
2000: 20 6c 65 6e 67 74 68 20 24 3a 3a 62 75 69 6c 64   length $::build
2010: 5f 62 61 73 65 5f 64 69 72 65 63 74 6f 72 79 5d  _base_directory]
2020: 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20   > 0} then {..  
2030: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
2040: 20 23 20 4e 4f 54 45 3a 20 54 68 65 20 6c 6f 63   # NOTE: The loc
2050: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 62 75 69  ation of the bui
2060: 6c 64 20 62 61 73 65 20 64 69 72 65 63 74 6f 72  ld base director
2070: 79 20 68 61 73 20 62 65 65 6e 20 6f 76 65 72 72  y has been overr
2080: 69 64 64 65 6e 3b 0d 0a 20 20 20 20 20 20 20 20  idden;..        
2090: 23 20 20 20 20 20 20 20 74 68 65 72 65 66 6f 72  #       therefor
20a0: 65 2c 20 75 73 65 20 69 74 20 76 65 72 62 61 74  e, use it verbat
20b0: 69 6d 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  im...        #..
20c0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 24          return $
20d0: 3a 3a 62 75 69 6c 64 5f 62 61 73 65 5f 64 69 72  ::build_base_dir
20e0: 65 63 74 6f 72 79 0d 0a 20 20 20 20 20 20 7d 20  ectory..      } 
20f0: 65 6c 73 65 69 66 20 7b 5b 69 6e 66 6f 20 65 78  elseif {[info ex
2100: 69 73 74 73 20 3a 3a 63 6f 6d 6d 6f 6e 5f 64 69  ists ::common_di
2110: 72 65 63 74 6f 72 79 5d 20 26 26 20 5c 0d 0a 20  rectory] && \.. 
2120: 20 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67           [string
2130: 20 6c 65 6e 67 74 68 20 24 3a 3a 63 6f 6d 6d 6f   length $::commo
2140: 6e 5f 64 69 72 65 63 74 6f 72 79 5d 20 3e 20 30  n_directory] > 0
2150: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
2160: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
2170: 4f 54 45 3a 20 4e 65 78 74 2c 20 66 61 6c 6c 62  OTE: Next, fallb
2180: 61 63 6b 20 74 6f 20 74 68 65 20 70 61 72 65 6e  ack to the paren
2190: 74 20 64 69 72 65 63 74 6f 72 79 20 6f 66 20 74  t directory of t
21a0: 68 65 20 6f 6e 65 20 63 6f 6e 74 61 69 6e 69 6e  he one containin
21b0: 67 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  g..        #    
21c0: 20 20 20 74 68 69 73 20 66 69 6c 65 20 28 69 2e     this file (i.
21d0: 65 2e 20 22 63 6f 6d 6d 6f 6e 2e 65 61 67 6c 65  e. "common.eagle
21e0: 22 29 2c 20 69 66 20 61 76 61 69 6c 61 62 6c 65  "), if available
21f0: 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
2200: 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b 66 69        return [fi
2210: 6c 65 20 64 69 72 6e 61 6d 65 20 24 3a 3a 63 6f  le dirname $::co
2220: 6d 6d 6f 6e 5f 64 69 72 65 63 74 6f 72 79 5d 0d  mmon_directory].
2230: 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 69 66 20  .      } elseif 
2240: 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  {[info exists ::
2250: 70 61 74 68 5d 20 26 26 20 5c 0d 0a 20 20 20 20  path] && \..    
2260: 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65        [string le
2270: 6e 67 74 68 20 24 3a 3a 70 61 74 68 5d 20 3e 20  ngth $::path] > 
2280: 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
2290: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
22a0: 4e 4f 54 45 3a 20 46 69 6e 61 6c 6c 79 2c 20 66  NOTE: Finally, f
22b0: 61 6c 6c 62 61 63 6b 20 74 6f 20 74 68 65 20 70  allback to the p
22c0: 61 72 65 6e 74 20 64 69 72 65 63 74 6f 72 79 20  arent directory 
22d0: 6f 66 20 74 68 65 20 45 61 67 6c 65 54 65 73 74  of the EagleTest
22e0: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
22f0: 20 20 70 61 74 68 2e 20 20 54 68 65 20 45 61 67    path.  The Eag
2300: 6c 65 54 65 73 74 20 70 61 63 6b 61 67 65 20 67  leTest package g
2310: 75 61 72 61 6e 74 65 65 73 20 74 68 61 74 20 74  uarantees that t
2320: 68 69 73 20 76 61 72 69 61 62 6c 65 0d 0a 20 20  his variable..  
2330: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 77 69        #       wi
2340: 6c 6c 20 62 65 20 73 65 74 20 74 6f 20 74 68 65  ll be set to the
2350: 20 64 69 72 65 63 74 6f 72 79 20 63 6f 6e 74 61   directory conta
2360: 69 6e 69 6e 67 20 74 68 65 20 66 69 72 73 74 20  ining the first 
2370: 66 69 6c 65 20 74 6f 0d 0a 20 20 20 20 20 20 20  file to..       
2380: 20 23 20 20 20 20 20 20 20 65 78 65 63 75 74 65   #       execute
2390: 20 74 68 65 20 5b 72 75 6e 54 65 73 74 50 72 6f   the [runTestPro
23a0: 6c 6f 67 75 65 5d 20 73 63 72 69 70 74 20 6c 69  logue] script li
23b0: 62 72 61 72 79 20 70 72 6f 63 65 64 75 72 65 2e  brary procedure.
23c0: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
23d0: 20 20 20 20 20 72 65 74 75 72 6e 20 5b 66 69 6c       return [fil
23e0: 65 20 64 69 72 6e 61 6d 65 20 24 3a 3a 70 61 74  e dirname $::pat
23f0: 68 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65  h]..      } else
2400: 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20   {..        #.. 
2410: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4e         # NOTE: N
2420: 6f 20 70 61 74 68 20 69 73 20 61 76 61 69 6c 61  o path is availa
2430: 62 6c 65 2c 20 72 65 74 75 72 6e 20 61 6e 20 65  ble, return an e
2440: 6d 70 74 79 20 73 74 72 69 6e 67 2e 20 20 54 68  mpty string.  Th
2450: 69 73 20 70 6f 69 6e 74 0d 0a 20 20 20 20 20 20  is point..      
2460: 20 20 23 20 20 20 20 20 20 20 73 68 6f 75 6c 64    #       should
2470: 20 6e 6f 74 20 62 65 20 72 65 61 63 68 65 64 2e   not be reached.
2480: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
2490: 20 20 20 20 20 72 65 74 75 72 6e 20 22 22 0d 0a       return ""..
24a0: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a        }..    }..
24b0: 0c 0d 0a 20 20 20 20 70 72 6f 63 20 6a 6f 69 6e  ...    proc join
24c0: 42 75 69 6c 64 44 69 72 65 63 74 6f 72 79 20 7b  BuildDirectory {
24d0: 20 6e 61 74 69 76 65 20 70 61 74 68 20 79 65 61   native path yea
24e0: 72 20 70 6c 61 74 66 6f 72 6d 20 63 6f 6e 66 69  r platform confi
24f0: 67 75 72 61 74 69 6f 6e 20 7d 20 7b 0d 0a 20 20  guration } {..  
2500: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
2510: 4f 54 45 3a 20 46 69 67 75 72 65 20 6f 75 74 20  OTE: Figure out 
2520: 61 6e 64 20 74 68 65 6e 20 72 65 74 75 72 6e 20  and then return 
2530: 74 68 65 20 66 75 6c 6c 79 20 71 75 61 6c 69 66  the fully qualif
2540: 69 65 64 20 70 61 74 68 20 74 6f 20 74 68 65 20  ied path to the 
2550: 62 75 69 6c 64 0d 0a 20 20 20 20 20 20 23 20 20  build..      #  
2560: 20 20 20 20 20 64 69 72 65 63 74 6f 72 79 20 62       directory b
2570: 61 73 65 64 20 6f 6e 20 61 6c 6c 20 74 68 65 20  ased on all the 
2580: 61 72 67 75 6d 65 6e 74 73 20 70 72 6f 76 69 64  arguments provid
2590: 65 64 20 62 79 20 6f 75 72 20 63 61 6c 6c 65 72  ed by our caller
25a0: 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
25b0: 20 20 69 66 20 7b 24 6e 61 74 69 76 65 7d 20 74    if {$native} t
25c0: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 72  hen {..        r
25d0: 65 74 75 72 6e 20 5b 66 69 6c 65 20 6a 6f 69 6e  eturn [file join
25e0: 20 24 70 61 74 68 20 62 69 6e 20 24 79 65 61 72   $path bin $year
25f0: 20 24 70 6c 61 74 66 6f 72 6d 20 24 63 6f 6e 66   $platform $conf
2600: 69 67 75 72 61 74 69 6f 6e 5d 0d 0a 20 20 20 20  iguration]..    
2610: 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
2620: 20 20 20 20 72 65 74 75 72 6e 20 5b 66 69 6c 65      return [file
2630: 20 6a 6f 69 6e 20 24 70 61 74 68 20 62 69 6e 20   join $path bin 
2640: 24 79 65 61 72 20 24 63 6f 6e 66 69 67 75 72 61  $year $configura
2650: 74 69 6f 6e 20 62 69 6e 5d 0d 0a 20 20 20 20 20  tion bin]..     
2660: 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20   }..    }.....  
2670: 20 20 70 72 6f 63 20 67 65 74 42 75 69 6c 64 44    proc getBuildD
2680: 69 72 65 63 74 6f 72 79 20 7b 7d 20 7b 0d 0a 20  irectory {} {.. 
2690: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
26a0: 4e 4f 54 45 3a 20 53 65 65 20 69 66 20 74 68 65  NOTE: See if the
26b0: 20 22 6e 61 74 69 76 65 22 20 72 75 6e 74 69 6d   "native" runtim
26c0: 65 20 6f 70 74 69 6f 6e 20 68 61 73 20 62 65 65  e option has bee
26d0: 6e 20 73 65 74 2e 20 20 49 66 20 73 6f 2c 20 75  n set.  If so, u
26e0: 73 65 20 74 68 65 0d 0a 20 20 20 20 20 20 23 20  se the..      # 
26f0: 20 20 20 20 20 20 64 69 72 65 63 74 6f 72 79 20        directory 
2700: 66 6f 72 20 74 68 65 20 6d 69 78 65 64 2d 6d 6f  for the mixed-mo
2710: 64 65 20 61 73 73 65 6d 62 6c 79 20 28 61 2e 6b  de assembly (a.k
2720: 2e 61 2e 20 74 68 65 20 6e 61 74 69 76 65 20 69  .a. the native i
2730: 6e 74 65 72 6f 70 0d 0a 20 20 20 20 20 20 23 20  nterop..      # 
2740: 20 20 20 20 20 20 61 73 73 65 6d 62 6c 79 29 2e        assembly).
2750: 20 20 54 6f 20 65 6e 61 62 6c 65 20 74 68 69 73    To enable this
2760: 20 6f 70 74 69 6f 6e 20 76 69 61 20 74 68 65 20   option via the 
2770: 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 2c 20 65 6e  command line, en
2780: 74 65 72 20 61 0d 0a 20 20 20 20 20 20 23 20 20  ter a..      #  
2790: 20 20 20 20 20 63 6f 6d 6d 61 6e 64 20 73 69 6d       command sim
27a0: 69 6c 61 72 20 74 6f 20 6f 6e 65 20 6f 66 20 74  ilar to one of t
27b0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 28 61 6c  he following (al
27c0: 6c 20 6f 6e 20 6f 6e 65 20 6c 69 6e 65 29 3a 0d  l on one line):.
27d0: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
27e0: 23 20 20 20 20 20 20 20 45 61 67 6c 65 53 68 65  #       EagleShe
27f0: 6c 6c 2e 65 78 65 20 2d 69 6e 69 74 69 61 6c 69  ll.exe -initiali
2800: 7a 65 20 2d 72 75 6e 74 69 6d 65 4f 70 74 69 6f  ze -runtimeOptio
2810: 6e 20 6e 61 74 69 76 65 0d 0a 20 20 20 20 20 20  n native..      
2820: 23 20 20 20 20 20 20 20 20 20 2d 66 69 6c 65 20  #         -file 
2830: 2e 5c 70 61 74 68 5c 74 6f 5c 61 6c 6c 2e 65 61  .\path\to\all.ea
2840: 67 6c 65 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  gle..      #..  
2850: 20 20 20 20 23 20 20 20 20 20 20 20 54 6f 20 65      #       To e
2860: 6e 61 62 6c 65 20 74 68 69 73 20 6f 70 74 69 6f  nable this optio
2870: 6e 20 76 69 61 20 74 68 65 20 63 6f 6d 6d 61 6e  n via the comman
2880: 64 20 6c 69 6e 65 20 70 72 69 6f 72 20 74 6f 20  d line prior to 
2890: 74 68 65 20 22 62 65 74 61 20 31 36 22 0d 0a 20  the "beta 16".. 
28a0: 20 20 20 20 20 23 20 20 20 20 20 20 20 72 65 6c       #       rel
28b0: 65 61 73 65 20 6f 66 20 45 61 67 6c 65 2c 20 74  ease of Eagle, t
28c0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6d  he following com
28d0: 6d 61 6e 64 20 6d 75 73 74 20 62 65 20 75 73 65  mand must be use
28e0: 64 20 69 6e 73 74 65 61 64 0d 0a 20 20 20 20 20  d instead..     
28f0: 20 23 20 20 20 20 20 20 20 28 61 6c 73 6f 20 61   #       (also a
2900: 6c 6c 20 6f 6e 20 6f 6e 65 20 6c 69 6e 65 29 3a  ll on one line):
2910: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
2920: 20 23 20 20 20 20 20 20 20 45 61 67 6c 65 53 68   #       EagleSh
2930: 65 6c 6c 2e 65 78 65 20 2d 69 6e 69 74 69 61 6c  ell.exe -initial
2940: 69 7a 65 20 2d 70 6f 73 74 49 6e 69 74 69 61 6c  ize -postInitial
2950: 69 7a 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ize..      #    
2960: 20 20 20 20 20 22 6f 62 6a 65 63 74 20 69 6e 76       "object inv
2970: 6f 6b 65 20 49 6e 74 65 72 70 72 65 74 65 72 2e  oke Interpreter.
2980: 47 65 74 41 63 74 69 76 65 20 41 64 64 52 75 6e  GetActive AddRun
2990: 74 69 6d 65 4f 70 74 69 6f 6e 20 6e 61 74 69 76  timeOption nativ
29a0: 65 22 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  e"..      #     
29b0: 20 20 20 20 2d 66 69 6c 65 20 2e 5c 70 61 74 68      -file .\path
29c0: 5c 74 6f 5c 61 6c 6c 2e 65 61 67 6c 65 0d 0a 20  \to\all.eagle.. 
29d0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66       #..      if
29e0: 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a   {[info exists :
29f0: 3a 62 75 69 6c 64 5f 64 69 72 65 63 74 6f 72 79  :build_directory
2a00: 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20  ] && \..        
2a10: 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68    [string length
2a20: 20 24 3a 3a 62 75 69 6c 64 5f 64 69 72 65 63 74   $::build_direct
2a30: 6f 72 79 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b  ory] > 0} then {
2a40: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
2a50: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 65       # NOTE: The
2a60: 20 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 74 68 65   location of the
2a70: 20 62 75 69 6c 64 20 64 69 72 65 63 74 6f 72 79   build directory
2a80: 20 68 61 73 20 62 65 65 6e 20 6f 76 65 72 72 69   has been overri
2a90: 64 64 65 6e 3b 0d 0a 20 20 20 20 20 20 20 20 23  dden;..        #
2aa0: 20 20 20 20 20 20 20 74 68 65 72 65 66 6f 72 65         therefore
2ab0: 2c 20 75 73 65 20 69 74 20 76 65 72 62 61 74 69  , use it verbati
2ac0: 6d 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  m...        #.. 
2ad0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 3a         return $:
2ae0: 3a 62 75 69 6c 64 5f 64 69 72 65 63 74 6f 72 79  :build_directory
2af0: 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b  ..      } else {
2b00: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
2b10: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 66 20       # NOTE: If 
2b20: 74 68 65 20 22 6e 61 74 69 76 65 22 20 72 75 6e  the "native" run
2b30: 74 69 6d 65 20 6f 70 74 69 6f 6e 20 69 73 20 73  time option is s
2b40: 65 74 2c 20 74 68 65 20 6d 69 78 65 64 2d 6d 6f  et, the mixed-mo
2b50: 64 65 20 61 73 73 65 6d 62 6c 79 0d 0a 20 20 20  de assembly..   
2b60: 20 20 20 20 20 23 20 20 20 20 20 20 20 69 73 20       #       is 
2b70: 62 65 69 6e 67 20 74 65 73 74 65 64 2e 20 20 49  being tested.  I
2b80: 6e 20 74 68 61 74 20 63 61 73 65 2c 20 74 68 65  n that case, the
2b90: 20 70 61 74 68 20 74 6f 20 74 68 65 20 62 75 69   path to the bui
2ba0: 6c 64 20 64 69 72 65 63 74 6f 72 79 0d 0a 20 20  ld directory..  
2bb0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 77 69        #       wi
2bc0: 6c 6c 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 70  ll contain the p
2bd0: 6c 61 74 66 6f 72 6d 20 6e 61 6d 65 20 61 6e 64  latform name and
2be0: 20 61 6c 6c 20 74 68 65 20 62 69 6e 61 72 69 65   all the binarie
2bf0: 73 20 75 6e 64 65 72 20 74 65 73 74 0d 0a 20 20  s under test..  
2c00: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 73 68        #       sh
2c10: 6f 75 6c 64 20 62 65 20 70 72 65 73 65 6e 74 20  ould be present 
2c20: 69 6e 20 74 68 61 74 20 64 69 72 65 63 74 6f 72  in that director
2c30: 79 2e 20 20 49 66 20 74 68 65 20 22 6e 61 74 69  y.  If the "nati
2c40: 76 65 22 20 72 75 6e 74 69 6d 65 0d 0a 20 20 20  ve" runtime..   
2c50: 20 20 20 20 20 23 20 20 20 20 20 20 20 6f 70 74       #       opt
2c60: 69 6f 6e 20 69 73 20 6e 6f 74 20 73 65 74 2c 20  ion is not set, 
2c70: 74 68 65 20 62 75 69 6c 64 20 64 69 72 65 63 74  the build direct
2c80: 6f 72 79 20 77 69 6c 6c 20 62 65 20 63 6f 6e 73  ory will be cons
2c90: 69 64 65 72 65 64 20 74 6f 20 62 65 0d 0a 20 20  idered to be..  
2ca0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 22 70        #       "p
2cb0: 6c 61 74 66 6f 72 6d 2d 6e 65 75 74 72 61 6c 22  latform-neutral"
2cc0: 2c 20 77 69 74 68 20 74 68 65 20 6e 6f 74 61 62  , with the notab
2cd0: 6c 65 20 65 78 63 65 70 74 69 6f 6e 20 6f 66 20  le exception of 
2ce0: 61 6e 79 20 6e 61 74 69 76 65 0d 0a 20 20 20 20  any native..    
2cf0: 20 20 20 20 23 20 20 20 20 20 20 20 61 73 73 65      #       asse
2d00: 6d 62 6c 79 20 28 65 2e 67 2e 20 22 53 51 4c 69  mbly (e.g. "SQLi
2d10: 74 65 2e 49 6e 74 65 72 6f 70 2e 64 6c 6c 22 29  te.Interop.dll")
2d20: 20 63 6f 70 69 65 64 20 74 68 65 72 65 20 64 75   copied there du
2d30: 72 69 6e 67 20 74 68 65 0d 0a 20 20 20 20 20 20  ring the..      
2d40: 20 20 23 20 20 20 20 20 20 20 62 75 69 6c 64 20    #       build 
2d50: 70 72 6f 63 65 73 73 20 69 74 73 65 6c 66 2e 20  process itself. 
2d60: 20 49 66 20 74 68 65 20 62 75 69 6c 64 20 70 72   If the build pr
2d70: 6f 63 65 73 73 20 73 6f 6d 65 68 6f 77 20 64 6f  ocess somehow do
2d80: 65 73 20 6e 6f 74 0d 0a 20 20 20 20 20 20 20 20  es not..        
2d90: 23 20 20 20 20 20 20 20 63 6f 70 79 20 74 68 65  #       copy the
2da0: 20 6e 61 74 69 76 65 20 61 73 73 65 6d 62 6c 79   native assembly
2db0: 20 66 6f 72 20 74 68 69 73 20 70 6c 61 74 66 6f   for this platfo
2dc0: 72 6d 2c 20 6d 6f 73 74 20 6f 66 20 74 68 65 20  rm, most of the 
2dd0: 74 65 73 74 73 0d 0a 20 20 20 20 20 20 20 20 23  tests..        #
2de0: 20 20 20 20 20 20 20 69 6e 20 74 68 65 20 73 75         in the su
2df0: 69 74 65 20 77 69 6c 6c 20 73 69 6d 70 6c 79 20  ite will simply 
2e00: 62 65 20 73 6b 69 70 70 65 64 2e 20 20 47 65 6e  be skipped.  Gen
2e10: 65 72 61 6c 6c 79 20 73 70 65 61 6b 69 6e 67 2c  erally speaking,
2e20: 20 74 68 65 72 65 0d 0a 20 20 20 20 20 20 20 20   there..        
2e30: 23 20 20 20 20 20 20 20 61 72 65 20 74 77 6f 20  #       are two 
2e40: 77 61 79 73 20 74 6f 20 62 75 69 6c 64 20 74 68  ways to build th
2e50: 65 20 62 69 6e 61 72 69 65 73 20 77 68 65 6e 20  e binaries when 
2e60: 70 72 65 70 61 72 69 6e 67 20 74 6f 20 72 75 6e  preparing to run
2e70: 20 74 68 65 0d 0a 20 20 20 20 20 20 20 20 23 20   the..        # 
2e80: 20 20 20 20 20 20 74 65 73 74 20 73 75 69 74 65        test suite
2e90: 3a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  :..        #..  
2ea0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 31 2e        #       1.
2eb0: 20 42 75 69 6c 64 20 74 68 65 20 73 65 70 61 72   Build the separ
2ec0: 61 74 65 20 6d 61 6e 61 67 65 64 20 61 6e 64 20  ate managed and 
2ed0: 6e 61 74 69 76 65 20 61 73 73 65 6d 62 6c 69 65  native assemblie
2ee0: 73 20 75 73 69 6e 67 20 73 6f 6d 65 0d 0a 20 20  s using some..  
2ef0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 20 20        #         
2f00: 20 63 6f 6d 6d 61 6e 64 73 20 73 69 6d 69 6c 61   commands simila
2f10: 72 20 74 6f 3a 0d 0a 20 20 20 20 20 20 20 20 23  r to:..        #
2f20: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
2f30: 20 20 20 20 20 62 75 69 6c 64 2e 62 61 74 20 24       build.bat $
2f40: 7b 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 7d 4d  {Configuration}M
2f50: 61 6e 61 67 65 64 4f 6e 6c 79 20 24 7b 50 6c 61  anagedOnly ${Pla
2f60: 74 66 6f 72 6d 7d 0d 0a 20 20 20 20 20 20 20 20  tform}..        
2f70: 23 20 20 20 20 20 20 20 20 20 20 62 75 69 6c 64  #          build
2f80: 2e 62 61 74 20 24 7b 43 6f 6e 66 69 67 75 72 61  .bat ${Configura
2f90: 74 69 6f 6e 7d 4e 61 74 69 76 65 4f 6e 6c 79 20  tion}NativeOnly 
2fa0: 24 7b 50 6c 61 74 66 6f 72 6d 7d 0d 0a 20 20 20  ${Platform}..   
2fb0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
2fc0: 23 20 20 20 20 20 20 20 20 20 20 57 68 65 72 65  #          Where
2fd0: 20 24 7b 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e   ${Configuration
2fe0: 7d 20 69 73 20 65 69 74 68 65 72 20 22 44 65 62  } is either "Deb
2ff0: 75 67 22 20 6f 72 20 22 52 65 6c 65 61 73 65 22  ug" or "Release"
3000: 20 61 6e 64 0d 0a 20 20 20 20 20 20 20 20 23 20   and..        # 
3010: 20 20 20 20 20 20 20 20 20 24 7b 50 6c 61 74 66           ${Platf
3020: 6f 72 6d 7d 20 69 73 20 65 69 74 68 65 72 20 22  orm} is either "
3030: 57 69 6e 33 32 22 20 6f 72 20 22 78 36 34 22 2e  Win32" or "x64".
3040: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
3050: 20 20 20 20 20 23 20 20 20 20 20 20 20 32 2e 20       #       2. 
3060: 42 75 69 6c 64 20 74 68 65 20 6d 69 78 65 64 2d  Build the mixed-
3070: 6d 6f 64 65 20 61 73 73 65 6d 62 6c 79 20 75 73  mode assembly us
3080: 69 6e 67 20 61 20 63 6f 6d 6d 61 6e 64 20 73 69  ing a command si
3090: 6d 69 6c 61 72 20 74 6f 3a 0d 0a 20 20 20 20 20  milar to:..     
30a0: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
30b0: 20 20 20 20 20 20 20 20 20 62 75 69 6c 64 2e 62           build.b
30c0: 61 74 20 24 7b 43 6f 6e 66 69 67 75 72 61 74 69  at ${Configurati
30d0: 6f 6e 7d 20 24 7b 50 6c 61 74 66 6f 72 6d 7d 0d  on} ${Platform}.
30e0: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
30f0: 20 20 20 20 23 20 20 20 20 20 20 20 20 20 20 57      #          W
3100: 68 65 72 65 20 24 7b 43 6f 6e 66 69 67 75 72 61  here ${Configura
3110: 74 69 6f 6e 7d 20 69 73 20 65 69 74 68 65 72 20  tion} is either 
3120: 22 44 65 62 75 67 22 20 6f 72 20 22 52 65 6c 65  "Debug" or "Rele
3130: 61 73 65 22 20 61 6e 64 0d 0a 20 20 20 20 20 20  ase" and..      
3140: 20 20 23 20 20 20 20 20 20 20 20 20 20 24 7b 50    #          ${P
3150: 6c 61 74 66 6f 72 6d 7d 20 69 73 20 65 69 74 68  latform} is eith
3160: 65 72 20 22 57 69 6e 33 32 22 20 6f 72 20 22 78  er "Win32" or "x
3170: 36 34 22 2e 20 20 49 66 20 74 68 69 73 20 63 6f  64".  If this co
3180: 6d 6d 61 6e 64 20 69 73 0d 0a 20 20 20 20 20 20  mmand is..      
3190: 20 20 23 20 20 20 20 20 20 20 20 20 20 75 73 65    #          use
31a0: 64 2c 20 76 61 72 69 6f 75 73 20 74 65 73 74 73  d, various tests
31b0: 20 74 68 61 74 20 72 65 71 75 69 72 65 20 73 75   that require su
31c0: 70 70 6c 65 6d 65 6e 74 61 72 79 20 6d 61 6e 61  pplementary mana
31d0: 67 65 64 0d 0a 20 20 20 20 20 20 20 20 23 20 20  ged..        #  
31e0: 20 20 20 20 20 20 20 20 61 73 73 65 6d 62 6c 69          assembli
31f0: 65 73 20 28 65 2e 67 2e 20 4c 49 4e 51 29 20 6d  es (e.g. LINQ) m
3200: 61 79 20 62 65 20 73 6b 69 70 70 65 64 20 75 6e  ay be skipped un
3210: 6c 65 73 73 20 74 68 6f 73 65 20 62 69 6e 61 72  less those binar
3220: 69 65 73 0d 0a 20 20 20 20 20 20 20 20 23 20 20  ies..        #  
3230: 20 20 20 20 20 20 20 20 61 72 65 20 73 75 62 73          are subs
3240: 65 71 75 65 6e 74 6c 79 20 63 6f 70 69 65 64 20  equently copied 
3250: 69 6e 74 6f 20 74 68 65 20 63 6f 72 72 65 63 74  into the correct
3260: 20 64 69 72 65 63 74 6f 72 79 20 28 69 2e 65 2e   directory (i.e.
3270: 20 62 79 0d 0a 20 20 20 20 20 20 20 20 23 20 20   by..        #  
3280: 20 20 20 20 20 20 20 20 22 74 65 73 74 5f 61 6c          "test_al
3290: 6c 2e 62 61 74 22 29 2e 0d 0a 20 20 20 20 20 20  l.bat")...      
32a0: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 20    #..        #  
32b0: 20 20 20 20 20 4e 6f 74 65 20 74 68 61 74 20 61       Note that a
32c0: 6c 6c 20 6f 66 20 74 68 65 20 62 75 69 6c 64 20  ll of the build 
32d0: 63 6f 6d 6d 61 6e 64 73 20 61 62 6f 76 65 20 77  commands above w
32e0: 69 6c 6c 20 64 65 66 61 75 6c 74 20 74 6f 20 75  ill default to u
32f0: 73 69 6e 67 0d 0a 20 20 20 20 20 20 20 20 23 20  sing..        # 
3300: 20 20 20 20 20 20 74 68 65 20 6c 61 74 65 73 74        the latest
3310: 20 76 65 72 73 69 6f 6e 20 6f 66 20 4d 53 42 75   version of MSBu
3320: 69 6c 64 20 61 76 61 69 6c 61 62 6c 65 20 61 6e  ild available an
3330: 64 20 74 68 65 20 22 74 65 73 74 5f 79 65 61 72  d the "test_year
3340: 22 20 6d 61 79 0d 0a 20 20 20 20 20 20 20 20 23  " may..        #
3350: 20 20 20 20 20 20 20 6e 65 65 64 20 74 6f 20 62         need to b
3360: 65 20 61 64 6a 75 73 74 65 64 20 61 63 63 6f 72  e adjusted accor
3370: 64 69 6e 67 6c 79 20 74 6f 20 61 63 74 75 61 6c  dingly to actual
3380: 6c 79 20 72 75 6e 20 74 68 65 20 74 65 73 74 20  ly run the test 
3390: 73 75 69 74 65 2e 0d 0a 20 20 20 20 20 20 20 20  suite...        
33a0: 23 20 20 20 20 20 20 20 52 65 66 65 72 20 74 6f  #       Refer to
33b0: 20 74 68 65 20 63 6f 6d 6d 65 6e 74 73 20 69 6e   the comments in
33c0: 20 5b 67 65 74 42 75 69 6c 64 59 65 61 72 5d 20   [getBuildYear] 
33d0: 66 6f 72 20 6d 6f 72 65 20 69 6e 66 6f 72 6d 61  for more informa
33e0: 74 69 6f 6e 20 6f 6e 0d 0a 20 20 20 20 20 20 20  tion on..       
33f0: 20 23 20 20 20 20 20 20 20 68 6f 77 20 74 6f 20   #       how to 
3400: 73 65 74 20 74 68 69 73 20 76 61 72 69 61 62 6c  set this variabl
3410: 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  e...        #.. 
3420: 20 20 20 20 20 20 20 73 65 74 20 6e 61 74 69 76         set nativ
3430: 65 20 5b 68 61 73 52 75 6e 74 69 6d 65 4f 70 74  e [hasRuntimeOpt
3440: 69 6f 6e 20 6e 61 74 69 76 65 5d 0d 0a 0d 0a 20  ion native].... 
3450: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b 6a         return [j
3460: 6f 69 6e 42 75 69 6c 64 44 69 72 65 63 74 6f 72  oinBuildDirector
3470: 79 20 24 6e 61 74 69 76 65 20 5b 67 65 74 42 75  y $native [getBu
3480: 69 6c 64 42 61 73 65 44 69 72 65 63 74 6f 72 79  ildBaseDirectory
3490: 5d 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ] \..           
34a0: 20 5b 67 65 74 42 75 69 6c 64 59 65 61 72 5d 20   [getBuildYear] 
34b0: 5b 67 65 74 42 75 69 6c 64 50 6c 61 74 66 6f 72  [getBuildPlatfor
34c0: 6d 20 24 6e 61 74 69 76 65 5d 20 5b 67 65 74 42  m $native] [getB
34d0: 75 69 6c 64 43 6f 6e 66 69 67 75 72 61 74 69 6f  uildConfiguratio
34e0: 6e 5d 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20  n]]..      }..  
34f0: 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
3500: 20 67 65 74 42 75 69 6c 64 46 69 6c 65 4e 61 6d   getBuildFileNam
3510: 65 20 7b 20 66 69 6c 65 4e 61 6d 65 20 7d 20 7b  e { fileName } {
3520: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
3530: 20 23 20 4e 4f 54 45 3a 20 52 65 74 75 72 6e 73   # NOTE: Returns
3540: 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 66   the specified f
3550: 69 6c 65 20 6e 61 6d 65 20 61 73 20 69 66 20 69  ile name as if i
3560: 74 20 77 65 72 65 20 6c 6f 63 61 74 65 64 20 69  t were located i
3570: 6e 20 74 68 65 0d 0a 20 20 20 20 20 20 23 20 20  n the..      #  
3580: 20 20 20 20 20 62 75 69 6c 64 20 64 69 72 65 63       build direc
3590: 74 6f 72 79 2c 20 64 69 73 63 61 72 64 69 6e 67  tory, discarding
35a0: 20 61 6e 79 20 64 69 72 65 63 74 6f 72 79 20 69   any directory i
35b0: 6e 66 6f 72 6d 61 74 69 6f 6e 20 70 72 65 73 65  nformation prese
35c0: 6e 74 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  nt..      #     
35d0: 20 20 69 6e 20 74 68 65 20 66 69 6c 65 20 6e 61    in the file na
35e0: 6d 65 20 61 73 20 70 72 6f 76 69 64 65 64 20 62  me as provided b
35f0: 79 20 6f 75 72 20 63 61 6c 6c 65 72 2e 0d 0a 20  y our caller... 
3600: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 72 65       #..      re
3610: 74 75 72 6e 20 5b 66 69 6c 65 20 6e 61 74 69 76  turn [file nativ
3620: 65 6e 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20 20  ename \..       
3630: 20 20 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5b 67     [file join [g
3640: 65 74 42 75 69 6c 64 44 69 72 65 63 74 6f 72 79  etBuildDirectory
3650: 5d 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 66 69  ] [file tail $fi
3660: 6c 65 4e 61 6d 65 5d 5d 5d 0d 0a 20 20 20 20 7d  leName]]]..    }
3670: 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65  .....    proc ge
3680: 74 42 69 6e 61 72 79 44 69 72 65 63 74 6f 72 79  tBinaryDirectory
3690: 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a   {} {..      #..
36a0: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68        # NOTE: Th
36b0: 69 73 20 70 72 6f 63 65 64 75 72 65 20 72 65 74  is procedure ret
36c0: 75 72 6e 73 20 74 68 65 20 64 69 72 65 63 74 6f  urns the directo
36d0: 72 79 20 77 68 65 72 65 20 74 68 65 20 74 65 73  ry where the tes
36e0: 74 20 61 70 70 6c 69 63 61 74 69 6f 6e 0d 0a 20  t application.. 
36f0: 20 20 20 20 20 23 20 20 20 20 20 20 20 69 74 73       #       its
3700: 65 6c 66 20 28 69 2e 65 2e 20 74 68 65 20 45 61  elf (i.e. the Ea
3710: 67 6c 65 20 73 68 65 6c 6c 29 20 69 73 20 6c 6f  gle shell) is lo
3720: 63 61 74 65 64 2e 20 20 54 68 69 73 20 77 69 6c  cated.  This wil
3730: 6c 20 62 65 20 75 73 65 64 20 61 73 0d 0a 20 20  l be used as..  
3740: 20 20 20 20 23 20 20 20 20 20 20 20 74 68 65 20      #       the 
3750: 64 65 73 74 69 6e 61 74 69 6f 6e 20 66 6f 72 20  destination for 
3760: 74 68 65 20 63 6f 70 69 65 64 20 53 79 73 74 65  the copied Syste
3770: 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 20 6e 61  m.Data.SQLite na
3780: 74 69 76 65 20 61 6e 64 0d 0a 20 20 20 20 20 20  tive and..      
3790: 23 20 20 20 20 20 20 20 6d 61 6e 61 67 65 64 20  #       managed 
37a0: 61 73 73 65 6d 62 6c 69 65 73 20 28 69 2e 65 2e  assemblies (i.e.
37b0: 20 62 65 63 61 75 73 65 20 74 68 69 73 20 69 73   because this is
37c0: 20 6f 6e 65 20 6f 66 20 74 68 65 20 66 65 77 20   one of the few 
37d0: 70 6c 61 63 65 73 0d 0a 20 20 20 20 20 20 23 20  places..      # 
37e0: 20 20 20 20 20 20 77 68 65 72 65 20 74 68 65 20        where the 
37f0: 43 4c 52 20 77 69 6c 6c 20 61 63 74 75 61 6c 6c  CLR will actuall
3800: 79 20 66 69 6e 64 20 61 6e 64 20 6c 6f 61 64 20  y find and load 
3810: 74 68 65 6d 20 70 72 6f 70 65 72 6c 79 29 2e 0d  them properly)..
3820: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
3830: 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73  if {[info exists
3840: 20 3a 3a 62 69 6e 61 72 79 5f 64 69 72 65 63 74   ::binary_direct
3850: 6f 72 79 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20  ory] && \..     
3860: 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e       [string len
3870: 67 74 68 20 24 3a 3a 62 69 6e 61 72 79 5f 64 69  gth $::binary_di
3880: 72 65 63 74 6f 72 79 5d 20 3e 20 30 7d 20 74 68  rectory] > 0} th
3890: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d  en {..        #.
38a0: 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
38b0: 20 54 68 65 20 6c 6f 63 61 74 69 6f 6e 20 6f 66   The location of
38c0: 20 74 68 65 20 62 69 6e 61 72 79 20 64 69 72 65   the binary dire
38d0: 63 74 6f 72 79 20 68 61 73 20 62 65 65 6e 20 6f  ctory has been o
38e0: 76 65 72 72 69 64 64 65 6e 3b 0d 0a 20 20 20 20  verridden;..    
38f0: 20 20 20 20 23 20 20 20 20 20 20 20 74 68 65 72      #       ther
3900: 65 66 6f 72 65 2c 20 75 73 65 20 69 74 20 76 65  efore, use it ve
3910: 72 62 61 74 69 6d 2e 0d 0a 20 20 20 20 20 20 20  rbatim...       
3920: 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75   #..        retu
3930: 72 6e 20 24 3a 3a 62 69 6e 61 72 79 5f 64 69 72  rn $::binary_dir
3940: 65 63 74 6f 72 79 0d 0a 20 20 20 20 20 20 7d 20  ectory..      } 
3950: 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
3960: 72 65 74 75 72 6e 20 5b 69 6e 66 6f 20 62 69 6e  return [info bin
3970: 61 72 79 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20  ary]..      }.. 
3980: 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
3990: 63 20 67 65 74 42 69 6e 61 72 79 46 69 6c 65 4e  c getBinaryFileN
39a0: 61 6d 65 20 7b 20 66 69 6c 65 4e 61 6d 65 20 7d  ame { fileName }
39b0: 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20   {..      #..   
39c0: 20 20 20 23 20 4e 4f 54 45 3a 20 52 65 74 75 72     # NOTE: Retur
39d0: 6e 73 20 74 68 65 20 73 70 65 63 69 66 69 65 64  ns the specified
39e0: 20 66 69 6c 65 20 6e 61 6d 65 20 61 73 20 69 66   file name as if
39f0: 20 69 74 20 77 65 72 65 20 6c 6f 63 61 74 65 64   it were located
3a00: 20 69 6e 20 74 68 65 0d 0a 20 20 20 20 20 20 23   in the..      #
3a10: 20 20 20 20 20 20 20 62 69 6e 61 72 79 20 64 69         binary di
3a20: 72 65 63 74 6f 72 79 2c 20 64 69 73 63 61 72 64  rectory, discard
3a30: 69 6e 67 20 61 6e 79 20 64 69 72 65 63 74 6f 72  ing any director
3a40: 79 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 70 72  y information pr
3a50: 65 73 65 6e 74 0d 0a 20 20 20 20 20 20 23 20 20  esent..      #  
3a60: 20 20 20 20 20 69 6e 20 74 68 65 20 66 69 6c 65       in the file
3a70: 20 6e 61 6d 65 20 61 73 20 70 72 6f 76 69 64 65   name as provide
3a80: 64 20 62 79 20 6f 75 72 20 63 61 6c 6c 65 72 2e  d by our caller.
3a90: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
3aa0: 20 72 65 74 75 72 6e 20 5b 66 69 6c 65 20 6e 61   return [file na
3ab0: 74 69 76 65 6e 61 6d 65 20 5c 0d 0a 20 20 20 20  tivename \..    
3ac0: 20 20 20 20 20 20 5b 66 69 6c 65 20 6a 6f 69 6e        [file join
3ad0: 20 5b 67 65 74 42 69 6e 61 72 79 44 69 72 65 63   [getBinaryDirec
3ae0: 74 6f 72 79 5d 20 5b 66 69 6c 65 20 74 61 69 6c  tory] [file tail
3af0: 20 24 66 69 6c 65 4e 61 6d 65 5d 5d 5d 0d 0a 20   $fileName]]].. 
3b00: 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
3b10: 63 20 67 65 74 43 6f 72 65 42 69 6e 61 72 79 46  c getCoreBinaryF
3b20: 69 6c 65 4e 61 6d 65 20 7b 20 7b 73 74 61 6e 64  ileName { {stand
3b30: 61 72 64 20 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a  ard false} } {..
3b40: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
3b50: 20 4e 4f 54 45 3a 20 52 65 74 75 72 6e 73 20 74   NOTE: Returns t
3b60: 68 65 20 66 75 6c 6c 20 70 61 74 68 20 66 6f 72  he full path for
3b70: 20 74 68 65 20 66 69 6c 65 20 63 6f 6e 74 61 69   the file contai
3b80: 6e 69 6e 67 20 74 68 65 20 63 6f 72 65 20 53 51  ning the core SQ
3b90: 4c 69 74 65 0d 0a 20 20 20 20 20 20 23 20 20 20  Lite..      #   
3ba0: 20 20 20 20 6c 69 62 72 61 72 79 20 63 6f 64 65      library code
3bb0: 20 66 6f 72 20 74 68 69 73 20 70 6c 61 74 66 6f   for this platfo
3bc0: 72 6d 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  rm...      #..  
3bd0: 20 20 20 20 69 66 20 7b 5b 68 61 73 52 75 6e 74      if {[hasRunt
3be0: 69 6d 65 4f 70 74 69 6f 6e 20 6e 61 74 69 76 65  imeOption native
3bf0: 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
3c00: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
3c10: 4e 4f 54 45 3a 20 52 65 74 75 72 6e 20 74 68 65  NOTE: Return the
3c20: 20 6d 69 78 65 64 2d 6d 6f 64 65 20 61 73 73 65   mixed-mode asse
3c30: 6d 62 6c 79 20 66 69 6c 65 20 6e 61 6d 65 2e 0d  mbly file name..
3c40: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
3c50: 20 20 20 20 72 65 74 75 72 6e 20 5b 66 69 6c 65      return [file
3c60: 20 6e 61 74 69 76 65 6e 61 6d 65 20 5c 0d 0a 20   nativename \.. 
3c70: 20 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65             [file
3c80: 20 6a 6f 69 6e 20 5b 67 65 74 42 69 6e 61 72 79   join [getBinary
3c90: 44 69 72 65 63 74 6f 72 79 5d 20 53 79 73 74 65  Directory] Syste
3ca0: 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 64 6c  m.Data.SQLite.dl
3cb0: 6c 5d 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73  l]]..      } els
3cc0: 65 69 66 20 7b 24 73 74 61 6e 64 61 72 64 7d 20  eif {$standard} 
3cd0: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
3ce0: 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
3cf0: 45 3a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 61  E: Return the na
3d00: 74 69 76 65 2d 6f 6e 6c 79 20 73 74 61 6e 64 61  tive-only standa
3d10: 72 64 20 53 51 4c 69 74 65 20 6c 69 62 72 61 72  rd SQLite librar
3d20: 79 20 66 69 6c 65 20 6e 61 6d 65 2e 0d 0a 20 20  y file name...  
3d30: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
3d40: 20 72 65 74 75 72 6e 20 5b 66 69 6c 65 20 6e 61   return [file na
3d50: 74 69 76 65 6e 61 6d 65 20 5c 0d 0a 20 20 20 20  tivename \..    
3d60: 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20 6a 6f          [file jo
3d70: 69 6e 20 5b 67 65 74 42 69 6e 61 72 79 44 69 72  in [getBinaryDir
3d80: 65 63 74 6f 72 79 5d 20 73 71 6c 69 74 65 33 2e  ectory] sqlite3.
3d90: 64 6c 6c 5d 5d 0d 0a 20 20 20 20 20 20 7d 20 65  dll]]..      } e
3da0: 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  lse {..        #
3db0: 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
3dc0: 3a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 61 74  : Return the nat
3dd0: 69 76 65 2d 6f 6e 6c 79 20 69 6e 74 65 72 6f 70  ive-only interop
3de0: 20 61 73 73 65 6d 62 6c 79 20 66 69 6c 65 20 6e   assembly file n
3df0: 61 6d 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  ame...        #.
3e00: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
3e10: 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65  [file nativename
3e20: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
3e30: 5b 66 69 6c 65 20 6a 6f 69 6e 20 5b 67 65 74 42  [file join [getB
3e40: 69 6e 61 72 79 44 69 72 65 63 74 6f 72 79 5d 20  inaryDirectory] 
3e50: 53 51 4c 69 74 65 2e 49 6e 74 65 72 6f 70 2e 64  SQLite.Interop.d
3e60: 6c 6c 5d 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20  ll]]..      }.. 
3e70: 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
3e80: 63 20 67 65 74 43 6f 6d 6d 6f 6e 44 69 72 65 63  c getCommonDirec
3e90: 74 6f 72 79 20 7b 7d 20 7b 0d 0a 20 20 20 20 20  tory {} {..     
3ea0: 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
3eb0: 3a 20 54 68 69 73 20 70 72 6f 63 65 64 75 72 65  : This procedure
3ec0: 20 72 65 74 75 72 6e 73 20 74 68 65 20 64 69 72   returns the dir
3ed0: 65 63 74 6f 72 79 20 77 68 65 72 65 20 74 68 65  ectory where the
3ee0: 20 74 65 73 74 20 73 63 72 69 70 74 73 0d 0a 20   test scripts.. 
3ef0: 20 20 20 20 20 23 20 20 20 20 20 20 20 73 68 6f       #       sho
3f00: 75 6c 64 20 62 65 20 6c 6f 63 61 74 65 64 2e 20  uld be located. 
3f10: 20 42 79 20 64 65 66 61 75 6c 74 2c 20 74 68 69   By default, thi
3f20: 73 20 6a 75 73 74 20 72 65 74 75 72 6e 73 20 74  s just returns t
3f30: 68 65 20 45 61 67 6c 65 0d 0a 20 20 20 20 20 20  he Eagle..      
3f40: 23 20 20 20 20 20 20 20 62 69 6e 61 72 79 20 64  #       binary d
3f50: 69 72 65 63 74 6f 72 79 2e 0d 0a 20 20 20 20 20  irectory...     
3f60: 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69   #..      if {[i
3f70: 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 63 6f 6d  nfo exists ::com
3f80: 6d 6f 6e 5f 64 69 72 65 63 74 6f 72 79 5d 20 26  mon_directory] &
3f90: 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b  & \..          [
3fa0: 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a  string length $:
3fb0: 3a 63 6f 6d 6d 6f 6e 5f 64 69 72 65 63 74 6f 72  :common_director
3fc0: 79 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  y] > 0} then {..
3fd0: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
3fe0: 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 65 20 6c     # NOTE: The l
3ff0: 6f 63 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 63  ocation of the c
4000: 6f 6d 6d 6f 6e 20 64 69 72 65 63 74 6f 72 79 20  ommon directory 
4010: 68 61 73 20 62 65 65 6e 20 73 65 74 3b 0d 0a 20  has been set;.. 
4020: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74         #       t
4030: 68 65 72 65 66 6f 72 65 2c 20 75 73 65 20 69 74  herefore, use it
4040: 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
4050: 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 3a 3a        return $::
4060: 63 6f 6d 6d 6f 6e 5f 64 69 72 65 63 74 6f 72 79  common_directory
4070: 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 69 66  ..      } elseif
4080: 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a   {[info exists :
4090: 3a 76 65 6e 64 6f 72 5f 64 69 72 65 63 74 6f 72  :vendor_director
40a0: 79 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20  y] && \..       
40b0: 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74     [string lengt
40c0: 68 20 24 3a 3a 76 65 6e 64 6f 72 5f 64 69 72 65  h $::vendor_dire
40d0: 63 74 6f 72 79 5d 20 3e 20 30 7d 20 74 68 65 6e  ctory] > 0} then
40e0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20   {..        #.. 
40f0: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54         # NOTE: T
4100: 68 65 20 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 74  he location of t
4110: 68 65 20 76 65 6e 64 6f 72 20 64 69 72 65 63 74  he vendor direct
4120: 6f 72 79 20 68 61 73 20 62 65 65 6e 20 73 65 74  ory has been set
4130: 3b 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  ;..        #    
4140: 20 20 20 74 68 65 72 65 66 6f 72 65 2c 20 75 73     therefore, us
4150: 65 20 69 74 2e 0d 0a 20 20 20 20 20 20 20 20 23  e it...        #
4160: 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ..        return
4170: 20 24 3a 3a 76 65 6e 64 6f 72 5f 64 69 72 65 63   $::vendor_direc
4180: 74 6f 72 79 0d 0a 20 20 20 20 20 20 7d 20 65 6c  tory..      } el
4190: 73 65 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73  seif {[info exis
41a0: 74 73 20 3a 3a 74 63 6c 5f 6c 69 62 72 61 72 79  ts ::tcl_library
41b0: 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20  ] && \..        
41c0: 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68    [string length
41d0: 20 24 3a 3a 74 63 6c 5f 6c 69 62 72 61 72 79 5d   $::tcl_library]
41e0: 20 3e 20 30 20 26 26 20 5c 0d 0a 20 20 20 20 20   > 0 && \..     
41f0: 20 20 20 20 20 5b 66 69 6c 65 20 69 73 64 69 72       [file isdir
4200: 65 63 74 6f 72 79 20 24 3a 3a 74 63 6c 5f 6c 69  ectory $::tcl_li
4210: 62 72 61 72 79 5d 7d 20 74 68 65 6e 20 7b 0d 0a  brary]} then {..
4220: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
4230: 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 65 20 76     # NOTE: The v
4240: 61 72 69 61 62 6c 65 20 77 69 74 68 20 74 68 65  ariable with the
4250: 20 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 74 68 65   location of the
4260: 20 73 63 72 69 70 74 20 6c 69 62 72 61 72 79 20   script library 
4270: 69 73 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  is..        #   
4280: 20 20 20 20 73 65 74 20 61 6e 64 20 61 70 70 65      set and appe
4290: 61 72 73 20 74 6f 20 62 65 20 61 20 72 65 61 6c  ars to be a real
42a0: 20 64 69 72 65 63 74 6f 72 79 20 28 69 2e 65 2e   directory (i.e.
42b0: 20 6e 6f 74 20 65 6d 62 65 64 64 65 64 0d 0a 20   not embedded.. 
42c0: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 77         #       w
42d0: 69 74 68 69 6e 20 61 20 66 69 6c 65 29 3b 20 74  ithin a file); t
42e0: 68 65 72 65 66 6f 72 65 2c 20 75 73 65 20 69 74  herefore, use it
42f0: 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
4300: 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 3a 3a        return $::
4310: 74 63 6c 5f 6c 69 62 72 61 72 79 0d 0a 20 20 20  tcl_library..   
4320: 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
4330: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
4340: 23 20 4e 4f 54 45 3a 20 46 61 6c 6c 62 61 63 6b  # NOTE: Fallback
4350: 20 74 6f 20 74 68 65 20 64 69 72 65 63 74 6f 72   to the director
4360: 79 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  y containing the
4370: 20 65 78 65 63 75 74 61 62 6c 65 2e 0d 0a 20 20   executable...  
4380: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
4390: 20 72 65 74 75 72 6e 20 5b 69 6e 66 6f 20 62 69   return [info bi
43a0: 6e 61 72 79 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a  nary]..      }..
43b0: 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
43c0: 6f 63 20 67 65 74 44 61 74 61 62 61 73 65 44 69  oc getDatabaseDi
43d0: 72 65 63 74 6f 72 79 20 7b 7d 20 7b 0d 0a 20 20  rectory {} {..  
43e0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
43f0: 4f 54 45 3a 20 54 68 69 73 20 70 72 6f 63 65 64  OTE: This proced
4400: 75 72 65 20 72 65 74 75 72 6e 73 20 74 68 65 20  ure returns the 
4410: 64 69 72 65 63 74 6f 72 79 20 77 68 65 72 65 20  directory where 
4420: 74 68 65 20 74 65 73 74 20 64 61 74 61 62 61 73  the test databas
4430: 65 73 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  es..      #     
4440: 20 20 73 68 6f 75 6c 64 20 62 65 20 6c 6f 63 61    should be loca
4450: 74 65 64 2e 20 20 42 79 20 64 65 66 61 75 6c 74  ted.  By default
4460: 2c 20 74 68 69 73 20 6a 75 73 74 20 75 73 65 73  , this just uses
4470: 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 0d 0a   the temporary..
4480: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 64 69        #       di
4490: 72 65 63 74 6f 72 79 20 63 6f 6e 66 69 67 75 72  rectory configur
44a0: 65 64 20 66 6f 72 20 74 68 69 73 20 73 79 73 74  ed for this syst
44b0: 65 6d 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  em...      #..  
44c0: 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78      if {[info ex
44d0: 69 73 74 73 20 3a 3a 64 61 74 61 62 61 73 65 5f  ists ::database_
44e0: 64 69 72 65 63 74 6f 72 79 5d 20 26 26 20 5c 0d  directory] && \.
44f0: 0a 20 20 20 20 20 20 20 20 20 20 5b 73 74 72 69  .          [stri
4500: 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a 64 61 74  ng length $::dat
4510: 61 62 61 73 65 5f 64 69 72 65 63 74 6f 72 79 5d  abase_directory]
4520: 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20   > 0} then {..  
4530: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
4540: 20 23 20 4e 4f 54 45 3a 20 54 68 65 20 6c 6f 63   # NOTE: The loc
4550: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 64 61 74  ation of the dat
4560: 61 62 61 73 65 20 64 69 72 65 63 74 6f 72 79 20  abase directory 
4570: 68 61 73 20 62 65 65 6e 20 6f 76 65 72 72 69 64  has been overrid
4580: 64 65 6e 3b 0d 0a 20 20 20 20 20 20 20 20 23 20  den;..        # 
4590: 20 20 20 20 20 20 74 68 65 72 65 66 6f 72 65 2c        therefore,
45a0: 20 75 73 65 20 69 74 2e 0d 0a 20 20 20 20 20 20   use it...      
45b0: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74    #..        ret
45c0: 75 72 6e 20 24 3a 3a 64 61 74 61 62 61 73 65 5f  urn $::database_
45d0: 64 69 72 65 63 74 6f 72 79 0d 0a 20 20 20 20 20  directory..     
45e0: 20 7d 20 65 6c 73 65 69 66 20 7b 5b 69 6e 66 6f   } elseif {[info
45f0: 20 65 78 69 73 74 73 20 3a 3a 73 63 72 61 74 63   exists ::scratc
4600: 68 5f 64 69 72 65 63 74 6f 72 79 5d 20 26 26 20  h_directory] && 
4610: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 73 74  \..          [st
4620: 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a 73  ring length $::s
4630: 63 72 61 74 63 68 5f 64 69 72 65 63 74 6f 72 79  cratch_directory
4640: 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20  ] > 0} then {.. 
4650: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
4660: 20 20 23 20 4e 4f 54 45 3a 20 54 68 65 20 6c 6f    # NOTE: The lo
4670: 63 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 63  cation of the sc
4680: 72 61 74 63 68 20 64 69 72 65 63 74 6f 72 79 20  ratch directory 
4690: 68 61 73 20 62 65 65 6e 20 6f 76 65 72 72 69 64  has been overrid
46a0: 64 65 6e 3b 0d 0a 20 20 20 20 20 20 20 20 23 20  den;..        # 
46b0: 20 20 20 20 20 20 74 68 65 72 65 66 6f 72 65 2c        therefore,
46c0: 20 75 73 65 20 69 74 2e 0d 0a 20 20 20 20 20 20   use it...      
46d0: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74    #..        ret
46e0: 75 72 6e 20 24 3a 3a 73 63 72 61 74 63 68 5f 64  urn $::scratch_d
46f0: 69 72 65 63 74 6f 72 79 0d 0a 20 20 20 20 20 20  irectory..      
4700: 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
4710: 20 20 72 65 74 75 72 6e 20 5b 67 65 74 54 65 6d    return [getTem
4720: 70 6f 72 61 72 79 50 61 74 68 5d 0d 0a 20 20 20  poraryPath]..   
4730: 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a     }..    }.....
4740: 20 20 20 20 70 72 6f 63 20 67 65 74 54 65 6d 70      proc getTemp
4750: 6f 72 61 72 79 44 69 72 65 63 74 6f 72 79 20 7b  oraryDirectory {
4760: 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  } {..      #..  
4770: 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 69 73      # NOTE: This
4780: 20 70 72 6f 63 65 64 75 72 65 20 72 65 74 75 72   procedure retur
4790: 6e 73 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  ns the directory
47a0: 20 77 68 65 72 65 20 74 68 65 20 74 65 6d 70 6f   where the tempo
47b0: 72 61 72 79 20 66 69 6c 65 73 0d 0a 20 20 20 20  rary files..    
47c0: 20 20 23 20 20 20 20 20 20 20 73 68 6f 75 6c 64    #       should
47d0: 20 62 65 20 6c 6f 63 61 74 65 64 2e 20 20 42 79   be located.  By
47e0: 20 64 65 66 61 75 6c 74 2c 20 74 68 69 73 20 6a   default, this j
47f0: 75 73 74 20 75 73 65 73 20 74 68 65 20 74 65 6d  ust uses the tem
4800: 70 6f 72 61 72 79 0d 0a 20 20 20 20 20 20 23 20  porary..      # 
4810: 20 20 20 20 20 20 64 69 72 65 63 74 6f 72 79 20        directory 
4820: 63 6f 6e 66 69 67 75 72 65 64 20 66 6f 72 20 74  configured for t
4830: 68 69 73 20 73 79 73 74 65 6d 2e 0d 0a 20 20 20  his system...   
4840: 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
4850: 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 74  [info exists ::t
4860: 65 6d 70 6f 72 61 72 79 5f 64 69 72 65 63 74 6f  emporary_directo
4870: 72 79 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20  ry] && \..      
4880: 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67      [string leng
4890: 74 68 20 24 3a 3a 74 65 6d 70 6f 72 61 72 79 5f  th $::temporary_
48a0: 64 69 72 65 63 74 6f 72 79 5d 20 3e 20 30 7d 20  directory] > 0} 
48b0: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
48c0: 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
48d0: 45 3a 20 54 68 65 20 6c 6f 63 61 74 69 6f 6e 20  E: The location 
48e0: 6f 66 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  of the temporary
48f0: 20 64 69 72 65 63 74 6f 72 79 20 68 61 73 20 62   directory has b
4900: 65 65 6e 20 6f 76 65 72 72 69 64 64 65 6e 3b 0d  een overridden;.
4910: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
4920: 20 74 68 65 72 65 66 6f 72 65 2c 20 75 73 65 20   therefore, use 
4930: 69 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  it...        #..
4940: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 24          return $
4950: 3a 3a 74 65 6d 70 6f 72 61 72 79 5f 64 69 72 65  ::temporary_dire
4960: 63 74 6f 72 79 0d 0a 20 20 20 20 20 20 7d 20 65  ctory..      } e
4970: 6c 73 65 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69  lseif {[info exi
4980: 73 74 73 20 3a 3a 73 63 72 61 74 63 68 5f 64 69  sts ::scratch_di
4990: 72 65 63 74 6f 72 79 5d 20 26 26 20 5c 0d 0a 20  rectory] && \.. 
49a0: 20 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67           [string
49b0: 20 6c 65 6e 67 74 68 20 24 3a 3a 73 63 72 61 74   length $::scrat
49c0: 63 68 5f 64 69 72 65 63 74 6f 72 79 5d 20 3e 20  ch_directory] > 
49d0: 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
49e0: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
49f0: 4e 4f 54 45 3a 20 54 68 65 20 6c 6f 63 61 74 69  NOTE: The locati
4a00: 6f 6e 20 6f 66 20 74 68 65 20 73 63 72 61 74 63  on of the scratc
4a10: 68 20 64 69 72 65 63 74 6f 72 79 20 68 61 73 20  h directory has 
4a20: 62 65 65 6e 20 6f 76 65 72 72 69 64 64 65 6e 3b  been overridden;
4a30: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
4a40: 20 20 74 68 65 72 65 66 6f 72 65 2c 20 75 73 65    therefore, use
4a50: 20 69 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d   it...        #.
4a60: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
4a70: 24 3a 3a 73 63 72 61 74 63 68 5f 64 69 72 65 63  $::scratch_direc
4a80: 74 6f 72 79 0d 0a 20 20 20 20 20 20 7d 20 65 6c  tory..      } el
4a90: 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 72 65  se {..        re
4aa0: 74 75 72 6e 20 5b 67 65 74 54 65 6d 70 6f 72 61  turn [getTempora
4ab0: 72 79 50 61 74 68 5d 0d 0a 20 20 20 20 20 20 7d  ryPath]..      }
4ac0: 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
4ad0: 70 72 6f 63 20 67 65 74 54 65 73 74 4f 76 65 72  proc getTestOver
4ae0: 72 69 64 65 73 50 72 65 61 6d 62 6c 65 20 7b 20  ridesPreamble { 
4af0: 7b 65 78 74 72 61 56 61 72 4e 61 6d 65 73 20 22  {extraVarNames "
4b00: 22 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 73 65  "} } {..      se
4b10: 74 20 76 61 72 4e 61 6d 65 73 20 5b 6c 69 73 74  t varNames [list
4b20: 5d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  ]....      #..  
4b30: 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 66 20 61      # NOTE: If a
4b40: 76 61 69 6c 61 62 6c 65 2c 20 73 74 61 72 74 20  vailable, start 
4b50: 77 69 74 68 20 74 68 65 20 6d 61 73 74 65 72 20  with the master 
4b60: 6c 69 73 74 20 6f 66 20 74 65 73 74 20 6f 76 65  list of test ove
4b70: 72 72 69 64 65 0d 0a 20 20 20 20 20 20 23 20 20  rride..      #  
4b80: 20 20 20 20 20 76 61 72 69 61 62 6c 65 73 2e 0d       variables..
4b90: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
4ba0: 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73  if {[info exists
4bb0: 20 3a 3a 74 65 73 74 5f 6f 76 65 72 72 69 64 65   ::test_override
4bc0: 73 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20  s] && \..       
4bd0: 20 20 20 5b 6c 6c 65 6e 67 74 68 20 24 3a 3a 74     [llength $::t
4be0: 65 73 74 5f 6f 76 65 72 72 69 64 65 73 5d 20 3e  est_overrides] >
4bf0: 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
4c00: 20 20 20 20 65 76 61 6c 20 6c 61 70 70 65 6e 64      eval lappend
4c10: 20 76 61 72 4e 61 6d 65 73 20 24 3a 3a 74 65 73   varNames $::tes
4c20: 74 5f 6f 76 65 72 72 69 64 65 73 0d 0a 20 20 20  t_overrides..   
4c30: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d     }....      #.
4c40: 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49  .      # NOTE: I
4c50: 66 20 72 65 71 75 65 73 74 65 64 20 62 79 20 6f  f requested by o
4c60: 75 72 20 63 61 6c 6c 65 72 2c 20 61 64 64 20 61  ur caller, add a
4c70: 6e 79 20 61 64 64 69 74 69 6f 6e 61 6c 20 76 61  ny additional va
4c80: 72 69 61 62 6c 65 0d 0a 20 20 20 20 20 20 23 20  riable..      # 
4c90: 20 20 20 20 20 20 6e 61 6d 65 73 20 74 6f 20 63        names to c
4ca0: 6f 70 79 20 6e 6f 77 2e 0d 0a 20 20 20 20 20 20  opy now...      
4cb0: 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 6c 6c  #..      if {[ll
4cc0: 65 6e 67 74 68 20 24 65 78 74 72 61 56 61 72 4e  ength $extraVarN
4cd0: 61 6d 65 73 5d 20 3e 20 30 7d 20 74 68 65 6e 20  ames] > 0} then 
4ce0: 7b 0d 0a 20 20 20 20 20 20 20 20 65 76 61 6c 20  {..        eval 
4cf0: 6c 61 70 70 65 6e 64 20 76 61 72 4e 61 6d 65 73  lappend varNames
4d00: 20 24 65 78 74 72 61 56 61 72 4e 61 6d 65 73 0d   $extraVarNames.
4d10: 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
4d20: 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
4d30: 45 3a 20 42 75 69 6c 64 20 74 68 65 20 73 63 72  E: Build the scr
4d40: 69 70 74 20 66 72 61 67 6d 65 6e 74 20 74 6f 20  ipt fragment to 
4d50: 62 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 70  be returned by p
4d60: 72 6f 63 65 73 73 69 6e 67 20 65 61 63 68 0d 0a  rocessing each..
4d70: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 76 61        #       va
4d80: 72 69 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64 20  riable name and 
4d90: 61 64 64 69 6e 67 20 74 68 65 20 6e 65 63 65 63  adding the necec
4da0: 65 73 73 61 72 79 20 73 63 72 69 70 74 20 66 72  essary script fr
4db0: 61 67 6d 65 6e 74 73 20 66 6f 72 0d 0a 20 20 20  agments for..   
4dc0: 20 20 20 23 20 20 20 20 20 20 20 65 61 63 68 20     #       each 
4dd0: 6f 6e 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  one...      #.. 
4de0: 20 20 20 20 20 73 65 74 20 72 65 73 75 6c 74 20       set result 
4df0: 22 22 0d 0a 0d 0a 20 20 20 20 20 20 66 6f 72 65  ""....      fore
4e00: 61 63 68 20 76 61 72 4e 61 6d 65 20 24 76 61 72  ach varName $var
4e10: 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20 20  Names {..       
4e20: 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
4e30: 54 45 3a 20 42 75 69 6c 64 20 74 68 65 20 71 75  TE: Build the qu
4e40: 61 6c 69 66 69 65 64 20 67 6c 6f 62 61 6c 20 76  alified global v
4e50: 61 72 69 61 62 6c 65 20 6e 61 6d 65 2e 0d 0a 20  ariable name... 
4e60: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
4e70: 20 20 73 65 74 20 66 75 6c 6c 56 61 72 4e 61 6d    set fullVarNam
4e80: 65 20 5b 61 70 70 65 6e 64 41 72 67 73 20 3a 3a  e [appendArgs ::
4e90: 20 24 76 61 72 4e 61 6d 65 5d 0d 0a 0d 0a 20 20   $varName]....  
4ea0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
4eb0: 20 23 20 4e 4f 54 45 3a 20 44 6f 65 73 20 74 68   # NOTE: Does th
4ec0: 65 20 76 61 72 69 61 62 6c 65 20 65 78 69 73 74  e variable exist
4ed0: 20 69 6e 20 74 68 69 73 20 69 6e 74 65 72 70 72   in this interpr
4ee0: 65 74 65 72 20 63 6f 6e 74 65 78 74 3f 0d 0a 20  eter context?.. 
4ef0: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
4f00: 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73    if {[info exis
4f10: 74 73 20 24 66 75 6c 6c 56 61 72 4e 61 6d 65 5d  ts $fullVarName]
4f20: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
4f30: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
4f40: 20 23 20 4e 4f 54 45 3a 20 41 70 70 65 6e 64 20   # NOTE: Append 
4f50: 61 20 73 63 72 69 70 74 20 66 72 61 67 6d 65 6e  a script fragmen
4f60: 74 20 74 6f 20 74 68 65 20 72 65 73 75 6c 74 20  t to the result 
4f70: 74 68 61 74 20 77 69 6c 6c 20 63 6f 72 72 65 63  that will correc
4f80: 74 6c 79 0d 0a 20 20 20 20 20 20 20 20 20 20 23  tly..          #
4f90: 20 20 20 20 20 20 20 63 6f 70 79 20 61 6e 79 20         copy any 
4fa0: 63 6f 6e 74 61 69 6e 65 64 20 76 61 6c 75 65 20  contained value 
4fb0: 74 6f 20 61 6e 6f 74 68 65 72 20 69 6e 74 65 72  to another inter
4fc0: 70 72 65 74 65 72 20 63 6f 6e 74 65 78 74 2e 0d  preter context..
4fd0: 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
4fe0: 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 20 72          append r
4ff0: 65 73 75 6c 74 20 5c 6e 20 22 73 65 74 20 22 20  esult \n "set " 
5000: 24 66 75 6c 6c 56 61 72 4e 61 6d 65 20 22 20 5c  $fullVarName " \
5010: 7b 22 20 5b 73 65 74 20 24 66 75 6c 6c 56 61 72  {" [set $fullVar
5020: 4e 61 6d 65 5d 20 5c 7d 0d 0a 20 20 20 20 20 20  Name] \}..      
5030: 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a    }..      }....
5040: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
5050: 20 4e 4f 54 45 3a 20 49 66 20 74 68 65 20 72 65   NOTE: If the re
5060: 73 75 6c 74 20 63 6f 6e 74 61 69 6e 73 20 6f 6e  sult contains on
5070: 65 20 6f 72 20 6d 6f 72 65 20 73 63 72 69 70 74  e or more script
5080: 20 66 72 61 67 6d 65 6e 74 73 2c 20 61 70 70 65   fragments, appe
5090: 6e 64 20 61 0d 0a 20 20 20 20 20 20 23 20 20 20  nd a..      #   
50a0: 20 20 20 20 6e 65 77 6c 69 6e 65 2e 0d 0a 20 20      newline...  
50b0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20      #..      if 
50c0: 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20  {[string length 
50d0: 24 72 65 73 75 6c 74 5d 20 3e 20 30 7d 20 74 68  $result] > 0} th
50e0: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 61 70  en {..        ap
50f0: 70 65 6e 64 20 72 65 73 75 6c 74 20 5c 6e 0d 0a  pend result \n..
5100: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
5110: 20 72 65 74 75 72 6e 20 24 72 65 73 75 6c 74 0d   return $result.
5120: 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70  .    }.....    p
5130: 72 6f 63 20 67 65 74 41 70 70 44 6f 6d 61 69 6e  roc getAppDomain
5140: 50 72 65 61 6d 62 6c 65 20 7b 20 7b 70 72 65 66  Preamble { {pref
5150: 69 78 20 22 22 7d 20 7b 73 75 66 66 69 78 20 22  ix ""} {suffix "
5160: 22 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d  "} } {..      #.
5170: 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54  .      # NOTE: T
5180: 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 72 65  his procedure re
5190: 74 75 72 6e 73 20 61 20 74 65 73 74 20 73 65 74  turns a test set
51a0: 75 70 20 73 63 72 69 70 74 20 66 72 61 67 6d 65  up script fragme
51b0: 6e 74 20 73 75 69 74 61 62 6c 65 20 66 6f 72 0d  nt suitable for.
51c0: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 65  .      #       e
51d0: 76 61 6c 75 61 74 69 6f 6e 20 62 79 20 61 6e 20  valuation by an 
51e0: 69 6e 74 65 72 70 72 65 74 65 72 20 63 72 65 61  interpreter crea
51f0: 74 65 64 20 69 6e 20 61 6e 20 69 73 6f 6c 61 74  ted in an isolat
5200: 65 64 20 61 70 70 6c 69 63 61 74 69 6f 6e 0d 0a  ed application..
5210: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 64 6f        #       do
5220: 6d 61 69 6e 2e 20 20 54 68 65 20 73 63 72 69 70  main.  The scrip
5230: 74 20 66 72 61 67 6d 65 6e 74 20 62 65 69 6e 67  t fragment being
5240: 20 72 65 74 75 72 6e 65 64 20 77 69 6c 6c 20 62   returned will b
5250: 65 20 73 75 72 72 6f 75 6e 64 65 64 20 62 79 0d  e surrounded by.
5260: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74  .      #       t
5270: 68 65 20 70 72 65 66 69 78 20 61 6e 64 20 73 75  he prefix and su
5280: 66 66 69 78 20 22 73 63 72 69 70 74 20 66 72 61  ffix "script fra
5290: 67 6d 65 6e 74 73 22 20 73 70 65 63 69 66 69 65  gments" specifie
52a0: 64 20 62 79 20 6f 75 72 20 63 61 6c 6c 65 72 2c  d by our caller,
52b0: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
52c0: 69 66 20 61 6e 79 2e 20 20 54 68 65 20 65 6e 74  if any.  The ent
52d0: 69 72 65 20 73 63 72 69 70 74 20 62 65 69 6e 67  ire script being
52e0: 20 72 65 74 75 72 6e 65 64 20 77 69 6c 6c 20 62   returned will b
52f0: 65 20 73 75 62 73 74 69 74 75 74 65 64 20 76 69  e substituted vi
5300: 61 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  a..      #      
5310: 20 5b 73 75 62 73 74 5d 2c 20 69 6e 20 74 68 65   [subst], in the
5320: 20 63 6f 6e 74 65 78 74 20 6f 66 20 6f 75 72 20   context of our 
5330: 63 61 6c 6c 65 72 2c 20 62 65 66 6f 72 65 20 62  caller, before b
5340: 65 69 6e 67 20 72 65 74 75 72 6e 65 64 2e 0d 0a  eing returned...
5350: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 54 68        #       Th
5360: 69 73 20 73 74 65 70 20 69 73 20 6e 65 63 65 73  is step is neces
5370: 73 61 72 79 20 73 6f 20 74 68 61 74 20 73 6f 6d  sary so that som
5380: 65 20 6c 69 6d 69 74 65 64 20 63 6f 6e 74 65 78  e limited contex
5390: 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2c 0d 0a  t information,..
53a0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 70 72        #       pr
53b0: 69 6d 61 72 69 6c 79 20 72 65 6c 61 74 65 64 20  imarily related 
53c0: 74 6f 20 74 68 65 20 74 65 73 74 69 6e 67 20 64  to the testing d
53d0: 69 72 65 63 74 6f 72 69 65 73 2c 20 63 61 6e 20  irectories, can 
53e0: 62 65 20 74 72 61 6e 73 66 65 72 72 65 64 0d 0a  be transferred..
53f0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74 6f        #       to
5400: 20 74 68 65 20 69 6e 74 65 72 70 72 65 74 65 72   the interpreter
5410: 20 69 6e 20 74 68 65 20 69 73 6f 6c 61 74 65 64   in the isolated
5420: 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 64 6f 6d   application dom
5430: 61 69 6e 2c 20 6d 61 6b 69 6e 67 20 69 74 0d 0a  ain, making it..
5440: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 61 62        #       ab
5450: 6c 65 20 74 6f 20 73 75 63 63 65 73 73 66 75 6c  le to successful
5460: 6c 79 20 72 75 6e 20 74 65 73 74 73 20 74 68 61  ly run tests tha
5470: 74 20 72 65 71 75 69 72 65 20 6f 6e 65 20 6f 72  t require one or
5480: 20 6d 6f 72 65 20 6f 66 20 74 68 65 0d 0a 20 20   more of the..  
5490: 20 20 20 20 23 20 20 20 20 20 20 20 66 69 6c 65      #       file
54a0: 73 20 69 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20  s in one of the 
54b0: 74 65 73 74 69 6e 67 20 64 69 72 65 63 74 6f 72  testing director
54c0: 69 65 73 2e 20 20 43 61 6c 6c 65 72 73 20 73 68  ies.  Callers sh
54d0: 6f 75 6c 64 20 6b 65 65 70 20 69 6e 0d 0a 20 20  ould keep in..  
54e0: 20 20 20 20 23 20 20 20 20 20 20 20 6d 69 6e 64      #       mind
54f0: 20 74 68 61 74 20 74 68 65 20 74 65 73 74 20 73   that the test s
5500: 63 72 69 70 74 20 66 72 61 67 6d 65 6e 74 20 62  cript fragment b
5510: 65 69 6e 67 20 72 65 74 75 72 6e 65 64 20 63 61  eing returned ca
5520: 6e 6e 6f 74 20 72 65 6c 79 20 6f 6e 0d 0a 20 20  nnot rely on..  
5530: 20 20 20 20 23 20 20 20 20 20 20 20 61 6e 79 20      #       any 
5540: 73 63 72 69 70 74 20 6c 69 62 72 61 72 79 20 70  script library p
5550: 72 6f 63 65 64 75 72 65 73 20 74 68 61 74 20 61  rocedures that a
5560: 72 65 20 6e 6f 74 20 70 72 6f 76 69 64 65 64 20  re not provided 
5570: 62 79 20 74 68 65 20 45 61 67 6c 65 0d 0a 20 20  by the Eagle..  
5580: 20 20 20 20 23 20 20 20 20 20 20 20 6c 69 62 72      #       libr
5590: 61 72 79 20 70 61 63 6b 61 67 65 20 28 69 2e 65  ary package (i.e
55a0: 2e 20 22 69 6e 69 74 2e 65 61 67 6c 65 22 29 2c  . "init.eagle"),
55b0: 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 6f 73 65   including those
55c0: 20 70 72 6f 76 69 64 65 64 20 62 79 0d 0a 20 20   provided by..  
55d0: 20 20 20 20 23 20 20 20 20 20 20 20 74 68 65 20      #       the 
55e0: 45 61 67 6c 65 20 74 65 73 74 20 70 61 63 6b 61  Eagle test packa
55f0: 67 65 2c 20 75 6e 6c 65 73 73 20 74 68 65 20 66  ge, unless the f
5600: 69 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ile containing t
5610: 68 65 6d 20 69 73 20 6c 6f 61 64 65 64 0d 0a 20  hem is loaded.. 
5620: 20 20 20 20 20 23 20 20 20 20 20 20 20 6d 61 6e       #       man
5630: 75 61 6c 6c 79 20 76 69 61 20 73 6f 6d 65 20 6f  ually via some o
5640: 74 68 65 72 20 6d 65 63 68 61 6e 69 73 6d 20 28  ther mechanism (
5650: 65 2e 67 2e 20 62 79 20 69 6e 63 6c 75 64 69 6e  e.g. by includin
5660: 67 20 61 70 70 72 6f 70 72 69 61 74 65 0d 0a 20  g appropriate.. 
5670: 20 20 20 20 20 23 20 20 20 20 20 20 20 5b 70 61       #       [pa
5680: 63 6b 61 67 65 20 72 65 71 75 69 72 65 5d 20 6f  ckage require] o
5690: 72 20 5b 73 6f 75 72 63 65 5d 20 63 6f 6d 6d 61  r [source] comma
56a0: 6e 64 73 20 69 6e 20 74 68 65 20 70 72 65 66 69  nds in the prefi
56b0: 78 20 6f 72 20 73 75 66 66 69 78 0d 0a 20 20 20  x or suffix..   
56c0: 20 20 20 23 20 20 20 20 20 20 20 73 63 72 69 70     #       scrip
56d0: 74 20 66 72 61 67 6d 65 6e 74 73 29 2e 20 20 41  t fragments).  A
56e0: 6c 73 6f 2c 20 61 6c 6c 20 76 61 72 69 61 62 6c  lso, all variabl
56f0: 65 20 72 65 66 65 72 65 6e 63 65 73 20 61 6e 64  e references and
5700: 20 61 6c 6c 20 6e 65 73 74 65 64 0d 0a 20 20 20   all nested..   
5710: 20 20 20 23 20 20 20 20 20 20 20 63 6f 6d 6d 61     #       comma
5720: 6e 64 73 20 28 69 2e 65 2e 20 74 68 6f 73 65 20  nds (i.e. those 
5730: 69 6e 20 73 71 75 61 72 65 20 62 72 61 63 6b 65  in square bracke
5740: 74 73 29 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e  ts) contained in
5750: 20 74 68 65 20 66 69 6e 61 6c 0d 0a 20 20 20 20   the final..    
5760: 20 20 23 20 20 20 20 20 20 20 73 63 72 69 70 74    #       script
5770: 20 66 72 61 67 6d 65 6e 74 20 77 69 6c 6c 20 65   fragment will e
5780: 6e 64 20 75 70 20 62 65 69 6e 67 20 65 76 61 6c  nd up being eval
5790: 75 61 74 65 64 20 69 6e 20 74 68 65 20 63 6f 6e  uated in the con
57a0: 74 65 78 74 20 6f 66 20 74 68 65 0d 0a 20 20 20  text of the..   
57b0: 20 20 20 23 20 20 20 20 20 20 20 63 61 6c 6c 69     #       calli
57c0: 6e 67 20 69 6e 74 65 72 70 72 65 74 65 72 20 61  ng interpreter a
57d0: 6e 64 20 6e 6f 74 20 74 68 65 20 74 61 72 67 65  nd not the targe
57e0: 74 20 69 6e 74 65 72 70 72 65 74 65 72 20 63 72  t interpreter cr
57f0: 65 61 74 65 64 20 69 6e 20 74 68 65 0d 0a 20 20  eated in the..  
5800: 20 20 20 20 23 20 20 20 20 20 20 20 69 73 6f 6c      #       isol
5810: 61 74 65 64 20 61 70 70 6c 69 63 61 74 69 6f 6e  ated application
5820: 20 64 6f 6d 61 69 6e 20 75 6e 6c 65 73 73 20 74   domain unless t
5830: 68 65 20 64 6f 6c 6c 61 72 20 73 69 67 6e 73 20  he dollar signs 
5840: 61 6e 64 2f 6f 72 20 73 71 75 61 72 65 0d 0a 20  and/or square.. 
5850: 20 20 20 20 20 23 20 20 20 20 20 20 20 62 72 61       #       bra
5860: 63 6b 65 74 73 20 61 72 65 20 73 70 65 63 69 61  ckets are specia
5870: 6c 6c 79 20 71 75 6f 74 65 64 20 77 69 74 68 20  lly quoted with 
5880: 62 61 63 6b 73 6c 61 73 68 65 73 2e 0d 0a 20 20  backslashes...  
5890: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 72 65 74      #..      ret
58a0: 75 72 6e 20 5b 75 70 6c 65 76 65 6c 20 31 20 5b  urn [uplevel 1 [
58b0: 6c 69 73 74 20 73 75 62 73 74 20 5b 61 70 70 65  list subst [appe
58c0: 6e 64 41 72 67 73 20 24 70 72 65 66 69 78 20 7b  ndArgs $prefix {
58d0: 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 68  ..        if {[h
58e0: 61 73 52 75 6e 74 69 6d 65 4f 70 74 69 6f 6e 20  asRuntimeOption 
58f0: 6e 61 74 69 76 65 5d 7d 20 74 68 65 6e 20 7b 0d  native]} then {.
5900: 0a 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63  .          objec
5910: 74 20 69 6e 76 6f 6b 65 20 49 6e 74 65 72 70 72  t invoke Interpr
5920: 65 74 65 72 2e 47 65 74 41 63 74 69 76 65 20 41  eter.GetActive A
5930: 64 64 52 75 6e 74 69 6d 65 4f 70 74 69 6f 6e 20  ddRuntimeOption 
5940: 6e 61 74 69 76 65 0d 0a 20 20 20 20 20 20 20 20  native..        
5950: 7d 0d 0a 20 20 20 20 20 20 7d 20 5b 67 65 74 54  }..      } [getT
5960: 65 73 74 4f 76 65 72 72 69 64 65 73 50 72 65 61  estOverridesPrea
5970: 6d 62 6c 65 20 5b 6c 69 73 74 20 70 61 74 68 20  mble [list path 
5980: 74 65 73 74 5f 63 68 61 6e 6e 65 6c 5d 5d 20 24  test_channel]] $
5990: 73 75 66 66 69 78 5d 5d 5d 0d 0a 20 20 20 20 7d  suffix]]]..    }
59a0: 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 74 72  .....    proc tr
59b0: 79 43 6f 70 79 42 69 6e 61 72 79 46 69 6c 65 20  yCopyBinaryFile 
59c0: 7b 20 66 69 6c 65 4e 61 6d 65 20 7b 6e 65 77 46  { fileName {newF
59d0: 69 6c 65 4e 61 6d 65 20 22 22 7d 20 7d 20 7b 0d  ileName ""} } {.
59e0: 0a 20 20 20 20 20 20 73 65 74 20 73 6f 75 72 63  .      set sourc
59f0: 65 46 69 6c 65 4e 61 6d 65 20 5b 67 65 74 42 69  eFileName [getBi
5a00: 6e 61 72 79 46 69 6c 65 4e 61 6d 65 20 24 66 69  naryFileName $fi
5a10: 6c 65 4e 61 6d 65 5d 0d 0a 0d 0a 20 20 20 20 20  leName]....     
5a20: 20 69 66 20 7b 21 5b 66 69 6c 65 20 65 78 69 73   if {![file exis
5a30: 74 73 20 24 73 6f 75 72 63 65 46 69 6c 65 4e 61  ts $sourceFileNa
5a40: 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  me]} then {..   
5a50: 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
5a60: 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
5a70: 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
5a80: 20 20 20 20 20 20 22 2d 2d 2d 2d 20 73 6b 69 70        "---- skip
5a90: 70 65 64 20 63 6f 70 79 69 6e 67 20 62 69 6e 61  ped copying bina
5aa0: 72 79 20 66 69 6c 65 20 5c 22 22 20 24 73 6f 75  ry file \"" $sou
5ab0: 72 63 65 46 69 6c 65 4e 61 6d 65 20 5c 0d 0a 20  rceFileName \.. 
5ac0: 20 20 20 20 20 20 20 20 20 20 20 22 5c 22 2c 20             "\", 
5ad0: 69 74 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73  it does not exis
5ae0: 74 5c 6e 22 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  t\n"]....       
5af0: 20 72 65 74 75 72 6e 0d 0a 20 20 20 20 20 20 7d   return..      }
5b00: 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 73  ....      if {[s
5b10: 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 6e 65  tring length $ne
5b20: 77 46 69 6c 65 4e 61 6d 65 5d 20 3e 20 30 7d 20  wFileName] > 0} 
5b30: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
5b40: 73 65 74 20 74 61 72 67 65 74 46 69 6c 65 4e 61  set targetFileNa
5b50: 6d 65 20 5b 67 65 74 42 75 69 6c 64 46 69 6c 65  me [getBuildFile
5b60: 4e 61 6d 65 20 24 6e 65 77 46 69 6c 65 4e 61 6d  Name $newFileNam
5b70: 65 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65  e]..      } else
5b80: 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20   {..        set 
5b90: 74 61 72 67 65 74 46 69 6c 65 4e 61 6d 65 20 5b  targetFileName [
5ba0: 67 65 74 42 75 69 6c 64 46 69 6c 65 4e 61 6d 65  getBuildFileName
5bb0: 20 24 66 69 6c 65 4e 61 6d 65 5d 0d 0a 20 20 20   $fileName]..   
5bc0: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 69 66     }....      if
5bd0: 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20   {[catch {..    
5be0: 20 20 20 20 20 20 20 20 20 20 66 69 6c 65 20 63            file c
5bf0: 6f 70 79 20 2d 66 6f 72 63 65 20 24 73 6f 75 72  opy -force $sour
5c00: 63 65 46 69 6c 65 4e 61 6d 65 20 24 74 61 72 67  ceFileName $targ
5c10: 65 74 46 69 6c 65 4e 61 6d 65 7d 5d 20 3d 3d 20  etFileName}] == 
5c20: 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
5c30: 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
5c40: 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  _channel [append
5c50: 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
5c60: 20 20 20 20 22 2d 2d 2d 2d 20 63 6f 70 69 65 64      "---- copied
5c70: 20 62 69 6e 61 72 79 20 66 69 6c 65 20 66 72 6f   binary file fro
5c80: 6d 20 5c 22 22 20 24 73 6f 75 72 63 65 46 69 6c  m \"" $sourceFil
5c90: 65 4e 61 6d 65 20 22 5c 22 20 74 6f 20 5c 22 22  eName "\" to \""
5ca0: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
5cb0: 24 74 61 72 67 65 74 46 69 6c 65 4e 61 6d 65 20  $targetFileName 
5cc0: 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d 20 65  \"\n]..      } e
5cd0: 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 74  lse {..        t
5ce0: 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
5cf0: 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
5d00: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
5d10: 22 2d 2d 2d 2d 20 66 61 69 6c 65 64 20 74 6f 20  "---- failed to 
5d20: 63 6f 70 79 20 62 69 6e 61 72 79 20 66 69 6c 65  copy binary file
5d30: 20 66 72 6f 6d 20 5c 22 22 20 24 73 6f 75 72 63   from \"" $sourc
5d40: 65 46 69 6c 65 4e 61 6d 65 20 5c 0d 0a 20 20 20  eFileName \..   
5d50: 20 20 20 20 20 20 20 20 20 22 5c 22 20 74 6f 20           "\" to 
5d60: 5c 22 22 20 24 74 61 72 67 65 74 46 69 6c 65 4e  \"" $targetFileN
5d70: 61 6d 65 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20  ame \"\n]..     
5d80: 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20   }..    }.....  
5d90: 20 20 70 72 6f 63 20 74 72 79 43 6f 70 79 42 75    proc tryCopyBu
5da0: 69 6c 64 46 69 6c 65 20 7b 20 66 69 6c 65 4e 61  ildFile { fileNa
5db0: 6d 65 20 7b 6e 65 77 46 69 6c 65 4e 61 6d 65 20  me {newFileName 
5dc0: 22 22 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 73  ""} } {..      s
5dd0: 65 74 20 73 6f 75 72 63 65 46 69 6c 65 4e 61 6d  et sourceFileNam
5de0: 65 20 5b 67 65 74 42 75 69 6c 64 46 69 6c 65 4e  e [getBuildFileN
5df0: 61 6d 65 20 24 66 69 6c 65 4e 61 6d 65 5d 0d 0a  ame $fileName]..
5e00: 0d 0a 20 20 20 20 20 20 69 66 20 7b 21 5b 66 69  ..      if {![fi
5e10: 6c 65 20 65 78 69 73 74 73 20 24 73 6f 75 72 63  le exists $sourc
5e20: 65 46 69 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e  eFileName]} then
5e30: 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74   {..        tput
5e40: 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
5e50: 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
5e60: 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d  .            "--
5e70: 2d 2d 20 73 6b 69 70 70 65 64 20 63 6f 70 79 69  -- skipped copyi
5e80: 6e 67 20 62 75 69 6c 64 20 66 69 6c 65 20 5c 22  ng build file \"
5e90: 22 20 24 73 6f 75 72 63 65 46 69 6c 65 4e 61 6d  " $sourceFileNam
5ea0: 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e \..           
5eb0: 20 22 5c 22 2c 20 69 74 20 64 6f 65 73 20 6e 6f   "\", it does no
5ec0: 74 20 65 78 69 73 74 5c 6e 22 5d 0d 0a 0d 0a 20  t exist\n"].... 
5ed0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 0d 0a 20         return.. 
5ee0: 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
5ef0: 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67  if {[string leng
5f00: 74 68 20 24 6e 65 77 46 69 6c 65 4e 61 6d 65 5d  th $newFileName]
5f10: 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20   > 0} then {..  
5f20: 20 20 20 20 20 20 73 65 74 20 74 61 72 67 65 74        set target
5f30: 46 69 6c 65 4e 61 6d 65 20 5b 67 65 74 42 69 6e  FileName [getBin
5f40: 61 72 79 46 69 6c 65 4e 61 6d 65 20 24 6e 65 77  aryFileName $new
5f50: 46 69 6c 65 4e 61 6d 65 5d 0d 0a 20 20 20 20 20  FileName]..     
5f60: 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
5f70: 20 20 20 73 65 74 20 74 61 72 67 65 74 46 69 6c     set targetFil
5f80: 65 4e 61 6d 65 20 5b 67 65 74 42 69 6e 61 72 79  eName [getBinary
5f90: 46 69 6c 65 4e 61 6d 65 20 24 66 69 6c 65 4e 61  FileName $fileNa
5fa0: 6d 65 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a  me]..      }....
5fb0: 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68        if {[catch
5fc0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
5fd0: 20 20 66 69 6c 65 20 63 6f 70 79 20 2d 66 6f 72    file copy -for
5fe0: 63 65 20 24 73 6f 75 72 63 65 46 69 6c 65 4e 61  ce $sourceFileNa
5ff0: 6d 65 20 24 74 61 72 67 65 74 46 69 6c 65 4e 61  me $targetFileNa
6000: 6d 65 7d 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20  me}] == 0} then 
6010: 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73  {..        tputs
6020: 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
6030: 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
6040: 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
6050: 2d 20 63 6f 70 69 65 64 20 62 75 69 6c 64 20 66  - copied build f
6060: 69 6c 65 20 66 72 6f 6d 20 5c 22 22 20 24 73 6f  ile from \"" $so
6070: 75 72 63 65 46 69 6c 65 4e 61 6d 65 20 22 5c 22  urceFileName "\"
6080: 20 74 6f 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20   to \"" \..     
6090: 20 20 20 20 20 20 20 24 74 61 72 67 65 74 46 69         $targetFi
60a0: 6c 65 4e 61 6d 65 20 5c 22 5c 6e 5d 0d 0a 20 20  leName \"\n]..  
60b0: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
60c0: 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
60d0: 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70  est_channel [app
60e0: 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
60f0: 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 66 61 69         "---- fai
6100: 6c 65 64 20 74 6f 20 63 6f 70 79 20 62 75 69 6c  led to copy buil
6110: 64 20 66 69 6c 65 20 66 72 6f 6d 20 5c 22 22 20  d file from \"" 
6120: 24 73 6f 75 72 63 65 46 69 6c 65 4e 61 6d 65 20  $sourceFileName 
6130: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22  \..            "
6140: 5c 22 20 74 6f 20 5c 22 22 20 24 74 61 72 67 65  \" to \"" $targe
6150: 74 46 69 6c 65 4e 61 6d 65 20 5c 22 5c 6e 5d 0d  tFileName \"\n].
6160: 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d  .      }..    }.
6170: 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 74 72 79  ....    proc try
6180: 44 65 6c 65 74 65 42 69 6e 61 72 79 46 69 6c 65  DeleteBinaryFile
6190: 20 7b 20 66 69 6c 65 4e 61 6d 65 20 7d 20 7b 0d   { fileName } {.
61a0: 0a 20 20 20 20 20 20 73 65 74 20 66 69 6c 65 4e  .      set fileN
61b0: 61 6d 65 20 5b 67 65 74 42 69 6e 61 72 79 46 69  ame [getBinaryFi
61c0: 6c 65 4e 61 6d 65 20 24 66 69 6c 65 4e 61 6d 65  leName $fileName
61d0: 5d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 21  ]....      if {!
61e0: 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24 66 69  [file exists $fi
61f0: 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d  leName]} then {.
6200: 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24  .        tputs $
6210: 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b  ::test_channel [
6220: 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
6230: 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
6240: 73 6b 69 70 70 65 64 20 64 65 6c 65 74 69 6e 67  skipped deleting
6250: 20 62 69 6e 61 72 79 20 66 69 6c 65 20 5c 22 22   binary file \""
6260: 20 24 66 69 6c 65 4e 61 6d 65 20 5c 0d 0a 20 20   $fileName \..  
6270: 20 20 20 20 20 20 20 20 20 20 22 5c 22 2c 20 69            "\", i
6280: 74 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74  t does not exist
6290: 5c 6e 22 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  \n"]....        
62a0: 72 65 74 75 72 6e 0d 0a 20 20 20 20 20 20 7d 0d  return..      }.
62b0: 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 63 61  ...      if {[ca
62c0: 74 63 68 20 7b 66 69 6c 65 20 64 65 6c 65 74 65  tch {file delete
62d0: 20 24 66 69 6c 65 4e 61 6d 65 7d 5d 20 3d 3d 20   $fileName}] == 
62e0: 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
62f0: 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
6300: 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  _channel [append
6310: 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
6320: 20 20 20 20 22 2d 2d 2d 2d 20 64 65 6c 65 74 65      "---- delete
6330: 64 20 62 69 6e 61 72 79 20 66 69 6c 65 20 5c 22  d binary file \"
6340: 22 20 24 66 69 6c 65 4e 61 6d 65 20 5c 22 5c 6e  " $fileName \"\n
6350: 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20  ]..      } else 
6360: 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73  {..        tputs
6370: 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
6380: 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
6390: 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
63a0: 2d 20 66 61 69 6c 65 64 20 74 6f 20 64 65 6c 65  - failed to dele
63b0: 74 65 20 62 69 6e 61 72 79 20 66 69 6c 65 20 5c  te binary file \
63c0: 22 22 20 24 66 69 6c 65 4e 61 6d 65 20 5c 22 5c  "" $fileName \"\
63d0: 6e 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20  n]..      }..   
63e0: 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
63f0: 74 72 79 44 65 6c 65 74 65 42 75 69 6c 64 46 69  tryDeleteBuildFi
6400: 6c 65 20 7b 20 66 69 6c 65 4e 61 6d 65 20 7d 20  le { fileName } 
6410: 7b 0d 0a 20 20 20 20 20 20 73 65 74 20 66 69 6c  {..      set fil
6420: 65 4e 61 6d 65 20 5b 67 65 74 42 75 69 6c 64 46  eName [getBuildF
6430: 69 6c 65 4e 61 6d 65 20 24 66 69 6c 65 4e 61 6d  ileName $fileNam
6440: 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b  e]....      if {
6450: 21 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24 66  ![file exists $f
6460: 69 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b  ileName]} then {
6470: 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20  ..        tputs 
6480: 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
6490: 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
64a0: 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
64b0: 20 73 6b 69 70 70 65 64 20 64 65 6c 65 74 69 6e   skipped deletin
64c0: 67 20 62 75 69 6c 64 20 66 69 6c 65 20 5c 22 22  g build file \""
64d0: 20 24 66 69 6c 65 4e 61 6d 65 20 5c 0d 0a 20 20   $fileName \..  
64e0: 20 20 20 20 20 20 20 20 20 20 22 5c 22 2c 20 69            "\", i
64f0: 74 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74  t does not exist
6500: 5c 6e 22 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  \n"]....        
6510: 72 65 74 75 72 6e 0d 0a 20 20 20 20 20 20 7d 0d  return..      }.
6520: 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 63 61  ...      if {[ca
6530: 74 63 68 20 7b 66 69 6c 65 20 64 65 6c 65 74 65  tch {file delete
6540: 20 24 66 69 6c 65 4e 61 6d 65 7d 5d 20 3d 3d 20   $fileName}] == 
6550: 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
6560: 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
6570: 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  _channel [append
6580: 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
6590: 20 20 20 20 22 2d 2d 2d 2d 20 64 65 6c 65 74 65      "---- delete
65a0: 64 20 62 75 69 6c 64 20 66 69 6c 65 20 5c 22 22  d build file \""
65b0: 20 24 66 69 6c 65 4e 61 6d 65 20 5c 22 5c 6e 5d   $fileName \"\n]
65c0: 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b  ..      } else {
65d0: 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20  ..        tputs 
65e0: 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
65f0: 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
6600: 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
6610: 20 66 61 69 6c 65 64 20 74 6f 20 64 65 6c 65 74   failed to delet
6620: 65 20 62 75 69 6c 64 20 66 69 6c 65 20 5c 22 22  e build file \""
6630: 20 24 66 69 6c 65 4e 61 6d 65 20 5c 22 5c 6e 5d   $fileName \"\n]
6640: 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d  ..      }..    }
6650: 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 74 72  .....    proc tr
6660: 79 43 6f 70 79 41 73 73 65 6d 62 6c 79 20 7b 20  yCopyAssembly { 
6670: 66 69 6c 65 4e 61 6d 65 20 7b 70 64 62 20 74 72  fileName {pdb tr
6680: 75 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 74  ue} } {..      t
6690: 72 79 43 6f 70 79 42 75 69 6c 64 46 69 6c 65 20  ryCopyBuildFile 
66a0: 24 66 69 6c 65 4e 61 6d 65 0d 0a 0d 0a 20 20 20  $fileName....   
66b0: 20 20 20 69 66 20 7b 24 70 64 62 7d 20 74 68 65     if {$pdb} the
66c0: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 72 79  n {..        try
66d0: 43 6f 70 79 42 75 69 6c 64 46 69 6c 65 20 5b 61  CopyBuildFile [a
66e0: 70 70 65 6e 64 41 72 67 73 20 5b 66 69 6c 65 20  ppendArgs [file 
66f0: 72 6f 6f 74 6e 61 6d 65 20 24 66 69 6c 65 4e 61  rootname $fileNa
6700: 6d 65 5d 20 2e 70 64 62 5d 0d 0a 20 20 20 20 20  me] .pdb]..     
6710: 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20   }..    }.....  
6720: 20 20 70 72 6f 63 20 74 72 79 44 65 6c 65 74 65    proc tryDelete
6730: 41 73 73 65 6d 62 6c 79 20 7b 20 66 69 6c 65 4e  Assembly { fileN
6740: 61 6d 65 20 7b 70 64 62 20 74 72 75 65 7d 20 7d  ame {pdb true} }
6750: 20 7b 0d 0a 20 20 20 20 20 20 74 72 79 44 65 6c   {..      tryDel
6760: 65 74 65 42 69 6e 61 72 79 46 69 6c 65 20 24 66  eteBinaryFile $f
6770: 69 6c 65 4e 61 6d 65 0d 0a 0d 0a 20 20 20 20 20  ileName....     
6780: 20 69 66 20 7b 24 70 64 62 7d 20 74 68 65 6e 20   if {$pdb} then 
6790: 7b 0d 0a 20 20 20 20 20 20 20 20 74 72 79 44 65  {..        tryDe
67a0: 6c 65 74 65 42 69 6e 61 72 79 46 69 6c 65 20 5b  leteBinaryFile [
67b0: 61 70 70 65 6e 64 41 72 67 73 20 5b 66 69 6c 65  appendArgs [file
67c0: 20 72 6f 6f 74 6e 61 6d 65 20 24 66 69 6c 65 4e   rootname $fileN
67d0: 61 6d 65 5d 20 2e 70 64 62 5d 0d 0a 20 20 20 20  ame] .pdb]..    
67e0: 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20    }..    }..... 
67f0: 20 20 20 70 72 6f 63 20 74 72 79 4c 6f 61 64 41     proc tryLoadA
6800: 73 73 65 6d 62 6c 79 20 7b 20 66 69 6c 65 4e 61  ssembly { fileNa
6810: 6d 65 20 7d 20 7b 0d 0a 20 20 20 20 20 20 73 65  me } {..      se
6820: 74 20 66 69 6c 65 4e 61 6d 65 20 5b 67 65 74 42  t fileName [getB
6830: 69 6e 61 72 79 46 69 6c 65 4e 61 6d 65 20 24 66  inaryFileName $f
6840: 69 6c 65 4e 61 6d 65 5d 0d 0a 0d 0a 20 20 20 20  ileName]....    
6850: 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 73 65    if {[catch {se
6860: 74 20 61 73 73 65 6d 62 6c 79 20 5c 0d 0a 20 20  t assembly \..  
6870: 20 20 20 20 20 20 20 20 20 20 20 20 5b 6f 62 6a              [obj
6880: 65 63 74 20 6c 6f 61 64 20 2d 6c 6f 61 64 74 79  ect load -loadty
6890: 70 65 20 46 69 6c 65 20 2d 61 6c 69 61 73 20 24  pe File -alias $
68a0: 66 69 6c 65 4e 61 6d 65 5d 7d 5d 20 3d 3d 20 30  fileName]}] == 0
68b0: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
68c0: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
68d0: 4f 54 45 3a 20 4e 6f 77 2c 20 61 64 64 20 74 68  OTE: Now, add th
68e0: 65 20 6e 65 63 65 73 73 61 72 79 20 74 65 73 74  e necessary test
68f0: 20 63 6f 6e 73 74 72 61 69 6e 74 2e 0d 0a 20 20   constraint...  
6900: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
6910: 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 5b   addConstraint [
6920: 66 69 6c 65 20 72 6f 6f 74 6e 61 6d 65 20 5b 66  file rootname [f
6930: 69 6c 65 20 74 61 69 6c 20 24 66 69 6c 65 4e 61  ile tail $fileNa
6940: 6d 65 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  me]]....        
6950: 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
6960: 45 3a 20 47 72 61 62 20 74 68 65 20 69 6d 61 67  E: Grab the imag
6970: 65 20 72 75 6e 74 69 6d 65 20 76 65 72 73 69 6f  e runtime versio
6980: 6e 20 66 72 6f 6d 20 74 68 65 20 61 73 73 65 6d  n from the assem
6990: 62 6c 79 20 62 65 63 61 75 73 65 0d 0a 20 20 20  bly because..   
69a0: 20 20 20 20 20 23 20 20 20 20 20 20 20 73 65 76       #       sev
69b0: 65 72 61 6c 20 74 65 73 74 73 20 72 65 6c 79 20  eral tests rely 
69c0: 6f 6e 20 69 74 20 68 61 76 69 6e 67 20 61 20 63  on it having a c
69d0: 65 72 74 61 69 6e 20 76 61 6c 75 65 2e 0d 0a 20  ertain value... 
69e0: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
69f0: 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20    addConstraint 
6a00: 5b 61 70 70 65 6e 64 41 72 67 73 20 5b 66 69 6c  [appendArgs [fil
6a10: 65 20 74 61 69 6c 20 24 66 69 6c 65 4e 61 6d 65  e tail $fileName
6a20: 5d 20 5f 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ] _ \..         
6a30: 20 20 20 5b 24 61 73 73 65 6d 62 6c 79 20 49 6d     [$assembly Im
6a40: 61 67 65 52 75 6e 74 69 6d 65 56 65 72 73 69 6f  ageRuntimeVersio
6a50: 6e 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23  n]]....        #
6a60: 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
6a70: 3a 20 52 65 74 75 72 6e 20 74 68 65 20 66 75 6c  : Return the ful
6a80: 6c 20 70 61 74 68 20 6f 66 20 74 68 65 20 6c 6f  l path of the lo
6a90: 61 64 65 64 20 66 69 6c 65 2e 0d 0a 20 20 20 20  aded file...    
6aa0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72      #..        r
6ab0: 65 74 75 72 6e 20 24 66 69 6c 65 4e 61 6d 65 0d  eturn $fileName.
6ac0: 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
6ad0: 20 20 72 65 74 75 72 6e 20 22 22 0d 0a 20 20 20    return ""..   
6ae0: 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
6af0: 69 73 53 51 4c 69 74 65 52 65 61 64 79 20 7b 7d  isSQLiteReady {}
6b00: 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20   {..      #..   
6b10: 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 69 73 20     # NOTE: This 
6b20: 70 72 6f 63 65 64 75 72 65 20 6d 75 73 74 20 72  procedure must r
6b30: 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 6f  eturn non-zero o
6b40: 6e 6c 79 20 69 66 20 74 68 65 20 53 51 4c 69 74  nly if the SQLit
6b50: 65 20 6e 61 74 69 76 65 0d 0a 20 20 20 20 20 20  e native..      
6b60: 23 20 20 20 20 20 20 20 6c 69 62 72 61 72 79 20  #       library 
6b70: 61 6e 64 20 74 68 65 20 53 79 73 74 65 6d 2e 44  and the System.D
6b80: 61 74 61 2e 53 51 4c 69 74 65 20 6d 61 6e 61 67  ata.SQLite manag
6b90: 65 64 20 61 73 73 65 6d 62 6c 79 20 61 72 65 20  ed assembly are 
6ba0: 6c 6f 61 64 65 64 0d 0a 20 20 20 20 20 20 23 20  loaded..      # 
6bb0: 20 20 20 20 20 20 61 6e 64 20 72 65 61 64 79 20        and ready 
6bc0: 66 6f 72 20 75 73 65 20 62 79 20 74 68 65 20 74  for use by the t
6bd0: 65 73 74 20 73 75 69 74 65 2e 20 20 43 75 72 72  est suite.  Curr
6be0: 65 6e 74 6c 79 2c 20 74 68 69 73 20 70 72 6f 63  ently, this proc
6bf0: 65 64 75 72 65 0d 0a 20 20 20 20 20 20 23 20 20  edure..      #  
6c00: 20 20 20 20 20 73 68 6f 75 6c 64 20 62 65 20 63       should be c
6c10: 61 6c 6c 65 64 20 6f 6e 6c 79 20 61 66 74 65 72  alled only after
6c20: 20 74 68 65 20 5b 74 72 79 4c 6f 61 64 41 73 73   the [tryLoadAss
6c30: 65 6d 62 6c 79 5d 20 70 72 6f 63 65 64 75 72 65  embly] procedure
6c40: 20 68 61 73 0d 0a 20 20 20 20 20 20 23 20 20 20   has..      #   
6c50: 20 20 20 20 62 65 65 6e 20 63 61 6c 6c 65 64 20      been called 
6c60: 74 6f 20 70 72 6f 62 65 20 66 6f 72 20 74 68 65  to probe for the
6c70: 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c   System.Data.SQL
6c80: 69 74 65 20 6d 61 6e 61 67 65 64 20 61 73 73 65  ite managed asse
6c90: 6d 62 6c 79 0d 0a 20 20 20 20 20 20 23 20 20 20  mbly..      #   
6ca0: 20 20 20 20 61 6e 64 20 74 68 65 20 5b 63 68 65      and the [che
6cb0: 63 6b 46 6f 72 53 51 4c 69 74 65 5d 20 70 72 6f  ckForSQLite] pro
6cc0: 63 65 64 75 72 65 20 68 61 73 20 62 65 65 6e 20  cedure has been 
6cd0: 63 61 6c 6c 65 64 20 74 6f 20 70 72 6f 62 65 20  called to probe 
6ce0: 66 6f 72 0d 0a 20 20 20 20 20 20 23 20 20 20 20  for..      #    
6cf0: 20 20 20 74 68 65 20 53 51 4c 69 74 65 20 6e 61     the SQLite na
6d00: 74 69 76 65 20 6c 69 62 72 61 72 79 3b 20 6f 74  tive library; ot
6d10: 68 65 72 77 69 73 65 2c 20 74 68 69 73 20 70 72  herwise, this pr
6d20: 6f 63 65 64 75 72 65 20 77 69 6c 6c 20 73 69 6d  ocedure will sim
6d30: 70 6c 79 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ply..      #    
6d40: 20 20 20 61 6c 77 61 79 73 20 72 65 74 75 72 6e     always return
6d50: 20 7a 65 72 6f 2e 0d 0a 20 20 20 20 20 20 23 0d   zero...      #.
6d60: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b 65  .      return [e
6d70: 78 70 72 20 7b 5b 68 61 76 65 43 6f 6e 73 74 72  xpr {[haveConstr
6d80: 61 69 6e 74 20 53 79 73 74 65 6d 2e 44 61 74 61  aint System.Data
6d90: 2e 53 51 4c 69 74 65 5d 20 26 26 20 5c 0d 0a 20  .SQLite] && \.. 
6da0: 20 20 20 20 20 20 20 20 20 5b 68 61 76 65 43 6f           [haveCo
6db0: 6e 73 74 72 61 69 6e 74 20 53 51 4c 69 74 65 5d  nstraint SQLite]
6dc0: 7d 5d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20  }]..    }.....  
6dd0: 20 20 70 72 6f 63 20 63 68 65 63 6b 46 6f 72 53    proc checkForS
6de0: 51 4c 69 74 65 42 75 69 6c 64 73 20 7b 20 63 68  QLiteBuilds { ch
6df0: 61 6e 6e 65 6c 20 7d 20 7b 0d 0a 20 20 20 20 20  annel } {..     
6e00: 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
6e10: 3a 20 43 68 65 63 6b 20 66 6f 72 20 65 76 65 72  : Check for ever
6e20: 79 20 70 6f 73 73 69 62 6c 65 20 76 61 6c 69 64  y possible valid
6e30: 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 20   combination of 
6e40: 76 61 6c 75 65 73 20 75 73 65 64 20 77 68 65 6e  values used when
6e50: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
6e60: 6c 6f 63 61 74 69 6e 67 20 6f 75 74 20 74 68 65  locating out the
6e70: 20 62 75 69 6c 64 20 6f 75 74 70 75 74 20 64 69   build output di
6e80: 72 65 63 74 6f 72 79 2c 20 73 68 6f 77 69 6e 67  rectory, showing
6e90: 20 65 61 63 68 20 61 76 61 69 6c 61 62 6c 65 0d   each available.
6ea0: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 62  .      #       b
6eb0: 75 69 6c 64 20 76 61 72 69 61 74 69 6f 6e 20 61  uild variation a
6ec0: 6c 6f 6e 67 20 74 68 65 20 77 61 79 2e 0d 0a 20  long the way... 
6ed0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 66 6f       #..      fo
6ee0: 72 65 61 63 68 20 6e 61 74 69 76 65 20 5b 6c 69  reach native [li
6ef0: 73 74 20 66 61 6c 73 65 20 74 72 75 65 5d 20 7b  st false true] {
6f00: 0d 0a 20 20 20 20 20 20 20 20 66 6f 72 65 61 63  ..        foreac
6f10: 68 20 79 65 61 72 20 5b 67 65 74 42 75 69 6c 64  h year [getBuild
6f20: 59 65 61 72 73 5d 20 7b 0d 0a 20 20 20 20 20 20  Years] {..      
6f30: 20 20 20 20 66 6f 72 65 61 63 68 20 63 6f 6e 66      foreach conf
6f40: 69 67 75 72 61 74 69 6f 6e 20 5b 67 65 74 42 75  iguration [getBu
6f50: 69 6c 64 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e  ildConfiguration
6f60: 73 5d 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  s] {..          
6f70: 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
6f80: 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
6f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6fa0: 22 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e 67 20 66  "---- checking f
6fb0: 6f 72 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53  or System.Data.S
6fc0: 51 4c 69 74 65 20 62 75 69 6c 64 20 5c 22 22 20  QLite build \"" 
6fd0: 5b 65 78 70 72 20 5c 0d 0a 20 20 20 20 20 20 20  [expr \..       
6fe0: 20 20 20 20 20 20 20 20 20 7b 24 6e 61 74 69 76           {$nativ
6ff0: 65 20 3f 20 22 6e 61 74 69 76 65 2f 22 20 3a 20  e ? "native/" : 
7000: 22 22 7d 5d 20 24 79 65 61 72 20 2f 20 24 63 6f  ""}] $year / $co
7010: 6e 66 69 67 75 72 61 74 69 6f 6e 20 22 5c 22 2e  nfiguration "\".
7020: 2e 2e 20 22 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  .. "]....       
7030: 20 20 20 20 20 73 65 74 20 66 69 6c 65 4e 61 6d       set fileNam
7040: 65 20 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e 61  e [file nativena
7050: 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5b 6a  me [file join [j
7060: 6f 69 6e 42 75 69 6c 64 44 69 72 65 63 74 6f 72  oinBuildDirector
7070: 79 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  y \..           
7080: 20 20 20 20 20 24 6e 61 74 69 76 65 20 5b 67 65       $native [ge
7090: 74 42 75 69 6c 64 42 61 73 65 44 69 72 65 63 74  tBuildBaseDirect
70a0: 6f 72 79 5d 20 24 79 65 61 72 20 5b 67 65 74 42  ory] $year [getB
70b0: 75 69 6c 64 50 6c 61 74 66 6f 72 6d 20 5c 0d 0a  uildPlatform \..
70c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
70d0: 24 6e 61 74 69 76 65 5d 20 24 63 6f 6e 66 69 67  $native] $config
70e0: 75 72 61 74 69 6f 6e 5d 20 53 79 73 74 65 6d 2e  uration] System.
70f0: 44 61 74 61 2e 53 51 4c 69 74 65 2e 64 6c 6c 5d  Data.SQLite.dll]
7100: 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ]....           
7110: 20 69 66 20 7b 5b 66 69 6c 65 20 65 78 69 73 74   if {[file exist
7120: 73 20 24 66 69 6c 65 4e 61 6d 65 5d 7d 20 74 68  s $fileName]} th
7130: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
7140: 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
7150: 65 6c 20 79 65 73 5c 6e 0d 0a 20 20 20 20 20 20  el yes\n..      
7160: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
7170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 70                tp
7180: 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 6e 6f 5c  uts $channel no\
7190: 6e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  n..            }
71a0: 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20  ..          }.. 
71b0: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
71c0: 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  }..    }.....   
71d0: 20 70 72 6f 63 20 63 68 65 63 6b 46 6f 72 53 51   proc checkForSQ
71e0: 4c 69 74 65 20 7b 20 63 68 61 6e 6e 65 6c 20 7d  Lite { channel }
71f0: 20 7b 0d 0a 20 20 20 20 20 20 74 70 75 74 73 20   {..      tputs 
7200: 24 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 63  $channel "---- c
7210: 68 65 63 6b 69 6e 67 20 66 6f 72 20 63 6f 72 65  hecking for core
7220: 20 53 51 4c 69 74 65 20 6c 69 62 72 61 72 79 2e   SQLite library.
7230: 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 20 20 69 66  .. "....      if
7240: 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20   {[catch {..    
7250: 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74            object
7260: 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b   invoke -flags +
7270: 4e 6f 6e 50 75 62 6c 69 63 20 53 79 73 74 65 6d  NonPublic System
7280: 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 53 51 4c  .Data.SQLite.SQL
7290: 69 74 65 33 20 5c 0d 0a 20 20 20 20 20 20 20 20  ite3 \..        
72a0: 20 20 20 20 20 20 53 51 4c 69 74 65 56 65 72 73        SQLiteVers
72b0: 69 6f 6e 7d 20 76 65 72 73 69 6f 6e 5d 20 3d 3d  ion} version] ==
72c0: 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
72d0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
72e0: 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74 20 74   NOTE: Attempt t
72f0: 6f 20 71 75 65 72 79 20 74 68 65 20 46 6f 73 73  o query the Foss
7300: 69 6c 20 73 6f 75 72 63 65 20 69 64 65 6e 74 69  il source identi
7310: 66 69 65 72 20 66 6f 72 20 74 68 65 20 53 51 4c  fier for the SQL
7320: 69 74 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20  ite..        #  
7330: 20 20 20 20 20 63 6f 72 65 20 6c 69 62 72 61 72       core librar
7340: 79 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  y...        #.. 
7350: 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63         if {[catc
7360: 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  h {..           
7370: 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f       object invo
7380: 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75  ke -flags +NonPu
7390: 62 6c 69 63 20 53 79 73 74 65 6d 2e 44 61 74 61  blic System.Data
73a0: 2e 53 51 4c 69 74 65 2e 53 51 4c 69 74 65 33 20  .SQLite.SQLite3 
73b0: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
73c0: 20 20 20 53 51 4c 69 74 65 53 6f 75 72 63 65 49     SQLiteSourceI
73d0: 64 7d 20 73 6f 75 72 63 65 49 64 5d 7d 20 74 68  d} sourceId]} th
73e0: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
73f0: 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e  #..          # N
7400: 4f 54 45 3a 20 57 65 20 66 61 69 6c 65 64 20 74  OTE: We failed t
7410: 6f 20 71 75 65 72 79 20 74 68 65 20 46 6f 73 73  o query the Foss
7420: 69 6c 20 73 6f 75 72 63 65 20 69 64 65 6e 74 69  il source identi
7430: 66 69 65 72 2e 0d 0a 20 20 20 20 20 20 20 20 20  fier...         
7440: 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65   #..          se
7450: 74 20 73 6f 75 72 63 65 49 64 20 75 6e 6b 6e 6f  t sourceId unkno
7460: 77 6e 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d  wn..        }...
7470: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
7480: 20 20 20 20 23 20 4e 4f 54 45 3a 20 59 65 73 2c      # NOTE: Yes,
7490: 20 74 68 65 20 53 51 4c 69 74 65 20 63 6f 72 65   the SQLite core
74a0: 20 6c 69 62 72 61 72 79 20 61 70 70 65 61 72 73   library appears
74b0: 20 74 6f 20 62 65 20 61 76 61 69 6c 61 62 6c 65   to be available
74c0: 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
74d0: 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61        addConstra
74e0: 69 6e 74 20 53 51 4c 69 74 65 0d 0a 0d 0a 20 20  int SQLite....  
74f0: 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
7500: 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
7510: 20 22 79 65 73 20 28 22 20 24 76 65 72 73 69 6f   "yes (" $versio
7520: 6e 20 22 20 22 20 24 73 6f 75 72 63 65 49 64 20  n " " $sourceId 
7530: 22 29 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 7d 20  ")\n"]..      } 
7540: 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
7550: 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 6e  tputs $channel n
7560: 6f 5c 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20  o\n..      }..  
7570: 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
7580: 20 63 68 65 63 6b 46 6f 72 53 51 4c 69 74 65 44   checkForSQLiteD
7590: 65 66 69 6e 65 43 6f 6e 73 74 61 6e 74 20 7b 20  efineConstant { 
75a0: 63 68 61 6e 6e 65 6c 20 6e 61 6d 65 20 7d 20 7b  channel name } {
75b0: 0d 0a 20 20 20 20 20 20 74 70 75 74 73 20 24 63  ..      tputs $c
75c0: 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
75d0: 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
75e0: 22 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e 67 20 66  "---- checking f
75f0: 6f 72 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53  or System.Data.S
7600: 51 4c 69 74 65 20 64 65 66 69 6e 65 20 63 6f 6e  QLite define con
7610: 73 74 61 6e 74 20 5c 22 22 20 24 6e 61 6d 65 20  stant \"" $name 
7620: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 22 5c 22  \..          "\"
7630: 2e 2e 2e 20 22 5d 0d 0a 0d 0a 20 20 20 20 20 20  ... "]....      
7640: 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20  if {[catch {..  
7650: 20 20 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65              obje
7660: 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73  ct invoke -flags
7670: 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 53 79 73 74   +NonPublic Syst
7680: 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 53  em.Data.SQLite.S
7690: 51 4c 69 74 65 33 20 5c 0d 0a 20 20 20 20 20 20  QLite3 \..      
76a0: 20 20 20 20 20 20 20 20 44 65 66 69 6e 65 43 6f          DefineCo
76b0: 6e 73 74 61 6e 74 73 7d 20 64 65 66 69 6e 65 43  nstants} defineC
76c0: 6f 6e 73 74 61 6e 74 73 5d 20 3d 3d 20 30 7d 20  onstants] == 0} 
76d0: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
76e0: 69 66 20 7b 5b 6c 73 65 61 72 63 68 20 2d 65 78  if {[lsearch -ex
76f0: 61 63 74 20 2d 6e 6f 63 61 73 65 20 24 64 65 66  act -nocase $def
7700: 69 6e 65 43 6f 6e 73 74 61 6e 74 73 20 24 6e 61  ineConstants $na
7710: 6d 65 5d 20 21 3d 20 2d 31 7d 20 74 68 65 6e 20  me] != -1} then 
7720: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a  {..          #..
7730: 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45            # NOTE
7740: 3a 20 59 65 73 2c 20 74 68 69 73 20 64 65 66 69  : Yes, this defi
7750: 6e 65 20 63 6f 6e 73 74 61 6e 74 20 77 61 73 20  ne constant was 
7760: 65 6e 61 62 6c 65 64 20 77 68 65 6e 20 74 68 65  enabled when the
7770: 20 6d 61 6e 61 67 65 64 0d 0a 20 20 20 20 20 20   managed..      
7780: 20 20 20 20 23 20 20 20 20 20 20 20 61 73 73 65      #       asse
7790: 6d 62 6c 79 20 77 61 73 20 63 6f 6d 70 69 6c 65  mbly was compile
77a0: 64 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d  d...          #.
77b0: 0a 20 20 20 20 20 20 20 20 20 20 61 64 64 43 6f  .          addCo
77c0: 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64  nstraint [append
77d0: 41 72 67 73 20 64 65 66 69 6e 65 43 6f 6e 73 74  Args defineConst
77e0: 61 6e 74 2e 53 79 73 74 65 6d 2e 44 61 74 61 2e  ant.System.Data.
77f0: 53 51 4c 69 74 65 2e 20 24 6e 61 6d 65 5d 0d 0a  SQLite. $name]..
7800: 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70 75 74  ..          tput
7810: 73 20 24 63 68 61 6e 6e 65 6c 20 79 65 73 5c 6e  s $channel yes\n
7820: 0d 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65  ..        } else
7830: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70   {..          tp
7840: 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 6e 6f 5c  uts $channel no\
7850: 6e 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  n..        }..  
7860: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
7870: 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
7880: 6e 6e 65 6c 20 65 72 72 6f 72 5c 6e 0d 0a 20 20  nnel error\n..  
7890: 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d      }..    }....
78a0: 0a 20 20 20 20 70 72 6f 63 20 67 65 74 44 61 74  .    proc getDat
78b0: 65 54 69 6d 65 46 6f 72 6d 61 74 20 7b 7d 20 7b  eTimeFormat {} {
78c0: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
78d0: 20 23 20 4e 4f 54 45 3a 20 54 68 69 73 20 70 72   # NOTE: This pr
78e0: 6f 63 65 64 75 72 65 20 73 69 6d 70 6c 79 20 72  ocedure simply r
78f0: 65 74 75 72 6e 73 20 74 68 65 20 22 64 65 66 61  eturns the "defa
7900: 75 6c 74 22 20 44 61 74 65 54 69 6d 65 20 66 6f  ult" DateTime fo
7910: 72 6d 61 74 20 75 73 65 64 0d 0a 20 20 20 20 20  rmat used..     
7920: 20 23 20 20 20 20 20 20 20 62 79 20 74 68 65 20   #       by the 
7930: 74 65 73 74 20 73 75 69 74 65 2e 0d 0a 20 20 20  test suite...   
7940: 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
7950: 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 64  [info exists ::d
7960: 61 74 65 74 69 6d 65 5f 66 6f 72 6d 61 74 5d 20  atetime_format] 
7970: 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  && \..          
7980: 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
7990: 3a 3a 64 61 74 65 74 69 6d 65 5f 66 6f 72 6d 61  ::datetime_forma
79a0: 74 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  t] > 0} then {..
79b0: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
79c0: 20 20 20 23 20 4e 4f 54 45 3a 20 52 65 74 75 72     # NOTE: Retur
79d0: 6e 20 74 68 65 20 6d 61 6e 75 61 6c 6c 79 20 6f  n the manually o
79e0: 76 65 72 72 69 64 64 65 6e 20 76 61 6c 75 65 20  verridden value 
79f0: 66 6f 72 20 74 68 65 20 44 61 74 65 54 69 6d 65  for the DateTime
7a00: 20 66 6f 72 6d 61 74 2e 0d 0a 20 20 20 20 20 20   format...      
7a10: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74    #..        ret
7a20: 75 72 6e 20 24 3a 3a 64 61 74 65 74 69 6d 65 5f  urn $::datetime_
7a30: 66 6f 72 6d 61 74 0d 0a 20 20 20 20 20 20 7d 20  format..      } 
7a40: 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
7a50: 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
7a60: 45 3a 20 52 65 74 75 72 6e 20 61 6e 20 49 53 4f  E: Return an ISO
7a70: 38 36 30 31 20 44 61 74 65 54 69 6d 65 20 66 6f  8601 DateTime fo
7a80: 72 6d 61 74 20 63 6f 6d 70 61 74 69 62 6c 65 20  rmat compatible 
7a90: 77 69 74 68 20 53 51 4c 69 74 65 2c 0d 0a 20 20  with SQLite,..  
7aa0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 53 79        #       Sy
7ab0: 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
7ac0: 2c 20 61 6e 64 20 73 75 69 74 61 62 6c 65 20 66  , and suitable f
7ad0: 6f 72 20 72 6f 75 6e 64 2d 74 72 69 70 70 69 6e  or round-trippin
7ae0: 67 20 77 69 74 68 20 74 68 65 0d 0a 20 20 20 20  g with the..    
7af0: 20 20 20 20 23 20 20 20 20 20 20 20 44 61 74 65      #       Date
7b00: 54 69 6d 65 20 63 6c 61 73 73 20 6f 66 20 74 68  Time class of th
7b10: 65 20 66 72 61 6d 65 77 6f 72 6b 2e 20 20 49 66  e framework.  If
7b20: 20 74 68 69 73 20 76 61 6c 75 65 20 69 73 20 63   this value is c
7b30: 68 61 6e 67 65 64 2c 0d 0a 20 20 20 20 20 20 20  hanged,..       
7b40: 20 23 20 20 20 20 20 20 20 76 61 72 69 6f 75 73   #       various
7b50: 20 74 65 73 74 73 20 6d 61 79 20 66 61 69 6c 2e   tests may fail.
7b60: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
7b70: 20 20 20 20 20 72 65 74 75 72 6e 20 22 79 79 79       return "yyy
7b80: 79 2d 4d 4d 2d 64 64 20 48 48 3a 6d 6d 3a 73 73  y-MM-dd HH:mm:ss
7b90: 2e 46 46 46 46 46 46 46 4b 22 0d 0a 20 20 20 20  .FFFFFFFK"..    
7ba0: 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20    }..    }..... 
7bb0: 20 20 20 70 72 6f 63 20 65 6e 75 6d 65 72 61 62     proc enumerab
7bc0: 6c 65 54 6f 4c 69 73 74 20 7b 20 65 6e 75 6d 65  leToList { enume
7bd0: 72 61 62 6c 65 20 7d 20 7b 0d 0a 20 20 20 20 20  rable } {..     
7be0: 20 73 65 74 20 72 65 73 75 6c 74 20 5b 6c 69 73   set result [lis
7bf0: 74 5d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b  t]....      if {
7c00: 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
7c10: 65 6e 75 6d 65 72 61 62 6c 65 5d 20 3d 3d 20 30  enumerable] == 0
7c20: 20 7c 7c 20 24 65 6e 75 6d 65 72 61 62 6c 65 20   || $enumerable 
7c30: 65 71 20 22 6e 75 6c 6c 22 7d 20 74 68 65 6e 20  eq "null"} then 
7c40: 7b 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  {..        retur
7c50: 6e 20 24 72 65 73 75 6c 74 0d 0a 20 20 20 20 20  n $result..     
7c60: 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 6f 62 6a 65   }....      obje
7c70: 63 74 20 66 6f 72 65 61 63 68 20 2d 61 6c 69 61  ct foreach -alia
7c80: 73 20 69 74 65 6d 20 24 65 6e 75 6d 65 72 61 62  s item $enumerab
7c90: 6c 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66  le {..        if
7ca0: 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68   {[string length
7cb0: 20 24 69 74 65 6d 5d 20 3e 20 30 7d 20 74 68 65   $item] > 0} the
7cc0: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 6c  n {..          l
7cd0: 61 70 70 65 6e 64 20 72 65 73 75 6c 74 20 5b 24  append result [$
7ce0: 69 74 65 6d 20 54 6f 53 74 72 69 6e 67 5d 0d 0a  item ToString]..
7cf0: 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
7d00: 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65 74 75   }....      retu
7d10: 72 6e 20 24 72 65 73 75 6c 74 0d 0a 20 20 20 20  rn $result..    
7d20: 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 63  }.....    proc c
7d30: 61 74 63 68 41 6e 64 52 65 74 75 72 6e 20 7b 20  atchAndReturn { 
7d40: 73 63 72 69 70 74 20 7b 73 74 61 63 6b 54 72 61  script {stackTra
7d50: 63 65 20 66 61 6c 73 65 7d 20 7b 73 74 72 69 63  ce false} {stric
7d60: 74 20 74 72 75 65 7d 20 7d 20 7b 0d 0a 20 20 20  t true} } {..   
7d70: 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
7d80: 54 45 3a 20 45 76 61 6c 75 61 74 65 20 74 68 65  TE: Evaluate the
7d90: 20 73 63 72 69 70 74 20 70 72 6f 76 69 64 65 64   script provided
7da0: 20 62 79 20 6f 75 72 20 63 61 6c 6c 65 72 20 69   by our caller i
7db0: 6e 20 74 68 65 69 72 20 63 6f 6e 74 65 78 74 2c  n their context,
7dc0: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
7dd0: 63 61 70 74 75 72 69 6e 67 20 62 6f 74 68 20 74  capturing both t
7de0: 68 65 20 72 65 73 75 6c 74 20 61 6e 64 20 74 68  he result and th
7df0: 65 20 72 65 74 75 72 6e 20 63 6f 64 65 2e 0d 0a  e return code...
7e00: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 73        #..      s
7e10: 65 74 20 63 6f 64 65 20 5b 63 61 74 63 68 20 7b  et code [catch {
7e20: 75 70 6c 65 76 65 6c 20 31 20 24 73 63 72 69 70  uplevel 1 $scrip
7e30: 74 7d 20 72 65 73 75 6c 74 5d 0d 0a 0d 0a 20 20  t} result]....  
7e40: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
7e50: 4f 54 45 3a 20 44 69 64 20 74 68 65 20 73 63 72  OTE: Did the scr
7e60: 69 70 74 20 70 72 6f 76 69 64 65 64 20 62 79 20  ipt provided by 
7e70: 6f 75 72 20 63 61 6c 6c 65 72 20 4e 4f 54 20 72  our caller NOT r
7e80: 61 69 73 65 20 61 6e 20 65 72 72 6f 72 3f 0d 0a  aise an error?..
7e90: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69        #..      i
7ea0: 66 20 7b 24 73 74 72 69 63 74 20 26 26 20 24 63  f {$strict && $c
7eb0: 6f 64 65 20 3d 3d 20 30 20 7c 7c 20 21 24 73 74  ode == 0 || !$st
7ec0: 72 69 63 74 20 26 26 20 24 63 6f 64 65 20 21 3d  rict && $code !=
7ed0: 20 31 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   1} then {..    
7ee0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
7ef0: 20 4e 4f 54 45 3a 20 53 75 63 63 65 73 73 2e 20   NOTE: Success. 
7f00: 20 52 65 74 75 72 6e 20 61 20 6c 69 73 74 20 77   Return a list w
7f10: 69 74 68 20 74 68 65 20 72 65 74 75 72 6e 20 63  ith the return c
7f20: 6f 64 65 20 61 6e 64 20 74 68 65 20 72 65 73 75  ode and the resu
7f30: 6c 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  lt...        #..
7f40: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b          return [
7f50: 6c 69 73 74 20 24 63 6f 64 65 20 24 72 65 73 75  list $code $resu
7f60: 6c 74 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73  lt]..      } els
7f70: 65 69 66 20 7b 24 73 74 61 63 6b 54 72 61 63 65  eif {$stackTrace
7f80: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
7f90: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
7fa0: 4f 54 45 3a 20 46 61 69 6c 75 72 65 2e 20 20 4f  OTE: Failure.  O
7fb0: 75 72 20 63 61 6c 6c 65 72 20 77 61 6e 74 73 20  ur caller wants 
7fc0: 61 20 66 75 6c 6c 20 73 74 61 63 6b 20 74 72 61  a full stack tra
7fd0: 63 65 20 28 69 66 20 61 70 70 6c 69 63 61 62 6c  ce (if applicabl
7fe0: 65 29 2c 0d 0a 20 20 20 20 20 20 20 20 23 20 20  e),..        #  
7ff0: 20 20 20 20 20 72 65 74 75 72 6e 20 61 20 6c 69       return a li
8000: 73 74 20 77 69 74 68 20 74 68 65 20 72 65 74 75  st with the retu
8010: 72 6e 20 63 6f 64 65 20 61 6e 64 20 74 68 65 20  rn code and the 
8020: 72 65 73 75 6c 74 20 76 65 72 62 61 74 69 6d 2e  result verbatim.
8030: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
8040: 20 20 20 20 20 72 65 74 75 72 6e 20 5b 6c 69 73       return [lis
8050: 74 20 24 63 6f 64 65 20 24 72 65 73 75 6c 74 5d  t $code $result]
8060: 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b  ..      } else {
8070: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
8080: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 46 61 69       # NOTE: Fai
8090: 6c 75 72 65 2e 20 20 4f 75 72 20 63 61 6c 6c 65  lure.  Our calle
80a0: 72 20 64 6f 65 73 20 6e 6f 74 20 77 61 6e 74 20  r does not want 
80b0: 61 20 66 75 6c 6c 20 73 74 61 63 6b 20 74 72 61  a full stack tra
80c0: 63 65 20 28 69 66 0d 0a 20 20 20 20 20 20 20 20  ce (if..        
80d0: 23 20 20 20 20 20 20 20 61 70 70 6c 69 63 61 62  #       applicab
80e0: 6c 65 29 2c 20 72 65 74 75 72 6e 20 61 20 6c 69  le), return a li
80f0: 73 74 20 77 69 74 68 20 74 68 65 20 72 65 74 75  st with the retu
8100: 72 6e 20 63 6f 64 65 2c 20 74 68 65 20 65 72 72  rn code, the err
8110: 6f 72 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  or..        #   
8120: 20 20 20 20 63 6f 64 65 20 66 6f 72 20 74 68 65      code for the
8130: 20 69 6e 74 65 72 70 72 65 74 65 72 2c 20 61 6e   interpreter, an
8140: 64 20 74 68 65 20 65 72 72 6f 72 20 6d 65 73 73  d the error mess
8150: 61 67 65 20 75 70 20 74 6f 20 74 68 65 0d 0a 20  age up to the.. 
8160: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 70         #       p
8170: 6f 69 6e 74 20 77 68 65 72 65 20 74 68 65 20 73  oint where the s
8180: 74 61 63 6b 20 74 72 61 63 65 20 73 68 6f 75 6c  tack trace shoul
8190: 64 20 73 74 61 72 74 2e 0d 0a 20 20 20 20 20 20  d start...      
81a0: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 73 65 74    #..        set
81b0: 20 69 6e 64 65 78 20 5b 73 74 72 69 6e 67 20 66   index [string f
81c0: 69 72 73 74 20 22 20 20 20 61 74 20 22 20 24 72  irst "   at " $r
81d0: 65 73 75 6c 74 5d 3b 20 23 20 48 41 43 4b 3a 20  esult]; # HACK: 
81e0: 52 65 6c 69 61 62 6c 65 3f 0d 0a 0d 0a 20 20 20  Reliable?....   
81f0: 20 20 20 20 20 72 65 74 75 72 6e 20 5b 6c 69 73       return [lis
8200: 74 20 24 63 6f 64 65 20 24 3a 3a 65 72 72 6f 72  t $code $::error
8210: 43 6f 64 65 20 5b 65 78 70 72 20 7b 24 69 6e 64  Code [expr {$ind
8220: 65 78 20 21 3d 20 2d 31 20 3f 20 5c 0d 0a 20 20  ex != -1 ? \..  
8230: 20 20 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e            [strin
8240: 67 20 74 72 69 6d 20 5b 73 74 72 69 6e 67 20 72  g trim [string r
8250: 61 6e 67 65 20 24 72 65 73 75 6c 74 20 30 20 24  ange $result 0 $
8260: 69 6e 64 65 78 5d 5d 20 3a 20 24 72 65 73 75 6c  index]] : $resul
8270: 74 7d 5d 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20  t}]]..      }.. 
8280: 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
8290: 63 20 63 6f 6d 70 69 6c 65 43 53 68 61 72 70 57  c compileCSharpW
82a0: 69 74 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  ith {..         
82b0: 20 20 20 74 65 78 74 20 6d 65 6d 6f 72 79 20 73     text memory s
82c0: 79 6d 62 6f 6c 73 20 73 74 72 69 63 74 20 72 65  ymbols strict re
82d0: 73 75 6c 74 73 56 61 72 4e 61 6d 65 20 65 72 72  sultsVarName err
82e0: 6f 72 73 56 61 72 4e 61 6d 65 20 66 69 6c 65 4e  orsVarName fileN
82f0: 61 6d 65 73 0d 0a 20 20 20 20 20 20 20 20 20 20  ames..          
8300: 20 20 61 72 67 73 20 7d 20 7b 0d 0a 20 20 20 20    args } {..    
8310: 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
8320: 45 3a 20 53 69 6e 63 65 20 77 65 20 61 72 65 20  E: Since we are 
8330: 67 6f 69 6e 67 20 74 6f 20 75 73 65 20 74 68 69  going to use thi
8340: 73 20 6d 65 74 68 6f 64 20 6e 61 6d 65 20 61 20  s method name a 
8350: 6c 6f 74 2c 20 61 73 73 69 67 6e 20 69 74 20 74  lot, assign it t
8360: 6f 20 61 0d 0a 20 20 20 20 20 20 23 20 20 20 20  o a..      #    
8370: 20 20 20 76 61 72 69 61 62 6c 65 20 66 69 72 73     variable firs
8380: 74 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  t...      #..   
8390: 20 20 20 73 65 74 20 61 64 64 20 52 65 66 65 72     set add Refer
83a0: 65 6e 63 65 64 41 73 73 65 6d 62 6c 69 65 73 2e  encedAssemblies.
83b0: 41 64 64 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a  Add....      #..
83c0: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 72        # NOTE: Cr
83d0: 65 61 74 65 20 74 68 65 20 62 61 73 65 20 63 6f  eate the base co
83e0: 6d 6d 61 6e 64 20 74 6f 20 65 76 61 6c 75 61 74  mmand to evaluat
83f0: 65 20 61 6e 64 20 61 64 64 20 74 68 65 20 70 72  e and add the pr
8400: 6f 70 65 72 74 79 20 73 65 74 74 69 6e 67 73 0d  operty settings.
8410: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74  .      #       t
8420: 68 61 74 20 61 72 65 20 61 6c 6d 6f 73 74 20 61  hat are almost a
8430: 6c 77 61 79 73 20 6e 65 65 64 65 64 20 62 79 20  lways needed by 
8440: 6f 75 72 20 75 6e 69 74 20 74 65 73 74 73 20 28  our unit tests (
8450: 69 2e 65 2e 20 74 68 65 20 53 79 73 74 65 6d 0d  i.e. the System.
8460: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 61  .      #       a
8470: 6e 64 20 53 79 73 74 65 6d 2e 44 61 74 61 20 61  nd System.Data a
8480: 73 73 65 6d 62 6c 79 20 72 65 66 65 72 65 6e 63  ssembly referenc
8490: 65 73 29 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  es)...      #.. 
84a0: 20 20 20 20 20 73 65 74 20 63 6f 6d 6d 61 6e 64       set command
84b0: 20 5b 6c 69 73 74 20 63 6f 6d 70 69 6c 65 43 53   [list compileCS
84c0: 68 61 72 70 20 24 74 65 78 74 20 24 6d 65 6d 6f  harp $text $memo
84d0: 72 79 20 24 73 79 6d 62 6f 6c 73 20 24 73 74 72  ry $symbols $str
84e0: 69 63 74 20 72 65 73 75 6c 74 73 20 5c 0d 0a 20  ict results \.. 
84f0: 20 20 20 20 20 20 20 20 20 65 72 72 6f 72 73 20           errors 
8500: 24 61 64 64 20 53 79 73 74 65 6d 2e 64 6c 6c 20  $add System.dll 
8510: 24 61 64 64 20 53 79 73 74 65 6d 2e 44 61 74 61  $add System.Data
8520: 2e 64 6c 6c 20 24 61 64 64 20 53 79 73 74 65 6d  .dll $add System
8530: 2e 58 6d 6c 2e 64 6c 6c 5d 0d 0a 0d 0a 20 20 20  .Xml.dll]....   
8540: 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
8550: 54 45 3a 20 41 64 64 20 61 6c 6c 20 74 68 65 20  TE: Add all the 
8560: 70 72 6f 76 69 64 65 64 20 66 69 6c 65 20 6e 61  provided file na
8570: 6d 65 73 20 61 73 20 61 73 73 65 6d 62 6c 79 20  mes as assembly 
8580: 72 65 66 65 72 65 6e 63 65 73 2e 0d 0a 20 20 20  references...   
8590: 20 20 20 23 0d 0a 20 20 20 20 20 20 66 6f 72 65     #..      fore
85a0: 61 63 68 20 66 69 6c 65 4e 61 6d 65 20 24 66 69  ach fileName $fi
85b0: 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20  leNames {..     
85c0: 20 20 20 6c 61 70 70 65 6e 64 20 63 6f 6d 6d 61     lappend comma
85d0: 6e 64 20 24 61 64 64 20 5b 67 65 74 42 69 6e 61  nd $add [getBina
85e0: 72 79 46 69 6c 65 4e 61 6d 65 20 24 66 69 6c 65  ryFileName $file
85f0: 4e 61 6d 65 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a  Name]..      }..
8600: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
8610: 20 23 20 4e 4f 54 45 3a 20 41 64 64 20 74 68 65   # NOTE: Add the
8620: 20 65 78 74 72 61 20 61 72 67 75 6d 65 6e 74 73   extra arguments
8630: 2c 20 69 66 20 61 6e 79 2c 20 74 6f 20 74 68 65  , if any, to the
8640: 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 76 61 6c   command to eval
8650: 75 61 74 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  uate...      #..
8660: 20 20 20 20 20 20 65 76 61 6c 20 6c 61 70 70 65        eval lappe
8670: 6e 64 20 63 6f 6d 6d 61 6e 64 20 24 61 72 67 73  nd command $args
8680: 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  ....      #..   
8690: 20 20 20 23 20 4e 4f 54 45 3a 20 41 6c 69 61 73     # NOTE: Alias
86a0: 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 20 6c 6f   the compiler lo
86b0: 63 61 6c 20 72 65 73 75 6c 74 73 20 61 6e 64 20  cal results and 
86c0: 65 72 72 6f 72 73 20 76 61 72 69 61 62 6c 65 73  errors variables
86d0: 20 74 6f 20 74 68 65 0d 0a 20 20 20 20 20 20 23   to the..      #
86e0: 20 20 20 20 20 20 20 76 61 72 69 61 62 6c 65 20         variable 
86f0: 6e 61 6d 65 73 20 70 72 6f 76 69 64 65 64 20 62  names provided b
8700: 79 20 6f 75 72 20 63 61 6c 6c 65 72 2e 0d 0a 20  y our caller... 
8710: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 75 70       #..      up
8720: 76 61 72 20 31 20 24 72 65 73 75 6c 74 73 56 61  var 1 $resultsVa
8730: 72 4e 61 6d 65 20 72 65 73 75 6c 74 73 0d 0a 20  rName results.. 
8740: 20 20 20 20 20 75 70 76 61 72 20 31 20 24 65 72       upvar 1 $er
8750: 72 6f 72 73 56 61 72 4e 61 6d 65 20 65 72 72 6f  rorsVarName erro
8760: 72 73 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20  rs....      #.. 
8770: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 45 76 61       # NOTE: Eva
8780: 6c 75 61 74 65 20 74 68 65 20 63 6f 6e 73 74 72  luate the constr
8790: 75 63 74 65 64 20 5b 63 6f 6d 70 69 6c 65 43 53  ucted [compileCS
87a0: 68 61 72 70 5d 20 63 6f 6d 6d 61 6e 64 20 61 6e  harp] command an
87b0: 64 20 72 65 74 75 72 6e 20 74 68 65 0d 0a 20 20  d return the..  
87c0: 20 20 20 20 23 20 20 20 20 20 20 20 72 65 73 75      #       resu
87d0: 6c 74 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  lt...      #..  
87e0: 20 20 20 20 65 76 61 6c 20 24 63 6f 6d 6d 61 6e      eval $comman
87f0: 64 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  d..    }.....   
8800: 20 70 72 6f 63 20 69 73 4d 65 6d 6f 72 79 44 62   proc isMemoryDb
8810: 20 7b 20 66 69 6c 65 4e 61 6d 65 20 7d 20 7b 0d   { fileName } {.
8820: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
8830: 23 20 4e 4f 54 45 3a 20 49 73 20 74 68 65 20 73  # NOTE: Is the s
8840: 70 65 63 69 66 69 65 64 20 64 61 74 61 62 61 73  pecified databas
8850: 65 20 66 69 6c 65 20 6e 61 6d 65 20 72 65 61 6c  e file name real
8860: 6c 79 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  ly an in-memory 
8870: 64 61 74 61 62 61 73 65 3f 0d 0a 20 20 20 20 20  database?..     
8880: 20 23 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e   #..      return
8890: 20 5b 65 78 70 72 20 7b 24 66 69 6c 65 4e 61 6d   [expr {$fileNam
88a0: 65 20 65 71 20 22 3a 6d 65 6d 6f 72 79 3a 22 20  e eq ":memory:" 
88b0: 7c 7c 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  || \..          
88c0: 5b 73 74 72 69 6e 67 20 72 61 6e 67 65 20 24 66  [string range $f
88d0: 69 6c 65 4e 61 6d 65 20 30 20 31 32 5d 20 65 71  ileName 0 12] eq
88e0: 20 22 66 69 6c 65 3a 3a 6d 65 6d 6f 72 79 3a 22   "file::memory:"
88f0: 7d 5d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20  }]..    }.....  
8900: 20 20 70 72 6f 63 20 65 78 65 63 75 74 65 53 71    proc executeSq
8910: 6c 20 7b 20 73 71 6c 20 7b 65 78 65 63 75 74 65  l { sql {execute
8920: 20 6e 6f 6e 65 7d 20 7b 66 69 6c 65 4e 61 6d 65   none} {fileName
8930: 20 22 22 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20   ""} } {..      
8940: 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67  if {[string leng
8950: 74 68 20 24 66 69 6c 65 4e 61 6d 65 5d 20 3d 3d  th $fileName] ==
8960: 20 30 7d 20 74 68 65 6e 20 7b 73 65 74 20 66 69   0} then {set fi
8970: 6c 65 4e 61 6d 65 20 3a 6d 65 6d 6f 72 79 3a 7d  leName :memory:}
8980: 0d 0a 20 20 20 20 20 20 73 65 74 75 70 44 62 20  ..      setupDb 
8990: 24 66 69 6c 65 4e 61 6d 65 20 22 22 20 22 22 20  $fileName "" "" 
89a0: 22 22 20 22 22 20 22 22 20 66 61 6c 73 65 20 66  "" "" "" false f
89b0: 61 6c 73 65 20 66 61 6c 73 65 20 66 61 6c 73 65  alse false false
89c0: 20 6d 65 6d 44 62 0d 0a 0d 0a 20 20 20 20 20 20   memDb....      
89d0: 74 72 79 20 7b 0d 0a 20 20 20 20 20 20 20 20 72  try {..        r
89e0: 65 74 75 72 6e 20 5b 73 71 6c 20 65 78 65 63 75  eturn [sql execu
89f0: 74 65 20 2d 65 78 65 63 75 74 65 20 24 65 78 65  te -execute $exe
8a00: 63 75 74 65 20 24 6d 65 6d 44 62 20 24 73 71 6c  cute $memDb $sql
8a10: 5d 0d 0a 20 20 20 20 20 20 7d 20 66 69 6e 61 6c  ]..      } final
8a20: 6c 79 20 7b 0d 0a 20 20 20 20 20 20 20 20 63 6c  ly {..        cl
8a30: 65 61 6e 75 70 44 62 20 24 66 69 6c 65 4e 61 6d  eanupDb $fileNam
8a40: 65 20 6d 65 6d 44 62 20 66 61 6c 73 65 20 66 61  e memDb false fa
8a50: 6c 73 65 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20  lse..      }..  
8a60: 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
8a70: 20 73 65 74 75 70 44 62 20 7b 0d 0a 20 20 20 20   setupDb {..    
8a80: 20 20 20 20 20 20 20 20 66 69 6c 65 4e 61 6d 65          fileName
8a90: 20 7b 6d 6f 64 65 20 22 22 7d 20 7b 64 61 74 65   {mode ""} {date
8aa0: 54 69 6d 65 46 6f 72 6d 61 74 20 22 22 7d 20 7b  TimeFormat ""} {
8ab0: 64 61 74 65 54 69 6d 65 4b 69 6e 64 20 22 22 7d  dateTimeKind ""}
8ac0: 20 7b 66 6c 61 67 73 20 22 22 7d 0d 0a 20 20 20   {flags ""}..   
8ad0: 20 20 20 20 20 20 20 20 20 7b 65 78 74 72 61 20           {extra 
8ae0: 22 22 7d 20 7b 71 75 61 6c 69 66 79 20 74 72 75  ""} {qualify tru
8af0: 65 7d 20 7b 64 65 6c 65 74 65 20 74 72 75 65 7d  e} {delete true}
8b00: 20 7b 75 72 69 20 66 61 6c 73 65 7d 0d 0a 20 20   {uri false}..  
8b10: 20 20 20 20 20 20 20 20 20 20 7b 74 65 6d 70 6f            {tempo
8b20: 72 61 72 79 20 74 72 75 65 7d 20 7b 76 61 72 4e  rary true} {varN
8b30: 61 6d 65 20 64 62 7d 20 7d 20 7b 0d 0a 20 20 20  ame db} } {..   
8b40: 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
8b50: 54 45 3a 20 46 69 72 73 74 2c 20 73 65 65 20 69  TE: First, see i
8b60: 66 20 6f 75 72 20 63 61 6c 6c 65 72 20 68 61 73  f our caller has
8b70: 20 72 65 71 75 65 73 74 65 64 20 61 6e 20 69 6e   requested an in
8b80: 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
8b90: 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
8ba0: 20 20 73 65 74 20 69 73 4d 65 6d 6f 72 79 20 5b    set isMemory [
8bb0: 69 73 4d 65 6d 6f 72 79 44 62 20 24 66 69 6c 65  isMemoryDb $file
8bc0: 4e 61 6d 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 23  Name]....      #
8bd0: 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
8be0: 46 6f 72 20 6e 6f 77 2c 20 61 6c 6c 20 74 65 73  For now, all tes
8bf0: 74 20 64 61 74 61 62 61 73 65 73 20 75 73 65 64  t databases used
8c00: 20 62 79 20 74 68 65 20 74 65 73 74 20 73 75 69   by the test sui
8c10: 74 65 20 61 72 65 20 70 6c 61 63 65 64 0d 0a 20  te are placed.. 
8c20: 20 20 20 20 20 23 20 20 20 20 20 20 20 69 6e 74       #       int
8c30: 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 64  o the database d
8c40: 69 72 65 63 74 6f 72 79 2e 20 20 45 61 63 68 20  irectory.  Each 
8c50: 64 61 74 61 62 61 73 65 20 61 6e 64 20 72 65 6c  database and rel
8c60: 61 74 65 64 20 66 69 6c 65 73 0d 0a 20 20 20 20  ated files..    
8c70: 20 20 23 20 20 20 20 20 20 20 75 73 65 64 20 62    #       used b
8c80: 79 20 61 20 74 65 73 74 20 73 68 6f 75 6c 64 20  y a test should 
8c90: 62 65 20 63 6c 65 61 6e 65 64 20 75 70 20 62 79  be cleaned up by
8ca0: 20 74 68 61 74 20 74 65 73 74 20 75 73 69 6e 67   that test using
8cb0: 20 74 68 65 0d 0a 20 20 20 20 20 20 23 20 20 20   the..      #   
8cc0: 20 20 20 20 22 63 6c 65 61 6e 75 70 44 62 22 20      "cleanupDb" 
8cd0: 70 72 6f 63 65 64 75 72 65 2c 20 62 65 6c 6f 77  procedure, below
8ce0: 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
8cf0: 20 20 69 66 20 7b 21 24 69 73 4d 65 6d 6f 72 79    if {!$isMemory
8d00: 20 26 26 20 24 71 75 61 6c 69 66 79 7d 20 74 68   && $qualify} th
8d10: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 65  en {..        se
8d20: 74 20 66 69 6c 65 4e 61 6d 65 20 5b 66 69 6c 65  t fileName [file
8d30: 20 6a 6f 69 6e 20 5b 67 65 74 44 61 74 61 62 61   join [getDataba
8d40: 73 65 44 69 72 65 63 74 6f 72 79 5d 20 5b 66 69  seDirectory] [fi
8d50: 6c 65 20 74 61 69 6c 20 24 66 69 6c 65 4e 61 6d  le tail $fileNam
8d60: 65 5d 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a  e]]..      }....
8d70: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
8d80: 20 4e 4f 54 45 3a 20 42 79 20 64 65 66 61 75 6c   NOTE: By defaul
8d90: 74 2c 20 64 65 6c 65 74 65 20 61 6e 79 20 70 72  t, delete any pr
8da0: 65 2d 65 78 69 73 74 69 6e 67 20 64 61 74 61 62  e-existing datab
8db0: 61 73 65 20 77 69 74 68 20 74 68 65 20 73 61 6d  ase with the sam
8dc0: 65 20 66 69 6c 65 0d 0a 20 20 20 20 20 20 23 20  e file..      # 
8dd0: 20 20 20 20 20 20 6e 61 6d 65 20 69 66 20 69 74        name if it
8de0: 20 63 75 72 72 65 6e 74 6c 79 20 65 78 69 73 74   currently exist
8df0: 73 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  s...      #..   
8e00: 20 20 20 69 66 20 7b 21 24 69 73 4d 65 6d 6f 72     if {!$isMemor
8e10: 79 20 26 26 20 24 64 65 6c 65 74 65 20 26 26 20  y && $delete && 
8e20: 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24 66 69  [file exists $fi
8e30: 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d  leName]} then {.
8e40: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
8e50: 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 74 74 65      # NOTE: Atte
8e60: 6d 70 74 20 74 6f 20 64 65 6c 65 74 65 20 61 6e  mpt to delete an
8e70: 79 20 70 72 65 2d 65 78 69 73 74 69 6e 67 20 64  y pre-existing d
8e80: 61 74 61 62 61 73 65 20 77 69 74 68 20 74 68 65  atabase with the
8e90: 20 73 61 6d 65 20 66 69 6c 65 0d 0a 20 20 20 20   same file..    
8ea0: 20 20 20 20 23 20 20 20 20 20 20 20 6e 61 6d 65      #       name
8eb0: 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
8ec0: 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68        if {[catch
8ed0: 20 7b 66 69 6c 65 20 64 65 6c 65 74 65 20 24 66   {file delete $f
8ee0: 69 6c 65 4e 61 6d 65 7d 20 65 72 72 6f 72 5d 7d  ileName} error]}
8ef0: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
8f00: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
8f10: 23 20 4e 4f 54 45 3a 20 57 65 20 73 6f 6d 65 68  # NOTE: We someh
8f20: 6f 77 20 66 61 69 6c 65 64 20 74 6f 20 64 65 6c  ow failed to del
8f30: 65 74 65 20 74 68 65 20 66 69 6c 65 2c 20 72 65  ete the file, re
8f40: 70 6f 72 74 20 77 68 79 2e 0d 0a 20 20 20 20 20  port why...     
8f50: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
8f60: 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
8f70: 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
8f80: 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
8f90: 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49       "==== WARNI
8fa0: 4e 47 3a 20 66 61 69 6c 65 64 20 74 6f 20 64 65  NG: failed to de
8fb0: 6c 65 74 65 20 64 61 74 61 62 61 73 65 20 66 69  lete database fi
8fc0: 6c 65 20 5c 22 22 20 24 66 69 6c 65 4e 61 6d 65  le \"" $fileName
8fd0: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
8fe0: 20 20 22 5c 22 20 64 75 72 69 6e 67 20 73 65 74    "\" during set
8ff0: 75 70 2c 20 65 72 72 6f 72 3a 20 22 20 5c 6e 5c  up, error: " \n\
9000: 74 20 24 65 72 72 6f 72 20 5c 6e 5d 0d 0a 20 20  t $error \n]..  
9010: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d        }..      }
9020: 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  ....      #..   
9030: 20 20 20 23 20 4e 4f 54 45 3a 20 52 65 66 65 72     # NOTE: Refer
9040: 20 74 6f 20 74 68 65 20 73 70 65 63 69 66 69 65   to the specifie
9050: 64 20 76 61 72 69 61 62 6c 65 20 28 65 2e 67 2e  d variable (e.g.
9060: 20 22 64 62 22 29 20 69 6e 20 74 68 65 20 63 6f   "db") in the co
9070: 6e 74 65 78 74 20 6f 66 20 6f 75 72 0d 0a 20 20  ntext of our..  
9080: 20 20 20 20 23 20 20 20 20 20 20 20 63 61 6c 6c      #       call
9090: 65 72 2e 20 20 54 68 65 20 68 61 6e 64 6c 65 20  er.  The handle 
90a0: 74 6f 20 74 68 65 20 6f 70 65 6e 65 64 20 64 61  to the opened da
90b0: 74 61 62 61 73 65 20 77 69 6c 6c 20 62 65 20 73  tabase will be s
90c0: 74 6f 72 65 64 20 74 68 65 72 65 2e 0d 0a 20 20  tored there...  
90d0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 75 70 76      #..      upv
90e0: 61 72 20 31 20 24 76 61 72 4e 61 6d 65 20 64 62  ar 1 $varName db
90f0: 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  ....      #..   
9100: 20 20 20 23 20 4e 4f 54 45 3a 20 53 74 61 72 74     # NOTE: Start
9110: 20 62 75 69 6c 64 69 6e 67 20 74 68 65 20 63 6f   building the co
9120: 6e 6e 65 63 74 69 6f 6e 20 73 74 72 69 6e 67 2e  nnection string.
9130: 20 20 54 68 65 20 6f 6e 6c 79 20 72 65 71 75 69    The only requi
9140: 72 65 64 20 70 6f 72 74 69 6f 6e 0d 0a 20 20 20  red portion..   
9150: 20 20 20 23 20 20 20 20 20 20 20 6f 66 20 74 68     #       of th
9160: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 74 72  e connection str
9170: 69 6e 67 20 69 73 20 74 68 65 20 64 61 74 61 20  ing is the data 
9180: 73 6f 75 72 63 65 2c 20 77 68 69 63 68 20 63 6f  source, which co
9190: 6e 74 61 69 6e 73 20 74 68 65 0d 0a 20 20 20 20  ntains the..    
91a0: 20 20 23 20 20 20 20 20 20 20 64 61 74 61 62 61    #       databa
91b0: 73 65 20 66 69 6c 65 20 6e 61 6d 65 20 69 74 73  se file name its
91c0: 65 6c 66 2e 20 20 49 66 20 6f 75 72 20 63 61 6c  elf.  If our cal
91d0: 6c 65 72 20 77 61 6e 74 73 20 74 6f 20 75 73 65  ler wants to use
91e0: 20 61 20 55 52 49 20 61 73 0d 0a 20 20 20 20 20   a URI as..     
91f0: 20 23 20 20 20 20 20 20 20 74 68 65 20 64 61 74   #       the dat
9200: 61 20 73 6f 75 72 63 65 2c 20 75 73 65 20 74 68  a source, use th
9210: 65 20 46 75 6c 6c 55 72 69 20 63 6f 6e 6e 65 63  e FullUri connec
9220: 74 69 6f 6e 20 73 74 72 69 6e 67 20 70 72 6f 70  tion string prop
9230: 65 72 74 79 20 74 6f 0d 0a 20 20 20 20 20 20 23  erty to..      #
9240: 20 20 20 20 20 20 20 70 72 65 76 65 6e 74 20 74         prevent t
9250: 68 65 20 64 61 74 61 20 73 6f 75 72 63 65 20 73  he data source s
9260: 74 72 69 6e 67 20 66 72 6f 6d 20 62 65 69 6e 67  tring from being
9270: 20 6d 61 6e 67 6c 65 64 2e 0d 0a 20 20 20 20 20   mangled...     
9280: 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 24 75   #..      if {$u
9290: 72 69 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  ri} then {..    
92a0: 20 20 20 20 73 65 74 20 63 6f 6e 6e 65 63 74 69      set connecti
92b0: 6f 6e 20 7b 46 75 6c 6c 55 72 69 3d 24 7b 66 69  on {FullUri=${fi
92c0: 6c 65 4e 61 6d 65 7d 7d 0d 0a 20 20 20 20 20 20  leName}}..      
92d0: 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
92e0: 20 20 73 65 74 20 63 6f 6e 6e 65 63 74 69 6f 6e    set connection
92f0: 20 7b 44 61 74 61 20 53 6f 75 72 63 65 3d 24 7b   {Data Source=${
9300: 66 69 6c 65 4e 61 6d 65 7d 7d 0d 0a 20 20 20 20  fileName}}..    
9310: 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a    }....      #..
9320: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 69        # NOTE: Si
9330: 6e 63 65 20 74 68 69 73 20 70 72 6f 63 65 64 75  nce this procedu
9340: 72 65 20 68 61 73 20 6e 6f 20 73 70 65 63 69 61  re has no specia
9350: 6c 20 6b 6e 6f 77 6c 65 64 67 65 20 6f 66 20 77  l knowledge of w
9360: 68 61 74 20 74 68 65 20 64 65 66 61 75 6c 74 0d  hat the default.
9370: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 73  .      #       s
9380: 65 74 74 69 6e 67 20 69 73 20 66 6f 72 20 74 68  etting is for th
9390: 65 20 54 6f 46 75 6c 6c 50 61 74 68 20 63 6f 6e  e ToFullPath con
93a0: 6e 65 63 74 69 6f 6e 20 73 74 72 69 6e 67 20 70  nection string p
93b0: 72 6f 70 65 72 79 2c 20 61 6c 77 61 79 73 0d 0a  ropery, always..
93c0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 61 64        #       ad
93d0: 64 20 74 68 65 20 76 61 6c 75 65 20 77 65 20 6b  d the value we k
93e0: 6e 6f 77 20 61 62 6f 75 74 20 74 6f 20 74 68 65  now about to the
93f0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 74 72 69   connection stri
9400: 6e 67 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  ng...      #..  
9410: 20 20 20 20 61 70 70 65 6e 64 20 63 6f 6e 6e 65      append conne
9420: 63 74 69 6f 6e 20 7b 3b 54 6f 46 75 6c 6c 50 61  ction {;ToFullPa
9430: 74 68 3d 24 7b 71 75 61 6c 69 66 79 7d 7d 0d 0a  th=${qualify}}..
9440: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
9450: 20 23 20 4e 4f 54 45 3a 20 49 66 20 6f 75 72 20   # NOTE: If our 
9460: 63 61 6c 6c 65 72 20 73 70 65 63 69 66 69 65 64  caller specified
9470: 20 61 20 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 2c   a journal mode,
9480: 20 61 64 64 20 74 68 65 20 6e 65 63 65 73 73 61   add the necessa
9490: 72 79 20 70 6f 72 74 69 6f 6e 0d 0a 20 20 20 20  ry portion..    
94a0: 20 20 23 20 20 20 20 20 20 20 6f 66 20 74 68 65    #       of the
94b0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 74 72 69   connection stri
94c0: 6e 67 20 6e 6f 77 2e 0d 0a 20 20 20 20 20 20 23  ng now...      #
94d0: 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72  ..      if {[str
94e0: 69 6e 67 20 6c 65 6e 67 74 68 20 24 6d 6f 64 65  ing length $mode
94f0: 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20  ] > 0} then {.. 
9500: 20 20 20 20 20 20 20 61 70 70 65 6e 64 20 63 6f         append co
9510: 6e 6e 65 63 74 69 6f 6e 20 7b 3b 4a 6f 75 72 6e  nnection {;Journ
9520: 61 6c 20 4d 6f 64 65 3d 24 7b 6d 6f 64 65 7d 7d  al Mode=${mode}}
9530: 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
9540: 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
9550: 54 45 3a 20 49 66 20 6f 75 72 20 63 61 6c 6c 65  TE: If our calle
9560: 72 20 73 70 65 63 69 66 69 65 64 20 61 20 44 61  r specified a Da
9570: 74 65 54 69 6d 65 20 66 6f 72 6d 61 74 2c 20 61  teTime format, a
9580: 64 64 20 74 68 65 20 6e 65 63 65 73 73 61 72 79  dd the necessary
9590: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
95a0: 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65 20 63  portion of the c
95b0: 6f 6e 6e 65 63 74 69 6f 6e 20 73 74 72 69 6e 67  onnection string
95c0: 20 6e 6f 77 2e 0d 0a 20 20 20 20 20 20 23 0d 0a   now...      #..
95d0: 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e        if {[strin
95e0: 67 20 6c 65 6e 67 74 68 20 24 64 61 74 65 54 69  g length $dateTi
95f0: 6d 65 46 6f 72 6d 61 74 5d 20 3e 20 30 7d 20 74  meFormat] > 0} t
9600: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 61  hen {..        a
9610: 70 70 65 6e 64 20 63 6f 6e 6e 65 63 74 69 6f 6e  ppend connection
9620: 20 7b 3b 44 61 74 65 54 69 6d 65 46 6f 72 6d 61   {;DateTimeForma
9630: 74 3d 24 7b 64 61 74 65 54 69 6d 65 46 6f 72 6d  t=${dateTimeForm
9640: 61 74 7d 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d  at}}..      }...
9650: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
9660: 23 20 4e 4f 54 45 3a 20 49 66 20 6f 75 72 20 63  # NOTE: If our c
9670: 61 6c 6c 65 72 20 73 70 65 63 69 66 69 65 64 20  aller specified 
9680: 61 20 44 61 74 65 54 69 6d 65 4b 69 6e 64 2c 20  a DateTimeKind, 
9690: 61 64 64 20 74 68 65 20 6e 65 63 65 73 73 61 72  add the necessar
96a0: 79 20 70 6f 72 74 69 6f 6e 0d 0a 20 20 20 20 20  y portion..     
96b0: 20 23 20 20 20 20 20 20 20 6f 66 20 74 68 65 20   #       of the 
96c0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 74 72 69 6e  connection strin
96d0: 67 20 6e 6f 77 2e 0d 0a 20 20 20 20 20 20 23 0d  g now...      #.
96e0: 0a 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69  .      if {[stri
96f0: 6e 67 20 6c 65 6e 67 74 68 20 24 64 61 74 65 54  ng length $dateT
9700: 69 6d 65 4b 69 6e 64 5d 20 3e 20 30 7d 20 74 68  imeKind] > 0} th
9710: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 61 70  en {..        ap
9720: 70 65 6e 64 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  pend connection 
9730: 7b 3b 44 61 74 65 54 69 6d 65 4b 69 6e 64 3d 24  {;DateTimeKind=$
9740: 7b 64 61 74 65 54 69 6d 65 4b 69 6e 64 7d 7d 0d  {dateTimeKind}}.
9750: 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
9760: 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
9770: 45 3a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  E: If there are 
9780: 61 6e 79 20 67 6c 6f 62 61 6c 20 28 70 65 72 20  any global (per 
9790: 74 65 73 74 20 72 75 6e 29 20 63 6f 6e 6e 65 63  test run) connec
97a0: 74 69 6f 6e 20 66 6c 61 67 73 20 63 75 72 72 65  tion flags curre
97b0: 6e 74 6c 79 0d 0a 20 20 20 20 20 20 23 20 20 20  ntly..      #   
97c0: 20 20 20 20 73 65 74 2c 20 75 73 65 20 74 68 65      set, use the
97d0: 6d 20 6e 6f 77 20 28 69 2e 65 2e 20 62 79 20 63  m now (i.e. by c
97e0: 6f 6d 62 69 6e 69 6e 67 20 74 68 65 6d 20 77 69  ombining them wi
97f0: 74 68 20 74 68 65 20 6f 6e 65 73 20 66 6f 72 20  th the ones for 
9800: 74 68 69 73 0d 0a 20 20 20 20 20 20 23 20 20 20  this..      #   
9810: 20 20 20 20 63 6f 6e 6e 65 63 74 69 6f 6e 29 2e      connection).
9820: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
9830: 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74   if {[info exist
9840: 73 20 3a 3a 63 6f 6e 6e 65 63 74 69 6f 6e 5f 66  s ::connection_f
9850: 6c 61 67 73 5d 20 26 26 20 5c 0d 0a 20 20 20 20  lags] && \..    
9860: 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65        [string le
9870: 6e 67 74 68 20 24 3a 3a 63 6f 6e 6e 65 63 74 69  ngth $::connecti
9880: 6f 6e 5f 66 6c 61 67 73 5d 20 3e 20 30 7d 20 74  on_flags] > 0} t
9890: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  hen {..        #
98a0: 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
98b0: 3a 20 53 68 6f 77 20 28 61 6e 64 20 6c 6f 67 29  : Show (and log)
98c0: 20 74 68 61 74 20 77 65 20 64 65 74 65 63 74 65   that we detecte
98d0: 64 20 73 6f 6d 65 20 67 6c 6f 62 61 6c 20 63 6f  d some global co
98e0: 6e 6e 65 63 74 69 6f 6e 20 66 6c 61 67 73 2e 0d  nnection flags..
98f0: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
9900: 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
9910: 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e  t_channel [appen
9920: 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
9930: 20 20 20 20 20 22 2d 2d 2d 2d 20 67 6c 6f 62 61       "---- globa
9940: 6c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 6c 61  l connection fla
9950: 67 73 20 64 65 74 65 63 74 65 64 3a 20 22 20 24  gs detected: " $
9960: 3a 3a 63 6f 6e 6e 65 63 74 69 6f 6e 5f 66 6c 61  ::connection_fla
9970: 67 73 20 5c 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20  gs \n]....      
9980: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
9990: 4f 54 45 3a 20 43 6f 6d 62 69 6e 65 20 61 6e 64  OTE: Combine and
99a0: 2f 6f 72 20 72 65 70 6c 61 63 65 20 74 68 65 20  /or replace the 
99b0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 6c 61 67 73  connection flags
99c0: 20 61 6e 64 20 74 68 65 6e 20 73 68 6f 77 20 74   and then show t
99d0: 68 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  he..        #   
99e0: 20 20 20 20 6e 65 77 20 76 61 6c 75 65 2e 0d 0a      new value...
99f0: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
9a00: 20 20 20 73 65 74 20 66 6c 61 67 73 20 5b 63 6f     set flags [co
9a10: 6d 62 69 6e 65 46 6c 61 67 73 20 24 66 6c 61 67  mbineFlags $flag
9a20: 73 20 24 3a 3a 63 6f 6e 6e 65 63 74 69 6f 6e 5f  s $::connection_
9a30: 66 6c 61 67 73 5d 0d 0a 0d 0a 20 20 20 20 20 20  flags]....      
9a40: 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
9a50: 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
9a60: 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
9a70: 20 20 20 22 2d 2d 2d 2d 20 63 6f 6d 62 69 6e 65     "---- combine
9a80: 64 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 6c 61  d connection fla
9a90: 67 73 20 61 72 65 3a 20 22 20 24 66 6c 61 67 73  gs are: " $flags
9aa0: 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d   \n]..      }...
9ab0: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
9ac0: 23 20 4e 4f 54 45 3a 20 49 66 20 6f 75 72 20 63  # NOTE: If our c
9ad0: 61 6c 6c 65 72 20 73 70 65 63 69 66 69 65 64 20  aller specified 
9ae0: 73 6f 6d 65 20 53 51 4c 69 74 65 43 6f 6e 6e 65  some SQLiteConne
9af0: 63 74 69 6f 6e 46 6c 61 67 73 2c 20 61 64 64 20  ctionFlags, add 
9b00: 74 68 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20  the..      #    
9b10: 20 20 20 6e 65 63 65 73 73 61 72 79 20 70 6f 72     necessary por
9b20: 74 69 6f 6e 20 6f 66 20 74 68 65 20 63 6f 6e 6e  tion of the conn
9b30: 65 63 74 69 6f 6e 20 73 74 72 69 6e 67 20 6e 6f  ection string no
9b40: 77 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  w...      #..   
9b50: 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c     if {[string l
9b60: 65 6e 67 74 68 20 24 66 6c 61 67 73 5d 20 3e 20  ength $flags] > 
9b70: 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
9b80: 20 20 20 61 70 70 65 6e 64 20 63 6f 6e 6e 65 63     append connec
9b90: 74 69 6f 6e 20 7b 3b 46 6c 61 67 73 3d 24 7b 66  tion {;Flags=${f
9ba0: 6c 61 67 73 7d 7d 0d 0a 20 20 20 20 20 20 7d 0d  lags}}..      }.
9bb0: 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
9bc0: 20 20 23 20 4e 4f 54 45 3a 20 49 66 20 6f 75 72    # NOTE: If our
9bd0: 20 63 61 6c 6c 65 72 20 73 70 65 63 69 66 69 65   caller specifie
9be0: 64 20 61 6e 20 65 78 74 72 61 20 70 61 79 6c 6f  d an extra paylo
9bf0: 61 64 20 74 6f 20 74 68 65 20 63 6f 6e 6e 65 63  ad to the connec
9c00: 74 69 6f 6e 0d 0a 20 20 20 20 20 20 23 20 20 20  tion..      #   
9c10: 20 20 20 20 73 74 72 69 6e 67 2c 20 61 70 70 65      string, appe
9c20: 6e 64 20 69 74 20 6e 6f 77 2e 0d 0a 20 20 20 20  nd it now...    
9c30: 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b    #..      if {[
9c40: 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 65  string length $e
9c50: 78 74 72 61 5d 20 3e 20 30 7d 20 74 68 65 6e 20  xtra] > 0} then 
9c60: 7b 0d 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e  {..        appen
9c70: 64 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 5c 3b 20  d connection \; 
9c80: 24 65 78 74 72 61 0d 0a 20 20 20 20 20 20 7d 0d  $extra..      }.
9c90: 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
9ca0: 20 20 23 20 4e 4f 54 45 3a 20 4f 70 65 6e 20 74    # NOTE: Open t
9cb0: 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  he database conn
9cc0: 65 63 74 69 6f 6e 20 6e 6f 77 2c 20 70 6c 61 63  ection now, plac
9cd0: 69 6e 67 20 74 68 65 20 6f 70 61 71 75 65 20 68  ing the opaque h
9ce0: 61 6e 64 6c 65 20 76 61 6c 75 65 0d 0a 20 20 20  andle value..   
9cf0: 20 20 20 23 20 20 20 20 20 20 20 69 6e 74 6f 20     #       into 
9d00: 74 68 65 20 76 61 72 69 61 62 6c 65 20 73 70 65  the variable spe
9d10: 63 69 66 69 65 64 20 62 79 20 6f 75 72 20 63 61  cified by our ca
9d20: 6c 6c 65 72 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  ller...      #..
9d30: 20 20 20 20 20 20 73 65 74 20 64 62 20 5b 73 71        set db [sq
9d40: 6c 20 6f 70 65 6e 20 2d 74 79 70 65 20 53 51 4c  l open -type SQL
9d50: 69 74 65 20 5b 73 75 62 73 74 20 24 63 6f 6e 6e  ite [subst $conn
9d60: 65 63 74 69 6f 6e 5d 5d 0d 0a 0d 0a 20 20 20 20  ection]]....    
9d70: 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
9d80: 45 3a 20 43 6f 6e 66 69 67 75 72 65 20 74 68 65  E: Configure the
9d90: 20 74 65 6d 70 6f 72 61 72 79 20 64 69 72 65 63   temporary direc
9da0: 74 6f 72 79 20 66 6f 72 20 74 68 65 20 6e 65 77  tory for the new
9db0: 6c 79 20 6f 70 65 6e 65 64 20 64 61 74 61 62 61  ly opened databa
9dc0: 73 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  se..      #     
9dd0: 20 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6e 6f 77    connection now
9de0: 20 75 6e 6c 65 73 73 20 6f 75 72 20 63 61 6c 6c   unless our call
9df0: 65 72 20 66 6f 72 62 69 64 73 20 69 74 2e 0d 0a  er forbids it...
9e00: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69        #..      i
9e10: 66 20 7b 24 74 65 6d 70 6f 72 61 72 79 20 26 26  f {$temporary &&
9e20: 20 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a   ![info exists :
9e30: 3a 6e 6f 28 73 65 74 54 65 6d 70 6f 72 61 72 79  :no(setTemporary
9e40: 44 69 72 65 63 74 6f 72 79 29 5d 7d 20 74 68 65  Directory)]} the
9e50: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 71 6c  n {..        sql
9e60: 20 65 78 65 63 75 74 65 20 24 64 62 20 5b 61 70   execute $db [ap
9e70: 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
9e80: 20 20 20 20 20 20 20 20 22 50 52 41 47 4d 41 20          "PRAGMA 
9e90: 74 65 6d 70 5f 73 74 6f 72 65 5f 64 69 72 65 63  temp_store_direc
9ea0: 74 6f 72 79 20 3d 20 5c 22 22 20 5b 67 65 74 54  tory = \"" [getT
9eb0: 65 6d 70 6f 72 61 72 79 44 69 72 65 63 74 6f 72  emporaryDirector
9ec0: 79 5d 20 5c 22 5c 3b 5d 0d 0a 20 20 20 20 20 20  y] \"\;]..      
9ed0: 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  }....      #..  
9ee0: 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 6c 77 61      # NOTE: Alwa
9ef0: 79 73 20 72 65 74 75 72 6e 20 74 68 65 20 63 6f  ys return the co
9f00: 6e 6e 65 63 74 69 6f 6e 20 68 61 6e 64 6c 65 20  nnection handle 
9f10: 75 70 6f 6e 20 73 75 63 63 65 73 73 2e 0d 0a 20  upon success... 
9f20: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 72 65       #..      re
9f30: 74 75 72 6e 20 24 64 62 0d 0a 20 20 20 20 7d 0d  turn $db..    }.
9f40: 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74  ....    proc get
9f50: 44 62 43 6f 6e 6e 65 63 74 69 6f 6e 20 7b 20 7b  DbConnection { {
9f60: 76 61 72 4e 61 6d 65 20 64 62 7d 20 7d 20 7b 0d  varName db} } {.
9f70: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
9f80: 23 20 4e 4f 54 45 3a 20 52 65 66 65 72 20 74 6f  # NOTE: Refer to
9f90: 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 76   the specified v
9fa0: 61 72 69 61 62 6c 65 20 28 65 2e 67 2e 20 22 64  ariable (e.g. "d
9fb0: 62 22 29 20 69 6e 20 74 68 65 20 63 6f 6e 74 65  b") in the conte
9fc0: 78 74 20 6f 66 20 6f 75 72 0d 0a 20 20 20 20 20  xt of our..     
9fd0: 20 23 20 20 20 20 20 20 20 63 61 6c 6c 65 72 2e   #       caller.
9fe0: 20 20 54 68 65 20 68 61 6e 64 6c 65 20 74 6f 20    The handle to 
9ff0: 74 68 65 20 64 61 74 61 62 61 73 65 20 70 72 65  the database pre
a000: 76 69 6f 75 73 6c 79 20 6f 70 65 6e 65 64 20 76  viously opened v
a010: 69 61 20 74 68 65 0d 0a 20 20 20 20 20 20 23 20  ia the..      # 
a020: 20 20 20 20 20 20 5b 73 65 74 75 70 44 62 5d 20        [setupDb] 
a030: 70 72 6f 63 65 64 75 72 65 20 73 68 6f 75 6c 64  procedure should
a040: 20 62 65 20 73 74 6f 72 65 64 20 74 68 65 72 65   be stored there
a050: 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
a060: 20 20 75 70 76 61 72 20 31 20 24 76 61 72 4e 61    upvar 1 $varNa
a070: 6d 65 20 64 62 0d 0a 0d 0a 20 20 20 20 20 20 23  me db....      #
a080: 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
a090: 54 68 69 73 20 72 65 74 75 72 6e 73 20 74 68 65  This returns the
a0a0: 20 41 44 4f 2e 4e 45 54 20 49 44 62 43 6f 6e 6e   ADO.NET IDbConn
a0b0: 65 63 74 69 6f 6e 20 6f 62 6a 65 63 74 20 69 6e  ection object in
a0c0: 73 74 61 6e 63 65 20 66 6f 72 20 74 68 65 0d 0a  stance for the..
a0d0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 73 70        #       sp
a0e0: 65 63 69 66 69 65 64 20 64 61 74 61 62 73 65 20  ecified databse 
a0f0: 68 61 6e 64 6c 65 2e 20 20 53 69 6e 63 65 20 67  handle.  Since g
a100: 65 74 74 69 6e 67 20 74 68 69 73 20 6f 62 6a 65  etting this obje
a110: 63 74 20 72 65 6c 69 65 73 20 75 70 6f 6e 0d 0a  ct relies upon..
a120: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 45 61        #       Ea
a130: 67 6c 65 20 69 6e 74 65 72 6e 61 6c 73 2c 20 67  gle internals, g
a140: 72 65 61 74 20 63 61 72 65 20 73 68 6f 75 6c 64  reat care should
a150: 20 62 65 20 74 61 6b 65 6e 20 74 6f 20 61 76 6f   be taken to avo
a160: 69 64 20 64 69 73 70 6f 73 69 6e 67 20 6f 66 0d  id disposing of.
a170: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74  .      #       t
a180: 68 69 73 20 6f 62 6a 65 63 74 20 6f 72 20 6f 74  his object or ot
a190: 68 65 72 77 69 73 65 20 70 75 74 74 69 6e 67 20  herwise putting 
a1a0: 69 74 20 69 6e 74 6f 20 61 6e 20 69 6e 76 61 6c  it into an inval
a1b0: 69 64 20 73 74 61 74 65 2e 0d 0a 20 20 20 20 20  id state...     
a1c0: 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69   #..      if {[i
a1d0: 6e 66 6f 20 65 78 69 73 74 73 20 64 62 5d 7d 20  nfo exists db]} 
a1e0: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
a1f0: 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20  if {[catch {..  
a200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 62                ob
a210: 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61  ject invoke -fla
a220: 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 2d 6f  gs +NonPublic -o
a230: 62 6a 65 63 74 66 6c 61 67 73 20 2b 4e 6f 44 69  bjectflags +NoDi
a240: 73 70 6f 73 65 20 5c 0d 0a 20 20 20 20 20 20 20  spose \..       
a250: 20 20 20 20 20 20 20 20 20 2d 61 6c 69 61 73 20           -alias 
a260: 49 6e 74 65 72 70 72 65 74 65 72 2e 47 65 74 41  Interpreter.GetA
a270: 63 74 69 76 65 2e 63 6f 6e 6e 65 63 74 69 6f 6e  ctive.connection
a280: 73 20 49 74 65 6d 20 24 64 62 7d 20 5c 0d 0a 20  s Item $db} \.. 
a290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
a2a0: 65 73 75 6c 74 5d 20 3d 3d 20 30 7d 20 74 68 65  esult] == 0} the
a2b0: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 23  n {..          #
a2c0: 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f  ..          # NO
a2d0: 54 45 3a 20 53 75 63 63 65 73 73 2c 20 72 65 74  TE: Success, ret
a2e0: 75 72 6e 20 74 68 65 20 6f 70 61 71 75 65 20 6f  urn the opaque o
a2f0: 62 6a 65 63 74 20 68 61 6e 64 6c 65 2e 0d 0a 20  bject handle... 
a300: 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
a310: 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 72 65        return $re
a320: 73 75 6c 74 0d 0a 20 20 20 20 20 20 20 20 7d 20  sult..        } 
a330: 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
a340: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23    #..          #
a350: 20 4e 4f 54 45 3a 20 46 61 69 6c 75 72 65 2c 20   NOTE: Failure, 
a360: 72 65 70 6f 72 74 20 77 68 79 2e 0d 0a 20 20 20  report why...   
a370: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
a380: 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
a390: 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e  t_channel [appen
a3a0: 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
a3b0: 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52         "==== WAR
a3c0: 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20 74 6f 20  NING: failed to 
a3d0: 67 65 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68  get connection h
a3e0: 61 6e 64 6c 65 20 66 6f 72 20 64 61 74 61 62 61  andle for databa
a3f0: 73 65 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20  se \"" \..      
a400: 20 20 20 20 20 20 20 20 24 64 62 20 22 5c 22 2c          $db "\",
a410: 20 65 72 72 6f 72 3a 20 22 20 5c 6e 5c 74 20 24   error: " \n\t $
a420: 72 65 73 75 6c 74 20 5c 6e 5d 0d 0a 20 20 20 20  result \n]..    
a430: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a      }..      }..
a440: 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
a450: 6f 63 20 66 72 65 65 44 62 43 6f 6e 6e 65 63 74  oc freeDbConnect
a460: 69 6f 6e 20 7b 20 7b 76 61 72 4e 61 6d 65 20 63  ion { {varName c
a470: 6f 6e 6e 65 63 74 69 6f 6e 7d 20 7d 20 7b 0d 0a  onnection} } {..
a480: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
a490: 20 4e 4f 54 45 3a 20 52 65 66 65 72 20 74 6f 20   NOTE: Refer to 
a4a0: 74 68 65 20 73 70 65 63 69 66 69 65 64 20 76 61  the specified va
a4b0: 72 69 61 62 6c 65 20 28 65 2e 67 2e 20 22 63 6f  riable (e.g. "co
a4c0: 6e 6e 65 63 74 69 6f 6e 22 29 20 69 6e 20 74 68  nnection") in th
a4d0: 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  e..      #      
a4e0: 20 63 6f 6e 74 65 78 74 20 6f 66 20 6f 75 72 20   context of our 
a4f0: 63 61 6c 6c 65 72 2e 20 20 54 68 65 20 6f 70 61  caller.  The opa
a500: 71 75 65 20 6f 62 6a 65 63 74 20 68 61 6e 64 6c  que object handl
a510: 65 20 66 6f 72 20 61 6e 20 41 44 4f 2e 4e 45 54  e for an ADO.NET
a520: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
a530: 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 72 65 76 69  connection previ
a540: 6f 75 73 6c 79 20 72 65 74 75 72 6e 65 64 20 62  ously returned b
a550: 79 20 5b 67 65 74 44 62 43 6f 6e 6e 65 63 74 69  y [getDbConnecti
a560: 6f 6e 5d 20 73 68 6f 75 6c 64 20 62 65 0d 0a 20  on] should be.. 
a570: 20 20 20 20 20 23 20 20 20 20 20 20 20 73 74 6f       #       sto
a580: 72 65 64 20 74 68 65 72 65 2e 0d 0a 20 20 20 20  red there...    
a590: 20 20 23 0d 0a 20 20 20 20 20 20 75 70 76 61 72    #..      upvar
a5a0: 20 31 20 24 76 61 72 4e 61 6d 65 20 63 6f 6e 6e   1 $varName conn
a5b0: 65 63 74 69 6f 6e 0d 0a 0d 0a 20 20 20 20 20 20  ection....      
a5c0: 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
a5d0: 20 41 74 74 65 6d 70 74 20 74 6f 20 72 65 6d 6f   Attempt to remo
a5e0: 76 65 20 74 68 65 20 6f 70 61 71 75 65 20 6f 62  ve the opaque ob
a5f0: 6a 65 63 74 20 68 61 6e 64 6c 65 20 66 72 6f 6d  ject handle from
a600: 20 74 68 65 20 69 6e 74 65 72 70 72 65 74 65 72   the interpreter
a610: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
a620: 6e 6f 77 2e 20 20 54 68 69 73 20 5b 6f 62 6a 65  now.  This [obje
a630: 63 74 20 64 69 73 70 6f 73 65 5d 20 63 61 6c 6c  ct dispose] call
a640: 20 77 69 6c 6c 20 6e 6f 74 20 61 63 74 75 61 6c   will not actual
a650: 6c 79 20 64 69 73 70 6f 73 65 20 6f 66 20 74 68  ly dispose of th
a660: 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  e..      #      
a670: 20 75 6e 64 65 72 6c 79 69 6e 67 20 6f 62 6a 65   underlying obje
a680: 63 74 20 62 65 63 61 75 73 65 20 74 68 65 20 2b  ct because the +
a690: 4e 6f 44 69 73 70 6f 73 65 20 66 6c 61 67 20 77  NoDispose flag w
a6a0: 61 73 20 73 65 74 20 6f 6e 20 69 74 0d 0a 20 20  as set on it..  
a6b0: 20 20 20 20 23 20 20 20 20 20 20 20 64 75 72 69      #       duri
a6c0: 6e 67 20 63 72 65 61 74 69 6f 6e 20 6f 66 20 74  ng creation of t
a6d0: 68 65 20 6f 70 61 71 75 65 20 6f 62 6a 65 63 74  he opaque object
a6e0: 20 68 61 6e 64 6c 65 2e 0d 0a 20 20 20 20 20 20   handle...      
a6f0: 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 6e  #..      if {[in
a700: 66 6f 20 65 78 69 73 74 73 20 63 6f 6e 6e 65 63  fo exists connec
a710: 74 69 6f 6e 5d 20 26 26 20 5c 0d 0a 20 20 20 20  tion] && \..    
a720: 20 20 20 20 20 20 5b 63 61 74 63 68 20 7b 6f 62        [catch {ob
a730: 6a 65 63 74 20 64 69 73 70 6f 73 65 20 24 63 6f  ject dispose $co
a740: 6e 6e 65 63 74 69 6f 6e 7d 20 65 72 72 6f 72 5d  nnection} error]
a750: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
a760: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
a770: 4f 54 45 3a 20 57 65 20 73 6f 6d 65 68 6f 77 20  OTE: We somehow 
a780: 66 61 69 6c 65 64 20 74 6f 20 72 65 6d 6f 76 65  failed to remove
a790: 20 74 68 65 20 68 61 6e 64 6c 65 2c 20 72 65 70   the handle, rep
a7a0: 6f 72 74 20 77 68 79 2e 0d 0a 20 20 20 20 20 20  ort why...      
a7b0: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 74 70 75    #..        tpu
a7c0: 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
a7d0: 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
a7e0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 3d  ..            "=
a7f0: 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61 69  === WARNING: fai
a800: 6c 65 64 20 74 6f 20 72 65 6d 6f 76 65 20 63 6f  led to remove co
a810: 6e 6e 65 63 74 69 6f 6e 20 68 61 6e 64 6c 65 20  nnection handle 
a820: 5c 22 22 20 24 63 6f 6e 6e 65 63 74 69 6f 6e 20  \"" $connection 
a830: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22  \..            "
a840: 5c 22 2c 20 65 72 72 6f 72 3a 20 22 20 5c 6e 5c  \", error: " \n\
a850: 74 20 24 65 72 72 6f 72 20 5c 6e 5d 0d 0a 20 20  t $error \n]..  
a860: 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d      }..    }....
a870: 0a 20 20 20 20 70 72 6f 63 20 61 64 64 44 62 43  .    proc addDbC
a880: 6f 6e 6e 65 63 74 69 6f 6e 20 7b 20 63 6f 6e 6e  onnection { conn
a890: 65 63 74 69 6f 6e 20 7b 76 61 72 4e 61 6d 65 20  ection {varName 
a8a0: 64 62 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23  db} } {..      #
a8b0: 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
a8c0: 52 65 66 65 72 20 74 6f 20 74 68 65 20 73 70 65  Refer to the spe
a8d0: 63 69 66 69 65 64 20 76 61 72 69 61 62 6c 65 20  cified variable 
a8e0: 28 65 2e 67 2e 20 22 64 62 22 29 20 69 6e 20 74  (e.g. "db") in t
a8f0: 68 65 20 63 6f 6e 74 65 78 74 20 6f 66 20 6f 75  he context of ou
a900: 72 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  r..      #      
a910: 20 63 61 6c 6c 65 72 2e 0d 0a 20 20 20 20 20 20   caller...      
a920: 23 0d 0a 20 20 20 20 20 20 75 70 76 61 72 20 31  #..      upvar 1
a930: 20 24 76 61 72 4e 61 6d 65 20 64 62 0d 0a 0d 0a   $varName db....
a940: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
a950: 20 4e 4f 54 45 3a 20 43 72 65 61 74 65 20 61 20   NOTE: Create a 
a960: 63 6f 72 72 65 63 74 6c 79 20 66 6f 72 6d 61 74  correctly format
a970: 74 65 64 20 6e 61 6d 65 20 66 6f 72 20 74 68 65  ted name for the
a980: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
a990: 74 69 6f 6e 20 74 6f 0d 0a 20 20 20 20 20 20 23  tion to..      #
a9a0: 20 20 20 20 20 20 20 62 65 20 61 64 64 65 64 20         be added 
a9b0: 74 6f 20 74 68 65 20 6c 69 73 74 20 6d 61 6e 61  to the list mana
a9c0: 67 65 64 20 62 79 20 74 68 65 20 45 61 67 6c 65  ged by the Eagle
a9d0: 20 69 6e 74 65 72 70 72 65 74 65 72 2e 0d 0a 20   interpreter... 
a9e0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 73 65       #..      se
a9f0: 74 20 64 62 20 5b 6f 62 6a 65 63 74 20 69 6e 76  t db [object inv
aa00: 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50  oke -flags +NonP
aa10: 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20 20  ublic \..       
aa20: 20 20 20 45 61 67 6c 65 2e 5f 43 6f 6d 70 6f 6e     Eagle._Compon
aa30: 65 6e 74 73 2e 50 72 69 76 61 74 65 2e 46 6f 72  ents.Private.For
aa40: 6d 61 74 4f 70 73 20 44 61 74 61 62 61 73 65 4f  matOps DatabaseO
aa50: 62 6a 65 63 74 4e 61 6d 65 20 24 63 6f 6e 6e 65  bjectName $conne
aa60: 63 74 69 6f 6e 20 5c 0d 0a 20 20 20 20 20 20 20  ction \..       
aa70: 20 20 20 53 51 4c 69 74 65 43 6f 6e 6e 65 63 74     SQLiteConnect
aa80: 69 6f 6e 20 5b 6f 62 6a 65 63 74 20 69 6e 76 6f  ion [object invo
aa90: 6b 65 20 49 6e 74 65 72 70 72 65 74 65 72 2e 47  ke Interpreter.G
aaa0: 65 74 41 63 74 69 76 65 20 4e 65 78 74 49 64 5d  etActive NextId]
aab0: 5d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  ]....      #..  
aac0: 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 64 64 20      # NOTE: Add 
aad0: 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e  the database con
aae0: 6e 65 63 74 69 6f 6e 20 70 72 6f 76 69 64 65 64  nection provided
aaf0: 20 62 79 20 6f 75 72 20 63 61 6c 6c 65 72 20 74   by our caller t
ab00: 6f 20 74 68 65 20 6c 69 73 74 0d 0a 20 20 20 20  o the list..    
ab10: 20 20 23 20 20 20 20 20 20 20 6f 66 20 74 68 6f    #       of tho
ab20: 73 65 20 6b 6e 6f 77 6e 20 74 6f 20 74 68 65 20  se known to the 
ab30: 45 61 67 6c 65 20 69 6e 74 65 72 70 72 65 74 65  Eagle interprete
ab40: 72 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  r...      #..   
ab50: 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65     object invoke
ab60: 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c   -flags +NonPubl
ab70: 69 63 20 49 6e 74 65 72 70 72 65 74 65 72 2e 47  ic Interpreter.G
ab80: 65 74 41 63 74 69 76 65 2e 63 6f 6e 6e 65 63 74  etActive.connect
ab90: 69 6f 6e 73 20 41 64 64 20 5c 0d 0a 20 20 20 20  ions Add \..    
aba0: 20 20 20 20 20 20 24 64 62 20 24 63 6f 6e 6e 65        $db $conne
abb0: 63 74 69 6f 6e 0d 0a 20 20 20 20 7d 0d 0a 0c 0d  ction..    }....
abc0: 0a 20 20 20 20 70 72 6f 63 20 63 6c 65 61 6e 75  .    proc cleanu
abd0: 70 44 62 20 7b 20 66 69 6c 65 4e 61 6d 65 20 7b  pDb { fileName {
abe0: 76 61 72 4e 61 6d 65 20 64 62 7d 20 7b 63 6f 6c  varName db} {col
abf0: 6c 65 63 74 20 74 72 75 65 7d 20 7b 71 75 61 6c  lect true} {qual
ac00: 69 66 79 20 74 72 75 65 7d 0d 0a 20 20 20 20 20  ify true}..     
ac10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ac20: 7b 64 65 6c 65 74 65 20 74 72 75 65 7d 20 7d 20  {delete true} } 
ac30: 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  {..      #..    
ac40: 20 20 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70    # NOTE: Attemp
ac50: 74 20 74 6f 20 66 6f 72 63 65 20 61 6c 6c 20 70  t to force all p
ac60: 65 6e 64 69 6e 67 20 22 67 61 72 62 61 67 65 22  ending "garbage"
ac70: 20 6f 62 6a 65 63 74 73 20 74 6f 20 62 65 20 63   objects to be c
ac80: 6f 6c 6c 65 63 74 65 64 2c 0d 0a 20 20 20 20 20  ollected,..     
ac90: 20 23 20 20 20 20 20 20 20 69 6e 63 6c 75 64 69   #       includi
aca0: 6e 67 20 53 51 4c 69 74 65 20 73 74 61 74 65 6d  ng SQLite statem
acb0: 65 6e 74 73 20 61 6e 64 20 62 61 63 6b 75 70 20  ents and backup 
acc0: 6f 62 6a 65 63 74 73 3b 20 74 68 69 73 20 73 68  objects; this sh
acd0: 6f 75 6c 64 20 61 6c 6c 6f 77 0d 0a 20 20 20 20  ould allow..    
ace0: 20 20 23 20 20 20 20 20 20 20 74 68 65 20 75 6e    #       the un
acf0: 64 65 72 6c 79 69 6e 67 20 64 61 74 61 62 61 73  derlying databas
ad00: 65 20 66 69 6c 65 20 74 6f 20 62 65 20 64 65 6c  e file to be del
ad10: 65 74 65 64 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  eted...      #..
ad20: 20 20 20 20 20 20 69 66 20 7b 24 63 6f 6c 6c 65        if {$colle
ad30: 63 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  ct} then {..    
ad40: 20 20 20 20 63 6f 6c 6c 65 63 74 47 61 72 62 61      collectGarba
ad50: 67 65 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ge $::test_chann
ad60: 65 6c 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  el..      }.... 
ad70: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
ad80: 4e 4f 54 45 3a 20 52 65 66 65 72 20 74 6f 20 74  NOTE: Refer to t
ad90: 68 65 20 73 70 65 63 69 66 69 65 64 20 76 61 72  he specified var
ada0: 69 61 62 6c 65 20 28 65 2e 67 2e 20 22 64 62 22  iable (e.g. "db"
adb0: 29 20 69 6e 20 74 68 65 20 63 6f 6e 74 65 78 74  ) in the context
adc0: 20 6f 66 20 6f 75 72 0d 0a 20 20 20 20 20 20 23   of our..      #
add0: 20 20 20 20 20 20 20 63 61 6c 6c 65 72 2e 20 20         caller.  
ade0: 54 68 65 20 68 61 6e 64 6c 65 20 74 6f 20 74 68  The handle to th
adf0: 65 20 64 61 74 61 62 61 73 65 20 70 72 65 76 69  e database previ
ae00: 6f 75 73 6c 79 20 6f 70 65 6e 65 64 20 76 69 61  ously opened via
ae10: 20 74 68 65 0d 0a 20 20 20 20 20 20 23 20 20 20   the..      #   
ae20: 20 20 20 20 5b 73 65 74 75 70 44 62 5d 20 70 72      [setupDb] pr
ae30: 6f 63 65 64 75 72 65 20 73 68 6f 75 6c 64 20 62  ocedure should b
ae40: 65 20 73 74 6f 72 65 64 20 74 68 65 72 65 2e 0d  e stored there..
ae50: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
ae60: 75 70 76 61 72 20 31 20 24 76 61 72 4e 61 6d 65  upvar 1 $varName
ae70: 20 64 62 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a   db....      #..
ae80: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 6c        # NOTE: Cl
ae90: 6f 73 65 20 74 68 65 20 63 6f 6e 6e 65 63 74 69  ose the connecti
aea0: 6f 6e 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  on to the databa
aeb0: 73 65 20 6e 6f 77 2e 20 20 54 68 69 73 20 73 68  se now.  This sh
aec0: 6f 75 6c 64 20 61 6c 6c 6f 77 20 75 73 0d 0a 20  ould allow us.. 
aed0: 20 20 20 20 20 23 20 20 20 20 20 20 20 74 6f 20       #       to 
aee0: 64 65 6c 65 74 65 20 74 68 65 20 75 6e 64 65 72  delete the under
aef0: 6c 79 69 6e 67 20 64 61 74 61 62 61 73 65 20 66  lying database f
af00: 69 6c 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ile...      #.. 
af10: 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65       if {[info e
af20: 78 69 73 74 73 20 64 62 5d 20 26 26 20 5b 63 61  xists db] && [ca
af30: 74 63 68 20 7b 73 71 6c 20 63 6c 6f 73 65 20 24  tch {sql close $
af40: 64 62 7d 20 65 72 72 6f 72 5d 7d 20 74 68 65 6e  db} error]} then
af50: 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20   {..        #.. 
af60: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 57         # NOTE: W
af70: 65 20 73 6f 6d 65 68 6f 77 20 66 61 69 6c 65 64  e somehow failed
af80: 20 74 6f 20 63 6c 6f 73 65 20 74 68 65 20 64 61   to close the da
af90: 74 61 62 61 73 65 2c 20 72 65 70 6f 72 74 20 77  tabase, report w
afa0: 68 79 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  hy...        #..
afb0: 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
afc0: 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61  :test_channel [a
afd0: 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
afe0: 20 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57           "==== W
aff0: 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20 74  ARNING: failed t
b000: 6f 20 63 6c 6f 73 65 20 64 61 74 61 62 61 73 65  o close database
b010: 20 5c 22 22 20 24 64 62 20 22 5c 22 2c 20 65 72   \"" $db "\", er
b020: 72 6f 72 3a 20 22 20 5c 0d 0a 20 20 20 20 20 20  ror: " \..      
b030: 20 20 20 20 20 20 5c 6e 5c 74 20 24 65 72 72 6f        \n\t $erro
b040: 72 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a  r \n]..      }..
b050: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
b060: 20 23 20 4e 4f 54 45 3a 20 46 69 72 73 74 2c 20   # NOTE: First, 
b070: 73 65 65 20 69 66 20 6f 75 72 20 63 61 6c 6c 65  see if our calle
b080: 72 20 68 61 73 20 72 65 71 75 65 73 74 65 64 20  r has requested 
b090: 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  an in-memory dat
b0a0: 61 62 61 73 65 2e 0d 0a 20 20 20 20 20 20 23 0d  abase...      #.
b0b0: 0a 20 20 20 20 20 20 73 65 74 20 69 73 4d 65 6d  .      set isMem
b0c0: 6f 72 79 20 5b 69 73 4d 65 6d 6f 72 79 44 62 20  ory [isMemoryDb 
b0d0: 24 66 69 6c 65 4e 61 6d 65 5d 0d 0a 0d 0a 20 20  $fileName]....  
b0e0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
b0f0: 4f 54 45 3a 20 42 75 69 6c 64 20 74 68 65 20 66  OTE: Build the f
b100: 75 6c 6c 20 70 61 74 68 20 74 6f 20 74 68 65 20  ull path to the 
b110: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6e 61  database file na
b120: 6d 65 2e 20 20 46 6f 72 20 6e 6f 77 2c 20 61 6c  me.  For now, al
b130: 6c 20 74 65 73 74 0d 0a 20 20 20 20 20 20 23 20  l test..      # 
b140: 20 20 20 20 20 20 64 61 74 61 62 61 73 65 20 66        database f
b150: 69 6c 65 73 20 61 72 65 20 73 74 6f 72 65 64 20  iles are stored 
b160: 69 6e 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  in the temporary
b170: 20 64 69 72 65 63 74 6f 72 79 2e 0d 0a 20 20 20   directory...   
b180: 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
b190: 21 24 69 73 4d 65 6d 6f 72 79 20 26 26 20 24 71  !$isMemory && $q
b1a0: 75 61 6c 69 66 79 7d 20 74 68 65 6e 20 7b 0d 0a  ualify} then {..
b1b0: 20 20 20 20 20 20 20 20 73 65 74 20 66 69 6c 65          set file
b1c0: 4e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20  Name [file join 
b1d0: 5b 67 65 74 44 61 74 61 62 61 73 65 44 69 72 65  [getDatabaseDire
b1e0: 63 74 6f 72 79 5d 20 5b 66 69 6c 65 20 74 61 69  ctory] [file tai
b1f0: 6c 20 24 66 69 6c 65 4e 61 6d 65 5d 5d 0d 0a 20  l $fileName]].. 
b200: 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
b210: 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
b220: 20 43 68 65 63 6b 20 69 66 20 74 68 65 20 66 69   Check if the fi
b230: 6c 65 20 73 74 69 6c 6c 20 65 78 69 73 74 73 2e  le still exists.
b240: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
b250: 20 69 66 20 7b 21 24 69 73 4d 65 6d 6f 72 79 20   if {!$isMemory 
b260: 26 26 20 24 64 65 6c 65 74 65 20 26 26 20 5b 66  && $delete && [f
b270: 69 6c 65 20 65 78 69 73 74 73 20 24 66 69 6c 65  ile exists $file
b280: 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  Name]} then {.. 
b290: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
b2a0: 20 20 23 20 4e 4f 54 45 3a 20 53 6b 69 70 20 64    # NOTE: Skip d
b2b0: 65 6c 65 74 69 6e 67 20 64 61 74 61 62 61 73 65  eleting database
b2c0: 20 66 69 6c 65 73 20 69 66 20 73 6f 6d 65 62 6f   files if somebo
b2d0: 64 79 20 73 65 74 73 20 74 68 65 20 67 6c 6f 62  dy sets the glob
b2e0: 61 6c 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  al..        #   
b2f0: 20 20 20 20 76 61 72 69 61 62 6c 65 20 74 6f 20      variable to 
b300: 70 72 65 76 65 6e 74 20 69 74 2e 0d 0a 20 20 20  prevent it...   
b310: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
b320: 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74  if {![info exist
b330: 73 20 3a 3a 6e 6f 28 63 6c 65 61 6e 75 70 44 62  s ::no(cleanupDb
b340: 46 69 6c 65 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a  File)]} then {..
b350: 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
b360: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41         # NOTE: A
b370: 74 74 65 6d 70 74 20 74 6f 20 64 65 6c 65 74 65  ttempt to delete
b380: 20 74 68 65 20 74 65 73 74 20 64 61 74 61 62 61   the test databa
b390: 73 65 20 66 69 6c 65 20 6e 6f 77 2e 0d 0a 20 20  se file now...  
b3a0: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
b3b0: 20 20 20 20 20 69 66 20 7b 5b 73 65 74 20 63 6f       if {[set co
b3c0: 64 65 20 5b 63 61 74 63 68 20 7b 66 69 6c 65 20  de [catch {file 
b3d0: 64 65 6c 65 74 65 20 24 66 69 6c 65 4e 61 6d 65  delete $fileName
b3e0: 7d 20 65 72 72 6f 72 5d 5d 7d 20 74 68 65 6e 20  } error]]} then 
b3f0: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23  {..            #
b400: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 20  ..            # 
b410: 4e 4f 54 45 3a 20 57 65 20 73 6f 6d 65 68 6f 77  NOTE: We somehow
b420: 20 66 61 69 6c 65 64 20 74 6f 20 64 65 6c 65 74   failed to delet
b430: 65 20 74 68 65 20 66 69 6c 65 2c 20 72 65 70 6f  e the file, repo
b440: 72 74 20 77 68 79 2e 0d 0a 20 20 20 20 20 20 20  rt why...       
b450: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
b460: 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
b470: 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e  t_channel [appen
b480: 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
b490: 20 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57           "==== W
b4a0: 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20 74  ARNING: failed t
b4b0: 6f 20 64 65 6c 65 74 65 20 64 61 74 61 62 61 73  o delete databas
b4c0: 65 20 66 69 6c 65 20 5c 22 22 20 24 66 69 6c 65  e file \"" $file
b4d0: 4e 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20 20 20  Name \..        
b4e0: 20 20 20 20 20 20 20 20 22 5c 22 20 64 75 72 69          "\" duri
b4f0: 6e 67 20 63 6c 65 61 6e 75 70 2c 20 65 72 72 6f  ng cleanup, erro
b500: 72 3a 20 22 20 5c 6e 5c 74 20 24 65 72 72 6f 72  r: " \n\t $error
b510: 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20   \n]..          
b520: 7d 0d 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73  }..        } els
b530: 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 23  e {..          #
b540: 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f  ..          # NO
b550: 54 45 3a 20 53 68 6f 77 20 74 68 61 74 20 77 65  TE: Show that we
b560: 20 73 6b 69 70 70 65 64 20 64 65 6c 65 74 69 6e   skipped deletin
b570: 67 20 74 68 65 20 66 69 6c 65 2e 0d 0a 20 20 20  g the file...   
b580: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
b590: 20 20 20 20 73 65 74 20 63 6f 64 65 20 30 0d 0a      set code 0..
b5a0: 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70 75 74  ..          tput
b5b0: 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
b5c0: 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
b5d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22  .              "
b5e0: 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 73 6b  ==== WARNING: sk
b5f0: 69 70 70 65 64 20 64 65 6c 65 74 69 6e 67 20 64  ipped deleting d
b600: 61 74 61 62 61 73 65 20 66 69 6c 65 20 5c 22 22  atabase file \""
b610: 20 24 66 69 6c 65 4e 61 6d 65 20 5c 0d 0a 20 20   $fileName \..  
b620: 20 20 20 20 20 20 20 20 20 20 20 20 22 5c 22 20              "\" 
b630: 64 75 72 69 6e 67 20 63 6c 65 61 6e 75 70 5c 6e  during cleanup\n
b640: 22 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20  "]..        }.. 
b650: 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
b660: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
b670: 20 20 23 20 4e 4f 54 45 3a 20 54 68 65 20 66 69    # NOTE: The fi
b680: 6c 65 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73  le does not exis
b690: 74 2c 20 73 75 63 63 65 73 73 21 0d 0a 20 20 20  t, success!..   
b6a0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
b6b0: 73 65 74 20 63 6f 64 65 20 30 0d 0a 20 20 20 20  set code 0..    
b6c0: 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65 74    }....      ret
b6d0: 75 72 6e 20 24 63 6f 64 65 0d 0a 20 20 20 20 7d  urn $code..    }
b6e0: 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 73 65  .....    proc se
b6f0: 74 75 70 44 62 49 6e 74 65 72 72 75 70 74 43 61  tupDbInterruptCa
b700: 6c 6c 62 61 63 6b 20 7b 20 63 68 61 6e 6e 65 6c  llback { channel
b710: 20 6c 6f 67 20 7d 20 7b 0d 0a 20 20 20 20 20 20   log } {..      
b720: 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 22  tputs $channel "
b730: 2d 2d 2d 2d 20 73 65 74 74 69 6e 67 20 75 70 20  ---- setting up 
b740: 64 65 62 75 67 67 65 72 20 69 6e 74 65 72 72 75  debugger interru
b750: 70 74 20 63 61 6c 6c 62 61 63 6b 2e 2e 2e 20 22  pt callback... "
b760: 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 63  ....      if {[c
b770: 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20  atch {..        
b780: 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
b790: 45 3a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  E: Make sure the
b7a0: 20 73 63 72 69 70 74 20 64 65 62 75 67 67 65 72   script debugger
b7b0: 20 61 6e 64 20 74 68 65 20 69 73 6f 6c 61 74 65   and the isolate
b7c0: 64 20 69 6e 74 65 72 70 72 65 74 65 72 20 61 72  d interpreter ar
b7d0: 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  e..        #    
b7e0: 20 20 20 73 65 74 75 70 20 61 6e 64 20 72 65 61     setup and rea
b7f0: 64 79 20 66 6f 72 20 75 73 65 2e 0d 0a 20 20 20  dy for use...   
b800: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
b810: 64 65 62 75 67 20 73 65 74 75 70 20 74 72 75 65  debug setup true
b820: 20 74 72 75 65 0d 0a 0d 0a 20 20 20 20 20 20 20   true....       
b830: 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
b840: 54 45 3a 20 4c 6f 61 64 20 74 68 65 20 6e 65 63  TE: Load the nec
b850: 65 73 73 61 72 79 20 70 61 63 6b 61 67 65 73 20  essary packages 
b860: 69 6e 74 6f 20 74 68 65 20 69 73 6f 6c 61 74 65  into the isolate
b870: 64 20 69 6e 74 65 72 70 72 65 74 65 72 2e 0d 0a  d interpreter...
b880: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
b890: 20 20 20 64 65 62 75 67 20 65 76 61 6c 20 7b 0d     debug eval {.
b8a0: 0a 20 20 20 20 20 20 20 20 20 20 70 61 63 6b 61  .          packa
b8b0: 67 65 20 72 65 71 75 69 72 65 20 45 61 67 6c 65  ge require Eagle
b8c0: 0d 0a 20 20 20 20 20 20 20 20 20 20 70 61 63 6b  ..          pack
b8d0: 61 67 65 20 72 65 71 75 69 72 65 20 45 61 67 6c  age require Eagl
b8e0: 65 2e 4c 69 62 72 61 72 79 0d 0a 20 20 20 20 20  e.Library..     
b8f0: 20 20 20 20 20 70 61 63 6b 61 67 65 20 72 65 71       package req
b900: 75 69 72 65 20 45 61 67 6c 65 2e 54 65 73 74 0d  uire Eagle.Test.
b910: 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  .        }....  
b920: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
b930: 20 23 20 4e 4f 54 45 3a 20 43 6f 70 79 20 74 68   # NOTE: Copy th
b940: 65 20 6e 65 63 65 73 73 61 72 79 20 76 61 72 69  e necessary vari
b950: 61 62 6c 65 73 20 69 6e 74 6f 20 74 68 65 20 69  ables into the i
b960: 73 6f 6c 61 74 65 64 20 69 6e 74 65 72 70 72 65  solated interpre
b970: 74 65 72 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  ter...        #.
b980: 0a 20 20 20 20 20 20 20 20 64 65 62 75 67 20 69  .        debug i
b990: 6e 76 6f 6b 65 20 30 20 73 65 74 20 3a 3a 74 65  nvoke 0 set ::te
b9a0: 73 74 5f 63 68 61 6e 6e 65 6c 20 24 63 68 61 6e  st_channel $chan
b9b0: 6e 65 6c 3b 20 23 20 4e 4f 54 45 3a 20 46 6f 72  nel; # NOTE: For
b9c0: 20 5b 74 70 75 74 73 5d 2e 0d 0a 20 20 20 20 20   [tputs]...     
b9d0: 20 20 20 64 65 62 75 67 20 69 6e 76 6f 6b 65 20     debug invoke 
b9e0: 30 20 73 65 74 20 3a 3a 74 65 73 74 5f 6c 6f 67  0 set ::test_log
b9f0: 20 24 6c 6f 67 3b 20 23 20 4e 4f 54 45 3a 20 46   $log; # NOTE: F
ba00: 6f 72 20 5b 74 6c 6f 67 5d 2e 0d 0a 0d 0a 20 20  or [tlog].....  
ba10: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
ba20: 20 23 20 4e 4f 54 45 3a 20 49 6e 73 74 61 6c 6c   # NOTE: Install
ba30: 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 73 63   the callback sc
ba40: 72 69 70 74 20 74 6f 20 62 65 20 65 76 61 6c 75  ript to be evalu
ba50: 61 74 65 64 20 69 6e 20 74 68 65 20 69 73 6f 6c  ated in the isol
ba60: 61 74 65 64 0d 0a 20 20 20 20 20 20 20 20 23 20  ated..        # 
ba70: 20 20 20 20 20 20 69 6e 74 65 72 70 72 65 74 65        interprete
ba80: 72 20 77 68 65 6e 20 74 68 69 73 20 69 6e 74 65  r when this inte
ba90: 72 70 72 65 74 65 72 20 69 73 20 69 6e 74 65 72  rpreter is inter
baa0: 72 75 70 74 65 64 20 62 79 20 73 63 72 69 70 74  rupted by script
bab0: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
bac0: 20 20 63 61 6e 63 65 6c 6c 61 74 69 6f 6e 2c 20    cancellation, 
bad0: 65 74 63 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  etc...        #.
bae0: 0a 20 20 20 20 20 20 20 20 64 65 62 75 67 20 63  .        debug c
baf0: 61 6c 6c 62 61 63 6b 20 61 70 70 6c 79 20 7b 7b  allback apply {{
bb00: 73 65 6e 64 65 72 20 65 7d 20 7b 0d 0a 20 20 20  sender e} {..   
bb10: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
bb20: 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68 65 63      # NOTE: Chec
bb30: 6b 20 69 66 20 74 68 69 73 20 63 61 6c 6c 62 61  k if this callba
bb40: 63 6b 20 69 73 20 6f 6e 65 20 74 68 61 74 20 77  ck is one that w
bb50: 65 20 63 61 72 65 20 61 62 6f 75 74 2e 0d 0a 20  e care about... 
bb60: 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
bb70: 20 20 20 20 20 20 69 66 20 7b 22 43 61 6e 63 65        if {"Cance
bb80: 6c 65 64 22 20 69 6e 20 5b 73 70 6c 69 74 20 5b  led" in [split [
bb90: 24 65 20 49 6e 74 65 72 72 75 70 74 54 79 70 65  $e InterruptType
bba0: 5d 20 22 2c 20 22 5d 7d 20 74 68 65 6e 20 7b 0d  ] ", "]} then {.
bbb0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a  .            #..
bbc0: 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f              # NO
bbd0: 54 45 3a 20 49 74 65 72 61 74 65 20 74 68 72 6f  TE: Iterate thro
bbe0: 75 67 68 20 61 6c 6c 20 64 61 74 61 62 61 73 65  ugh all database
bbf0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 6b 6e 6f   connections kno
bc00: 77 6e 20 74 6f 20 74 68 65 0d 0a 20 20 20 20 20  wn to the..     
bc10: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 70         #       p
bc20: 61 72 65 6e 74 20 69 6e 74 65 72 70 72 65 74 65  arent interprete
bc30: 72 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  r...            
bc40: 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 6f  #..            o
bc50: 62 6a 65 63 74 20 66 6f 72 65 61 63 68 20 2d 61  bject foreach -a
bc60: 6c 69 61 73 20 70 61 69 72 20 5c 0d 0a 20 20 20  lias pair \..   
bc70: 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 6f 62               [ob
bc80: 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61  ject invoke -fla
bc90: 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 24 65  gs +NonPublic $e
bca0: 20 49 6e 74 65 72 70 72 65 74 65 72 2e 63 6f 6e   Interpreter.con
bcb0: 6e 65 63 74 69 6f 6e 73 5d 20 7b 0d 0a 20 20 20  nections] {..   
bcc0: 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
bcd0: 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f              # NO
bce0: 54 45 3a 20 41 74 74 65 6d 70 74 20 74 6f 20 63  TE: Attempt to c
bcf0: 61 6e 63 65 6c 20 61 6e 79 20 53 51 4c 20 71 75  ancel any SQL qu
bd00: 65 72 69 65 73 20 69 6e 20 70 72 6f 67 72 65 73  eries in progres
bd10: 73 20 6f 6e 20 74 68 69 73 0d 0a 20 20 20 20 20  s on this..     
bd20: 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20           #      
bd30: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
bd40: 74 69 6f 6e 2e 0d 0a 20 20 20 20 20 20 20 20 20  tion...         
bd50: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
bd60: 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68        if {[catch
bd70: 20 7b 24 70 61 69 72 20 56 61 6c 75 65 2e 43 61   {$pair Value.Ca
bd80: 6e 63 65 6c 7d 20 65 72 72 6f 72 5d 20 21 3d 20  ncel} error] != 
bd90: 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
bda0: 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
bdb0: 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
bdc0: 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 6e 20   [appendArgs \n 
bdd0: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
bde0: 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52         "==== WAR
bdf0: 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20 74 6f 20  NING: failed to 
be00: 63 61 6e 63 65 6c 20 71 75 65 72 79 20 66 6f 72  cancel query for
be10: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 5c 22 22 20   connection \"" 
be20: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
be30: 20 20 20 20 20 20 20 5b 24 70 61 69 72 20 4b 65         [$pair Ke
be40: 79 5d 20 22 5c 22 2c 20 65 72 72 6f 72 3a 20 22  y] "\", error: "
be50: 20 5c 6e 5c 74 20 24 65 72 72 6f 72 20 5c 6e 5d   \n\t $error \n]
be60: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
be70: 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  }..            }
be80: 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20  ..          }.. 
be90: 20 20 20 20 20 20 20 7d 7d 0d 0a 20 20 20 20 20         }}..     
bea0: 20 7d 20 65 72 72 6f 72 5d 20 3d 3d 20 30 7d 20   } error] == 0} 
beb0: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
bec0: 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 69 6e  addConstraint in
bed0: 74 65 72 72 75 70 74 43 61 6c 6c 62 61 63 6b 2e  terruptCallback.
bee0: 73 71 6c 69 74 65 33 0d 0a 0d 0a 20 20 20 20 20  sqlite3....     
bef0: 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
bf00: 6c 20 79 65 73 5c 6e 0d 0a 20 20 20 20 20 20 7d  l yes\n..      }
bf10: 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
bf20: 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
bf30: 5b 61 70 70 65 6e 64 41 72 67 73 20 22 6e 6f 2c  [appendArgs "no,
bf40: 20 65 72 72 6f 72 3a 20 22 20 5c 6e 5c 74 20 24   error: " \n\t $
bf50: 65 72 72 6f 72 20 5c 6e 5d 0d 0a 20 20 20 20 20  error \n]..     
bf60: 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20   }..    }.....  
bf70: 20 20 70 72 6f 63 20 63 6c 65 61 6e 75 70 46 69    proc cleanupFi
bf80: 6c 65 20 7b 20 66 69 6c 65 4e 61 6d 65 20 7b 63  le { fileName {c
bf90: 6f 6c 6c 65 63 74 20 74 72 75 65 7d 20 7b 66 6f  ollect true} {fo
bfa0: 72 63 65 20 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a  rce false} } {..
bfb0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
bfc0: 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74 20 74   NOTE: Attempt t
bfd0: 6f 20 66 6f 72 63 65 20 61 6c 6c 20 70 65 6e 64  o force all pend
bfe0: 69 6e 67 20 22 67 61 72 62 61 67 65 22 20 6f 62  ing "garbage" ob
bff0: 6a 65 63 74 73 20 74 6f 20 62 65 20 63 6f 6c 6c  jects to be coll
c000: 65 63 74 65 64 2c 0d 0a 20 20 20 20 20 20 23 20  ected,..      # 
c010: 20 20 20 20 20 20 69 6e 63 6c 75 64 69 6e 67 20        including 
c020: 53 51 4c 69 74 65 20 73 74 61 74 65 6d 65 6e 74  SQLite statement
c030: 73 20 61 6e 64 20 62 61 63 6b 75 70 20 6f 62 6a  s and backup obj
c040: 65 63 74 73 3b 20 74 68 69 73 20 73 68 6f 75 6c  ects; this shoul
c050: 64 20 61 6c 6c 6f 77 0d 0a 20 20 20 20 20 20 23  d allow..      #
c060: 20 20 20 20 20 20 20 74 68 65 20 75 6e 64 65 72         the under
c070: 6c 79 69 6e 67 20 64 61 74 61 62 61 73 65 20 66  lying database f
c080: 69 6c 65 20 74 6f 20 62 65 20 64 65 6c 65 74 65  ile to be delete
c090: 64 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  d...      #..   
c0a0: 20 20 20 69 66 20 7b 24 63 6f 6c 6c 65 63 74 7d     if {$collect}
c0b0: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
c0c0: 20 63 6f 6c 6c 65 63 74 47 61 72 62 61 67 65 20   collectGarbage 
c0d0: 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 0d  $::test_channel.
c0e0: 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
c0f0: 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
c100: 45 3a 20 43 68 65 63 6b 20 69 66 20 74 68 65 20  E: Check if the 
c110: 66 69 6c 65 20 73 74 69 6c 6c 20 65 78 69 73 74  file still exist
c120: 73 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  s...      #..   
c130: 20 20 20 69 66 20 7b 5b 66 69 6c 65 20 65 78 69     if {[file exi
c140: 73 74 73 20 24 66 69 6c 65 4e 61 6d 65 5d 7d 20  sts $fileName]} 
c150: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
c160: 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
c170: 45 3a 20 53 6b 69 70 20 64 65 6c 65 74 69 6e 67  E: Skip deleting
c180: 20 74 65 73 74 20 66 69 6c 65 73 20 69 66 20 73   test files if s
c190: 6f 6d 65 62 6f 64 79 20 73 65 74 73 20 74 68 65  omebody sets the
c1a0: 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65   global variable
c1b0: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
c1c0: 20 20 74 6f 20 70 72 65 76 65 6e 74 20 69 74 2e    to prevent it.
c1d0: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
c1e0: 20 20 20 20 20 69 66 20 7b 24 66 6f 72 63 65 20       if {$force 
c1f0: 7c 7c 20 21 5b 69 6e 66 6f 20 65 78 69 73 74 73  || ![info exists
c200: 20 3a 3a 6e 6f 28 63 6c 65 61 6e 75 70 46 69 6c   ::no(cleanupFil
c210: 65 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  e)]} then {..   
c220: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
c230: 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 74 74 65      # NOTE: Atte
c240: 6d 70 74 20 74 6f 20 64 65 6c 65 74 65 20 74 68  mpt to delete th
c250: 65 20 74 65 73 74 20 66 69 6c 65 20 6e 6f 77 2e  e test file now.
c260: 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20  ..          #.. 
c270: 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73 65           if {[se
c280: 74 20 63 6f 64 65 20 5b 63 61 74 63 68 20 7b 66  t code [catch {f
c290: 69 6c 65 20 64 65 6c 65 74 65 20 24 66 69 6c 65  ile delete $file
c2a0: 4e 61 6d 65 7d 20 65 72 72 6f 72 5d 5d 7d 20 74  Name} error]]} t
c2b0: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
c2c0: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
c2d0: 20 20 23 20 4e 4f 54 45 3a 20 57 65 20 73 6f 6d    # NOTE: We som
c2e0: 65 68 6f 77 20 66 61 69 6c 65 64 20 74 6f 20 64  ehow failed to d
c2f0: 65 6c 65 74 65 20 74 68 65 20 66 69 6c 65 2c 20  elete the file, 
c300: 72 65 70 6f 72 74 20 77 68 79 2e 0d 0a 20 20 20  report why...   
c310: 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
c320: 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
c330: 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61  :test_channel [a
c340: 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
c350: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 3d 3d               "==
c360: 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c  == WARNING: fail
c370: 65 64 20 74 6f 20 64 65 6c 65 74 65 20 74 65 73  ed to delete tes
c380: 74 20 66 69 6c 65 20 5c 22 22 20 24 66 69 6c 65  t file \"" $file
c390: 4e 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20 20 20  Name \..        
c3a0: 20 20 20 20 20 20 20 20 22 5c 22 20 64 75 72 69          "\" duri
c3b0: 6e 67 20 63 6c 65 61 6e 75 70 2c 20 65 72 72 6f  ng cleanup, erro
c3c0: 72 3a 20 22 20 5c 6e 5c 74 20 24 65 72 72 6f 72  r: " \n\t $error
c3d0: 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20   \n]..          
c3e0: 7d 0d 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73  }..        } els
c3f0: 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 23  e {..          #
c400: 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f  ..          # NO
c410: 54 45 3a 20 53 68 6f 77 20 74 68 61 74 20 77 65  TE: Show that we
c420: 20 73 6b 69 70 70 65 64 20 64 65 6c 65 74 69 6e   skipped deletin
c430: 67 20 74 68 65 20 66 69 6c 65 2e 0d 0a 20 20 20  g the file...   
c440: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
c450: 20 20 20 20 73 65 74 20 63 6f 64 65 20 30 0d 0a      set code 0..
c460: 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70 75 74  ..          tput
c470: 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
c480: 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
c490: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22  .              "
c4a0: 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 73 6b  ==== WARNING: sk
c4b0: 69 70 70 65 64 20 64 65 6c 65 74 69 6e 67 20 74  ipped deleting t
c4c0: 65 73 74 20 66 69 6c 65 20 5c 22 22 20 24 66 69  est file \"" $fi
c4d0: 6c 65 4e 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20  leName \..      
c4e0: 20 20 20 20 20 20 20 20 22 5c 22 20 64 75 72 69          "\" duri
c4f0: 6e 67 20 63 6c 65 61 6e 75 70 5c 6e 22 5d 0d 0a  ng cleanup\n"]..
c500: 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
c510: 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
c520: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
c530: 4e 4f 54 45 3a 20 54 68 65 20 66 69 6c 65 20 64  NOTE: The file d
c540: 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2c 20 73  oes not exist, s
c550: 75 63 63 65 73 73 21 0d 0a 20 20 20 20 20 20 20  uccess!..       
c560: 20 23 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20   #..        set 
c570: 63 6f 64 65 20 30 0d 0a 20 20 20 20 20 20 7d 0d  code 0..      }.
c580: 0a 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ...      return 
c590: 24 63 6f 64 65 0d 0a 20 20 20 20 7d 0d 0a 0c 0d  $code..    }....
c5a0: 0a 20 20 20 20 70 72 6f 63 20 63 6f 6c 6c 65 63  .    proc collec
c5b0: 74 47 61 72 62 61 67 65 20 7b 20 63 68 61 6e 6e  tGarbage { chann
c5c0: 65 6c 20 7b 6d 69 6c 6c 69 73 65 63 6f 6e 64 73  el {milliseconds
c5d0: 20 31 30 30 30 7d 20 7b 71 75 69 65 74 20 74 72   1000} {quiet tr
c5e0: 75 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 69  ue} } {..      i
c5f0: 66 20 7b 5b 63 61 74 63 68 20 7b 6f 62 6a 65 63  f {[catch {objec
c600: 74 20 69 6e 76 6f 6b 65 20 47 43 20 47 65 74 54  t invoke GC GetT
c610: 6f 74 61 6c 4d 65 6d 6f 72 79 20 66 61 6c 73 65  otalMemory false
c620: 7d 20 72 65 73 75 6c 74 5d 20 3d 3d 20 30 7d 20  } result] == 0} 
c630: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
c640: 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65  if {!$quiet} the
c650: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74  n {..          t
c660: 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61  puts $channel [a
c670: 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
c680: 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
c690: 20 6d 65 6d 6f 72 79 20 69 6e 20 75 73 65 20 62   memory in use b
c6a0: 79 20 74 68 65 20 43 4c 52 20 62 65 66 6f 72 65  y the CLR before
c6b0: 20 63 6f 6c 6c 65 63 74 69 6f 6e 2e 2e 2e 20 22   collection... "
c6c0: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
c6d0: 20 20 24 72 65 73 75 6c 74 20 22 20 62 79 74 65    $result " byte
c6e0: 73 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20 7d  s\n"]..        }
c6f0: 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b  ..      } else {
c700: 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20  ..        tputs 
c710: 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  $channel [append
c720: 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
c730: 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e      "==== WARNIN
c740: 47 3a 20 66 61 69 6c 65 64 20 74 6f 20 67 65 74  G: failed to get
c750: 20 43 4c 52 20 6d 65 6d 6f 72 79 20 75 73 61 67   CLR memory usag
c760: 65 2c 20 65 72 72 6f 72 3a 20 22 20 5c 0d 0a 20  e, error: " \.. 
c770: 20 20 20 20 20 20 20 20 20 20 20 5c 6e 5c 74 20             \n\t 
c780: 24 72 65 73 75 6c 74 20 5c 6e 5d 0d 0a 20 20 20  $result \n]..   
c790: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 23     }....      ##
c7a0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
c7b0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
c7c0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
c7d0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
c7e0: 23 23 23 23 23 23 23 0d 0a 0d 0a 20 20 20 20 20  #######....     
c7f0: 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
c800: 3a 20 52 65 70 65 61 74 65 64 6c 79 20 61 74 74  : Repeatedly att
c810: 65 6d 70 74 20 74 6f 20 63 6f 6c 6c 65 63 74 20  empt to collect 
c820: 67 61 72 62 61 67 65 20 75 6e 74 69 6c 20 74 68  garbage until th
c830: 65 20 61 6c 6c 6f 74 74 65 64 20 6e 75 6d 62 65  e allotted numbe
c840: 72 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  r..      #      
c850: 20 6f 66 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73   of milliseconds
c860: 20 68 61 73 20 65 6c 61 70 73 65 64 2e 20 20 41   has elapsed.  A
c870: 6c 77 61 79 73 20 61 74 74 65 6d 70 74 20 74 6f  lways attempt to
c880: 20 63 6f 6c 6c 65 63 74 20 67 61 72 62 61 67 65   collect garbage
c890: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
c8a0: 61 74 20 6c 65 61 73 74 20 6f 6e 63 65 2e 0d 0a  at least once...
c8b0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 73        #..      s
c8c0: 65 74 20 73 74 61 72 74 20 5b 63 6c 6f 63 6b 20  et start [clock 
c8d0: 73 65 63 6f 6e 64 73 5d 0d 0a 20 20 20 20 20 20  seconds]..      
c8e0: 73 65 74 20 73 74 6f 70 20 5b 65 78 70 72 20 7b  set stop [expr {
c8f0: 24 73 74 61 72 74 20 2b 20 28 24 6d 69 6c 6c 69  $start + ($milli
c900: 73 65 63 6f 6e 64 73 20 2f 20 31 30 30 30 29 7d  seconds / 1000)}
c910: 5d 0d 0a 0d 0a 20 20 20 20 20 20 64 6f 20 7b 0d  ]....      do {.
c920: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
c930: 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 74 74 65      # NOTE: Atte
c940: 6d 70 74 20 74 6f 20 66 6f 72 63 65 20 61 20 66  mpt to force a f
c950: 75 6c 6c 20 67 61 72 62 61 67 65 20 63 6f 6c 6c  ull garbage coll
c960: 65 63 74 69 6f 6e 20 6e 6f 77 2e 20 20 52 65 70  ection now.  Rep
c970: 6f 72 74 20 61 6e 79 0d 0a 20 20 20 20 20 20 20  ort any..       
c980: 20 23 20 20 20 20 20 20 20 65 72 72 6f 72 20 74   #       error t
c990: 68 61 74 20 69 73 20 65 6e 63 6f 75 6e 74 65 72  hat is encounter
c9a0: 65 64 20 69 66 20 77 65 20 66 61 69 6c 2e 0d 0a  ed if we fail...
c9b0: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
c9c0: 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 6f     if {[catch {o
c9d0: 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 47 43 20  bject invoke GC 
c9e0: 47 65 74 54 6f 74 61 6c 4d 65 6d 6f 72 79 20 74  GetTotalMemory t
c9f0: 72 75 65 7d 20 65 72 72 6f 72 5d 7d 20 74 68 65  rue} error]} the
ca00: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74  n {..          t
ca10: 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61  puts $channel [a
ca20: 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
ca30: 20 20 20 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d             "====
ca40: 20 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64   WARNING: failed
ca50: 20 66 75 6c 6c 20 67 61 72 62 61 67 65 20 63 6f   full garbage co
ca60: 6c 6c 65 63 74 69 6f 6e 2c 20 65 72 72 6f 72 3a  llection, error:
ca70: 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20   " \..          
ca80: 20 20 20 20 5c 6e 5c 74 20 24 65 72 72 6f 72 20      \n\t $error 
ca90: 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  \n]..        }..
caa0: 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 6e 6f  ..        set no
cab0: 77 20 5b 63 6c 6f 63 6b 20 73 65 63 6f 6e 64 73  w [clock seconds
cac0: 5d 0d 0a 20 20 20 20 20 20 7d 20 77 68 69 6c 65  ]..      } while
cad0: 20 7b 24 73 74 61 72 74 20 3c 3d 20 24 6e 6f 77   {$start <= $now
cae0: 20 26 26 20 24 6e 6f 77 20 3c 20 24 73 74 6f 70   && $now < $stop
caf0: 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 23 23 23 23  }....      #####
cb00: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
cb10: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
cb20: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
cb30: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
cb40: 23 23 23 23 0d 0a 0d 0a 20 20 20 20 20 20 69 66  ####....      if
cb50: 20 7b 5b 63 61 74 63 68 20 7b 6f 62 6a 65 63 74   {[catch {object
cb60: 20 69 6e 76 6f 6b 65 20 47 43 20 47 65 74 54 6f   invoke GC GetTo
cb70: 74 61 6c 4d 65 6d 6f 72 79 20 66 61 6c 73 65 7d  talMemory false}
cb80: 20 72 65 73 75 6c 74 5d 20 3d 3d 20 30 7d 20 74   result] == 0} t
cb90: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 69  hen {..        i
cba0: 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e  f {!$quiet} then
cbb0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70   {..          tp
cbc0: 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70  uts $channel [ap
cbd0: 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
cbe0: 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
cbf0: 6d 65 6d 6f 72 79 20 69 6e 20 75 73 65 20 62 79  memory in use by
cc00: 20 74 68 65 20 43 4c 52 20 61 66 74 65 72 20 63   the CLR after c
cc10: 6f 6c 6c 65 63 74 69 6f 6e 2e 2e 2e 20 22 20 5c  ollection... " \
cc20: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
cc30: 24 72 65 73 75 6c 74 20 22 20 62 79 74 65 73 5c  $result " bytes\
cc40: 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  n"]..        }..
cc50: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
cc60: 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
cc70: 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
cc80: 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
cc90: 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a    "==== WARNING:
cca0: 20 66 61 69 6c 65 64 20 74 6f 20 67 65 74 20 43   failed to get C
ccb0: 4c 52 20 6d 65 6d 6f 72 79 20 75 73 61 67 65 2c  LR memory usage,
ccc0: 20 65 72 72 6f 72 3a 20 22 20 5c 0d 0a 20 20 20   error: " \..   
ccd0: 20 20 20 20 20 20 20 20 20 5c 6e 5c 74 20 24 72           \n\t $r
cce0: 65 73 75 6c 74 20 5c 6e 5d 0d 0a 20 20 20 20 20  esult \n]..     
ccf0: 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20   }..    }.....  
cd00: 20 20 70 72 6f 63 20 67 65 74 53 51 4c 69 74 65    proc getSQLite
cd10: 48 61 6e 64 6c 65 43 6f 75 6e 74 73 20 7b 20 63  HandleCounts { c
cd20: 68 61 6e 6e 65 6c 20 7b 71 75 69 65 74 20 66 61  hannel {quiet fa
cd30: 6c 73 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20  lse} } {..      
cd40: 73 65 74 20 72 65 73 75 6c 74 20 5b 6c 69 73 74  set result [list
cd50: 5d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b  ]....      if {[
cd60: 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 5c  haveConstraint \
cd70: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
cd80: 64 65 66 69 6e 65 43 6f 6e 73 74 61 6e 74 2e 53  defineConstant.S
cd90: 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
cda0: 65 2e 43 4f 55 4e 54 5f 48 41 4e 44 4c 45 5d 7d  e.COUNT_HANDLE]}
cdb0: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
cdc0: 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
cdd0: 54 45 3a 20 41 64 64 20 65 61 63 68 20 63 72 69  TE: Add each cri
cde0: 74 69 63 61 6c 20 68 61 6e 64 6c 65 20 63 6f 75  tical handle cou
cdf0: 6e 74 20 74 6f 20 74 68 65 20 72 65 73 75 6c 74  nt to the result
ce00: 69 6e 67 20 6c 69 73 74 2e 0d 0a 20 20 20 20 20  ing list...     
ce10: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 66 6f     #..        fo
ce20: 72 65 61 63 68 20 6e 61 6d 65 20 5b 6c 69 73 74  reach name [list
ce30: 20 63 6f 6e 6e 65 63 74 69 6f 6e 43 6f 75 6e 74   connectionCount
ce40: 20 73 74 61 74 65 6d 65 6e 74 43 6f 75 6e 74 20   statementCount 
ce50: 62 61 63 6b 75 70 43 6f 75 6e 74 5d 20 7b 0d 0a  backupCount] {..
ce60: 20 20 20 20 20 20 20 20 20 20 73 65 74 20 76 61            set va
ce70: 6c 75 65 20 5b 6f 62 6a 65 63 74 20 69 6e 76 6f  lue [object invo
ce80: 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75  ke -flags +NonPu
ce90: 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20 20 20  blic \..        
cea0: 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74        System.Dat
ceb0: 61 2e 53 51 4c 69 74 65 2e 55 6e 73 61 66 65 4e  a.SQLite.UnsafeN
cec0: 61 74 69 76 65 4d 65 74 68 6f 64 73 20 24 6e 61  ativeMethods $na
ced0: 6d 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  me]....         
cee0: 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68   if {!$quiet} th
cef0: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
cf00: 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
cf10: 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
cf20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cf30: 22 2d 2d 2d 2d 20 63 72 69 74 69 63 61 6c 20 68  "---- critical h
cf40: 61 6e 64 6c 65 20 63 6f 75 6e 74 20 5c 22 22 20  andle count \"" 
cf50: 24 6e 61 6d 65 20 22 5c 22 20 69 73 20 22 20 24  $name "\" is " $
cf60: 76 61 6c 75 65 20 5c 6e 5d 0d 0a 20 20 20 20 20  value \n]..     
cf70: 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
cf80: 20 20 20 20 6c 61 70 70 65 6e 64 20 72 65 73 75      lappend resu
cf90: 6c 74 20 24 76 61 6c 75 65 0d 0a 20 20 20 20 20  lt $value..     
cfa0: 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 20 65 6c     }..      } el
cfb0: 73 65 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74  seif {!$quiet} t
cfc0: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  hen {..        #
cfd0: 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
cfe0: 3a 20 54 68 65 20 61 63 74 75 61 6c 20 68 61 6e  : The actual han
cff0: 64 6c 65 20 63 6f 75 6e 74 73 20 61 72 65 20 6e  dle counts are n
d000: 6f 74 20 61 76 61 69 6c 61 62 6c 65 3b 20 74 68  ot available; th
d010: 65 72 65 66 6f 72 65 2c 20 6a 75 73 74 0d 0a 20  erefore, just.. 
d020: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 72         #       r
d030: 65 74 75 72 6e 20 61 6e 20 65 6d 70 74 79 20 6c  eturn an empty l
d040: 69 73 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  ist...        #.
d050: 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24  .        tputs $
d060: 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 63 72  channel "---- cr
d070: 69 74 69 63 61 6c 20 68 61 6e 64 6c 65 20 63 6f  itical handle co
d080: 75 6e 74 73 20 75 6e 61 76 61 69 6c 61 62 6c 65  unts unavailable
d090: 5c 6e 22 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a  \n"..      }....
d0a0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 72 65        return $re
d0b0: 73 75 6c 74 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a  sult..    }.....
d0c0: 20 20 20 20 70 72 6f 63 20 73 68 75 74 64 6f 77      proc shutdow
d0d0: 6e 53 51 4c 69 74 65 20 7b 20 63 68 61 6e 6e 65  nSQLite { channe
d0e0: 6c 20 7b 66 6f 72 63 65 20 66 61 6c 73 65 7d 20  l {force false} 
d0f0: 7b 71 75 69 65 74 20 66 61 6c 73 65 7d 20 7d 20  {quiet false} } 
d100: 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  {..      #..    
d110: 20 20 23 20 4e 4f 54 45 3a 20 4d 61 6b 65 20 73    # NOTE: Make s
d120: 75 72 65 20 74 68 61 74 20 53 51 4c 69 74 65 20  ure that SQLite 
d130: 63 6f 72 65 20 6c 69 62 72 61 72 79 20 69 73 20  core library is 
d140: 63 6f 6d 70 6c 65 74 65 6c 79 20 73 68 75 74 64  completely shutd
d150: 6f 77 6e 2e 20 20 54 68 69 73 0d 0a 20 20 20 20  own.  This..    
d160: 20 20 23 20 20 20 20 20 20 20 69 73 20 75 73 65    #       is use
d170: 64 20 62 79 20 74 65 73 74 73 20 74 68 61 74 20  d by tests that 
d180: 63 68 61 6e 67 65 20 63 6f 6e 66 69 67 75 72 61  change configura
d190: 74 69 6f 6e 20 6f 70 74 69 6f 6e 73 20 61 6e 64  tion options and
d1a0: 2f 6f 72 20 74 68 6f 73 65 0d 0a 20 20 20 20 20  /or those..     
d1b0: 20 23 20 20 20 20 20 20 20 74 68 61 74 20 6e 65   #       that ne
d1c0: 65 64 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20  ed to make sure 
d1d0: 6c 6f 67 67 69 6e 67 20 69 73 20 69 6e 69 74 69  logging is initi
d1e0: 61 6c 69 7a 65 64 20 28 69 2e 65 2e 20 6a 75 73  alized (i.e. jus
d1f0: 74 20 69 6e 20 63 61 73 65 0d 0a 20 20 20 20 20  t in case..     
d200: 20 23 20 20 20 20 20 20 20 74 68 65 20 53 51 4c   #       the SQL
d210: 69 74 65 20 63 6f 72 65 20 6c 69 62 72 61 72 79  ite core library
d220: 20 77 61 73 20 69 6e 69 74 69 61 6c 69 7a 65 64   was initialized
d230: 20 69 6e 20 74 68 65 20 70 72 6f 63 65 73 73 20   in the process 
d240: 70 72 69 6f 72 20 74 6f 0d 0a 20 20 20 20 20 20  prior to..      
d250: 23 20 20 20 20 20 20 20 74 68 65 20 53 51 4c 69  #       the SQLi
d260: 74 65 4c 6f 67 20 63 6c 61 73 73 20 62 65 69 6e  teLog class bein
d270: 67 20 61 62 6c 65 20 74 6f 20 73 65 74 75 70 20  g able to setup 
d280: 69 74 73 20 6c 6f 67 67 69 6e 67 20 63 61 6c 6c  its logging call
d290: 62 61 63 6b 29 2e 0d 0a 20 20 20 20 20 20 23 20  back)...      # 
d2a0: 20 20 20 20 20 20 4e 6f 72 6d 61 6c 6c 79 2c 20        Normally, 
d2b0: 74 68 69 73 20 73 68 6f 75 6c 64 20 6f 6e 6c 79  this should only
d2c0: 20 62 65 20 70 65 72 66 6f 72 6d 65 64 20 69 66   be performed if
d2d0: 20 53 51 4c 69 74 65 20 69 73 20 6c 6f 61 64 65   SQLite is loade
d2e0: 64 20 61 6e 64 0d 0a 20 20 20 20 20 20 23 20 20  d and..      #  
d2f0: 20 20 20 20 20 72 65 61 64 79 20 66 6f 72 20 75       ready for u
d300: 73 65 20 62 79 20 74 68 65 20 74 65 73 74 20 73  se by the test s
d310: 75 69 74 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  uite...      #..
d320: 20 20 20 20 20 20 69 66 20 7b 24 66 6f 72 63 65        if {$force
d330: 20 7c 7c 20 5b 69 73 53 51 4c 69 74 65 52 65 61   || [isSQLiteRea
d340: 64 79 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  dy]} then {..   
d350: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
d360: 23 20 42 55 47 46 49 58 3a 20 42 65 66 6f 72 65  # BUGFIX: Before
d370: 20 63 61 6c 6c 69 6e 67 20 74 68 65 20 6e 61 74   calling the nat
d380: 69 76 65 20 73 68 75 74 64 6f 77 6e 20 66 75 6e  ive shutdown fun
d390: 63 74 69 6f 6e 2c 20 6d 61 6b 65 20 73 75 72 65  ction, make sure
d3a0: 20 62 6f 74 68 0d 0a 20 20 20 20 20 20 20 20 23   both..        #
d3b0: 20 20 20 20 20 20 20 20 20 6f 66 20 74 68 65 20           of the 
d3c0: 50 52 41 47 4d 41 20 72 65 6c 61 74 65 64 20 64  PRAGMA related d
d3d0: 69 72 65 63 74 6f 72 79 20 6e 61 6d 65 73 20 61  irectory names a
d3e0: 72 65 20 66 72 65 65 64 2e 0d 0a 20 20 20 20 20  re freed...     
d3f0: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 63 68     #..        ch
d400: 65 63 6b 46 6f 72 53 51 4c 69 74 65 44 69 72 65  eckForSQLiteDire
d410: 63 74 6f 72 69 65 73 20 24 63 68 61 6e 6e 65 6c  ctories $channel
d420: 20 74 72 75 65 0d 0a 0d 0a 20 20 20 20 20 20 20   true....       
d430: 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 6f 62 6a   if {[catch {obj
d440: 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67  ect invoke -flag
d450: 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a  s +NonPublic \..
d460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d470: 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
d480: 74 65 2e 55 6e 73 61 66 65 4e 61 74 69 76 65 4d  te.UnsafeNativeM
d490: 65 74 68 6f 64 73 20 5c 0d 0a 20 20 20 20 20 20  ethods \..      
d4a0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
d4b0: 33 5f 73 68 75 74 64 6f 77 6e 7d 20 72 65 73 75  3_shutdown} resu
d4c0: 6c 74 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b  lt] == 0} then {
d4d0: 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b  ..          if {
d4e0: 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d  !$quiet} then {.
d4f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75  .            tpu
d500: 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70  ts $channel [app
d510: 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
d520: 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
d530: 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 5f 73 68   call sqlite3_sh
d540: 75 74 64 6f 77 6e 28 29 2e 2e 2e 20 6f 6b 3a 20  utdown()... ok: 
d550: 22 20 24 72 65 73 75 6c 74 20 5c 6e 5d 0d 0a 20  " $result \n].. 
d560: 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
d570: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
d580: 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75          if {!$qu
d590: 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  iet} then {..   
d5a0: 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
d5b0: 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
d5c0: 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
d5d0: 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 61 6c         "---- cal
d5e0: 6c 20 73 71 6c 69 74 65 33 5f 73 68 75 74 64 6f  l sqlite3_shutdo
d5f0: 77 6e 28 29 2e 2e 2e 20 65 72 72 6f 72 3a 20 22  wn()... error: "
d600: 20 5c 6e 5c 74 20 24 72 65 73 75 6c 74 20 5c 6e   \n\t $result \n
d610: 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  ]..          }..
d620: 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
d630: 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20   }..    }.....  
d640: 20 20 70 72 6f 63 20 72 65 70 6f 72 74 53 51 4c    proc reportSQL
d650: 69 74 65 52 65 73 6f 75 72 63 65 73 20 7b 20 63  iteResources { c
d660: 68 61 6e 6e 65 6c 20 7b 71 75 69 65 74 20 66 61  hannel {quiet fa
d670: 6c 73 65 7d 20 7b 63 6f 6c 6c 65 63 74 20 74 72  lse} {collect tr
d680: 75 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23  ue} } {..      #
d690: 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
d6a0: 53 6b 69 70 20 61 6c 6c 20 6f 75 74 70 75 74 20  Skip all output 
d6b0: 69 66 20 77 65 20 61 72 65 20 72 75 6e 6e 69 6e  if we are runnin
d6c0: 67 20 69 6e 20 22 71 75 69 65 74 22 20 6d 6f 64  g in "quiet" mod
d6d0: 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  e...      #..   
d6e0: 20 20 20 69 66 20 7b 5b 68 61 76 65 43 6f 6e 73     if {[haveCons
d6f0: 74 72 61 69 6e 74 20 5c 0d 0a 20 20 20 20 20 20  traint \..      
d700: 20 20 20 20 20 20 20 20 64 65 66 69 6e 65 43 6f          defineCo
d710: 6e 73 74 61 6e 74 2e 53 79 73 74 65 6d 2e 44 61  nstant.System.Da
d720: 74 61 2e 53 51 4c 69 74 65 2e 54 52 41 43 4b 5f  ta.SQLite.TRACK_
d730: 4d 41 52 53 48 41 4c 5f 42 59 54 45 53 5d 7d 20  MARSHAL_BYTES]} 
d740: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
d750: 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65  if {!$quiet} the
d760: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74  n {..          t
d770: 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 22 2d  puts $channel "-
d780: 2d 2d 2d 20 63 75 72 72 65 6e 74 20 6d 65 6d 6f  --- current memo
d790: 72 79 20 69 6e 20 75 73 65 20 62 79 20 53 51 4c  ry in use by SQL
d7a0: 69 74 65 4d 61 72 73 68 61 6c 2e 2e 2e 20 22 0d  iteMarshal... ".
d7b0: 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  .        }....  
d7c0: 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68        if {[catch
d7d0: 20 7b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20   {object invoke 
d7e0: 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69  -flags +NonPubli
d7f0: 63 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  c \..           
d800: 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61       System.Data
d810: 2e 53 51 4c 69 74 65 2e 53 51 4c 69 74 65 4d 61  .SQLite.SQLiteMa
d820: 72 73 68 61 6c 20 5c 0d 0a 20 20 20 20 20 20 20  rshal \..       
d830: 20 20 20 20 20 20 20 20 20 62 79 74 65 73 41 6c           bytesAl
d840: 6c 6f 63 61 74 65 64 7d 20 6d 65 6d 6f 72 79 5d  located} memory]
d850: 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20   == 0} then {.. 
d860: 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71           if {!$q
d870: 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  uiet} then {..  
d880: 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
d890: 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  $channel [append
d8a0: 41 72 67 73 20 24 6d 65 6d 6f 72 79 20 22 20 62  Args $memory " b
d8b0: 79 74 65 73 5c 6e 22 5d 0d 0a 20 20 20 20 20 20  ytes\n"]..      
d8c0: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d      }..        }
d8d0: 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
d8e0: 20 20 20 73 65 74 20 6d 65 6d 6f 72 79 20 75 6e     set memory un
d8f0: 6b 6e 6f 77 6e 0d 0a 0d 0a 20 20 20 20 20 20 20  known....       
d900: 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20     if {!$quiet} 
d910: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
d920: 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
d930: 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 24  el [appendArgs $
d940: 6d 65 6d 6f 72 79 20 5c 6e 5d 0d 0a 20 20 20 20  memory \n]..    
d950: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
d960: 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66   }....        if
d970: 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20   {!$quiet} then 
d980: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70 75  {..          tpu
d990: 74 73 20 24 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d  ts $channel "---
d9a0: 2d 20 6d 61 78 69 6d 75 6d 20 6d 65 6d 6f 72 79  - maximum memory
d9b0: 20 69 6e 20 75 73 65 20 62 79 20 53 51 4c 69 74   in use by SQLit
d9c0: 65 4d 61 72 73 68 61 6c 2e 2e 2e 20 22 0d 0a 20  eMarshal... ".. 
d9d0: 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
d9e0: 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b      if {[catch {
d9f0: 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66  object invoke -f
da00: 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20  lags +NonPublic 
da10: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
da20: 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53     System.Data.S
da30: 51 4c 69 74 65 2e 53 51 4c 69 74 65 4d 61 72 73  QLite.SQLiteMars
da40: 68 61 6c 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  hal \..         
da50: 20 20 20 20 20 20 20 6d 61 78 69 6d 75 6d 42 79         maximumBy
da60: 74 65 73 41 6c 6c 6f 63 61 74 65 64 7d 20 6d 65  tesAllocated} me
da70: 6d 6f 72 79 5d 20 3d 3d 20 30 7d 20 74 68 65 6e  mory] == 0} then
da80: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66   {..          if
da90: 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20   {!$quiet} then 
daa0: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  {..            t
dab0: 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61  puts $channel [a
dac0: 70 70 65 6e 64 41 72 67 73 20 24 6d 65 6d 6f 72  ppendArgs $memor
dad0: 79 20 22 20 62 79 74 65 73 5c 6e 22 5d 0d 0a 20  y " bytes\n"].. 
dae0: 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
daf0: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
db00: 20 20 20 20 20 20 20 20 73 65 74 20 6d 65 6d 6f          set memo
db10: 72 79 20 75 6e 6b 6e 6f 77 6e 0d 0a 0d 0a 20 20  ry unknown....  
db20: 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75          if {!$qu
db30: 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  iet} then {..   
db40: 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
db50: 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
db60: 72 67 73 20 24 6d 65 6d 6f 72 79 20 5c 6e 5d 0d  rgs $memory \n].
db70: 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  .          }..  
db80: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d        }..      }
db90: 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 21 24  ....      if {!$
dba0: 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20  quiet} then {.. 
dbb0: 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
dbc0: 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 63 75 72 72  annel "---- curr
dbd0: 65 6e 74 20 6d 65 6d 6f 72 79 20 69 6e 20 75 73  ent memory in us
dbe0: 65 20 62 79 20 53 51 4c 69 74 65 2e 2e 2e 20 22  e by SQLite... "
dbf0: 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
dc00: 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 6f     if {[catch {o
dc10: 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c  bject invoke -fl
dc20: 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c  ags +NonPublic \
dc30: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
dc40: 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
dc50: 74 65 2e 55 6e 73 61 66 65 4e 61 74 69 76 65 4d  te.UnsafeNativeM
dc60: 65 74 68 6f 64 73 20 5c 0d 0a 20 20 20 20 20 20  ethods \..      
dc70: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
dc80: 6d 65 6d 6f 72 79 5f 75 73 65 64 7d 20 6d 65 6d  memory_used} mem
dc90: 6f 72 79 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20  ory] == 0} then 
dca0: 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21  {..        if {!
dcb0: 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a  $quiet} then {..
dcc0: 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
dcd0: 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  $channel [append
dce0: 41 72 67 73 20 24 6d 65 6d 6f 72 79 20 22 20 62  Args $memory " b
dcf0: 79 74 65 73 5c 6e 22 5d 0d 0a 20 20 20 20 20 20  ytes\n"]..      
dd00: 20 20 7d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73    }..      } els
dd10: 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  e {..        #..
dd20: 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
dd30: 4d 61 79 62 65 20 74 68 65 20 53 51 4c 69 74 65  Maybe the SQLite
dd40: 20 63 6f 72 65 20 6c 69 62 72 61 72 79 20 69 73   core library is
dd50: 20 75 6e 61 76 61 69 6c 61 62 6c 65 3f 0d 0a 20   unavailable?.. 
dd60: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
dd70: 20 20 73 65 74 20 6d 65 6d 6f 72 79 20 75 6e 6b    set memory unk
dd80: 6e 6f 77 6e 0d 0a 0d 0a 20 20 20 20 20 20 20 20  nown....        
dd90: 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65  if {!$quiet} the
dda0: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74  n {..          t
ddb0: 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61  puts $channel [a
ddc0: 70 70 65 6e 64 41 72 67 73 20 24 6d 65 6d 6f 72  ppendArgs $memor
ddd0: 79 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 7d  y \n]..        }
dde0: 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
ddf0: 20 20 20 73 65 74 20 72 65 73 75 6c 74 20 24 6d     set result $m
de00: 65 6d 6f 72 79 3b 20 23 20 4e 4f 54 45 3a 20 52  emory; # NOTE: R
de10: 65 74 75 72 6e 20 6d 65 6d 6f 72 79 20 69 6e 2d  eturn memory in-
de20: 75 73 65 20 74 6f 20 6f 75 72 20 63 61 6c 6c 65  use to our calle
de30: 72 2e 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b  r.....      if {
de40: 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d  !$quiet} then {.
de50: 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24  .        tputs $
de60: 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 6d 61  channel "---- ma
de70: 78 69 6d 75 6d 20 6d 65 6d 6f 72 79 20 69 6e 20  ximum memory in 
de80: 75 73 65 20 62 79 20 53 51 4c 69 74 65 2e 2e 2e  use by SQLite...
de90: 20 22 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20   "..      }.... 
dea0: 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20       if {[catch 
deb0: 7b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d  {object invoke -
dec0: 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63  flags +NonPublic
ded0: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
dee0: 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51    System.Data.SQ
def0: 4c 69 74 65 2e 55 6e 73 61 66 65 4e 61 74 69 76  Lite.UnsafeNativ
df00: 65 4d 65 74 68 6f 64 73 20 5c 0d 0a 20 20 20 20  eMethods \..    
df10: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
df20: 33 5f 6d 65 6d 6f 72 79 5f 68 69 67 68 77 61 74  3_memory_highwat
df30: 65 72 20 30 7d 20 6d 65 6d 6f 72 79 5d 20 3d 3d  er 0} memory] ==
df40: 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
df50: 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d      if {!$quiet}
df60: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
df70: 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
df80: 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 24 6d  l [appendArgs $m
df90: 65 6d 6f 72 79 20 22 20 62 79 74 65 73 5c 6e 22  emory " bytes\n"
dfa0: 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  ]..        }..  
dfb0: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
dfc0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
dfd0: 20 23 20 4e 4f 54 45 3a 20 4d 61 79 62 65 20 74   # NOTE: Maybe t
dfe0: 68 65 20 53 51 4c 69 74 65 20 63 6f 72 65 20 6c  he SQLite core l
dff0: 69 62 72 61 72 79 20 69 73 20 75 6e 61 76 61 69  ibrary is unavai
e000: 6c 61 62 6c 65 3f 0d 0a 20 20 20 20 20 20 20 20  lable?..        
e010: 23 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 6d  #..        set m
e020: 65 6d 6f 72 79 20 75 6e 6b 6e 6f 77 6e 0d 0a 0d  emory unknown...
e030: 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71  .        if {!$q
e040: 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  uiet} then {..  
e050: 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
e060: 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
e070: 67 73 20 24 6d 65 6d 6f 72 79 20 5c 6e 5d 0d 0a  gs $memory \n]..
e080: 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
e090: 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b   }....      if {
e0a0: 24 63 6f 6c 6c 65 63 74 7d 20 74 68 65 6e 20 7b  $collect} then {
e0b0: 0d 0a 20 20 20 20 20 20 20 20 63 6f 6c 6c 65 63  ..        collec
e0c0: 74 47 61 72 62 61 67 65 20 24 63 68 61 6e 6e 65  tGarbage $channe
e0d0: 6c 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  l..      }....  
e0e0: 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d      if {!$quiet}
e0f0: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
e100: 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
e110: 22 2d 2d 2d 2d 20 63 75 72 72 65 6e 74 20 6d 65  "---- current me
e120: 6d 6f 72 79 20 69 6e 20 75 73 65 20 62 79 20 74  mory in use by t
e130: 68 65 20 43 4c 52 2e 2e 2e 20 22 0d 0a 20 20 20  he CLR... "..   
e140: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 69 66     }....      if
e150: 20 7b 5b 63 61 74 63 68 20 7b 6f 62 6a 65 63 74   {[catch {object
e160: 20 69 6e 76 6f 6b 65 20 47 43 20 47 65 74 54 6f   invoke GC GetTo
e170: 74 61 6c 4d 65 6d 6f 72 79 20 66 61 6c 73 65 7d  talMemory false}
e180: 20 6d 65 6d 6f 72 79 5d 20 3d 3d 20 30 7d 20 74   memory] == 0} t
e190: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 69  hen {..        i
e1a0: 66 20 7b 5b 73 74 72 69 6e 67 20 69 73 20 69 6e  f {[string is in
e1b0: 74 65 67 65 72 20 2d 73 74 72 69 63 74 20 24 6d  teger -strict $m
e1c0: 65 6d 6f 72 79 5d 7d 20 74 68 65 6e 20 7b 0d 0a  emory]} then {..
e1d0: 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 24            if {!$
e1e0: 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20  quiet} then {.. 
e1f0: 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
e200: 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e   $channel [appen
e210: 64 41 72 67 73 20 24 6d 65 6d 6f 72 79 20 22 20  dArgs $memory " 
e220: 62 79 74 65 73 5c 6e 22 5d 0d 0a 20 20 20 20 20  bytes\n"]..     
e230: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
e240: 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
e250: 20 20 20 20 73 65 74 20 6d 65 6d 6f 72 79 20 69      set memory i
e260: 6e 76 61 6c 69 64 0d 0a 0d 0a 20 20 20 20 20 20  nvalid....      
e270: 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d      if {!$quiet}
e280: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
e290: 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
e2a0: 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
e2b0: 24 6d 65 6d 6f 72 79 20 5c 6e 5d 0d 0a 20 20 20  $memory \n]..   
e2c0: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
e2d0: 20 20 7d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73    }..      } els
e2e0: 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 65 74  e {..        set
e2f0: 20 6d 65 6d 6f 72 79 20 75 6e 6b 6e 6f 77 6e 0d   memory unknown.
e300: 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21  ...        if {!
e310: 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a  $quiet} then {..
e320: 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
e330: 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  $channel [append
e340: 41 72 67 73 20 24 6d 65 6d 6f 72 79 20 5c 6e 5d  Args $memory \n]
e350: 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20  ..        }..   
e360: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65     }....      re
e370: 74 75 72 6e 20 24 72 65 73 75 6c 74 0d 0a 20 20  turn $result..  
e380: 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
e390: 20 63 68 65 63 6b 46 6f 72 53 51 4c 69 74 65 44   checkForSQLiteD
e3a0: 69 72 65 63 74 6f 72 69 65 73 20 7b 20 63 68 61  irectories { cha
e3b0: 6e 6e 65 6c 20 7b 72 65 73 65 74 20 66 61 6c 73  nnel {reset fals
e3c0: 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d  e} } {..      #.
e3d0: 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43  .      # NOTE: C
e3e0: 68 65 63 6b 20 69 66 20 74 68 65 20 73 71 6c 69  heck if the sqli
e3f0: 74 65 33 5f 77 69 6e 33 32 5f 73 65 74 5f 64 69  te3_win32_set_di
e400: 72 65 63 74 6f 72 79 20 66 75 6e 63 74 69 6f 6e  rectory function
e410: 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2e 0d 0a   is available...
e420: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 74        #..      t
e430: 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5c 0d  puts $channel \.
e440: 0a 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d  .          "----
e450: 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 66 75   checking for fu
e460: 6e 63 74 69 6f 6e 20 73 71 6c 69 74 65 33 5f 77  nction sqlite3_w
e470: 69 6e 33 32 5f 73 65 74 5f 64 69 72 65 63 74 6f  in32_set_directo
e480: 72 79 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 20  ry... "....     
e490: 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
e4a0: 3a 20 54 68 69 73 20 63 61 6c 6c 20 74 6f 20 74  : This call to t
e4b0: 68 65 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32  he sqlite3_win32
e4c0: 5f 73 65 74 5f 64 69 72 65 63 74 6f 72 79 20 66  _set_directory f
e4d0: 75 6e 63 74 69 6f 6e 20 75 73 65 73 20 74 68 65  unction uses the
e4e0: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
e4f0: 69 6e 76 61 6c 69 64 20 76 61 6c 75 65 20 30 20  invalid value 0 
e500: 66 6f 72 20 74 68 65 20 66 69 72 73 74 20 61 72  for the first ar
e510: 67 75 6d 65 6e 74 2e 20 20 54 68 69 73 20 63 6f  gument.  This co
e520: 64 65 20 69 73 20 64 65 73 69 67 6e 65 64 0d 0a  de is designed..
e530: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74 6f        #       to
e540: 20 63 68 65 63 6b 20 69 66 20 63 61 6c 6c 69 6e   check if callin
e550: 67 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 77  g the function w
e560: 69 6c 6c 20 72 61 69 73 65 20 61 6e 20 65 78 63  ill raise an exc
e570: 65 70 74 69 6f 6e 20 28 69 2e 65 2e 0d 0a 20 20  eption (i.e...  
e580: 20 20 20 20 23 20 20 20 20 20 20 20 74 68 65 20      #       the 
e590: 61 63 74 75 61 6c 20 72 65 73 75 6c 74 20 6f 66  actual result of
e5a0: 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 64 6f   the function do
e5b0: 65 73 20 6e 6f 74 20 6d 61 74 74 65 72 20 61 73  es not matter as
e5c0: 20 6c 6f 6e 67 20 61 73 20 6e 6f 0d 0a 20 20 20   long as no..   
e5d0: 20 20 20 23 20 20 20 20 20 20 20 64 69 72 65 63     #       direc
e5e0: 74 6f 72 79 20 69 73 20 63 68 61 6e 67 65 64 29  tory is changed)
e5f0: 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
e600: 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a    if {[catch {..
e610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 62                ob
e620: 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61  ject invoke -fla
e630: 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d  gs +NonPublic \.
e640: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53  .              S
e650: 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
e660: 65 2e 55 6e 73 61 66 65 4e 61 74 69 76 65 4d 65  e.UnsafeNativeMe
e670: 74 68 6f 64 73 20 5c 0d 0a 20 20 20 20 20 20 20  thods \..       
e680: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 77         sqlite3_w
e690: 69 6e 33 32 5f 73 65 74 5f 64 69 72 65 63 74 6f  in32_set_directo
e6a0: 72 79 20 30 20 6e 75 6c 6c 7d 5d 20 3d 3d 20 30  ry 0 null}] == 0
e6b0: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
e6c0: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
e6d0: 4f 54 45 3a 20 43 61 6c 6c 69 6e 67 20 74 68 65  OTE: Calling the
e6e0: 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73   sqlite3_win32_s
e6f0: 65 74 5f 64 69 72 65 63 74 6f 72 79 20 66 75 6e  et_directory fun
e700: 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 0d 0a  ction does not..
e710: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
e720: 63 61 75 73 65 20 61 6e 20 65 78 63 65 70 74 69  cause an excepti
e730: 6f 6e 3b 20 74 68 65 72 65 66 6f 72 65 2c 20 69  on; therefore, i
e740: 74 20 6d 75 73 74 20 62 65 20 61 76 61 69 6c 61  t must be availa
e750: 62 6c 65 20 28 69 2e 65 2e 0d 0a 20 20 20 20 20  ble (i.e...     
e760: 20 20 20 23 20 20 20 20 20 20 20 65 76 65 6e 20     #       even 
e770: 74 68 6f 75 67 68 20 69 74 20 73 68 6f 75 6c 64  though it should
e780: 20 72 65 74 75 72 6e 20 61 20 66 61 69 6c 75 72   return a failur
e790: 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20 69 6e  e return code in
e7a0: 20 74 68 69 73 0d 0a 20 20 20 20 20 20 20 20 23   this..        #
e7b0: 20 20 20 20 20 20 20 63 61 73 65 29 2e 0d 0a 20         case)... 
e7c0: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
e7d0: 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20    addConstraint 
e7e0: 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 65  sqlite3_win32_se
e7f0: 74 5f 64 69 72 65 63 74 6f 72 79 0d 0a 0d 0a 20  t_directory.... 
e800: 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
e810: 61 6e 6e 65 6c 20 79 65 73 5c 6e 0d 0a 0d 0a 20  annel yes\n.... 
e820: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
e830: 20 20 23 20 4e 4f 54 45 3a 20 44 6f 65 73 20 6f    # NOTE: Does o
e840: 75 72 20 63 61 6c 6c 65 72 20 77 61 6e 74 20 74  ur caller want t
e850: 6f 20 72 65 73 65 74 20 74 68 65 20 64 69 72 65  o reset the dire
e860: 63 74 6f 72 69 65 73 3f 0d 0a 20 20 20 20 20 20  ctories?..      
e870: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 69 66 20    #..        if 
e880: 7b 24 72 65 73 65 74 7d 20 74 68 65 6e 20 7b 0d  {$reset} then {.
e890: 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
e8a0: 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
e8b0: 4e 6f 77 20 6d 61 6b 65 20 73 75 72 65 20 74 68  Now make sure th
e8c0: 65 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 74  e database and t
e8d0: 65 6d 70 6f 72 61 72 79 20 64 69 72 65 63 74 6f  emporary directo
e8e0: 72 69 65 73 20 61 72 65 0d 0a 20 20 20 20 20 20  ries are..      
e8f0: 20 20 20 20 23 20 20 20 20 20 20 20 72 65 73 65      #       rese
e900: 74 20 74 68 65 69 72 20 64 65 66 61 75 6c 74 20  t their default 
e910: 76 61 6c 75 65 73 2c 20 77 68 69 63 68 20 73 68  values, which sh
e920: 6f 75 6c 64 20 62 65 20 6e 75 6c 6c 20 66 6f 72  ould be null for
e930: 20 62 6f 74 68 2e 0d 0a 20 20 20 20 20 20 20 20   both...        
e940: 20 20 23 20 20 20 20 20 20 20 53 69 6e 63 65 20    #       Since 
e950: 74 68 65 20 73 71 6c 69 74 65 33 5f 77 69 6e 33  the sqlite3_win3
e960: 32 5f 73 65 74 5f 64 69 72 65 63 74 6f 72 79 20  2_set_directory 
e970: 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 76 61 69  function is avai
e980: 6c 61 62 6c 65 2c 0d 0a 20 20 20 20 20 20 20 20  lable,..        
e990: 20 20 23 20 20 20 20 20 20 20 75 73 65 20 69 74    #       use it
e9a0: 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a  ...          #..
e9b0: 20 20 20 20 20 20 20 20 20 20 66 6f 72 20 7b 73            for {s
e9c0: 65 74 20 69 6e 64 65 78 20 31 7d 20 7b 24 69 6e  et index 1} {$in
e9d0: 64 65 78 20 3c 20 33 7d 20 7b 69 6e 63 72 20 69  dex < 3} {incr i
e9e0: 6e 64 65 78 7d 20 7b 0d 0a 20 20 20 20 20 20 20  ndex} {..       
e9f0: 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20       if {[catch 
ea00: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
ea10: 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e         object in
ea20: 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e  voke -flags +Non
ea30: 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20  Public \..      
ea40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 79                Sy
ea50: 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
ea60: 2e 55 6e 73 61 66 65 4e 61 74 69 76 65 4d 65 74  .UnsafeNativeMet
ea70: 68 6f 64 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  hods \..        
ea80: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
ea90: 74 65 33 5f 77 69 6e 33 32 5f 73 65 74 5f 64 69  te3_win32_set_di
eaa0: 72 65 63 74 6f 72 79 20 24 69 6e 64 65 78 20 6e  rectory $index n
eab0: 75 6c 6c 7d 20 5c 0d 0a 20 20 20 20 20 20 20 20  ull} \..        
eac0: 20 20 20 20 20 20 20 20 20 20 20 20 72 65 73 75              resu
ead0: 6c 74 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b  lt] == 0} then {
eae0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
eaf0: 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b  tputs $channel [
eb00: 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
eb10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eb20: 22 2d 2d 2d 2d 20 63 61 6c 6c 20 73 71 6c 69 74  "---- call sqlit
eb30: 65 33 5f 77 69 6e 33 32 5f 73 65 74 5f 64 69 72  e3_win32_set_dir
eb40: 65 63 74 6f 72 79 28 22 20 24 69 6e 64 65 78 20  ectory(" $index 
eb50: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
eb60: 20 20 20 20 20 22 2c 20 6e 75 6c 6c 29 2e 2e 2e       ", null)...
eb70: 20 6f 6b 3a 20 22 20 24 72 65 73 75 6c 74 20 5c   ok: " $result \
eb80: 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  n]..            
eb90: 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
eba0: 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
ebb0: 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
ebc0: 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
ebd0: 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 61          "---- ca
ebe0: 6c 6c 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32  ll sqlite3_win32
ebf0: 5f 73 65 74 5f 64 69 72 65 63 74 6f 72 79 28 22  _set_directory("
ec00: 20 24 69 6e 64 65 78 20 5c 0d 0a 20 20 20 20 20   $index \..     
ec10: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2c 20               ", 
ec20: 6e 75 6c 6c 29 2e 2e 2e 20 65 72 72 6f 72 3a 20  null)... error: 
ec30: 22 20 5c 6e 5c 74 20 24 72 65 73 75 6c 74 20 5c  " \n\t $result \
ec40: 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  n]..            
ec50: 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  }..          }..
ec60: 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
ec70: 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
ec80: 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
ec90: 6c 20 6e 6f 5c 6e 0d 0a 0d 0a 20 20 20 20 20 20  l no\n....      
eca0: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
ecb0: 4f 54 45 3a 20 44 6f 65 73 20 6f 75 72 20 63 61  OTE: Does our ca
ecc0: 6c 6c 65 72 20 77 61 6e 74 20 74 6f 20 72 65 73  ller want to res
ecd0: 65 74 20 74 68 65 20 64 69 72 65 63 74 6f 72 69  et the directori
ece0: 65 73 3f 20 20 54 68 69 73 20 63 61 6e 20 6f 6e  es?  This can on
ecf0: 6c 79 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  ly..        #   
ed00: 20 20 20 20 62 65 20 70 65 72 66 6f 72 6d 65 64      be performed
ed10: 20 69 66 20 53 51 4c 69 74 65 20 69 73 20 6c 6f   if SQLite is lo
ed20: 61 64 65 64 20 61 6e 64 20 72 65 61 64 79 20 66  aded and ready f
ed30: 6f 72 20 75 73 65 20 62 79 20 74 68 65 20 74 65  or use by the te
ed40: 73 74 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  st..        #   
ed50: 20 20 20 20 73 75 69 74 65 2e 0d 0a 20 20 20 20      suite...    
ed60: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 69      #..        i
ed70: 66 20 7b 24 72 65 73 65 74 20 26 26 20 5b 69 73  f {$reset && [is
ed80: 53 51 4c 69 74 65 52 65 61 64 79 5d 7d 20 74 68  SQLiteReady]} th
ed90: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
eda0: 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e  #..          # N
edb0: 4f 54 45 3a 20 4e 6f 77 20 6d 61 6b 65 20 73 75  OTE: Now make su
edc0: 72 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  re the database 
edd0: 61 6e 64 20 74 65 6d 70 6f 72 61 72 79 20 64 69  and temporary di
ede0: 72 65 63 74 6f 72 69 65 73 20 61 72 65 0d 0a 20  rectories are.. 
edf0: 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20           #      
ee00: 20 72 65 73 65 74 20 74 68 65 69 72 20 64 65 66   reset their def
ee10: 61 75 6c 74 20 76 61 6c 75 65 73 2c 20 77 68 69  ault values, whi
ee20: 63 68 20 73 68 6f 75 6c 64 20 62 65 20 6e 75 6c  ch should be nul
ee30: 6c 20 66 6f 72 20 62 6f 74 68 2e 0d 0a 20 20 20  l for both...   
ee40: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 53         #       S
ee50: 69 6e 63 65 20 74 68 65 20 73 71 6c 69 74 65 33  ince the sqlite3
ee60: 5f 77 69 6e 33 32 5f 73 65 74 5f 64 69 72 65 63  _win32_set_direc
ee70: 74 6f 72 79 20 66 75 6e 63 74 69 6f 6e 20 64 6f  tory function do
ee80: 65 73 20 6e 6f 74 0d 0a 20 20 20 20 20 20 20 20  es not..        
ee90: 20 20 23 20 20 20 20 20 20 20 61 70 70 65 61 72    #       appear
eea0: 20 74 6f 20 62 65 20 61 76 61 69 6c 61 62 6c 65   to be available
eeb0: 2c 20 75 73 65 20 74 68 65 20 61 73 73 6f 63 69  , use the associ
eec0: 61 74 65 64 20 50 52 41 47 4d 41 20 63 6f 6d 6d  ated PRAGMA comm
eed0: 61 6e 64 73 0d 0a 20 20 20 20 20 20 20 20 20 20  ands..          
eee0: 23 20 20 20 20 20 20 20 69 6e 73 74 65 61 64 2e  #       instead.
eef0: 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20  ..          #.. 
ef00: 20 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68           foreach
ef10: 20 64 69 72 65 63 74 6f 72 79 20 5b 6c 69 73 74   directory [list
ef20: 20 64 61 74 61 5f 73 74 6f 72 65 5f 64 69 72 65   data_store_dire
ef30: 63 74 6f 72 79 20 74 65 6d 70 5f 73 74 6f 72 65  ctory temp_store
ef40: 5f 64 69 72 65 63 74 6f 72 79 5d 20 7b 0d 0a 20  _directory] {.. 
ef50: 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20 73             set s
ef60: 71 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 22  ql [appendArgs "
ef70: 50 52 41 47 4d 41 20 22 20 24 64 69 72 65 63 74  PRAGMA " $direct
ef80: 6f 72 79 20 22 20 3d 20 5c 22 5c 22 3b 22 5d 0d  ory " = \"\";"].
ef90: 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ...            i
efa0: 66 20 7b 5b 63 61 74 63 68 20 7b 65 78 65 63 75  f {[catch {execu
efb0: 74 65 53 71 6c 20 24 73 71 6c 7d 20 72 65 73 75  teSql $sql} resu
efc0: 6c 74 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b  lt] == 0} then {
efd0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
efe0: 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b  tputs $channel [
eff0: 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
f000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f010: 22 2d 2d 2d 2d 20 65 78 65 63 75 74 65 20 50 52  "---- execute PR
f020: 41 47 4d 41 20 22 20 24 64 69 72 65 63 74 6f 72  AGMA " $director
f030: 79 20 22 2e 2e 2e 20 6f 6b 3a 20 5c 22 22 20 5c  y "... ok: \"" \
f040: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
f050: 20 20 20 20 24 72 65 73 75 6c 74 20 5c 22 5c 6e      $result \"\n
f060: 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  ]..            }
f070: 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
f080: 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
f090: 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
f0a0: 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
f0b0: 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 65 78 65         "---- exe
f0c0: 63 75 74 65 20 50 52 41 47 4d 41 20 22 20 24 64  cute PRAGMA " $d
f0d0: 69 72 65 63 74 6f 72 79 20 22 2e 2e 2e 20 65 72  irectory "... er
f0e0: 72 6f 72 3a 20 22 20 5c 0d 0a 20 20 20 20 20 20  ror: " \..      
f0f0: 20 20 20 20 20 20 20 20 20 20 20 20 5c 6e 5c 74              \n\t
f100: 20 24 72 65 73 75 6c 74 20 5c 6e 5d 0d 0a 20 20   $result \n]..  
f110: 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
f120: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
f130: 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a    }..      }....
f140: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
f150: 20 4e 4f 54 45 3a 20 46 69 6e 61 6c 6c 79 2c 20   NOTE: Finally, 
f160: 73 68 6f 77 20 74 68 65 20 63 75 72 72 65 6e 74  show the current
f170: 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 64 61   value of the da
f180: 74 61 62 61 73 65 20 61 6e 64 20 74 65 6d 70 6f  tabase and tempo
f190: 72 61 72 79 0d 0a 20 20 20 20 20 20 23 20 20 20  rary..      #   
f1a0: 20 20 20 20 64 69 72 65 63 74 6f 72 69 65 73 2e      directories.
f1b0: 20 20 54 68 69 73 20 63 61 6e 20 6f 6e 6c 79 20    This can only 
f1c0: 62 65 20 70 65 72 66 6f 72 6d 65 64 20 69 66 20  be performed if 
f1d0: 53 51 4c 69 74 65 20 69 73 20 6c 6f 61 64 65 64  SQLite is loaded
f1e0: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
f1f0: 61 6e 64 20 72 65 61 64 79 20 66 6f 72 20 75 73  and ready for us
f200: 65 20 62 79 20 74 68 65 20 74 65 73 74 20 73 75  e by the test su
f210: 69 74 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ite...      #.. 
f220: 20 20 20 20 20 69 66 20 7b 5b 69 73 53 51 4c 69       if {[isSQLi
f230: 74 65 52 65 61 64 79 5d 7d 20 74 68 65 6e 20 7b  teReady]} then {
f240: 0d 0a 20 20 20 20 20 20 20 20 66 6f 72 65 61 63  ..        foreac
f250: 68 20 64 69 72 65 63 74 6f 72 79 20 5b 6c 69 73  h directory [lis
f260: 74 20 64 61 74 61 5f 73 74 6f 72 65 5f 64 69 72  t data_store_dir
f270: 65 63 74 6f 72 79 20 74 65 6d 70 5f 73 74 6f 72  ectory temp_stor
f280: 65 5f 64 69 72 65 63 74 6f 72 79 5d 20 7b 0d 0a  e_directory] {..
f290: 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
f2a0: 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  $channel [append
f2b0: 41 72 67 73 20 22 2d 2d 2d 2d 20 63 68 65 63 6b  Args "---- check
f2c0: 69 6e 67 20 22 20 24 64 69 72 65 63 74 6f 72 79  ing " $directory
f2d0: 20 22 2e 2e 2e 20 22 5d 0d 0a 0d 0a 20 20 20 20   "... "]....    
f2e0: 20 20 20 20 20 20 73 65 74 20 73 71 6c 20 5b 61        set sql [a
f2f0: 70 70 65 6e 64 41 72 67 73 20 22 50 52 41 47 4d  ppendArgs "PRAGM
f300: 41 20 22 20 24 64 69 72 65 63 74 6f 72 79 20 5c  A " $directory \
f310: 3b 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  ;]....          
f320: 69 66 20 7b 5b 63 61 74 63 68 20 7b 65 78 65 63  if {[catch {exec
f330: 75 74 65 53 71 6c 20 24 73 71 6c 20 73 63 61 6c  uteSql $sql scal
f340: 61 72 7d 20 72 65 73 75 6c 74 5d 20 3d 3d 20 30  ar} result] == 0
f350: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
f360: 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
f370: 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
f380: 20 22 6f 6b 3a 20 5c 22 22 20 24 72 65 73 75 6c   "ok: \"" $resul
f390: 74 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20 20  t \"\n]..       
f3a0: 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
f3b0: 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
f3c0: 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
f3d0: 72 67 73 20 22 65 72 72 6f 72 3a 20 22 20 5c 6e  rgs "error: " \n
f3e0: 5c 74 20 24 72 65 73 75 6c 74 20 5c 6e 5d 0d 0a  \t $result \n]..
f3f0: 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
f400: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d       }..      }.
f410: 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70  .    }.....    p
f420: 72 6f 63 20 6c 6f 61 64 53 51 4c 69 74 65 54 65  roc loadSQLiteTe
f430: 73 74 53 65 74 74 69 6e 67 73 20 7b 20 63 68 61  stSettings { cha
f440: 6e 6e 65 6c 20 7b 73 75 66 66 69 78 20 22 22 7d  nnel {suffix ""}
f450: 20 7b 71 75 69 65 74 20 66 61 6c 73 65 7d 20 7d   {quiet false} }
f460: 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20   {..      #..   
f470: 20 20 20 23 20 4e 4f 54 45 3a 20 53 6b 69 70 20     # NOTE: Skip 
f480: 6c 6f 61 64 69 6e 67 20 74 68 65 20 73 65 74 74  loading the sett
f490: 69 6e 67 73 20 69 66 20 74 68 65 69 72 20 75 73  ings if their us
f4a0: 61 67 65 20 68 61 73 20 62 65 65 6e 20 64 69 73  age has been dis
f4b0: 61 62 6c 65 64 2e 0d 0a 20 20 20 20 20 20 23 0d  abled...      #.
f4c0: 0a 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66  .      if {![inf
f4d0: 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 73 71  o exists ::no(sq
f4e0: 6c 69 74 65 54 65 73 74 53 65 74 74 69 6e 67 73  liteTestSettings
f4f0: 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  )]} then {..    
f500: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
f510: 20 4e 4f 54 45 3a 20 4c 6f 61 64 20 63 75 73 74   NOTE: Load cust
f520: 6f 6d 20 70 65 72 2d 75 73 65 72 20 61 6e 64 2f  om per-user and/
f530: 6f 72 20 70 65 72 2d 68 6f 73 74 20 74 65 73 74  or per-host test
f540: 20 73 65 74 74 69 6e 67 73 20 6e 6f 77 2e 0d 0a   settings now...
f550: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
f560: 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69     if {[info exi
f570: 73 74 73 20 3a 3a 74 63 6c 5f 70 6c 61 74 66 6f  sts ::tcl_platfo
f580: 72 6d 28 75 73 65 72 29 5d 7d 20 74 68 65 6e 20  rm(user)]} then 
f590: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74  {..          set
f5a0: 20 75 73 65 72 53 65 74 74 69 6e 67 73 46 69 6c   userSettingsFil
f5b0: 65 4e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e  eName [file join
f5c0: 20 5b 67 65 74 43 6f 6d 6d 6f 6e 44 69 72 65 63   [getCommonDirec
f5d0: 74 6f 72 79 5d 20 5c 0d 0a 20 20 20 20 20 20 20  tory] \..       
f5e0: 20 20 20 20 20 20 20 5b 61 70 70 65 6e 64 41 72         [appendAr
f5f0: 67 73 20 73 65 74 74 69 6e 67 73 20 24 73 75 66  gs settings $suf
f600: 66 69 78 20 2e 20 24 3a 3a 74 63 6c 5f 70 6c 61  fix . $::tcl_pla
f610: 74 66 6f 72 6d 28 75 73 65 72 29 20 2e 65 61 67  tform(user) .eag
f620: 6c 65 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  le]]....        
f630: 20 20 69 66 20 7b 5b 66 69 6c 65 20 65 78 69 73    if {[file exis
f640: 74 73 20 24 75 73 65 72 53 65 74 74 69 6e 67 73  ts $userSettings
f650: 46 69 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20  FileName]} then 
f660: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  {..            i
f670: 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e  f {!$quiet} then
f680: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
f690: 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
f6a0: 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
f6b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f6c0: 20 20 22 2d 2d 2d 2d 20 6c 6f 61 64 69 6e 67 20    "---- loading 
f6d0: 70 65 72 2d 75 73 65 72 20 74 65 73 74 20 73 65  per-user test se
f6e0: 74 74 69 6e 67 73 20 66 69 6c 65 20 5c 22 22 20  ttings file \"" 
f6f0: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
f700: 20 20 20 20 20 24 75 73 65 72 53 65 74 74 69 6e       $userSettin
f710: 67 73 46 69 6c 65 4e 61 6d 65 20 5c 22 2e 2e 2e  gsFileName \"...
f720: 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20  \n]..           
f730: 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   }....          
f740: 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 75 70    if {[catch {up
f750: 6c 65 76 65 6c 20 31 20 5b 6c 69 73 74 20 73 6f  level 1 [list so
f760: 75 72 63 65 20 24 75 73 65 72 53 65 74 74 69 6e  urce $userSettin
f770: 67 73 46 69 6c 65 4e 61 6d 65 5d 7d 20 5c 0d 0a  gsFileName]} \..
f780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f790: 20 20 20 20 65 72 72 6f 72 5d 7d 20 74 68 65 6e      error]} then
f7a0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
f7b0: 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74    if {!$quiet} t
f7c0: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
f7d0: 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
f7e0: 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
f7f0: 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
f800: 20 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57           "==== W
f810: 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20 74  ARNING: failed t
f820: 6f 20 6c 6f 61 64 20 70 65 72 2d 75 73 65 72 20  o load per-user 
f830: 73 65 74 74 69 6e 67 73 20 66 69 6c 65 20 5c 22  settings file \"
f840: 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  " \..           
f850: 20 20 20 20 20 20 20 20 20 24 75 73 65 72 53 65           $userSe
f860: 74 74 69 6e 67 73 46 69 6c 65 4e 61 6d 65 20 22  ttingsFileName "
f870: 5c 22 2c 20 65 72 72 6f 72 3a 20 22 20 5c 6e 5c  \", error: " \n\
f880: 74 20 24 65 72 72 6f 72 20 5c 6e 5d 0d 0a 20 20  t $error \n]..  
f890: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
f8a0: 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
f8b0: 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b          } else {
f8c0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ..            if
f8d0: 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20   {!$quiet} then 
f8e0: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
f8f0: 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
f900: 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
f910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f920: 20 22 2d 2d 2d 2d 20 73 6b 69 70 70 65 64 20 6c   "---- skipped l
f930: 6f 61 64 69 6e 67 20 70 65 72 2d 75 73 65 72 20  oading per-user 
f940: 74 65 73 74 20 73 65 74 74 69 6e 67 73 20 66 69  test settings fi
f950: 6c 65 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20  le \"" \..      
f960: 20 20 20 20 20 20 20 20 20 20 20 20 24 75 73 65              $use
f970: 72 53 65 74 74 69 6e 67 73 46 69 6c 65 4e 61 6d  rSettingsFileNam
f980: 65 20 22 5c 22 2c 20 69 74 20 64 6f 65 73 20 6e  e "\", it does n
f990: 6f 74 20 65 78 69 73 74 5c 6e 22 5d 0d 0a 20 20  ot exist\n"]..  
f9a0: 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
f9b0: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
f9c0: 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23    }....        #
f9d0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
f9e0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
f9f0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
fa00: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
fa10: 23 23 23 23 23 23 0d 0a 0d 0a 20 20 20 20 20 20  ######....      
fa20: 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73    if {[info exis
fa30: 74 73 20 3a 3a 74 63 6c 5f 70 6c 61 74 66 6f 72  ts ::tcl_platfor
fa40: 6d 28 68 6f 73 74 29 5d 7d 20 74 68 65 6e 20 7b  m(host)]} then {
fa50: 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20  ..          set 
fa60: 68 6f 73 74 53 65 74 74 69 6e 67 73 46 69 6c 65  hostSettingsFile
fa70: 4e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20  Name [file join 
fa80: 5b 67 65 74 43 6f 6d 6d 6f 6e 44 69 72 65 63 74  [getCommonDirect
fa90: 6f 72 79 5d 20 5c 0d 0a 20 20 20 20 20 20 20 20  ory] \..        
faa0: 20 20 20 20 20 20 5b 61 70 70 65 6e 64 41 72 67        [appendArg
fab0: 73 20 73 65 74 74 69 6e 67 73 20 24 73 75 66 66  s settings $suff
fac0: 69 78 20 2e 20 24 3a 3a 74 63 6c 5f 70 6c 61 74  ix . $::tcl_plat
fad0: 66 6f 72 6d 28 68 6f 73 74 29 20 2e 65 61 67 6c  form(host) .eagl
fae0: 65 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  e]]....         
faf0: 20 69 66 20 7b 5b 66 69 6c 65 20 65 78 69 73 74   if {[file exist
fb00: 73 20 24 68 6f 73 74 53 65 74 74 69 6e 67 73 46  s $hostSettingsF
fb10: 69 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b  ileName]} then {
fb20: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ..            if
fb30: 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20   {!$quiet} then 
fb40: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
fb50: 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
fb60: 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
fb70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fb80: 20 22 2d 2d 2d 2d 20 6c 6f 61 64 69 6e 67 20 70   "---- loading p
fb90: 65 72 2d 68 6f 73 74 20 74 65 73 74 20 73 65 74  er-host test set
fba0: 74 69 6e 67 73 20 66 69 6c 65 20 5c 22 22 20 5c  tings file \"" \
fbb0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
fbc0: 20 20 20 20 24 68 6f 73 74 53 65 74 74 69 6e 67      $hostSetting
fbd0: 73 46 69 6c 65 4e 61 6d 65 20 5c 22 2e 2e 2e 5c  sFileName \"...\
fbe0: 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  n]..            
fbf0: 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  }....           
fc00: 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 75 70 6c   if {[catch {upl
fc10: 65 76 65 6c 20 31 20 5b 6c 69 73 74 20 73 6f 75  evel 1 [list sou
fc20: 72 63 65 20 24 68 6f 73 74 53 65 74 74 69 6e 67  rce $hostSetting
fc30: 73 46 69 6c 65 4e 61 6d 65 5d 7d 20 5c 0d 0a 20  sFileName]} \.. 
fc40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fc50: 20 20 20 65 72 72 6f 72 5d 7d 20 74 68 65 6e 20     error]} then 
fc60: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
fc70: 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68   if {!$quiet} th
fc80: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
fc90: 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
fca0: 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
fcb0: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
fcc0: 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41          "==== WA
fcd0: 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20 74 6f  RNING: failed to
fce0: 20 6c 6f 61 64 20 70 65 72 2d 68 6f 73 74 20 73   load per-host s
fcf0: 65 74 74 69 6e 67 73 20 66 69 6c 65 20 5c 22 22  ettings file \""
fd00: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
fd10: 20 20 20 20 20 20 20 20 24 68 6f 73 74 53 65 74          $hostSet
fd20: 74 69 6e 67 73 46 69 6c 65 4e 61 6d 65 20 22 5c  tingsFileName "\
fd30: 22 2c 20 65 72 72 6f 72 3a 20 22 20 5c 6e 5c 74  ", error: " \n\t
fd40: 20 24 65 72 72 6f 72 20 5c 6e 5d 0d 0a 20 20 20   $error \n]..   
fd50: 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
fd60: 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
fd70: 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d         } else {.
fd80: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20  .            if 
fd90: 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b  {!$quiet} then {
fda0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
fdb0: 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b  tputs $channel [
fdc0: 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
fdd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fde0: 22 2d 2d 2d 2d 20 73 6b 69 70 70 65 64 20 6c 6f  "---- skipped lo
fdf0: 61 64 69 6e 67 20 70 65 72 2d 68 6f 73 74 20 74  ading per-host t
fe00: 65 73 74 20 73 65 74 74 69 6e 67 73 20 66 69 6c  est settings fil
fe10: 65 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20 20  e \"" \..       
fe20: 20 20 20 20 20 20 20 20 20 20 20 24 68 6f 73 74             $host
fe30: 53 65 74 74 69 6e 67 73 46 69 6c 65 4e 61 6d 65  SettingsFileName
fe40: 20 22 5c 22 2c 20 69 74 20 64 6f 65 73 20 6e 6f   "\", it does no
fe50: 74 20 65 78 69 73 74 5c 6e 22 5d 0d 0a 20 20 20  t exist\n"]..   
fe60: 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
fe70: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
fe80: 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20   }..      }..   
fe90: 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
fea0: 72 75 6e 53 51 4c 69 74 65 54 65 73 74 50 72 6f  runSQLiteTestPro
feb0: 6c 6f 67 75 65 20 7b 7d 20 7b 0d 0a 20 20 20 20  logue {} {..    
fec0: 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
fed0: 45 3a 20 53 6b 69 70 20 72 75 6e 6e 69 6e 67 20  E: Skip running 
fee0: 6f 75 72 20 63 75 73 74 6f 6d 20 70 72 6f 6c 6f  our custom prolo
fef0: 67 75 65 20 69 66 20 74 68 65 20 6d 61 69 6e 20  gue if the main 
ff00: 6f 6e 65 20 68 61 73 20 62 65 65 6e 0d 0a 20 20  one has been..  
ff10: 20 20 20 20 23 20 20 20 20 20 20 20 73 6b 69 70      #       skip
ff20: 70 65 64 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ped...      #.. 
ff30: 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20       if {![info 
ff40: 65 78 69 73 74 73 20 3a 3a 6e 6f 28 70 72 6f 6c  exists ::no(prol
ff50: 6f 67 75 65 2e 65 61 67 6c 65 29 5d 7d 20 74 68  ogue.eagle)]} th
ff60: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d  en {..        #.
ff70: 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
ff80: 20 4c 6f 61 64 20 74 68 65 20 22 62 65 66 6f 72   Load the "befor
ff90: 65 2d 63 6f 6e 73 74 72 61 69 6e 74 73 22 20 63  e-constraints" c
ffa0: 75 73 74 6f 6d 20 70 65 72 2d 75 73 65 72 20 61  ustom per-user a
ffb0: 6e 64 2f 6f 72 20 70 65 72 2d 68 6f 73 74 0d 0a  nd/or per-host..
ffc0: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
ffd0: 74 65 73 74 20 73 65 74 74 69 6e 67 73 20 6e 6f  test settings no
ffe0: 77 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  w...        #.. 
fff0: 20 20 20 20 20 20 20 75 70 6c 65 76 65 6c 20 31         uplevel 1
10000 20 5b 6c 69 73 74 20 6c 6f 61 64 53 51 4c 69 74   [list loadSQLit
10010 65 54 65 73 74 53 65 74 74 69 6e 67 73 20 24 3a  eTestSettings $:
10020 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 2e 62  :test_channel .b
10030 65 66 6f 72 65 5d 0d 0a 0d 0a 20 20 20 20 20 20  efore]....      
10040 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
10050 4f 54 45 3a 20 53 6b 69 70 20 61 6c 6c 20 53 79  OTE: Skip all Sy
10060 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
10070 20 72 65 6c 61 74 65 64 20 66 69 6c 65 20 68 61   related file ha
10080 6e 64 6c 69 6e 67 20 28 64 65 6c 65 74 69 6e 67  ndling (deleting
10090 2c 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  ,..        #    
100a0 20 20 20 63 6f 70 79 69 6e 67 2c 20 61 6e 64 20     copying, and 
100b0 6c 6f 61 64 69 6e 67 29 20 69 66 20 77 65 20 61  loading) if we a
100c0 72 65 20 73 6f 20 69 6e 73 74 72 75 63 74 65 64  re so instructed
100d0 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
100e0 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f        if {![info
100f0 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 73 71 6c   exists ::no(sql
10100 69 74 65 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e  iteFiles)]} then
10110 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d   {..          #.
10120 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54  .          # NOT
10130 45 3a 20 53 6b 69 70 20 74 72 79 69 6e 67 20 74  E: Skip trying t
10140 6f 20 64 65 6c 65 74 65 20 61 6e 79 20 66 69 6c  o delete any fil
10150 65 73 20 69 66 20 77 65 20 61 72 65 20 73 6f 20  es if we are so 
10160 69 6e 73 74 72 75 63 74 65 64 2e 0d 0a 20 20 20  instructed...   
10170 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
10180 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65      if {![info e
10190 78 69 73 74 73 20 3a 3a 6e 6f 28 64 65 6c 65 74  xists ::no(delet
101a0 65 53 71 6c 69 74 65 46 69 6c 65 73 29 5d 7d 20  eSqliteFiles)]} 
101b0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
101c0 20 20 20 20 74 72 79 44 65 6c 65 74 65 41 73 73      tryDeleteAss
101d0 65 6d 62 6c 79 20 73 71 6c 69 74 65 33 2e 64 6c  embly sqlite3.dl
101e0 6c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  l..            r
101f0 65 6d 6f 76 65 43 6f 6e 73 74 72 61 69 6e 74 20  emoveConstraint 
10200 66 69 6c 65 5f 73 71 6c 69 74 65 33 2e 64 6c 6c  file_sqlite3.dll
10210 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
10220 74 72 79 44 65 6c 65 74 65 41 73 73 65 6d 62 6c  tryDeleteAssembl
10230 79 20 53 51 4c 69 74 65 2e 49 6e 74 65 72 6f 70  y SQLite.Interop
10240 2e 64 6c 6c 0d 0a 20 20 20 20 20 20 20 20 20 20  .dll..          
10250 20 20 72 65 6d 6f 76 65 43 6f 6e 73 74 72 61 69    removeConstrai
10260 6e 74 20 66 69 6c 65 5f 53 51 4c 69 74 65 2e 49  nt file_SQLite.I
10270 6e 74 65 72 6f 70 2e 64 6c 6c 0d 0a 0d 0a 20 20  nterop.dll....  
10280 20 20 20 20 20 20 20 20 20 20 74 72 79 44 65 6c            tryDel
10290 65 74 65 41 73 73 65 6d 62 6c 79 20 53 79 73 74  eteAssembly Syst
102a0 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 64  em.Data.SQLite.d
102b0 6c 6c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ll..            
102c0 72 65 6d 6f 76 65 43 6f 6e 73 74 72 61 69 6e 74  removeConstraint
102d0 20 66 69 6c 65 5f 53 79 73 74 65 6d 2e 44 61 74   file_System.Dat
102e0 61 2e 53 51 4c 69 74 65 2e 64 6c 6c 0d 0a 0d 0a  a.SQLite.dll....
102f0 20 20 20 20 20 20 20 20 20 20 20 20 74 72 79 44              tryD
10300 65 6c 65 74 65 41 73 73 65 6d 62 6c 79 20 53 79  eleteAssembly Sy
10310 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
10320 2e 4c 69 6e 71 2e 64 6c 6c 0d 0a 20 20 20 20 20  .Linq.dll..     
10330 20 20 20 20 20 20 20 72 65 6d 6f 76 65 43 6f 6e         removeCon
10340 73 74 72 61 69 6e 74 20 66 69 6c 65 5f 53 79 73  straint file_Sys
10350 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e  tem.Data.SQLite.
10360 4c 69 6e 71 2e 64 6c 6c 0d 0a 20 20 20 20 20 20  Linq.dll..      
10370 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
10380 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
10390 23 20 4e 4f 54 45 3a 20 53 6b 69 70 20 74 72 79  # NOTE: Skip try
103a0 69 6e 67 20 74 6f 20 76 65 72 69 66 79 20 74 68  ing to verify th
103b0 65 20 62 75 69 6c 64 20 64 69 72 65 63 74 6f 72  e build director
103c0 79 20 69 66 20 77 65 20 61 72 65 20 73 6f 0d 0a  y if we are so..
103d0 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20            #     
103e0 20 20 69 6e 73 74 72 75 63 74 65 64 3b 20 6f 74    instructed; ot
103f0 68 65 72 77 69 73 65 2c 20 6d 61 6b 65 20 73 75  herwise, make su
10400 72 65 20 69 74 20 61 63 74 75 61 6c 6c 79 20 65  re it actually e
10410 78 69 73 74 73 20 6f 72 0d 0a 20 20 20 20 20 20  xists or..      
10420 20 20 20 20 23 20 20 20 20 20 20 20 68 61 6c 74      #       halt
10430 20 74 68 65 20 65 6e 74 69 72 65 20 74 65 73 74   the entire test
10440 69 6e 67 20 70 72 6f 63 65 73 73 20 69 66 20 69  ing process if i
10450 74 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74  t does not exist
10460 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a  ...          #..
10470 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b            if {![
10480 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f  info exists ::no
10490 28 76 65 72 69 66 79 42 75 69 6c 64 44 69 72 65  (verifyBuildDire
104a0 63 74 6f 72 79 29 5d 7d 20 74 68 65 6e 20 7b 0d  ctory)]} then {.
104b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a  .            #..
104c0 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f              # NO
104d0 54 45 3a 20 41 74 20 74 68 69 73 20 70 6f 69 6e  TE: At this poin
104e0 74 2c 20 74 68 65 20 62 75 69 6c 64 20 64 69 72  t, the build dir
104f0 65 63 74 6f 72 79 20 4d 55 53 54 20 65 78 69 73  ectory MUST exis
10500 74 20 61 73 20 61 0d 0a 20 20 20 20 20 20 20 20  t as a..        
10510 20 20 20 20 23 20 20 20 20 20 20 20 76 61 6c 69      #       vali
10520 64 20 64 69 72 65 63 74 6f 72 79 20 66 6f 72 20  d directory for 
10530 74 68 65 20 74 65 73 74 69 6e 67 20 70 72 6f 63  the testing proc
10540 65 73 73 20 74 6f 20 63 6f 6e 74 69 6e 75 65 2e  ess to continue.
10550 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 0d  ..            #.
10560 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74  .            set
10570 20 64 69 72 65 63 74 6f 72 79 20 5b 67 65 74 42   directory [getB
10580 75 69 6c 64 44 69 72 65 63 74 6f 72 79 5d 0d 0a  uildDirectory]..
10590 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ..            if
105a0 20 7b 21 5b 66 69 6c 65 20 65 78 69 73 74 73 20   {![file exists 
105b0 24 64 69 72 65 63 74 6f 72 79 5d 20 7c 7c 20 5c  $directory] || \
105c0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
105d0 20 20 21 5b 66 69 6c 65 20 69 73 64 69 72 65 63    ![file isdirec
105e0 74 6f 72 79 20 24 64 69 72 65 63 74 6f 72 79 5d  tory $directory]
105f0 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
10600 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
10610 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a           # NOTE:
10620 20 4a 75 73 74 20 70 72 69 6f 72 20 74 6f 20 61   Just prior to a
10630 63 74 75 61 6c 6c 79 20 68 61 6c 74 69 6e 67 20  ctually halting 
10640 74 68 65 20 74 65 73 74 69 6e 67 20 70 72 6f 63  the testing proc
10650 65 73 73 2c 0d 0a 20 20 20 20 20 20 20 20 20 20  ess,..          
10660 20 20 20 20 23 20 20 20 20 20 20 20 61 64 64 20      #       add 
10670 61 6e 20 65 72 72 6f 72 20 74 6f 20 74 68 65 20  an error to the 
10680 74 65 73 74 20 6c 6f 67 20 66 69 6c 65 2e 0d 0a  test log file...
10690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 0d                #.
106a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74  .              t
106b0 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
106c0 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
106d0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
106e0 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 6f 75 6c        "---- coul
106f0 64 20 6e 6f 74 20 76 65 72 69 66 79 20 62 75 69  d not verify bui
10700 6c 64 20 64 69 72 65 63 74 6f 72 79 20 5c 22 22  ld directory \""
10710 20 24 64 69 72 65 63 74 6f 72 79 20 5c 0d 0a 20   $directory \.. 
10720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10730 20 22 5c 22 2c 20 61 6c 6c 20 74 65 73 74 69 6e   "\", all testin
10740 67 20 68 61 6c 74 65 64 5c 6e 22 5d 0d 0a 0d 0a  g halted\n"]....
10750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 0d                #.
10760 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23  .              #
10770 20 4e 4f 54 45 3a 20 52 61 69 73 69 6e 67 20 61   NOTE: Raising a
10780 20 73 63 72 69 70 74 20 65 72 72 6f 72 20 66 72   script error fr
10790 6f 6d 20 74 68 69 73 20 70 6f 69 6e 74 20 73 68  om this point sh
107a0 6f 75 6c 64 20 68 61 6c 74 0d 0a 20 20 20 20 20  ould halt..     
107b0 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20           #      
107c0 20 74 68 65 20 74 65 73 74 69 6e 67 20 70 72 6f   the testing pro
107d0 63 65 73 73 2e 0d 0a 20 20 20 20 20 20 20 20 20  cess...         
107e0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
107f0 20 20 20 20 20 20 65 72 72 6f 72 20 5b 61 70 70        error [app
10800 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
10810 20 20 20 20 20 20 20 20 20 20 20 20 20 22 63 6f               "co
10820 75 6c 64 20 6e 6f 74 20 76 65 72 69 66 79 20 62  uld not verify b
10830 75 69 6c 64 20 64 69 72 65 63 74 6f 72 79 20 5c  uild directory \
10840 22 22 20 24 64 69 72 65 63 74 6f 72 79 20 5c 0d  "" $directory \.
10850 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
10860 20 20 20 22 5c 22 2c 20 61 6c 6c 20 74 65 73 74     "\", all test
10870 69 6e 67 20 68 61 6c 74 65 64 22 5d 0d 0a 20 20  ing halted"]..  
10880 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
10890 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
108a0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
108b0 20 20 20 23 20 4e 4f 54 45 3a 20 53 6b 69 70 20     # NOTE: Skip 
108c0 74 72 79 69 6e 67 20 74 6f 20 63 6f 70 79 20 61  trying to copy a
108d0 6e 79 20 66 69 6c 65 73 20 69 66 20 77 65 20 61  ny files if we a
108e0 72 65 20 73 6f 20 69 6e 73 74 72 75 63 74 65 64  re so instructed
108f0 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a  ...          #..
10900 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b            if {![
10910 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f  info exists ::no
10920 28 63 6f 70 79 53 71 6c 69 74 65 46 69 6c 65 73  (copySqliteFiles
10930 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  )]} then {..    
10940 20 20 20 20 20 20 20 20 74 72 79 43 6f 70 79 41          tryCopyA
10950 73 73 65 6d 62 6c 79 20 73 71 6c 69 74 65 33 2e  ssembly sqlite3.
10960 64 6c 6c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  dll..           
10970 20 74 72 79 43 6f 70 79 41 73 73 65 6d 62 6c 79   tryCopyAssembly
10980 20 53 51 4c 69 74 65 2e 49 6e 74 65 72 6f 70 2e   SQLite.Interop.
10990 64 6c 6c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  dll..           
109a0 20 74 72 79 43 6f 70 79 41 73 73 65 6d 62 6c 79   tryCopyAssembly
109b0 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c   System.Data.SQL
109c0 69 74 65 2e 64 6c 6c 0d 0a 20 20 20 20 20 20 20  ite.dll..       
109d0 20 20 20 20 20 74 72 79 43 6f 70 79 41 73 73 65       tryCopyAsse
109e0 6d 62 6c 79 20 53 79 73 74 65 6d 2e 44 61 74 61  mbly System.Data
109f0 2e 53 51 4c 69 74 65 2e 4c 69 6e 71 2e 64 6c 6c  .SQLite.Linq.dll
10a00 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d  ..          }...
10a10 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
10a20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
10a30 53 6b 69 70 20 74 72 79 69 6e 67 20 74 6f 20 6c  Skip trying to l
10a40 6f 61 64 20 61 6e 79 20 66 69 6c 65 73 20 69 66  oad any files if
10a50 20 77 65 20 61 72 65 20 73 6f 20 69 6e 73 74 72   we are so instr
10a60 75 63 74 65 64 2e 0d 0a 20 20 20 20 20 20 20 20  ucted...        
10a70 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 69    #..          i
10a80 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73  f {![info exists
10a90 20 3a 3a 6e 6f 28 6c 6f 61 64 53 71 6c 69 74 65   ::no(loadSqlite
10aa0 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d  Files)]} then {.
10ab0 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 72 79  .            try
10ac0 4c 6f 61 64 41 73 73 65 6d 62 6c 79 20 53 79 73  LoadAssembly Sys
10ad0 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e  tem.Data.SQLite.
10ae0 64 6c 6c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  dll..           
10af0 20 74 72 79 4c 6f 61 64 41 73 73 65 6d 62 6c 79   tryLoadAssembly
10b00 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c   System.Data.SQL
10b10 69 74 65 2e 4c 69 6e 71 2e 64 6c 6c 0d 0a 20 20  ite.Linq.dll..  
10b20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
10b30 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
10b40 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 6b 69 70      # NOTE: Skip
10b50 20 74 72 79 69 6e 67 20 74 6f 20 64 65 6c 65 74   trying to delet
10b60 65 20 65 78 74 65 72 6e 61 6c 20 66 69 6c 65 73  e external files
10b70 20 69 66 20 77 65 20 61 72 65 20 73 6f 20 69 6e   if we are so in
10b80 73 74 72 75 63 74 65 64 2e 0d 0a 20 20 20 20 20  structed...     
10b90 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
10ba0 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69    if {![info exi
10bb0 73 74 73 20 3a 3a 6e 6f 28 64 65 6c 65 74 65 53  sts ::no(deleteS
10bc0 71 6c 69 74 65 45 78 74 65 72 6e 61 6c 46 69 6c  qliteExternalFil
10bd0 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  es)]} then {..  
10be0 20 20 20 20 20 20 20 20 20 20 74 72 79 44 65 6c            tryDel
10bf0 65 74 65 42 75 69 6c 64 46 69 6c 65 20 49 6e 73  eteBuildFile Ins
10c00 74 61 6c 6c 65 72 2e 65 78 65 2e 6d 64 61 2e 63  taller.exe.mda.c
10c10 6f 6e 66 69 67 0d 0a 20 20 20 20 20 20 20 20 20  onfig..         
10c20 20 20 20 74 72 79 44 65 6c 65 74 65 42 75 69 6c     tryDeleteBuil
10c30 64 46 69 6c 65 20 74 65 73 74 2e 65 78 65 2e 6d  dFile test.exe.m
10c40 64 61 2e 63 6f 6e 66 69 67 0d 0a 20 20 20 20 20  da.config..     
10c50 20 20 20 20 20 20 20 74 72 79 44 65 6c 65 74 65         tryDelete
10c60 42 75 69 6c 64 46 69 6c 65 20 74 65 73 74 6c 69  BuildFile testli
10c70 6e 71 2e 65 78 65 2e 6d 64 61 2e 63 6f 6e 66 69  nq.exe.mda.confi
10c80 67 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  g..          }..
10c90 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20  ..          #.. 
10ca0 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a           # NOTE:
10cb0 20 53 6b 69 70 20 74 72 79 69 6e 67 20 74 6f 20   Skip trying to 
10cc0 63 6f 70 79 20 65 78 74 65 72 6e 61 6c 20 66 69  copy external fi
10cd0 6c 65 73 20 69 66 20 77 65 20 61 72 65 20 73 6f  les if we are so
10ce0 20 69 6e 73 74 72 75 63 74 65 64 2e 0d 0a 20 20   instructed...  
10cf0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
10d00 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20       if {![info 
10d10 65 78 69 73 74 73 20 3a 3a 6e 6f 28 63 6f 70 79  exists ::no(copy
10d20 53 71 6c 69 74 65 45 78 74 65 72 6e 61 6c 46 69  SqliteExternalFi
10d30 6c 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  les)]} then {.. 
10d40 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
10d50 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45            # NOTE
10d60 3a 20 43 6f 70 79 20 74 68 65 20 4d 44 41 20 63  : Copy the MDA c
10d70 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 66 69 6c  onfiguration fil
10d80 65 20 66 6f 72 20 74 68 65 20 45 61 67 6c 65 20  e for the Eagle 
10d90 73 68 65 6c 6c 20 74 6f 20 74 68 65 0d 0a 20 20  shell to the..  
10da0 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20            #     
10db0 20 20 62 75 69 6c 64 20 6f 75 74 70 75 74 20 64    build output d
10dc0 69 72 65 63 74 6f 72 79 3b 20 68 6f 77 65 76 65  irectory; howeve
10dd0 72 2c 20 75 73 65 20 74 68 65 20 6e 61 6d 65 20  r, use the name 
10de0 6f 66 20 74 68 65 20 6c 65 67 61 63 79 0d 0a 20  of the legacy.. 
10df0 20 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20             #    
10e00 20 20 20 74 65 73 74 20 65 78 65 63 75 74 61 62     test executab
10e10 6c 65 2e 20 20 54 68 69 73 20 77 69 6c 6c 20 6d  le.  This will m
10e20 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68  ake sure that th
10e30 65 20 6c 65 67 61 63 79 20 74 65 73 74 73 0d 0a  e legacy tests..
10e40 20 20 20 20 20 20 20 20 20 20 20 20 23 20 20 20              #   
10e50 20 20 20 20 72 75 6e 20 77 69 74 68 20 74 68 65      run with the
10e60 20 73 61 6d 65 20 73 65 74 20 6f 66 20 4d 44 41   same set of MDA
10e70 73 20 63 6f 6e 66 69 67 75 72 65 64 2e 0d 0a 20  s configured... 
10e80 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
10e90 20 20 20 20 20 20 20 20 20 20 74 72 79 43 6f 70            tryCop
10ea0 79 42 69 6e 61 72 79 46 69 6c 65 20 45 61 67 6c  yBinaryFile Eagl
10eb0 65 53 68 65 6c 6c 2e 65 78 65 2e 6d 64 61 2e 63  eShell.exe.mda.c
10ec0 6f 6e 66 69 67 20 49 6e 73 74 61 6c 6c 65 72 2e  onfig Installer.
10ed0 65 78 65 2e 6d 64 61 2e 63 6f 6e 66 69 67 0d 0a  exe.mda.config..
10ee0 20 20 20 20 20 20 20 20 20 20 20 20 74 72 79 43              tryC
10ef0 6f 70 79 42 69 6e 61 72 79 46 69 6c 65 20 45 61  opyBinaryFile Ea
10f00 67 6c 65 53 68 65 6c 6c 2e 65 78 65 2e 6d 64 61  gleShell.exe.mda
10f10 2e 63 6f 6e 66 69 67 20 74 65 73 74 2e 65 78 65  .config test.exe
10f20 2e 6d 64 61 2e 63 6f 6e 66 69 67 0d 0a 20 20 20  .mda.config..   
10f30 20 20 20 20 20 20 20 20 20 74 72 79 43 6f 70 79           tryCopy
10f40 42 69 6e 61 72 79 46 69 6c 65 20 45 61 67 6c 65  BinaryFile Eagle
10f50 53 68 65 6c 6c 2e 65 78 65 2e 6d 64 61 2e 63 6f  Shell.exe.mda.co
10f60 6e 66 69 67 20 74 65 73 74 6c 69 6e 71 2e 65 78  nfig testlinq.ex
10f70 65 2e 6d 64 61 2e 63 6f 6e 66 69 67 0d 0a 20 20  e.mda.config..  
10f80 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
10f90 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
10fa0 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20  catch {..       
10fb0 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
10fc0 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  _channel [append
10fd0 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
10fe0 20 20 20 20 20 20 22 2d 2d 2d 2d 20 66 69 6c 65        "---- file
10ff0 20 76 65 72 73 69 6f 6e 20 6f 66 20 5c 22 73 71   version of \"sq
11000 6c 69 74 65 33 2e 64 6c 6c 5c 22 2e 2e 2e 20 22  lite3.dll\"... "
11010 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
11020 20 20 5b 66 69 6c 65 20 76 65 72 73 69 6f 6e 20    [file version 
11030 5b 67 65 74 42 69 6e 61 72 79 46 69 6c 65 4e 61  [getBinaryFileNa
11040 6d 65 20 73 71 6c 69 74 65 33 2e 64 6c 6c 5d 5d  me sqlite3.dll]]
11050 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d   \n]..        }.
11060 0a 0d 0a 20 20 20 20 20 20 20 20 63 61 74 63 68  ...        catch
11070 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70   {..          tp
11080 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  uts $::test_chan
11090 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
110a0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
110b0 20 22 2d 2d 2d 2d 20 66 69 6c 65 20 76 65 72 73   "---- file vers
110c0 69 6f 6e 20 6f 66 20 5c 22 53 51 4c 69 74 65 2e  ion of \"SQLite.
110d0 49 6e 74 65 72 6f 70 2e 64 6c 6c 5c 22 2e 2e 2e  Interop.dll\"...
110e0 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20   " \..          
110f0 20 20 20 20 5b 66 69 6c 65 20 76 65 72 73 69 6f      [file versio
11100 6e 20 5b 67 65 74 42 69 6e 61 72 79 46 69 6c 65  n [getBinaryFile
11110 4e 61 6d 65 20 53 51 4c 69 74 65 2e 49 6e 74 65  Name SQLite.Inte
11120 72 6f 70 2e 64 6c 6c 5d 5d 20 5c 6e 5d 0d 0a 20  rop.dll]] \n].. 
11130 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
11140 20 20 20 20 63 61 74 63 68 20 7b 0d 0a 20 20 20      catch {..   
11150 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
11160 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70  test_channel [ap
11170 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
11180 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
11190 66 69 6c 65 20 76 65 72 73 69 6f 6e 20 6f 66 20  file version of 
111a0 5c 22 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51  \"System.Data.SQ
111b0 4c 69 74 65 2e 64 6c 6c 5c 22 2e 2e 2e 20 22 20  Lite.dll\"... " 
111c0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
111d0 20 5b 66 69 6c 65 20 76 65 72 73 69 6f 6e 20 5b   [file version [
111e0 67 65 74 42 69 6e 61 72 79 46 69 6c 65 4e 61 6d  getBinaryFileNam
111f0 65 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51  e System.Data.SQ
11200 4c 69 74 65 2e 64 6c 6c 5d 5d 20 5c 6e 5d 0d 0a  Lite.dll]] \n]..
11210 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
11220 20 20 20 20 20 63 61 74 63 68 20 7b 0d 0a 20 20       catch {..  
11230 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
11240 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61  :test_channel [a
11250 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
11260 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
11270 20 66 69 6c 65 20 76 65 72 73 69 6f 6e 20 6f 66   file version of
11280 20 5c 22 53 79 73 74 65 6d 2e 44 61 74 61 2e 53   \"System.Data.S
11290 51 4c 69 74 65 2e 4c 69 6e 71 2e 64 6c 6c 5c 22  QLite.Linq.dll\"
112a0 2e 2e 2e 20 22 20 5c 0d 0a 20 20 20 20 20 20 20  ... " \..       
112b0 20 20 20 20 20 20 20 5b 66 69 6c 65 20 76 65 72         [file ver
112c0 73 69 6f 6e 20 5b 67 65 74 42 69 6e 61 72 79 46  sion [getBinaryF
112d0 69 6c 65 4e 61 6d 65 20 53 79 73 74 65 6d 2e 44  ileName System.D
112e0 61 74 61 2e 53 51 4c 69 74 65 2e 4c 69 6e 71 2e  ata.SQLite.Linq.
112f0 64 6c 6c 5d 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20  dll]] \n]..     
11300 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
11310 73 65 74 20 61 73 73 65 6d 62 6c 69 65 73 20 5b  set assemblies [
11320 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 41 70  object invoke Ap
11330 70 44 6f 6d 61 69 6e 2e 43 75 72 72 65 6e 74 44  pDomain.CurrentD
11340 6f 6d 61 69 6e 20 47 65 74 41 73 73 65 6d 62 6c  omain GetAssembl
11350 69 65 73 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  ies]....        
11360 6f 62 6a 65 63 74 20 66 6f 72 65 61 63 68 20 61  object foreach a
11370 73 73 65 6d 62 6c 79 20 24 61 73 73 65 6d 62 6c  ssembly $assembl
11380 69 65 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  ies {..         
11390 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6d 61 74   if {[string mat
113a0 63 68 20 5c 7b 53 79 73 74 65 6d 2e 44 61 74 61  ch \{System.Data
113b0 2e 53 51 4c 69 74 65 2a 20 24 61 73 73 65 6d 62  .SQLite* $assemb
113c0 6c 79 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  ly]} then {..   
113d0 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
113e0 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b  ::test_channel [
113f0 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
11400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d                "-
11410 2d 2d 2d 20 66 6f 75 6e 64 20 61 73 73 65 6d 62  --- found assemb
11420 6c 79 3a 20 22 20 24 61 73 73 65 6d 62 6c 79 20  ly: " $assembly 
11430 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  \n]..          }
11440 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  ..        }.... 
11450 20 20 20 20 20 20 20 63 61 74 63 68 20 7b 0d 0a         catch {..
11460 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
11470 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
11480 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
11490 20 22 2d 2d 2d 2d 20 64 65 66 69 6e 65 20 63 6f   "---- define co
114a0 6e 73 74 61 6e 74 73 20 66 6f 72 20 5c 22 53 79  nstants for \"Sy
114b0 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
114c0 5c 22 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 20  \"... "....     
114d0 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20       if {[catch 
114e0 7b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d  {object invoke -
114f0 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63  flags +NonPublic
11500 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
11510 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74        System.Dat
11520 61 2e 53 51 4c 69 74 65 2e 53 51 4c 69 74 65 33  a.SQLite.SQLite3
11530 20 44 65 66 69 6e 65 43 6f 6e 73 74 61 6e 74 73   DefineConstants
11540 7d 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  } \..           
11550 20 20 20 20 20 20 20 64 65 66 69 6e 65 43 6f 6e         defineCon
11560 73 74 61 6e 74 73 5d 20 3d 3d 20 30 7d 20 74 68  stants] == 0} th
11570 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
11580 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
11590 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
115a0 72 67 73 20 5b 66 6f 72 6d 61 74 4c 69 73 74 20  rgs [formatList 
115b0 5b 6c 73 6f 72 74 20 5c 0d 0a 20 20 20 20 20 20  [lsort \..      
115c0 20 20 20 20 20 20 20 20 20 20 24 64 65 66 69 6e            $defin
115d0 65 43 6f 6e 73 74 61 6e 74 73 5d 5d 20 5c 6e 5d  eConstants]] \n]
115e0 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c  ..          } el
115f0 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  se {..          
11600 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
11610 63 68 61 6e 6e 65 6c 20 75 6e 6b 6e 6f 77 6e 5c  channel unknown\
11620 6e 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  n..          }..
11630 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
11640 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
11650 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 74 68  # NOTE: Check th
11660 65 20 61 76 61 69 6c 61 62 6c 65 20 62 75 69 6c  e available buil
11670 64 73 20 6f 66 20 53 51 4c 69 74 65 20 61 6e 64  ds of SQLite and
11680 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c   System.Data.SQL
11690 69 74 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  ite...        #.
116a0 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f  .        checkFo
116b0 72 53 51 4c 69 74 65 42 75 69 6c 64 73 20 24 3a  rSQLiteBuilds $:
116c0 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 0d 0a 0d  :test_channel...
116d0 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
116e0 20 20 20 20 23 20 4e 4f 54 45 3a 20 4e 6f 77 2c      # NOTE: Now,
116f0 20 77 65 20 6e 65 65 64 20 74 6f 20 6b 6e 6f 77   we need to know
11700 20 69 66 20 74 68 65 20 53 51 4c 69 74 65 20 63   if the SQLite c
11710 6f 72 65 20 6c 69 62 72 61 72 79 20 69 73 20 61  ore library is a
11720 76 61 69 6c 61 62 6c 65 0d 0a 20 20 20 20 20 20  vailable..      
11730 20 20 23 20 20 20 20 20 20 20 28 69 2e 65 2e 20    #       (i.e. 
11740 62 65 63 61 75 73 65 20 74 68 65 20 6d 61 6e 61  because the mana
11750 67 65 64 2d 6f 6e 6c 79 20 53 79 73 74 65 6d 2e  ged-only System.
11760 44 61 74 61 2e 53 51 4c 69 74 65 20 61 73 73 65  Data.SQLite asse
11770 6d 62 6c 79 20 63 61 6e 0d 0a 20 20 20 20 20 20  mbly can..      
11780 20 20 23 20 20 20 20 20 20 20 6c 6f 61 64 20 77    #       load w
11790 69 74 68 6f 75 74 20 69 74 3b 20 68 6f 77 65 76  ithout it; howev
117a0 65 72 2c 20 69 74 20 63 61 6e 6e 6f 74 20 64 6f  er, it cannot do
117b0 20 61 6e 79 74 68 69 6e 67 20 75 73 65 66 75 6c   anything useful
117c0 20 77 69 74 68 6f 75 74 0d 0a 20 20 20 20 20 20   without..      
117d0 20 20 23 20 20 20 20 20 20 20 69 74 29 2e 20 20    #       it).  
117e0 49 66 20 77 65 20 61 72 65 20 75 73 69 6e 67 20  If we are using 
117f0 74 68 65 20 6d 69 78 65 64 2d 6d 6f 64 65 20 61  the mixed-mode a
11800 73 73 65 6d 62 6c 79 20 61 6e 64 20 77 65 20 61  ssembly and we a
11810 6c 72 65 61 64 79 0d 0a 20 20 20 20 20 20 20 20  lready..        
11820 23 20 20 20 20 20 20 20 66 6f 75 6e 64 20 69 74  #       found it
11830 20 28 61 62 6f 76 65 29 2c 20 74 68 69 73 20 73   (above), this s
11840 68 6f 75 6c 64 20 61 6c 77 61 79 73 20 73 75 63  hould always suc
11850 63 65 65 64 2e 0d 0a 20 20 20 20 20 20 20 20 23  ceed...        #
11860 0d 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b 46  ..        checkF
11870 6f 72 53 51 4c 69 74 65 20 24 3a 3a 74 65 73 74  orSQLite $::test
11880 5f 63 68 61 6e 6e 65 6c 0d 0a 0d 0a 20 20 20 20  _channel....    
11890 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
118a0 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 74 68 65   NOTE: Check the
118b0 20 53 51 4c 69 74 65 20 64 61 74 61 62 61 73 65   SQLite database
118c0 20 61 6e 64 20 74 65 6d 70 6f 72 61 72 79 20 64   and temporary d
118d0 69 72 65 63 74 6f 72 69 65 73 2e 0d 0a 20 20 20  irectories...   
118e0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
118f0 63 68 65 63 6b 46 6f 72 53 51 4c 69 74 65 44 69  checkForSQLiteDi
11900 72 65 63 74 6f 72 69 65 73 20 24 3a 3a 74 65 73  rectories $::tes
11910 74 5f 63 68 61 6e 6e 65 6c 0d 0a 0d 0a 20 20 20  t_channel....   
11920 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
11930 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74 20  # NOTE: Attempt 
11940 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20  to determine if 
11950 76 61 72 69 6f 75 73 20 63 6f 6d 70 69 6c 65 2d  various compile-
11960 74 69 6d 65 20 6f 70 74 69 6f 6e 73 20 6e 65 65  time options nee
11970 64 65 64 20 66 6f 72 0d 0a 20 20 20 20 20 20 20  ded for..       
11980 20 23 20 20 20 20 20 20 20 74 65 73 74 20 63 6f   #       test co
11990 6e 73 74 72 61 69 6e 74 73 20 77 65 72 65 20 65  nstraints were e
119a0 6e 61 62 6c 65 64 20 66 6f 72 20 74 68 65 20 6d  nabled for the m
119b0 61 6e 61 67 65 64 20 61 73 73 65 6d 62 6c 79 2e  anaged assembly.
119c0 20 20 54 68 65 72 65 0d 0a 20 20 20 20 20 20 20    There..       
119d0 20 23 20 20 20 20 20 20 20 61 72 65 20 73 6f 6d   #       are som
119e0 65 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f  e compile-time o
119f0 70 74 69 6f 6e 73 20 74 68 61 74 20 6d 75 73 74  ptions that must
11a00 20 61 6c 73 6f 20 68 61 76 65 20 62 65 65 6e 20   also have been 
11a10 65 6e 61 62 6c 65 64 0d 0a 20 20 20 20 20 20 20  enabled..       
11a20 20 23 20 20 20 20 20 20 20 66 6f 72 20 74 68 65   #       for the
11a30 20 69 6e 74 65 72 6f 70 20 61 73 73 65 6d 62 6c   interop assembl
11a40 79 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 62 65  y in order to be
11a50 20 65 66 66 65 63 74 69 76 65 2e 20 20 46 6f 72   effective.  For
11a60 20 74 68 6f 73 65 0d 0a 20 20 20 20 20 20 20 20   those..        
11a70 23 20 20 20 20 20 20 20 6f 70 74 69 6f 6e 73 2c  #       options,
11a80 20 69 74 20 77 69 6c 6c 20 62 65 20 61 73 73 75   it will be assu
11a90 6d 65 64 20 74 68 61 74 20 69 74 20 77 61 73 20  med that it was 
11aa0 65 6e 61 62 6c 65 64 20 66 6f 72 20 74 68 65 20  enabled for the 
11ab0 69 6e 74 65 72 6f 70 0d 0a 20 20 20 20 20 20 20  interop..       
11ac0 20 23 20 20 20 20 20 20 20 61 73 73 65 6d 62 6c   #       assembl
11ad0 79 20 69 66 20 69 74 20 77 61 73 20 65 6e 61 62  y if it was enab
11ae0 6c 65 64 20 66 6f 72 20 74 68 65 20 6d 61 6e 61  led for the mana
11af0 67 65 64 20 61 73 73 65 6d 62 6c 79 2e 0d 0a 20  ged assembly... 
11b00 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
11b10 20 20 66 6f 72 65 61 63 68 20 64 65 66 69 6e 65    foreach define
11b20 43 6f 6e 73 74 61 6e 74 20 5b 6c 69 73 74 20 5c  Constant [list \
11b30 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 43 48  ..            CH
11b40 45 43 4b 5f 53 54 41 54 45 20 43 4f 55 4e 54 5f  ECK_STATE COUNT_
11b50 48 41 4e 44 4c 45 20 44 45 42 55 47 20 49 4e 54  HANDLE DEBUG INT
11b60 45 52 4f 50 5f 43 4f 44 45 43 20 49 4e 54 45 52  EROP_CODEC INTER
11b70 4f 50 5f 44 45 42 55 47 20 5c 0d 0a 20 20 20 20  OP_DEBUG \..    
11b80 20 20 20 20 20 20 20 20 49 4e 54 45 52 4f 50 5f          INTEROP_
11b90 45 58 54 45 4e 53 49 4f 4e 5f 46 55 4e 43 54 49  EXTENSION_FUNCTI
11ba0 4f 4e 53 20 49 4e 54 45 52 4f 50 5f 4c 45 47 41  ONS INTEROP_LEGA
11bb0 43 59 5f 43 4c 4f 53 45 20 49 4e 54 45 52 4f 50  CY_CLOSE INTEROP
11bc0 5f 4c 4f 47 20 5c 0d 0a 20 20 20 20 20 20 20 20  _LOG \..        
11bd0 20 20 20 20 49 4e 54 45 52 4f 50 5f 54 45 53 54      INTEROP_TEST
11be0 5f 45 58 54 45 4e 53 49 4f 4e 20 4e 45 54 5f 32  _EXTENSION NET_2
11bf0 30 20 4e 45 54 5f 33 35 20 4e 45 54 5f 34 30 20  0 NET_35 NET_40 
11c00 4e 45 54 5f 34 35 20 4e 45 54 5f 43 4f 4d 50 41  NET_45 NET_COMPA
11c10 43 54 5f 32 30 20 5c 0d 0a 20 20 20 20 20 20 20  CT_20 \..       
11c20 20 20 20 20 20 50 4c 41 54 46 4f 52 4d 5f 43 4f       PLATFORM_CO
11c30 4d 50 41 43 54 46 52 41 4d 45 57 4f 52 4b 20 50  MPACTFRAMEWORK P
11c40 52 45 4c 4f 41 44 5f 4e 41 54 49 56 45 5f 4c 49  RELOAD_NATIVE_LI
11c50 42 52 41 52 59 20 52 45 54 41 52 47 45 54 41 42  BRARY RETARGETAB
11c60 4c 45 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  LE \..          
11c70 20 20 53 51 4c 49 54 45 5f 53 54 41 4e 44 41 52    SQLITE_STANDAR
11c80 44 20 54 48 52 4f 57 5f 4f 4e 5f 44 49 53 50 4f  D THROW_ON_DISPO
11c90 53 45 44 20 54 52 41 43 45 20 54 52 41 43 45 5f  SED TRACE TRACE_
11ca0 43 4f 4e 4e 45 43 54 49 4f 4e 20 5c 0d 0a 20 20  CONNECTION \..  
11cb0 20 20 20 20 20 20 20 20 20 20 54 52 41 43 45 5f            TRACE_
11cc0 48 41 4e 44 4c 45 20 54 52 41 43 45 5f 50 52 45  HANDLE TRACE_PRE
11cd0 4c 4f 41 44 20 54 52 41 43 45 5f 53 54 41 54 45  LOAD TRACE_STATE
11ce0 4d 45 4e 54 20 54 52 41 43 45 5f 57 41 52 4e 49  MENT TRACE_WARNI
11cf0 4e 47 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  NG \..          
11d00 20 20 54 52 41 43 4b 5f 4d 41 52 53 48 41 4c 5f    TRACK_MARSHAL_
11d10 42 59 54 45 53 20 55 53 45 5f 49 4e 54 45 52 4f  BYTES USE_INTERO
11d20 50 5f 44 4c 4c 20 55 53 45 5f 50 52 45 50 41 52  P_DLL USE_PREPAR
11d30 45 5f 56 32 20 57 49 4e 44 4f 57 53 5d 20 7b 0d  E_V2 WINDOWS] {.
11d40 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
11d50 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
11d60 43 68 65 63 6b 20 69 66 20 74 68 65 20 63 6f 6d  Check if the com
11d70 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e  pile-time option
11d80 20 69 73 20 6c 69 73 74 65 64 20 69 6e 20 74 68   is listed in th
11d90 65 20 6c 69 73 74 20 6f 66 0d 0a 20 20 20 20 20  e list of..     
11da0 20 20 20 20 20 23 20 20 20 20 20 20 20 22 64 65       #       "de
11db0 66 69 6e 65 20 63 6f 6e 73 74 61 6e 74 73 22 20  fine constants" 
11dc0 6b 65 70 74 20 74 72 61 63 6b 20 6f 66 20 62 79  kept track of by
11dd0 20 74 68 65 20 6d 61 6e 61 67 65 64 20 61 73 73   the managed ass
11de0 65 6d 62 6c 79 2e 0d 0a 20 20 20 20 20 20 20 20  embly...        
11df0 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 63    #..          c
11e00 68 65 63 6b 46 6f 72 53 51 4c 69 74 65 44 65 66  heckForSQLiteDef
11e10 69 6e 65 43 6f 6e 73 74 61 6e 74 20 24 3a 3a 74  ineConstant $::t
11e20 65 73 74 5f 63 68 61 6e 6e 65 6c 20 24 64 65 66  est_channel $def
11e30 69 6e 65 43 6f 6e 73 74 61 6e 74 0d 0a 20 20 20  ineConstant..   
11e40 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
11e50 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
11e60 4f 54 45 3a 20 43 68 65 63 6b 20 74 68 65 20 63  OTE: Check the c
11e70 75 72 72 65 6e 74 20 62 75 69 6c 64 20 79 65 61  urrent build yea
11e80 72 2e 20 20 42 61 73 69 63 61 6c 6c 79 2c 20 74  r.  Basically, t
11e90 68 69 73 20 69 6e 64 69 63 61 74 65 73 0d 0a 20  his indicates.. 
11ea0 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 77         #       w
11eb0 68 69 63 68 20 76 65 72 73 69 6f 6e 20 6f 66 20  hich version of 
11ec0 4d 53 42 75 69 6c 64 20 61 6e 64 2f 6f 72 20 56  MSBuild and/or V
11ed0 69 73 75 61 6c 20 53 74 75 64 69 6f 20 77 61 73  isual Studio was
11ee0 20 75 73 65 64 20 74 6f 0d 0a 20 20 20 20 20 20   used to..      
11ef0 20 20 23 20 20 20 20 20 20 20 63 6f 6d 70 69 6c    #       compil
11f00 65 20 74 68 65 20 61 73 73 65 6d 62 6c 79 20 62  e the assembly b
11f10 69 6e 61 72 69 65 73 20 75 6e 64 65 72 20 74 65  inaries under te
11f20 73 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  st...        #..
11f30 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
11f40 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5c 0d  :test_channel \.
11f50 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d  .            "--
11f60 2d 2d 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20  -- checking for 
11f70 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
11f80 74 65 20 62 75 69 6c 64 20 79 65 61 72 2e 2e 2e  te build year...
11f90 20 22 0d 0a 0d 0a 20 20 20 20 20 20 20 20 73 65   "....        se
11fa0 74 20 79 65 61 72 20 5b 67 65 74 42 75 69 6c 64  t year [getBuild
11fb0 59 65 61 72 5d 0d 0a 20 20 20 20 20 20 20 20 61  Year]..        a
11fc0 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70  ddConstraint [ap
11fd0 70 65 6e 64 41 72 67 73 20 62 75 69 6c 64 59 65  pendArgs buildYe
11fe0 61 72 2e 20 24 79 65 61 72 5d 0d 0a 20 20 20 20  ar. $year]..    
11ff0 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
12000 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e  t_channel [appen
12010 64 41 72 67 73 20 5c 22 20 24 79 65 61 72 20 5c  dArgs \" $year \
12020 22 5c 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  "\n]....        
12030 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
12040 45 3a 20 43 68 65 63 6b 20 74 68 65 20 63 75 72  E: Check the cur
12050 72 65 6e 74 20 62 75 69 6c 64 20 63 6f 6e 66 69  rent build confi
12060 67 75 72 61 74 69 6f 6e 2e 20 20 54 68 69 73 20  guration.  This 
12070 73 68 6f 75 6c 64 20 6e 6f 72 6d 61 6c 6c 79 0d  should normally.
12080 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
12090 20 62 65 20 65 69 74 68 65 72 20 22 44 65 62 75   be either "Debu
120a0 67 22 20 6f 72 20 22 52 65 6c 65 61 73 65 22 2e  g" or "Release".
120b0 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
120c0 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
120d0 73 74 5f 63 68 61 6e 6e 65 6c 20 5c 0d 0a 20 20  st_channel \..  
120e0 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
120f0 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 53 79 73  checking for Sys
12100 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 20  tem.Data.SQLite 
12110 62 75 69 6c 64 20 63 6f 6e 66 69 67 75 72 61 74  build configurat
12120 69 6f 6e 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20  ion... "....    
12130 20 20 20 20 73 65 74 20 63 6f 6e 66 69 67 75 72      set configur
12140 61 74 69 6f 6e 20 5b 67 65 74 42 75 69 6c 64 43  ation [getBuildC
12150 6f 6e 66 69 67 75 72 61 74 69 6f 6e 5d 0d 0a 20  onfiguration].. 
12160 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72         addConstr
12170 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73  aint [appendArgs
12180 20 62 75 69 6c 64 43 6f 6e 66 69 67 75 72 61 74   buildConfigurat
12190 69 6f 6e 2e 20 24 63 6f 6e 66 69 67 75 72 61 74  ion. $configurat
121a0 69 6f 6e 5d 0d 0a 20 20 20 20 20 20 20 20 74 70  ion]..        tp
121b0 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  uts $::test_chan
121c0 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
121d0 5c 22 20 24 63 6f 6e 66 69 67 75 72 61 74 69 6f  \" $configuratio
121e0 6e 20 5c 22 5c 6e 5d 0d 0a 0d 0a 20 20 20 20 20  n \"\n]....     
121f0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
12200 4e 4f 54 45 3a 20 54 72 79 20 74 6f 20 73 65 74  NOTE: Try to set
12210 75 70 20 61 6e 20 69 6e 74 65 72 72 75 70 74 20  up an interrupt 
12220 63 61 6c 6c 62 61 63 6b 20 75 73 69 6e 67 20 74  callback using t
12230 68 65 20 73 63 72 69 70 74 20 64 65 62 75 67 67  he script debugg
12240 65 72 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  er..        #   
12250 20 20 20 20 74 68 61 74 20 77 69 6c 6c 20 63 61      that will ca
12260 6e 63 65 6c 20 61 6c 6c 20 53 51 4c 20 71 75 65  ncel all SQL que
12270 72 69 65 73 20 69 6e 20 70 72 6f 67 72 65 73 73  ries in progress
12280 20 66 6f 72 20 61 6c 6c 20 64 61 74 61 62 61 73   for all databas
12290 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  e..        #    
122a0 20 20 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 6b     connections k
122b0 6e 6f 77 6e 20 74 6f 20 74 68 69 73 20 69 6e 74  nown to this int
122c0 65 72 70 72 65 74 65 72 2e 0d 0a 20 20 20 20 20  erpreter...     
122d0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 69 66     #..        if
122e0 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20   {![info exists 
122f0 3a 3a 6e 6f 28 73 71 6c 69 74 65 49 6e 74 65 72  ::no(sqliteInter
12300 72 75 70 74 43 61 6c 6c 62 61 63 6b 29 5d 7d 20  ruptCallback)]} 
12310 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
12320 20 20 73 65 74 75 70 44 62 49 6e 74 65 72 72 75    setupDbInterru
12330 70 74 43 61 6c 6c 62 61 63 6b 20 24 3a 3a 74 65  ptCallback $::te
12340 73 74 5f 63 68 61 6e 6e 65 6c 20 24 3a 3a 74 65  st_channel $::te
12350 73 74 5f 6c 6f 67 0d 0a 20 20 20 20 20 20 20 20  st_log..        
12360 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  }....        #..
12370 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
12380 43 68 65 63 6b 20 66 6f 72 20 74 68 65 20 6e 61  Check for the na
12390 74 69 76 65 20 72 75 6e 74 69 6d 65 20 6f 70 74  tive runtime opt
123a0 69 6f 6e 2c 20 77 68 69 63 68 20 77 6f 75 6c 64  ion, which would
123b0 20 6d 65 61 6e 20 77 65 20 61 72 65 0d 0a 20 20   mean we are..  
123c0 20 20 20 20 20 20 23 20 20 20 20 20 20 20 75 73        #       us
123d0 69 6e 67 20 74 68 65 20 6d 69 78 65 64 2d 6d 6f  ing the mixed-mo
123e0 64 65 20 61 73 73 65 6d 62 6c 79 2e 0d 0a 20 20  de assembly...  
123f0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
12400 20 63 68 65 63 6b 46 6f 72 52 75 6e 74 69 6d 65   checkForRuntime
12410 4f 70 74 69 6f 6e 20 24 3a 3a 74 65 73 74 5f 63  Option $::test_c
12420 68 61 6e 6e 65 6c 20 6e 61 74 69 76 65 0d 0a 0d  hannel native...
12430 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
12440 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68 65 63      # NOTE: Chec
12450 6b 20 69 66 20 74 68 65 20 74 65 73 74 20 73 75  k if the test su
12460 69 74 65 20 73 68 6f 75 6c 64 20 63 6f 75 6e 74  ite should count
12470 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63   the number of c
12480 6f 6e 6e 65 63 74 69 6f 6e 73 0d 0a 20 20 20 20  onnections..    
12490 20 20 20 20 23 20 20 20 20 20 20 20 22 6f 70 65      #       "ope
124a0 6e 65 64 22 20 61 6e 64 20 22 63 6c 6f 73 65 64  ned" and "closed
124b0 22 20 66 72 6f 6d 20 74 68 65 20 70 6f 6f 6c 20  " from the pool 
124c0 77 68 65 6e 20 64 65 74 65 72 6d 69 6e 69 6e 67  when determining
124d0 20 69 66 20 61 20 74 65 73 74 0d 0a 20 20 20 20   if a test..    
124e0 20 20 20 20 23 20 20 20 20 20 20 20 70 61 73 73      #       pass
124f0 65 64 2e 20 20 44 69 73 61 62 6c 69 6e 67 20 74  ed.  Disabling t
12500 68 69 73 20 62 65 68 61 76 69 6f 72 20 69 73 20  his behavior is 
12510 73 6f 6d 65 74 69 6d 65 73 20 6e 65 63 65 73 73  sometimes necess
12520 61 72 79 20 28 65 2e 67 2e 0d 0a 20 20 20 20 20  ary (e.g...     
12530 20 20 20 23 20 20 20 20 20 20 20 64 75 72 69 6e     #       durin
12540 67 20 74 68 65 20 72 65 6c 65 61 73 65 20 74 65  g the release te
12550 73 74 69 6e 67 20 70 72 6f 63 65 73 73 29 20 62  sting process) b
12560 65 63 61 75 73 65 20 74 68 65 72 65 20 61 72 65  ecause there are
12570 20 73 65 76 65 72 61 6c 0d 0a 20 20 20 20 20 20   several..      
12580 20 20 23 20 20 20 20 20 20 20 74 65 73 74 73 20    #       tests 
12590 74 68 61 74 20 72 65 6c 79 20 6f 6e 20 74 68 65  that rely on the
125a0 20 22 6f 70 65 6e 65 64 20 66 72 6f 6d 20 70 6f   "opened from po
125b0 6f 6c 22 20 63 6f 75 6e 74 20 62 65 69 6e 67 20  ol" count being 
125c0 67 72 65 61 74 65 72 0d 0a 20 20 20 20 20 20 20  greater..       
125d0 20 23 20 20 20 20 20 20 20 74 68 61 6e 20 7a 65   #       than ze
125e0 72 6f 2e 20 20 54 68 65 73 65 20 74 65 73 74 73  ro.  These tests
125f0 20 6d 61 79 20 66 61 69 6c 20 64 75 65 20 74 6f   may fail due to
12600 20 74 68 65 20 6e 6f 6e 2d 64 65 74 65 72 6d 69   the non-determi
12610 6e 69 73 74 69 63 0d 0a 20 20 20 20 20 20 20 20  nistic..        
12620 23 20 20 20 20 20 20 20 62 65 68 61 76 69 6f 72  #       behavior
12630 20 6f 66 20 74 68 65 20 43 4c 52 20 47 43 2c 20   of the CLR GC, 
12640 65 76 65 6e 20 77 68 65 6e 20 74 68 65 72 65 20  even when there 
12650 69 73 20 6e 6f 20 62 75 67 20 69 6e 20 74 68 65  is no bug in the
12660 20 63 6f 64 65 0d 0a 20 20 20 20 20 20 20 20 23   code..        #
12670 20 20 20 20 20 20 20 62 65 69 6e 67 20 74 65 73         being tes
12680 74 65 64 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  ted...        #.
12690 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f  .        checkFo
126a0 72 52 75 6e 74 69 6d 65 4f 70 74 69 6f 6e 20 24  rRuntimeOption $
126b0 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 6e  ::test_channel n
126c0 6f 50 6f 6f 6c 43 6f 75 6e 74 73 0d 0a 0d 0a 20  oPoolCounts.... 
126d0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
126e0 20 20 23 20 4e 4f 54 45 3a 20 52 65 70 6f 72 74    # NOTE: Report
126f0 20 74 68 65 20 72 65 73 6f 75 72 63 65 20 75 73   the resource us
12700 61 67 65 20 70 72 69 6f 72 20 74 6f 20 72 75 6e  age prior to run
12710 6e 69 6e 67 20 61 6e 79 20 74 65 73 74 73 2e 0d  ning any tests..
12720 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
12730 20 20 20 20 72 65 70 6f 72 74 53 51 4c 69 74 65      reportSQLite
12740 52 65 73 6f 75 72 63 65 73 20 24 3a 3a 74 65 73  Resources $::tes
12750 74 5f 63 68 61 6e 6e 65 6c 0d 0a 0d 0a 20 20 20  t_channel....   
12760 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
12770 23 20 4e 4f 54 45 3a 20 53 68 6f 77 20 74 68 65  # NOTE: Show the
12780 20 61 63 74 69 76 65 20 74 65 73 74 20 63 6f 6e   active test con
12790 73 74 72 61 69 6e 74 73 2e 0d 0a 20 20 20 20 20  straints...     
127a0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 74 70     #..        tp
127b0 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  uts $::test_chan
127c0 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
127d0 22 2d 2d 2d 2d 20 63 6f 6e 73 74 72 61 69 6e 74  "---- constraint
127e0 73 3a 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20  s: " \..        
127f0 20 20 20 20 5b 66 6f 72 6d 61 74 4c 69 73 74 20      [formatList 
12800 5b 6c 73 6f 72 74 20 5b 67 65 74 43 6f 6e 73 74  [lsort [getConst
12810 72 61 69 6e 74 73 5d 5d 5d 20 5c 6e 5d 0d 0a 0d  raints]]] \n]...
12820 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
12830 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 61 76 65      # NOTE: Save
12840 20 74 68 65 20 74 65 73 74 20 63 6f 6e 73 74 72   the test constr
12850 61 69 6e 74 73 20 66 6f 72 20 75 73 65 20 62 79  aints for use by
12860 20 74 68 72 65 61 64 73 20 63 72 65 61 74 65 64   threads created
12870 20 69 6e 20 74 68 69 73 0d 0a 20 20 20 20 20 20   in this..      
12880 20 20 23 20 20 20 20 20 20 20 61 70 70 6c 69 63    #       applic
12890 61 74 69 6f 6e 20 64 6f 6d 61 69 6e 2e 20 20 54  ation domain.  T
128a0 68 69 73 20 69 73 20 6e 65 63 65 73 73 61 72 79  his is necessary
128b0 20 62 65 63 61 75 73 65 20 61 6c 6c 20 74 68 65   because all the
128c0 20 45 61 67 6c 65 0d 0a 20 20 20 20 20 20 20 20   Eagle..        
128d0 23 20 20 20 20 20 20 20 22 74 65 73 74 20 63 6f  #       "test co
128e0 6e 74 65 78 74 22 20 69 6e 66 6f 72 6d 61 74 69  ntext" informati
128f0 6f 6e 20 69 73 20 70 65 72 2d 74 68 72 65 61 64  on is per-thread
12900 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
12910 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f        if {![info
12920 20 65 78 69 73 74 73 20 3a 3a 74 65 73 74 5f 63   exists ::test_c
12930 6f 6e 73 74 72 61 69 6e 74 73 5d 7d 20 74 68 65  onstraints]} the
12940 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73  n {..          s
12950 65 74 20 3a 3a 74 65 73 74 5f 63 6f 6e 73 74 72  et ::test_constr
12960 61 69 6e 74 73 20 24 3a 3a 65 61 67 6c 65 5f 74  aints $::eagle_t
12970 65 73 74 73 28 63 6f 6e 73 74 72 61 69 6e 74 73  ests(constraints
12980 29 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  )..        }....
12990 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
129a0 20 20 20 23 20 4e 4f 54 45 3a 20 4c 6f 61 64 20     # NOTE: Load 
129b0 74 68 65 20 22 61 66 74 65 72 2d 63 6f 6e 73 74  the "after-const
129c0 72 61 69 6e 74 73 22 20 63 75 73 74 6f 6d 20 70  raints" custom p
129d0 65 72 2d 75 73 65 72 20 61 6e 64 2f 6f 72 20 70  er-user and/or p
129e0 65 72 2d 68 6f 73 74 0d 0a 20 20 20 20 20 20 20  er-host..       
129f0 20 23 20 20 20 20 20 20 20 74 65 73 74 20 73 65   #       test se
12a00 74 74 69 6e 67 73 20 6e 6f 77 2e 0d 0a 20 20 20  ttings now...   
12a10 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
12a20 75 70 6c 65 76 65 6c 20 31 20 5b 6c 69 73 74 20  uplevel 1 [list 
12a30 6c 6f 61 64 53 51 4c 69 74 65 54 65 73 74 53 65  loadSQLiteTestSe
12a40 74 74 69 6e 67 73 20 24 3a 3a 74 65 73 74 5f 63  ttings $::test_c
12a50 68 61 6e 6e 65 6c 20 2e 61 66 74 65 72 5d 0d 0a  hannel .after]..
12a60 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
12a70 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 68 6f       # NOTE: Sho
12a80 77 20 77 68 65 6e 20 6f 75 72 20 74 65 73 74 73  w when our tests
12a90 20 61 63 74 75 61 6c 6c 79 20 62 65 67 61 6e 20   actually began 
12aa0 28 6e 6f 77 29 2e 0d 0a 20 20 20 20 20 20 20 20  (now)...        
12ab0 23 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73  #..        tputs
12ac0 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
12ad0 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
12ae0 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
12af0 2d 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51  - System.Data.SQ
12b00 4c 69 74 65 20 74 65 73 74 73 20 62 65 67 61 6e  Lite tests began
12b10 20 61 74 20 22 20 5c 0d 0a 20 20 20 20 20 20 20   at " \..       
12b20 20 20 20 20 20 5b 63 6c 6f 63 6b 20 66 6f 72 6d       [clock form
12b30 61 74 20 5b 63 6c 6f 63 6b 20 73 65 63 6f 6e 64  at [clock second
12b40 73 5d 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d  s]] \n]..      }
12b50 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
12b60 70 72 6f 63 20 72 75 6e 53 51 4c 69 74 65 54 65  proc runSQLiteTe
12b70 73 74 45 70 69 6c 6f 67 75 65 20 7b 7d 20 7b 0d  stEpilogue {} {.
12b80 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
12b90 23 20 4e 4f 54 45 3a 20 53 6b 69 70 20 72 75 6e  # NOTE: Skip run
12ba0 6e 69 6e 67 20 6f 75 72 20 63 75 73 74 6f 6d 20  ning our custom 
12bb0 65 70 69 6c 6f 67 75 65 20 69 66 20 74 68 65 20  epilogue if the 
12bc0 6d 61 69 6e 20 6f 6e 65 20 68 61 73 20 62 65 65  main one has bee
12bd0 6e 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  n..      #      
12be0 20 73 6b 69 70 70 65 64 2e 0d 0a 20 20 20 20 20   skipped...     
12bf0 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 21 5b   #..      if {![
12c00 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f  info exists ::no
12c10 28 65 70 69 6c 6f 67 75 65 2e 65 61 67 6c 65 29  (epilogue.eagle)
12c20 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
12c30 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
12c40 4e 4f 54 45 3a 20 53 68 6f 77 20 77 68 65 6e 20  NOTE: Show when 
12c50 6f 75 72 20 74 65 73 74 73 20 61 63 74 75 61 6c  our tests actual
12c60 6c 79 20 65 6e 64 65 64 20 28 6e 6f 77 29 2e 0d  ly ended (now)..
12c70 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
12c80 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
12c90 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e  t_channel [appen
12ca0 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
12cb0 20 20 20 20 20 22 2d 2d 2d 2d 20 53 79 73 74 65       "---- Syste
12cc0 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 20 74 65  m.Data.SQLite te
12cd0 73 74 73 20 65 6e 64 65 64 20 61 74 20 22 20 5c  sts ended at " \
12ce0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 63  ..            [c
12cf0 6c 6f 63 6b 20 66 6f 72 6d 61 74 20 5b 63 6c 6f  lock format [clo
12d00 63 6b 20 73 65 63 6f 6e 64 73 5d 5d 20 5c 6e 5d  ck seconds]] \n]
12d10 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  ....        #.. 
12d20 20 20 20 20 20 20 20 23 20 42 55 47 46 49 58 3a         # BUGFIX:
12d30 20 42 65 66 6f 72 65 20 63 68 65 63 6b 69 6e 67   Before checking
12d40 20 74 68 65 20 66 69 6e 61 6c 20 72 65 73 6f 75   the final resou
12d50 72 63 65 73 20 69 6e 20 75 73 65 20 62 79 20 53  rces in use by S
12d60 51 4c 69 74 65 2c 20 6d 61 6b 65 0d 0a 20 20 20  QLite, make..   
12d70 20 20 20 20 20 23 20 20 20 20 20 20 20 20 20 73       #         s
12d80 75 72 65 20 62 6f 74 68 20 6f 66 20 74 68 65 20  ure both of the 
12d90 50 52 41 47 4d 41 20 72 65 6c 61 74 65 64 20 64  PRAGMA related d
12da0 69 72 65 63 74 6f 72 79 20 6e 61 6d 65 73 20 61  irectory names a
12db0 72 65 20 66 72 65 65 64 2e 0d 0a 20 20 20 20 20  re freed...     
12dc0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 63 68     #..        ch
12dd0 65 63 6b 46 6f 72 53 51 4c 69 74 65 44 69 72 65  eckForSQLiteDire
12de0 63 74 6f 72 69 65 73 20 24 3a 3a 74 65 73 74 5f  ctories $::test_
12df0 63 68 61 6e 6e 65 6c 20 74 72 75 65 0d 0a 0d 0a  channel true....
12e00 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
12e10 20 20 20 23 20 4e 4f 54 45 3a 20 41 6c 73 6f 20     # NOTE: Also 
12e20 72 65 70 6f 72 74 20 74 68 65 20 72 65 73 6f 75  report the resou
12e30 72 63 65 20 75 73 61 67 65 20 61 66 74 65 72 20  rce usage after 
12e40 72 75 6e 6e 69 6e 67 20 74 68 65 20 74 65 73 74  running the test
12e50 73 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  s...        #.. 
12e60 20 20 20 20 20 20 20 72 65 70 6f 72 74 53 51 4c         reportSQL
12e70 69 74 65 52 65 73 6f 75 72 63 65 73 20 24 3a 3a  iteResources $::
12e80 74 65 73 74 5f 63 68 61 6e 6e 65 6c 0d 0a 0d 0a  test_channel....
12e90 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
12ea0 20 20 20 23 20 4e 4f 54 45 3a 20 52 65 70 6f 72     # NOTE: Repor
12eb0 74 20 74 68 65 20 63 72 69 74 69 63 61 6c 20 68  t the critical h
12ec0 61 6e 64 6c 65 20 63 6f 75 6e 74 73 20 61 66 74  andle counts aft
12ed0 65 72 20 72 75 6e 6e 69 6e 67 20 74 68 65 20 74  er running the t
12ee0 65 73 74 73 2e 0d 0a 20 20 20 20 20 20 20 20 23  ests...        #
12ef0 0d 0a 20 20 20 20 20 20 20 20 67 65 74 53 51 4c  ..        getSQL
12f00 69 74 65 48 61 6e 64 6c 65 43 6f 75 6e 74 73 20  iteHandleCounts 
12f10 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 0d  $::test_channel.
12f20 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d  .      }..    }.
12f30 0a 0c 0d 0a 20 20 20 20 23 23 23 23 23 23 23 23  ....    ########
12f40 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
12f50 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
12f60 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
12f70 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
12f80 23 23 23 0d 0a 20 20 20 20 23 23 23 23 23 23 23  ###..    #######
12f90 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
12fa0 23 23 23 23 23 23 20 45 4e 44 20 45 61 67 6c 65  ###### END Eagle
12fb0 20 4f 4e 4c 59 20 23 23 23 23 23 23 23 23 23 23   ONLY ##########
12fc0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
12fd0 23 23 23 23 0d 0a 20 20 20 20 23 23 23 23 23 23  ####..    ######
12fe0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
12ff0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
13000 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
13010 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
13020 23 23 23 23 23 0d 0a 20 20 7d 0d 0a 0d 0a 20 20  #####..  }....  
13030 23 0d 0a 20 20 23 20 4e 4f 54 45 3a 20 53 61 76  #..  # NOTE: Sav
13040 65 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  e the name of th
13050 65 20 64 69 72 65 63 74 6f 72 79 20 63 6f 6e 74  e directory cont
13060 61 69 6e 69 6e 67 20 74 68 69 73 20 66 69 6c 65  aining this file
13070 2e 0d 0a 20 20 23 0d 0a 20 20 69 66 20 7b 21 5b  ...  #..  if {![
13080 69 6e 66 6f 20 65 78 69 73 74 73 20 63 6f 6d 6d  info exists comm
13090 6f 6e 5f 64 69 72 65 63 74 6f 72 79 5d 7d 20 74  on_directory]} t
130a0 68 65 6e 20 7b 0d 0a 20 20 20 20 73 65 74 20 63  hen {..    set c
130b0 6f 6d 6d 6f 6e 5f 64 69 72 65 63 74 6f 72 79 20  ommon_directory 
130c0 5b 66 69 6c 65 20 64 69 72 6e 61 6d 65 20 5b 69  [file dirname [i
130d0 6e 66 6f 20 73 63 72 69 70 74 5d 5d 0d 0a 20 20  nfo script]]..  
130e0 7d 0d 0a 0d 0a 20 20 23 0d 0a 20 20 23 20 4e 4f  }....  #..  # NO
130f0 54 45 3a 20 50 72 6f 76 69 64 65 20 74 68 65 20  TE: Provide the 
13100 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
13110 74 65 20 74 65 73 74 20 70 61 63 6b 61 67 65 20  te test package 
13120 74 6f 20 74 68 65 20 69 6e 74 65 72 70 72 65 74  to the interpret
13130 65 72 2e 0d 0a 20 20 23 0d 0a 20 20 70 61 63 6b  er...  #..  pack
13140 61 67 65 20 70 72 6f 76 69 64 65 20 53 79 73 74  age provide Syst
13150 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 54  em.Data.SQLite.T
13160 65 73 74 20 31 2e 30 0d 0a 7d 0d 0a              est 1.0..}..