System.Data.SQLite
Hex Artifact Content
Not logged in

Artifact 9d1fad2c8cefe61a9f96eea1b82cb5aa53c21258:


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 20 6f 6e 0d 0a 20 20 20  er (e.g. on..   
03a0: 20 20 20 23 20 20 20 20 20 20 20 74 68 65 20 63     #       the c
03b0: 6f 6d 6d 61 6e 64 20 6c 69 6e 65 29 2e 20 20 54  ommand line).  T
03c0: 68 69 73 20 68 65 6c 70 73 20 63 6f 6e 74 72 6f  his helps contro
03d0: 6c 20 65 78 61 63 74 6c 79 20 77 68 69 63 68 20  l exactly which 
03e0: 73 65 74 20 6f 66 0d 0a 20 20 20 20 20 20 23 20  set of..      # 
03f0: 20 20 20 20 20 20 62 69 6e 61 72 69 65 73 20 77        binaries w
0400: 65 20 61 72 65 20 74 65 73 74 69 6e 67 2c 20 74  e are testing, t
0410: 68 6f 73 65 20 70 72 6f 64 75 63 65 64 20 75 73  hose produced us
0420: 69 6e 67 20 74 68 65 20 56 69 73 75 61 6c 20 53  ing the Visual S
0430: 74 75 64 69 6f 0d 0a 20 20 20 20 20 20 23 20 20  tudio..      #  
0440: 20 20 20 20 20 32 30 30 35 2c 20 32 30 30 38 2c       2005, 2008,
0450: 20 32 30 31 30 2c 20 6f 72 20 32 30 31 32 20 62   2010, or 2012 b
0460: 75 69 6c 64 20 73 79 73 74 65 6d 73 2e 20 20 54  uild systems.  T
0470: 6f 20 6f 76 65 72 72 69 64 65 20 74 68 69 73 20  o override this 
0480: 76 61 6c 75 65 0d 0a 20 20 20 20 20 20 23 20 20  value..      #  
0490: 20 20 20 20 20 76 69 61 20 74 68 65 20 63 6f 6d       via the com
04a0: 6d 61 6e 64 20 6c 69 6e 65 2c 20 65 6e 74 65 72  mand line, enter
04b0: 20 61 20 63 6f 6d 6d 61 6e 64 20 73 69 6d 69 6c   a command simil
04c0: 61 72 20 74 6f 20 6f 6e 65 20 6f 66 20 74 68 65  ar to one of the
04d0: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
04e0: 66 6f 6c 6c 6f 77 69 6e 67 20 28 61 6c 6c 20 6f  following (all o
04f0: 6e 20 6f 6e 65 20 6c 69 6e 65 29 3a 0d 0a 20 20  n one line):..  
0500: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 20      #..      #  
0510: 20 20 20 20 20 45 61 67 6c 65 53 68 65 6c 6c 2e       EagleShell.
0520: 65 78 65 20 2d 70 72 65 49 6e 69 74 69 61 6c 69  exe -preInitiali
0530: 7a 65 20 22 73 65 74 20 74 65 73 74 5f 79 65 61  ze "set test_yea
0540: 72 20 32 30 30 35 22 0d 0a 20 20 20 20 20 20 23  r 2005"..      #
0550: 20 20 20 20 20 20 20 20 20 2d 66 69 6c 65 20 2e           -file .
0560: 5c 70 61 74 68 5c 74 6f 5c 61 6c 6c 2e 65 61 67  \path\to\all.eag
0570: 6c 65 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  le..      #..   
0580: 20 20 20 23 20 20 20 20 20 20 20 45 61 67 6c 65     #       Eagle
0590: 53 68 65 6c 6c 2e 65 78 65 20 2d 70 72 65 49 6e  Shell.exe -preIn
05a0: 69 74 69 61 6c 69 7a 65 20 22 73 65 74 20 74 65  itialize "set te
05b0: 73 74 5f 79 65 61 72 20 32 30 30 38 22 0d 0a 20  st_year 2008".. 
05c0: 20 20 20 20 20 23 20 20 20 20 20 20 20 20 20 2d       #         -
05d0: 66 69 6c 65 20 2e 5c 70 61 74 68 5c 74 6f 5c 61  file .\path\to\a
05e0: 6c 6c 2e 65 61 67 6c 65 0d 0a 20 20 20 20 20 20  ll.eagle..      
05f0: 23 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  #..      #      
0600: 20 45 61 67 6c 65 53 68 65 6c 6c 2e 65 78 65 20   EagleShell.exe 
0610: 2d 70 72 65 49 6e 69 74 69 61 6c 69 7a 65 20 22  -preInitialize "
0620: 73 65 74 20 74 65 73 74 5f 79 65 61 72 20 32 30  set test_year 20
0630: 31 30 22 0d 0a 20 20 20 20 20 20 23 20 20 20 20  10"..      #    
0640: 20 20 20 20 20 2d 66 69 6c 65 20 2e 5c 70 61 74       -file .\pat
0650: 68 5c 74 6f 5c 61 6c 6c 2e 65 61 67 6c 65 0d 0a  h\to\all.eagle..
0660: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
0670: 20 20 20 20 20 20 20 45 61 67 6c 65 53 68 65 6c         EagleShel
0680: 6c 2e 65 78 65 20 2d 70 72 65 49 6e 69 74 69 61  l.exe -preInitia
0690: 6c 69 7a 65 20 22 73 65 74 20 74 65 73 74 5f 79  lize "set test_y
06a0: 65 61 72 20 32 30 31 32 22 0d 0a 20 20 20 20 20  ear 2012"..     
06b0: 20 23 20 20 20 20 20 20 20 20 20 2d 66 69 6c 65   #         -file
06c0: 20 2e 5c 70 61 74 68 5c 74 6f 5c 61 6c 6c 2e 65   .\path\to\all.e
06d0: 61 67 6c 65 0d 0a 20 20 20 20 20 20 23 0d 0a 20  agle..      #.. 
06e0: 20 20 20 20 20 23 20 20 20 20 20 20 20 45 61 67       #       Eag
06f0: 6c 65 53 68 65 6c 6c 2e 65 78 65 20 2d 70 72 65  leShell.exe -pre
0700: 49 6e 69 74 69 61 6c 69 7a 65 20 22 75 6e 73 65  Initialize "unse
0710: 74 20 2d 6e 6f 63 6f 6d 70 6c 61 69 6e 20 74 65  t -nocomplain te
0720: 73 74 5f 79 65 61 72 22 0d 0a 20 20 20 20 20 20  st_year"..      
0730: 23 20 20 20 20 20 20 20 20 20 2d 66 69 6c 65 20  #         -file 
0740: 2e 5c 70 61 74 68 5c 74 6f 5c 61 6c 6c 2e 65 61  .\path\to\all.ea
0750: 67 6c 65 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  gle..      #..  
0760: 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78      if {[info ex
0770: 69 73 74 73 20 3a 3a 74 65 73 74 5f 79 65 61 72  ists ::test_year
0780: 5d 20 26 26 20 5b 73 74 72 69 6e 67 20 6c 65 6e  ] && [string len
0790: 67 74 68 20 24 3a 3a 74 65 73 74 5f 79 65 61 72  gth $::test_year
07a0: 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20  ] > 0} then {.. 
07b0: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
07c0: 20 20 23 20 4e 4f 54 45 3a 20 55 73 65 20 74 68    # NOTE: Use th
07d0: 65 20 73 70 65 63 69 66 69 65 64 20 74 65 73 74  e specified test
07e0: 20 79 65 61 72 2e 20 20 49 66 20 74 68 69 73 20   year.  If this 
07f0: 76 61 72 69 61 62 6c 65 20 69 73 20 6e 6f 74 20  variable is not 
0800: 73 65 74 2c 20 74 68 65 0d 0a 20 20 20 20 20 20  set, the..      
0810: 20 20 23 20 20 20 20 20 20 20 64 65 66 61 75 6c    #       defaul
0820: 74 20 76 61 6c 75 65 20 77 69 6c 6c 20 62 65 20  t value will be 
0830: 62 61 73 65 64 20 6f 6e 20 77 68 65 74 68 65 72  based on whether
0840: 20 6f 72 20 6e 6f 74 20 45 61 67 6c 65 20 68 61   or not Eagle ha
0850: 73 20 62 65 65 6e 0d 0a 20 20 20 20 20 20 20 20  s been..        
0860: 23 20 20 20 20 20 20 20 63 6f 6d 70 69 6c 65 64  #       compiled
0870: 20 61 67 61 69 6e 73 74 20 74 68 65 20 43 4c 52   against the CLR
0880: 20 76 32 2e 30 20 6f 72 20 43 4c 52 20 76 34 2e   v2.0 or CLR v4.
0890: 30 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  0...        #.. 
08a0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 3a         return $:
08b0: 3a 74 65 73 74 5f 79 65 61 72 0d 0a 20 20 20 20  :test_year..    
08c0: 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
08d0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
08e0: 20 4e 4f 54 45 3a 20 49 66 20 45 61 67 6c 65 20   NOTE: If Eagle 
08f0: 68 61 73 20 62 65 65 6e 20 63 6f 6d 70 69 6c 65  has been compile
0900: 64 20 61 67 61 69 6e 73 74 20 74 68 65 20 43 4c  d against the CL
0910: 52 20 76 34 2e 30 2c 20 75 73 65 20 22 32 30 31  R v4.0, use "201
0920: 30 22 20 62 79 0d 0a 20 20 20 20 20 20 20 20 23  0" by..        #
0930: 20 20 20 20 20 20 20 64 65 66 61 75 6c 74 20 28         default (
0940: 77 65 20 63 6f 75 6c 64 20 75 73 65 20 22 32 30  we could use "20
0950: 31 32 22 20 69 6e 20 74 68 61 74 20 63 61 73 65  12" in that case
0960: 20 61 73 20 77 65 6c 6c 29 20 61 73 20 74 68 65   as well) as the
0970: 20 74 65 73 74 0d 0a 20 20 20 20 20 20 20 20 23   test..        #
0980: 20 20 20 20 20 20 20 79 65 61 72 3b 20 6f 74 68         year; oth
0990: 65 72 77 69 73 65 2c 20 75 73 65 20 22 32 30 30  erwise, use "200
09a0: 38 22 20 62 79 20 64 65 66 61 75 6c 74 20 28 77  8" by default (w
09b0: 65 20 63 6f 75 6c 64 20 75 73 65 20 22 32 30 30  e could use "200
09c0: 35 22 20 69 6e 0d 0a 20 20 20 20 20 20 20 20 23  5" in..        #
09d0: 20 20 20 20 20 20 20 74 68 61 74 20 63 61 73 65         that case
09e0: 20 61 73 20 77 65 6c 6c 29 2e 20 20 49 66 20 61   as well).  If a
09f0: 6e 6f 74 68 65 72 20 6d 61 6a 6f 72 20 5b 69 6e  nother major [in
0a00: 63 6f 6d 70 61 74 69 62 6c 65 5d 20 76 65 72 73  compatible] vers
0a10: 69 6f 6e 20 6f 66 0d 0a 20 20 20 20 20 20 20 20  ion of..        
0a20: 23 20 20 20 20 20 20 20 74 68 65 20 43 4c 52 20  #       the CLR 
0a30: 69 73 20 72 65 6c 65 61 73 65 64 2c 20 74 68 69  is released, thi
0a40: 73 20 63 68 65 63 6b 20 77 69 6c 6c 20 68 61 76  s check will hav
0a50: 65 20 74 6f 20 62 65 20 63 68 61 6e 67 65 64 2e  e to be changed.
0a60: 20 20 54 68 65 0d 0a 20 20 20 20 20 20 20 20 23    The..        #
0a70: 20 20 20 20 20 20 20 64 65 66 61 75 6c 74 20 74         default t
0a80: 65 73 74 20 79 65 61 72 20 74 6f 20 75 73 65 20  est year to use 
0a90: 66 6f 72 20 61 20 70 61 72 74 69 63 75 6c 61 72  for a particular
0aa0: 20 43 4c 52 20 76 65 72 73 69 6f 6e 20 6d 61 79   CLR version may
0ab0: 20 62 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20   be..        #  
0ac0: 20 20 20 20 20 6f 76 65 72 72 69 64 64 65 6e 20       overridden 
0ad0: 62 79 20 73 65 74 74 69 6e 67 20 74 68 65 20 67  by setting the g
0ae0: 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20 22  lobal variable "
0af0: 74 65 73 74 5f 79 65 61 72 5f 63 6c 72 5f 76 24  test_year_clr_v$
0b00: 58 22 2c 0d 0a 20 20 20 20 20 20 20 20 23 20 20  X",..        #  
0b10: 20 20 20 20 20 77 68 65 72 65 20 22 24 58 22 20       where "$X" 
0b20: 6d 61 79 20 5b 63 75 72 72 65 6e 74 6c 79 5d 20  may [currently] 
0b30: 62 65 20 65 69 74 68 65 72 20 22 32 22 20 6f 72  be either "2" or
0b40: 20 22 34 22 2e 0d 0a 20 20 20 20 20 20 20 20 23   "4"...        #
0b50: 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 68  ..        if {[h
0b60: 61 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 69 6d  aveConstraint im
0b70: 61 67 65 52 75 6e 74 69 6d 65 34 30 5d 7d 20 74  ageRuntime40]} t
0b80: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
0b90: 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74   if {[info exist
0ba0: 73 20 3a 3a 74 65 73 74 5f 79 65 61 72 5f 63 6c  s ::test_year_cl
0bb0: 72 5f 76 34 5d 20 26 26 20 5c 0d 0a 20 20 20 20  r_v4] && \..    
0bc0: 20 20 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e            [strin
0bd0: 67 20 6c 65 6e 67 74 68 20 24 3a 3a 74 65 73 74  g length $::test
0be0: 5f 79 65 61 72 5f 63 6c 72 5f 76 34 5d 20 3e 20  _year_clr_v4] > 
0bf0: 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
0c00: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
0c10: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 55 73        # NOTE: Us
0c20: 65 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  e the specified 
0c30: 74 65 73 74 20 79 65 61 72 20 66 6f 72 20 74 68  test year for th
0c40: 65 20 43 4c 52 20 76 34 2e 30 2e 0d 0a 20 20 20  e CLR v4.0...   
0c50: 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
0c60: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 24          return $
0c70: 3a 3a 74 65 73 74 5f 79 65 61 72 5f 63 6c 72 5f  ::test_year_clr_
0c80: 76 34 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 20  v4..          } 
0c90: 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
0ca0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
0cb0: 20 20 20 23 20 4e 4f 54 45 3a 20 55 73 65 20 74     # NOTE: Use t
0cc0: 68 65 20 64 65 66 61 75 6c 74 20 74 65 73 74 20  he default test 
0cd0: 79 65 61 72 20 66 6f 72 20 74 68 65 20 43 4c 52  year for the CLR
0ce0: 20 76 34 2e 30 2e 0d 0a 20 20 20 20 20 20 20 20   v4.0...        
0cf0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
0d00: 20 20 20 72 65 74 75 72 6e 20 32 30 31 30 3b 20     return 2010; 
0d10: 23 20 54 4f 44 4f 3a 20 47 6f 6f 64 20 22 66 61  # TODO: Good "fa
0d20: 6c 6c 62 61 63 6b 22 20 64 65 66 61 75 6c 74 3f  llback" default?
0d30: 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20  ..          }.. 
0d40: 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d         } else {.
0d50: 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b  .          if {[
0d60: 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 74 65  info exists ::te
0d70: 73 74 5f 79 65 61 72 5f 63 6c 72 5f 76 32 5d 20  st_year_clr_v2] 
0d80: 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  && \..          
0d90: 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67      [string leng
0da0: 74 68 20 24 3a 3a 74 65 73 74 5f 79 65 61 72 5f  th $::test_year_
0db0: 63 6c 72 5f 76 32 5d 20 3e 20 30 7d 20 74 68 65  clr_v2] > 0} the
0dc0: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
0dd0: 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   #..            
0de0: 23 20 4e 4f 54 45 3a 20 55 73 65 20 74 68 65 20  # NOTE: Use the 
0df0: 73 70 65 63 69 66 69 65 64 20 74 65 73 74 20 79  specified test y
0e00: 65 61 72 20 66 6f 72 20 74 68 65 20 43 4c 52 20  ear for the CLR 
0e10: 76 32 2e 30 2e 0d 0a 20 20 20 20 20 20 20 20 20  v2.0...         
0e20: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
0e30: 20 20 72 65 74 75 72 6e 20 24 3a 3a 74 65 73 74    return $::test
0e40: 5f 79 65 61 72 5f 63 6c 72 5f 76 32 0d 0a 20 20  _year_clr_v2..  
0e50: 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b          } else {
0e60: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 0d  ..            #.
0e70: 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4e  .            # N
0e80: 4f 54 45 3a 20 55 73 65 20 74 68 65 20 64 65 66  OTE: Use the def
0e90: 61 75 6c 74 20 74 65 73 74 20 79 65 61 72 20 66  ault test year f
0ea0: 6f 72 20 74 68 65 20 43 4c 52 20 76 32 2e 30 2e  or the CLR v2.0.
0eb0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 0d  ..            #.
0ec0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74  .            ret
0ed0: 75 72 6e 20 32 30 30 38 3b 20 23 20 54 4f 44 4f  urn 2008; # TODO
0ee0: 3a 20 47 6f 6f 64 20 22 66 61 6c 6c 62 61 63 6b  : Good "fallback
0ef0: 22 20 64 65 66 61 75 6c 74 3f 0d 0a 20 20 20 20  " default?..    
0f00: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
0f10: 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20   }..      }..   
0f20: 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
0f30: 67 65 74 42 75 69 6c 64 43 6f 6e 66 69 67 75 72  getBuildConfigur
0f40: 61 74 69 6f 6e 20 7b 7d 20 7b 0d 0a 20 20 20 20  ation {} {..    
0f50: 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
0f60: 45 3a 20 53 65 65 20 69 66 20 74 68 65 20 22 63  E: See if the "c
0f70: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 22 20 73 65  onfiguration" se
0f80: 74 74 69 6e 67 20 68 61 73 20 62 65 65 6e 20 6f  tting has been o
0f90: 76 65 72 72 69 64 64 65 6e 20 62 79 20 74 68 65  verridden by the
0fa0: 20 75 73 65 72 0d 0a 20 20 20 20 20 20 23 20 20   user..      #  
0fb0: 20 20 20 20 20 28 65 2e 67 2e 20 6f 6e 20 74 68       (e.g. on th
0fc0: 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 29 2e  e command line).
0fd0: 20 20 54 68 69 73 20 68 65 6c 70 73 20 63 6f 6e    This helps con
0fe0: 74 72 6f 6c 20 65 78 61 63 74 6c 79 20 77 68 69  trol exactly whi
0ff0: 63 68 20 73 65 74 0d 0a 20 20 20 20 20 20 23 20  ch set..      # 
1000: 20 20 20 20 20 20 6f 66 20 62 69 6e 61 72 69 65        of binarie
1010: 73 20 77 65 20 61 72 65 20 74 65 73 74 69 6e 67  s we are testing
1020: 20 28 69 2e 65 2e 20 74 68 6f 73 65 20 62 75 69   (i.e. those bui
1030: 6c 74 20 69 6e 20 74 68 65 20 22 44 65 62 75 67  lt in the "Debug
1040: 22 20 6f 72 0d 0a 20 20 20 20 20 20 23 20 20 20  " or..      #   
1050: 20 20 20 20 22 52 65 6c 65 61 73 65 22 20 62 75      "Release" bu
1060: 69 6c 64 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  ild configuratio
1070: 6e 73 29 2e 20 20 54 6f 20 6f 76 65 72 72 69 64  ns).  To overrid
1080: 65 20 74 68 69 73 20 76 61 6c 75 65 20 76 69 61  e this value via
1090: 20 74 68 65 0d 0a 20 20 20 20 20 20 23 20 20 20   the..      #   
10a0: 20 20 20 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65      command line
10b0: 2c 20 65 6e 74 65 72 20 61 20 63 6f 6d 6d 61 6e  , enter a comman
10c0: 64 20 73 69 6d 69 6c 61 72 20 74 6f 20 6f 6e 65  d similar to one
10d0: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
10e0: 67 20 28 61 6c 6c 0d 0a 20 20 20 20 20 20 23 20  g (all..      # 
10f0: 20 20 20 20 20 20 6f 6e 20 6f 6e 65 20 6c 69 6e        on one lin
1100: 65 29 3a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  e):..      #..  
1110: 20 20 20 20 23 20 20 20 20 20 20 20 45 61 67 6c      #       Eagl
1120: 65 53 68 65 6c 6c 2e 65 78 65 20 2d 70 72 65 49  eShell.exe -preI
1130: 6e 69 74 69 61 6c 69 7a 65 20 22 73 65 74 20 74  nitialize "set t
1140: 65 73 74 5f 63 6f 6e 66 69 67 75 72 61 74 69 6f  est_configuratio
1150: 6e 20 44 65 62 75 67 22 0d 0a 20 20 20 20 20 20  n Debug"..      
1160: 23 20 20 20 20 20 20 20 20 20 2d 66 69 6c 65 20  #         -file 
1170: 2e 5c 70 61 74 68 5c 74 6f 5c 61 6c 6c 2e 65 61  .\path\to\all.ea
1180: 67 6c 65 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  gle..      #..  
1190: 20 20 20 20 23 20 20 20 20 20 20 20 45 61 67 6c      #       Eagl
11a0: 65 53 68 65 6c 6c 2e 65 78 65 20 2d 70 72 65 49  eShell.exe -preI
11b0: 6e 69 74 69 61 6c 69 7a 65 20 22 73 65 74 20 74  nitialize "set t
11c0: 65 73 74 5f 63 6f 6e 66 69 67 75 72 61 74 69 6f  est_configuratio
11d0: 6e 20 52 65 6c 65 61 73 65 22 0d 0a 20 20 20 20  n Release"..    
11e0: 20 20 23 20 20 20 20 20 20 20 20 20 2d 66 69 6c    #         -fil
11f0: 65 20 2e 5c 70 61 74 68 5c 74 6f 5c 61 6c 6c 2e  e .\path\to\all.
1200: 65 61 67 6c 65 0d 0a 20 20 20 20 20 20 23 0d 0a  eagle..      #..
1210: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 45 61        #       Ea
1220: 67 6c 65 53 68 65 6c 6c 2e 65 78 65 20 2d 66 69  gleShell.exe -fi
1230: 6c 65 20 2e 5c 70 61 74 68 5c 74 6f 5c 61 6c 6c  le .\path\to\all
1240: 2e 65 61 67 6c 65 20 2d 70 72 65 54 65 73 74 0d  .eagle -preTest.
1250: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 20  .      #        
1260: 20 22 75 6e 73 65 74 20 2d 6e 6f 63 6f 6d 70 6c   "unset -nocompl
1270: 61 69 6e 20 74 65 73 74 5f 63 6f 6e 66 69 67 75  ain test_configu
1280: 72 61 74 69 6f 6e 22 0d 0a 20 20 20 20 20 20 23  ration"..      #
1290: 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66  ..      if {[inf
12a0: 6f 20 65 78 69 73 74 73 20 3a 3a 74 65 73 74 5f  o exists ::test_
12b0: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 5d 20 26  configuration] &
12c0: 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b  & \..          [
12d0: 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a  string length $:
12e0: 3a 74 65 73 74 5f 63 6f 6e 66 69 67 75 72 61 74  :test_configurat
12f0: 69 6f 6e 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b  ion] > 0} then {
1300: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
1310: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 55 73 65       # NOTE: Use
1320: 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 74   the specified t
1330: 65 73 74 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  est configuratio
1340: 6e 2e 20 20 54 68 65 20 64 65 66 61 75 6c 74 20  n.  The default 
1350: 76 61 6c 75 65 20 75 73 65 64 0d 0a 20 20 20 20  value used..    
1360: 20 20 20 20 23 20 20 20 20 20 20 20 66 6f 72 20      #       for 
1370: 74 68 69 73 20 76 61 72 69 61 62 6c 65 20 69 73  this variable is
1380: 20 22 52 65 6c 65 61 73 65 22 2c 20 61 73 20 73   "Release", as s
1390: 65 74 20 62 79 20 74 68 65 20 74 65 73 74 20 73  et by the test s
13a0: 75 69 74 65 20 69 74 73 65 6c 66 2e 0d 0a 20 20  uite itself...  
13b0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
13c0: 20 72 65 74 75 72 6e 20 24 3a 3a 74 65 73 74 5f   return $::test_
13d0: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 0d 0a 20  configuration.. 
13e0: 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
13f0: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
1400: 20 20 23 20 4e 4f 54 45 3a 20 4e 6f 72 6d 61 6c    # NOTE: Normal
1410: 6c 79 2c 20 77 65 20 77 69 6c 6c 20 6e 65 76 65  ly, we will neve
1420: 72 20 68 69 74 20 74 68 69 73 20 63 61 73 65 20  r hit this case 
1430: 62 65 63 61 75 73 65 20 74 68 65 20 76 61 6c 75  because the valu
1440: 65 20 6f 66 20 74 68 65 0d 0a 20 20 20 20 20 20  e of the..      
1450: 20 20 23 20 20 20 20 20 20 20 74 65 73 74 20 63    #       test c
1460: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 76 61 72  onfiguration var
1470: 69 61 62 6c 65 20 69 73 20 61 6c 77 61 79 73 20  iable is always 
1480: 73 65 74 20 62 79 20 74 68 65 20 74 65 73 74 20  set by the test 
1490: 73 75 69 74 65 0d 0a 20 20 20 20 20 20 20 20 23  suite..        #
14a0: 20 20 20 20 20 20 20 69 74 73 65 6c 66 3b 20 68         itself; h
14b0: 6f 77 65 76 65 72 2c 20 69 74 20 63 61 6e 20 62  owever, it can b
14c0: 65 20 6f 76 65 72 72 69 64 64 65 6e 20 75 73 69  e overridden usi
14d0: 6e 67 20 74 68 65 20 75 6e 73 65 74 20 63 6f 6d  ng the unset com
14e0: 6d 61 6e 64 0d 0a 20 20 20 20 20 20 20 20 23 20  mand..        # 
14f0: 20 20 20 20 20 20 66 72 6f 6d 20 74 68 65 20 2d        from the -
1500: 70 72 65 54 65 73 74 20 6f 70 74 69 6f 6e 20 74  preTest option t
1510: 6f 20 74 68 65 20 74 65 73 74 20 73 75 69 74 65  o the test suite
1520: 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
1530: 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 3a 3a        return $::
1540: 65 61 67 6c 65 5f 70 6c 61 74 66 6f 72 6d 28 63  eagle_platform(c
1550: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 29 0d 0a 20  onfiguration).. 
1560: 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c       }..    }...
1570: 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74 42 75  ..    proc getBu
1580: 69 6c 64 44 69 72 65 63 74 6f 72 79 20 7b 7d 20  ildDirectory {} 
1590: 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  {..      #..    
15a0: 20 20 23 20 4e 4f 54 45 3a 20 53 65 65 20 69 66    # NOTE: See if
15b0: 20 74 68 65 20 22 6e 61 74 69 76 65 22 20 72 75   the "native" ru
15c0: 6e 74 69 6d 65 20 6f 70 74 69 6f 6e 20 68 61 73  ntime option has
15d0: 20 62 65 65 6e 20 61 64 64 65 64 2e 20 20 49 66   been added.  If
15e0: 20 73 6f 2c 20 75 73 65 20 74 68 65 0d 0a 20 20   so, use the..  
15f0: 20 20 20 20 23 20 20 20 20 20 20 20 64 69 72 65      #       dire
1600: 63 74 6f 72 79 20 66 6f 72 20 74 68 65 20 6d 69  ctory for the mi
1610: 78 65 64 2d 6d 6f 64 65 20 61 73 73 65 6d 62 6c  xed-mode assembl
1620: 79 20 28 61 2e 6b 2e 61 2e 20 74 68 65 20 6e 61  y (a.k.a. the na
1630: 74 69 76 65 20 69 6e 74 65 72 6f 70 0d 0a 20 20  tive interop..  
1640: 20 20 20 20 23 20 20 20 20 20 20 20 61 73 73 65      #       asse
1650: 6d 62 6c 79 29 2e 20 20 54 6f 20 65 6e 61 62 6c  mbly).  To enabl
1660: 65 20 74 68 69 73 20 6f 70 74 69 6f 6e 20 76 69  e this option vi
1670: 61 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69  a the command li
1680: 6e 65 2c 20 65 6e 74 65 72 20 61 0d 0a 20 20 20  ne, enter a..   
1690: 20 20 20 23 20 20 20 20 20 20 20 63 6f 6d 6d 61     #       comma
16a0: 6e 64 20 73 69 6d 69 6c 61 72 20 74 6f 20 6f 6e  nd similar to on
16b0: 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
16c0: 6e 67 20 28 61 6c 6c 20 6f 6e 20 6f 6e 65 20 6c  ng (all on one l
16d0: 69 6e 65 29 3a 0d 0a 20 20 20 20 20 20 23 0d 0a  ine):..      #..
16e0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 45 61        #       Ea
16f0: 67 6c 65 53 68 65 6c 6c 2e 65 78 65 20 2d 69 6e  gleShell.exe -in
1700: 69 74 69 61 6c 69 7a 65 20 2d 72 75 6e 74 69 6d  itialize -runtim
1710: 65 4f 70 74 69 6f 6e 20 6e 61 74 69 76 65 0d 0a  eOption native..
1720: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 20 20        #         
1730: 2d 66 69 6c 65 20 2e 5c 70 61 74 68 5c 74 6f 5c  -file .\path\to\
1740: 61 6c 6c 2e 65 61 67 6c 65 0d 0a 20 20 20 20 20  all.eagle..     
1750: 20 23 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20   #..      #     
1760: 20 20 54 6f 20 65 6e 61 62 6c 65 20 74 68 69 73    To enable this
1770: 20 6f 70 74 69 6f 6e 20 76 69 61 20 74 68 65 20   option via the 
1780: 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20 70 72 69  command line pri
1790: 6f 72 20 74 6f 20 74 68 65 20 22 62 65 74 61 20  or to the "beta 
17a0: 31 36 22 0d 0a 20 20 20 20 20 20 23 20 20 20 20  16"..      #    
17b0: 20 20 20 72 65 6c 65 61 73 65 20 6f 66 20 45 61     release of Ea
17c0: 67 6c 65 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69  gle, the followi
17d0: 6e 67 20 63 6f 6d 6d 61 6e 64 20 6d 75 73 74 20  ng command must 
17e0: 62 65 20 75 73 65 64 20 69 6e 73 74 65 61 64 0d  be used instead.
17f0: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 28  .      #       (
1800: 61 6c 73 6f 20 61 6c 6c 20 6f 6e 20 6f 6e 65 20  also all on one 
1810: 6c 69 6e 65 29 3a 0d 0a 20 20 20 20 20 20 23 0d  line):..      #.
1820: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 45  .      #       E
1830: 61 67 6c 65 53 68 65 6c 6c 2e 65 78 65 20 2d 69  agleShell.exe -i
1840: 6e 69 74 69 61 6c 69 7a 65 20 2d 70 6f 73 74 49  nitialize -postI
1850: 6e 69 74 69 61 6c 69 7a 65 0d 0a 20 20 20 20 20  nitialize..     
1860: 20 23 20 20 20 20 20 20 20 20 20 22 6f 62 6a 65   #         "obje
1870: 63 74 20 69 6e 76 6f 6b 65 20 49 6e 74 65 72 70  ct invoke Interp
1880: 72 65 74 65 72 2e 47 65 74 41 63 74 69 76 65 20  reter.GetActive 
1890: 41 64 64 52 75 6e 74 69 6d 65 4f 70 74 69 6f 6e  AddRuntimeOption
18a0: 20 6e 61 74 69 76 65 22 0d 0a 20 20 20 20 20 20   native"..      
18b0: 23 20 20 20 20 20 20 20 20 20 2d 66 69 6c 65 20  #         -file 
18c0: 2e 5c 70 61 74 68 5c 74 6f 5c 61 6c 6c 2e 65 61  .\path\to\all.ea
18d0: 67 6c 65 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  gle..      #..  
18e0: 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78      if {[info ex
18f0: 69 73 74 73 20 3a 3a 62 75 69 6c 64 5f 64 69 72  ists ::build_dir
1900: 65 63 74 6f 72 79 5d 20 26 26 20 5c 0d 0a 20 20  ectory] && \..  
1910: 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20          [string 
1920: 6c 65 6e 67 74 68 20 24 3a 3a 62 75 69 6c 64 5f  length $::build_
1930: 64 69 72 65 63 74 6f 72 79 5d 20 3e 20 30 7d 20  directory] > 0} 
1940: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
1950: 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
1960: 45 3a 20 54 68 65 20 6c 6f 63 61 74 69 6f 6e 20  E: The location 
1970: 6f 66 20 74 68 65 20 62 75 69 6c 64 20 64 69 72  of the build dir
1980: 65 63 74 6f 72 79 20 68 61 73 20 62 65 65 6e 20  ectory has been 
1990: 6f 76 65 72 72 69 64 64 65 6e 3b 0d 0a 20 20 20  overridden;..   
19a0: 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68 65       #       the
19b0: 72 65 66 6f 72 65 2c 20 75 73 65 20 69 74 20 76  refore, use it v
19c0: 65 72 62 61 74 69 6d 2e 0d 0a 20 20 20 20 20 20  erbatim...      
19d0: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74    #..        ret
19e0: 75 72 6e 20 24 3a 3a 62 75 69 6c 64 5f 64 69 72  urn $::build_dir
19f0: 65 63 74 6f 72 79 0d 0a 20 20 20 20 20 20 7d 20  ectory..      } 
1a00: 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
1a10: 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
1a20: 45 3a 20 46 69 67 75 72 65 20 6f 75 74 20 74 68  E: Figure out th
1a30: 65 20 62 75 69 6c 64 20 62 61 73 65 20 64 69 72  e build base dir
1a40: 65 63 74 6f 72 79 2e 20 20 54 68 69 73 20 77 69  ectory.  This wi
1a50: 6c 6c 20 62 65 20 74 68 65 20 64 69 72 65 63 74  ll be the direct
1a60: 6f 72 79 0d 0a 20 20 20 20 20 20 20 20 23 20 20  ory..        #  
1a70: 20 20 20 20 20 74 68 61 74 20 63 6f 6e 74 61 69       that contai
1a80: 6e 73 20 74 68 65 20 61 63 74 75 61 6c 20 62 75  ns the actual bu
1a90: 69 6c 64 20 6f 75 74 70 75 74 20 64 69 72 65 63  ild output direc
1aa0: 74 6f 72 79 20 28 65 2e 67 2e 20 22 62 69 6e 22  tory (e.g. "bin"
1ab0: 29 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  )...        #.. 
1ac0: 20 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f         if {[info
1ad0: 20 65 78 69 73 74 73 20 3a 3a 62 75 69 6c 64 5f   exists ::build_
1ae0: 62 61 73 65 5f 64 69 72 65 63 74 6f 72 79 5d 20  base_directory] 
1af0: 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  && \..          
1b00: 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68    [string length
1b10: 20 24 3a 3a 62 75 69 6c 64 5f 62 61 73 65 5f 64   $::build_base_d
1b20: 69 72 65 63 74 6f 72 79 5d 20 3e 20 30 7d 20 74  irectory] > 0} t
1b30: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
1b40: 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20   #..          # 
1b50: 4e 4f 54 45 3a 20 54 68 65 20 6c 6f 63 61 74 69  NOTE: The locati
1b60: 6f 6e 20 6f 66 20 74 68 65 20 62 75 69 6c 64 20  on of the build 
1b70: 62 61 73 65 20 64 69 72 65 63 74 6f 72 79 20 68  base directory h
1b80: 61 73 20 62 65 65 6e 20 6f 76 65 72 72 69 64 64  as been overridd
1b90: 65 6e 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 23  en;..          #
1ba0: 20 20 20 20 20 20 20 74 68 65 72 65 66 6f 72 65         therefore
1bb0: 2c 20 75 73 65 20 69 74 20 76 65 72 62 61 74 69  , use it verbati
1bc0: 6d 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d  m...          #.
1bd0: 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20 70  .          set p
1be0: 61 74 68 20 24 3a 3a 62 75 69 6c 64 5f 62 61 73  ath $::build_bas
1bf0: 65 5f 64 69 72 65 63 74 6f 72 79 0d 0a 20 20 20  e_directory..   
1c00: 20 20 20 20 20 7d 20 65 6c 73 65 69 66 20 7b 5b       } elseif {[
1c10: 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 63 6f  info exists ::co
1c20: 6d 6d 6f 6e 5f 64 69 72 65 63 74 6f 72 79 5d 20  mmon_directory] 
1c30: 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  && \..          
1c40: 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68    [string length
1c50: 20 24 3a 3a 63 6f 6d 6d 6f 6e 5f 64 69 72 65 63   $::common_direc
1c60: 74 6f 72 79 5d 20 3e 20 30 7d 20 74 68 65 6e 20  tory] > 0} then 
1c70: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a  {..          #..
1c80: 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45            # NOTE
1c90: 3a 20 4e 65 78 74 2c 20 66 61 6c 6c 62 61 63 6b  : Next, fallback
1ca0: 20 74 6f 20 74 68 65 20 70 61 72 65 6e 74 20 64   to the parent d
1cb0: 69 72 65 63 74 6f 72 79 20 6f 66 20 74 68 65 20  irectory of the 
1cc0: 6f 6e 65 20 63 6f 6e 74 61 69 6e 69 6e 67 0d 0a  one containing..
1cd0: 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20            #     
1ce0: 20 20 74 68 69 73 20 66 69 6c 65 20 28 69 2e 65    this file (i.e
1cf0: 2e 20 22 63 6f 6d 6d 6f 6e 2e 65 61 67 6c 65 22  . "common.eagle"
1d00: 29 2c 20 69 66 20 61 76 61 69 6c 61 62 6c 65 2e  ), if available.
1d10: 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20  ..          #.. 
1d20: 20 20 20 20 20 20 20 20 20 73 65 74 20 70 61 74           set pat
1d30: 68 20 5b 66 69 6c 65 20 64 69 72 6e 61 6d 65 20  h [file dirname 
1d40: 24 3a 3a 63 6f 6d 6d 6f 6e 5f 64 69 72 65 63 74  $::common_direct
1d50: 6f 72 79 5d 0d 0a 20 20 20 20 20 20 20 20 7d 20  ory]..        } 
1d60: 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
1d70: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23    #..          #
1d80: 20 4e 4f 54 45 3a 20 46 69 6e 61 6c 6c 79 2c 20   NOTE: Finally, 
1d90: 66 61 6c 6c 62 61 63 6b 20 74 6f 20 74 68 65 20  fallback to the 
1da0: 70 61 72 65 6e 74 20 64 69 72 65 63 74 6f 72 79  parent directory
1db0: 20 6f 66 20 74 68 65 20 45 61 67 6c 65 54 65 73   of the EagleTes
1dc0: 74 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 20  t..          #  
1dd0: 20 20 20 20 20 70 61 74 68 2e 20 20 54 68 65 20       path.  The 
1de0: 45 61 67 6c 65 54 65 73 74 20 70 61 63 6b 61 67  EagleTest packag
1df0: 65 20 67 75 61 72 61 6e 74 65 65 73 20 74 68 61  e guarantees tha
1e00: 74 20 74 68 69 73 20 76 61 72 69 61 62 6c 65 0d  t this variable.
1e10: 0a 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20  .          #    
1e20: 20 20 20 77 69 6c 6c 20 62 65 20 73 65 74 20 74     will be set t
1e30: 6f 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20  o the directory 
1e40: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 66  containing the f
1e50: 69 72 73 74 20 66 69 6c 65 20 74 6f 0d 0a 20 20  irst file to..  
1e60: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
1e70: 65 78 65 63 75 74 65 20 74 68 65 20 5b 72 75 6e  execute the [run
1e80: 54 65 73 74 50 72 6f 6c 6f 67 75 65 5d 20 73 63  TestPrologue] sc
1e90: 72 69 70 74 20 6c 69 62 72 61 72 79 20 70 72 6f  ript library pro
1ea0: 63 65 64 75 72 65 2e 0d 0a 20 20 20 20 20 20 20  cedure...       
1eb0: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
1ec0: 73 65 74 20 70 61 74 68 20 5b 66 69 6c 65 20 64  set path [file d
1ed0: 69 72 6e 61 6d 65 20 24 3a 3a 70 61 74 68 5d 0d  irname $::path].
1ee0: 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  .        }....  
1ef0: 20 20 20 20 20 20 69 66 20 7b 5b 68 61 73 52 75        if {[hasRu
1f00: 6e 74 69 6d 65 4f 70 74 69 6f 6e 20 6e 61 74 69  ntimeOption nati
1f10: 76 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  ve]} then {..   
1f20: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b 66         return [f
1f30: 69 6c 65 20 6a 6f 69 6e 20 24 70 61 74 68 20 62  ile join $path b
1f40: 69 6e 20 5b 67 65 74 42 75 69 6c 64 59 65 61 72  in [getBuildYear
1f50: 5d 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ] \..           
1f60: 20 20 20 5b 6d 61 63 68 69 6e 65 54 6f 50 6c 61     [machineToPla
1f70: 74 66 6f 72 6d 20 24 3a 3a 74 63 6c 5f 70 6c 61  tform $::tcl_pla
1f80: 74 66 6f 72 6d 28 6d 61 63 68 69 6e 65 29 5d 20  tform(machine)] 
1f90: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
1fa0: 20 5b 67 65 74 42 75 69 6c 64 43 6f 6e 66 69 67   [getBuildConfig
1fb0: 75 72 61 74 69 6f 6e 5d 5d 0d 0a 20 20 20 20 20  uration]]..     
1fc0: 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
1fd0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b 66         return [f
1fe0: 69 6c 65 20 6a 6f 69 6e 20 24 70 61 74 68 20 62  ile join $path b
1ff0: 69 6e 20 5b 67 65 74 42 75 69 6c 64 59 65 61 72  in [getBuildYear
2000: 5d 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ] \..           
2010: 20 20 20 5b 67 65 74 42 75 69 6c 64 43 6f 6e 66     [getBuildConf
2020: 69 67 75 72 61 74 69 6f 6e 5d 20 62 69 6e 5d 0d  iguration] bin].
2030: 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  .        }..    
2040: 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20    }..    }..... 
2050: 20 20 20 70 72 6f 63 20 67 65 74 42 75 69 6c 64     proc getBuild
2060: 46 69 6c 65 4e 61 6d 65 20 7b 20 66 69 6c 65 4e  FileName { fileN
2070: 61 6d 65 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23  ame } {..      #
2080: 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
2090: 52 65 74 75 72 6e 73 20 74 68 65 20 73 70 65 63  Returns the spec
20a0: 69 66 69 65 64 20 66 69 6c 65 20 6e 61 6d 65 20  ified file name 
20b0: 61 73 20 69 66 20 69 74 20 77 65 72 65 20 6c 6f  as if it were lo
20c0: 63 61 74 65 64 20 69 6e 20 74 68 65 0d 0a 20 20  cated in the..  
20d0: 20 20 20 20 23 20 20 20 20 20 20 20 62 75 69 6c      #       buil
20e0: 64 20 64 69 72 65 63 74 6f 72 79 2c 20 64 69 73  d directory, dis
20f0: 63 61 72 64 69 6e 67 20 61 6e 79 20 64 69 72 65  carding any dire
2100: 63 74 6f 72 79 20 69 6e 66 6f 72 6d 61 74 69 6f  ctory informatio
2110: 6e 20 70 72 65 73 65 6e 74 0d 0a 20 20 20 20 20  n present..     
2120: 20 23 20 20 20 20 20 20 20 69 6e 20 74 68 65 20   #       in the 
2130: 66 69 6c 65 20 6e 61 6d 65 20 61 73 20 70 72 6f  file name as pro
2140: 76 69 64 65 64 20 62 79 20 74 68 65 20 63 61 6c  vided by the cal
2150: 6c 65 72 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ler...      #.. 
2160: 20 20 20 20 20 72 65 74 75 72 6e 20 5b 66 69 6c       return [fil
2170: 65 20 6e 61 74 69 76 65 6e 61 6d 65 20 5c 0d 0a  e nativename \..
2180: 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20            [file 
2190: 6a 6f 69 6e 20 5b 67 65 74 42 75 69 6c 64 44 69  join [getBuildDi
21a0: 72 65 63 74 6f 72 79 5d 20 5b 66 69 6c 65 20 74  rectory] [file t
21b0: 61 69 6c 20 24 66 69 6c 65 4e 61 6d 65 5d 5d 5d  ail $fileName]]]
21c0: 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
21d0: 70 72 6f 63 20 67 65 74 42 69 6e 61 72 79 44 69  proc getBinaryDi
21e0: 72 65 63 74 6f 72 79 20 7b 7d 20 7b 0d 0a 20 20  rectory {} {..  
21f0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
2200: 4f 54 45 3a 20 54 68 69 73 20 70 72 6f 63 65 64  OTE: This proced
2210: 75 72 65 20 72 65 74 75 72 6e 73 20 74 68 65 20  ure returns the 
2220: 64 69 72 65 63 74 6f 72 79 20 77 68 65 72 65 20  directory where 
2230: 74 68 65 20 74 65 73 74 20 61 70 70 6c 69 63 61  the test applica
2240: 74 69 6f 6e 0d 0a 20 20 20 20 20 20 23 20 20 20  tion..      #   
2250: 20 20 20 20 69 74 73 65 6c 66 20 28 69 2e 65 2e      itself (i.e.
2260: 20 74 68 65 20 45 61 67 6c 65 20 73 68 65 6c 6c   the Eagle shell
2270: 29 20 69 73 20 6c 6f 63 61 74 65 64 2e 20 20 54  ) is located.  T
2280: 68 69 73 20 77 69 6c 6c 20 62 65 20 75 73 65 64  his will be used
2290: 20 61 73 0d 0a 20 20 20 20 20 20 23 20 20 20 20   as..      #    
22a0: 20 20 20 74 68 65 20 64 65 73 74 69 6e 61 74 69     the destinati
22b0: 6f 6e 20 66 6f 72 20 74 68 65 20 63 6f 70 69 65  on for the copie
22c0: 64 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51  d System.Data.SQ
22d0: 4c 69 74 65 20 6e 61 74 69 76 65 20 61 6e 64 0d  Lite native and.
22e0: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 6d  .      #       m
22f0: 61 6e 61 67 65 64 20 61 73 73 65 6d 62 6c 69 65  anaged assemblie
2300: 73 20 28 69 2e 65 2e 20 62 65 63 61 75 73 65 20  s (i.e. because 
2310: 74 68 69 73 20 69 73 20 6f 6e 65 20 6f 66 20 74  this is one of t
2320: 68 65 20 66 65 77 20 70 6c 61 63 65 73 0d 0a 20  he few places.. 
2330: 20 20 20 20 20 23 20 20 20 20 20 20 20 77 68 65       #       whe
2340: 72 65 20 74 68 65 20 43 4c 52 20 77 69 6c 6c 20  re the CLR will 
2350: 61 63 74 75 61 6c 6c 79 20 66 69 6e 64 20 61 6e  actually find an
2360: 64 20 6c 6f 61 64 20 74 68 65 6d 20 70 72 6f 70  d load them prop
2370: 65 72 6c 79 29 2e 0d 0a 20 20 20 20 20 20 23 0d  erly)...      #.
2380: 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f  .      if {[info
2390: 20 65 78 69 73 74 73 20 3a 3a 62 69 6e 61 72 79   exists ::binary
23a0: 5f 64 69 72 65 63 74 6f 72 79 5d 20 26 26 20 5c  _directory] && \
23b0: 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 73 74 72  ..          [str
23c0: 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a 62 69  ing length $::bi
23d0: 6e 61 72 79 5f 64 69 72 65 63 74 6f 72 79 5d 20  nary_directory] 
23e0: 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  > 0} then {..   
23f0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
2400: 23 20 4e 4f 54 45 3a 20 54 68 65 20 6c 6f 63 61  # NOTE: The loca
2410: 74 69 6f 6e 20 6f 66 20 74 68 65 20 62 69 6e 61  tion of the bina
2420: 72 79 20 64 69 72 65 63 74 6f 72 79 20 68 61 73  ry directory has
2430: 20 62 65 65 6e 20 6f 76 65 72 72 69 64 64 65 6e   been overridden
2440: 3b 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  ;..        #    
2450: 20 20 20 74 68 65 72 65 66 6f 72 65 2c 20 75 73     therefore, us
2460: 65 20 69 74 20 76 65 72 62 61 74 69 6d 2e 0d 0a  e it verbatim...
2470: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
2480: 20 20 20 72 65 74 75 72 6e 20 24 3a 3a 62 69 6e     return $::bin
2490: 61 72 79 5f 64 69 72 65 63 74 6f 72 79 0d 0a 20  ary_directory.. 
24a0: 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
24b0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b 69         return [i
24c0: 6e 66 6f 20 62 69 6e 61 72 79 5d 0d 0a 20 20 20  nfo binary]..   
24d0: 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a     }..    }.....
24e0: 20 20 20 20 70 72 6f 63 20 67 65 74 42 69 6e 61      proc getBina
24f0: 72 79 46 69 6c 65 4e 61 6d 65 20 7b 20 66 69 6c  ryFileName { fil
2500: 65 4e 61 6d 65 20 7d 20 7b 0d 0a 20 20 20 20 20  eName } {..     
2510: 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
2520: 3a 20 52 65 74 75 72 6e 73 20 74 68 65 20 73 70  : Returns the sp
2530: 65 63 69 66 69 65 64 20 66 69 6c 65 20 6e 61 6d  ecified file nam
2540: 65 20 61 73 20 69 66 20 69 74 20 77 65 72 65 20  e as if it were 
2550: 6c 6f 63 61 74 65 64 20 69 6e 20 74 68 65 0d 0a  located in the..
2560: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 62 69        #       bi
2570: 6e 61 72 79 20 64 69 72 65 63 74 6f 72 79 2c 20  nary directory, 
2580: 64 69 73 63 61 72 64 69 6e 67 20 61 6e 79 20 64  discarding any d
2590: 69 72 65 63 74 6f 72 79 20 69 6e 66 6f 72 6d 61  irectory informa
25a0: 74 69 6f 6e 20 70 72 65 73 65 6e 74 0d 0a 20 20  tion present..  
25b0: 20 20 20 20 23 20 20 20 20 20 20 20 69 6e 20 74      #       in t
25c0: 68 65 20 66 69 6c 65 20 6e 61 6d 65 20 61 73 20  he file name as 
25d0: 70 72 6f 76 69 64 65 64 20 62 79 20 74 68 65 20  provided by the 
25e0: 63 61 6c 6c 65 72 2e 0d 0a 20 20 20 20 20 20 23  caller...      #
25f0: 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b  ..      return [
2600: 66 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65 20  file nativename 
2610: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 66 69  \..          [fi
2620: 6c 65 20 6a 6f 69 6e 20 5b 67 65 74 42 69 6e 61  le join [getBina
2630: 72 79 44 69 72 65 63 74 6f 72 79 5d 20 5b 66 69  ryDirectory] [fi
2640: 6c 65 20 74 61 69 6c 20 24 66 69 6c 65 4e 61 6d  le tail $fileNam
2650: 65 5d 5d 5d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a  e]]]..    }.....
2660: 20 20 20 20 70 72 6f 63 20 67 65 74 44 61 74 61      proc getData
2670: 62 61 73 65 44 69 72 65 63 74 6f 72 79 20 7b 7d  baseDirectory {}
2680: 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20   {..      #..   
2690: 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 69 73 20     # NOTE: This 
26a0: 70 72 6f 63 65 64 75 72 65 20 72 65 74 75 72 6e  procedure return
26b0: 73 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20  s the directory 
26c0: 77 68 65 72 65 20 74 68 65 20 74 65 73 74 20 64  where the test d
26d0: 61 74 61 62 61 73 65 73 0d 0a 20 20 20 20 20 20  atabases..      
26e0: 23 20 20 20 20 20 20 20 73 68 6f 75 6c 64 20 62  #       should b
26f0: 65 20 6c 6f 63 61 74 65 64 2e 20 20 42 79 20 64  e located.  By d
2700: 65 66 61 75 6c 74 2c 20 74 68 69 73 20 6a 75 73  efault, this jus
2710: 74 20 75 73 65 73 20 74 68 65 20 74 65 6d 70 6f  t uses the tempo
2720: 72 61 72 79 0d 0a 20 20 20 20 20 20 23 20 20 20  rary..      #   
2730: 20 20 20 20 64 69 72 65 63 74 6f 72 79 20 63 6f      directory co
2740: 6e 66 69 67 75 72 65 64 20 66 6f 72 20 74 68 69  nfigured for thi
2750: 73 20 73 79 73 74 65 6d 2e 0d 0a 20 20 20 20 20  s system...     
2760: 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69   #..      if {[i
2770: 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 64 61 74  nfo exists ::dat
2780: 61 62 61 73 65 5f 64 69 72 65 63 74 6f 72 79 5d  abase_directory]
2790: 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20   && \..         
27a0: 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20   [string length 
27b0: 24 3a 3a 64 61 74 61 62 61 73 65 5f 64 69 72 65  $::database_dire
27c0: 63 74 6f 72 79 5d 20 3e 20 30 7d 20 74 68 65 6e  ctory] > 0} then
27d0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20   {..        #.. 
27e0: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54         # NOTE: T
27f0: 68 65 20 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 74  he location of t
2800: 68 65 20 64 61 74 61 62 61 73 65 20 64 69 72 65  he database dire
2810: 63 74 6f 72 79 20 68 61 73 20 62 65 65 6e 20 6f  ctory has been o
2820: 76 65 72 72 69 64 64 65 6e 3b 0d 0a 20 20 20 20  verridden;..    
2830: 20 20 20 20 23 20 20 20 20 20 20 20 74 68 65 72      #       ther
2840: 65 66 6f 72 65 2c 20 75 73 65 20 69 74 2e 0d 0a  efore, use it...
2850: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
2860: 20 20 20 72 65 74 75 72 6e 20 5b 66 69 6c 65 20     return [file 
2870: 6e 6f 72 6d 61 6c 69 7a 65 20 24 3a 3a 64 61 74  normalize $::dat
2880: 61 62 61 73 65 5f 64 69 72 65 63 74 6f 72 79 5d  abase_directory]
2890: 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b  ..      } else {
28a0: 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ..        return
28b0: 20 5b 67 65 74 54 65 6d 70 6f 72 61 72 79 50 61   [getTemporaryPa
28c0: 74 68 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20  th]..      }..  
28d0: 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
28e0: 20 67 65 74 41 70 70 44 6f 6d 61 69 6e 50 72 65   getAppDomainPre
28f0: 61 6d 62 6c 65 20 7b 20 7b 70 72 65 66 69 78 20  amble { {prefix 
2900: 22 22 7d 20 7b 73 75 66 66 69 78 20 22 22 7d 20  ""} {suffix ""} 
2910: 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  } {..      #..  
2920: 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 69 73      # NOTE: This
2930: 20 70 72 6f 63 65 64 75 72 65 20 72 65 74 75 72   procedure retur
2940: 6e 73 20 61 20 74 65 73 74 20 73 65 74 75 70 20  ns a test setup 
2950: 73 63 72 69 70 74 20 73 75 69 74 61 62 6c 65 20  script suitable 
2960: 66 6f 72 20 65 76 61 6c 75 61 74 69 6f 6e 0d 0a  for evaluation..
2970: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 62 79        #       by
2980: 20 61 20 74 65 73 74 20 69 6e 74 65 72 70 72 65   a test interpre
2990: 74 65 72 20 63 72 65 61 74 65 64 20 69 6e 20 61  ter created in a
29a0: 6e 20 69 73 6f 6c 61 74 65 64 20 61 70 70 6c 69  n isolated appli
29b0: 63 61 74 69 6f 6e 20 64 6f 6d 61 69 6e 2e 0d 0a  cation domain...
29c0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 54 68        #       Th
29d0: 65 20 73 63 72 69 70 74 20 62 65 69 6e 67 20 72  e script being r
29e0: 65 74 75 72 6e 65 64 20 77 69 6c 6c 20 62 65 20  eturned will be 
29f0: 73 75 72 72 6f 75 6e 64 65 64 20 62 79 20 74 68  surrounded by th
2a00: 65 20 70 72 65 66 69 78 20 61 6e 64 0d 0a 20 20  e prefix and..  
2a10: 20 20 20 20 23 20 20 20 20 20 20 20 73 75 66 66      #       suff
2a20: 69 78 20 22 73 63 72 69 70 74 20 66 72 61 67 6d  ix "script fragm
2a30: 65 6e 74 73 22 20 73 70 65 63 69 66 69 65 64 20  ents" specified 
2a40: 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2c 20 69  by the caller, i
2a50: 66 20 61 6e 79 2e 20 20 54 68 65 0d 0a 20 20 20  f any.  The..   
2a60: 20 20 20 23 20 20 20 20 20 20 20 65 6e 74 69 72     #       entir
2a70: 65 20 73 63 72 69 70 74 20 62 65 69 6e 67 20 72  e script being r
2a80: 65 74 75 72 6e 65 64 20 77 69 6c 6c 20 62 65 20  eturned will be 
2a90: 73 75 62 73 74 69 74 75 74 65 64 20 76 69 61 20  substituted via 
2aa0: 5b 73 75 62 73 74 5d 2c 20 69 6e 0d 0a 20 20 20  [subst], in..   
2ab0: 20 20 20 23 20 20 20 20 20 20 20 74 68 65 20 63     #       the c
2ac0: 6f 6e 74 65 78 74 20 6f 66 20 74 68 65 20 63 61  ontext of the ca
2ad0: 6c 6c 65 72 2e 20 20 54 68 69 73 20 73 74 65 70  ller.  This step
2ae0: 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 73 6f   is necessary so
2af0: 20 74 68 61 74 20 73 6f 6d 65 0d 0a 20 20 20 20   that some..    
2b00: 20 20 23 20 20 20 20 20 20 20 6c 69 6d 69 74 65    #       limite
2b10: 64 20 63 6f 6e 74 65 78 74 20 69 6e 66 6f 72 6d  d context inform
2b20: 61 74 69 6f 6e 2c 20 70 72 69 6d 61 72 69 6c 79  ation, primarily
2b30: 20 72 65 6c 61 74 65 64 20 74 6f 20 74 68 65 20   related to the 
2b40: 74 65 73 74 20 62 75 69 6c 64 0d 0a 20 20 20 20  test build..    
2b50: 20 20 23 20 20 20 20 20 20 20 64 69 72 65 63 74    #       direct
2b60: 6f 72 79 2c 20 63 61 6e 20 62 65 20 74 72 61 6e  ory, can be tran
2b70: 73 66 65 72 72 65 64 20 74 6f 20 74 68 65 20 69  sferred to the i
2b80: 6e 74 65 72 70 72 65 74 65 72 20 69 6e 20 74 68  nterpreter in th
2b90: 65 20 69 73 6f 6c 61 74 65 64 0d 0a 20 20 20 20  e isolated..    
2ba0: 20 20 23 20 20 20 20 20 20 20 61 70 70 6c 69 63    #       applic
2bb0: 61 74 69 6f 6e 20 64 6f 6d 61 69 6e 2c 20 6d 61  ation domain, ma
2bc0: 6b 69 6e 67 20 69 74 20 61 62 6c 65 20 74 6f 20  king it able to 
2bd0: 73 75 63 63 65 73 73 66 75 6c 6c 79 20 72 75 6e  successfully run
2be0: 20 74 65 73 74 73 20 74 68 61 74 0d 0a 20 20 20   tests that..   
2bf0: 20 20 20 23 20 20 20 20 20 20 20 72 65 71 75 69     #       requi
2c00: 72 65 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f  re one or more o
2c10: 66 20 74 68 65 20 66 69 6c 65 73 20 69 6e 20 74  f the files in t
2c20: 68 65 20 62 75 69 6c 64 20 64 69 72 65 63 74 6f  he build directo
2c30: 72 79 2e 20 20 43 61 6c 6c 65 72 73 0d 0a 20 20  ry.  Callers..  
2c40: 20 20 20 20 23 20 20 20 20 20 20 20 74 6f 20 74      #       to t
2c50: 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 73 68  his procedure sh
2c60: 6f 75 6c 64 20 6b 65 65 70 20 69 6e 20 6d 69 6e  ould keep in min
2c70: 64 20 74 68 61 74 20 74 68 65 20 74 65 73 74 20  d that the test 
2c80: 73 63 72 69 70 74 20 62 65 69 6e 67 0d 0a 20 20  script being..  
2c90: 20 20 20 20 23 20 20 20 20 20 20 20 72 65 74 75      #       retu
2ca0: 72 6e 65 64 20 63 61 6e 6e 6f 74 20 6f 6e 6c 79  rned cannot only
2cb0: 20 72 65 6c 79 20 6f 6e 20 61 6e 79 20 73 63 72   rely on any scr
2cc0: 69 70 74 20 6c 69 62 72 61 72 79 20 70 72 6f 63  ipt library proc
2cd0: 65 64 75 72 65 73 20 6e 6f 74 0d 0a 20 20 20 20  edures not..    
2ce0: 20 20 23 20 20 20 20 20 20 20 69 6e 63 6c 75 64    #       includ
2cf0: 65 64 20 69 6e 20 74 68 65 20 45 61 67 6c 65 2e  ed in the Eagle.
2d00: 4c 69 62 72 61 72 79 20 70 61 63 6b 61 67 65 20  Library package 
2d10: 28 69 2e 65 2e 20 22 69 6e 69 74 2e 65 61 67 6c  (i.e. "init.eagl
2d20: 65 22 29 2e 20 20 41 6c 73 6f 2c 0d 0a 20 20 20  e").  Also,..   
2d30: 20 20 20 23 20 20 20 20 20 20 20 61 6c 6c 20 76     #       all v
2d40: 61 72 69 61 62 6c 65 20 72 65 66 65 72 65 6e 63  ariable referenc
2d50: 65 73 20 61 6e 64 20 61 6c 6c 20 22 6e 65 73 74  es and all "nest
2d60: 65 64 22 20 63 6f 6d 6d 61 6e 64 73 20 28 69 2e  ed" commands (i.
2d70: 65 2e 20 74 68 6f 73 65 20 69 6e 0d 0a 20 20 20  e. those in..   
2d80: 20 20 20 23 20 20 20 20 20 20 20 73 71 75 61 72     #       squar
2d90: 65 20 62 72 61 63 6b 65 74 73 29 2c 20 75 6e 6c  e brackets), unl
2da0: 65 73 73 20 74 68 65 79 20 61 72 65 20 73 70 65  ess they are spe
2db0: 63 69 61 6c 6c 79 20 71 75 6f 74 65 64 2c 20 77  cially quoted, w
2dc0: 69 6c 6c 20 65 6e 64 20 75 70 0d 0a 20 20 20 20  ill end up..    
2dd0: 20 20 23 20 20 20 20 20 20 20 62 65 69 6e 67 20    #       being 
2de0: 65 76 61 6c 75 61 74 65 64 20 69 6e 20 74 68 65  evaluated in the
2df0: 20 63 6f 6e 74 65 78 74 20 6f 66 20 74 68 65 20   context of the 
2e00: 63 61 6c 6c 69 6e 67 20 69 6e 74 65 72 70 72 65  calling interpre
2e10: 74 65 72 20 61 6e 64 20 6e 6f 74 0d 0a 20 20 20  ter and not..   
2e20: 20 20 20 23 20 20 20 20 20 20 20 74 68 65 20 74     #       the t
2e30: 65 73 74 20 69 6e 74 65 72 70 72 65 74 65 72 20  est interpreter 
2e40: 63 72 65 61 74 65 64 20 69 6e 20 74 68 65 20 69  created in the i
2e50: 73 6f 6c 61 74 65 64 20 61 70 70 6c 69 63 61 74  solated applicat
2e60: 69 6f 6e 20 64 6f 6d 61 69 6e 2e 0d 0a 20 20 20  ion domain...   
2e70: 20 20 20 23 0d 0a 20 20 20 20 20 20 72 65 74 75     #..      retu
2e80: 72 6e 20 5b 75 70 6c 65 76 65 6c 20 31 20 5b 6c  rn [uplevel 1 [l
2e90: 69 73 74 20 73 75 62 73 74 20 5b 61 70 70 65 6e  ist subst [appen
2ea0: 64 41 72 67 73 20 24 70 72 65 66 69 78 20 7b 0d  dArgs $prefix {.
2eb0: 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 68 61  .        if {[ha
2ec0: 73 52 75 6e 74 69 6d 65 4f 70 74 69 6f 6e 20 6e  sRuntimeOption n
2ed0: 61 74 69 76 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a  ative]} then {..
2ee0: 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74            object
2ef0: 20 69 6e 76 6f 6b 65 20 49 6e 74 65 72 70 72 65   invoke Interpre
2f00: 74 65 72 2e 47 65 74 41 63 74 69 76 65 20 41 64  ter.GetActive Ad
2f10: 64 52 75 6e 74 69 6d 65 4f 70 74 69 6f 6e 20 6e  dRuntimeOption n
2f20: 61 74 69 76 65 0d 0a 20 20 20 20 20 20 20 20 7d  ative..        }
2f30: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20  ....        set 
2f40: 3a 3a 70 61 74 68 20 7b 24 3a 3a 70 61 74 68 7d  ::path {$::path}
2f50: 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 3a 3a  ..        set ::
2f60: 74 65 73 74 5f 79 65 61 72 20 7b 5b 67 65 74 42  test_year {[getB
2f70: 75 69 6c 64 59 65 61 72 5d 7d 0d 0a 20 20 20 20  uildYear]}..    
2f80: 20 20 20 20 73 65 74 20 3a 3a 74 65 73 74 5f 63      set ::test_c
2f90: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 7b 5b 67  onfiguration {[g
2fa0: 65 74 42 75 69 6c 64 43 6f 6e 66 69 67 75 72 61  etBuildConfigura
2fb0: 74 69 6f 6e 5d 7d 0d 0a 20 20 20 20 20 20 7d 20  tion]}..      } 
2fc0: 24 73 75 66 66 69 78 5d 5d 5d 0d 0a 20 20 20 20  $suffix]]]..    
2fd0: 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 74  }.....    proc t
2fe0: 72 79 43 6f 70 79 42 75 69 6c 64 46 69 6c 65 20  ryCopyBuildFile 
2ff0: 7b 20 66 69 6c 65 4e 61 6d 65 20 7d 20 7b 0d 0a  { fileName } {..
3000: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
3010: 20 4e 4f 54 45 3a 20 49 66 20 77 65 20 63 61 6e   NOTE: If we can
3020: 6e 6f 74 20 63 6f 70 79 20 74 68 65 20 61 73 73  not copy the ass
3030: 65 6d 62 6c 79 20 74 68 65 6e 20 69 74 20 69 73  embly then it is
3040: 20 70 72 6f 62 61 62 6c 79 20 61 6c 72 65 61 64   probably alread
3050: 79 20 6c 6f 61 64 65 64 2e 0d 0a 20 20 20 20 20  y loaded...     
3060: 20 23 0d 0a 20 20 20 20 20 20 73 65 74 20 73 6f   #..      set so
3070: 75 72 63 65 46 69 6c 65 4e 61 6d 65 20 5b 67 65  urceFileName [ge
3080: 74 42 75 69 6c 64 46 69 6c 65 4e 61 6d 65 20 24  tBuildFileName $
3090: 66 69 6c 65 4e 61 6d 65 5d 0d 0a 0d 0a 20 20 20  fileName]....   
30a0: 20 20 20 69 66 20 7b 21 5b 66 69 6c 65 20 65 78     if {![file ex
30b0: 69 73 74 73 20 24 73 6f 75 72 63 65 46 69 6c 65  ists $sourceFile
30c0: 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  Name]} then {.. 
30d0: 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
30e0: 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70  test_channel [ap
30f0: 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
3100: 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 73 6b          "---- sk
3110: 69 70 70 65 64 20 63 6f 70 79 69 6e 67 20 62 75  ipped copying bu
3120: 69 6c 64 20 66 69 6c 65 20 5c 22 22 20 24 73 6f  ild file \"" $so
3130: 75 72 63 65 46 69 6c 65 4e 61 6d 65 20 5c 0d 0a  urceFileName \..
3140: 20 20 20 20 20 20 20 20 20 20 20 20 22 5c 22 2c              "\",
3150: 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 65 78 69   it does not exi
3160: 73 74 5c 6e 22 5d 0d 0a 0d 0a 20 20 20 20 20 20  st\n"]....      
3170: 20 20 72 65 74 75 72 6e 0d 0a 20 20 20 20 20 20    return..      
3180: 7d 0d 0a 0d 0a 20 20 20 20 20 20 73 65 74 20 74  }....      set t
3190: 61 72 67 65 74 46 69 6c 65 4e 61 6d 65 20 5b 67  argetFileName [g
31a0: 65 74 42 69 6e 61 72 79 46 69 6c 65 4e 61 6d 65  etBinaryFileName
31b0: 20 24 66 69 6c 65 4e 61 6d 65 5d 0d 0a 0d 0a 20   $fileName].... 
31c0: 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20       if {[catch 
31d0: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 66 69 6c  {..          fil
31e0: 65 20 63 6f 70 79 20 2d 66 6f 72 63 65 20 24 73  e copy -force $s
31f0: 6f 75 72 63 65 46 69 6c 65 4e 61 6d 65 20 24 74  ourceFileName $t
3200: 61 72 67 65 74 46 69 6c 65 4e 61 6d 65 7d 5d 20  argetFileName}] 
3210: 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  == 0} then {..  
3220: 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
3230: 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70  est_channel [app
3240: 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
3250: 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 6f 70         "---- cop
3260: 69 65 64 20 62 75 69 6c 64 20 66 69 6c 65 20 66  ied build file f
3270: 72 6f 6d 20 5c 22 22 20 24 73 6f 75 72 63 65 46  rom \"" $sourceF
3280: 69 6c 65 4e 61 6d 65 20 22 5c 22 20 74 6f 20 5c  ileName "\" to \
3290: 22 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  "" \..          
32a0: 20 20 24 74 61 72 67 65 74 46 69 6c 65 4e 61 6d    $targetFileNam
32b0: 65 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d  e \"\n]..      }
32c0: 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
32d0: 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
32e0: 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
32f0: 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
3300: 20 20 22 2d 2d 2d 2d 20 66 61 69 6c 65 64 20 74    "---- failed t
3310: 6f 20 63 6f 70 79 20 62 75 69 6c 64 20 66 69 6c  o copy build fil
3320: 65 20 66 72 6f 6d 20 5c 22 22 20 24 73 6f 75 72  e from \"" $sour
3330: 63 65 46 69 6c 65 4e 61 6d 65 20 5c 0d 0a 20 20  ceFileName \..  
3340: 20 20 20 20 20 20 20 20 20 20 22 5c 22 20 74 6f            "\" to
3350: 20 5c 22 22 20 24 74 61 72 67 65 74 46 69 6c 65   \"" $targetFile
3360: 4e 61 6d 65 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20  Name \"\n]..    
3370: 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20    }..    }..... 
3380: 20 20 20 70 72 6f 63 20 74 72 79 44 65 6c 65 74     proc tryDelet
3390: 65 42 69 6e 61 72 79 46 69 6c 65 20 7b 20 66 69  eBinaryFile { fi
33a0: 6c 65 4e 61 6d 65 20 7d 20 7b 0d 0a 20 20 20 20  leName } {..    
33b0: 20 20 73 65 74 20 66 69 6c 65 4e 61 6d 65 20 5b    set fileName [
33c0: 67 65 74 42 69 6e 61 72 79 46 69 6c 65 4e 61 6d  getBinaryFileNam
33d0: 65 20 24 66 69 6c 65 4e 61 6d 65 5d 0d 0a 0d 0a  e $fileName]....
33e0: 20 20 20 20 20 20 69 66 20 7b 21 5b 66 69 6c 65        if {![file
33f0: 20 65 78 69 73 74 73 20 24 66 69 6c 65 4e 61 6d   exists $fileNam
3400: 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  e]} then {..    
3410: 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
3420: 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e  t_channel [appen
3430: 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
3440: 20 20 20 20 20 22 2d 2d 2d 2d 20 73 6b 69 70 70       "---- skipp
3450: 65 64 20 64 65 6c 65 74 69 6e 67 20 62 69 6e 61  ed deleting bina
3460: 72 79 20 66 69 6c 65 20 5c 22 22 20 24 66 69 6c  ry file \"" $fil
3470: 65 4e 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20 20  eName \..       
3480: 20 20 20 20 20 22 5c 22 2c 20 69 74 20 64 6f 65       "\", it doe
3490: 73 20 6e 6f 74 20 65 78 69 73 74 5c 6e 22 5d 0d  s not exist\n"].
34a0: 0a 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ...        retur
34b0: 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  n..      }....  
34c0: 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b      if {[catch {
34d0: 66 69 6c 65 20 64 65 6c 65 74 65 20 24 66 69 6c  file delete $fil
34e0: 65 4e 61 6d 65 7d 5d 20 3d 3d 20 30 7d 20 74 68  eName}] == 0} th
34f0: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70  en {..        tp
3500: 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  uts $::test_chan
3510: 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
3520: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22  \..            "
3530: 2d 2d 2d 2d 20 64 65 6c 65 74 65 64 20 62 69 6e  ---- deleted bin
3540: 61 72 79 20 66 69 6c 65 20 5c 22 22 20 24 66 69  ary file \"" $fi
3550: 6c 65 4e 61 6d 65 20 5c 22 5c 6e 5d 0d 0a 20 20  leName \"\n]..  
3560: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
3570: 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
3580: 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70  est_channel [app
3590: 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
35a0: 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 66 61 69         "---- fai
35b0: 6c 65 64 20 74 6f 20 64 65 6c 65 74 65 20 62 69  led to delete bi
35c0: 6e 61 72 79 20 66 69 6c 65 20 5c 22 22 20 24 66  nary file \"" $f
35d0: 69 6c 65 4e 61 6d 65 20 5c 22 5c 6e 5d 0d 0a 20  ileName \"\n].. 
35e0: 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c       }..    }...
35f0: 0d 0a 20 20 20 20 70 72 6f 63 20 74 72 79 43 6f  ..    proc tryCo
3600: 70 79 41 73 73 65 6d 62 6c 79 20 7b 20 66 69 6c  pyAssembly { fil
3610: 65 4e 61 6d 65 20 7b 70 64 62 20 74 72 75 65 7d  eName {pdb true}
3620: 20 7d 20 7b 0d 0a 20 20 20 20 20 20 74 72 79 43   } {..      tryC
3630: 6f 70 79 42 75 69 6c 64 46 69 6c 65 20 24 66 69  opyBuildFile $fi
3640: 6c 65 4e 61 6d 65 0d 0a 0d 0a 20 20 20 20 20 20  leName....      
3650: 69 66 20 7b 24 70 64 62 7d 20 74 68 65 6e 20 7b  if {$pdb} then {
3660: 0d 0a 20 20 20 20 20 20 20 20 74 72 79 43 6f 70  ..        tryCop
3670: 79 42 75 69 6c 64 46 69 6c 65 20 5b 61 70 70 65  yBuildFile [appe
3680: 6e 64 41 72 67 73 20 5b 66 69 6c 65 20 72 6f 6f  ndArgs [file roo
3690: 74 6e 61 6d 65 20 24 66 69 6c 65 4e 61 6d 65 5d  tname $fileName]
36a0: 20 2e 70 64 62 5d 0d 0a 20 20 20 20 20 20 7d 0d   .pdb]..      }.
36b0: 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70  .    }.....    p
36c0: 72 6f 63 20 74 72 79 44 65 6c 65 74 65 41 73 73  roc tryDeleteAss
36d0: 65 6d 62 6c 79 20 7b 20 66 69 6c 65 4e 61 6d 65  embly { fileName
36e0: 20 7b 70 64 62 20 74 72 75 65 7d 20 7d 20 7b 0d   {pdb true} } {.
36f0: 0a 20 20 20 20 20 20 74 72 79 44 65 6c 65 74 65  .      tryDelete
3700: 42 69 6e 61 72 79 46 69 6c 65 20 24 66 69 6c 65  BinaryFile $file
3710: 4e 61 6d 65 0d 0a 0d 0a 20 20 20 20 20 20 69 66  Name....      if
3720: 20 7b 24 70 64 62 7d 20 74 68 65 6e 20 7b 0d 0a   {$pdb} then {..
3730: 20 20 20 20 20 20 20 20 74 72 79 44 65 6c 65 74          tryDelet
3740: 65 42 69 6e 61 72 79 46 69 6c 65 20 5b 61 70 70  eBinaryFile [app
3750: 65 6e 64 41 72 67 73 20 5b 66 69 6c 65 20 72 6f  endArgs [file ro
3760: 6f 74 6e 61 6d 65 20 24 66 69 6c 65 4e 61 6d 65  otname $fileName
3770: 5d 20 2e 70 64 62 5d 0d 0a 20 20 20 20 20 20 7d  ] .pdb]..      }
3780: 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
3790: 70 72 6f 63 20 74 72 79 4c 6f 61 64 41 73 73 65  proc tryLoadAsse
37a0: 6d 62 6c 79 20 7b 20 66 69 6c 65 4e 61 6d 65 20  mbly { fileName 
37b0: 7d 20 7b 0d 0a 20 20 20 20 20 20 73 65 74 20 66  } {..      set f
37c0: 69 6c 65 4e 61 6d 65 20 5b 67 65 74 42 69 6e 61  ileName [getBina
37d0: 72 79 46 69 6c 65 4e 61 6d 65 20 24 66 69 6c 65  ryFileName $file
37e0: 4e 61 6d 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 69  Name]....      i
37f0: 66 20 7b 5b 63 61 74 63 68 20 7b 73 65 74 20 61  f {[catch {set a
3800: 73 73 65 6d 62 6c 79 20 5c 0d 0a 20 20 20 20 20  ssembly \..     
3810: 20 20 20 20 20 20 20 20 20 5b 6f 62 6a 65 63 74           [object
3820: 20 6c 6f 61 64 20 2d 6c 6f 61 64 74 79 70 65 20   load -loadtype 
3830: 46 69 6c 65 20 2d 61 6c 69 61 73 20 24 66 69 6c  File -alias $fil
3840: 65 4e 61 6d 65 5d 7d 5d 20 3d 3d 20 30 7d 20 74  eName]}] == 0} t
3850: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  hen {..        #
3860: 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
3870: 3a 20 4e 6f 77 2c 20 61 64 64 20 74 68 65 20 6e  : Now, add the n
3880: 65 63 65 73 73 61 72 79 20 74 65 73 74 20 63 6f  ecessary test co
3890: 6e 73 74 72 61 69 6e 74 2e 0d 0a 20 20 20 20 20  nstraint...     
38a0: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 61 64     #..        ad
38b0: 64 43 6f 6e 73 74 72 61 69 6e 74 20 5b 66 69 6c  dConstraint [fil
38c0: 65 20 72 6f 6f 74 6e 61 6d 65 20 5b 66 69 6c 65  e rootname [file
38d0: 20 74 61 69 6c 20 24 66 69 6c 65 4e 61 6d 65 5d   tail $fileName]
38e0: 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  ]....        #..
38f0: 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
3900: 47 72 61 62 20 74 68 65 20 69 6d 61 67 65 20 72  Grab the image r
3910: 75 6e 74 69 6d 65 20 76 65 72 73 69 6f 6e 20 66  untime version f
3920: 72 6f 6d 20 74 68 65 20 61 73 73 65 6d 62 6c 79  rom the assembly
3930: 20 62 65 63 61 75 73 65 0d 0a 20 20 20 20 20 20   because..      
3940: 20 20 23 20 20 20 20 20 20 20 73 65 76 65 72 61    #       severa
3950: 6c 20 74 65 73 74 73 20 72 65 6c 79 20 6f 6e 20  l tests rely on 
3960: 69 74 20 68 61 76 69 6e 67 20 61 20 63 65 72 74  it having a cert
3970: 61 69 6e 20 76 61 6c 75 65 2e 0d 0a 20 20 20 20  ain value...    
3980: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 61      #..        a
3990: 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70  ddConstraint [ap
39a0: 70 65 6e 64 41 72 67 73 20 5b 66 69 6c 65 20 74  pendArgs [file t
39b0: 61 69 6c 20 24 66 69 6c 65 4e 61 6d 65 5d 20 5f  ail $fileName] _
39c0: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
39d0: 5b 24 61 73 73 65 6d 62 6c 79 20 49 6d 61 67 65  [$assembly Image
39e0: 52 75 6e 74 69 6d 65 56 65 72 73 69 6f 6e 5d 5d  RuntimeVersion]]
39f0: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  ....        #.. 
3a00: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 52         # NOTE: R
3a10: 65 74 75 72 6e 20 74 68 65 20 66 75 6c 6c 20 70  eturn the full p
3a20: 61 74 68 20 6f 66 20 74 68 65 20 6c 6f 61 64 65  ath of the loade
3a30: 64 20 66 69 6c 65 2e 0d 0a 20 20 20 20 20 20 20  d file...       
3a40: 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75   #..        retu
3a50: 72 6e 20 24 66 69 6c 65 4e 61 6d 65 0d 0a 20 20  rn $fileName..  
3a60: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 72      }....      r
3a70: 65 74 75 72 6e 20 22 22 0d 0a 20 20 20 20 7d 0d  eturn ""..    }.
3a80: 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 63 68 65  ....    proc che
3a90: 63 6b 46 6f 72 53 51 4c 69 74 65 20 7b 20 63 68  ckForSQLite { ch
3aa0: 61 6e 6e 65 6c 20 7d 20 7b 0d 0a 20 20 20 20 20  annel } {..     
3ab0: 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
3ac0: 22 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e 67 20 66  "---- checking f
3ad0: 6f 72 20 63 6f 72 65 20 53 51 4c 69 74 65 20 6c  or core SQLite l
3ae0: 69 62 72 61 72 79 2e 2e 2e 20 22 0d 0a 0d 0a 20  ibrary... ".... 
3af0: 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20       if {[catch 
3b00: 7b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d  {object invoke -
3b10: 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63  flags +NonPublic
3b20: 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c   System.Data.SQL
3b30: 69 74 65 2e 53 51 4c 69 74 65 33 20 5c 0d 0a 20  ite.SQLite3 \.. 
3b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
3b50: 69 74 65 56 65 72 73 69 6f 6e 7d 20 76 65 72 73  iteVersion} vers
3b60: 69 6f 6e 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20  ion] == 0} then 
3b70: 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
3b80: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 74        # NOTE: At
3b90: 74 65 6d 70 74 20 74 6f 20 71 75 65 72 79 20 74  tempt to query t
3ba0: 68 65 20 46 6f 73 73 69 6c 20 73 6f 75 72 63 65  he Fossil source
3bb0: 20 69 64 65 6e 74 69 66 69 65 72 20 66 6f 72 20   identifier for 
3bc0: 74 68 65 20 53 51 4c 69 74 65 0d 0a 20 20 20 20  the SQLite..    
3bd0: 20 20 20 20 23 20 20 20 20 20 20 20 63 6f 72 65      #       core
3be0: 20 6c 69 62 72 61 72 79 2e 0d 0a 20 20 20 20 20   library...     
3bf0: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 69 66     #..        if
3c00: 20 7b 5b 63 61 74 63 68 20 7b 6f 62 6a 65 63 74   {[catch {object
3c10: 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b   invoke -flags +
3c20: 4e 6f 6e 50 75 62 6c 69 63 20 53 79 73 74 65 6d  NonPublic System
3c30: 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 53 51 4c  .Data.SQLite.SQL
3c40: 69 74 65 33 20 5c 0d 0a 20 20 20 20 20 20 20 20  ite3 \..        
3c50: 20 20 20 20 20 20 20 20 53 51 4c 69 74 65 53 6f          SQLiteSo
3c60: 75 72 63 65 49 64 7d 20 73 6f 75 72 63 65 49 64  urceId} sourceId
3c70: 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
3c80: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
3c90: 20 20 23 20 4e 4f 54 45 3a 20 57 65 20 66 61 69    # NOTE: We fai
3ca0: 6c 65 64 20 74 6f 20 71 75 65 72 79 20 74 68 65  led to query the
3cb0: 20 46 6f 73 73 69 6c 20 73 6f 75 72 63 65 20 69   Fossil source i
3cc0: 64 65 6e 74 69 66 69 65 72 2e 0d 0a 20 20 20 20  dentifier...    
3cd0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
3ce0: 20 20 20 73 65 74 20 73 6f 75 72 63 65 49 64 20     set sourceId 
3cf0: 75 6e 6b 6e 6f 77 6e 0d 0a 20 20 20 20 20 20 20  unknown..       
3d00: 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d   }....        #.
3d10: 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
3d20: 20 59 65 73 2c 20 74 68 65 20 53 51 4c 69 74 65   Yes, the SQLite
3d30: 20 63 6f 72 65 20 6c 69 62 72 61 72 79 20 61 70   core library ap
3d40: 70 65 61 72 73 20 74 6f 20 62 65 20 61 76 61 69  pears to be avai
3d50: 6c 61 62 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20  lable...        
3d60: 23 0d 0a 20 20 20 20 20 20 20 20 61 64 64 43 6f  #..        addCo
3d70: 6e 73 74 72 61 69 6e 74 20 53 51 4c 69 74 65 0d  nstraint SQLite.
3d80: 0a 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73  ...        tputs
3d90: 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e   $channel [appen
3da0: 64 41 72 67 73 20 22 79 65 73 20 28 22 20 24 76  dArgs "yes (" $v
3db0: 65 72 73 69 6f 6e 20 22 20 22 20 24 73 6f 75 72  ersion " " $sour
3dc0: 63 65 49 64 20 22 29 5c 6e 22 5d 0d 0a 20 20 20  ceId ")\n"]..   
3dd0: 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
3de0: 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
3df0: 6e 65 6c 20 6e 6f 5c 6e 0d 0a 20 20 20 20 20 20  nel no\n..      
3e00: 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  }..    }.....   
3e10: 20 70 72 6f 63 20 63 68 65 63 6b 46 6f 72 53 51   proc checkForSQ
3e20: 4c 69 74 65 44 65 66 69 6e 65 43 6f 6e 73 74 61  LiteDefineConsta
3e30: 6e 74 20 7b 20 63 68 61 6e 6e 65 6c 20 6e 61 6d  nt { channel nam
3e40: 65 20 7d 20 7b 0d 0a 20 20 20 20 20 20 74 70 75  e } {..      tpu
3e50: 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70  ts $channel [app
3e60: 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
3e70: 20 20 20 20 20 22 2d 2d 2d 2d 20 63 68 65 63 6b       "---- check
3e80: 69 6e 67 20 66 6f 72 20 53 79 73 74 65 6d 2e 44  ing for System.D
3e90: 61 74 61 2e 53 51 4c 69 74 65 20 64 65 66 69 6e  ata.SQLite defin
3ea0: 65 20 63 6f 6e 73 74 61 6e 74 20 5c 22 22 20 24  e constant \"" $
3eb0: 6e 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20 20 20  name \..        
3ec0: 20 20 22 5c 22 2e 2e 2e 20 22 5d 0d 0a 0d 0a 20    "\"... "].... 
3ed0: 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20       if {[catch 
3ee0: 7b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d  {object invoke -
3ef0: 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63  flags +NonPublic
3f00: 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c   System.Data.SQL
3f10: 69 74 65 2e 53 51 4c 69 74 65 33 20 5c 0d 0a 20  ite.SQLite3 \.. 
3f20: 20 20 20 20 20 20 20 20 20 20 20 20 20 44 65 66               Def
3f30: 69 6e 65 43 6f 6e 73 74 61 6e 74 73 7d 20 64 65  ineConstants} de
3f40: 66 69 6e 65 43 6f 6e 73 74 61 6e 74 73 5d 20 3d  fineConstants] =
3f50: 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  = 0} then {..   
3f60: 20 20 20 20 20 69 66 20 7b 5b 6c 73 65 61 72 63       if {[lsearc
3f70: 68 20 2d 65 78 61 63 74 20 2d 6e 6f 63 61 73 65  h -exact -nocase
3f80: 20 24 64 65 66 69 6e 65 43 6f 6e 73 74 61 6e 74   $defineConstant
3f90: 73 20 24 6e 61 6d 65 5d 20 21 3d 20 2d 31 7d 20  s $name] != -1} 
3fa0: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
3fb0: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23    #..          #
3fc0: 20 4e 4f 54 45 3a 20 59 65 73 2c 20 74 68 69 73   NOTE: Yes, this
3fd0: 20 64 65 66 69 6e 65 20 63 6f 6e 73 74 61 6e 74   define constant
3fe0: 20 77 61 73 20 65 6e 61 62 6c 65 64 20 77 68 65   was enabled whe
3ff0: 6e 20 74 68 65 20 6d 61 6e 61 67 65 64 0d 0a 20  n the managed.. 
4000: 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20           #      
4010: 20 61 73 73 65 6d 62 6c 79 20 77 61 73 20 63 6f   assembly was co
4020: 6d 70 69 6c 65 64 2e 0d 0a 20 20 20 20 20 20 20  mpiled...       
4030: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
4040: 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61  addConstraint [a
4050: 70 70 65 6e 64 41 72 67 73 20 64 65 66 69 6e 65  ppendArgs define
4060: 43 6f 6e 73 74 61 6e 74 2e 53 79 73 74 65 6d 2e  Constant.System.
4070: 44 61 74 61 2e 53 51 4c 69 74 65 2e 20 24 6e 61  Data.SQLite. $na
4080: 6d 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  me]....         
4090: 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
40a0: 79 65 73 5c 6e 0d 0a 20 20 20 20 20 20 20 20 7d  yes\n..        }
40b0: 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
40c0: 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
40d0: 6c 20 6e 6f 5c 6e 0d 0a 20 20 20 20 20 20 20 20  l no\n..        
40e0: 7d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20  }..      } else 
40f0: 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73  {..        tputs
4100: 20 24 63 68 61 6e 6e 65 6c 20 65 72 72 6f 72 5c   $channel error\
4110: 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  n..      }..    
4120: 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67  }.....    proc g
4130: 65 74 44 61 74 65 54 69 6d 65 46 6f 72 6d 61 74  etDateTimeFormat
4140: 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a   {} {..      #..
4150: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68        # NOTE: Th
4160: 69 73 20 70 72 6f 63 65 64 75 72 65 20 73 69 6d  is procedure sim
4170: 70 6c 79 20 72 65 74 75 72 6e 73 20 74 68 65 20  ply returns the 
4180: 22 64 65 66 61 75 6c 74 22 20 44 61 74 65 54 69  "default" DateTi
4190: 6d 65 20 66 6f 72 6d 61 74 20 75 73 65 64 0d 0a  me format used..
41a0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 62 79        #       by
41b0: 20 74 68 65 20 74 65 73 74 20 73 75 69 74 65 2e   the test suite.
41c0: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
41d0: 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74   if {[info exist
41e0: 73 20 3a 3a 64 61 74 65 74 69 6d 65 5f 66 6f 72  s ::datetime_for
41f0: 6d 61 74 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20  mat] && \..     
4200: 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e       [string len
4210: 67 74 68 20 24 3a 3a 64 61 74 65 74 69 6d 65 5f  gth $::datetime_
4220: 66 6f 72 6d 61 74 5d 20 3e 20 30 7d 20 74 68 65  format] > 0} the
4230: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  n {..        #..
4240: 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
4250: 52 65 74 75 72 6e 20 74 68 65 20 6d 61 6e 75 61  Return the manua
4260: 6c 6c 79 20 6f 76 65 72 72 69 64 64 65 6e 20 76  lly overridden v
4270: 61 6c 75 65 20 66 6f 72 20 74 68 65 20 44 61 74  alue for the Dat
4280: 65 54 69 6d 65 20 66 6f 72 6d 61 74 2e 0d 0a 20  eTime format... 
4290: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
42a0: 20 20 72 65 74 75 72 6e 20 24 3a 3a 64 61 74 65    return $::date
42b0: 74 69 6d 65 5f 66 6f 72 6d 61 74 0d 0a 20 20 20  time_format..   
42c0: 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
42d0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
42e0: 23 20 4e 4f 54 45 3a 20 52 65 74 75 72 6e 20 61  # NOTE: Return a
42f0: 6e 20 49 53 4f 38 36 30 31 20 44 61 74 65 54 69  n ISO8601 DateTi
4300: 6d 65 20 66 6f 72 6d 61 74 20 63 6f 6d 70 61 74  me format compat
4310: 69 62 6c 65 20 77 69 74 68 20 53 51 4c 69 74 65  ible with SQLite
4320: 2c 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  ,..        #    
4330: 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53     System.Data.S
4340: 51 4c 69 74 65 2c 20 61 6e 64 20 73 75 69 74 61  QLite, and suita
4350: 62 6c 65 20 66 6f 72 20 72 6f 75 6e 64 2d 74 72  ble for round-tr
4360: 69 70 70 69 6e 67 20 77 69 74 68 20 74 68 65 0d  ipping with the.
4370: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
4380: 20 44 61 74 65 54 69 6d 65 20 63 6c 61 73 73 20   DateTime class 
4390: 6f 66 20 74 68 65 20 66 72 61 6d 65 77 6f 72 6b  of the framework
43a0: 2e 20 20 49 66 20 74 68 69 73 20 76 61 6c 75 65  .  If this value
43b0: 20 69 73 20 63 68 61 6e 67 65 64 2c 0d 0a 20 20   is changed,..  
43c0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 76 61        #       va
43d0: 72 69 6f 75 73 20 74 65 73 74 73 20 6d 61 79 20  rious tests may 
43e0: 66 61 69 6c 2e 0d 0a 20 20 20 20 20 20 20 20 23  fail...        #
43f0: 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ..        return
4400: 20 22 79 79 79 79 2d 4d 4d 2d 64 64 20 48 48 3a   "yyyy-MM-dd HH:
4410: 6d 6d 3a 73 73 2e 46 46 46 46 46 46 46 4b 22 0d  mm:ss.FFFFFFFK".
4420: 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d  .      }..    }.
4430: 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 65 6e 75  ....    proc enu
4440: 6d 65 72 61 62 6c 65 54 6f 4c 69 73 74 20 7b 20  merableToList { 
4450: 65 6e 75 6d 65 72 61 62 6c 65 20 7d 20 7b 0d 0a  enumerable } {..
4460: 20 20 20 20 20 20 73 65 74 20 72 65 73 75 6c 74        set result
4470: 20 5b 6c 69 73 74 5d 0d 0a 0d 0a 20 20 20 20 20   [list]....     
4480: 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e   if {[string len
4490: 67 74 68 20 24 65 6e 75 6d 65 72 61 62 6c 65 5d  gth $enumerable]
44a0: 20 3d 3d 20 30 20 7c 7c 20 24 65 6e 75 6d 65 72   == 0 || $enumer
44b0: 61 62 6c 65 20 65 71 20 22 6e 75 6c 6c 22 7d 20  able eq "null"} 
44c0: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
44d0: 72 65 74 75 72 6e 20 24 72 65 73 75 6c 74 0d 0a  return $result..
44e0: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
44f0: 20 6f 62 6a 65 63 74 20 66 6f 72 65 61 63 68 20   object foreach 
4500: 2d 61 6c 69 61 73 20 69 74 65 6d 20 24 65 6e 75  -alias item $enu
4510: 6d 65 72 61 62 6c 65 20 7b 0d 0a 20 20 20 20 20  merable {..     
4520: 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c     if {[string l
4530: 65 6e 67 74 68 20 24 69 74 65 6d 5d 20 3e 20 30  ength $item] > 0
4540: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
4550: 20 20 20 20 6c 61 70 70 65 6e 64 20 72 65 73 75      lappend resu
4560: 6c 74 20 5b 24 69 74 65 6d 20 54 6f 53 74 72 69  lt [$item ToStri
4570: 6e 67 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  ng]..        }..
4580: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
4590: 20 72 65 74 75 72 6e 20 24 72 65 73 75 6c 74 0d   return $result.
45a0: 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70  .    }.....    p
45b0: 72 6f 63 20 63 6f 6d 70 69 6c 65 43 53 68 61 72  roc compileCShar
45c0: 70 57 69 74 68 20 7b 0d 0a 20 20 20 20 20 20 20  pWith {..       
45d0: 20 20 20 20 20 74 65 78 74 20 6d 65 6d 6f 72 79       text memory
45e0: 20 73 79 6d 62 6f 6c 73 20 73 74 72 69 63 74 20   symbols strict 
45f0: 72 65 73 75 6c 74 73 56 61 72 4e 61 6d 65 20 65  resultsVarName e
4600: 72 72 6f 72 73 56 61 72 4e 61 6d 65 20 66 69 6c  rrorsVarName fil
4610: 65 4e 61 6d 65 73 0d 0a 20 20 20 20 20 20 20 20  eNames..        
4620: 20 20 20 20 61 72 67 73 20 7d 20 7b 0d 0a 20 20      args } {..  
4630: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
4640: 4f 54 45 3a 20 53 69 6e 63 65 20 77 65 20 61 72  OTE: Since we ar
4650: 65 20 67 6f 69 6e 67 20 74 6f 20 75 73 65 20 74  e going to use t
4660: 68 69 73 20 6d 65 74 68 6f 64 20 6e 61 6d 65 20  his method name 
4670: 61 20 6c 6f 74 2c 20 61 73 73 69 67 6e 20 69 74  a lot, assign it
4680: 20 74 6f 20 61 0d 0a 20 20 20 20 20 20 23 20 20   to a..      #  
4690: 20 20 20 20 20 76 61 72 69 61 62 6c 65 20 66 69       variable fi
46a0: 72 73 74 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  rst...      #.. 
46b0: 20 20 20 20 20 73 65 74 20 61 64 64 20 52 65 66       set add Ref
46c0: 65 72 65 6e 63 65 64 41 73 73 65 6d 62 6c 69 65  erencedAssemblie
46d0: 73 2e 41 64 64 0d 0a 0d 0a 20 20 20 20 20 20 23  s.Add....      #
46e0: 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
46f0: 43 72 65 61 74 65 20 74 68 65 20 62 61 73 65 20  Create the base 
4700: 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 76 61 6c 75  command to evalu
4710: 61 74 65 20 61 6e 64 20 61 64 64 20 74 68 65 20  ate and add the 
4720: 70 72 6f 70 65 72 74 79 20 73 65 74 74 69 6e 67  property setting
4730: 73 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  s..      #      
4740: 20 74 68 61 74 20 61 72 65 20 61 6c 6d 6f 73 74   that are almost
4750: 20 61 6c 77 61 79 73 20 6e 65 65 64 65 64 20 62   always needed b
4760: 79 20 6f 75 72 20 75 6e 69 74 20 74 65 73 74 73  y our unit tests
4770: 20 28 69 2e 65 2e 20 74 68 65 20 53 79 73 74 65   (i.e. the Syste
4780: 6d 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  m..      #      
4790: 20 61 6e 64 20 53 79 73 74 65 6d 2e 44 61 74 61   and System.Data
47a0: 20 61 73 73 65 6d 62 6c 79 20 72 65 66 65 72 65   assembly refere
47b0: 6e 63 65 73 29 2e 0d 0a 20 20 20 20 20 20 23 0d  nces)...      #.
47c0: 0a 20 20 20 20 20 20 73 65 74 20 63 6f 6d 6d 61  .      set comma
47d0: 6e 64 20 5b 6c 69 73 74 20 63 6f 6d 70 69 6c 65  nd [list compile
47e0: 43 53 68 61 72 70 20 24 74 65 78 74 20 24 6d 65  CSharp $text $me
47f0: 6d 6f 72 79 20 24 73 79 6d 62 6f 6c 73 20 24 73  mory $symbols $s
4800: 74 72 69 63 74 20 72 65 73 75 6c 74 73 20 5c 0d  trict results \.
4810: 0a 20 20 20 20 20 20 20 20 20 20 65 72 72 6f 72  .          error
4820: 73 20 24 61 64 64 20 53 79 73 74 65 6d 2e 64 6c  s $add System.dl
4830: 6c 20 24 61 64 64 20 53 79 73 74 65 6d 2e 44 61  l $add System.Da
4840: 74 61 2e 64 6c 6c 20 24 61 64 64 20 53 79 73 74  ta.dll $add Syst
4850: 65 6d 2e 58 6d 6c 2e 64 6c 6c 5d 0d 0a 0d 0a 20  em.Xml.dll].... 
4860: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
4870: 4e 4f 54 45 3a 20 41 64 64 20 61 6c 6c 20 74 68  NOTE: Add all th
4880: 65 20 70 72 6f 76 69 64 65 64 20 66 69 6c 65 20  e provided file 
4890: 6e 61 6d 65 73 20 61 73 20 61 73 73 65 6d 62 6c  names as assembl
48a0: 79 20 72 65 66 65 72 65 6e 63 65 73 2e 0d 0a 20  y references... 
48b0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 66 6f       #..      fo
48c0: 72 65 61 63 68 20 66 69 6c 65 4e 61 6d 65 20 24  reach fileName $
48d0: 66 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20  fileNames {..   
48e0: 20 20 20 20 20 6c 61 70 70 65 6e 64 20 63 6f 6d       lappend com
48f0: 6d 61 6e 64 20 24 61 64 64 20 5b 67 65 74 42 69  mand $add [getBi
4900: 6e 61 72 79 46 69 6c 65 4e 61 6d 65 20 24 66 69  naryFileName $fi
4910: 6c 65 4e 61 6d 65 5d 0d 0a 20 20 20 20 20 20 7d  leName]..      }
4920: 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  ....      #..   
4930: 20 20 20 23 20 4e 4f 54 45 3a 20 41 64 64 20 74     # NOTE: Add t
4940: 68 65 20 65 78 74 72 61 20 61 72 67 75 6d 65 6e  he extra argumen
4950: 74 73 2c 20 69 66 20 61 6e 79 2c 20 74 6f 20 74  ts, if any, to t
4960: 68 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 76  he command to ev
4970: 61 6c 75 61 74 65 2e 0d 0a 20 20 20 20 20 20 23  aluate...      #
4980: 0d 0a 20 20 20 20 20 20 65 76 61 6c 20 6c 61 70  ..      eval lap
4990: 70 65 6e 64 20 63 6f 6d 6d 61 6e 64 20 24 61 72  pend command $ar
49a0: 67 73 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20  gs....      #.. 
49b0: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 6c 69       # NOTE: Ali
49c0: 61 73 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 20  as the compiler 
49d0: 6c 6f 63 61 6c 20 72 65 73 75 6c 74 73 20 61 6e  local results an
49e0: 64 20 65 72 72 6f 72 73 20 76 61 72 69 61 62 6c  d errors variabl
49f0: 65 73 20 74 6f 20 74 68 65 0d 0a 20 20 20 20 20  es to the..     
4a00: 20 23 20 20 20 20 20 20 20 76 61 72 69 61 62 6c   #       variabl
4a10: 65 20 6e 61 6d 65 73 20 70 72 6f 76 69 64 65 64  e names provided
4a20: 20 62 79 20 6f 75 72 20 63 61 6c 6c 65 72 2e 0d   by our caller..
4a30: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
4a40: 75 70 76 61 72 20 31 20 24 72 65 73 75 6c 74 73  upvar 1 $results
4a50: 56 61 72 4e 61 6d 65 20 72 65 73 75 6c 74 73 0d  VarName results.
4a60: 0a 20 20 20 20 20 20 75 70 76 61 72 20 31 20 24  .      upvar 1 $
4a70: 65 72 72 6f 72 73 56 61 72 4e 61 6d 65 20 65 72  errorsVarName er
4a80: 72 6f 72 73 0d 0a 0d 0a 20 20 20 20 20 20 23 0d  rors....      #.
4a90: 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 45  .      # NOTE: E
4aa0: 76 61 6c 75 61 74 65 20 74 68 65 20 63 6f 6e 73  valuate the cons
4ab0: 74 72 75 63 74 65 64 20 5b 63 6f 6d 70 69 6c 65  tructed [compile
4ac0: 43 53 68 61 72 70 5d 20 63 6f 6d 6d 61 6e 64 20  CSharp] command 
4ad0: 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65 0d 0a  and return the..
4ae0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 72 65        #       re
4af0: 73 75 6c 74 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  sult...      #..
4b00: 20 20 20 20 20 20 65 76 61 6c 20 24 63 6f 6d 6d        eval $comm
4b10: 61 6e 64 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20  and..    }..... 
4b20: 20 20 20 70 72 6f 63 20 69 73 4d 65 6d 6f 72 79     proc isMemory
4b30: 44 62 20 7b 20 66 69 6c 65 4e 61 6d 65 20 7d 20  Db { fileName } 
4b40: 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  {..      #..    
4b50: 20 20 23 20 4e 4f 54 45 3a 20 49 73 20 74 68 65    # NOTE: Is the
4b60: 20 73 70 65 63 69 66 69 65 64 20 64 61 74 61 62   specified datab
4b70: 61 73 65 20 66 69 6c 65 20 6e 61 6d 65 20 72 65  ase file name re
4b80: 61 6c 6c 79 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  ally an in-memor
4b90: 79 20 64 61 74 61 62 61 73 65 3f 0d 0a 20 20 20  y database?..   
4ba0: 20 20 20 23 0d 0a 20 20 20 20 20 20 72 65 74 75     #..      retu
4bb0: 72 6e 20 5b 65 78 70 72 20 7b 24 66 69 6c 65 4e  rn [expr {$fileN
4bc0: 61 6d 65 20 65 71 20 22 3a 6d 65 6d 6f 72 79 3a  ame eq ":memory:
4bd0: 22 20 7c 7c 20 5c 0d 0a 20 20 20 20 20 20 20 20  " || \..        
4be0: 20 20 5b 73 74 72 69 6e 67 20 72 61 6e 67 65 20    [string range 
4bf0: 24 66 69 6c 65 4e 61 6d 65 20 30 20 31 32 5d 20  $fileName 0 12] 
4c00: 65 71 20 22 66 69 6c 65 3a 3a 6d 65 6d 6f 72 79  eq "file::memory
4c10: 3a 22 7d 5d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a  :"}]..    }.....
4c20: 20 20 20 20 70 72 6f 63 20 73 65 74 75 70 44 62      proc setupDb
4c30: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
4c40: 66 69 6c 65 4e 61 6d 65 20 7b 6d 6f 64 65 20 22  fileName {mode "
4c50: 22 7d 20 7b 64 61 74 65 54 69 6d 65 46 6f 72 6d  "} {dateTimeForm
4c60: 61 74 20 22 22 7d 20 7b 64 61 74 65 54 69 6d 65  at ""} {dateTime
4c70: 4b 69 6e 64 20 22 22 7d 20 7b 66 6c 61 67 73 20  Kind ""} {flags 
4c80: 22 22 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ""}..           
4c90: 20 7b 65 78 74 72 61 20 22 22 7d 20 7b 71 75 61   {extra ""} {qua
4ca0: 6c 69 66 79 20 74 72 75 65 7d 20 7b 64 65 6c 65  lify true} {dele
4cb0: 74 65 20 74 72 75 65 7d 20 7b 75 72 69 20 66 61  te true} {uri fa
4cc0: 6c 73 65 7d 20 7b 76 61 72 4e 61 6d 65 20 64 62  lse} {varName db
4cd0: 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a  } } {..      #..
4ce0: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 46 69        # NOTE: Fi
4cf0: 72 73 74 2c 20 73 65 65 20 69 66 20 74 68 65 20  rst, see if the 
4d00: 63 61 6c 6c 65 72 20 68 61 73 20 72 65 71 75 65  caller has reque
4d10: 73 74 65 64 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  sted an in-memor
4d20: 79 20 64 61 74 61 62 61 73 65 2e 0d 0a 20 20 20  y database...   
4d30: 20 20 20 23 0d 0a 20 20 20 20 20 20 73 65 74 20     #..      set 
4d40: 69 73 4d 65 6d 6f 72 79 20 5b 69 73 4d 65 6d 6f  isMemory [isMemo
4d50: 72 79 44 62 20 24 66 69 6c 65 4e 61 6d 65 5d 0d  ryDb $fileName].
4d60: 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
4d70: 20 20 23 20 4e 4f 54 45 3a 20 46 6f 72 20 6e 6f    # NOTE: For no
4d80: 77 2c 20 61 6c 6c 20 74 65 73 74 20 64 61 74 61  w, all test data
4d90: 62 61 73 65 73 20 75 73 65 64 20 62 79 20 74 68  bases used by th
4da0: 65 20 74 65 73 74 20 73 75 69 74 65 20 61 72 65  e test suite are
4db0: 20 70 6c 61 63 65 64 20 69 6e 74 6f 0d 0a 20 20   placed into..  
4dc0: 20 20 20 20 23 20 20 20 20 20 20 20 74 68 65 20      #       the 
4dd0: 74 65 6d 70 6f 72 61 72 79 20 64 69 72 65 63 74  temporary direct
4de0: 6f 72 79 2e 20 20 45 61 63 68 20 64 61 74 61 62  ory.  Each datab
4df0: 61 73 65 20 75 73 65 64 20 62 79 20 61 20 74 65  ase used by a te
4e00: 73 74 20 73 68 6f 75 6c 64 20 62 65 0d 0a 20 20  st should be..  
4e10: 20 20 20 20 23 20 20 20 20 20 20 20 63 6c 65 61      #       clea
4e20: 6e 65 64 20 75 70 20 62 79 20 74 68 61 74 20 74  ned up by that t
4e30: 65 73 74 20 75 73 69 6e 67 20 74 68 65 20 22 63  est using the "c
4e40: 6c 65 61 6e 75 70 44 62 22 20 70 72 6f 63 65 64  leanupDb" proced
4e50: 75 72 65 2c 20 62 65 6c 6f 77 2e 0d 0a 20 20 20  ure, below...   
4e60: 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
4e70: 21 24 69 73 4d 65 6d 6f 72 79 20 26 26 20 24 71  !$isMemory && $q
4e80: 75 61 6c 69 66 79 7d 20 74 68 65 6e 20 7b 0d 0a  ualify} then {..
4e90: 20 20 20 20 20 20 20 20 73 65 74 20 66 69 6c 65          set file
4ea0: 4e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20  Name [file join 
4eb0: 5b 67 65 74 44 61 74 61 62 61 73 65 44 69 72 65  [getDatabaseDire
4ec0: 63 74 6f 72 79 5d 20 5b 66 69 6c 65 20 74 61 69  ctory] [file tai
4ed0: 6c 20 24 66 69 6c 65 4e 61 6d 65 5d 5d 0d 0a 20  l $fileName]].. 
4ee0: 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
4ef0: 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
4f00: 20 42 79 20 64 65 66 61 75 6c 74 2c 20 64 65 6c   By default, del
4f10: 65 74 65 20 61 6e 79 20 70 72 65 2d 65 78 69 73  ete any pre-exis
4f20: 74 69 6e 67 20 64 61 74 61 62 61 73 65 20 77 69  ting database wi
4f30: 74 68 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65  th the same file
4f40: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
4f50: 6e 61 6d 65 20 69 66 20 69 74 20 63 75 72 72 65  name if it curre
4f60: 6e 74 6c 79 20 65 78 69 73 74 73 2e 0d 0a 20 20  ntly exists...  
4f70: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20      #..      if 
4f80: 7b 21 24 69 73 4d 65 6d 6f 72 79 20 26 26 20 24  {!$isMemory && $
4f90: 64 65 6c 65 74 65 20 26 26 20 5b 66 69 6c 65 20  delete && [file 
4fa0: 65 78 69 73 74 73 20 24 66 69 6c 65 4e 61 6d 65  exists $fileName
4fb0: 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
4fc0: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
4fd0: 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74 20 74 6f  NOTE: Attempt to
4fe0: 20 64 65 6c 65 74 65 20 61 6e 79 20 70 72 65 2d   delete any pre-
4ff0: 65 78 69 73 74 69 6e 67 20 64 61 74 61 62 61 73  existing databas
5000: 65 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20  e with the same 
5010: 66 69 6c 65 0d 0a 20 20 20 20 20 20 20 20 23 20  file..        # 
5020: 20 20 20 20 20 20 6e 61 6d 65 2e 0d 0a 20 20 20        name...   
5030: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
5040: 69 66 20 7b 5b 63 61 74 63 68 20 7b 66 69 6c 65  if {[catch {file
5050: 20 64 65 6c 65 74 65 20 24 66 69 6c 65 4e 61 6d   delete $fileNam
5060: 65 7d 20 65 72 72 6f 72 5d 7d 20 74 68 65 6e 20  e} error]} then 
5070: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a  {..          #..
5080: 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45            # NOTE
5090: 3a 20 57 65 20 73 6f 6d 65 68 6f 77 20 66 61 69  : We somehow fai
50a0: 6c 65 64 20 74 6f 20 64 65 6c 65 74 65 20 74 68  led to delete th
50b0: 65 20 66 69 6c 65 2c 20 72 65 70 6f 72 74 20 77  e file, report w
50c0: 68 79 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23  hy...          #
50d0: 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70 75 74  ..          tput
50e0: 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
50f0: 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
5100: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22  .              "
5110: 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61  ==== WARNING: fa
5120: 69 6c 65 64 20 74 6f 20 64 65 6c 65 74 65 20 64  iled to delete d
5130: 61 74 61 62 61 73 65 20 66 69 6c 65 20 5c 22 22  atabase file \""
5140: 20 24 66 69 6c 65 4e 61 6d 65 20 5c 0d 0a 20 20   $fileName \..  
5150: 20 20 20 20 20 20 20 20 20 20 20 20 22 5c 22 20              "\" 
5160: 64 75 72 69 6e 67 20 73 65 74 75 70 2c 20 65 72  during setup, er
5170: 72 6f 72 3a 20 22 20 5c 6e 5c 74 20 24 65 72 72  ror: " \n\t $err
5180: 6f 72 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20  or \n]..        
5190: 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  }..      }....  
51a0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
51b0: 4f 54 45 3a 20 52 65 66 65 72 20 74 6f 20 74 68  OTE: Refer to th
51c0: 65 20 73 70 65 63 69 66 69 65 64 20 76 61 72 69  e specified vari
51d0: 61 62 6c 65 20 28 65 2e 67 2e 20 22 64 62 22 29  able (e.g. "db")
51e0: 20 69 6e 20 74 68 65 20 63 6f 6e 74 65 78 74 20   in the context 
51f0: 6f 66 20 74 68 65 0d 0a 20 20 20 20 20 20 23 20  of the..      # 
5200: 20 20 20 20 20 20 63 61 6c 6c 65 72 2e 20 20 54        caller.  T
5210: 68 65 20 68 61 6e 64 6c 65 20 74 6f 20 74 68 65  he handle to the
5220: 20 6f 70 65 6e 65 64 20 64 61 74 61 62 61 73 65   opened database
5230: 20 77 69 6c 6c 20 62 65 20 73 74 6f 72 65 64 20   will be stored 
5240: 74 68 65 72 65 2e 0d 0a 20 20 20 20 20 20 23 0d  there...      #.
5250: 0a 20 20 20 20 20 20 75 70 76 61 72 20 31 20 24  .      upvar 1 $
5260: 76 61 72 4e 61 6d 65 20 64 62 0d 0a 0d 0a 20 20  varName db....  
5270: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
5280: 4f 54 45 3a 20 53 74 61 72 74 20 62 75 69 6c 64  OTE: Start build
5290: 69 6e 67 20 74 68 65 20 63 6f 6e 6e 65 63 74 69  ing the connecti
52a0: 6f 6e 20 73 74 72 69 6e 67 2e 20 20 54 68 65 20  on string.  The 
52b0: 6f 6e 6c 79 20 72 65 71 75 69 72 65 64 20 70 6f  only required po
52c0: 72 74 69 6f 6e 0d 0a 20 20 20 20 20 20 23 20 20  rtion..      #  
52d0: 20 20 20 20 20 6f 66 20 74 68 65 20 63 6f 6e 6e       of the conn
52e0: 65 63 74 69 6f 6e 20 73 74 72 69 6e 67 20 69 73  ection string is
52f0: 20 74 68 65 20 64 61 74 61 20 73 6f 75 72 63 65   the data source
5300: 2c 20 77 68 69 63 68 20 63 6f 6e 74 61 69 6e 73  , which contains
5310: 20 74 68 65 0d 0a 20 20 20 20 20 20 23 20 20 20   the..      #   
5320: 20 20 20 20 64 61 74 61 62 61 73 65 20 66 69 6c      database fil
5330: 65 20 6e 61 6d 65 20 69 74 73 65 6c 66 2e 20 20  e name itself.  
5340: 49 66 20 74 68 65 20 63 61 6c 6c 65 72 20 77 61  If the caller wa
5350: 6e 74 73 20 74 6f 20 75 73 65 20 61 20 55 52 49  nts to use a URI
5360: 20 61 73 0d 0a 20 20 20 20 20 20 23 20 20 20 20   as..      #    
5370: 20 20 20 74 68 65 20 64 61 74 61 20 73 6f 75 72     the data sour
5380: 63 65 2c 20 75 73 65 20 74 68 65 20 46 75 6c 6c  ce, use the Full
5390: 55 72 69 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73  Uri connection s
53a0: 74 72 69 6e 67 20 70 72 6f 70 65 72 74 79 20 74  tring property t
53b0: 6f 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  o..      #      
53c0: 20 70 72 65 76 65 6e 74 20 74 68 65 20 64 61 74   prevent the dat
53d0: 61 20 73 6f 75 72 63 65 20 73 74 72 69 6e 67 20  a source string 
53e0: 66 72 6f 6d 20 62 65 69 6e 67 20 6d 61 6e 67 6c  from being mangl
53f0: 65 64 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  ed...      #..  
5400: 20 20 20 20 69 66 20 7b 24 75 72 69 7d 20 74 68      if {$uri} th
5410: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 65  en {..        se
5420: 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 7b 46 75  t connection {Fu
5430: 6c 6c 55 72 69 3d 24 7b 66 69 6c 65 4e 61 6d 65  llUri=${fileName
5440: 7d 7d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65  }}..      } else
5450: 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20   {..        set 
5460: 63 6f 6e 6e 65 63 74 69 6f 6e 20 7b 44 61 74 61  connection {Data
5470: 20 53 6f 75 72 63 65 3d 24 7b 66 69 6c 65 4e 61   Source=${fileNa
5480: 6d 65 7d 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d  me}}..      }...
5490: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
54a0: 23 20 4e 4f 54 45 3a 20 53 69 6e 63 65 20 74 68  # NOTE: Since th
54b0: 69 73 20 70 72 6f 63 65 64 75 72 65 20 68 61 73  is procedure has
54c0: 20 6e 6f 20 73 70 65 63 69 61 6c 20 6b 6e 6f 77   no special know
54d0: 6c 65 64 67 65 20 6f 66 20 77 68 61 74 20 74 68  ledge of what th
54e0: 65 20 64 65 66 61 75 6c 74 0d 0a 20 20 20 20 20  e default..     
54f0: 20 23 20 20 20 20 20 20 20 73 65 74 74 69 6e 67   #       setting
5500: 20 69 73 20 66 6f 72 20 74 68 65 20 54 6f 46 75   is for the ToFu
5510: 6c 6c 50 61 74 68 20 63 6f 6e 6e 65 63 74 69 6f  llPath connectio
5520: 6e 20 73 74 72 69 6e 67 20 70 72 6f 70 65 72 79  n string propery
5530: 2c 20 61 6c 77 61 79 73 0d 0a 20 20 20 20 20 20  , always..      
5540: 23 20 20 20 20 20 20 20 61 64 64 20 74 68 65 20  #       add the 
5550: 76 61 6c 75 65 20 77 65 20 6b 6e 6f 77 20 61 62  value we know ab
5560: 6f 75 74 20 74 6f 20 74 68 65 20 63 6f 6e 6e 65  out to the conne
5570: 63 74 69 6f 6e 20 73 74 72 69 6e 67 2e 0d 0a 20  ction string... 
5580: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 61 70       #..      ap
5590: 70 65 6e 64 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  pend connection 
55a0: 7b 3b 54 6f 46 75 6c 6c 50 61 74 68 3d 24 7b 71  {;ToFullPath=${q
55b0: 75 61 6c 69 66 79 7d 7d 0d 0a 0d 0a 20 20 20 20  ualify}}....    
55c0: 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
55d0: 45 3a 20 49 66 20 74 68 65 20 63 61 6c 6c 65 72  E: If the caller
55e0: 20 73 70 65 63 69 66 69 65 64 20 61 20 6a 6f 75   specified a jou
55f0: 72 6e 61 6c 20 6d 6f 64 65 2c 20 61 64 64 20 74  rnal mode, add t
5600: 68 65 20 6e 65 63 65 73 73 61 72 79 20 70 6f 72  he necessary por
5610: 74 69 6f 6e 0d 0a 20 20 20 20 20 20 23 20 20 20  tion..      #   
5620: 20 20 20 20 6f 66 20 74 68 65 20 63 6f 6e 6e 65      of the conne
5630: 63 74 69 6f 6e 20 73 74 72 69 6e 67 20 6e 6f 77  ction string now
5640: 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
5650: 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65    if {[string le
5660: 6e 67 74 68 20 24 6d 6f 64 65 5d 20 3e 20 30 7d  ngth $mode] > 0}
5670: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
5680: 20 61 70 70 65 6e 64 20 63 6f 6e 6e 65 63 74 69   append connecti
5690: 6f 6e 20 7b 3b 4a 6f 75 72 6e 61 6c 20 4d 6f 64  on {;Journal Mod
56a0: 65 3d 24 7b 6d 6f 64 65 7d 7d 0d 0a 20 20 20 20  e=${mode}}..    
56b0: 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a    }....      #..
56c0: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 66        # NOTE: If
56d0: 20 74 68 65 20 63 61 6c 6c 65 72 20 73 70 65 63   the caller spec
56e0: 69 66 69 65 64 20 61 20 44 61 74 65 54 69 6d 65  ified a DateTime
56f0: 20 66 6f 72 6d 61 74 2c 20 61 64 64 20 74 68 65   format, add the
5700: 20 6e 65 63 65 73 73 61 72 79 0d 0a 20 20 20 20   necessary..    
5710: 20 20 23 20 20 20 20 20 20 20 70 6f 72 74 69 6f    #       portio
5720: 6e 20 6f 66 20 74 68 65 20 63 6f 6e 6e 65 63 74  n of the connect
5730: 69 6f 6e 20 73 74 72 69 6e 67 20 6e 6f 77 2e 0d  ion string now..
5740: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
5750: 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67  if {[string leng
5760: 74 68 20 24 64 61 74 65 54 69 6d 65 46 6f 72 6d  th $dateTimeForm
5770: 61 74 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d  at] > 0} then {.
5780: 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 20  .        append 
5790: 63 6f 6e 6e 65 63 74 69 6f 6e 20 7b 3b 44 61 74  connection {;Dat
57a0: 65 54 69 6d 65 46 6f 72 6d 61 74 3d 24 7b 64 61  eTimeFormat=${da
57b0: 74 65 54 69 6d 65 46 6f 72 6d 61 74 7d 7d 0d 0a  teTimeFormat}}..
57c0: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
57d0: 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
57e0: 3a 20 49 66 20 74 68 65 20 63 61 6c 6c 65 72 20  : If the caller 
57f0: 73 70 65 63 69 66 69 65 64 20 61 20 44 61 74 65  specified a Date
5800: 54 69 6d 65 4b 69 6e 64 2c 20 61 64 64 20 74 68  TimeKind, add th
5810: 65 20 6e 65 63 65 73 73 61 72 79 20 70 6f 72 74  e necessary port
5820: 69 6f 6e 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ion..      #    
5830: 20 20 20 6f 66 20 74 68 65 20 63 6f 6e 6e 65 63     of the connec
5840: 74 69 6f 6e 20 73 74 72 69 6e 67 20 6e 6f 77 2e  tion string now.
5850: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
5860: 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e   if {[string len
5870: 67 74 68 20 24 64 61 74 65 54 69 6d 65 4b 69 6e  gth $dateTimeKin
5880: 64 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  d] > 0} then {..
5890: 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 20 63          append c
58a0: 6f 6e 6e 65 63 74 69 6f 6e 20 7b 3b 44 61 74 65  onnection {;Date
58b0: 54 69 6d 65 4b 69 6e 64 3d 24 7b 64 61 74 65 54  TimeKind=${dateT
58c0: 69 6d 65 4b 69 6e 64 7d 7d 0d 0a 20 20 20 20 20  imeKind}}..     
58d0: 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20   }....      #.. 
58e0: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 66 20       # NOTE: If 
58f0: 74 68 65 72 65 20 61 72 65 20 61 6e 79 20 67 6c  there are any gl
5900: 6f 62 61 6c 20 28 70 65 72 20 74 65 73 74 20 72  obal (per test r
5910: 75 6e 29 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66  un) connection f
5920: 6c 61 67 73 20 63 75 72 72 65 6e 74 6c 79 0d 0a  lags currently..
5930: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 73 65        #       se
5940: 74 2c 20 75 73 65 20 74 68 65 6d 20 6e 6f 77 20  t, use them now 
5950: 28 69 2e 65 2e 20 62 79 20 63 6f 6d 62 69 6e 69  (i.e. by combini
5960: 6e 67 20 74 68 65 6d 20 77 69 74 68 20 74 68 65  ng them with the
5970: 20 6f 6e 65 73 20 66 6f 72 20 74 68 69 73 0d 0a   ones for this..
5980: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63 6f        #       co
5990: 6e 6e 65 63 74 69 6f 6e 29 2e 0d 0a 20 20 20 20  nnection)...    
59a0: 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b    #..      if {[
59b0: 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 63 6f  info exists ::co
59c0: 6e 6e 65 63 74 69 6f 6e 5f 66 6c 61 67 73 5d 20  nnection_flags] 
59d0: 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  && \..          
59e0: 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
59f0: 3a 3a 63 6f 6e 6e 65 63 74 69 6f 6e 5f 66 6c 61  ::connection_fla
5a00: 67 73 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d  gs] > 0} then {.
5a10: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
5a20: 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 68 6f 77      # NOTE: Show
5a30: 20 28 61 6e 64 20 6c 6f 67 29 20 74 68 61 74 20   (and log) that 
5a40: 77 65 20 64 65 74 65 63 74 65 64 20 73 6f 6d 65  we detected some
5a50: 20 67 6c 6f 62 61 6c 20 63 6f 6e 6e 65 63 74 69   global connecti
5a60: 6f 6e 20 66 6c 61 67 73 2e 0d 0a 20 20 20 20 20  on flags...     
5a70: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 74 70     #..        tp
5a80: 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  uts $::test_chan
5a90: 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
5aa0: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22  \..            "
5ab0: 2d 2d 2d 2d 20 67 6c 6f 62 61 6c 20 63 6f 6e 6e  ---- global conn
5ac0: 65 63 74 69 6f 6e 20 66 6c 61 67 73 20 64 65 74  ection flags det
5ad0: 65 63 74 65 64 3a 20 22 20 24 3a 3a 63 6f 6e 6e  ected: " $::conn
5ae0: 65 63 74 69 6f 6e 5f 66 6c 61 67 73 20 5c 6e 5d  ection_flags \n]
5af0: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  ....        #.. 
5b00: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43         # NOTE: C
5b10: 6f 6d 62 69 6e 65 20 61 6e 64 2f 6f 72 20 72 65  ombine and/or re
5b20: 70 6c 61 63 65 20 74 68 65 20 63 6f 6e 6e 65 63  place the connec
5b30: 74 69 6f 6e 20 66 6c 61 67 73 20 61 6e 64 20 74  tion flags and t
5b40: 68 65 6e 20 73 68 6f 77 20 74 68 65 0d 0a 20 20  hen show the..  
5b50: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 6e 65        #       ne
5b60: 77 20 76 61 6c 75 65 2e 0d 0a 20 20 20 20 20 20  w value...      
5b70: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 73 65 74    #..        set
5b80: 20 66 6c 61 67 73 20 5b 63 6f 6d 62 69 6e 65 46   flags [combineF
5b90: 6c 61 67 73 20 24 66 6c 61 67 73 20 24 3a 3a 63  lags $flags $::c
5ba0: 6f 6e 6e 65 63 74 69 6f 6e 5f 66 6c 61 67 73 5d  onnection_flags]
5bb0: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74  ....        tput
5bc0: 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
5bd0: 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
5be0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d  .            "--
5bf0: 2d 2d 20 63 6f 6d 62 69 6e 65 64 20 63 6f 6e 6e  -- combined conn
5c00: 65 63 74 69 6f 6e 20 66 6c 61 67 73 20 61 72 65  ection flags are
5c10: 3a 20 22 20 24 66 6c 61 67 73 20 5c 6e 5d 0d 0a  : " $flags \n]..
5c20: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
5c30: 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
5c40: 3a 20 49 66 20 74 68 65 20 63 61 6c 6c 65 72 20  : If the caller 
5c50: 73 70 65 63 69 66 69 65 64 20 61 20 53 51 4c 69  specified a SQLi
5c60: 74 65 43 6f 6e 6e 65 63 74 69 6f 6e 46 6c 61 67  teConnectionFlag
5c70: 73 2c 20 61 64 64 20 74 68 65 20 6e 65 63 65 73  s, add the neces
5c80: 73 61 72 79 0d 0a 20 20 20 20 20 20 23 20 20 20  sary..      #   
5c90: 20 20 20 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74      portion of t
5ca0: 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 74  he connection st
5cb0: 72 69 6e 67 20 6e 6f 77 2e 0d 0a 20 20 20 20 20  ring now...     
5cc0: 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 73   #..      if {[s
5cd0: 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 66 6c  tring length $fl
5ce0: 61 67 73 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b  ags] > 0} then {
5cf0: 0d 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e 64  ..        append
5d00: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 7b 3b 46 6c   connection {;Fl
5d10: 61 67 73 3d 24 7b 66 6c 61 67 73 7d 7d 0d 0a 20  ags=${flags}}.. 
5d20: 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
5d30: 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
5d40: 20 49 66 20 74 68 65 20 63 61 6c 6c 65 72 20 73   If the caller s
5d50: 70 65 63 69 66 69 65 64 20 61 6e 20 65 78 74 72  pecified an extr
5d60: 61 20 70 61 79 6c 6f 61 64 20 74 6f 20 74 68 65  a payload to the
5d70: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 74 72 69   connection stri
5d80: 6e 67 2c 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ng,..      #    
5d90: 20 20 20 61 70 70 65 6e 64 20 69 74 20 6e 6f 77     append it now
5da0: 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
5db0: 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65    if {[string le
5dc0: 6e 67 74 68 20 24 65 78 74 72 61 5d 20 3e 20 30  ngth $extra] > 0
5dd0: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
5de0: 20 20 61 70 70 65 6e 64 20 63 6f 6e 6e 65 63 74    append connect
5df0: 69 6f 6e 20 5c 3b 20 24 65 78 74 72 61 0d 0a 20  ion \; $extra.. 
5e00: 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
5e10: 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
5e20: 20 4f 70 65 6e 20 74 68 65 20 64 61 74 61 62 61   Open the databa
5e30: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6e 6f  se connection no
5e40: 77 2c 20 70 6c 61 63 69 6e 67 20 74 68 65 20 6f  w, placing the o
5e50: 70 61 71 75 65 20 68 61 6e 64 6c 65 20 76 61 6c  paque handle val
5e60: 75 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  ue..      #     
5e70: 20 20 69 6e 74 6f 20 74 68 65 20 76 61 72 69 61    into the varia
5e80: 62 6c 65 20 73 70 65 63 69 66 69 65 64 20 62 79  ble specified by
5e90: 20 74 68 65 20 63 61 6c 6c 65 72 2e 0d 0a 20 20   the caller...  
5ea0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 73 65 74      #..      set
5eb0: 20 64 62 20 5b 73 71 6c 20 6f 70 65 6e 20 2d 74   db [sql open -t
5ec0: 79 70 65 20 53 51 4c 69 74 65 20 5b 73 75 62 73  ype SQLite [subs
5ed0: 74 20 24 63 6f 6e 6e 65 63 74 69 6f 6e 5d 5d 0d  t $connection]].
5ee0: 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70  .    }.....    p
5ef0: 72 6f 63 20 63 6c 65 61 6e 75 70 44 62 20 7b 20  roc cleanupDb { 
5f00: 66 69 6c 65 4e 61 6d 65 20 7b 76 61 72 4e 61 6d  fileName {varNam
5f10: 65 20 64 62 7d 20 7b 63 6f 6c 6c 65 63 74 20 74  e db} {collect t
5f20: 72 75 65 7d 20 7b 71 75 61 6c 69 66 79 20 74 72  rue} {qualify tr
5f30: 75 65 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ue}..           
5f40: 20 20 20 20 20 20 20 20 20 20 7b 64 65 6c 65 74            {delet
5f50: 65 20 74 72 75 65 7d 20 7d 20 7b 0d 0a 20 20 20  e true} } {..   
5f60: 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
5f70: 54 45 3a 20 41 74 74 65 6d 70 74 20 74 6f 20 66  TE: Attempt to f
5f80: 6f 72 63 65 20 61 6c 6c 20 70 65 6e 64 69 6e 67  orce all pending
5f90: 20 22 67 61 72 62 61 67 65 22 20 6f 62 6a 65 63   "garbage" objec
5fa0: 74 73 20 74 6f 20 62 65 20 63 6f 6c 6c 65 63 74  ts to be collect
5fb0: 65 64 2c 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ed,..      #    
5fc0: 20 20 20 69 6e 63 6c 75 64 69 6e 67 20 53 51 4c     including SQL
5fd0: 69 74 65 20 73 74 61 74 65 6d 65 6e 74 73 20 61  ite statements a
5fe0: 6e 64 20 62 61 63 6b 75 70 20 6f 62 6a 65 63 74  nd backup object
5ff0: 73 3b 20 74 68 69 73 20 73 68 6f 75 6c 64 20 61  s; this should a
6000: 6c 6c 6f 77 0d 0a 20 20 20 20 20 20 23 20 20 20  llow..      #   
6010: 20 20 20 20 74 68 65 20 75 6e 64 65 72 6c 79 69      the underlyi
6020: 6e 67 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ng database file
6030: 20 74 6f 20 62 65 20 64 65 6c 65 74 65 64 2e 0d   to be deleted..
6040: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
6050: 69 66 20 7b 24 63 6f 6c 6c 65 63 74 20 26 26 20  if {$collect && 
6060: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 63 61  \..          [ca
6070: 74 63 68 20 7b 6f 62 6a 65 63 74 20 69 6e 76 6f  tch {object invo
6080: 6b 65 20 47 43 20 47 65 74 54 6f 74 61 6c 4d 65  ke GC GetTotalMe
6090: 6d 6f 72 79 20 74 72 75 65 7d 20 65 72 72 6f 72  mory true} error
60a0: 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
60b0: 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
60c0: 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
60d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 3d 3d  .            "==
60e0: 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c  == WARNING: fail
60f0: 65 64 20 66 75 6c 6c 20 67 61 72 62 61 67 65 20  ed full garbage 
6100: 63 6f 6c 6c 65 63 74 69 6f 6e 2c 20 65 72 72 6f  collection, erro
6110: 72 3a 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20  r: " \..        
6120: 20 20 20 20 5c 6e 5c 74 20 24 65 72 72 6f 72 20      \n\t $error 
6130: 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a  \n]..      }....
6140: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
6150: 20 4e 4f 54 45 3a 20 52 65 66 65 72 20 74 6f 20   NOTE: Refer to 
6160: 74 68 65 20 73 70 65 63 69 66 69 65 64 20 76 61  the specified va
6170: 72 69 61 62 6c 65 20 28 65 2e 67 2e 20 22 64 62  riable (e.g. "db
6180: 22 29 20 69 6e 20 74 68 65 20 63 6f 6e 74 65 78  ") in the contex
6190: 74 20 6f 66 20 74 68 65 0d 0a 20 20 20 20 20 20  t of the..      
61a0: 23 20 20 20 20 20 20 20 63 61 6c 6c 65 72 2e 20  #       caller. 
61b0: 20 54 68 65 20 68 61 6e 64 6c 65 20 74 6f 20 74   The handle to t
61c0: 68 65 20 6f 70 65 6e 65 64 20 64 61 74 61 62 61  he opened databa
61d0: 73 65 20 69 73 20 73 74 6f 72 65 64 20 74 68 65  se is stored the
61e0: 72 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  re...      #..  
61f0: 20 20 20 20 75 70 76 61 72 20 31 20 24 76 61 72      upvar 1 $var
6200: 4e 61 6d 65 20 64 62 0d 0a 0d 0a 20 20 20 20 20  Name db....     
6210: 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
6220: 3a 20 43 6c 6f 73 65 20 74 68 65 20 63 6f 6e 6e  : Close the conn
6230: 65 63 74 69 6f 6e 20 74 6f 20 74 68 65 20 64 61  ection to the da
6240: 74 61 62 61 73 65 20 6e 6f 77 2e 20 20 54 68 69  tabase now.  Thi
6250: 73 20 73 68 6f 75 6c 64 20 61 6c 6c 6f 77 20 75  s should allow u
6260: 73 20 74 6f 0d 0a 20 20 20 20 20 20 23 20 20 20  s to..      #   
6270: 20 20 20 20 64 65 6c 65 74 65 20 74 68 65 20 75      delete the u
6280: 6e 64 65 72 6c 79 69 6e 67 20 64 61 74 61 62 61  nderlying databa
6290: 73 65 20 66 69 6c 65 2e 0d 0a 20 20 20 20 20 20  se file...      
62a0: 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 6e  #..      if {[in
62b0: 66 6f 20 65 78 69 73 74 73 20 64 62 5d 20 26 26  fo exists db] &&
62c0: 20 5b 63 61 74 63 68 20 7b 73 71 6c 20 63 6c 6f   [catch {sql clo
62d0: 73 65 20 24 64 62 7d 20 65 72 72 6f 72 5d 7d 20  se $db} error]} 
62e0: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
62f0: 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
6300: 45 3a 20 57 65 20 73 6f 6d 65 68 6f 77 20 66 61  E: We somehow fa
6310: 69 6c 65 64 20 74 6f 20 63 6c 6f 73 65 20 74 68  iled to close th
6320: 65 20 64 61 74 61 62 61 73 65 2c 20 72 65 70 6f  e database, repo
6330: 72 74 20 77 68 79 2e 0d 0a 20 20 20 20 20 20 20  rt why...       
6340: 20 23 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74   #..        tput
6350: 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
6360: 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
6370: 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 3d 3d  .            "==
6380: 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c  == WARNING: fail
6390: 65 64 20 74 6f 20 63 6c 6f 73 65 20 64 61 74 61  ed to close data
63a0: 62 61 73 65 20 5c 22 22 20 24 64 62 20 22 5c 22  base \"" $db "\"
63b0: 2c 20 65 72 72 6f 72 3a 20 22 20 5c 0d 0a 20 20  , error: " \..  
63c0: 20 20 20 20 20 20 20 20 20 20 5c 6e 5c 74 20 24            \n\t $
63d0: 65 72 72 6f 72 20 5c 6e 5d 0d 0a 20 20 20 20 20  error \n]..     
63e0: 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20   }....      #.. 
63f0: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 46 69 72       # NOTE: Fir
6400: 73 74 2c 20 73 65 65 20 69 66 20 74 68 65 20 63  st, see if the c
6410: 61 6c 6c 65 72 20 68 61 73 20 72 65 71 75 65 73  aller has reques
6420: 74 65 64 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79  ted an in-memory
6430: 20 64 61 74 61 62 61 73 65 2e 0d 0a 20 20 20 20   database...    
6440: 20 20 23 0d 0a 20 20 20 20 20 20 73 65 74 20 69    #..      set i
6450: 73 4d 65 6d 6f 72 79 20 5b 69 73 4d 65 6d 6f 72  sMemory [isMemor
6460: 79 44 62 20 24 66 69 6c 65 4e 61 6d 65 5d 0d 0a  yDb $fileName]..
6470: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
6480: 20 23 20 4e 4f 54 45 3a 20 42 75 69 6c 64 20 74   # NOTE: Build t
6490: 68 65 20 66 75 6c 6c 20 70 61 74 68 20 74 6f 20  he full path to 
64a0: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
64b0: 65 20 6e 61 6d 65 2e 20 20 46 6f 72 20 6e 6f 77  e name.  For now
64c0: 2c 20 61 6c 6c 20 74 65 73 74 0d 0a 20 20 20 20  , all test..    
64d0: 20 20 23 20 20 20 20 20 20 20 64 61 74 61 62 61    #       databa
64e0: 73 65 20 66 69 6c 65 73 20 61 72 65 20 73 74 6f  se files are sto
64f0: 72 65 64 20 69 6e 20 74 68 65 20 74 65 6d 70 6f  red in the tempo
6500: 72 61 72 79 20 64 69 72 65 63 74 6f 72 79 2e 0d  rary directory..
6510: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
6520: 69 66 20 7b 21 24 69 73 4d 65 6d 6f 72 79 20 26  if {!$isMemory &
6530: 26 20 24 71 75 61 6c 69 66 79 7d 20 74 68 65 6e  & $qualify} then
6540: 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20   {..        set 
6550: 66 69 6c 65 4e 61 6d 65 20 5b 66 69 6c 65 20 6a  fileName [file j
6560: 6f 69 6e 20 5b 67 65 74 44 61 74 61 62 61 73 65  oin [getDatabase
6570: 44 69 72 65 63 74 6f 72 79 5d 20 5b 66 69 6c 65  Directory] [file
6580: 20 74 61 69 6c 20 24 66 69 6c 65 4e 61 6d 65 5d   tail $fileName]
6590: 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  ]..      }....  
65a0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
65b0: 4f 54 45 3a 20 43 68 65 63 6b 20 69 66 20 74 68  OTE: Check if th
65c0: 65 20 66 69 6c 65 20 73 74 69 6c 6c 20 65 78 69  e file still exi
65d0: 73 74 73 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  sts...      #.. 
65e0: 20 20 20 20 20 69 66 20 7b 21 24 69 73 4d 65 6d       if {!$isMem
65f0: 6f 72 79 20 26 26 20 24 64 65 6c 65 74 65 20 26  ory && $delete &
6600: 26 20 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24  & [file exists $
6610: 66 69 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20  fileName]} then 
6620: 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
6630: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 6b        # NOTE: Sk
6640: 69 70 20 64 65 6c 65 74 69 6e 67 20 64 61 74 61  ip deleting data
6650: 62 61 73 65 20 66 69 6c 65 73 20 69 66 20 73 6f  base files if so
6660: 6d 65 62 6f 64 79 20 73 65 74 73 20 74 68 65 20  mebody sets the 
6670: 67 6c 6f 62 61 6c 0d 0a 20 20 20 20 20 20 20 20  global..        
6680: 23 20 20 20 20 20 20 20 76 61 72 69 61 62 6c 65  #       variable
6690: 20 74 6f 20 70 72 65 76 65 6e 74 20 69 74 2e 0d   to prevent it..
66a0: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
66b0: 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65      if {![info e
66c0: 78 69 73 74 73 20 3a 3a 6e 6f 28 63 6c 65 61 6e  xists ::no(clean
66d0: 75 70 44 62 46 69 6c 65 29 5d 7d 20 74 68 65 6e  upDbFile)]} then
66e0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d   {..          #.
66f0: 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54  .          # NOT
6700: 45 3a 20 41 74 74 65 6d 70 74 20 74 6f 20 64 65  E: Attempt to de
6710: 6c 65 74 65 20 74 68 65 20 74 65 73 74 20 64 61  lete the test da
6720: 74 61 62 61 73 65 20 66 69 6c 65 20 6e 6f 77 2e  tabase file now.
6730: 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20  ..          #.. 
6740: 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73 65           if {[se
6750: 74 20 63 6f 64 65 20 5b 63 61 74 63 68 20 7b 66  t code [catch {f
6760: 69 6c 65 20 64 65 6c 65 74 65 20 24 66 69 6c 65  ile delete $file
6770: 4e 61 6d 65 7d 20 65 72 72 6f 72 5d 5d 7d 20 74  Name} error]]} t
6780: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
6790: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
67a0: 20 20 23 20 4e 4f 54 45 3a 20 57 65 20 73 6f 6d    # NOTE: We som
67b0: 65 68 6f 77 20 66 61 69 6c 65 64 20 74 6f 20 64  ehow failed to d
67c0: 65 6c 65 74 65 20 74 68 65 20 66 69 6c 65 2c 20  elete the file, 
67d0: 72 65 70 6f 72 74 20 77 68 79 2e 0d 0a 20 20 20  report why...   
67e0: 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
67f0: 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
6800: 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61  :test_channel [a
6810: 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
6820: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 3d 3d               "==
6830: 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c  == WARNING: fail
6840: 65 64 20 74 6f 20 64 65 6c 65 74 65 20 64 61 74  ed to delete dat
6850: 61 62 61 73 65 20 66 69 6c 65 20 5c 22 22 20 24  abase file \"" $
6860: 66 69 6c 65 4e 61 6d 65 20 5c 0d 0a 20 20 20 20  fileName \..    
6870: 20 20 20 20 20 20 20 20 20 20 20 20 22 5c 22 20              "\" 
6880: 64 75 72 69 6e 67 20 63 6c 65 61 6e 75 70 2c 20  during cleanup, 
6890: 65 72 72 6f 72 3a 20 22 20 5c 6e 5c 74 20 24 65  error: " \n\t $e
68a0: 72 72 6f 72 20 5c 6e 5d 0d 0a 20 20 20 20 20 20  rror \n]..      
68b0: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d      }..        }
68c0: 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
68d0: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
68e0: 23 20 4e 4f 54 45 3a 20 53 68 6f 77 20 74 68 61  # NOTE: Show tha
68f0: 74 20 77 65 20 73 6b 69 70 70 65 64 20 64 65 6c  t we skipped del
6900: 65 74 69 6e 67 20 74 68 65 20 66 69 6c 65 2e 0d  eting the file..
6910: 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
6920: 20 20 20 20 20 20 20 20 73 65 74 20 63 6f 64 65          set code
6930: 20 30 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   0....          
6940: 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
6950: 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
6960: 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
6970: 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47     "==== WARNING
6980: 3a 20 73 6b 69 70 70 65 64 20 64 65 6c 65 74 69  : skipped deleti
6990: 6e 67 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ng database file
69a0: 20 5c 22 22 20 24 66 69 6c 65 4e 61 6d 65 20 5c   \"" $fileName \
69b0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
69c0: 22 5c 22 20 64 75 72 69 6e 67 20 63 6c 65 61 6e  "\" during clean
69d0: 75 70 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20  up\n"]..        
69e0: 7d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20  }..      } else 
69f0: 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
6a00: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68        # NOTE: Th
6a10: 65 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20  e file does not 
6a20: 65 78 69 73 74 2c 20 73 75 63 63 65 73 73 21 0d  exist, success!.
6a30: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
6a40: 20 20 20 20 73 65 74 20 63 6f 64 65 20 30 0d 0a      set code 0..
6a50: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
6a60: 20 72 65 74 75 72 6e 20 24 63 6f 64 65 0d 0a 20   return $code.. 
6a70: 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
6a80: 63 20 63 6c 65 61 6e 75 70 46 69 6c 65 20 7b 20  c cleanupFile { 
6a90: 66 69 6c 65 4e 61 6d 65 20 7b 63 6f 6c 6c 65 63  fileName {collec
6aa0: 74 20 74 72 75 65 7d 20 7b 66 6f 72 63 65 20 66  t true} {force f
6ab0: 61 6c 73 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20  alse} } {..     
6ac0: 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
6ad0: 3a 20 41 74 74 65 6d 70 74 20 74 6f 20 66 6f 72  : Attempt to for
6ae0: 63 65 20 61 6c 6c 20 70 65 6e 64 69 6e 67 20 22  ce all pending "
6af0: 67 61 72 62 61 67 65 22 20 6f 62 6a 65 63 74 73  garbage" objects
6b00: 20 74 6f 20 62 65 20 63 6f 6c 6c 65 63 74 65 64   to be collected
6b10: 2c 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  ,..      #      
6b20: 20 69 6e 63 6c 75 64 69 6e 67 20 53 51 4c 69 74   including SQLit
6b30: 65 20 73 74 61 74 65 6d 65 6e 74 73 20 61 6e 64  e statements and
6b40: 20 62 61 63 6b 75 70 20 6f 62 6a 65 63 74 73 3b   backup objects;
6b50: 20 74 68 69 73 20 73 68 6f 75 6c 64 20 61 6c 6c   this should all
6b60: 6f 77 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  ow..      #     
6b70: 20 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67    the underlying
6b80: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74   database file t
6b90: 6f 20 62 65 20 64 65 6c 65 74 65 64 2e 0d 0a 20  o be deleted... 
6ba0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66       #..      if
6bb0: 20 7b 24 63 6f 6c 6c 65 63 74 20 26 26 20 5c 0d   {$collect && \.
6bc0: 0a 20 20 20 20 20 20 20 20 20 20 5b 63 61 74 63  .          [catc
6bd0: 68 20 7b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65  h {object invoke
6be0: 20 47 43 20 47 65 74 54 6f 74 61 6c 4d 65 6d 6f   GC GetTotalMemo
6bf0: 72 79 20 74 72 75 65 7d 20 65 72 72 6f 72 5d 7d  ry true} error]}
6c00: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
6c10: 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
6c20: 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
6c30: 20 20 20 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d             "====
6c40: 20 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64   WARNING: failed
6c50: 20 66 75 6c 6c 20 67 61 72 62 61 67 65 20 63 6f   full garbage co
6c60: 6c 6c 65 63 74 69 6f 6e 2c 20 65 72 72 6f 72 3a  llection, error:
6c70: 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20   " \..          
6c80: 20 20 5c 6e 5c 74 20 24 65 72 72 6f 72 20 5c 6e    \n\t $error \n
6c90: 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  ]..      }....  
6ca0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
6cb0: 4f 54 45 3a 20 43 68 65 63 6b 20 69 66 20 74 68  OTE: Check if th
6cc0: 65 20 66 69 6c 65 20 73 74 69 6c 6c 20 65 78 69  e file still exi
6cd0: 73 74 73 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  sts...      #.. 
6ce0: 20 20 20 20 20 69 66 20 7b 5b 66 69 6c 65 20 65       if {[file e
6cf0: 78 69 73 74 73 20 24 66 69 6c 65 4e 61 6d 65 5d  xists $fileName]
6d00: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
6d10: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
6d20: 4f 54 45 3a 20 53 6b 69 70 20 64 65 6c 65 74 69  OTE: Skip deleti
6d30: 6e 67 20 74 65 73 74 20 66 69 6c 65 73 20 69 66  ng test files if
6d40: 20 73 6f 6d 65 62 6f 64 79 20 73 65 74 73 20 74   somebody sets t
6d50: 68 65 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62  he global variab
6d60: 6c 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  le..        #   
6d70: 20 20 20 20 74 6f 20 70 72 65 76 65 6e 74 20 69      to prevent i
6d80: 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  t...        #.. 
6d90: 20 20 20 20 20 20 20 69 66 20 7b 24 66 6f 72 63         if {$forc
6da0: 65 20 7c 7c 20 21 5b 69 6e 66 6f 20 65 78 69 73  e || ![info exis
6db0: 74 73 20 3a 3a 6e 6f 28 63 6c 65 61 6e 75 70 46  ts ::no(cleanupF
6dc0: 69 6c 65 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  ile)]} then {.. 
6dd0: 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
6de0: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 74        # NOTE: At
6df0: 74 65 6d 70 74 20 74 6f 20 64 65 6c 65 74 65 20  tempt to delete 
6e00: 74 68 65 20 74 65 73 74 20 66 69 6c 65 20 6e 6f  the test file no
6e10: 77 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d  w...          #.
6e20: 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b  .          if {[
6e30: 73 65 74 20 63 6f 64 65 20 5b 63 61 74 63 68 20  set code [catch 
6e40: 7b 66 69 6c 65 20 64 65 6c 65 74 65 20 24 66 69  {file delete $fi
6e50: 6c 65 4e 61 6d 65 7d 20 65 72 72 6f 72 5d 5d 7d  leName} error]]}
6e60: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
6e70: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
6e80: 20 20 20 20 23 20 4e 4f 54 45 3a 20 57 65 20 73      # NOTE: We s
6e90: 6f 6d 65 68 6f 77 20 66 61 69 6c 65 64 20 74 6f  omehow failed to
6ea0: 20 64 65 6c 65 74 65 20 74 68 65 20 66 69 6c 65   delete the file
6eb0: 2c 20 72 65 70 6f 72 74 20 77 68 79 2e 0d 0a 20  , report why... 
6ec0: 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
6ed0: 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
6ee0: 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
6ef0: 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
6f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
6f10: 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61  ==== WARNING: fa
6f20: 69 6c 65 64 20 74 6f 20 64 65 6c 65 74 65 20 74  iled to delete t
6f30: 65 73 74 20 66 69 6c 65 20 5c 22 22 20 24 66 69  est file \"" $fi
6f40: 6c 65 4e 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20  leName \..      
6f50: 20 20 20 20 20 20 20 20 20 20 22 5c 22 20 64 75            "\" du
6f60: 72 69 6e 67 20 63 6c 65 61 6e 75 70 2c 20 65 72  ring cleanup, er
6f70: 72 6f 72 3a 20 22 20 5c 6e 5c 74 20 24 65 72 72  ror: " \n\t $err
6f80: 6f 72 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20  or \n]..        
6f90: 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 20 65    }..        } e
6fa0: 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  lse {..         
6fb0: 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20   #..          # 
6fc0: 4e 4f 54 45 3a 20 53 68 6f 77 20 74 68 61 74 20  NOTE: Show that 
6fd0: 77 65 20 73 6b 69 70 70 65 64 20 64 65 6c 65 74  we skipped delet
6fe0: 69 6e 67 20 74 68 65 20 66 69 6c 65 2e 0d 0a 20  ing the file... 
6ff0: 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
7000: 20 20 20 20 20 20 73 65 74 20 63 6f 64 65 20 30        set code 0
7010: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70  ....          tp
7020: 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  uts $::test_chan
7030: 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
7040: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
7050: 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20   "==== WARNING: 
7060: 73 6b 69 70 70 65 64 20 64 65 6c 65 74 69 6e 67  skipped deleting
7070: 20 74 65 73 74 20 66 69 6c 65 20 5c 22 22 20 24   test file \"" $
7080: 66 69 6c 65 4e 61 6d 65 20 5c 0d 0a 20 20 20 20  fileName \..    
7090: 20 20 20 20 20 20 20 20 20 20 22 5c 22 20 64 75            "\" du
70a0: 72 69 6e 67 20 63 6c 65 61 6e 75 70 5c 6e 22 5d  ring cleanup\n"]
70b0: 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20  ..        }..   
70c0: 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
70d0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
70e0: 23 20 4e 4f 54 45 3a 20 54 68 65 20 66 69 6c 65  # NOTE: The file
70f0: 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2c   does not exist,
7100: 20 73 75 63 63 65 73 73 21 0d 0a 20 20 20 20 20   success!..     
7110: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 73 65     #..        se
7120: 74 20 63 6f 64 65 20 30 0d 0a 20 20 20 20 20 20  t code 0..      
7130: 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65 74 75 72  }....      retur
7140: 6e 20 24 63 6f 64 65 0d 0a 20 20 20 20 7d 0d 0a  n $code..    }..
7150: 0c 0d 0a 20 20 20 20 70 72 6f 63 20 72 65 70 6f  ...    proc repo
7160: 72 74 53 51 4c 69 74 65 52 65 73 6f 75 72 63 65  rtSQLiteResource
7170: 73 20 7b 20 63 68 61 6e 6e 65 6c 20 7b 71 75 69  s { channel {qui
7180: 65 74 20 66 61 6c 73 65 7d 20 7b 63 6f 6c 6c 65  et false} {colle
7190: 63 74 20 74 72 75 65 7d 20 7d 20 7b 0d 0a 20 20  ct true} } {..  
71a0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
71b0: 4f 54 45 3a 20 53 6b 69 70 20 61 6c 6c 20 6f 75  OTE: Skip all ou
71c0: 74 70 75 74 20 69 66 20 77 65 20 61 72 65 20 72  tput if we are r
71d0: 75 6e 6e 69 6e 67 20 69 6e 20 22 71 75 69 65 74  unning in "quiet
71e0: 22 20 6d 6f 64 65 2e 0d 0a 20 20 20 20 20 20 23  " mode...      #
71f0: 0d 0a 20 20 20 20 20 20 69 66 20 7b 21 24 71 75  ..      if {!$qu
7200: 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  iet} then {..   
7210: 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
7220: 6e 65 6c 20 22 2d 2d 2d 2d 20 63 75 72 72 65 6e  nel "---- curren
7230: 74 20 6d 65 6d 6f 72 79 20 69 6e 20 75 73 65 20  t memory in use 
7240: 62 79 20 53 51 4c 69 74 65 2e 2e 2e 20 22 0d 0a  by SQLite... "..
7250: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
7260: 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 6f 62 6a   if {[catch {obj
7270: 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67  ect invoke -flag
7280: 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a  s +NonPublic \..
7290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 79                Sy
72a0: 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
72b0: 2e 55 6e 73 61 66 65 4e 61 74 69 76 65 4d 65 74  .UnsafeNativeMet
72c0: 68 6f 64 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  hods \..        
72d0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 65        sqlite3_me
72e0: 6d 6f 72 79 5f 75 73 65 64 7d 20 6d 65 6d 6f 72  mory_used} memor
72f0: 79 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d  y] == 0} then {.
7300: 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71  .        if {!$q
7310: 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  uiet} then {..  
7320: 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
7330: 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
7340: 67 73 20 24 6d 65 6d 6f 72 79 20 22 20 62 79 74  gs $memory " byt
7350: 65 73 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20  es\n"]..        
7360: 7d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20  }..      } else 
7370: 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
7380: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4d 61        # NOTE: Ma
7390: 79 62 65 20 74 68 65 20 53 51 4c 69 74 65 20 6e  ybe the SQLite n
73a0: 61 74 69 76 65 20 6c 69 62 72 61 72 79 20 69 73  ative library is
73b0: 20 75 6e 61 76 61 69 6c 61 62 6c 65 3f 0d 0a 20   unavailable?.. 
73c0: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
73d0: 20 20 73 65 74 20 6d 65 6d 6f 72 79 20 75 6e 6b    set memory unk
73e0: 6e 6f 77 6e 0d 0a 0d 0a 20 20 20 20 20 20 20 20  nown....        
73f0: 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65  if {!$quiet} the
7400: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74  n {..          t
7410: 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61  puts $channel [a
7420: 70 70 65 6e 64 41 72 67 73 20 24 6d 65 6d 6f 72  ppendArgs $memor
7430: 79 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 7d  y \n]..        }
7440: 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
7450: 20 20 20 73 65 74 20 72 65 73 75 6c 74 20 24 6d     set result $m
7460: 65 6d 6f 72 79 3b 20 23 20 4e 4f 54 45 3a 20 52  emory; # NOTE: R
7470: 65 74 75 72 6e 20 6d 65 6d 6f 72 79 20 69 6e 2d  eturn memory in-
7480: 75 73 65 20 74 6f 20 63 61 6c 6c 65 72 2e 0d 0a  use to caller...
7490: 0d 0a 20 20 20 20 20 20 69 66 20 7b 21 24 71 75  ..      if {!$qu
74a0: 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  iet} then {..   
74b0: 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
74c0: 6e 65 6c 20 22 2d 2d 2d 2d 20 6d 61 78 69 6d 75  nel "---- maximu
74d0: 6d 20 6d 65 6d 6f 72 79 20 69 6e 20 75 73 65 20  m memory in use 
74e0: 62 79 20 53 51 4c 69 74 65 2e 2e 2e 20 22 0d 0a  by SQLite... "..
74f0: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
7500: 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 6f 62 6a   if {[catch {obj
7510: 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67  ect invoke -flag
7520: 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a  s +NonPublic \..
7530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 79                Sy
7540: 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
7550: 2e 55 6e 73 61 66 65 4e 61 74 69 76 65 4d 65 74  .UnsafeNativeMet
7560: 68 6f 64 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  hods \..        
7570: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 65        sqlite3_me
7580: 6d 6f 72 79 5f 68 69 67 68 77 61 74 65 72 20 30  mory_highwater 0
7590: 7d 20 6d 65 6d 6f 72 79 5d 20 3d 3d 20 30 7d 20  } memory] == 0} 
75a0: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
75b0: 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65  if {!$quiet} the
75c0: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74  n {..          t
75d0: 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61  puts $channel [a
75e0: 70 70 65 6e 64 41 72 67 73 20 24 6d 65 6d 6f 72  ppendArgs $memor
75f0: 79 20 22 20 62 79 74 65 73 5c 6e 22 5d 0d 0a 20  y " bytes\n"].. 
7600: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
7610: 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
7620: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
7630: 4f 54 45 3a 20 4d 61 79 62 65 20 74 68 65 20 53  OTE: Maybe the S
7640: 51 4c 69 74 65 20 6e 61 74 69 76 65 20 6c 69 62  QLite native lib
7650: 72 61 72 79 20 69 73 20 75 6e 61 76 61 69 6c 61  rary is unavaila
7660: 62 6c 65 3f 0d 0a 20 20 20 20 20 20 20 20 23 0d  ble?..        #.
7670: 0a 20 20 20 20 20 20 20 20 73 65 74 20 6d 65 6d  .        set mem
7680: 6f 72 79 20 75 6e 6b 6e 6f 77 6e 0d 0a 0d 0a 20  ory unknown.... 
7690: 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69         if {!$qui
76a0: 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  et} then {..    
76b0: 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
76c0: 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
76d0: 20 24 6d 65 6d 6f 72 79 20 5c 6e 5d 0d 0a 20 20   $memory \n]..  
76e0: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d        }..      }
76f0: 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 24 63  ....      if {$c
7700: 6f 6c 6c 65 63 74 7d 20 74 68 65 6e 20 7b 0d 0a  ollect} then {..
7710: 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74          if {[cat
7720: 63 68 20 7b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b  ch {object invok
7730: 65 20 47 43 20 47 65 74 54 6f 74 61 6c 4d 65 6d  e GC GetTotalMem
7740: 6f 72 79 20 74 72 75 65 7d 20 65 72 72 6f 72 5d  ory true} error]
7750: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
7760: 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
7770: 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
7780: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
7790: 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66  "==== WARNING: f
77a0: 61 69 6c 65 64 20 66 75 6c 6c 20 67 61 72 62 61  ailed full garba
77b0: 67 65 20 63 6f 6c 6c 65 63 74 69 6f 6e 2c 20 65  ge collection, e
77c0: 72 72 6f 72 3a 20 22 20 5c 0d 0a 20 20 20 20 20  rror: " \..     
77d0: 20 20 20 20 20 20 20 20 20 5c 6e 5c 74 20 24 65           \n\t $e
77e0: 72 72 6f 72 20 5c 6e 5d 0d 0a 20 20 20 20 20 20  rror \n]..      
77f0: 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a    }..      }....
7800: 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65        if {!$quie
7810: 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  t} then {..     
7820: 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
7830: 6c 20 22 2d 2d 2d 2d 20 63 75 72 72 65 6e 74 20  l "---- current 
7840: 6d 65 6d 6f 72 79 20 69 6e 20 75 73 65 20 62 79  memory in use by
7850: 20 74 68 65 20 43 4c 52 2e 2e 2e 20 22 0d 0a 20   the CLR... ".. 
7860: 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
7870: 69 66 20 7b 5b 63 61 74 63 68 20 7b 6f 62 6a 65  if {[catch {obje
7880: 63 74 20 69 6e 76 6f 6b 65 20 47 43 20 47 65 74  ct invoke GC Get
7890: 54 6f 74 61 6c 4d 65 6d 6f 72 79 20 66 61 6c 73  TotalMemory fals
78a0: 65 7d 20 6d 65 6d 6f 72 79 5d 20 3d 3d 20 30 7d  e} memory] == 0}
78b0: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
78c0: 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 69 73 20   if {[string is 
78d0: 69 6e 74 65 67 65 72 20 2d 73 74 72 69 63 74 20  integer -strict 
78e0: 24 6d 65 6d 6f 72 79 5d 7d 20 74 68 65 6e 20 7b  $memory]} then {
78f0: 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b  ..          if {
7900: 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d  !$quiet} then {.
7910: 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75  .            tpu
7920: 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70  ts $channel [app
7930: 65 6e 64 41 72 67 73 20 24 6d 65 6d 6f 72 79 20  endArgs $memory 
7940: 22 20 62 79 74 65 73 5c 6e 22 5d 0d 0a 20 20 20  " bytes\n"]..   
7950: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
7960: 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
7970: 20 20 20 20 20 20 73 65 74 20 6d 65 6d 6f 72 79        set memory
7980: 20 69 6e 76 61 6c 69 64 0d 0a 0d 0a 20 20 20 20   invalid....    
7990: 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65        if {!$quie
79a0: 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  t} then {..     
79b0: 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
79c0: 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
79d0: 73 20 24 6d 65 6d 6f 72 79 20 5c 6e 5d 0d 0a 20  s $memory \n].. 
79e0: 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
79f0: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 20 65      }..      } e
7a00: 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 73  lse {..        s
7a10: 65 74 20 6d 65 6d 6f 72 79 20 75 6e 6b 6e 6f 77  et memory unknow
7a20: 6e 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20  n....        if 
7a30: 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b  {!$quiet} then {
7a40: 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70 75 74  ..          tput
7a50: 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  s $channel [appe
7a60: 6e 64 41 72 67 73 20 24 6d 65 6d 6f 72 79 20 5c  ndArgs $memory \
7a70: 6e 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20  n]..        }.. 
7a80: 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
7a90: 72 65 74 75 72 6e 20 24 72 65 73 75 6c 74 0d 0a  return $result..
7aa0: 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
7ab0: 6f 63 20 72 75 6e 53 51 4c 69 74 65 54 65 73 74  oc runSQLiteTest
7ac0: 50 72 6f 6c 6f 67 75 65 20 7b 7d 20 7b 0d 0a 20  Prologue {} {.. 
7ad0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
7ae0: 4e 4f 54 45 3a 20 53 6b 69 70 20 72 75 6e 6e 69  NOTE: Skip runni
7af0: 6e 67 20 6f 75 72 20 63 75 73 74 6f 6d 20 70 72  ng our custom pr
7b00: 6f 6c 6f 67 75 65 20 69 66 20 74 68 65 20 6d 61  ologue if the ma
7b10: 69 6e 20 6f 6e 65 20 68 61 73 20 62 65 65 6e 20  in one has been 
7b20: 73 6b 69 70 70 65 64 2e 0d 0a 20 20 20 20 20 20  skipped...      
7b30: 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 21 5b 69  #..      if {![i
7b40: 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28  nfo exists ::no(
7b50: 70 72 6f 6c 6f 67 75 65 2e 65 61 67 6c 65 29 5d  prologue.eagle)]
7b60: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
7b70: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
7b80: 4f 54 45 3a 20 53 6b 69 70 20 61 6c 6c 20 53 79  OTE: Skip all Sy
7b90: 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
7ba0: 20 72 65 6c 61 74 65 64 20 66 69 6c 65 20 68 61   related file ha
7bb0: 6e 64 6c 69 6e 67 20 28 64 65 6c 65 74 69 6e 67  ndling (deleting
7bc0: 2c 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  ,..        #    
7bd0: 20 20 20 63 6f 70 79 69 6e 67 2c 20 61 6e 64 20     copying, and 
7be0: 6c 6f 61 64 69 6e 67 29 20 69 66 20 77 65 20 61  loading) if we a
7bf0: 72 65 20 73 6f 20 69 6e 73 74 72 75 63 74 65 64  re so instructed
7c00: 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
7c10: 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f        if {![info
7c20: 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 73 71 6c   exists ::no(sql
7c30: 69 74 65 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e  iteFiles)]} then
7c40: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d   {..          #.
7c50: 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54  .          # NOT
7c60: 45 3a 20 53 6b 69 70 20 74 72 79 69 6e 67 20 74  E: Skip trying t
7c70: 6f 20 64 65 6c 65 74 65 20 61 6e 79 20 66 69 6c  o delete any fil
7c80: 65 73 20 69 66 20 77 65 20 61 72 65 20 73 6f 20  es if we are so 
7c90: 69 6e 73 74 72 75 63 74 65 64 2e 0d 0a 20 20 20  instructed...   
7ca0: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
7cb0: 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65      if {![info e
7cc0: 78 69 73 74 73 20 3a 3a 6e 6f 28 64 65 6c 65 74  xists ::no(delet
7cd0: 65 53 71 6c 69 74 65 46 69 6c 65 73 29 5d 7d 20  eSqliteFiles)]} 
7ce0: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
7cf0: 20 20 20 20 74 72 79 44 65 6c 65 74 65 41 73 73      tryDeleteAss
7d00: 65 6d 62 6c 79 20 73 71 6c 69 74 65 33 2e 64 6c  embly sqlite3.dl
7d10: 6c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  l..            r
7d20: 65 6d 6f 76 65 43 6f 6e 73 74 72 61 69 6e 74 20  emoveConstraint 
7d30: 66 69 6c 65 5f 73 71 6c 69 74 65 33 2e 64 6c 6c  file_sqlite3.dll
7d40: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
7d50: 74 72 79 44 65 6c 65 74 65 41 73 73 65 6d 62 6c  tryDeleteAssembl
7d60: 79 20 53 51 4c 69 74 65 2e 49 6e 74 65 72 6f 70  y SQLite.Interop
7d70: 2e 64 6c 6c 0d 0a 20 20 20 20 20 20 20 20 20 20  .dll..          
7d80: 20 20 72 65 6d 6f 76 65 43 6f 6e 73 74 72 61 69    removeConstrai
7d90: 6e 74 20 66 69 6c 65 5f 53 51 4c 69 74 65 2e 49  nt file_SQLite.I
7da0: 6e 74 65 72 6f 70 2e 64 6c 6c 0d 0a 0d 0a 20 20  nterop.dll....  
7db0: 20 20 20 20 20 20 20 20 20 20 74 72 79 44 65 6c            tryDel
7dc0: 65 74 65 41 73 73 65 6d 62 6c 79 20 53 79 73 74  eteAssembly Syst
7dd0: 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 64  em.Data.SQLite.d
7de0: 6c 6c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ll..            
7df0: 72 65 6d 6f 76 65 43 6f 6e 73 74 72 61 69 6e 74  removeConstraint
7e00: 20 66 69 6c 65 5f 53 79 73 74 65 6d 2e 44 61 74   file_System.Dat
7e10: 61 2e 53 51 4c 69 74 65 2e 64 6c 6c 0d 0a 0d 0a  a.SQLite.dll....
7e20: 20 20 20 20 20 20 20 20 20 20 20 20 74 72 79 44              tryD
7e30: 65 6c 65 74 65 41 73 73 65 6d 62 6c 79 20 53 79  eleteAssembly Sy
7e40: 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
7e50: 2e 4c 69 6e 71 2e 64 6c 6c 0d 0a 20 20 20 20 20  .Linq.dll..     
7e60: 20 20 20 20 20 20 20 72 65 6d 6f 76 65 43 6f 6e         removeCon
7e70: 73 74 72 61 69 6e 74 20 66 69 6c 65 5f 53 79 73  straint file_Sys
7e80: 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e  tem.Data.SQLite.
7e90: 4c 69 6e 71 2e 64 6c 6c 0d 0a 20 20 20 20 20 20  Linq.dll..      
7ea0: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
7eb0: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
7ec0: 23 20 4e 4f 54 45 3a 20 53 6b 69 70 20 74 72 79  # NOTE: Skip try
7ed0: 69 6e 67 20 74 6f 20 63 6f 70 79 20 61 6e 79 20  ing to copy any 
7ee0: 66 69 6c 65 73 20 69 66 20 77 65 20 61 72 65 20  files if we are 
7ef0: 73 6f 20 69 6e 73 74 72 75 63 74 65 64 2e 0d 0a  so instructed...
7f00: 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
7f10: 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66         if {![inf
7f20: 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 63 6f  o exists ::no(co
7f30: 70 79 53 71 6c 69 74 65 46 69 6c 65 73 29 5d 7d  pySqliteFiles)]}
7f40: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
7f50: 20 20 20 20 20 74 72 79 43 6f 70 79 41 73 73 65       tryCopyAsse
7f60: 6d 62 6c 79 20 73 71 6c 69 74 65 33 2e 64 6c 6c  mbly sqlite3.dll
7f70: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 72  ..            tr
7f80: 79 43 6f 70 79 41 73 73 65 6d 62 6c 79 20 53 51  yCopyAssembly SQ
7f90: 4c 69 74 65 2e 49 6e 74 65 72 6f 70 2e 64 6c 6c  Lite.Interop.dll
7fa0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 72  ..            tr
7fb0: 79 43 6f 70 79 41 73 73 65 6d 62 6c 79 20 53 79  yCopyAssembly Sy
7fc0: 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
7fd0: 2e 64 6c 6c 0d 0a 20 20 20 20 20 20 20 20 20 20  .dll..          
7fe0: 20 20 74 72 79 43 6f 70 79 41 73 73 65 6d 62 6c    tryCopyAssembl
7ff0: 79 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51  y System.Data.SQ
8000: 4c 69 74 65 2e 4c 69 6e 71 2e 64 6c 6c 0d 0a 20  Lite.Linq.dll.. 
8010: 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20           }....  
8020: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
8030: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 6b 69       # NOTE: Ski
8040: 70 20 74 72 79 69 6e 67 20 74 6f 20 6c 6f 61 64  p trying to load
8050: 20 61 6e 79 20 66 69 6c 65 73 20 69 66 20 77 65   any files if we
8060: 20 61 72 65 20 73 6f 20 69 6e 73 74 72 75 63 74   are so instruct
8070: 65 64 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23  ed...          #
8080: 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b  ..          if {
8090: 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  ![info exists ::
80a0: 6e 6f 28 6c 6f 61 64 53 71 6c 69 74 65 46 69 6c  no(loadSqliteFil
80b0: 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  es)]} then {..  
80c0: 20 20 20 20 20 20 20 20 20 20 74 72 79 4c 6f 61            tryLoa
80d0: 64 41 73 73 65 6d 62 6c 79 20 53 79 73 74 65 6d  dAssembly System
80e0: 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 64 6c 6c  .Data.SQLite.dll
80f0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 72  ..            tr
8100: 79 4c 6f 61 64 41 73 73 65 6d 62 6c 79 20 53 79  yLoadAssembly Sy
8110: 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
8120: 2e 4c 69 6e 71 2e 64 6c 6c 0d 0a 20 20 20 20 20  .Linq.dll..     
8130: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
8140: 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 63 61 74  }....        cat
8150: 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  ch {..          
8160: 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
8170: 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
8180: 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
8190: 20 20 20 22 2d 2d 2d 2d 20 66 69 6c 65 20 76 65     "---- file ve
81a0: 72 73 69 6f 6e 20 6f 66 20 5c 22 53 51 4c 69 74  rsion of \"SQLit
81b0: 65 2e 49 6e 74 65 72 6f 70 2e 64 6c 6c 5c 22 2e  e.Interop.dll\".
81c0: 2e 2e 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20  .. " \..        
81d0: 20 20 20 20 20 20 5b 66 69 6c 65 20 76 65 72 73        [file vers
81e0: 69 6f 6e 20 5b 67 65 74 42 69 6e 61 72 79 46 69  ion [getBinaryFi
81f0: 6c 65 4e 61 6d 65 20 53 51 4c 69 74 65 2e 49 6e  leName SQLite.In
8200: 74 65 72 6f 70 2e 64 6c 6c 5d 5d 20 5c 6e 5d 0d  terop.dll]] \n].
8210: 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  .        }....  
8220: 20 20 20 20 20 20 63 61 74 63 68 20 7b 0d 0a 20        catch {.. 
8230: 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
8240: 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b  ::test_channel [
8250: 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
8260: 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
8270: 2d 20 66 69 6c 65 20 76 65 72 73 69 6f 6e 20 6f  - file version o
8280: 66 20 5c 22 53 79 73 74 65 6d 2e 44 61 74 61 2e  f \"System.Data.
8290: 53 51 4c 69 74 65 2e 64 6c 6c 5c 22 2e 2e 2e 20  SQLite.dll\"... 
82a0: 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  " \..           
82b0: 20 20 20 5b 66 69 6c 65 20 76 65 72 73 69 6f 6e     [file version
82c0: 20 5b 67 65 74 42 69 6e 61 72 79 46 69 6c 65 4e   [getBinaryFileN
82d0: 61 6d 65 20 53 79 73 74 65 6d 2e 44 61 74 61 2e  ame System.Data.
82e0: 53 51 4c 69 74 65 2e 64 6c 6c 5d 5d 20 5c 6e 5d  SQLite.dll]] \n]
82f0: 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  ..        }.... 
8300: 20 20 20 20 20 20 20 63 61 74 63 68 20 7b 0d 0a         catch {..
8310: 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
8320: 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
8330: 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
8340: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d               "--
8350: 2d 2d 20 66 69 6c 65 20 76 65 72 73 69 6f 6e 20  -- file version 
8360: 6f 66 20 5c 22 53 79 73 74 65 6d 2e 44 61 74 61  of \"System.Data
8370: 2e 53 51 4c 69 74 65 2e 4c 69 6e 71 2e 64 6c 6c  .SQLite.Linq.dll
8380: 5c 22 2e 2e 2e 20 22 20 5c 0d 0a 20 20 20 20 20  \"... " \..     
8390: 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20 76           [file v
83a0: 65 72 73 69 6f 6e 20 5b 67 65 74 42 69 6e 61 72  ersion [getBinar
83b0: 79 46 69 6c 65 4e 61 6d 65 20 53 79 73 74 65 6d  yFileName System
83c0: 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 4c 69 6e  .Data.SQLite.Lin
83d0: 71 2e 64 6c 6c 5d 5d 20 5c 6e 5d 0d 0a 20 20 20  q.dll]] \n]..   
83e0: 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
83f0: 20 20 73 65 74 20 61 73 73 65 6d 62 6c 69 65 73    set assemblies
8400: 20 5b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20   [object invoke 
8410: 41 70 70 44 6f 6d 61 69 6e 2e 43 75 72 72 65 6e  AppDomain.Curren
8420: 74 44 6f 6d 61 69 6e 20 47 65 74 41 73 73 65 6d  tDomain GetAssem
8430: 62 6c 69 65 73 5d 0d 0a 0d 0a 20 20 20 20 20 20  blies]....      
8440: 20 20 6f 62 6a 65 63 74 20 66 6f 72 65 61 63 68    object foreach
8450: 20 61 73 73 65 6d 62 6c 79 20 24 61 73 73 65 6d   assembly $assem
8460: 62 6c 69 65 73 20 7b 0d 0a 20 20 20 20 20 20 20  blies {..       
8470: 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6d     if {[string m
8480: 61 74 63 68 20 5c 7b 53 79 73 74 65 6d 2e 44 61  atch \{System.Da
8490: 74 61 2e 53 51 4c 69 74 65 2a 20 24 61 73 73 65  ta.SQLite* $asse
84a0: 6d 62 6c 79 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  mbly]} then {.. 
84b0: 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
84c0: 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
84d0: 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
84e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
84f0: 22 2d 2d 2d 2d 20 66 6f 75 6e 64 20 61 73 73 65  "---- found asse
8500: 6d 62 6c 79 3a 20 22 20 24 61 73 73 65 6d 62 6c  mbly: " $assembl
8510: 79 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20  y \n]..         
8520: 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d   }..        }...
8530: 0a 20 20 20 20 20 20 20 20 63 61 74 63 68 20 7b  .        catch {
8540: 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70 75 74  ..          tput
8550: 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
8560: 6c 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  l \..           
8570: 20 20 20 22 2d 2d 2d 2d 20 64 65 66 69 6e 65 20     "---- define 
8580: 63 6f 6e 73 74 61 6e 74 73 20 66 6f 72 20 5c 22  constants for \"
8590: 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
85a0: 74 65 5c 22 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20  te\"... "....   
85b0: 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63         if {[catc
85c0: 68 20 7b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65  h {object invoke
85d0: 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c   -flags +NonPubl
85e0: 69 63 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  ic \..          
85f0: 20 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44          System.D
8600: 61 74 61 2e 53 51 4c 69 74 65 2e 53 51 4c 69 74  ata.SQLite.SQLit
8610: 65 33 20 44 65 66 69 6e 65 43 6f 6e 73 74 61 6e  e3 DefineConstan
8620: 74 73 7d 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ts} \..         
8630: 20 20 20 20 20 20 20 20 20 64 65 66 69 6e 65 43           defineC
8640: 6f 6e 73 74 61 6e 74 73 5d 20 3d 3d 20 30 7d 20  onstants] == 0} 
8650: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
8660: 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
8670: 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e  t_channel [appen
8680: 64 41 72 67 73 20 5b 66 6f 72 6d 61 74 4c 69 73  dArgs [formatLis
8690: 74 20 5b 6c 73 6f 72 74 20 5c 0d 0a 20 20 20 20  t [lsort \..    
86a0: 20 20 20 20 20 20 20 20 20 20 20 20 24 64 65 66              $def
86b0: 69 6e 65 43 6f 6e 73 74 61 6e 74 73 5d 5d 20 5c  ineConstants]] \
86c0: 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 20  n]..          } 
86d0: 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
86e0: 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
86f0: 74 5f 63 68 61 6e 6e 65 6c 20 75 6e 6b 6e 6f 77  t_channel unknow
8700: 6e 5c 6e 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  n\n..          }
8710: 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  ..        }.... 
8720: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
8730: 20 20 23 20 4e 4f 54 45 3a 20 4e 6f 77 2c 20 77    # NOTE: Now, w
8740: 65 20 6e 65 65 64 20 74 6f 20 6b 6e 6f 77 20 69  e need to know i
8750: 66 20 74 68 65 20 53 51 4c 69 74 65 20 63 6f 72  f the SQLite cor
8760: 65 20 6c 69 62 72 61 72 79 20 69 73 20 61 76 61  e library is ava
8770: 69 6c 61 62 6c 65 0d 0a 20 20 20 20 20 20 20 20  ilable..        
8780: 23 20 20 20 20 20 20 20 28 69 2e 65 2e 20 62 65  #       (i.e. be
8790: 63 61 75 73 65 20 74 68 65 20 6d 61 6e 61 67 65  cause the manage
87a0: 64 2d 6f 6e 6c 79 20 53 79 73 74 65 6d 2e 44 61  d-only System.Da
87b0: 74 61 2e 53 51 4c 69 74 65 20 61 73 73 65 6d 62  ta.SQLite assemb
87c0: 6c 79 20 63 61 6e 0d 0a 20 20 20 20 20 20 20 20  ly can..        
87d0: 23 20 20 20 20 20 20 20 6c 6f 61 64 20 77 69 74  #       load wit
87e0: 68 6f 75 74 20 69 74 3b 20 68 6f 77 65 76 65 72  hout it; however
87f0: 2c 20 69 74 20 63 61 6e 6e 6f 74 20 64 6f 20 61  , it cannot do a
8800: 6e 79 74 68 69 6e 67 20 75 73 65 66 75 6c 20 77  nything useful w
8810: 69 74 68 6f 75 74 0d 0a 20 20 20 20 20 20 20 20  ithout..        
8820: 23 20 20 20 20 20 20 20 69 74 29 2e 20 20 49 66  #       it).  If
8830: 20 77 65 20 61 72 65 20 75 73 69 6e 67 20 74 68   we are using th
8840: 65 20 6d 69 78 65 64 2d 6d 6f 64 65 20 61 73 73  e mixed-mode ass
8850: 65 6d 62 6c 79 20 61 6e 64 20 77 65 20 61 6c 72  embly and we alr
8860: 65 61 64 79 0d 0a 20 20 20 20 20 20 20 20 23 20  eady..        # 
8870: 20 20 20 20 20 20 66 6f 75 6e 64 20 69 74 20 28        found it (
8880: 61 62 6f 76 65 29 2c 20 74 68 69 73 20 73 68 6f  above), this sho
8890: 75 6c 64 20 61 6c 77 61 79 73 20 73 75 63 63 65  uld always succe
88a0: 65 64 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  ed...        #..
88b0: 20 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72          checkFor
88c0: 53 51 4c 69 74 65 20 24 3a 3a 74 65 73 74 5f 63  SQLite $::test_c
88d0: 68 61 6e 6e 65 6c 0d 0a 0d 0a 20 20 20 20 20 20  hannel....      
88e0: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
88f0: 4f 54 45 3a 20 43 68 65 63 6b 20 69 66 20 74 68  OTE: Check if th
8900: 65 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f  e sqlite3_win32_
8910: 73 65 74 5f 64 69 72 65 63 74 6f 72 79 20 66 75  set_directory fu
8920: 6e 63 74 69 6f 6e 20 69 73 20 61 76 61 69 6c 61  nction is availa
8930: 62 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  ble...        #.
8940: 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24  .        tputs $
8950: 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5c  ::test_channel \
8960: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 2d  ..            "-
8970: 2d 2d 2d 20 63 68 65 63 6b 69 6e 67 20 66 6f 72  --- checking for
8980: 20 66 75 6e 63 74 69 6f 6e 20 73 71 6c 69 74 65   function sqlite
8990: 33 5f 77 69 6e 33 32 5f 73 65 74 5f 64 69 72 65  3_win32_set_dire
89a0: 63 74 6f 72 79 2e 2e 2e 20 22 0d 0a 0d 0a 20 20  ctory... "....  
89b0: 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68        if {[catch
89c0: 20 7b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20   {object invoke 
89d0: 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69  -flags +NonPubli
89e0: 63 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  c \..           
89f0: 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61       System.Data
8a00: 2e 53 51 4c 69 74 65 2e 55 6e 73 61 66 65 4e 61  .SQLite.UnsafeNa
8a10: 74 69 76 65 4d 65 74 68 6f 64 73 20 5c 0d 0a 20  tiveMethods \.. 
8a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
8a30: 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 65 74  qlite3_win32_set
8a40: 5f 64 69 72 65 63 74 6f 72 79 20 30 20 6e 75 6c  _directory 0 nul
8a50: 6c 7d 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b  l}] == 0} then {
8a60: 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20  ..          #.. 
8a70: 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a           # NOTE:
8a80: 20 43 61 6c 6c 69 6e 67 20 74 68 65 20 73 71 6c   Calling the sql
8a90: 69 74 65 33 5f 77 69 6e 33 32 5f 73 65 74 5f 64  ite3_win32_set_d
8aa0: 69 72 65 63 74 6f 72 79 20 66 75 6e 63 74 69 6f  irectory functio
8ab0: 6e 20 64 6f 65 73 20 6e 6f 74 0d 0a 20 20 20 20  n does not..    
8ac0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63 61        #       ca
8ad0: 75 73 65 20 61 6e 20 65 78 63 65 70 74 69 6f 6e  use an exception
8ae0: 3b 20 74 68 65 72 65 66 6f 72 65 2c 20 69 74 20  ; therefore, it 
8af0: 6d 75 73 74 20 62 65 20 61 76 61 69 6c 61 62 6c  must be availabl
8b00: 65 20 28 69 2e 65 2e 0d 0a 20 20 20 20 20 20 20  e (i.e...       
8b10: 20 20 20 23 20 20 20 20 20 20 20 65 76 65 6e 20     #       even 
8b20: 74 68 6f 75 67 68 20 69 74 20 73 68 6f 75 6c 64  though it should
8b30: 20 72 65 74 75 72 6e 20 61 20 66 61 69 6c 75 72   return a failur
8b40: 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20 69 6e  e return code in
8b50: 20 74 68 69 73 0d 0a 20 20 20 20 20 20 20 20 20   this..         
8b60: 20 23 20 20 20 20 20 20 20 63 61 73 65 29 2e 0d   #       case)..
8b70: 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
8b80: 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74          addConst
8b90: 72 61 69 6e 74 20 73 71 6c 69 74 65 33 5f 77 69  raint sqlite3_wi
8ba0: 6e 33 32 5f 73 65 74 5f 64 69 72 65 63 74 6f 72  n32_set_director
8bb0: 79 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 74  y....          t
8bc0: 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
8bd0: 6e 6e 65 6c 20 79 65 73 5c 6e 0d 0a 20 20 20 20  nnel yes\n..    
8be0: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
8bf0: 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
8c00: 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 6e 6f  :test_channel no
8c10: 5c 6e 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d  \n..        }...
8c20: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
8c30: 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 74 74 65      # NOTE: Atte
8c40: 6d 70 74 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  mpt to determine
8c50: 20 69 66 20 74 68 65 20 63 75 73 74 6f 6d 20 65   if the custom e
8c60: 78 74 65 6e 73 69 6f 6e 20 66 75 6e 63 74 69 6f  xtension functio
8c70: 6e 73 20 77 65 72 65 0d 0a 20 20 20 20 20 20 20  ns were..       
8c80: 20 23 20 20 20 20 20 20 20 63 6f 6d 70 69 6c 65   #       compile
8c90: 64 20 69 6e 74 6f 20 74 68 65 20 53 51 4c 69 74  d into the SQLit
8ca0: 65 20 69 6e 74 65 72 6f 70 20 61 73 73 65 6d 62  e interop assemb
8cb0: 6c 79 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  ly...        #..
8cc0: 20 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72          checkFor
8cd0: 53 51 4c 69 74 65 44 65 66 69 6e 65 43 6f 6e 73  SQLiteDefineCons
8ce0: 74 61 6e 74 20 24 3a 3a 74 65 73 74 5f 63 68 61  tant $::test_cha
8cf0: 6e 6e 65 6c 20 5c 0d 0a 20 20 20 20 20 20 20 20  nnel \..        
8d00: 20 20 20 20 43 48 45 43 4b 5f 53 54 41 54 45 0d      CHECK_STATE.
8d10: 0a 0d 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b  ...        check
8d20: 46 6f 72 53 51 4c 69 74 65 44 65 66 69 6e 65 43  ForSQLiteDefineC
8d30: 6f 6e 73 74 61 6e 74 20 24 3a 3a 74 65 73 74 5f  onstant $::test_
8d40: 63 68 61 6e 6e 65 6c 20 5c 0d 0a 20 20 20 20 20  channel \..     
8d50: 20 20 20 20 20 20 20 55 53 45 5f 49 4e 54 45 52         USE_INTER
8d60: 4f 50 5f 44 4c 4c 0d 0a 0d 0a 20 20 20 20 20 20  OP_DLL....      
8d70: 20 20 63 68 65 63 6b 46 6f 72 53 51 4c 69 74 65    checkForSQLite
8d80: 44 65 66 69 6e 65 43 6f 6e 73 74 61 6e 74 20 24  DefineConstant $
8d90: 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5c  ::test_channel \
8da0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 49 4e  ..            IN
8db0: 54 45 52 4f 50 5f 45 58 54 45 4e 53 49 4f 4e 5f  TEROP_EXTENSION_
8dc0: 46 55 4e 43 54 49 4f 4e 53 0d 0a 0d 0a 20 20 20  FUNCTIONS....   
8dd0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
8de0: 23 20 4e 4f 54 45 3a 20 52 65 70 6f 72 74 20 74  # NOTE: Report t
8df0: 68 65 20 72 65 73 6f 75 72 63 65 20 75 73 61 67  he resource usag
8e00: 65 20 70 72 69 6f 72 20 74 6f 20 72 75 6e 6e 69  e prior to runni
8e10: 6e 67 20 61 6e 79 20 74 65 73 74 73 2e 0d 0a 20  ng any tests... 
8e20: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
8e30: 20 20 72 65 70 6f 72 74 53 51 4c 69 74 65 52 65    reportSQLiteRe
8e40: 73 6f 75 72 63 65 73 20 24 3a 3a 74 65 73 74 5f  sources $::test_
8e50: 63 68 61 6e 6e 65 6c 0d 0a 0d 0a 20 20 20 20 20  channel....     
8e60: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
8e70: 4e 4f 54 45 3a 20 53 68 6f 77 20 74 68 65 20 61  NOTE: Show the a
8e80: 63 74 69 76 65 20 74 65 73 74 20 63 6f 6e 73 74  ctive test const
8e90: 72 61 69 6e 74 73 2e 0d 0a 20 20 20 20 20 20 20  raints...       
8ea0: 20 23 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74   #..        tput
8eb0: 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
8ec0: 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 22 2d  l [appendArgs "-
8ed0: 2d 2d 2d 20 63 6f 6e 73 74 72 61 69 6e 74 73 3a  --- constraints:
8ee0: 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20   " \..          
8ef0: 20 20 5b 66 6f 72 6d 61 74 4c 69 73 74 20 5b 6c    [formatList [l
8f00: 73 6f 72 74 20 5b 67 65 74 43 6f 6e 73 74 72 61  sort [getConstra
8f10: 69 6e 74 73 5d 5d 5d 20 5c 6e 5d 0d 0a 0d 0a 20  ints]]] \n].... 
8f20: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
8f30: 20 20 23 20 4e 4f 54 45 3a 20 53 68 6f 77 20 77    # NOTE: Show w
8f40: 68 65 6e 20 6f 75 72 20 74 65 73 74 73 20 61 63  hen our tests ac
8f50: 74 75 61 6c 6c 79 20 62 65 67 61 6e 20 28 6e 6f  tually began (no
8f60: 77 29 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  w)...        #..
8f70: 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
8f80: 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61  :test_channel [a
8f90: 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
8fa0: 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 53           "---- S
8fb0: 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
8fc0: 65 20 74 65 73 74 73 20 62 65 67 61 6e 20 61 74  e tests began at
8fd0: 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20   " \..          
8fe0: 20 20 5b 63 6c 6f 63 6b 20 66 6f 72 6d 61 74 20    [clock format 
8ff0: 5b 63 6c 6f 63 6b 20 73 65 63 6f 6e 64 73 5d 5d  [clock seconds]]
9000: 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20   \n]..      }.. 
9010: 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
9020: 63 20 72 75 6e 53 51 4c 69 74 65 54 65 73 74 45  c runSQLiteTestE
9030: 70 69 6c 6f 67 75 65 20 7b 7d 20 7b 0d 0a 20 20  pilogue {} {..  
9040: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
9050: 4f 54 45 3a 20 53 6b 69 70 20 72 75 6e 6e 69 6e  OTE: Skip runnin
9060: 67 20 6f 75 72 20 63 75 73 74 6f 6d 20 65 70 69  g our custom epi
9070: 6c 6f 67 75 65 20 69 66 20 74 68 65 20 6d 61 69  logue if the mai
9080: 6e 20 6f 6e 65 20 68 61 73 20 62 65 65 6e 20 73  n one has been s
9090: 6b 69 70 70 65 64 2e 0d 0a 20 20 20 20 20 20 23  kipped...      #
90a0: 0d 0a 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e  ..      if {![in
90b0: 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 65  fo exists ::no(e
90c0: 70 69 6c 6f 67 75 65 2e 65 61 67 6c 65 29 5d 7d  pilogue.eagle)]}
90d0: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
90e0: 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
90f0: 54 45 3a 20 53 68 6f 77 20 77 68 65 6e 20 6f 75  TE: Show when ou
9100: 72 20 74 65 73 74 73 20 61 63 74 75 61 6c 6c 79  r tests actually
9110: 20 65 6e 64 65 64 20 28 6e 6f 77 29 2e 0d 0a 20   ended (now)... 
9120: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
9130: 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
9140: 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
9150: 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
9160: 20 20 20 22 2d 2d 2d 2d 20 53 79 73 74 65 6d 2e     "---- System.
9170: 44 61 74 61 2e 53 51 4c 69 74 65 20 74 65 73 74  Data.SQLite test
9180: 73 20 65 6e 64 65 64 20 61 74 20 22 20 5c 0d 0a  s ended at " \..
9190: 20 20 20 20 20 20 20 20 20 20 20 20 5b 63 6c 6f              [clo
91a0: 63 6b 20 66 6f 72 6d 61 74 20 5b 63 6c 6f 63 6b  ck format [clock
91b0: 20 73 65 63 6f 6e 64 73 5d 5d 20 5c 6e 5d 0d 0a   seconds]] \n]..
91c0: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
91d0: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 6c 73       # NOTE: Als
91e0: 6f 20 72 65 70 6f 72 74 20 74 68 65 20 72 65 73  o report the res
91f0: 6f 75 72 63 65 20 75 73 61 67 65 20 61 66 74 65  ource usage afte
9200: 72 20 72 75 6e 6e 69 6e 67 20 74 68 65 20 74 65  r running the te
9210: 73 74 73 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  sts...        #.
9220: 0a 20 20 20 20 20 20 20 20 72 65 70 6f 72 74 53  .        reportS
9230: 51 4c 69 74 65 52 65 73 6f 75 72 63 65 73 20 24  QLiteResources $
9240: 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 0d 0a  ::test_channel..
9250: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a        }..    }..
9260: 0c 0d 0a 20 20 20 20 23 23 23 23 23 23 23 23 23  ...    #########
9270: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
9280: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
9290: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
92a0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
92b0: 23 23 0d 0a 20 20 20 20 23 23 23 23 23 23 23 23  ##..    ########
92c0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
92d0: 23 23 23 23 23 20 45 4e 44 20 45 61 67 6c 65 20  ##### END Eagle 
92e0: 4f 4e 4c 59 20 23 23 23 23 23 23 23 23 23 23 23  ONLY ###########
92f0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
9300: 23 23 23 0d 0a 20 20 20 20 23 23 23 23 23 23 23  ###..    #######
9310: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
9320: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
9330: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
9340: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
9350: 23 23 23 23 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 23  ####..  }....  #
9360: 0d 0a 20 20 23 20 4e 4f 54 45 3a 20 53 61 76 65  ..  # NOTE: Save
9370: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
9380: 20 64 69 72 65 63 74 6f 72 79 20 63 6f 6e 74 61   directory conta
9390: 69 6e 69 6e 67 20 74 68 69 73 20 66 69 6c 65 2e  ining this file.
93a0: 0d 0a 20 20 23 0d 0a 20 20 69 66 20 7b 21 5b 69  ..  #..  if {![i
93b0: 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 63 6f 6d  nfo exists ::com
93c0: 6d 6f 6e 5f 64 69 72 65 63 74 6f 72 79 5d 7d 20  mon_directory]} 
93d0: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 73 65 74 20  then {..    set 
93e0: 3a 3a 63 6f 6d 6d 6f 6e 5f 64 69 72 65 63 74 6f  ::common_directo
93f0: 72 79 20 5b 66 69 6c 65 20 64 69 72 6e 61 6d 65  ry [file dirname
9400: 20 5b 69 6e 66 6f 20 73 63 72 69 70 74 5d 5d 0d   [info script]].
9410: 0a 20 20 7d 0d 0a 0d 0a 20 20 23 0d 0a 20 20 23  .  }....  #..  #
9420: 20 4e 4f 54 45 3a 20 50 72 6f 76 69 64 65 20 74   NOTE: Provide t
9430: 68 65 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53  he System.Data.S
9440: 51 4c 69 74 65 20 74 65 73 74 20 70 61 63 6b 61  QLite test packa
9450: 67 65 20 74 6f 20 74 68 65 20 69 6e 74 65 72 70  ge to the interp
9460: 72 65 74 65 72 2e 0d 0a 20 20 23 0d 0a 20 20 70  reter...  #..  p
9470: 61 63 6b 61 67 65 20 70 72 6f 76 69 64 65 20 53  ackage provide S
9480: 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
9490: 65 2e 54 65 73 74 20 31 2e 30 0d 0a 7d 0d 0a     e.Test 1.0..}..