System.Data.SQLite
Hex Artifact Content
Not logged in

Artifact fef495b13cbd8d6ed8c690cd38c736ec7a8dcaad:


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 43 6f 6e 66 69 67 75 72  getBuildConfigur
0f40: 61 74 69 6f 6e 20 7b 7d 20 7b 0d 0a 20 20 20 20  ation {} {..    
0f50: 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
0f60: 45 3a 20 53 65 65 20 69 66 20 74 68 65 20 22 63  E: See if the "c
0f70: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 22 20 73 65  onfiguration" se
0f80: 74 74 69 6e 67 20 68 61 73 20 62 65 65 6e 20 6f  tting has been o
0f90: 76 65 72 72 69 64 64 65 6e 20 62 79 20 74 68 65  verridden by the
0fa0: 20 75 73 65 72 0d 0a 20 20 20 20 20 20 23 20 20   user..      #  
0fb0: 20 20 20 20 20 28 65 2e 67 2e 20 6f 6e 20 74 68       (e.g. on th
0fc0: 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 29 2e  e command line).
0fd0: 20 20 54 68 69 73 20 68 65 6c 70 73 20 63 6f 6e    This helps con
0fe0: 74 72 6f 6c 20 65 78 61 63 74 6c 79 20 77 68 69  trol exactly whi
0ff0: 63 68 20 73 65 74 0d 0a 20 20 20 20 20 20 23 20  ch set..      # 
1000: 20 20 20 20 20 20 6f 66 20 62 69 6e 61 72 69 65        of binarie
1010: 73 20 77 65 20 61 72 65 20 74 65 73 74 69 6e 67  s we are testing
1020: 20 28 69 2e 65 2e 20 74 68 6f 73 65 20 62 75 69   (i.e. those bui
1030: 6c 74 20 69 6e 20 74 68 65 20 22 44 65 62 75 67  lt in the "Debug
1040: 22 20 6f 72 0d 0a 20 20 20 20 20 20 23 20 20 20  " or..      #   
1050: 20 20 20 20 22 52 65 6c 65 61 73 65 22 20 62 75      "Release" bu
1060: 69 6c 64 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  ild configuratio
1070: 6e 73 29 2e 20 20 54 6f 20 6f 76 65 72 72 69 64  ns).  To overrid
1080: 65 20 74 68 69 73 20 76 61 6c 75 65 20 76 69 61  e this value via
1090: 20 74 68 65 0d 0a 20 20 20 20 20 20 23 20 20 20   the..      #   
10a0: 20 20 20 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65      command line
10b0: 2c 20 65 6e 74 65 72 20 61 20 63 6f 6d 6d 61 6e  , enter a comman
10c0: 64 20 73 69 6d 69 6c 61 72 20 74 6f 20 6f 6e 65  d similar to one
10d0: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
10e0: 67 20 28 61 6c 6c 0d 0a 20 20 20 20 20 20 23 20  g (all..      # 
10f0: 20 20 20 20 20 20 6f 6e 20 6f 6e 65 20 6c 69 6e        on one lin
1100: 65 29 3a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  e):..      #..  
1110: 20 20 20 20 23 20 20 20 20 20 20 20 45 61 67 6c      #       Eagl
1120: 65 53 68 65 6c 6c 2e 65 78 65 20 2d 70 72 65 49  eShell.exe -preI
1130: 6e 69 74 69 61 6c 69 7a 65 20 22 73 65 74 20 74  nitialize "set t
1140: 65 73 74 5f 63 6f 6e 66 69 67 75 72 61 74 69 6f  est_configuratio
1150: 6e 20 44 65 62 75 67 22 0d 0a 20 20 20 20 20 20  n Debug"..      
1160: 23 20 20 20 20 20 20 20 20 20 2d 66 69 6c 65 20  #         -file 
1170: 2e 5c 70 61 74 68 5c 74 6f 5c 61 6c 6c 2e 65 61  .\path\to\all.ea
1180: 67 6c 65 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  gle..      #..  
1190: 20 20 20 20 23 20 20 20 20 20 20 20 45 61 67 6c      #       Eagl
11a0: 65 53 68 65 6c 6c 2e 65 78 65 20 2d 70 72 65 49  eShell.exe -preI
11b0: 6e 69 74 69 61 6c 69 7a 65 20 22 73 65 74 20 74  nitialize "set t
11c0: 65 73 74 5f 63 6f 6e 66 69 67 75 72 61 74 69 6f  est_configuratio
11d0: 6e 20 52 65 6c 65 61 73 65 22 0d 0a 20 20 20 20  n Release"..    
11e0: 20 20 23 20 20 20 20 20 20 20 20 20 2d 66 69 6c    #         -fil
11f0: 65 20 2e 5c 70 61 74 68 5c 74 6f 5c 61 6c 6c 2e  e .\path\to\all.
1200: 65 61 67 6c 65 0d 0a 20 20 20 20 20 20 23 0d 0a  eagle..      #..
1210: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 45 61        #       Ea
1220: 67 6c 65 53 68 65 6c 6c 2e 65 78 65 20 2d 66 69  gleShell.exe -fi
1230: 6c 65 20 2e 5c 70 61 74 68 5c 74 6f 5c 61 6c 6c  le .\path\to\all
1240: 2e 65 61 67 6c 65 20 2d 70 72 65 54 65 73 74 0d  .eagle -preTest.
1250: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 20  .      #        
1260: 20 22 75 6e 73 65 74 20 2d 6e 6f 63 6f 6d 70 6c   "unset -nocompl
1270: 61 69 6e 20 74 65 73 74 5f 63 6f 6e 66 69 67 75  ain test_configu
1280: 72 61 74 69 6f 6e 22 0d 0a 20 20 20 20 20 20 23  ration"..      #
1290: 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66  ..      if {[inf
12a0: 6f 20 65 78 69 73 74 73 20 3a 3a 74 65 73 74 5f  o exists ::test_
12b0: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 5d 20 26  configuration] &
12c0: 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b  & \..          [
12d0: 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a  string length $:
12e0: 3a 74 65 73 74 5f 63 6f 6e 66 69 67 75 72 61 74  :test_configurat
12f0: 69 6f 6e 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b  ion] > 0} then {
1300: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
1310: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 55 73 65       # NOTE: Use
1320: 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 74   the specified t
1330: 65 73 74 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  est configuratio
1340: 6e 2e 20 20 54 68 65 20 64 65 66 61 75 6c 74 20  n.  The default 
1350: 76 61 6c 75 65 20 75 73 65 64 0d 0a 20 20 20 20  value used..    
1360: 20 20 20 20 23 20 20 20 20 20 20 20 66 6f 72 20      #       for 
1370: 74 68 69 73 20 76 61 72 69 61 62 6c 65 20 69 73  this variable is
1380: 20 22 52 65 6c 65 61 73 65 22 2c 20 61 73 20 73   "Release", as s
1390: 65 74 20 62 79 20 74 68 65 20 74 65 73 74 20 73  et by the test s
13a0: 75 69 74 65 20 69 74 73 65 6c 66 2e 0d 0a 20 20  uite itself...  
13b0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
13c0: 20 72 65 74 75 72 6e 20 24 3a 3a 74 65 73 74 5f   return $::test_
13d0: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 0d 0a 20  configuration.. 
13e0: 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
13f0: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
1400: 20 20 23 20 4e 4f 54 45 3a 20 4e 6f 72 6d 61 6c    # NOTE: Normal
1410: 6c 79 2c 20 77 65 20 77 69 6c 6c 20 6e 65 76 65  ly, we will neve
1420: 72 20 68 69 74 20 74 68 69 73 20 63 61 73 65 20  r hit this case 
1430: 62 65 63 61 75 73 65 20 74 68 65 20 76 61 6c 75  because the valu
1440: 65 20 6f 66 20 74 68 65 0d 0a 20 20 20 20 20 20  e of the..      
1450: 20 20 23 20 20 20 20 20 20 20 74 65 73 74 20 63    #       test c
1460: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 76 61 72  onfiguration var
1470: 69 61 62 6c 65 20 69 73 20 61 6c 77 61 79 73 20  iable is always 
1480: 73 65 74 20 62 79 20 74 68 65 20 74 65 73 74 20  set by the test 
1490: 73 75 69 74 65 0d 0a 20 20 20 20 20 20 20 20 23  suite..        #
14a0: 20 20 20 20 20 20 20 69 74 73 65 6c 66 3b 20 68         itself; h
14b0: 6f 77 65 76 65 72 2c 20 69 74 20 63 61 6e 20 62  owever, it can b
14c0: 65 20 6f 76 65 72 72 69 64 64 65 6e 20 75 73 69  e overridden usi
14d0: 6e 67 20 74 68 65 20 75 6e 73 65 74 20 63 6f 6d  ng the unset com
14e0: 6d 61 6e 64 0d 0a 20 20 20 20 20 20 20 20 23 20  mand..        # 
14f0: 20 20 20 20 20 20 66 72 6f 6d 20 74 68 65 20 2d        from the -
1500: 70 72 65 54 65 73 74 20 6f 70 74 69 6f 6e 20 74  preTest option t
1510: 6f 20 74 68 65 20 74 65 73 74 20 73 75 69 74 65  o the test suite
1520: 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
1530: 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 3a 3a        return $::
1540: 65 61 67 6c 65 5f 70 6c 61 74 66 6f 72 6d 28 63  eagle_platform(c
1550: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 29 0d 0a 20  onfiguration).. 
1560: 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c       }..    }...
1570: 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74 42 75  ..    proc getBu
1580: 69 6c 64 44 69 72 65 63 74 6f 72 79 20 7b 7d 20  ildDirectory {} 
1590: 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  {..      #..    
15a0: 20 20 23 20 4e 4f 54 45 3a 20 53 65 65 20 69 66    # NOTE: See if
15b0: 20 74 68 65 20 22 6e 61 74 69 76 65 22 20 72 75   the "native" ru
15c0: 6e 74 69 6d 65 20 6f 70 74 69 6f 6e 20 68 61 73  ntime option has
15d0: 20 62 65 65 6e 20 73 65 74 2e 20 20 49 66 20 73   been set.  If s
15e0: 6f 2c 20 75 73 65 20 74 68 65 0d 0a 20 20 20 20  o, use the..    
15f0: 20 20 23 20 20 20 20 20 20 20 64 69 72 65 63 74    #       direct
1600: 6f 72 79 20 66 6f 72 20 74 68 65 20 6d 69 78 65  ory for the mixe
1610: 64 2d 6d 6f 64 65 20 61 73 73 65 6d 62 6c 79 20  d-mode assembly 
1620: 28 61 2e 6b 2e 61 2e 20 74 68 65 20 6e 61 74 69  (a.k.a. the nati
1630: 76 65 20 69 6e 74 65 72 6f 70 0d 0a 20 20 20 20  ve interop..    
1640: 20 20 23 20 20 20 20 20 20 20 61 73 73 65 6d 62    #       assemb
1650: 6c 79 29 2e 20 20 54 6f 20 65 6e 61 62 6c 65 20  ly).  To enable 
1660: 74 68 69 73 20 6f 70 74 69 6f 6e 20 76 69 61 20  this option via 
1670: 74 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65  the command line
1680: 2c 20 65 6e 74 65 72 20 61 0d 0a 20 20 20 20 20  , enter a..     
1690: 20 23 20 20 20 20 20 20 20 63 6f 6d 6d 61 6e 64   #       command
16a0: 20 73 69 6d 69 6c 61 72 20 74 6f 20 6f 6e 65 20   similar to one 
16b0: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
16c0: 20 28 61 6c 6c 20 6f 6e 20 6f 6e 65 20 6c 69 6e   (all on one lin
16d0: 65 29 3a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  e):..      #..  
16e0: 20 20 20 20 23 20 20 20 20 20 20 20 45 61 67 6c      #       Eagl
16f0: 65 53 68 65 6c 6c 2e 65 78 65 20 2d 69 6e 69 74  eShell.exe -init
1700: 69 61 6c 69 7a 65 20 2d 72 75 6e 74 69 6d 65 4f  ialize -runtimeO
1710: 70 74 69 6f 6e 20 6e 61 74 69 76 65 0d 0a 20 20  ption native..  
1720: 20 20 20 20 23 20 20 20 20 20 20 20 20 20 2d 66      #         -f
1730: 69 6c 65 20 2e 5c 70 61 74 68 5c 74 6f 5c 61 6c  ile .\path\to\al
1740: 6c 2e 65 61 67 6c 65 0d 0a 20 20 20 20 20 20 23  l.eagle..      #
1750: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
1760: 54 6f 20 65 6e 61 62 6c 65 20 74 68 69 73 20 6f  To enable this o
1770: 70 74 69 6f 6e 20 76 69 61 20 74 68 65 20 63 6f  ption via the co
1780: 6d 6d 61 6e 64 20 6c 69 6e 65 20 70 72 69 6f 72  mmand line prior
1790: 20 74 6f 20 74 68 65 20 22 62 65 74 61 20 31 36   to the "beta 16
17a0: 22 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  "..      #      
17b0: 20 72 65 6c 65 61 73 65 20 6f 66 20 45 61 67 6c   release of Eagl
17c0: 65 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  e, the following
17d0: 20 63 6f 6d 6d 61 6e 64 20 6d 75 73 74 20 62 65   command must be
17e0: 20 75 73 65 64 20 69 6e 73 74 65 61 64 0d 0a 20   used instead.. 
17f0: 20 20 20 20 20 23 20 20 20 20 20 20 20 28 61 6c       #       (al
1800: 73 6f 20 61 6c 6c 20 6f 6e 20 6f 6e 65 20 6c 69  so all on one li
1810: 6e 65 29 3a 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ne):..      #.. 
1820: 20 20 20 20 20 23 20 20 20 20 20 20 20 45 61 67       #       Eag
1830: 6c 65 53 68 65 6c 6c 2e 65 78 65 20 2d 69 6e 69  leShell.exe -ini
1840: 74 69 61 6c 69 7a 65 20 2d 70 6f 73 74 49 6e 69  tialize -postIni
1850: 74 69 61 6c 69 7a 65 0d 0a 20 20 20 20 20 20 23  tialize..      #
1860: 20 20 20 20 20 20 20 20 20 22 6f 62 6a 65 63 74           "object
1870: 20 69 6e 76 6f 6b 65 20 49 6e 74 65 72 70 72 65   invoke Interpre
1880: 74 65 72 2e 47 65 74 41 63 74 69 76 65 20 41 64  ter.GetActive Ad
1890: 64 52 75 6e 74 69 6d 65 4f 70 74 69 6f 6e 20 6e  dRuntimeOption n
18a0: 61 74 69 76 65 22 0d 0a 20 20 20 20 20 20 23 20  ative"..      # 
18b0: 20 20 20 20 20 20 20 20 2d 66 69 6c 65 20 2e 5c          -file .\
18c0: 70 61 74 68 5c 74 6f 5c 61 6c 6c 2e 65 61 67 6c  path\to\all.eagl
18d0: 65 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  e..      #..    
18e0: 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73    if {[info exis
18f0: 74 73 20 3a 3a 62 75 69 6c 64 5f 64 69 72 65 63  ts ::build_direc
1900: 74 6f 72 79 5d 20 26 26 20 5c 0d 0a 20 20 20 20  tory] && \..    
1910: 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65        [string le
1920: 6e 67 74 68 20 24 3a 3a 62 75 69 6c 64 5f 64 69  ngth $::build_di
1930: 72 65 63 74 6f 72 79 5d 20 3e 20 30 7d 20 74 68  rectory] > 0} th
1940: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d  en {..        #.
1950: 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
1960: 20 54 68 65 20 6c 6f 63 61 74 69 6f 6e 20 6f 66   The location of
1970: 20 74 68 65 20 62 75 69 6c 64 20 64 69 72 65 63   the build direc
1980: 74 6f 72 79 20 68 61 73 20 62 65 65 6e 20 6f 76  tory has been ov
1990: 65 72 72 69 64 64 65 6e 3b 0d 0a 20 20 20 20 20  erridden;..     
19a0: 20 20 20 23 20 20 20 20 20 20 20 74 68 65 72 65     #       there
19b0: 66 6f 72 65 2c 20 75 73 65 20 69 74 20 76 65 72  fore, use it ver
19c0: 62 61 74 69 6d 2e 0d 0a 20 20 20 20 20 20 20 20  batim...        
19d0: 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  #..        retur
19e0: 6e 20 24 3a 3a 62 75 69 6c 64 5f 64 69 72 65 63  n $::build_direc
19f0: 74 6f 72 79 0d 0a 20 20 20 20 20 20 7d 20 65 6c  tory..      } el
1a00: 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d  se {..        #.
1a10: 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
1a20: 20 46 69 67 75 72 65 20 6f 75 74 20 74 68 65 20   Figure out the 
1a30: 62 75 69 6c 64 20 62 61 73 65 20 64 69 72 65 63  build base direc
1a40: 74 6f 72 79 2e 20 20 54 68 69 73 20 77 69 6c 6c  tory.  This will
1a50: 20 62 65 20 74 68 65 20 64 69 72 65 63 74 6f 72   be the director
1a60: 79 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  y..        #    
1a70: 20 20 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73     that contains
1a80: 20 74 68 65 20 61 63 74 75 61 6c 20 62 75 69 6c   the actual buil
1a90: 64 20 6f 75 74 70 75 74 20 64 69 72 65 63 74 6f  d output directo
1aa0: 72 79 20 28 65 2e 67 2e 20 22 62 69 6e 22 29 2e  ry (e.g. "bin").
1ab0: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
1ac0: 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65       if {[info e
1ad0: 78 69 73 74 73 20 3a 3a 62 75 69 6c 64 5f 62 61  xists ::build_ba
1ae0: 73 65 5f 64 69 72 65 63 74 6f 72 79 5d 20 26 26  se_directory] &&
1af0: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
1b00: 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
1b10: 3a 3a 62 75 69 6c 64 5f 62 61 73 65 5f 64 69 72  ::build_base_dir
1b20: 65 63 74 6f 72 79 5d 20 3e 20 30 7d 20 74 68 65  ectory] > 0} the
1b30: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 23  n {..          #
1b40: 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f  ..          # NO
1b50: 54 45 3a 20 54 68 65 20 6c 6f 63 61 74 69 6f 6e  TE: The location
1b60: 20 6f 66 20 74 68 65 20 62 75 69 6c 64 20 62 61   of the build ba
1b70: 73 65 20 64 69 72 65 63 74 6f 72 79 20 68 61 73  se directory has
1b80: 20 62 65 65 6e 20 6f 76 65 72 72 69 64 64 65 6e   been overridden
1b90: 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 20  ;..          #  
1ba0: 20 20 20 20 20 74 68 65 72 65 66 6f 72 65 2c 20       therefore, 
1bb0: 75 73 65 20 69 74 20 76 65 72 62 61 74 69 6d 2e  use it verbatim.
1bc0: 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20  ..          #.. 
1bd0: 20 20 20 20 20 20 20 20 20 73 65 74 20 70 61 74           set pat
1be0: 68 20 24 3a 3a 62 75 69 6c 64 5f 62 61 73 65 5f  h $::build_base_
1bf0: 64 69 72 65 63 74 6f 72 79 0d 0a 20 20 20 20 20  directory..     
1c00: 20 20 20 7d 20 65 6c 73 65 69 66 20 7b 5b 69 6e     } elseif {[in
1c10: 66 6f 20 65 78 69 73 74 73 20 3a 3a 63 6f 6d 6d  fo exists ::comm
1c20: 6f 6e 5f 64 69 72 65 63 74 6f 72 79 5d 20 26 26  on_directory] &&
1c30: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
1c40: 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
1c50: 3a 3a 63 6f 6d 6d 6f 6e 5f 64 69 72 65 63 74 6f  ::common_directo
1c60: 72 79 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d  ry] > 0} then {.
1c70: 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
1c80: 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
1c90: 4e 65 78 74 2c 20 66 61 6c 6c 62 61 63 6b 20 74  Next, fallback t
1ca0: 6f 20 74 68 65 20 70 61 72 65 6e 74 20 64 69 72  o the parent dir
1cb0: 65 63 74 6f 72 79 20 6f 66 20 74 68 65 20 6f 6e  ectory of the on
1cc0: 65 20 63 6f 6e 74 61 69 6e 69 6e 67 0d 0a 20 20  e containing..  
1cd0: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
1ce0: 74 68 69 73 20 66 69 6c 65 20 28 69 2e 65 2e 20  this file (i.e. 
1cf0: 22 63 6f 6d 6d 6f 6e 2e 65 61 67 6c 65 22 29 2c  "common.eagle"),
1d00: 20 69 66 20 61 76 61 69 6c 61 62 6c 65 2e 0d 0a   if available...
1d10: 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
1d20: 20 20 20 20 20 20 20 73 65 74 20 70 61 74 68 20         set path 
1d30: 5b 66 69 6c 65 20 64 69 72 6e 61 6d 65 20 24 3a  [file dirname $:
1d40: 3a 63 6f 6d 6d 6f 6e 5f 64 69 72 65 63 74 6f 72  :common_director
1d50: 79 5d 0d 0a 20 20 20 20 20 20 20 20 7d 20 65 6c  y]..        } el
1d60: 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  se {..          
1d70: 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e  #..          # N
1d80: 4f 54 45 3a 20 46 69 6e 61 6c 6c 79 2c 20 66 61  OTE: Finally, fa
1d90: 6c 6c 62 61 63 6b 20 74 6f 20 74 68 65 20 70 61  llback to the pa
1da0: 72 65 6e 74 20 64 69 72 65 63 74 6f 72 79 20 6f  rent directory o
1db0: 66 20 74 68 65 20 45 61 67 6c 65 54 65 73 74 0d  f the EagleTest.
1dc0: 0a 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20  .          #    
1dd0: 20 20 20 70 61 74 68 2e 20 20 54 68 65 20 45 61     path.  The Ea
1de0: 67 6c 65 54 65 73 74 20 70 61 63 6b 61 67 65 20  gleTest package 
1df0: 67 75 61 72 61 6e 74 65 65 73 20 74 68 61 74 20  guarantees that 
1e00: 74 68 69 73 20 76 61 72 69 61 62 6c 65 0d 0a 20  this variable.. 
1e10: 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20           #      
1e20: 20 77 69 6c 6c 20 62 65 20 73 65 74 20 74 6f 20   will be set to 
1e30: 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 63 6f  the directory co
1e40: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 66 69 72  ntaining the fir
1e50: 73 74 20 66 69 6c 65 20 74 6f 0d 0a 20 20 20 20  st file to..    
1e60: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 65 78        #       ex
1e70: 65 63 75 74 65 20 74 68 65 20 5b 72 75 6e 54 65  ecute the [runTe
1e80: 73 74 50 72 6f 6c 6f 67 75 65 5d 20 73 63 72 69  stPrologue] scri
1e90: 70 74 20 6c 69 62 72 61 72 79 20 70 72 6f 63 65  pt library proce
1ea0: 64 75 72 65 2e 0d 0a 20 20 20 20 20 20 20 20 20  dure...         
1eb0: 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65   #..          se
1ec0: 74 20 70 61 74 68 20 5b 66 69 6c 65 20 64 69 72  t path [file dir
1ed0: 6e 61 6d 65 20 24 3a 3a 70 61 74 68 5d 0d 0a 20  name $::path].. 
1ee0: 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
1ef0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
1f00: 20 4e 4f 54 45 3a 20 49 66 20 74 68 65 20 22 6e   NOTE: If the "n
1f10: 61 74 69 76 65 22 20 72 75 6e 74 69 6d 65 20 6f  ative" runtime o
1f20: 70 74 69 6f 6e 20 69 73 20 73 65 74 2c 20 74 68  ption is set, th
1f30: 65 20 6d 69 78 65 64 2d 6d 6f 64 65 20 61 73 73  e mixed-mode ass
1f40: 65 6d 62 6c 79 0d 0a 20 20 20 20 20 20 20 20 23  embly..        #
1f50: 20 20 20 20 20 20 20 69 73 20 62 65 69 6e 67 20         is being 
1f60: 74 65 73 74 65 64 2e 20 20 49 6e 20 74 68 61 74  tested.  In that
1f70: 20 63 61 73 65 2c 20 74 68 65 20 70 61 74 68 20   case, the path 
1f80: 74 6f 20 74 68 65 20 62 75 69 6c 64 20 64 69 72  to the build dir
1f90: 65 63 74 6f 72 79 0d 0a 20 20 20 20 20 20 20 20  ectory..        
1fa0: 23 20 20 20 20 20 20 20 77 69 6c 6c 20 63 6f 6e  #       will con
1fb0: 74 61 69 6e 20 74 68 65 20 70 6c 61 74 66 6f 72  tain the platfor
1fc0: 6d 20 6e 61 6d 65 20 61 6e 64 20 61 6c 6c 20 74  m name and all t
1fd0: 68 65 20 62 69 6e 61 72 69 65 73 20 75 6e 64 65  he binaries unde
1fe0: 72 20 74 65 73 74 0d 0a 20 20 20 20 20 20 20 20  r test..        
1ff0: 23 20 20 20 20 20 20 20 73 68 6f 75 6c 64 20 62  #       should b
2000: 65 20 70 72 65 73 65 6e 74 20 69 6e 20 74 68 61  e present in tha
2010: 74 20 64 69 72 65 63 74 6f 72 79 2e 20 20 49 66  t directory.  If
2020: 20 74 68 65 20 22 6e 61 74 69 76 65 22 20 72 75   the "native" ru
2030: 6e 74 69 6d 65 0d 0a 20 20 20 20 20 20 20 20 23  ntime..        #
2040: 20 20 20 20 20 20 20 6f 70 74 69 6f 6e 20 69 73         option is
2050: 20 6e 6f 74 20 73 65 74 2c 20 74 68 65 20 62 75   not set, the bu
2060: 69 6c 64 20 64 69 72 65 63 74 6f 72 79 20 77 69  ild directory wi
2070: 6c 6c 20 62 65 20 63 6f 6e 73 69 64 65 72 65 64  ll be considered
2080: 20 74 6f 20 62 65 0d 0a 20 20 20 20 20 20 20 20   to be..        
2090: 23 20 20 20 20 20 20 20 22 70 6c 61 74 66 6f 72  #       "platfor
20a0: 6d 2d 6e 65 75 74 72 61 6c 22 2c 20 77 69 74 68  m-neutral", with
20b0: 20 74 68 65 20 6e 6f 74 61 62 6c 65 20 65 78 63   the notable exc
20c0: 65 70 74 69 6f 6e 20 6f 66 20 61 6e 79 20 6e 61  eption of any na
20d0: 74 69 76 65 0d 0a 20 20 20 20 20 20 20 20 23 20  tive..        # 
20e0: 20 20 20 20 20 20 61 73 73 65 6d 62 6c 79 20 28        assembly (
20f0: 65 2e 67 2e 20 22 53 51 4c 69 74 65 2e 49 6e 74  e.g. "SQLite.Int
2100: 65 72 6f 70 2e 64 6c 6c 22 29 20 63 6f 70 69 65  erop.dll") copie
2110: 64 20 74 68 65 72 65 20 64 75 72 69 6e 67 20 74  d there during t
2120: 68 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  he..        #   
2130: 20 20 20 20 62 75 69 6c 64 20 70 72 6f 63 65 73      build proces
2140: 73 20 69 74 73 65 6c 66 2e 20 20 49 66 20 74 68  s itself.  If th
2150: 65 20 62 75 69 6c 64 20 70 72 6f 63 65 73 73 20  e build process 
2160: 73 6f 6d 65 68 6f 77 20 64 6f 65 73 20 6e 6f 74  somehow does not
2170: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
2180: 20 20 63 6f 70 79 20 74 68 65 20 6e 61 74 69 76    copy the nativ
2190: 65 20 61 73 73 65 6d 62 6c 79 20 66 6f 72 20 74  e assembly for t
21a0: 68 69 73 20 70 6c 61 74 66 6f 72 6d 2c 20 6d 6f  his platform, mo
21b0: 73 74 20 6f 66 20 74 68 65 20 74 65 73 74 73 0d  st of the tests.
21c0: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
21d0: 20 69 6e 20 74 68 65 20 73 75 69 74 65 20 77 69   in the suite wi
21e0: 6c 6c 20 73 69 6d 70 6c 79 20 62 65 20 73 6b 69  ll simply be ski
21f0: 70 70 65 64 2e 20 20 47 65 6e 65 72 61 6c 6c 79  pped.  Generally
2200: 20 73 70 65 61 6b 69 6e 67 2c 20 74 68 65 72 65   speaking, there
2210: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
2220: 20 20 61 72 65 20 74 77 6f 20 77 61 79 73 20 74    are two ways t
2230: 6f 20 62 75 69 6c 64 20 74 68 65 20 62 69 6e 61  o build the bina
2240: 72 69 65 73 20 77 68 65 6e 20 70 72 65 70 61 72  ries when prepar
2250: 69 6e 67 20 74 6f 20 72 75 6e 20 74 68 65 0d 0a  ing to run the..
2260: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
2270: 74 65 73 74 20 73 75 69 74 65 3a 0d 0a 20 20 20  test suite:..   
2280: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
2290: 23 20 20 20 20 20 20 20 31 2e 20 42 75 69 6c 64  #       1. Build
22a0: 20 74 68 65 20 73 65 70 61 72 61 74 65 20 6d 61   the separate ma
22b0: 6e 61 67 65 64 20 61 6e 64 20 6e 61 74 69 76 65  naged and native
22c0: 20 61 73 73 65 6d 62 6c 69 65 73 20 75 73 69 6e   assemblies usin
22d0: 67 20 73 6f 6d 65 0d 0a 20 20 20 20 20 20 20 20  g some..        
22e0: 23 20 20 20 20 20 20 20 20 20 20 63 6f 6d 6d 61  #          comma
22f0: 6e 64 73 20 73 69 6d 69 6c 61 72 20 74 6f 3a 0d  nds similar to:.
2300: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
2310: 20 20 20 20 23 20 20 20 20 20 20 20 20 20 20 62      #          b
2320: 75 69 6c 64 2e 62 61 74 20 24 7b 43 6f 6e 66 69  uild.bat ${Confi
2330: 67 75 72 61 74 69 6f 6e 7d 4d 61 6e 61 67 65 64  guration}Managed
2340: 4f 6e 6c 79 20 24 7b 50 6c 61 74 66 6f 72 6d 7d  Only ${Platform}
2350: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
2360: 20 20 20 20 20 62 75 69 6c 64 2e 62 61 74 20 24       build.bat $
2370: 7b 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 7d 4e  {Configuration}N
2380: 61 74 69 76 65 4f 6e 6c 79 20 24 7b 50 6c 61 74  ativeOnly ${Plat
2390: 66 6f 72 6d 7d 0d 0a 20 20 20 20 20 20 20 20 23  form}..        #
23a0: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
23b0: 20 20 20 20 20 57 68 65 72 65 20 24 7b 43 6f 6e       Where ${Con
23c0: 66 69 67 75 72 61 74 69 6f 6e 7d 20 69 73 20 65  figuration} is e
23d0: 69 74 68 65 72 20 22 44 65 62 75 67 22 20 6f 72  ither "Debug" or
23e0: 20 22 52 65 6c 65 61 73 65 22 20 61 6e 64 0d 0a   "Release" and..
23f0: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
2400: 20 20 20 24 7b 50 6c 61 74 66 6f 72 6d 7d 20 69     ${Platform} i
2410: 73 20 65 69 74 68 65 72 20 22 57 69 6e 33 32 22  s either "Win32"
2420: 20 6f 72 20 22 78 36 34 22 2e 0d 0a 20 20 20 20   or "x64"...    
2430: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
2440: 20 20 20 20 20 20 20 32 2e 20 42 75 69 6c 64 20         2. Build 
2450: 74 68 65 20 6d 69 78 65 64 2d 6d 6f 64 65 20 61  the mixed-mode a
2460: 73 73 65 6d 62 6c 79 20 75 73 69 6e 67 20 61 20  ssembly using a 
2470: 63 6f 6d 6d 61 6e 64 20 73 69 6d 69 6c 61 72 20  command similar 
2480: 74 6f 3a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  to:..        #..
2490: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
24a0: 20 20 20 62 75 69 6c 64 2e 62 61 74 20 24 7b 43     build.bat ${C
24b0: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 7d 20 24 7b  onfiguration} ${
24c0: 50 6c 61 74 66 6f 72 6d 7d 0d 0a 20 20 20 20 20  Platform}..     
24d0: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
24e0: 20 20 20 20 20 20 20 20 20 57 68 65 72 65 20 24           Where $
24f0: 7b 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 7d 20  {Configuration} 
2500: 69 73 20 65 69 74 68 65 72 20 22 44 65 62 75 67  is either "Debug
2510: 22 20 6f 72 20 22 52 65 6c 65 61 73 65 22 20 61  " or "Release" a
2520: 6e 64 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  nd..        #   
2530: 20 20 20 20 20 20 20 24 7b 50 6c 61 74 66 6f 72         ${Platfor
2540: 6d 7d 20 69 73 20 65 69 74 68 65 72 20 22 57 69  m} is either "Wi
2550: 6e 33 32 22 20 6f 72 20 22 78 36 34 22 2e 20 20  n32" or "x64".  
2560: 49 66 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20  If this command 
2570: 69 73 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  is..        #   
2580: 20 20 20 20 20 20 20 75 73 65 64 2c 20 76 61 72         used, var
2590: 69 6f 75 73 20 74 65 73 74 73 20 74 68 61 74 20  ious tests that 
25a0: 72 65 71 75 69 72 65 20 73 75 70 70 6c 65 6d 65  require suppleme
25b0: 6e 74 61 72 79 20 6d 61 6e 61 67 65 64 0d 0a 20  ntary managed.. 
25c0: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 20         #        
25d0: 20 20 61 73 73 65 6d 62 6c 69 65 73 20 28 65 2e    assemblies (e.
25e0: 67 2e 20 4c 49 4e 51 29 20 6d 61 79 20 62 65 20  g. LINQ) may be 
25f0: 73 6b 69 70 70 65 64 20 75 6e 6c 65 73 73 20 74  skipped unless t
2600: 68 6f 73 65 20 62 69 6e 61 72 69 65 73 0d 0a 20  hose binaries.. 
2610: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 20         #        
2620: 20 20 61 72 65 20 73 75 62 73 65 71 75 65 6e 74    are subsequent
2630: 6c 79 20 63 6f 70 69 65 64 20 69 6e 74 6f 20 74  ly copied into t
2640: 68 65 20 63 6f 72 72 65 63 74 20 64 69 72 65 63  he correct direc
2650: 74 6f 72 79 20 28 69 2e 65 2e 20 62 79 0d 0a 20  tory (i.e. by.. 
2660: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 20         #        
2670: 20 20 22 74 65 73 74 5f 61 6c 6c 2e 62 61 74 22    "test_all.bat"
2680: 29 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  )...        #.. 
2690: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 4e         #       N
26a0: 6f 74 65 20 74 68 61 74 20 61 6c 6c 20 6f 66 20  ote that all of 
26b0: 74 68 65 20 62 75 69 6c 64 20 63 6f 6d 6d 61 6e  the build comman
26c0: 64 73 20 61 62 6f 76 65 20 77 69 6c 6c 20 64 65  ds above will de
26d0: 66 61 75 6c 74 20 74 6f 20 75 73 69 6e 67 0d 0a  fault to using..
26e0: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
26f0: 74 68 65 20 6c 61 74 65 73 74 20 76 65 72 73 69  the latest versi
2700: 6f 6e 20 6f 66 20 4d 53 42 75 69 6c 64 20 61 76  on of MSBuild av
2710: 61 69 6c 61 62 6c 65 20 61 6e 64 20 74 68 65 20  ailable and the 
2720: 22 74 65 73 74 5f 79 65 61 72 22 20 6d 61 79 0d  "test_year" may.
2730: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
2740: 20 6e 65 65 64 20 74 6f 20 62 65 20 61 64 6a 75   need to be adju
2750: 73 74 65 64 20 61 63 63 6f 72 64 69 6e 67 6c 79  sted accordingly
2760: 20 74 6f 20 61 63 74 75 61 6c 6c 79 20 72 75 6e   to actually run
2770: 20 74 68 65 20 74 65 73 74 20 73 75 69 74 65 2e   the test suite.
2780: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
2790: 20 20 52 65 66 65 72 20 74 6f 20 74 68 65 20 63    Refer to the c
27a0: 6f 6d 6d 65 6e 74 73 20 69 6e 20 5b 67 65 74 42  omments in [getB
27b0: 75 69 6c 64 59 65 61 72 5d 20 66 6f 72 20 6d 6f  uildYear] for mo
27c0: 72 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f  re information o
27d0: 6e 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  n..        #    
27e0: 20 20 20 68 6f 77 20 74 6f 20 73 65 74 20 74 68     how to set th
27f0: 69 73 20 76 61 72 69 61 62 6c 65 2e 0d 0a 20 20  is variable...  
2800: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
2810: 20 69 66 20 7b 5b 68 61 73 52 75 6e 74 69 6d 65   if {[hasRuntime
2820: 4f 70 74 69 6f 6e 20 6e 61 74 69 76 65 5d 7d 20  Option native]} 
2830: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
2840: 20 20 72 65 74 75 72 6e 20 5b 66 69 6c 65 20 6a    return [file j
2850: 6f 69 6e 20 24 70 61 74 68 20 62 69 6e 20 5b 67  oin $path bin [g
2860: 65 74 42 75 69 6c 64 59 65 61 72 5d 20 5b 6d 61  etBuildYear] [ma
2870: 63 68 69 6e 65 54 6f 50 6c 61 74 66 6f 72 6d 20  chineToPlatform 
2880: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
2890: 20 24 3a 3a 74 63 6c 5f 70 6c 61 74 66 6f 72 6d   $::tcl_platform
28a0: 28 6d 61 63 68 69 6e 65 29 5d 20 5b 67 65 74 42  (machine)] [getB
28b0: 75 69 6c 64 43 6f 6e 66 69 67 75 72 61 74 69 6f  uildConfiguratio
28c0: 6e 5d 5d 0d 0a 20 20 20 20 20 20 20 20 7d 20 65  n]]..        } e
28d0: 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  lse {..         
28e0: 20 72 65 74 75 72 6e 20 5b 66 69 6c 65 20 6a 6f   return [file jo
28f0: 69 6e 20 24 70 61 74 68 20 62 69 6e 20 5b 67 65  in $path bin [ge
2900: 74 42 75 69 6c 64 59 65 61 72 5d 20 5b 67 65 74  tBuildYear] [get
2910: 42 75 69 6c 64 43 6f 6e 66 69 67 75 72 61 74 69  BuildConfigurati
2920: 6f 6e 5d 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  on] \..         
2930: 20 20 20 20 20 62 69 6e 5d 0d 0a 20 20 20 20 20       bin]..     
2940: 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20     }..      }.. 
2950: 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
2960: 63 20 67 65 74 42 75 69 6c 64 46 69 6c 65 4e 61  c getBuildFileNa
2970: 6d 65 20 7b 20 66 69 6c 65 4e 61 6d 65 20 7d 20  me { fileName } 
2980: 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  {..      #..    
2990: 20 20 23 20 4e 4f 54 45 3a 20 52 65 74 75 72 6e    # NOTE: Return
29a0: 73 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  s the specified 
29b0: 66 69 6c 65 20 6e 61 6d 65 20 61 73 20 69 66 20  file name as if 
29c0: 69 74 20 77 65 72 65 20 6c 6f 63 61 74 65 64 20  it were located 
29d0: 69 6e 20 74 68 65 0d 0a 20 20 20 20 20 20 23 20  in the..      # 
29e0: 20 20 20 20 20 20 62 75 69 6c 64 20 64 69 72 65        build dire
29f0: 63 74 6f 72 79 2c 20 64 69 73 63 61 72 64 69 6e  ctory, discardin
2a00: 67 20 61 6e 79 20 64 69 72 65 63 74 6f 72 79 20  g any directory 
2a10: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 70 72 65 73  information pres
2a20: 65 6e 74 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ent..      #    
2a30: 20 20 20 69 6e 20 74 68 65 20 66 69 6c 65 20 6e     in the file n
2a40: 61 6d 65 20 61 73 20 70 72 6f 76 69 64 65 64 20  ame as provided 
2a50: 62 79 20 6f 75 72 20 63 61 6c 6c 65 72 2e 0d 0a  by our caller...
2a60: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 72        #..      r
2a70: 65 74 75 72 6e 20 5b 66 69 6c 65 20 6e 61 74 69  eturn [file nati
2a80: 76 65 6e 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20  vename \..      
2a90: 20 20 20 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5b      [file join [
2aa0: 67 65 74 42 75 69 6c 64 44 69 72 65 63 74 6f 72  getBuildDirector
2ab0: 79 5d 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 66  y] [file tail $f
2ac0: 69 6c 65 4e 61 6d 65 5d 5d 5d 0d 0a 20 20 20 20  ileName]]]..    
2ad0: 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67  }.....    proc g
2ae0: 65 74 42 69 6e 61 72 79 44 69 72 65 63 74 6f 72  etBinaryDirector
2af0: 79 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d  y {} {..      #.
2b00: 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54  .      # NOTE: T
2b10: 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 72 65  his procedure re
2b20: 74 75 72 6e 73 20 74 68 65 20 64 69 72 65 63 74  turns the direct
2b30: 6f 72 79 20 77 68 65 72 65 20 74 68 65 20 74 65  ory where the te
2b40: 73 74 20 61 70 70 6c 69 63 61 74 69 6f 6e 0d 0a  st application..
2b50: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 69 74        #       it
2b60: 73 65 6c 66 20 28 69 2e 65 2e 20 74 68 65 20 45  self (i.e. the E
2b70: 61 67 6c 65 20 73 68 65 6c 6c 29 20 69 73 20 6c  agle shell) is l
2b80: 6f 63 61 74 65 64 2e 20 20 54 68 69 73 20 77 69  ocated.  This wi
2b90: 6c 6c 20 62 65 20 75 73 65 64 20 61 73 0d 0a 20  ll be used as.. 
2ba0: 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68 65       #       the
2bb0: 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 66 6f 72   destination for
2bc0: 20 74 68 65 20 63 6f 70 69 65 64 20 53 79 73 74   the copied Syst
2bd0: 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 20 6e  em.Data.SQLite n
2be0: 61 74 69 76 65 20 61 6e 64 0d 0a 20 20 20 20 20  ative and..     
2bf0: 20 23 20 20 20 20 20 20 20 6d 61 6e 61 67 65 64   #       managed
2c00: 20 61 73 73 65 6d 62 6c 69 65 73 20 28 69 2e 65   assemblies (i.e
2c10: 2e 20 62 65 63 61 75 73 65 20 74 68 69 73 20 69  . because this i
2c20: 73 20 6f 6e 65 20 6f 66 20 74 68 65 20 66 65 77  s one of the few
2c30: 20 70 6c 61 63 65 73 0d 0a 20 20 20 20 20 20 23   places..      #
2c40: 20 20 20 20 20 20 20 77 68 65 72 65 20 74 68 65         where the
2c50: 20 43 4c 52 20 77 69 6c 6c 20 61 63 74 75 61 6c   CLR will actual
2c60: 6c 79 20 66 69 6e 64 20 61 6e 64 20 6c 6f 61 64  ly find and load
2c70: 20 74 68 65 6d 20 70 72 6f 70 65 72 6c 79 29 2e   them properly).
2c80: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
2c90: 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74   if {[info exist
2ca0: 73 20 3a 3a 62 69 6e 61 72 79 5f 64 69 72 65 63  s ::binary_direc
2cb0: 74 6f 72 79 5d 20 26 26 20 5c 0d 0a 20 20 20 20  tory] && \..    
2cc0: 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65        [string le
2cd0: 6e 67 74 68 20 24 3a 3a 62 69 6e 61 72 79 5f 64  ngth $::binary_d
2ce0: 69 72 65 63 74 6f 72 79 5d 20 3e 20 30 7d 20 74  irectory] > 0} t
2cf0: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  hen {..        #
2d00: 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
2d10: 3a 20 54 68 65 20 6c 6f 63 61 74 69 6f 6e 20 6f  : The location o
2d20: 66 20 74 68 65 20 62 69 6e 61 72 79 20 64 69 72  f the binary dir
2d30: 65 63 74 6f 72 79 20 68 61 73 20 62 65 65 6e 20  ectory has been 
2d40: 6f 76 65 72 72 69 64 64 65 6e 3b 0d 0a 20 20 20  overridden;..   
2d50: 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68 65       #       the
2d60: 72 65 66 6f 72 65 2c 20 75 73 65 20 69 74 20 76  refore, use it v
2d70: 65 72 62 61 74 69 6d 2e 0d 0a 20 20 20 20 20 20  erbatim...      
2d80: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74    #..        ret
2d90: 75 72 6e 20 24 3a 3a 62 69 6e 61 72 79 5f 64 69  urn $::binary_di
2da0: 72 65 63 74 6f 72 79 0d 0a 20 20 20 20 20 20 7d  rectory..      }
2db0: 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
2dc0: 20 72 65 74 75 72 6e 20 5b 69 6e 66 6f 20 62 69   return [info bi
2dd0: 6e 61 72 79 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a  nary]..      }..
2de0: 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
2df0: 6f 63 20 67 65 74 42 69 6e 61 72 79 46 69 6c 65  oc getBinaryFile
2e00: 4e 61 6d 65 20 7b 20 66 69 6c 65 4e 61 6d 65 20  Name { fileName 
2e10: 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  } {..      #..  
2e20: 20 20 20 20 23 20 4e 4f 54 45 3a 20 52 65 74 75      # NOTE: Retu
2e30: 72 6e 73 20 74 68 65 20 73 70 65 63 69 66 69 65  rns the specifie
2e40: 64 20 66 69 6c 65 20 6e 61 6d 65 20 61 73 20 69  d file name as i
2e50: 66 20 69 74 20 77 65 72 65 20 6c 6f 63 61 74 65  f it were locate
2e60: 64 20 69 6e 20 74 68 65 0d 0a 20 20 20 20 20 20  d in the..      
2e70: 23 20 20 20 20 20 20 20 62 69 6e 61 72 79 20 64  #       binary d
2e80: 69 72 65 63 74 6f 72 79 2c 20 64 69 73 63 61 72  irectory, discar
2e90: 64 69 6e 67 20 61 6e 79 20 64 69 72 65 63 74 6f  ding any directo
2ea0: 72 79 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 70  ry information p
2eb0: 72 65 73 65 6e 74 0d 0a 20 20 20 20 20 20 23 20  resent..      # 
2ec0: 20 20 20 20 20 20 69 6e 20 74 68 65 20 66 69 6c        in the fil
2ed0: 65 20 6e 61 6d 65 20 61 73 20 70 72 6f 76 69 64  e name as provid
2ee0: 65 64 20 62 79 20 6f 75 72 20 63 61 6c 6c 65 72  ed by our caller
2ef0: 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
2f00: 20 20 72 65 74 75 72 6e 20 5b 66 69 6c 65 20 6e    return [file n
2f10: 61 74 69 76 65 6e 61 6d 65 20 5c 0d 0a 20 20 20  ativename \..   
2f20: 20 20 20 20 20 20 20 5b 66 69 6c 65 20 6a 6f 69         [file joi
2f30: 6e 20 5b 67 65 74 42 69 6e 61 72 79 44 69 72 65  n [getBinaryDire
2f40: 63 74 6f 72 79 5d 20 5b 66 69 6c 65 20 74 61 69  ctory] [file tai
2f50: 6c 20 24 66 69 6c 65 4e 61 6d 65 5d 5d 5d 0d 0a  l $fileName]]]..
2f60: 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
2f70: 6f 63 20 67 65 74 43 6f 72 65 42 69 6e 61 72 79  oc getCoreBinary
2f80: 46 69 6c 65 4e 61 6d 65 20 7b 20 7b 73 74 61 6e  FileName { {stan
2f90: 64 61 72 64 20 66 61 6c 73 65 7d 20 7d 20 7b 0d  dard false} } {.
2fa0: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
2fb0: 23 20 4e 4f 54 45 3a 20 52 65 74 75 72 6e 73 20  # NOTE: Returns 
2fc0: 74 68 65 20 66 75 6c 6c 20 70 61 74 68 20 66 6f  the full path fo
2fd0: 72 20 74 68 65 20 66 69 6c 65 20 63 6f 6e 74 61  r the file conta
2fe0: 69 6e 69 6e 67 20 74 68 65 20 63 6f 72 65 20 53  ining the core S
2ff0: 51 4c 69 74 65 0d 0a 20 20 20 20 20 20 23 20 20  QLite..      #  
3000: 20 20 20 20 20 6c 69 62 72 61 72 79 20 63 6f 64       library cod
3010: 65 20 66 6f 72 20 74 68 69 73 20 70 6c 61 74 66  e for this platf
3020: 6f 72 6d 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  orm...      #.. 
3030: 20 20 20 20 20 69 66 20 7b 5b 68 61 73 52 75 6e       if {[hasRun
3040: 74 69 6d 65 4f 70 74 69 6f 6e 20 6e 61 74 69 76  timeOption nativ
3050: 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  e]} then {..    
3060: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
3070: 20 4e 4f 54 45 3a 20 52 65 74 75 72 6e 20 74 68   NOTE: Return th
3080: 65 20 6d 69 78 65 64 2d 6d 6f 64 65 20 61 73 73  e mixed-mode ass
3090: 65 6d 62 6c 79 20 66 69 6c 65 20 6e 61 6d 65 2e  embly file name.
30a0: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
30b0: 20 20 20 20 20 72 65 74 75 72 6e 20 5b 66 69 6c       return [fil
30c0: 65 20 6e 61 74 69 76 65 6e 61 6d 65 20 5c 0d 0a  e nativename \..
30d0: 20 20 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c              [fil
30e0: 65 20 6a 6f 69 6e 20 5b 67 65 74 42 69 6e 61 72  e join [getBinar
30f0: 79 44 69 72 65 63 74 6f 72 79 5d 20 53 79 73 74  yDirectory] Syst
3100: 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 64  em.Data.SQLite.d
3110: 6c 6c 5d 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c  ll]]..      } el
3120: 73 65 69 66 20 7b 24 73 74 61 6e 64 61 72 64 7d  seif {$standard}
3130: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
3140: 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
3150: 54 45 3a 20 52 65 74 75 72 6e 20 74 68 65 20 6e  TE: Return the n
3160: 61 74 69 76 65 2d 6f 6e 6c 79 20 73 74 61 6e 64  ative-only stand
3170: 61 72 64 20 53 51 4c 69 74 65 20 6c 69 62 72 61  ard SQLite libra
3180: 72 79 20 66 69 6c 65 20 6e 61 6d 65 2e 0d 0a 20  ry file name... 
3190: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
31a0: 20 20 72 65 74 75 72 6e 20 5b 66 69 6c 65 20 6e    return [file n
31b0: 61 74 69 76 65 6e 61 6d 65 20 5c 0d 0a 20 20 20  ativename \..   
31c0: 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20 6a           [file j
31d0: 6f 69 6e 20 5b 67 65 74 42 69 6e 61 72 79 44 69  oin [getBinaryDi
31e0: 72 65 63 74 6f 72 79 5d 20 73 71 6c 69 74 65 33  rectory] sqlite3
31f0: 2e 64 6c 6c 5d 5d 0d 0a 20 20 20 20 20 20 7d 20  .dll]]..      } 
3200: 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
3210: 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
3220: 45 3a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 61  E: Return the na
3230: 74 69 76 65 2d 6f 6e 6c 79 20 69 6e 74 65 72 6f  tive-only intero
3240: 70 20 61 73 73 65 6d 62 6c 79 20 66 69 6c 65 20  p assembly file 
3250: 6e 61 6d 65 2e 0d 0a 20 20 20 20 20 20 20 20 23  name...        #
3260: 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ..        return
3270: 20 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d   [file nativenam
3280: 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e \..           
3290: 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5b 67 65 74   [file join [get
32a0: 42 69 6e 61 72 79 44 69 72 65 63 74 6f 72 79 5d  BinaryDirectory]
32b0: 20 53 51 4c 69 74 65 2e 49 6e 74 65 72 6f 70 2e   SQLite.Interop.
32c0: 64 6c 6c 5d 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a  dll]]..      }..
32d0: 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
32e0: 6f 63 20 67 65 74 43 6f 6d 6d 6f 6e 44 69 72 65  oc getCommonDire
32f0: 63 74 6f 72 79 20 7b 7d 20 7b 0d 0a 20 20 20 20  ctory {} {..    
3300: 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
3310: 45 3a 20 54 68 69 73 20 70 72 6f 63 65 64 75 72  E: This procedur
3320: 65 20 72 65 74 75 72 6e 73 20 74 68 65 20 64 69  e returns the di
3330: 72 65 63 74 6f 72 79 20 77 68 65 72 65 20 74 68  rectory where th
3340: 65 20 74 65 73 74 20 73 63 72 69 70 74 73 0d 0a  e test scripts..
3350: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 73 68        #       sh
3360: 6f 75 6c 64 20 62 65 20 6c 6f 63 61 74 65 64 2e  ould be located.
3370: 20 20 42 79 20 64 65 66 61 75 6c 74 2c 20 74 68    By default, th
3380: 69 73 20 6a 75 73 74 20 72 65 74 75 72 6e 73 20  is just returns 
3390: 74 68 65 20 45 61 67 6c 65 0d 0a 20 20 20 20 20  the Eagle..     
33a0: 20 23 20 20 20 20 20 20 20 62 69 6e 61 72 79 20   #       binary 
33b0: 64 69 72 65 63 74 6f 72 79 2e 0d 0a 20 20 20 20  directory...    
33c0: 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b    #..      if {[
33d0: 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 63 6f  info exists ::co
33e0: 6d 6d 6f 6e 5f 64 69 72 65 63 74 6f 72 79 5d 20  mmon_directory] 
33f0: 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  && \..          
3400: 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
3410: 3a 3a 63 6f 6d 6d 6f 6e 5f 64 69 72 65 63 74 6f  ::common_directo
3420: 72 79 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d  ry] > 0} then {.
3430: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
3440: 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 65 20      # NOTE: The 
3450: 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  location of the 
3460: 63 6f 6d 6d 6f 6e 20 64 69 72 65 63 74 6f 72 79  common directory
3470: 20 68 61 73 20 62 65 65 6e 20 73 65 74 3b 0d 0a   has been set;..
3480: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
3490: 74 68 65 72 65 66 6f 72 65 2c 20 75 73 65 20 69  therefore, use i
34a0: 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  t...        #.. 
34b0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 3a         return $:
34c0: 3a 63 6f 6d 6d 6f 6e 5f 64 69 72 65 63 74 6f 72  :common_director
34d0: 79 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 69  y..      } elsei
34e0: 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20  f {[info exists 
34f0: 3a 3a 76 65 6e 64 6f 72 5f 64 69 72 65 63 74 6f  ::vendor_directo
3500: 72 79 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20  ry] && \..      
3510: 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67      [string leng
3520: 74 68 20 24 3a 3a 76 65 6e 64 6f 72 5f 64 69 72  th $::vendor_dir
3530: 65 63 74 6f 72 79 5d 20 3e 20 30 7d 20 74 68 65  ectory] > 0} the
3540: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  n {..        #..
3550: 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
3560: 54 68 65 20 6c 6f 63 61 74 69 6f 6e 20 6f 66 20  The location of 
3570: 74 68 65 20 76 65 6e 64 6f 72 20 64 69 72 65 63  the vendor direc
3580: 74 6f 72 79 20 68 61 73 20 62 65 65 6e 20 73 65  tory has been se
3590: 74 3b 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  t;..        #   
35a0: 20 20 20 20 74 68 65 72 65 66 6f 72 65 2c 20 75      therefore, u
35b0: 73 65 20 69 74 2e 0d 0a 20 20 20 20 20 20 20 20  se it...        
35c0: 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  #..        retur
35d0: 6e 20 24 3a 3a 76 65 6e 64 6f 72 5f 64 69 72 65  n $::vendor_dire
35e0: 63 74 6f 72 79 0d 0a 20 20 20 20 20 20 7d 20 65  ctory..      } e
35f0: 6c 73 65 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69  lseif {[info exi
3600: 73 74 73 20 3a 3a 74 63 6c 5f 6c 69 62 72 61 72  sts ::tcl_librar
3610: 79 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20  y] && \..       
3620: 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74     [string lengt
3630: 68 20 24 3a 3a 74 63 6c 5f 6c 69 62 72 61 72 79  h $::tcl_library
3640: 5d 20 3e 20 30 20 26 26 20 5c 0d 0a 20 20 20 20  ] > 0 && \..    
3650: 20 20 20 20 20 20 5b 66 69 6c 65 20 69 73 64 69        [file isdi
3660: 72 65 63 74 6f 72 79 20 24 3a 3a 74 63 6c 5f 6c  rectory $::tcl_l
3670: 69 62 72 61 72 79 5d 7d 20 74 68 65 6e 20 7b 0d  ibrary]} then {.
3680: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
3690: 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 65 20      # NOTE: The 
36a0: 76 61 72 69 61 62 6c 65 20 77 69 74 68 20 74 68  variable with th
36b0: 65 20 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 74 68  e location of th
36c0: 65 20 73 63 72 69 70 74 20 6c 69 62 72 61 72 79  e script library
36d0: 20 69 73 0d 0a 20 20 20 20 20 20 20 20 23 20 20   is..        #  
36e0: 20 20 20 20 20 73 65 74 20 61 6e 64 20 61 70 70       set and app
36f0: 65 61 72 73 20 74 6f 20 62 65 20 61 20 72 65 61  ears to be a rea
3700: 6c 20 64 69 72 65 63 74 6f 72 79 20 28 69 2e 65  l directory (i.e
3710: 2e 20 6e 6f 74 20 65 6d 62 65 64 64 65 64 0d 0a  . not embedded..
3720: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
3730: 77 69 74 68 69 6e 20 61 20 66 69 6c 65 29 3b 20  within a file); 
3740: 74 68 65 72 65 66 6f 72 65 2c 20 75 73 65 20 69  therefore, use i
3750: 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  t...        #.. 
3760: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 3a         return $:
3770: 3a 74 63 6c 5f 6c 69 62 72 61 72 79 0d 0a 20 20  :tcl_library..  
3780: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
3790: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
37a0: 20 23 20 4e 4f 54 45 3a 20 46 61 6c 6c 62 61 63   # NOTE: Fallbac
37b0: 6b 20 74 6f 20 74 68 65 20 64 69 72 65 63 74 6f  k to the directo
37c0: 72 79 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  ry containing th
37d0: 65 20 65 78 65 63 75 74 61 62 6c 65 2e 0d 0a 20  e executable... 
37e0: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
37f0: 20 20 72 65 74 75 72 6e 20 5b 69 6e 66 6f 20 62    return [info b
3800: 69 6e 61 72 79 5d 0d 0a 20 20 20 20 20 20 7d 0d  inary]..      }.
3810: 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70  .    }.....    p
3820: 72 6f 63 20 67 65 74 44 61 74 61 62 61 73 65 44  roc getDatabaseD
3830: 69 72 65 63 74 6f 72 79 20 7b 7d 20 7b 0d 0a 20  irectory {} {.. 
3840: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
3850: 4e 4f 54 45 3a 20 54 68 69 73 20 70 72 6f 63 65  NOTE: This proce
3860: 64 75 72 65 20 72 65 74 75 72 6e 73 20 74 68 65  dure returns the
3870: 20 64 69 72 65 63 74 6f 72 79 20 77 68 65 72 65   directory where
3880: 20 74 68 65 20 74 65 73 74 20 64 61 74 61 62 61   the test databa
3890: 73 65 73 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ses..      #    
38a0: 20 20 20 73 68 6f 75 6c 64 20 62 65 20 6c 6f 63     should be loc
38b0: 61 74 65 64 2e 20 20 42 79 20 64 65 66 61 75 6c  ated.  By defaul
38c0: 74 2c 20 74 68 69 73 20 6a 75 73 74 20 75 73 65  t, this just use
38d0: 73 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 0d  s the temporary.
38e0: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 64  .      #       d
38f0: 69 72 65 63 74 6f 72 79 20 63 6f 6e 66 69 67 75  irectory configu
3900: 72 65 64 20 66 6f 72 20 74 68 69 73 20 73 79 73  red for this sys
3910: 74 65 6d 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  tem...      #.. 
3920: 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65       if {[info e
3930: 78 69 73 74 73 20 3a 3a 64 61 74 61 62 61 73 65  xists ::database
3940: 5f 64 69 72 65 63 74 6f 72 79 5d 20 26 26 20 5c  _directory] && \
3950: 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 73 74 72  ..          [str
3960: 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a 64 61  ing length $::da
3970: 74 61 62 61 73 65 5f 64 69 72 65 63 74 6f 72 79  tabase_directory
3980: 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20  ] > 0} then {.. 
3990: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
39a0: 20 20 23 20 4e 4f 54 45 3a 20 54 68 65 20 6c 6f    # NOTE: The lo
39b0: 63 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 64 61  cation of the da
39c0: 74 61 62 61 73 65 20 64 69 72 65 63 74 6f 72 79  tabase directory
39d0: 20 68 61 73 20 62 65 65 6e 20 6f 76 65 72 72 69   has been overri
39e0: 64 64 65 6e 3b 0d 0a 20 20 20 20 20 20 20 20 23  dden;..        #
39f0: 20 20 20 20 20 20 20 74 68 65 72 65 66 6f 72 65         therefore
3a00: 2c 20 75 73 65 20 69 74 2e 0d 0a 20 20 20 20 20  , use it...     
3a10: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65     #..        re
3a20: 74 75 72 6e 20 24 3a 3a 64 61 74 61 62 61 73 65  turn $::database
3a30: 5f 64 69 72 65 63 74 6f 72 79 0d 0a 20 20 20 20  _directory..    
3a40: 20 20 7d 20 65 6c 73 65 69 66 20 7b 5b 69 6e 66    } elseif {[inf
3a50: 6f 20 65 78 69 73 74 73 20 3a 3a 73 63 72 61 74  o exists ::scrat
3a60: 63 68 5f 64 69 72 65 63 74 6f 72 79 5d 20 26 26  ch_directory] &&
3a70: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 73   \..          [s
3a80: 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a  tring length $::
3a90: 73 63 72 61 74 63 68 5f 64 69 72 65 63 74 6f 72  scratch_director
3aa0: 79 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  y] > 0} then {..
3ab0: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
3ac0: 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 65 20 6c     # NOTE: The l
3ad0: 6f 63 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 73  ocation of the s
3ae0: 63 72 61 74 63 68 20 64 69 72 65 63 74 6f 72 79  cratch directory
3af0: 20 68 61 73 20 62 65 65 6e 20 6f 76 65 72 72 69   has been overri
3b00: 64 64 65 6e 3b 0d 0a 20 20 20 20 20 20 20 20 23  dden;..        #
3b10: 20 20 20 20 20 20 20 74 68 65 72 65 66 6f 72 65         therefore
3b20: 2c 20 75 73 65 20 69 74 2e 0d 0a 20 20 20 20 20  , use it...     
3b30: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65     #..        re
3b40: 74 75 72 6e 20 24 3a 3a 73 63 72 61 74 63 68 5f  turn $::scratch_
3b50: 64 69 72 65 63 74 6f 72 79 0d 0a 20 20 20 20 20  directory..     
3b60: 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
3b70: 20 20 20 72 65 74 75 72 6e 20 5b 67 65 74 54 65     return [getTe
3b80: 6d 70 6f 72 61 72 79 50 61 74 68 5d 0d 0a 20 20  mporaryPath]..  
3b90: 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d      }..    }....
3ba0: 0a 20 20 20 20 70 72 6f 63 20 67 65 74 54 65 6d  .    proc getTem
3bb0: 70 6f 72 61 72 79 44 69 72 65 63 74 6f 72 79 20  poraryDirectory 
3bc0: 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20  {} {..      #.. 
3bd0: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 69       # NOTE: Thi
3be0: 73 20 70 72 6f 63 65 64 75 72 65 20 72 65 74 75  s procedure retu
3bf0: 72 6e 73 20 74 68 65 20 64 69 72 65 63 74 6f 72  rns the director
3c00: 79 20 77 68 65 72 65 20 74 68 65 20 74 65 6d 70  y where the temp
3c10: 6f 72 61 72 79 20 66 69 6c 65 73 0d 0a 20 20 20  orary files..   
3c20: 20 20 20 23 20 20 20 20 20 20 20 73 68 6f 75 6c     #       shoul
3c30: 64 20 62 65 20 6c 6f 63 61 74 65 64 2e 20 20 42  d be located.  B
3c40: 79 20 64 65 66 61 75 6c 74 2c 20 74 68 69 73 20  y default, this 
3c50: 6a 75 73 74 20 75 73 65 73 20 74 68 65 20 74 65  just uses the te
3c60: 6d 70 6f 72 61 72 79 0d 0a 20 20 20 20 20 20 23  mporary..      #
3c70: 20 20 20 20 20 20 20 64 69 72 65 63 74 6f 72 79         directory
3c80: 20 63 6f 6e 66 69 67 75 72 65 64 20 66 6f 72 20   configured for 
3c90: 74 68 69 73 20 73 79 73 74 65 6d 2e 0d 0a 20 20  this system...  
3ca0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20      #..      if 
3cb0: 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  {[info exists ::
3cc0: 74 65 6d 70 6f 72 61 72 79 5f 64 69 72 65 63 74  temporary_direct
3cd0: 6f 72 79 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20  ory] && \..     
3ce0: 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e       [string len
3cf0: 67 74 68 20 24 3a 3a 74 65 6d 70 6f 72 61 72 79  gth $::temporary
3d00: 5f 64 69 72 65 63 74 6f 72 79 5d 20 3e 20 30 7d  _directory] > 0}
3d10: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
3d20: 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
3d30: 54 45 3a 20 54 68 65 20 6c 6f 63 61 74 69 6f 6e  TE: The location
3d40: 20 6f 66 20 74 68 65 20 74 65 6d 70 6f 72 61 72   of the temporar
3d50: 79 20 64 69 72 65 63 74 6f 72 79 20 68 61 73 20  y directory has 
3d60: 62 65 65 6e 20 6f 76 65 72 72 69 64 64 65 6e 3b  been overridden;
3d70: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
3d80: 20 20 74 68 65 72 65 66 6f 72 65 2c 20 75 73 65    therefore, use
3d90: 20 69 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d   it...        #.
3da0: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
3db0: 24 3a 3a 74 65 6d 70 6f 72 61 72 79 5f 64 69 72  $::temporary_dir
3dc0: 65 63 74 6f 72 79 0d 0a 20 20 20 20 20 20 7d 20  ectory..      } 
3dd0: 65 6c 73 65 69 66 20 7b 5b 69 6e 66 6f 20 65 78  elseif {[info ex
3de0: 69 73 74 73 20 3a 3a 73 63 72 61 74 63 68 5f 64  ists ::scratch_d
3df0: 69 72 65 63 74 6f 72 79 5d 20 26 26 20 5c 0d 0a  irectory] && \..
3e00: 20 20 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e            [strin
3e10: 67 20 6c 65 6e 67 74 68 20 24 3a 3a 73 63 72 61  g length $::scra
3e20: 74 63 68 5f 64 69 72 65 63 74 6f 72 79 5d 20 3e  tch_directory] >
3e30: 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
3e40: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
3e50: 20 4e 4f 54 45 3a 20 54 68 65 20 6c 6f 63 61 74   NOTE: The locat
3e60: 69 6f 6e 20 6f 66 20 74 68 65 20 73 63 72 61 74  ion of the scrat
3e70: 63 68 20 64 69 72 65 63 74 6f 72 79 20 68 61 73  ch directory has
3e80: 20 62 65 65 6e 20 6f 76 65 72 72 69 64 64 65 6e   been overridden
3e90: 3b 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  ;..        #    
3ea0: 20 20 20 74 68 65 72 65 66 6f 72 65 2c 20 75 73     therefore, us
3eb0: 65 20 69 74 2e 0d 0a 20 20 20 20 20 20 20 20 23  e it...        #
3ec0: 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ..        return
3ed0: 20 24 3a 3a 73 63 72 61 74 63 68 5f 64 69 72 65   $::scratch_dire
3ee0: 63 74 6f 72 79 0d 0a 20 20 20 20 20 20 7d 20 65  ctory..      } e
3ef0: 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 72  lse {..        r
3f00: 65 74 75 72 6e 20 5b 67 65 74 54 65 6d 70 6f 72  eturn [getTempor
3f10: 61 72 79 50 61 74 68 5d 0d 0a 20 20 20 20 20 20  aryPath]..      
3f20: 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  }..    }.....   
3f30: 20 70 72 6f 63 20 67 65 74 54 65 73 74 4f 76 65   proc getTestOve
3f40: 72 72 69 64 65 73 50 72 65 61 6d 62 6c 65 20 7b  rridesPreamble {
3f50: 20 7b 65 78 74 72 61 56 61 72 4e 61 6d 65 73 20   {extraVarNames 
3f60: 22 22 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 73  ""} } {..      s
3f70: 65 74 20 76 61 72 4e 61 6d 65 73 20 5b 6c 69 73  et varNames [lis
3f80: 74 5d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20  t]....      #.. 
3f90: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 66 20       # NOTE: If 
3fa0: 61 76 61 69 6c 61 62 6c 65 2c 20 73 74 61 72 74  available, start
3fb0: 20 77 69 74 68 20 74 68 65 20 6d 61 73 74 65 72   with the master
3fc0: 20 6c 69 73 74 20 6f 66 20 74 65 73 74 20 6f 76   list of test ov
3fd0: 65 72 72 69 64 65 0d 0a 20 20 20 20 20 20 23 20  erride..      # 
3fe0: 20 20 20 20 20 20 76 61 72 69 61 62 6c 65 73 2e        variables.
3ff0: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
4000: 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74   if {[info exist
4010: 73 20 3a 3a 74 65 73 74 5f 6f 76 65 72 72 69 64  s ::test_overrid
4020: 65 73 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20  es] && \..      
4030: 20 20 20 20 5b 6c 6c 65 6e 67 74 68 20 24 3a 3a      [llength $::
4040: 74 65 73 74 5f 6f 76 65 72 72 69 64 65 73 5d 20  test_overrides] 
4050: 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  > 0} then {..   
4060: 20 20 20 20 20 65 76 61 6c 20 6c 61 70 70 65 6e       eval lappen
4070: 64 20 76 61 72 4e 61 6d 65 73 20 24 3a 3a 74 65  d varNames $::te
4080: 73 74 5f 6f 76 65 72 72 69 64 65 73 0d 0a 20 20  st_overrides..  
4090: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23      }....      #
40a0: 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
40b0: 49 66 20 72 65 71 75 65 73 74 65 64 20 62 79 20  If requested by 
40c0: 6f 75 72 20 63 61 6c 6c 65 72 2c 20 61 64 64 20  our caller, add 
40d0: 61 6e 79 20 61 64 64 69 74 69 6f 6e 61 6c 20 76  any additional v
40e0: 61 72 69 61 62 6c 65 0d 0a 20 20 20 20 20 20 23  ariable..      #
40f0: 20 20 20 20 20 20 20 6e 61 6d 65 73 20 74 6f 20         names to 
4100: 63 6f 70 79 20 6e 6f 77 2e 0d 0a 20 20 20 20 20  copy now...     
4110: 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 6c   #..      if {[l
4120: 6c 65 6e 67 74 68 20 24 65 78 74 72 61 56 61 72  length $extraVar
4130: 4e 61 6d 65 73 5d 20 3e 20 30 7d 20 74 68 65 6e  Names] > 0} then
4140: 20 7b 0d 0a 20 20 20 20 20 20 20 20 65 76 61 6c   {..        eval
4150: 20 6c 61 70 70 65 6e 64 20 76 61 72 4e 61 6d 65   lappend varName
4160: 73 20 24 65 78 74 72 61 56 61 72 4e 61 6d 65 73  s $extraVarNames
4170: 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
4180: 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
4190: 54 45 3a 20 42 75 69 6c 64 20 74 68 65 20 73 63  TE: Build the sc
41a0: 72 69 70 74 20 66 72 61 67 6d 65 6e 74 20 74 6f  ript fragment to
41b0: 20 62 65 20 72 65 74 75 72 6e 65 64 20 62 79 20   be returned by 
41c0: 70 72 6f 63 65 73 73 69 6e 67 20 65 61 63 68 0d  processing each.
41d0: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 76  .      #       v
41e0: 61 72 69 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64  ariable name and
41f0: 20 61 64 64 69 6e 67 20 74 68 65 20 6e 65 63 65   adding the nece
4200: 63 65 73 73 61 72 79 20 73 63 72 69 70 74 20 66  cessary script f
4210: 72 61 67 6d 65 6e 74 73 20 66 6f 72 0d 0a 20 20  ragments for..  
4220: 20 20 20 20 23 20 20 20 20 20 20 20 65 61 63 68      #       each
4230: 20 6f 6e 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a   one...      #..
4240: 20 20 20 20 20 20 73 65 74 20 72 65 73 75 6c 74        set result
4250: 20 22 22 0d 0a 0d 0a 20 20 20 20 20 20 66 6f 72   ""....      for
4260: 65 61 63 68 20 76 61 72 4e 61 6d 65 20 24 76 61  each varName $va
4270: 72 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20  rNames {..      
4280: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
4290: 4f 54 45 3a 20 42 75 69 6c 64 20 74 68 65 20 71  OTE: Build the q
42a0: 75 61 6c 69 66 69 65 64 20 67 6c 6f 62 61 6c 20  ualified global 
42b0: 76 61 72 69 61 62 6c 65 20 6e 61 6d 65 2e 0d 0a  variable name...
42c0: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
42d0: 20 20 20 73 65 74 20 66 75 6c 6c 56 61 72 4e 61     set fullVarNa
42e0: 6d 65 20 5b 61 70 70 65 6e 64 41 72 67 73 20 3a  me [appendArgs :
42f0: 3a 20 24 76 61 72 4e 61 6d 65 5d 0d 0a 0d 0a 20  : $varName].... 
4300: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
4310: 20 20 23 20 4e 4f 54 45 3a 20 44 6f 65 73 20 74    # NOTE: Does t
4320: 68 65 20 76 61 72 69 61 62 6c 65 20 65 78 69 73  he variable exis
4330: 74 20 69 6e 20 74 68 69 73 20 69 6e 74 65 72 70  t in this interp
4340: 72 65 74 65 72 20 63 6f 6e 74 65 78 74 3f 0d 0a  reter context?..
4350: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
4360: 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69     if {[info exi
4370: 73 74 73 20 24 66 75 6c 6c 56 61 72 4e 61 6d 65  sts $fullVarName
4380: 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
4390: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
43a0: 20 20 23 20 4e 4f 54 45 3a 20 41 70 70 65 6e 64    # NOTE: Append
43b0: 20 61 20 73 63 72 69 70 74 20 66 72 61 67 6d 65   a script fragme
43c0: 6e 74 20 74 6f 20 74 68 65 20 72 65 73 75 6c 74  nt to the result
43d0: 20 74 68 61 74 20 77 69 6c 6c 20 63 6f 72 72 65   that will corre
43e0: 63 74 6c 79 0d 0a 20 20 20 20 20 20 20 20 20 20  ctly..          
43f0: 23 20 20 20 20 20 20 20 63 6f 70 79 20 61 6e 79  #       copy any
4400: 20 63 6f 6e 74 61 69 6e 65 64 20 76 61 6c 75 65   contained value
4410: 20 74 6f 20 61 6e 6f 74 68 65 72 20 69 6e 74 65   to another inte
4420: 72 70 72 65 74 65 72 20 63 6f 6e 74 65 78 74 2e  rpreter context.
4430: 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20  ..          #.. 
4440: 20 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 20           append 
4450: 72 65 73 75 6c 74 20 5c 6e 20 22 73 65 74 20 22  result \n "set "
4460: 20 24 66 75 6c 6c 56 61 72 4e 61 6d 65 20 22 20   $fullVarName " 
4470: 5c 7b 22 20 5b 73 65 74 20 24 66 75 6c 6c 56 61  \{" [set $fullVa
4480: 72 4e 61 6d 65 5d 20 5c 7d 0d 0a 20 20 20 20 20  rName] \}..     
4490: 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d     }..      }...
44a0: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
44b0: 23 20 4e 4f 54 45 3a 20 49 66 20 74 68 65 20 72  # NOTE: If the r
44c0: 65 73 75 6c 74 20 63 6f 6e 74 61 69 6e 73 20 6f  esult contains o
44d0: 6e 65 20 6f 72 20 6d 6f 72 65 20 73 63 72 69 70  ne or more scrip
44e0: 74 20 66 72 61 67 6d 65 6e 74 73 2c 20 61 70 70  t fragments, app
44f0: 65 6e 64 20 61 0d 0a 20 20 20 20 20 20 23 20 20  end a..      #  
4500: 20 20 20 20 20 6e 65 77 6c 69 6e 65 2e 0d 0a 20       newline... 
4510: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66       #..      if
4520: 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68   {[string length
4530: 20 24 72 65 73 75 6c 74 5d 20 3e 20 30 7d 20 74   $result] > 0} t
4540: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 61  hen {..        a
4550: 70 70 65 6e 64 20 72 65 73 75 6c 74 20 5c 6e 0d  ppend result \n.
4560: 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
4570: 20 20 72 65 74 75 72 6e 20 24 72 65 73 75 6c 74    return $result
4580: 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
4590: 70 72 6f 63 20 67 65 74 41 70 70 44 6f 6d 61 69  proc getAppDomai
45a0: 6e 50 72 65 61 6d 62 6c 65 20 7b 20 7b 70 72 65  nPreamble { {pre
45b0: 66 69 78 20 22 22 7d 20 7b 73 75 66 66 69 78 20  fix ""} {suffix 
45c0: 22 22 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23  ""} } {..      #
45d0: 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
45e0: 54 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 72  This procedure r
45f0: 65 74 75 72 6e 73 20 61 20 74 65 73 74 20 73 65  eturns a test se
4600: 74 75 70 20 73 63 72 69 70 74 20 66 72 61 67 6d  tup script fragm
4610: 65 6e 74 20 73 75 69 74 61 62 6c 65 20 66 6f 72  ent suitable for
4620: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
4630: 65 76 61 6c 75 61 74 69 6f 6e 20 62 79 20 61 6e  evaluation by an
4640: 20 69 6e 74 65 72 70 72 65 74 65 72 20 63 72 65   interpreter cre
4650: 61 74 65 64 20 69 6e 20 61 6e 20 69 73 6f 6c 61  ated in an isola
4660: 74 65 64 20 61 70 70 6c 69 63 61 74 69 6f 6e 0d  ted application.
4670: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 64  .      #       d
4680: 6f 6d 61 69 6e 2e 20 20 54 68 65 20 73 63 72 69  omain.  The scri
4690: 70 74 20 66 72 61 67 6d 65 6e 74 20 62 65 69 6e  pt fragment bein
46a0: 67 20 72 65 74 75 72 6e 65 64 20 77 69 6c 6c 20  g returned will 
46b0: 62 65 20 73 75 72 72 6f 75 6e 64 65 64 20 62 79  be surrounded by
46c0: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
46d0: 74 68 65 20 70 72 65 66 69 78 20 61 6e 64 20 73  the prefix and s
46e0: 75 66 66 69 78 20 22 73 63 72 69 70 74 20 66 72  uffix "script fr
46f0: 61 67 6d 65 6e 74 73 22 20 73 70 65 63 69 66 69  agments" specifi
4700: 65 64 20 62 79 20 6f 75 72 20 63 61 6c 6c 65 72  ed by our caller
4710: 2c 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  ,..      #      
4720: 20 69 66 20 61 6e 79 2e 20 20 54 68 65 20 65 6e   if any.  The en
4730: 74 69 72 65 20 73 63 72 69 70 74 20 62 65 69 6e  tire script bein
4740: 67 20 72 65 74 75 72 6e 65 64 20 77 69 6c 6c 20  g returned will 
4750: 62 65 20 73 75 62 73 74 69 74 75 74 65 64 20 76  be substituted v
4760: 69 61 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  ia..      #     
4770: 20 20 5b 73 75 62 73 74 5d 2c 20 69 6e 20 74 68    [subst], in th
4780: 65 20 63 6f 6e 74 65 78 74 20 6f 66 20 6f 75 72  e context of our
4790: 20 63 61 6c 6c 65 72 2c 20 62 65 66 6f 72 65 20   caller, before 
47a0: 62 65 69 6e 67 20 72 65 74 75 72 6e 65 64 2e 0d  being returned..
47b0: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 54  .      #       T
47c0: 68 69 73 20 73 74 65 70 20 69 73 20 6e 65 63 65  his step is nece
47d0: 73 73 61 72 79 20 73 6f 20 74 68 61 74 20 73 6f  ssary so that so
47e0: 6d 65 20 6c 69 6d 69 74 65 64 20 63 6f 6e 74 65  me limited conte
47f0: 78 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2c 0d  xt information,.
4800: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 70  .      #       p
4810: 72 69 6d 61 72 69 6c 79 20 72 65 6c 61 74 65 64  rimarily related
4820: 20 74 6f 20 74 68 65 20 74 65 73 74 69 6e 67 20   to the testing 
4830: 64 69 72 65 63 74 6f 72 69 65 73 2c 20 63 61 6e  directories, can
4840: 20 62 65 20 74 72 61 6e 73 66 65 72 72 65 64 0d   be transferred.
4850: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74  .      #       t
4860: 6f 20 74 68 65 20 69 6e 74 65 72 70 72 65 74 65  o the interprete
4870: 72 20 69 6e 20 74 68 65 20 69 73 6f 6c 61 74 65  r in the isolate
4880: 64 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 64 6f  d application do
4890: 6d 61 69 6e 2c 20 6d 61 6b 69 6e 67 20 69 74 0d  main, making it.
48a0: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 61  .      #       a
48b0: 62 6c 65 20 74 6f 20 73 75 63 63 65 73 73 66 75  ble to successfu
48c0: 6c 6c 79 20 72 75 6e 20 74 65 73 74 73 20 74 68  lly run tests th
48d0: 61 74 20 72 65 71 75 69 72 65 20 6f 6e 65 20 6f  at require one o
48e0: 72 20 6d 6f 72 65 20 6f 66 20 74 68 65 0d 0a 20  r more of the.. 
48f0: 20 20 20 20 20 23 20 20 20 20 20 20 20 66 69 6c       #       fil
4900: 65 73 20 69 6e 20 6f 6e 65 20 6f 66 20 74 68 65  es in one of the
4910: 20 74 65 73 74 69 6e 67 20 64 69 72 65 63 74 6f   testing directo
4920: 72 69 65 73 2e 20 20 43 61 6c 6c 65 72 73 20 73  ries.  Callers s
4930: 68 6f 75 6c 64 20 6b 65 65 70 20 69 6e 0d 0a 20  hould keep in.. 
4940: 20 20 20 20 20 23 20 20 20 20 20 20 20 6d 69 6e       #       min
4950: 64 20 74 68 61 74 20 74 68 65 20 74 65 73 74 20  d that the test 
4960: 73 63 72 69 70 74 20 66 72 61 67 6d 65 6e 74 20  script fragment 
4970: 62 65 69 6e 67 20 72 65 74 75 72 6e 65 64 20 63  being returned c
4980: 61 6e 6e 6f 74 20 72 65 6c 79 20 6f 6e 0d 0a 20  annot rely on.. 
4990: 20 20 20 20 20 23 20 20 20 20 20 20 20 61 6e 79       #       any
49a0: 20 73 63 72 69 70 74 20 6c 69 62 72 61 72 79 20   script library 
49b0: 70 72 6f 63 65 64 75 72 65 73 20 74 68 61 74 20  procedures that 
49c0: 61 72 65 20 6e 6f 74 20 70 72 6f 76 69 64 65 64  are not provided
49d0: 20 62 79 20 74 68 65 20 45 61 67 6c 65 0d 0a 20   by the Eagle.. 
49e0: 20 20 20 20 20 23 20 20 20 20 20 20 20 6c 69 62       #       lib
49f0: 72 61 72 79 20 70 61 63 6b 61 67 65 20 28 69 2e  rary package (i.
4a00: 65 2e 20 22 69 6e 69 74 2e 65 61 67 6c 65 22 29  e. "init.eagle")
4a10: 2c 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 6f 73  , including thos
4a20: 65 20 70 72 6f 76 69 64 65 64 20 62 79 0d 0a 20  e provided by.. 
4a30: 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68 65       #       the
4a40: 20 45 61 67 6c 65 20 74 65 73 74 20 70 61 63 6b   Eagle test pack
4a50: 61 67 65 2c 20 75 6e 6c 65 73 73 20 74 68 65 20  age, unless the 
4a60: 66 69 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  file containing 
4a70: 74 68 65 6d 20 69 73 20 6c 6f 61 64 65 64 0d 0a  them is loaded..
4a80: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 6d 61        #       ma
4a90: 6e 75 61 6c 6c 79 20 76 69 61 20 73 6f 6d 65 20  nually via some 
4aa0: 6f 74 68 65 72 20 6d 65 63 68 61 6e 69 73 6d 20  other mechanism 
4ab0: 28 65 2e 67 2e 20 62 79 20 69 6e 63 6c 75 64 69  (e.g. by includi
4ac0: 6e 67 20 61 70 70 72 6f 70 72 69 61 74 65 0d 0a  ng appropriate..
4ad0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 5b 70        #       [p
4ae0: 61 63 6b 61 67 65 20 72 65 71 75 69 72 65 5d 20  ackage require] 
4af0: 6f 72 20 5b 73 6f 75 72 63 65 5d 20 63 6f 6d 6d  or [source] comm
4b00: 61 6e 64 73 20 69 6e 20 74 68 65 20 70 72 65 66  ands in the pref
4b10: 69 78 20 6f 72 20 73 75 66 66 69 78 0d 0a 20 20  ix or suffix..  
4b20: 20 20 20 20 23 20 20 20 20 20 20 20 73 63 72 69      #       scri
4b30: 70 74 20 66 72 61 67 6d 65 6e 74 73 29 2e 20 20  pt fragments).  
4b40: 41 6c 73 6f 2c 20 61 6c 6c 20 76 61 72 69 61 62  Also, all variab
4b50: 6c 65 20 72 65 66 65 72 65 6e 63 65 73 20 61 6e  le references an
4b60: 64 20 61 6c 6c 20 6e 65 73 74 65 64 0d 0a 20 20  d all nested..  
4b70: 20 20 20 20 23 20 20 20 20 20 20 20 63 6f 6d 6d      #       comm
4b80: 61 6e 64 73 20 28 69 2e 65 2e 20 74 68 6f 73 65  ands (i.e. those
4b90: 20 69 6e 20 73 71 75 61 72 65 20 62 72 61 63 6b   in square brack
4ba0: 65 74 73 29 20 63 6f 6e 74 61 69 6e 65 64 20 69  ets) contained i
4bb0: 6e 20 74 68 65 20 66 69 6e 61 6c 0d 0a 20 20 20  n the final..   
4bc0: 20 20 20 23 20 20 20 20 20 20 20 73 63 72 69 70     #       scrip
4bd0: 74 20 66 72 61 67 6d 65 6e 74 20 77 69 6c 6c 20  t fragment will 
4be0: 65 6e 64 20 75 70 20 62 65 69 6e 67 20 65 76 61  end up being eva
4bf0: 6c 75 61 74 65 64 20 69 6e 20 74 68 65 20 63 6f  luated in the co
4c00: 6e 74 65 78 74 20 6f 66 20 74 68 65 0d 0a 20 20  ntext of the..  
4c10: 20 20 20 20 23 20 20 20 20 20 20 20 63 61 6c 6c      #       call
4c20: 69 6e 67 20 69 6e 74 65 72 70 72 65 74 65 72 20  ing interpreter 
4c30: 61 6e 64 20 6e 6f 74 20 74 68 65 20 74 61 72 67  and not the targ
4c40: 65 74 20 69 6e 74 65 72 70 72 65 74 65 72 20 63  et interpreter c
4c50: 72 65 61 74 65 64 20 69 6e 20 74 68 65 0d 0a 20  reated in the.. 
4c60: 20 20 20 20 20 23 20 20 20 20 20 20 20 69 73 6f       #       iso
4c70: 6c 61 74 65 64 20 61 70 70 6c 69 63 61 74 69 6f  lated applicatio
4c80: 6e 20 64 6f 6d 61 69 6e 20 75 6e 6c 65 73 73 20  n domain unless 
4c90: 74 68 65 20 64 6f 6c 6c 61 72 20 73 69 67 6e 73  the dollar signs
4ca0: 20 61 6e 64 2f 6f 72 20 73 71 75 61 72 65 0d 0a   and/or square..
4cb0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 62 72        #       br
4cc0: 61 63 6b 65 74 73 20 61 72 65 20 73 70 65 63 69  ackets are speci
4cd0: 61 6c 6c 79 20 71 75 6f 74 65 64 20 77 69 74 68  ally quoted with
4ce0: 20 62 61 63 6b 73 6c 61 73 68 65 73 2e 0d 0a 20   backslashes... 
4cf0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 72 65       #..      re
4d00: 74 75 72 6e 20 5b 75 70 6c 65 76 65 6c 20 31 20  turn [uplevel 1 
4d10: 5b 6c 69 73 74 20 73 75 62 73 74 20 5b 61 70 70  [list subst [app
4d20: 65 6e 64 41 72 67 73 20 24 70 72 65 66 69 78 20  endArgs $prefix 
4d30: 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b  {..        if {[
4d40: 68 61 73 52 75 6e 74 69 6d 65 4f 70 74 69 6f 6e  hasRuntimeOption
4d50: 20 6e 61 74 69 76 65 5d 7d 20 74 68 65 6e 20 7b   native]} then {
4d60: 0d 0a 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65  ..          obje
4d70: 63 74 20 69 6e 76 6f 6b 65 20 49 6e 74 65 72 70  ct invoke Interp
4d80: 72 65 74 65 72 2e 47 65 74 41 63 74 69 76 65 20  reter.GetActive 
4d90: 41 64 64 52 75 6e 74 69 6d 65 4f 70 74 69 6f 6e  AddRuntimeOption
4da0: 20 6e 61 74 69 76 65 0d 0a 20 20 20 20 20 20 20   native..       
4db0: 20 7d 0d 0a 20 20 20 20 20 20 7d 20 5b 67 65 74   }..      } [get
4dc0: 54 65 73 74 4f 76 65 72 72 69 64 65 73 50 72 65  TestOverridesPre
4dd0: 61 6d 62 6c 65 20 5b 6c 69 73 74 20 70 61 74 68  amble [list path
4de0: 20 74 65 73 74 5f 63 68 61 6e 6e 65 6c 5d 5d 20   test_channel]] 
4df0: 24 73 75 66 66 69 78 5d 5d 5d 0d 0a 20 20 20 20  $suffix]]]..    
4e00: 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 74  }.....    proc t
4e10: 72 79 43 6f 70 79 42 69 6e 61 72 79 46 69 6c 65  ryCopyBinaryFile
4e20: 20 7b 20 66 69 6c 65 4e 61 6d 65 20 7b 6e 65 77   { fileName {new
4e30: 46 69 6c 65 4e 61 6d 65 20 22 22 7d 20 7d 20 7b  FileName ""} } {
4e40: 0d 0a 20 20 20 20 20 20 73 65 74 20 73 6f 75 72  ..      set sour
4e50: 63 65 46 69 6c 65 4e 61 6d 65 20 5b 67 65 74 42  ceFileName [getB
4e60: 69 6e 61 72 79 46 69 6c 65 4e 61 6d 65 20 24 66  inaryFileName $f
4e70: 69 6c 65 4e 61 6d 65 5d 0d 0a 0d 0a 20 20 20 20  ileName]....    
4e80: 20 20 69 66 20 7b 21 5b 66 69 6c 65 20 65 78 69    if {![file exi
4e90: 73 74 73 20 24 73 6f 75 72 63 65 46 69 6c 65 4e  sts $sourceFileN
4ea0: 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ame]} then {..  
4eb0: 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
4ec0: 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70  est_channel [app
4ed0: 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
4ee0: 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 73 6b 69         "---- ski
4ef0: 70 70 65 64 20 63 6f 70 79 69 6e 67 20 62 69 6e  pped copying bin
4f00: 61 72 79 20 66 69 6c 65 20 5c 22 22 20 24 73 6f  ary file \"" $so
4f10: 75 72 63 65 46 69 6c 65 4e 61 6d 65 20 5c 0d 0a  urceFileName \..
4f20: 20 20 20 20 20 20 20 20 20 20 20 20 22 5c 22 2c              "\",
4f30: 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 65 78 69   it does not exi
4f40: 73 74 5c 6e 22 5d 0d 0a 0d 0a 20 20 20 20 20 20  st\n"]....      
4f50: 20 20 72 65 74 75 72 6e 0d 0a 20 20 20 20 20 20    return..      
4f60: 7d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b  }....      if {[
4f70: 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 6e  string length $n
4f80: 65 77 46 69 6c 65 4e 61 6d 65 5d 20 3e 20 30 7d  ewFileName] > 0}
4f90: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
4fa0: 20 73 65 74 20 74 61 72 67 65 74 46 69 6c 65 4e   set targetFileN
4fb0: 61 6d 65 20 5b 67 65 74 42 75 69 6c 64 46 69 6c  ame [getBuildFil
4fc0: 65 4e 61 6d 65 20 24 6e 65 77 46 69 6c 65 4e 61  eName $newFileNa
4fd0: 6d 65 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73  me]..      } els
4fe0: 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 65 74  e {..        set
4ff0: 20 74 61 72 67 65 74 46 69 6c 65 4e 61 6d 65 20   targetFileName 
5000: 5b 67 65 74 42 75 69 6c 64 46 69 6c 65 4e 61 6d  [getBuildFileNam
5010: 65 20 24 66 69 6c 65 4e 61 6d 65 5d 0d 0a 20 20  e $fileName]..  
5020: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 69      }....      i
5030: 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20  f {[catch {..   
5040: 20 20 20 20 20 20 20 20 20 20 20 66 69 6c 65 20             file 
5050: 63 6f 70 79 20 2d 66 6f 72 63 65 20 24 73 6f 75  copy -force $sou
5060: 72 63 65 46 69 6c 65 4e 61 6d 65 20 24 74 61 72  rceFileName $tar
5070: 67 65 74 46 69 6c 65 4e 61 6d 65 7d 5d 20 3d 3d  getFileName}] ==
5080: 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
5090: 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
50a0: 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e  t_channel [appen
50b0: 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
50c0: 20 20 20 20 20 22 2d 2d 2d 2d 20 63 6f 70 69 65       "---- copie
50d0: 64 20 62 69 6e 61 72 79 20 66 69 6c 65 20 66 72  d binary file fr
50e0: 6f 6d 20 5c 22 22 20 24 73 6f 75 72 63 65 46 69  om \"" $sourceFi
50f0: 6c 65 4e 61 6d 65 20 22 5c 22 20 74 6f 20 5c 22  leName "\" to \"
5100: 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  " \..           
5110: 20 24 74 61 72 67 65 74 46 69 6c 65 4e 61 6d 65   $targetFileName
5120: 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d 20   \"\n]..      } 
5130: 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
5140: 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
5150: 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
5160: 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
5170: 20 22 2d 2d 2d 2d 20 66 61 69 6c 65 64 20 74 6f   "---- failed to
5180: 20 63 6f 70 79 20 62 69 6e 61 72 79 20 66 69 6c   copy binary fil
5190: 65 20 66 72 6f 6d 20 5c 22 22 20 24 73 6f 75 72  e from \"" $sour
51a0: 63 65 46 69 6c 65 4e 61 6d 65 20 5c 0d 0a 20 20  ceFileName \..  
51b0: 20 20 20 20 20 20 20 20 20 20 22 5c 22 20 74 6f            "\" to
51c0: 20 5c 22 22 20 24 74 61 72 67 65 74 46 69 6c 65   \"" $targetFile
51d0: 4e 61 6d 65 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20  Name \"\n]..    
51e0: 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20    }..    }..... 
51f0: 20 20 20 70 72 6f 63 20 74 72 79 43 6f 70 79 42     proc tryCopyB
5200: 75 69 6c 64 46 69 6c 65 20 7b 20 66 69 6c 65 4e  uildFile { fileN
5210: 61 6d 65 20 7b 6e 65 77 46 69 6c 65 4e 61 6d 65  ame {newFileName
5220: 20 22 22 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20   ""} } {..      
5230: 73 65 74 20 73 6f 75 72 63 65 46 69 6c 65 4e 61  set sourceFileNa
5240: 6d 65 20 5b 67 65 74 42 75 69 6c 64 46 69 6c 65  me [getBuildFile
5250: 4e 61 6d 65 20 24 66 69 6c 65 4e 61 6d 65 5d 0d  Name $fileName].
5260: 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 21 5b 66  ...      if {![f
5270: 69 6c 65 20 65 78 69 73 74 73 20 24 73 6f 75 72  ile exists $sour
5280: 63 65 46 69 6c 65 4e 61 6d 65 5d 7d 20 74 68 65  ceFileName]} the
5290: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75  n {..        tpu
52a0: 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
52b0: 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
52c0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 2d  ..            "-
52d0: 2d 2d 2d 20 73 6b 69 70 70 65 64 20 63 6f 70 79  --- skipped copy
52e0: 69 6e 67 20 62 75 69 6c 64 20 66 69 6c 65 20 5c  ing build file \
52f0: 22 22 20 24 73 6f 75 72 63 65 46 69 6c 65 4e 61  "" $sourceFileNa
5300: 6d 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  me \..          
5310: 20 20 22 5c 22 2c 20 69 74 20 64 6f 65 73 20 6e    "\", it does n
5320: 6f 74 20 65 78 69 73 74 5c 6e 22 5d 0d 0a 0d 0a  ot exist\n"]....
5330: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 0d 0a          return..
5340: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
5350: 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e   if {[string len
5360: 67 74 68 20 24 6e 65 77 46 69 6c 65 4e 61 6d 65  gth $newFileName
5370: 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20  ] > 0} then {.. 
5380: 20 20 20 20 20 20 20 73 65 74 20 74 61 72 67 65         set targe
5390: 74 46 69 6c 65 4e 61 6d 65 20 5b 67 65 74 42 69  tFileName [getBi
53a0: 6e 61 72 79 46 69 6c 65 4e 61 6d 65 20 24 6e 65  naryFileName $ne
53b0: 77 46 69 6c 65 4e 61 6d 65 5d 0d 0a 20 20 20 20  wFileName]..    
53c0: 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
53d0: 20 20 20 20 73 65 74 20 74 61 72 67 65 74 46 69      set targetFi
53e0: 6c 65 4e 61 6d 65 20 5b 67 65 74 42 69 6e 61 72  leName [getBinar
53f0: 79 46 69 6c 65 4e 61 6d 65 20 24 66 69 6c 65 4e  yFileName $fileN
5400: 61 6d 65 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d  ame]..      }...
5410: 0a 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63  .      if {[catc
5420: 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  h {..           
5430: 20 20 20 66 69 6c 65 20 63 6f 70 79 20 2d 66 6f     file copy -fo
5440: 72 63 65 20 24 73 6f 75 72 63 65 46 69 6c 65 4e  rce $sourceFileN
5450: 61 6d 65 20 24 74 61 72 67 65 74 46 69 6c 65 4e  ame $targetFileN
5460: 61 6d 65 7d 5d 20 3d 3d 20 30 7d 20 74 68 65 6e  ame}] == 0} then
5470: 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74   {..        tput
5480: 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
5490: 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
54a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d  .            "--
54b0: 2d 2d 20 63 6f 70 69 65 64 20 62 75 69 6c 64 20  -- copied build 
54c0: 66 69 6c 65 20 66 72 6f 6d 20 5c 22 22 20 24 73  file from \"" $s
54d0: 6f 75 72 63 65 46 69 6c 65 4e 61 6d 65 20 22 5c  ourceFileName "\
54e0: 22 20 74 6f 20 5c 22 22 20 5c 0d 0a 20 20 20 20  " to \"" \..    
54f0: 20 20 20 20 20 20 20 20 24 74 61 72 67 65 74 46          $targetF
5500: 69 6c 65 4e 61 6d 65 20 5c 22 5c 6e 5d 0d 0a 20  ileName \"\n].. 
5510: 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
5520: 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
5530: 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70  test_channel [ap
5540: 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
5550: 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 66 61          "---- fa
5560: 69 6c 65 64 20 74 6f 20 63 6f 70 79 20 62 75 69  iled to copy bui
5570: 6c 64 20 66 69 6c 65 20 66 72 6f 6d 20 5c 22 22  ld file from \""
5580: 20 24 73 6f 75 72 63 65 46 69 6c 65 4e 61 6d 65   $sourceFileName
5590: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
55a0: 22 5c 22 20 74 6f 20 5c 22 22 20 24 74 61 72 67  "\" to \"" $targ
55b0: 65 74 46 69 6c 65 4e 61 6d 65 20 5c 22 5c 6e 5d  etFileName \"\n]
55c0: 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d  ..      }..    }
55d0: 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 74 72  .....    proc tr
55e0: 79 44 65 6c 65 74 65 42 69 6e 61 72 79 46 69 6c  yDeleteBinaryFil
55f0: 65 20 7b 20 66 69 6c 65 4e 61 6d 65 20 7d 20 7b  e { fileName } {
5600: 0d 0a 20 20 20 20 20 20 73 65 74 20 66 69 6c 65  ..      set file
5610: 4e 61 6d 65 20 5b 67 65 74 42 69 6e 61 72 79 46  Name [getBinaryF
5620: 69 6c 65 4e 61 6d 65 20 24 66 69 6c 65 4e 61 6d  ileName $fileNam
5630: 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b  e]....      if {
5640: 21 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24 66  ![file exists $f
5650: 69 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b  ileName]} then {
5660: 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20  ..        tputs 
5670: 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
5680: 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
5690: 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
56a0: 20 73 6b 69 70 70 65 64 20 64 65 6c 65 74 69 6e   skipped deletin
56b0: 67 20 62 69 6e 61 72 79 20 66 69 6c 65 20 5c 22  g binary file \"
56c0: 22 20 24 66 69 6c 65 4e 61 6d 65 20 5c 0d 0a 20  " $fileName \.. 
56d0: 20 20 20 20 20 20 20 20 20 20 20 22 5c 22 2c 20             "\", 
56e0: 69 74 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73  it does not exis
56f0: 74 5c 6e 22 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  t\n"]....       
5700: 20 72 65 74 75 72 6e 0d 0a 20 20 20 20 20 20 7d   return..      }
5710: 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 63  ....      if {[c
5720: 61 74 63 68 20 7b 66 69 6c 65 20 64 65 6c 65 74  atch {file delet
5730: 65 20 24 66 69 6c 65 4e 61 6d 65 7d 5d 20 3d 3d  e $fileName}] ==
5740: 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
5750: 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
5760: 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e  t_channel [appen
5770: 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
5780: 20 20 20 20 20 22 2d 2d 2d 2d 20 64 65 6c 65 74       "---- delet
5790: 65 64 20 62 69 6e 61 72 79 20 66 69 6c 65 20 5c  ed binary file \
57a0: 22 22 20 24 66 69 6c 65 4e 61 6d 65 20 5c 22 5c  "" $fileName \"\
57b0: 6e 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65  n]..      } else
57c0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74   {..        tput
57d0: 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
57e0: 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
57f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d  .            "--
5800: 2d 2d 20 66 61 69 6c 65 64 20 74 6f 20 64 65 6c  -- failed to del
5810: 65 74 65 20 62 69 6e 61 72 79 20 66 69 6c 65 20  ete binary file 
5820: 5c 22 22 20 24 66 69 6c 65 4e 61 6d 65 20 5c 22  \"" $fileName \"
5830: 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20  \n]..      }..  
5840: 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
5850: 20 74 72 79 44 65 6c 65 74 65 42 75 69 6c 64 46   tryDeleteBuildF
5860: 69 6c 65 20 7b 20 66 69 6c 65 4e 61 6d 65 20 7d  ile { fileName }
5870: 20 7b 0d 0a 20 20 20 20 20 20 73 65 74 20 66 69   {..      set fi
5880: 6c 65 4e 61 6d 65 20 5b 67 65 74 42 75 69 6c 64  leName [getBuild
5890: 46 69 6c 65 4e 61 6d 65 20 24 66 69 6c 65 4e 61  FileName $fileNa
58a0: 6d 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20  me]....      if 
58b0: 7b 21 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24  {![file exists $
58c0: 66 69 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20  fileName]} then 
58d0: 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73  {..        tputs
58e0: 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
58f0: 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
5900: 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
5910: 2d 20 73 6b 69 70 70 65 64 20 64 65 6c 65 74 69  - skipped deleti
5920: 6e 67 20 62 75 69 6c 64 20 66 69 6c 65 20 5c 22  ng build file \"
5930: 22 20 24 66 69 6c 65 4e 61 6d 65 20 5c 0d 0a 20  " $fileName \.. 
5940: 20 20 20 20 20 20 20 20 20 20 20 22 5c 22 2c 20             "\", 
5950: 69 74 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73  it does not exis
5960: 74 5c 6e 22 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  t\n"]....       
5970: 20 72 65 74 75 72 6e 0d 0a 20 20 20 20 20 20 7d   return..      }
5980: 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 63  ....      if {[c
5990: 61 74 63 68 20 7b 66 69 6c 65 20 64 65 6c 65 74  atch {file delet
59a0: 65 20 24 66 69 6c 65 4e 61 6d 65 7d 5d 20 3d 3d  e $fileName}] ==
59b0: 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
59c0: 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
59d0: 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e  t_channel [appen
59e0: 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
59f0: 20 20 20 20 20 22 2d 2d 2d 2d 20 64 65 6c 65 74       "---- delet
5a00: 65 64 20 62 75 69 6c 64 20 66 69 6c 65 20 5c 22  ed build file \"
5a10: 22 20 24 66 69 6c 65 4e 61 6d 65 20 5c 22 5c 6e  " $fileName \"\n
5a20: 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20  ]..      } else 
5a30: 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73  {..        tputs
5a40: 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
5a50: 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
5a60: 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
5a70: 2d 20 66 61 69 6c 65 64 20 74 6f 20 64 65 6c 65  - failed to dele
5a80: 74 65 20 62 75 69 6c 64 20 66 69 6c 65 20 5c 22  te build file \"
5a90: 22 20 24 66 69 6c 65 4e 61 6d 65 20 5c 22 5c 6e  " $fileName \"\n
5aa0: 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  ]..      }..    
5ab0: 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 74  }.....    proc t
5ac0: 72 79 43 6f 70 79 41 73 73 65 6d 62 6c 79 20 7b  ryCopyAssembly {
5ad0: 20 66 69 6c 65 4e 61 6d 65 20 7b 70 64 62 20 74   fileName {pdb t
5ae0: 72 75 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20  rue} } {..      
5af0: 74 72 79 43 6f 70 79 42 75 69 6c 64 46 69 6c 65  tryCopyBuildFile
5b00: 20 24 66 69 6c 65 4e 61 6d 65 0d 0a 0d 0a 20 20   $fileName....  
5b10: 20 20 20 20 69 66 20 7b 24 70 64 62 7d 20 74 68      if {$pdb} th
5b20: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 72  en {..        tr
5b30: 79 43 6f 70 79 42 75 69 6c 64 46 69 6c 65 20 5b  yCopyBuildFile [
5b40: 61 70 70 65 6e 64 41 72 67 73 20 5b 66 69 6c 65  appendArgs [file
5b50: 20 72 6f 6f 74 6e 61 6d 65 20 24 66 69 6c 65 4e   rootname $fileN
5b60: 61 6d 65 5d 20 2e 70 64 62 5d 0d 0a 20 20 20 20  ame] .pdb]..    
5b70: 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20    }..    }..... 
5b80: 20 20 20 70 72 6f 63 20 74 72 79 44 65 6c 65 74     proc tryDelet
5b90: 65 41 73 73 65 6d 62 6c 79 20 7b 20 66 69 6c 65  eAssembly { file
5ba0: 4e 61 6d 65 20 7b 70 64 62 20 74 72 75 65 7d 20  Name {pdb true} 
5bb0: 7d 20 7b 0d 0a 20 20 20 20 20 20 74 72 79 44 65  } {..      tryDe
5bc0: 6c 65 74 65 42 69 6e 61 72 79 46 69 6c 65 20 24  leteBinaryFile $
5bd0: 66 69 6c 65 4e 61 6d 65 0d 0a 0d 0a 20 20 20 20  fileName....    
5be0: 20 20 69 66 20 7b 24 70 64 62 7d 20 74 68 65 6e    if {$pdb} then
5bf0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 72 79 44   {..        tryD
5c00: 65 6c 65 74 65 42 69 6e 61 72 79 46 69 6c 65 20  eleteBinaryFile 
5c10: 5b 61 70 70 65 6e 64 41 72 67 73 20 5b 66 69 6c  [appendArgs [fil
5c20: 65 20 72 6f 6f 74 6e 61 6d 65 20 24 66 69 6c 65  e rootname $file
5c30: 4e 61 6d 65 5d 20 2e 70 64 62 5d 0d 0a 20 20 20  Name] .pdb]..   
5c40: 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a     }..    }.....
5c50: 20 20 20 20 70 72 6f 63 20 74 72 79 4c 6f 61 64      proc tryLoad
5c60: 41 73 73 65 6d 62 6c 79 20 7b 20 66 69 6c 65 4e  Assembly { fileN
5c70: 61 6d 65 20 7d 20 7b 0d 0a 20 20 20 20 20 20 73  ame } {..      s
5c80: 65 74 20 66 69 6c 65 4e 61 6d 65 20 5b 67 65 74  et fileName [get
5c90: 42 69 6e 61 72 79 46 69 6c 65 4e 61 6d 65 20 24  BinaryFileName $
5ca0: 66 69 6c 65 4e 61 6d 65 5d 0d 0a 0d 0a 20 20 20  fileName]....   
5cb0: 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 73     if {[catch {s
5cc0: 65 74 20 61 73 73 65 6d 62 6c 79 20 5c 0d 0a 20  et assembly \.. 
5cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 6f 62               [ob
5ce0: 6a 65 63 74 20 6c 6f 61 64 20 2d 6c 6f 61 64 74  ject load -loadt
5cf0: 79 70 65 20 46 69 6c 65 20 2d 61 6c 69 61 73 20  ype File -alias 
5d00: 24 66 69 6c 65 4e 61 6d 65 5d 7d 5d 20 3d 3d 20  $fileName]}] == 
5d10: 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
5d20: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
5d30: 4e 4f 54 45 3a 20 4e 6f 77 2c 20 61 64 64 20 74  NOTE: Now, add t
5d40: 68 65 20 6e 65 63 65 73 73 61 72 79 20 74 65 73  he necessary tes
5d50: 74 20 63 6f 6e 73 74 72 61 69 6e 74 2e 0d 0a 20  t constraint... 
5d60: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
5d70: 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20    addConstraint 
5d80: 5b 66 69 6c 65 20 72 6f 6f 74 6e 61 6d 65 20 5b  [file rootname [
5d90: 66 69 6c 65 20 74 61 69 6c 20 24 66 69 6c 65 4e  file tail $fileN
5da0: 61 6d 65 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  ame]]....       
5db0: 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
5dc0: 54 45 3a 20 47 72 61 62 20 74 68 65 20 69 6d 61  TE: Grab the ima
5dd0: 67 65 20 72 75 6e 74 69 6d 65 20 76 65 72 73 69  ge runtime versi
5de0: 6f 6e 20 66 72 6f 6d 20 74 68 65 20 61 73 73 65  on from the asse
5df0: 6d 62 6c 79 20 62 65 63 61 75 73 65 0d 0a 20 20  mbly because..  
5e00: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 73 65        #       se
5e10: 76 65 72 61 6c 20 74 65 73 74 73 20 72 65 6c 79  veral tests rely
5e20: 20 6f 6e 20 69 74 20 68 61 76 69 6e 67 20 61 20   on it having a 
5e30: 63 65 72 74 61 69 6e 20 76 61 6c 75 65 2e 0d 0a  certain value...
5e40: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
5e50: 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74     addConstraint
5e60: 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5b 66 69   [appendArgs [fi
5e70: 6c 65 20 74 61 69 6c 20 24 66 69 6c 65 4e 61 6d  le tail $fileNam
5e80: 65 5d 20 5f 20 5c 0d 0a 20 20 20 20 20 20 20 20  e] _ \..        
5e90: 20 20 20 20 5b 24 61 73 73 65 6d 62 6c 79 20 49      [$assembly I
5ea0: 6d 61 67 65 52 75 6e 74 69 6d 65 56 65 72 73 69  mageRuntimeVersi
5eb0: 6f 6e 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  on]]....        
5ec0: 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
5ed0: 45 3a 20 52 65 74 75 72 6e 20 74 68 65 20 66 75  E: Return the fu
5ee0: 6c 6c 20 70 61 74 68 20 6f 66 20 74 68 65 20 6c  ll path of the l
5ef0: 6f 61 64 65 64 20 66 69 6c 65 2e 0d 0a 20 20 20  oaded file...   
5f00: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
5f10: 72 65 74 75 72 6e 20 24 66 69 6c 65 4e 61 6d 65  return $fileName
5f20: 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
5f30: 20 20 20 72 65 74 75 72 6e 20 22 22 0d 0a 20 20     return ""..  
5f40: 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
5f50: 20 69 73 53 51 4c 69 74 65 52 65 61 64 79 20 7b   isSQLiteReady {
5f60: 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  } {..      #..  
5f70: 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 69 73      # NOTE: This
5f80: 20 70 72 6f 63 65 64 75 72 65 20 6d 75 73 74 20   procedure must 
5f90: 72 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20  return non-zero 
5fa0: 6f 6e 6c 79 20 69 66 20 74 68 65 20 53 51 4c 69  only if the SQLi
5fb0: 74 65 20 6e 61 74 69 76 65 0d 0a 20 20 20 20 20  te native..     
5fc0: 20 23 20 20 20 20 20 20 20 6c 69 62 72 61 72 79   #       library
5fd0: 20 61 6e 64 20 74 68 65 20 53 79 73 74 65 6d 2e   and the System.
5fe0: 44 61 74 61 2e 53 51 4c 69 74 65 20 6d 61 6e 61  Data.SQLite mana
5ff0: 67 65 64 20 61 73 73 65 6d 62 6c 79 20 61 72 65  ged assembly are
6000: 20 6c 6f 61 64 65 64 0d 0a 20 20 20 20 20 20 23   loaded..      #
6010: 20 20 20 20 20 20 20 61 6e 64 20 72 65 61 64 79         and ready
6020: 20 66 6f 72 20 75 73 65 20 62 79 20 74 68 65 20   for use by the 
6030: 74 65 73 74 20 73 75 69 74 65 2e 20 20 43 75 72  test suite.  Cur
6040: 72 65 6e 74 6c 79 2c 20 74 68 69 73 20 70 72 6f  rently, this pro
6050: 63 65 64 75 72 65 0d 0a 20 20 20 20 20 20 23 20  cedure..      # 
6060: 20 20 20 20 20 20 73 68 6f 75 6c 64 20 62 65 20        should be 
6070: 63 61 6c 6c 65 64 20 6f 6e 6c 79 20 61 66 74 65  called only afte
6080: 72 20 74 68 65 20 5b 74 72 79 4c 6f 61 64 41 73  r the [tryLoadAs
6090: 73 65 6d 62 6c 79 5d 20 70 72 6f 63 65 64 75 72  sembly] procedur
60a0: 65 20 68 61 73 0d 0a 20 20 20 20 20 20 23 20 20  e has..      #  
60b0: 20 20 20 20 20 62 65 65 6e 20 63 61 6c 6c 65 64       been called
60c0: 20 74 6f 20 70 72 6f 62 65 20 66 6f 72 20 74 68   to probe for th
60d0: 65 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51  e System.Data.SQ
60e0: 4c 69 74 65 20 6d 61 6e 61 67 65 64 20 61 73 73  Lite managed ass
60f0: 65 6d 62 6c 79 0d 0a 20 20 20 20 20 20 23 20 20  embly..      #  
6100: 20 20 20 20 20 61 6e 64 20 74 68 65 20 5b 63 68       and the [ch
6110: 65 63 6b 46 6f 72 53 51 4c 69 74 65 5d 20 70 72  eckForSQLite] pr
6120: 6f 63 65 64 75 72 65 20 68 61 73 20 62 65 65 6e  ocedure has been
6130: 20 63 61 6c 6c 65 64 20 74 6f 20 70 72 6f 62 65   called to probe
6140: 20 66 6f 72 0d 0a 20 20 20 20 20 20 23 20 20 20   for..      #   
6150: 20 20 20 20 74 68 65 20 53 51 4c 69 74 65 20 6e      the SQLite n
6160: 61 74 69 76 65 20 6c 69 62 72 61 72 79 3b 20 6f  ative library; o
6170: 74 68 65 72 77 69 73 65 2c 20 74 68 69 73 20 70  therwise, this p
6180: 72 6f 63 65 64 75 72 65 20 77 69 6c 6c 20 73 69  rocedure will si
6190: 6d 70 6c 79 0d 0a 20 20 20 20 20 20 23 20 20 20  mply..      #   
61a0: 20 20 20 20 61 6c 77 61 79 73 20 72 65 74 75 72      always retur
61b0: 6e 20 7a 65 72 6f 2e 0d 0a 20 20 20 20 20 20 23  n zero...      #
61c0: 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b  ..      return [
61d0: 65 78 70 72 20 7b 5b 68 61 76 65 43 6f 6e 73 74  expr {[haveConst
61e0: 72 61 69 6e 74 20 53 79 73 74 65 6d 2e 44 61 74  raint System.Dat
61f0: 61 2e 53 51 4c 69 74 65 5d 20 26 26 20 5c 0d 0a  a.SQLite] && \..
6200: 20 20 20 20 20 20 20 20 20 20 5b 68 61 76 65 43            [haveC
6210: 6f 6e 73 74 72 61 69 6e 74 20 53 51 4c 69 74 65  onstraint SQLite
6220: 5d 7d 5d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20  ]}]..    }..... 
6230: 20 20 20 70 72 6f 63 20 63 68 65 63 6b 46 6f 72     proc checkFor
6240: 53 51 4c 69 74 65 20 7b 20 63 68 61 6e 6e 65 6c  SQLite { channel
6250: 20 7d 20 7b 0d 0a 20 20 20 20 20 20 74 70 75 74   } {..      tput
6260: 73 20 24 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d  s $channel "----
6270: 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 63 6f   checking for co
6280: 72 65 20 53 51 4c 69 74 65 20 6c 69 62 72 61 72  re SQLite librar
6290: 79 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 20 20  y... "....      
62a0: 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20  if {[catch {..  
62b0: 20 20 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65              obje
62c0: 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73  ct invoke -flags
62d0: 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 53 79 73 74   +NonPublic Syst
62e0: 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 53  em.Data.SQLite.S
62f0: 51 4c 69 74 65 33 20 5c 0d 0a 20 20 20 20 20 20  QLite3 \..      
6300: 20 20 20 20 20 20 20 20 53 51 4c 69 74 65 56 65          SQLiteVe
6310: 72 73 69 6f 6e 7d 20 76 65 72 73 69 6f 6e 5d 20  rsion} version] 
6320: 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  == 0} then {..  
6330: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
6340: 20 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74   # NOTE: Attempt
6350: 20 74 6f 20 71 75 65 72 79 20 74 68 65 20 46 6f   to query the Fo
6360: 73 73 69 6c 20 73 6f 75 72 63 65 20 69 64 65 6e  ssil source iden
6370: 74 69 66 69 65 72 20 66 6f 72 20 74 68 65 20 53  tifier for the S
6380: 51 4c 69 74 65 0d 0a 20 20 20 20 20 20 20 20 23  QLite..        #
6390: 20 20 20 20 20 20 20 63 6f 72 65 20 6c 69 62 72         core libr
63a0: 61 72 79 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  ary...        #.
63b0: 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61  .        if {[ca
63c0: 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  tch {..         
63d0: 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e         object in
63e0: 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e  voke -flags +Non
63f0: 50 75 62 6c 69 63 20 53 79 73 74 65 6d 2e 44 61  Public System.Da
6400: 74 61 2e 53 51 4c 69 74 65 2e 53 51 4c 69 74 65  ta.SQLite.SQLite
6410: 33 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  3 \..           
6420: 20 20 20 20 20 53 51 4c 69 74 65 53 6f 75 72 63       SQLiteSourc
6430: 65 49 64 7d 20 73 6f 75 72 63 65 49 64 5d 7d 20  eId} sourceId]} 
6440: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
6450: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23    #..          #
6460: 20 4e 4f 54 45 3a 20 57 65 20 66 61 69 6c 65 64   NOTE: We failed
6470: 20 74 6f 20 71 75 65 72 79 20 74 68 65 20 46 6f   to query the Fo
6480: 73 73 69 6c 20 73 6f 75 72 63 65 20 69 64 65 6e  ssil source iden
6490: 74 69 66 69 65 72 2e 0d 0a 20 20 20 20 20 20 20  tifier...       
64a0: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
64b0: 73 65 74 20 73 6f 75 72 63 65 49 64 20 75 6e 6b  set sourceId unk
64c0: 6e 6f 77 6e 0d 0a 20 20 20 20 20 20 20 20 7d 0d  nown..        }.
64d0: 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
64e0: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 59 65        # NOTE: Ye
64f0: 73 2c 20 74 68 65 20 53 51 4c 69 74 65 20 63 6f  s, the SQLite co
6500: 72 65 20 6c 69 62 72 61 72 79 20 61 70 70 65 61  re library appea
6510: 72 73 20 74 6f 20 62 65 20 61 76 61 69 6c 61 62  rs to be availab
6520: 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  le...        #..
6530: 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74          addConst
6540: 72 61 69 6e 74 20 53 51 4c 69 74 65 0d 0a 0d 0a  raint SQLite....
6550: 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
6560: 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
6570: 67 73 20 22 79 65 73 20 28 22 20 24 76 65 72 73  gs "yes (" $vers
6580: 69 6f 6e 20 22 20 22 20 24 73 6f 75 72 63 65 49  ion " " $sourceI
6590: 64 20 22 29 5c 6e 22 5d 0d 0a 20 20 20 20 20 20  d ")\n"]..      
65a0: 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
65b0: 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
65c0: 20 6e 6f 5c 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a   no\n..      }..
65d0: 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
65e0: 6f 63 20 63 68 65 63 6b 46 6f 72 53 51 4c 69 74  oc checkForSQLit
65f0: 65 44 65 66 69 6e 65 43 6f 6e 73 74 61 6e 74 20  eDefineConstant 
6600: 7b 20 63 68 61 6e 6e 65 6c 20 6e 61 6d 65 20 7d  { channel name }
6610: 20 7b 0d 0a 20 20 20 20 20 20 74 70 75 74 73 20   {..      tputs 
6620: 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  $channel [append
6630: 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
6640: 20 20 22 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e 67    "---- checking
6650: 20 66 6f 72 20 53 79 73 74 65 6d 2e 44 61 74 61   for System.Data
6660: 2e 53 51 4c 69 74 65 20 64 65 66 69 6e 65 20 63  .SQLite define c
6670: 6f 6e 73 74 61 6e 74 20 5c 22 22 20 24 6e 61 6d  onstant \"" $nam
6680: 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 22  e \..          "
6690: 5c 22 2e 2e 2e 20 22 5d 0d 0a 0d 0a 20 20 20 20  \"... "]....    
66a0: 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a    if {[catch {..
66b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 62                ob
66c0: 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61  ject invoke -fla
66d0: 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 53 79  gs +NonPublic Sy
66e0: 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
66f0: 2e 53 51 4c 69 74 65 33 20 5c 0d 0a 20 20 20 20  .SQLite3 \..    
6700: 20 20 20 20 20 20 20 20 20 20 44 65 66 69 6e 65            Define
6710: 43 6f 6e 73 74 61 6e 74 73 7d 20 64 65 66 69 6e  Constants} defin
6720: 65 43 6f 6e 73 74 61 6e 74 73 5d 20 3d 3d 20 30  eConstants] == 0
6730: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
6740: 20 20 69 66 20 7b 5b 6c 73 65 61 72 63 68 20 2d    if {[lsearch -
6750: 65 78 61 63 74 20 2d 6e 6f 63 61 73 65 20 24 64  exact -nocase $d
6760: 65 66 69 6e 65 43 6f 6e 73 74 61 6e 74 73 20 24  efineConstants $
6770: 6e 61 6d 65 5d 20 21 3d 20 2d 31 7d 20 74 68 65  name] != -1} the
6780: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 23  n {..          #
6790: 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f  ..          # NO
67a0: 54 45 3a 20 59 65 73 2c 20 74 68 69 73 20 64 65  TE: Yes, this de
67b0: 66 69 6e 65 20 63 6f 6e 73 74 61 6e 74 20 77 61  fine constant wa
67c0: 73 20 65 6e 61 62 6c 65 64 20 77 68 65 6e 20 74  s enabled when t
67d0: 68 65 20 6d 61 6e 61 67 65 64 0d 0a 20 20 20 20  he managed..    
67e0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 61 73        #       as
67f0: 73 65 6d 62 6c 79 20 77 61 73 20 63 6f 6d 70 69  sembly was compi
6800: 6c 65 64 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  led...          
6810: 23 0d 0a 20 20 20 20 20 20 20 20 20 20 61 64 64  #..          add
6820: 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65  Constraint [appe
6830: 6e 64 41 72 67 73 20 64 65 66 69 6e 65 43 6f 6e  ndArgs defineCon
6840: 73 74 61 6e 74 2e 53 79 73 74 65 6d 2e 44 61 74  stant.System.Dat
6850: 61 2e 53 51 4c 69 74 65 2e 20 24 6e 61 6d 65 5d  a.SQLite. $name]
6860: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70  ....          tp
6870: 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 79 65 73  uts $channel yes
6880: 5c 6e 0d 0a 20 20 20 20 20 20 20 20 7d 20 65 6c  \n..        } el
6890: 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  se {..          
68a0: 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 6e  tputs $channel n
68b0: 6f 5c 6e 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  o\n..        }..
68c0: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
68d0: 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
68e0: 68 61 6e 6e 65 6c 20 65 72 72 6f 72 5c 6e 0d 0a  hannel error\n..
68f0: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a        }..    }..
6900: 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74 44  ...    proc getD
6910: 61 74 65 54 69 6d 65 46 6f 72 6d 61 74 20 7b 7d  ateTimeFormat {}
6920: 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20   {..      #..   
6930: 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 69 73 20     # NOTE: This 
6940: 70 72 6f 63 65 64 75 72 65 20 73 69 6d 70 6c 79  procedure simply
6950: 20 72 65 74 75 72 6e 73 20 74 68 65 20 22 64 65   returns the "de
6960: 66 61 75 6c 74 22 20 44 61 74 65 54 69 6d 65 20  fault" DateTime 
6970: 66 6f 72 6d 61 74 20 75 73 65 64 0d 0a 20 20 20  format used..   
6980: 20 20 20 23 20 20 20 20 20 20 20 62 79 20 74 68     #       by th
6990: 65 20 74 65 73 74 20 73 75 69 74 65 2e 0d 0a 20  e test suite... 
69a0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66       #..      if
69b0: 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a   {[info exists :
69c0: 3a 64 61 74 65 74 69 6d 65 5f 66 6f 72 6d 61 74  :datetime_format
69d0: 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20  ] && \..        
69e0: 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68    [string length
69f0: 20 24 3a 3a 64 61 74 65 74 69 6d 65 5f 66 6f 72   $::datetime_for
6a00: 6d 61 74 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b  mat] > 0} then {
6a10: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
6a20: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 52 65 74       # NOTE: Ret
6a30: 75 72 6e 20 74 68 65 20 6d 61 6e 75 61 6c 6c 79  urn the manually
6a40: 20 6f 76 65 72 72 69 64 64 65 6e 20 76 61 6c 75   overridden valu
6a50: 65 20 66 6f 72 20 74 68 65 20 44 61 74 65 54 69  e for the DateTi
6a60: 6d 65 20 66 6f 72 6d 61 74 2e 0d 0a 20 20 20 20  me format...    
6a70: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72      #..        r
6a80: 65 74 75 72 6e 20 24 3a 3a 64 61 74 65 74 69 6d  eturn $::datetim
6a90: 65 5f 66 6f 72 6d 61 74 0d 0a 20 20 20 20 20 20  e_format..      
6aa0: 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
6ab0: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
6ac0: 4f 54 45 3a 20 52 65 74 75 72 6e 20 61 6e 20 49  OTE: Return an I
6ad0: 53 4f 38 36 30 31 20 44 61 74 65 54 69 6d 65 20  SO8601 DateTime 
6ae0: 66 6f 72 6d 61 74 20 63 6f 6d 70 61 74 69 62 6c  format compatibl
6af0: 65 20 77 69 74 68 20 53 51 4c 69 74 65 2c 0d 0a  e with SQLite,..
6b00: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
6b10: 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
6b20: 74 65 2c 20 61 6e 64 20 73 75 69 74 61 62 6c 65  te, and suitable
6b30: 20 66 6f 72 20 72 6f 75 6e 64 2d 74 72 69 70 70   for round-tripp
6b40: 69 6e 67 20 77 69 74 68 20 74 68 65 0d 0a 20 20  ing with the..  
6b50: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 44 61        #       Da
6b60: 74 65 54 69 6d 65 20 63 6c 61 73 73 20 6f 66 20  teTime class of 
6b70: 74 68 65 20 66 72 61 6d 65 77 6f 72 6b 2e 20 20  the framework.  
6b80: 49 66 20 74 68 69 73 20 76 61 6c 75 65 20 69 73  If this value is
6b90: 20 63 68 61 6e 67 65 64 2c 0d 0a 20 20 20 20 20   changed,..     
6ba0: 20 20 20 23 20 20 20 20 20 20 20 76 61 72 69 6f     #       vario
6bb0: 75 73 20 74 65 73 74 73 20 6d 61 79 20 66 61 69  us tests may fai
6bc0: 6c 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  l...        #.. 
6bd0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 22 79         return "y
6be0: 79 79 79 2d 4d 4d 2d 64 64 20 48 48 3a 6d 6d 3a  yyy-MM-dd HH:mm:
6bf0: 73 73 2e 46 46 46 46 46 46 46 4b 22 0d 0a 20 20  ss.FFFFFFFK"..  
6c00: 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d      }..    }....
6c10: 0a 20 20 20 20 70 72 6f 63 20 65 6e 75 6d 65 72  .    proc enumer
6c20: 61 62 6c 65 54 6f 4c 69 73 74 20 7b 20 65 6e 75  ableToList { enu
6c30: 6d 65 72 61 62 6c 65 20 7d 20 7b 0d 0a 20 20 20  merable } {..   
6c40: 20 20 20 73 65 74 20 72 65 73 75 6c 74 20 5b 6c     set result [l
6c50: 69 73 74 5d 0d 0a 0d 0a 20 20 20 20 20 20 69 66  ist]....      if
6c60: 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68   {[string length
6c70: 20 24 65 6e 75 6d 65 72 61 62 6c 65 5d 20 3d 3d   $enumerable] ==
6c80: 20 30 20 7c 7c 20 24 65 6e 75 6d 65 72 61 62 6c   0 || $enumerabl
6c90: 65 20 65 71 20 22 6e 75 6c 6c 22 7d 20 74 68 65  e eq "null"} the
6ca0: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 72 65 74  n {..        ret
6cb0: 75 72 6e 20 24 72 65 73 75 6c 74 0d 0a 20 20 20  urn $result..   
6cc0: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 6f 62     }....      ob
6cd0: 6a 65 63 74 20 66 6f 72 65 61 63 68 20 2d 61 6c  ject foreach -al
6ce0: 69 61 73 20 69 74 65 6d 20 24 65 6e 75 6d 65 72  ias item $enumer
6cf0: 61 62 6c 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  able {..        
6d00: 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67  if {[string leng
6d10: 74 68 20 24 69 74 65 6d 5d 20 3e 20 30 7d 20 74  th $item] > 0} t
6d20: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
6d30: 20 6c 61 70 70 65 6e 64 20 72 65 73 75 6c 74 20   lappend result 
6d40: 5b 24 69 74 65 6d 20 54 6f 53 74 72 69 6e 67 5d  [$item ToString]
6d50: 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20  ..        }..   
6d60: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65     }....      re
6d70: 74 75 72 6e 20 24 72 65 73 75 6c 74 0d 0a 20 20  turn $result..  
6d80: 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
6d90: 20 63 61 74 63 68 41 6e 64 52 65 74 75 72 6e 20   catchAndReturn 
6da0: 7b 20 73 63 72 69 70 74 20 7b 73 74 61 63 6b 54  { script {stackT
6db0: 72 61 63 65 20 66 61 6c 73 65 7d 20 7b 73 74 72  race false} {str
6dc0: 69 63 74 20 74 72 75 65 7d 20 7d 20 7b 0d 0a 20  ict true} } {.. 
6dd0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
6de0: 4e 4f 54 45 3a 20 45 76 61 6c 75 61 74 65 20 74  NOTE: Evaluate t
6df0: 68 65 20 73 63 72 69 70 74 20 70 72 6f 76 69 64  he script provid
6e00: 65 64 20 62 79 20 6f 75 72 20 63 61 6c 6c 65 72  ed by our caller
6e10: 20 69 6e 20 74 68 65 69 72 20 63 6f 6e 74 65 78   in their contex
6e20: 74 2c 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  t,..      #     
6e30: 20 20 63 61 70 74 75 72 69 6e 67 20 62 6f 74 68    capturing both
6e40: 20 74 68 65 20 72 65 73 75 6c 74 20 61 6e 64 20   the result and 
6e50: 74 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65 2e  the return code.
6e60: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
6e70: 20 73 65 74 20 63 6f 64 65 20 5b 63 61 74 63 68   set code [catch
6e80: 20 7b 75 70 6c 65 76 65 6c 20 31 20 24 73 63 72   {uplevel 1 $scr
6e90: 69 70 74 7d 20 72 65 73 75 6c 74 5d 0d 0a 0d 0a  ipt} result]....
6ea0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
6eb0: 20 4e 4f 54 45 3a 20 44 69 64 20 74 68 65 20 73   NOTE: Did the s
6ec0: 63 72 69 70 74 20 70 72 6f 76 69 64 65 64 20 62  cript provided b
6ed0: 79 20 6f 75 72 20 63 61 6c 6c 65 72 20 4e 4f 54  y our caller NOT
6ee0: 20 72 61 69 73 65 20 61 6e 20 65 72 72 6f 72 3f   raise an error?
6ef0: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
6f00: 20 69 66 20 7b 24 73 74 72 69 63 74 20 26 26 20   if {$strict && 
6f10: 24 63 6f 64 65 20 3d 3d 20 30 20 7c 7c 20 21 24  $code == 0 || !$
6f20: 73 74 72 69 63 74 20 26 26 20 24 63 6f 64 65 20  strict && $code 
6f30: 21 3d 20 31 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  != 1} then {..  
6f40: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
6f50: 20 23 20 4e 4f 54 45 3a 20 53 75 63 63 65 73 73   # NOTE: Success
6f60: 2e 20 20 52 65 74 75 72 6e 20 61 20 6c 69 73 74  .  Return a list
6f70: 20 77 69 74 68 20 74 68 65 20 72 65 74 75 72 6e   with the return
6f80: 20 63 6f 64 65 20 61 6e 64 20 74 68 65 20 72 65   code and the re
6f90: 73 75 6c 74 2e 0d 0a 20 20 20 20 20 20 20 20 23  sult...        #
6fa0: 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ..        return
6fb0: 20 5b 6c 69 73 74 20 24 63 6f 64 65 20 24 72 65   [list $code $re
6fc0: 73 75 6c 74 5d 0d 0a 20 20 20 20 20 20 7d 20 65  sult]..      } e
6fd0: 6c 73 65 69 66 20 7b 24 73 74 61 63 6b 54 72 61  lseif {$stackTra
6fe0: 63 65 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  ce} then {..    
6ff0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
7000: 20 4e 4f 54 45 3a 20 46 61 69 6c 75 72 65 2e 20   NOTE: Failure. 
7010: 20 4f 75 72 20 63 61 6c 6c 65 72 20 77 61 6e 74   Our caller want
7020: 73 20 61 20 66 75 6c 6c 20 73 74 61 63 6b 20 74  s a full stack t
7030: 72 61 63 65 20 28 69 66 20 61 70 70 6c 69 63 61  race (if applica
7040: 62 6c 65 29 2c 0d 0a 20 20 20 20 20 20 20 20 23  ble),..        #
7050: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 61 20         return a 
7060: 6c 69 73 74 20 77 69 74 68 20 74 68 65 20 72 65  list with the re
7070: 74 75 72 6e 20 63 6f 64 65 20 61 6e 64 20 74 68  turn code and th
7080: 65 20 72 65 73 75 6c 74 20 76 65 72 62 61 74 69  e result verbati
7090: 6d 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  m...        #.. 
70a0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b 6c         return [l
70b0: 69 73 74 20 24 63 6f 64 65 20 24 72 65 73 75 6c  ist $code $resul
70c0: 74 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65  t]..      } else
70d0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20   {..        #.. 
70e0: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 46         # NOTE: F
70f0: 61 69 6c 75 72 65 2e 20 20 4f 75 72 20 63 61 6c  ailure.  Our cal
7100: 6c 65 72 20 64 6f 65 73 20 6e 6f 74 20 77 61 6e  ler does not wan
7110: 74 20 61 20 66 75 6c 6c 20 73 74 61 63 6b 20 74  t a full stack t
7120: 72 61 63 65 20 28 69 66 0d 0a 20 20 20 20 20 20  race (if..      
7130: 20 20 23 20 20 20 20 20 20 20 61 70 70 6c 69 63    #       applic
7140: 61 62 6c 65 29 2c 20 72 65 74 75 72 6e 20 61 20  able), return a 
7150: 6c 69 73 74 20 77 69 74 68 20 74 68 65 20 72 65  list with the re
7160: 74 75 72 6e 20 63 6f 64 65 2c 20 74 68 65 20 65  turn code, the e
7170: 72 72 6f 72 0d 0a 20 20 20 20 20 20 20 20 23 20  rror..        # 
7180: 20 20 20 20 20 20 63 6f 64 65 20 66 6f 72 20 74        code for t
7190: 68 65 20 69 6e 74 65 72 70 72 65 74 65 72 2c 20  he interpreter, 
71a0: 61 6e 64 20 74 68 65 20 65 72 72 6f 72 20 6d 65  and the error me
71b0: 73 73 61 67 65 20 75 70 20 74 6f 20 74 68 65 0d  ssage up to the.
71c0: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
71d0: 20 70 6f 69 6e 74 20 77 68 65 72 65 20 74 68 65   point where the
71e0: 20 73 74 61 63 6b 20 74 72 61 63 65 20 73 68 6f   stack trace sho
71f0: 75 6c 64 20 73 74 61 72 74 2e 0d 0a 20 20 20 20  uld start...    
7200: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 73      #..        s
7210: 65 74 20 69 6e 64 65 78 20 5b 73 74 72 69 6e 67  et index [string
7220: 20 66 69 72 73 74 20 22 20 20 20 61 74 20 22 20   first "   at " 
7230: 24 72 65 73 75 6c 74 5d 3b 20 23 20 48 41 43 4b  $result]; # HACK
7240: 3a 20 52 65 6c 69 61 62 6c 65 3f 0d 0a 0d 0a 20  : Reliable?.... 
7250: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b 6c         return [l
7260: 69 73 74 20 24 63 6f 64 65 20 24 3a 3a 65 72 72  ist $code $::err
7270: 6f 72 43 6f 64 65 20 5b 65 78 70 72 20 7b 24 69  orCode [expr {$i
7280: 6e 64 65 78 20 21 3d 20 2d 31 20 3f 20 5c 0d 0a  ndex != -1 ? \..
7290: 20 20 20 20 20 20 20 20 20 20 20 20 5b 73 74 72              [str
72a0: 69 6e 67 20 74 72 69 6d 20 5b 73 74 72 69 6e 67  ing trim [string
72b0: 20 72 61 6e 67 65 20 24 72 65 73 75 6c 74 20 30   range $result 0
72c0: 20 24 69 6e 64 65 78 5d 5d 20 3a 20 24 72 65 73   $index]] : $res
72d0: 75 6c 74 7d 5d 5d 0d 0a 20 20 20 20 20 20 7d 0d  ult}]]..      }.
72e0: 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70  .    }.....    p
72f0: 72 6f 63 20 63 6f 6d 70 69 6c 65 43 53 68 61 72  roc compileCShar
7300: 70 57 69 74 68 20 7b 0d 0a 20 20 20 20 20 20 20  pWith {..       
7310: 20 20 20 20 20 74 65 78 74 20 6d 65 6d 6f 72 79       text memory
7320: 20 73 79 6d 62 6f 6c 73 20 73 74 72 69 63 74 20   symbols strict 
7330: 72 65 73 75 6c 74 73 56 61 72 4e 61 6d 65 20 65  resultsVarName e
7340: 72 72 6f 72 73 56 61 72 4e 61 6d 65 20 66 69 6c  rrorsVarName fil
7350: 65 4e 61 6d 65 73 0d 0a 20 20 20 20 20 20 20 20  eNames..        
7360: 20 20 20 20 61 72 67 73 20 7d 20 7b 0d 0a 20 20      args } {..  
7370: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
7380: 4f 54 45 3a 20 53 69 6e 63 65 20 77 65 20 61 72  OTE: Since we ar
7390: 65 20 67 6f 69 6e 67 20 74 6f 20 75 73 65 20 74  e going to use t
73a0: 68 69 73 20 6d 65 74 68 6f 64 20 6e 61 6d 65 20  his method name 
73b0: 61 20 6c 6f 74 2c 20 61 73 73 69 67 6e 20 69 74  a lot, assign it
73c0: 20 74 6f 20 61 0d 0a 20 20 20 20 20 20 23 20 20   to a..      #  
73d0: 20 20 20 20 20 76 61 72 69 61 62 6c 65 20 66 69       variable fi
73e0: 72 73 74 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  rst...      #.. 
73f0: 20 20 20 20 20 73 65 74 20 61 64 64 20 52 65 66       set add Ref
7400: 65 72 65 6e 63 65 64 41 73 73 65 6d 62 6c 69 65  erencedAssemblie
7410: 73 2e 41 64 64 0d 0a 0d 0a 20 20 20 20 20 20 23  s.Add....      #
7420: 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
7430: 43 72 65 61 74 65 20 74 68 65 20 62 61 73 65 20  Create the base 
7440: 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 76 61 6c 75  command to evalu
7450: 61 74 65 20 61 6e 64 20 61 64 64 20 74 68 65 20  ate and add the 
7460: 70 72 6f 70 65 72 74 79 20 73 65 74 74 69 6e 67  property setting
7470: 73 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  s..      #      
7480: 20 74 68 61 74 20 61 72 65 20 61 6c 6d 6f 73 74   that are almost
7490: 20 61 6c 77 61 79 73 20 6e 65 65 64 65 64 20 62   always needed b
74a0: 79 20 6f 75 72 20 75 6e 69 74 20 74 65 73 74 73  y our unit tests
74b0: 20 28 69 2e 65 2e 20 74 68 65 20 53 79 73 74 65   (i.e. the Syste
74c0: 6d 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  m..      #      
74d0: 20 61 6e 64 20 53 79 73 74 65 6d 2e 44 61 74 61   and System.Data
74e0: 20 61 73 73 65 6d 62 6c 79 20 72 65 66 65 72 65   assembly refere
74f0: 6e 63 65 73 29 2e 0d 0a 20 20 20 20 20 20 23 0d  nces)...      #.
7500: 0a 20 20 20 20 20 20 73 65 74 20 63 6f 6d 6d 61  .      set comma
7510: 6e 64 20 5b 6c 69 73 74 20 63 6f 6d 70 69 6c 65  nd [list compile
7520: 43 53 68 61 72 70 20 24 74 65 78 74 20 24 6d 65  CSharp $text $me
7530: 6d 6f 72 79 20 24 73 79 6d 62 6f 6c 73 20 24 73  mory $symbols $s
7540: 74 72 69 63 74 20 72 65 73 75 6c 74 73 20 5c 0d  trict results \.
7550: 0a 20 20 20 20 20 20 20 20 20 20 65 72 72 6f 72  .          error
7560: 73 20 24 61 64 64 20 53 79 73 74 65 6d 2e 64 6c  s $add System.dl
7570: 6c 20 24 61 64 64 20 53 79 73 74 65 6d 2e 44 61  l $add System.Da
7580: 74 61 2e 64 6c 6c 20 24 61 64 64 20 53 79 73 74  ta.dll $add Syst
7590: 65 6d 2e 58 6d 6c 2e 64 6c 6c 5d 0d 0a 0d 0a 20  em.Xml.dll].... 
75a0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
75b0: 4e 4f 54 45 3a 20 41 64 64 20 61 6c 6c 20 74 68  NOTE: Add all th
75c0: 65 20 70 72 6f 76 69 64 65 64 20 66 69 6c 65 20  e provided file 
75d0: 6e 61 6d 65 73 20 61 73 20 61 73 73 65 6d 62 6c  names as assembl
75e0: 79 20 72 65 66 65 72 65 6e 63 65 73 2e 0d 0a 20  y references... 
75f0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 66 6f       #..      fo
7600: 72 65 61 63 68 20 66 69 6c 65 4e 61 6d 65 20 24  reach fileName $
7610: 66 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20  fileNames {..   
7620: 20 20 20 20 20 6c 61 70 70 65 6e 64 20 63 6f 6d       lappend com
7630: 6d 61 6e 64 20 24 61 64 64 20 5b 67 65 74 42 69  mand $add [getBi
7640: 6e 61 72 79 46 69 6c 65 4e 61 6d 65 20 24 66 69  naryFileName $fi
7650: 6c 65 4e 61 6d 65 5d 0d 0a 20 20 20 20 20 20 7d  leName]..      }
7660: 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  ....      #..   
7670: 20 20 20 23 20 4e 4f 54 45 3a 20 41 64 64 20 74     # NOTE: Add t
7680: 68 65 20 65 78 74 72 61 20 61 72 67 75 6d 65 6e  he extra argumen
7690: 74 73 2c 20 69 66 20 61 6e 79 2c 20 74 6f 20 74  ts, if any, to t
76a0: 68 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 76  he command to ev
76b0: 61 6c 75 61 74 65 2e 0d 0a 20 20 20 20 20 20 23  aluate...      #
76c0: 0d 0a 20 20 20 20 20 20 65 76 61 6c 20 6c 61 70  ..      eval lap
76d0: 70 65 6e 64 20 63 6f 6d 6d 61 6e 64 20 24 61 72  pend command $ar
76e0: 67 73 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20  gs....      #.. 
76f0: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 6c 69       # NOTE: Ali
7700: 61 73 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 20  as the compiler 
7710: 6c 6f 63 61 6c 20 72 65 73 75 6c 74 73 20 61 6e  local results an
7720: 64 20 65 72 72 6f 72 73 20 76 61 72 69 61 62 6c  d errors variabl
7730: 65 73 20 74 6f 20 74 68 65 0d 0a 20 20 20 20 20  es to the..     
7740: 20 23 20 20 20 20 20 20 20 76 61 72 69 61 62 6c   #       variabl
7750: 65 20 6e 61 6d 65 73 20 70 72 6f 76 69 64 65 64  e names provided
7760: 20 62 79 20 6f 75 72 20 63 61 6c 6c 65 72 2e 0d   by our caller..
7770: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
7780: 75 70 76 61 72 20 31 20 24 72 65 73 75 6c 74 73  upvar 1 $results
7790: 56 61 72 4e 61 6d 65 20 72 65 73 75 6c 74 73 0d  VarName results.
77a0: 0a 20 20 20 20 20 20 75 70 76 61 72 20 31 20 24  .      upvar 1 $
77b0: 65 72 72 6f 72 73 56 61 72 4e 61 6d 65 20 65 72  errorsVarName er
77c0: 72 6f 72 73 0d 0a 0d 0a 20 20 20 20 20 20 23 0d  rors....      #.
77d0: 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 45  .      # NOTE: E
77e0: 76 61 6c 75 61 74 65 20 74 68 65 20 63 6f 6e 73  valuate the cons
77f0: 74 72 75 63 74 65 64 20 5b 63 6f 6d 70 69 6c 65  tructed [compile
7800: 43 53 68 61 72 70 5d 20 63 6f 6d 6d 61 6e 64 20  CSharp] command 
7810: 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65 0d 0a  and return the..
7820: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 72 65        #       re
7830: 73 75 6c 74 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  sult...      #..
7840: 20 20 20 20 20 20 65 76 61 6c 20 24 63 6f 6d 6d        eval $comm
7850: 61 6e 64 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20  and..    }..... 
7860: 20 20 20 70 72 6f 63 20 69 73 4d 65 6d 6f 72 79     proc isMemory
7870: 44 62 20 7b 20 66 69 6c 65 4e 61 6d 65 20 7d 20  Db { fileName } 
7880: 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  {..      #..    
7890: 20 20 23 20 4e 4f 54 45 3a 20 49 73 20 74 68 65    # NOTE: Is the
78a0: 20 73 70 65 63 69 66 69 65 64 20 64 61 74 61 62   specified datab
78b0: 61 73 65 20 66 69 6c 65 20 6e 61 6d 65 20 72 65  ase file name re
78c0: 61 6c 6c 79 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  ally an in-memor
78d0: 79 20 64 61 74 61 62 61 73 65 3f 0d 0a 20 20 20  y database?..   
78e0: 20 20 20 23 0d 0a 20 20 20 20 20 20 72 65 74 75     #..      retu
78f0: 72 6e 20 5b 65 78 70 72 20 7b 24 66 69 6c 65 4e  rn [expr {$fileN
7900: 61 6d 65 20 65 71 20 22 3a 6d 65 6d 6f 72 79 3a  ame eq ":memory:
7910: 22 20 7c 7c 20 5c 0d 0a 20 20 20 20 20 20 20 20  " || \..        
7920: 20 20 5b 73 74 72 69 6e 67 20 72 61 6e 67 65 20    [string range 
7930: 24 66 69 6c 65 4e 61 6d 65 20 30 20 31 32 5d 20  $fileName 0 12] 
7940: 65 71 20 22 66 69 6c 65 3a 3a 6d 65 6d 6f 72 79  eq "file::memory
7950: 3a 22 7d 5d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a  :"}]..    }.....
7960: 20 20 20 20 70 72 6f 63 20 65 78 65 63 75 74 65      proc execute
7970: 53 71 6c 20 7b 20 73 71 6c 20 7b 65 78 65 63 75  Sql { sql {execu
7980: 74 65 20 6e 6f 6e 65 7d 20 7b 66 69 6c 65 4e 61  te none} {fileNa
7990: 6d 65 20 22 22 7d 20 7d 20 7b 0d 0a 20 20 20 20  me ""} } {..    
79a0: 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65    if {[string le
79b0: 6e 67 74 68 20 24 66 69 6c 65 4e 61 6d 65 5d 20  ngth $fileName] 
79c0: 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 73 65 74 20  == 0} then {set 
79d0: 66 69 6c 65 4e 61 6d 65 20 3a 6d 65 6d 6f 72 79  fileName :memory
79e0: 3a 7d 0d 0a 20 20 20 20 20 20 73 65 74 75 70 44  :}..      setupD
79f0: 62 20 24 66 69 6c 65 4e 61 6d 65 20 22 22 20 22  b $fileName "" "
7a00: 22 20 22 22 20 22 22 20 22 22 20 66 61 6c 73 65  " "" "" "" false
7a10: 20 66 61 6c 73 65 20 66 61 6c 73 65 20 66 61 6c   false false fal
7a20: 73 65 20 6d 65 6d 44 62 0d 0a 0d 0a 20 20 20 20  se memDb....    
7a30: 20 20 74 72 79 20 7b 0d 0a 20 20 20 20 20 20 20    try {..       
7a40: 20 72 65 74 75 72 6e 20 5b 73 71 6c 20 65 78 65   return [sql exe
7a50: 63 75 74 65 20 2d 65 78 65 63 75 74 65 20 24 65  cute -execute $e
7a60: 78 65 63 75 74 65 20 24 6d 65 6d 44 62 20 24 73  xecute $memDb $s
7a70: 71 6c 5d 0d 0a 20 20 20 20 20 20 7d 20 66 69 6e  ql]..      } fin
7a80: 61 6c 6c 79 20 7b 0d 0a 20 20 20 20 20 20 20 20  ally {..        
7a90: 63 6c 65 61 6e 75 70 44 62 20 24 66 69 6c 65 4e  cleanupDb $fileN
7aa0: 61 6d 65 20 6d 65 6d 44 62 20 66 61 6c 73 65 20  ame memDb false 
7ab0: 66 61 6c 73 65 0d 0a 20 20 20 20 20 20 7d 0d 0a  false..      }..
7ac0: 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
7ad0: 6f 63 20 73 65 74 75 70 44 62 20 7b 0d 0a 20 20  oc setupDb {..  
7ae0: 20 20 20 20 20 20 20 20 20 20 66 69 6c 65 4e 61            fileNa
7af0: 6d 65 20 7b 6d 6f 64 65 20 22 22 7d 20 7b 64 61  me {mode ""} {da
7b00: 74 65 54 69 6d 65 46 6f 72 6d 61 74 20 22 22 7d  teTimeFormat ""}
7b10: 20 7b 64 61 74 65 54 69 6d 65 4b 69 6e 64 20 22   {dateTimeKind "
7b20: 22 7d 20 7b 66 6c 61 67 73 20 22 22 7d 0d 0a 20  "} {flags ""}.. 
7b30: 20 20 20 20 20 20 20 20 20 20 20 7b 65 78 74 72             {extr
7b40: 61 20 22 22 7d 20 7b 71 75 61 6c 69 66 79 20 74  a ""} {qualify t
7b50: 72 75 65 7d 20 7b 64 65 6c 65 74 65 20 74 72 75  rue} {delete tru
7b60: 65 7d 20 7b 75 72 69 20 66 61 6c 73 65 7d 0d 0a  e} {uri false}..
7b70: 20 20 20 20 20 20 20 20 20 20 20 20 7b 74 65 6d              {tem
7b80: 70 6f 72 61 72 79 20 74 72 75 65 7d 20 7b 76 61  porary true} {va
7b90: 72 4e 61 6d 65 20 64 62 7d 20 7d 20 7b 0d 0a 20  rName db} } {.. 
7ba0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
7bb0: 4e 4f 54 45 3a 20 46 69 72 73 74 2c 20 73 65 65  NOTE: First, see
7bc0: 20 69 66 20 6f 75 72 20 63 61 6c 6c 65 72 20 68   if our caller h
7bd0: 61 73 20 72 65 71 75 65 73 74 65 64 20 61 6e 20  as requested an 
7be0: 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
7bf0: 73 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  se...      #..  
7c00: 20 20 20 20 73 65 74 20 69 73 4d 65 6d 6f 72 79      set isMemory
7c10: 20 5b 69 73 4d 65 6d 6f 72 79 44 62 20 24 66 69   [isMemoryDb $fi
7c20: 6c 65 4e 61 6d 65 5d 0d 0a 0d 0a 20 20 20 20 20  leName]....     
7c30: 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
7c40: 3a 20 46 6f 72 20 6e 6f 77 2c 20 61 6c 6c 20 74  : For now, all t
7c50: 65 73 74 20 64 61 74 61 62 61 73 65 73 20 75 73  est databases us
7c60: 65 64 20 62 79 20 74 68 65 20 74 65 73 74 20 73  ed by the test s
7c70: 75 69 74 65 20 61 72 65 20 70 6c 61 63 65 64 20  uite are placed 
7c80: 69 6e 74 6f 0d 0a 20 20 20 20 20 20 23 20 20 20  into..      #   
7c90: 20 20 20 20 74 68 65 20 74 65 6d 70 6f 72 61 72      the temporar
7ca0: 79 20 64 69 72 65 63 74 6f 72 79 2e 20 20 45 61  y directory.  Ea
7cb0: 63 68 20 64 61 74 61 62 61 73 65 20 75 73 65 64  ch database used
7cc0: 20 62 79 20 61 20 74 65 73 74 20 73 68 6f 75 6c   by a test shoul
7cd0: 64 20 62 65 0d 0a 20 20 20 20 20 20 23 20 20 20  d be..      #   
7ce0: 20 20 20 20 63 6c 65 61 6e 65 64 20 75 70 20 62      cleaned up b
7cf0: 79 20 74 68 61 74 20 74 65 73 74 20 75 73 69 6e  y that test usin
7d00: 67 20 74 68 65 20 22 63 6c 65 61 6e 75 70 44 62  g the "cleanupDb
7d10: 22 20 70 72 6f 63 65 64 75 72 65 2c 20 62 65 6c  " procedure, bel
7d20: 6f 77 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  ow...      #..  
7d30: 20 20 20 20 69 66 20 7b 21 24 69 73 4d 65 6d 6f      if {!$isMemo
7d40: 72 79 20 26 26 20 24 71 75 61 6c 69 66 79 7d 20  ry && $qualify} 
7d50: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
7d60: 73 65 74 20 66 69 6c 65 4e 61 6d 65 20 5b 66 69  set fileName [fi
7d70: 6c 65 20 6a 6f 69 6e 20 5b 67 65 74 44 61 74 61  le join [getData
7d80: 62 61 73 65 44 69 72 65 63 74 6f 72 79 5d 20 5b  baseDirectory] [
7d90: 66 69 6c 65 20 74 61 69 6c 20 24 66 69 6c 65 4e  file tail $fileN
7da0: 61 6d 65 5d 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a  ame]]..      }..
7db0: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
7dc0: 20 23 20 4e 4f 54 45 3a 20 42 79 20 64 65 66 61   # NOTE: By defa
7dd0: 75 6c 74 2c 20 64 65 6c 65 74 65 20 61 6e 79 20  ult, delete any 
7de0: 70 72 65 2d 65 78 69 73 74 69 6e 67 20 64 61 74  pre-existing dat
7df0: 61 62 61 73 65 20 77 69 74 68 20 74 68 65 20 73  abase with the s
7e00: 61 6d 65 20 66 69 6c 65 0d 0a 20 20 20 20 20 20  ame file..      
7e10: 23 20 20 20 20 20 20 20 6e 61 6d 65 20 69 66 20  #       name if 
7e20: 69 74 20 63 75 72 72 65 6e 74 6c 79 20 65 78 69  it currently exi
7e30: 73 74 73 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  sts...      #.. 
7e40: 20 20 20 20 20 69 66 20 7b 21 24 69 73 4d 65 6d       if {!$isMem
7e50: 6f 72 79 20 26 26 20 24 64 65 6c 65 74 65 20 26  ory && $delete &
7e60: 26 20 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24  & [file exists $
7e70: 66 69 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20  fileName]} then 
7e80: 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
7e90: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 74        # NOTE: At
7ea0: 74 65 6d 70 74 20 74 6f 20 64 65 6c 65 74 65 20  tempt to delete 
7eb0: 61 6e 79 20 70 72 65 2d 65 78 69 73 74 69 6e 67  any pre-existing
7ec0: 20 64 61 74 61 62 61 73 65 20 77 69 74 68 20 74   database with t
7ed0: 68 65 20 73 61 6d 65 20 66 69 6c 65 0d 0a 20 20  he same file..  
7ee0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 6e 61        #       na
7ef0: 6d 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  me...        #..
7f00: 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74          if {[cat
7f10: 63 68 20 7b 66 69 6c 65 20 64 65 6c 65 74 65 20  ch {file delete 
7f20: 24 66 69 6c 65 4e 61 6d 65 7d 20 65 72 72 6f 72  $fileName} error
7f30: 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
7f40: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
7f50: 20 20 23 20 4e 4f 54 45 3a 20 57 65 20 73 6f 6d    # NOTE: We som
7f60: 65 68 6f 77 20 66 61 69 6c 65 64 20 74 6f 20 64  ehow failed to d
7f70: 65 6c 65 74 65 20 74 68 65 20 66 69 6c 65 2c 20  elete the file, 
7f80: 72 65 70 6f 72 74 20 77 68 79 2e 0d 0a 20 20 20  report why...   
7f90: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
7fa0: 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
7fb0: 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e  t_channel [appen
7fc0: 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
7fd0: 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52         "==== WAR
7fe0: 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20 74 6f 20  NING: failed to 
7ff0: 64 65 6c 65 74 65 20 64 61 74 61 62 61 73 65 20  delete database 
8000: 66 69 6c 65 20 5c 22 22 20 24 66 69 6c 65 4e 61  file \"" $fileNa
8010: 6d 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  me \..          
8020: 20 20 20 20 22 5c 22 20 64 75 72 69 6e 67 20 73      "\" during s
8030: 65 74 75 70 2c 20 65 72 72 6f 72 3a 20 22 20 5c  etup, error: " \
8040: 6e 5c 74 20 24 65 72 72 6f 72 20 5c 6e 5d 0d 0a  n\t $error \n]..
8050: 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
8060: 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20   }....      #.. 
8070: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 52 65 66       # NOTE: Ref
8080: 65 72 20 74 6f 20 74 68 65 20 73 70 65 63 69 66  er to the specif
8090: 69 65 64 20 76 61 72 69 61 62 6c 65 20 28 65 2e  ied variable (e.
80a0: 67 2e 20 22 64 62 22 29 20 69 6e 20 74 68 65 20  g. "db") in the 
80b0: 63 6f 6e 74 65 78 74 20 6f 66 20 6f 75 72 0d 0a  context of our..
80c0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63 61        #       ca
80d0: 6c 6c 65 72 2e 20 20 54 68 65 20 68 61 6e 64 6c  ller.  The handl
80e0: 65 20 74 6f 20 74 68 65 20 6f 70 65 6e 65 64 20  e to the opened 
80f0: 64 61 74 61 62 61 73 65 20 77 69 6c 6c 20 62 65  database will be
8100: 20 73 74 6f 72 65 64 20 74 68 65 72 65 2e 0d 0a   stored there...
8110: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 75        #..      u
8120: 70 76 61 72 20 31 20 24 76 61 72 4e 61 6d 65 20  pvar 1 $varName 
8130: 64 62 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20  db....      #.. 
8140: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 74 61       # NOTE: Sta
8150: 72 74 20 62 75 69 6c 64 69 6e 67 20 74 68 65 20  rt building the 
8160: 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 74 72 69 6e  connection strin
8170: 67 2e 20 20 54 68 65 20 6f 6e 6c 79 20 72 65 71  g.  The only req
8180: 75 69 72 65 64 20 70 6f 72 74 69 6f 6e 0d 0a 20  uired portion.. 
8190: 20 20 20 20 20 23 20 20 20 20 20 20 20 6f 66 20       #       of 
81a0: 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73  the connection s
81b0: 74 72 69 6e 67 20 69 73 20 74 68 65 20 64 61 74  tring is the dat
81c0: 61 20 73 6f 75 72 63 65 2c 20 77 68 69 63 68 20  a source, which 
81d0: 63 6f 6e 74 61 69 6e 73 20 74 68 65 0d 0a 20 20  contains the..  
81e0: 20 20 20 20 23 20 20 20 20 20 20 20 64 61 74 61      #       data
81f0: 62 61 73 65 20 66 69 6c 65 20 6e 61 6d 65 20 69  base file name i
8200: 74 73 65 6c 66 2e 20 20 49 66 20 6f 75 72 20 63  tself.  If our c
8210: 61 6c 6c 65 72 20 77 61 6e 74 73 20 74 6f 20 75  aller wants to u
8220: 73 65 20 61 20 55 52 49 20 61 73 0d 0a 20 20 20  se a URI as..   
8230: 20 20 20 23 20 20 20 20 20 20 20 74 68 65 20 64     #       the d
8240: 61 74 61 20 73 6f 75 72 63 65 2c 20 75 73 65 20  ata source, use 
8250: 74 68 65 20 46 75 6c 6c 55 72 69 20 63 6f 6e 6e  the FullUri conn
8260: 65 63 74 69 6f 6e 20 73 74 72 69 6e 67 20 70 72  ection string pr
8270: 6f 70 65 72 74 79 20 74 6f 0d 0a 20 20 20 20 20  operty to..     
8280: 20 23 20 20 20 20 20 20 20 70 72 65 76 65 6e 74   #       prevent
8290: 20 74 68 65 20 64 61 74 61 20 73 6f 75 72 63 65   the data source
82a0: 20 73 74 72 69 6e 67 20 66 72 6f 6d 20 62 65 69   string from bei
82b0: 6e 67 20 6d 61 6e 67 6c 65 64 2e 0d 0a 20 20 20  ng mangled...   
82c0: 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
82d0: 24 75 72 69 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  $uri} then {..  
82e0: 20 20 20 20 20 20 73 65 74 20 63 6f 6e 6e 65 63        set connec
82f0: 74 69 6f 6e 20 7b 46 75 6c 6c 55 72 69 3d 24 7b  tion {FullUri=${
8300: 66 69 6c 65 4e 61 6d 65 7d 7d 0d 0a 20 20 20 20  fileName}}..    
8310: 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
8320: 20 20 20 20 73 65 74 20 63 6f 6e 6e 65 63 74 69      set connecti
8330: 6f 6e 20 7b 44 61 74 61 20 53 6f 75 72 63 65 3d  on {Data Source=
8340: 24 7b 66 69 6c 65 4e 61 6d 65 7d 7d 0d 0a 20 20  ${fileName}}..  
8350: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23      }....      #
8360: 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
8370: 53 69 6e 63 65 20 74 68 69 73 20 70 72 6f 63 65  Since this proce
8380: 64 75 72 65 20 68 61 73 20 6e 6f 20 73 70 65 63  dure has no spec
8390: 69 61 6c 20 6b 6e 6f 77 6c 65 64 67 65 20 6f 66  ial knowledge of
83a0: 20 77 68 61 74 20 74 68 65 20 64 65 66 61 75 6c   what the defaul
83b0: 74 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  t..      #      
83c0: 20 73 65 74 74 69 6e 67 20 69 73 20 66 6f 72 20   setting is for 
83d0: 74 68 65 20 54 6f 46 75 6c 6c 50 61 74 68 20 63  the ToFullPath c
83e0: 6f 6e 6e 65 63 74 69 6f 6e 20 73 74 72 69 6e 67  onnection string
83f0: 20 70 72 6f 70 65 72 79 2c 20 61 6c 77 61 79 73   propery, always
8400: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
8410: 61 64 64 20 74 68 65 20 76 61 6c 75 65 20 77 65  add the value we
8420: 20 6b 6e 6f 77 20 61 62 6f 75 74 20 74 6f 20 74   know about to t
8430: 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 74  he connection st
8440: 72 69 6e 67 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  ring...      #..
8450: 20 20 20 20 20 20 61 70 70 65 6e 64 20 63 6f 6e        append con
8460: 6e 65 63 74 69 6f 6e 20 7b 3b 54 6f 46 75 6c 6c  nection {;ToFull
8470: 50 61 74 68 3d 24 7b 71 75 61 6c 69 66 79 7d 7d  Path=${qualify}}
8480: 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  ....      #..   
8490: 20 20 20 23 20 4e 4f 54 45 3a 20 49 66 20 6f 75     # NOTE: If ou
84a0: 72 20 63 61 6c 6c 65 72 20 73 70 65 63 69 66 69  r caller specifi
84b0: 65 64 20 61 20 6a 6f 75 72 6e 61 6c 20 6d 6f 64  ed a journal mod
84c0: 65 2c 20 61 64 64 20 74 68 65 20 6e 65 63 65 73  e, add the neces
84d0: 73 61 72 79 20 70 6f 72 74 69 6f 6e 0d 0a 20 20  sary portion..  
84e0: 20 20 20 20 23 20 20 20 20 20 20 20 6f 66 20 74      #       of t
84f0: 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 74  he connection st
8500: 72 69 6e 67 20 6e 6f 77 2e 0d 0a 20 20 20 20 20  ring now...     
8510: 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 73   #..      if {[s
8520: 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 6d 6f  tring length $mo
8530: 64 65 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d  de] > 0} then {.
8540: 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 20  .        append 
8550: 63 6f 6e 6e 65 63 74 69 6f 6e 20 7b 3b 4a 6f 75  connection {;Jou
8560: 72 6e 61 6c 20 4d 6f 64 65 3d 24 7b 6d 6f 64 65  rnal Mode=${mode
8570: 7d 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  }}..      }.... 
8580: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
8590: 4e 4f 54 45 3a 20 49 66 20 6f 75 72 20 63 61 6c  NOTE: If our cal
85a0: 6c 65 72 20 73 70 65 63 69 66 69 65 64 20 61 20  ler specified a 
85b0: 44 61 74 65 54 69 6d 65 20 66 6f 72 6d 61 74 2c  DateTime format,
85c0: 20 61 64 64 20 74 68 65 20 6e 65 63 65 73 73 61   add the necessa
85d0: 72 79 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  ry..      #     
85e0: 20 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65    portion of the
85f0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 74 72 69   connection stri
8600: 6e 67 20 6e 6f 77 2e 0d 0a 20 20 20 20 20 20 23  ng now...      #
8610: 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72  ..      if {[str
8620: 69 6e 67 20 6c 65 6e 67 74 68 20 24 64 61 74 65  ing length $date
8630: 54 69 6d 65 46 6f 72 6d 61 74 5d 20 3e 20 30 7d  TimeFormat] > 0}
8640: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
8650: 20 61 70 70 65 6e 64 20 63 6f 6e 6e 65 63 74 69   append connecti
8660: 6f 6e 20 7b 3b 44 61 74 65 54 69 6d 65 46 6f 72  on {;DateTimeFor
8670: 6d 61 74 3d 24 7b 64 61 74 65 54 69 6d 65 46 6f  mat=${dateTimeFo
8680: 72 6d 61 74 7d 7d 0d 0a 20 20 20 20 20 20 7d 0d  rmat}}..      }.
8690: 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
86a0: 20 20 23 20 4e 4f 54 45 3a 20 49 66 20 6f 75 72    # NOTE: If our
86b0: 20 63 61 6c 6c 65 72 20 73 70 65 63 69 66 69 65   caller specifie
86c0: 64 20 61 20 44 61 74 65 54 69 6d 65 4b 69 6e 64  d a DateTimeKind
86d0: 2c 20 61 64 64 20 74 68 65 20 6e 65 63 65 73 73  , add the necess
86e0: 61 72 79 20 70 6f 72 74 69 6f 6e 0d 0a 20 20 20  ary portion..   
86f0: 20 20 20 23 20 20 20 20 20 20 20 6f 66 20 74 68     #       of th
8700: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 74 72  e connection str
8710: 69 6e 67 20 6e 6f 77 2e 0d 0a 20 20 20 20 20 20  ing now...      
8720: 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 73 74  #..      if {[st
8730: 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 64 61 74  ring length $dat
8740: 65 54 69 6d 65 4b 69 6e 64 5d 20 3e 20 30 7d 20  eTimeKind] > 0} 
8750: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
8760: 61 70 70 65 6e 64 20 63 6f 6e 6e 65 63 74 69 6f  append connectio
8770: 6e 20 7b 3b 44 61 74 65 54 69 6d 65 4b 69 6e 64  n {;DateTimeKind
8780: 3d 24 7b 64 61 74 65 54 69 6d 65 4b 69 6e 64 7d  =${dateTimeKind}
8790: 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  }..      }....  
87a0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
87b0: 4f 54 45 3a 20 49 66 20 74 68 65 72 65 20 61 72  OTE: If there ar
87c0: 65 20 61 6e 79 20 67 6c 6f 62 61 6c 20 28 70 65  e any global (pe
87d0: 72 20 74 65 73 74 20 72 75 6e 29 20 63 6f 6e 6e  r test run) conn
87e0: 65 63 74 69 6f 6e 20 66 6c 61 67 73 20 63 75 72  ection flags cur
87f0: 72 65 6e 74 6c 79 0d 0a 20 20 20 20 20 20 23 20  rently..      # 
8800: 20 20 20 20 20 20 73 65 74 2c 20 75 73 65 20 74        set, use t
8810: 68 65 6d 20 6e 6f 77 20 28 69 2e 65 2e 20 62 79  hem now (i.e. by
8820: 20 63 6f 6d 62 69 6e 69 6e 67 20 74 68 65 6d 20   combining them 
8830: 77 69 74 68 20 74 68 65 20 6f 6e 65 73 20 66 6f  with the ones fo
8840: 72 20 74 68 69 73 0d 0a 20 20 20 20 20 20 23 20  r this..      # 
8850: 20 20 20 20 20 20 63 6f 6e 6e 65 63 74 69 6f 6e        connection
8860: 29 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  )...      #..   
8870: 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69     if {[info exi
8880: 73 74 73 20 3a 3a 63 6f 6e 6e 65 63 74 69 6f 6e  sts ::connection
8890: 5f 66 6c 61 67 73 5d 20 26 26 20 5c 0d 0a 20 20  _flags] && \..  
88a0: 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20          [string 
88b0: 6c 65 6e 67 74 68 20 24 3a 3a 63 6f 6e 6e 65 63  length $::connec
88c0: 74 69 6f 6e 5f 66 6c 61 67 73 5d 20 3e 20 30 7d  tion_flags] > 0}
88d0: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
88e0: 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
88f0: 54 45 3a 20 53 68 6f 77 20 28 61 6e 64 20 6c 6f  TE: Show (and lo
8900: 67 29 20 74 68 61 74 20 77 65 20 64 65 74 65 63  g) that we detec
8910: 74 65 64 20 73 6f 6d 65 20 67 6c 6f 62 61 6c 20  ted some global 
8920: 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 6c 61 67 73  connection flags
8930: 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
8940: 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
8950: 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70  est_channel [app
8960: 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
8970: 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 67 6c 6f         "---- glo
8980: 62 61 6c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66  bal connection f
8990: 6c 61 67 73 20 64 65 74 65 63 74 65 64 3a 20 22  lags detected: "
89a0: 20 24 3a 3a 63 6f 6e 6e 65 63 74 69 6f 6e 5f 66   $::connection_f
89b0: 6c 61 67 73 20 5c 6e 5d 0d 0a 0d 0a 20 20 20 20  lags \n]....    
89c0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
89d0: 20 4e 4f 54 45 3a 20 43 6f 6d 62 69 6e 65 20 61   NOTE: Combine a
89e0: 6e 64 2f 6f 72 20 72 65 70 6c 61 63 65 20 74 68  nd/or replace th
89f0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 6c 61  e connection fla
8a00: 67 73 20 61 6e 64 20 74 68 65 6e 20 73 68 6f 77  gs and then show
8a10: 20 74 68 65 0d 0a 20 20 20 20 20 20 20 20 23 20   the..        # 
8a20: 20 20 20 20 20 20 6e 65 77 20 76 61 6c 75 65 2e        new value.
8a30: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
8a40: 20 20 20 20 20 73 65 74 20 66 6c 61 67 73 20 5b       set flags [
8a50: 63 6f 6d 62 69 6e 65 46 6c 61 67 73 20 24 66 6c  combineFlags $fl
8a60: 61 67 73 20 24 3a 3a 63 6f 6e 6e 65 63 74 69 6f  ags $::connectio
8a70: 6e 5f 66 6c 61 67 73 5d 0d 0a 0d 0a 20 20 20 20  n_flags]....    
8a80: 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
8a90: 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e  t_channel [appen
8aa0: 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
8ab0: 20 20 20 20 20 22 2d 2d 2d 2d 20 63 6f 6d 62 69       "---- combi
8ac0: 6e 65 64 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66  ned connection f
8ad0: 6c 61 67 73 20 61 72 65 3a 20 22 20 24 66 6c 61  lags are: " $fla
8ae0: 67 73 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d 0d  gs \n]..      }.
8af0: 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
8b00: 20 20 23 20 4e 4f 54 45 3a 20 49 66 20 6f 75 72    # NOTE: If our
8b10: 20 63 61 6c 6c 65 72 20 73 70 65 63 69 66 69 65   caller specifie
8b20: 64 20 61 20 53 51 4c 69 74 65 43 6f 6e 6e 65 63  d a SQLiteConnec
8b30: 74 69 6f 6e 46 6c 61 67 73 2c 20 61 64 64 20 74  tionFlags, add t
8b40: 68 65 20 6e 65 63 65 73 73 61 72 79 0d 0a 20 20  he necessary..  
8b50: 20 20 20 20 23 20 20 20 20 20 20 20 70 6f 72 74      #       port
8b60: 69 6f 6e 20 6f 66 20 74 68 65 20 63 6f 6e 6e 65  ion of the conne
8b70: 63 74 69 6f 6e 20 73 74 72 69 6e 67 20 6e 6f 77  ction string now
8b80: 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
8b90: 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65    if {[string le
8ba0: 6e 67 74 68 20 24 66 6c 61 67 73 5d 20 3e 20 30  ngth $flags] > 0
8bb0: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
8bc0: 20 20 61 70 70 65 6e 64 20 63 6f 6e 6e 65 63 74    append connect
8bd0: 69 6f 6e 20 7b 3b 46 6c 61 67 73 3d 24 7b 66 6c  ion {;Flags=${fl
8be0: 61 67 73 7d 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a  ags}}..      }..
8bf0: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
8c00: 20 23 20 4e 4f 54 45 3a 20 49 66 20 6f 75 72 20   # NOTE: If our 
8c10: 63 61 6c 6c 65 72 20 73 70 65 63 69 66 69 65 64  caller specified
8c20: 20 61 6e 20 65 78 74 72 61 20 70 61 79 6c 6f 61   an extra payloa
8c30: 64 20 74 6f 20 74 68 65 20 63 6f 6e 6e 65 63 74  d to the connect
8c40: 69 6f 6e 20 73 74 72 69 6e 67 2c 0d 0a 20 20 20  ion string,..   
8c50: 20 20 20 23 20 20 20 20 20 20 20 61 70 70 65 6e     #       appen
8c60: 64 20 69 74 20 6e 6f 77 2e 0d 0a 20 20 20 20 20  d it now...     
8c70: 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 73   #..      if {[s
8c80: 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 65 78  tring length $ex
8c90: 74 72 61 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b  tra] > 0} then {
8ca0: 0d 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e 64  ..        append
8cb0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 5c 3b 20 24   connection \; $
8cc0: 65 78 74 72 61 0d 0a 20 20 20 20 20 20 7d 0d 0a  extra..      }..
8cd0: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
8ce0: 20 23 20 4e 4f 54 45 3a 20 4f 70 65 6e 20 74 68   # NOTE: Open th
8cf0: 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
8d00: 63 74 69 6f 6e 20 6e 6f 77 2c 20 70 6c 61 63 69  ction now, placi
8d10: 6e 67 20 74 68 65 20 6f 70 61 71 75 65 20 68 61  ng the opaque ha
8d20: 6e 64 6c 65 20 76 61 6c 75 65 0d 0a 20 20 20 20  ndle value..    
8d30: 20 20 23 20 20 20 20 20 20 20 69 6e 74 6f 20 74    #       into t
8d40: 68 65 20 76 61 72 69 61 62 6c 65 20 73 70 65 63  he variable spec
8d50: 69 66 69 65 64 20 62 79 20 6f 75 72 20 63 61 6c  ified by our cal
8d60: 6c 65 72 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ler...      #.. 
8d70: 20 20 20 20 20 73 65 74 20 64 62 20 5b 73 71 6c       set db [sql
8d80: 20 6f 70 65 6e 20 2d 74 79 70 65 20 53 51 4c 69   open -type SQLi
8d90: 74 65 20 5b 73 75 62 73 74 20 24 63 6f 6e 6e 65  te [subst $conne
8da0: 63 74 69 6f 6e 5d 5d 0d 0a 0d 0a 20 20 20 20 20  ction]]....     
8db0: 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
8dc0: 3a 20 43 6f 6e 66 69 67 75 72 65 20 74 68 65 20  : Configure the 
8dd0: 74 65 6d 70 6f 72 61 72 79 20 64 69 72 65 63 74  temporary direct
8de0: 6f 72 79 20 66 6f 72 20 74 68 65 20 6e 65 77 6c  ory for the newl
8df0: 79 20 6f 70 65 6e 65 64 20 64 61 74 61 62 61 73  y opened databas
8e00: 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  e..      #      
8e10: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6e 6f 77 20   connection now 
8e20: 75 6e 6c 65 73 73 20 6f 75 72 20 63 61 6c 6c 65  unless our calle
8e30: 72 20 66 6f 72 62 69 64 73 20 69 74 2e 0d 0a 20  r forbids it... 
8e40: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66       #..      if
8e50: 20 7b 24 74 65 6d 70 6f 72 61 72 79 20 26 26 20   {$temporary && 
8e60: 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  ![info exists ::
8e70: 6e 6f 28 73 65 74 54 65 6d 70 6f 72 61 72 79 44  no(setTemporaryD
8e80: 69 72 65 63 74 6f 72 79 29 5d 7d 20 74 68 65 6e  irectory)]} then
8e90: 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 71 6c 20   {..        sql 
8ea0: 65 78 65 63 75 74 65 20 24 64 62 20 5b 61 70 70  execute $db [app
8eb0: 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
8ec0: 20 20 20 20 20 20 20 22 50 52 41 47 4d 41 20 74         "PRAGMA t
8ed0: 65 6d 70 5f 73 74 6f 72 65 5f 64 69 72 65 63 74  emp_store_direct
8ee0: 6f 72 79 20 3d 20 5c 22 22 20 5b 67 65 74 54 65  ory = \"" [getTe
8ef0: 6d 70 6f 72 61 72 79 44 69 72 65 63 74 6f 72 79  mporaryDirectory
8f00: 5d 20 5c 22 5c 3b 5d 0d 0a 20 20 20 20 20 20 7d  ] \"\;]..      }
8f10: 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  ....      #..   
8f20: 20 20 20 23 20 4e 4f 54 45 3a 20 41 6c 77 61 79     # NOTE: Alway
8f30: 73 20 72 65 74 75 72 6e 20 74 68 65 20 63 6f 6e  s return the con
8f40: 6e 65 63 74 69 6f 6e 20 68 61 6e 64 6c 65 20 75  nection handle u
8f50: 70 6f 6e 20 73 75 63 63 65 73 73 2e 0d 0a 20 20  pon success...  
8f60: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 72 65 74      #..      ret
8f70: 75 72 6e 20 24 64 62 0d 0a 20 20 20 20 7d 0d 0a  urn $db..    }..
8f80: 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74 44  ...    proc getD
8f90: 62 43 6f 6e 6e 65 63 74 69 6f 6e 20 7b 20 7b 76  bConnection { {v
8fa0: 61 72 4e 61 6d 65 20 64 62 7d 20 7d 20 7b 0d 0a  arName db} } {..
8fb0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
8fc0: 20 4e 4f 54 45 3a 20 52 65 66 65 72 20 74 6f 20   NOTE: Refer to 
8fd0: 74 68 65 20 73 70 65 63 69 66 69 65 64 20 76 61  the specified va
8fe0: 72 69 61 62 6c 65 20 28 65 2e 67 2e 20 22 64 62  riable (e.g. "db
8ff0: 22 29 20 69 6e 20 74 68 65 20 63 6f 6e 74 65 78  ") in the contex
9000: 74 20 6f 66 20 6f 75 72 0d 0a 20 20 20 20 20 20  t of our..      
9010: 23 20 20 20 20 20 20 20 63 61 6c 6c 65 72 2e 20  #       caller. 
9020: 20 54 68 65 20 68 61 6e 64 6c 65 20 74 6f 20 74   The handle to t
9030: 68 65 20 64 61 74 61 62 61 73 65 20 70 72 65 76  he database prev
9040: 69 6f 75 73 6c 79 20 6f 70 65 6e 65 64 20 62 79  iously opened by
9050: 20 5b 73 65 74 75 70 44 62 5d 0d 0a 20 20 20 20   [setupDb]..    
9060: 20 20 23 20 20 20 20 20 20 20 73 68 6f 75 6c 64    #       should
9070: 20 62 65 20 73 74 6f 72 65 64 20 74 68 65 72 65   be stored there
9080: 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
9090: 20 20 75 70 76 61 72 20 31 20 24 76 61 72 4e 61    upvar 1 $varNa
90a0: 6d 65 20 64 62 0d 0a 0d 0a 20 20 20 20 20 20 23  me db....      #
90b0: 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
90c0: 54 68 69 73 20 72 65 74 75 72 6e 73 20 74 68 65  This returns the
90d0: 20 41 44 4f 2e 4e 45 54 20 49 44 62 43 6f 6e 6e   ADO.NET IDbConn
90e0: 65 63 74 69 6f 6e 20 6f 62 6a 65 63 74 20 69 6e  ection object in
90f0: 73 74 61 6e 63 65 20 66 6f 72 20 74 68 65 0d 0a  stance for the..
9100: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 73 70        #       sp
9110: 65 63 69 66 69 65 64 20 64 61 74 61 62 73 65 20  ecified databse 
9120: 68 61 6e 64 6c 65 2e 20 20 53 69 6e 63 65 20 67  handle.  Since g
9130: 65 74 74 69 6e 67 20 74 68 69 73 20 6f 62 6a 65  etting this obje
9140: 63 74 20 72 65 6c 69 65 73 20 75 70 6f 6e 0d 0a  ct relies upon..
9150: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 45 61        #       Ea
9160: 67 6c 65 20 69 6e 74 65 72 6e 61 6c 73 2c 20 67  gle internals, g
9170: 72 65 61 74 20 63 61 72 65 20 73 68 6f 75 6c 64  reat care should
9180: 20 62 65 20 74 61 6b 65 6e 20 74 6f 20 61 76 6f   be taken to avo
9190: 69 64 20 64 69 73 70 6f 73 69 6e 67 20 6f 66 0d  id disposing of.
91a0: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74  .      #       t
91b0: 68 69 73 20 6f 62 6a 65 63 74 20 6f 72 20 6f 74  his object or ot
91c0: 68 65 72 77 69 73 65 20 70 75 74 74 69 6e 67 20  herwise putting 
91d0: 69 74 20 69 6e 74 6f 20 61 6e 20 69 6e 76 61 6c  it into an inval
91e0: 69 64 20 73 74 61 74 65 2e 0d 0a 20 20 20 20 20  id state...     
91f0: 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69   #..      if {[i
9200: 6e 66 6f 20 65 78 69 73 74 73 20 64 62 5d 7d 20  nfo exists db]} 
9210: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
9220: 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20  if {[catch {..  
9230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 62                ob
9240: 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61  ject invoke -fla
9250: 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 2d 6f  gs +NonPublic -o
9260: 62 6a 65 63 74 66 6c 61 67 73 20 2b 4e 6f 44 69  bjectflags +NoDi
9270: 73 70 6f 73 65 20 5c 0d 0a 20 20 20 20 20 20 20  spose \..       
9280: 20 20 20 20 20 20 20 20 20 2d 61 6c 69 61 73 20           -alias 
9290: 49 6e 74 65 72 70 72 65 74 65 72 2e 47 65 74 41  Interpreter.GetA
92a0: 63 74 69 76 65 2e 63 6f 6e 6e 65 63 74 69 6f 6e  ctive.connection
92b0: 73 20 49 74 65 6d 20 24 64 62 7d 20 5c 0d 0a 20  s Item $db} \.. 
92c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
92d0: 65 73 75 6c 74 5d 20 3d 3d 20 30 7d 20 74 68 65  esult] == 0} the
92e0: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 23  n {..          #
92f0: 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f  ..          # NO
9300: 54 45 3a 20 53 75 63 63 65 73 73 2c 20 72 65 74  TE: Success, ret
9310: 75 72 6e 20 74 68 65 20 6f 70 61 71 75 65 20 6f  urn the opaque o
9320: 62 6a 65 63 74 20 68 61 6e 64 6c 65 2e 0d 0a 20  bject handle... 
9330: 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
9340: 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 72 65        return $re
9350: 73 75 6c 74 0d 0a 20 20 20 20 20 20 20 20 7d 20  sult..        } 
9360: 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
9370: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23    #..          #
9380: 20 4e 4f 54 45 3a 20 46 61 69 6c 75 72 65 2c 20   NOTE: Failure, 
9390: 72 65 70 6f 72 74 20 77 68 79 2e 0d 0a 20 20 20  report why...   
93a0: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
93b0: 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
93c0: 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e  t_channel [appen
93d0: 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
93e0: 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52         "==== WAR
93f0: 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20 74 6f 20  NING: failed to 
9400: 67 65 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68  get connection h
9410: 61 6e 64 6c 65 20 66 6f 72 20 64 61 74 61 62 61  andle for databa
9420: 73 65 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20  se \"" \..      
9430: 20 20 20 20 20 20 20 20 24 64 62 20 22 5c 22 2c          $db "\",
9440: 20 65 72 72 6f 72 3a 20 22 20 5c 6e 5c 74 20 24   error: " \n\t $
9450: 72 65 73 75 6c 74 20 5c 6e 5d 0d 0a 20 20 20 20  result \n]..    
9460: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a      }..      }..
9470: 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
9480: 6f 63 20 66 72 65 65 44 62 43 6f 6e 6e 65 63 74  oc freeDbConnect
9490: 69 6f 6e 20 7b 20 7b 76 61 72 4e 61 6d 65 20 63  ion { {varName c
94a0: 6f 6e 6e 65 63 74 69 6f 6e 7d 20 7d 20 7b 0d 0a  onnection} } {..
94b0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
94c0: 20 4e 4f 54 45 3a 20 52 65 66 65 72 20 74 6f 20   NOTE: Refer to 
94d0: 74 68 65 20 73 70 65 63 69 66 69 65 64 20 76 61  the specified va
94e0: 72 69 61 62 6c 65 20 28 65 2e 67 2e 20 22 63 6f  riable (e.g. "co
94f0: 6e 6e 65 63 74 69 6f 6e 22 29 20 69 6e 20 74 68  nnection") in th
9500: 65 20 63 6f 6e 74 65 78 74 0d 0a 20 20 20 20 20  e context..     
9510: 20 23 20 20 20 20 20 20 20 6f 66 20 6f 75 72 20   #       of our 
9520: 63 61 6c 6c 65 72 2e 20 20 54 68 65 20 6f 70 61  caller.  The opa
9530: 71 75 65 20 6f 62 6a 65 63 74 20 68 61 6e 64 6c  que object handl
9540: 65 20 66 6f 72 20 61 6e 20 41 44 4f 2e 4e 45 54  e for an ADO.NET
9550: 20 63 6f 6e 6e 65 63 74 69 6f 6e 0d 0a 20 20 20   connection..   
9560: 20 20 20 23 20 20 20 20 20 20 20 70 72 65 76 69     #       previ
9570: 6f 75 73 6c 79 20 72 65 74 75 72 6e 65 64 20 62  ously returned b
9580: 79 20 5b 67 65 74 44 62 43 6f 6e 6e 65 63 74 69  y [getDbConnecti
9590: 6f 6e 5d 20 73 68 6f 75 6c 64 20 62 65 20 73 74  on] should be st
95a0: 6f 72 65 64 20 74 68 65 72 65 2e 0d 0a 20 20 20  ored there...   
95b0: 20 20 20 23 0d 0a 20 20 20 20 20 20 75 70 76 61     #..      upva
95c0: 72 20 31 20 24 76 61 72 4e 61 6d 65 20 63 6f 6e  r 1 $varName con
95d0: 6e 65 63 74 69 6f 6e 0d 0a 0d 0a 20 20 20 20 20  nection....     
95e0: 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
95f0: 3a 20 41 74 74 65 6d 70 74 20 74 6f 20 72 65 6d  : Attempt to rem
9600: 6f 76 65 20 74 68 65 20 6f 70 61 71 75 65 20 6f  ove the opaque o
9610: 62 6a 65 63 74 20 68 61 6e 64 6c 65 20 66 72 6f  bject handle fro
9620: 6d 20 74 68 65 20 69 6e 74 65 72 70 72 65 74 65  m the interprete
9630: 72 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  r..      #      
9640: 20 6e 6f 77 2e 20 20 54 68 69 73 20 5b 6f 62 6a   now.  This [obj
9650: 65 63 74 20 64 69 73 70 6f 73 65 5d 20 63 61 6c  ect dispose] cal
9660: 6c 20 77 69 6c 6c 20 6e 6f 74 20 61 63 74 75 61  l will not actua
9670: 6c 6c 79 20 64 69 73 70 6f 73 65 20 6f 66 20 74  lly dispose of t
9680: 68 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  he..      #     
9690: 20 20 75 6e 64 65 72 6c 79 69 6e 67 20 6f 62 6a    underlying obj
96a0: 65 63 74 20 62 65 63 61 75 73 65 20 74 68 65 20  ect because the 
96b0: 2b 4e 6f 44 69 73 70 6f 73 65 20 66 6c 61 67 20  +NoDispose flag 
96c0: 77 61 73 20 73 65 74 20 6f 6e 20 69 74 20 64 75  was set on it du
96d0: 72 69 6e 67 0d 0a 20 20 20 20 20 20 23 20 20 20  ring..      #   
96e0: 20 20 20 20 63 72 65 61 74 69 6f 6e 20 6f 66 20      creation of 
96f0: 74 68 65 20 6f 70 61 71 75 65 20 6f 62 6a 65 63  the opaque objec
9700: 74 20 68 61 6e 64 6c 65 2e 0d 0a 20 20 20 20 20  t handle...     
9710: 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69   #..      if {[i
9720: 6e 66 6f 20 65 78 69 73 74 73 20 63 6f 6e 6e 65  nfo exists conne
9730: 63 74 69 6f 6e 5d 20 26 26 20 5c 0d 0a 20 20 20  ction] && \..   
9740: 20 20 20 20 20 20 20 5b 63 61 74 63 68 20 7b 6f         [catch {o
9750: 62 6a 65 63 74 20 64 69 73 70 6f 73 65 20 24 63  bject dispose $c
9760: 6f 6e 6e 65 63 74 69 6f 6e 7d 20 65 72 72 6f 72  onnection} error
9770: 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
9780: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
9790: 4e 4f 54 45 3a 20 57 65 20 73 6f 6d 65 68 6f 77  NOTE: We somehow
97a0: 20 66 61 69 6c 65 64 20 74 6f 20 72 65 6d 6f 76   failed to remov
97b0: 65 20 74 68 65 20 68 61 6e 64 6c 65 2c 20 72 65  e the handle, re
97c0: 70 6f 72 74 20 77 68 79 2e 0d 0a 20 20 20 20 20  port why...     
97d0: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 74 70     #..        tp
97e0: 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  uts $::test_chan
97f0: 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
9800: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22  \..            "
9810: 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61  ==== WARNING: fa
9820: 69 6c 65 64 20 74 6f 20 72 65 6d 6f 76 65 20 63  iled to remove c
9830: 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 6e 64 6c 65  onnection handle
9840: 20 5c 22 22 20 24 63 6f 6e 6e 65 63 74 69 6f 6e   \"" $connection
9850: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
9860: 22 5c 22 2c 20 65 72 72 6f 72 3a 20 22 20 5c 6e  "\", error: " \n
9870: 5c 74 20 24 65 72 72 6f 72 20 5c 6e 5d 0d 0a 20  \t $error \n].. 
9880: 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c       }..    }...
9890: 0d 0a 20 20 20 20 70 72 6f 63 20 61 64 64 44 62  ..    proc addDb
98a0: 43 6f 6e 6e 65 63 74 69 6f 6e 20 7b 20 63 6f 6e  Connection { con
98b0: 6e 65 63 74 69 6f 6e 20 7b 76 61 72 4e 61 6d 65  nection {varName
98c0: 20 64 62 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20   db} } {..      
98d0: 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
98e0: 20 52 65 66 65 72 20 74 6f 20 74 68 65 20 73 70   Refer to the sp
98f0: 65 63 69 66 69 65 64 20 76 61 72 69 61 62 6c 65  ecified variable
9900: 20 28 65 2e 67 2e 20 22 64 62 22 29 20 69 6e 20   (e.g. "db") in 
9910: 74 68 65 20 63 6f 6e 74 65 78 74 20 6f 66 20 6f  the context of o
9920: 75 72 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  ur..      #     
9930: 20 20 63 61 6c 6c 65 72 2e 0d 0a 20 20 20 20 20    caller...     
9940: 20 23 0d 0a 20 20 20 20 20 20 75 70 76 61 72 20   #..      upvar 
9950: 31 20 24 76 61 72 4e 61 6d 65 20 64 62 0d 0a 0d  1 $varName db...
9960: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
9970: 23 20 4e 4f 54 45 3a 20 43 72 65 61 74 65 20 61  # NOTE: Create a
9980: 20 63 6f 72 72 65 63 74 6c 79 20 66 6f 72 6d 61   correctly forma
9990: 74 74 65 64 20 6e 61 6d 65 20 66 6f 72 20 74 68  tted name for th
99a0: 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
99b0: 63 74 69 6f 6e 20 74 6f 0d 0a 20 20 20 20 20 20  ction to..      
99c0: 23 20 20 20 20 20 20 20 62 65 20 61 64 64 65 64  #       be added
99d0: 20 74 6f 20 74 68 65 20 6c 69 73 74 20 6d 61 6e   to the list man
99e0: 61 67 65 64 20 62 79 20 74 68 65 20 45 61 67 6c  aged by the Eagl
99f0: 65 20 69 6e 74 65 72 70 72 65 74 65 72 2e 0d 0a  e interpreter...
9a00: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 73        #..      s
9a10: 65 74 20 64 62 20 5b 6f 62 6a 65 63 74 20 69 6e  et db [object in
9a20: 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e  voke -flags +Non
9a30: 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20  Public \..      
9a40: 20 20 20 20 45 61 67 6c 65 2e 5f 43 6f 6d 70 6f      Eagle._Compo
9a50: 6e 65 6e 74 73 2e 50 72 69 76 61 74 65 2e 46 6f  nents.Private.Fo
9a60: 72 6d 61 74 4f 70 73 20 44 61 74 61 62 61 73 65  rmatOps Database
9a70: 4f 62 6a 65 63 74 4e 61 6d 65 20 24 63 6f 6e 6e  ObjectName $conn
9a80: 65 63 74 69 6f 6e 20 5c 0d 0a 20 20 20 20 20 20  ection \..      
9a90: 20 20 20 20 53 51 4c 69 74 65 43 6f 6e 6e 65 63      SQLiteConnec
9aa0: 74 69 6f 6e 20 5b 6f 62 6a 65 63 74 20 69 6e 76  tion [object inv
9ab0: 6f 6b 65 20 49 6e 74 65 72 70 72 65 74 65 72 2e  oke Interpreter.
9ac0: 47 65 74 41 63 74 69 76 65 20 4e 65 78 74 49 64  GetActive NextId
9ad0: 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ]]....      #.. 
9ae0: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 64 64       # NOTE: Add
9af0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   the database co
9b00: 6e 6e 65 63 74 69 6f 6e 20 70 72 6f 76 69 64 65  nnection provide
9b10: 64 20 62 79 20 6f 75 72 20 63 61 6c 6c 65 72 20  d by our caller 
9b20: 74 6f 20 74 68 65 20 6c 69 73 74 0d 0a 20 20 20  to the list..   
9b30: 20 20 20 23 20 20 20 20 20 20 20 6f 66 20 74 68     #       of th
9b40: 6f 73 65 20 6b 6e 6f 77 6e 20 74 6f 20 74 68 65  ose known to the
9b50: 20 45 61 67 6c 65 20 69 6e 74 65 72 70 72 65 74   Eagle interpret
9b60: 65 72 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  er...      #..  
9b70: 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b      object invok
9b80: 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62  e -flags +NonPub
9b90: 6c 69 63 20 49 6e 74 65 72 70 72 65 74 65 72 2e  lic Interpreter.
9ba0: 47 65 74 41 63 74 69 76 65 2e 63 6f 6e 6e 65 63  GetActive.connec
9bb0: 74 69 6f 6e 73 20 41 64 64 20 5c 0d 0a 20 20 20  tions Add \..   
9bc0: 20 20 20 20 20 20 20 24 64 62 20 24 63 6f 6e 6e         $db $conn
9bd0: 65 63 74 69 6f 6e 0d 0a 20 20 20 20 7d 0d 0a 0c  ection..    }...
9be0: 0d 0a 20 20 20 20 70 72 6f 63 20 63 6c 65 61 6e  ..    proc clean
9bf0: 75 70 44 62 20 7b 20 66 69 6c 65 4e 61 6d 65 20  upDb { fileName 
9c00: 7b 76 61 72 4e 61 6d 65 20 64 62 7d 20 7b 63 6f  {varName db} {co
9c10: 6c 6c 65 63 74 20 74 72 75 65 7d 20 7b 71 75 61  llect true} {qua
9c20: 6c 69 66 79 20 74 72 75 65 7d 0d 0a 20 20 20 20  lify true}..    
9c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9c40: 20 7b 64 65 6c 65 74 65 20 74 72 75 65 7d 20 7d   {delete true} }
9c50: 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20   {..      #..   
9c60: 20 20 20 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d     # NOTE: Attem
9c70: 70 74 20 74 6f 20 66 6f 72 63 65 20 61 6c 6c 20  pt to force all 
9c80: 70 65 6e 64 69 6e 67 20 22 67 61 72 62 61 67 65  pending "garbage
9c90: 22 20 6f 62 6a 65 63 74 73 20 74 6f 20 62 65 20  " objects to be 
9ca0: 63 6f 6c 6c 65 63 74 65 64 2c 0d 0a 20 20 20 20  collected,..    
9cb0: 20 20 23 20 20 20 20 20 20 20 69 6e 63 6c 75 64    #       includ
9cc0: 69 6e 67 20 53 51 4c 69 74 65 20 73 74 61 74 65  ing SQLite state
9cd0: 6d 65 6e 74 73 20 61 6e 64 20 62 61 63 6b 75 70  ments and backup
9ce0: 20 6f 62 6a 65 63 74 73 3b 20 74 68 69 73 20 73   objects; this s
9cf0: 68 6f 75 6c 64 20 61 6c 6c 6f 77 0d 0a 20 20 20  hould allow..   
9d00: 20 20 20 23 20 20 20 20 20 20 20 74 68 65 20 75     #       the u
9d10: 6e 64 65 72 6c 79 69 6e 67 20 64 61 74 61 62 61  nderlying databa
9d20: 73 65 20 66 69 6c 65 20 74 6f 20 62 65 20 64 65  se file to be de
9d30: 6c 65 74 65 64 2e 0d 0a 20 20 20 20 20 20 23 0d  leted...      #.
9d40: 0a 20 20 20 20 20 20 69 66 20 7b 24 63 6f 6c 6c  .      if {$coll
9d50: 65 63 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  ect} then {..   
9d60: 20 20 20 20 20 63 6f 6c 6c 65 63 74 47 61 72 62       collectGarb
9d70: 61 67 65 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  age $::test_chan
9d80: 6e 65 6c 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a  nel..      }....
9d90: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
9da0: 20 4e 4f 54 45 3a 20 52 65 66 65 72 20 74 6f 20   NOTE: Refer to 
9db0: 74 68 65 20 73 70 65 63 69 66 69 65 64 20 76 61  the specified va
9dc0: 72 69 61 62 6c 65 20 28 65 2e 67 2e 20 22 64 62  riable (e.g. "db
9dd0: 22 29 20 69 6e 20 74 68 65 20 63 6f 6e 74 65 78  ") in the contex
9de0: 74 20 6f 66 20 6f 75 72 0d 0a 20 20 20 20 20 20  t of our..      
9df0: 23 20 20 20 20 20 20 20 63 61 6c 6c 65 72 2e 20  #       caller. 
9e00: 20 54 68 65 20 68 61 6e 64 6c 65 20 74 6f 20 74   The handle to t
9e10: 68 65 20 64 61 74 61 62 61 73 65 20 70 72 65 76  he database prev
9e20: 69 6f 75 73 6c 79 20 6f 70 65 6e 65 64 20 62 79  iously opened by
9e30: 20 5b 73 65 74 75 70 44 62 5d 0d 0a 20 20 20 20   [setupDb]..    
9e40: 20 20 23 20 20 20 20 20 20 20 73 68 6f 75 6c 64    #       should
9e50: 20 62 65 20 73 74 6f 72 65 64 20 74 68 65 72 65   be stored there
9e60: 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
9e70: 20 20 75 70 76 61 72 20 31 20 24 76 61 72 4e 61    upvar 1 $varNa
9e80: 6d 65 20 64 62 0d 0a 0d 0a 20 20 20 20 20 20 23  me db....      #
9e90: 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
9ea0: 43 6c 6f 73 65 20 74 68 65 20 63 6f 6e 6e 65 63  Close the connec
9eb0: 74 69 6f 6e 20 74 6f 20 74 68 65 20 64 61 74 61  tion to the data
9ec0: 62 61 73 65 20 6e 6f 77 2e 20 20 54 68 69 73 20  base now.  This 
9ed0: 73 68 6f 75 6c 64 20 61 6c 6c 6f 77 20 75 73 20  should allow us 
9ee0: 74 6f 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  to..      #     
9ef0: 20 20 64 65 6c 65 74 65 20 74 68 65 20 75 6e 64    delete the und
9f00: 65 72 6c 79 69 6e 67 20 64 61 74 61 62 61 73 65  erlying database
9f10: 20 66 69 6c 65 2e 0d 0a 20 20 20 20 20 20 23 0d   file...      #.
9f20: 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f  .      if {[info
9f30: 20 65 78 69 73 74 73 20 64 62 5d 20 26 26 20 5b   exists db] && [
9f40: 63 61 74 63 68 20 7b 73 71 6c 20 63 6c 6f 73 65  catch {sql close
9f50: 20 24 64 62 7d 20 65 72 72 6f 72 5d 7d 20 74 68   $db} error]} th
9f60: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d  en {..        #.
9f70: 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
9f80: 20 57 65 20 73 6f 6d 65 68 6f 77 20 66 61 69 6c   We somehow fail
9f90: 65 64 20 74 6f 20 63 6c 6f 73 65 20 74 68 65 20  ed to close the 
9fa0: 64 61 74 61 62 61 73 65 2c 20 72 65 70 6f 72 74  database, report
9fb0: 20 77 68 79 2e 0d 0a 20 20 20 20 20 20 20 20 23   why...        #
9fc0: 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20  ..        tputs 
9fd0: 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
9fe0: 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
9ff0: 20 20 20 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d             "====
a000: 20 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64   WARNING: failed
a010: 20 74 6f 20 63 6c 6f 73 65 20 64 61 74 61 62 61   to close databa
a020: 73 65 20 5c 22 22 20 24 64 62 20 22 5c 22 2c 20  se \"" $db "\", 
a030: 65 72 72 6f 72 3a 20 22 20 5c 0d 0a 20 20 20 20  error: " \..    
a040: 20 20 20 20 20 20 20 20 5c 6e 5c 74 20 24 65 72          \n\t $er
a050: 72 6f 72 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d  ror \n]..      }
a060: 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  ....      #..   
a070: 20 20 20 23 20 4e 4f 54 45 3a 20 46 69 72 73 74     # NOTE: First
a080: 2c 20 73 65 65 20 69 66 20 6f 75 72 20 63 61 6c  , see if our cal
a090: 6c 65 72 20 68 61 73 20 72 65 71 75 65 73 74 65  ler has requeste
a0a0: 64 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64  d an in-memory d
a0b0: 61 74 61 62 61 73 65 2e 0d 0a 20 20 20 20 20 20  atabase...      
a0c0: 23 0d 0a 20 20 20 20 20 20 73 65 74 20 69 73 4d  #..      set isM
a0d0: 65 6d 6f 72 79 20 5b 69 73 4d 65 6d 6f 72 79 44  emory [isMemoryD
a0e0: 62 20 24 66 69 6c 65 4e 61 6d 65 5d 0d 0a 0d 0a  b $fileName]....
a0f0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
a100: 20 4e 4f 54 45 3a 20 42 75 69 6c 64 20 74 68 65   NOTE: Build the
a110: 20 66 75 6c 6c 20 70 61 74 68 20 74 6f 20 74 68   full path to th
a120: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
a130: 6e 61 6d 65 2e 20 20 46 6f 72 20 6e 6f 77 2c 20  name.  For now, 
a140: 61 6c 6c 20 74 65 73 74 0d 0a 20 20 20 20 20 20  all test..      
a150: 23 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65  #       database
a160: 20 66 69 6c 65 73 20 61 72 65 20 73 74 6f 72 65   files are store
a170: 64 20 69 6e 20 74 68 65 20 74 65 6d 70 6f 72 61  d in the tempora
a180: 72 79 20 64 69 72 65 63 74 6f 72 79 2e 0d 0a 20  ry directory... 
a190: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66       #..      if
a1a0: 20 7b 21 24 69 73 4d 65 6d 6f 72 79 20 26 26 20   {!$isMemory && 
a1b0: 24 71 75 61 6c 69 66 79 7d 20 74 68 65 6e 20 7b  $qualify} then {
a1c0: 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 66 69  ..        set fi
a1d0: 6c 65 4e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69  leName [file joi
a1e0: 6e 20 5b 67 65 74 44 61 74 61 62 61 73 65 44 69  n [getDatabaseDi
a1f0: 72 65 63 74 6f 72 79 5d 20 5b 66 69 6c 65 20 74  rectory] [file t
a200: 61 69 6c 20 24 66 69 6c 65 4e 61 6d 65 5d 5d 0d  ail $fileName]].
a210: 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
a220: 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
a230: 45 3a 20 43 68 65 63 6b 20 69 66 20 74 68 65 20  E: Check if the 
a240: 66 69 6c 65 20 73 74 69 6c 6c 20 65 78 69 73 74  file still exist
a250: 73 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  s...      #..   
a260: 20 20 20 69 66 20 7b 21 24 69 73 4d 65 6d 6f 72     if {!$isMemor
a270: 79 20 26 26 20 24 64 65 6c 65 74 65 20 26 26 20  y && $delete && 
a280: 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24 66 69  [file exists $fi
a290: 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d  leName]} then {.
a2a0: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
a2b0: 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 6b 69 70      # NOTE: Skip
a2c0: 20 64 65 6c 65 74 69 6e 67 20 64 61 74 61 62 61   deleting databa
a2d0: 73 65 20 66 69 6c 65 73 20 69 66 20 73 6f 6d 65  se files if some
a2e0: 62 6f 64 79 20 73 65 74 73 20 74 68 65 20 67 6c  body sets the gl
a2f0: 6f 62 61 6c 0d 0a 20 20 20 20 20 20 20 20 23 20  obal..        # 
a300: 20 20 20 20 20 20 76 61 72 69 61 62 6c 65 20 74        variable t
a310: 6f 20 70 72 65 76 65 6e 74 20 69 74 2e 0d 0a 20  o prevent it... 
a320: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
a330: 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69    if {![info exi
a340: 73 74 73 20 3a 3a 6e 6f 28 63 6c 65 61 6e 75 70  sts ::no(cleanup
a350: 44 62 46 69 6c 65 29 5d 7d 20 74 68 65 6e 20 7b  DbFile)]} then {
a360: 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20  ..          #.. 
a370: 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a           # NOTE:
a380: 20 41 74 74 65 6d 70 74 20 74 6f 20 64 65 6c 65   Attempt to dele
a390: 74 65 20 74 68 65 20 74 65 73 74 20 64 61 74 61  te the test data
a3a0: 62 61 73 65 20 66 69 6c 65 20 6e 6f 77 2e 0d 0a  base file now...
a3b0: 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
a3c0: 20 20 20 20 20 20 20 69 66 20 7b 5b 73 65 74 20         if {[set 
a3d0: 63 6f 64 65 20 5b 63 61 74 63 68 20 7b 66 69 6c  code [catch {fil
a3e0: 65 20 64 65 6c 65 74 65 20 24 66 69 6c 65 4e 61  e delete $fileNa
a3f0: 6d 65 7d 20 65 72 72 6f 72 5d 5d 7d 20 74 68 65  me} error]]} the
a400: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
a410: 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   #..            
a420: 23 20 4e 4f 54 45 3a 20 57 65 20 73 6f 6d 65 68  # NOTE: We someh
a430: 6f 77 20 66 61 69 6c 65 64 20 74 6f 20 64 65 6c  ow failed to del
a440: 65 74 65 20 74 68 65 20 66 69 6c 65 2c 20 72 65  ete the file, re
a450: 70 6f 72 74 20 77 68 79 2e 0d 0a 20 20 20 20 20  port why...     
a460: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
a470: 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
a480: 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70  est_channel [app
a490: 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
a4a0: 20 20 20 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d             "====
a4b0: 20 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64   WARNING: failed
a4c0: 20 74 6f 20 64 65 6c 65 74 65 20 64 61 74 61 62   to delete datab
a4d0: 61 73 65 20 66 69 6c 65 20 5c 22 22 20 24 66 69  ase file \"" $fi
a4e0: 6c 65 4e 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20  leName \..      
a4f0: 20 20 20 20 20 20 20 20 20 20 22 5c 22 20 64 75            "\" du
a500: 72 69 6e 67 20 63 6c 65 61 6e 75 70 2c 20 65 72  ring cleanup, er
a510: 72 6f 72 3a 20 22 20 5c 6e 5c 74 20 24 65 72 72  ror: " \n\t $err
a520: 6f 72 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20  or \n]..        
a530: 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 20 65    }..        } e
a540: 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  lse {..         
a550: 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20   #..          # 
a560: 4e 4f 54 45 3a 20 53 68 6f 77 20 74 68 61 74 20  NOTE: Show that 
a570: 77 65 20 73 6b 69 70 70 65 64 20 64 65 6c 65 74  we skipped delet
a580: 69 6e 67 20 74 68 65 20 66 69 6c 65 2e 0d 0a 20  ing the file... 
a590: 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
a5a0: 20 20 20 20 20 20 73 65 74 20 63 6f 64 65 20 30        set code 0
a5b0: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70  ....          tp
a5c0: 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  uts $::test_chan
a5d0: 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
a5e0: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
a5f0: 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20   "==== WARNING: 
a600: 73 6b 69 70 70 65 64 20 64 65 6c 65 74 69 6e 67  skipped deleting
a610: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 5c   database file \
a620: 22 22 20 24 66 69 6c 65 4e 61 6d 65 20 5c 0d 0a  "" $fileName \..
a630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 5c                "\
a640: 22 20 64 75 72 69 6e 67 20 63 6c 65 61 6e 75 70  " during cleanup
a650: 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d  \n"]..        }.
a660: 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d  .      } else {.
a670: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
a680: 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 65 20      # NOTE: The 
a690: 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 65 78  file does not ex
a6a0: 69 73 74 2c 20 73 75 63 63 65 73 73 21 0d 0a 20  ist, success!.. 
a6b0: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
a6c0: 20 20 73 65 74 20 63 6f 64 65 20 30 0d 0a 20 20    set code 0..  
a6d0: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 72      }....      r
a6e0: 65 74 75 72 6e 20 24 63 6f 64 65 0d 0a 20 20 20  eturn $code..   
a6f0: 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
a700: 73 65 74 75 70 44 62 49 6e 74 65 72 72 75 70 74  setupDbInterrupt
a710: 43 61 6c 6c 62 61 63 6b 20 7b 20 63 68 61 6e 6e  Callback { chann
a720: 65 6c 20 6c 6f 67 20 7d 20 7b 0d 0a 20 20 20 20  el log } {..    
a730: 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
a740: 20 22 2d 2d 2d 2d 20 73 65 74 74 69 6e 67 20 75   "---- setting u
a750: 70 20 64 65 62 75 67 67 65 72 20 69 6e 74 65 72  p debugger inter
a760: 72 75 70 74 20 63 61 6c 6c 62 61 63 6b 2e 2e 2e  rupt callback...
a770: 20 22 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b   "....      if {
a780: 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20  [catch {..      
a790: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
a7a0: 4f 54 45 3a 20 4d 61 6b 65 20 73 75 72 65 20 74  OTE: Make sure t
a7b0: 68 65 20 73 63 72 69 70 74 20 64 65 62 75 67 67  he script debugg
a7c0: 65 72 20 61 6e 64 20 74 68 65 20 69 73 6f 6c 61  er and the isola
a7d0: 74 65 64 20 69 6e 74 65 72 70 72 65 74 65 72 20  ted interpreter 
a7e0: 61 72 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20  are..        #  
a7f0: 20 20 20 20 20 73 65 74 75 70 20 61 6e 64 20 72       setup and r
a800: 65 61 64 79 20 66 6f 72 20 75 73 65 2e 0d 0a 20  eady for use... 
a810: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
a820: 20 20 64 65 62 75 67 20 73 65 74 75 70 20 74 72    debug setup tr
a830: 75 65 20 74 72 75 65 0d 0a 0d 0a 20 20 20 20 20  ue true....     
a840: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
a850: 4e 4f 54 45 3a 20 4c 6f 61 64 20 74 68 65 20 6e  NOTE: Load the n
a860: 65 63 65 73 73 61 72 79 20 70 61 63 6b 61 67 65  ecessary package
a870: 73 20 69 6e 74 6f 20 74 68 65 20 69 73 6f 6c 61  s into the isola
a880: 74 65 64 20 69 6e 74 65 72 70 72 65 74 65 72 2e  ted interpreter.
a890: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
a8a0: 20 20 20 20 20 64 65 62 75 67 20 65 76 61 6c 20       debug eval 
a8b0: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 70 61 63  {..          pac
a8c0: 6b 61 67 65 20 72 65 71 75 69 72 65 20 45 61 67  kage require Eag
a8d0: 6c 65 0d 0a 20 20 20 20 20 20 20 20 20 20 70 61  le..          pa
a8e0: 63 6b 61 67 65 20 72 65 71 75 69 72 65 20 45 61  ckage require Ea
a8f0: 67 6c 65 2e 4c 69 62 72 61 72 79 0d 0a 20 20 20  gle.Library..   
a900: 20 20 20 20 20 20 20 70 61 63 6b 61 67 65 20 72         package r
a910: 65 71 75 69 72 65 20 45 61 67 6c 65 2e 54 65 73  equire Eagle.Tes
a920: 74 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  t..        }....
a930: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
a940: 20 20 20 23 20 4e 4f 54 45 3a 20 43 6f 70 79 20     # NOTE: Copy 
a950: 74 68 65 20 6e 65 63 65 73 73 61 72 79 20 76 61  the necessary va
a960: 72 69 61 62 6c 65 73 20 69 6e 74 6f 20 74 68 65  riables into the
a970: 20 69 73 6f 6c 61 74 65 64 20 69 6e 74 65 72 70   isolated interp
a980: 72 65 74 65 72 2e 0d 0a 20 20 20 20 20 20 20 20  reter...        
a990: 23 0d 0a 20 20 20 20 20 20 20 20 64 65 62 75 67  #..        debug
a9a0: 20 69 6e 76 6f 6b 65 20 30 20 73 65 74 20 3a 3a   invoke 0 set ::
a9b0: 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 24 63 68  test_channel $ch
a9c0: 61 6e 6e 65 6c 3b 20 23 20 4e 4f 54 45 3a 20 46  annel; # NOTE: F
a9d0: 6f 72 20 5b 74 70 75 74 73 5d 2e 0d 0a 20 20 20  or [tputs]...   
a9e0: 20 20 20 20 20 64 65 62 75 67 20 69 6e 76 6f 6b       debug invok
a9f0: 65 20 30 20 73 65 74 20 3a 3a 74 65 73 74 5f 6c  e 0 set ::test_l
aa00: 6f 67 20 24 6c 6f 67 3b 20 23 20 4e 4f 54 45 3a  og $log; # NOTE:
aa10: 20 46 6f 72 20 5b 74 6c 6f 67 5d 2e 0d 0a 0d 0a   For [tlog].....
aa20: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
aa30: 20 20 20 23 20 4e 4f 54 45 3a 20 49 6e 73 74 61     # NOTE: Insta
aa40: 6c 6c 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20  ll the callback 
aa50: 73 63 72 69 70 74 20 74 6f 20 62 65 20 65 76 61  script to be eva
aa60: 6c 75 61 74 65 64 20 69 6e 20 74 68 65 20 69 73  luated in the is
aa70: 6f 6c 61 74 65 64 0d 0a 20 20 20 20 20 20 20 20  olated..        
aa80: 23 20 20 20 20 20 20 20 69 6e 74 65 72 70 72 65  #       interpre
aa90: 74 65 72 20 77 68 65 6e 20 74 68 69 73 20 69 6e  ter when this in
aaa0: 74 65 72 70 72 65 74 65 72 20 69 73 20 69 6e 74  terpreter is int
aab0: 65 72 72 75 70 74 65 64 20 62 79 20 73 63 72 69  errupted by scri
aac0: 70 74 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  pt..        #   
aad0: 20 20 20 20 63 61 6e 63 65 6c 6c 61 74 69 6f 6e      cancellation
aae0: 2c 20 65 74 63 2e 0d 0a 20 20 20 20 20 20 20 20  , etc...        
aaf0: 23 0d 0a 20 20 20 20 20 20 20 20 64 65 62 75 67  #..        debug
ab00: 20 63 61 6c 6c 62 61 63 6b 20 61 70 70 6c 79 20   callback apply 
ab10: 7b 7b 73 65 6e 64 65 72 20 65 7d 20 7b 0d 0a 20  {{sender e} {.. 
ab20: 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
ab30: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68        # NOTE: Ch
ab40: 65 63 6b 20 69 66 20 74 68 69 73 20 63 61 6c 6c  eck if this call
ab50: 62 61 63 6b 20 69 73 20 6f 6e 65 20 74 68 61 74  back is one that
ab60: 20 77 65 20 63 61 72 65 20 61 62 6f 75 74 2e 0d   we care about..
ab70: 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
ab80: 20 20 20 20 20 20 20 20 69 66 20 7b 22 43 61 6e          if {"Can
ab90: 63 65 6c 65 64 22 20 69 6e 20 5b 73 70 6c 69 74  celed" in [split
aba0: 20 5b 24 65 20 49 6e 74 65 72 72 75 70 74 54 79   [$e InterruptTy
abb0: 70 65 5d 20 22 2c 20 22 5d 7d 20 74 68 65 6e 20  pe] ", "]} then 
abc0: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23  {..            #
abd0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 20  ..            # 
abe0: 4e 4f 54 45 3a 20 49 74 65 72 61 74 65 20 74 68  NOTE: Iterate th
abf0: 72 6f 75 67 68 20 61 6c 6c 20 64 61 74 61 62 61  rough all databa
ac00: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 6b  se connections k
ac10: 6e 6f 77 6e 20 74 6f 20 74 68 65 0d 0a 20 20 20  nown to the..   
ac20: 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20           #      
ac30: 20 70 61 72 65 6e 74 20 69 6e 74 65 72 70 72 65   parent interpre
ac40: 74 65 72 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  ter...          
ac50: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20    #..           
ac60: 20 6f 62 6a 65 63 74 20 66 6f 72 65 61 63 68 20   object foreach 
ac70: 2d 61 6c 69 61 73 20 70 61 69 72 20 5c 0d 0a 20  -alias pair \.. 
ac80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b                 [
ac90: 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66  object invoke -f
aca0: 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20  lags +NonPublic 
acb0: 24 65 20 49 6e 74 65 72 70 72 65 74 65 72 2e 63  $e Interpreter.c
acc0: 6f 6e 6e 65 63 74 69 6f 6e 73 5d 20 7b 0d 0a 20  onnections] {.. 
acd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a               #..
ace0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20                # 
acf0: 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74 20 74 6f  NOTE: Attempt to
ad00: 20 63 61 6e 63 65 6c 20 61 6e 79 20 53 51 4c 20   cancel any SQL 
ad10: 71 75 65 72 69 65 73 20 69 6e 20 70 72 6f 67 72  queries in progr
ad20: 65 73 73 20 6f 6e 20 74 68 69 73 0d 0a 20 20 20  ess on this..   
ad30: 20 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20             #    
ad40: 20 20 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e     database conn
ad50: 65 63 74 69 6f 6e 2e 0d 0a 20 20 20 20 20 20 20  ection...       
ad60: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
ad70: 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74          if {[cat
ad80: 63 68 20 7b 24 70 61 69 72 20 56 61 6c 75 65 2e  ch {$pair Value.
ad90: 43 61 6e 63 65 6c 7d 20 65 72 72 6f 72 5d 20 21  Cancel} error] !
ada0: 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  = 0} then {..   
adb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75               tpu
adc0: 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
add0: 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
ade0: 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n \..           
adf0: 20 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57           "==== W
ae00: 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20 74  ARNING: failed t
ae10: 6f 20 63 61 6e 63 65 6c 20 71 75 65 72 79 20 66  o cancel query f
ae20: 6f 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 5c 22  or connection \"
ae30: 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  " \..           
ae40: 20 20 20 20 20 20 20 20 20 5b 24 70 61 69 72 20           [$pair 
ae50: 4b 65 79 5d 20 22 5c 22 2c 20 65 72 72 6f 72 3a  Key] "\", error:
ae60: 20 22 20 5c 6e 5c 74 20 24 65 72 72 6f 72 20 5c   " \n\t $error \
ae70: 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  n]..            
ae80: 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20    }..           
ae90: 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d   }..          }.
aea0: 0a 20 20 20 20 20 20 20 20 7d 7d 0d 0a 20 20 20  .        }}..   
aeb0: 20 20 20 7d 20 65 72 72 6f 72 5d 20 3d 3d 20 30     } error] == 0
aec0: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
aed0: 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20    addConstraint 
aee0: 69 6e 74 65 72 72 75 70 74 43 61 6c 6c 62 61 63  interruptCallbac
aef0: 6b 2e 73 71 6c 69 74 65 33 0d 0a 0d 0a 20 20 20  k.sqlite3....   
af00: 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
af10: 6e 65 6c 20 79 65 73 5c 6e 0d 0a 20 20 20 20 20  nel yes\n..     
af20: 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
af30: 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
af40: 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 22 6e  l [appendArgs "n
af50: 6f 2c 20 65 72 72 6f 72 3a 20 22 20 5c 6e 5c 74  o, error: " \n\t
af60: 20 24 65 72 72 6f 72 20 5c 6e 5d 0d 0a 20 20 20   $error \n]..   
af70: 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a     }..    }.....
af80: 20 20 20 20 70 72 6f 63 20 63 6c 65 61 6e 75 70      proc cleanup
af90: 46 69 6c 65 20 7b 20 66 69 6c 65 4e 61 6d 65 20  File { fileName 
afa0: 7b 63 6f 6c 6c 65 63 74 20 74 72 75 65 7d 20 7b  {collect true} {
afb0: 66 6f 72 63 65 20 66 61 6c 73 65 7d 20 7d 20 7b  force false} } {
afc0: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
afd0: 20 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74   # NOTE: Attempt
afe0: 20 74 6f 20 66 6f 72 63 65 20 61 6c 6c 20 70 65   to force all pe
aff0: 6e 64 69 6e 67 20 22 67 61 72 62 61 67 65 22 20  nding "garbage" 
b000: 6f 62 6a 65 63 74 73 20 74 6f 20 62 65 20 63 6f  objects to be co
b010: 6c 6c 65 63 74 65 64 2c 0d 0a 20 20 20 20 20 20  llected,..      
b020: 23 20 20 20 20 20 20 20 69 6e 63 6c 75 64 69 6e  #       includin
b030: 67 20 53 51 4c 69 74 65 20 73 74 61 74 65 6d 65  g SQLite stateme
b040: 6e 74 73 20 61 6e 64 20 62 61 63 6b 75 70 20 6f  nts and backup o
b050: 62 6a 65 63 74 73 3b 20 74 68 69 73 20 73 68 6f  bjects; this sho
b060: 75 6c 64 20 61 6c 6c 6f 77 0d 0a 20 20 20 20 20  uld allow..     
b070: 20 23 20 20 20 20 20 20 20 74 68 65 20 75 6e 64   #       the und
b080: 65 72 6c 79 69 6e 67 20 64 61 74 61 62 61 73 65  erlying database
b090: 20 66 69 6c 65 20 74 6f 20 62 65 20 64 65 6c 65   file to be dele
b0a0: 74 65 64 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ted...      #.. 
b0b0: 20 20 20 20 20 69 66 20 7b 24 63 6f 6c 6c 65 63       if {$collec
b0c0: 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  t} then {..     
b0d0: 20 20 20 63 6f 6c 6c 65 63 74 47 61 72 62 61 67     collectGarbag
b0e0: 65 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  e $::test_channe
b0f0: 6c 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  l..      }....  
b100: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
b110: 4f 54 45 3a 20 43 68 65 63 6b 20 69 66 20 74 68  OTE: Check if th
b120: 65 20 66 69 6c 65 20 73 74 69 6c 6c 20 65 78 69  e file still exi
b130: 73 74 73 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  sts...      #.. 
b140: 20 20 20 20 20 69 66 20 7b 5b 66 69 6c 65 20 65       if {[file e
b150: 78 69 73 74 73 20 24 66 69 6c 65 4e 61 6d 65 5d  xists $fileName]
b160: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
b170: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
b180: 4f 54 45 3a 20 53 6b 69 70 20 64 65 6c 65 74 69  OTE: Skip deleti
b190: 6e 67 20 74 65 73 74 20 66 69 6c 65 73 20 69 66  ng test files if
b1a0: 20 73 6f 6d 65 62 6f 64 79 20 73 65 74 73 20 74   somebody sets t
b1b0: 68 65 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62  he global variab
b1c0: 6c 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  le..        #   
b1d0: 20 20 20 20 74 6f 20 70 72 65 76 65 6e 74 20 69      to prevent i
b1e0: 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  t...        #.. 
b1f0: 20 20 20 20 20 20 20 69 66 20 7b 24 66 6f 72 63         if {$forc
b200: 65 20 7c 7c 20 21 5b 69 6e 66 6f 20 65 78 69 73  e || ![info exis
b210: 74 73 20 3a 3a 6e 6f 28 63 6c 65 61 6e 75 70 46  ts ::no(cleanupF
b220: 69 6c 65 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  ile)]} then {.. 
b230: 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
b240: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 74        # NOTE: At
b250: 74 65 6d 70 74 20 74 6f 20 64 65 6c 65 74 65 20  tempt to delete 
b260: 74 68 65 20 74 65 73 74 20 66 69 6c 65 20 6e 6f  the test file no
b270: 77 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d  w...          #.
b280: 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b  .          if {[
b290: 73 65 74 20 63 6f 64 65 20 5b 63 61 74 63 68 20  set code [catch 
b2a0: 7b 66 69 6c 65 20 64 65 6c 65 74 65 20 24 66 69  {file delete $fi
b2b0: 6c 65 4e 61 6d 65 7d 20 65 72 72 6f 72 5d 5d 7d  leName} error]]}
b2c0: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
b2d0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
b2e0: 20 20 20 20 23 20 4e 4f 54 45 3a 20 57 65 20 73      # NOTE: We s
b2f0: 6f 6d 65 68 6f 77 20 66 61 69 6c 65 64 20 74 6f  omehow failed to
b300: 20 64 65 6c 65 74 65 20 74 68 65 20 66 69 6c 65   delete the file
b310: 2c 20 72 65 70 6f 72 74 20 77 68 79 2e 0d 0a 20  , report why... 
b320: 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
b330: 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
b340: 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
b350: 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
b360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
b370: 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61  ==== WARNING: fa
b380: 69 6c 65 64 20 74 6f 20 64 65 6c 65 74 65 20 74  iled to delete t
b390: 65 73 74 20 66 69 6c 65 20 5c 22 22 20 24 66 69  est file \"" $fi
b3a0: 6c 65 4e 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20  leName \..      
b3b0: 20 20 20 20 20 20 20 20 20 20 22 5c 22 20 64 75            "\" du
b3c0: 72 69 6e 67 20 63 6c 65 61 6e 75 70 2c 20 65 72  ring cleanup, er
b3d0: 72 6f 72 3a 20 22 20 5c 6e 5c 74 20 24 65 72 72  ror: " \n\t $err
b3e0: 6f 72 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20  or \n]..        
b3f0: 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 20 65    }..        } e
b400: 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  lse {..         
b410: 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20   #..          # 
b420: 4e 4f 54 45 3a 20 53 68 6f 77 20 74 68 61 74 20  NOTE: Show that 
b430: 77 65 20 73 6b 69 70 70 65 64 20 64 65 6c 65 74  we skipped delet
b440: 69 6e 67 20 74 68 65 20 66 69 6c 65 2e 0d 0a 20  ing the file... 
b450: 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
b460: 20 20 20 20 20 20 73 65 74 20 63 6f 64 65 20 30        set code 0
b470: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70  ....          tp
b480: 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  uts $::test_chan
b490: 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
b4a0: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
b4b0: 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20   "==== WARNING: 
b4c0: 73 6b 69 70 70 65 64 20 64 65 6c 65 74 69 6e 67  skipped deleting
b4d0: 20 74 65 73 74 20 66 69 6c 65 20 5c 22 22 20 24   test file \"" $
b4e0: 66 69 6c 65 4e 61 6d 65 20 5c 0d 0a 20 20 20 20  fileName \..    
b4f0: 20 20 20 20 20 20 20 20 20 20 22 5c 22 20 64 75            "\" du
b500: 72 69 6e 67 20 63 6c 65 61 6e 75 70 5c 6e 22 5d  ring cleanup\n"]
b510: 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20  ..        }..   
b520: 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
b530: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
b540: 23 20 4e 4f 54 45 3a 20 54 68 65 20 66 69 6c 65  # NOTE: The file
b550: 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2c   does not exist,
b560: 20 73 75 63 63 65 73 73 21 0d 0a 20 20 20 20 20   success!..     
b570: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 73 65     #..        se
b580: 74 20 63 6f 64 65 20 30 0d 0a 20 20 20 20 20 20  t code 0..      
b590: 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65 74 75 72  }....      retur
b5a0: 6e 20 24 63 6f 64 65 0d 0a 20 20 20 20 7d 0d 0a  n $code..    }..
b5b0: 0c 0d 0a 20 20 20 20 70 72 6f 63 20 63 6f 6c 6c  ...    proc coll
b5c0: 65 63 74 47 61 72 62 61 67 65 20 7b 20 63 68 61  ectGarbage { cha
b5d0: 6e 6e 65 6c 20 7b 6d 69 6c 6c 69 73 65 63 6f 6e  nnel {millisecon
b5e0: 64 73 20 31 30 30 30 7d 20 7b 71 75 69 65 74 20  ds 1000} {quiet 
b5f0: 74 72 75 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20  true} } {..     
b600: 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 6f 62 6a   if {[catch {obj
b610: 65 63 74 20 69 6e 76 6f 6b 65 20 47 43 20 47 65  ect invoke GC Ge
b620: 74 54 6f 74 61 6c 4d 65 6d 6f 72 79 20 66 61 6c  tTotalMemory fal
b630: 73 65 7d 20 72 65 73 75 6c 74 5d 20 3d 3d 20 30  se} result] == 0
b640: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
b650: 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74    if {!$quiet} t
b660: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
b670: 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
b680: 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
b690: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d               "--
b6a0: 2d 2d 20 6d 65 6d 6f 72 79 20 69 6e 20 75 73 65  -- memory in use
b6b0: 20 62 79 20 74 68 65 20 43 4c 52 20 62 65 66 6f   by the CLR befo
b6c0: 72 65 20 63 6f 6c 6c 65 63 74 69 6f 6e 2e 2e 2e  re collection...
b6d0: 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20   " \..          
b6e0: 20 20 20 20 24 72 65 73 75 6c 74 20 22 20 62 79      $result " by
b6f0: 74 65 73 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20  tes\n"]..       
b700: 20 7d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65   }..      } else
b710: 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74   {..        tput
b720: 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  s $channel [appe
b730: 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
b740: 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e        "==== WARN
b750: 49 4e 47 3a 20 66 61 69 6c 65 64 20 74 6f 20 67  ING: failed to g
b760: 65 74 20 43 4c 52 20 6d 65 6d 6f 72 79 20 75 73  et CLR memory us
b770: 61 67 65 2c 20 65 72 72 6f 72 3a 20 22 20 5c 0d  age, error: " \.
b780: 0a 20 20 20 20 20 20 20 20 20 20 20 20 5c 6e 5c  .            \n\
b790: 74 20 24 72 65 73 75 6c 74 20 5c 6e 5d 0d 0a 20  t $result \n].. 
b7a0: 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
b7b0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
b7c0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
b7d0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
b7e0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
b7f0: 23 23 23 23 23 23 23 23 23 0d 0a 0d 0a 20 20 20  #########....   
b800: 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
b810: 54 45 3a 20 52 65 70 65 61 74 65 64 6c 79 20 61  TE: Repeatedly a
b820: 74 74 65 6d 70 74 20 74 6f 20 63 6f 6c 6c 65 63  ttempt to collec
b830: 74 20 67 61 72 62 61 67 65 20 75 6e 74 69 6c 20  t garbage until 
b840: 74 68 65 20 61 6c 6c 6f 74 74 65 64 20 6e 75 6d  the allotted num
b850: 62 65 72 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ber..      #    
b860: 20 20 20 6f 66 20 6d 69 6c 6c 69 73 65 63 6f 6e     of millisecon
b870: 64 73 20 68 61 73 20 65 6c 61 70 73 65 64 2e 20  ds has elapsed. 
b880: 20 41 6c 77 61 79 73 20 61 74 74 65 6d 70 74 20   Always attempt 
b890: 74 6f 20 63 6f 6c 6c 65 63 74 20 67 61 72 62 61  to collect garba
b8a0: 67 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  ge..      #     
b8b0: 20 20 61 74 20 6c 65 61 73 74 20 6f 6e 63 65 2e    at least once.
b8c0: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
b8d0: 20 73 65 74 20 73 74 61 72 74 20 5b 63 6c 6f 63   set start [cloc
b8e0: 6b 20 73 65 63 6f 6e 64 73 5d 0d 0a 20 20 20 20  k seconds]..    
b8f0: 20 20 73 65 74 20 73 74 6f 70 20 5b 65 78 70 72    set stop [expr
b900: 20 7b 24 73 74 61 72 74 20 2b 20 28 24 6d 69 6c   {$start + ($mil
b910: 6c 69 73 65 63 6f 6e 64 73 20 2f 20 31 30 30 30  liseconds / 1000
b920: 29 7d 5d 0d 0a 0d 0a 20 20 20 20 20 20 64 6f 20  )}]....      do 
b930: 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
b940: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 74        # NOTE: At
b950: 74 65 6d 70 74 20 74 6f 20 66 6f 72 63 65 20 61  tempt to force a
b960: 20 66 75 6c 6c 20 67 61 72 62 61 67 65 20 63 6f   full garbage co
b970: 6c 6c 65 63 74 69 6f 6e 20 6e 6f 77 2e 20 20 52  llection now.  R
b980: 65 70 6f 72 74 20 61 6e 79 0d 0a 20 20 20 20 20  eport any..     
b990: 20 20 20 23 20 20 20 20 20 20 20 65 72 72 6f 72     #       error
b9a0: 20 74 68 61 74 20 69 73 20 65 6e 63 6f 75 6e 74   that is encount
b9b0: 65 72 65 64 20 69 66 20 77 65 20 66 61 69 6c 2e  ered if we fail.
b9c0: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
b9d0: 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20       if {[catch 
b9e0: 7b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 47  {object invoke G
b9f0: 43 20 47 65 74 54 6f 74 61 6c 4d 65 6d 6f 72 79  C GetTotalMemory
ba00: 20 74 72 75 65 7d 20 65 72 72 6f 72 5d 7d 20 74   true} error]} t
ba10: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
ba20: 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
ba30: 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
ba40: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 3d 3d               "==
ba50: 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c  == WARNING: fail
ba60: 65 64 20 66 75 6c 6c 20 67 61 72 62 61 67 65 20  ed full garbage 
ba70: 63 6f 6c 6c 65 63 74 69 6f 6e 2c 20 65 72 72 6f  collection, erro
ba80: 72 3a 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20  r: " \..        
ba90: 20 20 20 20 20 20 5c 6e 5c 74 20 24 65 72 72 6f        \n\t $erro
baa0: 72 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 7d  r \n]..        }
bab0: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20  ....        set 
bac0: 6e 6f 77 20 5b 63 6c 6f 63 6b 20 73 65 63 6f 6e  now [clock secon
bad0: 64 73 5d 0d 0a 20 20 20 20 20 20 7d 20 77 68 69  ds]..      } whi
bae0: 6c 65 20 7b 24 73 74 61 72 74 20 3c 3d 20 24 6e  le {$start <= $n
baf0: 6f 77 20 26 26 20 24 6e 6f 77 20 3c 20 24 73 74  ow && $now < $st
bb00: 6f 70 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 23 23  op}....      ###
bb10: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
bb20: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
bb30: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
bb40: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
bb50: 23 23 23 23 23 23 0d 0a 0d 0a 20 20 20 20 20 20  ######....      
bb60: 69 66 20 7b 5b 63 61 74 63 68 20 7b 6f 62 6a 65  if {[catch {obje
bb70: 63 74 20 69 6e 76 6f 6b 65 20 47 43 20 47 65 74  ct invoke GC Get
bb80: 54 6f 74 61 6c 4d 65 6d 6f 72 79 20 66 61 6c 73  TotalMemory fals
bb90: 65 7d 20 72 65 73 75 6c 74 5d 20 3d 3d 20 30 7d  e} result] == 0}
bba0: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
bbb0: 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68   if {!$quiet} th
bbc0: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
bbd0: 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b  tputs $channel [
bbe0: 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
bbf0: 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
bc00: 2d 20 6d 65 6d 6f 72 79 20 69 6e 20 75 73 65 20  - memory in use 
bc10: 62 79 20 74 68 65 20 43 4c 52 20 61 66 74 65 72  by the CLR after
bc20: 20 63 6f 6c 6c 65 63 74 69 6f 6e 2e 2e 2e 20 22   collection... "
bc30: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
bc40: 20 20 24 72 65 73 75 6c 74 20 22 20 62 79 74 65    $result " byte
bc50: 73 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20 7d  s\n"]..        }
bc60: 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b  ..      } else {
bc70: 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20  ..        tputs 
bc80: 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  $channel [append
bc90: 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
bca0: 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e      "==== WARNIN
bcb0: 47 3a 20 66 61 69 6c 65 64 20 74 6f 20 67 65 74  G: failed to get
bcc0: 20 43 4c 52 20 6d 65 6d 6f 72 79 20 75 73 61 67   CLR memory usag
bcd0: 65 2c 20 65 72 72 6f 72 3a 20 22 20 5c 0d 0a 20  e, error: " \.. 
bce0: 20 20 20 20 20 20 20 20 20 20 20 5c 6e 5c 74 20             \n\t 
bcf0: 24 72 65 73 75 6c 74 20 5c 6e 5d 0d 0a 20 20 20  $result \n]..   
bd00: 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a     }..    }.....
bd10: 20 20 20 20 70 72 6f 63 20 67 65 74 53 51 4c 69      proc getSQLi
bd20: 74 65 48 61 6e 64 6c 65 43 6f 75 6e 74 73 20 7b  teHandleCounts {
bd30: 20 63 68 61 6e 6e 65 6c 20 7b 71 75 69 65 74 20   channel {quiet 
bd40: 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a 20 20 20 20  false} } {..    
bd50: 20 20 73 65 74 20 72 65 73 75 6c 74 20 5b 6c 69    set result [li
bd60: 73 74 5d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20  st]....      if 
bd70: 7b 5b 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74  {[haveConstraint
bd80: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
bd90: 20 20 64 65 66 69 6e 65 43 6f 6e 73 74 61 6e 74    defineConstant
bda0: 2e 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c  .System.Data.SQL
bdb0: 69 74 65 2e 43 4f 55 4e 54 5f 48 41 4e 44 4c 45  ite.COUNT_HANDLE
bdc0: 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
bdd0: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
bde0: 4e 4f 54 45 3a 20 41 64 64 20 65 61 63 68 20 63  NOTE: Add each c
bdf0: 72 69 74 69 63 61 6c 20 68 61 6e 64 6c 65 20 63  ritical handle c
be00: 6f 75 6e 74 20 74 6f 20 74 68 65 20 72 65 73 75  ount to the resu
be10: 6c 74 69 6e 67 20 6c 69 73 74 2e 0d 0a 20 20 20  lting list...   
be20: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
be30: 66 6f 72 65 61 63 68 20 6e 61 6d 65 20 5b 6c 69  foreach name [li
be40: 73 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 43 6f 75  st connectionCou
be50: 6e 74 20 73 74 61 74 65 6d 65 6e 74 43 6f 75 6e  nt statementCoun
be60: 74 20 62 61 63 6b 75 70 43 6f 75 6e 74 5d 20 7b  t backupCount] {
be70: 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20  ..          set 
be80: 76 61 6c 75 65 20 5b 6f 62 6a 65 63 74 20 69 6e  value [object in
be90: 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e  voke -flags +Non
bea0: 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20  Public \..      
beb0: 20 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44          System.D
bec0: 61 74 61 2e 53 51 4c 69 74 65 2e 55 6e 73 61 66  ata.SQLite.Unsaf
bed0: 65 4e 61 74 69 76 65 4d 65 74 68 6f 64 73 20 24  eNativeMethods $
bee0: 6e 61 6d 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  name]....       
bef0: 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20     if {!$quiet} 
bf00: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
bf10: 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
bf20: 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
bf30: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
bf40: 20 20 22 2d 2d 2d 2d 20 63 72 69 74 69 63 61 6c    "---- critical
bf50: 20 68 61 6e 64 6c 65 20 63 6f 75 6e 74 20 5c 22   handle count \"
bf60: 22 20 24 6e 61 6d 65 20 22 5c 22 20 69 73 20 22  " $name "\" is "
bf70: 20 24 76 61 6c 75 65 20 5c 6e 5d 0d 0a 20 20 20   $value \n]..   
bf80: 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
bf90: 20 20 20 20 20 20 6c 61 70 70 65 6e 64 20 72 65        lappend re
bfa0: 73 75 6c 74 20 24 76 61 6c 75 65 0d 0a 20 20 20  sult $value..   
bfb0: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 20       }..      } 
bfc0: 65 6c 73 65 69 66 20 7b 21 24 71 75 69 65 74 7d  elseif {!$quiet}
bfd0: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
bfe0: 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
bff0: 54 45 3a 20 54 68 65 20 61 63 74 75 61 6c 20 68  TE: The actual h
c000: 61 6e 64 6c 65 20 63 6f 75 6e 74 73 20 61 72 65  andle counts are
c010: 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 3b 20   not available; 
c020: 74 68 65 72 65 66 6f 72 65 2c 20 6a 75 73 74 0d  therefore, just.
c030: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
c040: 20 72 65 74 75 72 6e 20 61 6e 20 65 6d 70 74 79   return an empty
c050: 20 6c 69 73 74 2e 0d 0a 20 20 20 20 20 20 20 20   list...        
c060: 23 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73  #..        tputs
c070: 20 24 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20   $channel "---- 
c080: 63 72 69 74 69 63 61 6c 20 68 61 6e 64 6c 65 20  critical handle 
c090: 63 6f 75 6e 74 73 20 75 6e 61 76 61 69 6c 61 62  counts unavailab
c0a0: 6c 65 5c 6e 22 0d 0a 20 20 20 20 20 20 7d 0d 0a  le\n"..      }..
c0b0: 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 24  ..      return $
c0c0: 72 65 73 75 6c 74 0d 0a 20 20 20 20 7d 0d 0a 0c  result..    }...
c0d0: 0d 0a 20 20 20 20 70 72 6f 63 20 73 68 75 74 64  ..    proc shutd
c0e0: 6f 77 6e 53 51 4c 69 74 65 20 7b 20 63 68 61 6e  ownSQLite { chan
c0f0: 6e 65 6c 20 7b 66 6f 72 63 65 20 66 61 6c 73 65  nel {force false
c100: 7d 20 7b 71 75 69 65 74 20 66 61 6c 73 65 7d 20  } {quiet false} 
c110: 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  } {..      #..  
c120: 20 20 20 20 23 20 4e 4f 54 45 3a 20 4d 61 6b 65      # NOTE: Make
c130: 20 73 75 72 65 20 74 68 61 74 20 53 51 4c 69 74   sure that SQLit
c140: 65 20 63 6f 72 65 20 6c 69 62 72 61 72 79 20 69  e core library i
c150: 73 20 63 6f 6d 70 6c 65 74 65 6c 79 20 73 68 75  s completely shu
c160: 74 64 6f 77 6e 2e 20 20 54 68 69 73 0d 0a 20 20  tdown.  This..  
c170: 20 20 20 20 23 20 20 20 20 20 20 20 69 73 20 75      #       is u
c180: 73 65 64 20 62 79 20 74 65 73 74 73 20 74 68 61  sed by tests tha
c190: 74 20 63 68 61 6e 67 65 20 63 6f 6e 66 69 67 75  t change configu
c1a0: 72 61 74 69 6f 6e 20 6f 70 74 69 6f 6e 73 20 61  ration options a
c1b0: 6e 64 2f 6f 72 20 74 68 6f 73 65 0d 0a 20 20 20  nd/or those..   
c1c0: 20 20 20 23 20 20 20 20 20 20 20 74 68 61 74 20     #       that 
c1d0: 6e 65 65 64 20 74 6f 20 6d 61 6b 65 20 73 75 72  need to make sur
c1e0: 65 20 6c 6f 67 67 69 6e 67 20 69 73 20 69 6e 69  e logging is ini
c1f0: 74 69 61 6c 69 7a 65 64 20 28 69 2e 65 2e 20 6a  tialized (i.e. j
c200: 75 73 74 20 69 6e 20 63 61 73 65 0d 0a 20 20 20  ust in case..   
c210: 20 20 20 23 20 20 20 20 20 20 20 74 68 65 20 53     #       the S
c220: 51 4c 69 74 65 20 63 6f 72 65 20 6c 69 62 72 61  QLite core libra
c230: 72 79 20 77 61 73 20 69 6e 69 74 69 61 6c 69 7a  ry was initializ
c240: 65 64 20 69 6e 20 74 68 65 20 70 72 6f 63 65 73  ed in the proces
c250: 73 20 70 72 69 6f 72 20 74 6f 0d 0a 20 20 20 20  s prior to..    
c260: 20 20 23 20 20 20 20 20 20 20 74 68 65 20 53 51    #       the SQ
c270: 4c 69 74 65 4c 6f 67 20 63 6c 61 73 73 20 62 65  LiteLog class be
c280: 69 6e 67 20 61 62 6c 65 20 74 6f 20 73 65 74 75  ing able to setu
c290: 70 20 69 74 73 20 6c 6f 67 67 69 6e 67 20 63 61  p its logging ca
c2a0: 6c 6c 62 61 63 6b 29 2e 0d 0a 20 20 20 20 20 20  llback)...      
c2b0: 23 20 20 20 20 20 20 20 4e 6f 72 6d 61 6c 6c 79  #       Normally
c2c0: 2c 20 74 68 69 73 20 73 68 6f 75 6c 64 20 6f 6e  , this should on
c2d0: 6c 79 20 62 65 20 70 65 72 66 6f 72 6d 65 64 20  ly be performed 
c2e0: 69 66 20 53 51 4c 69 74 65 20 69 73 20 6c 6f 61  if SQLite is loa
c2f0: 64 65 64 20 61 6e 64 0d 0a 20 20 20 20 20 20 23  ded and..      #
c300: 20 20 20 20 20 20 20 72 65 61 64 79 20 66 6f 72         ready for
c310: 20 75 73 65 20 62 79 20 74 68 65 20 74 65 73 74   use by the test
c320: 20 73 75 69 74 65 2e 0d 0a 20 20 20 20 20 20 23   suite...      #
c330: 0d 0a 20 20 20 20 20 20 69 66 20 7b 24 66 6f 72  ..      if {$for
c340: 63 65 20 7c 7c 20 5b 69 73 53 51 4c 69 74 65 52  ce || [isSQLiteR
c350: 65 61 64 79 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  eady]} then {.. 
c360: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
c370: 20 20 23 20 42 55 47 46 49 58 3a 20 42 65 66 6f    # BUGFIX: Befo
c380: 72 65 20 63 61 6c 6c 69 6e 67 20 74 68 65 20 6e  re calling the n
c390: 61 74 69 76 65 20 73 68 75 74 64 6f 77 6e 20 66  ative shutdown f
c3a0: 75 6e 63 74 69 6f 6e 2c 20 6d 61 6b 65 20 73 75  unction, make su
c3b0: 72 65 20 62 6f 74 68 0d 0a 20 20 20 20 20 20 20  re both..       
c3c0: 20 23 20 20 20 20 20 20 20 20 20 6f 66 20 74 68   #         of th
c3d0: 65 20 50 52 41 47 4d 41 20 72 65 6c 61 74 65 64  e PRAGMA related
c3e0: 20 64 69 72 65 63 74 6f 72 79 20 6e 61 6d 65 73   directory names
c3f0: 20 61 72 65 20 66 72 65 65 64 2e 0d 0a 20 20 20   are freed...   
c400: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
c410: 63 68 65 63 6b 46 6f 72 53 51 4c 69 74 65 44 69  checkForSQLiteDi
c420: 72 65 63 74 6f 72 69 65 73 20 24 63 68 61 6e 6e  rectories $chann
c430: 65 6c 20 74 72 75 65 0d 0a 0d 0a 20 20 20 20 20  el true....     
c440: 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 6f     if {[catch {o
c450: 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c  bject invoke -fl
c460: 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c  ags +NonPublic \
c470: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
c480: 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51    System.Data.SQ
c490: 4c 69 74 65 2e 55 6e 73 61 66 65 4e 61 74 69 76  Lite.UnsafeNativ
c4a0: 65 4d 65 74 68 6f 64 73 20 5c 0d 0a 20 20 20 20  eMethods \..    
c4b0: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
c4c0: 74 65 33 5f 73 68 75 74 64 6f 77 6e 7d 20 72 65  te3_shutdown} re
c4d0: 73 75 6c 74 5d 20 3d 3d 20 30 7d 20 74 68 65 6e  sult] == 0} then
c4e0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66   {..          if
c4f0: 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20   {!$quiet} then 
c500: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  {..            t
c510: 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61  puts $channel [a
c520: 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
c530: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d               "--
c540: 2d 2d 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 5f  -- call sqlite3_
c550: 73 68 75 74 64 6f 77 6e 28 29 2e 2e 2e 20 6f 6b  shutdown()... ok
c560: 3a 20 22 20 24 72 65 73 75 6c 74 20 5c 6e 5d 0d  : " $result \n].
c570: 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  .          }..  
c580: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
c590: 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 24            if {!$
c5a0: 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20  quiet} then {.. 
c5b0: 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
c5c0: 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e   $channel [appen
c5d0: 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
c5e0: 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63           "---- c
c5f0: 61 6c 6c 20 73 71 6c 69 74 65 33 5f 73 68 75 74  all sqlite3_shut
c600: 64 6f 77 6e 28 29 2e 2e 2e 20 65 72 72 6f 72 3a  down()... error:
c610: 20 22 20 5c 6e 5c 74 20 24 72 65 73 75 6c 74 20   " \n\t $result 
c620: 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  \n]..          }
c630: 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20  ..        }..   
c640: 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a     }..    }.....
c650: 20 20 20 20 70 72 6f 63 20 72 65 70 6f 72 74 53      proc reportS
c660: 51 4c 69 74 65 52 65 73 6f 75 72 63 65 73 20 7b  QLiteResources {
c670: 20 63 68 61 6e 6e 65 6c 20 7b 71 75 69 65 74 20   channel {quiet 
c680: 66 61 6c 73 65 7d 20 7b 63 6f 6c 6c 65 63 74 20  false} {collect 
c690: 74 72 75 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20  true} } {..     
c6a0: 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
c6b0: 3a 20 53 6b 69 70 20 61 6c 6c 20 6f 75 74 70 75  : Skip all outpu
c6c0: 74 20 69 66 20 77 65 20 61 72 65 20 72 75 6e 6e  t if we are runn
c6d0: 69 6e 67 20 69 6e 20 22 71 75 69 65 74 22 20 6d  ing in "quiet" m
c6e0: 6f 64 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ode...      #.. 
c6f0: 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74       if {!$quiet
c700: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
c710: 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
c720: 20 22 2d 2d 2d 2d 20 63 75 72 72 65 6e 74 20 6d   "---- current m
c730: 65 6d 6f 72 79 20 69 6e 20 75 73 65 20 62 79 20  emory in use by 
c740: 53 51 4c 69 74 65 2e 2e 2e 20 22 0d 0a 20 20 20  SQLite... "..   
c750: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 69 66     }....      if
c760: 20 7b 5b 63 61 74 63 68 20 7b 6f 62 6a 65 63 74   {[catch {object
c770: 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b   invoke -flags +
c780: 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20  NonPublic \..   
c790: 20 20 20 20 20 20 20 20 20 20 20 53 79 73 74 65             Syste
c7a0: 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 55 6e  m.Data.SQLite.Un
c7b0: 73 61 66 65 4e 61 74 69 76 65 4d 65 74 68 6f 64  safeNativeMethod
c7c0: 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
c7d0: 20 20 20 73 71 6c 69 74 65 33 5f 6d 65 6d 6f 72     sqlite3_memor
c7e0: 79 5f 75 73 65 64 7d 20 6d 65 6d 6f 72 79 5d 20  y_used} memory] 
c7f0: 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  == 0} then {..  
c800: 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65        if {!$quie
c810: 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  t} then {..     
c820: 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
c830: 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
c840: 24 6d 65 6d 6f 72 79 20 22 20 62 79 74 65 73 5c  $memory " bytes\
c850: 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  n"]..        }..
c860: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
c870: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
c880: 20 20 20 23 20 4e 4f 54 45 3a 20 4d 61 79 62 65     # NOTE: Maybe
c890: 20 74 68 65 20 53 51 4c 69 74 65 20 63 6f 72 65   the SQLite core
c8a0: 20 6c 69 62 72 61 72 79 20 69 73 20 75 6e 61 76   library is unav
c8b0: 61 69 6c 61 62 6c 65 3f 0d 0a 20 20 20 20 20 20  ailable?..      
c8c0: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 73 65 74    #..        set
c8d0: 20 6d 65 6d 6f 72 79 20 75 6e 6b 6e 6f 77 6e 0d   memory unknown.
c8e0: 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21  ...        if {!
c8f0: 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a  $quiet} then {..
c900: 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
c910: 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  $channel [append
c920: 41 72 67 73 20 24 6d 65 6d 6f 72 79 20 5c 6e 5d  Args $memory \n]
c930: 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20  ..        }..   
c940: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 73 65     }....      se
c950: 74 20 72 65 73 75 6c 74 20 24 6d 65 6d 6f 72 79  t result $memory
c960: 3b 20 23 20 4e 4f 54 45 3a 20 52 65 74 75 72 6e  ; # NOTE: Return
c970: 20 6d 65 6d 6f 72 79 20 69 6e 2d 75 73 65 20 74   memory in-use t
c980: 6f 20 6f 75 72 20 63 61 6c 6c 65 72 2e 0d 0a 0d  o our caller....
c990: 0a 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69  .      if {!$qui
c9a0: 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  et} then {..    
c9b0: 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
c9c0: 65 6c 20 22 2d 2d 2d 2d 20 6d 61 78 69 6d 75 6d  el "---- maximum
c9d0: 20 6d 65 6d 6f 72 79 20 69 6e 20 75 73 65 20 62   memory in use b
c9e0: 79 20 53 51 4c 69 74 65 2e 2e 2e 20 22 0d 0a 20  y SQLite... ".. 
c9f0: 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
ca00: 69 66 20 7b 5b 63 61 74 63 68 20 7b 6f 62 6a 65  if {[catch {obje
ca10: 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73  ct invoke -flags
ca20: 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20   +NonPublic \.. 
ca30: 20 20 20 20 20 20 20 20 20 20 20 20 20 53 79 73               Sys
ca40: 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e  tem.Data.SQLite.
ca50: 55 6e 73 61 66 65 4e 61 74 69 76 65 4d 65 74 68  UnsafeNativeMeth
ca60: 6f 64 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ods \..         
ca70: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 65 6d       sqlite3_mem
ca80: 6f 72 79 5f 68 69 67 68 77 61 74 65 72 20 30 7d  ory_highwater 0}
ca90: 20 6d 65 6d 6f 72 79 5d 20 3d 3d 20 30 7d 20 74   memory] == 0} t
caa0: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 69  hen {..        i
cab0: 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e  f {!$quiet} then
cac0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70   {..          tp
cad0: 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70  uts $channel [ap
cae0: 70 65 6e 64 41 72 67 73 20 24 6d 65 6d 6f 72 79  pendArgs $memory
caf0: 20 22 20 62 79 74 65 73 5c 6e 22 5d 0d 0a 20 20   " bytes\n"]..  
cb00: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d        }..      }
cb10: 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
cb20: 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
cb30: 54 45 3a 20 4d 61 79 62 65 20 74 68 65 20 53 51  TE: Maybe the SQ
cb40: 4c 69 74 65 20 63 6f 72 65 20 6c 69 62 72 61 72  Lite core librar
cb50: 79 20 69 73 20 75 6e 61 76 61 69 6c 61 62 6c 65  y is unavailable
cb60: 3f 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ?..        #..  
cb70: 20 20 20 20 20 20 73 65 74 20 6d 65 6d 6f 72 79        set memory
cb80: 20 75 6e 6b 6e 6f 77 6e 0d 0a 0d 0a 20 20 20 20   unknown....    
cb90: 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d      if {!$quiet}
cba0: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
cbb0: 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
cbc0: 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 24 6d  l [appendArgs $m
cbd0: 65 6d 6f 72 79 20 5c 6e 5d 0d 0a 20 20 20 20 20  emory \n]..     
cbe0: 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d     }..      }...
cbf0: 0a 20 20 20 20 20 20 69 66 20 7b 24 63 6f 6c 6c  .      if {$coll
cc00: 65 63 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  ect} then {..   
cc10: 20 20 20 20 20 63 6f 6c 6c 65 63 74 47 61 72 62       collectGarb
cc20: 61 67 65 20 24 63 68 61 6e 6e 65 6c 0d 0a 20 20  age $channel..  
cc30: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 69      }....      i
cc40: 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e  f {!$quiet} then
cc50: 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74   {..        tput
cc60: 73 20 24 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d  s $channel "----
cc70: 20 63 75 72 72 65 6e 74 20 6d 65 6d 6f 72 79 20   current memory 
cc80: 69 6e 20 75 73 65 20 62 79 20 74 68 65 20 43 4c  in use by the CL
cc90: 52 2e 2e 2e 20 22 0d 0a 20 20 20 20 20 20 7d 0d  R... "..      }.
cca0: 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 63 61  ...      if {[ca
ccb0: 74 63 68 20 7b 6f 62 6a 65 63 74 20 69 6e 76 6f  tch {object invo
ccc0: 6b 65 20 47 43 20 47 65 74 54 6f 74 61 6c 4d 65  ke GC GetTotalMe
ccd0: 6d 6f 72 79 20 66 61 6c 73 65 7d 20 6d 65 6d 6f  mory false} memo
cce0: 72 79 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b  ry] == 0} then {
ccf0: 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73  ..        if {[s
cd00: 74 72 69 6e 67 20 69 73 20 69 6e 74 65 67 65 72  tring is integer
cd10: 20 2d 73 74 72 69 63 74 20 24 6d 65 6d 6f 72 79   -strict $memory
cd20: 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
cd30: 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74       if {!$quiet
cd40: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
cd50: 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
cd60: 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
cd70: 20 24 6d 65 6d 6f 72 79 20 22 20 62 79 74 65 73   $memory " bytes
cd80: 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20 20 20  \n"]..          
cd90: 7d 0d 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73  }..        } els
cda0: 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73  e {..          s
cdb0: 65 74 20 6d 65 6d 6f 72 79 20 69 6e 76 61 6c 69  et memory invali
cdc0: 64 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 69  d....          i
cdd0: 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e  f {!$quiet} then
cde0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
cdf0: 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b  tputs $channel [
ce00: 61 70 70 65 6e 64 41 72 67 73 20 24 6d 65 6d 6f  appendArgs $memo
ce10: 72 79 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20  ry \n]..        
ce20: 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a    }..        }..
ce30: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
ce40: 20 20 20 20 20 20 20 20 73 65 74 20 6d 65 6d 6f          set memo
ce50: 72 79 20 75 6e 6b 6e 6f 77 6e 0d 0a 0d 0a 20 20  ry unknown....  
ce60: 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65        if {!$quie
ce70: 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  t} then {..     
ce80: 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
ce90: 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
cea0: 24 6d 65 6d 6f 72 79 20 5c 6e 5d 0d 0a 20 20 20  $memory \n]..   
ceb0: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d       }..      }.
cec0: 0a 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ...      return 
ced0: 24 72 65 73 75 6c 74 0d 0a 20 20 20 20 7d 0d 0a  $result..    }..
cee0: 0c 0d 0a 20 20 20 20 70 72 6f 63 20 63 68 65 63  ...    proc chec
cef0: 6b 46 6f 72 53 51 4c 69 74 65 44 69 72 65 63 74  kForSQLiteDirect
cf00: 6f 72 69 65 73 20 7b 20 63 68 61 6e 6e 65 6c 20  ories { channel 
cf10: 7b 72 65 73 65 74 20 66 61 6c 73 65 7d 20 7d 20  {reset false} } 
cf20: 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  {..      #..    
cf30: 20 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20    # NOTE: Check 
cf40: 69 66 20 74 68 65 20 73 71 6c 69 74 65 33 5f 77  if the sqlite3_w
cf50: 69 6e 33 32 5f 73 65 74 5f 64 69 72 65 63 74 6f  in32_set_directo
cf60: 72 79 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  ry function is a
cf70: 76 61 69 6c 61 62 6c 65 2e 0d 0a 20 20 20 20 20  vailable...     
cf80: 20 23 0d 0a 20 20 20 20 20 20 74 70 75 74 73 20   #..      tputs 
cf90: 24 63 68 61 6e 6e 65 6c 20 5c 0d 0a 20 20 20 20  $channel \..    
cfa0: 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 68 65 63        "---- chec
cfb0: 6b 69 6e 67 20 66 6f 72 20 66 75 6e 63 74 69 6f  king for functio
cfc0: 6e 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f  n sqlite3_win32_
cfd0: 73 65 74 5f 64 69 72 65 63 74 6f 72 79 2e 2e 2e  set_directory...
cfe0: 20 22 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20   "....      #.. 
cff0: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 69       # NOTE: Thi
d000: 73 20 63 61 6c 6c 20 74 6f 20 74 68 65 20 73 71  s call to the sq
d010: 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 65 74 5f  lite3_win32_set_
d020: 64 69 72 65 63 74 6f 72 79 20 66 75 6e 63 74 69  directory functi
d030: 6f 6e 20 75 73 65 73 20 74 68 65 0d 0a 20 20 20  on uses the..   
d040: 20 20 20 23 20 20 20 20 20 20 20 69 6e 76 61 6c     #       inval
d050: 69 64 20 76 61 6c 75 65 20 30 20 66 6f 72 20 74  id value 0 for t
d060: 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
d070: 74 2e 20 20 54 68 69 73 20 63 6f 64 65 20 69 73  t.  This code is
d080: 20 64 65 73 69 67 6e 65 64 0d 0a 20 20 20 20 20   designed..     
d090: 20 23 20 20 20 20 20 20 20 74 6f 20 63 68 65 63   #       to chec
d0a0: 6b 20 69 66 20 63 61 6c 6c 69 6e 67 20 74 68 65  k if calling the
d0b0: 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 72   function will r
d0c0: 61 69 73 65 20 61 6e 20 65 78 63 65 70 74 69 6f  aise an exceptio
d0d0: 6e 20 28 69 2e 65 2e 0d 0a 20 20 20 20 20 20 23  n (i.e...      #
d0e0: 20 20 20 20 20 20 20 74 68 65 20 61 63 74 75 61         the actua
d0f0: 6c 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20  l result of the 
d100: 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f  function does no
d110: 74 20 6d 61 74 74 65 72 20 61 73 20 6c 6f 6e 67  t matter as long
d120: 20 61 73 20 6e 6f 0d 0a 20 20 20 20 20 20 23 20   as no..      # 
d130: 20 20 20 20 20 20 64 69 72 65 63 74 6f 72 79 20        directory 
d140: 69 73 20 63 68 61 6e 67 65 64 29 2e 0d 0a 20 20  is changed)...  
d150: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20      #..      if 
d160: 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20  {[catch {..     
d170: 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20           object 
d180: 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e  invoke -flags +N
d190: 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20  onPublic \..    
d1a0: 20 20 20 20 20 20 20 20 20 20 53 79 73 74 65 6d            System
d1b0: 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 55 6e 73  .Data.SQLite.Uns
d1c0: 61 66 65 4e 61 74 69 76 65 4d 65 74 68 6f 64 73  afeNativeMethods
d1d0: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
d1e0: 20 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f    sqlite3_win32_
d1f0: 73 65 74 5f 64 69 72 65 63 74 6f 72 79 20 30 20  set_directory 0 
d200: 6e 75 6c 6c 7d 5d 20 3d 3d 20 30 7d 20 74 68 65  null}] == 0} the
d210: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  n {..        #..
d220: 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
d230: 43 61 6c 6c 69 6e 67 20 74 68 65 20 73 71 6c 69  Calling the sqli
d240: 74 65 33 5f 77 69 6e 33 32 5f 73 65 74 5f 64 69  te3_win32_set_di
d250: 72 65 63 74 6f 72 79 20 66 75 6e 63 74 69 6f 6e  rectory function
d260: 20 64 6f 65 73 20 6e 6f 74 0d 0a 20 20 20 20 20   does not..     
d270: 20 20 20 23 20 20 20 20 20 20 20 63 61 75 73 65     #       cause
d280: 20 61 6e 20 65 78 63 65 70 74 69 6f 6e 3b 20 74   an exception; t
d290: 68 65 72 65 66 6f 72 65 2c 20 69 74 20 6d 75 73  herefore, it mus
d2a0: 74 20 62 65 20 61 76 61 69 6c 61 62 6c 65 20 28  t be available (
d2b0: 69 2e 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 20  i.e...        # 
d2c0: 20 20 20 20 20 20 65 76 65 6e 20 74 68 6f 75 67        even thoug
d2d0: 68 20 69 74 20 73 68 6f 75 6c 64 20 72 65 74 75  h it should retu
d2e0: 72 6e 20 61 20 66 61 69 6c 75 72 65 20 72 65 74  rn a failure ret
d2f0: 75 72 6e 20 63 6f 64 65 20 69 6e 20 74 68 69 73  urn code in this
d300: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
d310: 20 20 63 61 73 65 29 2e 0d 0a 20 20 20 20 20 20    case)...      
d320: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 61 64 64    #..        add
d330: 43 6f 6e 73 74 72 61 69 6e 74 20 73 71 6c 69 74  Constraint sqlit
d340: 65 33 5f 77 69 6e 33 32 5f 73 65 74 5f 64 69 72  e3_win32_set_dir
d350: 65 63 74 6f 72 79 0d 0a 0d 0a 20 20 20 20 20 20  ectory....      
d360: 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
d370: 20 79 65 73 5c 6e 0d 0a 0d 0a 20 20 20 20 20 20   yes\n....      
d380: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
d390: 4f 54 45 3a 20 44 6f 65 73 20 6f 75 72 20 63 61  OTE: Does our ca
d3a0: 6c 6c 65 72 20 77 61 6e 74 20 74 6f 20 72 65 73  ller want to res
d3b0: 65 74 20 74 68 65 20 64 69 72 65 63 74 6f 72 69  et the directori
d3c0: 65 73 3f 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  es?..        #..
d3d0: 20 20 20 20 20 20 20 20 69 66 20 7b 24 72 65 73          if {$res
d3e0: 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  et} then {..    
d3f0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
d400: 20 20 20 23 20 4e 4f 54 45 3a 20 4e 6f 77 20 6d     # NOTE: Now m
d410: 61 6b 65 20 73 75 72 65 20 74 68 65 20 64 61 74  ake sure the dat
d420: 61 62 61 73 65 20 61 6e 64 20 74 65 6d 70 6f 72  abase and tempor
d430: 61 72 79 20 64 69 72 65 63 74 6f 72 69 65 73 20  ary directories 
d440: 61 72 65 0d 0a 20 20 20 20 20 20 20 20 20 20 23  are..          #
d450: 20 20 20 20 20 20 20 72 65 73 65 74 20 74 68 65         reset the
d460: 69 72 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65  ir default value
d470: 73 2c 20 77 68 69 63 68 20 73 68 6f 75 6c 64 20  s, which should 
d480: 62 65 20 6e 75 6c 6c 20 66 6f 72 20 62 6f 74 68  be null for both
d490: 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 20  ...          #  
d4a0: 20 20 20 20 20 53 69 6e 63 65 20 74 68 65 20 73       Since the s
d4b0: 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 65 74  qlite3_win32_set
d4c0: 5f 64 69 72 65 63 74 6f 72 79 20 66 75 6e 63 74  _directory funct
d4d0: 69 6f 6e 20 69 73 20 61 76 61 69 6c 61 62 6c 65  ion is available
d4e0: 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 20  ,..          #  
d4f0: 20 20 20 20 20 75 73 65 20 69 74 2e 0d 0a 20 20       use it...  
d500: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
d510: 20 20 20 20 20 66 6f 72 20 7b 73 65 74 20 69 6e       for {set in
d520: 64 65 78 20 31 7d 20 7b 24 69 6e 64 65 78 20 3c  dex 1} {$index <
d530: 20 33 7d 20 7b 69 6e 63 72 20 69 6e 64 65 78 7d   3} {incr index}
d540: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
d550: 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20  if {[catch {..  
d560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d570: 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20    object invoke 
d580: 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69  -flags +NonPubli
d590: 63 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  c \..           
d5a0: 20 20 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e           System.
d5b0: 44 61 74 61 2e 53 51 4c 69 74 65 2e 55 6e 73 61  Data.SQLite.Unsa
d5c0: 66 65 4e 61 74 69 76 65 4d 65 74 68 6f 64 73 20  feNativeMethods 
d5d0: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
d5e0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 77         sqlite3_w
d5f0: 69 6e 33 32 5f 73 65 74 5f 64 69 72 65 63 74 6f  in32_set_directo
d600: 72 79 20 24 69 6e 64 65 78 20 6e 75 6c 6c 7d 20  ry $index null} 
d610: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
d620: 20 20 20 20 20 20 20 72 65 73 75 6c 74 5d 20 3d         result] =
d630: 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  = 0} then {..   
d640: 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
d650: 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e   $channel [appen
d660: 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
d670: 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
d680: 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 5f 77 69   call sqlite3_wi
d690: 6e 33 32 5f 73 65 74 5f 64 69 72 65 63 74 6f 72  n32_set_director
d6a0: 79 28 22 20 24 69 6e 64 65 78 20 5c 0d 0a 20 20  y(" $index \..  
d6b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d6c0: 22 2c 20 6e 75 6c 6c 29 2e 2e 2e 20 6f 6b 3a 20  ", null)... ok: 
d6d0: 22 20 24 72 65 73 75 6c 74 20 5c 6e 5d 0d 0a 20  " $result \n].. 
d6e0: 20 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73             } els
d6f0: 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e {..           
d700: 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
d710: 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
d720: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
d730: 20 20 20 22 2d 2d 2d 2d 20 63 61 6c 6c 20 73 71     "---- call sq
d740: 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 65 74 5f  lite3_win32_set_
d750: 64 69 72 65 63 74 6f 72 79 28 22 20 24 69 6e 64  directory(" $ind
d760: 65 78 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  ex \..          
d770: 20 20 20 20 20 20 20 20 22 2c 20 6e 75 6c 6c 29          ", null)
d780: 2e 2e 2e 20 65 72 72 6f 72 3a 20 22 20 5c 6e 5c  ... error: " \n\
d790: 74 20 24 72 65 73 75 6c 74 20 5c 6e 5d 0d 0a 20  t $result \n].. 
d7a0: 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
d7b0: 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
d7c0: 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 20 65 6c     }..      } el
d7d0: 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70  se {..        tp
d7e0: 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 6e 6f 5c  uts $channel no\
d7f0: 6e 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  n....        #..
d800: 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
d810: 44 6f 65 73 20 6f 75 72 20 63 61 6c 6c 65 72 20  Does our caller 
d820: 77 61 6e 74 20 74 6f 20 72 65 73 65 74 20 74 68  want to reset th
d830: 65 20 64 69 72 65 63 74 6f 72 69 65 73 3f 20 20  e directories?  
d840: 54 68 69 73 20 63 61 6e 20 6f 6e 6c 79 0d 0a 20  This can only.. 
d850: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 62         #       b
d860: 65 20 70 65 72 66 6f 72 6d 65 64 20 69 66 20 53  e performed if S
d870: 51 4c 69 74 65 20 69 73 20 6c 6f 61 64 65 64 20  QLite is loaded 
d880: 61 6e 64 20 72 65 61 64 79 20 66 6f 72 20 75 73  and ready for us
d890: 65 20 62 79 20 74 68 65 20 74 65 73 74 0d 0a 20  e by the test.. 
d8a0: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 73         #       s
d8b0: 75 69 74 65 2e 0d 0a 20 20 20 20 20 20 20 20 23  uite...        #
d8c0: 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 24 72  ..        if {$r
d8d0: 65 73 65 74 20 26 26 20 5b 69 73 53 51 4c 69 74  eset && [isSQLit
d8e0: 65 52 65 61 64 79 5d 7d 20 74 68 65 6e 20 7b 0d  eReady]} then {.
d8f0: 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
d900: 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
d910: 4e 6f 77 20 6d 61 6b 65 20 73 75 72 65 20 74 68  Now make sure th
d920: 65 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 74  e database and t
d930: 65 6d 70 6f 72 61 72 79 20 64 69 72 65 63 74 6f  emporary directo
d940: 72 69 65 73 20 61 72 65 0d 0a 20 20 20 20 20 20  ries are..      
d950: 20 20 20 20 23 20 20 20 20 20 20 20 72 65 73 65      #       rese
d960: 74 20 74 68 65 69 72 20 64 65 66 61 75 6c 74 20  t their default 
d970: 76 61 6c 75 65 73 2c 20 77 68 69 63 68 20 73 68  values, which sh
d980: 6f 75 6c 64 20 62 65 20 6e 75 6c 6c 20 66 6f 72  ould be null for
d990: 20 62 6f 74 68 2e 0d 0a 20 20 20 20 20 20 20 20   both...        
d9a0: 20 20 23 20 20 20 20 20 20 20 53 69 6e 63 65 20    #       Since 
d9b0: 74 68 65 20 73 71 6c 69 74 65 33 5f 77 69 6e 33  the sqlite3_win3
d9c0: 32 5f 73 65 74 5f 64 69 72 65 63 74 6f 72 79 20  2_set_directory 
d9d0: 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f  function does no
d9e0: 74 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 20  t..          #  
d9f0: 20 20 20 20 20 61 70 70 65 61 72 20 74 6f 20 62       appear to b
da00: 65 20 61 76 61 69 6c 61 62 6c 65 2c 20 75 73 65  e available, use
da10: 20 74 68 65 20 61 73 73 6f 63 69 61 74 65 64 20   the associated 
da20: 50 52 41 47 4d 41 20 63 6f 6d 6d 61 6e 64 73 0d  PRAGMA commands.
da30: 0a 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20  .          #    
da40: 20 20 20 69 6e 73 74 65 61 64 2e 0d 0a 20 20 20     instead...   
da50: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
da60: 20 20 20 20 66 6f 72 65 61 63 68 20 64 69 72 65      foreach dire
da70: 63 74 6f 72 79 20 5b 6c 69 73 74 20 64 61 74 61  ctory [list data
da80: 5f 73 74 6f 72 65 5f 64 69 72 65 63 74 6f 72 79  _store_directory
da90: 20 74 65 6d 70 5f 73 74 6f 72 65 5f 64 69 72 65   temp_store_dire
daa0: 63 74 6f 72 79 5d 20 7b 0d 0a 20 20 20 20 20 20  ctory] {..      
dab0: 20 20 20 20 20 20 73 65 74 20 73 71 6c 20 5b 61        set sql [a
dac0: 70 70 65 6e 64 41 72 67 73 20 22 50 52 41 47 4d  ppendArgs "PRAGM
dad0: 41 20 22 20 24 64 69 72 65 63 74 6f 72 79 20 22  A " $directory "
dae0: 20 3d 20 5c 22 5c 22 3b 22 5d 0d 0a 0d 0a 20 20   = \"\";"]....  
daf0: 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63            if {[c
db00: 61 74 63 68 20 7b 65 78 65 63 75 74 65 53 71 6c  atch {executeSql
db10: 20 24 73 71 6c 7d 20 72 65 73 75 6c 74 5d 20 3d   $sql} result] =
db20: 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  = 0} then {..   
db30: 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
db40: 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e   $channel [appen
db50: 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
db60: 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
db70: 20 65 78 65 63 75 74 65 20 50 52 41 47 4d 41 20   execute PRAGMA 
db80: 22 20 24 64 69 72 65 63 74 6f 72 79 20 22 2e 2e  " $directory "..
db90: 2e 20 6f 6b 3a 20 5c 22 22 20 5c 0d 0a 20 20 20  . ok: \"" \..   
dba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 24                 $
dbb0: 72 65 73 75 6c 74 20 5c 22 5c 6e 5d 0d 0a 20 20  result \"\n]..  
dbc0: 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65            } else
dbd0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
dbe0: 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
dbf0: 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
dc00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dc10: 20 20 22 2d 2d 2d 2d 20 65 78 65 63 75 74 65 20    "---- execute 
dc20: 50 52 41 47 4d 41 20 22 20 24 64 69 72 65 63 74  PRAGMA " $direct
dc30: 6f 72 79 20 22 2e 2e 2e 20 65 72 72 6f 72 3a 20  ory "... error: 
dc40: 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  " \..           
dc50: 20 20 20 20 20 20 20 5c 6e 5c 74 20 24 72 65 73         \n\t $res
dc60: 75 6c 74 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20  ult \n]..       
dc70: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
dc80: 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a    }..        }..
dc90: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
dca0: 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
dcb0: 3a 20 46 69 6e 61 6c 6c 79 2c 20 73 68 6f 77 20  : Finally, show 
dcc0: 74 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75  the current valu
dcd0: 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
dce0: 65 20 61 6e 64 20 74 65 6d 70 6f 72 61 72 79 0d  e and temporary.
dcf0: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 64  .      #       d
dd00: 69 72 65 63 74 6f 72 69 65 73 2e 20 20 54 68 69  irectories.  Thi
dd10: 73 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20 70 65  s can only be pe
dd20: 72 66 6f 72 6d 65 64 20 69 66 20 53 51 4c 69 74  rformed if SQLit
dd30: 65 20 69 73 20 6c 6f 61 64 65 64 0d 0a 20 20 20  e is loaded..   
dd40: 20 20 20 23 20 20 20 20 20 20 20 61 6e 64 20 72     #       and r
dd50: 65 61 64 79 20 66 6f 72 20 75 73 65 20 62 79 20  eady for use by 
dd60: 74 68 65 20 74 65 73 74 20 73 75 69 74 65 2e 0d  the test suite..
dd70: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
dd80: 69 66 20 7b 5b 69 73 53 51 4c 69 74 65 52 65 61  if {[isSQLiteRea
dd90: 64 79 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  dy]} then {..   
dda0: 20 20 20 20 20 66 6f 72 65 61 63 68 20 64 69 72       foreach dir
ddb0: 65 63 74 6f 72 79 20 5b 6c 69 73 74 20 64 61 74  ectory [list dat
ddc0: 61 5f 73 74 6f 72 65 5f 64 69 72 65 63 74 6f 72  a_store_director
ddd0: 79 20 74 65 6d 70 5f 73 74 6f 72 65 5f 64 69 72  y temp_store_dir
dde0: 65 63 74 6f 72 79 5d 20 7b 0d 0a 20 20 20 20 20  ectory] {..     
ddf0: 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
de00: 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
de10: 22 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e 67 20 22  "---- checking "
de20: 20 24 64 69 72 65 63 74 6f 72 79 20 22 2e 2e 2e   $directory "...
de30: 20 22 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20   "]....         
de40: 20 73 65 74 20 73 71 6c 20 5b 61 70 70 65 6e 64   set sql [append
de50: 41 72 67 73 20 22 50 52 41 47 4d 41 20 22 20 24  Args "PRAGMA " $
de60: 64 69 72 65 63 74 6f 72 79 20 5c 3b 5d 0d 0a 0d  directory \;]...
de70: 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b  .          if {[
de80: 63 61 74 63 68 20 7b 65 78 65 63 75 74 65 53 71  catch {executeSq
de90: 6c 20 24 73 71 6c 20 73 63 61 6c 61 72 7d 20 72  l $sql scalar} r
dea0: 65 73 75 6c 74 5d 20 3d 3d 20 30 7d 20 74 68 65  esult] == 0} the
deb0: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
dec0: 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
ded0: 5b 61 70 70 65 6e 64 41 72 67 73 20 22 6f 6b 3a  [appendArgs "ok:
dee0: 20 5c 22 22 20 24 72 65 73 75 6c 74 20 5c 22 5c   \"" $result \"\
def0: 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 20  n]..          } 
df00: 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
df10: 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
df20: 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 22  el [appendArgs "
df30: 65 72 72 6f 72 3a 20 22 20 5c 6e 5c 74 20 24 72  error: " \n\t $r
df40: 65 73 75 6c 74 20 5c 6e 5d 0d 0a 20 20 20 20 20  esult \n]..     
df50: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
df60: 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  }..      }..    
df70: 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 6c  }.....    proc l
df80: 6f 61 64 53 51 4c 69 74 65 54 65 73 74 53 65 74  oadSQLiteTestSet
df90: 74 69 6e 67 73 20 7b 20 63 68 61 6e 6e 65 6c 20  tings { channel 
dfa0: 7b 73 75 66 66 69 78 20 22 22 7d 20 7b 71 75 69  {suffix ""} {qui
dfb0: 65 74 20 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a 20  et false} } {.. 
dfc0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
dfd0: 4e 4f 54 45 3a 20 53 6b 69 70 20 6c 6f 61 64 69  NOTE: Skip loadi
dfe0: 6e 67 20 74 68 65 20 73 65 74 74 69 6e 67 73 20  ng the settings 
dff0: 69 66 20 74 68 65 69 72 20 75 73 61 67 65 20 68  if their usage h
e000: 61 73 20 62 65 65 6e 20 64 69 73 61 62 6c 65 64  as been disabled
e010: 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
e020: 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69    if {![info exi
e030: 73 74 73 20 3a 3a 6e 6f 28 73 71 6c 69 74 65 54  sts ::no(sqliteT
e040: 65 73 74 53 65 74 74 69 6e 67 73 29 5d 7d 20 74  estSettings)]} t
e050: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  hen {..        #
e060: 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
e070: 3a 20 4c 6f 61 64 20 63 75 73 74 6f 6d 20 70 65  : Load custom pe
e080: 72 2d 75 73 65 72 20 61 6e 64 2f 6f 72 20 70 65  r-user and/or pe
e090: 72 2d 68 6f 73 74 20 74 65 73 74 20 73 65 74 74  r-host test sett
e0a0: 69 6e 67 73 20 6e 6f 77 2e 0d 0a 20 20 20 20 20  ings now...     
e0b0: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 69 66     #..        if
e0c0: 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a   {[info exists :
e0d0: 3a 74 63 6c 5f 70 6c 61 74 66 6f 72 6d 28 75 73  :tcl_platform(us
e0e0: 65 72 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  er)]} then {..  
e0f0: 20 20 20 20 20 20 20 20 73 65 74 20 75 73 65 72          set user
e100: 53 65 74 74 69 6e 67 73 46 69 6c 65 4e 61 6d 65  SettingsFileName
e110: 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5b 67 65 74   [file join [get
e120: 43 6f 6d 6d 6f 6e 44 69 72 65 63 74 6f 72 79 5d  CommonDirectory]
e130: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
e140: 20 20 5b 61 70 70 65 6e 64 41 72 67 73 20 73 65    [appendArgs se
e150: 74 74 69 6e 67 73 20 24 73 75 66 66 69 78 20 2e  ttings $suffix .
e160: 20 24 3a 3a 74 63 6c 5f 70 6c 61 74 66 6f 72 6d   $::tcl_platform
e170: 28 75 73 65 72 29 20 2e 65 61 67 6c 65 5d 5d 0d  (user) .eagle]].
e180: 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20  ...          if 
e190: 7b 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24 75  {[file exists $u
e1a0: 73 65 72 53 65 74 74 69 6e 67 73 46 69 6c 65 4e  serSettingsFileN
e1b0: 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ame]} then {..  
e1c0: 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 24            if {!$
e1d0: 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20  quiet} then {.. 
e1e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75               tpu
e1f0: 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70  ts $channel [app
e200: 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
e210: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d               "--
e220: 2d 2d 20 6c 6f 61 64 69 6e 67 20 70 65 72 2d 75  -- loading per-u
e230: 73 65 72 20 74 65 73 74 20 73 65 74 74 69 6e 67  ser test setting
e240: 73 20 66 69 6c 65 20 5c 22 22 20 5c 0d 0a 20 20  s file \"" \..  
e250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e260: 24 75 73 65 72 53 65 74 74 69 6e 67 73 46 69 6c  $userSettingsFil
e270: 65 4e 61 6d 65 20 5c 22 2e 2e 2e 5c 6e 5d 0d 0a  eName \"...\n]..
e280: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d              }...
e290: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20  .            if 
e2a0: 7b 5b 63 61 74 63 68 20 7b 75 70 6c 65 76 65 6c  {[catch {uplevel
e2b0: 20 31 20 5b 6c 69 73 74 20 73 6f 75 72 63 65 20   1 [list source 
e2c0: 24 75 73 65 72 53 65 74 74 69 6e 67 73 46 69 6c  $userSettingsFil
e2d0: 65 4e 61 6d 65 5d 7d 20 5c 0d 0a 20 20 20 20 20  eName]} \..     
e2e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65                 e
e2f0: 72 72 6f 72 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  rror]} then {.. 
e300: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20               if 
e310: 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b  {!$quiet} then {
e320: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
e330: 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
e340: 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
e350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e360: 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e      "==== WARNIN
e370: 47 3a 20 66 61 69 6c 65 64 20 74 6f 20 6c 6f 61  G: failed to loa
e380: 64 20 70 65 72 2d 75 73 65 72 20 73 65 74 74 69  d per-user setti
e390: 6e 67 73 20 66 69 6c 65 20 5c 22 22 20 5c 0d 0a  ngs file \"" \..
e3a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e3b0: 20 20 20 20 24 75 73 65 72 53 65 74 74 69 6e 67      $userSetting
e3c0: 73 46 69 6c 65 4e 61 6d 65 20 22 5c 22 2c 20 65  sFileName "\", e
e3d0: 72 72 6f 72 3a 20 22 20 5c 6e 5c 74 20 24 65 72  rror: " \n\t $er
e3e0: 72 6f 72 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20  ror \n]..       
e3f0: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
e400: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
e410: 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
e420: 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71           if {!$q
e430: 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  uiet} then {..  
e440: 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
e450: 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  s $channel [appe
e460: 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
e470: 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
e480: 2d 20 73 6b 69 70 70 65 64 20 6c 6f 61 64 69 6e  - skipped loadin
e490: 67 20 70 65 72 2d 75 73 65 72 20 74 65 73 74 20  g per-user test 
e4a0: 73 65 74 74 69 6e 67 73 20 66 69 6c 65 20 5c 22  settings file \"
e4b0: 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  " \..           
e4c0: 20 20 20 20 20 20 20 24 75 73 65 72 53 65 74 74         $userSett
e4d0: 69 6e 67 73 46 69 6c 65 4e 61 6d 65 20 22 5c 22  ingsFileName "\"
e4e0: 2c 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 65 78  , it does not ex
e4f0: 69 73 74 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20  ist\n"]..       
e500: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
e510: 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a    }..        }..
e520: 0d 0a 20 20 20 20 20 20 20 20 23 23 23 23 23 23  ..        ######
e530: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
e540: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
e550: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
e560: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
e570: 23 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20  #....        if 
e580: 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  {[info exists ::
e590: 74 63 6c 5f 70 6c 61 74 66 6f 72 6d 28 68 6f 73  tcl_platform(hos
e5a0: 74 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  t)]} then {..   
e5b0: 20 20 20 20 20 20 20 73 65 74 20 68 6f 73 74 53         set hostS
e5c0: 65 74 74 69 6e 67 73 46 69 6c 65 4e 61 6d 65 20  ettingsFileName 
e5d0: 5b 66 69 6c 65 20 6a 6f 69 6e 20 5b 67 65 74 43  [file join [getC
e5e0: 6f 6d 6d 6f 6e 44 69 72 65 63 74 6f 72 79 5d 20  ommonDirectory] 
e5f0: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
e600: 20 5b 61 70 70 65 6e 64 41 72 67 73 20 73 65 74   [appendArgs set
e610: 74 69 6e 67 73 20 24 73 75 66 66 69 78 20 2e 20  tings $suffix . 
e620: 24 3a 3a 74 63 6c 5f 70 6c 61 74 66 6f 72 6d 28  $::tcl_platform(
e630: 68 6f 73 74 29 20 2e 65 61 67 6c 65 5d 5d 0d 0a  host) .eagle]]..
e640: 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b  ..          if {
e650: 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24 68 6f  [file exists $ho
e660: 73 74 53 65 74 74 69 6e 67 73 46 69 6c 65 4e 61  stSettingsFileNa
e670: 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  me]} then {..   
e680: 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71           if {!$q
e690: 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  uiet} then {..  
e6a0: 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
e6b0: 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  s $channel [appe
e6c0: 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
e6d0: 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
e6e0: 2d 20 6c 6f 61 64 69 6e 67 20 70 65 72 2d 68 6f  - loading per-ho
e6f0: 73 74 20 74 65 73 74 20 73 65 74 74 69 6e 67 73  st test settings
e700: 20 66 69 6c 65 20 5c 22 22 20 5c 0d 0a 20 20 20   file \"" \..   
e710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 24                 $
e720: 68 6f 73 74 53 65 74 74 69 6e 67 73 46 69 6c 65  hostSettingsFile
e730: 4e 61 6d 65 20 5c 22 2e 2e 2e 5c 6e 5d 0d 0a 20  Name \"...\n].. 
e740: 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a             }....
e750: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b              if {
e760: 5b 63 61 74 63 68 20 7b 75 70 6c 65 76 65 6c 20  [catch {uplevel 
e770: 31 20 5b 6c 69 73 74 20 73 6f 75 72 63 65 20 24  1 [list source $
e780: 68 6f 73 74 53 65 74 74 69 6e 67 73 46 69 6c 65  hostSettingsFile
e790: 4e 61 6d 65 5d 7d 20 5c 0d 0a 20 20 20 20 20 20  Name]} \..      
e7a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65 72                er
e7b0: 72 6f 72 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ror]} then {..  
e7c0: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b              if {
e7d0: 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d  !$quiet} then {.
e7e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
e7f0: 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
e800: 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
e810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e820: 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47     "==== WARNING
e830: 3a 20 66 61 69 6c 65 64 20 74 6f 20 6c 6f 61 64  : failed to load
e840: 20 70 65 72 2d 68 6f 73 74 20 73 65 74 74 69 6e   per-host settin
e850: 67 73 20 66 69 6c 65 20 5c 22 22 20 5c 0d 0a 20  gs file \"" \.. 
e860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e870: 20 20 20 24 68 6f 73 74 53 65 74 74 69 6e 67 73     $hostSettings
e880: 46 69 6c 65 4e 61 6d 65 20 22 5c 22 2c 20 65 72  FileName "\", er
e890: 72 6f 72 3a 20 22 20 5c 6e 5c 74 20 24 65 72 72  ror: " \n\t $err
e8a0: 6f 72 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20  or \n]..        
e8b0: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
e8c0: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
e8d0: 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
e8e0: 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75          if {!$qu
e8f0: 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  iet} then {..   
e900: 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
e910: 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e   $channel [appen
e920: 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
e930: 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
e940: 20 73 6b 69 70 70 65 64 20 6c 6f 61 64 69 6e 67   skipped loading
e950: 20 70 65 72 2d 68 6f 73 74 20 74 65 73 74 20 73   per-host test s
e960: 65 74 74 69 6e 67 73 20 66 69 6c 65 20 5c 22 22  ettings file \""
e970: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
e980: 20 20 20 20 20 20 24 68 6f 73 74 53 65 74 74 69        $hostSetti
e990: 6e 67 73 46 69 6c 65 4e 61 6d 65 20 22 5c 22 2c  ngsFileName "\",
e9a0: 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 65 78 69   it does not exi
e9b0: 73 74 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20  st\n"]..        
e9c0: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
e9d0: 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20   }..        }.. 
e9e0: 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c       }..    }...
e9f0: 0d 0a 20 20 20 20 70 72 6f 63 20 72 75 6e 53 51  ..    proc runSQ
ea00: 4c 69 74 65 54 65 73 74 50 72 6f 6c 6f 67 75 65  LiteTestPrologue
ea10: 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a   {} {..      #..
ea20: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 6b        # NOTE: Sk
ea30: 69 70 20 72 75 6e 6e 69 6e 67 20 6f 75 72 20 63  ip running our c
ea40: 75 73 74 6f 6d 20 70 72 6f 6c 6f 67 75 65 20 69  ustom prologue i
ea50: 66 20 74 68 65 20 6d 61 69 6e 20 6f 6e 65 20 68  f the main one h
ea60: 61 73 20 62 65 65 6e 0d 0a 20 20 20 20 20 20 23  as been..      #
ea70: 20 20 20 20 20 20 20 73 6b 69 70 70 65 64 2e 0d         skipped..
ea80: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
ea90: 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74  if {![info exist
eaa0: 73 20 3a 3a 6e 6f 28 70 72 6f 6c 6f 67 75 65 2e  s ::no(prologue.
eab0: 65 61 67 6c 65 29 5d 7d 20 74 68 65 6e 20 7b 0d  eagle)]} then {.
eac0: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
ead0: 20 20 20 20 23 20 4e 4f 54 45 3a 20 4c 6f 61 64      # NOTE: Load
eae0: 20 74 68 65 20 22 62 65 66 6f 72 65 2d 63 6f 6e   the "before-con
eaf0: 73 74 72 61 69 6e 74 73 22 20 63 75 73 74 6f 6d  straints" custom
eb00: 20 70 65 72 2d 75 73 65 72 20 61 6e 64 2f 6f 72   per-user and/or
eb10: 20 70 65 72 2d 68 6f 73 74 0d 0a 20 20 20 20 20   per-host..     
eb20: 20 20 20 23 20 20 20 20 20 20 20 74 65 73 74 20     #       test 
eb30: 73 65 74 74 69 6e 67 73 20 6e 6f 77 2e 0d 0a 20  settings now... 
eb40: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
eb50: 20 20 75 70 6c 65 76 65 6c 20 31 20 5b 6c 69 73    uplevel 1 [lis
eb60: 74 20 6c 6f 61 64 53 51 4c 69 74 65 54 65 73 74  t loadSQLiteTest
eb70: 53 65 74 74 69 6e 67 73 20 24 3a 3a 74 65 73 74  Settings $::test
eb80: 5f 63 68 61 6e 6e 65 6c 20 2e 62 65 66 6f 72 65  _channel .before
eb90: 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  ]....        #..
eba0: 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
ebb0: 53 6b 69 70 20 61 6c 6c 20 53 79 73 74 65 6d 2e  Skip all System.
ebc0: 44 61 74 61 2e 53 51 4c 69 74 65 20 72 65 6c 61  Data.SQLite rela
ebd0: 74 65 64 20 66 69 6c 65 20 68 61 6e 64 6c 69 6e  ted file handlin
ebe0: 67 20 28 64 65 6c 65 74 69 6e 67 2c 0d 0a 20 20  g (deleting,..  
ebf0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63 6f        #       co
ec00: 70 79 69 6e 67 2c 20 61 6e 64 20 6c 6f 61 64 69  pying, and loadi
ec10: 6e 67 29 20 69 66 20 77 65 20 61 72 65 20 73 6f  ng) if we are so
ec20: 20 69 6e 73 74 72 75 63 74 65 64 2e 0d 0a 20 20   instructed...  
ec30: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
ec40: 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73   if {![info exis
ec50: 74 73 20 3a 3a 6e 6f 28 73 71 6c 69 74 65 46 69  ts ::no(sqliteFi
ec60: 6c 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  les)]} then {.. 
ec70: 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
ec80: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 6b        # NOTE: Sk
ec90: 69 70 20 74 72 79 69 6e 67 20 74 6f 20 64 65 6c  ip trying to del
eca0: 65 74 65 20 61 6e 79 20 66 69 6c 65 73 20 69 66  ete any files if
ecb0: 20 77 65 20 61 72 65 20 73 6f 20 69 6e 73 74 72   we are so instr
ecc0: 75 63 74 65 64 2e 0d 0a 20 20 20 20 20 20 20 20  ucted...        
ecd0: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 69    #..          i
ece0: 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73  f {![info exists
ecf0: 20 3a 3a 6e 6f 28 64 65 6c 65 74 65 53 71 6c 69   ::no(deleteSqli
ed00: 74 65 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e 20  teFiles)]} then 
ed10: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  {..            t
ed20: 72 79 44 65 6c 65 74 65 41 73 73 65 6d 62 6c 79  ryDeleteAssembly
ed30: 20 73 71 6c 69 74 65 33 2e 64 6c 6c 0d 0a 20 20   sqlite3.dll..  
ed40: 20 20 20 20 20 20 20 20 20 20 72 65 6d 6f 76 65            remove
ed50: 43 6f 6e 73 74 72 61 69 6e 74 20 66 69 6c 65 5f  Constraint file_
ed60: 73 71 6c 69 74 65 33 2e 64 6c 6c 0d 0a 0d 0a 20  sqlite3.dll.... 
ed70: 20 20 20 20 20 20 20 20 20 20 20 74 72 79 44 65             tryDe
ed80: 6c 65 74 65 41 73 73 65 6d 62 6c 79 20 53 51 4c  leteAssembly SQL
ed90: 69 74 65 2e 49 6e 74 65 72 6f 70 2e 64 6c 6c 0d  ite.Interop.dll.
eda0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 6d  .            rem
edb0: 6f 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 66 69  oveConstraint fi
edc0: 6c 65 5f 53 51 4c 69 74 65 2e 49 6e 74 65 72 6f  le_SQLite.Intero
edd0: 70 2e 64 6c 6c 0d 0a 0d 0a 20 20 20 20 20 20 20  p.dll....       
ede0: 20 20 20 20 20 74 72 79 44 65 6c 65 74 65 41 73       tryDeleteAs
edf0: 73 65 6d 62 6c 79 20 53 79 73 74 65 6d 2e 44 61  sembly System.Da
ee00: 74 61 2e 53 51 4c 69 74 65 2e 64 6c 6c 0d 0a 20  ta.SQLite.dll.. 
ee10: 20 20 20 20 20 20 20 20 20 20 20 72 65 6d 6f 76             remov
ee20: 65 43 6f 6e 73 74 72 61 69 6e 74 20 66 69 6c 65  eConstraint file
ee30: 5f 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c  _System.Data.SQL
ee40: 69 74 65 2e 64 6c 6c 0d 0a 0d 0a 20 20 20 20 20  ite.dll....     
ee50: 20 20 20 20 20 20 20 74 72 79 44 65 6c 65 74 65         tryDelete
ee60: 41 73 73 65 6d 62 6c 79 20 53 79 73 74 65 6d 2e  Assembly System.
ee70: 44 61 74 61 2e 53 51 4c 69 74 65 2e 4c 69 6e 71  Data.SQLite.Linq
ee80: 2e 64 6c 6c 0d 0a 20 20 20 20 20 20 20 20 20 20  .dll..          
ee90: 20 20 72 65 6d 6f 76 65 43 6f 6e 73 74 72 61 69    removeConstrai
eea0: 6e 74 20 66 69 6c 65 5f 53 79 73 74 65 6d 2e 44  nt file_System.D
eeb0: 61 74 61 2e 53 51 4c 69 74 65 2e 4c 69 6e 71 2e  ata.SQLite.Linq.
eec0: 64 6c 6c 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  dll..          }
eed0: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d  ....          #.
eee0: 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54  .          # NOT
eef0: 45 3a 20 53 6b 69 70 20 74 72 79 69 6e 67 20 74  E: Skip trying t
ef00: 6f 20 63 6f 70 79 20 61 6e 79 20 66 69 6c 65 73  o copy any files
ef10: 20 69 66 20 77 65 20 61 72 65 20 73 6f 20 69 6e   if we are so in
ef20: 73 74 72 75 63 74 65 64 2e 0d 0a 20 20 20 20 20  structed...     
ef30: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
ef40: 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69    if {![info exi
ef50: 73 74 73 20 3a 3a 6e 6f 28 63 6f 70 79 53 71 6c  sts ::no(copySql
ef60: 69 74 65 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e  iteFiles)]} then
ef70: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
ef80: 74 72 79 43 6f 70 79 41 73 73 65 6d 62 6c 79 20  tryCopyAssembly 
ef90: 73 71 6c 69 74 65 33 2e 64 6c 6c 0d 0a 20 20 20  sqlite3.dll..   
efa0: 20 20 20 20 20 20 20 20 20 74 72 79 43 6f 70 79           tryCopy
efb0: 41 73 73 65 6d 62 6c 79 20 53 51 4c 69 74 65 2e  Assembly SQLite.
efc0: 49 6e 74 65 72 6f 70 2e 64 6c 6c 0d 0a 20 20 20  Interop.dll..   
efd0: 20 20 20 20 20 20 20 20 20 74 72 79 43 6f 70 79           tryCopy
efe0: 41 73 73 65 6d 62 6c 79 20 53 79 73 74 65 6d 2e  Assembly System.
eff0: 44 61 74 61 2e 53 51 4c 69 74 65 2e 64 6c 6c 0d  Data.SQLite.dll.
f000: 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 72 79  .            try
f010: 43 6f 70 79 41 73 73 65 6d 62 6c 79 20 53 79 73  CopyAssembly Sys
f020: 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e  tem.Data.SQLite.
f030: 4c 69 6e 71 2e 64 6c 6c 0d 0a 20 20 20 20 20 20  Linq.dll..      
f040: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
f050: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
f060: 23 20 4e 4f 54 45 3a 20 53 6b 69 70 20 74 72 79  # NOTE: Skip try
f070: 69 6e 67 20 74 6f 20 6c 6f 61 64 20 61 6e 79 20  ing to load any 
f080: 66 69 6c 65 73 20 69 66 20 77 65 20 61 72 65 20  files if we are 
f090: 73 6f 20 69 6e 73 74 72 75 63 74 65 64 2e 0d 0a  so instructed...
f0a0: 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
f0b0: 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66         if {![inf
f0c0: 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 6c 6f  o exists ::no(lo
f0d0: 61 64 53 71 6c 69 74 65 46 69 6c 65 73 29 5d 7d  adSqliteFiles)]}
f0e0: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
f0f0: 20 20 20 20 20 74 72 79 4c 6f 61 64 41 73 73 65       tryLoadAsse
f100: 6d 62 6c 79 20 53 79 73 74 65 6d 2e 44 61 74 61  mbly System.Data
f110: 2e 53 51 4c 69 74 65 2e 64 6c 6c 0d 0a 20 20 20  .SQLite.dll..   
f120: 20 20 20 20 20 20 20 20 20 74 72 79 4c 6f 61 64           tryLoad
f130: 41 73 73 65 6d 62 6c 79 20 53 79 73 74 65 6d 2e  Assembly System.
f140: 44 61 74 61 2e 53 51 4c 69 74 65 2e 4c 69 6e 71  Data.SQLite.Linq
f150: 2e 64 6c 6c 0d 0a 20 20 20 20 20 20 20 20 20 20  .dll..          
f160: 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 23  }....          #
f170: 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f  ..          # NO
f180: 54 45 3a 20 53 6b 69 70 20 74 72 79 69 6e 67 20  TE: Skip trying 
f190: 74 6f 20 64 65 6c 65 74 65 20 65 78 74 65 72 6e  to delete extern
f1a0: 61 6c 20 66 69 6c 65 73 20 69 66 20 77 65 20 61  al files if we a
f1b0: 72 65 20 73 6f 20 69 6e 73 74 72 75 63 74 65 64  re so instructed
f1c0: 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a  ...          #..
f1d0: 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b            if {![
f1e0: 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f  info exists ::no
f1f0: 28 64 65 6c 65 74 65 53 71 6c 69 74 65 45 78 74  (deleteSqliteExt
f200: 65 72 6e 61 6c 46 69 6c 65 73 29 5d 7d 20 74 68  ernalFiles)]} th
f210: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
f220: 20 20 74 72 79 44 65 6c 65 74 65 42 75 69 6c 64    tryDeleteBuild
f230: 46 69 6c 65 20 49 6e 73 74 61 6c 6c 65 72 2e 65  File Installer.e
f240: 78 65 2e 6d 64 61 2e 63 6f 6e 66 69 67 0d 0a 20  xe.mda.config.. 
f250: 20 20 20 20 20 20 20 20 20 20 20 74 72 79 44 65             tryDe
f260: 6c 65 74 65 42 75 69 6c 64 46 69 6c 65 20 74 65  leteBuildFile te
f270: 73 74 2e 65 78 65 2e 6d 64 61 2e 63 6f 6e 66 69  st.exe.mda.confi
f280: 67 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  g..            t
f290: 72 79 44 65 6c 65 74 65 42 75 69 6c 64 46 69 6c  ryDeleteBuildFil
f2a0: 65 20 74 65 73 74 6c 69 6e 71 2e 65 78 65 2e 6d  e testlinq.exe.m
f2b0: 64 61 2e 63 6f 6e 66 69 67 0d 0a 20 20 20 20 20  da.config..     
f2c0: 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
f2d0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
f2e0: 20 23 20 4e 4f 54 45 3a 20 53 6b 69 70 20 74 72   # NOTE: Skip tr
f2f0: 79 69 6e 67 20 74 6f 20 63 6f 70 79 20 65 78 74  ying to copy ext
f300: 65 72 6e 61 6c 20 66 69 6c 65 73 20 69 66 20 77  ernal files if w
f310: 65 20 61 72 65 20 73 6f 20 69 6e 73 74 72 75 63  e are so instruc
f320: 74 65 64 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  ted...          
f330: 23 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20  #..          if 
f340: 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a  {![info exists :
f350: 3a 6e 6f 28 63 6f 70 79 53 71 6c 69 74 65 45 78  :no(copySqliteEx
f360: 74 65 72 6e 61 6c 46 69 6c 65 73 29 5d 7d 20 74  ternalFiles)]} t
f370: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
f380: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
f390: 20 20 23 20 4e 4f 54 45 3a 20 43 6f 70 79 20 74    # NOTE: Copy t
f3a0: 68 65 20 4d 44 41 20 63 6f 6e 66 69 67 75 72 61  he MDA configura
f3b0: 74 69 6f 6e 20 66 69 6c 65 20 66 6f 72 20 74 68  tion file for th
f3c0: 65 20 45 61 67 6c 65 20 73 68 65 6c 6c 20 74 6f  e Eagle shell to
f3d0: 20 74 68 65 0d 0a 20 20 20 20 20 20 20 20 20 20   the..          
f3e0: 20 20 23 20 20 20 20 20 20 20 62 75 69 6c 64 20    #       build 
f3f0: 6f 75 74 70 75 74 20 64 69 72 65 63 74 6f 72 79  output directory
f400: 3b 20 68 6f 77 65 76 65 72 2c 20 75 73 65 20 74  ; however, use t
f410: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 6c  he name of the l
f420: 65 67 61 63 79 0d 0a 20 20 20 20 20 20 20 20 20  egacy..         
f430: 20 20 20 23 20 20 20 20 20 20 20 74 65 73 74 20     #       test 
f440: 65 78 65 63 75 74 61 62 6c 65 2e 20 20 54 68 69  executable.  Thi
f450: 73 20 77 69 6c 6c 20 6d 61 6b 65 20 73 75 72 65  s will make sure
f460: 20 74 68 61 74 20 74 68 65 20 6c 65 67 61 63 79   that the legacy
f470: 20 74 65 73 74 73 0d 0a 20 20 20 20 20 20 20 20   tests..        
f480: 20 20 20 20 23 20 20 20 20 20 20 20 72 75 6e 20      #       run 
f490: 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 73 65  with the same se
f4a0: 74 20 6f 66 20 4d 44 41 73 20 63 6f 6e 66 69 67  t of MDAs config
f4b0: 75 72 65 64 2e 0d 0a 20 20 20 20 20 20 20 20 20  ured...         
f4c0: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
f4d0: 20 20 74 72 79 43 6f 70 79 42 69 6e 61 72 79 46    tryCopyBinaryF
f4e0: 69 6c 65 20 45 61 67 6c 65 53 68 65 6c 6c 2e 65  ile EagleShell.e
f4f0: 78 65 2e 6d 64 61 2e 63 6f 6e 66 69 67 20 49 6e  xe.mda.config In
f500: 73 74 61 6c 6c 65 72 2e 65 78 65 2e 6d 64 61 2e  staller.exe.mda.
f510: 63 6f 6e 66 69 67 0d 0a 20 20 20 20 20 20 20 20  config..        
f520: 20 20 20 20 74 72 79 43 6f 70 79 42 69 6e 61 72      tryCopyBinar
f530: 79 46 69 6c 65 20 45 61 67 6c 65 53 68 65 6c 6c  yFile EagleShell
f540: 2e 65 78 65 2e 6d 64 61 2e 63 6f 6e 66 69 67 20  .exe.mda.config 
f550: 74 65 73 74 2e 65 78 65 2e 6d 64 61 2e 63 6f 6e  test.exe.mda.con
f560: 66 69 67 0d 0a 20 20 20 20 20 20 20 20 20 20 20  fig..           
f570: 20 74 72 79 43 6f 70 79 42 69 6e 61 72 79 46 69   tryCopyBinaryFi
f580: 6c 65 20 45 61 67 6c 65 53 68 65 6c 6c 2e 65 78  le EagleShell.ex
f590: 65 2e 6d 64 61 2e 63 6f 6e 66 69 67 20 74 65 73  e.mda.config tes
f5a0: 74 6c 69 6e 71 2e 65 78 65 2e 6d 64 61 2e 63 6f  tlinq.exe.mda.co
f5b0: 6e 66 69 67 0d 0a 20 20 20 20 20 20 20 20 20 20  nfig..          
f5c0: 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  }..        }....
f5d0: 20 20 20 20 20 20 20 20 63 61 74 63 68 20 7b 0d          catch {.
f5e0: 0a 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73  .          tputs
f5f0: 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
f600: 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
f610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d                "-
f620: 2d 2d 2d 20 66 69 6c 65 20 76 65 72 73 69 6f 6e  --- file version
f630: 20 6f 66 20 5c 22 73 71 6c 69 74 65 33 2e 64 6c   of \"sqlite3.dl
f640: 6c 5c 22 2e 2e 2e 20 22 20 5c 0d 0a 20 20 20 20  l\"... " \..    
f650: 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20            [file 
f660: 76 65 72 73 69 6f 6e 20 5b 67 65 74 42 69 6e 61  version [getBina
f670: 72 79 46 69 6c 65 4e 61 6d 65 20 73 71 6c 69 74  ryFileName sqlit
f680: 65 33 2e 64 6c 6c 5d 5d 20 5c 6e 5d 0d 0a 20 20  e3.dll]] \n]..  
f690: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
f6a0: 20 20 20 63 61 74 63 68 20 7b 0d 0a 20 20 20 20     catch {..    
f6b0: 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
f6c0: 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70  est_channel [app
f6d0: 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
f6e0: 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 66           "---- f
f6f0: 69 6c 65 20 76 65 72 73 69 6f 6e 20 6f 66 20 5c  ile version of \
f700: 22 53 51 4c 69 74 65 2e 49 6e 74 65 72 6f 70 2e  "SQLite.Interop.
f710: 64 6c 6c 5c 22 2e 2e 2e 20 22 20 5c 0d 0a 20 20  dll\"... " \..  
f720: 20 20 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c              [fil
f730: 65 20 76 65 72 73 69 6f 6e 20 5b 67 65 74 42 69  e version [getBi
f740: 6e 61 72 79 46 69 6c 65 4e 61 6d 65 20 53 51 4c  naryFileName SQL
f750: 69 74 65 2e 49 6e 74 65 72 6f 70 2e 64 6c 6c 5d  ite.Interop.dll]
f760: 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 7d  ] \n]..        }
f770: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 63 61 74 63  ....        catc
f780: 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74  h {..          t
f790: 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
f7a0: 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
f7b0: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
f7c0: 20 20 22 2d 2d 2d 2d 20 66 69 6c 65 20 76 65 72    "---- file ver
f7d0: 73 69 6f 6e 20 6f 66 20 5c 22 53 79 73 74 65 6d  sion of \"System
f7e0: 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 64 6c 6c  .Data.SQLite.dll
f7f0: 5c 22 2e 2e 2e 20 22 20 5c 0d 0a 20 20 20 20 20  \"... " \..     
f800: 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20 76           [file v
f810: 65 72 73 69 6f 6e 20 5b 67 65 74 42 69 6e 61 72  ersion [getBinar
f820: 79 46 69 6c 65 4e 61 6d 65 20 53 79 73 74 65 6d  yFileName System
f830: 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 64 6c 6c  .Data.SQLite.dll
f840: 5d 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20  ]] \n]..        
f850: 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 63 61 74  }....        cat
f860: 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  ch {..          
f870: 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
f880: 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
f890: 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
f8a0: 20 20 20 22 2d 2d 2d 2d 20 66 69 6c 65 20 76 65     "---- file ve
f8b0: 72 73 69 6f 6e 20 6f 66 20 5c 22 53 79 73 74 65  rsion of \"Syste
f8c0: 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 4c 69  m.Data.SQLite.Li
f8d0: 6e 71 2e 64 6c 6c 5c 22 2e 2e 2e 20 22 20 5c 0d  nq.dll\"... " \.
f8e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b  .              [
f8f0: 66 69 6c 65 20 76 65 72 73 69 6f 6e 20 5b 67 65  file version [ge
f900: 74 42 69 6e 61 72 79 46 69 6c 65 4e 61 6d 65 20  tBinaryFileName 
f910: 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
f920: 74 65 2e 4c 69 6e 71 2e 64 6c 6c 5d 5d 20 5c 6e  te.Linq.dll]] \n
f930: 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  ]..        }....
f940: 20 20 20 20 20 20 20 20 73 65 74 20 61 73 73 65          set asse
f950: 6d 62 6c 69 65 73 20 5b 6f 62 6a 65 63 74 20 69  mblies [object i
f960: 6e 76 6f 6b 65 20 41 70 70 44 6f 6d 61 69 6e 2e  nvoke AppDomain.
f970: 43 75 72 72 65 6e 74 44 6f 6d 61 69 6e 20 47 65  CurrentDomain Ge
f980: 74 41 73 73 65 6d 62 6c 69 65 73 5d 0d 0a 0d 0a  tAssemblies]....
f990: 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20 66          object f
f9a0: 6f 72 65 61 63 68 20 61 73 73 65 6d 62 6c 79 20  oreach assembly 
f9b0: 24 61 73 73 65 6d 62 6c 69 65 73 20 7b 0d 0a 20  $assemblies {.. 
f9c0: 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73 74           if {[st
f9d0: 72 69 6e 67 20 6d 61 74 63 68 20 5c 7b 53 79 73  ring match \{Sys
f9e0: 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2a  tem.Data.SQLite*
f9f0: 20 24 61 73 73 65 6d 62 6c 79 5d 7d 20 74 68 65   $assembly]} the
fa00: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
fa10: 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
fa20: 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
fa30: 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
fa40: 20 20 20 20 20 20 22 2d 2d 2d 2d 20 66 6f 75 6e        "---- foun
fa50: 64 20 61 73 73 65 6d 62 6c 79 3a 20 22 20 24 61  d assembly: " $a
fa60: 73 73 65 6d 62 6c 79 20 5c 6e 5d 0d 0a 20 20 20  ssembly \n]..   
fa70: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
fa80: 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 63    }....        c
fa90: 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20  atch {..        
faa0: 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
fab0: 63 68 61 6e 6e 65 6c 20 5c 0d 0a 20 20 20 20 20  channel \..     
fac0: 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 64           "---- d
fad0: 65 66 69 6e 65 20 63 6f 6e 73 74 61 6e 74 73 20  efine constants 
fae0: 66 6f 72 20 5c 22 53 79 73 74 65 6d 2e 44 61 74  for \"System.Dat
faf0: 61 2e 53 51 4c 69 74 65 5c 22 2e 2e 2e 20 22 0d  a.SQLite\"... ".
fb00: 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20  ...          if 
fb10: 7b 5b 63 61 74 63 68 20 7b 6f 62 6a 65 63 74 20  {[catch {object 
fb20: 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e  invoke -flags +N
fb30: 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20  onPublic \..    
fb40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 79                Sy
fb50: 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
fb60: 2e 53 51 4c 69 74 65 33 20 44 65 66 69 6e 65 43  .SQLite3 DefineC
fb70: 6f 6e 73 74 61 6e 74 73 7d 20 5c 0d 0a 20 20 20  onstants} \..   
fb80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64                 d
fb90: 65 66 69 6e 65 43 6f 6e 73 74 61 6e 74 73 5d 20  efineConstants] 
fba0: 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  == 0} then {..  
fbb0: 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
fbc0: 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
fbd0: 5b 61 70 70 65 6e 64 41 72 67 73 20 5b 66 6f 72  [appendArgs [for
fbe0: 6d 61 74 4c 69 73 74 20 5b 6c 73 6f 72 74 20 5c  matList [lsort \
fbf0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
fc00: 20 20 24 64 65 66 69 6e 65 43 6f 6e 73 74 61 6e    $defineConstan
fc10: 74 73 5d 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20 20  ts]] \n]..      
fc20: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
fc30: 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
fc40: 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
fc50: 75 6e 6b 6e 6f 77 6e 5c 6e 0d 0a 20 20 20 20 20  unknown\n..     
fc60: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
fc70: 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  }....        #..
fc80: 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
fc90: 4e 6f 77 2c 20 77 65 20 6e 65 65 64 20 74 6f 20  Now, we need to 
fca0: 6b 6e 6f 77 20 69 66 20 74 68 65 20 53 51 4c 69  know if the SQLi
fcb0: 74 65 20 63 6f 72 65 20 6c 69 62 72 61 72 79 20  te core library 
fcc0: 69 73 20 61 76 61 69 6c 61 62 6c 65 0d 0a 20 20  is available..  
fcd0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 28 69        #       (i
fce0: 2e 65 2e 20 62 65 63 61 75 73 65 20 74 68 65 20  .e. because the 
fcf0: 6d 61 6e 61 67 65 64 2d 6f 6e 6c 79 20 53 79 73  managed-only Sys
fd00: 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 20  tem.Data.SQLite 
fd10: 61 73 73 65 6d 62 6c 79 20 63 61 6e 0d 0a 20 20  assembly can..  
fd20: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 6c 6f        #       lo
fd30: 61 64 20 77 69 74 68 6f 75 74 20 69 74 3b 20 68  ad without it; h
fd40: 6f 77 65 76 65 72 2c 20 69 74 20 63 61 6e 6e 6f  owever, it canno
fd50: 74 20 64 6f 20 61 6e 79 74 68 69 6e 67 20 75 73  t do anything us
fd60: 65 66 75 6c 20 77 69 74 68 6f 75 74 0d 0a 20 20  eful without..  
fd70: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 69 74        #       it
fd80: 29 2e 20 20 49 66 20 77 65 20 61 72 65 20 75 73  ).  If we are us
fd90: 69 6e 67 20 74 68 65 20 6d 69 78 65 64 2d 6d 6f  ing the mixed-mo
fda0: 64 65 20 61 73 73 65 6d 62 6c 79 20 61 6e 64 20  de assembly and 
fdb0: 77 65 20 61 6c 72 65 61 64 79 0d 0a 20 20 20 20  we already..    
fdc0: 20 20 20 20 23 20 20 20 20 20 20 20 66 6f 75 6e      #       foun
fdd0: 64 20 69 74 20 28 61 62 6f 76 65 29 2c 20 74 68  d it (above), th
fde0: 69 73 20 73 68 6f 75 6c 64 20 61 6c 77 61 79 73  is should always
fdf0: 20 73 75 63 63 65 65 64 2e 0d 0a 20 20 20 20 20   succeed...     
fe00: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 63 68     #..        ch
fe10: 65 63 6b 46 6f 72 53 51 4c 69 74 65 20 24 3a 3a  eckForSQLite $::
fe20: 74 65 73 74 5f 63 68 61 6e 6e 65 6c 0d 0a 0d 0a  test_channel....
fe30: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
fe40: 20 20 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b     # NOTE: Check
fe50: 20 74 68 65 20 53 51 4c 69 74 65 20 64 61 74 61   the SQLite data
fe60: 62 61 73 65 20 61 6e 64 20 74 65 6d 70 6f 72 61  base and tempora
fe70: 72 79 20 64 69 72 65 63 74 6f 72 69 65 73 2e 0d  ry directories..
fe80: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
fe90: 20 20 20 20 63 68 65 63 6b 46 6f 72 53 51 4c 69      checkForSQLi
fea0: 74 65 44 69 72 65 63 74 6f 72 69 65 73 20 24 3a  teDirectories $:
feb0: 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 0d 0a 0d  :test_channel...
fec0: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
fed0: 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 74 74 65      # NOTE: Atte
fee0: 6d 70 74 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  mpt to determine
fef0: 20 69 66 20 76 61 72 69 6f 75 73 20 63 6f 6d 70   if various comp
ff00: 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 73  ile-time options
ff10: 20 6e 65 65 64 65 64 20 66 6f 72 0d 0a 20 20 20   needed for..   
ff20: 20 20 20 20 20 23 20 20 20 20 20 20 20 74 65 73       #       tes
ff30: 74 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 77 65  t constraints we
ff40: 72 65 20 65 6e 61 62 6c 65 64 20 66 6f 72 20 74  re enabled for t
ff50: 68 65 20 6d 61 6e 61 67 65 64 20 61 73 73 65 6d  he managed assem
ff60: 62 6c 79 2e 20 20 54 68 65 72 65 0d 0a 20 20 20  bly.  There..   
ff70: 20 20 20 20 20 23 20 20 20 20 20 20 20 61 72 65       #       are
ff80: 20 73 6f 6d 65 20 63 6f 6d 70 69 6c 65 2d 74 69   some compile-ti
ff90: 6d 65 20 6f 70 74 69 6f 6e 73 20 74 68 61 74 20  me options that 
ffa0: 6d 75 73 74 20 61 6c 73 6f 20 68 61 76 65 20 62  must also have b
ffb0: 65 65 6e 20 65 6e 61 62 6c 65 64 0d 0a 20 20 20  een enabled..   
ffc0: 20 20 20 20 20 23 20 20 20 20 20 20 20 66 6f 72       #       for
ffd0: 20 74 68 65 20 69 6e 74 65 72 6f 70 20 61 73 73   the interop ass
ffe0: 65 6d 62 6c 79 20 69 6e 20 6f 72 64 65 72 20 74  embly in order t
fff0: 6f 20 62 65 20 65 66 66 65 63 74 69 76 65 2e 20  o be effective. 
10000 20 46 6f 72 20 74 68 6f 73 65 0d 0a 20 20 20 20   For those..    
10010 20 20 20 20 23 20 20 20 20 20 20 20 6f 70 74 69      #       opti
10020 6f 6e 73 2c 20 69 74 20 77 69 6c 6c 20 62 65 20  ons, it will be 
10030 61 73 73 75 6d 65 64 20 74 68 61 74 20 69 74 20  assumed that it 
10040 77 61 73 20 65 6e 61 62 6c 65 64 20 66 6f 72 20  was enabled for 
10050 74 68 65 20 69 6e 74 65 72 6f 70 0d 0a 20 20 20  the interop..   
10060 20 20 20 20 20 23 20 20 20 20 20 20 20 61 73 73       #       ass
10070 65 6d 62 6c 79 20 69 66 20 69 74 20 77 61 73 20  embly if it was 
10080 65 6e 61 62 6c 65 64 20 66 6f 72 20 74 68 65 20  enabled for the 
10090 6d 61 6e 61 67 65 64 20 61 73 73 65 6d 62 6c 79  managed assembly
100a0 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
100b0 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 64 65        foreach de
100c0 66 69 6e 65 43 6f 6e 73 74 61 6e 74 20 5b 6c 69  fineConstant [li
100d0 73 74 20 43 48 45 43 4b 5f 53 54 41 54 45 20 43  st CHECK_STATE C
100e0 4f 55 4e 54 5f 48 41 4e 44 4c 45 20 49 4e 54 45  OUNT_HANDLE INTE
100f0 52 4f 50 5f 43 4f 44 45 43 20 5c 0d 0a 20 20 20  ROP_CODEC \..   
10100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10120 20 20 49 4e 54 45 52 4f 50 5f 44 45 42 55 47 20    INTEROP_DEBUG 
10130 49 4e 54 45 52 4f 50 5f 4c 45 47 41 43 59 5f 43  INTEROP_LEGACY_C
10140 4c 4f 53 45 20 5c 0d 0a 20 20 20 20 20 20 20 20  LOSE \..        
10150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10160 20 20 20 20 20 20 20 20 20 20 20 20 20 49 4e 54               INT
10170 45 52 4f 50 5f 4c 4f 47 20 49 4e 54 45 52 4f 50  EROP_LOG INTEROP
10180 5f 45 58 54 45 4e 53 49 4f 4e 5f 46 55 4e 43 54  _EXTENSION_FUNCT
10190 49 4f 4e 53 20 5c 0d 0a 20 20 20 20 20 20 20 20  IONS \..        
101a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
101b0 20 20 20 20 20 20 20 20 20 20 20 20 20 49 4e 54               INT
101c0 45 52 4f 50 5f 54 45 53 54 5f 45 58 54 45 4e 53  EROP_TEST_EXTENS
101d0 49 4f 4e 20 53 51 4c 49 54 45 5f 53 54 41 4e 44  ION SQLITE_STAND
101e0 41 52 44 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ARD \..         
101f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10200 20 20 20 20 20 20 20 20 20 20 20 20 55 53 45 5f              USE_
10210 49 4e 54 45 52 4f 50 5f 44 4c 4c 5d 20 7b 0d 0a  INTEROP_DLL] {..
10220 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
10230 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43         # NOTE: C
10240 68 65 63 6b 20 69 66 20 74 68 65 20 63 6f 6d 70  heck if the comp
10250 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 20  ile-time option 
10260 69 73 20 6c 69 73 74 65 64 20 69 6e 20 74 68 65  is listed in the
10270 20 6c 69 73 74 20 6f 66 0d 0a 20 20 20 20 20 20   list of..      
10280 20 20 20 20 23 20 20 20 20 20 20 20 22 64 65 66      #       "def
10290 69 6e 65 20 63 6f 6e 73 74 61 6e 74 73 22 20 6b  ine constants" k
102a0 65 70 74 20 74 72 61 63 6b 20 6f 66 20 62 79 20  ept track of by 
102b0 74 68 65 20 6d 61 6e 61 67 65 64 20 61 73 73 65  the managed asse
102c0 6d 62 6c 79 2e 0d 0a 20 20 20 20 20 20 20 20 20  mbly...         
102d0 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 63 68   #..          ch
102e0 65 63 6b 46 6f 72 53 51 4c 69 74 65 44 65 66 69  eckForSQLiteDefi
102f0 6e 65 43 6f 6e 73 74 61 6e 74 20 24 3a 3a 74 65  neConstant $::te
10300 73 74 5f 63 68 61 6e 6e 65 6c 20 24 64 65 66 69  st_channel $defi
10310 6e 65 43 6f 6e 73 74 61 6e 74 0d 0a 20 20 20 20  neConstant..    
10320 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
10330 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
10340 54 45 3a 20 43 68 65 63 6b 20 74 68 65 20 63 75  TE: Check the cu
10350 72 72 65 6e 74 20 62 75 69 6c 64 20 79 65 61 72  rrent build year
10360 2e 20 20 42 61 73 69 63 61 6c 6c 79 2c 20 74 68  .  Basically, th
10370 69 73 20 69 6e 64 69 63 61 74 65 73 0d 0a 20 20  is indicates..  
10380 20 20 20 20 20 20 23 20 20 20 20 20 20 20 77 68        #       wh
10390 69 63 68 20 76 65 72 73 69 6f 6e 20 6f 66 20 4d  ich version of M
103a0 53 42 75 69 6c 64 20 61 6e 64 2f 6f 72 20 56 69  SBuild and/or Vi
103b0 73 75 61 6c 20 53 74 75 64 69 6f 20 77 61 73 20  sual Studio was 
103c0 75 73 65 64 20 74 6f 0d 0a 20 20 20 20 20 20 20  used to..       
103d0 20 23 20 20 20 20 20 20 20 63 6f 6d 70 69 6c 65   #       compile
103e0 20 74 68 65 20 61 73 73 65 6d 62 6c 79 20 62 69   the assembly bi
103f0 6e 61 72 69 65 73 20 75 6e 64 65 72 20 74 65 73  naries under tes
10400 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  t...        #.. 
10410 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
10420 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5c 0d 0a  test_channel \..
10430 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
10440 2d 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 53  - checking for S
10450 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
10460 65 20 62 75 69 6c 64 20 79 65 61 72 2e 2e 2e 20  e build year... 
10470 22 0d 0a 0d 0a 20 20 20 20 20 20 20 20 73 65 74  "....        set
10480 20 79 65 61 72 20 5b 67 65 74 42 75 69 6c 64 59   year [getBuildY
10490 65 61 72 5d 0d 0a 20 20 20 20 20 20 20 20 61 64  ear]..        ad
104a0 64 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70  dConstraint [app
104b0 65 6e 64 41 72 67 73 20 62 75 69 6c 64 59 65 61  endArgs buildYea
104c0 72 20 24 79 65 61 72 5d 0d 0a 20 20 20 20 20 20  r $year]..      
104d0 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
104e0 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
104f0 72 67 73 20 5c 22 20 24 79 65 61 72 20 5c 22 5c  rgs \" $year \"\
10500 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d  n]....        #.
10510 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
10520 20 43 68 65 63 6b 20 74 68 65 20 63 75 72 72 65   Check the curre
10530 6e 74 20 62 75 69 6c 64 20 63 6f 6e 66 69 67 75  nt build configu
10540 72 61 74 69 6f 6e 2e 20 20 54 68 69 73 20 73 68  ration.  This sh
10550 6f 75 6c 64 20 6e 6f 72 6d 61 6c 6c 79 0d 0a 20  ould normally.. 
10560 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 62         #       b
10570 65 20 65 69 74 68 65 72 20 22 44 65 62 75 67 22  e either "Debug"
10580 20 6f 72 20 22 52 65 6c 65 61 73 65 22 2e 0d 0a   or "Release"...
10590 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
105a0 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
105b0 5f 63 68 61 6e 6e 65 6c 20 5c 0d 0a 20 20 20 20  _channel \..    
105c0 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 68          "---- ch
105d0 65 63 6b 69 6e 67 20 66 6f 72 20 53 79 73 74 65  ecking for Syste
105e0 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 20 62 75  m.Data.SQLite bu
105f0 69 6c 64 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  ild configuratio
10600 6e 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 20 20  n... "....      
10610 20 20 73 65 74 20 63 6f 6e 66 69 67 75 72 61 74    set configurat
10620 69 6f 6e 20 5b 67 65 74 42 75 69 6c 64 43 6f 6e  ion [getBuildCon
10630 66 69 67 75 72 61 74 69 6f 6e 5d 0d 0a 20 20 20  figuration]..   
10640 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69       addConstrai
10650 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20 62  nt [appendArgs b
10660 75 69 6c 64 43 6f 6e 66 69 67 75 72 61 74 69 6f  uildConfiguratio
10670 6e 20 24 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  n $configuration
10680 5d 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73  ]..        tputs
10690 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
106a0 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 22 20   [appendArgs \" 
106b0 24 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 5c  $configuration \
106c0 22 5c 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  "\n]....        
106d0 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
106e0 45 3a 20 54 72 79 20 74 6f 20 73 65 74 75 70 20  E: Try to setup 
106f0 61 6e 20 69 6e 74 65 72 72 75 70 74 20 63 61 6c  an interrupt cal
10700 6c 62 61 63 6b 20 75 73 69 6e 67 20 74 68 65 20  lback using the 
10710 73 63 72 69 70 74 20 64 65 62 75 67 67 65 72 0d  script debugger.
10720 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
10730 20 74 68 61 74 20 77 69 6c 6c 20 63 61 6e 63 65   that will cance
10740 6c 20 61 6c 6c 20 53 51 4c 20 71 75 65 72 69 65  l all SQL querie
10750 73 20 69 6e 20 70 72 6f 67 72 65 73 73 20 66 6f  s in progress fo
10760 72 20 61 6c 6c 20 64 61 74 61 62 61 73 65 0d 0a  r all database..
10770 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
10780 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 6b 6e 6f 77  connections know
10790 6e 20 74 6f 20 74 68 69 73 20 69 6e 74 65 72 70  n to this interp
107a0 72 65 74 65 72 2e 0d 0a 20 20 20 20 20 20 20 20  reter...        
107b0 23 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21  #..        if {!
107c0 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e  [info exists ::n
107d0 6f 28 73 71 6c 69 74 65 49 6e 74 65 72 72 75 70  o(sqliteInterrup
107e0 74 43 61 6c 6c 62 61 63 6b 29 5d 7d 20 74 68 65  tCallback)]} the
107f0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73  n {..          s
10800 65 74 75 70 44 62 49 6e 74 65 72 72 75 70 74 43  etupDbInterruptC
10810 61 6c 6c 62 61 63 6b 20 24 3a 3a 74 65 73 74 5f  allback $::test_
10820 63 68 61 6e 6e 65 6c 20 24 3a 3a 74 65 73 74 5f  channel $::test_
10830 6c 6f 67 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  log..        }..
10840 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
10850 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68 65       # NOTE: Che
10860 63 6b 20 66 6f 72 20 74 68 65 20 6e 61 74 69 76  ck for the nativ
10870 65 20 72 75 6e 74 69 6d 65 20 6f 70 74 69 6f 6e  e runtime option
10880 2c 20 77 68 69 63 68 20 77 6f 75 6c 64 20 6d 65  , which would me
10890 61 6e 20 77 65 20 61 72 65 0d 0a 20 20 20 20 20  an we are..     
108a0 20 20 20 23 20 20 20 20 20 20 20 75 73 69 6e 67     #       using
108b0 20 74 68 65 20 6d 69 78 65 64 2d 6d 6f 64 65 20   the mixed-mode 
108c0 61 73 73 65 6d 62 6c 79 2e 0d 0a 20 20 20 20 20  assembly...     
108d0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 63 68     #..        ch
108e0 65 63 6b 46 6f 72 52 75 6e 74 69 6d 65 4f 70 74  eckForRuntimeOpt
108f0 69 6f 6e 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  ion $::test_chan
10900 6e 65 6c 20 6e 61 74 69 76 65 0d 0a 0d 0a 20 20  nel native....  
10910 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
10920 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 69   # NOTE: Check i
10930 66 20 74 68 65 20 74 65 73 74 20 73 75 69 74 65  f the test suite
10940 20 73 68 6f 75 6c 64 20 63 6f 75 6e 74 20 74 68   should count th
10950 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6e 6e  e number of conn
10960 65 63 74 69 6f 6e 73 0d 0a 20 20 20 20 20 20 20  ections..       
10970 20 23 20 20 20 20 20 20 20 22 6f 70 65 6e 65 64   #       "opened
10980 22 20 61 6e 64 20 22 63 6c 6f 73 65 64 22 20 66  " and "closed" f
10990 72 6f 6d 20 74 68 65 20 70 6f 6f 6c 20 77 68 65  rom the pool whe
109a0 6e 20 64 65 74 65 72 6d 69 6e 69 6e 67 20 69 66  n determining if
109b0 20 61 20 74 65 73 74 0d 0a 20 20 20 20 20 20 20   a test..       
109c0 20 23 20 20 20 20 20 20 20 70 61 73 73 65 64 2e   #       passed.
109d0 20 20 44 69 73 61 62 6c 69 6e 67 20 74 68 69 73    Disabling this
109e0 20 62 65 68 61 76 69 6f 72 20 69 73 20 73 6f 6d   behavior is som
109f0 65 74 69 6d 65 73 20 6e 65 63 65 73 73 61 72 79  etimes necessary
10a00 20 28 65 2e 67 2e 0d 0a 20 20 20 20 20 20 20 20   (e.g...        
10a10 23 20 20 20 20 20 20 20 64 75 72 69 6e 67 20 74  #       during t
10a20 68 65 20 72 65 6c 65 61 73 65 20 74 65 73 74 69  he release testi
10a30 6e 67 20 70 72 6f 63 65 73 73 29 20 62 65 63 61  ng process) beca
10a40 75 73 65 20 74 68 65 72 65 20 61 72 65 20 73 65  use there are se
10a50 76 65 72 61 6c 0d 0a 20 20 20 20 20 20 20 20 23  veral..        #
10a60 20 20 20 20 20 20 20 74 65 73 74 73 20 74 68 61         tests tha
10a70 74 20 72 65 6c 79 20 6f 6e 20 74 68 65 20 22 6f  t rely on the "o
10a80 70 65 6e 65 64 20 66 72 6f 6d 20 70 6f 6f 6c 22  pened from pool"
10a90 20 63 6f 75 6e 74 20 62 65 69 6e 67 20 67 72 65   count being gre
10aa0 61 74 65 72 0d 0a 20 20 20 20 20 20 20 20 23 20  ater..        # 
10ab0 20 20 20 20 20 20 74 68 61 6e 20 7a 65 72 6f 2e        than zero.
10ac0 20 20 54 68 65 73 65 20 74 65 73 74 73 20 6d 61    These tests ma
10ad0 79 20 66 61 69 6c 20 64 75 65 20 74 6f 20 74 68  y fail due to th
10ae0 65 20 6e 6f 6e 2d 64 65 74 65 72 6d 69 6e 69 73  e non-determinis
10af0 74 69 63 0d 0a 20 20 20 20 20 20 20 20 23 20 20  tic..        #  
10b00 20 20 20 20 20 62 65 68 61 76 69 6f 72 20 6f 66       behavior of
10b10 20 74 68 65 20 43 4c 52 20 47 43 2c 20 65 76 65   the CLR GC, eve
10b20 6e 20 77 68 65 6e 20 74 68 65 72 65 20 69 73 20  n when there is 
10b30 6e 6f 20 62 75 67 20 69 6e 20 74 68 65 20 63 6f  no bug in the co
10b40 64 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  de..        #   
10b50 20 20 20 20 62 65 69 6e 67 20 74 65 73 74 65 64      being tested
10b60 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
10b70 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72 52 75        checkForRu
10b80 6e 74 69 6d 65 4f 70 74 69 6f 6e 20 24 3a 3a 74  ntimeOption $::t
10b90 65 73 74 5f 63 68 61 6e 6e 65 6c 20 6e 6f 50 6f  est_channel noPo
10ba0 6f 6c 43 6f 75 6e 74 73 0d 0a 0d 0a 20 20 20 20  olCounts....    
10bb0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
10bc0 20 4e 4f 54 45 3a 20 52 65 70 6f 72 74 20 74 68   NOTE: Report th
10bd0 65 20 72 65 73 6f 75 72 63 65 20 75 73 61 67 65  e resource usage
10be0 20 70 72 69 6f 72 20 74 6f 20 72 75 6e 6e 69 6e   prior to runnin
10bf0 67 20 61 6e 79 20 74 65 73 74 73 2e 0d 0a 20 20  g any tests...  
10c00 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
10c10 20 72 65 70 6f 72 74 53 51 4c 69 74 65 52 65 73   reportSQLiteRes
10c20 6f 75 72 63 65 73 20 24 3a 3a 74 65 73 74 5f 63  ources $::test_c
10c30 68 61 6e 6e 65 6c 0d 0a 0d 0a 20 20 20 20 20 20  hannel....      
10c40 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
10c50 4f 54 45 3a 20 53 68 6f 77 20 74 68 65 20 61 63  OTE: Show the ac
10c60 74 69 76 65 20 74 65 73 74 20 63 6f 6e 73 74 72  tive test constr
10c70 61 69 6e 74 73 2e 0d 0a 20 20 20 20 20 20 20 20  aints...        
10c80 23 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73  #..        tputs
10c90 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
10ca0 20 5b 61 70 70 65 6e 64 41 72 67 73 20 22 2d 2d   [appendArgs "--
10cb0 2d 2d 20 63 6f 6e 73 74 72 61 69 6e 74 73 3a 20  -- constraints: 
10cc0 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  " \..           
10cd0 20 5b 66 6f 72 6d 61 74 4c 69 73 74 20 5b 6c 73   [formatList [ls
10ce0 6f 72 74 20 5b 67 65 74 43 6f 6e 73 74 72 61 69  ort [getConstrai
10cf0 6e 74 73 5d 5d 5d 20 5c 6e 5d 0d 0a 0d 0a 20 20  nts]]] \n]....  
10d00 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
10d10 20 23 20 4e 4f 54 45 3a 20 53 61 76 65 20 74 68   # NOTE: Save th
10d20 65 20 74 65 73 74 20 63 6f 6e 73 74 72 61 69 6e  e test constrain
10d30 74 73 20 66 6f 72 20 75 73 65 20 62 79 20 74 68  ts for use by th
10d40 72 65 61 64 73 20 63 72 65 61 74 65 64 20 69 6e  reads created in
10d50 20 74 68 69 73 0d 0a 20 20 20 20 20 20 20 20 23   this..        #
10d60 20 20 20 20 20 20 20 61 70 70 6c 69 63 61 74 69         applicati
10d70 6f 6e 20 64 6f 6d 61 69 6e 2e 20 20 54 68 69 73  on domain.  This
10d80 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 62 65   is necessary be
10d90 63 61 75 73 65 20 61 6c 6c 20 74 68 65 20 45 61  cause all the Ea
10da0 67 6c 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20  gle..        #  
10db0 20 20 20 20 20 22 74 65 73 74 20 63 6f 6e 74 65       "test conte
10dc0 78 74 22 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  xt" information 
10dd0 69 73 20 70 65 72 2d 74 68 72 65 61 64 2e 0d 0a  is per-thread...
10de0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
10df0 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78     if {![info ex
10e00 69 73 74 73 20 3a 3a 74 65 73 74 5f 63 6f 6e 73  ists ::test_cons
10e10 74 72 61 69 6e 74 73 5d 7d 20 74 68 65 6e 20 7b  traints]} then {
10e20 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20  ..          set 
10e30 3a 3a 74 65 73 74 5f 63 6f 6e 73 74 72 61 69 6e  ::test_constrain
10e40 74 73 20 24 3a 3a 65 61 67 6c 65 5f 74 65 73 74  ts $::eagle_test
10e50 73 28 63 6f 6e 73 74 72 61 69 6e 74 73 29 0d 0a  s(constraints)..
10e60 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
10e70 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
10e80 23 20 4e 4f 54 45 3a 20 4c 6f 61 64 20 74 68 65  # NOTE: Load the
10e90 20 22 61 66 74 65 72 2d 63 6f 6e 73 74 72 61 69   "after-constrai
10ea0 6e 74 73 22 20 63 75 73 74 6f 6d 20 70 65 72 2d  nts" custom per-
10eb0 75 73 65 72 20 61 6e 64 2f 6f 72 20 70 65 72 2d  user and/or per-
10ec0 68 6f 73 74 0d 0a 20 20 20 20 20 20 20 20 23 20  host..        # 
10ed0 20 20 20 20 20 20 74 65 73 74 20 73 65 74 74 69        test setti
10ee0 6e 67 73 20 6e 6f 77 2e 0d 0a 20 20 20 20 20 20  ngs now...      
10ef0 20 20 23 0d 0a 20 20 20 20 20 20 20 20 75 70 6c    #..        upl
10f00 65 76 65 6c 20 31 20 5b 6c 69 73 74 20 6c 6f 61  evel 1 [list loa
10f10 64 53 51 4c 69 74 65 54 65 73 74 53 65 74 74 69  dSQLiteTestSetti
10f20 6e 67 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  ngs $::test_chan
10f30 6e 65 6c 20 2e 61 66 74 65 72 5d 0d 0a 0d 0a 20  nel .after].... 
10f40 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
10f50 20 20 23 20 4e 4f 54 45 3a 20 53 68 6f 77 20 77    # NOTE: Show w
10f60 68 65 6e 20 6f 75 72 20 74 65 73 74 73 20 61 63  hen our tests ac
10f70 74 75 61 6c 6c 79 20 62 65 67 61 6e 20 28 6e 6f  tually began (no
10f80 77 29 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  w)...        #..
10f90 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
10fa0 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61  :test_channel [a
10fb0 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
10fc0 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 53           "---- S
10fd0 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
10fe0 65 20 74 65 73 74 73 20 62 65 67 61 6e 20 61 74  e tests began at
10ff0 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20   " \..          
11000 20 20 5b 63 6c 6f 63 6b 20 66 6f 72 6d 61 74 20    [clock format 
11010 5b 63 6c 6f 63 6b 20 73 65 63 6f 6e 64 73 5d 5d  [clock seconds]]
11020 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20   \n]..      }.. 
11030 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
11040 63 20 72 75 6e 53 51 4c 69 74 65 54 65 73 74 45  c runSQLiteTestE
11050 70 69 6c 6f 67 75 65 20 7b 7d 20 7b 0d 0a 20 20  pilogue {} {..  
11060 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
11070 4f 54 45 3a 20 53 6b 69 70 20 72 75 6e 6e 69 6e  OTE: Skip runnin
11080 67 20 6f 75 72 20 63 75 73 74 6f 6d 20 65 70 69  g our custom epi
11090 6c 6f 67 75 65 20 69 66 20 74 68 65 20 6d 61 69  logue if the mai
110a0 6e 20 6f 6e 65 20 68 61 73 20 62 65 65 6e 0d 0a  n one has been..
110b0 20 20 20 20 20 20 23 20 20 20 20 20 20 20 73 6b        #       sk
110c0 69 70 70 65 64 2e 0d 0a 20 20 20 20 20 20 23 0d  ipped...      #.
110d0 0a 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66  .      if {![inf
110e0 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 65 70  o exists ::no(ep
110f0 69 6c 6f 67 75 65 2e 65 61 67 6c 65 29 5d 7d 20  ilogue.eagle)]} 
11100 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
11110 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
11120 45 3a 20 53 68 6f 77 20 77 68 65 6e 20 6f 75 72  E: Show when our
11130 20 74 65 73 74 73 20 61 63 74 75 61 6c 6c 79 20   tests actually 
11140 65 6e 64 65 64 20 28 6e 6f 77 29 2e 0d 0a 20 20  ended (now)...  
11150 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
11160 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
11170 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
11180 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
11190 20 20 22 2d 2d 2d 2d 20 53 79 73 74 65 6d 2e 44    "---- System.D
111a0 61 74 61 2e 53 51 4c 69 74 65 20 74 65 73 74 73  ata.SQLite tests
111b0 20 65 6e 64 65 64 20 61 74 20 22 20 5c 0d 0a 20   ended at " \.. 
111c0 20 20 20 20 20 20 20 20 20 20 20 5b 63 6c 6f 63             [cloc
111d0 6b 20 66 6f 72 6d 61 74 20 5b 63 6c 6f 63 6b 20  k format [clock 
111e0 73 65 63 6f 6e 64 73 5d 5d 20 5c 6e 5d 0d 0a 0d  seconds]] \n]...
111f0 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
11200 20 20 20 20 23 20 42 55 47 46 49 58 3a 20 42 65      # BUGFIX: Be
11210 66 6f 72 65 20 63 68 65 63 6b 69 6e 67 20 74 68  fore checking th
11220 65 20 66 69 6e 61 6c 20 72 65 73 6f 75 72 63 65  e final resource
11230 73 20 69 6e 20 75 73 65 20 62 79 20 53 51 4c 69  s in use by SQLi
11240 74 65 2c 20 6d 61 6b 65 0d 0a 20 20 20 20 20 20  te, make..      
11250 20 20 23 20 20 20 20 20 20 20 20 20 73 75 72 65    #         sure
11260 20 62 6f 74 68 20 6f 66 20 74 68 65 20 50 52 41   both of the PRA
11270 47 4d 41 20 72 65 6c 61 74 65 64 20 64 69 72 65  GMA related dire
11280 63 74 6f 72 79 20 6e 61 6d 65 73 20 61 72 65 20  ctory names are 
11290 66 72 65 65 64 2e 0d 0a 20 20 20 20 20 20 20 20  freed...        
112a0 23 0d 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b  #..        check
112b0 46 6f 72 53 51 4c 69 74 65 44 69 72 65 63 74 6f  ForSQLiteDirecto
112c0 72 69 65 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  ries $::test_cha
112d0 6e 6e 65 6c 20 74 72 75 65 0d 0a 0d 0a 20 20 20  nnel true....   
112e0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
112f0 23 20 4e 4f 54 45 3a 20 41 6c 73 6f 20 72 65 70  # NOTE: Also rep
11300 6f 72 74 20 74 68 65 20 72 65 73 6f 75 72 63 65  ort the resource
11310 20 75 73 61 67 65 20 61 66 74 65 72 20 72 75 6e   usage after run
11320 6e 69 6e 67 20 74 68 65 20 74 65 73 74 73 2e 0d  ning the tests..
11330 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
11340 20 20 20 20 72 65 70 6f 72 74 53 51 4c 69 74 65      reportSQLite
11350 52 65 73 6f 75 72 63 65 73 20 24 3a 3a 74 65 73  Resources $::tes
11360 74 5f 63 68 61 6e 6e 65 6c 0d 0a 20 20 20 20 20  t_channel..     
11370 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20   }..    }.....  
11380 20 20 23 23 23 23 23 23 23 23 23 23 23 23 23 23    ##############
11390 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
113a0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
113b0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
113c0 23 23 23 23 23 23 23 23 23 23 23 23 23 0d 0a 20  #############.. 
113d0 20 20 20 23 23 23 23 23 23 23 23 23 23 23 23 23     #############
113e0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
113f0 20 45 4e 44 20 45 61 67 6c 65 20 4f 4e 4c 59 20   END Eagle ONLY 
11400 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
11410 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0d 0a  ##############..
11420 20 20 20 20 23 23 23 23 23 23 23 23 23 23 23 23      ############
11430 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
11440 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
11450 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
11460 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0d  ###############.
11470 0a 20 20 7d 0d 0a 0d 0a 20 20 23 0d 0a 20 20 23  .  }....  #..  #
11480 20 4e 4f 54 45 3a 20 53 61 76 65 20 74 68 65 20   NOTE: Save the 
11490 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 69 72 65  name of the dire
114a0 63 74 6f 72 79 20 63 6f 6e 74 61 69 6e 69 6e 67  ctory containing
114b0 20 74 68 69 73 20 66 69 6c 65 2e 0d 0a 20 20 23   this file...  #
114c0 0d 0a 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65  ..  if {![info e
114d0 78 69 73 74 73 20 3a 3a 63 6f 6d 6d 6f 6e 5f 64  xists ::common_d
114e0 69 72 65 63 74 6f 72 79 5d 7d 20 74 68 65 6e 20  irectory]} then 
114f0 7b 0d 0a 20 20 20 20 73 65 74 20 3a 3a 63 6f 6d  {..    set ::com
11500 6d 6f 6e 5f 64 69 72 65 63 74 6f 72 79 20 5b 66  mon_directory [f
11510 69 6c 65 20 64 69 72 6e 61 6d 65 20 5b 69 6e 66  ile dirname [inf
11520 6f 20 73 63 72 69 70 74 5d 5d 0d 0a 20 20 7d 0d  o script]]..  }.
11530 0a 0d 0a 20 20 23 0d 0a 20 20 23 20 4e 4f 54 45  ...  #..  # NOTE
11540 3a 20 50 72 6f 76 69 64 65 20 74 68 65 20 53 79  : Provide the Sy
11550 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
11560 20 74 65 73 74 20 70 61 63 6b 61 67 65 20 74 6f   test package to
11570 20 74 68 65 20 69 6e 74 65 72 70 72 65 74 65 72   the interpreter
11580 2e 0d 0a 20 20 23 0d 0a 20 20 70 61 63 6b 61 67  ...  #..  packag
11590 65 20 70 72 6f 76 69 64 65 20 53 79 73 74 65 6d  e provide System
115a0 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 54 65 73  .Data.SQLite.Tes
115b0 74 20 31 2e 30 0d 0a 7d 0d 0a                    t 1.0..}..