System.Data.SQLite
Hex Artifact Content
Not logged in

Artifact 0f9ef8afae9228cff989271db618f52fd4fb5185:


0000: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0010: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0020: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0030: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0040: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0d  ###############.
0050: 0a 23 0d 0a 23 20 63 6f 6d 6d 6f 6e 2e 65 61 67  .#..# common.eag
0060: 6c 65 20 2d 2d 0d 0a 23 0d 0a 23 20 57 72 69 74  le --..#..# Writ
0070: 74 65 6e 20 62 79 20 4a 6f 65 20 4d 69 73 74 61  ten by Joe Mista
0080: 63 68 6b 69 6e 2e 0d 0a 23 20 52 65 6c 65 61 73  chkin...# Releas
0090: 65 64 20 74 6f 20 74 68 65 20 70 75 62 6c 69 63  ed to the public
00a0: 20 64 6f 6d 61 69 6e 2c 20 75 73 65 20 61 74 20   domain, use at 
00b0: 79 6f 75 72 20 6f 77 6e 20 72 69 73 6b 21 0d 0a  your own risk!..
00c0: 23 0d 0a 23 23 23 23 23 23 23 23 23 23 23 23 23  #..#############
00d0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
00e0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
00f0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0100: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0110: 23 23 0d 0a 0d 0a 23 0d 0a 23 20 4e 4f 54 45 3a  ##....#..# NOTE:
0120: 20 55 73 65 20 6f 75 72 20 6f 77 6e 20 6e 61 6d   Use our own nam
0130: 65 73 70 61 63 65 20 68 65 72 65 20 62 65 63 61  espace here beca
0140: 75 73 65 20 65 76 65 6e 20 74 68 6f 75 67 68 20  use even though 
0150: 77 65 20 64 6f 20 6e 6f 74 20 64 69 72 65 63 74  we do not direct
0160: 6c 79 0d 0a 23 20 20 20 20 20 20 20 73 75 70 70  ly..#       supp
0170: 6f 72 74 20 6e 61 6d 65 73 70 61 63 65 73 20 6f  ort namespaces o
0180: 75 72 73 65 6c 76 65 73 2c 20 77 65 20 64 6f 20  urselves, we do 
0190: 6e 6f 74 20 77 61 6e 74 20 74 6f 20 70 6f 6c 6c  not want to poll
01a0: 75 74 65 20 74 68 65 20 67 6c 6f 62 61 6c 0d 0a  ute the global..
01b0: 23 20 20 20 20 20 20 20 6e 61 6d 65 73 70 61 63  #       namespac
01c0: 65 20 69 66 20 74 68 69 73 20 73 63 72 69 70 74  e if this script
01d0: 20 61 63 74 75 61 6c 6c 79 20 65 6e 64 73 20 75   actually ends u
01e0: 70 20 62 65 69 6e 67 20 65 76 61 6c 75 61 74 65  p being evaluate
01f0: 64 20 69 6e 20 54 63 6c 2e 0d 0a 23 0d 0a 6e 61  d in Tcl...#..na
0200: 6d 65 73 70 61 63 65 20 65 76 61 6c 20 3a 3a 45  mespace eval ::E
0210: 61 67 6c 65 20 7b 0d 0a 20 20 69 66 20 7b 5b 69  agle {..  if {[i
0220: 73 45 61 67 6c 65 5d 7d 20 74 68 65 6e 20 7b 0d  sEagle]} then {.
0230: 0a 20 20 20 20 23 23 23 23 23 23 23 23 23 23 23  .    ###########
0240: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0250: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0260: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0270: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0280: 0d 0a 20 20 20 20 23 23 23 23 23 23 23 23 23 23  ..    ##########
0290: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
02a0: 23 23 20 42 45 47 49 4e 20 45 61 67 6c 65 20 4f  ## BEGIN Eagle O
02b0: 4e 4c 59 20 23 23 23 23 23 23 23 23 23 23 23 23  NLY ############
02c0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
02d0: 23 0d 0a 20 20 20 20 23 23 23 23 23 23 23 23 23  #..    #########
02e0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
02f0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0300: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0310: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0320: 23 23 0d 0a 0d 0a 20 20 20 20 70 72 6f 63 20 67  ##....    proc g
0330: 65 74 42 75 69 6c 64 59 65 61 72 20 7b 7d 20 7b  etBuildYear {} {
0340: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
0350: 20 23 20 4e 4f 54 45 3a 20 53 65 65 20 69 66 20   # NOTE: See if 
0360: 74 68 65 20 22 79 65 61 72 22 20 73 65 74 74 69  the "year" setti
0370: 6e 67 20 68 61 73 20 62 65 65 6e 20 6f 76 65 72  ng has been over
0380: 72 69 64 64 65 6e 20 62 79 20 74 68 65 20 75 73  ridden by the us
0390: 65 72 20 28 65 2e 67 2e 0d 0a 20 20 20 20 20 20  er (e.g...      
03a0: 23 20 20 20 20 20 20 20 6f 6e 20 74 68 65 20 63  #       on the c
03b0: 6f 6d 6d 61 6e 64 20 6c 69 6e 65 29 2e 20 20 54  ommand line).  T
03c0: 68 69 73 20 68 65 6c 70 73 20 63 6f 6e 74 72 6f  his helps contro
03d0: 6c 20 65 78 61 63 74 6c 79 20 77 68 69 63 68 20  l exactly which 
03e0: 73 65 74 20 6f 66 0d 0a 20 20 20 20 20 20 23 20  set of..      # 
03f0: 20 20 20 20 20 20 62 69 6e 61 72 69 65 73 20 77        binaries w
0400: 65 20 61 72 65 20 74 65 73 74 69 6e 67 2c 20 74  e are testing, t
0410: 68 6f 73 65 20 70 72 6f 64 75 63 65 64 20 75 73  hose produced us
0420: 69 6e 67 20 74 68 65 20 56 69 73 75 61 6c 20 53  ing the Visual S
0430: 74 75 64 69 6f 0d 0a 20 20 20 20 20 20 23 20 20  tudio..      #  
0440: 20 20 20 20 20 32 30 30 35 2c 20 32 30 30 38 2c       2005, 2008,
0450: 20 32 30 31 30 2c 20 6f 72 20 32 30 31 32 20 62   2010, or 2012 b
0460: 75 69 6c 64 20 73 79 73 74 65 6d 73 2e 20 20 54  uild systems.  T
0470: 6f 20 6f 76 65 72 72 69 64 65 20 74 68 69 73 20  o override this 
0480: 76 61 6c 75 65 0d 0a 20 20 20 20 20 20 23 20 20  value..      #  
0490: 20 20 20 20 20 76 69 61 20 74 68 65 20 63 6f 6d       via the com
04a0: 6d 61 6e 64 20 6c 69 6e 65 2c 20 65 6e 74 65 72  mand line, enter
04b0: 20 61 20 63 6f 6d 6d 61 6e 64 20 73 69 6d 69 6c   a command simil
04c0: 61 72 20 74 6f 20 6f 6e 65 20 6f 66 20 74 68 65  ar to one of the
04d0: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
04e0: 66 6f 6c 6c 6f 77 69 6e 67 20 28 61 6c 6c 20 6f  following (all o
04f0: 6e 20 6f 6e 65 20 6c 69 6e 65 29 3a 0d 0a 20 20  n one line):..  
0500: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 20      #..      #  
0510: 20 20 20 20 20 45 61 67 6c 65 53 68 65 6c 6c 2e       EagleShell.
0520: 65 78 65 20 2d 70 72 65 49 6e 69 74 69 61 6c 69  exe -preInitiali
0530: 7a 65 20 22 73 65 74 20 74 65 73 74 5f 79 65 61  ze "set test_yea
0540: 72 20 32 30 30 35 22 0d 0a 20 20 20 20 20 20 23  r 2005"..      #
0550: 20 20 20 20 20 20 20 20 20 2d 66 69 6c 65 20 2e           -file .
0560: 5c 70 61 74 68 5c 74 6f 5c 61 6c 6c 2e 65 61 67  \path\to\all.eag
0570: 6c 65 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  le..      #..   
0580: 20 20 20 23 20 20 20 20 20 20 20 45 61 67 6c 65     #       Eagle
0590: 53 68 65 6c 6c 2e 65 78 65 20 2d 70 72 65 49 6e  Shell.exe -preIn
05a0: 69 74 69 61 6c 69 7a 65 20 22 73 65 74 20 74 65  itialize "set te
05b0: 73 74 5f 79 65 61 72 20 32 30 30 38 22 0d 0a 20  st_year 2008".. 
05c0: 20 20 20 20 20 23 20 20 20 20 20 20 20 20 20 2d       #         -
05d0: 66 69 6c 65 20 2e 5c 70 61 74 68 5c 74 6f 5c 61  file .\path\to\a
05e0: 6c 6c 2e 65 61 67 6c 65 0d 0a 20 20 20 20 20 20  ll.eagle..      
05f0: 23 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  #..      #      
0600: 20 45 61 67 6c 65 53 68 65 6c 6c 2e 65 78 65 20   EagleShell.exe 
0610: 2d 70 72 65 49 6e 69 74 69 61 6c 69 7a 65 20 22  -preInitialize "
0620: 73 65 74 20 74 65 73 74 5f 79 65 61 72 20 32 30  set test_year 20
0630: 31 30 22 0d 0a 20 20 20 20 20 20 23 20 20 20 20  10"..      #    
0640: 20 20 20 20 20 2d 66 69 6c 65 20 2e 5c 70 61 74       -file .\pat
0650: 68 5c 74 6f 5c 61 6c 6c 2e 65 61 67 6c 65 0d 0a  h\to\all.eagle..
0660: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
0670: 20 20 20 20 20 20 20 45 61 67 6c 65 53 68 65 6c         EagleShel
0680: 6c 2e 65 78 65 20 2d 70 72 65 49 6e 69 74 69 61  l.exe -preInitia
0690: 6c 69 7a 65 20 22 73 65 74 20 74 65 73 74 5f 79  lize "set test_y
06a0: 65 61 72 20 32 30 31 32 22 0d 0a 20 20 20 20 20  ear 2012"..     
06b0: 20 23 20 20 20 20 20 20 20 20 20 2d 66 69 6c 65   #         -file
06c0: 20 2e 5c 70 61 74 68 5c 74 6f 5c 61 6c 6c 2e 65   .\path\to\all.e
06d0: 61 67 6c 65 0d 0a 20 20 20 20 20 20 23 0d 0a 20  agle..      #.. 
06e0: 20 20 20 20 20 23 20 20 20 20 20 20 20 45 61 67       #       Eag
06f0: 6c 65 53 68 65 6c 6c 2e 65 78 65 20 2d 70 72 65  leShell.exe -pre
0700: 49 6e 69 74 69 61 6c 69 7a 65 20 22 75 6e 73 65  Initialize "unse
0710: 74 20 2d 6e 6f 63 6f 6d 70 6c 61 69 6e 20 74 65  t -nocomplain te
0720: 73 74 5f 79 65 61 72 22 0d 0a 20 20 20 20 20 20  st_year"..      
0730: 23 20 20 20 20 20 20 20 20 20 2d 66 69 6c 65 20  #         -file 
0740: 2e 5c 70 61 74 68 5c 74 6f 5c 61 6c 6c 2e 65 61  .\path\to\all.ea
0750: 67 6c 65 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  gle..      #..  
0760: 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78      if {[info ex
0770: 69 73 74 73 20 3a 3a 74 65 73 74 5f 79 65 61 72  ists ::test_year
0780: 5d 20 26 26 20 5b 73 74 72 69 6e 67 20 6c 65 6e  ] && [string len
0790: 67 74 68 20 24 3a 3a 74 65 73 74 5f 79 65 61 72  gth $::test_year
07a0: 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20  ] > 0} then {.. 
07b0: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
07c0: 20 20 23 20 4e 4f 54 45 3a 20 55 73 65 20 74 68    # NOTE: Use th
07d0: 65 20 73 70 65 63 69 66 69 65 64 20 74 65 73 74  e specified test
07e0: 20 79 65 61 72 2e 20 20 49 66 20 74 68 69 73 20   year.  If this 
07f0: 76 61 72 69 61 62 6c 65 20 69 73 20 6e 6f 74 20  variable is not 
0800: 73 65 74 2c 20 74 68 65 0d 0a 20 20 20 20 20 20  set, the..      
0810: 20 20 23 20 20 20 20 20 20 20 64 65 66 61 75 6c    #       defaul
0820: 74 20 76 61 6c 75 65 20 77 69 6c 6c 20 62 65 20  t value will be 
0830: 62 61 73 65 64 20 6f 6e 20 77 68 65 74 68 65 72  based on whether
0840: 20 6f 72 20 6e 6f 74 20 45 61 67 6c 65 20 68 61   or not Eagle ha
0850: 73 20 62 65 65 6e 0d 0a 20 20 20 20 20 20 20 20  s been..        
0860: 23 20 20 20 20 20 20 20 63 6f 6d 70 69 6c 65 64  #       compiled
0870: 20 61 67 61 69 6e 73 74 20 74 68 65 20 43 4c 52   against the CLR
0880: 20 76 32 2e 30 20 6f 72 20 43 4c 52 20 76 34 2e   v2.0 or CLR v4.
0890: 30 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  0...        #.. 
08a0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 3a         return $:
08b0: 3a 74 65 73 74 5f 79 65 61 72 0d 0a 20 20 20 20  :test_year..    
08c0: 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
08d0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
08e0: 20 4e 4f 54 45 3a 20 49 66 20 45 61 67 6c 65 20   NOTE: If Eagle 
08f0: 68 61 73 20 62 65 65 6e 20 63 6f 6d 70 69 6c 65  has been compile
0900: 64 20 61 67 61 69 6e 73 74 20 74 68 65 20 43 4c  d against the CL
0910: 52 20 76 34 2e 30 2c 20 75 73 65 20 22 32 30 31  R v4.0, use "201
0920: 30 22 20 62 79 0d 0a 20 20 20 20 20 20 20 20 23  0" by..        #
0930: 20 20 20 20 20 20 20 64 65 66 61 75 6c 74 20 28         default (
0940: 77 65 20 63 6f 75 6c 64 20 75 73 65 20 22 32 30  we could use "20
0950: 31 32 22 20 69 6e 20 74 68 61 74 20 63 61 73 65  12" in that case
0960: 20 61 73 20 77 65 6c 6c 29 20 61 73 20 74 68 65   as well) as the
0970: 20 74 65 73 74 0d 0a 20 20 20 20 20 20 20 20 23   test..        #
0980: 20 20 20 20 20 20 20 79 65 61 72 3b 20 6f 74 68         year; oth
0990: 65 72 77 69 73 65 2c 20 75 73 65 20 22 32 30 30  erwise, use "200
09a0: 38 22 20 62 79 20 64 65 66 61 75 6c 74 20 28 77  8" by default (w
09b0: 65 20 63 6f 75 6c 64 20 75 73 65 20 22 32 30 30  e could use "200
09c0: 35 22 20 69 6e 0d 0a 20 20 20 20 20 20 20 20 23  5" in..        #
09d0: 20 20 20 20 20 20 20 74 68 61 74 20 63 61 73 65         that case
09e0: 20 61 73 20 77 65 6c 6c 29 2e 20 20 49 66 20 61   as well).  If a
09f0: 6e 6f 74 68 65 72 20 6d 61 6a 6f 72 20 5b 69 6e  nother major [in
0a00: 63 6f 6d 70 61 74 69 62 6c 65 5d 20 76 65 72 73  compatible] vers
0a10: 69 6f 6e 20 6f 66 0d 0a 20 20 20 20 20 20 20 20  ion of..        
0a20: 23 20 20 20 20 20 20 20 74 68 65 20 43 4c 52 20  #       the CLR 
0a30: 69 73 20 72 65 6c 65 61 73 65 64 2c 20 74 68 69  is released, thi
0a40: 73 20 63 68 65 63 6b 20 77 69 6c 6c 20 68 61 76  s check will hav
0a50: 65 20 74 6f 20 62 65 20 63 68 61 6e 67 65 64 2e  e to be changed.
0a60: 20 20 54 68 65 0d 0a 20 20 20 20 20 20 20 20 23    The..        #
0a70: 20 20 20 20 20 20 20 64 65 66 61 75 6c 74 20 74         default t
0a80: 65 73 74 20 79 65 61 72 20 74 6f 20 75 73 65 20  est year to use 
0a90: 66 6f 72 20 61 20 70 61 72 74 69 63 75 6c 61 72  for a particular
0aa0: 20 43 4c 52 20 76 65 72 73 69 6f 6e 20 6d 61 79   CLR version may
0ab0: 20 62 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20   be..        #  
0ac0: 20 20 20 20 20 6f 76 65 72 72 69 64 64 65 6e 20       overridden 
0ad0: 62 79 20 73 65 74 74 69 6e 67 20 74 68 65 20 67  by setting the g
0ae0: 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20 22  lobal variable "
0af0: 74 65 73 74 5f 79 65 61 72 5f 63 6c 72 5f 76 24  test_year_clr_v$
0b00: 58 22 2c 0d 0a 20 20 20 20 20 20 20 20 23 20 20  X",..        #  
0b10: 20 20 20 20 20 77 68 65 72 65 20 22 24 58 22 20       where "$X" 
0b20: 6d 61 79 20 5b 63 75 72 72 65 6e 74 6c 79 5d 20  may [currently] 
0b30: 62 65 20 65 69 74 68 65 72 20 22 32 22 20 6f 72  be either "2" or
0b40: 20 22 34 22 2e 0d 0a 20 20 20 20 20 20 20 20 23   "4"...        #
0b50: 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 68  ..        if {[h
0b60: 61 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 69 6d  aveConstraint im
0b70: 61 67 65 52 75 6e 74 69 6d 65 34 30 5d 7d 20 74  ageRuntime40]} t
0b80: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
0b90: 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74   if {[info exist
0ba0: 73 20 3a 3a 74 65 73 74 5f 79 65 61 72 5f 63 6c  s ::test_year_cl
0bb0: 72 5f 76 34 5d 20 26 26 20 5c 0d 0a 20 20 20 20  r_v4] && \..    
0bc0: 20 20 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e            [strin
0bd0: 67 20 6c 65 6e 67 74 68 20 24 3a 3a 74 65 73 74  g length $::test
0be0: 5f 79 65 61 72 5f 63 6c 72 5f 76 34 5d 20 3e 20  _year_clr_v4] > 
0bf0: 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
0c00: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
0c10: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 55 73        # NOTE: Us
0c20: 65 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  e the specified 
0c30: 74 65 73 74 20 79 65 61 72 20 66 6f 72 20 74 68  test year for th
0c40: 65 20 43 4c 52 20 76 34 2e 30 2e 0d 0a 20 20 20  e CLR v4.0...   
0c50: 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
0c60: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 24          return $
0c70: 3a 3a 74 65 73 74 5f 79 65 61 72 5f 63 6c 72 5f  ::test_year_clr_
0c80: 76 34 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 20  v4..          } 
0c90: 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
0ca0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
0cb0: 20 20 20 23 20 4e 4f 54 45 3a 20 55 73 65 20 74     # NOTE: Use t
0cc0: 68 65 20 64 65 66 61 75 6c 74 20 74 65 73 74 20  he default test 
0cd0: 79 65 61 72 20 66 6f 72 20 74 68 65 20 43 4c 52  year for the CLR
0ce0: 20 76 34 2e 30 2e 0d 0a 20 20 20 20 20 20 20 20   v4.0...        
0cf0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
0d00: 20 20 20 72 65 74 75 72 6e 20 32 30 31 30 3b 20     return 2010; 
0d10: 23 20 54 4f 44 4f 3a 20 47 6f 6f 64 20 22 66 61  # TODO: Good "fa
0d20: 6c 6c 62 61 63 6b 22 20 64 65 66 61 75 6c 74 3f  llback" default?
0d30: 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20  ..          }.. 
0d40: 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d         } else {.
0d50: 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b  .          if {[
0d60: 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 74 65  info exists ::te
0d70: 73 74 5f 79 65 61 72 5f 63 6c 72 5f 76 32 5d 20  st_year_clr_v2] 
0d80: 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  && \..          
0d90: 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67      [string leng
0da0: 74 68 20 24 3a 3a 74 65 73 74 5f 79 65 61 72 5f  th $::test_year_
0db0: 63 6c 72 5f 76 32 5d 20 3e 20 30 7d 20 74 68 65  clr_v2] > 0} the
0dc0: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
0dd0: 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   #..            
0de0: 23 20 4e 4f 54 45 3a 20 55 73 65 20 74 68 65 20  # NOTE: Use the 
0df0: 73 70 65 63 69 66 69 65 64 20 74 65 73 74 20 79  specified test y
0e00: 65 61 72 20 66 6f 72 20 74 68 65 20 43 4c 52 20  ear for the CLR 
0e10: 76 32 2e 30 2e 0d 0a 20 20 20 20 20 20 20 20 20  v2.0...         
0e20: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
0e30: 20 20 72 65 74 75 72 6e 20 24 3a 3a 74 65 73 74    return $::test
0e40: 5f 79 65 61 72 5f 63 6c 72 5f 76 32 0d 0a 20 20  _year_clr_v2..  
0e50: 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b          } else {
0e60: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 0d  ..            #.
0e70: 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4e  .            # N
0e80: 4f 54 45 3a 20 55 73 65 20 74 68 65 20 64 65 66  OTE: Use the def
0e90: 61 75 6c 74 20 74 65 73 74 20 79 65 61 72 20 66  ault test year f
0ea0: 6f 72 20 74 68 65 20 43 4c 52 20 76 32 2e 30 2e  or the CLR v2.0.
0eb0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 0d  ..            #.
0ec0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74  .            ret
0ed0: 75 72 6e 20 32 30 30 38 3b 20 23 20 54 4f 44 4f  urn 2008; # TODO
0ee0: 3a 20 47 6f 6f 64 20 22 66 61 6c 6c 62 61 63 6b  : Good "fallback
0ef0: 22 20 64 65 66 61 75 6c 74 3f 0d 0a 20 20 20 20  " default?..    
0f00: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
0f10: 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20   }..      }..   
0f20: 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
0f30: 67 65 74 42 75 69 6c 64 59 65 61 72 73 20 7b 7d  getBuildYears {}
0f40: 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20   {..      #..   
0f50: 20 20 20 23 20 4e 4f 54 45 3a 20 53 65 65 20 69     # NOTE: See i
0f60: 66 20 74 68 65 20 6c 69 73 74 20 6f 66 20 74 65  f the list of te
0f70: 73 74 20 79 65 61 72 73 20 68 61 73 20 62 65 65  st years has bee
0f80: 6e 20 6f 76 65 72 72 69 64 64 65 6e 20 62 79 20  n overridden by 
0f90: 74 68 65 20 75 73 65 72 0d 0a 20 20 20 20 20 20  the user..      
0fa0: 23 20 20 20 20 20 20 20 28 65 2e 67 2e 20 6f 6e  #       (e.g. on
0fb0: 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e   the command lin
0fc0: 65 29 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  e)...      #..  
0fd0: 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78      if {[info ex
0fe0: 69 73 74 73 20 3a 3a 74 65 73 74 5f 79 65 61 72  ists ::test_year
0ff0: 73 5d 20 26 26 20 5b 6c 6c 65 6e 67 74 68 20 24  s] && [llength $
1000: 3a 3a 74 65 73 74 5f 79 65 61 72 73 5d 20 3e 20  ::test_years] > 
1010: 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
1020: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
1030: 4e 4f 54 45 3a 20 55 73 65 20 74 68 65 20 73 70  NOTE: Use the sp
1040: 65 63 69 66 69 65 64 20 6c 69 73 74 20 6f 66 20  ecified list of 
1050: 74 65 73 74 20 79 65 61 72 73 2e 0d 0a 20 20 20  test years...   
1060: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
1070: 72 65 74 75 72 6e 20 24 3a 3a 74 65 73 74 5f 79  return $::test_y
1080: 65 61 72 73 0d 0a 20 20 20 20 20 20 7d 20 65 6c  ears..      } el
1090: 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d  se {..        #.
10a0: 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
10b0: 20 55 73 65 20 74 68 65 20 64 65 66 61 75 6c 74   Use the default
10c0: 20 6c 69 73 74 20 6f 66 20 74 65 73 74 20 79 65   list of test ye
10d0: 61 72 73 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  ars...        #.
10e0: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
10f0: 5b 6c 69 73 74 20 32 30 30 35 20 32 30 30 38 20  [list 2005 2008 
1100: 32 30 31 30 20 32 30 31 32 5d 0d 0a 20 20 20 20  2010 2012]..    
1110: 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20    }..    }..... 
1120: 20 20 20 70 72 6f 63 20 67 65 74 42 75 69 6c 64     proc getBuild
1130: 50 6c 61 74 66 6f 72 6d 20 7b 20 6e 61 74 69 76  Platform { nativ
1140: 65 20 7d 20 7b 0d 0a 20 20 20 20 20 20 69 66 20  e } {..      if 
1150: 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  {[info exists ::
1160: 74 65 73 74 5f 70 6c 61 74 66 6f 72 6d 5d 20 26  test_platform] &
1170: 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b  & \..          [
1180: 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a  string length $:
1190: 3a 74 65 73 74 5f 70 6c 61 74 66 6f 72 6d 5d 20  :test_platform] 
11a0: 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  > 0} then {..   
11b0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
11c0: 23 20 4e 4f 54 45 3a 20 55 73 65 20 74 68 65 20  # NOTE: Use the 
11d0: 73 70 65 63 69 66 69 65 64 20 74 65 73 74 20 70  specified test p
11e0: 6c 61 74 66 6f 72 6d 2e 20 20 49 66 20 74 68 69  latform.  If thi
11f0: 73 20 76 61 72 69 61 62 6c 65 20 69 73 20 6e 6f  s variable is no
1200: 74 20 73 65 74 2c 0d 0a 20 20 20 20 20 20 20 20  t set,..        
1210: 23 20 20 20 20 20 20 20 74 68 65 20 64 65 66 61  #       the defa
1220: 75 6c 74 20 76 61 6c 75 65 20 77 69 6c 6c 20 62  ult value will b
1230: 65 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 6d  e based on the m
1240: 61 63 68 69 6e 65 20 61 72 63 68 69 74 65 63 74  achine architect
1250: 75 72 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  ure...        #.
1260: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
1270: 5b 65 78 70 72 20 7b 24 6e 61 74 69 76 65 20 3f  [expr {$native ?
1280: 20 24 3a 3a 74 65 73 74 5f 70 6c 61 74 66 6f 72   $::test_platfor
1290: 6d 20 3a 20 22 22 7d 5d 0d 0a 20 20 20 20 20 20  m : ""}]..      
12a0: 7d 20 65 6c 73 65 69 66 20 7b 5b 69 6e 66 6f 20  } elseif {[info 
12b0: 65 78 69 73 74 73 20 3a 3a 74 65 73 74 5f 6d 61  exists ::test_ma
12c0: 63 68 69 6e 65 5d 20 26 26 20 5c 0d 0a 20 20 20  chine] && \..   
12d0: 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c         [string l
12e0: 65 6e 67 74 68 20 24 3a 3a 74 65 73 74 5f 6d 61  ength $::test_ma
12f0: 63 68 69 6e 65 5d 20 3e 20 30 7d 20 74 68 65 6e  chine] > 0} then
1300: 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20   {..        #.. 
1310: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 46         # NOTE: F
1320: 6f 72 20 6e 61 74 69 76 65 20 62 75 69 6c 64 73  or native builds
1330: 2c 20 72 65 74 75 72 6e 20 74 68 65 20 70 6c 61  , return the pla
1340: 74 66 6f 72 6d 20 6e 61 6d 65 20 63 6f 72 72 65  tform name corre
1350: 73 70 6f 6e 64 69 6e 67 20 74 6f 0d 0a 20 20 20  sponding to..   
1360: 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68 65       #       the
1370: 20 74 65 73 74 20 6d 61 63 68 69 6e 65 20 61 72   test machine ar
1380: 63 68 69 74 65 63 74 75 72 65 3b 20 6f 74 68 65  chitecture; othe
1390: 72 77 69 73 65 2c 20 72 65 74 75 72 6e 20 61 6e  rwise, return an
13a0: 20 65 6d 70 74 79 0d 0a 20 20 20 20 20 20 20 20   empty..        
13b0: 23 20 20 20 20 20 20 20 73 74 72 69 6e 67 2e 0d  #       string..
13c0: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
13d0: 20 20 20 20 72 65 74 75 72 6e 20 5b 65 78 70 72      return [expr
13e0: 20 7b 24 6e 61 74 69 76 65 20 3f 20 5b 6d 61 63   {$native ? [mac
13f0: 68 69 6e 65 54 6f 50 6c 61 74 66 6f 72 6d 20 24  hineToPlatform $
1400: 3a 3a 74 65 73 74 5f 6d 61 63 68 69 6e 65 5d 20  ::test_machine] 
1410: 3a 20 22 22 7d 5d 0d 0a 20 20 20 20 20 20 7d 20  : ""}]..      } 
1420: 65 6c 73 65 69 66 20 7b 5b 69 6e 66 6f 20 65 78  elseif {[info ex
1430: 69 73 74 73 20 3a 3a 74 63 6c 5f 70 6c 61 74 66  ists ::tcl_platf
1440: 6f 72 6d 28 6d 61 63 68 69 6e 65 29 5d 7d 20 74  orm(machine)]} t
1450: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  hen {..        #
1460: 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
1470: 3a 20 46 6f 72 20 6e 61 74 69 76 65 20 62 75 69  : For native bui
1480: 6c 64 73 2c 20 72 65 74 75 72 6e 20 74 68 65 20  lds, return the 
1490: 70 6c 61 74 66 6f 72 6d 20 6e 61 6d 65 20 63 6f  platform name co
14a0: 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 0d 0a  rresponding to..
14b0: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
14c0: 74 68 65 20 6d 61 63 68 69 6e 65 20 61 72 63 68  the machine arch
14d0: 69 74 65 63 74 75 72 65 3b 20 6f 74 68 65 72 77  itecture; otherw
14e0: 69 73 65 2c 20 72 65 74 75 72 6e 20 61 6e 20 65  ise, return an e
14f0: 6d 70 74 79 20 73 74 72 69 6e 67 2e 0d 0a 20 20  mpty string...  
1500: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
1510: 20 72 65 74 75 72 6e 20 5b 65 78 70 72 20 7b 24   return [expr {$
1520: 6e 61 74 69 76 65 20 3f 20 5c 0d 0a 20 20 20 20  native ? \..    
1530: 20 20 20 20 20 20 20 20 5b 6d 61 63 68 69 6e 65          [machine
1540: 54 6f 50 6c 61 74 66 6f 72 6d 20 24 3a 3a 74 63  ToPlatform $::tc
1550: 6c 5f 70 6c 61 74 66 6f 72 6d 28 6d 61 63 68 69  l_platform(machi
1560: 6e 65 29 5d 20 3a 20 22 22 7d 5d 0d 0a 20 20 20  ne)] : ""}]..   
1570: 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
1580: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
1590: 23 20 4e 4f 54 45 3a 20 4e 6f 20 6d 61 63 68 69  # NOTE: No machi
15a0: 6e 65 20 61 72 63 68 69 74 65 63 74 75 72 65 20  ne architecture 
15b0: 69 73 20 61 76 61 69 6c 61 62 6c 65 2c 20 72 65  is available, re
15c0: 74 75 72 6e 20 61 6e 20 65 6d 70 74 79 20 73 74  turn an empty st
15d0: 72 69 6e 67 2e 0d 0a 20 20 20 20 20 20 20 20 23  ring...        #
15e0: 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ..        return
15f0: 20 22 22 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20   ""..      }..  
1600: 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
1610: 20 67 65 74 42 75 69 6c 64 43 6f 6e 66 69 67 75   getBuildConfigu
1620: 72 61 74 69 6f 6e 20 7b 7d 20 7b 0d 0a 20 20 20  ration {} {..   
1630: 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
1640: 54 45 3a 20 53 65 65 20 69 66 20 74 68 65 20 22  TE: See if the "
1650: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 22 20 73  configuration" s
1660: 65 74 74 69 6e 67 20 68 61 73 20 62 65 65 6e 20  etting has been 
1670: 6f 76 65 72 72 69 64 64 65 6e 20 62 79 20 74 68  overridden by th
1680: 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  e..      #      
1690: 20 75 73 65 72 20 28 65 2e 67 2e 20 6f 6e 20 74   user (e.g. on t
16a0: 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 29  he command line)
16b0: 2e 20 20 54 68 69 73 20 68 65 6c 70 73 20 63 6f  .  This helps co
16c0: 6e 74 72 6f 6c 20 65 78 61 63 74 6c 79 0d 0a 20  ntrol exactly.. 
16d0: 20 20 20 20 20 23 20 20 20 20 20 20 20 77 68 69       #       whi
16e0: 63 68 20 73 65 74 20 6f 66 20 62 69 6e 61 72 69  ch set of binari
16f0: 65 73 20 77 65 20 61 72 65 20 74 65 73 74 69 6e  es we are testin
1700: 67 20 28 69 2e 65 2e 20 74 68 6f 73 65 20 62 75  g (i.e. those bu
1710: 69 6c 74 20 69 6e 20 74 68 65 0d 0a 20 20 20 20  ilt in the..    
1720: 20 20 23 20 20 20 20 20 20 20 22 44 65 62 75 67    #       "Debug
1730: 22 20 6f 72 20 22 52 65 6c 65 61 73 65 22 20 62  " or "Release" b
1740: 75 69 6c 64 20 63 6f 6e 66 69 67 75 72 61 74 69  uild configurati
1750: 6f 6e 73 29 2e 20 20 54 6f 20 6f 76 65 72 72 69  ons).  To overri
1760: 64 65 20 74 68 69 73 0d 0a 20 20 20 20 20 20 23  de this..      #
1770: 20 20 20 20 20 20 20 76 61 6c 75 65 20 76 69 61         value via
1780: 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e   the command lin
1790: 65 2c 20 65 6e 74 65 72 20 61 20 63 6f 6d 6d 61  e, enter a comma
17a0: 6e 64 20 73 69 6d 69 6c 61 72 20 74 6f 20 6f 6e  nd similar to on
17b0: 65 20 6f 66 0d 0a 20 20 20 20 20 20 23 20 20 20  e of..      #   
17c0: 20 20 20 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e      the followin
17d0: 67 20 28 61 6c 6c 20 6f 6e 20 6f 6e 65 20 6c 69  g (all on one li
17e0: 6e 65 29 3a 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ne):..      #.. 
17f0: 20 20 20 20 20 23 20 20 20 20 20 20 20 45 61 67       #       Eag
1800: 6c 65 53 68 65 6c 6c 2e 65 78 65 20 2d 70 72 65  leShell.exe -pre
1810: 49 6e 69 74 69 61 6c 69 7a 65 20 22 73 65 74 20  Initialize "set 
1820: 74 65 73 74 5f 63 6f 6e 66 69 67 75 72 61 74 69  test_configurati
1830: 6f 6e 20 44 65 62 75 67 22 0d 0a 20 20 20 20 20  on Debug"..     
1840: 20 23 20 20 20 20 20 20 20 20 20 2d 66 69 6c 65   #         -file
1850: 20 2e 5c 70 61 74 68 5c 74 6f 5c 61 6c 6c 2e 65   .\path\to\all.e
1860: 61 67 6c 65 0d 0a 20 20 20 20 20 20 23 0d 0a 20  agle..      #.. 
1870: 20 20 20 20 20 23 20 20 20 20 20 20 20 45 61 67       #       Eag
1880: 6c 65 53 68 65 6c 6c 2e 65 78 65 20 2d 70 72 65  leShell.exe -pre
1890: 49 6e 69 74 69 61 6c 69 7a 65 20 22 73 65 74 20  Initialize "set 
18a0: 74 65 73 74 5f 63 6f 6e 66 69 67 75 72 61 74 69  test_configurati
18b0: 6f 6e 20 52 65 6c 65 61 73 65 22 0d 0a 20 20 20  on Release"..   
18c0: 20 20 20 23 20 20 20 20 20 20 20 20 20 2d 66 69     #         -fi
18d0: 6c 65 20 2e 5c 70 61 74 68 5c 74 6f 5c 61 6c 6c  le .\path\to\all
18e0: 2e 65 61 67 6c 65 0d 0a 20 20 20 20 20 20 23 0d  .eagle..      #.
18f0: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 45  .      #       E
1900: 61 67 6c 65 53 68 65 6c 6c 2e 65 78 65 20 2d 66  agleShell.exe -f
1910: 69 6c 65 20 2e 5c 70 61 74 68 5c 74 6f 5c 61 6c  ile .\path\to\al
1920: 6c 2e 65 61 67 6c 65 20 2d 70 72 65 54 65 73 74  l.eagle -preTest
1930: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
1940: 20 20 22 75 6e 73 65 74 20 2d 6e 6f 63 6f 6d 70    "unset -nocomp
1950: 6c 61 69 6e 20 74 65 73 74 5f 63 6f 6e 66 69 67  lain test_config
1960: 75 72 61 74 69 6f 6e 22 0d 0a 20 20 20 20 20 20  uration"..      
1970: 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 6e  #..      if {[in
1980: 66 6f 20 65 78 69 73 74 73 20 3a 3a 74 65 73 74  fo exists ::test
1990: 5f 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 5d 20  _configuration] 
19a0: 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  && \..          
19b0: 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
19c0: 3a 3a 74 65 73 74 5f 63 6f 6e 66 69 67 75 72 61  ::test_configura
19d0: 74 69 6f 6e 5d 20 3e 20 30 7d 20 74 68 65 6e 20  tion] > 0} then 
19e0: 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
19f0: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 55 73        # NOTE: Us
1a00: 65 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  e the specified 
1a10: 74 65 73 74 20 63 6f 6e 66 69 67 75 72 61 74 69  test configurati
1a20: 6f 6e 2e 20 20 54 68 65 20 64 65 66 61 75 6c 74  on.  The default
1a30: 20 76 61 6c 75 65 20 75 73 65 64 0d 0a 20 20 20   value used..   
1a40: 20 20 20 20 20 23 20 20 20 20 20 20 20 66 6f 72       #       for
1a50: 20 74 68 69 73 20 76 61 72 69 61 62 6c 65 20 69   this variable i
1a60: 73 20 74 79 70 69 63 61 6c 6c 79 20 22 52 65 6c  s typically "Rel
1a70: 65 61 73 65 22 2c 20 61 73 20 73 65 74 20 62 79  ease", as set by
1a80: 20 74 68 65 20 74 65 73 74 0d 0a 20 20 20 20 20   the test..     
1a90: 20 20 20 23 20 20 20 20 20 20 20 73 75 69 74 65     #       suite
1aa0: 20 69 74 73 65 6c 66 2e 0d 0a 20 20 20 20 20 20   itself...      
1ab0: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74    #..        ret
1ac0: 75 72 6e 20 24 3a 3a 74 65 73 74 5f 63 6f 6e 66  urn $::test_conf
1ad0: 69 67 75 72 61 74 69 6f 6e 0d 0a 20 20 20 20 20  iguration..     
1ae0: 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
1af0: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
1b00: 4e 4f 54 45 3a 20 4e 6f 72 6d 61 6c 6c 79 2c 20  NOTE: Normally, 
1b10: 77 65 20 77 69 6c 6c 20 6e 65 76 65 72 20 68 69  we will never hi
1b20: 74 20 74 68 69 73 20 63 61 73 65 20 62 65 63 61  t this case beca
1b30: 75 73 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66  use the value of
1b40: 20 74 68 65 0d 0a 20 20 20 20 20 20 20 20 23 20   the..        # 
1b50: 20 20 20 20 20 20 74 65 73 74 20 63 6f 6e 66 69        test confi
1b60: 67 75 72 61 74 69 6f 6e 20 76 61 72 69 61 62 6c  guration variabl
1b70: 65 20 69 73 20 61 6c 77 61 79 73 20 73 65 74 20  e is always set 
1b80: 62 79 20 74 68 65 20 74 65 73 74 20 73 75 69 74  by the test suit
1b90: 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  e..        #    
1ba0: 20 20 20 69 74 73 65 6c 66 3b 20 68 6f 77 65 76     itself; howev
1bb0: 65 72 2c 20 69 74 20 63 61 6e 20 62 65 20 6f 76  er, it can be ov
1bc0: 65 72 72 69 64 64 65 6e 20 75 73 69 6e 67 20 74  erridden using t
1bd0: 68 65 20 75 6e 73 65 74 20 63 6f 6d 6d 61 6e 64  he unset command
1be0: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
1bf0: 20 20 66 72 6f 6d 20 74 68 65 20 2d 70 72 65 54    from the -preT
1c00: 65 73 74 20 6f 70 74 69 6f 6e 20 74 6f 20 74 68  est option to th
1c10: 65 20 74 65 73 74 20 73 75 69 74 65 2e 0d 0a 20  e test suite... 
1c20: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
1c30: 20 20 72 65 74 75 72 6e 20 24 3a 3a 65 61 67 6c    return $::eagl
1c40: 65 5f 70 6c 61 74 66 6f 72 6d 28 63 6f 6e 66 69  e_platform(confi
1c50: 67 75 72 61 74 69 6f 6e 29 0d 0a 20 20 20 20 20  guration)..     
1c60: 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20   }..    }.....  
1c70: 20 20 70 72 6f 63 20 67 65 74 42 75 69 6c 64 43    proc getBuildC
1c80: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 73 20 7b 7d  onfigurations {}
1c90: 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20   {..      #..   
1ca0: 20 20 20 23 20 4e 4f 54 45 3a 20 53 65 65 20 69     # NOTE: See i
1cb0: 66 20 74 68 65 20 6c 69 73 74 20 6f 66 20 74 65  f the list of te
1cc0: 73 74 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  st configuration
1cd0: 73 20 68 61 73 20 62 65 65 6e 20 6f 76 65 72 72  s has been overr
1ce0: 69 64 64 65 6e 20 62 79 0d 0a 20 20 20 20 20 20  idden by..      
1cf0: 23 20 20 20 20 20 20 20 74 68 65 20 75 73 65 72  #       the user
1d00: 20 28 65 2e 67 2e 20 6f 6e 20 74 68 65 20 63 6f   (e.g. on the co
1d10: 6d 6d 61 6e 64 20 6c 69 6e 65 29 2e 0d 0a 20 20  mmand line)...  
1d20: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20      #..      if 
1d30: 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  {[info exists ::
1d40: 74 65 73 74 5f 63 6f 6e 66 69 67 75 72 61 74 69  test_configurati
1d50: 6f 6e 73 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20  ons] && \..     
1d60: 20 20 20 20 20 5b 6c 6c 65 6e 67 74 68 20 24 3a       [llength $:
1d70: 3a 74 65 73 74 5f 63 6f 6e 66 69 67 75 72 61 74  :test_configurat
1d80: 69 6f 6e 73 5d 20 3e 20 30 7d 20 74 68 65 6e 20  ions] > 0} then 
1d90: 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
1da0: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 55 73        # NOTE: Us
1db0: 65 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  e the specified 
1dc0: 6c 69 73 74 20 6f 66 20 74 65 73 74 20 63 6f 6e  list of test con
1dd0: 66 69 67 75 72 61 74 69 6f 6e 73 2e 0d 0a 20 20  figurations...  
1de0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
1df0: 20 72 65 74 75 72 6e 20 24 3a 3a 74 65 73 74 5f   return $::test_
1e00: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 73 0d 0a  configurations..
1e10: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
1e20: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
1e30: 20 20 20 23 20 4e 4f 54 45 3a 20 55 73 65 20 74     # NOTE: Use t
1e40: 68 65 20 64 65 66 61 75 6c 74 20 6c 69 73 74 20  he default list 
1e50: 6f 66 20 74 65 73 74 20 63 6f 6e 66 69 67 75 72  of test configur
1e60: 61 74 69 6f 6e 73 2e 0d 0a 20 20 20 20 20 20 20  ations...       
1e70: 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75   #..        retu
1e80: 72 6e 20 5b 6c 69 73 74 20 44 65 62 75 67 20 52  rn [list Debug R
1e90: 65 6c 65 61 73 65 5d 0d 0a 20 20 20 20 20 20 7d  elease]..      }
1ea0: 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
1eb0: 70 72 6f 63 20 67 65 74 42 75 69 6c 64 42 61 73  proc getBuildBas
1ec0: 65 44 69 72 65 63 74 6f 72 79 20 7b 7d 20 7b 0d  eDirectory {} {.
1ed0: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
1ee0: 23 20 4e 4f 54 45 3a 20 46 69 67 75 72 65 20 6f  # NOTE: Figure o
1ef0: 75 74 20 74 68 65 20 62 61 73 65 20 64 69 72 65  ut the base dire
1f00: 63 74 6f 72 79 20 77 68 65 72 65 20 61 6c 6c 20  ctory where all 
1f10: 74 68 65 20 62 75 69 6c 64 73 20 73 68 6f 75 6c  the builds shoul
1f20: 64 20 62 65 0d 0a 20 20 20 20 20 20 23 20 20 20  d be..      #   
1f30: 20 20 20 20 6c 6f 63 61 74 65 64 2e 20 20 54 68      located.  Th
1f40: 69 73 20 77 69 6c 6c 20 62 65 20 74 68 65 20 64  is will be the d
1f50: 69 72 65 63 74 6f 72 79 20 74 68 61 74 20 63 6f  irectory that co
1f60: 6e 74 61 69 6e 73 20 74 68 65 20 61 63 74 75 61  ntains the actua
1f70: 6c 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  l..      #      
1f80: 20 62 75 69 6c 64 20 6f 75 74 70 75 74 20 64 69   build output di
1f90: 72 65 63 74 6f 72 79 20 28 65 2e 67 2e 20 70 61  rectory (e.g. pa
1fa0: 72 65 6e 74 20 6f 66 20 22 62 69 6e 22 29 2e 0d  rent of "bin")..
1fb0: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
1fc0: 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73  if {[info exists
1fd0: 20 3a 3a 62 75 69 6c 64 5f 62 61 73 65 5f 64 69   ::build_base_di
1fe0: 72 65 63 74 6f 72 79 5d 20 26 26 20 5c 0d 0a 20  rectory] && \.. 
1ff0: 20 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67           [string
2000: 20 6c 65 6e 67 74 68 20 24 3a 3a 62 75 69 6c 64   length $::build
2010: 5f 62 61 73 65 5f 64 69 72 65 63 74 6f 72 79 5d  _base_directory]
2020: 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20   > 0} then {..  
2030: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
2040: 20 23 20 4e 4f 54 45 3a 20 54 68 65 20 6c 6f 63   # NOTE: The loc
2050: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 62 75 69  ation of the bui
2060: 6c 64 20 62 61 73 65 20 64 69 72 65 63 74 6f 72  ld base director
2070: 79 20 68 61 73 20 62 65 65 6e 20 6f 76 65 72 72  y has been overr
2080: 69 64 64 65 6e 3b 0d 0a 20 20 20 20 20 20 20 20  idden;..        
2090: 23 20 20 20 20 20 20 20 74 68 65 72 65 66 6f 72  #       therefor
20a0: 65 2c 20 75 73 65 20 69 74 20 76 65 72 62 61 74  e, use it verbat
20b0: 69 6d 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  im...        #..
20c0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 24          return $
20d0: 3a 3a 62 75 69 6c 64 5f 62 61 73 65 5f 64 69 72  ::build_base_dir
20e0: 65 63 74 6f 72 79 0d 0a 20 20 20 20 20 20 7d 20  ectory..      } 
20f0: 65 6c 73 65 69 66 20 7b 5b 69 6e 66 6f 20 65 78  elseif {[info ex
2100: 69 73 74 73 20 3a 3a 63 6f 6d 6d 6f 6e 5f 64 69  ists ::common_di
2110: 72 65 63 74 6f 72 79 5d 20 26 26 20 5c 0d 0a 20  rectory] && \.. 
2120: 20 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67           [string
2130: 20 6c 65 6e 67 74 68 20 24 3a 3a 63 6f 6d 6d 6f   length $::commo
2140: 6e 5f 64 69 72 65 63 74 6f 72 79 5d 20 3e 20 30  n_directory] > 0
2150: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
2160: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
2170: 4f 54 45 3a 20 4e 65 78 74 2c 20 66 61 6c 6c 62  OTE: Next, fallb
2180: 61 63 6b 20 74 6f 20 74 68 65 20 70 61 72 65 6e  ack to the paren
2190: 74 20 64 69 72 65 63 74 6f 72 79 20 6f 66 20 74  t directory of t
21a0: 68 65 20 6f 6e 65 20 63 6f 6e 74 61 69 6e 69 6e  he one containin
21b0: 67 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  g..        #    
21c0: 20 20 20 74 68 69 73 20 66 69 6c 65 20 28 69 2e     this file (i.
21d0: 65 2e 20 22 63 6f 6d 6d 6f 6e 2e 65 61 67 6c 65  e. "common.eagle
21e0: 22 29 2c 20 69 66 20 61 76 61 69 6c 61 62 6c 65  "), if available
21f0: 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
2200: 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b 66 69        return [fi
2210: 6c 65 20 64 69 72 6e 61 6d 65 20 24 3a 3a 63 6f  le dirname $::co
2220: 6d 6d 6f 6e 5f 64 69 72 65 63 74 6f 72 79 5d 0d  mmon_directory].
2230: 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 69 66 20  .      } elseif 
2240: 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  {[info exists ::
2250: 70 61 74 68 5d 20 26 26 20 5c 0d 0a 20 20 20 20  path] && \..    
2260: 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65        [string le
2270: 6e 67 74 68 20 24 3a 3a 70 61 74 68 5d 20 3e 20  ngth $::path] > 
2280: 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
2290: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
22a0: 4e 4f 54 45 3a 20 46 69 6e 61 6c 6c 79 2c 20 66  NOTE: Finally, f
22b0: 61 6c 6c 62 61 63 6b 20 74 6f 20 74 68 65 20 70  allback to the p
22c0: 61 72 65 6e 74 20 64 69 72 65 63 74 6f 72 79 20  arent directory 
22d0: 6f 66 20 74 68 65 20 45 61 67 6c 65 54 65 73 74  of the EagleTest
22e0: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
22f0: 20 20 70 61 74 68 2e 20 20 54 68 65 20 45 61 67    path.  The Eag
2300: 6c 65 54 65 73 74 20 70 61 63 6b 61 67 65 20 67  leTest package g
2310: 75 61 72 61 6e 74 65 65 73 20 74 68 61 74 20 74  uarantees that t
2320: 68 69 73 20 76 61 72 69 61 62 6c 65 0d 0a 20 20  his variable..  
2330: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 77 69        #       wi
2340: 6c 6c 20 62 65 20 73 65 74 20 74 6f 20 74 68 65  ll be set to the
2350: 20 64 69 72 65 63 74 6f 72 79 20 63 6f 6e 74 61   directory conta
2360: 69 6e 69 6e 67 20 74 68 65 20 66 69 72 73 74 20  ining the first 
2370: 66 69 6c 65 20 74 6f 0d 0a 20 20 20 20 20 20 20  file to..       
2380: 20 23 20 20 20 20 20 20 20 65 78 65 63 75 74 65   #       execute
2390: 20 74 68 65 20 5b 72 75 6e 54 65 73 74 50 72 6f   the [runTestPro
23a0: 6c 6f 67 75 65 5d 20 73 63 72 69 70 74 20 6c 69  logue] script li
23b0: 62 72 61 72 79 20 70 72 6f 63 65 64 75 72 65 2e  brary procedure.
23c0: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
23d0: 20 20 20 20 20 72 65 74 75 72 6e 20 5b 66 69 6c       return [fil
23e0: 65 20 64 69 72 6e 61 6d 65 20 24 3a 3a 70 61 74  e dirname $::pat
23f0: 68 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65  h]..      } else
2400: 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20   {..        #.. 
2410: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4e         # NOTE: N
2420: 6f 20 70 61 74 68 20 69 73 20 61 76 61 69 6c 61  o path is availa
2430: 62 6c 65 2c 20 72 65 74 75 72 6e 20 61 6e 20 65  ble, return an e
2440: 6d 70 74 79 20 73 74 72 69 6e 67 2e 20 20 54 68  mpty string.  Th
2450: 69 73 20 70 6f 69 6e 74 0d 0a 20 20 20 20 20 20  is point..      
2460: 20 20 23 20 20 20 20 20 20 20 73 68 6f 75 6c 64    #       should
2470: 20 6e 6f 74 20 62 65 20 72 65 61 63 68 65 64 2e   not be reached.
2480: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
2490: 20 20 20 20 20 72 65 74 75 72 6e 20 22 22 0d 0a       return ""..
24a0: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a        }..    }..
24b0: 0c 0d 0a 20 20 20 20 70 72 6f 63 20 6a 6f 69 6e  ...    proc join
24c0: 42 75 69 6c 64 44 69 72 65 63 74 6f 72 79 20 7b  BuildDirectory {
24d0: 20 6e 61 74 69 76 65 20 70 61 74 68 20 79 65 61   native path yea
24e0: 72 20 70 6c 61 74 66 6f 72 6d 20 63 6f 6e 66 69  r platform confi
24f0: 67 75 72 61 74 69 6f 6e 20 7d 20 7b 0d 0a 20 20  guration } {..  
2500: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
2510: 4f 54 45 3a 20 46 69 67 75 72 65 20 6f 75 74 20  OTE: Figure out 
2520: 61 6e 64 20 74 68 65 6e 20 72 65 74 75 72 6e 20  and then return 
2530: 74 68 65 20 66 75 6c 6c 79 20 71 75 61 6c 69 66  the fully qualif
2540: 69 65 64 20 70 61 74 68 20 74 6f 20 74 68 65 20  ied path to the 
2550: 62 75 69 6c 64 0d 0a 20 20 20 20 20 20 23 20 20  build..      #  
2560: 20 20 20 20 20 64 69 72 65 63 74 6f 72 79 20 62       directory b
2570: 61 73 65 64 20 6f 6e 20 61 6c 6c 20 74 68 65 20  ased on all the 
2580: 61 72 67 75 6d 65 6e 74 73 20 70 72 6f 76 69 64  arguments provid
2590: 65 64 20 62 79 20 6f 75 72 20 63 61 6c 6c 65 72  ed by our caller
25a0: 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
25b0: 20 20 69 66 20 7b 24 6e 61 74 69 76 65 7d 20 74    if {$native} t
25c0: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 72  hen {..        r
25d0: 65 74 75 72 6e 20 5b 66 69 6c 65 20 6a 6f 69 6e  eturn [file join
25e0: 20 24 70 61 74 68 20 62 69 6e 20 24 79 65 61 72   $path bin $year
25f0: 20 24 70 6c 61 74 66 6f 72 6d 20 24 63 6f 6e 66   $platform $conf
2600: 69 67 75 72 61 74 69 6f 6e 5d 0d 0a 20 20 20 20  iguration]..    
2610: 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
2620: 20 20 20 20 72 65 74 75 72 6e 20 5b 66 69 6c 65      return [file
2630: 20 6a 6f 69 6e 20 24 70 61 74 68 20 62 69 6e 20   join $path bin 
2640: 24 79 65 61 72 20 24 63 6f 6e 66 69 67 75 72 61  $year $configura
2650: 74 69 6f 6e 20 62 69 6e 5d 0d 0a 20 20 20 20 20  tion bin]..     
2660: 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20   }..    }.....  
2670: 20 20 70 72 6f 63 20 67 65 74 42 75 69 6c 64 44    proc getBuildD
2680: 69 72 65 63 74 6f 72 79 20 7b 7d 20 7b 0d 0a 20  irectory {} {.. 
2690: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
26a0: 4e 4f 54 45 3a 20 53 65 65 20 69 66 20 74 68 65  NOTE: See if the
26b0: 20 22 6e 61 74 69 76 65 22 20 72 75 6e 74 69 6d   "native" runtim
26c0: 65 20 6f 70 74 69 6f 6e 20 68 61 73 20 62 65 65  e option has bee
26d0: 6e 20 73 65 74 2e 20 20 49 66 20 73 6f 2c 20 75  n set.  If so, u
26e0: 73 65 20 74 68 65 0d 0a 20 20 20 20 20 20 23 20  se the..      # 
26f0: 20 20 20 20 20 20 64 69 72 65 63 74 6f 72 79 20        directory 
2700: 66 6f 72 20 74 68 65 20 6d 69 78 65 64 2d 6d 6f  for the mixed-mo
2710: 64 65 20 61 73 73 65 6d 62 6c 79 20 28 61 2e 6b  de assembly (a.k
2720: 2e 61 2e 20 74 68 65 20 6e 61 74 69 76 65 20 69  .a. the native i
2730: 6e 74 65 72 6f 70 0d 0a 20 20 20 20 20 20 23 20  nterop..      # 
2740: 20 20 20 20 20 20 61 73 73 65 6d 62 6c 79 29 2e        assembly).
2750: 20 20 54 6f 20 65 6e 61 62 6c 65 20 74 68 69 73    To enable this
2760: 20 6f 70 74 69 6f 6e 20 76 69 61 20 74 68 65 20   option via the 
2770: 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 2c 20 65 6e  command line, en
2780: 74 65 72 20 61 0d 0a 20 20 20 20 20 20 23 20 20  ter a..      #  
2790: 20 20 20 20 20 63 6f 6d 6d 61 6e 64 20 73 69 6d       command sim
27a0: 69 6c 61 72 20 74 6f 20 6f 6e 65 20 6f 66 20 74  ilar to one of t
27b0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 28 61 6c  he following (al
27c0: 6c 20 6f 6e 20 6f 6e 65 20 6c 69 6e 65 29 3a 0d  l on one line):.
27d0: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
27e0: 23 20 20 20 20 20 20 20 45 61 67 6c 65 53 68 65  #       EagleShe
27f0: 6c 6c 2e 65 78 65 20 2d 69 6e 69 74 69 61 6c 69  ll.exe -initiali
2800: 7a 65 20 2d 72 75 6e 74 69 6d 65 4f 70 74 69 6f  ze -runtimeOptio
2810: 6e 20 6e 61 74 69 76 65 0d 0a 20 20 20 20 20 20  n native..      
2820: 23 20 20 20 20 20 20 20 20 20 2d 66 69 6c 65 20  #         -file 
2830: 2e 5c 70 61 74 68 5c 74 6f 5c 61 6c 6c 2e 65 61  .\path\to\all.ea
2840: 67 6c 65 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  gle..      #..  
2850: 20 20 20 20 23 20 20 20 20 20 20 20 54 6f 20 65      #       To e
2860: 6e 61 62 6c 65 20 74 68 69 73 20 6f 70 74 69 6f  nable this optio
2870: 6e 20 76 69 61 20 74 68 65 20 63 6f 6d 6d 61 6e  n via the comman
2880: 64 20 6c 69 6e 65 20 70 72 69 6f 72 20 74 6f 20  d line prior to 
2890: 74 68 65 20 22 62 65 74 61 20 31 36 22 0d 0a 20  the "beta 16".. 
28a0: 20 20 20 20 20 23 20 20 20 20 20 20 20 72 65 6c       #       rel
28b0: 65 61 73 65 20 6f 66 20 45 61 67 6c 65 2c 20 74  ease of Eagle, t
28c0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6d  he following com
28d0: 6d 61 6e 64 20 6d 75 73 74 20 62 65 20 75 73 65  mand must be use
28e0: 64 20 69 6e 73 74 65 61 64 0d 0a 20 20 20 20 20  d instead..     
28f0: 20 23 20 20 20 20 20 20 20 28 61 6c 73 6f 20 61   #       (also a
2900: 6c 6c 20 6f 6e 20 6f 6e 65 20 6c 69 6e 65 29 3a  ll on one line):
2910: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
2920: 20 23 20 20 20 20 20 20 20 45 61 67 6c 65 53 68   #       EagleSh
2930: 65 6c 6c 2e 65 78 65 20 2d 69 6e 69 74 69 61 6c  ell.exe -initial
2940: 69 7a 65 20 2d 70 6f 73 74 49 6e 69 74 69 61 6c  ize -postInitial
2950: 69 7a 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ize..      #    
2960: 20 20 20 20 20 22 6f 62 6a 65 63 74 20 69 6e 76       "object inv
2970: 6f 6b 65 20 49 6e 74 65 72 70 72 65 74 65 72 2e  oke Interpreter.
2980: 47 65 74 41 63 74 69 76 65 20 41 64 64 52 75 6e  GetActive AddRun
2990: 74 69 6d 65 4f 70 74 69 6f 6e 20 6e 61 74 69 76  timeOption nativ
29a0: 65 22 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  e"..      #     
29b0: 20 20 20 20 2d 66 69 6c 65 20 2e 5c 70 61 74 68      -file .\path
29c0: 5c 74 6f 5c 61 6c 6c 2e 65 61 67 6c 65 0d 0a 20  \to\all.eagle.. 
29d0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66       #..      if
29e0: 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a   {[info exists :
29f0: 3a 62 75 69 6c 64 5f 64 69 72 65 63 74 6f 72 79  :build_directory
2a00: 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20  ] && \..        
2a10: 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68    [string length
2a20: 20 24 3a 3a 62 75 69 6c 64 5f 64 69 72 65 63 74   $::build_direct
2a30: 6f 72 79 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b  ory] > 0} then {
2a40: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
2a50: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 65       # NOTE: The
2a60: 20 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 74 68 65   location of the
2a70: 20 62 75 69 6c 64 20 64 69 72 65 63 74 6f 72 79   build directory
2a80: 20 68 61 73 20 62 65 65 6e 20 6f 76 65 72 72 69   has been overri
2a90: 64 64 65 6e 3b 0d 0a 20 20 20 20 20 20 20 20 23  dden;..        #
2aa0: 20 20 20 20 20 20 20 74 68 65 72 65 66 6f 72 65         therefore
2ab0: 2c 20 75 73 65 20 69 74 20 76 65 72 62 61 74 69  , use it verbati
2ac0: 6d 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  m...        #.. 
2ad0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 3a         return $:
2ae0: 3a 62 75 69 6c 64 5f 64 69 72 65 63 74 6f 72 79  :build_directory
2af0: 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b  ..      } else {
2b00: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
2b10: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 66 20       # NOTE: If 
2b20: 74 68 65 20 22 6e 61 74 69 76 65 22 20 72 75 6e  the "native" run
2b30: 74 69 6d 65 20 6f 70 74 69 6f 6e 20 69 73 20 73  time option is s
2b40: 65 74 2c 20 74 68 65 20 6d 69 78 65 64 2d 6d 6f  et, the mixed-mo
2b50: 64 65 20 61 73 73 65 6d 62 6c 79 0d 0a 20 20 20  de assembly..   
2b60: 20 20 20 20 20 23 20 20 20 20 20 20 20 69 73 20       #       is 
2b70: 62 65 69 6e 67 20 74 65 73 74 65 64 2e 20 20 49  being tested.  I
2b80: 6e 20 74 68 61 74 20 63 61 73 65 2c 20 74 68 65  n that case, the
2b90: 20 70 61 74 68 20 74 6f 20 74 68 65 20 62 75 69   path to the bui
2ba0: 6c 64 20 64 69 72 65 63 74 6f 72 79 0d 0a 20 20  ld directory..  
2bb0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 77 69        #       wi
2bc0: 6c 6c 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 70  ll contain the p
2bd0: 6c 61 74 66 6f 72 6d 20 6e 61 6d 65 20 61 6e 64  latform name and
2be0: 20 61 6c 6c 20 74 68 65 20 62 69 6e 61 72 69 65   all the binarie
2bf0: 73 20 75 6e 64 65 72 20 74 65 73 74 0d 0a 20 20  s under test..  
2c00: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 73 68        #       sh
2c10: 6f 75 6c 64 20 62 65 20 70 72 65 73 65 6e 74 20  ould be present 
2c20: 69 6e 20 74 68 61 74 20 64 69 72 65 63 74 6f 72  in that director
2c30: 79 2e 20 20 49 66 20 74 68 65 20 22 6e 61 74 69  y.  If the "nati
2c40: 76 65 22 20 72 75 6e 74 69 6d 65 0d 0a 20 20 20  ve" runtime..   
2c50: 20 20 20 20 20 23 20 20 20 20 20 20 20 6f 70 74       #       opt
2c60: 69 6f 6e 20 69 73 20 6e 6f 74 20 73 65 74 2c 20  ion is not set, 
2c70: 74 68 65 20 62 75 69 6c 64 20 64 69 72 65 63 74  the build direct
2c80: 6f 72 79 20 77 69 6c 6c 20 62 65 20 63 6f 6e 73  ory will be cons
2c90: 69 64 65 72 65 64 20 74 6f 20 62 65 0d 0a 20 20  idered to be..  
2ca0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 22 70        #       "p
2cb0: 6c 61 74 66 6f 72 6d 2d 6e 65 75 74 72 61 6c 22  latform-neutral"
2cc0: 2c 20 77 69 74 68 20 74 68 65 20 6e 6f 74 61 62  , with the notab
2cd0: 6c 65 20 65 78 63 65 70 74 69 6f 6e 20 6f 66 20  le exception of 
2ce0: 61 6e 79 20 6e 61 74 69 76 65 0d 0a 20 20 20 20  any native..    
2cf0: 20 20 20 20 23 20 20 20 20 20 20 20 61 73 73 65      #       asse
2d00: 6d 62 6c 79 20 28 65 2e 67 2e 20 22 53 51 4c 69  mbly (e.g. "SQLi
2d10: 74 65 2e 49 6e 74 65 72 6f 70 2e 64 6c 6c 22 29  te.Interop.dll")
2d20: 20 63 6f 70 69 65 64 20 74 68 65 72 65 20 64 75   copied there du
2d30: 72 69 6e 67 20 74 68 65 0d 0a 20 20 20 20 20 20  ring the..      
2d40: 20 20 23 20 20 20 20 20 20 20 62 75 69 6c 64 20    #       build 
2d50: 70 72 6f 63 65 73 73 20 69 74 73 65 6c 66 2e 20  process itself. 
2d60: 20 49 66 20 74 68 65 20 62 75 69 6c 64 20 70 72   If the build pr
2d70: 6f 63 65 73 73 20 73 6f 6d 65 68 6f 77 20 64 6f  ocess somehow do
2d80: 65 73 20 6e 6f 74 0d 0a 20 20 20 20 20 20 20 20  es not..        
2d90: 23 20 20 20 20 20 20 20 63 6f 70 79 20 74 68 65  #       copy the
2da0: 20 6e 61 74 69 76 65 20 61 73 73 65 6d 62 6c 79   native assembly
2db0: 20 66 6f 72 20 74 68 69 73 20 70 6c 61 74 66 6f   for this platfo
2dc0: 72 6d 2c 20 6d 6f 73 74 20 6f 66 20 74 68 65 20  rm, most of the 
2dd0: 74 65 73 74 73 0d 0a 20 20 20 20 20 20 20 20 23  tests..        #
2de0: 20 20 20 20 20 20 20 69 6e 20 74 68 65 20 73 75         in the su
2df0: 69 74 65 20 77 69 6c 6c 20 73 69 6d 70 6c 79 20  ite will simply 
2e00: 62 65 20 73 6b 69 70 70 65 64 2e 20 20 47 65 6e  be skipped.  Gen
2e10: 65 72 61 6c 6c 79 20 73 70 65 61 6b 69 6e 67 2c  erally speaking,
2e20: 20 74 68 65 72 65 0d 0a 20 20 20 20 20 20 20 20   there..        
2e30: 23 20 20 20 20 20 20 20 61 72 65 20 74 77 6f 20  #       are two 
2e40: 77 61 79 73 20 74 6f 20 62 75 69 6c 64 20 74 68  ways to build th
2e50: 65 20 62 69 6e 61 72 69 65 73 20 77 68 65 6e 20  e binaries when 
2e60: 70 72 65 70 61 72 69 6e 67 20 74 6f 20 72 75 6e  preparing to run
2e70: 20 74 68 65 0d 0a 20 20 20 20 20 20 20 20 23 20   the..        # 
2e80: 20 20 20 20 20 20 74 65 73 74 20 73 75 69 74 65        test suite
2e90: 3a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  :..        #..  
2ea0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 31 2e        #       1.
2eb0: 20 42 75 69 6c 64 20 74 68 65 20 73 65 70 61 72   Build the separ
2ec0: 61 74 65 20 6d 61 6e 61 67 65 64 20 61 6e 64 20  ate managed and 
2ed0: 6e 61 74 69 76 65 20 61 73 73 65 6d 62 6c 69 65  native assemblie
2ee0: 73 20 75 73 69 6e 67 20 73 6f 6d 65 0d 0a 20 20  s using some..  
2ef0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 20 20        #         
2f00: 20 63 6f 6d 6d 61 6e 64 73 20 73 69 6d 69 6c 61   commands simila
2f10: 72 20 74 6f 3a 0d 0a 20 20 20 20 20 20 20 20 23  r to:..        #
2f20: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
2f30: 20 20 20 20 20 62 75 69 6c 64 2e 62 61 74 20 24       build.bat $
2f40: 7b 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 7d 4d  {Configuration}M
2f50: 61 6e 61 67 65 64 4f 6e 6c 79 20 24 7b 50 6c 61  anagedOnly ${Pla
2f60: 74 66 6f 72 6d 7d 0d 0a 20 20 20 20 20 20 20 20  tform}..        
2f70: 23 20 20 20 20 20 20 20 20 20 20 62 75 69 6c 64  #          build
2f80: 2e 62 61 74 20 24 7b 43 6f 6e 66 69 67 75 72 61  .bat ${Configura
2f90: 74 69 6f 6e 7d 4e 61 74 69 76 65 4f 6e 6c 79 20  tion}NativeOnly 
2fa0: 24 7b 50 6c 61 74 66 6f 72 6d 7d 0d 0a 20 20 20  ${Platform}..   
2fb0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
2fc0: 23 20 20 20 20 20 20 20 20 20 20 57 68 65 72 65  #          Where
2fd0: 20 24 7b 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e   ${Configuration
2fe0: 7d 20 69 73 20 65 69 74 68 65 72 20 22 44 65 62  } is either "Deb
2ff0: 75 67 22 20 6f 72 20 22 52 65 6c 65 61 73 65 22  ug" or "Release"
3000: 20 61 6e 64 0d 0a 20 20 20 20 20 20 20 20 23 20   and..        # 
3010: 20 20 20 20 20 20 20 20 20 24 7b 50 6c 61 74 66           ${Platf
3020: 6f 72 6d 7d 20 69 73 20 65 69 74 68 65 72 20 22  orm} is either "
3030: 57 69 6e 33 32 22 20 6f 72 20 22 78 36 34 22 2e  Win32" or "x64".
3040: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
3050: 20 20 20 20 20 23 20 20 20 20 20 20 20 32 2e 20       #       2. 
3060: 42 75 69 6c 64 20 74 68 65 20 6d 69 78 65 64 2d  Build the mixed-
3070: 6d 6f 64 65 20 61 73 73 65 6d 62 6c 79 20 75 73  mode assembly us
3080: 69 6e 67 20 61 20 63 6f 6d 6d 61 6e 64 20 73 69  ing a command si
3090: 6d 69 6c 61 72 20 74 6f 3a 0d 0a 20 20 20 20 20  milar to:..     
30a0: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
30b0: 20 20 20 20 20 20 20 20 20 62 75 69 6c 64 2e 62           build.b
30c0: 61 74 20 24 7b 43 6f 6e 66 69 67 75 72 61 74 69  at ${Configurati
30d0: 6f 6e 7d 20 24 7b 50 6c 61 74 66 6f 72 6d 7d 0d  on} ${Platform}.
30e0: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
30f0: 20 20 20 20 23 20 20 20 20 20 20 20 20 20 20 57      #          W
3100: 68 65 72 65 20 24 7b 43 6f 6e 66 69 67 75 72 61  here ${Configura
3110: 74 69 6f 6e 7d 20 69 73 20 65 69 74 68 65 72 20  tion} is either 
3120: 22 44 65 62 75 67 22 20 6f 72 20 22 52 65 6c 65  "Debug" or "Rele
3130: 61 73 65 22 20 61 6e 64 0d 0a 20 20 20 20 20 20  ase" and..      
3140: 20 20 23 20 20 20 20 20 20 20 20 20 20 24 7b 50    #          ${P
3150: 6c 61 74 66 6f 72 6d 7d 20 69 73 20 65 69 74 68  latform} is eith
3160: 65 72 20 22 57 69 6e 33 32 22 20 6f 72 20 22 78  er "Win32" or "x
3170: 36 34 22 2e 20 20 49 66 20 74 68 69 73 20 63 6f  64".  If this co
3180: 6d 6d 61 6e 64 20 69 73 0d 0a 20 20 20 20 20 20  mmand is..      
3190: 20 20 23 20 20 20 20 20 20 20 20 20 20 75 73 65    #          use
31a0: 64 2c 20 76 61 72 69 6f 75 73 20 74 65 73 74 73  d, various tests
31b0: 20 74 68 61 74 20 72 65 71 75 69 72 65 20 73 75   that require su
31c0: 70 70 6c 65 6d 65 6e 74 61 72 79 20 6d 61 6e 61  pplementary mana
31d0: 67 65 64 0d 0a 20 20 20 20 20 20 20 20 23 20 20  ged..        #  
31e0: 20 20 20 20 20 20 20 20 61 73 73 65 6d 62 6c 69          assembli
31f0: 65 73 20 28 65 2e 67 2e 20 4c 49 4e 51 29 20 6d  es (e.g. LINQ) m
3200: 61 79 20 62 65 20 73 6b 69 70 70 65 64 20 75 6e  ay be skipped un
3210: 6c 65 73 73 20 74 68 6f 73 65 20 62 69 6e 61 72  less those binar
3220: 69 65 73 0d 0a 20 20 20 20 20 20 20 20 23 20 20  ies..        #  
3230: 20 20 20 20 20 20 20 20 61 72 65 20 73 75 62 73          are subs
3240: 65 71 75 65 6e 74 6c 79 20 63 6f 70 69 65 64 20  equently copied 
3250: 69 6e 74 6f 20 74 68 65 20 63 6f 72 72 65 63 74  into the correct
3260: 20 64 69 72 65 63 74 6f 72 79 20 28 69 2e 65 2e   directory (i.e.
3270: 20 62 79 0d 0a 20 20 20 20 20 20 20 20 23 20 20   by..        #  
3280: 20 20 20 20 20 20 20 20 22 74 65 73 74 5f 61 6c          "test_al
3290: 6c 2e 62 61 74 22 29 2e 0d 0a 20 20 20 20 20 20  l.bat")...      
32a0: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 20    #..        #  
32b0: 20 20 20 20 20 4e 6f 74 65 20 74 68 61 74 20 61       Note that a
32c0: 6c 6c 20 6f 66 20 74 68 65 20 62 75 69 6c 64 20  ll of the build 
32d0: 63 6f 6d 6d 61 6e 64 73 20 61 62 6f 76 65 20 77  commands above w
32e0: 69 6c 6c 20 64 65 66 61 75 6c 74 20 74 6f 20 75  ill default to u
32f0: 73 69 6e 67 0d 0a 20 20 20 20 20 20 20 20 23 20  sing..        # 
3300: 20 20 20 20 20 20 74 68 65 20 6c 61 74 65 73 74        the latest
3310: 20 76 65 72 73 69 6f 6e 20 6f 66 20 4d 53 42 75   version of MSBu
3320: 69 6c 64 20 61 76 61 69 6c 61 62 6c 65 20 61 6e  ild available an
3330: 64 20 74 68 65 20 22 74 65 73 74 5f 79 65 61 72  d the "test_year
3340: 22 20 6d 61 79 0d 0a 20 20 20 20 20 20 20 20 23  " may..        #
3350: 20 20 20 20 20 20 20 6e 65 65 64 20 74 6f 20 62         need to b
3360: 65 20 61 64 6a 75 73 74 65 64 20 61 63 63 6f 72  e adjusted accor
3370: 64 69 6e 67 6c 79 20 74 6f 20 61 63 74 75 61 6c  dingly to actual
3380: 6c 79 20 72 75 6e 20 74 68 65 20 74 65 73 74 20  ly run the test 
3390: 73 75 69 74 65 2e 0d 0a 20 20 20 20 20 20 20 20  suite...        
33a0: 23 20 20 20 20 20 20 20 52 65 66 65 72 20 74 6f  #       Refer to
33b0: 20 74 68 65 20 63 6f 6d 6d 65 6e 74 73 20 69 6e   the comments in
33c0: 20 5b 67 65 74 42 75 69 6c 64 59 65 61 72 5d 20   [getBuildYear] 
33d0: 66 6f 72 20 6d 6f 72 65 20 69 6e 66 6f 72 6d 61  for more informa
33e0: 74 69 6f 6e 20 6f 6e 0d 0a 20 20 20 20 20 20 20  tion on..       
33f0: 20 23 20 20 20 20 20 20 20 68 6f 77 20 74 6f 20   #       how to 
3400: 73 65 74 20 74 68 69 73 20 76 61 72 69 61 62 6c  set this variabl
3410: 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  e...        #.. 
3420: 20 20 20 20 20 20 20 73 65 74 20 6e 61 74 69 76         set nativ
3430: 65 20 5b 68 61 73 52 75 6e 74 69 6d 65 4f 70 74  e [hasRuntimeOpt
3440: 69 6f 6e 20 6e 61 74 69 76 65 5d 0d 0a 0d 0a 20  ion native].... 
3450: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b 6a         return [j
3460: 6f 69 6e 42 75 69 6c 64 44 69 72 65 63 74 6f 72  oinBuildDirector
3470: 79 20 24 6e 61 74 69 76 65 20 5b 67 65 74 42 75  y $native [getBu
3480: 69 6c 64 42 61 73 65 44 69 72 65 63 74 6f 72 79  ildBaseDirectory
3490: 5d 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ] \..           
34a0: 20 5b 67 65 74 42 75 69 6c 64 59 65 61 72 5d 20   [getBuildYear] 
34b0: 5b 67 65 74 42 75 69 6c 64 50 6c 61 74 66 6f 72  [getBuildPlatfor
34c0: 6d 20 24 6e 61 74 69 76 65 5d 20 5b 67 65 74 42  m $native] [getB
34d0: 75 69 6c 64 43 6f 6e 66 69 67 75 72 61 74 69 6f  uildConfiguratio
34e0: 6e 5d 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20  n]]..      }..  
34f0: 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
3500: 20 67 65 74 42 75 69 6c 64 46 69 6c 65 4e 61 6d   getBuildFileNam
3510: 65 20 7b 20 66 69 6c 65 4e 61 6d 65 20 7d 20 7b  e { fileName } {
3520: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
3530: 20 23 20 4e 4f 54 45 3a 20 52 65 74 75 72 6e 73   # NOTE: Returns
3540: 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 66   the specified f
3550: 69 6c 65 20 6e 61 6d 65 20 61 73 20 69 66 20 69  ile name as if i
3560: 74 20 77 65 72 65 20 6c 6f 63 61 74 65 64 20 69  t were located i
3570: 6e 20 74 68 65 0d 0a 20 20 20 20 20 20 23 20 20  n the..      #  
3580: 20 20 20 20 20 62 75 69 6c 64 20 64 69 72 65 63       build direc
3590: 74 6f 72 79 2c 20 64 69 73 63 61 72 64 69 6e 67  tory, discarding
35a0: 20 61 6e 79 20 64 69 72 65 63 74 6f 72 79 20 69   any directory i
35b0: 6e 66 6f 72 6d 61 74 69 6f 6e 20 70 72 65 73 65  nformation prese
35c0: 6e 74 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  nt..      #     
35d0: 20 20 69 6e 20 74 68 65 20 66 69 6c 65 20 6e 61    in the file na
35e0: 6d 65 20 61 73 20 70 72 6f 76 69 64 65 64 20 62  me as provided b
35f0: 79 20 6f 75 72 20 63 61 6c 6c 65 72 2e 0d 0a 20  y our caller... 
3600: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 72 65       #..      re
3610: 74 75 72 6e 20 5b 66 69 6c 65 20 6e 61 74 69 76  turn [file nativ
3620: 65 6e 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20 20  ename \..       
3630: 20 20 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5b 67     [file join [g
3640: 65 74 42 75 69 6c 64 44 69 72 65 63 74 6f 72 79  etBuildDirectory
3650: 5d 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 66 69  ] [file tail $fi
3660: 6c 65 4e 61 6d 65 5d 5d 5d 0d 0a 20 20 20 20 7d  leName]]]..    }
3670: 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65  .....    proc ge
3680: 74 42 69 6e 61 72 79 44 69 72 65 63 74 6f 72 79  tBinaryDirectory
3690: 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a   {} {..      #..
36a0: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68        # NOTE: Th
36b0: 69 73 20 70 72 6f 63 65 64 75 72 65 20 72 65 74  is procedure ret
36c0: 75 72 6e 73 20 74 68 65 20 64 69 72 65 63 74 6f  urns the directo
36d0: 72 79 20 77 68 65 72 65 20 74 68 65 20 74 65 73  ry where the tes
36e0: 74 20 61 70 70 6c 69 63 61 74 69 6f 6e 0d 0a 20  t application.. 
36f0: 20 20 20 20 20 23 20 20 20 20 20 20 20 69 74 73       #       its
3700: 65 6c 66 20 28 69 2e 65 2e 20 74 68 65 20 45 61  elf (i.e. the Ea
3710: 67 6c 65 20 73 68 65 6c 6c 29 20 69 73 20 6c 6f  gle shell) is lo
3720: 63 61 74 65 64 2e 20 20 54 68 69 73 20 77 69 6c  cated.  This wil
3730: 6c 20 62 65 20 75 73 65 64 20 61 73 0d 0a 20 20  l be used as..  
3740: 20 20 20 20 23 20 20 20 20 20 20 20 74 68 65 20      #       the 
3750: 64 65 73 74 69 6e 61 74 69 6f 6e 20 66 6f 72 20  destination for 
3760: 74 68 65 20 63 6f 70 69 65 64 20 53 79 73 74 65  the copied Syste
3770: 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 20 6e 61  m.Data.SQLite na
3780: 74 69 76 65 20 61 6e 64 0d 0a 20 20 20 20 20 20  tive and..      
3790: 23 20 20 20 20 20 20 20 6d 61 6e 61 67 65 64 20  #       managed 
37a0: 61 73 73 65 6d 62 6c 69 65 73 20 28 69 2e 65 2e  assemblies (i.e.
37b0: 20 62 65 63 61 75 73 65 20 74 68 69 73 20 69 73   because this is
37c0: 20 6f 6e 65 20 6f 66 20 74 68 65 20 66 65 77 20   one of the few 
37d0: 70 6c 61 63 65 73 0d 0a 20 20 20 20 20 20 23 20  places..      # 
37e0: 20 20 20 20 20 20 77 68 65 72 65 20 74 68 65 20        where the 
37f0: 43 4c 52 20 77 69 6c 6c 20 61 63 74 75 61 6c 6c  CLR will actuall
3800: 79 20 66 69 6e 64 20 61 6e 64 20 6c 6f 61 64 20  y find and load 
3810: 74 68 65 6d 20 70 72 6f 70 65 72 6c 79 29 2e 0d  them properly)..
3820: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
3830: 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73  if {[info exists
3840: 20 3a 3a 62 69 6e 61 72 79 5f 64 69 72 65 63 74   ::binary_direct
3850: 6f 72 79 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20  ory] && \..     
3860: 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e       [string len
3870: 67 74 68 20 24 3a 3a 62 69 6e 61 72 79 5f 64 69  gth $::binary_di
3880: 72 65 63 74 6f 72 79 5d 20 3e 20 30 7d 20 74 68  rectory] > 0} th
3890: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d  en {..        #.
38a0: 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
38b0: 20 54 68 65 20 6c 6f 63 61 74 69 6f 6e 20 6f 66   The location of
38c0: 20 74 68 65 20 62 69 6e 61 72 79 20 64 69 72 65   the binary dire
38d0: 63 74 6f 72 79 20 68 61 73 20 62 65 65 6e 20 6f  ctory has been o
38e0: 76 65 72 72 69 64 64 65 6e 3b 0d 0a 20 20 20 20  verridden;..    
38f0: 20 20 20 20 23 20 20 20 20 20 20 20 74 68 65 72      #       ther
3900: 65 66 6f 72 65 2c 20 75 73 65 20 69 74 20 76 65  efore, use it ve
3910: 72 62 61 74 69 6d 2e 0d 0a 20 20 20 20 20 20 20  rbatim...       
3920: 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75   #..        retu
3930: 72 6e 20 24 3a 3a 62 69 6e 61 72 79 5f 64 69 72  rn $::binary_dir
3940: 65 63 74 6f 72 79 0d 0a 20 20 20 20 20 20 7d 20  ectory..      } 
3950: 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
3960: 72 65 74 75 72 6e 20 5b 69 6e 66 6f 20 62 69 6e  return [info bin
3970: 61 72 79 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20  ary]..      }.. 
3980: 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
3990: 63 20 67 65 74 42 69 6e 61 72 79 46 69 6c 65 4e  c getBinaryFileN
39a0: 61 6d 65 20 7b 20 66 69 6c 65 4e 61 6d 65 20 7d  ame { fileName }
39b0: 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20   {..      #..   
39c0: 20 20 20 23 20 4e 4f 54 45 3a 20 52 65 74 75 72     # NOTE: Retur
39d0: 6e 73 20 74 68 65 20 73 70 65 63 69 66 69 65 64  ns the specified
39e0: 20 66 69 6c 65 20 6e 61 6d 65 20 61 73 20 69 66   file name as if
39f0: 20 69 74 20 77 65 72 65 20 6c 6f 63 61 74 65 64   it were located
3a00: 20 69 6e 20 74 68 65 0d 0a 20 20 20 20 20 20 23   in the..      #
3a10: 20 20 20 20 20 20 20 62 69 6e 61 72 79 20 64 69         binary di
3a20: 72 65 63 74 6f 72 79 2c 20 64 69 73 63 61 72 64  rectory, discard
3a30: 69 6e 67 20 61 6e 79 20 64 69 72 65 63 74 6f 72  ing any director
3a40: 79 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 70 72  y information pr
3a50: 65 73 65 6e 74 0d 0a 20 20 20 20 20 20 23 20 20  esent..      #  
3a60: 20 20 20 20 20 69 6e 20 74 68 65 20 66 69 6c 65       in the file
3a70: 20 6e 61 6d 65 20 61 73 20 70 72 6f 76 69 64 65   name as provide
3a80: 64 20 62 79 20 6f 75 72 20 63 61 6c 6c 65 72 2e  d by our caller.
3a90: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
3aa0: 20 72 65 74 75 72 6e 20 5b 66 69 6c 65 20 6e 61   return [file na
3ab0: 74 69 76 65 6e 61 6d 65 20 5c 0d 0a 20 20 20 20  tivename \..    
3ac0: 20 20 20 20 20 20 5b 66 69 6c 65 20 6a 6f 69 6e        [file join
3ad0: 20 5b 67 65 74 42 69 6e 61 72 79 44 69 72 65 63   [getBinaryDirec
3ae0: 74 6f 72 79 5d 20 5b 66 69 6c 65 20 74 61 69 6c  tory] [file tail
3af0: 20 24 66 69 6c 65 4e 61 6d 65 5d 5d 5d 0d 0a 20   $fileName]]].. 
3b00: 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
3b10: 63 20 67 65 74 43 6f 72 65 42 69 6e 61 72 79 46  c getCoreBinaryF
3b20: 69 6c 65 4e 61 6d 65 20 7b 20 7b 73 74 61 6e 64  ileName { {stand
3b30: 61 72 64 20 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a  ard false} } {..
3b40: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
3b50: 20 4e 4f 54 45 3a 20 52 65 74 75 72 6e 73 20 74   NOTE: Returns t
3b60: 68 65 20 66 75 6c 6c 20 70 61 74 68 20 66 6f 72  he full path for
3b70: 20 74 68 65 20 66 69 6c 65 20 63 6f 6e 74 61 69   the file contai
3b80: 6e 69 6e 67 20 74 68 65 20 63 6f 72 65 20 53 51  ning the core SQ
3b90: 4c 69 74 65 0d 0a 20 20 20 20 20 20 23 20 20 20  Lite..      #   
3ba0: 20 20 20 20 6c 69 62 72 61 72 79 20 63 6f 64 65      library code
3bb0: 20 66 6f 72 20 74 68 69 73 20 70 6c 61 74 66 6f   for this platfo
3bc0: 72 6d 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  rm...      #..  
3bd0: 20 20 20 20 69 66 20 7b 5b 68 61 73 52 75 6e 74      if {[hasRunt
3be0: 69 6d 65 4f 70 74 69 6f 6e 20 6e 61 74 69 76 65  imeOption native
3bf0: 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
3c00: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
3c10: 4e 4f 54 45 3a 20 52 65 74 75 72 6e 20 74 68 65  NOTE: Return the
3c20: 20 6d 69 78 65 64 2d 6d 6f 64 65 20 61 73 73 65   mixed-mode asse
3c30: 6d 62 6c 79 20 66 69 6c 65 20 6e 61 6d 65 2e 0d  mbly file name..
3c40: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
3c50: 20 20 20 20 72 65 74 75 72 6e 20 5b 66 69 6c 65      return [file
3c60: 20 6e 61 74 69 76 65 6e 61 6d 65 20 5c 0d 0a 20   nativename \.. 
3c70: 20 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65             [file
3c80: 20 6a 6f 69 6e 20 5b 67 65 74 42 69 6e 61 72 79   join [getBinary
3c90: 44 69 72 65 63 74 6f 72 79 5d 20 53 79 73 74 65  Directory] Syste
3ca0: 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 64 6c  m.Data.SQLite.dl
3cb0: 6c 5d 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73  l]]..      } els
3cc0: 65 69 66 20 7b 24 73 74 61 6e 64 61 72 64 7d 20  eif {$standard} 
3cd0: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
3ce0: 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
3cf0: 45 3a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 61  E: Return the na
3d00: 74 69 76 65 2d 6f 6e 6c 79 20 73 74 61 6e 64 61  tive-only standa
3d10: 72 64 20 53 51 4c 69 74 65 20 6c 69 62 72 61 72  rd SQLite librar
3d20: 79 20 66 69 6c 65 20 6e 61 6d 65 2e 0d 0a 20 20  y file name...  
3d30: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
3d40: 20 72 65 74 75 72 6e 20 5b 66 69 6c 65 20 6e 61   return [file na
3d50: 74 69 76 65 6e 61 6d 65 20 5c 0d 0a 20 20 20 20  tivename \..    
3d60: 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20 6a 6f          [file jo
3d70: 69 6e 20 5b 67 65 74 42 69 6e 61 72 79 44 69 72  in [getBinaryDir
3d80: 65 63 74 6f 72 79 5d 20 73 71 6c 69 74 65 33 2e  ectory] sqlite3.
3d90: 64 6c 6c 5d 5d 0d 0a 20 20 20 20 20 20 7d 20 65  dll]]..      } e
3da0: 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  lse {..        #
3db0: 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
3dc0: 3a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 61 74  : Return the nat
3dd0: 69 76 65 2d 6f 6e 6c 79 20 69 6e 74 65 72 6f 70  ive-only interop
3de0: 20 61 73 73 65 6d 62 6c 79 20 66 69 6c 65 20 6e   assembly file n
3df0: 61 6d 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  ame...        #.
3e00: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
3e10: 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65  [file nativename
3e20: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
3e30: 5b 66 69 6c 65 20 6a 6f 69 6e 20 5b 67 65 74 42  [file join [getB
3e40: 69 6e 61 72 79 44 69 72 65 63 74 6f 72 79 5d 20  inaryDirectory] 
3e50: 53 51 4c 69 74 65 2e 49 6e 74 65 72 6f 70 2e 64  SQLite.Interop.d
3e60: 6c 6c 5d 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20  ll]]..      }.. 
3e70: 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
3e80: 63 20 67 65 74 43 6f 6d 6d 6f 6e 44 69 72 65 63  c getCommonDirec
3e90: 74 6f 72 79 20 7b 7d 20 7b 0d 0a 20 20 20 20 20  tory {} {..     
3ea0: 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
3eb0: 3a 20 54 68 69 73 20 70 72 6f 63 65 64 75 72 65  : This procedure
3ec0: 20 72 65 74 75 72 6e 73 20 74 68 65 20 64 69 72   returns the dir
3ed0: 65 63 74 6f 72 79 20 77 68 65 72 65 20 74 68 65  ectory where the
3ee0: 20 74 65 73 74 20 73 63 72 69 70 74 73 0d 0a 20   test scripts.. 
3ef0: 20 20 20 20 20 23 20 20 20 20 20 20 20 73 68 6f       #       sho
3f00: 75 6c 64 20 62 65 20 6c 6f 63 61 74 65 64 2e 20  uld be located. 
3f10: 20 42 79 20 64 65 66 61 75 6c 74 2c 20 74 68 69   By default, thi
3f20: 73 20 6a 75 73 74 20 72 65 74 75 72 6e 73 20 74  s just returns t
3f30: 68 65 20 45 61 67 6c 65 0d 0a 20 20 20 20 20 20  he Eagle..      
3f40: 23 20 20 20 20 20 20 20 62 69 6e 61 72 79 20 64  #       binary d
3f50: 69 72 65 63 74 6f 72 79 2e 0d 0a 20 20 20 20 20  irectory...     
3f60: 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69   #..      if {[i
3f70: 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 63 6f 6d  nfo exists ::com
3f80: 6d 6f 6e 5f 64 69 72 65 63 74 6f 72 79 5d 20 26  mon_directory] &
3f90: 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b  & \..          [
3fa0: 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a  string length $:
3fb0: 3a 63 6f 6d 6d 6f 6e 5f 64 69 72 65 63 74 6f 72  :common_director
3fc0: 79 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  y] > 0} then {..
3fd0: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
3fe0: 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 65 20 6c     # NOTE: The l
3ff0: 6f 63 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 63  ocation of the c
4000: 6f 6d 6d 6f 6e 20 64 69 72 65 63 74 6f 72 79 20  ommon directory 
4010: 68 61 73 20 62 65 65 6e 20 73 65 74 3b 0d 0a 20  has been set;.. 
4020: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74         #       t
4030: 68 65 72 65 66 6f 72 65 2c 20 75 73 65 20 69 74  herefore, use it
4040: 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
4050: 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 3a 3a        return $::
4060: 63 6f 6d 6d 6f 6e 5f 64 69 72 65 63 74 6f 72 79  common_directory
4070: 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 69 66  ..      } elseif
4080: 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a   {[info exists :
4090: 3a 76 65 6e 64 6f 72 5f 64 69 72 65 63 74 6f 72  :vendor_director
40a0: 79 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20  y] && \..       
40b0: 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74     [string lengt
40c0: 68 20 24 3a 3a 76 65 6e 64 6f 72 5f 64 69 72 65  h $::vendor_dire
40d0: 63 74 6f 72 79 5d 20 3e 20 30 7d 20 74 68 65 6e  ctory] > 0} then
40e0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20   {..        #.. 
40f0: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54         # NOTE: T
4100: 68 65 20 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 74  he location of t
4110: 68 65 20 76 65 6e 64 6f 72 20 64 69 72 65 63 74  he vendor direct
4120: 6f 72 79 20 68 61 73 20 62 65 65 6e 20 73 65 74  ory has been set
4130: 3b 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  ;..        #    
4140: 20 20 20 74 68 65 72 65 66 6f 72 65 2c 20 75 73     therefore, us
4150: 65 20 69 74 2e 0d 0a 20 20 20 20 20 20 20 20 23  e it...        #
4160: 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ..        return
4170: 20 24 3a 3a 76 65 6e 64 6f 72 5f 64 69 72 65 63   $::vendor_direc
4180: 74 6f 72 79 0d 0a 20 20 20 20 20 20 7d 20 65 6c  tory..      } el
4190: 73 65 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73  seif {[info exis
41a0: 74 73 20 3a 3a 74 63 6c 5f 6c 69 62 72 61 72 79  ts ::tcl_library
41b0: 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20  ] && \..        
41c0: 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68    [string length
41d0: 20 24 3a 3a 74 63 6c 5f 6c 69 62 72 61 72 79 5d   $::tcl_library]
41e0: 20 3e 20 30 20 26 26 20 5c 0d 0a 20 20 20 20 20   > 0 && \..     
41f0: 20 20 20 20 20 5b 66 69 6c 65 20 69 73 64 69 72       [file isdir
4200: 65 63 74 6f 72 79 20 24 3a 3a 74 63 6c 5f 6c 69  ectory $::tcl_li
4210: 62 72 61 72 79 5d 7d 20 74 68 65 6e 20 7b 0d 0a  brary]} then {..
4220: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
4230: 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 65 20 76     # NOTE: The v
4240: 61 72 69 61 62 6c 65 20 77 69 74 68 20 74 68 65  ariable with the
4250: 20 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 74 68 65   location of the
4260: 20 73 63 72 69 70 74 20 6c 69 62 72 61 72 79 20   script library 
4270: 69 73 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  is..        #   
4280: 20 20 20 20 73 65 74 20 61 6e 64 20 61 70 70 65      set and appe
4290: 61 72 73 20 74 6f 20 62 65 20 61 20 72 65 61 6c  ars to be a real
42a0: 20 64 69 72 65 63 74 6f 72 79 20 28 69 2e 65 2e   directory (i.e.
42b0: 20 6e 6f 74 20 65 6d 62 65 64 64 65 64 0d 0a 20   not embedded.. 
42c0: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 77         #       w
42d0: 69 74 68 69 6e 20 61 20 66 69 6c 65 29 3b 20 74  ithin a file); t
42e0: 68 65 72 65 66 6f 72 65 2c 20 75 73 65 20 69 74  herefore, use it
42f0: 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
4300: 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 3a 3a        return $::
4310: 74 63 6c 5f 6c 69 62 72 61 72 79 0d 0a 20 20 20  tcl_library..   
4320: 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
4330: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
4340: 23 20 4e 4f 54 45 3a 20 46 61 6c 6c 62 61 63 6b  # NOTE: Fallback
4350: 20 74 6f 20 74 68 65 20 64 69 72 65 63 74 6f 72   to the director
4360: 79 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  y containing the
4370: 20 65 78 65 63 75 74 61 62 6c 65 2e 0d 0a 20 20   executable...  
4380: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
4390: 20 72 65 74 75 72 6e 20 5b 69 6e 66 6f 20 62 69   return [info bi
43a0: 6e 61 72 79 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a  nary]..      }..
43b0: 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
43c0: 6f 63 20 67 65 74 44 61 74 61 62 61 73 65 44 69  oc getDatabaseDi
43d0: 72 65 63 74 6f 72 79 20 7b 7d 20 7b 0d 0a 20 20  rectory {} {..  
43e0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
43f0: 4f 54 45 3a 20 54 68 69 73 20 70 72 6f 63 65 64  OTE: This proced
4400: 75 72 65 20 72 65 74 75 72 6e 73 20 74 68 65 20  ure returns the 
4410: 64 69 72 65 63 74 6f 72 79 20 77 68 65 72 65 20  directory where 
4420: 74 68 65 20 74 65 73 74 20 64 61 74 61 62 61 73  the test databas
4430: 65 73 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  es..      #     
4440: 20 20 73 68 6f 75 6c 64 20 62 65 20 6c 6f 63 61    should be loca
4450: 74 65 64 2e 20 20 42 79 20 64 65 66 61 75 6c 74  ted.  By default
4460: 2c 20 74 68 69 73 20 6a 75 73 74 20 75 73 65 73  , this just uses
4470: 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 0d 0a   the temporary..
4480: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 64 69        #       di
4490: 72 65 63 74 6f 72 79 20 63 6f 6e 66 69 67 75 72  rectory configur
44a0: 65 64 20 66 6f 72 20 74 68 69 73 20 73 79 73 74  ed for this syst
44b0: 65 6d 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  em...      #..  
44c0: 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78      if {[info ex
44d0: 69 73 74 73 20 3a 3a 64 61 74 61 62 61 73 65 5f  ists ::database_
44e0: 64 69 72 65 63 74 6f 72 79 5d 20 26 26 20 5c 0d  directory] && \.
44f0: 0a 20 20 20 20 20 20 20 20 20 20 5b 73 74 72 69  .          [stri
4500: 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a 64 61 74  ng length $::dat
4510: 61 62 61 73 65 5f 64 69 72 65 63 74 6f 72 79 5d  abase_directory]
4520: 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20   > 0} then {..  
4530: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
4540: 20 23 20 4e 4f 54 45 3a 20 54 68 65 20 6c 6f 63   # NOTE: The loc
4550: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 64 61 74  ation of the dat
4560: 61 62 61 73 65 20 64 69 72 65 63 74 6f 72 79 20  abase directory 
4570: 68 61 73 20 62 65 65 6e 20 6f 76 65 72 72 69 64  has been overrid
4580: 64 65 6e 3b 0d 0a 20 20 20 20 20 20 20 20 23 20  den;..        # 
4590: 20 20 20 20 20 20 74 68 65 72 65 66 6f 72 65 2c        therefore,
45a0: 20 75 73 65 20 69 74 2e 0d 0a 20 20 20 20 20 20   use it...      
45b0: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74    #..        ret
45c0: 75 72 6e 20 24 3a 3a 64 61 74 61 62 61 73 65 5f  urn $::database_
45d0: 64 69 72 65 63 74 6f 72 79 0d 0a 20 20 20 20 20  directory..     
45e0: 20 7d 20 65 6c 73 65 69 66 20 7b 5b 69 6e 66 6f   } elseif {[info
45f0: 20 65 78 69 73 74 73 20 3a 3a 73 63 72 61 74 63   exists ::scratc
4600: 68 5f 64 69 72 65 63 74 6f 72 79 5d 20 26 26 20  h_directory] && 
4610: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 73 74  \..          [st
4620: 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a 73  ring length $::s
4630: 63 72 61 74 63 68 5f 64 69 72 65 63 74 6f 72 79  cratch_directory
4640: 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20  ] > 0} then {.. 
4650: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
4660: 20 20 23 20 4e 4f 54 45 3a 20 54 68 65 20 6c 6f    # NOTE: The lo
4670: 63 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 63  cation of the sc
4680: 72 61 74 63 68 20 64 69 72 65 63 74 6f 72 79 20  ratch directory 
4690: 68 61 73 20 62 65 65 6e 20 6f 76 65 72 72 69 64  has been overrid
46a0: 64 65 6e 3b 0d 0a 20 20 20 20 20 20 20 20 23 20  den;..        # 
46b0: 20 20 20 20 20 20 74 68 65 72 65 66 6f 72 65 2c        therefore,
46c0: 20 75 73 65 20 69 74 2e 0d 0a 20 20 20 20 20 20   use it...      
46d0: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74    #..        ret
46e0: 75 72 6e 20 24 3a 3a 73 63 72 61 74 63 68 5f 64  urn $::scratch_d
46f0: 69 72 65 63 74 6f 72 79 0d 0a 20 20 20 20 20 20  irectory..      
4700: 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
4710: 20 20 72 65 74 75 72 6e 20 5b 67 65 74 54 65 6d    return [getTem
4720: 70 6f 72 61 72 79 50 61 74 68 5d 0d 0a 20 20 20  poraryPath]..   
4730: 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a     }..    }.....
4740: 20 20 20 20 70 72 6f 63 20 67 65 74 54 65 6d 70      proc getTemp
4750: 6f 72 61 72 79 44 69 72 65 63 74 6f 72 79 20 7b  oraryDirectory {
4760: 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  } {..      #..  
4770: 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 69 73      # NOTE: This
4780: 20 70 72 6f 63 65 64 75 72 65 20 72 65 74 75 72   procedure retur
4790: 6e 73 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  ns the directory
47a0: 20 77 68 65 72 65 20 74 68 65 20 74 65 6d 70 6f   where the tempo
47b0: 72 61 72 79 20 66 69 6c 65 73 0d 0a 20 20 20 20  rary files..    
47c0: 20 20 23 20 20 20 20 20 20 20 73 68 6f 75 6c 64    #       should
47d0: 20 62 65 20 6c 6f 63 61 74 65 64 2e 20 20 42 79   be located.  By
47e0: 20 64 65 66 61 75 6c 74 2c 20 74 68 69 73 20 6a   default, this j
47f0: 75 73 74 20 75 73 65 73 20 74 68 65 20 74 65 6d  ust uses the tem
4800: 70 6f 72 61 72 79 0d 0a 20 20 20 20 20 20 23 20  porary..      # 
4810: 20 20 20 20 20 20 64 69 72 65 63 74 6f 72 79 20        directory 
4820: 63 6f 6e 66 69 67 75 72 65 64 20 66 6f 72 20 74  configured for t
4830: 68 69 73 20 73 79 73 74 65 6d 2e 0d 0a 20 20 20  his system...   
4840: 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
4850: 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 74  [info exists ::t
4860: 65 6d 70 6f 72 61 72 79 5f 64 69 72 65 63 74 6f  emporary_directo
4870: 72 79 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20  ry] && \..      
4880: 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67      [string leng
4890: 74 68 20 24 3a 3a 74 65 6d 70 6f 72 61 72 79 5f  th $::temporary_
48a0: 64 69 72 65 63 74 6f 72 79 5d 20 3e 20 30 7d 20  directory] > 0} 
48b0: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
48c0: 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
48d0: 45 3a 20 54 68 65 20 6c 6f 63 61 74 69 6f 6e 20  E: The location 
48e0: 6f 66 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  of the temporary
48f0: 20 64 69 72 65 63 74 6f 72 79 20 68 61 73 20 62   directory has b
4900: 65 65 6e 20 6f 76 65 72 72 69 64 64 65 6e 3b 0d  een overridden;.
4910: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
4920: 20 74 68 65 72 65 66 6f 72 65 2c 20 75 73 65 20   therefore, use 
4930: 69 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  it...        #..
4940: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 24          return $
4950: 3a 3a 74 65 6d 70 6f 72 61 72 79 5f 64 69 72 65  ::temporary_dire
4960: 63 74 6f 72 79 0d 0a 20 20 20 20 20 20 7d 20 65  ctory..      } e
4970: 6c 73 65 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69  lseif {[info exi
4980: 73 74 73 20 3a 3a 73 63 72 61 74 63 68 5f 64 69  sts ::scratch_di
4990: 72 65 63 74 6f 72 79 5d 20 26 26 20 5c 0d 0a 20  rectory] && \.. 
49a0: 20 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67           [string
49b0: 20 6c 65 6e 67 74 68 20 24 3a 3a 73 63 72 61 74   length $::scrat
49c0: 63 68 5f 64 69 72 65 63 74 6f 72 79 5d 20 3e 20  ch_directory] > 
49d0: 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
49e0: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
49f0: 4e 4f 54 45 3a 20 54 68 65 20 6c 6f 63 61 74 69  NOTE: The locati
4a00: 6f 6e 20 6f 66 20 74 68 65 20 73 63 72 61 74 63  on of the scratc
4a10: 68 20 64 69 72 65 63 74 6f 72 79 20 68 61 73 20  h directory has 
4a20: 62 65 65 6e 20 6f 76 65 72 72 69 64 64 65 6e 3b  been overridden;
4a30: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
4a40: 20 20 74 68 65 72 65 66 6f 72 65 2c 20 75 73 65    therefore, use
4a50: 20 69 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d   it...        #.
4a60: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
4a70: 24 3a 3a 73 63 72 61 74 63 68 5f 64 69 72 65 63  $::scratch_direc
4a80: 74 6f 72 79 0d 0a 20 20 20 20 20 20 7d 20 65 6c  tory..      } el
4a90: 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 72 65  se {..        re
4aa0: 74 75 72 6e 20 5b 67 65 74 54 65 6d 70 6f 72 61  turn [getTempora
4ab0: 72 79 50 61 74 68 5d 0d 0a 20 20 20 20 20 20 7d  ryPath]..      }
4ac0: 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
4ad0: 70 72 6f 63 20 67 65 74 54 65 73 74 4f 76 65 72  proc getTestOver
4ae0: 72 69 64 65 73 50 72 65 61 6d 62 6c 65 20 7b 20  ridesPreamble { 
4af0: 7b 65 78 74 72 61 56 61 72 4e 61 6d 65 73 20 22  {extraVarNames "
4b00: 22 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 73 65  "} } {..      se
4b10: 74 20 76 61 72 4e 61 6d 65 73 20 5b 6c 69 73 74  t varNames [list
4b20: 5d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  ]....      #..  
4b30: 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 66 20 61      # NOTE: If a
4b40: 76 61 69 6c 61 62 6c 65 2c 20 73 74 61 72 74 20  vailable, start 
4b50: 77 69 74 68 20 74 68 65 20 6d 61 73 74 65 72 20  with the master 
4b60: 6c 69 73 74 20 6f 66 20 74 65 73 74 20 6f 76 65  list of test ove
4b70: 72 72 69 64 65 0d 0a 20 20 20 20 20 20 23 20 20  rride..      #  
4b80: 20 20 20 20 20 76 61 72 69 61 62 6c 65 73 2e 0d       variables..
4b90: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
4ba0: 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73  if {[info exists
4bb0: 20 3a 3a 74 65 73 74 5f 6f 76 65 72 72 69 64 65   ::test_override
4bc0: 73 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20  s] && \..       
4bd0: 20 20 20 5b 6c 6c 65 6e 67 74 68 20 24 3a 3a 74     [llength $::t
4be0: 65 73 74 5f 6f 76 65 72 72 69 64 65 73 5d 20 3e  est_overrides] >
4bf0: 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
4c00: 20 20 20 20 65 76 61 6c 20 6c 61 70 70 65 6e 64      eval lappend
4c10: 20 76 61 72 4e 61 6d 65 73 20 24 3a 3a 74 65 73   varNames $::tes
4c20: 74 5f 6f 76 65 72 72 69 64 65 73 0d 0a 20 20 20  t_overrides..   
4c30: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d     }....      #.
4c40: 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49  .      # NOTE: I
4c50: 66 20 72 65 71 75 65 73 74 65 64 20 62 79 20 6f  f requested by o
4c60: 75 72 20 63 61 6c 6c 65 72 2c 20 61 64 64 20 61  ur caller, add a
4c70: 6e 79 20 61 64 64 69 74 69 6f 6e 61 6c 20 76 61  ny additional va
4c80: 72 69 61 62 6c 65 0d 0a 20 20 20 20 20 20 23 20  riable..      # 
4c90: 20 20 20 20 20 20 6e 61 6d 65 73 20 74 6f 20 63        names to c
4ca0: 6f 70 79 20 6e 6f 77 2e 0d 0a 20 20 20 20 20 20  opy now...      
4cb0: 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 6c 6c  #..      if {[ll
4cc0: 65 6e 67 74 68 20 24 65 78 74 72 61 56 61 72 4e  ength $extraVarN
4cd0: 61 6d 65 73 5d 20 3e 20 30 7d 20 74 68 65 6e 20  ames] > 0} then 
4ce0: 7b 0d 0a 20 20 20 20 20 20 20 20 65 76 61 6c 20  {..        eval 
4cf0: 6c 61 70 70 65 6e 64 20 76 61 72 4e 61 6d 65 73  lappend varNames
4d00: 20 24 65 78 74 72 61 56 61 72 4e 61 6d 65 73 0d   $extraVarNames.
4d10: 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
4d20: 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
4d30: 45 3a 20 42 75 69 6c 64 20 74 68 65 20 73 63 72  E: Build the scr
4d40: 69 70 74 20 66 72 61 67 6d 65 6e 74 20 74 6f 20  ipt fragment to 
4d50: 62 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 70  be returned by p
4d60: 72 6f 63 65 73 73 69 6e 67 20 65 61 63 68 0d 0a  rocessing each..
4d70: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 76 61        #       va
4d80: 72 69 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64 20  riable name and 
4d90: 61 64 64 69 6e 67 20 74 68 65 20 6e 65 63 65 63  adding the necec
4da0: 65 73 73 61 72 79 20 73 63 72 69 70 74 20 66 72  essary script fr
4db0: 61 67 6d 65 6e 74 73 20 66 6f 72 0d 0a 20 20 20  agments for..   
4dc0: 20 20 20 23 20 20 20 20 20 20 20 65 61 63 68 20     #       each 
4dd0: 6f 6e 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  one...      #.. 
4de0: 20 20 20 20 20 73 65 74 20 72 65 73 75 6c 74 20       set result 
4df0: 22 22 0d 0a 0d 0a 20 20 20 20 20 20 66 6f 72 65  ""....      fore
4e00: 61 63 68 20 76 61 72 4e 61 6d 65 20 24 76 61 72  ach varName $var
4e10: 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20 20  Names {..       
4e20: 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
4e30: 54 45 3a 20 42 75 69 6c 64 20 74 68 65 20 71 75  TE: Build the qu
4e40: 61 6c 69 66 69 65 64 20 67 6c 6f 62 61 6c 20 76  alified global v
4e50: 61 72 69 61 62 6c 65 20 6e 61 6d 65 2e 0d 0a 20  ariable name... 
4e60: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
4e70: 20 20 73 65 74 20 66 75 6c 6c 56 61 72 4e 61 6d    set fullVarNam
4e80: 65 20 5b 61 70 70 65 6e 64 41 72 67 73 20 3a 3a  e [appendArgs ::
4e90: 20 24 76 61 72 4e 61 6d 65 5d 0d 0a 0d 0a 20 20   $varName]....  
4ea0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
4eb0: 20 23 20 4e 4f 54 45 3a 20 44 6f 65 73 20 74 68   # NOTE: Does th
4ec0: 65 20 76 61 72 69 61 62 6c 65 20 65 78 69 73 74  e variable exist
4ed0: 20 69 6e 20 74 68 69 73 20 69 6e 74 65 72 70 72   in this interpr
4ee0: 65 74 65 72 20 63 6f 6e 74 65 78 74 3f 0d 0a 20  eter context?.. 
4ef0: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
4f00: 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73    if {[info exis
4f10: 74 73 20 24 66 75 6c 6c 56 61 72 4e 61 6d 65 5d  ts $fullVarName]
4f20: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
4f30: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
4f40: 20 23 20 4e 4f 54 45 3a 20 41 70 70 65 6e 64 20   # NOTE: Append 
4f50: 61 20 73 63 72 69 70 74 20 66 72 61 67 6d 65 6e  a script fragmen
4f60: 74 20 74 6f 20 74 68 65 20 72 65 73 75 6c 74 20  t to the result 
4f70: 74 68 61 74 20 77 69 6c 6c 20 63 6f 72 72 65 63  that will correc
4f80: 74 6c 79 0d 0a 20 20 20 20 20 20 20 20 20 20 23  tly..          #
4f90: 20 20 20 20 20 20 20 63 6f 70 79 20 61 6e 79 20         copy any 
4fa0: 63 6f 6e 74 61 69 6e 65 64 20 76 61 6c 75 65 20  contained value 
4fb0: 74 6f 20 61 6e 6f 74 68 65 72 20 69 6e 74 65 72  to another inter
4fc0: 70 72 65 74 65 72 20 63 6f 6e 74 65 78 74 2e 0d  preter context..
4fd0: 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
4fe0: 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 20 72          append r
4ff0: 65 73 75 6c 74 20 5c 6e 20 22 73 65 74 20 22 20  esult \n "set " 
5000: 24 66 75 6c 6c 56 61 72 4e 61 6d 65 20 22 20 5c  $fullVarName " \
5010: 7b 22 20 5b 73 65 74 20 24 66 75 6c 6c 56 61 72  {" [set $fullVar
5020: 4e 61 6d 65 5d 20 5c 7d 0d 0a 20 20 20 20 20 20  Name] \}..      
5030: 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a    }..      }....
5040: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
5050: 20 4e 4f 54 45 3a 20 49 66 20 74 68 65 20 72 65   NOTE: If the re
5060: 73 75 6c 74 20 63 6f 6e 74 61 69 6e 73 20 6f 6e  sult contains on
5070: 65 20 6f 72 20 6d 6f 72 65 20 73 63 72 69 70 74  e or more script
5080: 20 66 72 61 67 6d 65 6e 74 73 2c 20 61 70 70 65   fragments, appe
5090: 6e 64 20 61 0d 0a 20 20 20 20 20 20 23 20 20 20  nd a..      #   
50a0: 20 20 20 20 6e 65 77 6c 69 6e 65 2e 0d 0a 20 20      newline...  
50b0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20      #..      if 
50c0: 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20  {[string length 
50d0: 24 72 65 73 75 6c 74 5d 20 3e 20 30 7d 20 74 68  $result] > 0} th
50e0: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 61 70  en {..        ap
50f0: 70 65 6e 64 20 72 65 73 75 6c 74 20 5c 6e 0d 0a  pend result \n..
5100: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
5110: 20 72 65 74 75 72 6e 20 24 72 65 73 75 6c 74 0d   return $result.
5120: 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70  .    }.....    p
5130: 72 6f 63 20 67 65 74 41 70 70 44 6f 6d 61 69 6e  roc getAppDomain
5140: 50 72 65 61 6d 62 6c 65 20 7b 20 7b 70 72 65 66  Preamble { {pref
5150: 69 78 20 22 22 7d 20 7b 73 75 66 66 69 78 20 22  ix ""} {suffix "
5160: 22 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d  "} } {..      #.
5170: 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54  .      # NOTE: T
5180: 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 72 65  his procedure re
5190: 74 75 72 6e 73 20 61 20 74 65 73 74 20 73 65 74  turns a test set
51a0: 75 70 20 73 63 72 69 70 74 20 66 72 61 67 6d 65  up script fragme
51b0: 6e 74 20 73 75 69 74 61 62 6c 65 20 66 6f 72 0d  nt suitable for.
51c0: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 65  .      #       e
51d0: 76 61 6c 75 61 74 69 6f 6e 20 62 79 20 61 6e 20  valuation by an 
51e0: 69 6e 74 65 72 70 72 65 74 65 72 20 63 72 65 61  interpreter crea
51f0: 74 65 64 20 69 6e 20 61 6e 20 69 73 6f 6c 61 74  ted in an isolat
5200: 65 64 20 61 70 70 6c 69 63 61 74 69 6f 6e 0d 0a  ed application..
5210: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 64 6f        #       do
5220: 6d 61 69 6e 2e 20 20 54 68 65 20 73 63 72 69 70  main.  The scrip
5230: 74 20 66 72 61 67 6d 65 6e 74 20 62 65 69 6e 67  t fragment being
5240: 20 72 65 74 75 72 6e 65 64 20 77 69 6c 6c 20 62   returned will b
5250: 65 20 73 75 72 72 6f 75 6e 64 65 64 20 62 79 0d  e surrounded by.
5260: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74  .      #       t
5270: 68 65 20 70 72 65 66 69 78 20 61 6e 64 20 73 75  he prefix and su
5280: 66 66 69 78 20 22 73 63 72 69 70 74 20 66 72 61  ffix "script fra
5290: 67 6d 65 6e 74 73 22 20 73 70 65 63 69 66 69 65  gments" specifie
52a0: 64 20 62 79 20 6f 75 72 20 63 61 6c 6c 65 72 2c  d by our caller,
52b0: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
52c0: 69 66 20 61 6e 79 2e 20 20 54 68 65 20 65 6e 74  if any.  The ent
52d0: 69 72 65 20 73 63 72 69 70 74 20 62 65 69 6e 67  ire script being
52e0: 20 72 65 74 75 72 6e 65 64 20 77 69 6c 6c 20 62   returned will b
52f0: 65 20 73 75 62 73 74 69 74 75 74 65 64 20 76 69  e substituted vi
5300: 61 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  a..      #      
5310: 20 5b 73 75 62 73 74 5d 2c 20 69 6e 20 74 68 65   [subst], in the
5320: 20 63 6f 6e 74 65 78 74 20 6f 66 20 6f 75 72 20   context of our 
5330: 63 61 6c 6c 65 72 2c 20 62 65 66 6f 72 65 20 62  caller, before b
5340: 65 69 6e 67 20 72 65 74 75 72 6e 65 64 2e 0d 0a  eing returned...
5350: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 54 68        #       Th
5360: 69 73 20 73 74 65 70 20 69 73 20 6e 65 63 65 73  is step is neces
5370: 73 61 72 79 20 73 6f 20 74 68 61 74 20 73 6f 6d  sary so that som
5380: 65 20 6c 69 6d 69 74 65 64 20 63 6f 6e 74 65 78  e limited contex
5390: 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2c 0d 0a  t information,..
53a0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 70 72        #       pr
53b0: 69 6d 61 72 69 6c 79 20 72 65 6c 61 74 65 64 20  imarily related 
53c0: 74 6f 20 74 68 65 20 74 65 73 74 69 6e 67 20 64  to the testing d
53d0: 69 72 65 63 74 6f 72 69 65 73 2c 20 63 61 6e 20  irectories, can 
53e0: 62 65 20 74 72 61 6e 73 66 65 72 72 65 64 0d 0a  be transferred..
53f0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74 6f        #       to
5400: 20 74 68 65 20 69 6e 74 65 72 70 72 65 74 65 72   the interpreter
5410: 20 69 6e 20 74 68 65 20 69 73 6f 6c 61 74 65 64   in the isolated
5420: 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 64 6f 6d   application dom
5430: 61 69 6e 2c 20 6d 61 6b 69 6e 67 20 69 74 0d 0a  ain, making it..
5440: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 61 62        #       ab
5450: 6c 65 20 74 6f 20 73 75 63 63 65 73 73 66 75 6c  le to successful
5460: 6c 79 20 72 75 6e 20 74 65 73 74 73 20 74 68 61  ly run tests tha
5470: 74 20 72 65 71 75 69 72 65 20 6f 6e 65 20 6f 72  t require one or
5480: 20 6d 6f 72 65 20 6f 66 20 74 68 65 0d 0a 20 20   more of the..  
5490: 20 20 20 20 23 20 20 20 20 20 20 20 66 69 6c 65      #       file
54a0: 73 20 69 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20  s in one of the 
54b0: 74 65 73 74 69 6e 67 20 64 69 72 65 63 74 6f 72  testing director
54c0: 69 65 73 2e 20 20 43 61 6c 6c 65 72 73 20 73 68  ies.  Callers sh
54d0: 6f 75 6c 64 20 6b 65 65 70 20 69 6e 0d 0a 20 20  ould keep in..  
54e0: 20 20 20 20 23 20 20 20 20 20 20 20 6d 69 6e 64      #       mind
54f0: 20 74 68 61 74 20 74 68 65 20 74 65 73 74 20 73   that the test s
5500: 63 72 69 70 74 20 66 72 61 67 6d 65 6e 74 20 62  cript fragment b
5510: 65 69 6e 67 20 72 65 74 75 72 6e 65 64 20 63 61  eing returned ca
5520: 6e 6e 6f 74 20 72 65 6c 79 20 6f 6e 0d 0a 20 20  nnot rely on..  
5530: 20 20 20 20 23 20 20 20 20 20 20 20 61 6e 79 20      #       any 
5540: 73 63 72 69 70 74 20 6c 69 62 72 61 72 79 20 70  script library p
5550: 72 6f 63 65 64 75 72 65 73 20 74 68 61 74 20 61  rocedures that a
5560: 72 65 20 6e 6f 74 20 70 72 6f 76 69 64 65 64 20  re not provided 
5570: 62 79 20 74 68 65 20 45 61 67 6c 65 0d 0a 20 20  by the Eagle..  
5580: 20 20 20 20 23 20 20 20 20 20 20 20 6c 69 62 72      #       libr
5590: 61 72 79 20 70 61 63 6b 61 67 65 20 28 69 2e 65  ary package (i.e
55a0: 2e 20 22 69 6e 69 74 2e 65 61 67 6c 65 22 29 2c  . "init.eagle"),
55b0: 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 6f 73 65   including those
55c0: 20 70 72 6f 76 69 64 65 64 20 62 79 0d 0a 20 20   provided by..  
55d0: 20 20 20 20 23 20 20 20 20 20 20 20 74 68 65 20      #       the 
55e0: 45 61 67 6c 65 20 74 65 73 74 20 70 61 63 6b 61  Eagle test packa
55f0: 67 65 2c 20 75 6e 6c 65 73 73 20 74 68 65 20 66  ge, unless the f
5600: 69 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ile containing t
5610: 68 65 6d 20 69 73 20 6c 6f 61 64 65 64 0d 0a 20  hem is loaded.. 
5620: 20 20 20 20 20 23 20 20 20 20 20 20 20 6d 61 6e       #       man
5630: 75 61 6c 6c 79 20 76 69 61 20 73 6f 6d 65 20 6f  ually via some o
5640: 74 68 65 72 20 6d 65 63 68 61 6e 69 73 6d 20 28  ther mechanism (
5650: 65 2e 67 2e 20 62 79 20 69 6e 63 6c 75 64 69 6e  e.g. by includin
5660: 67 20 61 70 70 72 6f 70 72 69 61 74 65 0d 0a 20  g appropriate.. 
5670: 20 20 20 20 20 23 20 20 20 20 20 20 20 5b 70 61       #       [pa
5680: 63 6b 61 67 65 20 72 65 71 75 69 72 65 5d 20 6f  ckage require] o
5690: 72 20 5b 73 6f 75 72 63 65 5d 20 63 6f 6d 6d 61  r [source] comma
56a0: 6e 64 73 20 69 6e 20 74 68 65 20 70 72 65 66 69  nds in the prefi
56b0: 78 20 6f 72 20 73 75 66 66 69 78 0d 0a 20 20 20  x or suffix..   
56c0: 20 20 20 23 20 20 20 20 20 20 20 73 63 72 69 70     #       scrip
56d0: 74 20 66 72 61 67 6d 65 6e 74 73 29 2e 20 20 41  t fragments).  A
56e0: 6c 73 6f 2c 20 61 6c 6c 20 76 61 72 69 61 62 6c  lso, all variabl
56f0: 65 20 72 65 66 65 72 65 6e 63 65 73 20 61 6e 64  e references and
5700: 20 61 6c 6c 20 6e 65 73 74 65 64 0d 0a 20 20 20   all nested..   
5710: 20 20 20 23 20 20 20 20 20 20 20 63 6f 6d 6d 61     #       comma
5720: 6e 64 73 20 28 69 2e 65 2e 20 74 68 6f 73 65 20  nds (i.e. those 
5730: 69 6e 20 73 71 75 61 72 65 20 62 72 61 63 6b 65  in square bracke
5740: 74 73 29 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e  ts) contained in
5750: 20 74 68 65 20 66 69 6e 61 6c 0d 0a 20 20 20 20   the final..    
5760: 20 20 23 20 20 20 20 20 20 20 73 63 72 69 70 74    #       script
5770: 20 66 72 61 67 6d 65 6e 74 20 77 69 6c 6c 20 65   fragment will e
5780: 6e 64 20 75 70 20 62 65 69 6e 67 20 65 76 61 6c  nd up being eval
5790: 75 61 74 65 64 20 69 6e 20 74 68 65 20 63 6f 6e  uated in the con
57a0: 74 65 78 74 20 6f 66 20 74 68 65 0d 0a 20 20 20  text of the..   
57b0: 20 20 20 23 20 20 20 20 20 20 20 63 61 6c 6c 69     #       calli
57c0: 6e 67 20 69 6e 74 65 72 70 72 65 74 65 72 20 61  ng interpreter a
57d0: 6e 64 20 6e 6f 74 20 74 68 65 20 74 61 72 67 65  nd not the targe
57e0: 74 20 69 6e 74 65 72 70 72 65 74 65 72 20 63 72  t interpreter cr
57f0: 65 61 74 65 64 20 69 6e 20 74 68 65 0d 0a 20 20  eated in the..  
5800: 20 20 20 20 23 20 20 20 20 20 20 20 69 73 6f 6c      #       isol
5810: 61 74 65 64 20 61 70 70 6c 69 63 61 74 69 6f 6e  ated application
5820: 20 64 6f 6d 61 69 6e 20 75 6e 6c 65 73 73 20 74   domain unless t
5830: 68 65 20 64 6f 6c 6c 61 72 20 73 69 67 6e 73 20  he dollar signs 
5840: 61 6e 64 2f 6f 72 20 73 71 75 61 72 65 0d 0a 20  and/or square.. 
5850: 20 20 20 20 20 23 20 20 20 20 20 20 20 62 72 61       #       bra
5860: 63 6b 65 74 73 20 61 72 65 20 73 70 65 63 69 61  ckets are specia
5870: 6c 6c 79 20 71 75 6f 74 65 64 20 77 69 74 68 20  lly quoted with 
5880: 62 61 63 6b 73 6c 61 73 68 65 73 2e 0d 0a 20 20  backslashes...  
5890: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 72 65 74      #..      ret
58a0: 75 72 6e 20 5b 75 70 6c 65 76 65 6c 20 31 20 5b  urn [uplevel 1 [
58b0: 6c 69 73 74 20 73 75 62 73 74 20 5b 61 70 70 65  list subst [appe
58c0: 6e 64 41 72 67 73 20 24 70 72 65 66 69 78 20 7b  ndArgs $prefix {
58d0: 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 68  ..        if {[h
58e0: 61 73 52 75 6e 74 69 6d 65 4f 70 74 69 6f 6e 20  asRuntimeOption 
58f0: 6e 61 74 69 76 65 5d 7d 20 74 68 65 6e 20 7b 0d  native]} then {.
5900: 0a 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63  .          objec
5910: 74 20 69 6e 76 6f 6b 65 20 49 6e 74 65 72 70 72  t invoke Interpr
5920: 65 74 65 72 2e 47 65 74 41 63 74 69 76 65 20 41  eter.GetActive A
5930: 64 64 52 75 6e 74 69 6d 65 4f 70 74 69 6f 6e 20  ddRuntimeOption 
5940: 6e 61 74 69 76 65 0d 0a 20 20 20 20 20 20 20 20  native..        
5950: 7d 0d 0a 20 20 20 20 20 20 7d 20 5b 67 65 74 54  }..      } [getT
5960: 65 73 74 4f 76 65 72 72 69 64 65 73 50 72 65 61  estOverridesPrea
5970: 6d 62 6c 65 20 5b 6c 69 73 74 20 70 61 74 68 20  mble [list path 
5980: 74 65 73 74 5f 63 68 61 6e 6e 65 6c 5d 5d 20 24  test_channel]] $
5990: 73 75 66 66 69 78 5d 5d 5d 0d 0a 20 20 20 20 7d  suffix]]]..    }
59a0: 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 74 72  .....    proc tr
59b0: 79 43 6f 70 79 42 69 6e 61 72 79 46 69 6c 65 20  yCopyBinaryFile 
59c0: 7b 20 66 69 6c 65 4e 61 6d 65 20 7b 6e 65 77 46  { fileName {newF
59d0: 69 6c 65 4e 61 6d 65 20 22 22 7d 20 7d 20 7b 0d  ileName ""} } {.
59e0: 0a 20 20 20 20 20 20 73 65 74 20 73 6f 75 72 63  .      set sourc
59f0: 65 46 69 6c 65 4e 61 6d 65 20 5b 67 65 74 42 69  eFileName [getBi
5a00: 6e 61 72 79 46 69 6c 65 4e 61 6d 65 20 24 66 69  naryFileName $fi
5a10: 6c 65 4e 61 6d 65 5d 0d 0a 0d 0a 20 20 20 20 20  leName]....     
5a20: 20 69 66 20 7b 21 5b 66 69 6c 65 20 65 78 69 73   if {![file exis
5a30: 74 73 20 24 73 6f 75 72 63 65 46 69 6c 65 4e 61  ts $sourceFileNa
5a40: 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  me]} then {..   
5a50: 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
5a60: 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
5a70: 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
5a80: 20 20 20 20 20 20 22 2d 2d 2d 2d 20 73 6b 69 70        "---- skip
5a90: 70 65 64 20 63 6f 70 79 69 6e 67 20 62 69 6e 61  ped copying bina
5aa0: 72 79 20 66 69 6c 65 20 5c 22 22 20 24 73 6f 75  ry file \"" $sou
5ab0: 72 63 65 46 69 6c 65 4e 61 6d 65 20 5c 0d 0a 20  rceFileName \.. 
5ac0: 20 20 20 20 20 20 20 20 20 20 20 22 5c 22 2c 20             "\", 
5ad0: 69 74 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73  it does not exis
5ae0: 74 5c 6e 22 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  t\n"]....       
5af0: 20 72 65 74 75 72 6e 0d 0a 20 20 20 20 20 20 7d   return..      }
5b00: 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 73  ....      if {[s
5b10: 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 6e 65  tring length $ne
5b20: 77 46 69 6c 65 4e 61 6d 65 5d 20 3e 20 30 7d 20  wFileName] > 0} 
5b30: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
5b40: 73 65 74 20 74 61 72 67 65 74 46 69 6c 65 4e 61  set targetFileNa
5b50: 6d 65 20 5b 67 65 74 42 75 69 6c 64 46 69 6c 65  me [getBuildFile
5b60: 4e 61 6d 65 20 24 6e 65 77 46 69 6c 65 4e 61 6d  Name $newFileNam
5b70: 65 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65  e]..      } else
5b80: 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20   {..        set 
5b90: 74 61 72 67 65 74 46 69 6c 65 4e 61 6d 65 20 5b  targetFileName [
5ba0: 67 65 74 42 75 69 6c 64 46 69 6c 65 4e 61 6d 65  getBuildFileName
5bb0: 20 24 66 69 6c 65 4e 61 6d 65 5d 0d 0a 20 20 20   $fileName]..   
5bc0: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 69 66     }....      if
5bd0: 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20   {[catch {..    
5be0: 20 20 20 20 20 20 20 20 20 20 66 69 6c 65 20 63            file c
5bf0: 6f 70 79 20 2d 66 6f 72 63 65 20 24 73 6f 75 72  opy -force $sour
5c00: 63 65 46 69 6c 65 4e 61 6d 65 20 24 74 61 72 67  ceFileName $targ
5c10: 65 74 46 69 6c 65 4e 61 6d 65 7d 5d 20 3d 3d 20  etFileName}] == 
5c20: 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
5c30: 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
5c40: 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  _channel [append
5c50: 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
5c60: 20 20 20 20 22 2d 2d 2d 2d 20 63 6f 70 69 65 64      "---- copied
5c70: 20 62 69 6e 61 72 79 20 66 69 6c 65 20 66 72 6f   binary file fro
5c80: 6d 20 5c 22 22 20 24 73 6f 75 72 63 65 46 69 6c  m \"" $sourceFil
5c90: 65 4e 61 6d 65 20 22 5c 22 20 74 6f 20 5c 22 22  eName "\" to \""
5ca0: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
5cb0: 24 74 61 72 67 65 74 46 69 6c 65 4e 61 6d 65 20  $targetFileName 
5cc0: 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d 20 65  \"\n]..      } e
5cd0: 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 74  lse {..        t
5ce0: 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
5cf0: 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
5d00: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
5d10: 22 2d 2d 2d 2d 20 66 61 69 6c 65 64 20 74 6f 20  "---- failed to 
5d20: 63 6f 70 79 20 62 69 6e 61 72 79 20 66 69 6c 65  copy binary file
5d30: 20 66 72 6f 6d 20 5c 22 22 20 24 73 6f 75 72 63   from \"" $sourc
5d40: 65 46 69 6c 65 4e 61 6d 65 20 5c 0d 0a 20 20 20  eFileName \..   
5d50: 20 20 20 20 20 20 20 20 20 22 5c 22 20 74 6f 20           "\" to 
5d60: 5c 22 22 20 24 74 61 72 67 65 74 46 69 6c 65 4e  \"" $targetFileN
5d70: 61 6d 65 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20  ame \"\n]..     
5d80: 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20   }..    }.....  
5d90: 20 20 70 72 6f 63 20 74 72 79 43 6f 70 79 42 75    proc tryCopyBu
5da0: 69 6c 64 46 69 6c 65 20 7b 20 66 69 6c 65 4e 61  ildFile { fileNa
5db0: 6d 65 20 7b 6e 65 77 46 69 6c 65 4e 61 6d 65 20  me {newFileName 
5dc0: 22 22 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 73  ""} } {..      s
5dd0: 65 74 20 73 6f 75 72 63 65 46 69 6c 65 4e 61 6d  et sourceFileNam
5de0: 65 20 5b 67 65 74 42 75 69 6c 64 46 69 6c 65 4e  e [getBuildFileN
5df0: 61 6d 65 20 24 66 69 6c 65 4e 61 6d 65 5d 0d 0a  ame $fileName]..
5e00: 0d 0a 20 20 20 20 20 20 69 66 20 7b 21 5b 66 69  ..      if {![fi
5e10: 6c 65 20 65 78 69 73 74 73 20 24 73 6f 75 72 63  le exists $sourc
5e20: 65 46 69 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e  eFileName]} then
5e30: 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74   {..        tput
5e40: 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
5e50: 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
5e60: 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d  .            "--
5e70: 2d 2d 20 73 6b 69 70 70 65 64 20 63 6f 70 79 69  -- skipped copyi
5e80: 6e 67 20 62 75 69 6c 64 20 66 69 6c 65 20 5c 22  ng build file \"
5e90: 22 20 24 73 6f 75 72 63 65 46 69 6c 65 4e 61 6d  " $sourceFileNam
5ea0: 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e \..           
5eb0: 20 22 5c 22 2c 20 69 74 20 64 6f 65 73 20 6e 6f   "\", it does no
5ec0: 74 20 65 78 69 73 74 5c 6e 22 5d 0d 0a 0d 0a 20  t exist\n"].... 
5ed0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 0d 0a 20         return.. 
5ee0: 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
5ef0: 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67  if {[string leng
5f00: 74 68 20 24 6e 65 77 46 69 6c 65 4e 61 6d 65 5d  th $newFileName]
5f10: 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20   > 0} then {..  
5f20: 20 20 20 20 20 20 73 65 74 20 74 61 72 67 65 74        set target
5f30: 46 69 6c 65 4e 61 6d 65 20 5b 67 65 74 42 69 6e  FileName [getBin
5f40: 61 72 79 46 69 6c 65 4e 61 6d 65 20 24 6e 65 77  aryFileName $new
5f50: 46 69 6c 65 4e 61 6d 65 5d 0d 0a 20 20 20 20 20  FileName]..     
5f60: 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
5f70: 20 20 20 73 65 74 20 74 61 72 67 65 74 46 69 6c     set targetFil
5f80: 65 4e 61 6d 65 20 5b 67 65 74 42 69 6e 61 72 79  eName [getBinary
5f90: 46 69 6c 65 4e 61 6d 65 20 24 66 69 6c 65 4e 61  FileName $fileNa
5fa0: 6d 65 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a  me]..      }....
5fb0: 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68        if {[catch
5fc0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
5fd0: 20 20 66 69 6c 65 20 63 6f 70 79 20 2d 66 6f 72    file copy -for
5fe0: 63 65 20 24 73 6f 75 72 63 65 46 69 6c 65 4e 61  ce $sourceFileNa
5ff0: 6d 65 20 24 74 61 72 67 65 74 46 69 6c 65 4e 61  me $targetFileNa
6000: 6d 65 7d 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20  me}] == 0} then 
6010: 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73  {..        tputs
6020: 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
6030: 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
6040: 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
6050: 2d 20 63 6f 70 69 65 64 20 62 75 69 6c 64 20 66  - copied build f
6060: 69 6c 65 20 66 72 6f 6d 20 5c 22 22 20 24 73 6f  ile from \"" $so
6070: 75 72 63 65 46 69 6c 65 4e 61 6d 65 20 22 5c 22  urceFileName "\"
6080: 20 74 6f 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20   to \"" \..     
6090: 20 20 20 20 20 20 20 24 74 61 72 67 65 74 46 69         $targetFi
60a0: 6c 65 4e 61 6d 65 20 5c 22 5c 6e 5d 0d 0a 20 20  leName \"\n]..  
60b0: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
60c0: 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
60d0: 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70  est_channel [app
60e0: 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
60f0: 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 66 61 69         "---- fai
6100: 6c 65 64 20 74 6f 20 63 6f 70 79 20 62 75 69 6c  led to copy buil
6110: 64 20 66 69 6c 65 20 66 72 6f 6d 20 5c 22 22 20  d file from \"" 
6120: 24 73 6f 75 72 63 65 46 69 6c 65 4e 61 6d 65 20  $sourceFileName 
6130: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22  \..            "
6140: 5c 22 20 74 6f 20 5c 22 22 20 24 74 61 72 67 65  \" to \"" $targe
6150: 74 46 69 6c 65 4e 61 6d 65 20 5c 22 5c 6e 5d 0d  tFileName \"\n].
6160: 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d  .      }..    }.
6170: 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 74 72 79  ....    proc try
6180: 44 65 6c 65 74 65 42 69 6e 61 72 79 46 69 6c 65  DeleteBinaryFile
6190: 20 7b 20 66 69 6c 65 4e 61 6d 65 20 7d 20 7b 0d   { fileName } {.
61a0: 0a 20 20 20 20 20 20 73 65 74 20 66 69 6c 65 4e  .      set fileN
61b0: 61 6d 65 20 5b 67 65 74 42 69 6e 61 72 79 46 69  ame [getBinaryFi
61c0: 6c 65 4e 61 6d 65 20 24 66 69 6c 65 4e 61 6d 65  leName $fileName
61d0: 5d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 21  ]....      if {!
61e0: 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24 66 69  [file exists $fi
61f0: 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d  leName]} then {.
6200: 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24  .        tputs $
6210: 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b  ::test_channel [
6220: 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
6230: 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
6240: 73 6b 69 70 70 65 64 20 64 65 6c 65 74 69 6e 67  skipped deleting
6250: 20 62 69 6e 61 72 79 20 66 69 6c 65 20 5c 22 22   binary file \""
6260: 20 24 66 69 6c 65 4e 61 6d 65 20 5c 0d 0a 20 20   $fileName \..  
6270: 20 20 20 20 20 20 20 20 20 20 22 5c 22 2c 20 69            "\", i
6280: 74 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74  t does not exist
6290: 5c 6e 22 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  \n"]....        
62a0: 72 65 74 75 72 6e 0d 0a 20 20 20 20 20 20 7d 0d  return..      }.
62b0: 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 63 61  ...      if {[ca
62c0: 74 63 68 20 7b 66 69 6c 65 20 64 65 6c 65 74 65  tch {file delete
62d0: 20 24 66 69 6c 65 4e 61 6d 65 7d 5d 20 3d 3d 20   $fileName}] == 
62e0: 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
62f0: 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
6300: 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  _channel [append
6310: 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
6320: 20 20 20 20 22 2d 2d 2d 2d 20 64 65 6c 65 74 65      "---- delete
6330: 64 20 62 69 6e 61 72 79 20 66 69 6c 65 20 5c 22  d binary file \"
6340: 22 20 24 66 69 6c 65 4e 61 6d 65 20 5c 22 5c 6e  " $fileName \"\n
6350: 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20  ]..      } else 
6360: 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73  {..        tputs
6370: 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
6380: 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
6390: 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
63a0: 2d 20 66 61 69 6c 65 64 20 74 6f 20 64 65 6c 65  - failed to dele
63b0: 74 65 20 62 69 6e 61 72 79 20 66 69 6c 65 20 5c  te binary file \
63c0: 22 22 20 24 66 69 6c 65 4e 61 6d 65 20 5c 22 5c  "" $fileName \"\
63d0: 6e 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20  n]..      }..   
63e0: 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
63f0: 74 72 79 44 65 6c 65 74 65 42 75 69 6c 64 46 69  tryDeleteBuildFi
6400: 6c 65 20 7b 20 66 69 6c 65 4e 61 6d 65 20 7d 20  le { fileName } 
6410: 7b 0d 0a 20 20 20 20 20 20 73 65 74 20 66 69 6c  {..      set fil
6420: 65 4e 61 6d 65 20 5b 67 65 74 42 75 69 6c 64 46  eName [getBuildF
6430: 69 6c 65 4e 61 6d 65 20 24 66 69 6c 65 4e 61 6d  ileName $fileNam
6440: 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b  e]....      if {
6450: 21 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24 66  ![file exists $f
6460: 69 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b  ileName]} then {
6470: 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20  ..        tputs 
6480: 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
6490: 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
64a0: 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
64b0: 20 73 6b 69 70 70 65 64 20 64 65 6c 65 74 69 6e   skipped deletin
64c0: 67 20 62 75 69 6c 64 20 66 69 6c 65 20 5c 22 22  g build file \""
64d0: 20 24 66 69 6c 65 4e 61 6d 65 20 5c 0d 0a 20 20   $fileName \..  
64e0: 20 20 20 20 20 20 20 20 20 20 22 5c 22 2c 20 69            "\", i
64f0: 74 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74  t does not exist
6500: 5c 6e 22 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  \n"]....        
6510: 72 65 74 75 72 6e 0d 0a 20 20 20 20 20 20 7d 0d  return..      }.
6520: 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 63 61  ...      if {[ca
6530: 74 63 68 20 7b 66 69 6c 65 20 64 65 6c 65 74 65  tch {file delete
6540: 20 24 66 69 6c 65 4e 61 6d 65 7d 5d 20 3d 3d 20   $fileName}] == 
6550: 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
6560: 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
6570: 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  _channel [append
6580: 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
6590: 20 20 20 20 22 2d 2d 2d 2d 20 64 65 6c 65 74 65      "---- delete
65a0: 64 20 62 75 69 6c 64 20 66 69 6c 65 20 5c 22 22  d build file \""
65b0: 20 24 66 69 6c 65 4e 61 6d 65 20 5c 22 5c 6e 5d   $fileName \"\n]
65c0: 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b  ..      } else {
65d0: 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20  ..        tputs 
65e0: 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
65f0: 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
6600: 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
6610: 20 66 61 69 6c 65 64 20 74 6f 20 64 65 6c 65 74   failed to delet
6620: 65 20 62 75 69 6c 64 20 66 69 6c 65 20 5c 22 22  e build file \""
6630: 20 24 66 69 6c 65 4e 61 6d 65 20 5c 22 5c 6e 5d   $fileName \"\n]
6640: 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d  ..      }..    }
6650: 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 74 72  .....    proc tr
6660: 79 43 6f 70 79 41 73 73 65 6d 62 6c 79 20 7b 20  yCopyAssembly { 
6670: 66 69 6c 65 4e 61 6d 65 20 7b 70 64 62 20 74 72  fileName {pdb tr
6680: 75 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 74  ue} } {..      t
6690: 72 79 43 6f 70 79 42 75 69 6c 64 46 69 6c 65 20  ryCopyBuildFile 
66a0: 24 66 69 6c 65 4e 61 6d 65 0d 0a 0d 0a 20 20 20  $fileName....   
66b0: 20 20 20 69 66 20 7b 24 70 64 62 7d 20 74 68 65     if {$pdb} the
66c0: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 72 79  n {..        try
66d0: 43 6f 70 79 42 75 69 6c 64 46 69 6c 65 20 5b 61  CopyBuildFile [a
66e0: 70 70 65 6e 64 41 72 67 73 20 5b 66 69 6c 65 20  ppendArgs [file 
66f0: 72 6f 6f 74 6e 61 6d 65 20 24 66 69 6c 65 4e 61  rootname $fileNa
6700: 6d 65 5d 20 2e 70 64 62 5d 0d 0a 20 20 20 20 20  me] .pdb]..     
6710: 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20   }..    }.....  
6720: 20 20 70 72 6f 63 20 74 72 79 44 65 6c 65 74 65    proc tryDelete
6730: 41 73 73 65 6d 62 6c 79 20 7b 20 66 69 6c 65 4e  Assembly { fileN
6740: 61 6d 65 20 7b 70 64 62 20 74 72 75 65 7d 20 7d  ame {pdb true} }
6750: 20 7b 0d 0a 20 20 20 20 20 20 74 72 79 44 65 6c   {..      tryDel
6760: 65 74 65 42 69 6e 61 72 79 46 69 6c 65 20 24 66  eteBinaryFile $f
6770: 69 6c 65 4e 61 6d 65 0d 0a 0d 0a 20 20 20 20 20  ileName....     
6780: 20 69 66 20 7b 24 70 64 62 7d 20 74 68 65 6e 20   if {$pdb} then 
6790: 7b 0d 0a 20 20 20 20 20 20 20 20 74 72 79 44 65  {..        tryDe
67a0: 6c 65 74 65 42 69 6e 61 72 79 46 69 6c 65 20 5b  leteBinaryFile [
67b0: 61 70 70 65 6e 64 41 72 67 73 20 5b 66 69 6c 65  appendArgs [file
67c0: 20 72 6f 6f 74 6e 61 6d 65 20 24 66 69 6c 65 4e   rootname $fileN
67d0: 61 6d 65 5d 20 2e 70 64 62 5d 0d 0a 20 20 20 20  ame] .pdb]..    
67e0: 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20    }..    }..... 
67f0: 20 20 20 70 72 6f 63 20 74 72 79 4c 6f 61 64 41     proc tryLoadA
6800: 73 73 65 6d 62 6c 79 20 7b 20 66 69 6c 65 4e 61  ssembly { fileNa
6810: 6d 65 20 7d 20 7b 0d 0a 20 20 20 20 20 20 73 65  me } {..      se
6820: 74 20 66 69 6c 65 4e 61 6d 65 20 5b 67 65 74 42  t fileName [getB
6830: 69 6e 61 72 79 46 69 6c 65 4e 61 6d 65 20 24 66  inaryFileName $f
6840: 69 6c 65 4e 61 6d 65 5d 0d 0a 0d 0a 20 20 20 20  ileName]....    
6850: 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 73 65    if {[catch {se
6860: 74 20 61 73 73 65 6d 62 6c 79 20 5c 0d 0a 20 20  t assembly \..  
6870: 20 20 20 20 20 20 20 20 20 20 20 20 5b 6f 62 6a              [obj
6880: 65 63 74 20 6c 6f 61 64 20 2d 6c 6f 61 64 74 79  ect load -loadty
6890: 70 65 20 46 69 6c 65 20 2d 61 6c 69 61 73 20 24  pe File -alias $
68a0: 66 69 6c 65 4e 61 6d 65 5d 7d 5d 20 3d 3d 20 30  fileName]}] == 0
68b0: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
68c0: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
68d0: 4f 54 45 3a 20 4e 6f 77 2c 20 61 64 64 20 74 68  OTE: Now, add th
68e0: 65 20 6e 65 63 65 73 73 61 72 79 20 74 65 73 74  e necessary test
68f0: 20 63 6f 6e 73 74 72 61 69 6e 74 2e 0d 0a 20 20   constraint...  
6900: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
6910: 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 5b   addConstraint [
6920: 66 69 6c 65 20 72 6f 6f 74 6e 61 6d 65 20 5b 66  file rootname [f
6930: 69 6c 65 20 74 61 69 6c 20 24 66 69 6c 65 4e 61  ile tail $fileNa
6940: 6d 65 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  me]]....        
6950: 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
6960: 45 3a 20 47 72 61 62 20 74 68 65 20 69 6d 61 67  E: Grab the imag
6970: 65 20 72 75 6e 74 69 6d 65 20 76 65 72 73 69 6f  e runtime versio
6980: 6e 20 66 72 6f 6d 20 74 68 65 20 61 73 73 65 6d  n from the assem
6990: 62 6c 79 20 62 65 63 61 75 73 65 0d 0a 20 20 20  bly because..   
69a0: 20 20 20 20 20 23 20 20 20 20 20 20 20 73 65 76       #       sev
69b0: 65 72 61 6c 20 74 65 73 74 73 20 72 65 6c 79 20  eral tests rely 
69c0: 6f 6e 20 69 74 20 68 61 76 69 6e 67 20 61 20 63  on it having a c
69d0: 65 72 74 61 69 6e 20 76 61 6c 75 65 2e 0d 0a 20  ertain value... 
69e0: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
69f0: 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20    addConstraint 
6a00: 5b 61 70 70 65 6e 64 41 72 67 73 20 5b 66 69 6c  [appendArgs [fil
6a10: 65 20 74 61 69 6c 20 24 66 69 6c 65 4e 61 6d 65  e tail $fileName
6a20: 5d 20 5f 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ] _ \..         
6a30: 20 20 20 5b 24 61 73 73 65 6d 62 6c 79 20 49 6d     [$assembly Im
6a40: 61 67 65 52 75 6e 74 69 6d 65 56 65 72 73 69 6f  ageRuntimeVersio
6a50: 6e 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23  n]]....        #
6a60: 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
6a70: 3a 20 52 65 74 75 72 6e 20 74 68 65 20 66 75 6c  : Return the ful
6a80: 6c 20 70 61 74 68 20 6f 66 20 74 68 65 20 6c 6f  l path of the lo
6a90: 61 64 65 64 20 66 69 6c 65 2e 0d 0a 20 20 20 20  aded file...    
6aa0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72      #..        r
6ab0: 65 74 75 72 6e 20 24 66 69 6c 65 4e 61 6d 65 0d  eturn $fileName.
6ac0: 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
6ad0: 20 20 72 65 74 75 72 6e 20 22 22 0d 0a 20 20 20    return ""..   
6ae0: 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
6af0: 69 73 53 51 4c 69 74 65 52 65 61 64 79 20 7b 7d  isSQLiteReady {}
6b00: 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20   {..      #..   
6b10: 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 69 73 20     # NOTE: This 
6b20: 70 72 6f 63 65 64 75 72 65 20 6d 75 73 74 20 72  procedure must r
6b30: 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 6f  eturn non-zero o
6b40: 6e 6c 79 20 69 66 20 74 68 65 20 53 51 4c 69 74  nly if the SQLit
6b50: 65 20 6e 61 74 69 76 65 0d 0a 20 20 20 20 20 20  e native..      
6b60: 23 20 20 20 20 20 20 20 6c 69 62 72 61 72 79 20  #       library 
6b70: 61 6e 64 20 74 68 65 20 53 79 73 74 65 6d 2e 44  and the System.D
6b80: 61 74 61 2e 53 51 4c 69 74 65 20 6d 61 6e 61 67  ata.SQLite manag
6b90: 65 64 20 61 73 73 65 6d 62 6c 79 20 61 72 65 20  ed assembly are 
6ba0: 6c 6f 61 64 65 64 0d 0a 20 20 20 20 20 20 23 20  loaded..      # 
6bb0: 20 20 20 20 20 20 61 6e 64 20 72 65 61 64 79 20        and ready 
6bc0: 66 6f 72 20 75 73 65 20 62 79 20 74 68 65 20 74  for use by the t
6bd0: 65 73 74 20 73 75 69 74 65 2e 20 20 43 75 72 72  est suite.  Curr
6be0: 65 6e 74 6c 79 2c 20 74 68 69 73 20 70 72 6f 63  ently, this proc
6bf0: 65 64 75 72 65 0d 0a 20 20 20 20 20 20 23 20 20  edure..      #  
6c00: 20 20 20 20 20 73 68 6f 75 6c 64 20 62 65 20 63       should be c
6c10: 61 6c 6c 65 64 20 6f 6e 6c 79 20 61 66 74 65 72  alled only after
6c20: 20 74 68 65 20 5b 74 72 79 4c 6f 61 64 41 73 73   the [tryLoadAss
6c30: 65 6d 62 6c 79 5d 20 70 72 6f 63 65 64 75 72 65  embly] procedure
6c40: 20 68 61 73 0d 0a 20 20 20 20 20 20 23 20 20 20   has..      #   
6c50: 20 20 20 20 62 65 65 6e 20 63 61 6c 6c 65 64 20      been called 
6c60: 74 6f 20 70 72 6f 62 65 20 66 6f 72 20 74 68 65  to probe for the
6c70: 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c   System.Data.SQL
6c80: 69 74 65 20 6d 61 6e 61 67 65 64 20 61 73 73 65  ite managed asse
6c90: 6d 62 6c 79 0d 0a 20 20 20 20 20 20 23 20 20 20  mbly..      #   
6ca0: 20 20 20 20 61 6e 64 20 74 68 65 20 5b 63 68 65      and the [che
6cb0: 63 6b 46 6f 72 53 51 4c 69 74 65 5d 20 70 72 6f  ckForSQLite] pro
6cc0: 63 65 64 75 72 65 20 68 61 73 20 62 65 65 6e 20  cedure has been 
6cd0: 63 61 6c 6c 65 64 20 74 6f 20 70 72 6f 62 65 20  called to probe 
6ce0: 66 6f 72 0d 0a 20 20 20 20 20 20 23 20 20 20 20  for..      #    
6cf0: 20 20 20 74 68 65 20 53 51 4c 69 74 65 20 6e 61     the SQLite na
6d00: 74 69 76 65 20 6c 69 62 72 61 72 79 3b 20 6f 74  tive library; ot
6d10: 68 65 72 77 69 73 65 2c 20 74 68 69 73 20 70 72  herwise, this pr
6d20: 6f 63 65 64 75 72 65 20 77 69 6c 6c 20 73 69 6d  ocedure will sim
6d30: 70 6c 79 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ply..      #    
6d40: 20 20 20 61 6c 77 61 79 73 20 72 65 74 75 72 6e     always return
6d50: 20 7a 65 72 6f 2e 0d 0a 20 20 20 20 20 20 23 0d   zero...      #.
6d60: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b 65  .      return [e
6d70: 78 70 72 20 7b 5b 68 61 76 65 43 6f 6e 73 74 72  xpr {[haveConstr
6d80: 61 69 6e 74 20 53 79 73 74 65 6d 2e 44 61 74 61  aint System.Data
6d90: 2e 53 51 4c 69 74 65 5d 20 26 26 20 5c 0d 0a 20  .SQLite] && \.. 
6da0: 20 20 20 20 20 20 20 20 20 5b 68 61 76 65 43 6f           [haveCo
6db0: 6e 73 74 72 61 69 6e 74 20 53 51 4c 69 74 65 5d  nstraint SQLite]
6dc0: 7d 5d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20  }]..    }.....  
6dd0: 20 20 70 72 6f 63 20 63 68 65 63 6b 46 6f 72 53    proc checkForS
6de0: 51 4c 69 74 65 42 75 69 6c 64 73 20 7b 20 63 68  QLiteBuilds { ch
6df0: 61 6e 6e 65 6c 20 7d 20 7b 0d 0a 20 20 20 20 20  annel } {..     
6e00: 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
6e10: 3a 20 43 68 65 63 6b 20 66 6f 72 20 65 76 65 72  : Check for ever
6e20: 79 20 70 6f 73 73 69 62 6c 65 20 76 61 6c 69 64  y possible valid
6e30: 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 20   combination of 
6e40: 76 61 6c 75 65 73 20 75 73 65 64 20 77 68 65 6e  values used when
6e50: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
6e60: 6c 6f 63 61 74 69 6e 67 20 6f 75 74 20 74 68 65  locating out the
6e70: 20 62 75 69 6c 64 20 6f 75 74 70 75 74 20 64 69   build output di
6e80: 72 65 63 74 6f 72 79 2c 20 73 68 6f 77 69 6e 67  rectory, showing
6e90: 20 65 61 63 68 20 61 76 61 69 6c 61 62 6c 65 0d   each available.
6ea0: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 62  .      #       b
6eb0: 75 69 6c 64 20 76 61 72 69 61 74 69 6f 6e 20 61  uild variation a
6ec0: 6c 6f 6e 67 20 74 68 65 20 77 61 79 2e 0d 0a 20  long the way... 
6ed0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 66 6f       #..      fo
6ee0: 72 65 61 63 68 20 6e 61 74 69 76 65 20 5b 6c 69  reach native [li
6ef0: 73 74 20 66 61 6c 73 65 20 74 72 75 65 5d 20 7b  st false true] {
6f00: 0d 0a 20 20 20 20 20 20 20 20 66 6f 72 65 61 63  ..        foreac
6f10: 68 20 79 65 61 72 20 5b 67 65 74 42 75 69 6c 64  h year [getBuild
6f20: 59 65 61 72 73 5d 20 7b 0d 0a 20 20 20 20 20 20  Years] {..      
6f30: 20 20 20 20 66 6f 72 65 61 63 68 20 63 6f 6e 66      foreach conf
6f40: 69 67 75 72 61 74 69 6f 6e 20 5b 67 65 74 42 75  iguration [getBu
6f50: 69 6c 64 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e  ildConfiguration
6f60: 73 5d 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  s] {..          
6f70: 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
6f80: 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
6f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6fa0: 22 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e 67 20 66  "---- checking f
6fb0: 6f 72 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53  or System.Data.S
6fc0: 51 4c 69 74 65 20 62 75 69 6c 64 20 5c 22 22 20  QLite build \"" 
6fd0: 5b 65 78 70 72 20 5c 0d 0a 20 20 20 20 20 20 20  [expr \..       
6fe0: 20 20 20 20 20 20 20 20 20 7b 24 6e 61 74 69 76           {$nativ
6ff0: 65 20 3f 20 22 6e 61 74 69 76 65 2f 22 20 3a 20  e ? "native/" : 
7000: 22 22 7d 5d 20 24 79 65 61 72 20 2f 20 24 63 6f  ""}] $year / $co
7010: 6e 66 69 67 75 72 61 74 69 6f 6e 20 22 5c 22 2e  nfiguration "\".
7020: 2e 2e 20 22 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  .. "]....       
7030: 20 20 20 20 20 73 65 74 20 66 69 6c 65 4e 61 6d       set fileNam
7040: 65 20 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e 61  e [file nativena
7050: 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5b 6a  me [file join [j
7060: 6f 69 6e 42 75 69 6c 64 44 69 72 65 63 74 6f 72  oinBuildDirector
7070: 79 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  y \..           
7080: 20 20 20 20 20 24 6e 61 74 69 76 65 20 5b 67 65       $native [ge
7090: 74 42 75 69 6c 64 42 61 73 65 44 69 72 65 63 74  tBuildBaseDirect
70a0: 6f 72 79 5d 20 24 79 65 61 72 20 5b 67 65 74 42  ory] $year [getB
70b0: 75 69 6c 64 50 6c 61 74 66 6f 72 6d 20 5c 0d 0a  uildPlatform \..
70c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
70d0: 24 6e 61 74 69 76 65 5d 20 24 63 6f 6e 66 69 67  $native] $config
70e0: 75 72 61 74 69 6f 6e 5d 20 53 79 73 74 65 6d 2e  uration] System.
70f0: 44 61 74 61 2e 53 51 4c 69 74 65 2e 64 6c 6c 5d  Data.SQLite.dll]
7100: 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ]....           
7110: 20 69 66 20 7b 5b 66 69 6c 65 20 65 78 69 73 74   if {[file exist
7120: 73 20 24 66 69 6c 65 4e 61 6d 65 5d 7d 20 74 68  s $fileName]} th
7130: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
7140: 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
7150: 65 6c 20 79 65 73 5c 6e 0d 0a 20 20 20 20 20 20  el yes\n..      
7160: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
7170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 70                tp
7180: 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 6e 6f 5c  uts $channel no\
7190: 6e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  n..            }
71a0: 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20  ..          }.. 
71b0: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
71c0: 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  }..    }.....   
71d0: 20 70 72 6f 63 20 63 68 65 63 6b 46 6f 72 53 51   proc checkForSQ
71e0: 4c 69 74 65 4c 69 62 72 61 72 79 20 7b 20 63 68  LiteLibrary { ch
71f0: 61 6e 6e 65 6c 20 7d 20 7b 0d 0a 20 20 20 20 20  annel } {..     
7200: 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
7210: 22 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e 67 20 66  "---- checking f
7220: 6f 72 20 53 51 4c 69 74 65 20 63 6f 72 65 20 6c  or SQLite core l
7230: 69 62 72 61 72 79 2e 2e 2e 20 22 0d 0a 0d 0a 20  ibrary... ".... 
7240: 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20       if {[catch 
7250: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
7260: 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d   object invoke -
7270: 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63  flags +NonPublic
7280: 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c   System.Data.SQL
7290: 69 74 65 2e 53 51 4c 69 74 65 33 20 5c 0d 0a 20  ite.SQLite3 \.. 
72a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
72b0: 69 74 65 56 65 72 73 69 6f 6e 7d 20 76 65 72 73  iteVersion} vers
72c0: 69 6f 6e 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20  ion] == 0} then 
72d0: 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
72e0: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68        # NOTE: Ch
72f0: 65 63 6b 20 69 66 20 74 68 65 20 72 65 74 75 72  eck if the retur
7300: 6e 65 64 20 76 65 72 73 69 6f 6e 20 77 61 73 20  ned version was 
7310: 6e 75 6c 6c 2e 20 20 49 66 20 73 6f 2c 20 6d 61  null.  If so, ma
7320: 6b 65 20 69 74 20 65 61 73 79 0d 0a 20 20 20 20  ke it easy..    
7330: 20 20 20 20 23 20 20 20 20 20 20 20 74 6f 20 73      #       to s
7340: 70 6f 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  pot...        #.
7350: 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73 74  .        if {[st
7360: 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 76 65 72  ring length $ver
7370: 73 69 6f 6e 5d 20 3d 3d 20 30 7d 20 74 68 65 6e  sion] == 0} then
7380: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65   {..          se
7390: 74 20 76 65 72 73 69 6f 6e 20 6e 75 6c 6c 0d 0a  t version null..
73a0: 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
73b0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
73c0: 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74 20  # NOTE: Attempt 
73d0: 74 6f 20 71 75 65 72 79 20 74 68 65 20 46 6f 73  to query the Fos
73e0: 73 69 6c 20 73 6f 75 72 63 65 20 69 64 65 6e 74  sil source ident
73f0: 69 66 69 65 72 20 66 6f 72 20 74 68 65 20 53 51  ifier for the SQ
7400: 4c 69 74 65 0d 0a 20 20 20 20 20 20 20 20 23 20  Lite..        # 
7410: 20 20 20 20 20 20 63 6f 72 65 20 6c 69 62 72 61        core libra
7420: 72 79 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  ry...        #..
7430: 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74          if {[cat
7440: 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  ch {..          
7450: 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76        object inv
7460: 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50  oke -flags +NonP
7470: 75 62 6c 69 63 20 53 79 73 74 65 6d 2e 44 61 74  ublic System.Dat
7480: 61 2e 53 51 4c 69 74 65 2e 53 51 4c 69 74 65 33  a.SQLite.SQLite3
7490: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
74a0: 20 20 20 20 53 51 4c 69 74 65 53 6f 75 72 63 65      SQLiteSource
74b0: 49 64 7d 20 73 6f 75 72 63 65 49 64 5d 7d 20 74  Id} sourceId]} t
74c0: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
74d0: 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20   #..          # 
74e0: 4e 4f 54 45 3a 20 57 65 20 66 61 69 6c 65 64 20  NOTE: We failed 
74f0: 74 6f 20 71 75 65 72 79 20 74 68 65 20 46 6f 73  to query the Fos
7500: 73 69 6c 20 73 6f 75 72 63 65 20 69 64 65 6e 74  sil source ident
7510: 69 66 69 65 72 2e 0d 0a 20 20 20 20 20 20 20 20  ifier...        
7520: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 73    #..          s
7530: 65 74 20 73 6f 75 72 63 65 49 64 20 75 6e 6b 6e  et sourceId unkn
7540: 6f 77 6e 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  own..        }..
7550: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
7560: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68 65       # NOTE: Che
7570: 63 6b 20 69 66 20 74 68 65 20 72 65 74 75 72 6e  ck if the return
7580: 65 64 20 46 6f 73 73 69 6c 20 73 6f 75 72 63 65  ed Fossil source
7590: 20 69 64 65 6e 74 69 66 69 65 72 20 77 61 73 20   identifier was 
75a0: 6e 75 6c 6c 2e 20 20 49 66 0d 0a 20 20 20 20 20  null.  If..     
75b0: 20 20 20 23 20 20 20 20 20 20 20 73 6f 2c 20 6d     #       so, m
75c0: 61 6b 65 20 69 74 20 65 61 73 79 20 74 6f 20 73  ake it easy to s
75d0: 70 6f 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  pot...        #.
75e0: 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73 74  .        if {[st
75f0: 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 73 6f 75  ring length $sou
7600: 72 63 65 49 64 5d 20 3d 3d 20 30 7d 20 74 68 65  rceId] == 0} the
7610: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73  n {..          s
7620: 65 74 20 73 6f 75 72 63 65 49 64 20 6e 75 6c 6c  et sourceId null
7630: 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  ..        }.... 
7640: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
7650: 20 20 23 20 4e 4f 54 45 3a 20 59 65 73 2c 20 74    # NOTE: Yes, t
7660: 68 65 20 53 51 4c 69 74 65 20 63 6f 72 65 20 6c  he SQLite core l
7670: 69 62 72 61 72 79 20 61 70 70 65 61 72 73 20 74  ibrary appears t
7680: 6f 20 62 65 20 61 76 61 69 6c 61 62 6c 65 2e 0d  o be available..
7690: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
76a0: 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e      addConstrain
76b0: 74 20 53 51 4c 69 74 65 0d 0a 0d 0a 20 20 20 20  t SQLite....    
76c0: 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
76d0: 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 22  el [appendArgs "
76e0: 79 65 73 20 28 22 20 24 76 65 72 73 69 6f 6e 20  yes (" $version 
76f0: 22 20 22 20 24 73 6f 75 72 63 65 49 64 20 22 29  " " $sourceId ")
7700: 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c  \n"]..      } el
7710: 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70  se {..        tp
7720: 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 6e 6f 5c  uts $channel no\
7730: 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  n..      }..    
7740: 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 63  }.....    proc c
7750: 68 65 63 6b 46 6f 72 53 51 4c 69 74 65 49 6e 74  heckForSQLiteInt
7760: 65 72 6f 70 20 7b 20 63 68 61 6e 6e 65 6c 20 7d  erop { channel }
7770: 20 7b 0d 0a 20 20 20 20 20 20 74 70 75 74 73 20   {..      tputs 
7780: 24 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 63  $channel "---- c
7790: 68 65 63 6b 69 6e 67 20 66 6f 72 20 53 51 4c 69  hecking for SQLi
77a0: 74 65 20 69 6e 74 65 72 6f 70 20 61 73 73 65 6d  te interop assem
77b0: 62 6c 79 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20  bly... "....    
77c0: 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a    if {[catch {..
77d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 62                ob
77e0: 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61  ject invoke -fla
77f0: 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 53 79  gs +NonPublic Sy
7800: 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
7810: 2e 53 51 4c 69 74 65 33 20 5c 0d 0a 20 20 20 20  .SQLite3 \..    
7820: 20 20 20 20 20 20 20 20 20 20 49 6e 74 65 72 6f            Intero
7830: 70 56 65 72 73 69 6f 6e 7d 20 76 65 72 73 69 6f  pVersion} versio
7840: 6e 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d  n] == 0} then {.
7850: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
7860: 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68 65 63      # NOTE: Chec
7870: 6b 20 69 66 20 74 68 65 20 72 65 74 75 72 6e 65  k if the returne
7880: 64 20 76 65 72 73 69 6f 6e 20 77 61 73 20 6e 75  d version was nu
7890: 6c 6c 2e 20 20 49 66 20 73 6f 2c 20 6d 61 6b 65  ll.  If so, make
78a0: 20 69 74 20 65 61 73 79 0d 0a 20 20 20 20 20 20   it easy..      
78b0: 20 20 23 20 20 20 20 20 20 20 74 6f 20 73 70 6f    #       to spo
78c0: 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  t...        #.. 
78d0: 20 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69         if {[stri
78e0: 6e 67 20 6c 65 6e 67 74 68 20 24 76 65 72 73 69  ng length $versi
78f0: 6f 6e 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b  on] == 0} then {
7900: 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20  ..          set 
7910: 76 65 72 73 69 6f 6e 20 6e 75 6c 6c 0d 0a 20 20  version null..  
7920: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
7930: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
7940: 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74 20 74 6f  NOTE: Attempt to
7950: 20 71 75 65 72 79 20 74 68 65 20 46 6f 73 73 69   query the Fossi
7960: 6c 20 73 6f 75 72 63 65 20 69 64 65 6e 74 69 66  l source identif
7970: 69 65 72 20 66 6f 72 20 74 68 65 20 53 51 4c 69  ier for the SQLi
7980: 74 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  te..        #   
7990: 20 20 20 20 63 6f 72 65 20 6c 69 62 72 61 72 79      core library
79a0: 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
79b0: 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68        if {[catch
79c0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
79d0: 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b      object invok
79e0: 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62  e -flags +NonPub
79f0: 6c 69 63 20 53 79 73 74 65 6d 2e 44 61 74 61 2e  lic System.Data.
7a00: 53 51 4c 69 74 65 2e 53 51 4c 69 74 65 33 20 5c  SQLite.SQLite3 \
7a10: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
7a20: 20 20 49 6e 74 65 72 6f 70 53 6f 75 72 63 65 49    InteropSourceI
7a30: 64 7d 20 73 6f 75 72 63 65 49 64 5d 7d 20 74 68  d} sourceId]} th
7a40: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
7a50: 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e  #..          # N
7a60: 4f 54 45 3a 20 57 65 20 66 61 69 6c 65 64 20 74  OTE: We failed t
7a70: 6f 20 71 75 65 72 79 20 74 68 65 20 46 6f 73 73  o query the Foss
7a80: 69 6c 20 73 6f 75 72 63 65 20 69 64 65 6e 74 69  il source identi
7a90: 66 69 65 72 2e 0d 0a 20 20 20 20 20 20 20 20 20  fier...         
7aa0: 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65   #..          se
7ab0: 74 20 73 6f 75 72 63 65 49 64 20 75 6e 6b 6e 6f  t sourceId unkno
7ac0: 77 6e 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d  wn..        }...
7ad0: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
7ae0: 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68 65 63      # NOTE: Chec
7af0: 6b 20 69 66 20 74 68 65 20 72 65 74 75 72 6e 65  k if the returne
7b00: 64 20 46 6f 73 73 69 6c 20 73 6f 75 72 63 65 20  d Fossil source 
7b10: 69 64 65 6e 74 69 66 69 65 72 20 77 61 73 20 6e  identifier was n
7b20: 75 6c 6c 2e 20 20 49 66 0d 0a 20 20 20 20 20 20  ull.  If..      
7b30: 20 20 23 20 20 20 20 20 20 20 73 6f 2c 20 6d 61    #       so, ma
7b40: 6b 65 20 69 74 20 65 61 73 79 20 74 6f 20 73 70  ke it easy to sp
7b50: 6f 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  ot...        #..
7b60: 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72          if {[str
7b70: 69 6e 67 20 6c 65 6e 67 74 68 20 24 73 6f 75 72  ing length $sour
7b80: 63 65 49 64 5d 20 3d 3d 20 30 7d 20 74 68 65 6e  ceId] == 0} then
7b90: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65   {..          se
7ba0: 74 20 73 6f 75 72 63 65 49 64 20 6e 75 6c 6c 0d  t sourceId null.
7bb0: 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  .        }....  
7bc0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
7bd0: 20 23 20 4e 4f 54 45 3a 20 59 65 73 2c 20 74 68   # NOTE: Yes, th
7be0: 65 20 53 51 4c 69 74 65 20 69 6e 74 65 72 6f 70  e SQLite interop
7bf0: 20 61 73 73 65 6d 62 6c 79 20 61 70 70 65 61 72   assembly appear
7c00: 73 20 74 6f 20 62 65 20 61 76 61 69 6c 61 62 6c  s to be availabl
7c10: 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  e...        #.. 
7c20: 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72         addConstr
7c30: 61 69 6e 74 20 53 51 4c 69 74 65 49 6e 74 65 72  aint SQLiteInter
7c40: 6f 70 0d 0a 0d 0a 20 20 20 20 20 20 20 20 74 70  op....        tp
7c50: 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70  uts $channel [ap
7c60: 70 65 6e 64 41 72 67 73 20 22 79 65 73 20 28 22  pendArgs "yes ("
7c70: 20 24 76 65 72 73 69 6f 6e 20 22 20 22 20 24 73   $version " " $s
7c80: 6f 75 72 63 65 49 64 20 22 29 5c 6e 22 5d 0d 0a  ourceId ")\n"]..
7c90: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
7ca0: 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
7cb0: 68 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d 0a 20 20 20  hannel no\n..   
7cc0: 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a     }..    }.....
7cd0: 20 20 20 20 70 72 6f 63 20 63 68 65 63 6b 46 6f      proc checkFo
7ce0: 72 53 51 4c 69 74 65 44 65 66 69 6e 65 43 6f 6e  rSQLiteDefineCon
7cf0: 73 74 61 6e 74 20 7b 20 63 68 61 6e 6e 65 6c 20  stant { channel 
7d00: 6e 61 6d 65 20 7d 20 7b 0d 0a 20 20 20 20 20 20  name } {..      
7d10: 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b  tputs $channel [
7d20: 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
7d30: 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 68          "---- ch
7d40: 65 63 6b 69 6e 67 20 66 6f 72 20 53 79 73 74 65  ecking for Syste
7d50: 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 20 64 65  m.Data.SQLite de
7d60: 66 69 6e 65 20 63 6f 6e 73 74 61 6e 74 20 5c 22  fine constant \"
7d70: 22 20 24 6e 61 6d 65 20 5c 0d 0a 20 20 20 20 20  " $name \..     
7d80: 20 20 20 20 20 22 5c 22 2e 2e 2e 20 22 5d 0d 0a       "\"... "]..
7d90: 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74  ..      if {[cat
7da0: 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  ch {..          
7db0: 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b      object invok
7dc0: 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62  e -flags +NonPub
7dd0: 6c 69 63 20 53 79 73 74 65 6d 2e 44 61 74 61 2e  lic System.Data.
7de0: 53 51 4c 69 74 65 2e 53 51 4c 69 74 65 33 20 5c  SQLite.SQLite3 \
7df0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
7e00: 44 65 66 69 6e 65 43 6f 6e 73 74 61 6e 74 73 7d  DefineConstants}
7e10: 20 64 65 66 69 6e 65 43 6f 6e 73 74 61 6e 74 73   defineConstants
7e20: 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  ] == 0} then {..
7e30: 20 20 20 20 20 20 20 20 69 66 20 7b 5b 6c 73 65          if {[lse
7e40: 61 72 63 68 20 2d 65 78 61 63 74 20 2d 6e 6f 63  arch -exact -noc
7e50: 61 73 65 20 24 64 65 66 69 6e 65 43 6f 6e 73 74  ase $defineConst
7e60: 61 6e 74 73 20 24 6e 61 6d 65 5d 20 21 3d 20 2d  ants $name] != -
7e70: 31 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  1} then {..     
7e80: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
7e90: 20 20 23 20 4e 4f 54 45 3a 20 59 65 73 2c 20 74    # NOTE: Yes, t
7ea0: 68 69 73 20 64 65 66 69 6e 65 20 63 6f 6e 73 74  his define const
7eb0: 61 6e 74 20 77 61 73 20 65 6e 61 62 6c 65 64 20  ant was enabled 
7ec0: 77 68 65 6e 20 74 68 65 20 6d 61 6e 61 67 65 64  when the managed
7ed0: 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 20 20  ..          #   
7ee0: 20 20 20 20 61 73 73 65 6d 62 6c 79 20 77 61 73      assembly was
7ef0: 20 63 6f 6d 70 69 6c 65 64 2e 0d 0a 20 20 20 20   compiled...    
7f00: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
7f10: 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74     addConstraint
7f20: 20 5b 61 70 70 65 6e 64 41 72 67 73 20 64 65 66   [appendArgs def
7f30: 69 6e 65 43 6f 6e 73 74 61 6e 74 2e 53 79 73 74  ineConstant.Syst
7f40: 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 20  em.Data.SQLite. 
7f50: 24 6e 61 6d 65 5d 0d 0a 0d 0a 20 20 20 20 20 20  $name]....      
7f60: 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
7f70: 65 6c 20 79 65 73 5c 6e 0d 0a 20 20 20 20 20 20  el yes\n..      
7f80: 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
7f90: 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
7fa0: 6e 6e 65 6c 20 6e 6f 5c 6e 0d 0a 20 20 20 20 20  nnel no\n..     
7fb0: 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 20 65 6c     }..      } el
7fc0: 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70  se {..        tp
7fd0: 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 65 72 72  uts $channel err
7fe0: 6f 72 5c 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a 20  or\n..      }.. 
7ff0: 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
8000: 63 20 67 65 74 44 61 74 65 54 69 6d 65 46 6f 72  c getDateTimeFor
8010: 6d 61 74 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20  mat {} {..      
8020: 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
8030: 20 54 68 69 73 20 70 72 6f 63 65 64 75 72 65 20   This procedure 
8040: 73 69 6d 70 6c 79 20 72 65 74 75 72 6e 73 20 74  simply returns t
8050: 68 65 20 22 64 65 66 61 75 6c 74 22 20 44 61 74  he "default" Dat
8060: 65 54 69 6d 65 20 66 6f 72 6d 61 74 20 75 73 65  eTime format use
8070: 64 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  d..      #      
8080: 20 62 79 20 74 68 65 20 74 65 73 74 20 73 75 69   by the test sui
8090: 74 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  te...      #..  
80a0: 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78      if {[info ex
80b0: 69 73 74 73 20 3a 3a 64 61 74 65 74 69 6d 65 5f  ists ::datetime_
80c0: 66 6f 72 6d 61 74 5d 20 26 26 20 5c 0d 0a 20 20  format] && \..  
80d0: 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20          [string 
80e0: 6c 65 6e 67 74 68 20 24 3a 3a 64 61 74 65 74 69  length $::dateti
80f0: 6d 65 5f 66 6f 72 6d 61 74 5d 20 3e 20 30 7d 20  me_format] > 0} 
8100: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
8110: 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
8120: 45 3a 20 52 65 74 75 72 6e 20 74 68 65 20 6d 61  E: Return the ma
8130: 6e 75 61 6c 6c 79 20 6f 76 65 72 72 69 64 64 65  nually overridde
8140: 6e 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20  n value for the 
8150: 44 61 74 65 54 69 6d 65 20 66 6f 72 6d 61 74 2e  DateTime format.
8160: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
8170: 20 20 20 20 20 72 65 74 75 72 6e 20 24 3a 3a 64       return $::d
8180: 61 74 65 74 69 6d 65 5f 66 6f 72 6d 61 74 0d 0a  atetime_format..
8190: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
81a0: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
81b0: 20 20 20 23 20 4e 4f 54 45 3a 20 52 65 74 75 72     # NOTE: Retur
81c0: 6e 20 61 6e 20 49 53 4f 38 36 30 31 20 44 61 74  n an ISO8601 Dat
81d0: 65 54 69 6d 65 20 66 6f 72 6d 61 74 20 63 6f 6d  eTime format com
81e0: 70 61 74 69 62 6c 65 20 77 69 74 68 20 53 51 4c  patible with SQL
81f0: 69 74 65 2c 0d 0a 20 20 20 20 20 20 20 20 23 20  ite,..        # 
8200: 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74        System.Dat
8210: 61 2e 53 51 4c 69 74 65 2c 20 61 6e 64 20 73 75  a.SQLite, and su
8220: 69 74 61 62 6c 65 20 66 6f 72 20 72 6f 75 6e 64  itable for round
8230: 2d 74 72 69 70 70 69 6e 67 20 77 69 74 68 20 74  -tripping with t
8240: 68 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  he..        #   
8250: 20 20 20 20 44 61 74 65 54 69 6d 65 20 63 6c 61      DateTime cla
8260: 73 73 20 6f 66 20 74 68 65 20 66 72 61 6d 65 77  ss of the framew
8270: 6f 72 6b 2e 20 20 49 66 20 74 68 69 73 20 76 61  ork.  If this va
8280: 6c 75 65 20 69 73 20 63 68 61 6e 67 65 64 2c 0d  lue is changed,.
8290: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
82a0: 20 76 61 72 69 6f 75 73 20 74 65 73 74 73 20 6d   various tests m
82b0: 61 79 20 66 61 69 6c 2e 0d 0a 20 20 20 20 20 20  ay fail...      
82c0: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74    #..        ret
82d0: 75 72 6e 20 22 79 79 79 79 2d 4d 4d 2d 64 64 20  urn "yyyy-MM-dd 
82e0: 48 48 3a 6d 6d 3a 73 73 2e 46 46 46 46 46 46 46  HH:mm:ss.FFFFFFF
82f0: 4b 22 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20  K"..      }..   
8300: 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
8310: 65 6e 75 6d 65 72 61 62 6c 65 54 6f 4c 69 73 74  enumerableToList
8320: 20 7b 20 65 6e 75 6d 65 72 61 62 6c 65 20 7d 20   { enumerable } 
8330: 7b 0d 0a 20 20 20 20 20 20 73 65 74 20 72 65 73  {..      set res
8340: 75 6c 74 20 5b 6c 69 73 74 5d 0d 0a 0d 0a 20 20  ult [list]....  
8350: 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20      if {[string 
8360: 6c 65 6e 67 74 68 20 24 65 6e 75 6d 65 72 61 62  length $enumerab
8370: 6c 65 5d 20 3d 3d 20 30 20 7c 7c 20 24 65 6e 75  le] == 0 || $enu
8380: 6d 65 72 61 62 6c 65 20 65 71 20 22 6e 75 6c 6c  merable eq "null
8390: 22 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  "} then {..     
83a0: 20 20 20 72 65 74 75 72 6e 20 24 72 65 73 75 6c     return $resul
83b0: 74 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  t..      }....  
83c0: 20 20 20 20 6f 62 6a 65 63 74 20 66 6f 72 65 61      object forea
83d0: 63 68 20 2d 61 6c 69 61 73 20 69 74 65 6d 20 24  ch -alias item $
83e0: 65 6e 75 6d 65 72 61 62 6c 65 20 7b 0d 0a 20 20  enumerable {..  
83f0: 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e        if {[strin
8400: 67 20 6c 65 6e 67 74 68 20 24 69 74 65 6d 5d 20  g length $item] 
8410: 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  > 0} then {..   
8420: 20 20 20 20 20 20 20 6c 61 70 70 65 6e 64 20 72         lappend r
8430: 65 73 75 6c 74 20 5b 24 69 74 65 6d 20 54 6f 53  esult [$item ToS
8440: 74 72 69 6e 67 5d 0d 0a 20 20 20 20 20 20 20 20  tring]..        
8450: 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  }..      }....  
8460: 20 20 20 20 72 65 74 75 72 6e 20 24 72 65 73 75      return $resu
8470: 6c 74 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20  lt..    }.....  
8480: 20 20 70 72 6f 63 20 63 61 74 63 68 41 6e 64 52    proc catchAndR
8490: 65 74 75 72 6e 20 7b 20 73 63 72 69 70 74 20 7b  eturn { script {
84a0: 73 74 61 63 6b 54 72 61 63 65 20 66 61 6c 73 65  stackTrace false
84b0: 7d 20 7b 73 74 72 69 63 74 20 74 72 75 65 7d 20  } {strict true} 
84c0: 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  } {..      #..  
84d0: 20 20 20 20 23 20 4e 4f 54 45 3a 20 45 76 61 6c      # NOTE: Eval
84e0: 75 61 74 65 20 74 68 65 20 73 63 72 69 70 74 20  uate the script 
84f0: 70 72 6f 76 69 64 65 64 20 62 79 20 6f 75 72 20  provided by our 
8500: 63 61 6c 6c 65 72 20 69 6e 20 74 68 65 69 72 20  caller in their 
8510: 63 6f 6e 74 65 78 74 2c 0d 0a 20 20 20 20 20 20  context,..      
8520: 23 20 20 20 20 20 20 20 63 61 70 74 75 72 69 6e  #       capturin
8530: 67 20 62 6f 74 68 20 74 68 65 20 72 65 73 75 6c  g both the resul
8540: 74 20 61 6e 64 20 74 68 65 20 72 65 74 75 72 6e  t and the return
8550: 20 63 6f 64 65 2e 0d 0a 20 20 20 20 20 20 23 0d   code...      #.
8560: 0a 20 20 20 20 20 20 73 65 74 20 63 6f 64 65 20  .      set code 
8570: 5b 63 61 74 63 68 20 7b 75 70 6c 65 76 65 6c 20  [catch {uplevel 
8580: 31 20 24 73 63 72 69 70 74 7d 20 72 65 73 75 6c  1 $script} resul
8590: 74 5d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20  t]....      #.. 
85a0: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 44 69 64       # NOTE: Did
85b0: 20 74 68 65 20 73 63 72 69 70 74 20 70 72 6f 76   the script prov
85c0: 69 64 65 64 20 62 79 20 6f 75 72 20 63 61 6c 6c  ided by our call
85d0: 65 72 20 4e 4f 54 20 72 61 69 73 65 20 61 6e 20  er NOT raise an 
85e0: 65 72 72 6f 72 3f 0d 0a 20 20 20 20 20 20 23 0d  error?..      #.
85f0: 0a 20 20 20 20 20 20 69 66 20 7b 24 73 74 72 69  .      if {$stri
8600: 63 74 20 26 26 20 24 63 6f 64 65 20 3d 3d 20 30  ct && $code == 0
8610: 20 7c 7c 20 21 24 73 74 72 69 63 74 20 26 26 20   || !$strict && 
8620: 24 63 6f 64 65 20 21 3d 20 31 7d 20 74 68 65 6e  $code != 1} then
8630: 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20   {..        #.. 
8640: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53         # NOTE: S
8650: 75 63 63 65 73 73 2e 20 20 52 65 74 75 72 6e 20  uccess.  Return 
8660: 61 20 6c 69 73 74 20 77 69 74 68 20 74 68 65 20  a list with the 
8670: 72 65 74 75 72 6e 20 63 6f 64 65 20 61 6e 64 20  return code and 
8680: 74 68 65 20 72 65 73 75 6c 74 2e 0d 0a 20 20 20  the result...   
8690: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
86a0: 72 65 74 75 72 6e 20 5b 6c 69 73 74 20 24 63 6f  return [list $co
86b0: 64 65 20 24 72 65 73 75 6c 74 5d 0d 0a 20 20 20  de $result]..   
86c0: 20 20 20 7d 20 65 6c 73 65 69 66 20 7b 24 73 74     } elseif {$st
86d0: 61 63 6b 54 72 61 63 65 7d 20 74 68 65 6e 20 7b  ackTrace} then {
86e0: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
86f0: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 46 61 69       # NOTE: Fai
8700: 6c 75 72 65 2e 20 20 4f 75 72 20 63 61 6c 6c 65  lure.  Our calle
8710: 72 20 77 61 6e 74 73 20 61 20 66 75 6c 6c 20 73  r wants a full s
8720: 74 61 63 6b 20 74 72 61 63 65 20 28 69 66 20 61  tack trace (if a
8730: 70 70 6c 69 63 61 62 6c 65 29 2c 0d 0a 20 20 20  pplicable),..   
8740: 20 20 20 20 20 23 20 20 20 20 20 20 20 72 65 74       #       ret
8750: 75 72 6e 20 61 20 6c 69 73 74 20 77 69 74 68 20  urn a list with 
8760: 74 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20  the return code 
8770: 61 6e 64 20 74 68 65 20 72 65 73 75 6c 74 20 76  and the result v
8780: 65 72 62 61 74 69 6d 2e 0d 0a 20 20 20 20 20 20  erbatim...      
8790: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74    #..        ret
87a0: 75 72 6e 20 5b 6c 69 73 74 20 24 63 6f 64 65 20  urn [list $code 
87b0: 24 72 65 73 75 6c 74 5d 0d 0a 20 20 20 20 20 20  $result]..      
87c0: 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
87d0: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
87e0: 4f 54 45 3a 20 46 61 69 6c 75 72 65 2e 20 20 4f  OTE: Failure.  O
87f0: 75 72 20 63 61 6c 6c 65 72 20 64 6f 65 73 20 6e  ur caller does n
8800: 6f 74 20 77 61 6e 74 20 61 20 66 75 6c 6c 20 73  ot want a full s
8810: 74 61 63 6b 20 74 72 61 63 65 20 28 69 66 0d 0a  tack trace (if..
8820: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
8830: 61 70 70 6c 69 63 61 62 6c 65 29 2c 20 72 65 74  applicable), ret
8840: 75 72 6e 20 61 20 6c 69 73 74 20 77 69 74 68 20  urn a list with 
8850: 74 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65 2c  the return code,
8860: 20 74 68 65 20 65 72 72 6f 72 0d 0a 20 20 20 20   the error..    
8870: 20 20 20 20 23 20 20 20 20 20 20 20 63 6f 64 65      #       code
8880: 20 66 6f 72 20 74 68 65 20 69 6e 74 65 72 70 72   for the interpr
8890: 65 74 65 72 2c 20 61 6e 64 20 74 68 65 20 65 72  eter, and the er
88a0: 72 6f 72 20 6d 65 73 73 61 67 65 20 75 70 20 74  ror message up t
88b0: 6f 20 74 68 65 0d 0a 20 20 20 20 20 20 20 20 23  o the..        #
88c0: 20 20 20 20 20 20 20 70 6f 69 6e 74 20 77 68 65         point whe
88d0: 72 65 20 74 68 65 20 73 74 61 63 6b 20 74 72 61  re the stack tra
88e0: 63 65 20 73 68 6f 75 6c 64 20 73 74 61 72 74 2e  ce should start.
88f0: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
8900: 20 20 20 20 20 73 65 74 20 69 6e 64 65 78 20 5b       set index [
8910: 73 74 72 69 6e 67 20 66 69 72 73 74 20 22 20 20  string first "  
8920: 20 61 74 20 22 20 24 72 65 73 75 6c 74 5d 3b 20   at " $result]; 
8930: 23 20 48 41 43 4b 3a 20 52 65 6c 69 61 62 6c 65  # HACK: Reliable
8940: 3f 0d 0a 0d 0a 20 20 20 20 20 20 20 20 72 65 74  ?....        ret
8950: 75 72 6e 20 5b 6c 69 73 74 20 24 63 6f 64 65 20  urn [list $code 
8960: 24 3a 3a 65 72 72 6f 72 43 6f 64 65 20 5b 65 78  $::errorCode [ex
8970: 70 72 20 7b 24 69 6e 64 65 78 20 21 3d 20 2d 31  pr {$index != -1
8980: 20 3f 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20   ? \..          
8990: 20 20 5b 73 74 72 69 6e 67 20 74 72 69 6d 20 5b    [string trim [
89a0: 73 74 72 69 6e 67 20 72 61 6e 67 65 20 24 72 65  string range $re
89b0: 73 75 6c 74 20 30 20 24 69 6e 64 65 78 5d 5d 20  sult 0 $index]] 
89c0: 3a 20 24 72 65 73 75 6c 74 7d 5d 5d 0d 0a 20 20  : $result}]]..  
89d0: 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d      }..    }....
89e0: 0a 20 20 20 20 70 72 6f 63 20 63 6f 6d 70 69 6c  .    proc compil
89f0: 65 43 53 68 61 72 70 57 69 74 68 20 7b 0d 0a 20  eCSharpWith {.. 
8a00: 20 20 20 20 20 20 20 20 20 20 20 74 65 78 74 20             text 
8a10: 6d 65 6d 6f 72 79 20 73 79 6d 62 6f 6c 73 20 73  memory symbols s
8a20: 74 72 69 63 74 20 72 65 73 75 6c 74 73 56 61 72  trict resultsVar
8a30: 4e 61 6d 65 20 65 72 72 6f 72 73 56 61 72 4e 61  Name errorsVarNa
8a40: 6d 65 20 66 69 6c 65 4e 61 6d 65 73 0d 0a 20 20  me fileNames..  
8a50: 20 20 20 20 20 20 20 20 20 20 61 72 67 73 20 7d            args }
8a60: 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20   {..      #..   
8a70: 20 20 20 23 20 4e 4f 54 45 3a 20 53 69 6e 63 65     # NOTE: Since
8a80: 20 77 65 20 61 72 65 20 67 6f 69 6e 67 20 74 6f   we are going to
8a90: 20 75 73 65 20 74 68 69 73 20 6d 65 74 68 6f 64   use this method
8aa0: 20 6e 61 6d 65 20 61 20 6c 6f 74 2c 20 61 73 73   name a lot, ass
8ab0: 69 67 6e 20 69 74 20 74 6f 20 61 0d 0a 20 20 20  ign it to a..   
8ac0: 20 20 20 23 20 20 20 20 20 20 20 76 61 72 69 61     #       varia
8ad0: 62 6c 65 20 66 69 72 73 74 2e 0d 0a 20 20 20 20  ble first...    
8ae0: 20 20 23 0d 0a 20 20 20 20 20 20 73 65 74 20 61    #..      set a
8af0: 64 64 20 52 65 66 65 72 65 6e 63 65 64 41 73 73  dd ReferencedAss
8b00: 65 6d 62 6c 69 65 73 2e 41 64 64 0d 0a 0d 0a 20  emblies.Add.... 
8b10: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
8b20: 4e 4f 54 45 3a 20 43 72 65 61 74 65 20 74 68 65  NOTE: Create the
8b30: 20 62 61 73 65 20 63 6f 6d 6d 61 6e 64 20 74 6f   base command to
8b40: 20 65 76 61 6c 75 61 74 65 20 61 6e 64 20 61 64   evaluate and ad
8b50: 64 20 74 68 65 20 70 72 6f 70 65 72 74 79 20 73  d the property s
8b60: 65 74 74 69 6e 67 73 0d 0a 20 20 20 20 20 20 23  ettings..      #
8b70: 20 20 20 20 20 20 20 74 68 61 74 20 61 72 65 20         that are 
8b80: 61 6c 6d 6f 73 74 20 61 6c 77 61 79 73 20 6e 65  almost always ne
8b90: 65 64 65 64 20 62 79 20 6f 75 72 20 75 6e 69 74  eded by our unit
8ba0: 20 74 65 73 74 73 20 28 69 2e 65 2e 20 74 68 65   tests (i.e. the
8bb0: 20 53 79 73 74 65 6d 0d 0a 20 20 20 20 20 20 23   System..      #
8bc0: 20 20 20 20 20 20 20 61 6e 64 20 53 79 73 74 65         and Syste
8bd0: 6d 2e 44 61 74 61 20 61 73 73 65 6d 62 6c 79 20  m.Data assembly 
8be0: 72 65 66 65 72 65 6e 63 65 73 29 2e 0d 0a 20 20  references)...  
8bf0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 73 65 74      #..      set
8c00: 20 63 6f 6d 6d 61 6e 64 20 5b 6c 69 73 74 20 63   command [list c
8c10: 6f 6d 70 69 6c 65 43 53 68 61 72 70 20 24 74 65  ompileCSharp $te
8c20: 78 74 20 24 6d 65 6d 6f 72 79 20 24 73 79 6d 62  xt $memory $symb
8c30: 6f 6c 73 20 24 73 74 72 69 63 74 20 72 65 73 75  ols $strict resu
8c40: 6c 74 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  lts \..         
8c50: 20 65 72 72 6f 72 73 20 24 61 64 64 20 53 79 73   errors $add Sys
8c60: 74 65 6d 2e 64 6c 6c 20 24 61 64 64 20 53 79 73  tem.dll $add Sys
8c70: 74 65 6d 2e 44 61 74 61 2e 64 6c 6c 20 24 61 64  tem.Data.dll $ad
8c80: 64 20 53 79 73 74 65 6d 2e 58 6d 6c 2e 64 6c 6c  d System.Xml.dll
8c90: 5d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  ]....      #..  
8ca0: 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 64 64 20      # NOTE: Add 
8cb0: 61 6c 6c 20 74 68 65 20 70 72 6f 76 69 64 65 64  all the provided
8cc0: 20 66 69 6c 65 20 6e 61 6d 65 73 20 61 73 20 61   file names as a
8cd0: 73 73 65 6d 62 6c 79 20 72 65 66 65 72 65 6e 63  ssembly referenc
8ce0: 65 73 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  es...      #..  
8cf0: 20 20 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65      foreach file
8d00: 4e 61 6d 65 20 24 66 69 6c 65 4e 61 6d 65 73 20  Name $fileNames 
8d10: 7b 0d 0a 20 20 20 20 20 20 20 20 6c 61 70 70 65  {..        lappe
8d20: 6e 64 20 63 6f 6d 6d 61 6e 64 20 24 61 64 64 20  nd command $add 
8d30: 5b 67 65 74 42 69 6e 61 72 79 46 69 6c 65 4e 61  [getBinaryFileNa
8d40: 6d 65 20 24 66 69 6c 65 4e 61 6d 65 5d 0d 0a 20  me $fileName].. 
8d50: 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
8d60: 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
8d70: 20 41 64 64 20 74 68 65 20 65 78 74 72 61 20 61   Add the extra a
8d80: 72 67 75 6d 65 6e 74 73 2c 20 69 66 20 61 6e 79  rguments, if any
8d90: 2c 20 74 6f 20 74 68 65 20 63 6f 6d 6d 61 6e 64  , to the command
8da0: 20 74 6f 20 65 76 61 6c 75 61 74 65 2e 0d 0a 20   to evaluate... 
8db0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 65 76       #..      ev
8dc0: 61 6c 20 6c 61 70 70 65 6e 64 20 63 6f 6d 6d 61  al lappend comma
8dd0: 6e 64 20 24 61 72 67 73 0d 0a 0d 0a 20 20 20 20  nd $args....    
8de0: 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
8df0: 45 3a 20 41 6c 69 61 73 20 74 68 65 20 63 6f 6d  E: Alias the com
8e00: 70 69 6c 65 72 20 6c 6f 63 61 6c 20 72 65 73 75  piler local resu
8e10: 6c 74 73 20 61 6e 64 20 65 72 72 6f 72 73 20 76  lts and errors v
8e20: 61 72 69 61 62 6c 65 73 20 74 6f 20 74 68 65 0d  ariables to the.
8e30: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 76  .      #       v
8e40: 61 72 69 61 62 6c 65 20 6e 61 6d 65 73 20 70 72  ariable names pr
8e50: 6f 76 69 64 65 64 20 62 79 20 6f 75 72 20 63 61  ovided by our ca
8e60: 6c 6c 65 72 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  ller...      #..
8e70: 20 20 20 20 20 20 75 70 76 61 72 20 31 20 24 72        upvar 1 $r
8e80: 65 73 75 6c 74 73 56 61 72 4e 61 6d 65 20 72 65  esultsVarName re
8e90: 73 75 6c 74 73 0d 0a 20 20 20 20 20 20 75 70 76  sults..      upv
8ea0: 61 72 20 31 20 24 65 72 72 6f 72 73 56 61 72 4e  ar 1 $errorsVarN
8eb0: 61 6d 65 20 65 72 72 6f 72 73 0d 0a 0d 0a 20 20  ame errors....  
8ec0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
8ed0: 4f 54 45 3a 20 45 76 61 6c 75 61 74 65 20 74 68  OTE: Evaluate th
8ee0: 65 20 63 6f 6e 73 74 72 75 63 74 65 64 20 5b 63  e constructed [c
8ef0: 6f 6d 70 69 6c 65 43 53 68 61 72 70 5d 20 63 6f  ompileCSharp] co
8f00: 6d 6d 61 6e 64 20 61 6e 64 20 72 65 74 75 72 6e  mmand and return
8f10: 20 74 68 65 0d 0a 20 20 20 20 20 20 23 20 20 20   the..      #   
8f20: 20 20 20 20 72 65 73 75 6c 74 2e 0d 0a 20 20 20      result...   
8f30: 20 20 20 23 0d 0a 20 20 20 20 20 20 65 76 61 6c     #..      eval
8f40: 20 24 63 6f 6d 6d 61 6e 64 0d 0a 20 20 20 20 7d   $command..    }
8f50: 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 69 73  .....    proc is
8f60: 4d 65 6d 6f 72 79 44 62 20 7b 20 66 69 6c 65 4e  MemoryDb { fileN
8f70: 61 6d 65 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23  ame } {..      #
8f80: 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
8f90: 49 73 20 74 68 65 20 73 70 65 63 69 66 69 65 64  Is the specified
8fa0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6e   database file n
8fb0: 61 6d 65 20 72 65 61 6c 6c 79 20 61 6e 20 69 6e  ame really an in
8fc0: 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
8fd0: 3f 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ?..      #..    
8fe0: 20 20 72 65 74 75 72 6e 20 5b 65 78 70 72 20 7b    return [expr {
8ff0: 24 66 69 6c 65 4e 61 6d 65 20 65 71 20 22 3a 6d  $fileName eq ":m
9000: 65 6d 6f 72 79 3a 22 20 7c 7c 20 5c 0d 0a 20 20  emory:" || \..  
9010: 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20          [string 
9020: 72 61 6e 67 65 20 24 66 69 6c 65 4e 61 6d 65 20  range $fileName 
9030: 30 20 31 32 5d 20 65 71 20 22 66 69 6c 65 3a 3a  0 12] eq "file::
9040: 6d 65 6d 6f 72 79 3a 22 7d 5d 0d 0a 20 20 20 20  memory:"}]..    
9050: 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 69  }.....    proc i
9060: 73 54 61 62 6c 65 49 6e 44 62 20 7b 20 6e 61 6d  sTableInDb { nam
9070: 65 20 7b 76 61 72 4e 61 6d 65 20 64 62 7d 20 7d  e {varName db} }
9080: 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20   {..      #..   
9090: 20 20 20 23 20 4e 4f 54 45 3a 20 52 65 66 65 72     # NOTE: Refer
90a0: 20 74 6f 20 74 68 65 20 73 70 65 63 69 66 69 65   to the specifie
90b0: 64 20 76 61 72 69 61 62 6c 65 20 28 65 2e 67 2e  d variable (e.g.
90c0: 20 22 64 62 22 29 20 69 6e 20 74 68 65 20 63 6f   "db") in the co
90d0: 6e 74 65 78 74 20 6f 66 20 6f 75 72 0d 0a 20 20  ntext of our..  
90e0: 20 20 20 20 23 20 20 20 20 20 20 20 63 61 6c 6c      #       call
90f0: 65 72 2e 20 20 49 74 20 63 6f 6e 74 61 69 6e 73  er.  It contains
9100: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   the database co
9110: 6e 6e 65 63 74 69 6f 6e 20 68 61 6e 64 6c 65 20  nnection handle 
9120: 74 68 61 74 20 77 69 6c 6c 20 62 65 0d 0a 20 20  that will be..  
9130: 20 20 20 20 23 20 20 20 20 20 20 20 75 73 65 64      #       used
9140: 20 74 6f 20 65 78 65 63 75 74 65 20 74 68 65 20   to execute the 
9150: 71 75 65 72 79 20 75 73 65 64 20 74 6f 20 64 65  query used to de
9160: 74 65 72 6d 69 6e 65 20 69 66 20 74 68 65 20 6e  termine if the n
9170: 61 6d 65 64 20 74 61 62 6c 65 20 69 73 0d 0a 20  amed table is.. 
9180: 20 20 20 20 20 23 20 20 20 20 20 20 20 70 72 65       #       pre
9190: 73 65 6e 74 20 69 6e 20 74 68 61 74 20 64 61 74  sent in that dat
91a0: 61 62 61 73 65 2e 0d 0a 20 20 20 20 20 20 23 0d  abase...      #.
91b0: 0a 20 20 20 20 20 20 75 70 76 61 72 20 31 20 24  .      upvar 1 $
91c0: 76 61 72 4e 61 6d 65 20 64 62 0d 0a 0d 0a 20 20  varName db....  
91d0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
91e0: 4f 54 45 3a 20 45 78 65 63 75 74 65 20 74 68 65  OTE: Execute the
91f0: 20 53 51 4c 20 71 75 65 72 79 20 61 67 61 69 6e   SQL query again
9200: 73 74 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61  st the sqlite_ma
9210: 73 74 65 72 20 74 61 62 6c 65 20 74 6f 20 63 68  ster table to ch
9220: 65 63 6b 20 69 66 0d 0a 20 20 20 20 20 20 23 20  eck if..      # 
9230: 20 20 20 20 20 20 74 68 65 20 6e 61 6d 65 64 20        the named 
9240: 74 61 62 6c 65 20 69 73 20 70 72 65 73 65 6e 74  table is present
9250: 20 61 6e 64 20 72 65 74 75 72 6e 20 6e 6f 6e 2d   and return non-
9260: 7a 65 72 6f 20 69 66 20 69 74 20 69 73 2e 0d 0a  zero if it is...
9270: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 72        #..      r
9280: 65 74 75 72 6e 20 5b 65 78 70 72 20 7b 5b 73 71  eturn [expr {[sq
9290: 6c 20 65 78 65 63 75 74 65 20 2d 65 78 65 63 75  l execute -execu
92a0: 74 65 20 73 63 61 6c 61 72 20 24 64 62 20 5c 0d  te scalar $db \.
92b0: 0a 20 20 20 20 20 20 20 20 20 20 22 53 45 4c 45  .          "SELE
92c0: 43 54 20 43 4f 55 4e 54 28 2a 29 20 46 52 4f 4d  CT COUNT(*) FROM
92d0: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 57   sqlite_master W
92e0: 48 45 52 45 20 74 79 70 65 20 3d 20 27 74 61 62  HERE type = 'tab
92f0: 6c 65 27 20 41 4e 44 20 6e 61 6d 65 20 3d 20 3f  le' AND name = ?
9300: 3b 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  ;" \..          
9310: 5b 6c 69 73 74 20 70 61 72 61 6d 31 20 53 74 72  [list param1 Str
9320: 69 6e 67 20 24 6e 61 6d 65 5d 5d 20 3e 20 30 7d  ing $name]] > 0}
9330: 5d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  ]..    }.....   
9340: 20 70 72 6f 63 20 74 72 69 6d 53 71 6c 20 7b 20   proc trimSql { 
9350: 73 71 6c 20 7d 20 7b 0d 0a 20 20 20 20 20 20 73  sql } {..      s
9360: 65 74 20 72 65 73 75 6c 74 20 5b 73 74 72 69 6e  et result [strin
9370: 67 20 6d 61 70 20 5b 6c 69 73 74 20 5c 72 5c 6e  g map [list \r\n
9380: 20 22 20 22 20 5c 72 20 22 20 22 20 5c 6e 20 22   " " \r " " \n "
9390: 20 22 5d 20 24 73 71 6c 5d 0d 0a 0d 0a 20 20 20   "] $sql]....   
93a0: 20 20 20 77 68 69 6c 65 20 7b 5b 73 74 72 69 6e     while {[strin
93b0: 67 20 66 69 72 73 74 20 22 20 20 22 20 24 72 65  g first "  " $re
93c0: 73 75 6c 74 5d 20 21 3d 20 2d 31 7d 20 7b 0d 0a  sult] != -1} {..
93d0: 20 20 20 20 20 20 20 20 73 65 74 20 72 65 73 75          set resu
93e0: 6c 74 20 5b 73 74 72 69 6e 67 20 6d 61 70 20 5b  lt [string map [
93f0: 6c 69 73 74 20 22 20 20 22 20 22 20 22 5d 20 24  list "  " " "] $
9400: 72 65 73 75 6c 74 5d 0d 0a 20 20 20 20 20 20 7d  result]..      }
9410: 0d 0a 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ....      return
9420: 20 24 72 65 73 75 6c 74 0d 0a 20 20 20 20 7d 0d   $result..    }.
9430: 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 65 78 65  ....    proc exe
9440: 63 75 74 65 53 71 6c 20 7b 20 73 71 6c 20 7b 65  cuteSql { sql {e
9450: 78 65 63 75 74 65 20 6e 6f 6e 65 7d 20 7b 66 69  xecute none} {fi
9460: 6c 65 4e 61 6d 65 20 22 22 7d 20 7d 20 7b 0d 0a  leName ""} } {..
9470: 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e        if {[strin
9480: 67 20 6c 65 6e 67 74 68 20 24 66 69 6c 65 4e 61  g length $fileNa
9490: 6d 65 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b  me] == 0} then {
94a0: 73 65 74 20 66 69 6c 65 4e 61 6d 65 20 3a 6d 65  set fileName :me
94b0: 6d 6f 72 79 3a 7d 0d 0a 20 20 20 20 20 20 73 65  mory:}..      se
94c0: 74 75 70 44 62 20 24 66 69 6c 65 4e 61 6d 65 20  tupDb $fileName 
94d0: 22 22 20 22 22 20 22 22 20 22 22 20 22 22 20 66  "" "" "" "" "" f
94e0: 61 6c 73 65 20 66 61 6c 73 65 20 66 61 6c 73 65  alse false false
94f0: 20 66 61 6c 73 65 20 6d 65 6d 44 62 0d 0a 0d 0a   false memDb....
9500: 20 20 20 20 20 20 74 72 79 20 7b 0d 0a 20 20 20        try {..   
9510: 20 20 20 20 20 72 65 74 75 72 6e 20 5b 73 71 6c       return [sql
9520: 20 65 78 65 63 75 74 65 20 2d 65 78 65 63 75 74   execute -execut
9530: 65 20 24 65 78 65 63 75 74 65 20 24 6d 65 6d 44  e $execute $memD
9540: 62 20 24 73 71 6c 5d 0d 0a 20 20 20 20 20 20 7d  b $sql]..      }
9550: 20 66 69 6e 61 6c 6c 79 20 7b 0d 0a 20 20 20 20   finally {..    
9560: 20 20 20 20 63 6c 65 61 6e 75 70 44 62 20 24 66      cleanupDb $f
9570: 69 6c 65 4e 61 6d 65 20 6d 65 6d 44 62 20 66 61  ileName memDb fa
9580: 6c 73 65 20 66 61 6c 73 65 0d 0a 20 20 20 20 20  lse false..     
9590: 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20   }..    }.....  
95a0: 20 20 70 72 6f 63 20 73 65 74 75 70 44 62 20 7b    proc setupDb {
95b0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 69  ..            fi
95c0: 6c 65 4e 61 6d 65 20 7b 6d 6f 64 65 20 22 22 7d  leName {mode ""}
95d0: 20 7b 64 61 74 65 54 69 6d 65 46 6f 72 6d 61 74   {dateTimeFormat
95e0: 20 22 22 7d 20 7b 64 61 74 65 54 69 6d 65 4b 69   ""} {dateTimeKi
95f0: 6e 64 20 22 22 7d 20 7b 66 6c 61 67 73 20 22 22  nd ""} {flags ""
9600: 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b  }..            {
9610: 65 78 74 72 61 20 22 22 7d 20 7b 71 75 61 6c 69  extra ""} {quali
9620: 66 79 20 74 72 75 65 7d 20 7b 64 65 6c 65 74 65  fy true} {delete
9630: 20 74 72 75 65 7d 20 7b 75 72 69 20 66 61 6c 73   true} {uri fals
9640: 65 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  e}..            
9650: 7b 74 65 6d 70 6f 72 61 72 79 20 74 72 75 65 7d  {temporary true}
9660: 20 7b 76 61 72 4e 61 6d 65 20 64 62 7d 20 7d 20   {varName db} } 
9670: 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  {..      #..    
9680: 20 20 23 20 4e 4f 54 45 3a 20 46 69 72 73 74 2c    # NOTE: First,
9690: 20 73 65 65 20 69 66 20 6f 75 72 20 63 61 6c 6c   see if our call
96a0: 65 72 20 68 61 73 20 72 65 71 75 65 73 74 65 64  er has requested
96b0: 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61   an in-memory da
96c0: 74 61 62 61 73 65 2e 0d 0a 20 20 20 20 20 20 23  tabase...      #
96d0: 0d 0a 20 20 20 20 20 20 73 65 74 20 69 73 4d 65  ..      set isMe
96e0: 6d 6f 72 79 20 5b 69 73 4d 65 6d 6f 72 79 44 62  mory [isMemoryDb
96f0: 20 24 66 69 6c 65 4e 61 6d 65 5d 0d 0a 0d 0a 20   $fileName].... 
9700: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
9710: 4e 4f 54 45 3a 20 46 6f 72 20 6e 6f 77 2c 20 61  NOTE: For now, a
9720: 6c 6c 20 74 65 73 74 20 64 61 74 61 62 61 73 65  ll test database
9730: 73 20 75 73 65 64 20 62 79 20 74 68 65 20 74 65  s used by the te
9740: 73 74 20 73 75 69 74 65 20 61 72 65 20 70 6c 61  st suite are pla
9750: 63 65 64 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ced..      #    
9760: 20 20 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61     into the data
9770: 62 61 73 65 20 64 69 72 65 63 74 6f 72 79 2e 20  base directory. 
9780: 20 45 61 63 68 20 64 61 74 61 62 61 73 65 20 61   Each database a
9790: 6e 64 20 72 65 6c 61 74 65 64 20 66 69 6c 65 73  nd related files
97a0: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
97b0: 75 73 65 64 20 62 79 20 61 20 74 65 73 74 20 73  used by a test s
97c0: 68 6f 75 6c 64 20 62 65 20 63 6c 65 61 6e 65 64  hould be cleaned
97d0: 20 75 70 20 62 79 20 74 68 61 74 20 74 65 73 74   up by that test
97e0: 20 75 73 69 6e 67 20 74 68 65 0d 0a 20 20 20 20   using the..    
97f0: 20 20 23 20 20 20 20 20 20 20 22 63 6c 65 61 6e    #       "clean
9800: 75 70 44 62 22 20 70 72 6f 63 65 64 75 72 65 2c  upDb" procedure,
9810: 20 62 65 6c 6f 77 2e 0d 0a 20 20 20 20 20 20 23   below...      #
9820: 0d 0a 20 20 20 20 20 20 69 66 20 7b 21 24 69 73  ..      if {!$is
9830: 4d 65 6d 6f 72 79 20 26 26 20 24 71 75 61 6c 69  Memory && $quali
9840: 66 79 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  fy} then {..    
9850: 20 20 20 20 73 65 74 20 66 69 6c 65 4e 61 6d 65      set fileName
9860: 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5b 67 65 74   [file join [get
9870: 44 61 74 61 62 61 73 65 44 69 72 65 63 74 6f 72  DatabaseDirector
9880: 79 5d 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 66  y] [file tail $f
9890: 69 6c 65 4e 61 6d 65 5d 5d 0d 0a 20 20 20 20 20  ileName]]..     
98a0: 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20   }....      #.. 
98b0: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 42 79 20       # NOTE: By 
98c0: 64 65 66 61 75 6c 74 2c 20 64 65 6c 65 74 65 20  default, delete 
98d0: 61 6e 79 20 70 72 65 2d 65 78 69 73 74 69 6e 67  any pre-existing
98e0: 20 64 61 74 61 62 61 73 65 20 77 69 74 68 20 74   database with t
98f0: 68 65 20 73 61 6d 65 20 66 69 6c 65 0d 0a 20 20  he same file..  
9900: 20 20 20 20 23 20 20 20 20 20 20 20 6e 61 6d 65      #       name
9910: 20 69 66 20 69 74 20 63 75 72 72 65 6e 74 6c 79   if it currently
9920: 20 65 78 69 73 74 73 2e 0d 0a 20 20 20 20 20 20   exists...      
9930: 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 21 24 69  #..      if {!$i
9940: 73 4d 65 6d 6f 72 79 20 26 26 20 24 64 65 6c 65  sMemory && $dele
9950: 74 65 20 26 26 20 5b 66 69 6c 65 20 65 78 69 73  te && [file exis
9960: 74 73 20 24 66 69 6c 65 4e 61 6d 65 5d 7d 20 74  ts $fileName]} t
9970: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  hen {..        #
9980: 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
9990: 3a 20 41 74 74 65 6d 70 74 20 74 6f 20 64 65 6c  : Attempt to del
99a0: 65 74 65 20 61 6e 79 20 70 72 65 2d 65 78 69 73  ete any pre-exis
99b0: 74 69 6e 67 20 64 61 74 61 62 61 73 65 20 77 69  ting database wi
99c0: 74 68 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65  th the same file
99d0: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
99e0: 20 20 6e 61 6d 65 2e 0d 0a 20 20 20 20 20 20 20    name...       
99f0: 20 23 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b   #..        if {
9a00: 5b 63 61 74 63 68 20 7b 66 69 6c 65 20 64 65 6c  [catch {file del
9a10: 65 74 65 20 24 66 69 6c 65 4e 61 6d 65 7d 20 65  ete $fileName} e
9a20: 72 72 6f 72 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  rror]} then {.. 
9a30: 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
9a40: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 57 65        # NOTE: We
9a50: 20 73 6f 6d 65 68 6f 77 20 66 61 69 6c 65 64 20   somehow failed 
9a60: 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20 66 69  to delete the fi
9a70: 6c 65 2c 20 72 65 70 6f 72 74 20 77 68 79 2e 0d  le, report why..
9a80: 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
9a90: 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
9aa0: 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61  :test_channel [a
9ab0: 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
9ac0: 20 20 20 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d             "====
9ad0: 20 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64   WARNING: failed
9ae0: 20 74 6f 20 64 65 6c 65 74 65 20 64 61 74 61 62   to delete datab
9af0: 61 73 65 20 66 69 6c 65 20 5c 22 22 20 24 66 69  ase file \"" $fi
9b00: 6c 65 4e 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20  leName \..      
9b10: 20 20 20 20 20 20 20 20 22 5c 22 20 64 75 72 69          "\" duri
9b20: 6e 67 20 73 65 74 75 70 2c 20 65 72 72 6f 72 3a  ng setup, error:
9b30: 20 22 20 5c 6e 5c 74 20 24 65 72 72 6f 72 20 5c   " \n\t $error \
9b40: 6e 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20  n]..        }.. 
9b50: 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
9b60: 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
9b70: 20 52 65 66 65 72 20 74 6f 20 74 68 65 20 73 70   Refer to the sp
9b80: 65 63 69 66 69 65 64 20 76 61 72 69 61 62 6c 65  ecified variable
9b90: 20 28 65 2e 67 2e 20 22 64 62 22 29 20 69 6e 20   (e.g. "db") in 
9ba0: 74 68 65 20 63 6f 6e 74 65 78 74 20 6f 66 20 6f  the context of o
9bb0: 75 72 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  ur..      #     
9bc0: 20 20 63 61 6c 6c 65 72 2e 20 20 54 68 65 20 68    caller.  The h
9bd0: 61 6e 64 6c 65 20 74 6f 20 74 68 65 20 6f 70 65  andle to the ope
9be0: 6e 65 64 20 64 61 74 61 62 61 73 65 20 77 69 6c  ned database wil
9bf0: 6c 20 62 65 20 73 74 6f 72 65 64 20 74 68 65 72  l be stored ther
9c00: 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  e...      #..   
9c10: 20 20 20 75 70 76 61 72 20 31 20 24 76 61 72 4e     upvar 1 $varN
9c20: 61 6d 65 20 64 62 0d 0a 0d 0a 20 20 20 20 20 20  ame db....      
9c30: 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
9c40: 20 53 74 61 72 74 20 62 75 69 6c 64 69 6e 67 20   Start building 
9c50: 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73  the connection s
9c60: 74 72 69 6e 67 2e 20 20 54 68 65 20 6f 6e 6c 79  tring.  The only
9c70: 20 72 65 71 75 69 72 65 64 20 70 6f 72 74 69 6f   required portio
9c80: 6e 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  n..      #      
9c90: 20 6f 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69   of the connecti
9ca0: 6f 6e 20 73 74 72 69 6e 67 20 69 73 20 74 68 65  on string is the
9cb0: 20 64 61 74 61 20 73 6f 75 72 63 65 2c 20 77 68   data source, wh
9cc0: 69 63 68 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  ich contains the
9cd0: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
9ce0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6e 61  database file na
9cf0: 6d 65 20 69 74 73 65 6c 66 2e 20 20 49 66 20 6f  me itself.  If o
9d00: 75 72 20 63 61 6c 6c 65 72 20 77 61 6e 74 73 20  ur caller wants 
9d10: 74 6f 20 75 73 65 20 61 20 55 52 49 20 61 73 0d  to use a URI as.
9d20: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74  .      #       t
9d30: 68 65 20 64 61 74 61 20 73 6f 75 72 63 65 2c 20  he data source, 
9d40: 75 73 65 20 74 68 65 20 46 75 6c 6c 55 72 69 20  use the FullUri 
9d50: 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 74 72 69 6e  connection strin
9d60: 67 20 70 72 6f 70 65 72 74 79 20 74 6f 0d 0a 20  g property to.. 
9d70: 20 20 20 20 20 23 20 20 20 20 20 20 20 70 72 65       #       pre
9d80: 76 65 6e 74 20 74 68 65 20 64 61 74 61 20 73 6f  vent the data so
9d90: 75 72 63 65 20 73 74 72 69 6e 67 20 66 72 6f 6d  urce string from
9da0: 20 62 65 69 6e 67 20 6d 61 6e 67 6c 65 64 2e 0d   being mangled..
9db0: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
9dc0: 69 66 20 7b 24 75 72 69 7d 20 74 68 65 6e 20 7b  if {$uri} then {
9dd0: 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 63 6f  ..        set co
9de0: 6e 6e 65 63 74 69 6f 6e 20 7b 46 75 6c 6c 55 72  nnection {FullUr
9df0: 69 3d 24 7b 66 69 6c 65 4e 61 6d 65 7d 7d 0d 0a  i=${fileName}}..
9e00: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
9e10: 20 20 20 20 20 20 20 20 73 65 74 20 63 6f 6e 6e          set conn
9e20: 65 63 74 69 6f 6e 20 7b 44 61 74 61 20 53 6f 75  ection {Data Sou
9e30: 72 63 65 3d 24 7b 66 69 6c 65 4e 61 6d 65 7d 7d  rce=${fileName}}
9e40: 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
9e50: 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
9e60: 54 45 3a 20 53 69 6e 63 65 20 74 68 69 73 20 70  TE: Since this p
9e70: 72 6f 63 65 64 75 72 65 20 68 61 73 20 6e 6f 20  rocedure has no 
9e80: 73 70 65 63 69 61 6c 20 6b 6e 6f 77 6c 65 64 67  special knowledg
9e90: 65 20 6f 66 20 77 68 61 74 20 74 68 65 20 64 65  e of what the de
9ea0: 66 61 75 6c 74 0d 0a 20 20 20 20 20 20 23 20 20  fault..      #  
9eb0: 20 20 20 20 20 73 65 74 74 69 6e 67 20 69 73 20       setting is 
9ec0: 66 6f 72 20 74 68 65 20 54 6f 46 75 6c 6c 50 61  for the ToFullPa
9ed0: 74 68 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 74  th connection st
9ee0: 72 69 6e 67 20 70 72 6f 70 65 72 79 2c 20 61 6c  ring propery, al
9ef0: 77 61 79 73 0d 0a 20 20 20 20 20 20 23 20 20 20  ways..      #   
9f00: 20 20 20 20 61 64 64 20 74 68 65 20 76 61 6c 75      add the valu
9f10: 65 20 77 65 20 6b 6e 6f 77 20 61 62 6f 75 74 20  e we know about 
9f20: 74 6f 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  to the connectio
9f30: 6e 20 73 74 72 69 6e 67 2e 0d 0a 20 20 20 20 20  n string...     
9f40: 20 23 0d 0a 20 20 20 20 20 20 61 70 70 65 6e 64   #..      append
9f50: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 7b 3b 54 6f   connection {;To
9f60: 46 75 6c 6c 50 61 74 68 3d 24 7b 71 75 61 6c 69  FullPath=${quali
9f70: 66 79 7d 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d  fy}}....      #.
9f80: 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49  .      # NOTE: I
9f90: 66 20 6f 75 72 20 63 61 6c 6c 65 72 20 73 70 65  f our caller spe
9fa0: 63 69 66 69 65 64 20 61 20 6a 6f 75 72 6e 61 6c  cified a journal
9fb0: 20 6d 6f 64 65 2c 20 61 64 64 20 74 68 65 20 6e   mode, add the n
9fc0: 65 63 65 73 73 61 72 79 20 70 6f 72 74 69 6f 6e  ecessary portion
9fd0: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
9fe0: 6f 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  of the connectio
9ff0: 6e 20 73 74 72 69 6e 67 20 6e 6f 77 2e 0d 0a 20  n string now... 
a000: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66       #..      if
a010: 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68   {[string length
a020: 20 24 6d 6f 64 65 5d 20 3e 20 30 7d 20 74 68 65   $mode] > 0} the
a030: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 61 70 70  n {..        app
a040: 65 6e 64 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 7b  end connection {
a050: 3b 4a 6f 75 72 6e 61 6c 20 4d 6f 64 65 3d 24 7b  ;Journal Mode=${
a060: 6d 6f 64 65 7d 7d 0d 0a 20 20 20 20 20 20 7d 0d  mode}}..      }.
a070: 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
a080: 20 20 23 20 4e 4f 54 45 3a 20 49 66 20 6f 75 72    # NOTE: If our
a090: 20 63 61 6c 6c 65 72 20 73 70 65 63 69 66 69 65   caller specifie
a0a0: 64 20 61 20 44 61 74 65 54 69 6d 65 20 66 6f 72  d a DateTime for
a0b0: 6d 61 74 2c 20 61 64 64 20 74 68 65 20 6e 65 63  mat, add the nec
a0c0: 65 73 73 61 72 79 0d 0a 20 20 20 20 20 20 23 20  essary..      # 
a0d0: 20 20 20 20 20 20 70 6f 72 74 69 6f 6e 20 6f 66        portion of
a0e0: 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
a0f0: 73 74 72 69 6e 67 20 6e 6f 77 2e 0d 0a 20 20 20  string now...   
a100: 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
a110: 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
a120: 64 61 74 65 54 69 6d 65 46 6f 72 6d 61 74 5d 20  dateTimeFormat] 
a130: 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  > 0} then {..   
a140: 20 20 20 20 20 61 70 70 65 6e 64 20 63 6f 6e 6e       append conn
a150: 65 63 74 69 6f 6e 20 7b 3b 44 61 74 65 54 69 6d  ection {;DateTim
a160: 65 46 6f 72 6d 61 74 3d 24 7b 64 61 74 65 54 69  eFormat=${dateTi
a170: 6d 65 46 6f 72 6d 61 74 7d 7d 0d 0a 20 20 20 20  meFormat}}..    
a180: 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a    }....      #..
a190: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 66        # NOTE: If
a1a0: 20 6f 75 72 20 63 61 6c 6c 65 72 20 73 70 65 63   our caller spec
a1b0: 69 66 69 65 64 20 61 20 44 61 74 65 54 69 6d 65  ified a DateTime
a1c0: 4b 69 6e 64 2c 20 61 64 64 20 74 68 65 20 6e 65  Kind, add the ne
a1d0: 63 65 73 73 61 72 79 20 70 6f 72 74 69 6f 6e 0d  cessary portion.
a1e0: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 6f  .      #       o
a1f0: 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  f the connection
a200: 20 73 74 72 69 6e 67 20 6e 6f 77 2e 0d 0a 20 20   string now...  
a210: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20      #..      if 
a220: 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20  {[string length 
a230: 24 64 61 74 65 54 69 6d 65 4b 69 6e 64 5d 20 3e  $dateTimeKind] >
a240: 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
a250: 20 20 20 20 61 70 70 65 6e 64 20 63 6f 6e 6e 65      append conne
a260: 63 74 69 6f 6e 20 7b 3b 44 61 74 65 54 69 6d 65  ction {;DateTime
a270: 4b 69 6e 64 3d 24 7b 64 61 74 65 54 69 6d 65 4b  Kind=${dateTimeK
a280: 69 6e 64 7d 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a  ind}}..      }..
a290: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
a2a0: 20 23 20 4e 4f 54 45 3a 20 49 66 20 74 68 65 72   # NOTE: If ther
a2b0: 65 20 61 72 65 20 61 6e 79 20 67 6c 6f 62 61 6c  e are any global
a2c0: 20 28 70 65 72 20 74 65 73 74 20 72 75 6e 29 20   (per test run) 
a2d0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 6c 61 67 73  connection flags
a2e0: 20 63 75 72 72 65 6e 74 6c 79 0d 0a 20 20 20 20   currently..    
a2f0: 20 20 23 20 20 20 20 20 20 20 73 65 74 2c 20 75    #       set, u
a300: 73 65 20 74 68 65 6d 20 6e 6f 77 20 28 69 2e 65  se them now (i.e
a310: 2e 20 62 79 20 63 6f 6d 62 69 6e 69 6e 67 20 74  . by combining t
a320: 68 65 6d 20 77 69 74 68 20 74 68 65 20 6f 6e 65  hem with the one
a330: 73 20 66 6f 72 20 74 68 69 73 0d 0a 20 20 20 20  s for this..    
a340: 20 20 23 20 20 20 20 20 20 20 63 6f 6e 6e 65 63    #       connec
a350: 74 69 6f 6e 29 2e 0d 0a 20 20 20 20 20 20 23 0d  tion)...      #.
a360: 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f  .      if {[info
a370: 20 65 78 69 73 74 73 20 3a 3a 63 6f 6e 6e 65 63   exists ::connec
a380: 74 69 6f 6e 5f 66 6c 61 67 73 5d 20 26 26 20 5c  tion_flags] && \
a390: 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 73 74 72  ..          [str
a3a0: 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a 63 6f  ing length $::co
a3b0: 6e 6e 65 63 74 69 6f 6e 5f 66 6c 61 67 73 5d 20  nnection_flags] 
a3c0: 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  > 0} then {..   
a3d0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
a3e0: 23 20 4e 4f 54 45 3a 20 53 68 6f 77 20 28 61 6e  # NOTE: Show (an
a3f0: 64 20 6c 6f 67 29 20 74 68 61 74 20 77 65 20 64  d log) that we d
a400: 65 74 65 63 74 65 64 20 73 6f 6d 65 20 67 6c 6f  etected some glo
a410: 62 61 6c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66  bal connection f
a420: 6c 61 67 73 2e 0d 0a 20 20 20 20 20 20 20 20 23  lags...        #
a430: 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20  ..        tputs 
a440: 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
a450: 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
a460: 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
a470: 20 67 6c 6f 62 61 6c 20 63 6f 6e 6e 65 63 74 69   global connecti
a480: 6f 6e 20 66 6c 61 67 73 20 64 65 74 65 63 74 65  on flags detecte
a490: 64 3a 20 22 20 24 3a 3a 63 6f 6e 6e 65 63 74 69  d: " $::connecti
a4a0: 6f 6e 5f 66 6c 61 67 73 20 5c 6e 5d 0d 0a 0d 0a  on_flags \n]....
a4b0: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
a4c0: 20 20 20 23 20 4e 4f 54 45 3a 20 43 6f 6d 62 69     # NOTE: Combi
a4d0: 6e 65 20 61 6e 64 2f 6f 72 20 72 65 70 6c 61 63  ne and/or replac
a4e0: 65 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  e the connection
a4f0: 20 66 6c 61 67 73 20 61 6e 64 20 74 68 65 6e 20   flags and then 
a500: 73 68 6f 77 20 74 68 65 0d 0a 20 20 20 20 20 20  show the..      
a510: 20 20 23 20 20 20 20 20 20 20 6e 65 77 20 76 61    #       new va
a520: 6c 75 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  lue...        #.
a530: 0a 20 20 20 20 20 20 20 20 73 65 74 20 66 6c 61  .        set fla
a540: 67 73 20 5b 63 6f 6d 62 69 6e 65 46 6c 61 67 73  gs [combineFlags
a550: 20 24 66 6c 61 67 73 20 24 3a 3a 63 6f 6e 6e 65   $flags $::conne
a560: 63 74 69 6f 6e 5f 66 6c 61 67 73 5d 0d 0a 0d 0a  ction_flags]....
a570: 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
a580: 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61  :test_channel [a
a590: 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
a5a0: 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63           "---- c
a5b0: 6f 6d 62 69 6e 65 64 20 63 6f 6e 6e 65 63 74 69  ombined connecti
a5c0: 6f 6e 20 66 6c 61 67 73 20 61 72 65 3a 20 22 20  on flags are: " 
a5d0: 24 66 6c 61 67 73 20 5c 6e 5d 0d 0a 20 20 20 20  $flags \n]..    
a5e0: 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a    }....      #..
a5f0: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 66        # NOTE: If
a600: 20 6f 75 72 20 63 61 6c 6c 65 72 20 73 70 65 63   our caller spec
a610: 69 66 69 65 64 20 73 6f 6d 65 20 53 51 4c 69 74  ified some SQLit
a620: 65 43 6f 6e 6e 65 63 74 69 6f 6e 46 6c 61 67 73  eConnectionFlags
a630: 2c 20 61 64 64 20 74 68 65 0d 0a 20 20 20 20 20  , add the..     
a640: 20 23 20 20 20 20 20 20 20 6e 65 63 65 73 73 61   #       necessa
a650: 72 79 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68  ry portion of th
a660: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 74 72  e connection str
a670: 69 6e 67 20 6e 6f 77 2e 0d 0a 20 20 20 20 20 20  ing now...      
a680: 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 73 74  #..      if {[st
a690: 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 66 6c 61  ring length $fla
a6a0: 67 73 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d  gs] > 0} then {.
a6b0: 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 20  .        append 
a6c0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 7b 3b 46 6c 61  connection {;Fla
a6d0: 67 73 3d 24 7b 66 6c 61 67 73 7d 7d 0d 0a 20 20  gs=${flags}}..  
a6e0: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23      }....      #
a6f0: 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
a700: 49 66 20 6f 75 72 20 63 61 6c 6c 65 72 20 73 70  If our caller sp
a710: 65 63 69 66 69 65 64 20 61 6e 20 65 78 74 72 61  ecified an extra
a720: 20 70 61 79 6c 6f 61 64 20 74 6f 20 74 68 65 20   payload to the 
a730: 63 6f 6e 6e 65 63 74 69 6f 6e 0d 0a 20 20 20 20  connection..    
a740: 20 20 23 20 20 20 20 20 20 20 73 74 72 69 6e 67    #       string
a750: 2c 20 61 70 70 65 6e 64 20 69 74 20 6e 6f 77 2e  , append it now.
a760: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
a770: 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e   if {[string len
a780: 67 74 68 20 24 65 78 74 72 61 5d 20 3e 20 30 7d  gth $extra] > 0}
a790: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
a7a0: 20 61 70 70 65 6e 64 20 63 6f 6e 6e 65 63 74 69   append connecti
a7b0: 6f 6e 20 5c 3b 20 24 65 78 74 72 61 0d 0a 20 20  on \; $extra..  
a7c0: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23      }....      #
a7d0: 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
a7e0: 4f 70 65 6e 20 74 68 65 20 64 61 74 61 62 61 73  Open the databas
a7f0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6e 6f 77  e connection now
a800: 2c 20 70 6c 61 63 69 6e 67 20 74 68 65 20 6f 70  , placing the op
a810: 61 71 75 65 20 68 61 6e 64 6c 65 20 76 61 6c 75  aque handle valu
a820: 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  e..      #      
a830: 20 69 6e 74 6f 20 74 68 65 20 76 61 72 69 61 62   into the variab
a840: 6c 65 20 73 70 65 63 69 66 69 65 64 20 62 79 20  le specified by 
a850: 6f 75 72 20 63 61 6c 6c 65 72 2e 0d 0a 20 20 20  our caller...   
a860: 20 20 20 23 0d 0a 20 20 20 20 20 20 73 65 74 20     #..      set 
a870: 64 62 20 5b 73 71 6c 20 6f 70 65 6e 20 2d 74 79  db [sql open -ty
a880: 70 65 20 53 51 4c 69 74 65 20 5b 73 75 62 73 74  pe SQLite [subst
a890: 20 24 63 6f 6e 6e 65 63 74 69 6f 6e 5d 5d 0d 0a   $connection]]..
a8a0: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
a8b0: 20 23 20 4e 4f 54 45 3a 20 43 6f 6e 66 69 67 75   # NOTE: Configu
a8c0: 72 65 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  re the temporary
a8d0: 20 64 69 72 65 63 74 6f 72 79 20 66 6f 72 20 74   directory for t
a8e0: 68 65 20 6e 65 77 6c 79 20 6f 70 65 6e 65 64 20  he newly opened 
a8f0: 64 61 74 61 62 61 73 65 0d 0a 20 20 20 20 20 20  database..      
a900: 23 20 20 20 20 20 20 20 63 6f 6e 6e 65 63 74 69  #       connecti
a910: 6f 6e 20 6e 6f 77 20 75 6e 6c 65 73 73 20 6f 75  on now unless ou
a920: 72 20 63 61 6c 6c 65 72 20 66 6f 72 62 69 64 73  r caller forbids
a930: 20 69 74 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20   it...      #.. 
a940: 20 20 20 20 20 69 66 20 7b 24 74 65 6d 70 6f 72       if {$tempor
a950: 61 72 79 20 26 26 20 21 5b 69 6e 66 6f 20 65 78  ary && ![info ex
a960: 69 73 74 73 20 3a 3a 6e 6f 28 73 65 74 54 65 6d  ists ::no(setTem
a970: 70 6f 72 61 72 79 44 69 72 65 63 74 6f 72 79 29  poraryDirectory)
a980: 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
a990: 20 20 20 73 71 6c 20 65 78 65 63 75 74 65 20 24     sql execute $
a9a0: 64 62 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  db [appendArgs \
a9b0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 50  ..            "P
a9c0: 52 41 47 4d 41 20 74 65 6d 70 5f 73 74 6f 72 65  RAGMA temp_store
a9d0: 5f 64 69 72 65 63 74 6f 72 79 20 3d 20 5c 22 22  _directory = \""
a9e0: 20 5b 67 65 74 54 65 6d 70 6f 72 61 72 79 44 69   [getTemporaryDi
a9f0: 72 65 63 74 6f 72 79 5d 20 5c 22 5c 3b 5d 0d 0a  rectory] \"\;]..
aa00: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
aa10: 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
aa20: 3a 20 41 6c 77 61 79 73 20 72 65 74 75 72 6e 20  : Always return 
aa30: 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68  the connection h
aa40: 61 6e 64 6c 65 20 75 70 6f 6e 20 73 75 63 63 65  andle upon succe
aa50: 73 73 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  ss...      #..  
aa60: 20 20 20 20 72 65 74 75 72 6e 20 24 64 62 0d 0a      return $db..
aa70: 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
aa80: 6f 63 20 67 65 74 44 62 43 6f 6e 6e 65 63 74 69  oc getDbConnecti
aa90: 6f 6e 20 7b 20 7b 76 61 72 4e 61 6d 65 20 64 62  on { {varName db
aaa0: 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a  } } {..      #..
aab0: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 52 65        # NOTE: Re
aac0: 66 65 72 20 74 6f 20 74 68 65 20 73 70 65 63 69  fer to the speci
aad0: 66 69 65 64 20 76 61 72 69 61 62 6c 65 20 28 65  fied variable (e
aae0: 2e 67 2e 20 22 64 62 22 29 20 69 6e 20 74 68 65  .g. "db") in the
aaf0: 20 63 6f 6e 74 65 78 74 20 6f 66 20 6f 75 72 0d   context of our.
ab00: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63  .      #       c
ab10: 61 6c 6c 65 72 2e 20 20 54 68 65 20 68 61 6e 64  aller.  The hand
ab20: 6c 65 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  le to the databa
ab30: 73 65 20 70 72 65 76 69 6f 75 73 6c 79 20 6f 70  se previously op
ab40: 65 6e 65 64 20 76 69 61 20 74 68 65 0d 0a 20 20  ened via the..  
ab50: 20 20 20 20 23 20 20 20 20 20 20 20 5b 73 65 74      #       [set
ab60: 75 70 44 62 5d 20 70 72 6f 63 65 64 75 72 65 20  upDb] procedure 
ab70: 73 68 6f 75 6c 64 20 62 65 20 73 74 6f 72 65 64  should be stored
ab80: 20 74 68 65 72 65 2e 0d 0a 20 20 20 20 20 20 23   there...      #
ab90: 0d 0a 20 20 20 20 20 20 75 70 76 61 72 20 31 20  ..      upvar 1 
aba0: 24 76 61 72 4e 61 6d 65 20 64 62 0d 0a 0d 0a 20  $varName db.... 
abb0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
abc0: 4e 4f 54 45 3a 20 54 68 69 73 20 72 65 74 75 72  NOTE: This retur
abd0: 6e 73 20 74 68 65 20 41 44 4f 2e 4e 45 54 20 49  ns the ADO.NET I
abe0: 44 62 43 6f 6e 6e 65 63 74 69 6f 6e 20 6f 62 6a  DbConnection obj
abf0: 65 63 74 20 69 6e 73 74 61 6e 63 65 20 66 6f 72  ect instance for
ac00: 20 74 68 65 0d 0a 20 20 20 20 20 20 23 20 20 20   the..      #   
ac10: 20 20 20 20 73 70 65 63 69 66 69 65 64 20 64 61      specified da
ac20: 74 61 62 73 65 20 68 61 6e 64 6c 65 2e 20 20 53  tabse handle.  S
ac30: 69 6e 63 65 20 67 65 74 74 69 6e 67 20 74 68 69  ince getting thi
ac40: 73 20 6f 62 6a 65 63 74 20 72 65 6c 69 65 73 20  s object relies 
ac50: 75 70 6f 6e 0d 0a 20 20 20 20 20 20 23 20 20 20  upon..      #   
ac60: 20 20 20 20 45 61 67 6c 65 20 69 6e 74 65 72 6e      Eagle intern
ac70: 61 6c 73 2c 20 67 72 65 61 74 20 63 61 72 65 20  als, great care 
ac80: 73 68 6f 75 6c 64 20 62 65 20 74 61 6b 65 6e 20  should be taken 
ac90: 74 6f 20 61 76 6f 69 64 20 64 69 73 70 6f 73 69  to avoid disposi
aca0: 6e 67 20 6f 66 0d 0a 20 20 20 20 20 20 23 20 20  ng of..      #  
acb0: 20 20 20 20 20 74 68 69 73 20 6f 62 6a 65 63 74       this object
acc0: 20 6f 72 20 6f 74 68 65 72 77 69 73 65 20 70 75   or otherwise pu
acd0: 74 74 69 6e 67 20 69 74 20 69 6e 74 6f 20 61 6e  tting it into an
ace0: 20 69 6e 76 61 6c 69 64 20 73 74 61 74 65 2e 0d   invalid state..
acf0: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
ad00: 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73  if {[info exists
ad10: 20 64 62 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20   db]} then {..  
ad20: 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68        if {[catch
ad30: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
ad40: 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b      object invok
ad50: 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62  e -flags +NonPub
ad60: 6c 69 63 20 2d 6f 62 6a 65 63 74 66 6c 61 67 73  lic -objectflags
ad70: 20 2b 4e 6f 44 69 73 70 6f 73 65 20 5c 0d 0a 20   +NoDispose \.. 
ad80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2d                 -
ad90: 61 6c 69 61 73 20 49 6e 74 65 72 70 72 65 74 65  alias Interprete
ada0: 72 2e 47 65 74 41 63 74 69 76 65 2e 63 6f 6e 6e  r.GetActive.conn
adb0: 65 63 74 69 6f 6e 73 20 49 74 65 6d 20 24 64 62  ections Item $db
adc0: 7d 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  } \..           
add0: 20 20 20 20 20 72 65 73 75 6c 74 5d 20 3d 3d 20       result] == 
ade0: 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
adf0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
ae00: 20 20 23 20 4e 4f 54 45 3a 20 53 75 63 63 65 73    # NOTE: Succes
ae10: 73 2c 20 72 65 74 75 72 6e 20 74 68 65 20 6f 70  s, return the op
ae20: 61 71 75 65 20 6f 62 6a 65 63 74 20 68 61 6e 64  aque object hand
ae30: 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23  le...          #
ae40: 0d 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ..          retu
ae50: 72 6e 20 24 72 65 73 75 6c 74 0d 0a 20 20 20 20  rn $result..    
ae60: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
ae70: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
ae80: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 46 61 69       # NOTE: Fai
ae90: 6c 75 72 65 2c 20 72 65 70 6f 72 74 20 77 68 79  lure, report why
aea0: 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a  ...          #..
aeb0: 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
aec0: 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
aed0: 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
aee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 3d 3d               "==
aef0: 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c  == WARNING: fail
af00: 65 64 20 74 6f 20 67 65 74 20 63 6f 6e 6e 65 63  ed to get connec
af10: 74 69 6f 6e 20 68 61 6e 64 6c 65 20 66 6f 72 20  tion handle for 
af20: 64 61 74 61 62 61 73 65 20 5c 22 22 20 5c 0d 0a  database \"" \..
af30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 24 64                $d
af40: 62 20 22 5c 22 2c 20 65 72 72 6f 72 3a 20 22 20  b "\", error: " 
af50: 5c 6e 5c 74 20 24 72 65 73 75 6c 74 20 5c 6e 5d  \n\t $result \n]
af60: 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20  ..        }..   
af70: 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a     }..    }.....
af80: 20 20 20 20 70 72 6f 63 20 66 72 65 65 44 62 43      proc freeDbC
af90: 6f 6e 6e 65 63 74 69 6f 6e 20 7b 20 7b 76 61 72  onnection { {var
afa0: 4e 61 6d 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 7d  Name connection}
afb0: 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20   } {..      #.. 
afc0: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 52 65 66       # NOTE: Ref
afd0: 65 72 20 74 6f 20 74 68 65 20 73 70 65 63 69 66  er to the specif
afe0: 69 65 64 20 76 61 72 69 61 62 6c 65 20 28 65 2e  ied variable (e.
aff0: 67 2e 20 22 63 6f 6e 6e 65 63 74 69 6f 6e 22 29  g. "connection")
b000: 20 69 6e 20 74 68 65 0d 0a 20 20 20 20 20 20 23   in the..      #
b010: 20 20 20 20 20 20 20 63 6f 6e 74 65 78 74 20 6f         context o
b020: 66 20 6f 75 72 20 63 61 6c 6c 65 72 2e 20 20 54  f our caller.  T
b030: 68 65 20 6f 70 61 71 75 65 20 6f 62 6a 65 63 74  he opaque object
b040: 20 68 61 6e 64 6c 65 20 66 6f 72 20 61 6e 20 41   handle for an A
b050: 44 4f 2e 4e 45 54 0d 0a 20 20 20 20 20 20 23 20  DO.NET..      # 
b060: 20 20 20 20 20 20 63 6f 6e 6e 65 63 74 69 6f 6e        connection
b070: 20 70 72 65 76 69 6f 75 73 6c 79 20 72 65 74 75   previously retu
b080: 72 6e 65 64 20 62 79 20 5b 67 65 74 44 62 43 6f  rned by [getDbCo
b090: 6e 6e 65 63 74 69 6f 6e 5d 20 73 68 6f 75 6c 64  nnection] should
b0a0: 20 62 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20   be..      #    
b0b0: 20 20 20 73 74 6f 72 65 64 20 74 68 65 72 65 2e     stored there.
b0c0: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
b0d0: 20 75 70 76 61 72 20 31 20 24 76 61 72 4e 61 6d   upvar 1 $varNam
b0e0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0d 0a 0d 0a  e connection....
b0f0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
b100: 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74 20 74   NOTE: Attempt t
b110: 6f 20 72 65 6d 6f 76 65 20 74 68 65 20 6f 70 61  o remove the opa
b120: 71 75 65 20 6f 62 6a 65 63 74 20 68 61 6e 64 6c  que object handl
b130: 65 20 66 72 6f 6d 20 74 68 65 20 69 6e 74 65 72  e from the inter
b140: 70 72 65 74 65 72 0d 0a 20 20 20 20 20 20 23 20  preter..      # 
b150: 20 20 20 20 20 20 6e 6f 77 2e 20 20 54 68 69 73        now.  This
b160: 20 5b 6f 62 6a 65 63 74 20 64 69 73 70 6f 73 65   [object dispose
b170: 5d 20 63 61 6c 6c 20 77 69 6c 6c 20 6e 6f 74 20  ] call will not 
b180: 61 63 74 75 61 6c 6c 79 20 64 69 73 70 6f 73 65  actually dispose
b190: 20 6f 66 20 74 68 65 0d 0a 20 20 20 20 20 20 23   of the..      #
b1a0: 20 20 20 20 20 20 20 75 6e 64 65 72 6c 79 69 6e         underlyin
b1b0: 67 20 6f 62 6a 65 63 74 20 62 65 63 61 75 73 65  g object because
b1c0: 20 74 68 65 20 2b 4e 6f 44 69 73 70 6f 73 65 20   the +NoDispose 
b1d0: 66 6c 61 67 20 77 61 73 20 73 65 74 20 6f 6e 20  flag was set on 
b1e0: 69 74 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  it..      #     
b1f0: 20 20 64 75 72 69 6e 67 20 63 72 65 61 74 69 6f    during creatio
b200: 6e 20 6f 66 20 74 68 65 20 6f 70 61 71 75 65 20  n of the opaque 
b210: 6f 62 6a 65 63 74 20 68 61 6e 64 6c 65 2e 0d 0a  object handle...
b220: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69        #..      i
b230: 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20  f {[info exists 
b240: 63 6f 6e 6e 65 63 74 69 6f 6e 5d 20 26 26 20 5c  connection] && \
b250: 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 63 61 74  ..          [cat
b260: 63 68 20 7b 6f 62 6a 65 63 74 20 64 69 73 70 6f  ch {object dispo
b270: 73 65 20 24 63 6f 6e 6e 65 63 74 69 6f 6e 7d 20  se $connection} 
b280: 65 72 72 6f 72 5d 7d 20 74 68 65 6e 20 7b 0d 0a  error]} then {..
b290: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
b2a0: 20 20 20 23 20 4e 4f 54 45 3a 20 57 65 20 73 6f     # NOTE: We so
b2b0: 6d 65 68 6f 77 20 66 61 69 6c 65 64 20 74 6f 20  mehow failed to 
b2c0: 72 65 6d 6f 76 65 20 74 68 65 20 68 61 6e 64 6c  remove the handl
b2d0: 65 2c 20 72 65 70 6f 72 74 20 77 68 79 2e 0d 0a  e, report why...
b2e0: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
b2f0: 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
b300: 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  _channel [append
b310: 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
b320: 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e      "==== WARNIN
b330: 47 3a 20 66 61 69 6c 65 64 20 74 6f 20 72 65 6d  G: failed to rem
b340: 6f 76 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68  ove connection h
b350: 61 6e 64 6c 65 20 5c 22 22 20 24 63 6f 6e 6e 65  andle \"" $conne
b360: 63 74 69 6f 6e 20 5c 0d 0a 20 20 20 20 20 20 20  ction \..       
b370: 20 20 20 20 20 22 5c 22 2c 20 65 72 72 6f 72 3a       "\", error:
b380: 20 22 20 5c 6e 5c 74 20 24 65 72 72 6f 72 20 5c   " \n\t $error \
b390: 6e 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20  n]..      }..   
b3a0: 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
b3b0: 61 64 64 44 62 43 6f 6e 6e 65 63 74 69 6f 6e 20  addDbConnection 
b3c0: 7b 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 7b 76 61  { connection {va
b3d0: 72 4e 61 6d 65 20 64 62 7d 20 7d 20 7b 0d 0a 20  rName db} } {.. 
b3e0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
b3f0: 4e 4f 54 45 3a 20 52 65 66 65 72 20 74 6f 20 74  NOTE: Refer to t
b400: 68 65 20 73 70 65 63 69 66 69 65 64 20 76 61 72  he specified var
b410: 69 61 62 6c 65 20 28 65 2e 67 2e 20 22 64 62 22  iable (e.g. "db"
b420: 29 20 69 6e 20 74 68 65 20 63 6f 6e 74 65 78 74  ) in the context
b430: 20 6f 66 20 6f 75 72 0d 0a 20 20 20 20 20 20 23   of our..      #
b440: 20 20 20 20 20 20 20 63 61 6c 6c 65 72 2e 0d 0a         caller...
b450: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 75        #..      u
b460: 70 76 61 72 20 31 20 24 76 61 72 4e 61 6d 65 20  pvar 1 $varName 
b470: 64 62 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20  db....      #.. 
b480: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 72 65       # NOTE: Cre
b490: 61 74 65 20 61 20 63 6f 72 72 65 63 74 6c 79 20  ate a correctly 
b4a0: 66 6f 72 6d 61 74 74 65 64 20 6e 61 6d 65 20 66  formatted name f
b4b0: 6f 72 20 74 68 65 20 64 61 74 61 62 61 73 65 20  or the database 
b4c0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 0d 0a 20  connection to.. 
b4d0: 20 20 20 20 20 23 20 20 20 20 20 20 20 62 65 20       #       be 
b4e0: 61 64 64 65 64 20 74 6f 20 74 68 65 20 6c 69 73  added to the lis
b4f0: 74 20 6d 61 6e 61 67 65 64 20 62 79 20 74 68 65  t managed by the
b500: 20 45 61 67 6c 65 20 69 6e 74 65 72 70 72 65 74   Eagle interpret
b510: 65 72 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  er...      #..  
b520: 20 20 20 20 73 65 74 20 64 62 20 5b 6f 62 6a 65      set db [obje
b530: 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73  ct invoke -flags
b540: 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20   +NonPublic \.. 
b550: 20 20 20 20 20 20 20 20 20 45 61 67 6c 65 2e 5f           Eagle._
b560: 43 6f 6d 70 6f 6e 65 6e 74 73 2e 50 72 69 76 61  Components.Priva
b570: 74 65 2e 46 6f 72 6d 61 74 4f 70 73 20 44 61 74  te.FormatOps Dat
b580: 61 62 61 73 65 4f 62 6a 65 63 74 4e 61 6d 65 20  abaseObjectName 
b590: 24 63 6f 6e 6e 65 63 74 69 6f 6e 20 5c 0d 0a 20  $connection \.. 
b5a0: 20 20 20 20 20 20 20 20 20 53 51 4c 69 74 65 43           SQLiteC
b5b0: 6f 6e 6e 65 63 74 69 6f 6e 20 5b 6f 62 6a 65 63  onnection [objec
b5c0: 74 20 69 6e 76 6f 6b 65 20 49 6e 74 65 72 70 72  t invoke Interpr
b5d0: 65 74 65 72 2e 47 65 74 41 63 74 69 76 65 20 4e  eter.GetActive N
b5e0: 65 78 74 49 64 5d 5d 0d 0a 0d 0a 20 20 20 20 20  extId]]....     
b5f0: 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
b600: 3a 20 41 64 64 20 74 68 65 20 64 61 74 61 62 61  : Add the databa
b610: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 72  se connection pr
b620: 6f 76 69 64 65 64 20 62 79 20 6f 75 72 20 63 61  ovided by our ca
b630: 6c 6c 65 72 20 74 6f 20 74 68 65 20 6c 69 73 74  ller to the list
b640: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
b650: 6f 66 20 74 68 6f 73 65 20 6b 6e 6f 77 6e 20 74  of those known t
b660: 6f 20 74 68 65 20 45 61 67 6c 65 20 69 6e 74 65  o the Eagle inte
b670: 72 70 72 65 74 65 72 2e 0d 0a 20 20 20 20 20 20  rpreter...      
b680: 23 0d 0a 20 20 20 20 20 20 6f 62 6a 65 63 74 20  #..      object 
b690: 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e  invoke -flags +N
b6a0: 6f 6e 50 75 62 6c 69 63 20 49 6e 74 65 72 70 72  onPublic Interpr
b6b0: 65 74 65 72 2e 47 65 74 41 63 74 69 76 65 2e 63  eter.GetActive.c
b6c0: 6f 6e 6e 65 63 74 69 6f 6e 73 20 41 64 64 20 5c  onnections Add \
b6d0: 0d 0a 20 20 20 20 20 20 20 20 20 20 24 64 62 20  ..          $db 
b6e0: 24 63 6f 6e 6e 65 63 74 69 6f 6e 0d 0a 20 20 20  $connection..   
b6f0: 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
b700: 63 6c 65 61 6e 75 70 44 62 20 7b 20 66 69 6c 65  cleanupDb { file
b710: 4e 61 6d 65 20 7b 76 61 72 4e 61 6d 65 20 64 62  Name {varName db
b720: 7d 20 7b 63 6f 6c 6c 65 63 74 20 74 72 75 65 7d  } {collect true}
b730: 20 7b 71 75 61 6c 69 66 79 20 74 72 75 65 7d 0d   {qualify true}.
b740: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
b750: 20 20 20 20 20 20 7b 64 65 6c 65 74 65 20 74 72        {delete tr
b760: 75 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23  ue} } {..      #
b770: 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
b780: 41 74 74 65 6d 70 74 20 74 6f 20 66 6f 72 63 65  Attempt to force
b790: 20 61 6c 6c 20 70 65 6e 64 69 6e 67 20 22 67 61   all pending "ga
b7a0: 72 62 61 67 65 22 20 6f 62 6a 65 63 74 73 20 74  rbage" objects t
b7b0: 6f 20 62 65 20 63 6f 6c 6c 65 63 74 65 64 2c 0d  o be collected,.
b7c0: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 69  .      #       i
b7d0: 6e 63 6c 75 64 69 6e 67 20 53 51 4c 69 74 65 20  ncluding SQLite 
b7e0: 73 74 61 74 65 6d 65 6e 74 73 20 61 6e 64 20 62  statements and b
b7f0: 61 63 6b 75 70 20 6f 62 6a 65 63 74 73 3b 20 74  ackup objects; t
b800: 68 69 73 20 73 68 6f 75 6c 64 20 61 6c 6c 6f 77  his should allow
b810: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
b820: 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 64  the underlying d
b830: 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20  atabase file to 
b840: 62 65 20 64 65 6c 65 74 65 64 2e 0d 0a 20 20 20  be deleted...   
b850: 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
b860: 24 63 6f 6c 6c 65 63 74 7d 20 74 68 65 6e 20 7b  $collect} then {
b870: 0d 0a 20 20 20 20 20 20 20 20 63 6f 6c 6c 65 63  ..        collec
b880: 74 47 61 72 62 61 67 65 20 24 3a 3a 74 65 73 74  tGarbage $::test
b890: 5f 63 68 61 6e 6e 65 6c 0d 0a 20 20 20 20 20 20  _channel..      
b8a0: 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  }....      #..  
b8b0: 20 20 20 20 23 20 4e 4f 54 45 3a 20 52 65 66 65      # NOTE: Refe
b8c0: 72 20 74 6f 20 74 68 65 20 73 70 65 63 69 66 69  r to the specifi
b8d0: 65 64 20 76 61 72 69 61 62 6c 65 20 28 65 2e 67  ed variable (e.g
b8e0: 2e 20 22 64 62 22 29 20 69 6e 20 74 68 65 20 63  . "db") in the c
b8f0: 6f 6e 74 65 78 74 20 6f 66 20 6f 75 72 0d 0a 20  ontext of our.. 
b900: 20 20 20 20 20 23 20 20 20 20 20 20 20 63 61 6c       #       cal
b910: 6c 65 72 2e 20 20 54 68 65 20 68 61 6e 64 6c 65  ler.  The handle
b920: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
b930: 20 70 72 65 76 69 6f 75 73 6c 79 20 6f 70 65 6e   previously open
b940: 65 64 20 76 69 61 20 74 68 65 0d 0a 20 20 20 20  ed via the..    
b950: 20 20 23 20 20 20 20 20 20 20 5b 73 65 74 75 70    #       [setup
b960: 44 62 5d 20 70 72 6f 63 65 64 75 72 65 20 73 68  Db] procedure sh
b970: 6f 75 6c 64 20 62 65 20 73 74 6f 72 65 64 20 74  ould be stored t
b980: 68 65 72 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  here...      #..
b990: 20 20 20 20 20 20 75 70 76 61 72 20 31 20 24 76        upvar 1 $v
b9a0: 61 72 4e 61 6d 65 20 64 62 0d 0a 0d 0a 20 20 20  arName db....   
b9b0: 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
b9c0: 54 45 3a 20 43 6c 6f 73 65 20 74 68 65 20 63 6f  TE: Close the co
b9d0: 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 74 68 65 20  nnection to the 
b9e0: 64 61 74 61 62 61 73 65 20 6e 6f 77 2e 20 20 54  database now.  T
b9f0: 68 69 73 20 73 68 6f 75 6c 64 20 61 6c 6c 6f 77  his should allow
ba00: 20 75 73 0d 0a 20 20 20 20 20 20 23 20 20 20 20   us..      #    
ba10: 20 20 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65     to delete the
ba20: 20 75 6e 64 65 72 6c 79 69 6e 67 20 64 61 74 61   underlying data
ba30: 62 61 73 65 20 66 69 6c 65 2e 0d 0a 20 20 20 20  base file...    
ba40: 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b    #..      if {[
ba50: 69 6e 66 6f 20 65 78 69 73 74 73 20 64 62 5d 20  info exists db] 
ba60: 26 26 20 5b 63 61 74 63 68 20 7b 73 71 6c 20 63  && [catch {sql c
ba70: 6c 6f 73 65 20 24 64 62 7d 20 65 72 72 6f 72 5d  lose $db} error]
ba80: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
ba90: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
baa0: 4f 54 45 3a 20 57 65 20 73 6f 6d 65 68 6f 77 20  OTE: We somehow 
bab0: 66 61 69 6c 65 64 20 74 6f 20 63 6c 6f 73 65 20  failed to close 
bac0: 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 72 65  the database, re
bad0: 70 6f 72 74 20 77 68 79 2e 0d 0a 20 20 20 20 20  port why...     
bae0: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 74 70     #..        tp
baf0: 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  uts $::test_chan
bb00: 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
bb10: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22  \..            "
bb20: 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61  ==== WARNING: fa
bb30: 69 6c 65 64 20 74 6f 20 63 6c 6f 73 65 20 64 61  iled to close da
bb40: 74 61 62 61 73 65 20 5c 22 22 20 24 64 62 20 22  tabase \"" $db "
bb50: 5c 22 2c 20 65 72 72 6f 72 3a 20 22 20 5c 0d 0a  \", error: " \..
bb60: 20 20 20 20 20 20 20 20 20 20 20 20 5c 6e 5c 74              \n\t
bb70: 20 24 65 72 72 6f 72 20 5c 6e 5d 0d 0a 20 20 20   $error \n]..   
bb80: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d     }....      #.
bb90: 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 46  .      # NOTE: F
bba0: 69 72 73 74 2c 20 73 65 65 20 69 66 20 6f 75 72  irst, see if our
bbb0: 20 63 61 6c 6c 65 72 20 68 61 73 20 72 65 71 75   caller has requ
bbc0: 65 73 74 65 64 20 61 6e 20 69 6e 2d 6d 65 6d 6f  ested an in-memo
bbd0: 72 79 20 64 61 74 61 62 61 73 65 2e 0d 0a 20 20  ry database...  
bbe0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 73 65 74      #..      set
bbf0: 20 69 73 4d 65 6d 6f 72 79 20 5b 69 73 4d 65 6d   isMemory [isMem
bc00: 6f 72 79 44 62 20 24 66 69 6c 65 4e 61 6d 65 5d  oryDb $fileName]
bc10: 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  ....      #..   
bc20: 20 20 20 23 20 4e 4f 54 45 3a 20 42 75 69 6c 64     # NOTE: Build
bc30: 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68 20 74   the full path t
bc40: 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
bc50: 69 6c 65 20 6e 61 6d 65 2e 20 20 46 6f 72 20 6e  ile name.  For n
bc60: 6f 77 2c 20 61 6c 6c 20 74 65 73 74 0d 0a 20 20  ow, all test..  
bc70: 20 20 20 20 23 20 20 20 20 20 20 20 64 61 74 61      #       data
bc80: 62 61 73 65 20 66 69 6c 65 73 20 61 72 65 20 73  base files are s
bc90: 74 6f 72 65 64 20 69 6e 20 74 68 65 20 74 65 6d  tored in the tem
bca0: 70 6f 72 61 72 79 20 64 69 72 65 63 74 6f 72 79  porary directory
bcb0: 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
bcc0: 20 20 69 66 20 7b 21 24 69 73 4d 65 6d 6f 72 79    if {!$isMemory
bcd0: 20 26 26 20 24 71 75 61 6c 69 66 79 7d 20 74 68   && $qualify} th
bce0: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 65  en {..        se
bcf0: 74 20 66 69 6c 65 4e 61 6d 65 20 5b 66 69 6c 65  t fileName [file
bd00: 20 6a 6f 69 6e 20 5b 67 65 74 44 61 74 61 62 61   join [getDataba
bd10: 73 65 44 69 72 65 63 74 6f 72 79 5d 20 5b 66 69  seDirectory] [fi
bd20: 6c 65 20 74 61 69 6c 20 24 66 69 6c 65 4e 61 6d  le tail $fileNam
bd30: 65 5d 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a  e]]..      }....
bd40: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
bd50: 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 69 66 20   NOTE: Check if 
bd60: 74 68 65 20 66 69 6c 65 20 73 74 69 6c 6c 20 65  the file still e
bd70: 78 69 73 74 73 2e 0d 0a 20 20 20 20 20 20 23 0d  xists...      #.
bd80: 0a 20 20 20 20 20 20 69 66 20 7b 21 24 69 73 4d  .      if {!$isM
bd90: 65 6d 6f 72 79 20 26 26 20 24 64 65 6c 65 74 65  emory && $delete
bda0: 20 26 26 20 5b 66 69 6c 65 20 65 78 69 73 74 73   && [file exists
bdb0: 20 24 66 69 6c 65 4e 61 6d 65 5d 7d 20 74 68 65   $fileName]} the
bdc0: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  n {..        #..
bdd0: 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
bde0: 53 6b 69 70 20 64 65 6c 65 74 69 6e 67 20 64 61  Skip deleting da
bdf0: 74 61 62 61 73 65 20 66 69 6c 65 73 20 69 66 20  tabase files if 
be00: 73 6f 6d 65 62 6f 64 79 20 73 65 74 73 20 74 68  somebody sets th
be10: 65 20 67 6c 6f 62 61 6c 0d 0a 20 20 20 20 20 20  e global..      
be20: 20 20 23 20 20 20 20 20 20 20 76 61 72 69 61 62    #       variab
be30: 6c 65 20 74 6f 20 70 72 65 76 65 6e 74 20 69 74  le to prevent it
be40: 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
be50: 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f        if {![info
be60: 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 63 6c 65   exists ::no(cle
be70: 61 6e 75 70 44 62 46 69 6c 65 29 5d 7d 20 74 68  anupDbFile)]} th
be80: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
be90: 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e  #..          # N
bea0: 4f 54 45 3a 20 41 74 74 65 6d 70 74 20 74 6f 20  OTE: Attempt to 
beb0: 64 65 6c 65 74 65 20 74 68 65 20 74 65 73 74 20  delete the test 
bec0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6e 6f  database file no
bed0: 77 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d  w...          #.
bee0: 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b  .          if {[
bef0: 73 65 74 20 63 6f 64 65 20 5b 63 61 74 63 68 20  set code [catch 
bf00: 7b 66 69 6c 65 20 64 65 6c 65 74 65 20 24 66 69  {file delete $fi
bf10: 6c 65 4e 61 6d 65 7d 20 65 72 72 6f 72 5d 5d 7d  leName} error]]}
bf20: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
bf30: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
bf40: 20 20 20 20 23 20 4e 4f 54 45 3a 20 57 65 20 73      # NOTE: We s
bf50: 6f 6d 65 68 6f 77 20 66 61 69 6c 65 64 20 74 6f  omehow failed to
bf60: 20 64 65 6c 65 74 65 20 74 68 65 20 66 69 6c 65   delete the file
bf70: 2c 20 72 65 70 6f 72 74 20 77 68 79 2e 0d 0a 20  , report why... 
bf80: 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
bf90: 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
bfa0: 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
bfb0: 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
bfc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
bfd0: 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61  ==== WARNING: fa
bfe0: 69 6c 65 64 20 74 6f 20 64 65 6c 65 74 65 20 64  iled to delete d
bff0: 61 74 61 62 61 73 65 20 66 69 6c 65 20 5c 22 22  atabase file \""
c000: 20 24 66 69 6c 65 4e 61 6d 65 20 5c 0d 0a 20 20   $fileName \..  
c010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 5c                "\
c020: 22 20 64 75 72 69 6e 67 20 63 6c 65 61 6e 75 70  " during cleanup
c030: 2c 20 65 72 72 6f 72 3a 20 22 20 5c 6e 5c 74 20  , error: " \n\t 
c040: 24 65 72 72 6f 72 20 5c 6e 5d 0d 0a 20 20 20 20  $error \n]..    
c050: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
c060: 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
c070: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
c080: 20 20 23 20 4e 4f 54 45 3a 20 53 68 6f 77 20 74    # NOTE: Show t
c090: 68 61 74 20 77 65 20 73 6b 69 70 70 65 64 20 64  hat we skipped d
c0a0: 65 6c 65 74 69 6e 67 20 74 68 65 20 66 69 6c 65  eleting the file
c0b0: 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a  ...          #..
c0c0: 20 20 20 20 20 20 20 20 20 20 73 65 74 20 63 6f            set co
c0d0: 64 65 20 30 0d 0a 0d 0a 20 20 20 20 20 20 20 20  de 0....        
c0e0: 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
c0f0: 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
c100: 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
c110: 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49       "==== WARNI
c120: 4e 47 3a 20 73 6b 69 70 70 65 64 20 64 65 6c 65  NG: skipped dele
c130: 74 69 6e 67 20 64 61 74 61 62 61 73 65 20 66 69  ting database fi
c140: 6c 65 20 5c 22 22 20 24 66 69 6c 65 4e 61 6d 65  le \"" $fileName
c150: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
c160: 20 20 22 5c 22 20 64 75 72 69 6e 67 20 63 6c 65    "\" during cle
c170: 61 6e 75 70 5c 6e 22 5d 0d 0a 20 20 20 20 20 20  anup\n"]..      
c180: 20 20 7d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73    }..      } els
c190: 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  e {..        #..
c1a0: 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
c1b0: 54 68 65 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f  The file does no
c1c0: 74 20 65 78 69 73 74 2c 20 73 75 63 63 65 73 73  t exist, success
c1d0: 21 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  !..        #..  
c1e0: 20 20 20 20 20 20 73 65 74 20 63 6f 64 65 20 30        set code 0
c1f0: 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
c200: 20 20 20 72 65 74 75 72 6e 20 24 63 6f 64 65 0d     return $code.
c210: 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70  .    }.....    p
c220: 72 6f 63 20 73 65 74 75 70 44 62 49 6e 74 65 72  roc setupDbInter
c230: 72 75 70 74 43 61 6c 6c 62 61 63 6b 20 7b 20 63  ruptCallback { c
c240: 68 61 6e 6e 65 6c 20 6c 6f 67 20 7d 20 7b 0d 0a  hannel log } {..
c250: 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
c260: 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 73 65 74 74 69  nnel "---- setti
c270: 6e 67 20 75 70 20 64 65 62 75 67 67 65 72 20 69  ng up debugger i
c280: 6e 74 65 72 72 75 70 74 20 63 61 6c 6c 62 61 63  nterrupt callbac
c290: 6b 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 20 20  k... "....      
c2a0: 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20  if {[catch {..  
c2b0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
c2c0: 20 23 20 4e 4f 54 45 3a 20 4d 61 6b 65 20 73 75   # NOTE: Make su
c2d0: 72 65 20 74 68 65 20 73 63 72 69 70 74 20 64 65  re the script de
c2e0: 62 75 67 67 65 72 20 61 6e 64 20 74 68 65 20 69  bugger and the i
c2f0: 73 6f 6c 61 74 65 64 20 69 6e 74 65 72 70 72 65  solated interpre
c300: 74 65 72 20 61 72 65 0d 0a 20 20 20 20 20 20 20  ter are..       
c310: 20 23 20 20 20 20 20 20 20 73 65 74 75 70 20 61   #       setup a
c320: 6e 64 20 72 65 61 64 79 20 66 6f 72 20 75 73 65  nd ready for use
c330: 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
c340: 20 20 20 20 20 20 64 65 62 75 67 20 73 65 74 75        debug setu
c350: 70 20 74 72 75 65 20 74 72 75 65 0d 0a 0d 0a 20  p true true.... 
c360: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
c370: 20 20 23 20 4e 4f 54 45 3a 20 4c 6f 61 64 20 74    # NOTE: Load t
c380: 68 65 20 6e 65 63 65 73 73 61 72 79 20 70 61 63  he necessary pac
c390: 6b 61 67 65 73 20 69 6e 74 6f 20 74 68 65 20 69  kages into the i
c3a0: 73 6f 6c 61 74 65 64 20 69 6e 74 65 72 70 72 65  solated interpre
c3b0: 74 65 72 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  ter...        #.
c3c0: 0a 20 20 20 20 20 20 20 20 64 65 62 75 67 20 65  .        debug e
c3d0: 76 61 6c 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  val {..         
c3e0: 20 70 61 63 6b 61 67 65 20 72 65 71 75 69 72 65   package require
c3f0: 20 45 61 67 6c 65 0d 0a 20 20 20 20 20 20 20 20   Eagle..        
c400: 20 20 70 61 63 6b 61 67 65 20 72 65 71 75 69 72    package requir
c410: 65 20 45 61 67 6c 65 2e 4c 69 62 72 61 72 79 0d  e Eagle.Library.
c420: 0a 20 20 20 20 20 20 20 20 20 20 70 61 63 6b 61  .          packa
c430: 67 65 20 72 65 71 75 69 72 65 20 45 61 67 6c 65  ge require Eagle
c440: 2e 54 65 73 74 0d 0a 20 20 20 20 20 20 20 20 7d  .Test..        }
c450: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  ....        #.. 
c460: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43         # NOTE: C
c470: 6f 70 79 20 74 68 65 20 6e 65 63 65 73 73 61 72  opy the necessar
c480: 79 20 76 61 72 69 61 62 6c 65 73 20 69 6e 74 6f  y variables into
c490: 20 74 68 65 20 69 73 6f 6c 61 74 65 64 20 69 6e   the isolated in
c4a0: 74 65 72 70 72 65 74 65 72 2e 0d 0a 20 20 20 20  terpreter...    
c4b0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 64      #..        d
c4c0: 65 62 75 67 20 69 6e 76 6f 6b 65 20 30 20 73 65  ebug invoke 0 se
c4d0: 74 20 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c  t ::test_channel
c4e0: 20 24 63 68 61 6e 6e 65 6c 3b 20 23 20 4e 4f 54   $channel; # NOT
c4f0: 45 3a 20 46 6f 72 20 5b 74 70 75 74 73 5d 2e 0d  E: For [tputs]..
c500: 0a 20 20 20 20 20 20 20 20 64 65 62 75 67 20 69  .        debug i
c510: 6e 76 6f 6b 65 20 30 20 73 65 74 20 3a 3a 74 65  nvoke 0 set ::te
c520: 73 74 5f 6c 6f 67 20 24 6c 6f 67 3b 20 23 20 4e  st_log $log; # N
c530: 4f 54 45 3a 20 46 6f 72 20 5b 74 6c 6f 67 5d 2e  OTE: For [tlog].
c540: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  ....        #.. 
c550: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49         # NOTE: I
c560: 6e 73 74 61 6c 6c 20 74 68 65 20 63 61 6c 6c 62  nstall the callb
c570: 61 63 6b 20 73 63 72 69 70 74 20 74 6f 20 62 65  ack script to be
c580: 20 65 76 61 6c 75 61 74 65 64 20 69 6e 20 74 68   evaluated in th
c590: 65 20 69 73 6f 6c 61 74 65 64 0d 0a 20 20 20 20  e isolated..    
c5a0: 20 20 20 20 23 20 20 20 20 20 20 20 69 6e 74 65      #       inte
c5b0: 72 70 72 65 74 65 72 20 77 68 65 6e 20 74 68 69  rpreter when thi
c5c0: 73 20 69 6e 74 65 72 70 72 65 74 65 72 20 69 73  s interpreter is
c5d0: 20 69 6e 74 65 72 72 75 70 74 65 64 20 62 79 20   interrupted by 
c5e0: 73 63 72 69 70 74 0d 0a 20 20 20 20 20 20 20 20  script..        
c5f0: 23 20 20 20 20 20 20 20 63 61 6e 63 65 6c 6c 61  #       cancella
c600: 74 69 6f 6e 2c 20 65 74 63 2e 0d 0a 20 20 20 20  tion, etc...    
c610: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 64      #..        d
c620: 65 62 75 67 20 63 61 6c 6c 62 61 63 6b 20 61 70  ebug callback ap
c630: 70 6c 79 20 7b 7b 73 65 6e 64 65 72 20 65 7d 20  ply {{sender e} 
c640: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a  {..          #..
c650: 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45            # NOTE
c660: 3a 20 43 68 65 63 6b 20 69 66 20 74 68 69 73 20  : Check if this 
c670: 63 61 6c 6c 62 61 63 6b 20 69 73 20 6f 6e 65 20  callback is one 
c680: 74 68 61 74 20 77 65 20 63 61 72 65 20 61 62 6f  that we care abo
c690: 75 74 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23  ut...          #
c6a0: 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b  ..          if {
c6b0: 22 43 61 6e 63 65 6c 65 64 22 20 69 6e 20 5b 73  "Canceled" in [s
c6c0: 70 6c 69 74 20 5b 24 65 20 49 6e 74 65 72 72 75  plit [$e Interru
c6d0: 70 74 54 79 70 65 5d 20 22 2c 20 22 5d 7d 20 74  ptType] ", "]} t
c6e0: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
c6f0: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
c700: 20 20 23 20 4e 4f 54 45 3a 20 49 74 65 72 61 74    # NOTE: Iterat
c710: 65 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 64 61  e through all da
c720: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
c730: 6e 73 20 6b 6e 6f 77 6e 20 74 6f 20 74 68 65 0d  ns known to the.
c740: 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 20 20  .            #  
c750: 20 20 20 20 20 70 61 72 65 6e 74 20 69 6e 74 65       parent inte
c760: 72 70 72 65 74 65 72 2e 0d 0a 20 20 20 20 20 20  rpreter...      
c770: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
c780: 20 20 20 20 20 6f 62 6a 65 63 74 20 66 6f 72 65       object fore
c790: 61 63 68 20 2d 61 6c 69 61 73 20 70 61 69 72 20  ach -alias pair 
c7a0: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
c7b0: 20 20 20 5b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b     [object invok
c7c0: 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62  e -flags +NonPub
c7d0: 6c 69 63 20 24 65 20 49 6e 74 65 72 70 72 65 74  lic $e Interpret
c7e0: 65 72 2e 63 6f 6e 6e 65 63 74 69 6f 6e 73 5d 20  er.connections] 
c7f0: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
c800: 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   #..            
c810: 20 20 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70    # NOTE: Attemp
c820: 74 20 74 6f 20 63 61 6e 63 65 6c 20 61 6e 79 20  t to cancel any 
c830: 53 51 4c 20 71 75 65 72 69 65 73 20 69 6e 20 70  SQL queries in p
c840: 72 6f 67 72 65 73 73 20 6f 6e 20 74 68 69 73 0d  rogress on this.
c850: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23  .              #
c860: 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65 20         database 
c870: 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0d 0a 20 20 20  connection...   
c880: 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
c890: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b              if {
c8a0: 5b 63 61 74 63 68 20 7b 24 70 61 69 72 20 56 61  [catch {$pair Va
c8b0: 6c 75 65 2e 43 61 6e 63 65 6c 7d 20 65 72 72 6f  lue.Cancel} erro
c8c0: 72 5d 20 21 3d 20 30 7d 20 74 68 65 6e 20 7b 0d  r] != 0} then {.
c8d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
c8e0: 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
c8f0: 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
c900: 67 73 20 5c 6e 20 5c 0d 0a 20 20 20 20 20 20 20  gs \n \..       
c910: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 3d 3d               "==
c920: 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c  == WARNING: fail
c930: 65 64 20 74 6f 20 63 61 6e 63 65 6c 20 71 75 65  ed to cancel que
c940: 72 79 20 66 6f 72 20 63 6f 6e 6e 65 63 74 69 6f  ry for connectio
c950: 6e 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20 20  n \"" \..       
c960: 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 24 70               [$p
c970: 61 69 72 20 4b 65 79 5d 20 22 5c 22 2c 20 65 72  air Key] "\", er
c980: 72 6f 72 3a 20 22 20 5c 6e 5c 74 20 24 65 72 72  ror: " \n\t $err
c990: 6f 72 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20  or \n]..        
c9a0: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
c9b0: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
c9c0: 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 7d 0d    }..        }}.
c9d0: 0a 20 20 20 20 20 20 7d 20 65 72 72 6f 72 5d 20  .      } error] 
c9e0: 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  == 0} then {..  
c9f0: 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61        addConstra
ca00: 69 6e 74 20 69 6e 74 65 72 72 75 70 74 43 61 6c  int interruptCal
ca10: 6c 62 61 63 6b 2e 73 71 6c 69 74 65 33 0d 0a 0d  lback.sqlite3...
ca20: 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24  .        tputs $
ca30: 63 68 61 6e 6e 65 6c 20 79 65 73 5c 6e 0d 0a 20  channel yes\n.. 
ca40: 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
ca50: 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
ca60: 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
ca70: 73 20 22 6e 6f 2c 20 65 72 72 6f 72 3a 20 22 20  s "no, error: " 
ca80: 5c 6e 5c 74 20 24 65 72 72 6f 72 20 5c 6e 5d 0d  \n\t $error \n].
ca90: 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d  .      }..    }.
caa0: 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 63 6c 65  ....    proc cle
cab0: 61 6e 75 70 46 69 6c 65 20 7b 20 66 69 6c 65 4e  anupFile { fileN
cac0: 61 6d 65 20 7b 63 6f 6c 6c 65 63 74 20 74 72 75  ame {collect tru
cad0: 65 7d 20 7b 66 6f 72 63 65 20 66 61 6c 73 65 7d  e} {force false}
cae0: 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20   } {..      #.. 
caf0: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 74 74       # NOTE: Att
cb00: 65 6d 70 74 20 74 6f 20 66 6f 72 63 65 20 61 6c  empt to force al
cb10: 6c 20 70 65 6e 64 69 6e 67 20 22 67 61 72 62 61  l pending "garba
cb20: 67 65 22 20 6f 62 6a 65 63 74 73 20 74 6f 20 62  ge" objects to b
cb30: 65 20 63 6f 6c 6c 65 63 74 65 64 2c 0d 0a 20 20  e collected,..  
cb40: 20 20 20 20 23 20 20 20 20 20 20 20 69 6e 63 6c      #       incl
cb50: 75 64 69 6e 67 20 53 51 4c 69 74 65 20 73 74 61  uding SQLite sta
cb60: 74 65 6d 65 6e 74 73 20 61 6e 64 20 62 61 63 6b  tements and back
cb70: 75 70 20 6f 62 6a 65 63 74 73 3b 20 74 68 69 73  up objects; this
cb80: 20 73 68 6f 75 6c 64 20 61 6c 6c 6f 77 0d 0a 20   should allow.. 
cb90: 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68 65       #       the
cba0: 20 75 6e 64 65 72 6c 79 69 6e 67 20 64 61 74 61   underlying data
cbb0: 62 61 73 65 20 66 69 6c 65 20 74 6f 20 62 65 20  base file to be 
cbc0: 64 65 6c 65 74 65 64 2e 0d 0a 20 20 20 20 20 20  deleted...      
cbd0: 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 24 63 6f  #..      if {$co
cbe0: 6c 6c 65 63 74 7d 20 74 68 65 6e 20 7b 0d 0a 20  llect} then {.. 
cbf0: 20 20 20 20 20 20 20 63 6f 6c 6c 65 63 74 47 61         collectGa
cc00: 72 62 61 67 65 20 24 3a 3a 74 65 73 74 5f 63 68  rbage $::test_ch
cc10: 61 6e 6e 65 6c 0d 0a 20 20 20 20 20 20 7d 0d 0a  annel..      }..
cc20: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
cc30: 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 69   # NOTE: Check i
cc40: 66 20 74 68 65 20 66 69 6c 65 20 73 74 69 6c 6c  f the file still
cc50: 20 65 78 69 73 74 73 2e 0d 0a 20 20 20 20 20 20   exists...      
cc60: 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 66 69  #..      if {[fi
cc70: 6c 65 20 65 78 69 73 74 73 20 24 66 69 6c 65 4e  le exists $fileN
cc80: 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ame]} then {..  
cc90: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
cca0: 20 23 20 4e 4f 54 45 3a 20 53 6b 69 70 20 64 65   # NOTE: Skip de
ccb0: 6c 65 74 69 6e 67 20 74 65 73 74 20 66 69 6c 65  leting test file
ccc0: 73 20 69 66 20 73 6f 6d 65 62 6f 64 79 20 73 65  s if somebody se
ccd0: 74 73 20 74 68 65 20 67 6c 6f 62 61 6c 20 76 61  ts the global va
cce0: 72 69 61 62 6c 65 0d 0a 20 20 20 20 20 20 20 20  riable..        
ccf0: 23 20 20 20 20 20 20 20 74 6f 20 70 72 65 76 65  #       to preve
cd00: 6e 74 20 69 74 2e 0d 0a 20 20 20 20 20 20 20 20  nt it...        
cd10: 23 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 24  #..        if {$
cd20: 66 6f 72 63 65 20 7c 7c 20 21 5b 69 6e 66 6f 20  force || ![info 
cd30: 65 78 69 73 74 73 20 3a 3a 6e 6f 28 63 6c 65 61  exists ::no(clea
cd40: 6e 75 70 46 69 6c 65 29 5d 7d 20 74 68 65 6e 20  nupFile)]} then 
cd50: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a  {..          #..
cd60: 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45            # NOTE
cd70: 3a 20 41 74 74 65 6d 70 74 20 74 6f 20 64 65 6c  : Attempt to del
cd80: 65 74 65 20 74 68 65 20 74 65 73 74 20 66 69 6c  ete the test fil
cd90: 65 20 6e 6f 77 2e 0d 0a 20 20 20 20 20 20 20 20  e now...        
cda0: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 69    #..          i
cdb0: 66 20 7b 5b 73 65 74 20 63 6f 64 65 20 5b 63 61  f {[set code [ca
cdc0: 74 63 68 20 7b 66 69 6c 65 20 64 65 6c 65 74 65  tch {file delete
cdd0: 20 24 66 69 6c 65 4e 61 6d 65 7d 20 65 72 72 6f   $fileName} erro
cde0: 72 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  r]]} then {..   
cdf0: 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
ce00: 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
ce10: 57 65 20 73 6f 6d 65 68 6f 77 20 66 61 69 6c 65  We somehow faile
ce20: 64 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20  d to delete the 
ce30: 66 69 6c 65 2c 20 72 65 70 6f 72 74 20 77 68 79  file, report why
ce40: 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23  ...            #
ce50: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70  ..            tp
ce60: 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  uts $::test_chan
ce70: 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
ce80: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
ce90: 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47     "==== WARNING
cea0: 3a 20 66 61 69 6c 65 64 20 74 6f 20 64 65 6c 65  : failed to dele
ceb0: 74 65 20 74 65 73 74 20 66 69 6c 65 20 5c 22 22  te test file \""
cec0: 20 24 66 69 6c 65 4e 61 6d 65 20 5c 0d 0a 20 20   $fileName \..  
ced0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 5c                "\
cee0: 22 20 64 75 72 69 6e 67 20 63 6c 65 61 6e 75 70  " during cleanup
cef0: 2c 20 65 72 72 6f 72 3a 20 22 20 5c 6e 5c 74 20  , error: " \n\t 
cf00: 24 65 72 72 6f 72 20 5c 6e 5d 0d 0a 20 20 20 20  $error \n]..    
cf10: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
cf20: 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
cf30: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
cf40: 20 20 23 20 4e 4f 54 45 3a 20 53 68 6f 77 20 74    # NOTE: Show t
cf50: 68 61 74 20 77 65 20 73 6b 69 70 70 65 64 20 64  hat we skipped d
cf60: 65 6c 65 74 69 6e 67 20 74 68 65 20 66 69 6c 65  eleting the file
cf70: 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a  ...          #..
cf80: 20 20 20 20 20 20 20 20 20 20 73 65 74 20 63 6f            set co
cf90: 64 65 20 30 0d 0a 0d 0a 20 20 20 20 20 20 20 20  de 0....        
cfa0: 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
cfb0: 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
cfc0: 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
cfd0: 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49       "==== WARNI
cfe0: 4e 47 3a 20 73 6b 69 70 70 65 64 20 64 65 6c 65  NG: skipped dele
cff0: 74 69 6e 67 20 74 65 73 74 20 66 69 6c 65 20 5c  ting test file \
d000: 22 22 20 24 66 69 6c 65 4e 61 6d 65 20 5c 0d 0a  "" $fileName \..
d010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 5c                "\
d020: 22 20 64 75 72 69 6e 67 20 63 6c 65 61 6e 75 70  " during cleanup
d030: 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d  \n"]..        }.
d040: 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d  .      } else {.
d050: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
d060: 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 65 20      # NOTE: The 
d070: 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 65 78  file does not ex
d080: 69 73 74 2c 20 73 75 63 63 65 73 73 21 0d 0a 20  ist, success!.. 
d090: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
d0a0: 20 20 73 65 74 20 63 6f 64 65 20 30 0d 0a 20 20    set code 0..  
d0b0: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 72      }....      r
d0c0: 65 74 75 72 6e 20 24 63 6f 64 65 0d 0a 20 20 20  eturn $code..   
d0d0: 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
d0e0: 63 6f 6c 6c 65 63 74 47 61 72 62 61 67 65 20 7b  collectGarbage {
d0f0: 20 63 68 61 6e 6e 65 6c 20 7b 6d 69 6c 6c 69 73   channel {millis
d100: 65 63 6f 6e 64 73 20 31 30 30 30 7d 20 7b 71 75  econds 1000} {qu
d110: 69 65 74 20 74 72 75 65 7d 20 7d 20 7b 0d 0a 20  iet true} } {.. 
d120: 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20       if {[catch 
d130: 7b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 47  {object invoke G
d140: 43 20 47 65 74 54 6f 74 61 6c 4d 65 6d 6f 72 79  C GetTotalMemory
d150: 20 66 61 6c 73 65 7d 20 72 65 73 75 6c 74 5d 20   false} result] 
d160: 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  == 0} then {..  
d170: 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65        if {!$quie
d180: 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  t} then {..     
d190: 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
d1a0: 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
d1b0: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
d1c0: 20 22 2d 2d 2d 2d 20 6d 65 6d 6f 72 79 20 69 6e   "---- memory in
d1d0: 20 75 73 65 20 62 79 20 74 68 65 20 43 4c 52 20   use by the CLR 
d1e0: 62 65 66 6f 72 65 20 63 6f 6c 6c 65 63 74 69 6f  before collectio
d1f0: 6e 2e 2e 2e 20 22 20 5c 0d 0a 20 20 20 20 20 20  n... " \..      
d200: 20 20 20 20 20 20 20 20 24 72 65 73 75 6c 74 20          $result 
d210: 22 20 62 79 74 65 73 5c 6e 22 5d 0d 0a 20 20 20  " bytes\n"]..   
d220: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 20       }..      } 
d230: 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
d240: 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b  tputs $channel [
d250: 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
d260: 20 20 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20            "==== 
d270: 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20  WARNING: failed 
d280: 74 6f 20 67 65 74 20 43 4c 52 20 6d 65 6d 6f 72  to get CLR memor
d290: 79 20 75 73 61 67 65 2c 20 65 72 72 6f 72 3a 20  y usage, error: 
d2a0: 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  " \..           
d2b0: 20 5c 6e 5c 74 20 24 72 65 73 75 6c 74 20 5c 6e   \n\t $result \n
d2c0: 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  ]..      }....  
d2d0: 20 20 20 20 23 23 23 23 23 23 23 23 23 23 23 23      ############
d2e0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
d2f0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
d300: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
d310: 23 23 23 23 23 23 23 23 23 23 23 23 23 0d 0a 0d  #############...
d320: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
d330: 23 20 4e 4f 54 45 3a 20 52 65 70 65 61 74 65 64  # NOTE: Repeated
d340: 6c 79 20 61 74 74 65 6d 70 74 20 74 6f 20 63 6f  ly attempt to co
d350: 6c 6c 65 63 74 20 67 61 72 62 61 67 65 20 75 6e  llect garbage un
d360: 74 69 6c 20 74 68 65 20 61 6c 6c 6f 74 74 65 64  til the allotted
d370: 20 6e 75 6d 62 65 72 0d 0a 20 20 20 20 20 20 23   number..      #
d380: 20 20 20 20 20 20 20 6f 66 20 6d 69 6c 6c 69 73         of millis
d390: 65 63 6f 6e 64 73 20 68 61 73 20 65 6c 61 70 73  econds has elaps
d3a0: 65 64 2e 20 20 41 6c 77 61 79 73 20 61 74 74 65  ed.  Always atte
d3b0: 6d 70 74 20 74 6f 20 63 6f 6c 6c 65 63 74 20 67  mpt to collect g
d3c0: 61 72 62 61 67 65 0d 0a 20 20 20 20 20 20 23 20  arbage..      # 
d3d0: 20 20 20 20 20 20 61 74 20 6c 65 61 73 74 20 6f        at least o
d3e0: 6e 63 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  nce...      #.. 
d3f0: 20 20 20 20 20 73 65 74 20 73 74 61 72 74 20 5b       set start [
d400: 63 6c 6f 63 6b 20 73 65 63 6f 6e 64 73 5d 0d 0a  clock seconds]..
d410: 20 20 20 20 20 20 73 65 74 20 73 74 6f 70 20 5b        set stop [
d420: 65 78 70 72 20 7b 24 73 74 61 72 74 20 2b 20 28  expr {$start + (
d430: 24 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20 2f 20  $milliseconds / 
d440: 31 30 30 30 29 7d 5d 0d 0a 0d 0a 20 20 20 20 20  1000)}]....     
d450: 20 64 6f 20 7b 0d 0a 20 20 20 20 20 20 20 20 23   do {..        #
d460: 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
d470: 3a 20 41 74 74 65 6d 70 74 20 74 6f 20 66 6f 72  : Attempt to for
d480: 63 65 20 61 20 66 75 6c 6c 20 67 61 72 62 61 67  ce a full garbag
d490: 65 20 63 6f 6c 6c 65 63 74 69 6f 6e 20 6e 6f 77  e collection now
d4a0: 2e 20 20 52 65 70 6f 72 74 20 61 6e 79 0d 0a 20  .  Report any.. 
d4b0: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 65         #       e
d4c0: 72 72 6f 72 20 74 68 61 74 20 69 73 20 65 6e 63  rror that is enc
d4d0: 6f 75 6e 74 65 72 65 64 20 69 66 20 77 65 20 66  ountered if we f
d4e0: 61 69 6c 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  ail...        #.
d4f0: 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61  .        if {[ca
d500: 74 63 68 20 7b 6f 62 6a 65 63 74 20 69 6e 76 6f  tch {object invo
d510: 6b 65 20 47 43 20 47 65 74 54 6f 74 61 6c 4d 65  ke GC GetTotalMe
d520: 6d 6f 72 79 20 74 72 75 65 7d 20 65 72 72 6f 72  mory true} error
d530: 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
d540: 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
d550: 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
d560: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
d570: 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20   "==== WARNING: 
d580: 66 61 69 6c 65 64 20 66 75 6c 6c 20 67 61 72 62  failed full garb
d590: 61 67 65 20 63 6f 6c 6c 65 63 74 69 6f 6e 2c 20  age collection, 
d5a0: 65 72 72 6f 72 3a 20 22 20 5c 0d 0a 20 20 20 20  error: " \..    
d5b0: 20 20 20 20 20 20 20 20 20 20 5c 6e 5c 74 20 24            \n\t $
d5c0: 65 72 72 6f 72 20 5c 6e 5d 0d 0a 20 20 20 20 20  error \n]..     
d5d0: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
d5e0: 73 65 74 20 6e 6f 77 20 5b 63 6c 6f 63 6b 20 73  set now [clock s
d5f0: 65 63 6f 6e 64 73 5d 0d 0a 20 20 20 20 20 20 7d  econds]..      }
d600: 20 77 68 69 6c 65 20 7b 24 73 74 61 72 74 20 3c   while {$start <
d610: 3d 20 24 6e 6f 77 20 26 26 20 24 6e 6f 77 20 3c  = $now && $now <
d620: 20 24 73 74 6f 70 7d 0d 0a 0d 0a 20 20 20 20 20   $stop}....     
d630: 20 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23   ###############
d640: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
d650: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
d660: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
d670: 23 23 23 23 23 23 23 23 23 23 0d 0a 0d 0a 20 20  ##########....  
d680: 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b      if {[catch {
d690: 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 47 43  object invoke GC
d6a0: 20 47 65 74 54 6f 74 61 6c 4d 65 6d 6f 72 79 20   GetTotalMemory 
d6b0: 66 61 6c 73 65 7d 20 72 65 73 75 6c 74 5d 20 3d  false} result] =
d6c0: 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  = 0} then {..   
d6d0: 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74       if {!$quiet
d6e0: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
d6f0: 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
d700: 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
d710: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
d720: 22 2d 2d 2d 2d 20 6d 65 6d 6f 72 79 20 69 6e 20  "---- memory in 
d730: 75 73 65 20 62 79 20 74 68 65 20 43 4c 52 20 61  use by the CLR a
d740: 66 74 65 72 20 63 6f 6c 6c 65 63 74 69 6f 6e 2e  fter collection.
d750: 2e 2e 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20  .. " \..        
d760: 20 20 20 20 20 20 24 72 65 73 75 6c 74 20 22 20        $result " 
d770: 62 79 74 65 73 5c 6e 22 5d 0d 0a 20 20 20 20 20  bytes\n"]..     
d780: 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 20 65 6c     }..      } el
d790: 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70  se {..        tp
d7a0: 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70  uts $channel [ap
d7b0: 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
d7c0: 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41          "==== WA
d7d0: 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20 74 6f  RNING: failed to
d7e0: 20 67 65 74 20 43 4c 52 20 6d 65 6d 6f 72 79 20   get CLR memory 
d7f0: 75 73 61 67 65 2c 20 65 72 72 6f 72 3a 20 22 20  usage, error: " 
d800: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5c  \..            \
d810: 6e 5c 74 20 24 72 65 73 75 6c 74 20 5c 6e 5d 0d  n\t $result \n].
d820: 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d  .      }..    }.
d830: 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74  ....    proc get
d840: 53 51 4c 69 74 65 48 61 6e 64 6c 65 43 6f 75 6e  SQLiteHandleCoun
d850: 74 73 20 7b 20 63 68 61 6e 6e 65 6c 20 7b 71 75  ts { channel {qu
d860: 69 65 74 20 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a  iet false} } {..
d870: 20 20 20 20 20 20 73 65 74 20 72 65 73 75 6c 74        set result
d880: 20 5b 6c 69 73 74 5d 0d 0a 0d 0a 20 20 20 20 20   [list]....     
d890: 20 69 66 20 7b 5b 68 61 76 65 43 6f 6e 73 74 72   if {[haveConstr
d8a0: 61 69 6e 74 20 5c 0d 0a 20 20 20 20 20 20 20 20  aint \..        
d8b0: 20 20 20 20 20 20 64 65 66 69 6e 65 43 6f 6e 73        defineCons
d8c0: 74 61 6e 74 2e 53 79 73 74 65 6d 2e 44 61 74 61  tant.System.Data
d8d0: 2e 53 51 4c 69 74 65 2e 43 4f 55 4e 54 5f 48 41  .SQLite.COUNT_HA
d8e0: 4e 44 4c 45 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  NDLE]} then {.. 
d8f0: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
d900: 20 20 23 20 4e 4f 54 45 3a 20 41 64 64 20 65 61    # NOTE: Add ea
d910: 63 68 20 63 72 69 74 69 63 61 6c 20 68 61 6e 64  ch critical hand
d920: 6c 65 20 63 6f 75 6e 74 20 74 6f 20 74 68 65 20  le count to the 
d930: 72 65 73 75 6c 74 69 6e 67 20 6c 69 73 74 2e 0d  resulting list..
d940: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
d950: 20 20 20 20 66 6f 72 65 61 63 68 20 6e 61 6d 65      foreach name
d960: 20 5b 6c 69 73 74 20 63 6f 6e 6e 65 63 74 69 6f   [list connectio
d970: 6e 43 6f 75 6e 74 20 73 74 61 74 65 6d 65 6e 74  nCount statement
d980: 43 6f 75 6e 74 20 62 61 63 6b 75 70 43 6f 75 6e  Count backupCoun
d990: 74 5d 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  t] {..          
d9a0: 73 65 74 20 76 61 6c 75 65 20 5b 6f 62 6a 65 63  set value [objec
d9b0: 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20  t invoke -flags 
d9c0: 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20  +NonPublic \..  
d9d0: 20 20 20 20 20 20 20 20 20 20 20 20 53 79 73 74              Syst
d9e0: 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 55  em.Data.SQLite.U
d9f0: 6e 73 61 66 65 4e 61 74 69 76 65 4d 65 74 68 6f  nsafeNativeMetho
da00: 64 73 20 24 6e 61 6d 65 5d 0d 0a 0d 0a 20 20 20  ds $name]....   
da10: 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69         if {!$qui
da20: 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  et} then {..    
da30: 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
da40: 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
da50: 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
da60: 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 72 69 74        "---- crit
da70: 69 63 61 6c 20 68 61 6e 64 6c 65 20 63 6f 75 6e  ical handle coun
da80: 74 20 5c 22 22 20 24 6e 61 6d 65 20 22 5c 22 20  t \"" $name "\" 
da90: 69 73 20 22 20 24 76 61 6c 75 65 20 5c 6e 5d 0d  is " $value \n].
daa0: 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  .          }....
dab0: 20 20 20 20 20 20 20 20 20 20 6c 61 70 70 65 6e            lappen
dac0: 64 20 72 65 73 75 6c 74 20 24 76 61 6c 75 65 0d  d result $value.
dad0: 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  .        }..    
dae0: 20 20 7d 20 65 6c 73 65 69 66 20 7b 21 24 71 75    } elseif {!$qu
daf0: 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  iet} then {..   
db00: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
db10: 23 20 4e 4f 54 45 3a 20 54 68 65 20 61 63 74 75  # NOTE: The actu
db20: 61 6c 20 68 61 6e 64 6c 65 20 63 6f 75 6e 74 73  al handle counts
db30: 20 61 72 65 20 6e 6f 74 20 61 76 61 69 6c 61 62   are not availab
db40: 6c 65 3b 20 74 68 65 72 65 66 6f 72 65 2c 20 6a  le; therefore, j
db50: 75 73 74 0d 0a 20 20 20 20 20 20 20 20 23 20 20  ust..        #  
db60: 20 20 20 20 20 72 65 74 75 72 6e 20 61 6e 20 65       return an e
db70: 6d 70 74 79 20 6c 69 73 74 2e 0d 0a 20 20 20 20  mpty list...    
db80: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 74      #..        t
db90: 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 22 2d  puts $channel "-
dba0: 2d 2d 2d 20 63 72 69 74 69 63 61 6c 20 68 61 6e  --- critical han
dbb0: 64 6c 65 20 63 6f 75 6e 74 73 20 75 6e 61 76 61  dle counts unava
dbc0: 69 6c 61 62 6c 65 5c 6e 22 0d 0a 20 20 20 20 20  ilable\n"..     
dbd0: 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65 74 75   }....      retu
dbe0: 72 6e 20 24 72 65 73 75 6c 74 0d 0a 20 20 20 20  rn $result..    
dbf0: 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 73  }.....    proc s
dc00: 68 75 74 64 6f 77 6e 53 51 4c 69 74 65 20 7b 20  hutdownSQLite { 
dc10: 63 68 61 6e 6e 65 6c 20 7b 66 6f 72 63 65 20 66  channel {force f
dc20: 61 6c 73 65 7d 20 7b 71 75 69 65 74 20 66 61 6c  alse} {quiet fal
dc30: 73 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23  se} } {..      #
dc40: 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
dc50: 4d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 53  Make sure that S
dc60: 51 4c 69 74 65 20 63 6f 72 65 20 6c 69 62 72 61  QLite core libra
dc70: 72 79 20 69 73 20 63 6f 6d 70 6c 65 74 65 6c 79  ry is completely
dc80: 20 73 68 75 74 64 6f 77 6e 2e 20 20 54 68 69 73   shutdown.  This
dc90: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
dca0: 69 73 20 75 73 65 64 20 62 79 20 74 65 73 74 73  is used by tests
dcb0: 20 74 68 61 74 20 63 68 61 6e 67 65 20 63 6f 6e   that change con
dcc0: 66 69 67 75 72 61 74 69 6f 6e 20 6f 70 74 69 6f  figuration optio
dcd0: 6e 73 20 61 6e 64 2f 6f 72 20 74 68 6f 73 65 0d  ns and/or those.
dce0: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74  .      #       t
dcf0: 68 61 74 20 6e 65 65 64 20 74 6f 20 6d 61 6b 65  hat need to make
dd00: 20 73 75 72 65 20 6c 6f 67 67 69 6e 67 20 69 73   sure logging is
dd10: 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 28 69 2e   initialized (i.
dd20: 65 2e 20 6a 75 73 74 20 69 6e 20 63 61 73 65 0d  e. just in case.
dd30: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74  .      #       t
dd40: 68 65 20 53 51 4c 69 74 65 20 63 6f 72 65 20 6c  he SQLite core l
dd50: 69 62 72 61 72 79 20 77 61 73 20 69 6e 69 74 69  ibrary was initi
dd60: 61 6c 69 7a 65 64 20 69 6e 20 74 68 65 20 70 72  alized in the pr
dd70: 6f 63 65 73 73 20 70 72 69 6f 72 20 74 6f 0d 0a  ocess prior to..
dd80: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68        #       th
dd90: 65 20 53 51 4c 69 74 65 4c 6f 67 20 63 6c 61 73  e SQLiteLog clas
dda0: 73 20 62 65 69 6e 67 20 61 62 6c 65 20 74 6f 20  s being able to 
ddb0: 73 65 74 75 70 20 69 74 73 20 6c 6f 67 67 69 6e  setup its loggin
ddc0: 67 20 63 61 6c 6c 62 61 63 6b 29 2e 0d 0a 20 20  g callback)...  
ddd0: 20 20 20 20 23 20 20 20 20 20 20 20 4e 6f 72 6d      #       Norm
dde0: 61 6c 6c 79 2c 20 74 68 69 73 20 73 68 6f 75 6c  ally, this shoul
ddf0: 64 20 6f 6e 6c 79 20 62 65 20 70 65 72 66 6f 72  d only be perfor
de00: 6d 65 64 20 69 66 20 53 51 4c 69 74 65 20 69 73  med if SQLite is
de10: 20 6c 6f 61 64 65 64 20 61 6e 64 0d 0a 20 20 20   loaded and..   
de20: 20 20 20 23 20 20 20 20 20 20 20 72 65 61 64 79     #       ready
de30: 20 66 6f 72 20 75 73 65 20 62 79 20 74 68 65 20   for use by the 
de40: 74 65 73 74 20 73 75 69 74 65 2e 0d 0a 20 20 20  test suite...   
de50: 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
de60: 24 66 6f 72 63 65 20 7c 7c 20 5b 69 73 53 51 4c  $force || [isSQL
de70: 69 74 65 52 65 61 64 79 5d 7d 20 74 68 65 6e 20  iteReady]} then 
de80: 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
de90: 20 20 20 20 20 20 23 20 42 55 47 46 49 58 3a 20        # BUGFIX: 
dea0: 42 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 74  Before calling t
deb0: 68 65 20 6e 61 74 69 76 65 20 73 68 75 74 64 6f  he native shutdo
dec0: 77 6e 20 66 75 6e 63 74 69 6f 6e 2c 20 6d 61 6b  wn function, mak
ded0: 65 20 73 75 72 65 20 62 6f 74 68 0d 0a 20 20 20  e sure both..   
dee0: 20 20 20 20 20 23 20 20 20 20 20 20 20 20 20 6f       #         o
def0: 66 20 74 68 65 20 50 52 41 47 4d 41 20 72 65 6c  f the PRAGMA rel
df00: 61 74 65 64 20 64 69 72 65 63 74 6f 72 79 20 6e  ated directory n
df10: 61 6d 65 73 20 61 72 65 20 66 72 65 65 64 2e 0d  ames are freed..
df20: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
df30: 20 20 20 20 63 68 65 63 6b 46 6f 72 53 51 4c 69      checkForSQLi
df40: 74 65 44 69 72 65 63 74 6f 72 69 65 73 20 24 63  teDirectories $c
df50: 68 61 6e 6e 65 6c 20 74 72 75 65 0d 0a 0d 0a 20  hannel true.... 
df60: 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63         if {[catc
df70: 68 20 7b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65  h {object invoke
df80: 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c   -flags +NonPubl
df90: 69 63 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  ic \..          
dfa0: 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74        System.Dat
dfb0: 61 2e 53 51 4c 69 74 65 2e 55 6e 73 61 66 65 4e  a.SQLite.UnsafeN
dfc0: 61 74 69 76 65 4d 65 74 68 6f 64 73 20 5c 0d 0a  ativeMethods \..
dfd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dfe0: 73 71 6c 69 74 65 33 5f 73 68 75 74 64 6f 77 6e  sqlite3_shutdown
dff0: 7d 20 72 65 73 75 6c 74 5d 20 3d 3d 20 30 7d 20  } result] == 0} 
e000: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
e010: 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74    if {!$quiet} t
e020: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
e030: 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
e040: 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
e050: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
e060: 20 22 2d 2d 2d 2d 20 63 61 6c 6c 20 73 71 6c 69   "---- call sqli
e070: 74 65 33 5f 73 68 75 74 64 6f 77 6e 28 29 2e 2e  te3_shutdown()..
e080: 2e 20 6f 6b 3a 20 22 20 24 72 65 73 75 6c 74 20  . ok: " $result 
e090: 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  \n]..          }
e0a0: 0d 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65  ..        } else
e0b0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66   {..          if
e0c0: 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20   {!$quiet} then 
e0d0: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  {..            t
e0e0: 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61  puts $channel [a
e0f0: 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
e100: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d               "--
e110: 2d 2d 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 5f  -- call sqlite3_
e120: 73 68 75 74 64 6f 77 6e 28 29 2e 2e 2e 20 65 72  shutdown()... er
e130: 72 6f 72 3a 20 22 20 5c 6e 5c 74 20 24 72 65 73  ror: " \n\t $res
e140: 75 6c 74 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20  ult \n]..       
e150: 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d     }..        }.
e160: 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d  .      }..    }.
e170: 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 72 65 70  ....    proc rep
e180: 6f 72 74 53 51 4c 69 74 65 52 65 73 6f 75 72 63  ortSQLiteResourc
e190: 65 73 20 7b 20 63 68 61 6e 6e 65 6c 20 7b 71 75  es { channel {qu
e1a0: 69 65 74 20 66 61 6c 73 65 7d 20 7b 63 6f 6c 6c  iet false} {coll
e1b0: 65 63 74 20 74 72 75 65 7d 20 7d 20 7b 0d 0a 20  ect true} } {.. 
e1c0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
e1d0: 4e 4f 54 45 3a 20 53 6b 69 70 20 61 6c 6c 20 6f  NOTE: Skip all o
e1e0: 75 74 70 75 74 20 69 66 20 77 65 20 61 72 65 20  utput if we are 
e1f0: 72 75 6e 6e 69 6e 67 20 69 6e 20 22 71 75 69 65  running in "quie
e200: 74 22 20 6d 6f 64 65 2e 0d 0a 20 20 20 20 20 20  t" mode...      
e210: 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 68 61  #..      if {[ha
e220: 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 5c 0d 0a  veConstraint \..
e230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 65                de
e240: 66 69 6e 65 43 6f 6e 73 74 61 6e 74 2e 53 79 73  fineConstant.Sys
e250: 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e  tem.Data.SQLite.
e260: 49 4e 54 45 52 4f 50 5f 56 49 52 54 55 41 4c 5f  INTEROP_VIRTUAL_
e270: 54 41 42 4c 45 5d 20 26 26 20 5c 0d 0a 20 20 20  TABLE] && \..   
e280: 20 20 20 20 20 20 20 5b 68 61 76 65 43 6f 6e 73         [haveCons
e290: 74 72 61 69 6e 74 20 5c 0d 0a 20 20 20 20 20 20  traint \..      
e2a0: 20 20 20 20 20 20 20 20 64 65 66 69 6e 65 43 6f          defineCo
e2b0: 6e 73 74 61 6e 74 2e 53 79 73 74 65 6d 2e 44 61  nstant.System.Da
e2c0: 74 61 2e 53 51 4c 69 74 65 2e 54 52 41 43 4b 5f  ta.SQLite.TRACK_
e2d0: 4d 45 4d 4f 52 59 5f 42 59 54 45 53 5d 7d 20 74  MEMORY_BYTES]} t
e2e0: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 69  hen {..        i
e2f0: 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e  f {!$quiet} then
e300: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70   {..          tp
e310: 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 22 2d 2d  uts $channel "--
e320: 2d 2d 20 63 75 72 72 65 6e 74 20 6d 65 6d 6f 72  -- current memor
e330: 79 20 69 6e 20 75 73 65 20 62 79 20 53 51 4c 69  y in use by SQLi
e340: 74 65 4d 65 6d 6f 72 79 2e 2e 2e 20 22 0d 0a 20  teMemory... ".. 
e350: 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
e360: 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b      if {[catch {
e370: 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66  object invoke -f
e380: 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20  lags +NonPublic 
e390: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
e3a0: 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53     System.Data.S
e3b0: 51 4c 69 74 65 2e 53 51 4c 69 74 65 4d 65 6d 6f  QLite.SQLiteMemo
e3c0: 72 79 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  ry \..          
e3d0: 20 20 20 20 20 20 62 79 74 65 73 41 6c 6c 6f 63        bytesAlloc
e3e0: 61 74 65 64 7d 20 6d 65 6d 6f 72 79 5d 20 3d 3d  ated} memory] ==
e3f0: 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
e400: 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65        if {!$quie
e410: 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  t} then {..     
e420: 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
e430: 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
e440: 73 20 24 6d 65 6d 6f 72 79 20 22 20 62 79 74 65  s $memory " byte
e450: 73 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20 20  s\n"]..         
e460: 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 20 65 6c   }..        } el
e470: 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  se {..          
e480: 73 65 74 20 6d 65 6d 6f 72 79 20 75 6e 6b 6e 6f  set memory unkno
e490: 77 6e 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  wn....          
e4a0: 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65  if {!$quiet} the
e4b0: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
e4c0: 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
e4d0: 5b 61 70 70 65 6e 64 41 72 67 73 20 24 6d 65 6d  [appendArgs $mem
e4e0: 6f 72 79 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20  ory \n]..       
e4f0: 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d     }..        }.
e500: 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21  ...        if {!
e510: 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a  $quiet} then {..
e520: 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
e530: 24 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 6d  $channel "---- m
e540: 61 78 69 6d 75 6d 20 6d 65 6d 6f 72 79 20 69 6e  aximum memory in
e550: 20 75 73 65 20 62 79 20 53 51 4c 69 74 65 4d 65   use by SQLiteMe
e560: 6d 6f 72 79 2e 2e 2e 20 22 0d 0a 20 20 20 20 20  mory... "..     
e570: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
e580: 69 66 20 7b 5b 63 61 74 63 68 20 7b 6f 62 6a 65  if {[catch {obje
e590: 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73  ct invoke -flags
e5a0: 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20   +NonPublic \.. 
e5b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
e5c0: 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
e5d0: 65 2e 53 51 4c 69 74 65 4d 65 6d 6f 72 79 20 5c  e.SQLiteMemory \
e5e0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
e5f0: 20 20 6d 61 78 69 6d 75 6d 42 79 74 65 73 41 6c    maximumBytesAl
e600: 6c 6f 63 61 74 65 64 7d 20 6d 65 6d 6f 72 79 5d  located} memory]
e610: 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20   == 0} then {.. 
e620: 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71           if {!$q
e630: 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  uiet} then {..  
e640: 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
e650: 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  $channel [append
e660: 41 72 67 73 20 24 6d 65 6d 6f 72 79 20 22 20 62  Args $memory " b
e670: 79 74 65 73 5c 6e 22 5d 0d 0a 20 20 20 20 20 20  ytes\n"]..      
e680: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d      }..        }
e690: 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
e6a0: 20 20 20 73 65 74 20 6d 65 6d 6f 72 79 20 75 6e     set memory un
e6b0: 6b 6e 6f 77 6e 0d 0a 0d 0a 20 20 20 20 20 20 20  known....       
e6c0: 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20     if {!$quiet} 
e6d0: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
e6e0: 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
e6f0: 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 24  el [appendArgs $
e700: 6d 65 6d 6f 72 79 20 5c 6e 5d 0d 0a 20 20 20 20  memory \n]..    
e710: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
e720: 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20   }..      }.... 
e730: 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74       if {!$quiet
e740: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
e750: 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
e760: 20 22 2d 2d 2d 2d 20 63 75 72 72 65 6e 74 20 6d   "---- current m
e770: 65 6d 6f 72 79 20 69 6e 20 75 73 65 20 62 79 20  emory in use by 
e780: 53 51 4c 69 74 65 2e 2e 2e 20 22 0d 0a 20 20 20  SQLite... "..   
e790: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 69 66     }....      if
e7a0: 20 7b 5b 63 61 74 63 68 20 7b 6f 62 6a 65 63 74   {[catch {object
e7b0: 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b   invoke -flags +
e7c0: 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20  NonPublic \..   
e7d0: 20 20 20 20 20 20 20 20 20 20 20 53 79 73 74 65             Syste
e7e0: 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 55 6e  m.Data.SQLite.Un
e7f0: 73 61 66 65 4e 61 74 69 76 65 4d 65 74 68 6f 64  safeNativeMethod
e800: 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
e810: 20 20 20 73 71 6c 69 74 65 33 5f 6d 65 6d 6f 72     sqlite3_memor
e820: 79 5f 75 73 65 64 7d 20 6d 65 6d 6f 72 79 5d 20  y_used} memory] 
e830: 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  == 0} then {..  
e840: 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65        if {!$quie
e850: 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  t} then {..     
e860: 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
e870: 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
e880: 24 6d 65 6d 6f 72 79 20 22 20 62 79 74 65 73 5c  $memory " bytes\
e890: 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  n"]..        }..
e8a0: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
e8b0: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
e8c0: 20 20 20 23 20 4e 4f 54 45 3a 20 4d 61 79 62 65     # NOTE: Maybe
e8d0: 20 74 68 65 20 53 51 4c 69 74 65 20 63 6f 72 65   the SQLite core
e8e0: 20 6c 69 62 72 61 72 79 20 69 73 20 75 6e 61 76   library is unav
e8f0: 61 69 6c 61 62 6c 65 3f 0d 0a 20 20 20 20 20 20  ailable?..      
e900: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 73 65 74    #..        set
e910: 20 6d 65 6d 6f 72 79 20 75 6e 6b 6e 6f 77 6e 0d   memory unknown.
e920: 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21  ...        if {!
e930: 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a  $quiet} then {..
e940: 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
e950: 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  $channel [append
e960: 41 72 67 73 20 24 6d 65 6d 6f 72 79 20 5c 6e 5d  Args $memory \n]
e970: 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20  ..        }..   
e980: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 73 65     }....      se
e990: 74 20 72 65 73 75 6c 74 20 24 6d 65 6d 6f 72 79  t result $memory
e9a0: 3b 20 23 20 4e 4f 54 45 3a 20 52 65 74 75 72 6e  ; # NOTE: Return
e9b0: 20 6d 65 6d 6f 72 79 20 69 6e 2d 75 73 65 20 74   memory in-use t
e9c0: 6f 20 6f 75 72 20 63 61 6c 6c 65 72 2e 0d 0a 0d  o our caller....
e9d0: 0a 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69  .      if {!$qui
e9e0: 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  et} then {..    
e9f0: 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
ea00: 65 6c 20 22 2d 2d 2d 2d 20 6d 61 78 69 6d 75 6d  el "---- maximum
ea10: 20 6d 65 6d 6f 72 79 20 69 6e 20 75 73 65 20 62   memory in use b
ea20: 79 20 53 51 4c 69 74 65 2e 2e 2e 20 22 0d 0a 20  y SQLite... ".. 
ea30: 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
ea40: 69 66 20 7b 5b 63 61 74 63 68 20 7b 6f 62 6a 65  if {[catch {obje
ea50: 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73  ct invoke -flags
ea60: 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20   +NonPublic \.. 
ea70: 20 20 20 20 20 20 20 20 20 20 20 20 20 53 79 73               Sys
ea80: 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e  tem.Data.SQLite.
ea90: 55 6e 73 61 66 65 4e 61 74 69 76 65 4d 65 74 68  UnsafeNativeMeth
eaa0: 6f 64 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ods \..         
eab0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 65 6d       sqlite3_mem
eac0: 6f 72 79 5f 68 69 67 68 77 61 74 65 72 20 30 7d  ory_highwater 0}
ead0: 20 6d 65 6d 6f 72 79 5d 20 3d 3d 20 30 7d 20 74   memory] == 0} t
eae0: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 69  hen {..        i
eaf0: 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e  f {!$quiet} then
eb00: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70   {..          tp
eb10: 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70  uts $channel [ap
eb20: 70 65 6e 64 41 72 67 73 20 24 6d 65 6d 6f 72 79  pendArgs $memory
eb30: 20 22 20 62 79 74 65 73 5c 6e 22 5d 0d 0a 20 20   " bytes\n"]..  
eb40: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d        }..      }
eb50: 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
eb60: 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
eb70: 54 45 3a 20 4d 61 79 62 65 20 74 68 65 20 53 51  TE: Maybe the SQ
eb80: 4c 69 74 65 20 63 6f 72 65 20 6c 69 62 72 61 72  Lite core librar
eb90: 79 20 69 73 20 75 6e 61 76 61 69 6c 61 62 6c 65  y is unavailable
eba0: 3f 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ?..        #..  
ebb0: 20 20 20 20 20 20 73 65 74 20 6d 65 6d 6f 72 79        set memory
ebc0: 20 75 6e 6b 6e 6f 77 6e 0d 0a 0d 0a 20 20 20 20   unknown....    
ebd0: 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d      if {!$quiet}
ebe0: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
ebf0: 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
ec00: 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 24 6d  l [appendArgs $m
ec10: 65 6d 6f 72 79 20 5c 6e 5d 0d 0a 20 20 20 20 20  emory \n]..     
ec20: 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d     }..      }...
ec30: 0a 20 20 20 20 20 20 69 66 20 7b 24 63 6f 6c 6c  .      if {$coll
ec40: 65 63 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  ect} then {..   
ec50: 20 20 20 20 20 63 6f 6c 6c 65 63 74 47 61 72 62       collectGarb
ec60: 61 67 65 20 24 63 68 61 6e 6e 65 6c 0d 0a 20 20  age $channel..  
ec70: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 69      }....      i
ec80: 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e  f {!$quiet} then
ec90: 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74   {..        tput
eca0: 73 20 24 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d  s $channel "----
ecb0: 20 63 75 72 72 65 6e 74 20 6d 65 6d 6f 72 79 20   current memory 
ecc0: 69 6e 20 75 73 65 20 62 79 20 74 68 65 20 43 4c  in use by the CL
ecd0: 52 2e 2e 2e 20 22 0d 0a 20 20 20 20 20 20 7d 0d  R... "..      }.
ece0: 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 63 61  ...      if {[ca
ecf0: 74 63 68 20 7b 6f 62 6a 65 63 74 20 69 6e 76 6f  tch {object invo
ed00: 6b 65 20 47 43 20 47 65 74 54 6f 74 61 6c 4d 65  ke GC GetTotalMe
ed10: 6d 6f 72 79 20 66 61 6c 73 65 7d 20 6d 65 6d 6f  mory false} memo
ed20: 72 79 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b  ry] == 0} then {
ed30: 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73  ..        if {[s
ed40: 74 72 69 6e 67 20 69 73 20 69 6e 74 65 67 65 72  tring is integer
ed50: 20 2d 73 74 72 69 63 74 20 24 6d 65 6d 6f 72 79   -strict $memory
ed60: 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
ed70: 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74       if {!$quiet
ed80: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
ed90: 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
eda0: 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
edb0: 20 24 6d 65 6d 6f 72 79 20 22 20 62 79 74 65 73   $memory " bytes
edc0: 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20 20 20  \n"]..          
edd0: 7d 0d 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73  }..        } els
ede0: 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73  e {..          s
edf0: 65 74 20 6d 65 6d 6f 72 79 20 69 6e 76 61 6c 69  et memory invali
ee00: 64 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 69  d....          i
ee10: 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e  f {!$quiet} then
ee20: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
ee30: 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b  tputs $channel [
ee40: 61 70 70 65 6e 64 41 72 67 73 20 24 6d 65 6d 6f  appendArgs $memo
ee50: 72 79 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20  ry \n]..        
ee60: 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a    }..        }..
ee70: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
ee80: 20 20 20 20 20 20 20 20 73 65 74 20 6d 65 6d 6f          set memo
ee90: 72 79 20 75 6e 6b 6e 6f 77 6e 0d 0a 0d 0a 20 20  ry unknown....  
eea0: 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65        if {!$quie
eeb0: 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  t} then {..     
eec0: 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
eed0: 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
eee0: 24 6d 65 6d 6f 72 79 20 5c 6e 5d 0d 0a 20 20 20  $memory \n]..   
eef0: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d       }..      }.
ef00: 0a 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ...      return 
ef10: 24 72 65 73 75 6c 74 0d 0a 20 20 20 20 7d 0d 0a  $result..    }..
ef20: 0c 0d 0a 20 20 20 20 70 72 6f 63 20 63 68 65 63  ...    proc chec
ef30: 6b 46 6f 72 53 51 4c 69 74 65 44 69 72 65 63 74  kForSQLiteDirect
ef40: 6f 72 69 65 73 20 7b 20 63 68 61 6e 6e 65 6c 20  ories { channel 
ef50: 7b 72 65 73 65 74 20 66 61 6c 73 65 7d 20 7d 20  {reset false} } 
ef60: 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  {..      #..    
ef70: 20 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20    # NOTE: Check 
ef80: 69 66 20 74 68 65 20 73 71 6c 69 74 65 33 5f 77  if the sqlite3_w
ef90: 69 6e 33 32 5f 73 65 74 5f 64 69 72 65 63 74 6f  in32_set_directo
efa0: 72 79 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  ry function is a
efb0: 76 61 69 6c 61 62 6c 65 2e 0d 0a 20 20 20 20 20  vailable...     
efc0: 20 23 0d 0a 20 20 20 20 20 20 74 70 75 74 73 20   #..      tputs 
efd0: 24 63 68 61 6e 6e 65 6c 20 5c 0d 0a 20 20 20 20  $channel \..    
efe0: 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 68 65 63        "---- chec
eff0: 6b 69 6e 67 20 66 6f 72 20 66 75 6e 63 74 69 6f  king for functio
f000: 6e 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f  n sqlite3_win32_
f010: 73 65 74 5f 64 69 72 65 63 74 6f 72 79 2e 2e 2e  set_directory...
f020: 20 22 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20   "....      #.. 
f030: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 69       # NOTE: Thi
f040: 73 20 63 61 6c 6c 20 74 6f 20 74 68 65 20 73 71  s call to the sq
f050: 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 65 74 5f  lite3_win32_set_
f060: 64 69 72 65 63 74 6f 72 79 20 66 75 6e 63 74 69  directory functi
f070: 6f 6e 20 75 73 65 73 20 74 68 65 0d 0a 20 20 20  on uses the..   
f080: 20 20 20 23 20 20 20 20 20 20 20 69 6e 76 61 6c     #       inval
f090: 69 64 20 76 61 6c 75 65 20 30 20 66 6f 72 20 74  id value 0 for t
f0a0: 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
f0b0: 74 2e 20 20 54 68 69 73 20 63 6f 64 65 20 69 73  t.  This code is
f0c0: 20 64 65 73 69 67 6e 65 64 0d 0a 20 20 20 20 20   designed..     
f0d0: 20 23 20 20 20 20 20 20 20 74 6f 20 63 68 65 63   #       to chec
f0e0: 6b 20 69 66 20 63 61 6c 6c 69 6e 67 20 74 68 65  k if calling the
f0f0: 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 72   function will r
f100: 61 69 73 65 20 61 6e 20 65 78 63 65 70 74 69 6f  aise an exceptio
f110: 6e 20 28 69 2e 65 2e 0d 0a 20 20 20 20 20 20 23  n (i.e...      #
f120: 20 20 20 20 20 20 20 74 68 65 20 61 63 74 75 61         the actua
f130: 6c 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20  l result of the 
f140: 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f  function does no
f150: 74 20 6d 61 74 74 65 72 20 61 73 20 6c 6f 6e 67  t matter as long
f160: 20 61 73 20 6e 6f 0d 0a 20 20 20 20 20 20 23 20   as no..      # 
f170: 20 20 20 20 20 20 64 69 72 65 63 74 6f 72 79 20        directory 
f180: 69 73 20 63 68 61 6e 67 65 64 29 2e 0d 0a 20 20  is changed)...  
f190: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20      #..      if 
f1a0: 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20  {[catch {..     
f1b0: 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20           object 
f1c0: 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e  invoke -flags +N
f1d0: 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20  onPublic \..    
f1e0: 20 20 20 20 20 20 20 20 20 20 53 79 73 74 65 6d            System
f1f0: 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 55 6e 73  .Data.SQLite.Uns
f200: 61 66 65 4e 61 74 69 76 65 4d 65 74 68 6f 64 73  afeNativeMethods
f210: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
f220: 20 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f    sqlite3_win32_
f230: 73 65 74 5f 64 69 72 65 63 74 6f 72 79 20 30 20  set_directory 0 
f240: 6e 75 6c 6c 7d 5d 20 3d 3d 20 30 7d 20 74 68 65  null}] == 0} the
f250: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  n {..        #..
f260: 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
f270: 43 61 6c 6c 69 6e 67 20 74 68 65 20 73 71 6c 69  Calling the sqli
f280: 74 65 33 5f 77 69 6e 33 32 5f 73 65 74 5f 64 69  te3_win32_set_di
f290: 72 65 63 74 6f 72 79 20 66 75 6e 63 74 69 6f 6e  rectory function
f2a0: 20 64 6f 65 73 20 6e 6f 74 0d 0a 20 20 20 20 20   does not..     
f2b0: 20 20 20 23 20 20 20 20 20 20 20 63 61 75 73 65     #       cause
f2c0: 20 61 6e 20 65 78 63 65 70 74 69 6f 6e 3b 20 74   an exception; t
f2d0: 68 65 72 65 66 6f 72 65 2c 20 69 74 20 6d 75 73  herefore, it mus
f2e0: 74 20 62 65 20 61 76 61 69 6c 61 62 6c 65 20 28  t be available (
f2f0: 69 2e 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 20  i.e...        # 
f300: 20 20 20 20 20 20 65 76 65 6e 20 74 68 6f 75 67        even thoug
f310: 68 20 69 74 20 73 68 6f 75 6c 64 20 72 65 74 75  h it should retu
f320: 72 6e 20 61 20 66 61 69 6c 75 72 65 20 72 65 74  rn a failure ret
f330: 75 72 6e 20 63 6f 64 65 20 69 6e 20 74 68 69 73  urn code in this
f340: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
f350: 20 20 63 61 73 65 29 2e 0d 0a 20 20 20 20 20 20    case)...      
f360: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 61 64 64    #..        add
f370: 43 6f 6e 73 74 72 61 69 6e 74 20 73 71 6c 69 74  Constraint sqlit
f380: 65 33 5f 77 69 6e 33 32 5f 73 65 74 5f 64 69 72  e3_win32_set_dir
f390: 65 63 74 6f 72 79 0d 0a 0d 0a 20 20 20 20 20 20  ectory....      
f3a0: 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
f3b0: 20 79 65 73 5c 6e 0d 0a 0d 0a 20 20 20 20 20 20   yes\n....      
f3c0: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
f3d0: 4f 54 45 3a 20 44 6f 65 73 20 6f 75 72 20 63 61  OTE: Does our ca
f3e0: 6c 6c 65 72 20 77 61 6e 74 20 74 6f 20 72 65 73  ller want to res
f3f0: 65 74 20 74 68 65 20 64 69 72 65 63 74 6f 72 69  et the directori
f400: 65 73 3f 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  es?..        #..
f410: 20 20 20 20 20 20 20 20 69 66 20 7b 24 72 65 73          if {$res
f420: 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  et} then {..    
f430: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
f440: 20 20 20 23 20 4e 4f 54 45 3a 20 4e 6f 77 20 6d     # NOTE: Now m
f450: 61 6b 65 20 73 75 72 65 20 74 68 65 20 64 61 74  ake sure the dat
f460: 61 62 61 73 65 20 61 6e 64 20 74 65 6d 70 6f 72  abase and tempor
f470: 61 72 79 20 64 69 72 65 63 74 6f 72 69 65 73 20  ary directories 
f480: 61 72 65 0d 0a 20 20 20 20 20 20 20 20 20 20 23  are..          #
f490: 20 20 20 20 20 20 20 72 65 73 65 74 20 74 68 65         reset the
f4a0: 69 72 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65  ir default value
f4b0: 73 2c 20 77 68 69 63 68 20 73 68 6f 75 6c 64 20  s, which should 
f4c0: 62 65 20 6e 75 6c 6c 20 66 6f 72 20 62 6f 74 68  be null for both
f4d0: 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 20  ...          #  
f4e0: 20 20 20 20 20 53 69 6e 63 65 20 74 68 65 20 73       Since the s
f4f0: 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 65 74  qlite3_win32_set
f500: 5f 64 69 72 65 63 74 6f 72 79 20 66 75 6e 63 74  _directory funct
f510: 69 6f 6e 20 69 73 20 61 76 61 69 6c 61 62 6c 65  ion is available
f520: 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 20  ,..          #  
f530: 20 20 20 20 20 75 73 65 20 69 74 2e 0d 0a 20 20       use it...  
f540: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
f550: 20 20 20 20 20 66 6f 72 20 7b 73 65 74 20 69 6e       for {set in
f560: 64 65 78 20 31 7d 20 7b 24 69 6e 64 65 78 20 3c  dex 1} {$index <
f570: 20 33 7d 20 7b 69 6e 63 72 20 69 6e 64 65 78 7d   3} {incr index}
f580: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
f590: 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20  if {[catch {..  
f5a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f5b0: 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20    object invoke 
f5c0: 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69  -flags +NonPubli
f5d0: 63 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  c \..           
f5e0: 20 20 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e           System.
f5f0: 44 61 74 61 2e 53 51 4c 69 74 65 2e 55 6e 73 61  Data.SQLite.Unsa
f600: 66 65 4e 61 74 69 76 65 4d 65 74 68 6f 64 73 20  feNativeMethods 
f610: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
f620: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 77         sqlite3_w
f630: 69 6e 33 32 5f 73 65 74 5f 64 69 72 65 63 74 6f  in32_set_directo
f640: 72 79 20 24 69 6e 64 65 78 20 6e 75 6c 6c 7d 20  ry $index null} 
f650: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
f660: 20 20 20 20 20 20 20 72 65 73 75 6c 74 5d 20 3d         result] =
f670: 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  = 0} then {..   
f680: 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
f690: 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e   $channel [appen
f6a0: 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
f6b0: 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
f6c0: 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 5f 77 69   call sqlite3_wi
f6d0: 6e 33 32 5f 73 65 74 5f 64 69 72 65 63 74 6f 72  n32_set_director
f6e0: 79 28 22 20 24 69 6e 64 65 78 20 5c 0d 0a 20 20  y(" $index \..  
f6f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f700: 22 2c 20 6e 75 6c 6c 29 2e 2e 2e 20 6f 6b 3a 20  ", null)... ok: 
f710: 22 20 24 72 65 73 75 6c 74 20 5c 6e 5d 0d 0a 20  " $result \n].. 
f720: 20 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73             } els
f730: 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e {..           
f740: 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
f750: 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
f760: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
f770: 20 20 20 22 2d 2d 2d 2d 20 63 61 6c 6c 20 73 71     "---- call sq
f780: 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 65 74 5f  lite3_win32_set_
f790: 64 69 72 65 63 74 6f 72 79 28 22 20 24 69 6e 64  directory(" $ind
f7a0: 65 78 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  ex \..          
f7b0: 20 20 20 20 20 20 20 20 22 2c 20 6e 75 6c 6c 29          ", null)
f7c0: 2e 2e 2e 20 65 72 72 6f 72 3a 20 22 20 5c 6e 5c  ... error: " \n\
f7d0: 74 20 24 72 65 73 75 6c 74 20 5c 6e 5d 0d 0a 20  t $result \n].. 
f7e0: 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
f7f0: 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
f800: 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 20 65 6c     }..      } el
f810: 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70  se {..        tp
f820: 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 6e 6f 5c  uts $channel no\
f830: 6e 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  n....        #..
f840: 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
f850: 44 6f 65 73 20 6f 75 72 20 63 61 6c 6c 65 72 20  Does our caller 
f860: 77 61 6e 74 20 74 6f 20 72 65 73 65 74 20 74 68  want to reset th
f870: 65 20 64 69 72 65 63 74 6f 72 69 65 73 3f 20 20  e directories?  
f880: 54 68 69 73 20 63 61 6e 20 6f 6e 6c 79 0d 0a 20  This can only.. 
f890: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 62         #       b
f8a0: 65 20 70 65 72 66 6f 72 6d 65 64 20 69 66 20 53  e performed if S
f8b0: 51 4c 69 74 65 20 69 73 20 6c 6f 61 64 65 64 20  QLite is loaded 
f8c0: 61 6e 64 20 72 65 61 64 79 20 66 6f 72 20 75 73  and ready for us
f8d0: 65 20 62 79 20 74 68 65 20 74 65 73 74 0d 0a 20  e by the test.. 
f8e0: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 73         #       s
f8f0: 75 69 74 65 2e 0d 0a 20 20 20 20 20 20 20 20 23  uite...        #
f900: 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 24 72  ..        if {$r
f910: 65 73 65 74 20 26 26 20 5b 69 73 53 51 4c 69 74  eset && [isSQLit
f920: 65 52 65 61 64 79 5d 7d 20 74 68 65 6e 20 7b 0d  eReady]} then {.
f930: 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
f940: 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
f950: 4e 6f 77 20 6d 61 6b 65 20 73 75 72 65 20 74 68  Now make sure th
f960: 65 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 74  e database and t
f970: 65 6d 70 6f 72 61 72 79 20 64 69 72 65 63 74 6f  emporary directo
f980: 72 69 65 73 20 61 72 65 0d 0a 20 20 20 20 20 20  ries are..      
f990: 20 20 20 20 23 20 20 20 20 20 20 20 72 65 73 65      #       rese
f9a0: 74 20 74 68 65 69 72 20 64 65 66 61 75 6c 74 20  t their default 
f9b0: 76 61 6c 75 65 73 2c 20 77 68 69 63 68 20 73 68  values, which sh
f9c0: 6f 75 6c 64 20 62 65 20 6e 75 6c 6c 20 66 6f 72  ould be null for
f9d0: 20 62 6f 74 68 2e 0d 0a 20 20 20 20 20 20 20 20   both...        
f9e0: 20 20 23 20 20 20 20 20 20 20 53 69 6e 63 65 20    #       Since 
f9f0: 74 68 65 20 73 71 6c 69 74 65 33 5f 77 69 6e 33  the sqlite3_win3
fa00: 32 5f 73 65 74 5f 64 69 72 65 63 74 6f 72 79 20  2_set_directory 
fa10: 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f  function does no
fa20: 74 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 20  t..          #  
fa30: 20 20 20 20 20 61 70 70 65 61 72 20 74 6f 20 62       appear to b
fa40: 65 20 61 76 61 69 6c 61 62 6c 65 2c 20 75 73 65  e available, use
fa50: 20 74 68 65 20 61 73 73 6f 63 69 61 74 65 64 20   the associated 
fa60: 50 52 41 47 4d 41 20 63 6f 6d 6d 61 6e 64 73 0d  PRAGMA commands.
fa70: 0a 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20  .          #    
fa80: 20 20 20 69 6e 73 74 65 61 64 2e 0d 0a 20 20 20     instead...   
fa90: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
faa0: 20 20 20 20 66 6f 72 65 61 63 68 20 64 69 72 65      foreach dire
fab0: 63 74 6f 72 79 20 5b 6c 69 73 74 20 64 61 74 61  ctory [list data
fac0: 5f 73 74 6f 72 65 5f 64 69 72 65 63 74 6f 72 79  _store_directory
fad0: 20 74 65 6d 70 5f 73 74 6f 72 65 5f 64 69 72 65   temp_store_dire
fae0: 63 74 6f 72 79 5d 20 7b 0d 0a 20 20 20 20 20 20  ctory] {..      
faf0: 20 20 20 20 20 20 73 65 74 20 73 71 6c 20 5b 61        set sql [a
fb00: 70 70 65 6e 64 41 72 67 73 20 22 50 52 41 47 4d  ppendArgs "PRAGM
fb10: 41 20 22 20 24 64 69 72 65 63 74 6f 72 79 20 22  A " $directory "
fb20: 20 3d 20 5c 22 5c 22 3b 22 5d 0d 0a 0d 0a 20 20   = \"\";"]....  
fb30: 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63            if {[c
fb40: 61 74 63 68 20 7b 65 78 65 63 75 74 65 53 71 6c  atch {executeSql
fb50: 20 24 73 71 6c 7d 20 72 65 73 75 6c 74 5d 20 3d   $sql} result] =
fb60: 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  = 0} then {..   
fb70: 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
fb80: 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e   $channel [appen
fb90: 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
fba0: 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
fbb0: 20 65 78 65 63 75 74 65 20 50 52 41 47 4d 41 20   execute PRAGMA 
fbc0: 22 20 24 64 69 72 65 63 74 6f 72 79 20 22 2e 2e  " $directory "..
fbd0: 2e 20 6f 6b 3a 20 5c 22 22 20 5c 0d 0a 20 20 20  . ok: \"" \..   
fbe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 24                 $
fbf0: 72 65 73 75 6c 74 20 5c 22 5c 6e 5d 0d 0a 20 20  result \"\n]..  
fc00: 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65            } else
fc10: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
fc20: 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
fc30: 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
fc40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fc50: 20 20 22 2d 2d 2d 2d 20 65 78 65 63 75 74 65 20    "---- execute 
fc60: 50 52 41 47 4d 41 20 22 20 24 64 69 72 65 63 74  PRAGMA " $direct
fc70: 6f 72 79 20 22 2e 2e 2e 20 65 72 72 6f 72 3a 20  ory "... error: 
fc80: 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  " \..           
fc90: 20 20 20 20 20 20 20 5c 6e 5c 74 20 24 72 65 73         \n\t $res
fca0: 75 6c 74 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20  ult \n]..       
fcb0: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
fcc0: 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a    }..        }..
fcd0: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
fce0: 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
fcf0: 3a 20 46 69 6e 61 6c 6c 79 2c 20 73 68 6f 77 20  : Finally, show 
fd00: 74 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75  the current valu
fd10: 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
fd20: 65 20 61 6e 64 20 74 65 6d 70 6f 72 61 72 79 0d  e and temporary.
fd30: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 64  .      #       d
fd40: 69 72 65 63 74 6f 72 69 65 73 2e 20 20 54 68 69  irectories.  Thi
fd50: 73 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20 70 65  s can only be pe
fd60: 72 66 6f 72 6d 65 64 20 69 66 20 53 51 4c 69 74  rformed if SQLit
fd70: 65 20 69 73 20 6c 6f 61 64 65 64 0d 0a 20 20 20  e is loaded..   
fd80: 20 20 20 23 20 20 20 20 20 20 20 61 6e 64 20 72     #       and r
fd90: 65 61 64 79 20 66 6f 72 20 75 73 65 20 62 79 20  eady for use by 
fda0: 74 68 65 20 74 65 73 74 20 73 75 69 74 65 2e 0d  the test suite..
fdb0: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
fdc0: 69 66 20 7b 5b 69 73 53 51 4c 69 74 65 52 65 61  if {[isSQLiteRea
fdd0: 64 79 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  dy]} then {..   
fde0: 20 20 20 20 20 66 6f 72 65 61 63 68 20 64 69 72       foreach dir
fdf0: 65 63 74 6f 72 79 20 5b 6c 69 73 74 20 64 61 74  ectory [list dat
fe00: 61 5f 73 74 6f 72 65 5f 64 69 72 65 63 74 6f 72  a_store_director
fe10: 79 20 74 65 6d 70 5f 73 74 6f 72 65 5f 64 69 72  y temp_store_dir
fe20: 65 63 74 6f 72 79 5d 20 7b 0d 0a 20 20 20 20 20  ectory] {..     
fe30: 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
fe40: 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
fe50: 22 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e 67 20 22  "---- checking "
fe60: 20 24 64 69 72 65 63 74 6f 72 79 20 22 2e 2e 2e   $directory "...
fe70: 20 22 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20   "]....         
fe80: 20 73 65 74 20 73 71 6c 20 5b 61 70 70 65 6e 64   set sql [append
fe90: 41 72 67 73 20 22 50 52 41 47 4d 41 20 22 20 24  Args "PRAGMA " $
fea0: 64 69 72 65 63 74 6f 72 79 20 5c 3b 5d 0d 0a 0d  directory \;]...
feb0: 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b  .          if {[
fec0: 63 61 74 63 68 20 7b 65 78 65 63 75 74 65 53 71  catch {executeSq
fed0: 6c 20 24 73 71 6c 20 73 63 61 6c 61 72 7d 20 72  l $sql scalar} r
fee0: 65 73 75 6c 74 5d 20 3d 3d 20 30 7d 20 74 68 65  esult] == 0} the
fef0: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
ff00: 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
ff10: 5b 61 70 70 65 6e 64 41 72 67 73 20 22 6f 6b 3a  [appendArgs "ok:
ff20: 20 5c 22 22 20 24 72 65 73 75 6c 74 20 5c 22 5c   \"" $result \"\
ff30: 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 20  n]..          } 
ff40: 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
ff50: 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
ff60: 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 22  el [appendArgs "
ff70: 65 72 72 6f 72 3a 20 22 20 5c 6e 5c 74 20 24 72  error: " \n\t $r
ff80: 65 73 75 6c 74 20 5c 6e 5d 0d 0a 20 20 20 20 20  esult \n]..     
ff90: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
ffa0: 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  }..      }..    
ffb0: 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 6c  }.....    proc l
ffc0: 6f 61 64 53 51 4c 69 74 65 54 65 73 74 53 65 74  oadSQLiteTestSet
ffd0: 74 69 6e 67 73 20 7b 20 63 68 61 6e 6e 65 6c 20  tings { channel 
ffe0: 7b 73 75 66 66 69 78 20 22 22 7d 20 7b 71 75 69  {suffix ""} {qui
fff0: 65 74 20 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a 20  et false} } {.. 
10000 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
10010 4e 4f 54 45 3a 20 53 6b 69 70 20 6c 6f 61 64 69  NOTE: Skip loadi
10020 6e 67 20 74 68 65 20 73 65 74 74 69 6e 67 73 20  ng the settings 
10030 69 66 20 74 68 65 69 72 20 75 73 61 67 65 20 68  if their usage h
10040 61 73 20 62 65 65 6e 20 64 69 73 61 62 6c 65 64  as been disabled
10050 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
10060 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69    if {![info exi
10070 73 74 73 20 3a 3a 6e 6f 28 73 71 6c 69 74 65 54  sts ::no(sqliteT
10080 65 73 74 53 65 74 74 69 6e 67 73 29 5d 7d 20 74  estSettings)]} t
10090 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  hen {..        #
100a0 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
100b0 3a 20 4c 6f 61 64 20 63 75 73 74 6f 6d 20 70 65  : Load custom pe
100c0 72 2d 75 73 65 72 20 61 6e 64 2f 6f 72 20 70 65  r-user and/or pe
100d0 72 2d 68 6f 73 74 20 74 65 73 74 20 73 65 74 74  r-host test sett
100e0 69 6e 67 73 20 6e 6f 77 2e 0d 0a 20 20 20 20 20  ings now...     
100f0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 69 66     #..        if
10100 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a   {[info exists :
10110 3a 74 63 6c 5f 70 6c 61 74 66 6f 72 6d 28 75 73  :tcl_platform(us
10120 65 72 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  er)]} then {..  
10130 20 20 20 20 20 20 20 20 73 65 74 20 75 73 65 72          set user
10140 53 65 74 74 69 6e 67 73 46 69 6c 65 4e 61 6d 65  SettingsFileName
10150 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5b 67 65 74   [file join [get
10160 43 6f 6d 6d 6f 6e 44 69 72 65 63 74 6f 72 79 5d  CommonDirectory]
10170 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
10180 20 20 5b 61 70 70 65 6e 64 41 72 67 73 20 73 65    [appendArgs se
10190 74 74 69 6e 67 73 20 24 73 75 66 66 69 78 20 2e  ttings $suffix .
101a0 20 24 3a 3a 74 63 6c 5f 70 6c 61 74 66 6f 72 6d   $::tcl_platform
101b0 28 75 73 65 72 29 20 2e 65 61 67 6c 65 5d 5d 0d  (user) .eagle]].
101c0 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20  ...          if 
101d0 7b 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24 75  {[file exists $u
101e0 73 65 72 53 65 74 74 69 6e 67 73 46 69 6c 65 4e  serSettingsFileN
101f0 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ame]} then {..  
10200 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 24            if {!$
10210 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20  quiet} then {.. 
10220 20 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75               tpu
10230 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70  ts $channel [app
10240 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
10250 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d               "--
10260 2d 2d 20 6c 6f 61 64 69 6e 67 20 70 65 72 2d 75  -- loading per-u
10270 73 65 72 20 74 65 73 74 20 73 65 74 74 69 6e 67  ser test setting
10280 73 20 66 69 6c 65 20 5c 22 22 20 5c 0d 0a 20 20  s file \"" \..  
10290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
102a0 24 75 73 65 72 53 65 74 74 69 6e 67 73 46 69 6c  $userSettingsFil
102b0 65 4e 61 6d 65 20 5c 22 2e 2e 2e 5c 6e 5d 0d 0a  eName \"...\n]..
102c0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d              }...
102d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20  .            if 
102e0 7b 5b 63 61 74 63 68 20 7b 75 70 6c 65 76 65 6c  {[catch {uplevel
102f0 20 31 20 5b 6c 69 73 74 20 73 6f 75 72 63 65 20   1 [list source 
10300 24 75 73 65 72 53 65 74 74 69 6e 67 73 46 69 6c  $userSettingsFil
10310 65 4e 61 6d 65 5d 7d 20 5c 0d 0a 20 20 20 20 20  eName]} \..     
10320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65                 e
10330 72 72 6f 72 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  rror]} then {.. 
10340 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20               if 
10350 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b  {!$quiet} then {
10360 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
10370 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
10380 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
10390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
103a0 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e      "==== WARNIN
103b0 47 3a 20 66 61 69 6c 65 64 20 74 6f 20 6c 6f 61  G: failed to loa
103c0 64 20 70 65 72 2d 75 73 65 72 20 73 65 74 74 69  d per-user setti
103d0 6e 67 73 20 66 69 6c 65 20 5c 22 22 20 5c 0d 0a  ngs file \"" \..
103e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
103f0 20 20 20 20 24 75 73 65 72 53 65 74 74 69 6e 67      $userSetting
10400 73 46 69 6c 65 4e 61 6d 65 20 22 5c 22 2c 20 65  sFileName "\", e
10410 72 72 6f 72 3a 20 22 20 5c 6e 5c 74 20 24 65 72  rror: " \n\t $er
10420 72 6f 72 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20  ror \n]..       
10430 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
10440 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
10450 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
10460 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71           if {!$q
10470 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  uiet} then {..  
10480 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
10490 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  s $channel [appe
104a0 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
104b0 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
104c0 2d 20 73 6b 69 70 70 65 64 20 6c 6f 61 64 69 6e  - skipped loadin
104d0 67 20 70 65 72 2d 75 73 65 72 20 74 65 73 74 20  g per-user test 
104e0 73 65 74 74 69 6e 67 73 20 66 69 6c 65 20 5c 22  settings file \"
104f0 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  " \..           
10500 20 20 20 20 20 20 20 24 75 73 65 72 53 65 74 74         $userSett
10510 69 6e 67 73 46 69 6c 65 4e 61 6d 65 20 22 5c 22  ingsFileName "\"
10520 2c 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 65 78  , it does not ex
10530 69 73 74 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20  ist\n"]..       
10540 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
10550 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a    }..        }..
10560 0d 0a 20 20 20 20 20 20 20 20 23 23 23 23 23 23  ..        ######
10570 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
10580 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
10590 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
105a0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
105b0 23 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20  #....        if 
105c0 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  {[info exists ::
105d0 74 63 6c 5f 70 6c 61 74 66 6f 72 6d 28 68 6f 73  tcl_platform(hos
105e0 74 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  t)]} then {..   
105f0 20 20 20 20 20 20 20 73 65 74 20 68 6f 73 74 53         set hostS
10600 65 74 74 69 6e 67 73 46 69 6c 65 4e 61 6d 65 20  ettingsFileName 
10610 5b 66 69 6c 65 20 6a 6f 69 6e 20 5b 67 65 74 43  [file join [getC
10620 6f 6d 6d 6f 6e 44 69 72 65 63 74 6f 72 79 5d 20  ommonDirectory] 
10630 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
10640 20 5b 61 70 70 65 6e 64 41 72 67 73 20 73 65 74   [appendArgs set
10650 74 69 6e 67 73 20 24 73 75 66 66 69 78 20 2e 20  tings $suffix . 
10660 24 3a 3a 74 63 6c 5f 70 6c 61 74 66 6f 72 6d 28  $::tcl_platform(
10670 68 6f 73 74 29 20 2e 65 61 67 6c 65 5d 5d 0d 0a  host) .eagle]]..
10680 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b  ..          if {
10690 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24 68 6f  [file exists $ho
106a0 73 74 53 65 74 74 69 6e 67 73 46 69 6c 65 4e 61  stSettingsFileNa
106b0 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  me]} then {..   
106c0 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71           if {!$q
106d0 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  uiet} then {..  
106e0 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
106f0 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  s $channel [appe
10700 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
10710 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
10720 2d 20 6c 6f 61 64 69 6e 67 20 70 65 72 2d 68 6f  - loading per-ho
10730 73 74 20 74 65 73 74 20 73 65 74 74 69 6e 67 73  st test settings
10740 20 66 69 6c 65 20 5c 22 22 20 5c 0d 0a 20 20 20   file \"" \..   
10750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 24                 $
10760 68 6f 73 74 53 65 74 74 69 6e 67 73 46 69 6c 65  hostSettingsFile
10770 4e 61 6d 65 20 5c 22 2e 2e 2e 5c 6e 5d 0d 0a 20  Name \"...\n].. 
10780 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a             }....
10790 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b              if {
107a0 5b 63 61 74 63 68 20 7b 75 70 6c 65 76 65 6c 20  [catch {uplevel 
107b0 31 20 5b 6c 69 73 74 20 73 6f 75 72 63 65 20 24  1 [list source $
107c0 68 6f 73 74 53 65 74 74 69 6e 67 73 46 69 6c 65  hostSettingsFile
107d0 4e 61 6d 65 5d 7d 20 5c 0d 0a 20 20 20 20 20 20  Name]} \..      
107e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65 72                er
107f0 72 6f 72 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ror]} then {..  
10800 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b              if {
10810 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d  !$quiet} then {.
10820 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
10830 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
10840 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
10850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10860 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47     "==== WARNING
10870 3a 20 66 61 69 6c 65 64 20 74 6f 20 6c 6f 61 64  : failed to load
10880 20 70 65 72 2d 68 6f 73 74 20 73 65 74 74 69 6e   per-host settin
10890 67 73 20 66 69 6c 65 20 5c 22 22 20 5c 0d 0a 20  gs file \"" \.. 
108a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
108b0 20 20 20 24 68 6f 73 74 53 65 74 74 69 6e 67 73     $hostSettings
108c0 46 69 6c 65 4e 61 6d 65 20 22 5c 22 2c 20 65 72  FileName "\", er
108d0 72 6f 72 3a 20 22 20 5c 6e 5c 74 20 24 65 72 72  ror: " \n\t $err
108e0 6f 72 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20  or \n]..        
108f0 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
10900 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
10910 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
10920 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75          if {!$qu
10930 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  iet} then {..   
10940 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
10950 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e   $channel [appen
10960 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
10970 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
10980 20 73 6b 69 70 70 65 64 20 6c 6f 61 64 69 6e 67   skipped loading
10990 20 70 65 72 2d 68 6f 73 74 20 74 65 73 74 20 73   per-host test s
109a0 65 74 74 69 6e 67 73 20 66 69 6c 65 20 5c 22 22  ettings file \""
109b0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
109c0 20 20 20 20 20 20 24 68 6f 73 74 53 65 74 74 69        $hostSetti
109d0 6e 67 73 46 69 6c 65 4e 61 6d 65 20 22 5c 22 2c  ngsFileName "\",
109e0 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 65 78 69   it does not exi
109f0 73 74 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20  st\n"]..        
10a00 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
10a10 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20   }..        }.. 
10a20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c       }..    }...
10a30 0d 0a 20 20 20 20 70 72 6f 63 20 72 75 6e 53 51  ..    proc runSQ
10a40 4c 69 74 65 54 65 73 74 50 72 6f 6c 6f 67 75 65  LiteTestPrologue
10a50 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a   {} {..      #..
10a60 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 6b        # NOTE: Sk
10a70 69 70 20 72 75 6e 6e 69 6e 67 20 6f 75 72 20 63  ip running our c
10a80 75 73 74 6f 6d 20 70 72 6f 6c 6f 67 75 65 20 69  ustom prologue i
10a90 66 20 74 68 65 20 6d 61 69 6e 20 6f 6e 65 20 68  f the main one h
10aa0 61 73 20 62 65 65 6e 0d 0a 20 20 20 20 20 20 23  as been..      #
10ab0 20 20 20 20 20 20 20 73 6b 69 70 70 65 64 2e 0d         skipped..
10ac0 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
10ad0 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74  if {![info exist
10ae0 73 20 3a 3a 6e 6f 28 70 72 6f 6c 6f 67 75 65 2e  s ::no(prologue.
10af0 65 61 67 6c 65 29 5d 7d 20 74 68 65 6e 20 7b 0d  eagle)]} then {.
10b00 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
10b10 20 20 20 20 23 20 4e 4f 54 45 3a 20 4c 6f 61 64      # NOTE: Load
10b20 20 74 68 65 20 22 62 65 66 6f 72 65 2d 63 6f 6e   the "before-con
10b30 73 74 72 61 69 6e 74 73 22 20 63 75 73 74 6f 6d  straints" custom
10b40 20 70 65 72 2d 75 73 65 72 20 61 6e 64 2f 6f 72   per-user and/or
10b50 20 70 65 72 2d 68 6f 73 74 0d 0a 20 20 20 20 20   per-host..     
10b60 20 20 20 23 20 20 20 20 20 20 20 74 65 73 74 20     #       test 
10b70 73 65 74 74 69 6e 67 73 20 6e 6f 77 2e 0d 0a 20  settings now... 
10b80 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
10b90 20 20 75 70 6c 65 76 65 6c 20 31 20 5b 6c 69 73    uplevel 1 [lis
10ba0 74 20 6c 6f 61 64 53 51 4c 69 74 65 54 65 73 74  t loadSQLiteTest
10bb0 53 65 74 74 69 6e 67 73 20 24 3a 3a 74 65 73 74  Settings $::test
10bc0 5f 63 68 61 6e 6e 65 6c 20 2e 62 65 66 6f 72 65  _channel .before
10bd0 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  ]....        #..
10be0 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
10bf0 53 6b 69 70 20 61 6c 6c 20 53 79 73 74 65 6d 2e  Skip all System.
10c00 44 61 74 61 2e 53 51 4c 69 74 65 20 72 65 6c 61  Data.SQLite rela
10c10 74 65 64 20 66 69 6c 65 20 68 61 6e 64 6c 69 6e  ted file handlin
10c20 67 20 28 64 65 6c 65 74 69 6e 67 2c 0d 0a 20 20  g (deleting,..  
10c30 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63 6f        #       co
10c40 70 79 69 6e 67 2c 20 61 6e 64 20 6c 6f 61 64 69  pying, and loadi
10c50 6e 67 29 20 69 66 20 77 65 20 61 72 65 20 73 6f  ng) if we are so
10c60 20 69 6e 73 74 72 75 63 74 65 64 2e 0d 0a 20 20   instructed...  
10c70 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
10c80 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73   if {![info exis
10c90 74 73 20 3a 3a 6e 6f 28 73 71 6c 69 74 65 46 69  ts ::no(sqliteFi
10ca0 6c 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  les)]} then {.. 
10cb0 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
10cc0 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 6b        # NOTE: Sk
10cd0 69 70 20 74 72 79 69 6e 67 20 74 6f 20 64 65 6c  ip trying to del
10ce0 65 74 65 20 61 6e 79 20 66 69 6c 65 73 20 69 66  ete any files if
10cf0 20 77 65 20 61 72 65 20 73 6f 20 69 6e 73 74 72   we are so instr
10d00 75 63 74 65 64 2e 0d 0a 20 20 20 20 20 20 20 20  ucted...        
10d10 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 69    #..          i
10d20 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73  f {![info exists
10d30 20 3a 3a 6e 6f 28 64 65 6c 65 74 65 53 71 6c 69   ::no(deleteSqli
10d40 74 65 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e 20  teFiles)]} then 
10d50 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  {..            t
10d60 72 79 44 65 6c 65 74 65 41 73 73 65 6d 62 6c 79  ryDeleteAssembly
10d70 20 73 71 6c 69 74 65 33 2e 64 6c 6c 0d 0a 20 20   sqlite3.dll..  
10d80 20 20 20 20 20 20 20 20 20 20 72 65 6d 6f 76 65            remove
10d90 43 6f 6e 73 74 72 61 69 6e 74 20 66 69 6c 65 5f  Constraint file_
10da0 73 71 6c 69 74 65 33 2e 64 6c 6c 0d 0a 0d 0a 20  sqlite3.dll.... 
10db0 20 20 20 20 20 20 20 20 20 20 20 74 72 79 44 65             tryDe
10dc0 6c 65 74 65 41 73 73 65 6d 62 6c 79 20 53 51 4c  leteAssembly SQL
10dd0 69 74 65 2e 49 6e 74 65 72 6f 70 2e 64 6c 6c 0d  ite.Interop.dll.
10de0 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 6d  .            rem
10df0 6f 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 66 69  oveConstraint fi
10e00 6c 65 5f 53 51 4c 69 74 65 2e 49 6e 74 65 72 6f  le_SQLite.Intero
10e10 70 2e 64 6c 6c 0d 0a 0d 0a 20 20 20 20 20 20 20  p.dll....       
10e20 20 20 20 20 20 74 72 79 44 65 6c 65 74 65 41 73       tryDeleteAs
10e30 73 65 6d 62 6c 79 20 53 79 73 74 65 6d 2e 44 61  sembly System.Da
10e40 74 61 2e 53 51 4c 69 74 65 2e 64 6c 6c 0d 0a 20  ta.SQLite.dll.. 
10e50 20 20 20 20 20 20 20 20 20 20 20 72 65 6d 6f 76             remov
10e60 65 43 6f 6e 73 74 72 61 69 6e 74 20 66 69 6c 65  eConstraint file
10e70 5f 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c  _System.Data.SQL
10e80 69 74 65 2e 64 6c 6c 0d 0a 0d 0a 20 20 20 20 20  ite.dll....     
10e90 20 20 20 20 20 20 20 74 72 79 44 65 6c 65 74 65         tryDelete
10ea0 41 73 73 65 6d 62 6c 79 20 53 79 73 74 65 6d 2e  Assembly System.
10eb0 44 61 74 61 2e 53 51 4c 69 74 65 2e 4c 69 6e 71  Data.SQLite.Linq
10ec0 2e 64 6c 6c 0d 0a 20 20 20 20 20 20 20 20 20 20  .dll..          
10ed0 20 20 72 65 6d 6f 76 65 43 6f 6e 73 74 72 61 69    removeConstrai
10ee0 6e 74 20 66 69 6c 65 5f 53 79 73 74 65 6d 2e 44  nt file_System.D
10ef0 61 74 61 2e 53 51 4c 69 74 65 2e 4c 69 6e 71 2e  ata.SQLite.Linq.
10f00 64 6c 6c 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  dll..          }
10f10 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d  ....          #.
10f20 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54  .          # NOT
10f30 45 3a 20 53 6b 69 70 20 74 72 79 69 6e 67 20 74  E: Skip trying t
10f40 6f 20 76 65 72 69 66 79 20 74 68 65 20 62 75 69  o verify the bui
10f50 6c 64 20 64 69 72 65 63 74 6f 72 79 20 69 66 20  ld directory if 
10f60 77 65 20 61 72 65 20 73 6f 0d 0a 20 20 20 20 20  we are so..     
10f70 20 20 20 20 20 23 20 20 20 20 20 20 20 69 6e 73       #       ins
10f80 74 72 75 63 74 65 64 3b 20 6f 74 68 65 72 77 69  tructed; otherwi
10f90 73 65 2c 20 6d 61 6b 65 20 73 75 72 65 20 69 74  se, make sure it
10fa0 20 61 63 74 75 61 6c 6c 79 20 65 78 69 73 74 73   actually exists
10fb0 20 6f 72 0d 0a 20 20 20 20 20 20 20 20 20 20 23   or..          #
10fc0 20 20 20 20 20 20 20 68 61 6c 74 20 74 68 65 20         halt the 
10fd0 65 6e 74 69 72 65 20 74 65 73 74 69 6e 67 20 70  entire testing p
10fe0 72 6f 63 65 73 73 20 69 66 20 69 74 20 64 6f 65  rocess if it doe
10ff0 73 20 6e 6f 74 20 65 78 69 73 74 2e 0d 0a 20 20  s not exist...  
11000 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
11010 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20       if {![info 
11020 65 78 69 73 74 73 20 3a 3a 6e 6f 28 76 65 72 69  exists ::no(veri
11030 66 79 42 75 69 6c 64 44 69 72 65 63 74 6f 72 79  fyBuildDirectory
11040 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  )]} then {..    
11050 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
11060 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41         # NOTE: A
11070 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68  t this point, th
11080 65 20 62 75 69 6c 64 20 64 69 72 65 63 74 6f 72  e build director
11090 79 20 4d 55 53 54 20 65 78 69 73 74 20 61 73 20  y MUST exist as 
110a0 61 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23  a..            #
110b0 20 20 20 20 20 20 20 76 61 6c 69 64 20 64 69 72         valid dir
110c0 65 63 74 6f 72 79 20 66 6f 72 20 74 68 65 20 74  ectory for the t
110d0 65 73 74 69 6e 67 20 70 72 6f 63 65 73 73 20 74  esting process t
110e0 6f 20 63 6f 6e 74 69 6e 75 65 2e 0d 0a 20 20 20  o continue...   
110f0 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
11100 20 20 20 20 20 20 20 20 73 65 74 20 64 69 72 65          set dire
11110 63 74 6f 72 79 20 5b 67 65 74 42 75 69 6c 64 44  ctory [getBuildD
11120 69 72 65 63 74 6f 72 79 5d 0d 0a 0d 0a 20 20 20  irectory]....   
11130 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 66           if {![f
11140 69 6c 65 20 65 78 69 73 74 73 20 24 64 69 72 65  ile exists $dire
11150 63 74 6f 72 79 5d 20 7c 7c 20 5c 0d 0a 20 20 20  ctory] || \..   
11160 20 20 20 20 20 20 20 20 20 20 20 20 20 21 5b 66               ![f
11170 69 6c 65 20 69 73 64 69 72 65 63 74 6f 72 79 20  ile isdirectory 
11180 24 64 69 72 65 63 74 6f 72 79 5d 7d 20 74 68 65  $directory]} the
11190 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
111a0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
111b0 20 20 20 20 23 20 4e 4f 54 45 3a 20 4a 75 73 74      # NOTE: Just
111c0 20 70 72 69 6f 72 20 74 6f 20 61 63 74 75 61 6c   prior to actual
111d0 6c 79 20 68 61 6c 74 69 6e 67 20 74 68 65 20 74  ly halting the t
111e0 65 73 74 69 6e 67 20 70 72 6f 63 65 73 73 2c 0d  esting process,.
111f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23  .              #
11200 20 20 20 20 20 20 20 61 64 64 20 61 6e 20 65 72         add an er
11210 72 6f 72 20 74 6f 20 74 68 65 20 74 65 73 74 20  ror to the test 
11220 6c 6f 67 20 66 69 6c 65 2e 0d 0a 20 20 20 20 20  log file...     
11230 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
11240 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
11250 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
11260 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
11270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11280 20 22 2d 2d 2d 2d 20 63 6f 75 6c 64 20 6e 6f 74   "---- could not
11290 20 76 65 72 69 66 79 20 62 75 69 6c 64 20 64 69   verify build di
112a0 72 65 63 74 6f 72 79 20 5c 22 22 20 24 64 69 72  rectory \"" $dir
112b0 65 63 74 6f 72 79 20 5c 0d 0a 20 20 20 20 20 20  ectory \..      
112c0 20 20 20 20 20 20 20 20 20 20 20 20 22 5c 22 2c              "\",
112d0 20 61 6c 6c 20 74 65 73 74 69 6e 67 20 68 61 6c   all testing hal
112e0 74 65 64 5c 6e 22 5d 0d 0a 0d 0a 20 20 20 20 20  ted\n"]....     
112f0 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
11300 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45            # NOTE
11310 3a 20 52 61 69 73 69 6e 67 20 61 20 73 63 72 69  : Raising a scri
11320 70 74 20 65 72 72 6f 72 20 66 72 6f 6d 20 74 68  pt error from th
11330 69 73 20 70 6f 69 6e 74 20 73 68 6f 75 6c 64 20  is point should 
11340 68 61 6c 74 0d 0a 20 20 20 20 20 20 20 20 20 20  halt..          
11350 20 20 20 20 23 20 20 20 20 20 20 20 74 68 65 20      #       the 
11360 74 65 73 74 69 6e 67 20 70 72 6f 63 65 73 73 2e  testing process.
11370 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
11380 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  #..             
11390 20 65 72 72 6f 72 20 5b 61 70 70 65 6e 64 41 72   error [appendAr
113a0 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
113b0 20 20 20 20 20 20 20 20 22 63 6f 75 6c 64 20 6e          "could n
113c0 6f 74 20 76 65 72 69 66 79 20 62 75 69 6c 64 20  ot verify build 
113d0 64 69 72 65 63 74 6f 72 79 20 5c 22 22 20 24 64  directory \"" $d
113e0 69 72 65 63 74 6f 72 79 20 5c 0d 0a 20 20 20 20  irectory \..    
113f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 5c                "\
11400 22 2c 20 61 6c 6c 20 74 65 73 74 69 6e 67 20 68  ", all testing h
11410 61 6c 74 65 64 22 5d 0d 0a 20 20 20 20 20 20 20  alted"]..       
11420 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
11430 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20    }....         
11440 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20   #..          # 
11450 4e 4f 54 45 3a 20 53 6b 69 70 20 74 72 79 69 6e  NOTE: Skip tryin
11460 67 20 74 6f 20 63 6f 70 79 20 61 6e 79 20 66 69  g to copy any fi
11470 6c 65 73 20 69 66 20 77 65 20 61 72 65 20 73 6f  les if we are so
11480 20 69 6e 73 74 72 75 63 74 65 64 2e 0d 0a 20 20   instructed...  
11490 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
114a0 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20       if {![info 
114b0 65 78 69 73 74 73 20 3a 3a 6e 6f 28 63 6f 70 79  exists ::no(copy
114c0 53 71 6c 69 74 65 46 69 6c 65 73 29 5d 7d 20 74  SqliteFiles)]} t
114d0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
114e0 20 20 20 74 72 79 43 6f 70 79 41 73 73 65 6d 62     tryCopyAssemb
114f0 6c 79 20 73 71 6c 69 74 65 33 2e 64 6c 6c 0d 0a  ly sqlite3.dll..
11500 20 20 20 20 20 20 20 20 20 20 20 20 74 72 79 43              tryC
11510 6f 70 79 41 73 73 65 6d 62 6c 79 20 53 51 4c 69  opyAssembly SQLi
11520 74 65 2e 49 6e 74 65 72 6f 70 2e 64 6c 6c 0d 0a  te.Interop.dll..
11530 20 20 20 20 20 20 20 20 20 20 20 20 74 72 79 43              tryC
11540 6f 70 79 41 73 73 65 6d 62 6c 79 20 53 79 73 74  opyAssembly Syst
11550 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 64  em.Data.SQLite.d
11560 6c 6c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ll..            
11570 74 72 79 43 6f 70 79 41 73 73 65 6d 62 6c 79 20  tryCopyAssembly 
11580 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
11590 74 65 2e 4c 69 6e 71 2e 64 6c 6c 0d 0a 20 20 20  te.Linq.dll..   
115a0 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
115b0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
115c0 20 20 20 23 20 4e 4f 54 45 3a 20 53 6b 69 70 20     # NOTE: Skip 
115d0 74 72 79 69 6e 67 20 74 6f 20 6c 6f 61 64 20 61  trying to load a
115e0 6e 79 20 66 69 6c 65 73 20 69 66 20 77 65 20 61  ny files if we a
115f0 72 65 20 73 6f 20 69 6e 73 74 72 75 63 74 65 64  re so instructed
11600 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a  ...          #..
11610 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b            if {![
11620 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f  info exists ::no
11630 28 6c 6f 61 64 53 71 6c 69 74 65 46 69 6c 65 73  (loadSqliteFiles
11640 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  )]} then {..    
11650 20 20 20 20 20 20 20 20 74 72 79 4c 6f 61 64 41          tryLoadA
11660 73 73 65 6d 62 6c 79 20 53 79 73 74 65 6d 2e 44  ssembly System.D
11670 61 74 61 2e 53 51 4c 69 74 65 2e 64 6c 6c 0d 0a  ata.SQLite.dll..
11680 20 20 20 20 20 20 20 20 20 20 20 20 74 72 79 4c              tryL
11690 6f 61 64 41 73 73 65 6d 62 6c 79 20 53 79 73 74  oadAssembly Syst
116a0 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 4c  em.Data.SQLite.L
116b0 69 6e 71 2e 64 6c 6c 0d 0a 20 20 20 20 20 20 20  inq.dll..       
116c0 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
116d0 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23    #..          #
116e0 20 4e 4f 54 45 3a 20 53 6b 69 70 20 74 72 79 69   NOTE: Skip tryi
116f0 6e 67 20 74 6f 20 64 65 6c 65 74 65 20 65 78 74  ng to delete ext
11700 65 72 6e 61 6c 20 66 69 6c 65 73 20 69 66 20 77  ernal files if w
11710 65 20 61 72 65 20 73 6f 20 69 6e 73 74 72 75 63  e are so instruc
11720 74 65 64 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  ted...          
11730 23 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20  #..          if 
11740 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a  {![info exists :
11750 3a 6e 6f 28 64 65 6c 65 74 65 53 71 6c 69 74 65  :no(deleteSqlite
11760 45 78 74 65 72 6e 61 6c 46 69 6c 65 73 29 5d 7d  ExternalFiles)]}
11770 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
11780 20 20 20 20 20 74 72 79 44 65 6c 65 74 65 42 75       tryDeleteBu
11790 69 6c 64 46 69 6c 65 20 49 6e 73 74 61 6c 6c 65  ildFile Installe
117a0 72 2e 65 78 65 2e 6d 64 61 2e 63 6f 6e 66 69 67  r.exe.mda.config
117b0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 72  ..            tr
117c0 79 44 65 6c 65 74 65 42 75 69 6c 64 46 69 6c 65  yDeleteBuildFile
117d0 20 74 65 73 74 2e 65 78 65 2e 6d 64 61 2e 63 6f   test.exe.mda.co
117e0 6e 66 69 67 0d 0a 20 20 20 20 20 20 20 20 20 20  nfig..          
117f0 20 20 74 72 79 44 65 6c 65 74 65 42 75 69 6c 64    tryDeleteBuild
11800 46 69 6c 65 20 74 65 73 74 6c 69 6e 71 2e 65 78  File testlinq.ex
11810 65 2e 6d 64 61 2e 63 6f 6e 66 69 67 0d 0a 20 20  e.mda.config..  
11820 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
11830 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
11840 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 6b 69 70      # NOTE: Skip
11850 20 74 72 79 69 6e 67 20 74 6f 20 63 6f 70 79 20   trying to copy 
11860 65 78 74 65 72 6e 61 6c 20 66 69 6c 65 73 20 69  external files i
11870 66 20 77 65 20 61 72 65 20 73 6f 20 69 6e 73 74  f we are so inst
11880 72 75 63 74 65 64 2e 0d 0a 20 20 20 20 20 20 20  ructed...       
11890 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
118a0 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74  if {![info exist
118b0 73 20 3a 3a 6e 6f 28 63 6f 70 79 53 71 6c 69 74  s ::no(copySqlit
118c0 65 45 78 74 65 72 6e 61 6c 46 69 6c 65 73 29 5d  eExternalFiles)]
118d0 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
118e0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
118f0 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 6f 70       # NOTE: Cop
11900 79 20 74 68 65 20 4d 44 41 20 63 6f 6e 66 69 67  y the MDA config
11910 75 72 61 74 69 6f 6e 20 66 69 6c 65 20 66 6f 72  uration file for
11920 20 74 68 65 20 45 61 67 6c 65 20 73 68 65 6c 6c   the Eagle shell
11930 20 74 6f 20 74 68 65 0d 0a 20 20 20 20 20 20 20   to the..       
11940 20 20 20 20 20 23 20 20 20 20 20 20 20 62 75 69       #       bui
11950 6c 64 20 6f 75 74 70 75 74 20 64 69 72 65 63 74  ld output direct
11960 6f 72 79 3b 20 68 6f 77 65 76 65 72 2c 20 75 73  ory; however, us
11970 65 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  e the name of th
11980 65 20 6c 65 67 61 63 79 0d 0a 20 20 20 20 20 20  e legacy..      
11990 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74 65        #       te
119a0 73 74 20 65 78 65 63 75 74 61 62 6c 65 2e 20 20  st executable.  
119b0 54 68 69 73 20 77 69 6c 6c 20 6d 61 6b 65 20 73  This will make s
119c0 75 72 65 20 74 68 61 74 20 74 68 65 20 6c 65 67  ure that the leg
119d0 61 63 79 20 74 65 73 74 73 0d 0a 20 20 20 20 20  acy tests..     
119e0 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 72         #       r
119f0 75 6e 20 77 69 74 68 20 74 68 65 20 73 61 6d 65  un with the same
11a00 20 73 65 74 20 6f 66 20 4d 44 41 73 20 63 6f 6e   set of MDAs con
11a10 66 69 67 75 72 65 64 2e 0d 0a 20 20 20 20 20 20  figured...      
11a20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
11a30 20 20 20 20 20 74 72 79 43 6f 70 79 42 69 6e 61       tryCopyBina
11a40 72 79 46 69 6c 65 20 45 61 67 6c 65 53 68 65 6c  ryFile EagleShel
11a50 6c 2e 65 78 65 2e 6d 64 61 2e 63 6f 6e 66 69 67  l.exe.mda.config
11a60 20 49 6e 73 74 61 6c 6c 65 72 2e 65 78 65 2e 6d   Installer.exe.m
11a70 64 61 2e 63 6f 6e 66 69 67 0d 0a 20 20 20 20 20  da.config..     
11a80 20 20 20 20 20 20 20 74 72 79 43 6f 70 79 42 69         tryCopyBi
11a90 6e 61 72 79 46 69 6c 65 20 45 61 67 6c 65 53 68  naryFile EagleSh
11aa0 65 6c 6c 2e 65 78 65 2e 6d 64 61 2e 63 6f 6e 66  ell.exe.mda.conf
11ab0 69 67 20 74 65 73 74 2e 65 78 65 2e 6d 64 61 2e  ig test.exe.mda.
11ac0 63 6f 6e 66 69 67 0d 0a 20 20 20 20 20 20 20 20  config..        
11ad0 20 20 20 20 74 72 79 43 6f 70 79 42 69 6e 61 72      tryCopyBinar
11ae0 79 46 69 6c 65 20 45 61 67 6c 65 53 68 65 6c 6c  yFile EagleShell
11af0 2e 65 78 65 2e 6d 64 61 2e 63 6f 6e 66 69 67 20  .exe.mda.config 
11b00 74 65 73 74 6c 69 6e 71 2e 65 78 65 2e 6d 64 61  testlinq.exe.mda
11b10 2e 63 6f 6e 66 69 67 0d 0a 20 20 20 20 20 20 20  .config..       
11b20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d     }..        }.
11b30 0a 0d 0a 20 20 20 20 20 20 20 20 63 61 74 63 68  ...        catch
11b40 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70   {..          tp
11b50 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  uts $::test_chan
11b60 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
11b70 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
11b80 20 22 2d 2d 2d 2d 20 66 69 6c 65 20 76 65 72 73   "---- file vers
11b90 69 6f 6e 20 6f 66 20 5c 22 73 71 6c 69 74 65 33  ion of \"sqlite3
11ba0 2e 64 6c 6c 5c 22 2e 2e 2e 20 22 20 5c 0d 0a 20  .dll\"... " \.. 
11bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 66 69               [fi
11bc0 6c 65 20 76 65 72 73 69 6f 6e 20 5b 67 65 74 42  le version [getB
11bd0 69 6e 61 72 79 46 69 6c 65 4e 61 6d 65 20 73 71  inaryFileName sq
11be0 6c 69 74 65 33 2e 64 6c 6c 5d 5d 20 5c 6e 5d 0d  lite3.dll]] \n].
11bf0 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  .        }....  
11c00 20 20 20 20 20 20 63 61 74 63 68 20 7b 0d 0a 20        catch {.. 
11c10 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
11c20 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b  ::test_channel [
11c30 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
11c40 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
11c50 2d 20 66 69 6c 65 20 76 65 72 73 69 6f 6e 20 6f  - file version o
11c60 66 20 5c 22 53 51 4c 69 74 65 2e 49 6e 74 65 72  f \"SQLite.Inter
11c70 6f 70 2e 64 6c 6c 5c 22 2e 2e 2e 20 22 20 5c 0d  op.dll\"... " \.
11c80 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b  .              [
11c90 66 69 6c 65 20 76 65 72 73 69 6f 6e 20 5b 67 65  file version [ge
11ca0 74 42 69 6e 61 72 79 46 69 6c 65 4e 61 6d 65 20  tBinaryFileName 
11cb0 53 51 4c 69 74 65 2e 49 6e 74 65 72 6f 70 2e 64  SQLite.Interop.d
11cc0 6c 6c 5d 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20 20  ll]] \n]..      
11cd0 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 63    }....        c
11ce0 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20  atch {..        
11cf0 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
11d00 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
11d10 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
11d20 20 20 20 20 20 22 2d 2d 2d 2d 20 66 69 6c 65 20       "---- file 
11d30 76 65 72 73 69 6f 6e 20 6f 66 20 5c 22 53 79 73  version of \"Sys
11d40 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e  tem.Data.SQLite.
11d50 64 6c 6c 5c 22 2e 2e 2e 20 22 20 5c 0d 0a 20 20  dll\"... " \..  
11d60 20 20 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c              [fil
11d70 65 20 76 65 72 73 69 6f 6e 20 5b 67 65 74 42 69  e version [getBi
11d80 6e 61 72 79 46 69 6c 65 4e 61 6d 65 20 53 79 73  naryFileName Sys
11d90 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e  tem.Data.SQLite.
11da0 64 6c 6c 5d 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20  dll]] \n]..     
11db0 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
11dc0 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20  catch {..       
11dd0 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
11de0 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  _channel [append
11df0 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
11e00 20 20 20 20 20 20 22 2d 2d 2d 2d 20 66 69 6c 65        "---- file
11e10 20 76 65 72 73 69 6f 6e 20 6f 66 20 5c 22 53 79   version of \"Sy
11e20 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
11e30 2e 4c 69 6e 71 2e 64 6c 6c 5c 22 2e 2e 2e 20 22  .Linq.dll\"... "
11e40 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
11e50 20 20 5b 66 69 6c 65 20 76 65 72 73 69 6f 6e 20    [file version 
11e60 5b 67 65 74 42 69 6e 61 72 79 46 69 6c 65 4e 61  [getBinaryFileNa
11e70 6d 65 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53  me System.Data.S
11e80 51 4c 69 74 65 2e 4c 69 6e 71 2e 64 6c 6c 5d 5d  QLite.Linq.dll]]
11e90 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d   \n]..        }.
11ea0 0a 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 61  ...        set a
11eb0 73 73 65 6d 62 6c 69 65 73 20 5b 6f 62 6a 65 63  ssemblies [objec
11ec0 74 20 69 6e 76 6f 6b 65 20 41 70 70 44 6f 6d 61  t invoke AppDoma
11ed0 69 6e 2e 43 75 72 72 65 6e 74 44 6f 6d 61 69 6e  in.CurrentDomain
11ee0 20 47 65 74 41 73 73 65 6d 62 6c 69 65 73 5d 0d   GetAssemblies].
11ef0 0a 0d 0a 20 20 20 20 20 20 20 20 6f 62 6a 65 63  ...        objec
11f00 74 20 66 6f 72 65 61 63 68 20 61 73 73 65 6d 62  t foreach assemb
11f10 6c 79 20 24 61 73 73 65 6d 62 6c 69 65 73 20 7b  ly $assemblies {
11f20 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b  ..          if {
11f30 5b 73 74 72 69 6e 67 20 6d 61 74 63 68 20 5c 7b  [string match \{
11f40 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
11f50 74 65 2a 20 24 61 73 73 65 6d 62 6c 79 5d 7d 20  te* $assembly]} 
11f60 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
11f70 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
11f80 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e  t_channel [appen
11f90 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
11fa0 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 66           "---- f
11fb0 6f 75 6e 64 20 61 73 73 65 6d 62 6c 79 3a 20 22  ound assembly: "
11fc0 20 24 61 73 73 65 6d 62 6c 79 20 5c 6e 5d 0d 0a   $assembly \n]..
11fd0 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
11fe0 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
11ff0 20 20 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20    catch {..     
12000 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
12010 73 74 5f 63 68 61 6e 6e 65 6c 20 5c 0d 0a 20 20  st_channel \..  
12020 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
12030 2d 20 64 65 66 69 6e 65 20 63 6f 6e 73 74 61 6e  - define constan
12040 74 73 20 66 6f 72 20 5c 22 53 79 73 74 65 6d 2e  ts for \"System.
12050 44 61 74 61 2e 53 51 4c 69 74 65 5c 22 2e 2e 2e  Data.SQLite\"...
12060 20 22 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   "....          
12070 69 66 20 7b 5b 63 61 74 63 68 20 7b 6f 62 6a 65  if {[catch {obje
12080 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73  ct invoke -flags
12090 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20   +NonPublic \.. 
120a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
120b0 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c   System.Data.SQL
120c0 69 74 65 2e 53 51 4c 69 74 65 33 20 44 65 66 69  ite.SQLite3 Defi
120d0 6e 65 43 6f 6e 73 74 61 6e 74 73 7d 20 5c 0d 0a  neConstants} \..
120e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
120f0 20 20 64 65 66 69 6e 65 43 6f 6e 73 74 61 6e 74    defineConstant
12100 73 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d  s] == 0} then {.
12110 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75  .            tpu
12120 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
12130 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5b  el [appendArgs [
12140 66 6f 72 6d 61 74 4c 69 73 74 20 5b 6c 73 6f 72  formatList [lsor
12150 74 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  t \..           
12160 20 20 20 20 20 24 64 65 66 69 6e 65 43 6f 6e 73       $defineCons
12170 74 61 6e 74 73 5d 20 3c 6e 6f 6e 65 3e 5d 20 5c  tants] <none>] \
12180 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 20  n]..          } 
12190 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
121a0 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
121b0 74 5f 63 68 61 6e 6e 65 6c 20 75 6e 6b 6e 6f 77  t_channel unknow
121c0 6e 5c 6e 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  n\n..          }
121d0 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  ..        }.... 
121e0 20 20 20 20 20 20 20 63 61 74 63 68 20 7b 0d 0a         catch {..
121f0 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
12200 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
12210 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
12220 20 22 2d 2d 2d 2d 20 73 6f 75 72 63 65 20 76 65   "---- source ve
12230 72 73 69 6f 6e 20 6f 66 20 5c 22 53 79 73 74 65  rsion of \"Syste
12240 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 64 6c  m.Data.SQLite.dl
12250 6c 5c 22 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20  l\"... "....    
12260 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68        if {[catch
12270 20 7b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20   {object invoke 
12280 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69  -flags +NonPubli
12290 63 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  c \..           
122a0 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61         System.Da
122b0 74 61 2e 53 51 4c 69 74 65 2e 53 51 4c 69 74 65  ta.SQLite.SQLite
122c0 43 6f 6e 6e 65 63 74 69 6f 6e 20 50 72 6f 76 69  Connection Provi
122d0 64 65 72 56 65 72 73 69 6f 6e 7d 20 5c 0d 0a 20  derVersion} \.. 
122e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
122f0 20 76 65 72 73 69 6f 6e 5d 20 3d 3d 20 30 7d 20   version] == 0} 
12300 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
12310 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20      if {[string 
12320 6c 65 6e 67 74 68 20 24 76 65 72 73 69 6f 6e 5d  length $version]
12330 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20   == 0} then {.. 
12340 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74               set
12350 20 76 65 72 73 69 6f 6e 20 6e 75 6c 6c 0d 0a 20   version null.. 
12360 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
12370 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
12380 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
12390 5b 61 70 70 65 6e 64 41 72 67 73 20 24 76 65 72  [appendArgs $ver
123a0 73 69 6f 6e 20 5c 6e 5d 0d 0a 20 20 20 20 20 20  sion \n]..      
123b0 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
123c0 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
123d0 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
123e0 75 6e 6b 6e 6f 77 6e 5c 6e 0d 0a 20 20 20 20 20  unknown\n..     
123f0 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
12400 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 63 61 74  }....        cat
12410 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  ch {..          
12420 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
12430 61 6e 6e 65 6c 20 5c 0d 0a 20 20 20 20 20 20 20  annel \..       
12440 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 73 6f 75         "---- sou
12450 72 63 65 20 63 68 65 63 6b 6f 75 74 20 6f 66 20  rce checkout of 
12460 5c 22 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51  \"System.Data.SQ
12470 4c 69 74 65 2e 64 6c 6c 5c 22 2e 2e 2e 20 22 0d  Lite.dll\"... ".
12480 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20  ...          if 
12490 7b 5b 63 61 74 63 68 20 7b 6f 62 6a 65 63 74 20  {[catch {object 
124a0 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e  invoke -flags +N
124b0 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20  onPublic \..    
124c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 79                Sy
124d0 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
124e0 2e 53 51 4c 69 74 65 43 6f 6e 6e 65 63 74 69 6f  .SQLiteConnectio
124f0 6e 20 50 72 6f 76 69 64 65 72 53 6f 75 72 63 65  n ProviderSource
12500 49 64 7d 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  Id} \..         
12510 20 20 20 20 20 20 20 20 20 73 6f 75 72 63 65 49           sourceI
12520 64 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d  d] == 0} then {.
12530 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20  .            if 
12540 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20  {[string length 
12550 24 73 6f 75 72 63 65 49 64 5d 20 3d 3d 20 30 7d  $sourceId] == 0}
12560 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
12570 20 20 20 20 20 20 20 73 65 74 20 73 6f 75 72 63         set sourc
12580 65 49 64 20 6e 75 6c 6c 0d 0a 20 20 20 20 20 20  eId null..      
12590 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
125a0 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
125b0 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
125c0 6e 64 41 72 67 73 20 24 73 6f 75 72 63 65 49 64  ndArgs $sourceId
125d0 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20   \n]..          
125e0 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
125f0 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
12600 65 73 74 5f 63 68 61 6e 6e 65 6c 20 75 6e 6b 6e  est_channel unkn
12610 6f 77 6e 5c 6e 0d 0a 20 20 20 20 20 20 20 20 20  own\n..         
12620 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d   }..        }...
12630 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
12640 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68 65 63      # NOTE: Chec
12650 6b 20 74 68 65 20 61 76 61 69 6c 61 62 6c 65 20  k the available 
12660 62 75 69 6c 64 73 20 6f 66 20 53 51 4c 69 74 65  builds of SQLite
12670 20 61 6e 64 20 53 79 73 74 65 6d 2e 44 61 74 61   and System.Data
12680 2e 53 51 4c 69 74 65 2e 0d 0a 20 20 20 20 20 20  .SQLite...      
12690 20 20 23 0d 0a 20 20 20 20 20 20 20 20 63 68 65    #..        che
126a0 63 6b 46 6f 72 53 51 4c 69 74 65 42 75 69 6c 64  ckForSQLiteBuild
126b0 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
126c0 6c 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  l....        #..
126d0 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
126e0 4e 6f 77 2c 20 77 65 20 6e 65 65 64 20 74 6f 20  Now, we need to 
126f0 6b 6e 6f 77 20 69 66 20 74 68 65 20 53 51 4c 69  know if the SQLi
12700 74 65 20 63 6f 72 65 20 6c 69 62 72 61 72 79 20  te core library 
12710 69 73 20 61 76 61 69 6c 61 62 6c 65 0d 0a 20 20  is available..  
12720 20 20 20 20 20 20 23 20 20 20 20 20 20 20 28 69        #       (i
12730 2e 65 2e 20 62 65 63 61 75 73 65 20 74 68 65 20  .e. because the 
12740 6d 61 6e 61 67 65 64 2d 6f 6e 6c 79 20 53 79 73  managed-only Sys
12750 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 20  tem.Data.SQLite 
12760 61 73 73 65 6d 62 6c 79 20 63 61 6e 0d 0a 20 20  assembly can..  
12770 20 20 20 20 20 20 23 20 20 20 20 20 20 20 6c 6f        #       lo
12780 61 64 20 77 69 74 68 6f 75 74 20 69 74 3b 20 68  ad without it; h
12790 6f 77 65 76 65 72 2c 20 69 74 20 63 61 6e 6e 6f  owever, it canno
127a0 74 20 64 6f 20 61 6e 79 74 68 69 6e 67 20 75 73  t do anything us
127b0 65 66 75 6c 20 77 69 74 68 6f 75 74 0d 0a 20 20  eful without..  
127c0 20 20 20 20 20 20 23 20 20 20 20 20 20 20 69 74        #       it
127d0 29 2e 20 20 49 66 20 77 65 20 61 72 65 20 75 73  ).  If we are us
127e0 69 6e 67 20 74 68 65 20 6d 69 78 65 64 2d 6d 6f  ing the mixed-mo
127f0 64 65 20 61 73 73 65 6d 62 6c 79 20 61 6e 64 20  de assembly and 
12800 77 65 20 61 6c 72 65 61 64 79 0d 0a 20 20 20 20  we already..    
12810 20 20 20 20 23 20 20 20 20 20 20 20 66 6f 75 6e      #       foun
12820 64 20 69 74 20 28 61 62 6f 76 65 29 2c 20 74 68  d it (above), th
12830 69 73 20 73 68 6f 75 6c 64 20 61 6c 77 61 79 73  is should always
12840 20 73 75 63 63 65 65 64 2e 0d 0a 20 20 20 20 20   succeed...     
12850 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 63 68     #..        ch
12860 65 63 6b 46 6f 72 53 51 4c 69 74 65 4c 69 62 72  eckForSQLiteLibr
12870 61 72 79 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  ary $::test_chan
12880 6e 65 6c 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23  nel....        #
12890 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
128a0 3a 20 43 68 65 63 6b 20 69 66 20 74 68 65 20 53  : Check if the S
128b0 51 4c 69 74 65 20 69 6e 74 65 72 6f 70 20 61 73  QLite interop as
128c0 73 65 6d 62 6c 79 20 69 73 20 61 76 61 69 6c 61  sembly is availa
128d0 62 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  ble...        #.
128e0 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f  .        checkFo
128f0 72 53 51 4c 69 74 65 49 6e 74 65 72 6f 70 20 24  rSQLiteInterop $
12900 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 0d 0a  ::test_channel..
12910 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
12920 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68 65       # NOTE: Che
12930 63 6b 20 74 68 65 20 53 51 4c 69 74 65 20 64 61  ck the SQLite da
12940 74 61 62 61 73 65 20 61 6e 64 20 74 65 6d 70 6f  tabase and tempo
12950 72 61 72 79 20 64 69 72 65 63 74 6f 72 69 65 73  rary directories
12960 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
12970 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72 53 51        checkForSQ
12980 4c 69 74 65 44 69 72 65 63 74 6f 72 69 65 73 20  LiteDirectories 
12990 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 0d  $::test_channel.
129a0 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
129b0 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 74        # NOTE: At
129c0 74 65 6d 70 74 20 74 6f 20 64 65 74 65 72 6d 69  tempt to determi
129d0 6e 65 20 69 66 20 76 61 72 69 6f 75 73 20 63 6f  ne if various co
129e0 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f  mpile-time optio
129f0 6e 73 20 6e 65 65 64 65 64 20 66 6f 72 0d 0a 20  ns needed for.. 
12a00 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74         #       t
12a10 65 73 74 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  est constraints 
12a20 77 65 72 65 20 65 6e 61 62 6c 65 64 20 66 6f 72  were enabled for
12a30 20 74 68 65 20 6d 61 6e 61 67 65 64 20 61 73 73   the managed ass
12a40 65 6d 62 6c 79 2e 20 20 54 68 65 72 65 0d 0a 20  embly.  There.. 
12a50 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 61         #       a
12a60 72 65 20 73 6f 6d 65 20 63 6f 6d 70 69 6c 65 2d  re some compile-
12a70 74 69 6d 65 20 6f 70 74 69 6f 6e 73 20 74 68 61  time options tha
12a80 74 20 6d 75 73 74 20 61 6c 73 6f 20 68 61 76 65  t must also have
12a90 20 62 65 65 6e 20 65 6e 61 62 6c 65 64 0d 0a 20   been enabled.. 
12aa0 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 66         #       f
12ab0 6f 72 20 74 68 65 20 69 6e 74 65 72 6f 70 20 61  or the interop a
12ac0 73 73 65 6d 62 6c 79 20 69 6e 20 6f 72 64 65 72  ssembly in order
12ad0 20 74 6f 20 62 65 20 65 66 66 65 63 74 69 76 65   to be effective
12ae0 2e 20 20 46 6f 72 20 74 68 6f 73 65 0d 0a 20 20  .  For those..  
12af0 20 20 20 20 20 20 23 20 20 20 20 20 20 20 6f 70        #       op
12b00 74 69 6f 6e 73 2c 20 69 74 20 77 69 6c 6c 20 62  tions, it will b
12b10 65 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 69  e assumed that i
12b20 74 20 77 61 73 20 65 6e 61 62 6c 65 64 20 66 6f  t was enabled fo
12b30 72 20 74 68 65 20 69 6e 74 65 72 6f 70 0d 0a 20  r the interop.. 
12b40 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 61         #       a
12b50 73 73 65 6d 62 6c 79 20 69 66 20 69 74 20 77 61  ssembly if it wa
12b60 73 20 65 6e 61 62 6c 65 64 20 66 6f 72 20 74 68  s enabled for th
12b70 65 20 6d 61 6e 61 67 65 64 20 61 73 73 65 6d 62  e managed assemb
12b80 6c 79 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  ly...        #..
12b90 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20          foreach 
12ba0 64 65 66 69 6e 65 43 6f 6e 73 74 61 6e 74 20 5b  defineConstant [
12bb0 6c 69 73 74 20 5c 0d 0a 20 20 20 20 20 20 20 20  list \..        
12bc0 20 20 20 20 43 48 45 43 4b 5f 53 54 41 54 45 20      CHECK_STATE 
12bd0 43 4f 55 4e 54 5f 48 41 4e 44 4c 45 20 44 45 42  COUNT_HANDLE DEB
12be0 55 47 20 49 4e 54 45 52 4f 50 5f 43 4f 44 45 43  UG INTEROP_CODEC
12bf0 20 49 4e 54 45 52 4f 50 5f 44 45 42 55 47 20 5c   INTEROP_DEBUG \
12c00 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 49 4e  ..            IN
12c10 54 45 52 4f 50 5f 45 58 54 45 4e 53 49 4f 4e 5f  TEROP_EXTENSION_
12c20 46 55 4e 43 54 49 4f 4e 53 20 49 4e 54 45 52 4f  FUNCTIONS INTERO
12c30 50 5f 4c 45 47 41 43 59 5f 43 4c 4f 53 45 20 49  P_LEGACY_CLOSE I
12c40 4e 54 45 52 4f 50 5f 4c 4f 47 20 5c 0d 0a 20 20  NTEROP_LOG \..  
12c50 20 20 20 20 20 20 20 20 20 20 49 4e 54 45 52 4f            INTERO
12c60 50 5f 54 45 53 54 5f 45 58 54 45 4e 53 49 4f 4e  P_TEST_EXTENSION
12c70 20 49 4e 54 45 52 4f 50 5f 56 49 52 54 55 41 4c   INTEROP_VIRTUAL
12c80 5f 54 41 42 4c 45 20 4e 45 54 5f 32 30 20 4e 45  _TABLE NET_20 NE
12c90 54 5f 33 35 20 5c 0d 0a 20 20 20 20 20 20 20 20  T_35 \..        
12ca0 20 20 20 20 4e 45 54 5f 34 30 20 4e 45 54 5f 34      NET_40 NET_4
12cb0 35 20 4e 45 54 5f 43 4f 4d 50 41 43 54 5f 32 30  5 NET_COMPACT_20
12cc0 20 50 4c 41 54 46 4f 52 4d 5f 43 4f 4d 50 41 43   PLATFORM_COMPAC
12cd0 54 46 52 41 4d 45 57 4f 52 4b 20 5c 0d 0a 20 20  TFRAMEWORK \..  
12ce0 20 20 20 20 20 20 20 20 20 20 50 52 45 4c 4f 41            PRELOA
12cf0 44 5f 4e 41 54 49 56 45 5f 4c 49 42 52 41 52 59  D_NATIVE_LIBRARY
12d00 20 52 45 54 41 52 47 45 54 41 42 4c 45 20 53 51   RETARGETABLE SQ
12d10 4c 49 54 45 5f 53 54 41 4e 44 41 52 44 20 5c 0d  LITE_STANDARD \.
12d20 0a 20 20 20 20 20 20 20 20 20 20 20 20 54 48 52  .            THR
12d30 4f 57 5f 4f 4e 5f 44 49 53 50 4f 53 45 44 20 54  OW_ON_DISPOSED T
12d40 52 41 43 45 20 54 52 41 43 45 5f 43 4f 4e 4e 45  RACE TRACE_CONNE
12d50 43 54 49 4f 4e 20 54 52 41 43 45 5f 48 41 4e 44  CTION TRACE_HAND
12d60 4c 45 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  LE \..          
12d70 20 20 54 52 41 43 45 5f 50 52 45 4c 4f 41 44 20    TRACE_PRELOAD 
12d80 54 52 41 43 45 5f 53 54 41 54 45 4d 45 4e 54 20  TRACE_STATEMENT 
12d90 54 52 41 43 45 5f 57 41 52 4e 49 4e 47 20 54 52  TRACE_WARNING TR
12da0 41 43 4b 5f 4d 45 4d 4f 52 59 5f 42 59 54 45 53  ACK_MEMORY_BYTES
12db0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
12dc0 55 53 45 5f 49 4e 54 45 52 4f 50 5f 44 4c 4c 20  USE_INTEROP_DLL 
12dd0 55 53 45 5f 50 52 45 50 41 52 45 5f 56 32 20 57  USE_PREPARE_V2 W
12de0 49 4e 44 4f 57 53 5d 20 7b 0d 0a 20 20 20 20 20  INDOWS] {..     
12df0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
12e00 20 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20    # NOTE: Check 
12e10 69 66 20 74 68 65 20 63 6f 6d 70 69 6c 65 2d 74  if the compile-t
12e20 69 6d 65 20 6f 70 74 69 6f 6e 20 69 73 20 6c 69  ime option is li
12e30 73 74 65 64 20 69 6e 20 74 68 65 20 6c 69 73 74  sted in the list
12e40 20 6f 66 0d 0a 20 20 20 20 20 20 20 20 20 20 23   of..          #
12e50 20 20 20 20 20 20 20 22 64 65 66 69 6e 65 20 63         "define c
12e60 6f 6e 73 74 61 6e 74 73 22 20 6b 65 70 74 20 74  onstants" kept t
12e70 72 61 63 6b 20 6f 66 20 62 79 20 74 68 65 20 6d  rack of by the m
12e80 61 6e 61 67 65 64 20 61 73 73 65 6d 62 6c 79 2e  anaged assembly.
12e90 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20  ..          #.. 
12ea0 20 20 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f           checkFo
12eb0 72 53 51 4c 69 74 65 44 65 66 69 6e 65 43 6f 6e  rSQLiteDefineCon
12ec0 73 74 61 6e 74 20 24 3a 3a 74 65 73 74 5f 63 68  stant $::test_ch
12ed0 61 6e 6e 65 6c 20 24 64 65 66 69 6e 65 43 6f 6e  annel $defineCon
12ee0 73 74 61 6e 74 0d 0a 20 20 20 20 20 20 20 20 7d  stant..        }
12ef0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  ....        #.. 
12f00 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43         # NOTE: C
12f10 68 65 63 6b 20 74 68 65 20 63 75 72 72 65 6e 74  heck the current
12f20 20 62 75 69 6c 64 20 79 65 61 72 2e 20 20 42 61   build year.  Ba
12f30 73 69 63 61 6c 6c 79 2c 20 74 68 69 73 20 69 6e  sically, this in
12f40 64 69 63 61 74 65 73 0d 0a 20 20 20 20 20 20 20  dicates..       
12f50 20 23 20 20 20 20 20 20 20 77 68 69 63 68 20 76   #       which v
12f60 65 72 73 69 6f 6e 20 6f 66 20 4d 53 42 75 69 6c  ersion of MSBuil
12f70 64 20 61 6e 64 2f 6f 72 20 56 69 73 75 61 6c 20  d and/or Visual 
12f80 53 74 75 64 69 6f 20 77 61 73 20 75 73 65 64 20  Studio was used 
12f90 74 6f 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  to..        #   
12fa0 20 20 20 20 63 6f 6d 70 69 6c 65 20 74 68 65 20      compile the 
12fb0 61 73 73 65 6d 62 6c 79 20 62 69 6e 61 72 69 65  assembly binarie
12fc0 73 20 75 6e 64 65 72 20 74 65 73 74 2e 0d 0a 20  s under test... 
12fd0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
12fe0 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
12ff0 63 68 61 6e 6e 65 6c 20 5c 0d 0a 20 20 20 20 20  channel \..     
13000 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 68 65         "---- che
13010 63 6b 69 6e 67 20 66 6f 72 20 53 79 73 74 65 6d  cking for System
13020 2e 44 61 74 61 2e 53 51 4c 69 74 65 20 62 75 69  .Data.SQLite bui
13030 6c 64 20 79 65 61 72 2e 2e 2e 20 22 0d 0a 0d 0a  ld year... "....
13040 20 20 20 20 20 20 20 20 73 65 74 20 79 65 61 72          set year
13050 20 5b 67 65 74 42 75 69 6c 64 59 65 61 72 5d 0d   [getBuildYear].
13060 0a 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73  .        addCons
13070 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72  traint [appendAr
13080 67 73 20 62 75 69 6c 64 59 65 61 72 2e 20 24 79  gs buildYear. $y
13090 65 61 72 5d 0d 0a 20 20 20 20 20 20 20 20 74 70  ear]..        tp
130a0 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  uts $::test_chan
130b0 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
130c0 5c 22 20 24 79 65 61 72 20 5c 22 5c 6e 5d 0d 0a  \" $year \"\n]..
130d0 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
130e0 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68 65       # NOTE: Che
130f0 63 6b 20 74 68 65 20 63 75 72 72 65 6e 74 20 62  ck the current b
13100 75 69 6c 64 20 63 6f 6e 66 69 67 75 72 61 74 69  uild configurati
13110 6f 6e 2e 20 20 54 68 69 73 20 73 68 6f 75 6c 64  on.  This should
13120 20 6e 6f 72 6d 61 6c 6c 79 0d 0a 20 20 20 20 20   normally..     
13130 20 20 20 23 20 20 20 20 20 20 20 62 65 20 65 69     #       be ei
13140 74 68 65 72 20 22 44 65 62 75 67 22 20 6f 72 20  ther "Debug" or 
13150 22 52 65 6c 65 61 73 65 22 2e 0d 0a 20 20 20 20  "Release"...    
13160 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 74      #..        t
13170 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
13180 6e 6e 65 6c 20 5c 0d 0a 20 20 20 20 20 20 20 20  nnel \..        
13190 20 20 20 20 22 2d 2d 2d 2d 20 63 68 65 63 6b 69      "---- checki
131a0 6e 67 20 66 6f 72 20 53 79 73 74 65 6d 2e 44 61  ng for System.Da
131b0 74 61 2e 53 51 4c 69 74 65 20 62 75 69 6c 64 20  ta.SQLite build 
131c0 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e 2e 2e  configuration...
131d0 20 22 0d 0a 0d 0a 20 20 20 20 20 20 20 20 73 65   "....        se
131e0 74 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  t configuration 
131f0 5b 67 65 74 42 75 69 6c 64 43 6f 6e 66 69 67 75  [getBuildConfigu
13200 72 61 74 69 6f 6e 5d 0d 0a 20 20 20 20 20 20 20  ration]..       
13210 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 5b   addConstraint [
13220 61 70 70 65 6e 64 41 72 67 73 20 62 75 69 6c 64  appendArgs build
13230 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e 20 24  Configuration. $
13240 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 5d 0d 0a  configuration]..
13250 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
13260 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61  :test_channel [a
13270 70 70 65 6e 64 41 72 67 73 20 5c 22 20 24 63 6f  ppendArgs \" $co
13280 6e 66 69 67 75 72 61 74 69 6f 6e 20 5c 22 5c 6e  nfiguration \"\n
13290 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  ]....        #..
132a0 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
132b0 54 72 79 20 74 6f 20 73 65 74 75 70 20 61 6e 20  Try to setup an 
132c0 69 6e 74 65 72 72 75 70 74 20 63 61 6c 6c 62 61  interrupt callba
132d0 63 6b 20 75 73 69 6e 67 20 74 68 65 20 73 63 72  ck using the scr
132e0 69 70 74 20 64 65 62 75 67 67 65 72 0d 0a 20 20  ipt debugger..  
132f0 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68        #       th
13300 61 74 20 77 69 6c 6c 20 63 61 6e 63 65 6c 20 61  at will cancel a
13310 6c 6c 20 53 51 4c 20 71 75 65 72 69 65 73 20 69  ll SQL queries i
13320 6e 20 70 72 6f 67 72 65 73 73 20 66 6f 72 20 61  n progress for a
13330 6c 6c 20 64 61 74 61 62 61 73 65 0d 0a 20 20 20  ll database..   
13340 20 20 20 20 20 23 20 20 20 20 20 20 20 63 6f 6e       #       con
13350 6e 65 63 74 69 6f 6e 73 20 6b 6e 6f 77 6e 20 74  nections known t
13360 6f 20 74 68 69 73 20 69 6e 74 65 72 70 72 65 74  o this interpret
13370 65 72 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  er...        #..
13380 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e          if {![in
13390 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 73  fo exists ::no(s
133a0 71 6c 69 74 65 49 6e 74 65 72 72 75 70 74 43 61  qliteInterruptCa
133b0 6c 6c 62 61 63 6b 29 5d 7d 20 74 68 65 6e 20 7b  llback)]} then {
133c0 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 75  ..          setu
133d0 70 44 62 49 6e 74 65 72 72 75 70 74 43 61 6c 6c  pDbInterruptCall
133e0 62 61 63 6b 20 24 3a 3a 74 65 73 74 5f 63 68 61  back $::test_cha
133f0 6e 6e 65 6c 20 24 3a 3a 74 65 73 74 5f 6c 6f 67  nnel $::test_log
13400 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  ..        }.... 
13410 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
13420 20 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20    # NOTE: Check 
13430 66 6f 72 20 74 68 65 20 6e 61 74 69 76 65 20 72  for the native r
13440 75 6e 74 69 6d 65 20 6f 70 74 69 6f 6e 2c 20 77  untime option, w
13450 68 69 63 68 20 77 6f 75 6c 64 20 6d 65 61 6e 20  hich would mean 
13460 77 65 20 61 72 65 0d 0a 20 20 20 20 20 20 20 20  we are..        
13470 23 20 20 20 20 20 20 20 75 73 69 6e 67 20 74 68  #       using th
13480 65 20 6d 69 78 65 64 2d 6d 6f 64 65 20 61 73 73  e mixed-mode ass
13490 65 6d 62 6c 79 2e 0d 0a 20 20 20 20 20 20 20 20  embly...        
134a0 23 0d 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b  #..        check
134b0 46 6f 72 52 75 6e 74 69 6d 65 4f 70 74 69 6f 6e  ForRuntimeOption
134c0 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
134d0 20 6e 61 74 69 76 65 0d 0a 0d 0a 20 20 20 20 20   native....     
134e0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
134f0 4e 4f 54 45 3a 20 43 68 65 63 6b 20 69 66 20 74  NOTE: Check if t
13500 68 65 20 74 65 73 74 20 73 75 69 74 65 20 73 68  he test suite sh
13510 6f 75 6c 64 20 63 6f 75 6e 74 20 74 68 65 20 6e  ould count the n
13520 75 6d 62 65 72 20 6f 66 20 63 6f 6e 6e 65 63 74  umber of connect
13530 69 6f 6e 73 0d 0a 20 20 20 20 20 20 20 20 23 20  ions..        # 
13540 20 20 20 20 20 20 22 6f 70 65 6e 65 64 22 20 61        "opened" a
13550 6e 64 20 22 63 6c 6f 73 65 64 22 20 66 72 6f 6d  nd "closed" from
13560 20 74 68 65 20 70 6f 6f 6c 20 77 68 65 6e 20 64   the pool when d
13570 65 74 65 72 6d 69 6e 69 6e 67 20 69 66 20 61 20  etermining if a 
13580 74 65 73 74 0d 0a 20 20 20 20 20 20 20 20 23 20  test..        # 
13590 20 20 20 20 20 20 70 61 73 73 65 64 2e 20 20 44        passed.  D
135a0 69 73 61 62 6c 69 6e 67 20 74 68 69 73 20 62 65  isabling this be
135b0 68 61 76 69 6f 72 20 69 73 20 73 6f 6d 65 74 69  havior is someti
135c0 6d 65 73 20 6e 65 63 65 73 73 61 72 79 20 28 65  mes necessary (e
135d0 2e 67 2e 0d 0a 20 20 20 20 20 20 20 20 23 20 20  .g...        #  
135e0 20 20 20 20 20 64 75 72 69 6e 67 20 74 68 65 20       during the 
135f0 72 65 6c 65 61 73 65 20 74 65 73 74 69 6e 67 20  release testing 
13600 70 72 6f 63 65 73 73 29 20 62 65 63 61 75 73 65  process) because
13610 20 74 68 65 72 65 20 61 72 65 20 73 65 76 65 72   there are sever
13620 61 6c 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  al..        #   
13630 20 20 20 20 74 65 73 74 73 20 74 68 61 74 20 72      tests that r
13640 65 6c 79 20 6f 6e 20 74 68 65 20 22 6f 70 65 6e  ely on the "open
13650 65 64 20 66 72 6f 6d 20 70 6f 6f 6c 22 20 63 6f  ed from pool" co
13660 75 6e 74 20 62 65 69 6e 67 20 67 72 65 61 74 65  unt being greate
13670 72 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  r..        #    
13680 20 20 20 74 68 61 6e 20 7a 65 72 6f 2e 20 20 54     than zero.  T
13690 68 65 73 65 20 74 65 73 74 73 20 6d 61 79 20 66  hese tests may f
136a0 61 69 6c 20 64 75 65 20 74 6f 20 74 68 65 20 6e  ail due to the n
136b0 6f 6e 2d 64 65 74 65 72 6d 69 6e 69 73 74 69 63  on-deterministic
136c0 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
136d0 20 20 62 65 68 61 76 69 6f 72 20 6f 66 20 74 68    behavior of th
136e0 65 20 43 4c 52 20 47 43 2c 20 65 76 65 6e 20 77  e CLR GC, even w
136f0 68 65 6e 20 74 68 65 72 65 20 69 73 20 6e 6f 20  hen there is no 
13700 62 75 67 20 69 6e 20 74 68 65 20 63 6f 64 65 0d  bug in the code.
13710 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
13720 20 62 65 69 6e 67 20 74 65 73 74 65 64 2e 0d 0a   being tested...
13730 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
13740 20 20 20 63 68 65 63 6b 46 6f 72 52 75 6e 74 69     checkForRunti
13750 6d 65 4f 70 74 69 6f 6e 20 24 3a 3a 74 65 73 74  meOption $::test
13760 5f 63 68 61 6e 6e 65 6c 20 6e 6f 50 6f 6f 6c 43  _channel noPoolC
13770 6f 75 6e 74 73 0d 0a 0d 0a 20 20 20 20 20 20 20  ounts....       
13780 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
13790 54 45 3a 20 52 65 70 6f 72 74 20 74 68 65 20 72  TE: Report the r
137a0 65 73 6f 75 72 63 65 20 75 73 61 67 65 20 70 72  esource usage pr
137b0 69 6f 72 20 74 6f 20 72 75 6e 6e 69 6e 67 20 61  ior to running a
137c0 6e 79 20 74 65 73 74 73 2e 0d 0a 20 20 20 20 20  ny tests...     
137d0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65     #..        re
137e0 70 6f 72 74 53 51 4c 69 74 65 52 65 73 6f 75 72  portSQLiteResour
137f0 63 65 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  ces $::test_chan
13800 6e 65 6c 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23  nel....        #
13810 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
13820 3a 20 53 68 6f 77 20 74 68 65 20 61 63 74 69 76  : Show the activ
13830 65 20 74 65 73 74 20 63 6f 6e 73 74 72 61 69 6e  e test constrain
13840 74 73 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  ts...        #..
13850 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
13860 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61  :test_channel [a
13870 70 70 65 6e 64 41 72 67 73 20 22 2d 2d 2d 2d 20  ppendArgs "---- 
13880 63 6f 6e 73 74 72 61 69 6e 74 73 3a 20 22 20 5c  constraints: " \
13890 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 66  ..            [f
138a0 6f 72 6d 61 74 4c 69 73 74 20 5b 6c 73 6f 72 74  ormatList [lsort
138b0 20 5b 67 65 74 43 6f 6e 73 74 72 61 69 6e 74 73   [getConstraints
138c0 5d 5d 20 3c 6e 6f 6e 65 3e 5d 20 5c 6e 5d 0d 0a  ]] <none>] \n]..
138d0 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
138e0 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 61 76       # NOTE: Sav
138f0 65 20 74 68 65 20 74 65 73 74 20 63 6f 6e 73 74  e the test const
13900 72 61 69 6e 74 73 20 66 6f 72 20 75 73 65 20 62  raints for use b
13910 79 20 74 68 72 65 61 64 73 20 63 72 65 61 74 65  y threads create
13920 64 20 69 6e 20 74 68 69 73 0d 0a 20 20 20 20 20  d in this..     
13930 20 20 20 23 20 20 20 20 20 20 20 61 70 70 6c 69     #       appli
13940 63 61 74 69 6f 6e 20 64 6f 6d 61 69 6e 2e 20 20  cation domain.  
13950 54 68 69 73 20 69 73 20 6e 65 63 65 73 73 61 72  This is necessar
13960 79 20 62 65 63 61 75 73 65 20 61 6c 6c 20 74 68  y because all th
13970 65 20 45 61 67 6c 65 0d 0a 20 20 20 20 20 20 20  e Eagle..       
13980 20 23 20 20 20 20 20 20 20 22 74 65 73 74 20 63   #       "test c
13990 6f 6e 74 65 78 74 22 20 69 6e 66 6f 72 6d 61 74  ontext" informat
139a0 69 6f 6e 20 69 73 20 70 65 72 2d 74 68 72 65 61  ion is per-threa
139b0 64 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  d...        #.. 
139c0 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66         if {![inf
139d0 6f 20 65 78 69 73 74 73 20 3a 3a 74 65 73 74 5f  o exists ::test_
139e0 63 6f 6e 73 74 72 61 69 6e 74 73 5d 7d 20 74 68  constraints]} th
139f0 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
13a00 73 65 74 20 3a 3a 74 65 73 74 5f 63 6f 6e 73 74  set ::test_const
13a10 72 61 69 6e 74 73 20 24 3a 3a 65 61 67 6c 65 5f  raints $::eagle_
13a20 74 65 73 74 73 28 63 6f 6e 73 74 72 61 69 6e 74  tests(constraint
13a30 73 29 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d  s)..        }...
13a40 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
13a50 20 20 20 20 23 20 4e 4f 54 45 3a 20 4c 6f 61 64      # NOTE: Load
13a60 20 74 68 65 20 22 61 66 74 65 72 2d 63 6f 6e 73   the "after-cons
13a70 74 72 61 69 6e 74 73 22 20 63 75 73 74 6f 6d 20  traints" custom 
13a80 70 65 72 2d 75 73 65 72 20 61 6e 64 2f 6f 72 20  per-user and/or 
13a90 70 65 72 2d 68 6f 73 74 0d 0a 20 20 20 20 20 20  per-host..      
13aa0 20 20 23 20 20 20 20 20 20 20 74 65 73 74 20 73    #       test s
13ab0 65 74 74 69 6e 67 73 20 6e 6f 77 2e 0d 0a 20 20  ettings now...  
13ac0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
13ad0 20 75 70 6c 65 76 65 6c 20 31 20 5b 6c 69 73 74   uplevel 1 [list
13ae0 20 6c 6f 61 64 53 51 4c 69 74 65 54 65 73 74 53   loadSQLiteTestS
13af0 65 74 74 69 6e 67 73 20 24 3a 3a 74 65 73 74 5f  ettings $::test_
13b00 63 68 61 6e 6e 65 6c 20 2e 61 66 74 65 72 5d 0d  channel .after].
13b10 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
13b20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 68        # NOTE: Sh
13b30 6f 77 20 77 68 65 6e 20 6f 75 72 20 74 65 73 74  ow when our test
13b40 73 20 61 63 74 75 61 6c 6c 79 20 62 65 67 61 6e  s actually began
13b50 20 28 6e 6f 77 29 2e 0d 0a 20 20 20 20 20 20 20   (now)...       
13b60 20 23 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74   #..        tput
13b70 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
13b80 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
13b90 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d  .            "--
13ba0 2d 2d 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53  -- System.Data.S
13bb0 51 4c 69 74 65 20 74 65 73 74 73 20 62 65 67 61  QLite tests bega
13bc0 6e 20 61 74 20 22 20 5c 0d 0a 20 20 20 20 20 20  n at " \..      
13bd0 20 20 20 20 20 20 5b 63 6c 6f 63 6b 20 66 6f 72        [clock for
13be0 6d 61 74 20 5b 63 6c 6f 63 6b 20 73 65 63 6f 6e  mat [clock secon
13bf0 64 73 5d 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20 20  ds]] \n]..      
13c00 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  }..    }.....   
13c10 20 70 72 6f 63 20 72 75 6e 53 51 4c 69 74 65 54   proc runSQLiteT
13c20 65 73 74 45 70 69 6c 6f 67 75 65 20 7b 7d 20 7b  estEpilogue {} {
13c30 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
13c40 20 23 20 4e 4f 54 45 3a 20 53 6b 69 70 20 72 75   # NOTE: Skip ru
13c50 6e 6e 69 6e 67 20 6f 75 72 20 63 75 73 74 6f 6d  nning our custom
13c60 20 65 70 69 6c 6f 67 75 65 20 69 66 20 74 68 65   epilogue if the
13c70 20 6d 61 69 6e 20 6f 6e 65 20 68 61 73 20 62 65   main one has be
13c80 65 6e 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  en..      #     
13c90 20 20 73 6b 69 70 70 65 64 2e 0d 0a 20 20 20 20    skipped...    
13ca0 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 21    #..      if {!
13cb0 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e  [info exists ::n
13cc0 6f 28 65 70 69 6c 6f 67 75 65 2e 65 61 67 6c 65  o(epilogue.eagle
13cd0 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  )]} then {..    
13ce0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
13cf0 20 4e 4f 54 45 3a 20 53 68 6f 77 20 77 68 65 6e   NOTE: Show when
13d00 20 6f 75 72 20 74 65 73 74 73 20 61 63 74 75 61   our tests actua
13d10 6c 6c 79 20 65 6e 64 65 64 20 28 6e 6f 77 29 2e  lly ended (now).
13d20 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
13d30 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
13d40 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
13d50 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
13d60 20 20 20 20 20 20 22 2d 2d 2d 2d 20 53 79 73 74        "---- Syst
13d70 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 20 74  em.Data.SQLite t
13d80 65 73 74 73 20 65 6e 64 65 64 20 61 74 20 22 20  ests ended at " 
13d90 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b  \..            [
13da0 63 6c 6f 63 6b 20 66 6f 72 6d 61 74 20 5b 63 6c  clock format [cl
13db0 6f 63 6b 20 73 65 63 6f 6e 64 73 5d 5d 20 5c 6e  ock seconds]] \n
13dc0 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  ]....        #..
13dd0 20 20 20 20 20 20 20 20 23 20 42 55 47 46 49 58          # BUGFIX
13de0 3a 20 42 65 66 6f 72 65 20 63 68 65 63 6b 69 6e  : Before checkin
13df0 67 20 74 68 65 20 66 69 6e 61 6c 20 72 65 73 6f  g the final reso
13e00 75 72 63 65 73 20 69 6e 20 75 73 65 20 62 79 20  urces in use by 
13e10 53 51 4c 69 74 65 2c 20 6d 61 6b 65 0d 0a 20 20  SQLite, make..  
13e20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 20 20        #         
13e30 73 75 72 65 20 62 6f 74 68 20 6f 66 20 74 68 65  sure both of the
13e40 20 50 52 41 47 4d 41 20 72 65 6c 61 74 65 64 20   PRAGMA related 
13e50 64 69 72 65 63 74 6f 72 79 20 6e 61 6d 65 73 20  directory names 
13e60 61 72 65 20 66 72 65 65 64 2e 0d 0a 20 20 20 20  are freed...    
13e70 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 63      #..        c
13e80 68 65 63 6b 46 6f 72 53 51 4c 69 74 65 44 69 72  heckForSQLiteDir
13e90 65 63 74 6f 72 69 65 73 20 24 3a 3a 74 65 73 74  ectories $::test
13ea0 5f 63 68 61 6e 6e 65 6c 20 74 72 75 65 0d 0a 0d  _channel true...
13eb0 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
13ec0 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 6c 73 6f      # NOTE: Also
13ed0 20 72 65 70 6f 72 74 20 74 68 65 20 72 65 73 6f   report the reso
13ee0 75 72 63 65 20 75 73 61 67 65 20 61 66 74 65 72  urce usage after
13ef0 20 72 75 6e 6e 69 6e 67 20 74 68 65 20 74 65 73   running the tes
13f00 74 73 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  ts...        #..
13f10 20 20 20 20 20 20 20 20 72 65 70 6f 72 74 53 51          reportSQ
13f20 4c 69 74 65 52 65 73 6f 75 72 63 65 73 20 24 3a  LiteResources $:
13f30 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 0d 0a 0d  :test_channel...
13f40 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
13f50 20 20 20 20 23 20 4e 4f 54 45 3a 20 52 65 70 6f      # NOTE: Repo
13f60 72 74 20 74 68 65 20 63 72 69 74 69 63 61 6c 20  rt the critical 
13f70 68 61 6e 64 6c 65 20 63 6f 75 6e 74 73 20 61 66  handle counts af
13f80 74 65 72 20 72 75 6e 6e 69 6e 67 20 74 68 65 20  ter running the 
13f90 74 65 73 74 73 2e 0d 0a 20 20 20 20 20 20 20 20  tests...        
13fa0 23 0d 0a 20 20 20 20 20 20 20 20 67 65 74 53 51  #..        getSQ
13fb0 4c 69 74 65 48 61 6e 64 6c 65 43 6f 75 6e 74 73  LiteHandleCounts
13fc0 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
13fd0 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d  ..      }..    }
13fe0 0d 0a 0c 0d 0a 20 20 20 20 23 23 23 23 23 23 23  .....    #######
13ff0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
14000 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
14010 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
14020 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
14030 23 23 23 23 0d 0a 20 20 20 20 23 23 23 23 23 23  ####..    ######
14040 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
14050 23 23 23 23 23 23 23 20 45 4e 44 20 45 61 67 6c  ####### END Eagl
14060 65 20 4f 4e 4c 59 20 23 23 23 23 23 23 23 23 23  e ONLY #########
14070 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
14080 23 23 23 23 23 0d 0a 20 20 20 20 23 23 23 23 23  #####..    #####
14090 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
140a0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
140b0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
140c0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
140d0 23 23 23 23 23 23 0d 0a 20 20 7d 0d 0a 0d 0a 20  ######..  }.... 
140e0 20 23 0d 0a 20 20 23 20 4e 4f 54 45 3a 20 53 61   #..  # NOTE: Sa
140f0 76 65 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  ve the name of t
14100 68 65 20 64 69 72 65 63 74 6f 72 79 20 63 6f 6e  he directory con
14110 74 61 69 6e 69 6e 67 20 74 68 69 73 20 66 69 6c  taining this fil
14120 65 2e 0d 0a 20 20 23 0d 0a 20 20 69 66 20 7b 21  e...  #..  if {!
14130 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 63 6f 6d  [info exists com
14140 6d 6f 6e 5f 64 69 72 65 63 74 6f 72 79 5d 7d 20  mon_directory]} 
14150 74 68 65 6e 20 7b 0d 0a 20 20 20 20 73 65 74 20  then {..    set 
14160 63 6f 6d 6d 6f 6e 5f 64 69 72 65 63 74 6f 72 79  common_directory
14170 20 5b 66 69 6c 65 20 64 69 72 6e 61 6d 65 20 5b   [file dirname [
14180 69 6e 66 6f 20 73 63 72 69 70 74 5d 5d 0d 0a 20  info script]].. 
14190 20 7d 0d 0a 0d 0a 20 20 23 0d 0a 20 20 23 20 4e   }....  #..  # N
141a0 4f 54 45 3a 20 50 72 6f 76 69 64 65 20 74 68 65  OTE: Provide the
141b0 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c   System.Data.SQL
141c0 69 74 65 20 74 65 73 74 20 70 61 63 6b 61 67 65  ite test package
141d0 20 74 6f 20 74 68 65 20 69 6e 74 65 72 70 72 65   to the interpre
141e0 74 65 72 2e 0d 0a 20 20 23 0d 0a 20 20 70 61 63  ter...  #..  pac
141f0 6b 61 67 65 20 70 72 6f 76 69 64 65 20 53 79 73  kage provide Sys
14200 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e  tem.Data.SQLite.
14210 54 65 73 74 20 31 2e 30 0d 0a 7d 0d 0a           Test 1.0..}..