System.Data.SQLite
Hex Artifact Content
Not logged in

Artifact 128ec32ef2a9698401ac6c149bec5d456547b47f:


0000: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0010: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0020: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0030: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0040: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0d  ###############.
0050: 0a 23 0d 0a 23 20 63 6f 6d 6d 6f 6e 2e 65 61 67  .#..# common.eag
0060: 6c 65 20 2d 2d 0d 0a 23 0d 0a 23 20 57 72 69 74  le --..#..# Writ
0070: 74 65 6e 20 62 79 20 4a 6f 65 20 4d 69 73 74 61  ten by Joe Mista
0080: 63 68 6b 69 6e 2e 0d 0a 23 20 52 65 6c 65 61 73  chkin...# Releas
0090: 65 64 20 74 6f 20 74 68 65 20 70 75 62 6c 69 63  ed to the public
00a0: 20 64 6f 6d 61 69 6e 2c 20 75 73 65 20 61 74 20   domain, use at 
00b0: 79 6f 75 72 20 6f 77 6e 20 72 69 73 6b 21 0d 0a  your own risk!..
00c0: 23 0d 0a 23 23 23 23 23 23 23 23 23 23 23 23 23  #..#############
00d0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
00e0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
00f0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0100: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0110: 23 23 0d 0a 0d 0a 23 0d 0a 23 20 4e 4f 54 45 3a  ##....#..# NOTE:
0120: 20 55 73 65 20 6f 75 72 20 6f 77 6e 20 6e 61 6d   Use our own nam
0130: 65 73 70 61 63 65 20 68 65 72 65 20 62 65 63 61  espace here beca
0140: 75 73 65 20 65 76 65 6e 20 74 68 6f 75 67 68 20  use even though 
0150: 77 65 20 64 6f 20 6e 6f 74 20 64 69 72 65 63 74  we do not direct
0160: 6c 79 0d 0a 23 20 20 20 20 20 20 20 73 75 70 70  ly..#       supp
0170: 6f 72 74 20 6e 61 6d 65 73 70 61 63 65 73 20 6f  ort namespaces o
0180: 75 72 73 65 6c 76 65 73 2c 20 77 65 20 64 6f 20  urselves, we do 
0190: 6e 6f 74 20 77 61 6e 74 20 74 6f 20 70 6f 6c 6c  not want to poll
01a0: 75 74 65 20 74 68 65 20 67 6c 6f 62 61 6c 0d 0a  ute the global..
01b0: 23 20 20 20 20 20 20 20 6e 61 6d 65 73 70 61 63  #       namespac
01c0: 65 20 69 66 20 74 68 69 73 20 73 63 72 69 70 74  e if this script
01d0: 20 61 63 74 75 61 6c 6c 79 20 65 6e 64 73 20 75   actually ends u
01e0: 70 20 62 65 69 6e 67 20 65 76 61 6c 75 61 74 65  p being evaluate
01f0: 64 20 69 6e 20 54 63 6c 2e 0d 0a 23 0d 0a 6e 61  d in Tcl...#..na
0200: 6d 65 73 70 61 63 65 20 65 76 61 6c 20 3a 3a 45  mespace eval ::E
0210: 61 67 6c 65 20 7b 0d 0a 20 20 69 66 20 7b 5b 69  agle {..  if {[i
0220: 73 45 61 67 6c 65 5d 7d 20 74 68 65 6e 20 7b 0d  sEagle]} then {.
0230: 0a 20 20 20 20 23 23 23 23 23 23 23 23 23 23 23  .    ###########
0240: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0250: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0260: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0270: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0280: 0d 0a 20 20 20 20 23 23 23 23 23 23 23 23 23 23  ..    ##########
0290: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
02a0: 23 23 20 42 45 47 49 4e 20 45 61 67 6c 65 20 4f  ## BEGIN Eagle O
02b0: 4e 4c 59 20 23 23 23 23 23 23 23 23 23 23 23 23  NLY ############
02c0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
02d0: 23 0d 0a 20 20 20 20 23 23 23 23 23 23 23 23 23  #..    #########
02e0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
02f0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0300: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0310: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0320: 23 23 0d 0a 0d 0a 20 20 20 20 70 72 6f 63 20 67  ##....    proc g
0330: 65 74 42 75 69 6c 64 59 65 61 72 20 7b 7d 20 7b  etBuildYear {} {
0340: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
0350: 20 23 20 4e 4f 54 45 3a 20 53 65 65 20 69 66 20   # NOTE: See if 
0360: 74 68 65 20 22 79 65 61 72 22 20 73 65 74 74 69  the "year" setti
0370: 6e 67 20 68 61 73 20 62 65 65 6e 20 6f 76 65 72  ng has been over
0380: 72 69 64 64 65 6e 20 62 79 20 74 68 65 20 75 73  ridden by the us
0390: 65 72 20 28 65 2e 67 2e 0d 0a 20 20 20 20 20 20  er (e.g...      
03a0: 23 20 20 20 20 20 20 20 6f 6e 20 74 68 65 20 63  #       on the c
03b0: 6f 6d 6d 61 6e 64 20 6c 69 6e 65 29 2e 20 20 54  ommand line).  T
03c0: 68 69 73 20 68 65 6c 70 73 20 63 6f 6e 74 72 6f  his helps contro
03d0: 6c 20 65 78 61 63 74 6c 79 20 77 68 69 63 68 20  l exactly which 
03e0: 73 65 74 20 6f 66 0d 0a 20 20 20 20 20 20 23 20  set of..      # 
03f0: 20 20 20 20 20 20 62 69 6e 61 72 69 65 73 20 77        binaries w
0400: 65 20 61 72 65 20 74 65 73 74 69 6e 67 2c 20 74  e are testing, t
0410: 68 6f 73 65 20 70 72 6f 64 75 63 65 64 20 75 73  hose produced us
0420: 69 6e 67 20 74 68 65 20 56 69 73 75 61 6c 20 53  ing the Visual S
0430: 74 75 64 69 6f 0d 0a 20 20 20 20 20 20 23 20 20  tudio..      #  
0440: 20 20 20 20 20 32 30 30 35 2c 20 32 30 30 38 2c       2005, 2008,
0450: 20 32 30 31 30 2c 20 6f 72 20 32 30 31 32 20 62   2010, or 2012 b
0460: 75 69 6c 64 20 73 79 73 74 65 6d 73 2e 20 20 54  uild systems.  T
0470: 6f 20 6f 76 65 72 72 69 64 65 20 74 68 69 73 20  o override this 
0480: 76 61 6c 75 65 0d 0a 20 20 20 20 20 20 23 20 20  value..      #  
0490: 20 20 20 20 20 76 69 61 20 74 68 65 20 63 6f 6d       via the com
04a0: 6d 61 6e 64 20 6c 69 6e 65 2c 20 65 6e 74 65 72  mand line, enter
04b0: 20 61 20 63 6f 6d 6d 61 6e 64 20 73 69 6d 69 6c   a command simil
04c0: 61 72 20 74 6f 20 6f 6e 65 20 6f 66 20 74 68 65  ar to one of the
04d0: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
04e0: 66 6f 6c 6c 6f 77 69 6e 67 20 28 61 6c 6c 20 6f  following (all o
04f0: 6e 20 6f 6e 65 20 6c 69 6e 65 29 3a 0d 0a 20 20  n one line):..  
0500: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 20      #..      #  
0510: 20 20 20 20 20 45 61 67 6c 65 53 68 65 6c 6c 2e       EagleShell.
0520: 65 78 65 20 2d 70 72 65 49 6e 69 74 69 61 6c 69  exe -preInitiali
0530: 7a 65 20 22 73 65 74 20 74 65 73 74 5f 79 65 61  ze "set test_yea
0540: 72 20 32 30 30 35 22 0d 0a 20 20 20 20 20 20 23  r 2005"..      #
0550: 20 20 20 20 20 20 20 20 20 2d 66 69 6c 65 20 2e           -file .
0560: 5c 70 61 74 68 5c 74 6f 5c 61 6c 6c 2e 65 61 67  \path\to\all.eag
0570: 6c 65 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  le..      #..   
0580: 20 20 20 23 20 20 20 20 20 20 20 45 61 67 6c 65     #       Eagle
0590: 53 68 65 6c 6c 2e 65 78 65 20 2d 70 72 65 49 6e  Shell.exe -preIn
05a0: 69 74 69 61 6c 69 7a 65 20 22 73 65 74 20 74 65  itialize "set te
05b0: 73 74 5f 79 65 61 72 20 32 30 30 38 22 0d 0a 20  st_year 2008".. 
05c0: 20 20 20 20 20 23 20 20 20 20 20 20 20 20 20 2d       #         -
05d0: 66 69 6c 65 20 2e 5c 70 61 74 68 5c 74 6f 5c 61  file .\path\to\a
05e0: 6c 6c 2e 65 61 67 6c 65 0d 0a 20 20 20 20 20 20  ll.eagle..      
05f0: 23 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  #..      #      
0600: 20 45 61 67 6c 65 53 68 65 6c 6c 2e 65 78 65 20   EagleShell.exe 
0610: 2d 70 72 65 49 6e 69 74 69 61 6c 69 7a 65 20 22  -preInitialize "
0620: 73 65 74 20 74 65 73 74 5f 79 65 61 72 20 32 30  set test_year 20
0630: 31 30 22 0d 0a 20 20 20 20 20 20 23 20 20 20 20  10"..      #    
0640: 20 20 20 20 20 2d 66 69 6c 65 20 2e 5c 70 61 74       -file .\pat
0650: 68 5c 74 6f 5c 61 6c 6c 2e 65 61 67 6c 65 0d 0a  h\to\all.eagle..
0660: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
0670: 20 20 20 20 20 20 20 45 61 67 6c 65 53 68 65 6c         EagleShel
0680: 6c 2e 65 78 65 20 2d 70 72 65 49 6e 69 74 69 61  l.exe -preInitia
0690: 6c 69 7a 65 20 22 73 65 74 20 74 65 73 74 5f 79  lize "set test_y
06a0: 65 61 72 20 32 30 31 32 22 0d 0a 20 20 20 20 20  ear 2012"..     
06b0: 20 23 20 20 20 20 20 20 20 20 20 2d 66 69 6c 65   #         -file
06c0: 20 2e 5c 70 61 74 68 5c 74 6f 5c 61 6c 6c 2e 65   .\path\to\all.e
06d0: 61 67 6c 65 0d 0a 20 20 20 20 20 20 23 0d 0a 20  agle..      #.. 
06e0: 20 20 20 20 20 23 20 20 20 20 20 20 20 45 61 67       #       Eag
06f0: 6c 65 53 68 65 6c 6c 2e 65 78 65 20 2d 70 72 65  leShell.exe -pre
0700: 49 6e 69 74 69 61 6c 69 7a 65 20 22 75 6e 73 65  Initialize "unse
0710: 74 20 2d 6e 6f 63 6f 6d 70 6c 61 69 6e 20 74 65  t -nocomplain te
0720: 73 74 5f 79 65 61 72 22 0d 0a 20 20 20 20 20 20  st_year"..      
0730: 23 20 20 20 20 20 20 20 20 20 2d 66 69 6c 65 20  #         -file 
0740: 2e 5c 70 61 74 68 5c 74 6f 5c 61 6c 6c 2e 65 61  .\path\to\all.ea
0750: 67 6c 65 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  gle..      #..  
0760: 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78      if {[info ex
0770: 69 73 74 73 20 3a 3a 74 65 73 74 5f 79 65 61 72  ists ::test_year
0780: 5d 20 26 26 20 5b 73 74 72 69 6e 67 20 6c 65 6e  ] && [string len
0790: 67 74 68 20 24 3a 3a 74 65 73 74 5f 79 65 61 72  gth $::test_year
07a0: 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20  ] > 0} then {.. 
07b0: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
07c0: 20 20 23 20 4e 4f 54 45 3a 20 55 73 65 20 74 68    # NOTE: Use th
07d0: 65 20 73 70 65 63 69 66 69 65 64 20 74 65 73 74  e specified test
07e0: 20 79 65 61 72 2e 20 20 49 66 20 74 68 69 73 20   year.  If this 
07f0: 76 61 72 69 61 62 6c 65 20 69 73 20 6e 6f 74 20  variable is not 
0800: 73 65 74 2c 20 74 68 65 0d 0a 20 20 20 20 20 20  set, the..      
0810: 20 20 23 20 20 20 20 20 20 20 64 65 66 61 75 6c    #       defaul
0820: 74 20 76 61 6c 75 65 20 77 69 6c 6c 20 62 65 20  t value will be 
0830: 62 61 73 65 64 20 6f 6e 20 77 68 65 74 68 65 72  based on whether
0840: 20 6f 72 20 6e 6f 74 20 45 61 67 6c 65 20 68 61   or not Eagle ha
0850: 73 20 62 65 65 6e 0d 0a 20 20 20 20 20 20 20 20  s been..        
0860: 23 20 20 20 20 20 20 20 63 6f 6d 70 69 6c 65 64  #       compiled
0870: 20 61 67 61 69 6e 73 74 20 74 68 65 20 43 4c 52   against the CLR
0880: 20 76 32 2e 30 20 6f 72 20 43 4c 52 20 76 34 2e   v2.0 or CLR v4.
0890: 30 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  0...        #.. 
08a0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 3a         return $:
08b0: 3a 74 65 73 74 5f 79 65 61 72 0d 0a 20 20 20 20  :test_year..    
08c0: 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
08d0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
08e0: 20 4e 4f 54 45 3a 20 49 66 20 45 61 67 6c 65 20   NOTE: If Eagle 
08f0: 68 61 73 20 62 65 65 6e 20 63 6f 6d 70 69 6c 65  has been compile
0900: 64 20 61 67 61 69 6e 73 74 20 74 68 65 20 43 4c  d against the CL
0910: 52 20 76 34 2e 30 2c 20 75 73 65 20 22 32 30 31  R v4.0, use "201
0920: 30 22 20 62 79 0d 0a 20 20 20 20 20 20 20 20 23  0" by..        #
0930: 20 20 20 20 20 20 20 64 65 66 61 75 6c 74 20 28         default (
0940: 77 65 20 63 6f 75 6c 64 20 75 73 65 20 22 32 30  we could use "20
0950: 31 32 22 20 69 6e 20 74 68 61 74 20 63 61 73 65  12" in that case
0960: 20 61 73 20 77 65 6c 6c 29 20 61 73 20 74 68 65   as well) as the
0970: 20 74 65 73 74 0d 0a 20 20 20 20 20 20 20 20 23   test..        #
0980: 20 20 20 20 20 20 20 79 65 61 72 3b 20 6f 74 68         year; oth
0990: 65 72 77 69 73 65 2c 20 75 73 65 20 22 32 30 30  erwise, use "200
09a0: 38 22 20 62 79 20 64 65 66 61 75 6c 74 20 28 77  8" by default (w
09b0: 65 20 63 6f 75 6c 64 20 75 73 65 20 22 32 30 30  e could use "200
09c0: 35 22 20 69 6e 0d 0a 20 20 20 20 20 20 20 20 23  5" in..        #
09d0: 20 20 20 20 20 20 20 74 68 61 74 20 63 61 73 65         that case
09e0: 20 61 73 20 77 65 6c 6c 29 2e 20 20 49 66 20 61   as well).  If a
09f0: 6e 6f 74 68 65 72 20 6d 61 6a 6f 72 20 5b 69 6e  nother major [in
0a00: 63 6f 6d 70 61 74 69 62 6c 65 5d 20 76 65 72 73  compatible] vers
0a10: 69 6f 6e 20 6f 66 0d 0a 20 20 20 20 20 20 20 20  ion of..        
0a20: 23 20 20 20 20 20 20 20 74 68 65 20 43 4c 52 20  #       the CLR 
0a30: 69 73 20 72 65 6c 65 61 73 65 64 2c 20 74 68 69  is released, thi
0a40: 73 20 63 68 65 63 6b 20 77 69 6c 6c 20 68 61 76  s check will hav
0a50: 65 20 74 6f 20 62 65 20 63 68 61 6e 67 65 64 2e  e to be changed.
0a60: 20 20 54 68 65 0d 0a 20 20 20 20 20 20 20 20 23    The..        #
0a70: 20 20 20 20 20 20 20 64 65 66 61 75 6c 74 20 74         default t
0a80: 65 73 74 20 79 65 61 72 20 74 6f 20 75 73 65 20  est year to use 
0a90: 66 6f 72 20 61 20 70 61 72 74 69 63 75 6c 61 72  for a particular
0aa0: 20 43 4c 52 20 76 65 72 73 69 6f 6e 20 6d 61 79   CLR version may
0ab0: 20 62 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20   be..        #  
0ac0: 20 20 20 20 20 6f 76 65 72 72 69 64 64 65 6e 20       overridden 
0ad0: 62 79 20 73 65 74 74 69 6e 67 20 74 68 65 20 67  by setting the g
0ae0: 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20 22  lobal variable "
0af0: 74 65 73 74 5f 79 65 61 72 5f 63 6c 72 5f 76 24  test_year_clr_v$
0b00: 58 22 2c 0d 0a 20 20 20 20 20 20 20 20 23 20 20  X",..        #  
0b10: 20 20 20 20 20 77 68 65 72 65 20 22 24 58 22 20       where "$X" 
0b20: 6d 61 79 20 5b 63 75 72 72 65 6e 74 6c 79 5d 20  may [currently] 
0b30: 62 65 20 65 69 74 68 65 72 20 22 32 22 20 6f 72  be either "2" or
0b40: 20 22 34 22 2e 0d 0a 20 20 20 20 20 20 20 20 23   "4"...        #
0b50: 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 68  ..        if {[h
0b60: 61 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 69 6d  aveConstraint im
0b70: 61 67 65 52 75 6e 74 69 6d 65 34 30 5d 7d 20 74  ageRuntime40]} t
0b80: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
0b90: 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74   if {[info exist
0ba0: 73 20 3a 3a 74 65 73 74 5f 79 65 61 72 5f 63 6c  s ::test_year_cl
0bb0: 72 5f 76 34 5d 20 26 26 20 5c 0d 0a 20 20 20 20  r_v4] && \..    
0bc0: 20 20 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e            [strin
0bd0: 67 20 6c 65 6e 67 74 68 20 24 3a 3a 74 65 73 74  g length $::test
0be0: 5f 79 65 61 72 5f 63 6c 72 5f 76 34 5d 20 3e 20  _year_clr_v4] > 
0bf0: 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
0c00: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
0c10: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 55 73        # NOTE: Us
0c20: 65 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  e the specified 
0c30: 74 65 73 74 20 79 65 61 72 20 66 6f 72 20 74 68  test year for th
0c40: 65 20 43 4c 52 20 76 34 2e 30 2e 0d 0a 20 20 20  e CLR v4.0...   
0c50: 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
0c60: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 24          return $
0c70: 3a 3a 74 65 73 74 5f 79 65 61 72 5f 63 6c 72 5f  ::test_year_clr_
0c80: 76 34 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 20  v4..          } 
0c90: 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
0ca0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
0cb0: 20 20 20 23 20 4e 4f 54 45 3a 20 55 73 65 20 74     # NOTE: Use t
0cc0: 68 65 20 64 65 66 61 75 6c 74 20 74 65 73 74 20  he default test 
0cd0: 79 65 61 72 20 66 6f 72 20 74 68 65 20 43 4c 52  year for the CLR
0ce0: 20 76 34 2e 30 2e 0d 0a 20 20 20 20 20 20 20 20   v4.0...        
0cf0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
0d00: 20 20 20 72 65 74 75 72 6e 20 32 30 31 30 3b 20     return 2010; 
0d10: 23 20 54 4f 44 4f 3a 20 47 6f 6f 64 20 22 66 61  # TODO: Good "fa
0d20: 6c 6c 62 61 63 6b 22 20 64 65 66 61 75 6c 74 3f  llback" default?
0d30: 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20  ..          }.. 
0d40: 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d         } else {.
0d50: 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b  .          if {[
0d60: 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 74 65  info exists ::te
0d70: 73 74 5f 79 65 61 72 5f 63 6c 72 5f 76 32 5d 20  st_year_clr_v2] 
0d80: 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  && \..          
0d90: 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67      [string leng
0da0: 74 68 20 24 3a 3a 74 65 73 74 5f 79 65 61 72 5f  th $::test_year_
0db0: 63 6c 72 5f 76 32 5d 20 3e 20 30 7d 20 74 68 65  clr_v2] > 0} the
0dc0: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
0dd0: 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   #..            
0de0: 23 20 4e 4f 54 45 3a 20 55 73 65 20 74 68 65 20  # NOTE: Use the 
0df0: 73 70 65 63 69 66 69 65 64 20 74 65 73 74 20 79  specified test y
0e00: 65 61 72 20 66 6f 72 20 74 68 65 20 43 4c 52 20  ear for the CLR 
0e10: 76 32 2e 30 2e 0d 0a 20 20 20 20 20 20 20 20 20  v2.0...         
0e20: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
0e30: 20 20 72 65 74 75 72 6e 20 24 3a 3a 74 65 73 74    return $::test
0e40: 5f 79 65 61 72 5f 63 6c 72 5f 76 32 0d 0a 20 20  _year_clr_v2..  
0e50: 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b          } else {
0e60: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 0d  ..            #.
0e70: 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4e  .            # N
0e80: 4f 54 45 3a 20 55 73 65 20 74 68 65 20 64 65 66  OTE: Use the def
0e90: 61 75 6c 74 20 74 65 73 74 20 79 65 61 72 20 66  ault test year f
0ea0: 6f 72 20 74 68 65 20 43 4c 52 20 76 32 2e 30 2e  or the CLR v2.0.
0eb0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 0d  ..            #.
0ec0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74  .            ret
0ed0: 75 72 6e 20 32 30 30 38 3b 20 23 20 54 4f 44 4f  urn 2008; # TODO
0ee0: 3a 20 47 6f 6f 64 20 22 66 61 6c 6c 62 61 63 6b  : Good "fallback
0ef0: 22 20 64 65 66 61 75 6c 74 3f 0d 0a 20 20 20 20  " default?..    
0f00: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
0f10: 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20   }..      }..   
0f20: 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
0f30: 67 65 74 42 75 69 6c 64 59 65 61 72 73 20 7b 7d  getBuildYears {}
0f40: 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20   {..      #..   
0f50: 20 20 20 23 20 4e 4f 54 45 3a 20 53 65 65 20 69     # NOTE: See i
0f60: 66 20 74 68 65 20 6c 69 73 74 20 6f 66 20 74 65  f the list of te
0f70: 73 74 20 79 65 61 72 73 20 68 61 73 20 62 65 65  st years has bee
0f80: 6e 20 6f 76 65 72 72 69 64 64 65 6e 20 62 79 20  n overridden by 
0f90: 74 68 65 20 75 73 65 72 0d 0a 20 20 20 20 20 20  the user..      
0fa0: 23 20 20 20 20 20 20 20 28 65 2e 67 2e 20 6f 6e  #       (e.g. on
0fb0: 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e   the command lin
0fc0: 65 29 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  e)...      #..  
0fd0: 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78      if {[info ex
0fe0: 69 73 74 73 20 3a 3a 74 65 73 74 5f 79 65 61 72  ists ::test_year
0ff0: 73 5d 20 26 26 20 5b 6c 6c 65 6e 67 74 68 20 24  s] && [llength $
1000: 3a 3a 74 65 73 74 5f 79 65 61 72 73 5d 20 3e 20  ::test_years] > 
1010: 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
1020: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
1030: 4e 4f 54 45 3a 20 55 73 65 20 74 68 65 20 73 70  NOTE: Use the sp
1040: 65 63 69 66 69 65 64 20 6c 69 73 74 20 6f 66 20  ecified list of 
1050: 74 65 73 74 20 79 65 61 72 73 2e 0d 0a 20 20 20  test years...   
1060: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
1070: 72 65 74 75 72 6e 20 24 3a 3a 74 65 73 74 5f 79  return $::test_y
1080: 65 61 72 73 0d 0a 20 20 20 20 20 20 7d 20 65 6c  ears..      } el
1090: 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d  se {..        #.
10a0: 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
10b0: 20 55 73 65 20 74 68 65 20 64 65 66 61 75 6c 74   Use the default
10c0: 20 6c 69 73 74 20 6f 66 20 74 65 73 74 20 79 65   list of test ye
10d0: 61 72 73 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  ars...        #.
10e0: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
10f0: 5b 6c 69 73 74 20 32 30 30 35 20 32 30 30 38 20  [list 2005 2008 
1100: 32 30 31 30 20 32 30 31 32 5d 0d 0a 20 20 20 20  2010 2012]..    
1110: 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20    }..    }..... 
1120: 20 20 20 70 72 6f 63 20 67 65 74 42 75 69 6c 64     proc getBuild
1130: 50 6c 61 74 66 6f 72 6d 20 7b 20 6e 61 74 69 76  Platform { nativ
1140: 65 20 7d 20 7b 0d 0a 20 20 20 20 20 20 69 66 20  e } {..      if 
1150: 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  {[info exists ::
1160: 74 65 73 74 5f 70 6c 61 74 66 6f 72 6d 5d 20 26  test_platform] &
1170: 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b  & \..          [
1180: 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a  string length $:
1190: 3a 74 65 73 74 5f 70 6c 61 74 66 6f 72 6d 5d 20  :test_platform] 
11a0: 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  > 0} then {..   
11b0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
11c0: 23 20 4e 4f 54 45 3a 20 55 73 65 20 74 68 65 20  # NOTE: Use the 
11d0: 73 70 65 63 69 66 69 65 64 20 74 65 73 74 20 70  specified test p
11e0: 6c 61 74 66 6f 72 6d 2e 20 20 49 66 20 74 68 69  latform.  If thi
11f0: 73 20 76 61 72 69 61 62 6c 65 20 69 73 20 6e 6f  s variable is no
1200: 74 20 73 65 74 2c 0d 0a 20 20 20 20 20 20 20 20  t set,..        
1210: 23 20 20 20 20 20 20 20 74 68 65 20 64 65 66 61  #       the defa
1220: 75 6c 74 20 76 61 6c 75 65 20 77 69 6c 6c 20 62  ult value will b
1230: 65 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 6d  e based on the m
1240: 61 63 68 69 6e 65 20 61 72 63 68 69 74 65 63 74  achine architect
1250: 75 72 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  ure...        #.
1260: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
1270: 5b 65 78 70 72 20 7b 24 6e 61 74 69 76 65 20 3f  [expr {$native ?
1280: 20 24 3a 3a 74 65 73 74 5f 70 6c 61 74 66 6f 72   $::test_platfor
1290: 6d 20 3a 20 22 22 7d 5d 0d 0a 20 20 20 20 20 20  m : ""}]..      
12a0: 7d 20 65 6c 73 65 69 66 20 7b 5b 69 6e 66 6f 20  } elseif {[info 
12b0: 65 78 69 73 74 73 20 3a 3a 74 65 73 74 5f 6d 61  exists ::test_ma
12c0: 63 68 69 6e 65 5d 20 26 26 20 5c 0d 0a 20 20 20  chine] && \..   
12d0: 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c         [string l
12e0: 65 6e 67 74 68 20 24 3a 3a 74 65 73 74 5f 6d 61  ength $::test_ma
12f0: 63 68 69 6e 65 5d 20 3e 20 30 7d 20 74 68 65 6e  chine] > 0} then
1300: 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20   {..        #.. 
1310: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 46         # NOTE: F
1320: 6f 72 20 6e 61 74 69 76 65 20 62 75 69 6c 64 73  or native builds
1330: 2c 20 72 65 74 75 72 6e 20 74 68 65 20 70 6c 61  , return the pla
1340: 74 66 6f 72 6d 20 6e 61 6d 65 20 63 6f 72 72 65  tform name corre
1350: 73 70 6f 6e 64 69 6e 67 20 74 6f 0d 0a 20 20 20  sponding to..   
1360: 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68 65       #       the
1370: 20 74 65 73 74 20 6d 61 63 68 69 6e 65 20 61 72   test machine ar
1380: 63 68 69 74 65 63 74 75 72 65 3b 20 6f 74 68 65  chitecture; othe
1390: 72 77 69 73 65 2c 20 72 65 74 75 72 6e 20 61 6e  rwise, return an
13a0: 20 65 6d 70 74 79 0d 0a 20 20 20 20 20 20 20 20   empty..        
13b0: 23 20 20 20 20 20 20 20 73 74 72 69 6e 67 2e 0d  #       string..
13c0: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
13d0: 20 20 20 20 72 65 74 75 72 6e 20 5b 65 78 70 72      return [expr
13e0: 20 7b 24 6e 61 74 69 76 65 20 3f 20 5b 6d 61 63   {$native ? [mac
13f0: 68 69 6e 65 54 6f 50 6c 61 74 66 6f 72 6d 20 24  hineToPlatform $
1400: 3a 3a 74 65 73 74 5f 6d 61 63 68 69 6e 65 5d 20  ::test_machine] 
1410: 3a 20 22 22 7d 5d 0d 0a 20 20 20 20 20 20 7d 20  : ""}]..      } 
1420: 65 6c 73 65 69 66 20 7b 5b 69 6e 66 6f 20 65 78  elseif {[info ex
1430: 69 73 74 73 20 3a 3a 74 63 6c 5f 70 6c 61 74 66  ists ::tcl_platf
1440: 6f 72 6d 28 6d 61 63 68 69 6e 65 29 5d 7d 20 74  orm(machine)]} t
1450: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  hen {..        #
1460: 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
1470: 3a 20 46 6f 72 20 6e 61 74 69 76 65 20 62 75 69  : For native bui
1480: 6c 64 73 2c 20 72 65 74 75 72 6e 20 74 68 65 20  lds, return the 
1490: 70 6c 61 74 66 6f 72 6d 20 6e 61 6d 65 20 63 6f  platform name co
14a0: 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 0d 0a  rresponding to..
14b0: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
14c0: 74 68 65 20 6d 61 63 68 69 6e 65 20 61 72 63 68  the machine arch
14d0: 69 74 65 63 74 75 72 65 3b 20 6f 74 68 65 72 77  itecture; otherw
14e0: 69 73 65 2c 20 72 65 74 75 72 6e 20 61 6e 20 65  ise, return an e
14f0: 6d 70 74 79 20 73 74 72 69 6e 67 2e 0d 0a 20 20  mpty string...  
1500: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
1510: 20 72 65 74 75 72 6e 20 5b 65 78 70 72 20 7b 24   return [expr {$
1520: 6e 61 74 69 76 65 20 3f 20 5c 0d 0a 20 20 20 20  native ? \..    
1530: 20 20 20 20 20 20 20 20 5b 6d 61 63 68 69 6e 65          [machine
1540: 54 6f 50 6c 61 74 66 6f 72 6d 20 24 3a 3a 74 63  ToPlatform $::tc
1550: 6c 5f 70 6c 61 74 66 6f 72 6d 28 6d 61 63 68 69  l_platform(machi
1560: 6e 65 29 5d 20 3a 20 22 22 7d 5d 0d 0a 20 20 20  ne)] : ""}]..   
1570: 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
1580: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
1590: 23 20 4e 4f 54 45 3a 20 4e 6f 20 6d 61 63 68 69  # NOTE: No machi
15a0: 6e 65 20 61 72 63 68 69 74 65 63 74 75 72 65 20  ne architecture 
15b0: 69 73 20 61 76 61 69 6c 61 62 6c 65 2c 20 72 65  is available, re
15c0: 74 75 72 6e 20 61 6e 20 65 6d 70 74 79 20 73 74  turn an empty st
15d0: 72 69 6e 67 2e 0d 0a 20 20 20 20 20 20 20 20 23  ring...        #
15e0: 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ..        return
15f0: 20 22 22 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20   ""..      }..  
1600: 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
1610: 20 67 65 74 42 75 69 6c 64 43 6f 6e 66 69 67 75   getBuildConfigu
1620: 72 61 74 69 6f 6e 20 7b 7d 20 7b 0d 0a 20 20 20  ration {} {..   
1630: 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
1640: 54 45 3a 20 53 65 65 20 69 66 20 74 68 65 20 22  TE: See if the "
1650: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 22 20 73  configuration" s
1660: 65 74 74 69 6e 67 20 68 61 73 20 62 65 65 6e 20  etting has been 
1670: 6f 76 65 72 72 69 64 64 65 6e 20 62 79 20 74 68  overridden by th
1680: 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  e..      #      
1690: 20 75 73 65 72 20 28 65 2e 67 2e 20 6f 6e 20 74   user (e.g. on t
16a0: 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 29  he command line)
16b0: 2e 20 20 54 68 69 73 20 68 65 6c 70 73 20 63 6f  .  This helps co
16c0: 6e 74 72 6f 6c 20 65 78 61 63 74 6c 79 0d 0a 20  ntrol exactly.. 
16d0: 20 20 20 20 20 23 20 20 20 20 20 20 20 77 68 69       #       whi
16e0: 63 68 20 73 65 74 20 6f 66 20 62 69 6e 61 72 69  ch set of binari
16f0: 65 73 20 77 65 20 61 72 65 20 74 65 73 74 69 6e  es we are testin
1700: 67 20 28 69 2e 65 2e 20 74 68 6f 73 65 20 62 75  g (i.e. those bu
1710: 69 6c 74 20 69 6e 20 74 68 65 0d 0a 20 20 20 20  ilt in the..    
1720: 20 20 23 20 20 20 20 20 20 20 22 44 65 62 75 67    #       "Debug
1730: 22 20 6f 72 20 22 52 65 6c 65 61 73 65 22 20 62  " or "Release" b
1740: 75 69 6c 64 20 63 6f 6e 66 69 67 75 72 61 74 69  uild configurati
1750: 6f 6e 73 29 2e 20 20 54 6f 20 6f 76 65 72 72 69  ons).  To overri
1760: 64 65 20 74 68 69 73 0d 0a 20 20 20 20 20 20 23  de this..      #
1770: 20 20 20 20 20 20 20 76 61 6c 75 65 20 76 69 61         value via
1780: 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e   the command lin
1790: 65 2c 20 65 6e 74 65 72 20 61 20 63 6f 6d 6d 61  e, enter a comma
17a0: 6e 64 20 73 69 6d 69 6c 61 72 20 74 6f 20 6f 6e  nd similar to on
17b0: 65 20 6f 66 0d 0a 20 20 20 20 20 20 23 20 20 20  e of..      #   
17c0: 20 20 20 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e      the followin
17d0: 67 20 28 61 6c 6c 20 6f 6e 20 6f 6e 65 20 6c 69  g (all on one li
17e0: 6e 65 29 3a 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ne):..      #.. 
17f0: 20 20 20 20 20 23 20 20 20 20 20 20 20 45 61 67       #       Eag
1800: 6c 65 53 68 65 6c 6c 2e 65 78 65 20 2d 70 72 65  leShell.exe -pre
1810: 49 6e 69 74 69 61 6c 69 7a 65 20 22 73 65 74 20  Initialize "set 
1820: 74 65 73 74 5f 63 6f 6e 66 69 67 75 72 61 74 69  test_configurati
1830: 6f 6e 20 44 65 62 75 67 22 0d 0a 20 20 20 20 20  on Debug"..     
1840: 20 23 20 20 20 20 20 20 20 20 20 2d 66 69 6c 65   #         -file
1850: 20 2e 5c 70 61 74 68 5c 74 6f 5c 61 6c 6c 2e 65   .\path\to\all.e
1860: 61 67 6c 65 0d 0a 20 20 20 20 20 20 23 0d 0a 20  agle..      #.. 
1870: 20 20 20 20 20 23 20 20 20 20 20 20 20 45 61 67       #       Eag
1880: 6c 65 53 68 65 6c 6c 2e 65 78 65 20 2d 70 72 65  leShell.exe -pre
1890: 49 6e 69 74 69 61 6c 69 7a 65 20 22 73 65 74 20  Initialize "set 
18a0: 74 65 73 74 5f 63 6f 6e 66 69 67 75 72 61 74 69  test_configurati
18b0: 6f 6e 20 52 65 6c 65 61 73 65 22 0d 0a 20 20 20  on Release"..   
18c0: 20 20 20 23 20 20 20 20 20 20 20 20 20 2d 66 69     #         -fi
18d0: 6c 65 20 2e 5c 70 61 74 68 5c 74 6f 5c 61 6c 6c  le .\path\to\all
18e0: 2e 65 61 67 6c 65 0d 0a 20 20 20 20 20 20 23 0d  .eagle..      #.
18f0: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 45  .      #       E
1900: 61 67 6c 65 53 68 65 6c 6c 2e 65 78 65 20 2d 66  agleShell.exe -f
1910: 69 6c 65 20 2e 5c 70 61 74 68 5c 74 6f 5c 61 6c  ile .\path\to\al
1920: 6c 2e 65 61 67 6c 65 20 2d 70 72 65 54 65 73 74  l.eagle -preTest
1930: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
1940: 20 20 22 75 6e 73 65 74 20 2d 6e 6f 63 6f 6d 70    "unset -nocomp
1950: 6c 61 69 6e 20 74 65 73 74 5f 63 6f 6e 66 69 67  lain test_config
1960: 75 72 61 74 69 6f 6e 22 0d 0a 20 20 20 20 20 20  uration"..      
1970: 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 6e  #..      if {[in
1980: 66 6f 20 65 78 69 73 74 73 20 3a 3a 74 65 73 74  fo exists ::test
1990: 5f 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 5d 20  _configuration] 
19a0: 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  && \..          
19b0: 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
19c0: 3a 3a 74 65 73 74 5f 63 6f 6e 66 69 67 75 72 61  ::test_configura
19d0: 74 69 6f 6e 5d 20 3e 20 30 7d 20 74 68 65 6e 20  tion] > 0} then 
19e0: 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
19f0: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 55 73        # NOTE: Us
1a00: 65 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  e the specified 
1a10: 74 65 73 74 20 63 6f 6e 66 69 67 75 72 61 74 69  test configurati
1a20: 6f 6e 2e 20 20 54 68 65 20 64 65 66 61 75 6c 74  on.  The default
1a30: 20 76 61 6c 75 65 20 75 73 65 64 0d 0a 20 20 20   value used..   
1a40: 20 20 20 20 20 23 20 20 20 20 20 20 20 66 6f 72       #       for
1a50: 20 74 68 69 73 20 76 61 72 69 61 62 6c 65 20 69   this variable i
1a60: 73 20 74 79 70 69 63 61 6c 6c 79 20 22 52 65 6c  s typically "Rel
1a70: 65 61 73 65 22 2c 20 61 73 20 73 65 74 20 62 79  ease", as set by
1a80: 20 74 68 65 20 74 65 73 74 0d 0a 20 20 20 20 20   the test..     
1a90: 20 20 20 23 20 20 20 20 20 20 20 73 75 69 74 65     #       suite
1aa0: 20 69 74 73 65 6c 66 2e 0d 0a 20 20 20 20 20 20   itself...      
1ab0: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74    #..        ret
1ac0: 75 72 6e 20 24 3a 3a 74 65 73 74 5f 63 6f 6e 66  urn $::test_conf
1ad0: 69 67 75 72 61 74 69 6f 6e 0d 0a 20 20 20 20 20  iguration..     
1ae0: 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
1af0: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
1b00: 4e 4f 54 45 3a 20 4e 6f 72 6d 61 6c 6c 79 2c 20  NOTE: Normally, 
1b10: 77 65 20 77 69 6c 6c 20 6e 65 76 65 72 20 68 69  we will never hi
1b20: 74 20 74 68 69 73 20 63 61 73 65 20 62 65 63 61  t this case beca
1b30: 75 73 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66  use the value of
1b40: 20 74 68 65 0d 0a 20 20 20 20 20 20 20 20 23 20   the..        # 
1b50: 20 20 20 20 20 20 74 65 73 74 20 63 6f 6e 66 69        test confi
1b60: 67 75 72 61 74 69 6f 6e 20 76 61 72 69 61 62 6c  guration variabl
1b70: 65 20 69 73 20 61 6c 77 61 79 73 20 73 65 74 20  e is always set 
1b80: 62 79 20 74 68 65 20 74 65 73 74 20 73 75 69 74  by the test suit
1b90: 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  e..        #    
1ba0: 20 20 20 69 74 73 65 6c 66 3b 20 68 6f 77 65 76     itself; howev
1bb0: 65 72 2c 20 69 74 20 63 61 6e 20 62 65 20 6f 76  er, it can be ov
1bc0: 65 72 72 69 64 64 65 6e 20 75 73 69 6e 67 20 74  erridden using t
1bd0: 68 65 20 75 6e 73 65 74 20 63 6f 6d 6d 61 6e 64  he unset command
1be0: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
1bf0: 20 20 66 72 6f 6d 20 74 68 65 20 2d 70 72 65 54    from the -preT
1c00: 65 73 74 20 6f 70 74 69 6f 6e 20 74 6f 20 74 68  est option to th
1c10: 65 20 74 65 73 74 20 73 75 69 74 65 2e 0d 0a 20  e test suite... 
1c20: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
1c30: 20 20 72 65 74 75 72 6e 20 24 3a 3a 65 61 67 6c    return $::eagl
1c40: 65 5f 70 6c 61 74 66 6f 72 6d 28 63 6f 6e 66 69  e_platform(confi
1c50: 67 75 72 61 74 69 6f 6e 29 0d 0a 20 20 20 20 20  guration)..     
1c60: 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20   }..    }.....  
1c70: 20 20 70 72 6f 63 20 67 65 74 42 75 69 6c 64 43    proc getBuildC
1c80: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 73 20 7b 7d  onfigurations {}
1c90: 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20   {..      #..   
1ca0: 20 20 20 23 20 4e 4f 54 45 3a 20 53 65 65 20 69     # NOTE: See i
1cb0: 66 20 74 68 65 20 6c 69 73 74 20 6f 66 20 74 65  f the list of te
1cc0: 73 74 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  st configuration
1cd0: 73 20 68 61 73 20 62 65 65 6e 20 6f 76 65 72 72  s has been overr
1ce0: 69 64 64 65 6e 20 62 79 0d 0a 20 20 20 20 20 20  idden by..      
1cf0: 23 20 20 20 20 20 20 20 74 68 65 20 75 73 65 72  #       the user
1d00: 20 28 65 2e 67 2e 20 6f 6e 20 74 68 65 20 63 6f   (e.g. on the co
1d10: 6d 6d 61 6e 64 20 6c 69 6e 65 29 2e 0d 0a 20 20  mmand line)...  
1d20: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20      #..      if 
1d30: 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  {[info exists ::
1d40: 74 65 73 74 5f 63 6f 6e 66 69 67 75 72 61 74 69  test_configurati
1d50: 6f 6e 73 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20  ons] && \..     
1d60: 20 20 20 20 20 5b 6c 6c 65 6e 67 74 68 20 24 3a       [llength $:
1d70: 3a 74 65 73 74 5f 63 6f 6e 66 69 67 75 72 61 74  :test_configurat
1d80: 69 6f 6e 73 5d 20 3e 20 30 7d 20 74 68 65 6e 20  ions] > 0} then 
1d90: 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
1da0: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 55 73        # NOTE: Us
1db0: 65 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  e the specified 
1dc0: 6c 69 73 74 20 6f 66 20 74 65 73 74 20 63 6f 6e  list of test con
1dd0: 66 69 67 75 72 61 74 69 6f 6e 73 2e 0d 0a 20 20  figurations...  
1de0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
1df0: 20 72 65 74 75 72 6e 20 24 3a 3a 74 65 73 74 5f   return $::test_
1e00: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 73 0d 0a  configurations..
1e10: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
1e20: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
1e30: 20 20 20 23 20 4e 4f 54 45 3a 20 55 73 65 20 74     # NOTE: Use t
1e40: 68 65 20 64 65 66 61 75 6c 74 20 6c 69 73 74 20  he default list 
1e50: 6f 66 20 74 65 73 74 20 63 6f 6e 66 69 67 75 72  of test configur
1e60: 61 74 69 6f 6e 73 2e 0d 0a 20 20 20 20 20 20 20  ations...       
1e70: 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75   #..        retu
1e80: 72 6e 20 5b 6c 69 73 74 20 44 65 62 75 67 20 52  rn [list Debug R
1e90: 65 6c 65 61 73 65 5d 0d 0a 20 20 20 20 20 20 7d  elease]..      }
1ea0: 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
1eb0: 70 72 6f 63 20 67 65 74 42 75 69 6c 64 42 61 73  proc getBuildBas
1ec0: 65 44 69 72 65 63 74 6f 72 79 20 7b 7d 20 7b 0d  eDirectory {} {.
1ed0: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
1ee0: 23 20 4e 4f 54 45 3a 20 46 69 67 75 72 65 20 6f  # NOTE: Figure o
1ef0: 75 74 20 74 68 65 20 62 61 73 65 20 64 69 72 65  ut the base dire
1f00: 63 74 6f 72 79 20 77 68 65 72 65 20 61 6c 6c 20  ctory where all 
1f10: 74 68 65 20 62 75 69 6c 64 73 20 73 68 6f 75 6c  the builds shoul
1f20: 64 20 62 65 0d 0a 20 20 20 20 20 20 23 20 20 20  d be..      #   
1f30: 20 20 20 20 6c 6f 63 61 74 65 64 2e 20 20 54 68      located.  Th
1f40: 69 73 20 77 69 6c 6c 20 62 65 20 74 68 65 20 64  is will be the d
1f50: 69 72 65 63 74 6f 72 79 20 74 68 61 74 20 63 6f  irectory that co
1f60: 6e 74 61 69 6e 73 20 74 68 65 20 61 63 74 75 61  ntains the actua
1f70: 6c 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  l..      #      
1f80: 20 62 75 69 6c 64 20 6f 75 74 70 75 74 20 64 69   build output di
1f90: 72 65 63 74 6f 72 79 20 28 65 2e 67 2e 20 70 61  rectory (e.g. pa
1fa0: 72 65 6e 74 20 6f 66 20 22 62 69 6e 22 29 2e 0d  rent of "bin")..
1fb0: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
1fc0: 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73  if {[info exists
1fd0: 20 3a 3a 62 75 69 6c 64 5f 62 61 73 65 5f 64 69   ::build_base_di
1fe0: 72 65 63 74 6f 72 79 5d 20 26 26 20 5c 0d 0a 20  rectory] && \.. 
1ff0: 20 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67           [string
2000: 20 6c 65 6e 67 74 68 20 24 3a 3a 62 75 69 6c 64   length $::build
2010: 5f 62 61 73 65 5f 64 69 72 65 63 74 6f 72 79 5d  _base_directory]
2020: 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20   > 0} then {..  
2030: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
2040: 20 23 20 4e 4f 54 45 3a 20 54 68 65 20 6c 6f 63   # NOTE: The loc
2050: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 62 75 69  ation of the bui
2060: 6c 64 20 62 61 73 65 20 64 69 72 65 63 74 6f 72  ld base director
2070: 79 20 68 61 73 20 62 65 65 6e 20 6f 76 65 72 72  y has been overr
2080: 69 64 64 65 6e 3b 0d 0a 20 20 20 20 20 20 20 20  idden;..        
2090: 23 20 20 20 20 20 20 20 74 68 65 72 65 66 6f 72  #       therefor
20a0: 65 2c 20 75 73 65 20 69 74 20 76 65 72 62 61 74  e, use it verbat
20b0: 69 6d 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  im...        #..
20c0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 24          return $
20d0: 3a 3a 62 75 69 6c 64 5f 62 61 73 65 5f 64 69 72  ::build_base_dir
20e0: 65 63 74 6f 72 79 0d 0a 20 20 20 20 20 20 7d 20  ectory..      } 
20f0: 65 6c 73 65 69 66 20 7b 5b 69 6e 66 6f 20 65 78  elseif {[info ex
2100: 69 73 74 73 20 3a 3a 63 6f 6d 6d 6f 6e 5f 64 69  ists ::common_di
2110: 72 65 63 74 6f 72 79 5d 20 26 26 20 5c 0d 0a 20  rectory] && \.. 
2120: 20 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67           [string
2130: 20 6c 65 6e 67 74 68 20 24 3a 3a 63 6f 6d 6d 6f   length $::commo
2140: 6e 5f 64 69 72 65 63 74 6f 72 79 5d 20 3e 20 30  n_directory] > 0
2150: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
2160: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
2170: 4f 54 45 3a 20 4e 65 78 74 2c 20 66 61 6c 6c 62  OTE: Next, fallb
2180: 61 63 6b 20 74 6f 20 74 68 65 20 70 61 72 65 6e  ack to the paren
2190: 74 20 64 69 72 65 63 74 6f 72 79 20 6f 66 20 74  t directory of t
21a0: 68 65 20 6f 6e 65 20 63 6f 6e 74 61 69 6e 69 6e  he one containin
21b0: 67 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  g..        #    
21c0: 20 20 20 74 68 69 73 20 66 69 6c 65 20 28 69 2e     this file (i.
21d0: 65 2e 20 22 63 6f 6d 6d 6f 6e 2e 65 61 67 6c 65  e. "common.eagle
21e0: 22 29 2c 20 69 66 20 61 76 61 69 6c 61 62 6c 65  "), if available
21f0: 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
2200: 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b 66 69        return [fi
2210: 6c 65 20 64 69 72 6e 61 6d 65 20 24 3a 3a 63 6f  le dirname $::co
2220: 6d 6d 6f 6e 5f 64 69 72 65 63 74 6f 72 79 5d 0d  mmon_directory].
2230: 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 69 66 20  .      } elseif 
2240: 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  {[info exists ::
2250: 70 61 74 68 5d 20 26 26 20 5c 0d 0a 20 20 20 20  path] && \..    
2260: 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65        [string le
2270: 6e 67 74 68 20 24 3a 3a 70 61 74 68 5d 20 3e 20  ngth $::path] > 
2280: 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
2290: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
22a0: 4e 4f 54 45 3a 20 46 69 6e 61 6c 6c 79 2c 20 66  NOTE: Finally, f
22b0: 61 6c 6c 62 61 63 6b 20 74 6f 20 74 68 65 20 70  allback to the p
22c0: 61 72 65 6e 74 20 64 69 72 65 63 74 6f 72 79 20  arent directory 
22d0: 6f 66 20 74 68 65 20 45 61 67 6c 65 54 65 73 74  of the EagleTest
22e0: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
22f0: 20 20 70 61 74 68 2e 20 20 54 68 65 20 45 61 67    path.  The Eag
2300: 6c 65 54 65 73 74 20 70 61 63 6b 61 67 65 20 67  leTest package g
2310: 75 61 72 61 6e 74 65 65 73 20 74 68 61 74 20 74  uarantees that t
2320: 68 69 73 20 76 61 72 69 61 62 6c 65 0d 0a 20 20  his variable..  
2330: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 77 69        #       wi
2340: 6c 6c 20 62 65 20 73 65 74 20 74 6f 20 74 68 65  ll be set to the
2350: 20 64 69 72 65 63 74 6f 72 79 20 63 6f 6e 74 61   directory conta
2360: 69 6e 69 6e 67 20 74 68 65 20 66 69 72 73 74 20  ining the first 
2370: 66 69 6c 65 20 74 6f 0d 0a 20 20 20 20 20 20 20  file to..       
2380: 20 23 20 20 20 20 20 20 20 65 78 65 63 75 74 65   #       execute
2390: 20 74 68 65 20 5b 72 75 6e 54 65 73 74 50 72 6f   the [runTestPro
23a0: 6c 6f 67 75 65 5d 20 73 63 72 69 70 74 20 6c 69  logue] script li
23b0: 62 72 61 72 79 20 70 72 6f 63 65 64 75 72 65 2e  brary procedure.
23c0: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
23d0: 20 20 20 20 20 72 65 74 75 72 6e 20 5b 66 69 6c       return [fil
23e0: 65 20 64 69 72 6e 61 6d 65 20 24 3a 3a 70 61 74  e dirname $::pat
23f0: 68 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65  h]..      } else
2400: 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20   {..        #.. 
2410: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4e         # NOTE: N
2420: 6f 20 70 61 74 68 20 69 73 20 61 76 61 69 6c 61  o path is availa
2430: 62 6c 65 2c 20 72 65 74 75 72 6e 20 61 6e 20 65  ble, return an e
2440: 6d 70 74 79 20 73 74 72 69 6e 67 2e 20 20 54 68  mpty string.  Th
2450: 69 73 20 70 6f 69 6e 74 0d 0a 20 20 20 20 20 20  is point..      
2460: 20 20 23 20 20 20 20 20 20 20 73 68 6f 75 6c 64    #       should
2470: 20 6e 6f 74 20 62 65 20 72 65 61 63 68 65 64 2e   not be reached.
2480: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
2490: 20 20 20 20 20 72 65 74 75 72 6e 20 22 22 0d 0a       return ""..
24a0: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a        }..    }..
24b0: 0c 0d 0a 20 20 20 20 70 72 6f 63 20 6a 6f 69 6e  ...    proc join
24c0: 42 75 69 6c 64 44 69 72 65 63 74 6f 72 79 20 7b  BuildDirectory {
24d0: 20 6e 61 74 69 76 65 20 70 61 74 68 20 79 65 61   native path yea
24e0: 72 20 70 6c 61 74 66 6f 72 6d 20 63 6f 6e 66 69  r platform confi
24f0: 67 75 72 61 74 69 6f 6e 20 7d 20 7b 0d 0a 20 20  guration } {..  
2500: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
2510: 4f 54 45 3a 20 46 69 67 75 72 65 20 6f 75 74 20  OTE: Figure out 
2520: 61 6e 64 20 74 68 65 6e 20 72 65 74 75 72 6e 20  and then return 
2530: 74 68 65 20 66 75 6c 6c 79 20 71 75 61 6c 69 66  the fully qualif
2540: 69 65 64 20 70 61 74 68 20 74 6f 20 74 68 65 20  ied path to the 
2550: 62 75 69 6c 64 0d 0a 20 20 20 20 20 20 23 20 20  build..      #  
2560: 20 20 20 20 20 64 69 72 65 63 74 6f 72 79 20 62       directory b
2570: 61 73 65 64 20 6f 6e 20 61 6c 6c 20 74 68 65 20  ased on all the 
2580: 61 72 67 75 6d 65 6e 74 73 20 70 72 6f 76 69 64  arguments provid
2590: 65 64 20 62 79 20 6f 75 72 20 63 61 6c 6c 65 72  ed by our caller
25a0: 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
25b0: 20 20 69 66 20 7b 24 6e 61 74 69 76 65 7d 20 74    if {$native} t
25c0: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 72  hen {..        r
25d0: 65 74 75 72 6e 20 5b 66 69 6c 65 20 6a 6f 69 6e  eturn [file join
25e0: 20 24 70 61 74 68 20 62 69 6e 20 24 79 65 61 72   $path bin $year
25f0: 20 24 70 6c 61 74 66 6f 72 6d 20 24 63 6f 6e 66   $platform $conf
2600: 69 67 75 72 61 74 69 6f 6e 5d 0d 0a 20 20 20 20  iguration]..    
2610: 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
2620: 20 20 20 20 72 65 74 75 72 6e 20 5b 66 69 6c 65      return [file
2630: 20 6a 6f 69 6e 20 24 70 61 74 68 20 62 69 6e 20   join $path bin 
2640: 24 79 65 61 72 20 24 63 6f 6e 66 69 67 75 72 61  $year $configura
2650: 74 69 6f 6e 20 62 69 6e 5d 0d 0a 20 20 20 20 20  tion bin]..     
2660: 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20   }..    }.....  
2670: 20 20 70 72 6f 63 20 67 65 74 42 75 69 6c 64 44    proc getBuildD
2680: 69 72 65 63 74 6f 72 79 20 7b 7d 20 7b 0d 0a 20  irectory {} {.. 
2690: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
26a0: 4e 4f 54 45 3a 20 53 65 65 20 69 66 20 74 68 65  NOTE: See if the
26b0: 20 22 6e 61 74 69 76 65 22 20 72 75 6e 74 69 6d   "native" runtim
26c0: 65 20 6f 70 74 69 6f 6e 20 68 61 73 20 62 65 65  e option has bee
26d0: 6e 20 73 65 74 2e 20 20 49 66 20 73 6f 2c 20 75  n set.  If so, u
26e0: 73 65 20 74 68 65 0d 0a 20 20 20 20 20 20 23 20  se the..      # 
26f0: 20 20 20 20 20 20 64 69 72 65 63 74 6f 72 79 20        directory 
2700: 66 6f 72 20 74 68 65 20 6d 69 78 65 64 2d 6d 6f  for the mixed-mo
2710: 64 65 20 61 73 73 65 6d 62 6c 79 20 28 61 2e 6b  de assembly (a.k
2720: 2e 61 2e 20 74 68 65 20 6e 61 74 69 76 65 20 69  .a. the native i
2730: 6e 74 65 72 6f 70 0d 0a 20 20 20 20 20 20 23 20  nterop..      # 
2740: 20 20 20 20 20 20 61 73 73 65 6d 62 6c 79 29 2e        assembly).
2750: 20 20 54 6f 20 65 6e 61 62 6c 65 20 74 68 69 73    To enable this
2760: 20 6f 70 74 69 6f 6e 20 76 69 61 20 74 68 65 20   option via the 
2770: 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 2c 20 65 6e  command line, en
2780: 74 65 72 20 61 0d 0a 20 20 20 20 20 20 23 20 20  ter a..      #  
2790: 20 20 20 20 20 63 6f 6d 6d 61 6e 64 20 73 69 6d       command sim
27a0: 69 6c 61 72 20 74 6f 20 6f 6e 65 20 6f 66 20 74  ilar to one of t
27b0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 28 61 6c  he following (al
27c0: 6c 20 6f 6e 20 6f 6e 65 20 6c 69 6e 65 29 3a 0d  l on one line):.
27d0: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
27e0: 23 20 20 20 20 20 20 20 45 61 67 6c 65 53 68 65  #       EagleShe
27f0: 6c 6c 2e 65 78 65 20 2d 69 6e 69 74 69 61 6c 69  ll.exe -initiali
2800: 7a 65 20 2d 72 75 6e 74 69 6d 65 4f 70 74 69 6f  ze -runtimeOptio
2810: 6e 20 6e 61 74 69 76 65 0d 0a 20 20 20 20 20 20  n native..      
2820: 23 20 20 20 20 20 20 20 20 20 2d 66 69 6c 65 20  #         -file 
2830: 2e 5c 70 61 74 68 5c 74 6f 5c 61 6c 6c 2e 65 61  .\path\to\all.ea
2840: 67 6c 65 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  gle..      #..  
2850: 20 20 20 20 23 20 20 20 20 20 20 20 54 6f 20 65      #       To e
2860: 6e 61 62 6c 65 20 74 68 69 73 20 6f 70 74 69 6f  nable this optio
2870: 6e 20 76 69 61 20 74 68 65 20 63 6f 6d 6d 61 6e  n via the comman
2880: 64 20 6c 69 6e 65 20 70 72 69 6f 72 20 74 6f 20  d line prior to 
2890: 74 68 65 20 22 62 65 74 61 20 31 36 22 0d 0a 20  the "beta 16".. 
28a0: 20 20 20 20 20 23 20 20 20 20 20 20 20 72 65 6c       #       rel
28b0: 65 61 73 65 20 6f 66 20 45 61 67 6c 65 2c 20 74  ease of Eagle, t
28c0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6d  he following com
28d0: 6d 61 6e 64 20 6d 75 73 74 20 62 65 20 75 73 65  mand must be use
28e0: 64 20 69 6e 73 74 65 61 64 0d 0a 20 20 20 20 20  d instead..     
28f0: 20 23 20 20 20 20 20 20 20 28 61 6c 73 6f 20 61   #       (also a
2900: 6c 6c 20 6f 6e 20 6f 6e 65 20 6c 69 6e 65 29 3a  ll on one line):
2910: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
2920: 20 23 20 20 20 20 20 20 20 45 61 67 6c 65 53 68   #       EagleSh
2930: 65 6c 6c 2e 65 78 65 20 2d 69 6e 69 74 69 61 6c  ell.exe -initial
2940: 69 7a 65 20 2d 70 6f 73 74 49 6e 69 74 69 61 6c  ize -postInitial
2950: 69 7a 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ize..      #    
2960: 20 20 20 20 20 22 6f 62 6a 65 63 74 20 69 6e 76       "object inv
2970: 6f 6b 65 20 49 6e 74 65 72 70 72 65 74 65 72 2e  oke Interpreter.
2980: 47 65 74 41 63 74 69 76 65 20 41 64 64 52 75 6e  GetActive AddRun
2990: 74 69 6d 65 4f 70 74 69 6f 6e 20 6e 61 74 69 76  timeOption nativ
29a0: 65 22 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  e"..      #     
29b0: 20 20 20 20 2d 66 69 6c 65 20 2e 5c 70 61 74 68      -file .\path
29c0: 5c 74 6f 5c 61 6c 6c 2e 65 61 67 6c 65 0d 0a 20  \to\all.eagle.. 
29d0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66       #..      if
29e0: 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a   {[info exists :
29f0: 3a 62 75 69 6c 64 5f 64 69 72 65 63 74 6f 72 79  :build_directory
2a00: 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20  ] && \..        
2a10: 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68    [string length
2a20: 20 24 3a 3a 62 75 69 6c 64 5f 64 69 72 65 63 74   $::build_direct
2a30: 6f 72 79 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b  ory] > 0} then {
2a40: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
2a50: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 65       # NOTE: The
2a60: 20 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 74 68 65   location of the
2a70: 20 62 75 69 6c 64 20 64 69 72 65 63 74 6f 72 79   build directory
2a80: 20 68 61 73 20 62 65 65 6e 20 6f 76 65 72 72 69   has been overri
2a90: 64 64 65 6e 3b 0d 0a 20 20 20 20 20 20 20 20 23  dden;..        #
2aa0: 20 20 20 20 20 20 20 74 68 65 72 65 66 6f 72 65         therefore
2ab0: 2c 20 75 73 65 20 69 74 20 76 65 72 62 61 74 69  , use it verbati
2ac0: 6d 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  m...        #.. 
2ad0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 3a         return $:
2ae0: 3a 62 75 69 6c 64 5f 64 69 72 65 63 74 6f 72 79  :build_directory
2af0: 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b  ..      } else {
2b00: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
2b10: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 66 20       # NOTE: If 
2b20: 74 68 65 20 22 6e 61 74 69 76 65 22 20 72 75 6e  the "native" run
2b30: 74 69 6d 65 20 6f 70 74 69 6f 6e 20 69 73 20 73  time option is s
2b40: 65 74 2c 20 74 68 65 20 6d 69 78 65 64 2d 6d 6f  et, the mixed-mo
2b50: 64 65 20 61 73 73 65 6d 62 6c 79 0d 0a 20 20 20  de assembly..   
2b60: 20 20 20 20 20 23 20 20 20 20 20 20 20 69 73 20       #       is 
2b70: 62 65 69 6e 67 20 74 65 73 74 65 64 2e 20 20 49  being tested.  I
2b80: 6e 20 74 68 61 74 20 63 61 73 65 2c 20 74 68 65  n that case, the
2b90: 20 70 61 74 68 20 74 6f 20 74 68 65 20 62 75 69   path to the bui
2ba0: 6c 64 20 64 69 72 65 63 74 6f 72 79 0d 0a 20 20  ld directory..  
2bb0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 77 69        #       wi
2bc0: 6c 6c 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 70  ll contain the p
2bd0: 6c 61 74 66 6f 72 6d 20 6e 61 6d 65 20 61 6e 64  latform name and
2be0: 20 61 6c 6c 20 74 68 65 20 62 69 6e 61 72 69 65   all the binarie
2bf0: 73 20 75 6e 64 65 72 20 74 65 73 74 0d 0a 20 20  s under test..  
2c00: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 73 68        #       sh
2c10: 6f 75 6c 64 20 62 65 20 70 72 65 73 65 6e 74 20  ould be present 
2c20: 69 6e 20 74 68 61 74 20 64 69 72 65 63 74 6f 72  in that director
2c30: 79 2e 20 20 49 66 20 74 68 65 20 22 6e 61 74 69  y.  If the "nati
2c40: 76 65 22 20 72 75 6e 74 69 6d 65 0d 0a 20 20 20  ve" runtime..   
2c50: 20 20 20 20 20 23 20 20 20 20 20 20 20 6f 70 74       #       opt
2c60: 69 6f 6e 20 69 73 20 6e 6f 74 20 73 65 74 2c 20  ion is not set, 
2c70: 74 68 65 20 62 75 69 6c 64 20 64 69 72 65 63 74  the build direct
2c80: 6f 72 79 20 77 69 6c 6c 20 62 65 20 63 6f 6e 73  ory will be cons
2c90: 69 64 65 72 65 64 20 74 6f 20 62 65 0d 0a 20 20  idered to be..  
2ca0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 22 70        #       "p
2cb0: 6c 61 74 66 6f 72 6d 2d 6e 65 75 74 72 61 6c 22  latform-neutral"
2cc0: 2c 20 77 69 74 68 20 74 68 65 20 6e 6f 74 61 62  , with the notab
2cd0: 6c 65 20 65 78 63 65 70 74 69 6f 6e 20 6f 66 20  le exception of 
2ce0: 61 6e 79 20 6e 61 74 69 76 65 0d 0a 20 20 20 20  any native..    
2cf0: 20 20 20 20 23 20 20 20 20 20 20 20 61 73 73 65      #       asse
2d00: 6d 62 6c 79 20 28 65 2e 67 2e 20 22 53 51 4c 69  mbly (e.g. "SQLi
2d10: 74 65 2e 49 6e 74 65 72 6f 70 2e 64 6c 6c 22 29  te.Interop.dll")
2d20: 20 63 6f 70 69 65 64 20 74 68 65 72 65 20 64 75   copied there du
2d30: 72 69 6e 67 20 74 68 65 0d 0a 20 20 20 20 20 20  ring the..      
2d40: 20 20 23 20 20 20 20 20 20 20 62 75 69 6c 64 20    #       build 
2d50: 70 72 6f 63 65 73 73 20 69 74 73 65 6c 66 2e 20  process itself. 
2d60: 20 49 66 20 74 68 65 20 62 75 69 6c 64 20 70 72   If the build pr
2d70: 6f 63 65 73 73 20 73 6f 6d 65 68 6f 77 20 64 6f  ocess somehow do
2d80: 65 73 20 6e 6f 74 0d 0a 20 20 20 20 20 20 20 20  es not..        
2d90: 23 20 20 20 20 20 20 20 63 6f 70 79 20 74 68 65  #       copy the
2da0: 20 6e 61 74 69 76 65 20 61 73 73 65 6d 62 6c 79   native assembly
2db0: 20 66 6f 72 20 74 68 69 73 20 70 6c 61 74 66 6f   for this platfo
2dc0: 72 6d 2c 20 6d 6f 73 74 20 6f 66 20 74 68 65 20  rm, most of the 
2dd0: 74 65 73 74 73 0d 0a 20 20 20 20 20 20 20 20 23  tests..        #
2de0: 20 20 20 20 20 20 20 69 6e 20 74 68 65 20 73 75         in the su
2df0: 69 74 65 20 77 69 6c 6c 20 73 69 6d 70 6c 79 20  ite will simply 
2e00: 62 65 20 73 6b 69 70 70 65 64 2e 20 20 47 65 6e  be skipped.  Gen
2e10: 65 72 61 6c 6c 79 20 73 70 65 61 6b 69 6e 67 2c  erally speaking,
2e20: 20 74 68 65 72 65 0d 0a 20 20 20 20 20 20 20 20   there..        
2e30: 23 20 20 20 20 20 20 20 61 72 65 20 74 77 6f 20  #       are two 
2e40: 77 61 79 73 20 74 6f 20 62 75 69 6c 64 20 74 68  ways to build th
2e50: 65 20 62 69 6e 61 72 69 65 73 20 77 68 65 6e 20  e binaries when 
2e60: 70 72 65 70 61 72 69 6e 67 20 74 6f 20 72 75 6e  preparing to run
2e70: 20 74 68 65 0d 0a 20 20 20 20 20 20 20 20 23 20   the..        # 
2e80: 20 20 20 20 20 20 74 65 73 74 20 73 75 69 74 65        test suite
2e90: 3a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  :..        #..  
2ea0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 31 2e        #       1.
2eb0: 20 42 75 69 6c 64 20 74 68 65 20 73 65 70 61 72   Build the separ
2ec0: 61 74 65 20 6d 61 6e 61 67 65 64 20 61 6e 64 20  ate managed and 
2ed0: 6e 61 74 69 76 65 20 61 73 73 65 6d 62 6c 69 65  native assemblie
2ee0: 73 20 75 73 69 6e 67 20 73 6f 6d 65 0d 0a 20 20  s using some..  
2ef0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 20 20        #         
2f00: 20 63 6f 6d 6d 61 6e 64 73 20 73 69 6d 69 6c 61   commands simila
2f10: 72 20 74 6f 3a 0d 0a 20 20 20 20 20 20 20 20 23  r to:..        #
2f20: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
2f30: 20 20 20 20 20 62 75 69 6c 64 2e 62 61 74 20 24       build.bat $
2f40: 7b 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 7d 4d  {Configuration}M
2f50: 61 6e 61 67 65 64 4f 6e 6c 79 20 24 7b 50 6c 61  anagedOnly ${Pla
2f60: 74 66 6f 72 6d 7d 0d 0a 20 20 20 20 20 20 20 20  tform}..        
2f70: 23 20 20 20 20 20 20 20 20 20 20 62 75 69 6c 64  #          build
2f80: 2e 62 61 74 20 24 7b 43 6f 6e 66 69 67 75 72 61  .bat ${Configura
2f90: 74 69 6f 6e 7d 4e 61 74 69 76 65 4f 6e 6c 79 20  tion}NativeOnly 
2fa0: 24 7b 50 6c 61 74 66 6f 72 6d 7d 0d 0a 20 20 20  ${Platform}..   
2fb0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
2fc0: 23 20 20 20 20 20 20 20 20 20 20 57 68 65 72 65  #          Where
2fd0: 20 24 7b 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e   ${Configuration
2fe0: 7d 20 69 73 20 65 69 74 68 65 72 20 22 44 65 62  } is either "Deb
2ff0: 75 67 22 20 6f 72 20 22 52 65 6c 65 61 73 65 22  ug" or "Release"
3000: 20 61 6e 64 0d 0a 20 20 20 20 20 20 20 20 23 20   and..        # 
3010: 20 20 20 20 20 20 20 20 20 24 7b 50 6c 61 74 66           ${Platf
3020: 6f 72 6d 7d 20 69 73 20 65 69 74 68 65 72 20 22  orm} is either "
3030: 57 69 6e 33 32 22 20 6f 72 20 22 78 36 34 22 2e  Win32" or "x64".
3040: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
3050: 20 20 20 20 20 23 20 20 20 20 20 20 20 32 2e 20       #       2. 
3060: 42 75 69 6c 64 20 74 68 65 20 6d 69 78 65 64 2d  Build the mixed-
3070: 6d 6f 64 65 20 61 73 73 65 6d 62 6c 79 20 75 73  mode assembly us
3080: 69 6e 67 20 61 20 63 6f 6d 6d 61 6e 64 20 73 69  ing a command si
3090: 6d 69 6c 61 72 20 74 6f 3a 0d 0a 20 20 20 20 20  milar to:..     
30a0: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
30b0: 20 20 20 20 20 20 20 20 20 62 75 69 6c 64 2e 62           build.b
30c0: 61 74 20 24 7b 43 6f 6e 66 69 67 75 72 61 74 69  at ${Configurati
30d0: 6f 6e 7d 20 24 7b 50 6c 61 74 66 6f 72 6d 7d 0d  on} ${Platform}.
30e0: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
30f0: 20 20 20 20 23 20 20 20 20 20 20 20 20 20 20 57      #          W
3100: 68 65 72 65 20 24 7b 43 6f 6e 66 69 67 75 72 61  here ${Configura
3110: 74 69 6f 6e 7d 20 69 73 20 65 69 74 68 65 72 20  tion} is either 
3120: 22 44 65 62 75 67 22 20 6f 72 20 22 52 65 6c 65  "Debug" or "Rele
3130: 61 73 65 22 20 61 6e 64 0d 0a 20 20 20 20 20 20  ase" and..      
3140: 20 20 23 20 20 20 20 20 20 20 20 20 20 24 7b 50    #          ${P
3150: 6c 61 74 66 6f 72 6d 7d 20 69 73 20 65 69 74 68  latform} is eith
3160: 65 72 20 22 57 69 6e 33 32 22 20 6f 72 20 22 78  er "Win32" or "x
3170: 36 34 22 2e 20 20 49 66 20 74 68 69 73 20 63 6f  64".  If this co
3180: 6d 6d 61 6e 64 20 69 73 0d 0a 20 20 20 20 20 20  mmand is..      
3190: 20 20 23 20 20 20 20 20 20 20 20 20 20 75 73 65    #          use
31a0: 64 2c 20 76 61 72 69 6f 75 73 20 74 65 73 74 73  d, various tests
31b0: 20 74 68 61 74 20 72 65 71 75 69 72 65 20 73 75   that require su
31c0: 70 70 6c 65 6d 65 6e 74 61 72 79 20 6d 61 6e 61  pplementary mana
31d0: 67 65 64 0d 0a 20 20 20 20 20 20 20 20 23 20 20  ged..        #  
31e0: 20 20 20 20 20 20 20 20 61 73 73 65 6d 62 6c 69          assembli
31f0: 65 73 20 28 65 2e 67 2e 20 4c 49 4e 51 29 20 6d  es (e.g. LINQ) m
3200: 61 79 20 62 65 20 73 6b 69 70 70 65 64 20 75 6e  ay be skipped un
3210: 6c 65 73 73 20 74 68 6f 73 65 20 62 69 6e 61 72  less those binar
3220: 69 65 73 0d 0a 20 20 20 20 20 20 20 20 23 20 20  ies..        #  
3230: 20 20 20 20 20 20 20 20 61 72 65 20 73 75 62 73          are subs
3240: 65 71 75 65 6e 74 6c 79 20 63 6f 70 69 65 64 20  equently copied 
3250: 69 6e 74 6f 20 74 68 65 20 63 6f 72 72 65 63 74  into the correct
3260: 20 64 69 72 65 63 74 6f 72 79 20 28 69 2e 65 2e   directory (i.e.
3270: 20 62 79 0d 0a 20 20 20 20 20 20 20 20 23 20 20   by..        #  
3280: 20 20 20 20 20 20 20 20 22 74 65 73 74 5f 61 6c          "test_al
3290: 6c 2e 62 61 74 22 29 2e 0d 0a 20 20 20 20 20 20  l.bat")...      
32a0: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 20    #..        #  
32b0: 20 20 20 20 20 4e 6f 74 65 20 74 68 61 74 20 61       Note that a
32c0: 6c 6c 20 6f 66 20 74 68 65 20 62 75 69 6c 64 20  ll of the build 
32d0: 63 6f 6d 6d 61 6e 64 73 20 61 62 6f 76 65 20 77  commands above w
32e0: 69 6c 6c 20 64 65 66 61 75 6c 74 20 74 6f 20 75  ill default to u
32f0: 73 69 6e 67 0d 0a 20 20 20 20 20 20 20 20 23 20  sing..        # 
3300: 20 20 20 20 20 20 74 68 65 20 6c 61 74 65 73 74        the latest
3310: 20 76 65 72 73 69 6f 6e 20 6f 66 20 4d 53 42 75   version of MSBu
3320: 69 6c 64 20 61 76 61 69 6c 61 62 6c 65 20 61 6e  ild available an
3330: 64 20 74 68 65 20 22 74 65 73 74 5f 79 65 61 72  d the "test_year
3340: 22 20 6d 61 79 0d 0a 20 20 20 20 20 20 20 20 23  " may..        #
3350: 20 20 20 20 20 20 20 6e 65 65 64 20 74 6f 20 62         need to b
3360: 65 20 61 64 6a 75 73 74 65 64 20 61 63 63 6f 72  e adjusted accor
3370: 64 69 6e 67 6c 79 20 74 6f 20 61 63 74 75 61 6c  dingly to actual
3380: 6c 79 20 72 75 6e 20 74 68 65 20 74 65 73 74 20  ly run the test 
3390: 73 75 69 74 65 2e 0d 0a 20 20 20 20 20 20 20 20  suite...        
33a0: 23 20 20 20 20 20 20 20 52 65 66 65 72 20 74 6f  #       Refer to
33b0: 20 74 68 65 20 63 6f 6d 6d 65 6e 74 73 20 69 6e   the comments in
33c0: 20 5b 67 65 74 42 75 69 6c 64 59 65 61 72 5d 20   [getBuildYear] 
33d0: 66 6f 72 20 6d 6f 72 65 20 69 6e 66 6f 72 6d 61  for more informa
33e0: 74 69 6f 6e 20 6f 6e 0d 0a 20 20 20 20 20 20 20  tion on..       
33f0: 20 23 20 20 20 20 20 20 20 68 6f 77 20 74 6f 20   #       how to 
3400: 73 65 74 20 74 68 69 73 20 76 61 72 69 61 62 6c  set this variabl
3410: 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  e...        #.. 
3420: 20 20 20 20 20 20 20 73 65 74 20 6e 61 74 69 76         set nativ
3430: 65 20 5b 68 61 73 52 75 6e 74 69 6d 65 4f 70 74  e [hasRuntimeOpt
3440: 69 6f 6e 20 6e 61 74 69 76 65 5d 0d 0a 0d 0a 20  ion native].... 
3450: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b 6a         return [j
3460: 6f 69 6e 42 75 69 6c 64 44 69 72 65 63 74 6f 72  oinBuildDirector
3470: 79 20 24 6e 61 74 69 76 65 20 5b 67 65 74 42 75  y $native [getBu
3480: 69 6c 64 42 61 73 65 44 69 72 65 63 74 6f 72 79  ildBaseDirectory
3490: 5d 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ] \..           
34a0: 20 5b 67 65 74 42 75 69 6c 64 59 65 61 72 5d 20   [getBuildYear] 
34b0: 5b 67 65 74 42 75 69 6c 64 50 6c 61 74 66 6f 72  [getBuildPlatfor
34c0: 6d 20 24 6e 61 74 69 76 65 5d 20 5b 67 65 74 42  m $native] [getB
34d0: 75 69 6c 64 43 6f 6e 66 69 67 75 72 61 74 69 6f  uildConfiguratio
34e0: 6e 5d 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20  n]]..      }..  
34f0: 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
3500: 20 67 65 74 42 75 69 6c 64 46 69 6c 65 4e 61 6d   getBuildFileNam
3510: 65 20 7b 20 66 69 6c 65 4e 61 6d 65 20 7d 20 7b  e { fileName } {
3520: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
3530: 20 23 20 4e 4f 54 45 3a 20 52 65 74 75 72 6e 73   # NOTE: Returns
3540: 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 66   the specified f
3550: 69 6c 65 20 6e 61 6d 65 20 61 73 20 69 66 20 69  ile name as if i
3560: 74 20 77 65 72 65 20 6c 6f 63 61 74 65 64 20 69  t were located i
3570: 6e 20 74 68 65 0d 0a 20 20 20 20 20 20 23 20 20  n the..      #  
3580: 20 20 20 20 20 62 75 69 6c 64 20 64 69 72 65 63       build direc
3590: 74 6f 72 79 2c 20 64 69 73 63 61 72 64 69 6e 67  tory, discarding
35a0: 20 61 6e 79 20 64 69 72 65 63 74 6f 72 79 20 69   any directory i
35b0: 6e 66 6f 72 6d 61 74 69 6f 6e 20 70 72 65 73 65  nformation prese
35c0: 6e 74 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  nt..      #     
35d0: 20 20 69 6e 20 74 68 65 20 66 69 6c 65 20 6e 61    in the file na
35e0: 6d 65 20 61 73 20 70 72 6f 76 69 64 65 64 20 62  me as provided b
35f0: 79 20 6f 75 72 20 63 61 6c 6c 65 72 2e 0d 0a 20  y our caller... 
3600: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 72 65       #..      re
3610: 74 75 72 6e 20 5b 66 69 6c 65 20 6e 61 74 69 76  turn [file nativ
3620: 65 6e 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20 20  ename \..       
3630: 20 20 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5b 67     [file join [g
3640: 65 74 42 75 69 6c 64 44 69 72 65 63 74 6f 72 79  etBuildDirectory
3650: 5d 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 66 69  ] [file tail $fi
3660: 6c 65 4e 61 6d 65 5d 5d 5d 0d 0a 20 20 20 20 7d  leName]]]..    }
3670: 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65  .....    proc ge
3680: 74 42 69 6e 61 72 79 44 69 72 65 63 74 6f 72 79  tBinaryDirectory
3690: 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a   {} {..      #..
36a0: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68        # NOTE: Th
36b0: 69 73 20 70 72 6f 63 65 64 75 72 65 20 72 65 74  is procedure ret
36c0: 75 72 6e 73 20 74 68 65 20 64 69 72 65 63 74 6f  urns the directo
36d0: 72 79 20 77 68 65 72 65 20 74 68 65 20 74 65 73  ry where the tes
36e0: 74 20 61 70 70 6c 69 63 61 74 69 6f 6e 0d 0a 20  t application.. 
36f0: 20 20 20 20 20 23 20 20 20 20 20 20 20 69 74 73       #       its
3700: 65 6c 66 20 28 69 2e 65 2e 20 74 68 65 20 45 61  elf (i.e. the Ea
3710: 67 6c 65 20 73 68 65 6c 6c 29 20 69 73 20 6c 6f  gle shell) is lo
3720: 63 61 74 65 64 2e 20 20 54 68 69 73 20 77 69 6c  cated.  This wil
3730: 6c 20 62 65 20 75 73 65 64 20 61 73 0d 0a 20 20  l be used as..  
3740: 20 20 20 20 23 20 20 20 20 20 20 20 74 68 65 20      #       the 
3750: 64 65 73 74 69 6e 61 74 69 6f 6e 20 66 6f 72 20  destination for 
3760: 74 68 65 20 63 6f 70 69 65 64 20 53 79 73 74 65  the copied Syste
3770: 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 20 6e 61  m.Data.SQLite na
3780: 74 69 76 65 20 61 6e 64 0d 0a 20 20 20 20 20 20  tive and..      
3790: 23 20 20 20 20 20 20 20 6d 61 6e 61 67 65 64 20  #       managed 
37a0: 61 73 73 65 6d 62 6c 69 65 73 20 28 69 2e 65 2e  assemblies (i.e.
37b0: 20 62 65 63 61 75 73 65 20 74 68 69 73 20 69 73   because this is
37c0: 20 6f 6e 65 20 6f 66 20 74 68 65 20 66 65 77 20   one of the few 
37d0: 70 6c 61 63 65 73 0d 0a 20 20 20 20 20 20 23 20  places..      # 
37e0: 20 20 20 20 20 20 77 68 65 72 65 20 74 68 65 20        where the 
37f0: 43 4c 52 20 77 69 6c 6c 20 61 63 74 75 61 6c 6c  CLR will actuall
3800: 79 20 66 69 6e 64 20 61 6e 64 20 6c 6f 61 64 20  y find and load 
3810: 74 68 65 6d 20 70 72 6f 70 65 72 6c 79 29 2e 0d  them properly)..
3820: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
3830: 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73  if {[info exists
3840: 20 3a 3a 62 69 6e 61 72 79 5f 64 69 72 65 63 74   ::binary_direct
3850: 6f 72 79 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20  ory] && \..     
3860: 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e       [string len
3870: 67 74 68 20 24 3a 3a 62 69 6e 61 72 79 5f 64 69  gth $::binary_di
3880: 72 65 63 74 6f 72 79 5d 20 3e 20 30 7d 20 74 68  rectory] > 0} th
3890: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d  en {..        #.
38a0: 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
38b0: 20 54 68 65 20 6c 6f 63 61 74 69 6f 6e 20 6f 66   The location of
38c0: 20 74 68 65 20 62 69 6e 61 72 79 20 64 69 72 65   the binary dire
38d0: 63 74 6f 72 79 20 68 61 73 20 62 65 65 6e 20 6f  ctory has been o
38e0: 76 65 72 72 69 64 64 65 6e 3b 0d 0a 20 20 20 20  verridden;..    
38f0: 20 20 20 20 23 20 20 20 20 20 20 20 74 68 65 72      #       ther
3900: 65 66 6f 72 65 2c 20 75 73 65 20 69 74 20 76 65  efore, use it ve
3910: 72 62 61 74 69 6d 2e 0d 0a 20 20 20 20 20 20 20  rbatim...       
3920: 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75   #..        retu
3930: 72 6e 20 24 3a 3a 62 69 6e 61 72 79 5f 64 69 72  rn $::binary_dir
3940: 65 63 74 6f 72 79 0d 0a 20 20 20 20 20 20 7d 20  ectory..      } 
3950: 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
3960: 72 65 74 75 72 6e 20 5b 69 6e 66 6f 20 62 69 6e  return [info bin
3970: 61 72 79 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20  ary]..      }.. 
3980: 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
3990: 63 20 67 65 74 42 69 6e 61 72 79 46 69 6c 65 4e  c getBinaryFileN
39a0: 61 6d 65 20 7b 20 66 69 6c 65 4e 61 6d 65 20 7d  ame { fileName }
39b0: 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20   {..      #..   
39c0: 20 20 20 23 20 4e 4f 54 45 3a 20 52 65 74 75 72     # NOTE: Retur
39d0: 6e 73 20 74 68 65 20 73 70 65 63 69 66 69 65 64  ns the specified
39e0: 20 66 69 6c 65 20 6e 61 6d 65 20 61 73 20 69 66   file name as if
39f0: 20 69 74 20 77 65 72 65 20 6c 6f 63 61 74 65 64   it were located
3a00: 20 69 6e 20 74 68 65 0d 0a 20 20 20 20 20 20 23   in the..      #
3a10: 20 20 20 20 20 20 20 62 69 6e 61 72 79 20 64 69         binary di
3a20: 72 65 63 74 6f 72 79 2c 20 64 69 73 63 61 72 64  rectory, discard
3a30: 69 6e 67 20 61 6e 79 20 64 69 72 65 63 74 6f 72  ing any director
3a40: 79 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 70 72  y information pr
3a50: 65 73 65 6e 74 0d 0a 20 20 20 20 20 20 23 20 20  esent..      #  
3a60: 20 20 20 20 20 69 6e 20 74 68 65 20 66 69 6c 65       in the file
3a70: 20 6e 61 6d 65 20 61 73 20 70 72 6f 76 69 64 65   name as provide
3a80: 64 20 62 79 20 6f 75 72 20 63 61 6c 6c 65 72 2e  d by our caller.
3a90: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
3aa0: 20 72 65 74 75 72 6e 20 5b 66 69 6c 65 20 6e 61   return [file na
3ab0: 74 69 76 65 6e 61 6d 65 20 5c 0d 0a 20 20 20 20  tivename \..    
3ac0: 20 20 20 20 20 20 5b 66 69 6c 65 20 6a 6f 69 6e        [file join
3ad0: 20 5b 67 65 74 42 69 6e 61 72 79 44 69 72 65 63   [getBinaryDirec
3ae0: 74 6f 72 79 5d 20 5b 66 69 6c 65 20 74 61 69 6c  tory] [file tail
3af0: 20 24 66 69 6c 65 4e 61 6d 65 5d 5d 5d 0d 0a 20   $fileName]]].. 
3b00: 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
3b10: 63 20 67 65 74 43 6f 72 65 42 69 6e 61 72 79 46  c getCoreBinaryF
3b20: 69 6c 65 4e 61 6d 65 20 7b 20 7b 73 74 61 6e 64  ileName { {stand
3b30: 61 72 64 20 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a  ard false} } {..
3b40: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
3b50: 20 4e 4f 54 45 3a 20 52 65 74 75 72 6e 73 20 74   NOTE: Returns t
3b60: 68 65 20 66 75 6c 6c 20 70 61 74 68 20 66 6f 72  he full path for
3b70: 20 74 68 65 20 66 69 6c 65 20 63 6f 6e 74 61 69   the file contai
3b80: 6e 69 6e 67 20 74 68 65 20 63 6f 72 65 20 53 51  ning the core SQ
3b90: 4c 69 74 65 0d 0a 20 20 20 20 20 20 23 20 20 20  Lite..      #   
3ba0: 20 20 20 20 6c 69 62 72 61 72 79 20 63 6f 64 65      library code
3bb0: 20 66 6f 72 20 74 68 69 73 20 70 6c 61 74 66 6f   for this platfo
3bc0: 72 6d 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  rm...      #..  
3bd0: 20 20 20 20 69 66 20 7b 5b 68 61 73 52 75 6e 74      if {[hasRunt
3be0: 69 6d 65 4f 70 74 69 6f 6e 20 6e 61 74 69 76 65  imeOption native
3bf0: 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
3c00: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
3c10: 4e 4f 54 45 3a 20 52 65 74 75 72 6e 20 74 68 65  NOTE: Return the
3c20: 20 6d 69 78 65 64 2d 6d 6f 64 65 20 61 73 73 65   mixed-mode asse
3c30: 6d 62 6c 79 20 66 69 6c 65 20 6e 61 6d 65 2e 0d  mbly file name..
3c40: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
3c50: 20 20 20 20 72 65 74 75 72 6e 20 5b 66 69 6c 65      return [file
3c60: 20 6e 61 74 69 76 65 6e 61 6d 65 20 5c 0d 0a 20   nativename \.. 
3c70: 20 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65             [file
3c80: 20 6a 6f 69 6e 20 5b 67 65 74 42 69 6e 61 72 79   join [getBinary
3c90: 44 69 72 65 63 74 6f 72 79 5d 20 53 79 73 74 65  Directory] Syste
3ca0: 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 64 6c  m.Data.SQLite.dl
3cb0: 6c 5d 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73  l]]..      } els
3cc0: 65 69 66 20 7b 24 73 74 61 6e 64 61 72 64 7d 20  eif {$standard} 
3cd0: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
3ce0: 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
3cf0: 45 3a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 61  E: Return the na
3d00: 74 69 76 65 2d 6f 6e 6c 79 20 73 74 61 6e 64 61  tive-only standa
3d10: 72 64 20 53 51 4c 69 74 65 20 6c 69 62 72 61 72  rd SQLite librar
3d20: 79 20 66 69 6c 65 20 6e 61 6d 65 2e 0d 0a 20 20  y file name...  
3d30: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
3d40: 20 72 65 74 75 72 6e 20 5b 66 69 6c 65 20 6e 61   return [file na
3d50: 74 69 76 65 6e 61 6d 65 20 5c 0d 0a 20 20 20 20  tivename \..    
3d60: 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20 6a 6f          [file jo
3d70: 69 6e 20 5b 67 65 74 42 69 6e 61 72 79 44 69 72  in [getBinaryDir
3d80: 65 63 74 6f 72 79 5d 20 73 71 6c 69 74 65 33 2e  ectory] sqlite3.
3d90: 64 6c 6c 5d 5d 0d 0a 20 20 20 20 20 20 7d 20 65  dll]]..      } e
3da0: 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  lse {..        #
3db0: 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
3dc0: 3a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 61 74  : Return the nat
3dd0: 69 76 65 2d 6f 6e 6c 79 20 69 6e 74 65 72 6f 70  ive-only interop
3de0: 20 61 73 73 65 6d 62 6c 79 20 66 69 6c 65 20 6e   assembly file n
3df0: 61 6d 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  ame...        #.
3e00: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
3e10: 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65  [file nativename
3e20: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
3e30: 5b 66 69 6c 65 20 6a 6f 69 6e 20 5b 67 65 74 42  [file join [getB
3e40: 69 6e 61 72 79 44 69 72 65 63 74 6f 72 79 5d 20  inaryDirectory] 
3e50: 53 51 4c 69 74 65 2e 49 6e 74 65 72 6f 70 2e 64  SQLite.Interop.d
3e60: 6c 6c 5d 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20  ll]]..      }.. 
3e70: 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
3e80: 63 20 67 65 74 43 6f 6d 6d 6f 6e 44 69 72 65 63  c getCommonDirec
3e90: 74 6f 72 79 20 7b 7d 20 7b 0d 0a 20 20 20 20 20  tory {} {..     
3ea0: 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
3eb0: 3a 20 54 68 69 73 20 70 72 6f 63 65 64 75 72 65  : This procedure
3ec0: 20 72 65 74 75 72 6e 73 20 74 68 65 20 64 69 72   returns the dir
3ed0: 65 63 74 6f 72 79 20 77 68 65 72 65 20 74 68 65  ectory where the
3ee0: 20 74 65 73 74 20 73 63 72 69 70 74 73 0d 0a 20   test scripts.. 
3ef0: 20 20 20 20 20 23 20 20 20 20 20 20 20 73 68 6f       #       sho
3f00: 75 6c 64 20 62 65 20 6c 6f 63 61 74 65 64 2e 20  uld be located. 
3f10: 20 42 79 20 64 65 66 61 75 6c 74 2c 20 74 68 69   By default, thi
3f20: 73 20 6a 75 73 74 20 72 65 74 75 72 6e 73 20 74  s just returns t
3f30: 68 65 20 45 61 67 6c 65 0d 0a 20 20 20 20 20 20  he Eagle..      
3f40: 23 20 20 20 20 20 20 20 62 69 6e 61 72 79 20 64  #       binary d
3f50: 69 72 65 63 74 6f 72 79 2e 0d 0a 20 20 20 20 20  irectory...     
3f60: 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69   #..      if {[i
3f70: 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 63 6f 6d  nfo exists ::com
3f80: 6d 6f 6e 5f 64 69 72 65 63 74 6f 72 79 5d 20 26  mon_directory] &
3f90: 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b  & \..          [
3fa0: 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a  string length $:
3fb0: 3a 63 6f 6d 6d 6f 6e 5f 64 69 72 65 63 74 6f 72  :common_director
3fc0: 79 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  y] > 0} then {..
3fd0: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
3fe0: 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 65 20 6c     # NOTE: The l
3ff0: 6f 63 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 63  ocation of the c
4000: 6f 6d 6d 6f 6e 20 64 69 72 65 63 74 6f 72 79 20  ommon directory 
4010: 68 61 73 20 62 65 65 6e 20 73 65 74 3b 0d 0a 20  has been set;.. 
4020: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74         #       t
4030: 68 65 72 65 66 6f 72 65 2c 20 75 73 65 20 69 74  herefore, use it
4040: 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
4050: 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 3a 3a        return $::
4060: 63 6f 6d 6d 6f 6e 5f 64 69 72 65 63 74 6f 72 79  common_directory
4070: 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 69 66  ..      } elseif
4080: 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a   {[info exists :
4090: 3a 76 65 6e 64 6f 72 5f 64 69 72 65 63 74 6f 72  :vendor_director
40a0: 79 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20  y] && \..       
40b0: 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74     [string lengt
40c0: 68 20 24 3a 3a 76 65 6e 64 6f 72 5f 64 69 72 65  h $::vendor_dire
40d0: 63 74 6f 72 79 5d 20 3e 20 30 7d 20 74 68 65 6e  ctory] > 0} then
40e0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20   {..        #.. 
40f0: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54         # NOTE: T
4100: 68 65 20 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 74  he location of t
4110: 68 65 20 76 65 6e 64 6f 72 20 64 69 72 65 63 74  he vendor direct
4120: 6f 72 79 20 68 61 73 20 62 65 65 6e 20 73 65 74  ory has been set
4130: 3b 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  ;..        #    
4140: 20 20 20 74 68 65 72 65 66 6f 72 65 2c 20 75 73     therefore, us
4150: 65 20 69 74 2e 0d 0a 20 20 20 20 20 20 20 20 23  e it...        #
4160: 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ..        return
4170: 20 24 3a 3a 76 65 6e 64 6f 72 5f 64 69 72 65 63   $::vendor_direc
4180: 74 6f 72 79 0d 0a 20 20 20 20 20 20 7d 20 65 6c  tory..      } el
4190: 73 65 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73  seif {[info exis
41a0: 74 73 20 3a 3a 74 63 6c 5f 6c 69 62 72 61 72 79  ts ::tcl_library
41b0: 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20  ] && \..        
41c0: 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68    [string length
41d0: 20 24 3a 3a 74 63 6c 5f 6c 69 62 72 61 72 79 5d   $::tcl_library]
41e0: 20 3e 20 30 20 26 26 20 5c 0d 0a 20 20 20 20 20   > 0 && \..     
41f0: 20 20 20 20 20 5b 66 69 6c 65 20 69 73 64 69 72       [file isdir
4200: 65 63 74 6f 72 79 20 24 3a 3a 74 63 6c 5f 6c 69  ectory $::tcl_li
4210: 62 72 61 72 79 5d 7d 20 74 68 65 6e 20 7b 0d 0a  brary]} then {..
4220: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
4230: 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 65 20 76     # NOTE: The v
4240: 61 72 69 61 62 6c 65 20 77 69 74 68 20 74 68 65  ariable with the
4250: 20 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 74 68 65   location of the
4260: 20 73 63 72 69 70 74 20 6c 69 62 72 61 72 79 20   script library 
4270: 69 73 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  is..        #   
4280: 20 20 20 20 73 65 74 20 61 6e 64 20 61 70 70 65      set and appe
4290: 61 72 73 20 74 6f 20 62 65 20 61 20 72 65 61 6c  ars to be a real
42a0: 20 64 69 72 65 63 74 6f 72 79 20 28 69 2e 65 2e   directory (i.e.
42b0: 20 6e 6f 74 20 65 6d 62 65 64 64 65 64 0d 0a 20   not embedded.. 
42c0: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 77         #       w
42d0: 69 74 68 69 6e 20 61 20 66 69 6c 65 29 3b 20 74  ithin a file); t
42e0: 68 65 72 65 66 6f 72 65 2c 20 75 73 65 20 69 74  herefore, use it
42f0: 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
4300: 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 3a 3a        return $::
4310: 74 63 6c 5f 6c 69 62 72 61 72 79 0d 0a 20 20 20  tcl_library..   
4320: 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
4330: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
4340: 23 20 4e 4f 54 45 3a 20 46 61 6c 6c 62 61 63 6b  # NOTE: Fallback
4350: 20 74 6f 20 74 68 65 20 64 69 72 65 63 74 6f 72   to the director
4360: 79 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  y containing the
4370: 20 65 78 65 63 75 74 61 62 6c 65 2e 0d 0a 20 20   executable...  
4380: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
4390: 20 72 65 74 75 72 6e 20 5b 69 6e 66 6f 20 62 69   return [info bi
43a0: 6e 61 72 79 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a  nary]..      }..
43b0: 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
43c0: 6f 63 20 67 65 74 44 61 74 61 62 61 73 65 44 69  oc getDatabaseDi
43d0: 72 65 63 74 6f 72 79 20 7b 7d 20 7b 0d 0a 20 20  rectory {} {..  
43e0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
43f0: 4f 54 45 3a 20 54 68 69 73 20 70 72 6f 63 65 64  OTE: This proced
4400: 75 72 65 20 72 65 74 75 72 6e 73 20 74 68 65 20  ure returns the 
4410: 64 69 72 65 63 74 6f 72 79 20 77 68 65 72 65 20  directory where 
4420: 74 68 65 20 74 65 73 74 20 64 61 74 61 62 61 73  the test databas
4430: 65 73 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  es..      #     
4440: 20 20 73 68 6f 75 6c 64 20 62 65 20 6c 6f 63 61    should be loca
4450: 74 65 64 2e 20 20 42 79 20 64 65 66 61 75 6c 74  ted.  By default
4460: 2c 20 74 68 69 73 20 6a 75 73 74 20 75 73 65 73  , this just uses
4470: 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 0d 0a   the temporary..
4480: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 64 69        #       di
4490: 72 65 63 74 6f 72 79 20 63 6f 6e 66 69 67 75 72  rectory configur
44a0: 65 64 20 66 6f 72 20 74 68 69 73 20 73 79 73 74  ed for this syst
44b0: 65 6d 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  em...      #..  
44c0: 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78      if {[info ex
44d0: 69 73 74 73 20 3a 3a 64 61 74 61 62 61 73 65 5f  ists ::database_
44e0: 64 69 72 65 63 74 6f 72 79 5d 20 26 26 20 5c 0d  directory] && \.
44f0: 0a 20 20 20 20 20 20 20 20 20 20 5b 73 74 72 69  .          [stri
4500: 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a 64 61 74  ng length $::dat
4510: 61 62 61 73 65 5f 64 69 72 65 63 74 6f 72 79 5d  abase_directory]
4520: 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20   > 0} then {..  
4530: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
4540: 20 23 20 4e 4f 54 45 3a 20 54 68 65 20 6c 6f 63   # NOTE: The loc
4550: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 64 61 74  ation of the dat
4560: 61 62 61 73 65 20 64 69 72 65 63 74 6f 72 79 20  abase directory 
4570: 68 61 73 20 62 65 65 6e 20 6f 76 65 72 72 69 64  has been overrid
4580: 64 65 6e 3b 0d 0a 20 20 20 20 20 20 20 20 23 20  den;..        # 
4590: 20 20 20 20 20 20 74 68 65 72 65 66 6f 72 65 2c        therefore,
45a0: 20 75 73 65 20 69 74 2e 0d 0a 20 20 20 20 20 20   use it...      
45b0: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74    #..        ret
45c0: 75 72 6e 20 24 3a 3a 64 61 74 61 62 61 73 65 5f  urn $::database_
45d0: 64 69 72 65 63 74 6f 72 79 0d 0a 20 20 20 20 20  directory..     
45e0: 20 7d 20 65 6c 73 65 69 66 20 7b 5b 69 6e 66 6f   } elseif {[info
45f0: 20 65 78 69 73 74 73 20 3a 3a 73 63 72 61 74 63   exists ::scratc
4600: 68 5f 64 69 72 65 63 74 6f 72 79 5d 20 26 26 20  h_directory] && 
4610: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 73 74  \..          [st
4620: 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a 73  ring length $::s
4630: 63 72 61 74 63 68 5f 64 69 72 65 63 74 6f 72 79  cratch_directory
4640: 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20  ] > 0} then {.. 
4650: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
4660: 20 20 23 20 4e 4f 54 45 3a 20 54 68 65 20 6c 6f    # NOTE: The lo
4670: 63 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 63  cation of the sc
4680: 72 61 74 63 68 20 64 69 72 65 63 74 6f 72 79 20  ratch directory 
4690: 68 61 73 20 62 65 65 6e 20 6f 76 65 72 72 69 64  has been overrid
46a0: 64 65 6e 3b 0d 0a 20 20 20 20 20 20 20 20 23 20  den;..        # 
46b0: 20 20 20 20 20 20 74 68 65 72 65 66 6f 72 65 2c        therefore,
46c0: 20 75 73 65 20 69 74 2e 0d 0a 20 20 20 20 20 20   use it...      
46d0: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74    #..        ret
46e0: 75 72 6e 20 24 3a 3a 73 63 72 61 74 63 68 5f 64  urn $::scratch_d
46f0: 69 72 65 63 74 6f 72 79 0d 0a 20 20 20 20 20 20  irectory..      
4700: 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
4710: 20 20 72 65 74 75 72 6e 20 5b 67 65 74 54 65 6d    return [getTem
4720: 70 6f 72 61 72 79 50 61 74 68 5d 0d 0a 20 20 20  poraryPath]..   
4730: 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a     }..    }.....
4740: 20 20 20 20 70 72 6f 63 20 67 65 74 54 65 6d 70      proc getTemp
4750: 6f 72 61 72 79 44 69 72 65 63 74 6f 72 79 20 7b  oraryDirectory {
4760: 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  } {..      #..  
4770: 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 69 73      # NOTE: This
4780: 20 70 72 6f 63 65 64 75 72 65 20 72 65 74 75 72   procedure retur
4790: 6e 73 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  ns the directory
47a0: 20 77 68 65 72 65 20 74 68 65 20 74 65 6d 70 6f   where the tempo
47b0: 72 61 72 79 20 66 69 6c 65 73 0d 0a 20 20 20 20  rary files..    
47c0: 20 20 23 20 20 20 20 20 20 20 73 68 6f 75 6c 64    #       should
47d0: 20 62 65 20 6c 6f 63 61 74 65 64 2e 20 20 42 79   be located.  By
47e0: 20 64 65 66 61 75 6c 74 2c 20 74 68 69 73 20 6a   default, this j
47f0: 75 73 74 20 75 73 65 73 20 74 68 65 20 74 65 6d  ust uses the tem
4800: 70 6f 72 61 72 79 0d 0a 20 20 20 20 20 20 23 20  porary..      # 
4810: 20 20 20 20 20 20 64 69 72 65 63 74 6f 72 79 20        directory 
4820: 63 6f 6e 66 69 67 75 72 65 64 20 66 6f 72 20 74  configured for t
4830: 68 69 73 20 73 79 73 74 65 6d 2e 0d 0a 20 20 20  his system...   
4840: 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
4850: 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 74  [info exists ::t
4860: 65 6d 70 6f 72 61 72 79 5f 64 69 72 65 63 74 6f  emporary_directo
4870: 72 79 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20  ry] && \..      
4880: 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67      [string leng
4890: 74 68 20 24 3a 3a 74 65 6d 70 6f 72 61 72 79 5f  th $::temporary_
48a0: 64 69 72 65 63 74 6f 72 79 5d 20 3e 20 30 7d 20  directory] > 0} 
48b0: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
48c0: 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
48d0: 45 3a 20 54 68 65 20 6c 6f 63 61 74 69 6f 6e 20  E: The location 
48e0: 6f 66 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  of the temporary
48f0: 20 64 69 72 65 63 74 6f 72 79 20 68 61 73 20 62   directory has b
4900: 65 65 6e 20 6f 76 65 72 72 69 64 64 65 6e 3b 0d  een overridden;.
4910: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
4920: 20 74 68 65 72 65 66 6f 72 65 2c 20 75 73 65 20   therefore, use 
4930: 69 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  it...        #..
4940: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 24          return $
4950: 3a 3a 74 65 6d 70 6f 72 61 72 79 5f 64 69 72 65  ::temporary_dire
4960: 63 74 6f 72 79 0d 0a 20 20 20 20 20 20 7d 20 65  ctory..      } e
4970: 6c 73 65 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69  lseif {[info exi
4980: 73 74 73 20 3a 3a 73 63 72 61 74 63 68 5f 64 69  sts ::scratch_di
4990: 72 65 63 74 6f 72 79 5d 20 26 26 20 5c 0d 0a 20  rectory] && \.. 
49a0: 20 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67           [string
49b0: 20 6c 65 6e 67 74 68 20 24 3a 3a 73 63 72 61 74   length $::scrat
49c0: 63 68 5f 64 69 72 65 63 74 6f 72 79 5d 20 3e 20  ch_directory] > 
49d0: 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
49e0: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
49f0: 4e 4f 54 45 3a 20 54 68 65 20 6c 6f 63 61 74 69  NOTE: The locati
4a00: 6f 6e 20 6f 66 20 74 68 65 20 73 63 72 61 74 63  on of the scratc
4a10: 68 20 64 69 72 65 63 74 6f 72 79 20 68 61 73 20  h directory has 
4a20: 62 65 65 6e 20 6f 76 65 72 72 69 64 64 65 6e 3b  been overridden;
4a30: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
4a40: 20 20 74 68 65 72 65 66 6f 72 65 2c 20 75 73 65    therefore, use
4a50: 20 69 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d   it...        #.
4a60: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
4a70: 24 3a 3a 73 63 72 61 74 63 68 5f 64 69 72 65 63  $::scratch_direc
4a80: 74 6f 72 79 0d 0a 20 20 20 20 20 20 7d 20 65 6c  tory..      } el
4a90: 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 72 65  se {..        re
4aa0: 74 75 72 6e 20 5b 67 65 74 54 65 6d 70 6f 72 61  turn [getTempora
4ab0: 72 79 50 61 74 68 5d 0d 0a 20 20 20 20 20 20 7d  ryPath]..      }
4ac0: 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
4ad0: 70 72 6f 63 20 67 65 74 54 65 73 74 4f 76 65 72  proc getTestOver
4ae0: 72 69 64 65 73 50 72 65 61 6d 62 6c 65 20 7b 20  ridesPreamble { 
4af0: 7b 65 78 74 72 61 56 61 72 4e 61 6d 65 73 20 22  {extraVarNames "
4b00: 22 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 73 65  "} } {..      se
4b10: 74 20 76 61 72 4e 61 6d 65 73 20 5b 6c 69 73 74  t varNames [list
4b20: 5d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  ]....      #..  
4b30: 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 66 20 61      # NOTE: If a
4b40: 76 61 69 6c 61 62 6c 65 2c 20 73 74 61 72 74 20  vailable, start 
4b50: 77 69 74 68 20 74 68 65 20 6d 61 73 74 65 72 20  with the master 
4b60: 6c 69 73 74 20 6f 66 20 74 65 73 74 20 6f 76 65  list of test ove
4b70: 72 72 69 64 65 0d 0a 20 20 20 20 20 20 23 20 20  rride..      #  
4b80: 20 20 20 20 20 76 61 72 69 61 62 6c 65 73 2e 0d       variables..
4b90: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
4ba0: 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73  if {[info exists
4bb0: 20 3a 3a 74 65 73 74 5f 6f 76 65 72 72 69 64 65   ::test_override
4bc0: 73 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20  s] && \..       
4bd0: 20 20 20 5b 6c 6c 65 6e 67 74 68 20 24 3a 3a 74     [llength $::t
4be0: 65 73 74 5f 6f 76 65 72 72 69 64 65 73 5d 20 3e  est_overrides] >
4bf0: 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
4c00: 20 20 20 20 65 76 61 6c 20 6c 61 70 70 65 6e 64      eval lappend
4c10: 20 76 61 72 4e 61 6d 65 73 20 24 3a 3a 74 65 73   varNames $::tes
4c20: 74 5f 6f 76 65 72 72 69 64 65 73 0d 0a 20 20 20  t_overrides..   
4c30: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d     }....      #.
4c40: 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49  .      # NOTE: I
4c50: 66 20 72 65 71 75 65 73 74 65 64 20 62 79 20 6f  f requested by o
4c60: 75 72 20 63 61 6c 6c 65 72 2c 20 61 64 64 20 61  ur caller, add a
4c70: 6e 79 20 61 64 64 69 74 69 6f 6e 61 6c 20 76 61  ny additional va
4c80: 72 69 61 62 6c 65 0d 0a 20 20 20 20 20 20 23 20  riable..      # 
4c90: 20 20 20 20 20 20 6e 61 6d 65 73 20 74 6f 20 63        names to c
4ca0: 6f 70 79 20 6e 6f 77 2e 0d 0a 20 20 20 20 20 20  opy now...      
4cb0: 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 6c 6c  #..      if {[ll
4cc0: 65 6e 67 74 68 20 24 65 78 74 72 61 56 61 72 4e  ength $extraVarN
4cd0: 61 6d 65 73 5d 20 3e 20 30 7d 20 74 68 65 6e 20  ames] > 0} then 
4ce0: 7b 0d 0a 20 20 20 20 20 20 20 20 65 76 61 6c 20  {..        eval 
4cf0: 6c 61 70 70 65 6e 64 20 76 61 72 4e 61 6d 65 73  lappend varNames
4d00: 20 24 65 78 74 72 61 56 61 72 4e 61 6d 65 73 0d   $extraVarNames.
4d10: 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
4d20: 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
4d30: 45 3a 20 42 75 69 6c 64 20 74 68 65 20 73 63 72  E: Build the scr
4d40: 69 70 74 20 66 72 61 67 6d 65 6e 74 20 74 6f 20  ipt fragment to 
4d50: 62 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 70  be returned by p
4d60: 72 6f 63 65 73 73 69 6e 67 20 65 61 63 68 0d 0a  rocessing each..
4d70: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 76 61        #       va
4d80: 72 69 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64 20  riable name and 
4d90: 61 64 64 69 6e 67 20 74 68 65 20 6e 65 63 65 63  adding the necec
4da0: 65 73 73 61 72 79 20 73 63 72 69 70 74 20 66 72  essary script fr
4db0: 61 67 6d 65 6e 74 73 20 66 6f 72 0d 0a 20 20 20  agments for..   
4dc0: 20 20 20 23 20 20 20 20 20 20 20 65 61 63 68 20     #       each 
4dd0: 6f 6e 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  one...      #.. 
4de0: 20 20 20 20 20 73 65 74 20 72 65 73 75 6c 74 20       set result 
4df0: 22 22 0d 0a 0d 0a 20 20 20 20 20 20 66 6f 72 65  ""....      fore
4e00: 61 63 68 20 76 61 72 4e 61 6d 65 20 24 76 61 72  ach varName $var
4e10: 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20 20  Names {..       
4e20: 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
4e30: 54 45 3a 20 42 75 69 6c 64 20 74 68 65 20 71 75  TE: Build the qu
4e40: 61 6c 69 66 69 65 64 20 67 6c 6f 62 61 6c 20 76  alified global v
4e50: 61 72 69 61 62 6c 65 20 6e 61 6d 65 2e 0d 0a 20  ariable name... 
4e60: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
4e70: 20 20 73 65 74 20 66 75 6c 6c 56 61 72 4e 61 6d    set fullVarNam
4e80: 65 20 5b 61 70 70 65 6e 64 41 72 67 73 20 3a 3a  e [appendArgs ::
4e90: 20 24 76 61 72 4e 61 6d 65 5d 0d 0a 0d 0a 20 20   $varName]....  
4ea0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
4eb0: 20 23 20 4e 4f 54 45 3a 20 44 6f 65 73 20 74 68   # NOTE: Does th
4ec0: 65 20 76 61 72 69 61 62 6c 65 20 65 78 69 73 74  e variable exist
4ed0: 20 69 6e 20 74 68 69 73 20 69 6e 74 65 72 70 72   in this interpr
4ee0: 65 74 65 72 20 63 6f 6e 74 65 78 74 3f 0d 0a 20  eter context?.. 
4ef0: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
4f00: 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73    if {[info exis
4f10: 74 73 20 24 66 75 6c 6c 56 61 72 4e 61 6d 65 5d  ts $fullVarName]
4f20: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
4f30: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
4f40: 20 23 20 4e 4f 54 45 3a 20 41 70 70 65 6e 64 20   # NOTE: Append 
4f50: 61 20 73 63 72 69 70 74 20 66 72 61 67 6d 65 6e  a script fragmen
4f60: 74 20 74 6f 20 74 68 65 20 72 65 73 75 6c 74 20  t to the result 
4f70: 74 68 61 74 20 77 69 6c 6c 20 63 6f 72 72 65 63  that will correc
4f80: 74 6c 79 0d 0a 20 20 20 20 20 20 20 20 20 20 23  tly..          #
4f90: 20 20 20 20 20 20 20 63 6f 70 79 20 61 6e 79 20         copy any 
4fa0: 63 6f 6e 74 61 69 6e 65 64 20 76 61 6c 75 65 20  contained value 
4fb0: 74 6f 20 61 6e 6f 74 68 65 72 20 69 6e 74 65 72  to another inter
4fc0: 70 72 65 74 65 72 20 63 6f 6e 74 65 78 74 2e 0d  preter context..
4fd0: 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
4fe0: 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 20 72          append r
4ff0: 65 73 75 6c 74 20 5c 6e 20 22 73 65 74 20 22 20  esult \n "set " 
5000: 24 66 75 6c 6c 56 61 72 4e 61 6d 65 20 22 20 5c  $fullVarName " \
5010: 7b 22 20 5b 73 65 74 20 24 66 75 6c 6c 56 61 72  {" [set $fullVar
5020: 4e 61 6d 65 5d 20 5c 7d 0d 0a 20 20 20 20 20 20  Name] \}..      
5030: 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a    }..      }....
5040: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
5050: 20 4e 4f 54 45 3a 20 49 66 20 74 68 65 20 72 65   NOTE: If the re
5060: 73 75 6c 74 20 63 6f 6e 74 61 69 6e 73 20 6f 6e  sult contains on
5070: 65 20 6f 72 20 6d 6f 72 65 20 73 63 72 69 70 74  e or more script
5080: 20 66 72 61 67 6d 65 6e 74 73 2c 20 61 70 70 65   fragments, appe
5090: 6e 64 20 61 0d 0a 20 20 20 20 20 20 23 20 20 20  nd a..      #   
50a0: 20 20 20 20 6e 65 77 6c 69 6e 65 2e 0d 0a 20 20      newline...  
50b0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20      #..      if 
50c0: 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20  {[string length 
50d0: 24 72 65 73 75 6c 74 5d 20 3e 20 30 7d 20 74 68  $result] > 0} th
50e0: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 61 70  en {..        ap
50f0: 70 65 6e 64 20 72 65 73 75 6c 74 20 5c 6e 0d 0a  pend result \n..
5100: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
5110: 20 72 65 74 75 72 6e 20 24 72 65 73 75 6c 74 0d   return $result.
5120: 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70  .    }.....    p
5130: 72 6f 63 20 67 65 74 41 70 70 44 6f 6d 61 69 6e  roc getAppDomain
5140: 50 72 65 61 6d 62 6c 65 20 7b 20 7b 70 72 65 66  Preamble { {pref
5150: 69 78 20 22 22 7d 20 7b 73 75 66 66 69 78 20 22  ix ""} {suffix "
5160: 22 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d  "} } {..      #.
5170: 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54  .      # NOTE: T
5180: 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 72 65  his procedure re
5190: 74 75 72 6e 73 20 61 20 74 65 73 74 20 73 65 74  turns a test set
51a0: 75 70 20 73 63 72 69 70 74 20 66 72 61 67 6d 65  up script fragme
51b0: 6e 74 20 73 75 69 74 61 62 6c 65 20 66 6f 72 0d  nt suitable for.
51c0: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 65  .      #       e
51d0: 76 61 6c 75 61 74 69 6f 6e 20 62 79 20 61 6e 20  valuation by an 
51e0: 69 6e 74 65 72 70 72 65 74 65 72 20 63 72 65 61  interpreter crea
51f0: 74 65 64 20 69 6e 20 61 6e 20 69 73 6f 6c 61 74  ted in an isolat
5200: 65 64 20 61 70 70 6c 69 63 61 74 69 6f 6e 0d 0a  ed application..
5210: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 64 6f        #       do
5220: 6d 61 69 6e 2e 20 20 54 68 65 20 73 63 72 69 70  main.  The scrip
5230: 74 20 66 72 61 67 6d 65 6e 74 20 62 65 69 6e 67  t fragment being
5240: 20 72 65 74 75 72 6e 65 64 20 77 69 6c 6c 20 62   returned will b
5250: 65 20 73 75 72 72 6f 75 6e 64 65 64 20 62 79 0d  e surrounded by.
5260: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74  .      #       t
5270: 68 65 20 70 72 65 66 69 78 20 61 6e 64 20 73 75  he prefix and su
5280: 66 66 69 78 20 22 73 63 72 69 70 74 20 66 72 61  ffix "script fra
5290: 67 6d 65 6e 74 73 22 20 73 70 65 63 69 66 69 65  gments" specifie
52a0: 64 20 62 79 20 6f 75 72 20 63 61 6c 6c 65 72 2c  d by our caller,
52b0: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
52c0: 69 66 20 61 6e 79 2e 20 20 54 68 65 20 65 6e 74  if any.  The ent
52d0: 69 72 65 20 73 63 72 69 70 74 20 62 65 69 6e 67  ire script being
52e0: 20 72 65 74 75 72 6e 65 64 20 77 69 6c 6c 20 62   returned will b
52f0: 65 20 73 75 62 73 74 69 74 75 74 65 64 20 76 69  e substituted vi
5300: 61 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  a..      #      
5310: 20 5b 73 75 62 73 74 5d 2c 20 69 6e 20 74 68 65   [subst], in the
5320: 20 63 6f 6e 74 65 78 74 20 6f 66 20 6f 75 72 20   context of our 
5330: 63 61 6c 6c 65 72 2c 20 62 65 66 6f 72 65 20 62  caller, before b
5340: 65 69 6e 67 20 72 65 74 75 72 6e 65 64 2e 0d 0a  eing returned...
5350: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 54 68        #       Th
5360: 69 73 20 73 74 65 70 20 69 73 20 6e 65 63 65 73  is step is neces
5370: 73 61 72 79 20 73 6f 20 74 68 61 74 20 73 6f 6d  sary so that som
5380: 65 20 6c 69 6d 69 74 65 64 20 63 6f 6e 74 65 78  e limited contex
5390: 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2c 0d 0a  t information,..
53a0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 70 72        #       pr
53b0: 69 6d 61 72 69 6c 79 20 72 65 6c 61 74 65 64 20  imarily related 
53c0: 74 6f 20 74 68 65 20 74 65 73 74 69 6e 67 20 64  to the testing d
53d0: 69 72 65 63 74 6f 72 69 65 73 2c 20 63 61 6e 20  irectories, can 
53e0: 62 65 20 74 72 61 6e 73 66 65 72 72 65 64 0d 0a  be transferred..
53f0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74 6f        #       to
5400: 20 74 68 65 20 69 6e 74 65 72 70 72 65 74 65 72   the interpreter
5410: 20 69 6e 20 74 68 65 20 69 73 6f 6c 61 74 65 64   in the isolated
5420: 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 64 6f 6d   application dom
5430: 61 69 6e 2c 20 6d 61 6b 69 6e 67 20 69 74 0d 0a  ain, making it..
5440: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 61 62        #       ab
5450: 6c 65 20 74 6f 20 73 75 63 63 65 73 73 66 75 6c  le to successful
5460: 6c 79 20 72 75 6e 20 74 65 73 74 73 20 74 68 61  ly run tests tha
5470: 74 20 72 65 71 75 69 72 65 20 6f 6e 65 20 6f 72  t require one or
5480: 20 6d 6f 72 65 20 6f 66 20 74 68 65 0d 0a 20 20   more of the..  
5490: 20 20 20 20 23 20 20 20 20 20 20 20 66 69 6c 65      #       file
54a0: 73 20 69 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20  s in one of the 
54b0: 74 65 73 74 69 6e 67 20 64 69 72 65 63 74 6f 72  testing director
54c0: 69 65 73 2e 20 20 43 61 6c 6c 65 72 73 20 73 68  ies.  Callers sh
54d0: 6f 75 6c 64 20 6b 65 65 70 20 69 6e 0d 0a 20 20  ould keep in..  
54e0: 20 20 20 20 23 20 20 20 20 20 20 20 6d 69 6e 64      #       mind
54f0: 20 74 68 61 74 20 74 68 65 20 74 65 73 74 20 73   that the test s
5500: 63 72 69 70 74 20 66 72 61 67 6d 65 6e 74 20 62  cript fragment b
5510: 65 69 6e 67 20 72 65 74 75 72 6e 65 64 20 63 61  eing returned ca
5520: 6e 6e 6f 74 20 72 65 6c 79 20 6f 6e 0d 0a 20 20  nnot rely on..  
5530: 20 20 20 20 23 20 20 20 20 20 20 20 61 6e 79 20      #       any 
5540: 73 63 72 69 70 74 20 6c 69 62 72 61 72 79 20 70  script library p
5550: 72 6f 63 65 64 75 72 65 73 20 74 68 61 74 20 61  rocedures that a
5560: 72 65 20 6e 6f 74 20 70 72 6f 76 69 64 65 64 20  re not provided 
5570: 62 79 20 74 68 65 20 45 61 67 6c 65 0d 0a 20 20  by the Eagle..  
5580: 20 20 20 20 23 20 20 20 20 20 20 20 6c 69 62 72      #       libr
5590: 61 72 79 20 70 61 63 6b 61 67 65 20 28 69 2e 65  ary package (i.e
55a0: 2e 20 22 69 6e 69 74 2e 65 61 67 6c 65 22 29 2c  . "init.eagle"),
55b0: 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 6f 73 65   including those
55c0: 20 70 72 6f 76 69 64 65 64 20 62 79 0d 0a 20 20   provided by..  
55d0: 20 20 20 20 23 20 20 20 20 20 20 20 74 68 65 20      #       the 
55e0: 45 61 67 6c 65 20 74 65 73 74 20 70 61 63 6b 61  Eagle test packa
55f0: 67 65 2c 20 75 6e 6c 65 73 73 20 74 68 65 20 66  ge, unless the f
5600: 69 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ile containing t
5610: 68 65 6d 20 69 73 20 6c 6f 61 64 65 64 0d 0a 20  hem is loaded.. 
5620: 20 20 20 20 20 23 20 20 20 20 20 20 20 6d 61 6e       #       man
5630: 75 61 6c 6c 79 20 76 69 61 20 73 6f 6d 65 20 6f  ually via some o
5640: 74 68 65 72 20 6d 65 63 68 61 6e 69 73 6d 20 28  ther mechanism (
5650: 65 2e 67 2e 20 62 79 20 69 6e 63 6c 75 64 69 6e  e.g. by includin
5660: 67 20 61 70 70 72 6f 70 72 69 61 74 65 0d 0a 20  g appropriate.. 
5670: 20 20 20 20 20 23 20 20 20 20 20 20 20 5b 70 61       #       [pa
5680: 63 6b 61 67 65 20 72 65 71 75 69 72 65 5d 20 6f  ckage require] o
5690: 72 20 5b 73 6f 75 72 63 65 5d 20 63 6f 6d 6d 61  r [source] comma
56a0: 6e 64 73 20 69 6e 20 74 68 65 20 70 72 65 66 69  nds in the prefi
56b0: 78 20 6f 72 20 73 75 66 66 69 78 0d 0a 20 20 20  x or suffix..   
56c0: 20 20 20 23 20 20 20 20 20 20 20 73 63 72 69 70     #       scrip
56d0: 74 20 66 72 61 67 6d 65 6e 74 73 29 2e 20 20 41  t fragments).  A
56e0: 6c 73 6f 2c 20 61 6c 6c 20 76 61 72 69 61 62 6c  lso, all variabl
56f0: 65 20 72 65 66 65 72 65 6e 63 65 73 20 61 6e 64  e references and
5700: 20 61 6c 6c 20 6e 65 73 74 65 64 0d 0a 20 20 20   all nested..   
5710: 20 20 20 23 20 20 20 20 20 20 20 63 6f 6d 6d 61     #       comma
5720: 6e 64 73 20 28 69 2e 65 2e 20 74 68 6f 73 65 20  nds (i.e. those 
5730: 69 6e 20 73 71 75 61 72 65 20 62 72 61 63 6b 65  in square bracke
5740: 74 73 29 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e  ts) contained in
5750: 20 74 68 65 20 66 69 6e 61 6c 0d 0a 20 20 20 20   the final..    
5760: 20 20 23 20 20 20 20 20 20 20 73 63 72 69 70 74    #       script
5770: 20 66 72 61 67 6d 65 6e 74 20 77 69 6c 6c 20 65   fragment will e
5780: 6e 64 20 75 70 20 62 65 69 6e 67 20 65 76 61 6c  nd up being eval
5790: 75 61 74 65 64 20 69 6e 20 74 68 65 20 63 6f 6e  uated in the con
57a0: 74 65 78 74 20 6f 66 20 74 68 65 0d 0a 20 20 20  text of the..   
57b0: 20 20 20 23 20 20 20 20 20 20 20 63 61 6c 6c 69     #       calli
57c0: 6e 67 20 69 6e 74 65 72 70 72 65 74 65 72 20 61  ng interpreter a
57d0: 6e 64 20 6e 6f 74 20 74 68 65 20 74 61 72 67 65  nd not the targe
57e0: 74 20 69 6e 74 65 72 70 72 65 74 65 72 20 63 72  t interpreter cr
57f0: 65 61 74 65 64 20 69 6e 20 74 68 65 0d 0a 20 20  eated in the..  
5800: 20 20 20 20 23 20 20 20 20 20 20 20 69 73 6f 6c      #       isol
5810: 61 74 65 64 20 61 70 70 6c 69 63 61 74 69 6f 6e  ated application
5820: 20 64 6f 6d 61 69 6e 20 75 6e 6c 65 73 73 20 74   domain unless t
5830: 68 65 20 64 6f 6c 6c 61 72 20 73 69 67 6e 73 20  he dollar signs 
5840: 61 6e 64 2f 6f 72 20 73 71 75 61 72 65 0d 0a 20  and/or square.. 
5850: 20 20 20 20 20 23 20 20 20 20 20 20 20 62 72 61       #       bra
5860: 63 6b 65 74 73 20 61 72 65 20 73 70 65 63 69 61  ckets are specia
5870: 6c 6c 79 20 71 75 6f 74 65 64 20 77 69 74 68 20  lly quoted with 
5880: 62 61 63 6b 73 6c 61 73 68 65 73 2e 0d 0a 20 20  backslashes...  
5890: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 72 65 74      #..      ret
58a0: 75 72 6e 20 5b 75 70 6c 65 76 65 6c 20 31 20 5b  urn [uplevel 1 [
58b0: 6c 69 73 74 20 73 75 62 73 74 20 5b 61 70 70 65  list subst [appe
58c0: 6e 64 41 72 67 73 20 24 70 72 65 66 69 78 20 7b  ndArgs $prefix {
58d0: 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 68  ..        if {[h
58e0: 61 73 52 75 6e 74 69 6d 65 4f 70 74 69 6f 6e 20  asRuntimeOption 
58f0: 6e 61 74 69 76 65 5d 7d 20 74 68 65 6e 20 7b 0d  native]} then {.
5900: 0a 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63  .          objec
5910: 74 20 69 6e 76 6f 6b 65 20 49 6e 74 65 72 70 72  t invoke Interpr
5920: 65 74 65 72 2e 47 65 74 41 63 74 69 76 65 20 41  eter.GetActive A
5930: 64 64 52 75 6e 74 69 6d 65 4f 70 74 69 6f 6e 20  ddRuntimeOption 
5940: 6e 61 74 69 76 65 0d 0a 20 20 20 20 20 20 20 20  native..        
5950: 7d 0d 0a 20 20 20 20 20 20 7d 20 5b 67 65 74 54  }..      } [getT
5960: 65 73 74 4f 76 65 72 72 69 64 65 73 50 72 65 61  estOverridesPrea
5970: 6d 62 6c 65 20 5b 6c 69 73 74 20 70 61 74 68 20  mble [list path 
5980: 74 65 73 74 5f 63 68 61 6e 6e 65 6c 5d 5d 20 24  test_channel]] $
5990: 73 75 66 66 69 78 5d 5d 5d 0d 0a 20 20 20 20 7d  suffix]]]..    }
59a0: 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 74 72  .....    proc tr
59b0: 79 43 6f 70 79 42 69 6e 61 72 79 46 69 6c 65 20  yCopyBinaryFile 
59c0: 7b 20 66 69 6c 65 4e 61 6d 65 20 7b 6e 65 77 46  { fileName {newF
59d0: 69 6c 65 4e 61 6d 65 20 22 22 7d 20 7d 20 7b 0d  ileName ""} } {.
59e0: 0a 20 20 20 20 20 20 73 65 74 20 73 6f 75 72 63  .      set sourc
59f0: 65 46 69 6c 65 4e 61 6d 65 20 5b 67 65 74 42 69  eFileName [getBi
5a00: 6e 61 72 79 46 69 6c 65 4e 61 6d 65 20 24 66 69  naryFileName $fi
5a10: 6c 65 4e 61 6d 65 5d 0d 0a 0d 0a 20 20 20 20 20  leName]....     
5a20: 20 69 66 20 7b 21 5b 66 69 6c 65 20 65 78 69 73   if {![file exis
5a30: 74 73 20 24 73 6f 75 72 63 65 46 69 6c 65 4e 61  ts $sourceFileNa
5a40: 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  me]} then {..   
5a50: 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
5a60: 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
5a70: 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
5a80: 20 20 20 20 20 20 22 2d 2d 2d 2d 20 73 6b 69 70        "---- skip
5a90: 70 65 64 20 63 6f 70 79 69 6e 67 20 62 69 6e 61  ped copying bina
5aa0: 72 79 20 66 69 6c 65 20 5c 22 22 20 24 73 6f 75  ry file \"" $sou
5ab0: 72 63 65 46 69 6c 65 4e 61 6d 65 20 5c 0d 0a 20  rceFileName \.. 
5ac0: 20 20 20 20 20 20 20 20 20 20 20 22 5c 22 2c 20             "\", 
5ad0: 69 74 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73  it does not exis
5ae0: 74 5c 6e 22 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  t\n"]....       
5af0: 20 72 65 74 75 72 6e 0d 0a 20 20 20 20 20 20 7d   return..      }
5b00: 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 73  ....      if {[s
5b10: 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 6e 65  tring length $ne
5b20: 77 46 69 6c 65 4e 61 6d 65 5d 20 3e 20 30 7d 20  wFileName] > 0} 
5b30: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
5b40: 73 65 74 20 74 61 72 67 65 74 46 69 6c 65 4e 61  set targetFileNa
5b50: 6d 65 20 5b 67 65 74 42 75 69 6c 64 46 69 6c 65  me [getBuildFile
5b60: 4e 61 6d 65 20 24 6e 65 77 46 69 6c 65 4e 61 6d  Name $newFileNam
5b70: 65 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65  e]..      } else
5b80: 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20   {..        set 
5b90: 74 61 72 67 65 74 46 69 6c 65 4e 61 6d 65 20 5b  targetFileName [
5ba0: 67 65 74 42 75 69 6c 64 46 69 6c 65 4e 61 6d 65  getBuildFileName
5bb0: 20 24 66 69 6c 65 4e 61 6d 65 5d 0d 0a 20 20 20   $fileName]..   
5bc0: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 69 66     }....      if
5bd0: 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20   {[catch {..    
5be0: 20 20 20 20 20 20 20 20 20 20 66 69 6c 65 20 63            file c
5bf0: 6f 70 79 20 2d 66 6f 72 63 65 20 24 73 6f 75 72  opy -force $sour
5c00: 63 65 46 69 6c 65 4e 61 6d 65 20 24 74 61 72 67  ceFileName $targ
5c10: 65 74 46 69 6c 65 4e 61 6d 65 7d 5d 20 3d 3d 20  etFileName}] == 
5c20: 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
5c30: 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
5c40: 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  _channel [append
5c50: 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
5c60: 20 20 20 20 22 2d 2d 2d 2d 20 63 6f 70 69 65 64      "---- copied
5c70: 20 62 69 6e 61 72 79 20 66 69 6c 65 20 66 72 6f   binary file fro
5c80: 6d 20 5c 22 22 20 24 73 6f 75 72 63 65 46 69 6c  m \"" $sourceFil
5c90: 65 4e 61 6d 65 20 22 5c 22 20 74 6f 20 5c 22 22  eName "\" to \""
5ca0: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
5cb0: 24 74 61 72 67 65 74 46 69 6c 65 4e 61 6d 65 20  $targetFileName 
5cc0: 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d 20 65  \"\n]..      } e
5cd0: 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 74  lse {..        t
5ce0: 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
5cf0: 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
5d00: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
5d10: 22 2d 2d 2d 2d 20 66 61 69 6c 65 64 20 74 6f 20  "---- failed to 
5d20: 63 6f 70 79 20 62 69 6e 61 72 79 20 66 69 6c 65  copy binary file
5d30: 20 66 72 6f 6d 20 5c 22 22 20 24 73 6f 75 72 63   from \"" $sourc
5d40: 65 46 69 6c 65 4e 61 6d 65 20 5c 0d 0a 20 20 20  eFileName \..   
5d50: 20 20 20 20 20 20 20 20 20 22 5c 22 20 74 6f 20           "\" to 
5d60: 5c 22 22 20 24 74 61 72 67 65 74 46 69 6c 65 4e  \"" $targetFileN
5d70: 61 6d 65 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20  ame \"\n]..     
5d80: 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20   }..    }.....  
5d90: 20 20 70 72 6f 63 20 74 72 79 43 6f 70 79 42 75    proc tryCopyBu
5da0: 69 6c 64 46 69 6c 65 20 7b 20 66 69 6c 65 4e 61  ildFile { fileNa
5db0: 6d 65 20 7b 6e 65 77 46 69 6c 65 4e 61 6d 65 20  me {newFileName 
5dc0: 22 22 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 73  ""} } {..      s
5dd0: 65 74 20 73 6f 75 72 63 65 46 69 6c 65 4e 61 6d  et sourceFileNam
5de0: 65 20 5b 67 65 74 42 75 69 6c 64 46 69 6c 65 4e  e [getBuildFileN
5df0: 61 6d 65 20 24 66 69 6c 65 4e 61 6d 65 5d 0d 0a  ame $fileName]..
5e00: 0d 0a 20 20 20 20 20 20 69 66 20 7b 21 5b 66 69  ..      if {![fi
5e10: 6c 65 20 65 78 69 73 74 73 20 24 73 6f 75 72 63  le exists $sourc
5e20: 65 46 69 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e  eFileName]} then
5e30: 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74   {..        tput
5e40: 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
5e50: 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
5e60: 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d  .            "--
5e70: 2d 2d 20 73 6b 69 70 70 65 64 20 63 6f 70 79 69  -- skipped copyi
5e80: 6e 67 20 62 75 69 6c 64 20 66 69 6c 65 20 5c 22  ng build file \"
5e90: 22 20 24 73 6f 75 72 63 65 46 69 6c 65 4e 61 6d  " $sourceFileNam
5ea0: 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e \..           
5eb0: 20 22 5c 22 2c 20 69 74 20 64 6f 65 73 20 6e 6f   "\", it does no
5ec0: 74 20 65 78 69 73 74 5c 6e 22 5d 0d 0a 0d 0a 20  t exist\n"].... 
5ed0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 0d 0a 20         return.. 
5ee0: 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
5ef0: 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67  if {[string leng
5f00: 74 68 20 24 6e 65 77 46 69 6c 65 4e 61 6d 65 5d  th $newFileName]
5f10: 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20   > 0} then {..  
5f20: 20 20 20 20 20 20 73 65 74 20 74 61 72 67 65 74        set target
5f30: 46 69 6c 65 4e 61 6d 65 20 5b 67 65 74 42 69 6e  FileName [getBin
5f40: 61 72 79 46 69 6c 65 4e 61 6d 65 20 24 6e 65 77  aryFileName $new
5f50: 46 69 6c 65 4e 61 6d 65 5d 0d 0a 20 20 20 20 20  FileName]..     
5f60: 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
5f70: 20 20 20 73 65 74 20 74 61 72 67 65 74 46 69 6c     set targetFil
5f80: 65 4e 61 6d 65 20 5b 67 65 74 42 69 6e 61 72 79  eName [getBinary
5f90: 46 69 6c 65 4e 61 6d 65 20 24 66 69 6c 65 4e 61  FileName $fileNa
5fa0: 6d 65 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a  me]..      }....
5fb0: 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68        if {[catch
5fc0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
5fd0: 20 20 66 69 6c 65 20 63 6f 70 79 20 2d 66 6f 72    file copy -for
5fe0: 63 65 20 24 73 6f 75 72 63 65 46 69 6c 65 4e 61  ce $sourceFileNa
5ff0: 6d 65 20 24 74 61 72 67 65 74 46 69 6c 65 4e 61  me $targetFileNa
6000: 6d 65 7d 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20  me}] == 0} then 
6010: 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73  {..        tputs
6020: 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
6030: 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
6040: 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
6050: 2d 20 63 6f 70 69 65 64 20 62 75 69 6c 64 20 66  - copied build f
6060: 69 6c 65 20 66 72 6f 6d 20 5c 22 22 20 24 73 6f  ile from \"" $so
6070: 75 72 63 65 46 69 6c 65 4e 61 6d 65 20 22 5c 22  urceFileName "\"
6080: 20 74 6f 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20   to \"" \..     
6090: 20 20 20 20 20 20 20 24 74 61 72 67 65 74 46 69         $targetFi
60a0: 6c 65 4e 61 6d 65 20 5c 22 5c 6e 5d 0d 0a 20 20  leName \"\n]..  
60b0: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
60c0: 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
60d0: 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70  est_channel [app
60e0: 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
60f0: 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 66 61 69         "---- fai
6100: 6c 65 64 20 74 6f 20 63 6f 70 79 20 62 75 69 6c  led to copy buil
6110: 64 20 66 69 6c 65 20 66 72 6f 6d 20 5c 22 22 20  d file from \"" 
6120: 24 73 6f 75 72 63 65 46 69 6c 65 4e 61 6d 65 20  $sourceFileName 
6130: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22  \..            "
6140: 5c 22 20 74 6f 20 5c 22 22 20 24 74 61 72 67 65  \" to \"" $targe
6150: 74 46 69 6c 65 4e 61 6d 65 20 5c 22 5c 6e 5d 0d  tFileName \"\n].
6160: 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d  .      }..    }.
6170: 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 74 72 79  ....    proc try
6180: 44 65 6c 65 74 65 42 69 6e 61 72 79 46 69 6c 65  DeleteBinaryFile
6190: 20 7b 20 66 69 6c 65 4e 61 6d 65 20 7d 20 7b 0d   { fileName } {.
61a0: 0a 20 20 20 20 20 20 73 65 74 20 66 69 6c 65 4e  .      set fileN
61b0: 61 6d 65 20 5b 67 65 74 42 69 6e 61 72 79 46 69  ame [getBinaryFi
61c0: 6c 65 4e 61 6d 65 20 24 66 69 6c 65 4e 61 6d 65  leName $fileName
61d0: 5d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 21  ]....      if {!
61e0: 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24 66 69  [file exists $fi
61f0: 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d  leName]} then {.
6200: 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24  .        tputs $
6210: 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b  ::test_channel [
6220: 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
6230: 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
6240: 73 6b 69 70 70 65 64 20 64 65 6c 65 74 69 6e 67  skipped deleting
6250: 20 62 69 6e 61 72 79 20 66 69 6c 65 20 5c 22 22   binary file \""
6260: 20 24 66 69 6c 65 4e 61 6d 65 20 5c 0d 0a 20 20   $fileName \..  
6270: 20 20 20 20 20 20 20 20 20 20 22 5c 22 2c 20 69            "\", i
6280: 74 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74  t does not exist
6290: 5c 6e 22 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  \n"]....        
62a0: 72 65 74 75 72 6e 0d 0a 20 20 20 20 20 20 7d 0d  return..      }.
62b0: 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 63 61  ...      if {[ca
62c0: 74 63 68 20 7b 66 69 6c 65 20 64 65 6c 65 74 65  tch {file delete
62d0: 20 24 66 69 6c 65 4e 61 6d 65 7d 5d 20 3d 3d 20   $fileName}] == 
62e0: 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
62f0: 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
6300: 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  _channel [append
6310: 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
6320: 20 20 20 20 22 2d 2d 2d 2d 20 64 65 6c 65 74 65      "---- delete
6330: 64 20 62 69 6e 61 72 79 20 66 69 6c 65 20 5c 22  d binary file \"
6340: 22 20 24 66 69 6c 65 4e 61 6d 65 20 5c 22 5c 6e  " $fileName \"\n
6350: 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20  ]..      } else 
6360: 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73  {..        tputs
6370: 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
6380: 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
6390: 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
63a0: 2d 20 66 61 69 6c 65 64 20 74 6f 20 64 65 6c 65  - failed to dele
63b0: 74 65 20 62 69 6e 61 72 79 20 66 69 6c 65 20 5c  te binary file \
63c0: 22 22 20 24 66 69 6c 65 4e 61 6d 65 20 5c 22 5c  "" $fileName \"\
63d0: 6e 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20  n]..      }..   
63e0: 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
63f0: 74 72 79 44 65 6c 65 74 65 42 75 69 6c 64 46 69  tryDeleteBuildFi
6400: 6c 65 20 7b 20 66 69 6c 65 4e 61 6d 65 20 7d 20  le { fileName } 
6410: 7b 0d 0a 20 20 20 20 20 20 73 65 74 20 66 69 6c  {..      set fil
6420: 65 4e 61 6d 65 20 5b 67 65 74 42 75 69 6c 64 46  eName [getBuildF
6430: 69 6c 65 4e 61 6d 65 20 24 66 69 6c 65 4e 61 6d  ileName $fileNam
6440: 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b  e]....      if {
6450: 21 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24 66  ![file exists $f
6460: 69 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b  ileName]} then {
6470: 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20  ..        tputs 
6480: 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
6490: 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
64a0: 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
64b0: 20 73 6b 69 70 70 65 64 20 64 65 6c 65 74 69 6e   skipped deletin
64c0: 67 20 62 75 69 6c 64 20 66 69 6c 65 20 5c 22 22  g build file \""
64d0: 20 24 66 69 6c 65 4e 61 6d 65 20 5c 0d 0a 20 20   $fileName \..  
64e0: 20 20 20 20 20 20 20 20 20 20 22 5c 22 2c 20 69            "\", i
64f0: 74 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74  t does not exist
6500: 5c 6e 22 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  \n"]....        
6510: 72 65 74 75 72 6e 0d 0a 20 20 20 20 20 20 7d 0d  return..      }.
6520: 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 63 61  ...      if {[ca
6530: 74 63 68 20 7b 66 69 6c 65 20 64 65 6c 65 74 65  tch {file delete
6540: 20 24 66 69 6c 65 4e 61 6d 65 7d 5d 20 3d 3d 20   $fileName}] == 
6550: 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
6560: 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
6570: 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  _channel [append
6580: 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
6590: 20 20 20 20 22 2d 2d 2d 2d 20 64 65 6c 65 74 65      "---- delete
65a0: 64 20 62 75 69 6c 64 20 66 69 6c 65 20 5c 22 22  d build file \""
65b0: 20 24 66 69 6c 65 4e 61 6d 65 20 5c 22 5c 6e 5d   $fileName \"\n]
65c0: 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b  ..      } else {
65d0: 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20  ..        tputs 
65e0: 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
65f0: 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
6600: 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
6610: 20 66 61 69 6c 65 64 20 74 6f 20 64 65 6c 65 74   failed to delet
6620: 65 20 62 75 69 6c 64 20 66 69 6c 65 20 5c 22 22  e build file \""
6630: 20 24 66 69 6c 65 4e 61 6d 65 20 5c 22 5c 6e 5d   $fileName \"\n]
6640: 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d  ..      }..    }
6650: 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 74 72  .....    proc tr
6660: 79 43 6f 70 79 41 73 73 65 6d 62 6c 79 20 7b 20  yCopyAssembly { 
6670: 66 69 6c 65 4e 61 6d 65 20 7b 70 64 62 20 74 72  fileName {pdb tr
6680: 75 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 74  ue} } {..      t
6690: 72 79 43 6f 70 79 42 75 69 6c 64 46 69 6c 65 20  ryCopyBuildFile 
66a0: 24 66 69 6c 65 4e 61 6d 65 0d 0a 0d 0a 20 20 20  $fileName....   
66b0: 20 20 20 69 66 20 7b 24 70 64 62 7d 20 74 68 65     if {$pdb} the
66c0: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 72 79  n {..        try
66d0: 43 6f 70 79 42 75 69 6c 64 46 69 6c 65 20 5b 61  CopyBuildFile [a
66e0: 70 70 65 6e 64 41 72 67 73 20 5b 66 69 6c 65 20  ppendArgs [file 
66f0: 72 6f 6f 74 6e 61 6d 65 20 24 66 69 6c 65 4e 61  rootname $fileNa
6700: 6d 65 5d 20 2e 70 64 62 5d 0d 0a 20 20 20 20 20  me] .pdb]..     
6710: 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20   }..    }.....  
6720: 20 20 70 72 6f 63 20 74 72 79 44 65 6c 65 74 65    proc tryDelete
6730: 41 73 73 65 6d 62 6c 79 20 7b 20 66 69 6c 65 4e  Assembly { fileN
6740: 61 6d 65 20 7b 70 64 62 20 74 72 75 65 7d 20 7d  ame {pdb true} }
6750: 20 7b 0d 0a 20 20 20 20 20 20 74 72 79 44 65 6c   {..      tryDel
6760: 65 74 65 42 69 6e 61 72 79 46 69 6c 65 20 24 66  eteBinaryFile $f
6770: 69 6c 65 4e 61 6d 65 0d 0a 0d 0a 20 20 20 20 20  ileName....     
6780: 20 69 66 20 7b 24 70 64 62 7d 20 74 68 65 6e 20   if {$pdb} then 
6790: 7b 0d 0a 20 20 20 20 20 20 20 20 74 72 79 44 65  {..        tryDe
67a0: 6c 65 74 65 42 69 6e 61 72 79 46 69 6c 65 20 5b  leteBinaryFile [
67b0: 61 70 70 65 6e 64 41 72 67 73 20 5b 66 69 6c 65  appendArgs [file
67c0: 20 72 6f 6f 74 6e 61 6d 65 20 24 66 69 6c 65 4e   rootname $fileN
67d0: 61 6d 65 5d 20 2e 70 64 62 5d 0d 0a 20 20 20 20  ame] .pdb]..    
67e0: 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20    }..    }..... 
67f0: 20 20 20 70 72 6f 63 20 74 72 79 4c 6f 61 64 41     proc tryLoadA
6800: 73 73 65 6d 62 6c 79 20 7b 20 66 69 6c 65 4e 61  ssembly { fileNa
6810: 6d 65 20 7d 20 7b 0d 0a 20 20 20 20 20 20 73 65  me } {..      se
6820: 74 20 66 69 6c 65 4e 61 6d 65 20 5b 67 65 74 42  t fileName [getB
6830: 69 6e 61 72 79 46 69 6c 65 4e 61 6d 65 20 24 66  inaryFileName $f
6840: 69 6c 65 4e 61 6d 65 5d 0d 0a 0d 0a 20 20 20 20  ileName]....    
6850: 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 73 65    if {[catch {se
6860: 74 20 61 73 73 65 6d 62 6c 79 20 5c 0d 0a 20 20  t assembly \..  
6870: 20 20 20 20 20 20 20 20 20 20 20 20 5b 6f 62 6a              [obj
6880: 65 63 74 20 6c 6f 61 64 20 2d 6c 6f 61 64 74 79  ect load -loadty
6890: 70 65 20 46 69 6c 65 20 2d 61 6c 69 61 73 20 24  pe File -alias $
68a0: 66 69 6c 65 4e 61 6d 65 5d 7d 5d 20 3d 3d 20 30  fileName]}] == 0
68b0: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
68c0: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
68d0: 4f 54 45 3a 20 4e 6f 77 2c 20 61 64 64 20 74 68  OTE: Now, add th
68e0: 65 20 6e 65 63 65 73 73 61 72 79 20 74 65 73 74  e necessary test
68f0: 20 63 6f 6e 73 74 72 61 69 6e 74 2e 0d 0a 20 20   constraint...  
6900: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
6910: 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 5b   addConstraint [
6920: 66 69 6c 65 20 72 6f 6f 74 6e 61 6d 65 20 5b 66  file rootname [f
6930: 69 6c 65 20 74 61 69 6c 20 24 66 69 6c 65 4e 61  ile tail $fileNa
6940: 6d 65 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  me]]....        
6950: 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
6960: 45 3a 20 47 72 61 62 20 74 68 65 20 69 6d 61 67  E: Grab the imag
6970: 65 20 72 75 6e 74 69 6d 65 20 76 65 72 73 69 6f  e runtime versio
6980: 6e 20 66 72 6f 6d 20 74 68 65 20 61 73 73 65 6d  n from the assem
6990: 62 6c 79 20 62 65 63 61 75 73 65 0d 0a 20 20 20  bly because..   
69a0: 20 20 20 20 20 23 20 20 20 20 20 20 20 73 65 76       #       sev
69b0: 65 72 61 6c 20 74 65 73 74 73 20 72 65 6c 79 20  eral tests rely 
69c0: 6f 6e 20 69 74 20 68 61 76 69 6e 67 20 61 20 63  on it having a c
69d0: 65 72 74 61 69 6e 20 76 61 6c 75 65 2e 0d 0a 20  ertain value... 
69e0: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
69f0: 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20    addConstraint 
6a00: 5b 61 70 70 65 6e 64 41 72 67 73 20 5b 66 69 6c  [appendArgs [fil
6a10: 65 20 74 61 69 6c 20 24 66 69 6c 65 4e 61 6d 65  e tail $fileName
6a20: 5d 20 5f 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ] _ \..         
6a30: 20 20 20 5b 24 61 73 73 65 6d 62 6c 79 20 49 6d     [$assembly Im
6a40: 61 67 65 52 75 6e 74 69 6d 65 56 65 72 73 69 6f  ageRuntimeVersio
6a50: 6e 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23  n]]....        #
6a60: 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
6a70: 3a 20 52 65 74 75 72 6e 20 74 68 65 20 66 75 6c  : Return the ful
6a80: 6c 20 70 61 74 68 20 6f 66 20 74 68 65 20 6c 6f  l path of the lo
6a90: 61 64 65 64 20 66 69 6c 65 2e 0d 0a 20 20 20 20  aded file...    
6aa0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72      #..        r
6ab0: 65 74 75 72 6e 20 24 66 69 6c 65 4e 61 6d 65 0d  eturn $fileName.
6ac0: 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
6ad0: 20 20 72 65 74 75 72 6e 20 22 22 0d 0a 20 20 20    return ""..   
6ae0: 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
6af0: 69 73 53 51 4c 69 74 65 52 65 61 64 79 20 7b 7d  isSQLiteReady {}
6b00: 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20   {..      #..   
6b10: 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 69 73 20     # NOTE: This 
6b20: 70 72 6f 63 65 64 75 72 65 20 6d 75 73 74 20 72  procedure must r
6b30: 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 6f  eturn non-zero o
6b40: 6e 6c 79 20 69 66 20 74 68 65 20 53 51 4c 69 74  nly if the SQLit
6b50: 65 20 6e 61 74 69 76 65 0d 0a 20 20 20 20 20 20  e native..      
6b60: 23 20 20 20 20 20 20 20 6c 69 62 72 61 72 79 20  #       library 
6b70: 61 6e 64 20 74 68 65 20 53 79 73 74 65 6d 2e 44  and the System.D
6b80: 61 74 61 2e 53 51 4c 69 74 65 20 6d 61 6e 61 67  ata.SQLite manag
6b90: 65 64 20 61 73 73 65 6d 62 6c 79 20 61 72 65 20  ed assembly are 
6ba0: 6c 6f 61 64 65 64 0d 0a 20 20 20 20 20 20 23 20  loaded..      # 
6bb0: 20 20 20 20 20 20 61 6e 64 20 72 65 61 64 79 20        and ready 
6bc0: 66 6f 72 20 75 73 65 20 62 79 20 74 68 65 20 74  for use by the t
6bd0: 65 73 74 20 73 75 69 74 65 2e 20 20 43 75 72 72  est suite.  Curr
6be0: 65 6e 74 6c 79 2c 20 74 68 69 73 20 70 72 6f 63  ently, this proc
6bf0: 65 64 75 72 65 0d 0a 20 20 20 20 20 20 23 20 20  edure..      #  
6c00: 20 20 20 20 20 73 68 6f 75 6c 64 20 62 65 20 63       should be c
6c10: 61 6c 6c 65 64 20 6f 6e 6c 79 20 61 66 74 65 72  alled only after
6c20: 20 74 68 65 20 5b 74 72 79 4c 6f 61 64 41 73 73   the [tryLoadAss
6c30: 65 6d 62 6c 79 5d 20 70 72 6f 63 65 64 75 72 65  embly] procedure
6c40: 20 68 61 73 0d 0a 20 20 20 20 20 20 23 20 20 20   has..      #   
6c50: 20 20 20 20 62 65 65 6e 20 63 61 6c 6c 65 64 20      been called 
6c60: 74 6f 20 70 72 6f 62 65 20 66 6f 72 20 74 68 65  to probe for the
6c70: 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c   System.Data.SQL
6c80: 69 74 65 20 6d 61 6e 61 67 65 64 20 61 73 73 65  ite managed asse
6c90: 6d 62 6c 79 0d 0a 20 20 20 20 20 20 23 20 20 20  mbly..      #   
6ca0: 20 20 20 20 61 6e 64 20 74 68 65 20 5b 63 68 65      and the [che
6cb0: 63 6b 46 6f 72 53 51 4c 69 74 65 5d 20 70 72 6f  ckForSQLite] pro
6cc0: 63 65 64 75 72 65 20 68 61 73 20 62 65 65 6e 20  cedure has been 
6cd0: 63 61 6c 6c 65 64 20 74 6f 20 70 72 6f 62 65 20  called to probe 
6ce0: 66 6f 72 0d 0a 20 20 20 20 20 20 23 20 20 20 20  for..      #    
6cf0: 20 20 20 74 68 65 20 53 51 4c 69 74 65 20 6e 61     the SQLite na
6d00: 74 69 76 65 20 6c 69 62 72 61 72 79 3b 20 6f 74  tive library; ot
6d10: 68 65 72 77 69 73 65 2c 20 74 68 69 73 20 70 72  herwise, this pr
6d20: 6f 63 65 64 75 72 65 20 77 69 6c 6c 20 73 69 6d  ocedure will sim
6d30: 70 6c 79 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ply..      #    
6d40: 20 20 20 61 6c 77 61 79 73 20 72 65 74 75 72 6e     always return
6d50: 20 7a 65 72 6f 2e 0d 0a 20 20 20 20 20 20 23 0d   zero...      #.
6d60: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b 65  .      return [e
6d70: 78 70 72 20 7b 5b 68 61 76 65 43 6f 6e 73 74 72  xpr {[haveConstr
6d80: 61 69 6e 74 20 53 79 73 74 65 6d 2e 44 61 74 61  aint System.Data
6d90: 2e 53 51 4c 69 74 65 5d 20 26 26 20 5c 0d 0a 20  .SQLite] && \.. 
6da0: 20 20 20 20 20 20 20 20 20 5b 68 61 76 65 43 6f           [haveCo
6db0: 6e 73 74 72 61 69 6e 74 20 53 51 4c 69 74 65 5d  nstraint SQLite]
6dc0: 7d 5d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20  }]..    }.....  
6dd0: 20 20 70 72 6f 63 20 6d 61 74 63 68 4d 61 63 68    proc matchMach
6de0: 69 6e 65 20 7b 20 70 6c 61 74 66 6f 72 6d 20 7d  ine { platform }
6df0: 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20   {..      #..   
6e00: 20 20 20 23 20 4e 4f 54 45 3a 20 41 6e 20 65 6d     # NOTE: An em
6e10: 70 74 79 20 73 74 72 69 6e 67 20 66 6f 72 20 74  pty string for t
6e20: 68 65 20 70 6c 61 74 66 6f 72 6d 20 6d 65 61 6e  he platform mean
6e30: 73 20 74 68 61 74 20 74 68 65 20 62 75 69 6c 64  s that the build
6e40: 20 69 73 20 6e 6f 74 0d 0a 20 20 20 20 20 20 23   is not..      #
6e50: 20 20 20 20 20 20 20 5b 70 72 69 6d 61 72 69 6c         [primaril
6e60: 79 5d 20 61 20 6e 61 74 69 76 65 20 62 75 69 6c  y] a native buil
6e70: 64 3b 20 74 68 65 72 65 66 6f 72 65 2c 20 69 74  d; therefore, it
6e80: 20 61 6c 77 61 79 73 20 6d 61 74 63 68 65 73 2e   always matches.
6e90: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
6ea0: 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e   if {[string len
6eb0: 67 74 68 20 24 70 6c 61 74 66 6f 72 6d 5d 20 3d  gth $platform] =
6ec0: 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  = 0} then {..   
6ed0: 20 20 20 20 20 72 65 74 75 72 6e 20 74 72 75 65       return true
6ee0: 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
6ef0: 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
6f00: 54 45 3a 20 44 6f 65 73 20 74 68 65 20 73 70 65  TE: Does the spe
6f10: 63 69 66 69 65 64 20 70 6c 61 74 66 6f 72 6d 20  cified platform 
6f20: 6d 61 74 63 68 20 75 70 20 74 6f 20 74 68 65 20  match up to the 
6f30: 63 75 72 72 65 6e 74 20 70 72 6f 63 65 73 73 3f  current process?
6f40: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
6f50: 20 69 66 20 7b 24 70 6c 61 74 66 6f 72 6d 20 65   if {$platform e
6f60: 71 20 5b 6d 61 63 68 69 6e 65 54 6f 50 6c 61 74  q [machineToPlat
6f70: 66 6f 72 6d 20 24 3a 3a 74 63 6c 5f 70 6c 61 74  form $::tcl_plat
6f80: 66 6f 72 6d 28 6d 61 63 68 69 6e 65 29 5d 7d 20  form(machine)]} 
6f90: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
6fa0: 72 65 74 75 72 6e 20 74 72 75 65 0d 0a 20 20 20  return true..   
6fb0: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d     }....      #.
6fc0: 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54  .      # NOTE: T
6fd0: 68 65 20 73 70 65 63 69 66 69 65 64 20 70 6c 61  he specified pla
6fe0: 74 66 6f 72 6d 20 64 6f 65 73 20 6e 6f 74 20 6d  tform does not m
6ff0: 61 74 63 68 20 75 70 20 77 69 74 68 20 74 68 65  atch up with the
7000: 20 70 6c 61 74 66 6f 72 6d 0d 0a 20 20 20 20 20   platform..     
7010: 20 23 20 20 20 20 20 20 20 66 6f 72 20 74 68 65   #       for the
7020: 20 63 75 72 72 65 6e 74 20 70 72 6f 63 65 73 73   current process
7030: 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
7040: 20 20 72 65 74 75 72 6e 20 66 61 6c 73 65 0d 0a    return false..
7050: 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
7060: 6f 63 20 63 68 65 63 6b 46 6f 72 53 51 4c 69 74  oc checkForSQLit
7070: 65 42 75 69 6c 64 73 20 7b 20 63 68 61 6e 6e 65  eBuilds { channe
7080: 6c 20 7b 73 65 6c 65 63 74 20 66 61 6c 73 65 7d  l {select false}
7090: 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20   } {..      #.. 
70a0: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68 65       # NOTE: Che
70b0: 63 6b 20 66 6f 72 20 65 76 65 72 79 20 70 6f 73  ck for every pos
70c0: 73 69 62 6c 65 20 76 61 6c 69 64 20 63 6f 6d 62  sible valid comb
70d0: 69 6e 61 74 69 6f 6e 20 6f 66 20 76 61 6c 75 65  ination of value
70e0: 73 20 75 73 65 64 20 77 68 65 6e 0d 0a 20 20 20  s used when..   
70f0: 20 20 20 23 20 20 20 20 20 20 20 6c 6f 63 61 74     #       locat
7100: 69 6e 67 20 6f 75 74 20 74 68 65 20 62 75 69 6c  ing out the buil
7110: 64 20 6f 75 74 70 75 74 20 64 69 72 65 63 74 6f  d output directo
7120: 72 79 2c 20 73 68 6f 77 69 6e 67 20 65 61 63 68  ry, showing each
7130: 20 61 76 61 69 6c 61 62 6c 65 0d 0a 20 20 20 20   available..    
7140: 20 20 23 20 20 20 20 20 20 20 62 75 69 6c 64 20    #       build 
7150: 76 61 72 69 61 74 69 6f 6e 20 61 6c 6f 6e 67 20  variation along 
7160: 74 68 65 20 77 61 79 2e 0d 0a 20 20 20 20 20 20  the way...      
7170: 23 0d 0a 20 20 20 20 20 20 66 6f 72 65 61 63 68  #..      foreach
7180: 20 6e 61 74 69 76 65 20 5b 6c 69 73 74 20 66 61   native [list fa
7190: 6c 73 65 20 74 72 75 65 5d 20 7b 0d 0a 20 20 20  lse true] {..   
71a0: 20 20 20 20 20 66 6f 72 65 61 63 68 20 79 65 61       foreach yea
71b0: 72 20 5b 67 65 74 42 75 69 6c 64 59 65 61 72 73  r [getBuildYears
71c0: 5d 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 66  ] {..          f
71d0: 6f 72 65 61 63 68 20 63 6f 6e 66 69 67 75 72 61  oreach configura
71e0: 74 69 6f 6e 20 5b 67 65 74 42 75 69 6c 64 43 6f  tion [getBuildCo
71f0: 6e 66 69 67 75 72 61 74 69 6f 6e 73 5d 20 7b 0d  nfigurations] {.
7200: 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a  .            #..
7210: 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f              # NO
7220: 54 45 3a 20 46 69 67 75 72 65 20 6f 75 74 20 74  TE: Figure out t
7230: 68 65 20 65 66 66 65 63 74 69 76 65 20 62 75 69  he effective bui
7240: 6c 64 20 70 6c 61 74 66 6f 72 6d 2e 20 20 54 68  ld platform.  Th
7250: 69 73 20 69 73 0d 0a 20 20 20 20 20 20 20 20 20  is is..         
7260: 20 20 20 23 20 20 20 20 20 20 20 62 61 73 65 64     #       based
7270: 20 6f 6e 20 77 68 65 74 68 65 72 20 6f 72 20 6e   on whether or n
7280: 6f 74 20 61 20 5b 70 72 69 6d 61 72 69 6c 79 5d  ot a [primarily]
7290: 20 6e 61 74 69 76 65 20 62 75 69 6c 64 0d 0a 20   native build.. 
72a0: 20 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20             #    
72b0: 20 20 20 69 73 20 62 65 69 6e 67 20 75 73 65 64     is being used
72c0: 2e 20 20 46 6f 72 20 5b 70 72 69 6d 61 72 69 6c  .  For [primaril
72d0: 79 5d 20 6e 6f 6e 2d 6e 61 74 69 76 65 20 62 75  y] non-native bu
72e0: 69 6c 64 73 2c 0d 0a 20 20 20 20 20 20 20 20 20  ilds,..         
72f0: 20 20 20 23 20 20 20 20 20 20 20 74 68 69 73 20     #       this 
7300: 77 69 6c 6c 20 62 65 20 61 6e 20 65 6d 70 74 79  will be an empty
7310: 20 73 74 72 69 6e 67 2e 0d 0a 20 20 20 20 20 20   string...      
7320: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
7330: 20 20 20 20 20 73 65 74 20 70 6c 61 74 66 6f 72       set platfor
7340: 6d 20 5b 67 65 74 42 75 69 6c 64 50 6c 61 74 66  m [getBuildPlatf
7350: 6f 72 6d 20 24 6e 61 74 69 76 65 5d 0d 0a 0d 0a  orm $native]....
7360: 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
7370: 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  s $channel [appe
7380: 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
7390: 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
73a0: 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 53 79 73  checking for Sys
73b0: 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 20  tem.Data.SQLite 
73c0: 62 75 69 6c 64 20 5c 22 22 20 5b 65 78 70 72 20  build \"" [expr 
73d0: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
73e0: 20 20 20 7b 24 6e 61 74 69 76 65 20 3f 20 22 6e     {$native ? "n
73f0: 61 74 69 76 65 2f 22 20 3a 20 22 22 7d 5d 20 5b  ative/" : ""}] [
7400: 65 78 70 72 20 7b 5b 73 74 72 69 6e 67 20 6c 65  expr {[string le
7410: 6e 67 74 68 20 5c 0d 0a 20 20 20 20 20 20 20 20  ngth \..        
7420: 20 20 20 20 20 20 20 20 24 70 6c 61 74 66 6f 72          $platfor
7430: 6d 5d 20 3e 20 30 20 3f 20 5b 61 70 70 65 6e 64  m] > 0 ? [append
7440: 41 72 67 73 20 24 70 6c 61 74 66 6f 72 6d 20 2f  Args $platform /
7450: 5d 20 3a 20 22 22 7d 5d 20 24 79 65 61 72 20 5c  ] : ""}] $year \
7460: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
7470: 20 20 2f 20 24 63 6f 6e 66 69 67 75 72 61 74 69    / $configurati
7480: 6f 6e 20 22 5c 22 2e 2e 2e 20 22 5d 0d 0a 0d 0a  on "\"... "]....
7490: 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20              #.. 
74a0: 20 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54             # NOT
74b0: 45 3a 20 42 75 69 6c 64 20 74 68 65 20 66 75 6c  E: Build the ful
74c0: 6c 79 20 71 75 61 6c 69 66 69 65 64 20 66 69 6c  ly qualified fil
74d0: 65 20 6e 61 6d 65 20 66 6f 72 20 74 68 65 20 70  e name for the p
74e0: 72 69 6d 61 72 79 0d 0a 20 20 20 20 20 20 20 20  rimary..        
74f0: 20 20 20 20 23 20 20 20 20 20 20 20 61 73 73 65      #       asse
7500: 6d 62 6c 79 20 63 6f 6e 74 61 69 6e 69 6e 67 20  mbly containing 
7510: 74 68 65 20 53 79 73 74 65 6d 2e 44 61 74 61 2e  the System.Data.
7520: 53 51 4c 69 74 65 20 6d 61 6e 61 67 65 64 0d 0a  SQLite managed..
7530: 20 20 20 20 20 20 20 20 20 20 20 20 23 20 20 20              #   
7540: 20 20 20 20 63 6f 6d 70 6f 6e 65 6e 74 73 2e 20      components. 
7550: 20 49 74 20 73 68 6f 75 6c 64 20 62 65 20 6e 6f   It should be no
7560: 74 65 64 20 74 68 61 74 20 74 68 69 73 20 61 73  ted that this as
7570: 73 65 6d 62 6c 79 0d 0a 20 20 20 20 20 20 20 20  sembly..        
7580: 20 20 20 20 23 20 20 20 20 20 20 20 66 69 6c 65      #       file
7590: 20 6d 61 79 20 61 6c 73 6f 20 63 6f 6e 74 61 69   may also contai
75a0: 6e 20 74 68 65 20 6e 61 74 69 76 65 20 63 6f 6d  n the native com
75b0: 70 6f 6e 65 6e 74 73 2c 20 69 66 20 61 0d 0a 20  ponents, if a.. 
75c0: 20 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20             #    
75d0: 20 20 20 6e 61 74 69 76 65 20 62 75 69 6c 64 20     native build 
75e0: 69 73 20 69 6e 20 75 73 65 2e 0d 0a 20 20 20 20  is in use...    
75f0: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
7600: 20 20 20 20 20 20 20 73 65 74 20 66 69 6c 65 4e         set fileN
7610: 61 6d 65 20 5b 66 69 6c 65 20 6e 61 74 69 76 65  ame [file native
7620: 6e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20  name [file join 
7630: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
7640: 20 20 20 5b 6a 6f 69 6e 42 75 69 6c 64 44 69 72     [joinBuildDir
7650: 65 63 74 6f 72 79 20 24 6e 61 74 69 76 65 20 5b  ectory $native [
7660: 67 65 74 42 75 69 6c 64 42 61 73 65 44 69 72 65  getBuildBaseDire
7670: 63 74 6f 72 79 5d 20 24 79 65 61 72 20 5c 0d 0a  ctory] $year \..
7680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7690: 24 70 6c 61 74 66 6f 72 6d 20 24 63 6f 6e 66 69  $platform $confi
76a0: 67 75 72 61 74 69 6f 6e 5d 20 53 79 73 74 65 6d  guration] System
76b0: 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 64 6c 6c  .Data.SQLite.dll
76c0: 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  ]]....          
76d0: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20    #..           
76e0: 20 23 20 4e 4f 54 45 3a 20 44 6f 65 73 20 74 68   # NOTE: Does th
76f0: 65 20 66 69 6c 65 20 65 78 69 73 74 3f 20 20 43  e file exist?  C
7700: 75 72 72 65 6e 74 6c 79 2c 20 6e 6f 20 6f 74 68  urrently, no oth
7710: 65 72 20 73 74 65 70 73 20 61 72 65 0d 0a 20 20  er steps are..  
7720: 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20            #     
7730: 20 20 74 61 6b 65 6e 20 74 6f 20 76 65 72 69 66    taken to verif
7740: 79 20 74 68 69 73 20 62 75 69 6c 64 20 69 73 20  y this build is 
7750: 61 63 74 75 61 6c 6c 79 20 76 69 61 62 6c 65 2e  actually viable.
7760: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 0d  ..            #.
7770: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20  .            if 
7780: 7b 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24 66  {[file exists $f
7790: 69 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b  ileName]} then {
77a0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
77b0: 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  #..             
77c0: 20 23 20 4e 4f 54 45 3a 20 57 68 65 6e 20 69 6e   # NOTE: When in
77d0: 20 22 73 65 6c 65 63 74 22 20 6d 6f 64 65 2c 20   "select" mode, 
77e0: 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 73 65  automatically se
77f0: 6c 65 63 74 20 74 68 65 20 66 69 72 73 74 0d 0a  lect the first..
7800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20                # 
7810: 20 20 20 20 20 20 61 76 61 69 6c 61 62 6c 65 20        available 
7820: 62 75 69 6c 64 20 6f 66 20 53 79 73 74 65 6d 2e  build of System.
7830: 44 61 74 61 2e 53 51 4c 69 74 65 20 61 6e 64 20  Data.SQLite and 
7840: 74 68 65 6e 20 72 65 74 75 72 6e 0d 0a 20 20 20  then return..   
7850: 20 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20             #    
7860: 20 20 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 0d     immediately..
7870: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23  .              #
7880: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
7890: 69 66 20 7b 24 73 65 6c 65 63 74 20 26 26 20 5b  if {$select && [
78a0: 6d 61 74 63 68 4d 61 63 68 69 6e 65 20 24 70 6c  matchMachine $pl
78b0: 61 74 66 6f 72 6d 5d 7d 20 74 68 65 6e 20 7b 0d  atform]} then {.
78c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
78d0: 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   #..            
78e0: 20 20 20 20 23 20 4e 4f 54 45 3a 20 4d 61 6e 75      # NOTE: Manu
78f0: 61 6c 6c 79 20 6f 76 65 72 72 69 64 65 20 61 6c  ally override al
7900: 6c 20 74 68 65 20 62 75 69 6c 64 20 64 69 72 65  l the build dire
7910: 63 74 6f 72 79 20 73 65 6c 65 63 74 69 6f 6e 0d  ctory selection.
7920: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
7930: 20 23 20 20 20 20 20 20 20 72 65 6c 61 74 65 64   #       related
7940: 20 74 65 73 74 20 73 65 74 74 69 6e 67 73 20 69   test settings i
7950: 6e 20 6f 72 64 65 72 20 74 6f 20 66 6f 72 63 65  n order to force
7960: 20 74 68 69 73 20 62 75 69 6c 64 0d 0a 20 20 20   this build..   
7970: 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20 20               #  
7980: 20 20 20 20 20 6f 66 20 53 79 73 74 65 6d 2e 44       of System.D
7990: 61 74 61 2e 53 51 4c 69 74 65 20 74 6f 20 62 65  ata.SQLite to be
79a0: 20 75 73 65 64 2e 0d 0a 20 20 20 20 20 20 20 20   used...        
79b0: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
79c0: 20 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63             objec
79d0: 74 20 69 6e 76 6f 6b 65 20 49 6e 74 65 72 70 72  t invoke Interpr
79e0: 65 74 65 72 2e 47 65 74 41 63 74 69 76 65 20 5b  eter.GetActive [
79f0: 65 78 70 72 20 7b 24 6e 61 74 69 76 65 20 3f 20  expr {$native ? 
7a00: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
7a10: 20 20 20 20 20 20 20 22 41 64 64 52 75 6e 74 69         "AddRunti
7a20: 6d 65 4f 70 74 69 6f 6e 22 20 3a 20 22 52 65 6d  meOption" : "Rem
7a30: 6f 76 65 52 75 6e 74 69 6d 65 4f 70 74 69 6f 6e  oveRuntimeOption
7a40: 22 7d 5d 20 20 6e 61 74 69 76 65 0d 0a 0d 0a 20  "}]  native.... 
7a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
7a60: 65 74 20 3a 3a 74 65 73 74 5f 79 65 61 72 20 24  et ::test_year $
7a70: 79 65 61 72 0d 0a 20 20 20 20 20 20 20 20 20 20  year..          
7a80: 20 20 20 20 20 20 73 65 74 20 3a 3a 74 65 73 74        set ::test
7a90: 5f 70 6c 61 74 66 6f 72 6d 20 24 70 6c 61 74 66  _platform $platf
7aa0: 6f 72 6d 0d 0a 20 20 20 20 20 20 20 20 20 20 20  orm..           
7ab0: 20 20 20 20 20 73 65 74 20 3a 3a 74 65 73 74 5f       set ::test_
7ac0: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 24 63  configuration $c
7ad0: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 0d 0a 0d 0a  onfiguration....
7ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7af0: 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b  tputs $channel [
7b00: 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
7b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7b20: 20 20 22 79 65 73 2c 20 73 65 6c 65 63 74 65 64    "yes, selected
7b30: 20 28 22 20 5b 65 78 70 72 20 7b 24 6e 61 74 69   (" [expr {$nati
7b40: 76 65 20 3f 20 22 6e 61 74 69 76 65 2f 22 20 3a  ve ? "native/" :
7b50: 20 22 22 7d 5d 20 5c 0d 0a 20 20 20 20 20 20 20   ""}] \..       
7b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 65 78               [ex
7b70: 70 72 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67  pr {[string leng
7b80: 74 68 20 24 70 6c 61 74 66 6f 72 6d 5d 20 3e 20  th $platform] > 
7b90: 30 20 3f 20 5b 61 70 70 65 6e 64 41 72 67 73 20  0 ? [appendArgs 
7ba0: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
7bb0: 20 20 20 20 20 20 20 24 70 6c 61 74 66 6f 72 6d         $platform
7bc0: 20 2f 5d 20 3a 20 22 22 7d 5d 20 24 79 65 61 72   /] : ""}] $year
7bd0: 20 2f 20 24 63 6f 6e 66 69 67 75 72 61 74 69 6f   / $configuratio
7be0: 6e 20 22 29 5c 6e 22 5d 0d 0a 0d 0a 20 20 20 20  n ")\n"]....    
7bf0: 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
7c00: 72 6e 20 74 72 75 65 0d 0a 20 20 20 20 20 20 20  rn true..       
7c10: 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d         } else {.
7c20: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
7c30: 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
7c40: 79 65 73 5c 6e 0d 0a 20 20 20 20 20 20 20 20 20  yes\n..         
7c50: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
7c60: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
7c70: 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
7c80: 73 20 24 63 68 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d  s $channel no\n.
7c90: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  .            }..
7ca0: 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
7cb0: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d       }..      }.
7cc0: 0a 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ...      return 
7cd0: 66 61 6c 73 65 0d 0a 20 20 20 20 7d 0d 0a 0c 0d  false..    }....
7ce0: 0a 20 20 20 20 70 72 6f 63 20 63 68 65 63 6b 46  .    proc checkF
7cf0: 6f 72 53 51 4c 69 74 65 52 65 6c 65 61 73 65 73  orSQLiteReleases
7d00: 20 7b 20 63 68 61 6e 6e 65 6c 20 7b 73 65 6c 65   { channel {sele
7d10: 63 74 20 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a 20  ct false} } {.. 
7d20: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
7d30: 4e 4f 54 45 3a 20 43 68 65 63 6b 20 66 6f 72 20  NOTE: Check for 
7d40: 70 61 73 74 20 72 65 6c 65 61 73 65 73 20 6f 66  past releases of
7d50: 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c   System.Data.SQL
7d60: 69 74 65 20 69 6e 20 74 68 65 20 64 69 72 65 63  ite in the direc
7d70: 74 6f 72 79 0d 0a 20 20 20 20 20 20 23 20 20 20  tory..      #   
7d80: 20 20 20 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e      contained in
7d90: 20 74 68 65 20 22 53 79 73 74 65 6d 2e 44 61 74   the "System.Dat
7da0: 61 2e 53 51 4c 69 74 65 22 20 65 6e 76 69 72 6f  a.SQLite" enviro
7db0: 6e 6d 65 6e 74 20 76 61 72 69 61 62 6c 65 2c 20  nment variable, 
7dc0: 69 66 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  if..      #     
7dd0: 20 20 70 72 65 73 65 6e 74 2e 0d 0a 20 20 20 20    present...    
7de0: 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b    #..      if {[
7df0: 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 65 6e  info exists ::en
7e00: 76 28 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51  v(System.Data.SQ
7e10: 4c 69 74 65 29 5d 20 26 26 20 5c 0d 0a 20 20 20  Lite)] && \..   
7e20: 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c         [string l
7e30: 65 6e 67 74 68 20 24 3a 3a 65 6e 76 28 53 79 73  ength $::env(Sys
7e40: 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 29  tem.Data.SQLite)
7e50: 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20  ] > 0} then {.. 
7e60: 20 20 20 20 20 20 20 73 65 74 20 64 69 72 65 63         set direc
7e70: 74 6f 72 79 20 24 3a 3a 65 6e 76 28 53 79 73 74  tory $::env(Syst
7e80: 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 29 0d  em.Data.SQLite).
7e90: 0a 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 66  ...        set f
7ea0: 69 6c 65 4e 61 6d 65 20 5b 66 69 6c 65 20 6e 61  ileName [file na
7eb0: 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c 65 20 6a  tivename [file j
7ec0: 6f 69 6e 20 24 64 69 72 65 63 74 6f 72 79 20 5c  oin $directory \
7ed0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 53 79  ..            Sy
7ee0: 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
7ef0: 2e 64 6c 6c 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20  .dll]]....      
7f00: 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
7f10: 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
7f20: 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
7f30: 2d 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 53  - checking for S
7f40: 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
7f50: 65 20 72 65 6c 65 61 73 65 20 5c 22 22 20 5c 0d  e release \"" \.
7f60: 0a 20 20 20 20 20 20 20 20 20 20 20 20 24 66 69  .            $fi
7f70: 6c 65 4e 61 6d 65 20 22 5c 22 2e 2e 2e 20 22 5d  leName "\"... "]
7f80: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b  ....        if {
7f90: 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24 66 69  [file exists $fi
7fa0: 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d  leName]} then {.
7fb0: 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 24  .          if {$
7fc0: 73 65 6c 65 63 74 7d 20 74 68 65 6e 20 7b 0d 0a  select} then {..
7fd0: 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20              set 
7fe0: 3a 3a 62 75 69 6c 64 5f 64 69 72 65 63 74 6f 72  ::build_director
7ff0: 79 20 24 64 69 72 65 63 74 6f 72 79 0d 0a 0d 0a  y $directory....
8000: 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
8010: 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  s $channel [appe
8020: 6e 64 41 72 67 73 20 22 79 65 73 20 28 22 20 24  ndArgs "yes (" $
8030: 64 69 72 65 63 74 6f 72 79 20 22 29 5c 6e 22 5d  directory ")\n"]
8040: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
8050: 72 65 74 75 72 6e 20 74 72 75 65 0d 0a 20 20 20  return true..   
8060: 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d         } else {.
8070: 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75  .            tpu
8080: 74 73 20 24 63 68 61 6e 6e 65 6c 20 79 65 73 5c  ts $channel yes\
8090: 6e 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  n..          }..
80a0: 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b          } else {
80b0: 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70 75 74  ..          tput
80c0: 73 20 24 63 68 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d  s $channel no\n.
80d0: 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72  ...          for
80e0: 65 61 63 68 20 70 61 74 68 20 5b 6c 73 6f 72 74  each path [lsort
80f0: 20 2d 64 65 63 72 65 61 73 69 6e 67 20 5b 66 69   -decreasing [fi
8100: 6c 65 20 6c 69 73 74 20 24 64 69 72 65 63 74 6f  le list $directo
8110: 72 79 20 2a 5d 5d 20 7b 0d 0a 20 20 20 20 20 20  ry *]] {..      
8120: 20 20 20 20 20 20 69 66 20 7b 5b 66 69 6c 65 20        if {[file 
8130: 65 78 69 73 74 73 20 24 70 61 74 68 5d 20 26 26  exists $path] &&
8140: 20 5b 66 69 6c 65 20 69 73 64 69 72 65 63 74 6f   [file isdirecto
8150: 72 79 20 24 70 61 74 68 5d 7d 20 74 68 65 6e 20  ry $path]} then 
8160: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
8170: 20 73 65 74 20 66 69 6c 65 4e 61 6d 65 20 5b 66   set fileName [f
8180: 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65 20 5b  ile nativename [
8190: 66 69 6c 65 20 6a 6f 69 6e 20 24 70 61 74 68 20  file join $path 
81a0: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
81b0: 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61       System.Data
81c0: 2e 53 51 4c 69 74 65 2e 64 6c 6c 5d 5d 0d 0a 0d  .SQLite.dll]]...
81d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74  .              t
81e0: 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61  puts $channel [a
81f0: 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
8200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
8210: 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e 67 20 66 6f  ---- checking fo
8220: 72 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51  r System.Data.SQ
8230: 4c 69 74 65 20 72 65 6c 65 61 73 65 20 5c 22 22  Lite release \""
8240: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
8250: 20 20 20 20 20 20 24 66 69 6c 65 4e 61 6d 65 20        $fileName 
8260: 22 5c 22 2e 2e 2e 20 22 5d 0d 0a 0d 0a 20 20 20  "\"... "]....   
8270: 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b             if {[
8280: 66 69 6c 65 20 65 78 69 73 74 73 20 24 66 69 6c  file exists $fil
8290: 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a  eName]} then {..
82a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
82b0: 69 66 20 7b 24 73 65 6c 65 63 74 7d 20 74 68 65  if {$select} the
82c0: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
82d0: 20 20 20 20 20 20 20 73 65 74 20 3a 3a 62 75 69         set ::bui
82e0: 6c 64 5f 64 69 72 65 63 74 6f 72 79 20 24 70 61  ld_directory $pa
82f0: 74 68 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  th....          
8300: 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
8310: 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
8320: 67 73 20 22 79 65 73 2c 20 73 65 6c 65 63 74 65  gs "yes, selecte
8330: 64 20 28 22 20 24 70 61 74 68 20 22 29 5c 6e 22  d (" $path ")\n"
8340: 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ]....           
8350: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 72         return tr
8360: 75 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ue..            
8370: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
8380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8390: 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 79  tputs $channel y
83a0: 65 73 5c 6e 0d 0a 20 20 20 20 20 20 20 20 20 20  es\n..          
83b0: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
83c0: 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d         } else {.
83d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
83e0: 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
83f0: 6e 6f 5c 6e 0d 0a 20 20 20 20 20 20 20 20 20 20  no\n..          
8400: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
8410: 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
8420: 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  }..        }..  
8430: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 72      }....      r
8440: 65 74 75 72 6e 20 66 61 6c 73 65 0d 0a 20 20 20  eturn false..   
8450: 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
8460: 63 68 65 63 6b 46 6f 72 53 51 4c 69 74 65 4c 69  checkForSQLiteLi
8470: 62 72 61 72 79 20 7b 20 63 68 61 6e 6e 65 6c 20  brary { channel 
8480: 7d 20 7b 0d 0a 20 20 20 20 20 20 74 70 75 74 73  } {..      tputs
8490: 20 24 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20   $channel "---- 
84a0: 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 53 51 4c  checking for SQL
84b0: 69 74 65 20 63 6f 72 65 20 6c 69 62 72 61 72 79  ite core library
84c0: 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 20 20 69  ... "....      i
84d0: 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20  f {[catch {..   
84e0: 20 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63             objec
84f0: 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20  t invoke -flags 
8500: 2b 4e 6f 6e 50 75 62 6c 69 63 20 53 79 73 74 65  +NonPublic Syste
8510: 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 53 51  m.Data.SQLite.SQ
8520: 4c 69 74 65 33 20 5c 0d 0a 20 20 20 20 20 20 20  Lite3 \..       
8530: 20 20 20 20 20 20 20 53 51 4c 69 74 65 56 65 72         SQLiteVer
8540: 73 69 6f 6e 7d 20 76 65 72 73 69 6f 6e 5d 20 3d  sion} version] =
8550: 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  = 0} then {..   
8560: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
8570: 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 69 66  # NOTE: Check if
8580: 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 76 65   the returned ve
8590: 72 73 69 6f 6e 20 77 61 73 20 6e 75 6c 6c 2e 20  rsion was null. 
85a0: 20 49 66 20 73 6f 2c 20 6d 61 6b 65 20 69 74 20   If so, make it 
85b0: 65 61 73 79 0d 0a 20 20 20 20 20 20 20 20 23 20  easy..        # 
85c0: 20 20 20 20 20 20 74 6f 20 73 70 6f 74 2e 0d 0a        to spot...
85d0: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
85e0: 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c     if {[string l
85f0: 65 6e 67 74 68 20 24 76 65 72 73 69 6f 6e 5d 20  ength $version] 
8600: 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  == 0} then {..  
8610: 20 20 20 20 20 20 20 20 73 65 74 20 76 65 72 73          set vers
8620: 69 6f 6e 20 6e 75 6c 6c 0d 0a 20 20 20 20 20 20  ion null..      
8630: 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23    }....        #
8640: 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
8650: 3a 20 41 74 74 65 6d 70 74 20 74 6f 20 71 75 65  : Attempt to que
8660: 72 79 20 74 68 65 20 46 6f 73 73 69 6c 20 73 6f  ry the Fossil so
8670: 75 72 63 65 20 69 64 65 6e 74 69 66 69 65 72 20  urce identifier 
8680: 66 6f 72 20 74 68 65 20 53 51 4c 69 74 65 0d 0a  for the SQLite..
8690: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
86a0: 63 6f 72 65 20 6c 69 62 72 61 72 79 2e 0d 0a 20  core library... 
86b0: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
86c0: 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a    if {[catch {..
86d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
86e0: 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66  object invoke -f
86f0: 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20  lags +NonPublic 
8700: 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
8710: 74 65 2e 53 51 4c 69 74 65 33 20 5c 0d 0a 20 20  te.SQLite3 \..  
8720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
8730: 4c 69 74 65 53 6f 75 72 63 65 49 64 7d 20 73 6f  LiteSourceId} so
8740: 75 72 63 65 49 64 5d 7d 20 74 68 65 6e 20 7b 0d  urceId]} then {.
8750: 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
8760: 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
8770: 57 65 20 66 61 69 6c 65 64 20 74 6f 20 71 75 65  We failed to que
8780: 72 79 20 74 68 65 20 46 6f 73 73 69 6c 20 73 6f  ry the Fossil so
8790: 75 72 63 65 20 69 64 65 6e 74 69 66 69 65 72 2e  urce identifier.
87a0: 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20  ..          #.. 
87b0: 20 20 20 20 20 20 20 20 20 73 65 74 20 73 6f 75           set sou
87c0: 72 63 65 49 64 20 75 6e 6b 6e 6f 77 6e 0d 0a 20  rceId unknown.. 
87d0: 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
87e0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
87f0: 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 69 66 20   NOTE: Check if 
8800: 74 68 65 20 72 65 74 75 72 6e 65 64 20 46 6f 73  the returned Fos
8810: 73 69 6c 20 73 6f 75 72 63 65 20 69 64 65 6e 74  sil source ident
8820: 69 66 69 65 72 20 77 61 73 20 6e 75 6c 6c 2e 20  ifier was null. 
8830: 20 49 66 0d 0a 20 20 20 20 20 20 20 20 23 20 20   If..        #  
8840: 20 20 20 20 20 73 6f 2c 20 6d 61 6b 65 20 69 74       so, make it
8850: 20 65 61 73 79 20 74 6f 20 73 70 6f 74 2e 0d 0a   easy to spot...
8860: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
8870: 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c     if {[string l
8880: 65 6e 67 74 68 20 24 73 6f 75 72 63 65 49 64 5d  ength $sourceId]
8890: 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20   == 0} then {.. 
88a0: 20 20 20 20 20 20 20 20 20 73 65 74 20 73 6f 75           set sou
88b0: 72 63 65 49 64 20 6e 75 6c 6c 0d 0a 20 20 20 20  rceId null..    
88c0: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
88d0: 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
88e0: 54 45 3a 20 59 65 73 2c 20 74 68 65 20 53 51 4c  TE: Yes, the SQL
88f0: 69 74 65 20 63 6f 72 65 20 6c 69 62 72 61 72 79  ite core library
8900: 20 61 70 70 65 61 72 73 20 74 6f 20 62 65 20 61   appears to be a
8910: 76 61 69 6c 61 62 6c 65 2e 0d 0a 20 20 20 20 20  vailable...     
8920: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 61 64     #..        ad
8930: 64 43 6f 6e 73 74 72 61 69 6e 74 20 53 51 4c 69  dConstraint SQLi
8940: 74 65 0d 0a 0d 0a 20 20 20 20 20 20 20 20 74 70  te....        tp
8950: 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70  uts $channel [ap
8960: 70 65 6e 64 41 72 67 73 20 22 79 65 73 20 28 22  pendArgs "yes ("
8970: 20 24 76 65 72 73 69 6f 6e 20 22 20 22 20 24 73   $version " " $s
8980: 6f 75 72 63 65 49 64 20 22 29 5c 6e 22 5d 0d 0a  ourceId ")\n"]..
8990: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
89a0: 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
89b0: 68 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d 0a 20 20 20  hannel no\n..   
89c0: 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a     }..    }.....
89d0: 20 20 20 20 70 72 6f 63 20 63 68 65 63 6b 46 6f      proc checkFo
89e0: 72 53 51 4c 69 74 65 49 6e 74 65 72 6f 70 20 7b  rSQLiteInterop {
89f0: 20 63 68 61 6e 6e 65 6c 20 7d 20 7b 0d 0a 20 20   channel } {..  
8a00: 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
8a10: 65 6c 20 22 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e  el "---- checkin
8a20: 67 20 66 6f 72 20 53 51 4c 69 74 65 20 69 6e 74  g for SQLite int
8a30: 65 72 6f 70 20 61 73 73 65 6d 62 6c 79 2e 2e 2e  erop assembly...
8a40: 20 22 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b   "....      if {
8a50: 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20  [catch {..      
8a60: 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69          object i
8a70: 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f  nvoke -flags +No
8a80: 6e 50 75 62 6c 69 63 20 53 79 73 74 65 6d 2e 44  nPublic System.D
8a90: 61 74 61 2e 53 51 4c 69 74 65 2e 53 51 4c 69 74  ata.SQLite.SQLit
8aa0: 65 33 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  e3 \..          
8ab0: 20 20 20 20 49 6e 74 65 72 6f 70 56 65 72 73 69      InteropVersi
8ac0: 6f 6e 7d 20 76 65 72 73 69 6f 6e 5d 20 3d 3d 20  on} version] == 
8ad0: 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
8ae0: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
8af0: 4e 4f 54 45 3a 20 43 68 65 63 6b 20 69 66 20 74  NOTE: Check if t
8b00: 68 65 20 72 65 74 75 72 6e 65 64 20 76 65 72 73  he returned vers
8b10: 69 6f 6e 20 77 61 73 20 6e 75 6c 6c 2e 20 20 49  ion was null.  I
8b20: 66 20 73 6f 2c 20 6d 61 6b 65 20 69 74 20 65 61  f so, make it ea
8b30: 73 79 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  sy..        #   
8b40: 20 20 20 20 74 6f 20 73 70 6f 74 2e 0d 0a 20 20      to spot...  
8b50: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
8b60: 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e   if {[string len
8b70: 67 74 68 20 24 76 65 72 73 69 6f 6e 5d 20 3d 3d  gth $version] ==
8b80: 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
8b90: 20 20 20 20 20 20 73 65 74 20 76 65 72 73 69 6f        set versio
8ba0: 6e 20 6e 75 6c 6c 0d 0a 20 20 20 20 20 20 20 20  n null..        
8bb0: 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  }....        #..
8bc0: 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
8bd0: 41 74 74 65 6d 70 74 20 74 6f 20 71 75 65 72 79  Attempt to query
8be0: 20 74 68 65 20 46 6f 73 73 69 6c 20 73 6f 75 72   the Fossil sour
8bf0: 63 65 20 69 64 65 6e 74 69 66 69 65 72 20 66 6f  ce identifier fo
8c00: 72 20 74 68 65 20 53 51 4c 69 74 65 0d 0a 20 20  r the SQLite..  
8c10: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63 6f        #       co
8c20: 72 65 20 6c 69 62 72 61 72 79 2e 0d 0a 20 20 20  re library...   
8c30: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
8c40: 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20  if {[catch {..  
8c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 62                ob
8c60: 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61  ject invoke -fla
8c70: 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 53 79  gs +NonPublic Sy
8c80: 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
8c90: 2e 53 51 4c 69 74 65 33 20 5c 0d 0a 20 20 20 20  .SQLite3 \..    
8ca0: 20 20 20 20 20 20 20 20 20 20 20 20 49 6e 74 65              Inte
8cb0: 72 6f 70 53 6f 75 72 63 65 49 64 7d 20 73 6f 75  ropSourceId} sou
8cc0: 72 63 65 49 64 5d 7d 20 74 68 65 6e 20 7b 0d 0a  rceId]} then {..
8cd0: 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
8ce0: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 57         # NOTE: W
8cf0: 65 20 66 61 69 6c 65 64 20 74 6f 20 71 75 65 72  e failed to quer
8d00: 79 20 74 68 65 20 46 6f 73 73 69 6c 20 73 6f 75  y the Fossil sou
8d10: 72 63 65 20 69 64 65 6e 74 69 66 69 65 72 2e 0d  rce identifier..
8d20: 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
8d30: 20 20 20 20 20 20 20 20 73 65 74 20 73 6f 75 72          set sour
8d40: 63 65 49 64 20 75 6e 6b 6e 6f 77 6e 0d 0a 20 20  ceId unknown..  
8d50: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
8d60: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
8d70: 4e 4f 54 45 3a 20 43 68 65 63 6b 20 69 66 20 74  NOTE: Check if t
8d80: 68 65 20 72 65 74 75 72 6e 65 64 20 46 6f 73 73  he returned Foss
8d90: 69 6c 20 73 6f 75 72 63 65 20 69 64 65 6e 74 69  il source identi
8da0: 66 69 65 72 20 77 61 73 20 6e 75 6c 6c 2e 20 20  fier was null.  
8db0: 49 66 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  If..        #   
8dc0: 20 20 20 20 73 6f 2c 20 6d 61 6b 65 20 69 74 20      so, make it 
8dd0: 65 61 73 79 20 74 6f 20 73 70 6f 74 2e 0d 0a 20  easy to spot... 
8de0: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
8df0: 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65    if {[string le
8e00: 6e 67 74 68 20 24 73 6f 75 72 63 65 49 64 5d 20  ngth $sourceId] 
8e10: 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  == 0} then {..  
8e20: 20 20 20 20 20 20 20 20 73 65 74 20 73 6f 75 72          set sour
8e30: 63 65 49 64 20 6e 75 6c 6c 0d 0a 20 20 20 20 20  ceId null..     
8e40: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
8e50: 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
8e60: 45 3a 20 59 65 73 2c 20 74 68 65 20 53 51 4c 69  E: Yes, the SQLi
8e70: 74 65 20 69 6e 74 65 72 6f 70 20 61 73 73 65 6d  te interop assem
8e80: 62 6c 79 20 61 70 70 65 61 72 73 20 74 6f 20 62  bly appears to b
8e90: 65 20 61 76 61 69 6c 61 62 6c 65 2e 0d 0a 20 20  e available...  
8ea0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
8eb0: 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 53   addConstraint S
8ec0: 51 4c 69 74 65 49 6e 74 65 72 6f 70 0d 0a 0d 0a  QLiteInterop....
8ed0: 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
8ee0: 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
8ef0: 67 73 20 22 79 65 73 20 28 22 20 24 76 65 72 73  gs "yes (" $vers
8f00: 69 6f 6e 20 22 20 22 20 24 73 6f 75 72 63 65 49  ion " " $sourceI
8f10: 64 20 22 29 5c 6e 22 5d 0d 0a 20 20 20 20 20 20  d ")\n"]..      
8f20: 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
8f30: 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
8f40: 20 6e 6f 5c 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a   no\n..      }..
8f50: 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
8f60: 6f 63 20 63 68 65 63 6b 46 6f 72 53 51 4c 69 74  oc checkForSQLit
8f70: 65 44 65 66 69 6e 65 43 6f 6e 73 74 61 6e 74 20  eDefineConstant 
8f80: 7b 20 63 68 61 6e 6e 65 6c 20 6e 61 6d 65 20 7d  { channel name }
8f90: 20 7b 0d 0a 20 20 20 20 20 20 74 70 75 74 73 20   {..      tputs 
8fa0: 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  $channel [append
8fb0: 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
8fc0: 20 20 22 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e 67    "---- checking
8fd0: 20 66 6f 72 20 53 79 73 74 65 6d 2e 44 61 74 61   for System.Data
8fe0: 2e 53 51 4c 69 74 65 20 64 65 66 69 6e 65 20 63  .SQLite define c
8ff0: 6f 6e 73 74 61 6e 74 20 5c 22 22 20 24 6e 61 6d  onstant \"" $nam
9000: 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 22  e \..          "
9010: 5c 22 2e 2e 2e 20 22 5d 0d 0a 0d 0a 20 20 20 20  \"... "]....    
9020: 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a    if {[catch {..
9030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 62                ob
9040: 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61  ject invoke -fla
9050: 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 53 79  gs +NonPublic Sy
9060: 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
9070: 2e 53 51 4c 69 74 65 33 20 5c 0d 0a 20 20 20 20  .SQLite3 \..    
9080: 20 20 20 20 20 20 20 20 20 20 44 65 66 69 6e 65            Define
9090: 43 6f 6e 73 74 61 6e 74 73 7d 20 64 65 66 69 6e  Constants} defin
90a0: 65 43 6f 6e 73 74 61 6e 74 73 5d 20 3d 3d 20 30  eConstants] == 0
90b0: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
90c0: 20 20 69 66 20 7b 5b 6c 73 65 61 72 63 68 20 2d    if {[lsearch -
90d0: 65 78 61 63 74 20 2d 6e 6f 63 61 73 65 20 24 64  exact -nocase $d
90e0: 65 66 69 6e 65 43 6f 6e 73 74 61 6e 74 73 20 24  efineConstants $
90f0: 6e 61 6d 65 5d 20 21 3d 20 2d 31 7d 20 74 68 65  name] != -1} the
9100: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 23  n {..          #
9110: 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f  ..          # NO
9120: 54 45 3a 20 59 65 73 2c 20 74 68 69 73 20 64 65  TE: Yes, this de
9130: 66 69 6e 65 20 63 6f 6e 73 74 61 6e 74 20 77 61  fine constant wa
9140: 73 20 65 6e 61 62 6c 65 64 20 77 68 65 6e 20 74  s enabled when t
9150: 68 65 20 6d 61 6e 61 67 65 64 0d 0a 20 20 20 20  he managed..    
9160: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 61 73        #       as
9170: 73 65 6d 62 6c 79 20 77 61 73 20 63 6f 6d 70 69  sembly was compi
9180: 6c 65 64 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  led...          
9190: 23 0d 0a 20 20 20 20 20 20 20 20 20 20 61 64 64  #..          add
91a0: 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65  Constraint [appe
91b0: 6e 64 41 72 67 73 20 64 65 66 69 6e 65 43 6f 6e  ndArgs defineCon
91c0: 73 74 61 6e 74 2e 53 79 73 74 65 6d 2e 44 61 74  stant.System.Dat
91d0: 61 2e 53 51 4c 69 74 65 2e 20 24 6e 61 6d 65 5d  a.SQLite. $name]
91e0: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70  ....          tp
91f0: 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 79 65 73  uts $channel yes
9200: 5c 6e 0d 0a 20 20 20 20 20 20 20 20 7d 20 65 6c  \n..        } el
9210: 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  se {..          
9220: 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 6e  tputs $channel n
9230: 6f 5c 6e 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  o\n..        }..
9240: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
9250: 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
9260: 68 61 6e 6e 65 6c 20 65 72 72 6f 72 5c 6e 0d 0a  hannel error\n..
9270: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a        }..    }..
9280: 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74 44  ...    proc getD
9290: 61 74 65 54 69 6d 65 46 6f 72 6d 61 74 20 7b 7d  ateTimeFormat {}
92a0: 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20   {..      #..   
92b0: 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 69 73 20     # NOTE: This 
92c0: 70 72 6f 63 65 64 75 72 65 20 73 69 6d 70 6c 79  procedure simply
92d0: 20 72 65 74 75 72 6e 73 20 74 68 65 20 22 64 65   returns the "de
92e0: 66 61 75 6c 74 22 20 44 61 74 65 54 69 6d 65 20  fault" DateTime 
92f0: 66 6f 72 6d 61 74 20 75 73 65 64 0d 0a 20 20 20  format used..   
9300: 20 20 20 23 20 20 20 20 20 20 20 62 79 20 74 68     #       by th
9310: 65 20 74 65 73 74 20 73 75 69 74 65 2e 0d 0a 20  e test suite... 
9320: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66       #..      if
9330: 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a   {[info exists :
9340: 3a 64 61 74 65 74 69 6d 65 5f 66 6f 72 6d 61 74  :datetime_format
9350: 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20  ] && \..        
9360: 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68    [string length
9370: 20 24 3a 3a 64 61 74 65 74 69 6d 65 5f 66 6f 72   $::datetime_for
9380: 6d 61 74 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b  mat] > 0} then {
9390: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
93a0: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 52 65 74       # NOTE: Ret
93b0: 75 72 6e 20 74 68 65 20 6d 61 6e 75 61 6c 6c 79  urn the manually
93c0: 20 6f 76 65 72 72 69 64 64 65 6e 20 76 61 6c 75   overridden valu
93d0: 65 20 66 6f 72 20 74 68 65 20 44 61 74 65 54 69  e for the DateTi
93e0: 6d 65 20 66 6f 72 6d 61 74 2e 0d 0a 20 20 20 20  me format...    
93f0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72      #..        r
9400: 65 74 75 72 6e 20 24 3a 3a 64 61 74 65 74 69 6d  eturn $::datetim
9410: 65 5f 66 6f 72 6d 61 74 0d 0a 20 20 20 20 20 20  e_format..      
9420: 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
9430: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
9440: 4f 54 45 3a 20 52 65 74 75 72 6e 20 61 6e 20 49  OTE: Return an I
9450: 53 4f 38 36 30 31 20 44 61 74 65 54 69 6d 65 20  SO8601 DateTime 
9460: 66 6f 72 6d 61 74 20 63 6f 6d 70 61 74 69 62 6c  format compatibl
9470: 65 20 77 69 74 68 20 53 51 4c 69 74 65 2c 0d 0a  e with SQLite,..
9480: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
9490: 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
94a0: 74 65 2c 20 61 6e 64 20 73 75 69 74 61 62 6c 65  te, and suitable
94b0: 20 66 6f 72 20 72 6f 75 6e 64 2d 74 72 69 70 70   for round-tripp
94c0: 69 6e 67 20 77 69 74 68 20 74 68 65 0d 0a 20 20  ing with the..  
94d0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 44 61        #       Da
94e0: 74 65 54 69 6d 65 20 63 6c 61 73 73 20 6f 66 20  teTime class of 
94f0: 74 68 65 20 66 72 61 6d 65 77 6f 72 6b 2e 20 20  the framework.  
9500: 49 66 20 74 68 69 73 20 76 61 6c 75 65 20 69 73  If this value is
9510: 20 63 68 61 6e 67 65 64 2c 0d 0a 20 20 20 20 20   changed,..     
9520: 20 20 20 23 20 20 20 20 20 20 20 76 61 72 69 6f     #       vario
9530: 75 73 20 74 65 73 74 73 20 6d 61 79 20 66 61 69  us tests may fai
9540: 6c 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  l...        #.. 
9550: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 22 79         return "y
9560: 79 79 79 2d 4d 4d 2d 64 64 20 48 48 3a 6d 6d 3a  yyy-MM-dd HH:mm:
9570: 73 73 2e 46 46 46 46 46 46 46 4b 22 0d 0a 20 20  ss.FFFFFFFK"..  
9580: 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d      }..    }....
9590: 0a 20 20 20 20 70 72 6f 63 20 65 6e 75 6d 65 72  .    proc enumer
95a0: 61 62 6c 65 54 6f 4c 69 73 74 20 7b 20 65 6e 75  ableToList { enu
95b0: 6d 65 72 61 62 6c 65 20 7d 20 7b 0d 0a 20 20 20  merable } {..   
95c0: 20 20 20 73 65 74 20 72 65 73 75 6c 74 20 5b 6c     set result [l
95d0: 69 73 74 5d 0d 0a 0d 0a 20 20 20 20 20 20 69 66  ist]....      if
95e0: 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68   {[string length
95f0: 20 24 65 6e 75 6d 65 72 61 62 6c 65 5d 20 3d 3d   $enumerable] ==
9600: 20 30 20 7c 7c 20 24 65 6e 75 6d 65 72 61 62 6c   0 || $enumerabl
9610: 65 20 65 71 20 22 6e 75 6c 6c 22 7d 20 74 68 65  e eq "null"} the
9620: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 72 65 74  n {..        ret
9630: 75 72 6e 20 24 72 65 73 75 6c 74 0d 0a 20 20 20  urn $result..   
9640: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 6f 62     }....      ob
9650: 6a 65 63 74 20 66 6f 72 65 61 63 68 20 2d 61 6c  ject foreach -al
9660: 69 61 73 20 69 74 65 6d 20 24 65 6e 75 6d 65 72  ias item $enumer
9670: 61 62 6c 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  able {..        
9680: 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67  if {[string leng
9690: 74 68 20 24 69 74 65 6d 5d 20 3e 20 30 7d 20 74  th $item] > 0} t
96a0: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
96b0: 20 6c 61 70 70 65 6e 64 20 72 65 73 75 6c 74 20   lappend result 
96c0: 5b 24 69 74 65 6d 20 54 6f 53 74 72 69 6e 67 5d  [$item ToString]
96d0: 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20  ..        }..   
96e0: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65     }....      re
96f0: 74 75 72 6e 20 24 72 65 73 75 6c 74 0d 0a 20 20  turn $result..  
9700: 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
9710: 20 63 61 74 63 68 41 6e 64 52 65 74 75 72 6e 20   catchAndReturn 
9720: 7b 20 73 63 72 69 70 74 20 7b 73 74 61 63 6b 54  { script {stackT
9730: 72 61 63 65 20 66 61 6c 73 65 7d 20 7b 73 74 72  race false} {str
9740: 69 63 74 20 74 72 75 65 7d 20 7d 20 7b 0d 0a 20  ict true} } {.. 
9750: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
9760: 4e 4f 54 45 3a 20 45 76 61 6c 75 61 74 65 20 74  NOTE: Evaluate t
9770: 68 65 20 73 63 72 69 70 74 20 70 72 6f 76 69 64  he script provid
9780: 65 64 20 62 79 20 6f 75 72 20 63 61 6c 6c 65 72  ed by our caller
9790: 20 69 6e 20 74 68 65 69 72 20 63 6f 6e 74 65 78   in their contex
97a0: 74 2c 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  t,..      #     
97b0: 20 20 63 61 70 74 75 72 69 6e 67 20 62 6f 74 68    capturing both
97c0: 20 74 68 65 20 72 65 73 75 6c 74 20 61 6e 64 20   the result and 
97d0: 74 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65 2e  the return code.
97e0: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
97f0: 20 73 65 74 20 63 6f 64 65 20 5b 63 61 74 63 68   set code [catch
9800: 20 7b 75 70 6c 65 76 65 6c 20 31 20 24 73 63 72   {uplevel 1 $scr
9810: 69 70 74 7d 20 72 65 73 75 6c 74 5d 0d 0a 0d 0a  ipt} result]....
9820: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
9830: 20 4e 4f 54 45 3a 20 44 69 64 20 74 68 65 20 73   NOTE: Did the s
9840: 63 72 69 70 74 20 70 72 6f 76 69 64 65 64 20 62  cript provided b
9850: 79 20 6f 75 72 20 63 61 6c 6c 65 72 20 4e 4f 54  y our caller NOT
9860: 20 72 61 69 73 65 20 61 6e 20 65 72 72 6f 72 3f   raise an error?
9870: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
9880: 20 69 66 20 7b 24 73 74 72 69 63 74 20 26 26 20   if {$strict && 
9890: 24 63 6f 64 65 20 3d 3d 20 30 20 7c 7c 20 21 24  $code == 0 || !$
98a0: 73 74 72 69 63 74 20 26 26 20 24 63 6f 64 65 20  strict && $code 
98b0: 21 3d 20 31 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  != 1} then {..  
98c0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
98d0: 20 23 20 4e 4f 54 45 3a 20 53 75 63 63 65 73 73   # NOTE: Success
98e0: 2e 20 20 52 65 74 75 72 6e 20 61 20 6c 69 73 74  .  Return a list
98f0: 20 77 69 74 68 20 74 68 65 20 72 65 74 75 72 6e   with the return
9900: 20 63 6f 64 65 20 61 6e 64 20 74 68 65 20 72 65   code and the re
9910: 73 75 6c 74 2e 0d 0a 20 20 20 20 20 20 20 20 23  sult...        #
9920: 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ..        return
9930: 20 5b 6c 69 73 74 20 24 63 6f 64 65 20 24 72 65   [list $code $re
9940: 73 75 6c 74 5d 0d 0a 20 20 20 20 20 20 7d 20 65  sult]..      } e
9950: 6c 73 65 69 66 20 7b 24 73 74 61 63 6b 54 72 61  lseif {$stackTra
9960: 63 65 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  ce} then {..    
9970: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
9980: 20 4e 4f 54 45 3a 20 46 61 69 6c 75 72 65 2e 20   NOTE: Failure. 
9990: 20 4f 75 72 20 63 61 6c 6c 65 72 20 77 61 6e 74   Our caller want
99a0: 73 20 61 20 66 75 6c 6c 20 73 74 61 63 6b 20 74  s a full stack t
99b0: 72 61 63 65 20 28 69 66 20 61 70 70 6c 69 63 61  race (if applica
99c0: 62 6c 65 29 2c 0d 0a 20 20 20 20 20 20 20 20 23  ble),..        #
99d0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 61 20         return a 
99e0: 6c 69 73 74 20 77 69 74 68 20 74 68 65 20 72 65  list with the re
99f0: 74 75 72 6e 20 63 6f 64 65 20 61 6e 64 20 74 68  turn code and th
9a00: 65 20 72 65 73 75 6c 74 20 76 65 72 62 61 74 69  e result verbati
9a10: 6d 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  m...        #.. 
9a20: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b 6c         return [l
9a30: 69 73 74 20 24 63 6f 64 65 20 24 72 65 73 75 6c  ist $code $resul
9a40: 74 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65  t]..      } else
9a50: 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20   {..        #.. 
9a60: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 46         # NOTE: F
9a70: 61 69 6c 75 72 65 2e 20 20 4f 75 72 20 63 61 6c  ailure.  Our cal
9a80: 6c 65 72 20 64 6f 65 73 20 6e 6f 74 20 77 61 6e  ler does not wan
9a90: 74 20 61 20 66 75 6c 6c 20 73 74 61 63 6b 20 74  t a full stack t
9aa0: 72 61 63 65 20 28 69 66 0d 0a 20 20 20 20 20 20  race (if..      
9ab0: 20 20 23 20 20 20 20 20 20 20 61 70 70 6c 69 63    #       applic
9ac0: 61 62 6c 65 29 2c 20 72 65 74 75 72 6e 20 61 20  able), return a 
9ad0: 6c 69 73 74 20 77 69 74 68 20 74 68 65 20 72 65  list with the re
9ae0: 74 75 72 6e 20 63 6f 64 65 2c 20 74 68 65 20 65  turn code, the e
9af0: 72 72 6f 72 0d 0a 20 20 20 20 20 20 20 20 23 20  rror..        # 
9b00: 20 20 20 20 20 20 63 6f 64 65 20 66 6f 72 20 74        code for t
9b10: 68 65 20 69 6e 74 65 72 70 72 65 74 65 72 2c 20  he interpreter, 
9b20: 61 6e 64 20 74 68 65 20 65 72 72 6f 72 20 6d 65  and the error me
9b30: 73 73 61 67 65 20 75 70 20 74 6f 20 74 68 65 0d  ssage up to the.
9b40: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
9b50: 20 70 6f 69 6e 74 20 77 68 65 72 65 20 74 68 65   point where the
9b60: 20 73 74 61 63 6b 20 74 72 61 63 65 20 73 68 6f   stack trace sho
9b70: 75 6c 64 20 73 74 61 72 74 2e 0d 0a 20 20 20 20  uld start...    
9b80: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 73      #..        s
9b90: 65 74 20 69 6e 64 65 78 20 5b 73 74 72 69 6e 67  et index [string
9ba0: 20 66 69 72 73 74 20 22 20 20 20 61 74 20 22 20   first "   at " 
9bb0: 24 72 65 73 75 6c 74 5d 3b 20 23 20 48 41 43 4b  $result]; # HACK
9bc0: 3a 20 52 65 6c 69 61 62 6c 65 3f 0d 0a 0d 0a 20  : Reliable?.... 
9bd0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b 6c         return [l
9be0: 69 73 74 20 24 63 6f 64 65 20 24 3a 3a 65 72 72  ist $code $::err
9bf0: 6f 72 43 6f 64 65 20 5b 65 78 70 72 20 7b 24 69  orCode [expr {$i
9c00: 6e 64 65 78 20 21 3d 20 2d 31 20 3f 20 5c 0d 0a  ndex != -1 ? \..
9c10: 20 20 20 20 20 20 20 20 20 20 20 20 5b 73 74 72              [str
9c20: 69 6e 67 20 74 72 69 6d 20 5b 73 74 72 69 6e 67  ing trim [string
9c30: 20 72 61 6e 67 65 20 24 72 65 73 75 6c 74 20 30   range $result 0
9c40: 20 24 69 6e 64 65 78 5d 5d 20 3a 20 24 72 65 73   $index]] : $res
9c50: 75 6c 74 7d 5d 5d 0d 0a 20 20 20 20 20 20 7d 0d  ult}]]..      }.
9c60: 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70  .    }.....    p
9c70: 72 6f 63 20 63 6f 6d 70 69 6c 65 43 53 68 61 72  roc compileCShar
9c80: 70 57 69 74 68 20 7b 0d 0a 20 20 20 20 20 20 20  pWith {..       
9c90: 20 20 20 20 20 74 65 78 74 20 6d 65 6d 6f 72 79       text memory
9ca0: 20 73 79 6d 62 6f 6c 73 20 73 74 72 69 63 74 20   symbols strict 
9cb0: 72 65 73 75 6c 74 73 56 61 72 4e 61 6d 65 20 65  resultsVarName e
9cc0: 72 72 6f 72 73 56 61 72 4e 61 6d 65 20 66 69 6c  rrorsVarName fil
9cd0: 65 4e 61 6d 65 73 0d 0a 20 20 20 20 20 20 20 20  eNames..        
9ce0: 20 20 20 20 61 72 67 73 20 7d 20 7b 0d 0a 20 20      args } {..  
9cf0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
9d00: 4f 54 45 3a 20 53 69 6e 63 65 20 77 65 20 61 72  OTE: Since we ar
9d10: 65 20 67 6f 69 6e 67 20 74 6f 20 75 73 65 20 74  e going to use t
9d20: 68 69 73 20 6d 65 74 68 6f 64 20 6e 61 6d 65 20  his method name 
9d30: 61 20 6c 6f 74 2c 20 61 73 73 69 67 6e 20 69 74  a lot, assign it
9d40: 20 74 6f 20 61 0d 0a 20 20 20 20 20 20 23 20 20   to a..      #  
9d50: 20 20 20 20 20 76 61 72 69 61 62 6c 65 20 66 69       variable fi
9d60: 72 73 74 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  rst...      #.. 
9d70: 20 20 20 20 20 73 65 74 20 61 64 64 20 52 65 66       set add Ref
9d80: 65 72 65 6e 63 65 64 41 73 73 65 6d 62 6c 69 65  erencedAssemblie
9d90: 73 2e 41 64 64 0d 0a 0d 0a 20 20 20 20 20 20 23  s.Add....      #
9da0: 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
9db0: 43 72 65 61 74 65 20 74 68 65 20 62 61 73 65 20  Create the base 
9dc0: 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 76 61 6c 75  command to evalu
9dd0: 61 74 65 20 61 6e 64 20 61 64 64 20 74 68 65 20  ate and add the 
9de0: 70 72 6f 70 65 72 74 79 20 73 65 74 74 69 6e 67  property setting
9df0: 73 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  s..      #      
9e00: 20 74 68 61 74 20 61 72 65 20 61 6c 6d 6f 73 74   that are almost
9e10: 20 61 6c 77 61 79 73 20 6e 65 65 64 65 64 20 62   always needed b
9e20: 79 20 6f 75 72 20 75 6e 69 74 20 74 65 73 74 73  y our unit tests
9e30: 20 28 69 2e 65 2e 20 74 68 65 20 53 79 73 74 65   (i.e. the Syste
9e40: 6d 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  m..      #      
9e50: 20 61 6e 64 20 53 79 73 74 65 6d 2e 44 61 74 61   and System.Data
9e60: 20 61 73 73 65 6d 62 6c 79 20 72 65 66 65 72 65   assembly refere
9e70: 6e 63 65 73 29 2e 0d 0a 20 20 20 20 20 20 23 0d  nces)...      #.
9e80: 0a 20 20 20 20 20 20 73 65 74 20 63 6f 6d 6d 61  .      set comma
9e90: 6e 64 20 5b 6c 69 73 74 20 63 6f 6d 70 69 6c 65  nd [list compile
9ea0: 43 53 68 61 72 70 20 24 74 65 78 74 20 24 6d 65  CSharp $text $me
9eb0: 6d 6f 72 79 20 24 73 79 6d 62 6f 6c 73 20 24 73  mory $symbols $s
9ec0: 74 72 69 63 74 20 72 65 73 75 6c 74 73 20 5c 0d  trict results \.
9ed0: 0a 20 20 20 20 20 20 20 20 20 20 65 72 72 6f 72  .          error
9ee0: 73 20 24 61 64 64 20 53 79 73 74 65 6d 2e 64 6c  s $add System.dl
9ef0: 6c 20 24 61 64 64 20 53 79 73 74 65 6d 2e 44 61  l $add System.Da
9f00: 74 61 2e 64 6c 6c 20 24 61 64 64 20 53 79 73 74  ta.dll $add Syst
9f10: 65 6d 2e 58 6d 6c 2e 64 6c 6c 5d 0d 0a 0d 0a 20  em.Xml.dll].... 
9f20: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
9f30: 4e 4f 54 45 3a 20 41 64 64 20 61 6c 6c 20 74 68  NOTE: Add all th
9f40: 65 20 70 72 6f 76 69 64 65 64 20 66 69 6c 65 20  e provided file 
9f50: 6e 61 6d 65 73 20 61 73 20 61 73 73 65 6d 62 6c  names as assembl
9f60: 79 20 72 65 66 65 72 65 6e 63 65 73 2e 0d 0a 20  y references... 
9f70: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 66 6f       #..      fo
9f80: 72 65 61 63 68 20 66 69 6c 65 4e 61 6d 65 20 24  reach fileName $
9f90: 66 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20  fileNames {..   
9fa0: 20 20 20 20 20 6c 61 70 70 65 6e 64 20 63 6f 6d       lappend com
9fb0: 6d 61 6e 64 20 24 61 64 64 20 5b 67 65 74 42 69  mand $add [getBi
9fc0: 6e 61 72 79 46 69 6c 65 4e 61 6d 65 20 24 66 69  naryFileName $fi
9fd0: 6c 65 4e 61 6d 65 5d 0d 0a 20 20 20 20 20 20 7d  leName]..      }
9fe0: 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  ....      #..   
9ff0: 20 20 20 23 20 4e 4f 54 45 3a 20 41 64 64 20 74     # NOTE: Add t
a000: 68 65 20 65 78 74 72 61 20 61 72 67 75 6d 65 6e  he extra argumen
a010: 74 73 2c 20 69 66 20 61 6e 79 2c 20 74 6f 20 74  ts, if any, to t
a020: 68 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 76  he command to ev
a030: 61 6c 75 61 74 65 2e 0d 0a 20 20 20 20 20 20 23  aluate...      #
a040: 0d 0a 20 20 20 20 20 20 65 76 61 6c 20 6c 61 70  ..      eval lap
a050: 70 65 6e 64 20 63 6f 6d 6d 61 6e 64 20 24 61 72  pend command $ar
a060: 67 73 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20  gs....      #.. 
a070: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 6c 69       # NOTE: Ali
a080: 61 73 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 20  as the compiler 
a090: 6c 6f 63 61 6c 20 72 65 73 75 6c 74 73 20 61 6e  local results an
a0a0: 64 20 65 72 72 6f 72 73 20 76 61 72 69 61 62 6c  d errors variabl
a0b0: 65 73 20 74 6f 20 74 68 65 0d 0a 20 20 20 20 20  es to the..     
a0c0: 20 23 20 20 20 20 20 20 20 76 61 72 69 61 62 6c   #       variabl
a0d0: 65 20 6e 61 6d 65 73 20 70 72 6f 76 69 64 65 64  e names provided
a0e0: 20 62 79 20 6f 75 72 20 63 61 6c 6c 65 72 2e 0d   by our caller..
a0f0: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
a100: 75 70 76 61 72 20 31 20 24 72 65 73 75 6c 74 73  upvar 1 $results
a110: 56 61 72 4e 61 6d 65 20 72 65 73 75 6c 74 73 0d  VarName results.
a120: 0a 20 20 20 20 20 20 75 70 76 61 72 20 31 20 24  .      upvar 1 $
a130: 65 72 72 6f 72 73 56 61 72 4e 61 6d 65 20 65 72  errorsVarName er
a140: 72 6f 72 73 0d 0a 0d 0a 20 20 20 20 20 20 23 0d  rors....      #.
a150: 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 45  .      # NOTE: E
a160: 76 61 6c 75 61 74 65 20 74 68 65 20 63 6f 6e 73  valuate the cons
a170: 74 72 75 63 74 65 64 20 5b 63 6f 6d 70 69 6c 65  tructed [compile
a180: 43 53 68 61 72 70 5d 20 63 6f 6d 6d 61 6e 64 20  CSharp] command 
a190: 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65 0d 0a  and return the..
a1a0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 72 65        #       re
a1b0: 73 75 6c 74 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  sult...      #..
a1c0: 20 20 20 20 20 20 65 76 61 6c 20 24 63 6f 6d 6d        eval $comm
a1d0: 61 6e 64 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20  and..    }..... 
a1e0: 20 20 20 70 72 6f 63 20 69 73 4d 65 6d 6f 72 79     proc isMemory
a1f0: 44 62 20 7b 20 66 69 6c 65 4e 61 6d 65 20 7d 20  Db { fileName } 
a200: 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  {..      #..    
a210: 20 20 23 20 4e 4f 54 45 3a 20 49 73 20 74 68 65    # NOTE: Is the
a220: 20 73 70 65 63 69 66 69 65 64 20 64 61 74 61 62   specified datab
a230: 61 73 65 20 66 69 6c 65 20 6e 61 6d 65 20 72 65  ase file name re
a240: 61 6c 6c 79 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  ally an in-memor
a250: 79 20 64 61 74 61 62 61 73 65 3f 0d 0a 20 20 20  y database?..   
a260: 20 20 20 23 0d 0a 20 20 20 20 20 20 72 65 74 75     #..      retu
a270: 72 6e 20 5b 65 78 70 72 20 7b 24 66 69 6c 65 4e  rn [expr {$fileN
a280: 61 6d 65 20 65 71 20 22 3a 6d 65 6d 6f 72 79 3a  ame eq ":memory:
a290: 22 20 7c 7c 20 5c 0d 0a 20 20 20 20 20 20 20 20  " || \..        
a2a0: 20 20 5b 73 74 72 69 6e 67 20 72 61 6e 67 65 20    [string range 
a2b0: 24 66 69 6c 65 4e 61 6d 65 20 30 20 31 32 5d 20  $fileName 0 12] 
a2c0: 65 71 20 22 66 69 6c 65 3a 3a 6d 65 6d 6f 72 79  eq "file::memory
a2d0: 3a 22 7d 5d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a  :"}]..    }.....
a2e0: 20 20 20 20 70 72 6f 63 20 69 73 54 61 62 6c 65      proc isTable
a2f0: 49 6e 44 62 20 7b 20 6e 61 6d 65 20 7b 76 61 72  InDb { name {var
a300: 4e 61 6d 65 20 64 62 7d 20 7d 20 7b 0d 0a 20 20  Name db} } {..  
a310: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
a320: 4f 54 45 3a 20 52 65 66 65 72 20 74 6f 20 74 68  OTE: Refer to th
a330: 65 20 73 70 65 63 69 66 69 65 64 20 76 61 72 69  e specified vari
a340: 61 62 6c 65 20 28 65 2e 67 2e 20 22 64 62 22 29  able (e.g. "db")
a350: 20 69 6e 20 74 68 65 20 63 6f 6e 74 65 78 74 20   in the context 
a360: 6f 66 20 6f 75 72 0d 0a 20 20 20 20 20 20 23 20  of our..      # 
a370: 20 20 20 20 20 20 63 61 6c 6c 65 72 2e 20 20 49        caller.  I
a380: 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 64  t contains the d
a390: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
a3a0: 6f 6e 20 68 61 6e 64 6c 65 20 74 68 61 74 20 77  on handle that w
a3b0: 69 6c 6c 20 62 65 0d 0a 20 20 20 20 20 20 23 20  ill be..      # 
a3c0: 20 20 20 20 20 20 75 73 65 64 20 74 6f 20 65 78        used to ex
a3d0: 65 63 75 74 65 20 74 68 65 20 71 75 65 72 79 20  ecute the query 
a3e0: 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e  used to determin
a3f0: 65 20 69 66 20 74 68 65 20 6e 61 6d 65 64 20 74  e if the named t
a400: 61 62 6c 65 20 69 73 0d 0a 20 20 20 20 20 20 23  able is..      #
a410: 20 20 20 20 20 20 20 70 72 65 73 65 6e 74 20 69         present i
a420: 6e 20 74 68 61 74 20 64 61 74 61 62 61 73 65 2e  n that database.
a430: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
a440: 20 75 70 76 61 72 20 31 20 24 76 61 72 4e 61 6d   upvar 1 $varNam
a450: 65 20 64 62 0d 0a 0d 0a 20 20 20 20 20 20 23 0d  e db....      #.
a460: 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 45  .      # NOTE: E
a470: 78 65 63 75 74 65 20 74 68 65 20 53 51 4c 20 71  xecute the SQL q
a480: 75 65 72 79 20 61 67 61 69 6e 73 74 20 74 68 65  uery against the
a490: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74   sqlite_master t
a4a0: 61 62 6c 65 20 74 6f 20 63 68 65 63 6b 20 69 66  able to check if
a4b0: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
a4c0: 74 68 65 20 6e 61 6d 65 64 20 74 61 62 6c 65 20  the named table 
a4d0: 69 73 20 70 72 65 73 65 6e 74 20 61 6e 64 20 72  is present and r
a4e0: 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69  eturn non-zero i
a4f0: 66 20 69 74 20 69 73 2e 0d 0a 20 20 20 20 20 20  f it is...      
a500: 23 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  #..      return 
a510: 5b 65 78 70 72 20 7b 5b 73 71 6c 20 65 78 65 63  [expr {[sql exec
a520: 75 74 65 20 2d 65 78 65 63 75 74 65 20 73 63 61  ute -execute sca
a530: 6c 61 72 20 24 64 62 20 5c 0d 0a 20 20 20 20 20  lar $db \..     
a540: 20 20 20 20 20 22 53 45 4c 45 43 54 20 43 4f 55       "SELECT COU
a550: 4e 54 28 2a 29 20 46 52 4f 4d 20 73 71 6c 69 74  NT(*) FROM sqlit
a560: 65 5f 6d 61 73 74 65 72 20 57 48 45 52 45 20 74  e_master WHERE t
a570: 79 70 65 20 3d 20 27 74 61 62 6c 65 27 20 41 4e  ype = 'table' AN
a580: 44 20 6e 61 6d 65 20 3d 20 3f 3b 22 20 5c 0d 0a  D name = ?;" \..
a590: 20 20 20 20 20 20 20 20 20 20 5b 6c 69 73 74 20            [list 
a5a0: 70 61 72 61 6d 31 20 53 74 72 69 6e 67 20 24 6e  param1 String $n
a5b0: 61 6d 65 5d 5d 20 3e 20 30 7d 5d 0d 0a 20 20 20  ame]] > 0}]..   
a5c0: 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
a5d0: 74 72 69 6d 53 71 6c 20 7b 20 73 71 6c 20 7d 20  trimSql { sql } 
a5e0: 7b 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  {..      return 
a5f0: 5b 72 65 67 73 75 62 20 2d 61 6c 6c 20 2d 2d 20  [regsub -all -- 
a600: 7b 5c 73 2b 7d 20 5b 73 74 72 69 6e 67 20 74 72  {\s+} [string tr
a610: 69 6d 20 24 73 71 6c 5d 20 22 20 22 5d 0d 0a 20  im $sql] " "].. 
a620: 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
a630: 63 20 65 78 65 63 75 74 65 53 71 6c 20 7b 20 73  c executeSql { s
a640: 71 6c 20 7b 65 78 65 63 75 74 65 20 6e 6f 6e 65  ql {execute none
a650: 7d 20 7b 66 69 6c 65 4e 61 6d 65 20 22 22 7d 20  } {fileName ""} 
a660: 7d 20 7b 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b  } {..      if {[
a670: 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 66  string length $f
a680: 69 6c 65 4e 61 6d 65 5d 20 3d 3d 20 30 7d 20 74  ileName] == 0} t
a690: 68 65 6e 20 7b 73 65 74 20 66 69 6c 65 4e 61 6d  hen {set fileNam
a6a0: 65 20 3a 6d 65 6d 6f 72 79 3a 7d 0d 0a 20 20 20  e :memory:}..   
a6b0: 20 20 20 73 65 74 75 70 44 62 20 24 66 69 6c 65     setupDb $file
a6c0: 4e 61 6d 65 20 22 22 20 22 22 20 22 22 20 22 22  Name "" "" "" ""
a6d0: 20 22 22 20 66 61 6c 73 65 20 66 61 6c 73 65 20   "" false false 
a6e0: 66 61 6c 73 65 20 66 61 6c 73 65 20 6d 65 6d 44  false false memD
a6f0: 62 0d 0a 0d 0a 20 20 20 20 20 20 74 72 79 20 7b  b....      try {
a700: 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ..        return
a710: 20 5b 73 71 6c 20 65 78 65 63 75 74 65 20 2d 65   [sql execute -e
a720: 78 65 63 75 74 65 20 24 65 78 65 63 75 74 65 20  xecute $execute 
a730: 24 6d 65 6d 44 62 20 24 73 71 6c 5d 0d 0a 20 20  $memDb $sql]..  
a740: 20 20 20 20 7d 20 66 69 6e 61 6c 6c 79 20 7b 0d      } finally {.
a750: 0a 20 20 20 20 20 20 20 20 63 6c 65 61 6e 75 70  .        cleanup
a760: 44 62 20 24 66 69 6c 65 4e 61 6d 65 20 6d 65 6d  Db $fileName mem
a770: 44 62 20 66 61 6c 73 65 20 66 61 6c 73 65 0d 0a  Db false false..
a780: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a        }..    }..
a790: 0c 0d 0a 20 20 20 20 70 72 6f 63 20 73 65 74 75  ...    proc setu
a7a0: 70 44 62 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  pDb {..         
a7b0: 20 20 20 66 69 6c 65 4e 61 6d 65 20 7b 6d 6f 64     fileName {mod
a7c0: 65 20 22 22 7d 20 7b 64 61 74 65 54 69 6d 65 46  e ""} {dateTimeF
a7d0: 6f 72 6d 61 74 20 22 22 7d 20 7b 64 61 74 65 54  ormat ""} {dateT
a7e0: 69 6d 65 4b 69 6e 64 20 22 22 7d 20 7b 66 6c 61  imeKind ""} {fla
a7f0: 67 73 20 22 22 7d 0d 0a 20 20 20 20 20 20 20 20  gs ""}..        
a800: 20 20 20 20 7b 65 78 74 72 61 20 22 22 7d 20 7b      {extra ""} {
a810: 71 75 61 6c 69 66 79 20 74 72 75 65 7d 20 7b 64  qualify true} {d
a820: 65 6c 65 74 65 20 74 72 75 65 7d 20 7b 75 72 69  elete true} {uri
a830: 20 66 61 6c 73 65 7d 0d 0a 20 20 20 20 20 20 20   false}..       
a840: 20 20 20 20 20 7b 74 65 6d 70 6f 72 61 72 79 20       {temporary 
a850: 74 72 75 65 7d 20 7b 76 61 72 4e 61 6d 65 20 64  true} {varName d
a860: 62 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d  b} } {..      #.
a870: 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 46  .      # NOTE: F
a880: 69 72 73 74 2c 20 73 65 65 20 69 66 20 6f 75 72  irst, see if our
a890: 20 63 61 6c 6c 65 72 20 68 61 73 20 72 65 71 75   caller has requ
a8a0: 65 73 74 65 64 20 61 6e 20 69 6e 2d 6d 65 6d 6f  ested an in-memo
a8b0: 72 79 20 64 61 74 61 62 61 73 65 2e 0d 0a 20 20  ry database...  
a8c0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 73 65 74      #..      set
a8d0: 20 69 73 4d 65 6d 6f 72 79 20 5b 69 73 4d 65 6d   isMemory [isMem
a8e0: 6f 72 79 44 62 20 24 66 69 6c 65 4e 61 6d 65 5d  oryDb $fileName]
a8f0: 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  ....      #..   
a900: 20 20 20 23 20 4e 4f 54 45 3a 20 46 6f 72 20 6e     # NOTE: For n
a910: 6f 77 2c 20 61 6c 6c 20 74 65 73 74 20 64 61 74  ow, all test dat
a920: 61 62 61 73 65 73 20 75 73 65 64 20 62 79 20 74  abases used by t
a930: 68 65 20 74 65 73 74 20 73 75 69 74 65 20 61 72  he test suite ar
a940: 65 20 70 6c 61 63 65 64 0d 0a 20 20 20 20 20 20  e placed..      
a950: 23 20 20 20 20 20 20 20 69 6e 74 6f 20 74 68 65  #       into the
a960: 20 64 61 74 61 62 61 73 65 20 64 69 72 65 63 74   database direct
a970: 6f 72 79 2e 20 20 45 61 63 68 20 64 61 74 61 62  ory.  Each datab
a980: 61 73 65 20 61 6e 64 20 72 65 6c 61 74 65 64 20  ase and related 
a990: 66 69 6c 65 73 0d 0a 20 20 20 20 20 20 23 20 20  files..      #  
a9a0: 20 20 20 20 20 75 73 65 64 20 62 79 20 61 20 74       used by a t
a9b0: 65 73 74 20 73 68 6f 75 6c 64 20 62 65 20 63 6c  est should be cl
a9c0: 65 61 6e 65 64 20 75 70 20 62 79 20 74 68 61 74  eaned up by that
a9d0: 20 74 65 73 74 20 75 73 69 6e 67 20 74 68 65 0d   test using the.
a9e0: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 22  .      #       "
a9f0: 63 6c 65 61 6e 75 70 44 62 22 20 70 72 6f 63 65  cleanupDb" proce
aa00: 64 75 72 65 2c 20 62 65 6c 6f 77 2e 0d 0a 20 20  dure, below...  
aa10: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20      #..      if 
aa20: 7b 21 24 69 73 4d 65 6d 6f 72 79 20 26 26 20 24  {!$isMemory && $
aa30: 71 75 61 6c 69 66 79 7d 20 74 68 65 6e 20 7b 0d  qualify} then {.
aa40: 0a 20 20 20 20 20 20 20 20 73 65 74 20 66 69 6c  .        set fil
aa50: 65 4e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e  eName [file join
aa60: 20 5b 67 65 74 44 61 74 61 62 61 73 65 44 69 72   [getDatabaseDir
aa70: 65 63 74 6f 72 79 5d 20 5b 66 69 6c 65 20 74 61  ectory] [file ta
aa80: 69 6c 20 24 66 69 6c 65 4e 61 6d 65 5d 5d 0d 0a  il $fileName]]..
aa90: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
aaa0: 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
aab0: 3a 20 42 79 20 64 65 66 61 75 6c 74 2c 20 64 65  : By default, de
aac0: 6c 65 74 65 20 61 6e 79 20 70 72 65 2d 65 78 69  lete any pre-exi
aad0: 73 74 69 6e 67 20 64 61 74 61 62 61 73 65 20 77  sting database w
aae0: 69 74 68 20 74 68 65 20 73 61 6d 65 20 66 69 6c  ith the same fil
aaf0: 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  e..      #      
ab00: 20 6e 61 6d 65 20 69 66 20 69 74 20 63 75 72 72   name if it curr
ab10: 65 6e 74 6c 79 20 65 78 69 73 74 73 2e 0d 0a 20  ently exists... 
ab20: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66       #..      if
ab30: 20 7b 21 24 69 73 4d 65 6d 6f 72 79 20 26 26 20   {!$isMemory && 
ab40: 24 64 65 6c 65 74 65 20 26 26 20 5b 66 69 6c 65  $delete && [file
ab50: 20 65 78 69 73 74 73 20 24 66 69 6c 65 4e 61 6d   exists $fileNam
ab60: 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  e]} then {..    
ab70: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
ab80: 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74 20 74   NOTE: Attempt t
ab90: 6f 20 64 65 6c 65 74 65 20 61 6e 79 20 70 72 65  o delete any pre
aba0: 2d 65 78 69 73 74 69 6e 67 20 64 61 74 61 62 61  -existing databa
abb0: 73 65 20 77 69 74 68 20 74 68 65 20 73 61 6d 65  se with the same
abc0: 20 66 69 6c 65 0d 0a 20 20 20 20 20 20 20 20 23   file..        #
abd0: 20 20 20 20 20 20 20 6e 61 6d 65 2e 0d 0a 20 20         name...  
abe0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
abf0: 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 66 69 6c   if {[catch {fil
ac00: 65 20 64 65 6c 65 74 65 20 24 66 69 6c 65 4e 61  e delete $fileNa
ac10: 6d 65 7d 20 65 72 72 6f 72 5d 7d 20 74 68 65 6e  me} error]} then
ac20: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d   {..          #.
ac30: 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54  .          # NOT
ac40: 45 3a 20 57 65 20 73 6f 6d 65 68 6f 77 20 66 61  E: We somehow fa
ac50: 69 6c 65 64 20 74 6f 20 64 65 6c 65 74 65 20 74  iled to delete t
ac60: 68 65 20 66 69 6c 65 2c 20 72 65 70 6f 72 74 20  he file, report 
ac70: 77 68 79 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  why...          
ac80: 23 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70 75  #..          tpu
ac90: 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
aca0: 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
acb0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
acc0: 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66  "==== WARNING: f
acd0: 61 69 6c 65 64 20 74 6f 20 64 65 6c 65 74 65 20  ailed to delete 
ace0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 5c 22  database file \"
acf0: 22 20 24 66 69 6c 65 4e 61 6d 65 20 5c 0d 0a 20  " $fileName \.. 
ad00: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 5c 22               "\"
ad10: 20 64 75 72 69 6e 67 20 73 65 74 75 70 2c 20 65   during setup, e
ad20: 72 72 6f 72 3a 20 22 20 5c 6e 5c 74 20 24 65 72  rror: " \n\t $er
ad30: 72 6f 72 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20  ror \n]..       
ad40: 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20   }..      }.... 
ad50: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
ad60: 4e 4f 54 45 3a 20 52 65 66 65 72 20 74 6f 20 74  NOTE: Refer to t
ad70: 68 65 20 73 70 65 63 69 66 69 65 64 20 76 61 72  he specified var
ad80: 69 61 62 6c 65 20 28 65 2e 67 2e 20 22 64 62 22  iable (e.g. "db"
ad90: 29 20 69 6e 20 74 68 65 20 63 6f 6e 74 65 78 74  ) in the context
ada0: 20 6f 66 20 6f 75 72 0d 0a 20 20 20 20 20 20 23   of our..      #
adb0: 20 20 20 20 20 20 20 63 61 6c 6c 65 72 2e 20 20         caller.  
adc0: 54 68 65 20 68 61 6e 64 6c 65 20 74 6f 20 74 68  The handle to th
add0: 65 20 6f 70 65 6e 65 64 20 64 61 74 61 62 61 73  e opened databas
ade0: 65 20 77 69 6c 6c 20 62 65 20 73 74 6f 72 65 64  e will be stored
adf0: 20 74 68 65 72 65 2e 0d 0a 20 20 20 20 20 20 23   there...      #
ae00: 0d 0a 20 20 20 20 20 20 75 70 76 61 72 20 31 20  ..      upvar 1 
ae10: 24 76 61 72 4e 61 6d 65 20 64 62 0d 0a 0d 0a 20  $varName db.... 
ae20: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
ae30: 4e 4f 54 45 3a 20 53 74 61 72 74 20 62 75 69 6c  NOTE: Start buil
ae40: 64 69 6e 67 20 74 68 65 20 63 6f 6e 6e 65 63 74  ding the connect
ae50: 69 6f 6e 20 73 74 72 69 6e 67 2e 20 20 54 68 65  ion string.  The
ae60: 20 6f 6e 6c 79 20 72 65 71 75 69 72 65 64 20 70   only required p
ae70: 6f 72 74 69 6f 6e 0d 0a 20 20 20 20 20 20 23 20  ortion..      # 
ae80: 20 20 20 20 20 20 6f 66 20 74 68 65 20 63 6f 6e        of the con
ae90: 6e 65 63 74 69 6f 6e 20 73 74 72 69 6e 67 20 69  nection string i
aea0: 73 20 74 68 65 20 64 61 74 61 20 73 6f 75 72 63  s the data sourc
aeb0: 65 2c 20 77 68 69 63 68 20 63 6f 6e 74 61 69 6e  e, which contain
aec0: 73 20 74 68 65 0d 0a 20 20 20 20 20 20 23 20 20  s the..      #  
aed0: 20 20 20 20 20 64 61 74 61 62 61 73 65 20 66 69       database fi
aee0: 6c 65 20 6e 61 6d 65 20 69 74 73 65 6c 66 2e 20  le name itself. 
aef0: 20 49 66 20 6f 75 72 20 63 61 6c 6c 65 72 20 77   If our caller w
af00: 61 6e 74 73 20 74 6f 20 75 73 65 20 61 20 55 52  ants to use a UR
af10: 49 20 61 73 0d 0a 20 20 20 20 20 20 23 20 20 20  I as..      #   
af20: 20 20 20 20 74 68 65 20 64 61 74 61 20 73 6f 75      the data sou
af30: 72 63 65 2c 20 75 73 65 20 74 68 65 20 46 75 6c  rce, use the Ful
af40: 6c 55 72 69 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  lUri connection 
af50: 73 74 72 69 6e 67 20 70 72 6f 70 65 72 74 79 20  string property 
af60: 74 6f 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  to..      #     
af70: 20 20 70 72 65 76 65 6e 74 20 74 68 65 20 64 61    prevent the da
af80: 74 61 20 73 6f 75 72 63 65 20 73 74 72 69 6e 67  ta source string
af90: 20 66 72 6f 6d 20 62 65 69 6e 67 20 6d 61 6e 67   from being mang
afa0: 6c 65 64 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  led...      #.. 
afb0: 20 20 20 20 20 69 66 20 7b 24 75 72 69 7d 20 74       if {$uri} t
afc0: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 73  hen {..        s
afd0: 65 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 7b 46  et connection {F
afe0: 75 6c 6c 55 72 69 3d 24 7b 66 69 6c 65 4e 61 6d  ullUri=${fileNam
aff0: 65 7d 7d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73  e}}..      } els
b000: 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 65 74  e {..        set
b010: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 7b 44 61 74   connection {Dat
b020: 61 20 53 6f 75 72 63 65 3d 24 7b 66 69 6c 65 4e  a Source=${fileN
b030: 61 6d 65 7d 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a  ame}}..      }..
b040: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
b050: 20 23 20 4e 4f 54 45 3a 20 53 69 6e 63 65 20 74   # NOTE: Since t
b060: 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 68 61  his procedure ha
b070: 73 20 6e 6f 20 73 70 65 63 69 61 6c 20 6b 6e 6f  s no special kno
b080: 77 6c 65 64 67 65 20 6f 66 20 77 68 61 74 20 74  wledge of what t
b090: 68 65 20 64 65 66 61 75 6c 74 0d 0a 20 20 20 20  he default..    
b0a0: 20 20 23 20 20 20 20 20 20 20 73 65 74 74 69 6e    #       settin
b0b0: 67 20 69 73 20 66 6f 72 20 74 68 65 20 54 6f 46  g is for the ToF
b0c0: 75 6c 6c 50 61 74 68 20 63 6f 6e 6e 65 63 74 69  ullPath connecti
b0d0: 6f 6e 20 73 74 72 69 6e 67 20 70 72 6f 70 65 72  on string proper
b0e0: 79 2c 20 61 6c 77 61 79 73 0d 0a 20 20 20 20 20  y, always..     
b0f0: 20 23 20 20 20 20 20 20 20 61 64 64 20 74 68 65   #       add the
b100: 20 76 61 6c 75 65 20 77 65 20 6b 6e 6f 77 20 61   value we know a
b110: 62 6f 75 74 20 74 6f 20 74 68 65 20 63 6f 6e 6e  bout to the conn
b120: 65 63 74 69 6f 6e 20 73 74 72 69 6e 67 2e 0d 0a  ection string...
b130: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 61        #..      a
b140: 70 70 65 6e 64 20 63 6f 6e 6e 65 63 74 69 6f 6e  ppend connection
b150: 20 7b 3b 54 6f 46 75 6c 6c 50 61 74 68 3d 24 7b   {;ToFullPath=${
b160: 71 75 61 6c 69 66 79 7d 7d 0d 0a 0d 0a 20 20 20  qualify}}....   
b170: 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
b180: 54 45 3a 20 49 66 20 6f 75 72 20 63 61 6c 6c 65  TE: If our calle
b190: 72 20 73 70 65 63 69 66 69 65 64 20 61 20 6a 6f  r specified a jo
b1a0: 75 72 6e 61 6c 20 6d 6f 64 65 2c 20 61 64 64 20  urnal mode, add 
b1b0: 74 68 65 20 6e 65 63 65 73 73 61 72 79 20 70 6f  the necessary po
b1c0: 72 74 69 6f 6e 0d 0a 20 20 20 20 20 20 23 20 20  rtion..      #  
b1d0: 20 20 20 20 20 6f 66 20 74 68 65 20 63 6f 6e 6e       of the conn
b1e0: 65 63 74 69 6f 6e 20 73 74 72 69 6e 67 20 6e 6f  ection string no
b1f0: 77 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  w...      #..   
b200: 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c     if {[string l
b210: 65 6e 67 74 68 20 24 6d 6f 64 65 5d 20 3e 20 30  ength $mode] > 0
b220: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
b230: 20 20 61 70 70 65 6e 64 20 63 6f 6e 6e 65 63 74    append connect
b240: 69 6f 6e 20 7b 3b 4a 6f 75 72 6e 61 6c 20 4d 6f  ion {;Journal Mo
b250: 64 65 3d 24 7b 6d 6f 64 65 7d 7d 0d 0a 20 20 20  de=${mode}}..   
b260: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d     }....      #.
b270: 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49  .      # NOTE: I
b280: 66 20 6f 75 72 20 63 61 6c 6c 65 72 20 73 70 65  f our caller spe
b290: 63 69 66 69 65 64 20 61 20 44 61 74 65 54 69 6d  cified a DateTim
b2a0: 65 20 66 6f 72 6d 61 74 2c 20 61 64 64 20 74 68  e format, add th
b2b0: 65 20 6e 65 63 65 73 73 61 72 79 0d 0a 20 20 20  e necessary..   
b2c0: 20 20 20 23 20 20 20 20 20 20 20 70 6f 72 74 69     #       porti
b2d0: 6f 6e 20 6f 66 20 74 68 65 20 63 6f 6e 6e 65 63  on of the connec
b2e0: 74 69 6f 6e 20 73 74 72 69 6e 67 20 6e 6f 77 2e  tion string now.
b2f0: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
b300: 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e   if {[string len
b310: 67 74 68 20 24 64 61 74 65 54 69 6d 65 46 6f 72  gth $dateTimeFor
b320: 6d 61 74 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b  mat] > 0} then {
b330: 0d 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e 64  ..        append
b340: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 7b 3b 44 61   connection {;Da
b350: 74 65 54 69 6d 65 46 6f 72 6d 61 74 3d 24 7b 64  teTimeFormat=${d
b360: 61 74 65 54 69 6d 65 46 6f 72 6d 61 74 7d 7d 0d  ateTimeFormat}}.
b370: 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
b380: 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
b390: 45 3a 20 49 66 20 6f 75 72 20 63 61 6c 6c 65 72  E: If our caller
b3a0: 20 73 70 65 63 69 66 69 65 64 20 61 20 44 61 74   specified a Dat
b3b0: 65 54 69 6d 65 4b 69 6e 64 2c 20 61 64 64 20 74  eTimeKind, add t
b3c0: 68 65 20 6e 65 63 65 73 73 61 72 79 20 70 6f 72  he necessary por
b3d0: 74 69 6f 6e 0d 0a 20 20 20 20 20 20 23 20 20 20  tion..      #   
b3e0: 20 20 20 20 6f 66 20 74 68 65 20 63 6f 6e 6e 65      of the conne
b3f0: 63 74 69 6f 6e 20 73 74 72 69 6e 67 20 6e 6f 77  ction string now
b400: 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
b410: 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65    if {[string le
b420: 6e 67 74 68 20 24 64 61 74 65 54 69 6d 65 4b 69  ngth $dateTimeKi
b430: 6e 64 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d  nd] > 0} then {.
b440: 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 20  .        append 
b450: 63 6f 6e 6e 65 63 74 69 6f 6e 20 7b 3b 44 61 74  connection {;Dat
b460: 65 54 69 6d 65 4b 69 6e 64 3d 24 7b 64 61 74 65  eTimeKind=${date
b470: 54 69 6d 65 4b 69 6e 64 7d 7d 0d 0a 20 20 20 20  TimeKind}}..    
b480: 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a    }....      #..
b490: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 66        # NOTE: If
b4a0: 20 74 68 65 72 65 20 61 72 65 20 61 6e 79 20 67   there are any g
b4b0: 6c 6f 62 61 6c 20 28 70 65 72 20 74 65 73 74 20  lobal (per test 
b4c0: 72 75 6e 29 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  run) connection 
b4d0: 66 6c 61 67 73 20 63 75 72 72 65 6e 74 6c 79 0d  flags currently.
b4e0: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 73  .      #       s
b4f0: 65 74 2c 20 75 73 65 20 74 68 65 6d 20 6e 6f 77  et, use them now
b500: 20 28 69 2e 65 2e 20 62 79 20 63 6f 6d 62 69 6e   (i.e. by combin
b510: 69 6e 67 20 74 68 65 6d 20 77 69 74 68 20 74 68  ing them with th
b520: 65 20 6f 6e 65 73 20 66 6f 72 20 74 68 69 73 0d  e ones for this.
b530: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63  .      #       c
b540: 6f 6e 6e 65 63 74 69 6f 6e 29 2e 0d 0a 20 20 20  onnection)...   
b550: 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
b560: 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 63  [info exists ::c
b570: 6f 6e 6e 65 63 74 69 6f 6e 5f 66 6c 61 67 73 5d  onnection_flags]
b580: 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20   && \..         
b590: 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20   [string length 
b5a0: 24 3a 3a 63 6f 6e 6e 65 63 74 69 6f 6e 5f 66 6c  $::connection_fl
b5b0: 61 67 73 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b  ags] > 0} then {
b5c0: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
b5d0: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 68 6f       # NOTE: Sho
b5e0: 77 20 28 61 6e 64 20 6c 6f 67 29 20 74 68 61 74  w (and log) that
b5f0: 20 77 65 20 64 65 74 65 63 74 65 64 20 73 6f 6d   we detected som
b600: 65 20 67 6c 6f 62 61 6c 20 63 6f 6e 6e 65 63 74  e global connect
b610: 69 6f 6e 20 66 6c 61 67 73 2e 0d 0a 20 20 20 20  ion flags...    
b620: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 74      #..        t
b630: 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
b640: 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
b650: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
b660: 22 2d 2d 2d 2d 20 67 6c 6f 62 61 6c 20 63 6f 6e  "---- global con
b670: 6e 65 63 74 69 6f 6e 20 66 6c 61 67 73 20 64 65  nection flags de
b680: 74 65 63 74 65 64 3a 20 22 20 24 3a 3a 63 6f 6e  tected: " $::con
b690: 6e 65 63 74 69 6f 6e 5f 66 6c 61 67 73 20 5c 6e  nection_flags \n
b6a0: 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  ]....        #..
b6b0: 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
b6c0: 43 6f 6d 62 69 6e 65 20 61 6e 64 2f 6f 72 20 72  Combine and/or r
b6d0: 65 70 6c 61 63 65 20 74 68 65 20 63 6f 6e 6e 65  eplace the conne
b6e0: 63 74 69 6f 6e 20 66 6c 61 67 73 20 61 6e 64 20  ction flags and 
b6f0: 74 68 65 6e 20 73 68 6f 77 20 74 68 65 0d 0a 20  then show the.. 
b700: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 6e         #       n
b710: 65 77 20 76 61 6c 75 65 2e 0d 0a 20 20 20 20 20  ew value...     
b720: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 73 65     #..        se
b730: 74 20 66 6c 61 67 73 20 5b 63 6f 6d 62 69 6e 65  t flags [combine
b740: 46 6c 61 67 73 20 24 66 6c 61 67 73 20 24 3a 3a  Flags $flags $::
b750: 63 6f 6e 6e 65 63 74 69 6f 6e 5f 66 6c 61 67 73  connection_flags
b760: 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 74 70 75  ]....        tpu
b770: 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
b780: 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
b790: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 2d  ..            "-
b7a0: 2d 2d 2d 20 63 6f 6d 62 69 6e 65 64 20 63 6f 6e  --- combined con
b7b0: 6e 65 63 74 69 6f 6e 20 66 6c 61 67 73 20 61 72  nection flags ar
b7c0: 65 3a 20 22 20 24 66 6c 61 67 73 20 5c 6e 5d 0d  e: " $flags \n].
b7d0: 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
b7e0: 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
b7f0: 45 3a 20 49 66 20 6f 75 72 20 63 61 6c 6c 65 72  E: If our caller
b800: 20 73 70 65 63 69 66 69 65 64 20 73 6f 6d 65 20   specified some 
b810: 53 51 4c 69 74 65 43 6f 6e 6e 65 63 74 69 6f 6e  SQLiteConnection
b820: 46 6c 61 67 73 2c 20 61 64 64 20 74 68 65 0d 0a  Flags, add the..
b830: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 6e 65        #       ne
b840: 63 65 73 73 61 72 79 20 70 6f 72 74 69 6f 6e 20  cessary portion 
b850: 6f 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  of the connectio
b860: 6e 20 73 74 72 69 6e 67 20 6e 6f 77 2e 0d 0a 20  n string now... 
b870: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66       #..      if
b880: 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68   {[string length
b890: 20 24 66 6c 61 67 73 5d 20 3e 20 30 7d 20 74 68   $flags] > 0} th
b8a0: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 61 70  en {..        ap
b8b0: 70 65 6e 64 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  pend connection 
b8c0: 7b 3b 46 6c 61 67 73 3d 24 7b 66 6c 61 67 73 7d  {;Flags=${flags}
b8d0: 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  }..      }....  
b8e0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
b8f0: 4f 54 45 3a 20 49 66 20 6f 75 72 20 63 61 6c 6c  OTE: If our call
b900: 65 72 20 73 70 65 63 69 66 69 65 64 20 61 6e 20  er specified an 
b910: 65 78 74 72 61 20 70 61 79 6c 6f 61 64 20 74 6f  extra payload to
b920: 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0d   the connection.
b930: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 73  .      #       s
b940: 74 72 69 6e 67 2c 20 61 70 70 65 6e 64 20 69 74  tring, append it
b950: 20 6e 6f 77 2e 0d 0a 20 20 20 20 20 20 23 0d 0a   now...      #..
b960: 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e        if {[strin
b970: 67 20 6c 65 6e 67 74 68 20 24 65 78 74 72 61 5d  g length $extra]
b980: 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20   > 0} then {..  
b990: 20 20 20 20 20 20 61 70 70 65 6e 64 20 63 6f 6e        append con
b9a0: 6e 65 63 74 69 6f 6e 20 5c 3b 20 24 65 78 74 72  nection \; $extr
b9b0: 61 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  a..      }....  
b9c0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
b9d0: 4f 54 45 3a 20 4f 70 65 6e 20 74 68 65 20 64 61  OTE: Open the da
b9e0: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
b9f0: 6e 20 6e 6f 77 2c 20 70 6c 61 63 69 6e 67 20 74  n now, placing t
ba00: 68 65 20 6f 70 61 71 75 65 20 68 61 6e 64 6c 65  he opaque handle
ba10: 20 76 61 6c 75 65 0d 0a 20 20 20 20 20 20 23 20   value..      # 
ba20: 20 20 20 20 20 20 69 6e 74 6f 20 74 68 65 20 76        into the v
ba30: 61 72 69 61 62 6c 65 20 73 70 65 63 69 66 69 65  ariable specifie
ba40: 64 20 62 79 20 6f 75 72 20 63 61 6c 6c 65 72 2e  d by our caller.
ba50: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
ba60: 20 73 65 74 20 64 62 20 5b 73 71 6c 20 6f 70 65   set db [sql ope
ba70: 6e 20 2d 74 79 70 65 20 53 51 4c 69 74 65 20 5b  n -type SQLite [
ba80: 73 75 62 73 74 20 24 63 6f 6e 6e 65 63 74 69 6f  subst $connectio
ba90: 6e 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a  n]]....      #..
baa0: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 6f        # NOTE: Co
bab0: 6e 66 69 67 75 72 65 20 74 68 65 20 74 65 6d 70  nfigure the temp
bac0: 6f 72 61 72 79 20 64 69 72 65 63 74 6f 72 79 20  orary directory 
bad0: 66 6f 72 20 74 68 65 20 6e 65 77 6c 79 20 6f 70  for the newly op
bae0: 65 6e 65 64 20 64 61 74 61 62 61 73 65 0d 0a 20  ened database.. 
baf0: 20 20 20 20 20 23 20 20 20 20 20 20 20 63 6f 6e       #       con
bb00: 6e 65 63 74 69 6f 6e 20 6e 6f 77 20 75 6e 6c 65  nection now unle
bb10: 73 73 20 6f 75 72 20 63 61 6c 6c 65 72 20 66 6f  ss our caller fo
bb20: 72 62 69 64 73 20 69 74 2e 0d 0a 20 20 20 20 20  rbids it...     
bb30: 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 24 74   #..      if {$t
bb40: 65 6d 70 6f 72 61 72 79 20 26 26 20 21 5b 69 6e  emporary && ![in
bb50: 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 73  fo exists ::no(s
bb60: 65 74 54 65 6d 70 6f 72 61 72 79 44 69 72 65 63  etTemporaryDirec
bb70: 74 6f 72 79 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a  tory)]} then {..
bb80: 20 20 20 20 20 20 20 20 73 71 6c 20 65 78 65 63          sql exec
bb90: 75 74 65 20 24 64 62 20 5b 61 70 70 65 6e 64 41  ute $db [appendA
bba0: 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
bbb0: 20 20 20 22 50 52 41 47 4d 41 20 74 65 6d 70 5f     "PRAGMA temp_
bbc0: 73 74 6f 72 65 5f 64 69 72 65 63 74 6f 72 79 20  store_directory 
bbd0: 3d 20 5c 22 22 20 5b 67 65 74 54 65 6d 70 6f 72  = \"" [getTempor
bbe0: 61 72 79 44 69 72 65 63 74 6f 72 79 5d 20 5c 22  aryDirectory] \"
bbf0: 5c 3b 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a  \;]..      }....
bc00: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
bc10: 20 4e 4f 54 45 3a 20 41 6c 77 61 79 73 20 72 65   NOTE: Always re
bc20: 74 75 72 6e 20 74 68 65 20 63 6f 6e 6e 65 63 74  turn the connect
bc30: 69 6f 6e 20 68 61 6e 64 6c 65 20 75 70 6f 6e 20  ion handle upon 
bc40: 73 75 63 63 65 73 73 2e 0d 0a 20 20 20 20 20 20  success...      
bc50: 23 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  #..      return 
bc60: 24 64 62 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20  $db..    }..... 
bc70: 20 20 20 70 72 6f 63 20 67 65 74 44 62 43 6f 6e     proc getDbCon
bc80: 6e 65 63 74 69 6f 6e 20 7b 20 7b 76 61 72 4e 61  nection { {varNa
bc90: 6d 65 20 64 62 7d 20 7d 20 7b 0d 0a 20 20 20 20  me db} } {..    
bca0: 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
bcb0: 45 3a 20 52 65 66 65 72 20 74 6f 20 74 68 65 20  E: Refer to the 
bcc0: 73 70 65 63 69 66 69 65 64 20 76 61 72 69 61 62  specified variab
bcd0: 6c 65 20 28 65 2e 67 2e 20 22 64 62 22 29 20 69  le (e.g. "db") i
bce0: 6e 20 74 68 65 20 63 6f 6e 74 65 78 74 20 6f 66  n the context of
bcf0: 20 6f 75 72 0d 0a 20 20 20 20 20 20 23 20 20 20   our..      #   
bd00: 20 20 20 20 63 61 6c 6c 65 72 2e 20 20 54 68 65      caller.  The
bd10: 20 68 61 6e 64 6c 65 20 74 6f 20 74 68 65 20 64   handle to the d
bd20: 61 74 61 62 61 73 65 20 70 72 65 76 69 6f 75 73  atabase previous
bd30: 6c 79 20 6f 70 65 6e 65 64 20 76 69 61 20 74 68  ly opened via th
bd40: 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  e..      #      
bd50: 20 5b 73 65 74 75 70 44 62 5d 20 70 72 6f 63 65   [setupDb] proce
bd60: 64 75 72 65 20 73 68 6f 75 6c 64 20 62 65 20 73  dure should be s
bd70: 74 6f 72 65 64 20 74 68 65 72 65 2e 0d 0a 20 20  tored there...  
bd80: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 75 70 76      #..      upv
bd90: 61 72 20 31 20 24 76 61 72 4e 61 6d 65 20 64 62  ar 1 $varName db
bda0: 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  ....      #..   
bdb0: 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 69 73 20     # NOTE: This 
bdc0: 72 65 74 75 72 6e 73 20 74 68 65 20 41 44 4f 2e  returns the ADO.
bdd0: 4e 45 54 20 49 44 62 43 6f 6e 6e 65 63 74 69 6f  NET IDbConnectio
bde0: 6e 20 6f 62 6a 65 63 74 20 69 6e 73 74 61 6e 63  n object instanc
bdf0: 65 20 66 6f 72 20 74 68 65 0d 0a 20 20 20 20 20  e for the..     
be00: 20 23 20 20 20 20 20 20 20 73 70 65 63 69 66 69   #       specifi
be10: 65 64 20 64 61 74 61 62 73 65 20 68 61 6e 64 6c  ed databse handl
be20: 65 2e 20 20 53 69 6e 63 65 20 67 65 74 74 69 6e  e.  Since gettin
be30: 67 20 74 68 69 73 20 6f 62 6a 65 63 74 20 72 65  g this object re
be40: 6c 69 65 73 20 75 70 6f 6e 0d 0a 20 20 20 20 20  lies upon..     
be50: 20 23 20 20 20 20 20 20 20 45 61 67 6c 65 20 69   #       Eagle i
be60: 6e 74 65 72 6e 61 6c 73 2c 20 67 72 65 61 74 20  nternals, great 
be70: 63 61 72 65 20 73 68 6f 75 6c 64 20 62 65 20 74  care should be t
be80: 61 6b 65 6e 20 74 6f 20 61 76 6f 69 64 20 64 69  aken to avoid di
be90: 73 70 6f 73 69 6e 67 20 6f 66 0d 0a 20 20 20 20  sposing of..    
bea0: 20 20 23 20 20 20 20 20 20 20 74 68 69 73 20 6f    #       this o
beb0: 62 6a 65 63 74 20 6f 72 20 6f 74 68 65 72 77 69  bject or otherwi
bec0: 73 65 20 70 75 74 74 69 6e 67 20 69 74 20 69 6e  se putting it in
bed0: 74 6f 20 61 6e 20 69 6e 76 61 6c 69 64 20 73 74  to an invalid st
bee0: 61 74 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ate...      #.. 
bef0: 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65       if {[info e
bf00: 78 69 73 74 73 20 64 62 5d 7d 20 74 68 65 6e 20  xists db]} then 
bf10: 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b  {..        if {[
bf20: 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20  catch {..       
bf30: 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20           object 
bf40: 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e  invoke -flags +N
bf50: 6f 6e 50 75 62 6c 69 63 20 2d 6f 62 6a 65 63 74  onPublic -object
bf60: 66 6c 61 67 73 20 2b 4e 6f 44 69 73 70 6f 73 65  flags +NoDispose
bf70: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
bf80: 20 20 20 20 2d 61 6c 69 61 73 20 49 6e 74 65 72      -alias Inter
bf90: 70 72 65 74 65 72 2e 47 65 74 41 63 74 69 76 65  preter.GetActive
bfa0: 2e 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 49 74 65  .connections Ite
bfb0: 6d 20 24 64 62 7d 20 5c 0d 0a 20 20 20 20 20 20  m $db} \..      
bfc0: 20 20 20 20 20 20 20 20 20 20 72 65 73 75 6c 74            result
bfd0: 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  ] == 0} then {..
bfe0: 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
bff0: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53         # NOTE: S
c000: 75 63 63 65 73 73 2c 20 72 65 74 75 72 6e 20 74  uccess, return t
c010: 68 65 20 6f 70 61 71 75 65 20 6f 62 6a 65 63 74  he opaque object
c020: 20 68 61 6e 64 6c 65 2e 0d 0a 20 20 20 20 20 20   handle...      
c030: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
c040: 20 72 65 74 75 72 6e 20 24 72 65 73 75 6c 74 0d   return $result.
c050: 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20  .        } else 
c060: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a  {..          #..
c070: 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45            # NOTE
c080: 3a 20 46 61 69 6c 75 72 65 2c 20 72 65 70 6f 72  : Failure, repor
c090: 74 20 77 68 79 2e 0d 0a 20 20 20 20 20 20 20 20  t why...        
c0a0: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 74    #..          t
c0b0: 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
c0c0: 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
c0d0: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
c0e0: 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a    "==== WARNING:
c0f0: 20 66 61 69 6c 65 64 20 74 6f 20 67 65 74 20 63   failed to get c
c100: 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 6e 64 6c 65  onnection handle
c110: 20 66 6f 72 20 64 61 74 61 62 61 73 65 20 5c 22   for database \"
c120: 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  " \..           
c130: 20 20 20 24 64 62 20 22 5c 22 2c 20 65 72 72 6f     $db "\", erro
c140: 72 3a 20 22 20 5c 6e 5c 74 20 24 72 65 73 75 6c  r: " \n\t $resul
c150: 74 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 7d  t \n]..        }
c160: 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d  ..      }..    }
c170: 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 66 72  .....    proc fr
c180: 65 65 44 62 43 6f 6e 6e 65 63 74 69 6f 6e 20 7b  eeDbConnection {
c190: 20 7b 76 61 72 4e 61 6d 65 20 63 6f 6e 6e 65 63   {varName connec
c1a0: 74 69 6f 6e 7d 20 7d 20 7b 0d 0a 20 20 20 20 20  tion} } {..     
c1b0: 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
c1c0: 3a 20 52 65 66 65 72 20 74 6f 20 74 68 65 20 73  : Refer to the s
c1d0: 70 65 63 69 66 69 65 64 20 76 61 72 69 61 62 6c  pecified variabl
c1e0: 65 20 28 65 2e 67 2e 20 22 63 6f 6e 6e 65 63 74  e (e.g. "connect
c1f0: 69 6f 6e 22 29 20 69 6e 20 74 68 65 0d 0a 20 20  ion") in the..  
c200: 20 20 20 20 23 20 20 20 20 20 20 20 63 6f 6e 74      #       cont
c210: 65 78 74 20 6f 66 20 6f 75 72 20 63 61 6c 6c 65  ext of our calle
c220: 72 2e 20 20 54 68 65 20 6f 70 61 71 75 65 20 6f  r.  The opaque o
c230: 62 6a 65 63 74 20 68 61 6e 64 6c 65 20 66 6f 72  bject handle for
c240: 20 61 6e 20 41 44 4f 2e 4e 45 54 0d 0a 20 20 20   an ADO.NET..   
c250: 20 20 20 23 20 20 20 20 20 20 20 63 6f 6e 6e 65     #       conne
c260: 63 74 69 6f 6e 20 70 72 65 76 69 6f 75 73 6c 79  ction previously
c270: 20 72 65 74 75 72 6e 65 64 20 62 79 20 5b 67 65   returned by [ge
c280: 74 44 62 43 6f 6e 6e 65 63 74 69 6f 6e 5d 20 73  tDbConnection] s
c290: 68 6f 75 6c 64 20 62 65 0d 0a 20 20 20 20 20 20  hould be..      
c2a0: 23 20 20 20 20 20 20 20 73 74 6f 72 65 64 20 74  #       stored t
c2b0: 68 65 72 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  here...      #..
c2c0: 20 20 20 20 20 20 75 70 76 61 72 20 31 20 24 76        upvar 1 $v
c2d0: 61 72 4e 61 6d 65 20 63 6f 6e 6e 65 63 74 69 6f  arName connectio
c2e0: 6e 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  n....      #..  
c2f0: 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 74 74 65      # NOTE: Atte
c300: 6d 70 74 20 74 6f 20 72 65 6d 6f 76 65 20 74 68  mpt to remove th
c310: 65 20 6f 70 61 71 75 65 20 6f 62 6a 65 63 74 20  e opaque object 
c320: 68 61 6e 64 6c 65 20 66 72 6f 6d 20 74 68 65 20  handle from the 
c330: 69 6e 74 65 72 70 72 65 74 65 72 0d 0a 20 20 20  interpreter..   
c340: 20 20 20 23 20 20 20 20 20 20 20 6e 6f 77 2e 20     #       now. 
c350: 20 54 68 69 73 20 5b 6f 62 6a 65 63 74 20 64 69   This [object di
c360: 73 70 6f 73 65 5d 20 63 61 6c 6c 20 77 69 6c 6c  spose] call will
c370: 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 64 69   not actually di
c380: 73 70 6f 73 65 20 6f 66 20 74 68 65 0d 0a 20 20  spose of the..  
c390: 20 20 20 20 23 20 20 20 20 20 20 20 75 6e 64 65      #       unde
c3a0: 72 6c 79 69 6e 67 20 6f 62 6a 65 63 74 20 62 65  rlying object be
c3b0: 63 61 75 73 65 20 74 68 65 20 2b 4e 6f 44 69 73  cause the +NoDis
c3c0: 70 6f 73 65 20 66 6c 61 67 20 77 61 73 20 73 65  pose flag was se
c3d0: 74 20 6f 6e 20 69 74 0d 0a 20 20 20 20 20 20 23  t on it..      #
c3e0: 20 20 20 20 20 20 20 64 75 72 69 6e 67 20 63 72         during cr
c3f0: 65 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6f 70  eation of the op
c400: 61 71 75 65 20 6f 62 6a 65 63 74 20 68 61 6e 64  aque object hand
c410: 6c 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  le...      #..  
c420: 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78      if {[info ex
c430: 69 73 74 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 5d  ists connection]
c440: 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20   && \..         
c450: 20 5b 63 61 74 63 68 20 7b 6f 62 6a 65 63 74 20   [catch {object 
c460: 64 69 73 70 6f 73 65 20 24 63 6f 6e 6e 65 63 74  dispose $connect
c470: 69 6f 6e 7d 20 65 72 72 6f 72 5d 7d 20 74 68 65  ion} error]} the
c480: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  n {..        #..
c490: 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
c4a0: 57 65 20 73 6f 6d 65 68 6f 77 20 66 61 69 6c 65  We somehow faile
c4b0: 64 20 74 6f 20 72 65 6d 6f 76 65 20 74 68 65 20  d to remove the 
c4c0: 68 61 6e 64 6c 65 2c 20 72 65 70 6f 72 74 20 77  handle, report w
c4d0: 68 79 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  hy...        #..
c4e0: 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
c4f0: 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61  :test_channel [a
c500: 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
c510: 20 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57           "==== W
c520: 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20 74  ARNING: failed t
c530: 6f 20 72 65 6d 6f 76 65 20 63 6f 6e 6e 65 63 74  o remove connect
c540: 69 6f 6e 20 68 61 6e 64 6c 65 20 5c 22 22 20 24  ion handle \"" $
c550: 63 6f 6e 6e 65 63 74 69 6f 6e 20 5c 0d 0a 20 20  connection \..  
c560: 20 20 20 20 20 20 20 20 20 20 22 5c 22 2c 20 65            "\", e
c570: 72 72 6f 72 3a 20 22 20 5c 6e 5c 74 20 24 65 72  rror: " \n\t $er
c580: 72 6f 72 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d  ror \n]..      }
c590: 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
c5a0: 70 72 6f 63 20 61 64 64 44 62 43 6f 6e 6e 65 63  proc addDbConnec
c5b0: 74 69 6f 6e 20 7b 20 63 6f 6e 6e 65 63 74 69 6f  tion { connectio
c5c0: 6e 20 7b 76 61 72 4e 61 6d 65 20 64 62 7d 20 7d  n {varName db} }
c5d0: 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20   {..      #..   
c5e0: 20 20 20 23 20 4e 4f 54 45 3a 20 52 65 66 65 72     # NOTE: Refer
c5f0: 20 74 6f 20 74 68 65 20 73 70 65 63 69 66 69 65   to the specifie
c600: 64 20 76 61 72 69 61 62 6c 65 20 28 65 2e 67 2e  d variable (e.g.
c610: 20 22 64 62 22 29 20 69 6e 20 74 68 65 20 63 6f   "db") in the co
c620: 6e 74 65 78 74 20 6f 66 20 6f 75 72 0d 0a 20 20  ntext of our..  
c630: 20 20 20 20 23 20 20 20 20 20 20 20 63 61 6c 6c      #       call
c640: 65 72 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  er...      #..  
c650: 20 20 20 20 75 70 76 61 72 20 31 20 24 76 61 72      upvar 1 $var
c660: 4e 61 6d 65 20 64 62 0d 0a 0d 0a 20 20 20 20 20  Name db....     
c670: 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
c680: 3a 20 43 72 65 61 74 65 20 61 20 63 6f 72 72 65  : Create a corre
c690: 63 74 6c 79 20 66 6f 72 6d 61 74 74 65 64 20 6e  ctly formatted n
c6a0: 61 6d 65 20 66 6f 72 20 74 68 65 20 64 61 74 61  ame for the data
c6b0: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
c6c0: 74 6f 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  to..      #     
c6d0: 20 20 62 65 20 61 64 64 65 64 20 74 6f 20 74 68    be added to th
c6e0: 65 20 6c 69 73 74 20 6d 61 6e 61 67 65 64 20 62  e list managed b
c6f0: 79 20 74 68 65 20 45 61 67 6c 65 20 69 6e 74 65  y the Eagle inte
c700: 72 70 72 65 74 65 72 2e 0d 0a 20 20 20 20 20 20  rpreter...      
c710: 23 0d 0a 20 20 20 20 20 20 73 65 74 20 64 62 20  #..      set db 
c720: 5b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d  [object invoke -
c730: 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63  flags +NonPublic
c740: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 45 61   \..          Ea
c750: 67 6c 65 2e 5f 43 6f 6d 70 6f 6e 65 6e 74 73 2e  gle._Components.
c760: 50 72 69 76 61 74 65 2e 46 6f 72 6d 61 74 4f 70  Private.FormatOp
c770: 73 20 44 61 74 61 62 61 73 65 4f 62 6a 65 63 74  s DatabaseObject
c780: 4e 61 6d 65 20 24 63 6f 6e 6e 65 63 74 69 6f 6e  Name $connection
c790: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 53 51   \..          SQ
c7a0: 4c 69 74 65 43 6f 6e 6e 65 63 74 69 6f 6e 20 5b  LiteConnection [
c7b0: 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 49 6e  object invoke In
c7c0: 74 65 72 70 72 65 74 65 72 2e 47 65 74 41 63 74  terpreter.GetAct
c7d0: 69 76 65 20 4e 65 78 74 49 64 5d 5d 0d 0a 0d 0a  ive NextId]]....
c7e0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
c7f0: 20 4e 4f 54 45 3a 20 41 64 64 20 74 68 65 20 64   NOTE: Add the d
c800: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
c810: 6f 6e 20 70 72 6f 76 69 64 65 64 20 62 79 20 6f  on provided by o
c820: 75 72 20 63 61 6c 6c 65 72 20 74 6f 20 74 68 65  ur caller to the
c830: 20 6c 69 73 74 0d 0a 20 20 20 20 20 20 23 20 20   list..      #  
c840: 20 20 20 20 20 6f 66 20 74 68 6f 73 65 20 6b 6e       of those kn
c850: 6f 77 6e 20 74 6f 20 74 68 65 20 45 61 67 6c 65  own to the Eagle
c860: 20 69 6e 74 65 72 70 72 65 74 65 72 2e 0d 0a 20   interpreter... 
c870: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 6f 62       #..      ob
c880: 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61  ject invoke -fla
c890: 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 49 6e  gs +NonPublic In
c8a0: 74 65 72 70 72 65 74 65 72 2e 47 65 74 41 63 74  terpreter.GetAct
c8b0: 69 76 65 2e 63 6f 6e 6e 65 63 74 69 6f 6e 73 20  ive.connections 
c8c0: 41 64 64 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  Add \..         
c8d0: 20 24 64 62 20 24 63 6f 6e 6e 65 63 74 69 6f 6e   $db $connection
c8e0: 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
c8f0: 70 72 6f 63 20 63 6c 65 61 6e 75 70 44 62 20 7b  proc cleanupDb {
c900: 20 66 69 6c 65 4e 61 6d 65 20 7b 76 61 72 4e 61   fileName {varNa
c910: 6d 65 20 64 62 7d 20 7b 63 6f 6c 6c 65 63 74 20  me db} {collect 
c920: 74 72 75 65 7d 20 7b 71 75 61 6c 69 66 79 20 74  true} {qualify t
c930: 72 75 65 7d 0d 0a 20 20 20 20 20 20 20 20 20 20  rue}..          
c940: 20 20 20 20 20 20 20 20 20 20 20 7b 64 65 6c 65             {dele
c950: 74 65 20 74 72 75 65 7d 20 7d 20 7b 0d 0a 20 20  te true} } {..  
c960: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
c970: 4f 54 45 3a 20 41 74 74 65 6d 70 74 20 74 6f 20  OTE: Attempt to 
c980: 66 6f 72 63 65 20 61 6c 6c 20 70 65 6e 64 69 6e  force all pendin
c990: 67 20 22 67 61 72 62 61 67 65 22 20 6f 62 6a 65  g "garbage" obje
c9a0: 63 74 73 20 74 6f 20 62 65 20 63 6f 6c 6c 65 63  cts to be collec
c9b0: 74 65 64 2c 0d 0a 20 20 20 20 20 20 23 20 20 20  ted,..      #   
c9c0: 20 20 20 20 69 6e 63 6c 75 64 69 6e 67 20 53 51      including SQ
c9d0: 4c 69 74 65 20 73 74 61 74 65 6d 65 6e 74 73 20  Lite statements 
c9e0: 61 6e 64 20 62 61 63 6b 75 70 20 6f 62 6a 65 63  and backup objec
c9f0: 74 73 3b 20 74 68 69 73 20 73 68 6f 75 6c 64 20  ts; this should 
ca00: 61 6c 6c 6f 77 0d 0a 20 20 20 20 20 20 23 20 20  allow..      #  
ca10: 20 20 20 20 20 74 68 65 20 75 6e 64 65 72 6c 79       the underly
ca20: 69 6e 67 20 64 61 74 61 62 61 73 65 20 66 69 6c  ing database fil
ca30: 65 20 74 6f 20 62 65 20 64 65 6c 65 74 65 64 2e  e to be deleted.
ca40: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
ca50: 20 69 66 20 7b 24 63 6f 6c 6c 65 63 74 7d 20 74   if {$collect} t
ca60: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 63  hen {..        c
ca70: 6f 6c 6c 65 63 74 47 61 72 62 61 67 65 20 24 3a  ollectGarbage $:
ca80: 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 0d 0a 20  :test_channel.. 
ca90: 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
caa0: 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
cab0: 20 52 65 66 65 72 20 74 6f 20 74 68 65 20 73 70   Refer to the sp
cac0: 65 63 69 66 69 65 64 20 76 61 72 69 61 62 6c 65  ecified variable
cad0: 20 28 65 2e 67 2e 20 22 64 62 22 29 20 69 6e 20   (e.g. "db") in 
cae0: 74 68 65 20 63 6f 6e 74 65 78 74 20 6f 66 20 6f  the context of o
caf0: 75 72 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  ur..      #     
cb00: 20 20 63 61 6c 6c 65 72 2e 20 20 54 68 65 20 68    caller.  The h
cb10: 61 6e 64 6c 65 20 74 6f 20 74 68 65 20 64 61 74  andle to the dat
cb20: 61 62 61 73 65 20 70 72 65 76 69 6f 75 73 6c 79  abase previously
cb30: 20 6f 70 65 6e 65 64 20 76 69 61 20 74 68 65 0d   opened via the.
cb40: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 5b  .      #       [
cb50: 73 65 74 75 70 44 62 5d 20 70 72 6f 63 65 64 75  setupDb] procedu
cb60: 72 65 20 73 68 6f 75 6c 64 20 62 65 20 73 74 6f  re should be sto
cb70: 72 65 64 20 74 68 65 72 65 2e 0d 0a 20 20 20 20  red there...    
cb80: 20 20 23 0d 0a 20 20 20 20 20 20 75 70 76 61 72    #..      upvar
cb90: 20 31 20 24 76 61 72 4e 61 6d 65 20 64 62 0d 0a   1 $varName db..
cba0: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
cbb0: 20 23 20 4e 4f 54 45 3a 20 43 6c 6f 73 65 20 74   # NOTE: Close t
cbc0: 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f  he connection to
cbd0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 6f   the database no
cbe0: 77 2e 20 20 54 68 69 73 20 73 68 6f 75 6c 64 20  w.  This should 
cbf0: 61 6c 6c 6f 77 20 75 73 0d 0a 20 20 20 20 20 20  allow us..      
cc00: 23 20 20 20 20 20 20 20 74 6f 20 64 65 6c 65 74  #       to delet
cc10: 65 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  e the underlying
cc20: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0d   database file..
cc30: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
cc40: 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73  if {[info exists
cc50: 20 64 62 5d 20 26 26 20 5b 63 61 74 63 68 20 7b   db] && [catch {
cc60: 73 71 6c 20 63 6c 6f 73 65 20 24 64 62 7d 20 65  sql close $db} e
cc70: 72 72 6f 72 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  rror]} then {.. 
cc80: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
cc90: 20 20 23 20 4e 4f 54 45 3a 20 57 65 20 73 6f 6d    # NOTE: We som
cca0: 65 68 6f 77 20 66 61 69 6c 65 64 20 74 6f 20 63  ehow failed to c
ccb0: 6c 6f 73 65 20 74 68 65 20 64 61 74 61 62 61 73  lose the databas
ccc0: 65 2c 20 72 65 70 6f 72 74 20 77 68 79 2e 0d 0a  e, report why...
ccd0: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
cce0: 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
ccf0: 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  _channel [append
cd00: 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
cd10: 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e      "==== WARNIN
cd20: 47 3a 20 66 61 69 6c 65 64 20 74 6f 20 63 6c 6f  G: failed to clo
cd30: 73 65 20 64 61 74 61 62 61 73 65 20 5c 22 22 20  se database \"" 
cd40: 24 64 62 20 22 5c 22 2c 20 65 72 72 6f 72 3a 20  $db "\", error: 
cd50: 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  " \..           
cd60: 20 5c 6e 5c 74 20 24 65 72 72 6f 72 20 5c 6e 5d   \n\t $error \n]
cd70: 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
cd80: 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
cd90: 54 45 3a 20 46 69 72 73 74 2c 20 73 65 65 20 69  TE: First, see i
cda0: 66 20 6f 75 72 20 63 61 6c 6c 65 72 20 68 61 73  f our caller has
cdb0: 20 72 65 71 75 65 73 74 65 64 20 61 6e 20 69 6e   requested an in
cdc0: 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
cdd0: 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
cde0: 20 20 73 65 74 20 69 73 4d 65 6d 6f 72 79 20 5b    set isMemory [
cdf0: 69 73 4d 65 6d 6f 72 79 44 62 20 24 66 69 6c 65  isMemoryDb $file
ce00: 4e 61 6d 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 23  Name]....      #
ce10: 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
ce20: 42 75 69 6c 64 20 74 68 65 20 66 75 6c 6c 20 70  Build the full p
ce30: 61 74 68 20 74 6f 20 74 68 65 20 64 61 74 61 62  ath to the datab
ce40: 61 73 65 20 66 69 6c 65 20 6e 61 6d 65 2e 20 20  ase file name.  
ce50: 46 6f 72 20 6e 6f 77 2c 20 61 6c 6c 20 74 65 73  For now, all tes
ce60: 74 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  t..      #      
ce70: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 20   database files 
ce80: 61 72 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68  are stored in th
ce90: 65 20 74 65 6d 70 6f 72 61 72 79 20 64 69 72 65  e temporary dire
cea0: 63 74 6f 72 79 2e 0d 0a 20 20 20 20 20 20 23 0d  ctory...      #.
ceb0: 0a 20 20 20 20 20 20 69 66 20 7b 21 24 69 73 4d  .      if {!$isM
cec0: 65 6d 6f 72 79 20 26 26 20 24 71 75 61 6c 69 66  emory && $qualif
ced0: 79 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  y} then {..     
cee0: 20 20 20 73 65 74 20 66 69 6c 65 4e 61 6d 65 20     set fileName 
cef0: 5b 66 69 6c 65 20 6a 6f 69 6e 20 5b 67 65 74 44  [file join [getD
cf00: 61 74 61 62 61 73 65 44 69 72 65 63 74 6f 72 79  atabaseDirectory
cf10: 5d 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 66 69  ] [file tail $fi
cf20: 6c 65 4e 61 6d 65 5d 5d 0d 0a 20 20 20 20 20 20  leName]]..      
cf30: 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  }....      #..  
cf40: 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68 65 63      # NOTE: Chec
cf50: 6b 20 69 66 20 74 68 65 20 66 69 6c 65 20 73 74  k if the file st
cf60: 69 6c 6c 20 65 78 69 73 74 73 2e 0d 0a 20 20 20  ill exists...   
cf70: 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
cf80: 21 24 69 73 4d 65 6d 6f 72 79 20 26 26 20 24 64  !$isMemory && $d
cf90: 65 6c 65 74 65 20 26 26 20 5b 66 69 6c 65 20 65  elete && [file e
cfa0: 78 69 73 74 73 20 24 66 69 6c 65 4e 61 6d 65 5d  xists $fileName]
cfb0: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
cfc0: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
cfd0: 4f 54 45 3a 20 53 6b 69 70 20 64 65 6c 65 74 69  OTE: Skip deleti
cfe0: 6e 67 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ng database file
cff0: 73 20 69 66 20 73 6f 6d 65 62 6f 64 79 20 73 65  s if somebody se
d000: 74 73 20 74 68 65 20 67 6c 6f 62 61 6c 0d 0a 20  ts the global.. 
d010: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 76         #       v
d020: 61 72 69 61 62 6c 65 20 74 6f 20 70 72 65 76 65  ariable to preve
d030: 6e 74 20 69 74 2e 0d 0a 20 20 20 20 20 20 20 20  nt it...        
d040: 23 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21  #..        if {!
d050: 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e  [info exists ::n
d060: 6f 28 63 6c 65 61 6e 75 70 44 62 46 69 6c 65 29  o(cleanupDbFile)
d070: 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
d080: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
d090: 20 20 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70    # NOTE: Attemp
d0a0: 74 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20  t to delete the 
d0b0: 74 65 73 74 20 64 61 74 61 62 61 73 65 20 66 69  test database fi
d0c0: 6c 65 20 6e 6f 77 2e 0d 0a 20 20 20 20 20 20 20  le now...       
d0d0: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
d0e0: 69 66 20 7b 5b 73 65 74 20 63 6f 64 65 20 5b 63  if {[set code [c
d0f0: 61 74 63 68 20 7b 66 69 6c 65 20 64 65 6c 65 74  atch {file delet
d100: 65 20 24 66 69 6c 65 4e 61 6d 65 7d 20 65 72 72  e $fileName} err
d110: 6f 72 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  or]]} then {..  
d120: 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
d130: 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a           # NOTE:
d140: 20 57 65 20 73 6f 6d 65 68 6f 77 20 66 61 69 6c   We somehow fail
d150: 65 64 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65  ed to delete the
d160: 20 66 69 6c 65 2c 20 72 65 70 6f 72 74 20 77 68   file, report wh
d170: 79 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  y...            
d180: 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  #..            t
d190: 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
d1a0: 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
d1b0: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
d1c0: 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e      "==== WARNIN
d1d0: 47 3a 20 66 61 69 6c 65 64 20 74 6f 20 64 65 6c  G: failed to del
d1e0: 65 74 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  ete database fil
d1f0: 65 20 5c 22 22 20 24 66 69 6c 65 4e 61 6d 65 20  e \"" $fileName 
d200: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
d210: 20 20 20 22 5c 22 20 64 75 72 69 6e 67 20 63 6c     "\" during cl
d220: 65 61 6e 75 70 2c 20 65 72 72 6f 72 3a 20 22 20  eanup, error: " 
d230: 5c 6e 5c 74 20 24 65 72 72 6f 72 20 5c 6e 5d 0d  \n\t $error \n].
d240: 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  .          }..  
d250: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
d260: 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
d270: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53         # NOTE: S
d280: 68 6f 77 20 74 68 61 74 20 77 65 20 73 6b 69 70  how that we skip
d290: 70 65 64 20 64 65 6c 65 74 69 6e 67 20 74 68 65  ped deleting the
d2a0: 20 66 69 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20   file...        
d2b0: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 73    #..          s
d2c0: 65 74 20 63 6f 64 65 20 30 0d 0a 0d 0a 20 20 20  et code 0....   
d2d0: 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
d2e0: 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70  test_channel [ap
d2f0: 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
d300: 20 20 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20            "==== 
d310: 57 41 52 4e 49 4e 47 3a 20 73 6b 69 70 70 65 64  WARNING: skipped
d320: 20 64 65 6c 65 74 69 6e 67 20 64 61 74 61 62 61   deleting databa
d330: 73 65 20 66 69 6c 65 20 5c 22 22 20 24 66 69 6c  se file \"" $fil
d340: 65 4e 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20 20  eName \..       
d350: 20 20 20 20 20 20 20 22 5c 22 20 64 75 72 69 6e         "\" durin
d360: 67 20 63 6c 65 61 6e 75 70 5c 6e 22 5d 0d 0a 20  g cleanup\n"].. 
d370: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
d380: 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
d390: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
d3a0: 4f 54 45 3a 20 54 68 65 20 66 69 6c 65 20 64 6f  OTE: The file do
d3b0: 65 73 20 6e 6f 74 20 65 78 69 73 74 2c 20 73 75  es not exist, su
d3c0: 63 63 65 73 73 21 0d 0a 20 20 20 20 20 20 20 20  ccess!..        
d3d0: 23 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 63  #..        set c
d3e0: 6f 64 65 20 30 0d 0a 20 20 20 20 20 20 7d 0d 0a  ode 0..      }..
d3f0: 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 24  ..      return $
d400: 63 6f 64 65 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a  code..    }.....
d410: 20 20 20 20 70 72 6f 63 20 73 65 74 75 70 44 62      proc setupDb
d420: 49 6e 74 65 72 72 75 70 74 43 61 6c 6c 62 61 63  InterruptCallbac
d430: 6b 20 7b 20 63 68 61 6e 6e 65 6c 20 6c 6f 67 20  k { channel log 
d440: 7d 20 7b 0d 0a 20 20 20 20 20 20 74 70 75 74 73  } {..      tputs
d450: 20 24 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20   $channel "---- 
d460: 73 65 74 74 69 6e 67 20 75 70 20 64 65 62 75 67  setting up debug
d470: 67 65 72 20 69 6e 74 65 72 72 75 70 74 20 63 61  ger interrupt ca
d480: 6c 6c 62 61 63 6b 2e 2e 2e 20 22 0d 0a 0d 0a 20  llback... ".... 
d490: 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20       if {[catch 
d4a0: 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
d4b0: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4d 61        # NOTE: Ma
d4c0: 6b 65 20 73 75 72 65 20 74 68 65 20 73 63 72 69  ke sure the scri
d4d0: 70 74 20 64 65 62 75 67 67 65 72 20 61 6e 64 20  pt debugger and 
d4e0: 74 68 65 20 69 73 6f 6c 61 74 65 64 20 69 6e 74  the isolated int
d4f0: 65 72 70 72 65 74 65 72 20 61 72 65 0d 0a 20 20  erpreter are..  
d500: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 73 65        #       se
d510: 74 75 70 20 61 6e 64 20 72 65 61 64 79 20 66 6f  tup and ready fo
d520: 72 20 75 73 65 2e 0d 0a 20 20 20 20 20 20 20 20  r use...        
d530: 23 0d 0a 20 20 20 20 20 20 20 20 64 65 62 75 67  #..        debug
d540: 20 73 65 74 75 70 20 74 72 75 65 20 74 72 75 65   setup true true
d550: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  ....        #.. 
d560: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4c         # NOTE: L
d570: 6f 61 64 20 74 68 65 20 6e 65 63 65 73 73 61 72  oad the necessar
d580: 79 20 70 61 63 6b 61 67 65 73 20 69 6e 74 6f 20  y packages into 
d590: 74 68 65 20 69 73 6f 6c 61 74 65 64 20 69 6e 74  the isolated int
d5a0: 65 72 70 72 65 74 65 72 2e 0d 0a 20 20 20 20 20  erpreter...     
d5b0: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 64 65     #..        de
d5c0: 62 75 67 20 65 76 61 6c 20 7b 0d 0a 20 20 20 20  bug eval {..    
d5d0: 20 20 20 20 20 20 70 61 63 6b 61 67 65 20 72 65        package re
d5e0: 71 75 69 72 65 20 45 61 67 6c 65 0d 0a 20 20 20  quire Eagle..   
d5f0: 20 20 20 20 20 20 20 70 61 63 6b 61 67 65 20 72         package r
d600: 65 71 75 69 72 65 20 45 61 67 6c 65 2e 4c 69 62  equire Eagle.Lib
d610: 72 61 72 79 0d 0a 20 20 20 20 20 20 20 20 20 20  rary..          
d620: 70 61 63 6b 61 67 65 20 72 65 71 75 69 72 65 20  package require 
d630: 45 61 67 6c 65 2e 54 65 73 74 0d 0a 20 20 20 20  Eagle.Test..    
d640: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
d650: 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
d660: 54 45 3a 20 43 6f 70 79 20 74 68 65 20 6e 65 63  TE: Copy the nec
d670: 65 73 73 61 72 79 20 76 61 72 69 61 62 6c 65 73  essary variables
d680: 20 69 6e 74 6f 20 74 68 65 20 69 73 6f 6c 61 74   into the isolat
d690: 65 64 20 69 6e 74 65 72 70 72 65 74 65 72 2e 0d  ed interpreter..
d6a0: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
d6b0: 20 20 20 20 64 65 62 75 67 20 69 6e 76 6f 6b 65      debug invoke
d6c0: 20 30 20 73 65 74 20 3a 3a 74 65 73 74 5f 63 68   0 set ::test_ch
d6d0: 61 6e 6e 65 6c 20 24 63 68 61 6e 6e 65 6c 3b 20  annel $channel; 
d6e0: 23 20 4e 4f 54 45 3a 20 46 6f 72 20 5b 74 70 75  # NOTE: For [tpu
d6f0: 74 73 5d 2e 0d 0a 20 20 20 20 20 20 20 20 64 65  ts]...        de
d700: 62 75 67 20 69 6e 76 6f 6b 65 20 30 20 73 65 74  bug invoke 0 set
d710: 20 3a 3a 74 65 73 74 5f 6c 6f 67 20 24 6c 6f 67   ::test_log $log
d720: 3b 20 23 20 4e 4f 54 45 3a 20 46 6f 72 20 5b 74  ; # NOTE: For [t
d730: 6c 6f 67 5d 2e 0d 0a 0d 0a 20 20 20 20 20 20 20  log].....       
d740: 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
d750: 54 45 3a 20 49 6e 73 74 61 6c 6c 20 74 68 65 20  TE: Install the 
d760: 63 61 6c 6c 62 61 63 6b 20 73 63 72 69 70 74 20  callback script 
d770: 74 6f 20 62 65 20 65 76 61 6c 75 61 74 65 64 20  to be evaluated 
d780: 69 6e 20 74 68 65 20 69 73 6f 6c 61 74 65 64 0d  in the isolated.
d790: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
d7a0: 20 69 6e 74 65 72 70 72 65 74 65 72 20 77 68 65   interpreter whe
d7b0: 6e 20 74 68 69 73 20 69 6e 74 65 72 70 72 65 74  n this interpret
d7c0: 65 72 20 69 73 20 69 6e 74 65 72 72 75 70 74 65  er is interrupte
d7d0: 64 20 62 79 20 73 63 72 69 70 74 0d 0a 20 20 20  d by script..   
d7e0: 20 20 20 20 20 23 20 20 20 20 20 20 20 63 61 6e       #       can
d7f0: 63 65 6c 6c 61 74 69 6f 6e 2c 20 65 74 63 2e 0d  cellation, etc..
d800: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
d810: 20 20 20 20 64 65 62 75 67 20 63 61 6c 6c 62 61      debug callba
d820: 63 6b 20 61 70 70 6c 79 20 7b 7b 73 65 6e 64 65  ck apply {{sende
d830: 72 20 65 7d 20 7b 0d 0a 20 20 20 20 20 20 20 20  r e} {..        
d840: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23    #..          #
d850: 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 69 66 20   NOTE: Check if 
d860: 74 68 69 73 20 63 61 6c 6c 62 61 63 6b 20 69 73  this callback is
d870: 20 6f 6e 65 20 74 68 61 74 20 77 65 20 63 61 72   one that we car
d880: 65 20 61 62 6f 75 74 2e 0d 0a 20 20 20 20 20 20  e about...      
d890: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
d8a0: 20 69 66 20 7b 22 43 61 6e 63 65 6c 65 64 22 20   if {"Canceled" 
d8b0: 69 6e 20 5b 73 70 6c 69 74 20 5b 24 65 20 49 6e  in [split [$e In
d8c0: 74 65 72 72 75 70 74 54 79 70 65 5d 20 22 2c 20  terruptType] ", 
d8d0: 22 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  "]} then {..    
d8e0: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
d8f0: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49         # NOTE: I
d900: 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 61  terate through a
d910: 6c 6c 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  ll database conn
d920: 65 63 74 69 6f 6e 73 20 6b 6e 6f 77 6e 20 74 6f  ections known to
d930: 20 74 68 65 0d 0a 20 20 20 20 20 20 20 20 20 20   the..          
d940: 20 20 23 20 20 20 20 20 20 20 70 61 72 65 6e 74    #       parent
d950: 20 69 6e 74 65 72 70 72 65 74 65 72 2e 0d 0a 20   interpreter... 
d960: 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
d970: 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74            object
d980: 20 66 6f 72 65 61 63 68 20 2d 61 6c 69 61 73 20   foreach -alias 
d990: 70 61 69 72 20 5c 0d 0a 20 20 20 20 20 20 20 20  pair \..        
d9a0: 20 20 20 20 20 20 20 20 5b 6f 62 6a 65 63 74 20          [object 
d9b0: 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e  invoke -flags +N
d9c0: 6f 6e 50 75 62 6c 69 63 20 24 65 20 49 6e 74 65  onPublic $e Inte
d9d0: 72 70 72 65 74 65 72 2e 63 6f 6e 6e 65 63 74 69  rpreter.connecti
d9e0: 6f 6e 73 5d 20 7b 0d 0a 20 20 20 20 20 20 20 20  ons] {..        
d9f0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
da00: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41         # NOTE: A
da10: 74 74 65 6d 70 74 20 74 6f 20 63 61 6e 63 65 6c  ttempt to cancel
da20: 20 61 6e 79 20 53 51 4c 20 71 75 65 72 69 65 73   any SQL queries
da30: 20 69 6e 20 70 72 6f 67 72 65 73 73 20 6f 6e 20   in progress on 
da40: 74 68 69 73 0d 0a 20 20 20 20 20 20 20 20 20 20  this..          
da50: 20 20 20 20 23 20 20 20 20 20 20 20 64 61 74 61      #       data
da60: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  base connection.
da70: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
da80: 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  #..             
da90: 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 24 70 61   if {[catch {$pa
daa0: 69 72 20 56 61 6c 75 65 2e 43 61 6e 63 65 6c 7d  ir Value.Cancel}
dab0: 20 65 72 72 6f 72 5d 7d 20 74 68 65 6e 20 7b 0d   error]} then {.
dac0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
dad0: 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
dae0: 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
daf0: 67 73 20 5c 6e 20 5c 0d 0a 20 20 20 20 20 20 20  gs \n \..       
db00: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 3d 3d               "==
db10: 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c  == WARNING: fail
db20: 65 64 20 74 6f 20 63 61 6e 63 65 6c 20 71 75 65  ed to cancel que
db30: 72 79 20 66 6f 72 20 63 6f 6e 6e 65 63 74 69 6f  ry for connectio
db40: 6e 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20 20  n \"" \..       
db50: 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 24 70               [$p
db60: 61 69 72 20 4b 65 79 5d 20 22 5c 22 2c 20 65 72  air Key] "\", er
db70: 72 6f 72 3a 20 22 20 5c 6e 5c 74 20 24 65 72 72  ror: " \n\t $err
db80: 6f 72 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20  or \n]..        
db90: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
dba0: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
dbb0: 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 7d 0d    }..        }}.
dbc0: 0a 20 20 20 20 20 20 7d 20 65 72 72 6f 72 5d 20  .      } error] 
dbd0: 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  == 0} then {..  
dbe0: 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61        addConstra
dbf0: 69 6e 74 20 69 6e 74 65 72 72 75 70 74 43 61 6c  int interruptCal
dc00: 6c 62 61 63 6b 2e 73 71 6c 69 74 65 33 0d 0a 0d  lback.sqlite3...
dc10: 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24  .        tputs $
dc20: 63 68 61 6e 6e 65 6c 20 79 65 73 5c 6e 0d 0a 20  channel yes\n.. 
dc30: 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
dc40: 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
dc50: 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
dc60: 73 20 22 6e 6f 2c 20 65 72 72 6f 72 3a 20 22 20  s "no, error: " 
dc70: 5c 6e 5c 74 20 24 65 72 72 6f 72 20 5c 6e 5d 0d  \n\t $error \n].
dc80: 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d  .      }..    }.
dc90: 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 63 6c 65  ....    proc cle
dca0: 61 6e 75 70 46 69 6c 65 20 7b 20 66 69 6c 65 4e  anupFile { fileN
dcb0: 61 6d 65 20 7b 63 6f 6c 6c 65 63 74 20 74 72 75  ame {collect tru
dcc0: 65 7d 20 7b 66 6f 72 63 65 20 66 61 6c 73 65 7d  e} {force false}
dcd0: 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20   } {..      #.. 
dce0: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 74 74       # NOTE: Att
dcf0: 65 6d 70 74 20 74 6f 20 66 6f 72 63 65 20 61 6c  empt to force al
dd00: 6c 20 70 65 6e 64 69 6e 67 20 22 67 61 72 62 61  l pending "garba
dd10: 67 65 22 20 6f 62 6a 65 63 74 73 20 74 6f 20 62  ge" objects to b
dd20: 65 20 63 6f 6c 6c 65 63 74 65 64 2c 0d 0a 20 20  e collected,..  
dd30: 20 20 20 20 23 20 20 20 20 20 20 20 69 6e 63 6c      #       incl
dd40: 75 64 69 6e 67 20 53 51 4c 69 74 65 20 73 74 61  uding SQLite sta
dd50: 74 65 6d 65 6e 74 73 20 61 6e 64 20 62 61 63 6b  tements and back
dd60: 75 70 20 6f 62 6a 65 63 74 73 3b 20 74 68 69 73  up objects; this
dd70: 20 73 68 6f 75 6c 64 20 61 6c 6c 6f 77 0d 0a 20   should allow.. 
dd80: 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68 65       #       the
dd90: 20 75 6e 64 65 72 6c 79 69 6e 67 20 64 61 74 61   underlying data
dda0: 62 61 73 65 20 66 69 6c 65 20 74 6f 20 62 65 20  base file to be 
ddb0: 64 65 6c 65 74 65 64 2e 0d 0a 20 20 20 20 20 20  deleted...      
ddc0: 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 24 63 6f  #..      if {$co
ddd0: 6c 6c 65 63 74 7d 20 74 68 65 6e 20 7b 0d 0a 20  llect} then {.. 
dde0: 20 20 20 20 20 20 20 63 6f 6c 6c 65 63 74 47 61         collectGa
ddf0: 72 62 61 67 65 20 24 3a 3a 74 65 73 74 5f 63 68  rbage $::test_ch
de00: 61 6e 6e 65 6c 0d 0a 20 20 20 20 20 20 7d 0d 0a  annel..      }..
de10: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
de20: 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 69   # NOTE: Check i
de30: 66 20 74 68 65 20 66 69 6c 65 20 73 74 69 6c 6c  f the file still
de40: 20 65 78 69 73 74 73 2e 0d 0a 20 20 20 20 20 20   exists...      
de50: 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 66 69  #..      if {[fi
de60: 6c 65 20 65 78 69 73 74 73 20 24 66 69 6c 65 4e  le exists $fileN
de70: 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ame]} then {..  
de80: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
de90: 20 23 20 4e 4f 54 45 3a 20 53 6b 69 70 20 64 65   # NOTE: Skip de
dea0: 6c 65 74 69 6e 67 20 74 65 73 74 20 66 69 6c 65  leting test file
deb0: 73 20 69 66 20 73 6f 6d 65 62 6f 64 79 20 73 65  s if somebody se
dec0: 74 73 20 74 68 65 20 67 6c 6f 62 61 6c 20 76 61  ts the global va
ded0: 72 69 61 62 6c 65 0d 0a 20 20 20 20 20 20 20 20  riable..        
dee0: 23 20 20 20 20 20 20 20 74 6f 20 70 72 65 76 65  #       to preve
def0: 6e 74 20 69 74 2e 0d 0a 20 20 20 20 20 20 20 20  nt it...        
df00: 23 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 24  #..        if {$
df10: 66 6f 72 63 65 20 7c 7c 20 21 5b 69 6e 66 6f 20  force || ![info 
df20: 65 78 69 73 74 73 20 3a 3a 6e 6f 28 63 6c 65 61  exists ::no(clea
df30: 6e 75 70 46 69 6c 65 29 5d 7d 20 74 68 65 6e 20  nupFile)]} then 
df40: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a  {..          #..
df50: 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45            # NOTE
df60: 3a 20 41 74 74 65 6d 70 74 20 74 6f 20 64 65 6c  : Attempt to del
df70: 65 74 65 20 74 68 65 20 74 65 73 74 20 66 69 6c  ete the test fil
df80: 65 20 6e 6f 77 2e 0d 0a 20 20 20 20 20 20 20 20  e now...        
df90: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 69    #..          i
dfa0: 66 20 7b 5b 73 65 74 20 63 6f 64 65 20 5b 63 61  f {[set code [ca
dfb0: 74 63 68 20 7b 66 69 6c 65 20 64 65 6c 65 74 65  tch {file delete
dfc0: 20 24 66 69 6c 65 4e 61 6d 65 7d 20 65 72 72 6f   $fileName} erro
dfd0: 72 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  r]]} then {..   
dfe0: 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
dff0: 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
e000: 57 65 20 73 6f 6d 65 68 6f 77 20 66 61 69 6c 65  We somehow faile
e010: 64 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20  d to delete the 
e020: 66 69 6c 65 2c 20 72 65 70 6f 72 74 20 77 68 79  file, report why
e030: 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23  ...            #
e040: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70  ..            tp
e050: 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  uts $::test_chan
e060: 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
e070: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
e080: 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47     "==== WARNING
e090: 3a 20 66 61 69 6c 65 64 20 74 6f 20 64 65 6c 65  : failed to dele
e0a0: 74 65 20 74 65 73 74 20 66 69 6c 65 20 5c 22 22  te test file \""
e0b0: 20 24 66 69 6c 65 4e 61 6d 65 20 5c 0d 0a 20 20   $fileName \..  
e0c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 5c                "\
e0d0: 22 20 64 75 72 69 6e 67 20 63 6c 65 61 6e 75 70  " during cleanup
e0e0: 2c 20 65 72 72 6f 72 3a 20 22 20 5c 6e 5c 74 20  , error: " \n\t 
e0f0: 24 65 72 72 6f 72 20 5c 6e 5d 0d 0a 20 20 20 20  $error \n]..    
e100: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
e110: 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
e120: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
e130: 20 20 23 20 4e 4f 54 45 3a 20 53 68 6f 77 20 74    # NOTE: Show t
e140: 68 61 74 20 77 65 20 73 6b 69 70 70 65 64 20 64  hat we skipped d
e150: 65 6c 65 74 69 6e 67 20 74 68 65 20 66 69 6c 65  eleting the file
e160: 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a  ...          #..
e170: 20 20 20 20 20 20 20 20 20 20 73 65 74 20 63 6f            set co
e180: 64 65 20 30 0d 0a 0d 0a 20 20 20 20 20 20 20 20  de 0....        
e190: 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
e1a0: 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
e1b0: 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
e1c0: 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49       "==== WARNI
e1d0: 4e 47 3a 20 73 6b 69 70 70 65 64 20 64 65 6c 65  NG: skipped dele
e1e0: 74 69 6e 67 20 74 65 73 74 20 66 69 6c 65 20 5c  ting test file \
e1f0: 22 22 20 24 66 69 6c 65 4e 61 6d 65 20 5c 0d 0a  "" $fileName \..
e200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 5c                "\
e210: 22 20 64 75 72 69 6e 67 20 63 6c 65 61 6e 75 70  " during cleanup
e220: 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d  \n"]..        }.
e230: 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d  .      } else {.
e240: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
e250: 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 65 20      # NOTE: The 
e260: 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 65 78  file does not ex
e270: 69 73 74 2c 20 73 75 63 63 65 73 73 21 0d 0a 20  ist, success!.. 
e280: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
e290: 20 20 73 65 74 20 63 6f 64 65 20 30 0d 0a 20 20    set code 0..  
e2a0: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 72      }....      r
e2b0: 65 74 75 72 6e 20 24 63 6f 64 65 0d 0a 20 20 20  eturn $code..   
e2c0: 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
e2d0: 63 6f 6c 6c 65 63 74 47 61 72 62 61 67 65 20 7b  collectGarbage {
e2e0: 20 63 68 61 6e 6e 65 6c 20 7b 6d 69 6c 6c 69 73   channel {millis
e2f0: 65 63 6f 6e 64 73 20 31 30 30 30 7d 20 7b 71 75  econds 1000} {qu
e300: 69 65 74 20 74 72 75 65 7d 20 7d 20 7b 0d 0a 20  iet true} } {.. 
e310: 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20       if {[catch 
e320: 7b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 47  {object invoke G
e330: 43 20 47 65 74 54 6f 74 61 6c 4d 65 6d 6f 72 79  C GetTotalMemory
e340: 20 66 61 6c 73 65 7d 20 72 65 73 75 6c 74 5d 20   false} result] 
e350: 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  == 0} then {..  
e360: 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65        if {!$quie
e370: 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  t} then {..     
e380: 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
e390: 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
e3a0: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
e3b0: 20 22 2d 2d 2d 2d 20 6d 65 6d 6f 72 79 20 69 6e   "---- memory in
e3c0: 20 75 73 65 20 62 79 20 74 68 65 20 43 4c 52 20   use by the CLR 
e3d0: 62 65 66 6f 72 65 20 63 6f 6c 6c 65 63 74 69 6f  before collectio
e3e0: 6e 2e 2e 2e 20 22 20 5c 0d 0a 20 20 20 20 20 20  n... " \..      
e3f0: 20 20 20 20 20 20 20 20 24 72 65 73 75 6c 74 20          $result 
e400: 22 20 62 79 74 65 73 5c 6e 22 5d 0d 0a 20 20 20  " bytes\n"]..   
e410: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 20       }..      } 
e420: 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
e430: 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b  tputs $channel [
e440: 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
e450: 20 20 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20            "==== 
e460: 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20  WARNING: failed 
e470: 74 6f 20 67 65 74 20 43 4c 52 20 6d 65 6d 6f 72  to get CLR memor
e480: 79 20 75 73 61 67 65 2c 20 65 72 72 6f 72 3a 20  y usage, error: 
e490: 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  " \..           
e4a0: 20 5c 6e 5c 74 20 24 72 65 73 75 6c 74 20 5c 6e   \n\t $result \n
e4b0: 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  ]..      }....  
e4c0: 20 20 20 20 23 23 23 23 23 23 23 23 23 23 23 23      ############
e4d0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
e4e0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
e4f0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
e500: 23 23 23 23 23 23 23 23 23 23 23 23 23 0d 0a 0d  #############...
e510: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
e520: 23 20 4e 4f 54 45 3a 20 52 65 70 65 61 74 65 64  # NOTE: Repeated
e530: 6c 79 20 61 74 74 65 6d 70 74 20 74 6f 20 63 6f  ly attempt to co
e540: 6c 6c 65 63 74 20 67 61 72 62 61 67 65 20 75 6e  llect garbage un
e550: 74 69 6c 20 74 68 65 20 61 6c 6c 6f 74 74 65 64  til the allotted
e560: 20 6e 75 6d 62 65 72 0d 0a 20 20 20 20 20 20 23   number..      #
e570: 20 20 20 20 20 20 20 6f 66 20 6d 69 6c 6c 69 73         of millis
e580: 65 63 6f 6e 64 73 20 68 61 73 20 65 6c 61 70 73  econds has elaps
e590: 65 64 2e 20 20 41 6c 77 61 79 73 20 61 74 74 65  ed.  Always atte
e5a0: 6d 70 74 20 74 6f 20 63 6f 6c 6c 65 63 74 20 67  mpt to collect g
e5b0: 61 72 62 61 67 65 0d 0a 20 20 20 20 20 20 23 20  arbage..      # 
e5c0: 20 20 20 20 20 20 61 74 20 6c 65 61 73 74 20 6f        at least o
e5d0: 6e 63 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  nce...      #.. 
e5e0: 20 20 20 20 20 73 65 74 20 73 74 61 72 74 20 5b       set start [
e5f0: 63 6c 6f 63 6b 20 73 65 63 6f 6e 64 73 5d 0d 0a  clock seconds]..
e600: 20 20 20 20 20 20 73 65 74 20 73 74 6f 70 20 5b        set stop [
e610: 65 78 70 72 20 7b 24 73 74 61 72 74 20 2b 20 28  expr {$start + (
e620: 24 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20 2f 20  $milliseconds / 
e630: 31 30 30 30 29 7d 5d 0d 0a 0d 0a 20 20 20 20 20  1000)}]....     
e640: 20 64 6f 20 7b 0d 0a 20 20 20 20 20 20 20 20 23   do {..        #
e650: 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
e660: 3a 20 41 74 74 65 6d 70 74 20 74 6f 20 66 6f 72  : Attempt to for
e670: 63 65 20 61 20 66 75 6c 6c 20 67 61 72 62 61 67  ce a full garbag
e680: 65 20 63 6f 6c 6c 65 63 74 69 6f 6e 20 6e 6f 77  e collection now
e690: 2e 20 20 52 65 70 6f 72 74 20 61 6e 79 0d 0a 20  .  Report any.. 
e6a0: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 65         #       e
e6b0: 72 72 6f 72 20 74 68 61 74 20 69 73 20 65 6e 63  rror that is enc
e6c0: 6f 75 6e 74 65 72 65 64 20 69 66 20 77 65 20 66  ountered if we f
e6d0: 61 69 6c 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  ail...        #.
e6e0: 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61  .        if {[ca
e6f0: 74 63 68 20 7b 6f 62 6a 65 63 74 20 69 6e 76 6f  tch {object invo
e700: 6b 65 20 47 43 20 47 65 74 54 6f 74 61 6c 4d 65  ke GC GetTotalMe
e710: 6d 6f 72 79 20 74 72 75 65 7d 20 65 72 72 6f 72  mory true} error
e720: 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
e730: 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
e740: 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
e750: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
e760: 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20   "==== WARNING: 
e770: 66 61 69 6c 65 64 20 66 75 6c 6c 20 67 61 72 62  failed full garb
e780: 61 67 65 20 63 6f 6c 6c 65 63 74 69 6f 6e 2c 20  age collection, 
e790: 65 72 72 6f 72 3a 20 22 20 5c 0d 0a 20 20 20 20  error: " \..    
e7a0: 20 20 20 20 20 20 20 20 20 20 5c 6e 5c 74 20 24            \n\t $
e7b0: 65 72 72 6f 72 20 5c 6e 5d 0d 0a 20 20 20 20 20  error \n]..     
e7c0: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
e7d0: 73 65 74 20 6e 6f 77 20 5b 63 6c 6f 63 6b 20 73  set now [clock s
e7e0: 65 63 6f 6e 64 73 5d 0d 0a 20 20 20 20 20 20 7d  econds]..      }
e7f0: 20 77 68 69 6c 65 20 7b 24 73 74 61 72 74 20 3c   while {$start <
e800: 3d 20 24 6e 6f 77 20 26 26 20 24 6e 6f 77 20 3c  = $now && $now <
e810: 20 24 73 74 6f 70 7d 0d 0a 0d 0a 20 20 20 20 20   $stop}....     
e820: 20 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23   ###############
e830: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
e840: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
e850: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
e860: 23 23 23 23 23 23 23 23 23 23 0d 0a 0d 0a 20 20  ##########....  
e870: 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b      if {[catch {
e880: 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 47 43  object invoke GC
e890: 20 47 65 74 54 6f 74 61 6c 4d 65 6d 6f 72 79 20   GetTotalMemory 
e8a0: 66 61 6c 73 65 7d 20 72 65 73 75 6c 74 5d 20 3d  false} result] =
e8b0: 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  = 0} then {..   
e8c0: 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74       if {!$quiet
e8d0: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
e8e0: 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
e8f0: 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
e900: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
e910: 22 2d 2d 2d 2d 20 6d 65 6d 6f 72 79 20 69 6e 20  "---- memory in 
e920: 75 73 65 20 62 79 20 74 68 65 20 43 4c 52 20 61  use by the CLR a
e930: 66 74 65 72 20 63 6f 6c 6c 65 63 74 69 6f 6e 2e  fter collection.
e940: 2e 2e 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20  .. " \..        
e950: 20 20 20 20 20 20 24 72 65 73 75 6c 74 20 22 20        $result " 
e960: 62 79 74 65 73 5c 6e 22 5d 0d 0a 20 20 20 20 20  bytes\n"]..     
e970: 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 20 65 6c     }..      } el
e980: 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70  se {..        tp
e990: 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70  uts $channel [ap
e9a0: 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
e9b0: 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41          "==== WA
e9c0: 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20 74 6f  RNING: failed to
e9d0: 20 67 65 74 20 43 4c 52 20 6d 65 6d 6f 72 79 20   get CLR memory 
e9e0: 75 73 61 67 65 2c 20 65 72 72 6f 72 3a 20 22 20  usage, error: " 
e9f0: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5c  \..            \
ea00: 6e 5c 74 20 24 72 65 73 75 6c 74 20 5c 6e 5d 0d  n\t $result \n].
ea10: 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d  .      }..    }.
ea20: 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74  ....    proc get
ea30: 53 51 4c 69 74 65 48 61 6e 64 6c 65 43 6f 75 6e  SQLiteHandleCoun
ea40: 74 73 20 7b 20 63 68 61 6e 6e 65 6c 20 7b 71 75  ts { channel {qu
ea50: 69 65 74 20 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a  iet false} } {..
ea60: 20 20 20 20 20 20 73 65 74 20 72 65 73 75 6c 74        set result
ea70: 20 5b 6c 69 73 74 5d 0d 0a 0d 0a 20 20 20 20 20   [list]....     
ea80: 20 69 66 20 7b 5b 68 61 76 65 43 6f 6e 73 74 72   if {[haveConstr
ea90: 61 69 6e 74 20 5c 0d 0a 20 20 20 20 20 20 20 20  aint \..        
eaa0: 20 20 20 20 20 20 64 65 66 69 6e 65 43 6f 6e 73        defineCons
eab0: 74 61 6e 74 2e 53 79 73 74 65 6d 2e 44 61 74 61  tant.System.Data
eac0: 2e 53 51 4c 69 74 65 2e 43 4f 55 4e 54 5f 48 41  .SQLite.COUNT_HA
ead0: 4e 44 4c 45 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  NDLE]} then {.. 
eae0: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
eaf0: 20 20 23 20 4e 4f 54 45 3a 20 41 64 64 20 65 61    # NOTE: Add ea
eb00: 63 68 20 63 72 69 74 69 63 61 6c 20 68 61 6e 64  ch critical hand
eb10: 6c 65 20 63 6f 75 6e 74 20 74 6f 20 74 68 65 20  le count to the 
eb20: 72 65 73 75 6c 74 69 6e 67 20 6c 69 73 74 2e 0d  resulting list..
eb30: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
eb40: 20 20 20 20 66 6f 72 65 61 63 68 20 6e 61 6d 65      foreach name
eb50: 20 5b 6c 69 73 74 20 63 6f 6e 6e 65 63 74 69 6f   [list connectio
eb60: 6e 43 6f 75 6e 74 20 73 74 61 74 65 6d 65 6e 74  nCount statement
eb70: 43 6f 75 6e 74 20 62 61 63 6b 75 70 43 6f 75 6e  Count backupCoun
eb80: 74 5d 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  t] {..          
eb90: 73 65 74 20 76 61 6c 75 65 20 5b 6f 62 6a 65 63  set value [objec
eba0: 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20  t invoke -flags 
ebb0: 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20  +NonPublic \..  
ebc0: 20 20 20 20 20 20 20 20 20 20 20 20 53 79 73 74              Syst
ebd0: 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 55  em.Data.SQLite.U
ebe0: 6e 73 61 66 65 4e 61 74 69 76 65 4d 65 74 68 6f  nsafeNativeMetho
ebf0: 64 73 20 24 6e 61 6d 65 5d 0d 0a 0d 0a 20 20 20  ds $name]....   
ec00: 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69         if {!$qui
ec10: 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  et} then {..    
ec20: 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
ec30: 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
ec40: 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
ec50: 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 72 69 74        "---- crit
ec60: 69 63 61 6c 20 68 61 6e 64 6c 65 20 63 6f 75 6e  ical handle coun
ec70: 74 20 5c 22 22 20 24 6e 61 6d 65 20 22 5c 22 20  t \"" $name "\" 
ec80: 69 73 20 22 20 24 76 61 6c 75 65 20 5c 6e 5d 0d  is " $value \n].
ec90: 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  .          }....
eca0: 20 20 20 20 20 20 20 20 20 20 6c 61 70 70 65 6e            lappen
ecb0: 64 20 72 65 73 75 6c 74 20 24 76 61 6c 75 65 0d  d result $value.
ecc0: 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  .        }..    
ecd0: 20 20 7d 20 65 6c 73 65 69 66 20 7b 21 24 71 75    } elseif {!$qu
ece0: 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  iet} then {..   
ecf0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
ed00: 23 20 4e 4f 54 45 3a 20 54 68 65 20 61 63 74 75  # NOTE: The actu
ed10: 61 6c 20 68 61 6e 64 6c 65 20 63 6f 75 6e 74 73  al handle counts
ed20: 20 61 72 65 20 6e 6f 74 20 61 76 61 69 6c 61 62   are not availab
ed30: 6c 65 3b 20 74 68 65 72 65 66 6f 72 65 2c 20 6a  le; therefore, j
ed40: 75 73 74 0d 0a 20 20 20 20 20 20 20 20 23 20 20  ust..        #  
ed50: 20 20 20 20 20 72 65 74 75 72 6e 20 61 6e 20 65       return an e
ed60: 6d 70 74 79 20 6c 69 73 74 2e 0d 0a 20 20 20 20  mpty list...    
ed70: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 74      #..        t
ed80: 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 22 2d  puts $channel "-
ed90: 2d 2d 2d 20 63 72 69 74 69 63 61 6c 20 68 61 6e  --- critical han
eda0: 64 6c 65 20 63 6f 75 6e 74 73 20 75 6e 61 76 61  dle counts unava
edb0: 69 6c 61 62 6c 65 5c 6e 22 0d 0a 20 20 20 20 20  ilable\n"..     
edc0: 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65 74 75   }....      retu
edd0: 72 6e 20 24 72 65 73 75 6c 74 0d 0a 20 20 20 20  rn $result..    
ede0: 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 73  }.....    proc s
edf0: 68 75 74 64 6f 77 6e 53 51 4c 69 74 65 20 7b 20  hutdownSQLite { 
ee00: 63 68 61 6e 6e 65 6c 20 7b 66 6f 72 63 65 20 66  channel {force f
ee10: 61 6c 73 65 7d 20 7b 71 75 69 65 74 20 66 61 6c  alse} {quiet fal
ee20: 73 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23  se} } {..      #
ee30: 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
ee40: 4d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 53  Make sure that S
ee50: 51 4c 69 74 65 20 63 6f 72 65 20 6c 69 62 72 61  QLite core libra
ee60: 72 79 20 69 73 20 63 6f 6d 70 6c 65 74 65 6c 79  ry is completely
ee70: 20 73 68 75 74 64 6f 77 6e 2e 20 20 54 68 69 73   shutdown.  This
ee80: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
ee90: 69 73 20 75 73 65 64 20 62 79 20 74 65 73 74 73  is used by tests
eea0: 20 74 68 61 74 20 63 68 61 6e 67 65 20 63 6f 6e   that change con
eeb0: 66 69 67 75 72 61 74 69 6f 6e 20 6f 70 74 69 6f  figuration optio
eec0: 6e 73 20 61 6e 64 2f 6f 72 20 74 68 6f 73 65 0d  ns and/or those.
eed0: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74  .      #       t
eee0: 68 61 74 20 6e 65 65 64 20 74 6f 20 6d 61 6b 65  hat need to make
eef0: 20 73 75 72 65 20 6c 6f 67 67 69 6e 67 20 69 73   sure logging is
ef00: 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 28 69 2e   initialized (i.
ef10: 65 2e 20 6a 75 73 74 20 69 6e 20 63 61 73 65 0d  e. just in case.
ef20: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74  .      #       t
ef30: 68 65 20 53 51 4c 69 74 65 20 63 6f 72 65 20 6c  he SQLite core l
ef40: 69 62 72 61 72 79 20 77 61 73 20 69 6e 69 74 69  ibrary was initi
ef50: 61 6c 69 7a 65 64 20 69 6e 20 74 68 65 20 70 72  alized in the pr
ef60: 6f 63 65 73 73 20 70 72 69 6f 72 20 74 6f 0d 0a  ocess prior to..
ef70: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68        #       th
ef80: 65 20 53 51 4c 69 74 65 4c 6f 67 20 63 6c 61 73  e SQLiteLog clas
ef90: 73 20 62 65 69 6e 67 20 61 62 6c 65 20 74 6f 20  s being able to 
efa0: 73 65 74 75 70 20 69 74 73 20 6c 6f 67 67 69 6e  setup its loggin
efb0: 67 20 63 61 6c 6c 62 61 63 6b 29 2e 0d 0a 20 20  g callback)...  
efc0: 20 20 20 20 23 20 20 20 20 20 20 20 4e 6f 72 6d      #       Norm
efd0: 61 6c 6c 79 2c 20 74 68 69 73 20 73 68 6f 75 6c  ally, this shoul
efe0: 64 20 6f 6e 6c 79 20 62 65 20 70 65 72 66 6f 72  d only be perfor
eff0: 6d 65 64 20 69 66 20 53 51 4c 69 74 65 20 69 73  med if SQLite is
f000: 20 6c 6f 61 64 65 64 20 61 6e 64 0d 0a 20 20 20   loaded and..   
f010: 20 20 20 23 20 20 20 20 20 20 20 72 65 61 64 79     #       ready
f020: 20 66 6f 72 20 75 73 65 20 62 79 20 74 68 65 20   for use by the 
f030: 74 65 73 74 20 73 75 69 74 65 2e 0d 0a 20 20 20  test suite...   
f040: 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
f050: 24 66 6f 72 63 65 20 7c 7c 20 5b 69 73 53 51 4c  $force || [isSQL
f060: 69 74 65 52 65 61 64 79 5d 7d 20 74 68 65 6e 20  iteReady]} then 
f070: 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
f080: 20 20 20 20 20 20 23 20 42 55 47 46 49 58 3a 20        # BUGFIX: 
f090: 42 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 74  Before calling t
f0a0: 68 65 20 6e 61 74 69 76 65 20 73 68 75 74 64 6f  he native shutdo
f0b0: 77 6e 20 66 75 6e 63 74 69 6f 6e 2c 20 6d 61 6b  wn function, mak
f0c0: 65 20 73 75 72 65 20 62 6f 74 68 0d 0a 20 20 20  e sure both..   
f0d0: 20 20 20 20 20 23 20 20 20 20 20 20 20 20 20 6f       #         o
f0e0: 66 20 74 68 65 20 50 52 41 47 4d 41 20 72 65 6c  f the PRAGMA rel
f0f0: 61 74 65 64 20 64 69 72 65 63 74 6f 72 79 20 6e  ated directory n
f100: 61 6d 65 73 20 61 72 65 20 66 72 65 65 64 2e 0d  ames are freed..
f110: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
f120: 20 20 20 20 63 68 65 63 6b 46 6f 72 53 51 4c 69      checkForSQLi
f130: 74 65 44 69 72 65 63 74 6f 72 69 65 73 20 24 63  teDirectories $c
f140: 68 61 6e 6e 65 6c 20 74 72 75 65 0d 0a 0d 0a 20  hannel true.... 
f150: 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63         if {[catc
f160: 68 20 7b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65  h {object invoke
f170: 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c   -flags +NonPubl
f180: 69 63 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  ic \..          
f190: 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74        System.Dat
f1a0: 61 2e 53 51 4c 69 74 65 2e 55 6e 73 61 66 65 4e  a.SQLite.UnsafeN
f1b0: 61 74 69 76 65 4d 65 74 68 6f 64 73 20 5c 0d 0a  ativeMethods \..
f1c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f1d0: 73 71 6c 69 74 65 33 5f 73 68 75 74 64 6f 77 6e  sqlite3_shutdown
f1e0: 7d 20 72 65 73 75 6c 74 5d 20 3d 3d 20 30 7d 20  } result] == 0} 
f1f0: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
f200: 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74    if {!$quiet} t
f210: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
f220: 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
f230: 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
f240: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
f250: 20 22 2d 2d 2d 2d 20 63 61 6c 6c 20 73 71 6c 69   "---- call sqli
f260: 74 65 33 5f 73 68 75 74 64 6f 77 6e 28 29 2e 2e  te3_shutdown()..
f270: 2e 20 6f 6b 3a 20 22 20 24 72 65 73 75 6c 74 20  . ok: " $result 
f280: 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  \n]..          }
f290: 0d 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65  ..        } else
f2a0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66   {..          if
f2b0: 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20   {!$quiet} then 
f2c0: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  {..            t
f2d0: 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61  puts $channel [a
f2e0: 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
f2f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d               "--
f300: 2d 2d 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 5f  -- call sqlite3_
f310: 73 68 75 74 64 6f 77 6e 28 29 2e 2e 2e 20 65 72  shutdown()... er
f320: 72 6f 72 3a 20 22 20 5c 6e 5c 74 20 24 72 65 73  ror: " \n\t $res
f330: 75 6c 74 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20  ult \n]..       
f340: 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d     }..        }.
f350: 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d  .      }..    }.
f360: 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 72 65 70  ....    proc rep
f370: 6f 72 74 53 51 4c 69 74 65 52 65 73 6f 75 72 63  ortSQLiteResourc
f380: 65 73 20 7b 20 63 68 61 6e 6e 65 6c 20 7b 71 75  es { channel {qu
f390: 69 65 74 20 66 61 6c 73 65 7d 20 7b 63 6f 6c 6c  iet false} {coll
f3a0: 65 63 74 20 74 72 75 65 7d 20 7d 20 7b 0d 0a 20  ect true} } {.. 
f3b0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
f3c0: 4e 4f 54 45 3a 20 53 6b 69 70 20 61 6c 6c 20 6f  NOTE: Skip all o
f3d0: 75 74 70 75 74 20 69 66 20 77 65 20 61 72 65 20  utput if we are 
f3e0: 72 75 6e 6e 69 6e 67 20 69 6e 20 22 71 75 69 65  running in "quie
f3f0: 74 22 20 6d 6f 64 65 2e 0d 0a 20 20 20 20 20 20  t" mode...      
f400: 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 68 61  #..      if {[ha
f410: 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 5c 0d 0a  veConstraint \..
f420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 65                de
f430: 66 69 6e 65 43 6f 6e 73 74 61 6e 74 2e 53 79 73  fineConstant.Sys
f440: 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e  tem.Data.SQLite.
f450: 49 4e 54 45 52 4f 50 5f 56 49 52 54 55 41 4c 5f  INTEROP_VIRTUAL_
f460: 54 41 42 4c 45 5d 20 26 26 20 5c 0d 0a 20 20 20  TABLE] && \..   
f470: 20 20 20 20 20 20 20 5b 68 61 76 65 43 6f 6e 73         [haveCons
f480: 74 72 61 69 6e 74 20 5c 0d 0a 20 20 20 20 20 20  traint \..      
f490: 20 20 20 20 20 20 20 20 64 65 66 69 6e 65 43 6f          defineCo
f4a0: 6e 73 74 61 6e 74 2e 53 79 73 74 65 6d 2e 44 61  nstant.System.Da
f4b0: 74 61 2e 53 51 4c 69 74 65 2e 54 52 41 43 4b 5f  ta.SQLite.TRACK_
f4c0: 4d 45 4d 4f 52 59 5f 42 59 54 45 53 5d 7d 20 74  MEMORY_BYTES]} t
f4d0: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 69  hen {..        i
f4e0: 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e  f {!$quiet} then
f4f0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70   {..          tp
f500: 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 22 2d 2d  uts $channel "--
f510: 2d 2d 20 63 75 72 72 65 6e 74 20 6d 65 6d 6f 72  -- current memor
f520: 79 20 69 6e 20 75 73 65 20 62 79 20 53 51 4c 69  y in use by SQLi
f530: 74 65 4d 65 6d 6f 72 79 2e 2e 2e 20 22 0d 0a 20  teMemory... ".. 
f540: 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
f550: 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b      if {[catch {
f560: 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66  object invoke -f
f570: 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20  lags +NonPublic 
f580: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
f590: 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53     System.Data.S
f5a0: 51 4c 69 74 65 2e 53 51 4c 69 74 65 4d 65 6d 6f  QLite.SQLiteMemo
f5b0: 72 79 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  ry \..          
f5c0: 20 20 20 20 20 20 62 79 74 65 73 41 6c 6c 6f 63        bytesAlloc
f5d0: 61 74 65 64 7d 20 6d 65 6d 6f 72 79 5d 20 3d 3d  ated} memory] ==
f5e0: 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
f5f0: 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65        if {!$quie
f600: 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  t} then {..     
f610: 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
f620: 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
f630: 73 20 24 6d 65 6d 6f 72 79 20 22 20 62 79 74 65  s $memory " byte
f640: 73 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20 20  s\n"]..         
f650: 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 20 65 6c   }..        } el
f660: 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  se {..          
f670: 73 65 74 20 6d 65 6d 6f 72 79 20 75 6e 6b 6e 6f  set memory unkno
f680: 77 6e 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  wn....          
f690: 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65  if {!$quiet} the
f6a0: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
f6b0: 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
f6c0: 5b 61 70 70 65 6e 64 41 72 67 73 20 24 6d 65 6d  [appendArgs $mem
f6d0: 6f 72 79 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20  ory \n]..       
f6e0: 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d     }..        }.
f6f0: 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21  ...        if {!
f700: 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a  $quiet} then {..
f710: 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
f720: 24 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 6d  $channel "---- m
f730: 61 78 69 6d 75 6d 20 6d 65 6d 6f 72 79 20 69 6e  aximum memory in
f740: 20 75 73 65 20 62 79 20 53 51 4c 69 74 65 4d 65   use by SQLiteMe
f750: 6d 6f 72 79 2e 2e 2e 20 22 0d 0a 20 20 20 20 20  mory... "..     
f760: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
f770: 69 66 20 7b 5b 63 61 74 63 68 20 7b 6f 62 6a 65  if {[catch {obje
f780: 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73  ct invoke -flags
f790: 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20   +NonPublic \.. 
f7a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
f7b0: 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
f7c0: 65 2e 53 51 4c 69 74 65 4d 65 6d 6f 72 79 20 5c  e.SQLiteMemory \
f7d0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
f7e0: 20 20 6d 61 78 69 6d 75 6d 42 79 74 65 73 41 6c    maximumBytesAl
f7f0: 6c 6f 63 61 74 65 64 7d 20 6d 65 6d 6f 72 79 5d  located} memory]
f800: 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20   == 0} then {.. 
f810: 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71           if {!$q
f820: 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  uiet} then {..  
f830: 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
f840: 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  $channel [append
f850: 41 72 67 73 20 24 6d 65 6d 6f 72 79 20 22 20 62  Args $memory " b
f860: 79 74 65 73 5c 6e 22 5d 0d 0a 20 20 20 20 20 20  ytes\n"]..      
f870: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d      }..        }
f880: 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
f890: 20 20 20 73 65 74 20 6d 65 6d 6f 72 79 20 75 6e     set memory un
f8a0: 6b 6e 6f 77 6e 0d 0a 0d 0a 20 20 20 20 20 20 20  known....       
f8b0: 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20     if {!$quiet} 
f8c0: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
f8d0: 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
f8e0: 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 24  el [appendArgs $
f8f0: 6d 65 6d 6f 72 79 20 5c 6e 5d 0d 0a 20 20 20 20  memory \n]..    
f900: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
f910: 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20   }..      }.... 
f920: 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74       if {!$quiet
f930: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
f940: 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
f950: 20 22 2d 2d 2d 2d 20 63 75 72 72 65 6e 74 20 6d   "---- current m
f960: 65 6d 6f 72 79 20 69 6e 20 75 73 65 20 62 79 20  emory in use by 
f970: 53 51 4c 69 74 65 2e 2e 2e 20 22 0d 0a 20 20 20  SQLite... "..   
f980: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 69 66     }....      if
f990: 20 7b 5b 63 61 74 63 68 20 7b 6f 62 6a 65 63 74   {[catch {object
f9a0: 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b   invoke -flags +
f9b0: 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20  NonPublic \..   
f9c0: 20 20 20 20 20 20 20 20 20 20 20 53 79 73 74 65             Syste
f9d0: 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 55 6e  m.Data.SQLite.Un
f9e0: 73 61 66 65 4e 61 74 69 76 65 4d 65 74 68 6f 64  safeNativeMethod
f9f0: 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
fa00: 20 20 20 73 71 6c 69 74 65 33 5f 6d 65 6d 6f 72     sqlite3_memor
fa10: 79 5f 75 73 65 64 7d 20 6d 65 6d 6f 72 79 5d 20  y_used} memory] 
fa20: 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  == 0} then {..  
fa30: 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65        if {!$quie
fa40: 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  t} then {..     
fa50: 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
fa60: 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
fa70: 24 6d 65 6d 6f 72 79 20 22 20 62 79 74 65 73 5c  $memory " bytes\
fa80: 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  n"]..        }..
fa90: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
faa0: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
fab0: 20 20 20 23 20 4e 4f 54 45 3a 20 4d 61 79 62 65     # NOTE: Maybe
fac0: 20 74 68 65 20 53 51 4c 69 74 65 20 63 6f 72 65   the SQLite core
fad0: 20 6c 69 62 72 61 72 79 20 69 73 20 75 6e 61 76   library is unav
fae0: 61 69 6c 61 62 6c 65 3f 0d 0a 20 20 20 20 20 20  ailable?..      
faf0: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 73 65 74    #..        set
fb00: 20 6d 65 6d 6f 72 79 20 75 6e 6b 6e 6f 77 6e 0d   memory unknown.
fb10: 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21  ...        if {!
fb20: 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a  $quiet} then {..
fb30: 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
fb40: 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  $channel [append
fb50: 41 72 67 73 20 24 6d 65 6d 6f 72 79 20 5c 6e 5d  Args $memory \n]
fb60: 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20  ..        }..   
fb70: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 73 65     }....      se
fb80: 74 20 72 65 73 75 6c 74 20 24 6d 65 6d 6f 72 79  t result $memory
fb90: 3b 20 23 20 4e 4f 54 45 3a 20 52 65 74 75 72 6e  ; # NOTE: Return
fba0: 20 6d 65 6d 6f 72 79 20 69 6e 2d 75 73 65 20 74   memory in-use t
fbb0: 6f 20 6f 75 72 20 63 61 6c 6c 65 72 2e 0d 0a 0d  o our caller....
fbc0: 0a 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69  .      if {!$qui
fbd0: 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  et} then {..    
fbe0: 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
fbf0: 65 6c 20 22 2d 2d 2d 2d 20 6d 61 78 69 6d 75 6d  el "---- maximum
fc00: 20 6d 65 6d 6f 72 79 20 69 6e 20 75 73 65 20 62   memory in use b
fc10: 79 20 53 51 4c 69 74 65 2e 2e 2e 20 22 0d 0a 20  y SQLite... ".. 
fc20: 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
fc30: 69 66 20 7b 5b 63 61 74 63 68 20 7b 6f 62 6a 65  if {[catch {obje
fc40: 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73  ct invoke -flags
fc50: 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20   +NonPublic \.. 
fc60: 20 20 20 20 20 20 20 20 20 20 20 20 20 53 79 73               Sys
fc70: 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e  tem.Data.SQLite.
fc80: 55 6e 73 61 66 65 4e 61 74 69 76 65 4d 65 74 68  UnsafeNativeMeth
fc90: 6f 64 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ods \..         
fca0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 65 6d       sqlite3_mem
fcb0: 6f 72 79 5f 68 69 67 68 77 61 74 65 72 20 30 7d  ory_highwater 0}
fcc0: 20 6d 65 6d 6f 72 79 5d 20 3d 3d 20 30 7d 20 74   memory] == 0} t
fcd0: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 69  hen {..        i
fce0: 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e  f {!$quiet} then
fcf0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70   {..          tp
fd00: 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70  uts $channel [ap
fd10: 70 65 6e 64 41 72 67 73 20 24 6d 65 6d 6f 72 79  pendArgs $memory
fd20: 20 22 20 62 79 74 65 73 5c 6e 22 5d 0d 0a 20 20   " bytes\n"]..  
fd30: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d        }..      }
fd40: 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
fd50: 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
fd60: 54 45 3a 20 4d 61 79 62 65 20 74 68 65 20 53 51  TE: Maybe the SQ
fd70: 4c 69 74 65 20 63 6f 72 65 20 6c 69 62 72 61 72  Lite core librar
fd80: 79 20 69 73 20 75 6e 61 76 61 69 6c 61 62 6c 65  y is unavailable
fd90: 3f 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ?..        #..  
fda0: 20 20 20 20 20 20 73 65 74 20 6d 65 6d 6f 72 79        set memory
fdb0: 20 75 6e 6b 6e 6f 77 6e 0d 0a 0d 0a 20 20 20 20   unknown....    
fdc0: 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d      if {!$quiet}
fdd0: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
fde0: 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
fdf0: 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 24 6d  l [appendArgs $m
fe00: 65 6d 6f 72 79 20 5c 6e 5d 0d 0a 20 20 20 20 20  emory \n]..     
fe10: 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d     }..      }...
fe20: 0a 20 20 20 20 20 20 69 66 20 7b 24 63 6f 6c 6c  .      if {$coll
fe30: 65 63 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  ect} then {..   
fe40: 20 20 20 20 20 63 6f 6c 6c 65 63 74 47 61 72 62       collectGarb
fe50: 61 67 65 20 24 63 68 61 6e 6e 65 6c 0d 0a 20 20  age $channel..  
fe60: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 69      }....      i
fe70: 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e  f {!$quiet} then
fe80: 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74   {..        tput
fe90: 73 20 24 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d  s $channel "----
fea0: 20 63 75 72 72 65 6e 74 20 6d 65 6d 6f 72 79 20   current memory 
feb0: 69 6e 20 75 73 65 20 62 79 20 74 68 65 20 43 4c  in use by the CL
fec0: 52 2e 2e 2e 20 22 0d 0a 20 20 20 20 20 20 7d 0d  R... "..      }.
fed0: 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 63 61  ...      if {[ca
fee0: 74 63 68 20 7b 6f 62 6a 65 63 74 20 69 6e 76 6f  tch {object invo
fef0: 6b 65 20 47 43 20 47 65 74 54 6f 74 61 6c 4d 65  ke GC GetTotalMe
ff00: 6d 6f 72 79 20 66 61 6c 73 65 7d 20 6d 65 6d 6f  mory false} memo
ff10: 72 79 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b  ry] == 0} then {
ff20: 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73  ..        if {[s
ff30: 74 72 69 6e 67 20 69 73 20 69 6e 74 65 67 65 72  tring is integer
ff40: 20 2d 73 74 72 69 63 74 20 24 6d 65 6d 6f 72 79   -strict $memory
ff50: 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
ff60: 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74       if {!$quiet
ff70: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
ff80: 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
ff90: 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
ffa0: 20 24 6d 65 6d 6f 72 79 20 22 20 62 79 74 65 73   $memory " bytes
ffb0: 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20 20 20  \n"]..          
ffc0: 7d 0d 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73  }..        } els
ffd0: 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73  e {..          s
ffe0: 65 74 20 6d 65 6d 6f 72 79 20 69 6e 76 61 6c 69  et memory invali
fff0: 64 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 69  d....          i
10000 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e  f {!$quiet} then
10010 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
10020 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b  tputs $channel [
10030 61 70 70 65 6e 64 41 72 67 73 20 24 6d 65 6d 6f  appendArgs $memo
10040 72 79 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20  ry \n]..        
10050 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a    }..        }..
10060 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
10070 20 20 20 20 20 20 20 20 73 65 74 20 6d 65 6d 6f          set memo
10080 72 79 20 75 6e 6b 6e 6f 77 6e 0d 0a 0d 0a 20 20  ry unknown....  
10090 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65        if {!$quie
100a0 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  t} then {..     
100b0 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
100c0 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
100d0 24 6d 65 6d 6f 72 79 20 5c 6e 5d 0d 0a 20 20 20  $memory \n]..   
100e0 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d       }..      }.
100f0 0a 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ...      return 
10100 24 72 65 73 75 6c 74 0d 0a 20 20 20 20 7d 0d 0a  $result..    }..
10110 0c 0d 0a 20 20 20 20 70 72 6f 63 20 63 68 65 63  ...    proc chec
10120 6b 46 6f 72 53 51 4c 69 74 65 44 69 72 65 63 74  kForSQLiteDirect
10130 6f 72 69 65 73 20 7b 20 63 68 61 6e 6e 65 6c 20  ories { channel 
10140 7b 72 65 73 65 74 20 66 61 6c 73 65 7d 20 7d 20  {reset false} } 
10150 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  {..      #..    
10160 20 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20    # NOTE: Check 
10170 69 66 20 74 68 65 20 73 71 6c 69 74 65 33 5f 77  if the sqlite3_w
10180 69 6e 33 32 5f 73 65 74 5f 64 69 72 65 63 74 6f  in32_set_directo
10190 72 79 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  ry function is a
101a0 76 61 69 6c 61 62 6c 65 2e 0d 0a 20 20 20 20 20  vailable...     
101b0 20 23 0d 0a 20 20 20 20 20 20 74 70 75 74 73 20   #..      tputs 
101c0 24 63 68 61 6e 6e 65 6c 20 5c 0d 0a 20 20 20 20  $channel \..    
101d0 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 68 65 63        "---- chec
101e0 6b 69 6e 67 20 66 6f 72 20 66 75 6e 63 74 69 6f  king for functio
101f0 6e 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f  n sqlite3_win32_
10200 73 65 74 5f 64 69 72 65 63 74 6f 72 79 2e 2e 2e  set_directory...
10210 20 22 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20   "....      #.. 
10220 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 69       # NOTE: Thi
10230 73 20 63 61 6c 6c 20 74 6f 20 74 68 65 20 73 71  s call to the sq
10240 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 65 74 5f  lite3_win32_set_
10250 64 69 72 65 63 74 6f 72 79 20 66 75 6e 63 74 69  directory functi
10260 6f 6e 20 75 73 65 73 20 74 68 65 0d 0a 20 20 20  on uses the..   
10270 20 20 20 23 20 20 20 20 20 20 20 69 6e 76 61 6c     #       inval
10280 69 64 20 76 61 6c 75 65 20 30 20 66 6f 72 20 74  id value 0 for t
10290 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
102a0 74 2e 20 20 54 68 69 73 20 63 6f 64 65 20 69 73  t.  This code is
102b0 20 64 65 73 69 67 6e 65 64 0d 0a 20 20 20 20 20   designed..     
102c0 20 23 20 20 20 20 20 20 20 74 6f 20 63 68 65 63   #       to chec
102d0 6b 20 69 66 20 63 61 6c 6c 69 6e 67 20 74 68 65  k if calling the
102e0 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 72   function will r
102f0 61 69 73 65 20 61 6e 20 65 78 63 65 70 74 69 6f  aise an exceptio
10300 6e 20 28 69 2e 65 2e 0d 0a 20 20 20 20 20 20 23  n (i.e...      #
10310 20 20 20 20 20 20 20 74 68 65 20 61 63 74 75 61         the actua
10320 6c 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20  l result of the 
10330 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f  function does no
10340 74 20 6d 61 74 74 65 72 20 61 73 20 6c 6f 6e 67  t matter as long
10350 20 61 73 20 6e 6f 0d 0a 20 20 20 20 20 20 23 20   as no..      # 
10360 20 20 20 20 20 20 64 69 72 65 63 74 6f 72 79 20        directory 
10370 69 73 20 63 68 61 6e 67 65 64 29 2e 0d 0a 20 20  is changed)...  
10380 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20      #..      if 
10390 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20  {[catch {..     
103a0 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20           object 
103b0 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e  invoke -flags +N
103c0 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20  onPublic \..    
103d0 20 20 20 20 20 20 20 20 20 20 53 79 73 74 65 6d            System
103e0 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 55 6e 73  .Data.SQLite.Uns
103f0 61 66 65 4e 61 74 69 76 65 4d 65 74 68 6f 64 73  afeNativeMethods
10400 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
10410 20 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f    sqlite3_win32_
10420 73 65 74 5f 64 69 72 65 63 74 6f 72 79 20 30 20  set_directory 0 
10430 6e 75 6c 6c 7d 5d 20 3d 3d 20 30 7d 20 74 68 65  null}] == 0} the
10440 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  n {..        #..
10450 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
10460 43 61 6c 6c 69 6e 67 20 74 68 65 20 73 71 6c 69  Calling the sqli
10470 74 65 33 5f 77 69 6e 33 32 5f 73 65 74 5f 64 69  te3_win32_set_di
10480 72 65 63 74 6f 72 79 20 66 75 6e 63 74 69 6f 6e  rectory function
10490 20 64 6f 65 73 20 6e 6f 74 0d 0a 20 20 20 20 20   does not..     
104a0 20 20 20 23 20 20 20 20 20 20 20 63 61 75 73 65     #       cause
104b0 20 61 6e 20 65 78 63 65 70 74 69 6f 6e 3b 20 74   an exception; t
104c0 68 65 72 65 66 6f 72 65 2c 20 69 74 20 6d 75 73  herefore, it mus
104d0 74 20 62 65 20 61 76 61 69 6c 61 62 6c 65 20 28  t be available (
104e0 69 2e 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 20  i.e...        # 
104f0 20 20 20 20 20 20 65 76 65 6e 20 74 68 6f 75 67        even thoug
10500 68 20 69 74 20 73 68 6f 75 6c 64 20 72 65 74 75  h it should retu
10510 72 6e 20 61 20 66 61 69 6c 75 72 65 20 72 65 74  rn a failure ret
10520 75 72 6e 20 63 6f 64 65 20 69 6e 20 74 68 69 73  urn code in this
10530 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
10540 20 20 63 61 73 65 29 2e 0d 0a 20 20 20 20 20 20    case)...      
10550 20 20 23 0d 0a 20 20 20 20 20 20 20 20 61 64 64    #..        add
10560 43 6f 6e 73 74 72 61 69 6e 74 20 73 71 6c 69 74  Constraint sqlit
10570 65 33 5f 77 69 6e 33 32 5f 73 65 74 5f 64 69 72  e3_win32_set_dir
10580 65 63 74 6f 72 79 0d 0a 0d 0a 20 20 20 20 20 20  ectory....      
10590 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
105a0 20 79 65 73 5c 6e 0d 0a 0d 0a 20 20 20 20 20 20   yes\n....      
105b0 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
105c0 4f 54 45 3a 20 44 6f 65 73 20 6f 75 72 20 63 61  OTE: Does our ca
105d0 6c 6c 65 72 20 77 61 6e 74 20 74 6f 20 72 65 73  ller want to res
105e0 65 74 20 74 68 65 20 64 69 72 65 63 74 6f 72 69  et the directori
105f0 65 73 3f 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  es?..        #..
10600 20 20 20 20 20 20 20 20 69 66 20 7b 24 72 65 73          if {$res
10610 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  et} then {..    
10620 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
10630 20 20 20 23 20 4e 4f 54 45 3a 20 4e 6f 77 20 6d     # NOTE: Now m
10640 61 6b 65 20 73 75 72 65 20 74 68 65 20 64 61 74  ake sure the dat
10650 61 62 61 73 65 20 61 6e 64 20 74 65 6d 70 6f 72  abase and tempor
10660 61 72 79 20 64 69 72 65 63 74 6f 72 69 65 73 20  ary directories 
10670 61 72 65 0d 0a 20 20 20 20 20 20 20 20 20 20 23  are..          #
10680 20 20 20 20 20 20 20 72 65 73 65 74 20 74 68 65         reset the
10690 69 72 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65  ir default value
106a0 73 2c 20 77 68 69 63 68 20 73 68 6f 75 6c 64 20  s, which should 
106b0 62 65 20 6e 75 6c 6c 20 66 6f 72 20 62 6f 74 68  be null for both
106c0 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 20  ...          #  
106d0 20 20 20 20 20 53 69 6e 63 65 20 74 68 65 20 73       Since the s
106e0 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 65 74  qlite3_win32_set
106f0 5f 64 69 72 65 63 74 6f 72 79 20 66 75 6e 63 74  _directory funct
10700 69 6f 6e 20 69 73 20 61 76 61 69 6c 61 62 6c 65  ion is available
10710 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 20  ,..          #  
10720 20 20 20 20 20 75 73 65 20 69 74 2e 0d 0a 20 20       use it...  
10730 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
10740 20 20 20 20 20 66 6f 72 20 7b 73 65 74 20 69 6e       for {set in
10750 64 65 78 20 31 7d 20 7b 24 69 6e 64 65 78 20 3c  dex 1} {$index <
10760 20 33 7d 20 7b 69 6e 63 72 20 69 6e 64 65 78 7d   3} {incr index}
10770 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
10780 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20  if {[catch {..  
10790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
107a0 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20    object invoke 
107b0 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69  -flags +NonPubli
107c0 63 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  c \..           
107d0 20 20 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e           System.
107e0 44 61 74 61 2e 53 51 4c 69 74 65 2e 55 6e 73 61  Data.SQLite.Unsa
107f0 66 65 4e 61 74 69 76 65 4d 65 74 68 6f 64 73 20  feNativeMethods 
10800 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
10810 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 77         sqlite3_w
10820 69 6e 33 32 5f 73 65 74 5f 64 69 72 65 63 74 6f  in32_set_directo
10830 72 79 20 24 69 6e 64 65 78 20 6e 75 6c 6c 7d 20  ry $index null} 
10840 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
10850 20 20 20 20 20 20 20 72 65 73 75 6c 74 5d 20 3d         result] =
10860 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  = 0} then {..   
10870 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
10880 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e   $channel [appen
10890 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
108a0 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
108b0 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 5f 77 69   call sqlite3_wi
108c0 6e 33 32 5f 73 65 74 5f 64 69 72 65 63 74 6f 72  n32_set_director
108d0 79 28 22 20 24 69 6e 64 65 78 20 5c 0d 0a 20 20  y(" $index \..  
108e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
108f0 22 2c 20 6e 75 6c 6c 29 2e 2e 2e 20 6f 6b 3a 20  ", null)... ok: 
10900 22 20 24 72 65 73 75 6c 74 20 5c 6e 5d 0d 0a 20  " $result \n].. 
10910 20 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73             } els
10920 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e {..           
10930 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
10940 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
10950 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
10960 20 20 20 22 2d 2d 2d 2d 20 63 61 6c 6c 20 73 71     "---- call sq
10970 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 65 74 5f  lite3_win32_set_
10980 64 69 72 65 63 74 6f 72 79 28 22 20 24 69 6e 64  directory(" $ind
10990 65 78 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  ex \..          
109a0 20 20 20 20 20 20 20 20 22 2c 20 6e 75 6c 6c 29          ", null)
109b0 2e 2e 2e 20 65 72 72 6f 72 3a 20 22 20 5c 6e 5c  ... error: " \n\
109c0 74 20 24 72 65 73 75 6c 74 20 5c 6e 5d 0d 0a 20  t $result \n].. 
109d0 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
109e0 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
109f0 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 20 65 6c     }..      } el
10a00 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70  se {..        tp
10a10 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 6e 6f 5c  uts $channel no\
10a20 6e 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  n....        #..
10a30 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
10a40 44 6f 65 73 20 6f 75 72 20 63 61 6c 6c 65 72 20  Does our caller 
10a50 77 61 6e 74 20 74 6f 20 72 65 73 65 74 20 74 68  want to reset th
10a60 65 20 64 69 72 65 63 74 6f 72 69 65 73 3f 20 20  e directories?  
10a70 54 68 69 73 20 63 61 6e 20 6f 6e 6c 79 0d 0a 20  This can only.. 
10a80 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 62         #       b
10a90 65 20 70 65 72 66 6f 72 6d 65 64 20 69 66 20 53  e performed if S
10aa0 51 4c 69 74 65 20 69 73 20 6c 6f 61 64 65 64 20  QLite is loaded 
10ab0 61 6e 64 20 72 65 61 64 79 20 66 6f 72 20 75 73  and ready for us
10ac0 65 20 62 79 20 74 68 65 20 74 65 73 74 0d 0a 20  e by the test.. 
10ad0 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 73         #       s
10ae0 75 69 74 65 2e 0d 0a 20 20 20 20 20 20 20 20 23  uite...        #
10af0 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 24 72  ..        if {$r
10b00 65 73 65 74 20 26 26 20 5b 69 73 53 51 4c 69 74  eset && [isSQLit
10b10 65 52 65 61 64 79 5d 7d 20 74 68 65 6e 20 7b 0d  eReady]} then {.
10b20 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
10b30 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
10b40 4e 6f 77 20 6d 61 6b 65 20 73 75 72 65 20 74 68  Now make sure th
10b50 65 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 74  e database and t
10b60 65 6d 70 6f 72 61 72 79 20 64 69 72 65 63 74 6f  emporary directo
10b70 72 69 65 73 20 61 72 65 0d 0a 20 20 20 20 20 20  ries are..      
10b80 20 20 20 20 23 20 20 20 20 20 20 20 72 65 73 65      #       rese
10b90 74 20 74 68 65 69 72 20 64 65 66 61 75 6c 74 20  t their default 
10ba0 76 61 6c 75 65 73 2c 20 77 68 69 63 68 20 73 68  values, which sh
10bb0 6f 75 6c 64 20 62 65 20 6e 75 6c 6c 20 66 6f 72  ould be null for
10bc0 20 62 6f 74 68 2e 0d 0a 20 20 20 20 20 20 20 20   both...        
10bd0 20 20 23 20 20 20 20 20 20 20 53 69 6e 63 65 20    #       Since 
10be0 74 68 65 20 73 71 6c 69 74 65 33 5f 77 69 6e 33  the sqlite3_win3
10bf0 32 5f 73 65 74 5f 64 69 72 65 63 74 6f 72 79 20  2_set_directory 
10c00 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f  function does no
10c10 74 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 20  t..          #  
10c20 20 20 20 20 20 61 70 70 65 61 72 20 74 6f 20 62       appear to b
10c30 65 20 61 76 61 69 6c 61 62 6c 65 2c 20 75 73 65  e available, use
10c40 20 74 68 65 20 61 73 73 6f 63 69 61 74 65 64 20   the associated 
10c50 50 52 41 47 4d 41 20 63 6f 6d 6d 61 6e 64 73 0d  PRAGMA commands.
10c60 0a 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20  .          #    
10c70 20 20 20 69 6e 73 74 65 61 64 2e 0d 0a 20 20 20     instead...   
10c80 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
10c90 20 20 20 20 66 6f 72 65 61 63 68 20 64 69 72 65      foreach dire
10ca0 63 74 6f 72 79 20 5b 6c 69 73 74 20 64 61 74 61  ctory [list data
10cb0 5f 73 74 6f 72 65 5f 64 69 72 65 63 74 6f 72 79  _store_directory
10cc0 20 74 65 6d 70 5f 73 74 6f 72 65 5f 64 69 72 65   temp_store_dire
10cd0 63 74 6f 72 79 5d 20 7b 0d 0a 20 20 20 20 20 20  ctory] {..      
10ce0 20 20 20 20 20 20 73 65 74 20 73 71 6c 20 5b 61        set sql [a
10cf0 70 70 65 6e 64 41 72 67 73 20 22 50 52 41 47 4d  ppendArgs "PRAGM
10d00 41 20 22 20 24 64 69 72 65 63 74 6f 72 79 20 22  A " $directory "
10d10 20 3d 20 5c 22 5c 22 3b 22 5d 0d 0a 0d 0a 20 20   = \"\";"]....  
10d20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63            if {[c
10d30 61 74 63 68 20 7b 65 78 65 63 75 74 65 53 71 6c  atch {executeSql
10d40 20 24 73 71 6c 7d 20 72 65 73 75 6c 74 5d 20 3d   $sql} result] =
10d50 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  = 0} then {..   
10d60 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
10d70 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e   $channel [appen
10d80 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
10d90 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
10da0 20 65 78 65 63 75 74 65 20 50 52 41 47 4d 41 20   execute PRAGMA 
10db0 22 20 24 64 69 72 65 63 74 6f 72 79 20 22 2e 2e  " $directory "..
10dc0 2e 20 6f 6b 3a 20 5c 22 22 20 5c 0d 0a 20 20 20  . ok: \"" \..   
10dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 24                 $
10de0 72 65 73 75 6c 74 20 5c 22 5c 6e 5d 0d 0a 20 20  result \"\n]..  
10df0 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65            } else
10e00 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
10e10 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
10e20 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
10e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10e40 20 20 22 2d 2d 2d 2d 20 65 78 65 63 75 74 65 20    "---- execute 
10e50 50 52 41 47 4d 41 20 22 20 24 64 69 72 65 63 74  PRAGMA " $direct
10e60 6f 72 79 20 22 2e 2e 2e 20 65 72 72 6f 72 3a 20  ory "... error: 
10e70 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  " \..           
10e80 20 20 20 20 20 20 20 5c 6e 5c 74 20 24 72 65 73         \n\t $res
10e90 75 6c 74 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20  ult \n]..       
10ea0 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
10eb0 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a    }..        }..
10ec0 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
10ed0 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
10ee0 3a 20 46 69 6e 61 6c 6c 79 2c 20 73 68 6f 77 20  : Finally, show 
10ef0 74 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75  the current valu
10f00 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
10f10 65 20 61 6e 64 20 74 65 6d 70 6f 72 61 72 79 0d  e and temporary.
10f20 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 64  .      #       d
10f30 69 72 65 63 74 6f 72 69 65 73 2e 20 20 54 68 69  irectories.  Thi
10f40 73 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20 70 65  s can only be pe
10f50 72 66 6f 72 6d 65 64 20 69 66 20 53 51 4c 69 74  rformed if SQLit
10f60 65 20 69 73 20 6c 6f 61 64 65 64 0d 0a 20 20 20  e is loaded..   
10f70 20 20 20 23 20 20 20 20 20 20 20 61 6e 64 20 72     #       and r
10f80 65 61 64 79 20 66 6f 72 20 75 73 65 20 62 79 20  eady for use by 
10f90 74 68 65 20 74 65 73 74 20 73 75 69 74 65 2e 0d  the test suite..
10fa0 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
10fb0 69 66 20 7b 5b 69 73 53 51 4c 69 74 65 52 65 61  if {[isSQLiteRea
10fc0 64 79 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  dy]} then {..   
10fd0 20 20 20 20 20 66 6f 72 65 61 63 68 20 64 69 72       foreach dir
10fe0 65 63 74 6f 72 79 20 5b 6c 69 73 74 20 64 61 74  ectory [list dat
10ff0 61 5f 73 74 6f 72 65 5f 64 69 72 65 63 74 6f 72  a_store_director
11000 79 20 74 65 6d 70 5f 73 74 6f 72 65 5f 64 69 72  y temp_store_dir
11010 65 63 74 6f 72 79 5d 20 7b 0d 0a 20 20 20 20 20  ectory] {..     
11020 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
11030 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
11040 22 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e 67 20 22  "---- checking "
11050 20 24 64 69 72 65 63 74 6f 72 79 20 22 2e 2e 2e   $directory "...
11060 20 22 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20   "]....         
11070 20 73 65 74 20 73 71 6c 20 5b 61 70 70 65 6e 64   set sql [append
11080 41 72 67 73 20 22 50 52 41 47 4d 41 20 22 20 24  Args "PRAGMA " $
11090 64 69 72 65 63 74 6f 72 79 20 5c 3b 5d 0d 0a 0d  directory \;]...
110a0 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b  .          if {[
110b0 63 61 74 63 68 20 7b 65 78 65 63 75 74 65 53 71  catch {executeSq
110c0 6c 20 24 73 71 6c 20 73 63 61 6c 61 72 7d 20 72  l $sql scalar} r
110d0 65 73 75 6c 74 5d 20 3d 3d 20 30 7d 20 74 68 65  esult] == 0} the
110e0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
110f0 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
11100 5b 61 70 70 65 6e 64 41 72 67 73 20 22 6f 6b 3a  [appendArgs "ok:
11110 20 5c 22 22 20 24 72 65 73 75 6c 74 20 5c 22 5c   \"" $result \"\
11120 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 20  n]..          } 
11130 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
11140 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
11150 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 22  el [appendArgs "
11160 65 72 72 6f 72 3a 20 22 20 5c 6e 5c 74 20 24 72  error: " \n\t $r
11170 65 73 75 6c 74 20 5c 6e 5d 0d 0a 20 20 20 20 20  esult \n]..     
11180 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
11190 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  }..      }..    
111a0 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 6c  }.....    proc l
111b0 6f 61 64 53 51 4c 69 74 65 54 65 73 74 53 65 74  oadSQLiteTestSet
111c0 74 69 6e 67 73 20 7b 20 63 68 61 6e 6e 65 6c 20  tings { channel 
111d0 7b 73 75 66 66 69 78 20 22 22 7d 20 7b 71 75 69  {suffix ""} {qui
111e0 65 74 20 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a 20  et false} } {.. 
111f0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
11200 4e 4f 54 45 3a 20 53 6b 69 70 20 6c 6f 61 64 69  NOTE: Skip loadi
11210 6e 67 20 74 68 65 20 73 65 74 74 69 6e 67 73 20  ng the settings 
11220 69 66 20 74 68 65 69 72 20 75 73 61 67 65 20 68  if their usage h
11230 61 73 20 62 65 65 6e 20 64 69 73 61 62 6c 65 64  as been disabled
11240 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
11250 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69    if {![info exi
11260 73 74 73 20 3a 3a 6e 6f 28 73 71 6c 69 74 65 54  sts ::no(sqliteT
11270 65 73 74 53 65 74 74 69 6e 67 73 29 5d 7d 20 74  estSettings)]} t
11280 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  hen {..        #
11290 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
112a0 3a 20 4c 6f 61 64 20 63 75 73 74 6f 6d 20 70 65  : Load custom pe
112b0 72 2d 75 73 65 72 20 61 6e 64 2f 6f 72 20 70 65  r-user and/or pe
112c0 72 2d 68 6f 73 74 20 74 65 73 74 20 73 65 74 74  r-host test sett
112d0 69 6e 67 73 20 6e 6f 77 2e 0d 0a 20 20 20 20 20  ings now...     
112e0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 69 66     #..        if
112f0 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a   {[info exists :
11300 3a 74 63 6c 5f 70 6c 61 74 66 6f 72 6d 28 75 73  :tcl_platform(us
11310 65 72 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  er)]} then {..  
11320 20 20 20 20 20 20 20 20 73 65 74 20 75 73 65 72          set user
11330 53 65 74 74 69 6e 67 73 46 69 6c 65 4e 61 6d 65  SettingsFileName
11340 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5b 67 65 74   [file join [get
11350 43 6f 6d 6d 6f 6e 44 69 72 65 63 74 6f 72 79 5d  CommonDirectory]
11360 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
11370 20 20 5b 61 70 70 65 6e 64 41 72 67 73 20 73 65    [appendArgs se
11380 74 74 69 6e 67 73 20 24 73 75 66 66 69 78 20 2e  ttings $suffix .
11390 20 24 3a 3a 74 63 6c 5f 70 6c 61 74 66 6f 72 6d   $::tcl_platform
113a0 28 75 73 65 72 29 20 2e 65 61 67 6c 65 5d 5d 0d  (user) .eagle]].
113b0 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20  ...          if 
113c0 7b 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24 75  {[file exists $u
113d0 73 65 72 53 65 74 74 69 6e 67 73 46 69 6c 65 4e  serSettingsFileN
113e0 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ame]} then {..  
113f0 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 24            if {!$
11400 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20  quiet} then {.. 
11410 20 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75               tpu
11420 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70  ts $channel [app
11430 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
11440 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d               "--
11450 2d 2d 20 6c 6f 61 64 69 6e 67 20 70 65 72 2d 75  -- loading per-u
11460 73 65 72 20 74 65 73 74 20 73 65 74 74 69 6e 67  ser test setting
11470 73 20 66 69 6c 65 20 5c 22 22 20 5c 0d 0a 20 20  s file \"" \..  
11480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11490 24 75 73 65 72 53 65 74 74 69 6e 67 73 46 69 6c  $userSettingsFil
114a0 65 4e 61 6d 65 20 5c 22 2e 2e 2e 5c 6e 5d 0d 0a  eName \"...\n]..
114b0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d              }...
114c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20  .            if 
114d0 7b 5b 63 61 74 63 68 20 7b 75 70 6c 65 76 65 6c  {[catch {uplevel
114e0 20 31 20 5b 6c 69 73 74 20 73 6f 75 72 63 65 20   1 [list source 
114f0 24 75 73 65 72 53 65 74 74 69 6e 67 73 46 69 6c  $userSettingsFil
11500 65 4e 61 6d 65 5d 7d 20 5c 0d 0a 20 20 20 20 20  eName]} \..     
11510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65                 e
11520 72 72 6f 72 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  rror]} then {.. 
11530 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20               if 
11540 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b  {!$quiet} then {
11550 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
11560 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
11570 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
11580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11590 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e      "==== WARNIN
115a0 47 3a 20 66 61 69 6c 65 64 20 74 6f 20 6c 6f 61  G: failed to loa
115b0 64 20 70 65 72 2d 75 73 65 72 20 73 65 74 74 69  d per-user setti
115c0 6e 67 73 20 66 69 6c 65 20 5c 22 22 20 5c 0d 0a  ngs file \"" \..
115d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
115e0 20 20 20 20 24 75 73 65 72 53 65 74 74 69 6e 67      $userSetting
115f0 73 46 69 6c 65 4e 61 6d 65 20 22 5c 22 2c 20 65  sFileName "\", e
11600 72 72 6f 72 3a 20 22 20 5c 6e 5c 74 20 24 65 72  rror: " \n\t $er
11610 72 6f 72 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20  ror \n]..       
11620 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
11630 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
11640 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
11650 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71           if {!$q
11660 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  uiet} then {..  
11670 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
11680 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  s $channel [appe
11690 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
116a0 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
116b0 2d 20 73 6b 69 70 70 65 64 20 6c 6f 61 64 69 6e  - skipped loadin
116c0 67 20 70 65 72 2d 75 73 65 72 20 74 65 73 74 20  g per-user test 
116d0 73 65 74 74 69 6e 67 73 20 66 69 6c 65 20 5c 22  settings file \"
116e0 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  " \..           
116f0 20 20 20 20 20 20 20 24 75 73 65 72 53 65 74 74         $userSett
11700 69 6e 67 73 46 69 6c 65 4e 61 6d 65 20 22 5c 22  ingsFileName "\"
11710 2c 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 65 78  , it does not ex
11720 69 73 74 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20  ist\n"]..       
11730 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
11740 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a    }..        }..
11750 0d 0a 20 20 20 20 20 20 20 20 23 23 23 23 23 23  ..        ######
11760 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
11770 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
11780 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
11790 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
117a0 23 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20  #....        if 
117b0 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  {[info exists ::
117c0 74 63 6c 5f 70 6c 61 74 66 6f 72 6d 28 68 6f 73  tcl_platform(hos
117d0 74 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  t)]} then {..   
117e0 20 20 20 20 20 20 20 73 65 74 20 68 6f 73 74 53         set hostS
117f0 65 74 74 69 6e 67 73 46 69 6c 65 4e 61 6d 65 20  ettingsFileName 
11800 5b 66 69 6c 65 20 6a 6f 69 6e 20 5b 67 65 74 43  [file join [getC
11810 6f 6d 6d 6f 6e 44 69 72 65 63 74 6f 72 79 5d 20  ommonDirectory] 
11820 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
11830 20 5b 61 70 70 65 6e 64 41 72 67 73 20 73 65 74   [appendArgs set
11840 74 69 6e 67 73 20 24 73 75 66 66 69 78 20 2e 20  tings $suffix . 
11850 24 3a 3a 74 63 6c 5f 70 6c 61 74 66 6f 72 6d 28  $::tcl_platform(
11860 68 6f 73 74 29 20 2e 65 61 67 6c 65 5d 5d 0d 0a  host) .eagle]]..
11870 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b  ..          if {
11880 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24 68 6f  [file exists $ho
11890 73 74 53 65 74 74 69 6e 67 73 46 69 6c 65 4e 61  stSettingsFileNa
118a0 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  me]} then {..   
118b0 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71           if {!$q
118c0 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  uiet} then {..  
118d0 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
118e0 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  s $channel [appe
118f0 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
11900 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
11910 2d 20 6c 6f 61 64 69 6e 67 20 70 65 72 2d 68 6f  - loading per-ho
11920 73 74 20 74 65 73 74 20 73 65 74 74 69 6e 67 73  st test settings
11930 20 66 69 6c 65 20 5c 22 22 20 5c 0d 0a 20 20 20   file \"" \..   
11940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 24                 $
11950 68 6f 73 74 53 65 74 74 69 6e 67 73 46 69 6c 65  hostSettingsFile
11960 4e 61 6d 65 20 5c 22 2e 2e 2e 5c 6e 5d 0d 0a 20  Name \"...\n].. 
11970 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a             }....
11980 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b              if {
11990 5b 63 61 74 63 68 20 7b 75 70 6c 65 76 65 6c 20  [catch {uplevel 
119a0 31 20 5b 6c 69 73 74 20 73 6f 75 72 63 65 20 24  1 [list source $
119b0 68 6f 73 74 53 65 74 74 69 6e 67 73 46 69 6c 65  hostSettingsFile
119c0 4e 61 6d 65 5d 7d 20 5c 0d 0a 20 20 20 20 20 20  Name]} \..      
119d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65 72                er
119e0 72 6f 72 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ror]} then {..  
119f0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b              if {
11a00 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d  !$quiet} then {.
11a10 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
11a20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
11a30 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
11a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11a50 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47     "==== WARNING
11a60 3a 20 66 61 69 6c 65 64 20 74 6f 20 6c 6f 61 64  : failed to load
11a70 20 70 65 72 2d 68 6f 73 74 20 73 65 74 74 69 6e   per-host settin
11a80 67 73 20 66 69 6c 65 20 5c 22 22 20 5c 0d 0a 20  gs file \"" \.. 
11a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11aa0 20 20 20 24 68 6f 73 74 53 65 74 74 69 6e 67 73     $hostSettings
11ab0 46 69 6c 65 4e 61 6d 65 20 22 5c 22 2c 20 65 72  FileName "\", er
11ac0 72 6f 72 3a 20 22 20 5c 6e 5c 74 20 24 65 72 72  ror: " \n\t $err
11ad0 6f 72 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20  or \n]..        
11ae0 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
11af0 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
11b00 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
11b10 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75          if {!$qu
11b20 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  iet} then {..   
11b30 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
11b40 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e   $channel [appen
11b50 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
11b60 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
11b70 20 73 6b 69 70 70 65 64 20 6c 6f 61 64 69 6e 67   skipped loading
11b80 20 70 65 72 2d 68 6f 73 74 20 74 65 73 74 20 73   per-host test s
11b90 65 74 74 69 6e 67 73 20 66 69 6c 65 20 5c 22 22  ettings file \""
11ba0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
11bb0 20 20 20 20 20 20 24 68 6f 73 74 53 65 74 74 69        $hostSetti
11bc0 6e 67 73 46 69 6c 65 4e 61 6d 65 20 22 5c 22 2c  ngsFileName "\",
11bd0 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 65 78 69   it does not exi
11be0 73 74 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20  st\n"]..        
11bf0 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
11c00 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20   }..        }.. 
11c10 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c       }..    }...
11c20 0d 0a 20 20 20 20 70 72 6f 63 20 72 75 6e 53 51  ..    proc runSQ
11c30 4c 69 74 65 54 65 73 74 50 72 6f 6c 6f 67 75 65  LiteTestPrologue
11c40 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a   {} {..      #..
11c50 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 6b        # NOTE: Sk
11c60 69 70 20 72 75 6e 6e 69 6e 67 20 6f 75 72 20 63  ip running our c
11c70 75 73 74 6f 6d 20 70 72 6f 6c 6f 67 75 65 20 69  ustom prologue i
11c80 66 20 74 68 65 20 6d 61 69 6e 20 6f 6e 65 20 68  f the main one h
11c90 61 73 20 62 65 65 6e 0d 0a 20 20 20 20 20 20 23  as been..      #
11ca0 20 20 20 20 20 20 20 73 6b 69 70 70 65 64 2e 0d         skipped..
11cb0 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
11cc0 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74  if {![info exist
11cd0 73 20 3a 3a 6e 6f 28 70 72 6f 6c 6f 67 75 65 2e  s ::no(prologue.
11ce0 65 61 67 6c 65 29 5d 7d 20 74 68 65 6e 20 7b 0d  eagle)]} then {.
11cf0 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
11d00 20 20 20 20 23 20 4e 4f 54 45 3a 20 4c 6f 61 64      # NOTE: Load
11d10 20 74 68 65 20 22 62 65 66 6f 72 65 2d 63 6f 6e   the "before-con
11d20 73 74 72 61 69 6e 74 73 22 20 63 75 73 74 6f 6d  straints" custom
11d30 20 70 65 72 2d 75 73 65 72 20 61 6e 64 2f 6f 72   per-user and/or
11d40 20 70 65 72 2d 68 6f 73 74 0d 0a 20 20 20 20 20   per-host..     
11d50 20 20 20 23 20 20 20 20 20 20 20 74 65 73 74 20     #       test 
11d60 73 65 74 74 69 6e 67 73 20 6e 6f 77 2e 0d 0a 20  settings now... 
11d70 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
11d80 20 20 75 70 6c 65 76 65 6c 20 31 20 5b 6c 69 73    uplevel 1 [lis
11d90 74 20 6c 6f 61 64 53 51 4c 69 74 65 54 65 73 74  t loadSQLiteTest
11da0 53 65 74 74 69 6e 67 73 20 24 3a 3a 74 65 73 74  Settings $::test
11db0 5f 63 68 61 6e 6e 65 6c 20 2e 62 65 66 6f 72 65  _channel .before
11dc0 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  ]....        #..
11dd0 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
11de0 53 6b 69 70 20 61 6c 6c 20 53 79 73 74 65 6d 2e  Skip all System.
11df0 44 61 74 61 2e 53 51 4c 69 74 65 20 72 65 6c 61  Data.SQLite rela
11e00 74 65 64 20 66 69 6c 65 20 68 61 6e 64 6c 69 6e  ted file handlin
11e10 67 20 28 64 65 6c 65 74 69 6e 67 2c 0d 0a 20 20  g (deleting,..  
11e20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63 6f        #       co
11e30 70 79 69 6e 67 2c 20 61 6e 64 20 6c 6f 61 64 69  pying, and loadi
11e40 6e 67 29 20 69 66 20 77 65 20 61 72 65 20 73 6f  ng) if we are so
11e50 20 69 6e 73 74 72 75 63 74 65 64 2e 0d 0a 20 20   instructed...  
11e60 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
11e70 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73   if {![info exis
11e80 74 73 20 3a 3a 6e 6f 28 73 71 6c 69 74 65 46 69  ts ::no(sqliteFi
11e90 6c 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  les)]} then {.. 
11ea0 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
11eb0 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 6b        # NOTE: Sk
11ec0 69 70 20 74 72 79 69 6e 67 20 74 6f 20 64 65 6c  ip trying to del
11ed0 65 74 65 20 61 6e 79 20 66 69 6c 65 73 20 69 66  ete any files if
11ee0 20 77 65 20 61 72 65 20 73 6f 20 69 6e 73 74 72   we are so instr
11ef0 75 63 74 65 64 2e 0d 0a 20 20 20 20 20 20 20 20  ucted...        
11f00 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 69    #..          i
11f10 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73  f {![info exists
11f20 20 3a 3a 6e 6f 28 64 65 6c 65 74 65 53 71 6c 69   ::no(deleteSqli
11f30 74 65 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e 20  teFiles)]} then 
11f40 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  {..            t
11f50 72 79 44 65 6c 65 74 65 41 73 73 65 6d 62 6c 79  ryDeleteAssembly
11f60 20 73 71 6c 69 74 65 33 2e 64 6c 6c 0d 0a 20 20   sqlite3.dll..  
11f70 20 20 20 20 20 20 20 20 20 20 72 65 6d 6f 76 65            remove
11f80 43 6f 6e 73 74 72 61 69 6e 74 20 66 69 6c 65 5f  Constraint file_
11f90 73 71 6c 69 74 65 33 2e 64 6c 6c 0d 0a 0d 0a 20  sqlite3.dll.... 
11fa0 20 20 20 20 20 20 20 20 20 20 20 74 72 79 44 65             tryDe
11fb0 6c 65 74 65 41 73 73 65 6d 62 6c 79 20 53 51 4c  leteAssembly SQL
11fc0 69 74 65 2e 49 6e 74 65 72 6f 70 2e 64 6c 6c 0d  ite.Interop.dll.
11fd0 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 6d  .            rem
11fe0 6f 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 66 69  oveConstraint fi
11ff0 6c 65 5f 53 51 4c 69 74 65 2e 49 6e 74 65 72 6f  le_SQLite.Intero
12000 70 2e 64 6c 6c 0d 0a 0d 0a 20 20 20 20 20 20 20  p.dll....       
12010 20 20 20 20 20 74 72 79 44 65 6c 65 74 65 41 73       tryDeleteAs
12020 73 65 6d 62 6c 79 20 53 79 73 74 65 6d 2e 44 61  sembly System.Da
12030 74 61 2e 53 51 4c 69 74 65 2e 64 6c 6c 0d 0a 20  ta.SQLite.dll.. 
12040 20 20 20 20 20 20 20 20 20 20 20 72 65 6d 6f 76             remov
12050 65 43 6f 6e 73 74 72 61 69 6e 74 20 66 69 6c 65  eConstraint file
12060 5f 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c  _System.Data.SQL
12070 69 74 65 2e 64 6c 6c 0d 0a 0d 0a 20 20 20 20 20  ite.dll....     
12080 20 20 20 20 20 20 20 74 72 79 44 65 6c 65 74 65         tryDelete
12090 41 73 73 65 6d 62 6c 79 20 53 79 73 74 65 6d 2e  Assembly System.
120a0 44 61 74 61 2e 53 51 4c 69 74 65 2e 4c 69 6e 71  Data.SQLite.Linq
120b0 2e 64 6c 6c 0d 0a 20 20 20 20 20 20 20 20 20 20  .dll..          
120c0 20 20 72 65 6d 6f 76 65 43 6f 6e 73 74 72 61 69    removeConstrai
120d0 6e 74 20 66 69 6c 65 5f 53 79 73 74 65 6d 2e 44  nt file_System.D
120e0 61 74 61 2e 53 51 4c 69 74 65 2e 4c 69 6e 71 2e  ata.SQLite.Linq.
120f0 64 6c 6c 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  dll..          }
12100 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d  ....          #.
12110 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54  .          # NOT
12120 45 3a 20 43 68 65 63 6b 20 66 6f 72 20 74 68 65  E: Check for the
12130 20 22 61 75 74 6f 53 65 6c 65 63 74 22 20 72 75   "autoSelect" ru
12140 6e 74 69 6d 65 20 6f 70 74 69 6f 6e 2e 20 20 49  ntime option.  I
12150 66 20 70 72 65 73 65 6e 74 2c 0d 0a 20 20 20 20  f present,..    
12160 20 20 20 20 20 20 23 20 20 20 20 20 20 20 61 74        #       at
12170 74 65 6d 70 74 20 74 6f 20 61 75 74 6f 6d 61 74  tempt to automat
12180 69 63 61 6c 6c 79 20 73 65 6c 65 63 74 20 74 68  ically select th
12190 65 20 66 69 72 73 74 20 61 76 61 69 6c 61 62 6c  e first availabl
121a0 65 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 20  e..          #  
121b0 20 20 20 20 20 62 75 69 6c 64 20 28 6f 72 20 22       build (or "
121c0 72 65 6c 65 61 73 65 22 29 20 6f 66 20 53 51 4c  release") of SQL
121d0 69 74 65 20 61 6e 64 20 53 79 73 74 65 6d 2e 44  ite and System.D
121e0 61 74 61 2e 53 51 4c 69 74 65 0d 0a 20 20 20 20  ata.SQLite..    
121f0 20 20 20 20 20 20 23 20 20 20 20 20 20 20 66 6f        #       fo
12200 72 20 75 73 65 20 77 69 74 68 20 74 68 65 20 74  r use with the t
12210 65 73 74 20 73 75 69 74 65 2e 0d 0a 20 20 20 20  est suite...    
12220 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
12230 20 20 20 69 66 20 7b 5b 68 61 73 52 75 6e 74 69     if {[hasRunti
12240 6d 65 4f 70 74 69 6f 6e 20 61 75 74 6f 53 65 6c  meOption autoSel
12250 65 63 74 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ect]} then {..  
12260 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b            if {![
12270 63 68 65 63 6b 46 6f 72 53 51 4c 69 74 65 42 75  checkForSQLiteBu
12280 69 6c 64 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  ilds $::test_cha
12290 6e 6e 65 6c 20 74 72 75 65 5d 7d 20 74 68 65 6e  nnel true]} then
122a0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
122b0 20 20 63 68 65 63 6b 46 6f 72 53 51 4c 69 74 65    checkForSQLite
122c0 52 65 6c 65 61 73 65 73 20 24 3a 3a 74 65 73 74  Releases $::test
122d0 5f 63 68 61 6e 6e 65 6c 20 74 72 75 65 0d 0a 20  _channel true.. 
122e0 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
122f0 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
12300 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
12310 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 6b 69 70      # NOTE: Skip
12320 20 74 72 79 69 6e 67 20 74 6f 20 76 65 72 69 66   trying to verif
12330 79 20 74 68 65 20 62 75 69 6c 64 20 64 69 72 65  y the build dire
12340 63 74 6f 72 79 20 69 66 20 77 65 20 61 72 65 20  ctory if we are 
12350 73 6f 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20  so..          # 
12360 20 20 20 20 20 20 69 6e 73 74 72 75 63 74 65 64        instructed
12370 3b 20 6f 74 68 65 72 77 69 73 65 2c 20 6d 61 6b  ; otherwise, mak
12380 65 20 73 75 72 65 20 69 74 20 61 63 74 75 61 6c  e sure it actual
12390 6c 79 20 65 78 69 73 74 73 20 6f 72 0d 0a 20 20  ly exists or..  
123a0 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
123b0 68 61 6c 74 20 74 68 65 20 65 6e 74 69 72 65 20  halt the entire 
123c0 74 65 73 74 69 6e 67 20 70 72 6f 63 65 73 73 20  testing process 
123d0 69 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 65  if it does not e
123e0 78 69 73 74 2e 0d 0a 20 20 20 20 20 20 20 20 20  xist...         
123f0 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66   #..          if
12400 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20   {![info exists 
12410 3a 3a 6e 6f 28 76 65 72 69 66 79 42 75 69 6c 64  ::no(verifyBuild
12420 44 69 72 65 63 74 6f 72 79 29 5d 7d 20 74 68 65  Directory)]} the
12430 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
12440 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   #..            
12450 23 20 4e 4f 54 45 3a 20 41 74 20 74 68 69 73 20  # NOTE: At this 
12460 70 6f 69 6e 74 2c 20 74 68 65 20 62 75 69 6c 64  point, the build
12470 20 64 69 72 65 63 74 6f 72 79 20 4d 55 53 54 20   directory MUST 
12480 65 78 69 73 74 20 61 73 20 61 0d 0a 20 20 20 20  exist as a..    
12490 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
124a0 76 61 6c 69 64 20 64 69 72 65 63 74 6f 72 79 20  valid directory 
124b0 66 6f 72 20 74 68 65 20 74 65 73 74 69 6e 67 20  for the testing 
124c0 70 72 6f 63 65 73 73 20 74 6f 20 63 6f 6e 74 69  process to conti
124d0 6e 75 65 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  nue...          
124e0 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20    #..           
124f0 20 73 65 74 20 64 69 72 65 63 74 6f 72 79 20 5b   set directory [
12500 67 65 74 42 75 69 6c 64 44 69 72 65 63 74 6f 72  getBuildDirector
12510 79 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  y]....          
12520 20 20 69 66 20 7b 21 5b 66 69 6c 65 20 65 78 69    if {![file exi
12530 73 74 73 20 24 64 69 72 65 63 74 6f 72 79 5d 20  sts $directory] 
12540 7c 7c 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  || \..          
12550 20 20 20 20 20 20 21 5b 66 69 6c 65 20 69 73 64        ![file isd
12560 69 72 65 63 74 6f 72 79 20 24 64 69 72 65 63 74  irectory $direct
12570 6f 72 79 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ory]} then {..  
12580 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20              #.. 
12590 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4e               # N
125a0 4f 54 45 3a 20 4a 75 73 74 20 70 72 69 6f 72 20  OTE: Just prior 
125b0 74 6f 20 61 63 74 75 61 6c 6c 79 20 68 61 6c 74  to actually halt
125c0 69 6e 67 20 74 68 65 20 74 65 73 74 69 6e 67 20  ing the testing 
125d0 70 72 6f 63 65 73 73 2c 0d 0a 20 20 20 20 20 20  process,..      
125e0 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
125f0 61 64 64 20 61 6e 20 65 72 72 6f 72 20 74 6f 20  add an error to 
12600 74 68 65 20 74 65 73 74 20 6c 6f 67 20 66 69 6c  the test log fil
12610 65 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  e...            
12620 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20    #..           
12630 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
12640 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  _channel [append
12650 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
12660 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
12670 63 6f 75 6c 64 20 6e 6f 74 20 76 65 72 69 66 79  could not verify
12680 20 62 75 69 6c 64 20 64 69 72 65 63 74 6f 72 79   build directory
12690 20 5c 22 22 20 24 64 69 72 65 63 74 6f 72 79 20   \"" $directory 
126a0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
126b0 20 20 20 20 20 22 5c 22 2c 20 61 6c 6c 20 74 65       "\", all te
126c0 73 74 69 6e 67 20 68 61 6c 74 65 64 5c 6e 22 5d  sting halted\n"]
126d0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
126e0 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20    #..           
126f0 20 20 20 23 20 4e 4f 54 45 3a 20 52 61 69 73 69     # NOTE: Raisi
12700 6e 67 20 61 20 73 63 72 69 70 74 20 65 72 72 6f  ng a script erro
12710 72 20 66 72 6f 6d 20 74 68 69 73 20 70 6f 69 6e  r from this poin
12720 74 20 73 68 6f 75 6c 64 20 68 61 6c 74 0d 0a 20  t should halt.. 
12730 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20 20               #  
12740 20 20 20 20 20 74 68 65 20 74 65 73 74 69 6e 67       the testing
12750 20 70 72 6f 63 65 73 73 2e 0d 0a 20 20 20 20 20   process...     
12760 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
12770 20 20 20 20 20 20 20 20 20 20 65 72 72 6f 72 20            error 
12780 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
12790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
127a0 20 22 63 6f 75 6c 64 20 6e 6f 74 20 76 65 72 69   "could not veri
127b0 66 79 20 62 75 69 6c 64 20 64 69 72 65 63 74 6f  fy build directo
127c0 72 79 20 5c 22 22 20 24 64 69 72 65 63 74 6f 72  ry \"" $director
127d0 79 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  y \..           
127e0 20 20 20 20 20 20 20 22 5c 22 2c 20 61 6c 6c 20         "\", all 
127f0 74 65 73 74 69 6e 67 20 68 61 6c 74 65 64 22 5d  testing halted"]
12800 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
12810 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  .          }....
12820 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
12830 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53         # NOTE: S
12840 6b 69 70 20 74 72 79 69 6e 67 20 74 6f 20 63 6f  kip trying to co
12850 70 79 20 61 6e 79 20 66 69 6c 65 73 20 69 66 20  py any files if 
12860 77 65 20 61 72 65 20 73 6f 20 69 6e 73 74 72 75  we are so instru
12870 63 74 65 64 2e 0d 0a 20 20 20 20 20 20 20 20 20  cted...         
12880 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66   #..          if
12890 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20   {![info exists 
128a0 3a 3a 6e 6f 28 63 6f 70 79 53 71 6c 69 74 65 46  ::no(copySqliteF
128b0 69 6c 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a  iles)]} then {..
128c0 20 20 20 20 20 20 20 20 20 20 20 20 74 72 79 43              tryC
128d0 6f 70 79 41 73 73 65 6d 62 6c 79 20 73 71 6c 69  opyAssembly sqli
128e0 74 65 33 2e 64 6c 6c 0d 0a 20 20 20 20 20 20 20  te3.dll..       
128f0 20 20 20 20 20 74 72 79 43 6f 70 79 41 73 73 65       tryCopyAsse
12900 6d 62 6c 79 20 53 51 4c 69 74 65 2e 49 6e 74 65  mbly SQLite.Inte
12910 72 6f 70 2e 64 6c 6c 0d 0a 20 20 20 20 20 20 20  rop.dll..       
12920 20 20 20 20 20 74 72 79 43 6f 70 79 41 73 73 65       tryCopyAsse
12930 6d 62 6c 79 20 53 79 73 74 65 6d 2e 44 61 74 61  mbly System.Data
12940 2e 53 51 4c 69 74 65 2e 64 6c 6c 0d 0a 20 20 20  .SQLite.dll..   
12950 20 20 20 20 20 20 20 20 20 74 72 79 43 6f 70 79           tryCopy
12960 41 73 73 65 6d 62 6c 79 20 53 79 73 74 65 6d 2e  Assembly System.
12970 44 61 74 61 2e 53 51 4c 69 74 65 2e 4c 69 6e 71  Data.SQLite.Linq
12980 2e 64 6c 6c 0d 0a 20 20 20 20 20 20 20 20 20 20  .dll..          
12990 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 23  }....          #
129a0 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f  ..          # NO
129b0 54 45 3a 20 53 6b 69 70 20 74 72 79 69 6e 67 20  TE: Skip trying 
129c0 74 6f 20 6c 6f 61 64 20 61 6e 79 20 66 69 6c 65  to load any file
129d0 73 20 69 66 20 77 65 20 61 72 65 20 73 6f 20 69  s if we are so i
129e0 6e 73 74 72 75 63 74 65 64 2e 0d 0a 20 20 20 20  nstructed...    
129f0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
12a00 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78     if {![info ex
12a10 69 73 74 73 20 3a 3a 6e 6f 28 6c 6f 61 64 53 71  ists ::no(loadSq
12a20 6c 69 74 65 46 69 6c 65 73 29 5d 7d 20 74 68 65  liteFiles)]} the
12a30 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
12a40 20 74 72 79 4c 6f 61 64 41 73 73 65 6d 62 6c 79   tryLoadAssembly
12a50 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c   System.Data.SQL
12a60 69 74 65 2e 64 6c 6c 0d 0a 20 20 20 20 20 20 20  ite.dll..       
12a70 20 20 20 20 20 74 72 79 4c 6f 61 64 41 73 73 65       tryLoadAsse
12a80 6d 62 6c 79 20 53 79 73 74 65 6d 2e 44 61 74 61  mbly System.Data
12a90 2e 53 51 4c 69 74 65 2e 4c 69 6e 71 2e 64 6c 6c  .SQLite.Linq.dll
12aa0 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d  ..          }...
12ab0 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
12ac0 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
12ad0 53 6b 69 70 20 74 72 79 69 6e 67 20 74 6f 20 64  Skip trying to d
12ae0 65 6c 65 74 65 20 65 78 74 65 72 6e 61 6c 20 66  elete external f
12af0 69 6c 65 73 20 69 66 20 77 65 20 61 72 65 20 73  iles if we are s
12b00 6f 20 69 6e 73 74 72 75 63 74 65 64 2e 0d 0a 20  o instructed... 
12b10 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
12b20 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f        if {![info
12b30 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 64 65 6c   exists ::no(del
12b40 65 74 65 53 71 6c 69 74 65 45 78 74 65 72 6e 61  eteSqliteExterna
12b50 6c 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e 20 7b  lFiles)]} then {
12b60 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 72  ..            tr
12b70 79 44 65 6c 65 74 65 42 75 69 6c 64 46 69 6c 65  yDeleteBuildFile
12b80 20 49 6e 73 74 61 6c 6c 65 72 2e 65 78 65 2e 6d   Installer.exe.m
12b90 64 61 2e 63 6f 6e 66 69 67 0d 0a 20 20 20 20 20  da.config..     
12ba0 20 20 20 20 20 20 20 74 72 79 44 65 6c 65 74 65         tryDelete
12bb0 42 75 69 6c 64 46 69 6c 65 20 74 65 73 74 2e 65  BuildFile test.e
12bc0 78 65 2e 6d 64 61 2e 63 6f 6e 66 69 67 0d 0a 20  xe.mda.config.. 
12bd0 20 20 20 20 20 20 20 20 20 20 20 74 72 79 44 65             tryDe
12be0 6c 65 74 65 42 75 69 6c 64 46 69 6c 65 20 74 65  leteBuildFile te
12bf0 73 74 6c 69 6e 71 2e 65 78 65 2e 6d 64 61 2e 63  stlinq.exe.mda.c
12c00 6f 6e 66 69 67 0d 0a 20 20 20 20 20 20 20 20 20  onfig..         
12c10 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   }....          
12c20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e  #..          # N
12c30 4f 54 45 3a 20 53 6b 69 70 20 74 72 79 69 6e 67  OTE: Skip trying
12c40 20 74 6f 20 63 6f 70 79 20 65 78 74 65 72 6e 61   to copy externa
12c50 6c 20 66 69 6c 65 73 20 69 66 20 77 65 20 61 72  l files if we ar
12c60 65 20 73 6f 20 69 6e 73 74 72 75 63 74 65 64 2e  e so instructed.
12c70 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20  ..          #.. 
12c80 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69           if {![i
12c90 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28  nfo exists ::no(
12ca0 63 6f 70 79 53 71 6c 69 74 65 45 78 74 65 72 6e  copySqliteExtern
12cb0 61 6c 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e 20  alFiles)]} then 
12cc0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23  {..            #
12cd0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 20  ..            # 
12ce0 4e 4f 54 45 3a 20 43 6f 70 79 20 74 68 65 20 4d  NOTE: Copy the M
12cf0 44 41 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  DA configuration
12d00 20 66 69 6c 65 20 66 6f 72 20 74 68 65 20 45 61   file for the Ea
12d10 67 6c 65 20 73 68 65 6c 6c 20 74 6f 20 74 68 65  gle shell to the
12d20 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 20  ..            # 
12d30 20 20 20 20 20 20 62 75 69 6c 64 20 6f 75 74 70        build outp
12d40 75 74 20 64 69 72 65 63 74 6f 72 79 3b 20 68 6f  ut directory; ho
12d50 77 65 76 65 72 2c 20 75 73 65 20 74 68 65 20 6e  wever, use the n
12d60 61 6d 65 20 6f 66 20 74 68 65 20 6c 65 67 61 63  ame of the legac
12d70 79 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23  y..            #
12d80 20 20 20 20 20 20 20 74 65 73 74 20 65 78 65 63         test exec
12d90 75 74 61 62 6c 65 2e 20 20 54 68 69 73 20 77 69  utable.  This wi
12da0 6c 6c 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61  ll make sure tha
12db0 74 20 74 68 65 20 6c 65 67 61 63 79 20 74 65 73  t the legacy tes
12dc0 74 73 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ts..            
12dd0 23 20 20 20 20 20 20 20 72 75 6e 20 77 69 74 68  #       run with
12de0 20 74 68 65 20 73 61 6d 65 20 73 65 74 20 6f 66   the same set of
12df0 20 4d 44 41 73 20 63 6f 6e 66 69 67 75 72 65 64   MDAs configured
12e00 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23  ...            #
12e10 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 72  ..            tr
12e20 79 43 6f 70 79 42 69 6e 61 72 79 46 69 6c 65 20  yCopyBinaryFile 
12e30 45 61 67 6c 65 53 68 65 6c 6c 2e 65 78 65 2e 6d  EagleShell.exe.m
12e40 64 61 2e 63 6f 6e 66 69 67 20 49 6e 73 74 61 6c  da.config Instal
12e50 6c 65 72 2e 65 78 65 2e 6d 64 61 2e 63 6f 6e 66  ler.exe.mda.conf
12e60 69 67 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ig..            
12e70 74 72 79 43 6f 70 79 42 69 6e 61 72 79 46 69 6c  tryCopyBinaryFil
12e80 65 20 45 61 67 6c 65 53 68 65 6c 6c 2e 65 78 65  e EagleShell.exe
12e90 2e 6d 64 61 2e 63 6f 6e 66 69 67 20 74 65 73 74  .mda.config test
12ea0 2e 65 78 65 2e 6d 64 61 2e 63 6f 6e 66 69 67 0d  .exe.mda.config.
12eb0 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 72 79  .            try
12ec0 43 6f 70 79 42 69 6e 61 72 79 46 69 6c 65 20 45  CopyBinaryFile E
12ed0 61 67 6c 65 53 68 65 6c 6c 2e 65 78 65 2e 6d 64  agleShell.exe.md
12ee0 61 2e 63 6f 6e 66 69 67 20 74 65 73 74 6c 69 6e  a.config testlin
12ef0 71 2e 65 78 65 2e 6d 64 61 2e 63 6f 6e 66 69 67  q.exe.mda.config
12f00 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20  ..          }.. 
12f10 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
12f20 20 20 20 20 63 61 74 63 68 20 7b 0d 0a 20 20 20      catch {..   
12f30 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
12f40 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70  test_channel [ap
12f50 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
12f60 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
12f70 66 69 6c 65 20 76 65 72 73 69 6f 6e 20 6f 66 20  file version of 
12f80 5c 22 73 71 6c 69 74 65 33 2e 64 6c 6c 5c 22 2e  \"sqlite3.dll\".
12f90 2e 2e 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20  .. " \..        
12fa0 20 20 20 20 20 20 5b 66 69 6c 65 20 76 65 72 73        [file vers
12fb0 69 6f 6e 20 5b 67 65 74 42 69 6e 61 72 79 46 69  ion [getBinaryFi
12fc0 6c 65 4e 61 6d 65 20 73 71 6c 69 74 65 33 2e 64  leName sqlite3.d
12fd0 6c 6c 5d 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20 20  ll]] \n]..      
12fe0 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 63    }....        c
12ff0 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20  atch {..        
13000 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
13010 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
13020 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
13030 20 20 20 20 20 22 2d 2d 2d 2d 20 66 69 6c 65 20       "---- file 
13040 76 65 72 73 69 6f 6e 20 6f 66 20 5c 22 53 51 4c  version of \"SQL
13050 69 74 65 2e 49 6e 74 65 72 6f 70 2e 64 6c 6c 5c  ite.Interop.dll\
13060 22 2e 2e 2e 20 22 20 5c 0d 0a 20 20 20 20 20 20  "... " \..      
13070 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20 76 65          [file ve
13080 72 73 69 6f 6e 20 5b 67 65 74 42 69 6e 61 72 79  rsion [getBinary
13090 46 69 6c 65 4e 61 6d 65 20 53 51 4c 69 74 65 2e  FileName SQLite.
130a0 49 6e 74 65 72 6f 70 2e 64 6c 6c 5d 5d 20 5c 6e  Interop.dll]] \n
130b0 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  ]..        }....
130c0 20 20 20 20 20 20 20 20 63 61 74 63 68 20 7b 0d          catch {.
130d0 0a 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73  .          tputs
130e0 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
130f0 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
13100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d                "-
13110 2d 2d 2d 20 66 69 6c 65 20 76 65 72 73 69 6f 6e  --- file version
13120 20 6f 66 20 5c 22 53 79 73 74 65 6d 2e 44 61 74   of \"System.Dat
13130 61 2e 53 51 4c 69 74 65 2e 64 6c 6c 5c 22 2e 2e  a.SQLite.dll\"..
13140 2e 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  . " \..         
13150 20 20 20 20 20 5b 66 69 6c 65 20 76 65 72 73 69       [file versi
13160 6f 6e 20 5b 67 65 74 42 69 6e 61 72 79 46 69 6c  on [getBinaryFil
13170 65 4e 61 6d 65 20 53 79 73 74 65 6d 2e 44 61 74  eName System.Dat
13180 61 2e 53 51 4c 69 74 65 2e 64 6c 6c 5d 5d 20 5c  a.SQLite.dll]] \
13190 6e 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d  n]..        }...
131a0 0a 20 20 20 20 20 20 20 20 63 61 74 63 68 20 7b  .        catch {
131b0 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70 75 74  ..          tput
131c0 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
131d0 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
131e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22  .              "
131f0 2d 2d 2d 2d 20 66 69 6c 65 20 76 65 72 73 69 6f  ---- file versio
13200 6e 20 6f 66 20 5c 22 53 79 73 74 65 6d 2e 44 61  n of \"System.Da
13210 74 61 2e 53 51 4c 69 74 65 2e 4c 69 6e 71 2e 64  ta.SQLite.Linq.d
13220 6c 6c 5c 22 2e 2e 2e 20 22 20 5c 0d 0a 20 20 20  ll\"... " \..   
13230 20 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65             [file
13240 20 76 65 72 73 69 6f 6e 20 5b 67 65 74 42 69 6e   version [getBin
13250 61 72 79 46 69 6c 65 4e 61 6d 65 20 53 79 73 74  aryFileName Syst
13260 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 4c  em.Data.SQLite.L
13270 69 6e 71 2e 64 6c 6c 5d 5d 20 5c 6e 5d 0d 0a 20  inq.dll]] \n].. 
13280 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
13290 20 20 20 20 73 65 74 20 61 73 73 65 6d 62 6c 69      set assembli
132a0 65 73 20 5b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b  es [object invok
132b0 65 20 41 70 70 44 6f 6d 61 69 6e 2e 43 75 72 72  e AppDomain.Curr
132c0 65 6e 74 44 6f 6d 61 69 6e 20 47 65 74 41 73 73  entDomain GetAss
132d0 65 6d 62 6c 69 65 73 5d 0d 0a 0d 0a 20 20 20 20  emblies]....    
132e0 20 20 20 20 6f 62 6a 65 63 74 20 66 6f 72 65 61      object forea
132f0 63 68 20 61 73 73 65 6d 62 6c 79 20 24 61 73 73  ch assembly $ass
13300 65 6d 62 6c 69 65 73 20 7b 0d 0a 20 20 20 20 20  emblies {..     
13310 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67       if {[string
13320 20 6d 61 74 63 68 20 5c 7b 53 79 73 74 65 6d 2e   match \{System.
13330 44 61 74 61 2e 53 51 4c 69 74 65 2a 20 24 61 73  Data.SQLite* $as
13340 73 65 6d 62 6c 79 5d 7d 20 74 68 65 6e 20 7b 0d  sembly]} then {.
13350 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75  .            tpu
13360 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
13370 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
13380 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
13390 20 20 22 2d 2d 2d 2d 20 66 6f 75 6e 64 20 61 73    "---- found as
133a0 73 65 6d 62 6c 79 3a 20 22 20 24 61 73 73 65 6d  sembly: " $assem
133b0 62 6c 79 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20  bly \n]..       
133c0 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d     }..        }.
133d0 0a 0d 0a 20 20 20 20 20 20 20 20 63 61 74 63 68  ...        catch
133e0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70   {..          tp
133f0 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  uts $::test_chan
13400 6e 65 6c 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  nel \..         
13410 20 20 20 20 20 22 2d 2d 2d 2d 20 64 65 66 69 6e       "---- defin
13420 65 20 63 6f 6e 73 74 61 6e 74 73 20 66 6f 72 20  e constants for 
13430 5c 22 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51  \"System.Data.SQ
13440 4c 69 74 65 5c 22 2e 2e 2e 20 22 0d 0a 0d 0a 20  Lite\"... ".... 
13450 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61           if {[ca
13460 74 63 68 20 7b 6f 62 6a 65 63 74 20 69 6e 76 6f  tch {object invo
13470 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75  ke -flags +NonPu
13480 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20 20 20  blic \..        
13490 20 20 20 20 20 20 20 20 20 20 53 79 73 74 65 6d            System
134a0 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 53 51 4c  .Data.SQLite.SQL
134b0 69 74 65 33 20 44 65 66 69 6e 65 43 6f 6e 73 74  ite3 DefineConst
134c0 61 6e 74 73 7d 20 5c 0d 0a 20 20 20 20 20 20 20  ants} \..       
134d0 20 20 20 20 20 20 20 20 20 20 20 64 65 66 69 6e             defin
134e0 65 43 6f 6e 73 74 61 6e 74 73 5d 20 3d 3d 20 30  eConstants] == 0
134f0 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
13500 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
13510 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70  est_channel [app
13520 65 6e 64 41 72 67 73 20 5b 66 6f 72 6d 61 74 4c  endArgs [formatL
13530 69 73 74 20 5b 6c 73 6f 72 74 20 5c 0d 0a 20 20  ist [lsort \..  
13540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 24 64                $d
13550 65 66 69 6e 65 43 6f 6e 73 74 61 6e 74 73 5d 20  efineConstants] 
13560 3c 6e 6f 6e 65 3e 5d 20 5c 6e 5d 0d 0a 20 20 20  <none>] \n]..   
13570 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d         } else {.
13580 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75  .            tpu
13590 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
135a0 65 6c 20 75 6e 6b 6e 6f 77 6e 5c 6e 0d 0a 20 20  el unknown\n..  
135b0 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
135c0 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
135d0 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20  catch {..       
135e0 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
135f0 5f 63 68 61 6e 6e 65 6c 20 5c 0d 0a 20 20 20 20  _channel \..    
13600 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
13610 73 6f 75 72 63 65 20 76 65 72 73 69 6f 6e 20 6f  source version o
13620 66 20 5c 22 53 79 73 74 65 6d 2e 44 61 74 61 2e  f \"System.Data.
13630 53 51 4c 69 74 65 2e 64 6c 6c 5c 22 2e 2e 2e 20  SQLite.dll\"... 
13640 22 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 69  "....          i
13650 66 20 7b 5b 63 61 74 63 68 20 7b 6f 62 6a 65 63  f {[catch {objec
13660 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20  t invoke -flags 
13670 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20  +NonPublic \..  
13680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13690 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
136a0 74 65 2e 53 51 4c 69 74 65 43 6f 6e 6e 65 63 74  te.SQLiteConnect
136b0 69 6f 6e 20 50 72 6f 76 69 64 65 72 56 65 72 73  ion ProviderVers
136c0 69 6f 6e 7d 20 5c 0d 0a 20 20 20 20 20 20 20 20  ion} \..        
136d0 20 20 20 20 20 20 20 20 20 20 76 65 72 73 69 6f            versio
136e0 6e 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d  n] == 0} then {.
136f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20  .            if 
13700 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20  {[string length 
13710 24 76 65 72 73 69 6f 6e 5d 20 3d 3d 20 30 7d 20  $version] == 0} 
13720 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
13730 20 20 20 20 20 20 73 65 74 20 76 65 72 73 69 6f        set versio
13740 6e 20 6e 75 6c 6c 0d 0a 20 20 20 20 20 20 20 20  n null..        
13750 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
13760 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
13770 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  _channel [append
13780 41 72 67 73 20 24 76 65 72 73 69 6f 6e 20 5c 6e  Args $version \n
13790 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 20 65  ]..          } e
137a0 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  lse {..         
137b0 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
137c0 5f 63 68 61 6e 6e 65 6c 20 75 6e 6b 6e 6f 77 6e  _channel unknown
137d0 5c 6e 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d  \n..          }.
137e0 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  .        }....  
137f0 20 20 20 20 20 20 63 61 74 63 68 20 7b 0d 0a 20        catch {.. 
13800 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
13810 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5c  ::test_channel \
13820 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
13830 22 2d 2d 2d 2d 20 73 6f 75 72 63 65 20 63 68 65  "---- source che
13840 63 6b 6f 75 74 20 6f 66 20 5c 22 53 79 73 74 65  ckout of \"Syste
13850 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 64 6c  m.Data.SQLite.dl
13860 6c 5c 22 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20  l\"... "....    
13870 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68        if {[catch
13880 20 7b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20   {object invoke 
13890 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69  -flags +NonPubli
138a0 63 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  c \..           
138b0 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61         System.Da
138c0 74 61 2e 53 51 4c 69 74 65 2e 53 51 4c 69 74 65  ta.SQLite.SQLite
138d0 43 6f 6e 6e 65 63 74 69 6f 6e 20 50 72 6f 76 69  Connection Provi
138e0 64 65 72 53 6f 75 72 63 65 49 64 7d 20 5c 0d 0a  derSourceId} \..
138f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13900 20 20 73 6f 75 72 63 65 49 64 5d 20 3d 3d 20 30    sourceId] == 0
13910 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
13920 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e        if {[strin
13930 67 20 6c 65 6e 67 74 68 20 24 73 6f 75 72 63 65  g length $source
13940 49 64 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b  Id] == 0} then {
13950 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
13960 73 65 74 20 73 6f 75 72 63 65 49 64 20 6e 75 6c  set sourceId nul
13970 6c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  l..            }
13980 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70  ..            tp
13990 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  uts $::test_chan
139a0 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
139b0 24 73 6f 75 72 63 65 49 64 20 5c 6e 5d 0d 0a 20  $sourceId \n].. 
139c0 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20           } else 
139d0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  {..            t
139e0 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
139f0 6e 6e 65 6c 20 75 6e 6b 6e 6f 77 6e 5c 6e 0d 0a  nnel unknown\n..
13a00 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
13a10 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
13a20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
13a30 4f 54 45 3a 20 43 68 65 63 6b 20 74 68 65 20 61  OTE: Check the a
13a40 76 61 69 6c 61 62 6c 65 20 62 75 69 6c 64 73 20  vailable builds 
13a50 28 61 6e 64 20 22 72 65 6c 65 61 73 65 73 22 29  (and "releases")
13a60 20 6f 66 20 53 51 4c 69 74 65 20 61 6e 64 0d 0a   of SQLite and..
13a70 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
13a80 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
13a90 74 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  te...        #..
13aa0 20 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72          checkFor
13ab0 53 51 4c 69 74 65 42 75 69 6c 64 73 20 24 3a 3a  SQLiteBuilds $::
13ac0 74 65 73 74 5f 63 68 61 6e 6e 65 6c 0d 0a 20 20  test_channel..  
13ad0 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72 53 51        checkForSQ
13ae0 4c 69 74 65 52 65 6c 65 61 73 65 73 20 24 3a 3a  LiteReleases $::
13af0 74 65 73 74 5f 63 68 61 6e 6e 65 6c 0d 0a 0d 0a  test_channel....
13b00 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
13b10 20 20 20 23 20 4e 4f 54 45 3a 20 4e 6f 77 2c 20     # NOTE: Now, 
13b20 77 65 20 6e 65 65 64 20 74 6f 20 6b 6e 6f 77 20  we need to know 
13b30 69 66 20 74 68 65 20 53 51 4c 69 74 65 20 63 6f  if the SQLite co
13b40 72 65 20 6c 69 62 72 61 72 79 20 69 73 20 61 76  re library is av
13b50 61 69 6c 61 62 6c 65 0d 0a 20 20 20 20 20 20 20  ailable..       
13b60 20 23 20 20 20 20 20 20 20 28 69 2e 65 2e 20 62   #       (i.e. b
13b70 65 63 61 75 73 65 20 74 68 65 20 6d 61 6e 61 67  ecause the manag
13b80 65 64 2d 6f 6e 6c 79 20 53 79 73 74 65 6d 2e 44  ed-only System.D
13b90 61 74 61 2e 53 51 4c 69 74 65 20 61 73 73 65 6d  ata.SQLite assem
13ba0 62 6c 79 20 63 61 6e 0d 0a 20 20 20 20 20 20 20  bly can..       
13bb0 20 23 20 20 20 20 20 20 20 6c 6f 61 64 20 77 69   #       load wi
13bc0 74 68 6f 75 74 20 69 74 3b 20 68 6f 77 65 76 65  thout it; howeve
13bd0 72 2c 20 69 74 20 63 61 6e 6e 6f 74 20 64 6f 20  r, it cannot do 
13be0 61 6e 79 74 68 69 6e 67 20 75 73 65 66 75 6c 20  anything useful 
13bf0 77 69 74 68 6f 75 74 0d 0a 20 20 20 20 20 20 20  without..       
13c00 20 23 20 20 20 20 20 20 20 69 74 29 2e 20 20 49   #       it).  I
13c10 66 20 77 65 20 61 72 65 20 75 73 69 6e 67 20 74  f we are using t
13c20 68 65 20 6d 69 78 65 64 2d 6d 6f 64 65 20 61 73  he mixed-mode as
13c30 73 65 6d 62 6c 79 20 61 6e 64 20 77 65 20 61 6c  sembly and we al
13c40 72 65 61 64 79 0d 0a 20 20 20 20 20 20 20 20 23  ready..        #
13c50 20 20 20 20 20 20 20 66 6f 75 6e 64 20 69 74 20         found it 
13c60 28 61 62 6f 76 65 29 2c 20 74 68 69 73 20 73 68  (above), this sh
13c70 6f 75 6c 64 20 61 6c 77 61 79 73 20 73 75 63 63  ould always succ
13c80 65 65 64 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  eed...        #.
13c90 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f  .        checkFo
13ca0 72 53 51 4c 69 74 65 4c 69 62 72 61 72 79 20 24  rSQLiteLibrary $
13cb0 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 0d 0a  ::test_channel..
13cc0 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
13cd0 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68 65       # NOTE: Che
13ce0 63 6b 20 69 66 20 74 68 65 20 53 51 4c 69 74 65  ck if the SQLite
13cf0 20 69 6e 74 65 72 6f 70 20 61 73 73 65 6d 62 6c   interop assembl
13d00 79 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2e 0d  y is available..
13d10 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
13d20 20 20 20 20 63 68 65 63 6b 46 6f 72 53 51 4c 69      checkForSQLi
13d30 74 65 49 6e 74 65 72 6f 70 20 24 3a 3a 74 65 73  teInterop $::tes
13d40 74 5f 63 68 61 6e 6e 65 6c 0d 0a 0d 0a 20 20 20  t_channel....   
13d50 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
13d60 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 74 68  # NOTE: Check th
13d70 65 20 53 51 4c 69 74 65 20 64 61 74 61 62 61 73  e SQLite databas
13d80 65 20 61 6e 64 20 74 65 6d 70 6f 72 61 72 79 20  e and temporary 
13d90 64 69 72 65 63 74 6f 72 69 65 73 2e 0d 0a 20 20  directories...  
13da0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
13db0 20 63 68 65 63 6b 46 6f 72 53 51 4c 69 74 65 44   checkForSQLiteD
13dc0 69 72 65 63 74 6f 72 69 65 73 20 24 3a 3a 74 65  irectories $::te
13dd0 73 74 5f 63 68 61 6e 6e 65 6c 0d 0a 0d 0a 20 20  st_channel....  
13de0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
13df0 20 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74   # NOTE: Attempt
13e00 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 69 66   to determine if
13e10 20 76 61 72 69 6f 75 73 20 63 6f 6d 70 69 6c 65   various compile
13e20 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 73 20 6e 65  -time options ne
13e30 65 64 65 64 20 66 6f 72 0d 0a 20 20 20 20 20 20  eded for..      
13e40 20 20 23 20 20 20 20 20 20 20 74 65 73 74 20 63    #       test c
13e50 6f 6e 73 74 72 61 69 6e 74 73 20 77 65 72 65 20  onstraints were 
13e60 65 6e 61 62 6c 65 64 20 66 6f 72 20 74 68 65 20  enabled for the 
13e70 6d 61 6e 61 67 65 64 20 61 73 73 65 6d 62 6c 79  managed assembly
13e80 2e 20 20 54 68 65 72 65 0d 0a 20 20 20 20 20 20  .  There..      
13e90 20 20 23 20 20 20 20 20 20 20 61 72 65 20 73 6f    #       are so
13ea0 6d 65 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20  me compile-time 
13eb0 6f 70 74 69 6f 6e 73 20 74 68 61 74 20 6d 75 73  options that mus
13ec0 74 20 61 6c 73 6f 20 68 61 76 65 20 62 65 65 6e  t also have been
13ed0 20 65 6e 61 62 6c 65 64 0d 0a 20 20 20 20 20 20   enabled..      
13ee0 20 20 23 20 20 20 20 20 20 20 66 6f 72 20 74 68    #       for th
13ef0 65 20 69 6e 74 65 72 6f 70 20 61 73 73 65 6d 62  e interop assemb
13f00 6c 79 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 62  ly in order to b
13f10 65 20 65 66 66 65 63 74 69 76 65 2e 20 20 46 6f  e effective.  Fo
13f20 72 20 74 68 6f 73 65 0d 0a 20 20 20 20 20 20 20  r those..       
13f30 20 23 20 20 20 20 20 20 20 6f 70 74 69 6f 6e 73   #       options
13f40 2c 20 69 74 20 77 69 6c 6c 20 62 65 20 61 73 73  , it will be ass
13f50 75 6d 65 64 20 74 68 61 74 20 69 74 20 77 61 73  umed that it was
13f60 20 65 6e 61 62 6c 65 64 20 66 6f 72 20 74 68 65   enabled for the
13f70 20 69 6e 74 65 72 6f 70 0d 0a 20 20 20 20 20 20   interop..      
13f80 20 20 23 20 20 20 20 20 20 20 61 73 73 65 6d 62    #       assemb
13f90 6c 79 20 69 66 20 69 74 20 77 61 73 20 65 6e 61  ly if it was ena
13fa0 62 6c 65 64 20 66 6f 72 20 74 68 65 20 6d 61 6e  bled for the man
13fb0 61 67 65 64 20 61 73 73 65 6d 62 6c 79 2e 0d 0a  aged assembly...
13fc0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
13fd0 20 20 20 66 6f 72 65 61 63 68 20 64 65 66 69 6e     foreach defin
13fe0 65 43 6f 6e 73 74 61 6e 74 20 5b 6c 69 73 74 20  eConstant [list 
13ff0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 43  \..            C
14000 48 45 43 4b 5f 53 54 41 54 45 20 43 4f 55 4e 54  HECK_STATE COUNT
14010 5f 48 41 4e 44 4c 45 20 44 45 42 55 47 20 49 4e  _HANDLE DEBUG IN
14020 54 45 52 4f 50 5f 43 4f 44 45 43 20 49 4e 54 45  TEROP_CODEC INTE
14030 52 4f 50 5f 44 45 42 55 47 20 5c 0d 0a 20 20 20  ROP_DEBUG \..   
14040 20 20 20 20 20 20 20 20 20 49 4e 54 45 52 4f 50           INTEROP
14050 5f 45 58 54 45 4e 53 49 4f 4e 5f 46 55 4e 43 54  _EXTENSION_FUNCT
14060 49 4f 4e 53 20 49 4e 54 45 52 4f 50 5f 4c 45 47  IONS INTEROP_LEG
14070 41 43 59 5f 43 4c 4f 53 45 20 49 4e 54 45 52 4f  ACY_CLOSE INTERO
14080 50 5f 4c 4f 47 20 5c 0d 0a 20 20 20 20 20 20 20  P_LOG \..       
14090 20 20 20 20 20 49 4e 54 45 52 4f 50 5f 54 45 53       INTEROP_TES
140a0 54 5f 45 58 54 45 4e 53 49 4f 4e 20 49 4e 54 45  T_EXTENSION INTE
140b0 52 4f 50 5f 56 49 52 54 55 41 4c 5f 54 41 42 4c  ROP_VIRTUAL_TABL
140c0 45 20 4e 45 54 5f 32 30 20 4e 45 54 5f 33 35 20  E NET_20 NET_35 
140d0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 4e  \..            N
140e0 45 54 5f 34 30 20 4e 45 54 5f 34 35 20 4e 45 54  ET_40 NET_45 NET
140f0 5f 43 4f 4d 50 41 43 54 5f 32 30 20 50 4c 41 54  _COMPACT_20 PLAT
14100 46 4f 52 4d 5f 43 4f 4d 50 41 43 54 46 52 41 4d  FORM_COMPACTFRAM
14110 45 57 4f 52 4b 20 5c 0d 0a 20 20 20 20 20 20 20  EWORK \..       
14120 20 20 20 20 20 50 52 45 4c 4f 41 44 5f 4e 41 54       PRELOAD_NAT
14130 49 56 45 5f 4c 49 42 52 41 52 59 20 52 45 54 41  IVE_LIBRARY RETA
14140 52 47 45 54 41 42 4c 45 20 53 51 4c 49 54 45 5f  RGETABLE SQLITE_
14150 53 54 41 4e 44 41 52 44 20 5c 0d 0a 20 20 20 20  STANDARD \..    
14160 20 20 20 20 20 20 20 20 54 48 52 4f 57 5f 4f 4e          THROW_ON
14170 5f 44 49 53 50 4f 53 45 44 20 54 52 41 43 45 20  _DISPOSED TRACE 
14180 54 52 41 43 45 5f 43 4f 4e 4e 45 43 54 49 4f 4e  TRACE_CONNECTION
14190 20 54 52 41 43 45 5f 48 41 4e 44 4c 45 20 5c 0d   TRACE_HANDLE \.
141a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 54 52 41  .            TRA
141b0 43 45 5f 50 52 45 4c 4f 41 44 20 54 52 41 43 45  CE_PRELOAD TRACE
141c0 5f 53 54 41 54 45 4d 45 4e 54 20 54 52 41 43 45  _STATEMENT TRACE
141d0 5f 57 41 52 4e 49 4e 47 20 54 52 41 43 4b 5f 4d  _WARNING TRACK_M
141e0 45 4d 4f 52 59 5f 42 59 54 45 53 20 5c 0d 0a 20  EMORY_BYTES \.. 
141f0 20 20 20 20 20 20 20 20 20 20 20 55 53 45 5f 49             USE_I
14200 4e 54 45 52 4f 50 5f 44 4c 4c 20 55 53 45 5f 50  NTEROP_DLL USE_P
14210 52 45 50 41 52 45 5f 56 32 20 57 49 4e 44 4f 57  REPARE_V2 WINDOW
14220 53 5d 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  S] {..          
14230 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e  #..          # N
14240 4f 54 45 3a 20 43 68 65 63 6b 20 69 66 20 74 68  OTE: Check if th
14250 65 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f  e compile-time o
14260 70 74 69 6f 6e 20 69 73 20 6c 69 73 74 65 64 20  ption is listed 
14270 69 6e 20 74 68 65 20 6c 69 73 74 20 6f 66 0d 0a  in the list of..
14280 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20            #     
14290 20 20 22 64 65 66 69 6e 65 20 63 6f 6e 73 74 61    "define consta
142a0 6e 74 73 22 20 6b 65 70 74 20 74 72 61 63 6b 20  nts" kept track 
142b0 6f 66 20 62 79 20 74 68 65 20 6d 61 6e 61 67 65  of by the manage
142c0 64 20 61 73 73 65 6d 62 6c 79 2e 0d 0a 20 20 20  d assembly...   
142d0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
142e0 20 20 20 20 63 68 65 63 6b 46 6f 72 53 51 4c 69      checkForSQLi
142f0 74 65 44 65 66 69 6e 65 43 6f 6e 73 74 61 6e 74  teDefineConstant
14300 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
14310 20 24 64 65 66 69 6e 65 43 6f 6e 73 74 61 6e 74   $defineConstant
14320 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  ..        }.... 
14330 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
14340 20 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20    # NOTE: Check 
14350 74 68 65 20 63 75 72 72 65 6e 74 20 62 75 69 6c  the current buil
14360 64 20 79 65 61 72 2e 20 20 42 61 73 69 63 61 6c  d year.  Basical
14370 6c 79 2c 20 74 68 69 73 20 69 6e 64 69 63 61 74  ly, this indicat
14380 65 73 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  es..        #   
14390 20 20 20 20 77 68 69 63 68 20 76 65 72 73 69 6f      which versio
143a0 6e 20 6f 66 20 4d 53 42 75 69 6c 64 20 61 6e 64  n of MSBuild and
143b0 2f 6f 72 20 56 69 73 75 61 6c 20 53 74 75 64 69  /or Visual Studi
143c0 6f 20 77 61 73 20 75 73 65 64 20 74 6f 0d 0a 20  o was used to.. 
143d0 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63         #       c
143e0 6f 6d 70 69 6c 65 20 74 68 65 20 61 73 73 65 6d  ompile the assem
143f0 62 6c 79 20 62 69 6e 61 72 69 65 73 20 75 6e 64  bly binaries und
14400 65 72 20 74 65 73 74 2e 0d 0a 20 20 20 20 20 20  er test...      
14410 20 20 23 0d 0a 20 20 20 20 20 20 20 20 74 70 75    #..        tpu
14420 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
14430 65 6c 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  el \..          
14440 20 20 22 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e 67    "---- checking
14450 20 66 6f 72 20 53 79 73 74 65 6d 2e 44 61 74 61   for System.Data
14460 2e 53 51 4c 69 74 65 20 62 75 69 6c 64 20 79 65  .SQLite build ye
14470 61 72 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 20  ar... "....     
14480 20 20 20 73 65 74 20 79 65 61 72 20 5b 67 65 74     set year [get
14490 42 75 69 6c 64 59 65 61 72 5d 0d 0a 20 20 20 20  BuildYear]..    
144a0 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e      addConstrain
144b0 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20 62 75  t [appendArgs bu
144c0 69 6c 64 59 65 61 72 2e 20 24 79 65 61 72 5d 0d  ildYear. $year].
144d0 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24  .        tputs $
144e0 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b  ::test_channel [
144f0 61 70 70 65 6e 64 41 72 67 73 20 5c 22 20 24 79  appendArgs \" $y
14500 65 61 72 20 5c 22 5c 6e 5d 0d 0a 0d 0a 20 20 20  ear \"\n]....   
14510 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
14520 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 74 68  # NOTE: Check th
14530 65 20 63 75 72 72 65 6e 74 20 62 75 69 6c 64 20  e current build 
14540 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e 20 20  configuration.  
14550 54 68 69 73 20 73 68 6f 75 6c 64 20 6e 6f 72 6d  This should norm
14560 61 6c 6c 79 0d 0a 20 20 20 20 20 20 20 20 23 20  ally..        # 
14570 20 20 20 20 20 20 62 65 20 65 69 74 68 65 72 20        be either 
14580 22 44 65 62 75 67 22 20 6f 72 20 22 52 65 6c 65  "Debug" or "Rele
14590 61 73 65 22 2e 0d 0a 20 20 20 20 20 20 20 20 23  ase"...        #
145a0 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20  ..        tputs 
145b0 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
145c0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22  \..            "
145d0 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e 67 20 66 6f  ---- checking fo
145e0 72 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51  r System.Data.SQ
145f0 4c 69 74 65 20 62 75 69 6c 64 20 63 6f 6e 66 69  Lite build confi
14600 67 75 72 61 74 69 6f 6e 2e 2e 2e 20 22 0d 0a 0d  guration... "...
14610 0a 20 20 20 20 20 20 20 20 73 65 74 20 63 6f 6e  .        set con
14620 66 69 67 75 72 61 74 69 6f 6e 20 5b 67 65 74 42  figuration [getB
14630 75 69 6c 64 43 6f 6e 66 69 67 75 72 61 74 69 6f  uildConfiguratio
14640 6e 5d 0d 0a 20 20 20 20 20 20 20 20 61 64 64 43  n]..        addC
14650 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e  onstraint [appen
14660 64 41 72 67 73 20 62 75 69 6c 64 43 6f 6e 66 69  dArgs buildConfi
14670 67 75 72 61 74 69 6f 6e 2e 20 24 63 6f 6e 66 69  guration. $confi
14680 67 75 72 61 74 69 6f 6e 5d 0d 0a 20 20 20 20 20  guration]..     
14690 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
146a0 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  _channel [append
146b0 41 72 67 73 20 5c 22 20 24 63 6f 6e 66 69 67 75  Args \" $configu
146c0 72 61 74 69 6f 6e 20 5c 22 5c 6e 5d 0d 0a 0d 0a  ration \"\n]....
146d0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
146e0 20 20 20 23 20 4e 4f 54 45 3a 20 54 72 79 20 74     # NOTE: Try t
146f0 6f 20 73 65 74 75 70 20 61 6e 20 69 6e 74 65 72  o setup an inter
14700 72 75 70 74 20 63 61 6c 6c 62 61 63 6b 20 75 73  rupt callback us
14710 69 6e 67 20 74 68 65 20 73 63 72 69 70 74 20 64  ing the script d
14720 65 62 75 67 67 65 72 0d 0a 20 20 20 20 20 20 20  ebugger..       
14730 20 23 20 20 20 20 20 20 20 74 68 61 74 20 77 69   #       that wi
14740 6c 6c 20 63 61 6e 63 65 6c 20 61 6c 6c 20 53 51  ll cancel all SQ
14750 4c 20 71 75 65 72 69 65 73 20 69 6e 20 70 72 6f  L queries in pro
14760 67 72 65 73 73 20 66 6f 72 20 61 6c 6c 20 64 61  gress for all da
14770 74 61 62 61 73 65 0d 0a 20 20 20 20 20 20 20 20  tabase..        
14780 23 20 20 20 20 20 20 20 63 6f 6e 6e 65 63 74 69  #       connecti
14790 6f 6e 73 20 6b 6e 6f 77 6e 20 74 6f 20 74 68 69  ons known to thi
147a0 73 20 69 6e 74 65 72 70 72 65 74 65 72 2e 0d 0a  s interpreter...
147b0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
147c0 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78     if {![info ex
147d0 69 73 74 73 20 3a 3a 6e 6f 28 73 71 6c 69 74 65  ists ::no(sqlite
147e0 49 6e 74 65 72 72 75 70 74 43 61 6c 6c 62 61 63  InterruptCallbac
147f0 6b 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  k)]} then {..   
14800 20 20 20 20 20 20 20 73 65 74 75 70 44 62 49 6e         setupDbIn
14810 74 65 72 72 75 70 74 43 61 6c 6c 62 61 63 6b 20  terruptCallback 
14820 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
14830 24 3a 3a 74 65 73 74 5f 6c 6f 67 0d 0a 20 20 20  $::test_log..   
14840 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
14850 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
14860 4f 54 45 3a 20 43 68 65 63 6b 20 66 6f 72 20 74  OTE: Check for t
14870 68 65 20 6e 61 74 69 76 65 20 72 75 6e 74 69 6d  he native runtim
14880 65 20 6f 70 74 69 6f 6e 2c 20 77 68 69 63 68 20  e option, which 
14890 77 6f 75 6c 64 20 6d 65 61 6e 20 77 65 20 61 72  would mean we ar
148a0 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  e..        #    
148b0 20 20 20 75 73 69 6e 67 20 74 68 65 20 6d 69 78     using the mix
148c0 65 64 2d 6d 6f 64 65 20 61 73 73 65 6d 62 6c 79  ed-mode assembly
148d0 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
148e0 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72 52 75        checkForRu
148f0 6e 74 69 6d 65 4f 70 74 69 6f 6e 20 24 3a 3a 74  ntimeOption $::t
14900 65 73 74 5f 63 68 61 6e 6e 65 6c 20 6e 61 74 69  est_channel nati
14910 76 65 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d  ve....        #.
14920 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
14930 20 43 68 65 63 6b 20 69 66 20 74 68 65 20 74 65   Check if the te
14940 73 74 20 73 75 69 74 65 20 73 68 6f 75 6c 64 20  st suite should 
14950 63 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72  count the number
14960 20 6f 66 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 0d   of connections.
14970 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
14980 20 22 6f 70 65 6e 65 64 22 20 61 6e 64 20 22 63   "opened" and "c
14990 6c 6f 73 65 64 22 20 66 72 6f 6d 20 74 68 65 20  losed" from the 
149a0 70 6f 6f 6c 20 77 68 65 6e 20 64 65 74 65 72 6d  pool when determ
149b0 69 6e 69 6e 67 20 69 66 20 61 20 74 65 73 74 0d  ining if a test.
149c0 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
149d0 20 70 61 73 73 65 64 2e 20 20 44 69 73 61 62 6c   passed.  Disabl
149e0 69 6e 67 20 74 68 69 73 20 62 65 68 61 76 69 6f  ing this behavio
149f0 72 20 69 73 20 73 6f 6d 65 74 69 6d 65 73 20 6e  r is sometimes n
14a00 65 63 65 73 73 61 72 79 20 28 65 2e 67 2e 0d 0a  ecessary (e.g...
14a10 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
14a20 64 75 72 69 6e 67 20 74 68 65 20 72 65 6c 65 61  during the relea
14a30 73 65 20 74 65 73 74 69 6e 67 20 70 72 6f 63 65  se testing proce
14a40 73 73 29 20 62 65 63 61 75 73 65 20 74 68 65 72  ss) because ther
14a50 65 20 61 72 65 20 73 65 76 65 72 61 6c 0d 0a 20  e are several.. 
14a60 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74         #       t
14a70 65 73 74 73 20 74 68 61 74 20 72 65 6c 79 20 6f  ests that rely o
14a80 6e 20 74 68 65 20 22 6f 70 65 6e 65 64 20 66 72  n the "opened fr
14a90 6f 6d 20 70 6f 6f 6c 22 20 63 6f 75 6e 74 20 62  om pool" count b
14aa0 65 69 6e 67 20 67 72 65 61 74 65 72 0d 0a 20 20  eing greater..  
14ab0 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68        #       th
14ac0 61 6e 20 7a 65 72 6f 2e 20 20 54 68 65 73 65 20  an zero.  These 
14ad0 74 65 73 74 73 20 6d 61 79 20 66 61 69 6c 20 64  tests may fail d
14ae0 75 65 20 74 6f 20 74 68 65 20 6e 6f 6e 2d 64 65  ue to the non-de
14af0 74 65 72 6d 69 6e 69 73 74 69 63 0d 0a 20 20 20  terministic..   
14b00 20 20 20 20 20 23 20 20 20 20 20 20 20 62 65 68       #       beh
14b10 61 76 69 6f 72 20 6f 66 20 74 68 65 20 43 4c 52  avior of the CLR
14b20 20 47 43 2c 20 65 76 65 6e 20 77 68 65 6e 20 74   GC, even when t
14b30 68 65 72 65 20 69 73 20 6e 6f 20 62 75 67 20 69  here is no bug i
14b40 6e 20 74 68 65 20 63 6f 64 65 0d 0a 20 20 20 20  n the code..    
14b50 20 20 20 20 23 20 20 20 20 20 20 20 62 65 69 6e      #       bein
14b60 67 20 74 65 73 74 65 64 2e 0d 0a 20 20 20 20 20  g tested...     
14b70 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 63 68     #..        ch
14b80 65 63 6b 46 6f 72 52 75 6e 74 69 6d 65 4f 70 74  eckForRuntimeOpt
14b90 69 6f 6e 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  ion $::test_chan
14ba0 6e 65 6c 20 6e 6f 50 6f 6f 6c 43 6f 75 6e 74 73  nel noPoolCounts
14bb0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  ....        #.. 
14bc0 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 52         # NOTE: R
14bd0 65 70 6f 72 74 20 74 68 65 20 72 65 73 6f 75 72  eport the resour
14be0 63 65 20 75 73 61 67 65 20 70 72 69 6f 72 20 74  ce usage prior t
14bf0 6f 20 72 75 6e 6e 69 6e 67 20 61 6e 79 20 74 65  o running any te
14c00 73 74 73 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  sts...        #.
14c10 0a 20 20 20 20 20 20 20 20 72 65 70 6f 72 74 53  .        reportS
14c20 51 4c 69 74 65 52 65 73 6f 75 72 63 65 73 20 24  QLiteResources $
14c30 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 0d 0a  ::test_channel..
14c40 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
14c50 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 68 6f       # NOTE: Sho
14c60 77 20 74 68 65 20 61 63 74 69 76 65 20 74 65 73  w the active tes
14c70 74 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e 0d 0a  t constraints...
14c80 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
14c90 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
14ca0 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  _channel [append
14cb0 41 72 67 73 20 22 2d 2d 2d 2d 20 63 6f 6e 73 74  Args "---- const
14cc0 72 61 69 6e 74 73 3a 20 22 20 5c 0d 0a 20 20 20  raints: " \..   
14cd0 20 20 20 20 20 20 20 20 20 5b 66 6f 72 6d 61 74           [format
14ce0 4c 69 73 74 20 5b 6c 73 6f 72 74 20 5b 67 65 74  List [lsort [get
14cf0 43 6f 6e 73 74 72 61 69 6e 74 73 5d 5d 20 3c 6e  Constraints]] <n
14d00 6f 6e 65 3e 5d 20 5c 6e 5d 0d 0a 0d 0a 20 20 20  one>] \n]....   
14d10 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
14d20 23 20 4e 4f 54 45 3a 20 53 61 76 65 20 74 68 65  # NOTE: Save the
14d30 20 74 65 73 74 20 63 6f 6e 73 74 72 61 69 6e 74   test constraint
14d40 73 20 66 6f 72 20 75 73 65 20 62 79 20 74 68 72  s for use by thr
14d50 65 61 64 73 20 63 72 65 61 74 65 64 20 69 6e 20  eads created in 
14d60 74 68 69 73 0d 0a 20 20 20 20 20 20 20 20 23 20  this..        # 
14d70 20 20 20 20 20 20 61 70 70 6c 69 63 61 74 69 6f        applicatio
14d80 6e 20 64 6f 6d 61 69 6e 2e 20 20 54 68 69 73 20  n domain.  This 
14d90 69 73 20 6e 65 63 65 73 73 61 72 79 20 62 65 63  is necessary bec
14da0 61 75 73 65 20 61 6c 6c 20 74 68 65 20 45 61 67  ause all the Eag
14db0 6c 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  le..        #   
14dc0 20 20 20 20 22 74 65 73 74 20 63 6f 6e 74 65 78      "test contex
14dd0 74 22 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69  t" information i
14de0 73 20 70 65 72 2d 74 68 72 65 61 64 2e 0d 0a 20  s per-thread... 
14df0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
14e00 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69    if {![info exi
14e10 73 74 73 20 3a 3a 74 65 73 74 5f 63 6f 6e 73 74  sts ::test_const
14e20 72 61 69 6e 74 73 5d 7d 20 74 68 65 6e 20 7b 0d  raints]} then {.
14e30 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20 3a  .          set :
14e40 3a 74 65 73 74 5f 63 6f 6e 73 74 72 61 69 6e 74  :test_constraint
14e50 73 20 24 3a 3a 65 61 67 6c 65 5f 74 65 73 74 73  s $::eagle_tests
14e60 28 63 6f 6e 73 74 72 61 69 6e 74 73 29 0d 0a 20  (constraints).. 
14e70 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
14e80 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
14e90 20 4e 4f 54 45 3a 20 4c 6f 61 64 20 74 68 65 20   NOTE: Load the 
14ea0 22 61 66 74 65 72 2d 63 6f 6e 73 74 72 61 69 6e  "after-constrain
14eb0 74 73 22 20 63 75 73 74 6f 6d 20 70 65 72 2d 75  ts" custom per-u
14ec0 73 65 72 20 61 6e 64 2f 6f 72 20 70 65 72 2d 68  ser and/or per-h
14ed0 6f 73 74 0d 0a 20 20 20 20 20 20 20 20 23 20 20  ost..        #  
14ee0 20 20 20 20 20 74 65 73 74 20 73 65 74 74 69 6e       test settin
14ef0 67 73 20 6e 6f 77 2e 0d 0a 20 20 20 20 20 20 20  gs now...       
14f00 20 23 0d 0a 20 20 20 20 20 20 20 20 75 70 6c 65   #..        uple
14f10 76 65 6c 20 31 20 5b 6c 69 73 74 20 6c 6f 61 64  vel 1 [list load
14f20 53 51 4c 69 74 65 54 65 73 74 53 65 74 74 69 6e  SQLiteTestSettin
14f30 67 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  gs $::test_chann
14f40 65 6c 20 2e 61 66 74 65 72 5d 0d 0a 0d 0a 20 20  el .after]....  
14f50 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
14f60 20 23 20 4e 4f 54 45 3a 20 53 68 6f 77 20 77 68   # NOTE: Show wh
14f70 65 6e 20 6f 75 72 20 74 65 73 74 73 20 61 63 74  en our tests act
14f80 75 61 6c 6c 79 20 62 65 67 61 6e 20 28 6e 6f 77  ually began (now
14f90 29 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  )...        #.. 
14fa0 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
14fb0 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70  test_channel [ap
14fc0 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
14fd0 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 53 79          "---- Sy
14fe0 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
14ff0 20 74 65 73 74 73 20 62 65 67 61 6e 20 61 74 20   tests began at 
15000 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  " \..           
15010 20 5b 63 6c 6f 63 6b 20 66 6f 72 6d 61 74 20 5b   [clock format [
15020 63 6c 6f 63 6b 20 73 65 63 6f 6e 64 73 5d 5d 20  clock seconds]] 
15030 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20  \n]..      }..  
15040 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
15050 20 72 75 6e 53 51 4c 69 74 65 54 65 73 74 45 70   runSQLiteTestEp
15060 69 6c 6f 67 75 65 20 7b 7d 20 7b 0d 0a 20 20 20  ilogue {} {..   
15070 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
15080 54 45 3a 20 53 6b 69 70 20 72 75 6e 6e 69 6e 67  TE: Skip running
15090 20 6f 75 72 20 63 75 73 74 6f 6d 20 65 70 69 6c   our custom epil
150a0 6f 67 75 65 20 69 66 20 74 68 65 20 6d 61 69 6e  ogue if the main
150b0 20 6f 6e 65 20 68 61 73 20 62 65 65 6e 0d 0a 20   one has been.. 
150c0 20 20 20 20 20 23 20 20 20 20 20 20 20 73 6b 69       #       ski
150d0 70 70 65 64 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  pped...      #..
150e0 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f        if {![info
150f0 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 65 70 69   exists ::no(epi
15100 6c 6f 67 75 65 2e 65 61 67 6c 65 29 5d 7d 20 74  logue.eagle)]} t
15110 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  hen {..        #
15120 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
15130 3a 20 53 68 6f 77 20 77 68 65 6e 20 6f 75 72 20  : Show when our 
15140 74 65 73 74 73 20 61 63 74 75 61 6c 6c 79 20 65  tests actually e
15150 6e 64 65 64 20 28 6e 6f 77 29 2e 0d 0a 20 20 20  nded (now)...   
15160 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
15170 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
15180 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
15190 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
151a0 20 22 2d 2d 2d 2d 20 53 79 73 74 65 6d 2e 44 61   "---- System.Da
151b0 74 61 2e 53 51 4c 69 74 65 20 74 65 73 74 73 20  ta.SQLite tests 
151c0 65 6e 64 65 64 20 61 74 20 22 20 5c 0d 0a 20 20  ended at " \..  
151d0 20 20 20 20 20 20 20 20 20 20 5b 63 6c 6f 63 6b            [clock
151e0 20 66 6f 72 6d 61 74 20 5b 63 6c 6f 63 6b 20 73   format [clock s
151f0 65 63 6f 6e 64 73 5d 5d 20 5c 6e 5d 0d 0a 0d 0a  econds]] \n]....
15200 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
15210 20 20 20 23 20 42 55 47 46 49 58 3a 20 42 65 66     # BUGFIX: Bef
15220 6f 72 65 20 63 68 65 63 6b 69 6e 67 20 74 68 65  ore checking the
15230 20 66 69 6e 61 6c 20 72 65 73 6f 75 72 63 65 73   final resources
15240 20 69 6e 20 75 73 65 20 62 79 20 53 51 4c 69 74   in use by SQLit
15250 65 2c 20 6d 61 6b 65 0d 0a 20 20 20 20 20 20 20  e, make..       
15260 20 23 20 20 20 20 20 20 20 20 20 73 75 72 65 20   #         sure 
15270 62 6f 74 68 20 6f 66 20 74 68 65 20 50 52 41 47  both of the PRAG
15280 4d 41 20 72 65 6c 61 74 65 64 20 64 69 72 65 63  MA related direc
15290 74 6f 72 79 20 6e 61 6d 65 73 20 61 72 65 20 66  tory names are f
152a0 72 65 65 64 2e 0d 0a 20 20 20 20 20 20 20 20 23  reed...        #
152b0 0d 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b 46  ..        checkF
152c0 6f 72 53 51 4c 69 74 65 44 69 72 65 63 74 6f 72  orSQLiteDirector
152d0 69 65 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  ies $::test_chan
152e0 6e 65 6c 20 74 72 75 65 0d 0a 0d 0a 20 20 20 20  nel true....    
152f0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
15300 20 4e 4f 54 45 3a 20 41 6c 73 6f 20 72 65 70 6f   NOTE: Also repo
15310 72 74 20 74 68 65 20 72 65 73 6f 75 72 63 65 20  rt the resource 
15320 75 73 61 67 65 20 61 66 74 65 72 20 72 75 6e 6e  usage after runn
15330 69 6e 67 20 74 68 65 20 74 65 73 74 73 2e 0d 0a  ing the tests...
15340 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
15350 20 20 20 72 65 70 6f 72 74 53 51 4c 69 74 65 52     reportSQLiteR
15360 65 73 6f 75 72 63 65 73 20 24 3a 3a 74 65 73 74  esources $::test
15370 5f 63 68 61 6e 6e 65 6c 0d 0a 0d 0a 20 20 20 20  _channel....    
15380 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
15390 20 4e 4f 54 45 3a 20 52 65 70 6f 72 74 20 74 68   NOTE: Report th
153a0 65 20 63 72 69 74 69 63 61 6c 20 68 61 6e 64 6c  e critical handl
153b0 65 20 63 6f 75 6e 74 73 20 61 66 74 65 72 20 72  e counts after r
153c0 75 6e 6e 69 6e 67 20 74 68 65 20 74 65 73 74 73  unning the tests
153d0 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
153e0 20 20 20 20 20 20 67 65 74 53 51 4c 69 74 65 48        getSQLiteH
153f0 61 6e 64 6c 65 43 6f 75 6e 74 73 20 24 3a 3a 74  andleCounts $::t
15400 65 73 74 5f 63 68 61 6e 6e 65 6c 0d 0a 20 20 20  est_channel..   
15410 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a     }..    }.....
15420 20 20 20 20 23 23 23 23 23 23 23 23 23 23 23 23      ############
15430 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
15440 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
15450 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
15460 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0d  ###############.
15470 0a 20 20 20 20 23 23 23 23 23 23 23 23 23 23 23  .    ###########
15480 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
15490 23 23 20 45 4e 44 20 45 61 67 6c 65 20 4f 4e 4c  ## END Eagle ONL
154a0 59 20 23 23 23 23 23 23 23 23 23 23 23 23 23 23  Y ##############
154b0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
154c0 0d 0a 20 20 20 20 23 23 23 23 23 23 23 23 23 23  ..    ##########
154d0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
154e0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
154f0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
15500 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
15510 23 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 23 0d 0a 20  #..  }....  #.. 
15520 20 23 20 4e 4f 54 45 3a 20 53 61 76 65 20 74 68   # NOTE: Save th
15530 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 69  e name of the di
15540 72 65 63 74 6f 72 79 20 63 6f 6e 74 61 69 6e 69  rectory containi
15550 6e 67 20 74 68 69 73 20 66 69 6c 65 2e 0d 0a 20  ng this file... 
15560 20 23 0d 0a 20 20 69 66 20 7b 21 5b 69 6e 66 6f   #..  if {![info
15570 20 65 78 69 73 74 73 20 63 6f 6d 6d 6f 6e 5f 64   exists common_d
15580 69 72 65 63 74 6f 72 79 5d 7d 20 74 68 65 6e 20  irectory]} then 
15590 7b 0d 0a 20 20 20 20 73 65 74 20 63 6f 6d 6d 6f  {..    set commo
155a0 6e 5f 64 69 72 65 63 74 6f 72 79 20 5b 66 69 6c  n_directory [fil
155b0 65 20 64 69 72 6e 61 6d 65 20 5b 69 6e 66 6f 20  e dirname [info 
155c0 73 63 72 69 70 74 5d 5d 0d 0a 20 20 7d 0d 0a 0d  script]]..  }...
155d0 0a 20 20 23 0d 0a 20 20 23 20 4e 4f 54 45 3a 20  .  #..  # NOTE: 
155e0 50 72 6f 76 69 64 65 20 74 68 65 20 53 79 73 74  Provide the Syst
155f0 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 20 74  em.Data.SQLite t
15600 65 73 74 20 70 61 63 6b 61 67 65 20 74 6f 20 74  est package to t
15610 68 65 20 69 6e 74 65 72 70 72 65 74 65 72 2e 0d  he interpreter..
15620 0a 20 20 23 0d 0a 20 20 70 61 63 6b 61 67 65 20  .  #..  package 
15630 70 72 6f 76 69 64 65 20 53 79 73 74 65 6d 2e 44  provide System.D
15640 61 74 61 2e 53 51 4c 69 74 65 2e 54 65 73 74 20  ata.SQLite.Test 
15650 31 2e 30 0d 0a 7d 0d 0a                          1.0..}..