System.Data.SQLite
Hex Artifact Content
Not logged in

Artifact a5d3db6713c41b9b1d1c65f882783d3b499d8b9b:


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 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  rn..            
7c10: 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
7c20: 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
7c30: 73 20 24 63 68 61 6e 6e 65 6c 20 79 65 73 5c 6e  s $channel yes\n
7c40: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
7c50: 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  }..            }
7c60: 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
7c70: 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
7c80: 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d 0a 20 20 20 20  annel no\n..    
7c90: 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
7ca0: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
7cb0: 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  }..      }..    
7cc0: 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 63  }.....    proc c
7cd0: 68 65 63 6b 46 6f 72 53 51 4c 69 74 65 4c 69 62  heckForSQLiteLib
7ce0: 72 61 72 79 20 7b 20 63 68 61 6e 6e 65 6c 20 7d  rary { channel }
7cf0: 20 7b 0d 0a 20 20 20 20 20 20 74 70 75 74 73 20   {..      tputs 
7d00: 24 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 63  $channel "---- c
7d10: 68 65 63 6b 69 6e 67 20 66 6f 72 20 53 51 4c 69  hecking for SQLi
7d20: 74 65 20 63 6f 72 65 20 6c 69 62 72 61 72 79 2e  te core library.
7d30: 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 20 20 69 66  .. "....      if
7d40: 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20   {[catch {..    
7d50: 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74            object
7d60: 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b   invoke -flags +
7d70: 4e 6f 6e 50 75 62 6c 69 63 20 53 79 73 74 65 6d  NonPublic System
7d80: 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 53 51 4c  .Data.SQLite.SQL
7d90: 69 74 65 33 20 5c 0d 0a 20 20 20 20 20 20 20 20  ite3 \..        
7da0: 20 20 20 20 20 20 53 51 4c 69 74 65 56 65 72 73        SQLiteVers
7db0: 69 6f 6e 7d 20 76 65 72 73 69 6f 6e 5d 20 3d 3d  ion} version] ==
7dc0: 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
7dd0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
7de0: 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 69 66 20   NOTE: Check if 
7df0: 74 68 65 20 72 65 74 75 72 6e 65 64 20 76 65 72  the returned ver
7e00: 73 69 6f 6e 20 77 61 73 20 6e 75 6c 6c 2e 20 20  sion was null.  
7e10: 49 66 20 73 6f 2c 20 6d 61 6b 65 20 69 74 20 65  If so, make it e
7e20: 61 73 79 0d 0a 20 20 20 20 20 20 20 20 23 20 20  asy..        #  
7e30: 20 20 20 20 20 74 6f 20 73 70 6f 74 2e 0d 0a 20       to spot... 
7e40: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
7e50: 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65    if {[string le
7e60: 6e 67 74 68 20 24 76 65 72 73 69 6f 6e 5d 20 3d  ngth $version] =
7e70: 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  = 0} then {..   
7e80: 20 20 20 20 20 20 20 73 65 74 20 76 65 72 73 69         set versi
7e90: 6f 6e 20 6e 75 6c 6c 0d 0a 20 20 20 20 20 20 20  on null..       
7ea0: 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d   }....        #.
7eb0: 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
7ec0: 20 41 74 74 65 6d 70 74 20 74 6f 20 71 75 65 72   Attempt to quer
7ed0: 79 20 74 68 65 20 46 6f 73 73 69 6c 20 73 6f 75  y the Fossil sou
7ee0: 72 63 65 20 69 64 65 6e 74 69 66 69 65 72 20 66  rce identifier f
7ef0: 6f 72 20 74 68 65 20 53 51 4c 69 74 65 0d 0a 20  or the SQLite.. 
7f00: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63         #       c
7f10: 6f 72 65 20 6c 69 62 72 61 72 79 2e 0d 0a 20 20  ore library...  
7f20: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
7f30: 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20   if {[catch {.. 
7f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f                 o
7f50: 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c  bject invoke -fl
7f60: 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 53  ags +NonPublic S
7f70: 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
7f80: 65 2e 53 51 4c 69 74 65 33 20 5c 0d 0a 20 20 20  e.SQLite3 \..   
7f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
7fa0: 69 74 65 53 6f 75 72 63 65 49 64 7d 20 73 6f 75  iteSourceId} sou
7fb0: 72 63 65 49 64 5d 7d 20 74 68 65 6e 20 7b 0d 0a  rceId]} then {..
7fc0: 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
7fd0: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 57         # NOTE: W
7fe0: 65 20 66 61 69 6c 65 64 20 74 6f 20 71 75 65 72  e failed to quer
7ff0: 79 20 74 68 65 20 46 6f 73 73 69 6c 20 73 6f 75  y the Fossil sou
8000: 72 63 65 20 69 64 65 6e 74 69 66 69 65 72 2e 0d  rce identifier..
8010: 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
8020: 20 20 20 20 20 20 20 20 73 65 74 20 73 6f 75 72          set sour
8030: 63 65 49 64 20 75 6e 6b 6e 6f 77 6e 0d 0a 20 20  ceId unknown..  
8040: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
8050: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
8060: 4e 4f 54 45 3a 20 43 68 65 63 6b 20 69 66 20 74  NOTE: Check if t
8070: 68 65 20 72 65 74 75 72 6e 65 64 20 46 6f 73 73  he returned Foss
8080: 69 6c 20 73 6f 75 72 63 65 20 69 64 65 6e 74 69  il source identi
8090: 66 69 65 72 20 77 61 73 20 6e 75 6c 6c 2e 20 20  fier was null.  
80a0: 49 66 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  If..        #   
80b0: 20 20 20 20 73 6f 2c 20 6d 61 6b 65 20 69 74 20      so, make it 
80c0: 65 61 73 79 20 74 6f 20 73 70 6f 74 2e 0d 0a 20  easy to spot... 
80d0: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
80e0: 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65    if {[string le
80f0: 6e 67 74 68 20 24 73 6f 75 72 63 65 49 64 5d 20  ngth $sourceId] 
8100: 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  == 0} then {..  
8110: 20 20 20 20 20 20 20 20 73 65 74 20 73 6f 75 72          set sour
8120: 63 65 49 64 20 6e 75 6c 6c 0d 0a 20 20 20 20 20  ceId null..     
8130: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
8140: 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
8150: 45 3a 20 59 65 73 2c 20 74 68 65 20 53 51 4c 69  E: Yes, the SQLi
8160: 74 65 20 63 6f 72 65 20 6c 69 62 72 61 72 79 20  te core library 
8170: 61 70 70 65 61 72 73 20 74 6f 20 62 65 20 61 76  appears to be av
8180: 61 69 6c 61 62 6c 65 2e 0d 0a 20 20 20 20 20 20  ailable...      
8190: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 61 64 64    #..        add
81a0: 43 6f 6e 73 74 72 61 69 6e 74 20 53 51 4c 69 74  Constraint SQLit
81b0: 65 0d 0a 0d 0a 20 20 20 20 20 20 20 20 74 70 75  e....        tpu
81c0: 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70  ts $channel [app
81d0: 65 6e 64 41 72 67 73 20 22 79 65 73 20 28 22 20  endArgs "yes (" 
81e0: 24 76 65 72 73 69 6f 6e 20 22 20 22 20 24 73 6f  $version " " $so
81f0: 75 72 63 65 49 64 20 22 29 5c 6e 22 5d 0d 0a 20  urceId ")\n"].. 
8200: 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
8210: 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
8220: 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d 0a 20 20 20 20  annel no\n..    
8230: 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20    }..    }..... 
8240: 20 20 20 70 72 6f 63 20 63 68 65 63 6b 46 6f 72     proc checkFor
8250: 53 51 4c 69 74 65 49 6e 74 65 72 6f 70 20 7b 20  SQLiteInterop { 
8260: 63 68 61 6e 6e 65 6c 20 7d 20 7b 0d 0a 20 20 20  channel } {..   
8270: 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
8280: 6c 20 22 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e 67  l "---- checking
8290: 20 66 6f 72 20 53 51 4c 69 74 65 20 69 6e 74 65   for SQLite inte
82a0: 72 6f 70 20 61 73 73 65 6d 62 6c 79 2e 2e 2e 20  rop assembly... 
82b0: 22 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b  "....      if {[
82c0: 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20  catch {..       
82d0: 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e         object in
82e0: 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e  voke -flags +Non
82f0: 50 75 62 6c 69 63 20 53 79 73 74 65 6d 2e 44 61  Public System.Da
8300: 74 61 2e 53 51 4c 69 74 65 2e 53 51 4c 69 74 65  ta.SQLite.SQLite
8310: 33 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  3 \..           
8320: 20 20 20 49 6e 74 65 72 6f 70 56 65 72 73 69 6f     InteropVersio
8330: 6e 7d 20 76 65 72 73 69 6f 6e 5d 20 3d 3d 20 30  n} version] == 0
8340: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
8350: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
8360: 4f 54 45 3a 20 43 68 65 63 6b 20 69 66 20 74 68  OTE: Check if th
8370: 65 20 72 65 74 75 72 6e 65 64 20 76 65 72 73 69  e returned versi
8380: 6f 6e 20 77 61 73 20 6e 75 6c 6c 2e 20 20 49 66  on was null.  If
8390: 20 73 6f 2c 20 6d 61 6b 65 20 69 74 20 65 61 73   so, make it eas
83a0: 79 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  y..        #    
83b0: 20 20 20 74 6f 20 73 70 6f 74 2e 0d 0a 20 20 20     to spot...   
83c0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
83d0: 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67  if {[string leng
83e0: 74 68 20 24 76 65 72 73 69 6f 6e 5d 20 3d 3d 20  th $version] == 
83f0: 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
8400: 20 20 20 20 20 73 65 74 20 76 65 72 73 69 6f 6e       set version
8410: 20 6e 75 6c 6c 0d 0a 20 20 20 20 20 20 20 20 7d   null..        }
8420: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  ....        #.. 
8430: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41         # NOTE: A
8440: 74 74 65 6d 70 74 20 74 6f 20 71 75 65 72 79 20  ttempt to query 
8450: 74 68 65 20 46 6f 73 73 69 6c 20 73 6f 75 72 63  the Fossil sourc
8460: 65 20 69 64 65 6e 74 69 66 69 65 72 20 66 6f 72  e identifier for
8470: 20 74 68 65 20 53 51 4c 69 74 65 0d 0a 20 20 20   the SQLite..   
8480: 20 20 20 20 20 23 20 20 20 20 20 20 20 63 6f 72       #       cor
8490: 65 20 6c 69 62 72 61 72 79 2e 0d 0a 20 20 20 20  e library...    
84a0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 69      #..        i
84b0: 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20  f {[catch {..   
84c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 62 6a               obj
84d0: 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67  ect invoke -flag
84e0: 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 53 79 73  s +NonPublic Sys
84f0: 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e  tem.Data.SQLite.
8500: 53 51 4c 69 74 65 33 20 5c 0d 0a 20 20 20 20 20  SQLite3 \..     
8510: 20 20 20 20 20 20 20 20 20 20 20 49 6e 74 65 72             Inter
8520: 6f 70 53 6f 75 72 63 65 49 64 7d 20 73 6f 75 72  opSourceId} sour
8530: 63 65 49 64 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  ceId]} then {.. 
8540: 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
8550: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 57 65        # NOTE: We
8560: 20 66 61 69 6c 65 64 20 74 6f 20 71 75 65 72 79   failed to query
8570: 20 74 68 65 20 46 6f 73 73 69 6c 20 73 6f 75 72   the Fossil sour
8580: 63 65 20 69 64 65 6e 74 69 66 69 65 72 2e 0d 0a  ce identifier...
8590: 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
85a0: 20 20 20 20 20 20 20 73 65 74 20 73 6f 75 72 63         set sourc
85b0: 65 49 64 20 75 6e 6b 6e 6f 77 6e 0d 0a 20 20 20  eId unknown..   
85c0: 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
85d0: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
85e0: 4f 54 45 3a 20 43 68 65 63 6b 20 69 66 20 74 68  OTE: Check if th
85f0: 65 20 72 65 74 75 72 6e 65 64 20 46 6f 73 73 69  e returned Fossi
8600: 6c 20 73 6f 75 72 63 65 20 69 64 65 6e 74 69 66  l source identif
8610: 69 65 72 20 77 61 73 20 6e 75 6c 6c 2e 20 20 49  ier was null.  I
8620: 66 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  f..        #    
8630: 20 20 20 73 6f 2c 20 6d 61 6b 65 20 69 74 20 65     so, make it e
8640: 61 73 79 20 74 6f 20 73 70 6f 74 2e 0d 0a 20 20  asy to spot...  
8650: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
8660: 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e   if {[string len
8670: 67 74 68 20 24 73 6f 75 72 63 65 49 64 5d 20 3d  gth $sourceId] =
8680: 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  = 0} then {..   
8690: 20 20 20 20 20 20 20 73 65 74 20 73 6f 75 72 63         set sourc
86a0: 65 49 64 20 6e 75 6c 6c 0d 0a 20 20 20 20 20 20  eId null..      
86b0: 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23    }....        #
86c0: 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
86d0: 3a 20 59 65 73 2c 20 74 68 65 20 53 51 4c 69 74  : Yes, the SQLit
86e0: 65 20 69 6e 74 65 72 6f 70 20 61 73 73 65 6d 62  e interop assemb
86f0: 6c 79 20 61 70 70 65 61 72 73 20 74 6f 20 62 65  ly appears to be
8700: 20 61 76 61 69 6c 61 62 6c 65 2e 0d 0a 20 20 20   available...   
8710: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
8720: 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 53 51  addConstraint SQ
8730: 4c 69 74 65 49 6e 74 65 72 6f 70 0d 0a 0d 0a 20  LiteInterop.... 
8740: 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
8750: 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
8760: 73 20 22 79 65 73 20 28 22 20 24 76 65 72 73 69  s "yes (" $versi
8770: 6f 6e 20 22 20 22 20 24 73 6f 75 72 63 65 49 64  on " " $sourceId
8780: 20 22 29 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 7d   ")\n"]..      }
8790: 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
87a0: 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
87b0: 6e 6f 5c 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a 20  no\n..      }.. 
87c0: 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
87d0: 63 20 63 68 65 63 6b 46 6f 72 53 51 4c 69 74 65  c checkForSQLite
87e0: 44 65 66 69 6e 65 43 6f 6e 73 74 61 6e 74 20 7b  DefineConstant {
87f0: 20 63 68 61 6e 6e 65 6c 20 6e 61 6d 65 20 7d 20   channel name } 
8800: 7b 0d 0a 20 20 20 20 20 20 74 70 75 74 73 20 24  {..      tputs $
8810: 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
8820: 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
8830: 20 22 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e 67 20   "---- checking 
8840: 66 6f 72 20 53 79 73 74 65 6d 2e 44 61 74 61 2e  for System.Data.
8850: 53 51 4c 69 74 65 20 64 65 66 69 6e 65 20 63 6f  SQLite define co
8860: 6e 73 74 61 6e 74 20 5c 22 22 20 24 6e 61 6d 65  nstant \"" $name
8870: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 22 5c   \..          "\
8880: 22 2e 2e 2e 20 22 5d 0d 0a 0d 0a 20 20 20 20 20  "... "]....     
8890: 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20   if {[catch {.. 
88a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 62 6a               obj
88b0: 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67  ect invoke -flag
88c0: 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 53 79 73  s +NonPublic Sys
88d0: 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e  tem.Data.SQLite.
88e0: 53 51 4c 69 74 65 33 20 5c 0d 0a 20 20 20 20 20  SQLite3 \..     
88f0: 20 20 20 20 20 20 20 20 20 44 65 66 69 6e 65 43           DefineC
8900: 6f 6e 73 74 61 6e 74 73 7d 20 64 65 66 69 6e 65  onstants} define
8910: 43 6f 6e 73 74 61 6e 74 73 5d 20 3d 3d 20 30 7d  Constants] == 0}
8920: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
8930: 20 69 66 20 7b 5b 6c 73 65 61 72 63 68 20 2d 65   if {[lsearch -e
8940: 78 61 63 74 20 2d 6e 6f 63 61 73 65 20 24 64 65  xact -nocase $de
8950: 66 69 6e 65 43 6f 6e 73 74 61 6e 74 73 20 24 6e  fineConstants $n
8960: 61 6d 65 5d 20 21 3d 20 2d 31 7d 20 74 68 65 6e  ame] != -1} then
8970: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d   {..          #.
8980: 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54  .          # NOT
8990: 45 3a 20 59 65 73 2c 20 74 68 69 73 20 64 65 66  E: Yes, this def
89a0: 69 6e 65 20 63 6f 6e 73 74 61 6e 74 20 77 61 73  ine constant was
89b0: 20 65 6e 61 62 6c 65 64 20 77 68 65 6e 20 74 68   enabled when th
89c0: 65 20 6d 61 6e 61 67 65 64 0d 0a 20 20 20 20 20  e managed..     
89d0: 20 20 20 20 20 23 20 20 20 20 20 20 20 61 73 73       #       ass
89e0: 65 6d 62 6c 79 20 77 61 73 20 63 6f 6d 70 69 6c  embly was compil
89f0: 65 64 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23  ed...          #
8a00: 0d 0a 20 20 20 20 20 20 20 20 20 20 61 64 64 43  ..          addC
8a10: 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e  onstraint [appen
8a20: 64 41 72 67 73 20 64 65 66 69 6e 65 43 6f 6e 73  dArgs defineCons
8a30: 74 61 6e 74 2e 53 79 73 74 65 6d 2e 44 61 74 61  tant.System.Data
8a40: 2e 53 51 4c 69 74 65 2e 20 24 6e 61 6d 65 5d 0d  .SQLite. $name].
8a50: 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70 75  ...          tpu
8a60: 74 73 20 24 63 68 61 6e 6e 65 6c 20 79 65 73 5c  ts $channel yes\
8a70: 6e 0d 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73  n..        } els
8a80: 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74  e {..          t
8a90: 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 6e 6f  puts $channel no
8aa0: 5c 6e 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20  \n..        }.. 
8ab0: 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
8ac0: 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
8ad0: 61 6e 6e 65 6c 20 65 72 72 6f 72 5c 6e 0d 0a 20  annel error\n.. 
8ae0: 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c       }..    }...
8af0: 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74 44 61  ..    proc getDa
8b00: 74 65 54 69 6d 65 46 6f 72 6d 61 74 20 7b 7d 20  teTimeFormat {} 
8b10: 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  {..      #..    
8b20: 20 20 23 20 4e 4f 54 45 3a 20 54 68 69 73 20 70    # NOTE: This p
8b30: 72 6f 63 65 64 75 72 65 20 73 69 6d 70 6c 79 20  rocedure simply 
8b40: 72 65 74 75 72 6e 73 20 74 68 65 20 22 64 65 66  returns the "def
8b50: 61 75 6c 74 22 20 44 61 74 65 54 69 6d 65 20 66  ault" DateTime f
8b60: 6f 72 6d 61 74 20 75 73 65 64 0d 0a 20 20 20 20  ormat used..    
8b70: 20 20 23 20 20 20 20 20 20 20 62 79 20 74 68 65    #       by the
8b80: 20 74 65 73 74 20 73 75 69 74 65 2e 0d 0a 20 20   test suite...  
8b90: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20      #..      if 
8ba0: 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  {[info exists ::
8bb0: 64 61 74 65 74 69 6d 65 5f 66 6f 72 6d 61 74 5d  datetime_format]
8bc0: 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20   && \..         
8bd0: 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20   [string length 
8be0: 24 3a 3a 64 61 74 65 74 69 6d 65 5f 66 6f 72 6d  $::datetime_form
8bf0: 61 74 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d  at] > 0} then {.
8c00: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
8c10: 20 20 20 20 23 20 4e 4f 54 45 3a 20 52 65 74 75      # NOTE: Retu
8c20: 72 6e 20 74 68 65 20 6d 61 6e 75 61 6c 6c 79 20  rn the manually 
8c30: 6f 76 65 72 72 69 64 64 65 6e 20 76 61 6c 75 65  overridden value
8c40: 20 66 6f 72 20 74 68 65 20 44 61 74 65 54 69 6d   for the DateTim
8c50: 65 20 66 6f 72 6d 61 74 2e 0d 0a 20 20 20 20 20  e format...     
8c60: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65     #..        re
8c70: 74 75 72 6e 20 24 3a 3a 64 61 74 65 74 69 6d 65  turn $::datetime
8c80: 5f 66 6f 72 6d 61 74 0d 0a 20 20 20 20 20 20 7d  _format..      }
8c90: 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
8ca0: 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
8cb0: 54 45 3a 20 52 65 74 75 72 6e 20 61 6e 20 49 53  TE: Return an IS
8cc0: 4f 38 36 30 31 20 44 61 74 65 54 69 6d 65 20 66  O8601 DateTime f
8cd0: 6f 72 6d 61 74 20 63 6f 6d 70 61 74 69 62 6c 65  ormat compatible
8ce0: 20 77 69 74 68 20 53 51 4c 69 74 65 2c 0d 0a 20   with SQLite,.. 
8cf0: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 53         #       S
8d00: 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
8d10: 65 2c 20 61 6e 64 20 73 75 69 74 61 62 6c 65 20  e, and suitable 
8d20: 66 6f 72 20 72 6f 75 6e 64 2d 74 72 69 70 70 69  for round-trippi
8d30: 6e 67 20 77 69 74 68 20 74 68 65 0d 0a 20 20 20  ng with the..   
8d40: 20 20 20 20 20 23 20 20 20 20 20 20 20 44 61 74       #       Dat
8d50: 65 54 69 6d 65 20 63 6c 61 73 73 20 6f 66 20 74  eTime class of t
8d60: 68 65 20 66 72 61 6d 65 77 6f 72 6b 2e 20 20 49  he framework.  I
8d70: 66 20 74 68 69 73 20 76 61 6c 75 65 20 69 73 20  f this value is 
8d80: 63 68 61 6e 67 65 64 2c 0d 0a 20 20 20 20 20 20  changed,..      
8d90: 20 20 23 20 20 20 20 20 20 20 76 61 72 69 6f 75    #       variou
8da0: 73 20 74 65 73 74 73 20 6d 61 79 20 66 61 69 6c  s tests may fail
8db0: 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
8dc0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 22 79 79        return "yy
8dd0: 79 79 2d 4d 4d 2d 64 64 20 48 48 3a 6d 6d 3a 73  yy-MM-dd HH:mm:s
8de0: 73 2e 46 46 46 46 46 46 46 4b 22 0d 0a 20 20 20  s.FFFFFFFK"..   
8df0: 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a     }..    }.....
8e00: 20 20 20 20 70 72 6f 63 20 65 6e 75 6d 65 72 61      proc enumera
8e10: 62 6c 65 54 6f 4c 69 73 74 20 7b 20 65 6e 75 6d  bleToList { enum
8e20: 65 72 61 62 6c 65 20 7d 20 7b 0d 0a 20 20 20 20  erable } {..    
8e30: 20 20 73 65 74 20 72 65 73 75 6c 74 20 5b 6c 69    set result [li
8e40: 73 74 5d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20  st]....      if 
8e50: 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20  {[string length 
8e60: 24 65 6e 75 6d 65 72 61 62 6c 65 5d 20 3d 3d 20  $enumerable] == 
8e70: 30 20 7c 7c 20 24 65 6e 75 6d 65 72 61 62 6c 65  0 || $enumerable
8e80: 20 65 71 20 22 6e 75 6c 6c 22 7d 20 74 68 65 6e   eq "null"} then
8e90: 20 7b 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75   {..        retu
8ea0: 72 6e 20 24 72 65 73 75 6c 74 0d 0a 20 20 20 20  rn $result..    
8eb0: 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 6f 62 6a    }....      obj
8ec0: 65 63 74 20 66 6f 72 65 61 63 68 20 2d 61 6c 69  ect foreach -ali
8ed0: 61 73 20 69 74 65 6d 20 24 65 6e 75 6d 65 72 61  as item $enumera
8ee0: 62 6c 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 69  ble {..        i
8ef0: 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74  f {[string lengt
8f00: 68 20 24 69 74 65 6d 5d 20 3e 20 30 7d 20 74 68  h $item] > 0} th
8f10: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
8f20: 6c 61 70 70 65 6e 64 20 72 65 73 75 6c 74 20 5b  lappend result [
8f30: 24 69 74 65 6d 20 54 6f 53 74 72 69 6e 67 5d 0d  $item ToString].
8f40: 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  .        }..    
8f50: 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65 74    }....      ret
8f60: 75 72 6e 20 24 72 65 73 75 6c 74 0d 0a 20 20 20  urn $result..   
8f70: 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
8f80: 63 61 74 63 68 41 6e 64 52 65 74 75 72 6e 20 7b  catchAndReturn {
8f90: 20 73 63 72 69 70 74 20 7b 73 74 61 63 6b 54 72   script {stackTr
8fa0: 61 63 65 20 66 61 6c 73 65 7d 20 7b 73 74 72 69  ace false} {stri
8fb0: 63 74 20 74 72 75 65 7d 20 7d 20 7b 0d 0a 20 20  ct true} } {..  
8fc0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
8fd0: 4f 54 45 3a 20 45 76 61 6c 75 61 74 65 20 74 68  OTE: Evaluate th
8fe0: 65 20 73 63 72 69 70 74 20 70 72 6f 76 69 64 65  e script provide
8ff0: 64 20 62 79 20 6f 75 72 20 63 61 6c 6c 65 72 20  d by our caller 
9000: 69 6e 20 74 68 65 69 72 20 63 6f 6e 74 65 78 74  in their context
9010: 2c 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  ,..      #      
9020: 20 63 61 70 74 75 72 69 6e 67 20 62 6f 74 68 20   capturing both 
9030: 74 68 65 20 72 65 73 75 6c 74 20 61 6e 64 20 74  the result and t
9040: 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65 2e 0d  he return code..
9050: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
9060: 73 65 74 20 63 6f 64 65 20 5b 63 61 74 63 68 20  set code [catch 
9070: 7b 75 70 6c 65 76 65 6c 20 31 20 24 73 63 72 69  {uplevel 1 $scri
9080: 70 74 7d 20 72 65 73 75 6c 74 5d 0d 0a 0d 0a 20  pt} result].... 
9090: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
90a0: 4e 4f 54 45 3a 20 44 69 64 20 74 68 65 20 73 63  NOTE: Did the sc
90b0: 72 69 70 74 20 70 72 6f 76 69 64 65 64 20 62 79  ript provided by
90c0: 20 6f 75 72 20 63 61 6c 6c 65 72 20 4e 4f 54 20   our caller NOT 
90d0: 72 61 69 73 65 20 61 6e 20 65 72 72 6f 72 3f 0d  raise an error?.
90e0: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
90f0: 69 66 20 7b 24 73 74 72 69 63 74 20 26 26 20 24  if {$strict && $
9100: 63 6f 64 65 20 3d 3d 20 30 20 7c 7c 20 21 24 73  code == 0 || !$s
9110: 74 72 69 63 74 20 26 26 20 24 63 6f 64 65 20 21  trict && $code !
9120: 3d 20 31 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  = 1} then {..   
9130: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
9140: 23 20 4e 4f 54 45 3a 20 53 75 63 63 65 73 73 2e  # NOTE: Success.
9150: 20 20 52 65 74 75 72 6e 20 61 20 6c 69 73 74 20    Return a list 
9160: 77 69 74 68 20 74 68 65 20 72 65 74 75 72 6e 20  with the return 
9170: 63 6f 64 65 20 61 6e 64 20 74 68 65 20 72 65 73  code and the res
9180: 75 6c 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  ult...        #.
9190: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
91a0: 5b 6c 69 73 74 20 24 63 6f 64 65 20 24 72 65 73  [list $code $res
91b0: 75 6c 74 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c  ult]..      } el
91c0: 73 65 69 66 20 7b 24 73 74 61 63 6b 54 72 61 63  seif {$stackTrac
91d0: 65 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  e} then {..     
91e0: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
91f0: 4e 4f 54 45 3a 20 46 61 69 6c 75 72 65 2e 20 20  NOTE: Failure.  
9200: 4f 75 72 20 63 61 6c 6c 65 72 20 77 61 6e 74 73  Our caller wants
9210: 20 61 20 66 75 6c 6c 20 73 74 61 63 6b 20 74 72   a full stack tr
9220: 61 63 65 20 28 69 66 20 61 70 70 6c 69 63 61 62  ace (if applicab
9230: 6c 65 29 2c 0d 0a 20 20 20 20 20 20 20 20 23 20  le),..        # 
9240: 20 20 20 20 20 20 72 65 74 75 72 6e 20 61 20 6c        return a l
9250: 69 73 74 20 77 69 74 68 20 74 68 65 20 72 65 74  ist with the ret
9260: 75 72 6e 20 63 6f 64 65 20 61 6e 64 20 74 68 65  urn code and the
9270: 20 72 65 73 75 6c 74 20 76 65 72 62 61 74 69 6d   result verbatim
9280: 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
9290: 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b 6c 69        return [li
92a0: 73 74 20 24 63 6f 64 65 20 24 72 65 73 75 6c 74  st $code $result
92b0: 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20  ]..      } else 
92c0: 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
92d0: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 46 61        # NOTE: Fa
92e0: 69 6c 75 72 65 2e 20 20 4f 75 72 20 63 61 6c 6c  ilure.  Our call
92f0: 65 72 20 64 6f 65 73 20 6e 6f 74 20 77 61 6e 74  er does not want
9300: 20 61 20 66 75 6c 6c 20 73 74 61 63 6b 20 74 72   a full stack tr
9310: 61 63 65 20 28 69 66 0d 0a 20 20 20 20 20 20 20  ace (if..       
9320: 20 23 20 20 20 20 20 20 20 61 70 70 6c 69 63 61   #       applica
9330: 62 6c 65 29 2c 20 72 65 74 75 72 6e 20 61 20 6c  ble), return a l
9340: 69 73 74 20 77 69 74 68 20 74 68 65 20 72 65 74  ist with the ret
9350: 75 72 6e 20 63 6f 64 65 2c 20 74 68 65 20 65 72  urn code, the er
9360: 72 6f 72 0d 0a 20 20 20 20 20 20 20 20 23 20 20  ror..        #  
9370: 20 20 20 20 20 63 6f 64 65 20 66 6f 72 20 74 68       code for th
9380: 65 20 69 6e 74 65 72 70 72 65 74 65 72 2c 20 61  e interpreter, a
9390: 6e 64 20 74 68 65 20 65 72 72 6f 72 20 6d 65 73  nd the error mes
93a0: 73 61 67 65 20 75 70 20 74 6f 20 74 68 65 0d 0a  sage up to the..
93b0: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
93c0: 70 6f 69 6e 74 20 77 68 65 72 65 20 74 68 65 20  point where the 
93d0: 73 74 61 63 6b 20 74 72 61 63 65 20 73 68 6f 75  stack trace shou
93e0: 6c 64 20 73 74 61 72 74 2e 0d 0a 20 20 20 20 20  ld start...     
93f0: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 73 65     #..        se
9400: 74 20 69 6e 64 65 78 20 5b 73 74 72 69 6e 67 20  t index [string 
9410: 66 69 72 73 74 20 22 20 20 20 61 74 20 22 20 24  first "   at " $
9420: 72 65 73 75 6c 74 5d 3b 20 23 20 48 41 43 4b 3a  result]; # HACK:
9430: 20 52 65 6c 69 61 62 6c 65 3f 0d 0a 0d 0a 20 20   Reliable?....  
9440: 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b 6c 69        return [li
9450: 73 74 20 24 63 6f 64 65 20 24 3a 3a 65 72 72 6f  st $code $::erro
9460: 72 43 6f 64 65 20 5b 65 78 70 72 20 7b 24 69 6e  rCode [expr {$in
9470: 64 65 78 20 21 3d 20 2d 31 20 3f 20 5c 0d 0a 20  dex != -1 ? \.. 
9480: 20 20 20 20 20 20 20 20 20 20 20 5b 73 74 72 69             [stri
9490: 6e 67 20 74 72 69 6d 20 5b 73 74 72 69 6e 67 20  ng trim [string 
94a0: 72 61 6e 67 65 20 24 72 65 73 75 6c 74 20 30 20  range $result 0 
94b0: 24 69 6e 64 65 78 5d 5d 20 3a 20 24 72 65 73 75  $index]] : $resu
94c0: 6c 74 7d 5d 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a  lt}]]..      }..
94d0: 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
94e0: 6f 63 20 63 6f 6d 70 69 6c 65 43 53 68 61 72 70  oc compileCSharp
94f0: 57 69 74 68 20 7b 0d 0a 20 20 20 20 20 20 20 20  With {..        
9500: 20 20 20 20 74 65 78 74 20 6d 65 6d 6f 72 79 20      text memory 
9510: 73 79 6d 62 6f 6c 73 20 73 74 72 69 63 74 20 72  symbols strict r
9520: 65 73 75 6c 74 73 56 61 72 4e 61 6d 65 20 65 72  esultsVarName er
9530: 72 6f 72 73 56 61 72 4e 61 6d 65 20 66 69 6c 65  rorsVarName file
9540: 4e 61 6d 65 73 0d 0a 20 20 20 20 20 20 20 20 20  Names..         
9550: 20 20 20 61 72 67 73 20 7d 20 7b 0d 0a 20 20 20     args } {..   
9560: 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
9570: 54 45 3a 20 53 69 6e 63 65 20 77 65 20 61 72 65  TE: Since we are
9580: 20 67 6f 69 6e 67 20 74 6f 20 75 73 65 20 74 68   going to use th
9590: 69 73 20 6d 65 74 68 6f 64 20 6e 61 6d 65 20 61  is method name a
95a0: 20 6c 6f 74 2c 20 61 73 73 69 67 6e 20 69 74 20   lot, assign it 
95b0: 74 6f 20 61 0d 0a 20 20 20 20 20 20 23 20 20 20  to a..      #   
95c0: 20 20 20 20 76 61 72 69 61 62 6c 65 20 66 69 72      variable fir
95d0: 73 74 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  st...      #..  
95e0: 20 20 20 20 73 65 74 20 61 64 64 20 52 65 66 65      set add Refe
95f0: 72 65 6e 63 65 64 41 73 73 65 6d 62 6c 69 65 73  rencedAssemblies
9600: 2e 41 64 64 0d 0a 0d 0a 20 20 20 20 20 20 23 0d  .Add....      #.
9610: 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43  .      # NOTE: C
9620: 72 65 61 74 65 20 74 68 65 20 62 61 73 65 20 63  reate the base c
9630: 6f 6d 6d 61 6e 64 20 74 6f 20 65 76 61 6c 75 61  ommand to evalua
9640: 74 65 20 61 6e 64 20 61 64 64 20 74 68 65 20 70  te and add the p
9650: 72 6f 70 65 72 74 79 20 73 65 74 74 69 6e 67 73  roperty settings
9660: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
9670: 74 68 61 74 20 61 72 65 20 61 6c 6d 6f 73 74 20  that are almost 
9680: 61 6c 77 61 79 73 20 6e 65 65 64 65 64 20 62 79  always needed by
9690: 20 6f 75 72 20 75 6e 69 74 20 74 65 73 74 73 20   our unit tests 
96a0: 28 69 2e 65 2e 20 74 68 65 20 53 79 73 74 65 6d  (i.e. the System
96b0: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
96c0: 61 6e 64 20 53 79 73 74 65 6d 2e 44 61 74 61 20  and System.Data 
96d0: 61 73 73 65 6d 62 6c 79 20 72 65 66 65 72 65 6e  assembly referen
96e0: 63 65 73 29 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  ces)...      #..
96f0: 20 20 20 20 20 20 73 65 74 20 63 6f 6d 6d 61 6e        set comman
9700: 64 20 5b 6c 69 73 74 20 63 6f 6d 70 69 6c 65 43  d [list compileC
9710: 53 68 61 72 70 20 24 74 65 78 74 20 24 6d 65 6d  Sharp $text $mem
9720: 6f 72 79 20 24 73 79 6d 62 6f 6c 73 20 24 73 74  ory $symbols $st
9730: 72 69 63 74 20 72 65 73 75 6c 74 73 20 5c 0d 0a  rict results \..
9740: 20 20 20 20 20 20 20 20 20 20 65 72 72 6f 72 73            errors
9750: 20 24 61 64 64 20 53 79 73 74 65 6d 2e 64 6c 6c   $add System.dll
9760: 20 24 61 64 64 20 53 79 73 74 65 6d 2e 44 61 74   $add System.Dat
9770: 61 2e 64 6c 6c 20 24 61 64 64 20 53 79 73 74 65  a.dll $add Syste
9780: 6d 2e 58 6d 6c 2e 64 6c 6c 5d 0d 0a 0d 0a 20 20  m.Xml.dll]....  
9790: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
97a0: 4f 54 45 3a 20 41 64 64 20 61 6c 6c 20 74 68 65  OTE: Add all the
97b0: 20 70 72 6f 76 69 64 65 64 20 66 69 6c 65 20 6e   provided file n
97c0: 61 6d 65 73 20 61 73 20 61 73 73 65 6d 62 6c 79  ames as assembly
97d0: 20 72 65 66 65 72 65 6e 63 65 73 2e 0d 0a 20 20   references...  
97e0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 66 6f 72      #..      for
97f0: 65 61 63 68 20 66 69 6c 65 4e 61 6d 65 20 24 66  each fileName $f
9800: 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20  ileNames {..    
9810: 20 20 20 20 6c 61 70 70 65 6e 64 20 63 6f 6d 6d      lappend comm
9820: 61 6e 64 20 24 61 64 64 20 5b 67 65 74 42 69 6e  and $add [getBin
9830: 61 72 79 46 69 6c 65 4e 61 6d 65 20 24 66 69 6c  aryFileName $fil
9840: 65 4e 61 6d 65 5d 0d 0a 20 20 20 20 20 20 7d 0d  eName]..      }.
9850: 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
9860: 20 20 23 20 4e 4f 54 45 3a 20 41 64 64 20 74 68    # NOTE: Add th
9870: 65 20 65 78 74 72 61 20 61 72 67 75 6d 65 6e 74  e extra argument
9880: 73 2c 20 69 66 20 61 6e 79 2c 20 74 6f 20 74 68  s, if any, to th
9890: 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 76 61  e command to eva
98a0: 6c 75 61 74 65 2e 0d 0a 20 20 20 20 20 20 23 0d  luate...      #.
98b0: 0a 20 20 20 20 20 20 65 76 61 6c 20 6c 61 70 70  .      eval lapp
98c0: 65 6e 64 20 63 6f 6d 6d 61 6e 64 20 24 61 72 67  end command $arg
98d0: 73 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  s....      #..  
98e0: 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 6c 69 61      # NOTE: Alia
98f0: 73 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 20 6c  s the compiler l
9900: 6f 63 61 6c 20 72 65 73 75 6c 74 73 20 61 6e 64  ocal results and
9910: 20 65 72 72 6f 72 73 20 76 61 72 69 61 62 6c 65   errors variable
9920: 73 20 74 6f 20 74 68 65 0d 0a 20 20 20 20 20 20  s to the..      
9930: 23 20 20 20 20 20 20 20 76 61 72 69 61 62 6c 65  #       variable
9940: 20 6e 61 6d 65 73 20 70 72 6f 76 69 64 65 64 20   names provided 
9950: 62 79 20 6f 75 72 20 63 61 6c 6c 65 72 2e 0d 0a  by our caller...
9960: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 75        #..      u
9970: 70 76 61 72 20 31 20 24 72 65 73 75 6c 74 73 56  pvar 1 $resultsV
9980: 61 72 4e 61 6d 65 20 72 65 73 75 6c 74 73 0d 0a  arName results..
9990: 20 20 20 20 20 20 75 70 76 61 72 20 31 20 24 65        upvar 1 $e
99a0: 72 72 6f 72 73 56 61 72 4e 61 6d 65 20 65 72 72  rrorsVarName err
99b0: 6f 72 73 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a  ors....      #..
99c0: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 45 76        # NOTE: Ev
99d0: 61 6c 75 61 74 65 20 74 68 65 20 63 6f 6e 73 74  aluate the const
99e0: 72 75 63 74 65 64 20 5b 63 6f 6d 70 69 6c 65 43  ructed [compileC
99f0: 53 68 61 72 70 5d 20 63 6f 6d 6d 61 6e 64 20 61  Sharp] command a
9a00: 6e 64 20 72 65 74 75 72 6e 20 74 68 65 0d 0a 20  nd return the.. 
9a10: 20 20 20 20 20 23 20 20 20 20 20 20 20 72 65 73       #       res
9a20: 75 6c 74 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ult...      #.. 
9a30: 20 20 20 20 20 65 76 61 6c 20 24 63 6f 6d 6d 61       eval $comma
9a40: 6e 64 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20  nd..    }.....  
9a50: 20 20 70 72 6f 63 20 69 73 4d 65 6d 6f 72 79 44    proc isMemoryD
9a60: 62 20 7b 20 66 69 6c 65 4e 61 6d 65 20 7d 20 7b  b { fileName } {
9a70: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
9a80: 20 23 20 4e 4f 54 45 3a 20 49 73 20 74 68 65 20   # NOTE: Is the 
9a90: 73 70 65 63 69 66 69 65 64 20 64 61 74 61 62 61  specified databa
9aa0: 73 65 20 66 69 6c 65 20 6e 61 6d 65 20 72 65 61  se file name rea
9ab0: 6c 6c 79 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79  lly an in-memory
9ac0: 20 64 61 74 61 62 61 73 65 3f 0d 0a 20 20 20 20   database?..    
9ad0: 20 20 23 0d 0a 20 20 20 20 20 20 72 65 74 75 72    #..      retur
9ae0: 6e 20 5b 65 78 70 72 20 7b 24 66 69 6c 65 4e 61  n [expr {$fileNa
9af0: 6d 65 20 65 71 20 22 3a 6d 65 6d 6f 72 79 3a 22  me eq ":memory:"
9b00: 20 7c 7c 20 5c 0d 0a 20 20 20 20 20 20 20 20 20   || \..         
9b10: 20 5b 73 74 72 69 6e 67 20 72 61 6e 67 65 20 24   [string range $
9b20: 66 69 6c 65 4e 61 6d 65 20 30 20 31 32 5d 20 65  fileName 0 12] e
9b30: 71 20 22 66 69 6c 65 3a 3a 6d 65 6d 6f 72 79 3a  q "file::memory:
9b40: 22 7d 5d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20  "}]..    }..... 
9b50: 20 20 20 70 72 6f 63 20 69 73 54 61 62 6c 65 49     proc isTableI
9b60: 6e 44 62 20 7b 20 6e 61 6d 65 20 7b 76 61 72 4e  nDb { name {varN
9b70: 61 6d 65 20 64 62 7d 20 7d 20 7b 0d 0a 20 20 20  ame db} } {..   
9b80: 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
9b90: 54 45 3a 20 52 65 66 65 72 20 74 6f 20 74 68 65  TE: Refer to the
9ba0: 20 73 70 65 63 69 66 69 65 64 20 76 61 72 69 61   specified varia
9bb0: 62 6c 65 20 28 65 2e 67 2e 20 22 64 62 22 29 20  ble (e.g. "db") 
9bc0: 69 6e 20 74 68 65 20 63 6f 6e 74 65 78 74 20 6f  in the context o
9bd0: 66 20 6f 75 72 0d 0a 20 20 20 20 20 20 23 20 20  f our..      #  
9be0: 20 20 20 20 20 63 61 6c 6c 65 72 2e 20 20 49 74       caller.  It
9bf0: 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 64 61   contains the da
9c00: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
9c10: 6e 20 68 61 6e 64 6c 65 20 74 68 61 74 20 77 69  n handle that wi
9c20: 6c 6c 20 62 65 0d 0a 20 20 20 20 20 20 23 20 20  ll be..      #  
9c30: 20 20 20 20 20 75 73 65 64 20 74 6f 20 65 78 65       used to exe
9c40: 63 75 74 65 20 74 68 65 20 71 75 65 72 79 20 75  cute the query u
9c50: 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  sed to determine
9c60: 20 69 66 20 74 68 65 20 6e 61 6d 65 64 20 74 61   if the named ta
9c70: 62 6c 65 20 69 73 0d 0a 20 20 20 20 20 20 23 20  ble is..      # 
9c80: 20 20 20 20 20 20 70 72 65 73 65 6e 74 20 69 6e        present in
9c90: 20 74 68 61 74 20 64 61 74 61 62 61 73 65 2e 0d   that database..
9ca0: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
9cb0: 75 70 76 61 72 20 31 20 24 76 61 72 4e 61 6d 65  upvar 1 $varName
9cc0: 20 64 62 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a   db....      #..
9cd0: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 45 78        # NOTE: Ex
9ce0: 65 63 75 74 65 20 74 68 65 20 53 51 4c 20 71 75  ecute the SQL qu
9cf0: 65 72 79 20 61 67 61 69 6e 73 74 20 74 68 65 20  ery against the 
9d00: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61  sqlite_master ta
9d10: 62 6c 65 20 74 6f 20 63 68 65 63 6b 20 69 66 0d  ble to check if.
9d20: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74  .      #       t
9d30: 68 65 20 6e 61 6d 65 64 20 74 61 62 6c 65 20 69  he named table i
9d40: 73 20 70 72 65 73 65 6e 74 20 61 6e 64 20 72 65  s present and re
9d50: 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66  turn non-zero if
9d60: 20 69 74 20 69 73 2e 0d 0a 20 20 20 20 20 20 23   it is...      #
9d70: 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b  ..      return [
9d80: 65 78 70 72 20 7b 5b 73 71 6c 20 65 78 65 63 75  expr {[sql execu
9d90: 74 65 20 2d 65 78 65 63 75 74 65 20 73 63 61 6c  te -execute scal
9da0: 61 72 20 24 64 62 20 5c 0d 0a 20 20 20 20 20 20  ar $db \..      
9db0: 20 20 20 20 22 53 45 4c 45 43 54 20 43 4f 55 4e      "SELECT COUN
9dc0: 54 28 2a 29 20 46 52 4f 4d 20 73 71 6c 69 74 65  T(*) FROM sqlite
9dd0: 5f 6d 61 73 74 65 72 20 57 48 45 52 45 20 74 79  _master WHERE ty
9de0: 70 65 20 3d 20 27 74 61 62 6c 65 27 20 41 4e 44  pe = 'table' AND
9df0: 20 6e 61 6d 65 20 3d 20 3f 3b 22 20 5c 0d 0a 20   name = ?;" \.. 
9e00: 20 20 20 20 20 20 20 20 20 5b 6c 69 73 74 20 70           [list p
9e10: 61 72 61 6d 31 20 53 74 72 69 6e 67 20 24 6e 61  aram1 String $na
9e20: 6d 65 5d 5d 20 3e 20 30 7d 5d 0d 0a 20 20 20 20  me]] > 0}]..    
9e30: 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 74  }.....    proc t
9e40: 72 69 6d 53 71 6c 20 7b 20 73 71 6c 20 7d 20 7b  rimSql { sql } {
9e50: 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b  ..      return [
9e60: 72 65 67 73 75 62 20 2d 61 6c 6c 20 2d 2d 20 7b  regsub -all -- {
9e70: 5c 73 2b 7d 20 5b 73 74 72 69 6e 67 20 74 72 69  \s+} [string tri
9e80: 6d 20 24 73 71 6c 5d 20 22 20 22 5d 0d 0a 20 20  m $sql] " "]..  
9e90: 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
9ea0: 20 65 78 65 63 75 74 65 53 71 6c 20 7b 20 73 71   executeSql { sq
9eb0: 6c 20 7b 65 78 65 63 75 74 65 20 6e 6f 6e 65 7d  l {execute none}
9ec0: 20 7b 66 69 6c 65 4e 61 6d 65 20 22 22 7d 20 7d   {fileName ""} }
9ed0: 20 7b 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 73   {..      if {[s
9ee0: 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 66 69  tring length $fi
9ef0: 6c 65 4e 61 6d 65 5d 20 3d 3d 20 30 7d 20 74 68  leName] == 0} th
9f00: 65 6e 20 7b 73 65 74 20 66 69 6c 65 4e 61 6d 65  en {set fileName
9f10: 20 3a 6d 65 6d 6f 72 79 3a 7d 0d 0a 20 20 20 20   :memory:}..    
9f20: 20 20 73 65 74 75 70 44 62 20 24 66 69 6c 65 4e    setupDb $fileN
9f30: 61 6d 65 20 22 22 20 22 22 20 22 22 20 22 22 20  ame "" "" "" "" 
9f40: 22 22 20 66 61 6c 73 65 20 66 61 6c 73 65 20 66  "" false false f
9f50: 61 6c 73 65 20 66 61 6c 73 65 20 6d 65 6d 44 62  alse false memDb
9f60: 0d 0a 0d 0a 20 20 20 20 20 20 74 72 79 20 7b 0d  ....      try {.
9f70: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
9f80: 5b 73 71 6c 20 65 78 65 63 75 74 65 20 2d 65 78  [sql execute -ex
9f90: 65 63 75 74 65 20 24 65 78 65 63 75 74 65 20 24  ecute $execute $
9fa0: 6d 65 6d 44 62 20 24 73 71 6c 5d 0d 0a 20 20 20  memDb $sql]..   
9fb0: 20 20 20 7d 20 66 69 6e 61 6c 6c 79 20 7b 0d 0a     } finally {..
9fc0: 20 20 20 20 20 20 20 20 63 6c 65 61 6e 75 70 44          cleanupD
9fd0: 62 20 24 66 69 6c 65 4e 61 6d 65 20 6d 65 6d 44  b $fileName memD
9fe0: 62 20 66 61 6c 73 65 20 66 61 6c 73 65 0d 0a 20  b false false.. 
9ff0: 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c       }..    }...
a000: 0d 0a 20 20 20 20 70 72 6f 63 20 73 65 74 75 70  ..    proc setup
a010: 44 62 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  Db {..          
a020: 20 20 66 69 6c 65 4e 61 6d 65 20 7b 6d 6f 64 65    fileName {mode
a030: 20 22 22 7d 20 7b 64 61 74 65 54 69 6d 65 46 6f   ""} {dateTimeFo
a040: 72 6d 61 74 20 22 22 7d 20 7b 64 61 74 65 54 69  rmat ""} {dateTi
a050: 6d 65 4b 69 6e 64 20 22 22 7d 20 7b 66 6c 61 67  meKind ""} {flag
a060: 73 20 22 22 7d 0d 0a 20 20 20 20 20 20 20 20 20  s ""}..         
a070: 20 20 20 7b 65 78 74 72 61 20 22 22 7d 20 7b 71     {extra ""} {q
a080: 75 61 6c 69 66 79 20 74 72 75 65 7d 20 7b 64 65  ualify true} {de
a090: 6c 65 74 65 20 74 72 75 65 7d 20 7b 75 72 69 20  lete true} {uri 
a0a0: 66 61 6c 73 65 7d 0d 0a 20 20 20 20 20 20 20 20  false}..        
a0b0: 20 20 20 20 7b 74 65 6d 70 6f 72 61 72 79 20 74      {temporary t
a0c0: 72 75 65 7d 20 7b 76 61 72 4e 61 6d 65 20 64 62  rue} {varName db
a0d0: 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a  } } {..      #..
a0e0: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 46 69        # NOTE: Fi
a0f0: 72 73 74 2c 20 73 65 65 20 69 66 20 6f 75 72 20  rst, see if our 
a100: 63 61 6c 6c 65 72 20 68 61 73 20 72 65 71 75 65  caller has reque
a110: 73 74 65 64 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  sted an in-memor
a120: 79 20 64 61 74 61 62 61 73 65 2e 0d 0a 20 20 20  y database...   
a130: 20 20 20 23 0d 0a 20 20 20 20 20 20 73 65 74 20     #..      set 
a140: 69 73 4d 65 6d 6f 72 79 20 5b 69 73 4d 65 6d 6f  isMemory [isMemo
a150: 72 79 44 62 20 24 66 69 6c 65 4e 61 6d 65 5d 0d  ryDb $fileName].
a160: 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
a170: 20 20 23 20 4e 4f 54 45 3a 20 46 6f 72 20 6e 6f    # NOTE: For no
a180: 77 2c 20 61 6c 6c 20 74 65 73 74 20 64 61 74 61  w, all test data
a190: 62 61 73 65 73 20 75 73 65 64 20 62 79 20 74 68  bases used by th
a1a0: 65 20 74 65 73 74 20 73 75 69 74 65 20 61 72 65  e test suite are
a1b0: 20 70 6c 61 63 65 64 0d 0a 20 20 20 20 20 20 23   placed..      #
a1c0: 20 20 20 20 20 20 20 69 6e 74 6f 20 74 68 65 20         into the 
a1d0: 64 61 74 61 62 61 73 65 20 64 69 72 65 63 74 6f  database directo
a1e0: 72 79 2e 20 20 45 61 63 68 20 64 61 74 61 62 61  ry.  Each databa
a1f0: 73 65 20 61 6e 64 20 72 65 6c 61 74 65 64 20 66  se and related f
a200: 69 6c 65 73 0d 0a 20 20 20 20 20 20 23 20 20 20  iles..      #   
a210: 20 20 20 20 75 73 65 64 20 62 79 20 61 20 74 65      used by a te
a220: 73 74 20 73 68 6f 75 6c 64 20 62 65 20 63 6c 65  st should be cle
a230: 61 6e 65 64 20 75 70 20 62 79 20 74 68 61 74 20  aned up by that 
a240: 74 65 73 74 20 75 73 69 6e 67 20 74 68 65 0d 0a  test using the..
a250: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 22 63        #       "c
a260: 6c 65 61 6e 75 70 44 62 22 20 70 72 6f 63 65 64  leanupDb" proced
a270: 75 72 65 2c 20 62 65 6c 6f 77 2e 0d 0a 20 20 20  ure, below...   
a280: 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
a290: 21 24 69 73 4d 65 6d 6f 72 79 20 26 26 20 24 71  !$isMemory && $q
a2a0: 75 61 6c 69 66 79 7d 20 74 68 65 6e 20 7b 0d 0a  ualify} then {..
a2b0: 20 20 20 20 20 20 20 20 73 65 74 20 66 69 6c 65          set file
a2c0: 4e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20  Name [file join 
a2d0: 5b 67 65 74 44 61 74 61 62 61 73 65 44 69 72 65  [getDatabaseDire
a2e0: 63 74 6f 72 79 5d 20 5b 66 69 6c 65 20 74 61 69  ctory] [file tai
a2f0: 6c 20 24 66 69 6c 65 4e 61 6d 65 5d 5d 0d 0a 20  l $fileName]].. 
a300: 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
a310: 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
a320: 20 42 79 20 64 65 66 61 75 6c 74 2c 20 64 65 6c   By default, del
a330: 65 74 65 20 61 6e 79 20 70 72 65 2d 65 78 69 73  ete any pre-exis
a340: 74 69 6e 67 20 64 61 74 61 62 61 73 65 20 77 69  ting database wi
a350: 74 68 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65  th the same file
a360: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
a370: 6e 61 6d 65 20 69 66 20 69 74 20 63 75 72 72 65  name if it curre
a380: 6e 74 6c 79 20 65 78 69 73 74 73 2e 0d 0a 20 20  ntly exists...  
a390: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20      #..      if 
a3a0: 7b 21 24 69 73 4d 65 6d 6f 72 79 20 26 26 20 24  {!$isMemory && $
a3b0: 64 65 6c 65 74 65 20 26 26 20 5b 66 69 6c 65 20  delete && [file 
a3c0: 65 78 69 73 74 73 20 24 66 69 6c 65 4e 61 6d 65  exists $fileName
a3d0: 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
a3e0: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
a3f0: 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74 20 74 6f  NOTE: Attempt to
a400: 20 64 65 6c 65 74 65 20 61 6e 79 20 70 72 65 2d   delete any pre-
a410: 65 78 69 73 74 69 6e 67 20 64 61 74 61 62 61 73  existing databas
a420: 65 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20  e with the same 
a430: 66 69 6c 65 0d 0a 20 20 20 20 20 20 20 20 23 20  file..        # 
a440: 20 20 20 20 20 20 6e 61 6d 65 2e 0d 0a 20 20 20        name...   
a450: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
a460: 69 66 20 7b 5b 63 61 74 63 68 20 7b 66 69 6c 65  if {[catch {file
a470: 20 64 65 6c 65 74 65 20 24 66 69 6c 65 4e 61 6d   delete $fileNam
a480: 65 7d 20 65 72 72 6f 72 5d 7d 20 74 68 65 6e 20  e} error]} then 
a490: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a  {..          #..
a4a0: 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45            # NOTE
a4b0: 3a 20 57 65 20 73 6f 6d 65 68 6f 77 20 66 61 69  : We somehow fai
a4c0: 6c 65 64 20 74 6f 20 64 65 6c 65 74 65 20 74 68  led to delete th
a4d0: 65 20 66 69 6c 65 2c 20 72 65 70 6f 72 74 20 77  e file, report w
a4e0: 68 79 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23  hy...          #
a4f0: 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70 75 74  ..          tput
a500: 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
a510: 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
a520: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22  .              "
a530: 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61  ==== WARNING: fa
a540: 69 6c 65 64 20 74 6f 20 64 65 6c 65 74 65 20 64  iled to delete d
a550: 61 74 61 62 61 73 65 20 66 69 6c 65 20 5c 22 22  atabase file \""
a560: 20 24 66 69 6c 65 4e 61 6d 65 20 5c 0d 0a 20 20   $fileName \..  
a570: 20 20 20 20 20 20 20 20 20 20 20 20 22 5c 22 20              "\" 
a580: 64 75 72 69 6e 67 20 73 65 74 75 70 2c 20 65 72  during setup, er
a590: 72 6f 72 3a 20 22 20 5c 6e 5c 74 20 24 65 72 72  ror: " \n\t $err
a5a0: 6f 72 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20  or \n]..        
a5b0: 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  }..      }....  
a5c0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
a5d0: 4f 54 45 3a 20 52 65 66 65 72 20 74 6f 20 74 68  OTE: Refer to th
a5e0: 65 20 73 70 65 63 69 66 69 65 64 20 76 61 72 69  e specified vari
a5f0: 61 62 6c 65 20 28 65 2e 67 2e 20 22 64 62 22 29  able (e.g. "db")
a600: 20 69 6e 20 74 68 65 20 63 6f 6e 74 65 78 74 20   in the context 
a610: 6f 66 20 6f 75 72 0d 0a 20 20 20 20 20 20 23 20  of our..      # 
a620: 20 20 20 20 20 20 63 61 6c 6c 65 72 2e 20 20 54        caller.  T
a630: 68 65 20 68 61 6e 64 6c 65 20 74 6f 20 74 68 65  he handle to the
a640: 20 6f 70 65 6e 65 64 20 64 61 74 61 62 61 73 65   opened database
a650: 20 77 69 6c 6c 20 62 65 20 73 74 6f 72 65 64 20   will be stored 
a660: 74 68 65 72 65 2e 0d 0a 20 20 20 20 20 20 23 0d  there...      #.
a670: 0a 20 20 20 20 20 20 75 70 76 61 72 20 31 20 24  .      upvar 1 $
a680: 76 61 72 4e 61 6d 65 20 64 62 0d 0a 0d 0a 20 20  varName db....  
a690: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
a6a0: 4f 54 45 3a 20 53 74 61 72 74 20 62 75 69 6c 64  OTE: Start build
a6b0: 69 6e 67 20 74 68 65 20 63 6f 6e 6e 65 63 74 69  ing the connecti
a6c0: 6f 6e 20 73 74 72 69 6e 67 2e 20 20 54 68 65 20  on string.  The 
a6d0: 6f 6e 6c 79 20 72 65 71 75 69 72 65 64 20 70 6f  only required po
a6e0: 72 74 69 6f 6e 0d 0a 20 20 20 20 20 20 23 20 20  rtion..      #  
a6f0: 20 20 20 20 20 6f 66 20 74 68 65 20 63 6f 6e 6e       of the conn
a700: 65 63 74 69 6f 6e 20 73 74 72 69 6e 67 20 69 73  ection string is
a710: 20 74 68 65 20 64 61 74 61 20 73 6f 75 72 63 65   the data source
a720: 2c 20 77 68 69 63 68 20 63 6f 6e 74 61 69 6e 73  , which contains
a730: 20 74 68 65 0d 0a 20 20 20 20 20 20 23 20 20 20   the..      #   
a740: 20 20 20 20 64 61 74 61 62 61 73 65 20 66 69 6c      database fil
a750: 65 20 6e 61 6d 65 20 69 74 73 65 6c 66 2e 20 20  e name itself.  
a760: 49 66 20 6f 75 72 20 63 61 6c 6c 65 72 20 77 61  If our caller wa
a770: 6e 74 73 20 74 6f 20 75 73 65 20 61 20 55 52 49  nts to use a URI
a780: 20 61 73 0d 0a 20 20 20 20 20 20 23 20 20 20 20   as..      #    
a790: 20 20 20 74 68 65 20 64 61 74 61 20 73 6f 75 72     the data sour
a7a0: 63 65 2c 20 75 73 65 20 74 68 65 20 46 75 6c 6c  ce, use the Full
a7b0: 55 72 69 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73  Uri connection s
a7c0: 74 72 69 6e 67 20 70 72 6f 70 65 72 74 79 20 74  tring property t
a7d0: 6f 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  o..      #      
a7e0: 20 70 72 65 76 65 6e 74 20 74 68 65 20 64 61 74   prevent the dat
a7f0: 61 20 73 6f 75 72 63 65 20 73 74 72 69 6e 67 20  a source string 
a800: 66 72 6f 6d 20 62 65 69 6e 67 20 6d 61 6e 67 6c  from being mangl
a810: 65 64 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  ed...      #..  
a820: 20 20 20 20 69 66 20 7b 24 75 72 69 7d 20 74 68      if {$uri} th
a830: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 65  en {..        se
a840: 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 7b 46 75  t connection {Fu
a850: 6c 6c 55 72 69 3d 24 7b 66 69 6c 65 4e 61 6d 65  llUri=${fileName
a860: 7d 7d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65  }}..      } else
a870: 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20   {..        set 
a880: 63 6f 6e 6e 65 63 74 69 6f 6e 20 7b 44 61 74 61  connection {Data
a890: 20 53 6f 75 72 63 65 3d 24 7b 66 69 6c 65 4e 61   Source=${fileNa
a8a0: 6d 65 7d 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d  me}}..      }...
a8b0: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
a8c0: 23 20 4e 4f 54 45 3a 20 53 69 6e 63 65 20 74 68  # NOTE: Since th
a8d0: 69 73 20 70 72 6f 63 65 64 75 72 65 20 68 61 73  is procedure has
a8e0: 20 6e 6f 20 73 70 65 63 69 61 6c 20 6b 6e 6f 77   no special know
a8f0: 6c 65 64 67 65 20 6f 66 20 77 68 61 74 20 74 68  ledge of what th
a900: 65 20 64 65 66 61 75 6c 74 0d 0a 20 20 20 20 20  e default..     
a910: 20 23 20 20 20 20 20 20 20 73 65 74 74 69 6e 67   #       setting
a920: 20 69 73 20 66 6f 72 20 74 68 65 20 54 6f 46 75   is for the ToFu
a930: 6c 6c 50 61 74 68 20 63 6f 6e 6e 65 63 74 69 6f  llPath connectio
a940: 6e 20 73 74 72 69 6e 67 20 70 72 6f 70 65 72 79  n string propery
a950: 2c 20 61 6c 77 61 79 73 0d 0a 20 20 20 20 20 20  , always..      
a960: 23 20 20 20 20 20 20 20 61 64 64 20 74 68 65 20  #       add the 
a970: 76 61 6c 75 65 20 77 65 20 6b 6e 6f 77 20 61 62  value we know ab
a980: 6f 75 74 20 74 6f 20 74 68 65 20 63 6f 6e 6e 65  out to the conne
a990: 63 74 69 6f 6e 20 73 74 72 69 6e 67 2e 0d 0a 20  ction string... 
a9a0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 61 70       #..      ap
a9b0: 70 65 6e 64 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  pend connection 
a9c0: 7b 3b 54 6f 46 75 6c 6c 50 61 74 68 3d 24 7b 71  {;ToFullPath=${q
a9d0: 75 61 6c 69 66 79 7d 7d 0d 0a 0d 0a 20 20 20 20  ualify}}....    
a9e0: 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
a9f0: 45 3a 20 49 66 20 6f 75 72 20 63 61 6c 6c 65 72  E: If our caller
aa00: 20 73 70 65 63 69 66 69 65 64 20 61 20 6a 6f 75   specified a jou
aa10: 72 6e 61 6c 20 6d 6f 64 65 2c 20 61 64 64 20 74  rnal mode, add t
aa20: 68 65 20 6e 65 63 65 73 73 61 72 79 20 70 6f 72  he necessary por
aa30: 74 69 6f 6e 0d 0a 20 20 20 20 20 20 23 20 20 20  tion..      #   
aa40: 20 20 20 20 6f 66 20 74 68 65 20 63 6f 6e 6e 65      of the conne
aa50: 63 74 69 6f 6e 20 73 74 72 69 6e 67 20 6e 6f 77  ction string now
aa60: 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
aa70: 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65    if {[string le
aa80: 6e 67 74 68 20 24 6d 6f 64 65 5d 20 3e 20 30 7d  ngth $mode] > 0}
aa90: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
aaa0: 20 61 70 70 65 6e 64 20 63 6f 6e 6e 65 63 74 69   append connecti
aab0: 6f 6e 20 7b 3b 4a 6f 75 72 6e 61 6c 20 4d 6f 64  on {;Journal Mod
aac0: 65 3d 24 7b 6d 6f 64 65 7d 7d 0d 0a 20 20 20 20  e=${mode}}..    
aad0: 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a    }....      #..
aae0: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 66        # NOTE: If
aaf0: 20 6f 75 72 20 63 61 6c 6c 65 72 20 73 70 65 63   our caller spec
ab00: 69 66 69 65 64 20 61 20 44 61 74 65 54 69 6d 65  ified a DateTime
ab10: 20 66 6f 72 6d 61 74 2c 20 61 64 64 20 74 68 65   format, add the
ab20: 20 6e 65 63 65 73 73 61 72 79 0d 0a 20 20 20 20   necessary..    
ab30: 20 20 23 20 20 20 20 20 20 20 70 6f 72 74 69 6f    #       portio
ab40: 6e 20 6f 66 20 74 68 65 20 63 6f 6e 6e 65 63 74  n of the connect
ab50: 69 6f 6e 20 73 74 72 69 6e 67 20 6e 6f 77 2e 0d  ion string now..
ab60: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
ab70: 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67  if {[string leng
ab80: 74 68 20 24 64 61 74 65 54 69 6d 65 46 6f 72 6d  th $dateTimeForm
ab90: 61 74 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d  at] > 0} then {.
aba0: 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 20  .        append 
abb0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 7b 3b 44 61 74  connection {;Dat
abc0: 65 54 69 6d 65 46 6f 72 6d 61 74 3d 24 7b 64 61  eTimeFormat=${da
abd0: 74 65 54 69 6d 65 46 6f 72 6d 61 74 7d 7d 0d 0a  teTimeFormat}}..
abe0: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
abf0: 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
ac00: 3a 20 49 66 20 6f 75 72 20 63 61 6c 6c 65 72 20  : If our caller 
ac10: 73 70 65 63 69 66 69 65 64 20 61 20 44 61 74 65  specified a Date
ac20: 54 69 6d 65 4b 69 6e 64 2c 20 61 64 64 20 74 68  TimeKind, add th
ac30: 65 20 6e 65 63 65 73 73 61 72 79 20 70 6f 72 74  e necessary port
ac40: 69 6f 6e 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ion..      #    
ac50: 20 20 20 6f 66 20 74 68 65 20 63 6f 6e 6e 65 63     of the connec
ac60: 74 69 6f 6e 20 73 74 72 69 6e 67 20 6e 6f 77 2e  tion string now.
ac70: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
ac80: 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e   if {[string len
ac90: 67 74 68 20 24 64 61 74 65 54 69 6d 65 4b 69 6e  gth $dateTimeKin
aca0: 64 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  d] > 0} then {..
acb0: 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 20 63          append c
acc0: 6f 6e 6e 65 63 74 69 6f 6e 20 7b 3b 44 61 74 65  onnection {;Date
acd0: 54 69 6d 65 4b 69 6e 64 3d 24 7b 64 61 74 65 54  TimeKind=${dateT
ace0: 69 6d 65 4b 69 6e 64 7d 7d 0d 0a 20 20 20 20 20  imeKind}}..     
acf0: 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20   }....      #.. 
ad00: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 66 20       # NOTE: If 
ad10: 74 68 65 72 65 20 61 72 65 20 61 6e 79 20 67 6c  there are any gl
ad20: 6f 62 61 6c 20 28 70 65 72 20 74 65 73 74 20 72  obal (per test r
ad30: 75 6e 29 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66  un) connection f
ad40: 6c 61 67 73 20 63 75 72 72 65 6e 74 6c 79 0d 0a  lags currently..
ad50: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 73 65        #       se
ad60: 74 2c 20 75 73 65 20 74 68 65 6d 20 6e 6f 77 20  t, use them now 
ad70: 28 69 2e 65 2e 20 62 79 20 63 6f 6d 62 69 6e 69  (i.e. by combini
ad80: 6e 67 20 74 68 65 6d 20 77 69 74 68 20 74 68 65  ng them with the
ad90: 20 6f 6e 65 73 20 66 6f 72 20 74 68 69 73 0d 0a   ones for this..
ada0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63 6f        #       co
adb0: 6e 6e 65 63 74 69 6f 6e 29 2e 0d 0a 20 20 20 20  nnection)...    
adc0: 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b    #..      if {[
add0: 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 63 6f  info exists ::co
ade0: 6e 6e 65 63 74 69 6f 6e 5f 66 6c 61 67 73 5d 20  nnection_flags] 
adf0: 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  && \..          
ae00: 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
ae10: 3a 3a 63 6f 6e 6e 65 63 74 69 6f 6e 5f 66 6c 61  ::connection_fla
ae20: 67 73 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d  gs] > 0} then {.
ae30: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
ae40: 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 68 6f 77      # NOTE: Show
ae50: 20 28 61 6e 64 20 6c 6f 67 29 20 74 68 61 74 20   (and log) that 
ae60: 77 65 20 64 65 74 65 63 74 65 64 20 73 6f 6d 65  we detected some
ae70: 20 67 6c 6f 62 61 6c 20 63 6f 6e 6e 65 63 74 69   global connecti
ae80: 6f 6e 20 66 6c 61 67 73 2e 0d 0a 20 20 20 20 20  on flags...     
ae90: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 74 70     #..        tp
aea0: 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  uts $::test_chan
aeb0: 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
aec0: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22  \..            "
aed0: 2d 2d 2d 2d 20 67 6c 6f 62 61 6c 20 63 6f 6e 6e  ---- global conn
aee0: 65 63 74 69 6f 6e 20 66 6c 61 67 73 20 64 65 74  ection flags det
aef0: 65 63 74 65 64 3a 20 22 20 24 3a 3a 63 6f 6e 6e  ected: " $::conn
af00: 65 63 74 69 6f 6e 5f 66 6c 61 67 73 20 5c 6e 5d  ection_flags \n]
af10: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  ....        #.. 
af20: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43         # NOTE: C
af30: 6f 6d 62 69 6e 65 20 61 6e 64 2f 6f 72 20 72 65  ombine and/or re
af40: 70 6c 61 63 65 20 74 68 65 20 63 6f 6e 6e 65 63  place the connec
af50: 74 69 6f 6e 20 66 6c 61 67 73 20 61 6e 64 20 74  tion flags and t
af60: 68 65 6e 20 73 68 6f 77 20 74 68 65 0d 0a 20 20  hen show the..  
af70: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 6e 65        #       ne
af80: 77 20 76 61 6c 75 65 2e 0d 0a 20 20 20 20 20 20  w value...      
af90: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 73 65 74    #..        set
afa0: 20 66 6c 61 67 73 20 5b 63 6f 6d 62 69 6e 65 46   flags [combineF
afb0: 6c 61 67 73 20 24 66 6c 61 67 73 20 24 3a 3a 63  lags $flags $::c
afc0: 6f 6e 6e 65 63 74 69 6f 6e 5f 66 6c 61 67 73 5d  onnection_flags]
afd0: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74  ....        tput
afe0: 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
aff0: 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
b000: 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d  .            "--
b010: 2d 2d 20 63 6f 6d 62 69 6e 65 64 20 63 6f 6e 6e  -- combined conn
b020: 65 63 74 69 6f 6e 20 66 6c 61 67 73 20 61 72 65  ection flags are
b030: 3a 20 22 20 24 66 6c 61 67 73 20 5c 6e 5d 0d 0a  : " $flags \n]..
b040: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
b050: 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
b060: 3a 20 49 66 20 6f 75 72 20 63 61 6c 6c 65 72 20  : If our caller 
b070: 73 70 65 63 69 66 69 65 64 20 73 6f 6d 65 20 53  specified some S
b080: 51 4c 69 74 65 43 6f 6e 6e 65 63 74 69 6f 6e 46  QLiteConnectionF
b090: 6c 61 67 73 2c 20 61 64 64 20 74 68 65 0d 0a 20  lags, add the.. 
b0a0: 20 20 20 20 20 23 20 20 20 20 20 20 20 6e 65 63       #       nec
b0b0: 65 73 73 61 72 79 20 70 6f 72 74 69 6f 6e 20 6f  essary portion o
b0c0: 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  f the connection
b0d0: 20 73 74 72 69 6e 67 20 6e 6f 77 2e 0d 0a 20 20   string now...  
b0e0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20      #..      if 
b0f0: 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20  {[string length 
b100: 24 66 6c 61 67 73 5d 20 3e 20 30 7d 20 74 68 65  $flags] > 0} the
b110: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 61 70 70  n {..        app
b120: 65 6e 64 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 7b  end connection {
b130: 3b 46 6c 61 67 73 3d 24 7b 66 6c 61 67 73 7d 7d  ;Flags=${flags}}
b140: 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
b150: 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
b160: 54 45 3a 20 49 66 20 6f 75 72 20 63 61 6c 6c 65  TE: If our calle
b170: 72 20 73 70 65 63 69 66 69 65 64 20 61 6e 20 65  r specified an e
b180: 78 74 72 61 20 70 61 79 6c 6f 61 64 20 74 6f 20  xtra payload to 
b190: 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0d 0a  the connection..
b1a0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 73 74        #       st
b1b0: 72 69 6e 67 2c 20 61 70 70 65 6e 64 20 69 74 20  ring, append it 
b1c0: 6e 6f 77 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  now...      #.. 
b1d0: 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67       if {[string
b1e0: 20 6c 65 6e 67 74 68 20 24 65 78 74 72 61 5d 20   length $extra] 
b1f0: 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  > 0} then {..   
b200: 20 20 20 20 20 61 70 70 65 6e 64 20 63 6f 6e 6e       append conn
b210: 65 63 74 69 6f 6e 20 5c 3b 20 24 65 78 74 72 61  ection \; $extra
b220: 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
b230: 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
b240: 54 45 3a 20 4f 70 65 6e 20 74 68 65 20 64 61 74  TE: Open the dat
b250: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
b260: 20 6e 6f 77 2c 20 70 6c 61 63 69 6e 67 20 74 68   now, placing th
b270: 65 20 6f 70 61 71 75 65 20 68 61 6e 64 6c 65 20  e opaque handle 
b280: 76 61 6c 75 65 0d 0a 20 20 20 20 20 20 23 20 20  value..      #  
b290: 20 20 20 20 20 69 6e 74 6f 20 74 68 65 20 76 61       into the va
b2a0: 72 69 61 62 6c 65 20 73 70 65 63 69 66 69 65 64  riable specified
b2b0: 20 62 79 20 6f 75 72 20 63 61 6c 6c 65 72 2e 0d   by our caller..
b2c0: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
b2d0: 73 65 74 20 64 62 20 5b 73 71 6c 20 6f 70 65 6e  set db [sql open
b2e0: 20 2d 74 79 70 65 20 53 51 4c 69 74 65 20 5b 73   -type SQLite [s
b2f0: 75 62 73 74 20 24 63 6f 6e 6e 65 63 74 69 6f 6e  ubst $connection
b300: 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ]]....      #.. 
b310: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 6f 6e       # NOTE: Con
b320: 66 69 67 75 72 65 20 74 68 65 20 74 65 6d 70 6f  figure the tempo
b330: 72 61 72 79 20 64 69 72 65 63 74 6f 72 79 20 66  rary directory f
b340: 6f 72 20 74 68 65 20 6e 65 77 6c 79 20 6f 70 65  or the newly ope
b350: 6e 65 64 20 64 61 74 61 62 61 73 65 0d 0a 20 20  ned database..  
b360: 20 20 20 20 23 20 20 20 20 20 20 20 63 6f 6e 6e      #       conn
b370: 65 63 74 69 6f 6e 20 6e 6f 77 20 75 6e 6c 65 73  ection now unles
b380: 73 20 6f 75 72 20 63 61 6c 6c 65 72 20 66 6f 72  s our caller for
b390: 62 69 64 73 20 69 74 2e 0d 0a 20 20 20 20 20 20  bids it...      
b3a0: 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 24 74 65  #..      if {$te
b3b0: 6d 70 6f 72 61 72 79 20 26 26 20 21 5b 69 6e 66  mporary && ![inf
b3c0: 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 73 65  o exists ::no(se
b3d0: 74 54 65 6d 70 6f 72 61 72 79 44 69 72 65 63 74  tTemporaryDirect
b3e0: 6f 72 79 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  ory)]} then {.. 
b3f0: 20 20 20 20 20 20 20 73 71 6c 20 65 78 65 63 75         sql execu
b400: 74 65 20 24 64 62 20 5b 61 70 70 65 6e 64 41 72  te $db [appendAr
b410: 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
b420: 20 20 22 50 52 41 47 4d 41 20 74 65 6d 70 5f 73    "PRAGMA temp_s
b430: 74 6f 72 65 5f 64 69 72 65 63 74 6f 72 79 20 3d  tore_directory =
b440: 20 5c 22 22 20 5b 67 65 74 54 65 6d 70 6f 72 61   \"" [getTempora
b450: 72 79 44 69 72 65 63 74 6f 72 79 5d 20 5c 22 5c  ryDirectory] \"\
b460: 3b 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  ;]..      }.... 
b470: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
b480: 4e 4f 54 45 3a 20 41 6c 77 61 79 73 20 72 65 74  NOTE: Always ret
b490: 75 72 6e 20 74 68 65 20 63 6f 6e 6e 65 63 74 69  urn the connecti
b4a0: 6f 6e 20 68 61 6e 64 6c 65 20 75 70 6f 6e 20 73  on handle upon s
b4b0: 75 63 63 65 73 73 2e 0d 0a 20 20 20 20 20 20 23  uccess...      #
b4c0: 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 24  ..      return $
b4d0: 64 62 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20  db..    }.....  
b4e0: 20 20 70 72 6f 63 20 67 65 74 44 62 43 6f 6e 6e    proc getDbConn
b4f0: 65 63 74 69 6f 6e 20 7b 20 7b 76 61 72 4e 61 6d  ection { {varNam
b500: 65 20 64 62 7d 20 7d 20 7b 0d 0a 20 20 20 20 20  e db} } {..     
b510: 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
b520: 3a 20 52 65 66 65 72 20 74 6f 20 74 68 65 20 73  : Refer to the s
b530: 70 65 63 69 66 69 65 64 20 76 61 72 69 61 62 6c  pecified variabl
b540: 65 20 28 65 2e 67 2e 20 22 64 62 22 29 20 69 6e  e (e.g. "db") in
b550: 20 74 68 65 20 63 6f 6e 74 65 78 74 20 6f 66 20   the context of 
b560: 6f 75 72 0d 0a 20 20 20 20 20 20 23 20 20 20 20  our..      #    
b570: 20 20 20 63 61 6c 6c 65 72 2e 20 20 54 68 65 20     caller.  The 
b580: 68 61 6e 64 6c 65 20 74 6f 20 74 68 65 20 64 61  handle to the da
b590: 74 61 62 61 73 65 20 70 72 65 76 69 6f 75 73 6c  tabase previousl
b5a0: 79 20 6f 70 65 6e 65 64 20 76 69 61 20 74 68 65  y opened via the
b5b0: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
b5c0: 5b 73 65 74 75 70 44 62 5d 20 70 72 6f 63 65 64  [setupDb] proced
b5d0: 75 72 65 20 73 68 6f 75 6c 64 20 62 65 20 73 74  ure should be st
b5e0: 6f 72 65 64 20 74 68 65 72 65 2e 0d 0a 20 20 20  ored there...   
b5f0: 20 20 20 23 0d 0a 20 20 20 20 20 20 75 70 76 61     #..      upva
b600: 72 20 31 20 24 76 61 72 4e 61 6d 65 20 64 62 0d  r 1 $varName db.
b610: 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
b620: 20 20 23 20 4e 4f 54 45 3a 20 54 68 69 73 20 72    # NOTE: This r
b630: 65 74 75 72 6e 73 20 74 68 65 20 41 44 4f 2e 4e  eturns the ADO.N
b640: 45 54 20 49 44 62 43 6f 6e 6e 65 63 74 69 6f 6e  ET IDbConnection
b650: 20 6f 62 6a 65 63 74 20 69 6e 73 74 61 6e 63 65   object instance
b660: 20 66 6f 72 20 74 68 65 0d 0a 20 20 20 20 20 20   for the..      
b670: 23 20 20 20 20 20 20 20 73 70 65 63 69 66 69 65  #       specifie
b680: 64 20 64 61 74 61 62 73 65 20 68 61 6e 64 6c 65  d databse handle
b690: 2e 20 20 53 69 6e 63 65 20 67 65 74 74 69 6e 67  .  Since getting
b6a0: 20 74 68 69 73 20 6f 62 6a 65 63 74 20 72 65 6c   this object rel
b6b0: 69 65 73 20 75 70 6f 6e 0d 0a 20 20 20 20 20 20  ies upon..      
b6c0: 23 20 20 20 20 20 20 20 45 61 67 6c 65 20 69 6e  #       Eagle in
b6d0: 74 65 72 6e 61 6c 73 2c 20 67 72 65 61 74 20 63  ternals, great c
b6e0: 61 72 65 20 73 68 6f 75 6c 64 20 62 65 20 74 61  are should be ta
b6f0: 6b 65 6e 20 74 6f 20 61 76 6f 69 64 20 64 69 73  ken to avoid dis
b700: 70 6f 73 69 6e 67 20 6f 66 0d 0a 20 20 20 20 20  posing of..     
b710: 20 23 20 20 20 20 20 20 20 74 68 69 73 20 6f 62   #       this ob
b720: 6a 65 63 74 20 6f 72 20 6f 74 68 65 72 77 69 73  ject or otherwis
b730: 65 20 70 75 74 74 69 6e 67 20 69 74 20 69 6e 74  e putting it int
b740: 6f 20 61 6e 20 69 6e 76 61 6c 69 64 20 73 74 61  o an invalid sta
b750: 74 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  te...      #..  
b760: 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78      if {[info ex
b770: 69 73 74 73 20 64 62 5d 7d 20 74 68 65 6e 20 7b  ists db]} then {
b780: 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63  ..        if {[c
b790: 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20  atch {..        
b7a0: 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69          object i
b7b0: 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f  nvoke -flags +No
b7c0: 6e 50 75 62 6c 69 63 20 2d 6f 62 6a 65 63 74 66  nPublic -objectf
b7d0: 6c 61 67 73 20 2b 4e 6f 44 69 73 70 6f 73 65 20  lags +NoDispose 
b7e0: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
b7f0: 20 20 20 2d 61 6c 69 61 73 20 49 6e 74 65 72 70     -alias Interp
b800: 72 65 74 65 72 2e 47 65 74 41 63 74 69 76 65 2e  reter.GetActive.
b810: 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 49 74 65 6d  connections Item
b820: 20 24 64 62 7d 20 5c 0d 0a 20 20 20 20 20 20 20   $db} \..       
b830: 20 20 20 20 20 20 20 20 20 72 65 73 75 6c 74 5d           result]
b840: 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20   == 0} then {.. 
b850: 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
b860: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 75        # NOTE: Su
b870: 63 63 65 73 73 2c 20 72 65 74 75 72 6e 20 74 68  ccess, return th
b880: 65 20 6f 70 61 71 75 65 20 6f 62 6a 65 63 74 20  e opaque object 
b890: 68 61 6e 64 6c 65 2e 0d 0a 20 20 20 20 20 20 20  handle...       
b8a0: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
b8b0: 72 65 74 75 72 6e 20 24 72 65 73 75 6c 74 0d 0a  return $result..
b8c0: 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b          } else {
b8d0: 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20  ..          #.. 
b8e0: 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a           # NOTE:
b8f0: 20 46 61 69 6c 75 72 65 2c 20 72 65 70 6f 72 74   Failure, report
b900: 20 77 68 79 2e 0d 0a 20 20 20 20 20 20 20 20 20   why...         
b910: 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70   #..          tp
b920: 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  uts $::test_chan
b930: 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
b940: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
b950: 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20   "==== WARNING: 
b960: 66 61 69 6c 65 64 20 74 6f 20 67 65 74 20 63 6f  failed to get co
b970: 6e 6e 65 63 74 69 6f 6e 20 68 61 6e 64 6c 65 20  nnection handle 
b980: 66 6f 72 20 64 61 74 61 62 61 73 65 20 5c 22 22  for database \""
b990: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
b9a0: 20 20 24 64 62 20 22 5c 22 2c 20 65 72 72 6f 72    $db "\", error
b9b0: 3a 20 22 20 5c 6e 5c 74 20 24 72 65 73 75 6c 74  : " \n\t $result
b9c0: 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d   \n]..        }.
b9d0: 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d  .      }..    }.
b9e0: 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 66 72 65  ....    proc fre
b9f0: 65 44 62 43 6f 6e 6e 65 63 74 69 6f 6e 20 7b 20  eDbConnection { 
ba00: 7b 76 61 72 4e 61 6d 65 20 63 6f 6e 6e 65 63 74  {varName connect
ba10: 69 6f 6e 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20  ion} } {..      
ba20: 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
ba30: 20 52 65 66 65 72 20 74 6f 20 74 68 65 20 73 70   Refer to the sp
ba40: 65 63 69 66 69 65 64 20 76 61 72 69 61 62 6c 65  ecified variable
ba50: 20 28 65 2e 67 2e 20 22 63 6f 6e 6e 65 63 74 69   (e.g. "connecti
ba60: 6f 6e 22 29 20 69 6e 20 74 68 65 0d 0a 20 20 20  on") in the..   
ba70: 20 20 20 23 20 20 20 20 20 20 20 63 6f 6e 74 65     #       conte
ba80: 78 74 20 6f 66 20 6f 75 72 20 63 61 6c 6c 65 72  xt of our caller
ba90: 2e 20 20 54 68 65 20 6f 70 61 71 75 65 20 6f 62  .  The opaque ob
baa0: 6a 65 63 74 20 68 61 6e 64 6c 65 20 66 6f 72 20  ject handle for 
bab0: 61 6e 20 41 44 4f 2e 4e 45 54 0d 0a 20 20 20 20  an ADO.NET..    
bac0: 20 20 23 20 20 20 20 20 20 20 63 6f 6e 6e 65 63    #       connec
bad0: 74 69 6f 6e 20 70 72 65 76 69 6f 75 73 6c 79 20  tion previously 
bae0: 72 65 74 75 72 6e 65 64 20 62 79 20 5b 67 65 74  returned by [get
baf0: 44 62 43 6f 6e 6e 65 63 74 69 6f 6e 5d 20 73 68  DbConnection] sh
bb00: 6f 75 6c 64 20 62 65 0d 0a 20 20 20 20 20 20 23  ould be..      #
bb10: 20 20 20 20 20 20 20 73 74 6f 72 65 64 20 74 68         stored th
bb20: 65 72 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ere...      #.. 
bb30: 20 20 20 20 20 75 70 76 61 72 20 31 20 24 76 61       upvar 1 $va
bb40: 72 4e 61 6d 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  rName connection
bb50: 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  ....      #..   
bb60: 20 20 20 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d     # NOTE: Attem
bb70: 70 74 20 74 6f 20 72 65 6d 6f 76 65 20 74 68 65  pt to remove the
bb80: 20 6f 70 61 71 75 65 20 6f 62 6a 65 63 74 20 68   opaque object h
bb90: 61 6e 64 6c 65 20 66 72 6f 6d 20 74 68 65 20 69  andle from the i
bba0: 6e 74 65 72 70 72 65 74 65 72 0d 0a 20 20 20 20  nterpreter..    
bbb0: 20 20 23 20 20 20 20 20 20 20 6e 6f 77 2e 20 20    #       now.  
bbc0: 54 68 69 73 20 5b 6f 62 6a 65 63 74 20 64 69 73  This [object dis
bbd0: 70 6f 73 65 5d 20 63 61 6c 6c 20 77 69 6c 6c 20  pose] call will 
bbe0: 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 64 69 73  not actually dis
bbf0: 70 6f 73 65 20 6f 66 20 74 68 65 0d 0a 20 20 20  pose of the..   
bc00: 20 20 20 23 20 20 20 20 20 20 20 75 6e 64 65 72     #       under
bc10: 6c 79 69 6e 67 20 6f 62 6a 65 63 74 20 62 65 63  lying object bec
bc20: 61 75 73 65 20 74 68 65 20 2b 4e 6f 44 69 73 70  ause the +NoDisp
bc30: 6f 73 65 20 66 6c 61 67 20 77 61 73 20 73 65 74  ose flag was set
bc40: 20 6f 6e 20 69 74 0d 0a 20 20 20 20 20 20 23 20   on it..      # 
bc50: 20 20 20 20 20 20 64 75 72 69 6e 67 20 63 72 65        during cre
bc60: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6f 70 61  ation of the opa
bc70: 71 75 65 20 6f 62 6a 65 63 74 20 68 61 6e 64 6c  que object handl
bc80: 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  e...      #..   
bc90: 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69     if {[info exi
bca0: 73 74 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 5d 20  sts connection] 
bcb0: 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  && \..          
bcc0: 5b 63 61 74 63 68 20 7b 6f 62 6a 65 63 74 20 64  [catch {object d
bcd0: 69 73 70 6f 73 65 20 24 63 6f 6e 6e 65 63 74 69  ispose $connecti
bce0: 6f 6e 7d 20 65 72 72 6f 72 5d 7d 20 74 68 65 6e  on} error]} then
bcf0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20   {..        #.. 
bd00: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 57         # NOTE: W
bd10: 65 20 73 6f 6d 65 68 6f 77 20 66 61 69 6c 65 64  e somehow failed
bd20: 20 74 6f 20 72 65 6d 6f 76 65 20 74 68 65 20 68   to remove the h
bd30: 61 6e 64 6c 65 2c 20 72 65 70 6f 72 74 20 77 68  andle, report wh
bd40: 79 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  y...        #.. 
bd50: 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
bd60: 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70  test_channel [ap
bd70: 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
bd80: 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41          "==== WA
bd90: 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20 74 6f  RNING: failed to
bda0: 20 72 65 6d 6f 76 65 20 63 6f 6e 6e 65 63 74 69   remove connecti
bdb0: 6f 6e 20 68 61 6e 64 6c 65 20 5c 22 22 20 24 63  on handle \"" $c
bdc0: 6f 6e 6e 65 63 74 69 6f 6e 20 5c 0d 0a 20 20 20  onnection \..   
bdd0: 20 20 20 20 20 20 20 20 20 22 5c 22 2c 20 65 72           "\", er
bde0: 72 6f 72 3a 20 22 20 5c 6e 5c 74 20 24 65 72 72  ror: " \n\t $err
bdf0: 6f 72 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d 0d  or \n]..      }.
be00: 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70  .    }.....    p
be10: 72 6f 63 20 61 64 64 44 62 43 6f 6e 6e 65 63 74  roc addDbConnect
be20: 69 6f 6e 20 7b 20 63 6f 6e 6e 65 63 74 69 6f 6e  ion { connection
be30: 20 7b 76 61 72 4e 61 6d 65 20 64 62 7d 20 7d 20   {varName db} } 
be40: 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  {..      #..    
be50: 20 20 23 20 4e 4f 54 45 3a 20 52 65 66 65 72 20    # NOTE: Refer 
be60: 74 6f 20 74 68 65 20 73 70 65 63 69 66 69 65 64  to the specified
be70: 20 76 61 72 69 61 62 6c 65 20 28 65 2e 67 2e 20   variable (e.g. 
be80: 22 64 62 22 29 20 69 6e 20 74 68 65 20 63 6f 6e  "db") in the con
be90: 74 65 78 74 20 6f 66 20 6f 75 72 0d 0a 20 20 20  text of our..   
bea0: 20 20 20 23 20 20 20 20 20 20 20 63 61 6c 6c 65     #       calle
beb0: 72 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  r...      #..   
bec0: 20 20 20 75 70 76 61 72 20 31 20 24 76 61 72 4e     upvar 1 $varN
bed0: 61 6d 65 20 64 62 0d 0a 0d 0a 20 20 20 20 20 20  ame db....      
bee0: 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
bef0: 20 43 72 65 61 74 65 20 61 20 63 6f 72 72 65 63   Create a correc
bf00: 74 6c 79 20 66 6f 72 6d 61 74 74 65 64 20 6e 61  tly formatted na
bf10: 6d 65 20 66 6f 72 20 74 68 65 20 64 61 74 61 62  me for the datab
bf20: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74  ase connection t
bf30: 6f 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  o..      #      
bf40: 20 62 65 20 61 64 64 65 64 20 74 6f 20 74 68 65   be added to the
bf50: 20 6c 69 73 74 20 6d 61 6e 61 67 65 64 20 62 79   list managed by
bf60: 20 74 68 65 20 45 61 67 6c 65 20 69 6e 74 65 72   the Eagle inter
bf70: 70 72 65 74 65 72 2e 0d 0a 20 20 20 20 20 20 23  preter...      #
bf80: 0d 0a 20 20 20 20 20 20 73 65 74 20 64 62 20 5b  ..      set db [
bf90: 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66  object invoke -f
bfa0: 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20  lags +NonPublic 
bfb0: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 45 61 67  \..          Eag
bfc0: 6c 65 2e 5f 43 6f 6d 70 6f 6e 65 6e 74 73 2e 50  le._Components.P
bfd0: 72 69 76 61 74 65 2e 46 6f 72 6d 61 74 4f 70 73  rivate.FormatOps
bfe0: 20 44 61 74 61 62 61 73 65 4f 62 6a 65 63 74 4e   DatabaseObjectN
bff0: 61 6d 65 20 24 63 6f 6e 6e 65 63 74 69 6f 6e 20  ame $connection 
c000: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c  \..          SQL
c010: 69 74 65 43 6f 6e 6e 65 63 74 69 6f 6e 20 5b 6f  iteConnection [o
c020: 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 49 6e 74  bject invoke Int
c030: 65 72 70 72 65 74 65 72 2e 47 65 74 41 63 74 69  erpreter.GetActi
c040: 76 65 20 4e 65 78 74 49 64 5d 5d 0d 0a 0d 0a 20  ve NextId]].... 
c050: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
c060: 4e 4f 54 45 3a 20 41 64 64 20 74 68 65 20 64 61  NOTE: Add the da
c070: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
c080: 6e 20 70 72 6f 76 69 64 65 64 20 62 79 20 6f 75  n provided by ou
c090: 72 20 63 61 6c 6c 65 72 20 74 6f 20 74 68 65 20  r caller to the 
c0a0: 6c 69 73 74 0d 0a 20 20 20 20 20 20 23 20 20 20  list..      #   
c0b0: 20 20 20 20 6f 66 20 74 68 6f 73 65 20 6b 6e 6f      of those kno
c0c0: 77 6e 20 74 6f 20 74 68 65 20 45 61 67 6c 65 20  wn to the Eagle 
c0d0: 69 6e 74 65 72 70 72 65 74 65 72 2e 0d 0a 20 20  interpreter...  
c0e0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 6f 62 6a      #..      obj
c0f0: 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67  ect invoke -flag
c100: 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 49 6e 74  s +NonPublic Int
c110: 65 72 70 72 65 74 65 72 2e 47 65 74 41 63 74 69  erpreter.GetActi
c120: 76 65 2e 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 41  ve.connections A
c130: 64 64 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  dd \..          
c140: 24 64 62 20 24 63 6f 6e 6e 65 63 74 69 6f 6e 0d  $db $connection.
c150: 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70  .    }.....    p
c160: 72 6f 63 20 63 6c 65 61 6e 75 70 44 62 20 7b 20  roc cleanupDb { 
c170: 66 69 6c 65 4e 61 6d 65 20 7b 76 61 72 4e 61 6d  fileName {varNam
c180: 65 20 64 62 7d 20 7b 63 6f 6c 6c 65 63 74 20 74  e db} {collect t
c190: 72 75 65 7d 20 7b 71 75 61 6c 69 66 79 20 74 72  rue} {qualify tr
c1a0: 75 65 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ue}..           
c1b0: 20 20 20 20 20 20 20 20 20 20 7b 64 65 6c 65 74            {delet
c1c0: 65 20 74 72 75 65 7d 20 7d 20 7b 0d 0a 20 20 20  e true} } {..   
c1d0: 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
c1e0: 54 45 3a 20 41 74 74 65 6d 70 74 20 74 6f 20 66  TE: Attempt to f
c1f0: 6f 72 63 65 20 61 6c 6c 20 70 65 6e 64 69 6e 67  orce all pending
c200: 20 22 67 61 72 62 61 67 65 22 20 6f 62 6a 65 63   "garbage" objec
c210: 74 73 20 74 6f 20 62 65 20 63 6f 6c 6c 65 63 74  ts to be collect
c220: 65 64 2c 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ed,..      #    
c230: 20 20 20 69 6e 63 6c 75 64 69 6e 67 20 53 51 4c     including SQL
c240: 69 74 65 20 73 74 61 74 65 6d 65 6e 74 73 20 61  ite statements a
c250: 6e 64 20 62 61 63 6b 75 70 20 6f 62 6a 65 63 74  nd backup object
c260: 73 3b 20 74 68 69 73 20 73 68 6f 75 6c 64 20 61  s; this should a
c270: 6c 6c 6f 77 0d 0a 20 20 20 20 20 20 23 20 20 20  llow..      #   
c280: 20 20 20 20 74 68 65 20 75 6e 64 65 72 6c 79 69      the underlyi
c290: 6e 67 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ng database file
c2a0: 20 74 6f 20 62 65 20 64 65 6c 65 74 65 64 2e 0d   to be deleted..
c2b0: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
c2c0: 69 66 20 7b 24 63 6f 6c 6c 65 63 74 7d 20 74 68  if {$collect} th
c2d0: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 63 6f  en {..        co
c2e0: 6c 6c 65 63 74 47 61 72 62 61 67 65 20 24 3a 3a  llectGarbage $::
c2f0: 74 65 73 74 5f 63 68 61 6e 6e 65 6c 0d 0a 20 20  test_channel..  
c300: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23      }....      #
c310: 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
c320: 52 65 66 65 72 20 74 6f 20 74 68 65 20 73 70 65  Refer to the spe
c330: 63 69 66 69 65 64 20 76 61 72 69 61 62 6c 65 20  cified variable 
c340: 28 65 2e 67 2e 20 22 64 62 22 29 20 69 6e 20 74  (e.g. "db") in t
c350: 68 65 20 63 6f 6e 74 65 78 74 20 6f 66 20 6f 75  he context of ou
c360: 72 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  r..      #      
c370: 20 63 61 6c 6c 65 72 2e 20 20 54 68 65 20 68 61   caller.  The ha
c380: 6e 64 6c 65 20 74 6f 20 74 68 65 20 64 61 74 61  ndle to the data
c390: 62 61 73 65 20 70 72 65 76 69 6f 75 73 6c 79 20  base previously 
c3a0: 6f 70 65 6e 65 64 20 76 69 61 20 74 68 65 0d 0a  opened via the..
c3b0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 5b 73        #       [s
c3c0: 65 74 75 70 44 62 5d 20 70 72 6f 63 65 64 75 72  etupDb] procedur
c3d0: 65 20 73 68 6f 75 6c 64 20 62 65 20 73 74 6f 72  e should be stor
c3e0: 65 64 20 74 68 65 72 65 2e 0d 0a 20 20 20 20 20  ed there...     
c3f0: 20 23 0d 0a 20 20 20 20 20 20 75 70 76 61 72 20   #..      upvar 
c400: 31 20 24 76 61 72 4e 61 6d 65 20 64 62 0d 0a 0d  1 $varName db...
c410: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
c420: 23 20 4e 4f 54 45 3a 20 43 6c 6f 73 65 20 74 68  # NOTE: Close th
c430: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20  e connection to 
c440: 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 6f 77  the database now
c450: 2e 20 20 54 68 69 73 20 73 68 6f 75 6c 64 20 61  .  This should a
c460: 6c 6c 6f 77 20 75 73 0d 0a 20 20 20 20 20 20 23  llow us..      #
c470: 20 20 20 20 20 20 20 74 6f 20 64 65 6c 65 74 65         to delete
c480: 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   the underlying 
c490: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0d 0a  database file...
c4a0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69        #..      i
c4b0: 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20  f {[info exists 
c4c0: 64 62 5d 20 26 26 20 5b 63 61 74 63 68 20 7b 73  db] && [catch {s
c4d0: 71 6c 20 63 6c 6f 73 65 20 24 64 62 7d 20 65 72  ql close $db} er
c4e0: 72 6f 72 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ror]} then {..  
c4f0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
c500: 20 23 20 4e 4f 54 45 3a 20 57 65 20 73 6f 6d 65   # NOTE: We some
c510: 68 6f 77 20 66 61 69 6c 65 64 20 74 6f 20 63 6c  how failed to cl
c520: 6f 73 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ose the database
c530: 2c 20 72 65 70 6f 72 74 20 77 68 79 2e 0d 0a 20  , report why... 
c540: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
c550: 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
c560: 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
c570: 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
c580: 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47     "==== WARNING
c590: 3a 20 66 61 69 6c 65 64 20 74 6f 20 63 6c 6f 73  : failed to clos
c5a0: 65 20 64 61 74 61 62 61 73 65 20 5c 22 22 20 24  e database \"" $
c5b0: 64 62 20 22 5c 22 2c 20 65 72 72 6f 72 3a 20 22  db "\", error: "
c5c0: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
c5d0: 5c 6e 5c 74 20 24 65 72 72 6f 72 20 5c 6e 5d 0d  \n\t $error \n].
c5e0: 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
c5f0: 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
c600: 45 3a 20 46 69 72 73 74 2c 20 73 65 65 20 69 66  E: First, see if
c610: 20 6f 75 72 20 63 61 6c 6c 65 72 20 68 61 73 20   our caller has 
c620: 72 65 71 75 65 73 74 65 64 20 61 6e 20 69 6e 2d  requested an in-
c630: 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e  memory database.
c640: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
c650: 20 73 65 74 20 69 73 4d 65 6d 6f 72 79 20 5b 69   set isMemory [i
c660: 73 4d 65 6d 6f 72 79 44 62 20 24 66 69 6c 65 4e  sMemoryDb $fileN
c670: 61 6d 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d  ame]....      #.
c680: 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 42  .      # NOTE: B
c690: 75 69 6c 64 20 74 68 65 20 66 75 6c 6c 20 70 61  uild the full pa
c6a0: 74 68 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  th to the databa
c6b0: 73 65 20 66 69 6c 65 20 6e 61 6d 65 2e 20 20 46  se file name.  F
c6c0: 6f 72 20 6e 6f 77 2c 20 61 6c 6c 20 74 65 73 74  or now, all test
c6d0: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
c6e0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 20 61  database files a
c6f0: 72 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  re stored in the
c700: 20 74 65 6d 70 6f 72 61 72 79 20 64 69 72 65 63   temporary direc
c710: 74 6f 72 79 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  tory...      #..
c720: 20 20 20 20 20 20 69 66 20 7b 21 24 69 73 4d 65        if {!$isMe
c730: 6d 6f 72 79 20 26 26 20 24 71 75 61 6c 69 66 79  mory && $qualify
c740: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
c750: 20 20 73 65 74 20 66 69 6c 65 4e 61 6d 65 20 5b    set fileName [
c760: 66 69 6c 65 20 6a 6f 69 6e 20 5b 67 65 74 44 61  file join [getDa
c770: 74 61 62 61 73 65 44 69 72 65 63 74 6f 72 79 5d  tabaseDirectory]
c780: 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 66 69 6c   [file tail $fil
c790: 65 4e 61 6d 65 5d 5d 0d 0a 20 20 20 20 20 20 7d  eName]]..      }
c7a0: 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  ....      #..   
c7b0: 20 20 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b     # NOTE: Check
c7c0: 20 69 66 20 74 68 65 20 66 69 6c 65 20 73 74 69   if the file sti
c7d0: 6c 6c 20 65 78 69 73 74 73 2e 0d 0a 20 20 20 20  ll exists...    
c7e0: 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 21    #..      if {!
c7f0: 24 69 73 4d 65 6d 6f 72 79 20 26 26 20 24 64 65  $isMemory && $de
c800: 6c 65 74 65 20 26 26 20 5b 66 69 6c 65 20 65 78  lete && [file ex
c810: 69 73 74 73 20 24 66 69 6c 65 4e 61 6d 65 5d 7d  ists $fileName]}
c820: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
c830: 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
c840: 54 45 3a 20 53 6b 69 70 20 64 65 6c 65 74 69 6e  TE: Skip deletin
c850: 67 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73  g database files
c860: 20 69 66 20 73 6f 6d 65 62 6f 64 79 20 73 65 74   if somebody set
c870: 73 20 74 68 65 20 67 6c 6f 62 61 6c 0d 0a 20 20  s the global..  
c880: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 76 61        #       va
c890: 72 69 61 62 6c 65 20 74 6f 20 70 72 65 76 65 6e  riable to preven
c8a0: 74 20 69 74 2e 0d 0a 20 20 20 20 20 20 20 20 23  t it...        #
c8b0: 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b  ..        if {![
c8c0: 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f  info exists ::no
c8d0: 28 63 6c 65 61 6e 75 70 44 62 46 69 6c 65 29 5d  (cleanupDbFile)]
c8e0: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
c8f0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
c900: 20 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74   # NOTE: Attempt
c910: 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20 74   to delete the t
c920: 65 73 74 20 64 61 74 61 62 61 73 65 20 66 69 6c  est database fil
c930: 65 20 6e 6f 77 2e 0d 0a 20 20 20 20 20 20 20 20  e now...        
c940: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 69    #..          i
c950: 66 20 7b 5b 73 65 74 20 63 6f 64 65 20 5b 63 61  f {[set code [ca
c960: 74 63 68 20 7b 66 69 6c 65 20 64 65 6c 65 74 65  tch {file delete
c970: 20 24 66 69 6c 65 4e 61 6d 65 7d 20 65 72 72 6f   $fileName} erro
c980: 72 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  r]]} then {..   
c990: 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
c9a0: 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
c9b0: 57 65 20 73 6f 6d 65 68 6f 77 20 66 61 69 6c 65  We somehow faile
c9c0: 64 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20  d to delete the 
c9d0: 66 69 6c 65 2c 20 72 65 70 6f 72 74 20 77 68 79  file, report why
c9e0: 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23  ...            #
c9f0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70  ..            tp
ca00: 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  uts $::test_chan
ca10: 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
ca20: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
ca30: 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47     "==== WARNING
ca40: 3a 20 66 61 69 6c 65 64 20 74 6f 20 64 65 6c 65  : failed to dele
ca50: 74 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  te database file
ca60: 20 5c 22 22 20 24 66 69 6c 65 4e 61 6d 65 20 5c   \"" $fileName \
ca70: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
ca80: 20 20 22 5c 22 20 64 75 72 69 6e 67 20 63 6c 65    "\" during cle
ca90: 61 6e 75 70 2c 20 65 72 72 6f 72 3a 20 22 20 5c  anup, error: " \
caa0: 6e 5c 74 20 24 65 72 72 6f 72 20 5c 6e 5d 0d 0a  n\t $error \n]..
cab0: 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
cac0: 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
cad0: 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
cae0: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 68        # NOTE: Sh
caf0: 6f 77 20 74 68 61 74 20 77 65 20 73 6b 69 70 70  ow that we skipp
cb00: 65 64 20 64 65 6c 65 74 69 6e 67 20 74 68 65 20  ed deleting the 
cb10: 66 69 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20 20  file...         
cb20: 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65   #..          se
cb30: 74 20 63 6f 64 65 20 30 0d 0a 0d 0a 20 20 20 20  t code 0....    
cb40: 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
cb50: 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70  est_channel [app
cb60: 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
cb70: 20 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57           "==== W
cb80: 41 52 4e 49 4e 47 3a 20 73 6b 69 70 70 65 64 20  ARNING: skipped 
cb90: 64 65 6c 65 74 69 6e 67 20 64 61 74 61 62 61 73  deleting databas
cba0: 65 20 66 69 6c 65 20 5c 22 22 20 24 66 69 6c 65  e file \"" $file
cbb0: 4e 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20 20 20  Name \..        
cbc0: 20 20 20 20 20 20 22 5c 22 20 64 75 72 69 6e 67        "\" during
cbd0: 20 63 6c 65 61 6e 75 70 5c 6e 22 5d 0d 0a 20 20   cleanup\n"]..  
cbe0: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d        }..      }
cbf0: 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
cc00: 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
cc10: 54 45 3a 20 54 68 65 20 66 69 6c 65 20 64 6f 65  TE: The file doe
cc20: 73 20 6e 6f 74 20 65 78 69 73 74 2c 20 73 75 63  s not exist, suc
cc30: 63 65 73 73 21 0d 0a 20 20 20 20 20 20 20 20 23  cess!..        #
cc40: 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 63 6f  ..        set co
cc50: 64 65 20 30 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d  de 0..      }...
cc60: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 63  .      return $c
cc70: 6f 64 65 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20  ode..    }..... 
cc80: 20 20 20 70 72 6f 63 20 73 65 74 75 70 44 62 49     proc setupDbI
cc90: 6e 74 65 72 72 75 70 74 43 61 6c 6c 62 61 63 6b  nterruptCallback
cca0: 20 7b 20 63 68 61 6e 6e 65 6c 20 6c 6f 67 20 7d   { channel log }
ccb0: 20 7b 0d 0a 20 20 20 20 20 20 74 70 75 74 73 20   {..      tputs 
ccc0: 24 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 73  $channel "---- s
ccd0: 65 74 74 69 6e 67 20 75 70 20 64 65 62 75 67 67  etting up debugg
cce0: 65 72 20 69 6e 74 65 72 72 75 70 74 20 63 61 6c  er interrupt cal
ccf0: 6c 62 61 63 6b 2e 2e 2e 20 22 0d 0a 0d 0a 20 20  lback... "....  
cd00: 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b      if {[catch {
cd10: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
cd20: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4d 61 6b       # NOTE: Mak
cd30: 65 20 73 75 72 65 20 74 68 65 20 73 63 72 69 70  e sure the scrip
cd40: 74 20 64 65 62 75 67 67 65 72 20 61 6e 64 20 74  t debugger and t
cd50: 68 65 20 69 73 6f 6c 61 74 65 64 20 69 6e 74 65  he isolated inte
cd60: 72 70 72 65 74 65 72 20 61 72 65 0d 0a 20 20 20  rpreter are..   
cd70: 20 20 20 20 20 23 20 20 20 20 20 20 20 73 65 74       #       set
cd80: 75 70 20 61 6e 64 20 72 65 61 64 79 20 66 6f 72  up and ready for
cd90: 20 75 73 65 2e 0d 0a 20 20 20 20 20 20 20 20 23   use...        #
cda0: 0d 0a 20 20 20 20 20 20 20 20 64 65 62 75 67 20  ..        debug 
cdb0: 73 65 74 75 70 20 74 72 75 65 20 74 72 75 65 0d  setup true true.
cdc0: 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
cdd0: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4c 6f        # NOTE: Lo
cde0: 61 64 20 74 68 65 20 6e 65 63 65 73 73 61 72 79  ad the necessary
cdf0: 20 70 61 63 6b 61 67 65 73 20 69 6e 74 6f 20 74   packages into t
ce00: 68 65 20 69 73 6f 6c 61 74 65 64 20 69 6e 74 65  he isolated inte
ce10: 72 70 72 65 74 65 72 2e 0d 0a 20 20 20 20 20 20  rpreter...      
ce20: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 64 65 62    #..        deb
ce30: 75 67 20 65 76 61 6c 20 7b 0d 0a 20 20 20 20 20  ug eval {..     
ce40: 20 20 20 20 20 70 61 63 6b 61 67 65 20 72 65 71       package req
ce50: 75 69 72 65 20 45 61 67 6c 65 0d 0a 20 20 20 20  uire Eagle..    
ce60: 20 20 20 20 20 20 70 61 63 6b 61 67 65 20 72 65        package re
ce70: 71 75 69 72 65 20 45 61 67 6c 65 2e 4c 69 62 72  quire Eagle.Libr
ce80: 61 72 79 0d 0a 20 20 20 20 20 20 20 20 20 20 70  ary..          p
ce90: 61 63 6b 61 67 65 20 72 65 71 75 69 72 65 20 45  ackage require E
cea0: 61 67 6c 65 2e 54 65 73 74 0d 0a 20 20 20 20 20  agle.Test..     
ceb0: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
cec0: 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
ced0: 45 3a 20 43 6f 70 79 20 74 68 65 20 6e 65 63 65  E: Copy the nece
cee0: 73 73 61 72 79 20 76 61 72 69 61 62 6c 65 73 20  ssary variables 
cef0: 69 6e 74 6f 20 74 68 65 20 69 73 6f 6c 61 74 65  into the isolate
cf00: 64 20 69 6e 74 65 72 70 72 65 74 65 72 2e 0d 0a  d interpreter...
cf10: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
cf20: 20 20 20 64 65 62 75 67 20 69 6e 76 6f 6b 65 20     debug invoke 
cf30: 30 20 73 65 74 20 3a 3a 74 65 73 74 5f 63 68 61  0 set ::test_cha
cf40: 6e 6e 65 6c 20 24 63 68 61 6e 6e 65 6c 3b 20 23  nnel $channel; #
cf50: 20 4e 4f 54 45 3a 20 46 6f 72 20 5b 74 70 75 74   NOTE: For [tput
cf60: 73 5d 2e 0d 0a 20 20 20 20 20 20 20 20 64 65 62  s]...        deb
cf70: 75 67 20 69 6e 76 6f 6b 65 20 30 20 73 65 74 20  ug invoke 0 set 
cf80: 3a 3a 74 65 73 74 5f 6c 6f 67 20 24 6c 6f 67 3b  ::test_log $log;
cf90: 20 23 20 4e 4f 54 45 3a 20 46 6f 72 20 5b 74 6c   # NOTE: For [tl
cfa0: 6f 67 5d 2e 0d 0a 0d 0a 20 20 20 20 20 20 20 20  og].....        
cfb0: 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
cfc0: 45 3a 20 49 6e 73 74 61 6c 6c 20 74 68 65 20 63  E: Install the c
cfd0: 61 6c 6c 62 61 63 6b 20 73 63 72 69 70 74 20 74  allback script t
cfe0: 6f 20 62 65 20 65 76 61 6c 75 61 74 65 64 20 69  o be evaluated i
cff0: 6e 20 74 68 65 20 69 73 6f 6c 61 74 65 64 0d 0a  n the isolated..
d000: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
d010: 69 6e 74 65 72 70 72 65 74 65 72 20 77 68 65 6e  interpreter when
d020: 20 74 68 69 73 20 69 6e 74 65 72 70 72 65 74 65   this interprete
d030: 72 20 69 73 20 69 6e 74 65 72 72 75 70 74 65 64  r is interrupted
d040: 20 62 79 20 73 63 72 69 70 74 0d 0a 20 20 20 20   by script..    
d050: 20 20 20 20 23 20 20 20 20 20 20 20 63 61 6e 63      #       canc
d060: 65 6c 6c 61 74 69 6f 6e 2c 20 65 74 63 2e 0d 0a  ellation, etc...
d070: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
d080: 20 20 20 64 65 62 75 67 20 63 61 6c 6c 62 61 63     debug callbac
d090: 6b 20 61 70 70 6c 79 20 7b 7b 73 65 6e 64 65 72  k apply {{sender
d0a0: 20 65 7d 20 7b 0d 0a 20 20 20 20 20 20 20 20 20   e} {..         
d0b0: 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20   #..          # 
d0c0: 4e 4f 54 45 3a 20 43 68 65 63 6b 20 69 66 20 74  NOTE: Check if t
d0d0: 68 69 73 20 63 61 6c 6c 62 61 63 6b 20 69 73 20  his callback is 
d0e0: 6f 6e 65 20 74 68 61 74 20 77 65 20 63 61 72 65  one that we care
d0f0: 20 61 62 6f 75 74 2e 0d 0a 20 20 20 20 20 20 20   about...       
d100: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
d110: 69 66 20 7b 22 43 61 6e 63 65 6c 65 64 22 20 69  if {"Canceled" i
d120: 6e 20 5b 73 70 6c 69 74 20 5b 24 65 20 49 6e 74  n [split [$e Int
d130: 65 72 72 75 70 74 54 79 70 65 5d 20 22 2c 20 22  erruptType] ", "
d140: 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
d150: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
d160: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 74        # NOTE: It
d170: 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 61 6c  erate through al
d180: 6c 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  l database conne
d190: 63 74 69 6f 6e 73 20 6b 6e 6f 77 6e 20 74 6f 20  ctions known to 
d1a0: 74 68 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20  the..           
d1b0: 20 23 20 20 20 20 20 20 20 70 61 72 65 6e 74 20   #       parent 
d1c0: 69 6e 74 65 72 70 72 65 74 65 72 2e 0d 0a 20 20  interpreter...  
d1d0: 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
d1e0: 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20           object 
d1f0: 66 6f 72 65 61 63 68 20 2d 61 6c 69 61 73 20 70  foreach -alias p
d200: 61 69 72 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  air \..         
d210: 20 20 20 20 20 20 20 5b 6f 62 6a 65 63 74 20 69         [object i
d220: 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f  nvoke -flags +No
d230: 6e 50 75 62 6c 69 63 20 24 65 20 49 6e 74 65 72  nPublic $e Inter
d240: 70 72 65 74 65 72 2e 63 6f 6e 6e 65 63 74 69 6f  preter.connectio
d250: 6e 73 5d 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  ns] {..         
d260: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
d270: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 74        # NOTE: At
d280: 74 65 6d 70 74 20 74 6f 20 63 61 6e 63 65 6c 20  tempt to cancel 
d290: 61 6e 79 20 53 51 4c 20 71 75 65 72 69 65 73 20  any SQL queries 
d2a0: 69 6e 20 70 72 6f 67 72 65 73 73 20 6f 6e 20 74  in progress on t
d2b0: 68 69 73 0d 0a 20 20 20 20 20 20 20 20 20 20 20  his..           
d2c0: 20 20 20 23 20 20 20 20 20 20 20 64 61 74 61 62     #       datab
d2d0: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0d  ase connection..
d2e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23  .              #
d2f0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
d300: 69 66 20 7b 5b 63 61 74 63 68 20 7b 24 70 61 69  if {[catch {$pai
d310: 72 20 56 61 6c 75 65 2e 43 61 6e 63 65 6c 7d 20  r Value.Cancel} 
d320: 65 72 72 6f 72 5d 20 21 3d 20 30 7d 20 74 68 65  error] != 0} the
d330: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
d340: 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
d350: 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
d360: 6e 64 41 72 67 73 20 5c 6e 20 5c 0d 0a 20 20 20  ndArgs \n \..   
d370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d380: 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20   "==== WARNING: 
d390: 66 61 69 6c 65 64 20 74 6f 20 63 61 6e 63 65 6c  failed to cancel
d3a0: 20 71 75 65 72 79 20 66 6f 72 20 63 6f 6e 6e 65   query for conne
d3b0: 63 74 69 6f 6e 20 5c 22 22 20 5c 0d 0a 20 20 20  ction \"" \..   
d3c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d3d0: 20 5b 24 70 61 69 72 20 4b 65 79 5d 20 22 5c 22   [$pair Key] "\"
d3e0: 2c 20 65 72 72 6f 72 3a 20 22 20 5c 6e 5c 74 20  , error: " \n\t 
d3f0: 24 65 72 72 6f 72 20 5c 6e 5d 0d 0a 20 20 20 20  $error \n]..    
d400: 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
d410: 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
d420: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
d430: 20 7d 7d 0d 0a 20 20 20 20 20 20 7d 20 65 72 72   }}..      } err
d440: 6f 72 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b  or] == 0} then {
d450: 0d 0a 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e  ..        addCon
d460: 73 74 72 61 69 6e 74 20 69 6e 74 65 72 72 75 70  straint interrup
d470: 74 43 61 6c 6c 62 61 63 6b 2e 73 71 6c 69 74 65  tCallback.sqlite
d480: 33 0d 0a 0d 0a 20 20 20 20 20 20 20 20 74 70 75  3....        tpu
d490: 74 73 20 24 63 68 61 6e 6e 65 6c 20 79 65 73 5c  ts $channel yes\
d4a0: 6e 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20  n..      } else 
d4b0: 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73  {..        tputs
d4c0: 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e   $channel [appen
d4d0: 64 41 72 67 73 20 22 6e 6f 2c 20 65 72 72 6f 72  dArgs "no, error
d4e0: 3a 20 22 20 5c 6e 5c 74 20 24 65 72 72 6f 72 20  : " \n\t $error 
d4f0: 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20  \n]..      }..  
d500: 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
d510: 20 63 6c 65 61 6e 75 70 46 69 6c 65 20 7b 20 66   cleanupFile { f
d520: 69 6c 65 4e 61 6d 65 20 7b 63 6f 6c 6c 65 63 74  ileName {collect
d530: 20 74 72 75 65 7d 20 7b 66 6f 72 63 65 20 66 61   true} {force fa
d540: 6c 73 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20  lse} } {..      
d550: 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
d560: 20 41 74 74 65 6d 70 74 20 74 6f 20 66 6f 72 63   Attempt to forc
d570: 65 20 61 6c 6c 20 70 65 6e 64 69 6e 67 20 22 67  e all pending "g
d580: 61 72 62 61 67 65 22 20 6f 62 6a 65 63 74 73 20  arbage" objects 
d590: 74 6f 20 62 65 20 63 6f 6c 6c 65 63 74 65 64 2c  to be collected,
d5a0: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
d5b0: 69 6e 63 6c 75 64 69 6e 67 20 53 51 4c 69 74 65  including SQLite
d5c0: 20 73 74 61 74 65 6d 65 6e 74 73 20 61 6e 64 20   statements and 
d5d0: 62 61 63 6b 75 70 20 6f 62 6a 65 63 74 73 3b 20  backup objects; 
d5e0: 74 68 69 73 20 73 68 6f 75 6c 64 20 61 6c 6c 6f  this should allo
d5f0: 77 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  w..      #      
d600: 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   the underlying 
d610: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f  database file to
d620: 20 62 65 20 64 65 6c 65 74 65 64 2e 0d 0a 20 20   be deleted...  
d630: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20      #..      if 
d640: 7b 24 63 6f 6c 6c 65 63 74 7d 20 74 68 65 6e 20  {$collect} then 
d650: 7b 0d 0a 20 20 20 20 20 20 20 20 63 6f 6c 6c 65  {..        colle
d660: 63 74 47 61 72 62 61 67 65 20 24 3a 3a 74 65 73  ctGarbage $::tes
d670: 74 5f 63 68 61 6e 6e 65 6c 0d 0a 20 20 20 20 20  t_channel..     
d680: 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20   }....      #.. 
d690: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68 65       # NOTE: Che
d6a0: 63 6b 20 69 66 20 74 68 65 20 66 69 6c 65 20 73  ck if the file s
d6b0: 74 69 6c 6c 20 65 78 69 73 74 73 2e 0d 0a 20 20  till exists...  
d6c0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20      #..      if 
d6d0: 7b 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24 66  {[file exists $f
d6e0: 69 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b  ileName]} then {
d6f0: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
d700: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 6b 69       # NOTE: Ski
d710: 70 20 64 65 6c 65 74 69 6e 67 20 74 65 73 74 20  p deleting test 
d720: 66 69 6c 65 73 20 69 66 20 73 6f 6d 65 62 6f 64  files if somebod
d730: 79 20 73 65 74 73 20 74 68 65 20 67 6c 6f 62 61  y sets the globa
d740: 6c 20 76 61 72 69 61 62 6c 65 0d 0a 20 20 20 20  l variable..    
d750: 20 20 20 20 23 20 20 20 20 20 20 20 74 6f 20 70      #       to p
d760: 72 65 76 65 6e 74 20 69 74 2e 0d 0a 20 20 20 20  revent it...    
d770: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 69      #..        i
d780: 66 20 7b 24 66 6f 72 63 65 20 7c 7c 20 21 5b 69  f {$force || ![i
d790: 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28  nfo exists ::no(
d7a0: 63 6c 65 61 6e 75 70 46 69 6c 65 29 5d 7d 20 74  cleanupFile)]} t
d7b0: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
d7c0: 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20   #..          # 
d7d0: 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74 20 74 6f  NOTE: Attempt to
d7e0: 20 64 65 6c 65 74 65 20 74 68 65 20 74 65 73 74   delete the test
d7f0: 20 66 69 6c 65 20 6e 6f 77 2e 0d 0a 20 20 20 20   file now...    
d800: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
d810: 20 20 20 69 66 20 7b 5b 73 65 74 20 63 6f 64 65     if {[set code
d820: 20 5b 63 61 74 63 68 20 7b 66 69 6c 65 20 64 65   [catch {file de
d830: 6c 65 74 65 20 24 66 69 6c 65 4e 61 6d 65 7d 20  lete $fileName} 
d840: 65 72 72 6f 72 5d 5d 7d 20 74 68 65 6e 20 7b 0d  error]]} then {.
d850: 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a  .            #..
d860: 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f              # NO
d870: 54 45 3a 20 57 65 20 73 6f 6d 65 68 6f 77 20 66  TE: We somehow f
d880: 61 69 6c 65 64 20 74 6f 20 64 65 6c 65 74 65 20  ailed to delete 
d890: 74 68 65 20 66 69 6c 65 2c 20 72 65 70 6f 72 74  the file, report
d8a0: 20 77 68 79 2e 0d 0a 20 20 20 20 20 20 20 20 20   why...         
d8b0: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
d8c0: 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
d8d0: 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
d8e0: 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
d8f0: 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52         "==== WAR
d900: 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20 74 6f 20  NING: failed to 
d910: 64 65 6c 65 74 65 20 74 65 73 74 20 66 69 6c 65  delete test file
d920: 20 5c 22 22 20 24 66 69 6c 65 4e 61 6d 65 20 5c   \"" $fileName \
d930: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
d940: 20 20 22 5c 22 20 64 75 72 69 6e 67 20 63 6c 65    "\" during cle
d950: 61 6e 75 70 2c 20 65 72 72 6f 72 3a 20 22 20 5c  anup, error: " \
d960: 6e 5c 74 20 24 65 72 72 6f 72 20 5c 6e 5d 0d 0a  n\t $error \n]..
d970: 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
d980: 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
d990: 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
d9a0: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 68        # NOTE: Sh
d9b0: 6f 77 20 74 68 61 74 20 77 65 20 73 6b 69 70 70  ow that we skipp
d9c0: 65 64 20 64 65 6c 65 74 69 6e 67 20 74 68 65 20  ed deleting the 
d9d0: 66 69 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20 20  file...         
d9e0: 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65   #..          se
d9f0: 74 20 63 6f 64 65 20 30 0d 0a 0d 0a 20 20 20 20  t code 0....    
da00: 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
da10: 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70  est_channel [app
da20: 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
da30: 20 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57           "==== W
da40: 41 52 4e 49 4e 47 3a 20 73 6b 69 70 70 65 64 20  ARNING: skipped 
da50: 64 65 6c 65 74 69 6e 67 20 74 65 73 74 20 66 69  deleting test fi
da60: 6c 65 20 5c 22 22 20 24 66 69 6c 65 4e 61 6d 65  le \"" $fileName
da70: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
da80: 20 20 22 5c 22 20 64 75 72 69 6e 67 20 63 6c 65    "\" during cle
da90: 61 6e 75 70 5c 6e 22 5d 0d 0a 20 20 20 20 20 20  anup\n"]..      
daa0: 20 20 7d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73    }..      } els
dab0: 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  e {..        #..
dac0: 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
dad0: 54 68 65 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f  The file does no
dae0: 74 20 65 78 69 73 74 2c 20 73 75 63 63 65 73 73  t exist, success
daf0: 21 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  !..        #..  
db00: 20 20 20 20 20 20 73 65 74 20 63 6f 64 65 20 30        set code 0
db10: 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
db20: 20 20 20 72 65 74 75 72 6e 20 24 63 6f 64 65 0d     return $code.
db30: 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70  .    }.....    p
db40: 72 6f 63 20 63 6f 6c 6c 65 63 74 47 61 72 62 61  roc collectGarba
db50: 67 65 20 7b 20 63 68 61 6e 6e 65 6c 20 7b 6d 69  ge { channel {mi
db60: 6c 6c 69 73 65 63 6f 6e 64 73 20 31 30 30 30 7d  lliseconds 1000}
db70: 20 7b 71 75 69 65 74 20 74 72 75 65 7d 20 7d 20   {quiet true} } 
db80: 7b 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 63 61  {..      if {[ca
db90: 74 63 68 20 7b 6f 62 6a 65 63 74 20 69 6e 76 6f  tch {object invo
dba0: 6b 65 20 47 43 20 47 65 74 54 6f 74 61 6c 4d 65  ke GC GetTotalMe
dbb0: 6d 6f 72 79 20 66 61 6c 73 65 7d 20 72 65 73 75  mory false} resu
dbc0: 6c 74 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b  lt] == 0} then {
dbd0: 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21 24  ..        if {!$
dbe0: 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20  quiet} then {.. 
dbf0: 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
dc00: 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
dc10: 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
dc20: 20 20 20 20 20 22 2d 2d 2d 2d 20 6d 65 6d 6f 72       "---- memor
dc30: 79 20 69 6e 20 75 73 65 20 62 79 20 74 68 65 20  y in use by the 
dc40: 43 4c 52 20 62 65 66 6f 72 65 20 63 6f 6c 6c 65  CLR before colle
dc50: 63 74 69 6f 6e 2e 2e 2e 20 22 20 5c 0d 0a 20 20  ction... " \..  
dc60: 20 20 20 20 20 20 20 20 20 20 20 20 24 72 65 73              $res
dc70: 75 6c 74 20 22 20 62 79 74 65 73 5c 6e 22 5d 0d  ult " bytes\n"].
dc80: 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  .        }..    
dc90: 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
dca0: 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
dcb0: 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
dcc0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 3d  ..            "=
dcd0: 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61 69  === WARNING: fai
dce0: 6c 65 64 20 74 6f 20 67 65 74 20 43 4c 52 20 6d  led to get CLR m
dcf0: 65 6d 6f 72 79 20 75 73 61 67 65 2c 20 65 72 72  emory usage, err
dd00: 6f 72 3a 20 22 20 5c 0d 0a 20 20 20 20 20 20 20  or: " \..       
dd10: 20 20 20 20 20 5c 6e 5c 74 20 24 72 65 73 75 6c       \n\t $resul
dd20: 74 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a  t \n]..      }..
dd30: 0d 0a 20 20 20 20 20 20 23 23 23 23 23 23 23 23  ..      ########
dd40: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
dd50: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
dd60: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
dd70: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
dd80: 23 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  #....      #..  
dd90: 20 20 20 20 23 20 4e 4f 54 45 3a 20 52 65 70 65      # NOTE: Repe
dda0: 61 74 65 64 6c 79 20 61 74 74 65 6d 70 74 20 74  atedly attempt t
ddb0: 6f 20 63 6f 6c 6c 65 63 74 20 67 61 72 62 61 67  o collect garbag
ddc0: 65 20 75 6e 74 69 6c 20 74 68 65 20 61 6c 6c 6f  e until the allo
ddd0: 74 74 65 64 20 6e 75 6d 62 65 72 0d 0a 20 20 20  tted number..   
dde0: 20 20 20 23 20 20 20 20 20 20 20 6f 66 20 6d 69     #       of mi
ddf0: 6c 6c 69 73 65 63 6f 6e 64 73 20 68 61 73 20 65  lliseconds has e
de00: 6c 61 70 73 65 64 2e 20 20 41 6c 77 61 79 73 20  lapsed.  Always 
de10: 61 74 74 65 6d 70 74 20 74 6f 20 63 6f 6c 6c 65  attempt to colle
de20: 63 74 20 67 61 72 62 61 67 65 0d 0a 20 20 20 20  ct garbage..    
de30: 20 20 23 20 20 20 20 20 20 20 61 74 20 6c 65 61    #       at lea
de40: 73 74 20 6f 6e 63 65 2e 0d 0a 20 20 20 20 20 20  st once...      
de50: 23 0d 0a 20 20 20 20 20 20 73 65 74 20 73 74 61  #..      set sta
de60: 72 74 20 5b 63 6c 6f 63 6b 20 73 65 63 6f 6e 64  rt [clock second
de70: 73 5d 0d 0a 20 20 20 20 20 20 73 65 74 20 73 74  s]..      set st
de80: 6f 70 20 5b 65 78 70 72 20 7b 24 73 74 61 72 74  op [expr {$start
de90: 20 2b 20 28 24 6d 69 6c 6c 69 73 65 63 6f 6e 64   + ($millisecond
dea0: 73 20 2f 20 31 30 30 30 29 7d 5d 0d 0a 0d 0a 20  s / 1000)}].... 
deb0: 20 20 20 20 20 64 6f 20 7b 0d 0a 20 20 20 20 20       do {..     
dec0: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
ded0: 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74 20 74 6f  NOTE: Attempt to
dee0: 20 66 6f 72 63 65 20 61 20 66 75 6c 6c 20 67 61   force a full ga
def0: 72 62 61 67 65 20 63 6f 6c 6c 65 63 74 69 6f 6e  rbage collection
df00: 20 6e 6f 77 2e 20 20 52 65 70 6f 72 74 20 61 6e   now.  Report an
df10: 79 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  y..        #    
df20: 20 20 20 65 72 72 6f 72 20 74 68 61 74 20 69 73     error that is
df30: 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 69 66 20   encountered if 
df40: 77 65 20 66 61 69 6c 2e 0d 0a 20 20 20 20 20 20  we fail...      
df50: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 69 66 20    #..        if 
df60: 7b 5b 63 61 74 63 68 20 7b 6f 62 6a 65 63 74 20  {[catch {object 
df70: 69 6e 76 6f 6b 65 20 47 43 20 47 65 74 54 6f 74  invoke GC GetTot
df80: 61 6c 4d 65 6d 6f 72 79 20 74 72 75 65 7d 20 65  alMemory true} e
df90: 72 72 6f 72 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  rror]} then {.. 
dfa0: 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
dfb0: 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
dfc0: 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
dfd0: 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49       "==== WARNI
dfe0: 4e 47 3a 20 66 61 69 6c 65 64 20 66 75 6c 6c 20  NG: failed full 
dff0: 67 61 72 62 61 67 65 20 63 6f 6c 6c 65 63 74 69  garbage collecti
e000: 6f 6e 2c 20 65 72 72 6f 72 3a 20 22 20 5c 0d 0a  on, error: " \..
e010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 6e                \n
e020: 5c 74 20 24 65 72 72 6f 72 20 5c 6e 5d 0d 0a 20  \t $error \n].. 
e030: 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
e040: 20 20 20 20 73 65 74 20 6e 6f 77 20 5b 63 6c 6f      set now [clo
e050: 63 6b 20 73 65 63 6f 6e 64 73 5d 0d 0a 20 20 20  ck seconds]..   
e060: 20 20 20 7d 20 77 68 69 6c 65 20 7b 24 73 74 61     } while {$sta
e070: 72 74 20 3c 3d 20 24 6e 6f 77 20 26 26 20 24 6e  rt <= $now && $n
e080: 6f 77 20 3c 20 24 73 74 6f 70 7d 0d 0a 0d 0a 20  ow < $stop}.... 
e090: 20 20 20 20 20 23 23 23 23 23 23 23 23 23 23 23       ###########
e0a0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
e0b0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
e0c0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
e0d0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0d 0a  ##############..
e0e0: 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74  ..      if {[cat
e0f0: 63 68 20 7b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b  ch {object invok
e100: 65 20 47 43 20 47 65 74 54 6f 74 61 6c 4d 65 6d  e GC GetTotalMem
e110: 6f 72 79 20 66 61 6c 73 65 7d 20 72 65 73 75 6c  ory false} resul
e120: 74 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d  t] == 0} then {.
e130: 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71  .        if {!$q
e140: 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  uiet} then {..  
e150: 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
e160: 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
e170: 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
e180: 20 20 20 20 22 2d 2d 2d 2d 20 6d 65 6d 6f 72 79      "---- memory
e190: 20 69 6e 20 75 73 65 20 62 79 20 74 68 65 20 43   in use by the C
e1a0: 4c 52 20 61 66 74 65 72 20 63 6f 6c 6c 65 63 74  LR after collect
e1b0: 69 6f 6e 2e 2e 2e 20 22 20 5c 0d 0a 20 20 20 20  ion... " \..    
e1c0: 20 20 20 20 20 20 20 20 20 20 24 72 65 73 75 6c            $resul
e1d0: 74 20 22 20 62 79 74 65 73 5c 6e 22 5d 0d 0a 20  t " bytes\n"].. 
e1e0: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
e1f0: 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
e200: 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
e210: 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
e220: 20 20 20 20 20 20 20 20 20 20 20 20 22 3d 3d 3d              "===
e230: 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65  = WARNING: faile
e240: 64 20 74 6f 20 67 65 74 20 43 4c 52 20 6d 65 6d  d to get CLR mem
e250: 6f 72 79 20 75 73 61 67 65 2c 20 65 72 72 6f 72  ory usage, error
e260: 3a 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  : " \..         
e270: 20 20 20 5c 6e 5c 74 20 24 72 65 73 75 6c 74 20     \n\t $result 
e280: 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20  \n]..      }..  
e290: 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
e2a0: 20 67 65 74 53 51 4c 69 74 65 48 61 6e 64 6c 65   getSQLiteHandle
e2b0: 43 6f 75 6e 74 73 20 7b 20 63 68 61 6e 6e 65 6c  Counts { channel
e2c0: 20 7b 71 75 69 65 74 20 66 61 6c 73 65 7d 20 7d   {quiet false} }
e2d0: 20 7b 0d 0a 20 20 20 20 20 20 73 65 74 20 72 65   {..      set re
e2e0: 73 75 6c 74 20 5b 6c 69 73 74 5d 0d 0a 0d 0a 20  sult [list].... 
e2f0: 20 20 20 20 20 69 66 20 7b 5b 68 61 76 65 43 6f       if {[haveCo
e300: 6e 73 74 72 61 69 6e 74 20 5c 0d 0a 20 20 20 20  nstraint \..    
e310: 20 20 20 20 20 20 20 20 20 20 64 65 66 69 6e 65            define
e320: 43 6f 6e 73 74 61 6e 74 2e 53 79 73 74 65 6d 2e  Constant.System.
e330: 44 61 74 61 2e 53 51 4c 69 74 65 2e 43 4f 55 4e  Data.SQLite.COUN
e340: 54 5f 48 41 4e 44 4c 45 5d 7d 20 74 68 65 6e 20  T_HANDLE]} then 
e350: 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
e360: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 64        # NOTE: Ad
e370: 64 20 65 61 63 68 20 63 72 69 74 69 63 61 6c 20  d each critical 
e380: 68 61 6e 64 6c 65 20 63 6f 75 6e 74 20 74 6f 20  handle count to 
e390: 74 68 65 20 72 65 73 75 6c 74 69 6e 67 20 6c 69  the resulting li
e3a0: 73 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  st...        #..
e3b0: 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20          foreach 
e3c0: 6e 61 6d 65 20 5b 6c 69 73 74 20 63 6f 6e 6e 65  name [list conne
e3d0: 63 74 69 6f 6e 43 6f 75 6e 74 20 73 74 61 74 65  ctionCount state
e3e0: 6d 65 6e 74 43 6f 75 6e 74 20 62 61 63 6b 75 70  mentCount backup
e3f0: 43 6f 75 6e 74 5d 20 7b 0d 0a 20 20 20 20 20 20  Count] {..      
e400: 20 20 20 20 73 65 74 20 76 61 6c 75 65 20 5b 6f      set value [o
e410: 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c  bject invoke -fl
e420: 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c  ags +NonPublic \
e430: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
e440: 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
e450: 74 65 2e 55 6e 73 61 66 65 4e 61 74 69 76 65 4d  te.UnsafeNativeM
e460: 65 74 68 6f 64 73 20 24 6e 61 6d 65 5d 0d 0a 0d  ethods $name]...
e470: 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21  .          if {!
e480: 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a  $quiet} then {..
e490: 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
e4a0: 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  s $channel [appe
e4b0: 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
e4c0: 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
e4d0: 63 72 69 74 69 63 61 6c 20 68 61 6e 64 6c 65 20  critical handle 
e4e0: 63 6f 75 6e 74 20 5c 22 22 20 24 6e 61 6d 65 20  count \"" $name 
e4f0: 22 5c 22 20 69 73 20 22 20 24 76 61 6c 75 65 20  "\" is " $value 
e500: 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  \n]..          }
e510: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 6c 61  ....          la
e520: 70 70 65 6e 64 20 72 65 73 75 6c 74 20 24 76 61  ppend result $va
e530: 6c 75 65 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  lue..        }..
e540: 20 20 20 20 20 20 7d 20 65 6c 73 65 69 66 20 7b        } elseif {
e550: 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d  !$quiet} then {.
e560: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
e570: 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 65 20      # NOTE: The 
e580: 61 63 74 75 61 6c 20 68 61 6e 64 6c 65 20 63 6f  actual handle co
e590: 75 6e 74 73 20 61 72 65 20 6e 6f 74 20 61 76 61  unts are not ava
e5a0: 69 6c 61 62 6c 65 3b 20 74 68 65 72 65 66 6f 72  ilable; therefor
e5b0: 65 2c 20 6a 75 73 74 0d 0a 20 20 20 20 20 20 20  e, just..       
e5c0: 20 23 20 20 20 20 20 20 20 72 65 74 75 72 6e 20   #       return 
e5d0: 61 6e 20 65 6d 70 74 79 20 6c 69 73 74 2e 0d 0a  an empty list...
e5e0: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
e5f0: 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
e600: 6c 20 22 2d 2d 2d 2d 20 63 72 69 74 69 63 61 6c  l "---- critical
e610: 20 68 61 6e 64 6c 65 20 63 6f 75 6e 74 73 20 75   handle counts u
e620: 6e 61 76 61 69 6c 61 62 6c 65 5c 6e 22 0d 0a 20  navailable\n".. 
e630: 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
e640: 72 65 74 75 72 6e 20 24 72 65 73 75 6c 74 0d 0a  return $result..
e650: 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
e660: 6f 63 20 73 68 75 74 64 6f 77 6e 53 51 4c 69 74  oc shutdownSQLit
e670: 65 20 7b 20 63 68 61 6e 6e 65 6c 20 7b 66 6f 72  e { channel {for
e680: 63 65 20 66 61 6c 73 65 7d 20 7b 71 75 69 65 74  ce false} {quiet
e690: 20 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a 20 20 20   false} } {..   
e6a0: 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
e6b0: 54 45 3a 20 4d 61 6b 65 20 73 75 72 65 20 74 68  TE: Make sure th
e6c0: 61 74 20 53 51 4c 69 74 65 20 63 6f 72 65 20 6c  at SQLite core l
e6d0: 69 62 72 61 72 79 20 69 73 20 63 6f 6d 70 6c 65  ibrary is comple
e6e0: 74 65 6c 79 20 73 68 75 74 64 6f 77 6e 2e 20 20  tely shutdown.  
e6f0: 54 68 69 73 0d 0a 20 20 20 20 20 20 23 20 20 20  This..      #   
e700: 20 20 20 20 69 73 20 75 73 65 64 20 62 79 20 74      is used by t
e710: 65 73 74 73 20 74 68 61 74 20 63 68 61 6e 67 65  ests that change
e720: 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 6f   configuration o
e730: 70 74 69 6f 6e 73 20 61 6e 64 2f 6f 72 20 74 68  ptions and/or th
e740: 6f 73 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ose..      #    
e750: 20 20 20 74 68 61 74 20 6e 65 65 64 20 74 6f 20     that need to 
e760: 6d 61 6b 65 20 73 75 72 65 20 6c 6f 67 67 69 6e  make sure loggin
e770: 67 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64  g is initialized
e780: 20 28 69 2e 65 2e 20 6a 75 73 74 20 69 6e 20 63   (i.e. just in c
e790: 61 73 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ase..      #    
e7a0: 20 20 20 74 68 65 20 53 51 4c 69 74 65 20 63 6f     the SQLite co
e7b0: 72 65 20 6c 69 62 72 61 72 79 20 77 61 73 20 69  re library was i
e7c0: 6e 69 74 69 61 6c 69 7a 65 64 20 69 6e 20 74 68  nitialized in th
e7d0: 65 20 70 72 6f 63 65 73 73 20 70 72 69 6f 72 20  e process prior 
e7e0: 74 6f 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  to..      #     
e7f0: 20 20 74 68 65 20 53 51 4c 69 74 65 4c 6f 67 20    the SQLiteLog 
e800: 63 6c 61 73 73 20 62 65 69 6e 67 20 61 62 6c 65  class being able
e810: 20 74 6f 20 73 65 74 75 70 20 69 74 73 20 6c 6f   to setup its lo
e820: 67 67 69 6e 67 20 63 61 6c 6c 62 61 63 6b 29 2e  gging callback).
e830: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
e840: 4e 6f 72 6d 61 6c 6c 79 2c 20 74 68 69 73 20 73  Normally, this s
e850: 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20 70 65  hould only be pe
e860: 72 66 6f 72 6d 65 64 20 69 66 20 53 51 4c 69 74  rformed if SQLit
e870: 65 20 69 73 20 6c 6f 61 64 65 64 20 61 6e 64 0d  e is loaded and.
e880: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 72  .      #       r
e890: 65 61 64 79 20 66 6f 72 20 75 73 65 20 62 79 20  eady for use by 
e8a0: 74 68 65 20 74 65 73 74 20 73 75 69 74 65 2e 0d  the test suite..
e8b0: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
e8c0: 69 66 20 7b 24 66 6f 72 63 65 20 7c 7c 20 5b 69  if {$force || [i
e8d0: 73 53 51 4c 69 74 65 52 65 61 64 79 5d 7d 20 74  sSQLiteReady]} t
e8e0: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  hen {..        #
e8f0: 0d 0a 20 20 20 20 20 20 20 20 23 20 42 55 47 46  ..        # BUGF
e900: 49 58 3a 20 42 65 66 6f 72 65 20 63 61 6c 6c 69  IX: Before calli
e910: 6e 67 20 74 68 65 20 6e 61 74 69 76 65 20 73 68  ng the native sh
e920: 75 74 64 6f 77 6e 20 66 75 6e 63 74 69 6f 6e 2c  utdown function,
e930: 20 6d 61 6b 65 20 73 75 72 65 20 62 6f 74 68 0d   make sure both.
e940: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
e950: 20 20 20 6f 66 20 74 68 65 20 50 52 41 47 4d 41     of the PRAGMA
e960: 20 72 65 6c 61 74 65 64 20 64 69 72 65 63 74 6f   related directo
e970: 72 79 20 6e 61 6d 65 73 20 61 72 65 20 66 72 65  ry names are fre
e980: 65 64 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  ed...        #..
e990: 20 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72          checkFor
e9a0: 53 51 4c 69 74 65 44 69 72 65 63 74 6f 72 69 65  SQLiteDirectorie
e9b0: 73 20 24 63 68 61 6e 6e 65 6c 20 74 72 75 65 0d  s $channel true.
e9c0: 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b  ...        if {[
e9d0: 63 61 74 63 68 20 7b 6f 62 6a 65 63 74 20 69 6e  catch {object in
e9e0: 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e  voke -flags +Non
e9f0: 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20  Public \..      
ea00: 20 20 20 20 20 20 20 20 20 20 53 79 73 74 65 6d            System
ea10: 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 55 6e 73  .Data.SQLite.Uns
ea20: 61 66 65 4e 61 74 69 76 65 4d 65 74 68 6f 64 73  afeNativeMethods
ea30: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
ea40: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 68 75 74      sqlite3_shut
ea50: 64 6f 77 6e 7d 20 72 65 73 75 6c 74 5d 20 3d 3d  down} result] ==
ea60: 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
ea70: 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65        if {!$quie
ea80: 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  t} then {..     
ea90: 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
eaa0: 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
eab0: 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
eac0: 20 20 20 20 20 22 2d 2d 2d 2d 20 63 61 6c 6c 20       "---- call 
ead0: 73 71 6c 69 74 65 33 5f 73 68 75 74 64 6f 77 6e  sqlite3_shutdown
eae0: 28 29 2e 2e 2e 20 6f 6b 3a 20 22 20 24 72 65 73  ()... ok: " $res
eaf0: 75 6c 74 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20  ult \n]..       
eb00: 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 20     }..        } 
eb10: 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
eb20: 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74    if {!$quiet} t
eb30: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
eb40: 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
eb50: 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
eb60: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
eb70: 20 22 2d 2d 2d 2d 20 63 61 6c 6c 20 73 71 6c 69   "---- call sqli
eb80: 74 65 33 5f 73 68 75 74 64 6f 77 6e 28 29 2e 2e  te3_shutdown()..
eb90: 2e 20 65 72 72 6f 72 3a 20 22 20 5c 6e 5c 74 20  . error: " \n\t 
eba0: 24 72 65 73 75 6c 74 20 5c 6e 5d 0d 0a 20 20 20  $result \n]..   
ebb0: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
ebc0: 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20    }..      }..  
ebd0: 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
ebe0: 20 72 65 70 6f 72 74 53 51 4c 69 74 65 52 65 73   reportSQLiteRes
ebf0: 6f 75 72 63 65 73 20 7b 20 63 68 61 6e 6e 65 6c  ources { channel
ec00: 20 7b 71 75 69 65 74 20 66 61 6c 73 65 7d 20 7b   {quiet false} {
ec10: 63 6f 6c 6c 65 63 74 20 74 72 75 65 7d 20 7d 20  collect true} } 
ec20: 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  {..      #..    
ec30: 20 20 23 20 4e 4f 54 45 3a 20 53 6b 69 70 20 61    # NOTE: Skip a
ec40: 6c 6c 20 6f 75 74 70 75 74 20 69 66 20 77 65 20  ll output if we 
ec50: 61 72 65 20 72 75 6e 6e 69 6e 67 20 69 6e 20 22  are running in "
ec60: 71 75 69 65 74 22 20 6d 6f 64 65 2e 0d 0a 20 20  quiet" mode...  
ec70: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20      #..      if 
ec80: 7b 5b 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74  {[haveConstraint
ec90: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
eca0: 20 20 64 65 66 69 6e 65 43 6f 6e 73 74 61 6e 74    defineConstant
ecb0: 2e 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c  .System.Data.SQL
ecc0: 69 74 65 2e 49 4e 54 45 52 4f 50 5f 56 49 52 54  ite.INTEROP_VIRT
ecd0: 55 41 4c 5f 54 41 42 4c 45 5d 20 26 26 20 5c 0d  UAL_TABLE] && \.
ece0: 0a 20 20 20 20 20 20 20 20 20 20 5b 68 61 76 65  .          [have
ecf0: 43 6f 6e 73 74 72 61 69 6e 74 20 5c 0d 0a 20 20  Constraint \..  
ed00: 20 20 20 20 20 20 20 20 20 20 20 20 64 65 66 69              defi
ed10: 6e 65 43 6f 6e 73 74 61 6e 74 2e 53 79 73 74 65  neConstant.Syste
ed20: 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 54 52  m.Data.SQLite.TR
ed30: 41 43 4b 5f 4d 45 4d 4f 52 59 5f 42 59 54 45 53  ACK_MEMORY_BYTES
ed40: 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
ed50: 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20     if {!$quiet} 
ed60: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
ed70: 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
ed80: 20 22 2d 2d 2d 2d 20 63 75 72 72 65 6e 74 20 6d   "---- current m
ed90: 65 6d 6f 72 79 20 69 6e 20 75 73 65 20 62 79 20  emory in use by 
eda0: 53 51 4c 69 74 65 4d 65 6d 6f 72 79 2e 2e 2e 20  SQLiteMemory... 
edb0: 22 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  "..        }....
edc0: 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74          if {[cat
edd0: 63 68 20 7b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b  ch {object invok
ede0: 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62  e -flags +NonPub
edf0: 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  lic \..         
ee00: 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61         System.Da
ee10: 74 61 2e 53 51 4c 69 74 65 2e 53 51 4c 69 74 65  ta.SQLite.SQLite
ee20: 4d 65 6d 6f 72 79 20 5c 0d 0a 20 20 20 20 20 20  Memory \..      
ee30: 20 20 20 20 20 20 20 20 20 20 62 79 74 65 73 41            bytesA
ee40: 6c 6c 6f 63 61 74 65 64 7d 20 6d 65 6d 6f 72 79  llocated} memory
ee50: 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  ] == 0} then {..
ee60: 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 24            if {!$
ee70: 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20  quiet} then {.. 
ee80: 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
ee90: 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e   $channel [appen
eea0: 64 41 72 67 73 20 24 6d 65 6d 6f 72 79 20 22 20  dArgs $memory " 
eeb0: 62 79 74 65 73 5c 6e 22 5d 0d 0a 20 20 20 20 20  bytes\n"]..     
eec0: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
eed0: 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
eee0: 20 20 20 20 73 65 74 20 6d 65 6d 6f 72 79 20 75      set memory u
eef0: 6e 6b 6e 6f 77 6e 0d 0a 0d 0a 20 20 20 20 20 20  nknown....      
ef00: 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d      if {!$quiet}
ef10: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
ef20: 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
ef30: 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
ef40: 24 6d 65 6d 6f 72 79 20 5c 6e 5d 0d 0a 20 20 20  $memory \n]..   
ef50: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
ef60: 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69    }....        i
ef70: 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e  f {!$quiet} then
ef80: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70   {..          tp
ef90: 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 22 2d 2d  uts $channel "--
efa0: 2d 2d 20 6d 61 78 69 6d 75 6d 20 6d 65 6d 6f 72  -- maximum memor
efb0: 79 20 69 6e 20 75 73 65 20 62 79 20 53 51 4c 69  y in use by SQLi
efc0: 74 65 4d 65 6d 6f 72 79 2e 2e 2e 20 22 0d 0a 20  teMemory... ".. 
efd0: 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
efe0: 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b      if {[catch {
eff0: 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66  object invoke -f
f000: 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20  lags +NonPublic 
f010: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
f020: 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53     System.Data.S
f030: 51 4c 69 74 65 2e 53 51 4c 69 74 65 4d 65 6d 6f  QLite.SQLiteMemo
f040: 72 79 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  ry \..          
f050: 20 20 20 20 20 20 6d 61 78 69 6d 75 6d 42 79 74        maximumByt
f060: 65 73 41 6c 6c 6f 63 61 74 65 64 7d 20 6d 65 6d  esAllocated} mem
f070: 6f 72 79 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20  ory] == 0} then 
f080: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20  {..          if 
f090: 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b  {!$quiet} then {
f0a0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70  ..            tp
f0b0: 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70  uts $channel [ap
f0c0: 70 65 6e 64 41 72 67 73 20 24 6d 65 6d 6f 72 79  pendArgs $memory
f0d0: 20 22 20 62 79 74 65 73 5c 6e 22 5d 0d 0a 20 20   " bytes\n"]..  
f0e0: 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
f0f0: 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
f100: 20 20 20 20 20 20 20 73 65 74 20 6d 65 6d 6f 72         set memor
f110: 79 20 75 6e 6b 6e 6f 77 6e 0d 0a 0d 0a 20 20 20  y unknown....   
f120: 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69         if {!$qui
f130: 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  et} then {..    
f140: 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
f150: 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
f160: 67 73 20 24 6d 65 6d 6f 72 79 20 5c 6e 5d 0d 0a  gs $memory \n]..
f170: 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
f180: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d       }..      }.
f190: 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 21 24 71  ...      if {!$q
f1a0: 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  uiet} then {..  
f1b0: 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
f1c0: 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 63 75 72 72 65  nnel "---- curre
f1d0: 6e 74 20 6d 65 6d 6f 72 79 20 69 6e 20 75 73 65  nt memory in use
f1e0: 20 62 79 20 53 51 4c 69 74 65 2e 2e 2e 20 22 0d   by SQLite... ".
f1f0: 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
f200: 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 6f 62    if {[catch {ob
f210: 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61  ject invoke -fla
f220: 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d  gs +NonPublic \.
f230: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53  .              S
f240: 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
f250: 65 2e 55 6e 73 61 66 65 4e 61 74 69 76 65 4d 65  e.UnsafeNativeMe
f260: 74 68 6f 64 73 20 5c 0d 0a 20 20 20 20 20 20 20  thods \..       
f270: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d         sqlite3_m
f280: 65 6d 6f 72 79 5f 75 73 65 64 7d 20 6d 65 6d 6f  emory_used} memo
f290: 72 79 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b  ry] == 0} then {
f2a0: 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21 24  ..        if {!$
f2b0: 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20  quiet} then {.. 
f2c0: 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
f2d0: 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
f2e0: 72 67 73 20 24 6d 65 6d 6f 72 79 20 22 20 62 79  rgs $memory " by
f2f0: 74 65 73 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20  tes\n"]..       
f300: 20 7d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65   }..      } else
f310: 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20   {..        #.. 
f320: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4d         # NOTE: M
f330: 61 79 62 65 20 74 68 65 20 53 51 4c 69 74 65 20  aybe the SQLite 
f340: 63 6f 72 65 20 6c 69 62 72 61 72 79 20 69 73 20  core library is 
f350: 75 6e 61 76 61 69 6c 61 62 6c 65 3f 0d 0a 20 20  unavailable?..  
f360: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
f370: 20 73 65 74 20 6d 65 6d 6f 72 79 20 75 6e 6b 6e   set memory unkn
f380: 6f 77 6e 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69  own....        i
f390: 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e  f {!$quiet} then
f3a0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70   {..          tp
f3b0: 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70  uts $channel [ap
f3c0: 70 65 6e 64 41 72 67 73 20 24 6d 65 6d 6f 72 79  pendArgs $memory
f3d0: 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d   \n]..        }.
f3e0: 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
f3f0: 20 20 73 65 74 20 72 65 73 75 6c 74 20 24 6d 65    set result $me
f400: 6d 6f 72 79 3b 20 23 20 4e 4f 54 45 3a 20 52 65  mory; # NOTE: Re
f410: 74 75 72 6e 20 6d 65 6d 6f 72 79 20 69 6e 2d 75  turn memory in-u
f420: 73 65 20 74 6f 20 6f 75 72 20 63 61 6c 6c 65 72  se to our caller
f430: 2e 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 21  .....      if {!
f440: 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a  $quiet} then {..
f450: 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
f460: 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 6d 61 78  hannel "---- max
f470: 69 6d 75 6d 20 6d 65 6d 6f 72 79 20 69 6e 20 75  imum memory in u
f480: 73 65 20 62 79 20 53 51 4c 69 74 65 2e 2e 2e 20  se by SQLite... 
f490: 22 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  "..      }....  
f4a0: 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b      if {[catch {
f4b0: 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66  object invoke -f
f4c0: 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20  lags +NonPublic 
f4d0: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
f4e0: 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c   System.Data.SQL
f4f0: 69 74 65 2e 55 6e 73 61 66 65 4e 61 74 69 76 65  ite.UnsafeNative
f500: 4d 65 74 68 6f 64 73 20 5c 0d 0a 20 20 20 20 20  Methods \..     
f510: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
f520: 5f 6d 65 6d 6f 72 79 5f 68 69 67 68 77 61 74 65  _memory_highwate
f530: 72 20 30 7d 20 6d 65 6d 6f 72 79 5d 20 3d 3d 20  r 0} memory] == 
f540: 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
f550: 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20     if {!$quiet} 
f560: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
f570: 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
f580: 20 5b 61 70 70 65 6e 64 41 72 67 73 20 24 6d 65   [appendArgs $me
f590: 6d 6f 72 79 20 22 20 62 79 74 65 73 5c 6e 22 5d  mory " bytes\n"]
f5a0: 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20  ..        }..   
f5b0: 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
f5c0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
f5d0: 23 20 4e 4f 54 45 3a 20 4d 61 79 62 65 20 74 68  # NOTE: Maybe th
f5e0: 65 20 53 51 4c 69 74 65 20 63 6f 72 65 20 6c 69  e SQLite core li
f5f0: 62 72 61 72 79 20 69 73 20 75 6e 61 76 61 69 6c  brary is unavail
f600: 61 62 6c 65 3f 0d 0a 20 20 20 20 20 20 20 20 23  able?..        #
f610: 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 6d 65  ..        set me
f620: 6d 6f 72 79 20 75 6e 6b 6e 6f 77 6e 0d 0a 0d 0a  mory unknown....
f630: 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75          if {!$qu
f640: 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  iet} then {..   
f650: 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
f660: 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
f670: 73 20 24 6d 65 6d 6f 72 79 20 5c 6e 5d 0d 0a 20  s $memory \n].. 
f680: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
f690: 7d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 24  }....      if {$
f6a0: 63 6f 6c 6c 65 63 74 7d 20 74 68 65 6e 20 7b 0d  collect} then {.
f6b0: 0a 20 20 20 20 20 20 20 20 63 6f 6c 6c 65 63 74  .        collect
f6c0: 47 61 72 62 61 67 65 20 24 63 68 61 6e 6e 65 6c  Garbage $channel
f6d0: 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
f6e0: 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20     if {!$quiet} 
f6f0: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
f700: 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 22  tputs $channel "
f710: 2d 2d 2d 2d 20 63 75 72 72 65 6e 74 20 6d 65 6d  ---- current mem
f720: 6f 72 79 20 69 6e 20 75 73 65 20 62 79 20 74 68  ory in use by th
f730: 65 20 43 4c 52 2e 2e 2e 20 22 0d 0a 20 20 20 20  e CLR... "..    
f740: 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20    }....      if 
f750: 7b 5b 63 61 74 63 68 20 7b 6f 62 6a 65 63 74 20  {[catch {object 
f760: 69 6e 76 6f 6b 65 20 47 43 20 47 65 74 54 6f 74  invoke GC GetTot
f770: 61 6c 4d 65 6d 6f 72 79 20 66 61 6c 73 65 7d 20  alMemory false} 
f780: 6d 65 6d 6f 72 79 5d 20 3d 3d 20 30 7d 20 74 68  memory] == 0} th
f790: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66  en {..        if
f7a0: 20 7b 5b 73 74 72 69 6e 67 20 69 73 20 69 6e 74   {[string is int
f7b0: 65 67 65 72 20 2d 73 74 72 69 63 74 20 24 6d 65  eger -strict $me
f7c0: 6d 6f 72 79 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  mory]} then {.. 
f7d0: 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71           if {!$q
f7e0: 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  uiet} then {..  
f7f0: 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
f800: 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  $channel [append
f810: 41 72 67 73 20 24 6d 65 6d 6f 72 79 20 22 20 62  Args $memory " b
f820: 79 74 65 73 5c 6e 22 5d 0d 0a 20 20 20 20 20 20  ytes\n"]..      
f830: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d      }..        }
f840: 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
f850: 20 20 20 73 65 74 20 6d 65 6d 6f 72 79 20 69 6e     set memory in
f860: 76 61 6c 69 64 0d 0a 0d 0a 20 20 20 20 20 20 20  valid....       
f870: 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20     if {!$quiet} 
f880: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
f890: 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
f8a0: 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 24  el [appendArgs $
f8b0: 6d 65 6d 6f 72 79 20 5c 6e 5d 0d 0a 20 20 20 20  memory \n]..    
f8c0: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
f8d0: 20 7d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65   }..      } else
f8e0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20   {..        set 
f8f0: 6d 65 6d 6f 72 79 20 75 6e 6b 6e 6f 77 6e 0d 0a  memory unknown..
f900: 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21 24  ..        if {!$
f910: 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20  quiet} then {.. 
f920: 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
f930: 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
f940: 72 67 73 20 24 6d 65 6d 6f 72 79 20 5c 6e 5d 0d  rgs $memory \n].
f950: 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  .        }..    
f960: 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65 74    }....      ret
f970: 75 72 6e 20 24 72 65 73 75 6c 74 0d 0a 20 20 20  urn $result..   
f980: 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
f990: 63 68 65 63 6b 46 6f 72 53 51 4c 69 74 65 44 69  checkForSQLiteDi
f9a0: 72 65 63 74 6f 72 69 65 73 20 7b 20 63 68 61 6e  rectories { chan
f9b0: 6e 65 6c 20 7b 72 65 73 65 74 20 66 61 6c 73 65  nel {reset false
f9c0: 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a  } } {..      #..
f9d0: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68        # NOTE: Ch
f9e0: 65 63 6b 20 69 66 20 74 68 65 20 73 71 6c 69 74  eck if the sqlit
f9f0: 65 33 5f 77 69 6e 33 32 5f 73 65 74 5f 64 69 72  e3_win32_set_dir
fa00: 65 63 74 6f 72 79 20 66 75 6e 63 74 69 6f 6e 20  ectory function 
fa10: 69 73 20 61 76 61 69 6c 61 62 6c 65 2e 0d 0a 20  is available... 
fa20: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 74 70       #..      tp
fa30: 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5c 0d 0a  uts $channel \..
fa40: 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
fa50: 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 66 75 6e  checking for fun
fa60: 63 74 69 6f 6e 20 73 71 6c 69 74 65 33 5f 77 69  ction sqlite3_wi
fa70: 6e 33 32 5f 73 65 74 5f 64 69 72 65 63 74 6f 72  n32_set_director
fa80: 79 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 20 20  y... "....      
fa90: 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
faa0: 20 54 68 69 73 20 63 61 6c 6c 20 74 6f 20 74 68   This call to th
fab0: 65 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f  e sqlite3_win32_
fac0: 73 65 74 5f 64 69 72 65 63 74 6f 72 79 20 66 75  set_directory fu
fad0: 6e 63 74 69 6f 6e 20 75 73 65 73 20 74 68 65 0d  nction uses the.
fae0: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 69  .      #       i
faf0: 6e 76 61 6c 69 64 20 76 61 6c 75 65 20 30 20 66  nvalid value 0 f
fb00: 6f 72 20 74 68 65 20 66 69 72 73 74 20 61 72 67  or the first arg
fb10: 75 6d 65 6e 74 2e 20 20 54 68 69 73 20 63 6f 64  ument.  This cod
fb20: 65 20 69 73 20 64 65 73 69 67 6e 65 64 0d 0a 20  e is designed.. 
fb30: 20 20 20 20 20 23 20 20 20 20 20 20 20 74 6f 20       #       to 
fb40: 63 68 65 63 6b 20 69 66 20 63 61 6c 6c 69 6e 67  check if calling
fb50: 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 77 69   the function wi
fb60: 6c 6c 20 72 61 69 73 65 20 61 6e 20 65 78 63 65  ll raise an exce
fb70: 70 74 69 6f 6e 20 28 69 2e 65 2e 0d 0a 20 20 20  ption (i.e...   
fb80: 20 20 20 23 20 20 20 20 20 20 20 74 68 65 20 61     #       the a
fb90: 63 74 75 61 6c 20 72 65 73 75 6c 74 20 6f 66 20  ctual result of 
fba0: 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65  the function doe
fbb0: 73 20 6e 6f 74 20 6d 61 74 74 65 72 20 61 73 20  s not matter as 
fbc0: 6c 6f 6e 67 20 61 73 20 6e 6f 0d 0a 20 20 20 20  long as no..    
fbd0: 20 20 23 20 20 20 20 20 20 20 64 69 72 65 63 74    #       direct
fbe0: 6f 72 79 20 69 73 20 63 68 61 6e 67 65 64 29 2e  ory is changed).
fbf0: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
fc00: 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20   if {[catch {.. 
fc10: 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 62 6a               obj
fc20: 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67  ect invoke -flag
fc30: 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a  s +NonPublic \..
fc40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 79                Sy
fc50: 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
fc60: 2e 55 6e 73 61 66 65 4e 61 74 69 76 65 4d 65 74  .UnsafeNativeMet
fc70: 68 6f 64 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  hods \..        
fc80: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 77 69        sqlite3_wi
fc90: 6e 33 32 5f 73 65 74 5f 64 69 72 65 63 74 6f 72  n32_set_director
fca0: 79 20 30 20 6e 75 6c 6c 7d 5d 20 3d 3d 20 30 7d  y 0 null}] == 0}
fcb0: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
fcc0: 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
fcd0: 54 45 3a 20 43 61 6c 6c 69 6e 67 20 74 68 65 20  TE: Calling the 
fce0: 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 65  sqlite3_win32_se
fcf0: 74 5f 64 69 72 65 63 74 6f 72 79 20 66 75 6e 63  t_directory func
fd00: 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 0d 0a 20  tion does not.. 
fd10: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63         #       c
fd20: 61 75 73 65 20 61 6e 20 65 78 63 65 70 74 69 6f  ause an exceptio
fd30: 6e 3b 20 74 68 65 72 65 66 6f 72 65 2c 20 69 74  n; therefore, it
fd40: 20 6d 75 73 74 20 62 65 20 61 76 61 69 6c 61 62   must be availab
fd50: 6c 65 20 28 69 2e 65 2e 0d 0a 20 20 20 20 20 20  le (i.e...      
fd60: 20 20 23 20 20 20 20 20 20 20 65 76 65 6e 20 74    #       even t
fd70: 68 6f 75 67 68 20 69 74 20 73 68 6f 75 6c 64 20  hough it should 
fd80: 72 65 74 75 72 6e 20 61 20 66 61 69 6c 75 72 65  return a failure
fd90: 20 72 65 74 75 72 6e 20 63 6f 64 65 20 69 6e 20   return code in 
fda0: 74 68 69 73 0d 0a 20 20 20 20 20 20 20 20 23 20  this..        # 
fdb0: 20 20 20 20 20 20 63 61 73 65 29 2e 0d 0a 20 20        case)...  
fdc0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
fdd0: 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 73   addConstraint s
fde0: 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 65 74  qlite3_win32_set
fdf0: 5f 64 69 72 65 63 74 6f 72 79 0d 0a 0d 0a 20 20  _directory....  
fe00: 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
fe10: 6e 6e 65 6c 20 79 65 73 5c 6e 0d 0a 0d 0a 20 20  nnel yes\n....  
fe20: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
fe30: 20 23 20 4e 4f 54 45 3a 20 44 6f 65 73 20 6f 75   # NOTE: Does ou
fe40: 72 20 63 61 6c 6c 65 72 20 77 61 6e 74 20 74 6f  r caller want to
fe50: 20 72 65 73 65 74 20 74 68 65 20 64 69 72 65 63   reset the direc
fe60: 74 6f 72 69 65 73 3f 0d 0a 20 20 20 20 20 20 20  tories?..       
fe70: 20 23 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b   #..        if {
fe80: 24 72 65 73 65 74 7d 20 74 68 65 6e 20 7b 0d 0a  $reset} then {..
fe90: 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
fea0: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4e         # NOTE: N
feb0: 6f 77 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65  ow make sure the
fec0: 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 74 65   database and te
fed0: 6d 70 6f 72 61 72 79 20 64 69 72 65 63 74 6f 72  mporary director
fee0: 69 65 73 20 61 72 65 0d 0a 20 20 20 20 20 20 20  ies are..       
fef0: 20 20 20 23 20 20 20 20 20 20 20 72 65 73 65 74     #       reset
ff00: 20 74 68 65 69 72 20 64 65 66 61 75 6c 74 20 76   their default v
ff10: 61 6c 75 65 73 2c 20 77 68 69 63 68 20 73 68 6f  alues, which sho
ff20: 75 6c 64 20 62 65 20 6e 75 6c 6c 20 66 6f 72 20  uld be null for 
ff30: 62 6f 74 68 2e 0d 0a 20 20 20 20 20 20 20 20 20  both...         
ff40: 20 23 20 20 20 20 20 20 20 53 69 6e 63 65 20 74   #       Since t
ff50: 68 65 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32  he sqlite3_win32
ff60: 5f 73 65 74 5f 64 69 72 65 63 74 6f 72 79 20 66  _set_directory f
ff70: 75 6e 63 74 69 6f 6e 20 69 73 20 61 76 61 69 6c  unction is avail
ff80: 61 62 6c 65 2c 0d 0a 20 20 20 20 20 20 20 20 20  able,..         
ff90: 20 23 20 20 20 20 20 20 20 75 73 65 20 69 74 2e   #       use it.
ffa0: 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20  ..          #.. 
ffb0: 20 20 20 20 20 20 20 20 20 66 6f 72 20 7b 73 65           for {se
ffc0: 74 20 69 6e 64 65 78 20 31 7d 20 7b 24 69 6e 64  t index 1} {$ind
ffd0: 65 78 20 3c 20 33 7d 20 7b 69 6e 63 72 20 69 6e  ex < 3} {incr in
ffe0: 64 65 78 7d 20 7b 0d 0a 20 20 20 20 20 20 20 20  dex} {..        
fff0: 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b      if {[catch {
10000 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
10010 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76        object inv
10020 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50  oke -flags +NonP
10030 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20 20  ublic \..       
10040 20 20 20 20 20 20 20 20 20 20 20 20 20 53 79 73               Sys
10050 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e  tem.Data.SQLite.
10060 55 6e 73 61 66 65 4e 61 74 69 76 65 4d 65 74 68  UnsafeNativeMeth
10070 6f 64 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ods \..         
10080 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
10090 65 33 5f 77 69 6e 33 32 5f 73 65 74 5f 64 69 72  e3_win32_set_dir
100a0 65 63 74 6f 72 79 20 24 69 6e 64 65 78 20 6e 75  ectory $index nu
100b0 6c 6c 7d 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ll} \..         
100c0 20 20 20 20 20 20 20 20 20 20 20 72 65 73 75 6c             resul
100d0 74 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d  t] == 0} then {.
100e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74  .              t
100f0 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61  puts $channel [a
10100 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
10110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
10120 2d 2d 2d 2d 20 63 61 6c 6c 20 73 71 6c 69 74 65  ---- call sqlite
10130 33 5f 77 69 6e 33 32 5f 73 65 74 5f 64 69 72 65  3_win32_set_dire
10140 63 74 6f 72 79 28 22 20 24 69 6e 64 65 78 20 5c  ctory(" $index \
10150 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
10160 20 20 20 20 22 2c 20 6e 75 6c 6c 29 2e 2e 2e 20      ", null)... 
10170 6f 6b 3a 20 22 20 24 72 65 73 75 6c 74 20 5c 6e  ok: " $result \n
10180 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  ]..            }
10190 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
101a0 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
101b0 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
101c0 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
101d0 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 61 6c         "---- cal
101e0 6c 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f  l sqlite3_win32_
101f0 73 65 74 5f 64 69 72 65 63 74 6f 72 79 28 22 20  set_directory(" 
10200 24 69 6e 64 65 78 20 5c 0d 0a 20 20 20 20 20 20  $index \..      
10210 20 20 20 20 20 20 20 20 20 20 20 20 22 2c 20 6e              ", n
10220 75 6c 6c 29 2e 2e 2e 20 65 72 72 6f 72 3a 20 22  ull)... error: "
10230 20 5c 6e 5c 74 20 24 72 65 73 75 6c 74 20 5c 6e   \n\t $result \n
10240 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  ]..            }
10250 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20  ..          }.. 
10260 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
10270 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
10280 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
10290 20 6e 6f 5c 6e 0d 0a 0d 0a 20 20 20 20 20 20 20   no\n....       
102a0 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
102b0 54 45 3a 20 44 6f 65 73 20 6f 75 72 20 63 61 6c  TE: Does our cal
102c0 6c 65 72 20 77 61 6e 74 20 74 6f 20 72 65 73 65  ler want to rese
102d0 74 20 74 68 65 20 64 69 72 65 63 74 6f 72 69 65  t the directorie
102e0 73 3f 20 20 54 68 69 73 20 63 61 6e 20 6f 6e 6c  s?  This can onl
102f0 79 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  y..        #    
10300 20 20 20 62 65 20 70 65 72 66 6f 72 6d 65 64 20     be performed 
10310 69 66 20 53 51 4c 69 74 65 20 69 73 20 6c 6f 61  if SQLite is loa
10320 64 65 64 20 61 6e 64 20 72 65 61 64 79 20 66 6f  ded and ready fo
10330 72 20 75 73 65 20 62 79 20 74 68 65 20 74 65 73  r use by the tes
10340 74 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  t..        #    
10350 20 20 20 73 75 69 74 65 2e 0d 0a 20 20 20 20 20     suite...     
10360 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 69 66     #..        if
10370 20 7b 24 72 65 73 65 74 20 26 26 20 5b 69 73 53   {$reset && [isS
10380 51 4c 69 74 65 52 65 61 64 79 5d 7d 20 74 68 65  QLiteReady]} the
10390 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 23  n {..          #
103a0 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f  ..          # NO
103b0 54 45 3a 20 4e 6f 77 20 6d 61 6b 65 20 73 75 72  TE: Now make sur
103c0 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61  e the database a
103d0 6e 64 20 74 65 6d 70 6f 72 61 72 79 20 64 69 72  nd temporary dir
103e0 65 63 74 6f 72 69 65 73 20 61 72 65 0d 0a 20 20  ectories are..  
103f0 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
10400 72 65 73 65 74 20 74 68 65 69 72 20 64 65 66 61  reset their defa
10410 75 6c 74 20 76 61 6c 75 65 73 2c 20 77 68 69 63  ult values, whic
10420 68 20 73 68 6f 75 6c 64 20 62 65 20 6e 75 6c 6c  h should be null
10430 20 66 6f 72 20 62 6f 74 68 2e 0d 0a 20 20 20 20   for both...    
10440 20 20 20 20 20 20 23 20 20 20 20 20 20 20 53 69        #       Si
10450 6e 63 65 20 74 68 65 20 73 71 6c 69 74 65 33 5f  nce the sqlite3_
10460 77 69 6e 33 32 5f 73 65 74 5f 64 69 72 65 63 74  win32_set_direct
10470 6f 72 79 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65  ory function doe
10480 73 20 6e 6f 74 0d 0a 20 20 20 20 20 20 20 20 20  s not..         
10490 20 23 20 20 20 20 20 20 20 61 70 70 65 61 72 20   #       appear 
104a0 74 6f 20 62 65 20 61 76 61 69 6c 61 62 6c 65 2c  to be available,
104b0 20 75 73 65 20 74 68 65 20 61 73 73 6f 63 69 61   use the associa
104c0 74 65 64 20 50 52 41 47 4d 41 20 63 6f 6d 6d 61  ted PRAGMA comma
104d0 6e 64 73 0d 0a 20 20 20 20 20 20 20 20 20 20 23  nds..          #
104e0 20 20 20 20 20 20 20 69 6e 73 74 65 61 64 2e 0d         instead..
104f0 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
10500 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20          foreach 
10510 64 69 72 65 63 74 6f 72 79 20 5b 6c 69 73 74 20  directory [list 
10520 64 61 74 61 5f 73 74 6f 72 65 5f 64 69 72 65 63  data_store_direc
10530 74 6f 72 79 20 74 65 6d 70 5f 73 74 6f 72 65 5f  tory temp_store_
10540 64 69 72 65 63 74 6f 72 79 5d 20 7b 0d 0a 20 20  directory] {..  
10550 20 20 20 20 20 20 20 20 20 20 73 65 74 20 73 71            set sq
10560 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 22 50  l [appendArgs "P
10570 52 41 47 4d 41 20 22 20 24 64 69 72 65 63 74 6f  RAGMA " $directo
10580 72 79 20 22 20 3d 20 5c 22 5c 22 3b 22 5d 0d 0a  ry " = \"\";"]..
10590 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ..            if
105a0 20 7b 5b 63 61 74 63 68 20 7b 65 78 65 63 75 74   {[catch {execut
105b0 65 53 71 6c 20 24 73 71 6c 7d 20 72 65 73 75 6c  eSql $sql} resul
105c0 74 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d  t] == 0} then {.
105d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74  .              t
105e0 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61  puts $channel [a
105f0 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
10600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
10610 2d 2d 2d 2d 20 65 78 65 63 75 74 65 20 50 52 41  ---- execute PRA
10620 47 4d 41 20 22 20 24 64 69 72 65 63 74 6f 72 79  GMA " $directory
10630 20 22 2e 2e 2e 20 6f 6b 3a 20 5c 22 22 20 5c 0d   "... ok: \"" \.
10640 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
10650 20 20 20 24 72 65 73 75 6c 74 20 5c 22 5c 6e 5d     $result \"\n]
10660 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 20  ..            } 
10670 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
10680 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
10690 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
106a0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
106b0 20 20 20 20 20 20 22 2d 2d 2d 2d 20 65 78 65 63        "---- exec
106c0 75 74 65 20 50 52 41 47 4d 41 20 22 20 24 64 69  ute PRAGMA " $di
106d0 72 65 63 74 6f 72 79 20 22 2e 2e 2e 20 65 72 72  rectory "... err
106e0 6f 72 3a 20 22 20 5c 0d 0a 20 20 20 20 20 20 20  or: " \..       
106f0 20 20 20 20 20 20 20 20 20 20 20 5c 6e 5c 74 20             \n\t 
10700 24 72 65 73 75 6c 74 20 5c 6e 5d 0d 0a 20 20 20  $result \n]..   
10710 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
10720 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
10730 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20   }..      }.... 
10740 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
10750 4e 4f 54 45 3a 20 46 69 6e 61 6c 6c 79 2c 20 73  NOTE: Finally, s
10760 68 6f 77 20 74 68 65 20 63 75 72 72 65 6e 74 20  how the current 
10770 76 61 6c 75 65 20 6f 66 20 74 68 65 20 64 61 74  value of the dat
10780 61 62 61 73 65 20 61 6e 64 20 74 65 6d 70 6f 72  abase and tempor
10790 61 72 79 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ary..      #    
107a0 20 20 20 64 69 72 65 63 74 6f 72 69 65 73 2e 20     directories. 
107b0 20 54 68 69 73 20 63 61 6e 20 6f 6e 6c 79 20 62   This can only b
107c0 65 20 70 65 72 66 6f 72 6d 65 64 20 69 66 20 53  e performed if S
107d0 51 4c 69 74 65 20 69 73 20 6c 6f 61 64 65 64 0d  QLite is loaded.
107e0 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 61  .      #       a
107f0 6e 64 20 72 65 61 64 79 20 66 6f 72 20 75 73 65  nd ready for use
10800 20 62 79 20 74 68 65 20 74 65 73 74 20 73 75 69   by the test sui
10810 74 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  te...      #..  
10820 20 20 20 20 69 66 20 7b 5b 69 73 53 51 4c 69 74      if {[isSQLit
10830 65 52 65 61 64 79 5d 7d 20 74 68 65 6e 20 7b 0d  eReady]} then {.
10840 0a 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68  .        foreach
10850 20 64 69 72 65 63 74 6f 72 79 20 5b 6c 69 73 74   directory [list
10860 20 64 61 74 61 5f 73 74 6f 72 65 5f 64 69 72 65   data_store_dire
10870 63 74 6f 72 79 20 74 65 6d 70 5f 73 74 6f 72 65  ctory temp_store
10880 5f 64 69 72 65 63 74 6f 72 79 5d 20 7b 0d 0a 20  _directory] {.. 
10890 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
108a0 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
108b0 72 67 73 20 22 2d 2d 2d 2d 20 63 68 65 63 6b 69  rgs "---- checki
108c0 6e 67 20 22 20 24 64 69 72 65 63 74 6f 72 79 20  ng " $directory 
108d0 22 2e 2e 2e 20 22 5d 0d 0a 0d 0a 20 20 20 20 20  "... "]....     
108e0 20 20 20 20 20 73 65 74 20 73 71 6c 20 5b 61 70       set sql [ap
108f0 70 65 6e 64 41 72 67 73 20 22 50 52 41 47 4d 41  pendArgs "PRAGMA
10900 20 22 20 24 64 69 72 65 63 74 6f 72 79 20 5c 3b   " $directory \;
10910 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 69  ]....          i
10920 66 20 7b 5b 63 61 74 63 68 20 7b 65 78 65 63 75  f {[catch {execu
10930 74 65 53 71 6c 20 24 73 71 6c 20 73 63 61 6c 61  teSql $sql scala
10940 72 7d 20 72 65 73 75 6c 74 5d 20 3d 3d 20 30 7d  r} result] == 0}
10950 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
10960 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
10970 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
10980 22 6f 6b 3a 20 5c 22 22 20 24 72 65 73 75 6c 74  "ok: \"" $result
10990 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20   \"\n]..        
109a0 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
109b0 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
109c0 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
109d0 67 73 20 22 65 72 72 6f 72 3a 20 22 20 5c 6e 5c  gs "error: " \n\
109e0 74 20 24 72 65 73 75 6c 74 20 5c 6e 5d 0d 0a 20  t $result \n].. 
109f0 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
10a00 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a      }..      }..
10a10 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
10a20 6f 63 20 6c 6f 61 64 53 51 4c 69 74 65 54 65 73  oc loadSQLiteTes
10a30 74 53 65 74 74 69 6e 67 73 20 7b 20 63 68 61 6e  tSettings { chan
10a40 6e 65 6c 20 7b 73 75 66 66 69 78 20 22 22 7d 20  nel {suffix ""} 
10a50 7b 71 75 69 65 74 20 66 61 6c 73 65 7d 20 7d 20  {quiet false} } 
10a60 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  {..      #..    
10a70 20 20 23 20 4e 4f 54 45 3a 20 53 6b 69 70 20 6c    # NOTE: Skip l
10a80 6f 61 64 69 6e 67 20 74 68 65 20 73 65 74 74 69  oading the setti
10a90 6e 67 73 20 69 66 20 74 68 65 69 72 20 75 73 61  ngs if their usa
10aa0 67 65 20 68 61 73 20 62 65 65 6e 20 64 69 73 61  ge has been disa
10ab0 62 6c 65 64 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  bled...      #..
10ac0 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f        if {![info
10ad0 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 73 71 6c   exists ::no(sql
10ae0 69 74 65 54 65 73 74 53 65 74 74 69 6e 67 73 29  iteTestSettings)
10af0 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
10b00 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
10b10 4e 4f 54 45 3a 20 4c 6f 61 64 20 63 75 73 74 6f  NOTE: Load custo
10b20 6d 20 70 65 72 2d 75 73 65 72 20 61 6e 64 2f 6f  m per-user and/o
10b30 72 20 70 65 72 2d 68 6f 73 74 20 74 65 73 74 20  r per-host test 
10b40 73 65 74 74 69 6e 67 73 20 6e 6f 77 2e 0d 0a 20  settings now... 
10b50 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
10b60 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73    if {[info exis
10b70 74 73 20 3a 3a 74 63 6c 5f 70 6c 61 74 66 6f 72  ts ::tcl_platfor
10b80 6d 28 75 73 65 72 29 5d 7d 20 74 68 65 6e 20 7b  m(user)]} then {
10b90 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20  ..          set 
10ba0 75 73 65 72 53 65 74 74 69 6e 67 73 46 69 6c 65  userSettingsFile
10bb0 4e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20  Name [file join 
10bc0 5b 67 65 74 43 6f 6d 6d 6f 6e 44 69 72 65 63 74  [getCommonDirect
10bd0 6f 72 79 5d 20 5c 0d 0a 20 20 20 20 20 20 20 20  ory] \..        
10be0 20 20 20 20 20 20 5b 61 70 70 65 6e 64 41 72 67        [appendArg
10bf0 73 20 73 65 74 74 69 6e 67 73 20 24 73 75 66 66  s settings $suff
10c00 69 78 20 2e 20 24 3a 3a 74 63 6c 5f 70 6c 61 74  ix . $::tcl_plat
10c10 66 6f 72 6d 28 75 73 65 72 29 20 2e 65 61 67 6c  form(user) .eagl
10c20 65 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  e]]....         
10c30 20 69 66 20 7b 5b 66 69 6c 65 20 65 78 69 73 74   if {[file exist
10c40 73 20 24 75 73 65 72 53 65 74 74 69 6e 67 73 46  s $userSettingsF
10c50 69 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b  ileName]} then {
10c60 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ..            if
10c70 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20   {!$quiet} then 
10c80 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
10c90 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
10ca0 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
10cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10cc0 20 22 2d 2d 2d 2d 20 6c 6f 61 64 69 6e 67 20 70   "---- loading p
10cd0 65 72 2d 75 73 65 72 20 74 65 73 74 20 73 65 74  er-user test set
10ce0 74 69 6e 67 73 20 66 69 6c 65 20 5c 22 22 20 5c  tings file \"" \
10cf0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
10d00 20 20 20 20 24 75 73 65 72 53 65 74 74 69 6e 67      $userSetting
10d10 73 46 69 6c 65 4e 61 6d 65 20 5c 22 2e 2e 2e 5c  sFileName \"...\
10d20 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  n]..            
10d30 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  }....           
10d40 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 75 70 6c   if {[catch {upl
10d50 65 76 65 6c 20 31 20 5b 6c 69 73 74 20 73 6f 75  evel 1 [list sou
10d60 72 63 65 20 24 75 73 65 72 53 65 74 74 69 6e 67  rce $userSetting
10d70 73 46 69 6c 65 4e 61 6d 65 5d 7d 20 5c 0d 0a 20  sFileName]} \.. 
10d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10d90 20 20 20 65 72 72 6f 72 5d 7d 20 74 68 65 6e 20     error]} then 
10da0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
10db0 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68   if {!$quiet} th
10dc0 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
10dd0 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
10de0 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
10df0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
10e00 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41          "==== WA
10e10 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20 74 6f  RNING: failed to
10e20 20 6c 6f 61 64 20 70 65 72 2d 75 73 65 72 20 73   load per-user s
10e30 65 74 74 69 6e 67 73 20 66 69 6c 65 20 5c 22 22  ettings file \""
10e40 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
10e50 20 20 20 20 20 20 20 20 24 75 73 65 72 53 65 74          $userSet
10e60 74 69 6e 67 73 46 69 6c 65 4e 61 6d 65 20 22 5c  tingsFileName "\
10e70 22 2c 20 65 72 72 6f 72 3a 20 22 20 5c 6e 5c 74  ", error: " \n\t
10e80 20 24 65 72 72 6f 72 20 5c 6e 5d 0d 0a 20 20 20   $error \n]..   
10e90 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
10ea0 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
10eb0 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d         } else {.
10ec0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20  .            if 
10ed0 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b  {!$quiet} then {
10ee0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
10ef0 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b  tputs $channel [
10f00 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
10f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10f20 22 2d 2d 2d 2d 20 73 6b 69 70 70 65 64 20 6c 6f  "---- skipped lo
10f30 61 64 69 6e 67 20 70 65 72 2d 75 73 65 72 20 74  ading per-user t
10f40 65 73 74 20 73 65 74 74 69 6e 67 73 20 66 69 6c  est settings fil
10f50 65 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20 20  e \"" \..       
10f60 20 20 20 20 20 20 20 20 20 20 20 24 75 73 65 72             $user
10f70 53 65 74 74 69 6e 67 73 46 69 6c 65 4e 61 6d 65  SettingsFileName
10f80 20 22 5c 22 2c 20 69 74 20 64 6f 65 73 20 6e 6f   "\", it does no
10f90 74 20 65 78 69 73 74 5c 6e 22 5d 0d 0a 20 20 20  t exist\n"]..   
10fa0 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
10fb0 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
10fc0 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 23   }....        ##
10fd0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
10fe0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
10ff0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
11000 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
11010 23 23 23 23 23 0d 0a 0d 0a 20 20 20 20 20 20 20  #####....       
11020 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74   if {[info exist
11030 73 20 3a 3a 74 63 6c 5f 70 6c 61 74 66 6f 72 6d  s ::tcl_platform
11040 28 68 6f 73 74 29 5d 7d 20 74 68 65 6e 20 7b 0d  (host)]} then {.
11050 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20 68  .          set h
11060 6f 73 74 53 65 74 74 69 6e 67 73 46 69 6c 65 4e  ostSettingsFileN
11070 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5b  ame [file join [
11080 67 65 74 43 6f 6d 6d 6f 6e 44 69 72 65 63 74 6f  getCommonDirecto
11090 72 79 5d 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ry] \..         
110a0 20 20 20 20 20 5b 61 70 70 65 6e 64 41 72 67 73       [appendArgs
110b0 20 73 65 74 74 69 6e 67 73 20 24 73 75 66 66 69   settings $suffi
110c0 78 20 2e 20 24 3a 3a 74 63 6c 5f 70 6c 61 74 66  x . $::tcl_platf
110d0 6f 72 6d 28 68 6f 73 74 29 20 2e 65 61 67 6c 65  orm(host) .eagle
110e0 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  ]]....          
110f0 69 66 20 7b 5b 66 69 6c 65 20 65 78 69 73 74 73  if {[file exists
11100 20 24 68 6f 73 74 53 65 74 74 69 6e 67 73 46 69   $hostSettingsFi
11110 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d  leName]} then {.
11120 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20  .            if 
11130 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b  {!$quiet} then {
11140 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
11150 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b  tputs $channel [
11160 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
11170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11180 22 2d 2d 2d 2d 20 6c 6f 61 64 69 6e 67 20 70 65  "---- loading pe
11190 72 2d 68 6f 73 74 20 74 65 73 74 20 73 65 74 74  r-host test sett
111a0 69 6e 67 73 20 66 69 6c 65 20 5c 22 22 20 5c 0d  ings file \"" \.
111b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
111c0 20 20 20 24 68 6f 73 74 53 65 74 74 69 6e 67 73     $hostSettings
111d0 46 69 6c 65 4e 61 6d 65 20 5c 22 2e 2e 2e 5c 6e  FileName \"...\n
111e0 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  ]..            }
111f0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
11200 69 66 20 7b 5b 63 61 74 63 68 20 7b 75 70 6c 65  if {[catch {uple
11210 76 65 6c 20 31 20 5b 6c 69 73 74 20 73 6f 75 72  vel 1 [list sour
11220 63 65 20 24 68 6f 73 74 53 65 74 74 69 6e 67 73  ce $hostSettings
11230 46 69 6c 65 4e 61 6d 65 5d 7d 20 5c 0d 0a 20 20  FileName]} \..  
11240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11250 20 20 65 72 72 6f 72 5d 7d 20 74 68 65 6e 20 7b    error]} then {
11260 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
11270 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65  if {!$quiet} the
11280 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
11290 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
112a0 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
112b0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
112c0 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52         "==== WAR
112d0 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20 74 6f 20  NING: failed to 
112e0 6c 6f 61 64 20 70 65 72 2d 68 6f 73 74 20 73 65  load per-host se
112f0 74 74 69 6e 67 73 20 66 69 6c 65 20 5c 22 22 20  ttings file \"" 
11300 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
11310 20 20 20 20 20 20 20 24 68 6f 73 74 53 65 74 74         $hostSett
11320 69 6e 67 73 46 69 6c 65 4e 61 6d 65 20 22 5c 22  ingsFileName "\"
11330 2c 20 65 72 72 6f 72 3a 20 22 20 5c 6e 5c 74 20  , error: " \n\t 
11340 24 65 72 72 6f 72 20 5c 6e 5d 0d 0a 20 20 20 20  $error \n]..    
11350 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
11360 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
11370 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
11380 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b              if {
11390 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d  !$quiet} then {.
113a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74  .              t
113b0 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61  puts $channel [a
113c0 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
113d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
113e0 2d 2d 2d 2d 20 73 6b 69 70 70 65 64 20 6c 6f 61  ---- skipped loa
113f0 64 69 6e 67 20 70 65 72 2d 68 6f 73 74 20 74 65  ding per-host te
11400 73 74 20 73 65 74 74 69 6e 67 73 20 66 69 6c 65  st settings file
11410 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20 20 20   \"" \..        
11420 20 20 20 20 20 20 20 20 20 20 24 68 6f 73 74 53            $hostS
11430 65 74 74 69 6e 67 73 46 69 6c 65 4e 61 6d 65 20  ettingsFileName 
11440 22 5c 22 2c 20 69 74 20 64 6f 65 73 20 6e 6f 74  "\", it does not
11450 20 65 78 69 73 74 5c 6e 22 5d 0d 0a 20 20 20 20   exist\n"]..    
11460 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
11470 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
11480 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  }..      }..    
11490 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 72  }.....    proc r
114a0 75 6e 53 51 4c 69 74 65 54 65 73 74 50 72 6f 6c  unSQLiteTestProl
114b0 6f 67 75 65 20 7b 7d 20 7b 0d 0a 20 20 20 20 20  ogue {} {..     
114c0 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
114d0 3a 20 53 6b 69 70 20 72 75 6e 6e 69 6e 67 20 6f  : Skip running o
114e0 75 72 20 63 75 73 74 6f 6d 20 70 72 6f 6c 6f 67  ur custom prolog
114f0 75 65 20 69 66 20 74 68 65 20 6d 61 69 6e 20 6f  ue if the main o
11500 6e 65 20 68 61 73 20 62 65 65 6e 0d 0a 20 20 20  ne has been..   
11510 20 20 20 23 20 20 20 20 20 20 20 73 6b 69 70 70     #       skipp
11520 65 64 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  ed...      #..  
11530 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65      if {![info e
11540 78 69 73 74 73 20 3a 3a 6e 6f 28 70 72 6f 6c 6f  xists ::no(prolo
11550 67 75 65 2e 65 61 67 6c 65 29 5d 7d 20 74 68 65  gue.eagle)]} the
11560 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  n {..        #..
11570 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
11580 4c 6f 61 64 20 74 68 65 20 22 62 65 66 6f 72 65  Load the "before
11590 2d 63 6f 6e 73 74 72 61 69 6e 74 73 22 20 63 75  -constraints" cu
115a0 73 74 6f 6d 20 70 65 72 2d 75 73 65 72 20 61 6e  stom per-user an
115b0 64 2f 6f 72 20 70 65 72 2d 68 6f 73 74 0d 0a 20  d/or per-host.. 
115c0 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74         #       t
115d0 65 73 74 20 73 65 74 74 69 6e 67 73 20 6e 6f 77  est settings now
115e0 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
115f0 20 20 20 20 20 20 75 70 6c 65 76 65 6c 20 31 20        uplevel 1 
11600 5b 6c 69 73 74 20 6c 6f 61 64 53 51 4c 69 74 65  [list loadSQLite
11610 54 65 73 74 53 65 74 74 69 6e 67 73 20 24 3a 3a  TestSettings $::
11620 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 2e 62 65  test_channel .be
11630 66 6f 72 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  fore]....       
11640 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
11650 54 45 3a 20 53 6b 69 70 20 61 6c 6c 20 53 79 73  TE: Skip all Sys
11660 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 20  tem.Data.SQLite 
11670 72 65 6c 61 74 65 64 20 66 69 6c 65 20 68 61 6e  related file han
11680 64 6c 69 6e 67 20 28 64 65 6c 65 74 69 6e 67 2c  dling (deleting,
11690 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
116a0 20 20 63 6f 70 79 69 6e 67 2c 20 61 6e 64 20 6c    copying, and l
116b0 6f 61 64 69 6e 67 29 20 69 66 20 77 65 20 61 72  oading) if we ar
116c0 65 20 73 6f 20 69 6e 73 74 72 75 63 74 65 64 2e  e so instructed.
116d0 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
116e0 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20       if {![info 
116f0 65 78 69 73 74 73 20 3a 3a 6e 6f 28 73 71 6c 69  exists ::no(sqli
11700 74 65 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e 20  teFiles)]} then 
11710 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a  {..          #..
11720 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45            # NOTE
11730 3a 20 53 6b 69 70 20 74 72 79 69 6e 67 20 74 6f  : Skip trying to
11740 20 64 65 6c 65 74 65 20 61 6e 79 20 66 69 6c 65   delete any file
11750 73 20 69 66 20 77 65 20 61 72 65 20 73 6f 20 69  s if we are so i
11760 6e 73 74 72 75 63 74 65 64 2e 0d 0a 20 20 20 20  nstructed...    
11770 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
11780 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78     if {![info ex
11790 69 73 74 73 20 3a 3a 6e 6f 28 64 65 6c 65 74 65  ists ::no(delete
117a0 53 71 6c 69 74 65 46 69 6c 65 73 29 5d 7d 20 74  SqliteFiles)]} t
117b0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
117c0 20 20 20 74 72 79 44 65 6c 65 74 65 41 73 73 65     tryDeleteAsse
117d0 6d 62 6c 79 20 73 71 6c 69 74 65 33 2e 64 6c 6c  mbly sqlite3.dll
117e0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65  ..            re
117f0 6d 6f 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 66  moveConstraint f
11800 69 6c 65 5f 73 71 6c 69 74 65 33 2e 64 6c 6c 0d  ile_sqlite3.dll.
11810 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  ...            t
11820 72 79 44 65 6c 65 74 65 41 73 73 65 6d 62 6c 79  ryDeleteAssembly
11830 20 53 51 4c 69 74 65 2e 49 6e 74 65 72 6f 70 2e   SQLite.Interop.
11840 64 6c 6c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  dll..           
11850 20 72 65 6d 6f 76 65 43 6f 6e 73 74 72 61 69 6e   removeConstrain
11860 74 20 66 69 6c 65 5f 53 51 4c 69 74 65 2e 49 6e  t file_SQLite.In
11870 74 65 72 6f 70 2e 64 6c 6c 0d 0a 0d 0a 20 20 20  terop.dll....   
11880 20 20 20 20 20 20 20 20 20 74 72 79 44 65 6c 65           tryDele
11890 74 65 41 73 73 65 6d 62 6c 79 20 53 79 73 74 65  teAssembly Syste
118a0 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 64 6c  m.Data.SQLite.dl
118b0 6c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  l..            r
118c0 65 6d 6f 76 65 43 6f 6e 73 74 72 61 69 6e 74 20  emoveConstraint 
118d0 66 69 6c 65 5f 53 79 73 74 65 6d 2e 44 61 74 61  file_System.Data
118e0 2e 53 51 4c 69 74 65 2e 64 6c 6c 0d 0a 0d 0a 20  .SQLite.dll.... 
118f0 20 20 20 20 20 20 20 20 20 20 20 74 72 79 44 65             tryDe
11900 6c 65 74 65 41 73 73 65 6d 62 6c 79 20 53 79 73  leteAssembly Sys
11910 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e  tem.Data.SQLite.
11920 4c 69 6e 71 2e 64 6c 6c 0d 0a 20 20 20 20 20 20  Linq.dll..      
11930 20 20 20 20 20 20 72 65 6d 6f 76 65 43 6f 6e 73        removeCons
11940 74 72 61 69 6e 74 20 66 69 6c 65 5f 53 79 73 74  traint file_Syst
11950 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 4c  em.Data.SQLite.L
11960 69 6e 71 2e 64 6c 6c 0d 0a 20 20 20 20 20 20 20  inq.dll..       
11970 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
11980 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23    #..          #
11990 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 66 6f 72   NOTE: Check for
119a0 20 74 68 65 20 22 61 75 74 6f 53 65 6c 65 63 74   the "autoSelect
119b0 22 20 72 75 6e 74 69 6d 65 20 6f 70 74 69 6f 6e  " runtime option
119c0 2e 20 20 49 66 20 70 72 65 73 65 6e 74 2c 0d 0a  .  If present,..
119d0 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20            #     
119e0 20 20 61 74 74 65 6d 70 74 20 74 6f 20 61 75 74    attempt to aut
119f0 6f 6d 61 74 69 63 61 6c 6c 79 20 73 65 6c 65 63  omatically selec
11a00 74 20 74 68 65 20 66 69 72 73 74 20 61 76 61 69  t the first avai
11a10 6c 61 62 6c 65 0d 0a 20 20 20 20 20 20 20 20 20  lable..         
11a20 20 23 20 20 20 20 20 20 20 62 75 69 6c 64 20 6f   #       build o
11a30 66 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51  f System.Data.SQ
11a40 4c 69 74 65 20 66 6f 72 20 75 73 65 20 77 69 74  Lite for use wit
11a50 68 20 74 68 65 20 74 65 73 74 20 73 75 69 74 65  h the test suite
11a60 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a  ...          #..
11a70 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 68            if {[h
11a80 61 73 52 75 6e 74 69 6d 65 4f 70 74 69 6f 6e 20  asRuntimeOption 
11a90 61 75 74 6f 53 65 6c 65 63 74 5d 7d 20 74 68 65  autoSelect]} the
11aa0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
11ab0 20 63 68 65 63 6b 46 6f 72 53 51 4c 69 74 65 42   checkForSQLiteB
11ac0 75 69 6c 64 73 20 24 3a 3a 74 65 73 74 5f 63 68  uilds $::test_ch
11ad0 61 6e 6e 65 6c 20 74 72 75 65 0d 0a 20 20 20 20  annel true..    
11ae0 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
11af0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
11b00 20 20 23 20 4e 4f 54 45 3a 20 53 6b 69 70 20 74    # NOTE: Skip t
11b10 72 79 69 6e 67 20 74 6f 20 76 65 72 69 66 79 20  rying to verify 
11b20 74 68 65 20 62 75 69 6c 64 20 64 69 72 65 63 74  the build direct
11b30 6f 72 79 20 69 66 20 77 65 20 61 72 65 20 73 6f  ory if we are so
11b40 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 20 20  ..          #   
11b50 20 20 20 20 69 6e 73 74 72 75 63 74 65 64 3b 20      instructed; 
11b60 6f 74 68 65 72 77 69 73 65 2c 20 6d 61 6b 65 20  otherwise, make 
11b70 73 75 72 65 20 69 74 20 61 63 74 75 61 6c 6c 79  sure it actually
11b80 20 65 78 69 73 74 73 20 6f 72 0d 0a 20 20 20 20   exists or..    
11b90 20 20 20 20 20 20 23 20 20 20 20 20 20 20 68 61        #       ha
11ba0 6c 74 20 74 68 65 20 65 6e 74 69 72 65 20 74 65  lt the entire te
11bb0 73 74 69 6e 67 20 70 72 6f 63 65 73 73 20 69 66  sting process if
11bc0 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 65 78 69   it does not exi
11bd0 73 74 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23  st...          #
11be0 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b  ..          if {
11bf0 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  ![info exists ::
11c00 6e 6f 28 76 65 72 69 66 79 42 75 69 6c 64 44 69  no(verifyBuildDi
11c10 72 65 63 74 6f 72 79 29 5d 7d 20 74 68 65 6e 20  rectory)]} then 
11c20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23  {..            #
11c30 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 20  ..            # 
11c40 4e 4f 54 45 3a 20 41 74 20 74 68 69 73 20 70 6f  NOTE: At this po
11c50 69 6e 74 2c 20 74 68 65 20 62 75 69 6c 64 20 64  int, the build d
11c60 69 72 65 63 74 6f 72 79 20 4d 55 53 54 20 65 78  irectory MUST ex
11c70 69 73 74 20 61 73 20 61 0d 0a 20 20 20 20 20 20  ist as a..      
11c80 20 20 20 20 20 20 23 20 20 20 20 20 20 20 76 61        #       va
11c90 6c 69 64 20 64 69 72 65 63 74 6f 72 79 20 66 6f  lid directory fo
11ca0 72 20 74 68 65 20 74 65 73 74 69 6e 67 20 70 72  r the testing pr
11cb0 6f 63 65 73 73 20 74 6f 20 63 6f 6e 74 69 6e 75  ocess to continu
11cc0 65 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  e...            
11cd0 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  #..            s
11ce0 65 74 20 64 69 72 65 63 74 6f 72 79 20 5b 67 65  et directory [ge
11cf0 74 42 75 69 6c 64 44 69 72 65 63 74 6f 72 79 5d  tBuildDirectory]
11d00 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
11d10 69 66 20 7b 21 5b 66 69 6c 65 20 65 78 69 73 74  if {![file exist
11d20 73 20 24 64 69 72 65 63 74 6f 72 79 5d 20 7c 7c  s $directory] ||
11d30 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
11d40 20 20 20 20 21 5b 66 69 6c 65 20 69 73 64 69 72      ![file isdir
11d50 65 63 74 6f 72 79 20 24 64 69 72 65 63 74 6f 72  ectory $director
11d60 79 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  y]} then {..    
11d70 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
11d80 20 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54             # NOT
11d90 45 3a 20 4a 75 73 74 20 70 72 69 6f 72 20 74 6f  E: Just prior to
11da0 20 61 63 74 75 61 6c 6c 79 20 68 61 6c 74 69 6e   actually haltin
11db0 67 20 74 68 65 20 74 65 73 74 69 6e 67 20 70 72  g the testing pr
11dc0 6f 63 65 73 73 2c 0d 0a 20 20 20 20 20 20 20 20  ocess,..        
11dd0 20 20 20 20 20 20 23 20 20 20 20 20 20 20 61 64        #       ad
11de0 64 20 61 6e 20 65 72 72 6f 72 20 74 6f 20 74 68  d an error to th
11df0 65 20 74 65 73 74 20 6c 6f 67 20 66 69 6c 65 2e  e test log file.
11e00 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
11e10 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  #..             
11e20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
11e30 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
11e40 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
11e50 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 6f          "---- co
11e60 75 6c 64 20 6e 6f 74 20 76 65 72 69 66 79 20 62  uld not verify b
11e70 75 69 6c 64 20 64 69 72 65 63 74 6f 72 79 20 5c  uild directory \
11e80 22 22 20 24 64 69 72 65 63 74 6f 72 79 20 5c 0d  "" $directory \.
11e90 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
11ea0 20 20 20 22 5c 22 2c 20 61 6c 6c 20 74 65 73 74     "\", all test
11eb0 69 6e 67 20 68 61 6c 74 65 64 5c 6e 22 5d 0d 0a  ing halted\n"]..
11ec0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
11ed0 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  #..             
11ee0 20 23 20 4e 4f 54 45 3a 20 52 61 69 73 69 6e 67   # NOTE: Raising
11ef0 20 61 20 73 63 72 69 70 74 20 65 72 72 6f 72 20   a script error 
11f00 66 72 6f 6d 20 74 68 69 73 20 70 6f 69 6e 74 20  from this point 
11f10 73 68 6f 75 6c 64 20 68 61 6c 74 0d 0a 20 20 20  should halt..   
11f20 20 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20             #    
11f30 20 20 20 74 68 65 20 74 65 73 74 69 6e 67 20 70     the testing p
11f40 72 6f 63 65 73 73 2e 0d 0a 20 20 20 20 20 20 20  rocess...       
11f50 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
11f60 20 20 20 20 20 20 20 20 65 72 72 6f 72 20 5b 61          error [a
11f70 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
11f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
11f90 63 6f 75 6c 64 20 6e 6f 74 20 76 65 72 69 66 79  could not verify
11fa0 20 62 75 69 6c 64 20 64 69 72 65 63 74 6f 72 79   build directory
11fb0 20 5c 22 22 20 24 64 69 72 65 63 74 6f 72 79 20   \"" $directory 
11fc0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
11fd0 20 20 20 20 20 22 5c 22 2c 20 61 6c 6c 20 74 65       "\", all te
11fe0 73 74 69 6e 67 20 68 61 6c 74 65 64 22 5d 0d 0a  sting halted"]..
11ff0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
12000 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20           }....  
12010 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
12020 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 6b 69       # NOTE: Ski
12030 70 20 74 72 79 69 6e 67 20 74 6f 20 63 6f 70 79  p trying to copy
12040 20 61 6e 79 20 66 69 6c 65 73 20 69 66 20 77 65   any files if we
12050 20 61 72 65 20 73 6f 20 69 6e 73 74 72 75 63 74   are so instruct
12060 65 64 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23  ed...          #
12070 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b  ..          if {
12080 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  ![info exists ::
12090 6e 6f 28 63 6f 70 79 53 71 6c 69 74 65 46 69 6c  no(copySqliteFil
120a0 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  es)]} then {..  
120b0 20 20 20 20 20 20 20 20 20 20 74 72 79 43 6f 70            tryCop
120c0 79 41 73 73 65 6d 62 6c 79 20 73 71 6c 69 74 65  yAssembly sqlite
120d0 33 2e 64 6c 6c 0d 0a 20 20 20 20 20 20 20 20 20  3.dll..         
120e0 20 20 20 74 72 79 43 6f 70 79 41 73 73 65 6d 62     tryCopyAssemb
120f0 6c 79 20 53 51 4c 69 74 65 2e 49 6e 74 65 72 6f  ly SQLite.Intero
12100 70 2e 64 6c 6c 0d 0a 20 20 20 20 20 20 20 20 20  p.dll..         
12110 20 20 20 74 72 79 43 6f 70 79 41 73 73 65 6d 62     tryCopyAssemb
12120 6c 79 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53  ly System.Data.S
12130 51 4c 69 74 65 2e 64 6c 6c 0d 0a 20 20 20 20 20  QLite.dll..     
12140 20 20 20 20 20 20 20 74 72 79 43 6f 70 79 41 73         tryCopyAs
12150 73 65 6d 62 6c 79 20 53 79 73 74 65 6d 2e 44 61  sembly System.Da
12160 74 61 2e 53 51 4c 69 74 65 2e 4c 69 6e 71 2e 64  ta.SQLite.Linq.d
12170 6c 6c 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d  ll..          }.
12180 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a  ...          #..
12190 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45            # NOTE
121a0 3a 20 53 6b 69 70 20 74 72 79 69 6e 67 20 74 6f  : Skip trying to
121b0 20 6c 6f 61 64 20 61 6e 79 20 66 69 6c 65 73 20   load any files 
121c0 69 66 20 77 65 20 61 72 65 20 73 6f 20 69 6e 73  if we are so ins
121d0 74 72 75 63 74 65 64 2e 0d 0a 20 20 20 20 20 20  tructed...      
121e0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
121f0 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73   if {![info exis
12200 74 73 20 3a 3a 6e 6f 28 6c 6f 61 64 53 71 6c 69  ts ::no(loadSqli
12210 74 65 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e 20  teFiles)]} then 
12220 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  {..            t
12230 72 79 4c 6f 61 64 41 73 73 65 6d 62 6c 79 20 53  ryLoadAssembly S
12240 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
12250 65 2e 64 6c 6c 0d 0a 20 20 20 20 20 20 20 20 20  e.dll..         
12260 20 20 20 74 72 79 4c 6f 61 64 41 73 73 65 6d 62     tryLoadAssemb
12270 6c 79 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53  ly System.Data.S
12280 51 4c 69 74 65 2e 4c 69 6e 71 2e 64 6c 6c 0d 0a  QLite.Linq.dll..
12290 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20            }.... 
122a0 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
122b0 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 6b        # NOTE: Sk
122c0 69 70 20 74 72 79 69 6e 67 20 74 6f 20 64 65 6c  ip trying to del
122d0 65 74 65 20 65 78 74 65 72 6e 61 6c 20 66 69 6c  ete external fil
122e0 65 73 20 69 66 20 77 65 20 61 72 65 20 73 6f 20  es if we are so 
122f0 69 6e 73 74 72 75 63 74 65 64 2e 0d 0a 20 20 20  instructed...   
12300 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
12310 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65      if {![info e
12320 78 69 73 74 73 20 3a 3a 6e 6f 28 64 65 6c 65 74  xists ::no(delet
12330 65 53 71 6c 69 74 65 45 78 74 65 72 6e 61 6c 46  eSqliteExternalF
12340 69 6c 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a  iles)]} then {..
12350 20 20 20 20 20 20 20 20 20 20 20 20 74 72 79 44              tryD
12360 65 6c 65 74 65 42 75 69 6c 64 46 69 6c 65 20 49  eleteBuildFile I
12370 6e 73 74 61 6c 6c 65 72 2e 65 78 65 2e 6d 64 61  nstaller.exe.mda
12380 2e 63 6f 6e 66 69 67 0d 0a 20 20 20 20 20 20 20  .config..       
12390 20 20 20 20 20 74 72 79 44 65 6c 65 74 65 42 75       tryDeleteBu
123a0 69 6c 64 46 69 6c 65 20 74 65 73 74 2e 65 78 65  ildFile test.exe
123b0 2e 6d 64 61 2e 63 6f 6e 66 69 67 0d 0a 20 20 20  .mda.config..   
123c0 20 20 20 20 20 20 20 20 20 74 72 79 44 65 6c 65           tryDele
123d0 74 65 42 75 69 6c 64 46 69 6c 65 20 74 65 73 74  teBuildFile test
123e0 6c 69 6e 71 2e 65 78 65 2e 6d 64 61 2e 63 6f 6e  linq.exe.mda.con
123f0 66 69 67 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  fig..          }
12400 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d  ....          #.
12410 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54  .          # NOT
12420 45 3a 20 53 6b 69 70 20 74 72 79 69 6e 67 20 74  E: Skip trying t
12430 6f 20 63 6f 70 79 20 65 78 74 65 72 6e 61 6c 20  o copy external 
12440 66 69 6c 65 73 20 69 66 20 77 65 20 61 72 65 20  files if we are 
12450 73 6f 20 69 6e 73 74 72 75 63 74 65 64 2e 0d 0a  so instructed...
12460 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
12470 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66         if {![inf
12480 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 63 6f  o exists ::no(co
12490 70 79 53 71 6c 69 74 65 45 78 74 65 72 6e 61 6c  pySqliteExternal
124a0 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d  Files)]} then {.
124b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a  .            #..
124c0 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f              # NO
124d0 54 45 3a 20 43 6f 70 79 20 74 68 65 20 4d 44 41  TE: Copy the MDA
124e0 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 66   configuration f
124f0 69 6c 65 20 66 6f 72 20 74 68 65 20 45 61 67 6c  ile for the Eagl
12500 65 20 73 68 65 6c 6c 20 74 6f 20 74 68 65 0d 0a  e shell to the..
12510 20 20 20 20 20 20 20 20 20 20 20 20 23 20 20 20              #   
12520 20 20 20 20 62 75 69 6c 64 20 6f 75 74 70 75 74      build output
12530 20 64 69 72 65 63 74 6f 72 79 3b 20 68 6f 77 65   directory; howe
12540 76 65 72 2c 20 75 73 65 20 74 68 65 20 6e 61 6d  ver, use the nam
12550 65 20 6f 66 20 74 68 65 20 6c 65 67 61 63 79 0d  e of the legacy.
12560 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 20 20  .            #  
12570 20 20 20 20 20 74 65 73 74 20 65 78 65 63 75 74       test execut
12580 61 62 6c 65 2e 20 20 54 68 69 73 20 77 69 6c 6c  able.  This will
12590 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20   make sure that 
125a0 74 68 65 20 6c 65 67 61 63 79 20 74 65 73 74 73  the legacy tests
125b0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 20  ..            # 
125c0 20 20 20 20 20 20 72 75 6e 20 77 69 74 68 20 74        run with t
125d0 68 65 20 73 61 6d 65 20 73 65 74 20 6f 66 20 4d  he same set of M
125e0 44 41 73 20 63 6f 6e 66 69 67 75 72 65 64 2e 0d  DAs configured..
125f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a  .            #..
12600 20 20 20 20 20 20 20 20 20 20 20 20 74 72 79 43              tryC
12610 6f 70 79 42 69 6e 61 72 79 46 69 6c 65 20 45 61  opyBinaryFile Ea
12620 67 6c 65 53 68 65 6c 6c 2e 65 78 65 2e 6d 64 61  gleShell.exe.mda
12630 2e 63 6f 6e 66 69 67 20 49 6e 73 74 61 6c 6c 65  .config Installe
12640 72 2e 65 78 65 2e 6d 64 61 2e 63 6f 6e 66 69 67  r.exe.mda.config
12650 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 72  ..            tr
12660 79 43 6f 70 79 42 69 6e 61 72 79 46 69 6c 65 20  yCopyBinaryFile 
12670 45 61 67 6c 65 53 68 65 6c 6c 2e 65 78 65 2e 6d  EagleShell.exe.m
12680 64 61 2e 63 6f 6e 66 69 67 20 74 65 73 74 2e 65  da.config test.e
12690 78 65 2e 6d 64 61 2e 63 6f 6e 66 69 67 0d 0a 20  xe.mda.config.. 
126a0 20 20 20 20 20 20 20 20 20 20 20 74 72 79 43 6f             tryCo
126b0 70 79 42 69 6e 61 72 79 46 69 6c 65 20 45 61 67  pyBinaryFile Eag
126c0 6c 65 53 68 65 6c 6c 2e 65 78 65 2e 6d 64 61 2e  leShell.exe.mda.
126d0 63 6f 6e 66 69 67 20 74 65 73 74 6c 69 6e 71 2e  config testlinq.
126e0 65 78 65 2e 6d 64 61 2e 63 6f 6e 66 69 67 0d 0a  exe.mda.config..
126f0 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
12700 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
12710 20 20 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20    catch {..     
12720 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
12730 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
12740 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
12750 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 66 69          "---- fi
12760 6c 65 20 76 65 72 73 69 6f 6e 20 6f 66 20 5c 22  le version of \"
12770 73 71 6c 69 74 65 33 2e 64 6c 6c 5c 22 2e 2e 2e  sqlite3.dll\"...
12780 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20   " \..          
12790 20 20 20 20 5b 66 69 6c 65 20 76 65 72 73 69 6f      [file versio
127a0 6e 20 5b 67 65 74 42 69 6e 61 72 79 46 69 6c 65  n [getBinaryFile
127b0 4e 61 6d 65 20 73 71 6c 69 74 65 33 2e 64 6c 6c  Name sqlite3.dll
127c0 5d 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20  ]] \n]..        
127d0 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 63 61 74  }....        cat
127e0 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  ch {..          
127f0 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
12800 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
12810 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
12820 20 20 20 22 2d 2d 2d 2d 20 66 69 6c 65 20 76 65     "---- file ve
12830 72 73 69 6f 6e 20 6f 66 20 5c 22 53 51 4c 69 74  rsion of \"SQLit
12840 65 2e 49 6e 74 65 72 6f 70 2e 64 6c 6c 5c 22 2e  e.Interop.dll\".
12850 2e 2e 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20  .. " \..        
12860 20 20 20 20 20 20 5b 66 69 6c 65 20 76 65 72 73        [file vers
12870 69 6f 6e 20 5b 67 65 74 42 69 6e 61 72 79 46 69  ion [getBinaryFi
12880 6c 65 4e 61 6d 65 20 53 51 4c 69 74 65 2e 49 6e  leName SQLite.In
12890 74 65 72 6f 70 2e 64 6c 6c 5d 5d 20 5c 6e 5d 0d  terop.dll]] \n].
128a0 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  .        }....  
128b0 20 20 20 20 20 20 63 61 74 63 68 20 7b 0d 0a 20        catch {.. 
128c0 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
128d0 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b  ::test_channel [
128e0 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
128f0 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
12900 2d 20 66 69 6c 65 20 76 65 72 73 69 6f 6e 20 6f  - file version o
12910 66 20 5c 22 53 79 73 74 65 6d 2e 44 61 74 61 2e  f \"System.Data.
12920 53 51 4c 69 74 65 2e 64 6c 6c 5c 22 2e 2e 2e 20  SQLite.dll\"... 
12930 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  " \..           
12940 20 20 20 5b 66 69 6c 65 20 76 65 72 73 69 6f 6e     [file version
12950 20 5b 67 65 74 42 69 6e 61 72 79 46 69 6c 65 4e   [getBinaryFileN
12960 61 6d 65 20 53 79 73 74 65 6d 2e 44 61 74 61 2e  ame System.Data.
12970 53 51 4c 69 74 65 2e 64 6c 6c 5d 5d 20 5c 6e 5d  SQLite.dll]] \n]
12980 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  ..        }.... 
12990 20 20 20 20 20 20 20 63 61 74 63 68 20 7b 0d 0a         catch {..
129a0 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
129b0 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
129c0 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
129d0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d               "--
129e0 2d 2d 20 66 69 6c 65 20 76 65 72 73 69 6f 6e 20  -- file version 
129f0 6f 66 20 5c 22 53 79 73 74 65 6d 2e 44 61 74 61  of \"System.Data
12a00 2e 53 51 4c 69 74 65 2e 4c 69 6e 71 2e 64 6c 6c  .SQLite.Linq.dll
12a10 5c 22 2e 2e 2e 20 22 20 5c 0d 0a 20 20 20 20 20  \"... " \..     
12a20 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20 76           [file v
12a30 65 72 73 69 6f 6e 20 5b 67 65 74 42 69 6e 61 72  ersion [getBinar
12a40 79 46 69 6c 65 4e 61 6d 65 20 53 79 73 74 65 6d  yFileName System
12a50 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 4c 69 6e  .Data.SQLite.Lin
12a60 71 2e 64 6c 6c 5d 5d 20 5c 6e 5d 0d 0a 20 20 20  q.dll]] \n]..   
12a70 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
12a80 20 20 73 65 74 20 61 73 73 65 6d 62 6c 69 65 73    set assemblies
12a90 20 5b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20   [object invoke 
12aa0 41 70 70 44 6f 6d 61 69 6e 2e 43 75 72 72 65 6e  AppDomain.Curren
12ab0 74 44 6f 6d 61 69 6e 20 47 65 74 41 73 73 65 6d  tDomain GetAssem
12ac0 62 6c 69 65 73 5d 0d 0a 0d 0a 20 20 20 20 20 20  blies]....      
12ad0 20 20 6f 62 6a 65 63 74 20 66 6f 72 65 61 63 68    object foreach
12ae0 20 61 73 73 65 6d 62 6c 79 20 24 61 73 73 65 6d   assembly $assem
12af0 62 6c 69 65 73 20 7b 0d 0a 20 20 20 20 20 20 20  blies {..       
12b00 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6d     if {[string m
12b10 61 74 63 68 20 5c 7b 53 79 73 74 65 6d 2e 44 61  atch \{System.Da
12b20 74 61 2e 53 51 4c 69 74 65 2a 20 24 61 73 73 65  ta.SQLite* $asse
12b30 6d 62 6c 79 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  mbly]} then {.. 
12b40 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
12b50 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
12b60 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
12b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12b80 22 2d 2d 2d 2d 20 66 6f 75 6e 64 20 61 73 73 65  "---- found asse
12b90 6d 62 6c 79 3a 20 22 20 24 61 73 73 65 6d 62 6c  mbly: " $assembl
12ba0 79 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20  y \n]..         
12bb0 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d   }..        }...
12bc0 0a 20 20 20 20 20 20 20 20 63 61 74 63 68 20 7b  .        catch {
12bd0 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70 75 74  ..          tput
12be0 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
12bf0 6c 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  l \..           
12c00 20 20 20 22 2d 2d 2d 2d 20 64 65 66 69 6e 65 20     "---- define 
12c10 63 6f 6e 73 74 61 6e 74 73 20 66 6f 72 20 5c 22  constants for \"
12c20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
12c30 74 65 5c 22 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20  te\"... "....   
12c40 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63         if {[catc
12c50 68 20 7b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65  h {object invoke
12c60 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c   -flags +NonPubl
12c70 69 63 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  ic \..          
12c80 20 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44          System.D
12c90 61 74 61 2e 53 51 4c 69 74 65 2e 53 51 4c 69 74  ata.SQLite.SQLit
12ca0 65 33 20 44 65 66 69 6e 65 43 6f 6e 73 74 61 6e  e3 DefineConstan
12cb0 74 73 7d 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ts} \..         
12cc0 20 20 20 20 20 20 20 20 20 64 65 66 69 6e 65 43           defineC
12cd0 6f 6e 73 74 61 6e 74 73 5d 20 3d 3d 20 30 7d 20  onstants] == 0} 
12ce0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
12cf0 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
12d00 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e  t_channel [appen
12d10 64 41 72 67 73 20 5b 66 6f 72 6d 61 74 4c 69 73  dArgs [formatLis
12d20 74 20 5b 6c 73 6f 72 74 20 5c 0d 0a 20 20 20 20  t [lsort \..    
12d30 20 20 20 20 20 20 20 20 20 20 20 20 24 64 65 66              $def
12d40 69 6e 65 43 6f 6e 73 74 61 6e 74 73 5d 20 3c 6e  ineConstants] <n
12d50 6f 6e 65 3e 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20  one>] \n]..     
12d60 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
12d70 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
12d80 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
12d90 20 75 6e 6b 6e 6f 77 6e 5c 6e 0d 0a 20 20 20 20   unknown\n..    
12da0 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
12db0 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 63 61   }....        ca
12dc0 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  tch {..         
12dd0 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
12de0 68 61 6e 6e 65 6c 20 5c 0d 0a 20 20 20 20 20 20  hannel \..      
12df0 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 73 6f          "---- so
12e00 75 72 63 65 20 76 65 72 73 69 6f 6e 20 6f 66 20  urce version of 
12e10 5c 22 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51  \"System.Data.SQ
12e20 4c 69 74 65 2e 64 6c 6c 5c 22 2e 2e 2e 20 22 0d  Lite.dll\"... ".
12e30 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20  ...          if 
12e40 7b 5b 63 61 74 63 68 20 7b 6f 62 6a 65 63 74 20  {[catch {object 
12e50 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e  invoke -flags +N
12e60 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20  onPublic \..    
12e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 79                Sy
12e80 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
12e90 2e 53 51 4c 69 74 65 43 6f 6e 6e 65 63 74 69 6f  .SQLiteConnectio
12ea0 6e 20 50 72 6f 76 69 64 65 72 56 65 72 73 69 6f  n ProviderVersio
12eb0 6e 7d 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  n} \..          
12ec0 20 20 20 20 20 20 20 20 76 65 72 73 69 6f 6e 5d          version]
12ed0 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20   == 0} then {.. 
12ee0 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b             if {[
12ef0 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 76  string length $v
12f00 65 72 73 69 6f 6e 5d 20 3d 3d 20 30 7d 20 74 68  ersion] == 0} th
12f10 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
12f20 20 20 20 20 73 65 74 20 76 65 72 73 69 6f 6e 20      set version 
12f30 6e 75 6c 6c 0d 0a 20 20 20 20 20 20 20 20 20 20  null..          
12f40 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20    }..           
12f50 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
12f60 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
12f70 67 73 20 24 76 65 72 73 69 6f 6e 20 5c 6e 5d 0d  gs $version \n].
12f80 0a 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73  .          } els
12f90 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e {..           
12fa0 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
12fb0 68 61 6e 6e 65 6c 20 75 6e 6b 6e 6f 77 6e 5c 6e  hannel unknown\n
12fc0 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20  ..          }.. 
12fd0 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
12fe0 20 20 20 20 63 61 74 63 68 20 7b 0d 0a 20 20 20      catch {..   
12ff0 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
13000 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5c 0d 0a  test_channel \..
13010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d                "-
13020 2d 2d 2d 20 73 6f 75 72 63 65 20 63 68 65 63 6b  --- source check
13030 6f 75 74 20 6f 66 20 5c 22 53 79 73 74 65 6d 2e  out of \"System.
13040 44 61 74 61 2e 53 51 4c 69 74 65 2e 64 6c 6c 5c  Data.SQLite.dll\
13050 22 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 20 20  "... "....      
13060 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b      if {[catch {
13070 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66  object invoke -f
13080 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20  lags +NonPublic 
13090 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
130a0 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61       System.Data
130b0 2e 53 51 4c 69 74 65 2e 53 51 4c 69 74 65 43 6f  .SQLite.SQLiteCo
130c0 6e 6e 65 63 74 69 6f 6e 20 50 72 6f 76 69 64 65  nnection Provide
130d0 72 53 6f 75 72 63 65 49 64 7d 20 5c 0d 0a 20 20  rSourceId} \..  
130e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
130f0 73 6f 75 72 63 65 49 64 5d 20 3d 3d 20 30 7d 20  sourceId] == 0} 
13100 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
13110 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20      if {[string 
13120 6c 65 6e 67 74 68 20 24 73 6f 75 72 63 65 49 64  length $sourceId
13130 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  ] == 0} then {..
13140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65                se
13150 74 20 73 6f 75 72 63 65 49 64 20 6e 75 6c 6c 0d  t sourceId null.
13160 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  .            }..
13170 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
13180 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
13190 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 24 73  l [appendArgs $s
131a0 6f 75 72 63 65 49 64 20 5c 6e 5d 0d 0a 20 20 20  ourceId \n]..   
131b0 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d         } else {.
131c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75  .            tpu
131d0 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
131e0 65 6c 20 75 6e 6b 6e 6f 77 6e 5c 6e 0d 0a 20 20  el unknown\n..  
131f0 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
13200 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
13210 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
13220 45 3a 20 43 68 65 63 6b 20 74 68 65 20 61 76 61  E: Check the ava
13230 69 6c 61 62 6c 65 20 62 75 69 6c 64 73 20 6f 66  ilable builds of
13240 20 53 51 4c 69 74 65 20 61 6e 64 20 53 79 73 74   SQLite and Syst
13250 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 0d  em.Data.SQLite..
13260 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
13270 20 20 20 20 63 68 65 63 6b 46 6f 72 53 51 4c 69      checkForSQLi
13280 74 65 42 75 69 6c 64 73 20 24 3a 3a 74 65 73 74  teBuilds $::test
13290 5f 63 68 61 6e 6e 65 6c 0d 0a 0d 0a 20 20 20 20  _channel....    
132a0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
132b0 20 4e 4f 54 45 3a 20 4e 6f 77 2c 20 77 65 20 6e   NOTE: Now, we n
132c0 65 65 64 20 74 6f 20 6b 6e 6f 77 20 69 66 20 74  eed to know if t
132d0 68 65 20 53 51 4c 69 74 65 20 63 6f 72 65 20 6c  he SQLite core l
132e0 69 62 72 61 72 79 20 69 73 20 61 76 61 69 6c 61  ibrary is availa
132f0 62 6c 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20  ble..        #  
13300 20 20 20 20 20 28 69 2e 65 2e 20 62 65 63 61 75       (i.e. becau
13310 73 65 20 74 68 65 20 6d 61 6e 61 67 65 64 2d 6f  se the managed-o
13320 6e 6c 79 20 53 79 73 74 65 6d 2e 44 61 74 61 2e  nly System.Data.
13330 53 51 4c 69 74 65 20 61 73 73 65 6d 62 6c 79 20  SQLite assembly 
13340 63 61 6e 0d 0a 20 20 20 20 20 20 20 20 23 20 20  can..        #  
13350 20 20 20 20 20 6c 6f 61 64 20 77 69 74 68 6f 75       load withou
13360 74 20 69 74 3b 20 68 6f 77 65 76 65 72 2c 20 69  t it; however, i
13370 74 20 63 61 6e 6e 6f 74 20 64 6f 20 61 6e 79 74  t cannot do anyt
13380 68 69 6e 67 20 75 73 65 66 75 6c 20 77 69 74 68  hing useful with
13390 6f 75 74 0d 0a 20 20 20 20 20 20 20 20 23 20 20  out..        #  
133a0 20 20 20 20 20 69 74 29 2e 20 20 49 66 20 77 65       it).  If we
133b0 20 61 72 65 20 75 73 69 6e 67 20 74 68 65 20 6d   are using the m
133c0 69 78 65 64 2d 6d 6f 64 65 20 61 73 73 65 6d 62  ixed-mode assemb
133d0 6c 79 20 61 6e 64 20 77 65 20 61 6c 72 65 61 64  ly and we alread
133e0 79 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  y..        #    
133f0 20 20 20 66 6f 75 6e 64 20 69 74 20 28 61 62 6f     found it (abo
13400 76 65 29 2c 20 74 68 69 73 20 73 68 6f 75 6c 64  ve), this should
13410 20 61 6c 77 61 79 73 20 73 75 63 63 65 65 64 2e   always succeed.
13420 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
13430 20 20 20 20 20 63 68 65 63 6b 46 6f 72 53 51 4c       checkForSQL
13440 69 74 65 4c 69 62 72 61 72 79 20 24 3a 3a 74 65  iteLibrary $::te
13450 73 74 5f 63 68 61 6e 6e 65 6c 0d 0a 0d 0a 20 20  st_channel....  
13460 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
13470 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 69   # NOTE: Check i
13480 66 20 74 68 65 20 53 51 4c 69 74 65 20 69 6e 74  f the SQLite int
13490 65 72 6f 70 20 61 73 73 65 6d 62 6c 79 20 69 73  erop assembly is
134a0 20 61 76 61 69 6c 61 62 6c 65 2e 0d 0a 20 20 20   available...   
134b0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
134c0 63 68 65 63 6b 46 6f 72 53 51 4c 69 74 65 49 6e  checkForSQLiteIn
134d0 74 65 72 6f 70 20 24 3a 3a 74 65 73 74 5f 63 68  terop $::test_ch
134e0 61 6e 6e 65 6c 0d 0a 0d 0a 20 20 20 20 20 20 20  annel....       
134f0 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
13500 54 45 3a 20 43 68 65 63 6b 20 74 68 65 20 53 51  TE: Check the SQ
13510 4c 69 74 65 20 64 61 74 61 62 61 73 65 20 61 6e  Lite database an
13520 64 20 74 65 6d 70 6f 72 61 72 79 20 64 69 72 65  d temporary dire
13530 63 74 6f 72 69 65 73 2e 0d 0a 20 20 20 20 20 20  ctories...      
13540 20 20 23 0d 0a 20 20 20 20 20 20 20 20 63 68 65    #..        che
13550 63 6b 46 6f 72 53 51 4c 69 74 65 44 69 72 65 63  ckForSQLiteDirec
13560 74 6f 72 69 65 73 20 24 3a 3a 74 65 73 74 5f 63  tories $::test_c
13570 68 61 6e 6e 65 6c 0d 0a 0d 0a 20 20 20 20 20 20  hannel....      
13580 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
13590 4f 54 45 3a 20 41 74 74 65 6d 70 74 20 74 6f 20  OTE: Attempt to 
135a0 64 65 74 65 72 6d 69 6e 65 20 69 66 20 76 61 72  determine if var
135b0 69 6f 75 73 20 63 6f 6d 70 69 6c 65 2d 74 69 6d  ious compile-tim
135c0 65 20 6f 70 74 69 6f 6e 73 20 6e 65 65 64 65 64  e options needed
135d0 20 66 6f 72 0d 0a 20 20 20 20 20 20 20 20 23 20   for..        # 
135e0 20 20 20 20 20 20 74 65 73 74 20 63 6f 6e 73 74        test const
135f0 72 61 69 6e 74 73 20 77 65 72 65 20 65 6e 61 62  raints were enab
13600 6c 65 64 20 66 6f 72 20 74 68 65 20 6d 61 6e 61  led for the mana
13610 67 65 64 20 61 73 73 65 6d 62 6c 79 2e 20 20 54  ged assembly.  T
13620 68 65 72 65 0d 0a 20 20 20 20 20 20 20 20 23 20  here..        # 
13630 20 20 20 20 20 20 61 72 65 20 73 6f 6d 65 20 63        are some c
13640 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69  ompile-time opti
13650 6f 6e 73 20 74 68 61 74 20 6d 75 73 74 20 61 6c  ons that must al
13660 73 6f 20 68 61 76 65 20 62 65 65 6e 20 65 6e 61  so have been ena
13670 62 6c 65 64 0d 0a 20 20 20 20 20 20 20 20 23 20  bled..        # 
13680 20 20 20 20 20 20 66 6f 72 20 74 68 65 20 69 6e        for the in
13690 74 65 72 6f 70 20 61 73 73 65 6d 62 6c 79 20 69  terop assembly i
136a0 6e 20 6f 72 64 65 72 20 74 6f 20 62 65 20 65 66  n order to be ef
136b0 66 65 63 74 69 76 65 2e 20 20 46 6f 72 20 74 68  fective.  For th
136c0 6f 73 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20  ose..        #  
136d0 20 20 20 20 20 6f 70 74 69 6f 6e 73 2c 20 69 74       options, it
136e0 20 77 69 6c 6c 20 62 65 20 61 73 73 75 6d 65 64   will be assumed
136f0 20 74 68 61 74 20 69 74 20 77 61 73 20 65 6e 61   that it was ena
13700 62 6c 65 64 20 66 6f 72 20 74 68 65 20 69 6e 74  bled for the int
13710 65 72 6f 70 0d 0a 20 20 20 20 20 20 20 20 23 20  erop..        # 
13720 20 20 20 20 20 20 61 73 73 65 6d 62 6c 79 20 69        assembly i
13730 66 20 69 74 20 77 61 73 20 65 6e 61 62 6c 65 64  f it was enabled
13740 20 66 6f 72 20 74 68 65 20 6d 61 6e 61 67 65 64   for the managed
13750 20 61 73 73 65 6d 62 6c 79 2e 0d 0a 20 20 20 20   assembly...    
13760 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 66      #..        f
13770 6f 72 65 61 63 68 20 64 65 66 69 6e 65 43 6f 6e  oreach defineCon
13780 73 74 61 6e 74 20 5b 6c 69 73 74 20 5c 0d 0a 20  stant [list \.. 
13790 20 20 20 20 20 20 20 20 20 20 20 43 48 45 43 4b             CHECK
137a0 5f 53 54 41 54 45 20 43 4f 55 4e 54 5f 48 41 4e  _STATE COUNT_HAN
137b0 44 4c 45 20 44 45 42 55 47 20 49 4e 54 45 52 4f  DLE DEBUG INTERO
137c0 50 5f 43 4f 44 45 43 20 49 4e 54 45 52 4f 50 5f  P_CODEC INTEROP_
137d0 44 45 42 55 47 20 5c 0d 0a 20 20 20 20 20 20 20  DEBUG \..       
137e0 20 20 20 20 20 49 4e 54 45 52 4f 50 5f 45 58 54       INTEROP_EXT
137f0 45 4e 53 49 4f 4e 5f 46 55 4e 43 54 49 4f 4e 53  ENSION_FUNCTIONS
13800 20 49 4e 54 45 52 4f 50 5f 4c 45 47 41 43 59 5f   INTEROP_LEGACY_
13810 43 4c 4f 53 45 20 49 4e 54 45 52 4f 50 5f 4c 4f  CLOSE INTEROP_LO
13820 47 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  G \..           
13830 20 49 4e 54 45 52 4f 50 5f 54 45 53 54 5f 45 58   INTEROP_TEST_EX
13840 54 45 4e 53 49 4f 4e 20 49 4e 54 45 52 4f 50 5f  TENSION INTEROP_
13850 56 49 52 54 55 41 4c 5f 54 41 42 4c 45 20 4e 45  VIRTUAL_TABLE NE
13860 54 5f 32 30 20 4e 45 54 5f 33 35 20 5c 0d 0a 20  T_20 NET_35 \.. 
13870 20 20 20 20 20 20 20 20 20 20 20 4e 45 54 5f 34             NET_4
13880 30 20 4e 45 54 5f 34 35 20 4e 45 54 5f 43 4f 4d  0 NET_45 NET_COM
13890 50 41 43 54 5f 32 30 20 50 4c 41 54 46 4f 52 4d  PACT_20 PLATFORM
138a0 5f 43 4f 4d 50 41 43 54 46 52 41 4d 45 57 4f 52  _COMPACTFRAMEWOR
138b0 4b 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  K \..           
138c0 20 50 52 45 4c 4f 41 44 5f 4e 41 54 49 56 45 5f   PRELOAD_NATIVE_
138d0 4c 49 42 52 41 52 59 20 52 45 54 41 52 47 45 54  LIBRARY RETARGET
138e0 41 42 4c 45 20 53 51 4c 49 54 45 5f 53 54 41 4e  ABLE SQLITE_STAN
138f0 44 41 52 44 20 5c 0d 0a 20 20 20 20 20 20 20 20  DARD \..        
13900 20 20 20 20 54 48 52 4f 57 5f 4f 4e 5f 44 49 53      THROW_ON_DIS
13910 50 4f 53 45 44 20 54 52 41 43 45 20 54 52 41 43  POSED TRACE TRAC
13920 45 5f 43 4f 4e 4e 45 43 54 49 4f 4e 20 54 52 41  E_CONNECTION TRA
13930 43 45 5f 48 41 4e 44 4c 45 20 5c 0d 0a 20 20 20  CE_HANDLE \..   
13940 20 20 20 20 20 20 20 20 20 54 52 41 43 45 5f 50           TRACE_P
13950 52 45 4c 4f 41 44 20 54 52 41 43 45 5f 53 54 41  RELOAD TRACE_STA
13960 54 45 4d 45 4e 54 20 54 52 41 43 45 5f 57 41 52  TEMENT TRACE_WAR
13970 4e 49 4e 47 20 54 52 41 43 4b 5f 4d 45 4d 4f 52  NING TRACK_MEMOR
13980 59 5f 42 59 54 45 53 20 5c 0d 0a 20 20 20 20 20  Y_BYTES \..     
13990 20 20 20 20 20 20 20 55 53 45 5f 49 4e 54 45 52         USE_INTER
139a0 4f 50 5f 44 4c 4c 20 55 53 45 5f 50 52 45 50 41  OP_DLL USE_PREPA
139b0 52 45 5f 56 32 20 57 49 4e 44 4f 57 53 5d 20 7b  RE_V2 WINDOWS] {
139c0 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20  ..          #.. 
139d0 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a           # NOTE:
139e0 20 43 68 65 63 6b 20 69 66 20 74 68 65 20 63 6f   Check if the co
139f0 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f  mpile-time optio
13a00 6e 20 69 73 20 6c 69 73 74 65 64 20 69 6e 20 74  n is listed in t
13a10 68 65 20 6c 69 73 74 20 6f 66 0d 0a 20 20 20 20  he list of..    
13a20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 22 64        #       "d
13a30 65 66 69 6e 65 20 63 6f 6e 73 74 61 6e 74 73 22  efine constants"
13a40 20 6b 65 70 74 20 74 72 61 63 6b 20 6f 66 20 62   kept track of b
13a50 79 20 74 68 65 20 6d 61 6e 61 67 65 64 20 61 73  y the managed as
13a60 73 65 6d 62 6c 79 2e 0d 0a 20 20 20 20 20 20 20  sembly...       
13a70 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
13a80 63 68 65 63 6b 46 6f 72 53 51 4c 69 74 65 44 65  checkForSQLiteDe
13a90 66 69 6e 65 43 6f 6e 73 74 61 6e 74 20 24 3a 3a  fineConstant $::
13aa0 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 24 64 65  test_channel $de
13ab0 66 69 6e 65 43 6f 6e 73 74 61 6e 74 0d 0a 20 20  fineConstant..  
13ac0 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
13ad0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
13ae0 4e 4f 54 45 3a 20 43 68 65 63 6b 20 74 68 65 20  NOTE: Check the 
13af0 63 75 72 72 65 6e 74 20 62 75 69 6c 64 20 79 65  current build ye
13b00 61 72 2e 20 20 42 61 73 69 63 61 6c 6c 79 2c 20  ar.  Basically, 
13b10 74 68 69 73 20 69 6e 64 69 63 61 74 65 73 0d 0a  this indicates..
13b20 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
13b30 77 68 69 63 68 20 76 65 72 73 69 6f 6e 20 6f 66  which version of
13b40 20 4d 53 42 75 69 6c 64 20 61 6e 64 2f 6f 72 20   MSBuild and/or 
13b50 56 69 73 75 61 6c 20 53 74 75 64 69 6f 20 77 61  Visual Studio wa
13b60 73 20 75 73 65 64 20 74 6f 0d 0a 20 20 20 20 20  s used to..     
13b70 20 20 20 23 20 20 20 20 20 20 20 63 6f 6d 70 69     #       compi
13b80 6c 65 20 74 68 65 20 61 73 73 65 6d 62 6c 79 20  le the assembly 
13b90 62 69 6e 61 72 69 65 73 20 75 6e 64 65 72 20 74  binaries under t
13ba0 65 73 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  est...        #.
13bb0 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24  .        tputs $
13bc0 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5c  ::test_channel \
13bd0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 2d  ..            "-
13be0 2d 2d 2d 20 63 68 65 63 6b 69 6e 67 20 66 6f 72  --- checking for
13bf0 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c   System.Data.SQL
13c00 69 74 65 20 62 75 69 6c 64 20 79 65 61 72 2e 2e  ite build year..
13c10 2e 20 22 0d 0a 0d 0a 20 20 20 20 20 20 20 20 73  . "....        s
13c20 65 74 20 79 65 61 72 20 5b 67 65 74 42 75 69 6c  et year [getBuil
13c30 64 59 65 61 72 5d 0d 0a 20 20 20 20 20 20 20 20  dYear]..        
13c40 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61  addConstraint [a
13c50 70 70 65 6e 64 41 72 67 73 20 62 75 69 6c 64 59  ppendArgs buildY
13c60 65 61 72 2e 20 24 79 65 61 72 5d 0d 0a 20 20 20  ear. $year]..   
13c70 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
13c80 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
13c90 6e 64 41 72 67 73 20 5c 22 20 24 79 65 61 72 20  ndArgs \" $year 
13ca0 5c 22 5c 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  \"\n]....       
13cb0 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
13cc0 54 45 3a 20 43 68 65 63 6b 20 74 68 65 20 63 75  TE: Check the cu
13cd0 72 72 65 6e 74 20 62 75 69 6c 64 20 63 6f 6e 66  rrent build conf
13ce0 69 67 75 72 61 74 69 6f 6e 2e 20 20 54 68 69 73  iguration.  This
13cf0 20 73 68 6f 75 6c 64 20 6e 6f 72 6d 61 6c 6c 79   should normally
13d00 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
13d10 20 20 62 65 20 65 69 74 68 65 72 20 22 44 65 62    be either "Deb
13d20 75 67 22 20 6f 72 20 22 52 65 6c 65 61 73 65 22  ug" or "Release"
13d30 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
13d40 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
13d50 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5c 0d 0a 20  est_channel \.. 
13d60 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
13d70 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 53 79   checking for Sy
13d80 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
13d90 20 62 75 69 6c 64 20 63 6f 6e 66 69 67 75 72 61   build configura
13da0 74 69 6f 6e 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20  tion... "....   
13db0 20 20 20 20 20 73 65 74 20 63 6f 6e 66 69 67 75       set configu
13dc0 72 61 74 69 6f 6e 20 5b 67 65 74 42 75 69 6c 64  ration [getBuild
13dd0 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 5d 0d 0a  Configuration]..
13de0 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74          addConst
13df0 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67  raint [appendArg
13e00 73 20 62 75 69 6c 64 43 6f 6e 66 69 67 75 72 61  s buildConfigura
13e10 74 69 6f 6e 2e 20 24 63 6f 6e 66 69 67 75 72 61  tion. $configura
13e20 74 69 6f 6e 5d 0d 0a 20 20 20 20 20 20 20 20 74  tion]..        t
13e30 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
13e40 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
13e50 20 5c 22 20 24 63 6f 6e 66 69 67 75 72 61 74 69   \" $configurati
13e60 6f 6e 20 5c 22 5c 6e 5d 0d 0a 0d 0a 20 20 20 20  on \"\n]....    
13e70 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
13e80 20 4e 4f 54 45 3a 20 54 72 79 20 74 6f 20 73 65   NOTE: Try to se
13e90 74 75 70 20 61 6e 20 69 6e 74 65 72 72 75 70 74  tup an interrupt
13ea0 20 63 61 6c 6c 62 61 63 6b 20 75 73 69 6e 67 20   callback using 
13eb0 74 68 65 20 73 63 72 69 70 74 20 64 65 62 75 67  the script debug
13ec0 67 65 72 0d 0a 20 20 20 20 20 20 20 20 23 20 20  ger..        #  
13ed0 20 20 20 20 20 74 68 61 74 20 77 69 6c 6c 20 63       that will c
13ee0 61 6e 63 65 6c 20 61 6c 6c 20 53 51 4c 20 71 75  ancel all SQL qu
13ef0 65 72 69 65 73 20 69 6e 20 70 72 6f 67 72 65 73  eries in progres
13f00 73 20 66 6f 72 20 61 6c 6c 20 64 61 74 61 62 61  s for all databa
13f10 73 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  se..        #   
13f20 20 20 20 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20      connections 
13f30 6b 6e 6f 77 6e 20 74 6f 20 74 68 69 73 20 69 6e  known to this in
13f40 74 65 72 70 72 65 74 65 72 2e 0d 0a 20 20 20 20  terpreter...    
13f50 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 69      #..        i
13f60 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73  f {![info exists
13f70 20 3a 3a 6e 6f 28 73 71 6c 69 74 65 49 6e 74 65   ::no(sqliteInte
13f80 72 72 75 70 74 43 61 6c 6c 62 61 63 6b 29 5d 7d  rruptCallback)]}
13f90 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
13fa0 20 20 20 73 65 74 75 70 44 62 49 6e 74 65 72 72     setupDbInterr
13fb0 75 70 74 43 61 6c 6c 62 61 63 6b 20 24 3a 3a 74  uptCallback $::t
13fc0 65 73 74 5f 63 68 61 6e 6e 65 6c 20 24 3a 3a 74  est_channel $::t
13fd0 65 73 74 5f 6c 6f 67 0d 0a 20 20 20 20 20 20 20  est_log..       
13fe0 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d   }....        #.
13ff0 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
14000 20 43 68 65 63 6b 20 66 6f 72 20 74 68 65 20 6e   Check for the n
14010 61 74 69 76 65 20 72 75 6e 74 69 6d 65 20 6f 70  ative runtime op
14020 74 69 6f 6e 2c 20 77 68 69 63 68 20 77 6f 75 6c  tion, which woul
14030 64 20 6d 65 61 6e 20 77 65 20 61 72 65 0d 0a 20  d mean we are.. 
14040 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 75         #       u
14050 73 69 6e 67 20 74 68 65 20 6d 69 78 65 64 2d 6d  sing the mixed-m
14060 6f 64 65 20 61 73 73 65 6d 62 6c 79 2e 0d 0a 20  ode assembly... 
14070 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
14080 20 20 63 68 65 63 6b 46 6f 72 52 75 6e 74 69 6d    checkForRuntim
14090 65 4f 70 74 69 6f 6e 20 24 3a 3a 74 65 73 74 5f  eOption $::test_
140a0 63 68 61 6e 6e 65 6c 20 6e 61 74 69 76 65 0d 0a  channel native..
140b0 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
140c0 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68 65       # NOTE: Che
140d0 63 6b 20 69 66 20 74 68 65 20 74 65 73 74 20 73  ck if the test s
140e0 75 69 74 65 20 73 68 6f 75 6c 64 20 63 6f 75 6e  uite should coun
140f0 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  t the number of 
14100 63 6f 6e 6e 65 63 74 69 6f 6e 73 0d 0a 20 20 20  connections..   
14110 20 20 20 20 20 23 20 20 20 20 20 20 20 22 6f 70       #       "op
14120 65 6e 65 64 22 20 61 6e 64 20 22 63 6c 6f 73 65  ened" and "close
14130 64 22 20 66 72 6f 6d 20 74 68 65 20 70 6f 6f 6c  d" from the pool
14140 20 77 68 65 6e 20 64 65 74 65 72 6d 69 6e 69 6e   when determinin
14150 67 20 69 66 20 61 20 74 65 73 74 0d 0a 20 20 20  g if a test..   
14160 20 20 20 20 20 23 20 20 20 20 20 20 20 70 61 73       #       pas
14170 73 65 64 2e 20 20 44 69 73 61 62 6c 69 6e 67 20  sed.  Disabling 
14180 74 68 69 73 20 62 65 68 61 76 69 6f 72 20 69 73  this behavior is
14190 20 73 6f 6d 65 74 69 6d 65 73 20 6e 65 63 65 73   sometimes neces
141a0 73 61 72 79 20 28 65 2e 67 2e 0d 0a 20 20 20 20  sary (e.g...    
141b0 20 20 20 20 23 20 20 20 20 20 20 20 64 75 72 69      #       duri
141c0 6e 67 20 74 68 65 20 72 65 6c 65 61 73 65 20 74  ng the release t
141d0 65 73 74 69 6e 67 20 70 72 6f 63 65 73 73 29 20  esting process) 
141e0 62 65 63 61 75 73 65 20 74 68 65 72 65 20 61 72  because there ar
141f0 65 20 73 65 76 65 72 61 6c 0d 0a 20 20 20 20 20  e several..     
14200 20 20 20 23 20 20 20 20 20 20 20 74 65 73 74 73     #       tests
14210 20 74 68 61 74 20 72 65 6c 79 20 6f 6e 20 74 68   that rely on th
14220 65 20 22 6f 70 65 6e 65 64 20 66 72 6f 6d 20 70  e "opened from p
14230 6f 6f 6c 22 20 63 6f 75 6e 74 20 62 65 69 6e 67  ool" count being
14240 20 67 72 65 61 74 65 72 0d 0a 20 20 20 20 20 20   greater..      
14250 20 20 23 20 20 20 20 20 20 20 74 68 61 6e 20 7a    #       than z
14260 65 72 6f 2e 20 20 54 68 65 73 65 20 74 65 73 74  ero.  These test
14270 73 20 6d 61 79 20 66 61 69 6c 20 64 75 65 20 74  s may fail due t
14280 6f 20 74 68 65 20 6e 6f 6e 2d 64 65 74 65 72 6d  o the non-determ
14290 69 6e 69 73 74 69 63 0d 0a 20 20 20 20 20 20 20  inistic..       
142a0 20 23 20 20 20 20 20 20 20 62 65 68 61 76 69 6f   #       behavio
142b0 72 20 6f 66 20 74 68 65 20 43 4c 52 20 47 43 2c  r of the CLR GC,
142c0 20 65 76 65 6e 20 77 68 65 6e 20 74 68 65 72 65   even when there
142d0 20 69 73 20 6e 6f 20 62 75 67 20 69 6e 20 74 68   is no bug in th
142e0 65 20 63 6f 64 65 0d 0a 20 20 20 20 20 20 20 20  e code..        
142f0 23 20 20 20 20 20 20 20 62 65 69 6e 67 20 74 65  #       being te
14300 73 74 65 64 2e 0d 0a 20 20 20 20 20 20 20 20 23  sted...        #
14310 0d 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b 46  ..        checkF
14320 6f 72 52 75 6e 74 69 6d 65 4f 70 74 69 6f 6e 20  orRuntimeOption 
14330 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
14340 6e 6f 50 6f 6f 6c 43 6f 75 6e 74 73 0d 0a 0d 0a  noPoolCounts....
14350 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
14360 20 20 20 23 20 4e 4f 54 45 3a 20 52 65 70 6f 72     # NOTE: Repor
14370 74 20 74 68 65 20 72 65 73 6f 75 72 63 65 20 75  t the resource u
14380 73 61 67 65 20 70 72 69 6f 72 20 74 6f 20 72 75  sage prior to ru
14390 6e 6e 69 6e 67 20 61 6e 79 20 74 65 73 74 73 2e  nning any tests.
143a0 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
143b0 20 20 20 20 20 72 65 70 6f 72 74 53 51 4c 69 74       reportSQLit
143c0 65 52 65 73 6f 75 72 63 65 73 20 24 3a 3a 74 65  eResources $::te
143d0 73 74 5f 63 68 61 6e 6e 65 6c 0d 0a 0d 0a 20 20  st_channel....  
143e0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
143f0 20 23 20 4e 4f 54 45 3a 20 53 68 6f 77 20 74 68   # NOTE: Show th
14400 65 20 61 63 74 69 76 65 20 74 65 73 74 20 63 6f  e active test co
14410 6e 73 74 72 61 69 6e 74 73 2e 0d 0a 20 20 20 20  nstraints...    
14420 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 74      #..        t
14430 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
14440 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
14450 20 22 2d 2d 2d 2d 20 63 6f 6e 73 74 72 61 69 6e   "---- constrain
14460 74 73 3a 20 22 20 5c 0d 0a 20 20 20 20 20 20 20  ts: " \..       
14470 20 20 20 20 20 5b 66 6f 72 6d 61 74 4c 69 73 74       [formatList
14480 20 5b 6c 73 6f 72 74 20 5b 67 65 74 43 6f 6e 73   [lsort [getCons
14490 74 72 61 69 6e 74 73 5d 5d 20 3c 6e 6f 6e 65 3e  traints]] <none>
144a0 5d 20 5c 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  ] \n]....       
144b0 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
144c0 54 45 3a 20 53 61 76 65 20 74 68 65 20 74 65 73  TE: Save the tes
144d0 74 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 66 6f  t constraints fo
144e0 72 20 75 73 65 20 62 79 20 74 68 72 65 61 64 73  r use by threads
144f0 20 63 72 65 61 74 65 64 20 69 6e 20 74 68 69 73   created in this
14500 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
14510 20 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 64 6f    application do
14520 6d 61 69 6e 2e 20 20 54 68 69 73 20 69 73 20 6e  main.  This is n
14530 65 63 65 73 73 61 72 79 20 62 65 63 61 75 73 65  ecessary because
14540 20 61 6c 6c 20 74 68 65 20 45 61 67 6c 65 0d 0a   all the Eagle..
14550 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
14560 22 74 65 73 74 20 63 6f 6e 74 65 78 74 22 20 69  "test context" i
14570 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 70 65  nformation is pe
14580 72 2d 74 68 72 65 61 64 2e 0d 0a 20 20 20 20 20  r-thread...     
14590 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 69 66     #..        if
145a0 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20   {![info exists 
145b0 3a 3a 74 65 73 74 5f 63 6f 6e 73 74 72 61 69 6e  ::test_constrain
145c0 74 73 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  ts]} then {..   
145d0 20 20 20 20 20 20 20 73 65 74 20 3a 3a 74 65 73         set ::tes
145e0 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 24 3a  t_constraints $:
145f0 3a 65 61 67 6c 65 5f 74 65 73 74 73 28 63 6f 6e  :eagle_tests(con
14600 73 74 72 61 69 6e 74 73 29 0d 0a 20 20 20 20 20  straints)..     
14610 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
14620 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
14630 45 3a 20 4c 6f 61 64 20 74 68 65 20 22 61 66 74  E: Load the "aft
14640 65 72 2d 63 6f 6e 73 74 72 61 69 6e 74 73 22 20  er-constraints" 
14650 63 75 73 74 6f 6d 20 70 65 72 2d 75 73 65 72 20  custom per-user 
14660 61 6e 64 2f 6f 72 20 70 65 72 2d 68 6f 73 74 0d  and/or per-host.
14670 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
14680 20 74 65 73 74 20 73 65 74 74 69 6e 67 73 20 6e   test settings n
14690 6f 77 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  ow...        #..
146a0 20 20 20 20 20 20 20 20 75 70 6c 65 76 65 6c 20          uplevel 
146b0 31 20 5b 6c 69 73 74 20 6c 6f 61 64 53 51 4c 69  1 [list loadSQLi
146c0 74 65 54 65 73 74 53 65 74 74 69 6e 67 73 20 24  teTestSettings $
146d0 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 2e  ::test_channel .
146e0 61 66 74 65 72 5d 0d 0a 0d 0a 20 20 20 20 20 20  after]....      
146f0 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
14700 4f 54 45 3a 20 53 68 6f 77 20 77 68 65 6e 20 6f  OTE: Show when o
14710 75 72 20 74 65 73 74 73 20 61 63 74 75 61 6c 6c  ur tests actuall
14720 79 20 62 65 67 61 6e 20 28 6e 6f 77 29 2e 0d 0a  y began (now)...
14730 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
14740 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
14750 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  _channel [append
14760 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
14770 20 20 20 20 22 2d 2d 2d 2d 20 53 79 73 74 65 6d      "---- System
14780 2e 44 61 74 61 2e 53 51 4c 69 74 65 20 74 65 73  .Data.SQLite tes
14790 74 73 20 62 65 67 61 6e 20 61 74 20 22 20 5c 0d  ts began at " \.
147a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 63 6c  .            [cl
147b0 6f 63 6b 20 66 6f 72 6d 61 74 20 5b 63 6c 6f 63  ock format [cloc
147c0 6b 20 73 65 63 6f 6e 64 73 5d 5d 20 5c 6e 5d 0d  k seconds]] \n].
147d0 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d  .      }..    }.
147e0 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 72 75 6e  ....    proc run
147f0 53 51 4c 69 74 65 54 65 73 74 45 70 69 6c 6f 67  SQLiteTestEpilog
14800 75 65 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 23  ue {} {..      #
14810 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
14820 53 6b 69 70 20 72 75 6e 6e 69 6e 67 20 6f 75 72  Skip running our
14830 20 63 75 73 74 6f 6d 20 65 70 69 6c 6f 67 75 65   custom epilogue
14840 20 69 66 20 74 68 65 20 6d 61 69 6e 20 6f 6e 65   if the main one
14850 20 68 61 73 20 62 65 65 6e 0d 0a 20 20 20 20 20   has been..     
14860 20 23 20 20 20 20 20 20 20 73 6b 69 70 70 65 64   #       skipped
14870 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
14880 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69    if {![info exi
14890 73 74 73 20 3a 3a 6e 6f 28 65 70 69 6c 6f 67 75  sts ::no(epilogu
148a0 65 2e 65 61 67 6c 65 29 5d 7d 20 74 68 65 6e 20  e.eagle)]} then 
148b0 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
148c0 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 68        # NOTE: Sh
148d0 6f 77 20 77 68 65 6e 20 6f 75 72 20 74 65 73 74  ow when our test
148e0 73 20 61 63 74 75 61 6c 6c 79 20 65 6e 64 65 64  s actually ended
148f0 20 28 6e 6f 77 29 2e 0d 0a 20 20 20 20 20 20 20   (now)...       
14900 20 23 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74   #..        tput
14910 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
14920 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
14930 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d  .            "--
14940 2d 2d 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53  -- System.Data.S
14950 51 4c 69 74 65 20 74 65 73 74 73 20 65 6e 64 65  QLite tests ende
14960 64 20 61 74 20 22 20 5c 0d 0a 20 20 20 20 20 20  d at " \..      
14970 20 20 20 20 20 20 5b 63 6c 6f 63 6b 20 66 6f 72        [clock for
14980 6d 61 74 20 5b 63 6c 6f 63 6b 20 73 65 63 6f 6e  mat [clock secon
14990 64 73 5d 5d 20 5c 6e 5d 0d 0a 0d 0a 20 20 20 20  ds]] \n]....    
149a0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
149b0 20 42 55 47 46 49 58 3a 20 42 65 66 6f 72 65 20   BUGFIX: Before 
149c0 63 68 65 63 6b 69 6e 67 20 74 68 65 20 66 69 6e  checking the fin
149d0 61 6c 20 72 65 73 6f 75 72 63 65 73 20 69 6e 20  al resources in 
149e0 75 73 65 20 62 79 20 53 51 4c 69 74 65 2c 20 6d  use by SQLite, m
149f0 61 6b 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20  ake..        #  
14a00 20 20 20 20 20 20 20 73 75 72 65 20 62 6f 74 68         sure both
14a10 20 6f 66 20 74 68 65 20 50 52 41 47 4d 41 20 72   of the PRAGMA r
14a20 65 6c 61 74 65 64 20 64 69 72 65 63 74 6f 72 79  elated directory
14a30 20 6e 61 6d 65 73 20 61 72 65 20 66 72 65 65 64   names are freed
14a40 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
14a50 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72 53 51        checkForSQ
14a60 4c 69 74 65 44 69 72 65 63 74 6f 72 69 65 73 20  LiteDirectories 
14a70 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
14a80 74 72 75 65 0d 0a 0d 0a 20 20 20 20 20 20 20 20  true....        
14a90 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
14aa0 45 3a 20 41 6c 73 6f 20 72 65 70 6f 72 74 20 74  E: Also report t
14ab0 68 65 20 72 65 73 6f 75 72 63 65 20 75 73 61 67  he resource usag
14ac0 65 20 61 66 74 65 72 20 72 75 6e 6e 69 6e 67 20  e after running 
14ad0 74 68 65 20 74 65 73 74 73 2e 0d 0a 20 20 20 20  the tests...    
14ae0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72      #..        r
14af0 65 70 6f 72 74 53 51 4c 69 74 65 52 65 73 6f 75  eportSQLiteResou
14b00 72 63 65 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  rces $::test_cha
14b10 6e 6e 65 6c 0d 0a 0d 0a 20 20 20 20 20 20 20 20  nnel....        
14b20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
14b30 45 3a 20 52 65 70 6f 72 74 20 74 68 65 20 63 72  E: Report the cr
14b40 69 74 69 63 61 6c 20 68 61 6e 64 6c 65 20 63 6f  itical handle co
14b50 75 6e 74 73 20 61 66 74 65 72 20 72 75 6e 6e 69  unts after runni
14b60 6e 67 20 74 68 65 20 74 65 73 74 73 2e 0d 0a 20  ng the tests... 
14b70 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
14b80 20 20 67 65 74 53 51 4c 69 74 65 48 61 6e 64 6c    getSQLiteHandl
14b90 65 43 6f 75 6e 74 73 20 24 3a 3a 74 65 73 74 5f  eCounts $::test_
14ba0 63 68 61 6e 6e 65 6c 0d 0a 20 20 20 20 20 20 7d  channel..      }
14bb0 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
14bc0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
14bd0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
14be0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
14bf0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
14c00 23 23 23 23 23 23 23 23 23 23 23 0d 0a 20 20 20  ###########..   
14c10 20 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23   ###############
14c20 23 23 23 23 23 23 23 23 23 23 23 23 23 23 20 45  ############## E
14c30 4e 44 20 45 61 67 6c 65 20 4f 4e 4c 59 20 23 23  ND Eagle ONLY ##
14c40 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
14c50 23 23 23 23 23 23 23 23 23 23 23 23 0d 0a 20 20  ############..  
14c60 20 20 23 23 23 23 23 23 23 23 23 23 23 23 23 23    ##############
14c70 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
14c80 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
14c90 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
14ca0 23 23 23 23 23 23 23 23 23 23 23 23 23 0d 0a 20  #############.. 
14cb0 20 7d 0d 0a 0d 0a 20 20 23 0d 0a 20 20 23 20 4e   }....  #..  # N
14cc0 4f 54 45 3a 20 53 61 76 65 20 74 68 65 20 6e 61  OTE: Save the na
14cd0 6d 65 20 6f 66 20 74 68 65 20 64 69 72 65 63 74  me of the direct
14ce0 6f 72 79 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ory containing t
14cf0 68 69 73 20 66 69 6c 65 2e 0d 0a 20 20 23 0d 0a  his file...  #..
14d00 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69    if {![info exi
14d10 73 74 73 20 63 6f 6d 6d 6f 6e 5f 64 69 72 65 63  sts common_direc
14d20 74 6f 72 79 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  tory]} then {.. 
14d30 20 20 20 73 65 74 20 63 6f 6d 6d 6f 6e 5f 64 69     set common_di
14d40 72 65 63 74 6f 72 79 20 5b 66 69 6c 65 20 64 69  rectory [file di
14d50 72 6e 61 6d 65 20 5b 69 6e 66 6f 20 73 63 72 69  rname [info scri
14d60 70 74 5d 5d 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 23  pt]]..  }....  #
14d70 0d 0a 20 20 23 20 4e 4f 54 45 3a 20 50 72 6f 76  ..  # NOTE: Prov
14d80 69 64 65 20 74 68 65 20 53 79 73 74 65 6d 2e 44  ide the System.D
14d90 61 74 61 2e 53 51 4c 69 74 65 20 74 65 73 74 20  ata.SQLite test 
14da0 70 61 63 6b 61 67 65 20 74 6f 20 74 68 65 20 69  package to the i
14db0 6e 74 65 72 70 72 65 74 65 72 2e 0d 0a 20 20 23  nterpreter...  #
14dc0 0d 0a 20 20 70 61 63 6b 61 67 65 20 70 72 6f 76  ..  package prov
14dd0 69 64 65 20 53 79 73 74 65 6d 2e 44 61 74 61 2e  ide System.Data.
14de0 53 51 4c 69 74 65 2e 54 65 73 74 20 31 2e 30 0d  SQLite.Test 1.0.
14df0 0a 7d 0d 0a                                      .}..