System.Data.SQLite
Hex Artifact Content
Not logged in

Artifact 0dcb3bf603469bb0430e032c946cbdbcf5d38977:


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 69 73 4d 69  ...    proc isMi
24c0: 78 65 64 4d 6f 64 65 41 73 73 65 6d 62 6c 79 20  xedModeAssembly 
24d0: 7b 20 66 69 6c 65 4e 61 6d 65 20 7b 76 61 72 4e  { fileName {varN
24e0: 61 6d 65 20 22 22 7d 20 7d 20 7b 0d 0a 20 20 20  ame ""} } {..   
24f0: 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
2500: 54 45 3a 20 46 69 72 73 74 2c 20 6d 61 6b 65 20  TE: First, make 
2510: 73 75 72 65 20 74 68 65 20 74 65 73 74 20 73 75  sure the test su
2520: 69 74 65 20 69 6e 66 72 61 73 74 72 75 63 74 75  ite infrastructu
2530: 72 65 20 69 73 20 61 6c 6c 6f 77 65 64 20 74 6f  re is allowed to
2540: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
2550: 75 73 65 20 74 68 65 20 5b 65 78 65 63 5d 20 63  use the [exec] c
2560: 6f 6d 6d 61 6e 64 2e 0d 0a 20 20 20 20 20 20 23  ommand...      #
2570: 0d 0a 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e  ..      if {![in
2580: 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 65  fo exists ::no(e
2590: 78 65 63 29 5d 20 26 26 20 21 5b 69 6e 66 6f 20  xec)] && ![info 
25a0: 65 78 69 73 74 73 20 3a 3a 6e 6f 28 63 6f 72 46  exists ::no(corF
25b0: 6c 61 67 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a  lags)]} then {..
25c0: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
25d0: 20 20 20 23 20 4e 4f 54 45 3a 20 49 66 20 74 68     # NOTE: If th
25e0: 65 20 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 43 6f  e location of Co
25f0: 72 46 6c 61 67 73 20 69 73 20 70 72 65 73 65 6e  rFlags is presen
2600: 74 20 69 6e 20 74 68 65 20 65 6e 76 69 72 6f 6e  t in the environ
2610: 6d 65 6e 74 2c 0d 0a 20 20 20 20 20 20 20 20 23  ment,..        #
2620: 20 20 20 20 20 20 20 75 73 65 20 69 74 3b 20 6f         use it; o
2630: 74 68 65 72 77 69 73 65 20 61 73 73 75 6d 65 20  therwise assume 
2640: 69 74 20 69 73 20 69 6e 20 74 68 65 20 50 41 54  it is in the PAT
2650: 48 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  H...        #.. 
2660: 20 20 20 20 20 20 20 73 65 74 20 63 6f 72 46 6c         set corFl
2670: 61 67 73 20 5b 65 78 70 72 20 7b 0d 0a 20 20 20  ags [expr {..   
2680: 20 20 20 20 20 20 20 5b 69 6e 66 6f 20 65 78 69         [info exi
2690: 73 74 73 20 3a 3a 65 6e 76 28 43 6f 72 46 6c 61  sts ::env(CorFla
26a0: 67 73 29 5d 20 3f 20 24 3a 3a 65 6e 76 28 43 6f  gs)] ? $::env(Co
26b0: 72 46 6c 61 67 73 29 20 3a 20 22 43 6f 72 46 6c  rFlags) : "CorFl
26c0: 61 67 73 22 0d 0a 20 20 20 20 20 20 20 20 7d 5d  ags"..        }]
26d0: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  ....        #.. 
26e0: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41         # NOTE: A
26f0: 74 74 65 6d 70 74 20 74 6f 20 65 78 65 63 75 74  ttempt to execut
2700: 65 20 43 6f 72 46 6c 61 67 73 20 6f 6e 20 74 68  e CorFlags on th
2710: 65 20 73 70 65 63 69 66 69 65 64 20 66 69 6c 65  e specified file
2720: 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
2730: 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68        if {[catch
2740: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 65 78   {..          ex
2750: 65 63 20 2d 2d 20 24 63 6f 72 46 6c 61 67 73 20  ec -- $corFlags 
2760: 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65  [file nativename
2770: 20 24 66 69 6c 65 4e 61 6d 65 5d 0d 0a 20 20 20   $fileName]..   
2780: 20 20 20 20 20 7d 20 65 78 65 63 5d 20 3d 3d 20       } exec] == 
2790: 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
27a0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
27b0: 20 20 23 20 4e 4f 54 45 3a 20 49 66 20 72 65 71    # NOTE: If req
27c0: 75 65 73 74 65 64 20 62 79 20 6f 75 72 20 63 61  uested by our ca
27d0: 6c 6c 65 72 2c 20 61 74 74 65 6d 70 74 20 74 6f  ller, attempt to
27e0: 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 0d 0a   determine the..
27f0: 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20            #     
2800: 20 20 70 6c 61 74 66 6f 72 6d 20 66 6f 72 20 74    platform for t
2810: 68 65 20 73 70 65 63 69 66 69 65 64 20 66 69 6c  he specified fil
2820: 65 20 61 73 20 77 65 6c 6c 2e 0d 0a 20 20 20 20  e as well...    
2830: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
2840: 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c     if {[string l
2850: 65 6e 67 74 68 20 24 76 61 72 4e 61 6d 65 5d 20  ength $varName] 
2860: 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  > 0} then {..   
2870: 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
2880: 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
2890: 53 74 6f 72 65 20 74 68 65 20 70 6c 61 74 66 6f  Store the platfo
28a0: 72 6d 20 69 6e 20 74 68 65 20 6e 61 6d 65 64 20  rm in the named 
28b0: 76 61 72 69 61 62 6c 65 20 69 6e 20 74 68 65 0d  variable in the.
28c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 20 20  .            #  
28d0: 20 20 20 20 20 63 6f 6e 74 65 78 74 20 6f 66 20       context of 
28e0: 6f 75 72 20 63 61 6c 6c 65 72 2e 0d 0a 20 20 20  our caller...   
28f0: 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
2900: 20 20 20 20 20 20 20 20 75 70 76 61 72 20 31 20          upvar 1 
2910: 24 76 61 72 4e 61 6d 65 20 70 6c 61 74 66 6f 72  $varName platfor
2920: 6d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  m....           
2930: 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   #..            
2940: 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74 20  # NOTE: Attempt 
2950: 74 6f 20 65 78 74 72 61 63 74 20 74 68 65 20 50  to extract the P
2960: 45 20 6c 69 6e 65 20 66 72 6f 6d 20 74 68 65 20  E line from the 
2970: 63 61 70 74 75 72 65 64 0d 0a 20 20 20 20 20 20  captured..      
2980: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 6f 75        #       ou
2990: 74 70 75 74 2e 20 20 49 66 20 74 68 69 73 20 76  tput.  If this v
29a0: 61 6c 75 65 20 69 73 20 22 50 45 33 32 22 20 6f  alue is "PE32" o
29b0: 72 20 22 50 45 33 32 2b 22 2c 20 74 68 65 0d 0a  r "PE32+", the..
29c0: 20 20 20 20 20 20 20 20 20 20 20 20 23 20 20 20              #   
29d0: 20 20 20 20 61 73 73 65 6d 62 6c 79 20 66 69 6c      assembly fil
29e0: 65 20 69 73 20 33 32 2d 62 69 74 20 6f 72 20 36  e is 32-bit or 6
29f0: 34 2d 62 69 74 2c 20 72 65 73 70 65 63 74 69 76  4-bit, respectiv
2a00: 65 6c 79 3b 0d 0a 20 20 20 20 20 20 20 20 20 20  ely;..          
2a10: 20 20 23 20 20 20 20 20 20 20 6f 74 68 65 72 77    #       otherw
2a20: 69 73 65 2c 20 69 74 73 20 74 79 70 65 20 69 73  ise, its type is
2a30: 20 75 6e 6b 6e 6f 77 6e 2e 0d 0a 20 20 20 20 20   unknown...     
2a40: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
2a50: 20 20 20 20 20 20 73 65 74 20 70 61 74 74 65 72        set patter
2a60: 6e 20 7b 5e 50 45 20 20 20 20 20 20 20 20 3a 20  n {^PE        : 
2a70: 28 50 45 33 32 7c 50 45 33 32 5c 2b 29 5c 73 2b  (PE32|PE32\+)\s+
2a80: 24 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  $}....          
2a90: 20 20 69 66 20 7b 5b 72 65 67 65 78 70 20 2d 6c    if {[regexp -l
2aa0: 69 6e 65 20 2d 2d 20 24 70 61 74 74 65 72 6e 20  ine -- $pattern 
2ab0: 24 65 78 65 63 20 64 75 6d 6d 79 20 70 65 33 32  $exec dummy pe32
2ac0: 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
2ad0: 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
2ae0: 20 20 20 20 20 20 20 20 20 20 23 20 48 41 43 4b            # HACK
2af0: 3a 20 54 68 69 73 20 5b 73 77 69 74 63 68 5d 20  : This [switch] 
2b00: 61 73 73 75 6d 65 73 20 74 68 61 74 20 33 32 2d  assumes that 32-
2b10: 62 69 74 20 65 78 65 63 75 74 61 62 6c 65 73 20  bit executables 
2b20: 61 72 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20  are..           
2b30: 20 20 20 23 20 20 20 20 20 20 20 61 6c 77 61 79     #       alway
2b40: 73 20 78 38 36 20 61 6e 64 20 74 68 61 74 20 36  s x86 and that 6
2b50: 34 2d 62 69 74 20 65 78 65 63 75 74 61 62 6c 65  4-bit executable
2b60: 73 20 61 72 65 20 61 6c 77 61 79 73 0d 0a 20 20  s are always..  
2b70: 20 20 20 20 20 20 20 20 20 20 20 20 23 20 20 20              #   
2b80: 20 20 20 20 78 36 34 2e 0d 0a 20 20 20 20 20 20      x64...      
2b90: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
2ba0: 20 20 20 20 20 20 20 20 20 73 77 69 74 63 68 20           switch 
2bb0: 2d 65 78 61 63 74 20 2d 2d 20 24 70 65 33 32 20  -exact -- $pe32 
2bc0: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
2bd0: 20 20 20 50 45 33 32 20 7b 0d 0a 20 20 20 20 20     PE32 {..     
2be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74               set
2bf0: 20 70 6c 61 74 66 6f 72 6d 20 57 69 6e 33 32 0d   platform Win32.
2c00: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2c10: 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   }..            
2c20: 20 20 20 20 50 45 33 32 2b 20 7b 0d 0a 20 20 20      PE32+ {..   
2c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
2c40: 65 74 20 70 6c 61 74 66 6f 72 6d 20 78 36 34 0d  et platform x64.
2c50: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2c60: 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   }..            
2c70: 20 20 20 20 64 65 66 61 75 6c 74 20 7b 0d 0a 20      default {.. 
2c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c90: 20 73 65 74 20 70 6c 61 74 66 6f 72 6d 20 22 22   set platform ""
2ca0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
2cb0: 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20    }..           
2cc0: 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
2cd0: 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
2ce0: 20 20 20 20 20 20 20 20 20 20 73 65 74 20 70 6c            set pl
2cf0: 61 74 66 6f 72 6d 20 22 22 0d 0a 20 20 20 20 20  atform ""..     
2d00: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
2d10: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
2d20: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
2d30: 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74 20  # NOTE: Attempt 
2d40: 74 6f 20 65 78 74 72 61 63 74 20 74 68 65 20 49  to extract the I
2d50: 4c 4f 4e 4c 59 20 6c 69 6e 65 20 66 72 6f 6d 20  LONLY line from 
2d60: 74 68 65 20 63 61 70 74 75 72 65 64 0d 0a 20 20  the captured..  
2d70: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
2d80: 6f 75 74 70 75 74 2e 20 20 49 66 20 74 68 69 73  output.  If this
2d90: 20 76 61 6c 75 65 20 69 73 20 7a 65 72 6f 2c 20   value is zero, 
2da0: 74 68 65 20 73 70 65 63 69 66 69 65 64 20 66 69  the specified fi
2db0: 6c 65 20 6d 75 73 74 0d 0a 20 20 20 20 20 20 20  le must..       
2dc0: 20 20 20 23 20 20 20 20 20 20 20 62 65 20 61 20     #       be a 
2dd0: 6d 69 78 65 64 2d 6d 6f 64 65 20 61 73 73 65 6d  mixed-mode assem
2de0: 62 6c 79 3b 20 6f 74 68 65 72 77 69 73 65 2c 20  bly; otherwise, 
2df0: 69 74 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 6c 79  it contains only
2e00: 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 20 20  ..          #   
2e10: 20 20 20 20 6d 61 6e 61 67 65 64 20 63 6f 6d 70      managed comp
2e20: 6f 6e 65 6e 74 73 2e 0d 0a 20 20 20 20 20 20 20  onents...       
2e30: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
2e40: 73 65 74 20 70 61 74 74 65 72 6e 20 7b 5e 49 4c  set pattern {^IL
2e50: 4f 4e 4c 59 20 20 20 20 3a 20 28 30 7c 31 29 5c  ONLY    : (0|1)\
2e60: 73 2b 24 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  s+$}....        
2e70: 20 20 69 66 20 7b 21 5b 72 65 67 65 78 70 20 2d    if {![regexp -
2e80: 6c 69 6e 65 20 2d 2d 20 24 70 61 74 74 65 72 6e  line -- $pattern
2e90: 20 24 65 78 65 63 20 64 75 6d 6d 79 20 69 6c 4f   $exec dummy ilO
2ea0: 6e 6c 79 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  nly]} then {..  
2eb0: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
2ec0: 20 66 61 6c 73 65 0d 0a 20 20 20 20 20 20 20 20   false..        
2ed0: 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20    }....         
2ee0: 20 69 66 20 7b 21 24 69 6c 4f 6e 6c 79 7d 20 74   if {!$ilOnly} t
2ef0: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
2f00: 20 20 20 72 65 74 75 72 6e 20 74 72 75 65 0d 0a     return true..
2f10: 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
2f20: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d       }..      }.
2f30: 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
2f40: 20 20 23 20 4e 4f 54 45 3a 20 49 66 20 74 68 65    # NOTE: If the
2f50: 20 74 65 73 74 20 73 75 69 74 65 20 63 61 6e 6e   test suite cann
2f60: 6f 74 20 75 73 65 20 5b 65 78 65 63 5d 20 6f 72  ot use [exec] or
2f70: 20 65 78 65 63 75 74 69 6f 6e 20 6f 66 20 43 6f   execution of Co
2f80: 72 46 6c 61 67 73 0d 0a 20 20 20 20 20 20 23 20  rFlags..      # 
2f90: 20 20 20 20 20 20 66 61 69 6c 65 64 2c 20 72 65        failed, re
2fa0: 74 75 72 6e 20 66 61 6c 73 65 2e 0d 0a 20 20 20  turn false...   
2fb0: 20 20 20 23 0d 0a 20 20 20 20 20 20 72 65 74 75     #..      retu
2fc0: 72 6e 20 66 61 6c 73 65 0d 0a 20 20 20 20 7d 0d  rn false..    }.
2fd0: 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 69 73 42  ....    proc isB
2fe0: 75 69 6c 64 41 76 61 69 6c 61 62 6c 65 20 7b 20  uildAvailable { 
2ff0: 6e 61 74 69 76 65 20 64 69 72 65 63 74 6f 72 79  native directory
3000: 20 7b 76 61 72 4e 61 6d 65 20 22 22 7d 20 7d 20   {varName ""} } 
3010: 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  {..      #..    
3020: 20 20 23 20 4e 4f 54 45 3a 20 42 75 69 6c 64 20    # NOTE: Build 
3030: 74 68 65 20 66 75 6c 6c 79 20 71 75 61 6c 69 66  the fully qualif
3040: 69 65 64 20 66 69 6c 65 20 6e 61 6d 65 20 66 6f  ied file name fo
3050: 72 20 74 68 65 20 70 72 69 6d 61 72 79 20 61 73  r the primary as
3060: 73 65 6d 62 6c 79 0d 0a 20 20 20 20 20 20 23 20  sembly..      # 
3070: 20 20 20 20 20 20 63 6f 6e 74 61 69 6e 69 6e 67        containing
3080: 20 74 68 65 20 53 79 73 74 65 6d 2e 44 61 74 61   the System.Data
3090: 2e 53 51 4c 69 74 65 20 6d 61 6e 61 67 65 64 20  .SQLite managed 
30a0: 63 6f 6d 70 6f 6e 65 6e 74 73 2e 20 20 49 74 0d  components.  It.
30b0: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 73  .      #       s
30c0: 68 6f 75 6c 64 20 62 65 20 6e 6f 74 65 64 20 74  hould be noted t
30d0: 68 61 74 20 74 68 69 73 20 61 73 73 65 6d 62 6c  hat this assembl
30e0: 79 20 66 69 6c 65 20 6d 61 79 20 61 6c 73 6f 20  y file may also 
30f0: 63 6f 6e 74 61 69 6e 20 74 68 65 0d 0a 20 20 20  contain the..   
3100: 20 20 20 23 20 20 20 20 20 20 20 6e 61 74 69 76     #       nativ
3110: 65 20 63 6f 6d 70 6f 6e 65 6e 74 73 2c 20 69 66  e components, if
3120: 20 61 20 6e 61 74 69 76 65 20 62 75 69 6c 64 20   a native build 
3130: 69 73 20 69 6e 20 75 73 65 2e 0d 0a 20 20 20 20  is in use...    
3140: 20 20 23 0d 0a 20 20 20 20 20 20 73 65 74 20 66    #..      set f
3150: 69 6c 65 4e 61 6d 65 20 5b 66 69 6c 65 20 6e 61  ileName [file na
3160: 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c 65 20 6a  tivename [file j
3170: 6f 69 6e 20 24 64 69 72 65 63 74 6f 72 79 20 5c  oin $directory \
3180: 0d 0a 20 20 20 20 20 20 20 20 20 20 53 79 73 74  ..          Syst
3190: 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 64  em.Data.SQLite.d
31a0: 6c 6c 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 69 66  ll]]....      if
31b0: 20 7b 21 5b 66 69 6c 65 20 65 78 69 73 74 73 20   {![file exists 
31c0: 24 66 69 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e  $fileName]} then
31d0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75   {..        retu
31e0: 72 6e 20 66 61 6c 73 65 0d 0a 20 20 20 20 20 20  rn false..      
31f0: 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  }....      #..  
3200: 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 74 74 65      # NOTE: Atte
3210: 6d 70 74 20 74 6f 20 61 75 74 6f 6d 61 74 69 63  mpt to automatic
3220: 61 6c 6c 79 20 64 65 74 65 63 74 20 69 66 20 74  ally detect if t
3230: 68 65 20 70 72 69 6d 61 72 79 20 61 73 73 65 6d  he primary assem
3240: 62 6c 79 0d 0a 20 20 20 20 20 20 23 20 20 20 20  bly..      #    
3250: 20 20 20 63 6f 6e 74 61 69 6e 73 20 61 6e 79 20     contains any 
3260: 6e 61 74 69 76 65 20 63 6f 6d 70 6f 6e 65 6e 74  native component
3270: 73 2c 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e  s, if necessary.
3280: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
3290: 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e   if {[string len
32a0: 67 74 68 20 24 6e 61 74 69 76 65 5d 20 3d 3d 20  gth $native] == 
32b0: 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
32c0: 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c     if {[string l
32d0: 65 6e 67 74 68 20 24 76 61 72 4e 61 6d 65 5d 20  ength $varName] 
32e0: 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  > 0} then {..   
32f0: 20 20 20 20 20 20 20 75 70 76 61 72 20 31 20 24         upvar 1 $
3300: 76 61 72 4e 61 6d 65 20 24 76 61 72 4e 61 6d 65  varName $varName
3310: 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  ..        }.... 
3320: 20 20 20 20 20 20 20 73 65 74 20 6e 61 74 69 76         set nativ
3330: 65 20 5b 69 73 4d 69 78 65 64 4d 6f 64 65 41 73  e [isMixedModeAs
3340: 73 65 6d 62 6c 79 20 24 66 69 6c 65 4e 61 6d 65  sembly $fileName
3350: 20 24 76 61 72 4e 61 6d 65 5d 0d 0a 20 20 20 20   $varName]..    
3360: 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a    }....      #..
3370: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 66        # NOTE: If
3380: 20 74 68 65 20 70 72 69 6d 61 72 79 20 61 73 73   the primary ass
3390: 65 6d 62 6c 79 20 61 6c 73 6f 20 63 6f 6e 74 61  embly also conta
33a0: 69 6e 73 20 74 68 65 20 6e 61 74 69 76 65 20 63  ins the native c
33b0: 6f 6d 70 6f 6e 65 6e 74 73 2c 0d 0a 20 20 20 20  omponents,..    
33c0: 20 20 23 20 20 20 20 20 20 20 77 65 20 68 61 76    #       we hav
33d0: 65 20 65 76 65 72 79 74 68 69 6e 67 20 77 65 20  e everything we 
33e0: 6e 65 65 64 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  need...      #..
33f0: 20 20 20 20 20 20 69 66 20 7b 24 6e 61 74 69 76        if {$nativ
3400: 65 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  e} then {..     
3410: 20 20 20 72 65 74 75 72 6e 20 74 72 75 65 0d 0a     return true..
3420: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
3430: 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
3440: 3a 20 42 75 69 6c 64 20 74 68 65 20 66 75 6c 6c  : Build the full
3450: 79 20 71 75 61 6c 69 66 69 65 64 20 66 69 6c 65  y qualified file
3460: 20 6e 61 6d 65 20 66 6f 72 20 74 68 65 20 69 6e   name for the in
3470: 74 65 72 6f 70 20 61 73 73 65 6d 62 6c 79 0d 0a  terop assembly..
3480: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63 6f        #       co
3490: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 53 79 73  ntaining the Sys
34a0: 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 20  tem.Data.SQLite 
34b0: 6e 61 74 69 76 65 20 63 6f 6d 70 6f 6e 65 6e 74  native component
34c0: 73 2e 20 20 49 66 20 74 68 69 73 0d 0a 20 20 20  s.  If this..   
34d0: 20 20 20 23 20 20 20 20 20 20 20 66 69 6c 65 20     #       file 
34e0: 65 78 69 73 74 73 2c 20 77 65 20 73 68 6f 75 6c  exists, we shoul
34f0: 64 20 68 61 76 65 20 65 76 65 72 79 74 68 69 6e  d have everythin
3500: 67 20 77 65 20 6e 65 65 64 2e 0d 0a 20 20 20 20  g we need...    
3510: 20 20 23 0d 0a 20 20 20 20 20 20 73 65 74 20 66    #..      set f
3520: 69 6c 65 4e 61 6d 65 20 5b 66 69 6c 65 20 6e 61  ileName [file na
3530: 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c 65 20 6a  tivename [file j
3540: 6f 69 6e 20 24 64 69 72 65 63 74 6f 72 79 20 5c  oin $directory \
3550: 0d 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c 69  ..          SQLi
3560: 74 65 2e 49 6e 74 65 72 6f 70 2e 64 6c 6c 5d 5d  te.Interop.dll]]
3570: 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 66  ....      if {[f
3580: 69 6c 65 20 65 78 69 73 74 73 20 24 66 69 6c 65  ile exists $file
3590: 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  Name]} then {.. 
35a0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 72         return tr
35b0: 75 65 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  ue..      }.... 
35c0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
35d0: 4e 4f 54 45 3a 20 42 75 69 6c 64 20 74 68 65 20  NOTE: Build the 
35e0: 66 75 6c 6c 79 20 71 75 61 6c 69 66 69 65 64 20  fully qualified 
35f0: 66 69 6c 65 20 6e 61 6d 65 20 66 6f 72 20 74 68  file name for th
3600: 65 20 53 51 4c 69 74 65 20 63 6f 72 65 0d 0a 20  e SQLite core.. 
3610: 20 20 20 20 20 23 20 20 20 20 20 20 20 6c 69 62       #       lib
3620: 72 61 72 79 2e 20 20 49 66 20 74 68 69 73 20 66  rary.  If this f
3630: 69 6c 65 20 65 78 69 73 74 73 2c 20 77 65 20 73  ile exists, we s
3640: 68 6f 75 6c 64 20 68 61 76 65 20 65 76 65 72 79  hould have every
3650: 74 68 69 6e 67 20 77 65 0d 0a 20 20 20 20 20 20  thing we..      
3660: 23 20 20 20 20 20 20 20 6e 65 65 64 2e 0d 0a 20  #       need... 
3670: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 73 65       #..      se
3680: 74 20 66 69 6c 65 4e 61 6d 65 20 5b 66 69 6c 65  t fileName [file
3690: 20 6e 61 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c   nativename [fil
36a0: 65 20 6a 6f 69 6e 20 24 64 69 72 65 63 74 6f 72  e join $director
36b0: 79 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 73  y \..          s
36c0: 71 6c 69 74 65 33 2e 64 6c 6c 5d 5d 0d 0a 0d 0a  qlite3.dll]]....
36d0: 20 20 20 20 20 20 69 66 20 7b 5b 66 69 6c 65 20        if {[file 
36e0: 65 78 69 73 74 73 20 24 66 69 6c 65 4e 61 6d 65  exists $fileName
36f0: 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
3700: 20 20 20 72 65 74 75 72 6e 20 74 72 75 65 0d 0a     return true..
3710: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
3720: 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
3730: 3a 20 4f 6e 65 20 6f 72 20 6d 6f 72 65 20 6e 61  : One or more na
3740: 74 69 76 65 20 63 6f 6d 70 6f 6e 65 6e 74 73 20  tive components 
3750: 6e 65 65 64 65 64 20 62 79 20 53 79 73 74 65 6d  needed by System
3760: 2e 44 61 74 61 2e 53 51 4c 69 74 65 0d 0a 20 20  .Data.SQLite..  
3770: 20 20 20 20 23 20 20 20 20 20 20 20 61 72 65 20      #       are 
3780: 6d 69 73 73 69 6e 67 2e 0d 0a 20 20 20 20 20 20  missing...      
3790: 23 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  #..      return 
37a0: 66 61 6c 73 65 0d 0a 20 20 20 20 7d 0d 0a 0c 0d  false..    }....
37b0: 0a 20 20 20 20 70 72 6f 63 20 69 73 52 65 6c 65  .    proc isRele
37c0: 61 73 65 41 76 61 69 6c 61 62 6c 65 20 7b 20 64  aseAvailable { d
37d0: 69 72 65 63 74 6f 72 79 20 7b 76 61 72 4e 61 6d  irectory {varNam
37e0: 65 20 22 22 7d 20 7d 20 7b 0d 0a 20 20 20 20 20  e ""} } {..     
37f0: 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e   if {[string len
3800: 67 74 68 20 24 76 61 72 4e 61 6d 65 5d 20 3e 20  gth $varName] > 
3810: 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
3820: 20 20 20 75 70 76 61 72 20 31 20 24 76 61 72 4e     upvar 1 $varN
3830: 61 6d 65 20 24 76 61 72 4e 61 6d 65 0d 0a 20 20  ame $varName..  
3840: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 72      }....      r
3850: 65 74 75 72 6e 20 5b 69 73 42 75 69 6c 64 41 76  eturn [isBuildAv
3860: 61 69 6c 61 62 6c 65 20 22 22 20 24 64 69 72 65  ailable "" $dire
3870: 63 74 6f 72 79 20 24 76 61 72 4e 61 6d 65 5d 0d  ctory $varName].
3880: 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70  .    }.....    p
3890: 72 6f 63 20 6a 6f 69 6e 42 75 69 6c 64 44 69 72  roc joinBuildDir
38a0: 65 63 74 6f 72 79 20 7b 20 6e 61 74 69 76 65 20  ectory { native 
38b0: 70 61 74 68 20 79 65 61 72 20 70 6c 61 74 66 6f  path year platfo
38c0: 72 6d 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  rm configuration
38d0: 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20   } {..      #.. 
38e0: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 46 69 67       # NOTE: Fig
38f0: 75 72 65 20 6f 75 74 20 61 6e 64 20 74 68 65 6e  ure out and then
3900: 20 72 65 74 75 72 6e 20 74 68 65 20 66 75 6c 6c   return the full
3910: 79 20 71 75 61 6c 69 66 69 65 64 20 70 61 74 68  y qualified path
3920: 20 74 6f 20 74 68 65 20 62 75 69 6c 64 0d 0a 20   to the build.. 
3930: 20 20 20 20 20 23 20 20 20 20 20 20 20 64 69 72       #       dir
3940: 65 63 74 6f 72 79 20 62 61 73 65 64 20 6f 6e 20  ectory based on 
3950: 61 6c 6c 20 74 68 65 20 61 72 67 75 6d 65 6e 74  all the argument
3960: 73 20 70 72 6f 76 69 64 65 64 20 62 79 20 6f 75  s provided by ou
3970: 72 20 63 61 6c 6c 65 72 2e 0d 0a 20 20 20 20 20  r caller...     
3980: 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 24 6e   #..      if {$n
3990: 61 74 69 76 65 7d 20 74 68 65 6e 20 7b 0d 0a 20  ative} then {.. 
39a0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b 66         return [f
39b0: 69 6c 65 20 6a 6f 69 6e 20 24 70 61 74 68 20 62  ile join $path b
39c0: 69 6e 20 24 79 65 61 72 20 24 70 6c 61 74 66 6f  in $year $platfo
39d0: 72 6d 20 24 63 6f 6e 66 69 67 75 72 61 74 69 6f  rm $configuratio
39e0: 6e 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65  n]..      } else
39f0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75   {..        retu
3a00: 72 6e 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 24 70  rn [file join $p
3a10: 61 74 68 20 62 69 6e 20 24 79 65 61 72 20 24 63  ath bin $year $c
3a20: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 62 69 6e  onfiguration bin
3a30: 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  ]..      }..    
3a40: 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67  }.....    proc g
3a50: 65 74 42 75 69 6c 64 44 69 72 65 63 74 6f 72 79  etBuildDirectory
3a60: 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a   {} {..      #..
3a70: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 65        # NOTE: Se
3a80: 65 20 69 66 20 74 68 65 20 22 6e 61 74 69 76 65  e if the "native
3a90: 22 20 72 75 6e 74 69 6d 65 20 6f 70 74 69 6f 6e  " runtime option
3aa0: 20 68 61 73 20 62 65 65 6e 20 73 65 74 2e 20 20   has been set.  
3ab0: 49 66 20 73 6f 2c 20 75 73 65 20 74 68 65 0d 0a  If so, use the..
3ac0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 64 69        #       di
3ad0: 72 65 63 74 6f 72 79 20 66 6f 72 20 74 68 65 20  rectory for the 
3ae0: 6d 69 78 65 64 2d 6d 6f 64 65 20 61 73 73 65 6d  mixed-mode assem
3af0: 62 6c 79 20 28 61 2e 6b 2e 61 2e 20 74 68 65 20  bly (a.k.a. the 
3b00: 6e 61 74 69 76 65 20 69 6e 74 65 72 6f 70 0d 0a  native interop..
3b10: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 61 73        #       as
3b20: 73 65 6d 62 6c 79 29 2e 20 20 54 6f 20 65 6e 61  sembly).  To ena
3b30: 62 6c 65 20 74 68 69 73 20 6f 70 74 69 6f 6e 20  ble this option 
3b40: 76 69 61 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20  via the command 
3b50: 6c 69 6e 65 2c 20 65 6e 74 65 72 20 61 0d 0a 20  line, enter a.. 
3b60: 20 20 20 20 20 23 20 20 20 20 20 20 20 63 6f 6d       #       com
3b70: 6d 61 6e 64 20 73 69 6d 69 6c 61 72 20 74 6f 20  mand similar to 
3b80: 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  one of the follo
3b90: 77 69 6e 67 20 28 61 6c 6c 20 6f 6e 20 6f 6e 65  wing (all on one
3ba0: 20 6c 69 6e 65 29 3a 0d 0a 20 20 20 20 20 20 23   line):..      #
3bb0: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
3bc0: 45 61 67 6c 65 53 68 65 6c 6c 2e 65 78 65 20 2d  EagleShell.exe -
3bd0: 69 6e 69 74 69 61 6c 69 7a 65 20 2d 72 75 6e 74  initialize -runt
3be0: 69 6d 65 4f 70 74 69 6f 6e 20 6e 61 74 69 76 65  imeOption native
3bf0: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
3c00: 20 20 2d 66 69 6c 65 20 2e 5c 70 61 74 68 5c 74    -file .\path\t
3c10: 6f 5c 61 6c 6c 2e 65 61 67 6c 65 0d 0a 20 20 20  o\all.eagle..   
3c20: 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 20 20     #..      #   
3c30: 20 20 20 20 54 6f 20 65 6e 61 62 6c 65 20 74 68      To enable th
3c40: 69 73 20 6f 70 74 69 6f 6e 20 76 69 61 20 74 68  is option via th
3c50: 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20 70  e command line p
3c60: 72 69 6f 72 20 74 6f 20 74 68 65 20 22 62 65 74  rior to the "bet
3c70: 61 20 31 36 22 0d 0a 20 20 20 20 20 20 23 20 20  a 16"..      #  
3c80: 20 20 20 20 20 72 65 6c 65 61 73 65 20 6f 66 20       release of 
3c90: 45 61 67 6c 65 2c 20 74 68 65 20 66 6f 6c 6c 6f  Eagle, the follo
3ca0: 77 69 6e 67 20 63 6f 6d 6d 61 6e 64 20 6d 75 73  wing command mus
3cb0: 74 20 62 65 20 75 73 65 64 20 69 6e 73 74 65 61  t be used instea
3cc0: 64 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  d..      #      
3cd0: 20 28 61 6c 73 6f 20 61 6c 6c 20 6f 6e 20 6f 6e   (also all on on
3ce0: 65 20 6c 69 6e 65 29 3a 0d 0a 20 20 20 20 20 20  e line):..      
3cf0: 23 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  #..      #      
3d00: 20 45 61 67 6c 65 53 68 65 6c 6c 2e 65 78 65 20   EagleShell.exe 
3d10: 2d 69 6e 69 74 69 61 6c 69 7a 65 20 2d 70 6f 73  -initialize -pos
3d20: 74 49 6e 69 74 69 61 6c 69 7a 65 0d 0a 20 20 20  tInitialize..   
3d30: 20 20 20 23 20 20 20 20 20 20 20 20 20 22 6f 62     #         "ob
3d40: 6a 65 63 74 20 69 6e 76 6f 6b 65 20 49 6e 74 65  ject invoke Inte
3d50: 72 70 72 65 74 65 72 2e 47 65 74 41 63 74 69 76  rpreter.GetActiv
3d60: 65 20 41 64 64 52 75 6e 74 69 6d 65 4f 70 74 69  e AddRuntimeOpti
3d70: 6f 6e 20 6e 61 74 69 76 65 22 0d 0a 20 20 20 20  on native"..    
3d80: 20 20 23 20 20 20 20 20 20 20 20 20 2d 66 69 6c    #         -fil
3d90: 65 20 2e 5c 70 61 74 68 5c 74 6f 5c 61 6c 6c 2e  e .\path\to\all.
3da0: 65 61 67 6c 65 0d 0a 20 20 20 20 20 20 23 0d 0a  eagle..      #..
3db0: 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20        if {[info 
3dc0: 65 78 69 73 74 73 20 3a 3a 62 75 69 6c 64 5f 64  exists ::build_d
3dd0: 69 72 65 63 74 6f 72 79 5d 20 26 26 20 5c 0d 0a  irectory] && \..
3de0: 20 20 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e            [strin
3df0: 67 20 6c 65 6e 67 74 68 20 24 3a 3a 62 75 69 6c  g length $::buil
3e00: 64 5f 64 69 72 65 63 74 6f 72 79 5d 20 3e 20 30  d_directory] > 0
3e10: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
3e20: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
3e30: 4f 54 45 3a 20 54 68 65 20 6c 6f 63 61 74 69 6f  OTE: The locatio
3e40: 6e 20 6f 66 20 74 68 65 20 62 75 69 6c 64 20 64  n of the build d
3e50: 69 72 65 63 74 6f 72 79 20 68 61 73 20 62 65 65  irectory has bee
3e60: 6e 20 6f 76 65 72 72 69 64 64 65 6e 3b 0d 0a 20  n overridden;.. 
3e70: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74         #       t
3e80: 68 65 72 65 66 6f 72 65 2c 20 75 73 65 20 69 74  herefore, use it
3e90: 20 76 65 72 62 61 74 69 6d 2e 0d 0a 20 20 20 20   verbatim...    
3ea0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72      #..        r
3eb0: 65 74 75 72 6e 20 24 3a 3a 62 75 69 6c 64 5f 64  eturn $::build_d
3ec0: 69 72 65 63 74 6f 72 79 0d 0a 20 20 20 20 20 20  irectory..      
3ed0: 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
3ee0: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
3ef0: 4f 54 45 3a 20 49 66 20 74 68 65 20 22 6e 61 74  OTE: If the "nat
3f00: 69 76 65 22 20 72 75 6e 74 69 6d 65 20 6f 70 74  ive" runtime opt
3f10: 69 6f 6e 20 69 73 20 73 65 74 2c 20 74 68 65 20  ion is set, the 
3f20: 6d 69 78 65 64 2d 6d 6f 64 65 20 61 73 73 65 6d  mixed-mode assem
3f30: 62 6c 79 0d 0a 20 20 20 20 20 20 20 20 23 20 20  bly..        #  
3f40: 20 20 20 20 20 69 73 20 62 65 69 6e 67 20 74 65       is being te
3f50: 73 74 65 64 2e 20 20 49 6e 20 74 68 61 74 20 63  sted.  In that c
3f60: 61 73 65 2c 20 74 68 65 20 70 61 74 68 20 74 6f  ase, the path to
3f70: 20 74 68 65 20 62 75 69 6c 64 20 64 69 72 65 63   the build direc
3f80: 74 6f 72 79 0d 0a 20 20 20 20 20 20 20 20 23 20  tory..        # 
3f90: 20 20 20 20 20 20 77 69 6c 6c 20 63 6f 6e 74 61        will conta
3fa0: 69 6e 20 74 68 65 20 70 6c 61 74 66 6f 72 6d 20  in the platform 
3fb0: 6e 61 6d 65 20 61 6e 64 20 61 6c 6c 20 74 68 65  name and all the
3fc0: 20 62 69 6e 61 72 69 65 73 20 75 6e 64 65 72 20   binaries under 
3fd0: 74 65 73 74 0d 0a 20 20 20 20 20 20 20 20 23 20  test..        # 
3fe0: 20 20 20 20 20 20 73 68 6f 75 6c 64 20 62 65 20        should be 
3ff0: 70 72 65 73 65 6e 74 20 69 6e 20 74 68 61 74 20  present in that 
4000: 64 69 72 65 63 74 6f 72 79 2e 20 20 49 66 20 74  directory.  If t
4010: 68 65 20 22 6e 61 74 69 76 65 22 20 72 75 6e 74  he "native" runt
4020: 69 6d 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20  ime..        #  
4030: 20 20 20 20 20 6f 70 74 69 6f 6e 20 69 73 20 6e       option is n
4040: 6f 74 20 73 65 74 2c 20 74 68 65 20 62 75 69 6c  ot set, the buil
4050: 64 20 64 69 72 65 63 74 6f 72 79 20 77 69 6c 6c  d directory will
4060: 20 62 65 20 63 6f 6e 73 69 64 65 72 65 64 20 74   be considered t
4070: 6f 20 62 65 0d 0a 20 20 20 20 20 20 20 20 23 20  o be..        # 
4080: 20 20 20 20 20 20 22 70 6c 61 74 66 6f 72 6d 2d        "platform-
4090: 6e 65 75 74 72 61 6c 22 2c 20 77 69 74 68 20 74  neutral", with t
40a0: 68 65 20 6e 6f 74 61 62 6c 65 20 65 78 63 65 70  he notable excep
40b0: 74 69 6f 6e 20 6f 66 20 61 6e 79 20 6e 61 74 69  tion of any nati
40c0: 76 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  ve..        #   
40d0: 20 20 20 20 61 73 73 65 6d 62 6c 79 20 28 65 2e      assembly (e.
40e0: 67 2e 20 22 53 51 4c 69 74 65 2e 49 6e 74 65 72  g. "SQLite.Inter
40f0: 6f 70 2e 64 6c 6c 22 29 20 63 6f 70 69 65 64 20  op.dll") copied 
4100: 74 68 65 72 65 20 64 75 72 69 6e 67 20 74 68 65  there during the
4110: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
4120: 20 20 62 75 69 6c 64 20 70 72 6f 63 65 73 73 20    build process 
4130: 69 74 73 65 6c 66 2e 20 20 49 66 20 74 68 65 20  itself.  If the 
4140: 62 75 69 6c 64 20 70 72 6f 63 65 73 73 20 73 6f  build process so
4150: 6d 65 68 6f 77 20 64 6f 65 73 20 6e 6f 74 0d 0a  mehow does not..
4160: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
4170: 63 6f 70 79 20 74 68 65 20 6e 61 74 69 76 65 20  copy the native 
4180: 61 73 73 65 6d 62 6c 79 20 66 6f 72 20 74 68 69  assembly for thi
4190: 73 20 70 6c 61 74 66 6f 72 6d 2c 20 6d 6f 73 74  s platform, most
41a0: 20 6f 66 20 74 68 65 20 74 65 73 74 73 0d 0a 20   of the tests.. 
41b0: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 69         #       i
41c0: 6e 20 74 68 65 20 73 75 69 74 65 20 77 69 6c 6c  n the suite will
41d0: 20 73 69 6d 70 6c 79 20 62 65 20 73 6b 69 70 70   simply be skipp
41e0: 65 64 2e 20 20 47 65 6e 65 72 61 6c 6c 79 20 73  ed.  Generally s
41f0: 70 65 61 6b 69 6e 67 2c 20 74 68 65 72 65 0d 0a  peaking, there..
4200: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
4210: 61 72 65 20 74 77 6f 20 77 61 79 73 20 74 6f 20  are two ways to 
4220: 62 75 69 6c 64 20 74 68 65 20 62 69 6e 61 72 69  build the binari
4230: 65 73 20 77 68 65 6e 20 70 72 65 70 61 72 69 6e  es when preparin
4240: 67 20 74 6f 20 72 75 6e 20 74 68 65 0d 0a 20 20  g to run the..  
4250: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74 65        #       te
4260: 73 74 20 73 75 69 74 65 3a 0d 0a 20 20 20 20 20  st suite:..     
4270: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
4280: 20 20 20 20 20 20 31 2e 20 42 75 69 6c 64 20 74        1. Build t
4290: 68 65 20 73 65 70 61 72 61 74 65 20 6d 61 6e 61  he separate mana
42a0: 67 65 64 20 61 6e 64 20 6e 61 74 69 76 65 20 61  ged and native a
42b0: 73 73 65 6d 62 6c 69 65 73 20 75 73 69 6e 67 20  ssemblies using 
42c0: 73 6f 6d 65 0d 0a 20 20 20 20 20 20 20 20 23 20  some..        # 
42d0: 20 20 20 20 20 20 20 20 20 63 6f 6d 6d 61 6e 64           command
42e0: 73 20 73 69 6d 69 6c 61 72 20 74 6f 3a 0d 0a 20  s similar to:.. 
42f0: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
4300: 20 20 23 20 20 20 20 20 20 20 20 20 20 62 75 69    #          bui
4310: 6c 64 2e 62 61 74 20 24 7b 43 6f 6e 66 69 67 75  ld.bat ${Configu
4320: 72 61 74 69 6f 6e 7d 4d 61 6e 61 67 65 64 4f 6e  ration}ManagedOn
4330: 6c 79 20 24 7b 50 6c 61 74 66 6f 72 6d 7d 0d 0a  ly ${Platform}..
4340: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
4350: 20 20 20 62 75 69 6c 64 2e 62 61 74 20 24 7b 43     build.bat ${C
4360: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 7d 4e 61 74  onfiguration}Nat
4370: 69 76 65 4f 6e 6c 79 20 24 7b 50 6c 61 74 66 6f  iveOnly ${Platfo
4380: 72 6d 7d 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  rm}..        #..
4390: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
43a0: 20 20 20 57 68 65 72 65 20 24 7b 43 6f 6e 66 69     Where ${Confi
43b0: 67 75 72 61 74 69 6f 6e 7d 20 69 73 20 65 69 74  guration} is eit
43c0: 68 65 72 20 22 44 65 62 75 67 22 20 6f 72 20 22  her "Debug" or "
43d0: 52 65 6c 65 61 73 65 22 20 61 6e 64 0d 0a 20 20  Release" and..  
43e0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 20 20        #         
43f0: 20 24 7b 50 6c 61 74 66 6f 72 6d 7d 20 69 73 20   ${Platform} is 
4400: 65 69 74 68 65 72 20 22 57 69 6e 33 32 22 20 6f  either "Win32" o
4410: 72 20 22 78 36 34 22 2e 0d 0a 20 20 20 20 20 20  r "x64"...      
4420: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 20    #..        #  
4430: 20 20 20 20 20 32 2e 20 42 75 69 6c 64 20 74 68       2. Build th
4440: 65 20 6d 69 78 65 64 2d 6d 6f 64 65 20 61 73 73  e mixed-mode ass
4450: 65 6d 62 6c 79 20 75 73 69 6e 67 20 61 20 63 6f  embly using a co
4460: 6d 6d 61 6e 64 20 73 69 6d 69 6c 61 72 20 74 6f  mmand similar to
4470: 3a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  :..        #..  
4480: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 20 20        #         
4490: 20 62 75 69 6c 64 2e 62 61 74 20 24 7b 43 6f 6e   build.bat ${Con
44a0: 66 69 67 75 72 61 74 69 6f 6e 7d 20 24 7b 50 6c  figuration} ${Pl
44b0: 61 74 66 6f 72 6d 7d 0d 0a 20 20 20 20 20 20 20  atform}..       
44c0: 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20   #..        #   
44d0: 20 20 20 20 20 20 20 57 68 65 72 65 20 24 7b 43         Where ${C
44e0: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 7d 20 69 73  onfiguration} is
44f0: 20 65 69 74 68 65 72 20 22 44 65 62 75 67 22 20   either "Debug" 
4500: 6f 72 20 22 52 65 6c 65 61 73 65 22 20 61 6e 64  or "Release" and
4510: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
4520: 20 20 20 20 20 24 7b 50 6c 61 74 66 6f 72 6d 7d       ${Platform}
4530: 20 69 73 20 65 69 74 68 65 72 20 22 57 69 6e 33   is either "Win3
4540: 32 22 20 6f 72 20 22 78 36 34 22 2e 20 20 49 66  2" or "x64".  If
4550: 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 69 73   this command is
4560: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
4570: 20 20 20 20 20 75 73 65 64 2c 20 76 61 72 69 6f       used, vario
4580: 75 73 20 74 65 73 74 73 20 74 68 61 74 20 72 65  us tests that re
4590: 71 75 69 72 65 20 73 75 70 70 6c 65 6d 65 6e 74  quire supplement
45a0: 61 72 79 20 6d 61 6e 61 67 65 64 0d 0a 20 20 20  ary managed..   
45b0: 20 20 20 20 20 23 20 20 20 20 20 20 20 20 20 20       #          
45c0: 61 73 73 65 6d 62 6c 69 65 73 20 28 65 2e 67 2e  assemblies (e.g.
45d0: 20 4c 49 4e 51 29 20 6d 61 79 20 62 65 20 73 6b   LINQ) may be sk
45e0: 69 70 70 65 64 20 75 6e 6c 65 73 73 20 74 68 6f  ipped unless tho
45f0: 73 65 20 62 69 6e 61 72 69 65 73 0d 0a 20 20 20  se binaries..   
4600: 20 20 20 20 20 23 20 20 20 20 20 20 20 20 20 20       #          
4610: 61 72 65 20 73 75 62 73 65 71 75 65 6e 74 6c 79  are subsequently
4620: 20 63 6f 70 69 65 64 20 69 6e 74 6f 20 74 68 65   copied into the
4630: 20 63 6f 72 72 65 63 74 20 64 69 72 65 63 74 6f   correct directo
4640: 72 79 20 28 69 2e 65 2e 20 62 79 0d 0a 20 20 20  ry (i.e. by..   
4650: 20 20 20 20 20 23 20 20 20 20 20 20 20 20 20 20       #          
4660: 22 74 65 73 74 5f 61 6c 6c 2e 62 61 74 22 29 2e  "test_all.bat").
4670: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
4680: 20 20 20 20 20 23 20 20 20 20 20 20 20 4e 6f 74       #       Not
4690: 65 20 74 68 61 74 20 61 6c 6c 20 6f 66 20 74 68  e that all of th
46a0: 65 20 62 75 69 6c 64 20 63 6f 6d 6d 61 6e 64 73  e build commands
46b0: 20 61 62 6f 76 65 20 77 69 6c 6c 20 64 65 66 61   above will defa
46c0: 75 6c 74 20 74 6f 20 75 73 69 6e 67 0d 0a 20 20  ult to using..  
46d0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68        #       th
46e0: 65 20 6c 61 74 65 73 74 20 76 65 72 73 69 6f 6e  e latest version
46f0: 20 6f 66 20 4d 53 42 75 69 6c 64 20 61 76 61 69   of MSBuild avai
4700: 6c 61 62 6c 65 20 61 6e 64 20 74 68 65 20 22 74  lable and the "t
4710: 65 73 74 5f 79 65 61 72 22 20 6d 61 79 0d 0a 20  est_year" may.. 
4720: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 6e         #       n
4730: 65 65 64 20 74 6f 20 62 65 20 61 64 6a 75 73 74  eed to be adjust
4740: 65 64 20 61 63 63 6f 72 64 69 6e 67 6c 79 20 74  ed accordingly t
4750: 6f 20 61 63 74 75 61 6c 6c 79 20 72 75 6e 20 74  o actually run t
4760: 68 65 20 74 65 73 74 20 73 75 69 74 65 2e 0d 0a  he test suite...
4770: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
4780: 52 65 66 65 72 20 74 6f 20 74 68 65 20 63 6f 6d  Refer to the com
4790: 6d 65 6e 74 73 20 69 6e 20 5b 67 65 74 42 75 69  ments in [getBui
47a0: 6c 64 59 65 61 72 5d 20 66 6f 72 20 6d 6f 72 65  ldYear] for more
47b0: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e 0d   information on.
47c0: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
47d0: 20 68 6f 77 20 74 6f 20 73 65 74 20 74 68 69 73   how to set this
47e0: 20 76 61 72 69 61 62 6c 65 2e 0d 0a 20 20 20 20   variable...    
47f0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 73      #..        s
4800: 65 74 20 6e 61 74 69 76 65 20 5b 68 61 73 52 75  et native [hasRu
4810: 6e 74 69 6d 65 4f 70 74 69 6f 6e 20 6e 61 74 69  ntimeOption nati
4820: 76 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 72  ve]....        r
4830: 65 74 75 72 6e 20 5b 6a 6f 69 6e 42 75 69 6c 64  eturn [joinBuild
4840: 44 69 72 65 63 74 6f 72 79 20 24 6e 61 74 69 76  Directory $nativ
4850: 65 20 5b 67 65 74 42 75 69 6c 64 42 61 73 65 44  e [getBuildBaseD
4860: 69 72 65 63 74 6f 72 79 5d 20 5c 0d 0a 20 20 20  irectory] \..   
4870: 20 20 20 20 20 20 20 20 20 5b 67 65 74 42 75 69           [getBui
4880: 6c 64 59 65 61 72 5d 20 5b 67 65 74 42 75 69 6c  ldYear] [getBuil
4890: 64 50 6c 61 74 66 6f 72 6d 20 24 6e 61 74 69 76  dPlatform $nativ
48a0: 65 5d 20 5b 67 65 74 42 75 69 6c 64 43 6f 6e 66  e] [getBuildConf
48b0: 69 67 75 72 61 74 69 6f 6e 5d 5d 0d 0a 20 20 20  iguration]]..   
48c0: 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a     }..    }.....
48d0: 20 20 20 20 70 72 6f 63 20 67 65 74 52 65 6c 65      proc getRele
48e0: 61 73 65 56 65 72 73 69 6f 6e 20 7b 7d 20 7b 0d  aseVersion {} {.
48f0: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
4900: 23 20 4e 4f 54 45 3a 20 46 69 67 75 72 65 20 6f  # NOTE: Figure o
4910: 75 74 20 74 68 65 20 72 65 6c 65 61 73 65 20 76  ut the release v
4920: 65 72 73 69 6f 6e 20 66 6f 72 20 75 73 65 20 77  ersion for use w
4930: 69 74 68 20 74 68 65 20 62 75 69 6c 64 20 64 69  ith the build di
4940: 72 65 63 74 6f 72 79 0d 0a 20 20 20 20 20 20 23  rectory..      #
4950: 20 20 20 20 20 20 20 77 68 65 6e 20 63 68 65 63         when chec
4960: 6b 69 6e 67 20 66 6f 72 20 61 76 61 69 6c 61 62  king for availab
4970: 6c 65 20 72 65 6c 65 61 73 65 73 2e 0d 0a 20 20  le releases...  
4980: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20      #..      if 
4990: 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  {[info exists ::
49a0: 72 65 6c 65 61 73 65 5f 76 65 72 73 69 6f 6e 5d  release_version]
49b0: 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20   && \..         
49c0: 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20   [string length 
49d0: 24 3a 3a 72 65 6c 65 61 73 65 5f 76 65 72 73 69  $::release_versi
49e0: 6f 6e 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d  on] > 0} then {.
49f0: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
4a00: 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 65 20      # NOTE: The 
4a10: 72 65 6c 65 61 73 65 20 76 65 72 73 69 6f 6e 20  release version 
4a20: 68 61 73 20 62 65 65 6e 20 6f 76 65 72 72 69 64  has been overrid
4a30: 64 65 6e 3b 20 74 68 65 72 65 66 6f 72 65 2c 20  den; therefore, 
4a40: 75 73 65 20 69 74 0d 0a 20 20 20 20 20 20 20 20  use it..        
4a50: 23 20 20 20 20 20 20 20 76 65 72 62 61 74 69 6d  #       verbatim
4a60: 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
4a70: 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 3a 3a        return $::
4a80: 72 65 6c 65 61 73 65 5f 76 65 72 73 69 6f 6e 0d  release_version.
4a90: 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d  .      } else {.
4aa0: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
4ab0: 20 20 20 20 23 20 4e 4f 54 45 3a 20 4e 6f 20 72      # NOTE: No r
4ac0: 65 6c 65 61 73 65 20 76 65 72 73 69 6f 6e 20 69  elease version i
4ad0: 73 20 61 76 61 69 6c 61 62 6c 65 2c 20 72 65 74  s available, ret
4ae0: 75 72 6e 20 61 6e 20 65 6d 70 74 79 20 73 74 72  urn an empty str
4af0: 69 6e 67 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  ing...        #.
4b00: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
4b10: 22 22 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20  ""..      }..   
4b20: 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
4b30: 67 65 74 42 75 69 6c 64 46 69 6c 65 4e 61 6d 65  getBuildFileName
4b40: 20 7b 20 66 69 6c 65 4e 61 6d 65 20 7d 20 7b 0d   { fileName } {.
4b50: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
4b60: 23 20 4e 4f 54 45 3a 20 52 65 74 75 72 6e 73 20  # NOTE: Returns 
4b70: 74 68 65 20 73 70 65 63 69 66 69 65 64 20 66 69  the specified fi
4b80: 6c 65 20 6e 61 6d 65 20 61 73 20 69 66 20 69 74  le name as if it
4b90: 20 77 65 72 65 20 6c 6f 63 61 74 65 64 20 69 6e   were located in
4ba0: 20 74 68 65 0d 0a 20 20 20 20 20 20 23 20 20 20   the..      #   
4bb0: 20 20 20 20 62 75 69 6c 64 20 64 69 72 65 63 74      build direct
4bc0: 6f 72 79 2c 20 64 69 73 63 61 72 64 69 6e 67 20  ory, discarding 
4bd0: 61 6e 79 20 64 69 72 65 63 74 6f 72 79 20 69 6e  any directory in
4be0: 66 6f 72 6d 61 74 69 6f 6e 20 70 72 65 73 65 6e  formation presen
4bf0: 74 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  t..      #      
4c00: 20 69 6e 20 74 68 65 20 66 69 6c 65 20 6e 61 6d   in the file nam
4c10: 65 20 61 73 20 70 72 6f 76 69 64 65 64 20 62 79  e as provided by
4c20: 20 6f 75 72 20 63 61 6c 6c 65 72 2e 0d 0a 20 20   our caller...  
4c30: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 72 65 74      #..      ret
4c40: 75 72 6e 20 5b 66 69 6c 65 20 6e 61 74 69 76 65  urn [file native
4c50: 6e 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20 20 20  name \..        
4c60: 20 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5b 67 65    [file join [ge
4c70: 74 42 75 69 6c 64 44 69 72 65 63 74 6f 72 79 5d  tBuildDirectory]
4c80: 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 66 69 6c   [file tail $fil
4c90: 65 4e 61 6d 65 5d 5d 5d 0d 0a 20 20 20 20 7d 0d  eName]]]..    }.
4ca0: 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74  ....    proc get
4cb0: 42 69 6e 61 72 79 44 69 72 65 63 74 6f 72 79 20  BinaryDirectory 
4cc0: 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20  {} {..      #.. 
4cd0: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 69       # NOTE: Thi
4ce0: 73 20 70 72 6f 63 65 64 75 72 65 20 72 65 74 75  s procedure retu
4cf0: 72 6e 73 20 74 68 65 20 64 69 72 65 63 74 6f 72  rns the director
4d00: 79 20 77 68 65 72 65 20 74 68 65 20 74 65 73 74  y where the test
4d10: 20 61 70 70 6c 69 63 61 74 69 6f 6e 0d 0a 20 20   application..  
4d20: 20 20 20 20 23 20 20 20 20 20 20 20 69 74 73 65      #       itse
4d30: 6c 66 20 28 69 2e 65 2e 20 74 68 65 20 45 61 67  lf (i.e. the Eag
4d40: 6c 65 20 73 68 65 6c 6c 29 20 69 73 20 6c 6f 63  le shell) is loc
4d50: 61 74 65 64 2e 20 20 54 68 69 73 20 77 69 6c 6c  ated.  This will
4d60: 20 62 65 20 75 73 65 64 20 61 73 0d 0a 20 20 20   be used as..   
4d70: 20 20 20 23 20 20 20 20 20 20 20 74 68 65 20 64     #       the d
4d80: 65 73 74 69 6e 61 74 69 6f 6e 20 66 6f 72 20 74  estination for t
4d90: 68 65 20 63 6f 70 69 65 64 20 53 79 73 74 65 6d  he copied System
4da0: 2e 44 61 74 61 2e 53 51 4c 69 74 65 20 6e 61 74  .Data.SQLite nat
4db0: 69 76 65 20 61 6e 64 0d 0a 20 20 20 20 20 20 23  ive and..      #
4dc0: 20 20 20 20 20 20 20 6d 61 6e 61 67 65 64 20 61         managed a
4dd0: 73 73 65 6d 62 6c 69 65 73 20 28 69 2e 65 2e 20  ssemblies (i.e. 
4de0: 62 65 63 61 75 73 65 20 74 68 69 73 20 69 73 20  because this is 
4df0: 6f 6e 65 20 6f 66 20 74 68 65 20 66 65 77 20 70  one of the few p
4e00: 6c 61 63 65 73 0d 0a 20 20 20 20 20 20 23 20 20  laces..      #  
4e10: 20 20 20 20 20 77 68 65 72 65 20 74 68 65 20 43       where the C
4e20: 4c 52 20 77 69 6c 6c 20 61 63 74 75 61 6c 6c 79  LR will actually
4e30: 20 66 69 6e 64 20 61 6e 64 20 6c 6f 61 64 20 74   find and load t
4e40: 68 65 6d 20 70 72 6f 70 65 72 6c 79 29 2e 0d 0a  hem properly)...
4e50: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69        #..      i
4e60: 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20  f {[info exists 
4e70: 3a 3a 62 69 6e 61 72 79 5f 64 69 72 65 63 74 6f  ::binary_directo
4e80: 72 79 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20  ry] && \..      
4e90: 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67      [string leng
4ea0: 74 68 20 24 3a 3a 62 69 6e 61 72 79 5f 64 69 72  th $::binary_dir
4eb0: 65 63 74 6f 72 79 5d 20 3e 20 30 7d 20 74 68 65  ectory] > 0} the
4ec0: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  n {..        #..
4ed0: 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
4ee0: 54 68 65 20 6c 6f 63 61 74 69 6f 6e 20 6f 66 20  The location of 
4ef0: 74 68 65 20 62 69 6e 61 72 79 20 64 69 72 65 63  the binary direc
4f00: 74 6f 72 79 20 68 61 73 20 62 65 65 6e 20 6f 76  tory has been ov
4f10: 65 72 72 69 64 64 65 6e 3b 0d 0a 20 20 20 20 20  erridden;..     
4f20: 20 20 20 23 20 20 20 20 20 20 20 74 68 65 72 65     #       there
4f30: 66 6f 72 65 2c 20 75 73 65 20 69 74 20 76 65 72  fore, use it ver
4f40: 62 61 74 69 6d 2e 0d 0a 20 20 20 20 20 20 20 20  batim...        
4f50: 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  #..        retur
4f60: 6e 20 24 3a 3a 62 69 6e 61 72 79 5f 64 69 72 65  n $::binary_dire
4f70: 63 74 6f 72 79 0d 0a 20 20 20 20 20 20 7d 20 65  ctory..      } e
4f80: 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 72  lse {..        r
4f90: 65 74 75 72 6e 20 5b 69 6e 66 6f 20 62 69 6e 61  eturn [info bina
4fa0: 72 79 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20  ry]..      }..  
4fb0: 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
4fc0: 20 67 65 74 42 69 6e 61 72 79 46 69 6c 65 4e 61   getBinaryFileNa
4fd0: 6d 65 20 7b 20 66 69 6c 65 4e 61 6d 65 20 7d 20  me { fileName } 
4fe0: 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  {..      #..    
4ff0: 20 20 23 20 4e 4f 54 45 3a 20 52 65 74 75 72 6e    # NOTE: Return
5000: 73 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  s the specified 
5010: 66 69 6c 65 20 6e 61 6d 65 20 61 73 20 69 66 20  file name as if 
5020: 69 74 20 77 65 72 65 20 6c 6f 63 61 74 65 64 20  it were located 
5030: 69 6e 20 74 68 65 0d 0a 20 20 20 20 20 20 23 20  in the..      # 
5040: 20 20 20 20 20 20 62 69 6e 61 72 79 20 64 69 72        binary dir
5050: 65 63 74 6f 72 79 2c 20 64 69 73 63 61 72 64 69  ectory, discardi
5060: 6e 67 20 61 6e 79 20 64 69 72 65 63 74 6f 72 79  ng any directory
5070: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 70 72 65   information pre
5080: 73 65 6e 74 0d 0a 20 20 20 20 20 20 23 20 20 20  sent..      #   
5090: 20 20 20 20 69 6e 20 74 68 65 20 66 69 6c 65 20      in the file 
50a0: 6e 61 6d 65 20 61 73 20 70 72 6f 76 69 64 65 64  name as provided
50b0: 20 62 79 20 6f 75 72 20 63 61 6c 6c 65 72 2e 0d   by our caller..
50c0: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
50d0: 72 65 74 75 72 6e 20 5b 66 69 6c 65 20 6e 61 74  return [file nat
50e0: 69 76 65 6e 61 6d 65 20 5c 0d 0a 20 20 20 20 20  ivename \..     
50f0: 20 20 20 20 20 5b 66 69 6c 65 20 6a 6f 69 6e 20       [file join 
5100: 5b 67 65 74 42 69 6e 61 72 79 44 69 72 65 63 74  [getBinaryDirect
5110: 6f 72 79 5d 20 5b 66 69 6c 65 20 74 61 69 6c 20  ory] [file tail 
5120: 24 66 69 6c 65 4e 61 6d 65 5d 5d 5d 0d 0a 20 20  $fileName]]]..  
5130: 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
5140: 20 67 65 74 43 6f 72 65 42 69 6e 61 72 79 46 69   getCoreBinaryFi
5150: 6c 65 4e 61 6d 65 20 7b 20 7b 73 74 61 6e 64 61  leName { {standa
5160: 72 64 20 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a 20  rd false} } {.. 
5170: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
5180: 4e 4f 54 45 3a 20 52 65 74 75 72 6e 73 20 74 68  NOTE: Returns th
5190: 65 20 66 75 6c 6c 20 70 61 74 68 20 66 6f 72 20  e full path for 
51a0: 74 68 65 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e  the file contain
51b0: 69 6e 67 20 74 68 65 20 63 6f 72 65 20 53 51 4c  ing the core SQL
51c0: 69 74 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ite..      #    
51d0: 20 20 20 6c 69 62 72 61 72 79 20 63 6f 64 65 20     library code 
51e0: 66 6f 72 20 74 68 69 73 20 70 6c 61 74 66 6f 72  for this platfor
51f0: 6d 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  m...      #..   
5200: 20 20 20 69 66 20 7b 5b 68 61 73 52 75 6e 74 69     if {[hasRunti
5210: 6d 65 4f 70 74 69 6f 6e 20 6e 61 74 69 76 65 5d  meOption native]
5220: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
5230: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
5240: 4f 54 45 3a 20 52 65 74 75 72 6e 20 74 68 65 20  OTE: Return the 
5250: 6d 69 78 65 64 2d 6d 6f 64 65 20 61 73 73 65 6d  mixed-mode assem
5260: 62 6c 79 20 66 69 6c 65 20 6e 61 6d 65 2e 0d 0a  bly file name...
5270: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
5280: 20 20 20 72 65 74 75 72 6e 20 5b 66 69 6c 65 20     return [file 
5290: 6e 61 74 69 76 65 6e 61 6d 65 20 5c 0d 0a 20 20  nativename \..  
52a0: 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20            [file 
52b0: 6a 6f 69 6e 20 5b 67 65 74 42 69 6e 61 72 79 44  join [getBinaryD
52c0: 69 72 65 63 74 6f 72 79 5d 20 53 79 73 74 65 6d  irectory] System
52d0: 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 64 6c 6c  .Data.SQLite.dll
52e0: 5d 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65  ]]..      } else
52f0: 69 66 20 7b 24 73 74 61 6e 64 61 72 64 7d 20 74  if {$standard} t
5300: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  hen {..        #
5310: 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
5320: 3a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 61 74  : Return the nat
5330: 69 76 65 2d 6f 6e 6c 79 20 73 74 61 6e 64 61 72  ive-only standar
5340: 64 20 53 51 4c 69 74 65 20 6c 69 62 72 61 72 79  d SQLite library
5350: 20 66 69 6c 65 20 6e 61 6d 65 2e 0d 0a 20 20 20   file name...   
5360: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
5370: 72 65 74 75 72 6e 20 5b 66 69 6c 65 20 6e 61 74  return [file nat
5380: 69 76 65 6e 61 6d 65 20 5c 0d 0a 20 20 20 20 20  ivename \..     
5390: 20 20 20 20 20 20 20 5b 66 69 6c 65 20 6a 6f 69         [file joi
53a0: 6e 20 5b 67 65 74 42 69 6e 61 72 79 44 69 72 65  n [getBinaryDire
53b0: 63 74 6f 72 79 5d 20 73 71 6c 69 74 65 33 2e 64  ctory] sqlite3.d
53c0: 6c 6c 5d 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c  ll]]..      } el
53d0: 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d  se {..        #.
53e0: 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
53f0: 20 52 65 74 75 72 6e 20 74 68 65 20 6e 61 74 69   Return the nati
5400: 76 65 2d 6f 6e 6c 79 20 69 6e 74 65 72 6f 70 20  ve-only interop 
5410: 61 73 73 65 6d 62 6c 79 20 66 69 6c 65 20 6e 61  assembly file na
5420: 6d 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  me...        #..
5430: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b          return [
5440: 66 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65 20  file nativename 
5450: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b  \..            [
5460: 66 69 6c 65 20 6a 6f 69 6e 20 5b 67 65 74 42 69  file join [getBi
5470: 6e 61 72 79 44 69 72 65 63 74 6f 72 79 5d 20 53  naryDirectory] S
5480: 51 4c 69 74 65 2e 49 6e 74 65 72 6f 70 2e 64 6c  QLite.Interop.dl
5490: 6c 5d 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20  l]]..      }..  
54a0: 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
54b0: 20 67 65 74 43 6f 6d 6d 6f 6e 44 69 72 65 63 74   getCommonDirect
54c0: 6f 72 79 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20  ory {} {..      
54d0: 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
54e0: 20 54 68 69 73 20 70 72 6f 63 65 64 75 72 65 20   This procedure 
54f0: 72 65 74 75 72 6e 73 20 74 68 65 20 64 69 72 65  returns the dire
5500: 63 74 6f 72 79 20 77 68 65 72 65 20 74 68 65 20  ctory where the 
5510: 74 65 73 74 20 73 63 72 69 70 74 73 0d 0a 20 20  test scripts..  
5520: 20 20 20 20 23 20 20 20 20 20 20 20 73 68 6f 75      #       shou
5530: 6c 64 20 62 65 20 6c 6f 63 61 74 65 64 2e 20 20  ld be located.  
5540: 42 79 20 64 65 66 61 75 6c 74 2c 20 74 68 69 73  By default, this
5550: 20 6a 75 73 74 20 72 65 74 75 72 6e 73 20 74 68   just returns th
5560: 65 20 45 61 67 6c 65 0d 0a 20 20 20 20 20 20 23  e Eagle..      #
5570: 20 20 20 20 20 20 20 62 69 6e 61 72 79 20 64 69         binary di
5580: 72 65 63 74 6f 72 79 2e 0d 0a 20 20 20 20 20 20  rectory...      
5590: 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 6e  #..      if {[in
55a0: 66 6f 20 65 78 69 73 74 73 20 3a 3a 63 6f 6d 6d  fo exists ::comm
55b0: 6f 6e 5f 64 69 72 65 63 74 6f 72 79 5d 20 26 26  on_directory] &&
55c0: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 73   \..          [s
55d0: 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a  tring length $::
55e0: 63 6f 6d 6d 6f 6e 5f 64 69 72 65 63 74 6f 72 79  common_directory
55f0: 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20  ] > 0} then {.. 
5600: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
5610: 20 20 23 20 4e 4f 54 45 3a 20 54 68 65 20 6c 6f    # NOTE: The lo
5620: 63 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 63 6f  cation of the co
5630: 6d 6d 6f 6e 20 64 69 72 65 63 74 6f 72 79 20 68  mmon directory h
5640: 61 73 20 62 65 65 6e 20 73 65 74 3b 0d 0a 20 20  as been set;..  
5650: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68        #       th
5660: 65 72 65 66 6f 72 65 2c 20 75 73 65 20 69 74 2e  erefore, use it.
5670: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
5680: 20 20 20 20 20 72 65 74 75 72 6e 20 24 3a 3a 63       return $::c
5690: 6f 6d 6d 6f 6e 5f 64 69 72 65 63 74 6f 72 79 0d  ommon_directory.
56a0: 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 69 66 20  .      } elseif 
56b0: 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  {[info exists ::
56c0: 76 65 6e 64 6f 72 5f 64 69 72 65 63 74 6f 72 79  vendor_directory
56d0: 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20  ] && \..        
56e0: 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68    [string length
56f0: 20 24 3a 3a 76 65 6e 64 6f 72 5f 64 69 72 65 63   $::vendor_direc
5700: 74 6f 72 79 5d 20 3e 20 30 7d 20 74 68 65 6e 20  tory] > 0} then 
5710: 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
5720: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68        # NOTE: Th
5730: 65 20 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 74 68  e location of th
5740: 65 20 76 65 6e 64 6f 72 20 64 69 72 65 63 74 6f  e vendor directo
5750: 72 79 20 68 61 73 20 62 65 65 6e 20 73 65 74 3b  ry has been set;
5760: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
5770: 20 20 74 68 65 72 65 66 6f 72 65 2c 20 75 73 65    therefore, use
5780: 20 69 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d   it...        #.
5790: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
57a0: 24 3a 3a 76 65 6e 64 6f 72 5f 64 69 72 65 63 74  $::vendor_direct
57b0: 6f 72 79 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73  ory..      } els
57c0: 65 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74  eif {[info exist
57d0: 73 20 3a 3a 74 63 6c 5f 6c 69 62 72 61 72 79 5d  s ::tcl_library]
57e0: 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20   && \..         
57f0: 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20   [string length 
5800: 24 3a 3a 74 63 6c 5f 6c 69 62 72 61 72 79 5d 20  $::tcl_library] 
5810: 3e 20 30 20 26 26 20 5c 0d 0a 20 20 20 20 20 20  > 0 && \..      
5820: 20 20 20 20 5b 66 69 6c 65 20 69 73 64 69 72 65      [file isdire
5830: 63 74 6f 72 79 20 24 3a 3a 74 63 6c 5f 6c 69 62  ctory $::tcl_lib
5840: 72 61 72 79 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  rary]} then {.. 
5850: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
5860: 20 20 23 20 4e 4f 54 45 3a 20 54 68 65 20 76 61    # NOTE: The va
5870: 72 69 61 62 6c 65 20 77 69 74 68 20 74 68 65 20  riable with the 
5880: 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  location of the 
5890: 73 63 72 69 70 74 20 6c 69 62 72 61 72 79 20 69  script library i
58a0: 73 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  s..        #    
58b0: 20 20 20 73 65 74 20 61 6e 64 20 61 70 70 65 61     set and appea
58c0: 72 73 20 74 6f 20 62 65 20 61 20 72 65 61 6c 20  rs to be a real 
58d0: 64 69 72 65 63 74 6f 72 79 20 28 69 2e 65 2e 20  directory (i.e. 
58e0: 6e 6f 74 20 65 6d 62 65 64 64 65 64 0d 0a 20 20  not embedded..  
58f0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 77 69        #       wi
5900: 74 68 69 6e 20 61 20 66 69 6c 65 29 3b 20 74 68  thin a file); th
5910: 65 72 65 66 6f 72 65 2c 20 75 73 65 20 69 74 2e  erefore, use it.
5920: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
5930: 20 20 20 20 20 72 65 74 75 72 6e 20 24 3a 3a 74       return $::t
5940: 63 6c 5f 6c 69 62 72 61 72 79 0d 0a 20 20 20 20  cl_library..    
5950: 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
5960: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
5970: 20 4e 4f 54 45 3a 20 46 61 6c 6c 62 61 63 6b 20   NOTE: Fallback 
5980: 74 6f 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  to the directory
5990: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
59a0: 65 78 65 63 75 74 61 62 6c 65 2e 0d 0a 20 20 20  executable...   
59b0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
59c0: 72 65 74 75 72 6e 20 5b 69 6e 66 6f 20 62 69 6e  return [info bin
59d0: 61 72 79 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20  ary]..      }.. 
59e0: 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
59f0: 63 20 67 65 74 44 61 74 61 62 61 73 65 44 69 72  c getDatabaseDir
5a00: 65 63 74 6f 72 79 20 7b 7d 20 7b 0d 0a 20 20 20  ectory {} {..   
5a10: 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
5a20: 54 45 3a 20 54 68 69 73 20 70 72 6f 63 65 64 75  TE: This procedu
5a30: 72 65 20 72 65 74 75 72 6e 73 20 74 68 65 20 64  re returns the d
5a40: 69 72 65 63 74 6f 72 79 20 77 68 65 72 65 20 74  irectory where t
5a50: 68 65 20 74 65 73 74 20 64 61 74 61 62 61 73 65  he test database
5a60: 73 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  s..      #      
5a70: 20 73 68 6f 75 6c 64 20 62 65 20 6c 6f 63 61 74   should be locat
5a80: 65 64 2e 20 20 42 79 20 64 65 66 61 75 6c 74 2c  ed.  By default,
5a90: 20 74 68 69 73 20 6a 75 73 74 20 75 73 65 73 20   this just uses 
5aa0: 74 68 65 20 74 65 6d 70 6f 72 61 72 79 0d 0a 20  the temporary.. 
5ab0: 20 20 20 20 20 23 20 20 20 20 20 20 20 64 69 72       #       dir
5ac0: 65 63 74 6f 72 79 20 63 6f 6e 66 69 67 75 72 65  ectory configure
5ad0: 64 20 66 6f 72 20 74 68 69 73 20 73 79 73 74 65  d for this syste
5ae0: 6d 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  m...      #..   
5af0: 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69     if {[info exi
5b00: 73 74 73 20 3a 3a 64 61 74 61 62 61 73 65 5f 64  sts ::database_d
5b10: 69 72 65 63 74 6f 72 79 5d 20 26 26 20 5c 0d 0a  irectory] && \..
5b20: 20 20 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e            [strin
5b30: 67 20 6c 65 6e 67 74 68 20 24 3a 3a 64 61 74 61  g length $::data
5b40: 62 61 73 65 5f 64 69 72 65 63 74 6f 72 79 5d 20  base_directory] 
5b50: 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  > 0} then {..   
5b60: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
5b70: 23 20 4e 4f 54 45 3a 20 54 68 65 20 6c 6f 63 61  # NOTE: The loca
5b80: 74 69 6f 6e 20 6f 66 20 74 68 65 20 64 61 74 61  tion of the data
5b90: 62 61 73 65 20 64 69 72 65 63 74 6f 72 79 20 68  base directory h
5ba0: 61 73 20 62 65 65 6e 20 6f 76 65 72 72 69 64 64  as been overridd
5bb0: 65 6e 3b 0d 0a 20 20 20 20 20 20 20 20 23 20 20  en;..        #  
5bc0: 20 20 20 20 20 74 68 65 72 65 66 6f 72 65 2c 20       therefore, 
5bd0: 75 73 65 20 69 74 2e 0d 0a 20 20 20 20 20 20 20  use it...       
5be0: 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75   #..        retu
5bf0: 72 6e 20 24 3a 3a 64 61 74 61 62 61 73 65 5f 64  rn $::database_d
5c00: 69 72 65 63 74 6f 72 79 0d 0a 20 20 20 20 20 20  irectory..      
5c10: 7d 20 65 6c 73 65 69 66 20 7b 5b 69 6e 66 6f 20  } elseif {[info 
5c20: 65 78 69 73 74 73 20 3a 3a 73 63 72 61 74 63 68  exists ::scratch
5c30: 5f 64 69 72 65 63 74 6f 72 79 5d 20 26 26 20 5c  _directory] && \
5c40: 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 73 74 72  ..          [str
5c50: 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a 73 63  ing length $::sc
5c60: 72 61 74 63 68 5f 64 69 72 65 63 74 6f 72 79 5d  ratch_directory]
5c70: 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20   > 0} then {..  
5c80: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
5c90: 20 23 20 4e 4f 54 45 3a 20 54 68 65 20 6c 6f 63   # NOTE: The loc
5ca0: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 63 72  ation of the scr
5cb0: 61 74 63 68 20 64 69 72 65 63 74 6f 72 79 20 68  atch directory h
5cc0: 61 73 20 62 65 65 6e 20 6f 76 65 72 72 69 64 64  as been overridd
5cd0: 65 6e 3b 0d 0a 20 20 20 20 20 20 20 20 23 20 20  en;..        #  
5ce0: 20 20 20 20 20 74 68 65 72 65 66 6f 72 65 2c 20       therefore, 
5cf0: 75 73 65 20 69 74 2e 0d 0a 20 20 20 20 20 20 20  use it...       
5d00: 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75   #..        retu
5d10: 72 6e 20 24 3a 3a 73 63 72 61 74 63 68 5f 64 69  rn $::scratch_di
5d20: 72 65 63 74 6f 72 79 0d 0a 20 20 20 20 20 20 7d  rectory..      }
5d30: 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
5d40: 20 72 65 74 75 72 6e 20 5b 67 65 74 54 65 6d 70   return [getTemp
5d50: 6f 72 61 72 79 50 61 74 68 5d 0d 0a 20 20 20 20  oraryPath]..    
5d60: 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20    }..    }..... 
5d70: 20 20 20 70 72 6f 63 20 67 65 74 54 65 6d 70 6f     proc getTempo
5d80: 72 61 72 79 44 69 72 65 63 74 6f 72 79 20 7b 7d  raryDirectory {}
5d90: 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20   {..      #..   
5da0: 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 69 73 20     # NOTE: This 
5db0: 70 72 6f 63 65 64 75 72 65 20 72 65 74 75 72 6e  procedure return
5dc0: 73 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20  s the directory 
5dd0: 77 68 65 72 65 20 74 68 65 20 74 65 6d 70 6f 72  where the tempor
5de0: 61 72 79 20 66 69 6c 65 73 0d 0a 20 20 20 20 20  ary files..     
5df0: 20 23 20 20 20 20 20 20 20 73 68 6f 75 6c 64 20   #       should 
5e00: 62 65 20 6c 6f 63 61 74 65 64 2e 20 20 42 79 20  be located.  By 
5e10: 64 65 66 61 75 6c 74 2c 20 74 68 69 73 20 6a 75  default, this ju
5e20: 73 74 20 75 73 65 73 20 74 68 65 20 74 65 6d 70  st uses the temp
5e30: 6f 72 61 72 79 0d 0a 20 20 20 20 20 20 23 20 20  orary..      #  
5e40: 20 20 20 20 20 64 69 72 65 63 74 6f 72 79 20 63       directory c
5e50: 6f 6e 66 69 67 75 72 65 64 20 66 6f 72 20 74 68  onfigured for th
5e60: 69 73 20 73 79 73 74 65 6d 2e 0d 0a 20 20 20 20  is system...    
5e70: 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b    #..      if {[
5e80: 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 74 65  info exists ::te
5e90: 6d 70 6f 72 61 72 79 5f 64 69 72 65 63 74 6f 72  mporary_director
5ea0: 79 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20  y] && \..       
5eb0: 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74     [string lengt
5ec0: 68 20 24 3a 3a 74 65 6d 70 6f 72 61 72 79 5f 64  h $::temporary_d
5ed0: 69 72 65 63 74 6f 72 79 5d 20 3e 20 30 7d 20 74  irectory] > 0} t
5ee0: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  hen {..        #
5ef0: 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
5f00: 3a 20 54 68 65 20 6c 6f 63 61 74 69 6f 6e 20 6f  : The location o
5f10: 66 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20  f the temporary 
5f20: 64 69 72 65 63 74 6f 72 79 20 68 61 73 20 62 65  directory has be
5f30: 65 6e 20 6f 76 65 72 72 69 64 64 65 6e 3b 0d 0a  en overridden;..
5f40: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
5f50: 74 68 65 72 65 66 6f 72 65 2c 20 75 73 65 20 69  therefore, use i
5f60: 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  t...        #.. 
5f70: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 3a         return $:
5f80: 3a 74 65 6d 70 6f 72 61 72 79 5f 64 69 72 65 63  :temporary_direc
5f90: 74 6f 72 79 0d 0a 20 20 20 20 20 20 7d 20 65 6c  tory..      } el
5fa0: 73 65 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73  seif {[info exis
5fb0: 74 73 20 3a 3a 73 63 72 61 74 63 68 5f 64 69 72  ts ::scratch_dir
5fc0: 65 63 74 6f 72 79 5d 20 26 26 20 5c 0d 0a 20 20  ectory] && \..  
5fd0: 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20          [string 
5fe0: 6c 65 6e 67 74 68 20 24 3a 3a 73 63 72 61 74 63  length $::scratc
5ff0: 68 5f 64 69 72 65 63 74 6f 72 79 5d 20 3e 20 30  h_directory] > 0
6000: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
6010: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
6020: 4f 54 45 3a 20 54 68 65 20 6c 6f 63 61 74 69 6f  OTE: The locatio
6030: 6e 20 6f 66 20 74 68 65 20 73 63 72 61 74 63 68  n of the scratch
6040: 20 64 69 72 65 63 74 6f 72 79 20 68 61 73 20 62   directory has b
6050: 65 65 6e 20 6f 76 65 72 72 69 64 64 65 6e 3b 0d  een overridden;.
6060: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
6070: 20 74 68 65 72 65 66 6f 72 65 2c 20 75 73 65 20   therefore, use 
6080: 69 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  it...        #..
6090: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 24          return $
60a0: 3a 3a 73 63 72 61 74 63 68 5f 64 69 72 65 63 74  ::scratch_direct
60b0: 6f 72 79 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73  ory..      } els
60c0: 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 72 65 74  e {..        ret
60d0: 75 72 6e 20 5b 67 65 74 54 65 6d 70 6f 72 61 72  urn [getTemporar
60e0: 79 50 61 74 68 5d 0d 0a 20 20 20 20 20 20 7d 0d  yPath]..      }.
60f0: 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70  .    }.....    p
6100: 72 6f 63 20 67 65 74 54 65 73 74 4f 76 65 72 72  roc getTestOverr
6110: 69 64 65 73 50 72 65 61 6d 62 6c 65 20 7b 20 7b  idesPreamble { {
6120: 65 78 74 72 61 56 61 72 4e 61 6d 65 73 20 22 22  extraVarNames ""
6130: 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 73 65 74  } } {..      set
6140: 20 76 61 72 4e 61 6d 65 73 20 5b 6c 69 73 74 5d   varNames [list]
6150: 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  ....      #..   
6160: 20 20 20 23 20 4e 4f 54 45 3a 20 49 66 20 61 76     # NOTE: If av
6170: 61 69 6c 61 62 6c 65 2c 20 73 74 61 72 74 20 77  ailable, start w
6180: 69 74 68 20 74 68 65 20 6d 61 73 74 65 72 20 6c  ith the master l
6190: 69 73 74 20 6f 66 20 74 65 73 74 20 6f 76 65 72  ist of test over
61a0: 72 69 64 65 0d 0a 20 20 20 20 20 20 23 20 20 20  ride..      #   
61b0: 20 20 20 20 76 61 72 69 61 62 6c 65 73 2e 0d 0a      variables...
61c0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69        #..      i
61d0: 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20  f {[info exists 
61e0: 3a 3a 74 65 73 74 5f 6f 76 65 72 72 69 64 65 73  ::test_overrides
61f0: 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20  ] && \..        
6200: 20 20 5b 6c 6c 65 6e 67 74 68 20 24 3a 3a 74 65    [llength $::te
6210: 73 74 5f 6f 76 65 72 72 69 64 65 73 5d 20 3e 20  st_overrides] > 
6220: 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
6230: 20 20 20 65 76 61 6c 20 6c 61 70 70 65 6e 64 20     eval lappend 
6240: 76 61 72 4e 61 6d 65 73 20 24 3a 3a 74 65 73 74  varNames $::test
6250: 5f 6f 76 65 72 72 69 64 65 73 0d 0a 20 20 20 20  _overrides..    
6260: 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a    }....      #..
6270: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 66        # NOTE: If
6280: 20 72 65 71 75 65 73 74 65 64 20 62 79 20 6f 75   requested by ou
6290: 72 20 63 61 6c 6c 65 72 2c 20 61 64 64 20 61 6e  r caller, add an
62a0: 79 20 61 64 64 69 74 69 6f 6e 61 6c 20 76 61 72  y additional var
62b0: 69 61 62 6c 65 0d 0a 20 20 20 20 20 20 23 20 20  iable..      #  
62c0: 20 20 20 20 20 6e 61 6d 65 73 20 74 6f 20 63 6f       names to co
62d0: 70 79 20 6e 6f 77 2e 0d 0a 20 20 20 20 20 20 23  py now...      #
62e0: 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 6c 6c 65  ..      if {[lle
62f0: 6e 67 74 68 20 24 65 78 74 72 61 56 61 72 4e 61  ngth $extraVarNa
6300: 6d 65 73 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b  mes] > 0} then {
6310: 0d 0a 20 20 20 20 20 20 20 20 65 76 61 6c 20 6c  ..        eval l
6320: 61 70 70 65 6e 64 20 76 61 72 4e 61 6d 65 73 20  append varNames 
6330: 24 65 78 74 72 61 56 61 72 4e 61 6d 65 73 0d 0a  $extraVarNames..
6340: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
6350: 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
6360: 3a 20 42 75 69 6c 64 20 74 68 65 20 73 63 72 69  : Build the scri
6370: 70 74 20 66 72 61 67 6d 65 6e 74 20 74 6f 20 62  pt fragment to b
6380: 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 70 72  e returned by pr
6390: 6f 63 65 73 73 69 6e 67 20 65 61 63 68 0d 0a 20  ocessing each.. 
63a0: 20 20 20 20 20 23 20 20 20 20 20 20 20 76 61 72       #       var
63b0: 69 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64 20 61  iable name and a
63c0: 64 64 69 6e 67 20 74 68 65 20 6e 65 63 65 63 65  dding the necece
63d0: 73 73 61 72 79 20 73 63 72 69 70 74 20 66 72 61  ssary script fra
63e0: 67 6d 65 6e 74 73 20 66 6f 72 0d 0a 20 20 20 20  gments for..    
63f0: 20 20 23 20 20 20 20 20 20 20 65 61 63 68 20 6f    #       each o
6400: 6e 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  ne...      #..  
6410: 20 20 20 20 73 65 74 20 72 65 73 75 6c 74 20 22      set result "
6420: 22 0d 0a 0d 0a 20 20 20 20 20 20 66 6f 72 65 61  "....      forea
6430: 63 68 20 76 61 72 4e 61 6d 65 20 24 76 61 72 4e  ch varName $varN
6440: 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20 20 20  ames {..        
6450: 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
6460: 45 3a 20 42 75 69 6c 64 20 74 68 65 20 71 75 61  E: Build the qua
6470: 6c 69 66 69 65 64 20 67 6c 6f 62 61 6c 20 76 61  lified global va
6480: 72 69 61 62 6c 65 20 6e 61 6d 65 2e 0d 0a 20 20  riable name...  
6490: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
64a0: 20 73 65 74 20 66 75 6c 6c 56 61 72 4e 61 6d 65   set fullVarName
64b0: 20 5b 61 70 70 65 6e 64 41 72 67 73 20 3a 3a 20   [appendArgs :: 
64c0: 24 76 61 72 4e 61 6d 65 5d 0d 0a 0d 0a 20 20 20  $varName]....   
64d0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
64e0: 23 20 4e 4f 54 45 3a 20 44 6f 65 73 20 74 68 65  # NOTE: Does the
64f0: 20 76 61 72 69 61 62 6c 65 20 65 78 69 73 74 20   variable exist 
6500: 69 6e 20 74 68 69 73 20 69 6e 74 65 72 70 72 65  in this interpre
6510: 74 65 72 20 63 6f 6e 74 65 78 74 3f 0d 0a 20 20  ter context?..  
6520: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
6530: 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74   if {[info exist
6540: 73 20 24 66 75 6c 6c 56 61 72 4e 61 6d 65 5d 7d  s $fullVarName]}
6550: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
6560: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
6570: 23 20 4e 4f 54 45 3a 20 41 70 70 65 6e 64 20 61  # NOTE: Append a
6580: 20 73 63 72 69 70 74 20 66 72 61 67 6d 65 6e 74   script fragment
6590: 20 74 6f 20 74 68 65 20 72 65 73 75 6c 74 20 74   to the result t
65a0: 68 61 74 20 77 69 6c 6c 20 63 6f 72 72 65 63 74  hat will correct
65b0: 6c 79 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20  ly..          # 
65c0: 20 20 20 20 20 20 63 6f 70 79 20 61 6e 79 20 63        copy any c
65d0: 6f 6e 74 61 69 6e 65 64 20 76 61 6c 75 65 20 74  ontained value t
65e0: 6f 20 61 6e 6f 74 68 65 72 20 69 6e 74 65 72 70  o another interp
65f0: 72 65 74 65 72 20 63 6f 6e 74 65 78 74 2e 0d 0a  reter context...
6600: 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
6610: 20 20 20 20 20 20 20 61 70 70 65 6e 64 20 72 65         append re
6620: 73 75 6c 74 20 5c 6e 20 22 73 65 74 20 22 20 24  sult \n "set " $
6630: 66 75 6c 6c 56 61 72 4e 61 6d 65 20 22 20 5c 7b  fullVarName " \{
6640: 22 20 5b 73 65 74 20 24 66 75 6c 6c 56 61 72 4e  " [set $fullVarN
6650: 61 6d 65 5d 20 5c 7d 0d 0a 20 20 20 20 20 20 20  ame] \}..       
6660: 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20   }..      }.... 
6670: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
6680: 4e 4f 54 45 3a 20 49 66 20 74 68 65 20 72 65 73  NOTE: If the res
6690: 75 6c 74 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65  ult contains one
66a0: 20 6f 72 20 6d 6f 72 65 20 73 63 72 69 70 74 20   or more script 
66b0: 66 72 61 67 6d 65 6e 74 73 2c 20 61 70 70 65 6e  fragments, appen
66c0: 64 20 61 0d 0a 20 20 20 20 20 20 23 20 20 20 20  d a..      #    
66d0: 20 20 20 6e 65 77 6c 69 6e 65 2e 0d 0a 20 20 20     newline...   
66e0: 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
66f0: 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
6700: 72 65 73 75 6c 74 5d 20 3e 20 30 7d 20 74 68 65  result] > 0} the
6710: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 61 70 70  n {..        app
6720: 65 6e 64 20 72 65 73 75 6c 74 20 5c 6e 0d 0a 20  end result \n.. 
6730: 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
6740: 72 65 74 75 72 6e 20 24 72 65 73 75 6c 74 0d 0a  return $result..
6750: 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
6760: 6f 63 20 67 65 74 41 70 70 44 6f 6d 61 69 6e 50  oc getAppDomainP
6770: 72 65 61 6d 62 6c 65 20 7b 20 7b 70 72 65 66 69  reamble { {prefi
6780: 78 20 22 22 7d 20 7b 73 75 66 66 69 78 20 22 22  x ""} {suffix ""
6790: 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a  } } {..      #..
67a0: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68        # NOTE: Th
67b0: 69 73 20 70 72 6f 63 65 64 75 72 65 20 72 65 74  is procedure ret
67c0: 75 72 6e 73 20 61 20 74 65 73 74 20 73 65 74 75  urns a test setu
67d0: 70 20 73 63 72 69 70 74 20 66 72 61 67 6d 65 6e  p script fragmen
67e0: 74 20 73 75 69 74 61 62 6c 65 20 66 6f 72 0d 0a  t suitable for..
67f0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 65 76        #       ev
6800: 61 6c 75 61 74 69 6f 6e 20 62 79 20 61 6e 20 69  aluation by an i
6810: 6e 74 65 72 70 72 65 74 65 72 20 63 72 65 61 74  nterpreter creat
6820: 65 64 20 69 6e 20 61 6e 20 69 73 6f 6c 61 74 65  ed in an isolate
6830: 64 20 61 70 70 6c 69 63 61 74 69 6f 6e 0d 0a 20  d application.. 
6840: 20 20 20 20 20 23 20 20 20 20 20 20 20 64 6f 6d       #       dom
6850: 61 69 6e 2e 20 20 54 68 65 20 73 63 72 69 70 74  ain.  The script
6860: 20 66 72 61 67 6d 65 6e 74 20 62 65 69 6e 67 20   fragment being 
6870: 72 65 74 75 72 6e 65 64 20 77 69 6c 6c 20 62 65  returned will be
6880: 20 73 75 72 72 6f 75 6e 64 65 64 20 62 79 0d 0a   surrounded by..
6890: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68        #       th
68a0: 65 20 70 72 65 66 69 78 20 61 6e 64 20 73 75 66  e prefix and suf
68b0: 66 69 78 20 22 73 63 72 69 70 74 20 66 72 61 67  fix "script frag
68c0: 6d 65 6e 74 73 22 20 73 70 65 63 69 66 69 65 64  ments" specified
68d0: 20 62 79 20 6f 75 72 20 63 61 6c 6c 65 72 2c 0d   by our caller,.
68e0: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 69  .      #       i
68f0: 66 20 61 6e 79 2e 20 20 54 68 65 20 65 6e 74 69  f any.  The enti
6900: 72 65 20 73 63 72 69 70 74 20 62 65 69 6e 67 20  re script being 
6910: 72 65 74 75 72 6e 65 64 20 77 69 6c 6c 20 62 65  returned will be
6920: 20 73 75 62 73 74 69 74 75 74 65 64 20 76 69 61   substituted via
6930: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
6940: 5b 73 75 62 73 74 5d 2c 20 69 6e 20 74 68 65 20  [subst], in the 
6950: 63 6f 6e 74 65 78 74 20 6f 66 20 6f 75 72 20 63  context of our c
6960: 61 6c 6c 65 72 2c 20 62 65 66 6f 72 65 20 62 65  aller, before be
6970: 69 6e 67 20 72 65 74 75 72 6e 65 64 2e 0d 0a 20  ing returned... 
6980: 20 20 20 20 20 23 20 20 20 20 20 20 20 54 68 69       #       Thi
6990: 73 20 73 74 65 70 20 69 73 20 6e 65 63 65 73 73  s step is necess
69a0: 61 72 79 20 73 6f 20 74 68 61 74 20 73 6f 6d 65  ary so that some
69b0: 20 6c 69 6d 69 74 65 64 20 63 6f 6e 74 65 78 74   limited context
69c0: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2c 0d 0a 20   information,.. 
69d0: 20 20 20 20 20 23 20 20 20 20 20 20 20 70 72 69       #       pri
69e0: 6d 61 72 69 6c 79 20 72 65 6c 61 74 65 64 20 74  marily related t
69f0: 6f 20 74 68 65 20 74 65 73 74 69 6e 67 20 64 69  o the testing di
6a00: 72 65 63 74 6f 72 69 65 73 2c 20 63 61 6e 20 62  rectories, can b
6a10: 65 20 74 72 61 6e 73 66 65 72 72 65 64 0d 0a 20  e transferred.. 
6a20: 20 20 20 20 20 23 20 20 20 20 20 20 20 74 6f 20       #       to 
6a30: 74 68 65 20 69 6e 74 65 72 70 72 65 74 65 72 20  the interpreter 
6a40: 69 6e 20 74 68 65 20 69 73 6f 6c 61 74 65 64 20  in the isolated 
6a50: 61 70 70 6c 69 63 61 74 69 6f 6e 20 64 6f 6d 61  application doma
6a60: 69 6e 2c 20 6d 61 6b 69 6e 67 20 69 74 0d 0a 20  in, making it.. 
6a70: 20 20 20 20 20 23 20 20 20 20 20 20 20 61 62 6c       #       abl
6a80: 65 20 74 6f 20 73 75 63 63 65 73 73 66 75 6c 6c  e to successfull
6a90: 79 20 72 75 6e 20 74 65 73 74 73 20 74 68 61 74  y run tests that
6aa0: 20 72 65 71 75 69 72 65 20 6f 6e 65 20 6f 72 20   require one or 
6ab0: 6d 6f 72 65 20 6f 66 20 74 68 65 0d 0a 20 20 20  more of the..   
6ac0: 20 20 20 23 20 20 20 20 20 20 20 66 69 6c 65 73     #       files
6ad0: 20 69 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 74   in one of the t
6ae0: 65 73 74 69 6e 67 20 64 69 72 65 63 74 6f 72 69  esting directori
6af0: 65 73 2e 20 20 43 61 6c 6c 65 72 73 20 73 68 6f  es.  Callers sho
6b00: 75 6c 64 20 6b 65 65 70 20 69 6e 0d 0a 20 20 20  uld keep in..   
6b10: 20 20 20 23 20 20 20 20 20 20 20 6d 69 6e 64 20     #       mind 
6b20: 74 68 61 74 20 74 68 65 20 74 65 73 74 20 73 63  that the test sc
6b30: 72 69 70 74 20 66 72 61 67 6d 65 6e 74 20 62 65  ript fragment be
6b40: 69 6e 67 20 72 65 74 75 72 6e 65 64 20 63 61 6e  ing returned can
6b50: 6e 6f 74 20 72 65 6c 79 20 6f 6e 0d 0a 20 20 20  not rely on..   
6b60: 20 20 20 23 20 20 20 20 20 20 20 61 6e 79 20 73     #       any s
6b70: 63 72 69 70 74 20 6c 69 62 72 61 72 79 20 70 72  cript library pr
6b80: 6f 63 65 64 75 72 65 73 20 74 68 61 74 20 61 72  ocedures that ar
6b90: 65 20 6e 6f 74 20 70 72 6f 76 69 64 65 64 20 62  e not provided b
6ba0: 79 20 74 68 65 20 45 61 67 6c 65 0d 0a 20 20 20  y the Eagle..   
6bb0: 20 20 20 23 20 20 20 20 20 20 20 6c 69 62 72 61     #       libra
6bc0: 72 79 20 70 61 63 6b 61 67 65 20 28 69 2e 65 2e  ry package (i.e.
6bd0: 20 22 69 6e 69 74 2e 65 61 67 6c 65 22 29 2c 20   "init.eagle"), 
6be0: 69 6e 63 6c 75 64 69 6e 67 20 74 68 6f 73 65 20  including those 
6bf0: 70 72 6f 76 69 64 65 64 20 62 79 0d 0a 20 20 20  provided by..   
6c00: 20 20 20 23 20 20 20 20 20 20 20 74 68 65 20 45     #       the E
6c10: 61 67 6c 65 20 74 65 73 74 20 70 61 63 6b 61 67  agle test packag
6c20: 65 2c 20 75 6e 6c 65 73 73 20 74 68 65 20 66 69  e, unless the fi
6c30: 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  le containing th
6c40: 65 6d 20 69 73 20 6c 6f 61 64 65 64 0d 0a 20 20  em is loaded..  
6c50: 20 20 20 20 23 20 20 20 20 20 20 20 6d 61 6e 75      #       manu
6c60: 61 6c 6c 79 20 76 69 61 20 73 6f 6d 65 20 6f 74  ally via some ot
6c70: 68 65 72 20 6d 65 63 68 61 6e 69 73 6d 20 28 65  her mechanism (e
6c80: 2e 67 2e 20 62 79 20 69 6e 63 6c 75 64 69 6e 67  .g. by including
6c90: 20 61 70 70 72 6f 70 72 69 61 74 65 0d 0a 20 20   appropriate..  
6ca0: 20 20 20 20 23 20 20 20 20 20 20 20 5b 70 61 63      #       [pac
6cb0: 6b 61 67 65 20 72 65 71 75 69 72 65 5d 20 6f 72  kage require] or
6cc0: 20 5b 73 6f 75 72 63 65 5d 20 63 6f 6d 6d 61 6e   [source] comman
6cd0: 64 73 20 69 6e 20 74 68 65 20 70 72 65 66 69 78  ds in the prefix
6ce0: 20 6f 72 20 73 75 66 66 69 78 0d 0a 20 20 20 20   or suffix..    
6cf0: 20 20 23 20 20 20 20 20 20 20 73 63 72 69 70 74    #       script
6d00: 20 66 72 61 67 6d 65 6e 74 73 29 2e 20 20 41 6c   fragments).  Al
6d10: 73 6f 2c 20 61 6c 6c 20 76 61 72 69 61 62 6c 65  so, all variable
6d20: 20 72 65 66 65 72 65 6e 63 65 73 20 61 6e 64 20   references and 
6d30: 61 6c 6c 20 6e 65 73 74 65 64 0d 0a 20 20 20 20  all nested..    
6d40: 20 20 23 20 20 20 20 20 20 20 63 6f 6d 6d 61 6e    #       comman
6d50: 64 73 20 28 69 2e 65 2e 20 74 68 6f 73 65 20 69  ds (i.e. those i
6d60: 6e 20 73 71 75 61 72 65 20 62 72 61 63 6b 65 74  n square bracket
6d70: 73 29 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20  s) contained in 
6d80: 74 68 65 20 66 69 6e 61 6c 0d 0a 20 20 20 20 20  the final..     
6d90: 20 23 20 20 20 20 20 20 20 73 63 72 69 70 74 20   #       script 
6da0: 66 72 61 67 6d 65 6e 74 20 77 69 6c 6c 20 65 6e  fragment will en
6db0: 64 20 75 70 20 62 65 69 6e 67 20 65 76 61 6c 75  d up being evalu
6dc0: 61 74 65 64 20 69 6e 20 74 68 65 20 63 6f 6e 74  ated in the cont
6dd0: 65 78 74 20 6f 66 20 74 68 65 0d 0a 20 20 20 20  ext of the..    
6de0: 20 20 23 20 20 20 20 20 20 20 63 61 6c 6c 69 6e    #       callin
6df0: 67 20 69 6e 74 65 72 70 72 65 74 65 72 20 61 6e  g interpreter an
6e00: 64 20 6e 6f 74 20 74 68 65 20 74 61 72 67 65 74  d not the target
6e10: 20 69 6e 74 65 72 70 72 65 74 65 72 20 63 72 65   interpreter cre
6e20: 61 74 65 64 20 69 6e 20 74 68 65 0d 0a 20 20 20  ated in the..   
6e30: 20 20 20 23 20 20 20 20 20 20 20 69 73 6f 6c 61     #       isola
6e40: 74 65 64 20 61 70 70 6c 69 63 61 74 69 6f 6e 20  ted application 
6e50: 64 6f 6d 61 69 6e 20 75 6e 6c 65 73 73 20 74 68  domain unless th
6e60: 65 20 64 6f 6c 6c 61 72 20 73 69 67 6e 73 20 61  e dollar signs a
6e70: 6e 64 2f 6f 72 20 73 71 75 61 72 65 0d 0a 20 20  nd/or square..  
6e80: 20 20 20 20 23 20 20 20 20 20 20 20 62 72 61 63      #       brac
6e90: 6b 65 74 73 20 61 72 65 20 73 70 65 63 69 61 6c  kets are special
6ea0: 6c 79 20 71 75 6f 74 65 64 20 77 69 74 68 20 62  ly quoted with b
6eb0: 61 63 6b 73 6c 61 73 68 65 73 2e 0d 0a 20 20 20  ackslashes...   
6ec0: 20 20 20 23 0d 0a 20 20 20 20 20 20 72 65 74 75     #..      retu
6ed0: 72 6e 20 5b 75 70 6c 65 76 65 6c 20 31 20 5b 6c  rn [uplevel 1 [l
6ee0: 69 73 74 20 73 75 62 73 74 20 5b 61 70 70 65 6e  ist subst [appen
6ef0: 64 41 72 67 73 20 24 70 72 65 66 69 78 20 7b 0d  dArgs $prefix {.
6f00: 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 68 61  .        if {[ha
6f10: 73 52 75 6e 74 69 6d 65 4f 70 74 69 6f 6e 20 6e  sRuntimeOption n
6f20: 61 74 69 76 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a  ative]} then {..
6f30: 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74            object
6f40: 20 69 6e 76 6f 6b 65 20 49 6e 74 65 72 70 72 65   invoke Interpre
6f50: 74 65 72 2e 47 65 74 41 63 74 69 76 65 20 41 64  ter.GetActive Ad
6f60: 64 52 75 6e 74 69 6d 65 4f 70 74 69 6f 6e 20 6e  dRuntimeOption n
6f70: 61 74 69 76 65 0d 0a 20 20 20 20 20 20 20 20 7d  ative..        }
6f80: 0d 0a 20 20 20 20 20 20 7d 20 5b 67 65 74 54 65  ..      } [getTe
6f90: 73 74 4f 76 65 72 72 69 64 65 73 50 72 65 61 6d  stOverridesPream
6fa0: 62 6c 65 20 5b 6c 69 73 74 20 70 61 74 68 20 74  ble [list path t
6fb0: 65 73 74 5f 63 68 61 6e 6e 65 6c 5d 5d 20 24 73  est_channel]] $s
6fc0: 75 66 66 69 78 5d 5d 5d 0d 0a 20 20 20 20 7d 0d  uffix]]]..    }.
6fd0: 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 74 72 79  ....    proc try
6fe0: 43 6f 70 79 42 69 6e 61 72 79 46 69 6c 65 20 7b  CopyBinaryFile {
6ff0: 20 66 69 6c 65 4e 61 6d 65 20 7b 6e 65 77 46 69   fileName {newFi
7000: 6c 65 4e 61 6d 65 20 22 22 7d 20 7d 20 7b 0d 0a  leName ""} } {..
7010: 20 20 20 20 20 20 73 65 74 20 73 6f 75 72 63 65        set source
7020: 46 69 6c 65 4e 61 6d 65 20 5b 67 65 74 42 69 6e  FileName [getBin
7030: 61 72 79 46 69 6c 65 4e 61 6d 65 20 24 66 69 6c  aryFileName $fil
7040: 65 4e 61 6d 65 5d 0d 0a 0d 0a 20 20 20 20 20 20  eName]....      
7050: 69 66 20 7b 21 5b 66 69 6c 65 20 65 78 69 73 74  if {![file exist
7060: 73 20 24 73 6f 75 72 63 65 46 69 6c 65 4e 61 6d  s $sourceFileNam
7070: 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  e]} then {..    
7080: 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
7090: 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e  t_channel [appen
70a0: 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
70b0: 20 20 20 20 20 22 2d 2d 2d 2d 20 73 6b 69 70 70       "---- skipp
70c0: 65 64 20 63 6f 70 79 69 6e 67 20 62 69 6e 61 72  ed copying binar
70d0: 79 20 66 69 6c 65 20 5c 22 22 20 24 73 6f 75 72  y file \"" $sour
70e0: 63 65 46 69 6c 65 4e 61 6d 65 20 5c 0d 0a 20 20  ceFileName \..  
70f0: 20 20 20 20 20 20 20 20 20 20 22 5c 22 2c 20 69            "\", i
7100: 74 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74  t does not exist
7110: 5c 6e 22 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  \n"]....        
7120: 72 65 74 75 72 6e 0d 0a 20 20 20 20 20 20 7d 0d  return..      }.
7130: 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 73 74  ...      if {[st
7140: 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 6e 65 77  ring length $new
7150: 46 69 6c 65 4e 61 6d 65 5d 20 3e 20 30 7d 20 74  FileName] > 0} t
7160: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 73  hen {..        s
7170: 65 74 20 74 61 72 67 65 74 46 69 6c 65 4e 61 6d  et targetFileNam
7180: 65 20 5b 67 65 74 42 75 69 6c 64 46 69 6c 65 4e  e [getBuildFileN
7190: 61 6d 65 20 24 6e 65 77 46 69 6c 65 4e 61 6d 65  ame $newFileName
71a0: 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20  ]..      } else 
71b0: 7b 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 74  {..        set t
71c0: 61 72 67 65 74 46 69 6c 65 4e 61 6d 65 20 5b 67  argetFileName [g
71d0: 65 74 42 75 69 6c 64 46 69 6c 65 4e 61 6d 65 20  etBuildFileName 
71e0: 24 66 69 6c 65 4e 61 6d 65 5d 0d 0a 20 20 20 20  $fileName]..    
71f0: 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20    }....      if 
7200: 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20  {[catch {..     
7210: 20 20 20 20 20 20 20 20 20 66 69 6c 65 20 63 6f           file co
7220: 70 79 20 2d 66 6f 72 63 65 20 24 73 6f 75 72 63  py -force $sourc
7230: 65 46 69 6c 65 4e 61 6d 65 20 24 74 61 72 67 65  eFileName $targe
7240: 74 46 69 6c 65 4e 61 6d 65 7d 5d 20 3d 3d 20 30  tFileName}] == 0
7250: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
7260: 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
7270: 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
7280: 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
7290: 20 20 20 22 2d 2d 2d 2d 20 63 6f 70 69 65 64 20     "---- copied 
72a0: 62 69 6e 61 72 79 20 66 69 6c 65 20 66 72 6f 6d  binary file from
72b0: 20 5c 22 22 20 24 73 6f 75 72 63 65 46 69 6c 65   \"" $sourceFile
72c0: 4e 61 6d 65 20 22 5c 22 20 74 6f 20 5c 22 22 20  Name "\" to \"" 
72d0: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 24  \..            $
72e0: 74 61 72 67 65 74 46 69 6c 65 4e 61 6d 65 20 5c  targetFileName \
72f0: 22 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c  "\n]..      } el
7300: 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70  se {..        tp
7310: 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  uts $::test_chan
7320: 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
7330: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22  \..            "
7340: 2d 2d 2d 2d 20 66 61 69 6c 65 64 20 74 6f 20 63  ---- failed to c
7350: 6f 70 79 20 62 69 6e 61 72 79 20 66 69 6c 65 20  opy binary file 
7360: 66 72 6f 6d 20 5c 22 22 20 24 73 6f 75 72 63 65  from \"" $source
7370: 46 69 6c 65 4e 61 6d 65 20 5c 0d 0a 20 20 20 20  FileName \..    
7380: 20 20 20 20 20 20 20 20 22 5c 22 20 74 6f 20 5c          "\" to \
7390: 22 22 20 24 74 61 72 67 65 74 46 69 6c 65 4e 61  "" $targetFileNa
73a0: 6d 65 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20  me \"\n]..      
73b0: 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  }..    }.....   
73c0: 20 70 72 6f 63 20 74 72 79 43 6f 70 79 42 75 69   proc tryCopyBui
73d0: 6c 64 46 69 6c 65 20 7b 20 66 69 6c 65 4e 61 6d  ldFile { fileNam
73e0: 65 20 7b 6e 65 77 46 69 6c 65 4e 61 6d 65 20 22  e {newFileName "
73f0: 22 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 73 65  "} } {..      se
7400: 74 20 73 6f 75 72 63 65 46 69 6c 65 4e 61 6d 65  t sourceFileName
7410: 20 5b 67 65 74 42 75 69 6c 64 46 69 6c 65 4e 61   [getBuildFileNa
7420: 6d 65 20 24 66 69 6c 65 4e 61 6d 65 5d 0d 0a 0d  me $fileName]...
7430: 0a 20 20 20 20 20 20 69 66 20 7b 21 5b 66 69 6c  .      if {![fil
7440: 65 20 65 78 69 73 74 73 20 24 73 6f 75 72 63 65  e exists $source
7450: 46 69 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20  FileName]} then 
7460: 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73  {..        tputs
7470: 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
7480: 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
7490: 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
74a0: 2d 20 73 6b 69 70 70 65 64 20 63 6f 70 79 69 6e  - skipped copyin
74b0: 67 20 62 75 69 6c 64 20 66 69 6c 65 20 5c 22 22  g build file \""
74c0: 20 24 73 6f 75 72 63 65 46 69 6c 65 4e 61 6d 65   $sourceFileName
74d0: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
74e0: 22 5c 22 2c 20 69 74 20 64 6f 65 73 20 6e 6f 74  "\", it does not
74f0: 20 65 78 69 73 74 5c 6e 22 5d 0d 0a 0d 0a 20 20   exist\n"]....  
7500: 20 20 20 20 20 20 72 65 74 75 72 6e 0d 0a 20 20        return..  
7510: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 69      }....      i
7520: 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74  f {[string lengt
7530: 68 20 24 6e 65 77 46 69 6c 65 4e 61 6d 65 5d 20  h $newFileName] 
7540: 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  > 0} then {..   
7550: 20 20 20 20 20 73 65 74 20 74 61 72 67 65 74 46       set targetF
7560: 69 6c 65 4e 61 6d 65 20 5b 67 65 74 42 69 6e 61  ileName [getBina
7570: 72 79 46 69 6c 65 4e 61 6d 65 20 24 6e 65 77 46  ryFileName $newF
7580: 69 6c 65 4e 61 6d 65 5d 0d 0a 20 20 20 20 20 20  ileName]..      
7590: 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
75a0: 20 20 73 65 74 20 74 61 72 67 65 74 46 69 6c 65    set targetFile
75b0: 4e 61 6d 65 20 5b 67 65 74 42 69 6e 61 72 79 46  Name [getBinaryF
75c0: 69 6c 65 4e 61 6d 65 20 24 66 69 6c 65 4e 61 6d  ileName $fileNam
75d0: 65 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  e]..      }.... 
75e0: 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20       if {[catch 
75f0: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
7600: 20 66 69 6c 65 20 63 6f 70 79 20 2d 66 6f 72 63   file copy -forc
7610: 65 20 24 73 6f 75 72 63 65 46 69 6c 65 4e 61 6d  e $sourceFileNam
7620: 65 20 24 74 61 72 67 65 74 46 69 6c 65 4e 61 6d  e $targetFileNam
7630: 65 7d 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b  e}] == 0} then {
7640: 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20  ..        tputs 
7650: 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
7660: 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
7670: 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
7680: 20 63 6f 70 69 65 64 20 62 75 69 6c 64 20 66 69   copied build fi
7690: 6c 65 20 66 72 6f 6d 20 5c 22 22 20 24 73 6f 75  le from \"" $sou
76a0: 72 63 65 46 69 6c 65 4e 61 6d 65 20 22 5c 22 20  rceFileName "\" 
76b0: 74 6f 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20  to \"" \..      
76c0: 20 20 20 20 20 20 24 74 61 72 67 65 74 46 69 6c        $targetFil
76d0: 65 4e 61 6d 65 20 5c 22 5c 6e 5d 0d 0a 20 20 20  eName \"\n]..   
76e0: 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
76f0: 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
7700: 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
7710: 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
7720: 20 20 20 20 20 20 22 2d 2d 2d 2d 20 66 61 69 6c        "---- fail
7730: 65 64 20 74 6f 20 63 6f 70 79 20 62 75 69 6c 64  ed to copy build
7740: 20 66 69 6c 65 20 66 72 6f 6d 20 5c 22 22 20 24   file from \"" $
7750: 73 6f 75 72 63 65 46 69 6c 65 4e 61 6d 65 20 5c  sourceFileName \
7760: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 5c  ..            "\
7770: 22 20 74 6f 20 5c 22 22 20 24 74 61 72 67 65 74  " to \"" $target
7780: 46 69 6c 65 4e 61 6d 65 20 5c 22 5c 6e 5d 0d 0a  FileName \"\n]..
7790: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a        }..    }..
77a0: 0c 0d 0a 20 20 20 20 70 72 6f 63 20 74 72 79 44  ...    proc tryD
77b0: 65 6c 65 74 65 42 69 6e 61 72 79 46 69 6c 65 20  eleteBinaryFile 
77c0: 7b 20 66 69 6c 65 4e 61 6d 65 20 7d 20 7b 0d 0a  { fileName } {..
77d0: 20 20 20 20 20 20 73 65 74 20 66 69 6c 65 4e 61        set fileNa
77e0: 6d 65 20 5b 67 65 74 42 69 6e 61 72 79 46 69 6c  me [getBinaryFil
77f0: 65 4e 61 6d 65 20 24 66 69 6c 65 4e 61 6d 65 5d  eName $fileName]
7800: 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 21 5b  ....      if {![
7810: 66 69 6c 65 20 65 78 69 73 74 73 20 24 66 69 6c  file exists $fil
7820: 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a  eName]} then {..
7830: 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
7840: 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61  :test_channel [a
7850: 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
7860: 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 73           "---- s
7870: 6b 69 70 70 65 64 20 64 65 6c 65 74 69 6e 67 20  kipped deleting 
7880: 62 69 6e 61 72 79 20 66 69 6c 65 20 5c 22 22 20  binary file \"" 
7890: 24 66 69 6c 65 4e 61 6d 65 20 5c 0d 0a 20 20 20  $fileName \..   
78a0: 20 20 20 20 20 20 20 20 20 22 5c 22 2c 20 69 74           "\", it
78b0: 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 5c   does not exist\
78c0: 6e 22 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 72  n"]....        r
78d0: 65 74 75 72 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a  eturn..      }..
78e0: 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74  ..      if {[cat
78f0: 63 68 20 7b 66 69 6c 65 20 64 65 6c 65 74 65 20  ch {file delete 
7900: 24 66 69 6c 65 4e 61 6d 65 7d 5d 20 3d 3d 20 30  $fileName}] == 0
7910: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
7920: 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
7930: 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
7940: 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
7950: 20 20 20 22 2d 2d 2d 2d 20 64 65 6c 65 74 65 64     "---- deleted
7960: 20 62 69 6e 61 72 79 20 66 69 6c 65 20 5c 22 22   binary file \""
7970: 20 24 66 69 6c 65 4e 61 6d 65 20 5c 22 5c 6e 5d   $fileName \"\n]
7980: 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b  ..      } else {
7990: 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20  ..        tputs 
79a0: 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
79b0: 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
79c0: 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
79d0: 20 66 61 69 6c 65 64 20 74 6f 20 64 65 6c 65 74   failed to delet
79e0: 65 20 62 69 6e 61 72 79 20 66 69 6c 65 20 5c 22  e binary file \"
79f0: 22 20 24 66 69 6c 65 4e 61 6d 65 20 5c 22 5c 6e  " $fileName \"\n
7a00: 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  ]..      }..    
7a10: 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 74  }.....    proc t
7a20: 72 79 44 65 6c 65 74 65 42 75 69 6c 64 46 69 6c  ryDeleteBuildFil
7a30: 65 20 7b 20 66 69 6c 65 4e 61 6d 65 20 7d 20 7b  e { fileName } {
7a40: 0d 0a 20 20 20 20 20 20 73 65 74 20 66 69 6c 65  ..      set file
7a50: 4e 61 6d 65 20 5b 67 65 74 42 75 69 6c 64 46 69  Name [getBuildFi
7a60: 6c 65 4e 61 6d 65 20 24 66 69 6c 65 4e 61 6d 65  leName $fileName
7a70: 5d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 21  ]....      if {!
7a80: 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24 66 69  [file exists $fi
7a90: 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d  leName]} then {.
7aa0: 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24  .        tputs $
7ab0: 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b  ::test_channel [
7ac0: 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
7ad0: 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
7ae0: 73 6b 69 70 70 65 64 20 64 65 6c 65 74 69 6e 67  skipped deleting
7af0: 20 62 75 69 6c 64 20 66 69 6c 65 20 5c 22 22 20   build file \"" 
7b00: 24 66 69 6c 65 4e 61 6d 65 20 5c 0d 0a 20 20 20  $fileName \..   
7b10: 20 20 20 20 20 20 20 20 20 22 5c 22 2c 20 69 74           "\", it
7b20: 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 5c   does not exist\
7b30: 6e 22 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 72  n"]....        r
7b40: 65 74 75 72 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a  eturn..      }..
7b50: 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74  ..      if {[cat
7b60: 63 68 20 7b 66 69 6c 65 20 64 65 6c 65 74 65 20  ch {file delete 
7b70: 24 66 69 6c 65 4e 61 6d 65 7d 5d 20 3d 3d 20 30  $fileName}] == 0
7b80: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
7b90: 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
7ba0: 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
7bb0: 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
7bc0: 20 20 20 22 2d 2d 2d 2d 20 64 65 6c 65 74 65 64     "---- deleted
7bd0: 20 62 75 69 6c 64 20 66 69 6c 65 20 5c 22 22 20   build file \"" 
7be0: 24 66 69 6c 65 4e 61 6d 65 20 5c 22 5c 6e 5d 0d  $fileName \"\n].
7bf0: 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d  .      } else {.
7c00: 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24  .        tputs $
7c10: 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b  ::test_channel [
7c20: 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
7c30: 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
7c40: 66 61 69 6c 65 64 20 74 6f 20 64 65 6c 65 74 65  failed to delete
7c50: 20 62 75 69 6c 64 20 66 69 6c 65 20 5c 22 22 20   build file \"" 
7c60: 24 66 69 6c 65 4e 61 6d 65 20 5c 22 5c 6e 5d 0d  $fileName \"\n].
7c70: 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d  .      }..    }.
7c80: 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 74 72 79  ....    proc try
7c90: 43 6f 70 79 41 73 73 65 6d 62 6c 79 20 7b 20 66  CopyAssembly { f
7ca0: 69 6c 65 4e 61 6d 65 20 7b 70 64 62 20 74 72 75  ileName {pdb tru
7cb0: 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 74 72  e} } {..      tr
7cc0: 79 43 6f 70 79 42 75 69 6c 64 46 69 6c 65 20 24  yCopyBuildFile $
7cd0: 66 69 6c 65 4e 61 6d 65 0d 0a 0d 0a 20 20 20 20  fileName....    
7ce0: 20 20 69 66 20 7b 24 70 64 62 7d 20 74 68 65 6e    if {$pdb} then
7cf0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 72 79 43   {..        tryC
7d00: 6f 70 79 42 75 69 6c 64 46 69 6c 65 20 5b 61 70  opyBuildFile [ap
7d10: 70 65 6e 64 41 72 67 73 20 5b 66 69 6c 65 20 72  pendArgs [file r
7d20: 6f 6f 74 6e 61 6d 65 20 24 66 69 6c 65 4e 61 6d  ootname $fileNam
7d30: 65 5d 20 2e 70 64 62 5d 0d 0a 20 20 20 20 20 20  e] .pdb]..      
7d40: 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  }..    }.....   
7d50: 20 70 72 6f 63 20 74 72 79 44 65 6c 65 74 65 41   proc tryDeleteA
7d60: 73 73 65 6d 62 6c 79 20 7b 20 66 69 6c 65 4e 61  ssembly { fileNa
7d70: 6d 65 20 7b 70 64 62 20 74 72 75 65 7d 20 7d 20  me {pdb true} } 
7d80: 7b 0d 0a 20 20 20 20 20 20 74 72 79 44 65 6c 65  {..      tryDele
7d90: 74 65 42 69 6e 61 72 79 46 69 6c 65 20 24 66 69  teBinaryFile $fi
7da0: 6c 65 4e 61 6d 65 0d 0a 0d 0a 20 20 20 20 20 20  leName....      
7db0: 69 66 20 7b 24 70 64 62 7d 20 74 68 65 6e 20 7b  if {$pdb} then {
7dc0: 0d 0a 20 20 20 20 20 20 20 20 74 72 79 44 65 6c  ..        tryDel
7dd0: 65 74 65 42 69 6e 61 72 79 46 69 6c 65 20 5b 61  eteBinaryFile [a
7de0: 70 70 65 6e 64 41 72 67 73 20 5b 66 69 6c 65 20  ppendArgs [file 
7df0: 72 6f 6f 74 6e 61 6d 65 20 24 66 69 6c 65 4e 61  rootname $fileNa
7e00: 6d 65 5d 20 2e 70 64 62 5d 0d 0a 20 20 20 20 20  me] .pdb]..     
7e10: 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20   }..    }.....  
7e20: 20 20 70 72 6f 63 20 74 72 79 4c 6f 61 64 41 73    proc tryLoadAs
7e30: 73 65 6d 62 6c 79 20 7b 20 66 69 6c 65 4e 61 6d  sembly { fileNam
7e40: 65 20 7d 20 7b 0d 0a 20 20 20 20 20 20 73 65 74  e } {..      set
7e50: 20 66 69 6c 65 4e 61 6d 65 20 5b 67 65 74 42 69   fileName [getBi
7e60: 6e 61 72 79 46 69 6c 65 4e 61 6d 65 20 24 66 69  naryFileName $fi
7e70: 6c 65 4e 61 6d 65 5d 0d 0a 0d 0a 20 20 20 20 20  leName]....     
7e80: 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 73 65 74   if {[catch {set
7e90: 20 61 73 73 65 6d 62 6c 79 20 5c 0d 0a 20 20 20   assembly \..   
7ea0: 20 20 20 20 20 20 20 20 20 20 20 5b 6f 62 6a 65             [obje
7eb0: 63 74 20 6c 6f 61 64 20 2d 6c 6f 61 64 74 79 70  ct load -loadtyp
7ec0: 65 20 46 69 6c 65 20 2d 61 6c 69 61 73 20 24 66  e File -alias $f
7ed0: 69 6c 65 4e 61 6d 65 5d 7d 5d 20 3d 3d 20 30 7d  ileName]}] == 0}
7ee0: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
7ef0: 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
7f00: 54 45 3a 20 4e 6f 77 2c 20 61 64 64 20 74 68 65  TE: Now, add the
7f10: 20 6e 65 63 65 73 73 61 72 79 20 74 65 73 74 20   necessary test 
7f20: 63 6f 6e 73 74 72 61 69 6e 74 2e 0d 0a 20 20 20  constraint...   
7f30: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
7f40: 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 5b 66  addConstraint [f
7f50: 69 6c 65 20 72 6f 6f 74 6e 61 6d 65 20 5b 66 69  ile rootname [fi
7f60: 6c 65 20 74 61 69 6c 20 24 66 69 6c 65 4e 61 6d  le tail $fileNam
7f70: 65 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23  e]]....        #
7f80: 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
7f90: 3a 20 47 72 61 62 20 74 68 65 20 69 6d 61 67 65  : Grab the image
7fa0: 20 72 75 6e 74 69 6d 65 20 76 65 72 73 69 6f 6e   runtime version
7fb0: 20 66 72 6f 6d 20 74 68 65 20 61 73 73 65 6d 62   from the assemb
7fc0: 6c 79 20 62 65 63 61 75 73 65 0d 0a 20 20 20 20  ly because..    
7fd0: 20 20 20 20 23 20 20 20 20 20 20 20 73 65 76 65      #       seve
7fe0: 72 61 6c 20 74 65 73 74 73 20 72 65 6c 79 20 6f  ral tests rely o
7ff0: 6e 20 69 74 20 68 61 76 69 6e 67 20 61 20 63 65  n it having a ce
8000: 72 74 61 69 6e 20 76 61 6c 75 65 2e 0d 0a 20 20  rtain value...  
8010: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
8020: 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 5b   addConstraint [
8030: 61 70 70 65 6e 64 41 72 67 73 20 5b 66 69 6c 65  appendArgs [file
8040: 20 74 61 69 6c 20 24 66 69 6c 65 4e 61 6d 65 5d   tail $fileName]
8050: 20 5f 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20   _ \..          
8060: 20 20 5b 24 61 73 73 65 6d 62 6c 79 20 49 6d 61    [$assembly Ima
8070: 67 65 52 75 6e 74 69 6d 65 56 65 72 73 69 6f 6e  geRuntimeVersion
8080: 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d  ]]....        #.
8090: 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
80a0: 20 52 65 74 75 72 6e 20 74 68 65 20 66 75 6c 6c   Return the full
80b0: 20 70 61 74 68 20 6f 66 20 74 68 65 20 6c 6f 61   path of the loa
80c0: 64 65 64 20 66 69 6c 65 2e 0d 0a 20 20 20 20 20  ded file...     
80d0: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65     #..        re
80e0: 74 75 72 6e 20 24 66 69 6c 65 4e 61 6d 65 0d 0a  turn $fileName..
80f0: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
8100: 20 72 65 74 75 72 6e 20 22 22 0d 0a 20 20 20 20   return ""..    
8110: 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 69  }.....    proc i
8120: 73 53 51 4c 69 74 65 52 65 61 64 79 20 7b 7d 20  sSQLiteReady {} 
8130: 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  {..      #..    
8140: 20 20 23 20 4e 4f 54 45 3a 20 54 68 69 73 20 70    # NOTE: This p
8150: 72 6f 63 65 64 75 72 65 20 6d 75 73 74 20 72 65  rocedure must re
8160: 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 6f 6e  turn non-zero on
8170: 6c 79 20 69 66 20 74 68 65 20 53 51 4c 69 74 65  ly if the SQLite
8180: 20 6e 61 74 69 76 65 0d 0a 20 20 20 20 20 20 23   native..      #
8190: 20 20 20 20 20 20 20 6c 69 62 72 61 72 79 20 61         library a
81a0: 6e 64 20 74 68 65 20 53 79 73 74 65 6d 2e 44 61  nd the System.Da
81b0: 74 61 2e 53 51 4c 69 74 65 20 6d 61 6e 61 67 65  ta.SQLite manage
81c0: 64 20 61 73 73 65 6d 62 6c 79 20 61 72 65 20 6c  d assembly are l
81d0: 6f 61 64 65 64 0d 0a 20 20 20 20 20 20 23 20 20  oaded..      #  
81e0: 20 20 20 20 20 61 6e 64 20 72 65 61 64 79 20 66       and ready f
81f0: 6f 72 20 75 73 65 20 62 79 20 74 68 65 20 74 65  or use by the te
8200: 73 74 20 73 75 69 74 65 2e 20 20 43 75 72 72 65  st suite.  Curre
8210: 6e 74 6c 79 2c 20 74 68 69 73 20 70 72 6f 63 65  ntly, this proce
8220: 64 75 72 65 0d 0a 20 20 20 20 20 20 23 20 20 20  dure..      #   
8230: 20 20 20 20 73 68 6f 75 6c 64 20 62 65 20 63 61      should be ca
8240: 6c 6c 65 64 20 6f 6e 6c 79 20 61 66 74 65 72 20  lled only after 
8250: 74 68 65 20 5b 74 72 79 4c 6f 61 64 41 73 73 65  the [tryLoadAsse
8260: 6d 62 6c 79 5d 20 70 72 6f 63 65 64 75 72 65 20  mbly] procedure 
8270: 68 61 73 0d 0a 20 20 20 20 20 20 23 20 20 20 20  has..      #    
8280: 20 20 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 74     been called t
8290: 6f 20 70 72 6f 62 65 20 66 6f 72 20 74 68 65 20  o probe for the 
82a0: 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
82b0: 74 65 20 6d 61 6e 61 67 65 64 20 61 73 73 65 6d  te managed assem
82c0: 62 6c 79 0d 0a 20 20 20 20 20 20 23 20 20 20 20  bly..      #    
82d0: 20 20 20 61 6e 64 20 74 68 65 20 5b 63 68 65 63     and the [chec
82e0: 6b 46 6f 72 53 51 4c 69 74 65 5d 20 70 72 6f 63  kForSQLite] proc
82f0: 65 64 75 72 65 20 68 61 73 20 62 65 65 6e 20 63  edure has been c
8300: 61 6c 6c 65 64 20 74 6f 20 70 72 6f 62 65 20 66  alled to probe f
8310: 6f 72 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  or..      #     
8320: 20 20 74 68 65 20 53 51 4c 69 74 65 20 6e 61 74    the SQLite nat
8330: 69 76 65 20 6c 69 62 72 61 72 79 3b 20 6f 74 68  ive library; oth
8340: 65 72 77 69 73 65 2c 20 74 68 69 73 20 70 72 6f  erwise, this pro
8350: 63 65 64 75 72 65 20 77 69 6c 6c 20 73 69 6d 70  cedure will simp
8360: 6c 79 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  ly..      #     
8370: 20 20 61 6c 77 61 79 73 20 72 65 74 75 72 6e 20    always return 
8380: 7a 65 72 6f 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  zero...      #..
8390: 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b 65 78        return [ex
83a0: 70 72 20 7b 5b 68 61 76 65 43 6f 6e 73 74 72 61  pr {[haveConstra
83b0: 69 6e 74 20 53 79 73 74 65 6d 2e 44 61 74 61 2e  int System.Data.
83c0: 53 51 4c 69 74 65 5d 20 26 26 20 5c 0d 0a 20 20  SQLite] && \..  
83d0: 20 20 20 20 20 20 20 20 5b 68 61 76 65 43 6f 6e          [haveCon
83e0: 73 74 72 61 69 6e 74 20 53 51 4c 69 74 65 5d 7d  straint SQLite]}
83f0: 5d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  ]..    }.....   
8400: 20 70 72 6f 63 20 6d 61 74 63 68 4d 61 63 68 69   proc matchMachi
8410: 6e 65 20 7b 20 70 6c 61 74 66 6f 72 6d 20 7d 20  ne { platform } 
8420: 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  {..      #..    
8430: 20 20 23 20 4e 4f 54 45 3a 20 41 6e 20 65 6d 70    # NOTE: An emp
8440: 74 79 20 73 74 72 69 6e 67 20 66 6f 72 20 74 68  ty string for th
8450: 65 20 70 6c 61 74 66 6f 72 6d 20 6d 65 61 6e 73  e platform means
8460: 20 74 68 61 74 20 74 68 65 20 62 75 69 6c 64 20   that the build 
8470: 69 73 20 6e 6f 74 0d 0a 20 20 20 20 20 20 23 20  is not..      # 
8480: 20 20 20 20 20 20 5b 70 72 69 6d 61 72 69 6c 79        [primarily
8490: 5d 20 61 20 6e 61 74 69 76 65 20 62 75 69 6c 64  ] a native build
84a0: 3b 20 74 68 65 72 65 66 6f 72 65 2c 20 69 74 20  ; therefore, it 
84b0: 61 6c 77 61 79 73 20 6d 61 74 63 68 65 73 2e 0d  always matches..
84c0: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
84d0: 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67  if {[string leng
84e0: 74 68 20 24 70 6c 61 74 66 6f 72 6d 5d 20 3d 3d  th $platform] ==
84f0: 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
8500: 20 20 20 20 72 65 74 75 72 6e 20 74 72 75 65 0d      return true.
8510: 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
8520: 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
8530: 45 3a 20 44 6f 65 73 20 74 68 65 20 73 70 65 63  E: Does the spec
8540: 69 66 69 65 64 20 70 6c 61 74 66 6f 72 6d 20 6d  ified platform m
8550: 61 74 63 68 20 75 70 20 74 6f 20 74 68 65 20 63  atch up to the c
8560: 75 72 72 65 6e 74 20 70 72 6f 63 65 73 73 3f 0d  urrent process?.
8570: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
8580: 69 66 20 7b 24 70 6c 61 74 66 6f 72 6d 20 65 71  if {$platform eq
8590: 20 5b 6d 61 63 68 69 6e 65 54 6f 50 6c 61 74 66   [machineToPlatf
85a0: 6f 72 6d 20 24 3a 3a 74 63 6c 5f 70 6c 61 74 66  orm $::tcl_platf
85b0: 6f 72 6d 28 6d 61 63 68 69 6e 65 29 5d 7d 20 74  orm(machine)]} t
85c0: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 72  hen {..        r
85d0: 65 74 75 72 6e 20 74 72 75 65 0d 0a 20 20 20 20  eturn true..    
85e0: 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a    }....      #..
85f0: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68        # NOTE: Th
8600: 65 20 73 70 65 63 69 66 69 65 64 20 70 6c 61 74  e specified plat
8610: 66 6f 72 6d 20 64 6f 65 73 20 6e 6f 74 20 6d 61  form does not ma
8620: 74 63 68 20 75 70 20 77 69 74 68 20 74 68 65 20  tch up with the 
8630: 70 6c 61 74 66 6f 72 6d 0d 0a 20 20 20 20 20 20  platform..      
8640: 23 20 20 20 20 20 20 20 66 6f 72 20 74 68 65 20  #       for the 
8650: 63 75 72 72 65 6e 74 20 70 72 6f 63 65 73 73 2e  current process.
8660: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
8670: 20 72 65 74 75 72 6e 20 66 61 6c 73 65 0d 0a 20   return false.. 
8680: 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
8690: 63 20 63 68 65 63 6b 46 6f 72 53 51 4c 69 74 65  c checkForSQLite
86a0: 42 75 69 6c 64 73 20 7b 20 63 68 61 6e 6e 65 6c  Builds { channel
86b0: 20 7b 73 65 6c 65 63 74 20 66 61 6c 73 65 7d 20   {select false} 
86c0: 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  } {..      #..  
86d0: 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68 65 63      # NOTE: Chec
86e0: 6b 20 66 6f 72 20 65 76 65 72 79 20 70 6f 73 73  k for every poss
86f0: 69 62 6c 65 20 76 61 6c 69 64 20 63 6f 6d 62 69  ible valid combi
8700: 6e 61 74 69 6f 6e 20 6f 66 20 76 61 6c 75 65 73  nation of values
8710: 20 75 73 65 64 20 77 68 65 6e 0d 0a 20 20 20 20   used when..    
8720: 20 20 23 20 20 20 20 20 20 20 6c 6f 63 61 74 69    #       locati
8730: 6e 67 20 6f 75 74 20 74 68 65 20 62 75 69 6c 64  ng out the build
8740: 20 6f 75 74 70 75 74 20 64 69 72 65 63 74 6f 72   output director
8750: 79 2c 20 73 68 6f 77 69 6e 67 20 65 61 63 68 20  y, showing each 
8760: 61 76 61 69 6c 61 62 6c 65 0d 0a 20 20 20 20 20  available..     
8770: 20 23 20 20 20 20 20 20 20 62 75 69 6c 64 20 76   #       build v
8780: 61 72 69 61 74 69 6f 6e 20 61 6c 6f 6e 67 20 74  ariation along t
8790: 68 65 20 77 61 79 2e 0d 0a 20 20 20 20 20 20 23  he way...      #
87a0: 0d 0a 20 20 20 20 20 20 66 6f 72 65 61 63 68 20  ..      foreach 
87b0: 6e 61 74 69 76 65 20 5b 6c 69 73 74 20 66 61 6c  native [list fal
87c0: 73 65 20 74 72 75 65 5d 20 7b 0d 0a 20 20 20 20  se true] {..    
87d0: 20 20 20 20 66 6f 72 65 61 63 68 20 79 65 61 72      foreach year
87e0: 20 5b 67 65 74 42 75 69 6c 64 59 65 61 72 73 5d   [getBuildYears]
87f0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 66 6f   {..          fo
8800: 72 65 61 63 68 20 63 6f 6e 66 69 67 75 72 61 74  reach configurat
8810: 69 6f 6e 20 5b 67 65 74 42 75 69 6c 64 43 6f 6e  ion [getBuildCon
8820: 66 69 67 75 72 61 74 69 6f 6e 73 5d 20 7b 0d 0a  figurations] {..
8830: 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20              #.. 
8840: 20 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54             # NOT
8850: 45 3a 20 46 69 67 75 72 65 20 6f 75 74 20 74 68  E: Figure out th
8860: 65 20 65 66 66 65 63 74 69 76 65 20 62 75 69 6c  e effective buil
8870: 64 20 70 6c 61 74 66 6f 72 6d 2e 20 20 54 68 69  d platform.  Thi
8880: 73 20 69 73 0d 0a 20 20 20 20 20 20 20 20 20 20  s is..          
8890: 20 20 23 20 20 20 20 20 20 20 62 61 73 65 64 20    #       based 
88a0: 6f 6e 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  on whether or no
88b0: 74 20 61 20 5b 70 72 69 6d 61 72 69 6c 79 5d 20  t a [primarily] 
88c0: 6e 61 74 69 76 65 20 62 75 69 6c 64 0d 0a 20 20  native build..  
88d0: 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20            #     
88e0: 20 20 69 73 20 62 65 69 6e 67 20 75 73 65 64 2e    is being used.
88f0: 20 20 46 6f 72 20 5b 70 72 69 6d 61 72 69 6c 79    For [primarily
8900: 5d 20 6e 6f 6e 2d 6e 61 74 69 76 65 20 62 75 69  ] non-native bui
8910: 6c 64 73 2c 0d 0a 20 20 20 20 20 20 20 20 20 20  lds,..          
8920: 20 20 23 20 20 20 20 20 20 20 74 68 69 73 20 77    #       this w
8930: 69 6c 6c 20 62 65 20 61 6e 20 65 6d 70 74 79 20  ill be an empty 
8940: 73 74 72 69 6e 67 2e 0d 0a 20 20 20 20 20 20 20  string...       
8950: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
8960: 20 20 20 20 73 65 74 20 70 6c 61 74 66 6f 72 6d      set platform
8970: 20 5b 67 65 74 42 75 69 6c 64 50 6c 61 74 66 6f   [getBuildPlatfo
8980: 72 6d 20 24 6e 61 74 69 76 65 5d 0d 0a 0d 0a 20  rm $native].... 
8990: 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
89a0: 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e   $channel [appen
89b0: 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
89c0: 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63           "---- c
89d0: 68 65 63 6b 69 6e 67 20 66 6f 72 20 53 79 73 74  hecking for Syst
89e0: 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 20 62  em.Data.SQLite b
89f0: 75 69 6c 64 20 5c 22 22 20 5b 65 78 70 72 20 5c  uild \"" [expr \
8a00: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
8a10: 20 20 7b 24 6e 61 74 69 76 65 20 3f 20 22 6e 61    {$native ? "na
8a20: 74 69 76 65 2f 22 20 3a 20 22 22 7d 5d 20 5b 65  tive/" : ""}] [e
8a30: 78 70 72 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e  xpr {[string len
8a40: 67 74 68 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  gth \..         
8a50: 20 20 20 20 20 20 20 24 70 6c 61 74 66 6f 72 6d         $platform
8a60: 5d 20 3e 20 30 20 3f 20 5b 61 70 70 65 6e 64 41  ] > 0 ? [appendA
8a70: 72 67 73 20 24 70 6c 61 74 66 6f 72 6d 20 2f 5d  rgs $platform /]
8a80: 20 3a 20 22 22 7d 5d 20 24 79 65 61 72 20 5c 0d   : ""}] $year \.
8a90: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
8aa0: 20 2f 20 24 63 6f 6e 66 69 67 75 72 61 74 69 6f   / $configuratio
8ab0: 6e 20 22 5c 22 2e 2e 2e 20 22 5d 0d 0a 0d 0a 20  n "\"... "].... 
8ac0: 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
8ad0: 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45            # NOTE
8ae0: 3a 20 42 75 69 6c 64 20 74 68 65 20 66 75 6c 6c  : Build the full
8af0: 79 20 71 75 61 6c 69 66 69 65 64 20 64 69 72 65  y qualified dire
8b00: 63 74 6f 72 79 20 77 68 65 72 65 20 74 68 65 20  ctory where the 
8b10: 6e 65 63 65 73 73 61 72 79 0d 0a 20 20 20 20 20  necessary..     
8b20: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63         #       c
8b30: 6f 6d 70 6f 6e 65 6e 74 73 20 66 6f 72 20 53 79  omponents for Sy
8b40: 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
8b50: 20 73 68 6f 75 6c 64 20 62 65 20 66 6f 75 6e 64   should be found
8b60: 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23  ...            #
8b70: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 65  ..            se
8b80: 74 20 64 69 72 65 63 74 6f 72 79 20 5b 6a 6f 69  t directory [joi
8b90: 6e 42 75 69 6c 64 44 69 72 65 63 74 6f 72 79 20  nBuildDirectory 
8ba0: 24 6e 61 74 69 76 65 20 5c 0d 0a 20 20 20 20 20  $native \..     
8bb0: 20 20 20 20 20 20 20 20 20 20 20 5b 67 65 74 42             [getB
8bc0: 75 69 6c 64 42 61 73 65 44 69 72 65 63 74 6f 72  uildBaseDirector
8bd0: 79 5d 20 24 79 65 61 72 20 24 70 6c 61 74 66 6f  y] $year $platfo
8be0: 72 6d 20 24 63 6f 6e 66 69 67 75 72 61 74 69 6f  rm $configuratio
8bf0: 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  n]....          
8c00: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20    #..           
8c10: 20 23 20 4e 4f 54 45 3a 20 44 6f 20 74 68 65 20   # NOTE: Do the 
8c20: 6e 65 63 65 73 73 61 72 79 20 66 69 6c 65 73 20  necessary files 
8c30: 65 78 69 73 74 3f 20 20 43 75 72 72 65 6e 74 6c  exist?  Currentl
8c40: 79 2c 20 6e 6f 20 6f 74 68 65 72 20 73 74 65 70  y, no other step
8c50: 73 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23  s..            #
8c60: 20 20 20 20 20 20 20 61 72 65 20 74 61 6b 65 6e         are taken
8c70: 20 74 6f 20 76 65 72 69 66 79 20 74 68 69 73 20   to verify this 
8c80: 62 75 69 6c 64 20 69 73 20 61 63 74 75 61 6c 6c  build is actuall
8c90: 79 20 76 69 61 62 6c 65 2e 0d 0a 20 20 20 20 20  y viable...     
8ca0: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
8cb0: 20 20 20 20 20 20 69 66 20 7b 5b 69 73 42 75 69        if {[isBui
8cc0: 6c 64 41 76 61 69 6c 61 62 6c 65 20 24 6e 61 74  ldAvailable $nat
8cd0: 69 76 65 20 24 64 69 72 65 63 74 6f 72 79 5d 7d  ive $directory]}
8ce0: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
8cf0: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
8d00: 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
8d10: 57 68 65 6e 20 69 6e 20 22 73 65 6c 65 63 74 22  When in "select"
8d20: 20 6d 6f 64 65 2c 20 61 75 74 6f 6d 61 74 69 63   mode, automatic
8d30: 61 6c 6c 79 20 73 65 6c 65 63 74 20 74 68 65 20  ally select the 
8d40: 66 69 72 73 74 0d 0a 20 20 20 20 20 20 20 20 20  first..         
8d50: 20 20 20 20 20 23 20 20 20 20 20 20 20 61 76 61       #       ava
8d60: 69 6c 61 62 6c 65 20 62 75 69 6c 64 20 6f 66 20  ilable build of 
8d70: 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
8d80: 74 65 20 61 6e 64 20 74 68 65 6e 20 72 65 74 75  te and then retu
8d90: 72 6e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  rn..            
8da0: 20 20 23 20 20 20 20 20 20 20 69 6d 6d 65 64 69    #       immedi
8db0: 61 74 65 6c 79 2e 0d 0a 20 20 20 20 20 20 20 20  ately...        
8dc0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
8dd0: 20 20 20 20 20 20 20 69 66 20 7b 24 73 65 6c 65         if {$sele
8de0: 63 74 20 26 26 20 5b 6d 61 74 63 68 4d 61 63 68  ct && [matchMach
8df0: 69 6e 65 20 24 70 6c 61 74 66 6f 72 6d 5d 7d 20  ine $platform]} 
8e00: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
8e10: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
8e20: 20 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54             # NOT
8e30: 45 3a 20 4d 61 6e 75 61 6c 6c 79 20 6f 76 65 72  E: Manually over
8e40: 72 69 64 65 20 61 6c 6c 20 74 68 65 20 62 75 69  ride all the bui
8e50: 6c 64 20 64 69 72 65 63 74 6f 72 79 20 73 65 6c  ld directory sel
8e60: 65 63 74 69 6f 6e 0d 0a 20 20 20 20 20 20 20 20  ection..        
8e70: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
8e80: 72 65 6c 61 74 65 64 20 74 65 73 74 20 73 65 74  related test set
8e90: 74 69 6e 67 73 20 69 6e 20 6f 72 64 65 72 20 74  tings in order t
8ea0: 6f 20 66 6f 72 63 65 20 74 68 69 73 20 62 75 69  o force this bui
8eb0: 6c 64 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ld..            
8ec0: 20 20 20 20 23 20 20 20 20 20 20 20 6f 66 20 53      #       of S
8ed0: 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
8ee0: 65 20 74 6f 20 62 65 20 75 73 65 64 2e 0d 0a 20  e to be used... 
8ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23                 #
8f00: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
8f10: 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20    object invoke 
8f20: 49 6e 74 65 72 70 72 65 74 65 72 2e 47 65 74 41  Interpreter.GetA
8f30: 63 74 69 76 65 20 5b 65 78 70 72 20 7b 24 6e 61  ctive [expr {$na
8f40: 74 69 76 65 20 3f 20 5c 0d 0a 20 20 20 20 20 20  tive ? \..      
8f50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 41                "A
8f60: 64 64 52 75 6e 74 69 6d 65 4f 70 74 69 6f 6e 22  ddRuntimeOption"
8f70: 20 3a 20 22 52 65 6d 6f 76 65 52 75 6e 74 69 6d   : "RemoveRuntim
8f80: 65 4f 70 74 69 6f 6e 22 7d 5d 20 20 6e 61 74 69  eOption"}]  nati
8f90: 76 65 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  ve....          
8fa0: 20 20 20 20 20 20 73 65 74 20 3a 3a 74 65 73 74        set ::test
8fb0: 5f 79 65 61 72 20 24 79 65 61 72 0d 0a 20 20 20  _year $year..   
8fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74               set
8fd0: 20 3a 3a 74 65 73 74 5f 70 6c 61 74 66 6f 72 6d   ::test_platform
8fe0: 20 24 70 6c 61 74 66 6f 72 6d 0d 0a 20 20 20 20   $platform..    
8ff0: 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20              set 
9000: 3a 3a 74 65 73 74 5f 63 6f 6e 66 69 67 75 72 61  ::test_configura
9010: 74 69 6f 6e 20 24 63 6f 6e 66 69 67 75 72 61 74  tion $configurat
9020: 69 6f 6e 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  ion....         
9030: 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
9040: 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
9050: 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
9060: 20 20 20 20 20 20 20 20 20 22 79 65 73 2c 20 73           "yes, s
9070: 65 6c 65 63 74 65 64 20 28 22 20 5b 65 78 70 72  elected (" [expr
9080: 20 7b 24 6e 61 74 69 76 65 20 3f 20 22 6e 61 74   {$native ? "nat
9090: 69 76 65 2f 22 20 3a 20 22 22 7d 5d 20 5c 0d 0a  ive/" : ""}] \..
90a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
90b0: 20 20 20 20 5b 65 78 70 72 20 7b 5b 73 74 72 69      [expr {[stri
90c0: 6e 67 20 6c 65 6e 67 74 68 20 24 70 6c 61 74 66  ng length $platf
90d0: 6f 72 6d 5d 20 3e 20 30 20 3f 20 5b 61 70 70 65  orm] > 0 ? [appe
90e0: 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
90f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 24 70                $p
9100: 6c 61 74 66 6f 72 6d 20 2f 5d 20 3a 20 22 22 7d  latform /] : ""}
9110: 5d 20 24 79 65 61 72 20 2f 20 24 63 6f 6e 66 69  ] $year / $confi
9120: 67 75 72 61 74 69 6f 6e 20 22 29 5c 6e 22 5d 0d  guration ")\n"].
9130: 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
9140: 20 20 20 72 65 74 75 72 6e 20 74 72 75 65 0d 0a     return true..
9150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 20                } 
9160: 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
9170: 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
9180: 68 61 6e 6e 65 6c 20 79 65 73 5c 6e 0d 0a 20 20  hannel yes\n..  
9190: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
91a0: 20 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73             } els
91b0: 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e {..           
91c0: 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
91d0: 6c 20 6e 6f 5c 6e 0d 0a 20 20 20 20 20 20 20 20  l no\n..        
91e0: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
91f0: 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20   }..        }.. 
9200: 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
9210: 72 65 74 75 72 6e 20 66 61 6c 73 65 0d 0a 20 20  return false..  
9220: 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
9230: 20 63 68 65 63 6b 46 6f 72 53 51 4c 69 74 65 52   checkForSQLiteR
9240: 65 6c 65 61 73 65 73 20 7b 20 63 68 61 6e 6e 65  eleases { channe
9250: 6c 20 7b 73 65 6c 65 63 74 20 66 61 6c 73 65 7d  l {select false}
9260: 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20   } {..      #.. 
9270: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68 65       # NOTE: Che
9280: 63 6b 20 66 6f 72 20 70 61 73 74 20 72 65 6c 65  ck for past rele
9290: 61 73 65 73 20 6f 66 20 53 79 73 74 65 6d 2e 44  ases of System.D
92a0: 61 74 61 2e 53 51 4c 69 74 65 20 69 6e 20 74 68  ata.SQLite in th
92b0: 65 20 64 69 72 65 63 74 6f 72 79 0d 0a 20 20 20  e directory..   
92c0: 20 20 20 23 20 20 20 20 20 20 20 63 6f 6e 74 61     #       conta
92d0: 69 6e 65 64 20 69 6e 20 74 68 65 20 22 53 79 73  ined in the "Sys
92e0: 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 22  tem.Data.SQLite"
92f0: 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 20 76 61 72   environment var
9300: 69 61 62 6c 65 2c 20 69 66 0d 0a 20 20 20 20 20  iable, if..     
9310: 20 23 20 20 20 20 20 20 20 70 72 65 73 65 6e 74   #       present
9320: 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
9330: 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73    if {[info exis
9340: 74 73 20 3a 3a 65 6e 76 28 53 79 73 74 65 6d 2e  ts ::env(System.
9350: 44 61 74 61 2e 53 51 4c 69 74 65 29 5d 20 26 26  Data.SQLite)] &&
9360: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 73   \..          [s
9370: 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a  tring length $::
9380: 65 6e 76 28 53 79 73 74 65 6d 2e 44 61 74 61 2e  env(System.Data.
9390: 53 51 4c 69 74 65 29 5d 20 3e 20 30 7d 20 74 68  SQLite)] > 0} th
93a0: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d  en {..        #.
93b0: 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
93c0: 20 42 75 69 6c 64 20 74 68 65 20 66 75 6c 6c 79   Build the fully
93d0: 20 71 75 61 6c 69 66 69 65 64 20 64 69 72 65 63   qualified direc
93e0: 74 6f 72 79 20 77 68 65 72 65 20 74 68 65 20 6e  tory where the n
93f0: 65 63 65 73 73 61 72 79 0d 0a 20 20 20 20 20 20  ecessary..      
9400: 20 20 23 20 20 20 20 20 20 20 63 6f 6d 70 6f 6e    #       compon
9410: 65 6e 74 73 20 66 6f 72 20 53 79 73 74 65 6d 2e  ents for System.
9420: 44 61 74 61 2e 53 51 4c 69 74 65 20 73 68 6f 75  Data.SQLite shou
9430: 6c 64 20 62 65 20 66 6f 75 6e 64 2e 0d 0a 20 20  ld be found...  
9440: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
9450: 20 73 65 74 20 64 69 72 65 63 74 6f 72 79 20 5b   set directory [
9460: 66 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65 20  file nativename 
9470: 5b 66 69 6c 65 20 6a 6f 69 6e 20 5c 0d 0a 20 20  [file join \..  
9480: 20 20 20 20 20 20 20 20 20 20 24 3a 3a 65 6e 76            $::env
9490: 28 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c  (System.Data.SQL
94a0: 69 74 65 29 20 5b 67 65 74 52 65 6c 65 61 73 65  ite) [getRelease
94b0: 56 65 72 73 69 6f 6e 5d 5d 5d 0d 0a 0d 0a 20 20  Version]]]....  
94c0: 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
94d0: 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
94e0: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
94f0: 22 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e 67 20 66  "---- checking f
9500: 6f 72 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53  or System.Data.S
9510: 51 4c 69 74 65 20 72 65 6c 65 61 73 65 20 5c 22  QLite release \"
9520: 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  " \..           
9530: 20 24 64 69 72 65 63 74 6f 72 79 20 22 5c 22 2e   $directory "\".
9540: 2e 2e 20 22 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  .. "]....       
9550: 20 69 66 20 7b 5b 69 73 52 65 6c 65 61 73 65 41   if {[isReleaseA
9560: 76 61 69 6c 61 62 6c 65 20 24 64 69 72 65 63 74  vailable $direct
9570: 6f 72 79 20 70 6c 61 74 66 6f 72 6d 5d 7d 20 74  ory platform]} t
9580: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
9590: 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e   if {[string len
95a0: 67 74 68 20 24 70 6c 61 74 66 6f 72 6d 5d 20 3d  gth $platform] =
95b0: 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  = 0} then {..   
95c0: 20 20 20 20 20 20 20 20 20 73 65 74 20 70 6c 61           set pla
95d0: 74 66 6f 72 6d 20 75 6e 6b 6e 6f 77 6e 0d 0a 20  tform unknown.. 
95e0: 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20           }....  
95f0: 20 20 20 20 20 20 20 20 69 66 20 7b 24 73 65 6c          if {$sel
9600: 65 63 74 20 26 26 20 5b 6d 61 74 63 68 4d 61 63  ect && [matchMac
9610: 68 69 6e 65 20 24 70 6c 61 74 66 6f 72 6d 5d 7d  hine $platform]}
9620: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
9630: 20 20 20 20 20 73 65 74 20 3a 3a 62 75 69 6c 64       set ::build
9640: 5f 64 69 72 65 63 74 6f 72 79 20 24 64 69 72 65  _directory $dire
9650: 63 74 6f 72 79 0d 0a 0d 0a 20 20 20 20 20 20 20  ctory....       
9660: 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
9670: 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
9680: 22 79 65 73 2c 20 73 65 6c 65 63 74 65 64 20 28  "yes, selected (
9690: 22 20 24 70 6c 61 74 66 6f 72 6d 20 22 29 5c 6e  " $platform ")\n
96a0: 22 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  "]....          
96b0: 20 20 72 65 74 75 72 6e 20 74 72 75 65 0d 0a 20    return true.. 
96c0: 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20           } else 
96d0: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  {..            t
96e0: 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61  puts $channel [a
96f0: 70 70 65 6e 64 41 72 67 73 20 22 79 65 73 20 28  ppendArgs "yes (
9700: 22 20 24 70 6c 61 74 66 6f 72 6d 20 22 29 5c 6e  " $platform ")\n
9710: 22 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d  "]..          }.
9720: 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20  .        } else 
9730: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70 75  {..          tpu
9740: 74 73 20 24 63 68 61 6e 6e 65 6c 20 6e 6f 5c 6e  ts $channel no\n
9750: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 66 6f  ....          fo
9760: 72 65 61 63 68 20 70 61 74 68 20 5b 6c 73 6f 72  reach path [lsor
9770: 74 20 2d 64 65 63 72 65 61 73 69 6e 67 20 5b 66  t -decreasing [f
9780: 69 6c 65 20 6c 69 73 74 20 24 64 69 72 65 63 74  ile list $direct
9790: 6f 72 79 20 2a 5d 5d 20 7b 0d 0a 20 20 20 20 20  ory *]] {..     
97a0: 20 20 20 20 20 20 20 69 66 20 7b 5b 66 69 6c 65         if {[file
97b0: 20 65 78 69 73 74 73 20 24 70 61 74 68 5d 20 26   exists $path] &
97c0: 26 20 5b 66 69 6c 65 20 69 73 64 69 72 65 63 74  & [file isdirect
97d0: 6f 72 79 20 24 70 61 74 68 5d 7d 20 74 68 65 6e  ory $path]} then
97e0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
97f0: 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
9800: 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
9810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9820: 20 20 22 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e 67    "---- checking
9830: 20 66 6f 72 20 53 79 73 74 65 6d 2e 44 61 74 61   for System.Data
9840: 2e 53 51 4c 69 74 65 20 72 65 6c 65 61 73 65 20  .SQLite release 
9850: 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  \"" \..         
9860: 20 20 20 20 20 20 20 20 20 24 70 61 74 68 20 22           $path "
9870: 5c 22 2e 2e 2e 20 22 5d 0d 0a 0d 0a 20 20 20 20  \"... "]....    
9880: 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 69            if {[i
9890: 73 52 65 6c 65 61 73 65 41 76 61 69 6c 61 62 6c  sReleaseAvailabl
98a0: 65 20 24 70 61 74 68 20 70 6c 61 74 66 6f 72 6d  e $path platform
98b0: 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
98c0: 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b             if {[
98d0: 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 70  string length $p
98e0: 6c 61 74 66 6f 72 6d 5d 20 3d 3d 20 30 7d 20 74  latform] == 0} t
98f0: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
9900: 20 20 20 20 20 20 20 20 20 73 65 74 20 70 6c 61           set pla
9910: 74 66 6f 72 6d 20 75 6e 6b 6e 6f 77 6e 0d 0a 20  tform unknown.. 
9920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
9930: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
9940: 20 20 20 20 69 66 20 7b 24 73 65 6c 65 63 74 20      if {$select 
9950: 26 26 20 5b 6d 61 74 63 68 4d 61 63 68 69 6e 65  && [matchMachine
9960: 20 24 70 6c 61 74 66 6f 72 6d 5d 7d 20 74 68 65   $platform]} the
9970: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
9980: 20 20 20 20 20 20 20 73 65 74 20 3a 3a 62 75 69         set ::bui
9990: 6c 64 5f 64 69 72 65 63 74 6f 72 79 20 24 70 61  ld_directory $pa
99a0: 74 68 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  th....          
99b0: 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
99c0: 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
99d0: 67 73 20 22 79 65 73 2c 20 73 65 6c 65 63 74 65  gs "yes, selecte
99e0: 64 20 28 22 20 24 70 6c 61 74 66 6f 72 6d 20 22  d (" $platform "
99f0: 29 5c 6e 22 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  )\n"]....       
9a00: 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
9a10: 6e 20 74 72 75 65 0d 0a 20 20 20 20 20 20 20 20  n true..        
9a20: 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b          } else {
9a30: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
9a40: 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
9a50: 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 22  el [appendArgs "
9a60: 79 65 73 20 28 22 20 24 70 6c 61 74 66 6f 72 6d  yes (" $platform
9a70: 20 22 29 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20   ")\n"]..       
9a80: 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
9a90: 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65            } else
9aa0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
9ab0: 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
9ac0: 65 6c 20 6e 6f 5c 6e 0d 0a 20 20 20 20 20 20 20  el no\n..       
9ad0: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
9ae0: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
9af0: 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d     }..        }.
9b00: 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d  .      } else {.
9b10: 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24  .        tputs $
9b20: 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
9b30: 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
9b40: 20 20 20 22 2d 2d 2d 2d 20 65 6e 76 69 72 6f 6e     "---- environ
9b50: 6d 65 6e 74 20 76 61 72 69 61 62 6c 65 20 5c 22  ment variable \"
9b60: 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
9b70: 74 65 5c 22 20 69 73 20 6e 6f 74 20 22 20 5c 0d  te\" is not " \.
9b80: 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 73 65  .            "se
9b90: 74 2c 20 73 6b 69 70 70 69 6e 67 20 63 68 65 63  t, skipping chec
9ba0: 6b 20 66 6f 72 20 72 65 6c 65 61 73 65 73 2e 2e  k for releases..
9bb0: 2e 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a  .\n"]..      }..
9bc0: 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 66  ..      return f
9bd0: 61 6c 73 65 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a  alse..    }.....
9be0: 20 20 20 20 70 72 6f 63 20 63 68 65 63 6b 46 6f      proc checkFo
9bf0: 72 53 51 4c 69 74 65 4c 69 62 72 61 72 79 20 7b  rSQLiteLibrary {
9c00: 20 63 68 61 6e 6e 65 6c 20 7d 20 7b 0d 0a 20 20   channel } {..  
9c10: 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
9c20: 65 6c 20 22 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e  el "---- checkin
9c30: 67 20 66 6f 72 20 53 51 4c 69 74 65 20 63 6f 72  g for SQLite cor
9c40: 65 20 6c 69 62 72 61 72 79 2e 2e 2e 20 22 0d 0a  e library... "..
9c50: 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74  ..      if {[cat
9c60: 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  ch {..          
9c70: 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b      object invok
9c80: 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62  e -flags +NonPub
9c90: 6c 69 63 20 53 79 73 74 65 6d 2e 44 61 74 61 2e  lic System.Data.
9ca0: 53 51 4c 69 74 65 2e 53 51 4c 69 74 65 33 20 5c  SQLite.SQLite3 \
9cb0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
9cc0: 53 51 4c 69 74 65 56 65 72 73 69 6f 6e 7d 20 76  SQLiteVersion} v
9cd0: 65 72 73 69 6f 6e 5d 20 3d 3d 20 30 7d 20 74 68  ersion] == 0} th
9ce0: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d  en {..        #.
9cf0: 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
9d00: 20 43 68 65 63 6b 20 69 66 20 74 68 65 20 72 65   Check if the re
9d10: 74 75 72 6e 65 64 20 76 65 72 73 69 6f 6e 20 77  turned version w
9d20: 61 73 20 6e 75 6c 6c 2e 20 20 49 66 20 73 6f 2c  as null.  If so,
9d30: 20 6d 61 6b 65 20 69 74 20 65 61 73 79 0d 0a 20   make it easy.. 
9d40: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74         #       t
9d50: 6f 20 73 70 6f 74 2e 0d 0a 20 20 20 20 20 20 20  o spot...       
9d60: 20 23 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b   #..        if {
9d70: 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
9d80: 76 65 72 73 69 6f 6e 5d 20 3d 3d 20 30 7d 20 74  version] == 0} t
9d90: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
9da0: 20 73 65 74 20 76 65 72 73 69 6f 6e 20 6e 75 6c   set version nul
9db0: 6c 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  l..        }....
9dc0: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
9dd0: 20 20 20 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d     # NOTE: Attem
9de0: 70 74 20 74 6f 20 71 75 65 72 79 20 74 68 65 20  pt to query the 
9df0: 46 6f 73 73 69 6c 20 73 6f 75 72 63 65 20 69 64  Fossil source id
9e00: 65 6e 74 69 66 69 65 72 20 66 6f 72 20 74 68 65  entifier for the
9e10: 20 53 51 4c 69 74 65 0d 0a 20 20 20 20 20 20 20   SQLite..       
9e20: 20 23 20 20 20 20 20 20 20 63 6f 72 65 20 6c 69   #       core li
9e30: 62 72 61 72 79 2e 0d 0a 20 20 20 20 20 20 20 20  brary...        
9e40: 23 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b  #..        if {[
9e50: 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20  catch {..       
9e60: 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20           object 
9e70: 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e  invoke -flags +N
9e80: 6f 6e 50 75 62 6c 69 63 20 53 79 73 74 65 6d 2e  onPublic System.
9e90: 44 61 74 61 2e 53 51 4c 69 74 65 2e 53 51 4c 69  Data.SQLite.SQLi
9ea0: 74 65 33 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  te3 \..         
9eb0: 20 20 20 20 20 20 20 53 51 4c 69 74 65 53 6f 75         SQLiteSou
9ec0: 72 63 65 49 64 7d 20 73 6f 75 72 63 65 49 64 5d  rceId} sourceId]
9ed0: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
9ee0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
9ef0: 20 23 20 4e 4f 54 45 3a 20 57 65 20 66 61 69 6c   # NOTE: We fail
9f00: 65 64 20 74 6f 20 71 75 65 72 79 20 74 68 65 20  ed to query the 
9f10: 46 6f 73 73 69 6c 20 73 6f 75 72 63 65 20 69 64  Fossil source id
9f20: 65 6e 74 69 66 69 65 72 2e 0d 0a 20 20 20 20 20  entifier...     
9f30: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
9f40: 20 20 73 65 74 20 73 6f 75 72 63 65 49 64 20 75    set sourceId u
9f50: 6e 6b 6e 6f 77 6e 0d 0a 20 20 20 20 20 20 20 20  nknown..        
9f60: 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  }....        #..
9f70: 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
9f80: 43 68 65 63 6b 20 69 66 20 74 68 65 20 72 65 74  Check if the ret
9f90: 75 72 6e 65 64 20 46 6f 73 73 69 6c 20 73 6f 75  urned Fossil sou
9fa0: 72 63 65 20 69 64 65 6e 74 69 66 69 65 72 20 77  rce identifier w
9fb0: 61 73 20 6e 75 6c 6c 2e 20 20 49 66 0d 0a 20 20  as null.  If..  
9fc0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 73 6f        #       so
9fd0: 2c 20 6d 61 6b 65 20 69 74 20 65 61 73 79 20 74  , make it easy t
9fe0: 6f 20 73 70 6f 74 2e 0d 0a 20 20 20 20 20 20 20  o spot...       
9ff0: 20 23 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b   #..        if {
a000: 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
a010: 73 6f 75 72 63 65 49 64 5d 20 3d 3d 20 30 7d 20  sourceId] == 0} 
a020: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
a030: 20 20 73 65 74 20 73 6f 75 72 63 65 49 64 20 6e    set sourceId n
a040: 75 6c 6c 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  ull..        }..
a050: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
a060: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 59 65 73       # NOTE: Yes
a070: 2c 20 74 68 65 20 53 51 4c 69 74 65 20 63 6f 72  , the SQLite cor
a080: 65 20 6c 69 62 72 61 72 79 20 61 70 70 65 61 72  e library appear
a090: 73 20 74 6f 20 62 65 20 61 76 61 69 6c 61 62 6c  s to be availabl
a0a0: 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  e...        #.. 
a0b0: 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72         addConstr
a0c0: 61 69 6e 74 20 53 51 4c 69 74 65 0d 0a 0d 0a 20  aint SQLite.... 
a0d0: 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
a0e0: 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
a0f0: 73 20 22 79 65 73 20 28 22 20 24 76 65 72 73 69  s "yes (" $versi
a100: 6f 6e 20 22 20 22 20 24 73 6f 75 72 63 65 49 64  on " " $sourceId
a110: 20 22 29 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 7d   ")\n"]..      }
a120: 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
a130: 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
a140: 6e 6f 5c 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a 20  no\n..      }.. 
a150: 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
a160: 63 20 63 68 65 63 6b 46 6f 72 53 51 4c 69 74 65  c checkForSQLite
a170: 49 6e 74 65 72 6f 70 20 7b 20 63 68 61 6e 6e 65  Interop { channe
a180: 6c 20 7d 20 7b 0d 0a 20 20 20 20 20 20 74 70 75  l } {..      tpu
a190: 74 73 20 24 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d  ts $channel "---
a1a0: 2d 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 53  - checking for S
a1b0: 51 4c 69 74 65 20 69 6e 74 65 72 6f 70 20 61 73  QLite interop as
a1c0: 73 65 6d 62 6c 79 2e 2e 2e 20 22 0d 0a 0d 0a 20  sembly... ".... 
a1d0: 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20       if {[catch 
a1e0: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
a1f0: 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d   object invoke -
a200: 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63  flags +NonPublic
a210: 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c   System.Data.SQL
a220: 69 74 65 2e 53 51 4c 69 74 65 33 20 5c 0d 0a 20  ite.SQLite3 \.. 
a230: 20 20 20 20 20 20 20 20 20 20 20 20 20 49 6e 74               Int
a240: 65 72 6f 70 56 65 72 73 69 6f 6e 7d 20 76 65 72  eropVersion} ver
a250: 73 69 6f 6e 5d 20 3d 3d 20 30 7d 20 74 68 65 6e  sion] == 0} then
a260: 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20   {..        #.. 
a270: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43         # NOTE: C
a280: 68 65 63 6b 20 69 66 20 74 68 65 20 72 65 74 75  heck if the retu
a290: 72 6e 65 64 20 76 65 72 73 69 6f 6e 20 77 61 73  rned version was
a2a0: 20 6e 75 6c 6c 2e 20 20 49 66 20 73 6f 2c 20 6d   null.  If so, m
a2b0: 61 6b 65 20 69 74 20 65 61 73 79 0d 0a 20 20 20  ake it easy..   
a2c0: 20 20 20 20 20 23 20 20 20 20 20 20 20 74 6f 20       #       to 
a2d0: 73 70 6f 74 2e 0d 0a 20 20 20 20 20 20 20 20 23  spot...        #
a2e0: 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73  ..        if {[s
a2f0: 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 76 65  tring length $ve
a300: 72 73 69 6f 6e 5d 20 3d 3d 20 30 7d 20 74 68 65  rsion] == 0} the
a310: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73  n {..          s
a320: 65 74 20 76 65 72 73 69 6f 6e 20 6e 75 6c 6c 0d  et version null.
a330: 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  .        }....  
a340: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
a350: 20 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74   # NOTE: Attempt
a360: 20 74 6f 20 71 75 65 72 79 20 74 68 65 20 46 6f   to query the Fo
a370: 73 73 69 6c 20 73 6f 75 72 63 65 20 69 64 65 6e  ssil source iden
a380: 74 69 66 69 65 72 20 66 6f 72 20 74 68 65 20 53  tifier for the S
a390: 51 4c 69 74 65 0d 0a 20 20 20 20 20 20 20 20 23  QLite..        #
a3a0: 20 20 20 20 20 20 20 63 6f 72 65 20 6c 69 62 72         core libr
a3b0: 61 72 79 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  ary...        #.
a3c0: 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61  .        if {[ca
a3d0: 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  tch {..         
a3e0: 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e         object in
a3f0: 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e  voke -flags +Non
a400: 50 75 62 6c 69 63 20 53 79 73 74 65 6d 2e 44 61  Public System.Da
a410: 74 61 2e 53 51 4c 69 74 65 2e 53 51 4c 69 74 65  ta.SQLite.SQLite
a420: 33 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  3 \..           
a430: 20 20 20 20 20 49 6e 74 65 72 6f 70 53 6f 75 72       InteropSour
a440: 63 65 49 64 7d 20 73 6f 75 72 63 65 49 64 5d 7d  ceId} sourceId]}
a450: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
a460: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
a470: 23 20 4e 4f 54 45 3a 20 57 65 20 66 61 69 6c 65  # NOTE: We faile
a480: 64 20 74 6f 20 71 75 65 72 79 20 74 68 65 20 46  d to query the F
a490: 6f 73 73 69 6c 20 73 6f 75 72 63 65 20 69 64 65  ossil source ide
a4a0: 6e 74 69 66 69 65 72 2e 0d 0a 20 20 20 20 20 20  ntifier...      
a4b0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
a4c0: 20 73 65 74 20 73 6f 75 72 63 65 49 64 20 75 6e   set sourceId un
a4d0: 6b 6e 6f 77 6e 0d 0a 20 20 20 20 20 20 20 20 7d  known..        }
a4e0: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  ....        #.. 
a4f0: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43         # NOTE: C
a500: 68 65 63 6b 20 69 66 20 74 68 65 20 72 65 74 75  heck if the retu
a510: 72 6e 65 64 20 46 6f 73 73 69 6c 20 73 6f 75 72  rned Fossil sour
a520: 63 65 20 69 64 65 6e 74 69 66 69 65 72 20 77 61  ce identifier wa
a530: 73 20 6e 75 6c 6c 2e 20 20 49 66 0d 0a 20 20 20  s null.  If..   
a540: 20 20 20 20 20 23 20 20 20 20 20 20 20 73 6f 2c       #       so,
a550: 20 6d 61 6b 65 20 69 74 20 65 61 73 79 20 74 6f   make it easy to
a560: 20 73 70 6f 74 2e 0d 0a 20 20 20 20 20 20 20 20   spot...        
a570: 23 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b  #..        if {[
a580: 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 73  string length $s
a590: 6f 75 72 63 65 49 64 5d 20 3d 3d 20 30 7d 20 74  ourceId] == 0} t
a5a0: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
a5b0: 20 73 65 74 20 73 6f 75 72 63 65 49 64 20 6e 75   set sourceId nu
a5c0: 6c 6c 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d  ll..        }...
a5d0: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
a5e0: 20 20 20 20 23 20 4e 4f 54 45 3a 20 59 65 73 2c      # NOTE: Yes,
a5f0: 20 74 68 65 20 53 51 4c 69 74 65 20 69 6e 74 65   the SQLite inte
a600: 72 6f 70 20 61 73 73 65 6d 62 6c 79 20 61 70 70  rop assembly app
a610: 65 61 72 73 20 74 6f 20 62 65 20 61 76 61 69 6c  ears to be avail
a620: 61 62 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20 23  able...        #
a630: 0d 0a 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e  ..        addCon
a640: 73 74 72 61 69 6e 74 20 53 51 4c 69 74 65 49 6e  straint SQLiteIn
a650: 74 65 72 6f 70 0d 0a 0d 0a 20 20 20 20 20 20 20  terop....       
a660: 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
a670: 5b 61 70 70 65 6e 64 41 72 67 73 20 22 79 65 73  [appendArgs "yes
a680: 20 28 22 20 24 76 65 72 73 69 6f 6e 20 22 20 22   (" $version " "
a690: 20 24 73 6f 75 72 63 65 49 64 20 22 29 5c 6e 22   $sourceId ")\n"
a6a0: 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20  ]..      } else 
a6b0: 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73  {..        tputs
a6c0: 20 24 63 68 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d 0a   $channel no\n..
a6d0: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a        }..    }..
a6e0: 0c 0d 0a 20 20 20 20 70 72 6f 63 20 63 68 65 63  ...    proc chec
a6f0: 6b 46 6f 72 53 51 4c 69 74 65 44 65 66 69 6e 65  kForSQLiteDefine
a700: 43 6f 6e 73 74 61 6e 74 20 7b 20 63 68 61 6e 6e  Constant { chann
a710: 65 6c 20 6e 61 6d 65 20 7d 20 7b 0d 0a 20 20 20  el name } {..   
a720: 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
a730: 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
a740: 0a 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d  .          "----
a750: 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 53 79   checking for Sy
a760: 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
a770: 20 64 65 66 69 6e 65 20 63 6f 6e 73 74 61 6e 74   define constant
a780: 20 5c 22 22 20 24 6e 61 6d 65 20 5c 0d 0a 20 20   \"" $name \..  
a790: 20 20 20 20 20 20 20 20 22 5c 22 2e 2e 2e 20 22          "\"... "
a7a0: 5d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b  ]....      if {[
a7b0: 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20  catch {..       
a7c0: 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e         object in
a7d0: 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e  voke -flags +Non
a7e0: 50 75 62 6c 69 63 20 53 79 73 74 65 6d 2e 44 61  Public System.Da
a7f0: 74 61 2e 53 51 4c 69 74 65 2e 53 51 4c 69 74 65  ta.SQLite.SQLite
a800: 33 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  3 \..           
a810: 20 20 20 44 65 66 69 6e 65 43 6f 6e 73 74 61 6e     DefineConstan
a820: 74 73 7d 20 64 65 66 69 6e 65 43 6f 6e 73 74 61  ts} defineConsta
a830: 6e 74 73 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20  nts] == 0} then 
a840: 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b  {..        if {[
a850: 6c 73 65 61 72 63 68 20 2d 65 78 61 63 74 20 2d  lsearch -exact -
a860: 6e 6f 63 61 73 65 20 24 64 65 66 69 6e 65 43 6f  nocase $defineCo
a870: 6e 73 74 61 6e 74 73 20 24 6e 61 6d 65 5d 20 21  nstants $name] !
a880: 3d 20 2d 31 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  = -1} then {..  
a890: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
a8a0: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 59 65 73       # NOTE: Yes
a8b0: 2c 20 74 68 69 73 20 64 65 66 69 6e 65 20 63 6f  , this define co
a8c0: 6e 73 74 61 6e 74 20 77 61 73 20 65 6e 61 62 6c  nstant was enabl
a8d0: 65 64 20 77 68 65 6e 20 74 68 65 20 6d 61 6e 61  ed when the mana
a8e0: 67 65 64 0d 0a 20 20 20 20 20 20 20 20 20 20 23  ged..          #
a8f0: 20 20 20 20 20 20 20 61 73 73 65 6d 62 6c 79 20         assembly 
a900: 77 61 73 20 63 6f 6d 70 69 6c 65 64 2e 0d 0a 20  was compiled... 
a910: 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
a920: 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61        addConstra
a930: 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20  int [appendArgs 
a940: 64 65 66 69 6e 65 43 6f 6e 73 74 61 6e 74 2e 53  defineConstant.S
a950: 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
a960: 65 2e 20 24 6e 61 6d 65 5d 0d 0a 0d 0a 20 20 20  e. $name]....   
a970: 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
a980: 61 6e 6e 65 6c 20 79 65 73 5c 6e 0d 0a 20 20 20  annel yes\n..   
a990: 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
a9a0: 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
a9b0: 63 68 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d 0a 20 20  channel no\n..  
a9c0: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d        }..      }
a9d0: 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
a9e0: 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
a9f0: 65 72 72 6f 72 5c 6e 0d 0a 20 20 20 20 20 20 7d  error\n..      }
aa00: 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
aa10: 70 72 6f 63 20 67 65 74 44 61 74 65 54 69 6d 65  proc getDateTime
aa20: 46 6f 72 6d 61 74 20 7b 7d 20 7b 0d 0a 20 20 20  Format {} {..   
aa30: 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
aa40: 54 45 3a 20 54 68 69 73 20 70 72 6f 63 65 64 75  TE: This procedu
aa50: 72 65 20 73 69 6d 70 6c 79 20 72 65 74 75 72 6e  re simply return
aa60: 73 20 74 68 65 20 22 64 65 66 61 75 6c 74 22 20  s the "default" 
aa70: 44 61 74 65 54 69 6d 65 20 66 6f 72 6d 61 74 20  DateTime format 
aa80: 75 73 65 64 0d 0a 20 20 20 20 20 20 23 20 20 20  used..      #   
aa90: 20 20 20 20 62 79 20 74 68 65 20 74 65 73 74 20      by the test 
aaa0: 73 75 69 74 65 2e 0d 0a 20 20 20 20 20 20 23 0d  suite...      #.
aab0: 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f  .      if {[info
aac0: 20 65 78 69 73 74 73 20 3a 3a 64 61 74 65 74 69   exists ::dateti
aad0: 6d 65 5f 66 6f 72 6d 61 74 5d 20 26 26 20 5c 0d  me_format] && \.
aae0: 0a 20 20 20 20 20 20 20 20 20 20 5b 73 74 72 69  .          [stri
aaf0: 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a 64 61 74  ng length $::dat
ab00: 65 74 69 6d 65 5f 66 6f 72 6d 61 74 5d 20 3e 20  etime_format] > 
ab10: 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
ab20: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
ab30: 4e 4f 54 45 3a 20 52 65 74 75 72 6e 20 74 68 65  NOTE: Return the
ab40: 20 6d 61 6e 75 61 6c 6c 79 20 6f 76 65 72 72 69   manually overri
ab50: 64 64 65 6e 20 76 61 6c 75 65 20 66 6f 72 20 74  dden value for t
ab60: 68 65 20 44 61 74 65 54 69 6d 65 20 66 6f 72 6d  he DateTime form
ab70: 61 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  at...        #..
ab80: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 24          return $
ab90: 3a 3a 64 61 74 65 74 69 6d 65 5f 66 6f 72 6d 61  ::datetime_forma
aba0: 74 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20  t..      } else 
abb0: 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
abc0: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 52 65        # NOTE: Re
abd0: 74 75 72 6e 20 61 6e 20 49 53 4f 38 36 30 31 20  turn an ISO8601 
abe0: 44 61 74 65 54 69 6d 65 20 66 6f 72 6d 61 74 20  DateTime format 
abf0: 63 6f 6d 70 61 74 69 62 6c 65 20 77 69 74 68 20  compatible with 
ac00: 53 51 4c 69 74 65 2c 0d 0a 20 20 20 20 20 20 20  SQLite,..       
ac10: 20 23 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e   #       System.
ac20: 44 61 74 61 2e 53 51 4c 69 74 65 2c 20 61 6e 64  Data.SQLite, and
ac30: 20 73 75 69 74 61 62 6c 65 20 66 6f 72 20 72 6f   suitable for ro
ac40: 75 6e 64 2d 74 72 69 70 70 69 6e 67 20 77 69 74  und-tripping wit
ac50: 68 20 74 68 65 0d 0a 20 20 20 20 20 20 20 20 23  h the..        #
ac60: 20 20 20 20 20 20 20 44 61 74 65 54 69 6d 65 20         DateTime 
ac70: 63 6c 61 73 73 20 6f 66 20 74 68 65 20 66 72 61  class of the fra
ac80: 6d 65 77 6f 72 6b 2e 20 20 49 66 20 74 68 69 73  mework.  If this
ac90: 20 76 61 6c 75 65 20 69 73 20 63 68 61 6e 67 65   value is change
aca0: 64 2c 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  d,..        #   
acb0: 20 20 20 20 76 61 72 69 6f 75 73 20 74 65 73 74      various test
acc0: 73 20 6d 61 79 20 66 61 69 6c 2e 0d 0a 20 20 20  s may fail...   
acd0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
ace0: 72 65 74 75 72 6e 20 22 79 79 79 79 2d 4d 4d 2d  return "yyyy-MM-
acf0: 64 64 20 48 48 3a 6d 6d 3a 73 73 2e 46 46 46 46  dd HH:mm:ss.FFFF
ad00: 46 46 46 4b 22 0d 0a 20 20 20 20 20 20 7d 0d 0a  FFFK"..      }..
ad10: 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
ad20: 6f 63 20 65 6e 75 6d 65 72 61 62 6c 65 54 6f 4c  oc enumerableToL
ad30: 69 73 74 20 7b 20 65 6e 75 6d 65 72 61 62 6c 65  ist { enumerable
ad40: 20 7d 20 7b 0d 0a 20 20 20 20 20 20 73 65 74 20   } {..      set 
ad50: 72 65 73 75 6c 74 20 5b 6c 69 73 74 5d 0d 0a 0d  result [list]...
ad60: 0a 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69  .      if {[stri
ad70: 6e 67 20 6c 65 6e 67 74 68 20 24 65 6e 75 6d 65  ng length $enume
ad80: 72 61 62 6c 65 5d 20 3d 3d 20 30 20 7c 7c 20 24  rable] == 0 || $
ad90: 65 6e 75 6d 65 72 61 62 6c 65 20 65 71 20 22 6e  enumerable eq "n
ada0: 75 6c 6c 22 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ull"} then {..  
adb0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 72 65        return $re
adc0: 73 75 6c 74 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d  sult..      }...
add0: 0a 20 20 20 20 20 20 6f 62 6a 65 63 74 20 66 6f  .      object fo
ade0: 72 65 61 63 68 20 2d 61 6c 69 61 73 20 69 74 65  reach -alias ite
adf0: 6d 20 24 65 6e 75 6d 65 72 61 62 6c 65 20 7b 0d  m $enumerable {.
ae00: 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73 74  .        if {[st
ae10: 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 69 74 65  ring length $ite
ae20: 6d 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  m] > 0} then {..
ae30: 20 20 20 20 20 20 20 20 20 20 6c 61 70 70 65 6e            lappen
ae40: 64 20 72 65 73 75 6c 74 20 5b 24 69 74 65 6d 20  d result [$item 
ae50: 54 6f 53 74 72 69 6e 67 5d 0d 0a 20 20 20 20 20  ToString]..     
ae60: 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d     }..      }...
ae70: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 72  .      return $r
ae80: 65 73 75 6c 74 0d 0a 20 20 20 20 7d 0d 0a 0c 0d  esult..    }....
ae90: 0a 20 20 20 20 70 72 6f 63 20 63 61 74 63 68 41  .    proc catchA
aea0: 6e 64 52 65 74 75 72 6e 20 7b 20 73 63 72 69 70  ndReturn { scrip
aeb0: 74 20 7b 73 74 61 63 6b 54 72 61 63 65 20 66 61  t {stackTrace fa
aec0: 6c 73 65 7d 20 7b 73 74 72 69 63 74 20 74 72 75  lse} {strict tru
aed0: 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d  e} } {..      #.
aee0: 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 45  .      # NOTE: E
aef0: 76 61 6c 75 61 74 65 20 74 68 65 20 73 63 72 69  valuate the scri
af00: 70 74 20 70 72 6f 76 69 64 65 64 20 62 79 20 6f  pt provided by o
af10: 75 72 20 63 61 6c 6c 65 72 20 69 6e 20 74 68 65  ur caller in the
af20: 69 72 20 63 6f 6e 74 65 78 74 2c 0d 0a 20 20 20  ir context,..   
af30: 20 20 20 23 20 20 20 20 20 20 20 63 61 70 74 75     #       captu
af40: 72 69 6e 67 20 62 6f 74 68 20 74 68 65 20 72 65  ring both the re
af50: 73 75 6c 74 20 61 6e 64 20 74 68 65 20 72 65 74  sult and the ret
af60: 75 72 6e 20 63 6f 64 65 2e 0d 0a 20 20 20 20 20  urn code...     
af70: 20 23 0d 0a 20 20 20 20 20 20 73 65 74 20 63 6f   #..      set co
af80: 64 65 20 5b 63 61 74 63 68 20 7b 75 70 6c 65 76  de [catch {uplev
af90: 65 6c 20 31 20 24 73 63 72 69 70 74 7d 20 72 65  el 1 $script} re
afa0: 73 75 6c 74 5d 0d 0a 0d 0a 20 20 20 20 20 20 23  sult]....      #
afb0: 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
afc0: 44 69 64 20 74 68 65 20 73 63 72 69 70 74 20 70  Did the script p
afd0: 72 6f 76 69 64 65 64 20 62 79 20 6f 75 72 20 63  rovided by our c
afe0: 61 6c 6c 65 72 20 4e 4f 54 20 72 61 69 73 65 20  aller NOT raise 
aff0: 61 6e 20 65 72 72 6f 72 3f 0d 0a 20 20 20 20 20  an error?..     
b000: 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 24 73   #..      if {$s
b010: 74 72 69 63 74 20 26 26 20 24 63 6f 64 65 20 3d  trict && $code =
b020: 3d 20 30 20 7c 7c 20 21 24 73 74 72 69 63 74 20  = 0 || !$strict 
b030: 26 26 20 24 63 6f 64 65 20 21 3d 20 31 7d 20 74  && $code != 1} t
b040: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  hen {..        #
b050: 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
b060: 3a 20 53 75 63 63 65 73 73 2e 20 20 52 65 74 75  : Success.  Retu
b070: 72 6e 20 61 20 6c 69 73 74 20 77 69 74 68 20 74  rn a list with t
b080: 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20 61  he return code a
b090: 6e 64 20 74 68 65 20 72 65 73 75 6c 74 2e 0d 0a  nd the result...
b0a0: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
b0b0: 20 20 20 72 65 74 75 72 6e 20 5b 6c 69 73 74 20     return [list 
b0c0: 24 63 6f 64 65 20 24 72 65 73 75 6c 74 5d 0d 0a  $code $result]..
b0d0: 20 20 20 20 20 20 7d 20 65 6c 73 65 69 66 20 7b        } elseif {
b0e0: 24 73 74 61 63 6b 54 72 61 63 65 7d 20 74 68 65  $stackTrace} the
b0f0: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  n {..        #..
b100: 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
b110: 46 61 69 6c 75 72 65 2e 20 20 4f 75 72 20 63 61  Failure.  Our ca
b120: 6c 6c 65 72 20 77 61 6e 74 73 20 61 20 66 75 6c  ller wants a ful
b130: 6c 20 73 74 61 63 6b 20 74 72 61 63 65 20 28 69  l stack trace (i
b140: 66 20 61 70 70 6c 69 63 61 62 6c 65 29 2c 0d 0a  f applicable),..
b150: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
b160: 72 65 74 75 72 6e 20 61 20 6c 69 73 74 20 77 69  return a list wi
b170: 74 68 20 74 68 65 20 72 65 74 75 72 6e 20 63 6f  th the return co
b180: 64 65 20 61 6e 64 20 74 68 65 20 72 65 73 75 6c  de and the resul
b190: 74 20 76 65 72 62 61 74 69 6d 2e 0d 0a 20 20 20  t verbatim...   
b1a0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
b1b0: 72 65 74 75 72 6e 20 5b 6c 69 73 74 20 24 63 6f  return [list $co
b1c0: 64 65 20 24 72 65 73 75 6c 74 5d 0d 0a 20 20 20  de $result]..   
b1d0: 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
b1e0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
b1f0: 23 20 4e 4f 54 45 3a 20 46 61 69 6c 75 72 65 2e  # NOTE: Failure.
b200: 20 20 4f 75 72 20 63 61 6c 6c 65 72 20 64 6f 65    Our caller doe
b210: 73 20 6e 6f 74 20 77 61 6e 74 20 61 20 66 75 6c  s not want a ful
b220: 6c 20 73 74 61 63 6b 20 74 72 61 63 65 20 28 69  l stack trace (i
b230: 66 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  f..        #    
b240: 20 20 20 61 70 70 6c 69 63 61 62 6c 65 29 2c 20     applicable), 
b250: 72 65 74 75 72 6e 20 61 20 6c 69 73 74 20 77 69  return a list wi
b260: 74 68 20 74 68 65 20 72 65 74 75 72 6e 20 63 6f  th the return co
b270: 64 65 2c 20 74 68 65 20 65 72 72 6f 72 0d 0a 20  de, the error.. 
b280: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63         #       c
b290: 6f 64 65 20 66 6f 72 20 74 68 65 20 69 6e 74 65  ode for the inte
b2a0: 72 70 72 65 74 65 72 2c 20 61 6e 64 20 74 68 65  rpreter, and the
b2b0: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 75   error message u
b2c0: 70 20 74 6f 20 74 68 65 0d 0a 20 20 20 20 20 20  p to the..      
b2d0: 20 20 23 20 20 20 20 20 20 20 70 6f 69 6e 74 20    #       point 
b2e0: 77 68 65 72 65 20 74 68 65 20 73 74 61 63 6b 20  where the stack 
b2f0: 74 72 61 63 65 20 73 68 6f 75 6c 64 20 73 74 61  trace should sta
b300: 72 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  rt...        #..
b310: 20 20 20 20 20 20 20 20 73 65 74 20 69 6e 64 65          set inde
b320: 78 20 5b 73 74 72 69 6e 67 20 66 69 72 73 74 20  x [string first 
b330: 22 20 20 20 61 74 20 22 20 24 72 65 73 75 6c 74  "   at " $result
b340: 5d 3b 20 23 20 48 41 43 4b 3a 20 52 65 6c 69 61  ]; # HACK: Relia
b350: 62 6c 65 3f 0d 0a 0d 0a 20 20 20 20 20 20 20 20  ble?....        
b360: 72 65 74 75 72 6e 20 5b 6c 69 73 74 20 24 63 6f  return [list $co
b370: 64 65 20 24 3a 3a 65 72 72 6f 72 43 6f 64 65 20  de $::errorCode 
b380: 5b 65 78 70 72 20 7b 24 69 6e 64 65 78 20 21 3d  [expr {$index !=
b390: 20 2d 31 20 3f 20 5c 0d 0a 20 20 20 20 20 20 20   -1 ? \..       
b3a0: 20 20 20 20 20 5b 73 74 72 69 6e 67 20 74 72 69       [string tri
b3b0: 6d 20 5b 73 74 72 69 6e 67 20 72 61 6e 67 65 20  m [string range 
b3c0: 24 72 65 73 75 6c 74 20 30 20 24 69 6e 64 65 78  $result 0 $index
b3d0: 5d 5d 20 3a 20 24 72 65 73 75 6c 74 7d 5d 5d 0d  ]] : $result}]].
b3e0: 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d  .      }..    }.
b3f0: 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 63 6f 6d  ....    proc com
b400: 70 69 6c 65 43 53 68 61 72 70 57 69 74 68 20 7b  pileCSharpWith {
b410: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 65  ..            te
b420: 78 74 20 6d 65 6d 6f 72 79 20 73 79 6d 62 6f 6c  xt memory symbol
b430: 73 20 73 74 72 69 63 74 20 72 65 73 75 6c 74 73  s strict results
b440: 56 61 72 4e 61 6d 65 20 65 72 72 6f 72 73 56 61  VarName errorsVa
b450: 72 4e 61 6d 65 20 66 69 6c 65 4e 61 6d 65 73 0d  rName fileNames.
b460: 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 72 67  .            arg
b470: 73 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a  s } {..      #..
b480: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 69        # NOTE: Si
b490: 6e 63 65 20 77 65 20 61 72 65 20 67 6f 69 6e 67  nce we are going
b4a0: 20 74 6f 20 75 73 65 20 74 68 69 73 20 6d 65 74   to use this met
b4b0: 68 6f 64 20 6e 61 6d 65 20 61 20 6c 6f 74 2c 20  hod name a lot, 
b4c0: 61 73 73 69 67 6e 20 69 74 20 74 6f 20 61 0d 0a  assign it to a..
b4d0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 76 61        #       va
b4e0: 72 69 61 62 6c 65 20 66 69 72 73 74 2e 0d 0a 20  riable first... 
b4f0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 73 65       #..      se
b500: 74 20 61 64 64 20 52 65 66 65 72 65 6e 63 65 64  t add Referenced
b510: 41 73 73 65 6d 62 6c 69 65 73 2e 41 64 64 0d 0a  Assemblies.Add..
b520: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
b530: 20 23 20 4e 4f 54 45 3a 20 43 72 65 61 74 65 20   # NOTE: Create 
b540: 74 68 65 20 62 61 73 65 20 63 6f 6d 6d 61 6e 64  the base command
b550: 20 74 6f 20 65 76 61 6c 75 61 74 65 20 61 6e 64   to evaluate and
b560: 20 61 64 64 20 74 68 65 20 70 72 6f 70 65 72 74   add the propert
b570: 79 20 73 65 74 74 69 6e 67 73 0d 0a 20 20 20 20  y settings..    
b580: 20 20 23 20 20 20 20 20 20 20 74 68 61 74 20 61    #       that a
b590: 72 65 20 61 6c 6d 6f 73 74 20 61 6c 77 61 79 73  re almost always
b5a0: 20 6e 65 65 64 65 64 20 62 79 20 6f 75 72 20 75   needed by our u
b5b0: 6e 69 74 20 74 65 73 74 73 20 28 69 2e 65 2e 20  nit tests (i.e. 
b5c0: 74 68 65 20 53 79 73 74 65 6d 0d 0a 20 20 20 20  the System..    
b5d0: 20 20 23 20 20 20 20 20 20 20 61 6e 64 20 53 79    #       and Sy
b5e0: 73 74 65 6d 2e 44 61 74 61 20 61 73 73 65 6d 62  stem.Data assemb
b5f0: 6c 79 20 72 65 66 65 72 65 6e 63 65 73 29 2e 0d  ly references)..
b600: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
b610: 73 65 74 20 63 6f 6d 6d 61 6e 64 20 5b 6c 69 73  set command [lis
b620: 74 20 63 6f 6d 70 69 6c 65 43 53 68 61 72 70 20  t compileCSharp 
b630: 24 74 65 78 74 20 24 6d 65 6d 6f 72 79 20 24 73  $text $memory $s
b640: 79 6d 62 6f 6c 73 20 24 73 74 72 69 63 74 20 72  ymbols $strict r
b650: 65 73 75 6c 74 73 20 5c 0d 0a 20 20 20 20 20 20  esults \..      
b660: 20 20 20 20 65 72 72 6f 72 73 20 24 61 64 64 20      errors $add 
b670: 53 79 73 74 65 6d 2e 64 6c 6c 20 24 61 64 64 20  System.dll $add 
b680: 53 79 73 74 65 6d 2e 44 61 74 61 2e 64 6c 6c 20  System.Data.dll 
b690: 24 61 64 64 20 53 79 73 74 65 6d 2e 58 6d 6c 2e  $add System.Xml.
b6a0: 64 6c 6c 5d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d  dll]....      #.
b6b0: 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41  .      # NOTE: A
b6c0: 64 64 20 61 6c 6c 20 74 68 65 20 70 72 6f 76 69  dd all the provi
b6d0: 64 65 64 20 66 69 6c 65 20 6e 61 6d 65 73 20 61  ded file names a
b6e0: 73 20 61 73 73 65 6d 62 6c 79 20 72 65 66 65 72  s assembly refer
b6f0: 65 6e 63 65 73 2e 0d 0a 20 20 20 20 20 20 23 0d  ences...      #.
b700: 0a 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 66  .      foreach f
b710: 69 6c 65 4e 61 6d 65 20 24 66 69 6c 65 4e 61 6d  ileName $fileNam
b720: 65 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 6c 61  es {..        la
b730: 70 70 65 6e 64 20 63 6f 6d 6d 61 6e 64 20 24 61  ppend command $a
b740: 64 64 20 5b 67 65 74 42 69 6e 61 72 79 46 69 6c  dd [getBinaryFil
b750: 65 4e 61 6d 65 20 24 66 69 6c 65 4e 61 6d 65 5d  eName $fileName]
b760: 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
b770: 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
b780: 54 45 3a 20 41 64 64 20 74 68 65 20 65 78 74 72  TE: Add the extr
b790: 61 20 61 72 67 75 6d 65 6e 74 73 2c 20 69 66 20  a arguments, if 
b7a0: 61 6e 79 2c 20 74 6f 20 74 68 65 20 63 6f 6d 6d  any, to the comm
b7b0: 61 6e 64 20 74 6f 20 65 76 61 6c 75 61 74 65 2e  and to evaluate.
b7c0: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
b7d0: 20 65 76 61 6c 20 6c 61 70 70 65 6e 64 20 63 6f   eval lappend co
b7e0: 6d 6d 61 6e 64 20 24 61 72 67 73 0d 0a 0d 0a 20  mmand $args.... 
b7f0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
b800: 4e 4f 54 45 3a 20 41 6c 69 61 73 20 74 68 65 20  NOTE: Alias the 
b810: 63 6f 6d 70 69 6c 65 72 20 6c 6f 63 61 6c 20 72  compiler local r
b820: 65 73 75 6c 74 73 20 61 6e 64 20 65 72 72 6f 72  esults and error
b830: 73 20 76 61 72 69 61 62 6c 65 73 20 74 6f 20 74  s variables to t
b840: 68 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  he..      #     
b850: 20 20 76 61 72 69 61 62 6c 65 20 6e 61 6d 65 73    variable names
b860: 20 70 72 6f 76 69 64 65 64 20 62 79 20 6f 75 72   provided by our
b870: 20 63 61 6c 6c 65 72 2e 0d 0a 20 20 20 20 20 20   caller...      
b880: 23 0d 0a 20 20 20 20 20 20 75 70 76 61 72 20 31  #..      upvar 1
b890: 20 24 72 65 73 75 6c 74 73 56 61 72 4e 61 6d 65   $resultsVarName
b8a0: 20 72 65 73 75 6c 74 73 0d 0a 20 20 20 20 20 20   results..      
b8b0: 75 70 76 61 72 20 31 20 24 65 72 72 6f 72 73 56  upvar 1 $errorsV
b8c0: 61 72 4e 61 6d 65 20 65 72 72 6f 72 73 0d 0a 0d  arName errors...
b8d0: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
b8e0: 23 20 4e 4f 54 45 3a 20 45 76 61 6c 75 61 74 65  # NOTE: Evaluate
b8f0: 20 74 68 65 20 63 6f 6e 73 74 72 75 63 74 65 64   the constructed
b900: 20 5b 63 6f 6d 70 69 6c 65 43 53 68 61 72 70 5d   [compileCSharp]
b910: 20 63 6f 6d 6d 61 6e 64 20 61 6e 64 20 72 65 74   command and ret
b920: 75 72 6e 20 74 68 65 0d 0a 20 20 20 20 20 20 23  urn the..      #
b930: 20 20 20 20 20 20 20 72 65 73 75 6c 74 2e 0d 0a         result...
b940: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 65        #..      e
b950: 76 61 6c 20 24 63 6f 6d 6d 61 6e 64 0d 0a 20 20  val $command..  
b960: 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
b970: 20 69 73 4d 65 6d 6f 72 79 44 62 20 7b 20 66 69   isMemoryDb { fi
b980: 6c 65 4e 61 6d 65 20 7d 20 7b 0d 0a 20 20 20 20  leName } {..    
b990: 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
b9a0: 45 3a 20 49 73 20 74 68 65 20 73 70 65 63 69 66  E: Is the specif
b9b0: 69 65 64 20 64 61 74 61 62 61 73 65 20 66 69 6c  ied database fil
b9c0: 65 20 6e 61 6d 65 20 72 65 61 6c 6c 79 20 61 6e  e name really an
b9d0: 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
b9e0: 61 73 65 3f 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ase?..      #.. 
b9f0: 20 20 20 20 20 72 65 74 75 72 6e 20 5b 65 78 70       return [exp
ba00: 72 20 7b 24 66 69 6c 65 4e 61 6d 65 20 65 71 20  r {$fileName eq 
ba10: 22 3a 6d 65 6d 6f 72 79 3a 22 20 7c 7c 20 5c 0d  ":memory:" || \.
ba20: 0a 20 20 20 20 20 20 20 20 20 20 5b 73 74 72 69  .          [stri
ba30: 6e 67 20 72 61 6e 67 65 20 24 66 69 6c 65 4e 61  ng range $fileNa
ba40: 6d 65 20 30 20 31 32 5d 20 65 71 20 22 66 69 6c  me 0 12] eq "fil
ba50: 65 3a 3a 6d 65 6d 6f 72 79 3a 22 7d 5d 0d 0a 20  e::memory:"}].. 
ba60: 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
ba70: 63 20 69 73 54 61 62 6c 65 49 6e 44 62 20 7b 20  c isTableInDb { 
ba80: 6e 61 6d 65 20 7b 76 61 72 4e 61 6d 65 20 64 62  name {varName db
ba90: 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a  } } {..      #..
baa0: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 52 65        # NOTE: Re
bab0: 66 65 72 20 74 6f 20 74 68 65 20 73 70 65 63 69  fer to the speci
bac0: 66 69 65 64 20 76 61 72 69 61 62 6c 65 20 28 65  fied variable (e
bad0: 2e 67 2e 20 22 64 62 22 29 20 69 6e 20 74 68 65  .g. "db") in the
bae0: 20 63 6f 6e 74 65 78 74 20 6f 66 20 6f 75 72 0d   context of our.
baf0: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63  .      #       c
bb00: 61 6c 6c 65 72 2e 20 20 49 74 20 63 6f 6e 74 61  aller.  It conta
bb10: 69 6e 73 20 74 68 65 20 64 61 74 61 62 61 73 65  ins the database
bb20: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 6e 64   connection hand
bb30: 6c 65 20 74 68 61 74 20 77 69 6c 6c 20 62 65 0d  le that will be.
bb40: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 75  .      #       u
bb50: 73 65 64 20 74 6f 20 65 78 65 63 75 74 65 20 74  sed to execute t
bb60: 68 65 20 71 75 65 72 79 20 75 73 65 64 20 74 6f  he query used to
bb70: 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20 74 68   determine if th
bb80: 65 20 6e 61 6d 65 64 20 74 61 62 6c 65 20 69 73  e named table is
bb90: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
bba0: 70 72 65 73 65 6e 74 20 69 6e 20 74 68 61 74 20  present in that 
bbb0: 64 61 74 61 62 61 73 65 2e 0d 0a 20 20 20 20 20  database...     
bbc0: 20 23 0d 0a 20 20 20 20 20 20 75 70 76 61 72 20   #..      upvar 
bbd0: 31 20 24 76 61 72 4e 61 6d 65 20 64 62 0d 0a 0d  1 $varName db...
bbe0: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
bbf0: 23 20 4e 4f 54 45 3a 20 45 78 65 63 75 74 65 20  # NOTE: Execute 
bc00: 74 68 65 20 53 51 4c 20 71 75 65 72 79 20 61 67  the SQL query ag
bc10: 61 69 6e 73 74 20 74 68 65 20 73 71 6c 69 74 65  ainst the sqlite
bc20: 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 74 6f  _master table to
bc30: 20 63 68 65 63 6b 20 69 66 0d 0a 20 20 20 20 20   check if..     
bc40: 20 23 20 20 20 20 20 20 20 74 68 65 20 6e 61 6d   #       the nam
bc50: 65 64 20 74 61 62 6c 65 20 69 73 20 70 72 65 73  ed table is pres
bc60: 65 6e 74 20 61 6e 64 20 72 65 74 75 72 6e 20 6e  ent and return n
bc70: 6f 6e 2d 7a 65 72 6f 20 69 66 20 69 74 20 69 73  on-zero if it is
bc80: 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
bc90: 20 20 72 65 74 75 72 6e 20 5b 65 78 70 72 20 7b    return [expr {
bca0: 5b 73 71 6c 20 65 78 65 63 75 74 65 20 2d 65 78  [sql execute -ex
bcb0: 65 63 75 74 65 20 73 63 61 6c 61 72 20 24 64 62  ecute scalar $db
bcc0: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 22 53   \..          "S
bcd0: 45 4c 45 43 54 20 43 4f 55 4e 54 28 2a 29 20 46  ELECT COUNT(*) F
bce0: 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  ROM sqlite_maste
bcf0: 72 20 57 48 45 52 45 20 74 79 70 65 20 3d 20 27  r WHERE type = '
bd00: 74 61 62 6c 65 27 20 41 4e 44 20 6e 61 6d 65 20  table' AND name 
bd10: 3d 20 3f 3b 22 20 5c 0d 0a 20 20 20 20 20 20 20  = ?;" \..       
bd20: 20 20 20 5b 6c 69 73 74 20 70 61 72 61 6d 31 20     [list param1 
bd30: 53 74 72 69 6e 67 20 24 6e 61 6d 65 5d 5d 20 3e  String $name]] >
bd40: 20 30 7d 5d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a   0}]..    }.....
bd50: 20 20 20 20 70 72 6f 63 20 74 72 69 6d 53 71 6c      proc trimSql
bd60: 20 7b 20 73 71 6c 20 7d 20 7b 0d 0a 20 20 20 20   { sql } {..    
bd70: 20 20 72 65 74 75 72 6e 20 5b 72 65 67 73 75 62    return [regsub
bd80: 20 2d 61 6c 6c 20 2d 2d 20 7b 5c 73 2b 7d 20 5b   -all -- {\s+} [
bd90: 73 74 72 69 6e 67 20 74 72 69 6d 20 24 73 71 6c  string trim $sql
bda0: 5d 20 22 20 22 5d 0d 0a 20 20 20 20 7d 0d 0a 0c  ] " "]..    }...
bdb0: 0d 0a 20 20 20 20 70 72 6f 63 20 65 78 65 63 75  ..    proc execu
bdc0: 74 65 53 71 6c 20 7b 20 73 71 6c 20 7b 65 78 65  teSql { sql {exe
bdd0: 63 75 74 65 20 6e 6f 6e 65 7d 20 7b 66 69 6c 65  cute none} {file
bde0: 4e 61 6d 65 20 22 22 7d 20 7d 20 7b 0d 0a 20 20  Name ""} } {..  
bdf0: 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20      if {[string 
be00: 6c 65 6e 67 74 68 20 24 66 69 6c 65 4e 61 6d 65  length $fileName
be10: 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 73 65  ] == 0} then {se
be20: 74 20 66 69 6c 65 4e 61 6d 65 20 3a 6d 65 6d 6f  t fileName :memo
be30: 72 79 3a 7d 0d 0a 20 20 20 20 20 20 73 65 74 75  ry:}..      setu
be40: 70 44 62 20 24 66 69 6c 65 4e 61 6d 65 20 22 22  pDb $fileName ""
be50: 20 22 22 20 22 22 20 22 22 20 22 22 20 66 61 6c   "" "" "" "" fal
be60: 73 65 20 66 61 6c 73 65 20 66 61 6c 73 65 20 66  se false false f
be70: 61 6c 73 65 20 6d 65 6d 44 62 0d 0a 0d 0a 20 20  alse memDb....  
be80: 20 20 20 20 74 72 79 20 7b 0d 0a 20 20 20 20 20      try {..     
be90: 20 20 20 72 65 74 75 72 6e 20 5b 73 71 6c 20 65     return [sql e
bea0: 78 65 63 75 74 65 20 2d 65 78 65 63 75 74 65 20  xecute -execute 
beb0: 24 65 78 65 63 75 74 65 20 24 6d 65 6d 44 62 20  $execute $memDb 
bec0: 24 73 71 6c 5d 0d 0a 20 20 20 20 20 20 7d 20 66  $sql]..      } f
bed0: 69 6e 61 6c 6c 79 20 7b 0d 0a 20 20 20 20 20 20  inally {..      
bee0: 20 20 63 6c 65 61 6e 75 70 44 62 20 24 66 69 6c    cleanupDb $fil
bef0: 65 4e 61 6d 65 20 6d 65 6d 44 62 20 66 61 6c 73  eName memDb fals
bf00: 65 20 66 61 6c 73 65 0d 0a 20 20 20 20 20 20 7d  e false..      }
bf10: 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
bf20: 70 72 6f 63 20 73 65 74 75 70 44 62 20 7b 0d 0a  proc setupDb {..
bf30: 20 20 20 20 20 20 20 20 20 20 20 20 66 69 6c 65              file
bf40: 4e 61 6d 65 20 7b 6d 6f 64 65 20 22 22 7d 20 7b  Name {mode ""} {
bf50: 64 61 74 65 54 69 6d 65 46 6f 72 6d 61 74 20 22  dateTimeFormat "
bf60: 22 7d 20 7b 64 61 74 65 54 69 6d 65 4b 69 6e 64  "} {dateTimeKind
bf70: 20 22 22 7d 20 7b 66 6c 61 67 73 20 22 22 7d 0d   ""} {flags ""}.
bf80: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 65 78  .            {ex
bf90: 74 72 61 20 22 22 7d 20 7b 71 75 61 6c 69 66 79  tra ""} {qualify
bfa0: 20 74 72 75 65 7d 20 7b 64 65 6c 65 74 65 20 74   true} {delete t
bfb0: 72 75 65 7d 20 7b 75 72 69 20 66 61 6c 73 65 7d  rue} {uri false}
bfc0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 74  ..            {t
bfd0: 65 6d 70 6f 72 61 72 79 20 74 72 75 65 7d 20 7b  emporary true} {
bfe0: 76 61 72 4e 61 6d 65 20 64 62 7d 20 7d 20 7b 0d  varName db} } {.
bff0: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
c000: 23 20 4e 4f 54 45 3a 20 46 69 72 73 74 2c 20 73  # NOTE: First, s
c010: 65 65 20 69 66 20 6f 75 72 20 63 61 6c 6c 65 72  ee if our caller
c020: 20 68 61 73 20 72 65 71 75 65 73 74 65 64 20 61   has requested a
c030: 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  n in-memory data
c040: 62 61 73 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  base...      #..
c050: 20 20 20 20 20 20 73 65 74 20 69 73 4d 65 6d 6f        set isMemo
c060: 72 79 20 5b 69 73 4d 65 6d 6f 72 79 44 62 20 24  ry [isMemoryDb $
c070: 66 69 6c 65 4e 61 6d 65 5d 0d 0a 0d 0a 20 20 20  fileName]....   
c080: 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
c090: 54 45 3a 20 46 6f 72 20 6e 6f 77 2c 20 61 6c 6c  TE: For now, all
c0a0: 20 74 65 73 74 20 64 61 74 61 62 61 73 65 73 20   test databases 
c0b0: 75 73 65 64 20 62 79 20 74 68 65 20 74 65 73 74  used by the test
c0c0: 20 73 75 69 74 65 20 61 72 65 20 70 6c 61 63 65   suite are place
c0d0: 64 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  d..      #      
c0e0: 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61   into the databa
c0f0: 73 65 20 64 69 72 65 63 74 6f 72 79 2e 20 20 45  se directory.  E
c100: 61 63 68 20 64 61 74 61 62 61 73 65 20 61 6e 64  ach database and
c110: 20 72 65 6c 61 74 65 64 20 66 69 6c 65 73 0d 0a   related files..
c120: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 75 73        #       us
c130: 65 64 20 62 79 20 61 20 74 65 73 74 20 73 68 6f  ed by a test sho
c140: 75 6c 64 20 62 65 20 63 6c 65 61 6e 65 64 20 75  uld be cleaned u
c150: 70 20 62 79 20 74 68 61 74 20 74 65 73 74 20 75  p by that test u
c160: 73 69 6e 67 20 74 68 65 0d 0a 20 20 20 20 20 20  sing the..      
c170: 23 20 20 20 20 20 20 20 22 63 6c 65 61 6e 75 70  #       "cleanup
c180: 44 62 22 20 70 72 6f 63 65 64 75 72 65 2c 20 62  Db" procedure, b
c190: 65 6c 6f 77 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  elow...      #..
c1a0: 20 20 20 20 20 20 69 66 20 7b 21 24 69 73 4d 65        if {!$isMe
c1b0: 6d 6f 72 79 20 26 26 20 24 71 75 61 6c 69 66 79  mory && $qualify
c1c0: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
c1d0: 20 20 73 65 74 20 66 69 6c 65 4e 61 6d 65 20 5b    set fileName [
c1e0: 66 69 6c 65 20 6a 6f 69 6e 20 5b 67 65 74 44 61  file join [getDa
c1f0: 74 61 62 61 73 65 44 69 72 65 63 74 6f 72 79 5d  tabaseDirectory]
c200: 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 66 69 6c   [file tail $fil
c210: 65 4e 61 6d 65 5d 5d 0d 0a 20 20 20 20 20 20 7d  eName]]..      }
c220: 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  ....      #..   
c230: 20 20 20 23 20 4e 4f 54 45 3a 20 42 79 20 64 65     # NOTE: By de
c240: 66 61 75 6c 74 2c 20 64 65 6c 65 74 65 20 61 6e  fault, delete an
c250: 79 20 70 72 65 2d 65 78 69 73 74 69 6e 67 20 64  y pre-existing d
c260: 61 74 61 62 61 73 65 20 77 69 74 68 20 74 68 65  atabase with the
c270: 20 73 61 6d 65 20 66 69 6c 65 0d 0a 20 20 20 20   same file..    
c280: 20 20 23 20 20 20 20 20 20 20 6e 61 6d 65 20 69    #       name i
c290: 66 20 69 74 20 63 75 72 72 65 6e 74 6c 79 20 65  f it currently e
c2a0: 78 69 73 74 73 2e 0d 0a 20 20 20 20 20 20 23 0d  xists...      #.
c2b0: 0a 20 20 20 20 20 20 69 66 20 7b 21 24 69 73 4d  .      if {!$isM
c2c0: 65 6d 6f 72 79 20 26 26 20 24 64 65 6c 65 74 65  emory && $delete
c2d0: 20 26 26 20 5b 66 69 6c 65 20 65 78 69 73 74 73   && [file exists
c2e0: 20 24 66 69 6c 65 4e 61 6d 65 5d 7d 20 74 68 65   $fileName]} the
c2f0: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  n {..        #..
c300: 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
c310: 41 74 74 65 6d 70 74 20 74 6f 20 64 65 6c 65 74  Attempt to delet
c320: 65 20 61 6e 79 20 70 72 65 2d 65 78 69 73 74 69  e any pre-existi
c330: 6e 67 20 64 61 74 61 62 61 73 65 20 77 69 74 68  ng database with
c340: 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65 0d 0a   the same file..
c350: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
c360: 6e 61 6d 65 2e 0d 0a 20 20 20 20 20 20 20 20 23  name...        #
c370: 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63  ..        if {[c
c380: 61 74 63 68 20 7b 66 69 6c 65 20 64 65 6c 65 74  atch {file delet
c390: 65 20 24 66 69 6c 65 4e 61 6d 65 7d 20 65 72 72  e $fileName} err
c3a0: 6f 72 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  or]} then {..   
c3b0: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
c3c0: 20 20 20 20 23 20 4e 4f 54 45 3a 20 57 65 20 73      # NOTE: We s
c3d0: 6f 6d 65 68 6f 77 20 66 61 69 6c 65 64 20 74 6f  omehow failed to
c3e0: 20 64 65 6c 65 74 65 20 74 68 65 20 66 69 6c 65   delete the file
c3f0: 2c 20 72 65 70 6f 72 74 20 77 68 79 2e 0d 0a 20  , report why... 
c400: 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
c410: 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
c420: 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70  est_channel [app
c430: 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
c440: 20 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57           "==== W
c450: 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20 74  ARNING: failed t
c460: 6f 20 64 65 6c 65 74 65 20 64 61 74 61 62 61 73  o delete databas
c470: 65 20 66 69 6c 65 20 5c 22 22 20 24 66 69 6c 65  e file \"" $file
c480: 4e 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20 20 20  Name \..        
c490: 20 20 20 20 20 20 22 5c 22 20 64 75 72 69 6e 67        "\" during
c4a0: 20 73 65 74 75 70 2c 20 65 72 72 6f 72 3a 20 22   setup, error: "
c4b0: 20 5c 6e 5c 74 20 24 65 72 72 6f 72 20 5c 6e 5d   \n\t $error \n]
c4c0: 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20  ..        }..   
c4d0: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d     }....      #.
c4e0: 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 52  .      # NOTE: R
c4f0: 65 66 65 72 20 74 6f 20 74 68 65 20 73 70 65 63  efer to the spec
c500: 69 66 69 65 64 20 76 61 72 69 61 62 6c 65 20 28  ified variable (
c510: 65 2e 67 2e 20 22 64 62 22 29 20 69 6e 20 74 68  e.g. "db") in th
c520: 65 20 63 6f 6e 74 65 78 74 20 6f 66 20 6f 75 72  e context of our
c530: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
c540: 63 61 6c 6c 65 72 2e 20 20 54 68 65 20 68 61 6e  caller.  The han
c550: 64 6c 65 20 74 6f 20 74 68 65 20 6f 70 65 6e 65  dle to the opene
c560: 64 20 64 61 74 61 62 61 73 65 20 77 69 6c 6c 20  d database will 
c570: 62 65 20 73 74 6f 72 65 64 20 74 68 65 72 65 2e  be stored there.
c580: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
c590: 20 75 70 76 61 72 20 31 20 24 76 61 72 4e 61 6d   upvar 1 $varNam
c5a0: 65 20 64 62 0d 0a 0d 0a 20 20 20 20 20 20 23 0d  e db....      #.
c5b0: 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53  .      # NOTE: S
c5c0: 74 61 72 74 20 62 75 69 6c 64 69 6e 67 20 74 68  tart building th
c5d0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 74 72  e connection str
c5e0: 69 6e 67 2e 20 20 54 68 65 20 6f 6e 6c 79 20 72  ing.  The only r
c5f0: 65 71 75 69 72 65 64 20 70 6f 72 74 69 6f 6e 0d  equired portion.
c600: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 6f  .      #       o
c610: 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  f the connection
c620: 20 73 74 72 69 6e 67 20 69 73 20 74 68 65 20 64   string is the d
c630: 61 74 61 20 73 6f 75 72 63 65 2c 20 77 68 69 63  ata source, whic
c640: 68 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 0d 0a  h contains the..
c650: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 64 61        #       da
c660: 74 61 62 61 73 65 20 66 69 6c 65 20 6e 61 6d 65  tabase file name
c670: 20 69 74 73 65 6c 66 2e 20 20 49 66 20 6f 75 72   itself.  If our
c680: 20 63 61 6c 6c 65 72 20 77 61 6e 74 73 20 74 6f   caller wants to
c690: 20 75 73 65 20 61 20 55 52 49 20 61 73 0d 0a 20   use a URI as.. 
c6a0: 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68 65       #       the
c6b0: 20 64 61 74 61 20 73 6f 75 72 63 65 2c 20 75 73   data source, us
c6c0: 65 20 74 68 65 20 46 75 6c 6c 55 72 69 20 63 6f  e the FullUri co
c6d0: 6e 6e 65 63 74 69 6f 6e 20 73 74 72 69 6e 67 20  nnection string 
c6e0: 70 72 6f 70 65 72 74 79 20 74 6f 0d 0a 20 20 20  property to..   
c6f0: 20 20 20 23 20 20 20 20 20 20 20 70 72 65 76 65     #       preve
c700: 6e 74 20 74 68 65 20 64 61 74 61 20 73 6f 75 72  nt the data sour
c710: 63 65 20 73 74 72 69 6e 67 20 66 72 6f 6d 20 62  ce string from b
c720: 65 69 6e 67 20 6d 61 6e 67 6c 65 64 2e 0d 0a 20  eing mangled... 
c730: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66       #..      if
c740: 20 7b 24 75 72 69 7d 20 74 68 65 6e 20 7b 0d 0a   {$uri} then {..
c750: 20 20 20 20 20 20 20 20 73 65 74 20 63 6f 6e 6e          set conn
c760: 65 63 74 69 6f 6e 20 7b 46 75 6c 6c 55 72 69 3d  ection {FullUri=
c770: 24 7b 66 69 6c 65 4e 61 6d 65 7d 7d 0d 0a 20 20  ${fileName}}..  
c780: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
c790: 20 20 20 20 20 20 73 65 74 20 63 6f 6e 6e 65 63        set connec
c7a0: 74 69 6f 6e 20 7b 44 61 74 61 20 53 6f 75 72 63  tion {Data Sourc
c7b0: 65 3d 24 7b 66 69 6c 65 4e 61 6d 65 7d 7d 0d 0a  e=${fileName}}..
c7c0: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
c7d0: 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
c7e0: 3a 20 53 69 6e 63 65 20 74 68 69 73 20 70 72 6f  : Since this pro
c7f0: 63 65 64 75 72 65 20 68 61 73 20 6e 6f 20 73 70  cedure has no sp
c800: 65 63 69 61 6c 20 6b 6e 6f 77 6c 65 64 67 65 20  ecial knowledge 
c810: 6f 66 20 77 68 61 74 20 74 68 65 20 64 65 66 61  of what the defa
c820: 75 6c 74 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ult..      #    
c830: 20 20 20 73 65 74 74 69 6e 67 20 69 73 20 66 6f     setting is fo
c840: 72 20 74 68 65 20 54 6f 46 75 6c 6c 50 61 74 68  r the ToFullPath
c850: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 74 72 69   connection stri
c860: 6e 67 20 70 72 6f 70 65 72 79 2c 20 61 6c 77 61  ng propery, alwa
c870: 79 73 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  ys..      #     
c880: 20 20 61 64 64 20 74 68 65 20 76 61 6c 75 65 20    add the value 
c890: 77 65 20 6b 6e 6f 77 20 61 62 6f 75 74 20 74 6f  we know about to
c8a0: 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
c8b0: 73 74 72 69 6e 67 2e 0d 0a 20 20 20 20 20 20 23  string...      #
c8c0: 0d 0a 20 20 20 20 20 20 61 70 70 65 6e 64 20 63  ..      append c
c8d0: 6f 6e 6e 65 63 74 69 6f 6e 20 7b 3b 54 6f 46 75  onnection {;ToFu
c8e0: 6c 6c 50 61 74 68 3d 24 7b 71 75 61 6c 69 66 79  llPath=${qualify
c8f0: 7d 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20  }}....      #.. 
c900: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 66 20       # NOTE: If 
c910: 6f 75 72 20 63 61 6c 6c 65 72 20 73 70 65 63 69  our caller speci
c920: 66 69 65 64 20 61 20 6a 6f 75 72 6e 61 6c 20 6d  fied a journal m
c930: 6f 64 65 2c 20 61 64 64 20 74 68 65 20 6e 65 63  ode, add the nec
c940: 65 73 73 61 72 79 20 70 6f 72 74 69 6f 6e 0d 0a  essary portion..
c950: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 6f 66        #       of
c960: 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
c970: 73 74 72 69 6e 67 20 6e 6f 77 2e 0d 0a 20 20 20  string now...   
c980: 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
c990: 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
c9a0: 6d 6f 64 65 5d 20 3e 20 30 7d 20 74 68 65 6e 20  mode] > 0} then 
c9b0: 7b 0d 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e  {..        appen
c9c0: 64 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 7b 3b 4a  d connection {;J
c9d0: 6f 75 72 6e 61 6c 20 4d 6f 64 65 3d 24 7b 6d 6f  ournal Mode=${mo
c9e0: 64 65 7d 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d  de}}..      }...
c9f0: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
ca00: 23 20 4e 4f 54 45 3a 20 49 66 20 6f 75 72 20 63  # NOTE: If our c
ca10: 61 6c 6c 65 72 20 73 70 65 63 69 66 69 65 64 20  aller specified 
ca20: 61 20 44 61 74 65 54 69 6d 65 20 66 6f 72 6d 61  a DateTime forma
ca30: 74 2c 20 61 64 64 20 74 68 65 20 6e 65 63 65 73  t, add the neces
ca40: 73 61 72 79 0d 0a 20 20 20 20 20 20 23 20 20 20  sary..      #   
ca50: 20 20 20 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74      portion of t
ca60: 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 74  he connection st
ca70: 72 69 6e 67 20 6e 6f 77 2e 0d 0a 20 20 20 20 20  ring now...     
ca80: 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 73   #..      if {[s
ca90: 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 64 61  tring length $da
caa0: 74 65 54 69 6d 65 46 6f 72 6d 61 74 5d 20 3e 20  teTimeFormat] > 
cab0: 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
cac0: 20 20 20 61 70 70 65 6e 64 20 63 6f 6e 6e 65 63     append connec
cad0: 74 69 6f 6e 20 7b 3b 44 61 74 65 54 69 6d 65 46  tion {;DateTimeF
cae0: 6f 72 6d 61 74 3d 24 7b 64 61 74 65 54 69 6d 65  ormat=${dateTime
caf0: 46 6f 72 6d 61 74 7d 7d 0d 0a 20 20 20 20 20 20  Format}}..      
cb00: 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  }....      #..  
cb10: 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 66 20 6f      # NOTE: If o
cb20: 75 72 20 63 61 6c 6c 65 72 20 73 70 65 63 69 66  ur caller specif
cb30: 69 65 64 20 61 20 44 61 74 65 54 69 6d 65 4b 69  ied a DateTimeKi
cb40: 6e 64 2c 20 61 64 64 20 74 68 65 20 6e 65 63 65  nd, add the nece
cb50: 73 73 61 72 79 20 70 6f 72 74 69 6f 6e 0d 0a 20  ssary portion.. 
cb60: 20 20 20 20 20 23 20 20 20 20 20 20 20 6f 66 20       #       of 
cb70: 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73  the connection s
cb80: 74 72 69 6e 67 20 6e 6f 77 2e 0d 0a 20 20 20 20  tring now...    
cb90: 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b    #..      if {[
cba0: 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 64  string length $d
cbb0: 61 74 65 54 69 6d 65 4b 69 6e 64 5d 20 3e 20 30  ateTimeKind] > 0
cbc0: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
cbd0: 20 20 61 70 70 65 6e 64 20 63 6f 6e 6e 65 63 74    append connect
cbe0: 69 6f 6e 20 7b 3b 44 61 74 65 54 69 6d 65 4b 69  ion {;DateTimeKi
cbf0: 6e 64 3d 24 7b 64 61 74 65 54 69 6d 65 4b 69 6e  nd=${dateTimeKin
cc00: 64 7d 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a  d}}..      }....
cc10: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
cc20: 20 4e 4f 54 45 3a 20 49 66 20 74 68 65 72 65 20   NOTE: If there 
cc30: 61 72 65 20 61 6e 79 20 67 6c 6f 62 61 6c 20 28  are any global (
cc40: 70 65 72 20 74 65 73 74 20 72 75 6e 29 20 63 6f  per test run) co
cc50: 6e 6e 65 63 74 69 6f 6e 20 66 6c 61 67 73 20 63  nnection flags c
cc60: 75 72 72 65 6e 74 6c 79 0d 0a 20 20 20 20 20 20  urrently..      
cc70: 23 20 20 20 20 20 20 20 73 65 74 2c 20 75 73 65  #       set, use
cc80: 20 74 68 65 6d 20 6e 6f 77 20 28 69 2e 65 2e 20   them now (i.e. 
cc90: 62 79 20 63 6f 6d 62 69 6e 69 6e 67 20 74 68 65  by combining the
cca0: 6d 20 77 69 74 68 20 74 68 65 20 6f 6e 65 73 20  m with the ones 
ccb0: 66 6f 72 20 74 68 69 73 0d 0a 20 20 20 20 20 20  for this..      
ccc0: 23 20 20 20 20 20 20 20 63 6f 6e 6e 65 63 74 69  #       connecti
ccd0: 6f 6e 29 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  on)...      #.. 
cce0: 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65       if {[info e
ccf0: 78 69 73 74 73 20 3a 3a 63 6f 6e 6e 65 63 74 69  xists ::connecti
cd00: 6f 6e 5f 66 6c 61 67 73 5d 20 26 26 20 5c 0d 0a  on_flags] && \..
cd10: 20 20 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e            [strin
cd20: 67 20 6c 65 6e 67 74 68 20 24 3a 3a 63 6f 6e 6e  g length $::conn
cd30: 65 63 74 69 6f 6e 5f 66 6c 61 67 73 5d 20 3e 20  ection_flags] > 
cd40: 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
cd50: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
cd60: 4e 4f 54 45 3a 20 53 68 6f 77 20 28 61 6e 64 20  NOTE: Show (and 
cd70: 6c 6f 67 29 20 74 68 61 74 20 77 65 20 64 65 74  log) that we det
cd80: 65 63 74 65 64 20 73 6f 6d 65 20 67 6c 6f 62 61  ected some globa
cd90: 6c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 6c 61  l connection fla
cda0: 67 73 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  gs...        #..
cdb0: 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
cdc0: 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61  :test_channel [a
cdd0: 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
cde0: 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 67           "---- g
cdf0: 6c 6f 62 61 6c 20 63 6f 6e 6e 65 63 74 69 6f 6e  lobal connection
ce00: 20 66 6c 61 67 73 20 64 65 74 65 63 74 65 64 3a   flags detected:
ce10: 20 22 20 24 3a 3a 63 6f 6e 6e 65 63 74 69 6f 6e   " $::connection
ce20: 5f 66 6c 61 67 73 20 5c 6e 5d 0d 0a 0d 0a 20 20  _flags \n]....  
ce30: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
ce40: 20 23 20 4e 4f 54 45 3a 20 43 6f 6d 62 69 6e 65   # NOTE: Combine
ce50: 20 61 6e 64 2f 6f 72 20 72 65 70 6c 61 63 65 20   and/or replace 
ce60: 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66  the connection f
ce70: 6c 61 67 73 20 61 6e 64 20 74 68 65 6e 20 73 68  lags and then sh
ce80: 6f 77 20 74 68 65 0d 0a 20 20 20 20 20 20 20 20  ow the..        
ce90: 23 20 20 20 20 20 20 20 6e 65 77 20 76 61 6c 75  #       new valu
cea0: 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  e...        #.. 
ceb0: 20 20 20 20 20 20 20 73 65 74 20 66 6c 61 67 73         set flags
cec0: 20 5b 63 6f 6d 62 69 6e 65 46 6c 61 67 73 20 24   [combineFlags $
ced0: 66 6c 61 67 73 20 24 3a 3a 63 6f 6e 6e 65 63 74  flags $::connect
cee0: 69 6f 6e 5f 66 6c 61 67 73 5d 0d 0a 0d 0a 20 20  ion_flags]....  
cef0: 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
cf00: 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70  est_channel [app
cf10: 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
cf20: 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 6f 6d         "---- com
cf30: 62 69 6e 65 64 20 63 6f 6e 6e 65 63 74 69 6f 6e  bined connection
cf40: 20 66 6c 61 67 73 20 61 72 65 3a 20 22 20 24 66   flags are: " $f
cf50: 6c 61 67 73 20 5c 6e 5d 0d 0a 20 20 20 20 20 20  lags \n]..      
cf60: 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  }....      #..  
cf70: 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 66 20 6f      # NOTE: If o
cf80: 75 72 20 63 61 6c 6c 65 72 20 73 70 65 63 69 66  ur caller specif
cf90: 69 65 64 20 73 6f 6d 65 20 53 51 4c 69 74 65 43  ied some SQLiteC
cfa0: 6f 6e 6e 65 63 74 69 6f 6e 46 6c 61 67 73 2c 20  onnectionFlags, 
cfb0: 61 64 64 20 74 68 65 0d 0a 20 20 20 20 20 20 23  add the..      #
cfc0: 20 20 20 20 20 20 20 6e 65 63 65 73 73 61 72 79         necessary
cfd0: 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65 20   portion of the 
cfe0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 74 72 69 6e  connection strin
cff0: 67 20 6e 6f 77 2e 0d 0a 20 20 20 20 20 20 23 0d  g now...      #.
d000: 0a 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69  .      if {[stri
d010: 6e 67 20 6c 65 6e 67 74 68 20 24 66 6c 61 67 73  ng length $flags
d020: 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20  ] > 0} then {.. 
d030: 20 20 20 20 20 20 20 61 70 70 65 6e 64 20 63 6f         append co
d040: 6e 6e 65 63 74 69 6f 6e 20 7b 3b 46 6c 61 67 73  nnection {;Flags
d050: 3d 24 7b 66 6c 61 67 73 7d 7d 0d 0a 20 20 20 20  =${flags}}..    
d060: 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a    }....      #..
d070: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 66        # NOTE: If
d080: 20 6f 75 72 20 63 61 6c 6c 65 72 20 73 70 65 63   our caller spec
d090: 69 66 69 65 64 20 61 6e 20 65 78 74 72 61 20 70  ified an extra p
d0a0: 61 79 6c 6f 61 64 20 74 6f 20 74 68 65 20 63 6f  ayload to the co
d0b0: 6e 6e 65 63 74 69 6f 6e 0d 0a 20 20 20 20 20 20  nnection..      
d0c0: 23 20 20 20 20 20 20 20 73 74 72 69 6e 67 2c 20  #       string, 
d0d0: 61 70 70 65 6e 64 20 69 74 20 6e 6f 77 2e 0d 0a  append it now...
d0e0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69        #..      i
d0f0: 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74  f {[string lengt
d100: 68 20 24 65 78 74 72 61 5d 20 3e 20 30 7d 20 74  h $extra] > 0} t
d110: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 61  hen {..        a
d120: 70 70 65 6e 64 20 63 6f 6e 6e 65 63 74 69 6f 6e  ppend connection
d130: 20 5c 3b 20 24 65 78 74 72 61 0d 0a 20 20 20 20   \; $extra..    
d140: 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a    }....      #..
d150: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4f 70        # NOTE: Op
d160: 65 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  en the database 
d170: 63 6f 6e 6e 65 63 74 69 6f 6e 20 6e 6f 77 2c 20  connection now, 
d180: 70 6c 61 63 69 6e 67 20 74 68 65 20 6f 70 61 71  placing the opaq
d190: 75 65 20 68 61 6e 64 6c 65 20 76 61 6c 75 65 0d  ue handle value.
d1a0: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 69  .      #       i
d1b0: 6e 74 6f 20 74 68 65 20 76 61 72 69 61 62 6c 65  nto the variable
d1c0: 20 73 70 65 63 69 66 69 65 64 20 62 79 20 6f 75   specified by ou
d1d0: 72 20 63 61 6c 6c 65 72 2e 0d 0a 20 20 20 20 20  r caller...     
d1e0: 20 23 0d 0a 20 20 20 20 20 20 73 65 74 20 64 62   #..      set db
d1f0: 20 5b 73 71 6c 20 6f 70 65 6e 20 2d 74 79 70 65   [sql open -type
d200: 20 53 51 4c 69 74 65 20 5b 73 75 62 73 74 20 24   SQLite [subst $
d210: 63 6f 6e 6e 65 63 74 69 6f 6e 5d 5d 0d 0a 0d 0a  connection]]....
d220: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
d230: 20 4e 4f 54 45 3a 20 43 6f 6e 66 69 67 75 72 65   NOTE: Configure
d240: 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 64   the temporary d
d250: 69 72 65 63 74 6f 72 79 20 66 6f 72 20 74 68 65  irectory for the
d260: 20 6e 65 77 6c 79 20 6f 70 65 6e 65 64 20 64 61   newly opened da
d270: 74 61 62 61 73 65 0d 0a 20 20 20 20 20 20 23 20  tabase..      # 
d280: 20 20 20 20 20 20 63 6f 6e 6e 65 63 74 69 6f 6e        connection
d290: 20 6e 6f 77 20 75 6e 6c 65 73 73 20 6f 75 72 20   now unless our 
d2a0: 63 61 6c 6c 65 72 20 66 6f 72 62 69 64 73 20 69  caller forbids i
d2b0: 74 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  t...      #..   
d2c0: 20 20 20 69 66 20 7b 24 74 65 6d 70 6f 72 61 72     if {$temporar
d2d0: 79 20 26 26 20 21 5b 69 6e 66 6f 20 65 78 69 73  y && ![info exis
d2e0: 74 73 20 3a 3a 6e 6f 28 73 65 74 54 65 6d 70 6f  ts ::no(setTempo
d2f0: 72 61 72 79 44 69 72 65 63 74 6f 72 79 29 5d 7d  raryDirectory)]}
d300: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
d310: 20 73 71 6c 20 65 78 65 63 75 74 65 20 24 64 62   sql execute $db
d320: 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
d330: 20 20 20 20 20 20 20 20 20 20 20 20 22 50 52 41              "PRA
d340: 47 4d 41 20 74 65 6d 70 5f 73 74 6f 72 65 5f 64  GMA temp_store_d
d350: 69 72 65 63 74 6f 72 79 20 3d 20 5c 22 22 20 5b  irectory = \"" [
d360: 67 65 74 54 65 6d 70 6f 72 61 72 79 44 69 72 65  getTemporaryDire
d370: 63 74 6f 72 79 5d 20 5c 22 5c 3b 5d 0d 0a 20 20  ctory] \"\;]..  
d380: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23      }....      #
d390: 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
d3a0: 41 6c 77 61 79 73 20 72 65 74 75 72 6e 20 74 68  Always return th
d3b0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 6e  e connection han
d3c0: 64 6c 65 20 75 70 6f 6e 20 73 75 63 63 65 73 73  dle upon success
d3d0: 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
d3e0: 20 20 72 65 74 75 72 6e 20 24 64 62 0d 0a 20 20    return $db..  
d3f0: 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
d400: 20 67 65 74 44 62 43 6f 6e 6e 65 63 74 69 6f 6e   getDbConnection
d410: 20 7b 20 7b 76 61 72 4e 61 6d 65 20 64 62 7d 20   { {varName db} 
d420: 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  } {..      #..  
d430: 20 20 20 20 23 20 4e 4f 54 45 3a 20 52 65 66 65      # NOTE: Refe
d440: 72 20 74 6f 20 74 68 65 20 73 70 65 63 69 66 69  r to the specifi
d450: 65 64 20 76 61 72 69 61 62 6c 65 20 28 65 2e 67  ed variable (e.g
d460: 2e 20 22 64 62 22 29 20 69 6e 20 74 68 65 20 63  . "db") in the c
d470: 6f 6e 74 65 78 74 20 6f 66 20 6f 75 72 0d 0a 20  ontext of our.. 
d480: 20 20 20 20 20 23 20 20 20 20 20 20 20 63 61 6c       #       cal
d490: 6c 65 72 2e 20 20 54 68 65 20 68 61 6e 64 6c 65  ler.  The handle
d4a0: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
d4b0: 20 70 72 65 76 69 6f 75 73 6c 79 20 6f 70 65 6e   previously open
d4c0: 65 64 20 76 69 61 20 74 68 65 0d 0a 20 20 20 20  ed via the..    
d4d0: 20 20 23 20 20 20 20 20 20 20 5b 73 65 74 75 70    #       [setup
d4e0: 44 62 5d 20 70 72 6f 63 65 64 75 72 65 20 73 68  Db] procedure sh
d4f0: 6f 75 6c 64 20 62 65 20 73 74 6f 72 65 64 20 74  ould be stored t
d500: 68 65 72 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  here...      #..
d510: 20 20 20 20 20 20 75 70 76 61 72 20 31 20 24 76        upvar 1 $v
d520: 61 72 4e 61 6d 65 20 64 62 0d 0a 0d 0a 20 20 20  arName db....   
d530: 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
d540: 54 45 3a 20 54 68 69 73 20 72 65 74 75 72 6e 73  TE: This returns
d550: 20 74 68 65 20 41 44 4f 2e 4e 45 54 20 49 44 62   the ADO.NET IDb
d560: 43 6f 6e 6e 65 63 74 69 6f 6e 20 6f 62 6a 65 63  Connection objec
d570: 74 20 69 6e 73 74 61 6e 63 65 20 66 6f 72 20 74  t instance for t
d580: 68 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  he..      #     
d590: 20 20 73 70 65 63 69 66 69 65 64 20 64 61 74 61    specified data
d5a0: 62 73 65 20 68 61 6e 64 6c 65 2e 20 20 53 69 6e  bse handle.  Sin
d5b0: 63 65 20 67 65 74 74 69 6e 67 20 74 68 69 73 20  ce getting this 
d5c0: 6f 62 6a 65 63 74 20 72 65 6c 69 65 73 20 75 70  object relies up
d5d0: 6f 6e 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  on..      #     
d5e0: 20 20 45 61 67 6c 65 20 69 6e 74 65 72 6e 61 6c    Eagle internal
d5f0: 73 2c 20 67 72 65 61 74 20 63 61 72 65 20 73 68  s, great care sh
d600: 6f 75 6c 64 20 62 65 20 74 61 6b 65 6e 20 74 6f  ould be taken to
d610: 20 61 76 6f 69 64 20 64 69 73 70 6f 73 69 6e 67   avoid disposing
d620: 20 6f 66 0d 0a 20 20 20 20 20 20 23 20 20 20 20   of..      #    
d630: 20 20 20 74 68 69 73 20 6f 62 6a 65 63 74 20 6f     this object o
d640: 72 20 6f 74 68 65 72 77 69 73 65 20 70 75 74 74  r otherwise putt
d650: 69 6e 67 20 69 74 20 69 6e 74 6f 20 61 6e 20 69  ing it into an i
d660: 6e 76 61 6c 69 64 20 73 74 61 74 65 2e 0d 0a 20  nvalid state... 
d670: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66       #..      if
d680: 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 64   {[info exists d
d690: 62 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  b]} then {..    
d6a0: 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b      if {[catch {
d6b0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
d6c0: 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20    object invoke 
d6d0: 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69  -flags +NonPubli
d6e0: 63 20 2d 6f 62 6a 65 63 74 66 6c 61 67 73 20 2b  c -objectflags +
d6f0: 4e 6f 44 69 73 70 6f 73 65 20 5c 0d 0a 20 20 20  NoDispose \..   
d700: 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 61 6c               -al
d710: 69 61 73 20 49 6e 74 65 72 70 72 65 74 65 72 2e  ias Interpreter.
d720: 47 65 74 41 63 74 69 76 65 2e 63 6f 6e 6e 65 63  GetActive.connec
d730: 74 69 6f 6e 73 20 49 74 65 6d 20 24 64 62 7d 20  tions Item $db} 
d740: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
d750: 20 20 20 72 65 73 75 6c 74 5d 20 3d 3d 20 30 7d     result] == 0}
d760: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
d770: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
d780: 23 20 4e 4f 54 45 3a 20 53 75 63 63 65 73 73 2c  # NOTE: Success,
d790: 20 72 65 74 75 72 6e 20 74 68 65 20 6f 70 61 71   return the opaq
d7a0: 75 65 20 6f 62 6a 65 63 74 20 68 61 6e 64 6c 65  ue object handle
d7b0: 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a  ...          #..
d7c0: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
d7d0: 20 24 72 65 73 75 6c 74 0d 0a 20 20 20 20 20 20   $result..      
d7e0: 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
d7f0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
d800: 20 20 20 23 20 4e 4f 54 45 3a 20 46 61 69 6c 75     # NOTE: Failu
d810: 72 65 2c 20 72 65 70 6f 72 74 20 77 68 79 2e 0d  re, report why..
d820: 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
d830: 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
d840: 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61  :test_channel [a
d850: 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
d860: 20 20 20 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d             "====
d870: 20 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64   WARNING: failed
d880: 20 74 6f 20 67 65 74 20 63 6f 6e 6e 65 63 74 69   to get connecti
d890: 6f 6e 20 68 61 6e 64 6c 65 20 66 6f 72 20 64 61  on handle for da
d8a0: 74 61 62 61 73 65 20 5c 22 22 20 5c 0d 0a 20 20  tabase \"" \..  
d8b0: 20 20 20 20 20 20 20 20 20 20 20 20 24 64 62 20              $db 
d8c0: 22 5c 22 2c 20 65 72 72 6f 72 3a 20 22 20 5c 6e  "\", error: " \n
d8d0: 5c 74 20 24 72 65 73 75 6c 74 20 5c 6e 5d 0d 0a  \t $result \n]..
d8e0: 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
d8f0: 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20   }..    }.....  
d900: 20 20 70 72 6f 63 20 66 72 65 65 44 62 43 6f 6e    proc freeDbCon
d910: 6e 65 63 74 69 6f 6e 20 7b 20 7b 76 61 72 4e 61  nection { {varNa
d920: 6d 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 7d 20 7d  me connection} }
d930: 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20   {..      #..   
d940: 20 20 20 23 20 4e 4f 54 45 3a 20 52 65 66 65 72     # NOTE: Refer
d950: 20 74 6f 20 74 68 65 20 73 70 65 63 69 66 69 65   to the specifie
d960: 64 20 76 61 72 69 61 62 6c 65 20 28 65 2e 67 2e  d variable (e.g.
d970: 20 22 63 6f 6e 6e 65 63 74 69 6f 6e 22 29 20 69   "connection") i
d980: 6e 20 74 68 65 0d 0a 20 20 20 20 20 20 23 20 20  n the..      #  
d990: 20 20 20 20 20 63 6f 6e 74 65 78 74 20 6f 66 20       context of 
d9a0: 6f 75 72 20 63 61 6c 6c 65 72 2e 20 20 54 68 65  our caller.  The
d9b0: 20 6f 70 61 71 75 65 20 6f 62 6a 65 63 74 20 68   opaque object h
d9c0: 61 6e 64 6c 65 20 66 6f 72 20 61 6e 20 41 44 4f  andle for an ADO
d9d0: 2e 4e 45 54 0d 0a 20 20 20 20 20 20 23 20 20 20  .NET..      #   
d9e0: 20 20 20 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70      connection p
d9f0: 72 65 76 69 6f 75 73 6c 79 20 72 65 74 75 72 6e  reviously return
da00: 65 64 20 62 79 20 5b 67 65 74 44 62 43 6f 6e 6e  ed by [getDbConn
da10: 65 63 74 69 6f 6e 5d 20 73 68 6f 75 6c 64 20 62  ection] should b
da20: 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  e..      #      
da30: 20 73 74 6f 72 65 64 20 74 68 65 72 65 2e 0d 0a   stored there...
da40: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 75        #..      u
da50: 70 76 61 72 20 31 20 24 76 61 72 4e 61 6d 65 20  pvar 1 $varName 
da60: 63 6f 6e 6e 65 63 74 69 6f 6e 0d 0a 0d 0a 20 20  connection....  
da70: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
da80: 4f 54 45 3a 20 41 74 74 65 6d 70 74 20 74 6f 20  OTE: Attempt to 
da90: 72 65 6d 6f 76 65 20 74 68 65 20 6f 70 61 71 75  remove the opaqu
daa0: 65 20 6f 62 6a 65 63 74 20 68 61 6e 64 6c 65 20  e object handle 
dab0: 66 72 6f 6d 20 74 68 65 20 69 6e 74 65 72 70 72  from the interpr
dac0: 65 74 65 72 0d 0a 20 20 20 20 20 20 23 20 20 20  eter..      #   
dad0: 20 20 20 20 6e 6f 77 2e 20 20 54 68 69 73 20 5b      now.  This [
dae0: 6f 62 6a 65 63 74 20 64 69 73 70 6f 73 65 5d 20  object dispose] 
daf0: 63 61 6c 6c 20 77 69 6c 6c 20 6e 6f 74 20 61 63  call will not ac
db00: 74 75 61 6c 6c 79 20 64 69 73 70 6f 73 65 20 6f  tually dispose o
db10: 66 20 74 68 65 0d 0a 20 20 20 20 20 20 23 20 20  f the..      #  
db20: 20 20 20 20 20 75 6e 64 65 72 6c 79 69 6e 67 20       underlying 
db30: 6f 62 6a 65 63 74 20 62 65 63 61 75 73 65 20 74  object because t
db40: 68 65 20 2b 4e 6f 44 69 73 70 6f 73 65 20 66 6c  he +NoDispose fl
db50: 61 67 20 77 61 73 20 73 65 74 20 6f 6e 20 69 74  ag was set on it
db60: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
db70: 64 75 72 69 6e 67 20 63 72 65 61 74 69 6f 6e 20  during creation 
db80: 6f 66 20 74 68 65 20 6f 70 61 71 75 65 20 6f 62  of the opaque ob
db90: 6a 65 63 74 20 68 61 6e 64 6c 65 2e 0d 0a 20 20  ject handle...  
dba0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20      #..      if 
dbb0: 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 63 6f  {[info exists co
dbc0: 6e 6e 65 63 74 69 6f 6e 5d 20 26 26 20 5c 0d 0a  nnection] && \..
dbd0: 20 20 20 20 20 20 20 20 20 20 5b 63 61 74 63 68            [catch
dbe0: 20 7b 6f 62 6a 65 63 74 20 64 69 73 70 6f 73 65   {object dispose
dbf0: 20 24 63 6f 6e 6e 65 63 74 69 6f 6e 7d 20 65 72   $connection} er
dc00: 72 6f 72 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ror]} then {..  
dc10: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
dc20: 20 23 20 4e 4f 54 45 3a 20 57 65 20 73 6f 6d 65   # NOTE: We some
dc30: 68 6f 77 20 66 61 69 6c 65 64 20 74 6f 20 72 65  how failed to re
dc40: 6d 6f 76 65 20 74 68 65 20 68 61 6e 64 6c 65 2c  move the handle,
dc50: 20 72 65 70 6f 72 74 20 77 68 79 2e 0d 0a 20 20   report why...  
dc60: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
dc70: 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
dc80: 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
dc90: 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
dca0: 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a    "==== WARNING:
dcb0: 20 66 61 69 6c 65 64 20 74 6f 20 72 65 6d 6f 76   failed to remov
dcc0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 6e  e connection han
dcd0: 64 6c 65 20 5c 22 22 20 24 63 6f 6e 6e 65 63 74  dle \"" $connect
dce0: 69 6f 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ion \..         
dcf0: 20 20 20 22 5c 22 2c 20 65 72 72 6f 72 3a 20 22     "\", error: "
dd00: 20 5c 6e 5c 74 20 24 65 72 72 6f 72 20 5c 6e 5d   \n\t $error \n]
dd10: 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d  ..      }..    }
dd20: 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 61 64  .....    proc ad
dd30: 64 44 62 43 6f 6e 6e 65 63 74 69 6f 6e 20 7b 20  dDbConnection { 
dd40: 63 6f 6e 6e 65 63 74 69 6f 6e 20 7b 76 61 72 4e  connection {varN
dd50: 61 6d 65 20 64 62 7d 20 7d 20 7b 0d 0a 20 20 20  ame db} } {..   
dd60: 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
dd70: 54 45 3a 20 52 65 66 65 72 20 74 6f 20 74 68 65  TE: Refer to the
dd80: 20 73 70 65 63 69 66 69 65 64 20 76 61 72 69 61   specified varia
dd90: 62 6c 65 20 28 65 2e 67 2e 20 22 64 62 22 29 20  ble (e.g. "db") 
dda0: 69 6e 20 74 68 65 20 63 6f 6e 74 65 78 74 20 6f  in the context o
ddb0: 66 20 6f 75 72 0d 0a 20 20 20 20 20 20 23 20 20  f our..      #  
ddc0: 20 20 20 20 20 63 61 6c 6c 65 72 2e 0d 0a 20 20       caller...  
ddd0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 75 70 76      #..      upv
dde0: 61 72 20 31 20 24 76 61 72 4e 61 6d 65 20 64 62  ar 1 $varName db
ddf0: 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  ....      #..   
de00: 20 20 20 23 20 4e 4f 54 45 3a 20 43 72 65 61 74     # NOTE: Creat
de10: 65 20 61 20 63 6f 72 72 65 63 74 6c 79 20 66 6f  e a correctly fo
de20: 72 6d 61 74 74 65 64 20 6e 61 6d 65 20 66 6f 72  rmatted name for
de30: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   the database co
de40: 6e 6e 65 63 74 69 6f 6e 20 74 6f 0d 0a 20 20 20  nnection to..   
de50: 20 20 20 23 20 20 20 20 20 20 20 62 65 20 61 64     #       be ad
de60: 64 65 64 20 74 6f 20 74 68 65 20 6c 69 73 74 20  ded to the list 
de70: 6d 61 6e 61 67 65 64 20 62 79 20 74 68 65 20 45  managed by the E
de80: 61 67 6c 65 20 69 6e 74 65 72 70 72 65 74 65 72  agle interpreter
de90: 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
dea0: 20 20 73 65 74 20 64 62 20 5b 6f 62 6a 65 63 74    set db [object
deb0: 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b   invoke -flags +
dec0: 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20  NonPublic \..   
ded0: 20 20 20 20 20 20 20 45 61 67 6c 65 2e 5f 43 6f         Eagle._Co
dee0: 6d 70 6f 6e 65 6e 74 73 2e 50 72 69 76 61 74 65  mponents.Private
def0: 2e 46 6f 72 6d 61 74 4f 70 73 20 44 61 74 61 62  .FormatOps Datab
df00: 61 73 65 4f 62 6a 65 63 74 4e 61 6d 65 20 24 63  aseObjectName $c
df10: 6f 6e 6e 65 63 74 69 6f 6e 20 5c 0d 0a 20 20 20  onnection \..   
df20: 20 20 20 20 20 20 20 53 51 4c 69 74 65 43 6f 6e         SQLiteCon
df30: 6e 65 63 74 69 6f 6e 20 5b 6f 62 6a 65 63 74 20  nection [object 
df40: 69 6e 76 6f 6b 65 20 49 6e 74 65 72 70 72 65 74  invoke Interpret
df50: 65 72 2e 47 65 74 41 63 74 69 76 65 20 4e 65 78  er.GetActive Nex
df60: 74 49 64 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 23  tId]]....      #
df70: 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
df80: 41 64 64 20 74 68 65 20 64 61 74 61 62 61 73 65  Add the database
df90: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 72 6f 76   connection prov
dfa0: 69 64 65 64 20 62 79 20 6f 75 72 20 63 61 6c 6c  ided by our call
dfb0: 65 72 20 74 6f 20 74 68 65 20 6c 69 73 74 0d 0a  er to the list..
dfc0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 6f 66        #       of
dfd0: 20 74 68 6f 73 65 20 6b 6e 6f 77 6e 20 74 6f 20   those known to 
dfe0: 74 68 65 20 45 61 67 6c 65 20 69 6e 74 65 72 70  the Eagle interp
dff0: 72 65 74 65 72 2e 0d 0a 20 20 20 20 20 20 23 0d  reter...      #.
e000: 0a 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e  .      object in
e010: 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e  voke -flags +Non
e020: 50 75 62 6c 69 63 20 49 6e 74 65 72 70 72 65 74  Public Interpret
e030: 65 72 2e 47 65 74 41 63 74 69 76 65 2e 63 6f 6e  er.GetActive.con
e040: 6e 65 63 74 69 6f 6e 73 20 41 64 64 20 5c 0d 0a  nections Add \..
e050: 20 20 20 20 20 20 20 20 20 20 24 64 62 20 24 63            $db $c
e060: 6f 6e 6e 65 63 74 69 6f 6e 0d 0a 20 20 20 20 7d  onnection..    }
e070: 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 63 6c  .....    proc cl
e080: 65 61 6e 75 70 44 62 20 7b 20 66 69 6c 65 4e 61  eanupDb { fileNa
e090: 6d 65 20 7b 76 61 72 4e 61 6d 65 20 64 62 7d 20  me {varName db} 
e0a0: 7b 63 6f 6c 6c 65 63 74 20 74 72 75 65 7d 20 7b  {collect true} {
e0b0: 71 75 61 6c 69 66 79 20 74 72 75 65 7d 0d 0a 20  qualify true}.. 
e0c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e0d0: 20 20 20 20 7b 64 65 6c 65 74 65 20 74 72 75 65      {delete true
e0e0: 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a  } } {..      #..
e0f0: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 74        # NOTE: At
e100: 74 65 6d 70 74 20 74 6f 20 66 6f 72 63 65 20 61  tempt to force a
e110: 6c 6c 20 70 65 6e 64 69 6e 67 20 22 67 61 72 62  ll pending "garb
e120: 61 67 65 22 20 6f 62 6a 65 63 74 73 20 74 6f 20  age" objects to 
e130: 62 65 20 63 6f 6c 6c 65 63 74 65 64 2c 0d 0a 20  be collected,.. 
e140: 20 20 20 20 20 23 20 20 20 20 20 20 20 69 6e 63       #       inc
e150: 6c 75 64 69 6e 67 20 53 51 4c 69 74 65 20 73 74  luding SQLite st
e160: 61 74 65 6d 65 6e 74 73 20 61 6e 64 20 62 61 63  atements and bac
e170: 6b 75 70 20 6f 62 6a 65 63 74 73 3b 20 74 68 69  kup objects; thi
e180: 73 20 73 68 6f 75 6c 64 20 61 6c 6c 6f 77 0d 0a  s should allow..
e190: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68        #       th
e1a0: 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 64 61 74  e underlying dat
e1b0: 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 62 65  abase file to be
e1c0: 20 64 65 6c 65 74 65 64 2e 0d 0a 20 20 20 20 20   deleted...     
e1d0: 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 24 63   #..      if {$c
e1e0: 6f 6c 6c 65 63 74 7d 20 74 68 65 6e 20 7b 0d 0a  ollect} then {..
e1f0: 20 20 20 20 20 20 20 20 63 6f 6c 6c 65 63 74 47          collectG
e200: 61 72 62 61 67 65 20 24 3a 3a 74 65 73 74 5f 63  arbage $::test_c
e210: 68 61 6e 6e 65 6c 0d 0a 20 20 20 20 20 20 7d 0d  hannel..      }.
e220: 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
e230: 20 20 23 20 4e 4f 54 45 3a 20 52 65 66 65 72 20    # NOTE: Refer 
e240: 74 6f 20 74 68 65 20 73 70 65 63 69 66 69 65 64  to the specified
e250: 20 76 61 72 69 61 62 6c 65 20 28 65 2e 67 2e 20   variable (e.g. 
e260: 22 64 62 22 29 20 69 6e 20 74 68 65 20 63 6f 6e  "db") in the con
e270: 74 65 78 74 20 6f 66 20 6f 75 72 0d 0a 20 20 20  text of our..   
e280: 20 20 20 23 20 20 20 20 20 20 20 63 61 6c 6c 65     #       calle
e290: 72 2e 20 20 54 68 65 20 68 61 6e 64 6c 65 20 74  r.  The handle t
e2a0: 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 70  o the database p
e2b0: 72 65 76 69 6f 75 73 6c 79 20 6f 70 65 6e 65 64  reviously opened
e2c0: 20 76 69 61 20 74 68 65 0d 0a 20 20 20 20 20 20   via the..      
e2d0: 23 20 20 20 20 20 20 20 5b 73 65 74 75 70 44 62  #       [setupDb
e2e0: 5d 20 70 72 6f 63 65 64 75 72 65 20 73 68 6f 75  ] procedure shou
e2f0: 6c 64 20 62 65 20 73 74 6f 72 65 64 20 74 68 65  ld be stored the
e300: 72 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  re...      #..  
e310: 20 20 20 20 75 70 76 61 72 20 31 20 24 76 61 72      upvar 1 $var
e320: 4e 61 6d 65 20 64 62 0d 0a 0d 0a 20 20 20 20 20  Name db....     
e330: 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
e340: 3a 20 43 6c 6f 73 65 20 74 68 65 20 63 6f 6e 6e  : Close the conn
e350: 65 63 74 69 6f 6e 20 74 6f 20 74 68 65 20 64 61  ection to the da
e360: 74 61 62 61 73 65 20 6e 6f 77 2e 20 20 54 68 69  tabase now.  Thi
e370: 73 20 73 68 6f 75 6c 64 20 61 6c 6c 6f 77 20 75  s should allow u
e380: 73 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  s..      #      
e390: 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20 75   to delete the u
e3a0: 6e 64 65 72 6c 79 69 6e 67 20 64 61 74 61 62 61  nderlying databa
e3b0: 73 65 20 66 69 6c 65 2e 0d 0a 20 20 20 20 20 20  se file...      
e3c0: 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 6e  #..      if {[in
e3d0: 66 6f 20 65 78 69 73 74 73 20 64 62 5d 20 26 26  fo exists db] &&
e3e0: 20 5b 63 61 74 63 68 20 7b 73 71 6c 20 63 6c 6f   [catch {sql clo
e3f0: 73 65 20 24 64 62 7d 20 65 72 72 6f 72 5d 7d 20  se $db} error]} 
e400: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
e410: 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
e420: 45 3a 20 57 65 20 73 6f 6d 65 68 6f 77 20 66 61  E: We somehow fa
e430: 69 6c 65 64 20 74 6f 20 63 6c 6f 73 65 20 74 68  iled to close th
e440: 65 20 64 61 74 61 62 61 73 65 2c 20 72 65 70 6f  e database, repo
e450: 72 74 20 77 68 79 2e 0d 0a 20 20 20 20 20 20 20  rt why...       
e460: 20 23 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74   #..        tput
e470: 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
e480: 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
e490: 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 3d 3d  .            "==
e4a0: 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c  == WARNING: fail
e4b0: 65 64 20 74 6f 20 63 6c 6f 73 65 20 64 61 74 61  ed to close data
e4c0: 62 61 73 65 20 5c 22 22 20 24 64 62 20 22 5c 22  base \"" $db "\"
e4d0: 2c 20 65 72 72 6f 72 3a 20 22 20 5c 0d 0a 20 20  , error: " \..  
e4e0: 20 20 20 20 20 20 20 20 20 20 5c 6e 5c 74 20 24            \n\t $
e4f0: 65 72 72 6f 72 20 5c 6e 5d 0d 0a 20 20 20 20 20  error \n]..     
e500: 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20   }....      #.. 
e510: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 46 69 72       # NOTE: Fir
e520: 73 74 2c 20 73 65 65 20 69 66 20 6f 75 72 20 63  st, see if our c
e530: 61 6c 6c 65 72 20 68 61 73 20 72 65 71 75 65 73  aller has reques
e540: 74 65 64 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79  ted an in-memory
e550: 20 64 61 74 61 62 61 73 65 2e 0d 0a 20 20 20 20   database...    
e560: 20 20 23 0d 0a 20 20 20 20 20 20 73 65 74 20 69    #..      set i
e570: 73 4d 65 6d 6f 72 79 20 5b 69 73 4d 65 6d 6f 72  sMemory [isMemor
e580: 79 44 62 20 24 66 69 6c 65 4e 61 6d 65 5d 0d 0a  yDb $fileName]..
e590: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
e5a0: 20 23 20 4e 4f 54 45 3a 20 42 75 69 6c 64 20 74   # NOTE: Build t
e5b0: 68 65 20 66 75 6c 6c 20 70 61 74 68 20 74 6f 20  he full path to 
e5c0: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
e5d0: 65 20 6e 61 6d 65 2e 20 20 46 6f 72 20 6e 6f 77  e name.  For now
e5e0: 2c 20 61 6c 6c 20 74 65 73 74 0d 0a 20 20 20 20  , all test..    
e5f0: 20 20 23 20 20 20 20 20 20 20 64 61 74 61 62 61    #       databa
e600: 73 65 20 66 69 6c 65 73 20 61 72 65 20 73 74 6f  se files are sto
e610: 72 65 64 20 69 6e 20 74 68 65 20 74 65 6d 70 6f  red in the tempo
e620: 72 61 72 79 20 64 69 72 65 63 74 6f 72 79 2e 0d  rary directory..
e630: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
e640: 69 66 20 7b 21 24 69 73 4d 65 6d 6f 72 79 20 26  if {!$isMemory &
e650: 26 20 24 71 75 61 6c 69 66 79 7d 20 74 68 65 6e  & $qualify} then
e660: 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20   {..        set 
e670: 66 69 6c 65 4e 61 6d 65 20 5b 66 69 6c 65 20 6a  fileName [file j
e680: 6f 69 6e 20 5b 67 65 74 44 61 74 61 62 61 73 65  oin [getDatabase
e690: 44 69 72 65 63 74 6f 72 79 5d 20 5b 66 69 6c 65  Directory] [file
e6a0: 20 74 61 69 6c 20 24 66 69 6c 65 4e 61 6d 65 5d   tail $fileName]
e6b0: 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  ]..      }....  
e6c0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
e6d0: 4f 54 45 3a 20 43 68 65 63 6b 20 69 66 20 74 68  OTE: Check if th
e6e0: 65 20 66 69 6c 65 20 73 74 69 6c 6c 20 65 78 69  e file still exi
e6f0: 73 74 73 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  sts...      #.. 
e700: 20 20 20 20 20 69 66 20 7b 21 24 69 73 4d 65 6d       if {!$isMem
e710: 6f 72 79 20 26 26 20 24 64 65 6c 65 74 65 20 26  ory && $delete &
e720: 26 20 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24  & [file exists $
e730: 66 69 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20  fileName]} then 
e740: 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
e750: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 6b        # NOTE: Sk
e760: 69 70 20 64 65 6c 65 74 69 6e 67 20 64 61 74 61  ip deleting data
e770: 62 61 73 65 20 66 69 6c 65 73 20 69 66 20 73 6f  base files if so
e780: 6d 65 62 6f 64 79 20 73 65 74 73 20 74 68 65 20  mebody sets the 
e790: 67 6c 6f 62 61 6c 0d 0a 20 20 20 20 20 20 20 20  global..        
e7a0: 23 20 20 20 20 20 20 20 76 61 72 69 61 62 6c 65  #       variable
e7b0: 20 74 6f 20 70 72 65 76 65 6e 74 20 69 74 2e 0d   to prevent it..
e7c0: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
e7d0: 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65      if {![info e
e7e0: 78 69 73 74 73 20 3a 3a 6e 6f 28 63 6c 65 61 6e  xists ::no(clean
e7f0: 75 70 44 62 46 69 6c 65 29 5d 7d 20 74 68 65 6e  upDbFile)]} then
e800: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d   {..          #.
e810: 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54  .          # NOT
e820: 45 3a 20 41 74 74 65 6d 70 74 20 74 6f 20 64 65  E: Attempt to de
e830: 6c 65 74 65 20 74 68 65 20 74 65 73 74 20 64 61  lete the test da
e840: 74 61 62 61 73 65 20 66 69 6c 65 20 6e 6f 77 2e  tabase file now.
e850: 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20  ..          #.. 
e860: 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73 65           if {[se
e870: 74 20 63 6f 64 65 20 5b 63 61 74 63 68 20 7b 66  t code [catch {f
e880: 69 6c 65 20 64 65 6c 65 74 65 20 24 66 69 6c 65  ile delete $file
e890: 4e 61 6d 65 7d 20 65 72 72 6f 72 5d 5d 7d 20 74  Name} error]]} t
e8a0: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
e8b0: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
e8c0: 20 20 23 20 4e 4f 54 45 3a 20 57 65 20 73 6f 6d    # NOTE: We som
e8d0: 65 68 6f 77 20 66 61 69 6c 65 64 20 74 6f 20 64  ehow failed to d
e8e0: 65 6c 65 74 65 20 74 68 65 20 66 69 6c 65 2c 20  elete the file, 
e8f0: 72 65 70 6f 72 74 20 77 68 79 2e 0d 0a 20 20 20  report why...   
e900: 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
e910: 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
e920: 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61  :test_channel [a
e930: 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
e940: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 3d 3d               "==
e950: 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c  == WARNING: fail
e960: 65 64 20 74 6f 20 64 65 6c 65 74 65 20 64 61 74  ed to delete dat
e970: 61 62 61 73 65 20 66 69 6c 65 20 5c 22 22 20 24  abase file \"" $
e980: 66 69 6c 65 4e 61 6d 65 20 5c 0d 0a 20 20 20 20  fileName \..    
e990: 20 20 20 20 20 20 20 20 20 20 20 20 22 5c 22 20              "\" 
e9a0: 64 75 72 69 6e 67 20 63 6c 65 61 6e 75 70 2c 20  during cleanup, 
e9b0: 65 72 72 6f 72 3a 20 22 20 5c 6e 5c 74 20 24 65  error: " \n\t $e
e9c0: 72 72 6f 72 20 5c 6e 5d 0d 0a 20 20 20 20 20 20  rror \n]..      
e9d0: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d      }..        }
e9e0: 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
e9f0: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
ea00: 23 20 4e 4f 54 45 3a 20 53 68 6f 77 20 74 68 61  # NOTE: Show tha
ea10: 74 20 77 65 20 73 6b 69 70 70 65 64 20 64 65 6c  t we skipped del
ea20: 65 74 69 6e 67 20 74 68 65 20 66 69 6c 65 2e 0d  eting the file..
ea30: 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
ea40: 20 20 20 20 20 20 20 20 73 65 74 20 63 6f 64 65          set code
ea50: 20 30 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   0....          
ea60: 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
ea70: 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
ea80: 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
ea90: 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47     "==== WARNING
eaa0: 3a 20 73 6b 69 70 70 65 64 20 64 65 6c 65 74 69  : skipped deleti
eab0: 6e 67 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ng database file
eac0: 20 5c 22 22 20 24 66 69 6c 65 4e 61 6d 65 20 5c   \"" $fileName \
ead0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
eae0: 22 5c 22 20 64 75 72 69 6e 67 20 63 6c 65 61 6e  "\" during clean
eaf0: 75 70 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20  up\n"]..        
eb00: 7d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20  }..      } else 
eb10: 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
eb20: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68        # NOTE: Th
eb30: 65 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20  e file does not 
eb40: 65 78 69 73 74 2c 20 73 75 63 63 65 73 73 21 0d  exist, success!.
eb50: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
eb60: 20 20 20 20 73 65 74 20 63 6f 64 65 20 30 0d 0a      set code 0..
eb70: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
eb80: 20 72 65 74 75 72 6e 20 24 63 6f 64 65 0d 0a 20   return $code.. 
eb90: 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
eba0: 63 20 73 65 74 75 70 44 62 49 6e 74 65 72 72 75  c setupDbInterru
ebb0: 70 74 43 61 6c 6c 62 61 63 6b 20 7b 20 63 68 61  ptCallback { cha
ebc0: 6e 6e 65 6c 20 6c 6f 67 20 7d 20 7b 0d 0a 20 20  nnel log } {..  
ebd0: 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
ebe0: 65 6c 20 22 2d 2d 2d 2d 20 73 65 74 74 69 6e 67  el "---- setting
ebf0: 20 75 70 20 64 65 62 75 67 67 65 72 20 69 6e 74   up debugger int
ec00: 65 72 72 75 70 74 20 63 61 6c 6c 62 61 63 6b 2e  errupt callback.
ec10: 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 20 20 69 66  .. "....      if
ec20: 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20   {[catch {..    
ec30: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
ec40: 20 4e 4f 54 45 3a 20 4d 61 6b 65 20 73 75 72 65   NOTE: Make sure
ec50: 20 74 68 65 20 73 63 72 69 70 74 20 64 65 62 75   the script debu
ec60: 67 67 65 72 20 61 6e 64 20 74 68 65 20 69 73 6f  gger and the iso
ec70: 6c 61 74 65 64 20 69 6e 74 65 72 70 72 65 74 65  lated interprete
ec80: 72 20 61 72 65 0d 0a 20 20 20 20 20 20 20 20 23  r are..        #
ec90: 20 20 20 20 20 20 20 73 65 74 75 70 20 61 6e 64         setup and
eca0: 20 72 65 61 64 79 20 66 6f 72 20 75 73 65 2e 0d   ready for use..
ecb0: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
ecc0: 20 20 20 20 64 65 62 75 67 20 73 65 74 75 70 20      debug setup 
ecd0: 74 72 75 65 20 74 72 75 65 0d 0a 0d 0a 20 20 20  true true....   
ece0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
ecf0: 23 20 4e 4f 54 45 3a 20 4c 6f 61 64 20 74 68 65  # NOTE: Load the
ed00: 20 6e 65 63 65 73 73 61 72 79 20 70 61 63 6b 61   necessary packa
ed10: 67 65 73 20 69 6e 74 6f 20 74 68 65 20 69 73 6f  ges into the iso
ed20: 6c 61 74 65 64 20 69 6e 74 65 72 70 72 65 74 65  lated interprete
ed30: 72 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  r...        #.. 
ed40: 20 20 20 20 20 20 20 64 65 62 75 67 20 65 76 61         debug eva
ed50: 6c 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 70  l {..          p
ed60: 61 63 6b 61 67 65 20 72 65 71 75 69 72 65 20 45  ackage require E
ed70: 61 67 6c 65 0d 0a 20 20 20 20 20 20 20 20 20 20  agle..          
ed80: 70 61 63 6b 61 67 65 20 72 65 71 75 69 72 65 20  package require 
ed90: 45 61 67 6c 65 2e 4c 69 62 72 61 72 79 0d 0a 20  Eagle.Library.. 
eda0: 20 20 20 20 20 20 20 20 20 70 61 63 6b 61 67 65           package
edb0: 20 72 65 71 75 69 72 65 20 45 61 67 6c 65 2e 54   require Eagle.T
edc0: 65 73 74 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  est..        }..
edd0: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
ede0: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 6f 70       # NOTE: Cop
edf0: 79 20 74 68 65 20 6e 65 63 65 73 73 61 72 79 20  y the necessary 
ee00: 76 61 72 69 61 62 6c 65 73 20 69 6e 74 6f 20 74  variables into t
ee10: 68 65 20 69 73 6f 6c 61 74 65 64 20 69 6e 74 65  he isolated inte
ee20: 72 70 72 65 74 65 72 2e 0d 0a 20 20 20 20 20 20  rpreter...      
ee30: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 64 65 62    #..        deb
ee40: 75 67 20 69 6e 76 6f 6b 65 20 30 20 73 65 74 20  ug invoke 0 set 
ee50: 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 24  ::test_channel $
ee60: 63 68 61 6e 6e 65 6c 3b 20 23 20 4e 4f 54 45 3a  channel; # NOTE:
ee70: 20 46 6f 72 20 5b 74 70 75 74 73 5d 2e 0d 0a 20   For [tputs]... 
ee80: 20 20 20 20 20 20 20 64 65 62 75 67 20 69 6e 76         debug inv
ee90: 6f 6b 65 20 30 20 73 65 74 20 3a 3a 74 65 73 74  oke 0 set ::test
eea0: 5f 6c 6f 67 20 24 6c 6f 67 3b 20 23 20 4e 4f 54  _log $log; # NOT
eeb0: 45 3a 20 46 6f 72 20 5b 74 6c 6f 67 5d 2e 0d 0a  E: For [tlog]...
eec0: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
eed0: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 6e 73       # NOTE: Ins
eee0: 74 61 6c 6c 20 74 68 65 20 63 61 6c 6c 62 61 63  tall the callbac
eef0: 6b 20 73 63 72 69 70 74 20 74 6f 20 62 65 20 65  k script to be e
ef00: 76 61 6c 75 61 74 65 64 20 69 6e 20 74 68 65 20  valuated in the 
ef10: 69 73 6f 6c 61 74 65 64 0d 0a 20 20 20 20 20 20  isolated..      
ef20: 20 20 23 20 20 20 20 20 20 20 69 6e 74 65 72 70    #       interp
ef30: 72 65 74 65 72 20 77 68 65 6e 20 74 68 69 73 20  reter when this 
ef40: 69 6e 74 65 72 70 72 65 74 65 72 20 69 73 20 69  interpreter is i
ef50: 6e 74 65 72 72 75 70 74 65 64 20 62 79 20 73 63  nterrupted by sc
ef60: 72 69 70 74 0d 0a 20 20 20 20 20 20 20 20 23 20  ript..        # 
ef70: 20 20 20 20 20 20 63 61 6e 63 65 6c 6c 61 74 69        cancellati
ef80: 6f 6e 2c 20 65 74 63 2e 0d 0a 20 20 20 20 20 20  on, etc...      
ef90: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 64 65 62    #..        deb
efa0: 75 67 20 63 61 6c 6c 62 61 63 6b 20 61 70 70 6c  ug callback appl
efb0: 79 20 7b 7b 73 65 6e 64 65 72 20 65 7d 20 7b 0d  y {{sender e} {.
efc0: 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
efd0: 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
efe0: 43 68 65 63 6b 20 69 66 20 74 68 69 73 20 63 61  Check if this ca
eff0: 6c 6c 62 61 63 6b 20 69 73 20 6f 6e 65 20 74 68  llback is one th
f000: 61 74 20 77 65 20 63 61 72 65 20 61 62 6f 75 74  at we care about
f010: 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a  ...          #..
f020: 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 22 43            if {"C
f030: 61 6e 63 65 6c 65 64 22 20 69 6e 20 5b 73 70 6c  anceled" in [spl
f040: 69 74 20 5b 24 65 20 49 6e 74 65 72 72 75 70 74  it [$e Interrupt
f050: 54 79 70 65 5d 20 22 2c 20 22 5d 7d 20 74 68 65  Type] ", "]} the
f060: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
f070: 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   #..            
f080: 23 20 4e 4f 54 45 3a 20 49 74 65 72 61 74 65 20  # NOTE: Iterate 
f090: 74 68 72 6f 75 67 68 20 61 6c 6c 20 64 61 74 61  through all data
f0a0: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  base connections
f0b0: 20 6b 6e 6f 77 6e 20 74 6f 20 74 68 65 0d 0a 20   known to the.. 
f0c0: 20 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20             #    
f0d0: 20 20 20 70 61 72 65 6e 74 20 69 6e 74 65 72 70     parent interp
f0e0: 72 65 74 65 72 2e 0d 0a 20 20 20 20 20 20 20 20  reter...        
f0f0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
f100: 20 20 20 6f 62 6a 65 63 74 20 66 6f 72 65 61 63     object foreac
f110: 68 20 2d 61 6c 69 61 73 20 70 61 69 72 20 5c 0d  h -alias pair \.
f120: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
f130: 20 5b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20   [object invoke 
f140: 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69  -flags +NonPubli
f150: 63 20 24 65 20 49 6e 74 65 72 70 72 65 74 65 72  c $e Interpreter
f160: 2e 63 6f 6e 6e 65 63 74 69 6f 6e 73 5d 20 7b 0d  .connections] {.
f170: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23  .              #
f180: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
f190: 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74 20  # NOTE: Attempt 
f1a0: 74 6f 20 63 61 6e 63 65 6c 20 61 6e 79 20 53 51  to cancel any SQ
f1b0: 4c 20 71 75 65 72 69 65 73 20 69 6e 20 70 72 6f  L queries in pro
f1c0: 67 72 65 73 73 20 6f 6e 20 74 68 69 73 0d 0a 20  gress on this.. 
f1d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20 20               #  
f1e0: 20 20 20 20 20 64 61 74 61 62 61 73 65 20 63 6f       database co
f1f0: 6e 6e 65 63 74 69 6f 6e 2e 0d 0a 20 20 20 20 20  nnection...     
f200: 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
f210: 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63            if {[c
f220: 61 74 63 68 20 7b 24 70 61 69 72 20 56 61 6c 75  atch {$pair Valu
f230: 65 2e 43 61 6e 63 65 6c 7d 20 65 72 72 6f 72 5d  e.Cancel} error]
f240: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
f250: 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
f260: 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
f270: 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 6e 20 5c  [appendArgs \n \
f280: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
f290: 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e        "==== WARN
f2a0: 49 4e 47 3a 20 66 61 69 6c 65 64 20 74 6f 20 63  ING: failed to c
f2b0: 61 6e 63 65 6c 20 71 75 65 72 79 20 66 6f 72 20  ancel query for 
f2c0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 5c 22 22 20 5c  connection \"" \
f2d0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
f2e0: 20 20 20 20 20 20 5b 24 70 61 69 72 20 4b 65 79        [$pair Key
f2f0: 5d 20 22 5c 22 2c 20 65 72 72 6f 72 3a 20 22 20  ] "\", error: " 
f300: 5c 6e 5c 74 20 24 65 72 72 6f 72 20 5c 6e 5d 0d  \n\t $error \n].
f310: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
f320: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
f330: 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  .          }..  
f340: 20 20 20 20 20 20 7d 7d 0d 0a 20 20 20 20 20 20        }}..      
f350: 7d 20 65 72 72 6f 72 5d 20 3d 3d 20 30 7d 20 74  } error] == 0} t
f360: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 61  hen {..        a
f370: 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 69 6e 74  ddConstraint int
f380: 65 72 72 75 70 74 43 61 6c 6c 62 61 63 6b 2e 73  erruptCallback.s
f390: 71 6c 69 74 65 33 0d 0a 0d 0a 20 20 20 20 20 20  qlite3....      
f3a0: 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
f3b0: 20 79 65 73 5c 6e 0d 0a 20 20 20 20 20 20 7d 20   yes\n..      } 
f3c0: 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
f3d0: 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b  tputs $channel [
f3e0: 61 70 70 65 6e 64 41 72 67 73 20 22 6e 6f 2c 20  appendArgs "no, 
f3f0: 65 72 72 6f 72 3a 20 22 20 5c 6e 5c 74 20 24 65  error: " \n\t $e
f400: 72 72 6f 72 20 5c 6e 5d 0d 0a 20 20 20 20 20 20  rror \n]..      
f410: 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  }..    }.....   
f420: 20 70 72 6f 63 20 63 6c 65 61 6e 75 70 46 69 6c   proc cleanupFil
f430: 65 20 7b 20 66 69 6c 65 4e 61 6d 65 20 7b 63 6f  e { fileName {co
f440: 6c 6c 65 63 74 20 74 72 75 65 7d 20 7b 66 6f 72  llect true} {for
f450: 63 65 20 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a 20  ce false} } {.. 
f460: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
f470: 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74 20 74 6f  NOTE: Attempt to
f480: 20 66 6f 72 63 65 20 61 6c 6c 20 70 65 6e 64 69   force all pendi
f490: 6e 67 20 22 67 61 72 62 61 67 65 22 20 6f 62 6a  ng "garbage" obj
f4a0: 65 63 74 73 20 74 6f 20 62 65 20 63 6f 6c 6c 65  ects to be colle
f4b0: 63 74 65 64 2c 0d 0a 20 20 20 20 20 20 23 20 20  cted,..      #  
f4c0: 20 20 20 20 20 69 6e 63 6c 75 64 69 6e 67 20 53       including S
f4d0: 51 4c 69 74 65 20 73 74 61 74 65 6d 65 6e 74 73  QLite statements
f4e0: 20 61 6e 64 20 62 61 63 6b 75 70 20 6f 62 6a 65   and backup obje
f4f0: 63 74 73 3b 20 74 68 69 73 20 73 68 6f 75 6c 64  cts; this should
f500: 20 61 6c 6c 6f 77 0d 0a 20 20 20 20 20 20 23 20   allow..      # 
f510: 20 20 20 20 20 20 74 68 65 20 75 6e 64 65 72 6c        the underl
f520: 79 69 6e 67 20 64 61 74 61 62 61 73 65 20 66 69  ying database fi
f530: 6c 65 20 74 6f 20 62 65 20 64 65 6c 65 74 65 64  le to be deleted
f540: 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
f550: 20 20 69 66 20 7b 24 63 6f 6c 6c 65 63 74 7d 20    if {$collect} 
f560: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
f570: 63 6f 6c 6c 65 63 74 47 61 72 62 61 67 65 20 24  collectGarbage $
f580: 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 0d 0a  ::test_channel..
f590: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
f5a0: 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
f5b0: 3a 20 43 68 65 63 6b 20 69 66 20 74 68 65 20 66  : Check if the f
f5c0: 69 6c 65 20 73 74 69 6c 6c 20 65 78 69 73 74 73  ile still exists
f5d0: 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
f5e0: 20 20 69 66 20 7b 5b 66 69 6c 65 20 65 78 69 73    if {[file exis
f5f0: 74 73 20 24 66 69 6c 65 4e 61 6d 65 5d 7d 20 74  ts $fileName]} t
f600: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  hen {..        #
f610: 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
f620: 3a 20 53 6b 69 70 20 64 65 6c 65 74 69 6e 67 20  : Skip deleting 
f630: 74 65 73 74 20 66 69 6c 65 73 20 69 66 20 73 6f  test files if so
f640: 6d 65 62 6f 64 79 20 73 65 74 73 20 74 68 65 20  mebody sets the 
f650: 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 0d  global variable.
f660: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
f670: 20 74 6f 20 70 72 65 76 65 6e 74 20 69 74 2e 0d   to prevent it..
f680: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
f690: 20 20 20 20 69 66 20 7b 24 66 6f 72 63 65 20 7c      if {$force |
f6a0: 7c 20 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20  | ![info exists 
f6b0: 3a 3a 6e 6f 28 63 6c 65 61 6e 75 70 46 69 6c 65  ::no(cleanupFile
f6c0: 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  )]} then {..    
f6d0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
f6e0: 20 20 20 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d     # NOTE: Attem
f6f0: 70 74 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65  pt to delete the
f700: 20 74 65 73 74 20 66 69 6c 65 20 6e 6f 77 2e 0d   test file now..
f710: 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
f720: 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73 65 74          if {[set
f730: 20 63 6f 64 65 20 5b 63 61 74 63 68 20 7b 66 69   code [catch {fi
f740: 6c 65 20 64 65 6c 65 74 65 20 24 66 69 6c 65 4e  le delete $fileN
f750: 61 6d 65 7d 20 65 72 72 6f 72 5d 5d 7d 20 74 68  ame} error]]} th
f760: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
f770: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20    #..           
f780: 20 23 20 4e 4f 54 45 3a 20 57 65 20 73 6f 6d 65   # NOTE: We some
f790: 68 6f 77 20 66 61 69 6c 65 64 20 74 6f 20 64 65  how failed to de
f7a0: 6c 65 74 65 20 74 68 65 20 66 69 6c 65 2c 20 72  lete the file, r
f7b0: 65 70 6f 72 74 20 77 68 79 2e 0d 0a 20 20 20 20  eport why...    
f7c0: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
f7d0: 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
f7e0: 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70  test_channel [ap
f7f0: 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
f800: 20 20 20 20 20 20 20 20 20 20 20 20 22 3d 3d 3d              "===
f810: 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65  = WARNING: faile
f820: 64 20 74 6f 20 64 65 6c 65 74 65 20 74 65 73 74  d to delete test
f830: 20 66 69 6c 65 20 5c 22 22 20 24 66 69 6c 65 4e   file \"" $fileN
f840: 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ame \..         
f850: 20 20 20 20 20 20 20 22 5c 22 20 64 75 72 69 6e         "\" durin
f860: 67 20 63 6c 65 61 6e 75 70 2c 20 65 72 72 6f 72  g cleanup, error
f870: 3a 20 22 20 5c 6e 5c 74 20 24 65 72 72 6f 72 20  : " \n\t $error 
f880: 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  \n]..          }
f890: 0d 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65  ..        } else
f8a0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d   {..          #.
f8b0: 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54  .          # NOT
f8c0: 45 3a 20 53 68 6f 77 20 74 68 61 74 20 77 65 20  E: Show that we 
f8d0: 73 6b 69 70 70 65 64 20 64 65 6c 65 74 69 6e 67  skipped deleting
f8e0: 20 74 68 65 20 66 69 6c 65 2e 0d 0a 20 20 20 20   the file...    
f8f0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
f900: 20 20 20 73 65 74 20 63 6f 64 65 20 30 0d 0a 0d     set code 0...
f910: 0a 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73  .          tputs
f920: 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
f930: 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
f940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 3d                "=
f950: 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 73 6b 69  === WARNING: ski
f960: 70 70 65 64 20 64 65 6c 65 74 69 6e 67 20 74 65  pped deleting te
f970: 73 74 20 66 69 6c 65 20 5c 22 22 20 24 66 69 6c  st file \"" $fil
f980: 65 4e 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20 20  eName \..       
f990: 20 20 20 20 20 20 20 22 5c 22 20 64 75 72 69 6e         "\" durin
f9a0: 67 20 63 6c 65 61 6e 75 70 5c 6e 22 5d 0d 0a 20  g cleanup\n"].. 
f9b0: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
f9c0: 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
f9d0: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
f9e0: 4f 54 45 3a 20 54 68 65 20 66 69 6c 65 20 64 6f  OTE: The file do
f9f0: 65 73 20 6e 6f 74 20 65 78 69 73 74 2c 20 73 75  es not exist, su
fa00: 63 63 65 73 73 21 0d 0a 20 20 20 20 20 20 20 20  ccess!..        
fa10: 23 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 63  #..        set c
fa20: 6f 64 65 20 30 0d 0a 20 20 20 20 20 20 7d 0d 0a  ode 0..      }..
fa30: 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 24  ..      return $
fa40: 63 6f 64 65 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a  code..    }.....
fa50: 20 20 20 20 70 72 6f 63 20 63 6f 6c 6c 65 63 74      proc collect
fa60: 47 61 72 62 61 67 65 20 7b 20 63 68 61 6e 6e 65  Garbage { channe
fa70: 6c 20 7b 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20  l {milliseconds 
fa80: 31 30 30 30 7d 20 7b 71 75 69 65 74 20 74 72 75  1000} {quiet tru
fa90: 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 69 66  e} } {..      if
faa0: 20 7b 5b 63 61 74 63 68 20 7b 6f 62 6a 65 63 74   {[catch {object
fab0: 20 69 6e 76 6f 6b 65 20 47 43 20 47 65 74 54 6f   invoke GC GetTo
fac0: 74 61 6c 4d 65 6d 6f 72 79 20 66 61 6c 73 65 7d  talMemory false}
fad0: 20 72 65 73 75 6c 74 5d 20 3d 3d 20 30 7d 20 74   result] == 0} t
fae0: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 69  hen {..        i
faf0: 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e  f {!$quiet} then
fb00: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70   {..          tp
fb10: 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70  uts $channel [ap
fb20: 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
fb30: 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
fb40: 6d 65 6d 6f 72 79 20 69 6e 20 75 73 65 20 62 79  memory in use by
fb50: 20 74 68 65 20 43 4c 52 20 62 65 66 6f 72 65 20   the CLR before 
fb60: 63 6f 6c 6c 65 63 74 69 6f 6e 2e 2e 2e 20 22 20  collection... " 
fb70: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
fb80: 20 24 72 65 73 75 6c 74 20 22 20 62 79 74 65 73   $result " bytes
fb90: 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d  \n"]..        }.
fba0: 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d  .      } else {.
fbb0: 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24  .        tputs $
fbc0: 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
fbd0: 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
fbe0: 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47     "==== WARNING
fbf0: 3a 20 66 61 69 6c 65 64 20 74 6f 20 67 65 74 20  : failed to get 
fc00: 43 4c 52 20 6d 65 6d 6f 72 79 20 75 73 61 67 65  CLR memory usage
fc10: 2c 20 65 72 72 6f 72 3a 20 22 20 5c 0d 0a 20 20  , error: " \..  
fc20: 20 20 20 20 20 20 20 20 20 20 5c 6e 5c 74 20 24            \n\t $
fc30: 72 65 73 75 6c 74 20 5c 6e 5d 0d 0a 20 20 20 20  result \n]..    
fc40: 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 23 23    }....      ###
fc50: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
fc60: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
fc70: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
fc80: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
fc90: 23 23 23 23 23 23 0d 0a 0d 0a 20 20 20 20 20 20  ######....      
fca0: 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
fcb0: 20 52 65 70 65 61 74 65 64 6c 79 20 61 74 74 65   Repeatedly atte
fcc0: 6d 70 74 20 74 6f 20 63 6f 6c 6c 65 63 74 20 67  mpt to collect g
fcd0: 61 72 62 61 67 65 20 75 6e 74 69 6c 20 74 68 65  arbage until the
fce0: 20 61 6c 6c 6f 74 74 65 64 20 6e 75 6d 62 65 72   allotted number
fcf0: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
fd00: 6f 66 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20  of milliseconds 
fd10: 68 61 73 20 65 6c 61 70 73 65 64 2e 20 20 41 6c  has elapsed.  Al
fd20: 77 61 79 73 20 61 74 74 65 6d 70 74 20 74 6f 20  ways attempt to 
fd30: 63 6f 6c 6c 65 63 74 20 67 61 72 62 61 67 65 0d  collect garbage.
fd40: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 61  .      #       a
fd50: 74 20 6c 65 61 73 74 20 6f 6e 63 65 2e 0d 0a 20  t least once... 
fd60: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 73 65       #..      se
fd70: 74 20 73 74 61 72 74 20 5b 63 6c 6f 63 6b 20 73  t start [clock s
fd80: 65 63 6f 6e 64 73 5d 0d 0a 20 20 20 20 20 20 73  econds]..      s
fd90: 65 74 20 73 74 6f 70 20 5b 65 78 70 72 20 7b 24  et stop [expr {$
fda0: 73 74 61 72 74 20 2b 20 28 24 6d 69 6c 6c 69 73  start + ($millis
fdb0: 65 63 6f 6e 64 73 20 2f 20 31 30 30 30 29 7d 5d  econds / 1000)}]
fdc0: 0d 0a 0d 0a 20 20 20 20 20 20 64 6f 20 7b 0d 0a  ....      do {..
fdd0: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
fde0: 20 20 20 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d     # NOTE: Attem
fdf0: 70 74 20 74 6f 20 66 6f 72 63 65 20 61 20 66 75  pt to force a fu
fe00: 6c 6c 20 67 61 72 62 61 67 65 20 63 6f 6c 6c 65  ll garbage colle
fe10: 63 74 69 6f 6e 20 6e 6f 77 2e 20 20 52 65 70 6f  ction now.  Repo
fe20: 72 74 20 61 6e 79 0d 0a 20 20 20 20 20 20 20 20  rt any..        
fe30: 23 20 20 20 20 20 20 20 65 72 72 6f 72 20 74 68  #       error th
fe40: 61 74 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65  at is encountere
fe50: 64 20 69 66 20 77 65 20 66 61 69 6c 2e 0d 0a 20  d if we fail... 
fe60: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
fe70: 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 6f 62    if {[catch {ob
fe80: 6a 65 63 74 20 69 6e 76 6f 6b 65 20 47 43 20 47  ject invoke GC G
fe90: 65 74 54 6f 74 61 6c 4d 65 6d 6f 72 79 20 74 72  etTotalMemory tr
fea0: 75 65 7d 20 65 72 72 6f 72 5d 7d 20 74 68 65 6e  ue} error]} then
feb0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70   {..          tp
fec0: 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70  uts $channel [ap
fed0: 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
fee0: 20 20 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20            "==== 
fef0: 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20  WARNING: failed 
ff00: 66 75 6c 6c 20 67 61 72 62 61 67 65 20 63 6f 6c  full garbage col
ff10: 6c 65 63 74 69 6f 6e 2c 20 65 72 72 6f 72 3a 20  lection, error: 
ff20: 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  " \..           
ff30: 20 20 20 5c 6e 5c 74 20 24 65 72 72 6f 72 20 5c     \n\t $error \
ff40: 6e 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d  n]..        }...
ff50: 0a 20 20 20 20 20 20 20 20 73 65 74 20 6e 6f 77  .        set now
ff60: 20 5b 63 6c 6f 63 6b 20 73 65 63 6f 6e 64 73 5d   [clock seconds]
ff70: 0d 0a 20 20 20 20 20 20 7d 20 77 68 69 6c 65 20  ..      } while 
ff80: 7b 24 73 74 61 72 74 20 3c 3d 20 24 6e 6f 77 20  {$start <= $now 
ff90: 26 26 20 24 6e 6f 77 20 3c 20 24 73 74 6f 70 7d  && $now < $stop}
ffa0: 0d 0a 0d 0a 20 20 20 20 20 20 23 23 23 23 23 23  ....      ######
ffb0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
ffc0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
ffd0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
ffe0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
fff0: 23 23 23 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20  ###....      if 
10000 7b 5b 63 61 74 63 68 20 7b 6f 62 6a 65 63 74 20  {[catch {object 
10010 69 6e 76 6f 6b 65 20 47 43 20 47 65 74 54 6f 74  invoke GC GetTot
10020 61 6c 4d 65 6d 6f 72 79 20 66 61 6c 73 65 7d 20  alMemory false} 
10030 72 65 73 75 6c 74 5d 20 3d 3d 20 30 7d 20 74 68  result] == 0} th
10040 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66  en {..        if
10050 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20   {!$quiet} then 
10060 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70 75  {..          tpu
10070 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70  ts $channel [app
10080 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
10090 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 6d           "---- m
100a0 65 6d 6f 72 79 20 69 6e 20 75 73 65 20 62 79 20  emory in use by 
100b0 74 68 65 20 43 4c 52 20 61 66 74 65 72 20 63 6f  the CLR after co
100c0 6c 6c 65 63 74 69 6f 6e 2e 2e 2e 20 22 20 5c 0d  llection... " \.
100d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 24  .              $
100e0 72 65 73 75 6c 74 20 22 20 62 79 74 65 73 5c 6e  result " bytes\n
100f0 22 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20  "]..        }.. 
10100 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
10110 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
10120 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
10130 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
10140 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20   "==== WARNING: 
10150 66 61 69 6c 65 64 20 74 6f 20 67 65 74 20 43 4c  failed to get CL
10160 52 20 6d 65 6d 6f 72 79 20 75 73 61 67 65 2c 20  R memory usage, 
10170 65 72 72 6f 72 3a 20 22 20 5c 0d 0a 20 20 20 20  error: " \..    
10180 20 20 20 20 20 20 20 20 5c 6e 5c 74 20 24 72 65          \n\t $re
10190 73 75 6c 74 20 5c 6e 5d 0d 0a 20 20 20 20 20 20  sult \n]..      
101a0 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  }..    }.....   
101b0 20 70 72 6f 63 20 67 65 74 53 51 4c 69 74 65 48   proc getSQLiteH
101c0 61 6e 64 6c 65 43 6f 75 6e 74 73 20 7b 20 63 68  andleCounts { ch
101d0 61 6e 6e 65 6c 20 7b 71 75 69 65 74 20 66 61 6c  annel {quiet fal
101e0 73 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 73  se} } {..      s
101f0 65 74 20 72 65 73 75 6c 74 20 5b 6c 69 73 74 5d  et result [list]
10200 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 68  ....      if {[h
10210 61 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 5c 0d  aveConstraint \.
10220 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64  .              d
10230 65 66 69 6e 65 43 6f 6e 73 74 61 6e 74 2e 53 79  efineConstant.Sy
10240 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
10250 2e 43 4f 55 4e 54 5f 48 41 4e 44 4c 45 5d 7d 20  .COUNT_HANDLE]} 
10260 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
10270 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
10280 45 3a 20 41 64 64 20 65 61 63 68 20 63 72 69 74  E: Add each crit
10290 69 63 61 6c 20 68 61 6e 64 6c 65 20 63 6f 75 6e  ical handle coun
102a0 74 20 74 6f 20 74 68 65 20 72 65 73 75 6c 74 69  t to the resulti
102b0 6e 67 20 6c 69 73 74 2e 0d 0a 20 20 20 20 20 20  ng list...      
102c0 20 20 23 0d 0a 20 20 20 20 20 20 20 20 66 6f 72    #..        for
102d0 65 61 63 68 20 6e 61 6d 65 20 5b 6c 69 73 74 20  each name [list 
102e0 63 6f 6e 6e 65 63 74 69 6f 6e 43 6f 75 6e 74 20  connectionCount 
102f0 73 74 61 74 65 6d 65 6e 74 43 6f 75 6e 74 20 62  statementCount b
10300 61 63 6b 75 70 43 6f 75 6e 74 5d 20 7b 0d 0a 20  ackupCount] {.. 
10310 20 20 20 20 20 20 20 20 20 73 65 74 20 76 61 6c           set val
10320 75 65 20 5b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b  ue [object invok
10330 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62  e -flags +NonPub
10340 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  lic \..         
10350 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61       System.Data
10360 2e 53 51 4c 69 74 65 2e 55 6e 73 61 66 65 4e 61  .SQLite.UnsafeNa
10370 74 69 76 65 4d 65 74 68 6f 64 73 20 24 6e 61 6d  tiveMethods $nam
10380 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  e]....          
10390 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65  if {!$quiet} the
103a0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
103b0 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
103c0 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
103d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
103e0 2d 2d 2d 2d 20 63 72 69 74 69 63 61 6c 20 68 61  ---- critical ha
103f0 6e 64 6c 65 20 63 6f 75 6e 74 20 5c 22 22 20 24  ndle count \"" $
10400 6e 61 6d 65 20 22 5c 22 20 69 73 20 22 20 24 76  name "\" is " $v
10410 61 6c 75 65 20 5c 6e 5d 0d 0a 20 20 20 20 20 20  alue \n]..      
10420 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
10430 20 20 20 6c 61 70 70 65 6e 64 20 72 65 73 75 6c     lappend resul
10440 74 20 24 76 61 6c 75 65 0d 0a 20 20 20 20 20 20  t $value..      
10450 20 20 7d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73    }..      } els
10460 65 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68  eif {!$quiet} th
10470 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d  en {..        #.
10480 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
10490 20 54 68 65 20 61 63 74 75 61 6c 20 68 61 6e 64   The actual hand
104a0 6c 65 20 63 6f 75 6e 74 73 20 61 72 65 20 6e 6f  le counts are no
104b0 74 20 61 76 61 69 6c 61 62 6c 65 3b 20 74 68 65  t available; the
104c0 72 65 66 6f 72 65 2c 20 6a 75 73 74 0d 0a 20 20  refore, just..  
104d0 20 20 20 20 20 20 23 20 20 20 20 20 20 20 72 65        #       re
104e0 74 75 72 6e 20 61 6e 20 65 6d 70 74 79 20 6c 69  turn an empty li
104f0 73 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  st...        #..
10500 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
10510 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 63 72 69  hannel "---- cri
10520 74 69 63 61 6c 20 68 61 6e 64 6c 65 20 63 6f 75  tical handle cou
10530 6e 74 73 20 75 6e 61 76 61 69 6c 61 62 6c 65 5c  nts unavailable\
10540 6e 22 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  n"..      }.... 
10550 20 20 20 20 20 72 65 74 75 72 6e 20 24 72 65 73       return $res
10560 75 6c 74 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20  ult..    }..... 
10570 20 20 20 70 72 6f 63 20 73 68 75 74 64 6f 77 6e     proc shutdown
10580 53 51 4c 69 74 65 20 7b 20 63 68 61 6e 6e 65 6c  SQLite { channel
10590 20 7b 66 6f 72 63 65 20 66 61 6c 73 65 7d 20 7b   {force false} {
105a0 71 75 69 65 74 20 66 61 6c 73 65 7d 20 7d 20 7b  quiet false} } {
105b0 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
105c0 20 23 20 4e 4f 54 45 3a 20 4d 61 6b 65 20 73 75   # NOTE: Make su
105d0 72 65 20 74 68 61 74 20 53 51 4c 69 74 65 20 63  re that SQLite c
105e0 6f 72 65 20 6c 69 62 72 61 72 79 20 69 73 20 63  ore library is c
105f0 6f 6d 70 6c 65 74 65 6c 79 20 73 68 75 74 64 6f  ompletely shutdo
10600 77 6e 2e 20 20 54 68 69 73 0d 0a 20 20 20 20 20  wn.  This..     
10610 20 23 20 20 20 20 20 20 20 69 73 20 75 73 65 64   #       is used
10620 20 62 79 20 74 65 73 74 73 20 74 68 61 74 20 63   by tests that c
10630 68 61 6e 67 65 20 63 6f 6e 66 69 67 75 72 61 74  hange configurat
10640 69 6f 6e 20 6f 70 74 69 6f 6e 73 20 61 6e 64 2f  ion options and/
10650 6f 72 20 74 68 6f 73 65 0d 0a 20 20 20 20 20 20  or those..      
10660 23 20 20 20 20 20 20 20 74 68 61 74 20 6e 65 65  #       that nee
10670 64 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 6c  d to make sure l
10680 6f 67 67 69 6e 67 20 69 73 20 69 6e 69 74 69 61  ogging is initia
10690 6c 69 7a 65 64 20 28 69 2e 65 2e 20 6a 75 73 74  lized (i.e. just
106a0 20 69 6e 20 63 61 73 65 0d 0a 20 20 20 20 20 20   in case..      
106b0 23 20 20 20 20 20 20 20 74 68 65 20 53 51 4c 69  #       the SQLi
106c0 74 65 20 63 6f 72 65 20 6c 69 62 72 61 72 79 20  te core library 
106d0 77 61 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20  was initialized 
106e0 69 6e 20 74 68 65 20 70 72 6f 63 65 73 73 20 70  in the process p
106f0 72 69 6f 72 20 74 6f 0d 0a 20 20 20 20 20 20 23  rior to..      #
10700 20 20 20 20 20 20 20 74 68 65 20 53 51 4c 69 74         the SQLit
10710 65 4c 6f 67 20 63 6c 61 73 73 20 62 65 69 6e 67  eLog class being
10720 20 61 62 6c 65 20 74 6f 20 73 65 74 75 70 20 69   able to setup i
10730 74 73 20 6c 6f 67 67 69 6e 67 20 63 61 6c 6c 62  ts logging callb
10740 61 63 6b 29 2e 0d 0a 20 20 20 20 20 20 23 20 20  ack)...      #  
10750 20 20 20 20 20 4e 6f 72 6d 61 6c 6c 79 2c 20 74       Normally, t
10760 68 69 73 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20  his should only 
10770 62 65 20 70 65 72 66 6f 72 6d 65 64 20 69 66 20  be performed if 
10780 53 51 4c 69 74 65 20 69 73 20 6c 6f 61 64 65 64  SQLite is loaded
10790 20 61 6e 64 0d 0a 20 20 20 20 20 20 23 20 20 20   and..      #   
107a0 20 20 20 20 72 65 61 64 79 20 66 6f 72 20 75 73      ready for us
107b0 65 20 62 79 20 74 68 65 20 74 65 73 74 20 73 75  e by the test su
107c0 69 74 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ite...      #.. 
107d0 20 20 20 20 20 69 66 20 7b 24 66 6f 72 63 65 20       if {$force 
107e0 7c 7c 20 5b 69 73 53 51 4c 69 74 65 52 65 61 64  || [isSQLiteRead
107f0 79 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  y]} then {..    
10800 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
10810 20 42 55 47 46 49 58 3a 20 42 65 66 6f 72 65 20   BUGFIX: Before 
10820 63 61 6c 6c 69 6e 67 20 74 68 65 20 6e 61 74 69  calling the nati
10830 76 65 20 73 68 75 74 64 6f 77 6e 20 66 75 6e 63  ve shutdown func
10840 74 69 6f 6e 2c 20 6d 61 6b 65 20 73 75 72 65 20  tion, make sure 
10850 62 6f 74 68 0d 0a 20 20 20 20 20 20 20 20 23 20  both..        # 
10860 20 20 20 20 20 20 20 20 6f 66 20 74 68 65 20 50          of the P
10870 52 41 47 4d 41 20 72 65 6c 61 74 65 64 20 64 69  RAGMA related di
10880 72 65 63 74 6f 72 79 20 6e 61 6d 65 73 20 61 72  rectory names ar
10890 65 20 66 72 65 65 64 2e 0d 0a 20 20 20 20 20 20  e freed...      
108a0 20 20 23 0d 0a 20 20 20 20 20 20 20 20 63 68 65    #..        che
108b0 63 6b 46 6f 72 53 51 4c 69 74 65 44 69 72 65 63  ckForSQLiteDirec
108c0 74 6f 72 69 65 73 20 24 63 68 61 6e 6e 65 6c 20  tories $channel 
108d0 74 72 75 65 0d 0a 0d 0a 20 20 20 20 20 20 20 20  true....        
108e0 69 66 20 7b 5b 63 61 74 63 68 20 7b 6f 62 6a 65  if {[catch {obje
108f0 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73  ct invoke -flags
10900 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20   +NonPublic \.. 
10910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
10920 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
10930 65 2e 55 6e 73 61 66 65 4e 61 74 69 76 65 4d 65  e.UnsafeNativeMe
10940 74 68 6f 64 73 20 5c 0d 0a 20 20 20 20 20 20 20  thods \..       
10950 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
10960 5f 73 68 75 74 64 6f 77 6e 7d 20 72 65 73 75 6c  _shutdown} resul
10970 74 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d  t] == 0} then {.
10980 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21  .          if {!
10990 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a  $quiet} then {..
109a0 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
109b0 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  s $channel [appe
109c0 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
109d0 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
109e0 63 61 6c 6c 20 73 71 6c 69 74 65 33 5f 73 68 75  call sqlite3_shu
109f0 74 64 6f 77 6e 28 29 2e 2e 2e 20 6f 6b 3a 20 22  tdown()... ok: "
10a00 20 24 72 65 73 75 6c 74 20 5c 6e 5d 0d 0a 20 20   $result \n]..  
10a10 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
10a20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
10a30 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69         if {!$qui
10a40 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  et} then {..    
10a50 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
10a60 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
10a70 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
10a80 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 61 6c 6c        "---- call
10a90 20 73 71 6c 69 74 65 33 5f 73 68 75 74 64 6f 77   sqlite3_shutdow
10aa0 6e 28 29 2e 2e 2e 20 65 72 72 6f 72 3a 20 22 20  n()... error: " 
10ab0 5c 6e 5c 74 20 24 72 65 73 75 6c 74 20 5c 6e 5d  \n\t $result \n]
10ac0 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20  ..          }.. 
10ad0 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
10ae0 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  }..    }.....   
10af0 20 70 72 6f 63 20 72 65 70 6f 72 74 53 51 4c 69   proc reportSQLi
10b00 74 65 52 65 73 6f 75 72 63 65 73 20 7b 20 63 68  teResources { ch
10b10 61 6e 6e 65 6c 20 7b 71 75 69 65 74 20 66 61 6c  annel {quiet fal
10b20 73 65 7d 20 7b 63 6f 6c 6c 65 63 74 20 74 72 75  se} {collect tru
10b30 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d  e} } {..      #.
10b40 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53  .      # NOTE: S
10b50 6b 69 70 20 61 6c 6c 20 6f 75 74 70 75 74 20 69  kip all output i
10b60 66 20 77 65 20 61 72 65 20 72 75 6e 6e 69 6e 67  f we are running
10b70 20 69 6e 20 22 71 75 69 65 74 22 20 6d 6f 64 65   in "quiet" mode
10b80 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
10b90 20 20 69 66 20 7b 5b 68 61 76 65 43 6f 6e 73 74    if {[haveConst
10ba0 72 61 69 6e 74 20 5c 0d 0a 20 20 20 20 20 20 20  raint \..       
10bb0 20 20 20 20 20 20 20 64 65 66 69 6e 65 43 6f 6e         defineCon
10bc0 73 74 61 6e 74 2e 53 79 73 74 65 6d 2e 44 61 74  stant.System.Dat
10bd0 61 2e 53 51 4c 69 74 65 2e 49 4e 54 45 52 4f 50  a.SQLite.INTEROP
10be0 5f 56 49 52 54 55 41 4c 5f 54 41 42 4c 45 5d 20  _VIRTUAL_TABLE] 
10bf0 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  && \..          
10c00 5b 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74 20  [haveConstraint 
10c10 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
10c20 20 64 65 66 69 6e 65 43 6f 6e 73 74 61 6e 74 2e   defineConstant.
10c30 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
10c40 74 65 2e 54 52 41 43 4b 5f 4d 45 4d 4f 52 59 5f  te.TRACK_MEMORY_
10c50 42 59 54 45 53 5d 7d 20 74 68 65 6e 20 7b 0d 0a  BYTES]} then {..
10c60 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75          if {!$qu
10c70 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  iet} then {..   
10c80 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
10c90 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 63 75 72 72  annel "---- curr
10ca0 65 6e 74 20 6d 65 6d 6f 72 79 20 69 6e 20 75 73  ent memory in us
10cb0 65 20 62 79 20 53 51 4c 69 74 65 4d 65 6d 6f 72  e by SQLiteMemor
10cc0 79 2e 2e 2e 20 22 0d 0a 20 20 20 20 20 20 20 20  y... "..        
10cd0 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20  }....        if 
10ce0 7b 5b 63 61 74 63 68 20 7b 6f 62 6a 65 63 74 20  {[catch {object 
10cf0 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e  invoke -flags +N
10d00 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20  onPublic \..    
10d10 20 20 20 20 20 20 20 20 20 20 20 20 53 79 73 74              Syst
10d20 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 53  em.Data.SQLite.S
10d30 51 4c 69 74 65 4d 65 6d 6f 72 79 20 5c 0d 0a 20  QLiteMemory \.. 
10d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62                 b
10d50 79 74 65 73 41 6c 6c 6f 63 61 74 65 64 7d 20 6d  ytesAllocated} m
10d60 65 6d 6f 72 79 5d 20 3d 3d 20 30 7d 20 74 68 65  emory] == 0} the
10d70 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69  n {..          i
10d80 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e  f {!$quiet} then
10d90 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
10da0 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b  tputs $channel [
10db0 61 70 70 65 6e 64 41 72 67 73 20 24 6d 65 6d 6f  appendArgs $memo
10dc0 72 79 20 22 20 62 79 74 65 73 5c 6e 22 5d 0d 0a  ry " bytes\n"]..
10dd0 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
10de0 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
10df0 20 20 20 20 20 20 20 20 20 73 65 74 20 6d 65 6d           set mem
10e00 6f 72 79 20 75 6e 6b 6e 6f 77 6e 0d 0a 0d 0a 20  ory unknown.... 
10e10 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71           if {!$q
10e20 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  uiet} then {..  
10e30 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
10e40 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  $channel [append
10e50 41 72 67 73 20 24 6d 65 6d 6f 72 79 20 5c 6e 5d  Args $memory \n]
10e60 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20  ..          }.. 
10e70 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
10e80 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d      if {!$quiet}
10e90 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
10ea0 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
10eb0 6c 20 22 2d 2d 2d 2d 20 6d 61 78 69 6d 75 6d 20  l "---- maximum 
10ec0 6d 65 6d 6f 72 79 20 69 6e 20 75 73 65 20 62 79  memory in use by
10ed0 20 53 51 4c 69 74 65 4d 65 6d 6f 72 79 2e 2e 2e   SQLiteMemory...
10ee0 20 22 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d   "..        }...
10ef0 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61  .        if {[ca
10f00 74 63 68 20 7b 6f 62 6a 65 63 74 20 69 6e 76 6f  tch {object invo
10f10 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75  ke -flags +NonPu
10f20 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20 20 20  blic \..        
10f30 20 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44          System.D
10f40 61 74 61 2e 53 51 4c 69 74 65 2e 53 51 4c 69 74  ata.SQLite.SQLit
10f50 65 4d 65 6d 6f 72 79 20 5c 0d 0a 20 20 20 20 20  eMemory \..     
10f60 20 20 20 20 20 20 20 20 20 20 20 6d 61 78 69 6d             maxim
10f70 75 6d 42 79 74 65 73 41 6c 6c 6f 63 61 74 65 64  umBytesAllocated
10f80 7d 20 6d 65 6d 6f 72 79 5d 20 3d 3d 20 30 7d 20  } memory] == 0} 
10f90 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
10fa0 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74    if {!$quiet} t
10fb0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
10fc0 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
10fd0 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 24 6d  l [appendArgs $m
10fe0 65 6d 6f 72 79 20 22 20 62 79 74 65 73 5c 6e 22  emory " bytes\n"
10ff0 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  ]..          }..
11000 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b          } else {
11010 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20  ..          set 
11020 6d 65 6d 6f 72 79 20 75 6e 6b 6e 6f 77 6e 0d 0a  memory unknown..
11030 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b  ..          if {
11040 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d  !$quiet} then {.
11050 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75  .            tpu
11060 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70  ts $channel [app
11070 65 6e 64 41 72 67 73 20 24 6d 65 6d 6f 72 79 20  endArgs $memory 
11080 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  \n]..          }
11090 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20  ..        }..   
110a0 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 69 66     }....      if
110b0 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20   {!$quiet} then 
110c0 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73  {..        tputs
110d0 20 24 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20   $channel "---- 
110e0 63 75 72 72 65 6e 74 20 6d 65 6d 6f 72 79 20 69  current memory i
110f0 6e 20 75 73 65 20 62 79 20 53 51 4c 69 74 65 2e  n use by SQLite.
11100 2e 2e 20 22 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d  .. "..      }...
11110 0a 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63  .      if {[catc
11120 68 20 7b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65  h {object invoke
11130 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c   -flags +NonPubl
11140 69 63 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  ic \..          
11150 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e      System.Data.
11160 53 51 4c 69 74 65 2e 55 6e 73 61 66 65 4e 61 74  SQLite.UnsafeNat
11170 69 76 65 4d 65 74 68 6f 64 73 20 5c 0d 0a 20 20  iveMethods \..  
11180 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
11190 74 65 33 5f 6d 65 6d 6f 72 79 5f 75 73 65 64 7d  te3_memory_used}
111a0 20 6d 65 6d 6f 72 79 5d 20 3d 3d 20 30 7d 20 74   memory] == 0} t
111b0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 69  hen {..        i
111c0 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e  f {!$quiet} then
111d0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70   {..          tp
111e0 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70  uts $channel [ap
111f0 70 65 6e 64 41 72 67 73 20 24 6d 65 6d 6f 72 79  pendArgs $memory
11200 20 22 20 62 79 74 65 73 5c 6e 22 5d 0d 0a 20 20   " bytes\n"]..  
11210 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d        }..      }
11220 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
11230 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
11240 54 45 3a 20 4d 61 79 62 65 20 74 68 65 20 53 51  TE: Maybe the SQ
11250 4c 69 74 65 20 63 6f 72 65 20 6c 69 62 72 61 72  Lite core librar
11260 79 20 69 73 20 75 6e 61 76 61 69 6c 61 62 6c 65  y is unavailable
11270 3f 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ?..        #..  
11280 20 20 20 20 20 20 73 65 74 20 6d 65 6d 6f 72 79        set memory
11290 20 75 6e 6b 6e 6f 77 6e 0d 0a 0d 0a 20 20 20 20   unknown....    
112a0 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d      if {!$quiet}
112b0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
112c0 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
112d0 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 24 6d  l [appendArgs $m
112e0 65 6d 6f 72 79 20 5c 6e 5d 0d 0a 20 20 20 20 20  emory \n]..     
112f0 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d     }..      }...
11300 0a 20 20 20 20 20 20 73 65 74 20 72 65 73 75 6c  .      set resul
11310 74 20 24 6d 65 6d 6f 72 79 3b 20 23 20 4e 4f 54  t $memory; # NOT
11320 45 3a 20 52 65 74 75 72 6e 20 6d 65 6d 6f 72 79  E: Return memory
11330 20 69 6e 2d 75 73 65 20 74 6f 20 6f 75 72 20 63   in-use to our c
11340 61 6c 6c 65 72 2e 0d 0a 0d 0a 20 20 20 20 20 20  aller.....      
11350 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65  if {!$quiet} the
11360 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75  n {..        tpu
11370 74 73 20 24 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d  ts $channel "---
11380 2d 20 6d 61 78 69 6d 75 6d 20 6d 65 6d 6f 72 79  - maximum memory
11390 20 69 6e 20 75 73 65 20 62 79 20 53 51 4c 69 74   in use by SQLit
113a0 65 2e 2e 2e 20 22 0d 0a 20 20 20 20 20 20 7d 0d  e... "..      }.
113b0 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 63 61  ...      if {[ca
113c0 74 63 68 20 7b 6f 62 6a 65 63 74 20 69 6e 76 6f  tch {object invo
113d0 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75  ke -flags +NonPu
113e0 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20 20 20  blic \..        
113f0 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74        System.Dat
11400 61 2e 53 51 4c 69 74 65 2e 55 6e 73 61 66 65 4e  a.SQLite.UnsafeN
11410 61 74 69 76 65 4d 65 74 68 6f 64 73 20 5c 0d 0a  ativeMethods \..
11420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
11430 6c 69 74 65 33 5f 6d 65 6d 6f 72 79 5f 68 69 67  lite3_memory_hig
11440 68 77 61 74 65 72 20 30 7d 20 6d 65 6d 6f 72 79  hwater 0} memory
11450 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  ] == 0} then {..
11460 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75          if {!$qu
11470 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  iet} then {..   
11480 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
11490 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
114a0 73 20 24 6d 65 6d 6f 72 79 20 22 20 62 79 74 65  s $memory " byte
114b0 73 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20 7d  s\n"]..        }
114c0 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b  ..      } else {
114d0 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
114e0 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4d 61 79       # NOTE: May
114f0 62 65 20 74 68 65 20 53 51 4c 69 74 65 20 63 6f  be the SQLite co
11500 72 65 20 6c 69 62 72 61 72 79 20 69 73 20 75 6e  re library is un
11510 61 76 61 69 6c 61 62 6c 65 3f 0d 0a 20 20 20 20  available?..    
11520 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 73      #..        s
11530 65 74 20 6d 65 6d 6f 72 79 20 75 6e 6b 6e 6f 77  et memory unknow
11540 6e 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20  n....        if 
11550 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b  {!$quiet} then {
11560 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70 75 74  ..          tput
11570 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  s $channel [appe
11580 6e 64 41 72 67 73 20 24 6d 65 6d 6f 72 79 20 5c  ndArgs $memory \
11590 6e 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20  n]..        }.. 
115a0 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
115b0 69 66 20 7b 24 63 6f 6c 6c 65 63 74 7d 20 74 68  if {$collect} th
115c0 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 63 6f  en {..        co
115d0 6c 6c 65 63 74 47 61 72 62 61 67 65 20 24 63 68  llectGarbage $ch
115e0 61 6e 6e 65 6c 0d 0a 20 20 20 20 20 20 7d 0d 0a  annel..      }..
115f0 0d 0a 20 20 20 20 20 20 69 66 20 7b 21 24 71 75  ..      if {!$qu
11600 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  iet} then {..   
11610 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
11620 6e 65 6c 20 22 2d 2d 2d 2d 20 63 75 72 72 65 6e  nel "---- curren
11630 74 20 6d 65 6d 6f 72 79 20 69 6e 20 75 73 65 20  t memory in use 
11640 62 79 20 74 68 65 20 43 4c 52 2e 2e 2e 20 22 0d  by the CLR... ".
11650 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
11660 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 6f 62    if {[catch {ob
11670 6a 65 63 74 20 69 6e 76 6f 6b 65 20 47 43 20 47  ject invoke GC G
11680 65 74 54 6f 74 61 6c 4d 65 6d 6f 72 79 20 66 61  etTotalMemory fa
11690 6c 73 65 7d 20 6d 65 6d 6f 72 79 5d 20 3d 3d 20  lse} memory] == 
116a0 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
116b0 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 69     if {[string i
116c0 73 20 69 6e 74 65 67 65 72 20 2d 73 74 72 69 63  s integer -stric
116d0 74 20 24 6d 65 6d 6f 72 79 5d 7d 20 74 68 65 6e  t $memory]} then
116e0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66   {..          if
116f0 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20   {!$quiet} then 
11700 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  {..            t
11710 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61  puts $channel [a
11720 70 70 65 6e 64 41 72 67 73 20 24 6d 65 6d 6f 72  ppendArgs $memor
11730 79 20 22 20 62 79 74 65 73 5c 6e 22 5d 0d 0a 20  y " bytes\n"].. 
11740 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
11750 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
11760 20 20 20 20 20 20 20 20 73 65 74 20 6d 65 6d 6f          set memo
11770 72 79 20 69 6e 76 61 6c 69 64 0d 0a 0d 0a 20 20  ry invalid....  
11780 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75          if {!$qu
11790 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  iet} then {..   
117a0 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
117b0 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
117c0 72 67 73 20 24 6d 65 6d 6f 72 79 20 5c 6e 5d 0d  rgs $memory \n].
117d0 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  .          }..  
117e0 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d        }..      }
117f0 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
11800 20 73 65 74 20 6d 65 6d 6f 72 79 20 75 6e 6b 6e   set memory unkn
11810 6f 77 6e 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69  own....        i
11820 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e  f {!$quiet} then
11830 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70   {..          tp
11840 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70  uts $channel [ap
11850 70 65 6e 64 41 72 67 73 20 24 6d 65 6d 6f 72 79  pendArgs $memory
11860 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d   \n]..        }.
11870 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
11880 20 20 72 65 74 75 72 6e 20 24 72 65 73 75 6c 74    return $result
11890 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
118a0 70 72 6f 63 20 63 68 65 63 6b 46 6f 72 53 51 4c  proc checkForSQL
118b0 69 74 65 44 69 72 65 63 74 6f 72 69 65 73 20 7b  iteDirectories {
118c0 20 63 68 61 6e 6e 65 6c 20 7b 72 65 73 65 74 20   channel {reset 
118d0 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a 20 20 20 20  false} } {..    
118e0 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
118f0 45 3a 20 43 68 65 63 6b 20 69 66 20 74 68 65 20  E: Check if the 
11900 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 65  sqlite3_win32_se
11910 74 5f 64 69 72 65 63 74 6f 72 79 20 66 75 6e 63  t_directory func
11920 74 69 6f 6e 20 69 73 20 61 76 61 69 6c 61 62 6c  tion is availabl
11930 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  e...      #..   
11940 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
11950 6c 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 22  l \..          "
11960 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e 67 20 66 6f  ---- checking fo
11970 72 20 66 75 6e 63 74 69 6f 6e 20 73 71 6c 69 74  r function sqlit
11980 65 33 5f 77 69 6e 33 32 5f 73 65 74 5f 64 69 72  e3_win32_set_dir
11990 65 63 74 6f 72 79 2e 2e 2e 20 22 0d 0a 0d 0a 20  ectory... ".... 
119a0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
119b0 4e 4f 54 45 3a 20 54 68 69 73 20 63 61 6c 6c 20  NOTE: This call 
119c0 74 6f 20 74 68 65 20 73 71 6c 69 74 65 33 5f 77  to the sqlite3_w
119d0 69 6e 33 32 5f 73 65 74 5f 64 69 72 65 63 74 6f  in32_set_directo
119e0 72 79 20 66 75 6e 63 74 69 6f 6e 20 75 73 65 73  ry function uses
119f0 20 74 68 65 0d 0a 20 20 20 20 20 20 23 20 20 20   the..      #   
11a00 20 20 20 20 69 6e 76 61 6c 69 64 20 76 61 6c 75      invalid valu
11a10 65 20 30 20 66 6f 72 20 74 68 65 20 66 69 72 73  e 0 for the firs
11a20 74 20 61 72 67 75 6d 65 6e 74 2e 20 20 54 68 69  t argument.  Thi
11a30 73 20 63 6f 64 65 20 69 73 20 64 65 73 69 67 6e  s code is design
11a40 65 64 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  ed..      #     
11a50 20 20 74 6f 20 63 68 65 63 6b 20 69 66 20 63 61    to check if ca
11a60 6c 6c 69 6e 67 20 74 68 65 20 66 75 6e 63 74 69  lling the functi
11a70 6f 6e 20 77 69 6c 6c 20 72 61 69 73 65 20 61 6e  on will raise an
11a80 20 65 78 63 65 70 74 69 6f 6e 20 28 69 2e 65 2e   exception (i.e.
11a90 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
11aa0 74 68 65 20 61 63 74 75 61 6c 20 72 65 73 75 6c  the actual resul
11ab0 74 20 6f 66 20 74 68 65 20 66 75 6e 63 74 69 6f  t of the functio
11ac0 6e 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 74 65  n does not matte
11ad0 72 20 61 73 20 6c 6f 6e 67 20 61 73 20 6e 6f 0d  r as long as no.
11ae0 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 64  .      #       d
11af0 69 72 65 63 74 6f 72 79 20 69 73 20 63 68 61 6e  irectory is chan
11b00 67 65 64 29 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  ged)...      #..
11b10 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68        if {[catch
11b20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
11b30 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20    object invoke 
11b40 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69  -flags +NonPubli
11b50 63 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  c \..           
11b60 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53     System.Data.S
11b70 51 4c 69 74 65 2e 55 6e 73 61 66 65 4e 61 74 69  QLite.UnsafeNati
11b80 76 65 4d 65 74 68 6f 64 73 20 5c 0d 0a 20 20 20  veMethods \..   
11b90 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
11ba0 65 33 5f 77 69 6e 33 32 5f 73 65 74 5f 64 69 72  e3_win32_set_dir
11bb0 65 63 74 6f 72 79 20 30 20 6e 75 6c 6c 7d 5d 20  ectory 0 null}] 
11bc0 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  == 0} then {..  
11bd0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
11be0 20 23 20 4e 4f 54 45 3a 20 43 61 6c 6c 69 6e 67   # NOTE: Calling
11bf0 20 74 68 65 20 73 71 6c 69 74 65 33 5f 77 69 6e   the sqlite3_win
11c00 33 32 5f 73 65 74 5f 64 69 72 65 63 74 6f 72 79  32_set_directory
11c10 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e   function does n
11c20 6f 74 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  ot..        #   
11c30 20 20 20 20 63 61 75 73 65 20 61 6e 20 65 78 63      cause an exc
11c40 65 70 74 69 6f 6e 3b 20 74 68 65 72 65 66 6f 72  eption; therefor
11c50 65 2c 20 69 74 20 6d 75 73 74 20 62 65 20 61 76  e, it must be av
11c60 61 69 6c 61 62 6c 65 20 28 69 2e 65 2e 0d 0a 20  ailable (i.e... 
11c70 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 65         #       e
11c80 76 65 6e 20 74 68 6f 75 67 68 20 69 74 20 73 68  ven though it sh
11c90 6f 75 6c 64 20 72 65 74 75 72 6e 20 61 20 66 61  ould return a fa
11ca0 69 6c 75 72 65 20 72 65 74 75 72 6e 20 63 6f 64  ilure return cod
11cb0 65 20 69 6e 20 74 68 69 73 0d 0a 20 20 20 20 20  e in this..     
11cc0 20 20 20 23 20 20 20 20 20 20 20 63 61 73 65 29     #       case)
11cd0 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
11ce0 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61        addConstra
11cf0 69 6e 74 20 73 71 6c 69 74 65 33 5f 77 69 6e 33  int sqlite3_win3
11d00 32 5f 73 65 74 5f 64 69 72 65 63 74 6f 72 79 0d  2_set_directory.
11d10 0a 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73  ...        tputs
11d20 20 24 63 68 61 6e 6e 65 6c 20 79 65 73 5c 6e 0d   $channel yes\n.
11d30 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
11d40 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 44 6f        # NOTE: Do
11d50 65 73 20 6f 75 72 20 63 61 6c 6c 65 72 20 77 61  es our caller wa
11d60 6e 74 20 74 6f 20 72 65 73 65 74 20 74 68 65 20  nt to reset the 
11d70 64 69 72 65 63 74 6f 72 69 65 73 3f 0d 0a 20 20  directories?..  
11d80 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
11d90 20 69 66 20 7b 24 72 65 73 65 74 7d 20 74 68 65   if {$reset} the
11da0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 23  n {..          #
11db0 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f  ..          # NO
11dc0 54 45 3a 20 4e 6f 77 20 6d 61 6b 65 20 73 75 72  TE: Now make sur
11dd0 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61  e the database a
11de0 6e 64 20 74 65 6d 70 6f 72 61 72 79 20 64 69 72  nd temporary dir
11df0 65 63 74 6f 72 69 65 73 20 61 72 65 0d 0a 20 20  ectories are..  
11e00 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
11e10 72 65 73 65 74 20 74 68 65 69 72 20 64 65 66 61  reset their defa
11e20 75 6c 74 20 76 61 6c 75 65 73 2c 20 77 68 69 63  ult values, whic
11e30 68 20 73 68 6f 75 6c 64 20 62 65 20 6e 75 6c 6c  h should be null
11e40 20 66 6f 72 20 62 6f 74 68 2e 0d 0a 20 20 20 20   for both...    
11e50 20 20 20 20 20 20 23 20 20 20 20 20 20 20 53 69        #       Si
11e60 6e 63 65 20 74 68 65 20 73 71 6c 69 74 65 33 5f  nce the sqlite3_
11e70 77 69 6e 33 32 5f 73 65 74 5f 64 69 72 65 63 74  win32_set_direct
11e80 6f 72 79 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  ory function is 
11e90 61 76 61 69 6c 61 62 6c 65 2c 0d 0a 20 20 20 20  available,..    
11ea0 20 20 20 20 20 20 23 20 20 20 20 20 20 20 75 73        #       us
11eb0 65 20 69 74 2e 0d 0a 20 20 20 20 20 20 20 20 20  e it...         
11ec0 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 66 6f   #..          fo
11ed0 72 20 7b 73 65 74 20 69 6e 64 65 78 20 31 7d 20  r {set index 1} 
11ee0 7b 24 69 6e 64 65 78 20 3c 20 33 7d 20 7b 69 6e  {$index < 3} {in
11ef0 63 72 20 69 6e 64 65 78 7d 20 7b 0d 0a 20 20 20  cr index} {..   
11f00 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61           if {[ca
11f10 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  tch {..         
11f20 20 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63             objec
11f30 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20  t invoke -flags 
11f40 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20  +NonPublic \..  
11f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11f60 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51    System.Data.SQ
11f70 4c 69 74 65 2e 55 6e 73 61 66 65 4e 61 74 69 76  Lite.UnsafeNativ
11f80 65 4d 65 74 68 6f 64 73 20 5c 0d 0a 20 20 20 20  eMethods \..    
11f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11fa0 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 65  sqlite3_win32_se
11fb0 74 5f 64 69 72 65 63 74 6f 72 79 20 24 69 6e 64  t_directory $ind
11fc0 65 78 20 6e 75 6c 6c 7d 20 5c 0d 0a 20 20 20 20  ex null} \..    
11fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11fe0 72 65 73 75 6c 74 5d 20 3d 3d 20 30 7d 20 74 68  result] == 0} th
11ff0 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
12000 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
12010 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
12020 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
12030 20 20 20 20 22 2d 2d 2d 2d 20 63 61 6c 6c 20 73      "---- call s
12040 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 65 74  qlite3_win32_set
12050 5f 64 69 72 65 63 74 6f 72 79 28 22 20 24 69 6e  _directory(" $in
12060 64 65 78 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  dex \..         
12070 20 20 20 20 20 20 20 20 20 22 2c 20 6e 75 6c 6c           ", null
12080 29 2e 2e 2e 20 6f 6b 3a 20 22 20 24 72 65 73 75  )... ok: " $resu
12090 6c 74 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20  lt \n]..        
120a0 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
120b0 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
120c0 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  s $channel [appe
120d0 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
120e0 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
120f0 2d 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 5f 77  - call sqlite3_w
12100 69 6e 33 32 5f 73 65 74 5f 64 69 72 65 63 74 6f  in32_set_directo
12110 72 79 28 22 20 24 69 6e 64 65 78 20 5c 0d 0a 20  ry(" $index \.. 
12120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12130 20 22 2c 20 6e 75 6c 6c 29 2e 2e 2e 20 65 72 72   ", null)... err
12140 6f 72 3a 20 22 20 5c 6e 5c 74 20 24 72 65 73 75  or: " \n\t $resu
12150 6c 74 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20  lt \n]..        
12160 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
12170 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20   }..        }.. 
12180 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
12190 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
121a0 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d 0a 0d 0a 20 20  annel no\n....  
121b0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
121c0 20 23 20 4e 4f 54 45 3a 20 44 6f 65 73 20 6f 75   # NOTE: Does ou
121d0 72 20 63 61 6c 6c 65 72 20 77 61 6e 74 20 74 6f  r caller want to
121e0 20 72 65 73 65 74 20 74 68 65 20 64 69 72 65 63   reset the direc
121f0 74 6f 72 69 65 73 3f 20 20 54 68 69 73 20 63 61  tories?  This ca
12200 6e 20 6f 6e 6c 79 0d 0a 20 20 20 20 20 20 20 20  n only..        
12210 23 20 20 20 20 20 20 20 62 65 20 70 65 72 66 6f  #       be perfo
12220 72 6d 65 64 20 69 66 20 53 51 4c 69 74 65 20 69  rmed if SQLite i
12230 73 20 6c 6f 61 64 65 64 20 61 6e 64 20 72 65 61  s loaded and rea
12240 64 79 20 66 6f 72 20 75 73 65 20 62 79 20 74 68  dy for use by th
12250 65 20 74 65 73 74 0d 0a 20 20 20 20 20 20 20 20  e test..        
12260 23 20 20 20 20 20 20 20 73 75 69 74 65 2e 0d 0a  #       suite...
12270 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
12280 20 20 20 69 66 20 7b 24 72 65 73 65 74 20 26 26     if {$reset &&
12290 20 5b 69 73 53 51 4c 69 74 65 52 65 61 64 79 5d   [isSQLiteReady]
122a0 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
122b0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
122c0 20 23 20 4e 4f 54 45 3a 20 4e 6f 77 20 6d 61 6b   # NOTE: Now mak
122d0 65 20 73 75 72 65 20 74 68 65 20 64 61 74 61 62  e sure the datab
122e0 61 73 65 20 61 6e 64 20 74 65 6d 70 6f 72 61 72  ase and temporar
122f0 79 20 64 69 72 65 63 74 6f 72 69 65 73 20 61 72  y directories ar
12300 65 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 20  e..          #  
12310 20 20 20 20 20 72 65 73 65 74 20 74 68 65 69 72       reset their
12320 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 73 2c   default values,
12330 20 77 68 69 63 68 20 73 68 6f 75 6c 64 20 62 65   which should be
12340 20 6e 75 6c 6c 20 66 6f 72 20 62 6f 74 68 2e 0d   null for both..
12350 0a 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20  .          #    
12360 20 20 20 53 69 6e 63 65 20 74 68 65 20 73 71 6c     Since the sql
12370 69 74 65 33 5f 77 69 6e 33 32 5f 73 65 74 5f 64  ite3_win32_set_d
12380 69 72 65 63 74 6f 72 79 20 66 75 6e 63 74 69 6f  irectory functio
12390 6e 20 64 6f 65 73 20 6e 6f 74 0d 0a 20 20 20 20  n does not..    
123a0 20 20 20 20 20 20 23 20 20 20 20 20 20 20 61 70        #       ap
123b0 70 65 61 72 20 74 6f 20 62 65 20 61 76 61 69 6c  pear to be avail
123c0 61 62 6c 65 2c 20 75 73 65 20 74 68 65 20 61 73  able, use the as
123d0 73 6f 63 69 61 74 65 64 20 50 52 41 47 4d 41 20  sociated PRAGMA 
123e0 63 6f 6d 6d 61 6e 64 73 0d 0a 20 20 20 20 20 20  commands..      
123f0 20 20 20 20 23 20 20 20 20 20 20 20 69 6e 73 74      #       inst
12400 65 61 64 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  ead...          
12410 23 0d 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72  #..          for
12420 65 61 63 68 20 64 69 72 65 63 74 6f 72 79 20 5b  each directory [
12430 6c 69 73 74 20 64 61 74 61 5f 73 74 6f 72 65 5f  list data_store_
12440 64 69 72 65 63 74 6f 72 79 20 74 65 6d 70 5f 73  directory temp_s
12450 74 6f 72 65 5f 64 69 72 65 63 74 6f 72 79 5d 20  tore_directory] 
12460 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  {..            s
12470 65 74 20 73 71 6c 20 5b 61 70 70 65 6e 64 41 72  et sql [appendAr
12480 67 73 20 22 50 52 41 47 4d 41 20 22 20 24 64 69  gs "PRAGMA " $di
12490 72 65 63 74 6f 72 79 20 22 20 3d 20 5c 22 5c 22  rectory " = \"\"
124a0 3b 22 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  ;"]....         
124b0 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 65     if {[catch {e
124c0 78 65 63 75 74 65 53 71 6c 20 24 73 71 6c 7d 20  xecuteSql $sql} 
124d0 72 65 73 75 6c 74 5d 20 3d 3d 20 30 7d 20 74 68  result] == 0} th
124e0 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
124f0 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
12500 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
12510 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
12520 20 20 20 20 22 2d 2d 2d 2d 20 65 78 65 63 75 74      "---- execut
12530 65 20 50 52 41 47 4d 41 20 22 20 24 64 69 72 65  e PRAGMA " $dire
12540 63 74 6f 72 79 20 22 2e 2e 2e 20 6f 6b 3a 20 5c  ctory "... ok: \
12550 22 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  "" \..          
12560 20 20 20 20 20 20 20 20 24 72 65 73 75 6c 74 20          $result 
12570 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20  \"\n]..         
12580 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
12590 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
125a0 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e   $channel [appen
125b0 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
125c0 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
125d0 20 65 78 65 63 75 74 65 20 50 52 41 47 4d 41 20   execute PRAGMA 
125e0 22 20 24 64 69 72 65 63 74 6f 72 79 20 22 2e 2e  " $directory "..
125f0 2e 20 65 72 72 6f 72 3a 20 22 20 5c 0d 0a 20 20  . error: " \..  
12600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12610 5c 6e 5c 74 20 24 72 65 73 75 6c 74 20 5c 6e 5d  \n\t $result \n]
12620 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
12630 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  .          }..  
12640 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d        }..      }
12650 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  ....      #..   
12660 20 20 20 23 20 4e 4f 54 45 3a 20 46 69 6e 61 6c     # NOTE: Final
12670 6c 79 2c 20 73 68 6f 77 20 74 68 65 20 63 75 72  ly, show the cur
12680 72 65 6e 74 20 76 61 6c 75 65 20 6f 66 20 74 68  rent value of th
12690 65 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 74  e database and t
126a0 65 6d 70 6f 72 61 72 79 0d 0a 20 20 20 20 20 20  emporary..      
126b0 23 20 20 20 20 20 20 20 64 69 72 65 63 74 6f 72  #       director
126c0 69 65 73 2e 20 20 54 68 69 73 20 63 61 6e 20 6f  ies.  This can o
126d0 6e 6c 79 20 62 65 20 70 65 72 66 6f 72 6d 65 64  nly be performed
126e0 20 69 66 20 53 51 4c 69 74 65 20 69 73 20 6c 6f   if SQLite is lo
126f0 61 64 65 64 0d 0a 20 20 20 20 20 20 23 20 20 20  aded..      #   
12700 20 20 20 20 61 6e 64 20 72 65 61 64 79 20 66 6f      and ready fo
12710 72 20 75 73 65 20 62 79 20 74 68 65 20 74 65 73  r use by the tes
12720 74 20 73 75 69 74 65 2e 0d 0a 20 20 20 20 20 20  t suite...      
12730 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 73  #..      if {[is
12740 53 51 4c 69 74 65 52 65 61 64 79 5d 7d 20 74 68  SQLiteReady]} th
12750 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 66 6f  en {..        fo
12760 72 65 61 63 68 20 64 69 72 65 63 74 6f 72 79 20  reach directory 
12770 5b 6c 69 73 74 20 64 61 74 61 5f 73 74 6f 72 65  [list data_store
12780 5f 64 69 72 65 63 74 6f 72 79 20 74 65 6d 70 5f  _directory temp_
12790 73 74 6f 72 65 5f 64 69 72 65 63 74 6f 72 79 5d  store_directory]
127a0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70   {..          tp
127b0 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70  uts $channel [ap
127c0 70 65 6e 64 41 72 67 73 20 22 2d 2d 2d 2d 20 63  pendArgs "---- c
127d0 68 65 63 6b 69 6e 67 20 22 20 24 64 69 72 65 63  hecking " $direc
127e0 74 6f 72 79 20 22 2e 2e 2e 20 22 5d 0d 0a 0d 0a  tory "... "]....
127f0 20 20 20 20 20 20 20 20 20 20 73 65 74 20 73 71            set sq
12800 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 22 50  l [appendArgs "P
12810 52 41 47 4d 41 20 22 20 24 64 69 72 65 63 74 6f  RAGMA " $directo
12820 72 79 20 5c 3b 5d 0d 0a 0d 0a 20 20 20 20 20 20  ry \;]....      
12830 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b      if {[catch {
12840 65 78 65 63 75 74 65 53 71 6c 20 24 73 71 6c 20  executeSql $sql 
12850 73 63 61 6c 61 72 7d 20 72 65 73 75 6c 74 5d 20  scalar} result] 
12860 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  == 0} then {..  
12870 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
12880 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  $channel [append
12890 41 72 67 73 20 22 6f 6b 3a 20 5c 22 22 20 24 72  Args "ok: \"" $r
128a0 65 73 75 6c 74 20 5c 22 5c 6e 5d 0d 0a 20 20 20  esult \"\n]..   
128b0 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d         } else {.
128c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75  .            tpu
128d0 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70  ts $channel [app
128e0 65 6e 64 41 72 67 73 20 22 65 72 72 6f 72 3a 20  endArgs "error: 
128f0 22 20 5c 6e 5c 74 20 24 72 65 73 75 6c 74 20 5c  " \n\t $result \
12900 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d  n]..          }.
12910 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  .        }..    
12920 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20    }..    }..... 
12930 20 20 20 70 72 6f 63 20 6c 6f 61 64 53 51 4c 69     proc loadSQLi
12940 74 65 54 65 73 74 53 65 74 74 69 6e 67 73 20 7b  teTestSettings {
12950 20 63 68 61 6e 6e 65 6c 20 7b 73 75 66 66 69 78   channel {suffix
12960 20 22 22 7d 20 7b 71 75 69 65 74 20 66 61 6c 73   ""} {quiet fals
12970 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d  e} } {..      #.
12980 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53  .      # NOTE: S
12990 6b 69 70 20 6c 6f 61 64 69 6e 67 20 74 68 65 20  kip loading the 
129a0 73 65 74 74 69 6e 67 73 20 69 66 20 74 68 65 69  settings if thei
129b0 72 20 75 73 61 67 65 20 68 61 73 20 62 65 65 6e  r usage has been
129c0 20 64 69 73 61 62 6c 65 64 2e 0d 0a 20 20 20 20   disabled...    
129d0 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 21    #..      if {!
129e0 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e  [info exists ::n
129f0 6f 28 73 71 6c 69 74 65 54 65 73 74 53 65 74 74  o(sqliteTestSett
12a00 69 6e 67 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a  ings)]} then {..
12a10 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
12a20 20 20 20 23 20 4e 4f 54 45 3a 20 4c 6f 61 64 20     # NOTE: Load 
12a30 63 75 73 74 6f 6d 20 70 65 72 2d 75 73 65 72 20  custom per-user 
12a40 61 6e 64 2f 6f 72 20 70 65 72 2d 68 6f 73 74 20  and/or per-host 
12a50 74 65 73 74 20 73 65 74 74 69 6e 67 73 20 6e 6f  test settings no
12a60 77 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  w...        #.. 
12a70 20 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f         if {[info
12a80 20 65 78 69 73 74 73 20 3a 3a 74 63 6c 5f 70 6c   exists ::tcl_pl
12a90 61 74 66 6f 72 6d 28 75 73 65 72 29 5d 7d 20 74  atform(user)]} t
12aa0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
12ab0 20 73 65 74 20 75 73 65 72 53 65 74 74 69 6e 67   set userSetting
12ac0 73 46 69 6c 65 4e 61 6d 65 20 5b 66 69 6c 65 20  sFileName [file 
12ad0 6a 6f 69 6e 20 5b 67 65 74 43 6f 6d 6d 6f 6e 44  join [getCommonD
12ae0 69 72 65 63 74 6f 72 79 5d 20 5c 0d 0a 20 20 20  irectory] \..   
12af0 20 20 20 20 20 20 20 20 20 20 20 5b 61 70 70 65             [appe
12b00 6e 64 41 72 67 73 20 73 65 74 74 69 6e 67 73 20  ndArgs settings 
12b10 24 73 75 66 66 69 78 20 2e 20 24 3a 3a 74 63 6c  $suffix . $::tcl
12b20 5f 70 6c 61 74 66 6f 72 6d 28 75 73 65 72 29 20  _platform(user) 
12b30 2e 65 61 67 6c 65 5d 5d 0d 0a 0d 0a 20 20 20 20  .eagle]]....    
12b40 20 20 20 20 20 20 69 66 20 7b 5b 66 69 6c 65 20        if {[file 
12b50 65 78 69 73 74 73 20 24 75 73 65 72 53 65 74 74  exists $userSett
12b60 69 6e 67 73 46 69 6c 65 4e 61 6d 65 5d 7d 20 74  ingsFileName]} t
12b70 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
12b80 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20     if {!$quiet} 
12b90 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
12ba0 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
12bb0 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
12bc0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
12bd0 20 20 20 20 20 20 22 2d 2d 2d 2d 20 6c 6f 61 64        "---- load
12be0 69 6e 67 20 70 65 72 2d 75 73 65 72 20 74 65 73  ing per-user tes
12bf0 74 20 73 65 74 74 69 6e 67 73 20 66 69 6c 65 20  t settings file 
12c00 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  \"" \..         
12c10 20 20 20 20 20 20 20 20 20 24 75 73 65 72 53 65           $userSe
12c20 74 74 69 6e 67 73 46 69 6c 65 4e 61 6d 65 20 5c  ttingsFileName \
12c30 22 2e 2e 2e 5c 6e 5d 0d 0a 20 20 20 20 20 20 20  "...\n]..       
12c40 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
12c50 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68        if {[catch
12c60 20 7b 75 70 6c 65 76 65 6c 20 31 20 5b 6c 69 73   {uplevel 1 [lis
12c70 74 20 73 6f 75 72 63 65 20 24 75 73 65 72 53 65  t source $userSe
12c80 74 74 69 6e 67 73 46 69 6c 65 4e 61 6d 65 5d 7d  ttingsFileName]}
12c90 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
12ca0 20 20 20 20 20 20 20 20 65 72 72 6f 72 5d 7d 20          error]} 
12cb0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
12cc0 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65        if {!$quie
12cd0 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  t} then {..     
12ce0 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
12cf0 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e   $channel [appen
12d00 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
12d10 20 20 20 20 20 20 20 20 20 20 20 20 20 22 3d 3d               "==
12d20 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c  == WARNING: fail
12d30 65 64 20 74 6f 20 6c 6f 61 64 20 70 65 72 2d 75  ed to load per-u
12d40 73 65 72 20 73 65 74 74 69 6e 67 73 20 66 69 6c  ser settings fil
12d50 65 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20 20  e \"" \..       
12d60 20 20 20 20 20 20 20 20 20 20 20 20 20 24 75 73               $us
12d70 65 72 53 65 74 74 69 6e 67 73 46 69 6c 65 4e 61  erSettingsFileNa
12d80 6d 65 20 22 5c 22 2c 20 65 72 72 6f 72 3a 20 22  me "\", error: "
12d90 20 5c 6e 5c 74 20 24 65 72 72 6f 72 20 5c 6e 5d   \n\t $error \n]
12da0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
12db0 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  }..            }
12dc0 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c  ..          } el
12dd0 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  se {..          
12de0 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74    if {!$quiet} t
12df0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
12e00 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
12e10 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
12e20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
12e30 20 20 20 20 20 22 2d 2d 2d 2d 20 73 6b 69 70 70       "---- skipp
12e40 65 64 20 6c 6f 61 64 69 6e 67 20 70 65 72 2d 75  ed loading per-u
12e50 73 65 72 20 74 65 73 74 20 73 65 74 74 69 6e 67  ser test setting
12e60 73 20 66 69 6c 65 20 5c 22 22 20 5c 0d 0a 20 20  s file \"" \..  
12e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12e80 24 75 73 65 72 53 65 74 74 69 6e 67 73 46 69 6c  $userSettingsFil
12e90 65 4e 61 6d 65 20 22 5c 22 2c 20 69 74 20 64 6f  eName "\", it do
12ea0 65 73 20 6e 6f 74 20 65 78 69 73 74 5c 6e 22 5d  es not exist\n"]
12eb0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
12ec0 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  .          }..  
12ed0 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
12ee0 20 20 20 23 23 23 23 23 23 23 23 23 23 23 23 23     #############
12ef0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
12f00 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
12f10 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
12f20 23 23 23 23 23 23 23 23 23 23 0d 0a 0d 0a 20 20  ##########....  
12f30 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20        if {[info 
12f40 65 78 69 73 74 73 20 3a 3a 74 63 6c 5f 70 6c 61  exists ::tcl_pla
12f50 74 66 6f 72 6d 28 68 6f 73 74 29 5d 7d 20 74 68  tform(host)]} th
12f60 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
12f70 73 65 74 20 68 6f 73 74 53 65 74 74 69 6e 67 73  set hostSettings
12f80 46 69 6c 65 4e 61 6d 65 20 5b 66 69 6c 65 20 6a  FileName [file j
12f90 6f 69 6e 20 5b 67 65 74 43 6f 6d 6d 6f 6e 44 69  oin [getCommonDi
12fa0 72 65 63 74 6f 72 79 5d 20 5c 0d 0a 20 20 20 20  rectory] \..    
12fb0 20 20 20 20 20 20 20 20 20 20 5b 61 70 70 65 6e            [appen
12fc0 64 41 72 67 73 20 73 65 74 74 69 6e 67 73 20 24  dArgs settings $
12fd0 73 75 66 66 69 78 20 2e 20 24 3a 3a 74 63 6c 5f  suffix . $::tcl_
12fe0 70 6c 61 74 66 6f 72 6d 28 68 6f 73 74 29 20 2e  platform(host) .
12ff0 65 61 67 6c 65 5d 5d 0d 0a 0d 0a 20 20 20 20 20  eagle]]....     
13000 20 20 20 20 20 69 66 20 7b 5b 66 69 6c 65 20 65       if {[file e
13010 78 69 73 74 73 20 24 68 6f 73 74 53 65 74 74 69  xists $hostSetti
13020 6e 67 73 46 69 6c 65 4e 61 6d 65 5d 7d 20 74 68  ngsFileName]} th
13030 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
13040 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74    if {!$quiet} t
13050 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
13060 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
13070 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
13080 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
13090 20 20 20 20 20 22 2d 2d 2d 2d 20 6c 6f 61 64 69       "---- loadi
130a0 6e 67 20 70 65 72 2d 68 6f 73 74 20 74 65 73 74  ng per-host test
130b0 20 73 65 74 74 69 6e 67 73 20 66 69 6c 65 20 5c   settings file \
130c0 22 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  "" \..          
130d0 20 20 20 20 20 20 20 20 24 68 6f 73 74 53 65 74          $hostSet
130e0 74 69 6e 67 73 46 69 6c 65 4e 61 6d 65 20 5c 22  tingsFileName \"
130f0 2e 2e 2e 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20  ...\n]..        
13100 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
13110 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20       if {[catch 
13120 7b 75 70 6c 65 76 65 6c 20 31 20 5b 6c 69 73 74  {uplevel 1 [list
13130 20 73 6f 75 72 63 65 20 24 68 6f 73 74 53 65 74   source $hostSet
13140 74 69 6e 67 73 46 69 6c 65 4e 61 6d 65 5d 7d 20  tingsFileName]} 
13150 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
13160 20 20 20 20 20 20 20 65 72 72 6f 72 5d 7d 20 74         error]} t
13170 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
13180 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74       if {!$quiet
13190 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
131a0 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
131b0 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  $channel [append
131c0 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
131d0 20 20 20 20 20 20 20 20 20 20 20 20 22 3d 3d 3d              "===
131e0 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65  = WARNING: faile
131f0 64 20 74 6f 20 6c 6f 61 64 20 70 65 72 2d 68 6f  d to load per-ho
13200 73 74 20 73 65 74 74 69 6e 67 73 20 66 69 6c 65  st settings file
13210 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20 20 20   \"" \..        
13220 20 20 20 20 20 20 20 20 20 20 20 20 24 68 6f 73              $hos
13230 74 53 65 74 74 69 6e 67 73 46 69 6c 65 4e 61 6d  tSettingsFileNam
13240 65 20 22 5c 22 2c 20 65 72 72 6f 72 3a 20 22 20  e "\", error: " 
13250 5c 6e 5c 74 20 24 65 72 72 6f 72 20 5c 6e 5d 0d  \n\t $error \n].
13260 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
13270 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
13280 0a 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73  .          } els
13290 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e {..           
132a0 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68   if {!$quiet} th
132b0 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
132c0 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
132d0 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
132e0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
132f0 20 20 20 20 22 2d 2d 2d 2d 20 73 6b 69 70 70 65      "---- skippe
13300 64 20 6c 6f 61 64 69 6e 67 20 70 65 72 2d 68 6f  d loading per-ho
13310 73 74 20 74 65 73 74 20 73 65 74 74 69 6e 67 73  st test settings
13320 20 66 69 6c 65 20 5c 22 22 20 5c 0d 0a 20 20 20   file \"" \..   
13330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 24                 $
13340 68 6f 73 74 53 65 74 74 69 6e 67 73 46 69 6c 65  hostSettingsFile
13350 4e 61 6d 65 20 22 5c 22 2c 20 69 74 20 64 6f 65  Name "\", it doe
13360 73 20 6e 6f 74 20 65 78 69 73 74 5c 6e 22 5d 0d  s not exist\n"].
13370 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  .            }..
13380 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
13390 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d       }..      }.
133a0 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70  .    }.....    p
133b0 72 6f 63 20 72 75 6e 53 51 4c 69 74 65 54 65 73  roc runSQLiteTes
133c0 74 50 72 6f 6c 6f 67 75 65 20 7b 7d 20 7b 0d 0a  tPrologue {} {..
133d0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
133e0 20 4e 4f 54 45 3a 20 53 6b 69 70 20 72 75 6e 6e   NOTE: Skip runn
133f0 69 6e 67 20 6f 75 72 20 63 75 73 74 6f 6d 20 70  ing our custom p
13400 72 6f 6c 6f 67 75 65 20 69 66 20 74 68 65 20 6d  rologue if the m
13410 61 69 6e 20 6f 6e 65 20 68 61 73 20 62 65 65 6e  ain one has been
13420 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
13430 73 6b 69 70 70 65 64 2e 0d 0a 20 20 20 20 20 20  skipped...      
13440 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 21 5b 69  #..      if {![i
13450 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28  nfo exists ::no(
13460 70 72 6f 6c 6f 67 75 65 2e 65 61 67 6c 65 29 5d  prologue.eagle)]
13470 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
13480 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
13490 4f 54 45 3a 20 4c 6f 61 64 20 74 68 65 20 22 62  OTE: Load the "b
134a0 65 66 6f 72 65 2d 63 6f 6e 73 74 72 61 69 6e 74  efore-constraint
134b0 73 22 20 63 75 73 74 6f 6d 20 70 65 72 2d 75 73  s" custom per-us
134c0 65 72 20 61 6e 64 2f 6f 72 20 70 65 72 2d 68 6f  er and/or per-ho
134d0 73 74 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  st..        #   
134e0 20 20 20 20 74 65 73 74 20 73 65 74 74 69 6e 67      test setting
134f0 73 20 6e 6f 77 2e 0d 0a 20 20 20 20 20 20 20 20  s now...        
13500 23 0d 0a 20 20 20 20 20 20 20 20 75 70 6c 65 76  #..        uplev
13510 65 6c 20 31 20 5b 6c 69 73 74 20 6c 6f 61 64 53  el 1 [list loadS
13520 51 4c 69 74 65 54 65 73 74 53 65 74 74 69 6e 67  QLiteTestSetting
13530 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
13540 6c 20 2e 62 65 66 6f 72 65 5d 0d 0a 0d 0a 20 20  l .before]....  
13550 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
13560 20 23 20 4e 4f 54 45 3a 20 53 6b 69 70 20 61 6c   # NOTE: Skip al
13570 6c 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51  l System.Data.SQ
13580 4c 69 74 65 20 72 65 6c 61 74 65 64 20 66 69 6c  Lite related fil
13590 65 20 68 61 6e 64 6c 69 6e 67 20 28 64 65 6c 65  e handling (dele
135a0 74 69 6e 67 2c 0d 0a 20 20 20 20 20 20 20 20 23  ting,..        #
135b0 20 20 20 20 20 20 20 63 6f 70 79 69 6e 67 2c 20         copying, 
135c0 61 6e 64 20 6c 6f 61 64 69 6e 67 29 20 69 66 20  and loading) if 
135d0 77 65 20 61 72 65 20 73 6f 20 69 6e 73 74 72 75  we are so instru
135e0 63 74 65 64 2e 0d 0a 20 20 20 20 20 20 20 20 23  cted...        #
135f0 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b  ..        if {![
13600 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f  info exists ::no
13610 28 73 71 6c 69 74 65 46 69 6c 65 73 29 5d 7d 20  (sqliteFiles)]} 
13620 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
13630 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23    #..          #
13640 20 4e 4f 54 45 3a 20 53 6b 69 70 20 74 72 79 69   NOTE: Skip tryi
13650 6e 67 20 74 6f 20 64 65 6c 65 74 65 20 61 6e 79  ng to delete any
13660 20 66 69 6c 65 73 20 69 66 20 77 65 20 61 72 65   files if we are
13670 20 73 6f 20 69 6e 73 74 72 75 63 74 65 64 2e 0d   so instructed..
13680 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
13690 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e          if {![in
136a0 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 64  fo exists ::no(d
136b0 65 6c 65 74 65 53 71 6c 69 74 65 46 69 6c 65 73  eleteSqliteFiles
136c0 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  )]} then {..    
136d0 20 20 20 20 20 20 20 20 74 72 79 44 65 6c 65 74          tryDelet
136e0 65 41 73 73 65 6d 62 6c 79 20 73 71 6c 69 74 65  eAssembly sqlite
136f0 33 2e 64 6c 6c 0d 0a 20 20 20 20 20 20 20 20 20  3.dll..         
13700 20 20 20 72 65 6d 6f 76 65 43 6f 6e 73 74 72 61     removeConstra
13710 69 6e 74 20 66 69 6c 65 5f 73 71 6c 69 74 65 33  int file_sqlite3
13720 2e 64 6c 6c 0d 0a 0d 0a 20 20 20 20 20 20 20 20  .dll....        
13730 20 20 20 20 74 72 79 44 65 6c 65 74 65 41 73 73      tryDeleteAss
13740 65 6d 62 6c 79 20 53 51 4c 69 74 65 2e 49 6e 74  embly SQLite.Int
13750 65 72 6f 70 2e 64 6c 6c 0d 0a 20 20 20 20 20 20  erop.dll..      
13760 20 20 20 20 20 20 72 65 6d 6f 76 65 43 6f 6e 73        removeCons
13770 74 72 61 69 6e 74 20 66 69 6c 65 5f 53 51 4c 69  traint file_SQLi
13780 74 65 2e 49 6e 74 65 72 6f 70 2e 64 6c 6c 0d 0a  te.Interop.dll..
13790 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 72  ..            tr
137a0 79 44 65 6c 65 74 65 41 73 73 65 6d 62 6c 79 20  yDeleteAssembly 
137b0 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
137c0 74 65 2e 64 6c 6c 0d 0a 20 20 20 20 20 20 20 20  te.dll..        
137d0 20 20 20 20 72 65 6d 6f 76 65 43 6f 6e 73 74 72      removeConstr
137e0 61 69 6e 74 20 66 69 6c 65 5f 53 79 73 74 65 6d  aint file_System
137f0 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 64 6c 6c  .Data.SQLite.dll
13800 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
13810 74 72 79 44 65 6c 65 74 65 41 73 73 65 6d 62 6c  tryDeleteAssembl
13820 79 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51  y System.Data.SQ
13830 4c 69 74 65 2e 4c 69 6e 71 2e 64 6c 6c 0d 0a 20  Lite.Linq.dll.. 
13840 20 20 20 20 20 20 20 20 20 20 20 72 65 6d 6f 76             remov
13850 65 43 6f 6e 73 74 72 61 69 6e 74 20 66 69 6c 65  eConstraint file
13860 5f 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c  _System.Data.SQL
13870 69 74 65 2e 4c 69 6e 71 2e 64 6c 6c 0d 0a 20 20  ite.Linq.dll..  
13880 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
13890 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
138a0 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68 65 63      # NOTE: Chec
138b0 6b 20 66 6f 72 20 74 68 65 20 22 61 75 74 6f 53  k for the "autoS
138c0 65 6c 65 63 74 22 20 72 75 6e 74 69 6d 65 20 6f  elect" runtime o
138d0 70 74 69 6f 6e 2e 20 20 49 66 20 70 72 65 73 65  ption.  If prese
138e0 6e 74 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 23  nt,..          #
138f0 20 20 20 20 20 20 20 61 74 74 65 6d 70 74 20 74         attempt t
13900 6f 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  o automatically 
13910 73 65 6c 65 63 74 20 74 68 65 20 66 69 72 73 74  select the first
13920 20 61 76 61 69 6c 61 62 6c 65 0d 0a 20 20 20 20   available..    
13930 20 20 20 20 20 20 23 20 20 20 20 20 20 20 62 75        #       bu
13940 69 6c 64 20 28 6f 72 20 22 72 65 6c 65 61 73 65  ild (or "release
13950 22 29 20 6f 66 20 53 51 4c 69 74 65 20 61 6e 64  ") of SQLite and
13960 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c   System.Data.SQL
13970 69 74 65 0d 0a 20 20 20 20 20 20 20 20 20 20 23  ite..          #
13980 20 20 20 20 20 20 20 66 6f 72 20 75 73 65 20 77         for use w
13990 69 74 68 20 74 68 65 20 74 65 73 74 20 73 75 69  ith the test sui
139a0 74 65 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23  te...          #
139b0 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b  ..          if {
139c0 5b 68 61 73 52 75 6e 74 69 6d 65 4f 70 74 69 6f  [hasRuntimeOptio
139d0 6e 20 61 75 74 6f 53 65 6c 65 63 74 5d 7d 20 74  n autoSelect]} t
139e0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
139f0 20 20 20 69 66 20 7b 21 5b 63 68 65 63 6b 46 6f     if {![checkFo
13a00 72 53 51 4c 69 74 65 42 75 69 6c 64 73 20 24 3a  rSQLiteBuilds $:
13a10 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 74 72  :test_channel tr
13a20 75 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  ue]} then {..   
13a30 20 20 20 20 20 20 20 20 20 20 20 63 68 65 63 6b             check
13a40 46 6f 72 53 51 4c 69 74 65 52 65 6c 65 61 73 65  ForSQLiteRelease
13a50 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
13a60 6c 20 74 72 75 65 0d 0a 20 20 20 20 20 20 20 20  l true..        
13a70 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
13a80 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   }....          
13a90 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e  #..          # N
13aa0 4f 54 45 3a 20 53 6b 69 70 20 74 72 79 69 6e 67  OTE: Skip trying
13ab0 20 74 6f 20 76 65 72 69 66 79 20 74 68 65 20 62   to verify the b
13ac0 75 69 6c 64 20 64 69 72 65 63 74 6f 72 79 20 69  uild directory i
13ad0 66 20 77 65 20 61 72 65 20 73 6f 0d 0a 20 20 20  f we are so..   
13ae0 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 69         #       i
13af0 6e 73 74 72 75 63 74 65 64 3b 20 6f 74 68 65 72  nstructed; other
13b00 77 69 73 65 2c 20 6d 61 6b 65 20 73 75 72 65 20  wise, make sure 
13b10 69 74 20 61 63 74 75 61 6c 6c 79 20 65 78 69 73  it actually exis
13b20 74 73 20 6f 72 0d 0a 20 20 20 20 20 20 20 20 20  ts or..         
13b30 20 23 20 20 20 20 20 20 20 68 61 6c 74 20 74 68   #       halt th
13b40 65 20 65 6e 74 69 72 65 20 74 65 73 74 69 6e 67  e entire testing
13b50 20 70 72 6f 63 65 73 73 20 69 66 20 69 74 20 64   process if it d
13b60 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2e 0d 0a  oes not exist...
13b70 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
13b80 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66         if {![inf
13b90 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 76 65  o exists ::no(ve
13ba0 72 69 66 79 42 75 69 6c 64 44 69 72 65 63 74 6f  rifyBuildDirecto
13bb0 72 79 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ry)]} then {..  
13bc0 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
13bd0 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a           # NOTE:
13be0 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20   At this point, 
13bf0 74 68 65 20 62 75 69 6c 64 20 64 69 72 65 63 74  the build direct
13c00 6f 72 79 20 4d 55 53 54 20 65 78 69 73 74 20 61  ory MUST exist a
13c10 73 20 61 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s a..           
13c20 20 23 20 20 20 20 20 20 20 76 61 6c 69 64 20 64   #       valid d
13c30 69 72 65 63 74 6f 72 79 20 66 6f 72 20 74 68 65  irectory for the
13c40 20 74 65 73 74 69 6e 67 20 70 72 6f 63 65 73 73   testing process
13c50 20 74 6f 20 63 6f 6e 74 69 6e 75 65 2e 0d 0a 20   to continue... 
13c60 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
13c70 20 20 20 20 20 20 20 20 20 20 73 65 74 20 64 69            set di
13c80 72 65 63 74 6f 72 79 20 5b 67 65 74 42 75 69 6c  rectory [getBuil
13c90 64 44 69 72 65 63 74 6f 72 79 5d 0d 0a 0d 0a 20  dDirectory].... 
13ca0 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21             if {!
13cb0 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24 64 69  [file exists $di
13cc0 72 65 63 74 6f 72 79 5d 20 7c 7c 20 5c 0d 0a 20  rectory] || \.. 
13cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 21                 !
13ce0 5b 66 69 6c 65 20 69 73 64 69 72 65 63 74 6f 72  [file isdirector
13cf0 79 20 24 64 69 72 65 63 74 6f 72 79 5d 7d 20 74  y $directory]} t
13d00 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
13d10 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
13d20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4a 75        # NOTE: Ju
13d30 73 74 20 70 72 69 6f 72 20 74 6f 20 61 63 74 75  st prior to actu
13d40 61 6c 6c 79 20 68 61 6c 74 69 6e 67 20 74 68 65  ally halting the
13d50 20 74 65 73 74 69 6e 67 20 70 72 6f 63 65 73 73   testing process
13d60 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ,..             
13d70 20 23 20 20 20 20 20 20 20 61 64 64 20 61 6e 20   #       add an 
13d80 65 72 72 6f 72 20 74 6f 20 74 68 65 20 74 65 73  error to the tes
13d90 74 20 6c 6f 67 20 66 69 6c 65 2e 0d 0a 20 20 20  t log file...   
13da0 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
13db0 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
13dc0 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
13dd0 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
13de0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
13df0 20 20 20 22 2d 2d 2d 2d 20 63 6f 75 6c 64 20 6e     "---- could n
13e00 6f 74 20 76 65 72 69 66 79 20 62 75 69 6c 64 20  ot verify build 
13e10 64 69 72 65 63 74 6f 72 79 20 5c 22 22 20 24 64  directory \"" $d
13e20 69 72 65 63 74 6f 72 79 20 5c 0d 0a 20 20 20 20  irectory \..    
13e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 5c                "\
13e40 22 2c 20 61 6c 6c 20 74 65 73 74 69 6e 67 20 68  ", all testing h
13e50 61 6c 74 65 64 5c 6e 22 5d 0d 0a 0d 0a 20 20 20  alted\n"]....   
13e60 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
13e70 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f              # NO
13e80 54 45 3a 20 52 61 69 73 69 6e 67 20 61 20 73 63  TE: Raising a sc
13e90 72 69 70 74 20 65 72 72 6f 72 20 66 72 6f 6d 20  ript error from 
13ea0 74 68 69 73 20 70 6f 69 6e 74 20 73 68 6f 75 6c  this point shoul
13eb0 64 20 68 61 6c 74 0d 0a 20 20 20 20 20 20 20 20  d halt..        
13ec0 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68        #       th
13ed0 65 20 74 65 73 74 69 6e 67 20 70 72 6f 63 65 73  e testing proces
13ee0 73 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  s...            
13ef0 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20    #..           
13f00 20 20 20 65 72 72 6f 72 20 5b 61 70 70 65 6e 64     error [append
13f10 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
13f20 20 20 20 20 20 20 20 20 20 20 22 63 6f 75 6c 64            "could
13f30 20 6e 6f 74 20 76 65 72 69 66 79 20 62 75 69 6c   not verify buil
13f40 64 20 64 69 72 65 63 74 6f 72 79 20 5c 22 22 20  d directory \"" 
13f50 24 64 69 72 65 63 74 6f 72 79 20 5c 0d 0a 20 20  $directory \..  
13f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13f70 22 5c 22 2c 20 61 6c 6c 20 74 65 73 74 69 6e 67  "\", all testing
13f80 20 68 61 6c 74 65 64 22 5d 0d 0a 20 20 20 20 20   halted"]..     
13f90 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
13fa0 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
13fb0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
13fc0 23 20 4e 4f 54 45 3a 20 53 6b 69 70 20 74 72 79  # NOTE: Skip try
13fd0 69 6e 67 20 74 6f 20 63 6f 70 79 20 61 6e 79 20  ing to copy any 
13fe0 66 69 6c 65 73 20 69 66 20 77 65 20 61 72 65 20  files if we are 
13ff0 73 6f 20 69 6e 73 74 72 75 63 74 65 64 2e 0d 0a  so instructed...
14000 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
14010 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66         if {![inf
14020 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 63 6f  o exists ::no(co
14030 70 79 53 71 6c 69 74 65 46 69 6c 65 73 29 5d 7d  pySqliteFiles)]}
14040 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
14050 20 20 20 20 20 74 72 79 43 6f 70 79 41 73 73 65       tryCopyAsse
14060 6d 62 6c 79 20 73 71 6c 69 74 65 33 2e 64 6c 6c  mbly sqlite3.dll
14070 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 72  ..            tr
14080 79 43 6f 70 79 41 73 73 65 6d 62 6c 79 20 53 51  yCopyAssembly SQ
14090 4c 69 74 65 2e 49 6e 74 65 72 6f 70 2e 64 6c 6c  Lite.Interop.dll
140a0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 72  ..            tr
140b0 79 43 6f 70 79 41 73 73 65 6d 62 6c 79 20 53 79  yCopyAssembly Sy
140c0 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
140d0 2e 64 6c 6c 0d 0a 20 20 20 20 20 20 20 20 20 20  .dll..          
140e0 20 20 74 72 79 43 6f 70 79 41 73 73 65 6d 62 6c    tryCopyAssembl
140f0 79 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51  y System.Data.SQ
14100 4c 69 74 65 2e 4c 69 6e 71 2e 64 6c 6c 0d 0a 20  Lite.Linq.dll.. 
14110 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20           }....  
14120 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
14130 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 6b 69       # NOTE: Ski
14140 70 20 74 72 79 69 6e 67 20 74 6f 20 6c 6f 61 64  p trying to load
14150 20 61 6e 79 20 66 69 6c 65 73 20 69 66 20 77 65   any files if we
14160 20 61 72 65 20 73 6f 20 69 6e 73 74 72 75 63 74   are so instruct
14170 65 64 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23  ed...          #
14180 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b  ..          if {
14190 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  ![info exists ::
141a0 6e 6f 28 6c 6f 61 64 53 71 6c 69 74 65 46 69 6c  no(loadSqliteFil
141b0 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  es)]} then {..  
141c0 20 20 20 20 20 20 20 20 20 20 74 72 79 4c 6f 61            tryLoa
141d0 64 41 73 73 65 6d 62 6c 79 20 53 79 73 74 65 6d  dAssembly System
141e0 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 64 6c 6c  .Data.SQLite.dll
141f0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 72  ..            tr
14200 79 4c 6f 61 64 41 73 73 65 6d 62 6c 79 20 53 79  yLoadAssembly Sy
14210 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
14220 2e 4c 69 6e 71 2e 64 6c 6c 0d 0a 20 20 20 20 20  .Linq.dll..     
14230 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
14240 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
14250 20 23 20 4e 4f 54 45 3a 20 53 6b 69 70 20 74 72   # NOTE: Skip tr
14260 79 69 6e 67 20 74 6f 20 64 65 6c 65 74 65 20 65  ying to delete e
14270 78 74 65 72 6e 61 6c 20 66 69 6c 65 73 20 69 66  xternal files if
14280 20 77 65 20 61 72 65 20 73 6f 20 69 6e 73 74 72   we are so instr
14290 75 63 74 65 64 2e 0d 0a 20 20 20 20 20 20 20 20  ucted...        
142a0 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 69    #..          i
142b0 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73  f {![info exists
142c0 20 3a 3a 6e 6f 28 64 65 6c 65 74 65 53 71 6c 69   ::no(deleteSqli
142d0 74 65 45 78 74 65 72 6e 61 6c 46 69 6c 65 73 29  teExternalFiles)
142e0 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
142f0 20 20 20 20 20 20 20 74 72 79 44 65 6c 65 74 65         tryDelete
14300 42 75 69 6c 64 46 69 6c 65 20 49 6e 73 74 61 6c  BuildFile Instal
14310 6c 65 72 2e 65 78 65 2e 6d 64 61 2e 63 6f 6e 66  ler.exe.mda.conf
14320 69 67 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ig..            
14330 74 72 79 44 65 6c 65 74 65 42 75 69 6c 64 46 69  tryDeleteBuildFi
14340 6c 65 20 74 65 73 74 2e 65 78 65 2e 6d 64 61 2e  le test.exe.mda.
14350 63 6f 6e 66 69 67 0d 0a 20 20 20 20 20 20 20 20  config..        
14360 20 20 20 20 74 72 79 44 65 6c 65 74 65 42 75 69      tryDeleteBui
14370 6c 64 46 69 6c 65 20 74 65 73 74 6c 69 6e 71 2e  ldFile testlinq.
14380 65 78 65 2e 6d 64 61 2e 63 6f 6e 66 69 67 0d 0a  exe.mda.config..
14390 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20            }.... 
143a0 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
143b0 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 6b        # NOTE: Sk
143c0 69 70 20 74 72 79 69 6e 67 20 74 6f 20 63 6f 70  ip trying to cop
143d0 79 20 65 78 74 65 72 6e 61 6c 20 66 69 6c 65 73  y external files
143e0 20 69 66 20 77 65 20 61 72 65 20 73 6f 20 69 6e   if we are so in
143f0 73 74 72 75 63 74 65 64 2e 0d 0a 20 20 20 20 20  structed...     
14400 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
14410 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69    if {![info exi
14420 73 74 73 20 3a 3a 6e 6f 28 63 6f 70 79 53 71 6c  sts ::no(copySql
14430 69 74 65 45 78 74 65 72 6e 61 6c 46 69 6c 65 73  iteExternalFiles
14440 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  )]} then {..    
14450 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
14460 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43         # NOTE: C
14470 6f 70 79 20 74 68 65 20 4d 44 41 20 63 6f 6e 66  opy the MDA conf
14480 69 67 75 72 61 74 69 6f 6e 20 66 69 6c 65 20 66  iguration file f
14490 6f 72 20 74 68 65 20 45 61 67 6c 65 20 73 68 65  or the Eagle she
144a0 6c 6c 20 74 6f 20 74 68 65 0d 0a 20 20 20 20 20  ll to the..     
144b0 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 62         #       b
144c0 75 69 6c 64 20 6f 75 74 70 75 74 20 64 69 72 65  uild output dire
144d0 63 74 6f 72 79 3b 20 68 6f 77 65 76 65 72 2c 20  ctory; however, 
144e0 75 73 65 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  use the name of 
144f0 74 68 65 20 6c 65 67 61 63 79 0d 0a 20 20 20 20  the legacy..    
14500 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
14510 74 65 73 74 20 65 78 65 63 75 74 61 62 6c 65 2e  test executable.
14520 20 20 54 68 69 73 20 77 69 6c 6c 20 6d 61 6b 65    This will make
14530 20 73 75 72 65 20 74 68 61 74 20 74 68 65 20 6c   sure that the l
14540 65 67 61 63 79 20 74 65 73 74 73 0d 0a 20 20 20  egacy tests..   
14550 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20           #      
14560 20 72 75 6e 20 77 69 74 68 20 74 68 65 20 73 61   run with the sa
14570 6d 65 20 73 65 74 20 6f 66 20 4d 44 41 73 20 63  me set of MDAs c
14580 6f 6e 66 69 67 75 72 65 64 2e 0d 0a 20 20 20 20  onfigured...    
14590 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
145a0 20 20 20 20 20 20 20 74 72 79 43 6f 70 79 42 69         tryCopyBi
145b0 6e 61 72 79 46 69 6c 65 20 45 61 67 6c 65 53 68  naryFile EagleSh
145c0 65 6c 6c 2e 65 78 65 2e 6d 64 61 2e 63 6f 6e 66  ell.exe.mda.conf
145d0 69 67 20 49 6e 73 74 61 6c 6c 65 72 2e 65 78 65  ig Installer.exe
145e0 2e 6d 64 61 2e 63 6f 6e 66 69 67 0d 0a 20 20 20  .mda.config..   
145f0 20 20 20 20 20 20 20 20 20 74 72 79 43 6f 70 79           tryCopy
14600 42 69 6e 61 72 79 46 69 6c 65 20 45 61 67 6c 65  BinaryFile Eagle
14610 53 68 65 6c 6c 2e 65 78 65 2e 6d 64 61 2e 63 6f  Shell.exe.mda.co
14620 6e 66 69 67 20 74 65 73 74 2e 65 78 65 2e 6d 64  nfig test.exe.md
14630 61 2e 63 6f 6e 66 69 67 0d 0a 20 20 20 20 20 20  a.config..      
14640 20 20 20 20 20 20 74 72 79 43 6f 70 79 42 69 6e        tryCopyBin
14650 61 72 79 46 69 6c 65 20 45 61 67 6c 65 53 68 65  aryFile EagleShe
14660 6c 6c 2e 65 78 65 2e 6d 64 61 2e 63 6f 6e 66 69  ll.exe.mda.confi
14670 67 20 74 65 73 74 6c 69 6e 71 2e 65 78 65 2e 6d  g testlinq.exe.m
14680 64 61 2e 63 6f 6e 66 69 67 0d 0a 20 20 20 20 20  da.config..     
14690 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
146a0 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 63 61 74  }....        cat
146b0 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  ch {..          
146c0 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
146d0 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
146e0 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
146f0 20 20 20 22 2d 2d 2d 2d 20 66 69 6c 65 20 76 65     "---- file ve
14700 72 73 69 6f 6e 20 6f 66 20 5c 22 73 71 6c 69 74  rsion of \"sqlit
14710 65 33 2e 64 6c 6c 5c 22 2e 2e 2e 20 22 20 5c 0d  e3.dll\"... " \.
14720 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b  .              [
14730 66 69 6c 65 20 76 65 72 73 69 6f 6e 20 5b 67 65  file version [ge
14740 74 42 69 6e 61 72 79 46 69 6c 65 4e 61 6d 65 20  tBinaryFileName 
14750 73 71 6c 69 74 65 33 2e 64 6c 6c 5d 5d 20 5c 6e  sqlite3.dll]] \n
14760 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  ]..        }....
14770 20 20 20 20 20 20 20 20 63 61 74 63 68 20 7b 0d          catch {.
14780 0a 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73  .          tputs
14790 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
147a0 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
147b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d                "-
147c0 2d 2d 2d 20 66 69 6c 65 20 76 65 72 73 69 6f 6e  --- file version
147d0 20 6f 66 20 5c 22 53 51 4c 69 74 65 2e 49 6e 74   of \"SQLite.Int
147e0 65 72 6f 70 2e 64 6c 6c 5c 22 2e 2e 2e 20 22 20  erop.dll\"... " 
147f0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
14800 20 5b 66 69 6c 65 20 76 65 72 73 69 6f 6e 20 5b   [file version [
14810 67 65 74 42 69 6e 61 72 79 46 69 6c 65 4e 61 6d  getBinaryFileNam
14820 65 20 53 51 4c 69 74 65 2e 49 6e 74 65 72 6f 70  e SQLite.Interop
14830 2e 64 6c 6c 5d 5d 20 5c 6e 5d 0d 0a 20 20 20 20  .dll]] \n]..    
14840 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
14850 20 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20   catch {..      
14860 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
14870 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e  t_channel [appen
14880 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
14890 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 66 69 6c         "---- fil
148a0 65 20 76 65 72 73 69 6f 6e 20 6f 66 20 5c 22 53  e version of \"S
148b0 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
148c0 65 2e 64 6c 6c 5c 22 2e 2e 2e 20 22 20 5c 0d 0a  e.dll\"... " \..
148d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 66                [f
148e0 69 6c 65 20 76 65 72 73 69 6f 6e 20 5b 67 65 74  ile version [get
148f0 42 69 6e 61 72 79 46 69 6c 65 4e 61 6d 65 20 53  BinaryFileName S
14900 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
14910 65 2e 64 6c 6c 5d 5d 20 5c 6e 5d 0d 0a 20 20 20  e.dll]] \n]..   
14920 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
14930 20 20 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20    catch {..     
14940 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
14950 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
14960 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
14970 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 66 69          "---- fi
14980 6c 65 20 76 65 72 73 69 6f 6e 20 6f 66 20 5c 22  le version of \"
14990 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
149a0 74 65 2e 4c 69 6e 71 2e 64 6c 6c 5c 22 2e 2e 2e  te.Linq.dll\"...
149b0 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20   " \..          
149c0 20 20 20 20 5b 66 69 6c 65 20 76 65 72 73 69 6f      [file versio
149d0 6e 20 5b 67 65 74 42 69 6e 61 72 79 46 69 6c 65  n [getBinaryFile
149e0 4e 61 6d 65 20 53 79 73 74 65 6d 2e 44 61 74 61  Name System.Data
149f0 2e 53 51 4c 69 74 65 2e 4c 69 6e 71 2e 64 6c 6c  .SQLite.Linq.dll
14a00 5d 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20  ]] \n]..        
14a10 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 73 65 74  }....        set
14a20 20 61 73 73 65 6d 62 6c 69 65 73 20 5b 6f 62 6a   assemblies [obj
14a30 65 63 74 20 69 6e 76 6f 6b 65 20 41 70 70 44 6f  ect invoke AppDo
14a40 6d 61 69 6e 2e 43 75 72 72 65 6e 74 44 6f 6d 61  main.CurrentDoma
14a50 69 6e 20 47 65 74 41 73 73 65 6d 62 6c 69 65 73  in GetAssemblies
14a60 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 6f 62 6a  ]....        obj
14a70 65 63 74 20 66 6f 72 65 61 63 68 20 61 73 73 65  ect foreach asse
14a80 6d 62 6c 79 20 24 61 73 73 65 6d 62 6c 69 65 73  mbly $assemblies
14a90 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66   {..          if
14aa0 20 7b 5b 73 74 72 69 6e 67 20 6d 61 74 63 68 20   {[string match 
14ab0 5c 7b 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51  \{System.Data.SQ
14ac0 4c 69 74 65 2a 20 24 61 73 73 65 6d 62 6c 79 5d  Lite* $assembly]
14ad0 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
14ae0 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
14af0 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70  est_channel [app
14b00 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
14b10 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
14b20 20 66 6f 75 6e 64 20 61 73 73 65 6d 62 6c 79 3a   found assembly:
14b30 20 22 20 24 61 73 73 65 6d 62 6c 79 20 5c 6e 5d   " $assembly \n]
14b40 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20  ..          }.. 
14b50 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
14b60 20 20 20 20 63 61 74 63 68 20 7b 0d 0a 20 20 20      catch {..   
14b70 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
14b80 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5c 0d 0a  test_channel \..
14b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d                "-
14ba0 2d 2d 2d 20 64 65 66 69 6e 65 20 63 6f 6e 73 74  --- define const
14bb0 61 6e 74 73 20 66 6f 72 20 5c 22 53 79 73 74 65  ants for \"Syste
14bc0 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 5c 22 2e  m.Data.SQLite\".
14bd0 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 20 20 20 20  .. "....        
14be0 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 6f 62    if {[catch {ob
14bf0 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61  ject invoke -fla
14c00 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d  gs +NonPublic \.
14c10 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
14c20 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53     System.Data.S
14c30 51 4c 69 74 65 2e 53 51 4c 69 74 65 33 20 44 65  QLite.SQLite3 De
14c40 66 69 6e 65 43 6f 6e 73 74 61 6e 74 73 7d 20 5c  fineConstants} \
14c50 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
14c60 20 20 20 20 64 65 66 69 6e 65 43 6f 6e 73 74 61      defineConsta
14c70 6e 74 73 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20  nts] == 0} then 
14c80 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  {..            t
14c90 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
14ca0 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
14cb0 20 5b 66 6f 72 6d 61 74 4c 69 73 74 20 5b 6c 73   [formatList [ls
14cc0 6f 72 74 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ort \..         
14cd0 20 20 20 20 20 20 20 24 64 65 66 69 6e 65 43 6f         $defineCo
14ce0 6e 73 74 61 6e 74 73 5d 20 3c 6e 6f 6e 65 3e 5d  nstants] <none>]
14cf0 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20   \n]..          
14d00 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
14d10 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
14d20 65 73 74 5f 63 68 61 6e 6e 65 6c 20 75 6e 6b 6e  est_channel unkn
14d30 6f 77 6e 5c 6e 0d 0a 20 20 20 20 20 20 20 20 20  own\n..         
14d40 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d   }..        }...
14d50 0a 20 20 20 20 20 20 20 20 63 61 74 63 68 20 7b  .        catch {
14d60 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70 75 74  ..          tput
14d70 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
14d80 6c 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  l \..           
14d90 20 20 20 22 2d 2d 2d 2d 20 73 6f 75 72 63 65 20     "---- source 
14da0 76 65 72 73 69 6f 6e 20 6f 66 20 5c 22 53 79 73  version of \"Sys
14db0 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e  tem.Data.SQLite.
14dc0 64 6c 6c 5c 22 2e 2e 2e 20 22 0d 0a 0d 0a 20 20  dll\"... "....  
14dd0 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74          if {[cat
14de0 63 68 20 7b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b  ch {object invok
14df0 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62  e -flags +NonPub
14e00 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  lic \..         
14e10 20 20 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e           System.
14e20 44 61 74 61 2e 53 51 4c 69 74 65 2e 53 51 4c 69  Data.SQLite.SQLi
14e30 74 65 43 6f 6e 6e 65 63 74 69 6f 6e 20 50 72 6f  teConnection Pro
14e40 76 69 64 65 72 56 65 72 73 69 6f 6e 7d 20 5c 0d  viderVersion} \.
14e50 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
14e60 20 20 20 76 65 72 73 69 6f 6e 5d 20 3d 3d 20 30     version] == 0
14e70 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
14e80 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e        if {[strin
14e90 67 20 6c 65 6e 67 74 68 20 24 76 65 72 73 69 6f  g length $versio
14ea0 6e 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d  n] == 0} then {.
14eb0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
14ec0 65 74 20 76 65 72 73 69 6f 6e 20 6e 75 6c 6c 0d  et version null.
14ed0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  .            }..
14ee0 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
14ef0 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
14f00 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 24 76  l [appendArgs $v
14f10 65 72 73 69 6f 6e 20 5c 6e 5d 0d 0a 20 20 20 20  ersion \n]..    
14f20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
14f30 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
14f40 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
14f50 6c 20 75 6e 6b 6e 6f 77 6e 5c 6e 0d 0a 20 20 20  l unknown\n..   
14f60 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
14f70 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 63    }....        c
14f80 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20  atch {..        
14f90 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
14fa0 63 68 61 6e 6e 65 6c 20 5c 0d 0a 20 20 20 20 20  channel \..     
14fb0 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 73           "---- s
14fc0 6f 75 72 63 65 20 63 68 65 63 6b 6f 75 74 20 6f  ource checkout o
14fd0 66 20 5c 22 53 79 73 74 65 6d 2e 44 61 74 61 2e  f \"System.Data.
14fe0 53 51 4c 69 74 65 2e 64 6c 6c 5c 22 2e 2e 2e 20  SQLite.dll\"... 
14ff0 22 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 69  "....          i
15000 66 20 7b 5b 63 61 74 63 68 20 7b 6f 62 6a 65 63  f {[catch {objec
15010 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20  t invoke -flags 
15020 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20  +NonPublic \..  
15030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15040 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
15050 74 65 2e 53 51 4c 69 74 65 43 6f 6e 6e 65 63 74  te.SQLiteConnect
15060 69 6f 6e 20 50 72 6f 76 69 64 65 72 53 6f 75 72  ion ProviderSour
15070 63 65 49 64 7d 20 5c 0d 0a 20 20 20 20 20 20 20  ceId} \..       
15080 20 20 20 20 20 20 20 20 20 20 20 73 6f 75 72 63             sourc
15090 65 49 64 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20  eId] == 0} then 
150a0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  {..            i
150b0 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74  f {[string lengt
150c0 68 20 24 73 6f 75 72 63 65 49 64 5d 20 3d 3d 20  h $sourceId] == 
150d0 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
150e0 20 20 20 20 20 20 20 20 20 73 65 74 20 73 6f 75           set sou
150f0 72 63 65 49 64 20 6e 75 6c 6c 0d 0a 20 20 20 20  rceId null..    
15100 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
15110 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
15120 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70  test_channel [ap
15130 70 65 6e 64 41 72 67 73 20 24 73 6f 75 72 63 65  pendArgs $source
15140 49 64 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20  Id \n]..        
15150 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
15160 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
15170 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 75 6e  :test_channel un
15180 6b 6e 6f 77 6e 5c 6e 0d 0a 20 20 20 20 20 20 20  known\n..       
15190 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d     }..        }.
151a0 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
151b0 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68        # NOTE: Ch
151c0 65 63 6b 20 74 68 65 20 61 76 61 69 6c 61 62 6c  eck the availabl
151d0 65 20 62 75 69 6c 64 73 20 28 61 6e 64 20 22 72  e builds (and "r
151e0 65 6c 65 61 73 65 73 22 29 20 6f 66 20 53 51 4c  eleases") of SQL
151f0 69 74 65 20 61 6e 64 0d 0a 20 20 20 20 20 20 20  ite and..       
15200 20 23 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e   #       System.
15210 44 61 74 61 2e 53 51 4c 69 74 65 2e 0d 0a 20 20  Data.SQLite...  
15220 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
15230 20 63 68 65 63 6b 46 6f 72 53 51 4c 69 74 65 42   checkForSQLiteB
15240 75 69 6c 64 73 20 24 3a 3a 74 65 73 74 5f 63 68  uilds $::test_ch
15250 61 6e 6e 65 6c 0d 0a 20 20 20 20 20 20 20 20 63  annel..        c
15260 68 65 63 6b 46 6f 72 53 51 4c 69 74 65 52 65 6c  heckForSQLiteRel
15270 65 61 73 65 73 20 24 3a 3a 74 65 73 74 5f 63 68  eases $::test_ch
15280 61 6e 6e 65 6c 0d 0a 0d 0a 20 20 20 20 20 20 20  annel....       
15290 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
152a0 54 45 3a 20 4e 6f 77 2c 20 77 65 20 6e 65 65 64  TE: Now, we need
152b0 20 74 6f 20 6b 6e 6f 77 20 69 66 20 74 68 65 20   to know if the 
152c0 53 51 4c 69 74 65 20 63 6f 72 65 20 6c 69 62 72  SQLite core libr
152d0 61 72 79 20 69 73 20 61 76 61 69 6c 61 62 6c 65  ary is available
152e0 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
152f0 20 20 28 69 2e 65 2e 20 62 65 63 61 75 73 65 20    (i.e. because 
15300 74 68 65 20 6d 61 6e 61 67 65 64 2d 6f 6e 6c 79  the managed-only
15310 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c   System.Data.SQL
15320 69 74 65 20 61 73 73 65 6d 62 6c 79 20 63 61 6e  ite assembly can
15330 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
15340 20 20 6c 6f 61 64 20 77 69 74 68 6f 75 74 20 69    load without i
15350 74 3b 20 68 6f 77 65 76 65 72 2c 20 69 74 20 63  t; however, it c
15360 61 6e 6e 6f 74 20 64 6f 20 61 6e 79 74 68 69 6e  annot do anythin
15370 67 20 75 73 65 66 75 6c 20 77 69 74 68 6f 75 74  g useful without
15380 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
15390 20 20 69 74 29 2e 20 20 49 66 20 77 65 20 61 72    it).  If we ar
153a0 65 20 75 73 69 6e 67 20 74 68 65 20 6d 69 78 65  e using the mixe
153b0 64 2d 6d 6f 64 65 20 61 73 73 65 6d 62 6c 79 20  d-mode assembly 
153c0 61 6e 64 20 77 65 20 61 6c 72 65 61 64 79 0d 0a  and we already..
153d0 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
153e0 66 6f 75 6e 64 20 69 74 20 28 61 62 6f 76 65 29  found it (above)
153f0 2c 20 74 68 69 73 20 73 68 6f 75 6c 64 20 61 6c  , this should al
15400 77 61 79 73 20 73 75 63 63 65 65 64 2e 0d 0a 20  ways succeed... 
15410 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
15420 20 20 63 68 65 63 6b 46 6f 72 53 51 4c 69 74 65    checkForSQLite
15430 4c 69 62 72 61 72 79 20 24 3a 3a 74 65 73 74 5f  Library $::test_
15440 63 68 61 6e 6e 65 6c 0d 0a 0d 0a 20 20 20 20 20  channel....     
15450 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
15460 4e 4f 54 45 3a 20 43 68 65 63 6b 20 69 66 20 74  NOTE: Check if t
15470 68 65 20 53 51 4c 69 74 65 20 69 6e 74 65 72 6f  he SQLite intero
15480 70 20 61 73 73 65 6d 62 6c 79 20 69 73 20 61 76  p assembly is av
15490 61 69 6c 61 62 6c 65 2e 0d 0a 20 20 20 20 20 20  ailable...      
154a0 20 20 23 0d 0a 20 20 20 20 20 20 20 20 63 68 65    #..        che
154b0 63 6b 46 6f 72 53 51 4c 69 74 65 49 6e 74 65 72  ckForSQLiteInter
154c0 6f 70 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  op $::test_chann
154d0 65 6c 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d  el....        #.
154e0 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
154f0 20 43 68 65 63 6b 20 74 68 65 20 53 51 4c 69 74   Check the SQLit
15500 65 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 74  e database and t
15510 65 6d 70 6f 72 61 72 79 20 64 69 72 65 63 74 6f  emporary directo
15520 72 69 65 73 2e 0d 0a 20 20 20 20 20 20 20 20 23  ries...        #
15530 0d 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b 46  ..        checkF
15540 6f 72 53 51 4c 69 74 65 44 69 72 65 63 74 6f 72  orSQLiteDirector
15550 69 65 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  ies $::test_chan
15560 6e 65 6c 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23  nel....        #
15570 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
15580 3a 20 41 74 74 65 6d 70 74 20 74 6f 20 64 65 74  : Attempt to det
15590 65 72 6d 69 6e 65 20 69 66 20 76 61 72 69 6f 75  ermine if variou
155a0 73 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f  s compile-time o
155b0 70 74 69 6f 6e 73 20 6e 65 65 64 65 64 20 66 6f  ptions needed fo
155c0 72 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  r..        #    
155d0 20 20 20 74 65 73 74 20 63 6f 6e 73 74 72 61 69     test constrai
155e0 6e 74 73 20 77 65 72 65 20 65 6e 61 62 6c 65 64  nts were enabled
155f0 20 66 6f 72 20 74 68 65 20 6d 61 6e 61 67 65 64   for the managed
15600 20 61 73 73 65 6d 62 6c 79 2e 20 20 54 68 65 72   assembly.  Ther
15610 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  e..        #    
15620 20 20 20 61 72 65 20 73 6f 6d 65 20 63 6f 6d 70     are some comp
15630 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 73  ile-time options
15640 20 74 68 61 74 20 6d 75 73 74 20 61 6c 73 6f 20   that must also 
15650 68 61 76 65 20 62 65 65 6e 20 65 6e 61 62 6c 65  have been enable
15660 64 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  d..        #    
15670 20 20 20 66 6f 72 20 74 68 65 20 69 6e 74 65 72     for the inter
15680 6f 70 20 61 73 73 65 6d 62 6c 79 20 69 6e 20 6f  op assembly in o
15690 72 64 65 72 20 74 6f 20 62 65 20 65 66 66 65 63  rder to be effec
156a0 74 69 76 65 2e 20 20 46 6f 72 20 74 68 6f 73 65  tive.  For those
156b0 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
156c0 20 20 6f 70 74 69 6f 6e 73 2c 20 69 74 20 77 69    options, it wi
156d0 6c 6c 20 62 65 20 61 73 73 75 6d 65 64 20 74 68  ll be assumed th
156e0 61 74 20 69 74 20 77 61 73 20 65 6e 61 62 6c 65  at it was enable
156f0 64 20 66 6f 72 20 74 68 65 20 69 6e 74 65 72 6f  d for the intero
15700 70 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  p..        #    
15710 20 20 20 61 73 73 65 6d 62 6c 79 20 69 66 20 69     assembly if i
15720 74 20 77 61 73 20 65 6e 61 62 6c 65 64 20 66 6f  t was enabled fo
15730 72 20 74 68 65 20 6d 61 6e 61 67 65 64 20 61 73  r the managed as
15740 73 65 6d 62 6c 79 2e 0d 0a 20 20 20 20 20 20 20  sembly...       
15750 20 23 0d 0a 20 20 20 20 20 20 20 20 66 6f 72 65   #..        fore
15760 61 63 68 20 64 65 66 69 6e 65 43 6f 6e 73 74 61  ach defineConsta
15770 6e 74 20 5b 6c 69 73 74 20 5c 0d 0a 20 20 20 20  nt [list \..    
15780 20 20 20 20 20 20 20 20 43 48 45 43 4b 5f 53 54          CHECK_ST
15790 41 54 45 20 43 4f 55 4e 54 5f 48 41 4e 44 4c 45  ATE COUNT_HANDLE
157a0 20 44 45 42 55 47 20 49 4e 54 45 52 4f 50 5f 43   DEBUG INTEROP_C
157b0 4f 44 45 43 20 49 4e 54 45 52 4f 50 5f 44 45 42  ODEC INTEROP_DEB
157c0 55 47 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  UG \..          
157d0 20 20 49 4e 54 45 52 4f 50 5f 45 58 54 45 4e 53    INTEROP_EXTENS
157e0 49 4f 4e 5f 46 55 4e 43 54 49 4f 4e 53 20 49 4e  ION_FUNCTIONS IN
157f0 54 45 52 4f 50 5f 4c 45 47 41 43 59 5f 43 4c 4f  TEROP_LEGACY_CLO
15800 53 45 20 49 4e 54 45 52 4f 50 5f 4c 4f 47 20 5c  SE INTEROP_LOG \
15810 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 49 4e  ..            IN
15820 54 45 52 4f 50 5f 54 45 53 54 5f 45 58 54 45 4e  TEROP_TEST_EXTEN
15830 53 49 4f 4e 20 49 4e 54 45 52 4f 50 5f 56 49 52  SION INTEROP_VIR
15840 54 55 41 4c 5f 54 41 42 4c 45 20 4e 45 54 5f 32  TUAL_TABLE NET_2
15850 30 20 4e 45 54 5f 33 35 20 5c 0d 0a 20 20 20 20  0 NET_35 \..    
15860 20 20 20 20 20 20 20 20 4e 45 54 5f 34 30 20 4e          NET_40 N
15870 45 54 5f 34 35 20 4e 45 54 5f 43 4f 4d 50 41 43  ET_45 NET_COMPAC
15880 54 5f 32 30 20 50 4c 41 54 46 4f 52 4d 5f 43 4f  T_20 PLATFORM_CO
15890 4d 50 41 43 54 46 52 41 4d 45 57 4f 52 4b 20 5c  MPACTFRAMEWORK \
158a0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 50 52  ..            PR
158b0 45 4c 4f 41 44 5f 4e 41 54 49 56 45 5f 4c 49 42  ELOAD_NATIVE_LIB
158c0 52 41 52 59 20 52 45 54 41 52 47 45 54 41 42 4c  RARY RETARGETABL
158d0 45 20 53 51 4c 49 54 45 5f 53 54 41 4e 44 41 52  E SQLITE_STANDAR
158e0 44 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  D \..           
158f0 20 54 48 52 4f 57 5f 4f 4e 5f 44 49 53 50 4f 53   THROW_ON_DISPOS
15900 45 44 20 54 52 41 43 45 20 54 52 41 43 45 5f 43  ED TRACE TRACE_C
15910 4f 4e 4e 45 43 54 49 4f 4e 20 54 52 41 43 45 5f  ONNECTION TRACE_
15920 48 41 4e 44 4c 45 20 5c 0d 0a 20 20 20 20 20 20  HANDLE \..      
15930 20 20 20 20 20 20 54 52 41 43 45 5f 50 52 45 4c        TRACE_PREL
15940 4f 41 44 20 54 52 41 43 45 5f 53 54 41 54 45 4d  OAD TRACE_STATEM
15950 45 4e 54 20 54 52 41 43 45 5f 57 41 52 4e 49 4e  ENT TRACE_WARNIN
15960 47 20 54 52 41 43 4b 5f 4d 45 4d 4f 52 59 5f 42  G TRACK_MEMORY_B
15970 59 54 45 53 20 5c 0d 0a 20 20 20 20 20 20 20 20  YTES \..        
15980 20 20 20 20 55 53 45 5f 49 4e 54 45 52 4f 50 5f      USE_INTEROP_
15990 44 4c 4c 20 55 53 45 5f 50 52 45 50 41 52 45 5f  DLL USE_PREPARE_
159a0 56 32 20 57 49 4e 44 4f 57 53 5d 20 7b 0d 0a 20  V2 WINDOWS] {.. 
159b0 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
159c0 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68        # NOTE: Ch
159d0 65 63 6b 20 69 66 20 74 68 65 20 63 6f 6d 70 69  eck if the compi
159e0 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 20 69  le-time option i
159f0 73 20 6c 69 73 74 65 64 20 69 6e 20 74 68 65 20  s listed in the 
15a00 6c 69 73 74 20 6f 66 0d 0a 20 20 20 20 20 20 20  list of..       
15a10 20 20 20 23 20 20 20 20 20 20 20 22 64 65 66 69     #       "defi
15a20 6e 65 20 63 6f 6e 73 74 61 6e 74 73 22 20 6b 65  ne constants" ke
15a30 70 74 20 74 72 61 63 6b 20 6f 66 20 62 79 20 74  pt track of by t
15a40 68 65 20 6d 61 6e 61 67 65 64 20 61 73 73 65 6d  he managed assem
15a50 62 6c 79 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  bly...          
15a60 23 0d 0a 20 20 20 20 20 20 20 20 20 20 63 68 65  #..          che
15a70 63 6b 46 6f 72 53 51 4c 69 74 65 44 65 66 69 6e  ckForSQLiteDefin
15a80 65 43 6f 6e 73 74 61 6e 74 20 24 3a 3a 74 65 73  eConstant $::tes
15a90 74 5f 63 68 61 6e 6e 65 6c 20 24 64 65 66 69 6e  t_channel $defin
15aa0 65 43 6f 6e 73 74 61 6e 74 0d 0a 20 20 20 20 20  eConstant..     
15ab0 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
15ac0 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
15ad0 45 3a 20 43 68 65 63 6b 20 74 68 65 20 63 75 72  E: Check the cur
15ae0 72 65 6e 74 20 62 75 69 6c 64 20 79 65 61 72 2e  rent build year.
15af0 20 20 42 61 73 69 63 61 6c 6c 79 2c 20 74 68 69    Basically, thi
15b00 73 20 69 6e 64 69 63 61 74 65 73 0d 0a 20 20 20  s indicates..   
15b10 20 20 20 20 20 23 20 20 20 20 20 20 20 77 68 69       #       whi
15b20 63 68 20 76 65 72 73 69 6f 6e 20 6f 66 20 4d 53  ch version of MS
15b30 42 75 69 6c 64 20 61 6e 64 2f 6f 72 20 56 69 73  Build and/or Vis
15b40 75 61 6c 20 53 74 75 64 69 6f 20 77 61 73 20 75  ual Studio was u
15b50 73 65 64 20 74 6f 0d 0a 20 20 20 20 20 20 20 20  sed to..        
15b60 23 20 20 20 20 20 20 20 63 6f 6d 70 69 6c 65 20  #       compile 
15b70 74 68 65 20 61 73 73 65 6d 62 6c 79 20 62 69 6e  the assembly bin
15b80 61 72 69 65 73 20 75 6e 64 65 72 20 74 65 73 74  aries under test
15b90 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
15ba0 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
15bb0 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5c 0d 0a 20  est_channel \.. 
15bc0 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
15bd0 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 53 79   checking for Sy
15be0 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
15bf0 20 62 75 69 6c 64 20 79 65 61 72 2e 2e 2e 20 22   build year... "
15c00 0d 0a 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20  ....        set 
15c10 79 65 61 72 20 5b 67 65 74 42 75 69 6c 64 59 65  year [getBuildYe
15c20 61 72 5d 0d 0a 20 20 20 20 20 20 20 20 61 64 64  ar]..        add
15c30 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65  Constraint [appe
15c40 6e 64 41 72 67 73 20 62 75 69 6c 64 59 65 61 72  ndArgs buildYear
15c50 2e 20 24 79 65 61 72 5d 0d 0a 20 20 20 20 20 20  . $year]..      
15c60 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
15c70 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
15c80 72 67 73 20 5c 22 20 24 79 65 61 72 20 5c 22 5c  rgs \" $year \"\
15c90 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d  n]....        #.
15ca0 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
15cb0 20 43 68 65 63 6b 20 74 68 65 20 63 75 72 72 65   Check the curre
15cc0 6e 74 20 62 75 69 6c 64 20 63 6f 6e 66 69 67 75  nt build configu
15cd0 72 61 74 69 6f 6e 2e 20 20 54 68 69 73 20 73 68  ration.  This sh
15ce0 6f 75 6c 64 20 6e 6f 72 6d 61 6c 6c 79 0d 0a 20  ould normally.. 
15cf0 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 62         #       b
15d00 65 20 65 69 74 68 65 72 20 22 44 65 62 75 67 22  e either "Debug"
15d10 20 6f 72 20 22 52 65 6c 65 61 73 65 22 2e 0d 0a   or "Release"...
15d20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
15d30 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
15d40 5f 63 68 61 6e 6e 65 6c 20 5c 0d 0a 20 20 20 20  _channel \..    
15d50 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 68          "---- ch
15d60 65 63 6b 69 6e 67 20 66 6f 72 20 53 79 73 74 65  ecking for Syste
15d70 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 20 62 75  m.Data.SQLite bu
15d80 69 6c 64 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  ild configuratio
15d90 6e 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 20 20  n... "....      
15da0 20 20 73 65 74 20 63 6f 6e 66 69 67 75 72 61 74    set configurat
15db0 69 6f 6e 20 5b 67 65 74 42 75 69 6c 64 43 6f 6e  ion [getBuildCon
15dc0 66 69 67 75 72 61 74 69 6f 6e 5d 0d 0a 20 20 20  figuration]..   
15dd0 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69       addConstrai
15de0 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20 62  nt [appendArgs b
15df0 75 69 6c 64 43 6f 6e 66 69 67 75 72 61 74 69 6f  uildConfiguratio
15e00 6e 2e 20 24 63 6f 6e 66 69 67 75 72 61 74 69 6f  n. $configuratio
15e10 6e 5d 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74  n]..        tput
15e20 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
15e30 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 22  l [appendArgs \"
15e40 20 24 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20   $configuration 
15e50 5c 22 5c 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  \"\n]....       
15e60 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
15e70 54 45 3a 20 54 72 79 20 74 6f 20 73 65 74 75 70  TE: Try to setup
15e80 20 61 6e 20 69 6e 74 65 72 72 75 70 74 20 63 61   an interrupt ca
15e90 6c 6c 62 61 63 6b 20 75 73 69 6e 67 20 74 68 65  llback using the
15ea0 20 73 63 72 69 70 74 20 64 65 62 75 67 67 65 72   script debugger
15eb0 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
15ec0 20 20 74 68 61 74 20 77 69 6c 6c 20 63 61 6e 63    that will canc
15ed0 65 6c 20 61 6c 6c 20 53 51 4c 20 71 75 65 72 69  el all SQL queri
15ee0 65 73 20 69 6e 20 70 72 6f 67 72 65 73 73 20 66  es in progress f
15ef0 6f 72 20 61 6c 6c 20 64 61 74 61 62 61 73 65 0d  or all database.
15f00 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
15f10 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 6b 6e 6f   connections kno
15f20 77 6e 20 74 6f 20 74 68 69 73 20 69 6e 74 65 72  wn to this inter
15f30 70 72 65 74 65 72 2e 0d 0a 20 20 20 20 20 20 20  preter...       
15f40 20 23 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b   #..        if {
15f50 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  ![info exists ::
15f60 6e 6f 28 73 71 6c 69 74 65 49 6e 74 65 72 72 75  no(sqliteInterru
15f70 70 74 43 61 6c 6c 62 61 63 6b 29 5d 7d 20 74 68  ptCallback)]} th
15f80 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
15f90 73 65 74 75 70 44 62 49 6e 74 65 72 72 75 70 74  setupDbInterrupt
15fa0 43 61 6c 6c 62 61 63 6b 20 24 3a 3a 74 65 73 74  Callback $::test
15fb0 5f 63 68 61 6e 6e 65 6c 20 24 3a 3a 74 65 73 74  _channel $::test
15fc0 5f 6c 6f 67 0d 0a 20 20 20 20 20 20 20 20 7d 0d  _log..        }.
15fd0 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
15fe0 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68        # NOTE: Ch
15ff0 65 63 6b 20 66 6f 72 20 74 68 65 20 6e 61 74 69  eck for the nati
16000 76 65 20 72 75 6e 74 69 6d 65 20 6f 70 74 69 6f  ve runtime optio
16010 6e 2c 20 77 68 69 63 68 20 77 6f 75 6c 64 20 6d  n, which would m
16020 65 61 6e 20 77 65 20 61 72 65 0d 0a 20 20 20 20  ean we are..    
16030 20 20 20 20 23 20 20 20 20 20 20 20 75 73 69 6e      #       usin
16040 67 20 74 68 65 20 6d 69 78 65 64 2d 6d 6f 64 65  g the mixed-mode
16050 20 61 73 73 65 6d 62 6c 79 2e 0d 0a 20 20 20 20   assembly...    
16060 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 63      #..        c
16070 68 65 63 6b 46 6f 72 52 75 6e 74 69 6d 65 4f 70  heckForRuntimeOp
16080 74 69 6f 6e 20 24 3a 3a 74 65 73 74 5f 63 68 61  tion $::test_cha
16090 6e 6e 65 6c 20 6e 61 74 69 76 65 0d 0a 0d 0a 20  nnel native.... 
160a0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
160b0 20 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20    # NOTE: Check 
160c0 69 66 20 74 68 65 20 74 65 73 74 20 73 75 69 74  if the test suit
160d0 65 20 73 68 6f 75 6c 64 20 63 6f 75 6e 74 20 74  e should count t
160e0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6e  he number of con
160f0 6e 65 63 74 69 6f 6e 73 0d 0a 20 20 20 20 20 20  nections..      
16100 20 20 23 20 20 20 20 20 20 20 22 6f 70 65 6e 65    #       "opene
16110 64 22 20 61 6e 64 20 22 63 6c 6f 73 65 64 22 20  d" and "closed" 
16120 66 72 6f 6d 20 74 68 65 20 70 6f 6f 6c 20 77 68  from the pool wh
16130 65 6e 20 64 65 74 65 72 6d 69 6e 69 6e 67 20 69  en determining i
16140 66 20 61 20 74 65 73 74 0d 0a 20 20 20 20 20 20  f a test..      
16150 20 20 23 20 20 20 20 20 20 20 70 61 73 73 65 64    #       passed
16160 2e 20 20 44 69 73 61 62 6c 69 6e 67 20 74 68 69  .  Disabling thi
16170 73 20 62 65 68 61 76 69 6f 72 20 69 73 20 73 6f  s behavior is so
16180 6d 65 74 69 6d 65 73 20 6e 65 63 65 73 73 61 72  metimes necessar
16190 79 20 28 65 2e 67 2e 0d 0a 20 20 20 20 20 20 20  y (e.g...       
161a0 20 23 20 20 20 20 20 20 20 64 75 72 69 6e 67 20   #       during 
161b0 74 68 65 20 72 65 6c 65 61 73 65 20 74 65 73 74  the release test
161c0 69 6e 67 20 70 72 6f 63 65 73 73 29 20 62 65 63  ing process) bec
161d0 61 75 73 65 20 74 68 65 72 65 20 61 72 65 20 73  ause there are s
161e0 65 76 65 72 61 6c 0d 0a 20 20 20 20 20 20 20 20  everal..        
161f0 23 20 20 20 20 20 20 20 74 65 73 74 73 20 74 68  #       tests th
16200 61 74 20 72 65 6c 79 20 6f 6e 20 74 68 65 20 22  at rely on the "
16210 6f 70 65 6e 65 64 20 66 72 6f 6d 20 70 6f 6f 6c  opened from pool
16220 22 20 63 6f 75 6e 74 20 62 65 69 6e 67 20 67 72  " count being gr
16230 65 61 74 65 72 0d 0a 20 20 20 20 20 20 20 20 23  eater..        #
16240 20 20 20 20 20 20 20 74 68 61 6e 20 7a 65 72 6f         than zero
16250 2e 20 20 54 68 65 73 65 20 74 65 73 74 73 20 6d  .  These tests m
16260 61 79 20 66 61 69 6c 20 64 75 65 20 74 6f 20 74  ay fail due to t
16270 68 65 20 6e 6f 6e 2d 64 65 74 65 72 6d 69 6e 69  he non-determini
16280 73 74 69 63 0d 0a 20 20 20 20 20 20 20 20 23 20  stic..        # 
16290 20 20 20 20 20 20 62 65 68 61 76 69 6f 72 20 6f        behavior o
162a0 66 20 74 68 65 20 43 4c 52 20 47 43 2c 20 65 76  f the CLR GC, ev
162b0 65 6e 20 77 68 65 6e 20 74 68 65 72 65 20 69 73  en when there is
162c0 20 6e 6f 20 62 75 67 20 69 6e 20 74 68 65 20 63   no bug in the c
162d0 6f 64 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20  ode..        #  
162e0 20 20 20 20 20 62 65 69 6e 67 20 74 65 73 74 65       being teste
162f0 64 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  d...        #.. 
16300 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72 52         checkForR
16310 75 6e 74 69 6d 65 4f 70 74 69 6f 6e 20 24 3a 3a  untimeOption $::
16320 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 6e 6f 50  test_channel noP
16330 6f 6f 6c 43 6f 75 6e 74 73 0d 0a 0d 0a 20 20 20  oolCounts....   
16340 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
16350 23 20 4e 4f 54 45 3a 20 52 65 70 6f 72 74 20 74  # NOTE: Report t
16360 68 65 20 72 65 73 6f 75 72 63 65 20 75 73 61 67  he resource usag
16370 65 20 70 72 69 6f 72 20 74 6f 20 72 75 6e 6e 69  e prior to runni
16380 6e 67 20 61 6e 79 20 74 65 73 74 73 2e 0d 0a 20  ng any tests... 
16390 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
163a0 20 20 72 65 70 6f 72 74 53 51 4c 69 74 65 52 65    reportSQLiteRe
163b0 73 6f 75 72 63 65 73 20 24 3a 3a 74 65 73 74 5f  sources $::test_
163c0 63 68 61 6e 6e 65 6c 0d 0a 0d 0a 20 20 20 20 20  channel....     
163d0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
163e0 4e 4f 54 45 3a 20 53 68 6f 77 20 74 68 65 20 61  NOTE: Show the a
163f0 63 74 69 76 65 20 74 65 73 74 20 63 6f 6e 73 74  ctive test const
16400 72 61 69 6e 74 73 2e 0d 0a 20 20 20 20 20 20 20  raints...       
16410 20 23 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74   #..        tput
16420 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
16430 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 22 2d  l [appendArgs "-
16440 2d 2d 2d 20 63 6f 6e 73 74 72 61 69 6e 74 73 3a  --- constraints:
16450 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20   " \..          
16460 20 20 5b 66 6f 72 6d 61 74 4c 69 73 74 20 5b 6c    [formatList [l
16470 73 6f 72 74 20 5b 67 65 74 43 6f 6e 73 74 72 61  sort [getConstra
16480 69 6e 74 73 5d 5d 20 3c 6e 6f 6e 65 3e 5d 20 5c  ints]] <none>] \
16490 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d  n]....        #.
164a0 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
164b0 20 53 61 76 65 20 74 68 65 20 74 65 73 74 20 63   Save the test c
164c0 6f 6e 73 74 72 61 69 6e 74 73 20 66 6f 72 20 75  onstraints for u
164d0 73 65 20 62 79 20 74 68 72 65 61 64 73 20 63 72  se by threads cr
164e0 65 61 74 65 64 20 69 6e 20 74 68 69 73 0d 0a 20  eated in this.. 
164f0 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 61         #       a
16500 70 70 6c 69 63 61 74 69 6f 6e 20 64 6f 6d 61 69  pplication domai
16510 6e 2e 20 20 54 68 69 73 20 69 73 20 6e 65 63 65  n.  This is nece
16520 73 73 61 72 79 20 62 65 63 61 75 73 65 20 61 6c  ssary because al
16530 6c 20 74 68 65 20 45 61 67 6c 65 0d 0a 20 20 20  l the Eagle..   
16540 20 20 20 20 20 23 20 20 20 20 20 20 20 22 74 65       #       "te
16550 73 74 20 63 6f 6e 74 65 78 74 22 20 69 6e 66 6f  st context" info
16560 72 6d 61 74 69 6f 6e 20 69 73 20 70 65 72 2d 74  rmation is per-t
16570 68 72 65 61 64 2e 0d 0a 20 20 20 20 20 20 20 20  hread...        
16580 23 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21  #..        if {!
16590 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 74  [info exists ::t
165a0 65 73 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 5d  est_constraints]
165b0 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
165c0 20 20 20 20 73 65 74 20 3a 3a 74 65 73 74 5f 63      set ::test_c
165d0 6f 6e 73 74 72 61 69 6e 74 73 20 24 3a 3a 65 61  onstraints $::ea
165e0 67 6c 65 5f 74 65 73 74 73 28 63 6f 6e 73 74 72  gle_tests(constr
165f0 61 69 6e 74 73 29 0d 0a 20 20 20 20 20 20 20 20  aints)..        
16600 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  }....        #..
16610 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
16620 4c 6f 61 64 20 74 68 65 20 22 61 66 74 65 72 2d  Load the "after-
16630 63 6f 6e 73 74 72 61 69 6e 74 73 22 20 63 75 73  constraints" cus
16640 74 6f 6d 20 70 65 72 2d 75 73 65 72 20 61 6e 64  tom per-user and
16650 2f 6f 72 20 70 65 72 2d 68 6f 73 74 0d 0a 20 20  /or per-host..  
16660 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74 65        #       te
16670 73 74 20 73 65 74 74 69 6e 67 73 20 6e 6f 77 2e  st settings now.
16680 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
16690 20 20 20 20 20 75 70 6c 65 76 65 6c 20 31 20 5b       uplevel 1 [
166a0 6c 69 73 74 20 6c 6f 61 64 53 51 4c 69 74 65 54  list loadSQLiteT
166b0 65 73 74 53 65 74 74 69 6e 67 73 20 24 3a 3a 74  estSettings $::t
166c0 65 73 74 5f 63 68 61 6e 6e 65 6c 20 2e 61 66 74  est_channel .aft
166d0 65 72 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23  er]....        #
166e0 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
166f0 3a 20 53 68 6f 77 20 77 68 65 6e 20 6f 75 72 20  : Show when our 
16700 74 65 73 74 73 20 61 63 74 75 61 6c 6c 79 20 62  tests actually b
16710 65 67 61 6e 20 28 6e 6f 77 29 2e 0d 0a 20 20 20  egan (now)...   
16720 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
16730 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
16740 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
16750 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
16760 20 22 2d 2d 2d 2d 20 53 79 73 74 65 6d 2e 44 61   "---- System.Da
16770 74 61 2e 53 51 4c 69 74 65 20 74 65 73 74 73 20  ta.SQLite tests 
16780 62 65 67 61 6e 20 61 74 20 22 20 5c 0d 0a 20 20  began at " \..  
16790 20 20 20 20 20 20 20 20 20 20 5b 63 6c 6f 63 6b            [clock
167a0 20 66 6f 72 6d 61 74 20 5b 63 6c 6f 63 6b 20 73   format [clock s
167b0 65 63 6f 6e 64 73 5d 5d 20 5c 6e 5d 0d 0a 20 20  econds]] \n]..  
167c0 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d      }..    }....
167d0 0a 20 20 20 20 70 72 6f 63 20 72 75 6e 53 51 4c  .    proc runSQL
167e0 69 74 65 54 65 73 74 45 70 69 6c 6f 67 75 65 20  iteTestEpilogue 
167f0 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20  {} {..      #.. 
16800 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 6b 69       # NOTE: Ski
16810 70 20 72 75 6e 6e 69 6e 67 20 6f 75 72 20 63 75  p running our cu
16820 73 74 6f 6d 20 65 70 69 6c 6f 67 75 65 20 69 66  stom epilogue if
16830 20 74 68 65 20 6d 61 69 6e 20 6f 6e 65 20 68 61   the main one ha
16840 73 20 62 65 65 6e 0d 0a 20 20 20 20 20 20 23 20  s been..      # 
16850 20 20 20 20 20 20 73 6b 69 70 70 65 64 2e 0d 0a        skipped...
16860 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69        #..      i
16870 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73  f {![info exists
16880 20 3a 3a 6e 6f 28 65 70 69 6c 6f 67 75 65 2e 65   ::no(epilogue.e
16890 61 67 6c 65 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a  agle)]} then {..
168a0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
168b0 20 20 20 23 20 4e 4f 54 45 3a 20 53 68 6f 77 20     # NOTE: Show 
168c0 77 68 65 6e 20 6f 75 72 20 74 65 73 74 73 20 61  when our tests a
168d0 63 74 75 61 6c 6c 79 20 65 6e 64 65 64 20 28 6e  ctually ended (n
168e0 6f 77 29 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  ow)...        #.
168f0 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24  .        tputs $
16900 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b  ::test_channel [
16910 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
16920 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
16930 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
16940 74 65 20 74 65 73 74 73 20 65 6e 64 65 64 20 61  te tests ended a
16950 74 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  t " \..         
16960 20 20 20 5b 63 6c 6f 63 6b 20 66 6f 72 6d 61 74     [clock format
16970 20 5b 63 6c 6f 63 6b 20 73 65 63 6f 6e 64 73 5d   [clock seconds]
16980 5d 20 5c 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  ] \n]....       
16990 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 42 55   #..        # BU
169a0 47 46 49 58 3a 20 42 65 66 6f 72 65 20 63 68 65  GFIX: Before che
169b0 63 6b 69 6e 67 20 74 68 65 20 66 69 6e 61 6c 20  cking the final 
169c0 72 65 73 6f 75 72 63 65 73 20 69 6e 20 75 73 65  resources in use
169d0 20 62 79 20 53 51 4c 69 74 65 2c 20 6d 61 6b 65   by SQLite, make
169e0 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
169f0 20 20 20 20 73 75 72 65 20 62 6f 74 68 20 6f 66      sure both of
16a00 20 74 68 65 20 50 52 41 47 4d 41 20 72 65 6c 61   the PRAGMA rela
16a10 74 65 64 20 64 69 72 65 63 74 6f 72 79 20 6e 61  ted directory na
16a20 6d 65 73 20 61 72 65 20 66 72 65 65 64 2e 0d 0a  mes are freed...
16a30 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
16a40 20 20 20 63 68 65 63 6b 46 6f 72 53 51 4c 69 74     checkForSQLit
16a50 65 44 69 72 65 63 74 6f 72 69 65 73 20 24 3a 3a  eDirectories $::
16a60 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 74 72 75  test_channel tru
16a70 65 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  e....        #..
16a80 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
16a90 41 6c 73 6f 20 72 65 70 6f 72 74 20 74 68 65 20  Also report the 
16aa0 72 65 73 6f 75 72 63 65 20 75 73 61 67 65 20 61  resource usage a
16ab0 66 74 65 72 20 72 75 6e 6e 69 6e 67 20 74 68 65  fter running the
16ac0 20 74 65 73 74 73 2e 0d 0a 20 20 20 20 20 20 20   tests...       
16ad0 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 70 6f   #..        repo
16ae0 72 74 53 51 4c 69 74 65 52 65 73 6f 75 72 63 65  rtSQLiteResource
16af0 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
16b00 6c 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  l....        #..
16b10 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
16b20 52 65 70 6f 72 74 20 74 68 65 20 63 72 69 74 69  Report the criti
16b30 63 61 6c 20 68 61 6e 64 6c 65 20 63 6f 75 6e 74  cal handle count
16b40 73 20 61 66 74 65 72 20 72 75 6e 6e 69 6e 67 20  s after running 
16b50 74 68 65 20 74 65 73 74 73 2e 0d 0a 20 20 20 20  the tests...    
16b60 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 67      #..        g
16b70 65 74 53 51 4c 69 74 65 48 61 6e 64 6c 65 43 6f  etSQLiteHandleCo
16b80 75 6e 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  unts $::test_cha
16b90 6e 6e 65 6c 0d 0a 20 20 20 20 20 20 7d 0d 0a 20  nnel..      }.. 
16ba0 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 23 23 23     }.....    ###
16bb0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
16bc0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
16bd0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
16be0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
16bf0 23 23 23 23 23 23 23 23 0d 0a 20 20 20 20 23 23  ########..    ##
16c00 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
16c10 23 23 23 23 23 23 23 23 23 23 23 20 45 4e 44 20  ########### END 
16c20 45 61 67 6c 65 20 4f 4e 4c 59 20 23 23 23 23 23  Eagle ONLY #####
16c30 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
16c40 23 23 23 23 23 23 23 23 23 0d 0a 20 20 20 20 23  #########..    #
16c50 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
16c60 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
16c70 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
16c80 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
16c90 23 23 23 23 23 23 23 23 23 23 0d 0a 20 20 7d 0d  ##########..  }.
16ca0 0a 0d 0a 20 20 23 0d 0a 20 20 23 20 4e 4f 54 45  ...  #..  # NOTE
16cb0 3a 20 53 61 76 65 20 74 68 65 20 6e 61 6d 65 20  : Save the name 
16cc0 6f 66 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  of the directory
16cd0 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 69 73   containing this
16ce0 20 66 69 6c 65 2e 0d 0a 20 20 23 0d 0a 20 20 69   file...  #..  i
16cf0 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73  f {![info exists
16d00 20 63 6f 6d 6d 6f 6e 5f 64 69 72 65 63 74 6f 72   common_director
16d10 79 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  y]} then {..    
16d20 73 65 74 20 63 6f 6d 6d 6f 6e 5f 64 69 72 65 63  set common_direc
16d30 74 6f 72 79 20 5b 66 69 6c 65 20 64 69 72 6e 61  tory [file dirna
16d40 6d 65 20 5b 69 6e 66 6f 20 73 63 72 69 70 74 5d  me [info script]
16d50 5d 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 23 0d 0a 20  ]..  }....  #.. 
16d60 20 23 20 4e 4f 54 45 3a 20 50 72 6f 76 69 64 65   # NOTE: Provide
16d70 20 74 68 65 20 53 79 73 74 65 6d 2e 44 61 74 61   the System.Data
16d80 2e 53 51 4c 69 74 65 20 74 65 73 74 20 70 61 63  .SQLite test pac
16d90 6b 61 67 65 20 74 6f 20 74 68 65 20 69 6e 74 65  kage to the inte
16da0 72 70 72 65 74 65 72 2e 0d 0a 20 20 23 0d 0a 20  rpreter...  #.. 
16db0 20 70 61 63 6b 61 67 65 20 70 72 6f 76 69 64 65   package provide
16dc0 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c   System.Data.SQL
16dd0 69 74 65 2e 54 65 73 74 20 31 2e 30 0d 0a 7d 0d  ite.Test 1.0..}.
16de0 0a                                               .