System.Data.SQLite
Hex Artifact Content
Not logged in

Artifact b9f902c3e1d110885a786aa8a7bc1b65d32eb4b4:


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 43 6f 6e 66 69 67 75 72  getBuildConfigur
0f40: 61 74 69 6f 6e 20 7b 7d 20 7b 0d 0a 20 20 20 20  ation {} {..    
0f50: 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
0f60: 45 3a 20 53 65 65 20 69 66 20 74 68 65 20 22 63  E: See if the "c
0f70: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 22 20 73 65  onfiguration" se
0f80: 74 74 69 6e 67 20 68 61 73 20 62 65 65 6e 20 6f  tting has been o
0f90: 76 65 72 72 69 64 64 65 6e 20 62 79 20 74 68 65  verridden by the
0fa0: 20 75 73 65 72 0d 0a 20 20 20 20 20 20 23 20 20   user..      #  
0fb0: 20 20 20 20 20 28 65 2e 67 2e 20 6f 6e 20 74 68       (e.g. on th
0fc0: 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 29 2e  e command line).
0fd0: 20 20 54 68 69 73 20 68 65 6c 70 73 20 63 6f 6e    This helps con
0fe0: 74 72 6f 6c 20 65 78 61 63 74 6c 79 20 77 68 69  trol exactly whi
0ff0: 63 68 20 73 65 74 0d 0a 20 20 20 20 20 20 23 20  ch set..      # 
1000: 20 20 20 20 20 20 6f 66 20 62 69 6e 61 72 69 65        of binarie
1010: 73 20 77 65 20 61 72 65 20 74 65 73 74 69 6e 67  s we are testing
1020: 20 28 69 2e 65 2e 20 74 68 6f 73 65 20 62 75 69   (i.e. those bui
1030: 6c 74 20 69 6e 20 74 68 65 20 22 44 65 62 75 67  lt in the "Debug
1040: 22 20 6f 72 0d 0a 20 20 20 20 20 20 23 20 20 20  " or..      #   
1050: 20 20 20 20 22 52 65 6c 65 61 73 65 22 20 62 75      "Release" bu
1060: 69 6c 64 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  ild configuratio
1070: 6e 73 29 2e 20 20 54 6f 20 6f 76 65 72 72 69 64  ns).  To overrid
1080: 65 20 74 68 69 73 20 76 61 6c 75 65 20 76 69 61  e this value via
1090: 20 74 68 65 0d 0a 20 20 20 20 20 20 23 20 20 20   the..      #   
10a0: 20 20 20 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65      command line
10b0: 2c 20 65 6e 74 65 72 20 61 20 63 6f 6d 6d 61 6e  , enter a comman
10c0: 64 20 73 69 6d 69 6c 61 72 20 74 6f 20 6f 6e 65  d similar to one
10d0: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
10e0: 67 20 28 61 6c 6c 0d 0a 20 20 20 20 20 20 23 20  g (all..      # 
10f0: 20 20 20 20 20 20 6f 6e 20 6f 6e 65 20 6c 69 6e        on one lin
1100: 65 29 3a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  e):..      #..  
1110: 20 20 20 20 23 20 20 20 20 20 20 20 45 61 67 6c      #       Eagl
1120: 65 53 68 65 6c 6c 2e 65 78 65 20 2d 70 72 65 49  eShell.exe -preI
1130: 6e 69 74 69 61 6c 69 7a 65 20 22 73 65 74 20 74  nitialize "set t
1140: 65 73 74 5f 63 6f 6e 66 69 67 75 72 61 74 69 6f  est_configuratio
1150: 6e 20 44 65 62 75 67 22 0d 0a 20 20 20 20 20 20  n Debug"..      
1160: 23 20 20 20 20 20 20 20 20 20 2d 66 69 6c 65 20  #         -file 
1170: 2e 5c 70 61 74 68 5c 74 6f 5c 61 6c 6c 2e 65 61  .\path\to\all.ea
1180: 67 6c 65 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  gle..      #..  
1190: 20 20 20 20 23 20 20 20 20 20 20 20 45 61 67 6c      #       Eagl
11a0: 65 53 68 65 6c 6c 2e 65 78 65 20 2d 70 72 65 49  eShell.exe -preI
11b0: 6e 69 74 69 61 6c 69 7a 65 20 22 73 65 74 20 74  nitialize "set t
11c0: 65 73 74 5f 63 6f 6e 66 69 67 75 72 61 74 69 6f  est_configuratio
11d0: 6e 20 52 65 6c 65 61 73 65 22 0d 0a 20 20 20 20  n Release"..    
11e0: 20 20 23 20 20 20 20 20 20 20 20 20 2d 66 69 6c    #         -fil
11f0: 65 20 2e 5c 70 61 74 68 5c 74 6f 5c 61 6c 6c 2e  e .\path\to\all.
1200: 65 61 67 6c 65 0d 0a 20 20 20 20 20 20 23 0d 0a  eagle..      #..
1210: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 45 61        #       Ea
1220: 67 6c 65 53 68 65 6c 6c 2e 65 78 65 20 2d 66 69  gleShell.exe -fi
1230: 6c 65 20 2e 5c 70 61 74 68 5c 74 6f 5c 61 6c 6c  le .\path\to\all
1240: 2e 65 61 67 6c 65 20 2d 70 72 65 54 65 73 74 0d  .eagle -preTest.
1250: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 20  .      #        
1260: 20 22 75 6e 73 65 74 20 2d 6e 6f 63 6f 6d 70 6c   "unset -nocompl
1270: 61 69 6e 20 74 65 73 74 5f 63 6f 6e 66 69 67 75  ain test_configu
1280: 72 61 74 69 6f 6e 22 0d 0a 20 20 20 20 20 20 23  ration"..      #
1290: 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66  ..      if {[inf
12a0: 6f 20 65 78 69 73 74 73 20 3a 3a 74 65 73 74 5f  o exists ::test_
12b0: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 5d 20 26  configuration] &
12c0: 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b  & \..          [
12d0: 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a  string length $:
12e0: 3a 74 65 73 74 5f 63 6f 6e 66 69 67 75 72 61 74  :test_configurat
12f0: 69 6f 6e 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b  ion] > 0} then {
1300: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
1310: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 55 73 65       # NOTE: Use
1320: 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 74   the specified t
1330: 65 73 74 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  est configuratio
1340: 6e 2e 20 20 54 68 65 20 64 65 66 61 75 6c 74 20  n.  The default 
1350: 76 61 6c 75 65 20 75 73 65 64 0d 0a 20 20 20 20  value used..    
1360: 20 20 20 20 23 20 20 20 20 20 20 20 66 6f 72 20      #       for 
1370: 74 68 69 73 20 76 61 72 69 61 62 6c 65 20 69 73  this variable is
1380: 20 22 52 65 6c 65 61 73 65 22 2c 20 61 73 20 73   "Release", as s
1390: 65 74 20 62 79 20 74 68 65 20 74 65 73 74 20 73  et by the test s
13a0: 75 69 74 65 20 69 74 73 65 6c 66 2e 0d 0a 20 20  uite itself...  
13b0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
13c0: 20 72 65 74 75 72 6e 20 24 3a 3a 74 65 73 74 5f   return $::test_
13d0: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 0d 0a 20  configuration.. 
13e0: 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
13f0: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
1400: 20 20 23 20 4e 4f 54 45 3a 20 4e 6f 72 6d 61 6c    # NOTE: Normal
1410: 6c 79 2c 20 77 65 20 77 69 6c 6c 20 6e 65 76 65  ly, we will neve
1420: 72 20 68 69 74 20 74 68 69 73 20 63 61 73 65 20  r hit this case 
1430: 62 65 63 61 75 73 65 20 74 68 65 20 76 61 6c 75  because the valu
1440: 65 20 6f 66 20 74 68 65 0d 0a 20 20 20 20 20 20  e of the..      
1450: 20 20 23 20 20 20 20 20 20 20 74 65 73 74 20 63    #       test c
1460: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 76 61 72  onfiguration var
1470: 69 61 62 6c 65 20 69 73 20 61 6c 77 61 79 73 20  iable is always 
1480: 73 65 74 20 62 79 20 74 68 65 20 74 65 73 74 20  set by the test 
1490: 73 75 69 74 65 0d 0a 20 20 20 20 20 20 20 20 23  suite..        #
14a0: 20 20 20 20 20 20 20 69 74 73 65 6c 66 3b 20 68         itself; h
14b0: 6f 77 65 76 65 72 2c 20 69 74 20 63 61 6e 20 62  owever, it can b
14c0: 65 20 6f 76 65 72 72 69 64 64 65 6e 20 75 73 69  e overridden usi
14d0: 6e 67 20 74 68 65 20 75 6e 73 65 74 20 63 6f 6d  ng the unset com
14e0: 6d 61 6e 64 0d 0a 20 20 20 20 20 20 20 20 23 20  mand..        # 
14f0: 20 20 20 20 20 20 66 72 6f 6d 20 74 68 65 20 2d        from the -
1500: 70 72 65 54 65 73 74 20 6f 70 74 69 6f 6e 20 74  preTest option t
1510: 6f 20 74 68 65 20 74 65 73 74 20 73 75 69 74 65  o the test suite
1520: 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
1530: 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 3a 3a        return $::
1540: 65 61 67 6c 65 5f 70 6c 61 74 66 6f 72 6d 28 63  eagle_platform(c
1550: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 29 0d 0a 20  onfiguration).. 
1560: 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c       }..    }...
1570: 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74 42 75  ..    proc getBu
1580: 69 6c 64 44 69 72 65 63 74 6f 72 79 20 7b 7d 20  ildDirectory {} 
1590: 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  {..      #..    
15a0: 20 20 23 20 4e 4f 54 45 3a 20 53 65 65 20 69 66    # NOTE: See if
15b0: 20 74 68 65 20 22 6e 61 74 69 76 65 22 20 72 75   the "native" ru
15c0: 6e 74 69 6d 65 20 6f 70 74 69 6f 6e 20 68 61 73  ntime option has
15d0: 20 62 65 65 6e 20 73 65 74 2e 20 20 49 66 20 73   been set.  If s
15e0: 6f 2c 20 75 73 65 20 74 68 65 0d 0a 20 20 20 20  o, use the..    
15f0: 20 20 23 20 20 20 20 20 20 20 64 69 72 65 63 74    #       direct
1600: 6f 72 79 20 66 6f 72 20 74 68 65 20 6d 69 78 65  ory for the mixe
1610: 64 2d 6d 6f 64 65 20 61 73 73 65 6d 62 6c 79 20  d-mode assembly 
1620: 28 61 2e 6b 2e 61 2e 20 74 68 65 20 6e 61 74 69  (a.k.a. the nati
1630: 76 65 20 69 6e 74 65 72 6f 70 0d 0a 20 20 20 20  ve interop..    
1640: 20 20 23 20 20 20 20 20 20 20 61 73 73 65 6d 62    #       assemb
1650: 6c 79 29 2e 20 20 54 6f 20 65 6e 61 62 6c 65 20  ly).  To enable 
1660: 74 68 69 73 20 6f 70 74 69 6f 6e 20 76 69 61 20  this option via 
1670: 74 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65  the command line
1680: 2c 20 65 6e 74 65 72 20 61 0d 0a 20 20 20 20 20  , enter a..     
1690: 20 23 20 20 20 20 20 20 20 63 6f 6d 6d 61 6e 64   #       command
16a0: 20 73 69 6d 69 6c 61 72 20 74 6f 20 6f 6e 65 20   similar to one 
16b0: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
16c0: 20 28 61 6c 6c 20 6f 6e 20 6f 6e 65 20 6c 69 6e   (all on one lin
16d0: 65 29 3a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  e):..      #..  
16e0: 20 20 20 20 23 20 20 20 20 20 20 20 45 61 67 6c      #       Eagl
16f0: 65 53 68 65 6c 6c 2e 65 78 65 20 2d 69 6e 69 74  eShell.exe -init
1700: 69 61 6c 69 7a 65 20 2d 72 75 6e 74 69 6d 65 4f  ialize -runtimeO
1710: 70 74 69 6f 6e 20 6e 61 74 69 76 65 0d 0a 20 20  ption native..  
1720: 20 20 20 20 23 20 20 20 20 20 20 20 20 20 2d 66      #         -f
1730: 69 6c 65 20 2e 5c 70 61 74 68 5c 74 6f 5c 61 6c  ile .\path\to\al
1740: 6c 2e 65 61 67 6c 65 0d 0a 20 20 20 20 20 20 23  l.eagle..      #
1750: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
1760: 54 6f 20 65 6e 61 62 6c 65 20 74 68 69 73 20 6f  To enable this o
1770: 70 74 69 6f 6e 20 76 69 61 20 74 68 65 20 63 6f  ption via the co
1780: 6d 6d 61 6e 64 20 6c 69 6e 65 20 70 72 69 6f 72  mmand line prior
1790: 20 74 6f 20 74 68 65 20 22 62 65 74 61 20 31 36   to the "beta 16
17a0: 22 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  "..      #      
17b0: 20 72 65 6c 65 61 73 65 20 6f 66 20 45 61 67 6c   release of Eagl
17c0: 65 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  e, the following
17d0: 20 63 6f 6d 6d 61 6e 64 20 6d 75 73 74 20 62 65   command must be
17e0: 20 75 73 65 64 20 69 6e 73 74 65 61 64 0d 0a 20   used instead.. 
17f0: 20 20 20 20 20 23 20 20 20 20 20 20 20 28 61 6c       #       (al
1800: 73 6f 20 61 6c 6c 20 6f 6e 20 6f 6e 65 20 6c 69  so all on one li
1810: 6e 65 29 3a 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ne):..      #.. 
1820: 20 20 20 20 20 23 20 20 20 20 20 20 20 45 61 67       #       Eag
1830: 6c 65 53 68 65 6c 6c 2e 65 78 65 20 2d 69 6e 69  leShell.exe -ini
1840: 74 69 61 6c 69 7a 65 20 2d 70 6f 73 74 49 6e 69  tialize -postIni
1850: 74 69 61 6c 69 7a 65 0d 0a 20 20 20 20 20 20 23  tialize..      #
1860: 20 20 20 20 20 20 20 20 20 22 6f 62 6a 65 63 74           "object
1870: 20 69 6e 76 6f 6b 65 20 49 6e 74 65 72 70 72 65   invoke Interpre
1880: 74 65 72 2e 47 65 74 41 63 74 69 76 65 20 41 64  ter.GetActive Ad
1890: 64 52 75 6e 74 69 6d 65 4f 70 74 69 6f 6e 20 6e  dRuntimeOption n
18a0: 61 74 69 76 65 22 0d 0a 20 20 20 20 20 20 23 20  ative"..      # 
18b0: 20 20 20 20 20 20 20 20 2d 66 69 6c 65 20 2e 5c          -file .\
18c0: 70 61 74 68 5c 74 6f 5c 61 6c 6c 2e 65 61 67 6c  path\to\all.eagl
18d0: 65 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  e..      #..    
18e0: 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73    if {[info exis
18f0: 74 73 20 3a 3a 62 75 69 6c 64 5f 64 69 72 65 63  ts ::build_direc
1900: 74 6f 72 79 5d 20 26 26 20 5c 0d 0a 20 20 20 20  tory] && \..    
1910: 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65        [string le
1920: 6e 67 74 68 20 24 3a 3a 62 75 69 6c 64 5f 64 69  ngth $::build_di
1930: 72 65 63 74 6f 72 79 5d 20 3e 20 30 7d 20 74 68  rectory] > 0} th
1940: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d  en {..        #.
1950: 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
1960: 20 54 68 65 20 6c 6f 63 61 74 69 6f 6e 20 6f 66   The location of
1970: 20 74 68 65 20 62 75 69 6c 64 20 64 69 72 65 63   the build direc
1980: 74 6f 72 79 20 68 61 73 20 62 65 65 6e 20 6f 76  tory has been ov
1990: 65 72 72 69 64 64 65 6e 3b 0d 0a 20 20 20 20 20  erridden;..     
19a0: 20 20 20 23 20 20 20 20 20 20 20 74 68 65 72 65     #       there
19b0: 66 6f 72 65 2c 20 75 73 65 20 69 74 20 76 65 72  fore, use it ver
19c0: 62 61 74 69 6d 2e 0d 0a 20 20 20 20 20 20 20 20  batim...        
19d0: 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  #..        retur
19e0: 6e 20 24 3a 3a 62 75 69 6c 64 5f 64 69 72 65 63  n $::build_direc
19f0: 74 6f 72 79 0d 0a 20 20 20 20 20 20 7d 20 65 6c  tory..      } el
1a00: 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d  se {..        #.
1a10: 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
1a20: 20 46 69 67 75 72 65 20 6f 75 74 20 74 68 65 20   Figure out the 
1a30: 62 75 69 6c 64 20 62 61 73 65 20 64 69 72 65 63  build base direc
1a40: 74 6f 72 79 2e 20 20 54 68 69 73 20 77 69 6c 6c  tory.  This will
1a50: 20 62 65 20 74 68 65 20 64 69 72 65 63 74 6f 72   be the director
1a60: 79 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  y..        #    
1a70: 20 20 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73     that contains
1a80: 20 74 68 65 20 61 63 74 75 61 6c 20 62 75 69 6c   the actual buil
1a90: 64 20 6f 75 74 70 75 74 20 64 69 72 65 63 74 6f  d output directo
1aa0: 72 79 20 28 65 2e 67 2e 20 22 62 69 6e 22 29 2e  ry (e.g. "bin").
1ab0: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
1ac0: 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65       if {[info e
1ad0: 78 69 73 74 73 20 3a 3a 62 75 69 6c 64 5f 62 61  xists ::build_ba
1ae0: 73 65 5f 64 69 72 65 63 74 6f 72 79 5d 20 26 26  se_directory] &&
1af0: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
1b00: 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
1b10: 3a 3a 62 75 69 6c 64 5f 62 61 73 65 5f 64 69 72  ::build_base_dir
1b20: 65 63 74 6f 72 79 5d 20 3e 20 30 7d 20 74 68 65  ectory] > 0} the
1b30: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 23  n {..          #
1b40: 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f  ..          # NO
1b50: 54 45 3a 20 54 68 65 20 6c 6f 63 61 74 69 6f 6e  TE: The location
1b60: 20 6f 66 20 74 68 65 20 62 75 69 6c 64 20 62 61   of the build ba
1b70: 73 65 20 64 69 72 65 63 74 6f 72 79 20 68 61 73  se directory has
1b80: 20 62 65 65 6e 20 6f 76 65 72 72 69 64 64 65 6e   been overridden
1b90: 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 20  ;..          #  
1ba0: 20 20 20 20 20 74 68 65 72 65 66 6f 72 65 2c 20       therefore, 
1bb0: 75 73 65 20 69 74 20 76 65 72 62 61 74 69 6d 2e  use it verbatim.
1bc0: 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20  ..          #.. 
1bd0: 20 20 20 20 20 20 20 20 20 73 65 74 20 70 61 74           set pat
1be0: 68 20 24 3a 3a 62 75 69 6c 64 5f 62 61 73 65 5f  h $::build_base_
1bf0: 64 69 72 65 63 74 6f 72 79 0d 0a 20 20 20 20 20  directory..     
1c00: 20 20 20 7d 20 65 6c 73 65 69 66 20 7b 5b 69 6e     } elseif {[in
1c10: 66 6f 20 65 78 69 73 74 73 20 3a 3a 63 6f 6d 6d  fo exists ::comm
1c20: 6f 6e 5f 64 69 72 65 63 74 6f 72 79 5d 20 26 26  on_directory] &&
1c30: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
1c40: 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
1c50: 3a 3a 63 6f 6d 6d 6f 6e 5f 64 69 72 65 63 74 6f  ::common_directo
1c60: 72 79 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d  ry] > 0} then {.
1c70: 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
1c80: 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
1c90: 4e 65 78 74 2c 20 66 61 6c 6c 62 61 63 6b 20 74  Next, fallback t
1ca0: 6f 20 74 68 65 20 70 61 72 65 6e 74 20 64 69 72  o the parent dir
1cb0: 65 63 74 6f 72 79 20 6f 66 20 74 68 65 20 6f 6e  ectory of the on
1cc0: 65 20 63 6f 6e 74 61 69 6e 69 6e 67 0d 0a 20 20  e containing..  
1cd0: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
1ce0: 74 68 69 73 20 66 69 6c 65 20 28 69 2e 65 2e 20  this file (i.e. 
1cf0: 22 63 6f 6d 6d 6f 6e 2e 65 61 67 6c 65 22 29 2c  "common.eagle"),
1d00: 20 69 66 20 61 76 61 69 6c 61 62 6c 65 2e 0d 0a   if available...
1d10: 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
1d20: 20 20 20 20 20 20 20 73 65 74 20 70 61 74 68 20         set path 
1d30: 5b 66 69 6c 65 20 64 69 72 6e 61 6d 65 20 24 3a  [file dirname $:
1d40: 3a 63 6f 6d 6d 6f 6e 5f 64 69 72 65 63 74 6f 72  :common_director
1d50: 79 5d 0d 0a 20 20 20 20 20 20 20 20 7d 20 65 6c  y]..        } el
1d60: 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  se {..          
1d70: 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e  #..          # N
1d80: 4f 54 45 3a 20 46 69 6e 61 6c 6c 79 2c 20 66 61  OTE: Finally, fa
1d90: 6c 6c 62 61 63 6b 20 74 6f 20 74 68 65 20 70 61  llback to the pa
1da0: 72 65 6e 74 20 64 69 72 65 63 74 6f 72 79 20 6f  rent directory o
1db0: 66 20 74 68 65 20 45 61 67 6c 65 54 65 73 74 0d  f the EagleTest.
1dc0: 0a 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20  .          #    
1dd0: 20 20 20 70 61 74 68 2e 20 20 54 68 65 20 45 61     path.  The Ea
1de0: 67 6c 65 54 65 73 74 20 70 61 63 6b 61 67 65 20  gleTest package 
1df0: 67 75 61 72 61 6e 74 65 65 73 20 74 68 61 74 20  guarantees that 
1e00: 74 68 69 73 20 76 61 72 69 61 62 6c 65 0d 0a 20  this variable.. 
1e10: 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20           #      
1e20: 20 77 69 6c 6c 20 62 65 20 73 65 74 20 74 6f 20   will be set to 
1e30: 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 63 6f  the directory co
1e40: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 66 69 72  ntaining the fir
1e50: 73 74 20 66 69 6c 65 20 74 6f 0d 0a 20 20 20 20  st file to..    
1e60: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 65 78        #       ex
1e70: 65 63 75 74 65 20 74 68 65 20 5b 72 75 6e 54 65  ecute the [runTe
1e80: 73 74 50 72 6f 6c 6f 67 75 65 5d 20 73 63 72 69  stPrologue] scri
1e90: 70 74 20 6c 69 62 72 61 72 79 20 70 72 6f 63 65  pt library proce
1ea0: 64 75 72 65 2e 0d 0a 20 20 20 20 20 20 20 20 20  dure...         
1eb0: 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65   #..          se
1ec0: 74 20 70 61 74 68 20 5b 66 69 6c 65 20 64 69 72  t path [file dir
1ed0: 6e 61 6d 65 20 24 3a 3a 70 61 74 68 5d 0d 0a 20  name $::path].. 
1ee0: 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
1ef0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
1f00: 20 4e 4f 54 45 3a 20 49 66 20 74 68 65 20 22 6e   NOTE: If the "n
1f10: 61 74 69 76 65 22 20 72 75 6e 74 69 6d 65 20 6f  ative" runtime o
1f20: 70 74 69 6f 6e 20 69 73 20 73 65 74 2c 20 74 68  ption is set, th
1f30: 65 20 6d 69 78 65 64 2d 6d 6f 64 65 20 61 73 73  e mixed-mode ass
1f40: 65 6d 62 6c 79 0d 0a 20 20 20 20 20 20 20 20 23  embly..        #
1f50: 20 20 20 20 20 20 20 69 73 20 62 65 69 6e 67 20         is being 
1f60: 74 65 73 74 65 64 2e 20 20 49 6e 20 74 68 61 74  tested.  In that
1f70: 20 63 61 73 65 2c 20 74 68 65 20 70 61 74 68 20   case, the path 
1f80: 74 6f 20 74 68 65 20 62 75 69 6c 64 20 64 69 72  to the build dir
1f90: 65 63 74 6f 72 79 0d 0a 20 20 20 20 20 20 20 20  ectory..        
1fa0: 23 20 20 20 20 20 20 20 77 69 6c 6c 20 63 6f 6e  #       will con
1fb0: 74 61 69 6e 20 74 68 65 20 70 6c 61 74 66 6f 72  tain the platfor
1fc0: 6d 20 6e 61 6d 65 20 61 6e 64 20 61 6c 6c 20 74  m name and all t
1fd0: 68 65 20 62 69 6e 61 72 69 65 73 20 75 6e 64 65  he binaries unde
1fe0: 72 20 74 65 73 74 0d 0a 20 20 20 20 20 20 20 20  r test..        
1ff0: 23 20 20 20 20 20 20 20 73 68 6f 75 6c 64 20 62  #       should b
2000: 65 20 70 72 65 73 65 6e 74 20 69 6e 20 74 68 61  e present in tha
2010: 74 20 64 69 72 65 63 74 6f 72 79 2e 20 20 49 66  t directory.  If
2020: 20 74 68 65 20 22 6e 61 74 69 76 65 22 20 72 75   the "native" ru
2030: 6e 74 69 6d 65 0d 0a 20 20 20 20 20 20 20 20 23  ntime..        #
2040: 20 20 20 20 20 20 20 6f 70 74 69 6f 6e 20 69 73         option is
2050: 20 6e 6f 74 20 73 65 74 2c 20 74 68 65 20 62 75   not set, the bu
2060: 69 6c 64 20 64 69 72 65 63 74 6f 72 79 20 77 69  ild directory wi
2070: 6c 6c 20 62 65 20 63 6f 6e 73 69 64 65 72 65 64  ll be considered
2080: 20 74 6f 20 62 65 0d 0a 20 20 20 20 20 20 20 20   to be..        
2090: 23 20 20 20 20 20 20 20 22 70 6c 61 74 66 6f 72  #       "platfor
20a0: 6d 2d 6e 65 75 74 72 61 6c 22 2c 20 77 69 74 68  m-neutral", with
20b0: 20 74 68 65 20 6e 6f 74 61 62 6c 65 20 65 78 63   the notable exc
20c0: 65 70 74 69 6f 6e 20 6f 66 20 61 6e 79 20 6e 61  eption of any na
20d0: 74 69 76 65 0d 0a 20 20 20 20 20 20 20 20 23 20  tive..        # 
20e0: 20 20 20 20 20 20 61 73 73 65 6d 62 6c 79 20 28        assembly (
20f0: 65 2e 67 2e 20 22 53 51 4c 69 74 65 2e 49 6e 74  e.g. "SQLite.Int
2100: 65 72 6f 70 2e 64 6c 6c 22 29 20 63 6f 70 69 65  erop.dll") copie
2110: 64 20 74 68 65 72 65 20 64 75 72 69 6e 67 20 74  d there during t
2120: 68 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  he..        #   
2130: 20 20 20 20 62 75 69 6c 64 20 70 72 6f 63 65 73      build proces
2140: 73 20 69 74 73 65 6c 66 2e 20 20 49 66 20 74 68  s itself.  If th
2150: 65 20 62 75 69 6c 64 20 70 72 6f 63 65 73 73 20  e build process 
2160: 73 6f 6d 65 68 6f 77 20 64 6f 65 73 20 6e 6f 74  somehow does not
2170: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
2180: 20 20 63 6f 70 79 20 74 68 65 20 6e 61 74 69 76    copy the nativ
2190: 65 20 61 73 73 65 6d 62 6c 79 20 66 6f 72 20 74  e assembly for t
21a0: 68 69 73 20 70 6c 61 74 66 6f 72 6d 2c 20 6d 6f  his platform, mo
21b0: 73 74 20 6f 66 20 74 68 65 20 74 65 73 74 73 0d  st of the tests.
21c0: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
21d0: 20 69 6e 20 74 68 65 20 73 75 69 74 65 20 77 69   in the suite wi
21e0: 6c 6c 20 73 69 6d 70 6c 79 20 62 65 20 73 6b 69  ll simply be ski
21f0: 70 70 65 64 2e 20 20 47 65 6e 65 72 61 6c 6c 79  pped.  Generally
2200: 20 73 70 65 61 6b 69 6e 67 2c 20 74 68 65 72 65   speaking, there
2210: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
2220: 20 20 61 72 65 20 74 77 6f 20 77 61 79 73 20 74    are two ways t
2230: 6f 20 62 75 69 6c 64 20 74 68 65 20 62 69 6e 61  o build the bina
2240: 72 69 65 73 20 77 68 65 6e 20 70 72 65 70 61 72  ries when prepar
2250: 69 6e 67 20 74 6f 20 72 75 6e 20 74 68 65 0d 0a  ing to run the..
2260: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
2270: 74 65 73 74 20 73 75 69 74 65 3a 0d 0a 20 20 20  test suite:..   
2280: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
2290: 23 20 20 20 20 20 20 20 31 2e 20 42 75 69 6c 64  #       1. Build
22a0: 20 74 68 65 20 73 65 70 61 72 61 74 65 20 6d 61   the separate ma
22b0: 6e 61 67 65 64 20 61 6e 64 20 6e 61 74 69 76 65  naged and native
22c0: 20 61 73 73 65 6d 62 6c 69 65 73 20 75 73 69 6e   assemblies usin
22d0: 67 20 73 6f 6d 65 0d 0a 20 20 20 20 20 20 20 20  g some..        
22e0: 23 20 20 20 20 20 20 20 20 20 20 63 6f 6d 6d 61  #          comma
22f0: 6e 64 73 20 73 69 6d 69 6c 61 72 20 74 6f 3a 0d  nds similar to:.
2300: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
2310: 20 20 20 20 23 20 20 20 20 20 20 20 20 20 20 62      #          b
2320: 75 69 6c 64 2e 62 61 74 20 24 7b 43 6f 6e 66 69  uild.bat ${Confi
2330: 67 75 72 61 74 69 6f 6e 7d 4d 61 6e 61 67 65 64  guration}Managed
2340: 4f 6e 6c 79 20 24 7b 50 6c 61 74 66 6f 72 6d 7d  Only ${Platform}
2350: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
2360: 20 20 20 20 20 62 75 69 6c 64 2e 62 61 74 20 24       build.bat $
2370: 7b 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 7d 4e  {Configuration}N
2380: 61 74 69 76 65 4f 6e 6c 79 20 24 7b 50 6c 61 74  ativeOnly ${Plat
2390: 66 6f 72 6d 7d 0d 0a 20 20 20 20 20 20 20 20 23  form}..        #
23a0: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
23b0: 20 20 20 20 20 57 68 65 72 65 20 24 7b 43 6f 6e       Where ${Con
23c0: 66 69 67 75 72 61 74 69 6f 6e 7d 20 69 73 20 65  figuration} is e
23d0: 69 74 68 65 72 20 22 44 65 62 75 67 22 20 6f 72  ither "Debug" or
23e0: 20 22 52 65 6c 65 61 73 65 22 20 61 6e 64 0d 0a   "Release" and..
23f0: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
2400: 20 20 20 24 7b 50 6c 61 74 66 6f 72 6d 7d 20 69     ${Platform} i
2410: 73 20 65 69 74 68 65 72 20 22 57 69 6e 33 32 22  s either "Win32"
2420: 20 6f 72 20 22 78 36 34 22 2e 0d 0a 20 20 20 20   or "x64"...    
2430: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
2440: 20 20 20 20 20 20 20 32 2e 20 42 75 69 6c 64 20         2. Build 
2450: 74 68 65 20 6d 69 78 65 64 2d 6d 6f 64 65 20 61  the mixed-mode a
2460: 73 73 65 6d 62 6c 79 20 75 73 69 6e 67 20 61 20  ssembly using a 
2470: 63 6f 6d 6d 61 6e 64 20 73 69 6d 69 6c 61 72 20  command similar 
2480: 74 6f 3a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  to:..        #..
2490: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
24a0: 20 20 20 62 75 69 6c 64 2e 62 61 74 20 24 7b 43     build.bat ${C
24b0: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 7d 20 24 7b  onfiguration} ${
24c0: 50 6c 61 74 66 6f 72 6d 7d 0d 0a 20 20 20 20 20  Platform}..     
24d0: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
24e0: 20 20 20 20 20 20 20 20 20 57 68 65 72 65 20 24           Where $
24f0: 7b 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 7d 20  {Configuration} 
2500: 69 73 20 65 69 74 68 65 72 20 22 44 65 62 75 67  is either "Debug
2510: 22 20 6f 72 20 22 52 65 6c 65 61 73 65 22 20 61  " or "Release" a
2520: 6e 64 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  nd..        #   
2530: 20 20 20 20 20 20 20 24 7b 50 6c 61 74 66 6f 72         ${Platfor
2540: 6d 7d 20 69 73 20 65 69 74 68 65 72 20 22 57 69  m} is either "Wi
2550: 6e 33 32 22 20 6f 72 20 22 78 36 34 22 2e 20 20  n32" or "x64".  
2560: 49 66 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20  If this command 
2570: 69 73 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  is..        #   
2580: 20 20 20 20 20 20 20 75 73 65 64 2c 20 76 61 72         used, var
2590: 69 6f 75 73 20 74 65 73 74 73 20 74 68 61 74 20  ious tests that 
25a0: 72 65 71 75 69 72 65 20 73 75 70 70 6c 65 6d 65  require suppleme
25b0: 6e 74 61 72 79 20 6d 61 6e 61 67 65 64 0d 0a 20  ntary managed.. 
25c0: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 20         #        
25d0: 20 20 61 73 73 65 6d 62 6c 69 65 73 20 28 65 2e    assemblies (e.
25e0: 67 2e 20 4c 49 4e 51 29 20 6d 61 79 20 62 65 20  g. LINQ) may be 
25f0: 73 6b 69 70 70 65 64 20 75 6e 6c 65 73 73 20 74  skipped unless t
2600: 68 6f 73 65 20 62 69 6e 61 72 69 65 73 0d 0a 20  hose binaries.. 
2610: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 20         #        
2620: 20 20 61 72 65 20 73 75 62 73 65 71 75 65 6e 74    are subsequent
2630: 6c 79 20 63 6f 70 69 65 64 20 69 6e 74 6f 20 74  ly copied into t
2640: 68 65 20 63 6f 72 72 65 63 74 20 64 69 72 65 63  he correct direc
2650: 74 6f 72 79 20 28 69 2e 65 2e 20 62 79 0d 0a 20  tory (i.e. by.. 
2660: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 20         #        
2670: 20 20 22 74 65 73 74 5f 61 6c 6c 2e 62 61 74 22    "test_all.bat"
2680: 29 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  )...        #.. 
2690: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 4e         #       N
26a0: 6f 74 65 20 74 68 61 74 20 61 6c 6c 20 6f 66 20  ote that all of 
26b0: 74 68 65 20 62 75 69 6c 64 20 63 6f 6d 6d 61 6e  the build comman
26c0: 64 73 20 61 62 6f 76 65 20 77 69 6c 6c 20 64 65  ds above will de
26d0: 66 61 75 6c 74 20 74 6f 20 75 73 69 6e 67 0d 0a  fault to using..
26e0: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
26f0: 74 68 65 20 6c 61 74 65 73 74 20 76 65 72 73 69  the latest versi
2700: 6f 6e 20 6f 66 20 4d 53 42 75 69 6c 64 20 61 76  on of MSBuild av
2710: 61 69 6c 61 62 6c 65 20 61 6e 64 20 74 68 65 20  ailable and the 
2720: 22 74 65 73 74 5f 79 65 61 72 22 20 6d 61 79 0d  "test_year" may.
2730: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
2740: 20 6e 65 65 64 20 74 6f 20 62 65 20 61 64 6a 75   need to be adju
2750: 73 74 65 64 20 61 63 63 6f 72 64 69 6e 67 6c 79  sted accordingly
2760: 20 74 6f 20 61 63 74 75 61 6c 6c 79 20 72 75 6e   to actually run
2770: 20 74 68 65 20 74 65 73 74 20 73 75 69 74 65 2e   the test suite.
2780: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
2790: 20 20 52 65 66 65 72 20 74 6f 20 74 68 65 20 63    Refer to the c
27a0: 6f 6d 6d 65 6e 74 73 20 69 6e 20 5b 67 65 74 42  omments in [getB
27b0: 75 69 6c 64 59 65 61 72 5d 20 66 6f 72 20 6d 6f  uildYear] for mo
27c0: 72 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f  re information o
27d0: 6e 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  n..        #    
27e0: 20 20 20 68 6f 77 20 74 6f 20 73 65 74 20 74 68     how to set th
27f0: 69 73 20 76 61 72 69 61 62 6c 65 2e 0d 0a 20 20  is variable...  
2800: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
2810: 20 69 66 20 7b 5b 68 61 73 52 75 6e 74 69 6d 65   if {[hasRuntime
2820: 4f 70 74 69 6f 6e 20 6e 61 74 69 76 65 5d 7d 20  Option native]} 
2830: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
2840: 20 20 72 65 74 75 72 6e 20 5b 66 69 6c 65 20 6a    return [file j
2850: 6f 69 6e 20 24 70 61 74 68 20 62 69 6e 20 5b 67  oin $path bin [g
2860: 65 74 42 75 69 6c 64 59 65 61 72 5d 20 5b 6d 61  etBuildYear] [ma
2870: 63 68 69 6e 65 54 6f 50 6c 61 74 66 6f 72 6d 20  chineToPlatform 
2880: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
2890: 20 24 3a 3a 74 63 6c 5f 70 6c 61 74 66 6f 72 6d   $::tcl_platform
28a0: 28 6d 61 63 68 69 6e 65 29 5d 20 5b 67 65 74 42  (machine)] [getB
28b0: 75 69 6c 64 43 6f 6e 66 69 67 75 72 61 74 69 6f  uildConfiguratio
28c0: 6e 5d 5d 0d 0a 20 20 20 20 20 20 20 20 7d 20 65  n]]..        } e
28d0: 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  lse {..         
28e0: 20 72 65 74 75 72 6e 20 5b 66 69 6c 65 20 6a 6f   return [file jo
28f0: 69 6e 20 24 70 61 74 68 20 62 69 6e 20 5b 67 65  in $path bin [ge
2900: 74 42 75 69 6c 64 59 65 61 72 5d 20 5b 67 65 74  tBuildYear] [get
2910: 42 75 69 6c 64 43 6f 6e 66 69 67 75 72 61 74 69  BuildConfigurati
2920: 6f 6e 5d 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  on] \..         
2930: 20 20 20 20 20 62 69 6e 5d 0d 0a 20 20 20 20 20       bin]..     
2940: 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20     }..      }.. 
2950: 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
2960: 63 20 67 65 74 42 75 69 6c 64 46 69 6c 65 4e 61  c getBuildFileNa
2970: 6d 65 20 7b 20 66 69 6c 65 4e 61 6d 65 20 7d 20  me { fileName } 
2980: 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  {..      #..    
2990: 20 20 23 20 4e 4f 54 45 3a 20 52 65 74 75 72 6e    # NOTE: Return
29a0: 73 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  s the specified 
29b0: 66 69 6c 65 20 6e 61 6d 65 20 61 73 20 69 66 20  file name as if 
29c0: 69 74 20 77 65 72 65 20 6c 6f 63 61 74 65 64 20  it were located 
29d0: 69 6e 20 74 68 65 0d 0a 20 20 20 20 20 20 23 20  in the..      # 
29e0: 20 20 20 20 20 20 62 75 69 6c 64 20 64 69 72 65        build dire
29f0: 63 74 6f 72 79 2c 20 64 69 73 63 61 72 64 69 6e  ctory, discardin
2a00: 67 20 61 6e 79 20 64 69 72 65 63 74 6f 72 79 20  g any directory 
2a10: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 70 72 65 73  information pres
2a20: 65 6e 74 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ent..      #    
2a30: 20 20 20 69 6e 20 74 68 65 20 66 69 6c 65 20 6e     in the file n
2a40: 61 6d 65 20 61 73 20 70 72 6f 76 69 64 65 64 20  ame as provided 
2a50: 62 79 20 6f 75 72 20 63 61 6c 6c 65 72 2e 0d 0a  by our caller...
2a60: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 72        #..      r
2a70: 65 74 75 72 6e 20 5b 66 69 6c 65 20 6e 61 74 69  eturn [file nati
2a80: 76 65 6e 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20  vename \..      
2a90: 20 20 20 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5b      [file join [
2aa0: 67 65 74 42 75 69 6c 64 44 69 72 65 63 74 6f 72  getBuildDirector
2ab0: 79 5d 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 66  y] [file tail $f
2ac0: 69 6c 65 4e 61 6d 65 5d 5d 5d 0d 0a 20 20 20 20  ileName]]]..    
2ad0: 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67  }.....    proc g
2ae0: 65 74 42 69 6e 61 72 79 44 69 72 65 63 74 6f 72  etBinaryDirector
2af0: 79 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d  y {} {..      #.
2b00: 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54  .      # NOTE: T
2b10: 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 72 65  his procedure re
2b20: 74 75 72 6e 73 20 74 68 65 20 64 69 72 65 63 74  turns the direct
2b30: 6f 72 79 20 77 68 65 72 65 20 74 68 65 20 74 65  ory where the te
2b40: 73 74 20 61 70 70 6c 69 63 61 74 69 6f 6e 0d 0a  st application..
2b50: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 69 74        #       it
2b60: 73 65 6c 66 20 28 69 2e 65 2e 20 74 68 65 20 45  self (i.e. the E
2b70: 61 67 6c 65 20 73 68 65 6c 6c 29 20 69 73 20 6c  agle shell) is l
2b80: 6f 63 61 74 65 64 2e 20 20 54 68 69 73 20 77 69  ocated.  This wi
2b90: 6c 6c 20 62 65 20 75 73 65 64 20 61 73 0d 0a 20  ll be used as.. 
2ba0: 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68 65       #       the
2bb0: 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 66 6f 72   destination for
2bc0: 20 74 68 65 20 63 6f 70 69 65 64 20 53 79 73 74   the copied Syst
2bd0: 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 20 6e  em.Data.SQLite n
2be0: 61 74 69 76 65 20 61 6e 64 0d 0a 20 20 20 20 20  ative and..     
2bf0: 20 23 20 20 20 20 20 20 20 6d 61 6e 61 67 65 64   #       managed
2c00: 20 61 73 73 65 6d 62 6c 69 65 73 20 28 69 2e 65   assemblies (i.e
2c10: 2e 20 62 65 63 61 75 73 65 20 74 68 69 73 20 69  . because this i
2c20: 73 20 6f 6e 65 20 6f 66 20 74 68 65 20 66 65 77  s one of the few
2c30: 20 70 6c 61 63 65 73 0d 0a 20 20 20 20 20 20 23   places..      #
2c40: 20 20 20 20 20 20 20 77 68 65 72 65 20 74 68 65         where the
2c50: 20 43 4c 52 20 77 69 6c 6c 20 61 63 74 75 61 6c   CLR will actual
2c60: 6c 79 20 66 69 6e 64 20 61 6e 64 20 6c 6f 61 64  ly find and load
2c70: 20 74 68 65 6d 20 70 72 6f 70 65 72 6c 79 29 2e   them properly).
2c80: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
2c90: 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74   if {[info exist
2ca0: 73 20 3a 3a 62 69 6e 61 72 79 5f 64 69 72 65 63  s ::binary_direc
2cb0: 74 6f 72 79 5d 20 26 26 20 5c 0d 0a 20 20 20 20  tory] && \..    
2cc0: 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65        [string le
2cd0: 6e 67 74 68 20 24 3a 3a 62 69 6e 61 72 79 5f 64  ngth $::binary_d
2ce0: 69 72 65 63 74 6f 72 79 5d 20 3e 20 30 7d 20 74  irectory] > 0} t
2cf0: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  hen {..        #
2d00: 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
2d10: 3a 20 54 68 65 20 6c 6f 63 61 74 69 6f 6e 20 6f  : The location o
2d20: 66 20 74 68 65 20 62 69 6e 61 72 79 20 64 69 72  f the binary dir
2d30: 65 63 74 6f 72 79 20 68 61 73 20 62 65 65 6e 20  ectory has been 
2d40: 6f 76 65 72 72 69 64 64 65 6e 3b 0d 0a 20 20 20  overridden;..   
2d50: 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68 65       #       the
2d60: 72 65 66 6f 72 65 2c 20 75 73 65 20 69 74 20 76  refore, use it v
2d70: 65 72 62 61 74 69 6d 2e 0d 0a 20 20 20 20 20 20  erbatim...      
2d80: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74    #..        ret
2d90: 75 72 6e 20 24 3a 3a 62 69 6e 61 72 79 5f 64 69  urn $::binary_di
2da0: 72 65 63 74 6f 72 79 0d 0a 20 20 20 20 20 20 7d  rectory..      }
2db0: 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
2dc0: 20 72 65 74 75 72 6e 20 5b 69 6e 66 6f 20 62 69   return [info bi
2dd0: 6e 61 72 79 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a  nary]..      }..
2de0: 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
2df0: 6f 63 20 67 65 74 42 69 6e 61 72 79 46 69 6c 65  oc getBinaryFile
2e00: 4e 61 6d 65 20 7b 20 66 69 6c 65 4e 61 6d 65 20  Name { fileName 
2e10: 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  } {..      #..  
2e20: 20 20 20 20 23 20 4e 4f 54 45 3a 20 52 65 74 75      # NOTE: Retu
2e30: 72 6e 73 20 74 68 65 20 73 70 65 63 69 66 69 65  rns the specifie
2e40: 64 20 66 69 6c 65 20 6e 61 6d 65 20 61 73 20 69  d file name as i
2e50: 66 20 69 74 20 77 65 72 65 20 6c 6f 63 61 74 65  f it were locate
2e60: 64 20 69 6e 20 74 68 65 0d 0a 20 20 20 20 20 20  d in the..      
2e70: 23 20 20 20 20 20 20 20 62 69 6e 61 72 79 20 64  #       binary d
2e80: 69 72 65 63 74 6f 72 79 2c 20 64 69 73 63 61 72  irectory, discar
2e90: 64 69 6e 67 20 61 6e 79 20 64 69 72 65 63 74 6f  ding any directo
2ea0: 72 79 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 70  ry information p
2eb0: 72 65 73 65 6e 74 0d 0a 20 20 20 20 20 20 23 20  resent..      # 
2ec0: 20 20 20 20 20 20 69 6e 20 74 68 65 20 66 69 6c        in the fil
2ed0: 65 20 6e 61 6d 65 20 61 73 20 70 72 6f 76 69 64  e name as provid
2ee0: 65 64 20 62 79 20 6f 75 72 20 63 61 6c 6c 65 72  ed by our caller
2ef0: 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
2f00: 20 20 72 65 74 75 72 6e 20 5b 66 69 6c 65 20 6e    return [file n
2f10: 61 74 69 76 65 6e 61 6d 65 20 5c 0d 0a 20 20 20  ativename \..   
2f20: 20 20 20 20 20 20 20 5b 66 69 6c 65 20 6a 6f 69         [file joi
2f30: 6e 20 5b 67 65 74 42 69 6e 61 72 79 44 69 72 65  n [getBinaryDire
2f40: 63 74 6f 72 79 5d 20 5b 66 69 6c 65 20 74 61 69  ctory] [file tai
2f50: 6c 20 24 66 69 6c 65 4e 61 6d 65 5d 5d 5d 0d 0a  l $fileName]]]..
2f60: 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
2f70: 6f 63 20 67 65 74 43 6f 72 65 42 69 6e 61 72 79  oc getCoreBinary
2f80: 46 69 6c 65 4e 61 6d 65 20 7b 20 7b 73 74 61 6e  FileName { {stan
2f90: 64 61 72 64 20 66 61 6c 73 65 7d 20 7d 20 7b 0d  dard false} } {.
2fa0: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
2fb0: 23 20 4e 4f 54 45 3a 20 52 65 74 75 72 6e 73 20  # NOTE: Returns 
2fc0: 74 68 65 20 66 75 6c 6c 20 70 61 74 68 20 66 6f  the full path fo
2fd0: 72 20 74 68 65 20 66 69 6c 65 20 63 6f 6e 74 61  r the file conta
2fe0: 69 6e 69 6e 67 20 74 68 65 20 63 6f 72 65 20 53  ining the core S
2ff0: 51 4c 69 74 65 0d 0a 20 20 20 20 20 20 23 20 20  QLite..      #  
3000: 20 20 20 20 20 6c 69 62 72 61 72 79 20 63 6f 64       library cod
3010: 65 20 66 6f 72 20 74 68 69 73 20 70 6c 61 74 66  e for this platf
3020: 6f 72 6d 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  orm...      #.. 
3030: 20 20 20 20 20 69 66 20 7b 5b 68 61 73 52 75 6e       if {[hasRun
3040: 74 69 6d 65 4f 70 74 69 6f 6e 20 6e 61 74 69 76  timeOption nativ
3050: 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  e]} then {..    
3060: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
3070: 20 4e 4f 54 45 3a 20 52 65 74 75 72 6e 20 74 68   NOTE: Return th
3080: 65 20 6d 69 78 65 64 2d 6d 6f 64 65 20 61 73 73  e mixed-mode ass
3090: 65 6d 62 6c 79 20 66 69 6c 65 20 6e 61 6d 65 2e  embly file name.
30a0: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
30b0: 20 20 20 20 20 72 65 74 75 72 6e 20 5b 66 69 6c       return [fil
30c0: 65 20 6e 61 74 69 76 65 6e 61 6d 65 20 5c 0d 0a  e nativename \..
30d0: 20 20 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c              [fil
30e0: 65 20 6a 6f 69 6e 20 5b 67 65 74 42 69 6e 61 72  e join [getBinar
30f0: 79 44 69 72 65 63 74 6f 72 79 5d 20 53 79 73 74  yDirectory] Syst
3100: 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 64  em.Data.SQLite.d
3110: 6c 6c 5d 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c  ll]]..      } el
3120: 73 65 69 66 20 7b 24 73 74 61 6e 64 61 72 64 7d  seif {$standard}
3130: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
3140: 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
3150: 54 45 3a 20 52 65 74 75 72 6e 20 74 68 65 20 6e  TE: Return the n
3160: 61 74 69 76 65 2d 6f 6e 6c 79 20 73 74 61 6e 64  ative-only stand
3170: 61 72 64 20 53 51 4c 69 74 65 20 6c 69 62 72 61  ard SQLite libra
3180: 72 79 20 66 69 6c 65 20 6e 61 6d 65 2e 0d 0a 20  ry file name... 
3190: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
31a0: 20 20 72 65 74 75 72 6e 20 5b 66 69 6c 65 20 6e    return [file n
31b0: 61 74 69 76 65 6e 61 6d 65 20 5c 0d 0a 20 20 20  ativename \..   
31c0: 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20 6a           [file j
31d0: 6f 69 6e 20 5b 67 65 74 42 69 6e 61 72 79 44 69  oin [getBinaryDi
31e0: 72 65 63 74 6f 72 79 5d 20 73 71 6c 69 74 65 33  rectory] sqlite3
31f0: 2e 64 6c 6c 5d 5d 0d 0a 20 20 20 20 20 20 7d 20  .dll]]..      } 
3200: 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
3210: 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
3220: 45 3a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 61  E: Return the na
3230: 74 69 76 65 2d 6f 6e 6c 79 20 69 6e 74 65 72 6f  tive-only intero
3240: 70 20 61 73 73 65 6d 62 6c 79 20 66 69 6c 65 20  p assembly file 
3250: 6e 61 6d 65 2e 0d 0a 20 20 20 20 20 20 20 20 23  name...        #
3260: 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ..        return
3270: 20 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d   [file nativenam
3280: 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e \..           
3290: 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5b 67 65 74   [file join [get
32a0: 42 69 6e 61 72 79 44 69 72 65 63 74 6f 72 79 5d  BinaryDirectory]
32b0: 20 53 51 4c 69 74 65 2e 49 6e 74 65 72 6f 70 2e   SQLite.Interop.
32c0: 64 6c 6c 5d 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a  dll]]..      }..
32d0: 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
32e0: 6f 63 20 67 65 74 43 6f 6d 6d 6f 6e 44 69 72 65  oc getCommonDire
32f0: 63 74 6f 72 79 20 7b 7d 20 7b 0d 0a 20 20 20 20  ctory {} {..    
3300: 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
3310: 45 3a 20 54 68 69 73 20 70 72 6f 63 65 64 75 72  E: This procedur
3320: 65 20 72 65 74 75 72 6e 73 20 74 68 65 20 64 69  e returns the di
3330: 72 65 63 74 6f 72 79 20 77 68 65 72 65 20 74 68  rectory where th
3340: 65 20 74 65 73 74 20 73 63 72 69 70 74 73 0d 0a  e test scripts..
3350: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 73 68        #       sh
3360: 6f 75 6c 64 20 62 65 20 6c 6f 63 61 74 65 64 2e  ould be located.
3370: 20 20 42 79 20 64 65 66 61 75 6c 74 2c 20 74 68    By default, th
3380: 69 73 20 6a 75 73 74 20 72 65 74 75 72 6e 73 20  is just returns 
3390: 74 68 65 20 45 61 67 6c 65 0d 0a 20 20 20 20 20  the Eagle..     
33a0: 20 23 20 20 20 20 20 20 20 62 69 6e 61 72 79 20   #       binary 
33b0: 64 69 72 65 63 74 6f 72 79 2e 0d 0a 20 20 20 20  directory...    
33c0: 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b    #..      if {[
33d0: 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 63 6f  info exists ::co
33e0: 6d 6d 6f 6e 5f 64 69 72 65 63 74 6f 72 79 5d 20  mmon_directory] 
33f0: 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  && \..          
3400: 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
3410: 3a 3a 63 6f 6d 6d 6f 6e 5f 64 69 72 65 63 74 6f  ::common_directo
3420: 72 79 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d  ry] > 0} then {.
3430: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
3440: 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 65 20      # NOTE: The 
3450: 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  location of the 
3460: 63 6f 6d 6d 6f 6e 20 64 69 72 65 63 74 6f 72 79  common directory
3470: 20 68 61 73 20 62 65 65 6e 20 73 65 74 3b 0d 0a   has been set;..
3480: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
3490: 74 68 65 72 65 66 6f 72 65 2c 20 75 73 65 20 69  therefore, use i
34a0: 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  t...        #.. 
34b0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 3a         return $:
34c0: 3a 63 6f 6d 6d 6f 6e 5f 64 69 72 65 63 74 6f 72  :common_director
34d0: 79 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 69  y..      } elsei
34e0: 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20  f {[info exists 
34f0: 3a 3a 76 65 6e 64 6f 72 5f 64 69 72 65 63 74 6f  ::vendor_directo
3500: 72 79 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20  ry] && \..      
3510: 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67      [string leng
3520: 74 68 20 24 3a 3a 76 65 6e 64 6f 72 5f 64 69 72  th $::vendor_dir
3530: 65 63 74 6f 72 79 5d 20 3e 20 30 7d 20 74 68 65  ectory] > 0} the
3540: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  n {..        #..
3550: 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
3560: 54 68 65 20 6c 6f 63 61 74 69 6f 6e 20 6f 66 20  The location of 
3570: 74 68 65 20 76 65 6e 64 6f 72 20 64 69 72 65 63  the vendor direc
3580: 74 6f 72 79 20 68 61 73 20 62 65 65 6e 20 73 65  tory has been se
3590: 74 3b 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  t;..        #   
35a0: 20 20 20 20 74 68 65 72 65 66 6f 72 65 2c 20 75      therefore, u
35b0: 73 65 20 69 74 2e 0d 0a 20 20 20 20 20 20 20 20  se it...        
35c0: 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  #..        retur
35d0: 6e 20 24 3a 3a 76 65 6e 64 6f 72 5f 64 69 72 65  n $::vendor_dire
35e0: 63 74 6f 72 79 0d 0a 20 20 20 20 20 20 7d 20 65  ctory..      } e
35f0: 6c 73 65 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69  lseif {[info exi
3600: 73 74 73 20 3a 3a 74 63 6c 5f 6c 69 62 72 61 72  sts ::tcl_librar
3610: 79 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20  y] && \..       
3620: 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74     [string lengt
3630: 68 20 24 3a 3a 74 63 6c 5f 6c 69 62 72 61 72 79  h $::tcl_library
3640: 5d 20 3e 20 30 20 26 26 20 5c 0d 0a 20 20 20 20  ] > 0 && \..    
3650: 20 20 20 20 20 20 5b 66 69 6c 65 20 69 73 64 69        [file isdi
3660: 72 65 63 74 6f 72 79 20 24 3a 3a 74 63 6c 5f 6c  rectory $::tcl_l
3670: 69 62 72 61 72 79 5d 7d 20 74 68 65 6e 20 7b 0d  ibrary]} then {.
3680: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
3690: 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 65 20      # NOTE: The 
36a0: 76 61 72 69 61 62 6c 65 20 77 69 74 68 20 74 68  variable with th
36b0: 65 20 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 74 68  e location of th
36c0: 65 20 73 63 72 69 70 74 20 6c 69 62 72 61 72 79  e script library
36d0: 20 69 73 0d 0a 20 20 20 20 20 20 20 20 23 20 20   is..        #  
36e0: 20 20 20 20 20 73 65 74 20 61 6e 64 20 61 70 70       set and app
36f0: 65 61 72 73 20 74 6f 20 62 65 20 61 20 72 65 61  ears to be a rea
3700: 6c 20 64 69 72 65 63 74 6f 72 79 20 28 69 2e 65  l directory (i.e
3710: 2e 20 6e 6f 74 20 65 6d 62 65 64 64 65 64 0d 0a  . not embedded..
3720: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
3730: 77 69 74 68 69 6e 20 61 20 66 69 6c 65 29 3b 20  within a file); 
3740: 74 68 65 72 65 66 6f 72 65 2c 20 75 73 65 20 69  therefore, use i
3750: 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  t...        #.. 
3760: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 3a         return $:
3770: 3a 74 63 6c 5f 6c 69 62 72 61 72 79 0d 0a 20 20  :tcl_library..  
3780: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
3790: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
37a0: 20 23 20 4e 4f 54 45 3a 20 46 61 6c 6c 62 61 63   # NOTE: Fallbac
37b0: 6b 20 74 6f 20 74 68 65 20 64 69 72 65 63 74 6f  k to the directo
37c0: 72 79 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  ry containing th
37d0: 65 20 65 78 65 63 75 74 61 62 6c 65 2e 0d 0a 20  e executable... 
37e0: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
37f0: 20 20 72 65 74 75 72 6e 20 5b 69 6e 66 6f 20 62    return [info b
3800: 69 6e 61 72 79 5d 0d 0a 20 20 20 20 20 20 7d 0d  inary]..      }.
3810: 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70  .    }.....    p
3820: 72 6f 63 20 67 65 74 44 61 74 61 62 61 73 65 44  roc getDatabaseD
3830: 69 72 65 63 74 6f 72 79 20 7b 7d 20 7b 0d 0a 20  irectory {} {.. 
3840: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
3850: 4e 4f 54 45 3a 20 54 68 69 73 20 70 72 6f 63 65  NOTE: This proce
3860: 64 75 72 65 20 72 65 74 75 72 6e 73 20 74 68 65  dure returns the
3870: 20 64 69 72 65 63 74 6f 72 79 20 77 68 65 72 65   directory where
3880: 20 74 68 65 20 74 65 73 74 20 64 61 74 61 62 61   the test databa
3890: 73 65 73 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ses..      #    
38a0: 20 20 20 73 68 6f 75 6c 64 20 62 65 20 6c 6f 63     should be loc
38b0: 61 74 65 64 2e 20 20 42 79 20 64 65 66 61 75 6c  ated.  By defaul
38c0: 74 2c 20 74 68 69 73 20 6a 75 73 74 20 75 73 65  t, this just use
38d0: 73 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 0d  s the temporary.
38e0: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 64  .      #       d
38f0: 69 72 65 63 74 6f 72 79 20 63 6f 6e 66 69 67 75  irectory configu
3900: 72 65 64 20 66 6f 72 20 74 68 69 73 20 73 79 73  red for this sys
3910: 74 65 6d 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  tem...      #.. 
3920: 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65       if {[info e
3930: 78 69 73 74 73 20 3a 3a 64 61 74 61 62 61 73 65  xists ::database
3940: 5f 64 69 72 65 63 74 6f 72 79 5d 20 26 26 20 5c  _directory] && \
3950: 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 73 74 72  ..          [str
3960: 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a 64 61  ing length $::da
3970: 74 61 62 61 73 65 5f 64 69 72 65 63 74 6f 72 79  tabase_directory
3980: 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20  ] > 0} then {.. 
3990: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
39a0: 20 20 23 20 4e 4f 54 45 3a 20 54 68 65 20 6c 6f    # NOTE: The lo
39b0: 63 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 64 61  cation of the da
39c0: 74 61 62 61 73 65 20 64 69 72 65 63 74 6f 72 79  tabase directory
39d0: 20 68 61 73 20 62 65 65 6e 20 6f 76 65 72 72 69   has been overri
39e0: 64 64 65 6e 3b 0d 0a 20 20 20 20 20 20 20 20 23  dden;..        #
39f0: 20 20 20 20 20 20 20 74 68 65 72 65 66 6f 72 65         therefore
3a00: 2c 20 75 73 65 20 69 74 2e 0d 0a 20 20 20 20 20  , use it...     
3a10: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65     #..        re
3a20: 74 75 72 6e 20 24 3a 3a 64 61 74 61 62 61 73 65  turn $::database
3a30: 5f 64 69 72 65 63 74 6f 72 79 0d 0a 20 20 20 20  _directory..    
3a40: 20 20 7d 20 65 6c 73 65 69 66 20 7b 5b 69 6e 66    } elseif {[inf
3a50: 6f 20 65 78 69 73 74 73 20 3a 3a 73 63 72 61 74  o exists ::scrat
3a60: 63 68 5f 64 69 72 65 63 74 6f 72 79 5d 20 26 26  ch_directory] &&
3a70: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 73   \..          [s
3a80: 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a  tring length $::
3a90: 73 63 72 61 74 63 68 5f 64 69 72 65 63 74 6f 72  scratch_director
3aa0: 79 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  y] > 0} then {..
3ab0: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
3ac0: 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 65 20 6c     # NOTE: The l
3ad0: 6f 63 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 73  ocation of the s
3ae0: 63 72 61 74 63 68 20 64 69 72 65 63 74 6f 72 79  cratch directory
3af0: 20 68 61 73 20 62 65 65 6e 20 6f 76 65 72 72 69   has been overri
3b00: 64 64 65 6e 3b 0d 0a 20 20 20 20 20 20 20 20 23  dden;..        #
3b10: 20 20 20 20 20 20 20 74 68 65 72 65 66 6f 72 65         therefore
3b20: 2c 20 75 73 65 20 69 74 2e 0d 0a 20 20 20 20 20  , use it...     
3b30: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65     #..        re
3b40: 74 75 72 6e 20 24 3a 3a 73 63 72 61 74 63 68 5f  turn $::scratch_
3b50: 64 69 72 65 63 74 6f 72 79 0d 0a 20 20 20 20 20  directory..     
3b60: 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
3b70: 20 20 20 72 65 74 75 72 6e 20 5b 67 65 74 54 65     return [getTe
3b80: 6d 70 6f 72 61 72 79 50 61 74 68 5d 0d 0a 20 20  mporaryPath]..  
3b90: 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d      }..    }....
3ba0: 0a 20 20 20 20 70 72 6f 63 20 67 65 74 54 65 6d  .    proc getTem
3bb0: 70 6f 72 61 72 79 44 69 72 65 63 74 6f 72 79 20  poraryDirectory 
3bc0: 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20  {} {..      #.. 
3bd0: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 69       # NOTE: Thi
3be0: 73 20 70 72 6f 63 65 64 75 72 65 20 72 65 74 75  s procedure retu
3bf0: 72 6e 73 20 74 68 65 20 64 69 72 65 63 74 6f 72  rns the director
3c00: 79 20 77 68 65 72 65 20 74 68 65 20 74 65 6d 70  y where the temp
3c10: 6f 72 61 72 79 20 66 69 6c 65 73 0d 0a 20 20 20  orary files..   
3c20: 20 20 20 23 20 20 20 20 20 20 20 73 68 6f 75 6c     #       shoul
3c30: 64 20 62 65 20 6c 6f 63 61 74 65 64 2e 20 20 42  d be located.  B
3c40: 79 20 64 65 66 61 75 6c 74 2c 20 74 68 69 73 20  y default, this 
3c50: 6a 75 73 74 20 75 73 65 73 20 74 68 65 20 74 65  just uses the te
3c60: 6d 70 6f 72 61 72 79 0d 0a 20 20 20 20 20 20 23  mporary..      #
3c70: 20 20 20 20 20 20 20 64 69 72 65 63 74 6f 72 79         directory
3c80: 20 63 6f 6e 66 69 67 75 72 65 64 20 66 6f 72 20   configured for 
3c90: 74 68 69 73 20 73 79 73 74 65 6d 2e 0d 0a 20 20  this system...  
3ca0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20      #..      if 
3cb0: 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  {[info exists ::
3cc0: 74 65 6d 70 6f 72 61 72 79 5f 64 69 72 65 63 74  temporary_direct
3cd0: 6f 72 79 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20  ory] && \..     
3ce0: 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e       [string len
3cf0: 67 74 68 20 24 3a 3a 74 65 6d 70 6f 72 61 72 79  gth $::temporary
3d00: 5f 64 69 72 65 63 74 6f 72 79 5d 20 3e 20 30 7d  _directory] > 0}
3d10: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
3d20: 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
3d30: 54 45 3a 20 54 68 65 20 6c 6f 63 61 74 69 6f 6e  TE: The location
3d40: 20 6f 66 20 74 68 65 20 74 65 6d 70 6f 72 61 72   of the temporar
3d50: 79 20 64 69 72 65 63 74 6f 72 79 20 68 61 73 20  y directory has 
3d60: 62 65 65 6e 20 6f 76 65 72 72 69 64 64 65 6e 3b  been overridden;
3d70: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
3d80: 20 20 74 68 65 72 65 66 6f 72 65 2c 20 75 73 65    therefore, use
3d90: 20 69 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d   it...        #.
3da0: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
3db0: 24 3a 3a 74 65 6d 70 6f 72 61 72 79 5f 64 69 72  $::temporary_dir
3dc0: 65 63 74 6f 72 79 0d 0a 20 20 20 20 20 20 7d 20  ectory..      } 
3dd0: 65 6c 73 65 69 66 20 7b 5b 69 6e 66 6f 20 65 78  elseif {[info ex
3de0: 69 73 74 73 20 3a 3a 73 63 72 61 74 63 68 5f 64  ists ::scratch_d
3df0: 69 72 65 63 74 6f 72 79 5d 20 26 26 20 5c 0d 0a  irectory] && \..
3e00: 20 20 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e            [strin
3e10: 67 20 6c 65 6e 67 74 68 20 24 3a 3a 73 63 72 61  g length $::scra
3e20: 74 63 68 5f 64 69 72 65 63 74 6f 72 79 5d 20 3e  tch_directory] >
3e30: 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
3e40: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
3e50: 20 4e 4f 54 45 3a 20 54 68 65 20 6c 6f 63 61 74   NOTE: The locat
3e60: 69 6f 6e 20 6f 66 20 74 68 65 20 73 63 72 61 74  ion of the scrat
3e70: 63 68 20 64 69 72 65 63 74 6f 72 79 20 68 61 73  ch directory has
3e80: 20 62 65 65 6e 20 6f 76 65 72 72 69 64 64 65 6e   been overridden
3e90: 3b 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  ;..        #    
3ea0: 20 20 20 74 68 65 72 65 66 6f 72 65 2c 20 75 73     therefore, us
3eb0: 65 20 69 74 2e 0d 0a 20 20 20 20 20 20 20 20 23  e it...        #
3ec0: 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ..        return
3ed0: 20 24 3a 3a 73 63 72 61 74 63 68 5f 64 69 72 65   $::scratch_dire
3ee0: 63 74 6f 72 79 0d 0a 20 20 20 20 20 20 7d 20 65  ctory..      } e
3ef0: 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 72  lse {..        r
3f00: 65 74 75 72 6e 20 5b 67 65 74 54 65 6d 70 6f 72  eturn [getTempor
3f10: 61 72 79 50 61 74 68 5d 0d 0a 20 20 20 20 20 20  aryPath]..      
3f20: 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  }..    }.....   
3f30: 20 70 72 6f 63 20 67 65 74 54 65 73 74 4f 76 65   proc getTestOve
3f40: 72 72 69 64 65 73 50 72 65 61 6d 62 6c 65 20 7b  rridesPreamble {
3f50: 20 7b 65 78 74 72 61 56 61 72 4e 61 6d 65 73 20   {extraVarNames 
3f60: 22 22 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 73  ""} } {..      s
3f70: 65 74 20 76 61 72 4e 61 6d 65 73 20 5b 6c 69 73  et varNames [lis
3f80: 74 5d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20  t]....      #.. 
3f90: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 66 20       # NOTE: If 
3fa0: 61 76 61 69 6c 61 62 6c 65 2c 20 73 74 61 72 74  available, start
3fb0: 20 77 69 74 68 20 74 68 65 20 6d 61 73 74 65 72   with the master
3fc0: 20 6c 69 73 74 20 6f 66 20 74 65 73 74 20 6f 76   list of test ov
3fd0: 65 72 72 69 64 65 0d 0a 20 20 20 20 20 20 23 20  erride..      # 
3fe0: 20 20 20 20 20 20 76 61 72 69 61 62 6c 65 73 2e        variables.
3ff0: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
4000: 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74   if {[info exist
4010: 73 20 3a 3a 74 65 73 74 5f 6f 76 65 72 72 69 64  s ::test_overrid
4020: 65 73 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20  es] && \..      
4030: 20 20 20 20 5b 6c 6c 65 6e 67 74 68 20 24 3a 3a      [llength $::
4040: 74 65 73 74 5f 6f 76 65 72 72 69 64 65 73 5d 20  test_overrides] 
4050: 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  > 0} then {..   
4060: 20 20 20 20 20 65 76 61 6c 20 6c 61 70 70 65 6e       eval lappen
4070: 64 20 76 61 72 4e 61 6d 65 73 20 24 3a 3a 74 65  d varNames $::te
4080: 73 74 5f 6f 76 65 72 72 69 64 65 73 0d 0a 20 20  st_overrides..  
4090: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23      }....      #
40a0: 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
40b0: 49 66 20 72 65 71 75 65 73 74 65 64 20 62 79 20  If requested by 
40c0: 6f 75 72 20 63 61 6c 6c 65 72 2c 20 61 64 64 20  our caller, add 
40d0: 61 6e 79 20 61 64 64 69 74 69 6f 6e 61 6c 20 76  any additional v
40e0: 61 72 69 61 62 6c 65 0d 0a 20 20 20 20 20 20 23  ariable..      #
40f0: 20 20 20 20 20 20 20 6e 61 6d 65 73 20 74 6f 20         names to 
4100: 63 6f 70 79 20 6e 6f 77 2e 0d 0a 20 20 20 20 20  copy now...     
4110: 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 6c   #..      if {[l
4120: 6c 65 6e 67 74 68 20 24 65 78 74 72 61 56 61 72  length $extraVar
4130: 4e 61 6d 65 73 5d 20 3e 20 30 7d 20 74 68 65 6e  Names] > 0} then
4140: 20 7b 0d 0a 20 20 20 20 20 20 20 20 65 76 61 6c   {..        eval
4150: 20 6c 61 70 70 65 6e 64 20 76 61 72 4e 61 6d 65   lappend varName
4160: 73 20 24 65 78 74 72 61 56 61 72 4e 61 6d 65 73  s $extraVarNames
4170: 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
4180: 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
4190: 54 45 3a 20 42 75 69 6c 64 20 74 68 65 20 73 63  TE: Build the sc
41a0: 72 69 70 74 20 66 72 61 67 6d 65 6e 74 20 74 6f  ript fragment to
41b0: 20 62 65 20 72 65 74 75 72 6e 65 64 20 62 79 20   be returned by 
41c0: 70 72 6f 63 65 73 73 69 6e 67 20 65 61 63 68 0d  processing each.
41d0: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 76  .      #       v
41e0: 61 72 69 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64  ariable name and
41f0: 20 61 64 64 69 6e 67 20 74 68 65 20 6e 65 63 65   adding the nece
4200: 63 65 73 73 61 72 79 20 73 63 72 69 70 74 20 66  cessary script f
4210: 72 61 67 6d 65 6e 74 73 20 66 6f 72 0d 0a 20 20  ragments for..  
4220: 20 20 20 20 23 20 20 20 20 20 20 20 65 61 63 68      #       each
4230: 20 6f 6e 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a   one...      #..
4240: 20 20 20 20 20 20 73 65 74 20 72 65 73 75 6c 74        set result
4250: 20 22 22 0d 0a 0d 0a 20 20 20 20 20 20 66 6f 72   ""....      for
4260: 65 61 63 68 20 76 61 72 4e 61 6d 65 20 24 76 61  each varName $va
4270: 72 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20  rNames {..      
4280: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
4290: 4f 54 45 3a 20 42 75 69 6c 64 20 74 68 65 20 71  OTE: Build the q
42a0: 75 61 6c 69 66 69 65 64 20 67 6c 6f 62 61 6c 20  ualified global 
42b0: 76 61 72 69 61 62 6c 65 20 6e 61 6d 65 2e 0d 0a  variable name...
42c0: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
42d0: 20 20 20 73 65 74 20 66 75 6c 6c 56 61 72 4e 61     set fullVarNa
42e0: 6d 65 20 5b 61 70 70 65 6e 64 41 72 67 73 20 3a  me [appendArgs :
42f0: 3a 20 24 76 61 72 4e 61 6d 65 5d 0d 0a 0d 0a 20  : $varName].... 
4300: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
4310: 20 20 23 20 4e 4f 54 45 3a 20 44 6f 65 73 20 74    # NOTE: Does t
4320: 68 65 20 76 61 72 69 61 62 6c 65 20 65 78 69 73  he variable exis
4330: 74 20 69 6e 20 74 68 69 73 20 69 6e 74 65 72 70  t in this interp
4340: 72 65 74 65 72 20 63 6f 6e 74 65 78 74 3f 0d 0a  reter context?..
4350: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
4360: 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69     if {[info exi
4370: 73 74 73 20 24 66 75 6c 6c 56 61 72 4e 61 6d 65  sts $fullVarName
4380: 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
4390: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
43a0: 20 20 23 20 4e 4f 54 45 3a 20 41 70 70 65 6e 64    # NOTE: Append
43b0: 20 61 20 73 63 72 69 70 74 20 66 72 61 67 6d 65   a script fragme
43c0: 6e 74 20 74 6f 20 74 68 65 20 72 65 73 75 6c 74  nt to the result
43d0: 20 74 68 61 74 20 77 69 6c 6c 20 63 6f 72 72 65   that will corre
43e0: 63 74 6c 79 0d 0a 20 20 20 20 20 20 20 20 20 20  ctly..          
43f0: 23 20 20 20 20 20 20 20 63 6f 70 79 20 61 6e 79  #       copy any
4400: 20 63 6f 6e 74 61 69 6e 65 64 20 76 61 6c 75 65   contained value
4410: 20 74 6f 20 61 6e 6f 74 68 65 72 20 69 6e 74 65   to another inte
4420: 72 70 72 65 74 65 72 20 63 6f 6e 74 65 78 74 2e  rpreter context.
4430: 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20  ..          #.. 
4440: 20 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 20           append 
4450: 72 65 73 75 6c 74 20 5c 6e 20 22 73 65 74 20 22  result \n "set "
4460: 20 24 66 75 6c 6c 56 61 72 4e 61 6d 65 20 22 20   $fullVarName " 
4470: 5c 7b 22 20 5b 73 65 74 20 24 66 75 6c 6c 56 61  \{" [set $fullVa
4480: 72 4e 61 6d 65 5d 20 5c 7d 0d 0a 20 20 20 20 20  rName] \}..     
4490: 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d     }..      }...
44a0: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
44b0: 23 20 4e 4f 54 45 3a 20 49 66 20 74 68 65 20 72  # NOTE: If the r
44c0: 65 73 75 6c 74 20 63 6f 6e 74 61 69 6e 73 20 6f  esult contains o
44d0: 6e 65 20 6f 72 20 6d 6f 72 65 20 73 63 72 69 70  ne or more scrip
44e0: 74 20 66 72 61 67 6d 65 6e 74 73 2c 20 61 70 70  t fragments, app
44f0: 65 6e 64 20 61 0d 0a 20 20 20 20 20 20 23 20 20  end a..      #  
4500: 20 20 20 20 20 6e 65 77 6c 69 6e 65 2e 0d 0a 20       newline... 
4510: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66       #..      if
4520: 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68   {[string length
4530: 20 24 72 65 73 75 6c 74 5d 20 3e 20 30 7d 20 74   $result] > 0} t
4540: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 61  hen {..        a
4550: 70 70 65 6e 64 20 72 65 73 75 6c 74 20 5c 6e 0d  ppend result \n.
4560: 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
4570: 20 20 72 65 74 75 72 6e 20 24 72 65 73 75 6c 74    return $result
4580: 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
4590: 70 72 6f 63 20 67 65 74 41 70 70 44 6f 6d 61 69  proc getAppDomai
45a0: 6e 50 72 65 61 6d 62 6c 65 20 7b 20 7b 70 72 65  nPreamble { {pre
45b0: 66 69 78 20 22 22 7d 20 7b 73 75 66 66 69 78 20  fix ""} {suffix 
45c0: 22 22 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23  ""} } {..      #
45d0: 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
45e0: 54 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 72  This procedure r
45f0: 65 74 75 72 6e 73 20 61 20 74 65 73 74 20 73 65  eturns a test se
4600: 74 75 70 20 73 63 72 69 70 74 20 66 72 61 67 6d  tup script fragm
4610: 65 6e 74 20 73 75 69 74 61 62 6c 65 20 66 6f 72  ent suitable for
4620: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
4630: 65 76 61 6c 75 61 74 69 6f 6e 20 62 79 20 61 6e  evaluation by an
4640: 20 69 6e 74 65 72 70 72 65 74 65 72 20 63 72 65   interpreter cre
4650: 61 74 65 64 20 69 6e 20 61 6e 20 69 73 6f 6c 61  ated in an isola
4660: 74 65 64 20 61 70 70 6c 69 63 61 74 69 6f 6e 0d  ted application.
4670: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 64  .      #       d
4680: 6f 6d 61 69 6e 2e 20 20 54 68 65 20 73 63 72 69  omain.  The scri
4690: 70 74 20 66 72 61 67 6d 65 6e 74 20 62 65 69 6e  pt fragment bein
46a0: 67 20 72 65 74 75 72 6e 65 64 20 77 69 6c 6c 20  g returned will 
46b0: 62 65 20 73 75 72 72 6f 75 6e 64 65 64 20 62 79  be surrounded by
46c0: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
46d0: 74 68 65 20 70 72 65 66 69 78 20 61 6e 64 20 73  the prefix and s
46e0: 75 66 66 69 78 20 22 73 63 72 69 70 74 20 66 72  uffix "script fr
46f0: 61 67 6d 65 6e 74 73 22 20 73 70 65 63 69 66 69  agments" specifi
4700: 65 64 20 62 79 20 6f 75 72 20 63 61 6c 6c 65 72  ed by our caller
4710: 2c 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  ,..      #      
4720: 20 69 66 20 61 6e 79 2e 20 20 54 68 65 20 65 6e   if any.  The en
4730: 74 69 72 65 20 73 63 72 69 70 74 20 62 65 69 6e  tire script bein
4740: 67 20 72 65 74 75 72 6e 65 64 20 77 69 6c 6c 20  g returned will 
4750: 62 65 20 73 75 62 73 74 69 74 75 74 65 64 20 76  be substituted v
4760: 69 61 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  ia..      #     
4770: 20 20 5b 73 75 62 73 74 5d 2c 20 69 6e 20 74 68    [subst], in th
4780: 65 20 63 6f 6e 74 65 78 74 20 6f 66 20 6f 75 72  e context of our
4790: 20 63 61 6c 6c 65 72 2c 20 62 65 66 6f 72 65 20   caller, before 
47a0: 62 65 69 6e 67 20 72 65 74 75 72 6e 65 64 2e 0d  being returned..
47b0: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 54  .      #       T
47c0: 68 69 73 20 73 74 65 70 20 69 73 20 6e 65 63 65  his step is nece
47d0: 73 73 61 72 79 20 73 6f 20 74 68 61 74 20 73 6f  ssary so that so
47e0: 6d 65 20 6c 69 6d 69 74 65 64 20 63 6f 6e 74 65  me limited conte
47f0: 78 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2c 0d  xt information,.
4800: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 70  .      #       p
4810: 72 69 6d 61 72 69 6c 79 20 72 65 6c 61 74 65 64  rimarily related
4820: 20 74 6f 20 74 68 65 20 74 65 73 74 69 6e 67 20   to the testing 
4830: 64 69 72 65 63 74 6f 72 69 65 73 2c 20 63 61 6e  directories, can
4840: 20 62 65 20 74 72 61 6e 73 66 65 72 72 65 64 0d   be transferred.
4850: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74  .      #       t
4860: 6f 20 74 68 65 20 69 6e 74 65 72 70 72 65 74 65  o the interprete
4870: 72 20 69 6e 20 74 68 65 20 69 73 6f 6c 61 74 65  r in the isolate
4880: 64 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 64 6f  d application do
4890: 6d 61 69 6e 2c 20 6d 61 6b 69 6e 67 20 69 74 0d  main, making it.
48a0: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 61  .      #       a
48b0: 62 6c 65 20 74 6f 20 73 75 63 63 65 73 73 66 75  ble to successfu
48c0: 6c 6c 79 20 72 75 6e 20 74 65 73 74 73 20 74 68  lly run tests th
48d0: 61 74 20 72 65 71 75 69 72 65 20 6f 6e 65 20 6f  at require one o
48e0: 72 20 6d 6f 72 65 20 6f 66 20 74 68 65 0d 0a 20  r more of the.. 
48f0: 20 20 20 20 20 23 20 20 20 20 20 20 20 66 69 6c       #       fil
4900: 65 73 20 69 6e 20 6f 6e 65 20 6f 66 20 74 68 65  es in one of the
4910: 20 74 65 73 74 69 6e 67 20 64 69 72 65 63 74 6f   testing directo
4920: 72 69 65 73 2e 20 20 43 61 6c 6c 65 72 73 20 73  ries.  Callers s
4930: 68 6f 75 6c 64 20 6b 65 65 70 20 69 6e 0d 0a 20  hould keep in.. 
4940: 20 20 20 20 20 23 20 20 20 20 20 20 20 6d 69 6e       #       min
4950: 64 20 74 68 61 74 20 74 68 65 20 74 65 73 74 20  d that the test 
4960: 73 63 72 69 70 74 20 66 72 61 67 6d 65 6e 74 20  script fragment 
4970: 62 65 69 6e 67 20 72 65 74 75 72 6e 65 64 20 63  being returned c
4980: 61 6e 6e 6f 74 20 72 65 6c 79 20 6f 6e 0d 0a 20  annot rely on.. 
4990: 20 20 20 20 20 23 20 20 20 20 20 20 20 61 6e 79       #       any
49a0: 20 73 63 72 69 70 74 20 6c 69 62 72 61 72 79 20   script library 
49b0: 70 72 6f 63 65 64 75 72 65 73 20 74 68 61 74 20  procedures that 
49c0: 61 72 65 20 6e 6f 74 20 70 72 6f 76 69 64 65 64  are not provided
49d0: 20 62 79 20 74 68 65 20 45 61 67 6c 65 0d 0a 20   by the Eagle.. 
49e0: 20 20 20 20 20 23 20 20 20 20 20 20 20 6c 69 62       #       lib
49f0: 72 61 72 79 20 70 61 63 6b 61 67 65 20 28 69 2e  rary package (i.
4a00: 65 2e 20 22 69 6e 69 74 2e 65 61 67 6c 65 22 29  e. "init.eagle")
4a10: 2c 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 6f 73  , including thos
4a20: 65 20 70 72 6f 76 69 64 65 64 20 62 79 0d 0a 20  e provided by.. 
4a30: 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68 65       #       the
4a40: 20 45 61 67 6c 65 20 74 65 73 74 20 70 61 63 6b   Eagle test pack
4a50: 61 67 65 2c 20 75 6e 6c 65 73 73 20 74 68 65 20  age, unless the 
4a60: 66 69 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  file containing 
4a70: 74 68 65 6d 20 69 73 20 6c 6f 61 64 65 64 0d 0a  them is loaded..
4a80: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 6d 61        #       ma
4a90: 6e 75 61 6c 6c 79 20 76 69 61 20 73 6f 6d 65 20  nually via some 
4aa0: 6f 74 68 65 72 20 6d 65 63 68 61 6e 69 73 6d 20  other mechanism 
4ab0: 28 65 2e 67 2e 20 62 79 20 69 6e 63 6c 75 64 69  (e.g. by includi
4ac0: 6e 67 20 61 70 70 72 6f 70 72 69 61 74 65 0d 0a  ng appropriate..
4ad0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 5b 70        #       [p
4ae0: 61 63 6b 61 67 65 20 72 65 71 75 69 72 65 5d 20  ackage require] 
4af0: 6f 72 20 5b 73 6f 75 72 63 65 5d 20 63 6f 6d 6d  or [source] comm
4b00: 61 6e 64 73 20 69 6e 20 74 68 65 20 70 72 65 66  ands in the pref
4b10: 69 78 20 6f 72 20 73 75 66 66 69 78 0d 0a 20 20  ix or suffix..  
4b20: 20 20 20 20 23 20 20 20 20 20 20 20 73 63 72 69      #       scri
4b30: 70 74 20 66 72 61 67 6d 65 6e 74 73 29 2e 20 20  pt fragments).  
4b40: 41 6c 73 6f 2c 20 61 6c 6c 20 76 61 72 69 61 62  Also, all variab
4b50: 6c 65 20 72 65 66 65 72 65 6e 63 65 73 20 61 6e  le references an
4b60: 64 20 61 6c 6c 20 6e 65 73 74 65 64 0d 0a 20 20  d all nested..  
4b70: 20 20 20 20 23 20 20 20 20 20 20 20 63 6f 6d 6d      #       comm
4b80: 61 6e 64 73 20 28 69 2e 65 2e 20 74 68 6f 73 65  ands (i.e. those
4b90: 20 69 6e 20 73 71 75 61 72 65 20 62 72 61 63 6b   in square brack
4ba0: 65 74 73 29 20 63 6f 6e 74 61 69 6e 65 64 20 69  ets) contained i
4bb0: 6e 20 74 68 65 20 66 69 6e 61 6c 0d 0a 20 20 20  n the final..   
4bc0: 20 20 20 23 20 20 20 20 20 20 20 73 63 72 69 70     #       scrip
4bd0: 74 20 66 72 61 67 6d 65 6e 74 20 77 69 6c 6c 20  t fragment will 
4be0: 65 6e 64 20 75 70 20 62 65 69 6e 67 20 65 76 61  end up being eva
4bf0: 6c 75 61 74 65 64 20 69 6e 20 74 68 65 20 63 6f  luated in the co
4c00: 6e 74 65 78 74 20 6f 66 20 74 68 65 0d 0a 20 20  ntext of the..  
4c10: 20 20 20 20 23 20 20 20 20 20 20 20 63 61 6c 6c      #       call
4c20: 69 6e 67 20 69 6e 74 65 72 70 72 65 74 65 72 20  ing interpreter 
4c30: 61 6e 64 20 6e 6f 74 20 74 68 65 20 74 61 72 67  and not the targ
4c40: 65 74 20 69 6e 74 65 72 70 72 65 74 65 72 20 63  et interpreter c
4c50: 72 65 61 74 65 64 20 69 6e 20 74 68 65 0d 0a 20  reated in the.. 
4c60: 20 20 20 20 20 23 20 20 20 20 20 20 20 69 73 6f       #       iso
4c70: 6c 61 74 65 64 20 61 70 70 6c 69 63 61 74 69 6f  lated applicatio
4c80: 6e 20 64 6f 6d 61 69 6e 20 75 6e 6c 65 73 73 20  n domain unless 
4c90: 74 68 65 20 64 6f 6c 6c 61 72 20 73 69 67 6e 73  the dollar signs
4ca0: 20 61 6e 64 2f 6f 72 20 73 71 75 61 72 65 0d 0a   and/or square..
4cb0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 62 72        #       br
4cc0: 61 63 6b 65 74 73 20 61 72 65 20 73 70 65 63 69  ackets are speci
4cd0: 61 6c 6c 79 20 71 75 6f 74 65 64 20 77 69 74 68  ally quoted with
4ce0: 20 62 61 63 6b 73 6c 61 73 68 65 73 2e 0d 0a 20   backslashes... 
4cf0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 72 65       #..      re
4d00: 74 75 72 6e 20 5b 75 70 6c 65 76 65 6c 20 31 20  turn [uplevel 1 
4d10: 5b 6c 69 73 74 20 73 75 62 73 74 20 5b 61 70 70  [list subst [app
4d20: 65 6e 64 41 72 67 73 20 24 70 72 65 66 69 78 20  endArgs $prefix 
4d30: 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b  {..        if {[
4d40: 68 61 73 52 75 6e 74 69 6d 65 4f 70 74 69 6f 6e  hasRuntimeOption
4d50: 20 6e 61 74 69 76 65 5d 7d 20 74 68 65 6e 20 7b   native]} then {
4d60: 0d 0a 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65  ..          obje
4d70: 63 74 20 69 6e 76 6f 6b 65 20 49 6e 74 65 72 70  ct invoke Interp
4d80: 72 65 74 65 72 2e 47 65 74 41 63 74 69 76 65 20  reter.GetActive 
4d90: 41 64 64 52 75 6e 74 69 6d 65 4f 70 74 69 6f 6e  AddRuntimeOption
4da0: 20 6e 61 74 69 76 65 0d 0a 20 20 20 20 20 20 20   native..       
4db0: 20 7d 0d 0a 20 20 20 20 20 20 7d 20 5b 67 65 74   }..      } [get
4dc0: 54 65 73 74 4f 76 65 72 72 69 64 65 73 50 72 65  TestOverridesPre
4dd0: 61 6d 62 6c 65 20 5b 6c 69 73 74 20 70 61 74 68  amble [list path
4de0: 20 74 65 73 74 5f 63 68 61 6e 6e 65 6c 5d 5d 20   test_channel]] 
4df0: 24 73 75 66 66 69 78 5d 5d 5d 0d 0a 20 20 20 20  $suffix]]]..    
4e00: 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 74  }.....    proc t
4e10: 72 79 43 6f 70 79 42 75 69 6c 64 46 69 6c 65 20  ryCopyBuildFile 
4e20: 7b 20 66 69 6c 65 4e 61 6d 65 20 7d 20 7b 0d 0a  { fileName } {..
4e30: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
4e40: 20 4e 4f 54 45 3a 20 49 66 20 77 65 20 63 61 6e   NOTE: If we can
4e50: 6e 6f 74 20 63 6f 70 79 20 74 68 65 20 61 73 73  not copy the ass
4e60: 65 6d 62 6c 79 20 74 68 65 6e 20 69 74 20 69 73  embly then it is
4e70: 20 70 72 6f 62 61 62 6c 79 20 61 6c 72 65 61 64   probably alread
4e80: 79 20 6c 6f 61 64 65 64 2e 0d 0a 20 20 20 20 20  y loaded...     
4e90: 20 23 0d 0a 20 20 20 20 20 20 73 65 74 20 73 6f   #..      set so
4ea0: 75 72 63 65 46 69 6c 65 4e 61 6d 65 20 5b 67 65  urceFileName [ge
4eb0: 74 42 75 69 6c 64 46 69 6c 65 4e 61 6d 65 20 24  tBuildFileName $
4ec0: 66 69 6c 65 4e 61 6d 65 5d 0d 0a 0d 0a 20 20 20  fileName]....   
4ed0: 20 20 20 69 66 20 7b 21 5b 66 69 6c 65 20 65 78     if {![file ex
4ee0: 69 73 74 73 20 24 73 6f 75 72 63 65 46 69 6c 65  ists $sourceFile
4ef0: 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  Name]} then {.. 
4f00: 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
4f10: 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70  test_channel [ap
4f20: 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
4f30: 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 73 6b          "---- sk
4f40: 69 70 70 65 64 20 63 6f 70 79 69 6e 67 20 62 75  ipped copying bu
4f50: 69 6c 64 20 66 69 6c 65 20 5c 22 22 20 24 73 6f  ild file \"" $so
4f60: 75 72 63 65 46 69 6c 65 4e 61 6d 65 20 5c 0d 0a  urceFileName \..
4f70: 20 20 20 20 20 20 20 20 20 20 20 20 22 5c 22 2c              "\",
4f80: 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 65 78 69   it does not exi
4f90: 73 74 5c 6e 22 5d 0d 0a 0d 0a 20 20 20 20 20 20  st\n"]....      
4fa0: 20 20 72 65 74 75 72 6e 0d 0a 20 20 20 20 20 20    return..      
4fb0: 7d 0d 0a 0d 0a 20 20 20 20 20 20 73 65 74 20 74  }....      set t
4fc0: 61 72 67 65 74 46 69 6c 65 4e 61 6d 65 20 5b 67  argetFileName [g
4fd0: 65 74 42 69 6e 61 72 79 46 69 6c 65 4e 61 6d 65  etBinaryFileName
4fe0: 20 24 66 69 6c 65 4e 61 6d 65 5d 0d 0a 0d 0a 20   $fileName].... 
4ff0: 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20       if {[catch 
5000: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
5010: 20 66 69 6c 65 20 63 6f 70 79 20 2d 66 6f 72 63   file copy -forc
5020: 65 20 24 73 6f 75 72 63 65 46 69 6c 65 4e 61 6d  e $sourceFileNam
5030: 65 20 24 74 61 72 67 65 74 46 69 6c 65 4e 61 6d  e $targetFileNam
5040: 65 7d 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b  e}] == 0} then {
5050: 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20  ..        tputs 
5060: 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
5070: 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
5080: 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
5090: 20 63 6f 70 69 65 64 20 62 75 69 6c 64 20 66 69   copied build fi
50a0: 6c 65 20 66 72 6f 6d 20 5c 22 22 20 24 73 6f 75  le from \"" $sou
50b0: 72 63 65 46 69 6c 65 4e 61 6d 65 20 22 5c 22 20  rceFileName "\" 
50c0: 74 6f 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20  to \"" \..      
50d0: 20 20 20 20 20 20 24 74 61 72 67 65 74 46 69 6c        $targetFil
50e0: 65 4e 61 6d 65 20 5c 22 5c 6e 5d 0d 0a 20 20 20  eName \"\n]..   
50f0: 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
5100: 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
5110: 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
5120: 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
5130: 20 20 20 20 20 20 22 2d 2d 2d 2d 20 66 61 69 6c        "---- fail
5140: 65 64 20 74 6f 20 63 6f 70 79 20 62 75 69 6c 64  ed to copy build
5150: 20 66 69 6c 65 20 66 72 6f 6d 20 5c 22 22 20 24   file from \"" $
5160: 73 6f 75 72 63 65 46 69 6c 65 4e 61 6d 65 20 5c  sourceFileName \
5170: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 5c  ..            "\
5180: 22 20 74 6f 20 5c 22 22 20 24 74 61 72 67 65 74  " to \"" $target
5190: 46 69 6c 65 4e 61 6d 65 20 5c 22 5c 6e 5d 0d 0a  FileName \"\n]..
51a0: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a        }..    }..
51b0: 0c 0d 0a 20 20 20 20 70 72 6f 63 20 74 72 79 44  ...    proc tryD
51c0: 65 6c 65 74 65 42 69 6e 61 72 79 46 69 6c 65 20  eleteBinaryFile 
51d0: 7b 20 66 69 6c 65 4e 61 6d 65 20 7d 20 7b 0d 0a  { fileName } {..
51e0: 20 20 20 20 20 20 73 65 74 20 66 69 6c 65 4e 61        set fileNa
51f0: 6d 65 20 5b 67 65 74 42 69 6e 61 72 79 46 69 6c  me [getBinaryFil
5200: 65 4e 61 6d 65 20 24 66 69 6c 65 4e 61 6d 65 5d  eName $fileName]
5210: 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 21 5b  ....      if {![
5220: 66 69 6c 65 20 65 78 69 73 74 73 20 24 66 69 6c  file exists $fil
5230: 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a  eName]} then {..
5240: 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
5250: 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61  :test_channel [a
5260: 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
5270: 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 73           "---- s
5280: 6b 69 70 70 65 64 20 64 65 6c 65 74 69 6e 67 20  kipped deleting 
5290: 62 69 6e 61 72 79 20 66 69 6c 65 20 5c 22 22 20  binary file \"" 
52a0: 24 66 69 6c 65 4e 61 6d 65 20 5c 0d 0a 20 20 20  $fileName \..   
52b0: 20 20 20 20 20 20 20 20 20 22 5c 22 2c 20 69 74           "\", it
52c0: 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 5c   does not exist\
52d0: 6e 22 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 72  n"]....        r
52e0: 65 74 75 72 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a  eturn..      }..
52f0: 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74  ..      if {[cat
5300: 63 68 20 7b 66 69 6c 65 20 64 65 6c 65 74 65 20  ch {file delete 
5310: 24 66 69 6c 65 4e 61 6d 65 7d 5d 20 3d 3d 20 30  $fileName}] == 0
5320: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
5330: 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
5340: 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
5350: 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
5360: 20 20 20 22 2d 2d 2d 2d 20 64 65 6c 65 74 65 64     "---- deleted
5370: 20 62 69 6e 61 72 79 20 66 69 6c 65 20 5c 22 22   binary file \""
5380: 20 24 66 69 6c 65 4e 61 6d 65 20 5c 22 5c 6e 5d   $fileName \"\n]
5390: 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b  ..      } else {
53a0: 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20  ..        tputs 
53b0: 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
53c0: 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
53d0: 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
53e0: 20 66 61 69 6c 65 64 20 74 6f 20 64 65 6c 65 74   failed to delet
53f0: 65 20 62 69 6e 61 72 79 20 66 69 6c 65 20 5c 22  e binary file \"
5400: 22 20 24 66 69 6c 65 4e 61 6d 65 20 5c 22 5c 6e  " $fileName \"\n
5410: 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  ]..      }..    
5420: 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 74  }.....    proc t
5430: 72 79 43 6f 70 79 41 73 73 65 6d 62 6c 79 20 7b  ryCopyAssembly {
5440: 20 66 69 6c 65 4e 61 6d 65 20 7b 70 64 62 20 74   fileName {pdb t
5450: 72 75 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20  rue} } {..      
5460: 74 72 79 43 6f 70 79 42 75 69 6c 64 46 69 6c 65  tryCopyBuildFile
5470: 20 24 66 69 6c 65 4e 61 6d 65 0d 0a 0d 0a 20 20   $fileName....  
5480: 20 20 20 20 69 66 20 7b 24 70 64 62 7d 20 74 68      if {$pdb} th
5490: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 72  en {..        tr
54a0: 79 43 6f 70 79 42 75 69 6c 64 46 69 6c 65 20 5b  yCopyBuildFile [
54b0: 61 70 70 65 6e 64 41 72 67 73 20 5b 66 69 6c 65  appendArgs [file
54c0: 20 72 6f 6f 74 6e 61 6d 65 20 24 66 69 6c 65 4e   rootname $fileN
54d0: 61 6d 65 5d 20 2e 70 64 62 5d 0d 0a 20 20 20 20  ame] .pdb]..    
54e0: 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20    }..    }..... 
54f0: 20 20 20 70 72 6f 63 20 74 72 79 44 65 6c 65 74     proc tryDelet
5500: 65 41 73 73 65 6d 62 6c 79 20 7b 20 66 69 6c 65  eAssembly { file
5510: 4e 61 6d 65 20 7b 70 64 62 20 74 72 75 65 7d 20  Name {pdb true} 
5520: 7d 20 7b 0d 0a 20 20 20 20 20 20 74 72 79 44 65  } {..      tryDe
5530: 6c 65 74 65 42 69 6e 61 72 79 46 69 6c 65 20 24  leteBinaryFile $
5540: 66 69 6c 65 4e 61 6d 65 0d 0a 0d 0a 20 20 20 20  fileName....    
5550: 20 20 69 66 20 7b 24 70 64 62 7d 20 74 68 65 6e    if {$pdb} then
5560: 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 72 79 44   {..        tryD
5570: 65 6c 65 74 65 42 69 6e 61 72 79 46 69 6c 65 20  eleteBinaryFile 
5580: 5b 61 70 70 65 6e 64 41 72 67 73 20 5b 66 69 6c  [appendArgs [fil
5590: 65 20 72 6f 6f 74 6e 61 6d 65 20 24 66 69 6c 65  e rootname $file
55a0: 4e 61 6d 65 5d 20 2e 70 64 62 5d 0d 0a 20 20 20  Name] .pdb]..   
55b0: 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a     }..    }.....
55c0: 20 20 20 20 70 72 6f 63 20 74 72 79 4c 6f 61 64      proc tryLoad
55d0: 41 73 73 65 6d 62 6c 79 20 7b 20 66 69 6c 65 4e  Assembly { fileN
55e0: 61 6d 65 20 7d 20 7b 0d 0a 20 20 20 20 20 20 73  ame } {..      s
55f0: 65 74 20 66 69 6c 65 4e 61 6d 65 20 5b 67 65 74  et fileName [get
5600: 42 69 6e 61 72 79 46 69 6c 65 4e 61 6d 65 20 24  BinaryFileName $
5610: 66 69 6c 65 4e 61 6d 65 5d 0d 0a 0d 0a 20 20 20  fileName]....   
5620: 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 73     if {[catch {s
5630: 65 74 20 61 73 73 65 6d 62 6c 79 20 5c 0d 0a 20  et assembly \.. 
5640: 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 6f 62               [ob
5650: 6a 65 63 74 20 6c 6f 61 64 20 2d 6c 6f 61 64 74  ject load -loadt
5660: 79 70 65 20 46 69 6c 65 20 2d 61 6c 69 61 73 20  ype File -alias 
5670: 24 66 69 6c 65 4e 61 6d 65 5d 7d 5d 20 3d 3d 20  $fileName]}] == 
5680: 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
5690: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
56a0: 4e 4f 54 45 3a 20 4e 6f 77 2c 20 61 64 64 20 74  NOTE: Now, add t
56b0: 68 65 20 6e 65 63 65 73 73 61 72 79 20 74 65 73  he necessary tes
56c0: 74 20 63 6f 6e 73 74 72 61 69 6e 74 2e 0d 0a 20  t constraint... 
56d0: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
56e0: 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20    addConstraint 
56f0: 5b 66 69 6c 65 20 72 6f 6f 74 6e 61 6d 65 20 5b  [file rootname [
5700: 66 69 6c 65 20 74 61 69 6c 20 24 66 69 6c 65 4e  file tail $fileN
5710: 61 6d 65 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  ame]]....       
5720: 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
5730: 54 45 3a 20 47 72 61 62 20 74 68 65 20 69 6d 61  TE: Grab the ima
5740: 67 65 20 72 75 6e 74 69 6d 65 20 76 65 72 73 69  ge runtime versi
5750: 6f 6e 20 66 72 6f 6d 20 74 68 65 20 61 73 73 65  on from the asse
5760: 6d 62 6c 79 20 62 65 63 61 75 73 65 0d 0a 20 20  mbly because..  
5770: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 73 65        #       se
5780: 76 65 72 61 6c 20 74 65 73 74 73 20 72 65 6c 79  veral tests rely
5790: 20 6f 6e 20 69 74 20 68 61 76 69 6e 67 20 61 20   on it having a 
57a0: 63 65 72 74 61 69 6e 20 76 61 6c 75 65 2e 0d 0a  certain value...
57b0: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
57c0: 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74     addConstraint
57d0: 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5b 66 69   [appendArgs [fi
57e0: 6c 65 20 74 61 69 6c 20 24 66 69 6c 65 4e 61 6d  le tail $fileNam
57f0: 65 5d 20 5f 20 5c 0d 0a 20 20 20 20 20 20 20 20  e] _ \..        
5800: 20 20 20 20 5b 24 61 73 73 65 6d 62 6c 79 20 49      [$assembly I
5810: 6d 61 67 65 52 75 6e 74 69 6d 65 56 65 72 73 69  mageRuntimeVersi
5820: 6f 6e 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  on]]....        
5830: 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
5840: 45 3a 20 52 65 74 75 72 6e 20 74 68 65 20 66 75  E: Return the fu
5850: 6c 6c 20 70 61 74 68 20 6f 66 20 74 68 65 20 6c  ll path of the l
5860: 6f 61 64 65 64 20 66 69 6c 65 2e 0d 0a 20 20 20  oaded file...   
5870: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
5880: 72 65 74 75 72 6e 20 24 66 69 6c 65 4e 61 6d 65  return $fileName
5890: 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
58a0: 20 20 20 72 65 74 75 72 6e 20 22 22 0d 0a 20 20     return ""..  
58b0: 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
58c0: 20 69 73 53 51 4c 69 74 65 52 65 61 64 79 20 7b   isSQLiteReady {
58d0: 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  } {..      #..  
58e0: 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 69 73      # NOTE: This
58f0: 20 70 72 6f 63 65 64 75 72 65 20 6d 75 73 74 20   procedure must 
5900: 72 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20  return non-zero 
5910: 6f 6e 6c 79 20 69 66 20 74 68 65 20 53 51 4c 69  only if the SQLi
5920: 74 65 20 6e 61 74 69 76 65 0d 0a 20 20 20 20 20  te native..     
5930: 20 23 20 20 20 20 20 20 20 6c 69 62 72 61 72 79   #       library
5940: 20 61 6e 64 20 74 68 65 20 53 79 73 74 65 6d 2e   and the System.
5950: 44 61 74 61 2e 53 51 4c 69 74 65 20 6d 61 6e 61  Data.SQLite mana
5960: 67 65 64 20 61 73 73 65 6d 62 6c 79 20 61 72 65  ged assembly are
5970: 20 6c 6f 61 64 65 64 0d 0a 20 20 20 20 20 20 23   loaded..      #
5980: 20 20 20 20 20 20 20 61 6e 64 20 72 65 61 64 79         and ready
5990: 20 66 6f 72 20 75 73 65 20 62 79 20 74 68 65 20   for use by the 
59a0: 74 65 73 74 20 73 75 69 74 65 2e 20 20 43 75 72  test suite.  Cur
59b0: 72 65 6e 74 6c 79 2c 20 74 68 69 73 20 70 72 6f  rently, this pro
59c0: 63 65 64 75 72 65 0d 0a 20 20 20 20 20 20 23 20  cedure..      # 
59d0: 20 20 20 20 20 20 73 68 6f 75 6c 64 20 62 65 20        should be 
59e0: 63 61 6c 6c 65 64 20 6f 6e 6c 79 20 61 66 74 65  called only afte
59f0: 72 20 74 68 65 20 5b 74 72 79 4c 6f 61 64 41 73  r the [tryLoadAs
5a00: 73 65 6d 62 6c 79 5d 20 70 72 6f 63 65 64 75 72  sembly] procedur
5a10: 65 20 68 61 73 0d 0a 20 20 20 20 20 20 23 20 20  e has..      #  
5a20: 20 20 20 20 20 62 65 65 6e 20 63 61 6c 6c 65 64       been called
5a30: 20 74 6f 20 70 72 6f 62 65 20 66 6f 72 20 74 68   to probe for th
5a40: 65 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51  e System.Data.SQ
5a50: 4c 69 74 65 20 6d 61 6e 61 67 65 64 20 61 73 73  Lite managed ass
5a60: 65 6d 62 6c 79 0d 0a 20 20 20 20 20 20 23 20 20  embly..      #  
5a70: 20 20 20 20 20 61 6e 64 20 74 68 65 20 5b 63 68       and the [ch
5a80: 65 63 6b 46 6f 72 53 51 4c 69 74 65 5d 20 70 72  eckForSQLite] pr
5a90: 6f 63 65 64 75 72 65 20 68 61 73 20 62 65 65 6e  ocedure has been
5aa0: 20 63 61 6c 6c 65 64 20 74 6f 20 70 72 6f 62 65   called to probe
5ab0: 20 66 6f 72 0d 0a 20 20 20 20 20 20 23 20 20 20   for..      #   
5ac0: 20 20 20 20 74 68 65 20 53 51 4c 69 74 65 20 6e      the SQLite n
5ad0: 61 74 69 76 65 20 6c 69 62 72 61 72 79 3b 20 6f  ative library; o
5ae0: 74 68 65 72 77 69 73 65 2c 20 74 68 69 73 20 70  therwise, this p
5af0: 72 6f 63 65 64 75 72 65 20 77 69 6c 6c 20 73 69  rocedure will si
5b00: 6d 70 6c 79 0d 0a 20 20 20 20 20 20 23 20 20 20  mply..      #   
5b10: 20 20 20 20 61 6c 77 61 79 73 20 72 65 74 75 72      always retur
5b20: 6e 20 7a 65 72 6f 2e 0d 0a 20 20 20 20 20 20 23  n zero...      #
5b30: 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b  ..      return [
5b40: 65 78 70 72 20 7b 5b 68 61 76 65 43 6f 6e 73 74  expr {[haveConst
5b50: 72 61 69 6e 74 20 53 79 73 74 65 6d 2e 44 61 74  raint System.Dat
5b60: 61 2e 53 51 4c 69 74 65 5d 20 26 26 20 5c 0d 0a  a.SQLite] && \..
5b70: 20 20 20 20 20 20 20 20 20 20 5b 68 61 76 65 43            [haveC
5b80: 6f 6e 73 74 72 61 69 6e 74 20 53 51 4c 69 74 65  onstraint SQLite
5b90: 5d 7d 5d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20  ]}]..    }..... 
5ba0: 20 20 20 70 72 6f 63 20 63 68 65 63 6b 46 6f 72     proc checkFor
5bb0: 53 51 4c 69 74 65 20 7b 20 63 68 61 6e 6e 65 6c  SQLite { channel
5bc0: 20 7d 20 7b 0d 0a 20 20 20 20 20 20 74 70 75 74   } {..      tput
5bd0: 73 20 24 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d  s $channel "----
5be0: 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 63 6f   checking for co
5bf0: 72 65 20 53 51 4c 69 74 65 20 6c 69 62 72 61 72  re SQLite librar
5c00: 79 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 20 20  y... "....      
5c10: 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20  if {[catch {..  
5c20: 20 20 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65              obje
5c30: 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73  ct invoke -flags
5c40: 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 53 79 73 74   +NonPublic Syst
5c50: 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 53  em.Data.SQLite.S
5c60: 51 4c 69 74 65 33 20 5c 0d 0a 20 20 20 20 20 20  QLite3 \..      
5c70: 20 20 20 20 20 20 20 20 53 51 4c 69 74 65 56 65          SQLiteVe
5c80: 72 73 69 6f 6e 7d 20 76 65 72 73 69 6f 6e 5d 20  rsion} version] 
5c90: 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  == 0} then {..  
5ca0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
5cb0: 20 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74   # NOTE: Attempt
5cc0: 20 74 6f 20 71 75 65 72 79 20 74 68 65 20 46 6f   to query the Fo
5cd0: 73 73 69 6c 20 73 6f 75 72 63 65 20 69 64 65 6e  ssil source iden
5ce0: 74 69 66 69 65 72 20 66 6f 72 20 74 68 65 20 53  tifier for the S
5cf0: 51 4c 69 74 65 0d 0a 20 20 20 20 20 20 20 20 23  QLite..        #
5d00: 20 20 20 20 20 20 20 63 6f 72 65 20 6c 69 62 72         core libr
5d10: 61 72 79 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  ary...        #.
5d20: 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61  .        if {[ca
5d30: 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  tch {..         
5d40: 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e         object in
5d50: 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e  voke -flags +Non
5d60: 50 75 62 6c 69 63 20 53 79 73 74 65 6d 2e 44 61  Public System.Da
5d70: 74 61 2e 53 51 4c 69 74 65 2e 53 51 4c 69 74 65  ta.SQLite.SQLite
5d80: 33 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  3 \..           
5d90: 20 20 20 20 20 53 51 4c 69 74 65 53 6f 75 72 63       SQLiteSourc
5da0: 65 49 64 7d 20 73 6f 75 72 63 65 49 64 5d 7d 20  eId} sourceId]} 
5db0: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
5dc0: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23    #..          #
5dd0: 20 4e 4f 54 45 3a 20 57 65 20 66 61 69 6c 65 64   NOTE: We failed
5de0: 20 74 6f 20 71 75 65 72 79 20 74 68 65 20 46 6f   to query the Fo
5df0: 73 73 69 6c 20 73 6f 75 72 63 65 20 69 64 65 6e  ssil source iden
5e00: 74 69 66 69 65 72 2e 0d 0a 20 20 20 20 20 20 20  tifier...       
5e10: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
5e20: 73 65 74 20 73 6f 75 72 63 65 49 64 20 75 6e 6b  set sourceId unk
5e30: 6e 6f 77 6e 0d 0a 20 20 20 20 20 20 20 20 7d 0d  nown..        }.
5e40: 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
5e50: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 59 65        # NOTE: Ye
5e60: 73 2c 20 74 68 65 20 53 51 4c 69 74 65 20 63 6f  s, the SQLite co
5e70: 72 65 20 6c 69 62 72 61 72 79 20 61 70 70 65 61  re library appea
5e80: 72 73 20 74 6f 20 62 65 20 61 76 61 69 6c 61 62  rs to be availab
5e90: 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  le...        #..
5ea0: 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74          addConst
5eb0: 72 61 69 6e 74 20 53 51 4c 69 74 65 0d 0a 0d 0a  raint SQLite....
5ec0: 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
5ed0: 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
5ee0: 67 73 20 22 79 65 73 20 28 22 20 24 76 65 72 73  gs "yes (" $vers
5ef0: 69 6f 6e 20 22 20 22 20 24 73 6f 75 72 63 65 49  ion " " $sourceI
5f00: 64 20 22 29 5c 6e 22 5d 0d 0a 20 20 20 20 20 20  d ")\n"]..      
5f10: 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
5f20: 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
5f30: 20 6e 6f 5c 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a   no\n..      }..
5f40: 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
5f50: 6f 63 20 63 68 65 63 6b 46 6f 72 53 51 4c 69 74  oc checkForSQLit
5f60: 65 44 65 66 69 6e 65 43 6f 6e 73 74 61 6e 74 20  eDefineConstant 
5f70: 7b 20 63 68 61 6e 6e 65 6c 20 6e 61 6d 65 20 7d  { channel name }
5f80: 20 7b 0d 0a 20 20 20 20 20 20 74 70 75 74 73 20   {..      tputs 
5f90: 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  $channel [append
5fa0: 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
5fb0: 20 20 22 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e 67    "---- checking
5fc0: 20 66 6f 72 20 53 79 73 74 65 6d 2e 44 61 74 61   for System.Data
5fd0: 2e 53 51 4c 69 74 65 20 64 65 66 69 6e 65 20 63  .SQLite define c
5fe0: 6f 6e 73 74 61 6e 74 20 5c 22 22 20 24 6e 61 6d  onstant \"" $nam
5ff0: 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 22  e \..          "
6000: 5c 22 2e 2e 2e 20 22 5d 0d 0a 0d 0a 20 20 20 20  \"... "]....    
6010: 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a    if {[catch {..
6020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 62                ob
6030: 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61  ject invoke -fla
6040: 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 53 79  gs +NonPublic Sy
6050: 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
6060: 2e 53 51 4c 69 74 65 33 20 5c 0d 0a 20 20 20 20  .SQLite3 \..    
6070: 20 20 20 20 20 20 20 20 20 20 44 65 66 69 6e 65            Define
6080: 43 6f 6e 73 74 61 6e 74 73 7d 20 64 65 66 69 6e  Constants} defin
6090: 65 43 6f 6e 73 74 61 6e 74 73 5d 20 3d 3d 20 30  eConstants] == 0
60a0: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
60b0: 20 20 69 66 20 7b 5b 6c 73 65 61 72 63 68 20 2d    if {[lsearch -
60c0: 65 78 61 63 74 20 2d 6e 6f 63 61 73 65 20 24 64  exact -nocase $d
60d0: 65 66 69 6e 65 43 6f 6e 73 74 61 6e 74 73 20 24  efineConstants $
60e0: 6e 61 6d 65 5d 20 21 3d 20 2d 31 7d 20 74 68 65  name] != -1} the
60f0: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 23  n {..          #
6100: 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f  ..          # NO
6110: 54 45 3a 20 59 65 73 2c 20 74 68 69 73 20 64 65  TE: Yes, this de
6120: 66 69 6e 65 20 63 6f 6e 73 74 61 6e 74 20 77 61  fine constant wa
6130: 73 20 65 6e 61 62 6c 65 64 20 77 68 65 6e 20 74  s enabled when t
6140: 68 65 20 6d 61 6e 61 67 65 64 0d 0a 20 20 20 20  he managed..    
6150: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 61 73        #       as
6160: 73 65 6d 62 6c 79 20 77 61 73 20 63 6f 6d 70 69  sembly was compi
6170: 6c 65 64 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  led...          
6180: 23 0d 0a 20 20 20 20 20 20 20 20 20 20 61 64 64  #..          add
6190: 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65  Constraint [appe
61a0: 6e 64 41 72 67 73 20 64 65 66 69 6e 65 43 6f 6e  ndArgs defineCon
61b0: 73 74 61 6e 74 2e 53 79 73 74 65 6d 2e 44 61 74  stant.System.Dat
61c0: 61 2e 53 51 4c 69 74 65 2e 20 24 6e 61 6d 65 5d  a.SQLite. $name]
61d0: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70  ....          tp
61e0: 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 79 65 73  uts $channel yes
61f0: 5c 6e 0d 0a 20 20 20 20 20 20 20 20 7d 20 65 6c  \n..        } el
6200: 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  se {..          
6210: 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 6e  tputs $channel n
6220: 6f 5c 6e 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  o\n..        }..
6230: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
6240: 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
6250: 68 61 6e 6e 65 6c 20 65 72 72 6f 72 5c 6e 0d 0a  hannel error\n..
6260: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a        }..    }..
6270: 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74 44  ...    proc getD
6280: 61 74 65 54 69 6d 65 46 6f 72 6d 61 74 20 7b 7d  ateTimeFormat {}
6290: 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20   {..      #..   
62a0: 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 69 73 20     # NOTE: This 
62b0: 70 72 6f 63 65 64 75 72 65 20 73 69 6d 70 6c 79  procedure simply
62c0: 20 72 65 74 75 72 6e 73 20 74 68 65 20 22 64 65   returns the "de
62d0: 66 61 75 6c 74 22 20 44 61 74 65 54 69 6d 65 20  fault" DateTime 
62e0: 66 6f 72 6d 61 74 20 75 73 65 64 0d 0a 20 20 20  format used..   
62f0: 20 20 20 23 20 20 20 20 20 20 20 62 79 20 74 68     #       by th
6300: 65 20 74 65 73 74 20 73 75 69 74 65 2e 0d 0a 20  e test suite... 
6310: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66       #..      if
6320: 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a   {[info exists :
6330: 3a 64 61 74 65 74 69 6d 65 5f 66 6f 72 6d 61 74  :datetime_format
6340: 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20  ] && \..        
6350: 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68    [string length
6360: 20 24 3a 3a 64 61 74 65 74 69 6d 65 5f 66 6f 72   $::datetime_for
6370: 6d 61 74 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b  mat] > 0} then {
6380: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
6390: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 52 65 74       # NOTE: Ret
63a0: 75 72 6e 20 74 68 65 20 6d 61 6e 75 61 6c 6c 79  urn the manually
63b0: 20 6f 76 65 72 72 69 64 64 65 6e 20 76 61 6c 75   overridden valu
63c0: 65 20 66 6f 72 20 74 68 65 20 44 61 74 65 54 69  e for the DateTi
63d0: 6d 65 20 66 6f 72 6d 61 74 2e 0d 0a 20 20 20 20  me format...    
63e0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72      #..        r
63f0: 65 74 75 72 6e 20 24 3a 3a 64 61 74 65 74 69 6d  eturn $::datetim
6400: 65 5f 66 6f 72 6d 61 74 0d 0a 20 20 20 20 20 20  e_format..      
6410: 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
6420: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
6430: 4f 54 45 3a 20 52 65 74 75 72 6e 20 61 6e 20 49  OTE: Return an I
6440: 53 4f 38 36 30 31 20 44 61 74 65 54 69 6d 65 20  SO8601 DateTime 
6450: 66 6f 72 6d 61 74 20 63 6f 6d 70 61 74 69 62 6c  format compatibl
6460: 65 20 77 69 74 68 20 53 51 4c 69 74 65 2c 0d 0a  e with SQLite,..
6470: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
6480: 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
6490: 74 65 2c 20 61 6e 64 20 73 75 69 74 61 62 6c 65  te, and suitable
64a0: 20 66 6f 72 20 72 6f 75 6e 64 2d 74 72 69 70 70   for round-tripp
64b0: 69 6e 67 20 77 69 74 68 20 74 68 65 0d 0a 20 20  ing with the..  
64c0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 44 61        #       Da
64d0: 74 65 54 69 6d 65 20 63 6c 61 73 73 20 6f 66 20  teTime class of 
64e0: 74 68 65 20 66 72 61 6d 65 77 6f 72 6b 2e 20 20  the framework.  
64f0: 49 66 20 74 68 69 73 20 76 61 6c 75 65 20 69 73  If this value is
6500: 20 63 68 61 6e 67 65 64 2c 0d 0a 20 20 20 20 20   changed,..     
6510: 20 20 20 23 20 20 20 20 20 20 20 76 61 72 69 6f     #       vario
6520: 75 73 20 74 65 73 74 73 20 6d 61 79 20 66 61 69  us tests may fai
6530: 6c 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  l...        #.. 
6540: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 22 79         return "y
6550: 79 79 79 2d 4d 4d 2d 64 64 20 48 48 3a 6d 6d 3a  yyy-MM-dd HH:mm:
6560: 73 73 2e 46 46 46 46 46 46 46 4b 22 0d 0a 20 20  ss.FFFFFFFK"..  
6570: 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d      }..    }....
6580: 0a 20 20 20 20 70 72 6f 63 20 65 6e 75 6d 65 72  .    proc enumer
6590: 61 62 6c 65 54 6f 4c 69 73 74 20 7b 20 65 6e 75  ableToList { enu
65a0: 6d 65 72 61 62 6c 65 20 7d 20 7b 0d 0a 20 20 20  merable } {..   
65b0: 20 20 20 73 65 74 20 72 65 73 75 6c 74 20 5b 6c     set result [l
65c0: 69 73 74 5d 0d 0a 0d 0a 20 20 20 20 20 20 69 66  ist]....      if
65d0: 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68   {[string length
65e0: 20 24 65 6e 75 6d 65 72 61 62 6c 65 5d 20 3d 3d   $enumerable] ==
65f0: 20 30 20 7c 7c 20 24 65 6e 75 6d 65 72 61 62 6c   0 || $enumerabl
6600: 65 20 65 71 20 22 6e 75 6c 6c 22 7d 20 74 68 65  e eq "null"} the
6610: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 72 65 74  n {..        ret
6620: 75 72 6e 20 24 72 65 73 75 6c 74 0d 0a 20 20 20  urn $result..   
6630: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 6f 62     }....      ob
6640: 6a 65 63 74 20 66 6f 72 65 61 63 68 20 2d 61 6c  ject foreach -al
6650: 69 61 73 20 69 74 65 6d 20 24 65 6e 75 6d 65 72  ias item $enumer
6660: 61 62 6c 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  able {..        
6670: 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67  if {[string leng
6680: 74 68 20 24 69 74 65 6d 5d 20 3e 20 30 7d 20 74  th $item] > 0} t
6690: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
66a0: 20 6c 61 70 70 65 6e 64 20 72 65 73 75 6c 74 20   lappend result 
66b0: 5b 24 69 74 65 6d 20 54 6f 53 74 72 69 6e 67 5d  [$item ToString]
66c0: 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20  ..        }..   
66d0: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65     }....      re
66e0: 74 75 72 6e 20 24 72 65 73 75 6c 74 0d 0a 20 20  turn $result..  
66f0: 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
6700: 20 63 61 74 63 68 41 6e 64 52 65 74 75 72 6e 20   catchAndReturn 
6710: 7b 20 73 63 72 69 70 74 20 7b 73 74 61 63 6b 54  { script {stackT
6720: 72 61 63 65 20 66 61 6c 73 65 7d 20 7b 73 74 72  race false} {str
6730: 69 63 74 20 74 72 75 65 7d 20 7d 20 7b 0d 0a 20  ict true} } {.. 
6740: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
6750: 4e 4f 54 45 3a 20 45 76 61 6c 75 61 74 65 20 74  NOTE: Evaluate t
6760: 68 65 20 73 63 72 69 70 74 20 70 72 6f 76 69 64  he script provid
6770: 65 64 20 62 79 20 6f 75 72 20 63 61 6c 6c 65 72  ed by our caller
6780: 20 69 6e 20 74 68 65 69 72 20 63 6f 6e 74 65 78   in their contex
6790: 74 2c 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  t,..      #     
67a0: 20 20 63 61 70 74 75 72 69 6e 67 20 62 6f 74 68    capturing both
67b0: 20 74 68 65 20 72 65 73 75 6c 74 20 61 6e 64 20   the result and 
67c0: 74 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65 2e  the return code.
67d0: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
67e0: 20 73 65 74 20 63 6f 64 65 20 5b 63 61 74 63 68   set code [catch
67f0: 20 7b 75 70 6c 65 76 65 6c 20 31 20 24 73 63 72   {uplevel 1 $scr
6800: 69 70 74 7d 20 72 65 73 75 6c 74 5d 0d 0a 0d 0a  ipt} result]....
6810: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
6820: 20 4e 4f 54 45 3a 20 44 69 64 20 74 68 65 20 73   NOTE: Did the s
6830: 63 72 69 70 74 20 70 72 6f 76 69 64 65 64 20 62  cript provided b
6840: 79 20 6f 75 72 20 63 61 6c 6c 65 72 20 4e 4f 54  y our caller NOT
6850: 20 72 61 69 73 65 20 61 6e 20 65 72 72 6f 72 3f   raise an error?
6860: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
6870: 20 69 66 20 7b 24 73 74 72 69 63 74 20 26 26 20   if {$strict && 
6880: 24 63 6f 64 65 20 3d 3d 20 30 20 7c 7c 20 21 24  $code == 0 || !$
6890: 73 74 72 69 63 74 20 26 26 20 24 63 6f 64 65 20  strict && $code 
68a0: 21 3d 20 31 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  != 1} then {..  
68b0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
68c0: 20 23 20 4e 4f 54 45 3a 20 53 75 63 63 65 73 73   # NOTE: Success
68d0: 2e 20 20 52 65 74 75 72 6e 20 61 20 6c 69 73 74  .  Return a list
68e0: 20 77 69 74 68 20 74 68 65 20 72 65 74 75 72 6e   with the return
68f0: 20 63 6f 64 65 20 61 6e 64 20 74 68 65 20 72 65   code and the re
6900: 73 75 6c 74 2e 0d 0a 20 20 20 20 20 20 20 20 23  sult...        #
6910: 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ..        return
6920: 20 5b 6c 69 73 74 20 24 63 6f 64 65 20 24 72 65   [list $code $re
6930: 73 75 6c 74 5d 0d 0a 20 20 20 20 20 20 7d 20 65  sult]..      } e
6940: 6c 73 65 69 66 20 7b 24 73 74 61 63 6b 54 72 61  lseif {$stackTra
6950: 63 65 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  ce} then {..    
6960: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
6970: 20 4e 4f 54 45 3a 20 46 61 69 6c 75 72 65 2e 20   NOTE: Failure. 
6980: 20 4f 75 72 20 63 61 6c 6c 65 72 20 77 61 6e 74   Our caller want
6990: 73 20 61 20 66 75 6c 6c 20 73 74 61 63 6b 20 74  s a full stack t
69a0: 72 61 63 65 20 28 69 66 20 61 70 70 6c 69 63 61  race (if applica
69b0: 62 6c 65 29 2c 0d 0a 20 20 20 20 20 20 20 20 23  ble),..        #
69c0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 61 20         return a 
69d0: 6c 69 73 74 20 77 69 74 68 20 74 68 65 20 72 65  list with the re
69e0: 74 75 72 6e 20 63 6f 64 65 20 61 6e 64 20 74 68  turn code and th
69f0: 65 20 72 65 73 75 6c 74 20 76 65 72 62 61 74 69  e result verbati
6a00: 6d 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  m...        #.. 
6a10: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b 6c         return [l
6a20: 69 73 74 20 24 63 6f 64 65 20 24 72 65 73 75 6c  ist $code $resul
6a30: 74 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65  t]..      } else
6a40: 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20   {..        #.. 
6a50: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 46         # NOTE: F
6a60: 61 69 6c 75 72 65 2e 20 20 4f 75 72 20 63 61 6c  ailure.  Our cal
6a70: 6c 65 72 20 64 6f 65 73 20 6e 6f 74 20 77 61 6e  ler does not wan
6a80: 74 20 61 20 66 75 6c 6c 20 73 74 61 63 6b 20 74  t a full stack t
6a90: 72 61 63 65 20 28 69 66 0d 0a 20 20 20 20 20 20  race (if..      
6aa0: 20 20 23 20 20 20 20 20 20 20 61 70 70 6c 69 63    #       applic
6ab0: 61 62 6c 65 29 2c 20 72 65 74 75 72 6e 20 61 20  able), return a 
6ac0: 6c 69 73 74 20 77 69 74 68 20 74 68 65 20 72 65  list with the re
6ad0: 74 75 72 6e 20 63 6f 64 65 2c 20 74 68 65 20 65  turn code, the e
6ae0: 72 72 6f 72 0d 0a 20 20 20 20 20 20 20 20 23 20  rror..        # 
6af0: 20 20 20 20 20 20 63 6f 64 65 20 66 6f 72 20 74        code for t
6b00: 68 65 20 69 6e 74 65 72 70 72 65 74 65 72 2c 20  he interpreter, 
6b10: 61 6e 64 20 74 68 65 20 65 72 72 6f 72 20 6d 65  and the error me
6b20: 73 73 61 67 65 20 75 70 20 74 6f 20 74 68 65 0d  ssage up to the.
6b30: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
6b40: 20 70 6f 69 6e 74 20 77 68 65 72 65 20 74 68 65   point where the
6b50: 20 73 74 61 63 6b 20 74 72 61 63 65 20 73 68 6f   stack trace sho
6b60: 75 6c 64 20 73 74 61 72 74 2e 0d 0a 20 20 20 20  uld start...    
6b70: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 73      #..        s
6b80: 65 74 20 69 6e 64 65 78 20 5b 73 74 72 69 6e 67  et index [string
6b90: 20 66 69 72 73 74 20 22 20 20 20 61 74 20 22 20   first "   at " 
6ba0: 24 72 65 73 75 6c 74 5d 3b 20 23 20 48 41 43 4b  $result]; # HACK
6bb0: 3a 20 52 65 6c 69 61 62 6c 65 3f 0d 0a 0d 0a 20  : Reliable?.... 
6bc0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b 6c         return [l
6bd0: 69 73 74 20 24 63 6f 64 65 20 24 3a 3a 65 72 72  ist $code $::err
6be0: 6f 72 43 6f 64 65 20 5b 65 78 70 72 20 7b 24 69  orCode [expr {$i
6bf0: 6e 64 65 78 20 21 3d 20 2d 31 20 3f 20 5c 0d 0a  ndex != -1 ? \..
6c00: 20 20 20 20 20 20 20 20 20 20 20 20 5b 73 74 72              [str
6c10: 69 6e 67 20 74 72 69 6d 20 5b 73 74 72 69 6e 67  ing trim [string
6c20: 20 72 61 6e 67 65 20 24 72 65 73 75 6c 74 20 30   range $result 0
6c30: 20 24 69 6e 64 65 78 5d 5d 20 3a 20 24 72 65 73   $index]] : $res
6c40: 75 6c 74 7d 5d 5d 0d 0a 20 20 20 20 20 20 7d 0d  ult}]]..      }.
6c50: 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70  .    }.....    p
6c60: 72 6f 63 20 63 6f 6d 70 69 6c 65 43 53 68 61 72  roc compileCShar
6c70: 70 57 69 74 68 20 7b 0d 0a 20 20 20 20 20 20 20  pWith {..       
6c80: 20 20 20 20 20 74 65 78 74 20 6d 65 6d 6f 72 79       text memory
6c90: 20 73 79 6d 62 6f 6c 73 20 73 74 72 69 63 74 20   symbols strict 
6ca0: 72 65 73 75 6c 74 73 56 61 72 4e 61 6d 65 20 65  resultsVarName e
6cb0: 72 72 6f 72 73 56 61 72 4e 61 6d 65 20 66 69 6c  rrorsVarName fil
6cc0: 65 4e 61 6d 65 73 0d 0a 20 20 20 20 20 20 20 20  eNames..        
6cd0: 20 20 20 20 61 72 67 73 20 7d 20 7b 0d 0a 20 20      args } {..  
6ce0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
6cf0: 4f 54 45 3a 20 53 69 6e 63 65 20 77 65 20 61 72  OTE: Since we ar
6d00: 65 20 67 6f 69 6e 67 20 74 6f 20 75 73 65 20 74  e going to use t
6d10: 68 69 73 20 6d 65 74 68 6f 64 20 6e 61 6d 65 20  his method name 
6d20: 61 20 6c 6f 74 2c 20 61 73 73 69 67 6e 20 69 74  a lot, assign it
6d30: 20 74 6f 20 61 0d 0a 20 20 20 20 20 20 23 20 20   to a..      #  
6d40: 20 20 20 20 20 76 61 72 69 61 62 6c 65 20 66 69       variable fi
6d50: 72 73 74 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  rst...      #.. 
6d60: 20 20 20 20 20 73 65 74 20 61 64 64 20 52 65 66       set add Ref
6d70: 65 72 65 6e 63 65 64 41 73 73 65 6d 62 6c 69 65  erencedAssemblie
6d80: 73 2e 41 64 64 0d 0a 0d 0a 20 20 20 20 20 20 23  s.Add....      #
6d90: 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
6da0: 43 72 65 61 74 65 20 74 68 65 20 62 61 73 65 20  Create the base 
6db0: 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 76 61 6c 75  command to evalu
6dc0: 61 74 65 20 61 6e 64 20 61 64 64 20 74 68 65 20  ate and add the 
6dd0: 70 72 6f 70 65 72 74 79 20 73 65 74 74 69 6e 67  property setting
6de0: 73 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  s..      #      
6df0: 20 74 68 61 74 20 61 72 65 20 61 6c 6d 6f 73 74   that are almost
6e00: 20 61 6c 77 61 79 73 20 6e 65 65 64 65 64 20 62   always needed b
6e10: 79 20 6f 75 72 20 75 6e 69 74 20 74 65 73 74 73  y our unit tests
6e20: 20 28 69 2e 65 2e 20 74 68 65 20 53 79 73 74 65   (i.e. the Syste
6e30: 6d 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  m..      #      
6e40: 20 61 6e 64 20 53 79 73 74 65 6d 2e 44 61 74 61   and System.Data
6e50: 20 61 73 73 65 6d 62 6c 79 20 72 65 66 65 72 65   assembly refere
6e60: 6e 63 65 73 29 2e 0d 0a 20 20 20 20 20 20 23 0d  nces)...      #.
6e70: 0a 20 20 20 20 20 20 73 65 74 20 63 6f 6d 6d 61  .      set comma
6e80: 6e 64 20 5b 6c 69 73 74 20 63 6f 6d 70 69 6c 65  nd [list compile
6e90: 43 53 68 61 72 70 20 24 74 65 78 74 20 24 6d 65  CSharp $text $me
6ea0: 6d 6f 72 79 20 24 73 79 6d 62 6f 6c 73 20 24 73  mory $symbols $s
6eb0: 74 72 69 63 74 20 72 65 73 75 6c 74 73 20 5c 0d  trict results \.
6ec0: 0a 20 20 20 20 20 20 20 20 20 20 65 72 72 6f 72  .          error
6ed0: 73 20 24 61 64 64 20 53 79 73 74 65 6d 2e 64 6c  s $add System.dl
6ee0: 6c 20 24 61 64 64 20 53 79 73 74 65 6d 2e 44 61  l $add System.Da
6ef0: 74 61 2e 64 6c 6c 20 24 61 64 64 20 53 79 73 74  ta.dll $add Syst
6f00: 65 6d 2e 58 6d 6c 2e 64 6c 6c 5d 0d 0a 0d 0a 20  em.Xml.dll].... 
6f10: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
6f20: 4e 4f 54 45 3a 20 41 64 64 20 61 6c 6c 20 74 68  NOTE: Add all th
6f30: 65 20 70 72 6f 76 69 64 65 64 20 66 69 6c 65 20  e provided file 
6f40: 6e 61 6d 65 73 20 61 73 20 61 73 73 65 6d 62 6c  names as assembl
6f50: 79 20 72 65 66 65 72 65 6e 63 65 73 2e 0d 0a 20  y references... 
6f60: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 66 6f       #..      fo
6f70: 72 65 61 63 68 20 66 69 6c 65 4e 61 6d 65 20 24  reach fileName $
6f80: 66 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20  fileNames {..   
6f90: 20 20 20 20 20 6c 61 70 70 65 6e 64 20 63 6f 6d       lappend com
6fa0: 6d 61 6e 64 20 24 61 64 64 20 5b 67 65 74 42 69  mand $add [getBi
6fb0: 6e 61 72 79 46 69 6c 65 4e 61 6d 65 20 24 66 69  naryFileName $fi
6fc0: 6c 65 4e 61 6d 65 5d 0d 0a 20 20 20 20 20 20 7d  leName]..      }
6fd0: 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  ....      #..   
6fe0: 20 20 20 23 20 4e 4f 54 45 3a 20 41 64 64 20 74     # NOTE: Add t
6ff0: 68 65 20 65 78 74 72 61 20 61 72 67 75 6d 65 6e  he extra argumen
7000: 74 73 2c 20 69 66 20 61 6e 79 2c 20 74 6f 20 74  ts, if any, to t
7010: 68 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 76  he command to ev
7020: 61 6c 75 61 74 65 2e 0d 0a 20 20 20 20 20 20 23  aluate...      #
7030: 0d 0a 20 20 20 20 20 20 65 76 61 6c 20 6c 61 70  ..      eval lap
7040: 70 65 6e 64 20 63 6f 6d 6d 61 6e 64 20 24 61 72  pend command $ar
7050: 67 73 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20  gs....      #.. 
7060: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 6c 69       # NOTE: Ali
7070: 61 73 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 20  as the compiler 
7080: 6c 6f 63 61 6c 20 72 65 73 75 6c 74 73 20 61 6e  local results an
7090: 64 20 65 72 72 6f 72 73 20 76 61 72 69 61 62 6c  d errors variabl
70a0: 65 73 20 74 6f 20 74 68 65 0d 0a 20 20 20 20 20  es to the..     
70b0: 20 23 20 20 20 20 20 20 20 76 61 72 69 61 62 6c   #       variabl
70c0: 65 20 6e 61 6d 65 73 20 70 72 6f 76 69 64 65 64  e names provided
70d0: 20 62 79 20 6f 75 72 20 63 61 6c 6c 65 72 2e 0d   by our caller..
70e0: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
70f0: 75 70 76 61 72 20 31 20 24 72 65 73 75 6c 74 73  upvar 1 $results
7100: 56 61 72 4e 61 6d 65 20 72 65 73 75 6c 74 73 0d  VarName results.
7110: 0a 20 20 20 20 20 20 75 70 76 61 72 20 31 20 24  .      upvar 1 $
7120: 65 72 72 6f 72 73 56 61 72 4e 61 6d 65 20 65 72  errorsVarName er
7130: 72 6f 72 73 0d 0a 0d 0a 20 20 20 20 20 20 23 0d  rors....      #.
7140: 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 45  .      # NOTE: E
7150: 76 61 6c 75 61 74 65 20 74 68 65 20 63 6f 6e 73  valuate the cons
7160: 74 72 75 63 74 65 64 20 5b 63 6f 6d 70 69 6c 65  tructed [compile
7170: 43 53 68 61 72 70 5d 20 63 6f 6d 6d 61 6e 64 20  CSharp] command 
7180: 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65 0d 0a  and return the..
7190: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 72 65        #       re
71a0: 73 75 6c 74 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  sult...      #..
71b0: 20 20 20 20 20 20 65 76 61 6c 20 24 63 6f 6d 6d        eval $comm
71c0: 61 6e 64 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20  and..    }..... 
71d0: 20 20 20 70 72 6f 63 20 69 73 4d 65 6d 6f 72 79     proc isMemory
71e0: 44 62 20 7b 20 66 69 6c 65 4e 61 6d 65 20 7d 20  Db { fileName } 
71f0: 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  {..      #..    
7200: 20 20 23 20 4e 4f 54 45 3a 20 49 73 20 74 68 65    # NOTE: Is the
7210: 20 73 70 65 63 69 66 69 65 64 20 64 61 74 61 62   specified datab
7220: 61 73 65 20 66 69 6c 65 20 6e 61 6d 65 20 72 65  ase file name re
7230: 61 6c 6c 79 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  ally an in-memor
7240: 79 20 64 61 74 61 62 61 73 65 3f 0d 0a 20 20 20  y database?..   
7250: 20 20 20 23 0d 0a 20 20 20 20 20 20 72 65 74 75     #..      retu
7260: 72 6e 20 5b 65 78 70 72 20 7b 24 66 69 6c 65 4e  rn [expr {$fileN
7270: 61 6d 65 20 65 71 20 22 3a 6d 65 6d 6f 72 79 3a  ame eq ":memory:
7280: 22 20 7c 7c 20 5c 0d 0a 20 20 20 20 20 20 20 20  " || \..        
7290: 20 20 5b 73 74 72 69 6e 67 20 72 61 6e 67 65 20    [string range 
72a0: 24 66 69 6c 65 4e 61 6d 65 20 30 20 31 32 5d 20  $fileName 0 12] 
72b0: 65 71 20 22 66 69 6c 65 3a 3a 6d 65 6d 6f 72 79  eq "file::memory
72c0: 3a 22 7d 5d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a  :"}]..    }.....
72d0: 20 20 20 20 70 72 6f 63 20 65 78 65 63 75 74 65      proc execute
72e0: 53 71 6c 20 7b 20 73 71 6c 20 7b 65 78 65 63 75  Sql { sql {execu
72f0: 74 65 20 6e 6f 6e 65 7d 20 7b 66 69 6c 65 4e 61  te none} {fileNa
7300: 6d 65 20 22 22 7d 20 7d 20 7b 0d 0a 20 20 20 20  me ""} } {..    
7310: 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65    if {[string le
7320: 6e 67 74 68 20 24 66 69 6c 65 4e 61 6d 65 5d 20  ngth $fileName] 
7330: 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 73 65 74 20  == 0} then {set 
7340: 66 69 6c 65 4e 61 6d 65 20 3a 6d 65 6d 6f 72 79  fileName :memory
7350: 3a 7d 0d 0a 20 20 20 20 20 20 73 65 74 75 70 44  :}..      setupD
7360: 62 20 24 66 69 6c 65 4e 61 6d 65 20 22 22 20 22  b $fileName "" "
7370: 22 20 22 22 20 22 22 20 22 22 20 66 61 6c 73 65  " "" "" "" false
7380: 20 66 61 6c 73 65 20 66 61 6c 73 65 20 66 61 6c   false false fal
7390: 73 65 20 6d 65 6d 44 62 0d 0a 0d 0a 20 20 20 20  se memDb....    
73a0: 20 20 74 72 79 20 7b 0d 0a 20 20 20 20 20 20 20    try {..       
73b0: 20 72 65 74 75 72 6e 20 5b 73 71 6c 20 65 78 65   return [sql exe
73c0: 63 75 74 65 20 2d 65 78 65 63 75 74 65 20 24 65  cute -execute $e
73d0: 78 65 63 75 74 65 20 24 6d 65 6d 44 62 20 24 73  xecute $memDb $s
73e0: 71 6c 5d 0d 0a 20 20 20 20 20 20 7d 20 66 69 6e  ql]..      } fin
73f0: 61 6c 6c 79 20 7b 0d 0a 20 20 20 20 20 20 20 20  ally {..        
7400: 63 6c 65 61 6e 75 70 44 62 20 24 66 69 6c 65 4e  cleanupDb $fileN
7410: 61 6d 65 20 6d 65 6d 44 62 20 66 61 6c 73 65 20  ame memDb false 
7420: 66 61 6c 73 65 0d 0a 20 20 20 20 20 20 7d 0d 0a  false..      }..
7430: 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
7440: 6f 63 20 73 65 74 75 70 44 62 20 7b 0d 0a 20 20  oc setupDb {..  
7450: 20 20 20 20 20 20 20 20 20 20 66 69 6c 65 4e 61            fileNa
7460: 6d 65 20 7b 6d 6f 64 65 20 22 22 7d 20 7b 64 61  me {mode ""} {da
7470: 74 65 54 69 6d 65 46 6f 72 6d 61 74 20 22 22 7d  teTimeFormat ""}
7480: 20 7b 64 61 74 65 54 69 6d 65 4b 69 6e 64 20 22   {dateTimeKind "
7490: 22 7d 20 7b 66 6c 61 67 73 20 22 22 7d 0d 0a 20  "} {flags ""}.. 
74a0: 20 20 20 20 20 20 20 20 20 20 20 7b 65 78 74 72             {extr
74b0: 61 20 22 22 7d 20 7b 71 75 61 6c 69 66 79 20 74  a ""} {qualify t
74c0: 72 75 65 7d 20 7b 64 65 6c 65 74 65 20 74 72 75  rue} {delete tru
74d0: 65 7d 20 7b 75 72 69 20 66 61 6c 73 65 7d 0d 0a  e} {uri false}..
74e0: 20 20 20 20 20 20 20 20 20 20 20 20 7b 74 65 6d              {tem
74f0: 70 6f 72 61 72 79 20 74 72 75 65 7d 20 7b 76 61  porary true} {va
7500: 72 4e 61 6d 65 20 64 62 7d 20 7d 20 7b 0d 0a 20  rName db} } {.. 
7510: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
7520: 4e 4f 54 45 3a 20 46 69 72 73 74 2c 20 73 65 65  NOTE: First, see
7530: 20 69 66 20 6f 75 72 20 63 61 6c 6c 65 72 20 68   if our caller h
7540: 61 73 20 72 65 71 75 65 73 74 65 64 20 61 6e 20  as requested an 
7550: 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
7560: 73 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  se...      #..  
7570: 20 20 20 20 73 65 74 20 69 73 4d 65 6d 6f 72 79      set isMemory
7580: 20 5b 69 73 4d 65 6d 6f 72 79 44 62 20 24 66 69   [isMemoryDb $fi
7590: 6c 65 4e 61 6d 65 5d 0d 0a 0d 0a 20 20 20 20 20  leName]....     
75a0: 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
75b0: 3a 20 46 6f 72 20 6e 6f 77 2c 20 61 6c 6c 20 74  : For now, all t
75c0: 65 73 74 20 64 61 74 61 62 61 73 65 73 20 75 73  est databases us
75d0: 65 64 20 62 79 20 74 68 65 20 74 65 73 74 20 73  ed by the test s
75e0: 75 69 74 65 20 61 72 65 20 70 6c 61 63 65 64 20  uite are placed 
75f0: 69 6e 74 6f 0d 0a 20 20 20 20 20 20 23 20 20 20  into..      #   
7600: 20 20 20 20 74 68 65 20 74 65 6d 70 6f 72 61 72      the temporar
7610: 79 20 64 69 72 65 63 74 6f 72 79 2e 20 20 45 61  y directory.  Ea
7620: 63 68 20 64 61 74 61 62 61 73 65 20 75 73 65 64  ch database used
7630: 20 62 79 20 61 20 74 65 73 74 20 73 68 6f 75 6c   by a test shoul
7640: 64 20 62 65 0d 0a 20 20 20 20 20 20 23 20 20 20  d be..      #   
7650: 20 20 20 20 63 6c 65 61 6e 65 64 20 75 70 20 62      cleaned up b
7660: 79 20 74 68 61 74 20 74 65 73 74 20 75 73 69 6e  y that test usin
7670: 67 20 74 68 65 20 22 63 6c 65 61 6e 75 70 44 62  g the "cleanupDb
7680: 22 20 70 72 6f 63 65 64 75 72 65 2c 20 62 65 6c  " procedure, bel
7690: 6f 77 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  ow...      #..  
76a0: 20 20 20 20 69 66 20 7b 21 24 69 73 4d 65 6d 6f      if {!$isMemo
76b0: 72 79 20 26 26 20 24 71 75 61 6c 69 66 79 7d 20  ry && $qualify} 
76c0: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
76d0: 73 65 74 20 66 69 6c 65 4e 61 6d 65 20 5b 66 69  set fileName [fi
76e0: 6c 65 20 6a 6f 69 6e 20 5b 67 65 74 44 61 74 61  le join [getData
76f0: 62 61 73 65 44 69 72 65 63 74 6f 72 79 5d 20 5b  baseDirectory] [
7700: 66 69 6c 65 20 74 61 69 6c 20 24 66 69 6c 65 4e  file tail $fileN
7710: 61 6d 65 5d 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a  ame]]..      }..
7720: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
7730: 20 23 20 4e 4f 54 45 3a 20 42 79 20 64 65 66 61   # NOTE: By defa
7740: 75 6c 74 2c 20 64 65 6c 65 74 65 20 61 6e 79 20  ult, delete any 
7750: 70 72 65 2d 65 78 69 73 74 69 6e 67 20 64 61 74  pre-existing dat
7760: 61 62 61 73 65 20 77 69 74 68 20 74 68 65 20 73  abase with the s
7770: 61 6d 65 20 66 69 6c 65 0d 0a 20 20 20 20 20 20  ame file..      
7780: 23 20 20 20 20 20 20 20 6e 61 6d 65 20 69 66 20  #       name if 
7790: 69 74 20 63 75 72 72 65 6e 74 6c 79 20 65 78 69  it currently exi
77a0: 73 74 73 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  sts...      #.. 
77b0: 20 20 20 20 20 69 66 20 7b 21 24 69 73 4d 65 6d       if {!$isMem
77c0: 6f 72 79 20 26 26 20 24 64 65 6c 65 74 65 20 26  ory && $delete &
77d0: 26 20 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24  & [file exists $
77e0: 66 69 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20  fileName]} then 
77f0: 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
7800: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 74        # NOTE: At
7810: 74 65 6d 70 74 20 74 6f 20 64 65 6c 65 74 65 20  tempt to delete 
7820: 61 6e 79 20 70 72 65 2d 65 78 69 73 74 69 6e 67  any pre-existing
7830: 20 64 61 74 61 62 61 73 65 20 77 69 74 68 20 74   database with t
7840: 68 65 20 73 61 6d 65 20 66 69 6c 65 0d 0a 20 20  he same file..  
7850: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 6e 61        #       na
7860: 6d 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  me...        #..
7870: 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74          if {[cat
7880: 63 68 20 7b 66 69 6c 65 20 64 65 6c 65 74 65 20  ch {file delete 
7890: 24 66 69 6c 65 4e 61 6d 65 7d 20 65 72 72 6f 72  $fileName} error
78a0: 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
78b0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
78c0: 20 20 23 20 4e 4f 54 45 3a 20 57 65 20 73 6f 6d    # NOTE: We som
78d0: 65 68 6f 77 20 66 61 69 6c 65 64 20 74 6f 20 64  ehow failed to d
78e0: 65 6c 65 74 65 20 74 68 65 20 66 69 6c 65 2c 20  elete the file, 
78f0: 72 65 70 6f 72 74 20 77 68 79 2e 0d 0a 20 20 20  report why...   
7900: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
7910: 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
7920: 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e  t_channel [appen
7930: 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
7940: 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52         "==== WAR
7950: 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20 74 6f 20  NING: failed to 
7960: 64 65 6c 65 74 65 20 64 61 74 61 62 61 73 65 20  delete database 
7970: 66 69 6c 65 20 5c 22 22 20 24 66 69 6c 65 4e 61  file \"" $fileNa
7980: 6d 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  me \..          
7990: 20 20 20 20 22 5c 22 20 64 75 72 69 6e 67 20 73      "\" during s
79a0: 65 74 75 70 2c 20 65 72 72 6f 72 3a 20 22 20 5c  etup, error: " \
79b0: 6e 5c 74 20 24 65 72 72 6f 72 20 5c 6e 5d 0d 0a  n\t $error \n]..
79c0: 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
79d0: 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20   }....      #.. 
79e0: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 52 65 66       # NOTE: Ref
79f0: 65 72 20 74 6f 20 74 68 65 20 73 70 65 63 69 66  er to the specif
7a00: 69 65 64 20 76 61 72 69 61 62 6c 65 20 28 65 2e  ied variable (e.
7a10: 67 2e 20 22 64 62 22 29 20 69 6e 20 74 68 65 20  g. "db") in the 
7a20: 63 6f 6e 74 65 78 74 20 6f 66 20 6f 75 72 0d 0a  context of our..
7a30: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63 61        #       ca
7a40: 6c 6c 65 72 2e 20 20 54 68 65 20 68 61 6e 64 6c  ller.  The handl
7a50: 65 20 74 6f 20 74 68 65 20 6f 70 65 6e 65 64 20  e to the opened 
7a60: 64 61 74 61 62 61 73 65 20 77 69 6c 6c 20 62 65  database will be
7a70: 20 73 74 6f 72 65 64 20 74 68 65 72 65 2e 0d 0a   stored there...
7a80: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 75        #..      u
7a90: 70 76 61 72 20 31 20 24 76 61 72 4e 61 6d 65 20  pvar 1 $varName 
7aa0: 64 62 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20  db....      #.. 
7ab0: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 74 61       # NOTE: Sta
7ac0: 72 74 20 62 75 69 6c 64 69 6e 67 20 74 68 65 20  rt building the 
7ad0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 74 72 69 6e  connection strin
7ae0: 67 2e 20 20 54 68 65 20 6f 6e 6c 79 20 72 65 71  g.  The only req
7af0: 75 69 72 65 64 20 70 6f 72 74 69 6f 6e 0d 0a 20  uired portion.. 
7b00: 20 20 20 20 20 23 20 20 20 20 20 20 20 6f 66 20       #       of 
7b10: 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73  the connection s
7b20: 74 72 69 6e 67 20 69 73 20 74 68 65 20 64 61 74  tring is the dat
7b30: 61 20 73 6f 75 72 63 65 2c 20 77 68 69 63 68 20  a source, which 
7b40: 63 6f 6e 74 61 69 6e 73 20 74 68 65 0d 0a 20 20  contains the..  
7b50: 20 20 20 20 23 20 20 20 20 20 20 20 64 61 74 61      #       data
7b60: 62 61 73 65 20 66 69 6c 65 20 6e 61 6d 65 20 69  base file name i
7b70: 74 73 65 6c 66 2e 20 20 49 66 20 6f 75 72 20 63  tself.  If our c
7b80: 61 6c 6c 65 72 20 77 61 6e 74 73 20 74 6f 20 75  aller wants to u
7b90: 73 65 20 61 20 55 52 49 20 61 73 0d 0a 20 20 20  se a URI as..   
7ba0: 20 20 20 23 20 20 20 20 20 20 20 74 68 65 20 64     #       the d
7bb0: 61 74 61 20 73 6f 75 72 63 65 2c 20 75 73 65 20  ata source, use 
7bc0: 74 68 65 20 46 75 6c 6c 55 72 69 20 63 6f 6e 6e  the FullUri conn
7bd0: 65 63 74 69 6f 6e 20 73 74 72 69 6e 67 20 70 72  ection string pr
7be0: 6f 70 65 72 74 79 20 74 6f 0d 0a 20 20 20 20 20  operty to..     
7bf0: 20 23 20 20 20 20 20 20 20 70 72 65 76 65 6e 74   #       prevent
7c00: 20 74 68 65 20 64 61 74 61 20 73 6f 75 72 63 65   the data source
7c10: 20 73 74 72 69 6e 67 20 66 72 6f 6d 20 62 65 69   string from bei
7c20: 6e 67 20 6d 61 6e 67 6c 65 64 2e 0d 0a 20 20 20  ng mangled...   
7c30: 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
7c40: 24 75 72 69 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  $uri} then {..  
7c50: 20 20 20 20 20 20 73 65 74 20 63 6f 6e 6e 65 63        set connec
7c60: 74 69 6f 6e 20 7b 46 75 6c 6c 55 72 69 3d 24 7b  tion {FullUri=${
7c70: 66 69 6c 65 4e 61 6d 65 7d 7d 0d 0a 20 20 20 20  fileName}}..    
7c80: 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
7c90: 20 20 20 20 73 65 74 20 63 6f 6e 6e 65 63 74 69      set connecti
7ca0: 6f 6e 20 7b 44 61 74 61 20 53 6f 75 72 63 65 3d  on {Data Source=
7cb0: 24 7b 66 69 6c 65 4e 61 6d 65 7d 7d 0d 0a 20 20  ${fileName}}..  
7cc0: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23      }....      #
7cd0: 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
7ce0: 53 69 6e 63 65 20 74 68 69 73 20 70 72 6f 63 65  Since this proce
7cf0: 64 75 72 65 20 68 61 73 20 6e 6f 20 73 70 65 63  dure has no spec
7d00: 69 61 6c 20 6b 6e 6f 77 6c 65 64 67 65 20 6f 66  ial knowledge of
7d10: 20 77 68 61 74 20 74 68 65 20 64 65 66 61 75 6c   what the defaul
7d20: 74 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  t..      #      
7d30: 20 73 65 74 74 69 6e 67 20 69 73 20 66 6f 72 20   setting is for 
7d40: 74 68 65 20 54 6f 46 75 6c 6c 50 61 74 68 20 63  the ToFullPath c
7d50: 6f 6e 6e 65 63 74 69 6f 6e 20 73 74 72 69 6e 67  onnection string
7d60: 20 70 72 6f 70 65 72 79 2c 20 61 6c 77 61 79 73   propery, always
7d70: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
7d80: 61 64 64 20 74 68 65 20 76 61 6c 75 65 20 77 65  add the value we
7d90: 20 6b 6e 6f 77 20 61 62 6f 75 74 20 74 6f 20 74   know about to t
7da0: 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 74  he connection st
7db0: 72 69 6e 67 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  ring...      #..
7dc0: 20 20 20 20 20 20 61 70 70 65 6e 64 20 63 6f 6e        append con
7dd0: 6e 65 63 74 69 6f 6e 20 7b 3b 54 6f 46 75 6c 6c  nection {;ToFull
7de0: 50 61 74 68 3d 24 7b 71 75 61 6c 69 66 79 7d 7d  Path=${qualify}}
7df0: 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  ....      #..   
7e00: 20 20 20 23 20 4e 4f 54 45 3a 20 49 66 20 6f 75     # NOTE: If ou
7e10: 72 20 63 61 6c 6c 65 72 20 73 70 65 63 69 66 69  r caller specifi
7e20: 65 64 20 61 20 6a 6f 75 72 6e 61 6c 20 6d 6f 64  ed a journal mod
7e30: 65 2c 20 61 64 64 20 74 68 65 20 6e 65 63 65 73  e, add the neces
7e40: 73 61 72 79 20 70 6f 72 74 69 6f 6e 0d 0a 20 20  sary portion..  
7e50: 20 20 20 20 23 20 20 20 20 20 20 20 6f 66 20 74      #       of t
7e60: 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 74  he connection st
7e70: 72 69 6e 67 20 6e 6f 77 2e 0d 0a 20 20 20 20 20  ring now...     
7e80: 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 73   #..      if {[s
7e90: 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 6d 6f  tring length $mo
7ea0: 64 65 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d  de] > 0} then {.
7eb0: 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 20  .        append 
7ec0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 7b 3b 4a 6f 75  connection {;Jou
7ed0: 72 6e 61 6c 20 4d 6f 64 65 3d 24 7b 6d 6f 64 65  rnal Mode=${mode
7ee0: 7d 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  }}..      }.... 
7ef0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
7f00: 4e 4f 54 45 3a 20 49 66 20 6f 75 72 20 63 61 6c  NOTE: If our cal
7f10: 6c 65 72 20 73 70 65 63 69 66 69 65 64 20 61 20  ler specified a 
7f20: 44 61 74 65 54 69 6d 65 20 66 6f 72 6d 61 74 2c  DateTime format,
7f30: 20 61 64 64 20 74 68 65 20 6e 65 63 65 73 73 61   add the necessa
7f40: 72 79 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  ry..      #     
7f50: 20 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65    portion of the
7f60: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 74 72 69   connection stri
7f70: 6e 67 20 6e 6f 77 2e 0d 0a 20 20 20 20 20 20 23  ng now...      #
7f80: 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72  ..      if {[str
7f90: 69 6e 67 20 6c 65 6e 67 74 68 20 24 64 61 74 65  ing length $date
7fa0: 54 69 6d 65 46 6f 72 6d 61 74 5d 20 3e 20 30 7d  TimeFormat] > 0}
7fb0: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
7fc0: 20 61 70 70 65 6e 64 20 63 6f 6e 6e 65 63 74 69   append connecti
7fd0: 6f 6e 20 7b 3b 44 61 74 65 54 69 6d 65 46 6f 72  on {;DateTimeFor
7fe0: 6d 61 74 3d 24 7b 64 61 74 65 54 69 6d 65 46 6f  mat=${dateTimeFo
7ff0: 72 6d 61 74 7d 7d 0d 0a 20 20 20 20 20 20 7d 0d  rmat}}..      }.
8000: 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
8010: 20 20 23 20 4e 4f 54 45 3a 20 49 66 20 6f 75 72    # NOTE: If our
8020: 20 63 61 6c 6c 65 72 20 73 70 65 63 69 66 69 65   caller specifie
8030: 64 20 61 20 44 61 74 65 54 69 6d 65 4b 69 6e 64  d a DateTimeKind
8040: 2c 20 61 64 64 20 74 68 65 20 6e 65 63 65 73 73  , add the necess
8050: 61 72 79 20 70 6f 72 74 69 6f 6e 0d 0a 20 20 20  ary portion..   
8060: 20 20 20 23 20 20 20 20 20 20 20 6f 66 20 74 68     #       of th
8070: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 74 72  e connection str
8080: 69 6e 67 20 6e 6f 77 2e 0d 0a 20 20 20 20 20 20  ing now...      
8090: 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 73 74  #..      if {[st
80a0: 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 64 61 74  ring length $dat
80b0: 65 54 69 6d 65 4b 69 6e 64 5d 20 3e 20 30 7d 20  eTimeKind] > 0} 
80c0: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
80d0: 61 70 70 65 6e 64 20 63 6f 6e 6e 65 63 74 69 6f  append connectio
80e0: 6e 20 7b 3b 44 61 74 65 54 69 6d 65 4b 69 6e 64  n {;DateTimeKind
80f0: 3d 24 7b 64 61 74 65 54 69 6d 65 4b 69 6e 64 7d  =${dateTimeKind}
8100: 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  }..      }....  
8110: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
8120: 4f 54 45 3a 20 49 66 20 74 68 65 72 65 20 61 72  OTE: If there ar
8130: 65 20 61 6e 79 20 67 6c 6f 62 61 6c 20 28 70 65  e any global (pe
8140: 72 20 74 65 73 74 20 72 75 6e 29 20 63 6f 6e 6e  r test run) conn
8150: 65 63 74 69 6f 6e 20 66 6c 61 67 73 20 63 75 72  ection flags cur
8160: 72 65 6e 74 6c 79 0d 0a 20 20 20 20 20 20 23 20  rently..      # 
8170: 20 20 20 20 20 20 73 65 74 2c 20 75 73 65 20 74        set, use t
8180: 68 65 6d 20 6e 6f 77 20 28 69 2e 65 2e 20 62 79  hem now (i.e. by
8190: 20 63 6f 6d 62 69 6e 69 6e 67 20 74 68 65 6d 20   combining them 
81a0: 77 69 74 68 20 74 68 65 20 6f 6e 65 73 20 66 6f  with the ones fo
81b0: 72 20 74 68 69 73 0d 0a 20 20 20 20 20 20 23 20  r this..      # 
81c0: 20 20 20 20 20 20 63 6f 6e 6e 65 63 74 69 6f 6e        connection
81d0: 29 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  )...      #..   
81e0: 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69     if {[info exi
81f0: 73 74 73 20 3a 3a 63 6f 6e 6e 65 63 74 69 6f 6e  sts ::connection
8200: 5f 66 6c 61 67 73 5d 20 26 26 20 5c 0d 0a 20 20  _flags] && \..  
8210: 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20          [string 
8220: 6c 65 6e 67 74 68 20 24 3a 3a 63 6f 6e 6e 65 63  length $::connec
8230: 74 69 6f 6e 5f 66 6c 61 67 73 5d 20 3e 20 30 7d  tion_flags] > 0}
8240: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
8250: 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
8260: 54 45 3a 20 53 68 6f 77 20 28 61 6e 64 20 6c 6f  TE: Show (and lo
8270: 67 29 20 74 68 61 74 20 77 65 20 64 65 74 65 63  g) that we detec
8280: 74 65 64 20 73 6f 6d 65 20 67 6c 6f 62 61 6c 20  ted some global 
8290: 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 6c 61 67 73  connection flags
82a0: 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
82b0: 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
82c0: 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70  est_channel [app
82d0: 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
82e0: 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 67 6c 6f         "---- glo
82f0: 62 61 6c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66  bal connection f
8300: 6c 61 67 73 20 64 65 74 65 63 74 65 64 3a 20 22  lags detected: "
8310: 20 24 3a 3a 63 6f 6e 6e 65 63 74 69 6f 6e 5f 66   $::connection_f
8320: 6c 61 67 73 20 5c 6e 5d 0d 0a 0d 0a 20 20 20 20  lags \n]....    
8330: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
8340: 20 4e 4f 54 45 3a 20 43 6f 6d 62 69 6e 65 20 61   NOTE: Combine a
8350: 6e 64 2f 6f 72 20 72 65 70 6c 61 63 65 20 74 68  nd/or replace th
8360: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 6c 61  e connection fla
8370: 67 73 20 61 6e 64 20 74 68 65 6e 20 73 68 6f 77  gs and then show
8380: 20 74 68 65 0d 0a 20 20 20 20 20 20 20 20 23 20   the..        # 
8390: 20 20 20 20 20 20 6e 65 77 20 76 61 6c 75 65 2e        new value.
83a0: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
83b0: 20 20 20 20 20 73 65 74 20 66 6c 61 67 73 20 5b       set flags [
83c0: 63 6f 6d 62 69 6e 65 46 6c 61 67 73 20 24 66 6c  combineFlags $fl
83d0: 61 67 73 20 24 3a 3a 63 6f 6e 6e 65 63 74 69 6f  ags $::connectio
83e0: 6e 5f 66 6c 61 67 73 5d 0d 0a 0d 0a 20 20 20 20  n_flags]....    
83f0: 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
8400: 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e  t_channel [appen
8410: 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
8420: 20 20 20 20 20 22 2d 2d 2d 2d 20 63 6f 6d 62 69       "---- combi
8430: 6e 65 64 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66  ned connection f
8440: 6c 61 67 73 20 61 72 65 3a 20 22 20 24 66 6c 61  lags are: " $fla
8450: 67 73 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d 0d  gs \n]..      }.
8460: 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
8470: 20 20 23 20 4e 4f 54 45 3a 20 49 66 20 6f 75 72    # NOTE: If our
8480: 20 63 61 6c 6c 65 72 20 73 70 65 63 69 66 69 65   caller specifie
8490: 64 20 61 20 53 51 4c 69 74 65 43 6f 6e 6e 65 63  d a SQLiteConnec
84a0: 74 69 6f 6e 46 6c 61 67 73 2c 20 61 64 64 20 74  tionFlags, add t
84b0: 68 65 20 6e 65 63 65 73 73 61 72 79 0d 0a 20 20  he necessary..  
84c0: 20 20 20 20 23 20 20 20 20 20 20 20 70 6f 72 74      #       port
84d0: 69 6f 6e 20 6f 66 20 74 68 65 20 63 6f 6e 6e 65  ion of the conne
84e0: 63 74 69 6f 6e 20 73 74 72 69 6e 67 20 6e 6f 77  ction string now
84f0: 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
8500: 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65    if {[string le
8510: 6e 67 74 68 20 24 66 6c 61 67 73 5d 20 3e 20 30  ngth $flags] > 0
8520: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
8530: 20 20 61 70 70 65 6e 64 20 63 6f 6e 6e 65 63 74    append connect
8540: 69 6f 6e 20 7b 3b 46 6c 61 67 73 3d 24 7b 66 6c  ion {;Flags=${fl
8550: 61 67 73 7d 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a  ags}}..      }..
8560: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
8570: 20 23 20 4e 4f 54 45 3a 20 49 66 20 6f 75 72 20   # NOTE: If our 
8580: 63 61 6c 6c 65 72 20 73 70 65 63 69 66 69 65 64  caller specified
8590: 20 61 6e 20 65 78 74 72 61 20 70 61 79 6c 6f 61   an extra payloa
85a0: 64 20 74 6f 20 74 68 65 20 63 6f 6e 6e 65 63 74  d to the connect
85b0: 69 6f 6e 20 73 74 72 69 6e 67 2c 0d 0a 20 20 20  ion string,..   
85c0: 20 20 20 23 20 20 20 20 20 20 20 61 70 70 65 6e     #       appen
85d0: 64 20 69 74 20 6e 6f 77 2e 0d 0a 20 20 20 20 20  d it now...     
85e0: 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 73   #..      if {[s
85f0: 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 65 78  tring length $ex
8600: 74 72 61 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b  tra] > 0} then {
8610: 0d 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e 64  ..        append
8620: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 5c 3b 20 24   connection \; $
8630: 65 78 74 72 61 0d 0a 20 20 20 20 20 20 7d 0d 0a  extra..      }..
8640: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
8650: 20 23 20 4e 4f 54 45 3a 20 4f 70 65 6e 20 74 68   # NOTE: Open th
8660: 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
8670: 63 74 69 6f 6e 20 6e 6f 77 2c 20 70 6c 61 63 69  ction now, placi
8680: 6e 67 20 74 68 65 20 6f 70 61 71 75 65 20 68 61  ng the opaque ha
8690: 6e 64 6c 65 20 76 61 6c 75 65 0d 0a 20 20 20 20  ndle value..    
86a0: 20 20 23 20 20 20 20 20 20 20 69 6e 74 6f 20 74    #       into t
86b0: 68 65 20 76 61 72 69 61 62 6c 65 20 73 70 65 63  he variable spec
86c0: 69 66 69 65 64 20 62 79 20 6f 75 72 20 63 61 6c  ified by our cal
86d0: 6c 65 72 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ler...      #.. 
86e0: 20 20 20 20 20 73 65 74 20 64 62 20 5b 73 71 6c       set db [sql
86f0: 20 6f 70 65 6e 20 2d 74 79 70 65 20 53 51 4c 69   open -type SQLi
8700: 74 65 20 5b 73 75 62 73 74 20 24 63 6f 6e 6e 65  te [subst $conne
8710: 63 74 69 6f 6e 5d 5d 0d 0a 0d 0a 20 20 20 20 20  ction]]....     
8720: 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
8730: 3a 20 43 6f 6e 66 69 67 75 72 65 20 74 68 65 20  : Configure the 
8740: 74 65 6d 70 6f 72 61 72 79 20 64 69 72 65 63 74  temporary direct
8750: 6f 72 79 20 66 6f 72 20 74 68 65 20 6e 65 77 6c  ory for the newl
8760: 79 20 6f 70 65 6e 65 64 20 64 61 74 61 62 61 73  y opened databas
8770: 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  e..      #      
8780: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6e 6f 77 20   connection now 
8790: 75 6e 6c 65 73 73 20 6f 75 72 20 63 61 6c 6c 65  unless our calle
87a0: 72 20 66 6f 72 62 69 64 73 20 69 74 2e 0d 0a 20  r forbids it... 
87b0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66       #..      if
87c0: 20 7b 24 74 65 6d 70 6f 72 61 72 79 20 26 26 20   {$temporary && 
87d0: 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  ![info exists ::
87e0: 6e 6f 28 73 65 74 54 65 6d 70 6f 72 61 72 79 44  no(setTemporaryD
87f0: 69 72 65 63 74 6f 72 79 29 5d 7d 20 74 68 65 6e  irectory)]} then
8800: 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 71 6c 20   {..        sql 
8810: 65 78 65 63 75 74 65 20 24 64 62 20 5b 61 70 70  execute $db [app
8820: 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
8830: 20 20 20 20 20 20 20 22 50 52 41 47 4d 41 20 74         "PRAGMA t
8840: 65 6d 70 5f 73 74 6f 72 65 5f 64 69 72 65 63 74  emp_store_direct
8850: 6f 72 79 20 3d 20 5c 22 22 20 5b 67 65 74 54 65  ory = \"" [getTe
8860: 6d 70 6f 72 61 72 79 44 69 72 65 63 74 6f 72 79  mporaryDirectory
8870: 5d 20 5c 22 5c 3b 5d 0d 0a 20 20 20 20 20 20 7d  ] \"\;]..      }
8880: 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  ....      #..   
8890: 20 20 20 23 20 4e 4f 54 45 3a 20 41 6c 77 61 79     # NOTE: Alway
88a0: 73 20 72 65 74 75 72 6e 20 74 68 65 20 63 6f 6e  s return the con
88b0: 6e 65 63 74 69 6f 6e 20 68 61 6e 64 6c 65 20 75  nection handle u
88c0: 70 6f 6e 20 73 75 63 63 65 73 73 2e 0d 0a 20 20  pon success...  
88d0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 72 65 74      #..      ret
88e0: 75 72 6e 20 24 64 62 0d 0a 20 20 20 20 7d 0d 0a  urn $db..    }..
88f0: 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74 44  ...    proc getD
8900: 62 43 6f 6e 6e 65 63 74 69 6f 6e 20 7b 20 7b 76  bConnection { {v
8910: 61 72 4e 61 6d 65 20 64 62 7d 20 7d 20 7b 0d 0a  arName db} } {..
8920: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
8930: 20 4e 4f 54 45 3a 20 52 65 66 65 72 20 74 6f 20   NOTE: Refer to 
8940: 74 68 65 20 73 70 65 63 69 66 69 65 64 20 76 61  the specified va
8950: 72 69 61 62 6c 65 20 28 65 2e 67 2e 20 22 64 62  riable (e.g. "db
8960: 22 29 20 69 6e 20 74 68 65 20 63 6f 6e 74 65 78  ") in the contex
8970: 74 20 6f 66 20 6f 75 72 0d 0a 20 20 20 20 20 20  t of our..      
8980: 23 20 20 20 20 20 20 20 63 61 6c 6c 65 72 2e 20  #       caller. 
8990: 20 54 68 65 20 68 61 6e 64 6c 65 20 74 6f 20 74   The handle to t
89a0: 68 65 20 64 61 74 61 62 61 73 65 20 70 72 65 76  he database prev
89b0: 69 6f 75 73 6c 79 20 6f 70 65 6e 65 64 20 62 79  iously opened by
89c0: 20 5b 73 65 74 75 70 44 62 5d 0d 0a 20 20 20 20   [setupDb]..    
89d0: 20 20 23 20 20 20 20 20 20 20 73 68 6f 75 6c 64    #       should
89e0: 20 62 65 20 73 74 6f 72 65 64 20 74 68 65 72 65   be stored there
89f0: 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
8a00: 20 20 75 70 76 61 72 20 31 20 24 76 61 72 4e 61    upvar 1 $varNa
8a10: 6d 65 20 64 62 0d 0a 0d 0a 20 20 20 20 20 20 23  me db....      #
8a20: 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
8a30: 54 68 69 73 20 72 65 74 75 72 6e 73 20 74 68 65  This returns the
8a40: 20 41 44 4f 2e 4e 45 54 20 49 44 62 43 6f 6e 6e   ADO.NET IDbConn
8a50: 65 63 74 69 6f 6e 20 6f 62 6a 65 63 74 20 69 6e  ection object in
8a60: 73 74 61 6e 63 65 20 66 6f 72 20 74 68 65 0d 0a  stance for the..
8a70: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 73 70        #       sp
8a80: 65 63 69 66 69 65 64 20 64 61 74 61 62 73 65 20  ecified databse 
8a90: 68 61 6e 64 6c 65 2e 20 20 53 69 6e 63 65 20 67  handle.  Since g
8aa0: 65 74 74 69 6e 67 20 74 68 69 73 20 6f 62 6a 65  etting this obje
8ab0: 63 74 20 72 65 6c 69 65 73 20 75 70 6f 6e 0d 0a  ct relies upon..
8ac0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 45 61        #       Ea
8ad0: 67 6c 65 20 69 6e 74 65 72 6e 61 6c 73 2c 20 67  gle internals, g
8ae0: 72 65 61 74 20 63 61 72 65 20 73 68 6f 75 6c 64  reat care should
8af0: 20 62 65 20 74 61 6b 65 6e 20 74 6f 20 61 76 6f   be taken to avo
8b00: 69 64 20 64 69 73 70 6f 73 69 6e 67 20 6f 66 0d  id disposing of.
8b10: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74  .      #       t
8b20: 68 69 73 20 6f 62 6a 65 63 74 20 6f 72 20 6f 74  his object or ot
8b30: 68 65 72 77 69 73 65 20 70 75 74 74 69 6e 67 20  herwise putting 
8b40: 69 74 20 69 6e 74 6f 20 61 6e 20 69 6e 76 61 6c  it into an inval
8b50: 69 64 20 73 74 61 74 65 2e 0d 0a 20 20 20 20 20  id state...     
8b60: 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69   #..      if {[i
8b70: 6e 66 6f 20 65 78 69 73 74 73 20 64 62 5d 7d 20  nfo exists db]} 
8b80: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
8b90: 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20  if {[catch {..  
8ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 62                ob
8bb0: 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61  ject invoke -fla
8bc0: 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 2d 6f  gs +NonPublic -o
8bd0: 62 6a 65 63 74 66 6c 61 67 73 20 2b 4e 6f 44 69  bjectflags +NoDi
8be0: 73 70 6f 73 65 20 5c 0d 0a 20 20 20 20 20 20 20  spose \..       
8bf0: 20 20 20 20 20 20 20 20 20 2d 61 6c 69 61 73 20           -alias 
8c00: 49 6e 74 65 72 70 72 65 74 65 72 2e 47 65 74 41  Interpreter.GetA
8c10: 63 74 69 76 65 2e 63 6f 6e 6e 65 63 74 69 6f 6e  ctive.connection
8c20: 73 20 49 74 65 6d 20 24 64 62 7d 20 5c 0d 0a 20  s Item $db} \.. 
8c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
8c40: 65 73 75 6c 74 5d 20 3d 3d 20 30 7d 20 74 68 65  esult] == 0} the
8c50: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 23  n {..          #
8c60: 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f  ..          # NO
8c70: 54 45 3a 20 53 75 63 63 65 73 73 2c 20 72 65 74  TE: Success, ret
8c80: 75 72 6e 20 74 68 65 20 6f 70 61 71 75 65 20 6f  urn the opaque o
8c90: 62 6a 65 63 74 20 68 61 6e 64 6c 65 2e 0d 0a 20  bject handle... 
8ca0: 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
8cb0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 72 65        return $re
8cc0: 73 75 6c 74 0d 0a 20 20 20 20 20 20 20 20 7d 20  sult..        } 
8cd0: 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
8ce0: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23    #..          #
8cf0: 20 4e 4f 54 45 3a 20 46 61 69 6c 75 72 65 2c 20   NOTE: Failure, 
8d00: 72 65 70 6f 72 74 20 77 68 79 2e 0d 0a 20 20 20  report why...   
8d10: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
8d20: 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
8d30: 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e  t_channel [appen
8d40: 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
8d50: 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52         "==== WAR
8d60: 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20 74 6f 20  NING: failed to 
8d70: 67 65 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68  get connection h
8d80: 61 6e 64 6c 65 20 66 6f 72 20 64 61 74 61 62 61  andle for databa
8d90: 73 65 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20  se \"" \..      
8da0: 20 20 20 20 20 20 20 20 24 64 62 20 22 5c 22 2c          $db "\",
8db0: 20 65 72 72 6f 72 3a 20 22 20 5c 6e 5c 74 20 24   error: " \n\t $
8dc0: 72 65 73 75 6c 74 20 5c 6e 5d 0d 0a 20 20 20 20  result \n]..    
8dd0: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a      }..      }..
8de0: 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
8df0: 6f 63 20 66 72 65 65 44 62 43 6f 6e 6e 65 63 74  oc freeDbConnect
8e00: 69 6f 6e 20 7b 20 7b 76 61 72 4e 61 6d 65 20 63  ion { {varName c
8e10: 6f 6e 6e 65 63 74 69 6f 6e 7d 20 7d 20 7b 0d 0a  onnection} } {..
8e20: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
8e30: 20 4e 4f 54 45 3a 20 52 65 66 65 72 20 74 6f 20   NOTE: Refer to 
8e40: 74 68 65 20 73 70 65 63 69 66 69 65 64 20 76 61  the specified va
8e50: 72 69 61 62 6c 65 20 28 65 2e 67 2e 20 22 63 6f  riable (e.g. "co
8e60: 6e 6e 65 63 74 69 6f 6e 22 29 20 69 6e 20 74 68  nnection") in th
8e70: 65 20 63 6f 6e 74 65 78 74 0d 0a 20 20 20 20 20  e context..     
8e80: 20 23 20 20 20 20 20 20 20 6f 66 20 6f 75 72 20   #       of our 
8e90: 63 61 6c 6c 65 72 2e 20 20 54 68 65 20 6f 70 61  caller.  The opa
8ea0: 71 75 65 20 6f 62 6a 65 63 74 20 68 61 6e 64 6c  que object handl
8eb0: 65 20 66 6f 72 20 61 6e 20 41 44 4f 2e 4e 45 54  e for an ADO.NET
8ec0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 0d 0a 20 20 20   connection..   
8ed0: 20 20 20 23 20 20 20 20 20 20 20 70 72 65 76 69     #       previ
8ee0: 6f 75 73 6c 79 20 72 65 74 75 72 6e 65 64 20 62  ously returned b
8ef0: 79 20 5b 67 65 74 44 62 43 6f 6e 6e 65 63 74 69  y [getDbConnecti
8f00: 6f 6e 5d 20 73 68 6f 75 6c 64 20 62 65 20 73 74  on] should be st
8f10: 6f 72 65 64 20 74 68 65 72 65 2e 0d 0a 20 20 20  ored there...   
8f20: 20 20 20 23 0d 0a 20 20 20 20 20 20 75 70 76 61     #..      upva
8f30: 72 20 31 20 24 76 61 72 4e 61 6d 65 20 63 6f 6e  r 1 $varName con
8f40: 6e 65 63 74 69 6f 6e 0d 0a 0d 0a 20 20 20 20 20  nection....     
8f50: 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
8f60: 3a 20 41 74 74 65 6d 70 74 20 74 6f 20 72 65 6d  : Attempt to rem
8f70: 6f 76 65 20 74 68 65 20 6f 70 61 71 75 65 20 6f  ove the opaque o
8f80: 62 6a 65 63 74 20 68 61 6e 64 6c 65 20 66 72 6f  bject handle fro
8f90: 6d 20 74 68 65 20 69 6e 74 65 72 70 72 65 74 65  m the interprete
8fa0: 72 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  r..      #      
8fb0: 20 6e 6f 77 2e 20 20 54 68 69 73 20 5b 6f 62 6a   now.  This [obj
8fc0: 65 63 74 20 64 69 73 70 6f 73 65 5d 20 63 61 6c  ect dispose] cal
8fd0: 6c 20 77 69 6c 6c 20 6e 6f 74 20 61 63 74 75 61  l will not actua
8fe0: 6c 6c 79 20 64 69 73 70 6f 73 65 20 6f 66 20 74  lly dispose of t
8ff0: 68 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  he..      #     
9000: 20 20 75 6e 64 65 72 6c 79 69 6e 67 20 6f 62 6a    underlying obj
9010: 65 63 74 20 62 65 63 61 75 73 65 20 74 68 65 20  ect because the 
9020: 2b 4e 6f 44 69 73 70 6f 73 65 20 66 6c 61 67 20  +NoDispose flag 
9030: 77 61 73 20 73 65 74 20 6f 6e 20 69 74 20 64 75  was set on it du
9040: 72 69 6e 67 0d 0a 20 20 20 20 20 20 23 20 20 20  ring..      #   
9050: 20 20 20 20 63 72 65 61 74 69 6f 6e 20 6f 66 20      creation of 
9060: 74 68 65 20 6f 70 61 71 75 65 20 6f 62 6a 65 63  the opaque objec
9070: 74 20 68 61 6e 64 6c 65 2e 0d 0a 20 20 20 20 20  t handle...     
9080: 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69   #..      if {[i
9090: 6e 66 6f 20 65 78 69 73 74 73 20 63 6f 6e 6e 65  nfo exists conne
90a0: 63 74 69 6f 6e 5d 20 26 26 20 5c 0d 0a 20 20 20  ction] && \..   
90b0: 20 20 20 20 20 20 20 5b 63 61 74 63 68 20 7b 6f         [catch {o
90c0: 62 6a 65 63 74 20 64 69 73 70 6f 73 65 20 24 63  bject dispose $c
90d0: 6f 6e 6e 65 63 74 69 6f 6e 7d 20 65 72 72 6f 72  onnection} error
90e0: 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
90f0: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
9100: 4e 4f 54 45 3a 20 57 65 20 73 6f 6d 65 68 6f 77  NOTE: We somehow
9110: 20 66 61 69 6c 65 64 20 74 6f 20 72 65 6d 6f 76   failed to remov
9120: 65 20 74 68 65 20 68 61 6e 64 6c 65 2c 20 72 65  e the handle, re
9130: 70 6f 72 74 20 77 68 79 2e 0d 0a 20 20 20 20 20  port why...     
9140: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 74 70     #..        tp
9150: 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  uts $::test_chan
9160: 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
9170: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22  \..            "
9180: 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61  ==== WARNING: fa
9190: 69 6c 65 64 20 74 6f 20 72 65 6d 6f 76 65 20 63  iled to remove c
91a0: 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 6e 64 6c 65  onnection handle
91b0: 20 5c 22 22 20 24 63 6f 6e 6e 65 63 74 69 6f 6e   \"" $connection
91c0: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
91d0: 22 5c 22 2c 20 65 72 72 6f 72 3a 20 22 20 5c 6e  "\", error: " \n
91e0: 5c 74 20 24 65 72 72 6f 72 20 5c 6e 5d 0d 0a 20  \t $error \n].. 
91f0: 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c       }..    }...
9200: 0d 0a 20 20 20 20 70 72 6f 63 20 61 64 64 44 62  ..    proc addDb
9210: 43 6f 6e 6e 65 63 74 69 6f 6e 20 7b 20 63 6f 6e  Connection { con
9220: 6e 65 63 74 69 6f 6e 20 7b 76 61 72 4e 61 6d 65  nection {varName
9230: 20 64 62 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20   db} } {..      
9240: 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
9250: 20 52 65 66 65 72 20 74 6f 20 74 68 65 20 73 70   Refer to the sp
9260: 65 63 69 66 69 65 64 20 76 61 72 69 61 62 6c 65  ecified variable
9270: 20 28 65 2e 67 2e 20 22 64 62 22 29 20 69 6e 20   (e.g. "db") in 
9280: 74 68 65 20 63 6f 6e 74 65 78 74 20 6f 66 20 6f  the context of o
9290: 75 72 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  ur..      #     
92a0: 20 20 63 61 6c 6c 65 72 2e 0d 0a 20 20 20 20 20    caller...     
92b0: 20 23 0d 0a 20 20 20 20 20 20 75 70 76 61 72 20   #..      upvar 
92c0: 31 20 24 76 61 72 4e 61 6d 65 20 64 62 0d 0a 0d  1 $varName db...
92d0: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
92e0: 23 20 4e 4f 54 45 3a 20 43 72 65 61 74 65 20 61  # NOTE: Create a
92f0: 20 63 6f 72 72 65 63 74 6c 79 20 66 6f 72 6d 61   correctly forma
9300: 74 74 65 64 20 6e 61 6d 65 20 66 6f 72 20 74 68  tted name for th
9310: 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
9320: 63 74 69 6f 6e 20 74 6f 0d 0a 20 20 20 20 20 20  ction to..      
9330: 23 20 20 20 20 20 20 20 62 65 20 61 64 64 65 64  #       be added
9340: 20 74 6f 20 74 68 65 20 6c 69 73 74 20 6d 61 6e   to the list man
9350: 61 67 65 64 20 62 79 20 74 68 65 20 45 61 67 6c  aged by the Eagl
9360: 65 20 69 6e 74 65 72 70 72 65 74 65 72 2e 0d 0a  e interpreter...
9370: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 73        #..      s
9380: 65 74 20 64 62 20 5b 6f 62 6a 65 63 74 20 69 6e  et db [object in
9390: 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e  voke -flags +Non
93a0: 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20  Public \..      
93b0: 20 20 20 20 45 61 67 6c 65 2e 5f 43 6f 6d 70 6f      Eagle._Compo
93c0: 6e 65 6e 74 73 2e 50 72 69 76 61 74 65 2e 46 6f  nents.Private.Fo
93d0: 72 6d 61 74 4f 70 73 20 44 61 74 61 62 61 73 65  rmatOps Database
93e0: 4f 62 6a 65 63 74 4e 61 6d 65 20 24 63 6f 6e 6e  ObjectName $conn
93f0: 65 63 74 69 6f 6e 20 5c 0d 0a 20 20 20 20 20 20  ection \..      
9400: 20 20 20 20 53 51 4c 69 74 65 43 6f 6e 6e 65 63      SQLiteConnec
9410: 74 69 6f 6e 20 5b 6f 62 6a 65 63 74 20 69 6e 76  tion [object inv
9420: 6f 6b 65 20 49 6e 74 65 72 70 72 65 74 65 72 2e  oke Interpreter.
9430: 47 65 74 41 63 74 69 76 65 20 4e 65 78 74 49 64  GetActive NextId
9440: 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ]]....      #.. 
9450: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 64 64       # NOTE: Add
9460: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   the database co
9470: 6e 6e 65 63 74 69 6f 6e 20 70 72 6f 76 69 64 65  nnection provide
9480: 64 20 62 79 20 6f 75 72 20 63 61 6c 6c 65 72 20  d by our caller 
9490: 74 6f 20 74 68 65 20 6c 69 73 74 0d 0a 20 20 20  to the list..   
94a0: 20 20 20 23 20 20 20 20 20 20 20 6f 66 20 74 68     #       of th
94b0: 6f 73 65 20 6b 6e 6f 77 6e 20 74 6f 20 74 68 65  ose known to the
94c0: 20 45 61 67 6c 65 20 69 6e 74 65 72 70 72 65 74   Eagle interpret
94d0: 65 72 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  er...      #..  
94e0: 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b      object invok
94f0: 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62  e -flags +NonPub
9500: 6c 69 63 20 49 6e 74 65 72 70 72 65 74 65 72 2e  lic Interpreter.
9510: 47 65 74 41 63 74 69 76 65 2e 63 6f 6e 6e 65 63  GetActive.connec
9520: 74 69 6f 6e 73 20 41 64 64 20 5c 0d 0a 20 20 20  tions Add \..   
9530: 20 20 20 20 20 20 20 24 64 62 20 24 63 6f 6e 6e         $db $conn
9540: 65 63 74 69 6f 6e 0d 0a 20 20 20 20 7d 0d 0a 0c  ection..    }...
9550: 0d 0a 20 20 20 20 70 72 6f 63 20 63 6c 65 61 6e  ..    proc clean
9560: 75 70 44 62 20 7b 20 66 69 6c 65 4e 61 6d 65 20  upDb { fileName 
9570: 7b 76 61 72 4e 61 6d 65 20 64 62 7d 20 7b 63 6f  {varName db} {co
9580: 6c 6c 65 63 74 20 74 72 75 65 7d 20 7b 71 75 61  llect true} {qua
9590: 6c 69 66 79 20 74 72 75 65 7d 0d 0a 20 20 20 20  lify true}..    
95a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
95b0: 20 7b 64 65 6c 65 74 65 20 74 72 75 65 7d 20 7d   {delete true} }
95c0: 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20   {..      #..   
95d0: 20 20 20 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d     # NOTE: Attem
95e0: 70 74 20 74 6f 20 66 6f 72 63 65 20 61 6c 6c 20  pt to force all 
95f0: 70 65 6e 64 69 6e 67 20 22 67 61 72 62 61 67 65  pending "garbage
9600: 22 20 6f 62 6a 65 63 74 73 20 74 6f 20 62 65 20  " objects to be 
9610: 63 6f 6c 6c 65 63 74 65 64 2c 0d 0a 20 20 20 20  collected,..    
9620: 20 20 23 20 20 20 20 20 20 20 69 6e 63 6c 75 64    #       includ
9630: 69 6e 67 20 53 51 4c 69 74 65 20 73 74 61 74 65  ing SQLite state
9640: 6d 65 6e 74 73 20 61 6e 64 20 62 61 63 6b 75 70  ments and backup
9650: 20 6f 62 6a 65 63 74 73 3b 20 74 68 69 73 20 73   objects; this s
9660: 68 6f 75 6c 64 20 61 6c 6c 6f 77 0d 0a 20 20 20  hould allow..   
9670: 20 20 20 23 20 20 20 20 20 20 20 74 68 65 20 75     #       the u
9680: 6e 64 65 72 6c 79 69 6e 67 20 64 61 74 61 62 61  nderlying databa
9690: 73 65 20 66 69 6c 65 20 74 6f 20 62 65 20 64 65  se file to be de
96a0: 6c 65 74 65 64 2e 0d 0a 20 20 20 20 20 20 23 0d  leted...      #.
96b0: 0a 20 20 20 20 20 20 69 66 20 7b 24 63 6f 6c 6c  .      if {$coll
96c0: 65 63 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  ect} then {..   
96d0: 20 20 20 20 20 63 6f 6c 6c 65 63 74 47 61 72 62       collectGarb
96e0: 61 67 65 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  age $::test_chan
96f0: 6e 65 6c 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a  nel..      }....
9700: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
9710: 20 4e 4f 54 45 3a 20 52 65 66 65 72 20 74 6f 20   NOTE: Refer to 
9720: 74 68 65 20 73 70 65 63 69 66 69 65 64 20 76 61  the specified va
9730: 72 69 61 62 6c 65 20 28 65 2e 67 2e 20 22 64 62  riable (e.g. "db
9740: 22 29 20 69 6e 20 74 68 65 20 63 6f 6e 74 65 78  ") in the contex
9750: 74 20 6f 66 20 6f 75 72 0d 0a 20 20 20 20 20 20  t of our..      
9760: 23 20 20 20 20 20 20 20 63 61 6c 6c 65 72 2e 20  #       caller. 
9770: 20 54 68 65 20 68 61 6e 64 6c 65 20 74 6f 20 74   The handle to t
9780: 68 65 20 64 61 74 61 62 61 73 65 20 70 72 65 76  he database prev
9790: 69 6f 75 73 6c 79 20 6f 70 65 6e 65 64 20 62 79  iously opened by
97a0: 20 5b 73 65 74 75 70 44 62 5d 0d 0a 20 20 20 20   [setupDb]..    
97b0: 20 20 23 20 20 20 20 20 20 20 73 68 6f 75 6c 64    #       should
97c0: 20 62 65 20 73 74 6f 72 65 64 20 74 68 65 72 65   be stored there
97d0: 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
97e0: 20 20 75 70 76 61 72 20 31 20 24 76 61 72 4e 61    upvar 1 $varNa
97f0: 6d 65 20 64 62 0d 0a 0d 0a 20 20 20 20 20 20 23  me db....      #
9800: 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
9810: 43 6c 6f 73 65 20 74 68 65 20 63 6f 6e 6e 65 63  Close the connec
9820: 74 69 6f 6e 20 74 6f 20 74 68 65 20 64 61 74 61  tion to the data
9830: 62 61 73 65 20 6e 6f 77 2e 20 20 54 68 69 73 20  base now.  This 
9840: 73 68 6f 75 6c 64 20 61 6c 6c 6f 77 20 75 73 20  should allow us 
9850: 74 6f 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  to..      #     
9860: 20 20 64 65 6c 65 74 65 20 74 68 65 20 75 6e 64    delete the und
9870: 65 72 6c 79 69 6e 67 20 64 61 74 61 62 61 73 65  erlying database
9880: 20 66 69 6c 65 2e 0d 0a 20 20 20 20 20 20 23 0d   file...      #.
9890: 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f  .      if {[info
98a0: 20 65 78 69 73 74 73 20 64 62 5d 20 26 26 20 5b   exists db] && [
98b0: 63 61 74 63 68 20 7b 73 71 6c 20 63 6c 6f 73 65  catch {sql close
98c0: 20 24 64 62 7d 20 65 72 72 6f 72 5d 7d 20 74 68   $db} error]} th
98d0: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d  en {..        #.
98e0: 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
98f0: 20 57 65 20 73 6f 6d 65 68 6f 77 20 66 61 69 6c   We somehow fail
9900: 65 64 20 74 6f 20 63 6c 6f 73 65 20 74 68 65 20  ed to close the 
9910: 64 61 74 61 62 61 73 65 2c 20 72 65 70 6f 72 74  database, report
9920: 20 77 68 79 2e 0d 0a 20 20 20 20 20 20 20 20 23   why...        #
9930: 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20  ..        tputs 
9940: 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
9950: 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
9960: 20 20 20 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d             "====
9970: 20 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64   WARNING: failed
9980: 20 74 6f 20 63 6c 6f 73 65 20 64 61 74 61 62 61   to close databa
9990: 73 65 20 5c 22 22 20 24 64 62 20 22 5c 22 2c 20  se \"" $db "\", 
99a0: 65 72 72 6f 72 3a 20 22 20 5c 0d 0a 20 20 20 20  error: " \..    
99b0: 20 20 20 20 20 20 20 20 5c 6e 5c 74 20 24 65 72          \n\t $er
99c0: 72 6f 72 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d  ror \n]..      }
99d0: 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  ....      #..   
99e0: 20 20 20 23 20 4e 4f 54 45 3a 20 46 69 72 73 74     # NOTE: First
99f0: 2c 20 73 65 65 20 69 66 20 6f 75 72 20 63 61 6c  , see if our cal
9a00: 6c 65 72 20 68 61 73 20 72 65 71 75 65 73 74 65  ler has requeste
9a10: 64 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64  d an in-memory d
9a20: 61 74 61 62 61 73 65 2e 0d 0a 20 20 20 20 20 20  atabase...      
9a30: 23 0d 0a 20 20 20 20 20 20 73 65 74 20 69 73 4d  #..      set isM
9a40: 65 6d 6f 72 79 20 5b 69 73 4d 65 6d 6f 72 79 44  emory [isMemoryD
9a50: 62 20 24 66 69 6c 65 4e 61 6d 65 5d 0d 0a 0d 0a  b $fileName]....
9a60: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
9a70: 20 4e 4f 54 45 3a 20 42 75 69 6c 64 20 74 68 65   NOTE: Build the
9a80: 20 66 75 6c 6c 20 70 61 74 68 20 74 6f 20 74 68   full path to th
9a90: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
9aa0: 6e 61 6d 65 2e 20 20 46 6f 72 20 6e 6f 77 2c 20  name.  For now, 
9ab0: 61 6c 6c 20 74 65 73 74 0d 0a 20 20 20 20 20 20  all test..      
9ac0: 23 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65  #       database
9ad0: 20 66 69 6c 65 73 20 61 72 65 20 73 74 6f 72 65   files are store
9ae0: 64 20 69 6e 20 74 68 65 20 74 65 6d 70 6f 72 61  d in the tempora
9af0: 72 79 20 64 69 72 65 63 74 6f 72 79 2e 0d 0a 20  ry directory... 
9b00: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66       #..      if
9b10: 20 7b 21 24 69 73 4d 65 6d 6f 72 79 20 26 26 20   {!$isMemory && 
9b20: 24 71 75 61 6c 69 66 79 7d 20 74 68 65 6e 20 7b  $qualify} then {
9b30: 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 66 69  ..        set fi
9b40: 6c 65 4e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69  leName [file joi
9b50: 6e 20 5b 67 65 74 44 61 74 61 62 61 73 65 44 69  n [getDatabaseDi
9b60: 72 65 63 74 6f 72 79 5d 20 5b 66 69 6c 65 20 74  rectory] [file t
9b70: 61 69 6c 20 24 66 69 6c 65 4e 61 6d 65 5d 5d 0d  ail $fileName]].
9b80: 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
9b90: 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
9ba0: 45 3a 20 43 68 65 63 6b 20 69 66 20 74 68 65 20  E: Check if the 
9bb0: 66 69 6c 65 20 73 74 69 6c 6c 20 65 78 69 73 74  file still exist
9bc0: 73 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  s...      #..   
9bd0: 20 20 20 69 66 20 7b 21 24 69 73 4d 65 6d 6f 72     if {!$isMemor
9be0: 79 20 26 26 20 24 64 65 6c 65 74 65 20 26 26 20  y && $delete && 
9bf0: 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24 66 69  [file exists $fi
9c00: 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d  leName]} then {.
9c10: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
9c20: 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 6b 69 70      # NOTE: Skip
9c30: 20 64 65 6c 65 74 69 6e 67 20 64 61 74 61 62 61   deleting databa
9c40: 73 65 20 66 69 6c 65 73 20 69 66 20 73 6f 6d 65  se files if some
9c50: 62 6f 64 79 20 73 65 74 73 20 74 68 65 20 67 6c  body sets the gl
9c60: 6f 62 61 6c 0d 0a 20 20 20 20 20 20 20 20 23 20  obal..        # 
9c70: 20 20 20 20 20 20 76 61 72 69 61 62 6c 65 20 74        variable t
9c80: 6f 20 70 72 65 76 65 6e 74 20 69 74 2e 0d 0a 20  o prevent it... 
9c90: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
9ca0: 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69    if {![info exi
9cb0: 73 74 73 20 3a 3a 6e 6f 28 63 6c 65 61 6e 75 70  sts ::no(cleanup
9cc0: 44 62 46 69 6c 65 29 5d 7d 20 74 68 65 6e 20 7b  DbFile)]} then {
9cd0: 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20  ..          #.. 
9ce0: 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a           # NOTE:
9cf0: 20 41 74 74 65 6d 70 74 20 74 6f 20 64 65 6c 65   Attempt to dele
9d00: 74 65 20 74 68 65 20 74 65 73 74 20 64 61 74 61  te the test data
9d10: 62 61 73 65 20 66 69 6c 65 20 6e 6f 77 2e 0d 0a  base file now...
9d20: 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
9d30: 20 20 20 20 20 20 20 69 66 20 7b 5b 73 65 74 20         if {[set 
9d40: 63 6f 64 65 20 5b 63 61 74 63 68 20 7b 66 69 6c  code [catch {fil
9d50: 65 20 64 65 6c 65 74 65 20 24 66 69 6c 65 4e 61  e delete $fileNa
9d60: 6d 65 7d 20 65 72 72 6f 72 5d 5d 7d 20 74 68 65  me} error]]} the
9d70: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
9d80: 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   #..            
9d90: 23 20 4e 4f 54 45 3a 20 57 65 20 73 6f 6d 65 68  # NOTE: We someh
9da0: 6f 77 20 66 61 69 6c 65 64 20 74 6f 20 64 65 6c  ow failed to del
9db0: 65 74 65 20 74 68 65 20 66 69 6c 65 2c 20 72 65  ete the file, re
9dc0: 70 6f 72 74 20 77 68 79 2e 0d 0a 20 20 20 20 20  port why...     
9dd0: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
9de0: 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
9df0: 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70  est_channel [app
9e00: 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
9e10: 20 20 20 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d             "====
9e20: 20 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64   WARNING: failed
9e30: 20 74 6f 20 64 65 6c 65 74 65 20 64 61 74 61 62   to delete datab
9e40: 61 73 65 20 66 69 6c 65 20 5c 22 22 20 24 66 69  ase file \"" $fi
9e50: 6c 65 4e 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20  leName \..      
9e60: 20 20 20 20 20 20 20 20 20 20 22 5c 22 20 64 75            "\" du
9e70: 72 69 6e 67 20 63 6c 65 61 6e 75 70 2c 20 65 72  ring cleanup, er
9e80: 72 6f 72 3a 20 22 20 5c 6e 5c 74 20 24 65 72 72  ror: " \n\t $err
9e90: 6f 72 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20  or \n]..        
9ea0: 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 20 65    }..        } e
9eb0: 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  lse {..         
9ec0: 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20   #..          # 
9ed0: 4e 4f 54 45 3a 20 53 68 6f 77 20 74 68 61 74 20  NOTE: Show that 
9ee0: 77 65 20 73 6b 69 70 70 65 64 20 64 65 6c 65 74  we skipped delet
9ef0: 69 6e 67 20 74 68 65 20 66 69 6c 65 2e 0d 0a 20  ing the file... 
9f00: 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
9f10: 20 20 20 20 20 20 73 65 74 20 63 6f 64 65 20 30        set code 0
9f20: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70  ....          tp
9f30: 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  uts $::test_chan
9f40: 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
9f50: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
9f60: 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20   "==== WARNING: 
9f70: 73 6b 69 70 70 65 64 20 64 65 6c 65 74 69 6e 67  skipped deleting
9f80: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 5c   database file \
9f90: 22 22 20 24 66 69 6c 65 4e 61 6d 65 20 5c 0d 0a  "" $fileName \..
9fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 5c                "\
9fb0: 22 20 64 75 72 69 6e 67 20 63 6c 65 61 6e 75 70  " during cleanup
9fc0: 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d  \n"]..        }.
9fd0: 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d  .      } else {.
9fe0: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
9ff0: 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 65 20      # NOTE: The 
a000: 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 65 78  file does not ex
a010: 69 73 74 2c 20 73 75 63 63 65 73 73 21 0d 0a 20  ist, success!.. 
a020: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
a030: 20 20 73 65 74 20 63 6f 64 65 20 30 0d 0a 20 20    set code 0..  
a040: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 72      }....      r
a050: 65 74 75 72 6e 20 24 63 6f 64 65 0d 0a 20 20 20  eturn $code..   
a060: 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
a070: 73 65 74 75 70 44 62 49 6e 74 65 72 72 75 70 74  setupDbInterrupt
a080: 43 61 6c 6c 62 61 63 6b 20 7b 20 63 68 61 6e 6e  Callback { chann
a090: 65 6c 20 6c 6f 67 20 7d 20 7b 0d 0a 20 20 20 20  el log } {..    
a0a0: 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
a0b0: 20 22 2d 2d 2d 2d 20 73 65 74 74 69 6e 67 20 75   "---- setting u
a0c0: 70 20 64 65 62 75 67 67 65 72 20 69 6e 74 65 72  p debugger inter
a0d0: 72 75 70 74 20 63 61 6c 6c 62 61 63 6b 2e 2e 2e  rupt callback...
a0e0: 20 22 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b   "....      if {
a0f0: 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20  [catch {..      
a100: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
a110: 4f 54 45 3a 20 4d 61 6b 65 20 73 75 72 65 20 74  OTE: Make sure t
a120: 68 65 20 73 63 72 69 70 74 20 64 65 62 75 67 67  he script debugg
a130: 65 72 20 61 6e 64 20 74 68 65 20 69 73 6f 6c 61  er and the isola
a140: 74 65 64 20 69 6e 74 65 72 70 72 65 74 65 72 20  ted interpreter 
a150: 61 72 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20  are..        #  
a160: 20 20 20 20 20 73 65 74 75 70 20 61 6e 64 20 72       setup and r
a170: 65 61 64 79 20 66 6f 72 20 75 73 65 2e 0d 0a 20  eady for use... 
a180: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
a190: 20 20 64 65 62 75 67 20 73 65 74 75 70 20 74 72    debug setup tr
a1a0: 75 65 20 74 72 75 65 0d 0a 0d 0a 20 20 20 20 20  ue true....     
a1b0: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
a1c0: 4e 4f 54 45 3a 20 4c 6f 61 64 20 74 68 65 20 6e  NOTE: Load the n
a1d0: 65 63 65 73 73 61 72 79 20 70 61 63 6b 61 67 65  ecessary package
a1e0: 73 20 69 6e 74 6f 20 74 68 65 20 69 73 6f 6c 61  s into the isola
a1f0: 74 65 64 20 69 6e 74 65 72 70 72 65 74 65 72 2e  ted interpreter.
a200: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
a210: 20 20 20 20 20 64 65 62 75 67 20 65 76 61 6c 20       debug eval 
a220: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 70 61 63  {..          pac
a230: 6b 61 67 65 20 72 65 71 75 69 72 65 20 45 61 67  kage require Eag
a240: 6c 65 0d 0a 20 20 20 20 20 20 20 20 20 20 70 61  le..          pa
a250: 63 6b 61 67 65 20 72 65 71 75 69 72 65 20 45 61  ckage require Ea
a260: 67 6c 65 2e 4c 69 62 72 61 72 79 0d 0a 20 20 20  gle.Library..   
a270: 20 20 20 20 20 20 20 70 61 63 6b 61 67 65 20 72         package r
a280: 65 71 75 69 72 65 20 45 61 67 6c 65 2e 54 65 73  equire Eagle.Tes
a290: 74 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  t..        }....
a2a0: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
a2b0: 20 20 20 23 20 4e 4f 54 45 3a 20 43 6f 70 79 20     # NOTE: Copy 
a2c0: 74 68 65 20 6e 65 63 65 73 73 61 72 79 20 76 61  the necessary va
a2d0: 72 69 61 62 6c 65 73 20 69 6e 74 6f 20 74 68 65  riables into the
a2e0: 20 69 73 6f 6c 61 74 65 64 20 69 6e 74 65 72 70   isolated interp
a2f0: 72 65 74 65 72 2e 0d 0a 20 20 20 20 20 20 20 20  reter...        
a300: 23 0d 0a 20 20 20 20 20 20 20 20 64 65 62 75 67  #..        debug
a310: 20 69 6e 76 6f 6b 65 20 30 20 73 65 74 20 3a 3a   invoke 0 set ::
a320: 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 24 63 68  test_channel $ch
a330: 61 6e 6e 65 6c 3b 20 23 20 4e 4f 54 45 3a 20 46  annel; # NOTE: F
a340: 6f 72 20 5b 74 70 75 74 73 5d 2e 0d 0a 20 20 20  or [tputs]...   
a350: 20 20 20 20 20 64 65 62 75 67 20 69 6e 76 6f 6b       debug invok
a360: 65 20 30 20 73 65 74 20 3a 3a 74 65 73 74 5f 6c  e 0 set ::test_l
a370: 6f 67 20 24 6c 6f 67 3b 20 23 20 4e 4f 54 45 3a  og $log; # NOTE:
a380: 20 46 6f 72 20 5b 74 6c 6f 67 5d 2e 0d 0a 0d 0a   For [tlog].....
a390: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
a3a0: 20 20 20 23 20 4e 4f 54 45 3a 20 49 6e 73 74 61     # NOTE: Insta
a3b0: 6c 6c 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20  ll the callback 
a3c0: 73 63 72 69 70 74 20 74 6f 20 62 65 20 65 76 61  script to be eva
a3d0: 6c 75 61 74 65 64 20 69 6e 20 74 68 65 20 69 73  luated in the is
a3e0: 6f 6c 61 74 65 64 0d 0a 20 20 20 20 20 20 20 20  olated..        
a3f0: 23 20 20 20 20 20 20 20 69 6e 74 65 72 70 72 65  #       interpre
a400: 74 65 72 20 77 68 65 6e 20 74 68 69 73 20 69 6e  ter when this in
a410: 74 65 72 70 72 65 74 65 72 20 69 73 20 69 6e 74  terpreter is int
a420: 65 72 72 75 70 74 65 64 20 62 79 20 73 63 72 69  errupted by scri
a430: 70 74 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  pt..        #   
a440: 20 20 20 20 63 61 6e 63 65 6c 6c 61 74 69 6f 6e      cancellation
a450: 2c 20 65 74 63 2e 0d 0a 20 20 20 20 20 20 20 20  , etc...        
a460: 23 0d 0a 20 20 20 20 20 20 20 20 64 65 62 75 67  #..        debug
a470: 20 63 61 6c 6c 62 61 63 6b 20 61 70 70 6c 79 20   callback apply 
a480: 7b 7b 73 65 6e 64 65 72 20 65 7d 20 7b 0d 0a 20  {{sender e} {.. 
a490: 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
a4a0: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68        # NOTE: Ch
a4b0: 65 63 6b 20 69 66 20 74 68 69 73 20 63 61 6c 6c  eck if this call
a4c0: 62 61 63 6b 20 69 73 20 6f 6e 65 20 74 68 61 74  back is one that
a4d0: 20 77 65 20 63 61 72 65 20 61 62 6f 75 74 2e 0d   we care about..
a4e0: 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
a4f0: 20 20 20 20 20 20 20 20 69 66 20 7b 22 43 61 6e          if {"Can
a500: 63 65 6c 65 64 22 20 69 6e 20 5b 73 70 6c 69 74  celed" in [split
a510: 20 5b 24 65 20 49 6e 74 65 72 72 75 70 74 54 79   [$e InterruptTy
a520: 70 65 5d 20 22 2c 20 22 5d 7d 20 74 68 65 6e 20  pe] ", "]} then 
a530: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23  {..            #
a540: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 20  ..            # 
a550: 4e 4f 54 45 3a 20 49 74 65 72 61 74 65 20 74 68  NOTE: Iterate th
a560: 72 6f 75 67 68 20 61 6c 6c 20 64 61 74 61 62 61  rough all databa
a570: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 6b  se connections k
a580: 6e 6f 77 6e 20 74 6f 20 74 68 65 0d 0a 20 20 20  nown to the..   
a590: 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20           #      
a5a0: 20 70 61 72 65 6e 74 20 69 6e 74 65 72 70 72 65   parent interpre
a5b0: 74 65 72 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  ter...          
a5c0: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20    #..           
a5d0: 20 6f 62 6a 65 63 74 20 66 6f 72 65 61 63 68 20   object foreach 
a5e0: 2d 61 6c 69 61 73 20 70 61 69 72 20 5c 0d 0a 20  -alias pair \.. 
a5f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b                 [
a600: 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66  object invoke -f
a610: 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20  lags +NonPublic 
a620: 24 65 20 49 6e 74 65 72 70 72 65 74 65 72 2e 63  $e Interpreter.c
a630: 6f 6e 6e 65 63 74 69 6f 6e 73 5d 20 7b 0d 0a 20  onnections] {.. 
a640: 20 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a               #..
a650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20                # 
a660: 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74 20 74 6f  NOTE: Attempt to
a670: 20 63 61 6e 63 65 6c 20 61 6e 79 20 53 51 4c 20   cancel any SQL 
a680: 71 75 65 72 69 65 73 20 69 6e 20 70 72 6f 67 72  queries in progr
a690: 65 73 73 20 6f 6e 20 74 68 69 73 0d 0a 20 20 20  ess on this..   
a6a0: 20 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20             #    
a6b0: 20 20 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e     database conn
a6c0: 65 63 74 69 6f 6e 2e 0d 0a 20 20 20 20 20 20 20  ection...       
a6d0: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
a6e0: 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74          if {[cat
a6f0: 63 68 20 7b 24 70 61 69 72 20 56 61 6c 75 65 2e  ch {$pair Value.
a700: 43 61 6e 63 65 6c 7d 20 65 72 72 6f 72 5d 20 21  Cancel} error] !
a710: 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  = 0} then {..   
a720: 20 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75               tpu
a730: 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
a740: 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
a750: 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n \..           
a760: 20 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57           "==== W
a770: 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20 74  ARNING: failed t
a780: 6f 20 63 61 6e 63 65 6c 20 71 75 65 72 79 20 66  o cancel query f
a790: 6f 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 5c 22  or connection \"
a7a0: 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  " \..           
a7b0: 20 20 20 20 20 20 20 20 20 5b 24 70 61 69 72 20           [$pair 
a7c0: 4b 65 79 5d 20 22 5c 22 2c 20 65 72 72 6f 72 3a  Key] "\", error:
a7d0: 20 22 20 5c 6e 5c 74 20 24 65 72 72 6f 72 20 5c   " \n\t $error \
a7e0: 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  n]..            
a7f0: 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20    }..           
a800: 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d   }..          }.
a810: 0a 20 20 20 20 20 20 20 20 7d 7d 0d 0a 20 20 20  .        }}..   
a820: 20 20 20 7d 20 65 72 72 6f 72 5d 20 3d 3d 20 30     } error] == 0
a830: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
a840: 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20    addConstraint 
a850: 69 6e 74 65 72 72 75 70 74 43 61 6c 6c 62 61 63  interruptCallbac
a860: 6b 2e 73 71 6c 69 74 65 33 0d 0a 0d 0a 20 20 20  k.sqlite3....   
a870: 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
a880: 6e 65 6c 20 79 65 73 5c 6e 0d 0a 20 20 20 20 20  nel yes\n..     
a890: 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
a8a0: 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
a8b0: 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 22 6e  l [appendArgs "n
a8c0: 6f 2c 20 65 72 72 6f 72 3a 20 22 20 5c 6e 5c 74  o, error: " \n\t
a8d0: 20 24 65 72 72 6f 72 20 5c 6e 5d 0d 0a 20 20 20   $error \n]..   
a8e0: 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a     }..    }.....
a8f0: 20 20 20 20 70 72 6f 63 20 63 6c 65 61 6e 75 70      proc cleanup
a900: 46 69 6c 65 20 7b 20 66 69 6c 65 4e 61 6d 65 20  File { fileName 
a910: 7b 63 6f 6c 6c 65 63 74 20 74 72 75 65 7d 20 7b  {collect true} {
a920: 66 6f 72 63 65 20 66 61 6c 73 65 7d 20 7d 20 7b  force false} } {
a930: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
a940: 20 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74   # NOTE: Attempt
a950: 20 74 6f 20 66 6f 72 63 65 20 61 6c 6c 20 70 65   to force all pe
a960: 6e 64 69 6e 67 20 22 67 61 72 62 61 67 65 22 20  nding "garbage" 
a970: 6f 62 6a 65 63 74 73 20 74 6f 20 62 65 20 63 6f  objects to be co
a980: 6c 6c 65 63 74 65 64 2c 0d 0a 20 20 20 20 20 20  llected,..      
a990: 23 20 20 20 20 20 20 20 69 6e 63 6c 75 64 69 6e  #       includin
a9a0: 67 20 53 51 4c 69 74 65 20 73 74 61 74 65 6d 65  g SQLite stateme
a9b0: 6e 74 73 20 61 6e 64 20 62 61 63 6b 75 70 20 6f  nts and backup o
a9c0: 62 6a 65 63 74 73 3b 20 74 68 69 73 20 73 68 6f  bjects; this sho
a9d0: 75 6c 64 20 61 6c 6c 6f 77 0d 0a 20 20 20 20 20  uld allow..     
a9e0: 20 23 20 20 20 20 20 20 20 74 68 65 20 75 6e 64   #       the und
a9f0: 65 72 6c 79 69 6e 67 20 64 61 74 61 62 61 73 65  erlying database
aa00: 20 66 69 6c 65 20 74 6f 20 62 65 20 64 65 6c 65   file to be dele
aa10: 74 65 64 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ted...      #.. 
aa20: 20 20 20 20 20 69 66 20 7b 24 63 6f 6c 6c 65 63       if {$collec
aa30: 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  t} then {..     
aa40: 20 20 20 63 6f 6c 6c 65 63 74 47 61 72 62 61 67     collectGarbag
aa50: 65 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  e $::test_channe
aa60: 6c 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  l..      }....  
aa70: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
aa80: 4f 54 45 3a 20 43 68 65 63 6b 20 69 66 20 74 68  OTE: Check if th
aa90: 65 20 66 69 6c 65 20 73 74 69 6c 6c 20 65 78 69  e file still exi
aaa0: 73 74 73 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  sts...      #.. 
aab0: 20 20 20 20 20 69 66 20 7b 5b 66 69 6c 65 20 65       if {[file e
aac0: 78 69 73 74 73 20 24 66 69 6c 65 4e 61 6d 65 5d  xists $fileName]
aad0: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
aae0: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
aaf0: 4f 54 45 3a 20 53 6b 69 70 20 64 65 6c 65 74 69  OTE: Skip deleti
ab00: 6e 67 20 74 65 73 74 20 66 69 6c 65 73 20 69 66  ng test files if
ab10: 20 73 6f 6d 65 62 6f 64 79 20 73 65 74 73 20 74   somebody sets t
ab20: 68 65 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62  he global variab
ab30: 6c 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  le..        #   
ab40: 20 20 20 20 74 6f 20 70 72 65 76 65 6e 74 20 69      to prevent i
ab50: 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  t...        #.. 
ab60: 20 20 20 20 20 20 20 69 66 20 7b 24 66 6f 72 63         if {$forc
ab70: 65 20 7c 7c 20 21 5b 69 6e 66 6f 20 65 78 69 73  e || ![info exis
ab80: 74 73 20 3a 3a 6e 6f 28 63 6c 65 61 6e 75 70 46  ts ::no(cleanupF
ab90: 69 6c 65 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  ile)]} then {.. 
aba0: 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
abb0: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 74        # NOTE: At
abc0: 74 65 6d 70 74 20 74 6f 20 64 65 6c 65 74 65 20  tempt to delete 
abd0: 74 68 65 20 74 65 73 74 20 66 69 6c 65 20 6e 6f  the test file no
abe0: 77 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d  w...          #.
abf0: 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b  .          if {[
ac00: 73 65 74 20 63 6f 64 65 20 5b 63 61 74 63 68 20  set code [catch 
ac10: 7b 66 69 6c 65 20 64 65 6c 65 74 65 20 24 66 69  {file delete $fi
ac20: 6c 65 4e 61 6d 65 7d 20 65 72 72 6f 72 5d 5d 7d  leName} error]]}
ac30: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
ac40: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
ac50: 20 20 20 20 23 20 4e 4f 54 45 3a 20 57 65 20 73      # NOTE: We s
ac60: 6f 6d 65 68 6f 77 20 66 61 69 6c 65 64 20 74 6f  omehow failed to
ac70: 20 64 65 6c 65 74 65 20 74 68 65 20 66 69 6c 65   delete the file
ac80: 2c 20 72 65 70 6f 72 74 20 77 68 79 2e 0d 0a 20  , report why... 
ac90: 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
aca0: 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
acb0: 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
acc0: 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
acd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
ace0: 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61  ==== WARNING: fa
acf0: 69 6c 65 64 20 74 6f 20 64 65 6c 65 74 65 20 74  iled to delete t
ad00: 65 73 74 20 66 69 6c 65 20 5c 22 22 20 24 66 69  est file \"" $fi
ad10: 6c 65 4e 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20  leName \..      
ad20: 20 20 20 20 20 20 20 20 20 20 22 5c 22 20 64 75            "\" du
ad30: 72 69 6e 67 20 63 6c 65 61 6e 75 70 2c 20 65 72  ring cleanup, er
ad40: 72 6f 72 3a 20 22 20 5c 6e 5c 74 20 24 65 72 72  ror: " \n\t $err
ad50: 6f 72 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20  or \n]..        
ad60: 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 20 65    }..        } e
ad70: 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  lse {..         
ad80: 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20   #..          # 
ad90: 4e 4f 54 45 3a 20 53 68 6f 77 20 74 68 61 74 20  NOTE: Show that 
ada0: 77 65 20 73 6b 69 70 70 65 64 20 64 65 6c 65 74  we skipped delet
adb0: 69 6e 67 20 74 68 65 20 66 69 6c 65 2e 0d 0a 20  ing the file... 
adc0: 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
add0: 20 20 20 20 20 20 73 65 74 20 63 6f 64 65 20 30        set code 0
ade0: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70  ....          tp
adf0: 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  uts $::test_chan
ae00: 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
ae10: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
ae20: 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20   "==== WARNING: 
ae30: 73 6b 69 70 70 65 64 20 64 65 6c 65 74 69 6e 67  skipped deleting
ae40: 20 74 65 73 74 20 66 69 6c 65 20 5c 22 22 20 24   test file \"" $
ae50: 66 69 6c 65 4e 61 6d 65 20 5c 0d 0a 20 20 20 20  fileName \..    
ae60: 20 20 20 20 20 20 20 20 20 20 22 5c 22 20 64 75            "\" du
ae70: 72 69 6e 67 20 63 6c 65 61 6e 75 70 5c 6e 22 5d  ring cleanup\n"]
ae80: 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20  ..        }..   
ae90: 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
aea0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
aeb0: 23 20 4e 4f 54 45 3a 20 54 68 65 20 66 69 6c 65  # NOTE: The file
aec0: 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2c   does not exist,
aed0: 20 73 75 63 63 65 73 73 21 0d 0a 20 20 20 20 20   success!..     
aee0: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 73 65     #..        se
aef0: 74 20 63 6f 64 65 20 30 0d 0a 20 20 20 20 20 20  t code 0..      
af00: 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65 74 75 72  }....      retur
af10: 6e 20 24 63 6f 64 65 0d 0a 20 20 20 20 7d 0d 0a  n $code..    }..
af20: 0c 0d 0a 20 20 20 20 70 72 6f 63 20 63 6f 6c 6c  ...    proc coll
af30: 65 63 74 47 61 72 62 61 67 65 20 7b 20 63 68 61  ectGarbage { cha
af40: 6e 6e 65 6c 20 7b 6d 69 6c 6c 69 73 65 63 6f 6e  nnel {millisecon
af50: 64 73 20 31 30 30 30 7d 20 7b 71 75 69 65 74 20  ds 1000} {quiet 
af60: 74 72 75 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20  true} } {..     
af70: 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 6f 62 6a   if {[catch {obj
af80: 65 63 74 20 69 6e 76 6f 6b 65 20 47 43 20 47 65  ect invoke GC Ge
af90: 74 54 6f 74 61 6c 4d 65 6d 6f 72 79 20 66 61 6c  tTotalMemory fal
afa0: 73 65 7d 20 72 65 73 75 6c 74 5d 20 3d 3d 20 30  se} result] == 0
afb0: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
afc0: 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74    if {!$quiet} t
afd0: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
afe0: 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
aff0: 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
b000: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d               "--
b010: 2d 2d 20 6d 65 6d 6f 72 79 20 69 6e 20 75 73 65  -- memory in use
b020: 20 62 79 20 74 68 65 20 43 4c 52 20 62 65 66 6f   by the CLR befo
b030: 72 65 20 63 6f 6c 6c 65 63 74 69 6f 6e 2e 2e 2e  re collection...
b040: 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20   " \..          
b050: 20 20 20 20 24 72 65 73 75 6c 74 20 22 20 62 79      $result " by
b060: 74 65 73 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20  tes\n"]..       
b070: 20 7d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65   }..      } else
b080: 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74   {..        tput
b090: 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  s $channel [appe
b0a0: 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
b0b0: 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e        "==== WARN
b0c0: 49 4e 47 3a 20 66 61 69 6c 65 64 20 74 6f 20 67  ING: failed to g
b0d0: 65 74 20 43 4c 52 20 6d 65 6d 6f 72 79 20 75 73  et CLR memory us
b0e0: 61 67 65 2c 20 65 72 72 6f 72 3a 20 22 20 5c 0d  age, error: " \.
b0f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 5c 6e 5c  .            \n\
b100: 74 20 24 72 65 73 75 6c 74 20 5c 6e 5d 0d 0a 20  t $result \n].. 
b110: 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
b120: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
b130: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
b140: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
b150: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
b160: 23 23 23 23 23 23 23 23 23 0d 0a 0d 0a 20 20 20  #########....   
b170: 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
b180: 54 45 3a 20 52 65 70 65 61 74 65 64 6c 79 20 61  TE: Repeatedly a
b190: 74 74 65 6d 70 74 20 74 6f 20 63 6f 6c 6c 65 63  ttempt to collec
b1a0: 74 20 67 61 72 62 61 67 65 20 75 6e 74 69 6c 20  t garbage until 
b1b0: 74 68 65 20 61 6c 6c 6f 74 74 65 64 20 6e 75 6d  the allotted num
b1c0: 62 65 72 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ber..      #    
b1d0: 20 20 20 6f 66 20 6d 69 6c 6c 69 73 65 63 6f 6e     of millisecon
b1e0: 64 73 20 68 61 73 20 65 6c 61 70 73 65 64 2e 20  ds has elapsed. 
b1f0: 20 41 6c 77 61 79 73 20 61 74 74 65 6d 70 74 20   Always attempt 
b200: 74 6f 20 63 6f 6c 6c 65 63 74 20 67 61 72 62 61  to collect garba
b210: 67 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  ge..      #     
b220: 20 20 61 74 20 6c 65 61 73 74 20 6f 6e 63 65 2e    at least once.
b230: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
b240: 20 73 65 74 20 73 74 61 72 74 20 5b 63 6c 6f 63   set start [cloc
b250: 6b 20 73 65 63 6f 6e 64 73 5d 0d 0a 20 20 20 20  k seconds]..    
b260: 20 20 73 65 74 20 73 74 6f 70 20 5b 65 78 70 72    set stop [expr
b270: 20 7b 24 73 74 61 72 74 20 2b 20 28 24 6d 69 6c   {$start + ($mil
b280: 6c 69 73 65 63 6f 6e 64 73 20 2f 20 31 30 30 30  liseconds / 1000
b290: 29 7d 5d 0d 0a 0d 0a 20 20 20 20 20 20 64 6f 20  )}]....      do 
b2a0: 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
b2b0: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 74        # NOTE: At
b2c0: 74 65 6d 70 74 20 74 6f 20 66 6f 72 63 65 20 61  tempt to force a
b2d0: 20 66 75 6c 6c 20 67 61 72 62 61 67 65 20 63 6f   full garbage co
b2e0: 6c 6c 65 63 74 69 6f 6e 20 6e 6f 77 2e 20 20 52  llection now.  R
b2f0: 65 70 6f 72 74 20 61 6e 79 0d 0a 20 20 20 20 20  eport any..     
b300: 20 20 20 23 20 20 20 20 20 20 20 65 72 72 6f 72     #       error
b310: 20 74 68 61 74 20 69 73 20 65 6e 63 6f 75 6e 74   that is encount
b320: 65 72 65 64 20 69 66 20 77 65 20 66 61 69 6c 2e  ered if we fail.
b330: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
b340: 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20       if {[catch 
b350: 7b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 47  {object invoke G
b360: 43 20 47 65 74 54 6f 74 61 6c 4d 65 6d 6f 72 79  C GetTotalMemory
b370: 20 74 72 75 65 7d 20 65 72 72 6f 72 5d 7d 20 74   true} error]} t
b380: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
b390: 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
b3a0: 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
b3b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 3d 3d               "==
b3c0: 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c  == WARNING: fail
b3d0: 65 64 20 66 75 6c 6c 20 67 61 72 62 61 67 65 20  ed full garbage 
b3e0: 63 6f 6c 6c 65 63 74 69 6f 6e 2c 20 65 72 72 6f  collection, erro
b3f0: 72 3a 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20  r: " \..        
b400: 20 20 20 20 20 20 5c 6e 5c 74 20 24 65 72 72 6f        \n\t $erro
b410: 72 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 7d  r \n]..        }
b420: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20  ....        set 
b430: 6e 6f 77 20 5b 63 6c 6f 63 6b 20 73 65 63 6f 6e  now [clock secon
b440: 64 73 5d 0d 0a 20 20 20 20 20 20 7d 20 77 68 69  ds]..      } whi
b450: 6c 65 20 7b 24 73 74 61 72 74 20 3c 3d 20 24 6e  le {$start <= $n
b460: 6f 77 20 26 26 20 24 6e 6f 77 20 3c 20 24 73 74  ow && $now < $st
b470: 6f 70 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 23 23  op}....      ###
b480: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
b490: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
b4a0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
b4b0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
b4c0: 23 23 23 23 23 23 0d 0a 0d 0a 20 20 20 20 20 20  ######....      
b4d0: 69 66 20 7b 5b 63 61 74 63 68 20 7b 6f 62 6a 65  if {[catch {obje
b4e0: 63 74 20 69 6e 76 6f 6b 65 20 47 43 20 47 65 74  ct invoke GC Get
b4f0: 54 6f 74 61 6c 4d 65 6d 6f 72 79 20 66 61 6c 73  TotalMemory fals
b500: 65 7d 20 72 65 73 75 6c 74 5d 20 3d 3d 20 30 7d  e} result] == 0}
b510: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
b520: 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68   if {!$quiet} th
b530: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
b540: 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b  tputs $channel [
b550: 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
b560: 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
b570: 2d 20 6d 65 6d 6f 72 79 20 69 6e 20 75 73 65 20  - memory in use 
b580: 62 79 20 74 68 65 20 43 4c 52 20 61 66 74 65 72  by the CLR after
b590: 20 63 6f 6c 6c 65 63 74 69 6f 6e 2e 2e 2e 20 22   collection... "
b5a0: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
b5b0: 20 20 24 72 65 73 75 6c 74 20 22 20 62 79 74 65    $result " byte
b5c0: 73 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20 7d  s\n"]..        }
b5d0: 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b  ..      } else {
b5e0: 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20  ..        tputs 
b5f0: 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  $channel [append
b600: 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
b610: 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e      "==== WARNIN
b620: 47 3a 20 66 61 69 6c 65 64 20 74 6f 20 67 65 74  G: failed to get
b630: 20 43 4c 52 20 6d 65 6d 6f 72 79 20 75 73 61 67   CLR memory usag
b640: 65 2c 20 65 72 72 6f 72 3a 20 22 20 5c 0d 0a 20  e, error: " \.. 
b650: 20 20 20 20 20 20 20 20 20 20 20 5c 6e 5c 74 20             \n\t 
b660: 24 72 65 73 75 6c 74 20 5c 6e 5d 0d 0a 20 20 20  $result \n]..   
b670: 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a     }..    }.....
b680: 20 20 20 20 70 72 6f 63 20 67 65 74 53 51 4c 69      proc getSQLi
b690: 74 65 48 61 6e 64 6c 65 43 6f 75 6e 74 73 20 7b  teHandleCounts {
b6a0: 20 63 68 61 6e 6e 65 6c 20 7b 71 75 69 65 74 20   channel {quiet 
b6b0: 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a 20 20 20 20  false} } {..    
b6c0: 20 20 73 65 74 20 72 65 73 75 6c 74 20 5b 6c 69    set result [li
b6d0: 73 74 5d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20  st]....      if 
b6e0: 7b 5b 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74  {[haveConstraint
b6f0: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
b700: 20 20 64 65 66 69 6e 65 43 6f 6e 73 74 61 6e 74    defineConstant
b710: 2e 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c  .System.Data.SQL
b720: 69 74 65 2e 43 4f 55 4e 54 5f 48 41 4e 44 4c 45  ite.COUNT_HANDLE
b730: 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
b740: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
b750: 4e 4f 54 45 3a 20 41 64 64 20 65 61 63 68 20 63  NOTE: Add each c
b760: 72 69 74 69 63 61 6c 20 68 61 6e 64 6c 65 20 63  ritical handle c
b770: 6f 75 6e 74 20 74 6f 20 74 68 65 20 72 65 73 75  ount to the resu
b780: 6c 74 69 6e 67 20 6c 69 73 74 2e 0d 0a 20 20 20  lting list...   
b790: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
b7a0: 66 6f 72 65 61 63 68 20 6e 61 6d 65 20 5b 6c 69  foreach name [li
b7b0: 73 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 43 6f 75  st connectionCou
b7c0: 6e 74 20 73 74 61 74 65 6d 65 6e 74 43 6f 75 6e  nt statementCoun
b7d0: 74 20 62 61 63 6b 75 70 43 6f 75 6e 74 5d 20 7b  t backupCount] {
b7e0: 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20  ..          set 
b7f0: 76 61 6c 75 65 20 5b 6f 62 6a 65 63 74 20 69 6e  value [object in
b800: 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e  voke -flags +Non
b810: 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20  Public \..      
b820: 20 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44          System.D
b830: 61 74 61 2e 53 51 4c 69 74 65 2e 55 6e 73 61 66  ata.SQLite.Unsaf
b840: 65 4e 61 74 69 76 65 4d 65 74 68 6f 64 73 20 24  eNativeMethods $
b850: 6e 61 6d 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  name]....       
b860: 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20     if {!$quiet} 
b870: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
b880: 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
b890: 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
b8a0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
b8b0: 20 20 22 2d 2d 2d 2d 20 63 72 69 74 69 63 61 6c    "---- critical
b8c0: 20 68 61 6e 64 6c 65 20 63 6f 75 6e 74 20 5c 22   handle count \"
b8d0: 22 20 24 6e 61 6d 65 20 22 5c 22 20 69 73 20 22  " $name "\" is "
b8e0: 20 24 76 61 6c 75 65 20 5c 6e 5d 0d 0a 20 20 20   $value \n]..   
b8f0: 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
b900: 20 20 20 20 20 20 6c 61 70 70 65 6e 64 20 72 65        lappend re
b910: 73 75 6c 74 20 24 76 61 6c 75 65 0d 0a 20 20 20  sult $value..   
b920: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 20       }..      } 
b930: 65 6c 73 65 69 66 20 7b 21 24 71 75 69 65 74 7d  elseif {!$quiet}
b940: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
b950: 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
b960: 54 45 3a 20 54 68 65 20 61 63 74 75 61 6c 20 68  TE: The actual h
b970: 61 6e 64 6c 65 20 63 6f 75 6e 74 73 20 61 72 65  andle counts are
b980: 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 3b 20   not available; 
b990: 74 68 65 72 65 66 6f 72 65 2c 20 6a 75 73 74 0d  therefore, just.
b9a0: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
b9b0: 20 72 65 74 75 72 6e 20 61 6e 20 65 6d 70 74 79   return an empty
b9c0: 20 6c 69 73 74 2e 0d 0a 20 20 20 20 20 20 20 20   list...        
b9d0: 23 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73  #..        tputs
b9e0: 20 24 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20   $channel "---- 
b9f0: 63 72 69 74 69 63 61 6c 20 68 61 6e 64 6c 65 20  critical handle 
ba00: 63 6f 75 6e 74 73 20 75 6e 61 76 61 69 6c 61 62  counts unavailab
ba10: 6c 65 5c 6e 22 0d 0a 20 20 20 20 20 20 7d 0d 0a  le\n"..      }..
ba20: 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 24  ..      return $
ba30: 72 65 73 75 6c 74 0d 0a 20 20 20 20 7d 0d 0a 0c  result..    }...
ba40: 0d 0a 20 20 20 20 70 72 6f 63 20 73 68 75 74 64  ..    proc shutd
ba50: 6f 77 6e 53 51 4c 69 74 65 20 7b 20 63 68 61 6e  ownSQLite { chan
ba60: 6e 65 6c 20 7b 66 6f 72 63 65 20 66 61 6c 73 65  nel {force false
ba70: 7d 20 7b 71 75 69 65 74 20 66 61 6c 73 65 7d 20  } {quiet false} 
ba80: 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  } {..      #..  
ba90: 20 20 20 20 23 20 4e 4f 54 45 3a 20 4d 61 6b 65      # NOTE: Make
baa0: 20 73 75 72 65 20 74 68 61 74 20 53 51 4c 69 74   sure that SQLit
bab0: 65 20 63 6f 72 65 20 6c 69 62 72 61 72 79 20 69  e core library i
bac0: 73 20 63 6f 6d 70 6c 65 74 65 6c 79 20 73 68 75  s completely shu
bad0: 74 64 6f 77 6e 2e 20 20 54 68 69 73 0d 0a 20 20  tdown.  This..  
bae0: 20 20 20 20 23 20 20 20 20 20 20 20 69 73 20 75      #       is u
baf0: 73 65 64 20 62 79 20 74 65 73 74 73 20 74 68 61  sed by tests tha
bb00: 74 20 63 68 61 6e 67 65 20 63 6f 6e 66 69 67 75  t change configu
bb10: 72 61 74 69 6f 6e 20 6f 70 74 69 6f 6e 73 20 61  ration options a
bb20: 6e 64 2f 6f 72 20 74 68 6f 73 65 0d 0a 20 20 20  nd/or those..   
bb30: 20 20 20 23 20 20 20 20 20 20 20 74 68 61 74 20     #       that 
bb40: 6e 65 65 64 20 74 6f 20 6d 61 6b 65 20 73 75 72  need to make sur
bb50: 65 20 6c 6f 67 67 69 6e 67 20 69 73 20 69 6e 69  e logging is ini
bb60: 74 69 61 6c 69 7a 65 64 20 28 69 2e 65 2e 20 6a  tialized (i.e. j
bb70: 75 73 74 20 69 6e 20 63 61 73 65 0d 0a 20 20 20  ust in case..   
bb80: 20 20 20 23 20 20 20 20 20 20 20 74 68 65 20 53     #       the S
bb90: 51 4c 69 74 65 20 63 6f 72 65 20 6c 69 62 72 61  QLite core libra
bba0: 72 79 20 77 61 73 20 69 6e 69 74 69 61 6c 69 7a  ry was initializ
bbb0: 65 64 20 69 6e 20 74 68 65 20 70 72 6f 63 65 73  ed in the proces
bbc0: 73 20 70 72 69 6f 72 20 74 6f 0d 0a 20 20 20 20  s prior to..    
bbd0: 20 20 23 20 20 20 20 20 20 20 74 68 65 20 53 51    #       the SQ
bbe0: 4c 69 74 65 4c 6f 67 20 63 6c 61 73 73 20 62 65  LiteLog class be
bbf0: 69 6e 67 20 61 62 6c 65 20 74 6f 20 73 65 74 75  ing able to setu
bc00: 70 20 69 74 73 20 6c 6f 67 67 69 6e 67 20 63 61  p its logging ca
bc10: 6c 6c 62 61 63 6b 29 2e 0d 0a 20 20 20 20 20 20  llback)...      
bc20: 23 20 20 20 20 20 20 20 4e 6f 72 6d 61 6c 6c 79  #       Normally
bc30: 2c 20 74 68 69 73 20 73 68 6f 75 6c 64 20 6f 6e  , this should on
bc40: 6c 79 20 62 65 20 70 65 72 66 6f 72 6d 65 64 20  ly be performed 
bc50: 69 66 20 53 51 4c 69 74 65 20 69 73 20 6c 6f 61  if SQLite is loa
bc60: 64 65 64 20 61 6e 64 0d 0a 20 20 20 20 20 20 23  ded and..      #
bc70: 20 20 20 20 20 20 20 72 65 61 64 79 20 66 6f 72         ready for
bc80: 20 75 73 65 20 62 79 20 74 68 65 20 74 65 73 74   use by the test
bc90: 20 73 75 69 74 65 2e 0d 0a 20 20 20 20 20 20 23   suite...      #
bca0: 0d 0a 20 20 20 20 20 20 69 66 20 7b 24 66 6f 72  ..      if {$for
bcb0: 63 65 20 7c 7c 20 5b 69 73 53 51 4c 69 74 65 52  ce || [isSQLiteR
bcc0: 65 61 64 79 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  eady]} then {.. 
bcd0: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
bce0: 20 20 23 20 42 55 47 46 49 58 3a 20 42 65 66 6f    # BUGFIX: Befo
bcf0: 72 65 20 63 61 6c 6c 69 6e 67 20 74 68 65 20 6e  re calling the n
bd00: 61 74 69 76 65 20 73 68 75 74 64 6f 77 6e 20 66  ative shutdown f
bd10: 75 6e 63 74 69 6f 6e 2c 20 6d 61 6b 65 20 73 75  unction, make su
bd20: 72 65 20 62 6f 74 68 0d 0a 20 20 20 20 20 20 20  re both..       
bd30: 20 23 20 20 20 20 20 20 20 20 20 6f 66 20 74 68   #         of th
bd40: 65 20 50 52 41 47 4d 41 20 72 65 6c 61 74 65 64  e PRAGMA related
bd50: 20 64 69 72 65 63 74 6f 72 79 20 6e 61 6d 65 73   directory names
bd60: 20 61 72 65 20 66 72 65 65 64 2e 0d 0a 20 20 20   are freed...   
bd70: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
bd80: 63 68 65 63 6b 46 6f 72 53 51 4c 69 74 65 44 69  checkForSQLiteDi
bd90: 72 65 63 74 6f 72 69 65 73 20 24 63 68 61 6e 6e  rectories $chann
bda0: 65 6c 20 74 72 75 65 0d 0a 0d 0a 20 20 20 20 20  el true....     
bdb0: 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 6f     if {[catch {o
bdc0: 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c  bject invoke -fl
bdd0: 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c  ags +NonPublic \
bde0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
bdf0: 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51    System.Data.SQ
be00: 4c 69 74 65 2e 55 6e 73 61 66 65 4e 61 74 69 76  Lite.UnsafeNativ
be10: 65 4d 65 74 68 6f 64 73 20 5c 0d 0a 20 20 20 20  eMethods \..    
be20: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
be30: 74 65 33 5f 73 68 75 74 64 6f 77 6e 7d 20 72 65  te3_shutdown} re
be40: 73 75 6c 74 5d 20 3d 3d 20 30 7d 20 74 68 65 6e  sult] == 0} then
be50: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66   {..          if
be60: 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20   {!$quiet} then 
be70: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  {..            t
be80: 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61  puts $channel [a
be90: 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
bea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d               "--
beb0: 2d 2d 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 5f  -- call sqlite3_
bec0: 73 68 75 74 64 6f 77 6e 28 29 2e 2e 2e 20 6f 6b  shutdown()... ok
bed0: 3a 20 22 20 24 72 65 73 75 6c 74 20 5c 6e 5d 0d  : " $result \n].
bee0: 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  .          }..  
bef0: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
bf00: 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 24            if {!$
bf10: 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20  quiet} then {.. 
bf20: 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
bf30: 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e   $channel [appen
bf40: 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
bf50: 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63           "---- c
bf60: 61 6c 6c 20 73 71 6c 69 74 65 33 5f 73 68 75 74  all sqlite3_shut
bf70: 64 6f 77 6e 28 29 2e 2e 2e 20 65 72 72 6f 72 3a  down()... error:
bf80: 20 22 20 5c 6e 5c 74 20 24 72 65 73 75 6c 74 20   " \n\t $result 
bf90: 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  \n]..          }
bfa0: 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20  ..        }..   
bfb0: 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a     }..    }.....
bfc0: 20 20 20 20 70 72 6f 63 20 72 65 70 6f 72 74 53      proc reportS
bfd0: 51 4c 69 74 65 52 65 73 6f 75 72 63 65 73 20 7b  QLiteResources {
bfe0: 20 63 68 61 6e 6e 65 6c 20 7b 71 75 69 65 74 20   channel {quiet 
bff0: 66 61 6c 73 65 7d 20 7b 63 6f 6c 6c 65 63 74 20  false} {collect 
c000: 74 72 75 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20  true} } {..     
c010: 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
c020: 3a 20 53 6b 69 70 20 61 6c 6c 20 6f 75 74 70 75  : Skip all outpu
c030: 74 20 69 66 20 77 65 20 61 72 65 20 72 75 6e 6e  t if we are runn
c040: 69 6e 67 20 69 6e 20 22 71 75 69 65 74 22 20 6d  ing in "quiet" m
c050: 6f 64 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ode...      #.. 
c060: 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74       if {!$quiet
c070: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
c080: 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
c090: 20 22 2d 2d 2d 2d 20 63 75 72 72 65 6e 74 20 6d   "---- current m
c0a0: 65 6d 6f 72 79 20 69 6e 20 75 73 65 20 62 79 20  emory in use by 
c0b0: 53 51 4c 69 74 65 2e 2e 2e 20 22 0d 0a 20 20 20  SQLite... "..   
c0c0: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 69 66     }....      if
c0d0: 20 7b 5b 63 61 74 63 68 20 7b 6f 62 6a 65 63 74   {[catch {object
c0e0: 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b   invoke -flags +
c0f0: 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20  NonPublic \..   
c100: 20 20 20 20 20 20 20 20 20 20 20 53 79 73 74 65             Syste
c110: 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 55 6e  m.Data.SQLite.Un
c120: 73 61 66 65 4e 61 74 69 76 65 4d 65 74 68 6f 64  safeNativeMethod
c130: 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
c140: 20 20 20 73 71 6c 69 74 65 33 5f 6d 65 6d 6f 72     sqlite3_memor
c150: 79 5f 75 73 65 64 7d 20 6d 65 6d 6f 72 79 5d 20  y_used} memory] 
c160: 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  == 0} then {..  
c170: 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65        if {!$quie
c180: 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  t} then {..     
c190: 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
c1a0: 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
c1b0: 24 6d 65 6d 6f 72 79 20 22 20 62 79 74 65 73 5c  $memory " bytes\
c1c0: 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  n"]..        }..
c1d0: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
c1e0: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
c1f0: 20 20 20 23 20 4e 4f 54 45 3a 20 4d 61 79 62 65     # NOTE: Maybe
c200: 20 74 68 65 20 53 51 4c 69 74 65 20 63 6f 72 65   the SQLite core
c210: 20 6c 69 62 72 61 72 79 20 69 73 20 75 6e 61 76   library is unav
c220: 61 69 6c 61 62 6c 65 3f 0d 0a 20 20 20 20 20 20  ailable?..      
c230: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 73 65 74    #..        set
c240: 20 6d 65 6d 6f 72 79 20 75 6e 6b 6e 6f 77 6e 0d   memory unknown.
c250: 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21  ...        if {!
c260: 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a  $quiet} then {..
c270: 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
c280: 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  $channel [append
c290: 41 72 67 73 20 24 6d 65 6d 6f 72 79 20 5c 6e 5d  Args $memory \n]
c2a0: 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20  ..        }..   
c2b0: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 73 65     }....      se
c2c0: 74 20 72 65 73 75 6c 74 20 24 6d 65 6d 6f 72 79  t result $memory
c2d0: 3b 20 23 20 4e 4f 54 45 3a 20 52 65 74 75 72 6e  ; # NOTE: Return
c2e0: 20 6d 65 6d 6f 72 79 20 69 6e 2d 75 73 65 20 74   memory in-use t
c2f0: 6f 20 6f 75 72 20 63 61 6c 6c 65 72 2e 0d 0a 0d  o our caller....
c300: 0a 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69  .      if {!$qui
c310: 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  et} then {..    
c320: 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
c330: 65 6c 20 22 2d 2d 2d 2d 20 6d 61 78 69 6d 75 6d  el "---- maximum
c340: 20 6d 65 6d 6f 72 79 20 69 6e 20 75 73 65 20 62   memory in use b
c350: 79 20 53 51 4c 69 74 65 2e 2e 2e 20 22 0d 0a 20  y SQLite... ".. 
c360: 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
c370: 69 66 20 7b 5b 63 61 74 63 68 20 7b 6f 62 6a 65  if {[catch {obje
c380: 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73  ct invoke -flags
c390: 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20   +NonPublic \.. 
c3a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 53 79 73               Sys
c3b0: 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e  tem.Data.SQLite.
c3c0: 55 6e 73 61 66 65 4e 61 74 69 76 65 4d 65 74 68  UnsafeNativeMeth
c3d0: 6f 64 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ods \..         
c3e0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 65 6d       sqlite3_mem
c3f0: 6f 72 79 5f 68 69 67 68 77 61 74 65 72 20 30 7d  ory_highwater 0}
c400: 20 6d 65 6d 6f 72 79 5d 20 3d 3d 20 30 7d 20 74   memory] == 0} t
c410: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 69  hen {..        i
c420: 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e  f {!$quiet} then
c430: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70   {..          tp
c440: 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70  uts $channel [ap
c450: 70 65 6e 64 41 72 67 73 20 24 6d 65 6d 6f 72 79  pendArgs $memory
c460: 20 22 20 62 79 74 65 73 5c 6e 22 5d 0d 0a 20 20   " bytes\n"]..  
c470: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d        }..      }
c480: 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
c490: 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
c4a0: 54 45 3a 20 4d 61 79 62 65 20 74 68 65 20 53 51  TE: Maybe the SQ
c4b0: 4c 69 74 65 20 63 6f 72 65 20 6c 69 62 72 61 72  Lite core librar
c4c0: 79 20 69 73 20 75 6e 61 76 61 69 6c 61 62 6c 65  y is unavailable
c4d0: 3f 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ?..        #..  
c4e0: 20 20 20 20 20 20 73 65 74 20 6d 65 6d 6f 72 79        set memory
c4f0: 20 75 6e 6b 6e 6f 77 6e 0d 0a 0d 0a 20 20 20 20   unknown....    
c500: 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d      if {!$quiet}
c510: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
c520: 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
c530: 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 24 6d  l [appendArgs $m
c540: 65 6d 6f 72 79 20 5c 6e 5d 0d 0a 20 20 20 20 20  emory \n]..     
c550: 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d     }..      }...
c560: 0a 20 20 20 20 20 20 69 66 20 7b 24 63 6f 6c 6c  .      if {$coll
c570: 65 63 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  ect} then {..   
c580: 20 20 20 20 20 63 6f 6c 6c 65 63 74 47 61 72 62       collectGarb
c590: 61 67 65 20 24 63 68 61 6e 6e 65 6c 0d 0a 20 20  age $channel..  
c5a0: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 69      }....      i
c5b0: 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e  f {!$quiet} then
c5c0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74   {..        tput
c5d0: 73 20 24 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d  s $channel "----
c5e0: 20 63 75 72 72 65 6e 74 20 6d 65 6d 6f 72 79 20   current memory 
c5f0: 69 6e 20 75 73 65 20 62 79 20 74 68 65 20 43 4c  in use by the CL
c600: 52 2e 2e 2e 20 22 0d 0a 20 20 20 20 20 20 7d 0d  R... "..      }.
c610: 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 63 61  ...      if {[ca
c620: 74 63 68 20 7b 6f 62 6a 65 63 74 20 69 6e 76 6f  tch {object invo
c630: 6b 65 20 47 43 20 47 65 74 54 6f 74 61 6c 4d 65  ke GC GetTotalMe
c640: 6d 6f 72 79 20 66 61 6c 73 65 7d 20 6d 65 6d 6f  mory false} memo
c650: 72 79 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b  ry] == 0} then {
c660: 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73  ..        if {[s
c670: 74 72 69 6e 67 20 69 73 20 69 6e 74 65 67 65 72  tring is integer
c680: 20 2d 73 74 72 69 63 74 20 24 6d 65 6d 6f 72 79   -strict $memory
c690: 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
c6a0: 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74       if {!$quiet
c6b0: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
c6c0: 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
c6d0: 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
c6e0: 20 24 6d 65 6d 6f 72 79 20 22 20 62 79 74 65 73   $memory " bytes
c6f0: 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20 20 20  \n"]..          
c700: 7d 0d 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73  }..        } els
c710: 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73  e {..          s
c720: 65 74 20 6d 65 6d 6f 72 79 20 69 6e 76 61 6c 69  et memory invali
c730: 64 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 69  d....          i
c740: 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e  f {!$quiet} then
c750: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
c760: 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b  tputs $channel [
c770: 61 70 70 65 6e 64 41 72 67 73 20 24 6d 65 6d 6f  appendArgs $memo
c780: 72 79 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20  ry \n]..        
c790: 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a    }..        }..
c7a0: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
c7b0: 20 20 20 20 20 20 20 20 73 65 74 20 6d 65 6d 6f          set memo
c7c0: 72 79 20 75 6e 6b 6e 6f 77 6e 0d 0a 0d 0a 20 20  ry unknown....  
c7d0: 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65        if {!$quie
c7e0: 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  t} then {..     
c7f0: 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
c800: 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
c810: 24 6d 65 6d 6f 72 79 20 5c 6e 5d 0d 0a 20 20 20  $memory \n]..   
c820: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d       }..      }.
c830: 0a 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ...      return 
c840: 24 72 65 73 75 6c 74 0d 0a 20 20 20 20 7d 0d 0a  $result..    }..
c850: 0c 0d 0a 20 20 20 20 70 72 6f 63 20 63 68 65 63  ...    proc chec
c860: 6b 46 6f 72 53 51 4c 69 74 65 44 69 72 65 63 74  kForSQLiteDirect
c870: 6f 72 69 65 73 20 7b 20 63 68 61 6e 6e 65 6c 20  ories { channel 
c880: 7b 72 65 73 65 74 20 66 61 6c 73 65 7d 20 7d 20  {reset false} } 
c890: 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  {..      #..    
c8a0: 20 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20    # NOTE: Check 
c8b0: 69 66 20 74 68 65 20 73 71 6c 69 74 65 33 5f 77  if the sqlite3_w
c8c0: 69 6e 33 32 5f 73 65 74 5f 64 69 72 65 63 74 6f  in32_set_directo
c8d0: 72 79 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  ry function is a
c8e0: 76 61 69 6c 61 62 6c 65 2e 0d 0a 20 20 20 20 20  vailable...     
c8f0: 20 23 0d 0a 20 20 20 20 20 20 74 70 75 74 73 20   #..      tputs 
c900: 24 63 68 61 6e 6e 65 6c 20 5c 0d 0a 20 20 20 20  $channel \..    
c910: 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 68 65 63        "---- chec
c920: 6b 69 6e 67 20 66 6f 72 20 66 75 6e 63 74 69 6f  king for functio
c930: 6e 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f  n sqlite3_win32_
c940: 73 65 74 5f 64 69 72 65 63 74 6f 72 79 2e 2e 2e  set_directory...
c950: 20 22 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20   "....      #.. 
c960: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 69       # NOTE: Thi
c970: 73 20 63 61 6c 6c 20 74 6f 20 74 68 65 20 73 71  s call to the sq
c980: 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 65 74 5f  lite3_win32_set_
c990: 64 69 72 65 63 74 6f 72 79 20 66 75 6e 63 74 69  directory functi
c9a0: 6f 6e 20 75 73 65 73 20 74 68 65 0d 0a 20 20 20  on uses the..   
c9b0: 20 20 20 23 20 20 20 20 20 20 20 69 6e 76 61 6c     #       inval
c9c0: 69 64 20 76 61 6c 75 65 20 30 20 66 6f 72 20 74  id value 0 for t
c9d0: 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
c9e0: 74 2e 20 20 54 68 69 73 20 63 6f 64 65 20 69 73  t.  This code is
c9f0: 20 64 65 73 69 67 6e 65 64 0d 0a 20 20 20 20 20   designed..     
ca00: 20 23 20 20 20 20 20 20 20 74 6f 20 63 68 65 63   #       to chec
ca10: 6b 20 69 66 20 63 61 6c 6c 69 6e 67 20 74 68 65  k if calling the
ca20: 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 72   function will r
ca30: 61 69 73 65 20 61 6e 20 65 78 63 65 70 74 69 6f  aise an exceptio
ca40: 6e 20 28 69 2e 65 2e 0d 0a 20 20 20 20 20 20 23  n (i.e...      #
ca50: 20 20 20 20 20 20 20 74 68 65 20 61 63 74 75 61         the actua
ca60: 6c 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20  l result of the 
ca70: 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f  function does no
ca80: 74 20 6d 61 74 74 65 72 20 61 73 20 6c 6f 6e 67  t matter as long
ca90: 20 61 73 20 6e 6f 0d 0a 20 20 20 20 20 20 23 20   as no..      # 
caa0: 20 20 20 20 20 20 64 69 72 65 63 74 6f 72 79 20        directory 
cab0: 69 73 20 63 68 61 6e 67 65 64 29 2e 0d 0a 20 20  is changed)...  
cac0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20      #..      if 
cad0: 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20  {[catch {..     
cae0: 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20           object 
caf0: 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e  invoke -flags +N
cb00: 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20  onPublic \..    
cb10: 20 20 20 20 20 20 20 20 20 20 53 79 73 74 65 6d            System
cb20: 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 55 6e 73  .Data.SQLite.Uns
cb30: 61 66 65 4e 61 74 69 76 65 4d 65 74 68 6f 64 73  afeNativeMethods
cb40: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
cb50: 20 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f    sqlite3_win32_
cb60: 73 65 74 5f 64 69 72 65 63 74 6f 72 79 20 30 20  set_directory 0 
cb70: 6e 75 6c 6c 7d 5d 20 3d 3d 20 30 7d 20 74 68 65  null}] == 0} the
cb80: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  n {..        #..
cb90: 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
cba0: 43 61 6c 6c 69 6e 67 20 74 68 65 20 73 71 6c 69  Calling the sqli
cbb0: 74 65 33 5f 77 69 6e 33 32 5f 73 65 74 5f 64 69  te3_win32_set_di
cbc0: 72 65 63 74 6f 72 79 20 66 75 6e 63 74 69 6f 6e  rectory function
cbd0: 20 64 6f 65 73 20 6e 6f 74 0d 0a 20 20 20 20 20   does not..     
cbe0: 20 20 20 23 20 20 20 20 20 20 20 63 61 75 73 65     #       cause
cbf0: 20 61 6e 20 65 78 63 65 70 74 69 6f 6e 3b 20 74   an exception; t
cc00: 68 65 72 65 66 6f 72 65 2c 20 69 74 20 6d 75 73  herefore, it mus
cc10: 74 20 62 65 20 61 76 61 69 6c 61 62 6c 65 20 28  t be available (
cc20: 69 2e 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 20  i.e...        # 
cc30: 20 20 20 20 20 20 65 76 65 6e 20 74 68 6f 75 67        even thoug
cc40: 68 20 69 74 20 73 68 6f 75 6c 64 20 72 65 74 75  h it should retu
cc50: 72 6e 20 61 20 66 61 69 6c 75 72 65 20 72 65 74  rn a failure ret
cc60: 75 72 6e 20 63 6f 64 65 20 69 6e 20 74 68 69 73  urn code in this
cc70: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
cc80: 20 20 63 61 73 65 29 2e 0d 0a 20 20 20 20 20 20    case)...      
cc90: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 61 64 64    #..        add
cca0: 43 6f 6e 73 74 72 61 69 6e 74 20 73 71 6c 69 74  Constraint sqlit
ccb0: 65 33 5f 77 69 6e 33 32 5f 73 65 74 5f 64 69 72  e3_win32_set_dir
ccc0: 65 63 74 6f 72 79 0d 0a 0d 0a 20 20 20 20 20 20  ectory....      
ccd0: 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
cce0: 20 79 65 73 5c 6e 0d 0a 0d 0a 20 20 20 20 20 20   yes\n....      
ccf0: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
cd00: 4f 54 45 3a 20 44 6f 65 73 20 6f 75 72 20 63 61  OTE: Does our ca
cd10: 6c 6c 65 72 20 77 61 6e 74 20 74 6f 20 72 65 73  ller want to res
cd20: 65 74 20 74 68 65 20 64 69 72 65 63 74 6f 72 69  et the directori
cd30: 65 73 3f 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  es?..        #..
cd40: 20 20 20 20 20 20 20 20 69 66 20 7b 24 72 65 73          if {$res
cd50: 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  et} then {..    
cd60: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
cd70: 20 20 20 23 20 4e 4f 54 45 3a 20 4e 6f 77 20 6d     # NOTE: Now m
cd80: 61 6b 65 20 73 75 72 65 20 74 68 65 20 64 61 74  ake sure the dat
cd90: 61 62 61 73 65 20 61 6e 64 20 74 65 6d 70 6f 72  abase and tempor
cda0: 61 72 79 20 64 69 72 65 63 74 6f 72 69 65 73 20  ary directories 
cdb0: 61 72 65 0d 0a 20 20 20 20 20 20 20 20 20 20 23  are..          #
cdc0: 20 20 20 20 20 20 20 72 65 73 65 74 20 74 68 65         reset the
cdd0: 69 72 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65  ir default value
cde0: 73 2c 20 77 68 69 63 68 20 73 68 6f 75 6c 64 20  s, which should 
cdf0: 62 65 20 6e 75 6c 6c 20 66 6f 72 20 62 6f 74 68  be null for both
ce00: 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 20  ...          #  
ce10: 20 20 20 20 20 53 69 6e 63 65 20 74 68 65 20 73       Since the s
ce20: 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 65 74  qlite3_win32_set
ce30: 5f 64 69 72 65 63 74 6f 72 79 20 66 75 6e 63 74  _directory funct
ce40: 69 6f 6e 20 69 73 20 61 76 61 69 6c 61 62 6c 65  ion is available
ce50: 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 20  ,..          #  
ce60: 20 20 20 20 20 75 73 65 20 69 74 2e 0d 0a 20 20       use it...  
ce70: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
ce80: 20 20 20 20 20 66 6f 72 20 7b 73 65 74 20 69 6e       for {set in
ce90: 64 65 78 20 31 7d 20 7b 24 69 6e 64 65 78 20 3c  dex 1} {$index <
cea0: 20 33 7d 20 7b 69 6e 63 72 20 69 6e 64 65 78 7d   3} {incr index}
ceb0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
cec0: 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20  if {[catch {..  
ced0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cee0: 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20    object invoke 
cef0: 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69  -flags +NonPubli
cf00: 63 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  c \..           
cf10: 20 20 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e           System.
cf20: 44 61 74 61 2e 53 51 4c 69 74 65 2e 55 6e 73 61  Data.SQLite.Unsa
cf30: 66 65 4e 61 74 69 76 65 4d 65 74 68 6f 64 73 20  feNativeMethods 
cf40: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
cf50: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 77         sqlite3_w
cf60: 69 6e 33 32 5f 73 65 74 5f 64 69 72 65 63 74 6f  in32_set_directo
cf70: 72 79 20 24 69 6e 64 65 78 20 6e 75 6c 6c 7d 20  ry $index null} 
cf80: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
cf90: 20 20 20 20 20 20 20 72 65 73 75 6c 74 5d 20 3d         result] =
cfa0: 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  = 0} then {..   
cfb0: 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
cfc0: 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e   $channel [appen
cfd0: 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
cfe0: 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
cff0: 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 5f 77 69   call sqlite3_wi
d000: 6e 33 32 5f 73 65 74 5f 64 69 72 65 63 74 6f 72  n32_set_director
d010: 79 28 22 20 24 69 6e 64 65 78 20 5c 0d 0a 20 20  y(" $index \..  
d020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d030: 22 2c 20 6e 75 6c 6c 29 2e 2e 2e 20 6f 6b 3a 20  ", null)... ok: 
d040: 22 20 24 72 65 73 75 6c 74 20 5c 6e 5d 0d 0a 20  " $result \n].. 
d050: 20 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73             } els
d060: 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e {..           
d070: 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
d080: 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
d090: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
d0a0: 20 20 20 22 2d 2d 2d 2d 20 63 61 6c 6c 20 73 71     "---- call sq
d0b0: 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 65 74 5f  lite3_win32_set_
d0c0: 64 69 72 65 63 74 6f 72 79 28 22 20 24 69 6e 64  directory(" $ind
d0d0: 65 78 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  ex \..          
d0e0: 20 20 20 20 20 20 20 20 22 2c 20 6e 75 6c 6c 29          ", null)
d0f0: 2e 2e 2e 20 65 72 72 6f 72 3a 20 22 20 5c 6e 5c  ... error: " \n\
d100: 74 20 24 72 65 73 75 6c 74 20 5c 6e 5d 0d 0a 20  t $result \n].. 
d110: 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
d120: 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
d130: 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 20 65 6c     }..      } el
d140: 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70  se {..        tp
d150: 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 6e 6f 5c  uts $channel no\
d160: 6e 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  n....        #..
d170: 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
d180: 44 6f 65 73 20 6f 75 72 20 63 61 6c 6c 65 72 20  Does our caller 
d190: 77 61 6e 74 20 74 6f 20 72 65 73 65 74 20 74 68  want to reset th
d1a0: 65 20 64 69 72 65 63 74 6f 72 69 65 73 3f 20 20  e directories?  
d1b0: 54 68 69 73 20 63 61 6e 20 6f 6e 6c 79 0d 0a 20  This can only.. 
d1c0: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 62         #       b
d1d0: 65 20 70 65 72 66 6f 72 6d 65 64 20 69 66 20 53  e performed if S
d1e0: 51 4c 69 74 65 20 69 73 20 6c 6f 61 64 65 64 20  QLite is loaded 
d1f0: 61 6e 64 20 72 65 61 64 79 20 66 6f 72 20 75 73  and ready for us
d200: 65 20 62 79 20 74 68 65 20 74 65 73 74 0d 0a 20  e by the test.. 
d210: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 73         #       s
d220: 75 69 74 65 2e 0d 0a 20 20 20 20 20 20 20 20 23  uite...        #
d230: 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 24 72  ..        if {$r
d240: 65 73 65 74 20 26 26 20 5b 69 73 53 51 4c 69 74  eset && [isSQLit
d250: 65 52 65 61 64 79 5d 7d 20 74 68 65 6e 20 7b 0d  eReady]} then {.
d260: 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
d270: 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
d280: 4e 6f 77 20 6d 61 6b 65 20 73 75 72 65 20 74 68  Now make sure th
d290: 65 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 74  e database and t
d2a0: 65 6d 70 6f 72 61 72 79 20 64 69 72 65 63 74 6f  emporary directo
d2b0: 72 69 65 73 20 61 72 65 0d 0a 20 20 20 20 20 20  ries are..      
d2c0: 20 20 20 20 23 20 20 20 20 20 20 20 72 65 73 65      #       rese
d2d0: 74 20 74 68 65 69 72 20 64 65 66 61 75 6c 74 20  t their default 
d2e0: 76 61 6c 75 65 73 2c 20 77 68 69 63 68 20 73 68  values, which sh
d2f0: 6f 75 6c 64 20 62 65 20 6e 75 6c 6c 20 66 6f 72  ould be null for
d300: 20 62 6f 74 68 2e 0d 0a 20 20 20 20 20 20 20 20   both...        
d310: 20 20 23 20 20 20 20 20 20 20 53 69 6e 63 65 20    #       Since 
d320: 74 68 65 20 73 71 6c 69 74 65 33 5f 77 69 6e 33  the sqlite3_win3
d330: 32 5f 73 65 74 5f 64 69 72 65 63 74 6f 72 79 20  2_set_directory 
d340: 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f  function does no
d350: 74 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 20  t..          #  
d360: 20 20 20 20 20 61 70 70 65 61 72 20 74 6f 20 62       appear to b
d370: 65 20 61 76 61 69 6c 61 62 6c 65 2c 20 75 73 65  e available, use
d380: 20 74 68 65 20 61 73 73 6f 63 69 61 74 65 64 20   the associated 
d390: 50 52 41 47 4d 41 20 63 6f 6d 6d 61 6e 64 73 0d  PRAGMA commands.
d3a0: 0a 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20  .          #    
d3b0: 20 20 20 69 6e 73 74 65 61 64 2e 0d 0a 20 20 20     instead...   
d3c0: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
d3d0: 20 20 20 20 66 6f 72 65 61 63 68 20 64 69 72 65      foreach dire
d3e0: 63 74 6f 72 79 20 5b 6c 69 73 74 20 64 61 74 61  ctory [list data
d3f0: 5f 73 74 6f 72 65 5f 64 69 72 65 63 74 6f 72 79  _store_directory
d400: 20 74 65 6d 70 5f 73 74 6f 72 65 5f 64 69 72 65   temp_store_dire
d410: 63 74 6f 72 79 5d 20 7b 0d 0a 20 20 20 20 20 20  ctory] {..      
d420: 20 20 20 20 20 20 73 65 74 20 73 71 6c 20 5b 61        set sql [a
d430: 70 70 65 6e 64 41 72 67 73 20 22 50 52 41 47 4d  ppendArgs "PRAGM
d440: 41 20 22 20 24 64 69 72 65 63 74 6f 72 79 20 22  A " $directory "
d450: 20 3d 20 5c 22 5c 22 3b 22 5d 0d 0a 0d 0a 20 20   = \"\";"]....  
d460: 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63            if {[c
d470: 61 74 63 68 20 7b 65 78 65 63 75 74 65 53 71 6c  atch {executeSql
d480: 20 24 73 71 6c 7d 20 72 65 73 75 6c 74 5d 20 3d   $sql} result] =
d490: 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  = 0} then {..   
d4a0: 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
d4b0: 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e   $channel [appen
d4c0: 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
d4d0: 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
d4e0: 20 65 78 65 63 75 74 65 20 50 52 41 47 4d 41 20   execute PRAGMA 
d4f0: 22 20 24 64 69 72 65 63 74 6f 72 79 20 22 2e 2e  " $directory "..
d500: 2e 20 6f 6b 3a 20 5c 22 22 20 5c 0d 0a 20 20 20  . ok: \"" \..   
d510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 24                 $
d520: 72 65 73 75 6c 74 20 5c 22 5c 6e 5d 0d 0a 20 20  result \"\n]..  
d530: 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65            } else
d540: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
d550: 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
d560: 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
d570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d580: 20 20 22 2d 2d 2d 2d 20 65 78 65 63 75 74 65 20    "---- execute 
d590: 50 52 41 47 4d 41 20 22 20 24 64 69 72 65 63 74  PRAGMA " $direct
d5a0: 6f 72 79 20 22 2e 2e 2e 20 65 72 72 6f 72 3a 20  ory "... error: 
d5b0: 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  " \..           
d5c0: 20 20 20 20 20 20 20 5c 6e 5c 74 20 24 72 65 73         \n\t $res
d5d0: 75 6c 74 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20  ult \n]..       
d5e0: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
d5f0: 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a    }..        }..
d600: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
d610: 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
d620: 3a 20 46 69 6e 61 6c 6c 79 2c 20 73 68 6f 77 20  : Finally, show 
d630: 74 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75  the current valu
d640: 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
d650: 65 20 61 6e 64 20 74 65 6d 70 6f 72 61 72 79 0d  e and temporary.
d660: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 64  .      #       d
d670: 69 72 65 63 74 6f 72 69 65 73 2e 20 20 54 68 69  irectories.  Thi
d680: 73 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20 70 65  s can only be pe
d690: 72 66 6f 72 6d 65 64 20 69 66 20 53 51 4c 69 74  rformed if SQLit
d6a0: 65 20 69 73 20 6c 6f 61 64 65 64 0d 0a 20 20 20  e is loaded..   
d6b0: 20 20 20 23 20 20 20 20 20 20 20 61 6e 64 20 72     #       and r
d6c0: 65 61 64 79 20 66 6f 72 20 75 73 65 20 62 79 20  eady for use by 
d6d0: 74 68 65 20 74 65 73 74 20 73 75 69 74 65 2e 0d  the test suite..
d6e0: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
d6f0: 69 66 20 7b 5b 69 73 53 51 4c 69 74 65 52 65 61  if {[isSQLiteRea
d700: 64 79 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  dy]} then {..   
d710: 20 20 20 20 20 66 6f 72 65 61 63 68 20 64 69 72       foreach dir
d720: 65 63 74 6f 72 79 20 5b 6c 69 73 74 20 64 61 74  ectory [list dat
d730: 61 5f 73 74 6f 72 65 5f 64 69 72 65 63 74 6f 72  a_store_director
d740: 79 20 74 65 6d 70 5f 73 74 6f 72 65 5f 64 69 72  y temp_store_dir
d750: 65 63 74 6f 72 79 5d 20 7b 0d 0a 20 20 20 20 20  ectory] {..     
d760: 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
d770: 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
d780: 22 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e 67 20 22  "---- checking "
d790: 20 24 64 69 72 65 63 74 6f 72 79 20 22 2e 2e 2e   $directory "...
d7a0: 20 22 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20   "]....         
d7b0: 20 73 65 74 20 73 71 6c 20 5b 61 70 70 65 6e 64   set sql [append
d7c0: 41 72 67 73 20 22 50 52 41 47 4d 41 20 22 20 24  Args "PRAGMA " $
d7d0: 64 69 72 65 63 74 6f 72 79 20 5c 3b 5d 0d 0a 0d  directory \;]...
d7e0: 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b  .          if {[
d7f0: 63 61 74 63 68 20 7b 65 78 65 63 75 74 65 53 71  catch {executeSq
d800: 6c 20 24 73 71 6c 20 73 63 61 6c 61 72 7d 20 72  l $sql scalar} r
d810: 65 73 75 6c 74 5d 20 3d 3d 20 30 7d 20 74 68 65  esult] == 0} the
d820: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
d830: 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
d840: 5b 61 70 70 65 6e 64 41 72 67 73 20 22 6f 6b 3a  [appendArgs "ok:
d850: 20 5c 22 22 20 24 72 65 73 75 6c 74 20 5c 22 5c   \"" $result \"\
d860: 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 20  n]..          } 
d870: 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
d880: 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
d890: 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 22  el [appendArgs "
d8a0: 65 72 72 6f 72 3a 20 22 20 5c 6e 5c 74 20 24 72  error: " \n\t $r
d8b0: 65 73 75 6c 74 20 5c 6e 5d 0d 0a 20 20 20 20 20  esult \n]..     
d8c0: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
d8d0: 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  }..      }..    
d8e0: 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 6c  }.....    proc l
d8f0: 6f 61 64 53 51 4c 69 74 65 54 65 73 74 53 65 74  oadSQLiteTestSet
d900: 74 69 6e 67 73 20 7b 20 63 68 61 6e 6e 65 6c 20  tings { channel 
d910: 7b 73 75 66 66 69 78 20 22 22 7d 20 7b 71 75 69  {suffix ""} {qui
d920: 65 74 20 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a 20  et false} } {.. 
d930: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
d940: 4e 4f 54 45 3a 20 53 6b 69 70 20 6c 6f 61 64 69  NOTE: Skip loadi
d950: 6e 67 20 74 68 65 20 73 65 74 74 69 6e 67 73 20  ng the settings 
d960: 69 66 20 74 68 65 69 72 20 75 73 61 67 65 20 68  if their usage h
d970: 61 73 20 62 65 65 6e 20 64 69 73 61 62 6c 65 64  as been disabled
d980: 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
d990: 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69    if {![info exi
d9a0: 73 74 73 20 3a 3a 6e 6f 28 73 71 6c 69 74 65 54  sts ::no(sqliteT
d9b0: 65 73 74 53 65 74 74 69 6e 67 73 29 5d 7d 20 74  estSettings)]} t
d9c0: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  hen {..        #
d9d0: 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
d9e0: 3a 20 4c 6f 61 64 20 63 75 73 74 6f 6d 20 70 65  : Load custom pe
d9f0: 72 2d 75 73 65 72 20 61 6e 64 2f 6f 72 20 70 65  r-user and/or pe
da00: 72 2d 68 6f 73 74 20 74 65 73 74 20 73 65 74 74  r-host test sett
da10: 69 6e 67 73 20 6e 6f 77 2e 0d 0a 20 20 20 20 20  ings now...     
da20: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 69 66     #..        if
da30: 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a   {[info exists :
da40: 3a 74 63 6c 5f 70 6c 61 74 66 6f 72 6d 28 75 73  :tcl_platform(us
da50: 65 72 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  er)]} then {..  
da60: 20 20 20 20 20 20 20 20 73 65 74 20 75 73 65 72          set user
da70: 53 65 74 74 69 6e 67 73 46 69 6c 65 4e 61 6d 65  SettingsFileName
da80: 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5b 67 65 74   [file join [get
da90: 43 6f 6d 6d 6f 6e 44 69 72 65 63 74 6f 72 79 5d  CommonDirectory]
daa0: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
dab0: 20 20 5b 61 70 70 65 6e 64 41 72 67 73 20 73 65    [appendArgs se
dac0: 74 74 69 6e 67 73 20 24 73 75 66 66 69 78 20 2e  ttings $suffix .
dad0: 20 24 3a 3a 74 63 6c 5f 70 6c 61 74 66 6f 72 6d   $::tcl_platform
dae0: 28 75 73 65 72 29 20 2e 65 61 67 6c 65 5d 5d 0d  (user) .eagle]].
daf0: 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20  ...          if 
db00: 7b 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24 75  {[file exists $u
db10: 73 65 72 53 65 74 74 69 6e 67 73 46 69 6c 65 4e  serSettingsFileN
db20: 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ame]} then {..  
db30: 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 24            if {!$
db40: 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20  quiet} then {.. 
db50: 20 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75               tpu
db60: 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70  ts $channel [app
db70: 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
db80: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d               "--
db90: 2d 2d 20 6c 6f 61 64 69 6e 67 20 70 65 72 2d 75  -- loading per-u
dba0: 73 65 72 20 74 65 73 74 20 73 65 74 74 69 6e 67  ser test setting
dbb0: 73 20 66 69 6c 65 20 5c 22 22 20 5c 0d 0a 20 20  s file \"" \..  
dbc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dbd0: 24 75 73 65 72 53 65 74 74 69 6e 67 73 46 69 6c  $userSettingsFil
dbe0: 65 4e 61 6d 65 20 5c 22 2e 2e 2e 5c 6e 5d 0d 0a  eName \"...\n]..
dbf0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d              }...
dc00: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20  .            if 
dc10: 7b 5b 63 61 74 63 68 20 7b 75 70 6c 65 76 65 6c  {[catch {uplevel
dc20: 20 31 20 5b 6c 69 73 74 20 73 6f 75 72 63 65 20   1 [list source 
dc30: 24 75 73 65 72 53 65 74 74 69 6e 67 73 46 69 6c  $userSettingsFil
dc40: 65 4e 61 6d 65 5d 7d 20 5c 0d 0a 20 20 20 20 20  eName]} \..     
dc50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65                 e
dc60: 72 72 6f 72 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  rror]} then {.. 
dc70: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20               if 
dc80: 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b  {!$quiet} then {
dc90: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
dca0: 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
dcb0: 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
dcc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dcd0: 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e      "==== WARNIN
dce0: 47 3a 20 66 61 69 6c 65 64 20 74 6f 20 6c 6f 61  G: failed to loa
dcf0: 64 20 70 65 72 2d 75 73 65 72 20 73 65 74 74 69  d per-user setti
dd00: 6e 67 73 20 66 69 6c 65 20 5c 22 22 20 5c 0d 0a  ngs file \"" \..
dd10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dd20: 20 20 20 20 24 75 73 65 72 53 65 74 74 69 6e 67      $userSetting
dd30: 73 46 69 6c 65 4e 61 6d 65 20 22 5c 22 2c 20 65  sFileName "\", e
dd40: 72 72 6f 72 3a 20 22 20 5c 6e 5c 74 20 24 65 72  rror: " \n\t $er
dd50: 72 6f 72 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20  ror \n]..       
dd60: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
dd70: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
dd80: 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
dd90: 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71           if {!$q
dda0: 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  uiet} then {..  
ddb0: 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
ddc0: 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  s $channel [appe
ddd0: 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
dde0: 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
ddf0: 2d 20 73 6b 69 70 70 65 64 20 6c 6f 61 64 69 6e  - skipped loadin
de00: 67 20 70 65 72 2d 75 73 65 72 20 74 65 73 74 20  g per-user test 
de10: 73 65 74 74 69 6e 67 73 20 66 69 6c 65 20 5c 22  settings file \"
de20: 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  " \..           
de30: 20 20 20 20 20 20 20 24 75 73 65 72 53 65 74 74         $userSett
de40: 69 6e 67 73 46 69 6c 65 4e 61 6d 65 20 22 5c 22  ingsFileName "\"
de50: 2c 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 65 78  , it does not ex
de60: 69 73 74 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20  ist\n"]..       
de70: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
de80: 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a    }..        }..
de90: 0d 0a 20 20 20 20 20 20 20 20 23 23 23 23 23 23  ..        ######
dea0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
deb0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
dec0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
ded0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
dee0: 23 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20  #....        if 
def0: 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  {[info exists ::
df00: 74 63 6c 5f 70 6c 61 74 66 6f 72 6d 28 68 6f 73  tcl_platform(hos
df10: 74 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  t)]} then {..   
df20: 20 20 20 20 20 20 20 73 65 74 20 68 6f 73 74 53         set hostS
df30: 65 74 74 69 6e 67 73 46 69 6c 65 4e 61 6d 65 20  ettingsFileName 
df40: 5b 66 69 6c 65 20 6a 6f 69 6e 20 5b 67 65 74 43  [file join [getC
df50: 6f 6d 6d 6f 6e 44 69 72 65 63 74 6f 72 79 5d 20  ommonDirectory] 
df60: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
df70: 20 5b 61 70 70 65 6e 64 41 72 67 73 20 73 65 74   [appendArgs set
df80: 74 69 6e 67 73 20 24 73 75 66 66 69 78 20 2e 20  tings $suffix . 
df90: 24 3a 3a 74 63 6c 5f 70 6c 61 74 66 6f 72 6d 28  $::tcl_platform(
dfa0: 68 6f 73 74 29 20 2e 65 61 67 6c 65 5d 5d 0d 0a  host) .eagle]]..
dfb0: 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b  ..          if {
dfc0: 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24 68 6f  [file exists $ho
dfd0: 73 74 53 65 74 74 69 6e 67 73 46 69 6c 65 4e 61  stSettingsFileNa
dfe0: 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  me]} then {..   
dff0: 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71           if {!$q
e000: 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  uiet} then {..  
e010: 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
e020: 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  s $channel [appe
e030: 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
e040: 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
e050: 2d 20 6c 6f 61 64 69 6e 67 20 70 65 72 2d 68 6f  - loading per-ho
e060: 73 74 20 74 65 73 74 20 73 65 74 74 69 6e 67 73  st test settings
e070: 20 66 69 6c 65 20 5c 22 22 20 5c 0d 0a 20 20 20   file \"" \..   
e080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 24                 $
e090: 68 6f 73 74 53 65 74 74 69 6e 67 73 46 69 6c 65  hostSettingsFile
e0a0: 4e 61 6d 65 20 5c 22 2e 2e 2e 5c 6e 5d 0d 0a 20  Name \"...\n].. 
e0b0: 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a             }....
e0c0: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b              if {
e0d0: 5b 63 61 74 63 68 20 7b 75 70 6c 65 76 65 6c 20  [catch {uplevel 
e0e0: 31 20 5b 6c 69 73 74 20 73 6f 75 72 63 65 20 24  1 [list source $
e0f0: 68 6f 73 74 53 65 74 74 69 6e 67 73 46 69 6c 65  hostSettingsFile
e100: 4e 61 6d 65 5d 7d 20 5c 0d 0a 20 20 20 20 20 20  Name]} \..      
e110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65 72                er
e120: 72 6f 72 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ror]} then {..  
e130: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b              if {
e140: 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d  !$quiet} then {.
e150: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
e160: 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
e170: 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
e180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e190: 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47     "==== WARNING
e1a0: 3a 20 66 61 69 6c 65 64 20 74 6f 20 6c 6f 61 64  : failed to load
e1b0: 20 70 65 72 2d 68 6f 73 74 20 73 65 74 74 69 6e   per-host settin
e1c0: 67 73 20 66 69 6c 65 20 5c 22 22 20 5c 0d 0a 20  gs file \"" \.. 
e1d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e1e0: 20 20 20 24 68 6f 73 74 53 65 74 74 69 6e 67 73     $hostSettings
e1f0: 46 69 6c 65 4e 61 6d 65 20 22 5c 22 2c 20 65 72  FileName "\", er
e200: 72 6f 72 3a 20 22 20 5c 6e 5c 74 20 24 65 72 72  ror: " \n\t $err
e210: 6f 72 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20  or \n]..        
e220: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
e230: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
e240: 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
e250: 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75          if {!$qu
e260: 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  iet} then {..   
e270: 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
e280: 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e   $channel [appen
e290: 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
e2a0: 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
e2b0: 20 73 6b 69 70 70 65 64 20 6c 6f 61 64 69 6e 67   skipped loading
e2c0: 20 70 65 72 2d 68 6f 73 74 20 74 65 73 74 20 73   per-host test s
e2d0: 65 74 74 69 6e 67 73 20 66 69 6c 65 20 5c 22 22  ettings file \""
e2e0: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
e2f0: 20 20 20 20 20 20 24 68 6f 73 74 53 65 74 74 69        $hostSetti
e300: 6e 67 73 46 69 6c 65 4e 61 6d 65 20 22 5c 22 2c  ngsFileName "\",
e310: 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 65 78 69   it does not exi
e320: 73 74 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20  st\n"]..        
e330: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
e340: 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20   }..        }.. 
e350: 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c       }..    }...
e360: 0d 0a 20 20 20 20 70 72 6f 63 20 72 75 6e 53 51  ..    proc runSQ
e370: 4c 69 74 65 54 65 73 74 50 72 6f 6c 6f 67 75 65  LiteTestPrologue
e380: 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a   {} {..      #..
e390: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 6b        # NOTE: Sk
e3a0: 69 70 20 72 75 6e 6e 69 6e 67 20 6f 75 72 20 63  ip running our c
e3b0: 75 73 74 6f 6d 20 70 72 6f 6c 6f 67 75 65 20 69  ustom prologue i
e3c0: 66 20 74 68 65 20 6d 61 69 6e 20 6f 6e 65 20 68  f the main one h
e3d0: 61 73 20 62 65 65 6e 0d 0a 20 20 20 20 20 20 23  as been..      #
e3e0: 20 20 20 20 20 20 20 73 6b 69 70 70 65 64 2e 0d         skipped..
e3f0: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
e400: 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74  if {![info exist
e410: 73 20 3a 3a 6e 6f 28 70 72 6f 6c 6f 67 75 65 2e  s ::no(prologue.
e420: 65 61 67 6c 65 29 5d 7d 20 74 68 65 6e 20 7b 0d  eagle)]} then {.
e430: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
e440: 20 20 20 20 23 20 4e 4f 54 45 3a 20 4c 6f 61 64      # NOTE: Load
e450: 20 74 68 65 20 22 62 65 66 6f 72 65 2d 63 6f 6e   the "before-con
e460: 73 74 72 61 69 6e 74 73 22 20 63 75 73 74 6f 6d  straints" custom
e470: 20 70 65 72 2d 75 73 65 72 20 61 6e 64 2f 6f 72   per-user and/or
e480: 20 70 65 72 2d 68 6f 73 74 0d 0a 20 20 20 20 20   per-host..     
e490: 20 20 20 23 20 20 20 20 20 20 20 74 65 73 74 20     #       test 
e4a0: 73 65 74 74 69 6e 67 73 20 6e 6f 77 2e 0d 0a 20  settings now... 
e4b0: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
e4c0: 20 20 75 70 6c 65 76 65 6c 20 31 20 5b 6c 69 73    uplevel 1 [lis
e4d0: 74 20 6c 6f 61 64 53 51 4c 69 74 65 54 65 73 74  t loadSQLiteTest
e4e0: 53 65 74 74 69 6e 67 73 20 24 3a 3a 74 65 73 74  Settings $::test
e4f0: 5f 63 68 61 6e 6e 65 6c 20 2e 62 65 66 6f 72 65  _channel .before
e500: 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  ]....        #..
e510: 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
e520: 53 6b 69 70 20 61 6c 6c 20 53 79 73 74 65 6d 2e  Skip all System.
e530: 44 61 74 61 2e 53 51 4c 69 74 65 20 72 65 6c 61  Data.SQLite rela
e540: 74 65 64 20 66 69 6c 65 20 68 61 6e 64 6c 69 6e  ted file handlin
e550: 67 20 28 64 65 6c 65 74 69 6e 67 2c 0d 0a 20 20  g (deleting,..  
e560: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63 6f        #       co
e570: 70 79 69 6e 67 2c 20 61 6e 64 20 6c 6f 61 64 69  pying, and loadi
e580: 6e 67 29 20 69 66 20 77 65 20 61 72 65 20 73 6f  ng) if we are so
e590: 20 69 6e 73 74 72 75 63 74 65 64 2e 0d 0a 20 20   instructed...  
e5a0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
e5b0: 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73   if {![info exis
e5c0: 74 73 20 3a 3a 6e 6f 28 73 71 6c 69 74 65 46 69  ts ::no(sqliteFi
e5d0: 6c 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  les)]} then {.. 
e5e0: 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
e5f0: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 6b        # NOTE: Sk
e600: 69 70 20 74 72 79 69 6e 67 20 74 6f 20 64 65 6c  ip trying to del
e610: 65 74 65 20 61 6e 79 20 66 69 6c 65 73 20 69 66  ete any files if
e620: 20 77 65 20 61 72 65 20 73 6f 20 69 6e 73 74 72   we are so instr
e630: 75 63 74 65 64 2e 0d 0a 20 20 20 20 20 20 20 20  ucted...        
e640: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 69    #..          i
e650: 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73  f {![info exists
e660: 20 3a 3a 6e 6f 28 64 65 6c 65 74 65 53 71 6c 69   ::no(deleteSqli
e670: 74 65 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e 20  teFiles)]} then 
e680: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  {..            t
e690: 72 79 44 65 6c 65 74 65 41 73 73 65 6d 62 6c 79  ryDeleteAssembly
e6a0: 20 73 71 6c 69 74 65 33 2e 64 6c 6c 0d 0a 20 20   sqlite3.dll..  
e6b0: 20 20 20 20 20 20 20 20 20 20 72 65 6d 6f 76 65            remove
e6c0: 43 6f 6e 73 74 72 61 69 6e 74 20 66 69 6c 65 5f  Constraint file_
e6d0: 73 71 6c 69 74 65 33 2e 64 6c 6c 0d 0a 0d 0a 20  sqlite3.dll.... 
e6e0: 20 20 20 20 20 20 20 20 20 20 20 74 72 79 44 65             tryDe
e6f0: 6c 65 74 65 41 73 73 65 6d 62 6c 79 20 53 51 4c  leteAssembly SQL
e700: 69 74 65 2e 49 6e 74 65 72 6f 70 2e 64 6c 6c 0d  ite.Interop.dll.
e710: 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 6d  .            rem
e720: 6f 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 66 69  oveConstraint fi
e730: 6c 65 5f 53 51 4c 69 74 65 2e 49 6e 74 65 72 6f  le_SQLite.Intero
e740: 70 2e 64 6c 6c 0d 0a 0d 0a 20 20 20 20 20 20 20  p.dll....       
e750: 20 20 20 20 20 74 72 79 44 65 6c 65 74 65 41 73       tryDeleteAs
e760: 73 65 6d 62 6c 79 20 53 79 73 74 65 6d 2e 44 61  sembly System.Da
e770: 74 61 2e 53 51 4c 69 74 65 2e 64 6c 6c 0d 0a 20  ta.SQLite.dll.. 
e780: 20 20 20 20 20 20 20 20 20 20 20 72 65 6d 6f 76             remov
e790: 65 43 6f 6e 73 74 72 61 69 6e 74 20 66 69 6c 65  eConstraint file
e7a0: 5f 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c  _System.Data.SQL
e7b0: 69 74 65 2e 64 6c 6c 0d 0a 0d 0a 20 20 20 20 20  ite.dll....     
e7c0: 20 20 20 20 20 20 20 74 72 79 44 65 6c 65 74 65         tryDelete
e7d0: 41 73 73 65 6d 62 6c 79 20 53 79 73 74 65 6d 2e  Assembly System.
e7e0: 44 61 74 61 2e 53 51 4c 69 74 65 2e 4c 69 6e 71  Data.SQLite.Linq
e7f0: 2e 64 6c 6c 0d 0a 20 20 20 20 20 20 20 20 20 20  .dll..          
e800: 20 20 72 65 6d 6f 76 65 43 6f 6e 73 74 72 61 69    removeConstrai
e810: 6e 74 20 66 69 6c 65 5f 53 79 73 74 65 6d 2e 44  nt file_System.D
e820: 61 74 61 2e 53 51 4c 69 74 65 2e 4c 69 6e 71 2e  ata.SQLite.Linq.
e830: 64 6c 6c 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  dll..          }
e840: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d  ....          #.
e850: 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54  .          # NOT
e860: 45 3a 20 53 6b 69 70 20 74 72 79 69 6e 67 20 74  E: Skip trying t
e870: 6f 20 63 6f 70 79 20 61 6e 79 20 66 69 6c 65 73  o copy any files
e880: 20 69 66 20 77 65 20 61 72 65 20 73 6f 20 69 6e   if we are so in
e890: 73 74 72 75 63 74 65 64 2e 0d 0a 20 20 20 20 20  structed...     
e8a0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
e8b0: 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69    if {![info exi
e8c0: 73 74 73 20 3a 3a 6e 6f 28 63 6f 70 79 53 71 6c  sts ::no(copySql
e8d0: 69 74 65 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e  iteFiles)]} then
e8e0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
e8f0: 74 72 79 43 6f 70 79 41 73 73 65 6d 62 6c 79 20  tryCopyAssembly 
e900: 73 71 6c 69 74 65 33 2e 64 6c 6c 0d 0a 20 20 20  sqlite3.dll..   
e910: 20 20 20 20 20 20 20 20 20 74 72 79 43 6f 70 79           tryCopy
e920: 41 73 73 65 6d 62 6c 79 20 53 51 4c 69 74 65 2e  Assembly SQLite.
e930: 49 6e 74 65 72 6f 70 2e 64 6c 6c 0d 0a 20 20 20  Interop.dll..   
e940: 20 20 20 20 20 20 20 20 20 74 72 79 43 6f 70 79           tryCopy
e950: 41 73 73 65 6d 62 6c 79 20 53 79 73 74 65 6d 2e  Assembly System.
e960: 44 61 74 61 2e 53 51 4c 69 74 65 2e 64 6c 6c 0d  Data.SQLite.dll.
e970: 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 72 79  .            try
e980: 43 6f 70 79 41 73 73 65 6d 62 6c 79 20 53 79 73  CopyAssembly Sys
e990: 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e  tem.Data.SQLite.
e9a0: 4c 69 6e 71 2e 64 6c 6c 0d 0a 20 20 20 20 20 20  Linq.dll..      
e9b0: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
e9c0: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
e9d0: 23 20 4e 4f 54 45 3a 20 53 6b 69 70 20 74 72 79  # NOTE: Skip try
e9e0: 69 6e 67 20 74 6f 20 6c 6f 61 64 20 61 6e 79 20  ing to load any 
e9f0: 66 69 6c 65 73 20 69 66 20 77 65 20 61 72 65 20  files if we are 
ea00: 73 6f 20 69 6e 73 74 72 75 63 74 65 64 2e 0d 0a  so instructed...
ea10: 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
ea20: 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66         if {![inf
ea30: 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 6c 6f  o exists ::no(lo
ea40: 61 64 53 71 6c 69 74 65 46 69 6c 65 73 29 5d 7d  adSqliteFiles)]}
ea50: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
ea60: 20 20 20 20 20 74 72 79 4c 6f 61 64 41 73 73 65       tryLoadAsse
ea70: 6d 62 6c 79 20 53 79 73 74 65 6d 2e 44 61 74 61  mbly System.Data
ea80: 2e 53 51 4c 69 74 65 2e 64 6c 6c 0d 0a 20 20 20  .SQLite.dll..   
ea90: 20 20 20 20 20 20 20 20 20 74 72 79 4c 6f 61 64           tryLoad
eaa0: 41 73 73 65 6d 62 6c 79 20 53 79 73 74 65 6d 2e  Assembly System.
eab0: 44 61 74 61 2e 53 51 4c 69 74 65 2e 4c 69 6e 71  Data.SQLite.Linq
eac0: 2e 64 6c 6c 0d 0a 20 20 20 20 20 20 20 20 20 20  .dll..          
ead0: 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  }..        }....
eae0: 20 20 20 20 20 20 20 20 63 61 74 63 68 20 7b 0d          catch {.
eaf0: 0a 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73  .          tputs
eb00: 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
eb10: 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
eb20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d                "-
eb30: 2d 2d 2d 20 66 69 6c 65 20 76 65 72 73 69 6f 6e  --- file version
eb40: 20 6f 66 20 5c 22 73 71 6c 69 74 65 33 2e 64 6c   of \"sqlite3.dl
eb50: 6c 5c 22 2e 2e 2e 20 22 20 5c 0d 0a 20 20 20 20  l\"... " \..    
eb60: 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20            [file 
eb70: 76 65 72 73 69 6f 6e 20 5b 67 65 74 42 69 6e 61  version [getBina
eb80: 72 79 46 69 6c 65 4e 61 6d 65 20 73 71 6c 69 74  ryFileName sqlit
eb90: 65 33 2e 64 6c 6c 5d 5d 20 5c 6e 5d 0d 0a 20 20  e3.dll]] \n]..  
eba0: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
ebb0: 20 20 20 63 61 74 63 68 20 7b 0d 0a 20 20 20 20     catch {..    
ebc0: 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
ebd0: 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70  est_channel [app
ebe0: 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
ebf0: 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 66           "---- f
ec00: 69 6c 65 20 76 65 72 73 69 6f 6e 20 6f 66 20 5c  ile version of \
ec10: 22 53 51 4c 69 74 65 2e 49 6e 74 65 72 6f 70 2e  "SQLite.Interop.
ec20: 64 6c 6c 5c 22 2e 2e 2e 20 22 20 5c 0d 0a 20 20  dll\"... " \..  
ec30: 20 20 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c              [fil
ec40: 65 20 76 65 72 73 69 6f 6e 20 5b 67 65 74 42 69  e version [getBi
ec50: 6e 61 72 79 46 69 6c 65 4e 61 6d 65 20 53 51 4c  naryFileName SQL
ec60: 69 74 65 2e 49 6e 74 65 72 6f 70 2e 64 6c 6c 5d  ite.Interop.dll]
ec70: 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 7d  ] \n]..        }
ec80: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 63 61 74 63  ....        catc
ec90: 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74  h {..          t
eca0: 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
ecb0: 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
ecc0: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
ecd0: 20 20 22 2d 2d 2d 2d 20 66 69 6c 65 20 76 65 72    "---- file ver
ece0: 73 69 6f 6e 20 6f 66 20 5c 22 53 79 73 74 65 6d  sion of \"System
ecf0: 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 64 6c 6c  .Data.SQLite.dll
ed00: 5c 22 2e 2e 2e 20 22 20 5c 0d 0a 20 20 20 20 20  \"... " \..     
ed10: 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20 76           [file v
ed20: 65 72 73 69 6f 6e 20 5b 67 65 74 42 69 6e 61 72  ersion [getBinar
ed30: 79 46 69 6c 65 4e 61 6d 65 20 53 79 73 74 65 6d  yFileName System
ed40: 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 64 6c 6c  .Data.SQLite.dll
ed50: 5d 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20  ]] \n]..        
ed60: 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 63 61 74  }....        cat
ed70: 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  ch {..          
ed80: 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
ed90: 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
eda0: 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
edb0: 20 20 20 22 2d 2d 2d 2d 20 66 69 6c 65 20 76 65     "---- file ve
edc0: 72 73 69 6f 6e 20 6f 66 20 5c 22 53 79 73 74 65  rsion of \"Syste
edd0: 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 4c 69  m.Data.SQLite.Li
ede0: 6e 71 2e 64 6c 6c 5c 22 2e 2e 2e 20 22 20 5c 0d  nq.dll\"... " \.
edf0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b  .              [
ee00: 66 69 6c 65 20 76 65 72 73 69 6f 6e 20 5b 67 65  file version [ge
ee10: 74 42 69 6e 61 72 79 46 69 6c 65 4e 61 6d 65 20  tBinaryFileName 
ee20: 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
ee30: 74 65 2e 4c 69 6e 71 2e 64 6c 6c 5d 5d 20 5c 6e  te.Linq.dll]] \n
ee40: 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  ]..        }....
ee50: 20 20 20 20 20 20 20 20 73 65 74 20 61 73 73 65          set asse
ee60: 6d 62 6c 69 65 73 20 5b 6f 62 6a 65 63 74 20 69  mblies [object i
ee70: 6e 76 6f 6b 65 20 41 70 70 44 6f 6d 61 69 6e 2e  nvoke AppDomain.
ee80: 43 75 72 72 65 6e 74 44 6f 6d 61 69 6e 20 47 65  CurrentDomain Ge
ee90: 74 41 73 73 65 6d 62 6c 69 65 73 5d 0d 0a 0d 0a  tAssemblies]....
eea0: 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20 66          object f
eeb0: 6f 72 65 61 63 68 20 61 73 73 65 6d 62 6c 79 20  oreach assembly 
eec0: 24 61 73 73 65 6d 62 6c 69 65 73 20 7b 0d 0a 20  $assemblies {.. 
eed0: 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73 74           if {[st
eee0: 72 69 6e 67 20 6d 61 74 63 68 20 5c 7b 53 79 73  ring match \{Sys
eef0: 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2a  tem.Data.SQLite*
ef00: 20 24 61 73 73 65 6d 62 6c 79 5d 7d 20 74 68 65   $assembly]} the
ef10: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
ef20: 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
ef30: 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
ef40: 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
ef50: 20 20 20 20 20 20 22 2d 2d 2d 2d 20 66 6f 75 6e        "---- foun
ef60: 64 20 61 73 73 65 6d 62 6c 79 3a 20 22 20 24 61  d assembly: " $a
ef70: 73 73 65 6d 62 6c 79 20 5c 6e 5d 0d 0a 20 20 20  ssembly \n]..   
ef80: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
ef90: 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 63    }....        c
efa0: 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20  atch {..        
efb0: 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
efc0: 63 68 61 6e 6e 65 6c 20 5c 0d 0a 20 20 20 20 20  channel \..     
efd0: 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 64           "---- d
efe0: 65 66 69 6e 65 20 63 6f 6e 73 74 61 6e 74 73 20  efine constants 
eff0: 66 6f 72 20 5c 22 53 79 73 74 65 6d 2e 44 61 74  for \"System.Dat
f000: 61 2e 53 51 4c 69 74 65 5c 22 2e 2e 2e 20 22 0d  a.SQLite\"... ".
f010: 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20  ...          if 
f020: 7b 5b 63 61 74 63 68 20 7b 6f 62 6a 65 63 74 20  {[catch {object 
f030: 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e  invoke -flags +N
f040: 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20  onPublic \..    
f050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 79                Sy
f060: 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
f070: 2e 53 51 4c 69 74 65 33 20 44 65 66 69 6e 65 43  .SQLite3 DefineC
f080: 6f 6e 73 74 61 6e 74 73 7d 20 5c 0d 0a 20 20 20  onstants} \..   
f090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64                 d
f0a0: 65 66 69 6e 65 43 6f 6e 73 74 61 6e 74 73 5d 20  efineConstants] 
f0b0: 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  == 0} then {..  
f0c0: 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
f0d0: 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
f0e0: 5b 61 70 70 65 6e 64 41 72 67 73 20 5b 66 6f 72  [appendArgs [for
f0f0: 6d 61 74 4c 69 73 74 20 5b 6c 73 6f 72 74 20 5c  matList [lsort \
f100: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
f110: 20 20 24 64 65 66 69 6e 65 43 6f 6e 73 74 61 6e    $defineConstan
f120: 74 73 5d 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20 20  ts]] \n]..      
f130: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
f140: 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
f150: 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
f160: 75 6e 6b 6e 6f 77 6e 5c 6e 0d 0a 20 20 20 20 20  unknown\n..     
f170: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
f180: 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  }....        #..
f190: 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
f1a0: 4e 6f 77 2c 20 77 65 20 6e 65 65 64 20 74 6f 20  Now, we need to 
f1b0: 6b 6e 6f 77 20 69 66 20 74 68 65 20 53 51 4c 69  know if the SQLi
f1c0: 74 65 20 63 6f 72 65 20 6c 69 62 72 61 72 79 20  te core library 
f1d0: 69 73 20 61 76 61 69 6c 61 62 6c 65 0d 0a 20 20  is available..  
f1e0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 28 69        #       (i
f1f0: 2e 65 2e 20 62 65 63 61 75 73 65 20 74 68 65 20  .e. because the 
f200: 6d 61 6e 61 67 65 64 2d 6f 6e 6c 79 20 53 79 73  managed-only Sys
f210: 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 20  tem.Data.SQLite 
f220: 61 73 73 65 6d 62 6c 79 20 63 61 6e 0d 0a 20 20  assembly can..  
f230: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 6c 6f        #       lo
f240: 61 64 20 77 69 74 68 6f 75 74 20 69 74 3b 20 68  ad without it; h
f250: 6f 77 65 76 65 72 2c 20 69 74 20 63 61 6e 6e 6f  owever, it canno
f260: 74 20 64 6f 20 61 6e 79 74 68 69 6e 67 20 75 73  t do anything us
f270: 65 66 75 6c 20 77 69 74 68 6f 75 74 0d 0a 20 20  eful without..  
f280: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 69 74        #       it
f290: 29 2e 20 20 49 66 20 77 65 20 61 72 65 20 75 73  ).  If we are us
f2a0: 69 6e 67 20 74 68 65 20 6d 69 78 65 64 2d 6d 6f  ing the mixed-mo
f2b0: 64 65 20 61 73 73 65 6d 62 6c 79 20 61 6e 64 20  de assembly and 
f2c0: 77 65 20 61 6c 72 65 61 64 79 0d 0a 20 20 20 20  we already..    
f2d0: 20 20 20 20 23 20 20 20 20 20 20 20 66 6f 75 6e      #       foun
f2e0: 64 20 69 74 20 28 61 62 6f 76 65 29 2c 20 74 68  d it (above), th
f2f0: 69 73 20 73 68 6f 75 6c 64 20 61 6c 77 61 79 73  is should always
f300: 20 73 75 63 63 65 65 64 2e 0d 0a 20 20 20 20 20   succeed...     
f310: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 63 68     #..        ch
f320: 65 63 6b 46 6f 72 53 51 4c 69 74 65 20 24 3a 3a  eckForSQLite $::
f330: 74 65 73 74 5f 63 68 61 6e 6e 65 6c 0d 0a 0d 0a  test_channel....
f340: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
f350: 20 20 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b     # NOTE: Check
f360: 20 74 68 65 20 53 51 4c 69 74 65 20 64 61 74 61   the SQLite data
f370: 62 61 73 65 20 61 6e 64 20 74 65 6d 70 6f 72 61  base and tempora
f380: 72 79 20 64 69 72 65 63 74 6f 72 69 65 73 2e 0d  ry directories..
f390: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
f3a0: 20 20 20 20 63 68 65 63 6b 46 6f 72 53 51 4c 69      checkForSQLi
f3b0: 74 65 44 69 72 65 63 74 6f 72 69 65 73 20 24 3a  teDirectories $:
f3c0: 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 0d 0a 0d  :test_channel...
f3d0: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
f3e0: 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 74 74 65      # NOTE: Atte
f3f0: 6d 70 74 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  mpt to determine
f400: 20 69 66 20 76 61 72 69 6f 75 73 20 63 6f 6d 70   if various comp
f410: 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 73  ile-time options
f420: 20 6e 65 65 64 65 64 20 66 6f 72 0d 0a 20 20 20   needed for..   
f430: 20 20 20 20 20 23 20 20 20 20 20 20 20 74 65 73       #       tes
f440: 74 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 77 65  t constraints we
f450: 72 65 20 65 6e 61 62 6c 65 64 20 66 6f 72 20 74  re enabled for t
f460: 68 65 20 6d 61 6e 61 67 65 64 20 61 73 73 65 6d  he managed assem
f470: 62 6c 79 2e 20 20 54 68 65 72 65 0d 0a 20 20 20  bly.  There..   
f480: 20 20 20 20 20 23 20 20 20 20 20 20 20 61 72 65       #       are
f490: 20 73 6f 6d 65 20 63 6f 6d 70 69 6c 65 2d 74 69   some compile-ti
f4a0: 6d 65 20 6f 70 74 69 6f 6e 73 20 74 68 61 74 20  me options that 
f4b0: 6d 75 73 74 20 61 6c 73 6f 20 68 61 76 65 20 62  must also have b
f4c0: 65 65 6e 20 65 6e 61 62 6c 65 64 0d 0a 20 20 20  een enabled..   
f4d0: 20 20 20 20 20 23 20 20 20 20 20 20 20 66 6f 72       #       for
f4e0: 20 74 68 65 20 69 6e 74 65 72 6f 70 20 61 73 73   the interop ass
f4f0: 65 6d 62 6c 79 20 69 6e 20 6f 72 64 65 72 20 74  embly in order t
f500: 6f 20 62 65 20 65 66 66 65 63 74 69 76 65 2e 20  o be effective. 
f510: 20 46 6f 72 20 74 68 6f 73 65 0d 0a 20 20 20 20   For those..    
f520: 20 20 20 20 23 20 20 20 20 20 20 20 6f 70 74 69      #       opti
f530: 6f 6e 73 2c 20 69 74 20 77 69 6c 6c 20 62 65 20  ons, it will be 
f540: 61 73 73 75 6d 65 64 20 74 68 61 74 20 69 74 20  assumed that it 
f550: 77 61 73 20 65 6e 61 62 6c 65 64 20 66 6f 72 20  was enabled for 
f560: 74 68 65 20 69 6e 74 65 72 6f 70 0d 0a 20 20 20  the interop..   
f570: 20 20 20 20 20 23 20 20 20 20 20 20 20 61 73 73       #       ass
f580: 65 6d 62 6c 79 20 69 66 20 69 74 20 77 61 73 20  embly if it was 
f590: 65 6e 61 62 6c 65 64 20 66 6f 72 20 74 68 65 20  enabled for the 
f5a0: 6d 61 6e 61 67 65 64 20 61 73 73 65 6d 62 6c 79  managed assembly
f5b0: 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
f5c0: 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 64 65        foreach de
f5d0: 66 69 6e 65 43 6f 6e 73 74 61 6e 74 20 5b 6c 69  fineConstant [li
f5e0: 73 74 20 43 48 45 43 4b 5f 53 54 41 54 45 20 43  st CHECK_STATE C
f5f0: 4f 55 4e 54 5f 48 41 4e 44 4c 45 20 49 4e 54 45  OUNT_HANDLE INTE
f600: 52 4f 50 5f 43 4f 44 45 43 20 5c 0d 0a 20 20 20  ROP_CODEC \..   
f610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f630: 20 20 49 4e 54 45 52 4f 50 5f 44 45 42 55 47 20    INTEROP_DEBUG 
f640: 49 4e 54 45 52 4f 50 5f 4c 4f 47 20 5c 0d 0a 20  INTEROP_LOG \.. 
f650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f670: 20 20 20 20 49 4e 54 45 52 4f 50 5f 45 58 54 45      INTEROP_EXTE
f680: 4e 53 49 4f 4e 5f 46 55 4e 43 54 49 4f 4e 53 20  NSION_FUNCTIONS 
f690: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
f6a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f6b0: 20 20 20 20 20 20 20 20 49 4e 54 45 52 4f 50 5f          INTEROP_
f6c0: 54 45 53 54 5f 45 58 54 45 4e 53 49 4f 4e 20 53  TEST_EXTENSION S
f6d0: 51 4c 49 54 45 5f 53 54 41 4e 44 41 52 44 20 5c  QLITE_STANDARD \
f6e0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
f6f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f700: 20 20 20 20 20 20 20 55 53 45 5f 49 4e 54 45 52         USE_INTER
f710: 4f 50 5f 44 4c 4c 5d 20 7b 0d 0a 20 20 20 20 20  OP_DLL] {..     
f720: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
f730: 20 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20    # NOTE: Check 
f740: 69 66 20 74 68 65 20 63 6f 6d 70 69 6c 65 2d 74  if the compile-t
f750: 69 6d 65 20 6f 70 74 69 6f 6e 20 69 73 20 6c 69  ime option is li
f760: 73 74 65 64 20 69 6e 20 74 68 65 20 6c 69 73 74  sted in the list
f770: 20 6f 66 0d 0a 20 20 20 20 20 20 20 20 20 20 23   of..          #
f780: 20 20 20 20 20 20 20 22 64 65 66 69 6e 65 20 63         "define c
f790: 6f 6e 73 74 61 6e 74 73 22 20 6b 65 70 74 20 74  onstants" kept t
f7a0: 72 61 63 6b 20 6f 66 20 62 79 20 74 68 65 20 6d  rack of by the m
f7b0: 61 6e 61 67 65 64 20 61 73 73 65 6d 62 6c 79 2e  anaged assembly.
f7c0: 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20  ..          #.. 
f7d0: 20 20 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f           checkFo
f7e0: 72 53 51 4c 69 74 65 44 65 66 69 6e 65 43 6f 6e  rSQLiteDefineCon
f7f0: 73 74 61 6e 74 20 24 3a 3a 74 65 73 74 5f 63 68  stant $::test_ch
f800: 61 6e 6e 65 6c 20 24 64 65 66 69 6e 65 43 6f 6e  annel $defineCon
f810: 73 74 61 6e 74 0d 0a 20 20 20 20 20 20 20 20 7d  stant..        }
f820: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  ....        #.. 
f830: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43         # NOTE: C
f840: 68 65 63 6b 20 74 68 65 20 63 75 72 72 65 6e 74  heck the current
f850: 20 62 75 69 6c 64 20 79 65 61 72 2e 20 20 42 61   build year.  Ba
f860: 73 69 63 61 6c 6c 79 2c 20 74 68 69 73 20 69 6e  sically, this in
f870: 64 69 63 61 74 65 73 0d 0a 20 20 20 20 20 20 20  dicates..       
f880: 20 23 20 20 20 20 20 20 20 77 68 69 63 68 20 76   #       which v
f890: 65 72 73 69 6f 6e 20 6f 66 20 4d 53 42 75 69 6c  ersion of MSBuil
f8a0: 64 20 61 6e 64 2f 6f 72 20 56 69 73 75 61 6c 20  d and/or Visual 
f8b0: 53 74 75 64 69 6f 20 77 61 73 20 75 73 65 64 20  Studio was used 
f8c0: 74 6f 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  to..        #   
f8d0: 20 20 20 20 63 6f 6d 70 69 6c 65 20 74 68 65 20      compile the 
f8e0: 61 73 73 65 6d 62 6c 79 20 62 69 6e 61 72 69 65  assembly binarie
f8f0: 73 20 75 6e 64 65 72 20 74 65 73 74 2e 0d 0a 20  s under test... 
f900: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
f910: 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
f920: 63 68 61 6e 6e 65 6c 20 5c 0d 0a 20 20 20 20 20  channel \..     
f930: 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 68 65         "---- che
f940: 63 6b 69 6e 67 20 66 6f 72 20 53 79 73 74 65 6d  cking for System
f950: 2e 44 61 74 61 2e 53 51 4c 69 74 65 20 62 75 69  .Data.SQLite bui
f960: 6c 64 20 79 65 61 72 2e 2e 2e 20 22 0d 0a 0d 0a  ld year... "....
f970: 20 20 20 20 20 20 20 20 73 65 74 20 79 65 61 72          set year
f980: 20 5b 67 65 74 42 75 69 6c 64 59 65 61 72 5d 0d   [getBuildYear].
f990: 0a 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73  .        addCons
f9a0: 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72  traint [appendAr
f9b0: 67 73 20 62 75 69 6c 64 59 65 61 72 20 24 79 65  gs buildYear $ye
f9c0: 61 72 5d 0d 0a 20 20 20 20 20 20 20 20 74 70 75  ar]..        tpu
f9d0: 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
f9e0: 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
f9f0: 22 20 24 79 65 61 72 20 5c 22 5c 6e 5d 0d 0a 0d  " $year \"\n]...
fa00: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
fa10: 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68 65 63      # NOTE: Chec
fa20: 6b 20 74 68 65 20 63 75 72 72 65 6e 74 20 62 75  k the current bu
fa30: 69 6c 64 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  ild configuratio
fa40: 6e 2e 20 20 54 68 69 73 20 73 68 6f 75 6c 64 20  n.  This should 
fa50: 6e 6f 72 6d 61 6c 6c 79 0d 0a 20 20 20 20 20 20  normally..      
fa60: 20 20 23 20 20 20 20 20 20 20 62 65 20 65 69 74    #       be eit
fa70: 68 65 72 20 22 44 65 62 75 67 22 20 6f 72 20 22  her "Debug" or "
fa80: 52 65 6c 65 61 73 65 22 2e 0d 0a 20 20 20 20 20  Release"...     
fa90: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 74 70     #..        tp
faa0: 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  uts $::test_chan
fab0: 6e 65 6c 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  nel \..         
fac0: 20 20 20 22 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e     "---- checkin
fad0: 67 20 66 6f 72 20 53 79 73 74 65 6d 2e 44 61 74  g for System.Dat
fae0: 61 2e 53 51 4c 69 74 65 20 62 75 69 6c 64 20 63  a.SQLite build c
faf0: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e 2e 2e 20  onfiguration... 
fb00: 22 0d 0a 0d 0a 20 20 20 20 20 20 20 20 73 65 74  "....        set
fb10: 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 5b   configuration [
fb20: 67 65 74 42 75 69 6c 64 43 6f 6e 66 69 67 75 72  getBuildConfigur
fb30: 61 74 69 6f 6e 5d 0d 0a 20 20 20 20 20 20 20 20  ation]..        
fb40: 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61  addConstraint [a
fb50: 70 70 65 6e 64 41 72 67 73 20 62 75 69 6c 64 43  ppendArgs buildC
fb60: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 24 63 6f  onfiguration $co
fb70: 6e 66 69 67 75 72 61 74 69 6f 6e 5d 0d 0a 20 20  nfiguration]..  
fb80: 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
fb90: 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70  est_channel [app
fba0: 65 6e 64 41 72 67 73 20 5c 22 20 24 63 6f 6e 66  endArgs \" $conf
fbb0: 69 67 75 72 61 74 69 6f 6e 20 5c 22 5c 6e 5d 0d  iguration \"\n].
fbc0: 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
fbd0: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 72        # NOTE: Tr
fbe0: 79 20 74 6f 20 73 65 74 75 70 20 61 6e 20 69 6e  y to setup an in
fbf0: 74 65 72 72 75 70 74 20 63 61 6c 6c 62 61 63 6b  terrupt callback
fc00: 20 75 73 69 6e 67 20 74 68 65 20 73 63 72 69 70   using the scrip
fc10: 74 20 64 65 62 75 67 67 65 72 0d 0a 20 20 20 20  t debugger..    
fc20: 20 20 20 20 23 20 20 20 20 20 20 20 74 68 61 74      #       that
fc30: 20 77 69 6c 6c 20 63 61 6e 63 65 6c 20 61 6c 6c   will cancel all
fc40: 20 53 51 4c 20 71 75 65 72 69 65 73 20 69 6e 20   SQL queries in 
fc50: 70 72 6f 67 72 65 73 73 20 66 6f 72 20 61 6c 6c  progress for all
fc60: 20 64 61 74 61 62 61 73 65 0d 0a 20 20 20 20 20   database..     
fc70: 20 20 20 23 20 20 20 20 20 20 20 63 6f 6e 6e 65     #       conne
fc80: 63 74 69 6f 6e 73 20 6b 6e 6f 77 6e 20 74 6f 20  ctions known to 
fc90: 74 68 69 73 20 69 6e 74 65 72 70 72 65 74 65 72  this interpreter
fca0: 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
fcb0: 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f        if {![info
fcc0: 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 73 71 6c   exists ::no(sql
fcd0: 69 74 65 49 6e 74 65 72 72 75 70 74 43 61 6c 6c  iteInterruptCall
fce0: 62 61 63 6b 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a  back)]} then {..
fcf0: 20 20 20 20 20 20 20 20 20 20 73 65 74 75 70 44            setupD
fd00: 62 49 6e 74 65 72 72 75 70 74 43 61 6c 6c 62 61  bInterruptCallba
fd10: 63 6b 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ck $::test_chann
fd20: 65 6c 20 24 3a 3a 74 65 73 74 5f 6c 6f 67 0d 0a  el $::test_log..
fd30: 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
fd40: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
fd50: 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 66 6f  # NOTE: Check fo
fd60: 72 20 74 68 65 20 6e 61 74 69 76 65 20 72 75 6e  r the native run
fd70: 74 69 6d 65 20 6f 70 74 69 6f 6e 2c 20 77 68 69  time option, whi
fd80: 63 68 20 77 6f 75 6c 64 20 6d 65 61 6e 20 77 65  ch would mean we
fd90: 20 61 72 65 0d 0a 20 20 20 20 20 20 20 20 23 20   are..        # 
fda0: 20 20 20 20 20 20 75 73 69 6e 67 20 74 68 65 20        using the 
fdb0: 6d 69 78 65 64 2d 6d 6f 64 65 20 61 73 73 65 6d  mixed-mode assem
fdc0: 62 6c 79 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  bly...        #.
fdd0: 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f  .        checkFo
fde0: 72 52 75 6e 74 69 6d 65 4f 70 74 69 6f 6e 20 24  rRuntimeOption $
fdf0: 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 6e  ::test_channel n
fe00: 61 74 69 76 65 0d 0a 0d 0a 20 20 20 20 20 20 20  ative....       
fe10: 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
fe20: 54 45 3a 20 43 68 65 63 6b 20 69 66 20 74 68 65  TE: Check if the
fe30: 20 74 65 73 74 20 73 75 69 74 65 20 73 68 6f 75   test suite shou
fe40: 6c 64 20 63 6f 75 6e 74 20 74 68 65 20 6e 75 6d  ld count the num
fe50: 62 65 72 20 6f 66 20 63 6f 6e 6e 65 63 74 69 6f  ber of connectio
fe60: 6e 73 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  ns..        #   
fe70: 20 20 20 20 22 6f 70 65 6e 65 64 22 20 61 6e 64      "opened" and
fe80: 20 22 63 6c 6f 73 65 64 22 20 66 72 6f 6d 20 74   "closed" from t
fe90: 68 65 20 70 6f 6f 6c 20 77 68 65 6e 20 64 65 74  he pool when det
fea0: 65 72 6d 69 6e 69 6e 67 20 69 66 20 61 20 74 65  ermining if a te
feb0: 73 74 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  st..        #   
fec0: 20 20 20 20 70 61 73 73 65 64 2e 20 20 44 69 73      passed.  Dis
fed0: 61 62 6c 69 6e 67 20 74 68 69 73 20 62 65 68 61  abling this beha
fee0: 76 69 6f 72 20 69 73 20 73 6f 6d 65 74 69 6d 65  vior is sometime
fef0: 73 20 6e 65 63 65 73 73 61 72 79 20 28 65 2e 67  s necessary (e.g
ff00: 2e 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  ...        #    
ff10: 20 20 20 64 75 72 69 6e 67 20 74 68 65 20 72 65     during the re
ff20: 6c 65 61 73 65 20 74 65 73 74 69 6e 67 20 70 72  lease testing pr
ff30: 6f 63 65 73 73 29 20 62 65 63 61 75 73 65 20 74  ocess) because t
ff40: 68 65 72 65 20 61 72 65 20 73 65 76 65 72 61 6c  here are several
ff50: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
ff60: 20 20 74 65 73 74 73 20 74 68 61 74 20 72 65 6c    tests that rel
ff70: 79 20 6f 6e 20 74 68 65 20 22 6f 70 65 6e 65 64  y on the "opened
ff80: 20 66 72 6f 6d 20 70 6f 6f 6c 22 20 63 6f 75 6e   from pool" coun
ff90: 74 20 62 65 69 6e 67 20 67 72 65 61 74 65 72 0d  t being greater.
ffa0: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
ffb0: 20 74 68 61 6e 20 7a 65 72 6f 2e 20 20 54 68 65   than zero.  The
ffc0: 73 65 20 74 65 73 74 73 20 6d 61 79 20 66 61 69  se tests may fai
ffd0: 6c 20 64 75 65 20 74 6f 20 74 68 65 20 6e 6f 6e  l due to the non
ffe0: 2d 64 65 74 65 72 6d 69 6e 69 73 74 69 63 0d 0a  -deterministic..
fff0: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
10000 62 65 68 61 76 69 6f 72 20 6f 66 20 74 68 65 20  behavior of the 
10010 43 4c 52 20 47 43 2c 20 65 76 65 6e 20 77 68 65  CLR GC, even whe
10020 6e 20 74 68 65 72 65 20 69 73 20 6e 6f 20 62 75  n there is no bu
10030 67 20 69 6e 20 74 68 65 20 63 6f 64 65 0d 0a 20  g in the code.. 
10040 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 62         #       b
10050 65 69 6e 67 20 74 65 73 74 65 64 2e 0d 0a 20 20  eing tested...  
10060 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
10070 20 63 68 65 63 6b 46 6f 72 52 75 6e 74 69 6d 65   checkForRuntime
10080 4f 70 74 69 6f 6e 20 24 3a 3a 74 65 73 74 5f 63  Option $::test_c
10090 68 61 6e 6e 65 6c 20 6e 6f 50 6f 6f 6c 43 6f 75  hannel noPoolCou
100a0 6e 74 73 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23  nts....        #
100b0 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
100c0 3a 20 52 65 70 6f 72 74 20 74 68 65 20 72 65 73  : Report the res
100d0 6f 75 72 63 65 20 75 73 61 67 65 20 70 72 69 6f  ource usage prio
100e0 72 20 74 6f 20 72 75 6e 6e 69 6e 67 20 61 6e 79  r to running any
100f0 20 74 65 73 74 73 2e 0d 0a 20 20 20 20 20 20 20   tests...       
10100 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 70 6f   #..        repo
10110 72 74 53 51 4c 69 74 65 52 65 73 6f 75 72 63 65  rtSQLiteResource
10120 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
10130 6c 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  l....        #..
10140 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
10150 53 68 6f 77 20 74 68 65 20 61 63 74 69 76 65 20  Show the active 
10160 74 65 73 74 20 63 6f 6e 73 74 72 61 69 6e 74 73  test constraints
10170 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
10180 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
10190 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70  est_channel [app
101a0 65 6e 64 41 72 67 73 20 22 2d 2d 2d 2d 20 63 6f  endArgs "---- co
101b0 6e 73 74 72 61 69 6e 74 73 3a 20 22 20 5c 0d 0a  nstraints: " \..
101c0 20 20 20 20 20 20 20 20 20 20 20 20 5b 66 6f 72              [for
101d0 6d 61 74 4c 69 73 74 20 5b 6c 73 6f 72 74 20 5b  matList [lsort [
101e0 67 65 74 43 6f 6e 73 74 72 61 69 6e 74 73 5d 5d  getConstraints]]
101f0 5d 20 5c 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  ] \n]....       
10200 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
10210 54 45 3a 20 53 61 76 65 20 74 68 65 20 74 65 73  TE: Save the tes
10220 74 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 66 6f  t constraints fo
10230 72 20 75 73 65 20 62 79 20 74 68 72 65 61 64 73  r use by threads
10240 20 63 72 65 61 74 65 64 20 69 6e 20 74 68 69 73   created in this
10250 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
10260 20 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 64 6f    application do
10270 6d 61 69 6e 2e 20 20 54 68 69 73 20 69 73 20 6e  main.  This is n
10280 65 63 65 73 73 61 72 79 20 62 65 63 61 75 73 65  ecessary because
10290 20 61 6c 6c 20 74 68 65 20 45 61 67 6c 65 0d 0a   all the Eagle..
102a0 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
102b0 22 74 65 73 74 20 63 6f 6e 74 65 78 74 22 20 69  "test context" i
102c0 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 70 65  nformation is pe
102d0 72 2d 74 68 72 65 61 64 2e 0d 0a 20 20 20 20 20  r-thread...     
102e0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 69 66     #..        if
102f0 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20   {![info exists 
10300 3a 3a 74 65 73 74 5f 63 6f 6e 73 74 72 61 69 6e  ::test_constrain
10310 74 73 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  ts]} then {..   
10320 20 20 20 20 20 20 20 73 65 74 20 3a 3a 74 65 73         set ::tes
10330 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 24 3a  t_constraints $:
10340 3a 65 61 67 6c 65 5f 74 65 73 74 73 28 63 6f 6e  :eagle_tests(con
10350 73 74 72 61 69 6e 74 73 29 0d 0a 20 20 20 20 20  straints)..     
10360 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
10370 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
10380 45 3a 20 4c 6f 61 64 20 74 68 65 20 22 61 66 74  E: Load the "aft
10390 65 72 2d 63 6f 6e 73 74 72 61 69 6e 74 73 22 20  er-constraints" 
103a0 63 75 73 74 6f 6d 20 70 65 72 2d 75 73 65 72 20  custom per-user 
103b0 61 6e 64 2f 6f 72 20 70 65 72 2d 68 6f 73 74 0d  and/or per-host.
103c0 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
103d0 20 74 65 73 74 20 73 65 74 74 69 6e 67 73 20 6e   test settings n
103e0 6f 77 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  ow...        #..
103f0 20 20 20 20 20 20 20 20 75 70 6c 65 76 65 6c 20          uplevel 
10400 31 20 5b 6c 69 73 74 20 6c 6f 61 64 53 51 4c 69  1 [list loadSQLi
10410 74 65 54 65 73 74 53 65 74 74 69 6e 67 73 20 24  teTestSettings $
10420 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 2e  ::test_channel .
10430 61 66 74 65 72 5d 0d 0a 0d 0a 20 20 20 20 20 20  after]....      
10440 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
10450 4f 54 45 3a 20 53 68 6f 77 20 77 68 65 6e 20 6f  OTE: Show when o
10460 75 72 20 74 65 73 74 73 20 61 63 74 75 61 6c 6c  ur tests actuall
10470 79 20 62 65 67 61 6e 20 28 6e 6f 77 29 2e 0d 0a  y began (now)...
10480 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
10490 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
104a0 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  _channel [append
104b0 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
104c0 20 20 20 20 22 2d 2d 2d 2d 20 53 79 73 74 65 6d      "---- System
104d0 2e 44 61 74 61 2e 53 51 4c 69 74 65 20 74 65 73  .Data.SQLite tes
104e0 74 73 20 62 65 67 61 6e 20 61 74 20 22 20 5c 0d  ts began at " \.
104f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 63 6c  .            [cl
10500 6f 63 6b 20 66 6f 72 6d 61 74 20 5b 63 6c 6f 63  ock format [cloc
10510 6b 20 73 65 63 6f 6e 64 73 5d 5d 20 5c 6e 5d 0d  k seconds]] \n].
10520 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d  .      }..    }.
10530 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 72 75 6e  ....    proc run
10540 53 51 4c 69 74 65 54 65 73 74 45 70 69 6c 6f 67  SQLiteTestEpilog
10550 75 65 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 23  ue {} {..      #
10560 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
10570 53 6b 69 70 20 72 75 6e 6e 69 6e 67 20 6f 75 72  Skip running our
10580 20 63 75 73 74 6f 6d 20 65 70 69 6c 6f 67 75 65   custom epilogue
10590 20 69 66 20 74 68 65 20 6d 61 69 6e 20 6f 6e 65   if the main one
105a0 20 68 61 73 20 62 65 65 6e 0d 0a 20 20 20 20 20   has been..     
105b0 20 23 20 20 20 20 20 20 20 73 6b 69 70 70 65 64   #       skipped
105c0 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
105d0 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69    if {![info exi
105e0 73 74 73 20 3a 3a 6e 6f 28 65 70 69 6c 6f 67 75  sts ::no(epilogu
105f0 65 2e 65 61 67 6c 65 29 5d 7d 20 74 68 65 6e 20  e.eagle)]} then 
10600 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
10610 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 68        # NOTE: Sh
10620 6f 77 20 77 68 65 6e 20 6f 75 72 20 74 65 73 74  ow when our test
10630 73 20 61 63 74 75 61 6c 6c 79 20 65 6e 64 65 64  s actually ended
10640 20 28 6e 6f 77 29 2e 0d 0a 20 20 20 20 20 20 20   (now)...       
10650 20 23 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74   #..        tput
10660 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
10670 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
10680 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d  .            "--
10690 2d 2d 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53  -- System.Data.S
106a0 51 4c 69 74 65 20 74 65 73 74 73 20 65 6e 64 65  QLite tests ende
106b0 64 20 61 74 20 22 20 5c 0d 0a 20 20 20 20 20 20  d at " \..      
106c0 20 20 20 20 20 20 5b 63 6c 6f 63 6b 20 66 6f 72        [clock for
106d0 6d 61 74 20 5b 63 6c 6f 63 6b 20 73 65 63 6f 6e  mat [clock secon
106e0 64 73 5d 5d 20 5c 6e 5d 0d 0a 0d 0a 20 20 20 20  ds]] \n]....    
106f0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
10700 20 42 55 47 46 49 58 3a 20 42 65 66 6f 72 65 20   BUGFIX: Before 
10710 63 68 65 63 6b 69 6e 67 20 74 68 65 20 66 69 6e  checking the fin
10720 61 6c 20 72 65 73 6f 75 72 63 65 73 20 69 6e 20  al resources in 
10730 75 73 65 20 62 79 20 53 51 4c 69 74 65 2c 20 6d  use by SQLite, m
10740 61 6b 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20  ake..        #  
10750 20 20 20 20 20 20 20 73 75 72 65 20 62 6f 74 68         sure both
10760 20 6f 66 20 74 68 65 20 50 52 41 47 4d 41 20 72   of the PRAGMA r
10770 65 6c 61 74 65 64 20 64 69 72 65 63 74 6f 72 79  elated directory
10780 20 6e 61 6d 65 73 20 61 72 65 20 66 72 65 65 64   names are freed
10790 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
107a0 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72 53 51        checkForSQ
107b0 4c 69 74 65 44 69 72 65 63 74 6f 72 69 65 73 20  LiteDirectories 
107c0 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
107d0 74 72 75 65 0d 0a 0d 0a 20 20 20 20 20 20 20 20  true....        
107e0 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
107f0 45 3a 20 41 6c 73 6f 20 72 65 70 6f 72 74 20 74  E: Also report t
10800 68 65 20 72 65 73 6f 75 72 63 65 20 75 73 61 67  he resource usag
10810 65 20 61 66 74 65 72 20 72 75 6e 6e 69 6e 67 20  e after running 
10820 74 68 65 20 74 65 73 74 73 2e 0d 0a 20 20 20 20  the tests...    
10830 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72      #..        r
10840 65 70 6f 72 74 53 51 4c 69 74 65 52 65 73 6f 75  eportSQLiteResou
10850 72 63 65 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  rces $::test_cha
10860 6e 6e 65 6c 0d 0a 20 20 20 20 20 20 7d 0d 0a 20  nnel..      }.. 
10870 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 23 23 23     }.....    ###
10880 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
10890 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
108a0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
108b0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
108c0 23 23 23 23 23 23 23 23 0d 0a 20 20 20 20 23 23  ########..    ##
108d0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
108e0 23 23 23 23 23 23 23 23 23 23 23 20 45 4e 44 20  ########### END 
108f0 45 61 67 6c 65 20 4f 4e 4c 59 20 23 23 23 23 23  Eagle ONLY #####
10900 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
10910 23 23 23 23 23 23 23 23 23 0d 0a 20 20 20 20 23  #########..    #
10920 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
10930 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
10940 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
10950 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
10960 23 23 23 23 23 23 23 23 23 23 0d 0a 20 20 7d 0d  ##########..  }.
10970 0a 0d 0a 20 20 23 0d 0a 20 20 23 20 4e 4f 54 45  ...  #..  # NOTE
10980 3a 20 53 61 76 65 20 74 68 65 20 6e 61 6d 65 20  : Save the name 
10990 6f 66 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  of the directory
109a0 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 69 73   containing this
109b0 20 66 69 6c 65 2e 0d 0a 20 20 23 0d 0a 20 20 69   file...  #..  i
109c0 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73  f {![info exists
109d0 20 3a 3a 63 6f 6d 6d 6f 6e 5f 64 69 72 65 63 74   ::common_direct
109e0 6f 72 79 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ory]} then {..  
109f0 20 20 73 65 74 20 3a 3a 63 6f 6d 6d 6f 6e 5f 64    set ::common_d
10a00 69 72 65 63 74 6f 72 79 20 5b 66 69 6c 65 20 64  irectory [file d
10a10 69 72 6e 61 6d 65 20 5b 69 6e 66 6f 20 73 63 72  irname [info scr
10a20 69 70 74 5d 5d 0d 0a 20 20 7d 0d 0a 0d 0a 20 20  ipt]]..  }....  
10a30 23 0d 0a 20 20 23 20 4e 4f 54 45 3a 20 50 72 6f  #..  # NOTE: Pro
10a40 76 69 64 65 20 74 68 65 20 53 79 73 74 65 6d 2e  vide the System.
10a50 44 61 74 61 2e 53 51 4c 69 74 65 20 74 65 73 74  Data.SQLite test
10a60 20 70 61 63 6b 61 67 65 20 74 6f 20 74 68 65 20   package to the 
10a70 69 6e 74 65 72 70 72 65 74 65 72 2e 0d 0a 20 20  interpreter...  
10a80 23 0d 0a 20 20 70 61 63 6b 61 67 65 20 70 72 6f  #..  package pro
10a90 76 69 64 65 20 53 79 73 74 65 6d 2e 44 61 74 61  vide System.Data
10aa0 2e 53 51 4c 69 74 65 2e 54 65 73 74 20 31 2e 30  .SQLite.Test 1.0
10ab0 0d 0a 7d 0d 0a                                   ..}..