System.Data.SQLite
Hex Artifact Content
Not logged in

Artifact 1aa2dbde009b2182237603a9926c46805566bc45:


0000: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0010: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0020: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0030: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0040: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0d  ###############.
0050: 0a 23 0d 0a 23 20 63 6f 6d 6d 6f 6e 2e 65 61 67  .#..# common.eag
0060: 6c 65 20 2d 2d 0d 0a 23 0d 0a 23 20 57 72 69 74  le --..#..# Writ
0070: 74 65 6e 20 62 79 20 4a 6f 65 20 4d 69 73 74 61  ten by Joe Mista
0080: 63 68 6b 69 6e 2e 0d 0a 23 20 52 65 6c 65 61 73  chkin...# Releas
0090: 65 64 20 74 6f 20 74 68 65 20 70 75 62 6c 69 63  ed to the public
00a0: 20 64 6f 6d 61 69 6e 2c 20 75 73 65 20 61 74 20   domain, use at 
00b0: 79 6f 75 72 20 6f 77 6e 20 72 69 73 6b 21 0d 0a  your own risk!..
00c0: 23 0d 0a 23 23 23 23 23 23 23 23 23 23 23 23 23  #..#############
00d0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
00e0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
00f0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0100: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0110: 23 23 0d 0a 0d 0a 23 0d 0a 23 20 4e 4f 54 45 3a  ##....#..# NOTE:
0120: 20 55 73 65 20 6f 75 72 20 6f 77 6e 20 6e 61 6d   Use our own nam
0130: 65 73 70 61 63 65 20 68 65 72 65 20 62 65 63 61  espace here beca
0140: 75 73 65 20 65 76 65 6e 20 74 68 6f 75 67 68 20  use even though 
0150: 77 65 20 64 6f 20 6e 6f 74 20 64 69 72 65 63 74  we do not direct
0160: 6c 79 0d 0a 23 20 20 20 20 20 20 20 73 75 70 70  ly..#       supp
0170: 6f 72 74 20 6e 61 6d 65 73 70 61 63 65 73 20 6f  ort namespaces o
0180: 75 72 73 65 6c 76 65 73 2c 20 77 65 20 64 6f 20  urselves, we do 
0190: 6e 6f 74 20 77 61 6e 74 20 74 6f 20 70 6f 6c 6c  not want to poll
01a0: 75 74 65 20 74 68 65 20 67 6c 6f 62 61 6c 0d 0a  ute the global..
01b0: 23 20 20 20 20 20 20 20 6e 61 6d 65 73 70 61 63  #       namespac
01c0: 65 20 69 66 20 74 68 69 73 20 73 63 72 69 70 74  e if this script
01d0: 20 61 63 74 75 61 6c 6c 79 20 65 6e 64 73 20 75   actually ends u
01e0: 70 20 62 65 69 6e 67 20 65 76 61 6c 75 61 74 65  p being evaluate
01f0: 64 20 69 6e 20 54 63 6c 2e 0d 0a 23 0d 0a 6e 61  d in Tcl...#..na
0200: 6d 65 73 70 61 63 65 20 65 76 61 6c 20 3a 3a 45  mespace eval ::E
0210: 61 67 6c 65 20 7b 0d 0a 20 20 69 66 20 7b 5b 69  agle {..  if {[i
0220: 73 45 61 67 6c 65 5d 7d 20 74 68 65 6e 20 7b 0d  sEagle]} then {.
0230: 0a 20 20 20 20 23 23 23 23 23 23 23 23 23 23 23  .    ###########
0240: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0250: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0260: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0270: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0280: 0d 0a 20 20 20 20 23 23 23 23 23 23 23 23 23 23  ..    ##########
0290: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
02a0: 23 23 20 42 45 47 49 4e 20 45 61 67 6c 65 20 4f  ## BEGIN Eagle O
02b0: 4e 4c 59 20 23 23 23 23 23 23 23 23 23 23 23 23  NLY ############
02c0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
02d0: 23 0d 0a 20 20 20 20 23 23 23 23 23 23 23 23 23  #..    #########
02e0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
02f0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0300: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0310: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0320: 23 23 0d 0a 0d 0a 20 20 20 20 70 72 6f 63 20 67  ##....    proc g
0330: 65 74 42 75 69 6c 64 59 65 61 72 20 7b 7d 20 7b  etBuildYear {} {
0340: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
0350: 20 23 20 4e 4f 54 45 3a 20 53 65 65 20 69 66 20   # NOTE: See if 
0360: 74 68 65 20 22 79 65 61 72 22 20 73 65 74 74 69  the "year" setti
0370: 6e 67 20 68 61 73 20 62 65 65 6e 20 6f 76 65 72  ng has been over
0380: 72 69 64 64 65 6e 20 62 79 20 74 68 65 20 75 73  ridden by the us
0390: 65 72 20 28 65 2e 67 2e 0d 0a 20 20 20 20 20 20  er (e.g...      
03a0: 23 20 20 20 20 20 20 20 6f 6e 20 74 68 65 20 63  #       on the c
03b0: 6f 6d 6d 61 6e 64 20 6c 69 6e 65 29 2e 20 20 54  ommand line).  T
03c0: 68 69 73 20 68 65 6c 70 73 20 63 6f 6e 74 72 6f  his helps contro
03d0: 6c 20 65 78 61 63 74 6c 79 20 77 68 69 63 68 20  l exactly which 
03e0: 73 65 74 20 6f 66 0d 0a 20 20 20 20 20 20 23 20  set of..      # 
03f0: 20 20 20 20 20 20 62 69 6e 61 72 69 65 73 20 77        binaries w
0400: 65 20 61 72 65 20 74 65 73 74 69 6e 67 2c 20 74  e are testing, t
0410: 68 6f 73 65 20 70 72 6f 64 75 63 65 64 20 75 73  hose produced us
0420: 69 6e 67 20 74 68 65 20 56 69 73 75 61 6c 20 53  ing the Visual S
0430: 74 75 64 69 6f 0d 0a 20 20 20 20 20 20 23 20 20  tudio..      #  
0440: 20 20 20 20 20 32 30 30 35 2c 20 32 30 30 38 2c       2005, 2008,
0450: 20 32 30 31 30 2c 20 6f 72 20 32 30 31 32 20 62   2010, or 2012 b
0460: 75 69 6c 64 20 73 79 73 74 65 6d 73 2e 20 20 54  uild systems.  T
0470: 6f 20 6f 76 65 72 72 69 64 65 20 74 68 69 73 20  o override this 
0480: 76 61 6c 75 65 0d 0a 20 20 20 20 20 20 23 20 20  value..      #  
0490: 20 20 20 20 20 76 69 61 20 74 68 65 20 63 6f 6d       via the com
04a0: 6d 61 6e 64 20 6c 69 6e 65 2c 20 65 6e 74 65 72  mand line, enter
04b0: 20 61 20 63 6f 6d 6d 61 6e 64 20 73 69 6d 69 6c   a command simil
04c0: 61 72 20 74 6f 20 6f 6e 65 20 6f 66 20 74 68 65  ar to one of the
04d0: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
04e0: 66 6f 6c 6c 6f 77 69 6e 67 20 28 61 6c 6c 20 6f  following (all o
04f0: 6e 20 6f 6e 65 20 6c 69 6e 65 29 3a 0d 0a 20 20  n one line):..  
0500: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 20      #..      #  
0510: 20 20 20 20 20 45 61 67 6c 65 53 68 65 6c 6c 2e       EagleShell.
0520: 65 78 65 20 2d 70 72 65 49 6e 69 74 69 61 6c 69  exe -preInitiali
0530: 7a 65 20 22 73 65 74 20 74 65 73 74 5f 79 65 61  ze "set test_yea
0540: 72 20 32 30 30 35 22 0d 0a 20 20 20 20 20 20 23  r 2005"..      #
0550: 20 20 20 20 20 20 20 20 20 2d 66 69 6c 65 20 2e           -file .
0560: 5c 70 61 74 68 5c 74 6f 5c 61 6c 6c 2e 65 61 67  \path\to\all.eag
0570: 6c 65 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  le..      #..   
0580: 20 20 20 23 20 20 20 20 20 20 20 45 61 67 6c 65     #       Eagle
0590: 53 68 65 6c 6c 2e 65 78 65 20 2d 70 72 65 49 6e  Shell.exe -preIn
05a0: 69 74 69 61 6c 69 7a 65 20 22 73 65 74 20 74 65  itialize "set te
05b0: 73 74 5f 79 65 61 72 20 32 30 30 38 22 0d 0a 20  st_year 2008".. 
05c0: 20 20 20 20 20 23 20 20 20 20 20 20 20 20 20 2d       #         -
05d0: 66 69 6c 65 20 2e 5c 70 61 74 68 5c 74 6f 5c 61  file .\path\to\a
05e0: 6c 6c 2e 65 61 67 6c 65 0d 0a 20 20 20 20 20 20  ll.eagle..      
05f0: 23 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  #..      #      
0600: 20 45 61 67 6c 65 53 68 65 6c 6c 2e 65 78 65 20   EagleShell.exe 
0610: 2d 70 72 65 49 6e 69 74 69 61 6c 69 7a 65 20 22  -preInitialize "
0620: 73 65 74 20 74 65 73 74 5f 79 65 61 72 20 32 30  set test_year 20
0630: 31 30 22 0d 0a 20 20 20 20 20 20 23 20 20 20 20  10"..      #    
0640: 20 20 20 20 20 2d 66 69 6c 65 20 2e 5c 70 61 74       -file .\pat
0650: 68 5c 74 6f 5c 61 6c 6c 2e 65 61 67 6c 65 0d 0a  h\to\all.eagle..
0660: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
0670: 20 20 20 20 20 20 20 45 61 67 6c 65 53 68 65 6c         EagleShel
0680: 6c 2e 65 78 65 20 2d 70 72 65 49 6e 69 74 69 61  l.exe -preInitia
0690: 6c 69 7a 65 20 22 73 65 74 20 74 65 73 74 5f 79  lize "set test_y
06a0: 65 61 72 20 32 30 31 32 22 0d 0a 20 20 20 20 20  ear 2012"..     
06b0: 20 23 20 20 20 20 20 20 20 20 20 2d 66 69 6c 65   #         -file
06c0: 20 2e 5c 70 61 74 68 5c 74 6f 5c 61 6c 6c 2e 65   .\path\to\all.e
06d0: 61 67 6c 65 0d 0a 20 20 20 20 20 20 23 0d 0a 20  agle..      #.. 
06e0: 20 20 20 20 20 23 20 20 20 20 20 20 20 45 61 67       #       Eag
06f0: 6c 65 53 68 65 6c 6c 2e 65 78 65 20 2d 70 72 65  leShell.exe -pre
0700: 49 6e 69 74 69 61 6c 69 7a 65 20 22 75 6e 73 65  Initialize "unse
0710: 74 20 2d 6e 6f 63 6f 6d 70 6c 61 69 6e 20 74 65  t -nocomplain te
0720: 73 74 5f 79 65 61 72 22 0d 0a 20 20 20 20 20 20  st_year"..      
0730: 23 20 20 20 20 20 20 20 20 20 2d 66 69 6c 65 20  #         -file 
0740: 2e 5c 70 61 74 68 5c 74 6f 5c 61 6c 6c 2e 65 61  .\path\to\all.ea
0750: 67 6c 65 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  gle..      #..  
0760: 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78      if {[info ex
0770: 69 73 74 73 20 3a 3a 74 65 73 74 5f 79 65 61 72  ists ::test_year
0780: 5d 20 26 26 20 5b 73 74 72 69 6e 67 20 6c 65 6e  ] && [string len
0790: 67 74 68 20 24 3a 3a 74 65 73 74 5f 79 65 61 72  gth $::test_year
07a0: 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20  ] > 0} then {.. 
07b0: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
07c0: 20 20 23 20 4e 4f 54 45 3a 20 55 73 65 20 74 68    # NOTE: Use th
07d0: 65 20 73 70 65 63 69 66 69 65 64 20 74 65 73 74  e specified test
07e0: 20 79 65 61 72 2e 20 20 49 66 20 74 68 69 73 20   year.  If this 
07f0: 76 61 72 69 61 62 6c 65 20 69 73 20 6e 6f 74 20  variable is not 
0800: 73 65 74 2c 20 74 68 65 0d 0a 20 20 20 20 20 20  set, the..      
0810: 20 20 23 20 20 20 20 20 20 20 64 65 66 61 75 6c    #       defaul
0820: 74 20 76 61 6c 75 65 20 77 69 6c 6c 20 62 65 20  t value will be 
0830: 62 61 73 65 64 20 6f 6e 20 77 68 65 74 68 65 72  based on whether
0840: 20 6f 72 20 6e 6f 74 20 45 61 67 6c 65 20 68 61   or not Eagle ha
0850: 73 20 62 65 65 6e 0d 0a 20 20 20 20 20 20 20 20  s been..        
0860: 23 20 20 20 20 20 20 20 63 6f 6d 70 69 6c 65 64  #       compiled
0870: 20 61 67 61 69 6e 73 74 20 74 68 65 20 43 4c 52   against the CLR
0880: 20 76 32 2e 30 20 6f 72 20 43 4c 52 20 76 34 2e   v2.0 or CLR v4.
0890: 30 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  0...        #.. 
08a0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 3a         return $:
08b0: 3a 74 65 73 74 5f 79 65 61 72 0d 0a 20 20 20 20  :test_year..    
08c0: 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
08d0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
08e0: 20 4e 4f 54 45 3a 20 49 66 20 45 61 67 6c 65 20   NOTE: If Eagle 
08f0: 68 61 73 20 62 65 65 6e 20 63 6f 6d 70 69 6c 65  has been compile
0900: 64 20 61 67 61 69 6e 73 74 20 74 68 65 20 43 4c  d against the CL
0910: 52 20 76 34 2e 30 2c 20 75 73 65 20 22 32 30 31  R v4.0, use "201
0920: 30 22 20 62 79 0d 0a 20 20 20 20 20 20 20 20 23  0" by..        #
0930: 20 20 20 20 20 20 20 64 65 66 61 75 6c 74 20 28         default (
0940: 77 65 20 63 6f 75 6c 64 20 75 73 65 20 22 32 30  we could use "20
0950: 31 32 22 20 69 6e 20 74 68 61 74 20 63 61 73 65  12" in that case
0960: 20 61 73 20 77 65 6c 6c 29 20 61 73 20 74 68 65   as well) as the
0970: 20 74 65 73 74 0d 0a 20 20 20 20 20 20 20 20 23   test..        #
0980: 20 20 20 20 20 20 20 79 65 61 72 3b 20 6f 74 68         year; oth
0990: 65 72 77 69 73 65 2c 20 75 73 65 20 22 32 30 30  erwise, use "200
09a0: 38 22 20 62 79 20 64 65 66 61 75 6c 74 20 28 77  8" by default (w
09b0: 65 20 63 6f 75 6c 64 20 75 73 65 20 22 32 30 30  e could use "200
09c0: 35 22 20 69 6e 0d 0a 20 20 20 20 20 20 20 20 23  5" in..        #
09d0: 20 20 20 20 20 20 20 74 68 61 74 20 63 61 73 65         that case
09e0: 20 61 73 20 77 65 6c 6c 29 2e 20 20 49 66 20 61   as well).  If a
09f0: 6e 6f 74 68 65 72 20 6d 61 6a 6f 72 20 5b 69 6e  nother major [in
0a00: 63 6f 6d 70 61 74 69 62 6c 65 5d 20 76 65 72 73  compatible] vers
0a10: 69 6f 6e 20 6f 66 0d 0a 20 20 20 20 20 20 20 20  ion of..        
0a20: 23 20 20 20 20 20 20 20 74 68 65 20 43 4c 52 20  #       the CLR 
0a30: 69 73 20 72 65 6c 65 61 73 65 64 2c 20 74 68 69  is released, thi
0a40: 73 20 63 68 65 63 6b 20 77 69 6c 6c 20 68 61 76  s check will hav
0a50: 65 20 74 6f 20 62 65 20 63 68 61 6e 67 65 64 2e  e to be changed.
0a60: 20 20 54 68 65 0d 0a 20 20 20 20 20 20 20 20 23    The..        #
0a70: 20 20 20 20 20 20 20 64 65 66 61 75 6c 74 20 74         default t
0a80: 65 73 74 20 79 65 61 72 20 74 6f 20 75 73 65 20  est year to use 
0a90: 66 6f 72 20 61 20 70 61 72 74 69 63 75 6c 61 72  for a particular
0aa0: 20 43 4c 52 20 76 65 72 73 69 6f 6e 20 6d 61 79   CLR version may
0ab0: 20 62 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20   be..        #  
0ac0: 20 20 20 20 20 6f 76 65 72 72 69 64 64 65 6e 20       overridden 
0ad0: 62 79 20 73 65 74 74 69 6e 67 20 74 68 65 20 67  by setting the g
0ae0: 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20 22  lobal variable "
0af0: 74 65 73 74 5f 79 65 61 72 5f 63 6c 72 5f 76 24  test_year_clr_v$
0b00: 58 22 2c 0d 0a 20 20 20 20 20 20 20 20 23 20 20  X",..        #  
0b10: 20 20 20 20 20 77 68 65 72 65 20 22 24 58 22 20       where "$X" 
0b20: 6d 61 79 20 5b 63 75 72 72 65 6e 74 6c 79 5d 20  may [currently] 
0b30: 62 65 20 65 69 74 68 65 72 20 22 32 22 20 6f 72  be either "2" or
0b40: 20 22 34 22 2e 0d 0a 20 20 20 20 20 20 20 20 23   "4"...        #
0b50: 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 68  ..        if {[h
0b60: 61 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 69 6d  aveConstraint im
0b70: 61 67 65 52 75 6e 74 69 6d 65 34 30 5d 7d 20 74  ageRuntime40]} t
0b80: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
0b90: 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74   if {[info exist
0ba0: 73 20 3a 3a 74 65 73 74 5f 79 65 61 72 5f 63 6c  s ::test_year_cl
0bb0: 72 5f 76 34 5d 20 26 26 20 5c 0d 0a 20 20 20 20  r_v4] && \..    
0bc0: 20 20 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e            [strin
0bd0: 67 20 6c 65 6e 67 74 68 20 24 3a 3a 74 65 73 74  g length $::test
0be0: 5f 79 65 61 72 5f 63 6c 72 5f 76 34 5d 20 3e 20  _year_clr_v4] > 
0bf0: 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
0c00: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
0c10: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 55 73        # NOTE: Us
0c20: 65 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  e the specified 
0c30: 74 65 73 74 20 79 65 61 72 20 66 6f 72 20 74 68  test year for th
0c40: 65 20 43 4c 52 20 76 34 2e 30 2e 0d 0a 20 20 20  e CLR v4.0...   
0c50: 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
0c60: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 24          return $
0c70: 3a 3a 74 65 73 74 5f 79 65 61 72 5f 63 6c 72 5f  ::test_year_clr_
0c80: 76 34 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 20  v4..          } 
0c90: 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
0ca0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
0cb0: 20 20 20 23 20 4e 4f 54 45 3a 20 55 73 65 20 74     # NOTE: Use t
0cc0: 68 65 20 64 65 66 61 75 6c 74 20 74 65 73 74 20  he default test 
0cd0: 79 65 61 72 20 66 6f 72 20 74 68 65 20 43 4c 52  year for the CLR
0ce0: 20 76 34 2e 30 2e 0d 0a 20 20 20 20 20 20 20 20   v4.0...        
0cf0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
0d00: 20 20 20 72 65 74 75 72 6e 20 32 30 31 30 3b 20     return 2010; 
0d10: 23 20 54 4f 44 4f 3a 20 47 6f 6f 64 20 22 66 61  # TODO: Good "fa
0d20: 6c 6c 62 61 63 6b 22 20 64 65 66 61 75 6c 74 3f  llback" default?
0d30: 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20  ..          }.. 
0d40: 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d         } else {.
0d50: 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b  .          if {[
0d60: 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 74 65  info exists ::te
0d70: 73 74 5f 79 65 61 72 5f 63 6c 72 5f 76 32 5d 20  st_year_clr_v2] 
0d80: 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  && \..          
0d90: 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67      [string leng
0da0: 74 68 20 24 3a 3a 74 65 73 74 5f 79 65 61 72 5f  th $::test_year_
0db0: 63 6c 72 5f 76 32 5d 20 3e 20 30 7d 20 74 68 65  clr_v2] > 0} the
0dc0: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
0dd0: 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   #..            
0de0: 23 20 4e 4f 54 45 3a 20 55 73 65 20 74 68 65 20  # NOTE: Use the 
0df0: 73 70 65 63 69 66 69 65 64 20 74 65 73 74 20 79  specified test y
0e00: 65 61 72 20 66 6f 72 20 74 68 65 20 43 4c 52 20  ear for the CLR 
0e10: 76 32 2e 30 2e 0d 0a 20 20 20 20 20 20 20 20 20  v2.0...         
0e20: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
0e30: 20 20 72 65 74 75 72 6e 20 24 3a 3a 74 65 73 74    return $::test
0e40: 5f 79 65 61 72 5f 63 6c 72 5f 76 32 0d 0a 20 20  _year_clr_v2..  
0e50: 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b          } else {
0e60: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 0d  ..            #.
0e70: 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4e  .            # N
0e80: 4f 54 45 3a 20 55 73 65 20 74 68 65 20 64 65 66  OTE: Use the def
0e90: 61 75 6c 74 20 74 65 73 74 20 79 65 61 72 20 66  ault test year f
0ea0: 6f 72 20 74 68 65 20 43 4c 52 20 76 32 2e 30 2e  or the CLR v2.0.
0eb0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 0d  ..            #.
0ec0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74  .            ret
0ed0: 75 72 6e 20 32 30 30 38 3b 20 23 20 54 4f 44 4f  urn 2008; # TODO
0ee0: 3a 20 47 6f 6f 64 20 22 66 61 6c 6c 62 61 63 6b  : Good "fallback
0ef0: 22 20 64 65 66 61 75 6c 74 3f 0d 0a 20 20 20 20  " default?..    
0f00: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
0f10: 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20   }..      }..   
0f20: 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
0f30: 67 65 74 42 75 69 6c 64 59 65 61 72 73 20 7b 7d  getBuildYears {}
0f40: 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20   {..      #..   
0f50: 20 20 20 23 20 4e 4f 54 45 3a 20 53 65 65 20 69     # NOTE: See i
0f60: 66 20 74 68 65 20 6c 69 73 74 20 6f 66 20 74 65  f the list of te
0f70: 73 74 20 79 65 61 72 73 20 68 61 73 20 62 65 65  st years has bee
0f80: 6e 20 6f 76 65 72 72 69 64 64 65 6e 20 62 79 20  n overridden by 
0f90: 74 68 65 20 75 73 65 72 0d 0a 20 20 20 20 20 20  the user..      
0fa0: 23 20 20 20 20 20 20 20 28 65 2e 67 2e 20 6f 6e  #       (e.g. on
0fb0: 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e   the command lin
0fc0: 65 29 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  e)...      #..  
0fd0: 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78      if {[info ex
0fe0: 69 73 74 73 20 3a 3a 74 65 73 74 5f 79 65 61 72  ists ::test_year
0ff0: 73 5d 20 26 26 20 5b 6c 6c 65 6e 67 74 68 20 24  s] && [llength $
1000: 3a 3a 74 65 73 74 5f 79 65 61 72 73 5d 20 3e 20  ::test_years] > 
1010: 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
1020: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
1030: 4e 4f 54 45 3a 20 55 73 65 20 74 68 65 20 73 70  NOTE: Use the sp
1040: 65 63 69 66 69 65 64 20 6c 69 73 74 20 6f 66 20  ecified list of 
1050: 74 65 73 74 20 79 65 61 72 73 2e 0d 0a 20 20 20  test years...   
1060: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
1070: 72 65 74 75 72 6e 20 24 3a 3a 74 65 73 74 5f 79  return $::test_y
1080: 65 61 72 73 0d 0a 20 20 20 20 20 20 7d 20 65 6c  ears..      } el
1090: 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d  se {..        #.
10a0: 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
10b0: 20 55 73 65 20 74 68 65 20 64 65 66 61 75 6c 74   Use the default
10c0: 20 6c 69 73 74 20 6f 66 20 74 65 73 74 20 79 65   list of test ye
10d0: 61 72 73 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  ars...        #.
10e0: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
10f0: 5b 6c 69 73 74 20 32 30 30 35 20 32 30 30 38 20  [list 2005 2008 
1100: 32 30 31 30 20 32 30 31 32 5d 0d 0a 20 20 20 20  2010 2012]..    
1110: 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20    }..    }..... 
1120: 20 20 20 70 72 6f 63 20 67 65 74 42 75 69 6c 64     proc getBuild
1130: 50 6c 61 74 66 6f 72 6d 20 7b 20 6e 61 74 69 76  Platform { nativ
1140: 65 20 7d 20 7b 0d 0a 20 20 20 20 20 20 69 66 20  e } {..      if 
1150: 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  {[info exists ::
1160: 74 65 73 74 5f 70 6c 61 74 66 6f 72 6d 5d 20 26  test_platform] &
1170: 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b  & \..          [
1180: 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a  string length $:
1190: 3a 74 65 73 74 5f 70 6c 61 74 66 6f 72 6d 5d 20  :test_platform] 
11a0: 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  > 0} then {..   
11b0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
11c0: 23 20 4e 4f 54 45 3a 20 55 73 65 20 74 68 65 20  # NOTE: Use the 
11d0: 73 70 65 63 69 66 69 65 64 20 74 65 73 74 20 70  specified test p
11e0: 6c 61 74 66 6f 72 6d 2e 20 20 49 66 20 74 68 69  latform.  If thi
11f0: 73 20 76 61 72 69 61 62 6c 65 20 69 73 20 6e 6f  s variable is no
1200: 74 20 73 65 74 2c 0d 0a 20 20 20 20 20 20 20 20  t set,..        
1210: 23 20 20 20 20 20 20 20 74 68 65 20 64 65 66 61  #       the defa
1220: 75 6c 74 20 76 61 6c 75 65 20 77 69 6c 6c 20 62  ult value will b
1230: 65 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 6d  e based on the m
1240: 61 63 68 69 6e 65 20 61 72 63 68 69 74 65 63 74  achine architect
1250: 75 72 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  ure...        #.
1260: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
1270: 5b 65 78 70 72 20 7b 24 6e 61 74 69 76 65 20 3f  [expr {$native ?
1280: 20 24 3a 3a 74 65 73 74 5f 70 6c 61 74 66 6f 72   $::test_platfor
1290: 6d 20 3a 20 22 22 7d 5d 0d 0a 20 20 20 20 20 20  m : ""}]..      
12a0: 7d 20 65 6c 73 65 69 66 20 7b 5b 69 6e 66 6f 20  } elseif {[info 
12b0: 65 78 69 73 74 73 20 3a 3a 74 65 73 74 5f 6d 61  exists ::test_ma
12c0: 63 68 69 6e 65 5d 20 26 26 20 5c 0d 0a 20 20 20  chine] && \..   
12d0: 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c         [string l
12e0: 65 6e 67 74 68 20 24 3a 3a 74 65 73 74 5f 6d 61  ength $::test_ma
12f0: 63 68 69 6e 65 5d 20 3e 20 30 7d 20 74 68 65 6e  chine] > 0} then
1300: 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20   {..        #.. 
1310: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 46         # NOTE: F
1320: 6f 72 20 6e 61 74 69 76 65 20 62 75 69 6c 64 73  or native builds
1330: 2c 20 72 65 74 75 72 6e 20 74 68 65 20 70 6c 61  , return the pla
1340: 74 66 6f 72 6d 20 6e 61 6d 65 20 63 6f 72 72 65  tform name corre
1350: 73 70 6f 6e 64 69 6e 67 20 74 6f 0d 0a 20 20 20  sponding to..   
1360: 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68 65       #       the
1370: 20 74 65 73 74 20 6d 61 63 68 69 6e 65 20 61 72   test machine ar
1380: 63 68 69 74 65 63 74 75 72 65 3b 20 6f 74 68 65  chitecture; othe
1390: 72 77 69 73 65 2c 20 72 65 74 75 72 6e 20 61 6e  rwise, return an
13a0: 20 65 6d 70 74 79 0d 0a 20 20 20 20 20 20 20 20   empty..        
13b0: 23 20 20 20 20 20 20 20 73 74 72 69 6e 67 2e 0d  #       string..
13c0: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
13d0: 20 20 20 20 72 65 74 75 72 6e 20 5b 65 78 70 72      return [expr
13e0: 20 7b 24 6e 61 74 69 76 65 20 3f 20 5b 6d 61 63   {$native ? [mac
13f0: 68 69 6e 65 54 6f 50 6c 61 74 66 6f 72 6d 20 24  hineToPlatform $
1400: 3a 3a 74 65 73 74 5f 6d 61 63 68 69 6e 65 5d 20  ::test_machine] 
1410: 3a 20 22 22 7d 5d 0d 0a 20 20 20 20 20 20 7d 20  : ""}]..      } 
1420: 65 6c 73 65 69 66 20 7b 5b 69 6e 66 6f 20 65 78  elseif {[info ex
1430: 69 73 74 73 20 3a 3a 74 63 6c 5f 70 6c 61 74 66  ists ::tcl_platf
1440: 6f 72 6d 28 6d 61 63 68 69 6e 65 29 5d 7d 20 74  orm(machine)]} t
1450: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  hen {..        #
1460: 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
1470: 3a 20 46 6f 72 20 6e 61 74 69 76 65 20 62 75 69  : For native bui
1480: 6c 64 73 2c 20 72 65 74 75 72 6e 20 74 68 65 20  lds, return the 
1490: 70 6c 61 74 66 6f 72 6d 20 6e 61 6d 65 20 63 6f  platform name co
14a0: 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 0d 0a  rresponding to..
14b0: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
14c0: 74 68 65 20 6d 61 63 68 69 6e 65 20 61 72 63 68  the machine arch
14d0: 69 74 65 63 74 75 72 65 3b 20 6f 74 68 65 72 77  itecture; otherw
14e0: 69 73 65 2c 20 72 65 74 75 72 6e 20 61 6e 20 65  ise, return an e
14f0: 6d 70 74 79 20 73 74 72 69 6e 67 2e 0d 0a 20 20  mpty string...  
1500: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
1510: 20 72 65 74 75 72 6e 20 5b 65 78 70 72 20 7b 24   return [expr {$
1520: 6e 61 74 69 76 65 20 3f 20 5c 0d 0a 20 20 20 20  native ? \..    
1530: 20 20 20 20 20 20 20 20 5b 6d 61 63 68 69 6e 65          [machine
1540: 54 6f 50 6c 61 74 66 6f 72 6d 20 24 3a 3a 74 63  ToPlatform $::tc
1550: 6c 5f 70 6c 61 74 66 6f 72 6d 28 6d 61 63 68 69  l_platform(machi
1560: 6e 65 29 5d 20 3a 20 22 22 7d 5d 0d 0a 20 20 20  ne)] : ""}]..   
1570: 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
1580: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
1590: 23 20 4e 4f 54 45 3a 20 4e 6f 20 6d 61 63 68 69  # NOTE: No machi
15a0: 6e 65 20 61 72 63 68 69 74 65 63 74 75 72 65 20  ne architecture 
15b0: 69 73 20 61 76 61 69 6c 61 62 6c 65 2c 20 72 65  is available, re
15c0: 74 75 72 6e 20 61 6e 20 65 6d 70 74 79 20 73 74  turn an empty st
15d0: 72 69 6e 67 2e 0d 0a 20 20 20 20 20 20 20 20 23  ring...        #
15e0: 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ..        return
15f0: 20 22 22 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20   ""..      }..  
1600: 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
1610: 20 67 65 74 42 75 69 6c 64 43 6f 6e 66 69 67 75   getBuildConfigu
1620: 72 61 74 69 6f 6e 20 7b 7d 20 7b 0d 0a 20 20 20  ration {} {..   
1630: 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
1640: 54 45 3a 20 53 65 65 20 69 66 20 74 68 65 20 22  TE: See if the "
1650: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 22 20 73  configuration" s
1660: 65 74 74 69 6e 67 20 68 61 73 20 62 65 65 6e 20  etting has been 
1670: 6f 76 65 72 72 69 64 64 65 6e 20 62 79 20 74 68  overridden by th
1680: 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  e..      #      
1690: 20 75 73 65 72 20 28 65 2e 67 2e 20 6f 6e 20 74   user (e.g. on t
16a0: 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 29  he command line)
16b0: 2e 20 20 54 68 69 73 20 68 65 6c 70 73 20 63 6f  .  This helps co
16c0: 6e 74 72 6f 6c 20 65 78 61 63 74 6c 79 0d 0a 20  ntrol exactly.. 
16d0: 20 20 20 20 20 23 20 20 20 20 20 20 20 77 68 69       #       whi
16e0: 63 68 20 73 65 74 20 6f 66 20 62 69 6e 61 72 69  ch set of binari
16f0: 65 73 20 77 65 20 61 72 65 20 74 65 73 74 69 6e  es we are testin
1700: 67 20 28 69 2e 65 2e 20 74 68 6f 73 65 20 62 75  g (i.e. those bu
1710: 69 6c 74 20 69 6e 20 74 68 65 0d 0a 20 20 20 20  ilt in the..    
1720: 20 20 23 20 20 20 20 20 20 20 22 44 65 62 75 67    #       "Debug
1730: 22 20 6f 72 20 22 52 65 6c 65 61 73 65 22 20 62  " or "Release" b
1740: 75 69 6c 64 20 63 6f 6e 66 69 67 75 72 61 74 69  uild configurati
1750: 6f 6e 73 29 2e 20 20 54 6f 20 6f 76 65 72 72 69  ons).  To overri
1760: 64 65 20 74 68 69 73 0d 0a 20 20 20 20 20 20 23  de this..      #
1770: 20 20 20 20 20 20 20 76 61 6c 75 65 20 76 69 61         value via
1780: 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e   the command lin
1790: 65 2c 20 65 6e 74 65 72 20 61 20 63 6f 6d 6d 61  e, enter a comma
17a0: 6e 64 20 73 69 6d 69 6c 61 72 20 74 6f 20 6f 6e  nd similar to on
17b0: 65 20 6f 66 0d 0a 20 20 20 20 20 20 23 20 20 20  e of..      #   
17c0: 20 20 20 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e      the followin
17d0: 67 20 28 61 6c 6c 20 6f 6e 20 6f 6e 65 20 6c 69  g (all on one li
17e0: 6e 65 29 3a 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ne):..      #.. 
17f0: 20 20 20 20 20 23 20 20 20 20 20 20 20 45 61 67       #       Eag
1800: 6c 65 53 68 65 6c 6c 2e 65 78 65 20 2d 70 72 65  leShell.exe -pre
1810: 49 6e 69 74 69 61 6c 69 7a 65 20 22 73 65 74 20  Initialize "set 
1820: 74 65 73 74 5f 63 6f 6e 66 69 67 75 72 61 74 69  test_configurati
1830: 6f 6e 20 44 65 62 75 67 22 0d 0a 20 20 20 20 20  on Debug"..     
1840: 20 23 20 20 20 20 20 20 20 20 20 2d 66 69 6c 65   #         -file
1850: 20 2e 5c 70 61 74 68 5c 74 6f 5c 61 6c 6c 2e 65   .\path\to\all.e
1860: 61 67 6c 65 0d 0a 20 20 20 20 20 20 23 0d 0a 20  agle..      #.. 
1870: 20 20 20 20 20 23 20 20 20 20 20 20 20 45 61 67       #       Eag
1880: 6c 65 53 68 65 6c 6c 2e 65 78 65 20 2d 70 72 65  leShell.exe -pre
1890: 49 6e 69 74 69 61 6c 69 7a 65 20 22 73 65 74 20  Initialize "set 
18a0: 74 65 73 74 5f 63 6f 6e 66 69 67 75 72 61 74 69  test_configurati
18b0: 6f 6e 20 52 65 6c 65 61 73 65 22 0d 0a 20 20 20  on Release"..   
18c0: 20 20 20 23 20 20 20 20 20 20 20 20 20 2d 66 69     #         -fi
18d0: 6c 65 20 2e 5c 70 61 74 68 5c 74 6f 5c 61 6c 6c  le .\path\to\all
18e0: 2e 65 61 67 6c 65 0d 0a 20 20 20 20 20 20 23 0d  .eagle..      #.
18f0: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 45  .      #       E
1900: 61 67 6c 65 53 68 65 6c 6c 2e 65 78 65 20 2d 66  agleShell.exe -f
1910: 69 6c 65 20 2e 5c 70 61 74 68 5c 74 6f 5c 61 6c  ile .\path\to\al
1920: 6c 2e 65 61 67 6c 65 20 2d 70 72 65 54 65 73 74  l.eagle -preTest
1930: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
1940: 20 20 22 75 6e 73 65 74 20 2d 6e 6f 63 6f 6d 70    "unset -nocomp
1950: 6c 61 69 6e 20 74 65 73 74 5f 63 6f 6e 66 69 67  lain test_config
1960: 75 72 61 74 69 6f 6e 22 0d 0a 20 20 20 20 20 20  uration"..      
1970: 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 6e  #..      if {[in
1980: 66 6f 20 65 78 69 73 74 73 20 3a 3a 74 65 73 74  fo exists ::test
1990: 5f 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 5d 20  _configuration] 
19a0: 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  && \..          
19b0: 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
19c0: 3a 3a 74 65 73 74 5f 63 6f 6e 66 69 67 75 72 61  ::test_configura
19d0: 74 69 6f 6e 5d 20 3e 20 30 7d 20 74 68 65 6e 20  tion] > 0} then 
19e0: 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
19f0: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 55 73        # NOTE: Us
1a00: 65 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  e the specified 
1a10: 74 65 73 74 20 63 6f 6e 66 69 67 75 72 61 74 69  test configurati
1a20: 6f 6e 2e 20 20 54 68 65 20 64 65 66 61 75 6c 74  on.  The default
1a30: 20 76 61 6c 75 65 20 75 73 65 64 0d 0a 20 20 20   value used..   
1a40: 20 20 20 20 20 23 20 20 20 20 20 20 20 66 6f 72       #       for
1a50: 20 74 68 69 73 20 76 61 72 69 61 62 6c 65 20 69   this variable i
1a60: 73 20 74 79 70 69 63 61 6c 6c 79 20 22 52 65 6c  s typically "Rel
1a70: 65 61 73 65 22 2c 20 61 73 20 73 65 74 20 62 79  ease", as set by
1a80: 20 74 68 65 20 74 65 73 74 0d 0a 20 20 20 20 20   the test..     
1a90: 20 20 20 23 20 20 20 20 20 20 20 73 75 69 74 65     #       suite
1aa0: 20 69 74 73 65 6c 66 2e 0d 0a 20 20 20 20 20 20   itself...      
1ab0: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74    #..        ret
1ac0: 75 72 6e 20 24 3a 3a 74 65 73 74 5f 63 6f 6e 66  urn $::test_conf
1ad0: 69 67 75 72 61 74 69 6f 6e 0d 0a 20 20 20 20 20  iguration..     
1ae0: 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
1af0: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
1b00: 4e 4f 54 45 3a 20 4e 6f 72 6d 61 6c 6c 79 2c 20  NOTE: Normally, 
1b10: 77 65 20 77 69 6c 6c 20 6e 65 76 65 72 20 68 69  we will never hi
1b20: 74 20 74 68 69 73 20 63 61 73 65 20 62 65 63 61  t this case beca
1b30: 75 73 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66  use the value of
1b40: 20 74 68 65 0d 0a 20 20 20 20 20 20 20 20 23 20   the..        # 
1b50: 20 20 20 20 20 20 74 65 73 74 20 63 6f 6e 66 69        test confi
1b60: 67 75 72 61 74 69 6f 6e 20 76 61 72 69 61 62 6c  guration variabl
1b70: 65 20 69 73 20 61 6c 77 61 79 73 20 73 65 74 20  e is always set 
1b80: 62 79 20 74 68 65 20 74 65 73 74 20 73 75 69 74  by the test suit
1b90: 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  e..        #    
1ba0: 20 20 20 69 74 73 65 6c 66 3b 20 68 6f 77 65 76     itself; howev
1bb0: 65 72 2c 20 69 74 20 63 61 6e 20 62 65 20 6f 76  er, it can be ov
1bc0: 65 72 72 69 64 64 65 6e 20 75 73 69 6e 67 20 74  erridden using t
1bd0: 68 65 20 75 6e 73 65 74 20 63 6f 6d 6d 61 6e 64  he unset command
1be0: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
1bf0: 20 20 66 72 6f 6d 20 74 68 65 20 2d 70 72 65 54    from the -preT
1c00: 65 73 74 20 6f 70 74 69 6f 6e 20 74 6f 20 74 68  est option to th
1c10: 65 20 74 65 73 74 20 73 75 69 74 65 2e 0d 0a 20  e test suite... 
1c20: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
1c30: 20 20 72 65 74 75 72 6e 20 24 3a 3a 65 61 67 6c    return $::eagl
1c40: 65 5f 70 6c 61 74 66 6f 72 6d 28 63 6f 6e 66 69  e_platform(confi
1c50: 67 75 72 61 74 69 6f 6e 29 0d 0a 20 20 20 20 20  guration)..     
1c60: 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20   }..    }.....  
1c70: 20 20 70 72 6f 63 20 67 65 74 42 75 69 6c 64 43    proc getBuildC
1c80: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 73 20 7b 7d  onfigurations {}
1c90: 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20   {..      #..   
1ca0: 20 20 20 23 20 4e 4f 54 45 3a 20 53 65 65 20 69     # NOTE: See i
1cb0: 66 20 74 68 65 20 6c 69 73 74 20 6f 66 20 74 65  f the list of te
1cc0: 73 74 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  st configuration
1cd0: 73 20 68 61 73 20 62 65 65 6e 20 6f 76 65 72 72  s has been overr
1ce0: 69 64 64 65 6e 20 62 79 0d 0a 20 20 20 20 20 20  idden by..      
1cf0: 23 20 20 20 20 20 20 20 74 68 65 20 75 73 65 72  #       the user
1d00: 20 28 65 2e 67 2e 20 6f 6e 20 74 68 65 20 63 6f   (e.g. on the co
1d10: 6d 6d 61 6e 64 20 6c 69 6e 65 29 2e 0d 0a 20 20  mmand line)...  
1d20: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20      #..      if 
1d30: 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  {[info exists ::
1d40: 74 65 73 74 5f 63 6f 6e 66 69 67 75 72 61 74 69  test_configurati
1d50: 6f 6e 73 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20  ons] && \..     
1d60: 20 20 20 20 20 5b 6c 6c 65 6e 67 74 68 20 24 3a       [llength $:
1d70: 3a 74 65 73 74 5f 63 6f 6e 66 69 67 75 72 61 74  :test_configurat
1d80: 69 6f 6e 73 5d 20 3e 20 30 7d 20 74 68 65 6e 20  ions] > 0} then 
1d90: 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
1da0: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 55 73        # NOTE: Us
1db0: 65 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  e the specified 
1dc0: 6c 69 73 74 20 6f 66 20 74 65 73 74 20 63 6f 6e  list of test con
1dd0: 66 69 67 75 72 61 74 69 6f 6e 73 2e 0d 0a 20 20  figurations...  
1de0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
1df0: 20 72 65 74 75 72 6e 20 24 3a 3a 74 65 73 74 5f   return $::test_
1e00: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 73 0d 0a  configurations..
1e10: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
1e20: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
1e30: 20 20 20 23 20 4e 4f 54 45 3a 20 55 73 65 20 74     # NOTE: Use t
1e40: 68 65 20 64 65 66 61 75 6c 74 20 6c 69 73 74 20  he default list 
1e50: 6f 66 20 74 65 73 74 20 63 6f 6e 66 69 67 75 72  of test configur
1e60: 61 74 69 6f 6e 73 2e 0d 0a 20 20 20 20 20 20 20  ations...       
1e70: 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75   #..        retu
1e80: 72 6e 20 5b 6c 69 73 74 20 44 65 62 75 67 20 52  rn [list Debug R
1e90: 65 6c 65 61 73 65 5d 0d 0a 20 20 20 20 20 20 7d  elease]..      }
1ea0: 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
1eb0: 70 72 6f 63 20 67 65 74 42 75 69 6c 64 42 61 73  proc getBuildBas
1ec0: 65 44 69 72 65 63 74 6f 72 79 20 7b 7d 20 7b 0d  eDirectory {} {.
1ed0: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
1ee0: 23 20 4e 4f 54 45 3a 20 46 69 67 75 72 65 20 6f  # NOTE: Figure o
1ef0: 75 74 20 74 68 65 20 62 61 73 65 20 64 69 72 65  ut the base dire
1f00: 63 74 6f 72 79 20 77 68 65 72 65 20 61 6c 6c 20  ctory where all 
1f10: 74 68 65 20 62 75 69 6c 64 73 20 73 68 6f 75 6c  the builds shoul
1f20: 64 20 62 65 0d 0a 20 20 20 20 20 20 23 20 20 20  d be..      #   
1f30: 20 20 20 20 6c 6f 63 61 74 65 64 2e 20 20 54 68      located.  Th
1f40: 69 73 20 77 69 6c 6c 20 62 65 20 74 68 65 20 64  is will be the d
1f50: 69 72 65 63 74 6f 72 79 20 74 68 61 74 20 63 6f  irectory that co
1f60: 6e 74 61 69 6e 73 20 74 68 65 20 61 63 74 75 61  ntains the actua
1f70: 6c 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  l..      #      
1f80: 20 62 75 69 6c 64 20 6f 75 74 70 75 74 20 64 69   build output di
1f90: 72 65 63 74 6f 72 79 20 28 65 2e 67 2e 20 70 61  rectory (e.g. pa
1fa0: 72 65 6e 74 20 6f 66 20 22 62 69 6e 22 29 2e 0d  rent of "bin")..
1fb0: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
1fc0: 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73  if {[info exists
1fd0: 20 3a 3a 62 75 69 6c 64 5f 62 61 73 65 5f 64 69   ::build_base_di
1fe0: 72 65 63 74 6f 72 79 5d 20 26 26 20 5c 0d 0a 20  rectory] && \.. 
1ff0: 20 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67           [string
2000: 20 6c 65 6e 67 74 68 20 24 3a 3a 62 75 69 6c 64   length $::build
2010: 5f 62 61 73 65 5f 64 69 72 65 63 74 6f 72 79 5d  _base_directory]
2020: 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20   > 0} then {..  
2030: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
2040: 20 23 20 4e 4f 54 45 3a 20 54 68 65 20 6c 6f 63   # NOTE: The loc
2050: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 62 75 69  ation of the bui
2060: 6c 64 20 62 61 73 65 20 64 69 72 65 63 74 6f 72  ld base director
2070: 79 20 68 61 73 20 62 65 65 6e 20 6f 76 65 72 72  y has been overr
2080: 69 64 64 65 6e 3b 0d 0a 20 20 20 20 20 20 20 20  idden;..        
2090: 23 20 20 20 20 20 20 20 74 68 65 72 65 66 6f 72  #       therefor
20a0: 65 2c 20 75 73 65 20 69 74 20 76 65 72 62 61 74  e, use it verbat
20b0: 69 6d 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  im...        #..
20c0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 24          return $
20d0: 3a 3a 62 75 69 6c 64 5f 62 61 73 65 5f 64 69 72  ::build_base_dir
20e0: 65 63 74 6f 72 79 0d 0a 20 20 20 20 20 20 7d 20  ectory..      } 
20f0: 65 6c 73 65 69 66 20 7b 5b 69 6e 66 6f 20 65 78  elseif {[info ex
2100: 69 73 74 73 20 3a 3a 63 6f 6d 6d 6f 6e 5f 64 69  ists ::common_di
2110: 72 65 63 74 6f 72 79 5d 20 26 26 20 5c 0d 0a 20  rectory] && \.. 
2120: 20 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67           [string
2130: 20 6c 65 6e 67 74 68 20 24 3a 3a 63 6f 6d 6d 6f   length $::commo
2140: 6e 5f 64 69 72 65 63 74 6f 72 79 5d 20 3e 20 30  n_directory] > 0
2150: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
2160: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
2170: 4f 54 45 3a 20 4e 65 78 74 2c 20 66 61 6c 6c 62  OTE: Next, fallb
2180: 61 63 6b 20 74 6f 20 74 68 65 20 70 61 72 65 6e  ack to the paren
2190: 74 20 64 69 72 65 63 74 6f 72 79 20 6f 66 20 74  t directory of t
21a0: 68 65 20 6f 6e 65 20 63 6f 6e 74 61 69 6e 69 6e  he one containin
21b0: 67 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  g..        #    
21c0: 20 20 20 74 68 69 73 20 66 69 6c 65 20 28 69 2e     this file (i.
21d0: 65 2e 20 22 63 6f 6d 6d 6f 6e 2e 65 61 67 6c 65  e. "common.eagle
21e0: 22 29 2c 20 69 66 20 61 76 61 69 6c 61 62 6c 65  "), if available
21f0: 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
2200: 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b 66 69        return [fi
2210: 6c 65 20 64 69 72 6e 61 6d 65 20 24 3a 3a 63 6f  le dirname $::co
2220: 6d 6d 6f 6e 5f 64 69 72 65 63 74 6f 72 79 5d 0d  mmon_directory].
2230: 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 69 66 20  .      } elseif 
2240: 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  {[info exists ::
2250: 70 61 74 68 5d 20 26 26 20 5c 0d 0a 20 20 20 20  path] && \..    
2260: 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65        [string le
2270: 6e 67 74 68 20 24 3a 3a 70 61 74 68 5d 20 3e 20  ngth $::path] > 
2280: 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
2290: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
22a0: 4e 4f 54 45 3a 20 46 69 6e 61 6c 6c 79 2c 20 66  NOTE: Finally, f
22b0: 61 6c 6c 62 61 63 6b 20 74 6f 20 74 68 65 20 70  allback to the p
22c0: 61 72 65 6e 74 20 64 69 72 65 63 74 6f 72 79 20  arent directory 
22d0: 6f 66 20 74 68 65 20 45 61 67 6c 65 54 65 73 74  of the EagleTest
22e0: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
22f0: 20 20 70 61 74 68 2e 20 20 54 68 65 20 45 61 67    path.  The Eag
2300: 6c 65 54 65 73 74 20 70 61 63 6b 61 67 65 20 67  leTest package g
2310: 75 61 72 61 6e 74 65 65 73 20 74 68 61 74 20 74  uarantees that t
2320: 68 69 73 20 76 61 72 69 61 62 6c 65 0d 0a 20 20  his variable..  
2330: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 77 69        #       wi
2340: 6c 6c 20 62 65 20 73 65 74 20 74 6f 20 74 68 65  ll be set to the
2350: 20 64 69 72 65 63 74 6f 72 79 20 63 6f 6e 74 61   directory conta
2360: 69 6e 69 6e 67 20 74 68 65 20 66 69 72 73 74 20  ining the first 
2370: 66 69 6c 65 20 74 6f 0d 0a 20 20 20 20 20 20 20  file to..       
2380: 20 23 20 20 20 20 20 20 20 65 78 65 63 75 74 65   #       execute
2390: 20 74 68 65 20 5b 72 75 6e 54 65 73 74 50 72 6f   the [runTestPro
23a0: 6c 6f 67 75 65 5d 20 73 63 72 69 70 74 20 6c 69  logue] script li
23b0: 62 72 61 72 79 20 70 72 6f 63 65 64 75 72 65 2e  brary procedure.
23c0: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
23d0: 20 20 20 20 20 72 65 74 75 72 6e 20 5b 66 69 6c       return [fil
23e0: 65 20 64 69 72 6e 61 6d 65 20 24 3a 3a 70 61 74  e dirname $::pat
23f0: 68 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65  h]..      } else
2400: 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20   {..        #.. 
2410: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4e         # NOTE: N
2420: 6f 20 70 61 74 68 20 69 73 20 61 76 61 69 6c 61  o path is availa
2430: 62 6c 65 2c 20 72 65 74 75 72 6e 20 61 6e 20 65  ble, return an e
2440: 6d 70 74 79 20 73 74 72 69 6e 67 2e 20 20 54 68  mpty string.  Th
2450: 69 73 20 70 6f 69 6e 74 0d 0a 20 20 20 20 20 20  is point..      
2460: 20 20 23 20 20 20 20 20 20 20 73 68 6f 75 6c 64    #       should
2470: 20 6e 6f 74 20 62 65 20 72 65 61 63 68 65 64 2e   not be reached.
2480: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
2490: 20 20 20 20 20 72 65 74 75 72 6e 20 22 22 0d 0a       return ""..
24a0: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a        }..    }..
24b0: 0c 0d 0a 20 20 20 20 70 72 6f 63 20 6a 6f 69 6e  ...    proc join
24c0: 42 75 69 6c 64 44 69 72 65 63 74 6f 72 79 20 7b  BuildDirectory {
24d0: 20 6e 61 74 69 76 65 20 70 61 74 68 20 79 65 61   native path yea
24e0: 72 20 70 6c 61 74 66 6f 72 6d 20 63 6f 6e 66 69  r platform confi
24f0: 67 75 72 61 74 69 6f 6e 20 7d 20 7b 0d 0a 20 20  guration } {..  
2500: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
2510: 4f 54 45 3a 20 46 69 67 75 72 65 20 6f 75 74 20  OTE: Figure out 
2520: 61 6e 64 20 74 68 65 6e 20 72 65 74 75 72 6e 20  and then return 
2530: 74 68 65 20 66 75 6c 6c 79 20 71 75 61 6c 69 66  the fully qualif
2540: 69 65 64 20 70 61 74 68 20 74 6f 20 74 68 65 20  ied path to the 
2550: 62 75 69 6c 64 0d 0a 20 20 20 20 20 20 23 20 20  build..      #  
2560: 20 20 20 20 20 64 69 72 65 63 74 6f 72 79 20 62       directory b
2570: 61 73 65 64 20 6f 6e 20 61 6c 6c 20 74 68 65 20  ased on all the 
2580: 61 72 67 75 6d 65 6e 74 73 20 70 72 6f 76 69 64  arguments provid
2590: 65 64 20 62 79 20 6f 75 72 20 63 61 6c 6c 65 72  ed by our caller
25a0: 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
25b0: 20 20 69 66 20 7b 24 6e 61 74 69 76 65 7d 20 74    if {$native} t
25c0: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 72  hen {..        r
25d0: 65 74 75 72 6e 20 5b 66 69 6c 65 20 6a 6f 69 6e  eturn [file join
25e0: 20 24 70 61 74 68 20 62 69 6e 20 24 79 65 61 72   $path bin $year
25f0: 20 24 70 6c 61 74 66 6f 72 6d 20 24 63 6f 6e 66   $platform $conf
2600: 69 67 75 72 61 74 69 6f 6e 5d 0d 0a 20 20 20 20  iguration]..    
2610: 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
2620: 20 20 20 20 72 65 74 75 72 6e 20 5b 66 69 6c 65      return [file
2630: 20 6a 6f 69 6e 20 24 70 61 74 68 20 62 69 6e 20   join $path bin 
2640: 24 79 65 61 72 20 24 63 6f 6e 66 69 67 75 72 61  $year $configura
2650: 74 69 6f 6e 20 62 69 6e 5d 0d 0a 20 20 20 20 20  tion bin]..     
2660: 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20   }..    }.....  
2670: 20 20 70 72 6f 63 20 67 65 74 42 75 69 6c 64 44    proc getBuildD
2680: 69 72 65 63 74 6f 72 79 20 7b 7d 20 7b 0d 0a 20  irectory {} {.. 
2690: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
26a0: 4e 4f 54 45 3a 20 53 65 65 20 69 66 20 74 68 65  NOTE: See if the
26b0: 20 22 6e 61 74 69 76 65 22 20 72 75 6e 74 69 6d   "native" runtim
26c0: 65 20 6f 70 74 69 6f 6e 20 68 61 73 20 62 65 65  e option has bee
26d0: 6e 20 73 65 74 2e 20 20 49 66 20 73 6f 2c 20 75  n set.  If so, u
26e0: 73 65 20 74 68 65 0d 0a 20 20 20 20 20 20 23 20  se the..      # 
26f0: 20 20 20 20 20 20 64 69 72 65 63 74 6f 72 79 20        directory 
2700: 66 6f 72 20 74 68 65 20 6d 69 78 65 64 2d 6d 6f  for the mixed-mo
2710: 64 65 20 61 73 73 65 6d 62 6c 79 20 28 61 2e 6b  de assembly (a.k
2720: 2e 61 2e 20 74 68 65 20 6e 61 74 69 76 65 20 69  .a. the native i
2730: 6e 74 65 72 6f 70 0d 0a 20 20 20 20 20 20 23 20  nterop..      # 
2740: 20 20 20 20 20 20 61 73 73 65 6d 62 6c 79 29 2e        assembly).
2750: 20 20 54 6f 20 65 6e 61 62 6c 65 20 74 68 69 73    To enable this
2760: 20 6f 70 74 69 6f 6e 20 76 69 61 20 74 68 65 20   option via the 
2770: 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 2c 20 65 6e  command line, en
2780: 74 65 72 20 61 0d 0a 20 20 20 20 20 20 23 20 20  ter a..      #  
2790: 20 20 20 20 20 63 6f 6d 6d 61 6e 64 20 73 69 6d       command sim
27a0: 69 6c 61 72 20 74 6f 20 6f 6e 65 20 6f 66 20 74  ilar to one of t
27b0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 28 61 6c  he following (al
27c0: 6c 20 6f 6e 20 6f 6e 65 20 6c 69 6e 65 29 3a 0d  l on one line):.
27d0: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
27e0: 23 20 20 20 20 20 20 20 45 61 67 6c 65 53 68 65  #       EagleShe
27f0: 6c 6c 2e 65 78 65 20 2d 69 6e 69 74 69 61 6c 69  ll.exe -initiali
2800: 7a 65 20 2d 72 75 6e 74 69 6d 65 4f 70 74 69 6f  ze -runtimeOptio
2810: 6e 20 6e 61 74 69 76 65 0d 0a 20 20 20 20 20 20  n native..      
2820: 23 20 20 20 20 20 20 20 20 20 2d 66 69 6c 65 20  #         -file 
2830: 2e 5c 70 61 74 68 5c 74 6f 5c 61 6c 6c 2e 65 61  .\path\to\all.ea
2840: 67 6c 65 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  gle..      #..  
2850: 20 20 20 20 23 20 20 20 20 20 20 20 54 6f 20 65      #       To e
2860: 6e 61 62 6c 65 20 74 68 69 73 20 6f 70 74 69 6f  nable this optio
2870: 6e 20 76 69 61 20 74 68 65 20 63 6f 6d 6d 61 6e  n via the comman
2880: 64 20 6c 69 6e 65 20 70 72 69 6f 72 20 74 6f 20  d line prior to 
2890: 74 68 65 20 22 62 65 74 61 20 31 36 22 0d 0a 20  the "beta 16".. 
28a0: 20 20 20 20 20 23 20 20 20 20 20 20 20 72 65 6c       #       rel
28b0: 65 61 73 65 20 6f 66 20 45 61 67 6c 65 2c 20 74  ease of Eagle, t
28c0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6d  he following com
28d0: 6d 61 6e 64 20 6d 75 73 74 20 62 65 20 75 73 65  mand must be use
28e0: 64 20 69 6e 73 74 65 61 64 0d 0a 20 20 20 20 20  d instead..     
28f0: 20 23 20 20 20 20 20 20 20 28 61 6c 73 6f 20 61   #       (also a
2900: 6c 6c 20 6f 6e 20 6f 6e 65 20 6c 69 6e 65 29 3a  ll on one line):
2910: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
2920: 20 23 20 20 20 20 20 20 20 45 61 67 6c 65 53 68   #       EagleSh
2930: 65 6c 6c 2e 65 78 65 20 2d 69 6e 69 74 69 61 6c  ell.exe -initial
2940: 69 7a 65 20 2d 70 6f 73 74 49 6e 69 74 69 61 6c  ize -postInitial
2950: 69 7a 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ize..      #    
2960: 20 20 20 20 20 22 6f 62 6a 65 63 74 20 69 6e 76       "object inv
2970: 6f 6b 65 20 49 6e 74 65 72 70 72 65 74 65 72 2e  oke Interpreter.
2980: 47 65 74 41 63 74 69 76 65 20 41 64 64 52 75 6e  GetActive AddRun
2990: 74 69 6d 65 4f 70 74 69 6f 6e 20 6e 61 74 69 76  timeOption nativ
29a0: 65 22 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  e"..      #     
29b0: 20 20 20 20 2d 66 69 6c 65 20 2e 5c 70 61 74 68      -file .\path
29c0: 5c 74 6f 5c 61 6c 6c 2e 65 61 67 6c 65 0d 0a 20  \to\all.eagle.. 
29d0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66       #..      if
29e0: 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a   {[info exists :
29f0: 3a 62 75 69 6c 64 5f 64 69 72 65 63 74 6f 72 79  :build_directory
2a00: 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20  ] && \..        
2a10: 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68    [string length
2a20: 20 24 3a 3a 62 75 69 6c 64 5f 64 69 72 65 63 74   $::build_direct
2a30: 6f 72 79 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b  ory] > 0} then {
2a40: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
2a50: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 65       # NOTE: The
2a60: 20 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 74 68 65   location of the
2a70: 20 62 75 69 6c 64 20 64 69 72 65 63 74 6f 72 79   build directory
2a80: 20 68 61 73 20 62 65 65 6e 20 6f 76 65 72 72 69   has been overri
2a90: 64 64 65 6e 3b 0d 0a 20 20 20 20 20 20 20 20 23  dden;..        #
2aa0: 20 20 20 20 20 20 20 74 68 65 72 65 66 6f 72 65         therefore
2ab0: 2c 20 75 73 65 20 69 74 20 76 65 72 62 61 74 69  , use it verbati
2ac0: 6d 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  m...        #.. 
2ad0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 3a         return $:
2ae0: 3a 62 75 69 6c 64 5f 64 69 72 65 63 74 6f 72 79  :build_directory
2af0: 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b  ..      } else {
2b00: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
2b10: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 66 20       # NOTE: If 
2b20: 74 68 65 20 22 6e 61 74 69 76 65 22 20 72 75 6e  the "native" run
2b30: 74 69 6d 65 20 6f 70 74 69 6f 6e 20 69 73 20 73  time option is s
2b40: 65 74 2c 20 74 68 65 20 6d 69 78 65 64 2d 6d 6f  et, the mixed-mo
2b50: 64 65 20 61 73 73 65 6d 62 6c 79 0d 0a 20 20 20  de assembly..   
2b60: 20 20 20 20 20 23 20 20 20 20 20 20 20 69 73 20       #       is 
2b70: 62 65 69 6e 67 20 74 65 73 74 65 64 2e 20 20 49  being tested.  I
2b80: 6e 20 74 68 61 74 20 63 61 73 65 2c 20 74 68 65  n that case, the
2b90: 20 70 61 74 68 20 74 6f 20 74 68 65 20 62 75 69   path to the bui
2ba0: 6c 64 20 64 69 72 65 63 74 6f 72 79 0d 0a 20 20  ld directory..  
2bb0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 77 69        #       wi
2bc0: 6c 6c 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 70  ll contain the p
2bd0: 6c 61 74 66 6f 72 6d 20 6e 61 6d 65 20 61 6e 64  latform name and
2be0: 20 61 6c 6c 20 74 68 65 20 62 69 6e 61 72 69 65   all the binarie
2bf0: 73 20 75 6e 64 65 72 20 74 65 73 74 0d 0a 20 20  s under test..  
2c00: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 73 68        #       sh
2c10: 6f 75 6c 64 20 62 65 20 70 72 65 73 65 6e 74 20  ould be present 
2c20: 69 6e 20 74 68 61 74 20 64 69 72 65 63 74 6f 72  in that director
2c30: 79 2e 20 20 49 66 20 74 68 65 20 22 6e 61 74 69  y.  If the "nati
2c40: 76 65 22 20 72 75 6e 74 69 6d 65 0d 0a 20 20 20  ve" runtime..   
2c50: 20 20 20 20 20 23 20 20 20 20 20 20 20 6f 70 74       #       opt
2c60: 69 6f 6e 20 69 73 20 6e 6f 74 20 73 65 74 2c 20  ion is not set, 
2c70: 74 68 65 20 62 75 69 6c 64 20 64 69 72 65 63 74  the build direct
2c80: 6f 72 79 20 77 69 6c 6c 20 62 65 20 63 6f 6e 73  ory will be cons
2c90: 69 64 65 72 65 64 20 74 6f 20 62 65 0d 0a 20 20  idered to be..  
2ca0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 22 70        #       "p
2cb0: 6c 61 74 66 6f 72 6d 2d 6e 65 75 74 72 61 6c 22  latform-neutral"
2cc0: 2c 20 77 69 74 68 20 74 68 65 20 6e 6f 74 61 62  , with the notab
2cd0: 6c 65 20 65 78 63 65 70 74 69 6f 6e 20 6f 66 20  le exception of 
2ce0: 61 6e 79 20 6e 61 74 69 76 65 0d 0a 20 20 20 20  any native..    
2cf0: 20 20 20 20 23 20 20 20 20 20 20 20 61 73 73 65      #       asse
2d00: 6d 62 6c 79 20 28 65 2e 67 2e 20 22 53 51 4c 69  mbly (e.g. "SQLi
2d10: 74 65 2e 49 6e 74 65 72 6f 70 2e 64 6c 6c 22 29  te.Interop.dll")
2d20: 20 63 6f 70 69 65 64 20 74 68 65 72 65 20 64 75   copied there du
2d30: 72 69 6e 67 20 74 68 65 0d 0a 20 20 20 20 20 20  ring the..      
2d40: 20 20 23 20 20 20 20 20 20 20 62 75 69 6c 64 20    #       build 
2d50: 70 72 6f 63 65 73 73 20 69 74 73 65 6c 66 2e 20  process itself. 
2d60: 20 49 66 20 74 68 65 20 62 75 69 6c 64 20 70 72   If the build pr
2d70: 6f 63 65 73 73 20 73 6f 6d 65 68 6f 77 20 64 6f  ocess somehow do
2d80: 65 73 20 6e 6f 74 0d 0a 20 20 20 20 20 20 20 20  es not..        
2d90: 23 20 20 20 20 20 20 20 63 6f 70 79 20 74 68 65  #       copy the
2da0: 20 6e 61 74 69 76 65 20 61 73 73 65 6d 62 6c 79   native assembly
2db0: 20 66 6f 72 20 74 68 69 73 20 70 6c 61 74 66 6f   for this platfo
2dc0: 72 6d 2c 20 6d 6f 73 74 20 6f 66 20 74 68 65 20  rm, most of the 
2dd0: 74 65 73 74 73 0d 0a 20 20 20 20 20 20 20 20 23  tests..        #
2de0: 20 20 20 20 20 20 20 69 6e 20 74 68 65 20 73 75         in the su
2df0: 69 74 65 20 77 69 6c 6c 20 73 69 6d 70 6c 79 20  ite will simply 
2e00: 62 65 20 73 6b 69 70 70 65 64 2e 20 20 47 65 6e  be skipped.  Gen
2e10: 65 72 61 6c 6c 79 20 73 70 65 61 6b 69 6e 67 2c  erally speaking,
2e20: 20 74 68 65 72 65 0d 0a 20 20 20 20 20 20 20 20   there..        
2e30: 23 20 20 20 20 20 20 20 61 72 65 20 74 77 6f 20  #       are two 
2e40: 77 61 79 73 20 74 6f 20 62 75 69 6c 64 20 74 68  ways to build th
2e50: 65 20 62 69 6e 61 72 69 65 73 20 77 68 65 6e 20  e binaries when 
2e60: 70 72 65 70 61 72 69 6e 67 20 74 6f 20 72 75 6e  preparing to run
2e70: 20 74 68 65 0d 0a 20 20 20 20 20 20 20 20 23 20   the..        # 
2e80: 20 20 20 20 20 20 74 65 73 74 20 73 75 69 74 65        test suite
2e90: 3a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  :..        #..  
2ea0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 31 2e        #       1.
2eb0: 20 42 75 69 6c 64 20 74 68 65 20 73 65 70 61 72   Build the separ
2ec0: 61 74 65 20 6d 61 6e 61 67 65 64 20 61 6e 64 20  ate managed and 
2ed0: 6e 61 74 69 76 65 20 61 73 73 65 6d 62 6c 69 65  native assemblie
2ee0: 73 20 75 73 69 6e 67 20 73 6f 6d 65 0d 0a 20 20  s using some..  
2ef0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 20 20        #         
2f00: 20 63 6f 6d 6d 61 6e 64 73 20 73 69 6d 69 6c 61   commands simila
2f10: 72 20 74 6f 3a 0d 0a 20 20 20 20 20 20 20 20 23  r to:..        #
2f20: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
2f30: 20 20 20 20 20 62 75 69 6c 64 2e 62 61 74 20 24       build.bat $
2f40: 7b 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 7d 4d  {Configuration}M
2f50: 61 6e 61 67 65 64 4f 6e 6c 79 20 24 7b 50 6c 61  anagedOnly ${Pla
2f60: 74 66 6f 72 6d 7d 0d 0a 20 20 20 20 20 20 20 20  tform}..        
2f70: 23 20 20 20 20 20 20 20 20 20 20 62 75 69 6c 64  #          build
2f80: 2e 62 61 74 20 24 7b 43 6f 6e 66 69 67 75 72 61  .bat ${Configura
2f90: 74 69 6f 6e 7d 4e 61 74 69 76 65 4f 6e 6c 79 20  tion}NativeOnly 
2fa0: 24 7b 50 6c 61 74 66 6f 72 6d 7d 0d 0a 20 20 20  ${Platform}..   
2fb0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
2fc0: 23 20 20 20 20 20 20 20 20 20 20 57 68 65 72 65  #          Where
2fd0: 20 24 7b 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e   ${Configuration
2fe0: 7d 20 69 73 20 65 69 74 68 65 72 20 22 44 65 62  } is either "Deb
2ff0: 75 67 22 20 6f 72 20 22 52 65 6c 65 61 73 65 22  ug" or "Release"
3000: 20 61 6e 64 0d 0a 20 20 20 20 20 20 20 20 23 20   and..        # 
3010: 20 20 20 20 20 20 20 20 20 24 7b 50 6c 61 74 66           ${Platf
3020: 6f 72 6d 7d 20 69 73 20 65 69 74 68 65 72 20 22  orm} is either "
3030: 57 69 6e 33 32 22 20 6f 72 20 22 78 36 34 22 2e  Win32" or "x64".
3040: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
3050: 20 20 20 20 20 23 20 20 20 20 20 20 20 32 2e 20       #       2. 
3060: 42 75 69 6c 64 20 74 68 65 20 6d 69 78 65 64 2d  Build the mixed-
3070: 6d 6f 64 65 20 61 73 73 65 6d 62 6c 79 20 75 73  mode assembly us
3080: 69 6e 67 20 61 20 63 6f 6d 6d 61 6e 64 20 73 69  ing a command si
3090: 6d 69 6c 61 72 20 74 6f 3a 0d 0a 20 20 20 20 20  milar to:..     
30a0: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
30b0: 20 20 20 20 20 20 20 20 20 62 75 69 6c 64 2e 62           build.b
30c0: 61 74 20 24 7b 43 6f 6e 66 69 67 75 72 61 74 69  at ${Configurati
30d0: 6f 6e 7d 20 24 7b 50 6c 61 74 66 6f 72 6d 7d 0d  on} ${Platform}.
30e0: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
30f0: 20 20 20 20 23 20 20 20 20 20 20 20 20 20 20 57      #          W
3100: 68 65 72 65 20 24 7b 43 6f 6e 66 69 67 75 72 61  here ${Configura
3110: 74 69 6f 6e 7d 20 69 73 20 65 69 74 68 65 72 20  tion} is either 
3120: 22 44 65 62 75 67 22 20 6f 72 20 22 52 65 6c 65  "Debug" or "Rele
3130: 61 73 65 22 20 61 6e 64 0d 0a 20 20 20 20 20 20  ase" and..      
3140: 20 20 23 20 20 20 20 20 20 20 20 20 20 24 7b 50    #          ${P
3150: 6c 61 74 66 6f 72 6d 7d 20 69 73 20 65 69 74 68  latform} is eith
3160: 65 72 20 22 57 69 6e 33 32 22 20 6f 72 20 22 78  er "Win32" or "x
3170: 36 34 22 2e 20 20 49 66 20 74 68 69 73 20 63 6f  64".  If this co
3180: 6d 6d 61 6e 64 20 69 73 0d 0a 20 20 20 20 20 20  mmand is..      
3190: 20 20 23 20 20 20 20 20 20 20 20 20 20 75 73 65    #          use
31a0: 64 2c 20 76 61 72 69 6f 75 73 20 74 65 73 74 73  d, various tests
31b0: 20 74 68 61 74 20 72 65 71 75 69 72 65 20 73 75   that require su
31c0: 70 70 6c 65 6d 65 6e 74 61 72 79 20 6d 61 6e 61  pplementary mana
31d0: 67 65 64 0d 0a 20 20 20 20 20 20 20 20 23 20 20  ged..        #  
31e0: 20 20 20 20 20 20 20 20 61 73 73 65 6d 62 6c 69          assembli
31f0: 65 73 20 28 65 2e 67 2e 20 4c 49 4e 51 29 20 6d  es (e.g. LINQ) m
3200: 61 79 20 62 65 20 73 6b 69 70 70 65 64 20 75 6e  ay be skipped un
3210: 6c 65 73 73 20 74 68 6f 73 65 20 62 69 6e 61 72  less those binar
3220: 69 65 73 0d 0a 20 20 20 20 20 20 20 20 23 20 20  ies..        #  
3230: 20 20 20 20 20 20 20 20 61 72 65 20 73 75 62 73          are subs
3240: 65 71 75 65 6e 74 6c 79 20 63 6f 70 69 65 64 20  equently copied 
3250: 69 6e 74 6f 20 74 68 65 20 63 6f 72 72 65 63 74  into the correct
3260: 20 64 69 72 65 63 74 6f 72 79 20 28 69 2e 65 2e   directory (i.e.
3270: 20 62 79 0d 0a 20 20 20 20 20 20 20 20 23 20 20   by..        #  
3280: 20 20 20 20 20 20 20 20 22 74 65 73 74 5f 61 6c          "test_al
3290: 6c 2e 62 61 74 22 29 2e 0d 0a 20 20 20 20 20 20  l.bat")...      
32a0: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 20    #..        #  
32b0: 20 20 20 20 20 4e 6f 74 65 20 74 68 61 74 20 61       Note that a
32c0: 6c 6c 20 6f 66 20 74 68 65 20 62 75 69 6c 64 20  ll of the build 
32d0: 63 6f 6d 6d 61 6e 64 73 20 61 62 6f 76 65 20 77  commands above w
32e0: 69 6c 6c 20 64 65 66 61 75 6c 74 20 74 6f 20 75  ill default to u
32f0: 73 69 6e 67 0d 0a 20 20 20 20 20 20 20 20 23 20  sing..        # 
3300: 20 20 20 20 20 20 74 68 65 20 6c 61 74 65 73 74        the latest
3310: 20 76 65 72 73 69 6f 6e 20 6f 66 20 4d 53 42 75   version of MSBu
3320: 69 6c 64 20 61 76 61 69 6c 61 62 6c 65 20 61 6e  ild available an
3330: 64 20 74 68 65 20 22 74 65 73 74 5f 79 65 61 72  d the "test_year
3340: 22 20 6d 61 79 0d 0a 20 20 20 20 20 20 20 20 23  " may..        #
3350: 20 20 20 20 20 20 20 6e 65 65 64 20 74 6f 20 62         need to b
3360: 65 20 61 64 6a 75 73 74 65 64 20 61 63 63 6f 72  e adjusted accor
3370: 64 69 6e 67 6c 79 20 74 6f 20 61 63 74 75 61 6c  dingly to actual
3380: 6c 79 20 72 75 6e 20 74 68 65 20 74 65 73 74 20  ly run the test 
3390: 73 75 69 74 65 2e 0d 0a 20 20 20 20 20 20 20 20  suite...        
33a0: 23 20 20 20 20 20 20 20 52 65 66 65 72 20 74 6f  #       Refer to
33b0: 20 74 68 65 20 63 6f 6d 6d 65 6e 74 73 20 69 6e   the comments in
33c0: 20 5b 67 65 74 42 75 69 6c 64 59 65 61 72 5d 20   [getBuildYear] 
33d0: 66 6f 72 20 6d 6f 72 65 20 69 6e 66 6f 72 6d 61  for more informa
33e0: 74 69 6f 6e 20 6f 6e 0d 0a 20 20 20 20 20 20 20  tion on..       
33f0: 20 23 20 20 20 20 20 20 20 68 6f 77 20 74 6f 20   #       how to 
3400: 73 65 74 20 74 68 69 73 20 76 61 72 69 61 62 6c  set this variabl
3410: 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  e...        #.. 
3420: 20 20 20 20 20 20 20 73 65 74 20 6e 61 74 69 76         set nativ
3430: 65 20 5b 68 61 73 52 75 6e 74 69 6d 65 4f 70 74  e [hasRuntimeOpt
3440: 69 6f 6e 20 6e 61 74 69 76 65 5d 0d 0a 0d 0a 20  ion native].... 
3450: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b 6a         return [j
3460: 6f 69 6e 42 75 69 6c 64 44 69 72 65 63 74 6f 72  oinBuildDirector
3470: 79 20 24 6e 61 74 69 76 65 20 5b 67 65 74 42 75  y $native [getBu
3480: 69 6c 64 42 61 73 65 44 69 72 65 63 74 6f 72 79  ildBaseDirectory
3490: 5d 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ] \..           
34a0: 20 5b 67 65 74 42 75 69 6c 64 59 65 61 72 5d 20   [getBuildYear] 
34b0: 5b 67 65 74 42 75 69 6c 64 50 6c 61 74 66 6f 72  [getBuildPlatfor
34c0: 6d 20 24 6e 61 74 69 76 65 5d 20 5b 67 65 74 42  m $native] [getB
34d0: 75 69 6c 64 43 6f 6e 66 69 67 75 72 61 74 69 6f  uildConfiguratio
34e0: 6e 5d 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20  n]]..      }..  
34f0: 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
3500: 20 67 65 74 42 75 69 6c 64 46 69 6c 65 4e 61 6d   getBuildFileNam
3510: 65 20 7b 20 66 69 6c 65 4e 61 6d 65 20 7d 20 7b  e { fileName } {
3520: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
3530: 20 23 20 4e 4f 54 45 3a 20 52 65 74 75 72 6e 73   # NOTE: Returns
3540: 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 66   the specified f
3550: 69 6c 65 20 6e 61 6d 65 20 61 73 20 69 66 20 69  ile name as if i
3560: 74 20 77 65 72 65 20 6c 6f 63 61 74 65 64 20 69  t were located i
3570: 6e 20 74 68 65 0d 0a 20 20 20 20 20 20 23 20 20  n the..      #  
3580: 20 20 20 20 20 62 75 69 6c 64 20 64 69 72 65 63       build direc
3590: 74 6f 72 79 2c 20 64 69 73 63 61 72 64 69 6e 67  tory, discarding
35a0: 20 61 6e 79 20 64 69 72 65 63 74 6f 72 79 20 69   any directory i
35b0: 6e 66 6f 72 6d 61 74 69 6f 6e 20 70 72 65 73 65  nformation prese
35c0: 6e 74 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  nt..      #     
35d0: 20 20 69 6e 20 74 68 65 20 66 69 6c 65 20 6e 61    in the file na
35e0: 6d 65 20 61 73 20 70 72 6f 76 69 64 65 64 20 62  me as provided b
35f0: 79 20 6f 75 72 20 63 61 6c 6c 65 72 2e 0d 0a 20  y our caller... 
3600: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 72 65       #..      re
3610: 74 75 72 6e 20 5b 66 69 6c 65 20 6e 61 74 69 76  turn [file nativ
3620: 65 6e 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20 20  ename \..       
3630: 20 20 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5b 67     [file join [g
3640: 65 74 42 75 69 6c 64 44 69 72 65 63 74 6f 72 79  etBuildDirectory
3650: 5d 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 66 69  ] [file tail $fi
3660: 6c 65 4e 61 6d 65 5d 5d 5d 0d 0a 20 20 20 20 7d  leName]]]..    }
3670: 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65  .....    proc ge
3680: 74 42 69 6e 61 72 79 44 69 72 65 63 74 6f 72 79  tBinaryDirectory
3690: 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a   {} {..      #..
36a0: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68        # NOTE: Th
36b0: 69 73 20 70 72 6f 63 65 64 75 72 65 20 72 65 74  is procedure ret
36c0: 75 72 6e 73 20 74 68 65 20 64 69 72 65 63 74 6f  urns the directo
36d0: 72 79 20 77 68 65 72 65 20 74 68 65 20 74 65 73  ry where the tes
36e0: 74 20 61 70 70 6c 69 63 61 74 69 6f 6e 0d 0a 20  t application.. 
36f0: 20 20 20 20 20 23 20 20 20 20 20 20 20 69 74 73       #       its
3700: 65 6c 66 20 28 69 2e 65 2e 20 74 68 65 20 45 61  elf (i.e. the Ea
3710: 67 6c 65 20 73 68 65 6c 6c 29 20 69 73 20 6c 6f  gle shell) is lo
3720: 63 61 74 65 64 2e 20 20 54 68 69 73 20 77 69 6c  cated.  This wil
3730: 6c 20 62 65 20 75 73 65 64 20 61 73 0d 0a 20 20  l be used as..  
3740: 20 20 20 20 23 20 20 20 20 20 20 20 74 68 65 20      #       the 
3750: 64 65 73 74 69 6e 61 74 69 6f 6e 20 66 6f 72 20  destination for 
3760: 74 68 65 20 63 6f 70 69 65 64 20 53 79 73 74 65  the copied Syste
3770: 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 20 6e 61  m.Data.SQLite na
3780: 74 69 76 65 20 61 6e 64 0d 0a 20 20 20 20 20 20  tive and..      
3790: 23 20 20 20 20 20 20 20 6d 61 6e 61 67 65 64 20  #       managed 
37a0: 61 73 73 65 6d 62 6c 69 65 73 20 28 69 2e 65 2e  assemblies (i.e.
37b0: 20 62 65 63 61 75 73 65 20 74 68 69 73 20 69 73   because this is
37c0: 20 6f 6e 65 20 6f 66 20 74 68 65 20 66 65 77 20   one of the few 
37d0: 70 6c 61 63 65 73 0d 0a 20 20 20 20 20 20 23 20  places..      # 
37e0: 20 20 20 20 20 20 77 68 65 72 65 20 74 68 65 20        where the 
37f0: 43 4c 52 20 77 69 6c 6c 20 61 63 74 75 61 6c 6c  CLR will actuall
3800: 79 20 66 69 6e 64 20 61 6e 64 20 6c 6f 61 64 20  y find and load 
3810: 74 68 65 6d 20 70 72 6f 70 65 72 6c 79 29 2e 0d  them properly)..
3820: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
3830: 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73  if {[info exists
3840: 20 3a 3a 62 69 6e 61 72 79 5f 64 69 72 65 63 74   ::binary_direct
3850: 6f 72 79 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20  ory] && \..     
3860: 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e       [string len
3870: 67 74 68 20 24 3a 3a 62 69 6e 61 72 79 5f 64 69  gth $::binary_di
3880: 72 65 63 74 6f 72 79 5d 20 3e 20 30 7d 20 74 68  rectory] > 0} th
3890: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d  en {..        #.
38a0: 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
38b0: 20 54 68 65 20 6c 6f 63 61 74 69 6f 6e 20 6f 66   The location of
38c0: 20 74 68 65 20 62 69 6e 61 72 79 20 64 69 72 65   the binary dire
38d0: 63 74 6f 72 79 20 68 61 73 20 62 65 65 6e 20 6f  ctory has been o
38e0: 76 65 72 72 69 64 64 65 6e 3b 0d 0a 20 20 20 20  verridden;..    
38f0: 20 20 20 20 23 20 20 20 20 20 20 20 74 68 65 72      #       ther
3900: 65 66 6f 72 65 2c 20 75 73 65 20 69 74 20 76 65  efore, use it ve
3910: 72 62 61 74 69 6d 2e 0d 0a 20 20 20 20 20 20 20  rbatim...       
3920: 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75   #..        retu
3930: 72 6e 20 24 3a 3a 62 69 6e 61 72 79 5f 64 69 72  rn $::binary_dir
3940: 65 63 74 6f 72 79 0d 0a 20 20 20 20 20 20 7d 20  ectory..      } 
3950: 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
3960: 72 65 74 75 72 6e 20 5b 69 6e 66 6f 20 62 69 6e  return [info bin
3970: 61 72 79 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20  ary]..      }.. 
3980: 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
3990: 63 20 67 65 74 42 69 6e 61 72 79 46 69 6c 65 4e  c getBinaryFileN
39a0: 61 6d 65 20 7b 20 66 69 6c 65 4e 61 6d 65 20 7d  ame { fileName }
39b0: 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20   {..      #..   
39c0: 20 20 20 23 20 4e 4f 54 45 3a 20 52 65 74 75 72     # NOTE: Retur
39d0: 6e 73 20 74 68 65 20 73 70 65 63 69 66 69 65 64  ns the specified
39e0: 20 66 69 6c 65 20 6e 61 6d 65 20 61 73 20 69 66   file name as if
39f0: 20 69 74 20 77 65 72 65 20 6c 6f 63 61 74 65 64   it were located
3a00: 20 69 6e 20 74 68 65 0d 0a 20 20 20 20 20 20 23   in the..      #
3a10: 20 20 20 20 20 20 20 62 69 6e 61 72 79 20 64 69         binary di
3a20: 72 65 63 74 6f 72 79 2c 20 64 69 73 63 61 72 64  rectory, discard
3a30: 69 6e 67 20 61 6e 79 20 64 69 72 65 63 74 6f 72  ing any director
3a40: 79 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 70 72  y information pr
3a50: 65 73 65 6e 74 0d 0a 20 20 20 20 20 20 23 20 20  esent..      #  
3a60: 20 20 20 20 20 69 6e 20 74 68 65 20 66 69 6c 65       in the file
3a70: 20 6e 61 6d 65 20 61 73 20 70 72 6f 76 69 64 65   name as provide
3a80: 64 20 62 79 20 6f 75 72 20 63 61 6c 6c 65 72 2e  d by our caller.
3a90: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
3aa0: 20 72 65 74 75 72 6e 20 5b 66 69 6c 65 20 6e 61   return [file na
3ab0: 74 69 76 65 6e 61 6d 65 20 5c 0d 0a 20 20 20 20  tivename \..    
3ac0: 20 20 20 20 20 20 5b 66 69 6c 65 20 6a 6f 69 6e        [file join
3ad0: 20 5b 67 65 74 42 69 6e 61 72 79 44 69 72 65 63   [getBinaryDirec
3ae0: 74 6f 72 79 5d 20 5b 66 69 6c 65 20 74 61 69 6c  tory] [file tail
3af0: 20 24 66 69 6c 65 4e 61 6d 65 5d 5d 5d 0d 0a 20   $fileName]]].. 
3b00: 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
3b10: 63 20 67 65 74 43 6f 72 65 42 69 6e 61 72 79 46  c getCoreBinaryF
3b20: 69 6c 65 4e 61 6d 65 20 7b 20 7b 73 74 61 6e 64  ileName { {stand
3b30: 61 72 64 20 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a  ard false} } {..
3b40: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
3b50: 20 4e 4f 54 45 3a 20 52 65 74 75 72 6e 73 20 74   NOTE: Returns t
3b60: 68 65 20 66 75 6c 6c 20 70 61 74 68 20 66 6f 72  he full path for
3b70: 20 74 68 65 20 66 69 6c 65 20 63 6f 6e 74 61 69   the file contai
3b80: 6e 69 6e 67 20 74 68 65 20 63 6f 72 65 20 53 51  ning the core SQ
3b90: 4c 69 74 65 0d 0a 20 20 20 20 20 20 23 20 20 20  Lite..      #   
3ba0: 20 20 20 20 6c 69 62 72 61 72 79 20 63 6f 64 65      library code
3bb0: 20 66 6f 72 20 74 68 69 73 20 70 6c 61 74 66 6f   for this platfo
3bc0: 72 6d 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  rm...      #..  
3bd0: 20 20 20 20 69 66 20 7b 5b 68 61 73 52 75 6e 74      if {[hasRunt
3be0: 69 6d 65 4f 70 74 69 6f 6e 20 6e 61 74 69 76 65  imeOption native
3bf0: 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
3c00: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
3c10: 4e 4f 54 45 3a 20 52 65 74 75 72 6e 20 74 68 65  NOTE: Return the
3c20: 20 6d 69 78 65 64 2d 6d 6f 64 65 20 61 73 73 65   mixed-mode asse
3c30: 6d 62 6c 79 20 66 69 6c 65 20 6e 61 6d 65 2e 0d  mbly file name..
3c40: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
3c50: 20 20 20 20 72 65 74 75 72 6e 20 5b 66 69 6c 65      return [file
3c60: 20 6e 61 74 69 76 65 6e 61 6d 65 20 5c 0d 0a 20   nativename \.. 
3c70: 20 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65             [file
3c80: 20 6a 6f 69 6e 20 5b 67 65 74 42 69 6e 61 72 79   join [getBinary
3c90: 44 69 72 65 63 74 6f 72 79 5d 20 53 79 73 74 65  Directory] Syste
3ca0: 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 64 6c  m.Data.SQLite.dl
3cb0: 6c 5d 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73  l]]..      } els
3cc0: 65 69 66 20 7b 24 73 74 61 6e 64 61 72 64 7d 20  eif {$standard} 
3cd0: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
3ce0: 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
3cf0: 45 3a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 61  E: Return the na
3d00: 74 69 76 65 2d 6f 6e 6c 79 20 73 74 61 6e 64 61  tive-only standa
3d10: 72 64 20 53 51 4c 69 74 65 20 6c 69 62 72 61 72  rd SQLite librar
3d20: 79 20 66 69 6c 65 20 6e 61 6d 65 2e 0d 0a 20 20  y file name...  
3d30: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
3d40: 20 72 65 74 75 72 6e 20 5b 66 69 6c 65 20 6e 61   return [file na
3d50: 74 69 76 65 6e 61 6d 65 20 5c 0d 0a 20 20 20 20  tivename \..    
3d60: 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20 6a 6f          [file jo
3d70: 69 6e 20 5b 67 65 74 42 69 6e 61 72 79 44 69 72  in [getBinaryDir
3d80: 65 63 74 6f 72 79 5d 20 73 71 6c 69 74 65 33 2e  ectory] sqlite3.
3d90: 64 6c 6c 5d 5d 0d 0a 20 20 20 20 20 20 7d 20 65  dll]]..      } e
3da0: 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  lse {..        #
3db0: 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
3dc0: 3a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 61 74  : Return the nat
3dd0: 69 76 65 2d 6f 6e 6c 79 20 69 6e 74 65 72 6f 70  ive-only interop
3de0: 20 61 73 73 65 6d 62 6c 79 20 66 69 6c 65 20 6e   assembly file n
3df0: 61 6d 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  ame...        #.
3e00: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
3e10: 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65  [file nativename
3e20: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
3e30: 5b 66 69 6c 65 20 6a 6f 69 6e 20 5b 67 65 74 42  [file join [getB
3e40: 69 6e 61 72 79 44 69 72 65 63 74 6f 72 79 5d 20  inaryDirectory] 
3e50: 53 51 4c 69 74 65 2e 49 6e 74 65 72 6f 70 2e 64  SQLite.Interop.d
3e60: 6c 6c 5d 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20  ll]]..      }.. 
3e70: 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
3e80: 63 20 67 65 74 43 6f 6d 6d 6f 6e 44 69 72 65 63  c getCommonDirec
3e90: 74 6f 72 79 20 7b 7d 20 7b 0d 0a 20 20 20 20 20  tory {} {..     
3ea0: 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
3eb0: 3a 20 54 68 69 73 20 70 72 6f 63 65 64 75 72 65  : This procedure
3ec0: 20 72 65 74 75 72 6e 73 20 74 68 65 20 64 69 72   returns the dir
3ed0: 65 63 74 6f 72 79 20 77 68 65 72 65 20 74 68 65  ectory where the
3ee0: 20 74 65 73 74 20 73 63 72 69 70 74 73 0d 0a 20   test scripts.. 
3ef0: 20 20 20 20 20 23 20 20 20 20 20 20 20 73 68 6f       #       sho
3f00: 75 6c 64 20 62 65 20 6c 6f 63 61 74 65 64 2e 20  uld be located. 
3f10: 20 42 79 20 64 65 66 61 75 6c 74 2c 20 74 68 69   By default, thi
3f20: 73 20 6a 75 73 74 20 72 65 74 75 72 6e 73 20 74  s just returns t
3f30: 68 65 20 45 61 67 6c 65 0d 0a 20 20 20 20 20 20  he Eagle..      
3f40: 23 20 20 20 20 20 20 20 62 69 6e 61 72 79 20 64  #       binary d
3f50: 69 72 65 63 74 6f 72 79 2e 0d 0a 20 20 20 20 20  irectory...     
3f60: 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69   #..      if {[i
3f70: 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 63 6f 6d  nfo exists ::com
3f80: 6d 6f 6e 5f 64 69 72 65 63 74 6f 72 79 5d 20 26  mon_directory] &
3f90: 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b  & \..          [
3fa0: 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a  string length $:
3fb0: 3a 63 6f 6d 6d 6f 6e 5f 64 69 72 65 63 74 6f 72  :common_director
3fc0: 79 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  y] > 0} then {..
3fd0: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
3fe0: 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 65 20 6c     # NOTE: The l
3ff0: 6f 63 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 63  ocation of the c
4000: 6f 6d 6d 6f 6e 20 64 69 72 65 63 74 6f 72 79 20  ommon directory 
4010: 68 61 73 20 62 65 65 6e 20 73 65 74 3b 0d 0a 20  has been set;.. 
4020: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74         #       t
4030: 68 65 72 65 66 6f 72 65 2c 20 75 73 65 20 69 74  herefore, use it
4040: 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
4050: 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 3a 3a        return $::
4060: 63 6f 6d 6d 6f 6e 5f 64 69 72 65 63 74 6f 72 79  common_directory
4070: 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 69 66  ..      } elseif
4080: 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a   {[info exists :
4090: 3a 76 65 6e 64 6f 72 5f 64 69 72 65 63 74 6f 72  :vendor_director
40a0: 79 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20  y] && \..       
40b0: 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74     [string lengt
40c0: 68 20 24 3a 3a 76 65 6e 64 6f 72 5f 64 69 72 65  h $::vendor_dire
40d0: 63 74 6f 72 79 5d 20 3e 20 30 7d 20 74 68 65 6e  ctory] > 0} then
40e0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20   {..        #.. 
40f0: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54         # NOTE: T
4100: 68 65 20 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 74  he location of t
4110: 68 65 20 76 65 6e 64 6f 72 20 64 69 72 65 63 74  he vendor direct
4120: 6f 72 79 20 68 61 73 20 62 65 65 6e 20 73 65 74  ory has been set
4130: 3b 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  ;..        #    
4140: 20 20 20 74 68 65 72 65 66 6f 72 65 2c 20 75 73     therefore, us
4150: 65 20 69 74 2e 0d 0a 20 20 20 20 20 20 20 20 23  e it...        #
4160: 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ..        return
4170: 20 24 3a 3a 76 65 6e 64 6f 72 5f 64 69 72 65 63   $::vendor_direc
4180: 74 6f 72 79 0d 0a 20 20 20 20 20 20 7d 20 65 6c  tory..      } el
4190: 73 65 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73  seif {[info exis
41a0: 74 73 20 3a 3a 74 63 6c 5f 6c 69 62 72 61 72 79  ts ::tcl_library
41b0: 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20  ] && \..        
41c0: 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68    [string length
41d0: 20 24 3a 3a 74 63 6c 5f 6c 69 62 72 61 72 79 5d   $::tcl_library]
41e0: 20 3e 20 30 20 26 26 20 5c 0d 0a 20 20 20 20 20   > 0 && \..     
41f0: 20 20 20 20 20 5b 66 69 6c 65 20 69 73 64 69 72       [file isdir
4200: 65 63 74 6f 72 79 20 24 3a 3a 74 63 6c 5f 6c 69  ectory $::tcl_li
4210: 62 72 61 72 79 5d 7d 20 74 68 65 6e 20 7b 0d 0a  brary]} then {..
4220: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
4230: 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 65 20 76     # NOTE: The v
4240: 61 72 69 61 62 6c 65 20 77 69 74 68 20 74 68 65  ariable with the
4250: 20 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 74 68 65   location of the
4260: 20 73 63 72 69 70 74 20 6c 69 62 72 61 72 79 20   script library 
4270: 69 73 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  is..        #   
4280: 20 20 20 20 73 65 74 20 61 6e 64 20 61 70 70 65      set and appe
4290: 61 72 73 20 74 6f 20 62 65 20 61 20 72 65 61 6c  ars to be a real
42a0: 20 64 69 72 65 63 74 6f 72 79 20 28 69 2e 65 2e   directory (i.e.
42b0: 20 6e 6f 74 20 65 6d 62 65 64 64 65 64 0d 0a 20   not embedded.. 
42c0: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 77         #       w
42d0: 69 74 68 69 6e 20 61 20 66 69 6c 65 29 3b 20 74  ithin a file); t
42e0: 68 65 72 65 66 6f 72 65 2c 20 75 73 65 20 69 74  herefore, use it
42f0: 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
4300: 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 3a 3a        return $::
4310: 74 63 6c 5f 6c 69 62 72 61 72 79 0d 0a 20 20 20  tcl_library..   
4320: 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
4330: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
4340: 23 20 4e 4f 54 45 3a 20 46 61 6c 6c 62 61 63 6b  # NOTE: Fallback
4350: 20 74 6f 20 74 68 65 20 64 69 72 65 63 74 6f 72   to the director
4360: 79 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  y containing the
4370: 20 65 78 65 63 75 74 61 62 6c 65 2e 0d 0a 20 20   executable...  
4380: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
4390: 20 72 65 74 75 72 6e 20 5b 69 6e 66 6f 20 62 69   return [info bi
43a0: 6e 61 72 79 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a  nary]..      }..
43b0: 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
43c0: 6f 63 20 67 65 74 44 61 74 61 62 61 73 65 44 69  oc getDatabaseDi
43d0: 72 65 63 74 6f 72 79 20 7b 7d 20 7b 0d 0a 20 20  rectory {} {..  
43e0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
43f0: 4f 54 45 3a 20 54 68 69 73 20 70 72 6f 63 65 64  OTE: This proced
4400: 75 72 65 20 72 65 74 75 72 6e 73 20 74 68 65 20  ure returns the 
4410: 64 69 72 65 63 74 6f 72 79 20 77 68 65 72 65 20  directory where 
4420: 74 68 65 20 74 65 73 74 20 64 61 74 61 62 61 73  the test databas
4430: 65 73 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  es..      #     
4440: 20 20 73 68 6f 75 6c 64 20 62 65 20 6c 6f 63 61    should be loca
4450: 74 65 64 2e 20 20 42 79 20 64 65 66 61 75 6c 74  ted.  By default
4460: 2c 20 74 68 69 73 20 6a 75 73 74 20 75 73 65 73  , this just uses
4470: 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 0d 0a   the temporary..
4480: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 64 69        #       di
4490: 72 65 63 74 6f 72 79 20 63 6f 6e 66 69 67 75 72  rectory configur
44a0: 65 64 20 66 6f 72 20 74 68 69 73 20 73 79 73 74  ed for this syst
44b0: 65 6d 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  em...      #..  
44c0: 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78      if {[info ex
44d0: 69 73 74 73 20 3a 3a 64 61 74 61 62 61 73 65 5f  ists ::database_
44e0: 64 69 72 65 63 74 6f 72 79 5d 20 26 26 20 5c 0d  directory] && \.
44f0: 0a 20 20 20 20 20 20 20 20 20 20 5b 73 74 72 69  .          [stri
4500: 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a 64 61 74  ng length $::dat
4510: 61 62 61 73 65 5f 64 69 72 65 63 74 6f 72 79 5d  abase_directory]
4520: 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20   > 0} then {..  
4530: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
4540: 20 23 20 4e 4f 54 45 3a 20 54 68 65 20 6c 6f 63   # NOTE: The loc
4550: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 64 61 74  ation of the dat
4560: 61 62 61 73 65 20 64 69 72 65 63 74 6f 72 79 20  abase directory 
4570: 68 61 73 20 62 65 65 6e 20 6f 76 65 72 72 69 64  has been overrid
4580: 64 65 6e 3b 0d 0a 20 20 20 20 20 20 20 20 23 20  den;..        # 
4590: 20 20 20 20 20 20 74 68 65 72 65 66 6f 72 65 2c        therefore,
45a0: 20 75 73 65 20 69 74 2e 0d 0a 20 20 20 20 20 20   use it...      
45b0: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74    #..        ret
45c0: 75 72 6e 20 24 3a 3a 64 61 74 61 62 61 73 65 5f  urn $::database_
45d0: 64 69 72 65 63 74 6f 72 79 0d 0a 20 20 20 20 20  directory..     
45e0: 20 7d 20 65 6c 73 65 69 66 20 7b 5b 69 6e 66 6f   } elseif {[info
45f0: 20 65 78 69 73 74 73 20 3a 3a 73 63 72 61 74 63   exists ::scratc
4600: 68 5f 64 69 72 65 63 74 6f 72 79 5d 20 26 26 20  h_directory] && 
4610: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 73 74  \..          [st
4620: 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a 73  ring length $::s
4630: 63 72 61 74 63 68 5f 64 69 72 65 63 74 6f 72 79  cratch_directory
4640: 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20  ] > 0} then {.. 
4650: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
4660: 20 20 23 20 4e 4f 54 45 3a 20 54 68 65 20 6c 6f    # NOTE: The lo
4670: 63 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 63  cation of the sc
4680: 72 61 74 63 68 20 64 69 72 65 63 74 6f 72 79 20  ratch directory 
4690: 68 61 73 20 62 65 65 6e 20 6f 76 65 72 72 69 64  has been overrid
46a0: 64 65 6e 3b 0d 0a 20 20 20 20 20 20 20 20 23 20  den;..        # 
46b0: 20 20 20 20 20 20 74 68 65 72 65 66 6f 72 65 2c        therefore,
46c0: 20 75 73 65 20 69 74 2e 0d 0a 20 20 20 20 20 20   use it...      
46d0: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74    #..        ret
46e0: 75 72 6e 20 24 3a 3a 73 63 72 61 74 63 68 5f 64  urn $::scratch_d
46f0: 69 72 65 63 74 6f 72 79 0d 0a 20 20 20 20 20 20  irectory..      
4700: 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
4710: 20 20 72 65 74 75 72 6e 20 5b 67 65 74 54 65 6d    return [getTem
4720: 70 6f 72 61 72 79 50 61 74 68 5d 0d 0a 20 20 20  poraryPath]..   
4730: 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a     }..    }.....
4740: 20 20 20 20 70 72 6f 63 20 67 65 74 54 65 6d 70      proc getTemp
4750: 6f 72 61 72 79 44 69 72 65 63 74 6f 72 79 20 7b  oraryDirectory {
4760: 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  } {..      #..  
4770: 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 69 73      # NOTE: This
4780: 20 70 72 6f 63 65 64 75 72 65 20 72 65 74 75 72   procedure retur
4790: 6e 73 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  ns the directory
47a0: 20 77 68 65 72 65 20 74 68 65 20 74 65 6d 70 6f   where the tempo
47b0: 72 61 72 79 20 66 69 6c 65 73 0d 0a 20 20 20 20  rary files..    
47c0: 20 20 23 20 20 20 20 20 20 20 73 68 6f 75 6c 64    #       should
47d0: 20 62 65 20 6c 6f 63 61 74 65 64 2e 20 20 42 79   be located.  By
47e0: 20 64 65 66 61 75 6c 74 2c 20 74 68 69 73 20 6a   default, this j
47f0: 75 73 74 20 75 73 65 73 20 74 68 65 20 74 65 6d  ust uses the tem
4800: 70 6f 72 61 72 79 0d 0a 20 20 20 20 20 20 23 20  porary..      # 
4810: 20 20 20 20 20 20 64 69 72 65 63 74 6f 72 79 20        directory 
4820: 63 6f 6e 66 69 67 75 72 65 64 20 66 6f 72 20 74  configured for t
4830: 68 69 73 20 73 79 73 74 65 6d 2e 0d 0a 20 20 20  his system...   
4840: 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
4850: 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 74  [info exists ::t
4860: 65 6d 70 6f 72 61 72 79 5f 64 69 72 65 63 74 6f  emporary_directo
4870: 72 79 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20  ry] && \..      
4880: 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67      [string leng
4890: 74 68 20 24 3a 3a 74 65 6d 70 6f 72 61 72 79 5f  th $::temporary_
48a0: 64 69 72 65 63 74 6f 72 79 5d 20 3e 20 30 7d 20  directory] > 0} 
48b0: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
48c0: 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
48d0: 45 3a 20 54 68 65 20 6c 6f 63 61 74 69 6f 6e 20  E: The location 
48e0: 6f 66 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  of the temporary
48f0: 20 64 69 72 65 63 74 6f 72 79 20 68 61 73 20 62   directory has b
4900: 65 65 6e 20 6f 76 65 72 72 69 64 64 65 6e 3b 0d  een overridden;.
4910: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
4920: 20 74 68 65 72 65 66 6f 72 65 2c 20 75 73 65 20   therefore, use 
4930: 69 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  it...        #..
4940: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 24          return $
4950: 3a 3a 74 65 6d 70 6f 72 61 72 79 5f 64 69 72 65  ::temporary_dire
4960: 63 74 6f 72 79 0d 0a 20 20 20 20 20 20 7d 20 65  ctory..      } e
4970: 6c 73 65 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69  lseif {[info exi
4980: 73 74 73 20 3a 3a 73 63 72 61 74 63 68 5f 64 69  sts ::scratch_di
4990: 72 65 63 74 6f 72 79 5d 20 26 26 20 5c 0d 0a 20  rectory] && \.. 
49a0: 20 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67           [string
49b0: 20 6c 65 6e 67 74 68 20 24 3a 3a 73 63 72 61 74   length $::scrat
49c0: 63 68 5f 64 69 72 65 63 74 6f 72 79 5d 20 3e 20  ch_directory] > 
49d0: 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
49e0: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
49f0: 4e 4f 54 45 3a 20 54 68 65 20 6c 6f 63 61 74 69  NOTE: The locati
4a00: 6f 6e 20 6f 66 20 74 68 65 20 73 63 72 61 74 63  on of the scratc
4a10: 68 20 64 69 72 65 63 74 6f 72 79 20 68 61 73 20  h directory has 
4a20: 62 65 65 6e 20 6f 76 65 72 72 69 64 64 65 6e 3b  been overridden;
4a30: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
4a40: 20 20 74 68 65 72 65 66 6f 72 65 2c 20 75 73 65    therefore, use
4a50: 20 69 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d   it...        #.
4a60: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
4a70: 24 3a 3a 73 63 72 61 74 63 68 5f 64 69 72 65 63  $::scratch_direc
4a80: 74 6f 72 79 0d 0a 20 20 20 20 20 20 7d 20 65 6c  tory..      } el
4a90: 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 72 65  se {..        re
4aa0: 74 75 72 6e 20 5b 67 65 74 54 65 6d 70 6f 72 61  turn [getTempora
4ab0: 72 79 50 61 74 68 5d 0d 0a 20 20 20 20 20 20 7d  ryPath]..      }
4ac0: 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
4ad0: 70 72 6f 63 20 67 65 74 54 65 73 74 4f 76 65 72  proc getTestOver
4ae0: 72 69 64 65 73 50 72 65 61 6d 62 6c 65 20 7b 20  ridesPreamble { 
4af0: 7b 65 78 74 72 61 56 61 72 4e 61 6d 65 73 20 22  {extraVarNames "
4b00: 22 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 73 65  "} } {..      se
4b10: 74 20 76 61 72 4e 61 6d 65 73 20 5b 6c 69 73 74  t varNames [list
4b20: 5d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  ]....      #..  
4b30: 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 66 20 61      # NOTE: If a
4b40: 76 61 69 6c 61 62 6c 65 2c 20 73 74 61 72 74 20  vailable, start 
4b50: 77 69 74 68 20 74 68 65 20 6d 61 73 74 65 72 20  with the master 
4b60: 6c 69 73 74 20 6f 66 20 74 65 73 74 20 6f 76 65  list of test ove
4b70: 72 72 69 64 65 0d 0a 20 20 20 20 20 20 23 20 20  rride..      #  
4b80: 20 20 20 20 20 76 61 72 69 61 62 6c 65 73 2e 0d       variables..
4b90: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
4ba0: 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73  if {[info exists
4bb0: 20 3a 3a 74 65 73 74 5f 6f 76 65 72 72 69 64 65   ::test_override
4bc0: 73 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20  s] && \..       
4bd0: 20 20 20 5b 6c 6c 65 6e 67 74 68 20 24 3a 3a 74     [llength $::t
4be0: 65 73 74 5f 6f 76 65 72 72 69 64 65 73 5d 20 3e  est_overrides] >
4bf0: 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
4c00: 20 20 20 20 65 76 61 6c 20 6c 61 70 70 65 6e 64      eval lappend
4c10: 20 76 61 72 4e 61 6d 65 73 20 24 3a 3a 74 65 73   varNames $::tes
4c20: 74 5f 6f 76 65 72 72 69 64 65 73 0d 0a 20 20 20  t_overrides..   
4c30: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d     }....      #.
4c40: 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49  .      # NOTE: I
4c50: 66 20 72 65 71 75 65 73 74 65 64 20 62 79 20 6f  f requested by o
4c60: 75 72 20 63 61 6c 6c 65 72 2c 20 61 64 64 20 61  ur caller, add a
4c70: 6e 79 20 61 64 64 69 74 69 6f 6e 61 6c 20 76 61  ny additional va
4c80: 72 69 61 62 6c 65 0d 0a 20 20 20 20 20 20 23 20  riable..      # 
4c90: 20 20 20 20 20 20 6e 61 6d 65 73 20 74 6f 20 63        names to c
4ca0: 6f 70 79 20 6e 6f 77 2e 0d 0a 20 20 20 20 20 20  opy now...      
4cb0: 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 6c 6c  #..      if {[ll
4cc0: 65 6e 67 74 68 20 24 65 78 74 72 61 56 61 72 4e  ength $extraVarN
4cd0: 61 6d 65 73 5d 20 3e 20 30 7d 20 74 68 65 6e 20  ames] > 0} then 
4ce0: 7b 0d 0a 20 20 20 20 20 20 20 20 65 76 61 6c 20  {..        eval 
4cf0: 6c 61 70 70 65 6e 64 20 76 61 72 4e 61 6d 65 73  lappend varNames
4d00: 20 24 65 78 74 72 61 56 61 72 4e 61 6d 65 73 0d   $extraVarNames.
4d10: 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
4d20: 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
4d30: 45 3a 20 42 75 69 6c 64 20 74 68 65 20 73 63 72  E: Build the scr
4d40: 69 70 74 20 66 72 61 67 6d 65 6e 74 20 74 6f 20  ipt fragment to 
4d50: 62 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 70  be returned by p
4d60: 72 6f 63 65 73 73 69 6e 67 20 65 61 63 68 0d 0a  rocessing each..
4d70: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 76 61        #       va
4d80: 72 69 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64 20  riable name and 
4d90: 61 64 64 69 6e 67 20 74 68 65 20 6e 65 63 65 63  adding the necec
4da0: 65 73 73 61 72 79 20 73 63 72 69 70 74 20 66 72  essary script fr
4db0: 61 67 6d 65 6e 74 73 20 66 6f 72 0d 0a 20 20 20  agments for..   
4dc0: 20 20 20 23 20 20 20 20 20 20 20 65 61 63 68 20     #       each 
4dd0: 6f 6e 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  one...      #.. 
4de0: 20 20 20 20 20 73 65 74 20 72 65 73 75 6c 74 20       set result 
4df0: 22 22 0d 0a 0d 0a 20 20 20 20 20 20 66 6f 72 65  ""....      fore
4e00: 61 63 68 20 76 61 72 4e 61 6d 65 20 24 76 61 72  ach varName $var
4e10: 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20 20  Names {..       
4e20: 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
4e30: 54 45 3a 20 42 75 69 6c 64 20 74 68 65 20 71 75  TE: Build the qu
4e40: 61 6c 69 66 69 65 64 20 67 6c 6f 62 61 6c 20 76  alified global v
4e50: 61 72 69 61 62 6c 65 20 6e 61 6d 65 2e 0d 0a 20  ariable name... 
4e60: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
4e70: 20 20 73 65 74 20 66 75 6c 6c 56 61 72 4e 61 6d    set fullVarNam
4e80: 65 20 5b 61 70 70 65 6e 64 41 72 67 73 20 3a 3a  e [appendArgs ::
4e90: 20 24 76 61 72 4e 61 6d 65 5d 0d 0a 0d 0a 20 20   $varName]....  
4ea0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
4eb0: 20 23 20 4e 4f 54 45 3a 20 44 6f 65 73 20 74 68   # NOTE: Does th
4ec0: 65 20 76 61 72 69 61 62 6c 65 20 65 78 69 73 74  e variable exist
4ed0: 20 69 6e 20 74 68 69 73 20 69 6e 74 65 72 70 72   in this interpr
4ee0: 65 74 65 72 20 63 6f 6e 74 65 78 74 3f 0d 0a 20  eter context?.. 
4ef0: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
4f00: 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73    if {[info exis
4f10: 74 73 20 24 66 75 6c 6c 56 61 72 4e 61 6d 65 5d  ts $fullVarName]
4f20: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
4f30: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
4f40: 20 23 20 4e 4f 54 45 3a 20 41 70 70 65 6e 64 20   # NOTE: Append 
4f50: 61 20 73 63 72 69 70 74 20 66 72 61 67 6d 65 6e  a script fragmen
4f60: 74 20 74 6f 20 74 68 65 20 72 65 73 75 6c 74 20  t to the result 
4f70: 74 68 61 74 20 77 69 6c 6c 20 63 6f 72 72 65 63  that will correc
4f80: 74 6c 79 0d 0a 20 20 20 20 20 20 20 20 20 20 23  tly..          #
4f90: 20 20 20 20 20 20 20 63 6f 70 79 20 61 6e 79 20         copy any 
4fa0: 63 6f 6e 74 61 69 6e 65 64 20 76 61 6c 75 65 20  contained value 
4fb0: 74 6f 20 61 6e 6f 74 68 65 72 20 69 6e 74 65 72  to another inter
4fc0: 70 72 65 74 65 72 20 63 6f 6e 74 65 78 74 2e 0d  preter context..
4fd0: 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
4fe0: 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 20 72          append r
4ff0: 65 73 75 6c 74 20 5c 6e 20 22 73 65 74 20 22 20  esult \n "set " 
5000: 24 66 75 6c 6c 56 61 72 4e 61 6d 65 20 22 20 5c  $fullVarName " \
5010: 7b 22 20 5b 73 65 74 20 24 66 75 6c 6c 56 61 72  {" [set $fullVar
5020: 4e 61 6d 65 5d 20 5c 7d 0d 0a 20 20 20 20 20 20  Name] \}..      
5030: 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a    }..      }....
5040: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
5050: 20 4e 4f 54 45 3a 20 49 66 20 74 68 65 20 72 65   NOTE: If the re
5060: 73 75 6c 74 20 63 6f 6e 74 61 69 6e 73 20 6f 6e  sult contains on
5070: 65 20 6f 72 20 6d 6f 72 65 20 73 63 72 69 70 74  e or more script
5080: 20 66 72 61 67 6d 65 6e 74 73 2c 20 61 70 70 65   fragments, appe
5090: 6e 64 20 61 0d 0a 20 20 20 20 20 20 23 20 20 20  nd a..      #   
50a0: 20 20 20 20 6e 65 77 6c 69 6e 65 2e 0d 0a 20 20      newline...  
50b0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20      #..      if 
50c0: 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20  {[string length 
50d0: 24 72 65 73 75 6c 74 5d 20 3e 20 30 7d 20 74 68  $result] > 0} th
50e0: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 61 70  en {..        ap
50f0: 70 65 6e 64 20 72 65 73 75 6c 74 20 5c 6e 0d 0a  pend result \n..
5100: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
5110: 20 72 65 74 75 72 6e 20 24 72 65 73 75 6c 74 0d   return $result.
5120: 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70  .    }.....    p
5130: 72 6f 63 20 67 65 74 41 70 70 44 6f 6d 61 69 6e  roc getAppDomain
5140: 50 72 65 61 6d 62 6c 65 20 7b 20 7b 70 72 65 66  Preamble { {pref
5150: 69 78 20 22 22 7d 20 7b 73 75 66 66 69 78 20 22  ix ""} {suffix "
5160: 22 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d  "} } {..      #.
5170: 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54  .      # NOTE: T
5180: 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 72 65  his procedure re
5190: 74 75 72 6e 73 20 61 20 74 65 73 74 20 73 65 74  turns a test set
51a0: 75 70 20 73 63 72 69 70 74 20 66 72 61 67 6d 65  up script fragme
51b0: 6e 74 20 73 75 69 74 61 62 6c 65 20 66 6f 72 0d  nt suitable for.
51c0: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 65  .      #       e
51d0: 76 61 6c 75 61 74 69 6f 6e 20 62 79 20 61 6e 20  valuation by an 
51e0: 69 6e 74 65 72 70 72 65 74 65 72 20 63 72 65 61  interpreter crea
51f0: 74 65 64 20 69 6e 20 61 6e 20 69 73 6f 6c 61 74  ted in an isolat
5200: 65 64 20 61 70 70 6c 69 63 61 74 69 6f 6e 0d 0a  ed application..
5210: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 64 6f        #       do
5220: 6d 61 69 6e 2e 20 20 54 68 65 20 73 63 72 69 70  main.  The scrip
5230: 74 20 66 72 61 67 6d 65 6e 74 20 62 65 69 6e 67  t fragment being
5240: 20 72 65 74 75 72 6e 65 64 20 77 69 6c 6c 20 62   returned will b
5250: 65 20 73 75 72 72 6f 75 6e 64 65 64 20 62 79 0d  e surrounded by.
5260: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74  .      #       t
5270: 68 65 20 70 72 65 66 69 78 20 61 6e 64 20 73 75  he prefix and su
5280: 66 66 69 78 20 22 73 63 72 69 70 74 20 66 72 61  ffix "script fra
5290: 67 6d 65 6e 74 73 22 20 73 70 65 63 69 66 69 65  gments" specifie
52a0: 64 20 62 79 20 6f 75 72 20 63 61 6c 6c 65 72 2c  d by our caller,
52b0: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
52c0: 69 66 20 61 6e 79 2e 20 20 54 68 65 20 65 6e 74  if any.  The ent
52d0: 69 72 65 20 73 63 72 69 70 74 20 62 65 69 6e 67  ire script being
52e0: 20 72 65 74 75 72 6e 65 64 20 77 69 6c 6c 20 62   returned will b
52f0: 65 20 73 75 62 73 74 69 74 75 74 65 64 20 76 69  e substituted vi
5300: 61 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  a..      #      
5310: 20 5b 73 75 62 73 74 5d 2c 20 69 6e 20 74 68 65   [subst], in the
5320: 20 63 6f 6e 74 65 78 74 20 6f 66 20 6f 75 72 20   context of our 
5330: 63 61 6c 6c 65 72 2c 20 62 65 66 6f 72 65 20 62  caller, before b
5340: 65 69 6e 67 20 72 65 74 75 72 6e 65 64 2e 0d 0a  eing returned...
5350: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 54 68        #       Th
5360: 69 73 20 73 74 65 70 20 69 73 20 6e 65 63 65 73  is step is neces
5370: 73 61 72 79 20 73 6f 20 74 68 61 74 20 73 6f 6d  sary so that som
5380: 65 20 6c 69 6d 69 74 65 64 20 63 6f 6e 74 65 78  e limited contex
5390: 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2c 0d 0a  t information,..
53a0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 70 72        #       pr
53b0: 69 6d 61 72 69 6c 79 20 72 65 6c 61 74 65 64 20  imarily related 
53c0: 74 6f 20 74 68 65 20 74 65 73 74 69 6e 67 20 64  to the testing d
53d0: 69 72 65 63 74 6f 72 69 65 73 2c 20 63 61 6e 20  irectories, can 
53e0: 62 65 20 74 72 61 6e 73 66 65 72 72 65 64 0d 0a  be transferred..
53f0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74 6f        #       to
5400: 20 74 68 65 20 69 6e 74 65 72 70 72 65 74 65 72   the interpreter
5410: 20 69 6e 20 74 68 65 20 69 73 6f 6c 61 74 65 64   in the isolated
5420: 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 64 6f 6d   application dom
5430: 61 69 6e 2c 20 6d 61 6b 69 6e 67 20 69 74 0d 0a  ain, making it..
5440: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 61 62        #       ab
5450: 6c 65 20 74 6f 20 73 75 63 63 65 73 73 66 75 6c  le to successful
5460: 6c 79 20 72 75 6e 20 74 65 73 74 73 20 74 68 61  ly run tests tha
5470: 74 20 72 65 71 75 69 72 65 20 6f 6e 65 20 6f 72  t require one or
5480: 20 6d 6f 72 65 20 6f 66 20 74 68 65 0d 0a 20 20   more of the..  
5490: 20 20 20 20 23 20 20 20 20 20 20 20 66 69 6c 65      #       file
54a0: 73 20 69 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20  s in one of the 
54b0: 74 65 73 74 69 6e 67 20 64 69 72 65 63 74 6f 72  testing director
54c0: 69 65 73 2e 20 20 43 61 6c 6c 65 72 73 20 73 68  ies.  Callers sh
54d0: 6f 75 6c 64 20 6b 65 65 70 20 69 6e 0d 0a 20 20  ould keep in..  
54e0: 20 20 20 20 23 20 20 20 20 20 20 20 6d 69 6e 64      #       mind
54f0: 20 74 68 61 74 20 74 68 65 20 74 65 73 74 20 73   that the test s
5500: 63 72 69 70 74 20 66 72 61 67 6d 65 6e 74 20 62  cript fragment b
5510: 65 69 6e 67 20 72 65 74 75 72 6e 65 64 20 63 61  eing returned ca
5520: 6e 6e 6f 74 20 72 65 6c 79 20 6f 6e 0d 0a 20 20  nnot rely on..  
5530: 20 20 20 20 23 20 20 20 20 20 20 20 61 6e 79 20      #       any 
5540: 73 63 72 69 70 74 20 6c 69 62 72 61 72 79 20 70  script library p
5550: 72 6f 63 65 64 75 72 65 73 20 74 68 61 74 20 61  rocedures that a
5560: 72 65 20 6e 6f 74 20 70 72 6f 76 69 64 65 64 20  re not provided 
5570: 62 79 20 74 68 65 20 45 61 67 6c 65 0d 0a 20 20  by the Eagle..  
5580: 20 20 20 20 23 20 20 20 20 20 20 20 6c 69 62 72      #       libr
5590: 61 72 79 20 70 61 63 6b 61 67 65 20 28 69 2e 65  ary package (i.e
55a0: 2e 20 22 69 6e 69 74 2e 65 61 67 6c 65 22 29 2c  . "init.eagle"),
55b0: 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 6f 73 65   including those
55c0: 20 70 72 6f 76 69 64 65 64 20 62 79 0d 0a 20 20   provided by..  
55d0: 20 20 20 20 23 20 20 20 20 20 20 20 74 68 65 20      #       the 
55e0: 45 61 67 6c 65 20 74 65 73 74 20 70 61 63 6b 61  Eagle test packa
55f0: 67 65 2c 20 75 6e 6c 65 73 73 20 74 68 65 20 66  ge, unless the f
5600: 69 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ile containing t
5610: 68 65 6d 20 69 73 20 6c 6f 61 64 65 64 0d 0a 20  hem is loaded.. 
5620: 20 20 20 20 20 23 20 20 20 20 20 20 20 6d 61 6e       #       man
5630: 75 61 6c 6c 79 20 76 69 61 20 73 6f 6d 65 20 6f  ually via some o
5640: 74 68 65 72 20 6d 65 63 68 61 6e 69 73 6d 20 28  ther mechanism (
5650: 65 2e 67 2e 20 62 79 20 69 6e 63 6c 75 64 69 6e  e.g. by includin
5660: 67 20 61 70 70 72 6f 70 72 69 61 74 65 0d 0a 20  g appropriate.. 
5670: 20 20 20 20 20 23 20 20 20 20 20 20 20 5b 70 61       #       [pa
5680: 63 6b 61 67 65 20 72 65 71 75 69 72 65 5d 20 6f  ckage require] o
5690: 72 20 5b 73 6f 75 72 63 65 5d 20 63 6f 6d 6d 61  r [source] comma
56a0: 6e 64 73 20 69 6e 20 74 68 65 20 70 72 65 66 69  nds in the prefi
56b0: 78 20 6f 72 20 73 75 66 66 69 78 0d 0a 20 20 20  x or suffix..   
56c0: 20 20 20 23 20 20 20 20 20 20 20 73 63 72 69 70     #       scrip
56d0: 74 20 66 72 61 67 6d 65 6e 74 73 29 2e 20 20 41  t fragments).  A
56e0: 6c 73 6f 2c 20 61 6c 6c 20 76 61 72 69 61 62 6c  lso, all variabl
56f0: 65 20 72 65 66 65 72 65 6e 63 65 73 20 61 6e 64  e references and
5700: 20 61 6c 6c 20 6e 65 73 74 65 64 0d 0a 20 20 20   all nested..   
5710: 20 20 20 23 20 20 20 20 20 20 20 63 6f 6d 6d 61     #       comma
5720: 6e 64 73 20 28 69 2e 65 2e 20 74 68 6f 73 65 20  nds (i.e. those 
5730: 69 6e 20 73 71 75 61 72 65 20 62 72 61 63 6b 65  in square bracke
5740: 74 73 29 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e  ts) contained in
5750: 20 74 68 65 20 66 69 6e 61 6c 0d 0a 20 20 20 20   the final..    
5760: 20 20 23 20 20 20 20 20 20 20 73 63 72 69 70 74    #       script
5770: 20 66 72 61 67 6d 65 6e 74 20 77 69 6c 6c 20 65   fragment will e
5780: 6e 64 20 75 70 20 62 65 69 6e 67 20 65 76 61 6c  nd up being eval
5790: 75 61 74 65 64 20 69 6e 20 74 68 65 20 63 6f 6e  uated in the con
57a0: 74 65 78 74 20 6f 66 20 74 68 65 0d 0a 20 20 20  text of the..   
57b0: 20 20 20 23 20 20 20 20 20 20 20 63 61 6c 6c 69     #       calli
57c0: 6e 67 20 69 6e 74 65 72 70 72 65 74 65 72 20 61  ng interpreter a
57d0: 6e 64 20 6e 6f 74 20 74 68 65 20 74 61 72 67 65  nd not the targe
57e0: 74 20 69 6e 74 65 72 70 72 65 74 65 72 20 63 72  t interpreter cr
57f0: 65 61 74 65 64 20 69 6e 20 74 68 65 0d 0a 20 20  eated in the..  
5800: 20 20 20 20 23 20 20 20 20 20 20 20 69 73 6f 6c      #       isol
5810: 61 74 65 64 20 61 70 70 6c 69 63 61 74 69 6f 6e  ated application
5820: 20 64 6f 6d 61 69 6e 20 75 6e 6c 65 73 73 20 74   domain unless t
5830: 68 65 20 64 6f 6c 6c 61 72 20 73 69 67 6e 73 20  he dollar signs 
5840: 61 6e 64 2f 6f 72 20 73 71 75 61 72 65 0d 0a 20  and/or square.. 
5850: 20 20 20 20 20 23 20 20 20 20 20 20 20 62 72 61       #       bra
5860: 63 6b 65 74 73 20 61 72 65 20 73 70 65 63 69 61  ckets are specia
5870: 6c 6c 79 20 71 75 6f 74 65 64 20 77 69 74 68 20  lly quoted with 
5880: 62 61 63 6b 73 6c 61 73 68 65 73 2e 0d 0a 20 20  backslashes...  
5890: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 72 65 74      #..      ret
58a0: 75 72 6e 20 5b 75 70 6c 65 76 65 6c 20 31 20 5b  urn [uplevel 1 [
58b0: 6c 69 73 74 20 73 75 62 73 74 20 5b 61 70 70 65  list subst [appe
58c0: 6e 64 41 72 67 73 20 24 70 72 65 66 69 78 20 7b  ndArgs $prefix {
58d0: 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 68  ..        if {[h
58e0: 61 73 52 75 6e 74 69 6d 65 4f 70 74 69 6f 6e 20  asRuntimeOption 
58f0: 6e 61 74 69 76 65 5d 7d 20 74 68 65 6e 20 7b 0d  native]} then {.
5900: 0a 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63  .          objec
5910: 74 20 69 6e 76 6f 6b 65 20 49 6e 74 65 72 70 72  t invoke Interpr
5920: 65 74 65 72 2e 47 65 74 41 63 74 69 76 65 20 41  eter.GetActive A
5930: 64 64 52 75 6e 74 69 6d 65 4f 70 74 69 6f 6e 20  ddRuntimeOption 
5940: 6e 61 74 69 76 65 0d 0a 20 20 20 20 20 20 20 20  native..        
5950: 7d 0d 0a 20 20 20 20 20 20 7d 20 5b 67 65 74 54  }..      } [getT
5960: 65 73 74 4f 76 65 72 72 69 64 65 73 50 72 65 61  estOverridesPrea
5970: 6d 62 6c 65 20 5b 6c 69 73 74 20 70 61 74 68 20  mble [list path 
5980: 74 65 73 74 5f 63 68 61 6e 6e 65 6c 5d 5d 20 24  test_channel]] $
5990: 73 75 66 66 69 78 5d 5d 5d 0d 0a 20 20 20 20 7d  suffix]]]..    }
59a0: 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 74 72  .....    proc tr
59b0: 79 43 6f 70 79 42 69 6e 61 72 79 46 69 6c 65 20  yCopyBinaryFile 
59c0: 7b 20 66 69 6c 65 4e 61 6d 65 20 7b 6e 65 77 46  { fileName {newF
59d0: 69 6c 65 4e 61 6d 65 20 22 22 7d 20 7d 20 7b 0d  ileName ""} } {.
59e0: 0a 20 20 20 20 20 20 73 65 74 20 73 6f 75 72 63  .      set sourc
59f0: 65 46 69 6c 65 4e 61 6d 65 20 5b 67 65 74 42 69  eFileName [getBi
5a00: 6e 61 72 79 46 69 6c 65 4e 61 6d 65 20 24 66 69  naryFileName $fi
5a10: 6c 65 4e 61 6d 65 5d 0d 0a 0d 0a 20 20 20 20 20  leName]....     
5a20: 20 69 66 20 7b 21 5b 66 69 6c 65 20 65 78 69 73   if {![file exis
5a30: 74 73 20 24 73 6f 75 72 63 65 46 69 6c 65 4e 61  ts $sourceFileNa
5a40: 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  me]} then {..   
5a50: 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
5a60: 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
5a70: 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
5a80: 20 20 20 20 20 20 22 2d 2d 2d 2d 20 73 6b 69 70        "---- skip
5a90: 70 65 64 20 63 6f 70 79 69 6e 67 20 62 69 6e 61  ped copying bina
5aa0: 72 79 20 66 69 6c 65 20 5c 22 22 20 24 73 6f 75  ry file \"" $sou
5ab0: 72 63 65 46 69 6c 65 4e 61 6d 65 20 5c 0d 0a 20  rceFileName \.. 
5ac0: 20 20 20 20 20 20 20 20 20 20 20 22 5c 22 2c 20             "\", 
5ad0: 69 74 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73  it does not exis
5ae0: 74 5c 6e 22 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  t\n"]....       
5af0: 20 72 65 74 75 72 6e 0d 0a 20 20 20 20 20 20 7d   return..      }
5b00: 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 73  ....      if {[s
5b10: 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 6e 65  tring length $ne
5b20: 77 46 69 6c 65 4e 61 6d 65 5d 20 3e 20 30 7d 20  wFileName] > 0} 
5b30: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
5b40: 73 65 74 20 74 61 72 67 65 74 46 69 6c 65 4e 61  set targetFileNa
5b50: 6d 65 20 5b 67 65 74 42 75 69 6c 64 46 69 6c 65  me [getBuildFile
5b60: 4e 61 6d 65 20 24 6e 65 77 46 69 6c 65 4e 61 6d  Name $newFileNam
5b70: 65 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65  e]..      } else
5b80: 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20   {..        set 
5b90: 74 61 72 67 65 74 46 69 6c 65 4e 61 6d 65 20 5b  targetFileName [
5ba0: 67 65 74 42 75 69 6c 64 46 69 6c 65 4e 61 6d 65  getBuildFileName
5bb0: 20 24 66 69 6c 65 4e 61 6d 65 5d 0d 0a 20 20 20   $fileName]..   
5bc0: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 69 66     }....      if
5bd0: 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20   {[catch {..    
5be0: 20 20 20 20 20 20 20 20 20 20 66 69 6c 65 20 63            file c
5bf0: 6f 70 79 20 2d 66 6f 72 63 65 20 24 73 6f 75 72  opy -force $sour
5c00: 63 65 46 69 6c 65 4e 61 6d 65 20 24 74 61 72 67  ceFileName $targ
5c10: 65 74 46 69 6c 65 4e 61 6d 65 7d 5d 20 3d 3d 20  etFileName}] == 
5c20: 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
5c30: 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
5c40: 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  _channel [append
5c50: 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
5c60: 20 20 20 20 22 2d 2d 2d 2d 20 63 6f 70 69 65 64      "---- copied
5c70: 20 62 69 6e 61 72 79 20 66 69 6c 65 20 66 72 6f   binary file fro
5c80: 6d 20 5c 22 22 20 24 73 6f 75 72 63 65 46 69 6c  m \"" $sourceFil
5c90: 65 4e 61 6d 65 20 22 5c 22 20 74 6f 20 5c 22 22  eName "\" to \""
5ca0: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
5cb0: 24 74 61 72 67 65 74 46 69 6c 65 4e 61 6d 65 20  $targetFileName 
5cc0: 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d 20 65  \"\n]..      } e
5cd0: 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 74  lse {..        t
5ce0: 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
5cf0: 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
5d00: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
5d10: 22 2d 2d 2d 2d 20 66 61 69 6c 65 64 20 74 6f 20  "---- failed to 
5d20: 63 6f 70 79 20 62 69 6e 61 72 79 20 66 69 6c 65  copy binary file
5d30: 20 66 72 6f 6d 20 5c 22 22 20 24 73 6f 75 72 63   from \"" $sourc
5d40: 65 46 69 6c 65 4e 61 6d 65 20 5c 0d 0a 20 20 20  eFileName \..   
5d50: 20 20 20 20 20 20 20 20 20 22 5c 22 20 74 6f 20           "\" to 
5d60: 5c 22 22 20 24 74 61 72 67 65 74 46 69 6c 65 4e  \"" $targetFileN
5d70: 61 6d 65 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20  ame \"\n]..     
5d80: 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20   }..    }.....  
5d90: 20 20 70 72 6f 63 20 74 72 79 43 6f 70 79 42 75    proc tryCopyBu
5da0: 69 6c 64 46 69 6c 65 20 7b 20 66 69 6c 65 4e 61  ildFile { fileNa
5db0: 6d 65 20 7b 6e 65 77 46 69 6c 65 4e 61 6d 65 20  me {newFileName 
5dc0: 22 22 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 73  ""} } {..      s
5dd0: 65 74 20 73 6f 75 72 63 65 46 69 6c 65 4e 61 6d  et sourceFileNam
5de0: 65 20 5b 67 65 74 42 75 69 6c 64 46 69 6c 65 4e  e [getBuildFileN
5df0: 61 6d 65 20 24 66 69 6c 65 4e 61 6d 65 5d 0d 0a  ame $fileName]..
5e00: 0d 0a 20 20 20 20 20 20 69 66 20 7b 21 5b 66 69  ..      if {![fi
5e10: 6c 65 20 65 78 69 73 74 73 20 24 73 6f 75 72 63  le exists $sourc
5e20: 65 46 69 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e  eFileName]} then
5e30: 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74   {..        tput
5e40: 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
5e50: 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
5e60: 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d  .            "--
5e70: 2d 2d 20 73 6b 69 70 70 65 64 20 63 6f 70 79 69  -- skipped copyi
5e80: 6e 67 20 62 75 69 6c 64 20 66 69 6c 65 20 5c 22  ng build file \"
5e90: 22 20 24 73 6f 75 72 63 65 46 69 6c 65 4e 61 6d  " $sourceFileNam
5ea0: 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e \..           
5eb0: 20 22 5c 22 2c 20 69 74 20 64 6f 65 73 20 6e 6f   "\", it does no
5ec0: 74 20 65 78 69 73 74 5c 6e 22 5d 0d 0a 0d 0a 20  t exist\n"].... 
5ed0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 0d 0a 20         return.. 
5ee0: 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
5ef0: 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67  if {[string leng
5f00: 74 68 20 24 6e 65 77 46 69 6c 65 4e 61 6d 65 5d  th $newFileName]
5f10: 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20   > 0} then {..  
5f20: 20 20 20 20 20 20 73 65 74 20 74 61 72 67 65 74        set target
5f30: 46 69 6c 65 4e 61 6d 65 20 5b 67 65 74 42 69 6e  FileName [getBin
5f40: 61 72 79 46 69 6c 65 4e 61 6d 65 20 24 6e 65 77  aryFileName $new
5f50: 46 69 6c 65 4e 61 6d 65 5d 0d 0a 20 20 20 20 20  FileName]..     
5f60: 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
5f70: 20 20 20 73 65 74 20 74 61 72 67 65 74 46 69 6c     set targetFil
5f80: 65 4e 61 6d 65 20 5b 67 65 74 42 69 6e 61 72 79  eName [getBinary
5f90: 46 69 6c 65 4e 61 6d 65 20 24 66 69 6c 65 4e 61  FileName $fileNa
5fa0: 6d 65 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a  me]..      }....
5fb0: 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68        if {[catch
5fc0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
5fd0: 20 20 66 69 6c 65 20 63 6f 70 79 20 2d 66 6f 72    file copy -for
5fe0: 63 65 20 24 73 6f 75 72 63 65 46 69 6c 65 4e 61  ce $sourceFileNa
5ff0: 6d 65 20 24 74 61 72 67 65 74 46 69 6c 65 4e 61  me $targetFileNa
6000: 6d 65 7d 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20  me}] == 0} then 
6010: 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73  {..        tputs
6020: 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
6030: 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
6040: 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
6050: 2d 20 63 6f 70 69 65 64 20 62 75 69 6c 64 20 66  - copied build f
6060: 69 6c 65 20 66 72 6f 6d 20 5c 22 22 20 24 73 6f  ile from \"" $so
6070: 75 72 63 65 46 69 6c 65 4e 61 6d 65 20 22 5c 22  urceFileName "\"
6080: 20 74 6f 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20   to \"" \..     
6090: 20 20 20 20 20 20 20 24 74 61 72 67 65 74 46 69         $targetFi
60a0: 6c 65 4e 61 6d 65 20 5c 22 5c 6e 5d 0d 0a 20 20  leName \"\n]..  
60b0: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
60c0: 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
60d0: 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70  est_channel [app
60e0: 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
60f0: 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 66 61 69         "---- fai
6100: 6c 65 64 20 74 6f 20 63 6f 70 79 20 62 75 69 6c  led to copy buil
6110: 64 20 66 69 6c 65 20 66 72 6f 6d 20 5c 22 22 20  d file from \"" 
6120: 24 73 6f 75 72 63 65 46 69 6c 65 4e 61 6d 65 20  $sourceFileName 
6130: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22  \..            "
6140: 5c 22 20 74 6f 20 5c 22 22 20 24 74 61 72 67 65  \" to \"" $targe
6150: 74 46 69 6c 65 4e 61 6d 65 20 5c 22 5c 6e 5d 0d  tFileName \"\n].
6160: 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d  .      }..    }.
6170: 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 74 72 79  ....    proc try
6180: 44 65 6c 65 74 65 42 69 6e 61 72 79 46 69 6c 65  DeleteBinaryFile
6190: 20 7b 20 66 69 6c 65 4e 61 6d 65 20 7d 20 7b 0d   { fileName } {.
61a0: 0a 20 20 20 20 20 20 73 65 74 20 66 69 6c 65 4e  .      set fileN
61b0: 61 6d 65 20 5b 67 65 74 42 69 6e 61 72 79 46 69  ame [getBinaryFi
61c0: 6c 65 4e 61 6d 65 20 24 66 69 6c 65 4e 61 6d 65  leName $fileName
61d0: 5d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 21  ]....      if {!
61e0: 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24 66 69  [file exists $fi
61f0: 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d  leName]} then {.
6200: 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24  .        tputs $
6210: 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b  ::test_channel [
6220: 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
6230: 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
6240: 73 6b 69 70 70 65 64 20 64 65 6c 65 74 69 6e 67  skipped deleting
6250: 20 62 69 6e 61 72 79 20 66 69 6c 65 20 5c 22 22   binary file \""
6260: 20 24 66 69 6c 65 4e 61 6d 65 20 5c 0d 0a 20 20   $fileName \..  
6270: 20 20 20 20 20 20 20 20 20 20 22 5c 22 2c 20 69            "\", i
6280: 74 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74  t does not exist
6290: 5c 6e 22 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  \n"]....        
62a0: 72 65 74 75 72 6e 0d 0a 20 20 20 20 20 20 7d 0d  return..      }.
62b0: 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 63 61  ...      if {[ca
62c0: 74 63 68 20 7b 66 69 6c 65 20 64 65 6c 65 74 65  tch {file delete
62d0: 20 24 66 69 6c 65 4e 61 6d 65 7d 5d 20 3d 3d 20   $fileName}] == 
62e0: 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
62f0: 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
6300: 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  _channel [append
6310: 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
6320: 20 20 20 20 22 2d 2d 2d 2d 20 64 65 6c 65 74 65      "---- delete
6330: 64 20 62 69 6e 61 72 79 20 66 69 6c 65 20 5c 22  d binary file \"
6340: 22 20 24 66 69 6c 65 4e 61 6d 65 20 5c 22 5c 6e  " $fileName \"\n
6350: 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20  ]..      } else 
6360: 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73  {..        tputs
6370: 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
6380: 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
6390: 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
63a0: 2d 20 66 61 69 6c 65 64 20 74 6f 20 64 65 6c 65  - failed to dele
63b0: 74 65 20 62 69 6e 61 72 79 20 66 69 6c 65 20 5c  te binary file \
63c0: 22 22 20 24 66 69 6c 65 4e 61 6d 65 20 5c 22 5c  "" $fileName \"\
63d0: 6e 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20  n]..      }..   
63e0: 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
63f0: 74 72 79 44 65 6c 65 74 65 42 75 69 6c 64 46 69  tryDeleteBuildFi
6400: 6c 65 20 7b 20 66 69 6c 65 4e 61 6d 65 20 7d 20  le { fileName } 
6410: 7b 0d 0a 20 20 20 20 20 20 73 65 74 20 66 69 6c  {..      set fil
6420: 65 4e 61 6d 65 20 5b 67 65 74 42 75 69 6c 64 46  eName [getBuildF
6430: 69 6c 65 4e 61 6d 65 20 24 66 69 6c 65 4e 61 6d  ileName $fileNam
6440: 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b  e]....      if {
6450: 21 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24 66  ![file exists $f
6460: 69 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b  ileName]} then {
6470: 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20  ..        tputs 
6480: 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
6490: 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
64a0: 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
64b0: 20 73 6b 69 70 70 65 64 20 64 65 6c 65 74 69 6e   skipped deletin
64c0: 67 20 62 75 69 6c 64 20 66 69 6c 65 20 5c 22 22  g build file \""
64d0: 20 24 66 69 6c 65 4e 61 6d 65 20 5c 0d 0a 20 20   $fileName \..  
64e0: 20 20 20 20 20 20 20 20 20 20 22 5c 22 2c 20 69            "\", i
64f0: 74 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74  t does not exist
6500: 5c 6e 22 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  \n"]....        
6510: 72 65 74 75 72 6e 0d 0a 20 20 20 20 20 20 7d 0d  return..      }.
6520: 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 63 61  ...      if {[ca
6530: 74 63 68 20 7b 66 69 6c 65 20 64 65 6c 65 74 65  tch {file delete
6540: 20 24 66 69 6c 65 4e 61 6d 65 7d 5d 20 3d 3d 20   $fileName}] == 
6550: 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
6560: 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
6570: 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  _channel [append
6580: 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
6590: 20 20 20 20 22 2d 2d 2d 2d 20 64 65 6c 65 74 65      "---- delete
65a0: 64 20 62 75 69 6c 64 20 66 69 6c 65 20 5c 22 22  d build file \""
65b0: 20 24 66 69 6c 65 4e 61 6d 65 20 5c 22 5c 6e 5d   $fileName \"\n]
65c0: 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b  ..      } else {
65d0: 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20  ..        tputs 
65e0: 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
65f0: 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
6600: 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
6610: 20 66 61 69 6c 65 64 20 74 6f 20 64 65 6c 65 74   failed to delet
6620: 65 20 62 75 69 6c 64 20 66 69 6c 65 20 5c 22 22  e build file \""
6630: 20 24 66 69 6c 65 4e 61 6d 65 20 5c 22 5c 6e 5d   $fileName \"\n]
6640: 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d  ..      }..    }
6650: 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 74 72  .....    proc tr
6660: 79 43 6f 70 79 41 73 73 65 6d 62 6c 79 20 7b 20  yCopyAssembly { 
6670: 66 69 6c 65 4e 61 6d 65 20 7b 70 64 62 20 74 72  fileName {pdb tr
6680: 75 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 74  ue} } {..      t
6690: 72 79 43 6f 70 79 42 75 69 6c 64 46 69 6c 65 20  ryCopyBuildFile 
66a0: 24 66 69 6c 65 4e 61 6d 65 0d 0a 0d 0a 20 20 20  $fileName....   
66b0: 20 20 20 69 66 20 7b 24 70 64 62 7d 20 74 68 65     if {$pdb} the
66c0: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 72 79  n {..        try
66d0: 43 6f 70 79 42 75 69 6c 64 46 69 6c 65 20 5b 61  CopyBuildFile [a
66e0: 70 70 65 6e 64 41 72 67 73 20 5b 66 69 6c 65 20  ppendArgs [file 
66f0: 72 6f 6f 74 6e 61 6d 65 20 24 66 69 6c 65 4e 61  rootname $fileNa
6700: 6d 65 5d 20 2e 70 64 62 5d 0d 0a 20 20 20 20 20  me] .pdb]..     
6710: 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20   }..    }.....  
6720: 20 20 70 72 6f 63 20 74 72 79 44 65 6c 65 74 65    proc tryDelete
6730: 41 73 73 65 6d 62 6c 79 20 7b 20 66 69 6c 65 4e  Assembly { fileN
6740: 61 6d 65 20 7b 70 64 62 20 74 72 75 65 7d 20 7d  ame {pdb true} }
6750: 20 7b 0d 0a 20 20 20 20 20 20 74 72 79 44 65 6c   {..      tryDel
6760: 65 74 65 42 69 6e 61 72 79 46 69 6c 65 20 24 66  eteBinaryFile $f
6770: 69 6c 65 4e 61 6d 65 0d 0a 0d 0a 20 20 20 20 20  ileName....     
6780: 20 69 66 20 7b 24 70 64 62 7d 20 74 68 65 6e 20   if {$pdb} then 
6790: 7b 0d 0a 20 20 20 20 20 20 20 20 74 72 79 44 65  {..        tryDe
67a0: 6c 65 74 65 42 69 6e 61 72 79 46 69 6c 65 20 5b  leteBinaryFile [
67b0: 61 70 70 65 6e 64 41 72 67 73 20 5b 66 69 6c 65  appendArgs [file
67c0: 20 72 6f 6f 74 6e 61 6d 65 20 24 66 69 6c 65 4e   rootname $fileN
67d0: 61 6d 65 5d 20 2e 70 64 62 5d 0d 0a 20 20 20 20  ame] .pdb]..    
67e0: 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20    }..    }..... 
67f0: 20 20 20 70 72 6f 63 20 74 72 79 4c 6f 61 64 41     proc tryLoadA
6800: 73 73 65 6d 62 6c 79 20 7b 20 66 69 6c 65 4e 61  ssembly { fileNa
6810: 6d 65 20 7d 20 7b 0d 0a 20 20 20 20 20 20 73 65  me } {..      se
6820: 74 20 66 69 6c 65 4e 61 6d 65 20 5b 67 65 74 42  t fileName [getB
6830: 69 6e 61 72 79 46 69 6c 65 4e 61 6d 65 20 24 66  inaryFileName $f
6840: 69 6c 65 4e 61 6d 65 5d 0d 0a 0d 0a 20 20 20 20  ileName]....    
6850: 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 73 65    if {[catch {se
6860: 74 20 61 73 73 65 6d 62 6c 79 20 5c 0d 0a 20 20  t assembly \..  
6870: 20 20 20 20 20 20 20 20 20 20 20 20 5b 6f 62 6a              [obj
6880: 65 63 74 20 6c 6f 61 64 20 2d 6c 6f 61 64 74 79  ect load -loadty
6890: 70 65 20 46 69 6c 65 20 2d 61 6c 69 61 73 20 24  pe File -alias $
68a0: 66 69 6c 65 4e 61 6d 65 5d 7d 5d 20 3d 3d 20 30  fileName]}] == 0
68b0: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
68c0: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
68d0: 4f 54 45 3a 20 4e 6f 77 2c 20 61 64 64 20 74 68  OTE: Now, add th
68e0: 65 20 6e 65 63 65 73 73 61 72 79 20 74 65 73 74  e necessary test
68f0: 20 63 6f 6e 73 74 72 61 69 6e 74 2e 0d 0a 20 20   constraint...  
6900: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
6910: 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 5b   addConstraint [
6920: 66 69 6c 65 20 72 6f 6f 74 6e 61 6d 65 20 5b 66  file rootname [f
6930: 69 6c 65 20 74 61 69 6c 20 24 66 69 6c 65 4e 61  ile tail $fileNa
6940: 6d 65 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  me]]....        
6950: 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
6960: 45 3a 20 47 72 61 62 20 74 68 65 20 69 6d 61 67  E: Grab the imag
6970: 65 20 72 75 6e 74 69 6d 65 20 76 65 72 73 69 6f  e runtime versio
6980: 6e 20 66 72 6f 6d 20 74 68 65 20 61 73 73 65 6d  n from the assem
6990: 62 6c 79 20 62 65 63 61 75 73 65 0d 0a 20 20 20  bly because..   
69a0: 20 20 20 20 20 23 20 20 20 20 20 20 20 73 65 76       #       sev
69b0: 65 72 61 6c 20 74 65 73 74 73 20 72 65 6c 79 20  eral tests rely 
69c0: 6f 6e 20 69 74 20 68 61 76 69 6e 67 20 61 20 63  on it having a c
69d0: 65 72 74 61 69 6e 20 76 61 6c 75 65 2e 0d 0a 20  ertain value... 
69e0: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
69f0: 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20    addConstraint 
6a00: 5b 61 70 70 65 6e 64 41 72 67 73 20 5b 66 69 6c  [appendArgs [fil
6a10: 65 20 74 61 69 6c 20 24 66 69 6c 65 4e 61 6d 65  e tail $fileName
6a20: 5d 20 5f 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ] _ \..         
6a30: 20 20 20 5b 24 61 73 73 65 6d 62 6c 79 20 49 6d     [$assembly Im
6a40: 61 67 65 52 75 6e 74 69 6d 65 56 65 72 73 69 6f  ageRuntimeVersio
6a50: 6e 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23  n]]....        #
6a60: 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
6a70: 3a 20 52 65 74 75 72 6e 20 74 68 65 20 66 75 6c  : Return the ful
6a80: 6c 20 70 61 74 68 20 6f 66 20 74 68 65 20 6c 6f  l path of the lo
6a90: 61 64 65 64 20 66 69 6c 65 2e 0d 0a 20 20 20 20  aded file...    
6aa0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72      #..        r
6ab0: 65 74 75 72 6e 20 24 66 69 6c 65 4e 61 6d 65 0d  eturn $fileName.
6ac0: 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
6ad0: 20 20 72 65 74 75 72 6e 20 22 22 0d 0a 20 20 20    return ""..   
6ae0: 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
6af0: 69 73 53 51 4c 69 74 65 52 65 61 64 79 20 7b 7d  isSQLiteReady {}
6b00: 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20   {..      #..   
6b10: 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 69 73 20     # NOTE: This 
6b20: 70 72 6f 63 65 64 75 72 65 20 6d 75 73 74 20 72  procedure must r
6b30: 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 6f  eturn non-zero o
6b40: 6e 6c 79 20 69 66 20 74 68 65 20 53 51 4c 69 74  nly if the SQLit
6b50: 65 20 6e 61 74 69 76 65 0d 0a 20 20 20 20 20 20  e native..      
6b60: 23 20 20 20 20 20 20 20 6c 69 62 72 61 72 79 20  #       library 
6b70: 61 6e 64 20 74 68 65 20 53 79 73 74 65 6d 2e 44  and the System.D
6b80: 61 74 61 2e 53 51 4c 69 74 65 20 6d 61 6e 61 67  ata.SQLite manag
6b90: 65 64 20 61 73 73 65 6d 62 6c 79 20 61 72 65 20  ed assembly are 
6ba0: 6c 6f 61 64 65 64 0d 0a 20 20 20 20 20 20 23 20  loaded..      # 
6bb0: 20 20 20 20 20 20 61 6e 64 20 72 65 61 64 79 20        and ready 
6bc0: 66 6f 72 20 75 73 65 20 62 79 20 74 68 65 20 74  for use by the t
6bd0: 65 73 74 20 73 75 69 74 65 2e 20 20 43 75 72 72  est suite.  Curr
6be0: 65 6e 74 6c 79 2c 20 74 68 69 73 20 70 72 6f 63  ently, this proc
6bf0: 65 64 75 72 65 0d 0a 20 20 20 20 20 20 23 20 20  edure..      #  
6c00: 20 20 20 20 20 73 68 6f 75 6c 64 20 62 65 20 63       should be c
6c10: 61 6c 6c 65 64 20 6f 6e 6c 79 20 61 66 74 65 72  alled only after
6c20: 20 74 68 65 20 5b 74 72 79 4c 6f 61 64 41 73 73   the [tryLoadAss
6c30: 65 6d 62 6c 79 5d 20 70 72 6f 63 65 64 75 72 65  embly] procedure
6c40: 20 68 61 73 0d 0a 20 20 20 20 20 20 23 20 20 20   has..      #   
6c50: 20 20 20 20 62 65 65 6e 20 63 61 6c 6c 65 64 20      been called 
6c60: 74 6f 20 70 72 6f 62 65 20 66 6f 72 20 74 68 65  to probe for the
6c70: 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c   System.Data.SQL
6c80: 69 74 65 20 6d 61 6e 61 67 65 64 20 61 73 73 65  ite managed asse
6c90: 6d 62 6c 79 0d 0a 20 20 20 20 20 20 23 20 20 20  mbly..      #   
6ca0: 20 20 20 20 61 6e 64 20 74 68 65 20 5b 63 68 65      and the [che
6cb0: 63 6b 46 6f 72 53 51 4c 69 74 65 5d 20 70 72 6f  ckForSQLite] pro
6cc0: 63 65 64 75 72 65 20 68 61 73 20 62 65 65 6e 20  cedure has been 
6cd0: 63 61 6c 6c 65 64 20 74 6f 20 70 72 6f 62 65 20  called to probe 
6ce0: 66 6f 72 0d 0a 20 20 20 20 20 20 23 20 20 20 20  for..      #    
6cf0: 20 20 20 74 68 65 20 53 51 4c 69 74 65 20 6e 61     the SQLite na
6d00: 74 69 76 65 20 6c 69 62 72 61 72 79 3b 20 6f 74  tive library; ot
6d10: 68 65 72 77 69 73 65 2c 20 74 68 69 73 20 70 72  herwise, this pr
6d20: 6f 63 65 64 75 72 65 20 77 69 6c 6c 20 73 69 6d  ocedure will sim
6d30: 70 6c 79 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ply..      #    
6d40: 20 20 20 61 6c 77 61 79 73 20 72 65 74 75 72 6e     always return
6d50: 20 7a 65 72 6f 2e 0d 0a 20 20 20 20 20 20 23 0d   zero...      #.
6d60: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b 65  .      return [e
6d70: 78 70 72 20 7b 5b 68 61 76 65 43 6f 6e 73 74 72  xpr {[haveConstr
6d80: 61 69 6e 74 20 53 79 73 74 65 6d 2e 44 61 74 61  aint System.Data
6d90: 2e 53 51 4c 69 74 65 5d 20 26 26 20 5c 0d 0a 20  .SQLite] && \.. 
6da0: 20 20 20 20 20 20 20 20 20 5b 68 61 76 65 43 6f           [haveCo
6db0: 6e 73 74 72 61 69 6e 74 20 53 51 4c 69 74 65 5d  nstraint SQLite]
6dc0: 7d 5d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20  }]..    }.....  
6dd0: 20 20 70 72 6f 63 20 63 68 65 63 6b 46 6f 72 53    proc checkForS
6de0: 51 4c 69 74 65 42 75 69 6c 64 73 20 7b 20 63 68  QLiteBuilds { ch
6df0: 61 6e 6e 65 6c 20 7d 20 7b 0d 0a 20 20 20 20 20  annel } {..     
6e00: 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
6e10: 3a 20 43 68 65 63 6b 20 66 6f 72 20 65 76 65 72  : Check for ever
6e20: 79 20 70 6f 73 73 69 62 6c 65 20 76 61 6c 69 64  y possible valid
6e30: 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 20   combination of 
6e40: 76 61 6c 75 65 73 20 75 73 65 64 20 77 68 65 6e  values used when
6e50: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
6e60: 6c 6f 63 61 74 69 6e 67 20 6f 75 74 20 74 68 65  locating out the
6e70: 20 62 75 69 6c 64 20 6f 75 74 70 75 74 20 64 69   build output di
6e80: 72 65 63 74 6f 72 79 2c 20 73 68 6f 77 69 6e 67  rectory, showing
6e90: 20 65 61 63 68 20 61 76 61 69 6c 61 62 6c 65 0d   each available.
6ea0: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 62  .      #       b
6eb0: 75 69 6c 64 20 76 61 72 69 61 74 69 6f 6e 20 61  uild variation a
6ec0: 6c 6f 6e 67 20 74 68 65 20 77 61 79 2e 0d 0a 20  long the way... 
6ed0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 66 6f       #..      fo
6ee0: 72 65 61 63 68 20 6e 61 74 69 76 65 20 5b 6c 69  reach native [li
6ef0: 73 74 20 66 61 6c 73 65 20 74 72 75 65 5d 20 7b  st false true] {
6f00: 0d 0a 20 20 20 20 20 20 20 20 66 6f 72 65 61 63  ..        foreac
6f10: 68 20 79 65 61 72 20 5b 67 65 74 42 75 69 6c 64  h year [getBuild
6f20: 59 65 61 72 73 5d 20 7b 0d 0a 20 20 20 20 20 20  Years] {..      
6f30: 20 20 20 20 66 6f 72 65 61 63 68 20 63 6f 6e 66      foreach conf
6f40: 69 67 75 72 61 74 69 6f 6e 20 5b 67 65 74 42 75  iguration [getBu
6f50: 69 6c 64 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e  ildConfiguration
6f60: 73 5d 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  s] {..          
6f70: 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
6f80: 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
6f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6fa0: 22 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e 67 20 66  "---- checking f
6fb0: 6f 72 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53  or System.Data.S
6fc0: 51 4c 69 74 65 20 62 75 69 6c 64 20 5c 22 22 20  QLite build \"" 
6fd0: 5b 65 78 70 72 20 5c 0d 0a 20 20 20 20 20 20 20  [expr \..       
6fe0: 20 20 20 20 20 20 20 20 20 7b 24 6e 61 74 69 76           {$nativ
6ff0: 65 20 3f 20 22 6e 61 74 69 76 65 2f 22 20 3a 20  e ? "native/" : 
7000: 22 22 7d 5d 20 24 79 65 61 72 20 2f 20 24 63 6f  ""}] $year / $co
7010: 6e 66 69 67 75 72 61 74 69 6f 6e 20 22 5c 22 2e  nfiguration "\".
7020: 2e 2e 20 22 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  .. "]....       
7030: 20 20 20 20 20 73 65 74 20 66 69 6c 65 4e 61 6d       set fileNam
7040: 65 20 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e 61  e [file nativena
7050: 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5b 6a  me [file join [j
7060: 6f 69 6e 42 75 69 6c 64 44 69 72 65 63 74 6f 72  oinBuildDirector
7070: 79 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  y \..           
7080: 20 20 20 20 20 24 6e 61 74 69 76 65 20 5b 67 65       $native [ge
7090: 74 42 75 69 6c 64 42 61 73 65 44 69 72 65 63 74  tBuildBaseDirect
70a0: 6f 72 79 5d 20 24 79 65 61 72 20 5b 67 65 74 42  ory] $year [getB
70b0: 75 69 6c 64 50 6c 61 74 66 6f 72 6d 20 5c 0d 0a  uildPlatform \..
70c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
70d0: 24 6e 61 74 69 76 65 5d 20 24 63 6f 6e 66 69 67  $native] $config
70e0: 75 72 61 74 69 6f 6e 5d 20 53 79 73 74 65 6d 2e  uration] System.
70f0: 44 61 74 61 2e 53 51 4c 69 74 65 2e 64 6c 6c 5d  Data.SQLite.dll]
7100: 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ]....           
7110: 20 69 66 20 7b 5b 66 69 6c 65 20 65 78 69 73 74   if {[file exist
7120: 73 20 24 66 69 6c 65 4e 61 6d 65 5d 7d 20 74 68  s $fileName]} th
7130: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
7140: 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
7150: 65 6c 20 79 65 73 5c 6e 0d 0a 20 20 20 20 20 20  el yes\n..      
7160: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
7170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 70                tp
7180: 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 6e 6f 5c  uts $channel no\
7190: 6e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  n..            }
71a0: 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20  ..          }.. 
71b0: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
71c0: 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  }..    }.....   
71d0: 20 70 72 6f 63 20 63 68 65 63 6b 46 6f 72 53 51   proc checkForSQ
71e0: 4c 69 74 65 4c 69 62 72 61 72 79 20 7b 20 63 68  LiteLibrary { ch
71f0: 61 6e 6e 65 6c 20 7d 20 7b 0d 0a 20 20 20 20 20  annel } {..     
7200: 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
7210: 22 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e 67 20 66  "---- checking f
7220: 6f 72 20 53 51 4c 69 74 65 20 63 6f 72 65 20 6c  or SQLite core l
7230: 69 62 72 61 72 79 2e 2e 2e 20 22 0d 0a 0d 0a 20  ibrary... ".... 
7240: 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20       if {[catch 
7250: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
7260: 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d   object invoke -
7270: 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63  flags +NonPublic
7280: 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c   System.Data.SQL
7290: 69 74 65 2e 53 51 4c 69 74 65 33 20 5c 0d 0a 20  ite.SQLite3 \.. 
72a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
72b0: 69 74 65 56 65 72 73 69 6f 6e 7d 20 76 65 72 73  iteVersion} vers
72c0: 69 6f 6e 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20  ion] == 0} then 
72d0: 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
72e0: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68        # NOTE: Ch
72f0: 65 63 6b 20 69 66 20 74 68 65 20 72 65 74 75 72  eck if the retur
7300: 6e 65 64 20 76 65 72 73 69 6f 6e 20 77 61 73 20  ned version was 
7310: 6e 75 6c 6c 2e 20 20 49 66 20 73 6f 2c 20 6d 61  null.  If so, ma
7320: 6b 65 20 69 74 20 65 61 73 79 0d 0a 20 20 20 20  ke it easy..    
7330: 20 20 20 20 23 20 20 20 20 20 20 20 74 6f 20 73      #       to s
7340: 70 6f 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  pot...        #.
7350: 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73 74  .        if {[st
7360: 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 76 65 72  ring length $ver
7370: 73 69 6f 6e 5d 20 3d 3d 20 30 7d 20 74 68 65 6e  sion] == 0} then
7380: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65   {..          se
7390: 74 20 76 65 72 73 69 6f 6e 20 6e 75 6c 6c 0d 0a  t version null..
73a0: 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
73b0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
73c0: 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74 20  # NOTE: Attempt 
73d0: 74 6f 20 71 75 65 72 79 20 74 68 65 20 46 6f 73  to query the Fos
73e0: 73 69 6c 20 73 6f 75 72 63 65 20 69 64 65 6e 74  sil source ident
73f0: 69 66 69 65 72 20 66 6f 72 20 74 68 65 20 53 51  ifier for the SQ
7400: 4c 69 74 65 0d 0a 20 20 20 20 20 20 20 20 23 20  Lite..        # 
7410: 20 20 20 20 20 20 63 6f 72 65 20 6c 69 62 72 61        core libra
7420: 72 79 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  ry...        #..
7430: 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74          if {[cat
7440: 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  ch {..          
7450: 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76        object inv
7460: 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50  oke -flags +NonP
7470: 75 62 6c 69 63 20 53 79 73 74 65 6d 2e 44 61 74  ublic System.Dat
7480: 61 2e 53 51 4c 69 74 65 2e 53 51 4c 69 74 65 33  a.SQLite.SQLite3
7490: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
74a0: 20 20 20 20 53 51 4c 69 74 65 53 6f 75 72 63 65      SQLiteSource
74b0: 49 64 7d 20 73 6f 75 72 63 65 49 64 5d 7d 20 74  Id} sourceId]} t
74c0: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
74d0: 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20   #..          # 
74e0: 4e 4f 54 45 3a 20 57 65 20 66 61 69 6c 65 64 20  NOTE: We failed 
74f0: 74 6f 20 71 75 65 72 79 20 74 68 65 20 46 6f 73  to query the Fos
7500: 73 69 6c 20 73 6f 75 72 63 65 20 69 64 65 6e 74  sil source ident
7510: 69 66 69 65 72 2e 0d 0a 20 20 20 20 20 20 20 20  ifier...        
7520: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 73    #..          s
7530: 65 74 20 73 6f 75 72 63 65 49 64 20 75 6e 6b 6e  et sourceId unkn
7540: 6f 77 6e 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  own..        }..
7550: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
7560: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68 65       # NOTE: Che
7570: 63 6b 20 69 66 20 74 68 65 20 72 65 74 75 72 6e  ck if the return
7580: 65 64 20 46 6f 73 73 69 6c 20 73 6f 75 72 63 65  ed Fossil source
7590: 20 69 64 65 6e 74 69 66 69 65 72 20 77 61 73 20   identifier was 
75a0: 6e 75 6c 6c 2e 20 20 49 66 0d 0a 20 20 20 20 20  null.  If..     
75b0: 20 20 20 23 20 20 20 20 20 20 20 73 6f 2c 20 6d     #       so, m
75c0: 61 6b 65 20 69 74 20 65 61 73 79 20 74 6f 20 73  ake it easy to s
75d0: 70 6f 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  pot...        #.
75e0: 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73 74  .        if {[st
75f0: 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 73 6f 75  ring length $sou
7600: 72 63 65 49 64 5d 20 3d 3d 20 30 7d 20 74 68 65  rceId] == 0} the
7610: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73  n {..          s
7620: 65 74 20 73 6f 75 72 63 65 49 64 20 6e 75 6c 6c  et sourceId null
7630: 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  ..        }.... 
7640: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
7650: 20 20 23 20 4e 4f 54 45 3a 20 59 65 73 2c 20 74    # NOTE: Yes, t
7660: 68 65 20 53 51 4c 69 74 65 20 63 6f 72 65 20 6c  he SQLite core l
7670: 69 62 72 61 72 79 20 61 70 70 65 61 72 73 20 74  ibrary appears t
7680: 6f 20 62 65 20 61 76 61 69 6c 61 62 6c 65 2e 0d  o be available..
7690: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
76a0: 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e      addConstrain
76b0: 74 20 53 51 4c 69 74 65 0d 0a 0d 0a 20 20 20 20  t SQLite....    
76c0: 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
76d0: 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 22  el [appendArgs "
76e0: 79 65 73 20 28 22 20 24 76 65 72 73 69 6f 6e 20  yes (" $version 
76f0: 22 20 22 20 24 73 6f 75 72 63 65 49 64 20 22 29  " " $sourceId ")
7700: 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c  \n"]..      } el
7710: 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70  se {..        tp
7720: 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 6e 6f 5c  uts $channel no\
7730: 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  n..      }..    
7740: 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 63  }.....    proc c
7750: 68 65 63 6b 46 6f 72 53 51 4c 69 74 65 49 6e 74  heckForSQLiteInt
7760: 65 72 6f 70 20 7b 20 63 68 61 6e 6e 65 6c 20 7d  erop { channel }
7770: 20 7b 0d 0a 20 20 20 20 20 20 74 70 75 74 73 20   {..      tputs 
7780: 24 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 63  $channel "---- c
7790: 68 65 63 6b 69 6e 67 20 66 6f 72 20 53 51 4c 69  hecking for SQLi
77a0: 74 65 20 69 6e 74 65 72 6f 70 20 61 73 73 65 6d  te interop assem
77b0: 62 6c 79 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20  bly... "....    
77c0: 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a    if {[catch {..
77d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 62                ob
77e0: 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61  ject invoke -fla
77f0: 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 53 79  gs +NonPublic Sy
7800: 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
7810: 2e 53 51 4c 69 74 65 33 20 5c 0d 0a 20 20 20 20  .SQLite3 \..    
7820: 20 20 20 20 20 20 20 20 20 20 49 6e 74 65 72 6f            Intero
7830: 70 56 65 72 73 69 6f 6e 7d 20 76 65 72 73 69 6f  pVersion} versio
7840: 6e 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d  n] == 0} then {.
7850: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
7860: 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68 65 63      # NOTE: Chec
7870: 6b 20 69 66 20 74 68 65 20 72 65 74 75 72 6e 65  k if the returne
7880: 64 20 76 65 72 73 69 6f 6e 20 77 61 73 20 6e 75  d version was nu
7890: 6c 6c 2e 20 20 49 66 20 73 6f 2c 20 6d 61 6b 65  ll.  If so, make
78a0: 20 69 74 20 65 61 73 79 0d 0a 20 20 20 20 20 20   it easy..      
78b0: 20 20 23 20 20 20 20 20 20 20 74 6f 20 73 70 6f    #       to spo
78c0: 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  t...        #.. 
78d0: 20 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69         if {[stri
78e0: 6e 67 20 6c 65 6e 67 74 68 20 24 76 65 72 73 69  ng length $versi
78f0: 6f 6e 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b  on] == 0} then {
7900: 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20  ..          set 
7910: 76 65 72 73 69 6f 6e 20 6e 75 6c 6c 0d 0a 20 20  version null..  
7920: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
7930: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
7940: 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74 20 74 6f  NOTE: Attempt to
7950: 20 71 75 65 72 79 20 74 68 65 20 46 6f 73 73 69   query the Fossi
7960: 6c 20 73 6f 75 72 63 65 20 69 64 65 6e 74 69 66  l source identif
7970: 69 65 72 20 66 6f 72 20 74 68 65 20 53 51 4c 69  ier for the SQLi
7980: 74 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  te..        #   
7990: 20 20 20 20 63 6f 72 65 20 6c 69 62 72 61 72 79      core library
79a0: 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
79b0: 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68        if {[catch
79c0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
79d0: 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b      object invok
79e0: 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62  e -flags +NonPub
79f0: 6c 69 63 20 53 79 73 74 65 6d 2e 44 61 74 61 2e  lic System.Data.
7a00: 53 51 4c 69 74 65 2e 53 51 4c 69 74 65 33 20 5c  SQLite.SQLite3 \
7a10: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
7a20: 20 20 49 6e 74 65 72 6f 70 53 6f 75 72 63 65 49    InteropSourceI
7a30: 64 7d 20 73 6f 75 72 63 65 49 64 5d 7d 20 74 68  d} sourceId]} th
7a40: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
7a50: 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e  #..          # N
7a60: 4f 54 45 3a 20 57 65 20 66 61 69 6c 65 64 20 74  OTE: We failed t
7a70: 6f 20 71 75 65 72 79 20 74 68 65 20 46 6f 73 73  o query the Foss
7a80: 69 6c 20 73 6f 75 72 63 65 20 69 64 65 6e 74 69  il source identi
7a90: 66 69 65 72 2e 0d 0a 20 20 20 20 20 20 20 20 20  fier...         
7aa0: 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65   #..          se
7ab0: 74 20 73 6f 75 72 63 65 49 64 20 75 6e 6b 6e 6f  t sourceId unkno
7ac0: 77 6e 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d  wn..        }...
7ad0: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
7ae0: 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68 65 63      # NOTE: Chec
7af0: 6b 20 69 66 20 74 68 65 20 72 65 74 75 72 6e 65  k if the returne
7b00: 64 20 46 6f 73 73 69 6c 20 73 6f 75 72 63 65 20  d Fossil source 
7b10: 69 64 65 6e 74 69 66 69 65 72 20 77 61 73 20 6e  identifier was n
7b20: 75 6c 6c 2e 20 20 49 66 0d 0a 20 20 20 20 20 20  ull.  If..      
7b30: 20 20 23 20 20 20 20 20 20 20 73 6f 2c 20 6d 61    #       so, ma
7b40: 6b 65 20 69 74 20 65 61 73 79 20 74 6f 20 73 70  ke it easy to sp
7b50: 6f 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  ot...        #..
7b60: 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72          if {[str
7b70: 69 6e 67 20 6c 65 6e 67 74 68 20 24 73 6f 75 72  ing length $sour
7b80: 63 65 49 64 5d 20 3d 3d 20 30 7d 20 74 68 65 6e  ceId] == 0} then
7b90: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65   {..          se
7ba0: 74 20 73 6f 75 72 63 65 49 64 20 6e 75 6c 6c 0d  t sourceId null.
7bb0: 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  .        }....  
7bc0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
7bd0: 20 23 20 4e 4f 54 45 3a 20 59 65 73 2c 20 74 68   # NOTE: Yes, th
7be0: 65 20 53 51 4c 69 74 65 20 69 6e 74 65 72 6f 70  e SQLite interop
7bf0: 20 61 73 73 65 6d 62 6c 79 20 61 70 70 65 61 72   assembly appear
7c00: 73 20 74 6f 20 62 65 20 61 76 61 69 6c 61 62 6c  s to be availabl
7c10: 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  e...        #.. 
7c20: 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72         addConstr
7c30: 61 69 6e 74 20 53 51 4c 69 74 65 49 6e 74 65 72  aint SQLiteInter
7c40: 6f 70 0d 0a 0d 0a 20 20 20 20 20 20 20 20 74 70  op....        tp
7c50: 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70  uts $channel [ap
7c60: 70 65 6e 64 41 72 67 73 20 22 79 65 73 20 28 22  pendArgs "yes ("
7c70: 20 24 76 65 72 73 69 6f 6e 20 22 20 22 20 24 73   $version " " $s
7c80: 6f 75 72 63 65 49 64 20 22 29 5c 6e 22 5d 0d 0a  ourceId ")\n"]..
7c90: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
7ca0: 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
7cb0: 68 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d 0a 20 20 20  hannel no\n..   
7cc0: 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a     }..    }.....
7cd0: 20 20 20 20 70 72 6f 63 20 63 68 65 63 6b 46 6f      proc checkFo
7ce0: 72 53 51 4c 69 74 65 44 65 66 69 6e 65 43 6f 6e  rSQLiteDefineCon
7cf0: 73 74 61 6e 74 20 7b 20 63 68 61 6e 6e 65 6c 20  stant { channel 
7d00: 6e 61 6d 65 20 7d 20 7b 0d 0a 20 20 20 20 20 20  name } {..      
7d10: 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b  tputs $channel [
7d20: 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
7d30: 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 68          "---- ch
7d40: 65 63 6b 69 6e 67 20 66 6f 72 20 53 79 73 74 65  ecking for Syste
7d50: 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 20 64 65  m.Data.SQLite de
7d60: 66 69 6e 65 20 63 6f 6e 73 74 61 6e 74 20 5c 22  fine constant \"
7d70: 22 20 24 6e 61 6d 65 20 5c 0d 0a 20 20 20 20 20  " $name \..     
7d80: 20 20 20 20 20 22 5c 22 2e 2e 2e 20 22 5d 0d 0a       "\"... "]..
7d90: 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74  ..      if {[cat
7da0: 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  ch {..          
7db0: 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b      object invok
7dc0: 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62  e -flags +NonPub
7dd0: 6c 69 63 20 53 79 73 74 65 6d 2e 44 61 74 61 2e  lic System.Data.
7de0: 53 51 4c 69 74 65 2e 53 51 4c 69 74 65 33 20 5c  SQLite.SQLite3 \
7df0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
7e00: 44 65 66 69 6e 65 43 6f 6e 73 74 61 6e 74 73 7d  DefineConstants}
7e10: 20 64 65 66 69 6e 65 43 6f 6e 73 74 61 6e 74 73   defineConstants
7e20: 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  ] == 0} then {..
7e30: 20 20 20 20 20 20 20 20 69 66 20 7b 5b 6c 73 65          if {[lse
7e40: 61 72 63 68 20 2d 65 78 61 63 74 20 2d 6e 6f 63  arch -exact -noc
7e50: 61 73 65 20 24 64 65 66 69 6e 65 43 6f 6e 73 74  ase $defineConst
7e60: 61 6e 74 73 20 24 6e 61 6d 65 5d 20 21 3d 20 2d  ants $name] != -
7e70: 31 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  1} then {..     
7e80: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
7e90: 20 20 23 20 4e 4f 54 45 3a 20 59 65 73 2c 20 74    # NOTE: Yes, t
7ea0: 68 69 73 20 64 65 66 69 6e 65 20 63 6f 6e 73 74  his define const
7eb0: 61 6e 74 20 77 61 73 20 65 6e 61 62 6c 65 64 20  ant was enabled 
7ec0: 77 68 65 6e 20 74 68 65 20 6d 61 6e 61 67 65 64  when the managed
7ed0: 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 20 20  ..          #   
7ee0: 20 20 20 20 61 73 73 65 6d 62 6c 79 20 77 61 73      assembly was
7ef0: 20 63 6f 6d 70 69 6c 65 64 2e 0d 0a 20 20 20 20   compiled...    
7f00: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
7f10: 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74     addConstraint
7f20: 20 5b 61 70 70 65 6e 64 41 72 67 73 20 64 65 66   [appendArgs def
7f30: 69 6e 65 43 6f 6e 73 74 61 6e 74 2e 53 79 73 74  ineConstant.Syst
7f40: 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 20  em.Data.SQLite. 
7f50: 24 6e 61 6d 65 5d 0d 0a 0d 0a 20 20 20 20 20 20  $name]....      
7f60: 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
7f70: 65 6c 20 79 65 73 5c 6e 0d 0a 20 20 20 20 20 20  el yes\n..      
7f80: 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
7f90: 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
7fa0: 6e 6e 65 6c 20 6e 6f 5c 6e 0d 0a 20 20 20 20 20  nnel no\n..     
7fb0: 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 20 65 6c     }..      } el
7fc0: 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70  se {..        tp
7fd0: 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 65 72 72  uts $channel err
7fe0: 6f 72 5c 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a 20  or\n..      }.. 
7ff0: 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
8000: 63 20 67 65 74 44 61 74 65 54 69 6d 65 46 6f 72  c getDateTimeFor
8010: 6d 61 74 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20  mat {} {..      
8020: 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
8030: 20 54 68 69 73 20 70 72 6f 63 65 64 75 72 65 20   This procedure 
8040: 73 69 6d 70 6c 79 20 72 65 74 75 72 6e 73 20 74  simply returns t
8050: 68 65 20 22 64 65 66 61 75 6c 74 22 20 44 61 74  he "default" Dat
8060: 65 54 69 6d 65 20 66 6f 72 6d 61 74 20 75 73 65  eTime format use
8070: 64 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  d..      #      
8080: 20 62 79 20 74 68 65 20 74 65 73 74 20 73 75 69   by the test sui
8090: 74 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  te...      #..  
80a0: 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78      if {[info ex
80b0: 69 73 74 73 20 3a 3a 64 61 74 65 74 69 6d 65 5f  ists ::datetime_
80c0: 66 6f 72 6d 61 74 5d 20 26 26 20 5c 0d 0a 20 20  format] && \..  
80d0: 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20          [string 
80e0: 6c 65 6e 67 74 68 20 24 3a 3a 64 61 74 65 74 69  length $::dateti
80f0: 6d 65 5f 66 6f 72 6d 61 74 5d 20 3e 20 30 7d 20  me_format] > 0} 
8100: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
8110: 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
8120: 45 3a 20 52 65 74 75 72 6e 20 74 68 65 20 6d 61  E: Return the ma
8130: 6e 75 61 6c 6c 79 20 6f 76 65 72 72 69 64 64 65  nually overridde
8140: 6e 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20  n value for the 
8150: 44 61 74 65 54 69 6d 65 20 66 6f 72 6d 61 74 2e  DateTime format.
8160: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
8170: 20 20 20 20 20 72 65 74 75 72 6e 20 24 3a 3a 64       return $::d
8180: 61 74 65 74 69 6d 65 5f 66 6f 72 6d 61 74 0d 0a  atetime_format..
8190: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
81a0: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
81b0: 20 20 20 23 20 4e 4f 54 45 3a 20 52 65 74 75 72     # NOTE: Retur
81c0: 6e 20 61 6e 20 49 53 4f 38 36 30 31 20 44 61 74  n an ISO8601 Dat
81d0: 65 54 69 6d 65 20 66 6f 72 6d 61 74 20 63 6f 6d  eTime format com
81e0: 70 61 74 69 62 6c 65 20 77 69 74 68 20 53 51 4c  patible with SQL
81f0: 69 74 65 2c 0d 0a 20 20 20 20 20 20 20 20 23 20  ite,..        # 
8200: 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74        System.Dat
8210: 61 2e 53 51 4c 69 74 65 2c 20 61 6e 64 20 73 75  a.SQLite, and su
8220: 69 74 61 62 6c 65 20 66 6f 72 20 72 6f 75 6e 64  itable for round
8230: 2d 74 72 69 70 70 69 6e 67 20 77 69 74 68 20 74  -tripping with t
8240: 68 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  he..        #   
8250: 20 20 20 20 44 61 74 65 54 69 6d 65 20 63 6c 61      DateTime cla
8260: 73 73 20 6f 66 20 74 68 65 20 66 72 61 6d 65 77  ss of the framew
8270: 6f 72 6b 2e 20 20 49 66 20 74 68 69 73 20 76 61  ork.  If this va
8280: 6c 75 65 20 69 73 20 63 68 61 6e 67 65 64 2c 0d  lue is changed,.
8290: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
82a0: 20 76 61 72 69 6f 75 73 20 74 65 73 74 73 20 6d   various tests m
82b0: 61 79 20 66 61 69 6c 2e 0d 0a 20 20 20 20 20 20  ay fail...      
82c0: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74    #..        ret
82d0: 75 72 6e 20 22 79 79 79 79 2d 4d 4d 2d 64 64 20  urn "yyyy-MM-dd 
82e0: 48 48 3a 6d 6d 3a 73 73 2e 46 46 46 46 46 46 46  HH:mm:ss.FFFFFFF
82f0: 4b 22 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20  K"..      }..   
8300: 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
8310: 65 6e 75 6d 65 72 61 62 6c 65 54 6f 4c 69 73 74  enumerableToList
8320: 20 7b 20 65 6e 75 6d 65 72 61 62 6c 65 20 7d 20   { enumerable } 
8330: 7b 0d 0a 20 20 20 20 20 20 73 65 74 20 72 65 73  {..      set res
8340: 75 6c 74 20 5b 6c 69 73 74 5d 0d 0a 0d 0a 20 20  ult [list]....  
8350: 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20      if {[string 
8360: 6c 65 6e 67 74 68 20 24 65 6e 75 6d 65 72 61 62  length $enumerab
8370: 6c 65 5d 20 3d 3d 20 30 20 7c 7c 20 24 65 6e 75  le] == 0 || $enu
8380: 6d 65 72 61 62 6c 65 20 65 71 20 22 6e 75 6c 6c  merable eq "null
8390: 22 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  "} then {..     
83a0: 20 20 20 72 65 74 75 72 6e 20 24 72 65 73 75 6c     return $resul
83b0: 74 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  t..      }....  
83c0: 20 20 20 20 6f 62 6a 65 63 74 20 66 6f 72 65 61      object forea
83d0: 63 68 20 2d 61 6c 69 61 73 20 69 74 65 6d 20 24  ch -alias item $
83e0: 65 6e 75 6d 65 72 61 62 6c 65 20 7b 0d 0a 20 20  enumerable {..  
83f0: 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e        if {[strin
8400: 67 20 6c 65 6e 67 74 68 20 24 69 74 65 6d 5d 20  g length $item] 
8410: 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  > 0} then {..   
8420: 20 20 20 20 20 20 20 6c 61 70 70 65 6e 64 20 72         lappend r
8430: 65 73 75 6c 74 20 5b 24 69 74 65 6d 20 54 6f 53  esult [$item ToS
8440: 74 72 69 6e 67 5d 0d 0a 20 20 20 20 20 20 20 20  tring]..        
8450: 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  }..      }....  
8460: 20 20 20 20 72 65 74 75 72 6e 20 24 72 65 73 75      return $resu
8470: 6c 74 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20  lt..    }.....  
8480: 20 20 70 72 6f 63 20 63 61 74 63 68 41 6e 64 52    proc catchAndR
8490: 65 74 75 72 6e 20 7b 20 73 63 72 69 70 74 20 7b  eturn { script {
84a0: 73 74 61 63 6b 54 72 61 63 65 20 66 61 6c 73 65  stackTrace false
84b0: 7d 20 7b 73 74 72 69 63 74 20 74 72 75 65 7d 20  } {strict true} 
84c0: 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  } {..      #..  
84d0: 20 20 20 20 23 20 4e 4f 54 45 3a 20 45 76 61 6c      # NOTE: Eval
84e0: 75 61 74 65 20 74 68 65 20 73 63 72 69 70 74 20  uate the script 
84f0: 70 72 6f 76 69 64 65 64 20 62 79 20 6f 75 72 20  provided by our 
8500: 63 61 6c 6c 65 72 20 69 6e 20 74 68 65 69 72 20  caller in their 
8510: 63 6f 6e 74 65 78 74 2c 0d 0a 20 20 20 20 20 20  context,..      
8520: 23 20 20 20 20 20 20 20 63 61 70 74 75 72 69 6e  #       capturin
8530: 67 20 62 6f 74 68 20 74 68 65 20 72 65 73 75 6c  g both the resul
8540: 74 20 61 6e 64 20 74 68 65 20 72 65 74 75 72 6e  t and the return
8550: 20 63 6f 64 65 2e 0d 0a 20 20 20 20 20 20 23 0d   code...      #.
8560: 0a 20 20 20 20 20 20 73 65 74 20 63 6f 64 65 20  .      set code 
8570: 5b 63 61 74 63 68 20 7b 75 70 6c 65 76 65 6c 20  [catch {uplevel 
8580: 31 20 24 73 63 72 69 70 74 7d 20 72 65 73 75 6c  1 $script} resul
8590: 74 5d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20  t]....      #.. 
85a0: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 44 69 64       # NOTE: Did
85b0: 20 74 68 65 20 73 63 72 69 70 74 20 70 72 6f 76   the script prov
85c0: 69 64 65 64 20 62 79 20 6f 75 72 20 63 61 6c 6c  ided by our call
85d0: 65 72 20 4e 4f 54 20 72 61 69 73 65 20 61 6e 20  er NOT raise an 
85e0: 65 72 72 6f 72 3f 0d 0a 20 20 20 20 20 20 23 0d  error?..      #.
85f0: 0a 20 20 20 20 20 20 69 66 20 7b 24 73 74 72 69  .      if {$stri
8600: 63 74 20 26 26 20 24 63 6f 64 65 20 3d 3d 20 30  ct && $code == 0
8610: 20 7c 7c 20 21 24 73 74 72 69 63 74 20 26 26 20   || !$strict && 
8620: 24 63 6f 64 65 20 21 3d 20 31 7d 20 74 68 65 6e  $code != 1} then
8630: 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20   {..        #.. 
8640: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53         # NOTE: S
8650: 75 63 63 65 73 73 2e 20 20 52 65 74 75 72 6e 20  uccess.  Return 
8660: 61 20 6c 69 73 74 20 77 69 74 68 20 74 68 65 20  a list with the 
8670: 72 65 74 75 72 6e 20 63 6f 64 65 20 61 6e 64 20  return code and 
8680: 74 68 65 20 72 65 73 75 6c 74 2e 0d 0a 20 20 20  the result...   
8690: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
86a0: 72 65 74 75 72 6e 20 5b 6c 69 73 74 20 24 63 6f  return [list $co
86b0: 64 65 20 24 72 65 73 75 6c 74 5d 0d 0a 20 20 20  de $result]..   
86c0: 20 20 20 7d 20 65 6c 73 65 69 66 20 7b 24 73 74     } elseif {$st
86d0: 61 63 6b 54 72 61 63 65 7d 20 74 68 65 6e 20 7b  ackTrace} then {
86e0: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
86f0: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 46 61 69       # NOTE: Fai
8700: 6c 75 72 65 2e 20 20 4f 75 72 20 63 61 6c 6c 65  lure.  Our calle
8710: 72 20 77 61 6e 74 73 20 61 20 66 75 6c 6c 20 73  r wants a full s
8720: 74 61 63 6b 20 74 72 61 63 65 20 28 69 66 20 61  tack trace (if a
8730: 70 70 6c 69 63 61 62 6c 65 29 2c 0d 0a 20 20 20  pplicable),..   
8740: 20 20 20 20 20 23 20 20 20 20 20 20 20 72 65 74       #       ret
8750: 75 72 6e 20 61 20 6c 69 73 74 20 77 69 74 68 20  urn a list with 
8760: 74 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20  the return code 
8770: 61 6e 64 20 74 68 65 20 72 65 73 75 6c 74 20 76  and the result v
8780: 65 72 62 61 74 69 6d 2e 0d 0a 20 20 20 20 20 20  erbatim...      
8790: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74    #..        ret
87a0: 75 72 6e 20 5b 6c 69 73 74 20 24 63 6f 64 65 20  urn [list $code 
87b0: 24 72 65 73 75 6c 74 5d 0d 0a 20 20 20 20 20 20  $result]..      
87c0: 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
87d0: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
87e0: 4f 54 45 3a 20 46 61 69 6c 75 72 65 2e 20 20 4f  OTE: Failure.  O
87f0: 75 72 20 63 61 6c 6c 65 72 20 64 6f 65 73 20 6e  ur caller does n
8800: 6f 74 20 77 61 6e 74 20 61 20 66 75 6c 6c 20 73  ot want a full s
8810: 74 61 63 6b 20 74 72 61 63 65 20 28 69 66 0d 0a  tack trace (if..
8820: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
8830: 61 70 70 6c 69 63 61 62 6c 65 29 2c 20 72 65 74  applicable), ret
8840: 75 72 6e 20 61 20 6c 69 73 74 20 77 69 74 68 20  urn a list with 
8850: 74 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65 2c  the return code,
8860: 20 74 68 65 20 65 72 72 6f 72 0d 0a 20 20 20 20   the error..    
8870: 20 20 20 20 23 20 20 20 20 20 20 20 63 6f 64 65      #       code
8880: 20 66 6f 72 20 74 68 65 20 69 6e 74 65 72 70 72   for the interpr
8890: 65 74 65 72 2c 20 61 6e 64 20 74 68 65 20 65 72  eter, and the er
88a0: 72 6f 72 20 6d 65 73 73 61 67 65 20 75 70 20 74  ror message up t
88b0: 6f 20 74 68 65 0d 0a 20 20 20 20 20 20 20 20 23  o the..        #
88c0: 20 20 20 20 20 20 20 70 6f 69 6e 74 20 77 68 65         point whe
88d0: 72 65 20 74 68 65 20 73 74 61 63 6b 20 74 72 61  re the stack tra
88e0: 63 65 20 73 68 6f 75 6c 64 20 73 74 61 72 74 2e  ce should start.
88f0: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
8900: 20 20 20 20 20 73 65 74 20 69 6e 64 65 78 20 5b       set index [
8910: 73 74 72 69 6e 67 20 66 69 72 73 74 20 22 20 20  string first "  
8920: 20 61 74 20 22 20 24 72 65 73 75 6c 74 5d 3b 20   at " $result]; 
8930: 23 20 48 41 43 4b 3a 20 52 65 6c 69 61 62 6c 65  # HACK: Reliable
8940: 3f 0d 0a 0d 0a 20 20 20 20 20 20 20 20 72 65 74  ?....        ret
8950: 75 72 6e 20 5b 6c 69 73 74 20 24 63 6f 64 65 20  urn [list $code 
8960: 24 3a 3a 65 72 72 6f 72 43 6f 64 65 20 5b 65 78  $::errorCode [ex
8970: 70 72 20 7b 24 69 6e 64 65 78 20 21 3d 20 2d 31  pr {$index != -1
8980: 20 3f 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20   ? \..          
8990: 20 20 5b 73 74 72 69 6e 67 20 74 72 69 6d 20 5b    [string trim [
89a0: 73 74 72 69 6e 67 20 72 61 6e 67 65 20 24 72 65  string range $re
89b0: 73 75 6c 74 20 30 20 24 69 6e 64 65 78 5d 5d 20  sult 0 $index]] 
89c0: 3a 20 24 72 65 73 75 6c 74 7d 5d 5d 0d 0a 20 20  : $result}]]..  
89d0: 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d      }..    }....
89e0: 0a 20 20 20 20 70 72 6f 63 20 63 6f 6d 70 69 6c  .    proc compil
89f0: 65 43 53 68 61 72 70 57 69 74 68 20 7b 0d 0a 20  eCSharpWith {.. 
8a00: 20 20 20 20 20 20 20 20 20 20 20 74 65 78 74 20             text 
8a10: 6d 65 6d 6f 72 79 20 73 79 6d 62 6f 6c 73 20 73  memory symbols s
8a20: 74 72 69 63 74 20 72 65 73 75 6c 74 73 56 61 72  trict resultsVar
8a30: 4e 61 6d 65 20 65 72 72 6f 72 73 56 61 72 4e 61  Name errorsVarNa
8a40: 6d 65 20 66 69 6c 65 4e 61 6d 65 73 0d 0a 20 20  me fileNames..  
8a50: 20 20 20 20 20 20 20 20 20 20 61 72 67 73 20 7d            args }
8a60: 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20   {..      #..   
8a70: 20 20 20 23 20 4e 4f 54 45 3a 20 53 69 6e 63 65     # NOTE: Since
8a80: 20 77 65 20 61 72 65 20 67 6f 69 6e 67 20 74 6f   we are going to
8a90: 20 75 73 65 20 74 68 69 73 20 6d 65 74 68 6f 64   use this method
8aa0: 20 6e 61 6d 65 20 61 20 6c 6f 74 2c 20 61 73 73   name a lot, ass
8ab0: 69 67 6e 20 69 74 20 74 6f 20 61 0d 0a 20 20 20  ign it to a..   
8ac0: 20 20 20 23 20 20 20 20 20 20 20 76 61 72 69 61     #       varia
8ad0: 62 6c 65 20 66 69 72 73 74 2e 0d 0a 20 20 20 20  ble first...    
8ae0: 20 20 23 0d 0a 20 20 20 20 20 20 73 65 74 20 61    #..      set a
8af0: 64 64 20 52 65 66 65 72 65 6e 63 65 64 41 73 73  dd ReferencedAss
8b00: 65 6d 62 6c 69 65 73 2e 41 64 64 0d 0a 0d 0a 20  emblies.Add.... 
8b10: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
8b20: 4e 4f 54 45 3a 20 43 72 65 61 74 65 20 74 68 65  NOTE: Create the
8b30: 20 62 61 73 65 20 63 6f 6d 6d 61 6e 64 20 74 6f   base command to
8b40: 20 65 76 61 6c 75 61 74 65 20 61 6e 64 20 61 64   evaluate and ad
8b50: 64 20 74 68 65 20 70 72 6f 70 65 72 74 79 20 73  d the property s
8b60: 65 74 74 69 6e 67 73 0d 0a 20 20 20 20 20 20 23  ettings..      #
8b70: 20 20 20 20 20 20 20 74 68 61 74 20 61 72 65 20         that are 
8b80: 61 6c 6d 6f 73 74 20 61 6c 77 61 79 73 20 6e 65  almost always ne
8b90: 65 64 65 64 20 62 79 20 6f 75 72 20 75 6e 69 74  eded by our unit
8ba0: 20 74 65 73 74 73 20 28 69 2e 65 2e 20 74 68 65   tests (i.e. the
8bb0: 20 53 79 73 74 65 6d 0d 0a 20 20 20 20 20 20 23   System..      #
8bc0: 20 20 20 20 20 20 20 61 6e 64 20 53 79 73 74 65         and Syste
8bd0: 6d 2e 44 61 74 61 20 61 73 73 65 6d 62 6c 79 20  m.Data assembly 
8be0: 72 65 66 65 72 65 6e 63 65 73 29 2e 0d 0a 20 20  references)...  
8bf0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 73 65 74      #..      set
8c00: 20 63 6f 6d 6d 61 6e 64 20 5b 6c 69 73 74 20 63   command [list c
8c10: 6f 6d 70 69 6c 65 43 53 68 61 72 70 20 24 74 65  ompileCSharp $te
8c20: 78 74 20 24 6d 65 6d 6f 72 79 20 24 73 79 6d 62  xt $memory $symb
8c30: 6f 6c 73 20 24 73 74 72 69 63 74 20 72 65 73 75  ols $strict resu
8c40: 6c 74 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  lts \..         
8c50: 20 65 72 72 6f 72 73 20 24 61 64 64 20 53 79 73   errors $add Sys
8c60: 74 65 6d 2e 64 6c 6c 20 24 61 64 64 20 53 79 73  tem.dll $add Sys
8c70: 74 65 6d 2e 44 61 74 61 2e 64 6c 6c 20 24 61 64  tem.Data.dll $ad
8c80: 64 20 53 79 73 74 65 6d 2e 58 6d 6c 2e 64 6c 6c  d System.Xml.dll
8c90: 5d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  ]....      #..  
8ca0: 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 64 64 20      # NOTE: Add 
8cb0: 61 6c 6c 20 74 68 65 20 70 72 6f 76 69 64 65 64  all the provided
8cc0: 20 66 69 6c 65 20 6e 61 6d 65 73 20 61 73 20 61   file names as a
8cd0: 73 73 65 6d 62 6c 79 20 72 65 66 65 72 65 6e 63  ssembly referenc
8ce0: 65 73 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  es...      #..  
8cf0: 20 20 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65      foreach file
8d00: 4e 61 6d 65 20 24 66 69 6c 65 4e 61 6d 65 73 20  Name $fileNames 
8d10: 7b 0d 0a 20 20 20 20 20 20 20 20 6c 61 70 70 65  {..        lappe
8d20: 6e 64 20 63 6f 6d 6d 61 6e 64 20 24 61 64 64 20  nd command $add 
8d30: 5b 67 65 74 42 69 6e 61 72 79 46 69 6c 65 4e 61  [getBinaryFileNa
8d40: 6d 65 20 24 66 69 6c 65 4e 61 6d 65 5d 0d 0a 20  me $fileName].. 
8d50: 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
8d60: 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
8d70: 20 41 64 64 20 74 68 65 20 65 78 74 72 61 20 61   Add the extra a
8d80: 72 67 75 6d 65 6e 74 73 2c 20 69 66 20 61 6e 79  rguments, if any
8d90: 2c 20 74 6f 20 74 68 65 20 63 6f 6d 6d 61 6e 64  , to the command
8da0: 20 74 6f 20 65 76 61 6c 75 61 74 65 2e 0d 0a 20   to evaluate... 
8db0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 65 76       #..      ev
8dc0: 61 6c 20 6c 61 70 70 65 6e 64 20 63 6f 6d 6d 61  al lappend comma
8dd0: 6e 64 20 24 61 72 67 73 0d 0a 0d 0a 20 20 20 20  nd $args....    
8de0: 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
8df0: 45 3a 20 41 6c 69 61 73 20 74 68 65 20 63 6f 6d  E: Alias the com
8e00: 70 69 6c 65 72 20 6c 6f 63 61 6c 20 72 65 73 75  piler local resu
8e10: 6c 74 73 20 61 6e 64 20 65 72 72 6f 72 73 20 76  lts and errors v
8e20: 61 72 69 61 62 6c 65 73 20 74 6f 20 74 68 65 0d  ariables to the.
8e30: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 76  .      #       v
8e40: 61 72 69 61 62 6c 65 20 6e 61 6d 65 73 20 70 72  ariable names pr
8e50: 6f 76 69 64 65 64 20 62 79 20 6f 75 72 20 63 61  ovided by our ca
8e60: 6c 6c 65 72 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  ller...      #..
8e70: 20 20 20 20 20 20 75 70 76 61 72 20 31 20 24 72        upvar 1 $r
8e80: 65 73 75 6c 74 73 56 61 72 4e 61 6d 65 20 72 65  esultsVarName re
8e90: 73 75 6c 74 73 0d 0a 20 20 20 20 20 20 75 70 76  sults..      upv
8ea0: 61 72 20 31 20 24 65 72 72 6f 72 73 56 61 72 4e  ar 1 $errorsVarN
8eb0: 61 6d 65 20 65 72 72 6f 72 73 0d 0a 0d 0a 20 20  ame errors....  
8ec0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
8ed0: 4f 54 45 3a 20 45 76 61 6c 75 61 74 65 20 74 68  OTE: Evaluate th
8ee0: 65 20 63 6f 6e 73 74 72 75 63 74 65 64 20 5b 63  e constructed [c
8ef0: 6f 6d 70 69 6c 65 43 53 68 61 72 70 5d 20 63 6f  ompileCSharp] co
8f00: 6d 6d 61 6e 64 20 61 6e 64 20 72 65 74 75 72 6e  mmand and return
8f10: 20 74 68 65 0d 0a 20 20 20 20 20 20 23 20 20 20   the..      #   
8f20: 20 20 20 20 72 65 73 75 6c 74 2e 0d 0a 20 20 20      result...   
8f30: 20 20 20 23 0d 0a 20 20 20 20 20 20 65 76 61 6c     #..      eval
8f40: 20 24 63 6f 6d 6d 61 6e 64 0d 0a 20 20 20 20 7d   $command..    }
8f50: 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 69 73  .....    proc is
8f60: 4d 65 6d 6f 72 79 44 62 20 7b 20 66 69 6c 65 4e  MemoryDb { fileN
8f70: 61 6d 65 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23  ame } {..      #
8f80: 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
8f90: 49 73 20 74 68 65 20 73 70 65 63 69 66 69 65 64  Is the specified
8fa0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6e   database file n
8fb0: 61 6d 65 20 72 65 61 6c 6c 79 20 61 6e 20 69 6e  ame really an in
8fc0: 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
8fd0: 3f 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ?..      #..    
8fe0: 20 20 72 65 74 75 72 6e 20 5b 65 78 70 72 20 7b    return [expr {
8ff0: 24 66 69 6c 65 4e 61 6d 65 20 65 71 20 22 3a 6d  $fileName eq ":m
9000: 65 6d 6f 72 79 3a 22 20 7c 7c 20 5c 0d 0a 20 20  emory:" || \..  
9010: 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20          [string 
9020: 72 61 6e 67 65 20 24 66 69 6c 65 4e 61 6d 65 20  range $fileName 
9030: 30 20 31 32 5d 20 65 71 20 22 66 69 6c 65 3a 3a  0 12] eq "file::
9040: 6d 65 6d 6f 72 79 3a 22 7d 5d 0d 0a 20 20 20 20  memory:"}]..    
9050: 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 69  }.....    proc i
9060: 73 54 61 62 6c 65 49 6e 44 62 20 7b 20 6e 61 6d  sTableInDb { nam
9070: 65 20 7b 76 61 72 4e 61 6d 65 20 64 62 7d 20 7d  e {varName db} }
9080: 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20   {..      #..   
9090: 20 20 20 23 20 4e 4f 54 45 3a 20 52 65 66 65 72     # NOTE: Refer
90a0: 20 74 6f 20 74 68 65 20 73 70 65 63 69 66 69 65   to the specifie
90b0: 64 20 76 61 72 69 61 62 6c 65 20 28 65 2e 67 2e  d variable (e.g.
90c0: 20 22 64 62 22 29 20 69 6e 20 74 68 65 20 63 6f   "db") in the co
90d0: 6e 74 65 78 74 20 6f 66 20 6f 75 72 0d 0a 20 20  ntext of our..  
90e0: 20 20 20 20 23 20 20 20 20 20 20 20 63 61 6c 6c      #       call
90f0: 65 72 2e 20 20 49 74 20 63 6f 6e 74 61 69 6e 73  er.  It contains
9100: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   the database co
9110: 6e 6e 65 63 74 69 6f 6e 20 68 61 6e 64 6c 65 20  nnection handle 
9120: 74 68 61 74 20 77 69 6c 6c 20 62 65 0d 0a 20 20  that will be..  
9130: 20 20 20 20 23 20 20 20 20 20 20 20 75 73 65 64      #       used
9140: 20 74 6f 20 65 78 65 63 75 74 65 20 74 68 65 20   to execute the 
9150: 71 75 65 72 79 20 75 73 65 64 20 74 6f 20 64 65  query used to de
9160: 74 65 72 6d 69 6e 65 20 69 66 20 74 68 65 20 6e  termine if the n
9170: 61 6d 65 64 20 74 61 62 6c 65 20 69 73 0d 0a 20  amed table is.. 
9180: 20 20 20 20 20 23 20 20 20 20 20 20 20 70 72 65       #       pre
9190: 73 65 6e 74 20 69 6e 20 74 68 61 74 20 64 61 74  sent in that dat
91a0: 61 62 61 73 65 2e 0d 0a 20 20 20 20 20 20 23 0d  abase...      #.
91b0: 0a 20 20 20 20 20 20 75 70 76 61 72 20 31 20 24  .      upvar 1 $
91c0: 76 61 72 4e 61 6d 65 20 64 62 0d 0a 0d 0a 20 20  varName db....  
91d0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
91e0: 4f 54 45 3a 20 45 78 65 63 75 74 65 20 74 68 65  OTE: Execute the
91f0: 20 53 51 4c 20 71 75 65 72 79 20 61 67 61 69 6e   SQL query again
9200: 73 74 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61  st the sqlite_ma
9210: 73 74 65 72 20 74 61 62 6c 65 20 74 6f 20 63 68  ster table to ch
9220: 65 63 6b 20 69 66 0d 0a 20 20 20 20 20 20 23 20  eck if..      # 
9230: 20 20 20 20 20 20 74 68 65 20 6e 61 6d 65 64 20        the named 
9240: 74 61 62 6c 65 20 69 73 20 70 72 65 73 65 6e 74  table is present
9250: 20 61 6e 64 20 72 65 74 75 72 6e 20 6e 6f 6e 2d   and return non-
9260: 7a 65 72 6f 20 69 66 20 69 74 20 69 73 2e 0d 0a  zero if it is...
9270: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 72        #..      r
9280: 65 74 75 72 6e 20 5b 65 78 70 72 20 7b 5b 73 71  eturn [expr {[sq
9290: 6c 20 65 78 65 63 75 74 65 20 2d 65 78 65 63 75  l execute -execu
92a0: 74 65 20 73 63 61 6c 61 72 20 24 64 62 20 5c 0d  te scalar $db \.
92b0: 0a 20 20 20 20 20 20 20 20 20 20 22 53 45 4c 45  .          "SELE
92c0: 43 54 20 43 4f 55 4e 54 28 2a 29 20 46 52 4f 4d  CT COUNT(*) FROM
92d0: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 57   sqlite_master W
92e0: 48 45 52 45 20 74 79 70 65 20 3d 20 27 74 61 62  HERE type = 'tab
92f0: 6c 65 27 20 41 4e 44 20 6e 61 6d 65 20 3d 20 3f  le' AND name = ?
9300: 3b 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  ;" \..          
9310: 5b 6c 69 73 74 20 70 61 72 61 6d 31 20 53 74 72  [list param1 Str
9320: 69 6e 67 20 24 6e 61 6d 65 5d 5d 20 3e 20 30 7d  ing $name]] > 0}
9330: 5d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  ]..    }.....   
9340: 20 70 72 6f 63 20 65 78 65 63 75 74 65 53 71 6c   proc executeSql
9350: 20 7b 20 73 71 6c 20 7b 65 78 65 63 75 74 65 20   { sql {execute 
9360: 6e 6f 6e 65 7d 20 7b 66 69 6c 65 4e 61 6d 65 20  none} {fileName 
9370: 22 22 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 69  ""} } {..      i
9380: 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74  f {[string lengt
9390: 68 20 24 66 69 6c 65 4e 61 6d 65 5d 20 3d 3d 20  h $fileName] == 
93a0: 30 7d 20 74 68 65 6e 20 7b 73 65 74 20 66 69 6c  0} then {set fil
93b0: 65 4e 61 6d 65 20 3a 6d 65 6d 6f 72 79 3a 7d 0d  eName :memory:}.
93c0: 0a 20 20 20 20 20 20 73 65 74 75 70 44 62 20 24  .      setupDb $
93d0: 66 69 6c 65 4e 61 6d 65 20 22 22 20 22 22 20 22  fileName "" "" "
93e0: 22 20 22 22 20 22 22 20 66 61 6c 73 65 20 66 61  " "" "" false fa
93f0: 6c 73 65 20 66 61 6c 73 65 20 66 61 6c 73 65 20  lse false false 
9400: 6d 65 6d 44 62 0d 0a 0d 0a 20 20 20 20 20 20 74  memDb....      t
9410: 72 79 20 7b 0d 0a 20 20 20 20 20 20 20 20 72 65  ry {..        re
9420: 74 75 72 6e 20 5b 73 71 6c 20 65 78 65 63 75 74  turn [sql execut
9430: 65 20 2d 65 78 65 63 75 74 65 20 24 65 78 65 63  e -execute $exec
9440: 75 74 65 20 24 6d 65 6d 44 62 20 24 73 71 6c 5d  ute $memDb $sql]
9450: 0d 0a 20 20 20 20 20 20 7d 20 66 69 6e 61 6c 6c  ..      } finall
9460: 79 20 7b 0d 0a 20 20 20 20 20 20 20 20 63 6c 65  y {..        cle
9470: 61 6e 75 70 44 62 20 24 66 69 6c 65 4e 61 6d 65  anupDb $fileName
9480: 20 6d 65 6d 44 62 20 66 61 6c 73 65 20 66 61 6c   memDb false fal
9490: 73 65 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20  se..      }..   
94a0: 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
94b0: 73 65 74 75 70 44 62 20 7b 0d 0a 20 20 20 20 20  setupDb {..     
94c0: 20 20 20 20 20 20 20 66 69 6c 65 4e 61 6d 65 20         fileName 
94d0: 7b 6d 6f 64 65 20 22 22 7d 20 7b 64 61 74 65 54  {mode ""} {dateT
94e0: 69 6d 65 46 6f 72 6d 61 74 20 22 22 7d 20 7b 64  imeFormat ""} {d
94f0: 61 74 65 54 69 6d 65 4b 69 6e 64 20 22 22 7d 20  ateTimeKind ""} 
9500: 7b 66 6c 61 67 73 20 22 22 7d 0d 0a 20 20 20 20  {flags ""}..    
9510: 20 20 20 20 20 20 20 20 7b 65 78 74 72 61 20 22          {extra "
9520: 22 7d 20 7b 71 75 61 6c 69 66 79 20 74 72 75 65  "} {qualify true
9530: 7d 20 7b 64 65 6c 65 74 65 20 74 72 75 65 7d 20  } {delete true} 
9540: 7b 75 72 69 20 66 61 6c 73 65 7d 0d 0a 20 20 20  {uri false}..   
9550: 20 20 20 20 20 20 20 20 20 7b 74 65 6d 70 6f 72           {tempor
9560: 61 72 79 20 74 72 75 65 7d 20 7b 76 61 72 4e 61  ary true} {varNa
9570: 6d 65 20 64 62 7d 20 7d 20 7b 0d 0a 20 20 20 20  me db} } {..    
9580: 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
9590: 45 3a 20 46 69 72 73 74 2c 20 73 65 65 20 69 66  E: First, see if
95a0: 20 6f 75 72 20 63 61 6c 6c 65 72 20 68 61 73 20   our caller has 
95b0: 72 65 71 75 65 73 74 65 64 20 61 6e 20 69 6e 2d  requested an in-
95c0: 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e  memory database.
95d0: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
95e0: 20 73 65 74 20 69 73 4d 65 6d 6f 72 79 20 5b 69   set isMemory [i
95f0: 73 4d 65 6d 6f 72 79 44 62 20 24 66 69 6c 65 4e  sMemoryDb $fileN
9600: 61 6d 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d  ame]....      #.
9610: 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 46  .      # NOTE: F
9620: 6f 72 20 6e 6f 77 2c 20 61 6c 6c 20 74 65 73 74  or now, all test
9630: 20 64 61 74 61 62 61 73 65 73 20 75 73 65 64 20   databases used 
9640: 62 79 20 74 68 65 20 74 65 73 74 20 73 75 69 74  by the test suit
9650: 65 20 61 72 65 20 70 6c 61 63 65 64 0d 0a 20 20  e are placed..  
9660: 20 20 20 20 23 20 20 20 20 20 20 20 69 6e 74 6f      #       into
9670: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 64 69   the database di
9680: 72 65 63 74 6f 72 79 2e 20 20 45 61 63 68 20 64  rectory.  Each d
9690: 61 74 61 62 61 73 65 20 61 6e 64 20 72 65 6c 61  atabase and rela
96a0: 74 65 64 20 66 69 6c 65 73 0d 0a 20 20 20 20 20  ted files..     
96b0: 20 23 20 20 20 20 20 20 20 75 73 65 64 20 62 79   #       used by
96c0: 20 61 20 74 65 73 74 20 73 68 6f 75 6c 64 20 62   a test should b
96d0: 65 20 63 6c 65 61 6e 65 64 20 75 70 20 62 79 20  e cleaned up by 
96e0: 74 68 61 74 20 74 65 73 74 20 75 73 69 6e 67 20  that test using 
96f0: 74 68 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20  the..      #    
9700: 20 20 20 22 63 6c 65 61 6e 75 70 44 62 22 20 70     "cleanupDb" p
9710: 72 6f 63 65 64 75 72 65 2c 20 62 65 6c 6f 77 2e  rocedure, below.
9720: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
9730: 20 69 66 20 7b 21 24 69 73 4d 65 6d 6f 72 79 20   if {!$isMemory 
9740: 26 26 20 24 71 75 61 6c 69 66 79 7d 20 74 68 65  && $qualify} the
9750: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 65 74  n {..        set
9760: 20 66 69 6c 65 4e 61 6d 65 20 5b 66 69 6c 65 20   fileName [file 
9770: 6a 6f 69 6e 20 5b 67 65 74 44 61 74 61 62 61 73  join [getDatabas
9780: 65 44 69 72 65 63 74 6f 72 79 5d 20 5b 66 69 6c  eDirectory] [fil
9790: 65 20 74 61 69 6c 20 24 66 69 6c 65 4e 61 6d 65  e tail $fileName
97a0: 5d 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  ]]..      }.... 
97b0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
97c0: 4e 4f 54 45 3a 20 42 79 20 64 65 66 61 75 6c 74  NOTE: By default
97d0: 2c 20 64 65 6c 65 74 65 20 61 6e 79 20 70 72 65  , delete any pre
97e0: 2d 65 78 69 73 74 69 6e 67 20 64 61 74 61 62 61  -existing databa
97f0: 73 65 20 77 69 74 68 20 74 68 65 20 73 61 6d 65  se with the same
9800: 20 66 69 6c 65 0d 0a 20 20 20 20 20 20 23 20 20   file..      #  
9810: 20 20 20 20 20 6e 61 6d 65 20 69 66 20 69 74 20       name if it 
9820: 63 75 72 72 65 6e 74 6c 79 20 65 78 69 73 74 73  currently exists
9830: 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
9840: 20 20 69 66 20 7b 21 24 69 73 4d 65 6d 6f 72 79    if {!$isMemory
9850: 20 26 26 20 24 64 65 6c 65 74 65 20 26 26 20 5b   && $delete && [
9860: 66 69 6c 65 20 65 78 69 73 74 73 20 24 66 69 6c  file exists $fil
9870: 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a  eName]} then {..
9880: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
9890: 20 20 20 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d     # NOTE: Attem
98a0: 70 74 20 74 6f 20 64 65 6c 65 74 65 20 61 6e 79  pt to delete any
98b0: 20 70 72 65 2d 65 78 69 73 74 69 6e 67 20 64 61   pre-existing da
98c0: 74 61 62 61 73 65 20 77 69 74 68 20 74 68 65 20  tabase with the 
98d0: 73 61 6d 65 20 66 69 6c 65 0d 0a 20 20 20 20 20  same file..     
98e0: 20 20 20 23 20 20 20 20 20 20 20 6e 61 6d 65 2e     #       name.
98f0: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
9900: 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20       if {[catch 
9910: 7b 66 69 6c 65 20 64 65 6c 65 74 65 20 24 66 69  {file delete $fi
9920: 6c 65 4e 61 6d 65 7d 20 65 72 72 6f 72 5d 7d 20  leName} error]} 
9930: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
9940: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23    #..          #
9950: 20 4e 4f 54 45 3a 20 57 65 20 73 6f 6d 65 68 6f   NOTE: We someho
9960: 77 20 66 61 69 6c 65 64 20 74 6f 20 64 65 6c 65  w failed to dele
9970: 74 65 20 74 68 65 20 66 69 6c 65 2c 20 72 65 70  te the file, rep
9980: 6f 72 74 20 77 68 79 2e 0d 0a 20 20 20 20 20 20  ort why...      
9990: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
99a0: 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
99b0: 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
99c0: 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
99d0: 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e      "==== WARNIN
99e0: 47 3a 20 66 61 69 6c 65 64 20 74 6f 20 64 65 6c  G: failed to del
99f0: 65 74 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  ete database fil
9a00: 65 20 5c 22 22 20 24 66 69 6c 65 4e 61 6d 65 20  e \"" $fileName 
9a10: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
9a20: 20 22 5c 22 20 64 75 72 69 6e 67 20 73 65 74 75   "\" during setu
9a30: 70 2c 20 65 72 72 6f 72 3a 20 22 20 5c 6e 5c 74  p, error: " \n\t
9a40: 20 24 65 72 72 6f 72 20 5c 6e 5d 0d 0a 20 20 20   $error \n]..   
9a50: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d       }..      }.
9a60: 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
9a70: 20 20 23 20 4e 4f 54 45 3a 20 52 65 66 65 72 20    # NOTE: Refer 
9a80: 74 6f 20 74 68 65 20 73 70 65 63 69 66 69 65 64  to the specified
9a90: 20 76 61 72 69 61 62 6c 65 20 28 65 2e 67 2e 20   variable (e.g. 
9aa0: 22 64 62 22 29 20 69 6e 20 74 68 65 20 63 6f 6e  "db") in the con
9ab0: 74 65 78 74 20 6f 66 20 6f 75 72 0d 0a 20 20 20  text of our..   
9ac0: 20 20 20 23 20 20 20 20 20 20 20 63 61 6c 6c 65     #       calle
9ad0: 72 2e 20 20 54 68 65 20 68 61 6e 64 6c 65 20 74  r.  The handle t
9ae0: 6f 20 74 68 65 20 6f 70 65 6e 65 64 20 64 61 74  o the opened dat
9af0: 61 62 61 73 65 20 77 69 6c 6c 20 62 65 20 73 74  abase will be st
9b00: 6f 72 65 64 20 74 68 65 72 65 2e 0d 0a 20 20 20  ored there...   
9b10: 20 20 20 23 0d 0a 20 20 20 20 20 20 75 70 76 61     #..      upva
9b20: 72 20 31 20 24 76 61 72 4e 61 6d 65 20 64 62 0d  r 1 $varName db.
9b30: 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
9b40: 20 20 23 20 4e 4f 54 45 3a 20 53 74 61 72 74 20    # NOTE: Start 
9b50: 62 75 69 6c 64 69 6e 67 20 74 68 65 20 63 6f 6e  building the con
9b60: 6e 65 63 74 69 6f 6e 20 73 74 72 69 6e 67 2e 20  nection string. 
9b70: 20 54 68 65 20 6f 6e 6c 79 20 72 65 71 75 69 72   The only requir
9b80: 65 64 20 70 6f 72 74 69 6f 6e 0d 0a 20 20 20 20  ed portion..    
9b90: 20 20 23 20 20 20 20 20 20 20 6f 66 20 74 68 65    #       of the
9ba0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 74 72 69   connection stri
9bb0: 6e 67 20 69 73 20 74 68 65 20 64 61 74 61 20 73  ng is the data s
9bc0: 6f 75 72 63 65 2c 20 77 68 69 63 68 20 63 6f 6e  ource, which con
9bd0: 74 61 69 6e 73 20 74 68 65 0d 0a 20 20 20 20 20  tains the..     
9be0: 20 23 20 20 20 20 20 20 20 64 61 74 61 62 61 73   #       databas
9bf0: 65 20 66 69 6c 65 20 6e 61 6d 65 20 69 74 73 65  e file name itse
9c00: 6c 66 2e 20 20 49 66 20 6f 75 72 20 63 61 6c 6c  lf.  If our call
9c10: 65 72 20 77 61 6e 74 73 20 74 6f 20 75 73 65 20  er wants to use 
9c20: 61 20 55 52 49 20 61 73 0d 0a 20 20 20 20 20 20  a URI as..      
9c30: 23 20 20 20 20 20 20 20 74 68 65 20 64 61 74 61  #       the data
9c40: 20 73 6f 75 72 63 65 2c 20 75 73 65 20 74 68 65   source, use the
9c50: 20 46 75 6c 6c 55 72 69 20 63 6f 6e 6e 65 63 74   FullUri connect
9c60: 69 6f 6e 20 73 74 72 69 6e 67 20 70 72 6f 70 65  ion string prope
9c70: 72 74 79 20 74 6f 0d 0a 20 20 20 20 20 20 23 20  rty to..      # 
9c80: 20 20 20 20 20 20 70 72 65 76 65 6e 74 20 74 68        prevent th
9c90: 65 20 64 61 74 61 20 73 6f 75 72 63 65 20 73 74  e data source st
9ca0: 72 69 6e 67 20 66 72 6f 6d 20 62 65 69 6e 67 20  ring from being 
9cb0: 6d 61 6e 67 6c 65 64 2e 0d 0a 20 20 20 20 20 20  mangled...      
9cc0: 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 24 75 72  #..      if {$ur
9cd0: 69 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  i} then {..     
9ce0: 20 20 20 73 65 74 20 63 6f 6e 6e 65 63 74 69 6f     set connectio
9cf0: 6e 20 7b 46 75 6c 6c 55 72 69 3d 24 7b 66 69 6c  n {FullUri=${fil
9d00: 65 4e 61 6d 65 7d 7d 0d 0a 20 20 20 20 20 20 7d  eName}}..      }
9d10: 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
9d20: 20 73 65 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   set connection 
9d30: 7b 44 61 74 61 20 53 6f 75 72 63 65 3d 24 7b 66  {Data Source=${f
9d40: 69 6c 65 4e 61 6d 65 7d 7d 0d 0a 20 20 20 20 20  ileName}}..     
9d50: 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20   }....      #.. 
9d60: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 69 6e       # NOTE: Sin
9d70: 63 65 20 74 68 69 73 20 70 72 6f 63 65 64 75 72  ce this procedur
9d80: 65 20 68 61 73 20 6e 6f 20 73 70 65 63 69 61 6c  e has no special
9d90: 20 6b 6e 6f 77 6c 65 64 67 65 20 6f 66 20 77 68   knowledge of wh
9da0: 61 74 20 74 68 65 20 64 65 66 61 75 6c 74 0d 0a  at the default..
9db0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 73 65        #       se
9dc0: 74 74 69 6e 67 20 69 73 20 66 6f 72 20 74 68 65  tting is for the
9dd0: 20 54 6f 46 75 6c 6c 50 61 74 68 20 63 6f 6e 6e   ToFullPath conn
9de0: 65 63 74 69 6f 6e 20 73 74 72 69 6e 67 20 70 72  ection string pr
9df0: 6f 70 65 72 79 2c 20 61 6c 77 61 79 73 0d 0a 20  opery, always.. 
9e00: 20 20 20 20 20 23 20 20 20 20 20 20 20 61 64 64       #       add
9e10: 20 74 68 65 20 76 61 6c 75 65 20 77 65 20 6b 6e   the value we kn
9e20: 6f 77 20 61 62 6f 75 74 20 74 6f 20 74 68 65 20  ow about to the 
9e30: 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 74 72 69 6e  connection strin
9e40: 67 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  g...      #..   
9e50: 20 20 20 61 70 70 65 6e 64 20 63 6f 6e 6e 65 63     append connec
9e60: 74 69 6f 6e 20 7b 3b 54 6f 46 75 6c 6c 50 61 74  tion {;ToFullPat
9e70: 68 3d 24 7b 71 75 61 6c 69 66 79 7d 7d 0d 0a 0d  h=${qualify}}...
9e80: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
9e90: 23 20 4e 4f 54 45 3a 20 49 66 20 6f 75 72 20 63  # NOTE: If our c
9ea0: 61 6c 6c 65 72 20 73 70 65 63 69 66 69 65 64 20  aller specified 
9eb0: 61 20 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 2c 20  a journal mode, 
9ec0: 61 64 64 20 74 68 65 20 6e 65 63 65 73 73 61 72  add the necessar
9ed0: 79 20 70 6f 72 74 69 6f 6e 0d 0a 20 20 20 20 20  y portion..     
9ee0: 20 23 20 20 20 20 20 20 20 6f 66 20 74 68 65 20   #       of the 
9ef0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 74 72 69 6e  connection strin
9f00: 67 20 6e 6f 77 2e 0d 0a 20 20 20 20 20 20 23 0d  g now...      #.
9f10: 0a 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69  .      if {[stri
9f20: 6e 67 20 6c 65 6e 67 74 68 20 24 6d 6f 64 65 5d  ng length $mode]
9f30: 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20   > 0} then {..  
9f40: 20 20 20 20 20 20 61 70 70 65 6e 64 20 63 6f 6e        append con
9f50: 6e 65 63 74 69 6f 6e 20 7b 3b 4a 6f 75 72 6e 61  nection {;Journa
9f60: 6c 20 4d 6f 64 65 3d 24 7b 6d 6f 64 65 7d 7d 0d  l Mode=${mode}}.
9f70: 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
9f80: 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
9f90: 45 3a 20 49 66 20 6f 75 72 20 63 61 6c 6c 65 72  E: If our caller
9fa0: 20 73 70 65 63 69 66 69 65 64 20 61 20 44 61 74   specified a Dat
9fb0: 65 54 69 6d 65 20 66 6f 72 6d 61 74 2c 20 61 64  eTime format, ad
9fc0: 64 20 74 68 65 20 6e 65 63 65 73 73 61 72 79 0d  d the necessary.
9fd0: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 70  .      #       p
9fe0: 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65 20 63 6f  ortion of the co
9ff0: 6e 6e 65 63 74 69 6f 6e 20 73 74 72 69 6e 67 20  nnection string 
a000: 6e 6f 77 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  now...      #.. 
a010: 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67       if {[string
a020: 20 6c 65 6e 67 74 68 20 24 64 61 74 65 54 69 6d   length $dateTim
a030: 65 46 6f 72 6d 61 74 5d 20 3e 20 30 7d 20 74 68  eFormat] > 0} th
a040: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 61 70  en {..        ap
a050: 70 65 6e 64 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  pend connection 
a060: 7b 3b 44 61 74 65 54 69 6d 65 46 6f 72 6d 61 74  {;DateTimeFormat
a070: 3d 24 7b 64 61 74 65 54 69 6d 65 46 6f 72 6d 61  =${dateTimeForma
a080: 74 7d 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a  t}}..      }....
a090: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
a0a0: 20 4e 4f 54 45 3a 20 49 66 20 6f 75 72 20 63 61   NOTE: If our ca
a0b0: 6c 6c 65 72 20 73 70 65 63 69 66 69 65 64 20 61  ller specified a
a0c0: 20 44 61 74 65 54 69 6d 65 4b 69 6e 64 2c 20 61   DateTimeKind, a
a0d0: 64 64 20 74 68 65 20 6e 65 63 65 73 73 61 72 79  dd the necessary
a0e0: 20 70 6f 72 74 69 6f 6e 0d 0a 20 20 20 20 20 20   portion..      
a0f0: 23 20 20 20 20 20 20 20 6f 66 20 74 68 65 20 63  #       of the c
a100: 6f 6e 6e 65 63 74 69 6f 6e 20 73 74 72 69 6e 67  onnection string
a110: 20 6e 6f 77 2e 0d 0a 20 20 20 20 20 20 23 0d 0a   now...      #..
a120: 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e        if {[strin
a130: 67 20 6c 65 6e 67 74 68 20 24 64 61 74 65 54 69  g length $dateTi
a140: 6d 65 4b 69 6e 64 5d 20 3e 20 30 7d 20 74 68 65  meKind] > 0} the
a150: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 61 70 70  n {..        app
a160: 65 6e 64 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 7b  end connection {
a170: 3b 44 61 74 65 54 69 6d 65 4b 69 6e 64 3d 24 7b  ;DateTimeKind=${
a180: 64 61 74 65 54 69 6d 65 4b 69 6e 64 7d 7d 0d 0a  dateTimeKind}}..
a190: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
a1a0: 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
a1b0: 3a 20 49 66 20 74 68 65 72 65 20 61 72 65 20 61  : If there are a
a1c0: 6e 79 20 67 6c 6f 62 61 6c 20 28 70 65 72 20 74  ny global (per t
a1d0: 65 73 74 20 72 75 6e 29 20 63 6f 6e 6e 65 63 74  est run) connect
a1e0: 69 6f 6e 20 66 6c 61 67 73 20 63 75 72 72 65 6e  ion flags curren
a1f0: 74 6c 79 0d 0a 20 20 20 20 20 20 23 20 20 20 20  tly..      #    
a200: 20 20 20 73 65 74 2c 20 75 73 65 20 74 68 65 6d     set, use them
a210: 20 6e 6f 77 20 28 69 2e 65 2e 20 62 79 20 63 6f   now (i.e. by co
a220: 6d 62 69 6e 69 6e 67 20 74 68 65 6d 20 77 69 74  mbining them wit
a230: 68 20 74 68 65 20 6f 6e 65 73 20 66 6f 72 20 74  h the ones for t
a240: 68 69 73 0d 0a 20 20 20 20 20 20 23 20 20 20 20  his..      #    
a250: 20 20 20 63 6f 6e 6e 65 63 74 69 6f 6e 29 2e 0d     connection)..
a260: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
a270: 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73  if {[info exists
a280: 20 3a 3a 63 6f 6e 6e 65 63 74 69 6f 6e 5f 66 6c   ::connection_fl
a290: 61 67 73 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20  ags] && \..     
a2a0: 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e       [string len
a2b0: 67 74 68 20 24 3a 3a 63 6f 6e 6e 65 63 74 69 6f  gth $::connectio
a2c0: 6e 5f 66 6c 61 67 73 5d 20 3e 20 30 7d 20 74 68  n_flags] > 0} th
a2d0: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d  en {..        #.
a2e0: 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
a2f0: 20 53 68 6f 77 20 28 61 6e 64 20 6c 6f 67 29 20   Show (and log) 
a300: 74 68 61 74 20 77 65 20 64 65 74 65 63 74 65 64  that we detected
a310: 20 73 6f 6d 65 20 67 6c 6f 62 61 6c 20 63 6f 6e   some global con
a320: 6e 65 63 74 69 6f 6e 20 66 6c 61 67 73 2e 0d 0a  nection flags...
a330: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
a340: 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
a350: 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  _channel [append
a360: 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
a370: 20 20 20 20 22 2d 2d 2d 2d 20 67 6c 6f 62 61 6c      "---- global
a380: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 6c 61 67   connection flag
a390: 73 20 64 65 74 65 63 74 65 64 3a 20 22 20 24 3a  s detected: " $:
a3a0: 3a 63 6f 6e 6e 65 63 74 69 6f 6e 5f 66 6c 61 67  :connection_flag
a3b0: 73 20 5c 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  s \n]....       
a3c0: 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
a3d0: 54 45 3a 20 43 6f 6d 62 69 6e 65 20 61 6e 64 2f  TE: Combine and/
a3e0: 6f 72 20 72 65 70 6c 61 63 65 20 74 68 65 20 63  or replace the c
a3f0: 6f 6e 6e 65 63 74 69 6f 6e 20 66 6c 61 67 73 20  onnection flags 
a400: 61 6e 64 20 74 68 65 6e 20 73 68 6f 77 20 74 68  and then show th
a410: 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  e..        #    
a420: 20 20 20 6e 65 77 20 76 61 6c 75 65 2e 0d 0a 20     new value... 
a430: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
a440: 20 20 73 65 74 20 66 6c 61 67 73 20 5b 63 6f 6d    set flags [com
a450: 62 69 6e 65 46 6c 61 67 73 20 24 66 6c 61 67 73  bineFlags $flags
a460: 20 24 3a 3a 63 6f 6e 6e 65 63 74 69 6f 6e 5f 66   $::connection_f
a470: 6c 61 67 73 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  lags]....       
a480: 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
a490: 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
a4a0: 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
a4b0: 20 20 22 2d 2d 2d 2d 20 63 6f 6d 62 69 6e 65 64    "---- combined
a4c0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 6c 61 67   connection flag
a4d0: 73 20 61 72 65 3a 20 22 20 24 66 6c 61 67 73 20  s are: " $flags 
a4e0: 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a  \n]..      }....
a4f0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
a500: 20 4e 4f 54 45 3a 20 49 66 20 6f 75 72 20 63 61   NOTE: If our ca
a510: 6c 6c 65 72 20 73 70 65 63 69 66 69 65 64 20 73  ller specified s
a520: 6f 6d 65 20 53 51 4c 69 74 65 43 6f 6e 6e 65 63  ome SQLiteConnec
a530: 74 69 6f 6e 46 6c 61 67 73 2c 20 61 64 64 20 74  tionFlags, add t
a540: 68 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  he..      #     
a550: 20 20 6e 65 63 65 73 73 61 72 79 20 70 6f 72 74    necessary port
a560: 69 6f 6e 20 6f 66 20 74 68 65 20 63 6f 6e 6e 65  ion of the conne
a570: 63 74 69 6f 6e 20 73 74 72 69 6e 67 20 6e 6f 77  ction string now
a580: 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
a590: 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65    if {[string le
a5a0: 6e 67 74 68 20 24 66 6c 61 67 73 5d 20 3e 20 30  ngth $flags] > 0
a5b0: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
a5c0: 20 20 61 70 70 65 6e 64 20 63 6f 6e 6e 65 63 74    append connect
a5d0: 69 6f 6e 20 7b 3b 46 6c 61 67 73 3d 24 7b 66 6c  ion {;Flags=${fl
a5e0: 61 67 73 7d 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a  ags}}..      }..
a5f0: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
a600: 20 23 20 4e 4f 54 45 3a 20 49 66 20 6f 75 72 20   # NOTE: If our 
a610: 63 61 6c 6c 65 72 20 73 70 65 63 69 66 69 65 64  caller specified
a620: 20 61 6e 20 65 78 74 72 61 20 70 61 79 6c 6f 61   an extra payloa
a630: 64 20 74 6f 20 74 68 65 20 63 6f 6e 6e 65 63 74  d to the connect
a640: 69 6f 6e 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ion..      #    
a650: 20 20 20 73 74 72 69 6e 67 2c 20 61 70 70 65 6e     string, appen
a660: 64 20 69 74 20 6e 6f 77 2e 0d 0a 20 20 20 20 20  d it now...     
a670: 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 73   #..      if {[s
a680: 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 65 78  tring length $ex
a690: 74 72 61 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b  tra] > 0} then {
a6a0: 0d 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e 64  ..        append
a6b0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 5c 3b 20 24   connection \; $
a6c0: 65 78 74 72 61 0d 0a 20 20 20 20 20 20 7d 0d 0a  extra..      }..
a6d0: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
a6e0: 20 23 20 4e 4f 54 45 3a 20 4f 70 65 6e 20 74 68   # NOTE: Open th
a6f0: 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
a700: 63 74 69 6f 6e 20 6e 6f 77 2c 20 70 6c 61 63 69  ction now, placi
a710: 6e 67 20 74 68 65 20 6f 70 61 71 75 65 20 68 61  ng the opaque ha
a720: 6e 64 6c 65 20 76 61 6c 75 65 0d 0a 20 20 20 20  ndle value..    
a730: 20 20 23 20 20 20 20 20 20 20 69 6e 74 6f 20 74    #       into t
a740: 68 65 20 76 61 72 69 61 62 6c 65 20 73 70 65 63  he variable spec
a750: 69 66 69 65 64 20 62 79 20 6f 75 72 20 63 61 6c  ified by our cal
a760: 6c 65 72 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ler...      #.. 
a770: 20 20 20 20 20 73 65 74 20 64 62 20 5b 73 71 6c       set db [sql
a780: 20 6f 70 65 6e 20 2d 74 79 70 65 20 53 51 4c 69   open -type SQLi
a790: 74 65 20 5b 73 75 62 73 74 20 24 63 6f 6e 6e 65  te [subst $conne
a7a0: 63 74 69 6f 6e 5d 5d 0d 0a 0d 0a 20 20 20 20 20  ction]]....     
a7b0: 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
a7c0: 3a 20 43 6f 6e 66 69 67 75 72 65 20 74 68 65 20  : Configure the 
a7d0: 74 65 6d 70 6f 72 61 72 79 20 64 69 72 65 63 74  temporary direct
a7e0: 6f 72 79 20 66 6f 72 20 74 68 65 20 6e 65 77 6c  ory for the newl
a7f0: 79 20 6f 70 65 6e 65 64 20 64 61 74 61 62 61 73  y opened databas
a800: 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  e..      #      
a810: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6e 6f 77 20   connection now 
a820: 75 6e 6c 65 73 73 20 6f 75 72 20 63 61 6c 6c 65  unless our calle
a830: 72 20 66 6f 72 62 69 64 73 20 69 74 2e 0d 0a 20  r forbids it... 
a840: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66       #..      if
a850: 20 7b 24 74 65 6d 70 6f 72 61 72 79 20 26 26 20   {$temporary && 
a860: 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  ![info exists ::
a870: 6e 6f 28 73 65 74 54 65 6d 70 6f 72 61 72 79 44  no(setTemporaryD
a880: 69 72 65 63 74 6f 72 79 29 5d 7d 20 74 68 65 6e  irectory)]} then
a890: 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 71 6c 20   {..        sql 
a8a0: 65 78 65 63 75 74 65 20 24 64 62 20 5b 61 70 70  execute $db [app
a8b0: 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
a8c0: 20 20 20 20 20 20 20 22 50 52 41 47 4d 41 20 74         "PRAGMA t
a8d0: 65 6d 70 5f 73 74 6f 72 65 5f 64 69 72 65 63 74  emp_store_direct
a8e0: 6f 72 79 20 3d 20 5c 22 22 20 5b 67 65 74 54 65  ory = \"" [getTe
a8f0: 6d 70 6f 72 61 72 79 44 69 72 65 63 74 6f 72 79  mporaryDirectory
a900: 5d 20 5c 22 5c 3b 5d 0d 0a 20 20 20 20 20 20 7d  ] \"\;]..      }
a910: 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  ....      #..   
a920: 20 20 20 23 20 4e 4f 54 45 3a 20 41 6c 77 61 79     # NOTE: Alway
a930: 73 20 72 65 74 75 72 6e 20 74 68 65 20 63 6f 6e  s return the con
a940: 6e 65 63 74 69 6f 6e 20 68 61 6e 64 6c 65 20 75  nection handle u
a950: 70 6f 6e 20 73 75 63 63 65 73 73 2e 0d 0a 20 20  pon success...  
a960: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 72 65 74      #..      ret
a970: 75 72 6e 20 24 64 62 0d 0a 20 20 20 20 7d 0d 0a  urn $db..    }..
a980: 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74 44  ...    proc getD
a990: 62 43 6f 6e 6e 65 63 74 69 6f 6e 20 7b 20 7b 76  bConnection { {v
a9a0: 61 72 4e 61 6d 65 20 64 62 7d 20 7d 20 7b 0d 0a  arName db} } {..
a9b0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
a9c0: 20 4e 4f 54 45 3a 20 52 65 66 65 72 20 74 6f 20   NOTE: Refer to 
a9d0: 74 68 65 20 73 70 65 63 69 66 69 65 64 20 76 61  the specified va
a9e0: 72 69 61 62 6c 65 20 28 65 2e 67 2e 20 22 64 62  riable (e.g. "db
a9f0: 22 29 20 69 6e 20 74 68 65 20 63 6f 6e 74 65 78  ") in the contex
aa00: 74 20 6f 66 20 6f 75 72 0d 0a 20 20 20 20 20 20  t of our..      
aa10: 23 20 20 20 20 20 20 20 63 61 6c 6c 65 72 2e 20  #       caller. 
aa20: 20 54 68 65 20 68 61 6e 64 6c 65 20 74 6f 20 74   The handle to t
aa30: 68 65 20 64 61 74 61 62 61 73 65 20 70 72 65 76  he database prev
aa40: 69 6f 75 73 6c 79 20 6f 70 65 6e 65 64 20 76 69  iously opened vi
aa50: 61 20 74 68 65 0d 0a 20 20 20 20 20 20 23 20 20  a the..      #  
aa60: 20 20 20 20 20 5b 73 65 74 75 70 44 62 5d 20 70       [setupDb] p
aa70: 72 6f 63 65 64 75 72 65 20 73 68 6f 75 6c 64 20  rocedure should 
aa80: 62 65 20 73 74 6f 72 65 64 20 74 68 65 72 65 2e  be stored there.
aa90: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
aaa0: 20 75 70 76 61 72 20 31 20 24 76 61 72 4e 61 6d   upvar 1 $varNam
aab0: 65 20 64 62 0d 0a 0d 0a 20 20 20 20 20 20 23 0d  e db....      #.
aac0: 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54  .      # NOTE: T
aad0: 68 69 73 20 72 65 74 75 72 6e 73 20 74 68 65 20  his returns the 
aae0: 41 44 4f 2e 4e 45 54 20 49 44 62 43 6f 6e 6e 65  ADO.NET IDbConne
aaf0: 63 74 69 6f 6e 20 6f 62 6a 65 63 74 20 69 6e 73  ction object ins
ab00: 74 61 6e 63 65 20 66 6f 72 20 74 68 65 0d 0a 20  tance for the.. 
ab10: 20 20 20 20 20 23 20 20 20 20 20 20 20 73 70 65       #       spe
ab20: 63 69 66 69 65 64 20 64 61 74 61 62 73 65 20 68  cified databse h
ab30: 61 6e 64 6c 65 2e 20 20 53 69 6e 63 65 20 67 65  andle.  Since ge
ab40: 74 74 69 6e 67 20 74 68 69 73 20 6f 62 6a 65 63  tting this objec
ab50: 74 20 72 65 6c 69 65 73 20 75 70 6f 6e 0d 0a 20  t relies upon.. 
ab60: 20 20 20 20 20 23 20 20 20 20 20 20 20 45 61 67       #       Eag
ab70: 6c 65 20 69 6e 74 65 72 6e 61 6c 73 2c 20 67 72  le internals, gr
ab80: 65 61 74 20 63 61 72 65 20 73 68 6f 75 6c 64 20  eat care should 
ab90: 62 65 20 74 61 6b 65 6e 20 74 6f 20 61 76 6f 69  be taken to avoi
aba0: 64 20 64 69 73 70 6f 73 69 6e 67 20 6f 66 0d 0a  d disposing of..
abb0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68        #       th
abc0: 69 73 20 6f 62 6a 65 63 74 20 6f 72 20 6f 74 68  is object or oth
abd0: 65 72 77 69 73 65 20 70 75 74 74 69 6e 67 20 69  erwise putting i
abe0: 74 20 69 6e 74 6f 20 61 6e 20 69 6e 76 61 6c 69  t into an invali
abf0: 64 20 73 74 61 74 65 2e 0d 0a 20 20 20 20 20 20  d state...      
ac00: 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 6e  #..      if {[in
ac10: 66 6f 20 65 78 69 73 74 73 20 64 62 5d 7d 20 74  fo exists db]} t
ac20: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 69  hen {..        i
ac30: 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20  f {[catch {..   
ac40: 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 62 6a               obj
ac50: 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67  ect invoke -flag
ac60: 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 2d 6f 62  s +NonPublic -ob
ac70: 6a 65 63 74 66 6c 61 67 73 20 2b 4e 6f 44 69 73  jectflags +NoDis
ac80: 70 6f 73 65 20 5c 0d 0a 20 20 20 20 20 20 20 20  pose \..        
ac90: 20 20 20 20 20 20 20 20 2d 61 6c 69 61 73 20 49          -alias I
aca0: 6e 74 65 72 70 72 65 74 65 72 2e 47 65 74 41 63  nterpreter.GetAc
acb0: 74 69 76 65 2e 63 6f 6e 6e 65 63 74 69 6f 6e 73  tive.connections
acc0: 20 49 74 65 6d 20 24 64 62 7d 20 5c 0d 0a 20 20   Item $db} \..  
acd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
ace0: 73 75 6c 74 5d 20 3d 3d 20 30 7d 20 74 68 65 6e  sult] == 0} then
acf0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d   {..          #.
ad00: 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54  .          # NOT
ad10: 45 3a 20 53 75 63 63 65 73 73 2c 20 72 65 74 75  E: Success, retu
ad20: 72 6e 20 74 68 65 20 6f 70 61 71 75 65 20 6f 62  rn the opaque ob
ad30: 6a 65 63 74 20 68 61 6e 64 6c 65 2e 0d 0a 20 20  ject handle...  
ad40: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
ad50: 20 20 20 20 20 72 65 74 75 72 6e 20 24 72 65 73       return $res
ad60: 75 6c 74 0d 0a 20 20 20 20 20 20 20 20 7d 20 65  ult..        } e
ad70: 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  lse {..         
ad80: 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20   #..          # 
ad90: 4e 4f 54 45 3a 20 46 61 69 6c 75 72 65 2c 20 72  NOTE: Failure, r
ada0: 65 70 6f 72 74 20 77 68 79 2e 0d 0a 20 20 20 20  eport why...    
adb0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
adc0: 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
add0: 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  _channel [append
ade0: 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
adf0: 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e        "==== WARN
ae00: 49 4e 47 3a 20 66 61 69 6c 65 64 20 74 6f 20 67  ING: failed to g
ae10: 65 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61  et connection ha
ae20: 6e 64 6c 65 20 66 6f 72 20 64 61 74 61 62 61 73  ndle for databas
ae30: 65 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20 20  e \"" \..       
ae40: 20 20 20 20 20 20 20 24 64 62 20 22 5c 22 2c 20         $db "\", 
ae50: 65 72 72 6f 72 3a 20 22 20 5c 6e 5c 74 20 24 72  error: " \n\t $r
ae60: 65 73 75 6c 74 20 5c 6e 5d 0d 0a 20 20 20 20 20  esult \n]..     
ae70: 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20     }..      }.. 
ae80: 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
ae90: 63 20 66 72 65 65 44 62 43 6f 6e 6e 65 63 74 69  c freeDbConnecti
aea0: 6f 6e 20 7b 20 7b 76 61 72 4e 61 6d 65 20 63 6f  on { {varName co
aeb0: 6e 6e 65 63 74 69 6f 6e 7d 20 7d 20 7b 0d 0a 20  nnection} } {.. 
aec0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
aed0: 4e 4f 54 45 3a 20 52 65 66 65 72 20 74 6f 20 74  NOTE: Refer to t
aee0: 68 65 20 73 70 65 63 69 66 69 65 64 20 76 61 72  he specified var
aef0: 69 61 62 6c 65 20 28 65 2e 67 2e 20 22 63 6f 6e  iable (e.g. "con
af00: 6e 65 63 74 69 6f 6e 22 29 20 69 6e 20 74 68 65  nection") in the
af10: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
af20: 63 6f 6e 74 65 78 74 20 6f 66 20 6f 75 72 20 63  context of our c
af30: 61 6c 6c 65 72 2e 20 20 54 68 65 20 6f 70 61 71  aller.  The opaq
af40: 75 65 20 6f 62 6a 65 63 74 20 68 61 6e 64 6c 65  ue object handle
af50: 20 66 6f 72 20 61 6e 20 41 44 4f 2e 4e 45 54 0d   for an ADO.NET.
af60: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63  .      #       c
af70: 6f 6e 6e 65 63 74 69 6f 6e 20 70 72 65 76 69 6f  onnection previo
af80: 75 73 6c 79 20 72 65 74 75 72 6e 65 64 20 62 79  usly returned by
af90: 20 5b 67 65 74 44 62 43 6f 6e 6e 65 63 74 69 6f   [getDbConnectio
afa0: 6e 5d 20 73 68 6f 75 6c 64 20 62 65 0d 0a 20 20  n] should be..  
afb0: 20 20 20 20 23 20 20 20 20 20 20 20 73 74 6f 72      #       stor
afc0: 65 64 20 74 68 65 72 65 2e 0d 0a 20 20 20 20 20  ed there...     
afd0: 20 23 0d 0a 20 20 20 20 20 20 75 70 76 61 72 20   #..      upvar 
afe0: 31 20 24 76 61 72 4e 61 6d 65 20 63 6f 6e 6e 65  1 $varName conne
aff0: 63 74 69 6f 6e 0d 0a 0d 0a 20 20 20 20 20 20 23  ction....      #
b000: 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
b010: 41 74 74 65 6d 70 74 20 74 6f 20 72 65 6d 6f 76  Attempt to remov
b020: 65 20 74 68 65 20 6f 70 61 71 75 65 20 6f 62 6a  e the opaque obj
b030: 65 63 74 20 68 61 6e 64 6c 65 20 66 72 6f 6d 20  ect handle from 
b040: 74 68 65 20 69 6e 74 65 72 70 72 65 74 65 72 0d  the interpreter.
b050: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 6e  .      #       n
b060: 6f 77 2e 20 20 54 68 69 73 20 5b 6f 62 6a 65 63  ow.  This [objec
b070: 74 20 64 69 73 70 6f 73 65 5d 20 63 61 6c 6c 20  t dispose] call 
b080: 77 69 6c 6c 20 6e 6f 74 20 61 63 74 75 61 6c 6c  will not actuall
b090: 79 20 64 69 73 70 6f 73 65 20 6f 66 20 74 68 65  y dispose of the
b0a0: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
b0b0: 75 6e 64 65 72 6c 79 69 6e 67 20 6f 62 6a 65 63  underlying objec
b0c0: 74 20 62 65 63 61 75 73 65 20 74 68 65 20 2b 4e  t because the +N
b0d0: 6f 44 69 73 70 6f 73 65 20 66 6c 61 67 20 77 61  oDispose flag wa
b0e0: 73 20 73 65 74 20 6f 6e 20 69 74 0d 0a 20 20 20  s set on it..   
b0f0: 20 20 20 23 20 20 20 20 20 20 20 64 75 72 69 6e     #       durin
b100: 67 20 63 72 65 61 74 69 6f 6e 20 6f 66 20 74 68  g creation of th
b110: 65 20 6f 70 61 71 75 65 20 6f 62 6a 65 63 74 20  e opaque object 
b120: 68 61 6e 64 6c 65 2e 0d 0a 20 20 20 20 20 20 23  handle...      #
b130: 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66  ..      if {[inf
b140: 6f 20 65 78 69 73 74 73 20 63 6f 6e 6e 65 63 74  o exists connect
b150: 69 6f 6e 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20  ion] && \..     
b160: 20 20 20 20 20 5b 63 61 74 63 68 20 7b 6f 62 6a       [catch {obj
b170: 65 63 74 20 64 69 73 70 6f 73 65 20 24 63 6f 6e  ect dispose $con
b180: 6e 65 63 74 69 6f 6e 7d 20 65 72 72 6f 72 5d 7d  nection} error]}
b190: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
b1a0: 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
b1b0: 54 45 3a 20 57 65 20 73 6f 6d 65 68 6f 77 20 66  TE: We somehow f
b1c0: 61 69 6c 65 64 20 74 6f 20 72 65 6d 6f 76 65 20  ailed to remove 
b1d0: 74 68 65 20 68 61 6e 64 6c 65 2c 20 72 65 70 6f  the handle, repo
b1e0: 72 74 20 77 68 79 2e 0d 0a 20 20 20 20 20 20 20  rt why...       
b1f0: 20 23 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74   #..        tput
b200: 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
b210: 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
b220: 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 3d 3d  .            "==
b230: 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c  == WARNING: fail
b240: 65 64 20 74 6f 20 72 65 6d 6f 76 65 20 63 6f 6e  ed to remove con
b250: 6e 65 63 74 69 6f 6e 20 68 61 6e 64 6c 65 20 5c  nection handle \
b260: 22 22 20 24 63 6f 6e 6e 65 63 74 69 6f 6e 20 5c  "" $connection \
b270: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 5c  ..            "\
b280: 22 2c 20 65 72 72 6f 72 3a 20 22 20 5c 6e 5c 74  ", error: " \n\t
b290: 20 24 65 72 72 6f 72 20 5c 6e 5d 0d 0a 20 20 20   $error \n]..   
b2a0: 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a     }..    }.....
b2b0: 20 20 20 20 70 72 6f 63 20 61 64 64 44 62 43 6f      proc addDbCo
b2c0: 6e 6e 65 63 74 69 6f 6e 20 7b 20 63 6f 6e 6e 65  nnection { conne
b2d0: 63 74 69 6f 6e 20 7b 76 61 72 4e 61 6d 65 20 64  ction {varName d
b2e0: 62 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d  b} } {..      #.
b2f0: 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 52  .      # NOTE: R
b300: 65 66 65 72 20 74 6f 20 74 68 65 20 73 70 65 63  efer to the spec
b310: 69 66 69 65 64 20 76 61 72 69 61 62 6c 65 20 28  ified variable (
b320: 65 2e 67 2e 20 22 64 62 22 29 20 69 6e 20 74 68  e.g. "db") in th
b330: 65 20 63 6f 6e 74 65 78 74 20 6f 66 20 6f 75 72  e context of our
b340: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
b350: 63 61 6c 6c 65 72 2e 0d 0a 20 20 20 20 20 20 23  caller...      #
b360: 0d 0a 20 20 20 20 20 20 75 70 76 61 72 20 31 20  ..      upvar 1 
b370: 24 76 61 72 4e 61 6d 65 20 64 62 0d 0a 0d 0a 20  $varName db.... 
b380: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
b390: 4e 4f 54 45 3a 20 43 72 65 61 74 65 20 61 20 63  NOTE: Create a c
b3a0: 6f 72 72 65 63 74 6c 79 20 66 6f 72 6d 61 74 74  orrectly formatt
b3b0: 65 64 20 6e 61 6d 65 20 66 6f 72 20 74 68 65 20  ed name for the 
b3c0: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
b3d0: 69 6f 6e 20 74 6f 0d 0a 20 20 20 20 20 20 23 20  ion to..      # 
b3e0: 20 20 20 20 20 20 62 65 20 61 64 64 65 64 20 74        be added t
b3f0: 6f 20 74 68 65 20 6c 69 73 74 20 6d 61 6e 61 67  o the list manag
b400: 65 64 20 62 79 20 74 68 65 20 45 61 67 6c 65 20  ed by the Eagle 
b410: 69 6e 74 65 72 70 72 65 74 65 72 2e 0d 0a 20 20  interpreter...  
b420: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 73 65 74      #..      set
b430: 20 64 62 20 5b 6f 62 6a 65 63 74 20 69 6e 76 6f   db [object invo
b440: 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75  ke -flags +NonPu
b450: 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20 20 20  blic \..        
b460: 20 20 45 61 67 6c 65 2e 5f 43 6f 6d 70 6f 6e 65    Eagle._Compone
b470: 6e 74 73 2e 50 72 69 76 61 74 65 2e 46 6f 72 6d  nts.Private.Form
b480: 61 74 4f 70 73 20 44 61 74 61 62 61 73 65 4f 62  atOps DatabaseOb
b490: 6a 65 63 74 4e 61 6d 65 20 24 63 6f 6e 6e 65 63  jectName $connec
b4a0: 74 69 6f 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20  tion \..        
b4b0: 20 20 53 51 4c 69 74 65 43 6f 6e 6e 65 63 74 69    SQLiteConnecti
b4c0: 6f 6e 20 5b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b  on [object invok
b4d0: 65 20 49 6e 74 65 72 70 72 65 74 65 72 2e 47 65  e Interpreter.Ge
b4e0: 74 41 63 74 69 76 65 20 4e 65 78 74 49 64 5d 5d  tActive NextId]]
b4f0: 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  ....      #..   
b500: 20 20 20 23 20 4e 4f 54 45 3a 20 41 64 64 20 74     # NOTE: Add t
b510: 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  he database conn
b520: 65 63 74 69 6f 6e 20 70 72 6f 76 69 64 65 64 20  ection provided 
b530: 62 79 20 6f 75 72 20 63 61 6c 6c 65 72 20 74 6f  by our caller to
b540: 20 74 68 65 20 6c 69 73 74 0d 0a 20 20 20 20 20   the list..     
b550: 20 23 20 20 20 20 20 20 20 6f 66 20 74 68 6f 73   #       of thos
b560: 65 20 6b 6e 6f 77 6e 20 74 6f 20 74 68 65 20 45  e known to the E
b570: 61 67 6c 65 20 69 6e 74 65 72 70 72 65 74 65 72  agle interpreter
b580: 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
b590: 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20    object invoke 
b5a0: 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69  -flags +NonPubli
b5b0: 63 20 49 6e 74 65 72 70 72 65 74 65 72 2e 47 65  c Interpreter.Ge
b5c0: 74 41 63 74 69 76 65 2e 63 6f 6e 6e 65 63 74 69  tActive.connecti
b5d0: 6f 6e 73 20 41 64 64 20 5c 0d 0a 20 20 20 20 20  ons Add \..     
b5e0: 20 20 20 20 20 24 64 62 20 24 63 6f 6e 6e 65 63       $db $connec
b5f0: 74 69 6f 6e 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a  tion..    }.....
b600: 20 20 20 20 70 72 6f 63 20 63 6c 65 61 6e 75 70      proc cleanup
b610: 44 62 20 7b 20 66 69 6c 65 4e 61 6d 65 20 7b 76  Db { fileName {v
b620: 61 72 4e 61 6d 65 20 64 62 7d 20 7b 63 6f 6c 6c  arName db} {coll
b630: 65 63 74 20 74 72 75 65 7d 20 7b 71 75 61 6c 69  ect true} {quali
b640: 66 79 20 74 72 75 65 7d 0d 0a 20 20 20 20 20 20  fy true}..      
b650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b                 {
b660: 64 65 6c 65 74 65 20 74 72 75 65 7d 20 7d 20 7b  delete true} } {
b670: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
b680: 20 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74   # NOTE: Attempt
b690: 20 74 6f 20 66 6f 72 63 65 20 61 6c 6c 20 70 65   to force all pe
b6a0: 6e 64 69 6e 67 20 22 67 61 72 62 61 67 65 22 20  nding "garbage" 
b6b0: 6f 62 6a 65 63 74 73 20 74 6f 20 62 65 20 63 6f  objects to be co
b6c0: 6c 6c 65 63 74 65 64 2c 0d 0a 20 20 20 20 20 20  llected,..      
b6d0: 23 20 20 20 20 20 20 20 69 6e 63 6c 75 64 69 6e  #       includin
b6e0: 67 20 53 51 4c 69 74 65 20 73 74 61 74 65 6d 65  g SQLite stateme
b6f0: 6e 74 73 20 61 6e 64 20 62 61 63 6b 75 70 20 6f  nts and backup o
b700: 62 6a 65 63 74 73 3b 20 74 68 69 73 20 73 68 6f  bjects; this sho
b710: 75 6c 64 20 61 6c 6c 6f 77 0d 0a 20 20 20 20 20  uld allow..     
b720: 20 23 20 20 20 20 20 20 20 74 68 65 20 75 6e 64   #       the und
b730: 65 72 6c 79 69 6e 67 20 64 61 74 61 62 61 73 65  erlying database
b740: 20 66 69 6c 65 20 74 6f 20 62 65 20 64 65 6c 65   file to be dele
b750: 74 65 64 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ted...      #.. 
b760: 20 20 20 20 20 69 66 20 7b 24 63 6f 6c 6c 65 63       if {$collec
b770: 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  t} then {..     
b780: 20 20 20 63 6f 6c 6c 65 63 74 47 61 72 62 61 67     collectGarbag
b790: 65 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  e $::test_channe
b7a0: 6c 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  l..      }....  
b7b0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
b7c0: 4f 54 45 3a 20 52 65 66 65 72 20 74 6f 20 74 68  OTE: Refer to th
b7d0: 65 20 73 70 65 63 69 66 69 65 64 20 76 61 72 69  e specified vari
b7e0: 61 62 6c 65 20 28 65 2e 67 2e 20 22 64 62 22 29  able (e.g. "db")
b7f0: 20 69 6e 20 74 68 65 20 63 6f 6e 74 65 78 74 20   in the context 
b800: 6f 66 20 6f 75 72 0d 0a 20 20 20 20 20 20 23 20  of our..      # 
b810: 20 20 20 20 20 20 63 61 6c 6c 65 72 2e 20 20 54        caller.  T
b820: 68 65 20 68 61 6e 64 6c 65 20 74 6f 20 74 68 65  he handle to the
b830: 20 64 61 74 61 62 61 73 65 20 70 72 65 76 69 6f   database previo
b840: 75 73 6c 79 20 6f 70 65 6e 65 64 20 76 69 61 20  usly opened via 
b850: 74 68 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20  the..      #    
b860: 20 20 20 5b 73 65 74 75 70 44 62 5d 20 70 72 6f     [setupDb] pro
b870: 63 65 64 75 72 65 20 73 68 6f 75 6c 64 20 62 65  cedure should be
b880: 20 73 74 6f 72 65 64 20 74 68 65 72 65 2e 0d 0a   stored there...
b890: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 75        #..      u
b8a0: 70 76 61 72 20 31 20 24 76 61 72 4e 61 6d 65 20  pvar 1 $varName 
b8b0: 64 62 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20  db....      #.. 
b8c0: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 6c 6f       # NOTE: Clo
b8d0: 73 65 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  se the connectio
b8e0: 6e 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  n to the databas
b8f0: 65 20 6e 6f 77 2e 20 20 54 68 69 73 20 73 68 6f  e now.  This sho
b900: 75 6c 64 20 61 6c 6c 6f 77 20 75 73 0d 0a 20 20  uld allow us..  
b910: 20 20 20 20 23 20 20 20 20 20 20 20 74 6f 20 64      #       to d
b920: 65 6c 65 74 65 20 74 68 65 20 75 6e 64 65 72 6c  elete the underl
b930: 79 69 6e 67 20 64 61 74 61 62 61 73 65 20 66 69  ying database fi
b940: 6c 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  le...      #..  
b950: 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78      if {[info ex
b960: 69 73 74 73 20 64 62 5d 20 26 26 20 5b 63 61 74  ists db] && [cat
b970: 63 68 20 7b 73 71 6c 20 63 6c 6f 73 65 20 24 64  ch {sql close $d
b980: 62 7d 20 65 72 72 6f 72 5d 7d 20 74 68 65 6e 20  b} error]} then 
b990: 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
b9a0: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 57 65        # NOTE: We
b9b0: 20 73 6f 6d 65 68 6f 77 20 66 61 69 6c 65 64 20   somehow failed 
b9c0: 74 6f 20 63 6c 6f 73 65 20 74 68 65 20 64 61 74  to close the dat
b9d0: 61 62 61 73 65 2c 20 72 65 70 6f 72 74 20 77 68  abase, report wh
b9e0: 79 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  y...        #.. 
b9f0: 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
ba00: 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70  test_channel [ap
ba10: 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
ba20: 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41          "==== WA
ba30: 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20 74 6f  RNING: failed to
ba40: 20 63 6c 6f 73 65 20 64 61 74 61 62 61 73 65 20   close database 
ba50: 5c 22 22 20 24 64 62 20 22 5c 22 2c 20 65 72 72  \"" $db "\", err
ba60: 6f 72 3a 20 22 20 5c 0d 0a 20 20 20 20 20 20 20  or: " \..       
ba70: 20 20 20 20 20 5c 6e 5c 74 20 24 65 72 72 6f 72       \n\t $error
ba80: 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d   \n]..      }...
ba90: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
baa0: 23 20 4e 4f 54 45 3a 20 46 69 72 73 74 2c 20 73  # NOTE: First, s
bab0: 65 65 20 69 66 20 6f 75 72 20 63 61 6c 6c 65 72  ee if our caller
bac0: 20 68 61 73 20 72 65 71 75 65 73 74 65 64 20 61   has requested a
bad0: 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  n in-memory data
bae0: 62 61 73 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  base...      #..
baf0: 20 20 20 20 20 20 73 65 74 20 69 73 4d 65 6d 6f        set isMemo
bb00: 72 79 20 5b 69 73 4d 65 6d 6f 72 79 44 62 20 24  ry [isMemoryDb $
bb10: 66 69 6c 65 4e 61 6d 65 5d 0d 0a 0d 0a 20 20 20  fileName]....   
bb20: 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
bb30: 54 45 3a 20 42 75 69 6c 64 20 74 68 65 20 66 75  TE: Build the fu
bb40: 6c 6c 20 70 61 74 68 20 74 6f 20 74 68 65 20 64  ll path to the d
bb50: 61 74 61 62 61 73 65 20 66 69 6c 65 20 6e 61 6d  atabase file nam
bb60: 65 2e 20 20 46 6f 72 20 6e 6f 77 2c 20 61 6c 6c  e.  For now, all
bb70: 20 74 65 73 74 0d 0a 20 20 20 20 20 20 23 20 20   test..      #  
bb80: 20 20 20 20 20 64 61 74 61 62 61 73 65 20 66 69       database fi
bb90: 6c 65 73 20 61 72 65 20 73 74 6f 72 65 64 20 69  les are stored i
bba0: 6e 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20  n the temporary 
bbb0: 64 69 72 65 63 74 6f 72 79 2e 0d 0a 20 20 20 20  directory...    
bbc0: 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 21    #..      if {!
bbd0: 24 69 73 4d 65 6d 6f 72 79 20 26 26 20 24 71 75  $isMemory && $qu
bbe0: 61 6c 69 66 79 7d 20 74 68 65 6e 20 7b 0d 0a 20  alify} then {.. 
bbf0: 20 20 20 20 20 20 20 73 65 74 20 66 69 6c 65 4e         set fileN
bc00: 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5b  ame [file join [
bc10: 67 65 74 44 61 74 61 62 61 73 65 44 69 72 65 63  getDatabaseDirec
bc20: 74 6f 72 79 5d 20 5b 66 69 6c 65 20 74 61 69 6c  tory] [file tail
bc30: 20 24 66 69 6c 65 4e 61 6d 65 5d 5d 0d 0a 20 20   $fileName]]..  
bc40: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23      }....      #
bc50: 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
bc60: 43 68 65 63 6b 20 69 66 20 74 68 65 20 66 69 6c  Check if the fil
bc70: 65 20 73 74 69 6c 6c 20 65 78 69 73 74 73 2e 0d  e still exists..
bc80: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
bc90: 69 66 20 7b 21 24 69 73 4d 65 6d 6f 72 79 20 26  if {!$isMemory &
bca0: 26 20 24 64 65 6c 65 74 65 20 26 26 20 5b 66 69  & $delete && [fi
bcb0: 6c 65 20 65 78 69 73 74 73 20 24 66 69 6c 65 4e  le exists $fileN
bcc0: 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ame]} then {..  
bcd0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
bce0: 20 23 20 4e 4f 54 45 3a 20 53 6b 69 70 20 64 65   # NOTE: Skip de
bcf0: 6c 65 74 69 6e 67 20 64 61 74 61 62 61 73 65 20  leting database 
bd00: 66 69 6c 65 73 20 69 66 20 73 6f 6d 65 62 6f 64  files if somebod
bd10: 79 20 73 65 74 73 20 74 68 65 20 67 6c 6f 62 61  y sets the globa
bd20: 6c 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  l..        #    
bd30: 20 20 20 76 61 72 69 61 62 6c 65 20 74 6f 20 70     variable to p
bd40: 72 65 76 65 6e 74 20 69 74 2e 0d 0a 20 20 20 20  revent it...    
bd50: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 69      #..        i
bd60: 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73  f {![info exists
bd70: 20 3a 3a 6e 6f 28 63 6c 65 61 6e 75 70 44 62 46   ::no(cleanupDbF
bd80: 69 6c 65 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  ile)]} then {.. 
bd90: 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
bda0: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 74        # NOTE: At
bdb0: 74 65 6d 70 74 20 74 6f 20 64 65 6c 65 74 65 20  tempt to delete 
bdc0: 74 68 65 20 74 65 73 74 20 64 61 74 61 62 61 73  the test databas
bdd0: 65 20 66 69 6c 65 20 6e 6f 77 2e 0d 0a 20 20 20  e file now...   
bde0: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
bdf0: 20 20 20 20 69 66 20 7b 5b 73 65 74 20 63 6f 64      if {[set cod
be00: 65 20 5b 63 61 74 63 68 20 7b 66 69 6c 65 20 64  e [catch {file d
be10: 65 6c 65 74 65 20 24 66 69 6c 65 4e 61 6d 65 7d  elete $fileName}
be20: 20 65 72 72 6f 72 5d 5d 7d 20 74 68 65 6e 20 7b   error]]} then {
be30: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 0d  ..            #.
be40: 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4e  .            # N
be50: 4f 54 45 3a 20 57 65 20 73 6f 6d 65 68 6f 77 20  OTE: We somehow 
be60: 66 61 69 6c 65 64 20 74 6f 20 64 65 6c 65 74 65  failed to delete
be70: 20 74 68 65 20 66 69 6c 65 2c 20 72 65 70 6f 72   the file, repor
be80: 74 20 77 68 79 2e 0d 0a 20 20 20 20 20 20 20 20  t why...        
be90: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
bea0: 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
beb0: 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  _channel [append
bec0: 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
bed0: 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41          "==== WA
bee0: 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20 74 6f  RNING: failed to
bef0: 20 64 65 6c 65 74 65 20 64 61 74 61 62 61 73 65   delete database
bf00: 20 66 69 6c 65 20 5c 22 22 20 24 66 69 6c 65 4e   file \"" $fileN
bf10: 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ame \..         
bf20: 20 20 20 20 20 20 20 22 5c 22 20 64 75 72 69 6e         "\" durin
bf30: 67 20 63 6c 65 61 6e 75 70 2c 20 65 72 72 6f 72  g cleanup, error
bf40: 3a 20 22 20 5c 6e 5c 74 20 24 65 72 72 6f 72 20  : " \n\t $error 
bf50: 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  \n]..          }
bf60: 0d 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65  ..        } else
bf70: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d   {..          #.
bf80: 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54  .          # NOT
bf90: 45 3a 20 53 68 6f 77 20 74 68 61 74 20 77 65 20  E: Show that we 
bfa0: 73 6b 69 70 70 65 64 20 64 65 6c 65 74 69 6e 67  skipped deleting
bfb0: 20 74 68 65 20 66 69 6c 65 2e 0d 0a 20 20 20 20   the file...    
bfc0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
bfd0: 20 20 20 73 65 74 20 63 6f 64 65 20 30 0d 0a 0d     set code 0...
bfe0: 0a 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73  .          tputs
bff0: 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
c000: 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
c010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 3d                "=
c020: 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 73 6b 69  === WARNING: ski
c030: 70 70 65 64 20 64 65 6c 65 74 69 6e 67 20 64 61  pped deleting da
c040: 74 61 62 61 73 65 20 66 69 6c 65 20 5c 22 22 20  tabase file \"" 
c050: 24 66 69 6c 65 4e 61 6d 65 20 5c 0d 0a 20 20 20  $fileName \..   
c060: 20 20 20 20 20 20 20 20 20 20 20 22 5c 22 20 64             "\" d
c070: 75 72 69 6e 67 20 63 6c 65 61 6e 75 70 5c 6e 22  uring cleanup\n"
c080: 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  ]..        }..  
c090: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
c0a0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
c0b0: 20 23 20 4e 4f 54 45 3a 20 54 68 65 20 66 69 6c   # NOTE: The fil
c0c0: 65 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74  e does not exist
c0d0: 2c 20 73 75 63 63 65 73 73 21 0d 0a 20 20 20 20  , success!..    
c0e0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 73      #..        s
c0f0: 65 74 20 63 6f 64 65 20 30 0d 0a 20 20 20 20 20  et code 0..     
c100: 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65 74 75   }....      retu
c110: 72 6e 20 24 63 6f 64 65 0d 0a 20 20 20 20 7d 0d  rn $code..    }.
c120: 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 73 65 74  ....    proc set
c130: 75 70 44 62 49 6e 74 65 72 72 75 70 74 43 61 6c  upDbInterruptCal
c140: 6c 62 61 63 6b 20 7b 20 63 68 61 6e 6e 65 6c 20  lback { channel 
c150: 6c 6f 67 20 7d 20 7b 0d 0a 20 20 20 20 20 20 74  log } {..      t
c160: 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 22 2d  puts $channel "-
c170: 2d 2d 2d 20 73 65 74 74 69 6e 67 20 75 70 20 64  --- setting up d
c180: 65 62 75 67 67 65 72 20 69 6e 74 65 72 72 75 70  ebugger interrup
c190: 74 20 63 61 6c 6c 62 61 63 6b 2e 2e 2e 20 22 0d  t callback... ".
c1a0: 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 63 61  ...      if {[ca
c1b0: 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  tch {..        #
c1c0: 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
c1d0: 3a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20  : Make sure the 
c1e0: 73 63 72 69 70 74 20 64 65 62 75 67 67 65 72 20  script debugger 
c1f0: 61 6e 64 20 74 68 65 20 69 73 6f 6c 61 74 65 64  and the isolated
c200: 20 69 6e 74 65 72 70 72 65 74 65 72 20 61 72 65   interpreter are
c210: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
c220: 20 20 73 65 74 75 70 20 61 6e 64 20 72 65 61 64    setup and read
c230: 79 20 66 6f 72 20 75 73 65 2e 0d 0a 20 20 20 20  y for use...    
c240: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 64      #..        d
c250: 65 62 75 67 20 73 65 74 75 70 20 74 72 75 65 20  ebug setup true 
c260: 74 72 75 65 0d 0a 0d 0a 20 20 20 20 20 20 20 20  true....        
c270: 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
c280: 45 3a 20 4c 6f 61 64 20 74 68 65 20 6e 65 63 65  E: Load the nece
c290: 73 73 61 72 79 20 70 61 63 6b 61 67 65 73 20 69  ssary packages i
c2a0: 6e 74 6f 20 74 68 65 20 69 73 6f 6c 61 74 65 64  nto the isolated
c2b0: 20 69 6e 74 65 72 70 72 65 74 65 72 2e 0d 0a 20   interpreter... 
c2c0: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
c2d0: 20 20 64 65 62 75 67 20 65 76 61 6c 20 7b 0d 0a    debug eval {..
c2e0: 20 20 20 20 20 20 20 20 20 20 70 61 63 6b 61 67            packag
c2f0: 65 20 72 65 71 75 69 72 65 20 45 61 67 6c 65 0d  e require Eagle.
c300: 0a 20 20 20 20 20 20 20 20 20 20 70 61 63 6b 61  .          packa
c310: 67 65 20 72 65 71 75 69 72 65 20 45 61 67 6c 65  ge require Eagle
c320: 2e 4c 69 62 72 61 72 79 0d 0a 20 20 20 20 20 20  .Library..      
c330: 20 20 20 20 70 61 63 6b 61 67 65 20 72 65 71 75      package requ
c340: 69 72 65 20 45 61 67 6c 65 2e 54 65 73 74 0d 0a  ire Eagle.Test..
c350: 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
c360: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
c370: 23 20 4e 4f 54 45 3a 20 43 6f 70 79 20 74 68 65  # NOTE: Copy the
c380: 20 6e 65 63 65 73 73 61 72 79 20 76 61 72 69 61   necessary varia
c390: 62 6c 65 73 20 69 6e 74 6f 20 74 68 65 20 69 73  bles into the is
c3a0: 6f 6c 61 74 65 64 20 69 6e 74 65 72 70 72 65 74  olated interpret
c3b0: 65 72 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  er...        #..
c3c0: 20 20 20 20 20 20 20 20 64 65 62 75 67 20 69 6e          debug in
c3d0: 76 6f 6b 65 20 30 20 73 65 74 20 3a 3a 74 65 73  voke 0 set ::tes
c3e0: 74 5f 63 68 61 6e 6e 65 6c 20 24 63 68 61 6e 6e  t_channel $chann
c3f0: 65 6c 3b 20 23 20 4e 4f 54 45 3a 20 46 6f 72 20  el; # NOTE: For 
c400: 5b 74 70 75 74 73 5d 2e 0d 0a 20 20 20 20 20 20  [tputs]...      
c410: 20 20 64 65 62 75 67 20 69 6e 76 6f 6b 65 20 30    debug invoke 0
c420: 20 73 65 74 20 3a 3a 74 65 73 74 5f 6c 6f 67 20   set ::test_log 
c430: 24 6c 6f 67 3b 20 23 20 4e 4f 54 45 3a 20 46 6f  $log; # NOTE: Fo
c440: 72 20 5b 74 6c 6f 67 5d 2e 0d 0a 0d 0a 20 20 20  r [tlog].....   
c450: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
c460: 23 20 4e 4f 54 45 3a 20 49 6e 73 74 61 6c 6c 20  # NOTE: Install 
c470: 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 73 63 72  the callback scr
c480: 69 70 74 20 74 6f 20 62 65 20 65 76 61 6c 75 61  ipt to be evalua
c490: 74 65 64 20 69 6e 20 74 68 65 20 69 73 6f 6c 61  ted in the isola
c4a0: 74 65 64 0d 0a 20 20 20 20 20 20 20 20 23 20 20  ted..        #  
c4b0: 20 20 20 20 20 69 6e 74 65 72 70 72 65 74 65 72       interpreter
c4c0: 20 77 68 65 6e 20 74 68 69 73 20 69 6e 74 65 72   when this inter
c4d0: 70 72 65 74 65 72 20 69 73 20 69 6e 74 65 72 72  preter is interr
c4e0: 75 70 74 65 64 20 62 79 20 73 63 72 69 70 74 0d  upted by script.
c4f0: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
c500: 20 63 61 6e 63 65 6c 6c 61 74 69 6f 6e 2c 20 65   cancellation, e
c510: 74 63 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  tc...        #..
c520: 20 20 20 20 20 20 20 20 64 65 62 75 67 20 63 61          debug ca
c530: 6c 6c 62 61 63 6b 20 61 70 70 6c 79 20 7b 7b 73  llback apply {{s
c540: 65 6e 64 65 72 20 65 7d 20 7b 0d 0a 20 20 20 20  ender e} {..    
c550: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
c560: 20 20 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b     # NOTE: Check
c570: 20 69 66 20 74 68 69 73 20 63 61 6c 6c 62 61 63   if this callbac
c580: 6b 20 69 73 20 6f 6e 65 20 74 68 61 74 20 77 65  k is one that we
c590: 20 63 61 72 65 20 61 62 6f 75 74 2e 0d 0a 20 20   care about...  
c5a0: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
c5b0: 20 20 20 20 20 69 66 20 7b 22 43 61 6e 63 65 6c       if {"Cancel
c5c0: 65 64 22 20 69 6e 20 5b 73 70 6c 69 74 20 5b 24  ed" in [split [$
c5d0: 65 20 49 6e 74 65 72 72 75 70 74 54 79 70 65 5d  e InterruptType]
c5e0: 20 22 2c 20 22 5d 7d 20 74 68 65 6e 20 7b 0d 0a   ", "]} then {..
c5f0: 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20              #.. 
c600: 20 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54             # NOT
c610: 45 3a 20 49 74 65 72 61 74 65 20 74 68 72 6f 75  E: Iterate throu
c620: 67 68 20 61 6c 6c 20 64 61 74 61 62 61 73 65 20  gh all database 
c630: 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 6b 6e 6f 77  connections know
c640: 6e 20 74 6f 20 74 68 65 0d 0a 20 20 20 20 20 20  n to the..      
c650: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 70 61        #       pa
c660: 72 65 6e 74 20 69 6e 74 65 72 70 72 65 74 65 72  rent interpreter
c670: 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23  ...            #
c680: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 6f 62  ..            ob
c690: 6a 65 63 74 20 66 6f 72 65 61 63 68 20 2d 61 6c  ject foreach -al
c6a0: 69 61 73 20 70 61 69 72 20 5c 0d 0a 20 20 20 20  ias pair \..    
c6b0: 20 20 20 20 20 20 20 20 20 20 20 20 5b 6f 62 6a              [obj
c6c0: 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67  ect invoke -flag
c6d0: 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 24 65 20  s +NonPublic $e 
c6e0: 49 6e 74 65 72 70 72 65 74 65 72 2e 63 6f 6e 6e  Interpreter.conn
c6f0: 65 63 74 69 6f 6e 73 5d 20 7b 0d 0a 20 20 20 20  ections] {..    
c700: 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
c710: 20 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54             # NOT
c720: 45 3a 20 41 74 74 65 6d 70 74 20 74 6f 20 63 61  E: Attempt to ca
c730: 6e 63 65 6c 20 61 6e 79 20 53 51 4c 20 71 75 65  ncel any SQL que
c740: 72 69 65 73 20 69 6e 20 70 72 6f 67 72 65 73 73  ries in progress
c750: 20 6f 6e 20 74 68 69 73 0d 0a 20 20 20 20 20 20   on this..      
c760: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
c770: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
c780: 69 6f 6e 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  ion...          
c790: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
c7a0: 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20       if {[catch 
c7b0: 7b 24 70 61 69 72 20 56 61 6c 75 65 2e 43 61 6e  {$pair Value.Can
c7c0: 63 65 6c 7d 20 65 72 72 6f 72 5d 20 21 3d 20 30  cel} error] != 0
c7d0: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
c7e0: 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
c7f0: 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
c800: 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 6e 20 5c  [appendArgs \n \
c810: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
c820: 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e        "==== WARN
c830: 49 4e 47 3a 20 66 61 69 6c 65 64 20 74 6f 20 63  ING: failed to c
c840: 61 6e 63 65 6c 20 71 75 65 72 79 20 66 6f 72 20  ancel query for 
c850: 63 6f 6e 6e 65 63 74 69 6f 6e 20 5c 22 22 20 5c  connection \"" \
c860: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
c870: 20 20 20 20 20 20 5b 24 70 61 69 72 20 4b 65 79        [$pair Key
c880: 5d 20 22 5c 22 2c 20 65 72 72 6f 72 3a 20 22 20  ] "\", error: " 
c890: 5c 6e 5c 74 20 24 65 72 72 6f 72 20 5c 6e 5d 0d  \n\t $error \n].
c8a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
c8b0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
c8c0: 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  .          }..  
c8d0: 20 20 20 20 20 20 7d 7d 0d 0a 20 20 20 20 20 20        }}..      
c8e0: 7d 20 65 72 72 6f 72 5d 20 3d 3d 20 30 7d 20 74  } error] == 0} t
c8f0: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 61  hen {..        a
c900: 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 69 6e 74  ddConstraint int
c910: 65 72 72 75 70 74 43 61 6c 6c 62 61 63 6b 2e 73  erruptCallback.s
c920: 71 6c 69 74 65 33 0d 0a 0d 0a 20 20 20 20 20 20  qlite3....      
c930: 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
c940: 20 79 65 73 5c 6e 0d 0a 20 20 20 20 20 20 7d 20   yes\n..      } 
c950: 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
c960: 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b  tputs $channel [
c970: 61 70 70 65 6e 64 41 72 67 73 20 22 6e 6f 2c 20  appendArgs "no, 
c980: 65 72 72 6f 72 3a 20 22 20 5c 6e 5c 74 20 24 65  error: " \n\t $e
c990: 72 72 6f 72 20 5c 6e 5d 0d 0a 20 20 20 20 20 20  rror \n]..      
c9a0: 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  }..    }.....   
c9b0: 20 70 72 6f 63 20 63 6c 65 61 6e 75 70 46 69 6c   proc cleanupFil
c9c0: 65 20 7b 20 66 69 6c 65 4e 61 6d 65 20 7b 63 6f  e { fileName {co
c9d0: 6c 6c 65 63 74 20 74 72 75 65 7d 20 7b 66 6f 72  llect true} {for
c9e0: 63 65 20 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a 20  ce false} } {.. 
c9f0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
ca00: 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74 20 74 6f  NOTE: Attempt to
ca10: 20 66 6f 72 63 65 20 61 6c 6c 20 70 65 6e 64 69   force all pendi
ca20: 6e 67 20 22 67 61 72 62 61 67 65 22 20 6f 62 6a  ng "garbage" obj
ca30: 65 63 74 73 20 74 6f 20 62 65 20 63 6f 6c 6c 65  ects to be colle
ca40: 63 74 65 64 2c 0d 0a 20 20 20 20 20 20 23 20 20  cted,..      #  
ca50: 20 20 20 20 20 69 6e 63 6c 75 64 69 6e 67 20 53       including S
ca60: 51 4c 69 74 65 20 73 74 61 74 65 6d 65 6e 74 73  QLite statements
ca70: 20 61 6e 64 20 62 61 63 6b 75 70 20 6f 62 6a 65   and backup obje
ca80: 63 74 73 3b 20 74 68 69 73 20 73 68 6f 75 6c 64  cts; this should
ca90: 20 61 6c 6c 6f 77 0d 0a 20 20 20 20 20 20 23 20   allow..      # 
caa0: 20 20 20 20 20 20 74 68 65 20 75 6e 64 65 72 6c        the underl
cab0: 79 69 6e 67 20 64 61 74 61 62 61 73 65 20 66 69  ying database fi
cac0: 6c 65 20 74 6f 20 62 65 20 64 65 6c 65 74 65 64  le to be deleted
cad0: 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
cae0: 20 20 69 66 20 7b 24 63 6f 6c 6c 65 63 74 7d 20    if {$collect} 
caf0: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
cb00: 63 6f 6c 6c 65 63 74 47 61 72 62 61 67 65 20 24  collectGarbage $
cb10: 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 0d 0a  ::test_channel..
cb20: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
cb30: 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
cb40: 3a 20 43 68 65 63 6b 20 69 66 20 74 68 65 20 66  : Check if the f
cb50: 69 6c 65 20 73 74 69 6c 6c 20 65 78 69 73 74 73  ile still exists
cb60: 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
cb70: 20 20 69 66 20 7b 5b 66 69 6c 65 20 65 78 69 73    if {[file exis
cb80: 74 73 20 24 66 69 6c 65 4e 61 6d 65 5d 7d 20 74  ts $fileName]} t
cb90: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  hen {..        #
cba0: 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
cbb0: 3a 20 53 6b 69 70 20 64 65 6c 65 74 69 6e 67 20  : Skip deleting 
cbc0: 74 65 73 74 20 66 69 6c 65 73 20 69 66 20 73 6f  test files if so
cbd0: 6d 65 62 6f 64 79 20 73 65 74 73 20 74 68 65 20  mebody sets the 
cbe0: 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 0d  global variable.
cbf0: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
cc00: 20 74 6f 20 70 72 65 76 65 6e 74 20 69 74 2e 0d   to prevent it..
cc10: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
cc20: 20 20 20 20 69 66 20 7b 24 66 6f 72 63 65 20 7c      if {$force |
cc30: 7c 20 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20  | ![info exists 
cc40: 3a 3a 6e 6f 28 63 6c 65 61 6e 75 70 46 69 6c 65  ::no(cleanupFile
cc50: 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  )]} then {..    
cc60: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
cc70: 20 20 20 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d     # NOTE: Attem
cc80: 70 74 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65  pt to delete the
cc90: 20 74 65 73 74 20 66 69 6c 65 20 6e 6f 77 2e 0d   test file now..
cca0: 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
ccb0: 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73 65 74          if {[set
ccc0: 20 63 6f 64 65 20 5b 63 61 74 63 68 20 7b 66 69   code [catch {fi
ccd0: 6c 65 20 64 65 6c 65 74 65 20 24 66 69 6c 65 4e  le delete $fileN
cce0: 61 6d 65 7d 20 65 72 72 6f 72 5d 5d 7d 20 74 68  ame} error]]} th
ccf0: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
cd00: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20    #..           
cd10: 20 23 20 4e 4f 54 45 3a 20 57 65 20 73 6f 6d 65   # NOTE: We some
cd20: 68 6f 77 20 66 61 69 6c 65 64 20 74 6f 20 64 65  how failed to de
cd30: 6c 65 74 65 20 74 68 65 20 66 69 6c 65 2c 20 72  lete the file, r
cd40: 65 70 6f 72 74 20 77 68 79 2e 0d 0a 20 20 20 20  eport why...    
cd50: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
cd60: 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
cd70: 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70  test_channel [ap
cd80: 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
cd90: 20 20 20 20 20 20 20 20 20 20 20 20 22 3d 3d 3d              "===
cda0: 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65  = WARNING: faile
cdb0: 64 20 74 6f 20 64 65 6c 65 74 65 20 74 65 73 74  d to delete test
cdc0: 20 66 69 6c 65 20 5c 22 22 20 24 66 69 6c 65 4e   file \"" $fileN
cdd0: 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ame \..         
cde0: 20 20 20 20 20 20 20 22 5c 22 20 64 75 72 69 6e         "\" durin
cdf0: 67 20 63 6c 65 61 6e 75 70 2c 20 65 72 72 6f 72  g cleanup, error
ce00: 3a 20 22 20 5c 6e 5c 74 20 24 65 72 72 6f 72 20  : " \n\t $error 
ce10: 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  \n]..          }
ce20: 0d 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65  ..        } else
ce30: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d   {..          #.
ce40: 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54  .          # NOT
ce50: 45 3a 20 53 68 6f 77 20 74 68 61 74 20 77 65 20  E: Show that we 
ce60: 73 6b 69 70 70 65 64 20 64 65 6c 65 74 69 6e 67  skipped deleting
ce70: 20 74 68 65 20 66 69 6c 65 2e 0d 0a 20 20 20 20   the file...    
ce80: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
ce90: 20 20 20 73 65 74 20 63 6f 64 65 20 30 0d 0a 0d     set code 0...
cea0: 0a 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73  .          tputs
ceb0: 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
cec0: 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
ced0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 3d                "=
cee0: 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 73 6b 69  === WARNING: ski
cef0: 70 70 65 64 20 64 65 6c 65 74 69 6e 67 20 74 65  pped deleting te
cf00: 73 74 20 66 69 6c 65 20 5c 22 22 20 24 66 69 6c  st file \"" $fil
cf10: 65 4e 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20 20  eName \..       
cf20: 20 20 20 20 20 20 20 22 5c 22 20 64 75 72 69 6e         "\" durin
cf30: 67 20 63 6c 65 61 6e 75 70 5c 6e 22 5d 0d 0a 20  g cleanup\n"].. 
cf40: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
cf50: 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
cf60: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
cf70: 4f 54 45 3a 20 54 68 65 20 66 69 6c 65 20 64 6f  OTE: The file do
cf80: 65 73 20 6e 6f 74 20 65 78 69 73 74 2c 20 73 75  es not exist, su
cf90: 63 63 65 73 73 21 0d 0a 20 20 20 20 20 20 20 20  ccess!..        
cfa0: 23 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 63  #..        set c
cfb0: 6f 64 65 20 30 0d 0a 20 20 20 20 20 20 7d 0d 0a  ode 0..      }..
cfc0: 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 24  ..      return $
cfd0: 63 6f 64 65 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a  code..    }.....
cfe0: 20 20 20 20 70 72 6f 63 20 63 6f 6c 6c 65 63 74      proc collect
cff0: 47 61 72 62 61 67 65 20 7b 20 63 68 61 6e 6e 65  Garbage { channe
d000: 6c 20 7b 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20  l {milliseconds 
d010: 31 30 30 30 7d 20 7b 71 75 69 65 74 20 74 72 75  1000} {quiet tru
d020: 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 69 66  e} } {..      if
d030: 20 7b 5b 63 61 74 63 68 20 7b 6f 62 6a 65 63 74   {[catch {object
d040: 20 69 6e 76 6f 6b 65 20 47 43 20 47 65 74 54 6f   invoke GC GetTo
d050: 74 61 6c 4d 65 6d 6f 72 79 20 66 61 6c 73 65 7d  talMemory false}
d060: 20 72 65 73 75 6c 74 5d 20 3d 3d 20 30 7d 20 74   result] == 0} t
d070: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 69  hen {..        i
d080: 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e  f {!$quiet} then
d090: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70   {..          tp
d0a0: 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70  uts $channel [ap
d0b0: 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
d0c0: 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
d0d0: 6d 65 6d 6f 72 79 20 69 6e 20 75 73 65 20 62 79  memory in use by
d0e0: 20 74 68 65 20 43 4c 52 20 62 65 66 6f 72 65 20   the CLR before 
d0f0: 63 6f 6c 6c 65 63 74 69 6f 6e 2e 2e 2e 20 22 20  collection... " 
d100: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
d110: 20 24 72 65 73 75 6c 74 20 22 20 62 79 74 65 73   $result " bytes
d120: 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d  \n"]..        }.
d130: 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d  .      } else {.
d140: 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24  .        tputs $
d150: 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
d160: 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
d170: 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47     "==== WARNING
d180: 3a 20 66 61 69 6c 65 64 20 74 6f 20 67 65 74 20  : failed to get 
d190: 43 4c 52 20 6d 65 6d 6f 72 79 20 75 73 61 67 65  CLR memory usage
d1a0: 2c 20 65 72 72 6f 72 3a 20 22 20 5c 0d 0a 20 20  , error: " \..  
d1b0: 20 20 20 20 20 20 20 20 20 20 5c 6e 5c 74 20 24            \n\t $
d1c0: 72 65 73 75 6c 74 20 5c 6e 5d 0d 0a 20 20 20 20  result \n]..    
d1d0: 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 23 23    }....      ###
d1e0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
d1f0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
d200: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
d210: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
d220: 23 23 23 23 23 23 0d 0a 0d 0a 20 20 20 20 20 20  ######....      
d230: 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
d240: 20 52 65 70 65 61 74 65 64 6c 79 20 61 74 74 65   Repeatedly atte
d250: 6d 70 74 20 74 6f 20 63 6f 6c 6c 65 63 74 20 67  mpt to collect g
d260: 61 72 62 61 67 65 20 75 6e 74 69 6c 20 74 68 65  arbage until the
d270: 20 61 6c 6c 6f 74 74 65 64 20 6e 75 6d 62 65 72   allotted number
d280: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
d290: 6f 66 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20  of milliseconds 
d2a0: 68 61 73 20 65 6c 61 70 73 65 64 2e 20 20 41 6c  has elapsed.  Al
d2b0: 77 61 79 73 20 61 74 74 65 6d 70 74 20 74 6f 20  ways attempt to 
d2c0: 63 6f 6c 6c 65 63 74 20 67 61 72 62 61 67 65 0d  collect garbage.
d2d0: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 61  .      #       a
d2e0: 74 20 6c 65 61 73 74 20 6f 6e 63 65 2e 0d 0a 20  t least once... 
d2f0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 73 65       #..      se
d300: 74 20 73 74 61 72 74 20 5b 63 6c 6f 63 6b 20 73  t start [clock s
d310: 65 63 6f 6e 64 73 5d 0d 0a 20 20 20 20 20 20 73  econds]..      s
d320: 65 74 20 73 74 6f 70 20 5b 65 78 70 72 20 7b 24  et stop [expr {$
d330: 73 74 61 72 74 20 2b 20 28 24 6d 69 6c 6c 69 73  start + ($millis
d340: 65 63 6f 6e 64 73 20 2f 20 31 30 30 30 29 7d 5d  econds / 1000)}]
d350: 0d 0a 0d 0a 20 20 20 20 20 20 64 6f 20 7b 0d 0a  ....      do {..
d360: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
d370: 20 20 20 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d     # NOTE: Attem
d380: 70 74 20 74 6f 20 66 6f 72 63 65 20 61 20 66 75  pt to force a fu
d390: 6c 6c 20 67 61 72 62 61 67 65 20 63 6f 6c 6c 65  ll garbage colle
d3a0: 63 74 69 6f 6e 20 6e 6f 77 2e 20 20 52 65 70 6f  ction now.  Repo
d3b0: 72 74 20 61 6e 79 0d 0a 20 20 20 20 20 20 20 20  rt any..        
d3c0: 23 20 20 20 20 20 20 20 65 72 72 6f 72 20 74 68  #       error th
d3d0: 61 74 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65  at is encountere
d3e0: 64 20 69 66 20 77 65 20 66 61 69 6c 2e 0d 0a 20  d if we fail... 
d3f0: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
d400: 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 6f 62    if {[catch {ob
d410: 6a 65 63 74 20 69 6e 76 6f 6b 65 20 47 43 20 47  ject invoke GC G
d420: 65 74 54 6f 74 61 6c 4d 65 6d 6f 72 79 20 74 72  etTotalMemory tr
d430: 75 65 7d 20 65 72 72 6f 72 5d 7d 20 74 68 65 6e  ue} error]} then
d440: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70   {..          tp
d450: 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70  uts $channel [ap
d460: 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
d470: 20 20 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20            "==== 
d480: 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20  WARNING: failed 
d490: 66 75 6c 6c 20 67 61 72 62 61 67 65 20 63 6f 6c  full garbage col
d4a0: 6c 65 63 74 69 6f 6e 2c 20 65 72 72 6f 72 3a 20  lection, error: 
d4b0: 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  " \..           
d4c0: 20 20 20 5c 6e 5c 74 20 24 65 72 72 6f 72 20 5c     \n\t $error \
d4d0: 6e 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d  n]..        }...
d4e0: 0a 20 20 20 20 20 20 20 20 73 65 74 20 6e 6f 77  .        set now
d4f0: 20 5b 63 6c 6f 63 6b 20 73 65 63 6f 6e 64 73 5d   [clock seconds]
d500: 0d 0a 20 20 20 20 20 20 7d 20 77 68 69 6c 65 20  ..      } while 
d510: 7b 24 73 74 61 72 74 20 3c 3d 20 24 6e 6f 77 20  {$start <= $now 
d520: 26 26 20 24 6e 6f 77 20 3c 20 24 73 74 6f 70 7d  && $now < $stop}
d530: 0d 0a 0d 0a 20 20 20 20 20 20 23 23 23 23 23 23  ....      ######
d540: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
d550: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
d560: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
d570: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
d580: 23 23 23 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20  ###....      if 
d590: 7b 5b 63 61 74 63 68 20 7b 6f 62 6a 65 63 74 20  {[catch {object 
d5a0: 69 6e 76 6f 6b 65 20 47 43 20 47 65 74 54 6f 74  invoke GC GetTot
d5b0: 61 6c 4d 65 6d 6f 72 79 20 66 61 6c 73 65 7d 20  alMemory false} 
d5c0: 72 65 73 75 6c 74 5d 20 3d 3d 20 30 7d 20 74 68  result] == 0} th
d5d0: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66  en {..        if
d5e0: 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20   {!$quiet} then 
d5f0: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70 75  {..          tpu
d600: 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70  ts $channel [app
d610: 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
d620: 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 6d           "---- m
d630: 65 6d 6f 72 79 20 69 6e 20 75 73 65 20 62 79 20  emory in use by 
d640: 74 68 65 20 43 4c 52 20 61 66 74 65 72 20 63 6f  the CLR after co
d650: 6c 6c 65 63 74 69 6f 6e 2e 2e 2e 20 22 20 5c 0d  llection... " \.
d660: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 24  .              $
d670: 72 65 73 75 6c 74 20 22 20 62 79 74 65 73 5c 6e  result " bytes\n
d680: 22 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20  "]..        }.. 
d690: 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
d6a0: 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
d6b0: 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
d6c0: 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
d6d0: 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20   "==== WARNING: 
d6e0: 66 61 69 6c 65 64 20 74 6f 20 67 65 74 20 43 4c  failed to get CL
d6f0: 52 20 6d 65 6d 6f 72 79 20 75 73 61 67 65 2c 20  R memory usage, 
d700: 65 72 72 6f 72 3a 20 22 20 5c 0d 0a 20 20 20 20  error: " \..    
d710: 20 20 20 20 20 20 20 20 5c 6e 5c 74 20 24 72 65          \n\t $re
d720: 73 75 6c 74 20 5c 6e 5d 0d 0a 20 20 20 20 20 20  sult \n]..      
d730: 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  }..    }.....   
d740: 20 70 72 6f 63 20 67 65 74 53 51 4c 69 74 65 48   proc getSQLiteH
d750: 61 6e 64 6c 65 43 6f 75 6e 74 73 20 7b 20 63 68  andleCounts { ch
d760: 61 6e 6e 65 6c 20 7b 71 75 69 65 74 20 66 61 6c  annel {quiet fal
d770: 73 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 73  se} } {..      s
d780: 65 74 20 72 65 73 75 6c 74 20 5b 6c 69 73 74 5d  et result [list]
d790: 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 68  ....      if {[h
d7a0: 61 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 5c 0d  aveConstraint \.
d7b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64  .              d
d7c0: 65 66 69 6e 65 43 6f 6e 73 74 61 6e 74 2e 53 79  efineConstant.Sy
d7d0: 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
d7e0: 2e 43 4f 55 4e 54 5f 48 41 4e 44 4c 45 5d 7d 20  .COUNT_HANDLE]} 
d7f0: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
d800: 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
d810: 45 3a 20 41 64 64 20 65 61 63 68 20 63 72 69 74  E: Add each crit
d820: 69 63 61 6c 20 68 61 6e 64 6c 65 20 63 6f 75 6e  ical handle coun
d830: 74 20 74 6f 20 74 68 65 20 72 65 73 75 6c 74 69  t to the resulti
d840: 6e 67 20 6c 69 73 74 2e 0d 0a 20 20 20 20 20 20  ng list...      
d850: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 66 6f 72    #..        for
d860: 65 61 63 68 20 6e 61 6d 65 20 5b 6c 69 73 74 20  each name [list 
d870: 63 6f 6e 6e 65 63 74 69 6f 6e 43 6f 75 6e 74 20  connectionCount 
d880: 73 74 61 74 65 6d 65 6e 74 43 6f 75 6e 74 20 62  statementCount b
d890: 61 63 6b 75 70 43 6f 75 6e 74 5d 20 7b 0d 0a 20  ackupCount] {.. 
d8a0: 20 20 20 20 20 20 20 20 20 73 65 74 20 76 61 6c           set val
d8b0: 75 65 20 5b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b  ue [object invok
d8c0: 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62  e -flags +NonPub
d8d0: 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  lic \..         
d8e0: 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61       System.Data
d8f0: 2e 53 51 4c 69 74 65 2e 55 6e 73 61 66 65 4e 61  .SQLite.UnsafeNa
d900: 74 69 76 65 4d 65 74 68 6f 64 73 20 24 6e 61 6d  tiveMethods $nam
d910: 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  e]....          
d920: 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65  if {!$quiet} the
d930: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
d940: 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
d950: 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
d960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
d970: 2d 2d 2d 2d 20 63 72 69 74 69 63 61 6c 20 68 61  ---- critical ha
d980: 6e 64 6c 65 20 63 6f 75 6e 74 20 5c 22 22 20 24  ndle count \"" $
d990: 6e 61 6d 65 20 22 5c 22 20 69 73 20 22 20 24 76  name "\" is " $v
d9a0: 61 6c 75 65 20 5c 6e 5d 0d 0a 20 20 20 20 20 20  alue \n]..      
d9b0: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
d9c0: 20 20 20 6c 61 70 70 65 6e 64 20 72 65 73 75 6c     lappend resul
d9d0: 74 20 24 76 61 6c 75 65 0d 0a 20 20 20 20 20 20  t $value..      
d9e0: 20 20 7d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73    }..      } els
d9f0: 65 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68  eif {!$quiet} th
da00: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d  en {..        #.
da10: 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
da20: 20 54 68 65 20 61 63 74 75 61 6c 20 68 61 6e 64   The actual hand
da30: 6c 65 20 63 6f 75 6e 74 73 20 61 72 65 20 6e 6f  le counts are no
da40: 74 20 61 76 61 69 6c 61 62 6c 65 3b 20 74 68 65  t available; the
da50: 72 65 66 6f 72 65 2c 20 6a 75 73 74 0d 0a 20 20  refore, just..  
da60: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 72 65        #       re
da70: 74 75 72 6e 20 61 6e 20 65 6d 70 74 79 20 6c 69  turn an empty li
da80: 73 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  st...        #..
da90: 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
daa0: 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 63 72 69  hannel "---- cri
dab0: 74 69 63 61 6c 20 68 61 6e 64 6c 65 20 63 6f 75  tical handle cou
dac0: 6e 74 73 20 75 6e 61 76 61 69 6c 61 62 6c 65 5c  nts unavailable\
dad0: 6e 22 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  n"..      }.... 
dae0: 20 20 20 20 20 72 65 74 75 72 6e 20 24 72 65 73       return $res
daf0: 75 6c 74 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20  ult..    }..... 
db00: 20 20 20 70 72 6f 63 20 73 68 75 74 64 6f 77 6e     proc shutdown
db10: 53 51 4c 69 74 65 20 7b 20 63 68 61 6e 6e 65 6c  SQLite { channel
db20: 20 7b 66 6f 72 63 65 20 66 61 6c 73 65 7d 20 7b   {force false} {
db30: 71 75 69 65 74 20 66 61 6c 73 65 7d 20 7d 20 7b  quiet false} } {
db40: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
db50: 20 23 20 4e 4f 54 45 3a 20 4d 61 6b 65 20 73 75   # NOTE: Make su
db60: 72 65 20 74 68 61 74 20 53 51 4c 69 74 65 20 63  re that SQLite c
db70: 6f 72 65 20 6c 69 62 72 61 72 79 20 69 73 20 63  ore library is c
db80: 6f 6d 70 6c 65 74 65 6c 79 20 73 68 75 74 64 6f  ompletely shutdo
db90: 77 6e 2e 20 20 54 68 69 73 0d 0a 20 20 20 20 20  wn.  This..     
dba0: 20 23 20 20 20 20 20 20 20 69 73 20 75 73 65 64   #       is used
dbb0: 20 62 79 20 74 65 73 74 73 20 74 68 61 74 20 63   by tests that c
dbc0: 68 61 6e 67 65 20 63 6f 6e 66 69 67 75 72 61 74  hange configurat
dbd0: 69 6f 6e 20 6f 70 74 69 6f 6e 73 20 61 6e 64 2f  ion options and/
dbe0: 6f 72 20 74 68 6f 73 65 0d 0a 20 20 20 20 20 20  or those..      
dbf0: 23 20 20 20 20 20 20 20 74 68 61 74 20 6e 65 65  #       that nee
dc00: 64 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 6c  d to make sure l
dc10: 6f 67 67 69 6e 67 20 69 73 20 69 6e 69 74 69 61  ogging is initia
dc20: 6c 69 7a 65 64 20 28 69 2e 65 2e 20 6a 75 73 74  lized (i.e. just
dc30: 20 69 6e 20 63 61 73 65 0d 0a 20 20 20 20 20 20   in case..      
dc40: 23 20 20 20 20 20 20 20 74 68 65 20 53 51 4c 69  #       the SQLi
dc50: 74 65 20 63 6f 72 65 20 6c 69 62 72 61 72 79 20  te core library 
dc60: 77 61 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20  was initialized 
dc70: 69 6e 20 74 68 65 20 70 72 6f 63 65 73 73 20 70  in the process p
dc80: 72 69 6f 72 20 74 6f 0d 0a 20 20 20 20 20 20 23  rior to..      #
dc90: 20 20 20 20 20 20 20 74 68 65 20 53 51 4c 69 74         the SQLit
dca0: 65 4c 6f 67 20 63 6c 61 73 73 20 62 65 69 6e 67  eLog class being
dcb0: 20 61 62 6c 65 20 74 6f 20 73 65 74 75 70 20 69   able to setup i
dcc0: 74 73 20 6c 6f 67 67 69 6e 67 20 63 61 6c 6c 62  ts logging callb
dcd0: 61 63 6b 29 2e 0d 0a 20 20 20 20 20 20 23 20 20  ack)...      #  
dce0: 20 20 20 20 20 4e 6f 72 6d 61 6c 6c 79 2c 20 74       Normally, t
dcf0: 68 69 73 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20  his should only 
dd00: 62 65 20 70 65 72 66 6f 72 6d 65 64 20 69 66 20  be performed if 
dd10: 53 51 4c 69 74 65 20 69 73 20 6c 6f 61 64 65 64  SQLite is loaded
dd20: 20 61 6e 64 0d 0a 20 20 20 20 20 20 23 20 20 20   and..      #   
dd30: 20 20 20 20 72 65 61 64 79 20 66 6f 72 20 75 73      ready for us
dd40: 65 20 62 79 20 74 68 65 20 74 65 73 74 20 73 75  e by the test su
dd50: 69 74 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ite...      #.. 
dd60: 20 20 20 20 20 69 66 20 7b 24 66 6f 72 63 65 20       if {$force 
dd70: 7c 7c 20 5b 69 73 53 51 4c 69 74 65 52 65 61 64  || [isSQLiteRead
dd80: 79 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  y]} then {..    
dd90: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
dda0: 20 42 55 47 46 49 58 3a 20 42 65 66 6f 72 65 20   BUGFIX: Before 
ddb0: 63 61 6c 6c 69 6e 67 20 74 68 65 20 6e 61 74 69  calling the nati
ddc0: 76 65 20 73 68 75 74 64 6f 77 6e 20 66 75 6e 63  ve shutdown func
ddd0: 74 69 6f 6e 2c 20 6d 61 6b 65 20 73 75 72 65 20  tion, make sure 
dde0: 62 6f 74 68 0d 0a 20 20 20 20 20 20 20 20 23 20  both..        # 
ddf0: 20 20 20 20 20 20 20 20 6f 66 20 74 68 65 20 50          of the P
de00: 52 41 47 4d 41 20 72 65 6c 61 74 65 64 20 64 69  RAGMA related di
de10: 72 65 63 74 6f 72 79 20 6e 61 6d 65 73 20 61 72  rectory names ar
de20: 65 20 66 72 65 65 64 2e 0d 0a 20 20 20 20 20 20  e freed...      
de30: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 63 68 65    #..        che
de40: 63 6b 46 6f 72 53 51 4c 69 74 65 44 69 72 65 63  ckForSQLiteDirec
de50: 74 6f 72 69 65 73 20 24 63 68 61 6e 6e 65 6c 20  tories $channel 
de60: 74 72 75 65 0d 0a 0d 0a 20 20 20 20 20 20 20 20  true....        
de70: 69 66 20 7b 5b 63 61 74 63 68 20 7b 6f 62 6a 65  if {[catch {obje
de80: 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73  ct invoke -flags
de90: 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20   +NonPublic \.. 
dea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
deb0: 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
dec0: 65 2e 55 6e 73 61 66 65 4e 61 74 69 76 65 4d 65  e.UnsafeNativeMe
ded0: 74 68 6f 64 73 20 5c 0d 0a 20 20 20 20 20 20 20  thods \..       
dee0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
def0: 5f 73 68 75 74 64 6f 77 6e 7d 20 72 65 73 75 6c  _shutdown} resul
df00: 74 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d  t] == 0} then {.
df10: 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21  .          if {!
df20: 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a  $quiet} then {..
df30: 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
df40: 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  s $channel [appe
df50: 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
df60: 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
df70: 63 61 6c 6c 20 73 71 6c 69 74 65 33 5f 73 68 75  call sqlite3_shu
df80: 74 64 6f 77 6e 28 29 2e 2e 2e 20 6f 6b 3a 20 22  tdown()... ok: "
df90: 20 24 72 65 73 75 6c 74 20 5c 6e 5d 0d 0a 20 20   $result \n]..  
dfa0: 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
dfb0: 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
dfc0: 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69         if {!$qui
dfd0: 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  et} then {..    
dfe0: 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
dff0: 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
e000: 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
e010: 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 61 6c 6c        "---- call
e020: 20 73 71 6c 69 74 65 33 5f 73 68 75 74 64 6f 77   sqlite3_shutdow
e030: 6e 28 29 2e 2e 2e 20 65 72 72 6f 72 3a 20 22 20  n()... error: " 
e040: 5c 6e 5c 74 20 24 72 65 73 75 6c 74 20 5c 6e 5d  \n\t $result \n]
e050: 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20  ..          }.. 
e060: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
e070: 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  }..    }.....   
e080: 20 70 72 6f 63 20 72 65 70 6f 72 74 53 51 4c 69   proc reportSQLi
e090: 74 65 52 65 73 6f 75 72 63 65 73 20 7b 20 63 68  teResources { ch
e0a0: 61 6e 6e 65 6c 20 7b 71 75 69 65 74 20 66 61 6c  annel {quiet fal
e0b0: 73 65 7d 20 7b 63 6f 6c 6c 65 63 74 20 74 72 75  se} {collect tru
e0c0: 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d  e} } {..      #.
e0d0: 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53  .      # NOTE: S
e0e0: 6b 69 70 20 61 6c 6c 20 6f 75 74 70 75 74 20 69  kip all output i
e0f0: 66 20 77 65 20 61 72 65 20 72 75 6e 6e 69 6e 67  f we are running
e100: 20 69 6e 20 22 71 75 69 65 74 22 20 6d 6f 64 65   in "quiet" mode
e110: 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
e120: 20 20 69 66 20 7b 5b 68 61 76 65 43 6f 6e 73 74    if {[haveConst
e130: 72 61 69 6e 74 20 5c 0d 0a 20 20 20 20 20 20 20  raint \..       
e140: 20 20 20 20 20 20 20 64 65 66 69 6e 65 43 6f 6e         defineCon
e150: 73 74 61 6e 74 2e 53 79 73 74 65 6d 2e 44 61 74  stant.System.Dat
e160: 61 2e 53 51 4c 69 74 65 2e 49 4e 54 45 52 4f 50  a.SQLite.INTEROP
e170: 5f 56 49 52 54 55 41 4c 5f 54 41 42 4c 45 5d 20  _VIRTUAL_TABLE] 
e180: 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  && \..          
e190: 5b 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74 20  [haveConstraint 
e1a0: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
e1b0: 20 64 65 66 69 6e 65 43 6f 6e 73 74 61 6e 74 2e   defineConstant.
e1c0: 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
e1d0: 74 65 2e 54 52 41 43 4b 5f 4d 45 4d 4f 52 59 5f  te.TRACK_MEMORY_
e1e0: 42 59 54 45 53 5d 7d 20 74 68 65 6e 20 7b 0d 0a  BYTES]} then {..
e1f0: 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75          if {!$qu
e200: 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  iet} then {..   
e210: 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
e220: 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 63 75 72 72  annel "---- curr
e230: 65 6e 74 20 6d 65 6d 6f 72 79 20 69 6e 20 75 73  ent memory in us
e240: 65 20 62 79 20 53 51 4c 69 74 65 4d 65 6d 6f 72  e by SQLiteMemor
e250: 79 2e 2e 2e 20 22 0d 0a 20 20 20 20 20 20 20 20  y... "..        
e260: 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20  }....        if 
e270: 7b 5b 63 61 74 63 68 20 7b 6f 62 6a 65 63 74 20  {[catch {object 
e280: 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e  invoke -flags +N
e290: 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20  onPublic \..    
e2a0: 20 20 20 20 20 20 20 20 20 20 20 20 53 79 73 74              Syst
e2b0: 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 53  em.Data.SQLite.S
e2c0: 51 4c 69 74 65 4d 65 6d 6f 72 79 20 5c 0d 0a 20  QLiteMemory \.. 
e2d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62                 b
e2e0: 79 74 65 73 41 6c 6c 6f 63 61 74 65 64 7d 20 6d  ytesAllocated} m
e2f0: 65 6d 6f 72 79 5d 20 3d 3d 20 30 7d 20 74 68 65  emory] == 0} the
e300: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69  n {..          i
e310: 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e  f {!$quiet} then
e320: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
e330: 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b  tputs $channel [
e340: 61 70 70 65 6e 64 41 72 67 73 20 24 6d 65 6d 6f  appendArgs $memo
e350: 72 79 20 22 20 62 79 74 65 73 5c 6e 22 5d 0d 0a  ry " bytes\n"]..
e360: 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
e370: 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
e380: 20 20 20 20 20 20 20 20 20 73 65 74 20 6d 65 6d           set mem
e390: 6f 72 79 20 75 6e 6b 6e 6f 77 6e 0d 0a 0d 0a 20  ory unknown.... 
e3a0: 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71           if {!$q
e3b0: 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  uiet} then {..  
e3c0: 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
e3d0: 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  $channel [append
e3e0: 41 72 67 73 20 24 6d 65 6d 6f 72 79 20 5c 6e 5d  Args $memory \n]
e3f0: 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20  ..          }.. 
e400: 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
e410: 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d      if {!$quiet}
e420: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
e430: 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
e440: 6c 20 22 2d 2d 2d 2d 20 6d 61 78 69 6d 75 6d 20  l "---- maximum 
e450: 6d 65 6d 6f 72 79 20 69 6e 20 75 73 65 20 62 79  memory in use by
e460: 20 53 51 4c 69 74 65 4d 65 6d 6f 72 79 2e 2e 2e   SQLiteMemory...
e470: 20 22 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d   "..        }...
e480: 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61  .        if {[ca
e490: 74 63 68 20 7b 6f 62 6a 65 63 74 20 69 6e 76 6f  tch {object invo
e4a0: 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75  ke -flags +NonPu
e4b0: 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20 20 20  blic \..        
e4c0: 20 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44          System.D
e4d0: 61 74 61 2e 53 51 4c 69 74 65 2e 53 51 4c 69 74  ata.SQLite.SQLit
e4e0: 65 4d 65 6d 6f 72 79 20 5c 0d 0a 20 20 20 20 20  eMemory \..     
e4f0: 20 20 20 20 20 20 20 20 20 20 20 6d 61 78 69 6d             maxim
e500: 75 6d 42 79 74 65 73 41 6c 6c 6f 63 61 74 65 64  umBytesAllocated
e510: 7d 20 6d 65 6d 6f 72 79 5d 20 3d 3d 20 30 7d 20  } memory] == 0} 
e520: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
e530: 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74    if {!$quiet} t
e540: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
e550: 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
e560: 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 24 6d  l [appendArgs $m
e570: 65 6d 6f 72 79 20 22 20 62 79 74 65 73 5c 6e 22  emory " bytes\n"
e580: 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  ]..          }..
e590: 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b          } else {
e5a0: 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20  ..          set 
e5b0: 6d 65 6d 6f 72 79 20 75 6e 6b 6e 6f 77 6e 0d 0a  memory unknown..
e5c0: 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b  ..          if {
e5d0: 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d  !$quiet} then {.
e5e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75  .            tpu
e5f0: 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70  ts $channel [app
e600: 65 6e 64 41 72 67 73 20 24 6d 65 6d 6f 72 79 20  endArgs $memory 
e610: 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  \n]..          }
e620: 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20  ..        }..   
e630: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 69 66     }....      if
e640: 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20   {!$quiet} then 
e650: 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73  {..        tputs
e660: 20 24 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20   $channel "---- 
e670: 63 75 72 72 65 6e 74 20 6d 65 6d 6f 72 79 20 69  current memory i
e680: 6e 20 75 73 65 20 62 79 20 53 51 4c 69 74 65 2e  n use by SQLite.
e690: 2e 2e 20 22 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d  .. "..      }...
e6a0: 0a 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63  .      if {[catc
e6b0: 68 20 7b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65  h {object invoke
e6c0: 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c   -flags +NonPubl
e6d0: 69 63 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  ic \..          
e6e0: 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e      System.Data.
e6f0: 53 51 4c 69 74 65 2e 55 6e 73 61 66 65 4e 61 74  SQLite.UnsafeNat
e700: 69 76 65 4d 65 74 68 6f 64 73 20 5c 0d 0a 20 20  iveMethods \..  
e710: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
e720: 74 65 33 5f 6d 65 6d 6f 72 79 5f 75 73 65 64 7d  te3_memory_used}
e730: 20 6d 65 6d 6f 72 79 5d 20 3d 3d 20 30 7d 20 74   memory] == 0} t
e740: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 69  hen {..        i
e750: 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e  f {!$quiet} then
e760: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70   {..          tp
e770: 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70  uts $channel [ap
e780: 70 65 6e 64 41 72 67 73 20 24 6d 65 6d 6f 72 79  pendArgs $memory
e790: 20 22 20 62 79 74 65 73 5c 6e 22 5d 0d 0a 20 20   " bytes\n"]..  
e7a0: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d        }..      }
e7b0: 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
e7c0: 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
e7d0: 54 45 3a 20 4d 61 79 62 65 20 74 68 65 20 53 51  TE: Maybe the SQ
e7e0: 4c 69 74 65 20 63 6f 72 65 20 6c 69 62 72 61 72  Lite core librar
e7f0: 79 20 69 73 20 75 6e 61 76 61 69 6c 61 62 6c 65  y is unavailable
e800: 3f 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ?..        #..  
e810: 20 20 20 20 20 20 73 65 74 20 6d 65 6d 6f 72 79        set memory
e820: 20 75 6e 6b 6e 6f 77 6e 0d 0a 0d 0a 20 20 20 20   unknown....    
e830: 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d      if {!$quiet}
e840: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
e850: 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
e860: 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 24 6d  l [appendArgs $m
e870: 65 6d 6f 72 79 20 5c 6e 5d 0d 0a 20 20 20 20 20  emory \n]..     
e880: 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d     }..      }...
e890: 0a 20 20 20 20 20 20 73 65 74 20 72 65 73 75 6c  .      set resul
e8a0: 74 20 24 6d 65 6d 6f 72 79 3b 20 23 20 4e 4f 54  t $memory; # NOT
e8b0: 45 3a 20 52 65 74 75 72 6e 20 6d 65 6d 6f 72 79  E: Return memory
e8c0: 20 69 6e 2d 75 73 65 20 74 6f 20 6f 75 72 20 63   in-use to our c
e8d0: 61 6c 6c 65 72 2e 0d 0a 0d 0a 20 20 20 20 20 20  aller.....      
e8e0: 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65  if {!$quiet} the
e8f0: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75  n {..        tpu
e900: 74 73 20 24 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d  ts $channel "---
e910: 2d 20 6d 61 78 69 6d 75 6d 20 6d 65 6d 6f 72 79  - maximum memory
e920: 20 69 6e 20 75 73 65 20 62 79 20 53 51 4c 69 74   in use by SQLit
e930: 65 2e 2e 2e 20 22 0d 0a 20 20 20 20 20 20 7d 0d  e... "..      }.
e940: 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 63 61  ...      if {[ca
e950: 74 63 68 20 7b 6f 62 6a 65 63 74 20 69 6e 76 6f  tch {object invo
e960: 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75  ke -flags +NonPu
e970: 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20 20 20  blic \..        
e980: 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74        System.Dat
e990: 61 2e 53 51 4c 69 74 65 2e 55 6e 73 61 66 65 4e  a.SQLite.UnsafeN
e9a0: 61 74 69 76 65 4d 65 74 68 6f 64 73 20 5c 0d 0a  ativeMethods \..
e9b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
e9c0: 6c 69 74 65 33 5f 6d 65 6d 6f 72 79 5f 68 69 67  lite3_memory_hig
e9d0: 68 77 61 74 65 72 20 30 7d 20 6d 65 6d 6f 72 79  hwater 0} memory
e9e0: 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  ] == 0} then {..
e9f0: 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75          if {!$qu
ea00: 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  iet} then {..   
ea10: 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
ea20: 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
ea30: 73 20 24 6d 65 6d 6f 72 79 20 22 20 62 79 74 65  s $memory " byte
ea40: 73 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20 7d  s\n"]..        }
ea50: 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b  ..      } else {
ea60: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
ea70: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4d 61 79       # NOTE: May
ea80: 62 65 20 74 68 65 20 53 51 4c 69 74 65 20 63 6f  be the SQLite co
ea90: 72 65 20 6c 69 62 72 61 72 79 20 69 73 20 75 6e  re library is un
eaa0: 61 76 61 69 6c 61 62 6c 65 3f 0d 0a 20 20 20 20  available?..    
eab0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 73      #..        s
eac0: 65 74 20 6d 65 6d 6f 72 79 20 75 6e 6b 6e 6f 77  et memory unknow
ead0: 6e 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20  n....        if 
eae0: 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b  {!$quiet} then {
eaf0: 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70 75 74  ..          tput
eb00: 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  s $channel [appe
eb10: 6e 64 41 72 67 73 20 24 6d 65 6d 6f 72 79 20 5c  ndArgs $memory \
eb20: 6e 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20  n]..        }.. 
eb30: 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
eb40: 69 66 20 7b 24 63 6f 6c 6c 65 63 74 7d 20 74 68  if {$collect} th
eb50: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 63 6f  en {..        co
eb60: 6c 6c 65 63 74 47 61 72 62 61 67 65 20 24 63 68  llectGarbage $ch
eb70: 61 6e 6e 65 6c 0d 0a 20 20 20 20 20 20 7d 0d 0a  annel..      }..
eb80: 0d 0a 20 20 20 20 20 20 69 66 20 7b 21 24 71 75  ..      if {!$qu
eb90: 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  iet} then {..   
eba0: 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
ebb0: 6e 65 6c 20 22 2d 2d 2d 2d 20 63 75 72 72 65 6e  nel "---- curren
ebc0: 74 20 6d 65 6d 6f 72 79 20 69 6e 20 75 73 65 20  t memory in use 
ebd0: 62 79 20 74 68 65 20 43 4c 52 2e 2e 2e 20 22 0d  by the CLR... ".
ebe0: 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
ebf0: 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 6f 62    if {[catch {ob
ec00: 6a 65 63 74 20 69 6e 76 6f 6b 65 20 47 43 20 47  ject invoke GC G
ec10: 65 74 54 6f 74 61 6c 4d 65 6d 6f 72 79 20 66 61  etTotalMemory fa
ec20: 6c 73 65 7d 20 6d 65 6d 6f 72 79 5d 20 3d 3d 20  lse} memory] == 
ec30: 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
ec40: 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 69     if {[string i
ec50: 73 20 69 6e 74 65 67 65 72 20 2d 73 74 72 69 63  s integer -stric
ec60: 74 20 24 6d 65 6d 6f 72 79 5d 7d 20 74 68 65 6e  t $memory]} then
ec70: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66   {..          if
ec80: 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20   {!$quiet} then 
ec90: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  {..            t
eca0: 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61  puts $channel [a
ecb0: 70 70 65 6e 64 41 72 67 73 20 24 6d 65 6d 6f 72  ppendArgs $memor
ecc0: 79 20 22 20 62 79 74 65 73 5c 6e 22 5d 0d 0a 20  y " bytes\n"].. 
ecd0: 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
ece0: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
ecf0: 20 20 20 20 20 20 20 20 73 65 74 20 6d 65 6d 6f          set memo
ed00: 72 79 20 69 6e 76 61 6c 69 64 0d 0a 0d 0a 20 20  ry invalid....  
ed10: 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75          if {!$qu
ed20: 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  iet} then {..   
ed30: 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
ed40: 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
ed50: 72 67 73 20 24 6d 65 6d 6f 72 79 20 5c 6e 5d 0d  rgs $memory \n].
ed60: 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  .          }..  
ed70: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d        }..      }
ed80: 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
ed90: 20 73 65 74 20 6d 65 6d 6f 72 79 20 75 6e 6b 6e   set memory unkn
eda0: 6f 77 6e 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69  own....        i
edb0: 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e  f {!$quiet} then
edc0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70   {..          tp
edd0: 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70  uts $channel [ap
ede0: 70 65 6e 64 41 72 67 73 20 24 6d 65 6d 6f 72 79  pendArgs $memory
edf0: 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d   \n]..        }.
ee00: 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
ee10: 20 20 72 65 74 75 72 6e 20 24 72 65 73 75 6c 74    return $result
ee20: 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
ee30: 70 72 6f 63 20 63 68 65 63 6b 46 6f 72 53 51 4c  proc checkForSQL
ee40: 69 74 65 44 69 72 65 63 74 6f 72 69 65 73 20 7b  iteDirectories {
ee50: 20 63 68 61 6e 6e 65 6c 20 7b 72 65 73 65 74 20   channel {reset 
ee60: 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a 20 20 20 20  false} } {..    
ee70: 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
ee80: 45 3a 20 43 68 65 63 6b 20 69 66 20 74 68 65 20  E: Check if the 
ee90: 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 65  sqlite3_win32_se
eea0: 74 5f 64 69 72 65 63 74 6f 72 79 20 66 75 6e 63  t_directory func
eeb0: 74 69 6f 6e 20 69 73 20 61 76 61 69 6c 61 62 6c  tion is availabl
eec0: 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  e...      #..   
eed0: 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
eee0: 6c 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 22  l \..          "
eef0: 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e 67 20 66 6f  ---- checking fo
ef00: 72 20 66 75 6e 63 74 69 6f 6e 20 73 71 6c 69 74  r function sqlit
ef10: 65 33 5f 77 69 6e 33 32 5f 73 65 74 5f 64 69 72  e3_win32_set_dir
ef20: 65 63 74 6f 72 79 2e 2e 2e 20 22 0d 0a 0d 0a 20  ectory... ".... 
ef30: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
ef40: 4e 4f 54 45 3a 20 54 68 69 73 20 63 61 6c 6c 20  NOTE: This call 
ef50: 74 6f 20 74 68 65 20 73 71 6c 69 74 65 33 5f 77  to the sqlite3_w
ef60: 69 6e 33 32 5f 73 65 74 5f 64 69 72 65 63 74 6f  in32_set_directo
ef70: 72 79 20 66 75 6e 63 74 69 6f 6e 20 75 73 65 73  ry function uses
ef80: 20 74 68 65 0d 0a 20 20 20 20 20 20 23 20 20 20   the..      #   
ef90: 20 20 20 20 69 6e 76 61 6c 69 64 20 76 61 6c 75      invalid valu
efa0: 65 20 30 20 66 6f 72 20 74 68 65 20 66 69 72 73  e 0 for the firs
efb0: 74 20 61 72 67 75 6d 65 6e 74 2e 20 20 54 68 69  t argument.  Thi
efc0: 73 20 63 6f 64 65 20 69 73 20 64 65 73 69 67 6e  s code is design
efd0: 65 64 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  ed..      #     
efe0: 20 20 74 6f 20 63 68 65 63 6b 20 69 66 20 63 61    to check if ca
eff0: 6c 6c 69 6e 67 20 74 68 65 20 66 75 6e 63 74 69  lling the functi
f000: 6f 6e 20 77 69 6c 6c 20 72 61 69 73 65 20 61 6e  on will raise an
f010: 20 65 78 63 65 70 74 69 6f 6e 20 28 69 2e 65 2e   exception (i.e.
f020: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
f030: 74 68 65 20 61 63 74 75 61 6c 20 72 65 73 75 6c  the actual resul
f040: 74 20 6f 66 20 74 68 65 20 66 75 6e 63 74 69 6f  t of the functio
f050: 6e 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 74 65  n does not matte
f060: 72 20 61 73 20 6c 6f 6e 67 20 61 73 20 6e 6f 0d  r as long as no.
f070: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 64  .      #       d
f080: 69 72 65 63 74 6f 72 79 20 69 73 20 63 68 61 6e  irectory is chan
f090: 67 65 64 29 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  ged)...      #..
f0a0: 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68        if {[catch
f0b0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
f0c0: 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20    object invoke 
f0d0: 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69  -flags +NonPubli
f0e0: 63 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  c \..           
f0f0: 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53     System.Data.S
f100: 51 4c 69 74 65 2e 55 6e 73 61 66 65 4e 61 74 69  QLite.UnsafeNati
f110: 76 65 4d 65 74 68 6f 64 73 20 5c 0d 0a 20 20 20  veMethods \..   
f120: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
f130: 65 33 5f 77 69 6e 33 32 5f 73 65 74 5f 64 69 72  e3_win32_set_dir
f140: 65 63 74 6f 72 79 20 30 20 6e 75 6c 6c 7d 5d 20  ectory 0 null}] 
f150: 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  == 0} then {..  
f160: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
f170: 20 23 20 4e 4f 54 45 3a 20 43 61 6c 6c 69 6e 67   # NOTE: Calling
f180: 20 74 68 65 20 73 71 6c 69 74 65 33 5f 77 69 6e   the sqlite3_win
f190: 33 32 5f 73 65 74 5f 64 69 72 65 63 74 6f 72 79  32_set_directory
f1a0: 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e   function does n
f1b0: 6f 74 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  ot..        #   
f1c0: 20 20 20 20 63 61 75 73 65 20 61 6e 20 65 78 63      cause an exc
f1d0: 65 70 74 69 6f 6e 3b 20 74 68 65 72 65 66 6f 72  eption; therefor
f1e0: 65 2c 20 69 74 20 6d 75 73 74 20 62 65 20 61 76  e, it must be av
f1f0: 61 69 6c 61 62 6c 65 20 28 69 2e 65 2e 0d 0a 20  ailable (i.e... 
f200: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 65         #       e
f210: 76 65 6e 20 74 68 6f 75 67 68 20 69 74 20 73 68  ven though it sh
f220: 6f 75 6c 64 20 72 65 74 75 72 6e 20 61 20 66 61  ould return a fa
f230: 69 6c 75 72 65 20 72 65 74 75 72 6e 20 63 6f 64  ilure return cod
f240: 65 20 69 6e 20 74 68 69 73 0d 0a 20 20 20 20 20  e in this..     
f250: 20 20 20 23 20 20 20 20 20 20 20 63 61 73 65 29     #       case)
f260: 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
f270: 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61        addConstra
f280: 69 6e 74 20 73 71 6c 69 74 65 33 5f 77 69 6e 33  int sqlite3_win3
f290: 32 5f 73 65 74 5f 64 69 72 65 63 74 6f 72 79 0d  2_set_directory.
f2a0: 0a 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73  ...        tputs
f2b0: 20 24 63 68 61 6e 6e 65 6c 20 79 65 73 5c 6e 0d   $channel yes\n.
f2c0: 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
f2d0: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 44 6f        # NOTE: Do
f2e0: 65 73 20 6f 75 72 20 63 61 6c 6c 65 72 20 77 61  es our caller wa
f2f0: 6e 74 20 74 6f 20 72 65 73 65 74 20 74 68 65 20  nt to reset the 
f300: 64 69 72 65 63 74 6f 72 69 65 73 3f 0d 0a 20 20  directories?..  
f310: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
f320: 20 69 66 20 7b 24 72 65 73 65 74 7d 20 74 68 65   if {$reset} the
f330: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 23  n {..          #
f340: 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f  ..          # NO
f350: 54 45 3a 20 4e 6f 77 20 6d 61 6b 65 20 73 75 72  TE: Now make sur
f360: 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61  e the database a
f370: 6e 64 20 74 65 6d 70 6f 72 61 72 79 20 64 69 72  nd temporary dir
f380: 65 63 74 6f 72 69 65 73 20 61 72 65 0d 0a 20 20  ectories are..  
f390: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
f3a0: 72 65 73 65 74 20 74 68 65 69 72 20 64 65 66 61  reset their defa
f3b0: 75 6c 74 20 76 61 6c 75 65 73 2c 20 77 68 69 63  ult values, whic
f3c0: 68 20 73 68 6f 75 6c 64 20 62 65 20 6e 75 6c 6c  h should be null
f3d0: 20 66 6f 72 20 62 6f 74 68 2e 0d 0a 20 20 20 20   for both...    
f3e0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 53 69        #       Si
f3f0: 6e 63 65 20 74 68 65 20 73 71 6c 69 74 65 33 5f  nce the sqlite3_
f400: 77 69 6e 33 32 5f 73 65 74 5f 64 69 72 65 63 74  win32_set_direct
f410: 6f 72 79 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  ory function is 
f420: 61 76 61 69 6c 61 62 6c 65 2c 0d 0a 20 20 20 20  available,..    
f430: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 75 73        #       us
f440: 65 20 69 74 2e 0d 0a 20 20 20 20 20 20 20 20 20  e it...         
f450: 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 66 6f   #..          fo
f460: 72 20 7b 73 65 74 20 69 6e 64 65 78 20 31 7d 20  r {set index 1} 
f470: 7b 24 69 6e 64 65 78 20 3c 20 33 7d 20 7b 69 6e  {$index < 3} {in
f480: 63 72 20 69 6e 64 65 78 7d 20 7b 0d 0a 20 20 20  cr index} {..   
f490: 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61           if {[ca
f4a0: 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  tch {..         
f4b0: 20 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63             objec
f4c0: 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20  t invoke -flags 
f4d0: 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20  +NonPublic \..  
f4e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f4f0: 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51    System.Data.SQ
f500: 4c 69 74 65 2e 55 6e 73 61 66 65 4e 61 74 69 76  Lite.UnsafeNativ
f510: 65 4d 65 74 68 6f 64 73 20 5c 0d 0a 20 20 20 20  eMethods \..    
f520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f530: 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 65  sqlite3_win32_se
f540: 74 5f 64 69 72 65 63 74 6f 72 79 20 24 69 6e 64  t_directory $ind
f550: 65 78 20 6e 75 6c 6c 7d 20 5c 0d 0a 20 20 20 20  ex null} \..    
f560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f570: 72 65 73 75 6c 74 5d 20 3d 3d 20 30 7d 20 74 68  result] == 0} th
f580: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
f590: 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
f5a0: 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
f5b0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
f5c0: 20 20 20 20 22 2d 2d 2d 2d 20 63 61 6c 6c 20 73      "---- call s
f5d0: 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 65 74  qlite3_win32_set
f5e0: 5f 64 69 72 65 63 74 6f 72 79 28 22 20 24 69 6e  _directory(" $in
f5f0: 64 65 78 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  dex \..         
f600: 20 20 20 20 20 20 20 20 20 22 2c 20 6e 75 6c 6c           ", null
f610: 29 2e 2e 2e 20 6f 6b 3a 20 22 20 24 72 65 73 75  )... ok: " $resu
f620: 6c 74 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20  lt \n]..        
f630: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
f640: 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
f650: 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  s $channel [appe
f660: 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
f670: 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
f680: 2d 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 5f 77  - call sqlite3_w
f690: 69 6e 33 32 5f 73 65 74 5f 64 69 72 65 63 74 6f  in32_set_directo
f6a0: 72 79 28 22 20 24 69 6e 64 65 78 20 5c 0d 0a 20  ry(" $index \.. 
f6b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f6c0: 20 22 2c 20 6e 75 6c 6c 29 2e 2e 2e 20 65 72 72   ", null)... err
f6d0: 6f 72 3a 20 22 20 5c 6e 5c 74 20 24 72 65 73 75  or: " \n\t $resu
f6e0: 6c 74 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20  lt \n]..        
f6f0: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
f700: 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20   }..        }.. 
f710: 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
f720: 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
f730: 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d 0a 0d 0a 20 20  annel no\n....  
f740: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
f750: 20 23 20 4e 4f 54 45 3a 20 44 6f 65 73 20 6f 75   # NOTE: Does ou
f760: 72 20 63 61 6c 6c 65 72 20 77 61 6e 74 20 74 6f  r caller want to
f770: 20 72 65 73 65 74 20 74 68 65 20 64 69 72 65 63   reset the direc
f780: 74 6f 72 69 65 73 3f 20 20 54 68 69 73 20 63 61  tories?  This ca
f790: 6e 20 6f 6e 6c 79 0d 0a 20 20 20 20 20 20 20 20  n only..        
f7a0: 23 20 20 20 20 20 20 20 62 65 20 70 65 72 66 6f  #       be perfo
f7b0: 72 6d 65 64 20 69 66 20 53 51 4c 69 74 65 20 69  rmed if SQLite i
f7c0: 73 20 6c 6f 61 64 65 64 20 61 6e 64 20 72 65 61  s loaded and rea
f7d0: 64 79 20 66 6f 72 20 75 73 65 20 62 79 20 74 68  dy for use by th
f7e0: 65 20 74 65 73 74 0d 0a 20 20 20 20 20 20 20 20  e test..        
f7f0: 23 20 20 20 20 20 20 20 73 75 69 74 65 2e 0d 0a  #       suite...
f800: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
f810: 20 20 20 69 66 20 7b 24 72 65 73 65 74 20 26 26     if {$reset &&
f820: 20 5b 69 73 53 51 4c 69 74 65 52 65 61 64 79 5d   [isSQLiteReady]
f830: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
f840: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
f850: 20 23 20 4e 4f 54 45 3a 20 4e 6f 77 20 6d 61 6b   # NOTE: Now mak
f860: 65 20 73 75 72 65 20 74 68 65 20 64 61 74 61 62  e sure the datab
f870: 61 73 65 20 61 6e 64 20 74 65 6d 70 6f 72 61 72  ase and temporar
f880: 79 20 64 69 72 65 63 74 6f 72 69 65 73 20 61 72  y directories ar
f890: 65 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 20  e..          #  
f8a0: 20 20 20 20 20 72 65 73 65 74 20 74 68 65 69 72       reset their
f8b0: 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 73 2c   default values,
f8c0: 20 77 68 69 63 68 20 73 68 6f 75 6c 64 20 62 65   which should be
f8d0: 20 6e 75 6c 6c 20 66 6f 72 20 62 6f 74 68 2e 0d   null for both..
f8e0: 0a 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20  .          #    
f8f0: 20 20 20 53 69 6e 63 65 20 74 68 65 20 73 71 6c     Since the sql
f900: 69 74 65 33 5f 77 69 6e 33 32 5f 73 65 74 5f 64  ite3_win32_set_d
f910: 69 72 65 63 74 6f 72 79 20 66 75 6e 63 74 69 6f  irectory functio
f920: 6e 20 64 6f 65 73 20 6e 6f 74 0d 0a 20 20 20 20  n does not..    
f930: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 61 70        #       ap
f940: 70 65 61 72 20 74 6f 20 62 65 20 61 76 61 69 6c  pear to be avail
f950: 61 62 6c 65 2c 20 75 73 65 20 74 68 65 20 61 73  able, use the as
f960: 73 6f 63 69 61 74 65 64 20 50 52 41 47 4d 41 20  sociated PRAGMA 
f970: 63 6f 6d 6d 61 6e 64 73 0d 0a 20 20 20 20 20 20  commands..      
f980: 20 20 20 20 23 20 20 20 20 20 20 20 69 6e 73 74      #       inst
f990: 65 61 64 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  ead...          
f9a0: 23 0d 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72  #..          for
f9b0: 65 61 63 68 20 64 69 72 65 63 74 6f 72 79 20 5b  each directory [
f9c0: 6c 69 73 74 20 64 61 74 61 5f 73 74 6f 72 65 5f  list data_store_
f9d0: 64 69 72 65 63 74 6f 72 79 20 74 65 6d 70 5f 73  directory temp_s
f9e0: 74 6f 72 65 5f 64 69 72 65 63 74 6f 72 79 5d 20  tore_directory] 
f9f0: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  {..            s
fa00: 65 74 20 73 71 6c 20 5b 61 70 70 65 6e 64 41 72  et sql [appendAr
fa10: 67 73 20 22 50 52 41 47 4d 41 20 22 20 24 64 69  gs "PRAGMA " $di
fa20: 72 65 63 74 6f 72 79 20 22 20 3d 20 5c 22 5c 22  rectory " = \"\"
fa30: 3b 22 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  ;"]....         
fa40: 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 65     if {[catch {e
fa50: 78 65 63 75 74 65 53 71 6c 20 24 73 71 6c 7d 20  xecuteSql $sql} 
fa60: 72 65 73 75 6c 74 5d 20 3d 3d 20 30 7d 20 74 68  result] == 0} th
fa70: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
fa80: 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
fa90: 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
faa0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
fab0: 20 20 20 20 22 2d 2d 2d 2d 20 65 78 65 63 75 74      "---- execut
fac0: 65 20 50 52 41 47 4d 41 20 22 20 24 64 69 72 65  e PRAGMA " $dire
fad0: 63 74 6f 72 79 20 22 2e 2e 2e 20 6f 6b 3a 20 5c  ctory "... ok: \
fae0: 22 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  "" \..          
faf0: 20 20 20 20 20 20 20 20 24 72 65 73 75 6c 74 20          $result 
fb00: 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20  \"\n]..         
fb10: 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
fb20: 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
fb30: 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e   $channel [appen
fb40: 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
fb50: 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
fb60: 20 65 78 65 63 75 74 65 20 50 52 41 47 4d 41 20   execute PRAGMA 
fb70: 22 20 24 64 69 72 65 63 74 6f 72 79 20 22 2e 2e  " $directory "..
fb80: 2e 20 65 72 72 6f 72 3a 20 22 20 5c 0d 0a 20 20  . error: " \..  
fb90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fba0: 5c 6e 5c 74 20 24 72 65 73 75 6c 74 20 5c 6e 5d  \n\t $result \n]
fbb0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
fbc0: 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  .          }..  
fbd0: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d        }..      }
fbe0: 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  ....      #..   
fbf0: 20 20 20 23 20 4e 4f 54 45 3a 20 46 69 6e 61 6c     # NOTE: Final
fc00: 6c 79 2c 20 73 68 6f 77 20 74 68 65 20 63 75 72  ly, show the cur
fc10: 72 65 6e 74 20 76 61 6c 75 65 20 6f 66 20 74 68  rent value of th
fc20: 65 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 74  e database and t
fc30: 65 6d 70 6f 72 61 72 79 0d 0a 20 20 20 20 20 20  emporary..      
fc40: 23 20 20 20 20 20 20 20 64 69 72 65 63 74 6f 72  #       director
fc50: 69 65 73 2e 20 20 54 68 69 73 20 63 61 6e 20 6f  ies.  This can o
fc60: 6e 6c 79 20 62 65 20 70 65 72 66 6f 72 6d 65 64  nly be performed
fc70: 20 69 66 20 53 51 4c 69 74 65 20 69 73 20 6c 6f   if SQLite is lo
fc80: 61 64 65 64 0d 0a 20 20 20 20 20 20 23 20 20 20  aded..      #   
fc90: 20 20 20 20 61 6e 64 20 72 65 61 64 79 20 66 6f      and ready fo
fca0: 72 20 75 73 65 20 62 79 20 74 68 65 20 74 65 73  r use by the tes
fcb0: 74 20 73 75 69 74 65 2e 0d 0a 20 20 20 20 20 20  t suite...      
fcc0: 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 73  #..      if {[is
fcd0: 53 51 4c 69 74 65 52 65 61 64 79 5d 7d 20 74 68  SQLiteReady]} th
fce0: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 66 6f  en {..        fo
fcf0: 72 65 61 63 68 20 64 69 72 65 63 74 6f 72 79 20  reach directory 
fd00: 5b 6c 69 73 74 20 64 61 74 61 5f 73 74 6f 72 65  [list data_store
fd10: 5f 64 69 72 65 63 74 6f 72 79 20 74 65 6d 70 5f  _directory temp_
fd20: 73 74 6f 72 65 5f 64 69 72 65 63 74 6f 72 79 5d  store_directory]
fd30: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70   {..          tp
fd40: 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70  uts $channel [ap
fd50: 70 65 6e 64 41 72 67 73 20 22 2d 2d 2d 2d 20 63  pendArgs "---- c
fd60: 68 65 63 6b 69 6e 67 20 22 20 24 64 69 72 65 63  hecking " $direc
fd70: 74 6f 72 79 20 22 2e 2e 2e 20 22 5d 0d 0a 0d 0a  tory "... "]....
fd80: 20 20 20 20 20 20 20 20 20 20 73 65 74 20 73 71            set sq
fd90: 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 22 50  l [appendArgs "P
fda0: 52 41 47 4d 41 20 22 20 24 64 69 72 65 63 74 6f  RAGMA " $directo
fdb0: 72 79 20 5c 3b 5d 0d 0a 0d 0a 20 20 20 20 20 20  ry \;]....      
fdc0: 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b      if {[catch {
fdd0: 65 78 65 63 75 74 65 53 71 6c 20 24 73 71 6c 20  executeSql $sql 
fde0: 73 63 61 6c 61 72 7d 20 72 65 73 75 6c 74 5d 20  scalar} result] 
fdf0: 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  == 0} then {..  
fe00: 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
fe10: 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  $channel [append
fe20: 41 72 67 73 20 22 6f 6b 3a 20 5c 22 22 20 24 72  Args "ok: \"" $r
fe30: 65 73 75 6c 74 20 5c 22 5c 6e 5d 0d 0a 20 20 20  esult \"\n]..   
fe40: 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d         } else {.
fe50: 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75  .            tpu
fe60: 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70  ts $channel [app
fe70: 65 6e 64 41 72 67 73 20 22 65 72 72 6f 72 3a 20  endArgs "error: 
fe80: 22 20 5c 6e 5c 74 20 24 72 65 73 75 6c 74 20 5c  " \n\t $result \
fe90: 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d  n]..          }.
fea0: 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  .        }..    
feb0: 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20    }..    }..... 
fec0: 20 20 20 70 72 6f 63 20 6c 6f 61 64 53 51 4c 69     proc loadSQLi
fed0: 74 65 54 65 73 74 53 65 74 74 69 6e 67 73 20 7b  teTestSettings {
fee0: 20 63 68 61 6e 6e 65 6c 20 7b 73 75 66 66 69 78   channel {suffix
fef0: 20 22 22 7d 20 7b 71 75 69 65 74 20 66 61 6c 73   ""} {quiet fals
ff00: 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d  e} } {..      #.
ff10: 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53  .      # NOTE: S
ff20: 6b 69 70 20 6c 6f 61 64 69 6e 67 20 74 68 65 20  kip loading the 
ff30: 73 65 74 74 69 6e 67 73 20 69 66 20 74 68 65 69  settings if thei
ff40: 72 20 75 73 61 67 65 20 68 61 73 20 62 65 65 6e  r usage has been
ff50: 20 64 69 73 61 62 6c 65 64 2e 0d 0a 20 20 20 20   disabled...    
ff60: 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 21    #..      if {!
ff70: 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e  [info exists ::n
ff80: 6f 28 73 71 6c 69 74 65 54 65 73 74 53 65 74 74  o(sqliteTestSett
ff90: 69 6e 67 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a  ings)]} then {..
ffa0: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
ffb0: 20 20 20 23 20 4e 4f 54 45 3a 20 4c 6f 61 64 20     # NOTE: Load 
ffc0: 63 75 73 74 6f 6d 20 70 65 72 2d 75 73 65 72 20  custom per-user 
ffd0: 61 6e 64 2f 6f 72 20 70 65 72 2d 68 6f 73 74 20  and/or per-host 
ffe0: 74 65 73 74 20 73 65 74 74 69 6e 67 73 20 6e 6f  test settings no
fff0: 77 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  w...        #.. 
10000 20 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f         if {[info
10010 20 65 78 69 73 74 73 20 3a 3a 74 63 6c 5f 70 6c   exists ::tcl_pl
10020 61 74 66 6f 72 6d 28 75 73 65 72 29 5d 7d 20 74  atform(user)]} t
10030 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
10040 20 73 65 74 20 75 73 65 72 53 65 74 74 69 6e 67   set userSetting
10050 73 46 69 6c 65 4e 61 6d 65 20 5b 66 69 6c 65 20  sFileName [file 
10060 6a 6f 69 6e 20 5b 67 65 74 43 6f 6d 6d 6f 6e 44  join [getCommonD
10070 69 72 65 63 74 6f 72 79 5d 20 5c 0d 0a 20 20 20  irectory] \..   
10080 20 20 20 20 20 20 20 20 20 20 20 5b 61 70 70 65             [appe
10090 6e 64 41 72 67 73 20 73 65 74 74 69 6e 67 73 20  ndArgs settings 
100a0 24 73 75 66 66 69 78 20 2e 20 24 3a 3a 74 63 6c  $suffix . $::tcl
100b0 5f 70 6c 61 74 66 6f 72 6d 28 75 73 65 72 29 20  _platform(user) 
100c0 2e 65 61 67 6c 65 5d 5d 0d 0a 0d 0a 20 20 20 20  .eagle]]....    
100d0 20 20 20 20 20 20 69 66 20 7b 5b 66 69 6c 65 20        if {[file 
100e0 65 78 69 73 74 73 20 24 75 73 65 72 53 65 74 74  exists $userSett
100f0 69 6e 67 73 46 69 6c 65 4e 61 6d 65 5d 7d 20 74  ingsFileName]} t
10100 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
10110 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20     if {!$quiet} 
10120 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
10130 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
10140 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
10150 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
10160 20 20 20 20 20 20 22 2d 2d 2d 2d 20 6c 6f 61 64        "---- load
10170 69 6e 67 20 70 65 72 2d 75 73 65 72 20 74 65 73  ing per-user tes
10180 74 20 73 65 74 74 69 6e 67 73 20 66 69 6c 65 20  t settings file 
10190 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  \"" \..         
101a0 20 20 20 20 20 20 20 20 20 24 75 73 65 72 53 65           $userSe
101b0 74 74 69 6e 67 73 46 69 6c 65 4e 61 6d 65 20 5c  ttingsFileName \
101c0 22 2e 2e 2e 5c 6e 5d 0d 0a 20 20 20 20 20 20 20  "...\n]..       
101d0 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
101e0 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68        if {[catch
101f0 20 7b 75 70 6c 65 76 65 6c 20 31 20 5b 6c 69 73   {uplevel 1 [lis
10200 74 20 73 6f 75 72 63 65 20 24 75 73 65 72 53 65  t source $userSe
10210 74 74 69 6e 67 73 46 69 6c 65 4e 61 6d 65 5d 7d  ttingsFileName]}
10220 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
10230 20 20 20 20 20 20 20 20 65 72 72 6f 72 5d 7d 20          error]} 
10240 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
10250 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65        if {!$quie
10260 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  t} then {..     
10270 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
10280 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e   $channel [appen
10290 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
102a0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 3d 3d               "==
102b0 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c  == WARNING: fail
102c0 65 64 20 74 6f 20 6c 6f 61 64 20 70 65 72 2d 75  ed to load per-u
102d0 73 65 72 20 73 65 74 74 69 6e 67 73 20 66 69 6c  ser settings fil
102e0 65 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20 20  e \"" \..       
102f0 20 20 20 20 20 20 20 20 20 20 20 20 20 24 75 73               $us
10300 65 72 53 65 74 74 69 6e 67 73 46 69 6c 65 4e 61  erSettingsFileNa
10310 6d 65 20 22 5c 22 2c 20 65 72 72 6f 72 3a 20 22  me "\", error: "
10320 20 5c 6e 5c 74 20 24 65 72 72 6f 72 20 5c 6e 5d   \n\t $error \n]
10330 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
10340 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  }..            }
10350 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c  ..          } el
10360 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  se {..          
10370 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74    if {!$quiet} t
10380 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
10390 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
103a0 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
103b0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
103c0 20 20 20 20 20 22 2d 2d 2d 2d 20 73 6b 69 70 70       "---- skipp
103d0 65 64 20 6c 6f 61 64 69 6e 67 20 70 65 72 2d 75  ed loading per-u
103e0 73 65 72 20 74 65 73 74 20 73 65 74 74 69 6e 67  ser test setting
103f0 73 20 66 69 6c 65 20 5c 22 22 20 5c 0d 0a 20 20  s file \"" \..  
10400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10410 24 75 73 65 72 53 65 74 74 69 6e 67 73 46 69 6c  $userSettingsFil
10420 65 4e 61 6d 65 20 22 5c 22 2c 20 69 74 20 64 6f  eName "\", it do
10430 65 73 20 6e 6f 74 20 65 78 69 73 74 5c 6e 22 5d  es not exist\n"]
10440 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
10450 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  .          }..  
10460 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
10470 20 20 20 23 23 23 23 23 23 23 23 23 23 23 23 23     #############
10480 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
10490 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
104a0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
104b0 23 23 23 23 23 23 23 23 23 23 0d 0a 0d 0a 20 20  ##########....  
104c0 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20        if {[info 
104d0 65 78 69 73 74 73 20 3a 3a 74 63 6c 5f 70 6c 61  exists ::tcl_pla
104e0 74 66 6f 72 6d 28 68 6f 73 74 29 5d 7d 20 74 68  tform(host)]} th
104f0 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
10500 73 65 74 20 68 6f 73 74 53 65 74 74 69 6e 67 73  set hostSettings
10510 46 69 6c 65 4e 61 6d 65 20 5b 66 69 6c 65 20 6a  FileName [file j
10520 6f 69 6e 20 5b 67 65 74 43 6f 6d 6d 6f 6e 44 69  oin [getCommonDi
10530 72 65 63 74 6f 72 79 5d 20 5c 0d 0a 20 20 20 20  rectory] \..    
10540 20 20 20 20 20 20 20 20 20 20 5b 61 70 70 65 6e            [appen
10550 64 41 72 67 73 20 73 65 74 74 69 6e 67 73 20 24  dArgs settings $
10560 73 75 66 66 69 78 20 2e 20 24 3a 3a 74 63 6c 5f  suffix . $::tcl_
10570 70 6c 61 74 66 6f 72 6d 28 68 6f 73 74 29 20 2e  platform(host) .
10580 65 61 67 6c 65 5d 5d 0d 0a 0d 0a 20 20 20 20 20  eagle]]....     
10590 20 20 20 20 20 69 66 20 7b 5b 66 69 6c 65 20 65       if {[file e
105a0 78 69 73 74 73 20 24 68 6f 73 74 53 65 74 74 69  xists $hostSetti
105b0 6e 67 73 46 69 6c 65 4e 61 6d 65 5d 7d 20 74 68  ngsFileName]} th
105c0 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
105d0 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74    if {!$quiet} t
105e0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
105f0 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
10600 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
10610 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
10620 20 20 20 20 20 22 2d 2d 2d 2d 20 6c 6f 61 64 69       "---- loadi
10630 6e 67 20 70 65 72 2d 68 6f 73 74 20 74 65 73 74  ng per-host test
10640 20 73 65 74 74 69 6e 67 73 20 66 69 6c 65 20 5c   settings file \
10650 22 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  "" \..          
10660 20 20 20 20 20 20 20 20 24 68 6f 73 74 53 65 74          $hostSet
10670 74 69 6e 67 73 46 69 6c 65 4e 61 6d 65 20 5c 22  tingsFileName \"
10680 2e 2e 2e 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20  ...\n]..        
10690 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
106a0 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20       if {[catch 
106b0 7b 75 70 6c 65 76 65 6c 20 31 20 5b 6c 69 73 74  {uplevel 1 [list
106c0 20 73 6f 75 72 63 65 20 24 68 6f 73 74 53 65 74   source $hostSet
106d0 74 69 6e 67 73 46 69 6c 65 4e 61 6d 65 5d 7d 20  tingsFileName]} 
106e0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
106f0 20 20 20 20 20 20 20 65 72 72 6f 72 5d 7d 20 74         error]} t
10700 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
10710 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74       if {!$quiet
10720 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
10730 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
10740 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  $channel [append
10750 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
10760 20 20 20 20 20 20 20 20 20 20 20 20 22 3d 3d 3d              "===
10770 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65  = WARNING: faile
10780 64 20 74 6f 20 6c 6f 61 64 20 70 65 72 2d 68 6f  d to load per-ho
10790 73 74 20 73 65 74 74 69 6e 67 73 20 66 69 6c 65  st settings file
107a0 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20 20 20   \"" \..        
107b0 20 20 20 20 20 20 20 20 20 20 20 20 24 68 6f 73              $hos
107c0 74 53 65 74 74 69 6e 67 73 46 69 6c 65 4e 61 6d  tSettingsFileNam
107d0 65 20 22 5c 22 2c 20 65 72 72 6f 72 3a 20 22 20  e "\", error: " 
107e0 5c 6e 5c 74 20 24 65 72 72 6f 72 20 5c 6e 5d 0d  \n\t $error \n].
107f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
10800 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
10810 0a 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73  .          } els
10820 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e {..           
10830 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68   if {!$quiet} th
10840 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
10850 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
10860 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
10870 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
10880 20 20 20 20 22 2d 2d 2d 2d 20 73 6b 69 70 70 65      "---- skippe
10890 64 20 6c 6f 61 64 69 6e 67 20 70 65 72 2d 68 6f  d loading per-ho
108a0 73 74 20 74 65 73 74 20 73 65 74 74 69 6e 67 73  st test settings
108b0 20 66 69 6c 65 20 5c 22 22 20 5c 0d 0a 20 20 20   file \"" \..   
108c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 24                 $
108d0 68 6f 73 74 53 65 74 74 69 6e 67 73 46 69 6c 65  hostSettingsFile
108e0 4e 61 6d 65 20 22 5c 22 2c 20 69 74 20 64 6f 65  Name "\", it doe
108f0 73 20 6e 6f 74 20 65 78 69 73 74 5c 6e 22 5d 0d  s not exist\n"].
10900 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  .            }..
10910 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
10920 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d       }..      }.
10930 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70  .    }.....    p
10940 72 6f 63 20 72 75 6e 53 51 4c 69 74 65 54 65 73  roc runSQLiteTes
10950 74 50 72 6f 6c 6f 67 75 65 20 7b 7d 20 7b 0d 0a  tPrologue {} {..
10960 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
10970 20 4e 4f 54 45 3a 20 53 6b 69 70 20 72 75 6e 6e   NOTE: Skip runn
10980 69 6e 67 20 6f 75 72 20 63 75 73 74 6f 6d 20 70  ing our custom p
10990 72 6f 6c 6f 67 75 65 20 69 66 20 74 68 65 20 6d  rologue if the m
109a0 61 69 6e 20 6f 6e 65 20 68 61 73 20 62 65 65 6e  ain one has been
109b0 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
109c0 73 6b 69 70 70 65 64 2e 0d 0a 20 20 20 20 20 20  skipped...      
109d0 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 21 5b 69  #..      if {![i
109e0 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28  nfo exists ::no(
109f0 70 72 6f 6c 6f 67 75 65 2e 65 61 67 6c 65 29 5d  prologue.eagle)]
10a00 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
10a10 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
10a20 4f 54 45 3a 20 4c 6f 61 64 20 74 68 65 20 22 62  OTE: Load the "b
10a30 65 66 6f 72 65 2d 63 6f 6e 73 74 72 61 69 6e 74  efore-constraint
10a40 73 22 20 63 75 73 74 6f 6d 20 70 65 72 2d 75 73  s" custom per-us
10a50 65 72 20 61 6e 64 2f 6f 72 20 70 65 72 2d 68 6f  er and/or per-ho
10a60 73 74 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  st..        #   
10a70 20 20 20 20 74 65 73 74 20 73 65 74 74 69 6e 67      test setting
10a80 73 20 6e 6f 77 2e 0d 0a 20 20 20 20 20 20 20 20  s now...        
10a90 23 0d 0a 20 20 20 20 20 20 20 20 75 70 6c 65 76  #..        uplev
10aa0 65 6c 20 31 20 5b 6c 69 73 74 20 6c 6f 61 64 53  el 1 [list loadS
10ab0 51 4c 69 74 65 54 65 73 74 53 65 74 74 69 6e 67  QLiteTestSetting
10ac0 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
10ad0 6c 20 2e 62 65 66 6f 72 65 5d 0d 0a 0d 0a 20 20  l .before]....  
10ae0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
10af0 20 23 20 4e 4f 54 45 3a 20 53 6b 69 70 20 61 6c   # NOTE: Skip al
10b00 6c 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51  l System.Data.SQ
10b10 4c 69 74 65 20 72 65 6c 61 74 65 64 20 66 69 6c  Lite related fil
10b20 65 20 68 61 6e 64 6c 69 6e 67 20 28 64 65 6c 65  e handling (dele
10b30 74 69 6e 67 2c 0d 0a 20 20 20 20 20 20 20 20 23  ting,..        #
10b40 20 20 20 20 20 20 20 63 6f 70 79 69 6e 67 2c 20         copying, 
10b50 61 6e 64 20 6c 6f 61 64 69 6e 67 29 20 69 66 20  and loading) if 
10b60 77 65 20 61 72 65 20 73 6f 20 69 6e 73 74 72 75  we are so instru
10b70 63 74 65 64 2e 0d 0a 20 20 20 20 20 20 20 20 23  cted...        #
10b80 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b  ..        if {![
10b90 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f  info exists ::no
10ba0 28 73 71 6c 69 74 65 46 69 6c 65 73 29 5d 7d 20  (sqliteFiles)]} 
10bb0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
10bc0 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23    #..          #
10bd0 20 4e 4f 54 45 3a 20 53 6b 69 70 20 74 72 79 69   NOTE: Skip tryi
10be0 6e 67 20 74 6f 20 64 65 6c 65 74 65 20 61 6e 79  ng to delete any
10bf0 20 66 69 6c 65 73 20 69 66 20 77 65 20 61 72 65   files if we are
10c00 20 73 6f 20 69 6e 73 74 72 75 63 74 65 64 2e 0d   so instructed..
10c10 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
10c20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e          if {![in
10c30 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 64  fo exists ::no(d
10c40 65 6c 65 74 65 53 71 6c 69 74 65 46 69 6c 65 73  eleteSqliteFiles
10c50 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  )]} then {..    
10c60 20 20 20 20 20 20 20 20 74 72 79 44 65 6c 65 74          tryDelet
10c70 65 41 73 73 65 6d 62 6c 79 20 73 71 6c 69 74 65  eAssembly sqlite
10c80 33 2e 64 6c 6c 0d 0a 20 20 20 20 20 20 20 20 20  3.dll..         
10c90 20 20 20 72 65 6d 6f 76 65 43 6f 6e 73 74 72 61     removeConstra
10ca0 69 6e 74 20 66 69 6c 65 5f 73 71 6c 69 74 65 33  int file_sqlite3
10cb0 2e 64 6c 6c 0d 0a 0d 0a 20 20 20 20 20 20 20 20  .dll....        
10cc0 20 20 20 20 74 72 79 44 65 6c 65 74 65 41 73 73      tryDeleteAss
10cd0 65 6d 62 6c 79 20 53 51 4c 69 74 65 2e 49 6e 74  embly SQLite.Int
10ce0 65 72 6f 70 2e 64 6c 6c 0d 0a 20 20 20 20 20 20  erop.dll..      
10cf0 20 20 20 20 20 20 72 65 6d 6f 76 65 43 6f 6e 73        removeCons
10d00 74 72 61 69 6e 74 20 66 69 6c 65 5f 53 51 4c 69  traint file_SQLi
10d10 74 65 2e 49 6e 74 65 72 6f 70 2e 64 6c 6c 0d 0a  te.Interop.dll..
10d20 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 72  ..            tr
10d30 79 44 65 6c 65 74 65 41 73 73 65 6d 62 6c 79 20  yDeleteAssembly 
10d40 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
10d50 74 65 2e 64 6c 6c 0d 0a 20 20 20 20 20 20 20 20  te.dll..        
10d60 20 20 20 20 72 65 6d 6f 76 65 43 6f 6e 73 74 72      removeConstr
10d70 61 69 6e 74 20 66 69 6c 65 5f 53 79 73 74 65 6d  aint file_System
10d80 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 64 6c 6c  .Data.SQLite.dll
10d90 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
10da0 74 72 79 44 65 6c 65 74 65 41 73 73 65 6d 62 6c  tryDeleteAssembl
10db0 79 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51  y System.Data.SQ
10dc0 4c 69 74 65 2e 4c 69 6e 71 2e 64 6c 6c 0d 0a 20  Lite.Linq.dll.. 
10dd0 20 20 20 20 20 20 20 20 20 20 20 72 65 6d 6f 76             remov
10de0 65 43 6f 6e 73 74 72 61 69 6e 74 20 66 69 6c 65  eConstraint file
10df0 5f 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c  _System.Data.SQL
10e00 69 74 65 2e 4c 69 6e 71 2e 64 6c 6c 0d 0a 20 20  ite.Linq.dll..  
10e10 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
10e20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
10e30 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 6b 69 70      # NOTE: Skip
10e40 20 74 72 79 69 6e 67 20 74 6f 20 76 65 72 69 66   trying to verif
10e50 79 20 74 68 65 20 62 75 69 6c 64 20 64 69 72 65  y the build dire
10e60 63 74 6f 72 79 20 69 66 20 77 65 20 61 72 65 20  ctory if we are 
10e70 73 6f 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20  so..          # 
10e80 20 20 20 20 20 20 69 6e 73 74 72 75 63 74 65 64        instructed
10e90 3b 20 6f 74 68 65 72 77 69 73 65 2c 20 6d 61 6b  ; otherwise, mak
10ea0 65 20 73 75 72 65 20 69 74 20 61 63 74 75 61 6c  e sure it actual
10eb0 6c 79 20 65 78 69 73 74 73 20 6f 72 0d 0a 20 20  ly exists or..  
10ec0 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
10ed0 68 61 6c 74 20 74 68 65 20 65 6e 74 69 72 65 20  halt the entire 
10ee0 74 65 73 74 69 6e 67 20 70 72 6f 63 65 73 73 20  testing process 
10ef0 69 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 65  if it does not e
10f00 78 69 73 74 2e 0d 0a 20 20 20 20 20 20 20 20 20  xist...         
10f10 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66   #..          if
10f20 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20   {![info exists 
10f30 3a 3a 6e 6f 28 76 65 72 69 66 79 42 75 69 6c 64  ::no(verifyBuild
10f40 44 69 72 65 63 74 6f 72 79 29 5d 7d 20 74 68 65  Directory)]} the
10f50 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
10f60 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   #..            
10f70 23 20 4e 4f 54 45 3a 20 41 74 20 74 68 69 73 20  # NOTE: At this 
10f80 70 6f 69 6e 74 2c 20 74 68 65 20 62 75 69 6c 64  point, the build
10f90 20 64 69 72 65 63 74 6f 72 79 20 4d 55 53 54 20   directory MUST 
10fa0 65 78 69 73 74 20 61 73 20 61 0d 0a 20 20 20 20  exist as a..    
10fb0 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
10fc0 76 61 6c 69 64 20 64 69 72 65 63 74 6f 72 79 20  valid directory 
10fd0 66 6f 72 20 74 68 65 20 74 65 73 74 69 6e 67 20  for the testing 
10fe0 70 72 6f 63 65 73 73 20 74 6f 20 63 6f 6e 74 69  process to conti
10ff0 6e 75 65 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  nue...          
11000 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20    #..           
11010 20 73 65 74 20 64 69 72 65 63 74 6f 72 79 20 5b   set directory [
11020 67 65 74 42 75 69 6c 64 44 69 72 65 63 74 6f 72  getBuildDirector
11030 79 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  y]....          
11040 20 20 69 66 20 7b 21 5b 66 69 6c 65 20 65 78 69    if {![file exi
11050 73 74 73 20 24 64 69 72 65 63 74 6f 72 79 5d 20  sts $directory] 
11060 7c 7c 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  || \..          
11070 20 20 20 20 20 20 21 5b 66 69 6c 65 20 69 73 64        ![file isd
11080 69 72 65 63 74 6f 72 79 20 24 64 69 72 65 63 74  irectory $direct
11090 6f 72 79 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ory]} then {..  
110a0 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20              #.. 
110b0 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4e               # N
110c0 4f 54 45 3a 20 4a 75 73 74 20 70 72 69 6f 72 20  OTE: Just prior 
110d0 74 6f 20 61 63 74 75 61 6c 6c 79 20 68 61 6c 74  to actually halt
110e0 69 6e 67 20 74 68 65 20 74 65 73 74 69 6e 67 20  ing the testing 
110f0 70 72 6f 63 65 73 73 2c 0d 0a 20 20 20 20 20 20  process,..      
11100 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
11110 61 64 64 20 61 6e 20 65 72 72 6f 72 20 74 6f 20  add an error to 
11120 74 68 65 20 74 65 73 74 20 6c 6f 67 20 66 69 6c  the test log fil
11130 65 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  e...            
11140 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20    #..           
11150 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
11160 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  _channel [append
11170 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
11180 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
11190 63 6f 75 6c 64 20 6e 6f 74 20 76 65 72 69 66 79  could not verify
111a0 20 62 75 69 6c 64 20 64 69 72 65 63 74 6f 72 79   build directory
111b0 20 5c 22 22 20 24 64 69 72 65 63 74 6f 72 79 20   \"" $directory 
111c0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
111d0 20 20 20 20 20 22 5c 22 2c 20 61 6c 6c 20 74 65       "\", all te
111e0 73 74 69 6e 67 20 68 61 6c 74 65 64 5c 6e 22 5d  sting halted\n"]
111f0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
11200 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20    #..           
11210 20 20 20 23 20 4e 4f 54 45 3a 20 52 61 69 73 69     # NOTE: Raisi
11220 6e 67 20 61 20 73 63 72 69 70 74 20 65 72 72 6f  ng a script erro
11230 72 20 66 72 6f 6d 20 74 68 69 73 20 70 6f 69 6e  r from this poin
11240 74 20 73 68 6f 75 6c 64 20 68 61 6c 74 0d 0a 20  t should halt.. 
11250 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20 20               #  
11260 20 20 20 20 20 74 68 65 20 74 65 73 74 69 6e 67       the testing
11270 20 70 72 6f 63 65 73 73 2e 0d 0a 20 20 20 20 20   process...     
11280 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
11290 20 20 20 20 20 20 20 20 20 20 65 72 72 6f 72 20            error 
112a0 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
112b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
112c0 20 22 63 6f 75 6c 64 20 6e 6f 74 20 76 65 72 69   "could not veri
112d0 66 79 20 62 75 69 6c 64 20 64 69 72 65 63 74 6f  fy build directo
112e0 72 79 20 5c 22 22 20 24 64 69 72 65 63 74 6f 72  ry \"" $director
112f0 79 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  y \..           
11300 20 20 20 20 20 20 20 22 5c 22 2c 20 61 6c 6c 20         "\", all 
11310 74 65 73 74 69 6e 67 20 68 61 6c 74 65 64 22 5d  testing halted"]
11320 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
11330 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  .          }....
11340 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
11350 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53         # NOTE: S
11360 6b 69 70 20 74 72 79 69 6e 67 20 74 6f 20 63 6f  kip trying to co
11370 70 79 20 61 6e 79 20 66 69 6c 65 73 20 69 66 20  py any files if 
11380 77 65 20 61 72 65 20 73 6f 20 69 6e 73 74 72 75  we are so instru
11390 63 74 65 64 2e 0d 0a 20 20 20 20 20 20 20 20 20  cted...         
113a0 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66   #..          if
113b0 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20   {![info exists 
113c0 3a 3a 6e 6f 28 63 6f 70 79 53 71 6c 69 74 65 46  ::no(copySqliteF
113d0 69 6c 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a  iles)]} then {..
113e0 20 20 20 20 20 20 20 20 20 20 20 20 74 72 79 43              tryC
113f0 6f 70 79 41 73 73 65 6d 62 6c 79 20 73 71 6c 69  opyAssembly sqli
11400 74 65 33 2e 64 6c 6c 0d 0a 20 20 20 20 20 20 20  te3.dll..       
11410 20 20 20 20 20 74 72 79 43 6f 70 79 41 73 73 65       tryCopyAsse
11420 6d 62 6c 79 20 53 51 4c 69 74 65 2e 49 6e 74 65  mbly SQLite.Inte
11430 72 6f 70 2e 64 6c 6c 0d 0a 20 20 20 20 20 20 20  rop.dll..       
11440 20 20 20 20 20 74 72 79 43 6f 70 79 41 73 73 65       tryCopyAsse
11450 6d 62 6c 79 20 53 79 73 74 65 6d 2e 44 61 74 61  mbly System.Data
11460 2e 53 51 4c 69 74 65 2e 64 6c 6c 0d 0a 20 20 20  .SQLite.dll..   
11470 20 20 20 20 20 20 20 20 20 74 72 79 43 6f 70 79           tryCopy
11480 41 73 73 65 6d 62 6c 79 20 53 79 73 74 65 6d 2e  Assembly System.
11490 44 61 74 61 2e 53 51 4c 69 74 65 2e 4c 69 6e 71  Data.SQLite.Linq
114a0 2e 64 6c 6c 0d 0a 20 20 20 20 20 20 20 20 20 20  .dll..          
114b0 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 23  }....          #
114c0 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f  ..          # NO
114d0 54 45 3a 20 53 6b 69 70 20 74 72 79 69 6e 67 20  TE: Skip trying 
114e0 74 6f 20 6c 6f 61 64 20 61 6e 79 20 66 69 6c 65  to load any file
114f0 73 20 69 66 20 77 65 20 61 72 65 20 73 6f 20 69  s if we are so i
11500 6e 73 74 72 75 63 74 65 64 2e 0d 0a 20 20 20 20  nstructed...    
11510 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
11520 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78     if {![info ex
11530 69 73 74 73 20 3a 3a 6e 6f 28 6c 6f 61 64 53 71  ists ::no(loadSq
11540 6c 69 74 65 46 69 6c 65 73 29 5d 7d 20 74 68 65  liteFiles)]} the
11550 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
11560 20 74 72 79 4c 6f 61 64 41 73 73 65 6d 62 6c 79   tryLoadAssembly
11570 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c   System.Data.SQL
11580 69 74 65 2e 64 6c 6c 0d 0a 20 20 20 20 20 20 20  ite.dll..       
11590 20 20 20 20 20 74 72 79 4c 6f 61 64 41 73 73 65       tryLoadAsse
115a0 6d 62 6c 79 20 53 79 73 74 65 6d 2e 44 61 74 61  mbly System.Data
115b0 2e 53 51 4c 69 74 65 2e 4c 69 6e 71 2e 64 6c 6c  .SQLite.Linq.dll
115c0 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d  ..          }...
115d0 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
115e0 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
115f0 53 6b 69 70 20 74 72 79 69 6e 67 20 74 6f 20 64  Skip trying to d
11600 65 6c 65 74 65 20 65 78 74 65 72 6e 61 6c 20 66  elete external f
11610 69 6c 65 73 20 69 66 20 77 65 20 61 72 65 20 73  iles if we are s
11620 6f 20 69 6e 73 74 72 75 63 74 65 64 2e 0d 0a 20  o instructed... 
11630 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
11640 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f        if {![info
11650 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 64 65 6c   exists ::no(del
11660 65 74 65 53 71 6c 69 74 65 45 78 74 65 72 6e 61  eteSqliteExterna
11670 6c 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e 20 7b  lFiles)]} then {
11680 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 72  ..            tr
11690 79 44 65 6c 65 74 65 42 75 69 6c 64 46 69 6c 65  yDeleteBuildFile
116a0 20 49 6e 73 74 61 6c 6c 65 72 2e 65 78 65 2e 6d   Installer.exe.m
116b0 64 61 2e 63 6f 6e 66 69 67 0d 0a 20 20 20 20 20  da.config..     
116c0 20 20 20 20 20 20 20 74 72 79 44 65 6c 65 74 65         tryDelete
116d0 42 75 69 6c 64 46 69 6c 65 20 74 65 73 74 2e 65  BuildFile test.e
116e0 78 65 2e 6d 64 61 2e 63 6f 6e 66 69 67 0d 0a 20  xe.mda.config.. 
116f0 20 20 20 20 20 20 20 20 20 20 20 74 72 79 44 65             tryDe
11700 6c 65 74 65 42 75 69 6c 64 46 69 6c 65 20 74 65  leteBuildFile te
11710 73 74 6c 69 6e 71 2e 65 78 65 2e 6d 64 61 2e 63  stlinq.exe.mda.c
11720 6f 6e 66 69 67 0d 0a 20 20 20 20 20 20 20 20 20  onfig..         
11730 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   }....          
11740 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e  #..          # N
11750 4f 54 45 3a 20 53 6b 69 70 20 74 72 79 69 6e 67  OTE: Skip trying
11760 20 74 6f 20 63 6f 70 79 20 65 78 74 65 72 6e 61   to copy externa
11770 6c 20 66 69 6c 65 73 20 69 66 20 77 65 20 61 72  l files if we ar
11780 65 20 73 6f 20 69 6e 73 74 72 75 63 74 65 64 2e  e so instructed.
11790 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20  ..          #.. 
117a0 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69           if {![i
117b0 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28  nfo exists ::no(
117c0 63 6f 70 79 53 71 6c 69 74 65 45 78 74 65 72 6e  copySqliteExtern
117d0 61 6c 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e 20  alFiles)]} then 
117e0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23  {..            #
117f0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 20  ..            # 
11800 4e 4f 54 45 3a 20 43 6f 70 79 20 74 68 65 20 4d  NOTE: Copy the M
11810 44 41 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  DA configuration
11820 20 66 69 6c 65 20 66 6f 72 20 74 68 65 20 45 61   file for the Ea
11830 67 6c 65 20 73 68 65 6c 6c 20 74 6f 20 74 68 65  gle shell to the
11840 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 20  ..            # 
11850 20 20 20 20 20 20 62 75 69 6c 64 20 6f 75 74 70        build outp
11860 75 74 20 64 69 72 65 63 74 6f 72 79 3b 20 68 6f  ut directory; ho
11870 77 65 76 65 72 2c 20 75 73 65 20 74 68 65 20 6e  wever, use the n
11880 61 6d 65 20 6f 66 20 74 68 65 20 6c 65 67 61 63  ame of the legac
11890 79 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23  y..            #
118a0 20 20 20 20 20 20 20 74 65 73 74 20 65 78 65 63         test exec
118b0 75 74 61 62 6c 65 2e 20 20 54 68 69 73 20 77 69  utable.  This wi
118c0 6c 6c 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61  ll make sure tha
118d0 74 20 74 68 65 20 6c 65 67 61 63 79 20 74 65 73  t the legacy tes
118e0 74 73 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ts..            
118f0 23 20 20 20 20 20 20 20 72 75 6e 20 77 69 74 68  #       run with
11900 20 74 68 65 20 73 61 6d 65 20 73 65 74 20 6f 66   the same set of
11910 20 4d 44 41 73 20 63 6f 6e 66 69 67 75 72 65 64   MDAs configured
11920 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23  ...            #
11930 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 72  ..            tr
11940 79 43 6f 70 79 42 69 6e 61 72 79 46 69 6c 65 20  yCopyBinaryFile 
11950 45 61 67 6c 65 53 68 65 6c 6c 2e 65 78 65 2e 6d  EagleShell.exe.m
11960 64 61 2e 63 6f 6e 66 69 67 20 49 6e 73 74 61 6c  da.config Instal
11970 6c 65 72 2e 65 78 65 2e 6d 64 61 2e 63 6f 6e 66  ler.exe.mda.conf
11980 69 67 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ig..            
11990 74 72 79 43 6f 70 79 42 69 6e 61 72 79 46 69 6c  tryCopyBinaryFil
119a0 65 20 45 61 67 6c 65 53 68 65 6c 6c 2e 65 78 65  e EagleShell.exe
119b0 2e 6d 64 61 2e 63 6f 6e 66 69 67 20 74 65 73 74  .mda.config test
119c0 2e 65 78 65 2e 6d 64 61 2e 63 6f 6e 66 69 67 0d  .exe.mda.config.
119d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 72 79  .            try
119e0 43 6f 70 79 42 69 6e 61 72 79 46 69 6c 65 20 45  CopyBinaryFile E
119f0 61 67 6c 65 53 68 65 6c 6c 2e 65 78 65 2e 6d 64  agleShell.exe.md
11a00 61 2e 63 6f 6e 66 69 67 20 74 65 73 74 6c 69 6e  a.config testlin
11a10 71 2e 65 78 65 2e 6d 64 61 2e 63 6f 6e 66 69 67  q.exe.mda.config
11a20 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20  ..          }.. 
11a30 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
11a40 20 20 20 20 63 61 74 63 68 20 7b 0d 0a 20 20 20      catch {..   
11a50 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
11a60 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70  test_channel [ap
11a70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
11a80 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
11a90 66 69 6c 65 20 76 65 72 73 69 6f 6e 20 6f 66 20  file version of 
11aa0 5c 22 73 71 6c 69 74 65 33 2e 64 6c 6c 5c 22 2e  \"sqlite3.dll\".
11ab0 2e 2e 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20  .. " \..        
11ac0 20 20 20 20 20 20 5b 66 69 6c 65 20 76 65 72 73        [file vers
11ad0 69 6f 6e 20 5b 67 65 74 42 69 6e 61 72 79 46 69  ion [getBinaryFi
11ae0 6c 65 4e 61 6d 65 20 73 71 6c 69 74 65 33 2e 64  leName sqlite3.d
11af0 6c 6c 5d 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20 20  ll]] \n]..      
11b00 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 63    }....        c
11b10 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20  atch {..        
11b20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
11b30 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
11b40 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
11b50 20 20 20 20 20 22 2d 2d 2d 2d 20 66 69 6c 65 20       "---- file 
11b60 76 65 72 73 69 6f 6e 20 6f 66 20 5c 22 53 51 4c  version of \"SQL
11b70 69 74 65 2e 49 6e 74 65 72 6f 70 2e 64 6c 6c 5c  ite.Interop.dll\
11b80 22 2e 2e 2e 20 22 20 5c 0d 0a 20 20 20 20 20 20  "... " \..      
11b90 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20 76 65          [file ve
11ba0 72 73 69 6f 6e 20 5b 67 65 74 42 69 6e 61 72 79  rsion [getBinary
11bb0 46 69 6c 65 4e 61 6d 65 20 53 51 4c 69 74 65 2e  FileName SQLite.
11bc0 49 6e 74 65 72 6f 70 2e 64 6c 6c 5d 5d 20 5c 6e  Interop.dll]] \n
11bd0 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  ]..        }....
11be0 20 20 20 20 20 20 20 20 63 61 74 63 68 20 7b 0d          catch {.
11bf0 0a 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73  .          tputs
11c00 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
11c10 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
11c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d                "-
11c30 2d 2d 2d 20 66 69 6c 65 20 76 65 72 73 69 6f 6e  --- file version
11c40 20 6f 66 20 5c 22 53 79 73 74 65 6d 2e 44 61 74   of \"System.Dat
11c50 61 2e 53 51 4c 69 74 65 2e 64 6c 6c 5c 22 2e 2e  a.SQLite.dll\"..
11c60 2e 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  . " \..         
11c70 20 20 20 20 20 5b 66 69 6c 65 20 76 65 72 73 69       [file versi
11c80 6f 6e 20 5b 67 65 74 42 69 6e 61 72 79 46 69 6c  on [getBinaryFil
11c90 65 4e 61 6d 65 20 53 79 73 74 65 6d 2e 44 61 74  eName System.Dat
11ca0 61 2e 53 51 4c 69 74 65 2e 64 6c 6c 5d 5d 20 5c  a.SQLite.dll]] \
11cb0 6e 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d  n]..        }...
11cc0 0a 20 20 20 20 20 20 20 20 63 61 74 63 68 20 7b  .        catch {
11cd0 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70 75 74  ..          tput
11ce0 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
11cf0 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
11d00 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22  .              "
11d10 2d 2d 2d 2d 20 66 69 6c 65 20 76 65 72 73 69 6f  ---- file versio
11d20 6e 20 6f 66 20 5c 22 53 79 73 74 65 6d 2e 44 61  n of \"System.Da
11d30 74 61 2e 53 51 4c 69 74 65 2e 4c 69 6e 71 2e 64  ta.SQLite.Linq.d
11d40 6c 6c 5c 22 2e 2e 2e 20 22 20 5c 0d 0a 20 20 20  ll\"... " \..   
11d50 20 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65             [file
11d60 20 76 65 72 73 69 6f 6e 20 5b 67 65 74 42 69 6e   version [getBin
11d70 61 72 79 46 69 6c 65 4e 61 6d 65 20 53 79 73 74  aryFileName Syst
11d80 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 4c  em.Data.SQLite.L
11d90 69 6e 71 2e 64 6c 6c 5d 5d 20 5c 6e 5d 0d 0a 20  inq.dll]] \n].. 
11da0 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
11db0 20 20 20 20 73 65 74 20 61 73 73 65 6d 62 6c 69      set assembli
11dc0 65 73 20 5b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b  es [object invok
11dd0 65 20 41 70 70 44 6f 6d 61 69 6e 2e 43 75 72 72  e AppDomain.Curr
11de0 65 6e 74 44 6f 6d 61 69 6e 20 47 65 74 41 73 73  entDomain GetAss
11df0 65 6d 62 6c 69 65 73 5d 0d 0a 0d 0a 20 20 20 20  emblies]....    
11e00 20 20 20 20 6f 62 6a 65 63 74 20 66 6f 72 65 61      object forea
11e10 63 68 20 61 73 73 65 6d 62 6c 79 20 24 61 73 73  ch assembly $ass
11e20 65 6d 62 6c 69 65 73 20 7b 0d 0a 20 20 20 20 20  emblies {..     
11e30 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67       if {[string
11e40 20 6d 61 74 63 68 20 5c 7b 53 79 73 74 65 6d 2e   match \{System.
11e50 44 61 74 61 2e 53 51 4c 69 74 65 2a 20 24 61 73  Data.SQLite* $as
11e60 73 65 6d 62 6c 79 5d 7d 20 74 68 65 6e 20 7b 0d  sembly]} then {.
11e70 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75  .            tpu
11e80 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
11e90 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
11ea0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
11eb0 20 20 22 2d 2d 2d 2d 20 66 6f 75 6e 64 20 61 73    "---- found as
11ec0 73 65 6d 62 6c 79 3a 20 22 20 24 61 73 73 65 6d  sembly: " $assem
11ed0 62 6c 79 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20  bly \n]..       
11ee0 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d     }..        }.
11ef0 0a 0d 0a 20 20 20 20 20 20 20 20 63 61 74 63 68  ...        catch
11f00 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70   {..          tp
11f10 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  uts $::test_chan
11f20 6e 65 6c 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  nel \..         
11f30 20 20 20 20 20 22 2d 2d 2d 2d 20 64 65 66 69 6e       "---- defin
11f40 65 20 63 6f 6e 73 74 61 6e 74 73 20 66 6f 72 20  e constants for 
11f50 5c 22 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51  \"System.Data.SQ
11f60 4c 69 74 65 5c 22 2e 2e 2e 20 22 0d 0a 0d 0a 20  Lite\"... ".... 
11f70 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61           if {[ca
11f80 74 63 68 20 7b 6f 62 6a 65 63 74 20 69 6e 76 6f  tch {object invo
11f90 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75  ke -flags +NonPu
11fa0 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20 20 20  blic \..        
11fb0 20 20 20 20 20 20 20 20 20 20 53 79 73 74 65 6d            System
11fc0 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 53 51 4c  .Data.SQLite.SQL
11fd0 69 74 65 33 20 44 65 66 69 6e 65 43 6f 6e 73 74  ite3 DefineConst
11fe0 61 6e 74 73 7d 20 5c 0d 0a 20 20 20 20 20 20 20  ants} \..       
11ff0 20 20 20 20 20 20 20 20 20 20 20 64 65 66 69 6e             defin
12000 65 43 6f 6e 73 74 61 6e 74 73 5d 20 3d 3d 20 30  eConstants] == 0
12010 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
12020 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
12030 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70  est_channel [app
12040 65 6e 64 41 72 67 73 20 5b 66 6f 72 6d 61 74 4c  endArgs [formatL
12050 69 73 74 20 5b 6c 73 6f 72 74 20 5c 0d 0a 20 20  ist [lsort \..  
12060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 24 64                $d
12070 65 66 69 6e 65 43 6f 6e 73 74 61 6e 74 73 5d 20  efineConstants] 
12080 3c 6e 6f 6e 65 3e 5d 20 5c 6e 5d 0d 0a 20 20 20  <none>] \n]..   
12090 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d         } else {.
120a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75  .            tpu
120b0 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
120c0 65 6c 20 75 6e 6b 6e 6f 77 6e 5c 6e 0d 0a 20 20  el unknown\n..  
120d0 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
120e0 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
120f0 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20  catch {..       
12100 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
12110 5f 63 68 61 6e 6e 65 6c 20 5c 0d 0a 20 20 20 20  _channel \..    
12120 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
12130 73 6f 75 72 63 65 20 76 65 72 73 69 6f 6e 20 6f  source version o
12140 66 20 5c 22 53 79 73 74 65 6d 2e 44 61 74 61 2e  f \"System.Data.
12150 53 51 4c 69 74 65 2e 64 6c 6c 5c 22 2e 2e 2e 20  SQLite.dll\"... 
12160 22 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 69  "....          i
12170 66 20 7b 5b 63 61 74 63 68 20 7b 6f 62 6a 65 63  f {[catch {objec
12180 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20  t invoke -flags 
12190 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20  +NonPublic \..  
121a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
121b0 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
121c0 74 65 2e 53 51 4c 69 74 65 43 6f 6e 6e 65 63 74  te.SQLiteConnect
121d0 69 6f 6e 20 50 72 6f 76 69 64 65 72 56 65 72 73  ion ProviderVers
121e0 69 6f 6e 7d 20 5c 0d 0a 20 20 20 20 20 20 20 20  ion} \..        
121f0 20 20 20 20 20 20 20 20 20 20 76 65 72 73 69 6f            versio
12200 6e 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d  n] == 0} then {.
12210 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20  .            if 
12220 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20  {[string length 
12230 24 76 65 72 73 69 6f 6e 5d 20 3d 3d 20 30 7d 20  $version] == 0} 
12240 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
12250 20 20 20 20 20 20 73 65 74 20 76 65 72 73 69 6f        set versio
12260 6e 20 6e 75 6c 6c 0d 0a 20 20 20 20 20 20 20 20  n null..        
12270 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
12280 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
12290 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  _channel [append
122a0 41 72 67 73 20 24 76 65 72 73 69 6f 6e 20 5c 6e  Args $version \n
122b0 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 20 65  ]..          } e
122c0 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  lse {..         
122d0 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
122e0 5f 63 68 61 6e 6e 65 6c 20 75 6e 6b 6e 6f 77 6e  _channel unknown
122f0 5c 6e 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d  \n..          }.
12300 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  .        }....  
12310 20 20 20 20 20 20 63 61 74 63 68 20 7b 0d 0a 20        catch {.. 
12320 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
12330 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5c  ::test_channel \
12340 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
12350 22 2d 2d 2d 2d 20 73 6f 75 72 63 65 20 63 68 65  "---- source che
12360 63 6b 6f 75 74 20 6f 66 20 5c 22 53 79 73 74 65  ckout of \"Syste
12370 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 64 6c  m.Data.SQLite.dl
12380 6c 5c 22 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20  l\"... "....    
12390 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68        if {[catch
123a0 20 7b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20   {object invoke 
123b0 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69  -flags +NonPubli
123c0 63 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  c \..           
123d0 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61         System.Da
123e0 74 61 2e 53 51 4c 69 74 65 2e 53 51 4c 69 74 65  ta.SQLite.SQLite
123f0 43 6f 6e 6e 65 63 74 69 6f 6e 20 50 72 6f 76 69  Connection Provi
12400 64 65 72 53 6f 75 72 63 65 49 64 7d 20 5c 0d 0a  derSourceId} \..
12410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12420 20 20 73 6f 75 72 63 65 49 64 5d 20 3d 3d 20 30    sourceId] == 0
12430 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
12440 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e        if {[strin
12450 67 20 6c 65 6e 67 74 68 20 24 73 6f 75 72 63 65  g length $source
12460 49 64 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b  Id] == 0} then {
12470 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
12480 73 65 74 20 73 6f 75 72 63 65 49 64 20 6e 75 6c  set sourceId nul
12490 6c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  l..            }
124a0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70  ..            tp
124b0 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  uts $::test_chan
124c0 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
124d0 24 73 6f 75 72 63 65 49 64 20 5c 6e 5d 0d 0a 20  $sourceId \n].. 
124e0 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20           } else 
124f0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  {..            t
12500 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
12510 6e 6e 65 6c 20 75 6e 6b 6e 6f 77 6e 5c 6e 0d 0a  nnel unknown\n..
12520 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
12530 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
12540 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
12550 4f 54 45 3a 20 43 68 65 63 6b 20 74 68 65 20 61  OTE: Check the a
12560 76 61 69 6c 61 62 6c 65 20 62 75 69 6c 64 73 20  vailable builds 
12570 6f 66 20 53 51 4c 69 74 65 20 61 6e 64 20 53 79  of SQLite and Sy
12580 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
12590 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
125a0 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72 53 51        checkForSQ
125b0 4c 69 74 65 42 75 69 6c 64 73 20 24 3a 3a 74 65  LiteBuilds $::te
125c0 73 74 5f 63 68 61 6e 6e 65 6c 0d 0a 0d 0a 20 20  st_channel....  
125d0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
125e0 20 23 20 4e 4f 54 45 3a 20 4e 6f 77 2c 20 77 65   # NOTE: Now, we
125f0 20 6e 65 65 64 20 74 6f 20 6b 6e 6f 77 20 69 66   need to know if
12600 20 74 68 65 20 53 51 4c 69 74 65 20 63 6f 72 65   the SQLite core
12610 20 6c 69 62 72 61 72 79 20 69 73 20 61 76 61 69   library is avai
12620 6c 61 62 6c 65 0d 0a 20 20 20 20 20 20 20 20 23  lable..        #
12630 20 20 20 20 20 20 20 28 69 2e 65 2e 20 62 65 63         (i.e. bec
12640 61 75 73 65 20 74 68 65 20 6d 61 6e 61 67 65 64  ause the managed
12650 2d 6f 6e 6c 79 20 53 79 73 74 65 6d 2e 44 61 74  -only System.Dat
12660 61 2e 53 51 4c 69 74 65 20 61 73 73 65 6d 62 6c  a.SQLite assembl
12670 79 20 63 61 6e 0d 0a 20 20 20 20 20 20 20 20 23  y can..        #
12680 20 20 20 20 20 20 20 6c 6f 61 64 20 77 69 74 68         load with
12690 6f 75 74 20 69 74 3b 20 68 6f 77 65 76 65 72 2c  out it; however,
126a0 20 69 74 20 63 61 6e 6e 6f 74 20 64 6f 20 61 6e   it cannot do an
126b0 79 74 68 69 6e 67 20 75 73 65 66 75 6c 20 77 69  ything useful wi
126c0 74 68 6f 75 74 0d 0a 20 20 20 20 20 20 20 20 23  thout..        #
126d0 20 20 20 20 20 20 20 69 74 29 2e 20 20 49 66 20         it).  If 
126e0 77 65 20 61 72 65 20 75 73 69 6e 67 20 74 68 65  we are using the
126f0 20 6d 69 78 65 64 2d 6d 6f 64 65 20 61 73 73 65   mixed-mode asse
12700 6d 62 6c 79 20 61 6e 64 20 77 65 20 61 6c 72 65  mbly and we alre
12710 61 64 79 0d 0a 20 20 20 20 20 20 20 20 23 20 20  ady..        #  
12720 20 20 20 20 20 66 6f 75 6e 64 20 69 74 20 28 61       found it (a
12730 62 6f 76 65 29 2c 20 74 68 69 73 20 73 68 6f 75  bove), this shou
12740 6c 64 20 61 6c 77 61 79 73 20 73 75 63 63 65 65  ld always succee
12750 64 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  d...        #.. 
12760 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72 53         checkForS
12770 51 4c 69 74 65 4c 69 62 72 61 72 79 20 24 3a 3a  QLiteLibrary $::
12780 74 65 73 74 5f 63 68 61 6e 6e 65 6c 0d 0a 0d 0a  test_channel....
12790 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
127a0 20 20 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b     # NOTE: Check
127b0 20 69 66 20 74 68 65 20 53 51 4c 69 74 65 20 69   if the SQLite i
127c0 6e 74 65 72 6f 70 20 61 73 73 65 6d 62 6c 79 20  nterop assembly 
127d0 69 73 20 61 76 61 69 6c 61 62 6c 65 2e 0d 0a 20  is available... 
127e0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
127f0 20 20 63 68 65 63 6b 46 6f 72 53 51 4c 69 74 65    checkForSQLite
12800 49 6e 74 65 72 6f 70 20 24 3a 3a 74 65 73 74 5f  Interop $::test_
12810 63 68 61 6e 6e 65 6c 0d 0a 0d 0a 20 20 20 20 20  channel....     
12820 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
12830 4e 4f 54 45 3a 20 43 68 65 63 6b 20 74 68 65 20  NOTE: Check the 
12840 53 51 4c 69 74 65 20 64 61 74 61 62 61 73 65 20  SQLite database 
12850 61 6e 64 20 74 65 6d 70 6f 72 61 72 79 20 64 69  and temporary di
12860 72 65 63 74 6f 72 69 65 73 2e 0d 0a 20 20 20 20  rectories...    
12870 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 63      #..        c
12880 68 65 63 6b 46 6f 72 53 51 4c 69 74 65 44 69 72  heckForSQLiteDir
12890 65 63 74 6f 72 69 65 73 20 24 3a 3a 74 65 73 74  ectories $::test
128a0 5f 63 68 61 6e 6e 65 6c 0d 0a 0d 0a 20 20 20 20  _channel....    
128b0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
128c0 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74 20 74   NOTE: Attempt t
128d0 6f 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20 76  o determine if v
128e0 61 72 69 6f 75 73 20 63 6f 6d 70 69 6c 65 2d 74  arious compile-t
128f0 69 6d 65 20 6f 70 74 69 6f 6e 73 20 6e 65 65 64  ime options need
12900 65 64 20 66 6f 72 0d 0a 20 20 20 20 20 20 20 20  ed for..        
12910 23 20 20 20 20 20 20 20 74 65 73 74 20 63 6f 6e  #       test con
12920 73 74 72 61 69 6e 74 73 20 77 65 72 65 20 65 6e  straints were en
12930 61 62 6c 65 64 20 66 6f 72 20 74 68 65 20 6d 61  abled for the ma
12940 6e 61 67 65 64 20 61 73 73 65 6d 62 6c 79 2e 20  naged assembly. 
12950 20 54 68 65 72 65 0d 0a 20 20 20 20 20 20 20 20   There..        
12960 23 20 20 20 20 20 20 20 61 72 65 20 73 6f 6d 65  #       are some
12970 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70   compile-time op
12980 74 69 6f 6e 73 20 74 68 61 74 20 6d 75 73 74 20  tions that must 
12990 61 6c 73 6f 20 68 61 76 65 20 62 65 65 6e 20 65  also have been e
129a0 6e 61 62 6c 65 64 0d 0a 20 20 20 20 20 20 20 20  nabled..        
129b0 23 20 20 20 20 20 20 20 66 6f 72 20 74 68 65 20  #       for the 
129c0 69 6e 74 65 72 6f 70 20 61 73 73 65 6d 62 6c 79  interop assembly
129d0 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 62 65 20   in order to be 
129e0 65 66 66 65 63 74 69 76 65 2e 20 20 46 6f 72 20  effective.  For 
129f0 74 68 6f 73 65 0d 0a 20 20 20 20 20 20 20 20 23  those..        #
12a00 20 20 20 20 20 20 20 6f 70 74 69 6f 6e 73 2c 20         options, 
12a10 69 74 20 77 69 6c 6c 20 62 65 20 61 73 73 75 6d  it will be assum
12a20 65 64 20 74 68 61 74 20 69 74 20 77 61 73 20 65  ed that it was e
12a30 6e 61 62 6c 65 64 20 66 6f 72 20 74 68 65 20 69  nabled for the i
12a40 6e 74 65 72 6f 70 0d 0a 20 20 20 20 20 20 20 20  nterop..        
12a50 23 20 20 20 20 20 20 20 61 73 73 65 6d 62 6c 79  #       assembly
12a60 20 69 66 20 69 74 20 77 61 73 20 65 6e 61 62 6c   if it was enabl
12a70 65 64 20 66 6f 72 20 74 68 65 20 6d 61 6e 61 67  ed for the manag
12a80 65 64 20 61 73 73 65 6d 62 6c 79 2e 0d 0a 20 20  ed assembly...  
12a90 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
12aa0 20 66 6f 72 65 61 63 68 20 64 65 66 69 6e 65 43   foreach defineC
12ab0 6f 6e 73 74 61 6e 74 20 5b 6c 69 73 74 20 5c 0d  onstant [list \.
12ac0 0a 20 20 20 20 20 20 20 20 20 20 20 20 43 48 45  .            CHE
12ad0 43 4b 5f 53 54 41 54 45 20 43 4f 55 4e 54 5f 48  CK_STATE COUNT_H
12ae0 41 4e 44 4c 45 20 44 45 42 55 47 20 49 4e 54 45  ANDLE DEBUG INTE
12af0 52 4f 50 5f 43 4f 44 45 43 20 49 4e 54 45 52 4f  ROP_CODEC INTERO
12b00 50 5f 44 45 42 55 47 20 5c 0d 0a 20 20 20 20 20  P_DEBUG \..     
12b10 20 20 20 20 20 20 20 49 4e 54 45 52 4f 50 5f 45         INTEROP_E
12b20 58 54 45 4e 53 49 4f 4e 5f 46 55 4e 43 54 49 4f  XTENSION_FUNCTIO
12b30 4e 53 20 49 4e 54 45 52 4f 50 5f 4c 45 47 41 43  NS INTEROP_LEGAC
12b40 59 5f 43 4c 4f 53 45 20 49 4e 54 45 52 4f 50 5f  Y_CLOSE INTEROP_
12b50 4c 4f 47 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  LOG \..         
12b60 20 20 20 49 4e 54 45 52 4f 50 5f 54 45 53 54 5f     INTEROP_TEST_
12b70 45 58 54 45 4e 53 49 4f 4e 20 49 4e 54 45 52 4f  EXTENSION INTERO
12b80 50 5f 56 49 52 54 55 41 4c 5f 54 41 42 4c 45 20  P_VIRTUAL_TABLE 
12b90 4e 45 54 5f 32 30 20 4e 45 54 5f 33 35 20 5c 0d  NET_20 NET_35 \.
12ba0 0a 20 20 20 20 20 20 20 20 20 20 20 20 4e 45 54  .            NET
12bb0 5f 34 30 20 4e 45 54 5f 34 35 20 4e 45 54 5f 43  _40 NET_45 NET_C
12bc0 4f 4d 50 41 43 54 5f 32 30 20 50 4c 41 54 46 4f  OMPACT_20 PLATFO
12bd0 52 4d 5f 43 4f 4d 50 41 43 54 46 52 41 4d 45 57  RM_COMPACTFRAMEW
12be0 4f 52 4b 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ORK \..         
12bf0 20 20 20 50 52 45 4c 4f 41 44 5f 4e 41 54 49 56     PRELOAD_NATIV
12c00 45 5f 4c 49 42 52 41 52 59 20 52 45 54 41 52 47  E_LIBRARY RETARG
12c10 45 54 41 42 4c 45 20 53 51 4c 49 54 45 5f 53 54  ETABLE SQLITE_ST
12c20 41 4e 44 41 52 44 20 5c 0d 0a 20 20 20 20 20 20  ANDARD \..      
12c30 20 20 20 20 20 20 54 48 52 4f 57 5f 4f 4e 5f 44        THROW_ON_D
12c40 49 53 50 4f 53 45 44 20 54 52 41 43 45 20 54 52  ISPOSED TRACE TR
12c50 41 43 45 5f 43 4f 4e 4e 45 43 54 49 4f 4e 20 54  ACE_CONNECTION T
12c60 52 41 43 45 5f 48 41 4e 44 4c 45 20 5c 0d 0a 20  RACE_HANDLE \.. 
12c70 20 20 20 20 20 20 20 20 20 20 20 54 52 41 43 45             TRACE
12c80 5f 50 52 45 4c 4f 41 44 20 54 52 41 43 45 5f 53  _PRELOAD TRACE_S
12c90 54 41 54 45 4d 45 4e 54 20 54 52 41 43 45 5f 57  TATEMENT TRACE_W
12ca0 41 52 4e 49 4e 47 20 54 52 41 43 4b 5f 4d 45 4d  ARNING TRACK_MEM
12cb0 4f 52 59 5f 42 59 54 45 53 20 5c 0d 0a 20 20 20  ORY_BYTES \..   
12cc0 20 20 20 20 20 20 20 20 20 55 53 45 5f 49 4e 54           USE_INT
12cd0 45 52 4f 50 5f 44 4c 4c 20 55 53 45 5f 50 52 45  EROP_DLL USE_PRE
12ce0 50 41 52 45 5f 56 32 20 57 49 4e 44 4f 57 53 5d  PARE_V2 WINDOWS]
12cf0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d   {..          #.
12d00 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54  .          # NOT
12d10 45 3a 20 43 68 65 63 6b 20 69 66 20 74 68 65 20  E: Check if the 
12d20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74  compile-time opt
12d30 69 6f 6e 20 69 73 20 6c 69 73 74 65 64 20 69 6e  ion is listed in
12d40 20 74 68 65 20 6c 69 73 74 20 6f 66 0d 0a 20 20   the list of..  
12d50 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
12d60 22 64 65 66 69 6e 65 20 63 6f 6e 73 74 61 6e 74  "define constant
12d70 73 22 20 6b 65 70 74 20 74 72 61 63 6b 20 6f 66  s" kept track of
12d80 20 62 79 20 74 68 65 20 6d 61 6e 61 67 65 64 20   by the managed 
12d90 61 73 73 65 6d 62 6c 79 2e 0d 0a 20 20 20 20 20  assembly...     
12da0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
12db0 20 20 63 68 65 63 6b 46 6f 72 53 51 4c 69 74 65    checkForSQLite
12dc0 44 65 66 69 6e 65 43 6f 6e 73 74 61 6e 74 20 24  DefineConstant $
12dd0 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 24  ::test_channel $
12de0 64 65 66 69 6e 65 43 6f 6e 73 74 61 6e 74 0d 0a  defineConstant..
12df0 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
12e00 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
12e10 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 74 68  # NOTE: Check th
12e20 65 20 63 75 72 72 65 6e 74 20 62 75 69 6c 64 20  e current build 
12e30 79 65 61 72 2e 20 20 42 61 73 69 63 61 6c 6c 79  year.  Basically
12e40 2c 20 74 68 69 73 20 69 6e 64 69 63 61 74 65 73  , this indicates
12e50 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
12e60 20 20 77 68 69 63 68 20 76 65 72 73 69 6f 6e 20    which version 
12e70 6f 66 20 4d 53 42 75 69 6c 64 20 61 6e 64 2f 6f  of MSBuild and/o
12e80 72 20 56 69 73 75 61 6c 20 53 74 75 64 69 6f 20  r Visual Studio 
12e90 77 61 73 20 75 73 65 64 20 74 6f 0d 0a 20 20 20  was used to..   
12ea0 20 20 20 20 20 23 20 20 20 20 20 20 20 63 6f 6d       #       com
12eb0 70 69 6c 65 20 74 68 65 20 61 73 73 65 6d 62 6c  pile the assembl
12ec0 79 20 62 69 6e 61 72 69 65 73 20 75 6e 64 65 72  y binaries under
12ed0 20 74 65 73 74 2e 0d 0a 20 20 20 20 20 20 20 20   test...        
12ee0 23 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73  #..        tputs
12ef0 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
12f00 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
12f10 22 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e 67 20 66  "---- checking f
12f20 6f 72 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53  or System.Data.S
12f30 51 4c 69 74 65 20 62 75 69 6c 64 20 79 65 61 72  QLite build year
12f40 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 20 20 20  ... "....       
12f50 20 73 65 74 20 79 65 61 72 20 5b 67 65 74 42 75   set year [getBu
12f60 69 6c 64 59 65 61 72 5d 0d 0a 20 20 20 20 20 20  ildYear]..      
12f70 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20    addConstraint 
12f80 5b 61 70 70 65 6e 64 41 72 67 73 20 62 75 69 6c  [appendArgs buil
12f90 64 59 65 61 72 2e 20 24 79 65 61 72 5d 0d 0a 20  dYear. $year].. 
12fa0 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
12fb0 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70  test_channel [ap
12fc0 70 65 6e 64 41 72 67 73 20 5c 22 20 24 79 65 61  pendArgs \" $yea
12fd0 72 20 5c 22 5c 6e 5d 0d 0a 0d 0a 20 20 20 20 20  r \"\n]....     
12fe0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
12ff0 4e 4f 54 45 3a 20 43 68 65 63 6b 20 74 68 65 20  NOTE: Check the 
13000 63 75 72 72 65 6e 74 20 62 75 69 6c 64 20 63 6f  current build co
13010 6e 66 69 67 75 72 61 74 69 6f 6e 2e 20 20 54 68  nfiguration.  Th
13020 69 73 20 73 68 6f 75 6c 64 20 6e 6f 72 6d 61 6c  is should normal
13030 6c 79 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  ly..        #   
13040 20 20 20 20 62 65 20 65 69 74 68 65 72 20 22 44      be either "D
13050 65 62 75 67 22 20 6f 72 20 22 52 65 6c 65 61 73  ebug" or "Releas
13060 65 22 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  e"...        #..
13070 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
13080 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5c 0d  :test_channel \.
13090 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d  .            "--
130a0 2d 2d 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20  -- checking for 
130b0 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
130c0 74 65 20 62 75 69 6c 64 20 63 6f 6e 66 69 67 75  te build configu
130d0 72 61 74 69 6f 6e 2e 2e 2e 20 22 0d 0a 0d 0a 20  ration... ".... 
130e0 20 20 20 20 20 20 20 73 65 74 20 63 6f 6e 66 69         set confi
130f0 67 75 72 61 74 69 6f 6e 20 5b 67 65 74 42 75 69  guration [getBui
13100 6c 64 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 5d  ldConfiguration]
13110 0d 0a 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e  ..        addCon
13120 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41  straint [appendA
13130 72 67 73 20 62 75 69 6c 64 43 6f 6e 66 69 67 75  rgs buildConfigu
13140 72 61 74 69 6f 6e 2e 20 24 63 6f 6e 66 69 67 75  ration. $configu
13150 72 61 74 69 6f 6e 5d 0d 0a 20 20 20 20 20 20 20  ration]..       
13160 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
13170 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
13180 67 73 20 5c 22 20 24 63 6f 6e 66 69 67 75 72 61  gs \" $configura
13190 74 69 6f 6e 20 5c 22 5c 6e 5d 0d 0a 0d 0a 20 20  tion \"\n]....  
131a0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
131b0 20 23 20 4e 4f 54 45 3a 20 54 72 79 20 74 6f 20   # NOTE: Try to 
131c0 73 65 74 75 70 20 61 6e 20 69 6e 74 65 72 72 75  setup an interru
131d0 70 74 20 63 61 6c 6c 62 61 63 6b 20 75 73 69 6e  pt callback usin
131e0 67 20 74 68 65 20 73 63 72 69 70 74 20 64 65 62  g the script deb
131f0 75 67 67 65 72 0d 0a 20 20 20 20 20 20 20 20 23  ugger..        #
13200 20 20 20 20 20 20 20 74 68 61 74 20 77 69 6c 6c         that will
13210 20 63 61 6e 63 65 6c 20 61 6c 6c 20 53 51 4c 20   cancel all SQL 
13220 71 75 65 72 69 65 73 20 69 6e 20 70 72 6f 67 72  queries in progr
13230 65 73 73 20 66 6f 72 20 61 6c 6c 20 64 61 74 61  ess for all data
13240 62 61 73 65 0d 0a 20 20 20 20 20 20 20 20 23 20  base..        # 
13250 20 20 20 20 20 20 63 6f 6e 6e 65 63 74 69 6f 6e        connection
13260 73 20 6b 6e 6f 77 6e 20 74 6f 20 74 68 69 73 20  s known to this 
13270 69 6e 74 65 72 70 72 65 74 65 72 2e 0d 0a 20 20  interpreter...  
13280 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
13290 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73   if {![info exis
132a0 74 73 20 3a 3a 6e 6f 28 73 71 6c 69 74 65 49 6e  ts ::no(sqliteIn
132b0 74 65 72 72 75 70 74 43 61 6c 6c 62 61 63 6b 29  terruptCallback)
132c0 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
132d0 20 20 20 20 20 73 65 74 75 70 44 62 49 6e 74 65       setupDbInte
132e0 72 72 75 70 74 43 61 6c 6c 62 61 63 6b 20 24 3a  rruptCallback $:
132f0 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 24 3a  :test_channel $:
13300 3a 74 65 73 74 5f 6c 6f 67 0d 0a 20 20 20 20 20  :test_log..     
13310 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
13320 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
13330 45 3a 20 43 68 65 63 6b 20 66 6f 72 20 74 68 65  E: Check for the
13340 20 6e 61 74 69 76 65 20 72 75 6e 74 69 6d 65 20   native runtime 
13350 6f 70 74 69 6f 6e 2c 20 77 68 69 63 68 20 77 6f  option, which wo
13360 75 6c 64 20 6d 65 61 6e 20 77 65 20 61 72 65 0d  uld mean we are.
13370 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
13380 20 75 73 69 6e 67 20 74 68 65 20 6d 69 78 65 64   using the mixed
13390 2d 6d 6f 64 65 20 61 73 73 65 6d 62 6c 79 2e 0d  -mode assembly..
133a0 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
133b0 20 20 20 20 63 68 65 63 6b 46 6f 72 52 75 6e 74      checkForRunt
133c0 69 6d 65 4f 70 74 69 6f 6e 20 24 3a 3a 74 65 73  imeOption $::tes
133d0 74 5f 63 68 61 6e 6e 65 6c 20 6e 61 74 69 76 65  t_channel native
133e0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  ....        #.. 
133f0 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43         # NOTE: C
13400 68 65 63 6b 20 69 66 20 74 68 65 20 74 65 73 74  heck if the test
13410 20 73 75 69 74 65 20 73 68 6f 75 6c 64 20 63 6f   suite should co
13420 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  unt the number o
13430 66 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 0d 0a 20  f connections.. 
13440 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 22         #       "
13450 6f 70 65 6e 65 64 22 20 61 6e 64 20 22 63 6c 6f  opened" and "clo
13460 73 65 64 22 20 66 72 6f 6d 20 74 68 65 20 70 6f  sed" from the po
13470 6f 6c 20 77 68 65 6e 20 64 65 74 65 72 6d 69 6e  ol when determin
13480 69 6e 67 20 69 66 20 61 20 74 65 73 74 0d 0a 20  ing if a test.. 
13490 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 70         #       p
134a0 61 73 73 65 64 2e 20 20 44 69 73 61 62 6c 69 6e  assed.  Disablin
134b0 67 20 74 68 69 73 20 62 65 68 61 76 69 6f 72 20  g this behavior 
134c0 69 73 20 73 6f 6d 65 74 69 6d 65 73 20 6e 65 63  is sometimes nec
134d0 65 73 73 61 72 79 20 28 65 2e 67 2e 0d 0a 20 20  essary (e.g...  
134e0 20 20 20 20 20 20 23 20 20 20 20 20 20 20 64 75        #       du
134f0 72 69 6e 67 20 74 68 65 20 72 65 6c 65 61 73 65  ring the release
13500 20 74 65 73 74 69 6e 67 20 70 72 6f 63 65 73 73   testing process
13510 29 20 62 65 63 61 75 73 65 20 74 68 65 72 65 20  ) because there 
13520 61 72 65 20 73 65 76 65 72 61 6c 0d 0a 20 20 20  are several..   
13530 20 20 20 20 20 23 20 20 20 20 20 20 20 74 65 73       #       tes
13540 74 73 20 74 68 61 74 20 72 65 6c 79 20 6f 6e 20  ts that rely on 
13550 74 68 65 20 22 6f 70 65 6e 65 64 20 66 72 6f 6d  the "opened from
13560 20 70 6f 6f 6c 22 20 63 6f 75 6e 74 20 62 65 69   pool" count bei
13570 6e 67 20 67 72 65 61 74 65 72 0d 0a 20 20 20 20  ng greater..    
13580 20 20 20 20 23 20 20 20 20 20 20 20 74 68 61 6e      #       than
13590 20 7a 65 72 6f 2e 20 20 54 68 65 73 65 20 74 65   zero.  These te
135a0 73 74 73 20 6d 61 79 20 66 61 69 6c 20 64 75 65  sts may fail due
135b0 20 74 6f 20 74 68 65 20 6e 6f 6e 2d 64 65 74 65   to the non-dete
135c0 72 6d 69 6e 69 73 74 69 63 0d 0a 20 20 20 20 20  rministic..     
135d0 20 20 20 23 20 20 20 20 20 20 20 62 65 68 61 76     #       behav
135e0 69 6f 72 20 6f 66 20 74 68 65 20 43 4c 52 20 47  ior of the CLR G
135f0 43 2c 20 65 76 65 6e 20 77 68 65 6e 20 74 68 65  C, even when the
13600 72 65 20 69 73 20 6e 6f 20 62 75 67 20 69 6e 20  re is no bug in 
13610 74 68 65 20 63 6f 64 65 0d 0a 20 20 20 20 20 20  the code..      
13620 20 20 23 20 20 20 20 20 20 20 62 65 69 6e 67 20    #       being 
13630 74 65 73 74 65 64 2e 0d 0a 20 20 20 20 20 20 20  tested...       
13640 20 23 0d 0a 20 20 20 20 20 20 20 20 63 68 65 63   #..        chec
13650 6b 46 6f 72 52 75 6e 74 69 6d 65 4f 70 74 69 6f  kForRuntimeOptio
13660 6e 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  n $::test_channe
13670 6c 20 6e 6f 50 6f 6f 6c 43 6f 75 6e 74 73 0d 0a  l noPoolCounts..
13680 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
13690 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 52 65 70       # NOTE: Rep
136a0 6f 72 74 20 74 68 65 20 72 65 73 6f 75 72 63 65  ort the resource
136b0 20 75 73 61 67 65 20 70 72 69 6f 72 20 74 6f 20   usage prior to 
136c0 72 75 6e 6e 69 6e 67 20 61 6e 79 20 74 65 73 74  running any test
136d0 73 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  s...        #.. 
136e0 20 20 20 20 20 20 20 72 65 70 6f 72 74 53 51 4c         reportSQL
136f0 69 74 65 52 65 73 6f 75 72 63 65 73 20 24 3a 3a  iteResources $::
13700 74 65 73 74 5f 63 68 61 6e 6e 65 6c 0d 0a 0d 0a  test_channel....
13710 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
13720 20 20 20 23 20 4e 4f 54 45 3a 20 53 68 6f 77 20     # NOTE: Show 
13730 74 68 65 20 61 63 74 69 76 65 20 74 65 73 74 20  the active test 
13740 63 6f 6e 73 74 72 61 69 6e 74 73 2e 0d 0a 20 20  constraints...  
13750 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
13760 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
13770 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
13780 67 73 20 22 2d 2d 2d 2d 20 63 6f 6e 73 74 72 61  gs "---- constra
13790 69 6e 74 73 3a 20 22 20 5c 0d 0a 20 20 20 20 20  ints: " \..     
137a0 20 20 20 20 20 20 20 5b 66 6f 72 6d 61 74 4c 69         [formatLi
137b0 73 74 20 5b 6c 73 6f 72 74 20 5b 67 65 74 43 6f  st [lsort [getCo
137c0 6e 73 74 72 61 69 6e 74 73 5d 5d 20 3c 6e 6f 6e  nstraints]] <non
137d0 65 3e 5d 20 5c 6e 5d 0d 0a 0d 0a 20 20 20 20 20  e>] \n]....     
137e0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
137f0 4e 4f 54 45 3a 20 53 61 76 65 20 74 68 65 20 74  NOTE: Save the t
13800 65 73 74 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  est constraints 
13810 66 6f 72 20 75 73 65 20 62 79 20 74 68 72 65 61  for use by threa
13820 64 73 20 63 72 65 61 74 65 64 20 69 6e 20 74 68  ds created in th
13830 69 73 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  is..        #   
13840 20 20 20 20 61 70 70 6c 69 63 61 74 69 6f 6e 20      application 
13850 64 6f 6d 61 69 6e 2e 20 20 54 68 69 73 20 69 73  domain.  This is
13860 20 6e 65 63 65 73 73 61 72 79 20 62 65 63 61 75   necessary becau
13870 73 65 20 61 6c 6c 20 74 68 65 20 45 61 67 6c 65  se all the Eagle
13880 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
13890 20 20 22 74 65 73 74 20 63 6f 6e 74 65 78 74 22    "test context"
138a0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20   information is 
138b0 70 65 72 2d 74 68 72 65 61 64 2e 0d 0a 20 20 20  per-thread...   
138c0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
138d0 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74  if {![info exist
138e0 73 20 3a 3a 74 65 73 74 5f 63 6f 6e 73 74 72 61  s ::test_constra
138f0 69 6e 74 73 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  ints]} then {.. 
13900 20 20 20 20 20 20 20 20 20 73 65 74 20 3a 3a 74           set ::t
13910 65 73 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20  est_constraints 
13920 24 3a 3a 65 61 67 6c 65 5f 74 65 73 74 73 28 63  $::eagle_tests(c
13930 6f 6e 73 74 72 61 69 6e 74 73 29 0d 0a 20 20 20  onstraints)..   
13940 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
13950 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
13960 4f 54 45 3a 20 4c 6f 61 64 20 74 68 65 20 22 61  OTE: Load the "a
13970 66 74 65 72 2d 63 6f 6e 73 74 72 61 69 6e 74 73  fter-constraints
13980 22 20 63 75 73 74 6f 6d 20 70 65 72 2d 75 73 65  " custom per-use
13990 72 20 61 6e 64 2f 6f 72 20 70 65 72 2d 68 6f 73  r and/or per-hos
139a0 74 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  t..        #    
139b0 20 20 20 74 65 73 74 20 73 65 74 74 69 6e 67 73     test settings
139c0 20 6e 6f 77 2e 0d 0a 20 20 20 20 20 20 20 20 23   now...        #
139d0 0d 0a 20 20 20 20 20 20 20 20 75 70 6c 65 76 65  ..        upleve
139e0 6c 20 31 20 5b 6c 69 73 74 20 6c 6f 61 64 53 51  l 1 [list loadSQ
139f0 4c 69 74 65 54 65 73 74 53 65 74 74 69 6e 67 73  LiteTestSettings
13a00 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
13a10 20 2e 61 66 74 65 72 5d 0d 0a 0d 0a 20 20 20 20   .after]....    
13a20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
13a30 20 4e 4f 54 45 3a 20 53 68 6f 77 20 77 68 65 6e   NOTE: Show when
13a40 20 6f 75 72 20 74 65 73 74 73 20 61 63 74 75 61   our tests actua
13a50 6c 6c 79 20 62 65 67 61 6e 20 28 6e 6f 77 29 2e  lly began (now).
13a60 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
13a70 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
13a80 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
13a90 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
13aa0 20 20 20 20 20 20 22 2d 2d 2d 2d 20 53 79 73 74        "---- Syst
13ab0 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 20 74  em.Data.SQLite t
13ac0 65 73 74 73 20 62 65 67 61 6e 20 61 74 20 22 20  ests began at " 
13ad0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b  \..            [
13ae0 63 6c 6f 63 6b 20 66 6f 72 6d 61 74 20 5b 63 6c  clock format [cl
13af0 6f 63 6b 20 73 65 63 6f 6e 64 73 5d 5d 20 5c 6e  ock seconds]] \n
13b00 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  ]..      }..    
13b10 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 72  }.....    proc r
13b20 75 6e 53 51 4c 69 74 65 54 65 73 74 45 70 69 6c  unSQLiteTestEpil
13b30 6f 67 75 65 20 7b 7d 20 7b 0d 0a 20 20 20 20 20  ogue {} {..     
13b40 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
13b50 3a 20 53 6b 69 70 20 72 75 6e 6e 69 6e 67 20 6f  : Skip running o
13b60 75 72 20 63 75 73 74 6f 6d 20 65 70 69 6c 6f 67  ur custom epilog
13b70 75 65 20 69 66 20 74 68 65 20 6d 61 69 6e 20 6f  ue if the main o
13b80 6e 65 20 68 61 73 20 62 65 65 6e 0d 0a 20 20 20  ne has been..   
13b90 20 20 20 23 20 20 20 20 20 20 20 73 6b 69 70 70     #       skipp
13ba0 65 64 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  ed...      #..  
13bb0 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65      if {![info e
13bc0 78 69 73 74 73 20 3a 3a 6e 6f 28 65 70 69 6c 6f  xists ::no(epilo
13bd0 67 75 65 2e 65 61 67 6c 65 29 5d 7d 20 74 68 65  gue.eagle)]} the
13be0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  n {..        #..
13bf0 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
13c00 53 68 6f 77 20 77 68 65 6e 20 6f 75 72 20 74 65  Show when our te
13c10 73 74 73 20 61 63 74 75 61 6c 6c 79 20 65 6e 64  sts actually end
13c20 65 64 20 28 6e 6f 77 29 2e 0d 0a 20 20 20 20 20  ed (now)...     
13c30 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 74 70     #..        tp
13c40 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  uts $::test_chan
13c50 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
13c60 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22  \..            "
13c70 2d 2d 2d 2d 20 53 79 73 74 65 6d 2e 44 61 74 61  ---- System.Data
13c80 2e 53 51 4c 69 74 65 20 74 65 73 74 73 20 65 6e  .SQLite tests en
13c90 64 65 64 20 61 74 20 22 20 5c 0d 0a 20 20 20 20  ded at " \..    
13ca0 20 20 20 20 20 20 20 20 5b 63 6c 6f 63 6b 20 66          [clock f
13cb0 6f 72 6d 61 74 20 5b 63 6c 6f 63 6b 20 73 65 63  ormat [clock sec
13cc0 6f 6e 64 73 5d 5d 20 5c 6e 5d 0d 0a 0d 0a 20 20  onds]] \n]....  
13cd0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
13ce0 20 23 20 42 55 47 46 49 58 3a 20 42 65 66 6f 72   # BUGFIX: Befor
13cf0 65 20 63 68 65 63 6b 69 6e 67 20 74 68 65 20 66  e checking the f
13d00 69 6e 61 6c 20 72 65 73 6f 75 72 63 65 73 20 69  inal resources i
13d10 6e 20 75 73 65 20 62 79 20 53 51 4c 69 74 65 2c  n use by SQLite,
13d20 20 6d 61 6b 65 0d 0a 20 20 20 20 20 20 20 20 23   make..        #
13d30 20 20 20 20 20 20 20 20 20 73 75 72 65 20 62 6f           sure bo
13d40 74 68 20 6f 66 20 74 68 65 20 50 52 41 47 4d 41  th of the PRAGMA
13d50 20 72 65 6c 61 74 65 64 20 64 69 72 65 63 74 6f   related directo
13d60 72 79 20 6e 61 6d 65 73 20 61 72 65 20 66 72 65  ry names are fre
13d70 65 64 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  ed...        #..
13d80 20 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72          checkFor
13d90 53 51 4c 69 74 65 44 69 72 65 63 74 6f 72 69 65  SQLiteDirectorie
13da0 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
13db0 6c 20 74 72 75 65 0d 0a 0d 0a 20 20 20 20 20 20  l true....      
13dc0 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
13dd0 4f 54 45 3a 20 41 6c 73 6f 20 72 65 70 6f 72 74  OTE: Also report
13de0 20 74 68 65 20 72 65 73 6f 75 72 63 65 20 75 73   the resource us
13df0 61 67 65 20 61 66 74 65 72 20 72 75 6e 6e 69 6e  age after runnin
13e00 67 20 74 68 65 20 74 65 73 74 73 2e 0d 0a 20 20  g the tests...  
13e10 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
13e20 20 72 65 70 6f 72 74 53 51 4c 69 74 65 52 65 73   reportSQLiteRes
13e30 6f 75 72 63 65 73 20 24 3a 3a 74 65 73 74 5f 63  ources $::test_c
13e40 68 61 6e 6e 65 6c 0d 0a 0d 0a 20 20 20 20 20 20  hannel....      
13e50 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
13e60 4f 54 45 3a 20 52 65 70 6f 72 74 20 74 68 65 20  OTE: Report the 
13e70 63 72 69 74 69 63 61 6c 20 68 61 6e 64 6c 65 20  critical handle 
13e80 63 6f 75 6e 74 73 20 61 66 74 65 72 20 72 75 6e  counts after run
13e90 6e 69 6e 67 20 74 68 65 20 74 65 73 74 73 2e 0d  ning the tests..
13ea0 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
13eb0 20 20 20 20 67 65 74 53 51 4c 69 74 65 48 61 6e      getSQLiteHan
13ec0 64 6c 65 43 6f 75 6e 74 73 20 24 3a 3a 74 65 73  dleCounts $::tes
13ed0 74 5f 63 68 61 6e 6e 65 6c 0d 0a 20 20 20 20 20  t_channel..     
13ee0 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20   }..    }.....  
13ef0 20 20 23 23 23 23 23 23 23 23 23 23 23 23 23 23    ##############
13f00 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
13f10 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
13f20 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
13f30 23 23 23 23 23 23 23 23 23 23 23 23 23 0d 0a 20  #############.. 
13f40 20 20 20 23 23 23 23 23 23 23 23 23 23 23 23 23     #############
13f50 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
13f60 20 45 4e 44 20 45 61 67 6c 65 20 4f 4e 4c 59 20   END Eagle ONLY 
13f70 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
13f80 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0d 0a  ##############..
13f90 20 20 20 20 23 23 23 23 23 23 23 23 23 23 23 23      ############
13fa0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
13fb0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
13fc0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
13fd0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0d  ###############.
13fe0 0a 20 20 7d 0d 0a 0d 0a 20 20 23 0d 0a 20 20 23  .  }....  #..  #
13ff0 20 4e 4f 54 45 3a 20 53 61 76 65 20 74 68 65 20   NOTE: Save the 
14000 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 69 72 65  name of the dire
14010 63 74 6f 72 79 20 63 6f 6e 74 61 69 6e 69 6e 67  ctory containing
14020 20 74 68 69 73 20 66 69 6c 65 2e 0d 0a 20 20 23   this file...  #
14030 0d 0a 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65  ..  if {![info e
14040 78 69 73 74 73 20 63 6f 6d 6d 6f 6e 5f 64 69 72  xists common_dir
14050 65 63 74 6f 72 79 5d 7d 20 74 68 65 6e 20 7b 0d  ectory]} then {.
14060 0a 20 20 20 20 73 65 74 20 63 6f 6d 6d 6f 6e 5f  .    set common_
14070 64 69 72 65 63 74 6f 72 79 20 5b 66 69 6c 65 20  directory [file 
14080 64 69 72 6e 61 6d 65 20 5b 69 6e 66 6f 20 73 63  dirname [info sc
14090 72 69 70 74 5d 5d 0d 0a 20 20 7d 0d 0a 0d 0a 20  ript]]..  }.... 
140a0 20 23 0d 0a 20 20 23 20 4e 4f 54 45 3a 20 50 72   #..  # NOTE: Pr
140b0 6f 76 69 64 65 20 74 68 65 20 53 79 73 74 65 6d  ovide the System
140c0 2e 44 61 74 61 2e 53 51 4c 69 74 65 20 74 65 73  .Data.SQLite tes
140d0 74 20 70 61 63 6b 61 67 65 20 74 6f 20 74 68 65  t package to the
140e0 20 69 6e 74 65 72 70 72 65 74 65 72 2e 0d 0a 20   interpreter... 
140f0 20 23 0d 0a 20 20 70 61 63 6b 61 67 65 20 70 72   #..  package pr
14100 6f 76 69 64 65 20 53 79 73 74 65 6d 2e 44 61 74  ovide System.Dat
14110 61 2e 53 51 4c 69 74 65 2e 54 65 73 74 20 31 2e  a.SQLite.Test 1.
14120 30 0d 0a 7d 0d 0a                                0..}..