System.Data.SQLite
Hex Artifact Content
Not logged in

Artifact 7cf51eb2e1c2e063e05f57ab31b4e4a72903d78c:


0000: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0010: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0020: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0030: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0040: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0d  ###############.
0050: 0a 23 0d 0a 23 20 63 6f 6d 6d 6f 6e 2e 65 61 67  .#..# common.eag
0060: 6c 65 20 2d 2d 0d 0a 23 0d 0a 23 20 57 72 69 74  le --..#..# Writ
0070: 74 65 6e 20 62 79 20 4a 6f 65 20 4d 69 73 74 61  ten by Joe Mista
0080: 63 68 6b 69 6e 2e 0d 0a 23 20 52 65 6c 65 61 73  chkin...# Releas
0090: 65 64 20 74 6f 20 74 68 65 20 70 75 62 6c 69 63  ed to the public
00a0: 20 64 6f 6d 61 69 6e 2c 20 75 73 65 20 61 74 20   domain, use at 
00b0: 79 6f 75 72 20 6f 77 6e 20 72 69 73 6b 21 0d 0a  your own risk!..
00c0: 23 0d 0a 23 23 23 23 23 23 23 23 23 23 23 23 23  #..#############
00d0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
00e0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
00f0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0100: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0110: 23 23 0d 0a 0d 0a 23 0d 0a 23 20 4e 4f 54 45 3a  ##....#..# NOTE:
0120: 20 55 73 65 20 6f 75 72 20 6f 77 6e 20 6e 61 6d   Use our own nam
0130: 65 73 70 61 63 65 20 68 65 72 65 20 62 65 63 61  espace here beca
0140: 75 73 65 20 65 76 65 6e 20 74 68 6f 75 67 68 20  use even though 
0150: 77 65 20 64 6f 20 6e 6f 74 20 64 69 72 65 63 74  we do not direct
0160: 6c 79 0d 0a 23 20 20 20 20 20 20 20 73 75 70 70  ly..#       supp
0170: 6f 72 74 20 6e 61 6d 65 73 70 61 63 65 73 20 6f  ort namespaces o
0180: 75 72 73 65 6c 76 65 73 2c 20 77 65 20 64 6f 20  urselves, we do 
0190: 6e 6f 74 20 77 61 6e 74 20 74 6f 20 70 6f 6c 6c  not want to poll
01a0: 75 74 65 20 74 68 65 20 67 6c 6f 62 61 6c 0d 0a  ute the global..
01b0: 23 20 20 20 20 20 20 20 6e 61 6d 65 73 70 61 63  #       namespac
01c0: 65 20 69 66 20 74 68 69 73 20 73 63 72 69 70 74  e if this script
01d0: 20 61 63 74 75 61 6c 6c 79 20 65 6e 64 73 20 75   actually ends u
01e0: 70 20 62 65 69 6e 67 20 65 76 61 6c 75 61 74 65  p being evaluate
01f0: 64 20 69 6e 20 54 63 6c 2e 0d 0a 23 0d 0a 6e 61  d in Tcl...#..na
0200: 6d 65 73 70 61 63 65 20 65 76 61 6c 20 3a 3a 45  mespace eval ::E
0210: 61 67 6c 65 20 7b 0d 0a 20 20 69 66 20 7b 5b 69  agle {..  if {[i
0220: 73 45 61 67 6c 65 5d 7d 20 74 68 65 6e 20 7b 0d  sEagle]} then {.
0230: 0a 20 20 20 20 23 23 23 23 23 23 23 23 23 23 23  .    ###########
0240: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0250: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0260: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0270: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0280: 0d 0a 20 20 20 20 23 23 23 23 23 23 23 23 23 23  ..    ##########
0290: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
02a0: 23 23 20 42 45 47 49 4e 20 45 61 67 6c 65 20 4f  ## BEGIN Eagle O
02b0: 4e 4c 59 20 23 23 23 23 23 23 23 23 23 23 23 23  NLY ############
02c0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
02d0: 23 0d 0a 20 20 20 20 23 23 23 23 23 23 23 23 23  #..    #########
02e0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
02f0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0300: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0310: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0320: 23 23 0d 0a 0d 0a 20 20 20 20 70 72 6f 63 20 67  ##....    proc g
0330: 65 74 42 75 69 6c 64 59 65 61 72 20 7b 7d 20 7b  etBuildYear {} {
0340: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
0350: 20 23 20 4e 4f 54 45 3a 20 53 65 65 20 69 66 20   # NOTE: See if 
0360: 74 68 65 20 22 79 65 61 72 22 20 73 65 74 74 69  the "year" setti
0370: 6e 67 20 68 61 73 20 62 65 65 6e 20 6f 76 65 72  ng has been over
0380: 72 69 64 64 65 6e 20 62 79 20 74 68 65 20 75 73  ridden by the us
0390: 65 72 20 28 65 2e 67 2e 0d 0a 20 20 20 20 20 20  er (e.g...      
03a0: 23 20 20 20 20 20 20 20 6f 6e 20 74 68 65 20 63  #       on the c
03b0: 6f 6d 6d 61 6e 64 20 6c 69 6e 65 29 2e 20 20 54  ommand line).  T
03c0: 68 69 73 20 68 65 6c 70 73 20 63 6f 6e 74 72 6f  his helps contro
03d0: 6c 20 65 78 61 63 74 6c 79 20 77 68 69 63 68 20  l exactly which 
03e0: 73 65 74 20 6f 66 0d 0a 20 20 20 20 20 20 23 20  set of..      # 
03f0: 20 20 20 20 20 20 62 69 6e 61 72 69 65 73 20 77        binaries w
0400: 65 20 61 72 65 20 74 65 73 74 69 6e 67 2c 20 74  e are testing, t
0410: 68 6f 73 65 20 70 72 6f 64 75 63 65 64 20 75 73  hose produced us
0420: 69 6e 67 20 74 68 65 20 56 69 73 75 61 6c 20 53  ing the Visual S
0430: 74 75 64 69 6f 0d 0a 20 20 20 20 20 20 23 20 20  tudio..      #  
0440: 20 20 20 20 20 32 30 30 35 2c 20 32 30 30 38 2c       2005, 2008,
0450: 20 32 30 31 30 2c 20 6f 72 20 32 30 31 32 20 62   2010, or 2012 b
0460: 75 69 6c 64 20 73 79 73 74 65 6d 73 2e 20 20 54  uild systems.  T
0470: 6f 20 6f 76 65 72 72 69 64 65 20 74 68 69 73 20  o override this 
0480: 76 61 6c 75 65 0d 0a 20 20 20 20 20 20 23 20 20  value..      #  
0490: 20 20 20 20 20 76 69 61 20 74 68 65 20 63 6f 6d       via the com
04a0: 6d 61 6e 64 20 6c 69 6e 65 2c 20 65 6e 74 65 72  mand line, enter
04b0: 20 61 20 63 6f 6d 6d 61 6e 64 20 73 69 6d 69 6c   a command simil
04c0: 61 72 20 74 6f 20 6f 6e 65 20 6f 66 20 74 68 65  ar to one of the
04d0: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
04e0: 66 6f 6c 6c 6f 77 69 6e 67 20 28 61 6c 6c 20 6f  following (all o
04f0: 6e 20 6f 6e 65 20 6c 69 6e 65 29 3a 0d 0a 20 20  n one line):..  
0500: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 20      #..      #  
0510: 20 20 20 20 20 45 61 67 6c 65 53 68 65 6c 6c 2e       EagleShell.
0520: 65 78 65 20 2d 70 72 65 49 6e 69 74 69 61 6c 69  exe -preInitiali
0530: 7a 65 20 22 73 65 74 20 74 65 73 74 5f 79 65 61  ze "set test_yea
0540: 72 20 32 30 30 35 22 0d 0a 20 20 20 20 20 20 23  r 2005"..      #
0550: 20 20 20 20 20 20 20 20 20 2d 66 69 6c 65 20 2e           -file .
0560: 5c 70 61 74 68 5c 74 6f 5c 61 6c 6c 2e 65 61 67  \path\to\all.eag
0570: 6c 65 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  le..      #..   
0580: 20 20 20 23 20 20 20 20 20 20 20 45 61 67 6c 65     #       Eagle
0590: 53 68 65 6c 6c 2e 65 78 65 20 2d 70 72 65 49 6e  Shell.exe -preIn
05a0: 69 74 69 61 6c 69 7a 65 20 22 73 65 74 20 74 65  itialize "set te
05b0: 73 74 5f 79 65 61 72 20 32 30 30 38 22 0d 0a 20  st_year 2008".. 
05c0: 20 20 20 20 20 23 20 20 20 20 20 20 20 20 20 2d       #         -
05d0: 66 69 6c 65 20 2e 5c 70 61 74 68 5c 74 6f 5c 61  file .\path\to\a
05e0: 6c 6c 2e 65 61 67 6c 65 0d 0a 20 20 20 20 20 20  ll.eagle..      
05f0: 23 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  #..      #      
0600: 20 45 61 67 6c 65 53 68 65 6c 6c 2e 65 78 65 20   EagleShell.exe 
0610: 2d 70 72 65 49 6e 69 74 69 61 6c 69 7a 65 20 22  -preInitialize "
0620: 73 65 74 20 74 65 73 74 5f 79 65 61 72 20 32 30  set test_year 20
0630: 31 30 22 0d 0a 20 20 20 20 20 20 23 20 20 20 20  10"..      #    
0640: 20 20 20 20 20 2d 66 69 6c 65 20 2e 5c 70 61 74       -file .\pat
0650: 68 5c 74 6f 5c 61 6c 6c 2e 65 61 67 6c 65 0d 0a  h\to\all.eagle..
0660: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
0670: 20 20 20 20 20 20 20 45 61 67 6c 65 53 68 65 6c         EagleShel
0680: 6c 2e 65 78 65 20 2d 70 72 65 49 6e 69 74 69 61  l.exe -preInitia
0690: 6c 69 7a 65 20 22 73 65 74 20 74 65 73 74 5f 79  lize "set test_y
06a0: 65 61 72 20 32 30 31 32 22 0d 0a 20 20 20 20 20  ear 2012"..     
06b0: 20 23 20 20 20 20 20 20 20 20 20 2d 66 69 6c 65   #         -file
06c0: 20 2e 5c 70 61 74 68 5c 74 6f 5c 61 6c 6c 2e 65   .\path\to\all.e
06d0: 61 67 6c 65 0d 0a 20 20 20 20 20 20 23 0d 0a 20  agle..      #.. 
06e0: 20 20 20 20 20 23 20 20 20 20 20 20 20 45 61 67       #       Eag
06f0: 6c 65 53 68 65 6c 6c 2e 65 78 65 20 2d 70 72 65  leShell.exe -pre
0700: 49 6e 69 74 69 61 6c 69 7a 65 20 22 75 6e 73 65  Initialize "unse
0710: 74 20 2d 6e 6f 63 6f 6d 70 6c 61 69 6e 20 74 65  t -nocomplain te
0720: 73 74 5f 79 65 61 72 22 0d 0a 20 20 20 20 20 20  st_year"..      
0730: 23 20 20 20 20 20 20 20 20 20 2d 66 69 6c 65 20  #         -file 
0740: 2e 5c 70 61 74 68 5c 74 6f 5c 61 6c 6c 2e 65 61  .\path\to\all.ea
0750: 67 6c 65 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  gle..      #..  
0760: 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78      if {[info ex
0770: 69 73 74 73 20 3a 3a 74 65 73 74 5f 79 65 61 72  ists ::test_year
0780: 5d 20 26 26 20 5b 73 74 72 69 6e 67 20 6c 65 6e  ] && [string len
0790: 67 74 68 20 24 3a 3a 74 65 73 74 5f 79 65 61 72  gth $::test_year
07a0: 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20  ] > 0} then {.. 
07b0: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
07c0: 20 20 23 20 4e 4f 54 45 3a 20 55 73 65 20 74 68    # NOTE: Use th
07d0: 65 20 73 70 65 63 69 66 69 65 64 20 74 65 73 74  e specified test
07e0: 20 79 65 61 72 2e 20 20 49 66 20 74 68 69 73 20   year.  If this 
07f0: 76 61 72 69 61 62 6c 65 20 69 73 20 6e 6f 74 20  variable is not 
0800: 73 65 74 2c 20 74 68 65 0d 0a 20 20 20 20 20 20  set, the..      
0810: 20 20 23 20 20 20 20 20 20 20 64 65 66 61 75 6c    #       defaul
0820: 74 20 76 61 6c 75 65 20 77 69 6c 6c 20 62 65 20  t value will be 
0830: 62 61 73 65 64 20 6f 6e 20 77 68 65 74 68 65 72  based on whether
0840: 20 6f 72 20 6e 6f 74 20 45 61 67 6c 65 20 68 61   or not Eagle ha
0850: 73 20 62 65 65 6e 0d 0a 20 20 20 20 20 20 20 20  s been..        
0860: 23 20 20 20 20 20 20 20 63 6f 6d 70 69 6c 65 64  #       compiled
0870: 20 61 67 61 69 6e 73 74 20 74 68 65 20 43 4c 52   against the CLR
0880: 20 76 32 2e 30 20 6f 72 20 43 4c 52 20 76 34 2e   v2.0 or CLR v4.
0890: 30 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  0...        #.. 
08a0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 3a         return $:
08b0: 3a 74 65 73 74 5f 79 65 61 72 0d 0a 20 20 20 20  :test_year..    
08c0: 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
08d0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
08e0: 20 4e 4f 54 45 3a 20 49 66 20 45 61 67 6c 65 20   NOTE: If Eagle 
08f0: 68 61 73 20 62 65 65 6e 20 63 6f 6d 70 69 6c 65  has been compile
0900: 64 20 61 67 61 69 6e 73 74 20 74 68 65 20 43 4c  d against the CL
0910: 52 20 76 34 2e 30 2c 20 75 73 65 20 22 32 30 31  R v4.0, use "201
0920: 30 22 20 62 79 0d 0a 20 20 20 20 20 20 20 20 23  0" by..        #
0930: 20 20 20 20 20 20 20 64 65 66 61 75 6c 74 20 28         default (
0940: 77 65 20 63 6f 75 6c 64 20 75 73 65 20 22 32 30  we could use "20
0950: 31 32 22 20 69 6e 20 74 68 61 74 20 63 61 73 65  12" in that case
0960: 20 61 73 20 77 65 6c 6c 29 20 61 73 20 74 68 65   as well) as the
0970: 20 74 65 73 74 0d 0a 20 20 20 20 20 20 20 20 23   test..        #
0980: 20 20 20 20 20 20 20 79 65 61 72 3b 20 6f 74 68         year; oth
0990: 65 72 77 69 73 65 2c 20 75 73 65 20 22 32 30 30  erwise, use "200
09a0: 38 22 20 62 79 20 64 65 66 61 75 6c 74 20 28 77  8" by default (w
09b0: 65 20 63 6f 75 6c 64 20 75 73 65 20 22 32 30 30  e could use "200
09c0: 35 22 20 69 6e 0d 0a 20 20 20 20 20 20 20 20 23  5" in..        #
09d0: 20 20 20 20 20 20 20 74 68 61 74 20 63 61 73 65         that case
09e0: 20 61 73 20 77 65 6c 6c 29 2e 20 20 49 66 20 61   as well).  If a
09f0: 6e 6f 74 68 65 72 20 6d 61 6a 6f 72 20 5b 69 6e  nother major [in
0a00: 63 6f 6d 70 61 74 69 62 6c 65 5d 20 76 65 72 73  compatible] vers
0a10: 69 6f 6e 20 6f 66 0d 0a 20 20 20 20 20 20 20 20  ion of..        
0a20: 23 20 20 20 20 20 20 20 74 68 65 20 43 4c 52 20  #       the CLR 
0a30: 69 73 20 72 65 6c 65 61 73 65 64 2c 20 74 68 69  is released, thi
0a40: 73 20 63 68 65 63 6b 20 77 69 6c 6c 20 68 61 76  s check will hav
0a50: 65 20 74 6f 20 62 65 20 63 68 61 6e 67 65 64 2e  e to be changed.
0a60: 20 20 54 68 65 0d 0a 20 20 20 20 20 20 20 20 23    The..        #
0a70: 20 20 20 20 20 20 20 64 65 66 61 75 6c 74 20 74         default t
0a80: 65 73 74 20 79 65 61 72 20 74 6f 20 75 73 65 20  est year to use 
0a90: 66 6f 72 20 61 20 70 61 72 74 69 63 75 6c 61 72  for a particular
0aa0: 20 43 4c 52 20 76 65 72 73 69 6f 6e 20 6d 61 79   CLR version may
0ab0: 20 62 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20   be..        #  
0ac0: 20 20 20 20 20 6f 76 65 72 72 69 64 64 65 6e 20       overridden 
0ad0: 62 79 20 73 65 74 74 69 6e 67 20 74 68 65 20 67  by setting the g
0ae0: 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20 22  lobal variable "
0af0: 74 65 73 74 5f 79 65 61 72 5f 63 6c 72 5f 76 24  test_year_clr_v$
0b00: 58 22 2c 0d 0a 20 20 20 20 20 20 20 20 23 20 20  X",..        #  
0b10: 20 20 20 20 20 77 68 65 72 65 20 22 24 58 22 20       where "$X" 
0b20: 6d 61 79 20 5b 63 75 72 72 65 6e 74 6c 79 5d 20  may [currently] 
0b30: 62 65 20 65 69 74 68 65 72 20 22 32 22 20 6f 72  be either "2" or
0b40: 20 22 34 22 2e 0d 0a 20 20 20 20 20 20 20 20 23   "4"...        #
0b50: 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 68  ..        if {[h
0b60: 61 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 69 6d  aveConstraint im
0b70: 61 67 65 52 75 6e 74 69 6d 65 34 30 5d 7d 20 74  ageRuntime40]} t
0b80: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
0b90: 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74   if {[info exist
0ba0: 73 20 3a 3a 74 65 73 74 5f 79 65 61 72 5f 63 6c  s ::test_year_cl
0bb0: 72 5f 76 34 5d 20 26 26 20 5c 0d 0a 20 20 20 20  r_v4] && \..    
0bc0: 20 20 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e            [strin
0bd0: 67 20 6c 65 6e 67 74 68 20 24 3a 3a 74 65 73 74  g length $::test
0be0: 5f 79 65 61 72 5f 63 6c 72 5f 76 34 5d 20 3e 20  _year_clr_v4] > 
0bf0: 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
0c00: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
0c10: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 55 73        # NOTE: Us
0c20: 65 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  e the specified 
0c30: 74 65 73 74 20 79 65 61 72 20 66 6f 72 20 74 68  test year for th
0c40: 65 20 43 4c 52 20 76 34 2e 30 2e 0d 0a 20 20 20  e CLR v4.0...   
0c50: 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
0c60: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 24          return $
0c70: 3a 3a 74 65 73 74 5f 79 65 61 72 5f 63 6c 72 5f  ::test_year_clr_
0c80: 76 34 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 20  v4..          } 
0c90: 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
0ca0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
0cb0: 20 20 20 23 20 4e 4f 54 45 3a 20 55 73 65 20 74     # NOTE: Use t
0cc0: 68 65 20 64 65 66 61 75 6c 74 20 74 65 73 74 20  he default test 
0cd0: 79 65 61 72 20 66 6f 72 20 74 68 65 20 43 4c 52  year for the CLR
0ce0: 20 76 34 2e 30 2e 0d 0a 20 20 20 20 20 20 20 20   v4.0...        
0cf0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
0d00: 20 20 20 72 65 74 75 72 6e 20 32 30 31 30 3b 20     return 2010; 
0d10: 23 20 54 4f 44 4f 3a 20 47 6f 6f 64 20 22 66 61  # TODO: Good "fa
0d20: 6c 6c 62 61 63 6b 22 20 64 65 66 61 75 6c 74 3f  llback" default?
0d30: 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20  ..          }.. 
0d40: 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d         } else {.
0d50: 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b  .          if {[
0d60: 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 74 65  info exists ::te
0d70: 73 74 5f 79 65 61 72 5f 63 6c 72 5f 76 32 5d 20  st_year_clr_v2] 
0d80: 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  && \..          
0d90: 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67      [string leng
0da0: 74 68 20 24 3a 3a 74 65 73 74 5f 79 65 61 72 5f  th $::test_year_
0db0: 63 6c 72 5f 76 32 5d 20 3e 20 30 7d 20 74 68 65  clr_v2] > 0} the
0dc0: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
0dd0: 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   #..            
0de0: 23 20 4e 4f 54 45 3a 20 55 73 65 20 74 68 65 20  # NOTE: Use the 
0df0: 73 70 65 63 69 66 69 65 64 20 74 65 73 74 20 79  specified test y
0e00: 65 61 72 20 66 6f 72 20 74 68 65 20 43 4c 52 20  ear for the CLR 
0e10: 76 32 2e 30 2e 0d 0a 20 20 20 20 20 20 20 20 20  v2.0...         
0e20: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
0e30: 20 20 72 65 74 75 72 6e 20 24 3a 3a 74 65 73 74    return $::test
0e40: 5f 79 65 61 72 5f 63 6c 72 5f 76 32 0d 0a 20 20  _year_clr_v2..  
0e50: 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b          } else {
0e60: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 0d  ..            #.
0e70: 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4e  .            # N
0e80: 4f 54 45 3a 20 55 73 65 20 74 68 65 20 64 65 66  OTE: Use the def
0e90: 61 75 6c 74 20 74 65 73 74 20 79 65 61 72 20 66  ault test year f
0ea0: 6f 72 20 74 68 65 20 43 4c 52 20 76 32 2e 30 2e  or the CLR v2.0.
0eb0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 0d  ..            #.
0ec0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74  .            ret
0ed0: 75 72 6e 20 32 30 30 38 3b 20 23 20 54 4f 44 4f  urn 2008; # TODO
0ee0: 3a 20 47 6f 6f 64 20 22 66 61 6c 6c 62 61 63 6b  : Good "fallback
0ef0: 22 20 64 65 66 61 75 6c 74 3f 0d 0a 20 20 20 20  " default?..    
0f00: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
0f10: 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20   }..      }..   
0f20: 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
0f30: 67 65 74 42 75 69 6c 64 59 65 61 72 73 20 7b 7d  getBuildYears {}
0f40: 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20   {..      #..   
0f50: 20 20 20 23 20 4e 4f 54 45 3a 20 53 65 65 20 69     # NOTE: See i
0f60: 66 20 74 68 65 20 6c 69 73 74 20 6f 66 20 74 65  f the list of te
0f70: 73 74 20 79 65 61 72 73 20 68 61 73 20 62 65 65  st years has bee
0f80: 6e 20 6f 76 65 72 72 69 64 64 65 6e 20 62 79 20  n overridden by 
0f90: 74 68 65 20 75 73 65 72 0d 0a 20 20 20 20 20 20  the user..      
0fa0: 23 20 20 20 20 20 20 20 28 65 2e 67 2e 20 6f 6e  #       (e.g. on
0fb0: 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e   the command lin
0fc0: 65 29 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  e)...      #..  
0fd0: 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78      if {[info ex
0fe0: 69 73 74 73 20 3a 3a 74 65 73 74 5f 79 65 61 72  ists ::test_year
0ff0: 73 5d 20 26 26 20 5b 6c 6c 65 6e 67 74 68 20 24  s] && [llength $
1000: 3a 3a 74 65 73 74 5f 79 65 61 72 73 5d 20 3e 20  ::test_years] > 
1010: 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
1020: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
1030: 4e 4f 54 45 3a 20 55 73 65 20 74 68 65 20 73 70  NOTE: Use the sp
1040: 65 63 69 66 69 65 64 20 6c 69 73 74 20 6f 66 20  ecified list of 
1050: 74 65 73 74 20 79 65 61 72 73 2e 0d 0a 20 20 20  test years...   
1060: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
1070: 72 65 74 75 72 6e 20 24 3a 3a 74 65 73 74 5f 79  return $::test_y
1080: 65 61 72 73 0d 0a 20 20 20 20 20 20 7d 20 65 6c  ears..      } el
1090: 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d  se {..        #.
10a0: 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
10b0: 20 55 73 65 20 74 68 65 20 64 65 66 61 75 6c 74   Use the default
10c0: 20 6c 69 73 74 20 6f 66 20 74 65 73 74 20 79 65   list of test ye
10d0: 61 72 73 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  ars...        #.
10e0: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
10f0: 5b 6c 69 73 74 20 32 30 30 35 20 32 30 30 38 20  [list 2005 2008 
1100: 32 30 31 30 20 32 30 31 32 5d 0d 0a 20 20 20 20  2010 2012]..    
1110: 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20    }..    }..... 
1120: 20 20 20 70 72 6f 63 20 67 65 74 42 75 69 6c 64     proc getBuild
1130: 50 6c 61 74 66 6f 72 6d 20 7b 20 6e 61 74 69 76  Platform { nativ
1140: 65 20 7d 20 7b 0d 0a 20 20 20 20 20 20 69 66 20  e } {..      if 
1150: 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  {[info exists ::
1160: 74 65 73 74 5f 70 6c 61 74 66 6f 72 6d 5d 20 26  test_platform] &
1170: 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b  & \..          [
1180: 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a  string length $:
1190: 3a 74 65 73 74 5f 70 6c 61 74 66 6f 72 6d 5d 20  :test_platform] 
11a0: 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  > 0} then {..   
11b0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
11c0: 23 20 4e 4f 54 45 3a 20 55 73 65 20 74 68 65 20  # NOTE: Use the 
11d0: 73 70 65 63 69 66 69 65 64 20 74 65 73 74 20 70  specified test p
11e0: 6c 61 74 66 6f 72 6d 2e 20 20 49 66 20 74 68 69  latform.  If thi
11f0: 73 20 76 61 72 69 61 62 6c 65 20 69 73 20 6e 6f  s variable is no
1200: 74 20 73 65 74 2c 0d 0a 20 20 20 20 20 20 20 20  t set,..        
1210: 23 20 20 20 20 20 20 20 74 68 65 20 64 65 66 61  #       the defa
1220: 75 6c 74 20 76 61 6c 75 65 20 77 69 6c 6c 20 62  ult value will b
1230: 65 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 6d  e based on the m
1240: 61 63 68 69 6e 65 20 61 72 63 68 69 74 65 63 74  achine architect
1250: 75 72 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  ure...        #.
1260: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
1270: 5b 65 78 70 72 20 7b 24 6e 61 74 69 76 65 20 3f  [expr {$native ?
1280: 20 24 3a 3a 74 65 73 74 5f 70 6c 61 74 66 6f 72   $::test_platfor
1290: 6d 20 3a 20 22 22 7d 5d 0d 0a 20 20 20 20 20 20  m : ""}]..      
12a0: 7d 20 65 6c 73 65 69 66 20 7b 5b 69 6e 66 6f 20  } elseif {[info 
12b0: 65 78 69 73 74 73 20 3a 3a 74 65 73 74 5f 6d 61  exists ::test_ma
12c0: 63 68 69 6e 65 5d 20 26 26 20 5c 0d 0a 20 20 20  chine] && \..   
12d0: 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c         [string l
12e0: 65 6e 67 74 68 20 24 3a 3a 74 65 73 74 5f 6d 61  ength $::test_ma
12f0: 63 68 69 6e 65 5d 20 3e 20 30 7d 20 74 68 65 6e  chine] > 0} then
1300: 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20   {..        #.. 
1310: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 46         # NOTE: F
1320: 6f 72 20 6e 61 74 69 76 65 20 62 75 69 6c 64 73  or native builds
1330: 2c 20 72 65 74 75 72 6e 20 74 68 65 20 70 6c 61  , return the pla
1340: 74 66 6f 72 6d 20 6e 61 6d 65 20 63 6f 72 72 65  tform name corre
1350: 73 70 6f 6e 64 69 6e 67 20 74 6f 0d 0a 20 20 20  sponding to..   
1360: 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68 65       #       the
1370: 20 74 65 73 74 20 6d 61 63 68 69 6e 65 20 61 72   test machine ar
1380: 63 68 69 74 65 63 74 75 72 65 3b 20 6f 74 68 65  chitecture; othe
1390: 72 77 69 73 65 2c 20 72 65 74 75 72 6e 20 61 6e  rwise, return an
13a0: 20 65 6d 70 74 79 0d 0a 20 20 20 20 20 20 20 20   empty..        
13b0: 23 20 20 20 20 20 20 20 73 74 72 69 6e 67 2e 0d  #       string..
13c0: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
13d0: 20 20 20 20 72 65 74 75 72 6e 20 5b 65 78 70 72      return [expr
13e0: 20 7b 24 6e 61 74 69 76 65 20 3f 20 5b 6d 61 63   {$native ? [mac
13f0: 68 69 6e 65 54 6f 50 6c 61 74 66 6f 72 6d 20 24  hineToPlatform $
1400: 3a 3a 74 65 73 74 5f 6d 61 63 68 69 6e 65 5d 20  ::test_machine] 
1410: 3a 20 22 22 7d 5d 0d 0a 20 20 20 20 20 20 7d 20  : ""}]..      } 
1420: 65 6c 73 65 69 66 20 7b 5b 69 6e 66 6f 20 65 78  elseif {[info ex
1430: 69 73 74 73 20 3a 3a 74 63 6c 5f 70 6c 61 74 66  ists ::tcl_platf
1440: 6f 72 6d 28 6d 61 63 68 69 6e 65 29 5d 7d 20 74  orm(machine)]} t
1450: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  hen {..        #
1460: 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
1470: 3a 20 46 6f 72 20 6e 61 74 69 76 65 20 62 75 69  : For native bui
1480: 6c 64 73 2c 20 72 65 74 75 72 6e 20 74 68 65 20  lds, return the 
1490: 70 6c 61 74 66 6f 72 6d 20 6e 61 6d 65 20 63 6f  platform name co
14a0: 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 0d 0a  rresponding to..
14b0: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
14c0: 74 68 65 20 6d 61 63 68 69 6e 65 20 61 72 63 68  the machine arch
14d0: 69 74 65 63 74 75 72 65 3b 20 6f 74 68 65 72 77  itecture; otherw
14e0: 69 73 65 2c 20 72 65 74 75 72 6e 20 61 6e 20 65  ise, return an e
14f0: 6d 70 74 79 20 73 74 72 69 6e 67 2e 0d 0a 20 20  mpty string...  
1500: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
1510: 20 72 65 74 75 72 6e 20 5b 65 78 70 72 20 7b 24   return [expr {$
1520: 6e 61 74 69 76 65 20 3f 20 5c 0d 0a 20 20 20 20  native ? \..    
1530: 20 20 20 20 20 20 20 20 5b 6d 61 63 68 69 6e 65          [machine
1540: 54 6f 50 6c 61 74 66 6f 72 6d 20 24 3a 3a 74 63  ToPlatform $::tc
1550: 6c 5f 70 6c 61 74 66 6f 72 6d 28 6d 61 63 68 69  l_platform(machi
1560: 6e 65 29 5d 20 3a 20 22 22 7d 5d 0d 0a 20 20 20  ne)] : ""}]..   
1570: 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
1580: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
1590: 23 20 4e 4f 54 45 3a 20 4e 6f 20 6d 61 63 68 69  # NOTE: No machi
15a0: 6e 65 20 61 72 63 68 69 74 65 63 74 75 72 65 20  ne architecture 
15b0: 69 73 20 61 76 61 69 6c 61 62 6c 65 2c 20 72 65  is available, re
15c0: 74 75 72 6e 20 61 6e 20 65 6d 70 74 79 20 73 74  turn an empty st
15d0: 72 69 6e 67 2e 0d 0a 20 20 20 20 20 20 20 20 23  ring...        #
15e0: 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ..        return
15f0: 20 22 22 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20   ""..      }..  
1600: 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
1610: 20 67 65 74 42 75 69 6c 64 43 6f 6e 66 69 67 75   getBuildConfigu
1620: 72 61 74 69 6f 6e 20 7b 7d 20 7b 0d 0a 20 20 20  ration {} {..   
1630: 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
1640: 54 45 3a 20 53 65 65 20 69 66 20 74 68 65 20 22  TE: See if the "
1650: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 22 20 73  configuration" s
1660: 65 74 74 69 6e 67 20 68 61 73 20 62 65 65 6e 20  etting has been 
1670: 6f 76 65 72 72 69 64 64 65 6e 20 62 79 20 74 68  overridden by th
1680: 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  e..      #      
1690: 20 75 73 65 72 20 28 65 2e 67 2e 20 6f 6e 20 74   user (e.g. on t
16a0: 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 29  he command line)
16b0: 2e 20 20 54 68 69 73 20 68 65 6c 70 73 20 63 6f  .  This helps co
16c0: 6e 74 72 6f 6c 20 65 78 61 63 74 6c 79 0d 0a 20  ntrol exactly.. 
16d0: 20 20 20 20 20 23 20 20 20 20 20 20 20 77 68 69       #       whi
16e0: 63 68 20 73 65 74 20 6f 66 20 62 69 6e 61 72 69  ch set of binari
16f0: 65 73 20 77 65 20 61 72 65 20 74 65 73 74 69 6e  es we are testin
1700: 67 20 28 69 2e 65 2e 20 74 68 6f 73 65 20 62 75  g (i.e. those bu
1710: 69 6c 74 20 69 6e 20 74 68 65 0d 0a 20 20 20 20  ilt in the..    
1720: 20 20 23 20 20 20 20 20 20 20 22 44 65 62 75 67    #       "Debug
1730: 22 20 6f 72 20 22 52 65 6c 65 61 73 65 22 20 62  " or "Release" b
1740: 75 69 6c 64 20 63 6f 6e 66 69 67 75 72 61 74 69  uild configurati
1750: 6f 6e 73 29 2e 20 20 54 6f 20 6f 76 65 72 72 69  ons).  To overri
1760: 64 65 20 74 68 69 73 0d 0a 20 20 20 20 20 20 23  de this..      #
1770: 20 20 20 20 20 20 20 76 61 6c 75 65 20 76 69 61         value via
1780: 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e   the command lin
1790: 65 2c 20 65 6e 74 65 72 20 61 20 63 6f 6d 6d 61  e, enter a comma
17a0: 6e 64 20 73 69 6d 69 6c 61 72 20 74 6f 20 6f 6e  nd similar to on
17b0: 65 20 6f 66 0d 0a 20 20 20 20 20 20 23 20 20 20  e of..      #   
17c0: 20 20 20 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e      the followin
17d0: 67 20 28 61 6c 6c 20 6f 6e 20 6f 6e 65 20 6c 69  g (all on one li
17e0: 6e 65 29 3a 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ne):..      #.. 
17f0: 20 20 20 20 20 23 20 20 20 20 20 20 20 45 61 67       #       Eag
1800: 6c 65 53 68 65 6c 6c 2e 65 78 65 20 2d 70 72 65  leShell.exe -pre
1810: 49 6e 69 74 69 61 6c 69 7a 65 20 22 73 65 74 20  Initialize "set 
1820: 74 65 73 74 5f 63 6f 6e 66 69 67 75 72 61 74 69  test_configurati
1830: 6f 6e 20 44 65 62 75 67 22 0d 0a 20 20 20 20 20  on Debug"..     
1840: 20 23 20 20 20 20 20 20 20 20 20 2d 66 69 6c 65   #         -file
1850: 20 2e 5c 70 61 74 68 5c 74 6f 5c 61 6c 6c 2e 65   .\path\to\all.e
1860: 61 67 6c 65 0d 0a 20 20 20 20 20 20 23 0d 0a 20  agle..      #.. 
1870: 20 20 20 20 20 23 20 20 20 20 20 20 20 45 61 67       #       Eag
1880: 6c 65 53 68 65 6c 6c 2e 65 78 65 20 2d 70 72 65  leShell.exe -pre
1890: 49 6e 69 74 69 61 6c 69 7a 65 20 22 73 65 74 20  Initialize "set 
18a0: 74 65 73 74 5f 63 6f 6e 66 69 67 75 72 61 74 69  test_configurati
18b0: 6f 6e 20 52 65 6c 65 61 73 65 22 0d 0a 20 20 20  on Release"..   
18c0: 20 20 20 23 20 20 20 20 20 20 20 20 20 2d 66 69     #         -fi
18d0: 6c 65 20 2e 5c 70 61 74 68 5c 74 6f 5c 61 6c 6c  le .\path\to\all
18e0: 2e 65 61 67 6c 65 0d 0a 20 20 20 20 20 20 23 0d  .eagle..      #.
18f0: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 45  .      #       E
1900: 61 67 6c 65 53 68 65 6c 6c 2e 65 78 65 20 2d 66  agleShell.exe -f
1910: 69 6c 65 20 2e 5c 70 61 74 68 5c 74 6f 5c 61 6c  ile .\path\to\al
1920: 6c 2e 65 61 67 6c 65 20 2d 70 72 65 54 65 73 74  l.eagle -preTest
1930: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
1940: 20 20 22 75 6e 73 65 74 20 2d 6e 6f 63 6f 6d 70    "unset -nocomp
1950: 6c 61 69 6e 20 74 65 73 74 5f 63 6f 6e 66 69 67  lain test_config
1960: 75 72 61 74 69 6f 6e 22 0d 0a 20 20 20 20 20 20  uration"..      
1970: 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 6e  #..      if {[in
1980: 66 6f 20 65 78 69 73 74 73 20 3a 3a 74 65 73 74  fo exists ::test
1990: 5f 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 5d 20  _configuration] 
19a0: 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  && \..          
19b0: 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
19c0: 3a 3a 74 65 73 74 5f 63 6f 6e 66 69 67 75 72 61  ::test_configura
19d0: 74 69 6f 6e 5d 20 3e 20 30 7d 20 74 68 65 6e 20  tion] > 0} then 
19e0: 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
19f0: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 55 73        # NOTE: Us
1a00: 65 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  e the specified 
1a10: 74 65 73 74 20 63 6f 6e 66 69 67 75 72 61 74 69  test configurati
1a20: 6f 6e 2e 20 20 54 68 65 20 64 65 66 61 75 6c 74  on.  The default
1a30: 20 76 61 6c 75 65 20 75 73 65 64 0d 0a 20 20 20   value used..   
1a40: 20 20 20 20 20 23 20 20 20 20 20 20 20 66 6f 72       #       for
1a50: 20 74 68 69 73 20 76 61 72 69 61 62 6c 65 20 69   this variable i
1a60: 73 20 74 79 70 69 63 61 6c 6c 79 20 22 52 65 6c  s typically "Rel
1a70: 65 61 73 65 22 2c 20 61 73 20 73 65 74 20 62 79  ease", as set by
1a80: 20 74 68 65 20 74 65 73 74 0d 0a 20 20 20 20 20   the test..     
1a90: 20 20 20 23 20 20 20 20 20 20 20 73 75 69 74 65     #       suite
1aa0: 20 69 74 73 65 6c 66 2e 0d 0a 20 20 20 20 20 20   itself...      
1ab0: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74    #..        ret
1ac0: 75 72 6e 20 24 3a 3a 74 65 73 74 5f 63 6f 6e 66  urn $::test_conf
1ad0: 69 67 75 72 61 74 69 6f 6e 0d 0a 20 20 20 20 20  iguration..     
1ae0: 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
1af0: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
1b00: 4e 4f 54 45 3a 20 4e 6f 72 6d 61 6c 6c 79 2c 20  NOTE: Normally, 
1b10: 77 65 20 77 69 6c 6c 20 6e 65 76 65 72 20 68 69  we will never hi
1b20: 74 20 74 68 69 73 20 63 61 73 65 20 62 65 63 61  t this case beca
1b30: 75 73 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66  use the value of
1b40: 20 74 68 65 0d 0a 20 20 20 20 20 20 20 20 23 20   the..        # 
1b50: 20 20 20 20 20 20 74 65 73 74 20 63 6f 6e 66 69        test confi
1b60: 67 75 72 61 74 69 6f 6e 20 76 61 72 69 61 62 6c  guration variabl
1b70: 65 20 69 73 20 61 6c 77 61 79 73 20 73 65 74 20  e is always set 
1b80: 62 79 20 74 68 65 20 74 65 73 74 20 73 75 69 74  by the test suit
1b90: 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  e..        #    
1ba0: 20 20 20 69 74 73 65 6c 66 3b 20 68 6f 77 65 76     itself; howev
1bb0: 65 72 2c 20 69 74 20 63 61 6e 20 62 65 20 6f 76  er, it can be ov
1bc0: 65 72 72 69 64 64 65 6e 20 75 73 69 6e 67 20 74  erridden using t
1bd0: 68 65 20 75 6e 73 65 74 20 63 6f 6d 6d 61 6e 64  he unset command
1be0: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
1bf0: 20 20 66 72 6f 6d 20 74 68 65 20 2d 70 72 65 54    from the -preT
1c00: 65 73 74 20 6f 70 74 69 6f 6e 20 74 6f 20 74 68  est option to th
1c10: 65 20 74 65 73 74 20 73 75 69 74 65 2e 0d 0a 20  e test suite... 
1c20: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
1c30: 20 20 72 65 74 75 72 6e 20 24 3a 3a 65 61 67 6c    return $::eagl
1c40: 65 5f 70 6c 61 74 66 6f 72 6d 28 63 6f 6e 66 69  e_platform(confi
1c50: 67 75 72 61 74 69 6f 6e 29 0d 0a 20 20 20 20 20  guration)..     
1c60: 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20   }..    }.....  
1c70: 20 20 70 72 6f 63 20 67 65 74 42 75 69 6c 64 43    proc getBuildC
1c80: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 73 20 7b 7d  onfigurations {}
1c90: 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20   {..      #..   
1ca0: 20 20 20 23 20 4e 4f 54 45 3a 20 53 65 65 20 69     # NOTE: See i
1cb0: 66 20 74 68 65 20 6c 69 73 74 20 6f 66 20 74 65  f the list of te
1cc0: 73 74 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  st configuration
1cd0: 73 20 68 61 73 20 62 65 65 6e 20 6f 76 65 72 72  s has been overr
1ce0: 69 64 64 65 6e 20 62 79 0d 0a 20 20 20 20 20 20  idden by..      
1cf0: 23 20 20 20 20 20 20 20 74 68 65 20 75 73 65 72  #       the user
1d00: 20 28 65 2e 67 2e 20 6f 6e 20 74 68 65 20 63 6f   (e.g. on the co
1d10: 6d 6d 61 6e 64 20 6c 69 6e 65 29 2e 0d 0a 20 20  mmand line)...  
1d20: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20      #..      if 
1d30: 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  {[info exists ::
1d40: 74 65 73 74 5f 63 6f 6e 66 69 67 75 72 61 74 69  test_configurati
1d50: 6f 6e 73 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20  ons] && \..     
1d60: 20 20 20 20 20 5b 6c 6c 65 6e 67 74 68 20 24 3a       [llength $:
1d70: 3a 74 65 73 74 5f 63 6f 6e 66 69 67 75 72 61 74  :test_configurat
1d80: 69 6f 6e 73 5d 20 3e 20 30 7d 20 74 68 65 6e 20  ions] > 0} then 
1d90: 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
1da0: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 55 73        # NOTE: Us
1db0: 65 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  e the specified 
1dc0: 6c 69 73 74 20 6f 66 20 74 65 73 74 20 63 6f 6e  list of test con
1dd0: 66 69 67 75 72 61 74 69 6f 6e 73 2e 0d 0a 20 20  figurations...  
1de0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
1df0: 20 72 65 74 75 72 6e 20 24 3a 3a 74 65 73 74 5f   return $::test_
1e00: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 73 0d 0a  configurations..
1e10: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
1e20: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
1e30: 20 20 20 23 20 4e 4f 54 45 3a 20 55 73 65 20 74     # NOTE: Use t
1e40: 68 65 20 64 65 66 61 75 6c 74 20 6c 69 73 74 20  he default list 
1e50: 6f 66 20 74 65 73 74 20 63 6f 6e 66 69 67 75 72  of test configur
1e60: 61 74 69 6f 6e 73 2e 0d 0a 20 20 20 20 20 20 20  ations...       
1e70: 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75   #..        retu
1e80: 72 6e 20 5b 6c 69 73 74 20 44 65 62 75 67 20 52  rn [list Debug R
1e90: 65 6c 65 61 73 65 5d 0d 0a 20 20 20 20 20 20 7d  elease]..      }
1ea0: 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
1eb0: 70 72 6f 63 20 67 65 74 42 75 69 6c 64 42 61 73  proc getBuildBas
1ec0: 65 44 69 72 65 63 74 6f 72 79 20 7b 7d 20 7b 0d  eDirectory {} {.
1ed0: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
1ee0: 23 20 4e 4f 54 45 3a 20 46 69 67 75 72 65 20 6f  # NOTE: Figure o
1ef0: 75 74 20 74 68 65 20 62 61 73 65 20 64 69 72 65  ut the base dire
1f00: 63 74 6f 72 79 20 77 68 65 72 65 20 61 6c 6c 20  ctory where all 
1f10: 74 68 65 20 62 75 69 6c 64 73 20 73 68 6f 75 6c  the builds shoul
1f20: 64 20 62 65 0d 0a 20 20 20 20 20 20 23 20 20 20  d be..      #   
1f30: 20 20 20 20 6c 6f 63 61 74 65 64 2e 20 20 54 68      located.  Th
1f40: 69 73 20 77 69 6c 6c 20 62 65 20 74 68 65 20 64  is will be the d
1f50: 69 72 65 63 74 6f 72 79 20 74 68 61 74 20 63 6f  irectory that co
1f60: 6e 74 61 69 6e 73 20 74 68 65 20 61 63 74 75 61  ntains the actua
1f70: 6c 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  l..      #      
1f80: 20 62 75 69 6c 64 20 6f 75 74 70 75 74 20 64 69   build output di
1f90: 72 65 63 74 6f 72 79 20 28 65 2e 67 2e 20 70 61  rectory (e.g. pa
1fa0: 72 65 6e 74 20 6f 66 20 22 62 69 6e 22 29 2e 0d  rent of "bin")..
1fb0: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
1fc0: 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73  if {[info exists
1fd0: 20 3a 3a 62 75 69 6c 64 5f 62 61 73 65 5f 64 69   ::build_base_di
1fe0: 72 65 63 74 6f 72 79 5d 20 26 26 20 5c 0d 0a 20  rectory] && \.. 
1ff0: 20 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67           [string
2000: 20 6c 65 6e 67 74 68 20 24 3a 3a 62 75 69 6c 64   length $::build
2010: 5f 62 61 73 65 5f 64 69 72 65 63 74 6f 72 79 5d  _base_directory]
2020: 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20   > 0} then {..  
2030: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
2040: 20 23 20 4e 4f 54 45 3a 20 54 68 65 20 6c 6f 63   # NOTE: The loc
2050: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 62 75 69  ation of the bui
2060: 6c 64 20 62 61 73 65 20 64 69 72 65 63 74 6f 72  ld base director
2070: 79 20 68 61 73 20 62 65 65 6e 20 6f 76 65 72 72  y has been overr
2080: 69 64 64 65 6e 3b 0d 0a 20 20 20 20 20 20 20 20  idden;..        
2090: 23 20 20 20 20 20 20 20 74 68 65 72 65 66 6f 72  #       therefor
20a0: 65 2c 20 75 73 65 20 69 74 20 76 65 72 62 61 74  e, use it verbat
20b0: 69 6d 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  im...        #..
20c0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 24          return $
20d0: 3a 3a 62 75 69 6c 64 5f 62 61 73 65 5f 64 69 72  ::build_base_dir
20e0: 65 63 74 6f 72 79 0d 0a 20 20 20 20 20 20 7d 20  ectory..      } 
20f0: 65 6c 73 65 69 66 20 7b 5b 69 6e 66 6f 20 65 78  elseif {[info ex
2100: 69 73 74 73 20 3a 3a 63 6f 6d 6d 6f 6e 5f 64 69  ists ::common_di
2110: 72 65 63 74 6f 72 79 5d 20 26 26 20 5c 0d 0a 20  rectory] && \.. 
2120: 20 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67           [string
2130: 20 6c 65 6e 67 74 68 20 24 3a 3a 63 6f 6d 6d 6f   length $::commo
2140: 6e 5f 64 69 72 65 63 74 6f 72 79 5d 20 3e 20 30  n_directory] > 0
2150: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
2160: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
2170: 4f 54 45 3a 20 4e 65 78 74 2c 20 66 61 6c 6c 62  OTE: Next, fallb
2180: 61 63 6b 20 74 6f 20 74 68 65 20 70 61 72 65 6e  ack to the paren
2190: 74 20 64 69 72 65 63 74 6f 72 79 20 6f 66 20 74  t directory of t
21a0: 68 65 20 6f 6e 65 20 63 6f 6e 74 61 69 6e 69 6e  he one containin
21b0: 67 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  g..        #    
21c0: 20 20 20 74 68 69 73 20 66 69 6c 65 20 28 69 2e     this file (i.
21d0: 65 2e 20 22 63 6f 6d 6d 6f 6e 2e 65 61 67 6c 65  e. "common.eagle
21e0: 22 29 2c 20 69 66 20 61 76 61 69 6c 61 62 6c 65  "), if available
21f0: 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
2200: 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b 66 69        return [fi
2210: 6c 65 20 64 69 72 6e 61 6d 65 20 24 3a 3a 63 6f  le dirname $::co
2220: 6d 6d 6f 6e 5f 64 69 72 65 63 74 6f 72 79 5d 0d  mmon_directory].
2230: 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 69 66 20  .      } elseif 
2240: 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  {[info exists ::
2250: 70 61 74 68 5d 20 26 26 20 5c 0d 0a 20 20 20 20  path] && \..    
2260: 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65        [string le
2270: 6e 67 74 68 20 24 3a 3a 70 61 74 68 5d 20 3e 20  ngth $::path] > 
2280: 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
2290: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
22a0: 4e 4f 54 45 3a 20 46 69 6e 61 6c 6c 79 2c 20 66  NOTE: Finally, f
22b0: 61 6c 6c 62 61 63 6b 20 74 6f 20 74 68 65 20 70  allback to the p
22c0: 61 72 65 6e 74 20 64 69 72 65 63 74 6f 72 79 20  arent directory 
22d0: 6f 66 20 74 68 65 20 45 61 67 6c 65 54 65 73 74  of the EagleTest
22e0: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
22f0: 20 20 70 61 74 68 2e 20 20 54 68 65 20 45 61 67    path.  The Eag
2300: 6c 65 54 65 73 74 20 70 61 63 6b 61 67 65 20 67  leTest package g
2310: 75 61 72 61 6e 74 65 65 73 20 74 68 61 74 20 74  uarantees that t
2320: 68 69 73 20 76 61 72 69 61 62 6c 65 0d 0a 20 20  his variable..  
2330: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 77 69        #       wi
2340: 6c 6c 20 62 65 20 73 65 74 20 74 6f 20 74 68 65  ll be set to the
2350: 20 64 69 72 65 63 74 6f 72 79 20 63 6f 6e 74 61   directory conta
2360: 69 6e 69 6e 67 20 74 68 65 20 66 69 72 73 74 20  ining the first 
2370: 66 69 6c 65 20 74 6f 0d 0a 20 20 20 20 20 20 20  file to..       
2380: 20 23 20 20 20 20 20 20 20 65 78 65 63 75 74 65   #       execute
2390: 20 74 68 65 20 5b 72 75 6e 54 65 73 74 50 72 6f   the [runTestPro
23a0: 6c 6f 67 75 65 5d 20 73 63 72 69 70 74 20 6c 69  logue] script li
23b0: 62 72 61 72 79 20 70 72 6f 63 65 64 75 72 65 2e  brary procedure.
23c0: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
23d0: 20 20 20 20 20 72 65 74 75 72 6e 20 5b 66 69 6c       return [fil
23e0: 65 20 64 69 72 6e 61 6d 65 20 24 3a 3a 70 61 74  e dirname $::pat
23f0: 68 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65  h]..      } else
2400: 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20   {..        #.. 
2410: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4e         # NOTE: N
2420: 6f 20 70 61 74 68 20 69 73 20 61 76 61 69 6c 61  o path is availa
2430: 62 6c 65 2c 20 72 65 74 75 72 6e 20 61 6e 20 65  ble, return an e
2440: 6d 70 74 79 20 73 74 72 69 6e 67 2e 20 20 54 68  mpty string.  Th
2450: 69 73 20 70 6f 69 6e 74 0d 0a 20 20 20 20 20 20  is point..      
2460: 20 20 23 20 20 20 20 20 20 20 73 68 6f 75 6c 64    #       should
2470: 20 6e 6f 74 20 62 65 20 72 65 61 63 68 65 64 2e   not be reached.
2480: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
2490: 20 20 20 20 20 72 65 74 75 72 6e 20 22 22 0d 0a       return ""..
24a0: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a        }..    }..
24b0: 0c 0d 0a 20 20 20 20 70 72 6f 63 20 6a 6f 69 6e  ...    proc join
24c0: 42 75 69 6c 64 44 69 72 65 63 74 6f 72 79 20 7b  BuildDirectory {
24d0: 20 6e 61 74 69 76 65 20 70 61 74 68 20 79 65 61   native path yea
24e0: 72 20 70 6c 61 74 66 6f 72 6d 20 63 6f 6e 66 69  r platform confi
24f0: 67 75 72 61 74 69 6f 6e 20 7d 20 7b 0d 0a 20 20  guration } {..  
2500: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
2510: 4f 54 45 3a 20 46 69 67 75 72 65 20 6f 75 74 20  OTE: Figure out 
2520: 61 6e 64 20 74 68 65 6e 20 72 65 74 75 72 6e 20  and then return 
2530: 74 68 65 20 66 75 6c 6c 79 20 71 75 61 6c 69 66  the fully qualif
2540: 69 65 64 20 70 61 74 68 20 74 6f 20 74 68 65 20  ied path to the 
2550: 62 75 69 6c 64 0d 0a 20 20 20 20 20 20 23 20 20  build..      #  
2560: 20 20 20 20 20 64 69 72 65 63 74 6f 72 79 20 62       directory b
2570: 61 73 65 64 20 6f 6e 20 61 6c 6c 20 74 68 65 20  ased on all the 
2580: 61 72 67 75 6d 65 6e 74 73 20 70 72 6f 76 69 64  arguments provid
2590: 65 64 20 62 79 20 6f 75 72 20 63 61 6c 6c 65 72  ed by our caller
25a0: 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
25b0: 20 20 69 66 20 7b 24 6e 61 74 69 76 65 7d 20 74    if {$native} t
25c0: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 72  hen {..        r
25d0: 65 74 75 72 6e 20 5b 66 69 6c 65 20 6a 6f 69 6e  eturn [file join
25e0: 20 24 70 61 74 68 20 62 69 6e 20 24 79 65 61 72   $path bin $year
25f0: 20 24 70 6c 61 74 66 6f 72 6d 20 24 63 6f 6e 66   $platform $conf
2600: 69 67 75 72 61 74 69 6f 6e 5d 0d 0a 20 20 20 20  iguration]..    
2610: 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
2620: 20 20 20 20 72 65 74 75 72 6e 20 5b 66 69 6c 65      return [file
2630: 20 6a 6f 69 6e 20 24 70 61 74 68 20 62 69 6e 20   join $path bin 
2640: 24 79 65 61 72 20 24 63 6f 6e 66 69 67 75 72 61  $year $configura
2650: 74 69 6f 6e 20 62 69 6e 5d 0d 0a 20 20 20 20 20  tion bin]..     
2660: 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20   }..    }.....  
2670: 20 20 70 72 6f 63 20 67 65 74 42 75 69 6c 64 44    proc getBuildD
2680: 69 72 65 63 74 6f 72 79 20 7b 7d 20 7b 0d 0a 20  irectory {} {.. 
2690: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
26a0: 4e 4f 54 45 3a 20 53 65 65 20 69 66 20 74 68 65  NOTE: See if the
26b0: 20 22 6e 61 74 69 76 65 22 20 72 75 6e 74 69 6d   "native" runtim
26c0: 65 20 6f 70 74 69 6f 6e 20 68 61 73 20 62 65 65  e option has bee
26d0: 6e 20 73 65 74 2e 20 20 49 66 20 73 6f 2c 20 75  n set.  If so, u
26e0: 73 65 20 74 68 65 0d 0a 20 20 20 20 20 20 23 20  se the..      # 
26f0: 20 20 20 20 20 20 64 69 72 65 63 74 6f 72 79 20        directory 
2700: 66 6f 72 20 74 68 65 20 6d 69 78 65 64 2d 6d 6f  for the mixed-mo
2710: 64 65 20 61 73 73 65 6d 62 6c 79 20 28 61 2e 6b  de assembly (a.k
2720: 2e 61 2e 20 74 68 65 20 6e 61 74 69 76 65 20 69  .a. the native i
2730: 6e 74 65 72 6f 70 0d 0a 20 20 20 20 20 20 23 20  nterop..      # 
2740: 20 20 20 20 20 20 61 73 73 65 6d 62 6c 79 29 2e        assembly).
2750: 20 20 54 6f 20 65 6e 61 62 6c 65 20 74 68 69 73    To enable this
2760: 20 6f 70 74 69 6f 6e 20 76 69 61 20 74 68 65 20   option via the 
2770: 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 2c 20 65 6e  command line, en
2780: 74 65 72 20 61 0d 0a 20 20 20 20 20 20 23 20 20  ter a..      #  
2790: 20 20 20 20 20 63 6f 6d 6d 61 6e 64 20 73 69 6d       command sim
27a0: 69 6c 61 72 20 74 6f 20 6f 6e 65 20 6f 66 20 74  ilar to one of t
27b0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 28 61 6c  he following (al
27c0: 6c 20 6f 6e 20 6f 6e 65 20 6c 69 6e 65 29 3a 0d  l on one line):.
27d0: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
27e0: 23 20 20 20 20 20 20 20 45 61 67 6c 65 53 68 65  #       EagleShe
27f0: 6c 6c 2e 65 78 65 20 2d 69 6e 69 74 69 61 6c 69  ll.exe -initiali
2800: 7a 65 20 2d 72 75 6e 74 69 6d 65 4f 70 74 69 6f  ze -runtimeOptio
2810: 6e 20 6e 61 74 69 76 65 0d 0a 20 20 20 20 20 20  n native..      
2820: 23 20 20 20 20 20 20 20 20 20 2d 66 69 6c 65 20  #         -file 
2830: 2e 5c 70 61 74 68 5c 74 6f 5c 61 6c 6c 2e 65 61  .\path\to\all.ea
2840: 67 6c 65 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  gle..      #..  
2850: 20 20 20 20 23 20 20 20 20 20 20 20 54 6f 20 65      #       To e
2860: 6e 61 62 6c 65 20 74 68 69 73 20 6f 70 74 69 6f  nable this optio
2870: 6e 20 76 69 61 20 74 68 65 20 63 6f 6d 6d 61 6e  n via the comman
2880: 64 20 6c 69 6e 65 20 70 72 69 6f 72 20 74 6f 20  d line prior to 
2890: 74 68 65 20 22 62 65 74 61 20 31 36 22 0d 0a 20  the "beta 16".. 
28a0: 20 20 20 20 20 23 20 20 20 20 20 20 20 72 65 6c       #       rel
28b0: 65 61 73 65 20 6f 66 20 45 61 67 6c 65 2c 20 74  ease of Eagle, t
28c0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6d  he following com
28d0: 6d 61 6e 64 20 6d 75 73 74 20 62 65 20 75 73 65  mand must be use
28e0: 64 20 69 6e 73 74 65 61 64 0d 0a 20 20 20 20 20  d instead..     
28f0: 20 23 20 20 20 20 20 20 20 28 61 6c 73 6f 20 61   #       (also a
2900: 6c 6c 20 6f 6e 20 6f 6e 65 20 6c 69 6e 65 29 3a  ll on one line):
2910: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
2920: 20 23 20 20 20 20 20 20 20 45 61 67 6c 65 53 68   #       EagleSh
2930: 65 6c 6c 2e 65 78 65 20 2d 69 6e 69 74 69 61 6c  ell.exe -initial
2940: 69 7a 65 20 2d 70 6f 73 74 49 6e 69 74 69 61 6c  ize -postInitial
2950: 69 7a 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ize..      #    
2960: 20 20 20 20 20 22 6f 62 6a 65 63 74 20 69 6e 76       "object inv
2970: 6f 6b 65 20 49 6e 74 65 72 70 72 65 74 65 72 2e  oke Interpreter.
2980: 47 65 74 41 63 74 69 76 65 20 41 64 64 52 75 6e  GetActive AddRun
2990: 74 69 6d 65 4f 70 74 69 6f 6e 20 6e 61 74 69 76  timeOption nativ
29a0: 65 22 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  e"..      #     
29b0: 20 20 20 20 2d 66 69 6c 65 20 2e 5c 70 61 74 68      -file .\path
29c0: 5c 74 6f 5c 61 6c 6c 2e 65 61 67 6c 65 0d 0a 20  \to\all.eagle.. 
29d0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66       #..      if
29e0: 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a   {[info exists :
29f0: 3a 62 75 69 6c 64 5f 64 69 72 65 63 74 6f 72 79  :build_directory
2a00: 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20  ] && \..        
2a10: 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68    [string length
2a20: 20 24 3a 3a 62 75 69 6c 64 5f 64 69 72 65 63 74   $::build_direct
2a30: 6f 72 79 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b  ory] > 0} then {
2a40: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
2a50: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 65       # NOTE: The
2a60: 20 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 74 68 65   location of the
2a70: 20 62 75 69 6c 64 20 64 69 72 65 63 74 6f 72 79   build directory
2a80: 20 68 61 73 20 62 65 65 6e 20 6f 76 65 72 72 69   has been overri
2a90: 64 64 65 6e 3b 0d 0a 20 20 20 20 20 20 20 20 23  dden;..        #
2aa0: 20 20 20 20 20 20 20 74 68 65 72 65 66 6f 72 65         therefore
2ab0: 2c 20 75 73 65 20 69 74 20 76 65 72 62 61 74 69  , use it verbati
2ac0: 6d 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  m...        #.. 
2ad0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 3a         return $:
2ae0: 3a 62 75 69 6c 64 5f 64 69 72 65 63 74 6f 72 79  :build_directory
2af0: 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b  ..      } else {
2b00: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
2b10: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 66 20       # NOTE: If 
2b20: 74 68 65 20 22 6e 61 74 69 76 65 22 20 72 75 6e  the "native" run
2b30: 74 69 6d 65 20 6f 70 74 69 6f 6e 20 69 73 20 73  time option is s
2b40: 65 74 2c 20 74 68 65 20 6d 69 78 65 64 2d 6d 6f  et, the mixed-mo
2b50: 64 65 20 61 73 73 65 6d 62 6c 79 0d 0a 20 20 20  de assembly..   
2b60: 20 20 20 20 20 23 20 20 20 20 20 20 20 69 73 20       #       is 
2b70: 62 65 69 6e 67 20 74 65 73 74 65 64 2e 20 20 49  being tested.  I
2b80: 6e 20 74 68 61 74 20 63 61 73 65 2c 20 74 68 65  n that case, the
2b90: 20 70 61 74 68 20 74 6f 20 74 68 65 20 62 75 69   path to the bui
2ba0: 6c 64 20 64 69 72 65 63 74 6f 72 79 0d 0a 20 20  ld directory..  
2bb0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 77 69        #       wi
2bc0: 6c 6c 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 70  ll contain the p
2bd0: 6c 61 74 66 6f 72 6d 20 6e 61 6d 65 20 61 6e 64  latform name and
2be0: 20 61 6c 6c 20 74 68 65 20 62 69 6e 61 72 69 65   all the binarie
2bf0: 73 20 75 6e 64 65 72 20 74 65 73 74 0d 0a 20 20  s under test..  
2c00: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 73 68        #       sh
2c10: 6f 75 6c 64 20 62 65 20 70 72 65 73 65 6e 74 20  ould be present 
2c20: 69 6e 20 74 68 61 74 20 64 69 72 65 63 74 6f 72  in that director
2c30: 79 2e 20 20 49 66 20 74 68 65 20 22 6e 61 74 69  y.  If the "nati
2c40: 76 65 22 20 72 75 6e 74 69 6d 65 0d 0a 20 20 20  ve" runtime..   
2c50: 20 20 20 20 20 23 20 20 20 20 20 20 20 6f 70 74       #       opt
2c60: 69 6f 6e 20 69 73 20 6e 6f 74 20 73 65 74 2c 20  ion is not set, 
2c70: 74 68 65 20 62 75 69 6c 64 20 64 69 72 65 63 74  the build direct
2c80: 6f 72 79 20 77 69 6c 6c 20 62 65 20 63 6f 6e 73  ory will be cons
2c90: 69 64 65 72 65 64 20 74 6f 20 62 65 0d 0a 20 20  idered to be..  
2ca0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 22 70        #       "p
2cb0: 6c 61 74 66 6f 72 6d 2d 6e 65 75 74 72 61 6c 22  latform-neutral"
2cc0: 2c 20 77 69 74 68 20 74 68 65 20 6e 6f 74 61 62  , with the notab
2cd0: 6c 65 20 65 78 63 65 70 74 69 6f 6e 20 6f 66 20  le exception of 
2ce0: 61 6e 79 20 6e 61 74 69 76 65 0d 0a 20 20 20 20  any native..    
2cf0: 20 20 20 20 23 20 20 20 20 20 20 20 61 73 73 65      #       asse
2d00: 6d 62 6c 79 20 28 65 2e 67 2e 20 22 53 51 4c 69  mbly (e.g. "SQLi
2d10: 74 65 2e 49 6e 74 65 72 6f 70 2e 64 6c 6c 22 29  te.Interop.dll")
2d20: 20 63 6f 70 69 65 64 20 74 68 65 72 65 20 64 75   copied there du
2d30: 72 69 6e 67 20 74 68 65 0d 0a 20 20 20 20 20 20  ring the..      
2d40: 20 20 23 20 20 20 20 20 20 20 62 75 69 6c 64 20    #       build 
2d50: 70 72 6f 63 65 73 73 20 69 74 73 65 6c 66 2e 20  process itself. 
2d60: 20 49 66 20 74 68 65 20 62 75 69 6c 64 20 70 72   If the build pr
2d70: 6f 63 65 73 73 20 73 6f 6d 65 68 6f 77 20 64 6f  ocess somehow do
2d80: 65 73 20 6e 6f 74 0d 0a 20 20 20 20 20 20 20 20  es not..        
2d90: 23 20 20 20 20 20 20 20 63 6f 70 79 20 74 68 65  #       copy the
2da0: 20 6e 61 74 69 76 65 20 61 73 73 65 6d 62 6c 79   native assembly
2db0: 20 66 6f 72 20 74 68 69 73 20 70 6c 61 74 66 6f   for this platfo
2dc0: 72 6d 2c 20 6d 6f 73 74 20 6f 66 20 74 68 65 20  rm, most of the 
2dd0: 74 65 73 74 73 0d 0a 20 20 20 20 20 20 20 20 23  tests..        #
2de0: 20 20 20 20 20 20 20 69 6e 20 74 68 65 20 73 75         in the su
2df0: 69 74 65 20 77 69 6c 6c 20 73 69 6d 70 6c 79 20  ite will simply 
2e00: 62 65 20 73 6b 69 70 70 65 64 2e 20 20 47 65 6e  be skipped.  Gen
2e10: 65 72 61 6c 6c 79 20 73 70 65 61 6b 69 6e 67 2c  erally speaking,
2e20: 20 74 68 65 72 65 0d 0a 20 20 20 20 20 20 20 20   there..        
2e30: 23 20 20 20 20 20 20 20 61 72 65 20 74 77 6f 20  #       are two 
2e40: 77 61 79 73 20 74 6f 20 62 75 69 6c 64 20 74 68  ways to build th
2e50: 65 20 62 69 6e 61 72 69 65 73 20 77 68 65 6e 20  e binaries when 
2e60: 70 72 65 70 61 72 69 6e 67 20 74 6f 20 72 75 6e  preparing to run
2e70: 20 74 68 65 0d 0a 20 20 20 20 20 20 20 20 23 20   the..        # 
2e80: 20 20 20 20 20 20 74 65 73 74 20 73 75 69 74 65        test suite
2e90: 3a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  :..        #..  
2ea0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 31 2e        #       1.
2eb0: 20 42 75 69 6c 64 20 74 68 65 20 73 65 70 61 72   Build the separ
2ec0: 61 74 65 20 6d 61 6e 61 67 65 64 20 61 6e 64 20  ate managed and 
2ed0: 6e 61 74 69 76 65 20 61 73 73 65 6d 62 6c 69 65  native assemblie
2ee0: 73 20 75 73 69 6e 67 20 73 6f 6d 65 0d 0a 20 20  s using some..  
2ef0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 20 20        #         
2f00: 20 63 6f 6d 6d 61 6e 64 73 20 73 69 6d 69 6c 61   commands simila
2f10: 72 20 74 6f 3a 0d 0a 20 20 20 20 20 20 20 20 23  r to:..        #
2f20: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
2f30: 20 20 20 20 20 62 75 69 6c 64 2e 62 61 74 20 24       build.bat $
2f40: 7b 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 7d 4d  {Configuration}M
2f50: 61 6e 61 67 65 64 4f 6e 6c 79 20 24 7b 50 6c 61  anagedOnly ${Pla
2f60: 74 66 6f 72 6d 7d 0d 0a 20 20 20 20 20 20 20 20  tform}..        
2f70: 23 20 20 20 20 20 20 20 20 20 20 62 75 69 6c 64  #          build
2f80: 2e 62 61 74 20 24 7b 43 6f 6e 66 69 67 75 72 61  .bat ${Configura
2f90: 74 69 6f 6e 7d 4e 61 74 69 76 65 4f 6e 6c 79 20  tion}NativeOnly 
2fa0: 24 7b 50 6c 61 74 66 6f 72 6d 7d 0d 0a 20 20 20  ${Platform}..   
2fb0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
2fc0: 23 20 20 20 20 20 20 20 20 20 20 57 68 65 72 65  #          Where
2fd0: 20 24 7b 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e   ${Configuration
2fe0: 7d 20 69 73 20 65 69 74 68 65 72 20 22 44 65 62  } is either "Deb
2ff0: 75 67 22 20 6f 72 20 22 52 65 6c 65 61 73 65 22  ug" or "Release"
3000: 20 61 6e 64 0d 0a 20 20 20 20 20 20 20 20 23 20   and..        # 
3010: 20 20 20 20 20 20 20 20 20 24 7b 50 6c 61 74 66           ${Platf
3020: 6f 72 6d 7d 20 69 73 20 65 69 74 68 65 72 20 22  orm} is either "
3030: 57 69 6e 33 32 22 20 6f 72 20 22 78 36 34 22 2e  Win32" or "x64".
3040: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
3050: 20 20 20 20 20 23 20 20 20 20 20 20 20 32 2e 20       #       2. 
3060: 42 75 69 6c 64 20 74 68 65 20 6d 69 78 65 64 2d  Build the mixed-
3070: 6d 6f 64 65 20 61 73 73 65 6d 62 6c 79 20 75 73  mode assembly us
3080: 69 6e 67 20 61 20 63 6f 6d 6d 61 6e 64 20 73 69  ing a command si
3090: 6d 69 6c 61 72 20 74 6f 3a 0d 0a 20 20 20 20 20  milar to:..     
30a0: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
30b0: 20 20 20 20 20 20 20 20 20 62 75 69 6c 64 2e 62           build.b
30c0: 61 74 20 24 7b 43 6f 6e 66 69 67 75 72 61 74 69  at ${Configurati
30d0: 6f 6e 7d 20 24 7b 50 6c 61 74 66 6f 72 6d 7d 0d  on} ${Platform}.
30e0: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
30f0: 20 20 20 20 23 20 20 20 20 20 20 20 20 20 20 57      #          W
3100: 68 65 72 65 20 24 7b 43 6f 6e 66 69 67 75 72 61  here ${Configura
3110: 74 69 6f 6e 7d 20 69 73 20 65 69 74 68 65 72 20  tion} is either 
3120: 22 44 65 62 75 67 22 20 6f 72 20 22 52 65 6c 65  "Debug" or "Rele
3130: 61 73 65 22 20 61 6e 64 0d 0a 20 20 20 20 20 20  ase" and..      
3140: 20 20 23 20 20 20 20 20 20 20 20 20 20 24 7b 50    #          ${P
3150: 6c 61 74 66 6f 72 6d 7d 20 69 73 20 65 69 74 68  latform} is eith
3160: 65 72 20 22 57 69 6e 33 32 22 20 6f 72 20 22 78  er "Win32" or "x
3170: 36 34 22 2e 20 20 49 66 20 74 68 69 73 20 63 6f  64".  If this co
3180: 6d 6d 61 6e 64 20 69 73 0d 0a 20 20 20 20 20 20  mmand is..      
3190: 20 20 23 20 20 20 20 20 20 20 20 20 20 75 73 65    #          use
31a0: 64 2c 20 76 61 72 69 6f 75 73 20 74 65 73 74 73  d, various tests
31b0: 20 74 68 61 74 20 72 65 71 75 69 72 65 20 73 75   that require su
31c0: 70 70 6c 65 6d 65 6e 74 61 72 79 20 6d 61 6e 61  pplementary mana
31d0: 67 65 64 0d 0a 20 20 20 20 20 20 20 20 23 20 20  ged..        #  
31e0: 20 20 20 20 20 20 20 20 61 73 73 65 6d 62 6c 69          assembli
31f0: 65 73 20 28 65 2e 67 2e 20 4c 49 4e 51 29 20 6d  es (e.g. LINQ) m
3200: 61 79 20 62 65 20 73 6b 69 70 70 65 64 20 75 6e  ay be skipped un
3210: 6c 65 73 73 20 74 68 6f 73 65 20 62 69 6e 61 72  less those binar
3220: 69 65 73 0d 0a 20 20 20 20 20 20 20 20 23 20 20  ies..        #  
3230: 20 20 20 20 20 20 20 20 61 72 65 20 73 75 62 73          are subs
3240: 65 71 75 65 6e 74 6c 79 20 63 6f 70 69 65 64 20  equently copied 
3250: 69 6e 74 6f 20 74 68 65 20 63 6f 72 72 65 63 74  into the correct
3260: 20 64 69 72 65 63 74 6f 72 79 20 28 69 2e 65 2e   directory (i.e.
3270: 20 62 79 0d 0a 20 20 20 20 20 20 20 20 23 20 20   by..        #  
3280: 20 20 20 20 20 20 20 20 22 74 65 73 74 5f 61 6c          "test_al
3290: 6c 2e 62 61 74 22 29 2e 0d 0a 20 20 20 20 20 20  l.bat")...      
32a0: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 20    #..        #  
32b0: 20 20 20 20 20 4e 6f 74 65 20 74 68 61 74 20 61       Note that a
32c0: 6c 6c 20 6f 66 20 74 68 65 20 62 75 69 6c 64 20  ll of the build 
32d0: 63 6f 6d 6d 61 6e 64 73 20 61 62 6f 76 65 20 77  commands above w
32e0: 69 6c 6c 20 64 65 66 61 75 6c 74 20 74 6f 20 75  ill default to u
32f0: 73 69 6e 67 0d 0a 20 20 20 20 20 20 20 20 23 20  sing..        # 
3300: 20 20 20 20 20 20 74 68 65 20 6c 61 74 65 73 74        the latest
3310: 20 76 65 72 73 69 6f 6e 20 6f 66 20 4d 53 42 75   version of MSBu
3320: 69 6c 64 20 61 76 61 69 6c 61 62 6c 65 20 61 6e  ild available an
3330: 64 20 74 68 65 20 22 74 65 73 74 5f 79 65 61 72  d the "test_year
3340: 22 20 6d 61 79 0d 0a 20 20 20 20 20 20 20 20 23  " may..        #
3350: 20 20 20 20 20 20 20 6e 65 65 64 20 74 6f 20 62         need to b
3360: 65 20 61 64 6a 75 73 74 65 64 20 61 63 63 6f 72  e adjusted accor
3370: 64 69 6e 67 6c 79 20 74 6f 20 61 63 74 75 61 6c  dingly to actual
3380: 6c 79 20 72 75 6e 20 74 68 65 20 74 65 73 74 20  ly run the test 
3390: 73 75 69 74 65 2e 0d 0a 20 20 20 20 20 20 20 20  suite...        
33a0: 23 20 20 20 20 20 20 20 52 65 66 65 72 20 74 6f  #       Refer to
33b0: 20 74 68 65 20 63 6f 6d 6d 65 6e 74 73 20 69 6e   the comments in
33c0: 20 5b 67 65 74 42 75 69 6c 64 59 65 61 72 5d 20   [getBuildYear] 
33d0: 66 6f 72 20 6d 6f 72 65 20 69 6e 66 6f 72 6d 61  for more informa
33e0: 74 69 6f 6e 20 6f 6e 0d 0a 20 20 20 20 20 20 20  tion on..       
33f0: 20 23 20 20 20 20 20 20 20 68 6f 77 20 74 6f 20   #       how to 
3400: 73 65 74 20 74 68 69 73 20 76 61 72 69 61 62 6c  set this variabl
3410: 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  e...        #.. 
3420: 20 20 20 20 20 20 20 73 65 74 20 6e 61 74 69 76         set nativ
3430: 65 20 5b 68 61 73 52 75 6e 74 69 6d 65 4f 70 74  e [hasRuntimeOpt
3440: 69 6f 6e 20 6e 61 74 69 76 65 5d 0d 0a 0d 0a 20  ion native].... 
3450: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b 6a         return [j
3460: 6f 69 6e 42 75 69 6c 64 44 69 72 65 63 74 6f 72  oinBuildDirector
3470: 79 20 24 6e 61 74 69 76 65 20 5b 67 65 74 42 75  y $native [getBu
3480: 69 6c 64 42 61 73 65 44 69 72 65 63 74 6f 72 79  ildBaseDirectory
3490: 5d 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ] \..           
34a0: 20 5b 67 65 74 42 75 69 6c 64 59 65 61 72 5d 20   [getBuildYear] 
34b0: 5b 67 65 74 42 75 69 6c 64 50 6c 61 74 66 6f 72  [getBuildPlatfor
34c0: 6d 20 24 6e 61 74 69 76 65 5d 20 5b 67 65 74 42  m $native] [getB
34d0: 75 69 6c 64 43 6f 6e 66 69 67 75 72 61 74 69 6f  uildConfiguratio
34e0: 6e 5d 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20  n]]..      }..  
34f0: 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
3500: 20 67 65 74 42 75 69 6c 64 46 69 6c 65 4e 61 6d   getBuildFileNam
3510: 65 20 7b 20 66 69 6c 65 4e 61 6d 65 20 7d 20 7b  e { fileName } {
3520: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
3530: 20 23 20 4e 4f 54 45 3a 20 52 65 74 75 72 6e 73   # NOTE: Returns
3540: 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 66   the specified f
3550: 69 6c 65 20 6e 61 6d 65 20 61 73 20 69 66 20 69  ile name as if i
3560: 74 20 77 65 72 65 20 6c 6f 63 61 74 65 64 20 69  t were located i
3570: 6e 20 74 68 65 0d 0a 20 20 20 20 20 20 23 20 20  n the..      #  
3580: 20 20 20 20 20 62 75 69 6c 64 20 64 69 72 65 63       build direc
3590: 74 6f 72 79 2c 20 64 69 73 63 61 72 64 69 6e 67  tory, discarding
35a0: 20 61 6e 79 20 64 69 72 65 63 74 6f 72 79 20 69   any directory i
35b0: 6e 66 6f 72 6d 61 74 69 6f 6e 20 70 72 65 73 65  nformation prese
35c0: 6e 74 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  nt..      #     
35d0: 20 20 69 6e 20 74 68 65 20 66 69 6c 65 20 6e 61    in the file na
35e0: 6d 65 20 61 73 20 70 72 6f 76 69 64 65 64 20 62  me as provided b
35f0: 79 20 6f 75 72 20 63 61 6c 6c 65 72 2e 0d 0a 20  y our caller... 
3600: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 72 65       #..      re
3610: 74 75 72 6e 20 5b 66 69 6c 65 20 6e 61 74 69 76  turn [file nativ
3620: 65 6e 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20 20  ename \..       
3630: 20 20 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5b 67     [file join [g
3640: 65 74 42 75 69 6c 64 44 69 72 65 63 74 6f 72 79  etBuildDirectory
3650: 5d 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 66 69  ] [file tail $fi
3660: 6c 65 4e 61 6d 65 5d 5d 5d 0d 0a 20 20 20 20 7d  leName]]]..    }
3670: 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65  .....    proc ge
3680: 74 42 69 6e 61 72 79 44 69 72 65 63 74 6f 72 79  tBinaryDirectory
3690: 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a   {} {..      #..
36a0: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68        # NOTE: Th
36b0: 69 73 20 70 72 6f 63 65 64 75 72 65 20 72 65 74  is procedure ret
36c0: 75 72 6e 73 20 74 68 65 20 64 69 72 65 63 74 6f  urns the directo
36d0: 72 79 20 77 68 65 72 65 20 74 68 65 20 74 65 73  ry where the tes
36e0: 74 20 61 70 70 6c 69 63 61 74 69 6f 6e 0d 0a 20  t application.. 
36f0: 20 20 20 20 20 23 20 20 20 20 20 20 20 69 74 73       #       its
3700: 65 6c 66 20 28 69 2e 65 2e 20 74 68 65 20 45 61  elf (i.e. the Ea
3710: 67 6c 65 20 73 68 65 6c 6c 29 20 69 73 20 6c 6f  gle shell) is lo
3720: 63 61 74 65 64 2e 20 20 54 68 69 73 20 77 69 6c  cated.  This wil
3730: 6c 20 62 65 20 75 73 65 64 20 61 73 0d 0a 20 20  l be used as..  
3740: 20 20 20 20 23 20 20 20 20 20 20 20 74 68 65 20      #       the 
3750: 64 65 73 74 69 6e 61 74 69 6f 6e 20 66 6f 72 20  destination for 
3760: 74 68 65 20 63 6f 70 69 65 64 20 53 79 73 74 65  the copied Syste
3770: 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 20 6e 61  m.Data.SQLite na
3780: 74 69 76 65 20 61 6e 64 0d 0a 20 20 20 20 20 20  tive and..      
3790: 23 20 20 20 20 20 20 20 6d 61 6e 61 67 65 64 20  #       managed 
37a0: 61 73 73 65 6d 62 6c 69 65 73 20 28 69 2e 65 2e  assemblies (i.e.
37b0: 20 62 65 63 61 75 73 65 20 74 68 69 73 20 69 73   because this is
37c0: 20 6f 6e 65 20 6f 66 20 74 68 65 20 66 65 77 20   one of the few 
37d0: 70 6c 61 63 65 73 0d 0a 20 20 20 20 20 20 23 20  places..      # 
37e0: 20 20 20 20 20 20 77 68 65 72 65 20 74 68 65 20        where the 
37f0: 43 4c 52 20 77 69 6c 6c 20 61 63 74 75 61 6c 6c  CLR will actuall
3800: 79 20 66 69 6e 64 20 61 6e 64 20 6c 6f 61 64 20  y find and load 
3810: 74 68 65 6d 20 70 72 6f 70 65 72 6c 79 29 2e 0d  them properly)..
3820: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
3830: 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73  if {[info exists
3840: 20 3a 3a 62 69 6e 61 72 79 5f 64 69 72 65 63 74   ::binary_direct
3850: 6f 72 79 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20  ory] && \..     
3860: 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e       [string len
3870: 67 74 68 20 24 3a 3a 62 69 6e 61 72 79 5f 64 69  gth $::binary_di
3880: 72 65 63 74 6f 72 79 5d 20 3e 20 30 7d 20 74 68  rectory] > 0} th
3890: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d  en {..        #.
38a0: 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
38b0: 20 54 68 65 20 6c 6f 63 61 74 69 6f 6e 20 6f 66   The location of
38c0: 20 74 68 65 20 62 69 6e 61 72 79 20 64 69 72 65   the binary dire
38d0: 63 74 6f 72 79 20 68 61 73 20 62 65 65 6e 20 6f  ctory has been o
38e0: 76 65 72 72 69 64 64 65 6e 3b 0d 0a 20 20 20 20  verridden;..    
38f0: 20 20 20 20 23 20 20 20 20 20 20 20 74 68 65 72      #       ther
3900: 65 66 6f 72 65 2c 20 75 73 65 20 69 74 20 76 65  efore, use it ve
3910: 72 62 61 74 69 6d 2e 0d 0a 20 20 20 20 20 20 20  rbatim...       
3920: 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75   #..        retu
3930: 72 6e 20 24 3a 3a 62 69 6e 61 72 79 5f 64 69 72  rn $::binary_dir
3940: 65 63 74 6f 72 79 0d 0a 20 20 20 20 20 20 7d 20  ectory..      } 
3950: 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
3960: 72 65 74 75 72 6e 20 5b 69 6e 66 6f 20 62 69 6e  return [info bin
3970: 61 72 79 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20  ary]..      }.. 
3980: 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
3990: 63 20 67 65 74 42 69 6e 61 72 79 46 69 6c 65 4e  c getBinaryFileN
39a0: 61 6d 65 20 7b 20 66 69 6c 65 4e 61 6d 65 20 7d  ame { fileName }
39b0: 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20   {..      #..   
39c0: 20 20 20 23 20 4e 4f 54 45 3a 20 52 65 74 75 72     # NOTE: Retur
39d0: 6e 73 20 74 68 65 20 73 70 65 63 69 66 69 65 64  ns the specified
39e0: 20 66 69 6c 65 20 6e 61 6d 65 20 61 73 20 69 66   file name as if
39f0: 20 69 74 20 77 65 72 65 20 6c 6f 63 61 74 65 64   it were located
3a00: 20 69 6e 20 74 68 65 0d 0a 20 20 20 20 20 20 23   in the..      #
3a10: 20 20 20 20 20 20 20 62 69 6e 61 72 79 20 64 69         binary di
3a20: 72 65 63 74 6f 72 79 2c 20 64 69 73 63 61 72 64  rectory, discard
3a30: 69 6e 67 20 61 6e 79 20 64 69 72 65 63 74 6f 72  ing any director
3a40: 79 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 70 72  y information pr
3a50: 65 73 65 6e 74 0d 0a 20 20 20 20 20 20 23 20 20  esent..      #  
3a60: 20 20 20 20 20 69 6e 20 74 68 65 20 66 69 6c 65       in the file
3a70: 20 6e 61 6d 65 20 61 73 20 70 72 6f 76 69 64 65   name as provide
3a80: 64 20 62 79 20 6f 75 72 20 63 61 6c 6c 65 72 2e  d by our caller.
3a90: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
3aa0: 20 72 65 74 75 72 6e 20 5b 66 69 6c 65 20 6e 61   return [file na
3ab0: 74 69 76 65 6e 61 6d 65 20 5c 0d 0a 20 20 20 20  tivename \..    
3ac0: 20 20 20 20 20 20 5b 66 69 6c 65 20 6a 6f 69 6e        [file join
3ad0: 20 5b 67 65 74 42 69 6e 61 72 79 44 69 72 65 63   [getBinaryDirec
3ae0: 74 6f 72 79 5d 20 5b 66 69 6c 65 20 74 61 69 6c  tory] [file tail
3af0: 20 24 66 69 6c 65 4e 61 6d 65 5d 5d 5d 0d 0a 20   $fileName]]].. 
3b00: 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
3b10: 63 20 67 65 74 43 6f 72 65 42 69 6e 61 72 79 46  c getCoreBinaryF
3b20: 69 6c 65 4e 61 6d 65 20 7b 20 7b 73 74 61 6e 64  ileName { {stand
3b30: 61 72 64 20 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a  ard false} } {..
3b40: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
3b50: 20 4e 4f 54 45 3a 20 52 65 74 75 72 6e 73 20 74   NOTE: Returns t
3b60: 68 65 20 66 75 6c 6c 20 70 61 74 68 20 66 6f 72  he full path for
3b70: 20 74 68 65 20 66 69 6c 65 20 63 6f 6e 74 61 69   the file contai
3b80: 6e 69 6e 67 20 74 68 65 20 63 6f 72 65 20 53 51  ning the core SQ
3b90: 4c 69 74 65 0d 0a 20 20 20 20 20 20 23 20 20 20  Lite..      #   
3ba0: 20 20 20 20 6c 69 62 72 61 72 79 20 63 6f 64 65      library code
3bb0: 20 66 6f 72 20 74 68 69 73 20 70 6c 61 74 66 6f   for this platfo
3bc0: 72 6d 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  rm...      #..  
3bd0: 20 20 20 20 69 66 20 7b 5b 68 61 73 52 75 6e 74      if {[hasRunt
3be0: 69 6d 65 4f 70 74 69 6f 6e 20 6e 61 74 69 76 65  imeOption native
3bf0: 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
3c00: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
3c10: 4e 4f 54 45 3a 20 52 65 74 75 72 6e 20 74 68 65  NOTE: Return the
3c20: 20 6d 69 78 65 64 2d 6d 6f 64 65 20 61 73 73 65   mixed-mode asse
3c30: 6d 62 6c 79 20 66 69 6c 65 20 6e 61 6d 65 2e 0d  mbly file name..
3c40: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
3c50: 20 20 20 20 72 65 74 75 72 6e 20 5b 66 69 6c 65      return [file
3c60: 20 6e 61 74 69 76 65 6e 61 6d 65 20 5c 0d 0a 20   nativename \.. 
3c70: 20 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65             [file
3c80: 20 6a 6f 69 6e 20 5b 67 65 74 42 69 6e 61 72 79   join [getBinary
3c90: 44 69 72 65 63 74 6f 72 79 5d 20 53 79 73 74 65  Directory] Syste
3ca0: 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 64 6c  m.Data.SQLite.dl
3cb0: 6c 5d 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73  l]]..      } els
3cc0: 65 69 66 20 7b 24 73 74 61 6e 64 61 72 64 7d 20  eif {$standard} 
3cd0: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
3ce0: 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
3cf0: 45 3a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 61  E: Return the na
3d00: 74 69 76 65 2d 6f 6e 6c 79 20 73 74 61 6e 64 61  tive-only standa
3d10: 72 64 20 53 51 4c 69 74 65 20 6c 69 62 72 61 72  rd SQLite librar
3d20: 79 20 66 69 6c 65 20 6e 61 6d 65 2e 0d 0a 20 20  y file name...  
3d30: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
3d40: 20 72 65 74 75 72 6e 20 5b 66 69 6c 65 20 6e 61   return [file na
3d50: 74 69 76 65 6e 61 6d 65 20 5c 0d 0a 20 20 20 20  tivename \..    
3d60: 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20 6a 6f          [file jo
3d70: 69 6e 20 5b 67 65 74 42 69 6e 61 72 79 44 69 72  in [getBinaryDir
3d80: 65 63 74 6f 72 79 5d 20 73 71 6c 69 74 65 33 2e  ectory] sqlite3.
3d90: 64 6c 6c 5d 5d 0d 0a 20 20 20 20 20 20 7d 20 65  dll]]..      } e
3da0: 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  lse {..        #
3db0: 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
3dc0: 3a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 61 74  : Return the nat
3dd0: 69 76 65 2d 6f 6e 6c 79 20 69 6e 74 65 72 6f 70  ive-only interop
3de0: 20 61 73 73 65 6d 62 6c 79 20 66 69 6c 65 20 6e   assembly file n
3df0: 61 6d 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  ame...        #.
3e00: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
3e10: 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65  [file nativename
3e20: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
3e30: 5b 66 69 6c 65 20 6a 6f 69 6e 20 5b 67 65 74 42  [file join [getB
3e40: 69 6e 61 72 79 44 69 72 65 63 74 6f 72 79 5d 20  inaryDirectory] 
3e50: 53 51 4c 69 74 65 2e 49 6e 74 65 72 6f 70 2e 64  SQLite.Interop.d
3e60: 6c 6c 5d 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20  ll]]..      }.. 
3e70: 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
3e80: 63 20 67 65 74 43 6f 6d 6d 6f 6e 44 69 72 65 63  c getCommonDirec
3e90: 74 6f 72 79 20 7b 7d 20 7b 0d 0a 20 20 20 20 20  tory {} {..     
3ea0: 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
3eb0: 3a 20 54 68 69 73 20 70 72 6f 63 65 64 75 72 65  : This procedure
3ec0: 20 72 65 74 75 72 6e 73 20 74 68 65 20 64 69 72   returns the dir
3ed0: 65 63 74 6f 72 79 20 77 68 65 72 65 20 74 68 65  ectory where the
3ee0: 20 74 65 73 74 20 73 63 72 69 70 74 73 0d 0a 20   test scripts.. 
3ef0: 20 20 20 20 20 23 20 20 20 20 20 20 20 73 68 6f       #       sho
3f00: 75 6c 64 20 62 65 20 6c 6f 63 61 74 65 64 2e 20  uld be located. 
3f10: 20 42 79 20 64 65 66 61 75 6c 74 2c 20 74 68 69   By default, thi
3f20: 73 20 6a 75 73 74 20 72 65 74 75 72 6e 73 20 74  s just returns t
3f30: 68 65 20 45 61 67 6c 65 0d 0a 20 20 20 20 20 20  he Eagle..      
3f40: 23 20 20 20 20 20 20 20 62 69 6e 61 72 79 20 64  #       binary d
3f50: 69 72 65 63 74 6f 72 79 2e 0d 0a 20 20 20 20 20  irectory...     
3f60: 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69   #..      if {[i
3f70: 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 63 6f 6d  nfo exists ::com
3f80: 6d 6f 6e 5f 64 69 72 65 63 74 6f 72 79 5d 20 26  mon_directory] &
3f90: 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b  & \..          [
3fa0: 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a  string length $:
3fb0: 3a 63 6f 6d 6d 6f 6e 5f 64 69 72 65 63 74 6f 72  :common_director
3fc0: 79 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  y] > 0} then {..
3fd0: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
3fe0: 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 65 20 6c     # NOTE: The l
3ff0: 6f 63 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 63  ocation of the c
4000: 6f 6d 6d 6f 6e 20 64 69 72 65 63 74 6f 72 79 20  ommon directory 
4010: 68 61 73 20 62 65 65 6e 20 73 65 74 3b 0d 0a 20  has been set;.. 
4020: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74         #       t
4030: 68 65 72 65 66 6f 72 65 2c 20 75 73 65 20 69 74  herefore, use it
4040: 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
4050: 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 3a 3a        return $::
4060: 63 6f 6d 6d 6f 6e 5f 64 69 72 65 63 74 6f 72 79  common_directory
4070: 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 69 66  ..      } elseif
4080: 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a   {[info exists :
4090: 3a 76 65 6e 64 6f 72 5f 64 69 72 65 63 74 6f 72  :vendor_director
40a0: 79 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20  y] && \..       
40b0: 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74     [string lengt
40c0: 68 20 24 3a 3a 76 65 6e 64 6f 72 5f 64 69 72 65  h $::vendor_dire
40d0: 63 74 6f 72 79 5d 20 3e 20 30 7d 20 74 68 65 6e  ctory] > 0} then
40e0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20   {..        #.. 
40f0: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54         # NOTE: T
4100: 68 65 20 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 74  he location of t
4110: 68 65 20 76 65 6e 64 6f 72 20 64 69 72 65 63 74  he vendor direct
4120: 6f 72 79 20 68 61 73 20 62 65 65 6e 20 73 65 74  ory has been set
4130: 3b 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  ;..        #    
4140: 20 20 20 74 68 65 72 65 66 6f 72 65 2c 20 75 73     therefore, us
4150: 65 20 69 74 2e 0d 0a 20 20 20 20 20 20 20 20 23  e it...        #
4160: 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ..        return
4170: 20 24 3a 3a 76 65 6e 64 6f 72 5f 64 69 72 65 63   $::vendor_direc
4180: 74 6f 72 79 0d 0a 20 20 20 20 20 20 7d 20 65 6c  tory..      } el
4190: 73 65 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73  seif {[info exis
41a0: 74 73 20 3a 3a 74 63 6c 5f 6c 69 62 72 61 72 79  ts ::tcl_library
41b0: 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20  ] && \..        
41c0: 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68    [string length
41d0: 20 24 3a 3a 74 63 6c 5f 6c 69 62 72 61 72 79 5d   $::tcl_library]
41e0: 20 3e 20 30 20 26 26 20 5c 0d 0a 20 20 20 20 20   > 0 && \..     
41f0: 20 20 20 20 20 5b 66 69 6c 65 20 69 73 64 69 72       [file isdir
4200: 65 63 74 6f 72 79 20 24 3a 3a 74 63 6c 5f 6c 69  ectory $::tcl_li
4210: 62 72 61 72 79 5d 7d 20 74 68 65 6e 20 7b 0d 0a  brary]} then {..
4220: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
4230: 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 65 20 76     # NOTE: The v
4240: 61 72 69 61 62 6c 65 20 77 69 74 68 20 74 68 65  ariable with the
4250: 20 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 74 68 65   location of the
4260: 20 73 63 72 69 70 74 20 6c 69 62 72 61 72 79 20   script library 
4270: 69 73 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  is..        #   
4280: 20 20 20 20 73 65 74 20 61 6e 64 20 61 70 70 65      set and appe
4290: 61 72 73 20 74 6f 20 62 65 20 61 20 72 65 61 6c  ars to be a real
42a0: 20 64 69 72 65 63 74 6f 72 79 20 28 69 2e 65 2e   directory (i.e.
42b0: 20 6e 6f 74 20 65 6d 62 65 64 64 65 64 0d 0a 20   not embedded.. 
42c0: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 77         #       w
42d0: 69 74 68 69 6e 20 61 20 66 69 6c 65 29 3b 20 74  ithin a file); t
42e0: 68 65 72 65 66 6f 72 65 2c 20 75 73 65 20 69 74  herefore, use it
42f0: 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
4300: 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 3a 3a        return $::
4310: 74 63 6c 5f 6c 69 62 72 61 72 79 0d 0a 20 20 20  tcl_library..   
4320: 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
4330: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
4340: 23 20 4e 4f 54 45 3a 20 46 61 6c 6c 62 61 63 6b  # NOTE: Fallback
4350: 20 74 6f 20 74 68 65 20 64 69 72 65 63 74 6f 72   to the director
4360: 79 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  y containing the
4370: 20 65 78 65 63 75 74 61 62 6c 65 2e 0d 0a 20 20   executable...  
4380: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
4390: 20 72 65 74 75 72 6e 20 5b 69 6e 66 6f 20 62 69   return [info bi
43a0: 6e 61 72 79 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a  nary]..      }..
43b0: 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
43c0: 6f 63 20 67 65 74 44 61 74 61 62 61 73 65 44 69  oc getDatabaseDi
43d0: 72 65 63 74 6f 72 79 20 7b 7d 20 7b 0d 0a 20 20  rectory {} {..  
43e0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
43f0: 4f 54 45 3a 20 54 68 69 73 20 70 72 6f 63 65 64  OTE: This proced
4400: 75 72 65 20 72 65 74 75 72 6e 73 20 74 68 65 20  ure returns the 
4410: 64 69 72 65 63 74 6f 72 79 20 77 68 65 72 65 20  directory where 
4420: 74 68 65 20 74 65 73 74 20 64 61 74 61 62 61 73  the test databas
4430: 65 73 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  es..      #     
4440: 20 20 73 68 6f 75 6c 64 20 62 65 20 6c 6f 63 61    should be loca
4450: 74 65 64 2e 20 20 42 79 20 64 65 66 61 75 6c 74  ted.  By default
4460: 2c 20 74 68 69 73 20 6a 75 73 74 20 75 73 65 73  , this just uses
4470: 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 0d 0a   the temporary..
4480: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 64 69        #       di
4490: 72 65 63 74 6f 72 79 20 63 6f 6e 66 69 67 75 72  rectory configur
44a0: 65 64 20 66 6f 72 20 74 68 69 73 20 73 79 73 74  ed for this syst
44b0: 65 6d 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  em...      #..  
44c0: 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78      if {[info ex
44d0: 69 73 74 73 20 3a 3a 64 61 74 61 62 61 73 65 5f  ists ::database_
44e0: 64 69 72 65 63 74 6f 72 79 5d 20 26 26 20 5c 0d  directory] && \.
44f0: 0a 20 20 20 20 20 20 20 20 20 20 5b 73 74 72 69  .          [stri
4500: 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a 64 61 74  ng length $::dat
4510: 61 62 61 73 65 5f 64 69 72 65 63 74 6f 72 79 5d  abase_directory]
4520: 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20   > 0} then {..  
4530: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
4540: 20 23 20 4e 4f 54 45 3a 20 54 68 65 20 6c 6f 63   # NOTE: The loc
4550: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 64 61 74  ation of the dat
4560: 61 62 61 73 65 20 64 69 72 65 63 74 6f 72 79 20  abase directory 
4570: 68 61 73 20 62 65 65 6e 20 6f 76 65 72 72 69 64  has been overrid
4580: 64 65 6e 3b 0d 0a 20 20 20 20 20 20 20 20 23 20  den;..        # 
4590: 20 20 20 20 20 20 74 68 65 72 65 66 6f 72 65 2c        therefore,
45a0: 20 75 73 65 20 69 74 2e 0d 0a 20 20 20 20 20 20   use it...      
45b0: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74    #..        ret
45c0: 75 72 6e 20 24 3a 3a 64 61 74 61 62 61 73 65 5f  urn $::database_
45d0: 64 69 72 65 63 74 6f 72 79 0d 0a 20 20 20 20 20  directory..     
45e0: 20 7d 20 65 6c 73 65 69 66 20 7b 5b 69 6e 66 6f   } elseif {[info
45f0: 20 65 78 69 73 74 73 20 3a 3a 73 63 72 61 74 63   exists ::scratc
4600: 68 5f 64 69 72 65 63 74 6f 72 79 5d 20 26 26 20  h_directory] && 
4610: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 73 74  \..          [st
4620: 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a 73  ring length $::s
4630: 63 72 61 74 63 68 5f 64 69 72 65 63 74 6f 72 79  cratch_directory
4640: 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20  ] > 0} then {.. 
4650: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
4660: 20 20 23 20 4e 4f 54 45 3a 20 54 68 65 20 6c 6f    # NOTE: The lo
4670: 63 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 63  cation of the sc
4680: 72 61 74 63 68 20 64 69 72 65 63 74 6f 72 79 20  ratch directory 
4690: 68 61 73 20 62 65 65 6e 20 6f 76 65 72 72 69 64  has been overrid
46a0: 64 65 6e 3b 0d 0a 20 20 20 20 20 20 20 20 23 20  den;..        # 
46b0: 20 20 20 20 20 20 74 68 65 72 65 66 6f 72 65 2c        therefore,
46c0: 20 75 73 65 20 69 74 2e 0d 0a 20 20 20 20 20 20   use it...      
46d0: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74    #..        ret
46e0: 75 72 6e 20 24 3a 3a 73 63 72 61 74 63 68 5f 64  urn $::scratch_d
46f0: 69 72 65 63 74 6f 72 79 0d 0a 20 20 20 20 20 20  irectory..      
4700: 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
4710: 20 20 72 65 74 75 72 6e 20 5b 67 65 74 54 65 6d    return [getTem
4720: 70 6f 72 61 72 79 50 61 74 68 5d 0d 0a 20 20 20  poraryPath]..   
4730: 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a     }..    }.....
4740: 20 20 20 20 70 72 6f 63 20 67 65 74 54 65 6d 70      proc getTemp
4750: 6f 72 61 72 79 44 69 72 65 63 74 6f 72 79 20 7b  oraryDirectory {
4760: 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  } {..      #..  
4770: 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 69 73      # NOTE: This
4780: 20 70 72 6f 63 65 64 75 72 65 20 72 65 74 75 72   procedure retur
4790: 6e 73 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  ns the directory
47a0: 20 77 68 65 72 65 20 74 68 65 20 74 65 6d 70 6f   where the tempo
47b0: 72 61 72 79 20 66 69 6c 65 73 0d 0a 20 20 20 20  rary files..    
47c0: 20 20 23 20 20 20 20 20 20 20 73 68 6f 75 6c 64    #       should
47d0: 20 62 65 20 6c 6f 63 61 74 65 64 2e 20 20 42 79   be located.  By
47e0: 20 64 65 66 61 75 6c 74 2c 20 74 68 69 73 20 6a   default, this j
47f0: 75 73 74 20 75 73 65 73 20 74 68 65 20 74 65 6d  ust uses the tem
4800: 70 6f 72 61 72 79 0d 0a 20 20 20 20 20 20 23 20  porary..      # 
4810: 20 20 20 20 20 20 64 69 72 65 63 74 6f 72 79 20        directory 
4820: 63 6f 6e 66 69 67 75 72 65 64 20 66 6f 72 20 74  configured for t
4830: 68 69 73 20 73 79 73 74 65 6d 2e 0d 0a 20 20 20  his system...   
4840: 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
4850: 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 74  [info exists ::t
4860: 65 6d 70 6f 72 61 72 79 5f 64 69 72 65 63 74 6f  emporary_directo
4870: 72 79 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20  ry] && \..      
4880: 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67      [string leng
4890: 74 68 20 24 3a 3a 74 65 6d 70 6f 72 61 72 79 5f  th $::temporary_
48a0: 64 69 72 65 63 74 6f 72 79 5d 20 3e 20 30 7d 20  directory] > 0} 
48b0: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
48c0: 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
48d0: 45 3a 20 54 68 65 20 6c 6f 63 61 74 69 6f 6e 20  E: The location 
48e0: 6f 66 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  of the temporary
48f0: 20 64 69 72 65 63 74 6f 72 79 20 68 61 73 20 62   directory has b
4900: 65 65 6e 20 6f 76 65 72 72 69 64 64 65 6e 3b 0d  een overridden;.
4910: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
4920: 20 74 68 65 72 65 66 6f 72 65 2c 20 75 73 65 20   therefore, use 
4930: 69 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  it...        #..
4940: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 24          return $
4950: 3a 3a 74 65 6d 70 6f 72 61 72 79 5f 64 69 72 65  ::temporary_dire
4960: 63 74 6f 72 79 0d 0a 20 20 20 20 20 20 7d 20 65  ctory..      } e
4970: 6c 73 65 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69  lseif {[info exi
4980: 73 74 73 20 3a 3a 73 63 72 61 74 63 68 5f 64 69  sts ::scratch_di
4990: 72 65 63 74 6f 72 79 5d 20 26 26 20 5c 0d 0a 20  rectory] && \.. 
49a0: 20 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67           [string
49b0: 20 6c 65 6e 67 74 68 20 24 3a 3a 73 63 72 61 74   length $::scrat
49c0: 63 68 5f 64 69 72 65 63 74 6f 72 79 5d 20 3e 20  ch_directory] > 
49d0: 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
49e0: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
49f0: 4e 4f 54 45 3a 20 54 68 65 20 6c 6f 63 61 74 69  NOTE: The locati
4a00: 6f 6e 20 6f 66 20 74 68 65 20 73 63 72 61 74 63  on of the scratc
4a10: 68 20 64 69 72 65 63 74 6f 72 79 20 68 61 73 20  h directory has 
4a20: 62 65 65 6e 20 6f 76 65 72 72 69 64 64 65 6e 3b  been overridden;
4a30: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
4a40: 20 20 74 68 65 72 65 66 6f 72 65 2c 20 75 73 65    therefore, use
4a50: 20 69 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d   it...        #.
4a60: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
4a70: 24 3a 3a 73 63 72 61 74 63 68 5f 64 69 72 65 63  $::scratch_direc
4a80: 74 6f 72 79 0d 0a 20 20 20 20 20 20 7d 20 65 6c  tory..      } el
4a90: 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 72 65  se {..        re
4aa0: 74 75 72 6e 20 5b 67 65 74 54 65 6d 70 6f 72 61  turn [getTempora
4ab0: 72 79 50 61 74 68 5d 0d 0a 20 20 20 20 20 20 7d  ryPath]..      }
4ac0: 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
4ad0: 70 72 6f 63 20 67 65 74 54 65 73 74 4f 76 65 72  proc getTestOver
4ae0: 72 69 64 65 73 50 72 65 61 6d 62 6c 65 20 7b 20  ridesPreamble { 
4af0: 7b 65 78 74 72 61 56 61 72 4e 61 6d 65 73 20 22  {extraVarNames "
4b00: 22 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 73 65  "} } {..      se
4b10: 74 20 76 61 72 4e 61 6d 65 73 20 5b 6c 69 73 74  t varNames [list
4b20: 5d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  ]....      #..  
4b30: 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 66 20 61      # NOTE: If a
4b40: 76 61 69 6c 61 62 6c 65 2c 20 73 74 61 72 74 20  vailable, start 
4b50: 77 69 74 68 20 74 68 65 20 6d 61 73 74 65 72 20  with the master 
4b60: 6c 69 73 74 20 6f 66 20 74 65 73 74 20 6f 76 65  list of test ove
4b70: 72 72 69 64 65 0d 0a 20 20 20 20 20 20 23 20 20  rride..      #  
4b80: 20 20 20 20 20 76 61 72 69 61 62 6c 65 73 2e 0d       variables..
4b90: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
4ba0: 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73  if {[info exists
4bb0: 20 3a 3a 74 65 73 74 5f 6f 76 65 72 72 69 64 65   ::test_override
4bc0: 73 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20  s] && \..       
4bd0: 20 20 20 5b 6c 6c 65 6e 67 74 68 20 24 3a 3a 74     [llength $::t
4be0: 65 73 74 5f 6f 76 65 72 72 69 64 65 73 5d 20 3e  est_overrides] >
4bf0: 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
4c00: 20 20 20 20 65 76 61 6c 20 6c 61 70 70 65 6e 64      eval lappend
4c10: 20 76 61 72 4e 61 6d 65 73 20 24 3a 3a 74 65 73   varNames $::tes
4c20: 74 5f 6f 76 65 72 72 69 64 65 73 0d 0a 20 20 20  t_overrides..   
4c30: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d     }....      #.
4c40: 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49  .      # NOTE: I
4c50: 66 20 72 65 71 75 65 73 74 65 64 20 62 79 20 6f  f requested by o
4c60: 75 72 20 63 61 6c 6c 65 72 2c 20 61 64 64 20 61  ur caller, add a
4c70: 6e 79 20 61 64 64 69 74 69 6f 6e 61 6c 20 76 61  ny additional va
4c80: 72 69 61 62 6c 65 0d 0a 20 20 20 20 20 20 23 20  riable..      # 
4c90: 20 20 20 20 20 20 6e 61 6d 65 73 20 74 6f 20 63        names to c
4ca0: 6f 70 79 20 6e 6f 77 2e 0d 0a 20 20 20 20 20 20  opy now...      
4cb0: 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 6c 6c  #..      if {[ll
4cc0: 65 6e 67 74 68 20 24 65 78 74 72 61 56 61 72 4e  ength $extraVarN
4cd0: 61 6d 65 73 5d 20 3e 20 30 7d 20 74 68 65 6e 20  ames] > 0} then 
4ce0: 7b 0d 0a 20 20 20 20 20 20 20 20 65 76 61 6c 20  {..        eval 
4cf0: 6c 61 70 70 65 6e 64 20 76 61 72 4e 61 6d 65 73  lappend varNames
4d00: 20 24 65 78 74 72 61 56 61 72 4e 61 6d 65 73 0d   $extraVarNames.
4d10: 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
4d20: 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
4d30: 45 3a 20 42 75 69 6c 64 20 74 68 65 20 73 63 72  E: Build the scr
4d40: 69 70 74 20 66 72 61 67 6d 65 6e 74 20 74 6f 20  ipt fragment to 
4d50: 62 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 70  be returned by p
4d60: 72 6f 63 65 73 73 69 6e 67 20 65 61 63 68 0d 0a  rocessing each..
4d70: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 76 61        #       va
4d80: 72 69 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64 20  riable name and 
4d90: 61 64 64 69 6e 67 20 74 68 65 20 6e 65 63 65 63  adding the necec
4da0: 65 73 73 61 72 79 20 73 63 72 69 70 74 20 66 72  essary script fr
4db0: 61 67 6d 65 6e 74 73 20 66 6f 72 0d 0a 20 20 20  agments for..   
4dc0: 20 20 20 23 20 20 20 20 20 20 20 65 61 63 68 20     #       each 
4dd0: 6f 6e 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  one...      #.. 
4de0: 20 20 20 20 20 73 65 74 20 72 65 73 75 6c 74 20       set result 
4df0: 22 22 0d 0a 0d 0a 20 20 20 20 20 20 66 6f 72 65  ""....      fore
4e00: 61 63 68 20 76 61 72 4e 61 6d 65 20 24 76 61 72  ach varName $var
4e10: 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20 20  Names {..       
4e20: 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
4e30: 54 45 3a 20 42 75 69 6c 64 20 74 68 65 20 71 75  TE: Build the qu
4e40: 61 6c 69 66 69 65 64 20 67 6c 6f 62 61 6c 20 76  alified global v
4e50: 61 72 69 61 62 6c 65 20 6e 61 6d 65 2e 0d 0a 20  ariable name... 
4e60: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
4e70: 20 20 73 65 74 20 66 75 6c 6c 56 61 72 4e 61 6d    set fullVarNam
4e80: 65 20 5b 61 70 70 65 6e 64 41 72 67 73 20 3a 3a  e [appendArgs ::
4e90: 20 24 76 61 72 4e 61 6d 65 5d 0d 0a 0d 0a 20 20   $varName]....  
4ea0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
4eb0: 20 23 20 4e 4f 54 45 3a 20 44 6f 65 73 20 74 68   # NOTE: Does th
4ec0: 65 20 76 61 72 69 61 62 6c 65 20 65 78 69 73 74  e variable exist
4ed0: 20 69 6e 20 74 68 69 73 20 69 6e 74 65 72 70 72   in this interpr
4ee0: 65 74 65 72 20 63 6f 6e 74 65 78 74 3f 0d 0a 20  eter context?.. 
4ef0: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
4f00: 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73    if {[info exis
4f10: 74 73 20 24 66 75 6c 6c 56 61 72 4e 61 6d 65 5d  ts $fullVarName]
4f20: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
4f30: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
4f40: 20 23 20 4e 4f 54 45 3a 20 41 70 70 65 6e 64 20   # NOTE: Append 
4f50: 61 20 73 63 72 69 70 74 20 66 72 61 67 6d 65 6e  a script fragmen
4f60: 74 20 74 6f 20 74 68 65 20 72 65 73 75 6c 74 20  t to the result 
4f70: 74 68 61 74 20 77 69 6c 6c 20 63 6f 72 72 65 63  that will correc
4f80: 74 6c 79 0d 0a 20 20 20 20 20 20 20 20 20 20 23  tly..          #
4f90: 20 20 20 20 20 20 20 63 6f 70 79 20 61 6e 79 20         copy any 
4fa0: 63 6f 6e 74 61 69 6e 65 64 20 76 61 6c 75 65 20  contained value 
4fb0: 74 6f 20 61 6e 6f 74 68 65 72 20 69 6e 74 65 72  to another inter
4fc0: 70 72 65 74 65 72 20 63 6f 6e 74 65 78 74 2e 0d  preter context..
4fd0: 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
4fe0: 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 20 72          append r
4ff0: 65 73 75 6c 74 20 5c 6e 20 22 73 65 74 20 22 20  esult \n "set " 
5000: 24 66 75 6c 6c 56 61 72 4e 61 6d 65 20 22 20 5c  $fullVarName " \
5010: 7b 22 20 5b 73 65 74 20 24 66 75 6c 6c 56 61 72  {" [set $fullVar
5020: 4e 61 6d 65 5d 20 5c 7d 0d 0a 20 20 20 20 20 20  Name] \}..      
5030: 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a    }..      }....
5040: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
5050: 20 4e 4f 54 45 3a 20 49 66 20 74 68 65 20 72 65   NOTE: If the re
5060: 73 75 6c 74 20 63 6f 6e 74 61 69 6e 73 20 6f 6e  sult contains on
5070: 65 20 6f 72 20 6d 6f 72 65 20 73 63 72 69 70 74  e or more script
5080: 20 66 72 61 67 6d 65 6e 74 73 2c 20 61 70 70 65   fragments, appe
5090: 6e 64 20 61 0d 0a 20 20 20 20 20 20 23 20 20 20  nd a..      #   
50a0: 20 20 20 20 6e 65 77 6c 69 6e 65 2e 0d 0a 20 20      newline...  
50b0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20      #..      if 
50c0: 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20  {[string length 
50d0: 24 72 65 73 75 6c 74 5d 20 3e 20 30 7d 20 74 68  $result] > 0} th
50e0: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 61 70  en {..        ap
50f0: 70 65 6e 64 20 72 65 73 75 6c 74 20 5c 6e 0d 0a  pend result \n..
5100: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
5110: 20 72 65 74 75 72 6e 20 24 72 65 73 75 6c 74 0d   return $result.
5120: 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70  .    }.....    p
5130: 72 6f 63 20 67 65 74 41 70 70 44 6f 6d 61 69 6e  roc getAppDomain
5140: 50 72 65 61 6d 62 6c 65 20 7b 20 7b 70 72 65 66  Preamble { {pref
5150: 69 78 20 22 22 7d 20 7b 73 75 66 66 69 78 20 22  ix ""} {suffix "
5160: 22 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d  "} } {..      #.
5170: 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54  .      # NOTE: T
5180: 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 72 65  his procedure re
5190: 74 75 72 6e 73 20 61 20 74 65 73 74 20 73 65 74  turns a test set
51a0: 75 70 20 73 63 72 69 70 74 20 66 72 61 67 6d 65  up script fragme
51b0: 6e 74 20 73 75 69 74 61 62 6c 65 20 66 6f 72 0d  nt suitable for.
51c0: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 65  .      #       e
51d0: 76 61 6c 75 61 74 69 6f 6e 20 62 79 20 61 6e 20  valuation by an 
51e0: 69 6e 74 65 72 70 72 65 74 65 72 20 63 72 65 61  interpreter crea
51f0: 74 65 64 20 69 6e 20 61 6e 20 69 73 6f 6c 61 74  ted in an isolat
5200: 65 64 20 61 70 70 6c 69 63 61 74 69 6f 6e 0d 0a  ed application..
5210: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 64 6f        #       do
5220: 6d 61 69 6e 2e 20 20 54 68 65 20 73 63 72 69 70  main.  The scrip
5230: 74 20 66 72 61 67 6d 65 6e 74 20 62 65 69 6e 67  t fragment being
5240: 20 72 65 74 75 72 6e 65 64 20 77 69 6c 6c 20 62   returned will b
5250: 65 20 73 75 72 72 6f 75 6e 64 65 64 20 62 79 0d  e surrounded by.
5260: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74  .      #       t
5270: 68 65 20 70 72 65 66 69 78 20 61 6e 64 20 73 75  he prefix and su
5280: 66 66 69 78 20 22 73 63 72 69 70 74 20 66 72 61  ffix "script fra
5290: 67 6d 65 6e 74 73 22 20 73 70 65 63 69 66 69 65  gments" specifie
52a0: 64 20 62 79 20 6f 75 72 20 63 61 6c 6c 65 72 2c  d by our caller,
52b0: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
52c0: 69 66 20 61 6e 79 2e 20 20 54 68 65 20 65 6e 74  if any.  The ent
52d0: 69 72 65 20 73 63 72 69 70 74 20 62 65 69 6e 67  ire script being
52e0: 20 72 65 74 75 72 6e 65 64 20 77 69 6c 6c 20 62   returned will b
52f0: 65 20 73 75 62 73 74 69 74 75 74 65 64 20 76 69  e substituted vi
5300: 61 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  a..      #      
5310: 20 5b 73 75 62 73 74 5d 2c 20 69 6e 20 74 68 65   [subst], in the
5320: 20 63 6f 6e 74 65 78 74 20 6f 66 20 6f 75 72 20   context of our 
5330: 63 61 6c 6c 65 72 2c 20 62 65 66 6f 72 65 20 62  caller, before b
5340: 65 69 6e 67 20 72 65 74 75 72 6e 65 64 2e 0d 0a  eing returned...
5350: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 54 68        #       Th
5360: 69 73 20 73 74 65 70 20 69 73 20 6e 65 63 65 73  is step is neces
5370: 73 61 72 79 20 73 6f 20 74 68 61 74 20 73 6f 6d  sary so that som
5380: 65 20 6c 69 6d 69 74 65 64 20 63 6f 6e 74 65 78  e limited contex
5390: 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2c 0d 0a  t information,..
53a0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 70 72        #       pr
53b0: 69 6d 61 72 69 6c 79 20 72 65 6c 61 74 65 64 20  imarily related 
53c0: 74 6f 20 74 68 65 20 74 65 73 74 69 6e 67 20 64  to the testing d
53d0: 69 72 65 63 74 6f 72 69 65 73 2c 20 63 61 6e 20  irectories, can 
53e0: 62 65 20 74 72 61 6e 73 66 65 72 72 65 64 0d 0a  be transferred..
53f0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74 6f        #       to
5400: 20 74 68 65 20 69 6e 74 65 72 70 72 65 74 65 72   the interpreter
5410: 20 69 6e 20 74 68 65 20 69 73 6f 6c 61 74 65 64   in the isolated
5420: 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 64 6f 6d   application dom
5430: 61 69 6e 2c 20 6d 61 6b 69 6e 67 20 69 74 0d 0a  ain, making it..
5440: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 61 62        #       ab
5450: 6c 65 20 74 6f 20 73 75 63 63 65 73 73 66 75 6c  le to successful
5460: 6c 79 20 72 75 6e 20 74 65 73 74 73 20 74 68 61  ly run tests tha
5470: 74 20 72 65 71 75 69 72 65 20 6f 6e 65 20 6f 72  t require one or
5480: 20 6d 6f 72 65 20 6f 66 20 74 68 65 0d 0a 20 20   more of the..  
5490: 20 20 20 20 23 20 20 20 20 20 20 20 66 69 6c 65      #       file
54a0: 73 20 69 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20  s in one of the 
54b0: 74 65 73 74 69 6e 67 20 64 69 72 65 63 74 6f 72  testing director
54c0: 69 65 73 2e 20 20 43 61 6c 6c 65 72 73 20 73 68  ies.  Callers sh
54d0: 6f 75 6c 64 20 6b 65 65 70 20 69 6e 0d 0a 20 20  ould keep in..  
54e0: 20 20 20 20 23 20 20 20 20 20 20 20 6d 69 6e 64      #       mind
54f0: 20 74 68 61 74 20 74 68 65 20 74 65 73 74 20 73   that the test s
5500: 63 72 69 70 74 20 66 72 61 67 6d 65 6e 74 20 62  cript fragment b
5510: 65 69 6e 67 20 72 65 74 75 72 6e 65 64 20 63 61  eing returned ca
5520: 6e 6e 6f 74 20 72 65 6c 79 20 6f 6e 0d 0a 20 20  nnot rely on..  
5530: 20 20 20 20 23 20 20 20 20 20 20 20 61 6e 79 20      #       any 
5540: 73 63 72 69 70 74 20 6c 69 62 72 61 72 79 20 70  script library p
5550: 72 6f 63 65 64 75 72 65 73 20 74 68 61 74 20 61  rocedures that a
5560: 72 65 20 6e 6f 74 20 70 72 6f 76 69 64 65 64 20  re not provided 
5570: 62 79 20 74 68 65 20 45 61 67 6c 65 0d 0a 20 20  by the Eagle..  
5580: 20 20 20 20 23 20 20 20 20 20 20 20 6c 69 62 72      #       libr
5590: 61 72 79 20 70 61 63 6b 61 67 65 20 28 69 2e 65  ary package (i.e
55a0: 2e 20 22 69 6e 69 74 2e 65 61 67 6c 65 22 29 2c  . "init.eagle"),
55b0: 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 6f 73 65   including those
55c0: 20 70 72 6f 76 69 64 65 64 20 62 79 0d 0a 20 20   provided by..  
55d0: 20 20 20 20 23 20 20 20 20 20 20 20 74 68 65 20      #       the 
55e0: 45 61 67 6c 65 20 74 65 73 74 20 70 61 63 6b 61  Eagle test packa
55f0: 67 65 2c 20 75 6e 6c 65 73 73 20 74 68 65 20 66  ge, unless the f
5600: 69 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ile containing t
5610: 68 65 6d 20 69 73 20 6c 6f 61 64 65 64 0d 0a 20  hem is loaded.. 
5620: 20 20 20 20 20 23 20 20 20 20 20 20 20 6d 61 6e       #       man
5630: 75 61 6c 6c 79 20 76 69 61 20 73 6f 6d 65 20 6f  ually via some o
5640: 74 68 65 72 20 6d 65 63 68 61 6e 69 73 6d 20 28  ther mechanism (
5650: 65 2e 67 2e 20 62 79 20 69 6e 63 6c 75 64 69 6e  e.g. by includin
5660: 67 20 61 70 70 72 6f 70 72 69 61 74 65 0d 0a 20  g appropriate.. 
5670: 20 20 20 20 20 23 20 20 20 20 20 20 20 5b 70 61       #       [pa
5680: 63 6b 61 67 65 20 72 65 71 75 69 72 65 5d 20 6f  ckage require] o
5690: 72 20 5b 73 6f 75 72 63 65 5d 20 63 6f 6d 6d 61  r [source] comma
56a0: 6e 64 73 20 69 6e 20 74 68 65 20 70 72 65 66 69  nds in the prefi
56b0: 78 20 6f 72 20 73 75 66 66 69 78 0d 0a 20 20 20  x or suffix..   
56c0: 20 20 20 23 20 20 20 20 20 20 20 73 63 72 69 70     #       scrip
56d0: 74 20 66 72 61 67 6d 65 6e 74 73 29 2e 20 20 41  t fragments).  A
56e0: 6c 73 6f 2c 20 61 6c 6c 20 76 61 72 69 61 62 6c  lso, all variabl
56f0: 65 20 72 65 66 65 72 65 6e 63 65 73 20 61 6e 64  e references and
5700: 20 61 6c 6c 20 6e 65 73 74 65 64 0d 0a 20 20 20   all nested..   
5710: 20 20 20 23 20 20 20 20 20 20 20 63 6f 6d 6d 61     #       comma
5720: 6e 64 73 20 28 69 2e 65 2e 20 74 68 6f 73 65 20  nds (i.e. those 
5730: 69 6e 20 73 71 75 61 72 65 20 62 72 61 63 6b 65  in square bracke
5740: 74 73 29 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e  ts) contained in
5750: 20 74 68 65 20 66 69 6e 61 6c 0d 0a 20 20 20 20   the final..    
5760: 20 20 23 20 20 20 20 20 20 20 73 63 72 69 70 74    #       script
5770: 20 66 72 61 67 6d 65 6e 74 20 77 69 6c 6c 20 65   fragment will e
5780: 6e 64 20 75 70 20 62 65 69 6e 67 20 65 76 61 6c  nd up being eval
5790: 75 61 74 65 64 20 69 6e 20 74 68 65 20 63 6f 6e  uated in the con
57a0: 74 65 78 74 20 6f 66 20 74 68 65 0d 0a 20 20 20  text of the..   
57b0: 20 20 20 23 20 20 20 20 20 20 20 63 61 6c 6c 69     #       calli
57c0: 6e 67 20 69 6e 74 65 72 70 72 65 74 65 72 20 61  ng interpreter a
57d0: 6e 64 20 6e 6f 74 20 74 68 65 20 74 61 72 67 65  nd not the targe
57e0: 74 20 69 6e 74 65 72 70 72 65 74 65 72 20 63 72  t interpreter cr
57f0: 65 61 74 65 64 20 69 6e 20 74 68 65 0d 0a 20 20  eated in the..  
5800: 20 20 20 20 23 20 20 20 20 20 20 20 69 73 6f 6c      #       isol
5810: 61 74 65 64 20 61 70 70 6c 69 63 61 74 69 6f 6e  ated application
5820: 20 64 6f 6d 61 69 6e 20 75 6e 6c 65 73 73 20 74   domain unless t
5830: 68 65 20 64 6f 6c 6c 61 72 20 73 69 67 6e 73 20  he dollar signs 
5840: 61 6e 64 2f 6f 72 20 73 71 75 61 72 65 0d 0a 20  and/or square.. 
5850: 20 20 20 20 20 23 20 20 20 20 20 20 20 62 72 61       #       bra
5860: 63 6b 65 74 73 20 61 72 65 20 73 70 65 63 69 61  ckets are specia
5870: 6c 6c 79 20 71 75 6f 74 65 64 20 77 69 74 68 20  lly quoted with 
5880: 62 61 63 6b 73 6c 61 73 68 65 73 2e 0d 0a 20 20  backslashes...  
5890: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 72 65 74      #..      ret
58a0: 75 72 6e 20 5b 75 70 6c 65 76 65 6c 20 31 20 5b  urn [uplevel 1 [
58b0: 6c 69 73 74 20 73 75 62 73 74 20 5b 61 70 70 65  list subst [appe
58c0: 6e 64 41 72 67 73 20 24 70 72 65 66 69 78 20 7b  ndArgs $prefix {
58d0: 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 68  ..        if {[h
58e0: 61 73 52 75 6e 74 69 6d 65 4f 70 74 69 6f 6e 20  asRuntimeOption 
58f0: 6e 61 74 69 76 65 5d 7d 20 74 68 65 6e 20 7b 0d  native]} then {.
5900: 0a 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63  .          objec
5910: 74 20 69 6e 76 6f 6b 65 20 49 6e 74 65 72 70 72  t invoke Interpr
5920: 65 74 65 72 2e 47 65 74 41 63 74 69 76 65 20 41  eter.GetActive A
5930: 64 64 52 75 6e 74 69 6d 65 4f 70 74 69 6f 6e 20  ddRuntimeOption 
5940: 6e 61 74 69 76 65 0d 0a 20 20 20 20 20 20 20 20  native..        
5950: 7d 0d 0a 20 20 20 20 20 20 7d 20 5b 67 65 74 54  }..      } [getT
5960: 65 73 74 4f 76 65 72 72 69 64 65 73 50 72 65 61  estOverridesPrea
5970: 6d 62 6c 65 20 5b 6c 69 73 74 20 70 61 74 68 20  mble [list path 
5980: 74 65 73 74 5f 63 68 61 6e 6e 65 6c 5d 5d 20 24  test_channel]] $
5990: 73 75 66 66 69 78 5d 5d 5d 0d 0a 20 20 20 20 7d  suffix]]]..    }
59a0: 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 74 72  .....    proc tr
59b0: 79 43 6f 70 79 42 69 6e 61 72 79 46 69 6c 65 20  yCopyBinaryFile 
59c0: 7b 20 66 69 6c 65 4e 61 6d 65 20 7b 6e 65 77 46  { fileName {newF
59d0: 69 6c 65 4e 61 6d 65 20 22 22 7d 20 7d 20 7b 0d  ileName ""} } {.
59e0: 0a 20 20 20 20 20 20 73 65 74 20 73 6f 75 72 63  .      set sourc
59f0: 65 46 69 6c 65 4e 61 6d 65 20 5b 67 65 74 42 69  eFileName [getBi
5a00: 6e 61 72 79 46 69 6c 65 4e 61 6d 65 20 24 66 69  naryFileName $fi
5a10: 6c 65 4e 61 6d 65 5d 0d 0a 0d 0a 20 20 20 20 20  leName]....     
5a20: 20 69 66 20 7b 21 5b 66 69 6c 65 20 65 78 69 73   if {![file exis
5a30: 74 73 20 24 73 6f 75 72 63 65 46 69 6c 65 4e 61  ts $sourceFileNa
5a40: 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  me]} then {..   
5a50: 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
5a60: 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
5a70: 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
5a80: 20 20 20 20 20 20 22 2d 2d 2d 2d 20 73 6b 69 70        "---- skip
5a90: 70 65 64 20 63 6f 70 79 69 6e 67 20 62 69 6e 61  ped copying bina
5aa0: 72 79 20 66 69 6c 65 20 5c 22 22 20 24 73 6f 75  ry file \"" $sou
5ab0: 72 63 65 46 69 6c 65 4e 61 6d 65 20 5c 0d 0a 20  rceFileName \.. 
5ac0: 20 20 20 20 20 20 20 20 20 20 20 22 5c 22 2c 20             "\", 
5ad0: 69 74 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73  it does not exis
5ae0: 74 5c 6e 22 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  t\n"]....       
5af0: 20 72 65 74 75 72 6e 0d 0a 20 20 20 20 20 20 7d   return..      }
5b00: 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 73  ....      if {[s
5b10: 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 6e 65  tring length $ne
5b20: 77 46 69 6c 65 4e 61 6d 65 5d 20 3e 20 30 7d 20  wFileName] > 0} 
5b30: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
5b40: 73 65 74 20 74 61 72 67 65 74 46 69 6c 65 4e 61  set targetFileNa
5b50: 6d 65 20 5b 67 65 74 42 75 69 6c 64 46 69 6c 65  me [getBuildFile
5b60: 4e 61 6d 65 20 24 6e 65 77 46 69 6c 65 4e 61 6d  Name $newFileNam
5b70: 65 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65  e]..      } else
5b80: 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20   {..        set 
5b90: 74 61 72 67 65 74 46 69 6c 65 4e 61 6d 65 20 5b  targetFileName [
5ba0: 67 65 74 42 75 69 6c 64 46 69 6c 65 4e 61 6d 65  getBuildFileName
5bb0: 20 24 66 69 6c 65 4e 61 6d 65 5d 0d 0a 20 20 20   $fileName]..   
5bc0: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 69 66     }....      if
5bd0: 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20   {[catch {..    
5be0: 20 20 20 20 20 20 20 20 20 20 66 69 6c 65 20 63            file c
5bf0: 6f 70 79 20 2d 66 6f 72 63 65 20 24 73 6f 75 72  opy -force $sour
5c00: 63 65 46 69 6c 65 4e 61 6d 65 20 24 74 61 72 67  ceFileName $targ
5c10: 65 74 46 69 6c 65 4e 61 6d 65 7d 5d 20 3d 3d 20  etFileName}] == 
5c20: 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
5c30: 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
5c40: 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  _channel [append
5c50: 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
5c60: 20 20 20 20 22 2d 2d 2d 2d 20 63 6f 70 69 65 64      "---- copied
5c70: 20 62 69 6e 61 72 79 20 66 69 6c 65 20 66 72 6f   binary file fro
5c80: 6d 20 5c 22 22 20 24 73 6f 75 72 63 65 46 69 6c  m \"" $sourceFil
5c90: 65 4e 61 6d 65 20 22 5c 22 20 74 6f 20 5c 22 22  eName "\" to \""
5ca0: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
5cb0: 24 74 61 72 67 65 74 46 69 6c 65 4e 61 6d 65 20  $targetFileName 
5cc0: 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d 20 65  \"\n]..      } e
5cd0: 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 74  lse {..        t
5ce0: 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
5cf0: 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
5d00: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
5d10: 22 2d 2d 2d 2d 20 66 61 69 6c 65 64 20 74 6f 20  "---- failed to 
5d20: 63 6f 70 79 20 62 69 6e 61 72 79 20 66 69 6c 65  copy binary file
5d30: 20 66 72 6f 6d 20 5c 22 22 20 24 73 6f 75 72 63   from \"" $sourc
5d40: 65 46 69 6c 65 4e 61 6d 65 20 5c 0d 0a 20 20 20  eFileName \..   
5d50: 20 20 20 20 20 20 20 20 20 22 5c 22 20 74 6f 20           "\" to 
5d60: 5c 22 22 20 24 74 61 72 67 65 74 46 69 6c 65 4e  \"" $targetFileN
5d70: 61 6d 65 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20  ame \"\n]..     
5d80: 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20   }..    }.....  
5d90: 20 20 70 72 6f 63 20 74 72 79 43 6f 70 79 42 75    proc tryCopyBu
5da0: 69 6c 64 46 69 6c 65 20 7b 20 66 69 6c 65 4e 61  ildFile { fileNa
5db0: 6d 65 20 7b 6e 65 77 46 69 6c 65 4e 61 6d 65 20  me {newFileName 
5dc0: 22 22 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 73  ""} } {..      s
5dd0: 65 74 20 73 6f 75 72 63 65 46 69 6c 65 4e 61 6d  et sourceFileNam
5de0: 65 20 5b 67 65 74 42 75 69 6c 64 46 69 6c 65 4e  e [getBuildFileN
5df0: 61 6d 65 20 24 66 69 6c 65 4e 61 6d 65 5d 0d 0a  ame $fileName]..
5e00: 0d 0a 20 20 20 20 20 20 69 66 20 7b 21 5b 66 69  ..      if {![fi
5e10: 6c 65 20 65 78 69 73 74 73 20 24 73 6f 75 72 63  le exists $sourc
5e20: 65 46 69 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e  eFileName]} then
5e30: 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74   {..        tput
5e40: 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
5e50: 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
5e60: 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d  .            "--
5e70: 2d 2d 20 73 6b 69 70 70 65 64 20 63 6f 70 79 69  -- skipped copyi
5e80: 6e 67 20 62 75 69 6c 64 20 66 69 6c 65 20 5c 22  ng build file \"
5e90: 22 20 24 73 6f 75 72 63 65 46 69 6c 65 4e 61 6d  " $sourceFileNam
5ea0: 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e \..           
5eb0: 20 22 5c 22 2c 20 69 74 20 64 6f 65 73 20 6e 6f   "\", it does no
5ec0: 74 20 65 78 69 73 74 5c 6e 22 5d 0d 0a 0d 0a 20  t exist\n"].... 
5ed0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 0d 0a 20         return.. 
5ee0: 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
5ef0: 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67  if {[string leng
5f00: 74 68 20 24 6e 65 77 46 69 6c 65 4e 61 6d 65 5d  th $newFileName]
5f10: 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20   > 0} then {..  
5f20: 20 20 20 20 20 20 73 65 74 20 74 61 72 67 65 74        set target
5f30: 46 69 6c 65 4e 61 6d 65 20 5b 67 65 74 42 69 6e  FileName [getBin
5f40: 61 72 79 46 69 6c 65 4e 61 6d 65 20 24 6e 65 77  aryFileName $new
5f50: 46 69 6c 65 4e 61 6d 65 5d 0d 0a 20 20 20 20 20  FileName]..     
5f60: 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
5f70: 20 20 20 73 65 74 20 74 61 72 67 65 74 46 69 6c     set targetFil
5f80: 65 4e 61 6d 65 20 5b 67 65 74 42 69 6e 61 72 79  eName [getBinary
5f90: 46 69 6c 65 4e 61 6d 65 20 24 66 69 6c 65 4e 61  FileName $fileNa
5fa0: 6d 65 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a  me]..      }....
5fb0: 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68        if {[catch
5fc0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
5fd0: 20 20 66 69 6c 65 20 63 6f 70 79 20 2d 66 6f 72    file copy -for
5fe0: 63 65 20 24 73 6f 75 72 63 65 46 69 6c 65 4e 61  ce $sourceFileNa
5ff0: 6d 65 20 24 74 61 72 67 65 74 46 69 6c 65 4e 61  me $targetFileNa
6000: 6d 65 7d 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20  me}] == 0} then 
6010: 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73  {..        tputs
6020: 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
6030: 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
6040: 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
6050: 2d 20 63 6f 70 69 65 64 20 62 75 69 6c 64 20 66  - copied build f
6060: 69 6c 65 20 66 72 6f 6d 20 5c 22 22 20 24 73 6f  ile from \"" $so
6070: 75 72 63 65 46 69 6c 65 4e 61 6d 65 20 22 5c 22  urceFileName "\"
6080: 20 74 6f 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20   to \"" \..     
6090: 20 20 20 20 20 20 20 24 74 61 72 67 65 74 46 69         $targetFi
60a0: 6c 65 4e 61 6d 65 20 5c 22 5c 6e 5d 0d 0a 20 20  leName \"\n]..  
60b0: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
60c0: 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
60d0: 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70  est_channel [app
60e0: 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
60f0: 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 66 61 69         "---- fai
6100: 6c 65 64 20 74 6f 20 63 6f 70 79 20 62 75 69 6c  led to copy buil
6110: 64 20 66 69 6c 65 20 66 72 6f 6d 20 5c 22 22 20  d file from \"" 
6120: 24 73 6f 75 72 63 65 46 69 6c 65 4e 61 6d 65 20  $sourceFileName 
6130: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22  \..            "
6140: 5c 22 20 74 6f 20 5c 22 22 20 24 74 61 72 67 65  \" to \"" $targe
6150: 74 46 69 6c 65 4e 61 6d 65 20 5c 22 5c 6e 5d 0d  tFileName \"\n].
6160: 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d  .      }..    }.
6170: 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 74 72 79  ....    proc try
6180: 44 65 6c 65 74 65 42 69 6e 61 72 79 46 69 6c 65  DeleteBinaryFile
6190: 20 7b 20 66 69 6c 65 4e 61 6d 65 20 7d 20 7b 0d   { fileName } {.
61a0: 0a 20 20 20 20 20 20 73 65 74 20 66 69 6c 65 4e  .      set fileN
61b0: 61 6d 65 20 5b 67 65 74 42 69 6e 61 72 79 46 69  ame [getBinaryFi
61c0: 6c 65 4e 61 6d 65 20 24 66 69 6c 65 4e 61 6d 65  leName $fileName
61d0: 5d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 21  ]....      if {!
61e0: 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24 66 69  [file exists $fi
61f0: 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d  leName]} then {.
6200: 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24  .        tputs $
6210: 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b  ::test_channel [
6220: 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
6230: 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
6240: 73 6b 69 70 70 65 64 20 64 65 6c 65 74 69 6e 67  skipped deleting
6250: 20 62 69 6e 61 72 79 20 66 69 6c 65 20 5c 22 22   binary file \""
6260: 20 24 66 69 6c 65 4e 61 6d 65 20 5c 0d 0a 20 20   $fileName \..  
6270: 20 20 20 20 20 20 20 20 20 20 22 5c 22 2c 20 69            "\", i
6280: 74 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74  t does not exist
6290: 5c 6e 22 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  \n"]....        
62a0: 72 65 74 75 72 6e 0d 0a 20 20 20 20 20 20 7d 0d  return..      }.
62b0: 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 63 61  ...      if {[ca
62c0: 74 63 68 20 7b 66 69 6c 65 20 64 65 6c 65 74 65  tch {file delete
62d0: 20 24 66 69 6c 65 4e 61 6d 65 7d 5d 20 3d 3d 20   $fileName}] == 
62e0: 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
62f0: 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
6300: 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  _channel [append
6310: 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
6320: 20 20 20 20 22 2d 2d 2d 2d 20 64 65 6c 65 74 65      "---- delete
6330: 64 20 62 69 6e 61 72 79 20 66 69 6c 65 20 5c 22  d binary file \"
6340: 22 20 24 66 69 6c 65 4e 61 6d 65 20 5c 22 5c 6e  " $fileName \"\n
6350: 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20  ]..      } else 
6360: 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73  {..        tputs
6370: 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
6380: 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
6390: 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
63a0: 2d 20 66 61 69 6c 65 64 20 74 6f 20 64 65 6c 65  - failed to dele
63b0: 74 65 20 62 69 6e 61 72 79 20 66 69 6c 65 20 5c  te binary file \
63c0: 22 22 20 24 66 69 6c 65 4e 61 6d 65 20 5c 22 5c  "" $fileName \"\
63d0: 6e 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20  n]..      }..   
63e0: 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
63f0: 74 72 79 44 65 6c 65 74 65 42 75 69 6c 64 46 69  tryDeleteBuildFi
6400: 6c 65 20 7b 20 66 69 6c 65 4e 61 6d 65 20 7d 20  le { fileName } 
6410: 7b 0d 0a 20 20 20 20 20 20 73 65 74 20 66 69 6c  {..      set fil
6420: 65 4e 61 6d 65 20 5b 67 65 74 42 75 69 6c 64 46  eName [getBuildF
6430: 69 6c 65 4e 61 6d 65 20 24 66 69 6c 65 4e 61 6d  ileName $fileNam
6440: 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b  e]....      if {
6450: 21 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24 66  ![file exists $f
6460: 69 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b  ileName]} then {
6470: 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20  ..        tputs 
6480: 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
6490: 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
64a0: 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
64b0: 20 73 6b 69 70 70 65 64 20 64 65 6c 65 74 69 6e   skipped deletin
64c0: 67 20 62 75 69 6c 64 20 66 69 6c 65 20 5c 22 22  g build file \""
64d0: 20 24 66 69 6c 65 4e 61 6d 65 20 5c 0d 0a 20 20   $fileName \..  
64e0: 20 20 20 20 20 20 20 20 20 20 22 5c 22 2c 20 69            "\", i
64f0: 74 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74  t does not exist
6500: 5c 6e 22 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  \n"]....        
6510: 72 65 74 75 72 6e 0d 0a 20 20 20 20 20 20 7d 0d  return..      }.
6520: 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 63 61  ...      if {[ca
6530: 74 63 68 20 7b 66 69 6c 65 20 64 65 6c 65 74 65  tch {file delete
6540: 20 24 66 69 6c 65 4e 61 6d 65 7d 5d 20 3d 3d 20   $fileName}] == 
6550: 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
6560: 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
6570: 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  _channel [append
6580: 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
6590: 20 20 20 20 22 2d 2d 2d 2d 20 64 65 6c 65 74 65      "---- delete
65a0: 64 20 62 75 69 6c 64 20 66 69 6c 65 20 5c 22 22  d build file \""
65b0: 20 24 66 69 6c 65 4e 61 6d 65 20 5c 22 5c 6e 5d   $fileName \"\n]
65c0: 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b  ..      } else {
65d0: 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20  ..        tputs 
65e0: 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
65f0: 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
6600: 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
6610: 20 66 61 69 6c 65 64 20 74 6f 20 64 65 6c 65 74   failed to delet
6620: 65 20 62 75 69 6c 64 20 66 69 6c 65 20 5c 22 22  e build file \""
6630: 20 24 66 69 6c 65 4e 61 6d 65 20 5c 22 5c 6e 5d   $fileName \"\n]
6640: 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d  ..      }..    }
6650: 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 74 72  .....    proc tr
6660: 79 43 6f 70 79 41 73 73 65 6d 62 6c 79 20 7b 20  yCopyAssembly { 
6670: 66 69 6c 65 4e 61 6d 65 20 7b 70 64 62 20 74 72  fileName {pdb tr
6680: 75 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 74  ue} } {..      t
6690: 72 79 43 6f 70 79 42 75 69 6c 64 46 69 6c 65 20  ryCopyBuildFile 
66a0: 24 66 69 6c 65 4e 61 6d 65 0d 0a 0d 0a 20 20 20  $fileName....   
66b0: 20 20 20 69 66 20 7b 24 70 64 62 7d 20 74 68 65     if {$pdb} the
66c0: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 72 79  n {..        try
66d0: 43 6f 70 79 42 75 69 6c 64 46 69 6c 65 20 5b 61  CopyBuildFile [a
66e0: 70 70 65 6e 64 41 72 67 73 20 5b 66 69 6c 65 20  ppendArgs [file 
66f0: 72 6f 6f 74 6e 61 6d 65 20 24 66 69 6c 65 4e 61  rootname $fileNa
6700: 6d 65 5d 20 2e 70 64 62 5d 0d 0a 20 20 20 20 20  me] .pdb]..     
6710: 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20   }..    }.....  
6720: 20 20 70 72 6f 63 20 74 72 79 44 65 6c 65 74 65    proc tryDelete
6730: 41 73 73 65 6d 62 6c 79 20 7b 20 66 69 6c 65 4e  Assembly { fileN
6740: 61 6d 65 20 7b 70 64 62 20 74 72 75 65 7d 20 7d  ame {pdb true} }
6750: 20 7b 0d 0a 20 20 20 20 20 20 74 72 79 44 65 6c   {..      tryDel
6760: 65 74 65 42 69 6e 61 72 79 46 69 6c 65 20 24 66  eteBinaryFile $f
6770: 69 6c 65 4e 61 6d 65 0d 0a 0d 0a 20 20 20 20 20  ileName....     
6780: 20 69 66 20 7b 24 70 64 62 7d 20 74 68 65 6e 20   if {$pdb} then 
6790: 7b 0d 0a 20 20 20 20 20 20 20 20 74 72 79 44 65  {..        tryDe
67a0: 6c 65 74 65 42 69 6e 61 72 79 46 69 6c 65 20 5b  leteBinaryFile [
67b0: 61 70 70 65 6e 64 41 72 67 73 20 5b 66 69 6c 65  appendArgs [file
67c0: 20 72 6f 6f 74 6e 61 6d 65 20 24 66 69 6c 65 4e   rootname $fileN
67d0: 61 6d 65 5d 20 2e 70 64 62 5d 0d 0a 20 20 20 20  ame] .pdb]..    
67e0: 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20    }..    }..... 
67f0: 20 20 20 70 72 6f 63 20 74 72 79 4c 6f 61 64 41     proc tryLoadA
6800: 73 73 65 6d 62 6c 79 20 7b 20 66 69 6c 65 4e 61  ssembly { fileNa
6810: 6d 65 20 7d 20 7b 0d 0a 20 20 20 20 20 20 73 65  me } {..      se
6820: 74 20 66 69 6c 65 4e 61 6d 65 20 5b 67 65 74 42  t fileName [getB
6830: 69 6e 61 72 79 46 69 6c 65 4e 61 6d 65 20 24 66  inaryFileName $f
6840: 69 6c 65 4e 61 6d 65 5d 0d 0a 0d 0a 20 20 20 20  ileName]....    
6850: 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 73 65    if {[catch {se
6860: 74 20 61 73 73 65 6d 62 6c 79 20 5c 0d 0a 20 20  t assembly \..  
6870: 20 20 20 20 20 20 20 20 20 20 20 20 5b 6f 62 6a              [obj
6880: 65 63 74 20 6c 6f 61 64 20 2d 6c 6f 61 64 74 79  ect load -loadty
6890: 70 65 20 46 69 6c 65 20 2d 61 6c 69 61 73 20 24  pe File -alias $
68a0: 66 69 6c 65 4e 61 6d 65 5d 7d 5d 20 3d 3d 20 30  fileName]}] == 0
68b0: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
68c0: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
68d0: 4f 54 45 3a 20 4e 6f 77 2c 20 61 64 64 20 74 68  OTE: Now, add th
68e0: 65 20 6e 65 63 65 73 73 61 72 79 20 74 65 73 74  e necessary test
68f0: 20 63 6f 6e 73 74 72 61 69 6e 74 2e 0d 0a 20 20   constraint...  
6900: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
6910: 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 5b   addConstraint [
6920: 66 69 6c 65 20 72 6f 6f 74 6e 61 6d 65 20 5b 66  file rootname [f
6930: 69 6c 65 20 74 61 69 6c 20 24 66 69 6c 65 4e 61  ile tail $fileNa
6940: 6d 65 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  me]]....        
6950: 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
6960: 45 3a 20 47 72 61 62 20 74 68 65 20 69 6d 61 67  E: Grab the imag
6970: 65 20 72 75 6e 74 69 6d 65 20 76 65 72 73 69 6f  e runtime versio
6980: 6e 20 66 72 6f 6d 20 74 68 65 20 61 73 73 65 6d  n from the assem
6990: 62 6c 79 20 62 65 63 61 75 73 65 0d 0a 20 20 20  bly because..   
69a0: 20 20 20 20 20 23 20 20 20 20 20 20 20 73 65 76       #       sev
69b0: 65 72 61 6c 20 74 65 73 74 73 20 72 65 6c 79 20  eral tests rely 
69c0: 6f 6e 20 69 74 20 68 61 76 69 6e 67 20 61 20 63  on it having a c
69d0: 65 72 74 61 69 6e 20 76 61 6c 75 65 2e 0d 0a 20  ertain value... 
69e0: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
69f0: 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20    addConstraint 
6a00: 5b 61 70 70 65 6e 64 41 72 67 73 20 5b 66 69 6c  [appendArgs [fil
6a10: 65 20 74 61 69 6c 20 24 66 69 6c 65 4e 61 6d 65  e tail $fileName
6a20: 5d 20 5f 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ] _ \..         
6a30: 20 20 20 5b 24 61 73 73 65 6d 62 6c 79 20 49 6d     [$assembly Im
6a40: 61 67 65 52 75 6e 74 69 6d 65 56 65 72 73 69 6f  ageRuntimeVersio
6a50: 6e 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23  n]]....        #
6a60: 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
6a70: 3a 20 52 65 74 75 72 6e 20 74 68 65 20 66 75 6c  : Return the ful
6a80: 6c 20 70 61 74 68 20 6f 66 20 74 68 65 20 6c 6f  l path of the lo
6a90: 61 64 65 64 20 66 69 6c 65 2e 0d 0a 20 20 20 20  aded file...    
6aa0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72      #..        r
6ab0: 65 74 75 72 6e 20 24 66 69 6c 65 4e 61 6d 65 0d  eturn $fileName.
6ac0: 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
6ad0: 20 20 72 65 74 75 72 6e 20 22 22 0d 0a 20 20 20    return ""..   
6ae0: 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
6af0: 69 73 53 51 4c 69 74 65 52 65 61 64 79 20 7b 7d  isSQLiteReady {}
6b00: 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20   {..      #..   
6b10: 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 69 73 20     # NOTE: This 
6b20: 70 72 6f 63 65 64 75 72 65 20 6d 75 73 74 20 72  procedure must r
6b30: 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 6f  eturn non-zero o
6b40: 6e 6c 79 20 69 66 20 74 68 65 20 53 51 4c 69 74  nly if the SQLit
6b50: 65 20 6e 61 74 69 76 65 0d 0a 20 20 20 20 20 20  e native..      
6b60: 23 20 20 20 20 20 20 20 6c 69 62 72 61 72 79 20  #       library 
6b70: 61 6e 64 20 74 68 65 20 53 79 73 74 65 6d 2e 44  and the System.D
6b80: 61 74 61 2e 53 51 4c 69 74 65 20 6d 61 6e 61 67  ata.SQLite manag
6b90: 65 64 20 61 73 73 65 6d 62 6c 79 20 61 72 65 20  ed assembly are 
6ba0: 6c 6f 61 64 65 64 0d 0a 20 20 20 20 20 20 23 20  loaded..      # 
6bb0: 20 20 20 20 20 20 61 6e 64 20 72 65 61 64 79 20        and ready 
6bc0: 66 6f 72 20 75 73 65 20 62 79 20 74 68 65 20 74  for use by the t
6bd0: 65 73 74 20 73 75 69 74 65 2e 20 20 43 75 72 72  est suite.  Curr
6be0: 65 6e 74 6c 79 2c 20 74 68 69 73 20 70 72 6f 63  ently, this proc
6bf0: 65 64 75 72 65 0d 0a 20 20 20 20 20 20 23 20 20  edure..      #  
6c00: 20 20 20 20 20 73 68 6f 75 6c 64 20 62 65 20 63       should be c
6c10: 61 6c 6c 65 64 20 6f 6e 6c 79 20 61 66 74 65 72  alled only after
6c20: 20 74 68 65 20 5b 74 72 79 4c 6f 61 64 41 73 73   the [tryLoadAss
6c30: 65 6d 62 6c 79 5d 20 70 72 6f 63 65 64 75 72 65  embly] procedure
6c40: 20 68 61 73 0d 0a 20 20 20 20 20 20 23 20 20 20   has..      #   
6c50: 20 20 20 20 62 65 65 6e 20 63 61 6c 6c 65 64 20      been called 
6c60: 74 6f 20 70 72 6f 62 65 20 66 6f 72 20 74 68 65  to probe for the
6c70: 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c   System.Data.SQL
6c80: 69 74 65 20 6d 61 6e 61 67 65 64 20 61 73 73 65  ite managed asse
6c90: 6d 62 6c 79 0d 0a 20 20 20 20 20 20 23 20 20 20  mbly..      #   
6ca0: 20 20 20 20 61 6e 64 20 74 68 65 20 5b 63 68 65      and the [che
6cb0: 63 6b 46 6f 72 53 51 4c 69 74 65 5d 20 70 72 6f  ckForSQLite] pro
6cc0: 63 65 64 75 72 65 20 68 61 73 20 62 65 65 6e 20  cedure has been 
6cd0: 63 61 6c 6c 65 64 20 74 6f 20 70 72 6f 62 65 20  called to probe 
6ce0: 66 6f 72 0d 0a 20 20 20 20 20 20 23 20 20 20 20  for..      #    
6cf0: 20 20 20 74 68 65 20 53 51 4c 69 74 65 20 6e 61     the SQLite na
6d00: 74 69 76 65 20 6c 69 62 72 61 72 79 3b 20 6f 74  tive library; ot
6d10: 68 65 72 77 69 73 65 2c 20 74 68 69 73 20 70 72  herwise, this pr
6d20: 6f 63 65 64 75 72 65 20 77 69 6c 6c 20 73 69 6d  ocedure will sim
6d30: 70 6c 79 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ply..      #    
6d40: 20 20 20 61 6c 77 61 79 73 20 72 65 74 75 72 6e     always return
6d50: 20 7a 65 72 6f 2e 0d 0a 20 20 20 20 20 20 23 0d   zero...      #.
6d60: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b 65  .      return [e
6d70: 78 70 72 20 7b 5b 68 61 76 65 43 6f 6e 73 74 72  xpr {[haveConstr
6d80: 61 69 6e 74 20 53 79 73 74 65 6d 2e 44 61 74 61  aint System.Data
6d90: 2e 53 51 4c 69 74 65 5d 20 26 26 20 5c 0d 0a 20  .SQLite] && \.. 
6da0: 20 20 20 20 20 20 20 20 20 5b 68 61 76 65 43 6f           [haveCo
6db0: 6e 73 74 72 61 69 6e 74 20 53 51 4c 69 74 65 5d  nstraint SQLite]
6dc0: 7d 5d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20  }]..    }.....  
6dd0: 20 20 70 72 6f 63 20 6d 61 74 63 68 4d 61 63 68    proc matchMach
6de0: 69 6e 65 20 7b 20 70 6c 61 74 66 6f 72 6d 20 7d  ine { platform }
6df0: 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20   {..      #..   
6e00: 20 20 20 23 20 4e 4f 54 45 3a 20 41 6e 20 65 6d     # NOTE: An em
6e10: 70 74 79 20 73 74 72 69 6e 67 20 66 6f 72 20 74  pty string for t
6e20: 68 65 20 70 6c 61 74 66 6f 72 6d 20 6d 65 61 6e  he platform mean
6e30: 73 20 74 68 61 74 20 74 68 65 20 62 75 69 6c 64  s that the build
6e40: 20 69 73 20 6e 6f 74 0d 0a 20 20 20 20 20 20 23   is not..      #
6e50: 20 20 20 20 20 20 20 5b 70 72 69 6d 61 72 69 6c         [primaril
6e60: 79 5d 20 61 20 6e 61 74 69 76 65 20 62 75 69 6c  y] a native buil
6e70: 64 3b 20 74 68 65 72 65 66 6f 72 65 2c 20 69 74  d; therefore, it
6e80: 20 61 6c 77 61 79 73 20 6d 61 74 63 68 65 73 2e   always matches.
6e90: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
6ea0: 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e   if {[string len
6eb0: 67 74 68 20 24 70 6c 61 74 66 6f 72 6d 5d 20 3d  gth $platform] =
6ec0: 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  = 0} then {..   
6ed0: 20 20 20 20 20 72 65 74 75 72 6e 20 74 72 75 65       return true
6ee0: 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
6ef0: 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
6f00: 54 45 3a 20 44 6f 65 73 20 74 68 65 20 73 70 65  TE: Does the spe
6f10: 63 69 66 69 65 64 20 70 6c 61 74 66 6f 72 6d 20  cified platform 
6f20: 6d 61 74 63 68 20 75 70 20 74 6f 20 74 68 65 20  match up to the 
6f30: 63 75 72 72 65 6e 74 20 70 72 6f 63 65 73 73 3f  current process?
6f40: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
6f50: 20 69 66 20 7b 24 70 6c 61 74 66 6f 72 6d 20 65   if {$platform e
6f60: 71 20 5b 6d 61 63 68 69 6e 65 54 6f 50 6c 61 74  q [machineToPlat
6f70: 66 6f 72 6d 20 24 3a 3a 74 63 6c 5f 70 6c 61 74  form $::tcl_plat
6f80: 66 6f 72 6d 28 6d 61 63 68 69 6e 65 29 5d 7d 20  form(machine)]} 
6f90: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
6fa0: 72 65 74 75 72 6e 20 74 72 75 65 0d 0a 20 20 20  return true..   
6fb0: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d     }....      #.
6fc0: 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54  .      # NOTE: T
6fd0: 68 65 20 73 70 65 63 69 66 69 65 64 20 70 6c 61  he specified pla
6fe0: 74 66 6f 72 6d 20 64 6f 65 73 20 6e 6f 74 20 6d  tform does not m
6ff0: 61 74 63 68 20 75 70 20 77 69 74 68 20 74 68 65  atch up with the
7000: 20 70 6c 61 74 66 6f 72 6d 0d 0a 20 20 20 20 20   platform..     
7010: 20 23 20 20 20 20 20 20 20 66 6f 72 20 74 68 65   #       for the
7020: 20 63 75 72 72 65 6e 74 20 70 72 6f 63 65 73 73   current process
7030: 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
7040: 20 20 72 65 74 75 72 6e 20 66 61 6c 73 65 0d 0a    return false..
7050: 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
7060: 6f 63 20 63 68 65 63 6b 46 6f 72 53 51 4c 69 74  oc checkForSQLit
7070: 65 42 75 69 6c 64 73 20 7b 20 63 68 61 6e 6e 65  eBuilds { channe
7080: 6c 20 7b 73 65 6c 65 63 74 20 66 61 6c 73 65 7d  l {select false}
7090: 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20   } {..      #.. 
70a0: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68 65       # NOTE: Che
70b0: 63 6b 20 66 6f 72 20 65 76 65 72 79 20 70 6f 73  ck for every pos
70c0: 73 69 62 6c 65 20 76 61 6c 69 64 20 63 6f 6d 62  sible valid comb
70d0: 69 6e 61 74 69 6f 6e 20 6f 66 20 76 61 6c 75 65  ination of value
70e0: 73 20 75 73 65 64 20 77 68 65 6e 0d 0a 20 20 20  s used when..   
70f0: 20 20 20 23 20 20 20 20 20 20 20 6c 6f 63 61 74     #       locat
7100: 69 6e 67 20 6f 75 74 20 74 68 65 20 62 75 69 6c  ing out the buil
7110: 64 20 6f 75 74 70 75 74 20 64 69 72 65 63 74 6f  d output directo
7120: 72 79 2c 20 73 68 6f 77 69 6e 67 20 65 61 63 68  ry, showing each
7130: 20 61 76 61 69 6c 61 62 6c 65 0d 0a 20 20 20 20   available..    
7140: 20 20 23 20 20 20 20 20 20 20 62 75 69 6c 64 20    #       build 
7150: 76 61 72 69 61 74 69 6f 6e 20 61 6c 6f 6e 67 20  variation along 
7160: 74 68 65 20 77 61 79 2e 0d 0a 20 20 20 20 20 20  the way...      
7170: 23 0d 0a 20 20 20 20 20 20 66 6f 72 65 61 63 68  #..      foreach
7180: 20 6e 61 74 69 76 65 20 5b 6c 69 73 74 20 66 61   native [list fa
7190: 6c 73 65 20 74 72 75 65 5d 20 7b 0d 0a 20 20 20  lse true] {..   
71a0: 20 20 20 20 20 66 6f 72 65 61 63 68 20 79 65 61       foreach yea
71b0: 72 20 5b 67 65 74 42 75 69 6c 64 59 65 61 72 73  r [getBuildYears
71c0: 5d 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 66  ] {..          f
71d0: 6f 72 65 61 63 68 20 63 6f 6e 66 69 67 75 72 61  oreach configura
71e0: 74 69 6f 6e 20 5b 67 65 74 42 75 69 6c 64 43 6f  tion [getBuildCo
71f0: 6e 66 69 67 75 72 61 74 69 6f 6e 73 5d 20 7b 0d  nfigurations] {.
7200: 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a  .            #..
7210: 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f              # NO
7220: 54 45 3a 20 46 69 67 75 72 65 20 6f 75 74 20 74  TE: Figure out t
7230: 68 65 20 65 66 66 65 63 74 69 76 65 20 62 75 69  he effective bui
7240: 6c 64 20 70 6c 61 74 66 6f 72 6d 2e 20 20 54 68  ld platform.  Th
7250: 69 73 20 69 73 0d 0a 20 20 20 20 20 20 20 20 20  is is..         
7260: 20 20 20 23 20 20 20 20 20 20 20 62 61 73 65 64     #       based
7270: 20 6f 6e 20 77 68 65 74 68 65 72 20 6f 72 20 6e   on whether or n
7280: 6f 74 20 61 20 5b 70 72 69 6d 61 72 69 6c 79 5d  ot a [primarily]
7290: 20 6e 61 74 69 76 65 20 62 75 69 6c 64 0d 0a 20   native build.. 
72a0: 20 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20             #    
72b0: 20 20 20 69 73 20 62 65 69 6e 67 20 75 73 65 64     is being used
72c0: 2e 20 20 46 6f 72 20 5b 70 72 69 6d 61 72 69 6c  .  For [primaril
72d0: 79 5d 20 6e 6f 6e 2d 6e 61 74 69 76 65 20 62 75  y] non-native bu
72e0: 69 6c 64 73 2c 0d 0a 20 20 20 20 20 20 20 20 20  ilds,..         
72f0: 20 20 20 23 20 20 20 20 20 20 20 74 68 69 73 20     #       this 
7300: 77 69 6c 6c 20 62 65 20 61 6e 20 65 6d 70 74 79  will be an empty
7310: 20 73 74 72 69 6e 67 2e 0d 0a 20 20 20 20 20 20   string...      
7320: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
7330: 20 20 20 20 20 73 65 74 20 70 6c 61 74 66 6f 72       set platfor
7340: 6d 20 5b 67 65 74 42 75 69 6c 64 50 6c 61 74 66  m [getBuildPlatf
7350: 6f 72 6d 20 24 6e 61 74 69 76 65 5d 0d 0a 0d 0a  orm $native]....
7360: 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
7370: 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  s $channel [appe
7380: 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
7390: 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
73a0: 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 53 79 73  checking for Sys
73b0: 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 20  tem.Data.SQLite 
73c0: 62 75 69 6c 64 20 5c 22 22 20 5b 65 78 70 72 20  build \"" [expr 
73d0: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
73e0: 20 20 20 7b 24 6e 61 74 69 76 65 20 3f 20 22 6e     {$native ? "n
73f0: 61 74 69 76 65 2f 22 20 3a 20 22 22 7d 5d 20 5b  ative/" : ""}] [
7400: 65 78 70 72 20 7b 5b 73 74 72 69 6e 67 20 6c 65  expr {[string le
7410: 6e 67 74 68 20 5c 0d 0a 20 20 20 20 20 20 20 20  ngth \..        
7420: 20 20 20 20 20 20 20 20 24 70 6c 61 74 66 6f 72          $platfor
7430: 6d 5d 20 3e 20 30 20 3f 20 5b 61 70 70 65 6e 64  m] > 0 ? [append
7440: 41 72 67 73 20 24 70 6c 61 74 66 6f 72 6d 20 2f  Args $platform /
7450: 5d 20 3a 20 22 22 7d 5d 20 24 79 65 61 72 20 5c  ] : ""}] $year \
7460: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
7470: 20 20 2f 20 24 63 6f 6e 66 69 67 75 72 61 74 69    / $configurati
7480: 6f 6e 20 22 5c 22 2e 2e 2e 20 22 5d 0d 0a 0d 0a  on "\"... "]....
7490: 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20              #.. 
74a0: 20 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54             # NOT
74b0: 45 3a 20 42 75 69 6c 64 20 74 68 65 20 66 75 6c  E: Build the ful
74c0: 6c 79 20 71 75 61 6c 69 66 69 65 64 20 66 69 6c  ly qualified fil
74d0: 65 20 6e 61 6d 65 20 66 6f 72 20 74 68 65 20 70  e name for the p
74e0: 72 69 6d 61 72 79 0d 0a 20 20 20 20 20 20 20 20  rimary..        
74f0: 20 20 20 20 23 20 20 20 20 20 20 20 61 73 73 65      #       asse
7500: 6d 62 6c 79 20 63 6f 6e 74 61 69 6e 69 6e 67 20  mbly containing 
7510: 74 68 65 20 53 79 73 74 65 6d 2e 44 61 74 61 2e  the System.Data.
7520: 53 51 4c 69 74 65 20 6d 61 6e 61 67 65 64 0d 0a  SQLite managed..
7530: 20 20 20 20 20 20 20 20 20 20 20 20 23 20 20 20              #   
7540: 20 20 20 20 63 6f 6d 70 6f 6e 65 6e 74 73 2e 20      components. 
7550: 20 49 74 20 73 68 6f 75 6c 64 20 62 65 20 6e 6f   It should be no
7560: 74 65 64 20 74 68 61 74 20 74 68 69 73 20 61 73  ted that this as
7570: 73 65 6d 62 6c 79 0d 0a 20 20 20 20 20 20 20 20  sembly..        
7580: 20 20 20 20 23 20 20 20 20 20 20 20 66 69 6c 65      #       file
7590: 20 6d 61 79 20 61 6c 73 6f 20 63 6f 6e 74 61 69   may also contai
75a0: 6e 20 74 68 65 20 6e 61 74 69 76 65 20 63 6f 6d  n the native com
75b0: 70 6f 6e 65 6e 74 73 2c 20 69 66 20 61 0d 0a 20  ponents, if a.. 
75c0: 20 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20             #    
75d0: 20 20 20 6e 61 74 69 76 65 20 62 75 69 6c 64 20     native build 
75e0: 69 73 20 69 6e 20 75 73 65 2e 0d 0a 20 20 20 20  is in use...    
75f0: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
7600: 20 20 20 20 20 20 20 73 65 74 20 66 69 6c 65 4e         set fileN
7610: 61 6d 65 20 5b 66 69 6c 65 20 6e 61 74 69 76 65  ame [file native
7620: 6e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20  name [file join 
7630: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
7640: 20 20 20 5b 6a 6f 69 6e 42 75 69 6c 64 44 69 72     [joinBuildDir
7650: 65 63 74 6f 72 79 20 24 6e 61 74 69 76 65 20 5b  ectory $native [
7660: 67 65 74 42 75 69 6c 64 42 61 73 65 44 69 72 65  getBuildBaseDire
7670: 63 74 6f 72 79 5d 20 24 79 65 61 72 20 5c 0d 0a  ctory] $year \..
7680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7690: 24 70 6c 61 74 66 6f 72 6d 20 24 63 6f 6e 66 69  $platform $confi
76a0: 67 75 72 61 74 69 6f 6e 5d 20 53 79 73 74 65 6d  guration] System
76b0: 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 64 6c 6c  .Data.SQLite.dll
76c0: 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  ]]....          
76d0: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20    #..           
76e0: 20 23 20 4e 4f 54 45 3a 20 44 6f 65 73 20 74 68   # NOTE: Does th
76f0: 65 20 66 69 6c 65 20 65 78 69 73 74 3f 20 20 43  e file exist?  C
7700: 75 72 72 65 6e 74 6c 79 2c 20 6e 6f 20 6f 74 68  urrently, no oth
7710: 65 72 20 73 74 65 70 73 20 61 72 65 0d 0a 20 20  er steps are..  
7720: 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20            #     
7730: 20 20 74 61 6b 65 6e 20 74 6f 20 76 65 72 69 66    taken to verif
7740: 79 20 74 68 69 73 20 62 75 69 6c 64 20 69 73 20  y this build is 
7750: 61 63 74 75 61 6c 6c 79 20 76 69 61 62 6c 65 2e  actually viable.
7760: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 0d  ..            #.
7770: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20  .            if 
7780: 7b 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24 66  {[file exists $f
7790: 69 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b  ileName]} then {
77a0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
77b0: 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  #..             
77c0: 20 23 20 4e 4f 54 45 3a 20 57 68 65 6e 20 69 6e   # NOTE: When in
77d0: 20 22 73 65 6c 65 63 74 22 20 6d 6f 64 65 2c 20   "select" mode, 
77e0: 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 73 65  automatically se
77f0: 6c 65 63 74 20 74 68 65 20 66 69 72 73 74 0d 0a  lect the first..
7800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20                # 
7810: 20 20 20 20 20 20 61 76 61 69 6c 61 62 6c 65 20        available 
7820: 62 75 69 6c 64 20 6f 66 20 53 79 73 74 65 6d 2e  build of System.
7830: 44 61 74 61 2e 53 51 4c 69 74 65 20 61 6e 64 20  Data.SQLite and 
7840: 74 68 65 6e 20 72 65 74 75 72 6e 0d 0a 20 20 20  then return..   
7850: 20 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20             #    
7860: 20 20 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 0d     immediately..
7870: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23  .              #
7880: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
7890: 69 66 20 7b 24 73 65 6c 65 63 74 20 26 26 20 5b  if {$select && [
78a0: 6d 61 74 63 68 4d 61 63 68 69 6e 65 20 24 70 6c  matchMachine $pl
78b0: 61 74 66 6f 72 6d 5d 7d 20 74 68 65 6e 20 7b 0d  atform]} then {.
78c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
78d0: 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   #..            
78e0: 20 20 20 20 23 20 4e 4f 54 45 3a 20 4d 61 6e 75      # NOTE: Manu
78f0: 61 6c 6c 79 20 6f 76 65 72 72 69 64 65 20 61 6c  ally override al
7900: 6c 20 74 68 65 20 62 75 69 6c 64 20 64 69 72 65  l the build dire
7910: 63 74 6f 72 79 20 73 65 6c 65 63 74 69 6f 6e 0d  ctory selection.
7920: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
7930: 20 23 20 20 20 20 20 20 20 72 65 6c 61 74 65 64   #       related
7940: 20 74 65 73 74 20 73 65 74 74 69 6e 67 73 20 69   test settings i
7950: 6e 20 6f 72 64 65 72 20 74 6f 20 66 6f 72 63 65  n order to force
7960: 20 74 68 69 73 20 62 75 69 6c 64 0d 0a 20 20 20   this build..   
7970: 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20 20               #  
7980: 20 20 20 20 20 6f 66 20 53 79 73 74 65 6d 2e 44       of System.D
7990: 61 74 61 2e 53 51 4c 69 74 65 20 74 6f 20 62 65  ata.SQLite to be
79a0: 20 75 73 65 64 2e 0d 0a 20 20 20 20 20 20 20 20   used...        
79b0: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
79c0: 20 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63             objec
79d0: 74 20 69 6e 76 6f 6b 65 20 49 6e 74 65 72 70 72  t invoke Interpr
79e0: 65 74 65 72 2e 47 65 74 41 63 74 69 76 65 20 5b  eter.GetActive [
79f0: 65 78 70 72 20 7b 24 6e 61 74 69 76 65 20 3f 20  expr {$native ? 
7a00: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
7a10: 20 20 20 20 20 20 20 22 41 64 64 52 75 6e 74 69         "AddRunti
7a20: 6d 65 4f 70 74 69 6f 6e 22 20 3a 20 22 52 65 6d  meOption" : "Rem
7a30: 6f 76 65 52 75 6e 74 69 6d 65 4f 70 74 69 6f 6e  oveRuntimeOption
7a40: 22 7d 5d 20 20 6e 61 74 69 76 65 0d 0a 0d 0a 20  "}]  native.... 
7a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
7a60: 65 74 20 3a 3a 74 65 73 74 5f 79 65 61 72 20 24  et ::test_year $
7a70: 79 65 61 72 0d 0a 20 20 20 20 20 20 20 20 20 20  year..          
7a80: 20 20 20 20 20 20 73 65 74 20 3a 3a 74 65 73 74        set ::test
7a90: 5f 70 6c 61 74 66 6f 72 6d 20 24 70 6c 61 74 66  _platform $platf
7aa0: 6f 72 6d 0d 0a 20 20 20 20 20 20 20 20 20 20 20  orm..           
7ab0: 20 20 20 20 20 73 65 74 20 3a 3a 74 65 73 74 5f       set ::test_
7ac0: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 24 63  configuration $c
7ad0: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 0d 0a 0d 0a  onfiguration....
7ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7af0: 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b  tputs $channel [
7b00: 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
7b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7b20: 20 20 22 79 65 73 2c 20 73 65 6c 65 63 74 65 64    "yes, selected
7b30: 20 28 22 20 5b 65 78 70 72 20 7b 24 6e 61 74 69   (" [expr {$nati
7b40: 76 65 20 3f 20 22 6e 61 74 69 76 65 2f 22 20 3a  ve ? "native/" :
7b50: 20 22 22 7d 5d 20 5c 0d 0a 20 20 20 20 20 20 20   ""}] \..       
7b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 65 78               [ex
7b70: 70 72 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67  pr {[string leng
7b80: 74 68 20 24 70 6c 61 74 66 6f 72 6d 5d 20 3e 20  th $platform] > 
7b90: 30 20 3f 20 5b 61 70 70 65 6e 64 41 72 67 73 20  0 ? [appendArgs 
7ba0: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
7bb0: 20 20 20 20 20 20 20 24 70 6c 61 74 66 6f 72 6d         $platform
7bc0: 20 2f 5d 20 3a 20 22 22 7d 5d 20 24 79 65 61 72   /] : ""}] $year
7bd0: 20 2f 20 24 63 6f 6e 66 69 67 75 72 61 74 69 6f   / $configuratio
7be0: 6e 20 22 29 5c 6e 22 5d 0d 0a 0d 0a 20 20 20 20  n ")\n"]....    
7bf0: 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
7c00: 72 6e 20 74 72 75 65 0d 0a 20 20 20 20 20 20 20  rn true..       
7c10: 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d         } else {.
7c20: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
7c30: 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
7c40: 79 65 73 5c 6e 0d 0a 20 20 20 20 20 20 20 20 20  yes\n..         
7c50: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
7c60: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
7c70: 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
7c80: 73 20 24 63 68 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d  s $channel no\n.
7c90: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  .            }..
7ca0: 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
7cb0: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d       }..      }.
7cc0: 0a 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ...      return 
7cd0: 66 61 6c 73 65 0d 0a 20 20 20 20 7d 0d 0a 0c 0d  false..    }....
7ce0: 0a 20 20 20 20 70 72 6f 63 20 63 68 65 63 6b 46  .    proc checkF
7cf0: 6f 72 53 51 4c 69 74 65 52 65 6c 65 61 73 65 73  orSQLiteReleases
7d00: 20 7b 20 63 68 61 6e 6e 65 6c 20 7b 73 65 6c 65   { channel {sele
7d10: 63 74 20 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a 20  ct false} } {.. 
7d20: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
7d30: 4e 4f 54 45 3a 20 43 68 65 63 6b 20 66 6f 72 20  NOTE: Check for 
7d40: 70 61 73 74 20 72 65 6c 65 61 73 65 73 20 6f 66  past releases of
7d50: 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c   System.Data.SQL
7d60: 69 74 65 20 69 6e 20 74 68 65 20 64 69 72 65 63  ite in the direc
7d70: 74 6f 72 79 0d 0a 20 20 20 20 20 20 23 20 20 20  tory..      #   
7d80: 20 20 20 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e      contained in
7d90: 20 74 68 65 20 22 53 79 73 74 65 6d 2e 44 61 74   the "System.Dat
7da0: 61 2e 53 51 4c 69 74 65 22 20 65 6e 76 69 72 6f  a.SQLite" enviro
7db0: 6e 6d 65 6e 74 20 76 61 72 69 61 62 6c 65 2c 20  nment variable, 
7dc0: 69 66 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  if..      #     
7dd0: 20 20 70 72 65 73 65 6e 74 2e 0d 0a 20 20 20 20    present...    
7de0: 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b    #..      if {[
7df0: 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 65 6e  info exists ::en
7e00: 76 28 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51  v(System.Data.SQ
7e10: 4c 69 74 65 29 5d 20 26 26 20 5c 0d 0a 20 20 20  Lite)] && \..   
7e20: 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c         [string l
7e30: 65 6e 67 74 68 20 24 3a 3a 65 6e 76 28 53 79 73  ength $::env(Sys
7e40: 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 29  tem.Data.SQLite)
7e50: 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20  ] > 0} then {.. 
7e60: 20 20 20 20 20 20 20 73 65 74 20 64 69 72 65 63         set direc
7e70: 74 6f 72 79 20 24 3a 3a 65 6e 76 28 53 79 73 74  tory $::env(Syst
7e80: 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 29 0d  em.Data.SQLite).
7e90: 0a 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 66  ...        set f
7ea0: 69 6c 65 4e 61 6d 65 20 5b 66 69 6c 65 20 6e 61  ileName [file na
7eb0: 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c 65 20 6a  tivename [file j
7ec0: 6f 69 6e 20 24 64 69 72 65 63 74 6f 72 79 20 5c  oin $directory \
7ed0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 53 79  ..            Sy
7ee0: 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
7ef0: 2e 64 6c 6c 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20  .dll]]....      
7f00: 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
7f10: 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
7f20: 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
7f30: 2d 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 53  - checking for S
7f40: 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
7f50: 65 20 72 65 6c 65 61 73 65 20 5c 22 22 20 5c 0d  e release \"" \.
7f60: 0a 20 20 20 20 20 20 20 20 20 20 20 20 24 66 69  .            $fi
7f70: 6c 65 4e 61 6d 65 20 22 5c 22 2e 2e 2e 20 22 5d  leName "\"... "]
7f80: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b  ....        if {
7f90: 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24 66 69  [file exists $fi
7fa0: 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d  leName]} then {.
7fb0: 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 24  .          if {$
7fc0: 73 65 6c 65 63 74 7d 20 74 68 65 6e 20 7b 0d 0a  select} then {..
7fd0: 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20              set 
7fe0: 3a 3a 62 75 69 6c 64 5f 64 69 72 65 63 74 6f 72  ::build_director
7ff0: 79 20 24 64 69 72 65 63 74 6f 72 79 0d 0a 0d 0a  y $directory....
8000: 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
8010: 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  s $channel [appe
8020: 6e 64 41 72 67 73 20 22 79 65 73 20 28 22 20 24  ndArgs "yes (" $
8030: 64 69 72 65 63 74 6f 72 79 20 22 29 5c 6e 22 5d  directory ")\n"]
8040: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
8050: 72 65 74 75 72 6e 20 74 72 75 65 0d 0a 20 20 20  return true..   
8060: 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d         } else {.
8070: 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75  .            tpu
8080: 74 73 20 24 63 68 61 6e 6e 65 6c 20 79 65 73 5c  ts $channel yes\
8090: 6e 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  n..          }..
80a0: 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b          } else {
80b0: 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70 75 74  ..          tput
80c0: 73 20 24 63 68 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d  s $channel no\n.
80d0: 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72  ...          for
80e0: 65 61 63 68 20 70 61 74 68 20 5b 6c 73 6f 72 74  each path [lsort
80f0: 20 2d 64 65 63 72 65 61 73 69 6e 67 20 5b 66 69   -decreasing [fi
8100: 6c 65 20 6c 69 73 74 20 24 64 69 72 65 63 74 6f  le list $directo
8110: 72 79 20 2a 5d 5d 20 7b 0d 0a 20 20 20 20 20 20  ry *]] {..      
8120: 20 20 20 20 20 20 69 66 20 7b 5b 66 69 6c 65 20        if {[file 
8130: 65 78 69 73 74 73 20 24 70 61 74 68 5d 20 26 26  exists $path] &&
8140: 20 5b 66 69 6c 65 20 69 73 64 69 72 65 63 74 6f   [file isdirecto
8150: 72 79 20 24 70 61 74 68 5d 7d 20 74 68 65 6e 20  ry $path]} then 
8160: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
8170: 20 73 65 74 20 66 69 6c 65 4e 61 6d 65 20 5b 66   set fileName [f
8180: 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65 20 5b  ile nativename [
8190: 66 69 6c 65 20 6a 6f 69 6e 20 24 70 61 74 68 20  file join $path 
81a0: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
81b0: 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61       System.Data
81c0: 2e 53 51 4c 69 74 65 2e 64 6c 6c 5d 5d 0d 0a 0d  .SQLite.dll]]...
81d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74  .              t
81e0: 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61  puts $channel [a
81f0: 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
8200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
8210: 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e 67 20 66 6f  ---- checking fo
8220: 72 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51  r System.Data.SQ
8230: 4c 69 74 65 20 72 65 6c 65 61 73 65 20 5c 22 22  Lite release \""
8240: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
8250: 20 20 20 20 20 20 24 66 69 6c 65 4e 61 6d 65 20        $fileName 
8260: 22 5c 22 2e 2e 2e 20 22 5d 0d 0a 0d 0a 20 20 20  "\"... "]....   
8270: 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b             if {[
8280: 66 69 6c 65 20 65 78 69 73 74 73 20 24 66 69 6c  file exists $fil
8290: 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a  eName]} then {..
82a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
82b0: 69 66 20 7b 24 73 65 6c 65 63 74 7d 20 74 68 65  if {$select} the
82c0: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
82d0: 20 20 20 20 20 20 20 73 65 74 20 3a 3a 62 75 69         set ::bui
82e0: 6c 64 5f 64 69 72 65 63 74 6f 72 79 20 24 70 61  ld_directory $pa
82f0: 74 68 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  th....          
8300: 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
8310: 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
8320: 67 73 20 22 79 65 73 2c 20 73 65 6c 65 63 74 65  gs "yes, selecte
8330: 64 20 28 22 20 24 70 61 74 68 20 22 29 5c 6e 22  d (" $path ")\n"
8340: 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ]....           
8350: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 72         return tr
8360: 75 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ue..            
8370: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
8380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8390: 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 79  tputs $channel y
83a0: 65 73 5c 6e 0d 0a 20 20 20 20 20 20 20 20 20 20  es\n..          
83b0: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
83c0: 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d         } else {.
83d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
83e0: 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
83f0: 6e 6f 5c 6e 0d 0a 20 20 20 20 20 20 20 20 20 20  no\n..          
8400: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
8410: 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
8420: 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  }..        }..  
8430: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
8440: 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
8450: 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
8460: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
8470: 22 2d 2d 2d 2d 20 65 6e 76 69 72 6f 6e 6d 65 6e  "---- environmen
8480: 74 20 76 61 72 69 61 62 6c 65 20 5c 22 53 79 73  t variable \"Sys
8490: 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 5c  tem.Data.SQLite\
84a0: 22 20 69 73 20 6e 6f 74 20 22 20 5c 0d 0a 20 20  " is not " \..  
84b0: 20 20 20 20 20 20 20 20 20 20 22 73 65 74 2c 20            "set, 
84c0: 73 6b 69 70 70 69 6e 67 20 63 68 65 63 6b 20 66  skipping check f
84d0: 6f 72 20 72 65 6c 65 61 73 65 73 2e 2e 2e 5c 6e  or releases...\n
84e0: 22 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  "]..      }.... 
84f0: 20 20 20 20 20 72 65 74 75 72 6e 20 66 61 6c 73       return fals
8500: 65 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  e..    }.....   
8510: 20 70 72 6f 63 20 63 68 65 63 6b 46 6f 72 53 51   proc checkForSQ
8520: 4c 69 74 65 4c 69 62 72 61 72 79 20 7b 20 63 68  LiteLibrary { ch
8530: 61 6e 6e 65 6c 20 7d 20 7b 0d 0a 20 20 20 20 20  annel } {..     
8540: 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
8550: 22 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e 67 20 66  "---- checking f
8560: 6f 72 20 53 51 4c 69 74 65 20 63 6f 72 65 20 6c  or SQLite core l
8570: 69 62 72 61 72 79 2e 2e 2e 20 22 0d 0a 0d 0a 20  ibrary... ".... 
8580: 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20       if {[catch 
8590: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
85a0: 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d   object invoke -
85b0: 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63  flags +NonPublic
85c0: 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c   System.Data.SQL
85d0: 69 74 65 2e 53 51 4c 69 74 65 33 20 5c 0d 0a 20  ite.SQLite3 \.. 
85e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
85f0: 69 74 65 56 65 72 73 69 6f 6e 7d 20 76 65 72 73  iteVersion} vers
8600: 69 6f 6e 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20  ion] == 0} then 
8610: 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
8620: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68        # NOTE: Ch
8630: 65 63 6b 20 69 66 20 74 68 65 20 72 65 74 75 72  eck if the retur
8640: 6e 65 64 20 76 65 72 73 69 6f 6e 20 77 61 73 20  ned version was 
8650: 6e 75 6c 6c 2e 20 20 49 66 20 73 6f 2c 20 6d 61  null.  If so, ma
8660: 6b 65 20 69 74 20 65 61 73 79 0d 0a 20 20 20 20  ke it easy..    
8670: 20 20 20 20 23 20 20 20 20 20 20 20 74 6f 20 73      #       to s
8680: 70 6f 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  pot...        #.
8690: 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73 74  .        if {[st
86a0: 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 76 65 72  ring length $ver
86b0: 73 69 6f 6e 5d 20 3d 3d 20 30 7d 20 74 68 65 6e  sion] == 0} then
86c0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65   {..          se
86d0: 74 20 76 65 72 73 69 6f 6e 20 6e 75 6c 6c 0d 0a  t version null..
86e0: 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
86f0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
8700: 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74 20  # NOTE: Attempt 
8710: 74 6f 20 71 75 65 72 79 20 74 68 65 20 46 6f 73  to query the Fos
8720: 73 69 6c 20 73 6f 75 72 63 65 20 69 64 65 6e 74  sil source ident
8730: 69 66 69 65 72 20 66 6f 72 20 74 68 65 20 53 51  ifier for the SQ
8740: 4c 69 74 65 0d 0a 20 20 20 20 20 20 20 20 23 20  Lite..        # 
8750: 20 20 20 20 20 20 63 6f 72 65 20 6c 69 62 72 61        core libra
8760: 72 79 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  ry...        #..
8770: 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74          if {[cat
8780: 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  ch {..          
8790: 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76        object inv
87a0: 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50  oke -flags +NonP
87b0: 75 62 6c 69 63 20 53 79 73 74 65 6d 2e 44 61 74  ublic System.Dat
87c0: 61 2e 53 51 4c 69 74 65 2e 53 51 4c 69 74 65 33  a.SQLite.SQLite3
87d0: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
87e0: 20 20 20 20 53 51 4c 69 74 65 53 6f 75 72 63 65      SQLiteSource
87f0: 49 64 7d 20 73 6f 75 72 63 65 49 64 5d 7d 20 74  Id} sourceId]} t
8800: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
8810: 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20   #..          # 
8820: 4e 4f 54 45 3a 20 57 65 20 66 61 69 6c 65 64 20  NOTE: We failed 
8830: 74 6f 20 71 75 65 72 79 20 74 68 65 20 46 6f 73  to query the Fos
8840: 73 69 6c 20 73 6f 75 72 63 65 20 69 64 65 6e 74  sil source ident
8850: 69 66 69 65 72 2e 0d 0a 20 20 20 20 20 20 20 20  ifier...        
8860: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 73    #..          s
8870: 65 74 20 73 6f 75 72 63 65 49 64 20 75 6e 6b 6e  et sourceId unkn
8880: 6f 77 6e 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  own..        }..
8890: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
88a0: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68 65       # NOTE: Che
88b0: 63 6b 20 69 66 20 74 68 65 20 72 65 74 75 72 6e  ck if the return
88c0: 65 64 20 46 6f 73 73 69 6c 20 73 6f 75 72 63 65  ed Fossil source
88d0: 20 69 64 65 6e 74 69 66 69 65 72 20 77 61 73 20   identifier was 
88e0: 6e 75 6c 6c 2e 20 20 49 66 0d 0a 20 20 20 20 20  null.  If..     
88f0: 20 20 20 23 20 20 20 20 20 20 20 73 6f 2c 20 6d     #       so, m
8900: 61 6b 65 20 69 74 20 65 61 73 79 20 74 6f 20 73  ake it easy to s
8910: 70 6f 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  pot...        #.
8920: 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73 74  .        if {[st
8930: 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 73 6f 75  ring length $sou
8940: 72 63 65 49 64 5d 20 3d 3d 20 30 7d 20 74 68 65  rceId] == 0} the
8950: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73  n {..          s
8960: 65 74 20 73 6f 75 72 63 65 49 64 20 6e 75 6c 6c  et sourceId null
8970: 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  ..        }.... 
8980: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
8990: 20 20 23 20 4e 4f 54 45 3a 20 59 65 73 2c 20 74    # NOTE: Yes, t
89a0: 68 65 20 53 51 4c 69 74 65 20 63 6f 72 65 20 6c  he SQLite core l
89b0: 69 62 72 61 72 79 20 61 70 70 65 61 72 73 20 74  ibrary appears t
89c0: 6f 20 62 65 20 61 76 61 69 6c 61 62 6c 65 2e 0d  o be available..
89d0: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
89e0: 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e      addConstrain
89f0: 74 20 53 51 4c 69 74 65 0d 0a 0d 0a 20 20 20 20  t SQLite....    
8a00: 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
8a10: 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 22  el [appendArgs "
8a20: 79 65 73 20 28 22 20 24 76 65 72 73 69 6f 6e 20  yes (" $version 
8a30: 22 20 22 20 24 73 6f 75 72 63 65 49 64 20 22 29  " " $sourceId ")
8a40: 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c  \n"]..      } el
8a50: 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70  se {..        tp
8a60: 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 6e 6f 5c  uts $channel no\
8a70: 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  n..      }..    
8a80: 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 63  }.....    proc c
8a90: 68 65 63 6b 46 6f 72 53 51 4c 69 74 65 49 6e 74  heckForSQLiteInt
8aa0: 65 72 6f 70 20 7b 20 63 68 61 6e 6e 65 6c 20 7d  erop { channel }
8ab0: 20 7b 0d 0a 20 20 20 20 20 20 74 70 75 74 73 20   {..      tputs 
8ac0: 24 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 63  $channel "---- c
8ad0: 68 65 63 6b 69 6e 67 20 66 6f 72 20 53 51 4c 69  hecking for SQLi
8ae0: 74 65 20 69 6e 74 65 72 6f 70 20 61 73 73 65 6d  te interop assem
8af0: 62 6c 79 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20  bly... "....    
8b00: 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a    if {[catch {..
8b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 62                ob
8b20: 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61  ject invoke -fla
8b30: 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 53 79  gs +NonPublic Sy
8b40: 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
8b50: 2e 53 51 4c 69 74 65 33 20 5c 0d 0a 20 20 20 20  .SQLite3 \..    
8b60: 20 20 20 20 20 20 20 20 20 20 49 6e 74 65 72 6f            Intero
8b70: 70 56 65 72 73 69 6f 6e 7d 20 76 65 72 73 69 6f  pVersion} versio
8b80: 6e 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d  n] == 0} then {.
8b90: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
8ba0: 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68 65 63      # NOTE: Chec
8bb0: 6b 20 69 66 20 74 68 65 20 72 65 74 75 72 6e 65  k if the returne
8bc0: 64 20 76 65 72 73 69 6f 6e 20 77 61 73 20 6e 75  d version was nu
8bd0: 6c 6c 2e 20 20 49 66 20 73 6f 2c 20 6d 61 6b 65  ll.  If so, make
8be0: 20 69 74 20 65 61 73 79 0d 0a 20 20 20 20 20 20   it easy..      
8bf0: 20 20 23 20 20 20 20 20 20 20 74 6f 20 73 70 6f    #       to spo
8c00: 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  t...        #.. 
8c10: 20 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69         if {[stri
8c20: 6e 67 20 6c 65 6e 67 74 68 20 24 76 65 72 73 69  ng length $versi
8c30: 6f 6e 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b  on] == 0} then {
8c40: 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20  ..          set 
8c50: 76 65 72 73 69 6f 6e 20 6e 75 6c 6c 0d 0a 20 20  version null..  
8c60: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
8c70: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
8c80: 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74 20 74 6f  NOTE: Attempt to
8c90: 20 71 75 65 72 79 20 74 68 65 20 46 6f 73 73 69   query the Fossi
8ca0: 6c 20 73 6f 75 72 63 65 20 69 64 65 6e 74 69 66  l source identif
8cb0: 69 65 72 20 66 6f 72 20 74 68 65 20 53 51 4c 69  ier for the SQLi
8cc0: 74 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  te..        #   
8cd0: 20 20 20 20 63 6f 72 65 20 6c 69 62 72 61 72 79      core library
8ce0: 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
8cf0: 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68        if {[catch
8d00: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
8d10: 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b      object invok
8d20: 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62  e -flags +NonPub
8d30: 6c 69 63 20 53 79 73 74 65 6d 2e 44 61 74 61 2e  lic System.Data.
8d40: 53 51 4c 69 74 65 2e 53 51 4c 69 74 65 33 20 5c  SQLite.SQLite3 \
8d50: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
8d60: 20 20 49 6e 74 65 72 6f 70 53 6f 75 72 63 65 49    InteropSourceI
8d70: 64 7d 20 73 6f 75 72 63 65 49 64 5d 7d 20 74 68  d} sourceId]} th
8d80: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
8d90: 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e  #..          # N
8da0: 4f 54 45 3a 20 57 65 20 66 61 69 6c 65 64 20 74  OTE: We failed t
8db0: 6f 20 71 75 65 72 79 20 74 68 65 20 46 6f 73 73  o query the Foss
8dc0: 69 6c 20 73 6f 75 72 63 65 20 69 64 65 6e 74 69  il source identi
8dd0: 66 69 65 72 2e 0d 0a 20 20 20 20 20 20 20 20 20  fier...         
8de0: 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65   #..          se
8df0: 74 20 73 6f 75 72 63 65 49 64 20 75 6e 6b 6e 6f  t sourceId unkno
8e00: 77 6e 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d  wn..        }...
8e10: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
8e20: 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68 65 63      # NOTE: Chec
8e30: 6b 20 69 66 20 74 68 65 20 72 65 74 75 72 6e 65  k if the returne
8e40: 64 20 46 6f 73 73 69 6c 20 73 6f 75 72 63 65 20  d Fossil source 
8e50: 69 64 65 6e 74 69 66 69 65 72 20 77 61 73 20 6e  identifier was n
8e60: 75 6c 6c 2e 20 20 49 66 0d 0a 20 20 20 20 20 20  ull.  If..      
8e70: 20 20 23 20 20 20 20 20 20 20 73 6f 2c 20 6d 61    #       so, ma
8e80: 6b 65 20 69 74 20 65 61 73 79 20 74 6f 20 73 70  ke it easy to sp
8e90: 6f 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  ot...        #..
8ea0: 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72          if {[str
8eb0: 69 6e 67 20 6c 65 6e 67 74 68 20 24 73 6f 75 72  ing length $sour
8ec0: 63 65 49 64 5d 20 3d 3d 20 30 7d 20 74 68 65 6e  ceId] == 0} then
8ed0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65   {..          se
8ee0: 74 20 73 6f 75 72 63 65 49 64 20 6e 75 6c 6c 0d  t sourceId null.
8ef0: 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  .        }....  
8f00: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
8f10: 20 23 20 4e 4f 54 45 3a 20 59 65 73 2c 20 74 68   # NOTE: Yes, th
8f20: 65 20 53 51 4c 69 74 65 20 69 6e 74 65 72 6f 70  e SQLite interop
8f30: 20 61 73 73 65 6d 62 6c 79 20 61 70 70 65 61 72   assembly appear
8f40: 73 20 74 6f 20 62 65 20 61 76 61 69 6c 61 62 6c  s to be availabl
8f50: 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  e...        #.. 
8f60: 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72         addConstr
8f70: 61 69 6e 74 20 53 51 4c 69 74 65 49 6e 74 65 72  aint SQLiteInter
8f80: 6f 70 0d 0a 0d 0a 20 20 20 20 20 20 20 20 74 70  op....        tp
8f90: 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70  uts $channel [ap
8fa0: 70 65 6e 64 41 72 67 73 20 22 79 65 73 20 28 22  pendArgs "yes ("
8fb0: 20 24 76 65 72 73 69 6f 6e 20 22 20 22 20 24 73   $version " " $s
8fc0: 6f 75 72 63 65 49 64 20 22 29 5c 6e 22 5d 0d 0a  ourceId ")\n"]..
8fd0: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
8fe0: 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
8ff0: 68 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d 0a 20 20 20  hannel no\n..   
9000: 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a     }..    }.....
9010: 20 20 20 20 70 72 6f 63 20 63 68 65 63 6b 46 6f      proc checkFo
9020: 72 53 51 4c 69 74 65 44 65 66 69 6e 65 43 6f 6e  rSQLiteDefineCon
9030: 73 74 61 6e 74 20 7b 20 63 68 61 6e 6e 65 6c 20  stant { channel 
9040: 6e 61 6d 65 20 7d 20 7b 0d 0a 20 20 20 20 20 20  name } {..      
9050: 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b  tputs $channel [
9060: 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
9070: 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 68          "---- ch
9080: 65 63 6b 69 6e 67 20 66 6f 72 20 53 79 73 74 65  ecking for Syste
9090: 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 20 64 65  m.Data.SQLite de
90a0: 66 69 6e 65 20 63 6f 6e 73 74 61 6e 74 20 5c 22  fine constant \"
90b0: 22 20 24 6e 61 6d 65 20 5c 0d 0a 20 20 20 20 20  " $name \..     
90c0: 20 20 20 20 20 22 5c 22 2e 2e 2e 20 22 5d 0d 0a       "\"... "]..
90d0: 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74  ..      if {[cat
90e0: 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  ch {..          
90f0: 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b      object invok
9100: 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62  e -flags +NonPub
9110: 6c 69 63 20 53 79 73 74 65 6d 2e 44 61 74 61 2e  lic System.Data.
9120: 53 51 4c 69 74 65 2e 53 51 4c 69 74 65 33 20 5c  SQLite.SQLite3 \
9130: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
9140: 44 65 66 69 6e 65 43 6f 6e 73 74 61 6e 74 73 7d  DefineConstants}
9150: 20 64 65 66 69 6e 65 43 6f 6e 73 74 61 6e 74 73   defineConstants
9160: 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  ] == 0} then {..
9170: 20 20 20 20 20 20 20 20 69 66 20 7b 5b 6c 73 65          if {[lse
9180: 61 72 63 68 20 2d 65 78 61 63 74 20 2d 6e 6f 63  arch -exact -noc
9190: 61 73 65 20 24 64 65 66 69 6e 65 43 6f 6e 73 74  ase $defineConst
91a0: 61 6e 74 73 20 24 6e 61 6d 65 5d 20 21 3d 20 2d  ants $name] != -
91b0: 31 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  1} then {..     
91c0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
91d0: 20 20 23 20 4e 4f 54 45 3a 20 59 65 73 2c 20 74    # NOTE: Yes, t
91e0: 68 69 73 20 64 65 66 69 6e 65 20 63 6f 6e 73 74  his define const
91f0: 61 6e 74 20 77 61 73 20 65 6e 61 62 6c 65 64 20  ant was enabled 
9200: 77 68 65 6e 20 74 68 65 20 6d 61 6e 61 67 65 64  when the managed
9210: 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 20 20  ..          #   
9220: 20 20 20 20 61 73 73 65 6d 62 6c 79 20 77 61 73      assembly was
9230: 20 63 6f 6d 70 69 6c 65 64 2e 0d 0a 20 20 20 20   compiled...    
9240: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
9250: 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74     addConstraint
9260: 20 5b 61 70 70 65 6e 64 41 72 67 73 20 64 65 66   [appendArgs def
9270: 69 6e 65 43 6f 6e 73 74 61 6e 74 2e 53 79 73 74  ineConstant.Syst
9280: 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 20  em.Data.SQLite. 
9290: 24 6e 61 6d 65 5d 0d 0a 0d 0a 20 20 20 20 20 20  $name]....      
92a0: 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
92b0: 65 6c 20 79 65 73 5c 6e 0d 0a 20 20 20 20 20 20  el yes\n..      
92c0: 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
92d0: 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
92e0: 6e 6e 65 6c 20 6e 6f 5c 6e 0d 0a 20 20 20 20 20  nnel no\n..     
92f0: 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 20 65 6c     }..      } el
9300: 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70  se {..        tp
9310: 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 65 72 72  uts $channel err
9320: 6f 72 5c 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a 20  or\n..      }.. 
9330: 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
9340: 63 20 67 65 74 44 61 74 65 54 69 6d 65 46 6f 72  c getDateTimeFor
9350: 6d 61 74 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20  mat {} {..      
9360: 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
9370: 20 54 68 69 73 20 70 72 6f 63 65 64 75 72 65 20   This procedure 
9380: 73 69 6d 70 6c 79 20 72 65 74 75 72 6e 73 20 74  simply returns t
9390: 68 65 20 22 64 65 66 61 75 6c 74 22 20 44 61 74  he "default" Dat
93a0: 65 54 69 6d 65 20 66 6f 72 6d 61 74 20 75 73 65  eTime format use
93b0: 64 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  d..      #      
93c0: 20 62 79 20 74 68 65 20 74 65 73 74 20 73 75 69   by the test sui
93d0: 74 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  te...      #..  
93e0: 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78      if {[info ex
93f0: 69 73 74 73 20 3a 3a 64 61 74 65 74 69 6d 65 5f  ists ::datetime_
9400: 66 6f 72 6d 61 74 5d 20 26 26 20 5c 0d 0a 20 20  format] && \..  
9410: 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20          [string 
9420: 6c 65 6e 67 74 68 20 24 3a 3a 64 61 74 65 74 69  length $::dateti
9430: 6d 65 5f 66 6f 72 6d 61 74 5d 20 3e 20 30 7d 20  me_format] > 0} 
9440: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
9450: 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
9460: 45 3a 20 52 65 74 75 72 6e 20 74 68 65 20 6d 61  E: Return the ma
9470: 6e 75 61 6c 6c 79 20 6f 76 65 72 72 69 64 64 65  nually overridde
9480: 6e 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20  n value for the 
9490: 44 61 74 65 54 69 6d 65 20 66 6f 72 6d 61 74 2e  DateTime format.
94a0: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
94b0: 20 20 20 20 20 72 65 74 75 72 6e 20 24 3a 3a 64       return $::d
94c0: 61 74 65 74 69 6d 65 5f 66 6f 72 6d 61 74 0d 0a  atetime_format..
94d0: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
94e0: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
94f0: 20 20 20 23 20 4e 4f 54 45 3a 20 52 65 74 75 72     # NOTE: Retur
9500: 6e 20 61 6e 20 49 53 4f 38 36 30 31 20 44 61 74  n an ISO8601 Dat
9510: 65 54 69 6d 65 20 66 6f 72 6d 61 74 20 63 6f 6d  eTime format com
9520: 70 61 74 69 62 6c 65 20 77 69 74 68 20 53 51 4c  patible with SQL
9530: 69 74 65 2c 0d 0a 20 20 20 20 20 20 20 20 23 20  ite,..        # 
9540: 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74        System.Dat
9550: 61 2e 53 51 4c 69 74 65 2c 20 61 6e 64 20 73 75  a.SQLite, and su
9560: 69 74 61 62 6c 65 20 66 6f 72 20 72 6f 75 6e 64  itable for round
9570: 2d 74 72 69 70 70 69 6e 67 20 77 69 74 68 20 74  -tripping with t
9580: 68 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  he..        #   
9590: 20 20 20 20 44 61 74 65 54 69 6d 65 20 63 6c 61      DateTime cla
95a0: 73 73 20 6f 66 20 74 68 65 20 66 72 61 6d 65 77  ss of the framew
95b0: 6f 72 6b 2e 20 20 49 66 20 74 68 69 73 20 76 61  ork.  If this va
95c0: 6c 75 65 20 69 73 20 63 68 61 6e 67 65 64 2c 0d  lue is changed,.
95d0: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
95e0: 20 76 61 72 69 6f 75 73 20 74 65 73 74 73 20 6d   various tests m
95f0: 61 79 20 66 61 69 6c 2e 0d 0a 20 20 20 20 20 20  ay fail...      
9600: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74    #..        ret
9610: 75 72 6e 20 22 79 79 79 79 2d 4d 4d 2d 64 64 20  urn "yyyy-MM-dd 
9620: 48 48 3a 6d 6d 3a 73 73 2e 46 46 46 46 46 46 46  HH:mm:ss.FFFFFFF
9630: 4b 22 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20  K"..      }..   
9640: 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
9650: 65 6e 75 6d 65 72 61 62 6c 65 54 6f 4c 69 73 74  enumerableToList
9660: 20 7b 20 65 6e 75 6d 65 72 61 62 6c 65 20 7d 20   { enumerable } 
9670: 7b 0d 0a 20 20 20 20 20 20 73 65 74 20 72 65 73  {..      set res
9680: 75 6c 74 20 5b 6c 69 73 74 5d 0d 0a 0d 0a 20 20  ult [list]....  
9690: 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20      if {[string 
96a0: 6c 65 6e 67 74 68 20 24 65 6e 75 6d 65 72 61 62  length $enumerab
96b0: 6c 65 5d 20 3d 3d 20 30 20 7c 7c 20 24 65 6e 75  le] == 0 || $enu
96c0: 6d 65 72 61 62 6c 65 20 65 71 20 22 6e 75 6c 6c  merable eq "null
96d0: 22 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  "} then {..     
96e0: 20 20 20 72 65 74 75 72 6e 20 24 72 65 73 75 6c     return $resul
96f0: 74 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  t..      }....  
9700: 20 20 20 20 6f 62 6a 65 63 74 20 66 6f 72 65 61      object forea
9710: 63 68 20 2d 61 6c 69 61 73 20 69 74 65 6d 20 24  ch -alias item $
9720: 65 6e 75 6d 65 72 61 62 6c 65 20 7b 0d 0a 20 20  enumerable {..  
9730: 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e        if {[strin
9740: 67 20 6c 65 6e 67 74 68 20 24 69 74 65 6d 5d 20  g length $item] 
9750: 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  > 0} then {..   
9760: 20 20 20 20 20 20 20 6c 61 70 70 65 6e 64 20 72         lappend r
9770: 65 73 75 6c 74 20 5b 24 69 74 65 6d 20 54 6f 53  esult [$item ToS
9780: 74 72 69 6e 67 5d 0d 0a 20 20 20 20 20 20 20 20  tring]..        
9790: 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  }..      }....  
97a0: 20 20 20 20 72 65 74 75 72 6e 20 24 72 65 73 75      return $resu
97b0: 6c 74 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20  lt..    }.....  
97c0: 20 20 70 72 6f 63 20 63 61 74 63 68 41 6e 64 52    proc catchAndR
97d0: 65 74 75 72 6e 20 7b 20 73 63 72 69 70 74 20 7b  eturn { script {
97e0: 73 74 61 63 6b 54 72 61 63 65 20 66 61 6c 73 65  stackTrace false
97f0: 7d 20 7b 73 74 72 69 63 74 20 74 72 75 65 7d 20  } {strict true} 
9800: 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  } {..      #..  
9810: 20 20 20 20 23 20 4e 4f 54 45 3a 20 45 76 61 6c      # NOTE: Eval
9820: 75 61 74 65 20 74 68 65 20 73 63 72 69 70 74 20  uate the script 
9830: 70 72 6f 76 69 64 65 64 20 62 79 20 6f 75 72 20  provided by our 
9840: 63 61 6c 6c 65 72 20 69 6e 20 74 68 65 69 72 20  caller in their 
9850: 63 6f 6e 74 65 78 74 2c 0d 0a 20 20 20 20 20 20  context,..      
9860: 23 20 20 20 20 20 20 20 63 61 70 74 75 72 69 6e  #       capturin
9870: 67 20 62 6f 74 68 20 74 68 65 20 72 65 73 75 6c  g both the resul
9880: 74 20 61 6e 64 20 74 68 65 20 72 65 74 75 72 6e  t and the return
9890: 20 63 6f 64 65 2e 0d 0a 20 20 20 20 20 20 23 0d   code...      #.
98a0: 0a 20 20 20 20 20 20 73 65 74 20 63 6f 64 65 20  .      set code 
98b0: 5b 63 61 74 63 68 20 7b 75 70 6c 65 76 65 6c 20  [catch {uplevel 
98c0: 31 20 24 73 63 72 69 70 74 7d 20 72 65 73 75 6c  1 $script} resul
98d0: 74 5d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20  t]....      #.. 
98e0: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 44 69 64       # NOTE: Did
98f0: 20 74 68 65 20 73 63 72 69 70 74 20 70 72 6f 76   the script prov
9900: 69 64 65 64 20 62 79 20 6f 75 72 20 63 61 6c 6c  ided by our call
9910: 65 72 20 4e 4f 54 20 72 61 69 73 65 20 61 6e 20  er NOT raise an 
9920: 65 72 72 6f 72 3f 0d 0a 20 20 20 20 20 20 23 0d  error?..      #.
9930: 0a 20 20 20 20 20 20 69 66 20 7b 24 73 74 72 69  .      if {$stri
9940: 63 74 20 26 26 20 24 63 6f 64 65 20 3d 3d 20 30  ct && $code == 0
9950: 20 7c 7c 20 21 24 73 74 72 69 63 74 20 26 26 20   || !$strict && 
9960: 24 63 6f 64 65 20 21 3d 20 31 7d 20 74 68 65 6e  $code != 1} then
9970: 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20   {..        #.. 
9980: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53         # NOTE: S
9990: 75 63 63 65 73 73 2e 20 20 52 65 74 75 72 6e 20  uccess.  Return 
99a0: 61 20 6c 69 73 74 20 77 69 74 68 20 74 68 65 20  a list with the 
99b0: 72 65 74 75 72 6e 20 63 6f 64 65 20 61 6e 64 20  return code and 
99c0: 74 68 65 20 72 65 73 75 6c 74 2e 0d 0a 20 20 20  the result...   
99d0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
99e0: 72 65 74 75 72 6e 20 5b 6c 69 73 74 20 24 63 6f  return [list $co
99f0: 64 65 20 24 72 65 73 75 6c 74 5d 0d 0a 20 20 20  de $result]..   
9a00: 20 20 20 7d 20 65 6c 73 65 69 66 20 7b 24 73 74     } elseif {$st
9a10: 61 63 6b 54 72 61 63 65 7d 20 74 68 65 6e 20 7b  ackTrace} then {
9a20: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
9a30: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 46 61 69       # NOTE: Fai
9a40: 6c 75 72 65 2e 20 20 4f 75 72 20 63 61 6c 6c 65  lure.  Our calle
9a50: 72 20 77 61 6e 74 73 20 61 20 66 75 6c 6c 20 73  r wants a full s
9a60: 74 61 63 6b 20 74 72 61 63 65 20 28 69 66 20 61  tack trace (if a
9a70: 70 70 6c 69 63 61 62 6c 65 29 2c 0d 0a 20 20 20  pplicable),..   
9a80: 20 20 20 20 20 23 20 20 20 20 20 20 20 72 65 74       #       ret
9a90: 75 72 6e 20 61 20 6c 69 73 74 20 77 69 74 68 20  urn a list with 
9aa0: 74 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20  the return code 
9ab0: 61 6e 64 20 74 68 65 20 72 65 73 75 6c 74 20 76  and the result v
9ac0: 65 72 62 61 74 69 6d 2e 0d 0a 20 20 20 20 20 20  erbatim...      
9ad0: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74    #..        ret
9ae0: 75 72 6e 20 5b 6c 69 73 74 20 24 63 6f 64 65 20  urn [list $code 
9af0: 24 72 65 73 75 6c 74 5d 0d 0a 20 20 20 20 20 20  $result]..      
9b00: 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
9b10: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
9b20: 4f 54 45 3a 20 46 61 69 6c 75 72 65 2e 20 20 4f  OTE: Failure.  O
9b30: 75 72 20 63 61 6c 6c 65 72 20 64 6f 65 73 20 6e  ur caller does n
9b40: 6f 74 20 77 61 6e 74 20 61 20 66 75 6c 6c 20 73  ot want a full s
9b50: 74 61 63 6b 20 74 72 61 63 65 20 28 69 66 0d 0a  tack trace (if..
9b60: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
9b70: 61 70 70 6c 69 63 61 62 6c 65 29 2c 20 72 65 74  applicable), ret
9b80: 75 72 6e 20 61 20 6c 69 73 74 20 77 69 74 68 20  urn a list with 
9b90: 74 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65 2c  the return code,
9ba0: 20 74 68 65 20 65 72 72 6f 72 0d 0a 20 20 20 20   the error..    
9bb0: 20 20 20 20 23 20 20 20 20 20 20 20 63 6f 64 65      #       code
9bc0: 20 66 6f 72 20 74 68 65 20 69 6e 74 65 72 70 72   for the interpr
9bd0: 65 74 65 72 2c 20 61 6e 64 20 74 68 65 20 65 72  eter, and the er
9be0: 72 6f 72 20 6d 65 73 73 61 67 65 20 75 70 20 74  ror message up t
9bf0: 6f 20 74 68 65 0d 0a 20 20 20 20 20 20 20 20 23  o the..        #
9c00: 20 20 20 20 20 20 20 70 6f 69 6e 74 20 77 68 65         point whe
9c10: 72 65 20 74 68 65 20 73 74 61 63 6b 20 74 72 61  re the stack tra
9c20: 63 65 20 73 68 6f 75 6c 64 20 73 74 61 72 74 2e  ce should start.
9c30: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
9c40: 20 20 20 20 20 73 65 74 20 69 6e 64 65 78 20 5b       set index [
9c50: 73 74 72 69 6e 67 20 66 69 72 73 74 20 22 20 20  string first "  
9c60: 20 61 74 20 22 20 24 72 65 73 75 6c 74 5d 3b 20   at " $result]; 
9c70: 23 20 48 41 43 4b 3a 20 52 65 6c 69 61 62 6c 65  # HACK: Reliable
9c80: 3f 0d 0a 0d 0a 20 20 20 20 20 20 20 20 72 65 74  ?....        ret
9c90: 75 72 6e 20 5b 6c 69 73 74 20 24 63 6f 64 65 20  urn [list $code 
9ca0: 24 3a 3a 65 72 72 6f 72 43 6f 64 65 20 5b 65 78  $::errorCode [ex
9cb0: 70 72 20 7b 24 69 6e 64 65 78 20 21 3d 20 2d 31  pr {$index != -1
9cc0: 20 3f 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20   ? \..          
9cd0: 20 20 5b 73 74 72 69 6e 67 20 74 72 69 6d 20 5b    [string trim [
9ce0: 73 74 72 69 6e 67 20 72 61 6e 67 65 20 24 72 65  string range $re
9cf0: 73 75 6c 74 20 30 20 24 69 6e 64 65 78 5d 5d 20  sult 0 $index]] 
9d00: 3a 20 24 72 65 73 75 6c 74 7d 5d 5d 0d 0a 20 20  : $result}]]..  
9d10: 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d      }..    }....
9d20: 0a 20 20 20 20 70 72 6f 63 20 63 6f 6d 70 69 6c  .    proc compil
9d30: 65 43 53 68 61 72 70 57 69 74 68 20 7b 0d 0a 20  eCSharpWith {.. 
9d40: 20 20 20 20 20 20 20 20 20 20 20 74 65 78 74 20             text 
9d50: 6d 65 6d 6f 72 79 20 73 79 6d 62 6f 6c 73 20 73  memory symbols s
9d60: 74 72 69 63 74 20 72 65 73 75 6c 74 73 56 61 72  trict resultsVar
9d70: 4e 61 6d 65 20 65 72 72 6f 72 73 56 61 72 4e 61  Name errorsVarNa
9d80: 6d 65 20 66 69 6c 65 4e 61 6d 65 73 0d 0a 20 20  me fileNames..  
9d90: 20 20 20 20 20 20 20 20 20 20 61 72 67 73 20 7d            args }
9da0: 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20   {..      #..   
9db0: 20 20 20 23 20 4e 4f 54 45 3a 20 53 69 6e 63 65     # NOTE: Since
9dc0: 20 77 65 20 61 72 65 20 67 6f 69 6e 67 20 74 6f   we are going to
9dd0: 20 75 73 65 20 74 68 69 73 20 6d 65 74 68 6f 64   use this method
9de0: 20 6e 61 6d 65 20 61 20 6c 6f 74 2c 20 61 73 73   name a lot, ass
9df0: 69 67 6e 20 69 74 20 74 6f 20 61 0d 0a 20 20 20  ign it to a..   
9e00: 20 20 20 23 20 20 20 20 20 20 20 76 61 72 69 61     #       varia
9e10: 62 6c 65 20 66 69 72 73 74 2e 0d 0a 20 20 20 20  ble first...    
9e20: 20 20 23 0d 0a 20 20 20 20 20 20 73 65 74 20 61    #..      set a
9e30: 64 64 20 52 65 66 65 72 65 6e 63 65 64 41 73 73  dd ReferencedAss
9e40: 65 6d 62 6c 69 65 73 2e 41 64 64 0d 0a 0d 0a 20  emblies.Add.... 
9e50: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
9e60: 4e 4f 54 45 3a 20 43 72 65 61 74 65 20 74 68 65  NOTE: Create the
9e70: 20 62 61 73 65 20 63 6f 6d 6d 61 6e 64 20 74 6f   base command to
9e80: 20 65 76 61 6c 75 61 74 65 20 61 6e 64 20 61 64   evaluate and ad
9e90: 64 20 74 68 65 20 70 72 6f 70 65 72 74 79 20 73  d the property s
9ea0: 65 74 74 69 6e 67 73 0d 0a 20 20 20 20 20 20 23  ettings..      #
9eb0: 20 20 20 20 20 20 20 74 68 61 74 20 61 72 65 20         that are 
9ec0: 61 6c 6d 6f 73 74 20 61 6c 77 61 79 73 20 6e 65  almost always ne
9ed0: 65 64 65 64 20 62 79 20 6f 75 72 20 75 6e 69 74  eded by our unit
9ee0: 20 74 65 73 74 73 20 28 69 2e 65 2e 20 74 68 65   tests (i.e. the
9ef0: 20 53 79 73 74 65 6d 0d 0a 20 20 20 20 20 20 23   System..      #
9f00: 20 20 20 20 20 20 20 61 6e 64 20 53 79 73 74 65         and Syste
9f10: 6d 2e 44 61 74 61 20 61 73 73 65 6d 62 6c 79 20  m.Data assembly 
9f20: 72 65 66 65 72 65 6e 63 65 73 29 2e 0d 0a 20 20  references)...  
9f30: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 73 65 74      #..      set
9f40: 20 63 6f 6d 6d 61 6e 64 20 5b 6c 69 73 74 20 63   command [list c
9f50: 6f 6d 70 69 6c 65 43 53 68 61 72 70 20 24 74 65  ompileCSharp $te
9f60: 78 74 20 24 6d 65 6d 6f 72 79 20 24 73 79 6d 62  xt $memory $symb
9f70: 6f 6c 73 20 24 73 74 72 69 63 74 20 72 65 73 75  ols $strict resu
9f80: 6c 74 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  lts \..         
9f90: 20 65 72 72 6f 72 73 20 24 61 64 64 20 53 79 73   errors $add Sys
9fa0: 74 65 6d 2e 64 6c 6c 20 24 61 64 64 20 53 79 73  tem.dll $add Sys
9fb0: 74 65 6d 2e 44 61 74 61 2e 64 6c 6c 20 24 61 64  tem.Data.dll $ad
9fc0: 64 20 53 79 73 74 65 6d 2e 58 6d 6c 2e 64 6c 6c  d System.Xml.dll
9fd0: 5d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  ]....      #..  
9fe0: 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 64 64 20      # NOTE: Add 
9ff0: 61 6c 6c 20 74 68 65 20 70 72 6f 76 69 64 65 64  all the provided
a000: 20 66 69 6c 65 20 6e 61 6d 65 73 20 61 73 20 61   file names as a
a010: 73 73 65 6d 62 6c 79 20 72 65 66 65 72 65 6e 63  ssembly referenc
a020: 65 73 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  es...      #..  
a030: 20 20 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65      foreach file
a040: 4e 61 6d 65 20 24 66 69 6c 65 4e 61 6d 65 73 20  Name $fileNames 
a050: 7b 0d 0a 20 20 20 20 20 20 20 20 6c 61 70 70 65  {..        lappe
a060: 6e 64 20 63 6f 6d 6d 61 6e 64 20 24 61 64 64 20  nd command $add 
a070: 5b 67 65 74 42 69 6e 61 72 79 46 69 6c 65 4e 61  [getBinaryFileNa
a080: 6d 65 20 24 66 69 6c 65 4e 61 6d 65 5d 0d 0a 20  me $fileName].. 
a090: 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
a0a0: 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
a0b0: 20 41 64 64 20 74 68 65 20 65 78 74 72 61 20 61   Add the extra a
a0c0: 72 67 75 6d 65 6e 74 73 2c 20 69 66 20 61 6e 79  rguments, if any
a0d0: 2c 20 74 6f 20 74 68 65 20 63 6f 6d 6d 61 6e 64  , to the command
a0e0: 20 74 6f 20 65 76 61 6c 75 61 74 65 2e 0d 0a 20   to evaluate... 
a0f0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 65 76       #..      ev
a100: 61 6c 20 6c 61 70 70 65 6e 64 20 63 6f 6d 6d 61  al lappend comma
a110: 6e 64 20 24 61 72 67 73 0d 0a 0d 0a 20 20 20 20  nd $args....    
a120: 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
a130: 45 3a 20 41 6c 69 61 73 20 74 68 65 20 63 6f 6d  E: Alias the com
a140: 70 69 6c 65 72 20 6c 6f 63 61 6c 20 72 65 73 75  piler local resu
a150: 6c 74 73 20 61 6e 64 20 65 72 72 6f 72 73 20 76  lts and errors v
a160: 61 72 69 61 62 6c 65 73 20 74 6f 20 74 68 65 0d  ariables to the.
a170: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 76  .      #       v
a180: 61 72 69 61 62 6c 65 20 6e 61 6d 65 73 20 70 72  ariable names pr
a190: 6f 76 69 64 65 64 20 62 79 20 6f 75 72 20 63 61  ovided by our ca
a1a0: 6c 6c 65 72 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  ller...      #..
a1b0: 20 20 20 20 20 20 75 70 76 61 72 20 31 20 24 72        upvar 1 $r
a1c0: 65 73 75 6c 74 73 56 61 72 4e 61 6d 65 20 72 65  esultsVarName re
a1d0: 73 75 6c 74 73 0d 0a 20 20 20 20 20 20 75 70 76  sults..      upv
a1e0: 61 72 20 31 20 24 65 72 72 6f 72 73 56 61 72 4e  ar 1 $errorsVarN
a1f0: 61 6d 65 20 65 72 72 6f 72 73 0d 0a 0d 0a 20 20  ame errors....  
a200: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
a210: 4f 54 45 3a 20 45 76 61 6c 75 61 74 65 20 74 68  OTE: Evaluate th
a220: 65 20 63 6f 6e 73 74 72 75 63 74 65 64 20 5b 63  e constructed [c
a230: 6f 6d 70 69 6c 65 43 53 68 61 72 70 5d 20 63 6f  ompileCSharp] co
a240: 6d 6d 61 6e 64 20 61 6e 64 20 72 65 74 75 72 6e  mmand and return
a250: 20 74 68 65 0d 0a 20 20 20 20 20 20 23 20 20 20   the..      #   
a260: 20 20 20 20 72 65 73 75 6c 74 2e 0d 0a 20 20 20      result...   
a270: 20 20 20 23 0d 0a 20 20 20 20 20 20 65 76 61 6c     #..      eval
a280: 20 24 63 6f 6d 6d 61 6e 64 0d 0a 20 20 20 20 7d   $command..    }
a290: 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 69 73  .....    proc is
a2a0: 4d 65 6d 6f 72 79 44 62 20 7b 20 66 69 6c 65 4e  MemoryDb { fileN
a2b0: 61 6d 65 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23  ame } {..      #
a2c0: 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
a2d0: 49 73 20 74 68 65 20 73 70 65 63 69 66 69 65 64  Is the specified
a2e0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6e   database file n
a2f0: 61 6d 65 20 72 65 61 6c 6c 79 20 61 6e 20 69 6e  ame really an in
a300: 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
a310: 3f 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ?..      #..    
a320: 20 20 72 65 74 75 72 6e 20 5b 65 78 70 72 20 7b    return [expr {
a330: 24 66 69 6c 65 4e 61 6d 65 20 65 71 20 22 3a 6d  $fileName eq ":m
a340: 65 6d 6f 72 79 3a 22 20 7c 7c 20 5c 0d 0a 20 20  emory:" || \..  
a350: 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20          [string 
a360: 72 61 6e 67 65 20 24 66 69 6c 65 4e 61 6d 65 20  range $fileName 
a370: 30 20 31 32 5d 20 65 71 20 22 66 69 6c 65 3a 3a  0 12] eq "file::
a380: 6d 65 6d 6f 72 79 3a 22 7d 5d 0d 0a 20 20 20 20  memory:"}]..    
a390: 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 69  }.....    proc i
a3a0: 73 54 61 62 6c 65 49 6e 44 62 20 7b 20 6e 61 6d  sTableInDb { nam
a3b0: 65 20 7b 76 61 72 4e 61 6d 65 20 64 62 7d 20 7d  e {varName db} }
a3c0: 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20   {..      #..   
a3d0: 20 20 20 23 20 4e 4f 54 45 3a 20 52 65 66 65 72     # NOTE: Refer
a3e0: 20 74 6f 20 74 68 65 20 73 70 65 63 69 66 69 65   to the specifie
a3f0: 64 20 76 61 72 69 61 62 6c 65 20 28 65 2e 67 2e  d variable (e.g.
a400: 20 22 64 62 22 29 20 69 6e 20 74 68 65 20 63 6f   "db") in the co
a410: 6e 74 65 78 74 20 6f 66 20 6f 75 72 0d 0a 20 20  ntext of our..  
a420: 20 20 20 20 23 20 20 20 20 20 20 20 63 61 6c 6c      #       call
a430: 65 72 2e 20 20 49 74 20 63 6f 6e 74 61 69 6e 73  er.  It contains
a440: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   the database co
a450: 6e 6e 65 63 74 69 6f 6e 20 68 61 6e 64 6c 65 20  nnection handle 
a460: 74 68 61 74 20 77 69 6c 6c 20 62 65 0d 0a 20 20  that will be..  
a470: 20 20 20 20 23 20 20 20 20 20 20 20 75 73 65 64      #       used
a480: 20 74 6f 20 65 78 65 63 75 74 65 20 74 68 65 20   to execute the 
a490: 71 75 65 72 79 20 75 73 65 64 20 74 6f 20 64 65  query used to de
a4a0: 74 65 72 6d 69 6e 65 20 69 66 20 74 68 65 20 6e  termine if the n
a4b0: 61 6d 65 64 20 74 61 62 6c 65 20 69 73 0d 0a 20  amed table is.. 
a4c0: 20 20 20 20 20 23 20 20 20 20 20 20 20 70 72 65       #       pre
a4d0: 73 65 6e 74 20 69 6e 20 74 68 61 74 20 64 61 74  sent in that dat
a4e0: 61 62 61 73 65 2e 0d 0a 20 20 20 20 20 20 23 0d  abase...      #.
a4f0: 0a 20 20 20 20 20 20 75 70 76 61 72 20 31 20 24  .      upvar 1 $
a500: 76 61 72 4e 61 6d 65 20 64 62 0d 0a 0d 0a 20 20  varName db....  
a510: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
a520: 4f 54 45 3a 20 45 78 65 63 75 74 65 20 74 68 65  OTE: Execute the
a530: 20 53 51 4c 20 71 75 65 72 79 20 61 67 61 69 6e   SQL query again
a540: 73 74 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61  st the sqlite_ma
a550: 73 74 65 72 20 74 61 62 6c 65 20 74 6f 20 63 68  ster table to ch
a560: 65 63 6b 20 69 66 0d 0a 20 20 20 20 20 20 23 20  eck if..      # 
a570: 20 20 20 20 20 20 74 68 65 20 6e 61 6d 65 64 20        the named 
a580: 74 61 62 6c 65 20 69 73 20 70 72 65 73 65 6e 74  table is present
a590: 20 61 6e 64 20 72 65 74 75 72 6e 20 6e 6f 6e 2d   and return non-
a5a0: 7a 65 72 6f 20 69 66 20 69 74 20 69 73 2e 0d 0a  zero if it is...
a5b0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 72        #..      r
a5c0: 65 74 75 72 6e 20 5b 65 78 70 72 20 7b 5b 73 71  eturn [expr {[sq
a5d0: 6c 20 65 78 65 63 75 74 65 20 2d 65 78 65 63 75  l execute -execu
a5e0: 74 65 20 73 63 61 6c 61 72 20 24 64 62 20 5c 0d  te scalar $db \.
a5f0: 0a 20 20 20 20 20 20 20 20 20 20 22 53 45 4c 45  .          "SELE
a600: 43 54 20 43 4f 55 4e 54 28 2a 29 20 46 52 4f 4d  CT COUNT(*) FROM
a610: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 57   sqlite_master W
a620: 48 45 52 45 20 74 79 70 65 20 3d 20 27 74 61 62  HERE type = 'tab
a630: 6c 65 27 20 41 4e 44 20 6e 61 6d 65 20 3d 20 3f  le' AND name = ?
a640: 3b 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  ;" \..          
a650: 5b 6c 69 73 74 20 70 61 72 61 6d 31 20 53 74 72  [list param1 Str
a660: 69 6e 67 20 24 6e 61 6d 65 5d 5d 20 3e 20 30 7d  ing $name]] > 0}
a670: 5d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  ]..    }.....   
a680: 20 70 72 6f 63 20 74 72 69 6d 53 71 6c 20 7b 20   proc trimSql { 
a690: 73 71 6c 20 7d 20 7b 0d 0a 20 20 20 20 20 20 72  sql } {..      r
a6a0: 65 74 75 72 6e 20 5b 72 65 67 73 75 62 20 2d 61  eturn [regsub -a
a6b0: 6c 6c 20 2d 2d 20 7b 5c 73 2b 7d 20 5b 73 74 72  ll -- {\s+} [str
a6c0: 69 6e 67 20 74 72 69 6d 20 24 73 71 6c 5d 20 22  ing trim $sql] "
a6d0: 20 22 5d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20   "]..    }..... 
a6e0: 20 20 20 70 72 6f 63 20 65 78 65 63 75 74 65 53     proc executeS
a6f0: 71 6c 20 7b 20 73 71 6c 20 7b 65 78 65 63 75 74  ql { sql {execut
a700: 65 20 6e 6f 6e 65 7d 20 7b 66 69 6c 65 4e 61 6d  e none} {fileNam
a710: 65 20 22 22 7d 20 7d 20 7b 0d 0a 20 20 20 20 20  e ""} } {..     
a720: 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e   if {[string len
a730: 67 74 68 20 24 66 69 6c 65 4e 61 6d 65 5d 20 3d  gth $fileName] =
a740: 3d 20 30 7d 20 74 68 65 6e 20 7b 73 65 74 20 66  = 0} then {set f
a750: 69 6c 65 4e 61 6d 65 20 3a 6d 65 6d 6f 72 79 3a  ileName :memory:
a760: 7d 0d 0a 20 20 20 20 20 20 73 65 74 75 70 44 62  }..      setupDb
a770: 20 24 66 69 6c 65 4e 61 6d 65 20 22 22 20 22 22   $fileName "" ""
a780: 20 22 22 20 22 22 20 22 22 20 66 61 6c 73 65 20   "" "" "" false 
a790: 66 61 6c 73 65 20 66 61 6c 73 65 20 66 61 6c 73  false false fals
a7a0: 65 20 6d 65 6d 44 62 0d 0a 0d 0a 20 20 20 20 20  e memDb....     
a7b0: 20 74 72 79 20 7b 0d 0a 20 20 20 20 20 20 20 20   try {..        
a7c0: 72 65 74 75 72 6e 20 5b 73 71 6c 20 65 78 65 63  return [sql exec
a7d0: 75 74 65 20 2d 65 78 65 63 75 74 65 20 24 65 78  ute -execute $ex
a7e0: 65 63 75 74 65 20 24 6d 65 6d 44 62 20 24 73 71  ecute $memDb $sq
a7f0: 6c 5d 0d 0a 20 20 20 20 20 20 7d 20 66 69 6e 61  l]..      } fina
a800: 6c 6c 79 20 7b 0d 0a 20 20 20 20 20 20 20 20 63  lly {..        c
a810: 6c 65 61 6e 75 70 44 62 20 24 66 69 6c 65 4e 61  leanupDb $fileNa
a820: 6d 65 20 6d 65 6d 44 62 20 66 61 6c 73 65 20 66  me memDb false f
a830: 61 6c 73 65 0d 0a 20 20 20 20 20 20 7d 0d 0a 20  alse..      }.. 
a840: 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
a850: 63 20 73 65 74 75 70 44 62 20 7b 0d 0a 20 20 20  c setupDb {..   
a860: 20 20 20 20 20 20 20 20 20 66 69 6c 65 4e 61 6d           fileNam
a870: 65 20 7b 6d 6f 64 65 20 22 22 7d 20 7b 64 61 74  e {mode ""} {dat
a880: 65 54 69 6d 65 46 6f 72 6d 61 74 20 22 22 7d 20  eTimeFormat ""} 
a890: 7b 64 61 74 65 54 69 6d 65 4b 69 6e 64 20 22 22  {dateTimeKind ""
a8a0: 7d 20 7b 66 6c 61 67 73 20 22 22 7d 0d 0a 20 20  } {flags ""}..  
a8b0: 20 20 20 20 20 20 20 20 20 20 7b 65 78 74 72 61            {extra
a8c0: 20 22 22 7d 20 7b 71 75 61 6c 69 66 79 20 74 72   ""} {qualify tr
a8d0: 75 65 7d 20 7b 64 65 6c 65 74 65 20 74 72 75 65  ue} {delete true
a8e0: 7d 20 7b 75 72 69 20 66 61 6c 73 65 7d 0d 0a 20  } {uri false}.. 
a8f0: 20 20 20 20 20 20 20 20 20 20 20 7b 74 65 6d 70             {temp
a900: 6f 72 61 72 79 20 74 72 75 65 7d 20 7b 76 61 72  orary true} {var
a910: 4e 61 6d 65 20 64 62 7d 20 7d 20 7b 0d 0a 20 20  Name db} } {..  
a920: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
a930: 4f 54 45 3a 20 46 69 72 73 74 2c 20 73 65 65 20  OTE: First, see 
a940: 69 66 20 6f 75 72 20 63 61 6c 6c 65 72 20 68 61  if our caller ha
a950: 73 20 72 65 71 75 65 73 74 65 64 20 61 6e 20 69  s requested an i
a960: 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
a970: 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  e...      #..   
a980: 20 20 20 73 65 74 20 69 73 4d 65 6d 6f 72 79 20     set isMemory 
a990: 5b 69 73 4d 65 6d 6f 72 79 44 62 20 24 66 69 6c  [isMemoryDb $fil
a9a0: 65 4e 61 6d 65 5d 0d 0a 0d 0a 20 20 20 20 20 20  eName]....      
a9b0: 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
a9c0: 20 46 6f 72 20 6e 6f 77 2c 20 61 6c 6c 20 74 65   For now, all te
a9d0: 73 74 20 64 61 74 61 62 61 73 65 73 20 75 73 65  st databases use
a9e0: 64 20 62 79 20 74 68 65 20 74 65 73 74 20 73 75  d by the test su
a9f0: 69 74 65 20 61 72 65 20 70 6c 61 63 65 64 0d 0a  ite are placed..
aa00: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 69 6e        #       in
aa10: 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
aa20: 64 69 72 65 63 74 6f 72 79 2e 20 20 45 61 63 68  directory.  Each
aa30: 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 72 65   database and re
aa40: 6c 61 74 65 64 20 66 69 6c 65 73 0d 0a 20 20 20  lated files..   
aa50: 20 20 20 23 20 20 20 20 20 20 20 75 73 65 64 20     #       used 
aa60: 62 79 20 61 20 74 65 73 74 20 73 68 6f 75 6c 64  by a test should
aa70: 20 62 65 20 63 6c 65 61 6e 65 64 20 75 70 20 62   be cleaned up b
aa80: 79 20 74 68 61 74 20 74 65 73 74 20 75 73 69 6e  y that test usin
aa90: 67 20 74 68 65 0d 0a 20 20 20 20 20 20 23 20 20  g the..      #  
aaa0: 20 20 20 20 20 22 63 6c 65 61 6e 75 70 44 62 22       "cleanupDb"
aab0: 20 70 72 6f 63 65 64 75 72 65 2c 20 62 65 6c 6f   procedure, belo
aac0: 77 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  w...      #..   
aad0: 20 20 20 69 66 20 7b 21 24 69 73 4d 65 6d 6f 72     if {!$isMemor
aae0: 79 20 26 26 20 24 71 75 61 6c 69 66 79 7d 20 74  y && $qualify} t
aaf0: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 73  hen {..        s
ab00: 65 74 20 66 69 6c 65 4e 61 6d 65 20 5b 66 69 6c  et fileName [fil
ab10: 65 20 6a 6f 69 6e 20 5b 67 65 74 44 61 74 61 62  e join [getDatab
ab20: 61 73 65 44 69 72 65 63 74 6f 72 79 5d 20 5b 66  aseDirectory] [f
ab30: 69 6c 65 20 74 61 69 6c 20 24 66 69 6c 65 4e 61  ile tail $fileNa
ab40: 6d 65 5d 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d  me]]..      }...
ab50: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
ab60: 23 20 4e 4f 54 45 3a 20 42 79 20 64 65 66 61 75  # NOTE: By defau
ab70: 6c 74 2c 20 64 65 6c 65 74 65 20 61 6e 79 20 70  lt, delete any p
ab80: 72 65 2d 65 78 69 73 74 69 6e 67 20 64 61 74 61  re-existing data
ab90: 62 61 73 65 20 77 69 74 68 20 74 68 65 20 73 61  base with the sa
aba0: 6d 65 20 66 69 6c 65 0d 0a 20 20 20 20 20 20 23  me file..      #
abb0: 20 20 20 20 20 20 20 6e 61 6d 65 20 69 66 20 69         name if i
abc0: 74 20 63 75 72 72 65 6e 74 6c 79 20 65 78 69 73  t currently exis
abd0: 74 73 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  ts...      #..  
abe0: 20 20 20 20 69 66 20 7b 21 24 69 73 4d 65 6d 6f      if {!$isMemo
abf0: 72 79 20 26 26 20 24 64 65 6c 65 74 65 20 26 26  ry && $delete &&
ac00: 20 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24 66   [file exists $f
ac10: 69 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b  ileName]} then {
ac20: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
ac30: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 74 74       # NOTE: Att
ac40: 65 6d 70 74 20 74 6f 20 64 65 6c 65 74 65 20 61  empt to delete a
ac50: 6e 79 20 70 72 65 2d 65 78 69 73 74 69 6e 67 20  ny pre-existing 
ac60: 64 61 74 61 62 61 73 65 20 77 69 74 68 20 74 68  database with th
ac70: 65 20 73 61 6d 65 20 66 69 6c 65 0d 0a 20 20 20  e same file..   
ac80: 20 20 20 20 20 23 20 20 20 20 20 20 20 6e 61 6d       #       nam
ac90: 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  e...        #.. 
aca0: 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63         if {[catc
acb0: 68 20 7b 66 69 6c 65 20 64 65 6c 65 74 65 20 24  h {file delete $
acc0: 66 69 6c 65 4e 61 6d 65 7d 20 65 72 72 6f 72 5d  fileName} error]
acd0: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
ace0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
acf0: 20 23 20 4e 4f 54 45 3a 20 57 65 20 73 6f 6d 65   # NOTE: We some
ad00: 68 6f 77 20 66 61 69 6c 65 64 20 74 6f 20 64 65  how failed to de
ad10: 6c 65 74 65 20 74 68 65 20 66 69 6c 65 2c 20 72  lete the file, r
ad20: 65 70 6f 72 74 20 77 68 79 2e 0d 0a 20 20 20 20  eport why...    
ad30: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
ad40: 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
ad50: 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  _channel [append
ad60: 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
ad70: 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e        "==== WARN
ad80: 49 4e 47 3a 20 66 61 69 6c 65 64 20 74 6f 20 64  ING: failed to d
ad90: 65 6c 65 74 65 20 64 61 74 61 62 61 73 65 20 66  elete database f
ada0: 69 6c 65 20 5c 22 22 20 24 66 69 6c 65 4e 61 6d  ile \"" $fileNam
adb0: 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e \..           
adc0: 20 20 20 22 5c 22 20 64 75 72 69 6e 67 20 73 65     "\" during se
add0: 74 75 70 2c 20 65 72 72 6f 72 3a 20 22 20 5c 6e  tup, error: " \n
ade0: 5c 74 20 24 65 72 72 6f 72 20 5c 6e 5d 0d 0a 20  \t $error \n].. 
adf0: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
ae00: 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  }....      #..  
ae10: 20 20 20 20 23 20 4e 4f 54 45 3a 20 52 65 66 65      # NOTE: Refe
ae20: 72 20 74 6f 20 74 68 65 20 73 70 65 63 69 66 69  r to the specifi
ae30: 65 64 20 76 61 72 69 61 62 6c 65 20 28 65 2e 67  ed variable (e.g
ae40: 2e 20 22 64 62 22 29 20 69 6e 20 74 68 65 20 63  . "db") in the c
ae50: 6f 6e 74 65 78 74 20 6f 66 20 6f 75 72 0d 0a 20  ontext of our.. 
ae60: 20 20 20 20 20 23 20 20 20 20 20 20 20 63 61 6c       #       cal
ae70: 6c 65 72 2e 20 20 54 68 65 20 68 61 6e 64 6c 65  ler.  The handle
ae80: 20 74 6f 20 74 68 65 20 6f 70 65 6e 65 64 20 64   to the opened d
ae90: 61 74 61 62 61 73 65 20 77 69 6c 6c 20 62 65 20  atabase will be 
aea0: 73 74 6f 72 65 64 20 74 68 65 72 65 2e 0d 0a 20  stored there... 
aeb0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 75 70       #..      up
aec0: 76 61 72 20 31 20 24 76 61 72 4e 61 6d 65 20 64  var 1 $varName d
aed0: 62 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  b....      #..  
aee0: 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 74 61 72      # NOTE: Star
aef0: 74 20 62 75 69 6c 64 69 6e 67 20 74 68 65 20 63  t building the c
af00: 6f 6e 6e 65 63 74 69 6f 6e 20 73 74 72 69 6e 67  onnection string
af10: 2e 20 20 54 68 65 20 6f 6e 6c 79 20 72 65 71 75  .  The only requ
af20: 69 72 65 64 20 70 6f 72 74 69 6f 6e 0d 0a 20 20  ired portion..  
af30: 20 20 20 20 23 20 20 20 20 20 20 20 6f 66 20 74      #       of t
af40: 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 74  he connection st
af50: 72 69 6e 67 20 69 73 20 74 68 65 20 64 61 74 61  ring is the data
af60: 20 73 6f 75 72 63 65 2c 20 77 68 69 63 68 20 63   source, which c
af70: 6f 6e 74 61 69 6e 73 20 74 68 65 0d 0a 20 20 20  ontains the..   
af80: 20 20 20 23 20 20 20 20 20 20 20 64 61 74 61 62     #       datab
af90: 61 73 65 20 66 69 6c 65 20 6e 61 6d 65 20 69 74  ase file name it
afa0: 73 65 6c 66 2e 20 20 49 66 20 6f 75 72 20 63 61  self.  If our ca
afb0: 6c 6c 65 72 20 77 61 6e 74 73 20 74 6f 20 75 73  ller wants to us
afc0: 65 20 61 20 55 52 49 20 61 73 0d 0a 20 20 20 20  e a URI as..    
afd0: 20 20 23 20 20 20 20 20 20 20 74 68 65 20 64 61    #       the da
afe0: 74 61 20 73 6f 75 72 63 65 2c 20 75 73 65 20 74  ta source, use t
aff0: 68 65 20 46 75 6c 6c 55 72 69 20 63 6f 6e 6e 65  he FullUri conne
b000: 63 74 69 6f 6e 20 73 74 72 69 6e 67 20 70 72 6f  ction string pro
b010: 70 65 72 74 79 20 74 6f 0d 0a 20 20 20 20 20 20  perty to..      
b020: 23 20 20 20 20 20 20 20 70 72 65 76 65 6e 74 20  #       prevent 
b030: 74 68 65 20 64 61 74 61 20 73 6f 75 72 63 65 20  the data source 
b040: 73 74 72 69 6e 67 20 66 72 6f 6d 20 62 65 69 6e  string from bein
b050: 67 20 6d 61 6e 67 6c 65 64 2e 0d 0a 20 20 20 20  g mangled...    
b060: 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 24    #..      if {$
b070: 75 72 69 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  uri} then {..   
b080: 20 20 20 20 20 73 65 74 20 63 6f 6e 6e 65 63 74       set connect
b090: 69 6f 6e 20 7b 46 75 6c 6c 55 72 69 3d 24 7b 66  ion {FullUri=${f
b0a0: 69 6c 65 4e 61 6d 65 7d 7d 0d 0a 20 20 20 20 20  ileName}}..     
b0b0: 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
b0c0: 20 20 20 73 65 74 20 63 6f 6e 6e 65 63 74 69 6f     set connectio
b0d0: 6e 20 7b 44 61 74 61 20 53 6f 75 72 63 65 3d 24  n {Data Source=$
b0e0: 7b 66 69 6c 65 4e 61 6d 65 7d 7d 0d 0a 20 20 20  {fileName}}..   
b0f0: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d     }....      #.
b100: 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53  .      # NOTE: S
b110: 69 6e 63 65 20 74 68 69 73 20 70 72 6f 63 65 64  ince this proced
b120: 75 72 65 20 68 61 73 20 6e 6f 20 73 70 65 63 69  ure has no speci
b130: 61 6c 20 6b 6e 6f 77 6c 65 64 67 65 20 6f 66 20  al knowledge of 
b140: 77 68 61 74 20 74 68 65 20 64 65 66 61 75 6c 74  what the default
b150: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
b160: 73 65 74 74 69 6e 67 20 69 73 20 66 6f 72 20 74  setting is for t
b170: 68 65 20 54 6f 46 75 6c 6c 50 61 74 68 20 63 6f  he ToFullPath co
b180: 6e 6e 65 63 74 69 6f 6e 20 73 74 72 69 6e 67 20  nnection string 
b190: 70 72 6f 70 65 72 79 2c 20 61 6c 77 61 79 73 0d  propery, always.
b1a0: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 61  .      #       a
b1b0: 64 64 20 74 68 65 20 76 61 6c 75 65 20 77 65 20  dd the value we 
b1c0: 6b 6e 6f 77 20 61 62 6f 75 74 20 74 6f 20 74 68  know about to th
b1d0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 74 72  e connection str
b1e0: 69 6e 67 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ing...      #.. 
b1f0: 20 20 20 20 20 61 70 70 65 6e 64 20 63 6f 6e 6e       append conn
b200: 65 63 74 69 6f 6e 20 7b 3b 54 6f 46 75 6c 6c 50  ection {;ToFullP
b210: 61 74 68 3d 24 7b 71 75 61 6c 69 66 79 7d 7d 0d  ath=${qualify}}.
b220: 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
b230: 20 20 23 20 4e 4f 54 45 3a 20 49 66 20 6f 75 72    # NOTE: If our
b240: 20 63 61 6c 6c 65 72 20 73 70 65 63 69 66 69 65   caller specifie
b250: 64 20 61 20 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65  d a journal mode
b260: 2c 20 61 64 64 20 74 68 65 20 6e 65 63 65 73 73  , add the necess
b270: 61 72 79 20 70 6f 72 74 69 6f 6e 0d 0a 20 20 20  ary portion..   
b280: 20 20 20 23 20 20 20 20 20 20 20 6f 66 20 74 68     #       of th
b290: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 74 72  e connection str
b2a0: 69 6e 67 20 6e 6f 77 2e 0d 0a 20 20 20 20 20 20  ing now...      
b2b0: 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 73 74  #..      if {[st
b2c0: 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 6d 6f 64  ring length $mod
b2d0: 65 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  e] > 0} then {..
b2e0: 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 20 63          append c
b2f0: 6f 6e 6e 65 63 74 69 6f 6e 20 7b 3b 4a 6f 75 72  onnection {;Jour
b300: 6e 61 6c 20 4d 6f 64 65 3d 24 7b 6d 6f 64 65 7d  nal Mode=${mode}
b310: 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  }..      }....  
b320: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
b330: 4f 54 45 3a 20 49 66 20 6f 75 72 20 63 61 6c 6c  OTE: If our call
b340: 65 72 20 73 70 65 63 69 66 69 65 64 20 61 20 44  er specified a D
b350: 61 74 65 54 69 6d 65 20 66 6f 72 6d 61 74 2c 20  ateTime format, 
b360: 61 64 64 20 74 68 65 20 6e 65 63 65 73 73 61 72  add the necessar
b370: 79 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  y..      #      
b380: 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65 20   portion of the 
b390: 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 74 72 69 6e  connection strin
b3a0: 67 20 6e 6f 77 2e 0d 0a 20 20 20 20 20 20 23 0d  g now...      #.
b3b0: 0a 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69  .      if {[stri
b3c0: 6e 67 20 6c 65 6e 67 74 68 20 24 64 61 74 65 54  ng length $dateT
b3d0: 69 6d 65 46 6f 72 6d 61 74 5d 20 3e 20 30 7d 20  imeFormat] > 0} 
b3e0: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
b3f0: 61 70 70 65 6e 64 20 63 6f 6e 6e 65 63 74 69 6f  append connectio
b400: 6e 20 7b 3b 44 61 74 65 54 69 6d 65 46 6f 72 6d  n {;DateTimeForm
b410: 61 74 3d 24 7b 64 61 74 65 54 69 6d 65 46 6f 72  at=${dateTimeFor
b420: 6d 61 74 7d 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a  mat}}..      }..
b430: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
b440: 20 23 20 4e 4f 54 45 3a 20 49 66 20 6f 75 72 20   # NOTE: If our 
b450: 63 61 6c 6c 65 72 20 73 70 65 63 69 66 69 65 64  caller specified
b460: 20 61 20 44 61 74 65 54 69 6d 65 4b 69 6e 64 2c   a DateTimeKind,
b470: 20 61 64 64 20 74 68 65 20 6e 65 63 65 73 73 61   add the necessa
b480: 72 79 20 70 6f 72 74 69 6f 6e 0d 0a 20 20 20 20  ry portion..    
b490: 20 20 23 20 20 20 20 20 20 20 6f 66 20 74 68 65    #       of the
b4a0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 74 72 69   connection stri
b4b0: 6e 67 20 6e 6f 77 2e 0d 0a 20 20 20 20 20 20 23  ng now...      #
b4c0: 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72  ..      if {[str
b4d0: 69 6e 67 20 6c 65 6e 67 74 68 20 24 64 61 74 65  ing length $date
b4e0: 54 69 6d 65 4b 69 6e 64 5d 20 3e 20 30 7d 20 74  TimeKind] > 0} t
b4f0: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 61  hen {..        a
b500: 70 70 65 6e 64 20 63 6f 6e 6e 65 63 74 69 6f 6e  ppend connection
b510: 20 7b 3b 44 61 74 65 54 69 6d 65 4b 69 6e 64 3d   {;DateTimeKind=
b520: 24 7b 64 61 74 65 54 69 6d 65 4b 69 6e 64 7d 7d  ${dateTimeKind}}
b530: 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
b540: 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
b550: 54 45 3a 20 49 66 20 74 68 65 72 65 20 61 72 65  TE: If there are
b560: 20 61 6e 79 20 67 6c 6f 62 61 6c 20 28 70 65 72   any global (per
b570: 20 74 65 73 74 20 72 75 6e 29 20 63 6f 6e 6e 65   test run) conne
b580: 63 74 69 6f 6e 20 66 6c 61 67 73 20 63 75 72 72  ction flags curr
b590: 65 6e 74 6c 79 0d 0a 20 20 20 20 20 20 23 20 20  ently..      #  
b5a0: 20 20 20 20 20 73 65 74 2c 20 75 73 65 20 74 68       set, use th
b5b0: 65 6d 20 6e 6f 77 20 28 69 2e 65 2e 20 62 79 20  em now (i.e. by 
b5c0: 63 6f 6d 62 69 6e 69 6e 67 20 74 68 65 6d 20 77  combining them w
b5d0: 69 74 68 20 74 68 65 20 6f 6e 65 73 20 66 6f 72  ith the ones for
b5e0: 20 74 68 69 73 0d 0a 20 20 20 20 20 20 23 20 20   this..      #  
b5f0: 20 20 20 20 20 63 6f 6e 6e 65 63 74 69 6f 6e 29       connection)
b600: 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
b610: 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73    if {[info exis
b620: 74 73 20 3a 3a 63 6f 6e 6e 65 63 74 69 6f 6e 5f  ts ::connection_
b630: 66 6c 61 67 73 5d 20 26 26 20 5c 0d 0a 20 20 20  flags] && \..   
b640: 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c         [string l
b650: 65 6e 67 74 68 20 24 3a 3a 63 6f 6e 6e 65 63 74  ength $::connect
b660: 69 6f 6e 5f 66 6c 61 67 73 5d 20 3e 20 30 7d 20  ion_flags] > 0} 
b670: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
b680: 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
b690: 45 3a 20 53 68 6f 77 20 28 61 6e 64 20 6c 6f 67  E: Show (and log
b6a0: 29 20 74 68 61 74 20 77 65 20 64 65 74 65 63 74  ) that we detect
b6b0: 65 64 20 73 6f 6d 65 20 67 6c 6f 62 61 6c 20 63  ed some global c
b6c0: 6f 6e 6e 65 63 74 69 6f 6e 20 66 6c 61 67 73 2e  onnection flags.
b6d0: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
b6e0: 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
b6f0: 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
b700: 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
b710: 20 20 20 20 20 20 22 2d 2d 2d 2d 20 67 6c 6f 62        "---- glob
b720: 61 6c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 6c  al connection fl
b730: 61 67 73 20 64 65 74 65 63 74 65 64 3a 20 22 20  ags detected: " 
b740: 24 3a 3a 63 6f 6e 6e 65 63 74 69 6f 6e 5f 66 6c  $::connection_fl
b750: 61 67 73 20 5c 6e 5d 0d 0a 0d 0a 20 20 20 20 20  ags \n]....     
b760: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
b770: 4e 4f 54 45 3a 20 43 6f 6d 62 69 6e 65 20 61 6e  NOTE: Combine an
b780: 64 2f 6f 72 20 72 65 70 6c 61 63 65 20 74 68 65  d/or replace the
b790: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 6c 61 67   connection flag
b7a0: 73 20 61 6e 64 20 74 68 65 6e 20 73 68 6f 77 20  s and then show 
b7b0: 74 68 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20  the..        #  
b7c0: 20 20 20 20 20 6e 65 77 20 76 61 6c 75 65 2e 0d       new value..
b7d0: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
b7e0: 20 20 20 20 73 65 74 20 66 6c 61 67 73 20 5b 63      set flags [c
b7f0: 6f 6d 62 69 6e 65 46 6c 61 67 73 20 24 66 6c 61  ombineFlags $fla
b800: 67 73 20 24 3a 3a 63 6f 6e 6e 65 63 74 69 6f 6e  gs $::connection
b810: 5f 66 6c 61 67 73 5d 0d 0a 0d 0a 20 20 20 20 20  _flags]....     
b820: 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
b830: 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  _channel [append
b840: 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
b850: 20 20 20 20 22 2d 2d 2d 2d 20 63 6f 6d 62 69 6e      "---- combin
b860: 65 64 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 6c  ed connection fl
b870: 61 67 73 20 61 72 65 3a 20 22 20 24 66 6c 61 67  ags are: " $flag
b880: 73 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a  s \n]..      }..
b890: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
b8a0: 20 23 20 4e 4f 54 45 3a 20 49 66 20 6f 75 72 20   # NOTE: If our 
b8b0: 63 61 6c 6c 65 72 20 73 70 65 63 69 66 69 65 64  caller specified
b8c0: 20 73 6f 6d 65 20 53 51 4c 69 74 65 43 6f 6e 6e   some SQLiteConn
b8d0: 65 63 74 69 6f 6e 46 6c 61 67 73 2c 20 61 64 64  ectionFlags, add
b8e0: 20 74 68 65 0d 0a 20 20 20 20 20 20 23 20 20 20   the..      #   
b8f0: 20 20 20 20 6e 65 63 65 73 73 61 72 79 20 70 6f      necessary po
b900: 72 74 69 6f 6e 20 6f 66 20 74 68 65 20 63 6f 6e  rtion of the con
b910: 6e 65 63 74 69 6f 6e 20 73 74 72 69 6e 67 20 6e  nection string n
b920: 6f 77 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  ow...      #..  
b930: 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20      if {[string 
b940: 6c 65 6e 67 74 68 20 24 66 6c 61 67 73 5d 20 3e  length $flags] >
b950: 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
b960: 20 20 20 20 61 70 70 65 6e 64 20 63 6f 6e 6e 65      append conne
b970: 63 74 69 6f 6e 20 7b 3b 46 6c 61 67 73 3d 24 7b  ction {;Flags=${
b980: 66 6c 61 67 73 7d 7d 0d 0a 20 20 20 20 20 20 7d  flags}}..      }
b990: 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  ....      #..   
b9a0: 20 20 20 23 20 4e 4f 54 45 3a 20 49 66 20 6f 75     # NOTE: If ou
b9b0: 72 20 63 61 6c 6c 65 72 20 73 70 65 63 69 66 69  r caller specifi
b9c0: 65 64 20 61 6e 20 65 78 74 72 61 20 70 61 79 6c  ed an extra payl
b9d0: 6f 61 64 20 74 6f 20 74 68 65 20 63 6f 6e 6e 65  oad to the conne
b9e0: 63 74 69 6f 6e 0d 0a 20 20 20 20 20 20 23 20 20  ction..      #  
b9f0: 20 20 20 20 20 73 74 72 69 6e 67 2c 20 61 70 70       string, app
ba00: 65 6e 64 20 69 74 20 6e 6f 77 2e 0d 0a 20 20 20  end it now...   
ba10: 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
ba20: 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
ba30: 65 78 74 72 61 5d 20 3e 20 30 7d 20 74 68 65 6e  extra] > 0} then
ba40: 20 7b 0d 0a 20 20 20 20 20 20 20 20 61 70 70 65   {..        appe
ba50: 6e 64 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 5c 3b  nd connection \;
ba60: 20 24 65 78 74 72 61 0d 0a 20 20 20 20 20 20 7d   $extra..      }
ba70: 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  ....      #..   
ba80: 20 20 20 23 20 4e 4f 54 45 3a 20 4f 70 65 6e 20     # NOTE: Open 
ba90: 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e  the database con
baa0: 6e 65 63 74 69 6f 6e 20 6e 6f 77 2c 20 70 6c 61  nection now, pla
bab0: 63 69 6e 67 20 74 68 65 20 6f 70 61 71 75 65 20  cing the opaque 
bac0: 68 61 6e 64 6c 65 20 76 61 6c 75 65 0d 0a 20 20  handle value..  
bad0: 20 20 20 20 23 20 20 20 20 20 20 20 69 6e 74 6f      #       into
bae0: 20 74 68 65 20 76 61 72 69 61 62 6c 65 20 73 70   the variable sp
baf0: 65 63 69 66 69 65 64 20 62 79 20 6f 75 72 20 63  ecified by our c
bb00: 61 6c 6c 65 72 2e 0d 0a 20 20 20 20 20 20 23 0d  aller...      #.
bb10: 0a 20 20 20 20 20 20 73 65 74 20 64 62 20 5b 73  .      set db [s
bb20: 71 6c 20 6f 70 65 6e 20 2d 74 79 70 65 20 53 51  ql open -type SQ
bb30: 4c 69 74 65 20 5b 73 75 62 73 74 20 24 63 6f 6e  Lite [subst $con
bb40: 6e 65 63 74 69 6f 6e 5d 5d 0d 0a 0d 0a 20 20 20  nection]]....   
bb50: 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
bb60: 54 45 3a 20 43 6f 6e 66 69 67 75 72 65 20 74 68  TE: Configure th
bb70: 65 20 74 65 6d 70 6f 72 61 72 79 20 64 69 72 65  e temporary dire
bb80: 63 74 6f 72 79 20 66 6f 72 20 74 68 65 20 6e 65  ctory for the ne
bb90: 77 6c 79 20 6f 70 65 6e 65 64 20 64 61 74 61 62  wly opened datab
bba0: 61 73 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ase..      #    
bbb0: 20 20 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6e 6f     connection no
bbc0: 77 20 75 6e 6c 65 73 73 20 6f 75 72 20 63 61 6c  w unless our cal
bbd0: 6c 65 72 20 66 6f 72 62 69 64 73 20 69 74 2e 0d  ler forbids it..
bbe0: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
bbf0: 69 66 20 7b 24 74 65 6d 70 6f 72 61 72 79 20 26  if {$temporary &
bc00: 26 20 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20  & ![info exists 
bc10: 3a 3a 6e 6f 28 73 65 74 54 65 6d 70 6f 72 61 72  ::no(setTemporar
bc20: 79 44 69 72 65 63 74 6f 72 79 29 5d 7d 20 74 68  yDirectory)]} th
bc30: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 71  en {..        sq
bc40: 6c 20 65 78 65 63 75 74 65 20 24 64 62 20 5b 61  l execute $db [a
bc50: 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
bc60: 20 20 20 20 20 20 20 20 20 22 50 52 41 47 4d 41           "PRAGMA
bc70: 20 74 65 6d 70 5f 73 74 6f 72 65 5f 64 69 72 65   temp_store_dire
bc80: 63 74 6f 72 79 20 3d 20 5c 22 22 20 5b 67 65 74  ctory = \"" [get
bc90: 54 65 6d 70 6f 72 61 72 79 44 69 72 65 63 74 6f  TemporaryDirecto
bca0: 72 79 5d 20 5c 22 5c 3b 5d 0d 0a 20 20 20 20 20  ry] \"\;]..     
bcb0: 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20   }....      #.. 
bcc0: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 6c 77       # NOTE: Alw
bcd0: 61 79 73 20 72 65 74 75 72 6e 20 74 68 65 20 63  ays return the c
bce0: 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 6e 64 6c 65  onnection handle
bcf0: 20 75 70 6f 6e 20 73 75 63 63 65 73 73 2e 0d 0a   upon success...
bd00: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 72        #..      r
bd10: 65 74 75 72 6e 20 24 64 62 0d 0a 20 20 20 20 7d  eturn $db..    }
bd20: 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65  .....    proc ge
bd30: 74 44 62 43 6f 6e 6e 65 63 74 69 6f 6e 20 7b 20  tDbConnection { 
bd40: 7b 76 61 72 4e 61 6d 65 20 64 62 7d 20 7d 20 7b  {varName db} } {
bd50: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
bd60: 20 23 20 4e 4f 54 45 3a 20 52 65 66 65 72 20 74   # NOTE: Refer t
bd70: 6f 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  o the specified 
bd80: 76 61 72 69 61 62 6c 65 20 28 65 2e 67 2e 20 22  variable (e.g. "
bd90: 64 62 22 29 20 69 6e 20 74 68 65 20 63 6f 6e 74  db") in the cont
bda0: 65 78 74 20 6f 66 20 6f 75 72 0d 0a 20 20 20 20  ext of our..    
bdb0: 20 20 23 20 20 20 20 20 20 20 63 61 6c 6c 65 72    #       caller
bdc0: 2e 20 20 54 68 65 20 68 61 6e 64 6c 65 20 74 6f  .  The handle to
bdd0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 70 72   the database pr
bde0: 65 76 69 6f 75 73 6c 79 20 6f 70 65 6e 65 64 20  eviously opened 
bdf0: 76 69 61 20 74 68 65 0d 0a 20 20 20 20 20 20 23  via the..      #
be00: 20 20 20 20 20 20 20 5b 73 65 74 75 70 44 62 5d         [setupDb]
be10: 20 70 72 6f 63 65 64 75 72 65 20 73 68 6f 75 6c   procedure shoul
be20: 64 20 62 65 20 73 74 6f 72 65 64 20 74 68 65 72  d be stored ther
be30: 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  e...      #..   
be40: 20 20 20 75 70 76 61 72 20 31 20 24 76 61 72 4e     upvar 1 $varN
be50: 61 6d 65 20 64 62 0d 0a 0d 0a 20 20 20 20 20 20  ame db....      
be60: 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
be70: 20 54 68 69 73 20 72 65 74 75 72 6e 73 20 74 68   This returns th
be80: 65 20 41 44 4f 2e 4e 45 54 20 49 44 62 43 6f 6e  e ADO.NET IDbCon
be90: 6e 65 63 74 69 6f 6e 20 6f 62 6a 65 63 74 20 69  nection object i
bea0: 6e 73 74 61 6e 63 65 20 66 6f 72 20 74 68 65 0d  nstance for the.
beb0: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 73  .      #       s
bec0: 70 65 63 69 66 69 65 64 20 64 61 74 61 62 73 65  pecified databse
bed0: 20 68 61 6e 64 6c 65 2e 20 20 53 69 6e 63 65 20   handle.  Since 
bee0: 67 65 74 74 69 6e 67 20 74 68 69 73 20 6f 62 6a  getting this obj
bef0: 65 63 74 20 72 65 6c 69 65 73 20 75 70 6f 6e 0d  ect relies upon.
bf00: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 45  .      #       E
bf10: 61 67 6c 65 20 69 6e 74 65 72 6e 61 6c 73 2c 20  agle internals, 
bf20: 67 72 65 61 74 20 63 61 72 65 20 73 68 6f 75 6c  great care shoul
bf30: 64 20 62 65 20 74 61 6b 65 6e 20 74 6f 20 61 76  d be taken to av
bf40: 6f 69 64 20 64 69 73 70 6f 73 69 6e 67 20 6f 66  oid disposing of
bf50: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
bf60: 74 68 69 73 20 6f 62 6a 65 63 74 20 6f 72 20 6f  this object or o
bf70: 74 68 65 72 77 69 73 65 20 70 75 74 74 69 6e 67  therwise putting
bf80: 20 69 74 20 69 6e 74 6f 20 61 6e 20 69 6e 76 61   it into an inva
bf90: 6c 69 64 20 73 74 61 74 65 2e 0d 0a 20 20 20 20  lid state...    
bfa0: 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b    #..      if {[
bfb0: 69 6e 66 6f 20 65 78 69 73 74 73 20 64 62 5d 7d  info exists db]}
bfc0: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
bfd0: 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20   if {[catch {.. 
bfe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f                 o
bff0: 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c  bject invoke -fl
c000: 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 2d  ags +NonPublic -
c010: 6f 62 6a 65 63 74 66 6c 61 67 73 20 2b 4e 6f 44  objectflags +NoD
c020: 69 73 70 6f 73 65 20 5c 0d 0a 20 20 20 20 20 20  ispose \..      
c030: 20 20 20 20 20 20 20 20 20 20 2d 61 6c 69 61 73            -alias
c040: 20 49 6e 74 65 72 70 72 65 74 65 72 2e 47 65 74   Interpreter.Get
c050: 41 63 74 69 76 65 2e 63 6f 6e 6e 65 63 74 69 6f  Active.connectio
c060: 6e 73 20 49 74 65 6d 20 24 64 62 7d 20 5c 0d 0a  ns Item $db} \..
c070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c080: 72 65 73 75 6c 74 5d 20 3d 3d 20 30 7d 20 74 68  result] == 0} th
c090: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
c0a0: 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e  #..          # N
c0b0: 4f 54 45 3a 20 53 75 63 63 65 73 73 2c 20 72 65  OTE: Success, re
c0c0: 74 75 72 6e 20 74 68 65 20 6f 70 61 71 75 65 20  turn the opaque 
c0d0: 6f 62 6a 65 63 74 20 68 61 6e 64 6c 65 2e 0d 0a  object handle...
c0e0: 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
c0f0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 72         return $r
c100: 65 73 75 6c 74 0d 0a 20 20 20 20 20 20 20 20 7d  esult..        }
c110: 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
c120: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
c130: 23 20 4e 4f 54 45 3a 20 46 61 69 6c 75 72 65 2c  # NOTE: Failure,
c140: 20 72 65 70 6f 72 74 20 77 68 79 2e 0d 0a 20 20   report why...  
c150: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
c160: 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
c170: 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
c180: 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
c190: 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41          "==== WA
c1a0: 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20 74 6f  RNING: failed to
c1b0: 20 67 65 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   get connection 
c1c0: 68 61 6e 64 6c 65 20 66 6f 72 20 64 61 74 61 62  handle for datab
c1d0: 61 73 65 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20  ase \"" \..     
c1e0: 20 20 20 20 20 20 20 20 20 24 64 62 20 22 5c 22           $db "\"
c1f0: 2c 20 65 72 72 6f 72 3a 20 22 20 5c 6e 5c 74 20  , error: " \n\t 
c200: 24 72 65 73 75 6c 74 20 5c 6e 5d 0d 0a 20 20 20  $result \n]..   
c210: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d       }..      }.
c220: 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70  .    }.....    p
c230: 72 6f 63 20 66 72 65 65 44 62 43 6f 6e 6e 65 63  roc freeDbConnec
c240: 74 69 6f 6e 20 7b 20 7b 76 61 72 4e 61 6d 65 20  tion { {varName 
c250: 63 6f 6e 6e 65 63 74 69 6f 6e 7d 20 7d 20 7b 0d  connection} } {.
c260: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
c270: 23 20 4e 4f 54 45 3a 20 52 65 66 65 72 20 74 6f  # NOTE: Refer to
c280: 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 76   the specified v
c290: 61 72 69 61 62 6c 65 20 28 65 2e 67 2e 20 22 63  ariable (e.g. "c
c2a0: 6f 6e 6e 65 63 74 69 6f 6e 22 29 20 69 6e 20 74  onnection") in t
c2b0: 68 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  he..      #     
c2c0: 20 20 63 6f 6e 74 65 78 74 20 6f 66 20 6f 75 72    context of our
c2d0: 20 63 61 6c 6c 65 72 2e 20 20 54 68 65 20 6f 70   caller.  The op
c2e0: 61 71 75 65 20 6f 62 6a 65 63 74 20 68 61 6e 64  aque object hand
c2f0: 6c 65 20 66 6f 72 20 61 6e 20 41 44 4f 2e 4e 45  le for an ADO.NE
c300: 54 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  T..      #      
c310: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 72 65 76   connection prev
c320: 69 6f 75 73 6c 79 20 72 65 74 75 72 6e 65 64 20  iously returned 
c330: 62 79 20 5b 67 65 74 44 62 43 6f 6e 6e 65 63 74  by [getDbConnect
c340: 69 6f 6e 5d 20 73 68 6f 75 6c 64 20 62 65 0d 0a  ion] should be..
c350: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 73 74        #       st
c360: 6f 72 65 64 20 74 68 65 72 65 2e 0d 0a 20 20 20  ored there...   
c370: 20 20 20 23 0d 0a 20 20 20 20 20 20 75 70 76 61     #..      upva
c380: 72 20 31 20 24 76 61 72 4e 61 6d 65 20 63 6f 6e  r 1 $varName con
c390: 6e 65 63 74 69 6f 6e 0d 0a 0d 0a 20 20 20 20 20  nection....     
c3a0: 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
c3b0: 3a 20 41 74 74 65 6d 70 74 20 74 6f 20 72 65 6d  : Attempt to rem
c3c0: 6f 76 65 20 74 68 65 20 6f 70 61 71 75 65 20 6f  ove the opaque o
c3d0: 62 6a 65 63 74 20 68 61 6e 64 6c 65 20 66 72 6f  bject handle fro
c3e0: 6d 20 74 68 65 20 69 6e 74 65 72 70 72 65 74 65  m the interprete
c3f0: 72 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  r..      #      
c400: 20 6e 6f 77 2e 20 20 54 68 69 73 20 5b 6f 62 6a   now.  This [obj
c410: 65 63 74 20 64 69 73 70 6f 73 65 5d 20 63 61 6c  ect dispose] cal
c420: 6c 20 77 69 6c 6c 20 6e 6f 74 20 61 63 74 75 61  l will not actua
c430: 6c 6c 79 20 64 69 73 70 6f 73 65 20 6f 66 20 74  lly dispose of t
c440: 68 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  he..      #     
c450: 20 20 75 6e 64 65 72 6c 79 69 6e 67 20 6f 62 6a    underlying obj
c460: 65 63 74 20 62 65 63 61 75 73 65 20 74 68 65 20  ect because the 
c470: 2b 4e 6f 44 69 73 70 6f 73 65 20 66 6c 61 67 20  +NoDispose flag 
c480: 77 61 73 20 73 65 74 20 6f 6e 20 69 74 0d 0a 20  was set on it.. 
c490: 20 20 20 20 20 23 20 20 20 20 20 20 20 64 75 72       #       dur
c4a0: 69 6e 67 20 63 72 65 61 74 69 6f 6e 20 6f 66 20  ing creation of 
c4b0: 74 68 65 20 6f 70 61 71 75 65 20 6f 62 6a 65 63  the opaque objec
c4c0: 74 20 68 61 6e 64 6c 65 2e 0d 0a 20 20 20 20 20  t handle...     
c4d0: 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69   #..      if {[i
c4e0: 6e 66 6f 20 65 78 69 73 74 73 20 63 6f 6e 6e 65  nfo exists conne
c4f0: 63 74 69 6f 6e 5d 20 26 26 20 5c 0d 0a 20 20 20  ction] && \..   
c500: 20 20 20 20 20 20 20 5b 63 61 74 63 68 20 7b 6f         [catch {o
c510: 62 6a 65 63 74 20 64 69 73 70 6f 73 65 20 24 63  bject dispose $c
c520: 6f 6e 6e 65 63 74 69 6f 6e 7d 20 65 72 72 6f 72  onnection} error
c530: 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
c540: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
c550: 4e 4f 54 45 3a 20 57 65 20 73 6f 6d 65 68 6f 77  NOTE: We somehow
c560: 20 66 61 69 6c 65 64 20 74 6f 20 72 65 6d 6f 76   failed to remov
c570: 65 20 74 68 65 20 68 61 6e 64 6c 65 2c 20 72 65  e the handle, re
c580: 70 6f 72 74 20 77 68 79 2e 0d 0a 20 20 20 20 20  port why...     
c590: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 74 70     #..        tp
c5a0: 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  uts $::test_chan
c5b0: 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
c5c0: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22  \..            "
c5d0: 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61  ==== WARNING: fa
c5e0: 69 6c 65 64 20 74 6f 20 72 65 6d 6f 76 65 20 63  iled to remove c
c5f0: 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 6e 64 6c 65  onnection handle
c600: 20 5c 22 22 20 24 63 6f 6e 6e 65 63 74 69 6f 6e   \"" $connection
c610: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
c620: 22 5c 22 2c 20 65 72 72 6f 72 3a 20 22 20 5c 6e  "\", error: " \n
c630: 5c 74 20 24 65 72 72 6f 72 20 5c 6e 5d 0d 0a 20  \t $error \n].. 
c640: 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c       }..    }...
c650: 0d 0a 20 20 20 20 70 72 6f 63 20 61 64 64 44 62  ..    proc addDb
c660: 43 6f 6e 6e 65 63 74 69 6f 6e 20 7b 20 63 6f 6e  Connection { con
c670: 6e 65 63 74 69 6f 6e 20 7b 76 61 72 4e 61 6d 65  nection {varName
c680: 20 64 62 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20   db} } {..      
c690: 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
c6a0: 20 52 65 66 65 72 20 74 6f 20 74 68 65 20 73 70   Refer to the sp
c6b0: 65 63 69 66 69 65 64 20 76 61 72 69 61 62 6c 65  ecified variable
c6c0: 20 28 65 2e 67 2e 20 22 64 62 22 29 20 69 6e 20   (e.g. "db") in 
c6d0: 74 68 65 20 63 6f 6e 74 65 78 74 20 6f 66 20 6f  the context of o
c6e0: 75 72 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  ur..      #     
c6f0: 20 20 63 61 6c 6c 65 72 2e 0d 0a 20 20 20 20 20    caller...     
c700: 20 23 0d 0a 20 20 20 20 20 20 75 70 76 61 72 20   #..      upvar 
c710: 31 20 24 76 61 72 4e 61 6d 65 20 64 62 0d 0a 0d  1 $varName db...
c720: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
c730: 23 20 4e 4f 54 45 3a 20 43 72 65 61 74 65 20 61  # NOTE: Create a
c740: 20 63 6f 72 72 65 63 74 6c 79 20 66 6f 72 6d 61   correctly forma
c750: 74 74 65 64 20 6e 61 6d 65 20 66 6f 72 20 74 68  tted name for th
c760: 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
c770: 63 74 69 6f 6e 20 74 6f 0d 0a 20 20 20 20 20 20  ction to..      
c780: 23 20 20 20 20 20 20 20 62 65 20 61 64 64 65 64  #       be added
c790: 20 74 6f 20 74 68 65 20 6c 69 73 74 20 6d 61 6e   to the list man
c7a0: 61 67 65 64 20 62 79 20 74 68 65 20 45 61 67 6c  aged by the Eagl
c7b0: 65 20 69 6e 74 65 72 70 72 65 74 65 72 2e 0d 0a  e interpreter...
c7c0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 73        #..      s
c7d0: 65 74 20 64 62 20 5b 6f 62 6a 65 63 74 20 69 6e  et db [object in
c7e0: 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e  voke -flags +Non
c7f0: 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20  Public \..      
c800: 20 20 20 20 45 61 67 6c 65 2e 5f 43 6f 6d 70 6f      Eagle._Compo
c810: 6e 65 6e 74 73 2e 50 72 69 76 61 74 65 2e 46 6f  nents.Private.Fo
c820: 72 6d 61 74 4f 70 73 20 44 61 74 61 62 61 73 65  rmatOps Database
c830: 4f 62 6a 65 63 74 4e 61 6d 65 20 24 63 6f 6e 6e  ObjectName $conn
c840: 65 63 74 69 6f 6e 20 5c 0d 0a 20 20 20 20 20 20  ection \..      
c850: 20 20 20 20 53 51 4c 69 74 65 43 6f 6e 6e 65 63      SQLiteConnec
c860: 74 69 6f 6e 20 5b 6f 62 6a 65 63 74 20 69 6e 76  tion [object inv
c870: 6f 6b 65 20 49 6e 74 65 72 70 72 65 74 65 72 2e  oke Interpreter.
c880: 47 65 74 41 63 74 69 76 65 20 4e 65 78 74 49 64  GetActive NextId
c890: 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ]]....      #.. 
c8a0: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 64 64       # NOTE: Add
c8b0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   the database co
c8c0: 6e 6e 65 63 74 69 6f 6e 20 70 72 6f 76 69 64 65  nnection provide
c8d0: 64 20 62 79 20 6f 75 72 20 63 61 6c 6c 65 72 20  d by our caller 
c8e0: 74 6f 20 74 68 65 20 6c 69 73 74 0d 0a 20 20 20  to the list..   
c8f0: 20 20 20 23 20 20 20 20 20 20 20 6f 66 20 74 68     #       of th
c900: 6f 73 65 20 6b 6e 6f 77 6e 20 74 6f 20 74 68 65  ose known to the
c910: 20 45 61 67 6c 65 20 69 6e 74 65 72 70 72 65 74   Eagle interpret
c920: 65 72 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  er...      #..  
c930: 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b      object invok
c940: 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62  e -flags +NonPub
c950: 6c 69 63 20 49 6e 74 65 72 70 72 65 74 65 72 2e  lic Interpreter.
c960: 47 65 74 41 63 74 69 76 65 2e 63 6f 6e 6e 65 63  GetActive.connec
c970: 74 69 6f 6e 73 20 41 64 64 20 5c 0d 0a 20 20 20  tions Add \..   
c980: 20 20 20 20 20 20 20 24 64 62 20 24 63 6f 6e 6e         $db $conn
c990: 65 63 74 69 6f 6e 0d 0a 20 20 20 20 7d 0d 0a 0c  ection..    }...
c9a0: 0d 0a 20 20 20 20 70 72 6f 63 20 63 6c 65 61 6e  ..    proc clean
c9b0: 75 70 44 62 20 7b 20 66 69 6c 65 4e 61 6d 65 20  upDb { fileName 
c9c0: 7b 76 61 72 4e 61 6d 65 20 64 62 7d 20 7b 63 6f  {varName db} {co
c9d0: 6c 6c 65 63 74 20 74 72 75 65 7d 20 7b 71 75 61  llect true} {qua
c9e0: 6c 69 66 79 20 74 72 75 65 7d 0d 0a 20 20 20 20  lify true}..    
c9f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ca00: 20 7b 64 65 6c 65 74 65 20 74 72 75 65 7d 20 7d   {delete true} }
ca10: 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20   {..      #..   
ca20: 20 20 20 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d     # NOTE: Attem
ca30: 70 74 20 74 6f 20 66 6f 72 63 65 20 61 6c 6c 20  pt to force all 
ca40: 70 65 6e 64 69 6e 67 20 22 67 61 72 62 61 67 65  pending "garbage
ca50: 22 20 6f 62 6a 65 63 74 73 20 74 6f 20 62 65 20  " objects to be 
ca60: 63 6f 6c 6c 65 63 74 65 64 2c 0d 0a 20 20 20 20  collected,..    
ca70: 20 20 23 20 20 20 20 20 20 20 69 6e 63 6c 75 64    #       includ
ca80: 69 6e 67 20 53 51 4c 69 74 65 20 73 74 61 74 65  ing SQLite state
ca90: 6d 65 6e 74 73 20 61 6e 64 20 62 61 63 6b 75 70  ments and backup
caa0: 20 6f 62 6a 65 63 74 73 3b 20 74 68 69 73 20 73   objects; this s
cab0: 68 6f 75 6c 64 20 61 6c 6c 6f 77 0d 0a 20 20 20  hould allow..   
cac0: 20 20 20 23 20 20 20 20 20 20 20 74 68 65 20 75     #       the u
cad0: 6e 64 65 72 6c 79 69 6e 67 20 64 61 74 61 62 61  nderlying databa
cae0: 73 65 20 66 69 6c 65 20 74 6f 20 62 65 20 64 65  se file to be de
caf0: 6c 65 74 65 64 2e 0d 0a 20 20 20 20 20 20 23 0d  leted...      #.
cb00: 0a 20 20 20 20 20 20 69 66 20 7b 24 63 6f 6c 6c  .      if {$coll
cb10: 65 63 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  ect} then {..   
cb20: 20 20 20 20 20 63 6f 6c 6c 65 63 74 47 61 72 62       collectGarb
cb30: 61 67 65 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  age $::test_chan
cb40: 6e 65 6c 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a  nel..      }....
cb50: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
cb60: 20 4e 4f 54 45 3a 20 52 65 66 65 72 20 74 6f 20   NOTE: Refer to 
cb70: 74 68 65 20 73 70 65 63 69 66 69 65 64 20 76 61  the specified va
cb80: 72 69 61 62 6c 65 20 28 65 2e 67 2e 20 22 64 62  riable (e.g. "db
cb90: 22 29 20 69 6e 20 74 68 65 20 63 6f 6e 74 65 78  ") in the contex
cba0: 74 20 6f 66 20 6f 75 72 0d 0a 20 20 20 20 20 20  t of our..      
cbb0: 23 20 20 20 20 20 20 20 63 61 6c 6c 65 72 2e 20  #       caller. 
cbc0: 20 54 68 65 20 68 61 6e 64 6c 65 20 74 6f 20 74   The handle to t
cbd0: 68 65 20 64 61 74 61 62 61 73 65 20 70 72 65 76  he database prev
cbe0: 69 6f 75 73 6c 79 20 6f 70 65 6e 65 64 20 76 69  iously opened vi
cbf0: 61 20 74 68 65 0d 0a 20 20 20 20 20 20 23 20 20  a the..      #  
cc00: 20 20 20 20 20 5b 73 65 74 75 70 44 62 5d 20 70       [setupDb] p
cc10: 72 6f 63 65 64 75 72 65 20 73 68 6f 75 6c 64 20  rocedure should 
cc20: 62 65 20 73 74 6f 72 65 64 20 74 68 65 72 65 2e  be stored there.
cc30: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
cc40: 20 75 70 76 61 72 20 31 20 24 76 61 72 4e 61 6d   upvar 1 $varNam
cc50: 65 20 64 62 0d 0a 0d 0a 20 20 20 20 20 20 23 0d  e db....      #.
cc60: 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43  .      # NOTE: C
cc70: 6c 6f 73 65 20 74 68 65 20 63 6f 6e 6e 65 63 74  lose the connect
cc80: 69 6f 6e 20 74 6f 20 74 68 65 20 64 61 74 61 62  ion to the datab
cc90: 61 73 65 20 6e 6f 77 2e 20 20 54 68 69 73 20 73  ase now.  This s
cca0: 68 6f 75 6c 64 20 61 6c 6c 6f 77 20 75 73 0d 0a  hould allow us..
ccb0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74 6f        #       to
ccc0: 20 64 65 6c 65 74 65 20 74 68 65 20 75 6e 64 65   delete the unde
ccd0: 72 6c 79 69 6e 67 20 64 61 74 61 62 61 73 65 20  rlying database 
cce0: 66 69 6c 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  file...      #..
ccf0: 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20        if {[info 
cd00: 65 78 69 73 74 73 20 64 62 5d 20 26 26 20 5b 63  exists db] && [c
cd10: 61 74 63 68 20 7b 73 71 6c 20 63 6c 6f 73 65 20  atch {sql close 
cd20: 24 64 62 7d 20 65 72 72 6f 72 5d 7d 20 74 68 65  $db} error]} the
cd30: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  n {..        #..
cd40: 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
cd50: 57 65 20 73 6f 6d 65 68 6f 77 20 66 61 69 6c 65  We somehow faile
cd60: 64 20 74 6f 20 63 6c 6f 73 65 20 74 68 65 20 64  d to close the d
cd70: 61 74 61 62 61 73 65 2c 20 72 65 70 6f 72 74 20  atabase, report 
cd80: 77 68 79 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  why...        #.
cd90: 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24  .        tputs $
cda0: 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b  ::test_channel [
cdb0: 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
cdc0: 20 20 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20            "==== 
cdd0: 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20  WARNING: failed 
cde0: 74 6f 20 63 6c 6f 73 65 20 64 61 74 61 62 61 73  to close databas
cdf0: 65 20 5c 22 22 20 24 64 62 20 22 5c 22 2c 20 65  e \"" $db "\", e
ce00: 72 72 6f 72 3a 20 22 20 5c 0d 0a 20 20 20 20 20  rror: " \..     
ce10: 20 20 20 20 20 20 20 5c 6e 5c 74 20 24 65 72 72         \n\t $err
ce20: 6f 72 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d 0d  or \n]..      }.
ce30: 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
ce40: 20 20 23 20 4e 4f 54 45 3a 20 46 69 72 73 74 2c    # NOTE: First,
ce50: 20 73 65 65 20 69 66 20 6f 75 72 20 63 61 6c 6c   see if our call
ce60: 65 72 20 68 61 73 20 72 65 71 75 65 73 74 65 64  er has requested
ce70: 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61   an in-memory da
ce80: 74 61 62 61 73 65 2e 0d 0a 20 20 20 20 20 20 23  tabase...      #
ce90: 0d 0a 20 20 20 20 20 20 73 65 74 20 69 73 4d 65  ..      set isMe
cea0: 6d 6f 72 79 20 5b 69 73 4d 65 6d 6f 72 79 44 62  mory [isMemoryDb
ceb0: 20 24 66 69 6c 65 4e 61 6d 65 5d 0d 0a 0d 0a 20   $fileName].... 
cec0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
ced0: 4e 4f 54 45 3a 20 42 75 69 6c 64 20 74 68 65 20  NOTE: Build the 
cee0: 66 75 6c 6c 20 70 61 74 68 20 74 6f 20 74 68 65  full path to the
cef0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6e   database file n
cf00: 61 6d 65 2e 20 20 46 6f 72 20 6e 6f 77 2c 20 61  ame.  For now, a
cf10: 6c 6c 20 74 65 73 74 0d 0a 20 20 20 20 20 20 23  ll test..      #
cf20: 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65 20         database 
cf30: 66 69 6c 65 73 20 61 72 65 20 73 74 6f 72 65 64  files are stored
cf40: 20 69 6e 20 74 68 65 20 74 65 6d 70 6f 72 61 72   in the temporar
cf50: 79 20 64 69 72 65 63 74 6f 72 79 2e 0d 0a 20 20  y directory...  
cf60: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20      #..      if 
cf70: 7b 21 24 69 73 4d 65 6d 6f 72 79 20 26 26 20 24  {!$isMemory && $
cf80: 71 75 61 6c 69 66 79 7d 20 74 68 65 6e 20 7b 0d  qualify} then {.
cf90: 0a 20 20 20 20 20 20 20 20 73 65 74 20 66 69 6c  .        set fil
cfa0: 65 4e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e  eName [file join
cfb0: 20 5b 67 65 74 44 61 74 61 62 61 73 65 44 69 72   [getDatabaseDir
cfc0: 65 63 74 6f 72 79 5d 20 5b 66 69 6c 65 20 74 61  ectory] [file ta
cfd0: 69 6c 20 24 66 69 6c 65 4e 61 6d 65 5d 5d 0d 0a  il $fileName]]..
cfe0: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
cff0: 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
d000: 3a 20 43 68 65 63 6b 20 69 66 20 74 68 65 20 66  : Check if the f
d010: 69 6c 65 20 73 74 69 6c 6c 20 65 78 69 73 74 73  ile still exists
d020: 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
d030: 20 20 69 66 20 7b 21 24 69 73 4d 65 6d 6f 72 79    if {!$isMemory
d040: 20 26 26 20 24 64 65 6c 65 74 65 20 26 26 20 5b   && $delete && [
d050: 66 69 6c 65 20 65 78 69 73 74 73 20 24 66 69 6c  file exists $fil
d060: 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a  eName]} then {..
d070: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
d080: 20 20 20 23 20 4e 4f 54 45 3a 20 53 6b 69 70 20     # NOTE: Skip 
d090: 64 65 6c 65 74 69 6e 67 20 64 61 74 61 62 61 73  deleting databas
d0a0: 65 20 66 69 6c 65 73 20 69 66 20 73 6f 6d 65 62  e files if someb
d0b0: 6f 64 79 20 73 65 74 73 20 74 68 65 20 67 6c 6f  ody sets the glo
d0c0: 62 61 6c 0d 0a 20 20 20 20 20 20 20 20 23 20 20  bal..        #  
d0d0: 20 20 20 20 20 76 61 72 69 61 62 6c 65 20 74 6f       variable to
d0e0: 20 70 72 65 76 65 6e 74 20 69 74 2e 0d 0a 20 20   prevent it...  
d0f0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
d100: 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73   if {![info exis
d110: 74 73 20 3a 3a 6e 6f 28 63 6c 65 61 6e 75 70 44  ts ::no(cleanupD
d120: 62 46 69 6c 65 29 5d 7d 20 74 68 65 6e 20 7b 0d  bFile)]} then {.
d130: 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
d140: 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
d150: 41 74 74 65 6d 70 74 20 74 6f 20 64 65 6c 65 74  Attempt to delet
d160: 65 20 74 68 65 20 74 65 73 74 20 64 61 74 61 62  e the test datab
d170: 61 73 65 20 66 69 6c 65 20 6e 6f 77 2e 0d 0a 20  ase file now... 
d180: 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
d190: 20 20 20 20 20 20 69 66 20 7b 5b 73 65 74 20 63        if {[set c
d1a0: 6f 64 65 20 5b 63 61 74 63 68 20 7b 66 69 6c 65  ode [catch {file
d1b0: 20 64 65 6c 65 74 65 20 24 66 69 6c 65 4e 61 6d   delete $fileNam
d1c0: 65 7d 20 65 72 72 6f 72 5d 5d 7d 20 74 68 65 6e  e} error]]} then
d1d0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
d1e0: 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23  #..            #
d1f0: 20 4e 4f 54 45 3a 20 57 65 20 73 6f 6d 65 68 6f   NOTE: We someho
d200: 77 20 66 61 69 6c 65 64 20 74 6f 20 64 65 6c 65  w failed to dele
d210: 74 65 20 74 68 65 20 66 69 6c 65 2c 20 72 65 70  te the file, rep
d220: 6f 72 74 20 77 68 79 2e 0d 0a 20 20 20 20 20 20  ort why...      
d230: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
d240: 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
d250: 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
d260: 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
d270: 20 20 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20            "==== 
d280: 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20  WARNING: failed 
d290: 74 6f 20 64 65 6c 65 74 65 20 64 61 74 61 62 61  to delete databa
d2a0: 73 65 20 66 69 6c 65 20 5c 22 22 20 24 66 69 6c  se file \"" $fil
d2b0: 65 4e 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20 20  eName \..       
d2c0: 20 20 20 20 20 20 20 20 20 22 5c 22 20 64 75 72           "\" dur
d2d0: 69 6e 67 20 63 6c 65 61 6e 75 70 2c 20 65 72 72  ing cleanup, err
d2e0: 6f 72 3a 20 22 20 5c 6e 5c 74 20 24 65 72 72 6f  or: " \n\t $erro
d2f0: 72 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20  r \n]..         
d300: 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 20 65 6c   }..        } el
d310: 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  se {..          
d320: 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e  #..          # N
d330: 4f 54 45 3a 20 53 68 6f 77 20 74 68 61 74 20 77  OTE: Show that w
d340: 65 20 73 6b 69 70 70 65 64 20 64 65 6c 65 74 69  e skipped deleti
d350: 6e 67 20 74 68 65 20 66 69 6c 65 2e 0d 0a 20 20  ng the file...  
d360: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
d370: 20 20 20 20 20 73 65 74 20 63 6f 64 65 20 30 0d       set code 0.
d380: 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70 75  ...          tpu
d390: 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
d3a0: 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
d3b0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
d3c0: 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 73  "==== WARNING: s
d3d0: 6b 69 70 70 65 64 20 64 65 6c 65 74 69 6e 67 20  kipped deleting 
d3e0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 5c 22  database file \"
d3f0: 22 20 24 66 69 6c 65 4e 61 6d 65 20 5c 0d 0a 20  " $fileName \.. 
d400: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 5c 22               "\"
d410: 20 64 75 72 69 6e 67 20 63 6c 65 61 6e 75 70 5c   during cleanup\
d420: 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  n"]..        }..
d430: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
d440: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
d450: 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 65 20 66     # NOTE: The f
d460: 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 65 78 69  ile does not exi
d470: 73 74 2c 20 73 75 63 63 65 73 73 21 0d 0a 20 20  st, success!..  
d480: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
d490: 20 73 65 74 20 63 6f 64 65 20 30 0d 0a 20 20 20   set code 0..   
d4a0: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65     }....      re
d4b0: 74 75 72 6e 20 24 63 6f 64 65 0d 0a 20 20 20 20  turn $code..    
d4c0: 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 73  }.....    proc s
d4d0: 65 74 75 70 44 62 49 6e 74 65 72 72 75 70 74 43  etupDbInterruptC
d4e0: 61 6c 6c 62 61 63 6b 20 7b 20 63 68 61 6e 6e 65  allback { channe
d4f0: 6c 20 6c 6f 67 20 7d 20 7b 0d 0a 20 20 20 20 20  l log } {..     
d500: 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
d510: 22 2d 2d 2d 2d 20 73 65 74 74 69 6e 67 20 75 70  "---- setting up
d520: 20 64 65 62 75 67 67 65 72 20 69 6e 74 65 72 72   debugger interr
d530: 75 70 74 20 63 61 6c 6c 62 61 63 6b 2e 2e 2e 20  upt callback... 
d540: 22 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b  "....      if {[
d550: 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20  catch {..       
d560: 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
d570: 54 45 3a 20 4d 61 6b 65 20 73 75 72 65 20 74 68  TE: Make sure th
d580: 65 20 73 63 72 69 70 74 20 64 65 62 75 67 67 65  e script debugge
d590: 72 20 61 6e 64 20 74 68 65 20 69 73 6f 6c 61 74  r and the isolat
d5a0: 65 64 20 69 6e 74 65 72 70 72 65 74 65 72 20 61  ed interpreter a
d5b0: 72 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  re..        #   
d5c0: 20 20 20 20 73 65 74 75 70 20 61 6e 64 20 72 65      setup and re
d5d0: 61 64 79 20 66 6f 72 20 75 73 65 2e 0d 0a 20 20  ady for use...  
d5e0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
d5f0: 20 64 65 62 75 67 20 73 65 74 75 70 20 74 72 75   debug setup tru
d600: 65 20 74 72 75 65 0d 0a 0d 0a 20 20 20 20 20 20  e true....      
d610: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
d620: 4f 54 45 3a 20 4c 6f 61 64 20 74 68 65 20 6e 65  OTE: Load the ne
d630: 63 65 73 73 61 72 79 20 70 61 63 6b 61 67 65 73  cessary packages
d640: 20 69 6e 74 6f 20 74 68 65 20 69 73 6f 6c 61 74   into the isolat
d650: 65 64 20 69 6e 74 65 72 70 72 65 74 65 72 2e 0d  ed interpreter..
d660: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
d670: 20 20 20 20 64 65 62 75 67 20 65 76 61 6c 20 7b      debug eval {
d680: 0d 0a 20 20 20 20 20 20 20 20 20 20 70 61 63 6b  ..          pack
d690: 61 67 65 20 72 65 71 75 69 72 65 20 45 61 67 6c  age require Eagl
d6a0: 65 0d 0a 20 20 20 20 20 20 20 20 20 20 70 61 63  e..          pac
d6b0: 6b 61 67 65 20 72 65 71 75 69 72 65 20 45 61 67  kage require Eag
d6c0: 6c 65 2e 4c 69 62 72 61 72 79 0d 0a 20 20 20 20  le.Library..    
d6d0: 20 20 20 20 20 20 70 61 63 6b 61 67 65 20 72 65        package re
d6e0: 71 75 69 72 65 20 45 61 67 6c 65 2e 54 65 73 74  quire Eagle.Test
d6f0: 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  ..        }.... 
d700: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
d710: 20 20 23 20 4e 4f 54 45 3a 20 43 6f 70 79 20 74    # NOTE: Copy t
d720: 68 65 20 6e 65 63 65 73 73 61 72 79 20 76 61 72  he necessary var
d730: 69 61 62 6c 65 73 20 69 6e 74 6f 20 74 68 65 20  iables into the 
d740: 69 73 6f 6c 61 74 65 64 20 69 6e 74 65 72 70 72  isolated interpr
d750: 65 74 65 72 2e 0d 0a 20 20 20 20 20 20 20 20 23  eter...        #
d760: 0d 0a 20 20 20 20 20 20 20 20 64 65 62 75 67 20  ..        debug 
d770: 69 6e 76 6f 6b 65 20 30 20 73 65 74 20 3a 3a 74  invoke 0 set ::t
d780: 65 73 74 5f 63 68 61 6e 6e 65 6c 20 24 63 68 61  est_channel $cha
d790: 6e 6e 65 6c 3b 20 23 20 4e 4f 54 45 3a 20 46 6f  nnel; # NOTE: Fo
d7a0: 72 20 5b 74 70 75 74 73 5d 2e 0d 0a 20 20 20 20  r [tputs]...    
d7b0: 20 20 20 20 64 65 62 75 67 20 69 6e 76 6f 6b 65      debug invoke
d7c0: 20 30 20 73 65 74 20 3a 3a 74 65 73 74 5f 6c 6f   0 set ::test_lo
d7d0: 67 20 24 6c 6f 67 3b 20 23 20 4e 4f 54 45 3a 20  g $log; # NOTE: 
d7e0: 46 6f 72 20 5b 74 6c 6f 67 5d 2e 0d 0a 0d 0a 20  For [tlog]..... 
d7f0: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
d800: 20 20 23 20 4e 4f 54 45 3a 20 49 6e 73 74 61 6c    # NOTE: Instal
d810: 6c 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 73  l the callback s
d820: 63 72 69 70 74 20 74 6f 20 62 65 20 65 76 61 6c  cript to be eval
d830: 75 61 74 65 64 20 69 6e 20 74 68 65 20 69 73 6f  uated in the iso
d840: 6c 61 74 65 64 0d 0a 20 20 20 20 20 20 20 20 23  lated..        #
d850: 20 20 20 20 20 20 20 69 6e 74 65 72 70 72 65 74         interpret
d860: 65 72 20 77 68 65 6e 20 74 68 69 73 20 69 6e 74  er when this int
d870: 65 72 70 72 65 74 65 72 20 69 73 20 69 6e 74 65  erpreter is inte
d880: 72 72 75 70 74 65 64 20 62 79 20 73 63 72 69 70  rrupted by scrip
d890: 74 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  t..        #    
d8a0: 20 20 20 63 61 6e 63 65 6c 6c 61 74 69 6f 6e 2c     cancellation,
d8b0: 20 65 74 63 2e 0d 0a 20 20 20 20 20 20 20 20 23   etc...        #
d8c0: 0d 0a 20 20 20 20 20 20 20 20 64 65 62 75 67 20  ..        debug 
d8d0: 63 61 6c 6c 62 61 63 6b 20 61 70 70 6c 79 20 7b  callback apply {
d8e0: 7b 73 65 6e 64 65 72 20 65 7d 20 7b 0d 0a 20 20  {sender e} {..  
d8f0: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
d900: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68 65       # NOTE: Che
d910: 63 6b 20 69 66 20 74 68 69 73 20 63 61 6c 6c 62  ck if this callb
d920: 61 63 6b 20 69 73 20 6f 6e 65 20 74 68 61 74 20  ack is one that 
d930: 77 65 20 63 61 72 65 20 61 62 6f 75 74 2e 0d 0a  we care about...
d940: 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
d950: 20 20 20 20 20 20 20 69 66 20 7b 22 43 61 6e 63         if {"Canc
d960: 65 6c 65 64 22 20 69 6e 20 5b 73 70 6c 69 74 20  eled" in [split 
d970: 5b 24 65 20 49 6e 74 65 72 72 75 70 74 54 79 70  [$e InterruptTyp
d980: 65 5d 20 22 2c 20 22 5d 7d 20 74 68 65 6e 20 7b  e] ", "]} then {
d990: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 0d  ..            #.
d9a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4e  .            # N
d9b0: 4f 54 45 3a 20 49 74 65 72 61 74 65 20 74 68 72  OTE: Iterate thr
d9c0: 6f 75 67 68 20 61 6c 6c 20 64 61 74 61 62 61 73  ough all databas
d9d0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 6b 6e  e connections kn
d9e0: 6f 77 6e 20 74 6f 20 74 68 65 0d 0a 20 20 20 20  own to the..    
d9f0: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
da00: 70 61 72 65 6e 74 20 69 6e 74 65 72 70 72 65 74  parent interpret
da10: 65 72 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20  er...           
da20: 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   #..            
da30: 6f 62 6a 65 63 74 20 66 6f 72 65 61 63 68 20 2d  object foreach -
da40: 61 6c 69 61 73 20 70 61 69 72 20 5c 0d 0a 20 20  alias pair \..  
da50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 6f                [o
da60: 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c  bject invoke -fl
da70: 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 24  ags +NonPublic $
da80: 65 20 49 6e 74 65 72 70 72 65 74 65 72 2e 63 6f  e Interpreter.co
da90: 6e 6e 65 63 74 69 6f 6e 73 5d 20 7b 0d 0a 20 20  nnections] {..  
daa0: 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20              #.. 
dab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4e               # N
dac0: 4f 54 45 3a 20 41 74 74 65 6d 70 74 20 74 6f 20  OTE: Attempt to 
dad0: 63 61 6e 63 65 6c 20 61 6e 79 20 53 51 4c 20 71  cancel any SQL q
dae0: 75 65 72 69 65 73 20 69 6e 20 70 72 6f 67 72 65  ueries in progre
daf0: 73 73 20 6f 6e 20 74 68 69 73 0d 0a 20 20 20 20  ss on this..    
db00: 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20            #     
db10: 20 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65    database conne
db20: 63 74 69 6f 6e 2e 0d 0a 20 20 20 20 20 20 20 20  ction...        
db30: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
db40: 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63         if {[catc
db50: 68 20 7b 24 70 61 69 72 20 56 61 6c 75 65 2e 43  h {$pair Value.C
db60: 61 6e 63 65 6c 7d 20 65 72 72 6f 72 5d 7d 20 74  ancel} error]} t
db70: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
db80: 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
db90: 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70  test_channel [ap
dba0: 70 65 6e 64 41 72 67 73 20 5c 6e 20 5c 0d 0a 20  pendArgs \n \.. 
dbb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dbc0: 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47     "==== WARNING
dbd0: 3a 20 66 61 69 6c 65 64 20 74 6f 20 63 61 6e 63  : failed to canc
dbe0: 65 6c 20 71 75 65 72 79 20 66 6f 72 20 63 6f 6e  el query for con
dbf0: 6e 65 63 74 69 6f 6e 20 5c 22 22 20 5c 0d 0a 20  nection \"" \.. 
dc00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dc10: 20 20 20 5b 24 70 61 69 72 20 4b 65 79 5d 20 22     [$pair Key] "
dc20: 5c 22 2c 20 65 72 72 6f 72 3a 20 22 20 5c 6e 5c  \", error: " \n\
dc30: 74 20 24 65 72 72 6f 72 20 5c 6e 5d 0d 0a 20 20  t $error \n]..  
dc40: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
dc50: 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
dc60: 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
dc70: 20 20 20 7d 7d 0d 0a 20 20 20 20 20 20 7d 20 65     }}..      } e
dc80: 72 72 6f 72 5d 20 3d 3d 20 30 7d 20 74 68 65 6e  rror] == 0} then
dc90: 20 7b 0d 0a 20 20 20 20 20 20 20 20 61 64 64 43   {..        addC
dca0: 6f 6e 73 74 72 61 69 6e 74 20 69 6e 74 65 72 72  onstraint interr
dcb0: 75 70 74 43 61 6c 6c 62 61 63 6b 2e 73 71 6c 69  uptCallback.sqli
dcc0: 74 65 33 0d 0a 0d 0a 20 20 20 20 20 20 20 20 74  te3....        t
dcd0: 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 79 65  puts $channel ye
dce0: 73 5c 6e 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73  s\n..      } els
dcf0: 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75  e {..        tpu
dd00: 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70  ts $channel [app
dd10: 65 6e 64 41 72 67 73 20 22 6e 6f 2c 20 65 72 72  endArgs "no, err
dd20: 6f 72 3a 20 22 20 5c 6e 5c 74 20 24 65 72 72 6f  or: " \n\t $erro
dd30: 72 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a  r \n]..      }..
dd40: 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
dd50: 6f 63 20 63 6c 65 61 6e 75 70 46 69 6c 65 20 7b  oc cleanupFile {
dd60: 20 66 69 6c 65 4e 61 6d 65 20 7b 63 6f 6c 6c 65   fileName {colle
dd70: 63 74 20 74 72 75 65 7d 20 7b 66 6f 72 63 65 20  ct true} {force 
dd80: 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a 20 20 20 20  false} } {..    
dd90: 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
dda0: 45 3a 20 41 74 74 65 6d 70 74 20 74 6f 20 66 6f  E: Attempt to fo
ddb0: 72 63 65 20 61 6c 6c 20 70 65 6e 64 69 6e 67 20  rce all pending 
ddc0: 22 67 61 72 62 61 67 65 22 20 6f 62 6a 65 63 74  "garbage" object
ddd0: 73 20 74 6f 20 62 65 20 63 6f 6c 6c 65 63 74 65  s to be collecte
dde0: 64 2c 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  d,..      #     
ddf0: 20 20 69 6e 63 6c 75 64 69 6e 67 20 53 51 4c 69    including SQLi
de00: 74 65 20 73 74 61 74 65 6d 65 6e 74 73 20 61 6e  te statements an
de10: 64 20 62 61 63 6b 75 70 20 6f 62 6a 65 63 74 73  d backup objects
de20: 3b 20 74 68 69 73 20 73 68 6f 75 6c 64 20 61 6c  ; this should al
de30: 6c 6f 77 0d 0a 20 20 20 20 20 20 23 20 20 20 20  low..      #    
de40: 20 20 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e     the underlyin
de50: 67 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  g database file 
de60: 74 6f 20 62 65 20 64 65 6c 65 74 65 64 2e 0d 0a  to be deleted...
de70: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69        #..      i
de80: 66 20 7b 24 63 6f 6c 6c 65 63 74 7d 20 74 68 65  f {$collect} the
de90: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 63 6f 6c  n {..        col
dea0: 6c 65 63 74 47 61 72 62 61 67 65 20 24 3a 3a 74  lectGarbage $::t
deb0: 65 73 74 5f 63 68 61 6e 6e 65 6c 0d 0a 20 20 20  est_channel..   
dec0: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d     }....      #.
ded0: 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43  .      # NOTE: C
dee0: 68 65 63 6b 20 69 66 20 74 68 65 20 66 69 6c 65  heck if the file
def0: 20 73 74 69 6c 6c 20 65 78 69 73 74 73 2e 0d 0a   still exists...
df00: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69        #..      i
df10: 66 20 7b 5b 66 69 6c 65 20 65 78 69 73 74 73 20  f {[file exists 
df20: 24 66 69 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e  $fileName]} then
df30: 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20   {..        #.. 
df40: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53         # NOTE: S
df50: 6b 69 70 20 64 65 6c 65 74 69 6e 67 20 74 65 73  kip deleting tes
df60: 74 20 66 69 6c 65 73 20 69 66 20 73 6f 6d 65 62  t files if someb
df70: 6f 64 79 20 73 65 74 73 20 74 68 65 20 67 6c 6f  ody sets the glo
df80: 62 61 6c 20 76 61 72 69 61 62 6c 65 0d 0a 20 20  bal variable..  
df90: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74 6f        #       to
dfa0: 20 70 72 65 76 65 6e 74 20 69 74 2e 0d 0a 20 20   prevent it...  
dfb0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
dfc0: 20 69 66 20 7b 24 66 6f 72 63 65 20 7c 7c 20 21   if {$force || !
dfd0: 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e  [info exists ::n
dfe0: 6f 28 63 6c 65 61 6e 75 70 46 69 6c 65 29 5d 7d  o(cleanupFile)]}
dff0: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
e000: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
e010: 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74 20  # NOTE: Attempt 
e020: 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20 74 65  to delete the te
e030: 73 74 20 66 69 6c 65 20 6e 6f 77 2e 0d 0a 20 20  st file now...  
e040: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
e050: 20 20 20 20 20 69 66 20 7b 5b 73 65 74 20 63 6f       if {[set co
e060: 64 65 20 5b 63 61 74 63 68 20 7b 66 69 6c 65 20  de [catch {file 
e070: 64 65 6c 65 74 65 20 24 66 69 6c 65 4e 61 6d 65  delete $fileName
e080: 7d 20 65 72 72 6f 72 5d 5d 7d 20 74 68 65 6e 20  } error]]} then 
e090: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23  {..            #
e0a0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 20  ..            # 
e0b0: 4e 4f 54 45 3a 20 57 65 20 73 6f 6d 65 68 6f 77  NOTE: We somehow
e0c0: 20 66 61 69 6c 65 64 20 74 6f 20 64 65 6c 65 74   failed to delet
e0d0: 65 20 74 68 65 20 66 69 6c 65 2c 20 72 65 70 6f  e the file, repo
e0e0: 72 74 20 77 68 79 2e 0d 0a 20 20 20 20 20 20 20  rt why...       
e0f0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
e100: 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
e110: 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e  t_channel [appen
e120: 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
e130: 20 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57           "==== W
e140: 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20 74  ARNING: failed t
e150: 6f 20 64 65 6c 65 74 65 20 74 65 73 74 20 66 69  o delete test fi
e160: 6c 65 20 5c 22 22 20 24 66 69 6c 65 4e 61 6d 65  le \"" $fileName
e170: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
e180: 20 20 20 20 22 5c 22 20 64 75 72 69 6e 67 20 63      "\" during c
e190: 6c 65 61 6e 75 70 2c 20 65 72 72 6f 72 3a 20 22  leanup, error: "
e1a0: 20 5c 6e 5c 74 20 24 65 72 72 6f 72 20 5c 6e 5d   \n\t $error \n]
e1b0: 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20  ..          }.. 
e1c0: 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d         } else {.
e1d0: 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
e1e0: 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
e1f0: 53 68 6f 77 20 74 68 61 74 20 77 65 20 73 6b 69  Show that we ski
e200: 70 70 65 64 20 64 65 6c 65 74 69 6e 67 20 74 68  pped deleting th
e210: 65 20 66 69 6c 65 2e 0d 0a 20 20 20 20 20 20 20  e file...       
e220: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
e230: 73 65 74 20 63 6f 64 65 20 30 0d 0a 0d 0a 20 20  set code 0....  
e240: 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
e250: 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61  :test_channel [a
e260: 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
e270: 20 20 20 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d             "====
e280: 20 57 41 52 4e 49 4e 47 3a 20 73 6b 69 70 70 65   WARNING: skippe
e290: 64 20 64 65 6c 65 74 69 6e 67 20 74 65 73 74 20  d deleting test 
e2a0: 66 69 6c 65 20 5c 22 22 20 24 66 69 6c 65 4e 61  file \"" $fileNa
e2b0: 6d 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  me \..          
e2c0: 20 20 20 20 22 5c 22 20 64 75 72 69 6e 67 20 63      "\" during c
e2d0: 6c 65 61 6e 75 70 5c 6e 22 5d 0d 0a 20 20 20 20  leanup\n"]..    
e2e0: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 20 65      }..      } e
e2f0: 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  lse {..        #
e300: 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
e310: 3a 20 54 68 65 20 66 69 6c 65 20 64 6f 65 73 20  : The file does 
e320: 6e 6f 74 20 65 78 69 73 74 2c 20 73 75 63 63 65  not exist, succe
e330: 73 73 21 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  ss!..        #..
e340: 20 20 20 20 20 20 20 20 73 65 74 20 63 6f 64 65          set code
e350: 20 30 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20   0..      }.... 
e360: 20 20 20 20 20 72 65 74 75 72 6e 20 24 63 6f 64       return $cod
e370: 65 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  e..    }.....   
e380: 20 70 72 6f 63 20 63 6f 6c 6c 65 63 74 47 61 72   proc collectGar
e390: 62 61 67 65 20 7b 20 63 68 61 6e 6e 65 6c 20 7b  bage { channel {
e3a0: 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20 31 30 30  milliseconds 100
e3b0: 30 7d 20 7b 71 75 69 65 74 20 74 72 75 65 7d 20  0} {quiet true} 
e3c0: 7d 20 7b 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b  } {..      if {[
e3d0: 63 61 74 63 68 20 7b 6f 62 6a 65 63 74 20 69 6e  catch {object in
e3e0: 76 6f 6b 65 20 47 43 20 47 65 74 54 6f 74 61 6c  voke GC GetTotal
e3f0: 4d 65 6d 6f 72 79 20 66 61 6c 73 65 7d 20 72 65  Memory false} re
e400: 73 75 6c 74 5d 20 3d 3d 20 30 7d 20 74 68 65 6e  sult] == 0} then
e410: 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b   {..        if {
e420: 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d  !$quiet} then {.
e430: 0a 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73  .          tputs
e440: 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e   $channel [appen
e450: 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
e460: 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 6d 65 6d         "---- mem
e470: 6f 72 79 20 69 6e 20 75 73 65 20 62 79 20 74 68  ory in use by th
e480: 65 20 43 4c 52 20 62 65 66 6f 72 65 20 63 6f 6c  e CLR before col
e490: 6c 65 63 74 69 6f 6e 2e 2e 2e 20 22 20 5c 0d 0a  lection... " \..
e4a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 24 72                $r
e4b0: 65 73 75 6c 74 20 22 20 62 79 74 65 73 5c 6e 22  esult " bytes\n"
e4c0: 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  ]..        }..  
e4d0: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
e4e0: 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
e4f0: 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
e500: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
e510: 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66  "==== WARNING: f
e520: 61 69 6c 65 64 20 74 6f 20 67 65 74 20 43 4c 52  ailed to get CLR
e530: 20 6d 65 6d 6f 72 79 20 75 73 61 67 65 2c 20 65   memory usage, e
e540: 72 72 6f 72 3a 20 22 20 5c 0d 0a 20 20 20 20 20  rror: " \..     
e550: 20 20 20 20 20 20 20 5c 6e 5c 74 20 24 72 65 73         \n\t $res
e560: 75 6c 74 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d  ult \n]..      }
e570: 0d 0a 0d 0a 20 20 20 20 20 20 23 23 23 23 23 23  ....      ######
e580: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
e590: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
e5a0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
e5b0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
e5c0: 23 23 23 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a  ###....      #..
e5d0: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 52 65        # NOTE: Re
e5e0: 70 65 61 74 65 64 6c 79 20 61 74 74 65 6d 70 74  peatedly attempt
e5f0: 20 74 6f 20 63 6f 6c 6c 65 63 74 20 67 61 72 62   to collect garb
e600: 61 67 65 20 75 6e 74 69 6c 20 74 68 65 20 61 6c  age until the al
e610: 6c 6f 74 74 65 64 20 6e 75 6d 62 65 72 0d 0a 20  lotted number.. 
e620: 20 20 20 20 20 23 20 20 20 20 20 20 20 6f 66 20       #       of 
e630: 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20 68 61 73  milliseconds has
e640: 20 65 6c 61 70 73 65 64 2e 20 20 41 6c 77 61 79   elapsed.  Alway
e650: 73 20 61 74 74 65 6d 70 74 20 74 6f 20 63 6f 6c  s attempt to col
e660: 6c 65 63 74 20 67 61 72 62 61 67 65 0d 0a 20 20  lect garbage..  
e670: 20 20 20 20 23 20 20 20 20 20 20 20 61 74 20 6c      #       at l
e680: 65 61 73 74 20 6f 6e 63 65 2e 0d 0a 20 20 20 20  east once...    
e690: 20 20 23 0d 0a 20 20 20 20 20 20 73 65 74 20 73    #..      set s
e6a0: 74 61 72 74 20 5b 63 6c 6f 63 6b 20 73 65 63 6f  tart [clock seco
e6b0: 6e 64 73 5d 0d 0a 20 20 20 20 20 20 73 65 74 20  nds]..      set 
e6c0: 73 74 6f 70 20 5b 65 78 70 72 20 7b 24 73 74 61  stop [expr {$sta
e6d0: 72 74 20 2b 20 28 24 6d 69 6c 6c 69 73 65 63 6f  rt + ($milliseco
e6e0: 6e 64 73 20 2f 20 31 30 30 30 29 7d 5d 0d 0a 0d  nds / 1000)}]...
e6f0: 0a 20 20 20 20 20 20 64 6f 20 7b 0d 0a 20 20 20  .      do {..   
e700: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
e710: 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74 20  # NOTE: Attempt 
e720: 74 6f 20 66 6f 72 63 65 20 61 20 66 75 6c 6c 20  to force a full 
e730: 67 61 72 62 61 67 65 20 63 6f 6c 6c 65 63 74 69  garbage collecti
e740: 6f 6e 20 6e 6f 77 2e 20 20 52 65 70 6f 72 74 20  on now.  Report 
e750: 61 6e 79 0d 0a 20 20 20 20 20 20 20 20 23 20 20  any..        #  
e760: 20 20 20 20 20 65 72 72 6f 72 20 74 68 61 74 20       error that 
e770: 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 69  is encountered i
e780: 66 20 77 65 20 66 61 69 6c 2e 0d 0a 20 20 20 20  f we fail...    
e790: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 69      #..        i
e7a0: 66 20 7b 5b 63 61 74 63 68 20 7b 6f 62 6a 65 63  f {[catch {objec
e7b0: 74 20 69 6e 76 6f 6b 65 20 47 43 20 47 65 74 54  t invoke GC GetT
e7c0: 6f 74 61 6c 4d 65 6d 6f 72 79 20 74 72 75 65 7d  otalMemory true}
e7d0: 20 65 72 72 6f 72 5d 7d 20 74 68 65 6e 20 7b 0d   error]} then {.
e7e0: 0a 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73  .          tputs
e7f0: 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e   $channel [appen
e800: 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
e810: 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52         "==== WAR
e820: 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20 66 75 6c  NING: failed ful
e830: 6c 20 67 61 72 62 61 67 65 20 63 6f 6c 6c 65 63  l garbage collec
e840: 74 69 6f 6e 2c 20 65 72 72 6f 72 3a 20 22 20 5c  tion, error: " \
e850: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
e860: 5c 6e 5c 74 20 24 65 72 72 6f 72 20 5c 6e 5d 0d  \n\t $error \n].
e870: 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  .        }....  
e880: 20 20 20 20 20 20 73 65 74 20 6e 6f 77 20 5b 63        set now [c
e890: 6c 6f 63 6b 20 73 65 63 6f 6e 64 73 5d 0d 0a 20  lock seconds].. 
e8a0: 20 20 20 20 20 7d 20 77 68 69 6c 65 20 7b 24 73       } while {$s
e8b0: 74 61 72 74 20 3c 3d 20 24 6e 6f 77 20 26 26 20  tart <= $now && 
e8c0: 24 6e 6f 77 20 3c 20 24 73 74 6f 70 7d 0d 0a 0d  $now < $stop}...
e8d0: 0a 20 20 20 20 20 20 23 23 23 23 23 23 23 23 23  .      #########
e8e0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
e8f0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
e900: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
e910: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
e920: 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 63  ....      if {[c
e930: 61 74 63 68 20 7b 6f 62 6a 65 63 74 20 69 6e 76  atch {object inv
e940: 6f 6b 65 20 47 43 20 47 65 74 54 6f 74 61 6c 4d  oke GC GetTotalM
e950: 65 6d 6f 72 79 20 66 61 6c 73 65 7d 20 72 65 73  emory false} res
e960: 75 6c 74 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20  ult] == 0} then 
e970: 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21  {..        if {!
e980: 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a  $quiet} then {..
e990: 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
e9a0: 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  $channel [append
e9b0: 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
e9c0: 20 20 20 20 20 20 22 2d 2d 2d 2d 20 6d 65 6d 6f        "---- memo
e9d0: 72 79 20 69 6e 20 75 73 65 20 62 79 20 74 68 65  ry in use by the
e9e0: 20 43 4c 52 20 61 66 74 65 72 20 63 6f 6c 6c 65   CLR after colle
e9f0: 63 74 69 6f 6e 2e 2e 2e 20 22 20 5c 0d 0a 20 20  ction... " \..  
ea00: 20 20 20 20 20 20 20 20 20 20 20 20 24 72 65 73              $res
ea10: 75 6c 74 20 22 20 62 79 74 65 73 5c 6e 22 5d 0d  ult " bytes\n"].
ea20: 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  .        }..    
ea30: 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
ea40: 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
ea50: 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
ea60: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 3d  ..            "=
ea70: 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61 69  === WARNING: fai
ea80: 6c 65 64 20 74 6f 20 67 65 74 20 43 4c 52 20 6d  led to get CLR m
ea90: 65 6d 6f 72 79 20 75 73 61 67 65 2c 20 65 72 72  emory usage, err
eaa0: 6f 72 3a 20 22 20 5c 0d 0a 20 20 20 20 20 20 20  or: " \..       
eab0: 20 20 20 20 20 5c 6e 5c 74 20 24 72 65 73 75 6c       \n\t $resul
eac0: 74 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a  t \n]..      }..
ead0: 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
eae0: 6f 63 20 67 65 74 53 51 4c 69 74 65 48 61 6e 64  oc getSQLiteHand
eaf0: 6c 65 43 6f 75 6e 74 73 20 7b 20 63 68 61 6e 6e  leCounts { chann
eb00: 65 6c 20 7b 71 75 69 65 74 20 66 61 6c 73 65 7d  el {quiet false}
eb10: 20 7d 20 7b 0d 0a 20 20 20 20 20 20 73 65 74 20   } {..      set 
eb20: 72 65 73 75 6c 74 20 5b 6c 69 73 74 5d 0d 0a 0d  result [list]...
eb30: 0a 20 20 20 20 20 20 69 66 20 7b 5b 68 61 76 65  .      if {[have
eb40: 43 6f 6e 73 74 72 61 69 6e 74 20 5c 0d 0a 20 20  Constraint \..  
eb50: 20 20 20 20 20 20 20 20 20 20 20 20 64 65 66 69              defi
eb60: 6e 65 43 6f 6e 73 74 61 6e 74 2e 53 79 73 74 65  neConstant.Syste
eb70: 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 43 4f  m.Data.SQLite.CO
eb80: 55 4e 54 5f 48 41 4e 44 4c 45 5d 7d 20 74 68 65  UNT_HANDLE]} the
eb90: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  n {..        #..
eba0: 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
ebb0: 41 64 64 20 65 61 63 68 20 63 72 69 74 69 63 61  Add each critica
ebc0: 6c 20 68 61 6e 64 6c 65 20 63 6f 75 6e 74 20 74  l handle count t
ebd0: 6f 20 74 68 65 20 72 65 73 75 6c 74 69 6e 67 20  o the resulting 
ebe0: 6c 69 73 74 2e 0d 0a 20 20 20 20 20 20 20 20 23  list...        #
ebf0: 0d 0a 20 20 20 20 20 20 20 20 66 6f 72 65 61 63  ..        foreac
ec00: 68 20 6e 61 6d 65 20 5b 6c 69 73 74 20 63 6f 6e  h name [list con
ec10: 6e 65 63 74 69 6f 6e 43 6f 75 6e 74 20 73 74 61  nectionCount sta
ec20: 74 65 6d 65 6e 74 43 6f 75 6e 74 20 62 61 63 6b  tementCount back
ec30: 75 70 43 6f 75 6e 74 5d 20 7b 0d 0a 20 20 20 20  upCount] {..    
ec40: 20 20 20 20 20 20 73 65 74 20 76 61 6c 75 65 20        set value 
ec50: 5b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d  [object invoke -
ec60: 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63  flags +NonPublic
ec70: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
ec80: 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51    System.Data.SQ
ec90: 4c 69 74 65 2e 55 6e 73 61 66 65 4e 61 74 69 76  Lite.UnsafeNativ
eca0: 65 4d 65 74 68 6f 64 73 20 24 6e 61 6d 65 5d 0d  eMethods $name].
ecb0: 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20  ...          if 
ecc0: 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b  {!$quiet} then {
ecd0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70  ..            tp
ece0: 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70  uts $channel [ap
ecf0: 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
ed00: 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
ed10: 2d 20 63 72 69 74 69 63 61 6c 20 68 61 6e 64 6c  - critical handl
ed20: 65 20 63 6f 75 6e 74 20 5c 22 22 20 24 6e 61 6d  e count \"" $nam
ed30: 65 20 22 5c 22 20 69 73 20 22 20 24 76 61 6c 75  e "\" is " $valu
ed40: 65 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20  e \n]..         
ed50: 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   }....          
ed60: 6c 61 70 70 65 6e 64 20 72 65 73 75 6c 74 20 24  lappend result $
ed70: 76 61 6c 75 65 0d 0a 20 20 20 20 20 20 20 20 7d  value..        }
ed80: 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 69 66  ..      } elseif
ed90: 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20   {!$quiet} then 
eda0: 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
edb0: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68        # NOTE: Th
edc0: 65 20 61 63 74 75 61 6c 20 68 61 6e 64 6c 65 20  e actual handle 
edd0: 63 6f 75 6e 74 73 20 61 72 65 20 6e 6f 74 20 61  counts are not a
ede0: 76 61 69 6c 61 62 6c 65 3b 20 74 68 65 72 65 66  vailable; theref
edf0: 6f 72 65 2c 20 6a 75 73 74 0d 0a 20 20 20 20 20  ore, just..     
ee00: 20 20 20 23 20 20 20 20 20 20 20 72 65 74 75 72     #       retur
ee10: 6e 20 61 6e 20 65 6d 70 74 79 20 6c 69 73 74 2e  n an empty list.
ee20: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
ee30: 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
ee40: 6e 65 6c 20 22 2d 2d 2d 2d 20 63 72 69 74 69 63  nel "---- critic
ee50: 61 6c 20 68 61 6e 64 6c 65 20 63 6f 75 6e 74 73  al handle counts
ee60: 20 75 6e 61 76 61 69 6c 61 62 6c 65 5c 6e 22 0d   unavailable\n".
ee70: 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
ee80: 20 20 72 65 74 75 72 6e 20 24 72 65 73 75 6c 74    return $result
ee90: 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
eea0: 70 72 6f 63 20 73 68 75 74 64 6f 77 6e 53 51 4c  proc shutdownSQL
eeb0: 69 74 65 20 7b 20 63 68 61 6e 6e 65 6c 20 7b 66  ite { channel {f
eec0: 6f 72 63 65 20 66 61 6c 73 65 7d 20 7b 71 75 69  orce false} {qui
eed0: 65 74 20 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a 20  et false} } {.. 
eee0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
eef0: 4e 4f 54 45 3a 20 4d 61 6b 65 20 73 75 72 65 20  NOTE: Make sure 
ef00: 74 68 61 74 20 53 51 4c 69 74 65 20 63 6f 72 65  that SQLite core
ef10: 20 6c 69 62 72 61 72 79 20 69 73 20 63 6f 6d 70   library is comp
ef20: 6c 65 74 65 6c 79 20 73 68 75 74 64 6f 77 6e 2e  letely shutdown.
ef30: 20 20 54 68 69 73 0d 0a 20 20 20 20 20 20 23 20    This..      # 
ef40: 20 20 20 20 20 20 69 73 20 75 73 65 64 20 62 79        is used by
ef50: 20 74 65 73 74 73 20 74 68 61 74 20 63 68 61 6e   tests that chan
ef60: 67 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  ge configuration
ef70: 20 6f 70 74 69 6f 6e 73 20 61 6e 64 2f 6f 72 20   options and/or 
ef80: 74 68 6f 73 65 0d 0a 20 20 20 20 20 20 23 20 20  those..      #  
ef90: 20 20 20 20 20 74 68 61 74 20 6e 65 65 64 20 74       that need t
efa0: 6f 20 6d 61 6b 65 20 73 75 72 65 20 6c 6f 67 67  o make sure logg
efb0: 69 6e 67 20 69 73 20 69 6e 69 74 69 61 6c 69 7a  ing is initializ
efc0: 65 64 20 28 69 2e 65 2e 20 6a 75 73 74 20 69 6e  ed (i.e. just in
efd0: 20 63 61 73 65 0d 0a 20 20 20 20 20 20 23 20 20   case..      #  
efe0: 20 20 20 20 20 74 68 65 20 53 51 4c 69 74 65 20       the SQLite 
eff0: 63 6f 72 65 20 6c 69 62 72 61 72 79 20 77 61 73  core library was
f000: 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 69 6e 20   initialized in 
f010: 74 68 65 20 70 72 6f 63 65 73 73 20 70 72 69 6f  the process prio
f020: 72 20 74 6f 0d 0a 20 20 20 20 20 20 23 20 20 20  r to..      #   
f030: 20 20 20 20 74 68 65 20 53 51 4c 69 74 65 4c 6f      the SQLiteLo
f040: 67 20 63 6c 61 73 73 20 62 65 69 6e 67 20 61 62  g class being ab
f050: 6c 65 20 74 6f 20 73 65 74 75 70 20 69 74 73 20  le to setup its 
f060: 6c 6f 67 67 69 6e 67 20 63 61 6c 6c 62 61 63 6b  logging callback
f070: 29 2e 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  )...      #     
f080: 20 20 4e 6f 72 6d 61 6c 6c 79 2c 20 74 68 69 73    Normally, this
f090: 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20   should only be 
f0a0: 70 65 72 66 6f 72 6d 65 64 20 69 66 20 53 51 4c  performed if SQL
f0b0: 69 74 65 20 69 73 20 6c 6f 61 64 65 64 20 61 6e  ite is loaded an
f0c0: 64 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  d..      #      
f0d0: 20 72 65 61 64 79 20 66 6f 72 20 75 73 65 20 62   ready for use b
f0e0: 79 20 74 68 65 20 74 65 73 74 20 73 75 69 74 65  y the test suite
f0f0: 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
f100: 20 20 69 66 20 7b 24 66 6f 72 63 65 20 7c 7c 20    if {$force || 
f110: 5b 69 73 53 51 4c 69 74 65 52 65 61 64 79 5d 7d  [isSQLiteReady]}
f120: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
f130: 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 42 55   #..        # BU
f140: 47 46 49 58 3a 20 42 65 66 6f 72 65 20 63 61 6c  GFIX: Before cal
f150: 6c 69 6e 67 20 74 68 65 20 6e 61 74 69 76 65 20  ling the native 
f160: 73 68 75 74 64 6f 77 6e 20 66 75 6e 63 74 69 6f  shutdown functio
f170: 6e 2c 20 6d 61 6b 65 20 73 75 72 65 20 62 6f 74  n, make sure bot
f180: 68 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  h..        #    
f190: 20 20 20 20 20 6f 66 20 74 68 65 20 50 52 41 47       of the PRAG
f1a0: 4d 41 20 72 65 6c 61 74 65 64 20 64 69 72 65 63  MA related direc
f1b0: 74 6f 72 79 20 6e 61 6d 65 73 20 61 72 65 20 66  tory names are f
f1c0: 72 65 65 64 2e 0d 0a 20 20 20 20 20 20 20 20 23  reed...        #
f1d0: 0d 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b 46  ..        checkF
f1e0: 6f 72 53 51 4c 69 74 65 44 69 72 65 63 74 6f 72  orSQLiteDirector
f1f0: 69 65 73 20 24 63 68 61 6e 6e 65 6c 20 74 72 75  ies $channel tru
f200: 65 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20  e....        if 
f210: 7b 5b 63 61 74 63 68 20 7b 6f 62 6a 65 63 74 20  {[catch {object 
f220: 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e  invoke -flags +N
f230: 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20  onPublic \..    
f240: 20 20 20 20 20 20 20 20 20 20 20 20 53 79 73 74              Syst
f250: 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 55  em.Data.SQLite.U
f260: 6e 73 61 66 65 4e 61 74 69 76 65 4d 65 74 68 6f  nsafeNativeMetho
f270: 64 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  ds \..          
f280: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 68        sqlite3_sh
f290: 75 74 64 6f 77 6e 7d 20 72 65 73 75 6c 74 5d 20  utdown} result] 
f2a0: 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  == 0} then {..  
f2b0: 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75          if {!$qu
f2c0: 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  iet} then {..   
f2d0: 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
f2e0: 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
f2f0: 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
f300: 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 61 6c         "---- cal
f310: 6c 20 73 71 6c 69 74 65 33 5f 73 68 75 74 64 6f  l sqlite3_shutdo
f320: 77 6e 28 29 2e 2e 2e 20 6f 6b 3a 20 22 20 24 72  wn()... ok: " $r
f330: 65 73 75 6c 74 20 5c 6e 5d 0d 0a 20 20 20 20 20  esult \n]..     
f340: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
f350: 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
f360: 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d      if {!$quiet}
f370: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
f380: 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
f390: 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
f3a0: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
f3b0: 20 20 20 22 2d 2d 2d 2d 20 63 61 6c 6c 20 73 71     "---- call sq
f3c0: 6c 69 74 65 33 5f 73 68 75 74 64 6f 77 6e 28 29  lite3_shutdown()
f3d0: 2e 2e 2e 20 65 72 72 6f 72 3a 20 22 20 5c 6e 5c  ... error: " \n\
f3e0: 74 20 24 72 65 73 75 6c 74 20 5c 6e 5d 0d 0a 20  t $result \n].. 
f3f0: 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
f400: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a      }..      }..
f410: 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
f420: 6f 63 20 72 65 70 6f 72 74 53 51 4c 69 74 65 52  oc reportSQLiteR
f430: 65 73 6f 75 72 63 65 73 20 7b 20 63 68 61 6e 6e  esources { chann
f440: 65 6c 20 7b 71 75 69 65 74 20 66 61 6c 73 65 7d  el {quiet false}
f450: 20 7b 63 6f 6c 6c 65 63 74 20 74 72 75 65 7d 20   {collect true} 
f460: 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  } {..      #..  
f470: 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 6b 69 70      # NOTE: Skip
f480: 20 61 6c 6c 20 6f 75 74 70 75 74 20 69 66 20 77   all output if w
f490: 65 20 61 72 65 20 72 75 6e 6e 69 6e 67 20 69 6e  e are running in
f4a0: 20 22 71 75 69 65 74 22 20 6d 6f 64 65 2e 0d 0a   "quiet" mode...
f4b0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69        #..      i
f4c0: 66 20 7b 5b 68 61 76 65 43 6f 6e 73 74 72 61 69  f {[haveConstrai
f4d0: 6e 74 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  nt \..          
f4e0: 20 20 20 20 64 65 66 69 6e 65 43 6f 6e 73 74 61      defineConsta
f4f0: 6e 74 2e 53 79 73 74 65 6d 2e 44 61 74 61 2e 53  nt.System.Data.S
f500: 51 4c 69 74 65 2e 49 4e 54 45 52 4f 50 5f 56 49  QLite.INTEROP_VI
f510: 52 54 55 41 4c 5f 54 41 42 4c 45 5d 20 26 26 20  RTUAL_TABLE] && 
f520: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 68 61  \..          [ha
f530: 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 5c 0d 0a  veConstraint \..
f540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 65                de
f550: 66 69 6e 65 43 6f 6e 73 74 61 6e 74 2e 53 79 73  fineConstant.Sys
f560: 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e  tem.Data.SQLite.
f570: 54 52 41 43 4b 5f 4d 45 4d 4f 52 59 5f 42 59 54  TRACK_MEMORY_BYT
f580: 45 53 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  ES]} then {..   
f590: 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74       if {!$quiet
f5a0: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
f5b0: 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
f5c0: 65 6c 20 22 2d 2d 2d 2d 20 63 75 72 72 65 6e 74  el "---- current
f5d0: 20 6d 65 6d 6f 72 79 20 69 6e 20 75 73 65 20 62   memory in use b
f5e0: 79 20 53 51 4c 69 74 65 4d 65 6d 6f 72 79 2e 2e  y SQLiteMemory..
f5f0: 2e 20 22 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  . "..        }..
f600: 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63  ..        if {[c
f610: 61 74 63 68 20 7b 6f 62 6a 65 63 74 20 69 6e 76  atch {object inv
f620: 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50  oke -flags +NonP
f630: 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20 20  ublic \..       
f640: 20 20 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e           System.
f650: 44 61 74 61 2e 53 51 4c 69 74 65 2e 53 51 4c 69  Data.SQLite.SQLi
f660: 74 65 4d 65 6d 6f 72 79 20 5c 0d 0a 20 20 20 20  teMemory \..    
f670: 20 20 20 20 20 20 20 20 20 20 20 20 62 79 74 65              byte
f680: 73 41 6c 6c 6f 63 61 74 65 64 7d 20 6d 65 6d 6f  sAllocated} memo
f690: 72 79 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b  ry] == 0} then {
f6a0: 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b  ..          if {
f6b0: 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d  !$quiet} then {.
f6c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75  .            tpu
f6d0: 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70  ts $channel [app
f6e0: 65 6e 64 41 72 67 73 20 24 6d 65 6d 6f 72 79 20  endArgs $memory 
f6f0: 22 20 62 79 74 65 73 5c 6e 22 5d 0d 0a 20 20 20  " bytes\n"]..   
f700: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
f710: 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
f720: 20 20 20 20 20 20 73 65 74 20 6d 65 6d 6f 72 79        set memory
f730: 20 75 6e 6b 6e 6f 77 6e 0d 0a 0d 0a 20 20 20 20   unknown....    
f740: 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65        if {!$quie
f750: 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  t} then {..     
f760: 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
f770: 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
f780: 73 20 24 6d 65 6d 6f 72 79 20 5c 6e 5d 0d 0a 20  s $memory \n].. 
f790: 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
f7a0: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
f7b0: 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68   if {!$quiet} th
f7c0: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
f7d0: 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 22  tputs $channel "
f7e0: 2d 2d 2d 2d 20 6d 61 78 69 6d 75 6d 20 6d 65 6d  ---- maximum mem
f7f0: 6f 72 79 20 69 6e 20 75 73 65 20 62 79 20 53 51  ory in use by SQ
f800: 4c 69 74 65 4d 65 6d 6f 72 79 2e 2e 2e 20 22 0d  LiteMemory... ".
f810: 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  .        }....  
f820: 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68        if {[catch
f830: 20 7b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20   {object invoke 
f840: 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69  -flags +NonPubli
f850: 63 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  c \..           
f860: 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61       System.Data
f870: 2e 53 51 4c 69 74 65 2e 53 51 4c 69 74 65 4d 65  .SQLite.SQLiteMe
f880: 6d 6f 72 79 20 5c 0d 0a 20 20 20 20 20 20 20 20  mory \..        
f890: 20 20 20 20 20 20 20 20 6d 61 78 69 6d 75 6d 42          maximumB
f8a0: 79 74 65 73 41 6c 6c 6f 63 61 74 65 64 7d 20 6d  ytesAllocated} m
f8b0: 65 6d 6f 72 79 5d 20 3d 3d 20 30 7d 20 74 68 65  emory] == 0} the
f8c0: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69  n {..          i
f8d0: 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e  f {!$quiet} then
f8e0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
f8f0: 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b  tputs $channel [
f900: 61 70 70 65 6e 64 41 72 67 73 20 24 6d 65 6d 6f  appendArgs $memo
f910: 72 79 20 22 20 62 79 74 65 73 5c 6e 22 5d 0d 0a  ry " bytes\n"]..
f920: 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
f930: 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
f940: 20 20 20 20 20 20 20 20 20 73 65 74 20 6d 65 6d           set mem
f950: 6f 72 79 20 75 6e 6b 6e 6f 77 6e 0d 0a 0d 0a 20  ory unknown.... 
f960: 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71           if {!$q
f970: 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  uiet} then {..  
f980: 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
f990: 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  $channel [append
f9a0: 41 72 67 73 20 24 6d 65 6d 6f 72 79 20 5c 6e 5d  Args $memory \n]
f9b0: 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20  ..          }.. 
f9c0: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
f9d0: 7d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 21  }....      if {!
f9e0: 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a  $quiet} then {..
f9f0: 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
fa00: 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 63 75 72  hannel "---- cur
fa10: 72 65 6e 74 20 6d 65 6d 6f 72 79 20 69 6e 20 75  rent memory in u
fa20: 73 65 20 62 79 20 53 51 4c 69 74 65 2e 2e 2e 20  se by SQLite... 
fa30: 22 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  "..      }....  
fa40: 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b      if {[catch {
fa50: 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66  object invoke -f
fa60: 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20  lags +NonPublic 
fa70: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
fa80: 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c   System.Data.SQL
fa90: 69 74 65 2e 55 6e 73 61 66 65 4e 61 74 69 76 65  ite.UnsafeNative
faa0: 4d 65 74 68 6f 64 73 20 5c 0d 0a 20 20 20 20 20  Methods \..     
fab0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
fac0: 5f 6d 65 6d 6f 72 79 5f 75 73 65 64 7d 20 6d 65  _memory_used} me
fad0: 6d 6f 72 79 5d 20 3d 3d 20 30 7d 20 74 68 65 6e  mory] == 0} then
fae0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b   {..        if {
faf0: 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d  !$quiet} then {.
fb00: 0a 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73  .          tputs
fb10: 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e   $channel [appen
fb20: 64 41 72 67 73 20 24 6d 65 6d 6f 72 79 20 22 20  dArgs $memory " 
fb30: 62 79 74 65 73 5c 6e 22 5d 0d 0a 20 20 20 20 20  bytes\n"]..     
fb40: 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 20 65 6c     }..      } el
fb50: 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d  se {..        #.
fb60: 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
fb70: 20 4d 61 79 62 65 20 74 68 65 20 53 51 4c 69 74   Maybe the SQLit
fb80: 65 20 63 6f 72 65 20 6c 69 62 72 61 72 79 20 69  e core library i
fb90: 73 20 75 6e 61 76 61 69 6c 61 62 6c 65 3f 0d 0a  s unavailable?..
fba0: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
fbb0: 20 20 20 73 65 74 20 6d 65 6d 6f 72 79 20 75 6e     set memory un
fbc0: 6b 6e 6f 77 6e 0d 0a 0d 0a 20 20 20 20 20 20 20  known....       
fbd0: 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68   if {!$quiet} th
fbe0: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
fbf0: 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b  tputs $channel [
fc00: 61 70 70 65 6e 64 41 72 67 73 20 24 6d 65 6d 6f  appendArgs $memo
fc10: 72 79 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20  ry \n]..        
fc20: 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  }..      }....  
fc30: 20 20 20 20 73 65 74 20 72 65 73 75 6c 74 20 24      set result $
fc40: 6d 65 6d 6f 72 79 3b 20 23 20 4e 4f 54 45 3a 20  memory; # NOTE: 
fc50: 52 65 74 75 72 6e 20 6d 65 6d 6f 72 79 20 69 6e  Return memory in
fc60: 2d 75 73 65 20 74 6f 20 6f 75 72 20 63 61 6c 6c  -use to our call
fc70: 65 72 2e 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20  er.....      if 
fc80: 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b  {!$quiet} then {
fc90: 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20  ..        tputs 
fca0: 24 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 6d  $channel "---- m
fcb0: 61 78 69 6d 75 6d 20 6d 65 6d 6f 72 79 20 69 6e  aximum memory in
fcc0: 20 75 73 65 20 62 79 20 53 51 4c 69 74 65 2e 2e   use by SQLite..
fcd0: 2e 20 22 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a  . "..      }....
fce0: 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68        if {[catch
fcf0: 20 7b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20   {object invoke 
fd00: 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69  -flags +NonPubli
fd10: 63 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  c \..           
fd20: 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53     System.Data.S
fd30: 51 4c 69 74 65 2e 55 6e 73 61 66 65 4e 61 74 69  QLite.UnsafeNati
fd40: 76 65 4d 65 74 68 6f 64 73 20 5c 0d 0a 20 20 20  veMethods \..   
fd50: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
fd60: 65 33 5f 6d 65 6d 6f 72 79 5f 68 69 67 68 77 61  e3_memory_highwa
fd70: 74 65 72 20 30 7d 20 6d 65 6d 6f 72 79 5d 20 3d  ter 0} memory] =
fd80: 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  = 0} then {..   
fd90: 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74       if {!$quiet
fda0: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
fdb0: 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
fdc0: 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 24  el [appendArgs $
fdd0: 6d 65 6d 6f 72 79 20 22 20 62 79 74 65 73 5c 6e  memory " bytes\n
fde0: 22 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20  "]..        }.. 
fdf0: 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
fe00: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
fe10: 20 20 23 20 4e 4f 54 45 3a 20 4d 61 79 62 65 20    # NOTE: Maybe 
fe20: 74 68 65 20 53 51 4c 69 74 65 20 63 6f 72 65 20  the SQLite core 
fe30: 6c 69 62 72 61 72 79 20 69 73 20 75 6e 61 76 61  library is unava
fe40: 69 6c 61 62 6c 65 3f 0d 0a 20 20 20 20 20 20 20  ilable?..       
fe50: 20 23 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20   #..        set 
fe60: 6d 65 6d 6f 72 79 20 75 6e 6b 6e 6f 77 6e 0d 0a  memory unknown..
fe70: 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21 24  ..        if {!$
fe80: 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20  quiet} then {.. 
fe90: 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
fea0: 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
feb0: 72 67 73 20 24 6d 65 6d 6f 72 79 20 5c 6e 5d 0d  rgs $memory \n].
fec0: 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  .        }..    
fed0: 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20    }....      if 
fee0: 7b 24 63 6f 6c 6c 65 63 74 7d 20 74 68 65 6e 20  {$collect} then 
fef0: 7b 0d 0a 20 20 20 20 20 20 20 20 63 6f 6c 6c 65  {..        colle
ff00: 63 74 47 61 72 62 61 67 65 20 24 63 68 61 6e 6e  ctGarbage $chann
ff10: 65 6c 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  el..      }.... 
ff20: 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74       if {!$quiet
ff30: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
ff40: 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
ff50: 20 22 2d 2d 2d 2d 20 63 75 72 72 65 6e 74 20 6d   "---- current m
ff60: 65 6d 6f 72 79 20 69 6e 20 75 73 65 20 62 79 20  emory in use by 
ff70: 74 68 65 20 43 4c 52 2e 2e 2e 20 22 0d 0a 20 20  the CLR... "..  
ff80: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 69      }....      i
ff90: 66 20 7b 5b 63 61 74 63 68 20 7b 6f 62 6a 65 63  f {[catch {objec
ffa0: 74 20 69 6e 76 6f 6b 65 20 47 43 20 47 65 74 54  t invoke GC GetT
ffb0: 6f 74 61 6c 4d 65 6d 6f 72 79 20 66 61 6c 73 65  otalMemory false
ffc0: 7d 20 6d 65 6d 6f 72 79 5d 20 3d 3d 20 30 7d 20  } memory] == 0} 
ffd0: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
ffe0: 69 66 20 7b 5b 73 74 72 69 6e 67 20 69 73 20 69  if {[string is i
fff0: 6e 74 65 67 65 72 20 2d 73 74 72 69 63 74 20 24  nteger -strict $
10000 6d 65 6d 6f 72 79 5d 7d 20 74 68 65 6e 20 7b 0d  memory]} then {.
10010 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21  .          if {!
10020 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a  $quiet} then {..
10030 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
10040 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  s $channel [appe
10050 6e 64 41 72 67 73 20 24 6d 65 6d 6f 72 79 20 22  ndArgs $memory "
10060 20 62 79 74 65 73 5c 6e 22 5d 0d 0a 20 20 20 20   bytes\n"]..    
10070 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
10080 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
10090 20 20 20 20 20 73 65 74 20 6d 65 6d 6f 72 79 20       set memory 
100a0 69 6e 76 61 6c 69 64 0d 0a 0d 0a 20 20 20 20 20  invalid....     
100b0 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74       if {!$quiet
100c0 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
100d0 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
100e0 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
100f0 20 24 6d 65 6d 6f 72 79 20 5c 6e 5d 0d 0a 20 20   $memory \n]..  
10100 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
10110 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 20 65 6c     }..      } el
10120 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 65  se {..        se
10130 74 20 6d 65 6d 6f 72 79 20 75 6e 6b 6e 6f 77 6e  t memory unknown
10140 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b  ....        if {
10150 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d  !$quiet} then {.
10160 0a 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73  .          tputs
10170 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e   $channel [appen
10180 64 41 72 67 73 20 24 6d 65 6d 6f 72 79 20 5c 6e  dArgs $memory \n
10190 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  ]..        }..  
101a0 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 72      }....      r
101b0 65 74 75 72 6e 20 24 72 65 73 75 6c 74 0d 0a 20  eturn $result.. 
101c0 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
101d0 63 20 63 68 65 63 6b 46 6f 72 53 51 4c 69 74 65  c checkForSQLite
101e0 44 69 72 65 63 74 6f 72 69 65 73 20 7b 20 63 68  Directories { ch
101f0 61 6e 6e 65 6c 20 7b 72 65 73 65 74 20 66 61 6c  annel {reset fal
10200 73 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23  se} } {..      #
10210 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
10220 43 68 65 63 6b 20 69 66 20 74 68 65 20 73 71 6c  Check if the sql
10230 69 74 65 33 5f 77 69 6e 33 32 5f 73 65 74 5f 64  ite3_win32_set_d
10240 69 72 65 63 74 6f 72 79 20 66 75 6e 63 74 69 6f  irectory functio
10250 6e 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2e 0d  n is available..
10260 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
10270 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5c  tputs $channel \
10280 0d 0a 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d  ..          "---
10290 2d 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 66  - checking for f
102a0 75 6e 63 74 69 6f 6e 20 73 71 6c 69 74 65 33 5f  unction sqlite3_
102b0 77 69 6e 33 32 5f 73 65 74 5f 64 69 72 65 63 74  win32_set_direct
102c0 6f 72 79 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20  ory... "....    
102d0 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
102e0 45 3a 20 54 68 69 73 20 63 61 6c 6c 20 74 6f 20  E: This call to 
102f0 74 68 65 20 73 71 6c 69 74 65 33 5f 77 69 6e 33  the sqlite3_win3
10300 32 5f 73 65 74 5f 64 69 72 65 63 74 6f 72 79 20  2_set_directory 
10310 66 75 6e 63 74 69 6f 6e 20 75 73 65 73 20 74 68  function uses th
10320 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  e..      #      
10330 20 69 6e 76 61 6c 69 64 20 76 61 6c 75 65 20 30   invalid value 0
10340 20 66 6f 72 20 74 68 65 20 66 69 72 73 74 20 61   for the first a
10350 72 67 75 6d 65 6e 74 2e 20 20 54 68 69 73 20 63  rgument.  This c
10360 6f 64 65 20 69 73 20 64 65 73 69 67 6e 65 64 0d  ode is designed.
10370 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74  .      #       t
10380 6f 20 63 68 65 63 6b 20 69 66 20 63 61 6c 6c 69  o check if calli
10390 6e 67 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20  ng the function 
103a0 77 69 6c 6c 20 72 61 69 73 65 20 61 6e 20 65 78  will raise an ex
103b0 63 65 70 74 69 6f 6e 20 28 69 2e 65 2e 0d 0a 20  ception (i.e... 
103c0 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68 65       #       the
103d0 20 61 63 74 75 61 6c 20 72 65 73 75 6c 74 20 6f   actual result o
103e0 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 64  f the function d
103f0 6f 65 73 20 6e 6f 74 20 6d 61 74 74 65 72 20 61  oes not matter a
10400 73 20 6c 6f 6e 67 20 61 73 20 6e 6f 0d 0a 20 20  s long as no..  
10410 20 20 20 20 23 20 20 20 20 20 20 20 64 69 72 65      #       dire
10420 63 74 6f 72 79 20 69 73 20 63 68 61 6e 67 65 64  ctory is changed
10430 29 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  )...      #..   
10440 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d     if {[catch {.
10450 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f  .              o
10460 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c  bject invoke -fl
10470 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c  ags +NonPublic \
10480 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
10490 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
104a0 74 65 2e 55 6e 73 61 66 65 4e 61 74 69 76 65 4d  te.UnsafeNativeM
104b0 65 74 68 6f 64 73 20 5c 0d 0a 20 20 20 20 20 20  ethods \..      
104c0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
104d0 77 69 6e 33 32 5f 73 65 74 5f 64 69 72 65 63 74  win32_set_direct
104e0 6f 72 79 20 30 20 6e 75 6c 6c 7d 5d 20 3d 3d 20  ory 0 null}] == 
104f0 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
10500 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
10510 4e 4f 54 45 3a 20 43 61 6c 6c 69 6e 67 20 74 68  NOTE: Calling th
10520 65 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f  e sqlite3_win32_
10530 73 65 74 5f 64 69 72 65 63 74 6f 72 79 20 66 75  set_directory fu
10540 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 0d  nction does not.
10550 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
10560 20 63 61 75 73 65 20 61 6e 20 65 78 63 65 70 74   cause an except
10570 69 6f 6e 3b 20 74 68 65 72 65 66 6f 72 65 2c 20  ion; therefore, 
10580 69 74 20 6d 75 73 74 20 62 65 20 61 76 61 69 6c  it must be avail
10590 61 62 6c 65 20 28 69 2e 65 2e 0d 0a 20 20 20 20  able (i.e...    
105a0 20 20 20 20 23 20 20 20 20 20 20 20 65 76 65 6e      #       even
105b0 20 74 68 6f 75 67 68 20 69 74 20 73 68 6f 75 6c   though it shoul
105c0 64 20 72 65 74 75 72 6e 20 61 20 66 61 69 6c 75  d return a failu
105d0 72 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20 69  re return code i
105e0 6e 20 74 68 69 73 0d 0a 20 20 20 20 20 20 20 20  n this..        
105f0 23 20 20 20 20 20 20 20 63 61 73 65 29 2e 0d 0a  #       case)...
10600 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
10610 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74     addConstraint
10620 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73   sqlite3_win32_s
10630 65 74 5f 64 69 72 65 63 74 6f 72 79 0d 0a 0d 0a  et_directory....
10640 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
10650 68 61 6e 6e 65 6c 20 79 65 73 5c 6e 0d 0a 0d 0a  hannel yes\n....
10660 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
10670 20 20 20 23 20 4e 4f 54 45 3a 20 44 6f 65 73 20     # NOTE: Does 
10680 6f 75 72 20 63 61 6c 6c 65 72 20 77 61 6e 74 20  our caller want 
10690 74 6f 20 72 65 73 65 74 20 74 68 65 20 64 69 72  to reset the dir
106a0 65 63 74 6f 72 69 65 73 3f 0d 0a 20 20 20 20 20  ectories?..     
106b0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 69 66     #..        if
106c0 20 7b 24 72 65 73 65 74 7d 20 74 68 65 6e 20 7b   {$reset} then {
106d0 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20  ..          #.. 
106e0 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a           # NOTE:
106f0 20 4e 6f 77 20 6d 61 6b 65 20 73 75 72 65 20 74   Now make sure t
10700 68 65 20 64 61 74 61 62 61 73 65 20 61 6e 64 20  he database and 
10710 74 65 6d 70 6f 72 61 72 79 20 64 69 72 65 63 74  temporary direct
10720 6f 72 69 65 73 20 61 72 65 0d 0a 20 20 20 20 20  ories are..     
10730 20 20 20 20 20 23 20 20 20 20 20 20 20 72 65 73       #       res
10740 65 74 20 74 68 65 69 72 20 64 65 66 61 75 6c 74  et their default
10750 20 76 61 6c 75 65 73 2c 20 77 68 69 63 68 20 73   values, which s
10760 68 6f 75 6c 64 20 62 65 20 6e 75 6c 6c 20 66 6f  hould be null fo
10770 72 20 62 6f 74 68 2e 0d 0a 20 20 20 20 20 20 20  r both...       
10780 20 20 20 23 20 20 20 20 20 20 20 53 69 6e 63 65     #       Since
10790 20 74 68 65 20 73 71 6c 69 74 65 33 5f 77 69 6e   the sqlite3_win
107a0 33 32 5f 73 65 74 5f 64 69 72 65 63 74 6f 72 79  32_set_directory
107b0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 76 61   function is ava
107c0 69 6c 61 62 6c 65 2c 0d 0a 20 20 20 20 20 20 20  ilable,..       
107d0 20 20 20 23 20 20 20 20 20 20 20 75 73 65 20 69     #       use i
107e0 74 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d  t...          #.
107f0 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 20 7b  .          for {
10800 73 65 74 20 69 6e 64 65 78 20 31 7d 20 7b 24 69  set index 1} {$i
10810 6e 64 65 78 20 3c 20 33 7d 20 7b 69 6e 63 72 20  ndex < 3} {incr 
10820 69 6e 64 65 78 7d 20 7b 0d 0a 20 20 20 20 20 20  index} {..      
10830 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68        if {[catch
10840 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
10850 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69          object i
10860 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f  nvoke -flags +No
10870 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20  nPublic \..     
10880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
10890 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
108a0 65 2e 55 6e 73 61 66 65 4e 61 74 69 76 65 4d 65  e.UnsafeNativeMe
108b0 74 68 6f 64 73 20 5c 0d 0a 20 20 20 20 20 20 20  thods \..       
108c0 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
108d0 69 74 65 33 5f 77 69 6e 33 32 5f 73 65 74 5f 64  ite3_win32_set_d
108e0 69 72 65 63 74 6f 72 79 20 24 69 6e 64 65 78 20  irectory $index 
108f0 6e 75 6c 6c 7d 20 5c 0d 0a 20 20 20 20 20 20 20  null} \..       
10900 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 73               res
10910 75 6c 74 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20  ult] == 0} then 
10920 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
10930 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
10940 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
10950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10960 20 22 2d 2d 2d 2d 20 63 61 6c 6c 20 73 71 6c 69   "---- call sqli
10970 74 65 33 5f 77 69 6e 33 32 5f 73 65 74 5f 64 69  te3_win32_set_di
10980 72 65 63 74 6f 72 79 28 22 20 24 69 6e 64 65 78  rectory(" $index
10990 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
109a0 20 20 20 20 20 20 22 2c 20 6e 75 6c 6c 29 2e 2e        ", null)..
109b0 2e 20 6f 6b 3a 20 22 20 24 72 65 73 75 6c 74 20  . ok: " $result 
109c0 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20  \n]..           
109d0 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
109e0 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
109f0 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
10a00 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
10a10 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63           "---- c
10a20 61 6c 6c 20 73 71 6c 69 74 65 33 5f 77 69 6e 33  all sqlite3_win3
10a30 32 5f 73 65 74 5f 64 69 72 65 63 74 6f 72 79 28  2_set_directory(
10a40 22 20 24 69 6e 64 65 78 20 5c 0d 0a 20 20 20 20  " $index \..    
10a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2c                ",
10a60 20 6e 75 6c 6c 29 2e 2e 2e 20 65 72 72 6f 72 3a   null)... error:
10a70 20 22 20 5c 6e 5c 74 20 24 72 65 73 75 6c 74 20   " \n\t $result 
10a80 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20  \n]..           
10a90 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d   }..          }.
10aa0 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  .        }..    
10ab0 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
10ac0 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
10ad0 65 6c 20 6e 6f 5c 6e 0d 0a 0d 0a 20 20 20 20 20  el no\n....     
10ae0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
10af0 4e 4f 54 45 3a 20 44 6f 65 73 20 6f 75 72 20 63  NOTE: Does our c
10b00 61 6c 6c 65 72 20 77 61 6e 74 20 74 6f 20 72 65  aller want to re
10b10 73 65 74 20 74 68 65 20 64 69 72 65 63 74 6f 72  set the director
10b20 69 65 73 3f 20 20 54 68 69 73 20 63 61 6e 20 6f  ies?  This can o
10b30 6e 6c 79 0d 0a 20 20 20 20 20 20 20 20 23 20 20  nly..        #  
10b40 20 20 20 20 20 62 65 20 70 65 72 66 6f 72 6d 65       be performe
10b50 64 20 69 66 20 53 51 4c 69 74 65 20 69 73 20 6c  d if SQLite is l
10b60 6f 61 64 65 64 20 61 6e 64 20 72 65 61 64 79 20  oaded and ready 
10b70 66 6f 72 20 75 73 65 20 62 79 20 74 68 65 20 74  for use by the t
10b80 65 73 74 0d 0a 20 20 20 20 20 20 20 20 23 20 20  est..        #  
10b90 20 20 20 20 20 73 75 69 74 65 2e 0d 0a 20 20 20       suite...   
10ba0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
10bb0 69 66 20 7b 24 72 65 73 65 74 20 26 26 20 5b 69  if {$reset && [i
10bc0 73 53 51 4c 69 74 65 52 65 61 64 79 5d 7d 20 74  sSQLiteReady]} t
10bd0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
10be0 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20   #..          # 
10bf0 4e 4f 54 45 3a 20 4e 6f 77 20 6d 61 6b 65 20 73  NOTE: Now make s
10c00 75 72 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ure the database
10c10 20 61 6e 64 20 74 65 6d 70 6f 72 61 72 79 20 64   and temporary d
10c20 69 72 65 63 74 6f 72 69 65 73 20 61 72 65 0d 0a  irectories are..
10c30 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20            #     
10c40 20 20 72 65 73 65 74 20 74 68 65 69 72 20 64 65    reset their de
10c50 66 61 75 6c 74 20 76 61 6c 75 65 73 2c 20 77 68  fault values, wh
10c60 69 63 68 20 73 68 6f 75 6c 64 20 62 65 20 6e 75  ich should be nu
10c70 6c 6c 20 66 6f 72 20 62 6f 74 68 2e 0d 0a 20 20  ll for both...  
10c80 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
10c90 53 69 6e 63 65 20 74 68 65 20 73 71 6c 69 74 65  Since the sqlite
10ca0 33 5f 77 69 6e 33 32 5f 73 65 74 5f 64 69 72 65  3_win32_set_dire
10cb0 63 74 6f 72 79 20 66 75 6e 63 74 69 6f 6e 20 64  ctory function d
10cc0 6f 65 73 20 6e 6f 74 0d 0a 20 20 20 20 20 20 20  oes not..       
10cd0 20 20 20 23 20 20 20 20 20 20 20 61 70 70 65 61     #       appea
10ce0 72 20 74 6f 20 62 65 20 61 76 61 69 6c 61 62 6c  r to be availabl
10cf0 65 2c 20 75 73 65 20 74 68 65 20 61 73 73 6f 63  e, use the assoc
10d00 69 61 74 65 64 20 50 52 41 47 4d 41 20 63 6f 6d  iated PRAGMA com
10d10 6d 61 6e 64 73 0d 0a 20 20 20 20 20 20 20 20 20  mands..         
10d20 20 23 20 20 20 20 20 20 20 69 6e 73 74 65 61 64   #       instead
10d30 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a  ...          #..
10d40 20 20 20 20 20 20 20 20 20 20 66 6f 72 65 61 63            foreac
10d50 68 20 64 69 72 65 63 74 6f 72 79 20 5b 6c 69 73  h directory [lis
10d60 74 20 64 61 74 61 5f 73 74 6f 72 65 5f 64 69 72  t data_store_dir
10d70 65 63 74 6f 72 79 20 74 65 6d 70 5f 73 74 6f 72  ectory temp_stor
10d80 65 5f 64 69 72 65 63 74 6f 72 79 5d 20 7b 0d 0a  e_directory] {..
10d90 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20              set 
10da0 73 71 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  sql [appendArgs 
10db0 22 50 52 41 47 4d 41 20 22 20 24 64 69 72 65 63  "PRAGMA " $direc
10dc0 74 6f 72 79 20 22 20 3d 20 5c 22 5c 22 3b 22 5d  tory " = \"\";"]
10dd0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
10de0 69 66 20 7b 5b 63 61 74 63 68 20 7b 65 78 65 63  if {[catch {exec
10df0 75 74 65 53 71 6c 20 24 73 71 6c 7d 20 72 65 73  uteSql $sql} res
10e00 75 6c 74 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20  ult] == 0} then 
10e10 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
10e20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
10e30 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
10e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10e50 20 22 2d 2d 2d 2d 20 65 78 65 63 75 74 65 20 50   "---- execute P
10e60 52 41 47 4d 41 20 22 20 24 64 69 72 65 63 74 6f  RAGMA " $directo
10e70 72 79 20 22 2e 2e 2e 20 6f 6b 3a 20 5c 22 22 20  ry "... ok: \"" 
10e80 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
10e90 20 20 20 20 20 24 72 65 73 75 6c 74 20 5c 22 5c       $result \"\
10ea0 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  n]..            
10eb0 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
10ec0 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
10ed0 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
10ee0 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
10ef0 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 65 78          "---- ex
10f00 65 63 75 74 65 20 50 52 41 47 4d 41 20 22 20 24  ecute PRAGMA " $
10f10 64 69 72 65 63 74 6f 72 79 20 22 2e 2e 2e 20 65  directory "... e
10f20 72 72 6f 72 3a 20 22 20 5c 0d 0a 20 20 20 20 20  rror: " \..     
10f30 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 6e 5c               \n\
10f40 74 20 24 72 65 73 75 6c 74 20 5c 6e 5d 0d 0a 20  t $result \n].. 
10f50 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
10f60 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
10f70 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d     }..      }...
10f80 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
10f90 23 20 4e 4f 54 45 3a 20 46 69 6e 61 6c 6c 79 2c  # NOTE: Finally,
10fa0 20 73 68 6f 77 20 74 68 65 20 63 75 72 72 65 6e   show the curren
10fb0 74 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 64  t value of the d
10fc0 61 74 61 62 61 73 65 20 61 6e 64 20 74 65 6d 70  atabase and temp
10fd0 6f 72 61 72 79 0d 0a 20 20 20 20 20 20 23 20 20  orary..      #  
10fe0 20 20 20 20 20 64 69 72 65 63 74 6f 72 69 65 73       directories
10ff0 2e 20 20 54 68 69 73 20 63 61 6e 20 6f 6e 6c 79  .  This can only
11000 20 62 65 20 70 65 72 66 6f 72 6d 65 64 20 69 66   be performed if
11010 20 53 51 4c 69 74 65 20 69 73 20 6c 6f 61 64 65   SQLite is loade
11020 64 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  d..      #      
11030 20 61 6e 64 20 72 65 61 64 79 20 66 6f 72 20 75   and ready for u
11040 73 65 20 62 79 20 74 68 65 20 74 65 73 74 20 73  se by the test s
11050 75 69 74 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  uite...      #..
11060 20 20 20 20 20 20 69 66 20 7b 5b 69 73 53 51 4c        if {[isSQL
11070 69 74 65 52 65 61 64 79 5d 7d 20 74 68 65 6e 20  iteReady]} then 
11080 7b 0d 0a 20 20 20 20 20 20 20 20 66 6f 72 65 61  {..        forea
11090 63 68 20 64 69 72 65 63 74 6f 72 79 20 5b 6c 69  ch directory [li
110a0 73 74 20 64 61 74 61 5f 73 74 6f 72 65 5f 64 69  st data_store_di
110b0 72 65 63 74 6f 72 79 20 74 65 6d 70 5f 73 74 6f  rectory temp_sto
110c0 72 65 5f 64 69 72 65 63 74 6f 72 79 5d 20 7b 0d  re_directory] {.
110d0 0a 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73  .          tputs
110e0 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e   $channel [appen
110f0 64 41 72 67 73 20 22 2d 2d 2d 2d 20 63 68 65 63  dArgs "---- chec
11100 6b 69 6e 67 20 22 20 24 64 69 72 65 63 74 6f 72  king " $director
11110 79 20 22 2e 2e 2e 20 22 5d 0d 0a 0d 0a 20 20 20  y "... "]....   
11120 20 20 20 20 20 20 20 73 65 74 20 73 71 6c 20 5b         set sql [
11130 61 70 70 65 6e 64 41 72 67 73 20 22 50 52 41 47  appendArgs "PRAG
11140 4d 41 20 22 20 24 64 69 72 65 63 74 6f 72 79 20  MA " $directory 
11150 5c 3b 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  \;]....         
11160 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 65 78 65   if {[catch {exe
11170 63 75 74 65 53 71 6c 20 24 73 71 6c 20 73 63 61  cuteSql $sql sca
11180 6c 61 72 7d 20 72 65 73 75 6c 74 5d 20 3d 3d 20  lar} result] == 
11190 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
111a0 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
111b0 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
111c0 73 20 22 6f 6b 3a 20 5c 22 22 20 24 72 65 73 75  s "ok: \"" $resu
111d0 6c 74 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20  lt \"\n]..      
111e0 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
111f0 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
11200 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  $channel [append
11210 41 72 67 73 20 22 65 72 72 6f 72 3a 20 22 20 5c  Args "error: " \
11220 6e 5c 74 20 24 72 65 73 75 6c 74 20 5c 6e 5d 0d  n\t $result \n].
11230 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  .          }..  
11240 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d        }..      }
11250 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
11260 70 72 6f 63 20 6c 6f 61 64 53 51 4c 69 74 65 54  proc loadSQLiteT
11270 65 73 74 53 65 74 74 69 6e 67 73 20 7b 20 63 68  estSettings { ch
11280 61 6e 6e 65 6c 20 7b 73 75 66 66 69 78 20 22 22  annel {suffix ""
11290 7d 20 7b 71 75 69 65 74 20 66 61 6c 73 65 7d 20  } {quiet false} 
112a0 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  } {..      #..  
112b0 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 6b 69 70      # NOTE: Skip
112c0 20 6c 6f 61 64 69 6e 67 20 74 68 65 20 73 65 74   loading the set
112d0 74 69 6e 67 73 20 69 66 20 74 68 65 69 72 20 75  tings if their u
112e0 73 61 67 65 20 68 61 73 20 62 65 65 6e 20 64 69  sage has been di
112f0 73 61 62 6c 65 64 2e 0d 0a 20 20 20 20 20 20 23  sabled...      #
11300 0d 0a 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e  ..      if {![in
11310 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 73  fo exists ::no(s
11320 71 6c 69 74 65 54 65 73 74 53 65 74 74 69 6e 67  qliteTestSetting
11330 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  s)]} then {..   
11340 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
11350 23 20 4e 4f 54 45 3a 20 4c 6f 61 64 20 63 75 73  # NOTE: Load cus
11360 74 6f 6d 20 70 65 72 2d 75 73 65 72 20 61 6e 64  tom per-user and
11370 2f 6f 72 20 70 65 72 2d 68 6f 73 74 20 74 65 73  /or per-host tes
11380 74 20 73 65 74 74 69 6e 67 73 20 6e 6f 77 2e 0d  t settings now..
11390 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
113a0 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78      if {[info ex
113b0 69 73 74 73 20 3a 3a 74 63 6c 5f 70 6c 61 74 66  ists ::tcl_platf
113c0 6f 72 6d 28 75 73 65 72 29 5d 7d 20 74 68 65 6e  orm(user)]} then
113d0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65   {..          se
113e0 74 20 75 73 65 72 53 65 74 74 69 6e 67 73 46 69  t userSettingsFi
113f0 6c 65 4e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69  leName [file joi
11400 6e 20 5b 67 65 74 43 6f 6d 6d 6f 6e 44 69 72 65  n [getCommonDire
11410 63 74 6f 72 79 5d 20 5c 0d 0a 20 20 20 20 20 20  ctory] \..      
11420 20 20 20 20 20 20 20 20 5b 61 70 70 65 6e 64 41          [appendA
11430 72 67 73 20 73 65 74 74 69 6e 67 73 20 24 73 75  rgs settings $su
11440 66 66 69 78 20 2e 20 24 3a 3a 74 63 6c 5f 70 6c  ffix . $::tcl_pl
11450 61 74 66 6f 72 6d 28 75 73 65 72 29 20 2e 65 61  atform(user) .ea
11460 67 6c 65 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  gle]]....       
11470 20 20 20 69 66 20 7b 5b 66 69 6c 65 20 65 78 69     if {[file exi
11480 73 74 73 20 24 75 73 65 72 53 65 74 74 69 6e 67  sts $userSetting
11490 73 46 69 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e  sFileName]} then
114a0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
114b0 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65  if {!$quiet} the
114c0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
114d0 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
114e0 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
114f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
11500 20 20 20 22 2d 2d 2d 2d 20 6c 6f 61 64 69 6e 67     "---- loading
11510 20 70 65 72 2d 75 73 65 72 20 74 65 73 74 20 73   per-user test s
11520 65 74 74 69 6e 67 73 20 66 69 6c 65 20 5c 22 22  ettings file \""
11530 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
11540 20 20 20 20 20 20 24 75 73 65 72 53 65 74 74 69        $userSetti
11550 6e 67 73 46 69 6c 65 4e 61 6d 65 20 5c 22 2e 2e  ngsFileName \"..
11560 2e 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20  .\n]..          
11570 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20    }....         
11580 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 75     if {[catch {u
11590 70 6c 65 76 65 6c 20 31 20 5b 6c 69 73 74 20 73  plevel 1 [list s
115a0 6f 75 72 63 65 20 24 75 73 65 72 53 65 74 74 69  ource $userSetti
115b0 6e 67 73 46 69 6c 65 4e 61 6d 65 5d 7d 20 5c 0d  ngsFileName]} \.
115c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
115d0 20 20 20 20 20 65 72 72 6f 72 5d 7d 20 74 68 65       error]} the
115e0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
115f0 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20     if {!$quiet} 
11600 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
11610 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
11620 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
11630 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
11640 20 20 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20            "==== 
11650 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20  WARNING: failed 
11660 74 6f 20 6c 6f 61 64 20 70 65 72 2d 75 73 65 72  to load per-user
11670 20 73 65 74 74 69 6e 67 73 20 66 69 6c 65 20 5c   settings file \
11680 22 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  "" \..          
11690 20 20 20 20 20 20 20 20 20 20 24 75 73 65 72 53            $userS
116a0 65 74 74 69 6e 67 73 46 69 6c 65 4e 61 6d 65 20  ettingsFileName 
116b0 22 5c 22 2c 20 65 72 72 6f 72 3a 20 22 20 5c 6e  "\", error: " \n
116c0 5c 74 20 24 65 72 72 6f 72 20 5c 6e 5d 0d 0a 20  \t $error \n].. 
116d0 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a               }..
116e0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
116f0 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20           } else 
11700 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  {..            i
11710 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e  f {!$quiet} then
11720 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
11730 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
11740 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
11750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11760 20 20 22 2d 2d 2d 2d 20 73 6b 69 70 70 65 64 20    "---- skipped 
11770 6c 6f 61 64 69 6e 67 20 70 65 72 2d 75 73 65 72  loading per-user
11780 20 74 65 73 74 20 73 65 74 74 69 6e 67 73 20 66   test settings f
11790 69 6c 65 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20  ile \"" \..     
117a0 20 20 20 20 20 20 20 20 20 20 20 20 20 24 75 73               $us
117b0 65 72 53 65 74 74 69 6e 67 73 46 69 6c 65 4e 61  erSettingsFileNa
117c0 6d 65 20 22 5c 22 2c 20 69 74 20 64 6f 65 73 20  me "\", it does 
117d0 6e 6f 74 20 65 78 69 73 74 5c 6e 22 5d 0d 0a 20  not exist\n"].. 
117e0 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
117f0 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
11800 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
11810 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
11820 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
11830 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
11840 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
11850 23 23 23 23 23 23 23 0d 0a 0d 0a 20 20 20 20 20  #######....     
11860 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69     if {[info exi
11870 73 74 73 20 3a 3a 74 63 6c 5f 70 6c 61 74 66 6f  sts ::tcl_platfo
11880 72 6d 28 68 6f 73 74 29 5d 7d 20 74 68 65 6e 20  rm(host)]} then 
11890 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74  {..          set
118a0 20 68 6f 73 74 53 65 74 74 69 6e 67 73 46 69 6c   hostSettingsFil
118b0 65 4e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e  eName [file join
118c0 20 5b 67 65 74 43 6f 6d 6d 6f 6e 44 69 72 65 63   [getCommonDirec
118d0 74 6f 72 79 5d 20 5c 0d 0a 20 20 20 20 20 20 20  tory] \..       
118e0 20 20 20 20 20 20 20 5b 61 70 70 65 6e 64 41 72         [appendAr
118f0 67 73 20 73 65 74 74 69 6e 67 73 20 24 73 75 66  gs settings $suf
11900 66 69 78 20 2e 20 24 3a 3a 74 63 6c 5f 70 6c 61  fix . $::tcl_pla
11910 74 66 6f 72 6d 28 68 6f 73 74 29 20 2e 65 61 67  tform(host) .eag
11920 6c 65 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  le]]....        
11930 20 20 69 66 20 7b 5b 66 69 6c 65 20 65 78 69 73    if {[file exis
11940 74 73 20 24 68 6f 73 74 53 65 74 74 69 6e 67 73  ts $hostSettings
11950 46 69 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20  FileName]} then 
11960 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  {..            i
11970 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e  f {!$quiet} then
11980 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
11990 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
119a0 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
119b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
119c0 20 20 22 2d 2d 2d 2d 20 6c 6f 61 64 69 6e 67 20    "---- loading 
119d0 70 65 72 2d 68 6f 73 74 20 74 65 73 74 20 73 65  per-host test se
119e0 74 74 69 6e 67 73 20 66 69 6c 65 20 5c 22 22 20  ttings file \"" 
119f0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
11a00 20 20 20 20 20 24 68 6f 73 74 53 65 74 74 69 6e       $hostSettin
11a10 67 73 46 69 6c 65 4e 61 6d 65 20 5c 22 2e 2e 2e  gsFileName \"...
11a20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20  \n]..           
11a30 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   }....          
11a40 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 75 70    if {[catch {up
11a50 6c 65 76 65 6c 20 31 20 5b 6c 69 73 74 20 73 6f  level 1 [list so
11a60 75 72 63 65 20 24 68 6f 73 74 53 65 74 74 69 6e  urce $hostSettin
11a70 67 73 46 69 6c 65 4e 61 6d 65 5d 7d 20 5c 0d 0a  gsFileName]} \..
11a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11a90 20 20 20 20 65 72 72 6f 72 5d 7d 20 74 68 65 6e      error]} then
11aa0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
11ab0 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74    if {!$quiet} t
11ac0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
11ad0 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
11ae0 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
11af0 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
11b00 20 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57           "==== W
11b10 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20 74  ARNING: failed t
11b20 6f 20 6c 6f 61 64 20 70 65 72 2d 68 6f 73 74 20  o load per-host 
11b30 73 65 74 74 69 6e 67 73 20 66 69 6c 65 20 5c 22  settings file \"
11b40 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  " \..           
11b50 20 20 20 20 20 20 20 20 20 24 68 6f 73 74 53 65           $hostSe
11b60 74 74 69 6e 67 73 46 69 6c 65 4e 61 6d 65 20 22  ttingsFileName "
11b70 5c 22 2c 20 65 72 72 6f 72 3a 20 22 20 5c 6e 5c  \", error: " \n\
11b80 74 20 24 65 72 72 6f 72 20 5c 6e 5d 0d 0a 20 20  t $error \n]..  
11b90 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
11ba0 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
11bb0 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b          } else {
11bc0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ..            if
11bd0 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20   {!$quiet} then 
11be0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
11bf0 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
11c00 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
11c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11c20 20 22 2d 2d 2d 2d 20 73 6b 69 70 70 65 64 20 6c   "---- skipped l
11c30 6f 61 64 69 6e 67 20 70 65 72 2d 68 6f 73 74 20  oading per-host 
11c40 74 65 73 74 20 73 65 74 74 69 6e 67 73 20 66 69  test settings fi
11c50 6c 65 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20  le \"" \..      
11c60 20 20 20 20 20 20 20 20 20 20 20 20 24 68 6f 73              $hos
11c70 74 53 65 74 74 69 6e 67 73 46 69 6c 65 4e 61 6d  tSettingsFileNam
11c80 65 20 22 5c 22 2c 20 69 74 20 64 6f 65 73 20 6e  e "\", it does n
11c90 6f 74 20 65 78 69 73 74 5c 6e 22 5d 0d 0a 20 20  ot exist\n"]..  
11ca0 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
11cb0 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
11cc0 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20    }..      }..  
11cd0 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
11ce0 20 72 75 6e 53 51 4c 69 74 65 54 65 73 74 50 72   runSQLiteTestPr
11cf0 6f 6c 6f 67 75 65 20 7b 7d 20 7b 0d 0a 20 20 20  ologue {} {..   
11d00 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
11d10 54 45 3a 20 53 6b 69 70 20 72 75 6e 6e 69 6e 67  TE: Skip running
11d20 20 6f 75 72 20 63 75 73 74 6f 6d 20 70 72 6f 6c   our custom prol
11d30 6f 67 75 65 20 69 66 20 74 68 65 20 6d 61 69 6e  ogue if the main
11d40 20 6f 6e 65 20 68 61 73 20 62 65 65 6e 0d 0a 20   one has been.. 
11d50 20 20 20 20 20 23 20 20 20 20 20 20 20 73 6b 69       #       ski
11d60 70 70 65 64 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  pped...      #..
11d70 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f        if {![info
11d80 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 70 72 6f   exists ::no(pro
11d90 6c 6f 67 75 65 2e 65 61 67 6c 65 29 5d 7d 20 74  logue.eagle)]} t
11da0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  hen {..        #
11db0 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
11dc0 3a 20 4c 6f 61 64 20 74 68 65 20 22 62 65 66 6f  : Load the "befo
11dd0 72 65 2d 63 6f 6e 73 74 72 61 69 6e 74 73 22 20  re-constraints" 
11de0 63 75 73 74 6f 6d 20 70 65 72 2d 75 73 65 72 20  custom per-user 
11df0 61 6e 64 2f 6f 72 20 70 65 72 2d 68 6f 73 74 0d  and/or per-host.
11e00 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
11e10 20 74 65 73 74 20 73 65 74 74 69 6e 67 73 20 6e   test settings n
11e20 6f 77 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  ow...        #..
11e30 20 20 20 20 20 20 20 20 75 70 6c 65 76 65 6c 20          uplevel 
11e40 31 20 5b 6c 69 73 74 20 6c 6f 61 64 53 51 4c 69  1 [list loadSQLi
11e50 74 65 54 65 73 74 53 65 74 74 69 6e 67 73 20 24  teTestSettings $
11e60 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 2e  ::test_channel .
11e70 62 65 66 6f 72 65 5d 0d 0a 0d 0a 20 20 20 20 20  before]....     
11e80 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
11e90 4e 4f 54 45 3a 20 53 6b 69 70 20 61 6c 6c 20 53  NOTE: Skip all S
11ea0 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
11eb0 65 20 72 65 6c 61 74 65 64 20 66 69 6c 65 20 68  e related file h
11ec0 61 6e 64 6c 69 6e 67 20 28 64 65 6c 65 74 69 6e  andling (deletin
11ed0 67 2c 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  g,..        #   
11ee0 20 20 20 20 63 6f 70 79 69 6e 67 2c 20 61 6e 64      copying, and
11ef0 20 6c 6f 61 64 69 6e 67 29 20 69 66 20 77 65 20   loading) if we 
11f00 61 72 65 20 73 6f 20 69 6e 73 74 72 75 63 74 65  are so instructe
11f10 64 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  d...        #.. 
11f20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66         if {![inf
11f30 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 73 71  o exists ::no(sq
11f40 6c 69 74 65 46 69 6c 65 73 29 5d 7d 20 74 68 65  liteFiles)]} the
11f50 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 23  n {..          #
11f60 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f  ..          # NO
11f70 54 45 3a 20 53 6b 69 70 20 74 72 79 69 6e 67 20  TE: Skip trying 
11f80 74 6f 20 64 65 6c 65 74 65 20 61 6e 79 20 66 69  to delete any fi
11f90 6c 65 73 20 69 66 20 77 65 20 61 72 65 20 73 6f  les if we are so
11fa0 20 69 6e 73 74 72 75 63 74 65 64 2e 0d 0a 20 20   instructed...  
11fb0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
11fc0 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20       if {![info 
11fd0 65 78 69 73 74 73 20 3a 3a 6e 6f 28 64 65 6c 65  exists ::no(dele
11fe0 74 65 53 71 6c 69 74 65 46 69 6c 65 73 29 5d 7d  teSqliteFiles)]}
11ff0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
12000 20 20 20 20 20 74 72 79 44 65 6c 65 74 65 41 73       tryDeleteAs
12010 73 65 6d 62 6c 79 20 73 71 6c 69 74 65 33 2e 64  sembly sqlite3.d
12020 6c 6c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ll..            
12030 72 65 6d 6f 76 65 43 6f 6e 73 74 72 61 69 6e 74  removeConstraint
12040 20 66 69 6c 65 5f 73 71 6c 69 74 65 33 2e 64 6c   file_sqlite3.dl
12050 6c 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  l....           
12060 20 74 72 79 44 65 6c 65 74 65 41 73 73 65 6d 62   tryDeleteAssemb
12070 6c 79 20 53 51 4c 69 74 65 2e 49 6e 74 65 72 6f  ly SQLite.Intero
12080 70 2e 64 6c 6c 0d 0a 20 20 20 20 20 20 20 20 20  p.dll..         
12090 20 20 20 72 65 6d 6f 76 65 43 6f 6e 73 74 72 61     removeConstra
120a0 69 6e 74 20 66 69 6c 65 5f 53 51 4c 69 74 65 2e  int file_SQLite.
120b0 49 6e 74 65 72 6f 70 2e 64 6c 6c 0d 0a 0d 0a 20  Interop.dll.... 
120c0 20 20 20 20 20 20 20 20 20 20 20 74 72 79 44 65             tryDe
120d0 6c 65 74 65 41 73 73 65 6d 62 6c 79 20 53 79 73  leteAssembly Sys
120e0 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e  tem.Data.SQLite.
120f0 64 6c 6c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  dll..           
12100 20 72 65 6d 6f 76 65 43 6f 6e 73 74 72 61 69 6e   removeConstrain
12110 74 20 66 69 6c 65 5f 53 79 73 74 65 6d 2e 44 61  t file_System.Da
12120 74 61 2e 53 51 4c 69 74 65 2e 64 6c 6c 0d 0a 0d  ta.SQLite.dll...
12130 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 72 79  .            try
12140 44 65 6c 65 74 65 41 73 73 65 6d 62 6c 79 20 53  DeleteAssembly S
12150 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
12160 65 2e 4c 69 6e 71 2e 64 6c 6c 0d 0a 20 20 20 20  e.Linq.dll..    
12170 20 20 20 20 20 20 20 20 72 65 6d 6f 76 65 43 6f          removeCo
12180 6e 73 74 72 61 69 6e 74 20 66 69 6c 65 5f 53 79  nstraint file_Sy
12190 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
121a0 2e 4c 69 6e 71 2e 64 6c 6c 0d 0a 20 20 20 20 20  .Linq.dll..     
121b0 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
121c0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
121d0 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 66   # NOTE: Check f
121e0 6f 72 20 74 68 65 20 22 61 75 74 6f 53 65 6c 65  or the "autoSele
121f0 63 74 22 20 72 75 6e 74 69 6d 65 20 6f 70 74 69  ct" runtime opti
12200 6f 6e 2e 20 20 49 66 20 70 72 65 73 65 6e 74 2c  on.  If present,
12210 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 20 20  ..          #   
12220 20 20 20 20 61 74 74 65 6d 70 74 20 74 6f 20 61      attempt to a
12230 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 73 65 6c  utomatically sel
12240 65 63 74 20 74 68 65 20 66 69 72 73 74 20 61 76  ect the first av
12250 61 69 6c 61 62 6c 65 0d 0a 20 20 20 20 20 20 20  ailable..       
12260 20 20 20 23 20 20 20 20 20 20 20 62 75 69 6c 64     #       build
12270 20 28 6f 72 20 22 72 65 6c 65 61 73 65 22 29 20   (or "release") 
12280 6f 66 20 53 51 4c 69 74 65 20 61 6e 64 20 53 79  of SQLite and Sy
12290 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
122a0 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 20 20  ..          #   
122b0 20 20 20 20 66 6f 72 20 75 73 65 20 77 69 74 68      for use with
122c0 20 74 68 65 20 74 65 73 74 20 73 75 69 74 65 2e   the test suite.
122d0 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20  ..          #.. 
122e0 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 68 61           if {[ha
122f0 73 52 75 6e 74 69 6d 65 4f 70 74 69 6f 6e 20 61  sRuntimeOption a
12300 75 74 6f 53 65 6c 65 63 74 5d 7d 20 74 68 65 6e  utoSelect]} then
12310 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
12320 69 66 20 7b 21 5b 63 68 65 63 6b 46 6f 72 53 51  if {![checkForSQ
12330 4c 69 74 65 42 75 69 6c 64 73 20 24 3a 3a 74 65  LiteBuilds $::te
12340 73 74 5f 63 68 61 6e 6e 65 6c 20 74 72 75 65 5d  st_channel true]
12350 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
12360 20 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72          checkFor
12370 53 51 4c 69 74 65 52 65 6c 65 61 73 65 73 20 24  SQLiteReleases $
12380 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 74  ::test_channel t
12390 72 75 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20  rue..           
123a0 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d   }..          }.
123b0 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a  ...          #..
123c0 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45            # NOTE
123d0 3a 20 53 6b 69 70 20 74 72 79 69 6e 67 20 74 6f  : Skip trying to
123e0 20 76 65 72 69 66 79 20 74 68 65 20 62 75 69 6c   verify the buil
123f0 64 20 64 69 72 65 63 74 6f 72 79 20 69 66 20 77  d directory if w
12400 65 20 61 72 65 20 73 6f 0d 0a 20 20 20 20 20 20  e are so..      
12410 20 20 20 20 23 20 20 20 20 20 20 20 69 6e 73 74      #       inst
12420 72 75 63 74 65 64 3b 20 6f 74 68 65 72 77 69 73  ructed; otherwis
12430 65 2c 20 6d 61 6b 65 20 73 75 72 65 20 69 74 20  e, make sure it 
12440 61 63 74 75 61 6c 6c 79 20 65 78 69 73 74 73 20  actually exists 
12450 6f 72 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20  or..          # 
12460 20 20 20 20 20 20 68 61 6c 74 20 74 68 65 20 65        halt the e
12470 6e 74 69 72 65 20 74 65 73 74 69 6e 67 20 70 72  ntire testing pr
12480 6f 63 65 73 73 20 69 66 20 69 74 20 64 6f 65 73  ocess if it does
12490 20 6e 6f 74 20 65 78 69 73 74 2e 0d 0a 20 20 20   not exist...   
124a0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
124b0 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65      if {![info e
124c0 78 69 73 74 73 20 3a 3a 6e 6f 28 76 65 72 69 66  xists ::no(verif
124d0 79 42 75 69 6c 64 44 69 72 65 63 74 6f 72 79 29  yBuildDirectory)
124e0 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
124f0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
12500 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 74        # NOTE: At
12510 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65   this point, the
12520 20 62 75 69 6c 64 20 64 69 72 65 63 74 6f 72 79   build directory
12530 20 4d 55 53 54 20 65 78 69 73 74 20 61 73 20 61   MUST exist as a
12540 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 20  ..            # 
12550 20 20 20 20 20 20 76 61 6c 69 64 20 64 69 72 65        valid dire
12560 63 74 6f 72 79 20 66 6f 72 20 74 68 65 20 74 65  ctory for the te
12570 73 74 69 6e 67 20 70 72 6f 63 65 73 73 20 74 6f  sting process to
12580 20 63 6f 6e 74 69 6e 75 65 2e 0d 0a 20 20 20 20   continue...    
12590 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
125a0 20 20 20 20 20 20 20 73 65 74 20 64 69 72 65 63         set direc
125b0 74 6f 72 79 20 5b 67 65 74 42 75 69 6c 64 44 69  tory [getBuildDi
125c0 72 65 63 74 6f 72 79 5d 0d 0a 0d 0a 20 20 20 20  rectory]....    
125d0 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 66 69          if {![fi
125e0 6c 65 20 65 78 69 73 74 73 20 24 64 69 72 65 63  le exists $direc
125f0 74 6f 72 79 5d 20 7c 7c 20 5c 0d 0a 20 20 20 20  tory] || \..    
12600 20 20 20 20 20 20 20 20 20 20 20 20 21 5b 66 69              ![fi
12610 6c 65 20 69 73 64 69 72 65 63 74 6f 72 79 20 24  le isdirectory $
12620 64 69 72 65 63 74 6f 72 79 5d 7d 20 74 68 65 6e  directory]} then
12630 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
12640 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20    #..           
12650 20 20 20 23 20 4e 4f 54 45 3a 20 4a 75 73 74 20     # NOTE: Just 
12660 70 72 69 6f 72 20 74 6f 20 61 63 74 75 61 6c 6c  prior to actuall
12670 79 20 68 61 6c 74 69 6e 67 20 74 68 65 20 74 65  y halting the te
12680 73 74 69 6e 67 20 70 72 6f 63 65 73 73 2c 0d 0a  sting process,..
12690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20                # 
126a0 20 20 20 20 20 20 61 64 64 20 61 6e 20 65 72 72        add an err
126b0 6f 72 20 74 6f 20 74 68 65 20 74 65 73 74 20 6c  or to the test l
126c0 6f 67 20 66 69 6c 65 2e 0d 0a 20 20 20 20 20 20  og file...      
126d0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
126e0 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
126f0 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b  ::test_channel [
12700 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
12710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12720 22 2d 2d 2d 2d 20 63 6f 75 6c 64 20 6e 6f 74 20  "---- could not 
12730 76 65 72 69 66 79 20 62 75 69 6c 64 20 64 69 72  verify build dir
12740 65 63 74 6f 72 79 20 5c 22 22 20 24 64 69 72 65  ectory \"" $dire
12750 63 74 6f 72 79 20 5c 0d 0a 20 20 20 20 20 20 20  ctory \..       
12760 20 20 20 20 20 20 20 20 20 20 20 22 5c 22 2c 20             "\", 
12770 61 6c 6c 20 74 65 73 74 69 6e 67 20 68 61 6c 74  all testing halt
12780 65 64 5c 6e 22 5d 0d 0a 0d 0a 20 20 20 20 20 20  ed\n"]....      
12790 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
127a0 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a           # NOTE:
127b0 20 52 61 69 73 69 6e 67 20 61 20 73 63 72 69 70   Raising a scrip
127c0 74 20 65 72 72 6f 72 20 66 72 6f 6d 20 74 68 69  t error from thi
127d0 73 20 70 6f 69 6e 74 20 73 68 6f 75 6c 64 20 68  s point should h
127e0 61 6c 74 0d 0a 20 20 20 20 20 20 20 20 20 20 20  alt..           
127f0 20 20 20 23 20 20 20 20 20 20 20 74 68 65 20 74     #       the t
12800 65 73 74 69 6e 67 20 70 72 6f 63 65 73 73 2e 0d  esting process..
12810 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23  .              #
12820 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
12830 65 72 72 6f 72 20 5b 61 70 70 65 6e 64 41 72 67  error [appendArg
12840 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
12850 20 20 20 20 20 20 20 22 63 6f 75 6c 64 20 6e 6f         "could no
12860 74 20 76 65 72 69 66 79 20 62 75 69 6c 64 20 64  t verify build d
12870 69 72 65 63 74 6f 72 79 20 5c 22 22 20 24 64 69  irectory \"" $di
12880 72 65 63 74 6f 72 79 20 5c 0d 0a 20 20 20 20 20  rectory \..     
12890 20 20 20 20 20 20 20 20 20 20 20 20 20 22 5c 22               "\"
128a0 2c 20 61 6c 6c 20 74 65 73 74 69 6e 67 20 68 61  , all testing ha
128b0 6c 74 65 64 22 5d 0d 0a 20 20 20 20 20 20 20 20  lted"]..        
128c0 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
128d0 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   }....          
128e0 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e  #..          # N
128f0 4f 54 45 3a 20 53 6b 69 70 20 74 72 79 69 6e 67  OTE: Skip trying
12900 20 74 6f 20 63 6f 70 79 20 61 6e 79 20 66 69 6c   to copy any fil
12910 65 73 20 69 66 20 77 65 20 61 72 65 20 73 6f 20  es if we are so 
12920 69 6e 73 74 72 75 63 74 65 64 2e 0d 0a 20 20 20  instructed...   
12930 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
12940 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65      if {![info e
12950 78 69 73 74 73 20 3a 3a 6e 6f 28 63 6f 70 79 53  xists ::no(copyS
12960 71 6c 69 74 65 46 69 6c 65 73 29 5d 7d 20 74 68  qliteFiles)]} th
12970 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
12980 20 20 74 72 79 43 6f 70 79 41 73 73 65 6d 62 6c    tryCopyAssembl
12990 79 20 73 71 6c 69 74 65 33 2e 64 6c 6c 0d 0a 20  y sqlite3.dll.. 
129a0 20 20 20 20 20 20 20 20 20 20 20 74 72 79 43 6f             tryCo
129b0 70 79 41 73 73 65 6d 62 6c 79 20 53 51 4c 69 74  pyAssembly SQLit
129c0 65 2e 49 6e 74 65 72 6f 70 2e 64 6c 6c 0d 0a 20  e.Interop.dll.. 
129d0 20 20 20 20 20 20 20 20 20 20 20 74 72 79 43 6f             tryCo
129e0 70 79 41 73 73 65 6d 62 6c 79 20 53 79 73 74 65  pyAssembly Syste
129f0 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 64 6c  m.Data.SQLite.dl
12a00 6c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  l..            t
12a10 72 79 43 6f 70 79 41 73 73 65 6d 62 6c 79 20 53  ryCopyAssembly S
12a20 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
12a30 65 2e 4c 69 6e 71 2e 64 6c 6c 0d 0a 20 20 20 20  e.Linq.dll..    
12a40 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
12a50 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
12a60 20 20 23 20 4e 4f 54 45 3a 20 53 6b 69 70 20 74    # NOTE: Skip t
12a70 72 79 69 6e 67 20 74 6f 20 6c 6f 61 64 20 61 6e  rying to load an
12a80 79 20 66 69 6c 65 73 20 69 66 20 77 65 20 61 72  y files if we ar
12a90 65 20 73 6f 20 69 6e 73 74 72 75 63 74 65 64 2e  e so instructed.
12aa0 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20  ..          #.. 
12ab0 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69           if {![i
12ac0 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28  nfo exists ::no(
12ad0 6c 6f 61 64 53 71 6c 69 74 65 46 69 6c 65 73 29  loadSqliteFiles)
12ae0 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
12af0 20 20 20 20 20 20 20 74 72 79 4c 6f 61 64 41 73         tryLoadAs
12b00 73 65 6d 62 6c 79 20 53 79 73 74 65 6d 2e 44 61  sembly System.Da
12b10 74 61 2e 53 51 4c 69 74 65 2e 64 6c 6c 0d 0a 20  ta.SQLite.dll.. 
12b20 20 20 20 20 20 20 20 20 20 20 20 74 72 79 4c 6f             tryLo
12b30 61 64 41 73 73 65 6d 62 6c 79 20 53 79 73 74 65  adAssembly Syste
12b40 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 4c 69  m.Data.SQLite.Li
12b50 6e 71 2e 64 6c 6c 0d 0a 20 20 20 20 20 20 20 20  nq.dll..        
12b60 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20    }....         
12b70 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20   #..          # 
12b80 4e 4f 54 45 3a 20 53 6b 69 70 20 74 72 79 69 6e  NOTE: Skip tryin
12b90 67 20 74 6f 20 64 65 6c 65 74 65 20 65 78 74 65  g to delete exte
12ba0 72 6e 61 6c 20 66 69 6c 65 73 20 69 66 20 77 65  rnal files if we
12bb0 20 61 72 65 20 73 6f 20 69 6e 73 74 72 75 63 74   are so instruct
12bc0 65 64 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23  ed...          #
12bd0 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b  ..          if {
12be0 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  ![info exists ::
12bf0 6e 6f 28 64 65 6c 65 74 65 53 71 6c 69 74 65 45  no(deleteSqliteE
12c00 78 74 65 72 6e 61 6c 46 69 6c 65 73 29 5d 7d 20  xternalFiles)]} 
12c10 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
12c20 20 20 20 20 74 72 79 44 65 6c 65 74 65 42 75 69      tryDeleteBui
12c30 6c 64 46 69 6c 65 20 49 6e 73 74 61 6c 6c 65 72  ldFile Installer
12c40 2e 65 78 65 2e 6d 64 61 2e 63 6f 6e 66 69 67 0d  .exe.mda.config.
12c50 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 72 79  .            try
12c60 44 65 6c 65 74 65 42 75 69 6c 64 46 69 6c 65 20  DeleteBuildFile 
12c70 74 65 73 74 2e 65 78 65 2e 6d 64 61 2e 63 6f 6e  test.exe.mda.con
12c80 66 69 67 0d 0a 20 20 20 20 20 20 20 20 20 20 20  fig..           
12c90 20 74 72 79 44 65 6c 65 74 65 42 75 69 6c 64 46   tryDeleteBuildF
12ca0 69 6c 65 20 74 65 73 74 6c 69 6e 71 2e 65 78 65  ile testlinq.exe
12cb0 2e 6d 64 61 2e 63 6f 6e 66 69 67 0d 0a 20 20 20  .mda.config..   
12cc0 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
12cd0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
12ce0 20 20 20 23 20 4e 4f 54 45 3a 20 53 6b 69 70 20     # NOTE: Skip 
12cf0 74 72 79 69 6e 67 20 74 6f 20 63 6f 70 79 20 65  trying to copy e
12d00 78 74 65 72 6e 61 6c 20 66 69 6c 65 73 20 69 66  xternal files if
12d10 20 77 65 20 61 72 65 20 73 6f 20 69 6e 73 74 72   we are so instr
12d20 75 63 74 65 64 2e 0d 0a 20 20 20 20 20 20 20 20  ucted...        
12d30 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 69    #..          i
12d40 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73  f {![info exists
12d50 20 3a 3a 6e 6f 28 63 6f 70 79 53 71 6c 69 74 65   ::no(copySqlite
12d60 45 78 74 65 72 6e 61 6c 46 69 6c 65 73 29 5d 7d  ExternalFiles)]}
12d70 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
12d80 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
12d90 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 6f 70 79      # NOTE: Copy
12da0 20 74 68 65 20 4d 44 41 20 63 6f 6e 66 69 67 75   the MDA configu
12db0 72 61 74 69 6f 6e 20 66 69 6c 65 20 66 6f 72 20  ration file for 
12dc0 74 68 65 20 45 61 67 6c 65 20 73 68 65 6c 6c 20  the Eagle shell 
12dd0 74 6f 20 74 68 65 0d 0a 20 20 20 20 20 20 20 20  to the..        
12de0 20 20 20 20 23 20 20 20 20 20 20 20 62 75 69 6c      #       buil
12df0 64 20 6f 75 74 70 75 74 20 64 69 72 65 63 74 6f  d output directo
12e00 72 79 3b 20 68 6f 77 65 76 65 72 2c 20 75 73 65  ry; however, use
12e10 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
12e20 20 6c 65 67 61 63 79 0d 0a 20 20 20 20 20 20 20   legacy..       
12e30 20 20 20 20 20 23 20 20 20 20 20 20 20 74 65 73       #       tes
12e40 74 20 65 78 65 63 75 74 61 62 6c 65 2e 20 20 54  t executable.  T
12e50 68 69 73 20 77 69 6c 6c 20 6d 61 6b 65 20 73 75  his will make su
12e60 72 65 20 74 68 61 74 20 74 68 65 20 6c 65 67 61  re that the lega
12e70 63 79 20 74 65 73 74 73 0d 0a 20 20 20 20 20 20  cy tests..      
12e80 20 20 20 20 20 20 23 20 20 20 20 20 20 20 72 75        #       ru
12e90 6e 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20  n with the same 
12ea0 73 65 74 20 6f 66 20 4d 44 41 73 20 63 6f 6e 66  set of MDAs conf
12eb0 69 67 75 72 65 64 2e 0d 0a 20 20 20 20 20 20 20  igured...       
12ec0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
12ed0 20 20 20 20 74 72 79 43 6f 70 79 42 69 6e 61 72      tryCopyBinar
12ee0 79 46 69 6c 65 20 45 61 67 6c 65 53 68 65 6c 6c  yFile EagleShell
12ef0 2e 65 78 65 2e 6d 64 61 2e 63 6f 6e 66 69 67 20  .exe.mda.config 
12f00 49 6e 73 74 61 6c 6c 65 72 2e 65 78 65 2e 6d 64  Installer.exe.md
12f10 61 2e 63 6f 6e 66 69 67 0d 0a 20 20 20 20 20 20  a.config..      
12f20 20 20 20 20 20 20 74 72 79 43 6f 70 79 42 69 6e        tryCopyBin
12f30 61 72 79 46 69 6c 65 20 45 61 67 6c 65 53 68 65  aryFile EagleShe
12f40 6c 6c 2e 65 78 65 2e 6d 64 61 2e 63 6f 6e 66 69  ll.exe.mda.confi
12f50 67 20 74 65 73 74 2e 65 78 65 2e 6d 64 61 2e 63  g test.exe.mda.c
12f60 6f 6e 66 69 67 0d 0a 20 20 20 20 20 20 20 20 20  onfig..         
12f70 20 20 20 74 72 79 43 6f 70 79 42 69 6e 61 72 79     tryCopyBinary
12f80 46 69 6c 65 20 45 61 67 6c 65 53 68 65 6c 6c 2e  File EagleShell.
12f90 65 78 65 2e 6d 64 61 2e 63 6f 6e 66 69 67 20 74  exe.mda.config t
12fa0 65 73 74 6c 69 6e 71 2e 65 78 65 2e 6d 64 61 2e  estlinq.exe.mda.
12fb0 63 6f 6e 66 69 67 0d 0a 20 20 20 20 20 20 20 20  config..        
12fc0 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a    }..        }..
12fd0 0d 0a 20 20 20 20 20 20 20 20 63 61 74 63 68 20  ..        catch 
12fe0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70 75  {..          tpu
12ff0 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
13000 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
13010 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
13020 22 2d 2d 2d 2d 20 66 69 6c 65 20 76 65 72 73 69  "---- file versi
13030 6f 6e 20 6f 66 20 5c 22 73 71 6c 69 74 65 33 2e  on of \"sqlite3.
13040 64 6c 6c 5c 22 2e 2e 2e 20 22 20 5c 0d 0a 20 20  dll\"... " \..  
13050 20 20 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c              [fil
13060 65 20 76 65 72 73 69 6f 6e 20 5b 67 65 74 42 69  e version [getBi
13070 6e 61 72 79 46 69 6c 65 4e 61 6d 65 20 73 71 6c  naryFileName sql
13080 69 74 65 33 2e 64 6c 6c 5d 5d 20 5c 6e 5d 0d 0a  ite3.dll]] \n]..
13090 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
130a0 20 20 20 20 20 63 61 74 63 68 20 7b 0d 0a 20 20       catch {..  
130b0 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
130c0 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61  :test_channel [a
130d0 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
130e0 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
130f0 20 66 69 6c 65 20 76 65 72 73 69 6f 6e 20 6f 66   file version of
13100 20 5c 22 53 51 4c 69 74 65 2e 49 6e 74 65 72 6f   \"SQLite.Intero
13110 70 2e 64 6c 6c 5c 22 2e 2e 2e 20 22 20 5c 0d 0a  p.dll\"... " \..
13120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 66                [f
13130 69 6c 65 20 76 65 72 73 69 6f 6e 20 5b 67 65 74  ile version [get
13140 42 69 6e 61 72 79 46 69 6c 65 4e 61 6d 65 20 53  BinaryFileName S
13150 51 4c 69 74 65 2e 49 6e 74 65 72 6f 70 2e 64 6c  QLite.Interop.dl
13160 6c 5d 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20  l]] \n]..       
13170 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 63 61   }....        ca
13180 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  tch {..         
13190 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
131a0 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
131b0 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
131c0 20 20 20 20 22 2d 2d 2d 2d 20 66 69 6c 65 20 76      "---- file v
131d0 65 72 73 69 6f 6e 20 6f 66 20 5c 22 53 79 73 74  ersion of \"Syst
131e0 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 64  em.Data.SQLite.d
131f0 6c 6c 5c 22 2e 2e 2e 20 22 20 5c 0d 0a 20 20 20  ll\"... " \..   
13200 20 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65             [file
13210 20 76 65 72 73 69 6f 6e 20 5b 67 65 74 42 69 6e   version [getBin
13220 61 72 79 46 69 6c 65 4e 61 6d 65 20 53 79 73 74  aryFileName Syst
13230 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 64  em.Data.SQLite.d
13240 6c 6c 5d 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20 20  ll]] \n]..      
13250 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 63    }....        c
13260 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20  atch {..        
13270 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
13280 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
13290 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
132a0 20 20 20 20 20 22 2d 2d 2d 2d 20 66 69 6c 65 20       "---- file 
132b0 76 65 72 73 69 6f 6e 20 6f 66 20 5c 22 53 79 73  version of \"Sys
132c0 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e  tem.Data.SQLite.
132d0 4c 69 6e 71 2e 64 6c 6c 5c 22 2e 2e 2e 20 22 20  Linq.dll\"... " 
132e0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
132f0 20 5b 66 69 6c 65 20 76 65 72 73 69 6f 6e 20 5b   [file version [
13300 67 65 74 42 69 6e 61 72 79 46 69 6c 65 4e 61 6d  getBinaryFileNam
13310 65 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51  e System.Data.SQ
13320 4c 69 74 65 2e 4c 69 6e 71 2e 64 6c 6c 5d 5d 20  Lite.Linq.dll]] 
13330 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  \n]..        }..
13340 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 61 73  ..        set as
13350 73 65 6d 62 6c 69 65 73 20 5b 6f 62 6a 65 63 74  semblies [object
13360 20 69 6e 76 6f 6b 65 20 41 70 70 44 6f 6d 61 69   invoke AppDomai
13370 6e 2e 43 75 72 72 65 6e 74 44 6f 6d 61 69 6e 20  n.CurrentDomain 
13380 47 65 74 41 73 73 65 6d 62 6c 69 65 73 5d 0d 0a  GetAssemblies]..
13390 0d 0a 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74  ..        object
133a0 20 66 6f 72 65 61 63 68 20 61 73 73 65 6d 62 6c   foreach assembl
133b0 79 20 24 61 73 73 65 6d 62 6c 69 65 73 20 7b 0d  y $assemblies {.
133c0 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b  .          if {[
133d0 73 74 72 69 6e 67 20 6d 61 74 63 68 20 5c 7b 53  string match \{S
133e0 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
133f0 65 2a 20 24 61 73 73 65 6d 62 6c 79 5d 7d 20 74  e* $assembly]} t
13400 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
13410 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
13420 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  _channel [append
13430 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
13440 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 66 6f          "---- fo
13450 75 6e 64 20 61 73 73 65 6d 62 6c 79 3a 20 22 20  und assembly: " 
13460 24 61 73 73 65 6d 62 6c 79 20 5c 6e 5d 0d 0a 20  $assembly \n].. 
13470 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
13480 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
13490 20 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20   catch {..      
134a0 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
134b0 74 5f 63 68 61 6e 6e 65 6c 20 5c 0d 0a 20 20 20  t_channel \..   
134c0 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
134d0 20 64 65 66 69 6e 65 20 63 6f 6e 73 74 61 6e 74   define constant
134e0 73 20 66 6f 72 20 5c 22 53 79 73 74 65 6d 2e 44  s for \"System.D
134f0 61 74 61 2e 53 51 4c 69 74 65 5c 22 2e 2e 2e 20  ata.SQLite\"... 
13500 22 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 69  "....          i
13510 66 20 7b 5b 63 61 74 63 68 20 7b 6f 62 6a 65 63  f {[catch {objec
13520 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20  t invoke -flags 
13530 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20  +NonPublic \..  
13540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13550 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
13560 74 65 2e 53 51 4c 69 74 65 33 20 44 65 66 69 6e  te.SQLite3 Defin
13570 65 43 6f 6e 73 74 61 6e 74 73 7d 20 5c 0d 0a 20  eConstants} \.. 
13580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13590 20 64 65 66 69 6e 65 43 6f 6e 73 74 61 6e 74 73   defineConstants
135a0 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  ] == 0} then {..
135b0 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
135c0 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
135d0 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5b 66  l [appendArgs [f
135e0 6f 72 6d 61 74 4c 69 73 74 20 5b 6c 73 6f 72 74  ormatList [lsort
135f0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
13600 20 20 20 20 24 64 65 66 69 6e 65 43 6f 6e 73 74      $defineConst
13610 61 6e 74 73 5d 20 3c 6e 6f 6e 65 3e 5d 20 5c 6e  ants] <none>] \n
13620 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 20 65  ]..          } e
13630 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  lse {..         
13640 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
13650 5f 63 68 61 6e 6e 65 6c 20 75 6e 6b 6e 6f 77 6e  _channel unknown
13660 5c 6e 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d  \n..          }.
13670 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  .        }....  
13680 20 20 20 20 20 20 63 61 74 63 68 20 7b 0d 0a 20        catch {.. 
13690 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
136a0 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5c  ::test_channel \
136b0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
136c0 22 2d 2d 2d 2d 20 73 6f 75 72 63 65 20 76 65 72  "---- source ver
136d0 73 69 6f 6e 20 6f 66 20 5c 22 53 79 73 74 65 6d  sion of \"System
136e0 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 64 6c 6c  .Data.SQLite.dll
136f0 5c 22 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 20  \"... "....     
13700 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20       if {[catch 
13710 7b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d  {object invoke -
13720 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63  flags +NonPublic
13730 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
13740 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74        System.Dat
13750 61 2e 53 51 4c 69 74 65 2e 53 51 4c 69 74 65 43  a.SQLite.SQLiteC
13760 6f 6e 6e 65 63 74 69 6f 6e 20 50 72 6f 76 69 64  onnection Provid
13770 65 72 56 65 72 73 69 6f 6e 7d 20 5c 0d 0a 20 20  erVersion} \..  
13780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13790 76 65 72 73 69 6f 6e 5d 20 3d 3d 20 30 7d 20 74  version] == 0} t
137a0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
137b0 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c     if {[string l
137c0 65 6e 67 74 68 20 24 76 65 72 73 69 6f 6e 5d 20  ength $version] 
137d0 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  == 0} then {..  
137e0 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20              set 
137f0 76 65 72 73 69 6f 6e 20 6e 75 6c 6c 0d 0a 20 20  version null..  
13800 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
13810 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
13820 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b  ::test_channel [
13830 61 70 70 65 6e 64 41 72 67 73 20 24 76 65 72 73  appendArgs $vers
13840 69 6f 6e 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20  ion \n]..       
13850 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
13860 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
13870 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 75  ::test_channel u
13880 6e 6b 6e 6f 77 6e 5c 6e 0d 0a 20 20 20 20 20 20  nknown\n..      
13890 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d      }..        }
138a0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 63 61 74 63  ....        catc
138b0 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74  h {..          t
138c0 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
138d0 6e 6e 65 6c 20 5c 0d 0a 20 20 20 20 20 20 20 20  nnel \..        
138e0 20 20 20 20 20 20 22 2d 2d 2d 2d 20 73 6f 75 72        "---- sour
138f0 63 65 20 63 68 65 63 6b 6f 75 74 20 6f 66 20 5c  ce checkout of \
13900 22 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c  "System.Data.SQL
13910 69 74 65 2e 64 6c 6c 5c 22 2e 2e 2e 20 22 0d 0a  ite.dll\"... "..
13920 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b  ..          if {
13930 5b 63 61 74 63 68 20 7b 6f 62 6a 65 63 74 20 69  [catch {object i
13940 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f  nvoke -flags +No
13950 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20  nPublic \..     
13960 20 20 20 20 20 20 20 20 20 20 20 20 20 53 79 73               Sys
13970 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e  tem.Data.SQLite.
13980 53 51 4c 69 74 65 43 6f 6e 6e 65 63 74 69 6f 6e  SQLiteConnection
13990 20 50 72 6f 76 69 64 65 72 53 6f 75 72 63 65 49   ProviderSourceI
139a0 64 7d 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  d} \..          
139b0 20 20 20 20 20 20 20 20 73 6f 75 72 63 65 49 64          sourceId
139c0 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  ] == 0} then {..
139d0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b              if {
139e0 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
139f0 73 6f 75 72 63 65 49 64 5d 20 3d 3d 20 30 7d 20  sourceId] == 0} 
13a00 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
13a10 20 20 20 20 20 20 73 65 74 20 73 6f 75 72 63 65        set source
13a20 49 64 20 6e 75 6c 6c 0d 0a 20 20 20 20 20 20 20  Id null..       
13a30 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
13a40 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
13a50 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e  t_channel [appen
13a60 64 41 72 67 73 20 24 73 6f 75 72 63 65 49 64 20  dArgs $sourceId 
13a70 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  \n]..          }
13a80 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
13a90 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
13aa0 73 74 5f 63 68 61 6e 6e 65 6c 20 75 6e 6b 6e 6f  st_channel unkno
13ab0 77 6e 5c 6e 0d 0a 20 20 20 20 20 20 20 20 20 20  wn\n..          
13ac0 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  }..        }....
13ad0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
13ae0 20 20 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b     # NOTE: Check
13af0 20 74 68 65 20 61 76 61 69 6c 61 62 6c 65 20 62   the available b
13b00 75 69 6c 64 73 20 28 61 6e 64 20 22 72 65 6c 65  uilds (and "rele
13b10 61 73 65 73 22 29 20 6f 66 20 53 51 4c 69 74 65  ases") of SQLite
13b20 20 61 6e 64 0d 0a 20 20 20 20 20 20 20 20 23 20   and..        # 
13b30 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74        System.Dat
13b40 61 2e 53 51 4c 69 74 65 2e 0d 0a 20 20 20 20 20  a.SQLite...     
13b50 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 63 68     #..        ch
13b60 65 63 6b 46 6f 72 53 51 4c 69 74 65 42 75 69 6c  eckForSQLiteBuil
13b70 64 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ds $::test_chann
13b80 65 6c 0d 0a 20 20 20 20 20 20 20 20 63 68 65 63  el..        chec
13b90 6b 46 6f 72 53 51 4c 69 74 65 52 65 6c 65 61 73  kForSQLiteReleas
13ba0 65 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  es $::test_chann
13bb0 65 6c 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d  el....        #.
13bc0 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
13bd0 20 4e 6f 77 2c 20 77 65 20 6e 65 65 64 20 74 6f   Now, we need to
13be0 20 6b 6e 6f 77 20 69 66 20 74 68 65 20 53 51 4c   know if the SQL
13bf0 69 74 65 20 63 6f 72 65 20 6c 69 62 72 61 72 79  ite core library
13c00 20 69 73 20 61 76 61 69 6c 61 62 6c 65 0d 0a 20   is available.. 
13c10 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 28         #       (
13c20 69 2e 65 2e 20 62 65 63 61 75 73 65 20 74 68 65  i.e. because the
13c30 20 6d 61 6e 61 67 65 64 2d 6f 6e 6c 79 20 53 79   managed-only Sy
13c40 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
13c50 20 61 73 73 65 6d 62 6c 79 20 63 61 6e 0d 0a 20   assembly can.. 
13c60 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 6c         #       l
13c70 6f 61 64 20 77 69 74 68 6f 75 74 20 69 74 3b 20  oad without it; 
13c80 68 6f 77 65 76 65 72 2c 20 69 74 20 63 61 6e 6e  however, it cann
13c90 6f 74 20 64 6f 20 61 6e 79 74 68 69 6e 67 20 75  ot do anything u
13ca0 73 65 66 75 6c 20 77 69 74 68 6f 75 74 0d 0a 20  seful without.. 
13cb0 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 69         #       i
13cc0 74 29 2e 20 20 49 66 20 77 65 20 61 72 65 20 75  t).  If we are u
13cd0 73 69 6e 67 20 74 68 65 20 6d 69 78 65 64 2d 6d  sing the mixed-m
13ce0 6f 64 65 20 61 73 73 65 6d 62 6c 79 20 61 6e 64  ode assembly and
13cf0 20 77 65 20 61 6c 72 65 61 64 79 0d 0a 20 20 20   we already..   
13d00 20 20 20 20 20 23 20 20 20 20 20 20 20 66 6f 75       #       fou
13d10 6e 64 20 69 74 20 28 61 62 6f 76 65 29 2c 20 74  nd it (above), t
13d20 68 69 73 20 73 68 6f 75 6c 64 20 61 6c 77 61 79  his should alway
13d30 73 20 73 75 63 63 65 65 64 2e 0d 0a 20 20 20 20  s succeed...    
13d40 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 63      #..        c
13d50 68 65 63 6b 46 6f 72 53 51 4c 69 74 65 4c 69 62  heckForSQLiteLib
13d60 72 61 72 79 20 24 3a 3a 74 65 73 74 5f 63 68 61  rary $::test_cha
13d70 6e 6e 65 6c 0d 0a 0d 0a 20 20 20 20 20 20 20 20  nnel....        
13d80 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
13d90 45 3a 20 43 68 65 63 6b 20 69 66 20 74 68 65 20  E: Check if the 
13da0 53 51 4c 69 74 65 20 69 6e 74 65 72 6f 70 20 61  SQLite interop a
13db0 73 73 65 6d 62 6c 79 20 69 73 20 61 76 61 69 6c  ssembly is avail
13dc0 61 62 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20 23  able...        #
13dd0 0d 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b 46  ..        checkF
13de0 6f 72 53 51 4c 69 74 65 49 6e 74 65 72 6f 70 20  orSQLiteInterop 
13df0 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 0d  $::test_channel.
13e00 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
13e10 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68        # NOTE: Ch
13e20 65 63 6b 20 74 68 65 20 53 51 4c 69 74 65 20 64  eck the SQLite d
13e30 61 74 61 62 61 73 65 20 61 6e 64 20 74 65 6d 70  atabase and temp
13e40 6f 72 61 72 79 20 64 69 72 65 63 74 6f 72 69 65  orary directorie
13e50 73 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  s...        #.. 
13e60 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72 53         checkForS
13e70 51 4c 69 74 65 44 69 72 65 63 74 6f 72 69 65 73  QLiteDirectories
13e80 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
13e90 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  ....        #.. 
13ea0 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41         # NOTE: A
13eb0 74 74 65 6d 70 74 20 74 6f 20 64 65 74 65 72 6d  ttempt to determ
13ec0 69 6e 65 20 69 66 20 76 61 72 69 6f 75 73 20 63  ine if various c
13ed0 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69  ompile-time opti
13ee0 6f 6e 73 20 6e 65 65 64 65 64 20 66 6f 72 0d 0a  ons needed for..
13ef0 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
13f00 74 65 73 74 20 63 6f 6e 73 74 72 61 69 6e 74 73  test constraints
13f10 20 77 65 72 65 20 65 6e 61 62 6c 65 64 20 66 6f   were enabled fo
13f20 72 20 74 68 65 20 6d 61 6e 61 67 65 64 20 61 73  r the managed as
13f30 73 65 6d 62 6c 79 2e 20 20 54 68 65 72 65 0d 0a  sembly.  There..
13f40 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
13f50 61 72 65 20 73 6f 6d 65 20 63 6f 6d 70 69 6c 65  are some compile
13f60 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 73 20 74 68  -time options th
13f70 61 74 20 6d 75 73 74 20 61 6c 73 6f 20 68 61 76  at must also hav
13f80 65 20 62 65 65 6e 20 65 6e 61 62 6c 65 64 0d 0a  e been enabled..
13f90 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
13fa0 66 6f 72 20 74 68 65 20 69 6e 74 65 72 6f 70 20  for the interop 
13fb0 61 73 73 65 6d 62 6c 79 20 69 6e 20 6f 72 64 65  assembly in orde
13fc0 72 20 74 6f 20 62 65 20 65 66 66 65 63 74 69 76  r to be effectiv
13fd0 65 2e 20 20 46 6f 72 20 74 68 6f 73 65 0d 0a 20  e.  For those.. 
13fe0 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 6f         #       o
13ff0 70 74 69 6f 6e 73 2c 20 69 74 20 77 69 6c 6c 20  ptions, it will 
14000 62 65 20 61 73 73 75 6d 65 64 20 74 68 61 74 20  be assumed that 
14010 69 74 20 77 61 73 20 65 6e 61 62 6c 65 64 20 66  it was enabled f
14020 6f 72 20 74 68 65 20 69 6e 74 65 72 6f 70 0d 0a  or the interop..
14030 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
14040 61 73 73 65 6d 62 6c 79 20 69 66 20 69 74 20 77  assembly if it w
14050 61 73 20 65 6e 61 62 6c 65 64 20 66 6f 72 20 74  as enabled for t
14060 68 65 20 6d 61 6e 61 67 65 64 20 61 73 73 65 6d  he managed assem
14070 62 6c 79 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  bly...        #.
14080 0a 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68  .        foreach
14090 20 64 65 66 69 6e 65 43 6f 6e 73 74 61 6e 74 20   defineConstant 
140a0 5b 6c 69 73 74 20 5c 0d 0a 20 20 20 20 20 20 20  [list \..       
140b0 20 20 20 20 20 43 48 45 43 4b 5f 53 54 41 54 45       CHECK_STATE
140c0 20 43 4f 55 4e 54 5f 48 41 4e 44 4c 45 20 44 45   COUNT_HANDLE DE
140d0 42 55 47 20 49 4e 54 45 52 4f 50 5f 43 4f 44 45  BUG INTEROP_CODE
140e0 43 20 49 4e 54 45 52 4f 50 5f 44 45 42 55 47 20  C INTEROP_DEBUG 
140f0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 49  \..            I
14100 4e 54 45 52 4f 50 5f 45 58 54 45 4e 53 49 4f 4e  NTEROP_EXTENSION
14110 5f 46 55 4e 43 54 49 4f 4e 53 20 49 4e 54 45 52  _FUNCTIONS INTER
14120 4f 50 5f 4c 45 47 41 43 59 5f 43 4c 4f 53 45 20  OP_LEGACY_CLOSE 
14130 49 4e 54 45 52 4f 50 5f 4c 4f 47 20 5c 0d 0a 20  INTEROP_LOG \.. 
14140 20 20 20 20 20 20 20 20 20 20 20 49 4e 54 45 52             INTER
14150 4f 50 5f 54 45 53 54 5f 45 58 54 45 4e 53 49 4f  OP_TEST_EXTENSIO
14160 4e 20 49 4e 54 45 52 4f 50 5f 56 49 52 54 55 41  N INTEROP_VIRTUA
14170 4c 5f 54 41 42 4c 45 20 4e 45 54 5f 32 30 20 4e  L_TABLE NET_20 N
14180 45 54 5f 33 35 20 5c 0d 0a 20 20 20 20 20 20 20  ET_35 \..       
14190 20 20 20 20 20 4e 45 54 5f 34 30 20 4e 45 54 5f       NET_40 NET_
141a0 34 35 20 4e 45 54 5f 43 4f 4d 50 41 43 54 5f 32  45 NET_COMPACT_2
141b0 30 20 50 4c 41 54 46 4f 52 4d 5f 43 4f 4d 50 41  0 PLATFORM_COMPA
141c0 43 54 46 52 41 4d 45 57 4f 52 4b 20 5c 0d 0a 20  CTFRAMEWORK \.. 
141d0 20 20 20 20 20 20 20 20 20 20 20 50 52 45 4c 4f             PRELO
141e0 41 44 5f 4e 41 54 49 56 45 5f 4c 49 42 52 41 52  AD_NATIVE_LIBRAR
141f0 59 20 52 45 54 41 52 47 45 54 41 42 4c 45 20 53  Y RETARGETABLE S
14200 51 4c 49 54 45 5f 53 54 41 4e 44 41 52 44 20 5c  QLITE_STANDARD \
14210 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 54 48  ..            TH
14220 52 4f 57 5f 4f 4e 5f 44 49 53 50 4f 53 45 44 20  ROW_ON_DISPOSED 
14230 54 52 41 43 45 20 54 52 41 43 45 5f 43 4f 4e 4e  TRACE TRACE_CONN
14240 45 43 54 49 4f 4e 20 54 52 41 43 45 5f 48 41 4e  ECTION TRACE_HAN
14250 44 4c 45 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  DLE \..         
14260 20 20 20 54 52 41 43 45 5f 50 52 45 4c 4f 41 44     TRACE_PRELOAD
14270 20 54 52 41 43 45 5f 53 54 41 54 45 4d 45 4e 54   TRACE_STATEMENT
14280 20 54 52 41 43 45 5f 57 41 52 4e 49 4e 47 20 54   TRACE_WARNING T
14290 52 41 43 4b 5f 4d 45 4d 4f 52 59 5f 42 59 54 45  RACK_MEMORY_BYTE
142a0 53 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  S \..           
142b0 20 55 53 45 5f 49 4e 54 45 52 4f 50 5f 44 4c 4c   USE_INTEROP_DLL
142c0 20 55 53 45 5f 50 52 45 50 41 52 45 5f 56 32 20   USE_PREPARE_V2 
142d0 57 49 4e 44 4f 57 53 5d 20 7b 0d 0a 20 20 20 20  WINDOWS] {..    
142e0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
142f0 20 20 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b     # NOTE: Check
14300 20 69 66 20 74 68 65 20 63 6f 6d 70 69 6c 65 2d   if the compile-
14310 74 69 6d 65 20 6f 70 74 69 6f 6e 20 69 73 20 6c  time option is l
14320 69 73 74 65 64 20 69 6e 20 74 68 65 20 6c 69 73  isted in the lis
14330 74 20 6f 66 0d 0a 20 20 20 20 20 20 20 20 20 20  t of..          
14340 23 20 20 20 20 20 20 20 22 64 65 66 69 6e 65 20  #       "define 
14350 63 6f 6e 73 74 61 6e 74 73 22 20 6b 65 70 74 20  constants" kept 
14360 74 72 61 63 6b 20 6f 66 20 62 79 20 74 68 65 20  track of by the 
14370 6d 61 6e 61 67 65 64 20 61 73 73 65 6d 62 6c 79  managed assembly
14380 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a  ...          #..
14390 20 20 20 20 20 20 20 20 20 20 63 68 65 63 6b 46            checkF
143a0 6f 72 53 51 4c 69 74 65 44 65 66 69 6e 65 43 6f  orSQLiteDefineCo
143b0 6e 73 74 61 6e 74 20 24 3a 3a 74 65 73 74 5f 63  nstant $::test_c
143c0 68 61 6e 6e 65 6c 20 24 64 65 66 69 6e 65 43 6f  hannel $defineCo
143d0 6e 73 74 61 6e 74 0d 0a 20 20 20 20 20 20 20 20  nstant..        
143e0 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  }....        #..
143f0 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
14400 43 68 65 63 6b 20 74 68 65 20 63 75 72 72 65 6e  Check the curren
14410 74 20 62 75 69 6c 64 20 79 65 61 72 2e 20 20 42  t build year.  B
14420 61 73 69 63 61 6c 6c 79 2c 20 74 68 69 73 20 69  asically, this i
14430 6e 64 69 63 61 74 65 73 0d 0a 20 20 20 20 20 20  ndicates..      
14440 20 20 23 20 20 20 20 20 20 20 77 68 69 63 68 20    #       which 
14450 76 65 72 73 69 6f 6e 20 6f 66 20 4d 53 42 75 69  version of MSBui
14460 6c 64 20 61 6e 64 2f 6f 72 20 56 69 73 75 61 6c  ld and/or Visual
14470 20 53 74 75 64 69 6f 20 77 61 73 20 75 73 65 64   Studio was used
14480 20 74 6f 0d 0a 20 20 20 20 20 20 20 20 23 20 20   to..        #  
14490 20 20 20 20 20 63 6f 6d 70 69 6c 65 20 74 68 65       compile the
144a0 20 61 73 73 65 6d 62 6c 79 20 62 69 6e 61 72 69   assembly binari
144b0 65 73 20 75 6e 64 65 72 20 74 65 73 74 2e 0d 0a  es under test...
144c0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
144d0 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
144e0 5f 63 68 61 6e 6e 65 6c 20 5c 0d 0a 20 20 20 20  _channel \..    
144f0 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 68          "---- ch
14500 65 63 6b 69 6e 67 20 66 6f 72 20 53 79 73 74 65  ecking for Syste
14510 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 20 62 75  m.Data.SQLite bu
14520 69 6c 64 20 79 65 61 72 2e 2e 2e 20 22 0d 0a 0d  ild year... "...
14530 0a 20 20 20 20 20 20 20 20 73 65 74 20 79 65 61  .        set yea
14540 72 20 5b 67 65 74 42 75 69 6c 64 59 65 61 72 5d  r [getBuildYear]
14550 0d 0a 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e  ..        addCon
14560 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41  straint [appendA
14570 72 67 73 20 62 75 69 6c 64 59 65 61 72 2e 20 24  rgs buildYear. $
14580 79 65 61 72 5d 0d 0a 20 20 20 20 20 20 20 20 74  year]..        t
14590 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
145a0 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
145b0 20 5c 22 20 24 79 65 61 72 20 5c 22 5c 6e 5d 0d   \" $year \"\n].
145c0 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
145d0 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68        # NOTE: Ch
145e0 65 63 6b 20 74 68 65 20 63 75 72 72 65 6e 74 20  eck the current 
145f0 62 75 69 6c 64 20 63 6f 6e 66 69 67 75 72 61 74  build configurat
14600 69 6f 6e 2e 20 20 54 68 69 73 20 73 68 6f 75 6c  ion.  This shoul
14610 64 20 6e 6f 72 6d 61 6c 6c 79 0d 0a 20 20 20 20  d normally..    
14620 20 20 20 20 23 20 20 20 20 20 20 20 62 65 20 65      #       be e
14630 69 74 68 65 72 20 22 44 65 62 75 67 22 20 6f 72  ither "Debug" or
14640 20 22 52 65 6c 65 61 73 65 22 2e 0d 0a 20 20 20   "Release"...   
14650 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
14660 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
14670 61 6e 6e 65 6c 20 5c 0d 0a 20 20 20 20 20 20 20  annel \..       
14680 20 20 20 20 20 22 2d 2d 2d 2d 20 63 68 65 63 6b       "---- check
14690 69 6e 67 20 66 6f 72 20 53 79 73 74 65 6d 2e 44  ing for System.D
146a0 61 74 61 2e 53 51 4c 69 74 65 20 62 75 69 6c 64  ata.SQLite build
146b0 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e 2e   configuration..
146c0 2e 20 22 0d 0a 0d 0a 20 20 20 20 20 20 20 20 73  . "....        s
146d0 65 74 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  et configuration
146e0 20 5b 67 65 74 42 75 69 6c 64 43 6f 6e 66 69 67   [getBuildConfig
146f0 75 72 61 74 69 6f 6e 5d 0d 0a 20 20 20 20 20 20  uration]..      
14700 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20    addConstraint 
14710 5b 61 70 70 65 6e 64 41 72 67 73 20 62 75 69 6c  [appendArgs buil
14720 64 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e 20  dConfiguration. 
14730 24 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 5d 0d  $configuration].
14740 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24  .        tputs $
14750 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b  ::test_channel [
14760 61 70 70 65 6e 64 41 72 67 73 20 5c 22 20 24 63  appendArgs \" $c
14770 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 5c 22 5c  onfiguration \"\
14780 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d  n]....        #.
14790 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
147a0 20 54 72 79 20 74 6f 20 73 65 74 75 70 20 61 6e   Try to setup an
147b0 20 69 6e 74 65 72 72 75 70 74 20 63 61 6c 6c 62   interrupt callb
147c0 61 63 6b 20 75 73 69 6e 67 20 74 68 65 20 73 63  ack using the sc
147d0 72 69 70 74 20 64 65 62 75 67 67 65 72 0d 0a 20  ript debugger.. 
147e0 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74         #       t
147f0 68 61 74 20 77 69 6c 6c 20 63 61 6e 63 65 6c 20  hat will cancel 
14800 61 6c 6c 20 53 51 4c 20 71 75 65 72 69 65 73 20  all SQL queries 
14810 69 6e 20 70 72 6f 67 72 65 73 73 20 66 6f 72 20  in progress for 
14820 61 6c 6c 20 64 61 74 61 62 61 73 65 0d 0a 20 20  all database..  
14830 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63 6f        #       co
14840 6e 6e 65 63 74 69 6f 6e 73 20 6b 6e 6f 77 6e 20  nnections known 
14850 74 6f 20 74 68 69 73 20 69 6e 74 65 72 70 72 65  to this interpre
14860 74 65 72 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  ter...        #.
14870 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69  .        if {![i
14880 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28  nfo exists ::no(
14890 73 71 6c 69 74 65 49 6e 74 65 72 72 75 70 74 43  sqliteInterruptC
148a0 61 6c 6c 62 61 63 6b 29 5d 7d 20 74 68 65 6e 20  allback)]} then 
148b0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74  {..          set
148c0 75 70 44 62 49 6e 74 65 72 72 75 70 74 43 61 6c  upDbInterruptCal
148d0 6c 62 61 63 6b 20 24 3a 3a 74 65 73 74 5f 63 68  lback $::test_ch
148e0 61 6e 6e 65 6c 20 24 3a 3a 74 65 73 74 5f 6c 6f  annel $::test_lo
148f0 67 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  g..        }....
14900 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
14910 20 20 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b     # NOTE: Check
14920 20 66 6f 72 20 74 68 65 20 6e 61 74 69 76 65 20   for the native 
14930 72 75 6e 74 69 6d 65 20 6f 70 74 69 6f 6e 2c 20  runtime option, 
14940 77 68 69 63 68 20 77 6f 75 6c 64 20 6d 65 61 6e  which would mean
14950 20 77 65 20 61 72 65 0d 0a 20 20 20 20 20 20 20   we are..       
14960 20 23 20 20 20 20 20 20 20 75 73 69 6e 67 20 74   #       using t
14970 68 65 20 6d 69 78 65 64 2d 6d 6f 64 65 20 61 73  he mixed-mode as
14980 73 65 6d 62 6c 79 2e 0d 0a 20 20 20 20 20 20 20  sembly...       
14990 20 23 0d 0a 20 20 20 20 20 20 20 20 63 68 65 63   #..        chec
149a0 6b 46 6f 72 52 75 6e 74 69 6d 65 4f 70 74 69 6f  kForRuntimeOptio
149b0 6e 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  n $::test_channe
149c0 6c 20 6e 61 74 69 76 65 0d 0a 0d 0a 20 20 20 20  l native....    
149d0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
149e0 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 69 66 20   NOTE: Check if 
149f0 74 68 65 20 74 65 73 74 20 73 75 69 74 65 20 73  the test suite s
14a00 68 6f 75 6c 64 20 63 6f 75 6e 74 20 74 68 65 20  hould count the 
14a10 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6e 6e 65 63  number of connec
14a20 74 69 6f 6e 73 0d 0a 20 20 20 20 20 20 20 20 23  tions..        #
14a30 20 20 20 20 20 20 20 22 6f 70 65 6e 65 64 22 20         "opened" 
14a40 61 6e 64 20 22 63 6c 6f 73 65 64 22 20 66 72 6f  and "closed" fro
14a50 6d 20 74 68 65 20 70 6f 6f 6c 20 77 68 65 6e 20  m the pool when 
14a60 64 65 74 65 72 6d 69 6e 69 6e 67 20 69 66 20 61  determining if a
14a70 20 74 65 73 74 0d 0a 20 20 20 20 20 20 20 20 23   test..        #
14a80 20 20 20 20 20 20 20 70 61 73 73 65 64 2e 20 20         passed.  
14a90 44 69 73 61 62 6c 69 6e 67 20 74 68 69 73 20 62  Disabling this b
14aa0 65 68 61 76 69 6f 72 20 69 73 20 73 6f 6d 65 74  ehavior is somet
14ab0 69 6d 65 73 20 6e 65 63 65 73 73 61 72 79 20 28  imes necessary (
14ac0 65 2e 67 2e 0d 0a 20 20 20 20 20 20 20 20 23 20  e.g...        # 
14ad0 20 20 20 20 20 20 64 75 72 69 6e 67 20 74 68 65        during the
14ae0 20 72 65 6c 65 61 73 65 20 74 65 73 74 69 6e 67   release testing
14af0 20 70 72 6f 63 65 73 73 29 20 62 65 63 61 75 73   process) becaus
14b00 65 20 74 68 65 72 65 20 61 72 65 20 73 65 76 65  e there are seve
14b10 72 61 6c 0d 0a 20 20 20 20 20 20 20 20 23 20 20  ral..        #  
14b20 20 20 20 20 20 74 65 73 74 73 20 74 68 61 74 20       tests that 
14b30 72 65 6c 79 20 6f 6e 20 74 68 65 20 22 6f 70 65  rely on the "ope
14b40 6e 65 64 20 66 72 6f 6d 20 70 6f 6f 6c 22 20 63  ned from pool" c
14b50 6f 75 6e 74 20 62 65 69 6e 67 20 67 72 65 61 74  ount being great
14b60 65 72 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  er..        #   
14b70 20 20 20 20 74 68 61 6e 20 7a 65 72 6f 2e 20 20      than zero.  
14b80 54 68 65 73 65 20 74 65 73 74 73 20 6d 61 79 20  These tests may 
14b90 66 61 69 6c 20 64 75 65 20 74 6f 20 74 68 65 20  fail due to the 
14ba0 6e 6f 6e 2d 64 65 74 65 72 6d 69 6e 69 73 74 69  non-deterministi
14bb0 63 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  c..        #    
14bc0 20 20 20 62 65 68 61 76 69 6f 72 20 6f 66 20 74     behavior of t
14bd0 68 65 20 43 4c 52 20 47 43 2c 20 65 76 65 6e 20  he CLR GC, even 
14be0 77 68 65 6e 20 74 68 65 72 65 20 69 73 20 6e 6f  when there is no
14bf0 20 62 75 67 20 69 6e 20 74 68 65 20 63 6f 64 65   bug in the code
14c00 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
14c10 20 20 62 65 69 6e 67 20 74 65 73 74 65 64 2e 0d    being tested..
14c20 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
14c30 20 20 20 20 63 68 65 63 6b 46 6f 72 52 75 6e 74      checkForRunt
14c40 69 6d 65 4f 70 74 69 6f 6e 20 24 3a 3a 74 65 73  imeOption $::tes
14c50 74 5f 63 68 61 6e 6e 65 6c 20 6e 6f 50 6f 6f 6c  t_channel noPool
14c60 43 6f 75 6e 74 73 0d 0a 0d 0a 20 20 20 20 20 20  Counts....      
14c70 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
14c80 4f 54 45 3a 20 52 65 70 6f 72 74 20 74 68 65 20  OTE: Report the 
14c90 72 65 73 6f 75 72 63 65 20 75 73 61 67 65 20 70  resource usage p
14ca0 72 69 6f 72 20 74 6f 20 72 75 6e 6e 69 6e 67 20  rior to running 
14cb0 61 6e 79 20 74 65 73 74 73 2e 0d 0a 20 20 20 20  any tests...    
14cc0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72      #..        r
14cd0 65 70 6f 72 74 53 51 4c 69 74 65 52 65 73 6f 75  eportSQLiteResou
14ce0 72 63 65 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  rces $::test_cha
14cf0 6e 6e 65 6c 0d 0a 0d 0a 20 20 20 20 20 20 20 20  nnel....        
14d00 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
14d10 45 3a 20 53 68 6f 77 20 74 68 65 20 61 63 74 69  E: Show the acti
14d20 76 65 20 74 65 73 74 20 63 6f 6e 73 74 72 61 69  ve test constrai
14d30 6e 74 73 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  nts...        #.
14d40 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24  .        tputs $
14d50 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b  ::test_channel [
14d60 61 70 70 65 6e 64 41 72 67 73 20 22 2d 2d 2d 2d  appendArgs "----
14d70 20 63 6f 6e 73 74 72 61 69 6e 74 73 3a 20 22 20   constraints: " 
14d80 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b  \..            [
14d90 66 6f 72 6d 61 74 4c 69 73 74 20 5b 6c 73 6f 72  formatList [lsor
14da0 74 20 5b 67 65 74 43 6f 6e 73 74 72 61 69 6e 74  t [getConstraint
14db0 73 5d 5d 20 3c 6e 6f 6e 65 3e 5d 20 5c 6e 5d 0d  s]] <none>] \n].
14dc0 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
14dd0 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 61        # NOTE: Sa
14de0 76 65 20 74 68 65 20 74 65 73 74 20 63 6f 6e 73  ve the test cons
14df0 74 72 61 69 6e 74 73 20 66 6f 72 20 75 73 65 20  traints for use 
14e00 62 79 20 74 68 72 65 61 64 73 20 63 72 65 61 74  by threads creat
14e10 65 64 20 69 6e 20 74 68 69 73 0d 0a 20 20 20 20  ed in this..    
14e20 20 20 20 20 23 20 20 20 20 20 20 20 61 70 70 6c      #       appl
14e30 69 63 61 74 69 6f 6e 20 64 6f 6d 61 69 6e 2e 20  ication domain. 
14e40 20 54 68 69 73 20 69 73 20 6e 65 63 65 73 73 61   This is necessa
14e50 72 79 20 62 65 63 61 75 73 65 20 61 6c 6c 20 74  ry because all t
14e60 68 65 20 45 61 67 6c 65 0d 0a 20 20 20 20 20 20  he Eagle..      
14e70 20 20 23 20 20 20 20 20 20 20 22 74 65 73 74 20    #       "test 
14e80 63 6f 6e 74 65 78 74 22 20 69 6e 66 6f 72 6d 61  context" informa
14e90 74 69 6f 6e 20 69 73 20 70 65 72 2d 74 68 72 65  tion is per-thre
14ea0 61 64 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  ad...        #..
14eb0 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e          if {![in
14ec0 66 6f 20 65 78 69 73 74 73 20 3a 3a 74 65 73 74  fo exists ::test
14ed0 5f 63 6f 6e 73 74 72 61 69 6e 74 73 5d 7d 20 74  _constraints]} t
14ee0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
14ef0 20 73 65 74 20 3a 3a 74 65 73 74 5f 63 6f 6e 73   set ::test_cons
14f00 74 72 61 69 6e 74 73 20 24 3a 3a 65 61 67 6c 65  traints $::eagle
14f10 5f 74 65 73 74 73 28 63 6f 6e 73 74 72 61 69 6e  _tests(constrain
14f20 74 73 29 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  ts)..        }..
14f30 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
14f40 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4c 6f 61       # NOTE: Loa
14f50 64 20 74 68 65 20 22 61 66 74 65 72 2d 63 6f 6e  d the "after-con
14f60 73 74 72 61 69 6e 74 73 22 20 63 75 73 74 6f 6d  straints" custom
14f70 20 70 65 72 2d 75 73 65 72 20 61 6e 64 2f 6f 72   per-user and/or
14f80 20 70 65 72 2d 68 6f 73 74 0d 0a 20 20 20 20 20   per-host..     
14f90 20 20 20 23 20 20 20 20 20 20 20 74 65 73 74 20     #       test 
14fa0 73 65 74 74 69 6e 67 73 20 6e 6f 77 2e 0d 0a 20  settings now... 
14fb0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
14fc0 20 20 75 70 6c 65 76 65 6c 20 31 20 5b 6c 69 73    uplevel 1 [lis
14fd0 74 20 6c 6f 61 64 53 51 4c 69 74 65 54 65 73 74  t loadSQLiteTest
14fe0 53 65 74 74 69 6e 67 73 20 24 3a 3a 74 65 73 74  Settings $::test
14ff0 5f 63 68 61 6e 6e 65 6c 20 2e 61 66 74 65 72 5d  _channel .after]
15000 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  ....        #.. 
15010 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53         # NOTE: S
15020 68 6f 77 20 77 68 65 6e 20 6f 75 72 20 74 65 73  how when our tes
15030 74 73 20 61 63 74 75 61 6c 6c 79 20 62 65 67 61  ts actually bega
15040 6e 20 28 6e 6f 77 29 2e 0d 0a 20 20 20 20 20 20  n (now)...      
15050 20 20 23 0d 0a 20 20 20 20 20 20 20 20 74 70 75    #..        tpu
15060 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
15070 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
15080 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 2d  ..            "-
15090 2d 2d 2d 20 53 79 73 74 65 6d 2e 44 61 74 61 2e  --- System.Data.
150a0 53 51 4c 69 74 65 20 74 65 73 74 73 20 62 65 67  SQLite tests beg
150b0 61 6e 20 61 74 20 22 20 5c 0d 0a 20 20 20 20 20  an at " \..     
150c0 20 20 20 20 20 20 20 5b 63 6c 6f 63 6b 20 66 6f         [clock fo
150d0 72 6d 61 74 20 5b 63 6c 6f 63 6b 20 73 65 63 6f  rmat [clock seco
150e0 6e 64 73 5d 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20  nds]] \n]..     
150f0 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20   }..    }.....  
15100 20 20 70 72 6f 63 20 72 75 6e 53 51 4c 69 74 65    proc runSQLite
15110 54 65 73 74 45 70 69 6c 6f 67 75 65 20 7b 7d 20  TestEpilogue {} 
15120 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  {..      #..    
15130 20 20 23 20 4e 4f 54 45 3a 20 53 6b 69 70 20 72    # NOTE: Skip r
15140 75 6e 6e 69 6e 67 20 6f 75 72 20 63 75 73 74 6f  unning our custo
15150 6d 20 65 70 69 6c 6f 67 75 65 20 69 66 20 74 68  m epilogue if th
15160 65 20 6d 61 69 6e 20 6f 6e 65 20 68 61 73 20 62  e main one has b
15170 65 65 6e 0d 0a 20 20 20 20 20 20 23 20 20 20 20  een..      #    
15180 20 20 20 73 6b 69 70 70 65 64 2e 0d 0a 20 20 20     skipped...   
15190 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
151a0 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  ![info exists ::
151b0 6e 6f 28 65 70 69 6c 6f 67 75 65 2e 65 61 67 6c  no(epilogue.eagl
151c0 65 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  e)]} then {..   
151d0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
151e0 23 20 4e 4f 54 45 3a 20 53 68 6f 77 20 77 68 65  # NOTE: Show whe
151f0 6e 20 6f 75 72 20 74 65 73 74 73 20 61 63 74 75  n our tests actu
15200 61 6c 6c 79 20 65 6e 64 65 64 20 28 6e 6f 77 29  ally ended (now)
15210 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
15220 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
15230 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70  est_channel [app
15240 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
15250 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 53 79 73         "---- Sys
15260 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 20  tem.Data.SQLite 
15270 74 65 73 74 73 20 65 6e 64 65 64 20 61 74 20 22  tests ended at "
15280 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
15290 5b 63 6c 6f 63 6b 20 66 6f 72 6d 61 74 20 5b 63  [clock format [c
152a0 6c 6f 63 6b 20 73 65 63 6f 6e 64 73 5d 5d 20 5c  lock seconds]] \
152b0 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d  n]....        #.
152c0 0a 20 20 20 20 20 20 20 20 23 20 42 55 47 46 49  .        # BUGFI
152d0 58 3a 20 42 65 66 6f 72 65 20 63 68 65 63 6b 69  X: Before checki
152e0 6e 67 20 74 68 65 20 66 69 6e 61 6c 20 72 65 73  ng the final res
152f0 6f 75 72 63 65 73 20 69 6e 20 75 73 65 20 62 79  ources in use by
15300 20 53 51 4c 69 74 65 2c 20 6d 61 6b 65 0d 0a 20   SQLite, make.. 
15310 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 20         #        
15320 20 73 75 72 65 20 62 6f 74 68 20 6f 66 20 74 68   sure both of th
15330 65 20 50 52 41 47 4d 41 20 72 65 6c 61 74 65 64  e PRAGMA related
15340 20 64 69 72 65 63 74 6f 72 79 20 6e 61 6d 65 73   directory names
15350 20 61 72 65 20 66 72 65 65 64 2e 0d 0a 20 20 20   are freed...   
15360 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
15370 63 68 65 63 6b 46 6f 72 53 51 4c 69 74 65 44 69  checkForSQLiteDi
15380 72 65 63 74 6f 72 69 65 73 20 24 3a 3a 74 65 73  rectories $::tes
15390 74 5f 63 68 61 6e 6e 65 6c 20 74 72 75 65 0d 0a  t_channel true..
153a0 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
153b0 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 6c 73       # NOTE: Als
153c0 6f 20 72 65 70 6f 72 74 20 74 68 65 20 72 65 73  o report the res
153d0 6f 75 72 63 65 20 75 73 61 67 65 20 61 66 74 65  ource usage afte
153e0 72 20 72 75 6e 6e 69 6e 67 20 74 68 65 20 74 65  r running the te
153f0 73 74 73 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  sts...        #.
15400 0a 20 20 20 20 20 20 20 20 72 65 70 6f 72 74 53  .        reportS
15410 51 4c 69 74 65 52 65 73 6f 75 72 63 65 73 20 24  QLiteResources $
15420 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 0d 0a  ::test_channel..
15430 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
15440 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 52 65 70       # NOTE: Rep
15450 6f 72 74 20 74 68 65 20 63 72 69 74 69 63 61 6c  ort the critical
15460 20 68 61 6e 64 6c 65 20 63 6f 75 6e 74 73 20 61   handle counts a
15470 66 74 65 72 20 72 75 6e 6e 69 6e 67 20 74 68 65  fter running the
15480 20 74 65 73 74 73 2e 0d 0a 20 20 20 20 20 20 20   tests...       
15490 20 23 0d 0a 20 20 20 20 20 20 20 20 67 65 74 53   #..        getS
154a0 51 4c 69 74 65 48 61 6e 64 6c 65 43 6f 75 6e 74  QLiteHandleCount
154b0 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
154c0 6c 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  l..      }..    
154d0 7d 0d 0a 0c 0d 0a 20 20 20 20 23 23 23 23 23 23  }.....    ######
154e0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
154f0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
15500 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
15510 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
15520 23 23 23 23 23 0d 0a 20 20 20 20 23 23 23 23 23  #####..    #####
15530 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
15540 23 23 23 23 23 23 23 23 20 45 4e 44 20 45 61 67  ######## END Eag
15550 6c 65 20 4f 4e 4c 59 20 23 23 23 23 23 23 23 23  le ONLY ########
15560 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
15570 23 23 23 23 23 23 0d 0a 20 20 20 20 23 23 23 23  ######..    ####
15580 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
15590 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
155a0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
155b0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
155c0 23 23 23 23 23 23 23 0d 0a 20 20 7d 0d 0a 0d 0a  #######..  }....
155d0 20 20 23 0d 0a 20 20 23 20 4e 4f 54 45 3a 20 53    #..  # NOTE: S
155e0 61 76 65 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  ave the name of 
155f0 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 63 6f  the directory co
15600 6e 74 61 69 6e 69 6e 67 20 74 68 69 73 20 66 69  ntaining this fi
15610 6c 65 2e 0d 0a 20 20 23 0d 0a 20 20 69 66 20 7b  le...  #..  if {
15620 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 63 6f  ![info exists co
15630 6d 6d 6f 6e 5f 64 69 72 65 63 74 6f 72 79 5d 7d  mmon_directory]}
15640 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 73 65 74   then {..    set
15650 20 63 6f 6d 6d 6f 6e 5f 64 69 72 65 63 74 6f 72   common_director
15660 79 20 5b 66 69 6c 65 20 64 69 72 6e 61 6d 65 20  y [file dirname 
15670 5b 69 6e 66 6f 20 73 63 72 69 70 74 5d 5d 0d 0a  [info script]]..
15680 20 20 7d 0d 0a 0d 0a 20 20 23 0d 0a 20 20 23 20    }....  #..  # 
15690 4e 4f 54 45 3a 20 50 72 6f 76 69 64 65 20 74 68  NOTE: Provide th
156a0 65 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51  e System.Data.SQ
156b0 4c 69 74 65 20 74 65 73 74 20 70 61 63 6b 61 67  Lite test packag
156c0 65 20 74 6f 20 74 68 65 20 69 6e 74 65 72 70 72  e to the interpr
156d0 65 74 65 72 2e 0d 0a 20 20 23 0d 0a 20 20 70 61  eter...  #..  pa
156e0 63 6b 61 67 65 20 70 72 6f 76 69 64 65 20 53 79  ckage provide Sy
156f0 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
15700 2e 54 65 73 74 20 31 2e 30 0d 0a 7d 0d 0a        .Test 1.0..}..