System.Data.SQLite
Hex Artifact Content
Not logged in

Artifact badbe7562b8d77620321a12c9cda5e6b35f69a74:


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 32 30 31 32 2c 20 32 30 31   2010, 2012, 201
0460: 33 2c 20 6f 72 20 32 30 31 35 20 62 75 69 6c 64  3, or 2015 build
0470: 20 73 79 73 74 65 6d 73 2e 20 20 54 6f 20 6f 76   systems.  To ov
0480: 65 72 72 69 64 65 0d 0a 20 20 20 20 20 20 23 20  erride..      # 
0490: 20 20 20 20 20 20 74 68 69 73 20 76 61 6c 75 65        this value
04a0: 20 76 69 61 20 74 68 65 20 63 6f 6d 6d 61 6e 64   via the command
04b0: 20 6c 69 6e 65 2c 20 65 6e 74 65 72 20 61 20 63   line, enter a c
04c0: 6f 6d 6d 61 6e 64 20 73 69 6d 69 6c 61 72 20 74  ommand similar t
04d0: 6f 20 6f 6e 65 0d 0a 20 20 20 20 20 20 23 20 20  o one..      #  
04e0: 20 20 20 20 20 6f 66 20 74 68 65 20 66 6f 6c 6c       of the foll
04f0: 6f 77 69 6e 67 20 28 61 6c 6c 20 6f 6e 20 6f 6e  owing (all on on
0500: 65 20 6c 69 6e 65 29 3a 0d 0a 20 20 20 20 20 20  e line):..      
0510: 23 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  #..      #      
0520: 20 45 61 67 6c 65 53 68 65 6c 6c 2e 65 78 65 20   EagleShell.exe 
0530: 2d 61 6e 79 49 6e 69 74 69 61 6c 69 7a 65 20 22  -anyInitialize "
0540: 73 65 74 20 74 65 73 74 5f 79 65 61 72 20 32 30  set test_year 20
0550: 30 35 22 0d 0a 20 20 20 20 20 20 23 20 20 20 20  05"..      #    
0560: 20 20 20 20 20 2d 66 69 6c 65 20 2e 5c 70 61 74       -file .\pat
0570: 68 5c 74 6f 5c 61 6c 6c 2e 65 61 67 6c 65 0d 0a  h\to\all.eagle..
0580: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
0590: 20 20 20 20 20 20 20 45 61 67 6c 65 53 68 65 6c         EagleShel
05a0: 6c 2e 65 78 65 20 2d 61 6e 79 49 6e 69 74 69 61  l.exe -anyInitia
05b0: 6c 69 7a 65 20 22 73 65 74 20 74 65 73 74 5f 79  lize "set test_y
05c0: 65 61 72 20 32 30 30 38 22 0d 0a 20 20 20 20 20  ear 2008"..     
05d0: 20 23 20 20 20 20 20 20 20 20 20 2d 66 69 6c 65   #         -file
05e0: 20 2e 5c 70 61 74 68 5c 74 6f 5c 61 6c 6c 2e 65   .\path\to\all.e
05f0: 61 67 6c 65 0d 0a 20 20 20 20 20 20 23 0d 0a 20  agle..      #.. 
0600: 20 20 20 20 20 23 20 20 20 20 20 20 20 45 61 67       #       Eag
0610: 6c 65 53 68 65 6c 6c 2e 65 78 65 20 2d 61 6e 79  leShell.exe -any
0620: 49 6e 69 74 69 61 6c 69 7a 65 20 22 73 65 74 20  Initialize "set 
0630: 74 65 73 74 5f 79 65 61 72 20 32 30 31 30 22 0d  test_year 2010".
0640: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 20  .      #        
0650: 20 2d 66 69 6c 65 20 2e 5c 70 61 74 68 5c 74 6f   -file .\path\to
0660: 5c 61 6c 6c 2e 65 61 67 6c 65 0d 0a 20 20 20 20  \all.eagle..    
0670: 20 20 23 0d 0a 20 20 20 20 20 20 23 20 20 20 20    #..      #    
0680: 20 20 20 45 61 67 6c 65 53 68 65 6c 6c 2e 65 78     EagleShell.ex
0690: 65 20 2d 61 6e 79 49 6e 69 74 69 61 6c 69 7a 65  e -anyInitialize
06a0: 20 22 73 65 74 20 74 65 73 74 5f 79 65 61 72 20   "set test_year 
06b0: 32 30 31 32 22 0d 0a 20 20 20 20 20 20 23 20 20  2012"..      #  
06c0: 20 20 20 20 20 20 20 2d 66 69 6c 65 20 2e 5c 70         -file .\p
06d0: 61 74 68 5c 74 6f 5c 61 6c 6c 2e 65 61 67 6c 65  ath\to\all.eagle
06e0: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
06f0: 20 23 20 20 20 20 20 20 20 45 61 67 6c 65 53 68   #       EagleSh
0700: 65 6c 6c 2e 65 78 65 20 2d 61 6e 79 49 6e 69 74  ell.exe -anyInit
0710: 69 61 6c 69 7a 65 20 22 73 65 74 20 74 65 73 74  ialize "set test
0720: 5f 79 65 61 72 20 32 30 31 33 22 0d 0a 20 20 20  _year 2013"..   
0730: 20 20 20 23 20 20 20 20 20 20 20 20 20 2d 66 69     #         -fi
0740: 6c 65 20 2e 5c 70 61 74 68 5c 74 6f 5c 61 6c 6c  le .\path\to\all
0750: 2e 65 61 67 6c 65 0d 0a 20 20 20 20 20 20 23 0d  .eagle..      #.
0760: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 45  .      #       E
0770: 61 67 6c 65 53 68 65 6c 6c 2e 65 78 65 20 2d 61  agleShell.exe -a
0780: 6e 79 49 6e 69 74 69 61 6c 69 7a 65 20 22 73 65  nyInitialize "se
0790: 74 20 74 65 73 74 5f 79 65 61 72 20 32 30 31 35  t test_year 2015
07a0: 22 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  "..      #      
07b0: 20 20 20 2d 66 69 6c 65 20 2e 5c 70 61 74 68 5c     -file .\path\
07c0: 74 6f 5c 61 6c 6c 2e 65 61 67 6c 65 0d 0a 20 20  to\all.eagle..  
07d0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 20      #..      #  
07e0: 20 20 20 20 20 45 61 67 6c 65 53 68 65 6c 6c 2e       EagleShell.
07f0: 65 78 65 20 2d 61 6e 79 49 6e 69 74 69 61 6c 69  exe -anyInitiali
0800: 7a 65 20 22 75 6e 73 65 74 20 2d 6e 6f 63 6f 6d  ze "unset -nocom
0810: 70 6c 61 69 6e 20 74 65 73 74 5f 79 65 61 72 22  plain test_year"
0820: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
0830: 20 20 2d 66 69 6c 65 20 2e 5c 70 61 74 68 5c 74    -file .\path\t
0840: 6f 5c 61 6c 6c 2e 65 61 67 6c 65 0d 0a 20 20 20  o\all.eagle..   
0850: 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
0860: 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 74  [info exists ::t
0870: 65 73 74 5f 79 65 61 72 5d 20 26 26 20 5b 73 74  est_year] && [st
0880: 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a 74  ring length $::t
0890: 65 73 74 5f 79 65 61 72 5d 20 3e 20 30 7d 20 74  est_year] > 0} t
08a0: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  hen {..        #
08b0: 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
08c0: 3a 20 55 73 65 20 74 68 65 20 73 70 65 63 69 66  : Use the specif
08d0: 69 65 64 20 74 65 73 74 20 79 65 61 72 2e 20 20  ied test year.  
08e0: 49 66 20 74 68 69 73 20 76 61 72 69 61 62 6c 65  If this variable
08f0: 20 69 73 20 6e 6f 74 20 73 65 74 2c 20 74 68 65   is not set, the
0900: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
0910: 20 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20    default value 
0920: 77 69 6c 6c 20 62 65 20 62 61 73 65 64 20 6f 6e  will be based on
0930: 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   whether or not 
0940: 45 61 67 6c 65 20 68 61 73 20 62 65 65 6e 0d 0a  Eagle has been..
0950: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
0960: 63 6f 6d 70 69 6c 65 64 20 61 67 61 69 6e 73 74  compiled against
0970: 20 74 68 65 20 43 4c 52 20 76 32 2e 30 20 6f 72   the CLR v2.0 or
0980: 20 43 4c 52 20 76 34 2e 30 2e 0d 0a 20 20 20 20   CLR v4.0...    
0990: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72      #..        r
09a0: 65 74 75 72 6e 20 24 3a 3a 74 65 73 74 5f 79 65  eturn $::test_ye
09b0: 61 72 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65  ar..      } else
09c0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20   {..        #.. 
09d0: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49         # NOTE: I
09e0: 66 20 45 61 67 6c 65 20 68 61 73 20 62 65 65 6e  f Eagle has been
09f0: 20 63 6f 6d 70 69 6c 65 64 20 61 67 61 69 6e 73   compiled agains
0a00: 74 20 74 68 65 20 43 4c 52 20 76 34 2e 30 2c 20  t the CLR v4.0, 
0a10: 75 73 65 20 22 32 30 31 30 22 20 62 79 0d 0a 20  use "2010" by.. 
0a20: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 64         #       d
0a30: 65 66 61 75 6c 74 20 28 77 65 20 63 6f 75 6c 64  efault (we could
0a40: 20 75 73 65 20 22 32 30 31 32 22 2c 20 22 32 30   use "2012", "20
0a50: 31 33 22 2c 20 6f 72 20 22 32 30 31 35 22 20 69  13", or "2015" i
0a60: 6e 20 74 68 61 74 20 63 61 73 65 20 61 73 0d 0a  n that case as..
0a70: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
0a80: 77 65 6c 6c 29 20 61 73 20 74 68 65 20 74 65 73  well) as the tes
0a90: 74 20 79 65 61 72 3b 20 6f 74 68 65 72 77 69 73  t year; otherwis
0aa0: 65 2c 20 75 73 65 20 22 32 30 30 38 22 20 62 79  e, use "2008" by
0ab0: 20 64 65 66 61 75 6c 74 20 28 77 65 0d 0a 20 20   default (we..  
0ac0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63 6f        #       co
0ad0: 75 6c 64 20 75 73 65 20 22 32 30 30 35 22 20 69  uld use "2005" i
0ae0: 6e 20 74 68 61 74 20 63 61 73 65 20 61 73 20 77  n that case as w
0af0: 65 6c 6c 29 2e 20 20 49 66 20 61 6e 6f 74 68 65  ell).  If anothe
0b00: 72 20 6d 61 6a 6f 72 0d 0a 20 20 20 20 20 20 20  r major..       
0b10: 20 23 20 20 20 20 20 20 20 5b 69 6e 63 6f 6d 70   #       [incomp
0b20: 61 74 69 62 6c 65 5d 20 76 65 72 73 69 6f 6e 20  atible] version 
0b30: 6f 66 20 74 68 65 20 43 4c 52 20 69 73 20 72 65  of the CLR is re
0b40: 6c 65 61 73 65 64 2c 20 74 68 69 73 20 63 68 65  leased, this che
0b50: 63 6b 20 77 69 6c 6c 0d 0a 20 20 20 20 20 20 20  ck will..       
0b60: 20 23 20 20 20 20 20 20 20 68 61 76 65 20 74 6f   #       have to
0b70: 20 62 65 20 63 68 61 6e 67 65 64 2e 20 20 54 68   be changed.  Th
0b80: 65 20 64 65 66 61 75 6c 74 20 74 65 73 74 20 79  e default test y
0b90: 65 61 72 20 74 6f 20 75 73 65 20 66 6f 72 20 61  ear to use for a
0ba0: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
0bb0: 20 20 70 61 72 74 69 63 75 6c 61 72 20 43 4c 52    particular CLR
0bc0: 20 76 65 72 73 69 6f 6e 20 6d 61 79 20 62 65 20   version may be 
0bd0: 6f 76 65 72 72 69 64 64 65 6e 20 62 79 20 73 65  overridden by se
0be0: 74 74 69 6e 67 20 74 68 65 20 67 6c 6f 62 61 6c  tting the global
0bf0: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
0c00: 20 20 76 61 72 69 61 62 6c 65 20 22 74 65 73 74    variable "test
0c10: 5f 79 65 61 72 5f 63 6c 72 5f 76 24 58 22 2c 20  _year_clr_v$X", 
0c20: 77 68 65 72 65 20 22 24 58 22 20 6d 61 79 20 5b  where "$X" may [
0c30: 63 75 72 72 65 6e 74 6c 79 5d 20 62 65 0d 0a 20  currently] be.. 
0c40: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 65         #       e
0c50: 69 74 68 65 72 20 22 32 22 20 6f 72 20 22 34 22  ither "2" or "4"
0c60: 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
0c70: 20 20 20 20 20 20 69 66 20 7b 5b 68 61 76 65 43        if {[haveC
0c80: 6f 6e 73 74 72 61 69 6e 74 20 69 6d 61 67 65 52  onstraint imageR
0c90: 75 6e 74 69 6d 65 34 30 5d 7d 20 74 68 65 6e 20  untime40]} then 
0ca0: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20  {..          if 
0cb0: 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  {[info exists ::
0cc0: 74 65 73 74 5f 79 65 61 72 5f 63 6c 72 5f 76 34  test_year_clr_v4
0cd0: 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20  ] && \..        
0ce0: 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65        [string le
0cf0: 6e 67 74 68 20 24 3a 3a 74 65 73 74 5f 79 65 61  ngth $::test_yea
0d00: 72 5f 63 6c 72 5f 76 34 5d 20 3e 20 30 7d 20 74  r_clr_v4] > 0} t
0d10: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
0d20: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
0d30: 20 20 23 20 4e 4f 54 45 3a 20 55 73 65 20 74 68    # NOTE: Use th
0d40: 65 20 73 70 65 63 69 66 69 65 64 20 74 65 73 74  e specified test
0d50: 20 79 65 61 72 20 66 6f 72 20 74 68 65 20 43 4c   year for the CL
0d60: 52 20 76 34 2e 30 2e 0d 0a 20 20 20 20 20 20 20  R v4.0...       
0d70: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
0d80: 20 20 20 20 72 65 74 75 72 6e 20 24 3a 3a 74 65      return $::te
0d90: 73 74 5f 79 65 61 72 5f 63 6c 72 5f 76 34 0d 0a  st_year_clr_v4..
0da0: 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65            } else
0db0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
0dc0: 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23  #..            #
0dd0: 20 4e 4f 54 45 3a 20 55 73 65 20 74 68 65 20 64   NOTE: Use the d
0de0: 65 66 61 75 6c 74 20 74 65 73 74 20 79 65 61 72  efault test year
0df0: 20 66 6f 72 20 74 68 65 20 43 4c 52 20 76 34 2e   for the CLR v4.
0e00: 30 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  0...            
0e10: 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  #..            r
0e20: 65 74 75 72 6e 20 32 30 31 30 3b 20 23 20 54 4f  eturn 2010; # TO
0e30: 44 4f 3a 20 47 6f 6f 64 20 22 66 61 6c 6c 62 61  DO: Good "fallba
0e40: 63 6b 22 20 64 65 66 61 75 6c 74 3f 0d 0a 20 20  ck" default?..  
0e50: 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
0e60: 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
0e70: 20 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f         if {[info
0e80: 20 65 78 69 73 74 73 20 3a 3a 74 65 73 74 5f 79   exists ::test_y
0e90: 65 61 72 5f 63 6c 72 5f 76 32 5d 20 26 26 20 5c  ear_clr_v2] && \
0ea0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
0eb0: 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
0ec0: 3a 3a 74 65 73 74 5f 79 65 61 72 5f 63 6c 72 5f  ::test_year_clr_
0ed0: 76 32 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d  v2] > 0} then {.
0ee0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a  .            #..
0ef0: 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f              # NO
0f00: 54 45 3a 20 55 73 65 20 74 68 65 20 73 70 65 63  TE: Use the spec
0f10: 69 66 69 65 64 20 74 65 73 74 20 79 65 61 72 20  ified test year 
0f20: 66 6f 72 20 74 68 65 20 43 4c 52 20 76 32 2e 30  for the CLR v2.0
0f30: 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23  ...            #
0f40: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65  ..            re
0f50: 74 75 72 6e 20 24 3a 3a 74 65 73 74 5f 79 65 61  turn $::test_yea
0f60: 72 5f 63 6c 72 5f 76 32 0d 0a 20 20 20 20 20 20  r_clr_v2..      
0f70: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
0f80: 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
0f90: 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a           # NOTE:
0fa0: 20 55 73 65 20 74 68 65 20 64 65 66 61 75 6c 74   Use the default
0fb0: 20 74 65 73 74 20 79 65 61 72 20 66 6f 72 20 74   test year for t
0fc0: 68 65 20 43 4c 52 20 76 32 2e 30 2e 0d 0a 20 20  he CLR v2.0...  
0fd0: 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
0fe0: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
0ff0: 32 30 30 38 3b 20 23 20 54 4f 44 4f 3a 20 47 6f  2008; # TODO: Go
1000: 6f 64 20 22 66 61 6c 6c 62 61 63 6b 22 20 64 65  od "fallback" de
1010: 66 61 75 6c 74 3f 0d 0a 20 20 20 20 20 20 20 20  fault?..        
1020: 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a    }..        }..
1030: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a        }..    }..
1040: 0c 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20 23 20  ...    #..    # 
1050: 4e 4f 54 45 3a 20 54 68 69 73 20 70 72 6f 63 65  NOTE: This proce
1060: 64 75 72 65 20 69 73 20 6f 6e 6c 79 20 75 73 65  dure is only use
1070: 64 20 77 68 65 6e 20 61 64 64 69 6e 67 20 73 68  d when adding sh
1080: 69 6d 6d 65 64 20 74 65 73 74 20 63 6f 6e 73 74  immed test const
1090: 72 61 69 6e 74 73 2e 0d 0a 20 20 20 20 23 0d 0a  raints...    #..
10a0: 20 20 20 20 70 72 6f 63 20 67 65 74 42 75 69 6c      proc getBuil
10b0: 64 43 6c 72 56 65 72 73 69 6f 6e 20 7b 7d 20 7b  dClrVersion {} {
10c0: 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66  ..      if {[inf
10d0: 6f 20 65 78 69 73 74 73 20 3a 3a 74 65 73 74 5f  o exists ::test_
10e0: 63 6c 72 5d 20 26 26 20 5b 73 74 72 69 6e 67 20  clr] && [string 
10f0: 6c 65 6e 67 74 68 20 24 3a 3a 74 65 73 74 5f 63  length $::test_c
1100: 6c 72 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d  lr] > 0} then {.
1110: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
1120: 20 20 20 20 23 20 4e 4f 54 45 3a 20 55 73 65 20      # NOTE: Use 
1130: 74 68 65 20 73 70 65 63 69 66 69 65 64 20 74 65  the specified te
1140: 73 74 20 76 65 72 73 69 6f 6e 20 66 6f 72 20 74  st version for t
1150: 68 65 20 43 4c 52 2e 20 20 49 66 20 74 68 69 73  he CLR.  If this
1160: 20 76 61 72 69 61 62 6c 65 0d 0a 20 20 20 20 20   variable..     
1170: 20 20 20 23 20 20 20 20 20 20 20 69 73 20 6e 6f     #       is no
1180: 74 20 73 65 74 2c 20 74 68 65 20 64 65 66 61 75  t set, the defau
1190: 6c 74 20 76 61 6c 75 65 20 77 69 6c 6c 20 62 65  lt value will be
11a0: 20 62 61 73 65 64 20 6f 6e 20 77 68 65 74 68 65   based on whethe
11b0: 72 20 6f 72 20 6e 6f 74 0d 0a 20 20 20 20 20 20  r or not..      
11c0: 20 20 23 20 20 20 20 20 20 20 45 61 67 6c 65 20    #       Eagle 
11d0: 68 61 73 20 62 65 65 6e 20 63 6f 6d 70 69 6c 65  has been compile
11e0: 64 20 61 67 61 69 6e 73 74 20 74 68 65 20 43 4c  d against the CL
11f0: 52 20 76 32 2e 30 20 6f 72 20 43 4c 52 20 76 34  R v2.0 or CLR v4
1200: 2e 30 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  .0...        #..
1210: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 24          return $
1220: 3a 3a 74 65 73 74 5f 63 6c 72 0d 0a 20 20 20 20  ::test_clr..    
1230: 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
1240: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
1250: 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 69 66 20   NOTE: Check if 
1260: 45 61 67 6c 65 20 68 61 73 20 62 65 65 6e 20 63  Eagle has been c
1270: 6f 6d 70 69 6c 65 64 20 61 67 61 69 6e 73 74 20  ompiled against 
1280: 74 68 65 20 43 4c 52 20 76 34 2e 30 2e 20 20 49  the CLR v4.0.  I
1290: 66 20 73 6f 2c 0d 0a 20 20 20 20 20 20 20 20 23  f so,..        #
12a0: 20 20 20 20 20 20 20 6a 75 73 74 20 75 73 65 20         just use 
12b0: 74 68 61 74 20 43 4c 52 20 76 65 72 73 69 6f 6e  that CLR version
12c0: 2e 20 20 4f 74 68 65 72 77 69 73 65 2c 20 75 73  .  Otherwise, us
12d0: 65 20 74 68 65 20 76 65 72 73 69 6f 6e 20 66 6f  e the version fo
12e0: 72 20 74 68 65 0d 0a 20 20 20 20 20 20 20 20 23  r the..        #
12f0: 20 20 20 20 20 20 20 43 4c 52 20 76 32 2e 30 2e         CLR v2.0.
1300: 20 20 49 66 20 61 6e 6f 74 68 65 72 20 6d 61 6a    If another maj
1310: 6f 72 20 5b 69 6e 63 6f 6d 70 61 74 69 62 6c 65  or [incompatible
1320: 5d 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 65  ] version of the
1330: 20 43 4c 52 0d 0a 20 20 20 20 20 20 20 20 23 20   CLR..        # 
1340: 20 20 20 20 20 20 69 73 20 72 65 6c 65 61 73 65        is release
1350: 64 2c 20 74 68 69 73 20 63 68 65 63 6b 20 77 69  d, this check wi
1360: 6c 6c 20 68 61 76 65 20 74 6f 20 62 65 20 63 68  ll have to be ch
1370: 61 6e 67 65 64 2e 20 20 54 68 65 20 64 65 66 61  anged.  The defa
1380: 75 6c 74 0d 0a 20 20 20 20 20 20 20 20 23 20 20  ult..        #  
1390: 20 20 20 20 20 76 65 72 73 69 6f 6e 20 76 61 6c       version val
13a0: 75 65 20 66 6f 72 20 61 20 70 61 72 74 69 63 75  ue for a particu
13b0: 6c 61 72 20 43 4c 52 20 76 65 72 73 69 6f 6e 20  lar CLR version 
13c0: 6d 61 79 20 62 65 20 6f 76 65 72 72 69 64 64 65  may be overridde
13d0: 6e 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  n..        #    
13e0: 20 20 20 62 79 20 73 65 74 74 69 6e 67 20 74 68     by setting th
13f0: 65 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c  e global variabl
1400: 65 20 22 74 65 73 74 5f 63 6c 72 5f 76 24 58 22  e "test_clr_v$X"
1410: 2c 20 77 68 65 72 65 20 22 24 58 22 20 6d 61 79  , where "$X" may
1420: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
1430: 20 20 5b 63 75 72 72 65 6e 74 6c 79 5d 20 62 65    [currently] be
1440: 20 65 69 74 68 65 72 20 22 32 22 20 6f 72 20 22   either "2" or "
1450: 34 22 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  4"...        #..
1460: 20 20 20 20 20 20 20 20 69 66 20 7b 5b 68 61 76          if {[hav
1470: 65 43 6f 6e 73 74 72 61 69 6e 74 20 69 6d 61 67  eConstraint imag
1480: 65 52 75 6e 74 69 6d 65 34 30 5d 7d 20 74 68 65  eRuntime40]} the
1490: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69  n {..          i
14a0: 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20  f {[info exists 
14b0: 3a 3a 74 65 73 74 5f 63 6c 72 5f 76 34 5d 20 26  ::test_clr_v4] &
14c0: 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  & \..           
14d0: 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74     [string lengt
14e0: 68 20 24 3a 3a 74 65 73 74 5f 63 6c 72 5f 76 34  h $::test_clr_v4
14f0: 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20  ] > 0} then {.. 
1500: 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
1510: 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45            # NOTE
1520: 3a 20 55 73 65 20 74 68 65 20 73 70 65 63 69 66  : Use the specif
1530: 69 65 64 20 74 65 73 74 20 76 65 72 73 69 6f 6e  ied test version
1540: 20 66 6f 72 20 74 68 65 20 43 4c 52 20 76 34 2e   for the CLR v4.
1550: 30 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  0...            
1560: 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  #..            r
1570: 65 74 75 72 6e 20 24 3a 3a 74 65 73 74 5f 63 6c  eturn $::test_cl
1580: 72 5f 76 34 0d 0a 20 20 20 20 20 20 20 20 20 20  r_v4..          
1590: 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
15a0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
15b0: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 55 73 65       # NOTE: Use
15c0: 20 74 68 65 20 64 65 66 61 75 6c 74 20 74 65 73   the default tes
15d0: 74 20 76 65 72 73 69 6f 6e 20 66 6f 72 20 74 68  t version for th
15e0: 65 20 43 4c 52 20 76 34 2e 30 2e 0d 0a 20 20 20  e CLR v4.0...   
15f0: 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
1600: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 34          return 4
1610: 2e 30 2e 33 30 33 31 39 3b 20 23 20 54 4f 44 4f  .0.30319; # TODO
1620: 3a 20 47 6f 6f 64 20 22 66 61 6c 6c 62 61 63 6b  : Good "fallback
1630: 22 20 64 65 66 61 75 6c 74 3f 0d 0a 20 20 20 20  " default?..    
1640: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
1650: 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
1660: 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65       if {[info e
1670: 78 69 73 74 73 20 3a 3a 74 65 73 74 5f 63 6c 72  xists ::test_clr
1680: 5f 76 32 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20  _v2] && \..     
1690: 20 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67           [string
16a0: 20 6c 65 6e 67 74 68 20 24 3a 3a 74 65 73 74 5f   length $::test_
16b0: 63 6c 72 5f 76 32 5d 20 3e 20 30 7d 20 74 68 65  clr_v2] > 0} the
16c0: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
16d0: 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   #..            
16e0: 23 20 4e 4f 54 45 3a 20 55 73 65 20 74 68 65 20  # NOTE: Use the 
16f0: 73 70 65 63 69 66 69 65 64 20 74 65 73 74 20 76  specified test v
1700: 65 72 73 69 6f 6e 20 66 6f 72 20 74 68 65 20 43  ersion for the C
1710: 4c 52 20 76 32 2e 30 2e 0d 0a 20 20 20 20 20 20  LR v2.0...      
1720: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
1730: 20 20 20 20 20 72 65 74 75 72 6e 20 24 3a 3a 74       return $::t
1740: 65 73 74 5f 63 6c 72 5f 76 32 0d 0a 20 20 20 20  est_clr_v2..    
1750: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
1760: 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20              #.. 
1770: 20 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54             # NOT
1780: 45 3a 20 55 73 65 20 74 68 65 20 64 65 66 61 75  E: Use the defau
1790: 6c 74 20 74 65 73 74 20 76 65 72 73 69 6f 6e 20  lt test version 
17a0: 66 6f 72 20 74 68 65 20 43 4c 52 20 76 32 2e 30  for the CLR v2.0
17b0: 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23  ...            #
17c0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65  ..            re
17d0: 74 75 72 6e 20 32 2e 30 2e 35 30 37 32 37 3b 20  turn 2.0.50727; 
17e0: 23 20 54 4f 44 4f 3a 20 47 6f 6f 64 20 22 66 61  # TODO: Good "fa
17f0: 6c 6c 62 61 63 6b 22 20 64 65 66 61 75 6c 74 3f  llback" default?
1800: 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20  ..          }.. 
1810: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
1820: 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  }..    }.....   
1830: 20 70 72 6f 63 20 67 65 74 42 75 69 6c 64 59 65   proc getBuildYe
1840: 61 72 73 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20  ars {} {..      
1850: 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
1860: 20 53 65 65 20 69 66 20 74 68 65 20 6c 69 73 74   See if the list
1870: 20 6f 66 20 74 65 73 74 20 79 65 61 72 73 20 68   of test years h
1880: 61 73 20 62 65 65 6e 20 6f 76 65 72 72 69 64 64  as been overridd
1890: 65 6e 20 62 79 20 74 68 65 20 75 73 65 72 0d 0a  en by the user..
18a0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 28 65        #       (e
18b0: 2e 67 2e 20 6f 6e 20 74 68 65 20 63 6f 6d 6d 61  .g. on the comma
18c0: 6e 64 20 6c 69 6e 65 29 2e 0d 0a 20 20 20 20 20  nd line)...     
18d0: 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69   #..      if {[i
18e0: 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 74 65 73  nfo exists ::tes
18f0: 74 5f 79 65 61 72 73 5d 20 26 26 20 5b 6c 6c 65  t_years] && [lle
1900: 6e 67 74 68 20 24 3a 3a 74 65 73 74 5f 79 65 61  ngth $::test_yea
1910: 72 73 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d  rs] > 0} then {.
1920: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
1930: 20 20 20 20 23 20 4e 4f 54 45 3a 20 55 73 65 20      # NOTE: Use 
1940: 74 68 65 20 73 70 65 63 69 66 69 65 64 20 6c 69  the specified li
1950: 73 74 20 6f 66 20 74 65 73 74 20 79 65 61 72 73  st of test years
1960: 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
1970: 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 3a 3a        return $::
1980: 74 65 73 74 5f 79 65 61 72 73 0d 0a 20 20 20 20  test_years..    
1990: 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
19a0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
19b0: 20 4e 4f 54 45 3a 20 55 73 65 20 74 68 65 20 64   NOTE: Use the d
19c0: 65 66 61 75 6c 74 20 6c 69 73 74 20 6f 66 20 74  efault list of t
19d0: 65 73 74 20 79 65 61 72 73 20 28 69 2e 65 2e 20  est years (i.e. 
19e0: 61 6c 6c 29 2e 0d 0a 20 20 20 20 20 20 20 20 23  all)...        #
19f0: 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ..        return
1a00: 20 5b 6c 69 73 74 20 32 30 30 35 20 32 30 30 38   [list 2005 2008
1a10: 20 32 30 31 30 20 32 30 31 32 20 32 30 31 33 20   2010 2012 2013 
1a20: 32 30 31 35 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a  2015]..      }..
1a30: 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
1a40: 6f 63 20 67 65 74 42 75 69 6c 64 4e 65 74 46 78  oc getBuildNetFx
1a50: 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a   {} {..      #..
1a60: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 65        # NOTE: Se
1a70: 65 20 69 66 20 74 68 65 20 74 65 73 74 20 2e 4e  e if the test .N
1a80: 45 54 20 46 72 61 6d 65 77 6f 72 6b 20 73 65 74  ET Framework set
1a90: 74 69 6e 67 20 68 61 73 20 62 65 65 6e 20 6f 76  ting has been ov
1aa0: 65 72 72 69 64 64 65 6e 20 62 79 0d 0a 20 20 20  erridden by..   
1ab0: 20 20 20 23 20 20 20 20 20 20 20 74 68 65 20 75     #       the u
1ac0: 73 65 72 20 28 65 2e 67 2e 20 6f 6e 20 74 68 65  ser (e.g. on the
1ad0: 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 29 2e 0d   command line)..
1ae0: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
1af0: 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73  if {[info exists
1b00: 20 3a 3a 74 65 73 74 5f 6e 65 74 5f 66 78 5d 20   ::test_net_fx] 
1b10: 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  && \..          
1b20: 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
1b30: 3a 3a 74 65 73 74 5f 6e 65 74 5f 66 78 5d 20 3e  ::test_net_fx] >
1b40: 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
1b50: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
1b60: 20 4e 4f 54 45 3a 20 55 73 65 20 74 68 65 20 73   NOTE: Use the s
1b70: 70 65 63 69 66 69 65 64 20 74 65 73 74 20 2e 4e  pecified test .N
1b80: 45 54 20 46 72 61 6d 65 77 6f 72 6b 2e 0d 0a 20  ET Framework... 
1b90: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
1ba0: 20 20 72 65 74 75 72 6e 20 24 3a 3a 74 65 73 74    return $::test
1bb0: 5f 6e 65 74 5f 66 78 0d 0a 20 20 20 20 20 20 7d  _net_fx..      }
1bc0: 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
1bd0: 20 73 65 74 20 79 65 61 72 20 5b 67 65 74 42 75   set year [getBu
1be0: 69 6c 64 59 65 61 72 5d 0d 0a 0d 0a 20 20 20 20  ildYear]....    
1bf0: 20 20 20 20 73 77 69 74 63 68 20 2d 65 78 61 63      switch -exac
1c00: 74 20 2d 2d 20 24 79 65 61 72 20 7b 0d 0a 20 20  t -- $year {..  
1c10: 20 20 20 20 20 20 20 20 32 30 30 35 20 7b 0d 0a          2005 {..
1c20: 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
1c30: 72 6e 20 6e 65 74 46 78 32 30 0d 0a 20 20 20 20  rn netFx20..    
1c40: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
1c50: 20 20 20 32 30 30 38 20 7b 0d 0a 20 20 20 20 20     2008 {..     
1c60: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 6e 65         return ne
1c70: 74 46 78 33 35 0d 0a 20 20 20 20 20 20 20 20 20  tFx35..         
1c80: 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 32 30   }..          20
1c90: 31 30 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  10 {..          
1ca0: 20 20 72 65 74 75 72 6e 20 6e 65 74 46 78 34 30    return netFx40
1cb0: 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20  ..          }.. 
1cc0: 20 20 20 20 20 20 20 20 20 32 30 31 32 20 7b 0d           2012 {.
1cd0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74  .            ret
1ce0: 75 72 6e 20 6e 65 74 46 78 34 35 0d 0a 20 20 20  urn netFx45..   
1cf0: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
1d00: 20 20 20 20 32 30 31 33 20 7b 0d 0a 20 20 20 20      2013 {..    
1d10: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 6e          return n
1d20: 65 74 46 78 34 35 31 0d 0a 20 20 20 20 20 20 20  etFx451..       
1d30: 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
1d40: 32 30 31 35 20 7b 0d 0a 20 20 20 20 20 20 20 20  2015 {..        
1d50: 20 20 20 20 72 65 74 75 72 6e 20 6e 65 74 46 78      return netFx
1d60: 34 36 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d  46..          }.
1d70: 0a 20 20 20 20 20 20 20 20 20 20 64 65 66 61 75  .          defau
1d80: 6c 74 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  lt {..          
1d90: 20 20 72 65 74 75 72 6e 20 6e 65 74 46 78 33 35    return netFx35
1da0: 3b 20 23 20 54 4f 44 4f 3a 20 47 6f 6f 64 20 22  ; # TODO: Good "
1db0: 66 61 6c 6c 62 61 63 6b 22 20 64 65 66 61 75 6c  fallback" defaul
1dc0: 74 3f 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d  t?..          }.
1dd0: 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  .        }..    
1de0: 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20    }..    }..... 
1df0: 20 20 20 23 0d 0a 20 20 20 20 23 20 4e 4f 54 45     #..    # NOTE
1e00: 3a 20 54 68 69 73 20 70 72 6f 63 65 64 75 72 65  : This procedure
1e10: 20 73 68 6f 75 6c 64 20 72 65 74 75 72 6e 20 6e   should return n
1e20: 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 20 63  on-zero if the c
1e30: 6f 6e 66 69 67 75 72 65 64 20 74 65 73 74 0d 0a  onfigured test..
1e40: 20 20 20 20 23 20 20 20 20 20 20 20 70 6c 61 74      #       plat
1e50: 66 6f 72 6d 20 69 73 20 6d 6f 73 74 20 6c 69 6b  form is most lik
1e60: 65 6c 79 20 74 68 65 20 64 65 66 61 75 6c 74 20  ely the default 
1e70: 66 6f 72 20 74 68 69 73 20 6d 61 63 68 69 6e 65  for this machine
1e80: 2e 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20 70 72  ...    #..    pr
1e90: 6f 63 20 69 73 44 65 66 61 75 6c 74 42 75 69 6c  oc isDefaultBuil
1ea0: 64 50 6c 61 74 66 6f 72 6d 20 7b 20 7b 76 65 72  dPlatform { {ver
1eb0: 62 6f 73 65 20 66 61 6c 73 65 7d 20 7d 20 7b 0d  bose false} } {.
1ec0: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
1ed0: 23 20 4e 4f 54 45 3a 20 52 75 6e 6e 69 6e 67 20  # NOTE: Running 
1ee0: 6f 6e 20 57 6f 57 36 34 20 69 73 20 6e 65 76 65  on WoW64 is neve
1ef0: 72 20 74 68 65 20 64 65 66 61 75 6c 74 20 70 6c  r the default pl
1f00: 61 74 66 6f 72 6d 2e 0d 0a 20 20 20 20 20 20 23  atform...      #
1f10: 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 73 52  ..      if {[isR
1f20: 75 6e 6e 69 6e 67 57 6f 57 36 34 5d 7d 20 74 68  unningWoW64]} th
1f30: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66  en {..        if
1f40: 20 7b 24 76 65 72 62 6f 73 65 7d 20 74 68 65 6e   {$verbose} then
1f50: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70   {..          tp
1f60: 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  uts $::test_chan
1f70: 6e 65 6c 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  nel \..         
1f80: 20 20 20 20 20 22 2d 2d 2d 2d 20 64 65 74 65 63       "---- detec
1f90: 74 65 64 20 6e 6f 6e 2d 64 65 66 61 75 6c 74 20  ted non-default 
1fa0: 70 6c 61 74 66 6f 72 6d 20 28 57 6f 57 36 34 29  platform (WoW64)
1fb0: 5c 6e 22 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  \n"..        }..
1fc0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 66          return f
1fd0: 61 6c 73 65 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d  alse..      }...
1fe0: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
1ff0: 23 20 4e 4f 54 45 3a 20 54 68 69 73 20 68 61 73  # NOTE: This has
2000: 20 61 20 67 6f 6f 64 20 63 68 61 6e 63 65 20 6f   a good chance o
2010: 66 20 62 65 69 6e 67 20 74 68 65 20 64 65 66 61  f being the defa
2020: 75 6c 74 20 70 6c 61 74 66 6f 72 6d 2e 0d 0a 20  ult platform... 
2030: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66       #..      if
2040: 20 7b 24 76 65 72 62 6f 73 65 7d 20 74 68 65 6e   {$verbose} then
2050: 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74   {..        tput
2060: 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
2070: 6c 20 22 2d 2d 2d 2d 20 64 65 74 65 63 74 65 64  l "---- detected
2080: 20 64 65 66 61 75 6c 74 20 70 6c 61 74 66 6f 72   default platfor
2090: 6d 5c 6e 22 0d 0a 20 20 20 20 20 20 7d 0d 0a 20  m\n"..      }.. 
20a0: 20 20 20 20 20 72 65 74 75 72 6e 20 74 72 75 65       return true
20b0: 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
20c0: 70 72 6f 63 20 67 65 74 42 75 69 6c 64 50 6c 61  proc getBuildPla
20d0: 74 66 6f 72 6d 20 7b 20 6e 61 74 69 76 65 20 7d  tform { native }
20e0: 20 7b 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69   {..      if {[i
20f0: 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 74 65 73  nfo exists ::tes
2100: 74 5f 70 6c 61 74 66 6f 72 6d 5d 20 26 26 20 5c  t_platform] && \
2110: 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 73 74 72  ..          [str
2120: 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a 74 65  ing length $::te
2130: 73 74 5f 70 6c 61 74 66 6f 72 6d 5d 20 3e 20 30  st_platform] > 0
2140: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
2150: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
2160: 4f 54 45 3a 20 55 73 65 20 74 68 65 20 73 70 65  OTE: Use the spe
2170: 63 69 66 69 65 64 20 74 65 73 74 20 70 6c 61 74  cified test plat
2180: 66 6f 72 6d 2e 20 20 49 66 20 74 68 69 73 20 76  form.  If this v
2190: 61 72 69 61 62 6c 65 20 69 73 20 6e 6f 74 20 73  ariable is not s
21a0: 65 74 2c 0d 0a 20 20 20 20 20 20 20 20 23 20 20  et,..        #  
21b0: 20 20 20 20 20 74 68 65 20 64 65 66 61 75 6c 74       the default
21c0: 20 76 61 6c 75 65 20 77 69 6c 6c 20 62 65 20 62   value will be b
21d0: 61 73 65 64 20 6f 6e 20 74 68 65 20 6d 61 63 68  ased on the mach
21e0: 69 6e 65 20 61 72 63 68 69 74 65 63 74 75 72 65  ine architecture
21f0: 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
2200: 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b 65 78        return [ex
2210: 70 72 20 7b 24 6e 61 74 69 76 65 20 3f 20 24 3a  pr {$native ? $:
2220: 3a 74 65 73 74 5f 70 6c 61 74 66 6f 72 6d 20 3a  :test_platform :
2230: 20 22 22 7d 5d 0d 0a 20 20 20 20 20 20 7d 20 65   ""}]..      } e
2240: 6c 73 65 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69  lseif {[info exi
2250: 73 74 73 20 3a 3a 74 65 73 74 5f 6d 61 63 68 69  sts ::test_machi
2260: 6e 65 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20  ne] && \..      
2270: 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67      [string leng
2280: 74 68 20 24 3a 3a 74 65 73 74 5f 6d 61 63 68 69  th $::test_machi
2290: 6e 65 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d  ne] > 0} then {.
22a0: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
22b0: 20 20 20 20 23 20 4e 4f 54 45 3a 20 46 6f 72 20      # NOTE: For 
22c0: 6e 61 74 69 76 65 20 62 75 69 6c 64 73 2c 20 72  native builds, r
22d0: 65 74 75 72 6e 20 74 68 65 20 70 6c 61 74 66 6f  eturn the platfo
22e0: 72 6d 20 6e 61 6d 65 20 63 6f 72 72 65 73 70 6f  rm name correspo
22f0: 6e 64 69 6e 67 20 74 6f 0d 0a 20 20 20 20 20 20  nding to..      
2300: 20 20 23 20 20 20 20 20 20 20 74 68 65 20 74 65    #       the te
2310: 73 74 20 6d 61 63 68 69 6e 65 20 61 72 63 68 69  st machine archi
2320: 74 65 63 74 75 72 65 3b 20 6f 74 68 65 72 77 69  tecture; otherwi
2330: 73 65 2c 20 72 65 74 75 72 6e 20 61 6e 20 65 6d  se, return an em
2340: 70 74 79 0d 0a 20 20 20 20 20 20 20 20 23 20 20  pty..        #  
2350: 20 20 20 20 20 73 74 72 69 6e 67 2e 0d 0a 20 20       string...  
2360: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
2370: 20 72 65 74 75 72 6e 20 5b 65 78 70 72 20 7b 0d   return [expr {.
2380: 0a 20 20 20 20 20 20 20 20 20 20 24 6e 61 74 69  .          $nati
2390: 76 65 20 3f 20 5b 6d 61 63 68 69 6e 65 54 6f 50  ve ? [machineToP
23a0: 6c 61 74 66 6f 72 6d 20 24 3a 3a 74 65 73 74 5f  latform $::test_
23b0: 6d 61 63 68 69 6e 65 5d 20 3a 20 22 22 0d 0a 20  machine] : "".. 
23c0: 20 20 20 20 20 20 20 7d 5d 0d 0a 20 20 20 20 20         }]..     
23d0: 20 7d 20 65 6c 73 65 69 66 20 7b 5b 69 6e 66 6f   } elseif {[info
23e0: 20 65 78 69 73 74 73 20 3a 3a 74 63 6c 5f 70 6c   exists ::tcl_pl
23f0: 61 74 66 6f 72 6d 28 6d 61 63 68 69 6e 65 29 5d  atform(machine)]
2400: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
2410: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
2420: 4f 54 45 3a 20 46 6f 72 20 6e 61 74 69 76 65 20  OTE: For native 
2430: 62 75 69 6c 64 73 2c 20 72 65 74 75 72 6e 20 74  builds, return t
2440: 68 65 20 70 6c 61 74 66 6f 72 6d 20 6e 61 6d 65  he platform name
2450: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74   corresponding t
2460: 6f 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  o..        #    
2470: 20 20 20 74 68 65 20 6d 61 63 68 69 6e 65 20 61     the machine a
2480: 72 63 68 69 74 65 63 74 75 72 65 3b 20 6f 74 68  rchitecture; oth
2490: 65 72 77 69 73 65 2c 20 72 65 74 75 72 6e 20 61  erwise, return a
24a0: 6e 20 65 6d 70 74 79 20 73 74 72 69 6e 67 2e 0d  n empty string..
24b0: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
24c0: 20 20 20 20 72 65 74 75 72 6e 20 5b 65 78 70 72      return [expr
24d0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 24 6e   {..          $n
24e0: 61 74 69 76 65 20 3f 20 5b 6d 61 63 68 69 6e 65  ative ? [machine
24f0: 54 6f 50 6c 61 74 66 6f 72 6d 20 24 3a 3a 74 63  ToPlatform $::tc
2500: 6c 5f 70 6c 61 74 66 6f 72 6d 28 6d 61 63 68 69  l_platform(machi
2510: 6e 65 29 5d 20 3a 20 22 22 0d 0a 20 20 20 20 20  ne)] : ""..     
2520: 20 20 20 7d 5d 0d 0a 20 20 20 20 20 20 7d 20 65     }]..      } e
2530: 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  lse {..        #
2540: 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
2550: 3a 20 4e 6f 20 6d 61 63 68 69 6e 65 20 61 72 63  : No machine arc
2560: 68 69 74 65 63 74 75 72 65 20 69 73 20 61 76 61  hitecture is ava
2570: 69 6c 61 62 6c 65 2c 20 72 65 74 75 72 6e 20 61  ilable, return a
2580: 6e 20 65 6d 70 74 79 20 73 74 72 69 6e 67 2e 0d  n empty string..
2590: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
25a0: 20 49 74 20 69 73 20 69 6d 70 6f 72 74 61 6e 74   It is important
25b0: 20 74 6f 20 72 65 74 75 72 6e 20 61 6e 20 65 6d   to return an em
25c0: 70 74 79 20 73 74 72 69 6e 67 20 68 65 72 65 20  pty string here 
25d0: 62 65 63 61 75 73 65 20 74 68 65 0d 0a 20 20 20  because the..   
25e0: 20 20 20 20 20 23 20 20 20 20 20 20 20 72 65 73       #       res
25f0: 75 6c 74 20 6f 66 20 74 68 69 73 20 70 72 6f 63  ult of this proc
2600: 65 64 75 72 65 20 6d 61 79 20 62 65 20 75 73 65  edure may be use
2610: 64 20 77 69 74 68 20 5b 66 69 6c 65 20 6a 6f 69  d with [file joi
2620: 6e 5d 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  n]...        #..
2630: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 22          return "
2640: 22 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  "..      }..    
2650: 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67  }.....    proc g
2660: 65 74 42 75 69 6c 64 43 6f 6e 66 69 67 75 72 61  etBuildConfigura
2670: 74 69 6f 6e 20 7b 7d 20 7b 0d 0a 20 20 20 20 20  tion {} {..     
2680: 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
2690: 3a 20 53 65 65 20 69 66 20 74 68 65 20 22 63 6f  : See if the "co
26a0: 6e 66 69 67 75 72 61 74 69 6f 6e 22 20 73 65 74  nfiguration" set
26b0: 74 69 6e 67 20 68 61 73 20 62 65 65 6e 20 6f 76  ting has been ov
26c0: 65 72 72 69 64 64 65 6e 20 62 79 20 74 68 65 0d  erridden by the.
26d0: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 75  .      #       u
26e0: 73 65 72 20 28 65 2e 67 2e 20 6f 6e 20 74 68 65  ser (e.g. on the
26f0: 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 29 2e 20   command line). 
2700: 20 54 68 69 73 20 68 65 6c 70 73 20 63 6f 6e 74   This helps cont
2710: 72 6f 6c 20 65 78 61 63 74 6c 79 0d 0a 20 20 20  rol exactly..   
2720: 20 20 20 23 20 20 20 20 20 20 20 77 68 69 63 68     #       which
2730: 20 73 65 74 20 6f 66 20 62 69 6e 61 72 69 65 73   set of binaries
2740: 20 77 65 20 61 72 65 20 74 65 73 74 69 6e 67 20   we are testing 
2750: 28 69 2e 65 2e 20 74 68 6f 73 65 20 62 75 69 6c  (i.e. those buil
2760: 74 20 69 6e 20 74 68 65 0d 0a 20 20 20 20 20 20  t in the..      
2770: 23 20 20 20 20 20 20 20 22 44 65 62 75 67 22 20  #       "Debug" 
2780: 6f 72 20 22 52 65 6c 65 61 73 65 22 20 62 75 69  or "Release" bui
2790: 6c 64 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  ld configuration
27a0: 73 29 2e 20 20 54 6f 20 6f 76 65 72 72 69 64 65  s).  To override
27b0: 20 74 68 69 73 0d 0a 20 20 20 20 20 20 23 20 20   this..      #  
27c0: 20 20 20 20 20 76 61 6c 75 65 20 76 69 61 20 74       value via t
27d0: 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 2c  he command line,
27e0: 20 65 6e 74 65 72 20 61 20 63 6f 6d 6d 61 6e 64   enter a command
27f0: 20 73 69 6d 69 6c 61 72 20 74 6f 20 6f 6e 65 20   similar to one 
2800: 6f 66 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  of..      #     
2810: 20 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20    the following 
2820: 28 61 6c 6c 20 6f 6e 20 6f 6e 65 20 6c 69 6e 65  (all on one line
2830: 29 3a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  ):..      #..   
2840: 20 20 20 23 20 20 20 20 20 20 20 45 61 67 6c 65     #       Eagle
2850: 53 68 65 6c 6c 2e 65 78 65 20 2d 61 6e 79 49 6e  Shell.exe -anyIn
2860: 69 74 69 61 6c 69 7a 65 20 22 73 65 74 20 74 65  itialize "set te
2870: 73 74 5f 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  st_configuration
2880: 20 44 65 62 75 67 22 0d 0a 20 20 20 20 20 20 23   Debug"..      #
2890: 20 20 20 20 20 20 20 20 20 2d 66 69 6c 65 20 2e           -file .
28a0: 5c 70 61 74 68 5c 74 6f 5c 61 6c 6c 2e 65 61 67  \path\to\all.eag
28b0: 6c 65 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  le..      #..   
28c0: 20 20 20 23 20 20 20 20 20 20 20 45 61 67 6c 65     #       Eagle
28d0: 53 68 65 6c 6c 2e 65 78 65 20 2d 61 6e 79 49 6e  Shell.exe -anyIn
28e0: 69 74 69 61 6c 69 7a 65 20 22 73 65 74 20 74 65  itialize "set te
28f0: 73 74 5f 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  st_configuration
2900: 20 52 65 6c 65 61 73 65 22 0d 0a 20 20 20 20 20   Release"..     
2910: 20 23 20 20 20 20 20 20 20 20 20 2d 66 69 6c 65   #         -file
2920: 20 2e 5c 70 61 74 68 5c 74 6f 5c 61 6c 6c 2e 65   .\path\to\all.e
2930: 61 67 6c 65 0d 0a 20 20 20 20 20 20 23 0d 0a 20  agle..      #.. 
2940: 20 20 20 20 20 23 20 20 20 20 20 20 20 45 61 67       #       Eag
2950: 6c 65 53 68 65 6c 6c 2e 65 78 65 20 2d 66 69 6c  leShell.exe -fil
2960: 65 20 2e 5c 70 61 74 68 5c 74 6f 5c 61 6c 6c 2e  e .\path\to\all.
2970: 65 61 67 6c 65 20 2d 70 72 65 54 65 73 74 0d 0a  eagle -preTest..
2980: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 20 20        #         
2990: 22 75 6e 73 65 74 20 2d 6e 6f 63 6f 6d 70 6c 61  "unset -nocompla
29a0: 69 6e 20 74 65 73 74 5f 63 6f 6e 66 69 67 75 72  in test_configur
29b0: 61 74 69 6f 6e 22 0d 0a 20 20 20 20 20 20 23 0d  ation"..      #.
29c0: 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f  .      if {[info
29d0: 20 65 78 69 73 74 73 20 3a 3a 74 65 73 74 5f 63   exists ::test_c
29e0: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 5d 20 26 26  onfiguration] &&
29f0: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 73   \..          [s
2a00: 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a  tring length $::
2a10: 74 65 73 74 5f 63 6f 6e 66 69 67 75 72 61 74 69  test_configurati
2a20: 6f 6e 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d  on] > 0} then {.
2a30: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
2a40: 20 20 20 20 23 20 4e 4f 54 45 3a 20 55 73 65 20      # NOTE: Use 
2a50: 74 68 65 20 73 70 65 63 69 66 69 65 64 20 74 65  the specified te
2a60: 73 74 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  st configuration
2a70: 2e 20 20 54 68 65 20 64 65 66 61 75 6c 74 20 76  .  The default v
2a80: 61 6c 75 65 20 75 73 65 64 0d 0a 20 20 20 20 20  alue used..     
2a90: 20 20 20 23 20 20 20 20 20 20 20 66 6f 72 20 74     #       for t
2aa0: 68 69 73 20 76 61 72 69 61 62 6c 65 20 69 73 20  his variable is 
2ab0: 74 79 70 69 63 61 6c 6c 79 20 22 52 65 6c 65 61  typically "Relea
2ac0: 73 65 22 2c 20 61 73 20 73 65 74 20 62 79 20 74  se", as set by t
2ad0: 68 65 20 74 65 73 74 0d 0a 20 20 20 20 20 20 20  he test..       
2ae0: 20 23 20 20 20 20 20 20 20 73 75 69 74 65 20 69   #       suite i
2af0: 74 73 65 6c 66 2e 0d 0a 20 20 20 20 20 20 20 20  tself...        
2b00: 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  #..        retur
2b10: 6e 20 24 3a 3a 74 65 73 74 5f 63 6f 6e 66 69 67  n $::test_config
2b20: 75 72 61 74 69 6f 6e 0d 0a 20 20 20 20 20 20 7d  uration..      }
2b30: 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
2b40: 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
2b50: 54 45 3a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 77 65  TE: Normally, we
2b60: 20 77 69 6c 6c 20 6e 65 76 65 72 20 68 69 74 20   will never hit 
2b70: 74 68 69 73 20 63 61 73 65 20 62 65 63 61 75 73  this case becaus
2b80: 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  e the value of t
2b90: 68 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  he..        #   
2ba0: 20 20 20 20 74 65 73 74 20 63 6f 6e 66 69 67 75      test configu
2bb0: 72 61 74 69 6f 6e 20 76 61 72 69 61 62 6c 65 20  ration variable 
2bc0: 69 73 20 61 6c 77 61 79 73 20 73 65 74 20 62 79  is always set by
2bd0: 20 74 68 65 20 74 65 73 74 20 73 75 69 74 65 0d   the test suite.
2be0: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
2bf0: 20 69 74 73 65 6c 66 3b 20 68 6f 77 65 76 65 72   itself; however
2c00: 2c 20 69 74 20 63 61 6e 20 62 65 20 6f 76 65 72  , it can be over
2c10: 72 69 64 64 65 6e 20 75 73 69 6e 67 20 74 68 65  ridden using the
2c20: 20 75 6e 73 65 74 20 63 6f 6d 6d 61 6e 64 0d 0a   unset command..
2c30: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
2c40: 66 72 6f 6d 20 74 68 65 20 2d 70 72 65 54 65 73  from the -preTes
2c50: 74 20 6f 70 74 69 6f 6e 20 74 6f 20 74 68 65 20  t option to the 
2c60: 74 65 73 74 20 73 75 69 74 65 2e 0d 0a 20 20 20  test suite...   
2c70: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
2c80: 72 65 74 75 72 6e 20 24 3a 3a 65 61 67 6c 65 5f  return $::eagle_
2c90: 70 6c 61 74 66 6f 72 6d 28 63 6f 6e 66 69 67 75  platform(configu
2ca0: 72 61 74 69 6f 6e 29 0d 0a 20 20 20 20 20 20 7d  ration)..      }
2cb0: 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
2cc0: 70 72 6f 63 20 67 65 74 42 75 69 6c 64 43 6f 6e  proc getBuildCon
2cd0: 66 69 67 75 72 61 74 69 6f 6e 73 20 7b 7d 20 7b  figurations {} {
2ce0: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
2cf0: 20 23 20 4e 4f 54 45 3a 20 53 65 65 20 69 66 20   # NOTE: See if 
2d00: 74 68 65 20 6c 69 73 74 20 6f 66 20 74 65 73 74  the list of test
2d10: 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 73 20   configurations 
2d20: 68 61 73 20 62 65 65 6e 20 6f 76 65 72 72 69 64  has been overrid
2d30: 64 65 6e 20 62 79 0d 0a 20 20 20 20 20 20 23 20  den by..      # 
2d40: 20 20 20 20 20 20 74 68 65 20 75 73 65 72 20 28        the user (
2d50: 65 2e 67 2e 20 6f 6e 20 74 68 65 20 63 6f 6d 6d  e.g. on the comm
2d60: 61 6e 64 20 6c 69 6e 65 29 2e 0d 0a 20 20 20 20  and line)...    
2d70: 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b    #..      if {[
2d80: 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 74 65  info exists ::te
2d90: 73 74 5f 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  st_configuration
2da0: 73 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20  s] && \..       
2db0: 20 20 20 5b 6c 6c 65 6e 67 74 68 20 24 3a 3a 74     [llength $::t
2dc0: 65 73 74 5f 63 6f 6e 66 69 67 75 72 61 74 69 6f  est_configuratio
2dd0: 6e 73 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d  ns] > 0} then {.
2de0: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
2df0: 20 20 20 20 23 20 4e 4f 54 45 3a 20 55 73 65 20      # NOTE: Use 
2e00: 74 68 65 20 73 70 65 63 69 66 69 65 64 20 6c 69  the specified li
2e10: 73 74 20 6f 66 20 74 65 73 74 20 63 6f 6e 66 69  st of test confi
2e20: 67 75 72 61 74 69 6f 6e 73 2e 0d 0a 20 20 20 20  gurations...    
2e30: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72      #..        r
2e40: 65 74 75 72 6e 20 24 3a 3a 74 65 73 74 5f 63 6f  eturn $::test_co
2e50: 6e 66 69 67 75 72 61 74 69 6f 6e 73 0d 0a 20 20  nfigurations..  
2e60: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
2e70: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
2e80: 20 23 20 4e 4f 54 45 3a 20 55 73 65 20 74 68 65   # NOTE: Use the
2e90: 20 64 65 66 61 75 6c 74 20 6c 69 73 74 20 6f 66   default list of
2ea0: 20 74 65 73 74 20 63 6f 6e 66 69 67 75 72 61 74   test configurat
2eb0: 69 6f 6e 73 2e 0d 0a 20 20 20 20 20 20 20 20 23  ions...        #
2ec0: 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ..        return
2ed0: 20 5b 6c 69 73 74 20 44 65 62 75 67 20 52 65 6c   [list Debug Rel
2ee0: 65 61 73 65 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a  ease]..      }..
2ef0: 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
2f00: 6f 63 20 67 65 74 42 75 69 6c 64 42 61 73 65 44  oc getBuildBaseD
2f10: 69 72 65 63 74 6f 72 79 20 7b 7d 20 7b 0d 0a 20  irectory {} {.. 
2f20: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
2f30: 4e 4f 54 45 3a 20 46 69 67 75 72 65 20 6f 75 74  NOTE: Figure out
2f40: 20 74 68 65 20 62 61 73 65 20 64 69 72 65 63 74   the base direct
2f50: 6f 72 79 20 77 68 65 72 65 20 61 6c 6c 20 74 68  ory where all th
2f60: 65 20 62 75 69 6c 64 73 20 73 68 6f 75 6c 64 20  e builds should 
2f70: 62 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  be..      #     
2f80: 20 20 6c 6f 63 61 74 65 64 2e 20 20 54 68 69 73    located.  This
2f90: 20 77 69 6c 6c 20 62 65 20 74 68 65 20 64 69 72   will be the dir
2fa0: 65 63 74 6f 72 79 20 74 68 61 74 20 63 6f 6e 74  ectory that cont
2fb0: 61 69 6e 73 20 74 68 65 20 61 63 74 75 61 6c 0d  ains the actual.
2fc0: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 62  .      #       b
2fd0: 75 69 6c 64 20 6f 75 74 70 75 74 20 64 69 72 65  uild output dire
2fe0: 63 74 6f 72 79 20 28 65 2e 67 2e 20 70 61 72 65  ctory (e.g. pare
2ff0: 6e 74 20 6f 66 20 22 62 69 6e 22 29 2e 0d 0a 20  nt of "bin")... 
3000: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66       #..      if
3010: 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a   {[info exists :
3020: 3a 62 75 69 6c 64 5f 62 61 73 65 5f 64 69 72 65  :build_base_dire
3030: 63 74 6f 72 79 5d 20 26 26 20 5c 0d 0a 20 20 20  ctory] && \..   
3040: 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c         [string l
3050: 65 6e 67 74 68 20 24 3a 3a 62 75 69 6c 64 5f 62  ength $::build_b
3060: 61 73 65 5f 64 69 72 65 63 74 6f 72 79 5d 20 3e  ase_directory] >
3070: 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
3080: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
3090: 20 4e 4f 54 45 3a 20 54 68 65 20 6c 6f 63 61 74   NOTE: The locat
30a0: 69 6f 6e 20 6f 66 20 74 68 65 20 62 75 69 6c 64  ion of the build
30b0: 20 62 61 73 65 20 64 69 72 65 63 74 6f 72 79 20   base directory 
30c0: 68 61 73 20 62 65 65 6e 20 6f 76 65 72 72 69 64  has been overrid
30d0: 64 65 6e 3b 0d 0a 20 20 20 20 20 20 20 20 23 20  den;..        # 
30e0: 20 20 20 20 20 20 74 68 65 72 65 66 6f 72 65 2c        therefore,
30f0: 20 75 73 65 20 69 74 20 76 65 72 62 61 74 69 6d   use it verbatim
3100: 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
3110: 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 3a 3a        return $::
3120: 62 75 69 6c 64 5f 62 61 73 65 5f 64 69 72 65 63  build_base_direc
3130: 74 6f 72 79 0d 0a 20 20 20 20 20 20 7d 20 65 6c  tory..      } el
3140: 73 65 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73  seif {[info exis
3150: 74 73 20 3a 3a 63 6f 6d 6d 6f 6e 5f 64 69 72 65  ts ::common_dire
3160: 63 74 6f 72 79 5d 20 26 26 20 5c 0d 0a 20 20 20  ctory] && \..   
3170: 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c         [string l
3180: 65 6e 67 74 68 20 24 3a 3a 63 6f 6d 6d 6f 6e 5f  ength $::common_
3190: 64 69 72 65 63 74 6f 72 79 5d 20 3e 20 30 7d 20  directory] > 0} 
31a0: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
31b0: 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
31c0: 45 3a 20 4e 65 78 74 2c 20 66 61 6c 6c 62 61 63  E: Next, fallbac
31d0: 6b 20 74 6f 20 74 68 65 20 67 72 61 6e 64 70 61  k to the grandpa
31e0: 72 65 6e 74 20 64 69 72 65 63 74 6f 72 79 20 6f  rent directory o
31f0: 66 20 74 68 65 20 6f 6e 65 0d 0a 20 20 20 20 20  f the one..     
3200: 20 20 20 23 20 20 20 20 20 20 20 63 6f 6e 74 61     #       conta
3210: 69 6e 69 6e 67 20 74 68 69 73 20 66 69 6c 65 20  ining this file 
3220: 28 69 2e 65 2e 20 22 63 6f 6d 6d 6f 6e 2e 65 61  (i.e. "common.ea
3230: 67 6c 65 22 29 2c 20 69 66 20 61 76 61 69 6c 61  gle"), if availa
3240: 62 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  ble...        #.
3250: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
3260: 5b 66 69 6c 65 20 64 69 72 6e 61 6d 65 20 5b 66  [file dirname [f
3270: 69 6c 65 20 64 69 72 6e 61 6d 65 20 24 3a 3a 63  ile dirname $::c
3280: 6f 6d 6d 6f 6e 5f 64 69 72 65 63 74 6f 72 79 5d  ommon_directory]
3290: 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 69  ]..      } elsei
32a0: 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20  f {[info exists 
32b0: 3a 3a 70 61 74 68 5d 20 26 26 20 5c 0d 0a 20 20  ::path] && \..  
32c0: 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20          [string 
32d0: 6c 65 6e 67 74 68 20 24 3a 3a 70 61 74 68 5d 20  length $::path] 
32e0: 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  > 0} then {..   
32f0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
3300: 23 20 4e 4f 54 45 3a 20 46 69 6e 61 6c 6c 79 2c  # NOTE: Finally,
3310: 20 66 61 6c 6c 62 61 63 6b 20 74 6f 20 74 68 65   fallback to the
3320: 20 70 61 72 65 6e 74 20 64 69 72 65 63 74 6f 72   parent director
3330: 79 20 6f 66 20 74 68 65 20 45 61 67 6c 65 54 65  y of the EagleTe
3340: 73 74 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  st..        #   
3350: 20 20 20 20 70 61 74 68 2e 20 20 54 68 65 20 45      path.  The E
3360: 61 67 6c 65 54 65 73 74 20 70 61 63 6b 61 67 65  agleTest package
3370: 20 67 75 61 72 61 6e 74 65 65 73 20 74 68 61 74   guarantees that
3380: 20 74 68 69 73 20 76 61 72 69 61 62 6c 65 0d 0a   this variable..
3390: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
33a0: 77 69 6c 6c 20 62 65 20 73 65 74 20 74 6f 20 74  will be set to t
33b0: 68 65 20 64 69 72 65 63 74 6f 72 79 20 63 6f 6e  he directory con
33c0: 74 61 69 6e 69 6e 67 20 74 68 65 20 66 69 72 73  taining the firs
33d0: 74 20 66 69 6c 65 20 74 6f 0d 0a 20 20 20 20 20  t file to..     
33e0: 20 20 20 23 20 20 20 20 20 20 20 65 78 65 63 75     #       execu
33f0: 74 65 20 74 68 65 20 5b 72 75 6e 54 65 73 74 50  te the [runTestP
3400: 72 6f 6c 6f 67 75 65 5d 20 73 63 72 69 70 74 20  rologue] script 
3410: 6c 69 62 72 61 72 79 20 70 72 6f 63 65 64 75 72  library procedur
3420: 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  e...        #.. 
3430: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b 66         return [f
3440: 69 6c 65 20 64 69 72 6e 61 6d 65 20 24 3a 3a 70  ile dirname $::p
3450: 61 74 68 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c  ath]..      } el
3460: 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d  se {..        #.
3470: 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
3480: 20 4e 6f 20 70 61 74 68 20 69 73 20 61 76 61 69   No path is avai
3490: 6c 61 62 6c 65 2c 20 72 65 74 75 72 6e 20 61 6e  lable, return an
34a0: 20 65 6d 70 74 79 20 73 74 72 69 6e 67 2e 20 20   empty string.  
34b0: 54 68 69 73 20 70 6f 69 6e 74 0d 0a 20 20 20 20  This point..    
34c0: 20 20 20 20 23 20 20 20 20 20 20 20 73 68 6f 75      #       shou
34d0: 6c 64 20 6e 6f 74 20 62 65 20 72 65 61 63 68 65  ld not be reache
34e0: 64 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  d...        #.. 
34f0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 22 22         return ""
3500: 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d  ..      }..    }
3510: 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65  .....    proc ge
3520: 74 53 51 4c 69 74 65 54 65 73 74 44 61 74 61 50  tSQLiteTestDataP
3530: 61 74 68 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20  ath {} {..      
3540: 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
3550: 20 46 69 67 75 72 65 20 6f 75 74 20 74 68 65 20   Figure out the 
3560: 64 69 72 65 63 74 6f 72 79 20 77 68 65 72 65 20  directory where 
3570: 61 6c 6c 20 74 68 65 20 74 65 73 74 20 64 61 74  all the test dat
3580: 61 20 66 69 6c 65 73 20 73 68 6f 75 6c 64 0d 0a  a files should..
3590: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 62 65        #       be
35a0: 20 6c 6f 63 61 74 65 64 2e 20 20 54 68 69 73 20   located.  This 
35b0: 73 68 6f 75 6c 64 20 62 65 20 74 68 65 20 22 64  should be the "d
35c0: 61 74 61 22 20 64 69 72 65 63 74 6f 72 79 20 62  ata" directory b
35d0: 65 6e 65 61 74 68 20 74 68 65 0d 0a 20 20 20 20  eneath the..    
35e0: 20 20 23 20 20 20 20 20 20 20 64 69 72 65 63 74    #       direct
35f0: 6f 72 79 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ory containing t
3600: 68 65 20 61 63 74 75 61 6c 20 74 65 73 74 20 73  he actual test s
3610: 63 72 69 70 74 73 2e 0d 0a 20 20 20 20 20 20 23  cripts...      #
3620: 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b  ..      return [
3630: 66 69 6c 65 20 6a 6f 69 6e 20 24 3a 3a 70 61 74  file join $::pat
3640: 68 20 64 61 74 61 5d 0d 0a 20 20 20 20 7d 0d 0a  h data]..    }..
3650: 0c 0d 0a 20 20 20 20 70 72 6f 63 20 69 73 52 75  ...    proc isRu
3660: 6e 6e 69 6e 67 57 6f 57 36 34 20 7b 7d 20 7b 0d  nningWoW64 {} {.
3670: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
3680: 23 20 4e 4f 54 45 3a 20 46 6f 72 20 6e 6f 77 2c  # NOTE: For now,
3690: 20 6a 75 73 74 20 75 73 65 20 74 68 65 20 65 78   just use the ex
36a0: 69 73 74 69 6e 67 20 74 65 73 74 20 63 6f 6e 73  isting test cons
36b0: 74 72 61 69 6e 74 20 66 6f 72 20 64 65 74 65 63  traint for detec
36c0: 74 69 6e 67 0d 0a 20 20 20 20 20 20 23 20 20 20  ting..      #   
36d0: 20 20 20 20 61 20 57 6f 57 36 34 20 70 72 6f 63      a WoW64 proc
36e0: 65 73 73 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ess...      #.. 
36f0: 20 20 20 20 20 72 65 74 75 72 6e 20 5b 68 61 76       return [hav
3700: 65 43 6f 6e 73 74 72 61 69 6e 74 20 77 6f 77 36  eConstraint wow6
3710: 34 5d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20  4]..    }.....  
3720: 20 20 70 72 6f 63 20 69 73 4d 69 78 65 64 4d 6f    proc isMixedMo
3730: 64 65 41 73 73 65 6d 62 6c 79 20 7b 20 66 69 6c  deAssembly { fil
3740: 65 4e 61 6d 65 20 7b 76 61 72 4e 61 6d 65 20 22  eName {varName "
3750: 22 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d  "} } {..      #.
3760: 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 46  .      # NOTE: F
3770: 69 72 73 74 2c 20 6d 61 6b 65 20 73 75 72 65 20  irst, make sure 
3780: 74 68 65 20 74 65 73 74 20 73 75 69 74 65 20 69  the test suite i
3790: 6e 66 72 61 73 74 72 75 63 74 75 72 65 20 69 73  nfrastructure is
37a0: 20 61 6c 6c 6f 77 65 64 20 74 6f 0d 0a 20 20 20   allowed to..   
37b0: 20 20 20 23 20 20 20 20 20 20 20 75 73 65 20 74     #       use t
37c0: 68 65 20 5b 65 78 65 63 5d 20 63 6f 6d 6d 61 6e  he [exec] comman
37d0: 64 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  d...      #..   
37e0: 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78     if {![info ex
37f0: 69 73 74 73 20 3a 3a 6e 6f 28 65 78 65 63 29 5d  ists ::no(exec)]
3800: 20 26 26 20 21 5b 69 6e 66 6f 20 65 78 69 73 74   && ![info exist
3810: 73 20 3a 3a 6e 6f 28 63 6f 72 46 6c 61 67 73 29  s ::no(corFlags)
3820: 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
3830: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
3840: 4e 4f 54 45 3a 20 49 66 20 74 68 65 20 6c 6f 63  NOTE: If the loc
3850: 61 74 69 6f 6e 20 6f 66 20 43 6f 72 46 6c 61 67  ation of CorFlag
3860: 73 20 69 73 20 70 72 65 73 65 6e 74 20 69 6e 20  s is present in 
3870: 74 68 65 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 2c  the environment,
3880: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
3890: 20 20 75 73 65 20 69 74 3b 20 6f 74 68 65 72 77    use it; otherw
38a0: 69 73 65 20 61 73 73 75 6d 65 20 69 74 20 69 73  ise assume it is
38b0: 20 69 6e 20 74 68 65 20 50 41 54 48 2e 0d 0a 20   in the PATH... 
38c0: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
38d0: 20 20 73 65 74 20 63 6f 72 46 6c 61 67 73 20 5b    set corFlags [
38e0: 65 78 70 72 20 7b 0d 0a 20 20 20 20 20 20 20 20  expr {..        
38f0: 20 20 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a    [info exists :
3900: 3a 65 6e 76 28 43 6f 72 46 6c 61 67 73 29 5d 20  :env(CorFlags)] 
3910: 3f 20 24 3a 3a 65 6e 76 28 43 6f 72 46 6c 61 67  ? $::env(CorFlag
3920: 73 29 20 3a 20 22 43 6f 72 46 6c 61 67 73 22 0d  s) : "CorFlags".
3930: 0a 20 20 20 20 20 20 20 20 7d 5d 0d 0a 0d 0a 20  .        }].... 
3940: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
3950: 20 20 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70    # NOTE: Attemp
3960: 74 20 74 6f 20 65 78 65 63 75 74 65 20 43 6f 72  t to execute Cor
3970: 46 6c 61 67 73 20 6f 6e 20 74 68 65 20 73 70 65  Flags on the spe
3980: 63 69 66 69 65 64 20 66 69 6c 65 2e 0d 0a 20 20  cified file...  
3990: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
39a0: 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20   if {[catch {.. 
39b0: 20 20 20 20 20 20 20 20 20 65 78 65 63 20 2d 2d           exec --
39c0: 20 24 63 6f 72 46 6c 61 67 73 20 5b 66 69 6c 65   $corFlags [file
39d0: 20 6e 61 74 69 76 65 6e 61 6d 65 20 24 66 69 6c   nativename $fil
39e0: 65 4e 61 6d 65 5d 0d 0a 20 20 20 20 20 20 20 20  eName]..        
39f0: 7d 20 65 78 65 63 5d 20 3d 3d 20 30 7d 20 74 68  } exec] == 0} th
3a00: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
3a10: 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e  #..          # N
3a20: 4f 54 45 3a 20 49 66 20 72 65 71 75 65 73 74 65  OTE: If requeste
3a30: 64 20 62 79 20 6f 75 72 20 63 61 6c 6c 65 72 2c  d by our caller,
3a40: 20 61 74 74 65 6d 70 74 20 74 6f 20 64 65 74 65   attempt to dete
3a50: 72 6d 69 6e 65 20 74 68 65 0d 0a 20 20 20 20 20  rmine the..     
3a60: 20 20 20 20 20 23 20 20 20 20 20 20 20 70 6c 61       #       pla
3a70: 74 66 6f 72 6d 20 66 6f 72 20 74 68 65 20 73 70  tform for the sp
3a80: 65 63 69 66 69 65 64 20 66 69 6c 65 20 61 73 20  ecified file as 
3a90: 77 65 6c 6c 2e 0d 0a 20 20 20 20 20 20 20 20 20  well...         
3aa0: 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66   #..          if
3ab0: 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68   {[string length
3ac0: 20 24 76 61 72 4e 61 6d 65 5d 20 3e 20 30 7d 20   $varName] > 0} 
3ad0: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
3ae0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
3af0: 20 20 20 23 20 4e 4f 54 45 3a 20 53 74 6f 72 65     # NOTE: Store
3b00: 20 74 68 65 20 70 6c 61 74 66 6f 72 6d 20 69 6e   the platform in
3b10: 20 74 68 65 20 6e 61 6d 65 64 20 76 61 72 69 61   the named varia
3b20: 62 6c 65 20 69 6e 20 74 68 65 0d 0a 20 20 20 20  ble in the..    
3b30: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
3b40: 63 6f 6e 74 65 78 74 20 6f 66 20 6f 75 72 20 63  context of our c
3b50: 61 6c 6c 65 72 2e 0d 0a 20 20 20 20 20 20 20 20  aller...        
3b60: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
3b70: 20 20 20 75 70 76 61 72 20 31 20 24 76 61 72 4e     upvar 1 $varN
3b80: 61 6d 65 20 70 6c 61 74 66 6f 72 6d 0d 0a 0d 0a  ame platform....
3b90: 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20              #.. 
3ba0: 20 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54             # NOT
3bb0: 45 3a 20 41 74 74 65 6d 70 74 20 74 6f 20 65 78  E: Attempt to ex
3bc0: 74 72 61 63 74 20 74 68 65 20 50 45 20 6c 69 6e  tract the PE lin
3bd0: 65 20 66 72 6f 6d 20 74 68 65 20 63 61 70 74 75  e from the captu
3be0: 72 65 64 0d 0a 20 20 20 20 20 20 20 20 20 20 20  red..           
3bf0: 20 23 20 20 20 20 20 20 20 6f 75 74 70 75 74 2e   #       output.
3c00: 20 20 49 66 20 74 68 69 73 20 76 61 6c 75 65 20    If this value 
3c10: 69 73 20 22 50 45 33 32 22 20 6f 72 20 22 50 45  is "PE32" or "PE
3c20: 33 32 2b 22 2c 20 74 68 65 0d 0a 20 20 20 20 20  32+", the..     
3c30: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 61         #       a
3c40: 73 73 65 6d 62 6c 79 20 66 69 6c 65 20 69 73 20  ssembly file is 
3c50: 33 32 2d 62 69 74 20 6f 72 20 36 34 2d 62 69 74  32-bit or 64-bit
3c60: 2c 20 72 65 73 70 65 63 74 69 76 65 6c 79 3b 0d  , respectively;.
3c70: 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 20 20  .            #  
3c80: 20 20 20 20 20 6f 74 68 65 72 77 69 73 65 2c 20       otherwise, 
3c90: 69 74 73 20 74 79 70 65 20 69 73 20 75 6e 6b 6e  its type is unkn
3ca0: 6f 77 6e 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  own...          
3cb0: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20    #..           
3cc0: 20 73 65 74 20 70 61 74 74 65 72 6e 20 7b 5e 50   set pattern {^P
3cd0: 45 20 20 20 20 20 20 20 20 3a 20 28 50 45 33 32  E        : (PE32
3ce0: 7c 50 45 33 32 5c 2b 29 5c 73 2b 24 7d 0d 0a 0d  |PE32\+)\s+$}...
3cf0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20  .            if 
3d00: 7b 5b 72 65 67 65 78 70 20 2d 6c 69 6e 65 20 2d  {[regexp -line -
3d10: 2d 20 24 70 61 74 74 65 72 6e 20 24 65 78 65 63  - $pattern $exec
3d20: 20 64 75 6d 6d 79 20 70 65 33 32 5d 7d 20 74 68   dummy pe32]} th
3d30: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
3d40: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
3d50: 20 20 20 20 20 23 20 48 41 43 4b 3a 20 54 68 69       # HACK: Thi
3d60: 73 20 5b 73 77 69 74 63 68 5d 20 61 73 73 75 6d  s [switch] assum
3d70: 65 73 20 74 68 61 74 20 33 32 2d 62 69 74 20 65  es that 32-bit e
3d80: 78 65 63 75 74 61 62 6c 65 73 20 61 72 65 0d 0a  xecutables are..
3d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20                # 
3da0: 20 20 20 20 20 20 61 6c 77 61 79 73 20 78 38 36        always x86
3db0: 20 61 6e 64 20 74 68 61 74 20 36 34 2d 62 69 74   and that 64-bit
3dc0: 20 65 78 65 63 75 74 61 62 6c 65 73 20 61 72 65   executables are
3dd0: 20 61 6c 77 61 79 73 0d 0a 20 20 20 20 20 20 20   always..       
3de0: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 78         #       x
3df0: 36 34 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20  64...           
3e00: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
3e10: 20 20 20 20 73 77 69 74 63 68 20 2d 65 78 61 63      switch -exac
3e20: 74 20 2d 2d 20 24 70 65 33 32 20 7b 0d 0a 20 20  t -- $pe32 {..  
3e30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50 45                PE
3e40: 33 32 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  32 {..          
3e50: 20 20 20 20 20 20 20 20 73 65 74 20 70 6c 61 74          set plat
3e60: 66 6f 72 6d 20 57 69 6e 33 32 0d 0a 20 20 20 20  form Win32..    
3e70: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
3e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50                 P
3e90: 45 33 32 2b 20 7b 0d 0a 20 20 20 20 20 20 20 20  E32+ {..        
3ea0: 20 20 20 20 20 20 20 20 20 20 73 65 74 20 70 6c            set pl
3eb0: 61 74 66 6f 72 6d 20 78 36 34 0d 0a 20 20 20 20  atform x64..    
3ec0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
3ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64                 d
3ee0: 65 66 61 75 6c 74 20 7b 0d 0a 20 20 20 20 20 20  efault {..      
3ef0: 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20              set 
3f00: 70 6c 61 74 66 6f 72 6d 20 22 22 0d 0a 20 20 20  platform ""..   
3f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a               }..
3f20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d                }.
3f30: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 20 65  .            } e
3f40: 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  lse {..         
3f50: 20 20 20 20 20 73 65 74 20 70 6c 61 74 66 6f 72       set platfor
3f60: 6d 20 22 22 0d 0a 20 20 20 20 20 20 20 20 20 20  m ""..          
3f70: 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d    }..          }
3f80: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d  ....          #.
3f90: 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54  .          # NOT
3fa0: 45 3a 20 41 74 74 65 6d 70 74 20 74 6f 20 65 78  E: Attempt to ex
3fb0: 74 72 61 63 74 20 74 68 65 20 49 4c 4f 4e 4c 59  tract the ILONLY
3fc0: 20 6c 69 6e 65 20 66 72 6f 6d 20 74 68 65 20 63   line from the c
3fd0: 61 70 74 75 72 65 64 0d 0a 20 20 20 20 20 20 20  aptured..       
3fe0: 20 20 20 23 20 20 20 20 20 20 20 6f 75 74 70 75     #       outpu
3ff0: 74 2e 20 20 49 66 20 74 68 69 73 20 76 61 6c 75  t.  If this valu
4000: 65 20 69 73 20 7a 65 72 6f 2c 20 74 68 65 20 73  e is zero, the s
4010: 70 65 63 69 66 69 65 64 20 66 69 6c 65 20 6d 75  pecified file mu
4020: 73 74 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20  st..          # 
4030: 20 20 20 20 20 20 62 65 20 61 20 6d 69 78 65 64        be a mixed
4040: 2d 6d 6f 64 65 20 61 73 73 65 6d 62 6c 79 3b 20  -mode assembly; 
4050: 6f 74 68 65 72 77 69 73 65 2c 20 69 74 20 63 6f  otherwise, it co
4060: 6e 74 61 69 6e 73 20 6f 6e 6c 79 0d 0a 20 20 20  ntains only..   
4070: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 6d         #       m
4080: 61 6e 61 67 65 64 20 63 6f 6d 70 6f 6e 65 6e 74  anaged component
4090: 73 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d  s...          #.
40a0: 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20 70  .          set p
40b0: 61 74 74 65 72 6e 20 7b 5e 49 4c 4f 4e 4c 59 20  attern {^ILONLY 
40c0: 20 20 20 3a 20 28 30 7c 31 29 5c 73 2b 24 7d 0d     : (0|1)\s+$}.
40d0: 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20  ...          if 
40e0: 7b 21 5b 72 65 67 65 78 70 20 2d 6c 69 6e 65 20  {![regexp -line 
40f0: 2d 2d 20 24 70 61 74 74 65 72 6e 20 24 65 78 65  -- $pattern $exe
4100: 63 20 64 75 6d 6d 79 20 69 6c 4f 6e 6c 79 5d 7d  c dummy ilOnly]}
4110: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
4120: 20 20 20 20 20 72 65 74 75 72 6e 20 66 61 6c 73       return fals
4130: 65 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  e..          }..
4140: 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b  ..          if {
4150: 21 24 69 6c 4f 6e 6c 79 7d 20 74 68 65 6e 20 7b  !$ilOnly} then {
4160: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65  ..            re
4170: 74 75 72 6e 20 74 72 75 65 0d 0a 20 20 20 20 20  turn true..     
4180: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
4190: 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  }..      }....  
41a0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
41b0: 4f 54 45 3a 20 49 66 20 74 68 65 20 74 65 73 74  OTE: If the test
41c0: 20 73 75 69 74 65 20 63 61 6e 6e 6f 74 20 75 73   suite cannot us
41d0: 65 20 5b 65 78 65 63 5d 20 6f 72 20 65 78 65 63  e [exec] or exec
41e0: 75 74 69 6f 6e 20 6f 66 20 43 6f 72 46 6c 61 67  ution of CorFlag
41f0: 73 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  s..      #      
4200: 20 66 61 69 6c 65 64 2c 20 72 65 74 75 72 6e 20   failed, return 
4210: 66 61 6c 73 65 2e 0d 0a 20 20 20 20 20 20 23 0d  false...      #.
4220: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 66 61  .      return fa
4230: 6c 73 65 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20  lse..    }..... 
4240: 20 20 20 70 72 6f 63 20 69 73 42 75 69 6c 64 41     proc isBuildA
4250: 76 61 69 6c 61 62 6c 65 20 7b 20 6e 61 74 69 76  vailable { nativ
4260: 65 20 64 69 72 65 63 74 6f 72 79 20 7b 76 61 72  e directory {var
4270: 4e 61 6d 65 20 22 22 7d 20 7d 20 7b 0d 0a 20 20  Name ""} } {..  
4280: 20 20 20 20 23 0d 0a 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 66  OTE: Build the f
42a0: 75 6c 6c 79 20 71 75 61 6c 69 66 69 65 64 20 66  ully qualified f
42b0: 69 6c 65 20 6e 61 6d 65 20 66 6f 72 20 74 68 65  ile name for the
42c0: 20 70 72 69 6d 61 72 79 20 61 73 73 65 6d 62 6c   primary assembl
42d0: 79 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  y..      #      
42e0: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
42f0: 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
4300: 74 65 20 6d 61 6e 61 67 65 64 20 63 6f 6d 70 6f  te managed compo
4310: 6e 65 6e 74 73 2e 20 20 49 74 0d 0a 20 20 20 20  nents.  It..    
4320: 20 20 23 20 20 20 20 20 20 20 73 68 6f 75 6c 64    #       should
4330: 20 62 65 20 6e 6f 74 65 64 20 74 68 61 74 20 74   be noted that t
4340: 68 69 73 20 61 73 73 65 6d 62 6c 79 20 66 69 6c  his assembly fil
4350: 65 20 6d 61 79 20 61 6c 73 6f 20 63 6f 6e 74 61  e may also conta
4360: 69 6e 20 74 68 65 0d 0a 20 20 20 20 20 20 23 20  in the..      # 
4370: 20 20 20 20 20 20 6e 61 74 69 76 65 20 63 6f 6d        native com
4380: 70 6f 6e 65 6e 74 73 2c 20 69 66 20 61 20 6e 61  ponents, if a na
4390: 74 69 76 65 20 62 75 69 6c 64 20 69 73 20 69 6e  tive build is in
43a0: 20 75 73 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a   use...      #..
43b0: 20 20 20 20 20 20 73 65 74 20 66 69 6c 65 4e 61        set fileNa
43c0: 6d 65 20 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e  me [file nativen
43d0: 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 24  ame [file join $
43e0: 64 69 72 65 63 74 6f 72 79 20 5c 0d 0a 20 20 20  directory \..   
43f0: 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61         System.Da
4400: 74 61 2e 53 51 4c 69 74 65 2e 64 6c 6c 5d 5d 0d  ta.SQLite.dll]].
4410: 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 21 5b 66  ...      if {![f
4420: 69 6c 65 20 65 78 69 73 74 73 20 24 66 69 6c 65  ile exists $file
4430: 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  Name]} then {.. 
4440: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 66 61         return fa
4450: 6c 73 65 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a  lse..      }....
4460: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
4470: 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74 20 74   NOTE: Attempt t
4480: 6f 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  o automatically 
4490: 64 65 74 65 63 74 20 69 66 20 74 68 65 20 70 72  detect if the pr
44a0: 69 6d 61 72 79 20 61 73 73 65 6d 62 6c 79 0d 0a  imary assembly..
44b0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63 6f        #       co
44c0: 6e 74 61 69 6e 73 20 61 6e 79 20 6e 61 74 69 76  ntains any nativ
44d0: 65 20 63 6f 6d 70 6f 6e 65 6e 74 73 2c 20 69 66  e components, if
44e0: 20 6e 65 63 65 73 73 61 72 79 2e 0d 0a 20 20 20   necessary...   
44f0: 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
4500: 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
4510: 6e 61 74 69 76 65 5d 20 3d 3d 20 30 7d 20 74 68  native] == 0} th
4520: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66  en {..        if
4530: 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68   {[string length
4540: 20 24 76 61 72 4e 61 6d 65 5d 20 3e 20 30 7d 20   $varName] > 0} 
4550: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
4560: 20 20 75 70 76 61 72 20 31 20 24 76 61 72 4e 61    upvar 1 $varNa
4570: 6d 65 20 24 76 61 72 4e 61 6d 65 0d 0a 20 20 20  me $varName..   
4580: 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
4590: 20 20 73 65 74 20 6e 61 74 69 76 65 20 5b 69 73    set native [is
45a0: 4d 69 78 65 64 4d 6f 64 65 41 73 73 65 6d 62 6c  MixedModeAssembl
45b0: 79 20 24 66 69 6c 65 4e 61 6d 65 20 24 76 61 72  y $fileName $var
45c0: 4e 61 6d 65 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a  Name]..      }..
45d0: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
45e0: 20 23 20 4e 4f 54 45 3a 20 49 66 20 74 68 65 20   # NOTE: If the 
45f0: 70 72 69 6d 61 72 79 20 61 73 73 65 6d 62 6c 79  primary assembly
4600: 20 61 6c 73 6f 20 63 6f 6e 74 61 69 6e 73 20 74   also contains t
4610: 68 65 20 6e 61 74 69 76 65 20 63 6f 6d 70 6f 6e  he native compon
4620: 65 6e 74 73 2c 0d 0a 20 20 20 20 20 20 23 20 20  ents,..      #  
4630: 20 20 20 20 20 77 65 20 68 61 76 65 20 65 76 65       we have eve
4640: 72 79 74 68 69 6e 67 20 77 65 20 6e 65 65 64 2e  rything we need.
4650: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
4660: 20 69 66 20 7b 24 6e 61 74 69 76 65 7d 20 74 68   if {$native} th
4670: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 72 65  en {..        re
4680: 74 75 72 6e 20 74 72 75 65 0d 0a 20 20 20 20 20  turn true..     
4690: 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20   }....      #.. 
46a0: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 57 68 61       # NOTE: Wha
46b0: 74 20 69 73 20 74 68 65 20 70 6c 61 74 66 6f 72  t is the platfor
46c0: 6d 20 66 6f 72 20 74 68 69 73 20 6d 61 63 68 69  m for this machi
46d0: 6e 65 3f 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  ne?..      #..  
46e0: 20 20 20 20 73 65 74 20 70 6c 61 74 66 6f 72 6d      set platform
46f0: 20 5b 6d 61 63 68 69 6e 65 54 6f 50 6c 61 74 66   [machineToPlatf
4700: 6f 72 6d 20 24 3a 3a 74 63 6c 5f 70 6c 61 74 66  orm $::tcl_platf
4710: 6f 72 6d 28 6d 61 63 68 69 6e 65 29 5d 0d 0a 0d  orm(machine)]...
4720: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
4730: 23 20 4e 4f 54 45 3a 20 42 75 69 6c 64 20 74 68  # NOTE: Build th
4740: 65 20 66 75 6c 6c 79 20 71 75 61 6c 69 66 69 65  e fully qualifie
4750: 64 20 66 69 6c 65 20 6e 61 6d 65 20 66 6f 72 20  d file name for 
4760: 74 68 65 20 69 6e 74 65 72 6f 70 20 61 73 73 65  the interop asse
4770: 6d 62 6c 79 0d 0a 20 20 20 20 20 20 23 20 20 20  mbly..      #   
4780: 20 20 20 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74      containing t
4790: 68 65 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53  he System.Data.S
47a0: 51 4c 69 74 65 20 6e 61 74 69 76 65 20 63 6f 6d  QLite native com
47b0: 70 6f 6e 65 6e 74 73 2e 20 20 49 66 20 74 68 69  ponents.  If thi
47c0: 73 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  s..      #      
47d0: 20 66 69 6c 65 20 65 78 69 73 74 73 2c 20 77 65   file exists, we
47e0: 20 73 68 6f 75 6c 64 20 68 61 76 65 20 65 76 65   should have eve
47f0: 72 79 74 68 69 6e 67 20 77 65 20 6e 65 65 64 2e  rything we need.
4800: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
4810: 20 73 65 74 20 66 69 6c 65 4e 61 6d 65 20 5b 66   set fileName [f
4820: 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65 20 5b  ile nativename [
4830: 66 69 6c 65 20 6a 6f 69 6e 20 24 64 69 72 65 63  file join $direc
4840: 74 6f 72 79 20 5c 0d 0a 20 20 20 20 20 20 20 20  tory \..        
4850: 20 20 24 70 6c 61 74 66 6f 72 6d 20 53 51 4c 69    $platform SQLi
4860: 74 65 2e 49 6e 74 65 72 6f 70 2e 64 6c 6c 5d 5d  te.Interop.dll]]
4870: 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 66  ....      if {[f
4880: 69 6c 65 20 65 78 69 73 74 73 20 24 66 69 6c 65  ile exists $file
4890: 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  Name]} then {.. 
48a0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 72         return tr
48b0: 75 65 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  ue..      }.... 
48c0: 20 20 20 20 20 73 65 74 20 66 69 6c 65 4e 61 6d       set fileNam
48d0: 65 20 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e 61  e [file nativena
48e0: 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 24 64  me [file join $d
48f0: 69 72 65 63 74 6f 72 79 20 5c 0d 0a 20 20 20 20  irectory \..    
4900: 20 20 20 20 20 20 53 51 4c 69 74 65 2e 49 6e 74        SQLite.Int
4910: 65 72 6f 70 2e 64 6c 6c 5d 5d 0d 0a 0d 0a 20 20  erop.dll]]....  
4920: 20 20 20 20 69 66 20 7b 5b 66 69 6c 65 20 65 78      if {[file ex
4930: 69 73 74 73 20 24 66 69 6c 65 4e 61 6d 65 5d 7d  ists $fileName]}
4940: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
4950: 20 72 65 74 75 72 6e 20 74 72 75 65 0d 0a 20 20   return true..  
4960: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23      }....      #
4970: 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
4980: 42 75 69 6c 64 20 74 68 65 20 66 75 6c 6c 79 20  Build the fully 
4990: 71 75 61 6c 69 66 69 65 64 20 66 69 6c 65 20 6e  qualified file n
49a0: 61 6d 65 20 66 6f 72 20 74 68 65 20 53 51 4c 69  ame for the SQLi
49b0: 74 65 20 63 6f 72 65 0d 0a 20 20 20 20 20 20 23  te core..      #
49c0: 20 20 20 20 20 20 20 6c 69 62 72 61 72 79 2e 20         library. 
49d0: 20 49 66 20 74 68 69 73 20 66 69 6c 65 20 65 78   If this file ex
49e0: 69 73 74 73 2c 20 77 65 20 73 68 6f 75 6c 64 20  ists, we should 
49f0: 68 61 76 65 20 65 76 65 72 79 74 68 69 6e 67 20  have everything 
4a00: 77 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  we..      #     
4a10: 20 20 6e 65 65 64 2e 0d 0a 20 20 20 20 20 20 23    need...      #
4a20: 0d 0a 20 20 20 20 20 20 73 65 74 20 66 69 6c 65  ..      set file
4a30: 4e 61 6d 65 20 5b 66 69 6c 65 20 6e 61 74 69 76  Name [file nativ
4a40: 65 6e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e  ename [file join
4a50: 20 24 64 69 72 65 63 74 6f 72 79 20 5c 0d 0a 20   $directory \.. 
4a60: 20 20 20 20 20 20 20 20 20 24 70 6c 61 74 66 6f           $platfo
4a70: 72 6d 20 73 71 6c 69 74 65 33 2e 64 6c 6c 5d 5d  rm sqlite3.dll]]
4a80: 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 66  ....      if {[f
4a90: 69 6c 65 20 65 78 69 73 74 73 20 24 66 69 6c 65  ile exists $file
4aa0: 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  Name]} then {.. 
4ab0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 72         return tr
4ac0: 75 65 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  ue..      }.... 
4ad0: 20 20 20 20 20 73 65 74 20 66 69 6c 65 4e 61 6d       set fileNam
4ae0: 65 20 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e 61  e [file nativena
4af0: 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 24 64  me [file join $d
4b00: 69 72 65 63 74 6f 72 79 20 5c 0d 0a 20 20 20 20  irectory \..    
4b10: 20 20 20 20 20 20 73 71 6c 69 74 65 33 2e 64 6c        sqlite3.dl
4b20: 6c 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20  l]]....      if 
4b30: 7b 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24 66  {[file exists $f
4b40: 69 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b  ileName]} then {
4b50: 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ..        return
4b60: 20 74 72 75 65 0d 0a 20 20 20 20 20 20 7d 0d 0a   true..      }..
4b70: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
4b80: 20 23 20 4e 4f 54 45 3a 20 4f 6e 65 20 6f 72 20   # NOTE: One or 
4b90: 6d 6f 72 65 20 6e 61 74 69 76 65 20 63 6f 6d 70  more native comp
4ba0: 6f 6e 65 6e 74 73 20 6e 65 65 64 65 64 20 62 79  onents needed by
4bb0: 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c   System.Data.SQL
4bc0: 69 74 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ite..      #    
4bd0: 20 20 20 61 72 65 20 6d 69 73 73 69 6e 67 2e 0d     are missing..
4be0: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
4bf0: 72 65 74 75 72 6e 20 66 61 6c 73 65 0d 0a 20 20  return false..  
4c00: 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
4c10: 20 69 73 52 65 6c 65 61 73 65 41 76 61 69 6c 61   isReleaseAvaila
4c20: 62 6c 65 20 7b 20 64 69 72 65 63 74 6f 72 79 20  ble { directory 
4c30: 7b 76 61 72 4e 61 6d 65 20 22 22 7d 20 7d 20 7b  {varName ""} } {
4c40: 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72  ..      if {[str
4c50: 69 6e 67 20 6c 65 6e 67 74 68 20 24 76 61 72 4e  ing length $varN
4c60: 61 6d 65 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b  ame] > 0} then {
4c70: 0d 0a 20 20 20 20 20 20 20 20 75 70 76 61 72 20  ..        upvar 
4c80: 31 20 24 76 61 72 4e 61 6d 65 20 24 76 61 72 4e  1 $varName $varN
4c90: 61 6d 65 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a  ame..      }....
4ca0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b 69 73        return [is
4cb0: 42 75 69 6c 64 41 76 61 69 6c 61 62 6c 65 20 22  BuildAvailable "
4cc0: 22 20 24 64 69 72 65 63 74 6f 72 79 20 24 76 61  " $directory $va
4cd0: 72 4e 61 6d 65 5d 0d 0a 20 20 20 20 7d 0d 0a 0c  rName]..    }...
4ce0: 0d 0a 20 20 20 20 70 72 6f 63 20 6a 6f 69 6e 42  ..    proc joinB
4cf0: 75 69 6c 64 44 69 72 65 63 74 6f 72 79 20 7b 20  uildDirectory { 
4d00: 6e 61 74 69 76 65 20 70 61 74 68 20 79 65 61 72  native path year
4d10: 20 70 6c 61 74 66 6f 72 6d 20 63 6f 6e 66 69 67   platform config
4d20: 75 72 61 74 69 6f 6e 20 7d 20 7b 0d 0a 20 20 20  uration } {..   
4d30: 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
4d40: 54 45 3a 20 46 69 67 75 72 65 20 6f 75 74 20 61  TE: Figure out a
4d50: 6e 64 20 74 68 65 6e 20 72 65 74 75 72 6e 20 74  nd then return t
4d60: 68 65 20 66 75 6c 6c 79 20 71 75 61 6c 69 66 69  he fully qualifi
4d70: 65 64 20 70 61 74 68 20 74 6f 20 74 68 65 20 62  ed path to the b
4d80: 75 69 6c 64 0d 0a 20 20 20 20 20 20 23 20 20 20  uild..      #   
4d90: 20 20 20 20 64 69 72 65 63 74 6f 72 79 20 62 61      directory ba
4da0: 73 65 64 20 6f 6e 20 61 6c 6c 20 74 68 65 20 61  sed on all the a
4db0: 72 67 75 6d 65 6e 74 73 20 70 72 6f 76 69 64 65  rguments provide
4dc0: 64 20 62 79 20 6f 75 72 20 63 61 6c 6c 65 72 2e  d by our caller.
4dd0: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
4de0: 20 69 66 20 7b 24 6e 61 74 69 76 65 7d 20 74 68   if {$native} th
4df0: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 72 65  en {..        re
4e00: 74 75 72 6e 20 5b 66 69 6c 65 20 6a 6f 69 6e 20  turn [file join 
4e10: 24 70 61 74 68 20 62 69 6e 20 24 79 65 61 72 20  $path bin $year 
4e20: 24 70 6c 61 74 66 6f 72 6d 20 24 63 6f 6e 66 69  $platform $confi
4e30: 67 75 72 61 74 69 6f 6e 5d 0d 0a 20 20 20 20 20  guration]..     
4e40: 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
4e50: 20 20 20 72 65 74 75 72 6e 20 5b 66 69 6c 65 20     return [file 
4e60: 6a 6f 69 6e 20 24 70 61 74 68 20 62 69 6e 20 24  join $path bin $
4e70: 79 65 61 72 20 24 63 6f 6e 66 69 67 75 72 61 74  year $configurat
4e80: 69 6f 6e 20 62 69 6e 5d 0d 0a 20 20 20 20 20 20  ion bin]..      
4e90: 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  }..    }.....   
4ea0: 20 70 72 6f 63 20 67 65 74 42 75 69 6c 64 44 69   proc getBuildDi
4eb0: 72 65 63 74 6f 72 79 20 7b 7d 20 7b 0d 0a 20 20  rectory {} {..  
4ec0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
4ed0: 4f 54 45 3a 20 53 65 65 20 69 66 20 74 68 65 20  OTE: See if the 
4ee0: 22 6e 61 74 69 76 65 22 20 72 75 6e 74 69 6d 65  "native" runtime
4ef0: 20 6f 70 74 69 6f 6e 20 68 61 73 20 62 65 65 6e   option has been
4f00: 20 73 65 74 2e 20 20 49 66 20 73 6f 2c 20 75 73   set.  If so, us
4f10: 65 20 74 68 65 0d 0a 20 20 20 20 20 20 23 20 20  e the..      #  
4f20: 20 20 20 20 20 64 69 72 65 63 74 6f 72 79 20 66       directory f
4f30: 6f 72 20 74 68 65 20 6d 69 78 65 64 2d 6d 6f 64  or the mixed-mod
4f40: 65 20 61 73 73 65 6d 62 6c 79 20 28 61 2e 6b 2e  e assembly (a.k.
4f50: 61 2e 20 74 68 65 20 6e 61 74 69 76 65 20 69 6e  a. the native in
4f60: 74 65 72 6f 70 0d 0a 20 20 20 20 20 20 23 20 20  terop..      #  
4f70: 20 20 20 20 20 61 73 73 65 6d 62 6c 79 29 2e 20       assembly). 
4f80: 20 54 6f 20 65 6e 61 62 6c 65 20 74 68 69 73 20   To enable this 
4f90: 6f 70 74 69 6f 6e 20 76 69 61 20 74 68 65 20 63  option via the c
4fa0: 6f 6d 6d 61 6e 64 20 6c 69 6e 65 2c 20 65 6e 74  ommand line, ent
4fb0: 65 72 20 61 0d 0a 20 20 20 20 20 20 23 20 20 20  er a..      #   
4fc0: 20 20 20 20 63 6f 6d 6d 61 6e 64 20 73 69 6d 69      command simi
4fd0: 6c 61 72 20 74 6f 20 6f 6e 65 20 6f 66 20 74 68  lar to one of th
4fe0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 28 61 6c 6c  e following (all
4ff0: 20 6f 6e 20 6f 6e 65 20 6c 69 6e 65 29 3a 0d 0a   on one line):..
5000: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
5010: 20 20 20 20 20 20 20 45 61 67 6c 65 53 68 65 6c         EagleShel
5020: 6c 2e 65 78 65 20 2d 69 6e 69 74 69 61 6c 69 7a  l.exe -initializ
5030: 65 20 2d 72 75 6e 74 69 6d 65 4f 70 74 69 6f 6e  e -runtimeOption
5040: 20 6e 61 74 69 76 65 0d 0a 20 20 20 20 20 20 23   native..      #
5050: 20 20 20 20 20 20 20 20 20 2d 66 69 6c 65 20 2e           -file .
5060: 5c 70 61 74 68 5c 74 6f 5c 61 6c 6c 2e 65 61 67  \path\to\all.eag
5070: 6c 65 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  le..      #..   
5080: 20 20 20 23 20 20 20 20 20 20 20 54 6f 20 65 6e     #       To en
5090: 61 62 6c 65 20 74 68 69 73 20 6f 70 74 69 6f 6e  able this option
50a0: 20 76 69 61 20 74 68 65 20 63 6f 6d 6d 61 6e 64   via the command
50b0: 20 6c 69 6e 65 20 70 72 69 6f 72 20 74 6f 20 74   line prior to t
50c0: 68 65 20 22 62 65 74 61 20 31 36 22 0d 0a 20 20  he "beta 16"..  
50d0: 20 20 20 20 23 20 20 20 20 20 20 20 72 65 6c 65      #       rele
50e0: 61 73 65 20 6f 66 20 45 61 67 6c 65 2c 20 74 68  ase of Eagle, th
50f0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6d 6d  e following comm
5100: 61 6e 64 20 6d 75 73 74 20 62 65 20 75 73 65 64  and must be used
5110: 20 69 6e 73 74 65 61 64 0d 0a 20 20 20 20 20 20   instead..      
5120: 23 20 20 20 20 20 20 20 28 61 6c 73 6f 20 61 6c  #       (also al
5130: 6c 20 6f 6e 20 6f 6e 65 20 6c 69 6e 65 29 3a 0d  l on one line):.
5140: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
5150: 23 20 20 20 20 20 20 20 45 61 67 6c 65 53 68 65  #       EagleShe
5160: 6c 6c 2e 65 78 65 20 2d 69 6e 69 74 69 61 6c 69  ll.exe -initiali
5170: 7a 65 20 2d 70 6f 73 74 49 6e 69 74 69 61 6c 69  ze -postInitiali
5180: 7a 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  ze..      #     
5190: 20 20 20 20 22 6f 62 6a 65 63 74 20 69 6e 76 6f      "object invo
51a0: 6b 65 20 49 6e 74 65 72 70 72 65 74 65 72 2e 47  ke Interpreter.G
51b0: 65 74 41 63 74 69 76 65 20 41 64 64 52 75 6e 74  etActive AddRunt
51c0: 69 6d 65 4f 70 74 69 6f 6e 20 6e 61 74 69 76 65  imeOption native
51d0: 22 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  "..      #      
51e0: 20 20 20 2d 66 69 6c 65 20 2e 5c 70 61 74 68 5c     -file .\path\
51f0: 74 6f 5c 61 6c 6c 2e 65 61 67 6c 65 0d 0a 20 20  to\all.eagle..  
5200: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20      #..      if 
5210: 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  {[info exists ::
5220: 62 75 69 6c 64 5f 64 69 72 65 63 74 6f 72 79 5d  build_directory]
5230: 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20   && \..         
5240: 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20   [string length 
5250: 24 3a 3a 62 75 69 6c 64 5f 64 69 72 65 63 74 6f  $::build_directo
5260: 72 79 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d  ry] > 0} then {.
5270: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
5280: 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 65 20      # NOTE: The 
5290: 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  location of the 
52a0: 62 75 69 6c 64 20 64 69 72 65 63 74 6f 72 79 20  build directory 
52b0: 68 61 73 20 62 65 65 6e 20 6f 76 65 72 72 69 64  has been overrid
52c0: 64 65 6e 3b 0d 0a 20 20 20 20 20 20 20 20 23 20  den;..        # 
52d0: 20 20 20 20 20 20 74 68 65 72 65 66 6f 72 65 2c        therefore,
52e0: 20 75 73 65 20 69 74 20 76 65 72 62 61 74 69 6d   use it verbatim
52f0: 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
5300: 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 3a 3a        return $::
5310: 62 75 69 6c 64 5f 64 69 72 65 63 74 6f 72 79 0d  build_directory.
5320: 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d  .      } else {.
5330: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
5340: 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 66 20 74      # NOTE: If t
5350: 68 65 20 22 6e 61 74 69 76 65 22 20 72 75 6e 74  he "native" runt
5360: 69 6d 65 20 6f 70 74 69 6f 6e 20 69 73 20 73 65  ime option is se
5370: 74 2c 20 74 68 65 20 6d 69 78 65 64 2d 6d 6f 64  t, the mixed-mod
5380: 65 20 61 73 73 65 6d 62 6c 79 0d 0a 20 20 20 20  e assembly..    
5390: 20 20 20 20 23 20 20 20 20 20 20 20 69 73 20 62      #       is b
53a0: 65 69 6e 67 20 74 65 73 74 65 64 2e 20 20 49 6e  eing tested.  In
53b0: 20 74 68 61 74 20 63 61 73 65 2c 20 74 68 65 20   that case, the 
53c0: 70 61 74 68 20 74 6f 20 74 68 65 20 62 75 69 6c  path to the buil
53d0: 64 20 64 69 72 65 63 74 6f 72 79 0d 0a 20 20 20  d directory..   
53e0: 20 20 20 20 20 23 20 20 20 20 20 20 20 77 69 6c       #       wil
53f0: 6c 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 70 6c  l contain the pl
5400: 61 74 66 6f 72 6d 20 6e 61 6d 65 20 61 6e 64 20  atform name and 
5410: 61 6c 6c 20 74 68 65 20 62 69 6e 61 72 69 65 73  all the binaries
5420: 20 75 6e 64 65 72 20 74 65 73 74 0d 0a 20 20 20   under test..   
5430: 20 20 20 20 20 23 20 20 20 20 20 20 20 73 68 6f       #       sho
5440: 75 6c 64 20 62 65 20 70 72 65 73 65 6e 74 20 69  uld be present i
5450: 6e 20 74 68 61 74 20 64 69 72 65 63 74 6f 72 79  n that directory
5460: 2e 20 20 49 66 20 74 68 65 20 22 6e 61 74 69 76  .  If the "nativ
5470: 65 22 20 72 75 6e 74 69 6d 65 0d 0a 20 20 20 20  e" runtime..    
5480: 20 20 20 20 23 20 20 20 20 20 20 20 6f 70 74 69      #       opti
5490: 6f 6e 20 69 73 20 6e 6f 74 20 73 65 74 2c 20 74  on is not set, t
54a0: 68 65 20 62 75 69 6c 64 20 64 69 72 65 63 74 6f  he build directo
54b0: 72 79 20 77 69 6c 6c 20 62 65 20 63 6f 6e 73 69  ry will be consi
54c0: 64 65 72 65 64 20 74 6f 20 62 65 0d 0a 20 20 20  dered to be..   
54d0: 20 20 20 20 20 23 20 20 20 20 20 20 20 22 70 6c       #       "pl
54e0: 61 74 66 6f 72 6d 2d 6e 65 75 74 72 61 6c 22 2c  atform-neutral",
54f0: 20 77 69 74 68 20 74 68 65 20 6e 6f 74 61 62 6c   with the notabl
5500: 65 20 65 78 63 65 70 74 69 6f 6e 20 6f 66 20 61  e exception of a
5510: 6e 79 20 6e 61 74 69 76 65 0d 0a 20 20 20 20 20  ny native..     
5520: 20 20 20 23 20 20 20 20 20 20 20 61 73 73 65 6d     #       assem
5530: 62 6c 79 20 28 65 2e 67 2e 20 22 53 51 4c 69 74  bly (e.g. "SQLit
5540: 65 2e 49 6e 74 65 72 6f 70 2e 64 6c 6c 22 29 20  e.Interop.dll") 
5550: 63 6f 70 69 65 64 20 74 68 65 72 65 20 64 75 72  copied there dur
5560: 69 6e 67 20 74 68 65 0d 0a 20 20 20 20 20 20 20  ing the..       
5570: 20 23 20 20 20 20 20 20 20 62 75 69 6c 64 20 70   #       build p
5580: 72 6f 63 65 73 73 20 69 74 73 65 6c 66 2e 20 20  rocess itself.  
5590: 49 66 20 74 68 65 20 62 75 69 6c 64 20 70 72 6f  If the build pro
55a0: 63 65 73 73 20 73 6f 6d 65 68 6f 77 20 64 6f 65  cess somehow doe
55b0: 73 20 6e 6f 74 0d 0a 20 20 20 20 20 20 20 20 23  s not..        #
55c0: 20 20 20 20 20 20 20 63 6f 70 79 20 74 68 65 20         copy the 
55d0: 6e 61 74 69 76 65 20 61 73 73 65 6d 62 6c 79 20  native assembly 
55e0: 66 6f 72 20 74 68 69 73 20 70 6c 61 74 66 6f 72  for this platfor
55f0: 6d 2c 20 6d 6f 73 74 20 6f 66 20 74 68 65 20 74  m, most of the t
5600: 65 73 74 73 0d 0a 20 20 20 20 20 20 20 20 23 20  ests..        # 
5610: 20 20 20 20 20 20 69 6e 20 74 68 65 20 73 75 69        in the sui
5620: 74 65 20 77 69 6c 6c 20 73 69 6d 70 6c 79 20 62  te will simply b
5630: 65 20 73 6b 69 70 70 65 64 2e 20 20 47 65 6e 65  e skipped.  Gene
5640: 72 61 6c 6c 79 20 73 70 65 61 6b 69 6e 67 2c 20  rally speaking, 
5650: 74 68 65 72 65 0d 0a 20 20 20 20 20 20 20 20 23  there..        #
5660: 20 20 20 20 20 20 20 61 72 65 20 74 77 6f 20 77         are two w
5670: 61 79 73 20 74 6f 20 62 75 69 6c 64 20 74 68 65  ays to build the
5680: 20 62 69 6e 61 72 69 65 73 20 77 68 65 6e 20 70   binaries when p
5690: 72 65 70 61 72 69 6e 67 20 74 6f 20 72 75 6e 20  reparing to run 
56a0: 74 68 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20  the..        #  
56b0: 20 20 20 20 20 74 65 73 74 20 73 75 69 74 65 3a       test suite:
56c0: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
56d0: 20 20 20 20 20 23 20 20 20 20 20 20 20 31 2e 20       #       1. 
56e0: 42 75 69 6c 64 20 74 68 65 20 73 65 70 61 72 61  Build the separa
56f0: 74 65 20 6d 61 6e 61 67 65 64 20 61 6e 64 20 6e  te managed and n
5700: 61 74 69 76 65 20 61 73 73 65 6d 62 6c 69 65 73  ative assemblies
5710: 20 75 73 69 6e 67 20 73 6f 6d 65 0d 0a 20 20 20   using some..   
5720: 20 20 20 20 20 23 20 20 20 20 20 20 20 20 20 20       #          
5730: 63 6f 6d 6d 61 6e 64 73 20 73 69 6d 69 6c 61 72  commands similar
5740: 20 74 6f 3a 0d 0a 20 20 20 20 20 20 20 20 23 0d   to:..        #.
5750: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
5760: 20 20 20 20 62 75 69 6c 64 2e 62 61 74 20 24 7b      build.bat ${
5770: 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 7d 4d 61  Configuration}Ma
5780: 6e 61 67 65 64 4f 6e 6c 79 20 24 7b 50 6c 61 74  nagedOnly ${Plat
5790: 66 6f 72 6d 7d 0d 0a 20 20 20 20 20 20 20 20 23  form}..        #
57a0: 20 20 20 20 20 20 20 20 20 20 62 75 69 6c 64 2e            build.
57b0: 62 61 74 20 24 7b 43 6f 6e 66 69 67 75 72 61 74  bat ${Configurat
57c0: 69 6f 6e 7d 4e 61 74 69 76 65 4f 6e 6c 79 20 24  ion}NativeOnly $
57d0: 7b 50 6c 61 74 66 6f 72 6d 7d 0d 0a 20 20 20 20  {Platform}..    
57e0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
57f0: 20 20 20 20 20 20 20 20 20 20 57 68 65 72 65 20            Where 
5800: 24 7b 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 7d  ${Configuration}
5810: 20 69 73 20 65 69 74 68 65 72 20 22 44 65 62 75   is either "Debu
5820: 67 22 20 6f 72 20 22 52 65 6c 65 61 73 65 22 20  g" or "Release" 
5830: 61 6e 64 0d 0a 20 20 20 20 20 20 20 20 23 20 20  and..        #  
5840: 20 20 20 20 20 20 20 20 24 7b 50 6c 61 74 66 6f          ${Platfo
5850: 72 6d 7d 20 69 73 20 65 69 74 68 65 72 20 22 57  rm} is either "W
5860: 69 6e 33 32 22 20 6f 72 20 22 78 36 34 22 2e 0d  in32" or "x64"..
5870: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
5880: 20 20 20 20 23 20 20 20 20 20 20 20 32 2e 20 42      #       2. B
5890: 75 69 6c 64 20 74 68 65 20 6d 69 78 65 64 2d 6d  uild the mixed-m
58a0: 6f 64 65 20 61 73 73 65 6d 62 6c 79 20 75 73 69  ode assembly usi
58b0: 6e 67 20 61 20 63 6f 6d 6d 61 6e 64 20 73 69 6d  ng a command sim
58c0: 69 6c 61 72 20 74 6f 3a 0d 0a 20 20 20 20 20 20  ilar to:..      
58d0: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 20    #..        #  
58e0: 20 20 20 20 20 20 20 20 62 75 69 6c 64 2e 62 61          build.ba
58f0: 74 20 24 7b 43 6f 6e 66 69 67 75 72 61 74 69 6f  t ${Configuratio
5900: 6e 7d 20 24 7b 50 6c 61 74 66 6f 72 6d 7d 0d 0a  n} ${Platform}..
5910: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
5920: 20 20 20 23 20 20 20 20 20 20 20 20 20 20 57 68     #          Wh
5930: 65 72 65 20 24 7b 43 6f 6e 66 69 67 75 72 61 74  ere ${Configurat
5940: 69 6f 6e 7d 20 69 73 20 65 69 74 68 65 72 20 22  ion} is either "
5950: 44 65 62 75 67 22 20 6f 72 20 22 52 65 6c 65 61  Debug" or "Relea
5960: 73 65 22 20 61 6e 64 0d 0a 20 20 20 20 20 20 20  se" and..       
5970: 20 23 20 20 20 20 20 20 20 20 20 20 24 7b 50 6c   #          ${Pl
5980: 61 74 66 6f 72 6d 7d 20 69 73 20 65 69 74 68 65  atform} is eithe
5990: 72 20 22 57 69 6e 33 32 22 20 6f 72 20 22 78 36  r "Win32" or "x6
59a0: 34 22 2e 20 20 49 66 20 74 68 69 73 20 63 6f 6d  4".  If this com
59b0: 6d 61 6e 64 20 69 73 0d 0a 20 20 20 20 20 20 20  mand is..       
59c0: 20 23 20 20 20 20 20 20 20 20 20 20 75 73 65 64   #          used
59d0: 2c 20 76 61 72 69 6f 75 73 20 74 65 73 74 73 20  , various tests 
59e0: 74 68 61 74 20 72 65 71 75 69 72 65 20 73 75 70  that require sup
59f0: 70 6c 65 6d 65 6e 74 61 72 79 20 6d 61 6e 61 67  plementary manag
5a00: 65 64 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  ed..        #   
5a10: 20 20 20 20 20 20 20 61 73 73 65 6d 62 6c 69 65         assemblie
5a20: 73 20 28 65 2e 67 2e 20 4c 49 4e 51 29 20 6d 61  s (e.g. LINQ) ma
5a30: 79 20 62 65 20 73 6b 69 70 70 65 64 20 75 6e 6c  y be skipped unl
5a40: 65 73 73 20 74 68 6f 73 65 20 62 69 6e 61 72 69  ess those binari
5a50: 65 73 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  es..        #   
5a60: 20 20 20 20 20 20 20 61 72 65 20 73 75 62 73 65         are subse
5a70: 71 75 65 6e 74 6c 79 20 63 6f 70 69 65 64 20 69  quently copied i
5a80: 6e 74 6f 20 74 68 65 20 63 6f 72 72 65 63 74 20  nto the correct 
5a90: 64 69 72 65 63 74 6f 72 79 20 28 69 2e 65 2e 20  directory (i.e. 
5aa0: 62 79 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  by..        #   
5ab0: 20 20 20 20 20 20 20 22 74 65 73 74 5f 61 6c 6c         "test_all
5ac0: 2e 62 61 74 22 29 2e 0d 0a 20 20 20 20 20 20 20  .bat")...       
5ad0: 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20   #..        #   
5ae0: 20 20 20 20 4e 6f 74 65 20 74 68 61 74 20 61 6c      Note that al
5af0: 6c 20 6f 66 20 74 68 65 20 62 75 69 6c 64 20 63  l of the build c
5b00: 6f 6d 6d 61 6e 64 73 20 61 62 6f 76 65 20 77 69  ommands above wi
5b10: 6c 6c 20 64 65 66 61 75 6c 74 20 74 6f 20 75 73  ll default to us
5b20: 69 6e 67 0d 0a 20 20 20 20 20 20 20 20 23 20 20  ing..        #  
5b30: 20 20 20 20 20 74 68 65 20 6c 61 74 65 73 74 20       the latest 
5b40: 76 65 72 73 69 6f 6e 20 6f 66 20 4d 53 42 75 69  version of MSBui
5b50: 6c 64 20 61 76 61 69 6c 61 62 6c 65 20 61 6e 64  ld available and
5b60: 20 74 68 65 20 22 74 65 73 74 5f 79 65 61 72 22   the "test_year"
5b70: 20 6d 61 79 0d 0a 20 20 20 20 20 20 20 20 23 20   may..        # 
5b80: 20 20 20 20 20 20 6e 65 65 64 20 74 6f 20 62 65        need to be
5b90: 20 61 64 6a 75 73 74 65 64 20 61 63 63 6f 72 64   adjusted accord
5ba0: 69 6e 67 6c 79 20 74 6f 20 61 63 74 75 61 6c 6c  ingly to actuall
5bb0: 79 20 72 75 6e 20 74 68 65 20 74 65 73 74 20 73  y run the test s
5bc0: 75 69 74 65 2e 0d 0a 20 20 20 20 20 20 20 20 23  uite...        #
5bd0: 20 20 20 20 20 20 20 52 65 66 65 72 20 74 6f 20         Refer to 
5be0: 74 68 65 20 63 6f 6d 6d 65 6e 74 73 20 69 6e 20  the comments in 
5bf0: 5b 67 65 74 42 75 69 6c 64 59 65 61 72 5d 20 66  [getBuildYear] f
5c00: 6f 72 20 6d 6f 72 65 20 69 6e 66 6f 72 6d 61 74  or more informat
5c10: 69 6f 6e 20 6f 6e 0d 0a 20 20 20 20 20 20 20 20  ion on..        
5c20: 23 20 20 20 20 20 20 20 68 6f 77 20 74 6f 20 73  #       how to s
5c30: 65 74 20 74 68 69 73 20 76 61 72 69 61 62 6c 65  et this variable
5c40: 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
5c50: 20 20 20 20 20 20 73 65 74 20 6e 61 74 69 76 65        set native
5c60: 20 5b 68 61 73 52 75 6e 74 69 6d 65 4f 70 74 69   [hasRuntimeOpti
5c70: 6f 6e 20 6e 61 74 69 76 65 5d 0d 0a 0d 0a 20 20  on native]....  
5c80: 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b 6a 6f        return [jo
5c90: 69 6e 42 75 69 6c 64 44 69 72 65 63 74 6f 72 79  inBuildDirectory
5ca0: 20 24 6e 61 74 69 76 65 20 5b 67 65 74 42 75 69   $native [getBui
5cb0: 6c 64 42 61 73 65 44 69 72 65 63 74 6f 72 79 5d  ldBaseDirectory]
5cc0: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
5cd0: 5b 67 65 74 42 75 69 6c 64 59 65 61 72 5d 20 5b  [getBuildYear] [
5ce0: 67 65 74 42 75 69 6c 64 50 6c 61 74 66 6f 72 6d  getBuildPlatform
5cf0: 20 24 6e 61 74 69 76 65 5d 20 5b 67 65 74 42 75   $native] [getBu
5d00: 69 6c 64 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e  ildConfiguration
5d10: 5d 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20  ]]..      }..   
5d20: 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
5d30: 67 65 74 52 65 6c 65 61 73 65 56 65 72 73 69 6f  getReleaseVersio
5d40: 6e 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d  n {} {..      #.
5d50: 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 46  .      # NOTE: F
5d60: 69 67 75 72 65 20 6f 75 74 20 74 68 65 20 72 65  igure out the re
5d70: 6c 65 61 73 65 20 76 65 72 73 69 6f 6e 20 66 6f  lease version fo
5d80: 72 20 75 73 65 20 77 69 74 68 20 74 68 65 20 62  r use with the b
5d90: 75 69 6c 64 20 64 69 72 65 63 74 6f 72 79 0d 0a  uild directory..
5da0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 77 68        #       wh
5db0: 65 6e 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20  en checking for 
5dc0: 61 76 61 69 6c 61 62 6c 65 20 72 65 6c 65 61 73  available releas
5dd0: 65 73 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  es...      #..  
5de0: 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78      if {[info ex
5df0: 69 73 74 73 20 3a 3a 72 65 6c 65 61 73 65 5f 76  ists ::release_v
5e00: 65 72 73 69 6f 6e 5d 20 26 26 20 5c 0d 0a 20 20  ersion] && \..  
5e10: 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20          [string 
5e20: 6c 65 6e 67 74 68 20 24 3a 3a 72 65 6c 65 61 73  length $::releas
5e30: 65 5f 76 65 72 73 69 6f 6e 5d 20 3e 20 30 7d 20  e_version] > 0} 
5e40: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
5e50: 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
5e60: 45 3a 20 54 68 65 20 72 65 6c 65 61 73 65 20 76  E: The release v
5e70: 65 72 73 69 6f 6e 20 68 61 73 20 62 65 65 6e 20  ersion has been 
5e80: 6f 76 65 72 72 69 64 64 65 6e 3b 20 74 68 65 72  overridden; ther
5e90: 65 66 6f 72 65 2c 20 75 73 65 20 69 74 0d 0a 20  efore, use it.. 
5ea0: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 76         #       v
5eb0: 65 72 62 61 74 69 6d 2e 0d 0a 20 20 20 20 20 20  erbatim...      
5ec0: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74    #..        ret
5ed0: 75 72 6e 20 24 3a 3a 72 65 6c 65 61 73 65 5f 76  urn $::release_v
5ee0: 65 72 73 69 6f 6e 0d 0a 20 20 20 20 20 20 7d 20  ersion..      } 
5ef0: 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
5f00: 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
5f10: 45 3a 20 4e 6f 20 72 65 6c 65 61 73 65 20 76 65  E: No release ve
5f20: 72 73 69 6f 6e 20 69 73 20 61 76 61 69 6c 61 62  rsion is availab
5f30: 6c 65 2c 20 72 65 74 75 72 6e 20 61 6e 20 65 6d  le, return an em
5f40: 70 74 79 20 73 74 72 69 6e 67 2e 0d 0a 20 20 20  pty string...   
5f50: 20 20 20 20 20 23 20 20 20 20 20 20 20 49 74 20       #       It 
5f60: 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20  is important to 
5f70: 72 65 74 75 72 6e 20 61 6e 20 65 6d 70 74 79 20  return an empty 
5f80: 73 74 72 69 6e 67 20 68 65 72 65 20 62 65 63 61  string here beca
5f90: 75 73 65 20 74 68 65 0d 0a 20 20 20 20 20 20 20  use the..       
5fa0: 20 23 20 20 20 20 20 20 20 72 65 73 75 6c 74 20   #       result 
5fb0: 6f 66 20 74 68 69 73 20 70 72 6f 63 65 64 75 72  of this procedur
5fc0: 65 20 6d 61 79 20 62 65 20 75 73 65 64 20 77 69  e may be used wi
5fd0: 74 68 20 5b 66 69 6c 65 20 6a 6f 69 6e 5d 2e 0d  th [file join]..
5fe0: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
5ff0: 20 20 20 20 72 65 74 75 72 6e 20 22 22 0d 0a 20      return "".. 
6000: 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c       }..    }...
6010: 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74 42 75  ..    proc getBu
6020: 69 6c 64 46 69 6c 65 4e 61 6d 65 20 7b 20 66 69  ildFileName { fi
6030: 6c 65 4e 61 6d 65 20 7b 70 6c 61 74 66 6f 72 6d  leName {platform
6040: 20 22 22 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20   ""} } {..      
6050: 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
6060: 20 52 65 74 75 72 6e 73 20 74 68 65 20 73 70 65   Returns the spe
6070: 63 69 66 69 65 64 20 66 69 6c 65 20 6e 61 6d 65  cified file name
6080: 20 61 73 20 69 66 20 69 74 20 77 65 72 65 20 6c   as if it were l
6090: 6f 63 61 74 65 64 20 69 6e 20 74 68 65 0d 0a 20  ocated in the.. 
60a0: 20 20 20 20 20 23 20 20 20 20 20 20 20 62 75 69       #       bui
60b0: 6c 64 20 64 69 72 65 63 74 6f 72 79 2c 20 64 69  ld directory, di
60c0: 73 63 61 72 64 69 6e 67 20 61 6e 79 20 64 69 72  scarding any dir
60d0: 65 63 74 6f 72 79 20 69 6e 66 6f 72 6d 61 74 69  ectory informati
60e0: 6f 6e 20 70 72 65 73 65 6e 74 0d 0a 20 20 20 20  on present..    
60f0: 20 20 23 20 20 20 20 20 20 20 69 6e 20 74 68 65    #       in the
6100: 20 66 69 6c 65 20 6e 61 6d 65 20 61 73 20 70 72   file name as pr
6110: 6f 76 69 64 65 64 20 62 79 20 6f 75 72 20 63 61  ovided by our ca
6120: 6c 6c 65 72 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  ller...      #..
6130: 20 20 20 20 20 20 73 65 74 20 72 65 73 75 6c 74        set result
6140: 20 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d   [file nativenam
6150: 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b  e \..          [
6160: 66 69 6c 65 20 6a 6f 69 6e 20 5b 67 65 74 42 75  file join [getBu
6170: 69 6c 64 44 69 72 65 63 74 6f 72 79 5d 20 24 70  ildDirectory] $p
6180: 6c 61 74 66 6f 72 6d 20 5b 66 69 6c 65 20 74 61  latform [file ta
6190: 69 6c 20 24 66 69 6c 65 4e 61 6d 65 5d 5d 5d 0d  il $fileName]]].
61a0: 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
61b0: 20 20 23 20 48 41 43 4b 3a 20 57 68 65 6e 20 72    # HACK: When r
61c0: 75 6e 6e 69 6e 67 20 6f 6e 20 57 6f 57 36 34 2c  unning on WoW64,
61d0: 20 61 73 73 75 6d 65 20 74 68 65 20 74 65 73 74   assume the test
61e0: 20 65 78 65 63 75 74 61 62 6c 65 73 20 61 72 65   executables are
61f0: 20 70 72 65 73 65 6e 74 0d 0a 20 20 20 20 20 20   present..      
6200: 23 20 20 20 20 20 20 20 77 69 74 68 20 74 68 65  #       with the
6210: 20 22 33 32 22 20 73 75 66 66 69 78 20 6f 6e 20   "32" suffix on 
6220: 74 68 65 6d 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  them...      #..
6230: 20 20 20 20 20 20 69 66 20 7b 5b 69 73 52 75 6e        if {[isRun
6240: 6e 69 6e 67 57 6f 57 36 34 5d 20 26 26 20 5b 66  ningWoW64] && [f
6250: 69 6c 65 20 65 78 74 65 6e 73 69 6f 6e 20 24 72  ile extension $r
6260: 65 73 75 6c 74 5d 20 65 71 20 22 2e 65 78 65 22  esult] eq ".exe"
6270: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
6280: 20 20 73 65 74 20 72 65 73 75 6c 74 20 5b 61 70    set result [ap
6290: 70 65 6e 64 41 72 67 73 20 5b 66 69 6c 65 20 72  pendArgs [file r
62a0: 6f 6f 74 6e 61 6d 65 20 24 72 65 73 75 6c 74 5d  ootname $result]
62b0: 20 33 32 2e 65 78 65 5d 0d 0a 20 20 20 20 20 20   32.exe]..      
62c0: 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65 74 75 72  }....      retur
62d0: 6e 20 24 72 65 73 75 6c 74 0d 0a 20 20 20 20 7d  n $result..    }
62e0: 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65  .....    proc ge
62f0: 74 45 78 74 65 72 6e 61 6c 44 69 72 65 63 74 6f  tExternalDirecto
6300: 72 79 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 23  ry {} {..      #
6310: 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
6320: 54 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 72  This procedure r
6330: 65 74 75 72 6e 73 20 74 68 65 20 64 69 72 65 63  eturns the direc
6340: 74 6f 72 79 20 77 68 65 72 65 20 74 68 65 20 65  tory where the e
6350: 78 74 65 72 6e 61 6c 20 62 69 6e 61 72 79 0d 0a  xternal binary..
6360: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 66 69        #       fi
6370: 6c 65 73 20 61 72 65 20 6c 6f 63 61 74 65 64 2e  les are located.
6380: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
6390: 20 72 65 74 75 72 6e 20 5b 66 69 6c 65 20 6e 61   return [file na
63a0: 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c 65 20 64  tivename [file d
63b0: 69 72 6e 61 6d 65 20 5b 66 69 6c 65 20 64 69 72  irname [file dir
63c0: 6e 61 6d 65 20 5b 69 6e 66 6f 20 62 69 6e 61 72  name [info binar
63d0: 79 5d 5d 5d 5d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d  y]]]]..    }....
63e0: 0a 20 20 20 20 70 72 6f 63 20 67 65 74 42 69 6e  .    proc getBin
63f0: 61 72 79 44 69 72 65 63 74 6f 72 79 20 7b 7d 20  aryDirectory {} 
6400: 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  {..      #..    
6410: 20 20 23 20 4e 4f 54 45 3a 20 54 68 69 73 20 70    # NOTE: This p
6420: 72 6f 63 65 64 75 72 65 20 72 65 74 75 72 6e 73  rocedure returns
6430: 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 77   the directory w
6440: 68 65 72 65 20 74 68 65 20 74 65 73 74 20 61 70  here the test ap
6450: 70 6c 69 63 61 74 69 6f 6e 0d 0a 20 20 20 20 20  plication..     
6460: 20 23 20 20 20 20 20 20 20 69 74 73 65 6c 66 20   #       itself 
6470: 28 69 2e 65 2e 20 74 68 65 20 45 61 67 6c 65 20  (i.e. the Eagle 
6480: 73 68 65 6c 6c 29 20 69 73 20 6c 6f 63 61 74 65  shell) is locate
6490: 64 2e 20 20 54 68 69 73 20 77 69 6c 6c 20 62 65  d.  This will be
64a0: 20 75 73 65 64 20 61 73 0d 0a 20 20 20 20 20 20   used as..      
64b0: 23 20 20 20 20 20 20 20 74 68 65 20 64 65 73 74  #       the dest
64c0: 69 6e 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 20  ination for the 
64d0: 63 6f 70 69 65 64 20 53 79 73 74 65 6d 2e 44 61  copied System.Da
64e0: 74 61 2e 53 51 4c 69 74 65 20 6e 61 74 69 76 65  ta.SQLite native
64f0: 20 61 6e 64 0d 0a 20 20 20 20 20 20 23 20 20 20   and..      #   
6500: 20 20 20 20 6d 61 6e 61 67 65 64 20 61 73 73 65      managed asse
6510: 6d 62 6c 69 65 73 20 28 69 2e 65 2e 20 62 65 63  mblies (i.e. bec
6520: 61 75 73 65 20 74 68 69 73 20 69 73 20 6f 6e 65  ause this is one
6530: 20 6f 66 20 74 68 65 20 66 65 77 20 70 6c 61 63   of the few plac
6540: 65 73 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  es..      #     
6550: 20 20 77 68 65 72 65 20 74 68 65 20 43 4c 52 20    where the CLR 
6560: 77 69 6c 6c 20 61 63 74 75 61 6c 6c 79 20 66 69  will actually fi
6570: 6e 64 20 61 6e 64 20 6c 6f 61 64 20 74 68 65 6d  nd and load them
6580: 20 70 72 6f 70 65 72 6c 79 29 2e 0d 0a 20 20 20   properly)...   
6590: 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
65a0: 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 62  [info exists ::b
65b0: 69 6e 61 72 79 5f 64 69 72 65 63 74 6f 72 79 5d  inary_directory]
65c0: 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20   && \..         
65d0: 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20   [string length 
65e0: 24 3a 3a 62 69 6e 61 72 79 5f 64 69 72 65 63 74  $::binary_direct
65f0: 6f 72 79 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b  ory] > 0} then {
6600: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
6610: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 65       # NOTE: The
6620: 20 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 74 68 65   location of the
6630: 20 62 69 6e 61 72 79 20 64 69 72 65 63 74 6f 72   binary director
6640: 79 20 68 61 73 20 62 65 65 6e 20 6f 76 65 72 72  y has been overr
6650: 69 64 64 65 6e 3b 0d 0a 20 20 20 20 20 20 20 20  idden;..        
6660: 23 20 20 20 20 20 20 20 74 68 65 72 65 66 6f 72  #       therefor
6670: 65 2c 20 75 73 65 20 69 74 20 76 65 72 62 61 74  e, use it verbat
6680: 69 6d 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  im...        #..
6690: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 24          return $
66a0: 3a 3a 62 69 6e 61 72 79 5f 64 69 72 65 63 74 6f  ::binary_directo
66b0: 72 79 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65  ry..      } else
66c0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75   {..        retu
66d0: 72 6e 20 5b 69 6e 66 6f 20 62 69 6e 61 72 79 5d  rn [info binary]
66e0: 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d  ..      }..    }
66f0: 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65  .....    proc ge
6700: 74 45 78 74 65 72 6e 61 6c 46 69 6c 65 4e 61 6d  tExternalFileNam
6710: 65 20 7b 20 66 69 6c 65 4e 61 6d 65 20 7d 20 7b  e { fileName } {
6720: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
6730: 20 23 20 4e 4f 54 45 3a 20 52 65 74 75 72 6e 73   # NOTE: Returns
6740: 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 66   the specified f
6750: 69 6c 65 20 6e 61 6d 65 20 61 73 20 69 66 20 69  ile name as if i
6760: 74 20 77 65 72 65 20 6c 6f 63 61 74 65 64 20 69  t were located i
6770: 6e 20 74 68 65 0d 0a 20 20 20 20 20 20 23 20 20  n the..      #  
6780: 20 20 20 20 20 64 69 72 65 63 74 6f 72 79 20 63       directory c
6790: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 65 78  ontaining the ex
67a0: 74 65 72 6e 61 6c 20 62 69 6e 61 72 69 65 73 2e  ternal binaries.
67b0: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
67c0: 20 72 65 74 75 72 6e 20 5b 66 69 6c 65 20 6e 61   return [file na
67d0: 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c 65 20 6a  tivename [file j
67e0: 6f 69 6e 20 5b 67 65 74 45 78 74 65 72 6e 61 6c  oin [getExternal
67f0: 44 69 72 65 63 74 6f 72 79 5d 20 24 66 69 6c 65  Directory] $file
6800: 4e 61 6d 65 5d 5d 0d 0a 20 20 20 20 7d 0d 0a 0c  Name]]..    }...
6810: 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74 42 69  ..    proc getBi
6820: 6e 61 72 79 46 69 6c 65 4e 61 6d 65 20 7b 20 66  naryFileName { f
6830: 69 6c 65 4e 61 6d 65 20 7b 70 6c 61 74 66 6f 72  ileName {platfor
6840: 6d 20 22 22 7d 20 7d 20 7b 0d 0a 20 20 20 20 20  m ""} } {..     
6850: 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
6860: 3a 20 52 65 74 75 72 6e 73 20 74 68 65 20 73 70  : Returns the sp
6870: 65 63 69 66 69 65 64 20 66 69 6c 65 20 6e 61 6d  ecified file nam
6880: 65 20 61 73 20 69 66 20 69 74 20 77 65 72 65 20  e as if it were 
6890: 6c 6f 63 61 74 65 64 20 69 6e 20 74 68 65 0d 0a  located in the..
68a0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 62 69        #       bi
68b0: 6e 61 72 79 20 64 69 72 65 63 74 6f 72 79 2c 20  nary directory, 
68c0: 64 69 73 63 61 72 64 69 6e 67 20 61 6e 79 20 64  discarding any d
68d0: 69 72 65 63 74 6f 72 79 20 69 6e 66 6f 72 6d 61  irectory informa
68e0: 74 69 6f 6e 20 70 72 65 73 65 6e 74 0d 0a 20 20  tion present..  
68f0: 20 20 20 20 23 20 20 20 20 20 20 20 69 6e 20 74      #       in t
6900: 68 65 20 66 69 6c 65 20 6e 61 6d 65 20 61 73 20  he file name as 
6910: 70 72 6f 76 69 64 65 64 20 62 79 20 6f 75 72 20  provided by our 
6920: 63 61 6c 6c 65 72 2e 0d 0a 20 20 20 20 20 20 23  caller...      #
6930: 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b  ..      return [
6940: 66 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65 20  file nativename 
6950: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 66 69  \..          [fi
6960: 6c 65 20 6a 6f 69 6e 20 5b 67 65 74 42 69 6e 61  le join [getBina
6970: 72 79 44 69 72 65 63 74 6f 72 79 5d 20 24 70 6c  ryDirectory] $pl
6980: 61 74 66 6f 72 6d 20 5b 66 69 6c 65 20 74 61 69  atform [file tai
6990: 6c 20 24 66 69 6c 65 4e 61 6d 65 5d 5d 5d 0d 0a  l $fileName]]]..
69a0: 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
69b0: 6f 63 20 67 65 74 43 6f 72 65 42 69 6e 61 72 79  oc getCoreBinary
69c0: 46 69 6c 65 4e 61 6d 65 20 7b 20 7b 70 6c 61 74  FileName { {plat
69d0: 66 6f 72 6d 20 22 22 7d 20 7b 73 74 61 6e 64 61  form ""} {standa
69e0: 72 64 20 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a 20  rd false} } {.. 
69f0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
6a00: 4e 4f 54 45 3a 20 52 65 74 75 72 6e 73 20 74 68  NOTE: Returns th
6a10: 65 20 66 75 6c 6c 20 70 61 74 68 20 66 6f 72 20  e full path for 
6a20: 74 68 65 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e  the file contain
6a30: 69 6e 67 20 74 68 65 20 53 51 4c 69 74 65 20 63  ing the SQLite c
6a40: 6f 72 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ore..      #    
6a50: 20 20 20 6e 61 74 69 76 65 20 6c 69 62 72 61 72     native librar
6a60: 79 20 63 6f 64 65 20 66 6f 72 20 74 68 69 73 20  y code for this 
6a70: 70 6c 61 74 66 6f 72 6d 2e 20 20 46 69 72 73 74  platform.  First
6a80: 2c 20 63 68 65 63 6b 20 61 6e 64 20 73 65 65 20  , check and see 
6a90: 69 66 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  if..      #     
6aa0: 20 20 74 68 65 20 53 51 4c 69 74 65 20 63 6f 72    the SQLite cor
6ab0: 65 20 6e 61 74 69 76 65 20 6c 69 62 72 61 72 79  e native library
6ac0: 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
6ad0: 6e 20 6c 6f 61 64 65 64 2e 20 20 4e 65 78 74 2c  n loaded.  Next,
6ae0: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
6af0: 66 61 6c 6c 62 61 63 6b 20 74 6f 20 77 68 61 74  fallback to what
6b00: 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68 20 73   the full path s
6b10: 68 6f 75 6c 64 20 62 65 2c 20 62 61 73 65 64 20  hould be, based 
6b20: 6f 6e 20 77 68 65 74 68 65 72 20 74 68 65 0d 0a  on whether the..
6b30: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 6d 69        #       mi
6b40: 78 65 64 2d 6d 6f 64 65 20 61 73 73 65 6d 62 6c  xed-mode assembl
6b50: 79 20 69 73 20 62 65 69 6e 67 20 75 73 65 64 20  y is being used 
6b60: 61 6e 64 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  and the name of 
6b70: 74 68 65 20 63 75 72 72 65 6e 74 0d 0a 20 20 20  the current..   
6b80: 20 20 20 23 20 20 20 20 20 20 20 70 6c 61 74 66     #       platf
6b90: 6f 72 6d 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  orm...      #.. 
6ba0: 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20       if {[catch 
6bb0: 7b 0d 0a 20 20 20 20 20 20 20 20 6f 62 6a 65 63  {..        objec
6bc0: 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20  t invoke -flags 
6bd0: 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20  +NonPublic \..  
6be0: 20 20 20 20 20 20 20 20 20 20 53 79 73 74 65 6d            System
6bf0: 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 55 6e 73  .Data.SQLite.Uns
6c00: 61 66 65 4e 61 74 69 76 65 4d 65 74 68 6f 64 73  afeNativeMethods
6c10: 20 5f 53 51 4c 69 74 65 4e 61 74 69 76 65 4d 6f   _SQLiteNativeMo
6c20: 64 75 6c 65 46 69 6c 65 4e 61 6d 65 0d 0a 20 20  duleFileName..  
6c30: 20 20 20 20 7d 20 66 69 6c 65 4e 61 6d 65 5d 20      } fileName] 
6c40: 3d 3d 20 30 20 26 26 20 5b 73 74 72 69 6e 67 20  == 0 && [string 
6c50: 6c 65 6e 67 74 68 20 24 66 69 6c 65 4e 61 6d 65  length $fileName
6c60: 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20  ] > 0} then {.. 
6c70: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
6c80: 20 20 23 20 4e 4f 54 45 3a 20 54 68 65 20 53 51    # NOTE: The SQ
6c90: 4c 69 74 65 20 63 6f 72 65 20 6e 61 74 69 76 65  Lite core native
6ca0: 20 6c 69 62 72 61 72 79 20 68 61 73 20 61 6c 72   library has alr
6cb0: 65 61 64 79 20 62 65 65 6e 20 6c 6f 61 64 65 64  eady been loaded
6cc0: 20 76 69 61 0d 0a 20 20 20 20 20 20 20 20 23 20   via..        # 
6cd0: 20 20 20 20 20 20 74 68 65 20 6e 61 74 69 76 65        the native
6ce0: 20 6c 69 62 72 61 72 79 20 70 72 65 2d 6c 6f 61   library pre-loa
6cf0: 64 65 72 2e 20 20 52 65 74 75 72 6e 20 74 68 61  der.  Return tha
6d00: 74 20 66 69 6c 65 20 6e 61 6d 65 20 6e 6f 77 2e  t file name now.
6d10: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
6d20: 20 20 20 20 20 72 65 74 75 72 6e 20 24 66 69 6c       return $fil
6d30: 65 4e 61 6d 65 0d 0a 20 20 20 20 20 20 7d 0d 0a  eName..      }..
6d40: 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 68 61 73  ..      if {[has
6d50: 52 75 6e 74 69 6d 65 4f 70 74 69 6f 6e 20 6e 61  RuntimeOption na
6d60: 74 69 76 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  tive]} then {.. 
6d70: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
6d80: 20 20 23 20 4e 4f 54 45 3a 20 52 65 74 75 72 6e    # NOTE: Return
6d90: 20 74 68 65 20 6d 69 78 65 64 2d 6d 6f 64 65 20   the mixed-mode 
6da0: 61 73 73 65 6d 62 6c 79 20 66 69 6c 65 20 6e 61  assembly file na
6db0: 6d 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  me...        #..
6dc0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b          return [
6dd0: 66 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65 20  file nativename 
6de0: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b  \..            [
6df0: 66 69 6c 65 20 6a 6f 69 6e 20 5b 67 65 74 42 69  file join [getBi
6e00: 6e 61 72 79 44 69 72 65 63 74 6f 72 79 5d 20 24  naryDirectory] $
6e10: 70 6c 61 74 66 6f 72 6d 20 53 79 73 74 65 6d 2e  platform System.
6e20: 44 61 74 61 2e 53 51 4c 69 74 65 2e 64 6c 6c 5d  Data.SQLite.dll]
6e30: 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 69  ]..      } elsei
6e40: 66 20 7b 24 73 74 61 6e 64 61 72 64 7d 20 74 68  f {$standard} th
6e50: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d  en {..        #.
6e60: 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
6e70: 20 52 65 74 75 72 6e 20 74 68 65 20 6e 61 74 69   Return the nati
6e80: 76 65 2d 6f 6e 6c 79 20 73 74 61 6e 64 61 72 64  ve-only standard
6e90: 20 53 51 4c 69 74 65 20 6c 69 62 72 61 72 79 20   SQLite library 
6ea0: 66 69 6c 65 20 6e 61 6d 65 2e 0d 0a 20 20 20 20  file name...    
6eb0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72      #..        r
6ec0: 65 74 75 72 6e 20 5b 66 69 6c 65 20 6e 61 74 69  eturn [file nati
6ed0: 76 65 6e 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20  vename \..      
6ee0: 20 20 20 20 20 20 5b 66 69 6c 65 20 6a 6f 69 6e        [file join
6ef0: 20 5b 67 65 74 42 69 6e 61 72 79 44 69 72 65 63   [getBinaryDirec
6f00: 74 6f 72 79 5d 20 24 70 6c 61 74 66 6f 72 6d 20  tory] $platform 
6f10: 73 71 6c 69 74 65 33 2e 64 6c 6c 5d 5d 0d 0a 20  sqlite3.dll]].. 
6f20: 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
6f30: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
6f40: 20 20 23 20 4e 4f 54 45 3a 20 52 65 74 75 72 6e    # NOTE: Return
6f50: 20 74 68 65 20 6e 61 74 69 76 65 2d 6f 6e 6c 79   the native-only
6f60: 20 69 6e 74 65 72 6f 70 20 61 73 73 65 6d 62 6c   interop assembl
6f70: 79 20 66 69 6c 65 20 6e 61 6d 65 2e 0d 0a 20 20  y file name...  
6f80: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
6f90: 20 72 65 74 75 72 6e 20 5b 66 69 6c 65 20 6e 61   return [file na
6fa0: 74 69 76 65 6e 61 6d 65 20 5c 0d 0a 20 20 20 20  tivename \..    
6fb0: 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20 6a 6f          [file jo
6fc0: 69 6e 20 5b 67 65 74 42 69 6e 61 72 79 44 69 72  in [getBinaryDir
6fd0: 65 63 74 6f 72 79 5d 20 24 70 6c 61 74 66 6f 72  ectory] $platfor
6fe0: 6d 20 53 51 4c 69 74 65 2e 49 6e 74 65 72 6f 70  m SQLite.Interop
6ff0: 2e 64 6c 6c 5d 5d 0d 0a 20 20 20 20 20 20 7d 0d  .dll]]..      }.
7000: 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70  .    }.....    p
7010: 72 6f 63 20 67 65 74 43 6f 6d 6d 6f 6e 44 69 72  roc getCommonDir
7020: 65 63 74 6f 72 79 20 7b 7d 20 7b 0d 0a 20 20 20  ectory {} {..   
7030: 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
7040: 54 45 3a 20 54 68 69 73 20 70 72 6f 63 65 64 75  TE: This procedu
7050: 72 65 20 72 65 74 75 72 6e 73 20 74 68 65 20 64  re returns the d
7060: 69 72 65 63 74 6f 72 79 20 77 68 65 72 65 20 74  irectory where t
7070: 68 65 20 74 65 73 74 20 73 63 72 69 70 74 73 0d  he test scripts.
7080: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 73  .      #       s
7090: 68 6f 75 6c 64 20 62 65 20 6c 6f 63 61 74 65 64  hould be located
70a0: 2e 20 20 42 79 20 64 65 66 61 75 6c 74 2c 20 74  .  By default, t
70b0: 68 69 73 20 6a 75 73 74 20 72 65 74 75 72 6e 73  his just returns
70c0: 20 74 68 65 20 45 61 67 6c 65 0d 0a 20 20 20 20   the Eagle..    
70d0: 20 20 23 20 20 20 20 20 20 20 62 69 6e 61 72 79    #       binary
70e0: 20 64 69 72 65 63 74 6f 72 79 2e 0d 0a 20 20 20   directory...   
70f0: 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
7100: 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 63  [info exists ::c
7110: 6f 6d 6d 6f 6e 5f 64 69 72 65 63 74 6f 72 79 5d  ommon_directory]
7120: 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20   && \..         
7130: 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20   [string length 
7140: 24 3a 3a 63 6f 6d 6d 6f 6e 5f 64 69 72 65 63 74  $::common_direct
7150: 6f 72 79 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b  ory] > 0} then {
7160: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
7170: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 65       # NOTE: The
7180: 20 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 74 68 65   location of the
7190: 20 63 6f 6d 6d 6f 6e 20 64 69 72 65 63 74 6f 72   common director
71a0: 79 20 68 61 73 20 62 65 65 6e 20 73 65 74 3b 0d  y has been set;.
71b0: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
71c0: 20 74 68 65 72 65 66 6f 72 65 2c 20 75 73 65 20   therefore, use 
71d0: 69 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  it...        #..
71e0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 24          return $
71f0: 3a 3a 63 6f 6d 6d 6f 6e 5f 64 69 72 65 63 74 6f  ::common_directo
7200: 72 79 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65  ry..      } else
7210: 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73  if {[info exists
7220: 20 3a 3a 76 65 6e 64 6f 72 5f 64 69 72 65 63 74   ::vendor_direct
7230: 6f 72 79 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20  ory] && \..     
7240: 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e       [string len
7250: 67 74 68 20 24 3a 3a 76 65 6e 64 6f 72 5f 64 69  gth $::vendor_di
7260: 72 65 63 74 6f 72 79 5d 20 3e 20 30 7d 20 74 68  rectory] > 0} th
7270: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d  en {..        #.
7280: 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
7290: 20 54 68 65 20 6c 6f 63 61 74 69 6f 6e 20 6f 66   The location of
72a0: 20 74 68 65 20 76 65 6e 64 6f 72 20 64 69 72 65   the vendor dire
72b0: 63 74 6f 72 79 20 68 61 73 20 62 65 65 6e 20 73  ctory has been s
72c0: 65 74 3b 0d 0a 20 20 20 20 20 20 20 20 23 20 20  et;..        #  
72d0: 20 20 20 20 20 74 68 65 72 65 66 6f 72 65 2c 20       therefore, 
72e0: 75 73 65 20 69 74 2e 0d 0a 20 20 20 20 20 20 20  use it...       
72f0: 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75   #..        retu
7300: 72 6e 20 24 3a 3a 76 65 6e 64 6f 72 5f 64 69 72  rn $::vendor_dir
7310: 65 63 74 6f 72 79 0d 0a 20 20 20 20 20 20 7d 20  ectory..      } 
7320: 65 6c 73 65 69 66 20 7b 5b 69 6e 66 6f 20 65 78  elseif {[info ex
7330: 69 73 74 73 20 3a 3a 74 63 6c 5f 6c 69 62 72 61  ists ::tcl_libra
7340: 72 79 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20  ry] && \..      
7350: 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67      [string leng
7360: 74 68 20 24 3a 3a 74 63 6c 5f 6c 69 62 72 61 72  th $::tcl_librar
7370: 79 5d 20 3e 20 30 20 26 26 20 5c 0d 0a 20 20 20  y] > 0 && \..   
7380: 20 20 20 20 20 20 20 5b 66 69 6c 65 20 69 73 64         [file isd
7390: 69 72 65 63 74 6f 72 79 20 24 3a 3a 74 63 6c 5f  irectory $::tcl_
73a0: 6c 69 62 72 61 72 79 5d 7d 20 74 68 65 6e 20 7b  library]} then {
73b0: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
73c0: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 65       # NOTE: The
73d0: 20 76 61 72 69 61 62 6c 65 20 77 69 74 68 20 74   variable with t
73e0: 68 65 20 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 74  he location of t
73f0: 68 65 20 73 63 72 69 70 74 20 6c 69 62 72 61 72  he script librar
7400: 79 20 69 73 0d 0a 20 20 20 20 20 20 20 20 23 20  y is..        # 
7410: 20 20 20 20 20 20 73 65 74 20 61 6e 64 20 61 70        set and ap
7420: 70 65 61 72 73 20 74 6f 20 62 65 20 61 20 72 65  pears to be a re
7430: 61 6c 20 64 69 72 65 63 74 6f 72 79 20 28 69 2e  al directory (i.
7440: 65 2e 20 6e 6f 74 20 65 6d 62 65 64 64 65 64 0d  e. not embedded.
7450: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
7460: 20 77 69 74 68 69 6e 20 61 20 66 69 6c 65 29 3b   within a file);
7470: 20 74 68 65 72 65 66 6f 72 65 2c 20 75 73 65 20   therefore, use 
7480: 69 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  it...        #..
7490: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 24          return $
74a0: 3a 3a 74 63 6c 5f 6c 69 62 72 61 72 79 0d 0a 20  ::tcl_library.. 
74b0: 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
74c0: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
74d0: 20 20 23 20 4e 4f 54 45 3a 20 46 61 6c 6c 62 61    # NOTE: Fallba
74e0: 63 6b 20 74 6f 20 74 68 65 20 64 69 72 65 63 74  ck to the direct
74f0: 6f 72 79 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ory containing t
7500: 68 65 20 65 78 65 63 75 74 61 62 6c 65 2e 0d 0a  he executable...
7510: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
7520: 20 20 20 72 65 74 75 72 6e 20 5b 69 6e 66 6f 20     return [info 
7530: 62 69 6e 61 72 79 5d 0d 0a 20 20 20 20 20 20 7d  binary]..      }
7540: 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
7550: 70 72 6f 63 20 67 65 74 44 61 74 61 62 61 73 65  proc getDatabase
7560: 44 69 72 65 63 74 6f 72 79 20 7b 7d 20 7b 0d 0a  Directory {} {..
7570: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
7580: 20 4e 4f 54 45 3a 20 54 68 69 73 20 70 72 6f 63   NOTE: This proc
7590: 65 64 75 72 65 20 72 65 74 75 72 6e 73 20 74 68  edure returns th
75a0: 65 20 64 69 72 65 63 74 6f 72 79 20 77 68 65 72  e directory wher
75b0: 65 20 74 68 65 20 74 65 73 74 20 64 61 74 61 62  e the test datab
75c0: 61 73 65 73 0d 0a 20 20 20 20 20 20 23 20 20 20  ases..      #   
75d0: 20 20 20 20 73 68 6f 75 6c 64 20 62 65 20 6c 6f      should be lo
75e0: 63 61 74 65 64 2e 20 20 42 79 20 64 65 66 61 75  cated.  By defau
75f0: 6c 74 2c 20 74 68 69 73 20 6a 75 73 74 20 75 73  lt, this just us
7600: 65 73 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  es the temporary
7610: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
7620: 64 69 72 65 63 74 6f 72 79 20 63 6f 6e 66 69 67  directory config
7630: 75 72 65 64 20 66 6f 72 20 74 68 69 73 20 73 79  ured for this sy
7640: 73 74 65 6d 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  stem...      #..
7650: 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20        if {[info 
7660: 65 78 69 73 74 73 20 3a 3a 64 61 74 61 62 61 73  exists ::databas
7670: 65 5f 64 69 72 65 63 74 6f 72 79 5d 20 26 26 20  e_directory] && 
7680: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 73 74  \..          [st
7690: 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a 64  ring length $::d
76a0: 61 74 61 62 61 73 65 5f 64 69 72 65 63 74 6f 72  atabase_director
76b0: 79 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  y] > 0} then {..
76c0: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
76d0: 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 65 20 6c     # NOTE: The l
76e0: 6f 63 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 64  ocation of the d
76f0: 61 74 61 62 61 73 65 20 64 69 72 65 63 74 6f 72  atabase director
7700: 79 20 68 61 73 20 62 65 65 6e 20 6f 76 65 72 72  y has been overr
7710: 69 64 64 65 6e 3b 0d 0a 20 20 20 20 20 20 20 20  idden;..        
7720: 23 20 20 20 20 20 20 20 74 68 65 72 65 66 6f 72  #       therefor
7730: 65 2c 20 75 73 65 20 69 74 2e 0d 0a 20 20 20 20  e, use it...    
7740: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72      #..        r
7750: 65 74 75 72 6e 20 24 3a 3a 64 61 74 61 62 61 73  eturn $::databas
7760: 65 5f 64 69 72 65 63 74 6f 72 79 0d 0a 20 20 20  e_directory..   
7770: 20 20 20 7d 20 65 6c 73 65 69 66 20 7b 5b 69 6e     } elseif {[in
7780: 66 6f 20 65 78 69 73 74 73 20 3a 3a 73 63 72 61  fo exists ::scra
7790: 74 63 68 5f 64 69 72 65 63 74 6f 72 79 5d 20 26  tch_directory] &
77a0: 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b  & \..          [
77b0: 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a  string length $:
77c0: 3a 73 63 72 61 74 63 68 5f 64 69 72 65 63 74 6f  :scratch_directo
77d0: 72 79 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d  ry] > 0} then {.
77e0: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
77f0: 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 65 20      # NOTE: The 
7800: 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  location of the 
7810: 73 63 72 61 74 63 68 20 64 69 72 65 63 74 6f 72  scratch director
7820: 79 20 68 61 73 20 62 65 65 6e 20 6f 76 65 72 72  y has been overr
7830: 69 64 64 65 6e 3b 0d 0a 20 20 20 20 20 20 20 20  idden;..        
7840: 23 20 20 20 20 20 20 20 74 68 65 72 65 66 6f 72  #       therefor
7850: 65 2c 20 75 73 65 20 69 74 2e 0d 0a 20 20 20 20  e, use it...    
7860: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72      #..        r
7870: 65 74 75 72 6e 20 24 3a 3a 73 63 72 61 74 63 68  eturn $::scratch
7880: 5f 64 69 72 65 63 74 6f 72 79 0d 0a 20 20 20 20  _directory..    
7890: 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
78a0: 20 20 20 20 72 65 74 75 72 6e 20 5b 67 65 74 54      return [getT
78b0: 65 6d 70 6f 72 61 72 79 50 61 74 68 5d 0d 0a 20  emporaryPath].. 
78c0: 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c       }..    }...
78d0: 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74 54 65  ..    proc getTe
78e0: 6d 70 6f 72 61 72 79 44 69 72 65 63 74 6f 72 79  mporaryDirectory
78f0: 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a   {} {..      #..
7900: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68        # NOTE: Th
7910: 69 73 20 70 72 6f 63 65 64 75 72 65 20 72 65 74  is procedure ret
7920: 75 72 6e 73 20 74 68 65 20 64 69 72 65 63 74 6f  urns the directo
7930: 72 79 20 77 68 65 72 65 20 74 68 65 20 74 65 6d  ry where the tem
7940: 70 6f 72 61 72 79 20 66 69 6c 65 73 0d 0a 20 20  porary files..  
7950: 20 20 20 20 23 20 20 20 20 20 20 20 73 68 6f 75      #       shou
7960: 6c 64 20 62 65 20 6c 6f 63 61 74 65 64 2e 20 20  ld be located.  
7970: 42 79 20 64 65 66 61 75 6c 74 2c 20 74 68 69 73  By default, this
7980: 20 6a 75 73 74 20 75 73 65 73 20 74 68 65 20 74   just uses the t
7990: 65 6d 70 6f 72 61 72 79 0d 0a 20 20 20 20 20 20  emporary..      
79a0: 23 20 20 20 20 20 20 20 64 69 72 65 63 74 6f 72  #       director
79b0: 79 20 63 6f 6e 66 69 67 75 72 65 64 20 66 6f 72  y configured for
79c0: 20 74 68 69 73 20 73 79 73 74 65 6d 2e 0d 0a 20   this system... 
79d0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66       #..      if
79e0: 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a   {[info exists :
79f0: 3a 74 65 6d 70 6f 72 61 72 79 5f 64 69 72 65 63  :temporary_direc
7a00: 74 6f 72 79 5d 20 26 26 20 5c 0d 0a 20 20 20 20  tory] && \..    
7a10: 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65        [string le
7a20: 6e 67 74 68 20 24 3a 3a 74 65 6d 70 6f 72 61 72  ngth $::temporar
7a30: 79 5f 64 69 72 65 63 74 6f 72 79 5d 20 3e 20 30  y_directory] > 0
7a40: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
7a50: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
7a60: 4f 54 45 3a 20 54 68 65 20 6c 6f 63 61 74 69 6f  OTE: The locatio
7a70: 6e 20 6f 66 20 74 68 65 20 74 65 6d 70 6f 72 61  n of the tempora
7a80: 72 79 20 64 69 72 65 63 74 6f 72 79 20 68 61 73  ry directory has
7a90: 20 62 65 65 6e 20 6f 76 65 72 72 69 64 64 65 6e   been overridden
7aa0: 3b 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  ;..        #    
7ab0: 20 20 20 74 68 65 72 65 66 6f 72 65 2c 20 75 73     therefore, us
7ac0: 65 20 69 74 2e 0d 0a 20 20 20 20 20 20 20 20 23  e it...        #
7ad0: 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ..        return
7ae0: 20 24 3a 3a 74 65 6d 70 6f 72 61 72 79 5f 64 69   $::temporary_di
7af0: 72 65 63 74 6f 72 79 0d 0a 20 20 20 20 20 20 7d  rectory..      }
7b00: 20 65 6c 73 65 69 66 20 7b 5b 69 6e 66 6f 20 65   elseif {[info e
7b10: 78 69 73 74 73 20 3a 3a 73 63 72 61 74 63 68 5f  xists ::scratch_
7b20: 64 69 72 65 63 74 6f 72 79 5d 20 26 26 20 5c 0d  directory] && \.
7b30: 0a 20 20 20 20 20 20 20 20 20 20 5b 73 74 72 69  .          [stri
7b40: 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a 73 63 72  ng length $::scr
7b50: 61 74 63 68 5f 64 69 72 65 63 74 6f 72 79 5d 20  atch_directory] 
7b60: 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  > 0} then {..   
7b70: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
7b80: 23 20 4e 4f 54 45 3a 20 54 68 65 20 6c 6f 63 61  # NOTE: The loca
7b90: 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 63 72 61  tion of the scra
7ba0: 74 63 68 20 64 69 72 65 63 74 6f 72 79 20 68 61  tch directory ha
7bb0: 73 20 62 65 65 6e 20 6f 76 65 72 72 69 64 64 65  s been overridde
7bc0: 6e 3b 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  n;..        #   
7bd0: 20 20 20 20 74 68 65 72 65 66 6f 72 65 2c 20 75      therefore, u
7be0: 73 65 20 69 74 2e 0d 0a 20 20 20 20 20 20 20 20  se it...        
7bf0: 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  #..        retur
7c00: 6e 20 24 3a 3a 73 63 72 61 74 63 68 5f 64 69 72  n $::scratch_dir
7c10: 65 63 74 6f 72 79 0d 0a 20 20 20 20 20 20 7d 20  ectory..      } 
7c20: 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
7c30: 72 65 74 75 72 6e 20 5b 67 65 74 54 65 6d 70 6f  return [getTempo
7c40: 72 61 72 79 50 61 74 68 5d 0d 0a 20 20 20 20 20  raryPath]..     
7c50: 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20   }..    }.....  
7c60: 20 20 70 72 6f 63 20 67 65 74 45 78 65 63 75 74    proc getExecut
7c70: 65 4f 6e 53 65 74 75 70 20 7b 7d 20 7b 0d 0a 20  eOnSetup {} {.. 
7c80: 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65       if {[info e
7c90: 78 69 73 74 73 20 3a 3a 65 78 65 63 75 74 65 5f  xists ::execute_
7ca0: 6f 6e 5f 73 65 74 75 70 5d 20 26 26 20 5c 0d 0a  on_setup] && \..
7cb0: 20 20 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e            [strin
7cc0: 67 20 6c 65 6e 67 74 68 20 24 3a 3a 65 78 65 63  g length $::exec
7cd0: 75 74 65 5f 6f 6e 5f 73 65 74 75 70 5d 20 3e 20  ute_on_setup] > 
7ce0: 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
7cf0: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
7d00: 4e 4f 54 45 3a 20 52 65 74 75 72 6e 20 74 68 65  NOTE: Return the
7d10: 20 63 6f 6e 66 69 67 75 72 65 64 20 53 51 4c 20   configured SQL 
7d20: 74 6f 20 65 78 65 63 75 74 65 20 64 75 72 69 6e  to execute durin
7d30: 67 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  g the connection
7d40: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
7d50: 20 20 73 65 74 75 70 20 70 72 6f 63 65 64 75 72    setup procedur
7d60: 65 20 28 69 2e 65 2e 20 66 6f 72 20 65 76 65 72  e (i.e. for ever
7d70: 79 20 74 65 73 74 20 64 61 74 61 62 61 73 65 20  y test database 
7d80: 63 6f 6e 6e 65 63 74 69 6f 6e 29 2e 0d 0a 20 20  connection)...  
7d90: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
7da0: 20 72 65 74 75 72 6e 20 24 3a 3a 65 78 65 63 75   return $::execu
7db0: 74 65 5f 6f 6e 5f 73 65 74 75 70 0d 0a 20 20 20  te_on_setup..   
7dc0: 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
7dd0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
7de0: 23 20 4e 4f 54 45 3a 20 42 79 20 64 65 66 61 75  # NOTE: By defau
7df0: 6c 74 2c 20 74 68 65 72 65 20 69 73 20 6e 6f 20  lt, there is no 
7e00: 53 51 4c 20 74 6f 20 65 78 65 63 75 74 65 20 64  SQL to execute d
7e10: 75 72 69 6e 67 20 74 68 65 20 63 6f 6e 6e 65 63  uring the connec
7e20: 74 69 6f 6e 0d 0a 20 20 20 20 20 20 20 20 23 20  tion..        # 
7e30: 20 20 20 20 20 20 73 65 74 75 70 20 70 72 6f 63        setup proc
7e40: 65 64 75 72 65 20 28 69 2e 65 2e 20 66 6f 72 20  edure (i.e. for 
7e50: 65 76 65 72 79 20 74 65 73 74 20 64 61 74 61 62  every test datab
7e60: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 29 2e  ase connection).
7e70: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
7e80: 20 20 20 20 20 72 65 74 75 72 6e 20 22 22 0d 0a       return ""..
7e90: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a        }..    }..
7ea0: 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74 54  ...    proc getT
7eb0: 65 73 74 4f 76 65 72 72 69 64 65 73 50 72 65 61  estOverridesPrea
7ec0: 6d 62 6c 65 20 7b 20 7b 65 78 74 72 61 56 61 72  mble { {extraVar
7ed0: 4e 61 6d 65 73 20 22 22 7d 20 7d 20 7b 0d 0a 20  Names ""} } {.. 
7ee0: 20 20 20 20 20 73 65 74 20 76 61 72 4e 61 6d 65       set varName
7ef0: 73 20 5b 6c 69 73 74 5d 0d 0a 0d 0a 20 20 20 20  s [list]....    
7f00: 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
7f10: 45 3a 20 49 66 20 61 76 61 69 6c 61 62 6c 65 2c  E: If available,
7f20: 20 73 74 61 72 74 20 77 69 74 68 20 74 68 65 20   start with the 
7f30: 6d 61 73 74 65 72 20 6c 69 73 74 20 6f 66 20 74  master list of t
7f40: 65 73 74 20 6f 76 65 72 72 69 64 65 0d 0a 20 20  est override..  
7f50: 20 20 20 20 23 20 20 20 20 20 20 20 76 61 72 69      #       vari
7f60: 61 62 6c 65 73 2e 0d 0a 20 20 20 20 20 20 23 0d  ables...      #.
7f70: 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f  .      if {[info
7f80: 20 65 78 69 73 74 73 20 3a 3a 74 65 73 74 5f 6f   exists ::test_o
7f90: 76 65 72 72 69 64 65 73 5d 20 26 26 20 5c 0d 0a  verrides] && \..
7fa0: 20 20 20 20 20 20 20 20 20 20 5b 6c 6c 65 6e 67            [lleng
7fb0: 74 68 20 24 3a 3a 74 65 73 74 5f 6f 76 65 72 72  th $::test_overr
7fc0: 69 64 65 73 5d 20 3e 20 30 7d 20 74 68 65 6e 20  ides] > 0} then 
7fd0: 7b 0d 0a 20 20 20 20 20 20 20 20 65 76 61 6c 20  {..        eval 
7fe0: 6c 61 70 70 65 6e 64 20 76 61 72 4e 61 6d 65 73  lappend varNames
7ff0: 20 24 3a 3a 74 65 73 74 5f 6f 76 65 72 72 69 64   $::test_overrid
8000: 65 73 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  es..      }.... 
8010: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
8020: 4e 4f 54 45 3a 20 49 66 20 72 65 71 75 65 73 74  NOTE: If request
8030: 65 64 20 62 79 20 6f 75 72 20 63 61 6c 6c 65 72  ed by our caller
8040: 2c 20 61 64 64 20 61 6e 79 20 61 64 64 69 74 69  , add any additi
8050: 6f 6e 61 6c 20 76 61 72 69 61 62 6c 65 0d 0a 20  onal variable.. 
8060: 20 20 20 20 20 23 20 20 20 20 20 20 20 6e 61 6d       #       nam
8070: 65 73 20 74 6f 20 63 6f 70 79 20 6e 6f 77 2e 0d  es to copy now..
8080: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
8090: 69 66 20 7b 5b 6c 6c 65 6e 67 74 68 20 24 65 78  if {[llength $ex
80a0: 74 72 61 56 61 72 4e 61 6d 65 73 5d 20 3e 20 30  traVarNames] > 0
80b0: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
80c0: 20 20 65 76 61 6c 20 6c 61 70 70 65 6e 64 20 76    eval lappend v
80d0: 61 72 4e 61 6d 65 73 20 24 65 78 74 72 61 56 61  arNames $extraVa
80e0: 72 4e 61 6d 65 73 0d 0a 20 20 20 20 20 20 7d 0d  rNames..      }.
80f0: 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
8100: 20 20 23 20 4e 4f 54 45 3a 20 42 75 69 6c 64 20    # NOTE: Build 
8110: 74 68 65 20 73 63 72 69 70 74 20 66 72 61 67 6d  the script fragm
8120: 65 6e 74 20 74 6f 20 62 65 20 72 65 74 75 72 6e  ent to be return
8130: 65 64 20 62 79 20 70 72 6f 63 65 73 73 69 6e 67  ed by processing
8140: 20 65 61 63 68 0d 0a 20 20 20 20 20 20 23 20 20   each..      #  
8150: 20 20 20 20 20 76 61 72 69 61 62 6c 65 20 6e 61       variable na
8160: 6d 65 20 61 6e 64 20 61 64 64 69 6e 67 20 74 68  me and adding th
8170: 65 20 6e 65 63 65 63 65 73 73 61 72 79 20 73 63  e nececessary sc
8180: 72 69 70 74 20 66 72 61 67 6d 65 6e 74 73 20 66  ript fragments f
8190: 6f 72 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  or..      #     
81a0: 20 20 65 61 63 68 20 6f 6e 65 2e 0d 0a 20 20 20    each one...   
81b0: 20 20 20 23 0d 0a 20 20 20 20 20 20 73 65 74 20     #..      set 
81c0: 72 65 73 75 6c 74 20 22 22 0d 0a 0d 0a 20 20 20  result ""....   
81d0: 20 20 20 66 6f 72 65 61 63 68 20 76 61 72 4e 61     foreach varNa
81e0: 6d 65 20 24 76 61 72 4e 61 6d 65 73 20 7b 0d 0a  me $varNames {..
81f0: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
8200: 20 20 20 23 20 4e 4f 54 45 3a 20 42 75 69 6c 64     # NOTE: Build
8210: 20 74 68 65 20 71 75 61 6c 69 66 69 65 64 20 67   the qualified g
8220: 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20 6e  lobal variable n
8230: 61 6d 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  ame...        #.
8240: 0a 20 20 20 20 20 20 20 20 73 65 74 20 66 75 6c  .        set ful
8250: 6c 56 61 72 4e 61 6d 65 20 5b 61 70 70 65 6e 64  lVarName [append
8260: 41 72 67 73 20 3a 3a 20 24 76 61 72 4e 61 6d 65  Args :: $varName
8270: 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  ]....        #..
8280: 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
8290: 44 6f 65 73 20 74 68 65 20 76 61 72 69 61 62 6c  Does the variabl
82a0: 65 20 65 78 69 73 74 20 69 6e 20 74 68 69 73 20  e exist in this 
82b0: 69 6e 74 65 72 70 72 65 74 65 72 20 63 6f 6e 74  interpreter cont
82c0: 65 78 74 3f 0d 0a 20 20 20 20 20 20 20 20 23 0d  ext?..        #.
82d0: 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 69 6e  .        if {[in
82e0: 66 6f 20 65 78 69 73 74 73 20 24 66 75 6c 6c 56  fo exists $fullV
82f0: 61 72 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d  arName]} then {.
8300: 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
8310: 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
8320: 41 70 70 65 6e 64 20 61 20 73 63 72 69 70 74 20  Append a script 
8330: 66 72 61 67 6d 65 6e 74 20 74 6f 20 74 68 65 20  fragment to the 
8340: 72 65 73 75 6c 74 20 74 68 61 74 20 77 69 6c 6c  result that will
8350: 20 63 6f 72 72 65 63 74 6c 79 0d 0a 20 20 20 20   correctly..    
8360: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63 6f        #       co
8370: 70 79 20 61 6e 79 20 63 6f 6e 74 61 69 6e 65 64  py any contained
8380: 20 76 61 6c 75 65 20 74 6f 20 61 6e 6f 74 68 65   value to anothe
8390: 72 20 69 6e 74 65 72 70 72 65 74 65 72 20 63 6f  r interpreter co
83a0: 6e 74 65 78 74 2e 0d 0a 20 20 20 20 20 20 20 20  ntext...        
83b0: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 61    #..          a
83c0: 70 70 65 6e 64 20 72 65 73 75 6c 74 20 5c 6e 20  ppend result \n 
83d0: 22 73 65 74 20 22 20 24 66 75 6c 6c 56 61 72 4e  "set " $fullVarN
83e0: 61 6d 65 20 22 20 5c 7b 22 20 5b 73 65 74 20 24  ame " \{" [set $
83f0: 66 75 6c 6c 56 61 72 4e 61 6d 65 5d 20 5c 7d 0d  fullVarName] \}.
8400: 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  .        }..    
8410: 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a    }....      #..
8420: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 66        # NOTE: If
8430: 20 74 68 65 20 72 65 73 75 6c 74 20 63 6f 6e 74   the result cont
8440: 61 69 6e 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  ains one or more
8450: 20 73 63 72 69 70 74 20 66 72 61 67 6d 65 6e 74   script fragment
8460: 73 2c 20 61 70 70 65 6e 64 20 61 0d 0a 20 20 20  s, append a..   
8470: 20 20 20 23 20 20 20 20 20 20 20 6e 65 77 6c 69     #       newli
8480: 6e 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  ne...      #..  
8490: 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20      if {[string 
84a0: 6c 65 6e 67 74 68 20 24 72 65 73 75 6c 74 5d 20  length $result] 
84b0: 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  > 0} then {..   
84c0: 20 20 20 20 20 61 70 70 65 6e 64 20 72 65 73 75       append resu
84d0: 6c 74 20 5c 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a  lt \n..      }..
84e0: 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 24  ..      return $
84f0: 72 65 73 75 6c 74 0d 0a 20 20 20 20 7d 0d 0a 0c  result..    }...
8500: 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74 41 70  ..    proc getAp
8510: 70 44 6f 6d 61 69 6e 50 72 65 61 6d 62 6c 65 20  pDomainPreamble 
8520: 7b 20 7b 70 72 65 66 69 78 20 22 22 7d 20 7b 73  { {prefix ""} {s
8530: 75 66 66 69 78 20 22 22 7d 20 7d 20 7b 0d 0a 20  uffix ""} } {.. 
8540: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
8550: 4e 4f 54 45 3a 20 54 68 69 73 20 70 72 6f 63 65  NOTE: This proce
8560: 64 75 72 65 20 72 65 74 75 72 6e 73 20 61 20 74  dure returns a t
8570: 65 73 74 20 73 65 74 75 70 20 73 63 72 69 70 74  est setup script
8580: 20 66 72 61 67 6d 65 6e 74 20 73 75 69 74 61 62   fragment suitab
8590: 6c 65 20 66 6f 72 0d 0a 20 20 20 20 20 20 23 20  le for..      # 
85a0: 20 20 20 20 20 20 65 76 61 6c 75 61 74 69 6f 6e        evaluation
85b0: 20 62 79 20 61 6e 20 69 6e 74 65 72 70 72 65 74   by an interpret
85c0: 65 72 20 63 72 65 61 74 65 64 20 69 6e 20 61 6e  er created in an
85d0: 20 69 73 6f 6c 61 74 65 64 20 61 70 70 6c 69 63   isolated applic
85e0: 61 74 69 6f 6e 0d 0a 20 20 20 20 20 20 23 20 20  ation..      #  
85f0: 20 20 20 20 20 64 6f 6d 61 69 6e 2e 20 20 54 68       domain.  Th
8600: 65 20 73 63 72 69 70 74 20 66 72 61 67 6d 65 6e  e script fragmen
8610: 74 20 62 65 69 6e 67 20 72 65 74 75 72 6e 65 64  t being returned
8620: 20 77 69 6c 6c 20 62 65 20 73 75 72 72 6f 75 6e   will be surroun
8630: 64 65 64 20 62 79 0d 0a 20 20 20 20 20 20 23 20  ded by..      # 
8640: 20 20 20 20 20 20 74 68 65 20 70 72 65 66 69 78        the prefix
8650: 20 61 6e 64 20 73 75 66 66 69 78 20 22 73 63 72   and suffix "scr
8660: 69 70 74 20 66 72 61 67 6d 65 6e 74 73 22 20 73  ipt fragments" s
8670: 70 65 63 69 66 69 65 64 20 62 79 20 6f 75 72 20  pecified by our 
8680: 63 61 6c 6c 65 72 2c 0d 0a 20 20 20 20 20 20 23  caller,..      #
8690: 20 20 20 20 20 20 20 69 66 20 61 6e 79 2e 20 20         if any.  
86a0: 54 68 65 20 65 6e 74 69 72 65 20 73 63 72 69 70  The entire scrip
86b0: 74 20 62 65 69 6e 67 20 72 65 74 75 72 6e 65 64  t being returned
86c0: 20 77 69 6c 6c 20 62 65 20 73 75 62 73 74 69 74   will be substit
86d0: 75 74 65 64 20 76 69 61 0d 0a 20 20 20 20 20 20  uted via..      
86e0: 23 20 20 20 20 20 20 20 5b 73 75 62 73 74 5d 2c  #       [subst],
86f0: 20 69 6e 20 74 68 65 20 63 6f 6e 74 65 78 74 20   in the context 
8700: 6f 66 20 6f 75 72 20 63 61 6c 6c 65 72 2c 20 62  of our caller, b
8710: 65 66 6f 72 65 20 62 65 69 6e 67 20 72 65 74 75  efore being retu
8720: 72 6e 65 64 2e 0d 0a 20 20 20 20 20 20 23 20 20  rned...      #  
8730: 20 20 20 20 20 54 68 69 73 20 73 74 65 70 20 69       This step i
8740: 73 20 6e 65 63 65 73 73 61 72 79 20 73 6f 20 74  s necessary so t
8750: 68 61 74 20 73 6f 6d 65 20 6c 69 6d 69 74 65 64  hat some limited
8760: 20 63 6f 6e 74 65 78 74 20 69 6e 66 6f 72 6d 61   context informa
8770: 74 69 6f 6e 2c 0d 0a 20 20 20 20 20 20 23 20 20  tion,..      #  
8780: 20 20 20 20 20 70 72 69 6d 61 72 69 6c 79 20 72       primarily r
8790: 65 6c 61 74 65 64 20 74 6f 20 74 68 65 20 74 65  elated to the te
87a0: 73 74 69 6e 67 20 64 69 72 65 63 74 6f 72 69 65  sting directorie
87b0: 73 2c 20 63 61 6e 20 62 65 20 74 72 61 6e 73 66  s, can be transf
87c0: 65 72 72 65 64 0d 0a 20 20 20 20 20 20 23 20 20  erred..      #  
87d0: 20 20 20 20 20 74 6f 20 74 68 65 20 69 6e 74 65       to the inte
87e0: 72 70 72 65 74 65 72 20 69 6e 20 74 68 65 20 69  rpreter in the i
87f0: 73 6f 6c 61 74 65 64 20 61 70 70 6c 69 63 61 74  solated applicat
8800: 69 6f 6e 20 64 6f 6d 61 69 6e 2c 20 6d 61 6b 69  ion domain, maki
8810: 6e 67 20 69 74 0d 0a 20 20 20 20 20 20 23 20 20  ng it..      #  
8820: 20 20 20 20 20 61 62 6c 65 20 74 6f 20 73 75 63       able to suc
8830: 63 65 73 73 66 75 6c 6c 79 20 72 75 6e 20 74 65  cessfully run te
8840: 73 74 73 20 74 68 61 74 20 72 65 71 75 69 72 65  sts that require
8850: 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 66 20   one or more of 
8860: 74 68 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20  the..      #    
8870: 20 20 20 66 69 6c 65 73 20 69 6e 20 6f 6e 65 20     files in one 
8880: 6f 66 20 74 68 65 20 74 65 73 74 69 6e 67 20 64  of the testing d
8890: 69 72 65 63 74 6f 72 69 65 73 2e 20 20 43 61 6c  irectories.  Cal
88a0: 6c 65 72 73 20 73 68 6f 75 6c 64 20 6b 65 65 70  lers should keep
88b0: 20 69 6e 0d 0a 20 20 20 20 20 20 23 20 20 20 20   in..      #    
88c0: 20 20 20 6d 69 6e 64 20 74 68 61 74 20 74 68 65     mind that the
88d0: 20 74 65 73 74 20 73 63 72 69 70 74 20 66 72 61   test script fra
88e0: 67 6d 65 6e 74 20 62 65 69 6e 67 20 72 65 74 75  gment being retu
88f0: 72 6e 65 64 20 63 61 6e 6e 6f 74 20 72 65 6c 79  rned cannot rely
8900: 20 6f 6e 0d 0a 20 20 20 20 20 20 23 20 20 20 20   on..      #    
8910: 20 20 20 61 6e 79 20 73 63 72 69 70 74 20 6c 69     any script li
8920: 62 72 61 72 79 20 70 72 6f 63 65 64 75 72 65 73  brary procedures
8930: 20 74 68 61 74 20 61 72 65 20 6e 6f 74 20 70 72   that are not pr
8940: 6f 76 69 64 65 64 20 62 79 20 74 68 65 20 45 61  ovided by the Ea
8950: 67 6c 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20  gle..      #    
8960: 20 20 20 6c 69 62 72 61 72 79 20 70 61 63 6b 61     library packa
8970: 67 65 20 28 69 2e 65 2e 20 22 69 6e 69 74 2e 65  ge (i.e. "init.e
8980: 61 67 6c 65 22 29 2c 20 69 6e 63 6c 75 64 69 6e  agle"), includin
8990: 67 20 74 68 6f 73 65 20 70 72 6f 76 69 64 65 64  g those provided
89a0: 20 62 79 0d 0a 20 20 20 20 20 20 23 20 20 20 20   by..      #    
89b0: 20 20 20 74 68 65 20 45 61 67 6c 65 20 74 65 73     the Eagle tes
89c0: 74 20 70 61 63 6b 61 67 65 2c 20 75 6e 6c 65 73  t package, unles
89d0: 73 20 74 68 65 20 66 69 6c 65 20 63 6f 6e 74 61  s the file conta
89e0: 69 6e 69 6e 67 20 74 68 65 6d 20 69 73 20 6c 6f  ining them is lo
89f0: 61 64 65 64 0d 0a 20 20 20 20 20 20 23 20 20 20  aded..      #   
8a00: 20 20 20 20 6d 61 6e 75 61 6c 6c 79 20 76 69 61      manually via
8a10: 20 73 6f 6d 65 20 6f 74 68 65 72 20 6d 65 63 68   some other mech
8a20: 61 6e 69 73 6d 20 28 65 2e 67 2e 20 62 79 20 69  anism (e.g. by i
8a30: 6e 63 6c 75 64 69 6e 67 20 61 70 70 72 6f 70 72  ncluding appropr
8a40: 69 61 74 65 0d 0a 20 20 20 20 20 20 23 20 20 20  iate..      #   
8a50: 20 20 20 20 5b 70 61 63 6b 61 67 65 20 72 65 71      [package req
8a60: 75 69 72 65 5d 20 6f 72 20 5b 73 6f 75 72 63 65  uire] or [source
8a70: 5d 20 63 6f 6d 6d 61 6e 64 73 20 69 6e 20 74 68  ] commands in th
8a80: 65 20 70 72 65 66 69 78 20 6f 72 20 73 75 66 66  e prefix or suff
8a90: 69 78 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  ix..      #     
8aa0: 20 20 73 63 72 69 70 74 20 66 72 61 67 6d 65 6e    script fragmen
8ab0: 74 73 29 2e 20 20 41 6c 73 6f 2c 20 61 6c 6c 20  ts).  Also, all 
8ac0: 76 61 72 69 61 62 6c 65 20 72 65 66 65 72 65 6e  variable referen
8ad0: 63 65 73 20 61 6e 64 20 61 6c 6c 20 6e 65 73 74  ces and all nest
8ae0: 65 64 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  ed..      #     
8af0: 20 20 63 6f 6d 6d 61 6e 64 73 20 28 69 2e 65 2e    commands (i.e.
8b00: 20 74 68 6f 73 65 20 69 6e 20 73 71 75 61 72 65   those in square
8b10: 20 62 72 61 63 6b 65 74 73 29 20 63 6f 6e 74 61   brackets) conta
8b20: 69 6e 65 64 20 69 6e 20 74 68 65 20 66 69 6e 61  ined in the fina
8b30: 6c 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  l..      #      
8b40: 20 73 63 72 69 70 74 20 66 72 61 67 6d 65 6e 74   script fragment
8b50: 20 77 69 6c 6c 20 65 6e 64 20 75 70 20 62 65 69   will end up bei
8b60: 6e 67 20 65 76 61 6c 75 61 74 65 64 20 69 6e 20  ng evaluated in 
8b70: 74 68 65 20 63 6f 6e 74 65 78 74 20 6f 66 20 74  the context of t
8b80: 68 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  he..      #     
8b90: 20 20 63 61 6c 6c 69 6e 67 20 69 6e 74 65 72 70    calling interp
8ba0: 72 65 74 65 72 20 61 6e 64 20 6e 6f 74 20 74 68  reter and not th
8bb0: 65 20 74 61 72 67 65 74 20 69 6e 74 65 72 70 72  e target interpr
8bc0: 65 74 65 72 20 63 72 65 61 74 65 64 20 69 6e 20  eter created in 
8bd0: 74 68 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20  the..      #    
8be0: 20 20 20 69 73 6f 6c 61 74 65 64 20 61 70 70 6c     isolated appl
8bf0: 69 63 61 74 69 6f 6e 20 64 6f 6d 61 69 6e 20 75  ication domain u
8c00: 6e 6c 65 73 73 20 74 68 65 20 64 6f 6c 6c 61 72  nless the dollar
8c10: 20 73 69 67 6e 73 20 61 6e 64 2f 6f 72 20 73 71   signs and/or sq
8c20: 75 61 72 65 0d 0a 20 20 20 20 20 20 23 20 20 20  uare..      #   
8c30: 20 20 20 20 62 72 61 63 6b 65 74 73 20 61 72 65      brackets are
8c40: 20 73 70 65 63 69 61 6c 6c 79 20 71 75 6f 74 65   specially quote
8c50: 64 20 77 69 74 68 20 62 61 63 6b 73 6c 61 73 68  d with backslash
8c60: 65 73 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  es...      #..  
8c70: 20 20 20 20 72 65 74 75 72 6e 20 5b 75 70 6c 65      return [uple
8c80: 76 65 6c 20 31 20 5b 6c 69 73 74 20 73 75 62 73  vel 1 [list subs
8c90: 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20 24 70  t [appendArgs $p
8ca0: 72 65 66 69 78 20 7b 0d 0a 20 20 20 20 20 20 20  refix {..       
8cb0: 20 69 66 20 7b 5b 68 61 73 52 75 6e 74 69 6d 65   if {[hasRuntime
8cc0: 4f 70 74 69 6f 6e 20 6e 61 74 69 76 65 5d 7d 20  Option native]} 
8cd0: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
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 54 68 65 20 5c 5b 6f 62 6a   NOTE: The \[obj
8d00: 65 63 74 5c 5d 20 63 6f 6d 6d 61 6e 64 20 6d 61  ect\] command ma
8d10: 79 20 62 65 20 6d 69 73 73 69 6e 67 20 69 6e 20  y be missing in 
8d20: 73 6f 6d 65 20 45 61 67 6c 65 20 63 6f 72 65 0d  some Eagle core.
8d30: 0a 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20  .          #    
8d40: 20 20 20 6c 69 62 72 61 72 79 20 63 6f 6e 66 69     library confi
8d50: 67 75 72 61 74 69 6f 6e 73 2e 20 20 49 6e 20 74  gurations.  In t
8d60: 68 61 74 20 63 61 73 65 2c 20 77 65 20 63 61 6e  hat case, we can
8d70: 6e 6f 74 20 63 6f 70 79 20 74 68 65 0d 0a 20 20  not copy the..  
8d80: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
8d90: 22 6e 61 74 69 76 65 22 20 72 75 6e 74 69 6d 65  "native" runtime
8da0: 20 6f 70 74 69 6f 6e 2e 0d 0a 20 20 20 20 20 20   option...      
8db0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
8dc0: 20 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20   catch {..      
8dd0: 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76        object inv
8de0: 6f 6b 65 20 49 6e 74 65 72 70 72 65 74 65 72 2e  oke Interpreter.
8df0: 47 65 74 41 63 74 69 76 65 20 41 64 64 52 75 6e  GetActive AddRun
8e00: 74 69 6d 65 4f 70 74 69 6f 6e 20 6e 61 74 69 76  timeOption nativ
8e10: 65 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  e..          }..
8e20: 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
8e30: 20 7d 20 5b 67 65 74 54 65 73 74 4f 76 65 72 72   } [getTestOverr
8e40: 69 64 65 73 50 72 65 61 6d 62 6c 65 20 5b 6c 69  idesPreamble [li
8e50: 73 74 20 70 61 74 68 20 74 65 73 74 5f 63 68 61  st path test_cha
8e60: 6e 6e 65 6c 5d 5d 20 24 73 75 66 66 69 78 5d 5d  nnel]] $suffix]]
8e70: 5d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  ]..    }.....   
8e80: 20 70 72 6f 63 20 74 72 79 43 6f 70 79 45 78 74   proc tryCopyExt
8e90: 65 72 6e 61 6c 46 69 6c 65 20 7b 0d 0a 20 20 20  ernalFile {..   
8ea0: 20 20 20 20 20 20 20 20 20 66 69 6c 65 4e 61 6d           fileNam
8eb0: 65 20 7b 70 6c 61 74 66 6f 72 6d 20 22 22 7d 20  e {platform ""} 
8ec0: 7b 6e 65 77 46 69 6c 65 4e 61 6d 65 20 22 22 7d  {newFileName ""}
8ed0: 20 7b 76 65 72 62 6f 73 65 20 66 61 6c 73 65 7d   {verbose false}
8ee0: 20 7d 20 7b 0d 0a 20 20 20 20 20 20 73 65 74 20   } {..      set 
8ef0: 73 6f 75 72 63 65 46 69 6c 65 4e 61 6d 65 20 5b  sourceFileName [
8f00: 67 65 74 45 78 74 65 72 6e 61 6c 46 69 6c 65 4e  getExternalFileN
8f10: 61 6d 65 20 24 66 69 6c 65 4e 61 6d 65 5d 0d 0a  ame $fileName]..
8f20: 0d 0a 20 20 20 20 20 20 69 66 20 7b 21 5b 66 69  ..      if {![fi
8f30: 6c 65 20 65 78 69 73 74 73 20 24 73 6f 75 72 63  le exists $sourc
8f40: 65 46 69 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e  eFileName]} then
8f50: 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b   {..        if {
8f60: 24 76 65 72 62 6f 73 65 7d 20 74 68 65 6e 20 7b  $verbose} then {
8f70: 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70 75 74  ..          tput
8f80: 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
8f90: 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
8fa0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22  .              "
8fb0: 2d 2d 2d 2d 20 73 6b 69 70 70 65 64 20 63 6f 70  ---- skipped cop
8fc0: 79 69 6e 67 20 65 78 74 65 72 6e 61 6c 20 66 69  ying external fi
8fd0: 6c 65 20 5c 22 22 20 24 73 6f 75 72 63 65 46 69  le \"" $sourceFi
8fe0: 6c 65 4e 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20  leName \..      
8ff0: 20 20 20 20 20 20 20 20 22 5c 22 2c 20 69 74 20          "\", it 
9000: 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 5c 6e  does not exist\n
9010: 22 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20  "]..        }.. 
9020: 20 20 20 20 20 20 20 72 65 74 75 72 6e 0d 0a 20         return.. 
9030: 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
9040: 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67  if {[string leng
9050: 74 68 20 24 6e 65 77 46 69 6c 65 4e 61 6d 65 5d  th $newFileName]
9060: 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20   > 0} then {..  
9070: 20 20 20 20 20 20 73 65 74 20 74 61 72 67 65 74        set target
9080: 46 69 6c 65 4e 61 6d 65 20 5b 67 65 74 42 69 6e  FileName [getBin
9090: 61 72 79 46 69 6c 65 4e 61 6d 65 20 24 6e 65 77  aryFileName $new
90a0: 46 69 6c 65 4e 61 6d 65 20 24 70 6c 61 74 66 6f  FileName $platfo
90b0: 72 6d 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73  rm]..      } els
90c0: 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 65 74  e {..        set
90d0: 20 74 61 72 67 65 74 46 69 6c 65 4e 61 6d 65 20   targetFileName 
90e0: 5b 67 65 74 42 69 6e 61 72 79 46 69 6c 65 4e 61  [getBinaryFileNa
90f0: 6d 65 20 24 66 69 6c 65 4e 61 6d 65 20 24 70 6c  me $fileName $pl
9100: 61 74 66 6f 72 6d 5d 0d 0a 20 20 20 20 20 20 7d  atform]..      }
9110: 0d 0a 0d 0a 20 20 20 20 20 20 73 65 74 20 74 61  ....      set ta
9120: 72 67 65 74 44 69 72 65 63 74 6f 72 79 20 5b 66  rgetDirectory [f
9130: 69 6c 65 20 64 69 72 6e 61 6d 65 20 24 74 61 72  ile dirname $tar
9140: 67 65 74 46 69 6c 65 4e 61 6d 65 5d 0d 0a 0d 0a  getFileName]....
9150: 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68        if {[catch
9160: 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b   {..        if {
9170: 21 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24 74  ![file exists $t
9180: 61 72 67 65 74 44 69 72 65 63 74 6f 72 79 5d 7d  argetDirectory]}
9190: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
91a0: 20 20 20 66 69 6c 65 20 6d 6b 64 69 72 20 24 74     file mkdir $t
91b0: 61 72 67 65 74 44 69 72 65 63 74 6f 72 79 0d 0a  argetDirectory..
91c0: 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
91d0: 20 20 20 66 69 6c 65 20 63 6f 70 79 20 2d 66 6f     file copy -fo
91e0: 72 63 65 20 24 73 6f 75 72 63 65 46 69 6c 65 4e  rce $sourceFileN
91f0: 61 6d 65 20 24 74 61 72 67 65 74 46 69 6c 65 4e  ame $targetFileN
9200: 61 6d 65 0d 0a 20 20 20 20 20 20 7d 5d 20 3d 3d  ame..      }] ==
9210: 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
9220: 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
9230: 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e  t_channel [appen
9240: 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
9250: 20 20 20 20 20 22 2d 2d 2d 2d 20 63 6f 70 69 65       "---- copie
9260: 64 20 65 78 74 65 72 6e 61 6c 20 66 69 6c 65 20  d external file 
9270: 66 72 6f 6d 20 5c 22 22 20 24 73 6f 75 72 63 65  from \"" $source
9280: 46 69 6c 65 4e 61 6d 65 20 22 5c 22 20 74 6f 20  FileName "\" to 
9290: 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  \"" \..         
92a0: 20 20 20 24 74 61 72 67 65 74 46 69 6c 65 4e 61     $targetFileNa
92b0: 6d 65 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20  me \"\n]..      
92c0: 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
92d0: 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
92e0: 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
92f0: 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
9300: 20 20 20 22 2d 2d 2d 2d 20 66 61 69 6c 65 64 20     "---- failed 
9310: 74 6f 20 63 6f 70 79 20 65 78 74 65 72 6e 61 6c  to copy external
9320: 20 66 69 6c 65 20 66 72 6f 6d 20 5c 22 22 20 24   file from \"" $
9330: 73 6f 75 72 63 65 46 69 6c 65 4e 61 6d 65 20 5c  sourceFileName \
9340: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 5c  ..            "\
9350: 22 20 74 6f 20 5c 22 22 20 24 74 61 72 67 65 74  " to \"" $target
9360: 46 69 6c 65 4e 61 6d 65 20 5c 22 5c 6e 5d 0d 0a  FileName \"\n]..
9370: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a        }..    }..
9380: 0c 0d 0a 20 20 20 20 70 72 6f 63 20 74 72 79 43  ...    proc tryC
9390: 6f 70 79 42 69 6e 61 72 79 46 69 6c 65 20 7b 0d  opyBinaryFile {.
93a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 69 6c  .            fil
93b0: 65 4e 61 6d 65 20 7b 70 6c 61 74 66 6f 72 6d 20  eName {platform 
93c0: 22 22 7d 20 7b 6e 65 77 46 69 6c 65 4e 61 6d 65  ""} {newFileName
93d0: 20 22 22 7d 20 7b 76 65 72 62 6f 73 65 20 66 61   ""} {verbose fa
93e0: 6c 73 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20  lse} } {..      
93f0: 73 65 74 20 73 6f 75 72 63 65 46 69 6c 65 4e 61  set sourceFileNa
9400: 6d 65 20 5b 67 65 74 42 69 6e 61 72 79 46 69 6c  me [getBinaryFil
9410: 65 4e 61 6d 65 20 24 66 69 6c 65 4e 61 6d 65 20  eName $fileName 
9420: 24 70 6c 61 74 66 6f 72 6d 5d 0d 0a 0d 0a 20 20  $platform]....  
9430: 20 20 20 20 69 66 20 7b 21 5b 66 69 6c 65 20 65      if {![file e
9440: 78 69 73 74 73 20 24 73 6f 75 72 63 65 46 69 6c  xists $sourceFil
9450: 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a  eName]} then {..
9460: 20 20 20 20 20 20 20 20 69 66 20 7b 24 76 65 72          if {$ver
9470: 62 6f 73 65 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  bose} then {..  
9480: 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
9490: 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61  :test_channel [a
94a0: 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
94b0: 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
94c0: 20 73 6b 69 70 70 65 64 20 63 6f 70 79 69 6e 67   skipped copying
94d0: 20 62 69 6e 61 72 79 20 66 69 6c 65 20 5c 22 22   binary file \""
94e0: 20 24 73 6f 75 72 63 65 46 69 6c 65 4e 61 6d 65   $sourceFileName
94f0: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
9500: 20 20 22 5c 22 2c 20 69 74 20 64 6f 65 73 20 6e    "\", it does n
9510: 6f 74 20 65 78 69 73 74 5c 6e 22 5d 0d 0a 20 20  ot exist\n"]..  
9520: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
9530: 20 72 65 74 75 72 6e 0d 0a 20 20 20 20 20 20 7d   return..      }
9540: 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 73  ....      if {[s
9550: 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 6e 65  tring length $ne
9560: 77 46 69 6c 65 4e 61 6d 65 5d 20 3e 20 30 7d 20  wFileName] > 0} 
9570: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
9580: 73 65 74 20 74 61 72 67 65 74 46 69 6c 65 4e 61  set targetFileNa
9590: 6d 65 20 5b 67 65 74 42 75 69 6c 64 46 69 6c 65  me [getBuildFile
95a0: 4e 61 6d 65 20 24 6e 65 77 46 69 6c 65 4e 61 6d  Name $newFileNam
95b0: 65 20 24 70 6c 61 74 66 6f 72 6d 5d 0d 0a 20 20  e $platform]..  
95c0: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
95d0: 20 20 20 20 20 20 73 65 74 20 74 61 72 67 65 74        set target
95e0: 46 69 6c 65 4e 61 6d 65 20 5b 67 65 74 42 75 69  FileName [getBui
95f0: 6c 64 46 69 6c 65 4e 61 6d 65 20 24 66 69 6c 65  ldFileName $file
9600: 4e 61 6d 65 20 24 70 6c 61 74 66 6f 72 6d 5d 0d  Name $platform].
9610: 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
9620: 20 20 73 65 74 20 74 61 72 67 65 74 44 69 72 65    set targetDire
9630: 63 74 6f 72 79 20 5b 66 69 6c 65 20 64 69 72 6e  ctory [file dirn
9640: 61 6d 65 20 24 74 61 72 67 65 74 46 69 6c 65 4e  ame $targetFileN
9650: 61 6d 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 69 66  ame]....      if
9660: 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20   {[catch {..    
9670: 20 20 20 20 69 66 20 7b 21 5b 66 69 6c 65 20 65      if {![file e
9680: 78 69 73 74 73 20 24 74 61 72 67 65 74 44 69 72  xists $targetDir
9690: 65 63 74 6f 72 79 5d 7d 20 74 68 65 6e 20 7b 0d  ectory]} then {.
96a0: 0a 20 20 20 20 20 20 20 20 20 20 66 69 6c 65 20  .          file 
96b0: 6d 6b 64 69 72 20 24 74 61 72 67 65 74 44 69 72  mkdir $targetDir
96c0: 65 63 74 6f 72 79 0d 0a 20 20 20 20 20 20 20 20  ectory..        
96d0: 7d 0d 0a 20 20 20 20 20 20 20 20 66 69 6c 65 20  }..        file 
96e0: 63 6f 70 79 20 2d 66 6f 72 63 65 20 24 73 6f 75  copy -force $sou
96f0: 72 63 65 46 69 6c 65 4e 61 6d 65 20 24 74 61 72  rceFileName $tar
9700: 67 65 74 46 69 6c 65 4e 61 6d 65 0d 0a 20 20 20  getFileName..   
9710: 20 20 20 7d 5d 20 3d 3d 20 30 7d 20 74 68 65 6e     }] == 0} then
9720: 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74   {..        tput
9730: 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
9740: 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
9750: 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d  .            "--
9760: 2d 2d 20 63 6f 70 69 65 64 20 62 69 6e 61 72 79  -- copied binary
9770: 20 66 69 6c 65 20 66 72 6f 6d 20 5c 22 22 20 24   file from \"" $
9780: 73 6f 75 72 63 65 46 69 6c 65 4e 61 6d 65 20 22  sourceFileName "
9790: 5c 22 20 74 6f 20 5c 22 22 20 5c 0d 0a 20 20 20  \" to \"" \..   
97a0: 20 20 20 20 20 20 20 20 20 24 74 61 72 67 65 74           $target
97b0: 46 69 6c 65 4e 61 6d 65 20 5c 22 5c 6e 5d 0d 0a  FileName \"\n]..
97c0: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
97d0: 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
97e0: 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61  :test_channel [a
97f0: 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
9800: 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 66           "---- f
9810: 61 69 6c 65 64 20 74 6f 20 63 6f 70 79 20 62 69  ailed to copy bi
9820: 6e 61 72 79 20 66 69 6c 65 20 66 72 6f 6d 20 5c  nary file from \
9830: 22 22 20 24 73 6f 75 72 63 65 46 69 6c 65 4e 61  "" $sourceFileNa
9840: 6d 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  me \..          
9850: 20 20 22 5c 22 20 74 6f 20 5c 22 22 20 24 74 61    "\" to \"" $ta
9860: 72 67 65 74 46 69 6c 65 4e 61 6d 65 20 5c 22 5c  rgetFileName \"\
9870: 6e 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20  n]..      }..   
9880: 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
9890: 74 72 79 43 6f 70 79 42 75 69 6c 64 46 69 6c 65  tryCopyBuildFile
98a0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
98b0: 66 69 6c 65 4e 61 6d 65 20 7b 70 6c 61 74 66 6f  fileName {platfo
98c0: 72 6d 20 22 22 7d 20 7b 6e 65 77 46 69 6c 65 4e  rm ""} {newFileN
98d0: 61 6d 65 20 22 22 7d 20 7b 76 65 72 62 6f 73 65  ame ""} {verbose
98e0: 20 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a 20 20 20   false} } {..   
98f0: 20 20 20 73 65 74 20 73 6f 75 72 63 65 46 69 6c     set sourceFil
9900: 65 4e 61 6d 65 20 5b 67 65 74 42 75 69 6c 64 46  eName [getBuildF
9910: 69 6c 65 4e 61 6d 65 20 24 66 69 6c 65 4e 61 6d  ileName $fileNam
9920: 65 20 24 70 6c 61 74 66 6f 72 6d 5d 0d 0a 0d 0a  e $platform]....
9930: 20 20 20 20 20 20 69 66 20 7b 21 5b 66 69 6c 65        if {![file
9940: 20 65 78 69 73 74 73 20 24 73 6f 75 72 63 65 46   exists $sourceF
9950: 69 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b  ileName]} then {
9960: 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 24 76  ..        if {$v
9970: 65 72 62 6f 73 65 7d 20 74 68 65 6e 20 7b 0d 0a  erbose} then {..
9980: 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
9990: 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
99a0: 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
99b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d               "--
99c0: 2d 2d 20 73 6b 69 70 70 65 64 20 63 6f 70 79 69  -- skipped copyi
99d0: 6e 67 20 62 75 69 6c 64 20 66 69 6c 65 20 5c 22  ng build file \"
99e0: 22 20 24 73 6f 75 72 63 65 46 69 6c 65 4e 61 6d  " $sourceFileNam
99f0: 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e \..           
9a00: 20 20 20 22 5c 22 2c 20 69 74 20 64 6f 65 73 20     "\", it does 
9a10: 6e 6f 74 20 65 78 69 73 74 5c 6e 22 5d 0d 0a 20  not exist\n"].. 
9a20: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
9a30: 20 20 72 65 74 75 72 6e 0d 0a 20 20 20 20 20 20    return..      
9a40: 7d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b  }....      if {[
9a50: 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 6e  string length $n
9a60: 65 77 46 69 6c 65 4e 61 6d 65 5d 20 3e 20 30 7d  ewFileName] > 0}
9a70: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
9a80: 20 73 65 74 20 74 61 72 67 65 74 46 69 6c 65 4e   set targetFileN
9a90: 61 6d 65 20 5b 67 65 74 42 69 6e 61 72 79 46 69  ame [getBinaryFi
9aa0: 6c 65 4e 61 6d 65 20 24 6e 65 77 46 69 6c 65 4e  leName $newFileN
9ab0: 61 6d 65 20 24 70 6c 61 74 66 6f 72 6d 5d 0d 0a  ame $platform]..
9ac0: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
9ad0: 20 20 20 20 20 20 20 20 73 65 74 20 74 61 72 67          set targ
9ae0: 65 74 46 69 6c 65 4e 61 6d 65 20 5b 67 65 74 42  etFileName [getB
9af0: 69 6e 61 72 79 46 69 6c 65 4e 61 6d 65 20 24 66  inaryFileName $f
9b00: 69 6c 65 4e 61 6d 65 20 24 70 6c 61 74 66 6f 72  ileName $platfor
9b10: 6d 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  m]..      }.... 
9b20: 20 20 20 20 20 73 65 74 20 74 61 72 67 65 74 44       set targetD
9b30: 69 72 65 63 74 6f 72 79 20 5b 66 69 6c 65 20 64  irectory [file d
9b40: 69 72 6e 61 6d 65 20 24 74 61 72 67 65 74 46 69  irname $targetFi
9b50: 6c 65 4e 61 6d 65 5d 0d 0a 0d 0a 20 20 20 20 20  leName]....     
9b60: 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20   if {[catch {.. 
9b70: 20 20 20 20 20 20 20 69 66 20 7b 21 5b 66 69 6c         if {![fil
9b80: 65 20 65 78 69 73 74 73 20 24 74 61 72 67 65 74  e exists $target
9b90: 44 69 72 65 63 74 6f 72 79 5d 7d 20 74 68 65 6e  Directory]} then
9ba0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 66 69   {..          fi
9bb0: 6c 65 20 6d 6b 64 69 72 20 24 74 61 72 67 65 74  le mkdir $target
9bc0: 44 69 72 65 63 74 6f 72 79 0d 0a 20 20 20 20 20  Directory..     
9bd0: 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 66 69     }..        fi
9be0: 6c 65 20 63 6f 70 79 20 2d 66 6f 72 63 65 20 24  le copy -force $
9bf0: 73 6f 75 72 63 65 46 69 6c 65 4e 61 6d 65 20 24  sourceFileName $
9c00: 74 61 72 67 65 74 46 69 6c 65 4e 61 6d 65 0d 0a  targetFileName..
9c10: 20 20 20 20 20 20 7d 5d 20 3d 3d 20 30 7d 20 74        }] == 0} t
9c20: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 74  hen {..        t
9c30: 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
9c40: 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
9c50: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
9c60: 22 2d 2d 2d 2d 20 63 6f 70 69 65 64 20 62 75 69  "---- copied bui
9c70: 6c 64 20 66 69 6c 65 20 66 72 6f 6d 20 5c 22 22  ld file from \""
9c80: 20 24 73 6f 75 72 63 65 46 69 6c 65 4e 61 6d 65   $sourceFileName
9c90: 20 22 5c 22 20 74 6f 20 5c 22 22 20 5c 0d 0a 20   "\" to \"" \.. 
9ca0: 20 20 20 20 20 20 20 20 20 20 20 24 74 61 72 67             $targ
9cb0: 65 74 46 69 6c 65 4e 61 6d 65 20 5c 22 5c 6e 5d  etFileName \"\n]
9cc0: 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b  ..      } else {
9cd0: 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20  ..        tputs 
9ce0: 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
9cf0: 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
9d00: 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
9d10: 20 66 61 69 6c 65 64 20 74 6f 20 63 6f 70 79 20   failed to copy 
9d20: 62 75 69 6c 64 20 66 69 6c 65 20 66 72 6f 6d 20  build file from 
9d30: 5c 22 22 20 24 73 6f 75 72 63 65 46 69 6c 65 4e  \"" $sourceFileN
9d40: 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ame \..         
9d50: 20 20 20 22 5c 22 20 74 6f 20 5c 22 22 20 24 74     "\" to \"" $t
9d60: 61 72 67 65 74 46 69 6c 65 4e 61 6d 65 20 5c 22  argetFileName \"
9d70: 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20  \n]..      }..  
9d80: 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
9d90: 20 74 72 79 44 65 6c 65 74 65 42 69 6e 61 72 79   tryDeleteBinary
9da0: 46 69 6c 65 20 7b 20 66 69 6c 65 4e 61 6d 65 20  File { fileName 
9db0: 7b 70 6c 61 74 66 6f 72 6d 20 22 22 7d 20 7b 76  {platform ""} {v
9dc0: 65 72 62 6f 73 65 20 66 61 6c 73 65 7d 20 7d 20  erbose false} } 
9dd0: 7b 0d 0a 20 20 20 20 20 20 73 65 74 20 66 69 6c  {..      set fil
9de0: 65 4e 61 6d 65 20 5b 67 65 74 42 69 6e 61 72 79  eName [getBinary
9df0: 46 69 6c 65 4e 61 6d 65 20 24 66 69 6c 65 4e 61  FileName $fileNa
9e00: 6d 65 20 24 70 6c 61 74 66 6f 72 6d 5d 0d 0a 0d  me $platform]...
9e10: 0a 20 20 20 20 20 20 69 66 20 7b 21 5b 66 69 6c  .      if {![fil
9e20: 65 20 65 78 69 73 74 73 20 24 66 69 6c 65 4e 61  e exists $fileNa
9e30: 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  me]} then {..   
9e40: 20 20 20 20 20 69 66 20 7b 24 76 65 72 62 6f 73       if {$verbos
9e50: 65 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  e} then {..     
9e60: 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
9e70: 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
9e80: 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
9e90: 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 73 6b          "---- sk
9ea0: 69 70 70 65 64 20 64 65 6c 65 74 69 6e 67 20 62  ipped deleting b
9eb0: 69 6e 61 72 79 20 66 69 6c 65 20 5c 22 22 20 24  inary file \"" $
9ec0: 66 69 6c 65 4e 61 6d 65 20 5c 0d 0a 20 20 20 20  fileName \..    
9ed0: 20 20 20 20 20 20 20 20 20 20 22 5c 22 2c 20 69            "\", i
9ee0: 74 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74  t does not exist
9ef0: 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d  \n"]..        }.
9f00: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 0d  .        return.
9f10: 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
9f20: 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 66 69    if {[catch {fi
9f30: 6c 65 20 64 65 6c 65 74 65 20 24 66 69 6c 65 4e  le delete $fileN
9f40: 61 6d 65 7d 5d 20 3d 3d 20 30 7d 20 74 68 65 6e  ame}] == 0} then
9f50: 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74   {..        tput
9f60: 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
9f70: 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
9f80: 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d  .            "--
9f90: 2d 2d 20 64 65 6c 65 74 65 64 20 62 69 6e 61 72  -- deleted binar
9fa0: 79 20 66 69 6c 65 20 5c 22 22 20 24 66 69 6c 65  y file \"" $file
9fb0: 4e 61 6d 65 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20  Name \"\n]..    
9fc0: 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
9fd0: 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
9fe0: 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e  t_channel [appen
9ff0: 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
a000: 20 20 20 20 20 22 2d 2d 2d 2d 20 66 61 69 6c 65       "---- faile
a010: 64 20 74 6f 20 64 65 6c 65 74 65 20 62 69 6e 61  d to delete bina
a020: 72 79 20 66 69 6c 65 20 5c 22 22 20 24 66 69 6c  ry file \"" $fil
a030: 65 4e 61 6d 65 20 5c 22 5c 6e 5d 0d 0a 20 20 20  eName \"\n]..   
a040: 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a     }..    }.....
a050: 20 20 20 20 70 72 6f 63 20 74 72 79 44 65 6c 65      proc tryDele
a060: 74 65 42 75 69 6c 64 46 69 6c 65 20 7b 20 66 69  teBuildFile { fi
a070: 6c 65 4e 61 6d 65 20 7b 70 6c 61 74 66 6f 72 6d  leName {platform
a080: 20 22 22 7d 20 7b 76 65 72 62 6f 73 65 20 66 61   ""} {verbose fa
a090: 6c 73 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20  lse} } {..      
a0a0: 73 65 74 20 66 69 6c 65 4e 61 6d 65 20 5b 67 65  set fileName [ge
a0b0: 74 42 75 69 6c 64 46 69 6c 65 4e 61 6d 65 20 24  tBuildFileName $
a0c0: 66 69 6c 65 4e 61 6d 65 20 24 70 6c 61 74 66 6f  fileName $platfo
a0d0: 72 6d 5d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20  rm]....      if 
a0e0: 7b 21 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24  {![file exists $
a0f0: 66 69 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20  fileName]} then 
a100: 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 24  {..        if {$
a110: 76 65 72 62 6f 73 65 7d 20 74 68 65 6e 20 7b 0d  verbose} then {.
a120: 0a 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73  .          tputs
a130: 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
a140: 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
a150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d                "-
a160: 2d 2d 2d 20 73 6b 69 70 70 65 64 20 64 65 6c 65  --- skipped dele
a170: 74 69 6e 67 20 62 75 69 6c 64 20 66 69 6c 65 20  ting build file 
a180: 5c 22 22 20 24 66 69 6c 65 4e 61 6d 65 20 5c 0d  \"" $fileName \.
a190: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22  .              "
a1a0: 5c 22 2c 20 69 74 20 64 6f 65 73 20 6e 6f 74 20  \", it does not 
a1b0: 65 78 69 73 74 5c 6e 22 5d 0d 0a 20 20 20 20 20  exist\n"]..     
a1c0: 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 72 65     }..        re
a1d0: 74 75 72 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d  turn..      }...
a1e0: 0a 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63  .      if {[catc
a1f0: 68 20 7b 66 69 6c 65 20 64 65 6c 65 74 65 20 24  h {file delete $
a200: 66 69 6c 65 4e 61 6d 65 7d 5d 20 3d 3d 20 30 7d  fileName}] == 0}
a210: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
a220: 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
a230: 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
a240: 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
a250: 20 20 22 2d 2d 2d 2d 20 64 65 6c 65 74 65 64 20    "---- deleted 
a260: 62 75 69 6c 64 20 66 69 6c 65 20 5c 22 22 20 24  build file \"" $
a270: 66 69 6c 65 4e 61 6d 65 20 5c 22 5c 6e 5d 0d 0a  fileName \"\n]..
a280: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
a290: 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
a2a0: 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61  :test_channel [a
a2b0: 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
a2c0: 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 66           "---- f
a2d0: 61 69 6c 65 64 20 74 6f 20 64 65 6c 65 74 65 20  ailed to delete 
a2e0: 62 75 69 6c 64 20 66 69 6c 65 20 5c 22 22 20 24  build file \"" $
a2f0: 66 69 6c 65 4e 61 6d 65 20 5c 22 5c 6e 5d 0d 0a  fileName \"\n]..
a300: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a        }..    }..
a310: 0c 0d 0a 20 20 20 20 70 72 6f 63 20 74 72 79 43  ...    proc tryC
a320: 6f 70 79 41 73 73 65 6d 62 6c 79 20 7b 0d 0a 20  opyAssembly {.. 
a330: 20 20 20 20 20 20 20 20 20 20 20 66 69 6c 65 4e             fileN
a340: 61 6d 65 20 7b 70 6c 61 74 66 6f 72 6d 20 22 22  ame {platform ""
a350: 7d 20 7b 70 64 62 20 74 72 75 65 7d 20 7b 76 65  } {pdb true} {ve
a360: 72 62 6f 73 65 20 66 61 6c 73 65 7d 20 7d 20 7b  rbose false} } {
a370: 0d 0a 20 20 20 20 20 20 74 72 79 43 6f 70 79 42  ..      tryCopyB
a380: 75 69 6c 64 46 69 6c 65 20 24 66 69 6c 65 4e 61  uildFile $fileNa
a390: 6d 65 20 24 70 6c 61 74 66 6f 72 6d 20 22 22 20  me $platform "" 
a3a0: 24 76 65 72 62 6f 73 65 0d 0a 0d 0a 20 20 20 20  $verbose....    
a3b0: 20 20 69 66 20 7b 24 70 64 62 7d 20 74 68 65 6e    if {$pdb} then
a3c0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 72 79 43   {..        tryC
a3d0: 6f 70 79 42 75 69 6c 64 46 69 6c 65 20 5b 61 70  opyBuildFile [ap
a3e0: 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
a3f0: 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20 72 6f          [file ro
a400: 6f 74 6e 61 6d 65 20 24 66 69 6c 65 4e 61 6d 65  otname $fileName
a410: 5d 20 2e 70 64 62 5d 20 24 70 6c 61 74 66 6f 72  ] .pdb] $platfor
a420: 6d 20 22 22 20 24 76 65 72 62 6f 73 65 0d 0a 20  m "" $verbose.. 
a430: 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c       }..    }...
a440: 0d 0a 20 20 20 20 70 72 6f 63 20 74 72 79 44 65  ..    proc tryDe
a450: 6c 65 74 65 41 73 73 65 6d 62 6c 79 20 7b 0d 0a  leteAssembly {..
a460: 20 20 20 20 20 20 20 20 20 20 20 20 66 69 6c 65              file
a470: 4e 61 6d 65 20 7b 70 6c 61 74 66 6f 72 6d 20 22  Name {platform "
a480: 22 7d 20 7b 70 64 62 20 74 72 75 65 7d 20 7b 76  "} {pdb true} {v
a490: 65 72 62 6f 73 65 20 66 61 6c 73 65 7d 20 7d 20  erbose false} } 
a4a0: 7b 0d 0a 20 20 20 20 20 20 74 72 79 44 65 6c 65  {..      tryDele
a4b0: 74 65 42 69 6e 61 72 79 46 69 6c 65 20 24 66 69  teBinaryFile $fi
a4c0: 6c 65 4e 61 6d 65 20 24 70 6c 61 74 66 6f 72 6d  leName $platform
a4d0: 20 24 76 65 72 62 6f 73 65 0d 0a 0d 0a 20 20 20   $verbose....   
a4e0: 20 20 20 69 66 20 7b 24 70 64 62 7d 20 74 68 65     if {$pdb} the
a4f0: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 72 79  n {..        try
a500: 44 65 6c 65 74 65 42 69 6e 61 72 79 46 69 6c 65  DeleteBinaryFile
a510: 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
a520: 20 20 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c              [fil
a530: 65 20 72 6f 6f 74 6e 61 6d 65 20 24 66 69 6c 65  e rootname $file
a540: 4e 61 6d 65 5d 20 2e 70 64 62 5d 20 24 70 6c 61  Name] .pdb] $pla
a550: 74 66 6f 72 6d 20 24 76 65 72 62 6f 73 65 0d 0a  tform $verbose..
a560: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a        }..    }..
a570: 0c 0d 0a 20 20 20 20 70 72 6f 63 20 74 72 79 4c  ...    proc tryL
a580: 6f 61 64 41 73 73 65 6d 62 6c 79 20 7b 20 66 69  oadAssembly { fi
a590: 6c 65 4e 61 6d 65 20 7b 70 6c 61 74 66 6f 72 6d  leName {platform
a5a0: 20 22 22 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20   ""} } {..      
a5b0: 73 65 74 20 66 69 6c 65 4e 61 6d 65 20 5b 67 65  set fileName [ge
a5c0: 74 42 69 6e 61 72 79 46 69 6c 65 4e 61 6d 65 20  tBinaryFileName 
a5d0: 24 66 69 6c 65 4e 61 6d 65 20 24 70 6c 61 74 66  $fileName $platf
a5e0: 6f 72 6d 5d 0d 0a 0d 0a 20 20 20 20 20 20 69 66  orm]....      if
a5f0: 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20   {[catch {..    
a600: 20 20 20 20 73 65 74 20 61 73 73 65 6d 62 6c 79      set assembly
a610: 20 5b 6f 62 6a 65 63 74 20 6c 6f 61 64 20 2d 6c   [object load -l
a620: 6f 61 64 74 79 70 65 20 46 69 6c 65 20 2d 61 6c  oadtype File -al
a630: 69 61 73 20 24 66 69 6c 65 4e 61 6d 65 5d 0d 0a  ias $fileName]..
a640: 20 20 20 20 20 20 7d 5d 20 3d 3d 20 30 7d 20 74        }] == 0} t
a650: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  hen {..        #
a660: 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
a670: 3a 20 4e 6f 77 2c 20 61 64 64 20 74 68 65 20 6e  : Now, add the n
a680: 65 63 65 73 73 61 72 79 20 74 65 73 74 20 63 6f  ecessary test co
a690: 6e 73 74 72 61 69 6e 74 2e 0d 0a 20 20 20 20 20  nstraint...     
a6a0: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 61 64     #..        ad
a6b0: 64 43 6f 6e 73 74 72 61 69 6e 74 20 5b 66 69 6c  dConstraint [fil
a6c0: 65 20 72 6f 6f 74 6e 61 6d 65 20 5b 66 69 6c 65  e rootname [file
a6d0: 20 74 61 69 6c 20 24 66 69 6c 65 4e 61 6d 65 5d   tail $fileName]
a6e0: 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  ]....        #..
a6f0: 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
a700: 47 72 61 62 20 74 68 65 20 69 6d 61 67 65 20 72  Grab the image r
a710: 75 6e 74 69 6d 65 20 76 65 72 73 69 6f 6e 20 66  untime version f
a720: 72 6f 6d 20 74 68 65 20 61 73 73 65 6d 62 6c 79  rom the assembly
a730: 20 62 65 63 61 75 73 65 0d 0a 20 20 20 20 20 20   because..      
a740: 20 20 23 20 20 20 20 20 20 20 73 65 76 65 72 61    #       severa
a750: 6c 20 74 65 73 74 73 20 72 65 6c 79 20 6f 6e 20  l tests rely on 
a760: 69 74 20 68 61 76 69 6e 67 20 61 20 63 65 72 74  it having a cert
a770: 61 69 6e 20 76 61 6c 75 65 2e 0d 0a 20 20 20 20  ain value...    
a780: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 61      #..        a
a790: 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70  ddConstraint [ap
a7a0: 70 65 6e 64 41 72 67 73 20 5b 66 69 6c 65 20 74  pendArgs [file t
a7b0: 61 69 6c 20 24 66 69 6c 65 4e 61 6d 65 5d 20 5f  ail $fileName] _
a7c0: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
a7d0: 5b 24 61 73 73 65 6d 62 6c 79 20 49 6d 61 67 65  [$assembly Image
a7e0: 52 75 6e 74 69 6d 65 56 65 72 73 69 6f 6e 5d 5d  RuntimeVersion]]
a7f0: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  ....        #.. 
a800: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 52         # NOTE: R
a810: 65 74 75 72 6e 20 74 68 65 20 66 75 6c 6c 20 70  eturn the full p
a820: 61 74 68 20 6f 66 20 74 68 65 20 6c 6f 61 64 65  ath of the loade
a830: 64 20 66 69 6c 65 2e 0d 0a 20 20 20 20 20 20 20  d file...       
a840: 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75   #..        retu
a850: 72 6e 20 24 66 69 6c 65 4e 61 6d 65 0d 0a 20 20  rn $fileName..  
a860: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 72      }....      r
a870: 65 74 75 72 6e 20 22 22 0d 0a 20 20 20 20 7d 0d  eturn ""..    }.
a880: 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 69 73 53  ....    proc isS
a890: 51 4c 69 74 65 52 65 61 64 79 20 7b 7d 20 7b 0d  QLiteReady {} {.
a8a0: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
a8b0: 23 20 4e 4f 54 45 3a 20 54 68 69 73 20 70 72 6f  # NOTE: This pro
a8c0: 63 65 64 75 72 65 20 6d 75 73 74 20 72 65 74 75  cedure must retu
a8d0: 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 6f 6e 6c 79  rn non-zero only
a8e0: 20 69 66 20 74 68 65 20 53 51 4c 69 74 65 20 6e   if the SQLite n
a8f0: 61 74 69 76 65 0d 0a 20 20 20 20 20 20 23 20 20  ative..      #  
a900: 20 20 20 20 20 6c 69 62 72 61 72 79 20 61 6e 64       library and
a910: 20 74 68 65 20 53 79 73 74 65 6d 2e 44 61 74 61   the System.Data
a920: 2e 53 51 4c 69 74 65 20 6d 61 6e 61 67 65 64 20  .SQLite managed 
a930: 61 73 73 65 6d 62 6c 79 20 61 72 65 20 6c 6f 61  assembly are loa
a940: 64 65 64 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ded..      #    
a950: 20 20 20 61 6e 64 20 72 65 61 64 79 20 66 6f 72     and ready for
a960: 20 75 73 65 20 62 79 20 74 68 65 20 74 65 73 74   use by the test
a970: 20 73 75 69 74 65 2e 20 20 43 75 72 72 65 6e 74   suite.  Current
a980: 6c 79 2c 20 74 68 69 73 20 70 72 6f 63 65 64 75  ly, this procedu
a990: 72 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  re..      #     
a9a0: 20 20 73 68 6f 75 6c 64 20 62 65 20 63 61 6c 6c    should be call
a9b0: 65 64 20 6f 6e 6c 79 20 61 66 74 65 72 20 74 68  ed only after th
a9c0: 65 20 5b 74 72 79 4c 6f 61 64 41 73 73 65 6d 62  e [tryLoadAssemb
a9d0: 6c 79 5d 20 70 72 6f 63 65 64 75 72 65 20 68 61  ly] procedure ha
a9e0: 73 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  s..      #      
a9f0: 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 74 6f 20   been called to 
aa00: 70 72 6f 62 65 20 66 6f 72 20 74 68 65 20 53 79  probe for the Sy
aa10: 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
aa20: 20 6d 61 6e 61 67 65 64 20 61 73 73 65 6d 62 6c   managed assembl
aa30: 79 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  y..      #      
aa40: 20 61 6e 64 20 74 68 65 20 5b 63 68 65 63 6b 46   and the [checkF
aa50: 6f 72 53 51 4c 69 74 65 5d 20 70 72 6f 63 65 64  orSQLite] proced
aa60: 75 72 65 20 68 61 73 20 62 65 65 6e 20 63 61 6c  ure has been cal
aa70: 6c 65 64 20 74 6f 20 70 72 6f 62 65 20 66 6f 72  led to probe for
aa80: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
aa90: 74 68 65 20 53 51 4c 69 74 65 20 6e 61 74 69 76  the SQLite nativ
aaa0: 65 20 6c 69 62 72 61 72 79 3b 20 6f 74 68 65 72  e library; other
aab0: 77 69 73 65 2c 20 74 68 69 73 20 70 72 6f 63 65  wise, this proce
aac0: 64 75 72 65 20 77 69 6c 6c 20 73 69 6d 70 6c 79  dure will simply
aad0: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
aae0: 61 6c 77 61 79 73 20 72 65 74 75 72 6e 20 7a 65  always return ze
aaf0: 72 6f 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  ro...      #..  
ab00: 20 20 20 20 72 65 74 75 72 6e 20 5b 65 78 70 72      return [expr
ab10: 20 7b 0d 0a 20 20 20 20 20 20 20 20 5b 68 61 76   {..        [hav
ab20: 65 43 6f 6e 73 74 72 61 69 6e 74 20 53 79 73 74  eConstraint Syst
ab30: 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 5d 20  em.Data.SQLite] 
ab40: 26 26 20 5b 68 61 76 65 43 6f 6e 73 74 72 61 69  && [haveConstrai
ab50: 6e 74 20 53 51 4c 69 74 65 5d 0d 0a 20 20 20 20  nt SQLite]..    
ab60: 20 20 7d 5d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a    }]..    }.....
ab70: 20 20 20 20 70 72 6f 63 20 6d 61 74 63 68 4d 61      proc matchMa
ab80: 63 68 69 6e 65 20 7b 20 70 6c 61 74 66 6f 72 6d  chine { platform
ab90: 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20   } {..      #.. 
aba0: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 6e 20       # NOTE: An 
abb0: 65 6d 70 74 79 20 73 74 72 69 6e 67 20 66 6f 72  empty string for
abc0: 20 74 68 65 20 70 6c 61 74 66 6f 72 6d 20 6d 65   the platform me
abd0: 61 6e 73 20 74 68 61 74 20 74 68 65 20 62 75 69  ans that the bui
abe0: 6c 64 20 69 73 20 6e 6f 74 0d 0a 20 20 20 20 20  ld is not..     
abf0: 20 23 20 20 20 20 20 20 20 5b 70 72 69 6d 61 72   #       [primar
ac00: 69 6c 79 5d 20 61 20 6e 61 74 69 76 65 20 62 75  ily] a native bu
ac10: 69 6c 64 3b 20 74 68 65 72 65 66 6f 72 65 2c 20  ild; therefore, 
ac20: 69 74 20 61 6c 77 61 79 73 20 6d 61 74 63 68 65  it always matche
ac30: 73 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  s...      #..   
ac40: 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c     if {[string l
ac50: 65 6e 67 74 68 20 24 70 6c 61 74 66 6f 72 6d 5d  ength $platform]
ac60: 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20   == 0} then {.. 
ac70: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 72         return tr
ac80: 75 65 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  ue..      }.... 
ac90: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
aca0: 4e 4f 54 45 3a 20 44 6f 65 73 20 74 68 65 20 73  NOTE: Does the s
acb0: 70 65 63 69 66 69 65 64 20 70 6c 61 74 66 6f 72  pecified platfor
acc0: 6d 20 6d 61 74 63 68 20 75 70 20 74 6f 20 74 68  m match up to th
acd0: 65 20 63 75 72 72 65 6e 74 20 70 72 6f 63 65 73  e current proces
ace0: 73 3f 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  s?..      #..   
acf0: 20 20 20 69 66 20 7b 24 70 6c 61 74 66 6f 72 6d     if {$platform
ad00: 20 65 71 20 5b 6d 61 63 68 69 6e 65 54 6f 50 6c   eq [machineToPl
ad10: 61 74 66 6f 72 6d 20 24 3a 3a 74 63 6c 5f 70 6c  atform $::tcl_pl
ad20: 61 74 66 6f 72 6d 28 6d 61 63 68 69 6e 65 29 5d  atform(machine)]
ad30: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
ad40: 20 20 72 65 74 75 72 6e 20 74 72 75 65 0d 0a 20    return true.. 
ad50: 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
ad60: 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
ad70: 20 54 68 65 20 73 70 65 63 69 66 69 65 64 20 70   The specified p
ad80: 6c 61 74 66 6f 72 6d 20 64 6f 65 73 20 6e 6f 74  latform does not
ad90: 20 6d 61 74 63 68 20 75 70 20 77 69 74 68 20 74   match up with t
ada0: 68 65 20 70 6c 61 74 66 6f 72 6d 0d 0a 20 20 20  he platform..   
adb0: 20 20 20 23 20 20 20 20 20 20 20 66 6f 72 20 74     #       for t
adc0: 68 65 20 63 75 72 72 65 6e 74 20 70 72 6f 63 65  he current proce
add0: 73 73 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  ss...      #..  
ade0: 20 20 20 20 72 65 74 75 72 6e 20 66 61 6c 73 65      return false
adf0: 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
ae00: 70 72 6f 63 20 68 61 76 65 53 51 4c 69 74 65 4f  proc haveSQLiteO
ae10: 62 6a 65 63 74 43 6f 6d 6d 61 6e 64 20 7b 7d 20  bjectCommand {} 
ae20: 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  {..      #..    
ae30: 20 20 23 20 4e 4f 54 45 3a 20 49 73 20 74 68 65    # NOTE: Is the
ae40: 20 5b 6f 62 6a 65 63 74 5d 20 63 6f 6d 6d 61 6e   [object] comman
ae50: 64 20 63 75 72 72 65 6e 74 6c 79 20 61 76 61 69  d currently avai
ae60: 6c 61 62 6c 65 3f 0d 0a 20 20 20 20 20 20 23 0d  lable?..      #.
ae70: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b 65  .      return [e
ae80: 78 70 72 20 7b 5b 6c 6c 65 6e 67 74 68 20 5b 69  xpr {[llength [i
ae90: 6e 66 6f 20 63 6f 6d 6d 61 6e 64 73 20 6f 62 6a  nfo commands obj
aea0: 65 63 74 5d 5d 20 3e 20 30 7d 5d 0d 0a 20 20 20  ect]] > 0}]..   
aeb0: 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
aec0: 63 68 65 63 6b 46 6f 72 53 51 4c 69 74 65 4f 62  checkForSQLiteOb
aed0: 6a 65 63 74 43 6f 6d 6d 61 6e 64 20 7b 20 63 68  jectCommand { ch
aee0: 61 6e 6e 65 6c 20 7d 20 7b 0d 0a 20 20 20 20 20  annel } {..     
aef0: 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
af00: 22 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e 67 20 66  "---- checking f
af10: 6f 72 20 5c 22 6f 62 6a 65 63 74 5c 22 20 63 6f  or \"object\" co
af20: 6d 6d 61 6e 64 20 75 73 61 67 65 2e 2e 2e 20 22  mmand usage... "
af30: 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 21 5b  ....      if {![
af40: 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f  info exists ::no
af50: 28 73 71 6c 69 74 65 4f 62 6a 65 63 74 43 6f 6d  (sqliteObjectCom
af60: 6d 61 6e 64 29 5d 20 26 26 20 5c 0d 0a 20 20 20  mand)] && \..   
af70: 20 20 20 20 20 20 20 5b 68 61 76 65 53 51 4c 69         [haveSQLi
af80: 74 65 4f 62 6a 65 63 74 43 6f 6d 6d 61 6e 64 5d  teObjectCommand]
af90: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
afa0: 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
afb0: 20 79 65 73 5c 6e 0d 0a 20 20 20 20 20 20 7d 20   yes\n..      } 
afc0: 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
afd0: 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
afe0: 45 3a 20 55 6e 6c 65 73 73 20 77 65 20 61 72 65  E: Unless we are
aff0: 20 66 6f 72 62 69 64 64 65 6e 20 66 72 6f 6d 20   forbidden from 
b000: 64 6f 69 6e 67 20 73 6f 2c 20 61 64 64 20 73 6f  doing so, add so
b010: 6d 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 0d 0a  me constraints..
b020: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
b030: 74 68 61 74 20 77 69 6c 6c 20 61 6c 6c 6f 77 20  that will allow 
b040: 6d 6f 73 74 20 6f 66 20 74 68 65 20 74 65 73 74  most of the test
b050: 20 73 75 69 74 65 20 74 6f 20 72 75 6e 20 28 69   suite to run (i
b060: 2e 65 2e 20 74 68 6f 73 65 0d 0a 20 20 20 20 20  .e. those..     
b070: 20 20 20 23 20 20 20 20 20 20 20 74 65 73 74 73     #       tests
b080: 20 74 68 61 74 20 64 6f 20 6e 6f 74 20 64 69 72   that do not dir
b090: 65 63 74 6c 79 20 72 65 6c 79 20 75 70 6f 6e 20  ectly rely upon 
b0a0: 74 68 65 20 5b 6f 62 6a 65 63 74 5d 20 63 6f 6d  the [object] com
b0b0: 6d 61 6e 64 29 2e 0d 0a 20 20 20 20 20 20 20 20  mand)...        
b0c0: 23 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21  #..        if {!
b0d0: 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e  [info exists ::n
b0e0: 6f 28 73 68 69 6d 53 51 4c 69 74 65 41 73 73 65  o(shimSQLiteAsse
b0f0: 6d 62 6c 79 43 6f 6e 73 74 72 61 69 6e 74 73 29  mblyConstraints)
b100: 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
b110: 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69       addConstrai
b120: 6e 74 20 53 51 4c 69 74 65 0d 0a 20 20 20 20 20  nt SQLite..     
b130: 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69       addConstrai
b140: 6e 74 20 53 51 4c 69 74 65 49 6e 74 65 72 6f 70  nt SQLiteInterop
b150: 0d 0a 20 20 20 20 20 20 20 20 20 20 61 64 64 43  ..          addC
b160: 6f 6e 73 74 72 61 69 6e 74 20 53 79 73 74 65 6d  onstraint System
b170: 2e 44 61 74 61 2e 53 51 4c 69 74 65 0d 0a 20 20  .Data.SQLite..  
b180: 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74          addConst
b190: 72 61 69 6e 74 20 53 79 73 74 65 6d 2e 44 61 74  raint System.Dat
b1a0: 61 2e 53 51 4c 69 74 65 2e 45 6e 63 72 79 70 74  a.SQLite.Encrypt
b1b0: 69 6f 6e 0d 0a 20 20 20 20 20 20 20 20 20 20 61  ion..          a
b1c0: 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 53 79 73  ddConstraint Sys
b1d0: 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e  tem.Data.SQLite.
b1e0: 4c 69 6e 71 0d 0a 0d 0a 20 20 20 20 20 20 20 20  Linq....        
b1f0: 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20    addConstraint 
b200: 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
b210: 20 20 20 20 20 20 20 20 20 20 20 20 20 53 79 73               Sys
b220: 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e  tem.Data.SQLite.
b230: 64 6c 6c 5f 76 20 5b 67 65 74 42 75 69 6c 64 43  dll_v [getBuildC
b240: 6c 72 56 65 72 73 69 6f 6e 5d 5d 0d 0a 20 20 20  lrVersion]]..   
b250: 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
b260: 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69    if {![info exi
b270: 73 74 73 20 3a 3a 6e 6f 28 73 68 69 6d 53 51 4c  sts ::no(shimSQL
b280: 69 74 65 44 65 66 69 6e 65 43 6f 6e 73 74 61 6e  iteDefineConstan
b290: 74 43 6f 6e 73 74 72 61 69 6e 74 73 29 5d 7d 20  tConstraints)]} 
b2a0: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
b2b0: 20 20 66 6f 72 65 61 63 68 20 64 65 66 69 6e 65    foreach define
b2c0: 43 6f 6e 73 74 61 6e 74 20 5b 6c 69 73 74 20 5c  Constant [list \
b2d0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
b2e0: 49 4e 54 45 52 4f 50 5f 45 58 54 45 4e 53 49 4f  INTEROP_EXTENSIO
b2f0: 4e 5f 46 55 4e 43 54 49 4f 4e 53 20 49 4e 54 45  N_FUNCTIONS INTE
b300: 52 4f 50 5f 54 45 53 54 5f 45 58 54 45 4e 53 49  ROP_TEST_EXTENSI
b310: 4f 4e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  ON \..          
b320: 20 20 20 20 49 4e 54 45 52 4f 50 5f 56 49 52 54      INTEROP_VIRT
b330: 55 41 4c 5f 54 41 42 4c 45 20 55 53 45 5f 49 4e  UAL_TABLE USE_IN
b340: 54 45 52 4f 50 5f 44 4c 4c 5d 20 7b 0d 0a 20 20  TEROP_DLL] {..  
b350: 20 20 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e            addCon
b360: 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41  straint [appendA
b370: 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
b380: 20 20 20 20 20 20 20 64 65 66 69 6e 65 43 6f 6e         defineCon
b390: 73 74 61 6e 74 2e 53 79 73 74 65 6d 2e 44 61 74  stant.System.Dat
b3a0: 61 2e 53 51 4c 69 74 65 2e 20 24 64 65 66 69 6e  a.SQLite. $defin
b3b0: 65 43 6f 6e 73 74 61 6e 74 5d 0d 0a 20 20 20 20  eConstant]..    
b3c0: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
b3d0: 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66   }....        if
b3e0: 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20   {![info exists 
b3f0: 3a 3a 6e 6f 28 73 68 69 6d 53 51 4c 69 74 65 56  ::no(shimSQLiteV
b400: 69 73 75 61 6c 53 74 75 64 69 6f 43 6f 6e 73 74  isualStudioConst
b410: 72 61 69 6e 74 73 29 5d 7d 20 74 68 65 6e 20 7b  raints)]} then {
b420: 0d 0a 20 20 20 20 20 20 20 20 20 20 61 64 64 43  ..          addC
b430: 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e  onstraint [appen
b440: 64 41 72 67 73 20 76 69 73 75 61 6c 53 74 75 64  dArgs visualStud
b450: 69 6f 20 5b 67 65 74 42 75 69 6c 64 59 65 61 72  io [getBuildYear
b460: 5d 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d  ]]..        }...
b470: 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24  .        tputs $
b480: 63 68 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d 0a 20 20  channel no\n..  
b490: 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d      }..    }....
b4a0: 0a 20 20 20 20 70 72 6f 63 20 63 68 61 6e 67 65  .    proc change
b4b0: 4e 61 74 69 76 65 52 75 6e 74 69 6d 65 4f 70 74  NativeRuntimeOpt
b4c0: 69 6f 6e 20 7b 20 6e 61 74 69 76 65 20 7d 20 7b  ion { native } {
b4d0: 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 6c 6c 65  ..      if {[lle
b4e0: 6e 67 74 68 20 5b 69 6e 66 6f 20 63 6f 6d 6d 61  ngth [info comma
b4f0: 6e 64 73 20 64 65 62 75 67 5d 5d 20 3e 20 30 20  nds debug]] > 0 
b500: 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  && \..          
b510: 5b 6c 6c 65 6e 67 74 68 20 5b 69 6e 66 6f 20 73  [llength [info s
b520: 75 62 63 6f 6d 6d 61 6e 64 73 20 64 65 62 75 67  ubcommands debug
b530: 20 72 75 6e 74 69 6d 65 6f 70 74 69 6f 6e 5d 5d   runtimeoption]]
b540: 20 3e 20 30 20 26 26 20 5b 63 61 74 63 68 20 7b   > 0 && [catch {
b550: 0d 0a 20 20 20 20 20 20 20 20 64 65 62 75 67 20  ..        debug 
b560: 72 75 6e 74 69 6d 65 6f 70 74 69 6f 6e 20 5b 65  runtimeoption [e
b570: 78 70 72 20 7b 24 6e 61 74 69 76 65 20 3f 20 22  xpr {$native ? "
b580: 61 64 64 22 20 3a 20 22 72 65 6d 6f 76 65 22 7d  add" : "remove"}
b590: 5d 20 6e 61 74 69 76 65 0d 0a 20 20 20 20 20 20  ] native..      
b5a0: 7d 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d  }] == 0} then {.
b5b0: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
b5c0: 74 72 75 65 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d  true..      }...
b5d0: 0a 20 20 20 20 20 20 69 66 20 7b 5b 68 61 76 65  .      if {[have
b5e0: 53 51 4c 69 74 65 4f 62 6a 65 63 74 43 6f 6d 6d  SQLiteObjectComm
b5f0: 61 6e 64 5d 20 26 26 20 5b 63 61 74 63 68 20 7b  and] && [catch {
b600: 0d 0a 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74  ..        object
b610: 20 69 6e 76 6f 6b 65 20 49 6e 74 65 72 70 72 65   invoke Interpre
b620: 74 65 72 2e 47 65 74 41 63 74 69 76 65 20 5b 65  ter.GetActive [e
b630: 78 70 72 20 7b 24 6e 61 74 69 76 65 20 3f 20 5c  xpr {$native ? \
b640: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 41  ..            "A
b650: 64 64 52 75 6e 74 69 6d 65 4f 70 74 69 6f 6e 22  ddRuntimeOption"
b660: 20 3a 20 22 52 65 6d 6f 76 65 52 75 6e 74 69 6d   : "RemoveRuntim
b670: 65 4f 70 74 69 6f 6e 22 7d 5d 20 6e 61 74 69 76  eOption"}] nativ
b680: 65 0d 0a 20 20 20 20 20 20 7d 5d 20 3d 3d 20 30  e..      }] == 0
b690: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
b6a0: 20 20 72 65 74 75 72 6e 20 74 72 75 65 0d 0a 20    return true.. 
b6b0: 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
b6c0: 72 65 74 75 72 6e 20 66 61 6c 73 65 0d 0a 20 20  return false..  
b6d0: 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
b6e0: 20 63 68 65 63 6b 46 6f 72 53 51 4c 69 74 65 42   checkForSQLiteB
b6f0: 75 69 6c 64 73 20 7b 20 63 68 61 6e 6e 65 6c 20  uilds { channel 
b700: 7b 73 65 6c 65 63 74 20 66 61 6c 73 65 7d 20 7d  {select false} }
b710: 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20   {..      #..   
b720: 20 20 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b     # NOTE: Check
b730: 20 66 6f 72 20 65 76 65 72 79 20 70 6f 73 73 69   for every possi
b740: 62 6c 65 20 76 61 6c 69 64 20 63 6f 6d 62 69 6e  ble valid combin
b750: 61 74 69 6f 6e 20 6f 66 20 76 61 6c 75 65 73 20  ation of values 
b760: 75 73 65 64 20 77 68 65 6e 0d 0a 20 20 20 20 20  used when..     
b770: 20 23 20 20 20 20 20 20 20 6c 6f 63 61 74 69 6e   #       locatin
b780: 67 20 6f 75 74 20 74 68 65 20 62 75 69 6c 64 20  g out the build 
b790: 6f 75 74 70 75 74 20 64 69 72 65 63 74 6f 72 79  output directory
b7a0: 2c 20 73 68 6f 77 69 6e 67 20 65 61 63 68 20 61  , showing each a
b7b0: 76 61 69 6c 61 62 6c 65 0d 0a 20 20 20 20 20 20  vailable..      
b7c0: 23 20 20 20 20 20 20 20 62 75 69 6c 64 20 76 61  #       build va
b7d0: 72 69 61 74 69 6f 6e 20 61 6c 6f 6e 67 20 74 68  riation along th
b7e0: 65 20 77 61 79 2e 0d 0a 20 20 20 20 20 20 23 0d  e way...      #.
b7f0: 0a 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 6e  .      foreach n
b800: 61 74 69 76 65 20 5b 6c 69 73 74 20 66 61 6c 73  ative [list fals
b810: 65 20 74 72 75 65 5d 20 7b 0d 0a 20 20 20 20 20  e true] {..     
b820: 20 20 20 66 6f 72 65 61 63 68 20 79 65 61 72 20     foreach year 
b830: 5b 67 65 74 42 75 69 6c 64 59 65 61 72 73 5d 20  [getBuildYears] 
b840: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72  {..          for
b850: 65 61 63 68 20 63 6f 6e 66 69 67 75 72 61 74 69  each configurati
b860: 6f 6e 20 5b 67 65 74 42 75 69 6c 64 43 6f 6e 66  on [getBuildConf
b870: 69 67 75 72 61 74 69 6f 6e 73 5d 20 7b 0d 0a 20  igurations] {.. 
b880: 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
b890: 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45            # NOTE
b8a0: 3a 20 46 69 67 75 72 65 20 6f 75 74 20 74 68 65  : Figure out the
b8b0: 20 65 66 66 65 63 74 69 76 65 20 62 75 69 6c 64   effective build
b8c0: 20 70 6c 61 74 66 6f 72 6d 2e 20 20 54 68 69 73   platform.  This
b8d0: 20 69 73 0d 0a 20 20 20 20 20 20 20 20 20 20 20   is..           
b8e0: 20 23 20 20 20 20 20 20 20 62 61 73 65 64 20 6f   #       based o
b8f0: 6e 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  n whether or not
b900: 20 61 20 5b 70 72 69 6d 61 72 69 6c 79 5d 20 6e   a [primarily] n
b910: 61 74 69 76 65 20 62 75 69 6c 64 0d 0a 20 20 20  ative build..   
b920: 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20           #      
b930: 20 69 73 20 62 65 69 6e 67 20 75 73 65 64 2e 20   is being used. 
b940: 20 46 6f 72 20 5b 70 72 69 6d 61 72 69 6c 79 5d   For [primarily]
b950: 20 6e 6f 6e 2d 6e 61 74 69 76 65 20 62 75 69 6c   non-native buil
b960: 64 73 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ds,..           
b970: 20 23 20 20 20 20 20 20 20 74 68 69 73 20 77 69   #       this wi
b980: 6c 6c 20 62 65 20 61 6e 20 65 6d 70 74 79 20 73  ll be an empty s
b990: 74 72 69 6e 67 2e 0d 0a 20 20 20 20 20 20 20 20  tring...        
b9a0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
b9b0: 20 20 20 73 65 74 20 70 6c 61 74 66 6f 72 6d 20     set platform 
b9c0: 5b 67 65 74 42 75 69 6c 64 50 6c 61 74 66 6f 72  [getBuildPlatfor
b9d0: 6d 20 24 6e 61 74 69 76 65 5d 0d 0a 0d 0a 20 20  m $native]....  
b9e0: 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
b9f0: 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  $channel [append
ba00: 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
ba10: 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 68          "---- ch
ba20: 65 63 6b 69 6e 67 20 66 6f 72 20 53 79 73 74 65  ecking for Syste
ba30: 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 20 62 75  m.Data.SQLite bu
ba40: 69 6c 64 20 5c 22 22 20 5b 65 78 70 72 20 5c 0d  ild \"" [expr \.
ba50: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
ba60: 20 7b 24 6e 61 74 69 76 65 20 3f 20 22 6e 61 74   {$native ? "nat
ba70: 69 76 65 2f 22 20 3a 20 22 22 7d 5d 20 5b 65 78  ive/" : ""}] [ex
ba80: 70 72 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67  pr {[string leng
ba90: 74 68 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  th \..          
baa0: 20 20 20 20 20 20 24 70 6c 61 74 66 6f 72 6d 5d        $platform]
bab0: 20 3e 20 30 20 3f 20 5b 61 70 70 65 6e 64 41 72   > 0 ? [appendAr
bac0: 67 73 20 24 70 6c 61 74 66 6f 72 6d 20 2f 5d 20  gs $platform /] 
bad0: 3a 20 22 22 7d 5d 20 24 79 65 61 72 20 5c 0d 0a  : ""}] $year \..
bae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
baf0: 2f 20 24 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  / $configuration
bb00: 20 22 5c 22 2e 2e 2e 20 22 5d 0d 0a 0d 0a 20 20   "\"... "]....  
bb10: 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
bb20: 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a           # NOTE:
bb30: 20 42 75 69 6c 64 20 74 68 65 20 66 75 6c 6c 79   Build the fully
bb40: 20 71 75 61 6c 69 66 69 65 64 20 64 69 72 65 63   qualified direc
bb50: 74 6f 72 79 20 77 68 65 72 65 20 74 68 65 20 6e  tory where the n
bb60: 65 63 65 73 73 61 72 79 0d 0a 20 20 20 20 20 20  ecessary..      
bb70: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63 6f        #       co
bb80: 6d 70 6f 6e 65 6e 74 73 20 66 6f 72 20 53 79 73  mponents for Sys
bb90: 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 20  tem.Data.SQLite 
bba0: 73 68 6f 75 6c 64 20 62 65 20 66 6f 75 6e 64 2e  should be found.
bbb0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 0d  ..            #.
bbc0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74  .            set
bbd0: 20 64 69 72 65 63 74 6f 72 79 20 5b 6a 6f 69 6e   directory [join
bbe0: 42 75 69 6c 64 44 69 72 65 63 74 6f 72 79 20 24  BuildDirectory $
bbf0: 6e 61 74 69 76 65 20 5c 0d 0a 20 20 20 20 20 20  native \..      
bc00: 20 20 20 20 20 20 20 20 20 20 5b 67 65 74 42 75            [getBu
bc10: 69 6c 64 42 61 73 65 44 69 72 65 63 74 6f 72 79  ildBaseDirectory
bc20: 5d 20 24 79 65 61 72 20 24 70 6c 61 74 66 6f 72  ] $year $platfor
bc30: 6d 20 24 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  m $configuration
bc40: 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ]....           
bc50: 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   #..            
bc60: 23 20 4e 4f 54 45 3a 20 44 6f 20 74 68 65 20 6e  # NOTE: Do the n
bc70: 65 63 65 73 73 61 72 79 20 66 69 6c 65 73 20 65  ecessary files e
bc80: 78 69 73 74 3f 20 20 43 75 72 72 65 6e 74 6c 79  xist?  Currently
bc90: 2c 20 6e 6f 20 6f 74 68 65 72 20 73 74 65 70 73  , no other steps
bca0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 20  ..            # 
bcb0: 20 20 20 20 20 20 61 72 65 20 74 61 6b 65 6e 20        are taken 
bcc0: 74 6f 20 76 65 72 69 66 79 20 74 68 69 73 20 62  to verify this b
bcd0: 75 69 6c 64 20 69 73 20 61 63 74 75 61 6c 6c 79  uild is actually
bce0: 20 76 69 61 62 6c 65 2e 0d 0a 20 20 20 20 20 20   viable...      
bcf0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
bd00: 20 20 20 20 20 69 66 20 7b 5b 69 73 42 75 69 6c       if {[isBuil
bd10: 64 41 76 61 69 6c 61 62 6c 65 20 24 6e 61 74 69  dAvailable $nati
bd20: 76 65 20 24 64 69 72 65 63 74 6f 72 79 5d 7d 20  ve $directory]} 
bd30: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
bd40: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
bd50: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 57         # NOTE: W
bd60: 68 65 6e 20 69 6e 20 22 73 65 6c 65 63 74 22 20  hen in "select" 
bd70: 6d 6f 64 65 2c 20 61 75 74 6f 6d 61 74 69 63 61  mode, automatica
bd80: 6c 6c 79 20 73 65 6c 65 63 74 20 74 68 65 20 66  lly select the f
bd90: 69 72 73 74 0d 0a 20 20 20 20 20 20 20 20 20 20  irst..          
bda0: 20 20 20 20 23 20 20 20 20 20 20 20 61 76 61 69      #       avai
bdb0: 6c 61 62 6c 65 20 62 75 69 6c 64 20 6f 66 20 53  lable build of S
bdc0: 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
bdd0: 65 20 61 6e 64 20 74 68 65 6e 20 72 65 74 75 72  e and then retur
bde0: 6e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n..             
bdf0: 20 23 20 20 20 20 20 20 20 69 6d 6d 65 64 69 61   #       immedia
be00: 74 65 6c 79 2e 0d 0a 20 20 20 20 20 20 20 20 20  tely...         
be10: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
be20: 20 20 20 20 20 20 69 66 20 7b 24 73 65 6c 65 63        if {$selec
be30: 74 20 26 26 20 5b 6d 61 74 63 68 4d 61 63 68 69  t && [matchMachi
be40: 6e 65 20 24 70 6c 61 74 66 6f 72 6d 5d 7d 20 74  ne $platform]} t
be50: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
be60: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
be70: 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45            # NOTE
be80: 3a 20 4d 61 6e 75 61 6c 6c 79 20 6f 76 65 72 72  : Manually overr
be90: 69 64 65 20 61 6c 6c 20 74 68 65 20 62 75 69 6c  ide all the buil
bea0: 64 20 64 69 72 65 63 74 6f 72 79 20 73 65 6c 65  d directory sele
beb0: 63 74 69 6f 6e 0d 0a 20 20 20 20 20 20 20 20 20  ction..         
bec0: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 72         #       r
bed0: 65 6c 61 74 65 64 20 74 65 73 74 20 73 65 74 74  elated test sett
bee0: 69 6e 67 73 20 69 6e 20 6f 72 64 65 72 20 74 6f  ings in order to
bef0: 20 66 6f 72 63 65 20 74 68 69 73 20 62 75 69 6c   force this buil
bf00: 64 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  d..             
bf10: 20 20 20 23 20 20 20 20 20 20 20 6f 66 20 53 79     #       of Sy
bf20: 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
bf30: 20 74 6f 20 62 65 20 75 73 65 64 2e 0d 0a 20 20   to be used...  
bf40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 0d                #.
bf50: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
bf60: 20 69 66 20 7b 21 5b 63 68 61 6e 67 65 4e 61 74   if {![changeNat
bf70: 69 76 65 52 75 6e 74 69 6d 65 4f 70 74 69 6f 6e  iveRuntimeOption
bf80: 20 24 6e 61 74 69 76 65 5d 7d 20 74 68 65 6e 20   $native]} then 
bf90: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
bfa0: 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
bfb0: 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
bfc0: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
bfd0: 20 20 20 20 20 20 20 20 20 22 6e 6f 2c 20 66 61           "no, fa
bfe0: 69 6c 65 64 20 74 6f 20 22 20 5b 65 78 70 72 20  iled to " [expr 
bff0: 7b 24 6e 61 74 69 76 65 20 3f 20 22 61 64 64 22  {$native ? "add"
c000: 20 3a 20 22 72 65 6d 6f 76 65 22 7d 5d 20 5c 0d   : "remove"}] \.
c010: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
c020: 20 20 20 20 20 20 20 22 20 74 68 65 20 5c 22 6e         " the \"n
c030: 61 74 69 76 65 5c 22 20 72 75 6e 74 69 6d 65 20  ative\" runtime 
c040: 6f 70 74 69 6f 6e 5c 6e 22 5d 0d 0a 0d 0a 20 20  option\n"]....  
c050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c060: 72 65 74 75 72 6e 20 66 61 6c 73 65 0d 0a 20 20  return false..  
c070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d                }.
c080: 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
c090: 20 20 20 73 65 74 20 3a 3a 74 65 73 74 5f 79 65     set ::test_ye
c0a0: 61 72 20 24 79 65 61 72 0d 0a 20 20 20 20 20 20  ar $year..      
c0b0: 20 20 20 20 20 20 20 20 20 20 73 65 74 20 3a 3a            set ::
c0c0: 74 65 73 74 5f 70 6c 61 74 66 6f 72 6d 20 24 70  test_platform $p
c0d0: 6c 61 74 66 6f 72 6d 0d 0a 20 20 20 20 20 20 20  latform..       
c0e0: 20 20 20 20 20 20 20 20 20 73 65 74 20 3a 3a 74           set ::t
c0f0: 65 73 74 5f 63 6f 6e 66 69 67 75 72 61 74 69 6f  est_configuratio
c100: 6e 20 24 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  n $configuration
c110: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
c120: 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
c130: 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
c140: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
c150: 20 20 20 20 20 20 22 79 65 73 2c 20 73 65 6c 65        "yes, sele
c160: 63 74 65 64 20 28 22 20 5b 65 78 70 72 20 7b 24  cted (" [expr {$
c170: 6e 61 74 69 76 65 20 3f 20 22 6e 61 74 69 76 65  native ? "native
c180: 2f 22 20 3a 20 22 22 7d 5d 20 5c 0d 0a 20 20 20  /" : ""}] \..   
c190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c1a0: 20 5b 65 78 70 72 20 7b 5b 73 74 72 69 6e 67 20   [expr {[string 
c1b0: 6c 65 6e 67 74 68 20 24 70 6c 61 74 66 6f 72 6d  length $platform
c1c0: 5d 20 3e 20 30 20 3f 20 5b 61 70 70 65 6e 64 41  ] > 0 ? [appendA
c1d0: 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
c1e0: 20 20 20 20 20 20 20 20 20 20 20 24 70 6c 61 74             $plat
c1f0: 66 6f 72 6d 20 2f 5d 20 3a 20 22 22 7d 5d 20 24  form /] : ""}] $
c200: 79 65 61 72 20 2f 20 24 63 6f 6e 66 69 67 75 72  year / $configur
c210: 61 74 69 6f 6e 20 22 29 5c 6e 22 5d 0d 0a 0d 0a  ation ")\n"]....
c220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c230: 72 65 74 75 72 6e 20 74 72 75 65 0d 0a 20 20 20  return true..   
c240: 20 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73             } els
c250: 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e {..           
c260: 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
c270: 6e 65 6c 20 79 65 73 5c 6e 0d 0a 20 20 20 20 20  nel yes\n..     
c280: 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
c290: 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b          } else {
c2a0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
c2b0: 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 6e  tputs $channel n
c2c0: 6f 5c 6e 0d 0a 20 20 20 20 20 20 20 20 20 20 20  o\n..           
c2d0: 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d   }..          }.
c2e0: 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  .        }..    
c2f0: 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65 74    }....      ret
c300: 75 72 6e 20 66 61 6c 73 65 0d 0a 20 20 20 20 7d  urn false..    }
c310: 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 63 68  .....    proc ch
c320: 65 63 6b 46 6f 72 53 51 4c 69 74 65 52 65 6c 65  eckForSQLiteRele
c330: 61 73 65 73 20 7b 20 63 68 61 6e 6e 65 6c 20 7b  ases { channel {
c340: 73 65 6c 65 63 74 20 66 61 6c 73 65 7d 20 7d 20  select false} } 
c350: 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  {..      #..    
c360: 20 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20    # NOTE: Check 
c370: 66 6f 72 20 70 61 73 74 20 72 65 6c 65 61 73 65  for past release
c380: 73 20 6f 66 20 53 79 73 74 65 6d 2e 44 61 74 61  s of System.Data
c390: 2e 53 51 4c 69 74 65 20 69 6e 20 74 68 65 20 64  .SQLite in the d
c3a0: 69 72 65 63 74 6f 72 79 0d 0a 20 20 20 20 20 20  irectory..      
c3b0: 23 20 20 20 20 20 20 20 63 6f 6e 74 61 69 6e 65  #       containe
c3c0: 64 20 69 6e 20 74 68 65 20 22 53 79 73 74 65 6d  d in the "System
c3d0: 2e 44 61 74 61 2e 53 51 4c 69 74 65 22 20 65 6e  .Data.SQLite" en
c3e0: 76 69 72 6f 6e 6d 65 6e 74 20 76 61 72 69 61 62  vironment variab
c3f0: 6c 65 2c 20 69 66 0d 0a 20 20 20 20 20 20 23 20  le, if..      # 
c400: 20 20 20 20 20 20 70 72 65 73 65 6e 74 2e 0d 0a        present...
c410: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69        #..      i
c420: 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20  f {[info exists 
c430: 3a 3a 65 6e 76 28 53 79 73 74 65 6d 2e 44 61 74  ::env(System.Dat
c440: 61 2e 53 51 4c 69 74 65 29 5d 20 26 26 20 5c 0d  a.SQLite)] && \.
c450: 0a 20 20 20 20 20 20 20 20 20 20 5b 73 74 72 69  .          [stri
c460: 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a 65 6e 76  ng length $::env
c470: 28 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c  (System.Data.SQL
c480: 69 74 65 29 5d 20 3e 20 30 7d 20 74 68 65 6e 20  ite)] > 0} then 
c490: 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
c4a0: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 42 75        # NOTE: Bu
c4b0: 69 6c 64 20 74 68 65 20 66 75 6c 6c 79 20 71 75  ild the fully qu
c4c0: 61 6c 69 66 69 65 64 20 64 69 72 65 63 74 6f 72  alified director
c4d0: 79 20 77 68 65 72 65 20 74 68 65 20 6e 65 63 65  y where the nece
c4e0: 73 73 61 72 79 0d 0a 20 20 20 20 20 20 20 20 23  ssary..        #
c4f0: 20 20 20 20 20 20 20 63 6f 6d 70 6f 6e 65 6e 74         component
c500: 73 20 66 6f 72 20 53 79 73 74 65 6d 2e 44 61 74  s for System.Dat
c510: 61 2e 53 51 4c 69 74 65 20 73 68 6f 75 6c 64 20  a.SQLite should 
c520: 62 65 20 66 6f 75 6e 64 2e 0d 0a 20 20 20 20 20  be found...     
c530: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 73 65     #..        se
c540: 74 20 64 69 72 65 63 74 6f 72 79 20 5b 66 69 6c  t directory [fil
c550: 65 20 6e 61 74 69 76 65 6e 61 6d 65 20 5b 66 69  e nativename [fi
c560: 6c 65 20 6a 6f 69 6e 20 5c 0d 0a 20 20 20 20 20  le join \..     
c570: 20 20 20 20 20 20 20 24 3a 3a 65 6e 76 28 53 79         $::env(Sy
c580: 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
c590: 29 20 5b 67 65 74 52 65 6c 65 61 73 65 56 65 72  ) [getReleaseVer
c5a0: 73 69 6f 6e 5d 5d 5d 0d 0a 0d 0a 20 20 20 20 20  sion]]]....     
c5b0: 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
c5c0: 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
c5d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d  .            "--
c5e0: 2d 2d 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20  -- checking for 
c5f0: 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
c600: 74 65 20 72 65 6c 65 61 73 65 20 5c 22 22 20 5c  te release \"" \
c610: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 24 64  ..            $d
c620: 69 72 65 63 74 6f 72 79 20 22 5c 22 2e 2e 2e 20  irectory "\"... 
c630: 22 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66  "]....        if
c640: 20 7b 5b 69 73 52 65 6c 65 61 73 65 41 76 61 69   {[isReleaseAvai
c650: 6c 61 62 6c 65 20 24 64 69 72 65 63 74 6f 72 79  lable $directory
c660: 20 70 6c 61 74 66 6f 72 6d 5d 7d 20 74 68 65 6e   platform]} then
c670: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66   {..          if
c680: 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68   {[string length
c690: 20 24 70 6c 61 74 66 6f 72 6d 5d 20 3d 3d 20 30   $platform] == 0
c6a0: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
c6b0: 20 20 20 20 20 20 73 65 74 20 70 6c 61 74 66 6f        set platfo
c6c0: 72 6d 20 75 6e 6b 6e 6f 77 6e 0d 0a 20 20 20 20  rm unknown..    
c6d0: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
c6e0: 20 20 20 20 20 69 66 20 7b 24 73 65 6c 65 63 74       if {$select
c6f0: 20 26 26 20 5b 6d 61 74 63 68 4d 61 63 68 69 6e   && [matchMachin
c700: 65 20 24 70 6c 61 74 66 6f 72 6d 5d 7d 20 74 68  e $platform]} th
c710: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
c720: 20 20 73 65 74 20 3a 3a 62 75 69 6c 64 5f 64 69    set ::build_di
c730: 72 65 63 74 6f 72 79 20 24 64 69 72 65 63 74 6f  rectory $directo
c740: 72 79 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  ry....          
c750: 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
c760: 20 5b 61 70 70 65 6e 64 41 72 67 73 20 22 79 65   [appendArgs "ye
c770: 73 2c 20 73 65 6c 65 63 74 65 64 20 28 22 20 24  s, selected (" $
c780: 70 6c 61 74 66 6f 72 6d 20 22 29 5c 6e 22 5d 0d  platform ")\n"].
c790: 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  ...            r
c7a0: 65 74 75 72 6e 20 74 72 75 65 0d 0a 20 20 20 20  eturn true..    
c7b0: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
c7c0: 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
c7d0: 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  s $channel [appe
c7e0: 6e 64 41 72 67 73 20 22 79 65 73 20 28 22 20 24  ndArgs "yes (" $
c7f0: 70 6c 61 74 66 6f 72 6d 20 22 29 5c 6e 22 5d 0d  platform ")\n"].
c800: 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  .          }..  
c810: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
c820: 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
c830: 24 63 68 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d 0a 0d  $channel no\n...
c840: 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 65 61  .          forea
c850: 63 68 20 70 61 74 68 20 5b 6c 73 6f 72 74 20 2d  ch path [lsort -
c860: 64 65 63 72 65 61 73 69 6e 67 20 5b 66 69 6c 65  decreasing [file
c870: 20 6c 69 73 74 20 24 64 69 72 65 63 74 6f 72 79   list $directory
c880: 20 2a 5d 5d 20 7b 0d 0a 20 20 20 20 20 20 20 20   *]] {..        
c890: 20 20 20 20 69 66 20 7b 5b 66 69 6c 65 20 65 78      if {[file ex
c8a0: 69 73 74 73 20 24 70 61 74 68 5d 20 26 26 20 5b  ists $path] && [
c8b0: 66 69 6c 65 20 69 73 64 69 72 65 63 74 6f 72 79  file isdirectory
c8c0: 20 24 70 61 74 68 5d 7d 20 74 68 65 6e 20 7b 0d   $path]} then {.
c8d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74  .              t
c8e0: 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61  puts $channel [a
c8f0: 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
c900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
c910: 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e 67 20 66 6f  ---- checking fo
c920: 72 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51  r System.Data.SQ
c930: 4c 69 74 65 20 72 65 6c 65 61 73 65 20 5c 22 22  Lite release \""
c940: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
c950: 20 20 20 20 20 20 24 70 61 74 68 20 22 5c 22 2e        $path "\".
c960: 2e 2e 20 22 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  .. "]....       
c970: 20 20 20 20 20 20 20 69 66 20 7b 5b 69 73 52 65         if {[isRe
c980: 6c 65 61 73 65 41 76 61 69 6c 61 62 6c 65 20 24  leaseAvailable $
c990: 70 61 74 68 20 70 6c 61 74 66 6f 72 6d 5d 7d 20  path platform]} 
c9a0: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
c9b0: 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72          if {[str
c9c0: 69 6e 67 20 6c 65 6e 67 74 68 20 24 70 6c 61 74  ing length $plat
c9d0: 66 6f 72 6d 5d 20 3d 3d 20 30 7d 20 74 68 65 6e  form] == 0} then
c9e0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
c9f0: 20 20 20 20 20 20 73 65 74 20 70 6c 61 74 66 6f        set platfo
ca00: 72 6d 20 75 6e 6b 6e 6f 77 6e 0d 0a 20 20 20 20  rm unknown..    
ca10: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d              }...
ca20: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
ca30: 20 69 66 20 7b 24 73 65 6c 65 63 74 20 26 26 20   if {$select && 
ca40: 5b 6d 61 74 63 68 4d 61 63 68 69 6e 65 20 24 70  [matchMachine $p
ca50: 6c 61 74 66 6f 72 6d 5d 7d 20 74 68 65 6e 20 7b  latform]} then {
ca60: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
ca70: 20 20 20 20 73 65 74 20 3a 3a 62 75 69 6c 64 5f      set ::build_
ca80: 64 69 72 65 63 74 6f 72 79 20 24 70 61 74 68 0d  directory $path.
ca90: 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
caa0: 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
cab0: 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
cac0: 22 79 65 73 2c 20 73 65 6c 65 63 74 65 64 20 28  "yes, selected (
cad0: 22 20 24 70 6c 61 74 66 6f 72 6d 20 22 29 5c 6e  " $platform ")\n
cae0: 22 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  "]....          
caf0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 74          return t
cb00: 72 75 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20  rue..           
cb10: 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
cb20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cb30: 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
cb40: 5b 61 70 70 65 6e 64 41 72 67 73 20 22 79 65 73  [appendArgs "yes
cb50: 20 28 22 20 24 70 6c 61 74 66 6f 72 6d 20 22 29   (" $platform ")
cb60: 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20 20 20  \n"]..          
cb70: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
cb80: 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d         } else {.
cb90: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
cba0: 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
cbb0: 6e 6f 5c 6e 0d 0a 20 20 20 20 20 20 20 20 20 20  no\n..          
cbc0: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
cbd0: 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
cbe0: 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  }..        }..  
cbf0: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
cc00: 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
cc10: 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
cc20: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
cc30: 22 2d 2d 2d 2d 20 65 6e 76 69 72 6f 6e 6d 65 6e  "---- environmen
cc40: 74 20 76 61 72 69 61 62 6c 65 20 5c 22 53 79 73  t variable \"Sys
cc50: 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 5c  tem.Data.SQLite\
cc60: 22 20 69 73 20 6e 6f 74 20 22 20 5c 0d 0a 20 20  " is not " \..  
cc70: 20 20 20 20 20 20 20 20 20 20 22 73 65 74 2c 20            "set, 
cc80: 73 6b 69 70 70 69 6e 67 20 63 68 65 63 6b 20 66  skipping check f
cc90: 6f 72 20 72 65 6c 65 61 73 65 73 2e 2e 2e 5c 6e  or releases...\n
cca0: 22 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  "]..      }.... 
ccb0: 20 20 20 20 20 72 65 74 75 72 6e 20 66 61 6c 73       return fals
ccc0: 65 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  e..    }.....   
ccd0: 20 70 72 6f 63 20 63 68 65 63 6b 46 6f 72 53 51   proc checkForSQ
cce0: 4c 69 74 65 4c 69 62 72 61 72 79 20 7b 20 63 68  LiteLibrary { ch
ccf0: 61 6e 6e 65 6c 20 7d 20 7b 0d 0a 20 20 20 20 20  annel } {..     
cd00: 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
cd10: 22 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e 67 20 66  "---- checking f
cd20: 6f 72 20 53 51 4c 69 74 65 20 63 6f 72 65 20 6c  or SQLite core l
cd30: 69 62 72 61 72 79 2e 2e 2e 20 22 0d 0a 0d 0a 20  ibrary... ".... 
cd40: 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20       if {[catch 
cd50: 7b 0d 0a 20 20 20 20 20 20 20 20 6f 62 6a 65 63  {..        objec
cd60: 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20  t invoke -flags 
cd70: 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20  +NonPublic \..  
cd80: 20 20 20 20 20 20 20 20 20 20 53 79 73 74 65 6d            System
cd90: 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 53 51 4c  .Data.SQLite.SQL
cda0: 69 74 65 33 20 53 51 4c 69 74 65 56 65 72 73 69  ite3 SQLiteVersi
cdb0: 6f 6e 0d 0a 20 20 20 20 20 20 7d 20 76 65 72 73  on..      } vers
cdc0: 69 6f 6e 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20  ion] == 0} then 
cdd0: 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
cde0: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68        # NOTE: Ch
cdf0: 65 63 6b 20 69 66 20 74 68 65 20 72 65 74 75 72  eck if the retur
ce00: 6e 65 64 20 76 65 72 73 69 6f 6e 20 77 61 73 20  ned version was 
ce10: 6e 75 6c 6c 2e 20 20 49 66 20 73 6f 2c 20 6d 61  null.  If so, ma
ce20: 6b 65 20 69 74 20 65 61 73 79 0d 0a 20 20 20 20  ke it easy..    
ce30: 20 20 20 20 23 20 20 20 20 20 20 20 74 6f 20 73      #       to s
ce40: 70 6f 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  pot...        #.
ce50: 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73 74  .        if {[st
ce60: 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 76 65 72  ring length $ver
ce70: 73 69 6f 6e 5d 20 3d 3d 20 30 7d 20 74 68 65 6e  sion] == 0} then
ce80: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65   {..          se
ce90: 74 20 76 65 72 73 69 6f 6e 20 6e 75 6c 6c 0d 0a  t version null..
cea0: 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
ceb0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
cec0: 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74 20  # NOTE: Attempt 
ced0: 74 6f 20 71 75 65 72 79 20 74 68 65 20 46 6f 73  to query the Fos
cee0: 73 69 6c 20 73 6f 75 72 63 65 20 69 64 65 6e 74  sil source ident
cef0: 69 66 69 65 72 20 66 6f 72 20 74 68 65 20 53 51  ifier for the SQ
cf00: 4c 69 74 65 0d 0a 20 20 20 20 20 20 20 20 23 20  Lite..        # 
cf10: 20 20 20 20 20 20 63 6f 72 65 20 6c 69 62 72 61        core libra
cf20: 72 79 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  ry...        #..
cf30: 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74          if {[cat
cf40: 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  ch {..          
cf50: 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66  object invoke -f
cf60: 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20  lags +NonPublic 
cf70: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
cf80: 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c   System.Data.SQL
cf90: 69 74 65 2e 53 51 4c 69 74 65 33 20 53 51 4c 69  ite.SQLite3 SQLi
cfa0: 74 65 53 6f 75 72 63 65 49 64 0d 0a 20 20 20 20  teSourceId..    
cfb0: 20 20 20 20 7d 20 73 6f 75 72 63 65 49 64 5d 7d      } sourceId]}
cfc0: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
cfd0: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
cfe0: 23 20 4e 4f 54 45 3a 20 57 65 20 66 61 69 6c 65  # NOTE: We faile
cff0: 64 20 74 6f 20 71 75 65 72 79 20 74 68 65 20 46  d to query the F
d000: 6f 73 73 69 6c 20 73 6f 75 72 63 65 20 69 64 65  ossil source ide
d010: 6e 74 69 66 69 65 72 2e 0d 0a 20 20 20 20 20 20  ntifier...      
d020: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
d030: 20 73 65 74 20 73 6f 75 72 63 65 49 64 20 75 6e   set sourceId un
d040: 6b 6e 6f 77 6e 0d 0a 20 20 20 20 20 20 20 20 7d  known..        }
d050: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  ....        #.. 
d060: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43         # NOTE: C
d070: 68 65 63 6b 20 69 66 20 74 68 65 20 72 65 74 75  heck if the retu
d080: 72 6e 65 64 20 46 6f 73 73 69 6c 20 73 6f 75 72  rned Fossil sour
d090: 63 65 20 69 64 65 6e 74 69 66 69 65 72 20 77 61  ce identifier wa
d0a0: 73 20 6e 75 6c 6c 2e 20 20 49 66 0d 0a 20 20 20  s null.  If..   
d0b0: 20 20 20 20 20 23 20 20 20 20 20 20 20 73 6f 2c       #       so,
d0c0: 20 6d 61 6b 65 20 69 74 20 65 61 73 79 20 74 6f   make it easy to
d0d0: 20 73 70 6f 74 2e 0d 0a 20 20 20 20 20 20 20 20   spot...        
d0e0: 23 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b  #..        if {[
d0f0: 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 73  string length $s
d100: 6f 75 72 63 65 49 64 5d 20 3d 3d 20 30 7d 20 74  ourceId] == 0} t
d110: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
d120: 20 73 65 74 20 73 6f 75 72 63 65 49 64 20 6e 75   set sourceId nu
d130: 6c 6c 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d  ll..        }...
d140: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
d150: 20 20 20 20 23 20 4e 4f 54 45 3a 20 59 65 73 2c      # NOTE: Yes,
d160: 20 74 68 65 20 53 51 4c 69 74 65 20 63 6f 72 65   the SQLite core
d170: 20 6c 69 62 72 61 72 79 20 61 70 70 65 61 72 73   library appears
d180: 20 74 6f 20 62 65 20 61 76 61 69 6c 61 62 6c 65   to be available
d190: 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
d1a0: 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61        addConstra
d1b0: 69 6e 74 20 53 51 4c 69 74 65 0d 0a 0d 0a 20 20  int SQLite....  
d1c0: 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
d1d0: 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
d1e0: 20 22 79 65 73 20 28 22 20 24 76 65 72 73 69 6f   "yes (" $versio
d1f0: 6e 20 22 20 22 20 24 73 6f 75 72 63 65 49 64 20  n " " $sourceId 
d200: 22 29 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 7d 20  ")\n"]..      } 
d210: 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
d220: 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 6e  tputs $channel n
d230: 6f 5c 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20  o\n..      }..  
d240: 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
d250: 20 63 68 65 63 6b 46 6f 72 53 51 4c 69 74 65 49   checkForSQLiteI
d260: 6e 74 65 72 6f 70 20 7b 20 63 68 61 6e 6e 65 6c  nterop { channel
d270: 20 7d 20 7b 0d 0a 20 20 20 20 20 20 74 70 75 74   } {..      tput
d280: 73 20 24 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d  s $channel "----
d290: 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 53 51   checking for SQ
d2a0: 4c 69 74 65 20 69 6e 74 65 72 6f 70 20 61 73 73  Lite interop ass
d2b0: 65 6d 62 6c 79 2e 2e 2e 20 22 0d 0a 0d 0a 20 20  embly... "....  
d2c0: 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b      if {[catch {
d2d0: 0d 0a 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74  ..        object
d2e0: 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b   invoke -flags +
d2f0: 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20  NonPublic \..   
d300: 20 20 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e           System.
d310: 44 61 74 61 2e 53 51 4c 69 74 65 2e 53 51 4c 69  Data.SQLite.SQLi
d320: 74 65 33 20 49 6e 74 65 72 6f 70 56 65 72 73 69  te3 InteropVersi
d330: 6f 6e 0d 0a 20 20 20 20 20 20 7d 20 76 65 72 73  on..      } vers
d340: 69 6f 6e 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20  ion] == 0} then 
d350: 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
d360: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68        # NOTE: Ch
d370: 65 63 6b 20 69 66 20 74 68 65 20 72 65 74 75 72  eck if the retur
d380: 6e 65 64 20 76 65 72 73 69 6f 6e 20 77 61 73 20  ned version was 
d390: 6e 75 6c 6c 2e 20 20 49 66 20 73 6f 2c 20 6d 61  null.  If so, ma
d3a0: 6b 65 20 69 74 20 65 61 73 79 0d 0a 20 20 20 20  ke it easy..    
d3b0: 20 20 20 20 23 20 20 20 20 20 20 20 74 6f 20 73      #       to s
d3c0: 70 6f 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  pot...        #.
d3d0: 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73 74  .        if {[st
d3e0: 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 76 65 72  ring length $ver
d3f0: 73 69 6f 6e 5d 20 3d 3d 20 30 7d 20 74 68 65 6e  sion] == 0} then
d400: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65   {..          se
d410: 74 20 76 65 72 73 69 6f 6e 20 6e 75 6c 6c 0d 0a  t version null..
d420: 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
d430: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
d440: 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74 20  # NOTE: Attempt 
d450: 74 6f 20 71 75 65 72 79 20 74 68 65 20 46 6f 73  to query the Fos
d460: 73 69 6c 20 73 6f 75 72 63 65 20 69 64 65 6e 74  sil source ident
d470: 69 66 69 65 72 20 66 6f 72 20 74 68 65 20 53 51  ifier for the SQ
d480: 4c 69 74 65 0d 0a 20 20 20 20 20 20 20 20 23 20  Lite..        # 
d490: 20 20 20 20 20 20 63 6f 72 65 20 6c 69 62 72 61        core libra
d4a0: 72 79 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  ry...        #..
d4b0: 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74          if {[cat
d4c0: 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  ch {..          
d4d0: 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66  object invoke -f
d4e0: 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20  lags +NonPublic 
d4f0: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
d500: 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c   System.Data.SQL
d510: 69 74 65 2e 53 51 4c 69 74 65 33 20 49 6e 74 65  ite.SQLite3 Inte
d520: 72 6f 70 53 6f 75 72 63 65 49 64 0d 0a 20 20 20  ropSourceId..   
d530: 20 20 20 20 20 7d 20 73 6f 75 72 63 65 49 64 5d       } sourceId]
d540: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
d550: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
d560: 20 23 20 4e 4f 54 45 3a 20 57 65 20 66 61 69 6c   # NOTE: We fail
d570: 65 64 20 74 6f 20 71 75 65 72 79 20 74 68 65 20  ed to query the 
d580: 46 6f 73 73 69 6c 20 73 6f 75 72 63 65 20 69 64  Fossil source id
d590: 65 6e 74 69 66 69 65 72 2e 0d 0a 20 20 20 20 20  entifier...     
d5a0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
d5b0: 20 20 73 65 74 20 73 6f 75 72 63 65 49 64 20 75    set sourceId u
d5c0: 6e 6b 6e 6f 77 6e 0d 0a 20 20 20 20 20 20 20 20  nknown..        
d5d0: 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  }....        #..
d5e0: 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
d5f0: 43 68 65 63 6b 20 69 66 20 74 68 65 20 72 65 74  Check if the ret
d600: 75 72 6e 65 64 20 46 6f 73 73 69 6c 20 73 6f 75  urned Fossil sou
d610: 72 63 65 20 69 64 65 6e 74 69 66 69 65 72 20 77  rce identifier w
d620: 61 73 20 6e 75 6c 6c 2e 20 20 49 66 0d 0a 20 20  as null.  If..  
d630: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 73 6f        #       so
d640: 2c 20 6d 61 6b 65 20 69 74 20 65 61 73 79 20 74  , make it easy t
d650: 6f 20 73 70 6f 74 2e 0d 0a 20 20 20 20 20 20 20  o spot...       
d660: 20 23 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b   #..        if {
d670: 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
d680: 73 6f 75 72 63 65 49 64 5d 20 3d 3d 20 30 7d 20  sourceId] == 0} 
d690: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
d6a0: 20 20 73 65 74 20 73 6f 75 72 63 65 49 64 20 6e    set sourceId n
d6b0: 75 6c 6c 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  ull..        }..
d6c0: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
d6d0: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 59 65 73       # NOTE: Yes
d6e0: 2c 20 74 68 65 20 53 51 4c 69 74 65 20 69 6e 74  , the SQLite int
d6f0: 65 72 6f 70 20 61 73 73 65 6d 62 6c 79 20 61 70  erop assembly ap
d700: 70 65 61 72 73 20 74 6f 20 62 65 20 61 76 61 69  pears to be avai
d710: 6c 61 62 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20  lable...        
d720: 23 0d 0a 20 20 20 20 20 20 20 20 61 64 64 43 6f  #..        addCo
d730: 6e 73 74 72 61 69 6e 74 20 53 51 4c 69 74 65 49  nstraint SQLiteI
d740: 6e 74 65 72 6f 70 0d 0a 0d 0a 20 20 20 20 20 20  nterop....      
d750: 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
d760: 20 5b 61 70 70 65 6e 64 41 72 67 73 20 22 79 65   [appendArgs "ye
d770: 73 20 28 22 20 24 76 65 72 73 69 6f 6e 20 22 20  s (" $version " 
d780: 22 20 24 73 6f 75 72 63 65 49 64 20 22 29 5c 6e  " $sourceId ")\n
d790: 22 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65  "]..      } else
d7a0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74   {..        tput
d7b0: 73 20 24 63 68 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d  s $channel no\n.
d7c0: 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d  .      }..    }.
d7d0: 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 63 68 65  ....    proc che
d7e0: 63 6b 46 6f 72 53 51 4c 69 74 65 44 65 66 69 6e  ckForSQLiteDefin
d7f0: 65 43 6f 6e 73 74 61 6e 74 20 7b 20 63 68 61 6e  eConstant { chan
d800: 6e 65 6c 20 6e 61 6d 65 20 7d 20 7b 0d 0a 20 20  nel name } {..  
d810: 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
d820: 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
d830: 0d 0a 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d  ..          "---
d840: 2d 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 53  - checking for S
d850: 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
d860: 65 20 64 65 66 69 6e 65 20 63 6f 6e 73 74 61 6e  e define constan
d870: 74 20 5c 22 22 20 24 6e 61 6d 65 20 5c 0d 0a 20  t \"" $name \.. 
d880: 20 20 20 20 20 20 20 20 20 22 5c 22 2e 2e 2e 20           "\"... 
d890: 22 5d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b  "]....      if {
d8a0: 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20  [catch {..      
d8b0: 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20    object invoke 
d8c0: 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69  -flags +NonPubli
d8d0: 63 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  c \..           
d8e0: 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c   System.Data.SQL
d8f0: 69 74 65 2e 53 51 4c 69 74 65 33 20 44 65 66 69  ite.SQLite3 Defi
d900: 6e 65 43 6f 6e 73 74 61 6e 74 73 0d 0a 20 20 20  neConstants..   
d910: 20 20 20 7d 20 64 65 66 69 6e 65 43 6f 6e 73 74     } defineConst
d920: 61 6e 74 73 5d 20 3d 3d 20 30 7d 20 74 68 65 6e  ants] == 0} then
d930: 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b   {..        if {
d940: 5b 6c 73 65 61 72 63 68 20 2d 65 78 61 63 74 20  [lsearch -exact 
d950: 2d 6e 6f 63 61 73 65 20 24 64 65 66 69 6e 65 43  -nocase $defineC
d960: 6f 6e 73 74 61 6e 74 73 20 24 6e 61 6d 65 5d 20  onstants $name] 
d970: 21 3d 20 2d 31 7d 20 74 68 65 6e 20 7b 0d 0a 20  != -1} then {.. 
d980: 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
d990: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 59 65        # NOTE: Ye
d9a0: 73 2c 20 74 68 69 73 20 64 65 66 69 6e 65 20 63  s, this define c
d9b0: 6f 6e 73 74 61 6e 74 20 77 61 73 20 65 6e 61 62  onstant was enab
d9c0: 6c 65 64 20 77 68 65 6e 20 74 68 65 20 6d 61 6e  led when the man
d9d0: 61 67 65 64 0d 0a 20 20 20 20 20 20 20 20 20 20  aged..          
d9e0: 23 20 20 20 20 20 20 20 61 73 73 65 6d 62 6c 79  #       assembly
d9f0: 20 77 61 73 20 63 6f 6d 70 69 6c 65 64 2e 0d 0a   was compiled...
da00: 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
da10: 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72         addConstr
da20: 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73  aint [appendArgs
da30: 20 64 65 66 69 6e 65 43 6f 6e 73 74 61 6e 74 2e   defineConstant.
da40: 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
da50: 74 65 2e 20 24 6e 61 6d 65 5d 0d 0a 0d 0a 20 20  te. $name]....  
da60: 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
da70: 68 61 6e 6e 65 6c 20 79 65 73 5c 6e 0d 0a 20 20  hannel yes\n..  
da80: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
da90: 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
daa0: 24 63 68 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d 0a 20  $channel no\n.. 
dab0: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
dac0: 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
dad0: 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
dae0: 20 65 72 72 6f 72 5c 6e 0d 0a 20 20 20 20 20 20   error\n..      
daf0: 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  }..    }.....   
db00: 20 70 72 6f 63 20 67 65 74 44 61 74 65 54 69 6d   proc getDateTim
db10: 65 46 6f 72 6d 61 74 20 7b 7d 20 7b 0d 0a 20 20  eFormat {} {..  
db20: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
db30: 4f 54 45 3a 20 54 68 69 73 20 70 72 6f 63 65 64  OTE: This proced
db40: 75 72 65 20 73 69 6d 70 6c 79 20 72 65 74 75 72  ure simply retur
db50: 6e 73 20 74 68 65 20 22 64 65 66 61 75 6c 74 22  ns the "default"
db60: 20 44 61 74 65 54 69 6d 65 20 66 6f 72 6d 61 74   DateTime format
db70: 20 75 73 65 64 0d 0a 20 20 20 20 20 20 23 20 20   used..      #  
db80: 20 20 20 20 20 62 79 20 74 68 65 20 74 65 73 74       by the test
db90: 20 73 75 69 74 65 2e 0d 0a 20 20 20 20 20 20 23   suite...      #
dba0: 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66  ..      if {[inf
dbb0: 6f 20 65 78 69 73 74 73 20 3a 3a 64 61 74 65 74  o exists ::datet
dbc0: 69 6d 65 5f 66 6f 72 6d 61 74 5d 20 26 26 20 5c  ime_format] && \
dbd0: 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 73 74 72  ..          [str
dbe0: 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a 64 61  ing length $::da
dbf0: 74 65 74 69 6d 65 5f 66 6f 72 6d 61 74 5d 20 3e  tetime_format] >
dc00: 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
dc10: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
dc20: 20 4e 4f 54 45 3a 20 52 65 74 75 72 6e 20 74 68   NOTE: Return th
dc30: 65 20 6d 61 6e 75 61 6c 6c 79 20 6f 76 65 72 72  e manually overr
dc40: 69 64 64 65 6e 20 76 61 6c 75 65 20 66 6f 72 20  idden value for 
dc50: 74 68 65 20 44 61 74 65 54 69 6d 65 20 66 6f 72  the DateTime for
dc60: 6d 61 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  mat...        #.
dc70: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
dc80: 24 3a 3a 64 61 74 65 74 69 6d 65 5f 66 6f 72 6d  $::datetime_form
dc90: 61 74 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65  at..      } else
dca0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20   {..        #.. 
dcb0: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 52         # NOTE: R
dcc0: 65 74 75 72 6e 20 61 6e 20 49 53 4f 38 36 30 31  eturn an ISO8601
dcd0: 20 44 61 74 65 54 69 6d 65 20 66 6f 72 6d 61 74   DateTime format
dce0: 20 63 6f 6d 70 61 74 69 62 6c 65 20 77 69 74 68   compatible with
dcf0: 20 53 51 4c 69 74 65 2c 0d 0a 20 20 20 20 20 20   SQLite,..      
dd00: 20 20 23 20 20 20 20 20 20 20 53 79 73 74 65 6d    #       System
dd10: 2e 44 61 74 61 2e 53 51 4c 69 74 65 2c 20 61 6e  .Data.SQLite, an
dd20: 64 20 73 75 69 74 61 62 6c 65 20 66 6f 72 20 72  d suitable for r
dd30: 6f 75 6e 64 2d 74 72 69 70 70 69 6e 67 20 77 69  ound-tripping wi
dd40: 74 68 20 74 68 65 0d 0a 20 20 20 20 20 20 20 20  th the..        
dd50: 23 20 20 20 20 20 20 20 44 61 74 65 54 69 6d 65  #       DateTime
dd60: 20 63 6c 61 73 73 20 6f 66 20 74 68 65 20 66 72   class of the fr
dd70: 61 6d 65 77 6f 72 6b 2e 20 20 49 66 20 74 68 69  amework.  If thi
dd80: 73 20 76 61 6c 75 65 20 69 73 20 63 68 61 6e 67  s value is chang
dd90: 65 64 2c 0d 0a 20 20 20 20 20 20 20 20 23 20 20  ed,..        #  
dda0: 20 20 20 20 20 76 61 72 69 6f 75 73 20 74 65 73       various tes
ddb0: 74 73 20 6d 61 79 20 66 61 69 6c 2e 0d 0a 20 20  ts may fail...  
ddc0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
ddd0: 20 72 65 74 75 72 6e 20 22 79 79 79 79 2d 4d 4d   return "yyyy-MM
dde0: 2d 64 64 20 48 48 3a 6d 6d 3a 73 73 2e 46 46 46  -dd HH:mm:ss.FFF
ddf0: 46 46 46 46 4b 22 0d 0a 20 20 20 20 20 20 7d 0d  FFFFK"..      }.
de00: 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70  .    }.....    p
de10: 72 6f 63 20 65 6e 75 6d 65 72 61 62 6c 65 54 6f  roc enumerableTo
de20: 4c 69 73 74 20 7b 20 65 6e 75 6d 65 72 61 62 6c  List { enumerabl
de30: 65 20 7d 20 7b 0d 0a 20 20 20 20 20 20 73 65 74  e } {..      set
de40: 20 72 65 73 75 6c 74 20 5b 6c 69 73 74 5d 0d 0a   result [list]..
de50: 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72  ..      if {[str
de60: 69 6e 67 20 6c 65 6e 67 74 68 20 24 65 6e 75 6d  ing length $enum
de70: 65 72 61 62 6c 65 5d 20 3d 3d 20 30 20 7c 7c 20  erable] == 0 || 
de80: 24 65 6e 75 6d 65 72 61 62 6c 65 20 65 71 20 22  $enumerable eq "
de90: 6e 75 6c 6c 22 7d 20 74 68 65 6e 20 7b 0d 0a 20  null"} then {.. 
dea0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 72         return $r
deb0: 65 73 75 6c 74 0d 0a 20 20 20 20 20 20 7d 0d 0a  esult..      }..
dec0: 0d 0a 20 20 20 20 20 20 6f 62 6a 65 63 74 20 66  ..      object f
ded0: 6f 72 65 61 63 68 20 2d 61 6c 69 61 73 20 69 74  oreach -alias it
dee0: 65 6d 20 24 65 6e 75 6d 65 72 61 62 6c 65 20 7b  em $enumerable {
def0: 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73  ..        if {[s
df00: 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 69 74  tring length $it
df10: 65 6d 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d  em] > 0} then {.
df20: 0a 20 20 20 20 20 20 20 20 20 20 6c 61 70 70 65  .          lappe
df30: 6e 64 20 72 65 73 75 6c 74 20 5b 24 69 74 65 6d  nd result [$item
df40: 20 54 6f 53 74 72 69 6e 67 5d 0d 0a 20 20 20 20   ToString]..    
df50: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a      }..      }..
df60: 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 24  ..      return $
df70: 72 65 73 75 6c 74 0d 0a 20 20 20 20 7d 0d 0a 0c  result..    }...
df80: 0d 0a 20 20 20 20 70 72 6f 63 20 63 61 74 63 68  ..    proc catch
df90: 41 6e 64 52 65 74 75 72 6e 20 7b 20 73 63 72 69  AndReturn { scri
dfa0: 70 74 20 7b 73 74 61 63 6b 54 72 61 63 65 20 66  pt {stackTrace f
dfb0: 61 6c 73 65 7d 20 7b 73 74 72 69 63 74 20 74 72  alse} {strict tr
dfc0: 75 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23  ue} } {..      #
dfd0: 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
dfe0: 45 76 61 6c 75 61 74 65 20 74 68 65 20 73 63 72  Evaluate the scr
dff0: 69 70 74 20 70 72 6f 76 69 64 65 64 20 62 79 20  ipt provided by 
e000: 6f 75 72 20 63 61 6c 6c 65 72 20 69 6e 20 74 68  our caller in th
e010: 65 69 72 20 63 6f 6e 74 65 78 74 2c 0d 0a 20 20  eir context,..  
e020: 20 20 20 20 23 20 20 20 20 20 20 20 63 61 70 74      #       capt
e030: 75 72 69 6e 67 20 62 6f 74 68 20 74 68 65 20 72  uring both the r
e040: 65 73 75 6c 74 20 61 6e 64 20 74 68 65 20 72 65  esult and the re
e050: 74 75 72 6e 20 63 6f 64 65 2e 0d 0a 20 20 20 20  turn code...    
e060: 20 20 23 0d 0a 20 20 20 20 20 20 73 65 74 20 63    #..      set c
e070: 6f 64 65 20 5b 63 61 74 63 68 20 7b 75 70 6c 65  ode [catch {uple
e080: 76 65 6c 20 31 20 24 73 63 72 69 70 74 7d 20 72  vel 1 $script} r
e090: 65 73 75 6c 74 5d 0d 0a 0d 0a 20 20 20 20 20 20  esult]....      
e0a0: 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
e0b0: 20 44 69 64 20 74 68 65 20 73 63 72 69 70 74 20   Did the script 
e0c0: 70 72 6f 76 69 64 65 64 20 62 79 20 6f 75 72 20  provided by our 
e0d0: 63 61 6c 6c 65 72 20 4e 4f 54 20 72 61 69 73 65  caller NOT raise
e0e0: 20 61 6e 20 65 72 72 6f 72 3f 0d 0a 20 20 20 20   an error?..    
e0f0: 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 24    #..      if {$
e100: 73 74 72 69 63 74 20 26 26 20 24 63 6f 64 65 20  strict && $code 
e110: 3d 3d 20 30 20 7c 7c 20 21 24 73 74 72 69 63 74  == 0 || !$strict
e120: 20 26 26 20 24 63 6f 64 65 20 21 3d 20 31 7d 20   && $code != 1} 
e130: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
e140: 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
e150: 45 3a 20 53 75 63 63 65 73 73 2e 20 20 52 65 74  E: Success.  Ret
e160: 75 72 6e 20 61 20 6c 69 73 74 20 77 69 74 68 20  urn a list with 
e170: 74 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20  the return code 
e180: 61 6e 64 20 74 68 65 20 72 65 73 75 6c 74 2e 0d  and the result..
e190: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
e1a0: 20 20 20 20 72 65 74 75 72 6e 20 5b 6c 69 73 74      return [list
e1b0: 20 24 63 6f 64 65 20 24 72 65 73 75 6c 74 5d 0d   $code $result].
e1c0: 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 69 66 20  .      } elseif 
e1d0: 7b 24 73 74 61 63 6b 54 72 61 63 65 7d 20 74 68  {$stackTrace} th
e1e0: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d  en {..        #.
e1f0: 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
e200: 20 46 61 69 6c 75 72 65 2e 20 20 4f 75 72 20 63   Failure.  Our c
e210: 61 6c 6c 65 72 20 77 61 6e 74 73 20 61 20 66 75  aller wants a fu
e220: 6c 6c 20 73 74 61 63 6b 20 74 72 61 63 65 20 28  ll stack trace (
e230: 69 66 20 61 70 70 6c 69 63 61 62 6c 65 29 2c 0d  if applicable),.
e240: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
e250: 20 72 65 74 75 72 6e 20 61 20 6c 69 73 74 20 77   return a list w
e260: 69 74 68 20 74 68 65 20 72 65 74 75 72 6e 20 63  ith the return c
e270: 6f 64 65 20 61 6e 64 20 74 68 65 20 72 65 73 75  ode and the resu
e280: 6c 74 20 76 65 72 62 61 74 69 6d 2e 0d 0a 20 20  lt verbatim...  
e290: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
e2a0: 20 72 65 74 75 72 6e 20 5b 6c 69 73 74 20 24 63   return [list $c
e2b0: 6f 64 65 20 24 72 65 73 75 6c 74 5d 0d 0a 20 20  ode $result]..  
e2c0: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
e2d0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
e2e0: 20 23 20 4e 4f 54 45 3a 20 46 61 69 6c 75 72 65   # NOTE: Failure
e2f0: 2e 20 20 4f 75 72 20 63 61 6c 6c 65 72 20 64 6f  .  Our caller do
e300: 65 73 20 6e 6f 74 20 77 61 6e 74 20 61 20 66 75  es not want a fu
e310: 6c 6c 20 73 74 61 63 6b 20 74 72 61 63 65 20 28  ll stack trace (
e320: 69 66 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  if..        #   
e330: 20 20 20 20 61 70 70 6c 69 63 61 62 6c 65 29 2c      applicable),
e340: 20 72 65 74 75 72 6e 20 61 20 6c 69 73 74 20 77   return a list w
e350: 69 74 68 20 74 68 65 20 72 65 74 75 72 6e 20 63  ith the return c
e360: 6f 64 65 2c 20 74 68 65 20 65 72 72 6f 72 0d 0a  ode, the error..
e370: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
e380: 63 6f 64 65 20 66 6f 72 20 74 68 65 20 69 6e 74  code for the int
e390: 65 72 70 72 65 74 65 72 2c 20 61 6e 64 20 74 68  erpreter, and th
e3a0: 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  e error message 
e3b0: 75 70 20 74 6f 20 74 68 65 0d 0a 20 20 20 20 20  up to the..     
e3c0: 20 20 20 23 20 20 20 20 20 20 20 70 6f 69 6e 74     #       point
e3d0: 20 77 68 65 72 65 20 74 68 65 20 73 74 61 63 6b   where the stack
e3e0: 20 74 72 61 63 65 20 73 68 6f 75 6c 64 20 73 74   trace should st
e3f0: 61 72 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  art...        #.
e400: 0a 20 20 20 20 20 20 20 20 73 65 74 20 69 6e 64  .        set ind
e410: 65 78 20 5b 73 74 72 69 6e 67 20 66 69 72 73 74  ex [string first
e420: 20 22 20 20 20 61 74 20 22 20 24 72 65 73 75 6c   "   at " $resul
e430: 74 5d 3b 20 23 20 48 41 43 4b 3a 20 52 65 6c 69  t]; # HACK: Reli
e440: 61 62 6c 65 3f 0d 0a 0d 0a 20 20 20 20 20 20 20  able?....       
e450: 20 72 65 74 75 72 6e 20 5b 6c 69 73 74 20 24 63   return [list $c
e460: 6f 64 65 20 24 3a 3a 65 72 72 6f 72 43 6f 64 65  ode $::errorCode
e470: 20 5b 65 78 70 72 20 7b 24 69 6e 64 65 78 20 21   [expr {$index !
e480: 3d 20 2d 31 20 3f 20 5c 0d 0a 20 20 20 20 20 20  = -1 ? \..      
e490: 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20 74 72        [string tr
e4a0: 69 6d 20 5b 73 74 72 69 6e 67 20 72 61 6e 67 65  im [string range
e4b0: 20 24 72 65 73 75 6c 74 20 30 20 24 69 6e 64 65   $result 0 $inde
e4c0: 78 5d 5d 20 3a 20 24 72 65 73 75 6c 74 7d 5d 5d  x]] : $result}]]
e4d0: 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d  ..      }..    }
e4e0: 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 63 6f  .....    proc co
e4f0: 6d 70 69 6c 65 43 53 68 61 72 70 57 69 74 68 20  mpileCSharpWith 
e500: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  {..            t
e510: 65 78 74 20 6d 65 6d 6f 72 79 20 73 79 6d 62 6f  ext memory symbo
e520: 6c 73 20 73 74 72 69 63 74 20 72 65 73 75 6c 74  ls strict result
e530: 73 56 61 72 4e 61 6d 65 20 65 72 72 6f 72 73 56  sVarName errorsV
e540: 61 72 4e 61 6d 65 20 66 69 6c 65 4e 61 6d 65 73  arName fileNames
e550: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 72  ..            ar
e560: 67 73 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d  gs } {..      #.
e570: 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53  .      # NOTE: S
e580: 69 6e 63 65 20 77 65 20 61 72 65 20 67 6f 69 6e  ince we are goin
e590: 67 20 74 6f 20 75 73 65 20 74 68 69 73 20 6d 65  g to use this me
e5a0: 74 68 6f 64 20 6e 61 6d 65 20 61 20 6c 6f 74 2c  thod name a lot,
e5b0: 20 61 73 73 69 67 6e 20 69 74 20 74 6f 20 61 0d   assign it to a.
e5c0: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 76  .      #       v
e5d0: 61 72 69 61 62 6c 65 20 66 69 72 73 74 2e 0d 0a  ariable first...
e5e0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 73        #..      s
e5f0: 65 74 20 61 64 64 20 52 65 66 65 72 65 6e 63 65  et add Reference
e600: 64 41 73 73 65 6d 62 6c 69 65 73 2e 41 64 64 0d  dAssemblies.Add.
e610: 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
e620: 20 20 23 20 4e 4f 54 45 3a 20 43 72 65 61 74 65    # NOTE: Create
e630: 20 74 68 65 20 62 61 73 65 20 63 6f 6d 6d 61 6e   the base comman
e640: 64 20 74 6f 20 65 76 61 6c 75 61 74 65 20 61 6e  d to evaluate an
e650: 64 20 61 64 64 20 74 68 65 20 70 72 6f 70 65 72  d add the proper
e660: 74 79 20 73 65 74 74 69 6e 67 73 0d 0a 20 20 20  ty settings..   
e670: 20 20 20 23 20 20 20 20 20 20 20 74 68 61 74 20     #       that 
e680: 61 72 65 20 61 6c 6d 6f 73 74 20 61 6c 77 61 79  are almost alway
e690: 73 20 6e 65 65 64 65 64 20 62 79 20 6f 75 72 20  s needed by our 
e6a0: 75 6e 69 74 20 74 65 73 74 73 20 28 69 2e 65 2e  unit tests (i.e.
e6b0: 20 74 68 65 20 53 79 73 74 65 6d 0d 0a 20 20 20   the System..   
e6c0: 20 20 20 23 20 20 20 20 20 20 20 61 6e 64 20 53     #       and S
e6d0: 79 73 74 65 6d 2e 44 61 74 61 20 61 73 73 65 6d  ystem.Data assem
e6e0: 62 6c 79 20 72 65 66 65 72 65 6e 63 65 73 29 2e  bly references).
e6f0: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
e700: 20 73 65 74 20 63 6f 6d 6d 61 6e 64 20 5b 6c 69   set command [li
e710: 73 74 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  st \..          
e720: 63 6f 6d 70 69 6c 65 43 53 68 61 72 70 20 24 74  compileCSharp $t
e730: 65 78 74 20 24 6d 65 6d 6f 72 79 20 24 73 79 6d  ext $memory $sym
e740: 62 6f 6c 73 20 24 73 74 72 69 63 74 20 72 65 73  bols $strict res
e750: 75 6c 74 73 20 65 72 72 6f 72 73 20 5c 0d 0a 20  ults errors \.. 
e760: 20 20 20 20 20 20 20 20 20 24 61 64 64 20 53 79           $add Sy
e770: 73 74 65 6d 2e 64 6c 6c 20 24 61 64 64 20 53 79  stem.dll $add Sy
e780: 73 74 65 6d 2e 44 61 74 61 2e 64 6c 6c 20 24 61  stem.Data.dll $a
e790: 64 64 20 53 79 73 74 65 6d 2e 54 72 61 6e 73 61  dd System.Transa
e7a0: 63 74 69 6f 6e 73 2e 64 6c 6c 20 5c 0d 0a 20 20  ctions.dll \..  
e7b0: 20 20 20 20 20 20 20 20 24 61 64 64 20 53 79 73          $add Sys
e7c0: 74 65 6d 2e 58 6d 6c 2e 64 6c 6c 5d 0d 0a 0d 0a  tem.Xml.dll]....
e7d0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
e7e0: 20 4e 4f 54 45 3a 20 41 64 64 20 61 6c 6c 20 74   NOTE: Add all t
e7f0: 68 65 20 70 72 6f 76 69 64 65 64 20 66 69 6c 65  he provided file
e800: 20 6e 61 6d 65 73 20 61 73 20 61 73 73 65 6d 62   names as assemb
e810: 6c 79 20 72 65 66 65 72 65 6e 63 65 73 2e 0d 0a  ly references...
e820: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 66        #..      f
e830: 6f 72 65 61 63 68 20 66 69 6c 65 4e 61 6d 65 20  oreach fileName 
e840: 24 66 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20  $fileNames {..  
e850: 20 20 20 20 20 20 6c 61 70 70 65 6e 64 20 63 6f        lappend co
e860: 6d 6d 61 6e 64 20 24 61 64 64 20 5b 67 65 74 42  mmand $add [getB
e870: 69 6e 61 72 79 46 69 6c 65 4e 61 6d 65 20 24 66  inaryFileName $f
e880: 69 6c 65 4e 61 6d 65 5d 0d 0a 20 20 20 20 20 20  ileName]..      
e890: 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  }....      #..  
e8a0: 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 64 64 20      # NOTE: Add 
e8b0: 74 68 65 20 65 78 74 72 61 20 61 72 67 75 6d 65  the extra argume
e8c0: 6e 74 73 2c 20 69 66 20 61 6e 79 2c 20 74 6f 20  nts, if any, to 
e8d0: 74 68 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65  the command to e
e8e0: 76 61 6c 75 61 74 65 2e 0d 0a 20 20 20 20 20 20  valuate...      
e8f0: 23 0d 0a 20 20 20 20 20 20 65 76 61 6c 20 6c 61  #..      eval la
e900: 70 70 65 6e 64 20 63 6f 6d 6d 61 6e 64 20 24 61  ppend command $a
e910: 72 67 73 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a  rgs....      #..
e920: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 6c        # NOTE: Al
e930: 69 61 73 20 74 68 65 20 63 6f 6d 70 69 6c 65 72  ias the compiler
e940: 20 6c 6f 63 61 6c 20 72 65 73 75 6c 74 73 20 61   local results a
e950: 6e 64 20 65 72 72 6f 72 73 20 76 61 72 69 61 62  nd errors variab
e960: 6c 65 73 20 74 6f 20 74 68 65 0d 0a 20 20 20 20  les to the..    
e970: 20 20 23 20 20 20 20 20 20 20 76 61 72 69 61 62    #       variab
e980: 6c 65 20 6e 61 6d 65 73 20 70 72 6f 76 69 64 65  le names provide
e990: 64 20 62 79 20 6f 75 72 20 63 61 6c 6c 65 72 2e  d by our caller.
e9a0: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
e9b0: 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e   if {[string len
e9c0: 67 74 68 20 24 72 65 73 75 6c 74 73 56 61 72 4e  gth $resultsVarN
e9d0: 61 6d 65 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b  ame] > 0} then {
e9e0: 0d 0a 20 20 20 20 20 20 20 20 75 70 76 61 72 20  ..        upvar 
e9f0: 31 20 24 72 65 73 75 6c 74 73 56 61 72 4e 61 6d  1 $resultsVarNam
ea00: 65 20 72 65 73 75 6c 74 73 0d 0a 20 20 20 20 20  e results..     
ea10: 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b   }....      if {
ea20: 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
ea30: 65 72 72 6f 72 73 56 61 72 4e 61 6d 65 5d 20 3e  errorsVarName] >
ea40: 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
ea50: 20 20 20 20 75 70 76 61 72 20 31 20 24 65 72 72      upvar 1 $err
ea60: 6f 72 73 56 61 72 4e 61 6d 65 20 65 72 72 6f 72  orsVarName error
ea70: 73 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  s..      }....  
ea80: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
ea90: 4f 54 45 3a 20 45 76 61 6c 75 61 74 65 20 74 68  OTE: Evaluate th
eaa0: 65 20 63 6f 6e 73 74 72 75 63 74 65 64 20 5b 63  e constructed [c
eab0: 6f 6d 70 69 6c 65 43 53 68 61 72 70 5d 20 63 6f  ompileCSharp] co
eac0: 6d 6d 61 6e 64 20 61 6e 64 20 72 65 74 75 72 6e  mmand and return
ead0: 20 74 68 65 0d 0a 20 20 20 20 20 20 23 20 20 20   the..      #   
eae0: 20 20 20 20 72 65 73 75 6c 74 2e 0d 0a 20 20 20      result...   
eaf0: 20 20 20 23 0d 0a 20 20 20 20 20 20 65 76 61 6c     #..      eval
eb00: 20 24 63 6f 6d 6d 61 6e 64 0d 0a 20 20 20 20 7d   $command..    }
eb10: 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 69 73  .....    proc is
eb20: 4d 65 6d 6f 72 79 44 62 20 7b 20 66 69 6c 65 4e  MemoryDb { fileN
eb30: 61 6d 65 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23  ame } {..      #
eb40: 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
eb50: 49 73 20 74 68 65 20 73 70 65 63 69 66 69 65 64  Is the specified
eb60: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6e   database file n
eb70: 61 6d 65 20 72 65 61 6c 6c 79 20 61 6e 20 69 6e  ame really an in
eb80: 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
eb90: 3f 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ?..      #..    
eba0: 20 20 72 65 74 75 72 6e 20 5b 65 78 70 72 20 7b    return [expr {
ebb0: 24 66 69 6c 65 4e 61 6d 65 20 65 71 20 22 3a 6d  $fileName eq ":m
ebc0: 65 6d 6f 72 79 3a 22 20 7c 7c 20 5c 0d 0a 20 20  emory:" || \..  
ebd0: 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20          [string 
ebe0: 72 61 6e 67 65 20 24 66 69 6c 65 4e 61 6d 65 20  range $fileName 
ebf0: 30 20 31 32 5d 20 65 71 20 22 66 69 6c 65 3a 3a  0 12] eq "file::
ec00: 6d 65 6d 6f 72 79 3a 22 7d 5d 0d 0a 20 20 20 20  memory:"}]..    
ec10: 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 69  }.....    proc i
ec20: 73 54 61 62 6c 65 49 6e 44 62 20 7b 20 6e 61 6d  sTableInDb { nam
ec30: 65 20 7b 76 61 72 4e 61 6d 65 20 64 62 7d 20 7d  e {varName db} }
ec40: 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20   {..      #..   
ec50: 20 20 20 23 20 4e 4f 54 45 3a 20 52 65 66 65 72     # NOTE: Refer
ec60: 20 74 6f 20 74 68 65 20 73 70 65 63 69 66 69 65   to the specifie
ec70: 64 20 76 61 72 69 61 62 6c 65 20 28 65 2e 67 2e  d variable (e.g.
ec80: 20 22 64 62 22 29 20 69 6e 20 74 68 65 20 63 6f   "db") in the co
ec90: 6e 74 65 78 74 20 6f 66 20 6f 75 72 0d 0a 20 20  ntext of our..  
eca0: 20 20 20 20 23 20 20 20 20 20 20 20 63 61 6c 6c      #       call
ecb0: 65 72 2e 20 20 49 74 20 63 6f 6e 74 61 69 6e 73  er.  It contains
ecc0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   the database co
ecd0: 6e 6e 65 63 74 69 6f 6e 20 68 61 6e 64 6c 65 20  nnection handle 
ece0: 74 68 61 74 20 77 69 6c 6c 20 62 65 0d 0a 20 20  that will be..  
ecf0: 20 20 20 20 23 20 20 20 20 20 20 20 75 73 65 64      #       used
ed00: 20 74 6f 20 65 78 65 63 75 74 65 20 74 68 65 20   to execute the 
ed10: 71 75 65 72 79 20 75 73 65 64 20 74 6f 20 64 65  query used to de
ed20: 74 65 72 6d 69 6e 65 20 69 66 20 74 68 65 20 6e  termine if the n
ed30: 61 6d 65 64 20 74 61 62 6c 65 20 69 73 0d 0a 20  amed table is.. 
ed40: 20 20 20 20 20 23 20 20 20 20 20 20 20 70 72 65       #       pre
ed50: 73 65 6e 74 20 69 6e 20 74 68 61 74 20 64 61 74  sent in that dat
ed60: 61 62 61 73 65 2e 0d 0a 20 20 20 20 20 20 23 0d  abase...      #.
ed70: 0a 20 20 20 20 20 20 75 70 76 61 72 20 31 20 24  .      upvar 1 $
ed80: 76 61 72 4e 61 6d 65 20 64 62 0d 0a 0d 0a 20 20  varName db....  
ed90: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
eda0: 4f 54 45 3a 20 55 73 65 20 74 68 65 20 73 71 6c  OTE: Use the sql
edb0: 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65  ite_master table
edc0: 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 69 66   to determine if
edd0: 20 74 68 65 20 6e 61 6d 65 64 20 74 61 62 6c 65   the named table
ede0: 20 69 73 0d 0a 20 20 20 20 20 20 23 20 20 20 20   is..      #    
edf0: 20 20 20 70 72 65 73 65 6e 74 20 69 6e 20 74 68     present in th
ee00: 65 20 64 61 74 61 62 61 73 65 2e 0d 0a 20 20 20  e database...   
ee10: 20 20 20 23 0d 0a 20 20 20 20 20 20 73 65 74 20     #..      set 
ee20: 73 71 6c 20 7b 0d 0a 20 20 20 20 20 20 20 20 53  sql {..        S
ee30: 45 4c 45 43 54 20 43 4f 55 4e 54 28 2a 29 20 46  ELECT COUNT(*) F
ee40: 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  ROM sqlite_maste
ee50: 72 20 57 48 45 52 45 20 74 79 70 65 20 3d 20 27  r WHERE type = '
ee60: 74 61 62 6c 65 27 20 41 4e 44 20 6e 61 6d 65 20  table' AND name 
ee70: 3d 20 3f 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d  = ?;..      }...
ee80: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
ee90: 23 20 4e 4f 54 45 3a 20 52 65 74 75 72 6e 20 6e  # NOTE: Return n
eea0: 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 20 6e  on-zero if the n
eeb0: 61 6d 65 64 20 74 61 62 6c 65 20 69 73 20 70 72  amed table is pr
eec0: 65 73 65 6e 74 2e 0d 0a 20 20 20 20 20 20 23 0d  esent...      #.
eed0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b 65  .      return [e
eee0: 78 70 72 20 7b 0d 0a 20 20 20 20 20 20 20 20 5b  xpr {..        [
eef0: 73 71 6c 20 65 78 65 63 75 74 65 20 2d 65 78 65  sql execute -exe
ef00: 63 75 74 65 20 73 63 61 6c 61 72 20 24 64 62 20  cute scalar $db 
ef10: 24 73 71 6c 20 5b 6c 69 73 74 20 70 61 72 61 6d  $sql [list param
ef20: 31 20 53 74 72 69 6e 67 20 24 6e 61 6d 65 5d 5d  1 String $name]]
ef30: 20 3e 20 30 0d 0a 20 20 20 20 20 20 7d 5d 0d 0a   > 0..      }]..
ef40: 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
ef50: 6f 63 20 74 72 69 6d 53 71 6c 20 7b 20 73 71 6c  oc trimSql { sql
ef60: 20 7d 20 7b 0d 0a 20 20 20 20 20 20 72 65 74 75   } {..      retu
ef70: 72 6e 20 5b 72 65 67 73 75 62 20 2d 61 6c 6c 20  rn [regsub -all 
ef80: 2d 2d 20 7b 5c 73 2b 7d 20 5b 73 74 72 69 6e 67  -- {\s+} [string
ef90: 20 74 72 69 6d 20 24 73 71 6c 5d 20 22 20 22 5d   trim $sql] " "]
efa0: 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
efb0: 70 72 6f 63 20 65 78 65 63 75 74 65 53 71 6c 20  proc executeSql 
efc0: 7b 20 73 71 6c 20 7b 65 78 65 63 75 74 65 20 6e  { sql {execute n
efd0: 6f 6e 65 7d 20 7b 66 6f 72 6d 61 74 20 6e 6f 6e  one} {format non
efe0: 65 7d 20 7b 66 69 6c 65 4e 61 6d 65 20 22 22 7d  e} {fileName ""}
eff0: 20 7d 20 7b 0d 0a 20 20 20 20 20 20 69 66 20 7b   } {..      if {
f000: 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
f010: 66 69 6c 65 4e 61 6d 65 5d 20 3d 3d 20 30 7d 20  fileName] == 0} 
f020: 74 68 65 6e 20 7b 73 65 74 20 66 69 6c 65 4e 61  then {set fileNa
f030: 6d 65 20 3a 6d 65 6d 6f 72 79 3a 7d 0d 0a 20 20  me :memory:}..  
f040: 20 20 20 20 73 65 74 75 70 44 62 20 24 66 69 6c      setupDb $fil
f050: 65 4e 61 6d 65 20 22 22 20 22 22 20 22 22 20 22  eName "" "" "" "
f060: 22 20 22 22 20 66 61 6c 73 65 20 66 61 6c 73 65  " "" false false
f070: 20 66 61 6c 73 65 20 66 61 6c 73 65 20 64 62 20   false false db 
f080: 74 72 75 65 0d 0a 0d 0a 20 20 20 20 20 20 74 72  true....      tr
f090: 79 20 7b 0d 0a 20 20 20 20 20 20 20 20 72 65 74  y {..        ret
f0a0: 75 72 6e 20 5b 75 70 6c 65 76 65 6c 20 31 20 5b  urn [uplevel 1 [
f0b0: 6c 69 73 74 20 5c 0d 0a 20 20 20 20 20 20 20 20  list \..        
f0c0: 20 20 20 20 73 71 6c 20 65 78 65 63 75 74 65 20      sql execute 
f0d0: 2d 65 78 65 63 75 74 65 20 24 65 78 65 63 75 74  -execute $execut
f0e0: 65 20 2d 66 6f 72 6d 61 74 20 24 66 6f 72 6d 61  e -format $forma
f0f0: 74 20 24 64 62 20 24 73 71 6c 5d 5d 0d 0a 20 20  t $db $sql]]..  
f100: 20 20 20 20 7d 20 66 69 6e 61 6c 6c 79 20 7b 0d      } finally {.
f110: 0a 20 20 20 20 20 20 20 20 63 6c 65 61 6e 75 70  .        cleanup
f120: 44 62 20 24 66 69 6c 65 4e 61 6d 65 20 64 62 20  Db $fileName db 
f130: 66 61 6c 73 65 20 66 61 6c 73 65 20 66 61 6c 73  false false fals
f140: 65 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  e..      }..    
f150: 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 68  }.....    proc h
f160: 61 73 4e 6f 46 6c 61 67 73 20 7b 20 76 61 72 4e  asNoFlags { varN
f170: 61 6d 65 20 6e 6f 6e 65 20 7d 20 7b 0d 0a 20 20  ame none } {..  
f180: 20 20 20 20 75 70 76 61 72 20 31 20 24 76 61 72      upvar 1 $var
f190: 4e 61 6d 65 20 66 6c 61 67 73 0d 0a 0d 0a 20 20  Name flags....  
f1a0: 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65      if {![info e
f1b0: 78 69 73 74 73 20 66 6c 61 67 73 5d 7d 20 74 68  xists flags]} th
f1c0: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 72 65  en {..        re
f1d0: 74 75 72 6e 20 74 72 75 65 0d 0a 20 20 20 20 20  turn true..     
f1e0: 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b   }....      if {
f1f0: 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
f200: 66 6c 61 67 73 5d 20 3d 3d 20 30 7d 20 74 68 65  flags] == 0} the
f210: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 72 65 74  n {..        ret
f220: 75 72 6e 20 74 72 75 65 0d 0a 20 20 20 20 20 20  urn true..      
f230: 7d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 24  }....      if {$
f240: 6e 6f 6e 65 20 26 26 20 24 66 6c 61 67 73 20 65  none && $flags e
f250: 71 20 22 4e 6f 6e 65 22 7d 20 74 68 65 6e 20 7b  q "None"} then {
f260: 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ..        return
f270: 20 74 72 75 65 0d 0a 20 20 20 20 20 20 7d 0d 0a   true..      }..
f280: 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 66  ..      return f
f290: 61 6c 73 65 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a  alse..    }.....
f2a0: 20 20 20 20 70 72 6f 63 20 67 65 74 43 6f 6e 6e      proc getConn
f2b0: 65 63 74 69 6f 6e 46 6c 61 67 73 20 7b 20 66 69  ectionFlags { fi
f2c0: 6c 65 4e 61 6d 65 20 66 6c 61 67 73 20 7b 71 75  leName flags {qu
f2d0: 69 65 74 20 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a  iet false} } {..
f2e0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
f2f0: 20 4e 4f 54 45 3a 20 46 69 67 75 72 65 20 6f 75   NOTE: Figure ou
f300: 74 20 77 68 69 63 68 20 64 61 74 61 62 61 73 65  t which database
f310: 20 66 69 6c 65 20 6e 61 6d 65 20 6f 72 20 63 6f   file name or co
f320: 6e 6e 65 63 74 69 6f 6e 20 73 74 72 69 6e 67 20  nnection string 
f330: 74 68 65 73 65 0d 0a 20 20 20 20 20 20 23 20 20  these..      #  
f340: 20 20 20 20 20 63 6f 6e 6e 65 63 74 69 6f 6e 20       connection 
f350: 66 6c 61 67 73 20 77 69 6c 6c 20 61 63 74 75 61  flags will actua
f360: 6c 6c 79 20 61 70 70 6c 79 20 74 6f 2e 20 20 54  lly apply to.  T
f370: 68 69 73 20 69 73 20 6e 6f 74 20 6e 65 63 65 73  his is not neces
f380: 73 61 72 79 0d 0a 20 20 20 20 20 20 23 20 20 20  sary..      #   
f390: 20 20 20 20 69 6e 20 71 75 69 65 74 20 6d 6f 64      in quiet mod
f3a0: 65 20 62 65 63 61 75 73 65 20 74 68 69 73 20 69  e because this i
f3b0: 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 6f 6e  nformation is on
f3c0: 6c 79 20 75 73 65 64 20 66 6f 72 20 6c 6f 67 67  ly used for logg
f3d0: 69 6e 67 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ing..      #    
f3e0: 20 20 20 61 6e 64 20 72 65 70 6f 72 74 69 6e 67     and reporting
f3f0: 20 70 75 72 70 6f 73 65 73 2e 0d 0a 20 20 20 20   purposes...    
f400: 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 21    #..      if {!
f410: 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a  $quiet} then {..
f420: 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72          if {[str
f430: 69 6e 67 20 6c 65 6e 67 74 68 20 24 66 69 6c 65  ing length $file
f440: 4e 61 6d 65 5d 20 3e 20 30 7d 20 74 68 65 6e 20  Name] > 0} then 
f450: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74  {..          set
f460: 20 64 61 74 61 62 61 73 65 20 5b 61 70 70 65 6e   database [appen
f470: 64 41 72 67 73 20 22 66 69 6c 65 20 6e 61 6d 65  dArgs "file name
f480: 20 5c 22 22 20 24 66 69 6c 65 4e 61 6d 65 20 5c   \"" $fileName \
f490: 22 5d 0d 0a 20 20 20 20 20 20 20 20 7d 20 65 6c  "]..        } el
f4a0: 73 65 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73  seif {[info exis
f4b0: 74 73 20 3a 3a 64 61 74 61 53 6f 75 72 63 65 5d  ts ::dataSource]
f4c0: 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20   && \..         
f4d0: 20 20 20 21 5b 61 72 72 61 79 20 65 78 69 73 74     ![array exist
f4e0: 73 20 3a 3a 64 61 74 61 53 6f 75 72 63 65 5d 7d  s ::dataSource]}
f4f0: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
f500: 20 20 20 73 65 74 20 64 61 74 61 62 61 73 65 20     set database 
f510: 5b 61 70 70 65 6e 64 41 72 67 73 20 22 64 61 74  [appendArgs "dat
f520: 61 20 73 6f 75 72 63 65 20 5c 22 22 20 24 3a 3a  a source \"" $::
f530: 64 61 74 61 53 6f 75 72 63 65 20 5c 22 5d 0d 0a  dataSource \"]..
f540: 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b          } else {
f550: 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20  ..          set 
f560: 64 61 74 61 62 61 73 65 20 3c 75 6e 6b 6e 6f 77  database <unknow
f570: 6e 3e 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20  n>..        }.. 
f580: 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
f590: 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
f5a0: 20 53 68 6f 77 20 28 61 6e 64 20 6c 6f 67 29 20   Show (and log) 
f5b0: 74 68 65 20 6c 6f 63 61 6c 20 63 6f 6e 6e 65 63  the local connec
f5c0: 74 69 6f 6e 20 66 6c 61 67 73 20 61 6e 64 20 74  tion flags and t
f5d0: 68 65 20 61 73 73 6f 63 69 61 74 65 64 0d 0a 20  he associated.. 
f5e0: 20 20 20 20 20 23 20 20 20 20 20 20 20 64 61 74       #       dat
f5f0: 61 20 73 6f 75 72 63 65 20 6f 72 20 66 69 6c 65  a source or file
f600: 20 6e 61 6d 65 2e 0d 0a 20 20 20 20 20 20 23 0d   name...      #.
f610: 0a 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69  .      if {!$qui
f620: 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  et} then {..    
f630: 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65      if {![info e
f640: 78 69 73 74 73 20 3a 3a 6e 6f 28 65 6d 69 74 4c  xists ::no(emitL
f650: 6f 63 61 6c 46 6c 61 67 73 29 5d 20 26 26 20 5c  ocalFlags)] && \
f660: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 28 21  ..            (!
f670: 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e  [info exists ::n
f680: 6f 28 65 6d 69 74 4c 6f 63 61 6c 46 6c 61 67 73  o(emitLocalFlags
f690: 49 66 4e 6f 6e 65 29 5d 20 7c 7c 20 5c 0d 0a 20  IfNone)] || \.. 
f6a0: 20 20 20 20 20 20 20 20 20 20 20 20 21 5b 68 61              ![ha
f6b0: 73 4e 6f 46 6c 61 67 73 20 66 6c 61 67 73 20 66  sNoFlags flags f
f6c0: 61 6c 73 65 5d 29 7d 20 74 68 65 6e 20 7b 0d 0a  alse])} then {..
f6d0: 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
f6e0: 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
f6f0: 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
f700: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d               "--
f710: 2d 2d 20 6c 6f 63 61 6c 20 63 6f 6e 6e 65 63 74  -- local connect
f720: 69 6f 6e 20 66 6c 61 67 73 20 66 6f 72 20 22 20  ion flags for " 
f730: 24 64 61 74 61 62 61 73 65 20 5c 0d 0a 20 20 20  $database \..   
f740: 20 20 20 20 20 20 20 20 20 20 20 22 20 61 72 65             " are
f750: 3a 20 22 20 5b 65 78 70 72 20 7b 21 5b 68 61 73  : " [expr {![has
f760: 4e 6f 46 6c 61 67 73 20 66 6c 61 67 73 20 66 61  NoFlags flags fa
f770: 6c 73 65 5d 20 3f 20 5c 0d 0a 20 20 20 20 20 20  lse] ? \..      
f780: 20 20 20 20 20 20 20 20 5b 61 70 70 65 6e 64 41          [appendA
f790: 72 67 73 20 5c 22 20 24 66 6c 61 67 73 20 5c 22  rgs \" $flags \"
f7a0: 5d 20 3a 20 22 3c 6e 6f 6e 65 3e 22 7d 5d 20 5c  ] : "<none>"}] \
f7b0: 6e 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20  n]..        }.. 
f7c0: 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
f7d0: 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
f7e0: 20 53 68 6f 77 20 28 61 6e 64 20 6c 6f 67 29 20   Show (and log) 
f7f0: 74 68 65 20 73 68 61 72 65 64 20 63 6f 6e 6e 65  the shared conne
f800: 63 74 69 6f 6e 20 66 6c 61 67 73 2e 0d 0a 20 20  ction flags...  
f810: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20      #..      if 
f820: 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b  {!$quiet} then {
f830: 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63  ..        if {[c
f840: 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20  atch {..        
f850: 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20    object invoke 
f860: 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
f870: 74 65 2e 53 51 4c 69 74 65 43 6f 6e 6e 65 63 74  te.SQLiteConnect
f880: 69 6f 6e 20 53 68 61 72 65 64 46 6c 61 67 73 0d  ion SharedFlags.
f890: 0a 20 20 20 20 20 20 20 20 7d 20 73 68 61 72 65  .        } share
f8a0: 64 46 6c 61 67 73 5d 20 3d 3d 20 30 7d 20 74 68  dFlags] == 0} th
f8b0: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
f8c0: 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74  if {![info exist
f8d0: 73 20 3a 3a 6e 6f 28 65 6d 69 74 53 68 61 72 65  s ::no(emitShare
f8e0: 64 46 6c 61 67 73 29 5d 20 26 26 20 5c 0d 0a 20  dFlags)] && \.. 
f8f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 21 5b               (![
f900: 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f  info exists ::no
f910: 28 65 6d 69 74 53 68 61 72 65 64 46 6c 61 67 73  (emitSharedFlags
f920: 49 66 4e 6f 6e 65 29 5d 20 7c 7c 20 5c 0d 0a 20  IfNone)] || \.. 
f930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 21 5b                ![
f940: 68 61 73 4e 6f 46 6c 61 67 73 20 73 68 61 72 65  hasNoFlags share
f950: 64 46 6c 61 67 73 20 74 72 75 65 5d 29 7d 20 74  dFlags true])} t
f960: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
f970: 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
f980: 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  _channel [append
f990: 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
f9a0: 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 73 68          "---- sh
f9b0: 61 72 65 64 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  ared connection 
f9c0: 66 6c 61 67 73 20 66 6f 72 20 22 20 24 64 61 74  flags for " $dat
f9d0: 61 62 61 73 65 20 5c 0d 0a 20 20 20 20 20 20 20  abase \..       
f9e0: 20 20 20 20 20 20 20 20 20 22 20 61 72 65 3a 20           " are: 
f9f0: 22 20 5b 65 78 70 72 20 7b 21 5b 68 61 73 4e 6f  " [expr {![hasNo
fa00: 46 6c 61 67 73 20 73 68 61 72 65 64 46 6c 61 67  Flags sharedFlag
fa10: 73 20 74 72 75 65 5d 20 3f 20 5c 0d 0a 20 20 20  s true] ? \..   
fa20: 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 61 70               [ap
fa30: 70 65 6e 64 41 72 67 73 20 5c 22 20 24 73 68 61  pendArgs \" $sha
fa40: 72 65 64 46 6c 61 67 73 20 5c 22 5d 20 3a 20 22  redFlags \"] : "
fa50: 3c 6e 6f 6e 65 3e 22 7d 5d 20 5c 6e 5d 0d 0a 20  <none>"}] \n].. 
fa60: 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
fa70: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
fa80: 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e          if {![in
fa90: 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 65  fo exists ::no(e
faa0: 6d 69 74 53 68 61 72 65 64 46 6c 61 67 73 29 5d  mitSharedFlags)]
fab0: 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20   && \..         
fac0: 20 20 20 20 20 21 5b 69 6e 66 6f 20 65 78 69 73       ![info exis
fad0: 74 73 20 3a 3a 6e 6f 28 65 6d 69 74 53 68 61 72  ts ::no(emitShar
fae0: 65 64 46 6c 61 67 73 49 66 55 6e 61 76 61 69 6c  edFlagsIfUnavail
faf0: 61 62 6c 65 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a  able)]} then {..
fb00: 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
fb10: 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
fb20: 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
fb30: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
fb40: 20 22 2d 2d 2d 2d 20 73 68 61 72 65 64 20 63 6f   "---- shared co
fb50: 6e 6e 65 63 74 69 6f 6e 20 66 6c 61 67 73 20 66  nnection flags f
fb60: 6f 72 20 22 20 24 64 61 74 61 62 61 73 65 20 5c  or " $database \
fb70: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
fb80: 20 20 22 20 61 72 65 3a 20 3c 75 6e 61 76 61 69    " are: <unavai
fb90: 6c 61 62 6c 65 3e 5c 6e 22 5d 0d 0a 20 20 20 20  lable>\n"]..    
fba0: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
fbb0: 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20   }..      }.... 
fbc0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
fbd0: 4e 4f 54 45 3a 20 53 68 6f 77 20 28 61 6e 64 20  NOTE: Show (and 
fbe0: 6c 6f 67 29 20 74 68 65 20 64 65 74 65 63 74 65  log) the detecte
fbf0: 64 20 67 6c 6f 62 61 6c 20 63 6f 6e 6e 65 63 74  d global connect
fc00: 69 6f 6e 20 66 6c 61 67 73 2c 20 69 66 20 61 6e  ion flags, if an
fc10: 79 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  y...      #..   
fc20: 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20     if {!$quiet} 
fc30: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
fc40: 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74  if {![info exist
fc50: 73 20 3a 3a 6e 6f 28 65 6d 69 74 47 6c 6f 62 61  s ::no(emitGloba
fc60: 6c 46 6c 61 67 73 29 5d 20 26 26 20 5c 0d 0a 20  lFlags)] && \.. 
fc70: 20 20 20 20 20 20 20 20 20 20 20 28 21 5b 69 6e             (![in
fc80: 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 65  fo exists ::no(e
fc90: 6d 69 74 47 6c 6f 62 61 6c 46 6c 61 67 73 49 66  mitGlobalFlagsIf
fca0: 4e 6f 6e 65 29 5d 20 7c 7c 20 5c 0d 0a 20 20 20  None)] || \..   
fcb0: 20 20 20 20 20 20 20 20 20 20 21 5b 68 61 73 4e            ![hasN
fcc0: 6f 46 6c 61 67 73 20 3a 3a 63 6f 6e 6e 65 63 74  oFlags ::connect
fcd0: 69 6f 6e 5f 66 6c 61 67 73 20 66 61 6c 73 65 5d  ion_flags false]
fce0: 29 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  )} then {..     
fcf0: 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
fd00: 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
fd10: 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
fd20: 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 67 6c          "---- gl
fd30: 6f 62 61 6c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  obal connection 
fd40: 66 6c 61 67 73 20 61 72 65 3a 20 22 20 5c 0d 0a  flags are: " \..
fd50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 65                [e
fd60: 78 70 72 20 7b 21 5b 68 61 73 4e 6f 46 6c 61 67  xpr {![hasNoFlag
fd70: 73 20 3a 3a 63 6f 6e 6e 65 63 74 69 6f 6e 5f 66  s ::connection_f
fd80: 6c 61 67 73 20 66 61 6c 73 65 5d 20 3f 20 5c 0d  lags false] ? \.
fd90: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b  .              [
fda0: 61 70 70 65 6e 64 41 72 67 73 20 5c 22 20 24 3a  appendArgs \" $:
fdb0: 3a 63 6f 6e 6e 65 63 74 69 6f 6e 5f 66 6c 61 67  :connection_flag
fdc0: 73 20 5c 22 5d 20 3a 20 22 3c 6e 6f 6e 65 3e 22  s \"] : "<none>"
fdd0: 7d 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20  }] \n]..        
fde0: 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  }..      }....  
fdf0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
fe00: 4f 54 45 3a 20 49 66 20 74 68 65 72 65 20 61 72  OTE: If there ar
fe10: 65 20 61 6e 79 20 67 6c 6f 62 61 6c 20 28 70 65  e any global (pe
fe20: 72 20 74 65 73 74 20 72 75 6e 29 20 63 6f 6e 6e  r test run) conn
fe30: 65 63 74 69 6f 6e 20 66 6c 61 67 73 20 63 75 72  ection flags cur
fe40: 72 65 6e 74 6c 79 0d 0a 20 20 20 20 20 20 23 20  rently..      # 
fe50: 20 20 20 20 20 20 73 65 74 2c 20 75 73 65 20 74        set, use t
fe60: 68 65 6d 20 6e 6f 77 20 28 69 2e 65 2e 20 62 79  hem now (i.e. by
fe70: 20 63 6f 6d 62 69 6e 69 6e 67 20 74 68 65 6d 20   combining them 
fe80: 77 69 74 68 20 74 68 65 20 6f 6e 65 73 20 66 6f  with the ones fo
fe90: 72 20 74 68 69 73 0d 0a 20 20 20 20 20 20 23 20  r this..      # 
fea0: 20 20 20 20 20 20 63 6f 6e 6e 65 63 74 69 6f 6e        connection
feb0: 29 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  )...      #..   
fec0: 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69     if {[info exi
fed0: 73 74 73 20 3a 3a 63 6f 6e 6e 65 63 74 69 6f 6e  sts ::connection
fee0: 5f 66 6c 61 67 73 5d 7d 20 74 68 65 6e 20 7b 0d  _flags]} then {.
fef0: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
ff00: 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 6f 6d 62      # NOTE: Comb
ff10: 69 6e 65 20 61 6e 64 2f 6f 72 20 72 65 70 6c 61  ine and/or repla
ff20: 63 65 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  ce the connectio
ff30: 6e 20 66 6c 61 67 73 20 61 6e 64 20 74 68 65 6e  n flags and then
ff40: 20 73 68 6f 77 20 74 68 65 0d 0a 20 20 20 20 20   show the..     
ff50: 20 20 20 23 20 20 20 20 20 20 20 6e 65 77 20 76     #       new v
ff60: 61 6c 75 65 2e 0d 0a 20 20 20 20 20 20 20 20 23  alue...        #
ff70: 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 66 6c  ..        set fl
ff80: 61 67 73 20 5b 63 6f 6d 62 69 6e 65 46 6c 61 67  ags [combineFlag
ff90: 73 20 24 66 6c 61 67 73 20 24 3a 3a 63 6f 6e 6e  s $flags $::conn
ffa0: 65 63 74 69 6f 6e 5f 66 6c 61 67 73 5d 0d 0a 0d  ection_flags]...
ffb0: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
ffc0: 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 68 6f 77      # NOTE: Show
ffd0: 20 28 61 6e 64 20 6c 6f 67 29 20 74 68 65 20 6e   (and log) the n
ffe0: 65 77 20 65 66 66 65 63 74 69 76 65 20 63 6f 6e  ew effective con
fff0: 6e 65 63 74 69 6f 6e 20 66 6c 61 67 73 2e 0d 0a  nection flags...
10000 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
10010 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20     if {!$quiet} 
10020 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
10030 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69    if {![info exi
10040 73 74 73 20 3a 3a 6e 6f 28 65 6d 69 74 43 6f 6d  sts ::no(emitCom
10050 62 69 6e 65 64 46 6c 61 67 73 29 5d 20 26 26 20  binedFlags)] && 
10060 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
10070 20 28 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20   (![info exists 
10080 3a 3a 6e 6f 28 65 6d 69 74 43 6f 6d 62 69 6e 65  ::no(emitCombine
10090 64 46 6c 61 67 73 49 66 4e 6f 6e 65 29 5d 20 7c  dFlagsIfNone)] |
100a0 7c 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  | \..           
100b0 20 20 20 20 21 5b 68 61 73 4e 6f 46 6c 61 67 73      ![hasNoFlags
100c0 20 66 6c 61 67 73 20 66 61 6c 73 65 5d 29 7d 20   flags false])} 
100d0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
100e0 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
100f0 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e  t_channel [appen
10100 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
10110 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63           "---- c
10120 6f 6d 62 69 6e 65 64 20 63 6f 6e 6e 65 63 74 69  ombined connecti
10130 6f 6e 20 66 6c 61 67 73 20 66 6f 72 20 22 20 24  on flags for " $
10140 64 61 74 61 62 61 73 65 20 5c 0d 0a 20 20 20 20  database \..    
10150 20 20 20 20 20 20 20 20 20 20 20 20 22 20 61 72              " ar
10160 65 3a 20 22 20 5b 65 78 70 72 20 7b 21 5b 68 61  e: " [expr {![ha
10170 73 4e 6f 46 6c 61 67 73 20 66 6c 61 67 73 20 66  sNoFlags flags f
10180 61 6c 73 65 5d 20 3f 20 5c 0d 0a 20 20 20 20 20  alse] ? \..     
10190 20 20 20 20 20 20 20 20 20 20 20 5b 61 70 70 65             [appe
101a0 6e 64 41 72 67 73 20 5c 22 20 24 66 6c 61 67 73  ndArgs \" $flags
101b0 20 5c 22 5d 20 3a 20 22 3c 6e 6f 6e 65 3e 22 7d   \"] : "<none>"}
101c0 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20  ] \n]..         
101d0 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20   }..        }.. 
101e0 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
101f0 72 65 74 75 72 6e 20 24 66 6c 61 67 73 0d 0a 20  return $flags.. 
10200 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
10210 63 20 67 65 74 46 6c 61 67 73 50 72 6f 70 65 72  c getFlagsProper
10220 74 79 20 7b 20 7b 66 6c 61 67 73 20 22 22 7d 20  ty { {flags ""} 
10230 7b 71 75 69 65 74 20 66 61 6c 73 65 7d 20 7d 20  {quiet false} } 
10240 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  {..      #..    
10250 20 20 23 20 4e 4f 54 45 3a 20 44 65 74 65 72 6d    # NOTE: Determ
10260 69 6e 65 20 77 68 61 74 20 74 68 65 20 63 6f 6d  ine what the com
10270 62 69 6e 65 64 20 28 67 6c 6f 62 61 6c 20 61 6e  bined (global an
10280 64 20 6c 6f 63 61 6c 29 20 63 6f 6e 6e 65 63 74  d local) connect
10290 69 6f 6e 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ion..      #    
102a0 20 20 20 66 6c 61 67 73 20 73 68 6f 75 6c 64 20     flags should 
102b0 62 65 2c 20 70 6f 73 73 69 62 6c 79 20 71 75 69  be, possibly qui
102c0 65 74 6c 79 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  etly...      #..
102d0 20 20 20 20 20 20 73 65 74 20 66 6c 61 67 73 20        set flags 
102e0 5b 67 65 74 43 6f 6e 6e 65 63 74 69 6f 6e 46 6c  [getConnectionFl
102f0 61 67 73 20 22 22 20 24 66 6c 61 67 73 20 24 71  ags "" $flags $q
10300 75 69 65 74 5d 0d 0a 0d 0a 20 20 20 20 20 20 23  uiet]....      #
10310 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
10320 49 66 20 6e 6f 20 67 6c 6f 62 61 6c 20 6f 72 20  If no global or 
10330 6c 6f 63 61 6c 20 63 6f 6e 6e 65 63 74 69 6f 6e  local connection
10340 20 66 6c 61 67 73 20 77 65 72 65 20 73 70 65 63   flags were spec
10350 69 66 69 65 64 2c 20 74 68 65 0d 0a 20 20 20 20  ified, the..    
10360 20 20 23 20 20 20 20 20 20 20 64 65 66 61 75 6c    #       defaul
10370 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 6c 61  t connection fla
10380 67 73 20 73 68 6f 75 6c 64 20 62 65 20 75 73 65  gs should be use
10390 64 3b 20 74 68 65 72 65 66 6f 72 65 2c 20 72 65  d; therefore, re
103a0 74 75 72 6e 0d 0a 20 20 20 20 20 20 23 20 20 20  turn..      #   
103b0 20 20 20 20 61 6e 20 65 6d 70 74 79 20 73 74 72      an empty str
103c0 69 6e 67 20 69 6e 20 74 68 61 74 20 63 61 73 65  ing in that case
103d0 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
103e0 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65    if {[string le
103f0 6e 67 74 68 20 24 66 6c 61 67 73 5d 20 3d 3d 20  ngth $flags] == 
10400 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
10410 20 20 20 72 65 74 75 72 6e 20 22 22 0d 0a 20 20     return ""..  
10420 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23      }....      #
10430 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
10440 49 6e 20 6f 72 64 65 72 20 74 6f 20 63 68 65 63  In order to chec
10450 6b 20 69 66 20 74 68 65 20 64 65 66 61 75 6c 74  k if the default
10460 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 6c 61 67   connection flag
10470 73 20 61 72 65 20 62 65 69 6e 67 20 75 73 65 64  s are being used
10480 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
10490 69 74 20 69 73 20 6e 65 63 65 73 73 61 72 79 20  it is necessary 
104a0 74 6f 20 61 74 74 65 6d 70 74 20 61 20 63 6f 6e  to attempt a con
104b0 76 65 72 73 69 6f 6e 20 74 6f 20 74 68 65 20 61  version to the a
104c0 63 74 75 61 6c 20 65 6e 75 6d 65 72 61 74 65 64  ctual enumerated
104d0 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
104e0 74 79 70 65 2e 20 20 46 61 69 6c 69 6e 67 20 74  type.  Failing t
104f0 68 61 74 2c 20 74 68 65 20 63 68 65 63 6b 20 61  hat, the check a
10500 67 61 69 6e 73 74 20 74 68 65 20 64 65 66 61 75  gainst the defau
10510 6c 74 20 76 61 6c 75 65 20 77 69 6c 6c 20 62 65  lt value will be
10520 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
10530 73 6b 69 70 70 65 64 2e 0d 0a 20 20 20 20 20 20  skipped...      
10540 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 63 61  #..      if {[ca
10550 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 73  tch {..        s
10560 65 74 20 65 72 72 6f 72 20 6e 75 6c 6c 3b 20 23  et error null; #
10570 20 49 47 4e 4f 52 45 44 0d 0a 0d 0a 20 20 20 20   IGNORED....    
10580 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b      object invok
10590 65 20 55 74 69 6c 69 74 79 20 54 72 79 50 61 72  e Utility TryPar
105a0 73 65 46 6c 61 67 73 45 6e 75 6d 20 22 22 20 5c  seFlagsEnum "" \
105b0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 53 79  ..            Sy
105c0 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
105d0 2e 53 51 4c 69 74 65 43 6f 6e 6e 65 63 74 69 6f  .SQLiteConnectio
105e0 6e 46 6c 61 67 73 20 22 22 20 24 66 6c 61 67 73  nFlags "" $flags
105f0 20 6e 75 6c 6c 20 74 72 75 65 20 5c 0d 0a 20 20   null true \..  
10600 20 20 20 20 20 20 20 20 20 20 74 72 75 65 20 65            true e
10610 72 72 6f 72 0d 0a 20 20 20 20 20 20 7d 20 76 61  rror..      } va
10620 6c 75 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  lue]} then {..  
10630 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
10640 20 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74   # NOTE: Attempt
10650 69 6e 67 20 74 6f 20 70 61 72 73 65 20 74 68 65  ing to parse the
10660 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 6c 61 67   connection flag
10670 73 20 63 61 75 73 65 64 20 61 20 73 63 72 69 70  s caused a scrip
10680 74 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  t..        #    
10690 20 20 20 65 72 72 6f 72 2e 20 20 45 6d 69 74 20     error.  Emit 
106a0 61 20 77 61 72 6e 69 6e 67 20 74 6f 20 74 68 65  a warning to the
106b0 20 74 65 73 74 20 6c 6f 67 20 66 69 6c 65 20 61   test log file a
106c0 6e 64 20 63 6f 6e 74 69 6e 75 65 0d 0a 20 20 20  nd continue..   
106d0 20 20 20 20 20 23 20 20 20 20 20 20 20 75 73 69       #       usi
106e0 6e 67 20 61 6e 20 65 6d 74 70 79 20 73 74 72 69  ng an emtpy stri
106f0 6e 67 20 69 6e 73 74 65 61 64 2e 0d 0a 20 20 20  ng instead...   
10700 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
10710 74 6c 6f 67 20 5b 61 70 70 65 6e 64 41 72 67 73  tlog [appendArgs
10720 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
10730 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66  "==== WARNING: f
10740 61 69 6c 65 64 20 74 6f 20 70 61 72 73 65 20 63  ailed to parse c
10750 6f 6e 6e 65 63 74 69 6f 6e 20 66 6c 61 67 73 2c  onnection flags,
10760 20 65 72 72 6f 72 3a 20 22 20 5c 0d 0a 20 20 20   error: " \..   
10770 20 20 20 20 20 20 20 20 20 5c 6e 5c 74 20 24 76           \n\t $v
10780 61 6c 75 65 20 5c 6e 5d 0d 0a 0d 0a 20 20 20 20  alue \n]....    
10790 20 20 20 20 73 65 74 20 76 61 6c 75 65 20 22 22      set value ""
107a0 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
107b0 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
107c0 54 45 3a 20 49 66 20 74 68 65 20 63 6f 6d 62 69  TE: If the combi
107d0 6e 65 64 20 66 6c 61 67 73 20 73 74 72 69 6e 67  ned flags string
107e0 20 63 6f 75 6c 64 20 6e 6f 74 20 61 63 74 75 61   could not actua
107f0 6c 6c 79 20 62 65 20 63 6f 6e 76 65 72 74 65 64  lly be converted
10800 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
10810 74 6f 20 74 68 65 20 65 6e 75 6d 65 72 61 74 65  to the enumerate
10820 64 20 74 79 70 65 20 69 74 20 69 73 20 74 68 65  d type it is the
10830 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 2c 20   default value, 
10840 74 68 65 6e 20 6a 75 73 74 20 75 73 65 0d 0a 20  then just use.. 
10850 20 20 20 20 20 23 20 20 20 20 20 20 20 69 74 20       #       it 
10860 76 65 72 62 61 74 69 6d 3b 20 6f 74 68 65 72 77  verbatim; otherw
10870 69 73 65 2c 20 6a 75 73 74 20 72 65 74 75 72 6e  ise, just return
10880 20 61 6e 20 65 6d 70 74 79 20 73 74 72 69 6e 67   an empty string
10890 2e 20 20 49 6e 20 74 68 61 74 0d 0a 20 20 20 20  .  In that..    
108a0 20 20 23 20 20 20 20 20 20 20 63 61 73 65 2c 20    #       case, 
108b0 74 68 65 20 64 65 66 61 75 6c 74 20 63 6f 6e 6e  the default conn
108c0 65 63 74 69 6f 6e 20 66 6c 61 67 73 20 77 69 6c  ection flags wil
108d0 6c 20 62 65 20 75 73 65 64 2e 0d 0a 20 20 20 20  l be used...    
108e0 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b    #..      if {[
108f0 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 76  string length $v
10900 61 6c 75 65 5d 20 3d 3d 20 30 20 7c 7c 20 24 76  alue] == 0 || $v
10910 61 6c 75 65 20 6e 65 20 22 44 65 66 61 75 6c 74  alue ne "Default
10920 22 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  "} then {..     
10930 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
10940 57 41 52 4e 49 4e 47 3a 20 54 68 69 73 20 72 65  WARNING: This re
10950 74 75 72 6e 73 20 74 68 65 20 73 74 72 69 6e 67  turns the string
10960 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 63 6f   value of the co
10970 6d 62 69 6e 65 64 20 66 6c 61 67 73 2c 20 6e 6f  mbined flags, no
10980 74 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  t..        #    
10990 20 20 20 20 20 20 74 68 65 20 65 6e 75 6d 65 72        the enumer
109a0 61 74 65 64 20 76 61 6c 75 65 2e 20 20 54 68 69  ated value.  Thi
109b0 73 20 69 73 20 62 79 20 64 65 73 69 67 6e 20 61  s is by design a
109c0 6e 64 20 73 68 6f 75 6c 64 20 6e 6f 74 0d 0a 20  nd should not.. 
109d0 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 20         #        
109e0 20 20 62 65 20 63 68 61 6e 67 65 64 20 77 69 74    be changed wit
109f0 68 6f 75 74 20 63 61 72 65 66 75 6c 20 63 6f 6e  hout careful con
10a00 73 69 64 65 72 61 74 69 6f 6e 20 28 65 2e 67 2e  sideration (e.g.
10a10 20 69 74 20 77 6f 75 6c 64 0d 0a 20 20 20 20 20   it would..     
10a20 20 20 20 23 20 20 20 20 20 20 20 20 20 20 70 72     #          pr
10a30 65 76 65 6e 74 20 74 68 65 20 53 51 4c 69 74 65  event the SQLite
10a40 43 6f 6e 6e 65 63 74 69 6f 6e 20 63 6c 61 73 73  Connection class
10a50 20 66 72 6f 6d 20 61 6c 6c 6f 77 69 6e 67 20 69   from allowing i
10a60 6e 76 61 6c 69 64 0d 0a 20 20 20 20 20 20 20 20  nvalid..        
10a70 23 20 20 20 20 20 20 20 20 20 20 5b 22 6d 61 67  #          ["mag
10a80 69 63 61 6c 22 5d 20 6d 65 74 61 2d 66 6c 61 67  ical"] meta-flag
10a90 73 29 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  s)...        #..
10aa0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b          return [
10ab0 61 70 70 65 6e 64 41 72 67 73 20 22 46 6c 61 67  appendArgs "Flag
10ac0 73 3d 22 20 24 66 6c 61 67 73 20 5c 3b 5d 0d 0a  s=" $flags \;]..
10ad0 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
10ae0 20 72 65 74 75 72 6e 20 22 22 0d 0a 20 20 20 20   return ""..    
10af0 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 65  }.....    proc e
10b00 6e 61 62 6c 65 53 68 61 72 65 64 43 61 63 68 65  nableSharedCache
10b10 20 7b 20 63 68 61 6e 6e 65 6c 20 65 6e 61 62 6c   { channel enabl
10b20 65 20 7b 71 75 69 65 74 20 66 61 6c 73 65 7d 20  e {quiet false} 
10b30 7d 20 7b 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b  } {..      if {[
10b40 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20  catch {..       
10b50 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d   object invoke -
10b60 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63  flags +NonPublic
10b70 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
10b80 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
10b90 74 65 2e 55 6e 73 61 66 65 4e 61 74 69 76 65 4d  te.UnsafeNativeM
10ba0 65 74 68 6f 64 73 20 5c 0d 0a 20 20 20 20 20 20  ethods \..      
10bb0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 65 6e        sqlite3_en
10bc0 61 62 6c 65 5f 73 68 61 72 65 64 5f 63 61 63 68  able_shared_cach
10bd0 65 20 5b 65 78 70 72 20 69 6e 74 28 24 65 6e 61  e [expr int($ena
10be0 62 6c 65 29 5d 0d 0a 20 20 20 20 20 20 7d 20 72  ble)]..      } r
10bf0 65 73 75 6c 74 5d 20 3d 3d 20 30 7d 20 74 68 65  esult] == 0} the
10c00 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20  n {..        if 
10c10 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b  {!$quiet} then {
10c20 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70 75 74  ..          tput
10c30 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  s $channel [appe
10c40 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
10c50 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 61          "---- ca
10c60 6c 6c 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c  ll sqlite3_enabl
10c70 65 5f 73 68 61 72 65 64 5f 63 61 63 68 65 28 22  e_shared_cache("
10c80 20 24 65 6e 61 62 6c 65 20 5c 0d 0a 20 20 20 20   $enable \..    
10c90 20 20 20 20 20 20 20 20 20 20 22 29 2e 2e 2e 20            ")... 
10ca0 6f 6b 3a 20 22 20 24 72 65 73 75 6c 74 20 5c 6e  ok: " $result \n
10cb0 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  ]..        }..  
10cc0 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
10cd0 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65        if {!$quie
10ce0 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  t} then {..     
10cf0 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
10d00 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
10d10 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
10d20 20 22 2d 2d 2d 2d 20 63 61 6c 6c 20 73 71 6c 69   "---- call sqli
10d30 74 65 33 5f 65 6e 61 62 6c 65 5f 73 68 61 72 65  te3_enable_share
10d40 64 5f 63 61 63 68 65 28 22 20 24 65 6e 61 62 6c  d_cache(" $enabl
10d50 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e \..           
10d60 20 20 20 22 29 2e 2e 2e 20 65 72 72 6f 72 3a 20     ")... error: 
10d70 22 20 5c 6e 5c 74 20 24 72 65 73 75 6c 74 20 5c  " \n\t $result \
10d80 6e 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20  n]..        }.. 
10d90 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c       }..    }...
10da0 0d 0a 20 20 20 20 70 72 6f 63 20 73 65 74 75 70  ..    proc setup
10db0 44 62 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  Db {..          
10dc0 20 20 66 69 6c 65 4e 61 6d 65 20 7b 6d 6f 64 65    fileName {mode
10dd0 20 22 22 7d 20 7b 64 61 74 65 54 69 6d 65 46 6f   ""} {dateTimeFo
10de0 72 6d 61 74 20 22 22 7d 20 7b 64 61 74 65 54 69  rmat ""} {dateTi
10df0 6d 65 4b 69 6e 64 20 22 22 7d 20 7b 66 6c 61 67  meKind ""} {flag
10e00 73 20 22 22 7d 0d 0a 20 20 20 20 20 20 20 20 20  s ""}..         
10e10 20 20 20 7b 65 78 74 72 61 20 22 22 7d 20 7b 71     {extra ""} {q
10e20 75 61 6c 69 66 79 20 74 72 75 65 7d 20 7b 64 65  ualify true} {de
10e30 6c 65 74 65 20 74 72 75 65 7d 20 7b 75 72 69 20  lete true} {uri 
10e40 66 61 6c 73 65 7d 0d 0a 20 20 20 20 20 20 20 20  false}..        
10e50 20 20 20 20 7b 74 65 6d 70 6f 72 61 72 79 20 74      {temporary t
10e60 72 75 65 7d 20 7b 76 61 72 4e 61 6d 65 20 64 62  rue} {varName db
10e70 7d 20 7b 71 75 69 65 74 20 66 61 6c 73 65 7d 20  } {quiet false} 
10e80 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  } {..      #..  
10e90 20 20 20 20 23 20 4e 4f 54 45 3a 20 46 69 72 73      # NOTE: Firs
10ea0 74 2c 20 73 65 65 20 69 66 20 6f 75 72 20 63 61  t, see if our ca
10eb0 6c 6c 65 72 20 68 61 73 20 72 65 71 75 65 73 74  ller has request
10ec0 65 64 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  ed an in-memory 
10ed0 64 61 74 61 62 61 73 65 2e 0d 0a 20 20 20 20 20  database...     
10ee0 20 23 0d 0a 20 20 20 20 20 20 73 65 74 20 69 73   #..      set is
10ef0 4d 65 6d 6f 72 79 20 5b 69 73 4d 65 6d 6f 72 79  Memory [isMemory
10f00 44 62 20 24 66 69 6c 65 4e 61 6d 65 5d 0d 0a 0d  Db $fileName]...
10f10 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
10f20 23 20 4e 4f 54 45 3a 20 46 6f 72 20 6e 6f 77 2c  # NOTE: For now,
10f30 20 61 6c 6c 20 74 65 73 74 20 64 61 74 61 62 61   all test databa
10f40 73 65 73 20 75 73 65 64 20 62 79 20 74 68 65 20  ses used by the 
10f50 74 65 73 74 20 73 75 69 74 65 20 61 72 65 20 70  test suite are p
10f60 6c 61 63 65 64 0d 0a 20 20 20 20 20 20 23 20 20  laced..      #  
10f70 20 20 20 20 20 69 6e 74 6f 20 74 68 65 20 64 61       into the da
10f80 74 61 62 61 73 65 20 64 69 72 65 63 74 6f 72 79  tabase directory
10f90 2e 20 20 45 61 63 68 20 64 61 74 61 62 61 73 65  .  Each database
10fa0 20 61 6e 64 20 72 65 6c 61 74 65 64 20 66 69 6c   and related fil
10fb0 65 73 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  es..      #     
10fc0 20 20 75 73 65 64 20 62 79 20 61 20 74 65 73 74    used by a test
10fd0 20 73 68 6f 75 6c 64 20 62 65 20 63 6c 65 61 6e   should be clean
10fe0 65 64 20 75 70 20 62 79 20 74 68 61 74 20 74 65  ed up by that te
10ff0 73 74 20 75 73 69 6e 67 20 74 68 65 0d 0a 20 20  st using the..  
11000 20 20 20 20 23 20 20 20 20 20 20 20 22 63 6c 65      #       "cle
11010 61 6e 75 70 44 62 22 20 70 72 6f 63 65 64 75 72  anupDb" procedur
11020 65 2c 20 62 65 6c 6f 77 2e 0d 0a 20 20 20 20 20  e, below...     
11030 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 21 24   #..      if {!$
11040 69 73 4d 65 6d 6f 72 79 20 26 26 20 24 71 75 61  isMemory && $qua
11050 6c 69 66 79 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  lify} then {..  
11060 20 20 20 20 20 20 73 65 74 20 66 69 6c 65 4e 61        set fileNa
11070 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5b 67  me [file join [g
11080 65 74 44 61 74 61 62 61 73 65 44 69 72 65 63 74  etDatabaseDirect
11090 6f 72 79 5d 20 5b 66 69 6c 65 20 74 61 69 6c 20  ory] [file tail 
110a0 24 66 69 6c 65 4e 61 6d 65 5d 5d 0d 0a 20 20 20  $fileName]]..   
110b0 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d     }....      #.
110c0 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 42  .      # NOTE: B
110d0 79 20 64 65 66 61 75 6c 74 2c 20 64 65 6c 65 74  y default, delet
110e0 65 20 61 6e 79 20 70 72 65 2d 65 78 69 73 74 69  e any pre-existi
110f0 6e 67 20 64 61 74 61 62 61 73 65 20 77 69 74 68  ng database with
11100 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65 0d 0a   the same file..
11110 20 20 20 20 20 20 23 20 20 20 20 20 20 20 6e 61        #       na
11120 6d 65 20 69 66 20 69 74 20 63 75 72 72 65 6e 74  me if it current
11130 6c 79 20 65 78 69 73 74 73 2e 0d 0a 20 20 20 20  ly exists...    
11140 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 21    #..      if {!
11150 24 69 73 4d 65 6d 6f 72 79 20 26 26 20 24 64 65  $isMemory && $de
11160 6c 65 74 65 20 26 26 20 5b 66 69 6c 65 20 65 78  lete && [file ex
11170 69 73 74 73 20 24 66 69 6c 65 4e 61 6d 65 5d 7d  ists $fileName]}
11180 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
11190 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
111a0 54 45 3a 20 41 74 74 65 6d 70 74 20 74 6f 20 64  TE: Attempt to d
111b0 65 6c 65 74 65 20 61 6e 79 20 70 72 65 2d 65 78  elete any pre-ex
111c0 69 73 74 69 6e 67 20 64 61 74 61 62 61 73 65 20  isting database 
111d0 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 66 69  with the same fi
111e0 6c 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  le..        #   
111f0 20 20 20 20 6e 61 6d 65 2e 0d 0a 20 20 20 20 20      name...     
11200 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 69 66     #..        if
11210 20 7b 5b 63 61 74 63 68 20 7b 66 69 6c 65 20 64   {[catch {file d
11220 65 6c 65 74 65 20 24 66 69 6c 65 4e 61 6d 65 7d  elete $fileName}
11230 20 65 72 72 6f 72 5d 7d 20 74 68 65 6e 20 7b 0d   error]} then {.
11240 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
11250 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
11260 57 65 20 73 6f 6d 65 68 6f 77 20 66 61 69 6c 65  We somehow faile
11270 64 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20  d to delete the 
11280 66 69 6c 65 2c 20 72 65 70 6f 72 74 20 77 68 79  file, report why
11290 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a  ...          #..
112a0 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 24            if {!$
112b0 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20  quiet} then {.. 
112c0 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
112d0 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
112e0 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
112f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11300 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66  "==== WARNING: f
11310 61 69 6c 65 64 20 74 6f 20 64 65 6c 65 74 65 20  ailed to delete 
11320 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 5c 22  database file \"
11330 22 20 24 66 69 6c 65 4e 61 6d 65 20 5c 0d 0a 20  " $fileName \.. 
11340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
11350 5c 22 20 64 75 72 69 6e 67 20 73 65 74 75 70 2c  \" during setup,
11360 20 65 72 72 6f 72 3a 20 22 20 5c 6e 5c 74 20 24   error: " \n\t $
11370 65 72 72 6f 72 20 5c 6e 5d 0d 0a 20 20 20 20 20  error \n]..     
11380 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
11390 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  }..      }....  
113a0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
113b0 4f 54 45 3a 20 52 65 66 65 72 20 74 6f 20 74 68  OTE: Refer to th
113c0 65 20 73 70 65 63 69 66 69 65 64 20 76 61 72 69  e specified vari
113d0 61 62 6c 65 20 28 65 2e 67 2e 20 22 64 62 22 29  able (e.g. "db")
113e0 20 69 6e 20 74 68 65 20 63 6f 6e 74 65 78 74 20   in the context 
113f0 6f 66 20 6f 75 72 0d 0a 20 20 20 20 20 20 23 20  of our..      # 
11400 20 20 20 20 20 20 63 61 6c 6c 65 72 2e 20 20 54        caller.  T
11410 68 65 20 68 61 6e 64 6c 65 20 74 6f 20 74 68 65  he handle to the
11420 20 6f 70 65 6e 65 64 20 64 61 74 61 62 61 73 65   opened database
11430 20 77 69 6c 6c 20 62 65 20 73 74 6f 72 65 64 20   will be stored 
11440 74 68 65 72 65 2e 0d 0a 20 20 20 20 20 20 23 0d  there...      #.
11450 0a 20 20 20 20 20 20 75 70 76 61 72 20 31 20 24  .      upvar 1 $
11460 76 61 72 4e 61 6d 65 20 64 62 0d 0a 0d 0a 20 20  varName db....  
11470 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
11480 4f 54 45 3a 20 53 74 61 72 74 20 62 75 69 6c 64  OTE: Start build
11490 69 6e 67 20 74 68 65 20 63 6f 6e 6e 65 63 74 69  ing the connecti
114a0 6f 6e 20 73 74 72 69 6e 67 2e 20 20 54 68 65 20  on string.  The 
114b0 6f 6e 6c 79 20 72 65 71 75 69 72 65 64 20 70 6f  only required po
114c0 72 74 69 6f 6e 0d 0a 20 20 20 20 20 20 23 20 20  rtion..      #  
114d0 20 20 20 20 20 6f 66 20 74 68 65 20 63 6f 6e 6e       of the conn
114e0 65 63 74 69 6f 6e 20 73 74 72 69 6e 67 20 69 73  ection string is
114f0 20 74 68 65 20 64 61 74 61 20 73 6f 75 72 63 65   the data source
11500 2c 20 77 68 69 63 68 20 63 6f 6e 74 61 69 6e 73  , which contains
11510 20 74 68 65 0d 0a 20 20 20 20 20 20 23 20 20 20   the..      #   
11520 20 20 20 20 64 61 74 61 62 61 73 65 20 66 69 6c      database fil
11530 65 20 6e 61 6d 65 20 69 74 73 65 6c 66 2e 20 20  e name itself.  
11540 49 66 20 6f 75 72 20 63 61 6c 6c 65 72 20 77 61  If our caller wa
11550 6e 74 73 20 74 6f 20 75 73 65 20 61 20 55 52 49  nts to use a URI
11560 20 61 73 0d 0a 20 20 20 20 20 20 23 20 20 20 20   as..      #    
11570 20 20 20 74 68 65 20 64 61 74 61 20 73 6f 75 72     the data sour
11580 63 65 2c 20 75 73 65 20 74 68 65 20 46 75 6c 6c  ce, use the Full
11590 55 72 69 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73  Uri connection s
115a0 74 72 69 6e 67 20 70 72 6f 70 65 72 74 79 20 74  tring property t
115b0 6f 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  o..      #      
115c0 20 70 72 65 76 65 6e 74 20 74 68 65 20 64 61 74   prevent the dat
115d0 61 20 73 6f 75 72 63 65 20 73 74 72 69 6e 67 20  a source string 
115e0 66 72 6f 6d 20 62 65 69 6e 67 20 6d 61 6e 67 6c  from being mangl
115f0 65 64 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  ed...      #..  
11600 20 20 20 20 69 66 20 7b 24 75 72 69 7d 20 74 68      if {$uri} th
11610 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 65  en {..        se
11620 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 7b 46 75  t connection {Fu
11630 6c 6c 55 72 69 3d 24 7b 66 69 6c 65 4e 61 6d 65  llUri=${fileName
11640 7d 7d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65  }}..      } else
11650 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20   {..        set 
11660 63 6f 6e 6e 65 63 74 69 6f 6e 20 7b 44 61 74 61  connection {Data
11670 20 53 6f 75 72 63 65 3d 24 7b 66 69 6c 65 4e 61   Source=${fileNa
11680 6d 65 7d 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d  me}}..      }...
11690 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
116a0 23 20 4e 4f 54 45 3a 20 53 69 6e 63 65 20 74 68  # NOTE: Since th
116b0 69 73 20 70 72 6f 63 65 64 75 72 65 20 68 61 73  is procedure has
116c0 20 6e 6f 20 73 70 65 63 69 61 6c 20 6b 6e 6f 77   no special know
116d0 6c 65 64 67 65 20 6f 66 20 77 68 61 74 20 74 68  ledge of what th
116e0 65 20 64 65 66 61 75 6c 74 0d 0a 20 20 20 20 20  e default..     
116f0 20 23 20 20 20 20 20 20 20 73 65 74 74 69 6e 67   #       setting
11700 20 69 73 20 66 6f 72 20 74 68 65 20 54 6f 46 75   is for the ToFu
11710 6c 6c 50 61 74 68 20 63 6f 6e 6e 65 63 74 69 6f  llPath connectio
11720 6e 20 73 74 72 69 6e 67 20 70 72 6f 70 65 72 79  n string propery
11730 2c 20 61 6c 77 61 79 73 0d 0a 20 20 20 20 20 20  , always..      
11740 23 20 20 20 20 20 20 20 61 64 64 20 74 68 65 20  #       add the 
11750 76 61 6c 75 65 20 77 65 20 6b 6e 6f 77 20 61 62  value we know ab
11760 6f 75 74 20 74 6f 20 74 68 65 20 63 6f 6e 6e 65  out to the conne
11770 63 74 69 6f 6e 20 73 74 72 69 6e 67 2e 0d 0a 20  ction string... 
11780 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 61 70       #..      ap
11790 70 65 6e 64 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  pend connection 
117a0 7b 3b 54 6f 46 75 6c 6c 50 61 74 68 3d 24 7b 71  {;ToFullPath=${q
117b0 75 61 6c 69 66 79 7d 7d 0d 0a 0d 0a 20 20 20 20  ualify}}....    
117c0 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
117d0 45 3a 20 49 66 20 6f 75 72 20 63 61 6c 6c 65 72  E: If our caller
117e0 20 73 70 65 63 69 66 69 65 64 20 61 20 6a 6f 75   specified a jou
117f0 72 6e 61 6c 20 6d 6f 64 65 2c 20 61 64 64 20 74  rnal mode, add t
11800 68 65 20 6e 65 63 65 73 73 61 72 79 20 70 6f 72  he necessary por
11810 74 69 6f 6e 0d 0a 20 20 20 20 20 20 23 20 20 20  tion..      #   
11820 20 20 20 20 6f 66 20 74 68 65 20 63 6f 6e 6e 65      of the conne
11830 63 74 69 6f 6e 20 73 74 72 69 6e 67 20 6e 6f 77  ction string now
11840 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
11850 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65    if {[string le
11860 6e 67 74 68 20 24 6d 6f 64 65 5d 20 3e 20 30 7d  ngth $mode] > 0}
11870 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
11880 20 61 70 70 65 6e 64 20 63 6f 6e 6e 65 63 74 69   append connecti
11890 6f 6e 20 7b 3b 4a 6f 75 72 6e 61 6c 20 4d 6f 64  on {;Journal Mod
118a0 65 3d 24 7b 6d 6f 64 65 7d 7d 0d 0a 20 20 20 20  e=${mode}}..    
118b0 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a    }....      #..
118c0 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 66        # NOTE: If
118d0 20 6f 75 72 20 63 61 6c 6c 65 72 20 73 70 65 63   our caller spec
118e0 69 66 69 65 64 20 61 20 44 61 74 65 54 69 6d 65  ified a DateTime
118f0 20 66 6f 72 6d 61 74 2c 20 61 64 64 20 74 68 65   format, add the
11900 20 6e 65 63 65 73 73 61 72 79 0d 0a 20 20 20 20   necessary..    
11910 20 20 23 20 20 20 20 20 20 20 70 6f 72 74 69 6f    #       portio
11920 6e 20 6f 66 20 74 68 65 20 63 6f 6e 6e 65 63 74  n of the connect
11930 69 6f 6e 20 73 74 72 69 6e 67 20 6e 6f 77 2e 0d  ion string now..
11940 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
11950 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67  if {[string leng
11960 74 68 20 24 64 61 74 65 54 69 6d 65 46 6f 72 6d  th $dateTimeForm
11970 61 74 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d  at] > 0} then {.
11980 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 20  .        append 
11990 63 6f 6e 6e 65 63 74 69 6f 6e 20 7b 3b 44 61 74  connection {;Dat
119a0 65 54 69 6d 65 46 6f 72 6d 61 74 3d 24 7b 64 61  eTimeFormat=${da
119b0 74 65 54 69 6d 65 46 6f 72 6d 61 74 7d 7d 0d 0a  teTimeFormat}}..
119c0 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
119d0 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
119e0 3a 20 49 66 20 6f 75 72 20 63 61 6c 6c 65 72 20  : If our caller 
119f0 73 70 65 63 69 66 69 65 64 20 61 20 44 61 74 65  specified a Date
11a00 54 69 6d 65 4b 69 6e 64 2c 20 61 64 64 20 74 68  TimeKind, add th
11a10 65 20 6e 65 63 65 73 73 61 72 79 20 70 6f 72 74  e necessary port
11a20 69 6f 6e 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ion..      #    
11a30 20 20 20 6f 66 20 74 68 65 20 63 6f 6e 6e 65 63     of the connec
11a40 74 69 6f 6e 20 73 74 72 69 6e 67 20 6e 6f 77 2e  tion string now.
11a50 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
11a60 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e   if {[string len
11a70 67 74 68 20 24 64 61 74 65 54 69 6d 65 4b 69 6e  gth $dateTimeKin
11a80 64 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  d] > 0} then {..
11a90 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 20 63          append c
11aa0 6f 6e 6e 65 63 74 69 6f 6e 20 7b 3b 44 61 74 65  onnection {;Date
11ab0 54 69 6d 65 4b 69 6e 64 3d 24 7b 64 61 74 65 54  TimeKind=${dateT
11ac0 69 6d 65 4b 69 6e 64 7d 7d 0d 0a 20 20 20 20 20  imeKind}}..     
11ad0 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20   }....      #.. 
11ae0 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 46 69 67       # NOTE: Fig
11af0 75 72 65 20 6f 75 74 20 77 68 61 74 20 74 68 65  ure out what the
11b00 20 66 69 6e 61 6c 20 66 6c 61 67 73 20 66 6f 72   final flags for
11b10 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e   this connection
11b20 20 6e 65 65 64 20 74 6f 20 62 65 2e 0d 0a 20 20   need to be...  
11b30 20 20 20 20 23 0d 0a 20 20 20 20 20 20 73 65 74      #..      set
11b40 20 66 6c 61 67 73 20 5b 67 65 74 43 6f 6e 6e 65   flags [getConne
11b50 63 74 69 6f 6e 46 6c 61 67 73 20 24 66 69 6c 65  ctionFlags $file
11b60 4e 61 6d 65 20 24 66 6c 61 67 73 20 24 71 75 69  Name $flags $qui
11b70 65 74 5d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a  et]....      #..
11b80 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 66        # NOTE: If
11b90 20 6f 75 72 20 63 61 6c 6c 65 72 20 73 70 65 63   our caller spec
11ba0 69 66 69 65 64 20 73 6f 6d 65 20 53 51 4c 69 74  ified some SQLit
11bb0 65 43 6f 6e 6e 65 63 74 69 6f 6e 46 6c 61 67 73  eConnectionFlags
11bc0 2c 20 61 64 64 20 74 68 65 0d 0a 20 20 20 20 20  , add the..     
11bd0 20 23 20 20 20 20 20 20 20 6e 65 63 65 73 73 61   #       necessa
11be0 72 79 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68  ry portion of th
11bf0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 74 72  e connection str
11c00 69 6e 67 20 6e 6f 77 2e 0d 0a 20 20 20 20 20 20  ing now...      
11c10 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 73 74  #..      if {[st
11c20 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 66 6c 61  ring length $fla
11c30 67 73 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d  gs] > 0} then {.
11c40 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 20  .        append 
11c50 63 6f 6e 6e 65 63 74 69 6f 6e 20 7b 3b 46 6c 61  connection {;Fla
11c60 67 73 3d 24 7b 66 6c 61 67 73 7d 7d 0d 0a 20 20  gs=${flags}}..  
11c70 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23      }....      #
11c80 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
11c90 49 66 20 6f 75 72 20 63 61 6c 6c 65 72 20 73 70  If our caller sp
11ca0 65 63 69 66 69 65 64 20 61 6e 20 65 78 74 72 61  ecified an extra
11cb0 20 70 61 79 6c 6f 61 64 20 74 6f 20 74 68 65 20   payload to the 
11cc0 63 6f 6e 6e 65 63 74 69 6f 6e 0d 0a 20 20 20 20  connection..    
11cd0 20 20 23 20 20 20 20 20 20 20 73 74 72 69 6e 67    #       string
11ce0 2c 20 61 70 70 65 6e 64 20 69 74 20 6e 6f 77 2e  , append it now.
11cf0 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
11d00 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e   if {[string len
11d10 67 74 68 20 24 65 78 74 72 61 5d 20 3e 20 30 7d  gth $extra] > 0}
11d20 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
11d30 20 61 70 70 65 6e 64 20 63 6f 6e 6e 65 63 74 69   append connecti
11d40 6f 6e 20 5c 3b 20 24 65 78 74 72 61 0d 0a 20 20  on \; $extra..  
11d50 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23      }....      #
11d60 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
11d70 4f 70 65 6e 20 74 68 65 20 64 61 74 61 62 61 73  Open the databas
11d80 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6e 6f 77  e connection now
11d90 2c 20 70 6c 61 63 69 6e 67 20 74 68 65 20 6f 70  , placing the op
11da0 61 71 75 65 20 68 61 6e 64 6c 65 20 76 61 6c 75  aque handle valu
11db0 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  e..      #      
11dc0 20 69 6e 74 6f 20 74 68 65 20 76 61 72 69 61 62   into the variab
11dd0 6c 65 20 73 70 65 63 69 66 69 65 64 20 62 79 20  le specified by 
11de0 6f 75 72 20 63 61 6c 6c 65 72 2e 0d 0a 20 20 20  our caller...   
11df0 20 20 20 23 0d 0a 20 20 20 20 20 20 73 65 74 20     #..      set 
11e00 64 62 20 5b 73 71 6c 20 6f 70 65 6e 20 2d 74 79  db [sql open -ty
11e10 70 65 20 53 51 4c 69 74 65 20 5b 73 75 62 73 74  pe SQLite [subst
11e20 20 24 63 6f 6e 6e 65 63 74 69 6f 6e 5d 5d 0d 0a   $connection]]..
11e30 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
11e40 20 23 20 4e 4f 54 45 3a 20 43 6f 6e 66 69 67 75   # NOTE: Configu
11e50 72 65 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  re the temporary
11e60 20 64 69 72 65 63 74 6f 72 79 20 66 6f 72 20 74   directory for t
11e70 68 65 20 6e 65 77 6c 79 20 6f 70 65 6e 65 64 20  he newly opened 
11e80 64 61 74 61 62 61 73 65 0d 0a 20 20 20 20 20 20  database..      
11e90 23 20 20 20 20 20 20 20 63 6f 6e 6e 65 63 74 69  #       connecti
11ea0 6f 6e 20 6e 6f 77 20 75 6e 6c 65 73 73 20 6f 75  on now unless ou
11eb0 72 20 63 61 6c 6c 65 72 20 66 6f 72 62 69 64 73  r caller forbids
11ec0 20 69 74 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20   it...      #.. 
11ed0 20 20 20 20 20 69 66 20 7b 24 74 65 6d 70 6f 72       if {$tempor
11ee0 61 72 79 20 26 26 20 21 5b 69 6e 66 6f 20 65 78  ary && ![info ex
11ef0 69 73 74 73 20 3a 3a 6e 6f 28 73 65 74 54 65 6d  ists ::no(setTem
11f00 70 6f 72 61 72 79 44 69 72 65 63 74 6f 72 79 29  poraryDirectory)
11f10 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
11f20 20 20 20 73 71 6c 20 65 78 65 63 75 74 65 20 24     sql execute $
11f30 64 62 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  db [appendArgs \
11f40 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 50  ..            "P
11f50 52 41 47 4d 41 20 74 65 6d 70 5f 73 74 6f 72 65  RAGMA temp_store
11f60 5f 64 69 72 65 63 74 6f 72 79 20 3d 20 5c 22 22  _directory = \""
11f70 20 5b 67 65 74 54 65 6d 70 6f 72 61 72 79 44 69   [getTemporaryDi
11f80 72 65 63 74 6f 72 79 5d 20 5c 22 5c 3b 5d 0d 0a  rectory] \"\;]..
11f90 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
11fa0 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
11fb0 3a 20 50 65 72 66 6f 72 6d 20 61 6e 79 20 65 78  : Perform any ex
11fc0 74 72 61 20 70 65 72 2d 63 6f 6e 6e 65 63 74 69  tra per-connecti
11fd0 6f 6e 20 73 65 74 75 70 20 66 6f 72 20 74 68 65  on setup for the
11fe0 20 6e 65 77 6c 79 20 6f 70 65 6e 65 64 0d 0a 20   newly opened.. 
11ff0 20 20 20 20 20 23 20 20 20 20 20 20 20 64 61 74       #       dat
12000 61 62 61 73 65 20 6e 6f 77 20 75 6e 6c 65 73 73  abase now unless
12010 20 6f 75 72 20 63 61 6c 6c 65 72 20 66 6f 72 62   our caller forb
12020 69 64 73 20 69 74 2e 0d 0a 20 20 20 20 20 20 23  ids it...      #
12030 0d 0a 20 20 20 20 20 20 73 65 74 20 65 78 65 63  ..      set exec
12040 75 74 65 4f 6e 53 65 74 75 70 20 5b 67 65 74 45  uteOnSetup [getE
12050 78 65 63 75 74 65 4f 6e 53 65 74 75 70 5d 0d 0a  xecuteOnSetup]..
12060 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72  ..      if {[str
12070 69 6e 67 20 6c 65 6e 67 74 68 20 24 65 78 65 63  ing length $exec
12080 75 74 65 4f 6e 53 65 74 75 70 5d 20 3e 20 30 20  uteOnSetup] > 0 
12090 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  && \..          
120a0 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  ![info exists ::
120b0 6e 6f 28 65 78 65 63 75 74 65 4f 6e 53 65 74 75  no(executeOnSetu
120c0 70 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  p)]} then {..   
120d0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
120e0 23 20 4e 4f 54 45 3a 20 54 68 69 73 20 63 6f 6d  # NOTE: This com
120f0 6d 61 6e 64 20 6d 61 79 20 72 61 69 73 65 20 61  mand may raise a
12100 6e 20 65 72 72 6f 72 3b 20 69 66 20 73 6f 2c 20  n error; if so, 
12110 74 68 61 74 20 69 73 20 66 69 6e 65 2c 20 61 73  that is fine, as
12120 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
12130 20 20 74 68 65 20 65 6e 63 6c 6f 73 69 6e 67 20    the enclosing 
12140 74 65 73 74 20 77 69 6c 6c 20 74 68 65 6e 20 66  test will then f
12150 61 69 6c 2e 20 20 54 68 65 20 5b 73 75 62 73 74  ail.  The [subst
12160 5d 20 63 6f 6d 6d 61 6e 64 20 69 73 0d 0a 20 20  ] command is..  
12170 20 20 20 20 20 20 23 20 20 20 20 20 20 20 75 73        #       us
12180 65 64 20 6f 6e 20 74 68 65 20 53 51 4c 20 69 6e  ed on the SQL in
12190 20 63 61 73 65 20 69 74 20 6e 65 65 64 73 20 74   case it needs t
121a0 6f 20 72 65 66 65 72 20 74 6f 20 73 74 61 74 65  o refer to state
121b0 20 69 6e 20 6f 75 72 0d 0a 20 20 20 20 20 20 20   in our..       
121c0 20 23 20 20 20 20 20 20 20 63 6f 6e 74 65 78 74   #       context
121d0 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
121e0 20 20 20 20 20 20 73 71 6c 20 65 78 65 63 75 74        sql execut
121f0 65 20 24 64 62 20 5b 73 75 62 73 74 20 24 65 78  e $db [subst $ex
12200 65 63 75 74 65 4f 6e 53 65 74 75 70 5d 0d 0a 20  ecuteOnSetup].. 
12210 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
12220 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
12230 20 41 6c 77 61 79 73 20 72 65 74 75 72 6e 20 74   Always return t
12240 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61  he connection ha
12250 6e 64 6c 65 20 75 70 6f 6e 20 73 75 63 63 65 73  ndle upon succes
12260 73 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  s...      #..   
12270 20 20 20 72 65 74 75 72 6e 20 24 64 62 0d 0a 20     return $db.. 
12280 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
12290 63 20 67 65 74 44 62 43 6f 6e 6e 65 63 74 69 6f  c getDbConnectio
122a0 6e 20 7b 20 7b 76 61 72 4e 61 6d 65 20 64 62 7d  n { {varName db}
122b0 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20   } {..      #.. 
122c0 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 52 65 66       # NOTE: Ref
122d0 65 72 20 74 6f 20 74 68 65 20 73 70 65 63 69 66  er to the specif
122e0 69 65 64 20 76 61 72 69 61 62 6c 65 20 28 65 2e  ied variable (e.
122f0 67 2e 20 22 64 62 22 29 20 69 6e 20 74 68 65 20  g. "db") in the 
12300 63 6f 6e 74 65 78 74 20 6f 66 20 6f 75 72 0d 0a  context of our..
12310 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63 61        #       ca
12320 6c 6c 65 72 2e 20 20 54 68 65 20 68 61 6e 64 6c  ller.  The handl
12330 65 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  e to the databas
12340 65 20 70 72 65 76 69 6f 75 73 6c 79 20 6f 70 65  e previously ope
12350 6e 65 64 20 76 69 61 20 74 68 65 0d 0a 20 20 20  ned via the..   
12360 20 20 20 23 20 20 20 20 20 20 20 5b 73 65 74 75     #       [setu
12370 70 44 62 5d 20 70 72 6f 63 65 64 75 72 65 20 73  pDb] procedure s
12380 68 6f 75 6c 64 20 62 65 20 73 74 6f 72 65 64 20  hould be stored 
12390 74 68 65 72 65 2e 0d 0a 20 20 20 20 20 20 23 0d  there...      #.
123a0 0a 20 20 20 20 20 20 75 70 76 61 72 20 31 20 24  .      upvar 1 $
123b0 76 61 72 4e 61 6d 65 20 64 62 0d 0a 0d 0a 20 20  varName db....  
123c0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
123d0 4f 54 45 3a 20 54 68 69 73 20 72 65 74 75 72 6e  OTE: This return
123e0 73 20 74 68 65 20 41 44 4f 2e 4e 45 54 20 49 44  s the ADO.NET ID
123f0 62 43 6f 6e 6e 65 63 74 69 6f 6e 20 6f 62 6a 65  bConnection obje
12400 63 74 20 69 6e 73 74 61 6e 63 65 20 66 6f 72 20  ct instance for 
12410 74 68 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20  the..      #    
12420 20 20 20 73 70 65 63 69 66 69 65 64 20 64 61 74     specified dat
12430 61 62 73 65 20 68 61 6e 64 6c 65 2e 20 20 53 69  abse handle.  Si
12440 6e 63 65 20 67 65 74 74 69 6e 67 20 74 68 69 73  nce getting this
12450 20 6f 62 6a 65 63 74 20 72 65 6c 69 65 73 20 75   object relies u
12460 70 6f 6e 0d 0a 20 20 20 20 20 20 23 20 20 20 20  pon..      #    
12470 20 20 20 45 61 67 6c 65 20 69 6e 74 65 72 6e 61     Eagle interna
12480 6c 73 2c 20 67 72 65 61 74 20 63 61 72 65 20 73  ls, great care s
12490 68 6f 75 6c 64 20 62 65 20 74 61 6b 65 6e 20 74  hould be taken t
124a0 6f 20 61 76 6f 69 64 20 64 69 73 70 6f 73 69 6e  o avoid disposin
124b0 67 20 6f 66 0d 0a 20 20 20 20 20 20 23 20 20 20  g of..      #   
124c0 20 20 20 20 74 68 69 73 20 6f 62 6a 65 63 74 20      this object 
124d0 6f 72 20 6f 74 68 65 72 77 69 73 65 20 70 75 74  or otherwise put
124e0 74 69 6e 67 20 69 74 20 69 6e 74 6f 20 61 6e 20  ting it into an 
124f0 69 6e 76 61 6c 69 64 20 73 74 61 74 65 2e 0d 0a  invalid state...
12500 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69        #..      i
12510 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20  f {[info exists 
12520 64 62 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  db]} then {..   
12530 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20       if {[catch 
12540 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 6f 62 6a  {..          obj
12550 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67  ect invoke -flag
12560 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 2d 6f 62  s +NonPublic -ob
12570 6a 65 63 74 66 6c 61 67 73 20 2b 4e 6f 44 69 73  jectflags +NoDis
12580 70 6f 73 65 20 2d 61 6c 69 61 73 20 5c 0d 0a 20  pose -alias \.. 
12590 20 20 20 20 20 20 20 20 20 20 20 20 20 49 6e 74               Int
125a0 65 72 70 72 65 74 65 72 2e 47 65 74 41 63 74 69  erpreter.GetActi
125b0 76 65 2e 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 49  ve.connections I
125c0 74 65 6d 20 24 64 62 0d 0a 20 20 20 20 20 20 20  tem $db..       
125d0 20 7d 20 72 65 73 75 6c 74 5d 20 3d 3d 20 30 7d   } result] == 0}
125e0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
125f0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
12600 23 20 4e 4f 54 45 3a 20 53 75 63 63 65 73 73 2c  # NOTE: Success,
12610 20 72 65 74 75 72 6e 20 74 68 65 20 6f 70 61 71   return the opaq
12620 75 65 20 6f 62 6a 65 63 74 20 68 61 6e 64 6c 65  ue object handle
12630 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a  ...          #..
12640 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
12650 20 24 72 65 73 75 6c 74 0d 0a 20 20 20 20 20 20   $result..      
12660 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
12670 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
12680 20 20 20 23 20 4e 4f 54 45 3a 20 46 61 69 6c 75     # NOTE: Failu
12690 72 65 2c 20 72 65 70 6f 72 74 20 77 68 79 2e 0d  re, report why..
126a0 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
126b0 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
126c0 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61  :test_channel [a
126d0 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
126e0 20 20 20 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d             "====
126f0 20 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64   WARNING: failed
12700 20 74 6f 20 67 65 74 20 63 6f 6e 6e 65 63 74 69   to get connecti
12710 6f 6e 20 68 61 6e 64 6c 65 20 66 6f 72 20 64 61  on handle for da
12720 74 61 62 61 73 65 20 5c 22 22 20 5c 0d 0a 20 20  tabase \"" \..  
12730 20 20 20 20 20 20 20 20 20 20 20 20 24 64 62 20              $db 
12740 22 5c 22 2c 20 65 72 72 6f 72 3a 20 22 20 5c 6e  "\", error: " \n
12750 5c 74 20 24 72 65 73 75 6c 74 20 5c 6e 5d 0d 0a  \t $result \n]..
12760 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
12770 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20   }....      #.. 
12780 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 46 61 69       # NOTE: Fai
12790 6c 75 72 65 2c 20 72 65 74 75 72 6e 20 61 6e 20  lure, return an 
127a0 6f 62 76 69 6f 75 73 6c 79 20 69 6e 76 61 6c 69  obviously invali
127b0 64 20 6f 70 61 71 75 65 20 6f 62 6a 65 63 74 20  d opaque object 
127c0 68 61 6e 64 6c 65 2e 0d 0a 20 20 20 20 20 20 23  handle...      #
127d0 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 22  ..      return "
127e0 22 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  "..    }.....   
127f0 20 70 72 6f 63 20 66 72 65 65 44 62 43 6f 6e 6e   proc freeDbConn
12800 65 63 74 69 6f 6e 20 7b 20 7b 76 61 72 4e 61 6d  ection { {varNam
12810 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 7d 20 7d 20  e connection} } 
12820 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  {..      #..    
12830 20 20 23 20 4e 4f 54 45 3a 20 52 65 66 65 72 20    # NOTE: Refer 
12840 74 6f 20 74 68 65 20 73 70 65 63 69 66 69 65 64  to the specified
12850 20 76 61 72 69 61 62 6c 65 20 28 65 2e 67 2e 20   variable (e.g. 
12860 22 63 6f 6e 6e 65 63 74 69 6f 6e 22 29 20 69 6e  "connection") in
12870 20 74 68 65 0d 0a 20 20 20 20 20 20 23 20 20 20   the..      #   
12880 20 20 20 20 63 6f 6e 74 65 78 74 20 6f 66 20 6f      context of o
12890 75 72 20 63 61 6c 6c 65 72 2e 20 20 54 68 65 20  ur caller.  The 
128a0 6f 70 61 71 75 65 20 6f 62 6a 65 63 74 20 68 61  opaque object ha
128b0 6e 64 6c 65 20 66 6f 72 20 61 6e 20 41 44 4f 2e  ndle for an ADO.
128c0 4e 45 54 0d 0a 20 20 20 20 20 20 23 20 20 20 20  NET..      #    
128d0 20 20 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 72     connection pr
128e0 65 76 69 6f 75 73 6c 79 20 72 65 74 75 72 6e 65  eviously returne
128f0 64 20 62 79 20 5b 67 65 74 44 62 43 6f 6e 6e 65  d by [getDbConne
12900 63 74 69 6f 6e 5d 20 73 68 6f 75 6c 64 20 62 65  ction] should be
12910 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
12920 73 74 6f 72 65 64 20 74 68 65 72 65 2e 0d 0a 20  stored there... 
12930 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 75 70       #..      up
12940 76 61 72 20 31 20 24 76 61 72 4e 61 6d 65 20 63  var 1 $varName c
12950 6f 6e 6e 65 63 74 69 6f 6e 0d 0a 0d 0a 20 20 20  onnection....   
12960 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
12970 54 45 3a 20 41 74 74 65 6d 70 74 20 74 6f 20 72  TE: Attempt to r
12980 65 6d 6f 76 65 20 74 68 65 20 6f 70 61 71 75 65  emove the opaque
12990 20 6f 62 6a 65 63 74 20 68 61 6e 64 6c 65 20 66   object handle f
129a0 72 6f 6d 20 74 68 65 20 69 6e 74 65 72 70 72 65  rom the interpre
129b0 74 65 72 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ter..      #    
129c0 20 20 20 6e 6f 77 2e 20 20 54 68 69 73 20 5b 6f     now.  This [o
129d0 62 6a 65 63 74 20 64 69 73 70 6f 73 65 5d 20 63  bject dispose] c
129e0 61 6c 6c 20 77 69 6c 6c 20 6e 6f 74 20 61 63 74  all will not act
129f0 75 61 6c 6c 79 20 64 69 73 70 6f 73 65 20 6f 66  ually dispose of
12a00 20 74 68 65 0d 0a 20 20 20 20 20 20 23 20 20 20   the..      #   
12a10 20 20 20 20 75 6e 64 65 72 6c 79 69 6e 67 20 6f      underlying o
12a20 62 6a 65 63 74 20 62 65 63 61 75 73 65 20 74 68  bject because th
12a30 65 20 2b 4e 6f 44 69 73 70 6f 73 65 20 66 6c 61  e +NoDispose fla
12a40 67 20 77 61 73 20 73 65 74 20 6f 6e 20 69 74 0d  g was set on it.
12a50 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 64  .      #       d
12a60 75 72 69 6e 67 20 63 72 65 61 74 69 6f 6e 20 6f  uring creation o
12a70 66 20 74 68 65 20 6f 70 61 71 75 65 20 6f 62 6a  f the opaque obj
12a80 65 63 74 20 68 61 6e 64 6c 65 2e 0d 0a 20 20 20  ect handle...   
12a90 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
12aa0 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 63 6f 6e  [info exists con
12ab0 6e 65 63 74 69 6f 6e 5d 20 26 26 20 5c 0d 0a 20  nection] && \.. 
12ac0 20 20 20 20 20 20 20 20 20 5b 63 61 74 63 68 20           [catch 
12ad0 7b 6f 62 6a 65 63 74 20 64 69 73 70 6f 73 65 20  {object dispose 
12ae0 24 63 6f 6e 6e 65 63 74 69 6f 6e 7d 20 65 72 72  $connection} err
12af0 6f 72 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  or]} then {..   
12b00 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
12b10 23 20 4e 4f 54 45 3a 20 57 65 20 73 6f 6d 65 68  # NOTE: We someh
12b20 6f 77 20 66 61 69 6c 65 64 20 74 6f 20 72 65 6d  ow failed to rem
12b30 6f 76 65 20 74 68 65 20 68 61 6e 64 6c 65 2c 20  ove the handle, 
12b40 72 65 70 6f 72 74 20 77 68 79 2e 0d 0a 20 20 20  report why...   
12b50 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
12b60 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
12b70 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
12b80 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
12b90 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20   "==== WARNING: 
12ba0 66 61 69 6c 65 64 20 74 6f 20 72 65 6d 6f 76 65  failed to remove
12bb0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 6e 64   connection hand
12bc0 6c 65 20 5c 22 22 20 24 63 6f 6e 6e 65 63 74 69  le \"" $connecti
12bd0 6f 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  on \..          
12be0 20 20 22 5c 22 2c 20 65 72 72 6f 72 3a 20 22 20    "\", error: " 
12bf0 5c 6e 5c 74 20 24 65 72 72 6f 72 20 5c 6e 5d 0d  \n\t $error \n].
12c00 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d  .      }..    }.
12c10 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 61 64 64  ....    proc add
12c20 44 62 43 6f 6e 6e 65 63 74 69 6f 6e 20 7b 20 63  DbConnection { c
12c30 6f 6e 6e 65 63 74 69 6f 6e 20 7b 76 61 72 4e 61  onnection {varNa
12c40 6d 65 20 64 62 7d 20 7d 20 7b 0d 0a 20 20 20 20  me db} } {..    
12c50 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
12c60 45 3a 20 52 65 66 65 72 20 74 6f 20 74 68 65 20  E: Refer to the 
12c70 73 70 65 63 69 66 69 65 64 20 76 61 72 69 61 62  specified variab
12c80 6c 65 20 28 65 2e 67 2e 20 22 64 62 22 29 20 69  le (e.g. "db") i
12c90 6e 20 74 68 65 20 63 6f 6e 74 65 78 74 20 6f 66  n the context of
12ca0 20 6f 75 72 0d 0a 20 20 20 20 20 20 23 20 20 20   our..      #   
12cb0 20 20 20 20 63 61 6c 6c 65 72 2e 0d 0a 20 20 20      caller...   
12cc0 20 20 20 23 0d 0a 20 20 20 20 20 20 75 70 76 61     #..      upva
12cd0 72 20 31 20 24 76 61 72 4e 61 6d 65 20 64 62 0d  r 1 $varName db.
12ce0 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
12cf0 20 20 23 20 4e 4f 54 45 3a 20 43 72 65 61 74 65    # NOTE: Create
12d00 20 61 20 63 6f 72 72 65 63 74 6c 79 20 66 6f 72   a correctly for
12d10 6d 61 74 74 65 64 20 6e 61 6d 65 20 66 6f 72 20  matted name for 
12d20 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e  the database con
12d30 6e 65 63 74 69 6f 6e 20 74 6f 0d 0a 20 20 20 20  nection to..    
12d40 20 20 23 20 20 20 20 20 20 20 62 65 20 61 64 64    #       be add
12d50 65 64 20 74 6f 20 74 68 65 20 6c 69 73 74 20 6d  ed to the list m
12d60 61 6e 61 67 65 64 20 62 79 20 74 68 65 20 45 61  anaged by the Ea
12d70 67 6c 65 20 69 6e 74 65 72 70 72 65 74 65 72 2e  gle interpreter.
12d80 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
12d90 20 73 65 74 20 64 62 20 5b 6f 62 6a 65 63 74 20   set db [object 
12da0 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e  invoke -flags +N
12db0 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20  onPublic \..    
12dc0 20 20 20 20 20 20 45 61 67 6c 65 2e 5f 43 6f 6d        Eagle._Com
12dd0 70 6f 6e 65 6e 74 73 2e 50 72 69 76 61 74 65 2e  ponents.Private.
12de0 46 6f 72 6d 61 74 4f 70 73 20 44 61 74 61 62 61  FormatOps Databa
12df0 73 65 4f 62 6a 65 63 74 4e 61 6d 65 20 24 63 6f  seObjectName $co
12e00 6e 6e 65 63 74 69 6f 6e 20 5c 0d 0a 20 20 20 20  nnection \..    
12e10 20 20 20 20 20 20 53 51 4c 69 74 65 43 6f 6e 6e        SQLiteConn
12e20 65 63 74 69 6f 6e 20 5b 6f 62 6a 65 63 74 20 69  ection [object i
12e30 6e 76 6f 6b 65 20 49 6e 74 65 72 70 72 65 74 65  nvoke Interprete
12e40 72 2e 47 65 74 41 63 74 69 76 65 20 4e 65 78 74  r.GetActive Next
12e50 49 64 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d  Id]]....      #.
12e60 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41  .      # NOTE: A
12e70 64 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20  dd the database 
12e80 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 72 6f 76 69  connection provi
12e90 64 65 64 20 62 79 20 6f 75 72 20 63 61 6c 6c 65  ded by our calle
12ea0 72 20 74 6f 20 74 68 65 20 6c 69 73 74 0d 0a 20  r to the list.. 
12eb0 20 20 20 20 20 23 20 20 20 20 20 20 20 6f 66 20       #       of 
12ec0 74 68 6f 73 65 20 6b 6e 6f 77 6e 20 74 6f 20 74  those known to t
12ed0 68 65 20 45 61 67 6c 65 20 69 6e 74 65 72 70 72  he Eagle interpr
12ee0 65 74 65 72 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  eter...      #..
12ef0 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76        object inv
12f00 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50  oke -flags +NonP
12f10 75 62 6c 69 63 20 49 6e 74 65 72 70 72 65 74 65  ublic Interprete
12f20 72 2e 47 65 74 41 63 74 69 76 65 2e 63 6f 6e 6e  r.GetActive.conn
12f30 65 63 74 69 6f 6e 73 20 41 64 64 20 5c 0d 0a 20  ections Add \.. 
12f40 20 20 20 20 20 20 20 20 20 24 64 62 20 24 63 6f           $db $co
12f50 6e 6e 65 63 74 69 6f 6e 0d 0a 20 20 20 20 7d 0d  nnection..    }.
12f60 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74  ....    proc get
12f70 52 6f 77 73 46 72 6f 6d 44 61 74 61 54 61 62 6c  RowsFromDataTabl
12f80 65 20 7b 20 64 61 74 61 54 61 62 6c 65 20 7d 20  e { dataTable } 
12f90 7b 0d 0a 20 20 20 20 20 20 73 65 74 20 72 6f 77  {..      set row
12fa0 73 20 5b 6c 69 73 74 5d 0d 0a 20 20 20 20 20 20  s [list]..      
12fb0 73 65 74 20 63 6f 75 6e 74 20 5b 24 64 61 74 61  set count [$data
12fc0 54 61 62 6c 65 20 43 6f 6c 75 6d 6e 73 2e 43 6f  Table Columns.Co
12fd0 75 6e 74 5d 0d 0a 0d 0a 20 20 20 20 20 20 66 6f  unt]....      fo
12fe0 72 20 7b 73 65 74 20 69 6e 64 65 78 20 30 7d 20  r {set index 0} 
12ff0 7b 24 69 6e 64 65 78 20 3c 20 24 63 6f 75 6e 74  {$index < $count
13000 7d 20 7b 69 6e 63 72 20 69 6e 64 65 78 7d 20 7b  } {incr index} {
13010 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 64 61  ..        set da
13020 74 61 43 6f 6c 75 6d 6e 20 5b 24 64 61 74 61 54  taColumn [$dataT
13030 61 62 6c 65 20 2d 61 6c 69 61 73 20 43 6f 6c 75  able -alias Colu
13040 6d 6e 73 2e 67 65 74 5f 49 74 65 6d 20 24 69 6e  mns.get_Item $in
13050 64 65 78 5d 0d 0a 20 20 20 20 20 20 20 20 73 65  dex]..        se
13060 74 20 6e 61 6d 65 73 28 24 69 6e 64 65 78 29 20  t names($index) 
13070 5b 24 64 61 74 61 43 6f 6c 75 6d 6e 20 43 6f 6c  [$dataColumn Col
13080 75 6d 6e 4e 61 6d 65 5d 0d 0a 20 20 20 20 20 20  umnName]..      
13090 7d 0d 0a 0d 0a 20 20 20 20 20 20 6f 62 6a 65 63  }....      objec
130a0 74 20 66 6f 72 65 61 63 68 20 2d 61 6c 69 61 73  t foreach -alias
130b0 20 64 61 74 61 52 6f 77 20 5b 73 65 74 20 64 61   dataRow [set da
130c0 74 61 52 6f 77 73 20 5b 24 64 61 74 61 54 61 62  taRows [$dataTab
130d0 6c 65 20 52 6f 77 73 5d 5d 20 7b 0d 0a 20 20 20  le Rows]] {..   
130e0 20 20 20 20 20 73 65 74 20 72 6f 77 20 5b 6c 69       set row [li
130f0 73 74 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 66  st]....        f
13100 6f 72 20 7b 73 65 74 20 69 6e 64 65 78 20 30 7d  or {set index 0}
13110 20 7b 24 69 6e 64 65 78 20 3c 20 24 63 6f 75 6e   {$index < $coun
13120 74 7d 20 7b 69 6e 63 72 20 69 6e 64 65 78 7d 20  t} {incr index} 
13130 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74  {..          set
13140 20 76 61 6c 75 65 20 5b 24 64 61 74 61 52 6f 77   value [$dataRow
13150 20 2d 63 72 65 61 74 65 20 2d 61 6c 69 61 73 20   -create -alias 
13160 67 65 74 5f 49 74 65 6d 20 24 69 6e 64 65 78 5d  get_Item $index]
13170 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66  ....          if
13180 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68   {[string length
13190 20 24 76 61 6c 75 65 5d 20 3e 20 30 20 26 26 20   $value] > 0 && 
131a0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
131b0 20 21 5b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65   ![object invoke
131c0 20 43 6f 6e 76 65 72 74 20 49 73 44 42 4e 75 6c   Convert IsDBNul
131d0 6c 20 24 76 61 6c 75 65 5d 7d 20 74 68 65 6e 20  l $value]} then 
131e0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 6c  {..            l
131f0 61 70 70 65 6e 64 20 72 6f 77 20 5b 6c 69 73 74  append row [list
13200 20 24 6e 61 6d 65 73 28 24 69 6e 64 65 78 29 20   $names($index) 
13210 5b 24 76 61 6c 75 65 20 54 6f 53 74 72 69 6e 67  [$value ToString
13220 5d 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 20  ]]..          } 
13230 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
13240 20 20 20 20 6c 61 70 70 65 6e 64 20 72 6f 77 20      lappend row 
13250 5b 6c 69 73 74 20 24 6e 61 6d 65 73 28 24 69 6e  [list $names($in
13260 64 65 78 29 5d 0d 0a 20 20 20 20 20 20 20 20 20  dex)]..         
13270 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d   }..        }...
13280 0a 20 20 20 20 20 20 20 20 6c 61 70 70 65 6e 64  .        lappend
13290 20 72 6f 77 73 20 24 72 6f 77 0d 0a 20 20 20 20   rows $row..    
132a0 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65 74    }....      ret
132b0 75 72 6e 20 24 72 6f 77 73 0d 0a 20 20 20 20 7d  urn $rows..    }
132c0 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 64 75  .....    proc du
132d0 6d 70 52 6f 77 73 46 72 6f 6d 44 61 74 61 54 61  mpRowsFromDataTa
132e0 62 6c 65 20 7b 20 63 68 61 6e 6e 65 6c 20 72 6f  ble { channel ro
132f0 77 73 20 7d 20 7b 0d 0a 20 20 20 20 20 20 73 65  ws } {..      se
13300 74 20 73 65 71 75 65 6e 63 65 20 31 0d 0a 0d 0a  t sequence 1....
13310 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f        foreach ro
13320 77 20 24 72 6f 77 73 20 7b 0d 0a 20 20 20 20 20  w $rows {..     
13330 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
13340 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
13350 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 65 78  .            [ex
13360 70 72 20 7b 24 73 65 71 75 65 6e 63 65 20 3e 20  pr {$sequence > 
13370 31 20 3f 20 22 5c 6e 22 20 3a 20 22 22 7d 5d 20  1 ? "\n" : ""}] 
13380 22 2d 2d 2d 2d 20 52 4f 57 20 23 22 20 24 73 65  "---- ROW #" $se
13390 71 75 65 6e 63 65 20 3a 5c 6e 5d 0d 0a 0d 0a 20  quence :\n].... 
133a0 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 70         foreach p
133b0 61 69 72 20 24 72 6f 77 20 7b 0d 0a 20 20 20 20  air $row {..    
133c0 20 20 20 20 20 20 69 66 20 7b 5b 6c 6c 65 6e 67        if {[lleng
133d0 74 68 20 24 70 61 69 72 5d 20 3e 3d 20 32 7d 20  th $pair] >= 2} 
133e0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
133f0 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
13400 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
13410 74 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  t \..           
13420 20 20 20 20 20 5b 6c 69 73 74 20 5b 6c 69 6e 64       [list [lind
13430 65 78 20 24 70 61 69 72 20 30 5d 5d 20 22 3a 20  ex $pair 0]] ": 
13440 22 20 5b 6c 69 73 74 20 5b 6c 69 6e 64 65 78 20  " [list [lindex 
13450 24 70 61 69 72 20 31 5d 5d 20 5c 6e 5d 0d 0a 20  $pair 1]] \n].. 
13460 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 69           } elsei
13470 66 20 7b 5b 6c 6c 65 6e 67 74 68 20 24 70 61 69  f {[llength $pai
13480 72 5d 20 3d 3d 20 31 7d 20 74 68 65 6e 20 7b 0d  r] == 1} then {.
13490 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75  .            tpu
134a0 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70  ts $channel [app
134b0 65 6e 64 41 72 67 73 20 5c 74 20 5c 0d 0a 20 20  endArgs \t \..  
134c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 6c                [l
134d0 69 73 74 20 5b 6c 69 6e 64 65 78 20 24 70 61 69  ist [lindex $pai
134e0 72 20 30 5d 5d 20 22 3a 20 3c 6e 75 6c 6c 3e 5c  r 0]] ": <null>\
134f0 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  n"]..          }
13500 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
13510 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
13520 6e 65 6c 20 5c 74 3c 65 6d 70 74 79 3e 5c 6e 3b  nel \t<empty>\n;
13530 20 23 20 4e 4f 54 45 3a 20 4e 6f 20 64 61 74 61   # NOTE: No data
13540 3f 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  ?..          }..
13550 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
13560 20 20 20 20 20 69 6e 63 72 20 73 65 71 75 65 6e       incr sequen
13570 63 65 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20  ce..      }..   
13580 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
13590 63 6c 65 61 6e 75 70 44 62 20 7b 20 66 69 6c 65  cleanupDb { file
135a0 4e 61 6d 65 20 7b 76 61 72 4e 61 6d 65 20 64 62  Name {varName db
135b0 7d 20 7b 63 6f 6c 6c 65 63 74 20 74 72 75 65 7d  } {collect true}
135c0 20 7b 71 75 61 6c 69 66 79 20 74 72 75 65 7d 0d   {qualify true}.
135d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
135e0 20 20 20 20 20 20 7b 64 65 6c 65 74 65 20 74 72        {delete tr
135f0 75 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23  ue} } {..      #
13600 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
13610 41 74 74 65 6d 70 74 20 74 6f 20 66 6f 72 63 65  Attempt to force
13620 20 61 6c 6c 20 70 65 6e 64 69 6e 67 20 22 67 61   all pending "ga
13630 72 62 61 67 65 22 20 6f 62 6a 65 63 74 73 20 74  rbage" objects t
13640 6f 20 62 65 20 63 6f 6c 6c 65 63 74 65 64 2c 0d  o be collected,.
13650 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 69  .      #       i
13660 6e 63 6c 75 64 69 6e 67 20 53 51 4c 69 74 65 20  ncluding SQLite 
13670 73 74 61 74 65 6d 65 6e 74 73 20 61 6e 64 20 62  statements and b
13680 61 63 6b 75 70 20 6f 62 6a 65 63 74 73 3b 20 74  ackup objects; t
13690 68 69 73 20 73 68 6f 75 6c 64 20 61 6c 6c 6f 77  his should allow
136a0 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
136b0 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 64  the underlying d
136c0 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20  atabase file to 
136d0 62 65 20 64 65 6c 65 74 65 64 2e 0d 0a 20 20 20  be deleted...   
136e0 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
136f0 24 63 6f 6c 6c 65 63 74 7d 20 74 68 65 6e 20 7b  $collect} then {
13700 0d 0a 20 20 20 20 20 20 20 20 63 6f 6c 6c 65 63  ..        collec
13710 74 47 61 72 62 61 67 65 20 24 3a 3a 74 65 73 74  tGarbage $::test
13720 5f 63 68 61 6e 6e 65 6c 0d 0a 20 20 20 20 20 20  _channel..      
13730 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  }....      #..  
13740 20 20 20 20 23 20 4e 4f 54 45 3a 20 52 65 66 65      # NOTE: Refe
13750 72 20 74 6f 20 74 68 65 20 73 70 65 63 69 66 69  r to the specifi
13760 65 64 20 76 61 72 69 61 62 6c 65 20 28 65 2e 67  ed variable (e.g
13770 2e 20 22 64 62 22 29 20 69 6e 20 74 68 65 20 63  . "db") in the c
13780 6f 6e 74 65 78 74 20 6f 66 20 6f 75 72 0d 0a 20  ontext of our.. 
13790 20 20 20 20 20 23 20 20 20 20 20 20 20 63 61 6c       #       cal
137a0 6c 65 72 2e 20 20 54 68 65 20 68 61 6e 64 6c 65  ler.  The handle
137b0 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
137c0 20 70 72 65 76 69 6f 75 73 6c 79 20 6f 70 65 6e   previously open
137d0 65 64 20 76 69 61 20 74 68 65 0d 0a 20 20 20 20  ed via the..    
137e0 20 20 23 20 20 20 20 20 20 20 5b 73 65 74 75 70    #       [setup
137f0 44 62 5d 20 70 72 6f 63 65 64 75 72 65 20 73 68  Db] procedure sh
13800 6f 75 6c 64 20 62 65 20 73 74 6f 72 65 64 20 74  ould be stored t
13810 68 65 72 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  here...      #..
13820 20 20 20 20 20 20 75 70 76 61 72 20 31 20 24 76        upvar 1 $v
13830 61 72 4e 61 6d 65 20 64 62 0d 0a 0d 0a 20 20 20  arName db....   
13840 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
13850 54 45 3a 20 43 6c 6f 73 65 20 74 68 65 20 63 6f  TE: Close the co
13860 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 74 68 65 20  nnection to the 
13870 64 61 74 61 62 61 73 65 20 6e 6f 77 2e 20 20 54  database now.  T
13880 68 69 73 20 73 68 6f 75 6c 64 20 61 6c 6c 6f 77  his should allow
13890 20 75 73 0d 0a 20 20 20 20 20 20 23 20 20 20 20   us..      #    
138a0 20 20 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65     to delete the
138b0 20 75 6e 64 65 72 6c 79 69 6e 67 20 64 61 74 61   underlying data
138c0 62 61 73 65 20 66 69 6c 65 2e 0d 0a 20 20 20 20  base file...    
138d0 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b    #..      if {[
138e0 69 6e 66 6f 20 65 78 69 73 74 73 20 64 62 5d 20  info exists db] 
138f0 26 26 20 5b 63 61 74 63 68 20 7b 73 71 6c 20 63  && [catch {sql c
13900 6c 6f 73 65 20 24 64 62 7d 20 65 72 72 6f 72 5d  lose $db} error]
13910 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
13920 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
13930 4f 54 45 3a 20 57 65 20 73 6f 6d 65 68 6f 77 20  OTE: We somehow 
13940 66 61 69 6c 65 64 20 74 6f 20 63 6c 6f 73 65 20  failed to close 
13950 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 72 65  the database, re
13960 70 6f 72 74 20 77 68 79 2e 0d 0a 20 20 20 20 20  port why...     
13970 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 74 70     #..        tp
13980 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  uts $::test_chan
13990 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
139a0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22  \..            "
139b0 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61  ==== WARNING: fa
139c0 69 6c 65 64 20 74 6f 20 63 6c 6f 73 65 20 64 61  iled to close da
139d0 74 61 62 61 73 65 20 5c 22 22 20 24 64 62 20 22  tabase \"" $db "
139e0 5c 22 2c 20 65 72 72 6f 72 3a 20 22 20 5c 0d 0a  \", error: " \..
139f0 20 20 20 20 20 20 20 20 20 20 20 20 5c 6e 5c 74              \n\t
13a00 20 24 65 72 72 6f 72 20 5c 6e 5d 0d 0a 20 20 20   $error \n]..   
13a10 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d     }....      #.
13a20 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 46  .      # NOTE: F
13a30 69 72 73 74 2c 20 73 65 65 20 69 66 20 6f 75 72  irst, see if our
13a40 20 63 61 6c 6c 65 72 20 68 61 73 20 72 65 71 75   caller has requ
13a50 65 73 74 65 64 20 61 6e 20 69 6e 2d 6d 65 6d 6f  ested an in-memo
13a60 72 79 20 64 61 74 61 62 61 73 65 2e 0d 0a 20 20  ry database...  
13a70 20 20 20 20 23 0d 0a 20 20 20 20 20 20 73 65 74      #..      set
13a80 20 69 73 4d 65 6d 6f 72 79 20 5b 69 73 4d 65 6d   isMemory [isMem
13a90 6f 72 79 44 62 20 24 66 69 6c 65 4e 61 6d 65 5d  oryDb $fileName]
13aa0 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  ....      #..   
13ab0 20 20 20 23 20 4e 4f 54 45 3a 20 42 75 69 6c 64     # NOTE: Build
13ac0 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68 20 74   the full path t
13ad0 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
13ae0 69 6c 65 20 6e 61 6d 65 2e 20 20 46 6f 72 20 6e  ile name.  For n
13af0 6f 77 2c 20 61 6c 6c 20 74 65 73 74 0d 0a 20 20  ow, all test..  
13b00 20 20 20 20 23 20 20 20 20 20 20 20 64 61 74 61      #       data
13b10 62 61 73 65 20 66 69 6c 65 73 20 61 72 65 20 73  base files are s
13b20 74 6f 72 65 64 20 69 6e 20 74 68 65 20 74 65 6d  tored in the tem
13b30 70 6f 72 61 72 79 20 64 69 72 65 63 74 6f 72 79  porary directory
13b40 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
13b50 20 20 69 66 20 7b 21 24 69 73 4d 65 6d 6f 72 79    if {!$isMemory
13b60 20 26 26 20 24 71 75 61 6c 69 66 79 7d 20 74 68   && $qualify} th
13b70 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 65  en {..        se
13b80 74 20 66 69 6c 65 4e 61 6d 65 20 5b 66 69 6c 65  t fileName [file
13b90 20 6a 6f 69 6e 20 5b 67 65 74 44 61 74 61 62 61   join [getDataba
13ba0 73 65 44 69 72 65 63 74 6f 72 79 5d 20 5b 66 69  seDirectory] [fi
13bb0 6c 65 20 74 61 69 6c 20 24 66 69 6c 65 4e 61 6d  le tail $fileNam
13bc0 65 5d 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a  e]]..      }....
13bd0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
13be0 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 69 66 20   NOTE: Check if 
13bf0 74 68 65 20 66 69 6c 65 20 73 74 69 6c 6c 20 65  the file still e
13c00 78 69 73 74 73 2e 0d 0a 20 20 20 20 20 20 23 0d  xists...      #.
13c10 0a 20 20 20 20 20 20 69 66 20 7b 21 24 69 73 4d  .      if {!$isM
13c20 65 6d 6f 72 79 20 26 26 20 24 64 65 6c 65 74 65  emory && $delete
13c30 20 26 26 20 5b 66 69 6c 65 20 65 78 69 73 74 73   && [file exists
13c40 20 24 66 69 6c 65 4e 61 6d 65 5d 7d 20 74 68 65   $fileName]} the
13c50 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  n {..        #..
13c60 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
13c70 53 6b 69 70 20 64 65 6c 65 74 69 6e 67 20 64 61  Skip deleting da
13c80 74 61 62 61 73 65 20 66 69 6c 65 73 20 69 66 20  tabase files if 
13c90 73 6f 6d 65 62 6f 64 79 20 73 65 74 73 20 74 68  somebody sets th
13ca0 65 20 67 6c 6f 62 61 6c 0d 0a 20 20 20 20 20 20  e global..      
13cb0 20 20 23 20 20 20 20 20 20 20 76 61 72 69 61 62    #       variab
13cc0 6c 65 20 74 6f 20 70 72 65 76 65 6e 74 20 69 74  le to prevent it
13cd0 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
13ce0 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f        if {![info
13cf0 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 63 6c 65   exists ::no(cle
13d00 61 6e 75 70 44 62 46 69 6c 65 29 5d 7d 20 74 68  anupDbFile)]} th
13d10 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
13d20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e  #..          # N
13d30 4f 54 45 3a 20 41 74 74 65 6d 70 74 20 74 6f 20  OTE: Attempt to 
13d40 64 65 6c 65 74 65 20 74 68 65 20 74 65 73 74 20  delete the test 
13d50 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6e 6f  database file no
13d60 77 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d  w...          #.
13d70 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b  .          if {[
13d80 73 65 74 20 63 6f 64 65 20 5b 63 61 74 63 68 20  set code [catch 
13d90 7b 66 69 6c 65 20 64 65 6c 65 74 65 20 24 66 69  {file delete $fi
13da0 6c 65 4e 61 6d 65 7d 20 65 72 72 6f 72 5d 5d 7d  leName} error]]}
13db0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
13dc0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
13dd0 20 20 20 20 23 20 4e 4f 54 45 3a 20 57 65 20 73      # NOTE: We s
13de0 6f 6d 65 68 6f 77 20 66 61 69 6c 65 64 20 74 6f  omehow failed to
13df0 20 64 65 6c 65 74 65 20 74 68 65 20 66 69 6c 65   delete the file
13e00 2c 20 72 65 70 6f 72 74 20 77 68 79 2e 0d 0a 20  , report why... 
13e10 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
13e20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
13e30 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
13e40 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
13e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
13e60 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61  ==== WARNING: fa
13e70 69 6c 65 64 20 74 6f 20 64 65 6c 65 74 65 20 64  iled to delete d
13e80 61 74 61 62 61 73 65 20 66 69 6c 65 20 5c 22 22  atabase file \""
13e90 20 24 66 69 6c 65 4e 61 6d 65 20 5c 0d 0a 20 20   $fileName \..  
13ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 5c                "\
13eb0 22 20 64 75 72 69 6e 67 20 63 6c 65 61 6e 75 70  " during cleanup
13ec0 2c 20 65 72 72 6f 72 3a 20 22 20 5c 6e 5c 74 20  , error: " \n\t 
13ed0 24 65 72 72 6f 72 20 5c 6e 5d 0d 0a 20 20 20 20  $error \n]..    
13ee0 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
13ef0 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
13f00 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
13f10 20 20 23 20 4e 4f 54 45 3a 20 53 68 6f 77 20 74    # NOTE: Show t
13f20 68 61 74 20 77 65 20 73 6b 69 70 70 65 64 20 64  hat we skipped d
13f30 65 6c 65 74 69 6e 67 20 74 68 65 20 66 69 6c 65  eleting the file
13f40 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a  ...          #..
13f50 20 20 20 20 20 20 20 20 20 20 73 65 74 20 63 6f            set co
13f60 64 65 20 30 0d 0a 0d 0a 20 20 20 20 20 20 20 20  de 0....        
13f70 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
13f80 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
13f90 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
13fa0 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49       "==== WARNI
13fb0 4e 47 3a 20 73 6b 69 70 70 65 64 20 64 65 6c 65  NG: skipped dele
13fc0 74 69 6e 67 20 64 61 74 61 62 61 73 65 20 66 69  ting database fi
13fd0 6c 65 20 5c 22 22 20 24 66 69 6c 65 4e 61 6d 65  le \"" $fileName
13fe0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
13ff0 20 20 22 5c 22 20 64 75 72 69 6e 67 20 63 6c 65    "\" during cle
14000 61 6e 75 70 5c 6e 22 5d 0d 0a 20 20 20 20 20 20  anup\n"]..      
14010 20 20 7d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73    }..      } els
14020 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  e {..        #..
14030 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
14040 54 68 65 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f  The file does no
14050 74 20 65 78 69 73 74 2c 20 73 75 63 63 65 73 73  t exist, success
14060 21 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  !..        #..  
14070 20 20 20 20 20 20 73 65 74 20 63 6f 64 65 20 30        set code 0
14080 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
14090 20 20 20 72 65 74 75 72 6e 20 24 63 6f 64 65 0d     return $code.
140a0 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70  .    }.....    p
140b0 72 6f 63 20 73 65 74 75 70 44 62 49 6e 74 65 72  roc setupDbInter
140c0 72 75 70 74 43 61 6c 6c 62 61 63 6b 20 7b 20 63  ruptCallback { c
140d0 68 61 6e 6e 65 6c 20 6c 6f 67 20 7d 20 7b 0d 0a  hannel log } {..
140e0 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
140f0 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 73 65 74 74 69  nnel "---- setti
14100 6e 67 20 75 70 20 64 65 62 75 67 67 65 72 20 69  ng up debugger i
14110 6e 74 65 72 72 75 70 74 20 63 61 6c 6c 62 61 63  nterrupt callbac
14120 6b 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 20 20  k... "....      
14130 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20  if {[catch {..  
14140 20 20 20 20 20 20 73 65 74 20 3a 3a 65 6e 76 28        set ::env(
14150 71 75 69 65 74 46 69 6e 64 49 6e 74 65 72 70 72  quietFindInterpr
14160 65 74 65 72 54 65 73 74 50 61 74 68 29 20 31 0d  eterTestPath) 1.
14170 0a 20 20 20 20 20 20 20 20 73 65 74 20 3a 3a 65  .        set ::e
14180 6e 76 28 71 75 69 65 74 53 65 74 75 70 49 6e 74  nv(quietSetupInt
14190 65 72 70 72 65 74 65 72 54 65 73 74 50 61 74 68  erpreterTestPath
141a0 29 20 31 0d 0a 0d 0a 20 20 20 20 20 20 20 20 74  ) 1....        t
141b0 72 79 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  ry {..          
141c0 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e  #..          # N
141d0 4f 54 45 3a 20 4d 61 6b 65 20 73 75 72 65 20 74  OTE: Make sure t
141e0 68 65 20 73 63 72 69 70 74 20 64 65 62 75 67 67  he script debugg
141f0 65 72 20 61 6e 64 20 74 68 65 20 69 73 6f 6c 61  er and the isola
14200 74 65 64 20 69 6e 74 65 72 70 72 65 74 65 72 0d  ted interpreter.
14210 0a 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20  .          #    
14220 20 20 20 61 72 65 20 73 65 74 75 70 20 61 6e 64     are setup and
14230 20 72 65 61 64 79 20 66 6f 72 20 75 73 65 2e 0d   ready for use..
14240 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
14250 20 20 20 20 20 20 20 20 64 65 62 75 67 20 73 65          debug se
14260 74 75 70 20 74 72 75 65 20 74 72 75 65 0d 0a 0d  tup true true...
14270 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
14280 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
14290 4c 6f 61 64 20 74 68 65 20 6e 65 63 65 73 73 61  Load the necessa
142a0 72 79 20 70 61 63 6b 61 67 65 73 20 69 6e 74 6f  ry packages into
142b0 20 74 68 65 20 69 73 6f 6c 61 74 65 64 20 69 6e   the isolated in
142c0 74 65 72 70 72 65 74 65 72 2e 0d 0a 20 20 20 20  terpreter...    
142d0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
142e0 20 20 20 64 65 62 75 67 20 65 76 61 6c 20 7b 0d     debug eval {.
142f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 61 63  .            pac
14300 6b 61 67 65 20 72 65 71 75 69 72 65 20 45 61 67  kage require Eag
14310 6c 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  le..            
14320 70 61 63 6b 61 67 65 20 72 65 71 75 69 72 65 20  package require 
14330 45 61 67 6c 65 2e 4c 69 62 72 61 72 79 0d 0a 20  Eagle.Library.. 
14340 20 20 20 20 20 20 20 20 20 20 20 70 61 63 6b 61             packa
14350 67 65 20 72 65 71 75 69 72 65 20 45 61 67 6c 65  ge require Eagle
14360 2e 54 65 73 74 0d 0a 20 20 20 20 20 20 20 20 20  .Test..         
14370 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   }....          
14380 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e  #..          # N
14390 4f 54 45 3a 20 43 6f 70 79 20 74 68 65 20 6e 65  OTE: Copy the ne
143a0 63 65 73 73 61 72 79 20 76 61 72 69 61 62 6c 65  cessary variable
143b0 73 20 69 6e 74 6f 20 74 68 65 20 69 73 6f 6c 61  s into the isola
143c0 74 65 64 20 69 6e 74 65 72 70 72 65 74 65 72 2e  ted interpreter.
143d0 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20  ..          #.. 
143e0 20 20 20 20 20 20 20 20 20 64 65 62 75 67 20 69           debug i
143f0 6e 76 6f 6b 65 20 30 20 73 65 74 20 3a 3a 74 65  nvoke 0 set ::te
14400 73 74 5f 63 68 61 6e 6e 65 6c 20 24 63 68 61 6e  st_channel $chan
14410 6e 65 6c 3b 20 23 20 4e 4f 54 45 3a 20 46 6f 72  nel; # NOTE: For
14420 20 5b 74 70 75 74 73 5d 2e 0d 0a 20 20 20 20 20   [tputs]...     
14430 20 20 20 20 20 64 65 62 75 67 20 69 6e 76 6f 6b       debug invok
14440 65 20 30 20 73 65 74 20 3a 3a 74 65 73 74 5f 6c  e 0 set ::test_l
14450 6f 67 20 24 6c 6f 67 3b 20 23 20 4e 4f 54 45 3a  og $log; # NOTE:
14460 20 46 6f 72 20 5b 74 6c 6f 67 5d 2e 0d 0a 0d 0a   For [tlog].....
14470 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
14480 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49         # NOTE: I
14490 6e 73 74 61 6c 6c 20 74 68 65 20 63 61 6c 6c 62  nstall the callb
144a0 61 63 6b 20 73 63 72 69 70 74 20 74 6f 20 62 65  ack script to be
144b0 20 65 76 61 6c 75 61 74 65 64 20 69 6e 20 74 68   evaluated in th
144c0 65 20 69 73 6f 6c 61 74 65 64 0d 0a 20 20 20 20  e isolated..    
144d0 20 20 20 20 20 20 23 20 20 20 20 20 20 20 69 6e        #       in
144e0 74 65 72 70 72 65 74 65 72 20 77 68 65 6e 20 74  terpreter when t
144f0 68 69 73 20 69 6e 74 65 72 70 72 65 74 65 72 20  his interpreter 
14500 69 73 20 69 6e 74 65 72 72 75 70 74 65 64 20 62  is interrupted b
14510 79 20 73 63 72 69 70 74 0d 0a 20 20 20 20 20 20  y script..      
14520 20 20 20 20 23 20 20 20 20 20 20 20 63 61 6e 63      #       canc
14530 65 6c 6c 61 74 69 6f 6e 2c 20 65 74 63 2e 0d 0a  ellation, etc...
14540 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
14550 20 20 20 20 20 20 20 64 65 62 75 67 20 63 61 6c         debug cal
14560 6c 62 61 63 6b 20 61 70 70 6c 79 20 7b 7b 73 65  lback apply {{se
14570 6e 64 65 72 20 65 7d 20 7b 0d 0a 20 20 20 20 20  nder e} {..     
14580 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
14590 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68        # NOTE: Ch
145a0 65 63 6b 20 69 66 20 74 68 69 73 20 63 61 6c 6c  eck if this call
145b0 62 61 63 6b 20 69 73 20 6f 6e 65 20 74 68 61 74  back is one that
145c0 20 77 65 20 63 61 72 65 20 61 62 6f 75 74 2e 0d   we care about..
145d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a  .            #..
145e0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b              if {
145f0 22 43 61 6e 63 65 6c 65 64 22 20 69 6e 20 5b 73  "Canceled" in [s
14600 70 6c 69 74 20 5b 24 65 20 49 6e 74 65 72 72 75  plit [$e Interru
14610 70 74 54 79 70 65 5d 20 22 2c 20 22 5d 7d 20 74  ptType] ", "]} t
14620 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
14630 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
14640 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4d 61        # NOTE: Ma
14650 6b 65 20 73 75 72 65 20 74 68 65 20 5b 6f 62 6a  ke sure the [obj
14660 65 63 74 5d 20 63 6f 6d 6d 61 6e 64 20 69 73 20  ect] command is 
14670 61 76 61 69 6c 61 62 6c 65 2e 20 20 53 69 6e 63  available.  Sinc
14680 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e..             
14690 20 23 20 20 20 20 20 20 20 74 68 69 73 20 69 73   #       this is
146a0 20 61 6e 20 69 73 6f 6c 61 74 65 64 20 69 6e 74   an isolated int
146b0 65 72 70 72 65 74 65 72 2c 20 63 68 65 63 6b 20  erpreter, check 
146c0 66 6f 72 20 69 74 20 74 68 65 20 68 61 72 64 0d  for it the hard.
146d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23  .              #
146e0 20 20 20 20 20 20 20 77 61 79 2e 0d 0a 20 20 20         way...   
146f0 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
14700 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b              if {
14710 5b 6c 6c 65 6e 67 74 68 20 5b 69 6e 66 6f 20 63  [llength [info c
14720 6f 6d 6d 61 6e 64 73 20 6f 62 6a 65 63 74 5d 5d  ommands object]]
14730 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20   > 0} then {..  
14740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 0d                #.
14750 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
14760 20 23 20 4e 4f 54 45 3a 20 49 74 65 72 61 74 65   # NOTE: Iterate
14770 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 64 61 74   through all dat
14780 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
14790 73 20 6b 6e 6f 77 6e 20 74 6f 20 74 68 65 0d 0a  s known to the..
147a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
147b0 23 20 20 20 20 20 20 20 70 61 72 65 6e 74 20 69  #       parent i
147c0 6e 74 65 72 70 72 65 74 65 72 2e 0d 0a 20 20 20  nterpreter...   
147d0 20 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a               #..
147e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
147f0 6f 62 6a 65 63 74 20 66 6f 72 65 61 63 68 20 2d  object foreach -
14800 61 6c 69 61 73 20 70 61 69 72 20 5b 6f 62 6a 65  alias pair [obje
14810 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73  ct invoke -flags
14820 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20   +NonPublic \.. 
14830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14840 20 20 20 24 65 20 49 6e 74 65 72 70 72 65 74 65     $e Interprete
14850 72 2e 63 6f 6e 6e 65 63 74 69 6f 6e 73 5d 20 7b  r.connections] {
14860 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
14870 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
14880 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a           # NOTE:
14890 20 41 74 74 65 6d 70 74 20 74 6f 20 63 61 6e 63   Attempt to canc
148a0 65 6c 20 61 6e 79 20 53 51 4c 20 71 75 65 72 69  el any SQL queri
148b0 65 73 20 69 6e 20 70 72 6f 67 72 65 73 73 20 6f  es in progress o
148c0 6e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n..             
148d0 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68 69       #       thi
148e0 73 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  s database conne
148f0 63 74 69 6f 6e 2e 0d 0a 20 20 20 20 20 20 20 20  ction...        
14900 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
14910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
14920 66 20 7b 5b 63 61 74 63 68 20 7b 24 70 61 69 72  f {[catch {$pair
14930 20 56 61 6c 75 65 2e 43 61 6e 63 65 6c 7d 20 65   Value.Cancel} e
14940 72 72 6f 72 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  rror]} then {.. 
14950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14960 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
14970 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  _channel [append
14980 41 72 67 73 20 5c 6e 20 5c 0d 0a 20 20 20 20 20  Args \n \..     
14990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
149a0 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47     "==== WARNING
149b0 3a 20 66 61 69 6c 65 64 20 74 6f 20 63 61 6e 63  : failed to canc
149c0 65 6c 20 71 75 65 72 79 20 66 6f 72 20 22 20 5c  el query for " \
149d0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
149e0 20 20 20 20 20 20 20 20 20 20 22 63 6f 6e 6e 65            "conne
149f0 63 74 69 6f 6e 20 5c 22 22 20 5b 24 70 61 69 72  ction \"" [$pair
14a00 20 4b 65 79 5d 20 22 5c 22 2c 20 65 72 72 6f 72   Key] "\", error
14a10 3a 20 22 20 5c 6e 5c 74 20 5c 0d 0a 20 20 20 20  : " \n\t \..    
14a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14a30 20 20 20 20 24 65 72 72 6f 72 20 5c 6e 5d 0d 0a      $error \n]..
14a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14a50 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20    }..           
14a60 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
14a70 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
14a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14a90 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
14aa0 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
14ab0 73 20 5c 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20  s \n \..        
14ac0 20 20 20 20 20 20 20 20 20 20 20 20 22 3d 3d 3d              "===
14ad0 3d 20 57 41 52 4e 49 4e 47 3a 20 63 61 6e 6e 6f  = WARNING: canno
14ae0 74 20 63 61 6e 63 65 6c 20 61 6e 79 20 71 75 65  t cancel any que
14af0 72 69 65 73 3a 20 22 20 5c 0d 0a 20 20 20 20 20  ries: " \..     
14b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
14b10 74 68 65 20 5c 22 6f 62 6a 65 63 74 5c 22 20 63  the \"object\" c
14b20 6f 6d 6d 61 6e 64 20 69 73 20 6e 6f 74 20 61 76  ommand is not av
14b30 61 69 6c 61 62 6c 65 5c 6e 22 5d 0d 0a 20 20 20  ailable\n"]..   
14b40 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
14b50 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
14b60 20 20 20 20 20 20 20 7d 7d 0d 0a 20 20 20 20 20         }}..     
14b70 20 20 20 7d 20 66 69 6e 61 6c 6c 79 20 7b 0d 0a     } finally {..
14b80 20 20 20 20 20 20 20 20 20 20 63 61 74 63 68 20            catch 
14b90 7b 75 6e 73 65 74 20 3a 3a 65 6e 76 28 71 75 69  {unset ::env(qui
14ba0 65 74 53 65 74 75 70 49 6e 74 65 72 70 72 65 74  etSetupInterpret
14bb0 65 72 54 65 73 74 50 61 74 68 29 7d 0d 0a 20 20  erTestPath)}..  
14bc0 20 20 20 20 20 20 20 20 63 61 74 63 68 20 7b 75          catch {u
14bd0 6e 73 65 74 20 3a 3a 65 6e 76 28 71 75 69 65 74  nset ::env(quiet
14be0 46 69 6e 64 49 6e 74 65 72 70 72 65 74 65 72 54  FindInterpreterT
14bf0 65 73 74 50 61 74 68 29 7d 0d 0a 20 20 20 20 20  estPath)}..     
14c00 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 20 65 72     }..      } er
14c10 72 6f 72 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20  ror] == 0} then 
14c20 7b 0d 0a 20 20 20 20 20 20 20 20 61 64 64 43 6f  {..        addCo
14c30 6e 73 74 72 61 69 6e 74 20 69 6e 74 65 72 72 75  nstraint interru
14c40 70 74 43 61 6c 6c 62 61 63 6b 2e 73 71 6c 69 74  ptCallback.sqlit
14c50 65 33 0d 0a 0d 0a 20 20 20 20 20 20 20 20 74 70  e3....        tp
14c60 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 79 65 73  uts $channel yes
14c70 5c 6e 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65  \n..      } else
14c80 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74   {..        tput
14c90 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  s $channel [appe
14ca0 6e 64 41 72 67 73 20 22 6e 6f 2c 20 65 72 72 6f  ndArgs "no, erro
14cb0 72 3a 20 22 20 5c 6e 5c 74 20 24 65 72 72 6f 72  r: " \n\t $error
14cc0 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20   \n]..      }.. 
14cd0 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
14ce0 63 20 63 6c 65 61 6e 75 70 46 69 6c 65 20 7b 20  c cleanupFile { 
14cf0 66 69 6c 65 4e 61 6d 65 20 7b 63 6f 6c 6c 65 63  fileName {collec
14d00 74 20 74 72 75 65 7d 20 7b 66 6f 72 63 65 20 66  t true} {force f
14d10 61 6c 73 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20  alse} } {..     
14d20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
14d30 3a 20 41 74 74 65 6d 70 74 20 74 6f 20 66 6f 72  : Attempt to for
14d40 63 65 20 61 6c 6c 20 70 65 6e 64 69 6e 67 20 22  ce all pending "
14d50 67 61 72 62 61 67 65 22 20 6f 62 6a 65 63 74 73  garbage" objects
14d60 20 74 6f 20 62 65 20 63 6f 6c 6c 65 63 74 65 64   to be collected
14d70 2c 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  ,..      #      
14d80 20 69 6e 63 6c 75 64 69 6e 67 20 53 51 4c 69 74   including SQLit
14d90 65 20 73 74 61 74 65 6d 65 6e 74 73 20 61 6e 64  e statements and
14da0 20 62 61 63 6b 75 70 20 6f 62 6a 65 63 74 73 3b   backup objects;
14db0 20 74 68 69 73 20 73 68 6f 75 6c 64 20 61 6c 6c   this should all
14dc0 6f 77 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  ow..      #     
14dd0 20 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67    the underlying
14de0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74   database file t
14df0 6f 20 62 65 20 64 65 6c 65 74 65 64 2e 0d 0a 20  o be deleted... 
14e00 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66       #..      if
14e10 20 7b 24 63 6f 6c 6c 65 63 74 7d 20 74 68 65 6e   {$collect} then
14e20 20 7b 0d 0a 20 20 20 20 20 20 20 20 63 6f 6c 6c   {..        coll
14e30 65 63 74 47 61 72 62 61 67 65 20 24 3a 3a 74 65  ectGarbage $::te
14e40 73 74 5f 63 68 61 6e 6e 65 6c 0d 0a 20 20 20 20  st_channel..    
14e50 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a    }....      #..
14e60 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68        # NOTE: Ch
14e70 65 63 6b 20 69 66 20 74 68 65 20 66 69 6c 65 20  eck if the file 
14e80 73 74 69 6c 6c 20 65 78 69 73 74 73 2e 0d 0a 20  still exists... 
14e90 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66       #..      if
14ea0 20 7b 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24   {[file exists $
14eb0 66 69 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20  fileName]} then 
14ec0 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
14ed0 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 6b        # NOTE: Sk
14ee0 69 70 20 64 65 6c 65 74 69 6e 67 20 74 65 73 74  ip deleting test
14ef0 20 66 69 6c 65 73 20 69 66 20 73 6f 6d 65 62 6f   files if somebo
14f00 64 79 20 73 65 74 73 20 74 68 65 20 67 6c 6f 62  dy sets the glob
14f10 61 6c 20 76 61 72 69 61 62 6c 65 0d 0a 20 20 20  al variable..   
14f20 20 20 20 20 20 23 20 20 20 20 20 20 20 74 6f 20       #       to 
14f30 70 72 65 76 65 6e 74 20 69 74 2e 0d 0a 20 20 20  prevent it...   
14f40 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
14f50 69 66 20 7b 24 66 6f 72 63 65 20 7c 7c 20 21 5b  if {$force || ![
14f60 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f  info exists ::no
14f70 28 63 6c 65 61 6e 75 70 46 69 6c 65 29 5d 7d 20  (cleanupFile)]} 
14f80 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
14f90 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23    #..          #
14fa0 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74 20 74   NOTE: Attempt t
14fb0 6f 20 64 65 6c 65 74 65 20 74 68 65 20 74 65 73  o delete the tes
14fc0 74 20 66 69 6c 65 20 6e 6f 77 2e 0d 0a 20 20 20  t file now...   
14fd0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
14fe0 20 20 20 20 69 66 20 7b 5b 73 65 74 20 63 6f 64      if {[set cod
14ff0 65 20 5b 63 61 74 63 68 20 7b 66 69 6c 65 20 64  e [catch {file d
15000 65 6c 65 74 65 20 24 66 69 6c 65 4e 61 6d 65 7d  elete $fileName}
15010 20 65 72 72 6f 72 5d 5d 7d 20 74 68 65 6e 20 7b   error]]} then {
15020 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 0d  ..            #.
15030 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4e  .            # N
15040 4f 54 45 3a 20 57 65 20 73 6f 6d 65 68 6f 77 20  OTE: We somehow 
15050 66 61 69 6c 65 64 20 74 6f 20 64 65 6c 65 74 65  failed to delete
15060 20 74 68 65 20 66 69 6c 65 2c 20 72 65 70 6f 72   the file, repor
15070 74 20 77 68 79 2e 0d 0a 20 20 20 20 20 20 20 20  t why...        
15080 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
15090 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
150a0 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  _channel [append
150b0 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
150c0 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41          "==== WA
150d0 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20 74 6f  RNING: failed to
150e0 20 64 65 6c 65 74 65 20 74 65 73 74 20 66 69 6c   delete test fil
150f0 65 20 5c 22 22 20 24 66 69 6c 65 4e 61 6d 65 20  e \"" $fileName 
15100 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
15110 20 20 20 22 5c 22 20 64 75 72 69 6e 67 20 63 6c     "\" during cl
15120 65 61 6e 75 70 2c 20 65 72 72 6f 72 3a 20 22 20  eanup, error: " 
15130 5c 6e 5c 74 20 24 65 72 72 6f 72 20 5c 6e 5d 0d  \n\t $error \n].
15140 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  .          }..  
15150 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
15160 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
15170 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53         # NOTE: S
15180 68 6f 77 20 74 68 61 74 20 77 65 20 73 6b 69 70  how that we skip
15190 70 65 64 20 64 65 6c 65 74 69 6e 67 20 74 68 65  ped deleting the
151a0 20 66 69 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20   file...        
151b0 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 73    #..          s
151c0 65 74 20 63 6f 64 65 20 30 0d 0a 0d 0a 20 20 20  et code 0....   
151d0 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
151e0 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70  test_channel [ap
151f0 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
15200 20 20 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20            "==== 
15210 57 41 52 4e 49 4e 47 3a 20 73 6b 69 70 70 65 64  WARNING: skipped
15220 20 64 65 6c 65 74 69 6e 67 20 74 65 73 74 20 66   deleting test f
15230 69 6c 65 20 5c 22 22 20 24 66 69 6c 65 4e 61 6d  ile \"" $fileNam
15240 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e \..           
15250 20 20 20 22 5c 22 20 64 75 72 69 6e 67 20 63 6c     "\" during cl
15260 65 61 6e 75 70 5c 6e 22 5d 0d 0a 20 20 20 20 20  eanup\n"]..     
15270 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 20 65 6c     }..      } el
15280 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d  se {..        #.
15290 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
152a0 20 54 68 65 20 66 69 6c 65 20 64 6f 65 73 20 6e   The file does n
152b0 6f 74 20 65 78 69 73 74 2c 20 73 75 63 63 65 73  ot exist, succes
152c0 73 21 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  s!..        #.. 
152d0 20 20 20 20 20 20 20 73 65 74 20 63 6f 64 65 20         set code 
152e0 30 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  0..      }....  
152f0 20 20 20 20 72 65 74 75 72 6e 20 24 63 6f 64 65      return $code
15300 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
15310 70 72 6f 63 20 63 6f 6c 6c 65 63 74 47 61 72 62  proc collectGarb
15320 61 67 65 20 7b 20 63 68 61 6e 6e 65 6c 20 7b 6d  age { channel {m
15330 69 6c 6c 69 73 65 63 6f 6e 64 73 20 31 30 30 30  illiseconds 1000
15340 7d 20 7b 71 75 69 65 74 20 74 72 75 65 7d 20 7d  } {quiet true} }
15350 20 7b 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 68   {..      if {[h
15360 61 76 65 53 51 4c 69 74 65 4f 62 6a 65 63 74 43  aveSQLiteObjectC
15370 6f 6d 6d 61 6e 64 5d 7d 20 74 68 65 6e 20 7b 0d  ommand]} then {.
15380 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61  .        if {[ca
15390 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  tch {..         
153a0 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 47   object invoke G
153b0 43 20 47 65 74 54 6f 74 61 6c 4d 65 6d 6f 72 79  C GetTotalMemory
153c0 20 66 61 6c 73 65 0d 0a 20 20 20 20 20 20 20 20   false..        
153d0 7d 20 72 65 73 75 6c 74 5d 20 3d 3d 20 30 7d 20  } result] == 0} 
153e0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
153f0 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74    if {!$quiet} t
15400 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
15410 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
15420 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
15430 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
15440 20 22 2d 2d 2d 2d 20 6d 65 6d 6f 72 79 20 69 6e   "---- memory in
15450 20 75 73 65 20 62 79 20 74 68 65 20 43 4c 52 20   use by the CLR 
15460 62 65 66 6f 72 65 20 63 6f 6c 6c 65 63 74 69 6f  before collectio
15470 6e 2e 2e 2e 20 22 20 5c 0d 0a 20 20 20 20 20 20  n... " \..      
15480 20 20 20 20 20 20 20 20 20 20 24 72 65 73 75 6c            $resul
15490 74 20 22 20 62 79 74 65 73 5c 6e 22 5d 0d 0a 20  t " bytes\n"].. 
154a0 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
154b0 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
154c0 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
154d0 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
154e0 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
154f0 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e      "==== WARNIN
15500 47 3a 20 66 61 69 6c 65 64 20 74 6f 20 67 65 74  G: failed to get
15510 20 43 4c 52 20 6d 65 6d 6f 72 79 20 75 73 61 67   CLR memory usag
15520 65 2c 20 65 72 72 6f 72 3a 20 22 20 5c 0d 0a 20  e, error: " \.. 
15530 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 6e 5c               \n\
15540 74 20 24 72 65 73 75 6c 74 20 5c 6e 5d 0d 0a 20  t $result \n].. 
15550 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
15560 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 23 23 23 23  }....      #####
15570 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
15580 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
15590 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
155a0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
155b0 23 23 23 23 0d 0a 0d 0a 20 20 20 20 20 20 23 0d  ####....      #.
155c0 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 52  .      # NOTE: R
155d0 65 70 65 61 74 65 64 6c 79 20 61 74 74 65 6d 70  epeatedly attemp
155e0 74 20 74 6f 20 63 6f 6c 6c 65 63 74 20 67 61 72  t to collect gar
155f0 62 61 67 65 20 75 6e 74 69 6c 20 74 68 65 20 61  bage until the a
15600 6c 6c 6f 74 74 65 64 20 6e 75 6d 62 65 72 0d 0a  llotted number..
15610 20 20 20 20 20 20 23 20 20 20 20 20 20 20 6f 66        #       of
15620 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20 68 61   milliseconds ha
15630 73 20 65 6c 61 70 73 65 64 2e 20 20 41 6c 77 61  s elapsed.  Alwa
15640 79 73 20 61 74 74 65 6d 70 74 20 74 6f 20 63 6f  ys attempt to co
15650 6c 6c 65 63 74 20 67 61 72 62 61 67 65 0d 0a 20  llect garbage.. 
15660 20 20 20 20 20 23 20 20 20 20 20 20 20 61 74 20       #       at 
15670 6c 65 61 73 74 20 6f 6e 63 65 2e 0d 0a 20 20 20  least once...   
15680 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
15690 5b 68 61 76 65 53 51 4c 69 74 65 4f 62 6a 65 63  [haveSQLiteObjec
156a0 74 43 6f 6d 6d 61 6e 64 5d 7d 20 74 68 65 6e 20  tCommand]} then 
156b0 7b 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 73  {..        set s
156c0 74 61 72 74 20 5b 63 6c 6f 63 6b 20 73 65 63 6f  tart [clock seco
156d0 6e 64 73 5d 0d 0a 20 20 20 20 20 20 20 20 73 65  nds]..        se
156e0 74 20 73 74 6f 70 20 5b 65 78 70 72 20 7b 24 73  t stop [expr {$s
156f0 74 61 72 74 20 2b 20 28 24 6d 69 6c 6c 69 73 65  tart + ($millise
15700 63 6f 6e 64 73 20 2f 20 31 30 30 30 29 7d 5d 0d  conds / 1000)}].
15710 0a 0d 0a 20 20 20 20 20 20 20 20 64 6f 20 7b 0d  ...        do {.
15720 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
15730 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
15740 41 74 74 65 6d 70 74 20 74 6f 20 66 6f 72 63 65  Attempt to force
15750 20 61 20 66 75 6c 6c 20 67 61 72 62 61 67 65 20   a full garbage 
15760 63 6f 6c 6c 65 63 74 69 6f 6e 20 6e 6f 77 2e 20  collection now. 
15770 20 52 65 70 6f 72 74 20 61 6e 79 0d 0a 20 20 20   Report any..   
15780 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 65         #       e
15790 72 72 6f 72 20 74 68 61 74 20 69 73 20 65 6e 63  rror that is enc
157a0 6f 75 6e 74 65 72 65 64 20 69 66 20 77 65 20 66  ountered if we f
157b0 61 69 6c 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  ail...          
157c0 23 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20  #..          if 
157d0 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20  {[catch {..     
157e0 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e         object in
157f0 76 6f 6b 65 20 47 43 20 47 65 74 54 6f 74 61 6c  voke GC GetTotal
15800 4d 65 6d 6f 72 79 20 74 72 75 65 0d 0a 20 20 20  Memory true..   
15810 20 20 20 20 20 20 20 7d 20 65 72 72 6f 72 5d 7d         } error]}
15820 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
15830 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
15840 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
15850 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
15860 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47     "==== WARNING
15870 3a 20 66 61 69 6c 65 64 20 66 75 6c 6c 20 67 61  : failed full ga
15880 72 62 61 67 65 20 63 6f 6c 6c 65 63 74 69 6f 6e  rbage collection
15890 2c 20 65 72 72 6f 72 3a 20 22 20 5c 0d 0a 20 20  , error: " \..  
158a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 6e                \n
158b0 5c 74 20 24 65 72 72 6f 72 20 5c 6e 5d 0d 0a 20  \t $error \n].. 
158c0 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20           }....  
158d0 20 20 20 20 20 20 20 20 73 65 74 20 6e 6f 77 20          set now 
158e0 5b 63 6c 6f 63 6b 20 73 65 63 6f 6e 64 73 5d 0d  [clock seconds].
158f0 0a 20 20 20 20 20 20 20 20 7d 20 77 68 69 6c 65  .        } while
15900 20 7b 24 73 74 61 72 74 20 3c 3d 20 24 6e 6f 77   {$start <= $now
15910 20 26 26 20 24 6e 6f 77 20 3c 20 24 73 74 6f 70   && $now < $stop
15920 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  }..      }....  
15930 20 20 20 20 23 23 23 23 23 23 23 23 23 23 23 23      ############
15940 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
15950 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
15960 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
15970 23 23 23 23 23 23 23 23 23 23 23 23 23 0d 0a 0d  #############...
15980 0a 20 20 20 20 20 20 69 66 20 7b 5b 68 61 76 65  .      if {[have
15990 53 51 4c 69 74 65 4f 62 6a 65 63 74 43 6f 6d 6d  SQLiteObjectComm
159a0 61 6e 64 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  and]} then {..  
159b0 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68        if {[catch
159c0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 6f 62   {..          ob
159d0 6a 65 63 74 20 69 6e 76 6f 6b 65 20 47 43 20 47  ject invoke GC G
159e0 65 74 54 6f 74 61 6c 4d 65 6d 6f 72 79 20 66 61  etTotalMemory fa
159f0 6c 73 65 0d 0a 20 20 20 20 20 20 20 20 7d 20 72  lse..        } r
15a00 65 73 75 6c 74 5d 20 3d 3d 20 30 7d 20 74 68 65  esult] == 0} the
15a10 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69  n {..          i
15a20 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e  f {!$quiet} then
15a30 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
15a40 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b  tputs $channel [
15a50 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
15a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d                "-
15a70 2d 2d 2d 20 6d 65 6d 6f 72 79 20 69 6e 20 75 73  --- memory in us
15a80 65 20 62 79 20 74 68 65 20 43 4c 52 20 61 66 74  e by the CLR aft
15a90 65 72 20 63 6f 6c 6c 65 63 74 69 6f 6e 2e 2e 2e  er collection...
15aa0 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20   " \..          
15ab0 20 20 20 20 20 20 24 72 65 73 75 6c 74 20 22 20        $result " 
15ac0 62 79 74 65 73 5c 6e 22 5d 0d 0a 20 20 20 20 20  bytes\n"]..     
15ad0 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
15ae0 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
15af0 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
15b00 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
15b10 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
15b20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66  "==== WARNING: f
15b30 61 69 6c 65 64 20 74 6f 20 67 65 74 20 43 4c 52  ailed to get CLR
15b40 20 6d 65 6d 6f 72 79 20 75 73 61 67 65 2c 20 65   memory usage, e
15b50 72 72 6f 72 3a 20 22 20 5c 0d 0a 20 20 20 20 20  rror: " \..     
15b60 20 20 20 20 20 20 20 20 20 5c 6e 5c 74 20 24 72           \n\t $r
15b70 65 73 75 6c 74 20 5c 6e 5d 0d 0a 20 20 20 20 20  esult \n]..     
15b80 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20     }..      }.. 
15b90 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
15ba0 63 20 67 65 74 53 51 4c 69 74 65 48 61 6e 64 6c  c getSQLiteHandl
15bb0 65 43 6f 75 6e 74 73 20 7b 20 63 68 61 6e 6e 65  eCounts { channe
15bc0 6c 20 7b 71 75 69 65 74 20 66 61 6c 73 65 7d 20  l {quiet false} 
15bd0 7d 20 7b 0d 0a 20 20 20 20 20 20 73 65 74 20 72  } {..      set r
15be0 65 73 75 6c 74 20 5b 6c 69 73 74 5d 0d 0a 0d 0a  esult [list]....
15bf0 20 20 20 20 20 20 69 66 20 7b 5b 68 61 76 65 53        if {[haveS
15c00 51 4c 69 74 65 4f 62 6a 65 63 74 43 6f 6d 6d 61  QLiteObjectComma
15c10 6e 64 5d 20 26 26 20 5b 68 61 76 65 43 6f 6e 73  nd] && [haveCons
15c20 74 72 61 69 6e 74 20 5c 0d 0a 20 20 20 20 20 20  traint \..      
15c30 20 20 20 20 20 20 20 20 64 65 66 69 6e 65 43 6f          defineCo
15c40 6e 73 74 61 6e 74 2e 53 79 73 74 65 6d 2e 44 61  nstant.System.Da
15c50 74 61 2e 53 51 4c 69 74 65 2e 43 4f 55 4e 54 5f  ta.SQLite.COUNT_
15c60 48 41 4e 44 4c 45 5d 7d 20 74 68 65 6e 20 7b 0d  HANDLE]} then {.
15c70 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
15c80 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 64 64 20      # NOTE: Add 
15c90 65 61 63 68 20 63 72 69 74 69 63 61 6c 20 68 61  each critical ha
15ca0 6e 64 6c 65 20 63 6f 75 6e 74 20 74 6f 20 74 68  ndle count to th
15cb0 65 20 72 65 73 75 6c 74 69 6e 67 20 6c 69 73 74  e resulting list
15cc0 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
15cd0 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 6e 61        foreach na
15ce0 6d 65 20 5b 6c 69 73 74 20 63 6f 6e 6e 65 63 74  me [list connect
15cf0 69 6f 6e 43 6f 75 6e 74 20 73 74 61 74 65 6d 65  ionCount stateme
15d00 6e 74 43 6f 75 6e 74 20 62 61 63 6b 75 70 43 6f  ntCount backupCo
15d10 75 6e 74 5d 20 7b 0d 0a 20 20 20 20 20 20 20 20  unt] {..        
15d20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a    if {[catch {..
15d30 20 20 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65              obje
15d40 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73  ct invoke -flags
15d50 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20   +NonPublic \.. 
15d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
15d70 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
15d80 65 2e 55 6e 73 61 66 65 4e 61 74 69 76 65 4d 65  e.UnsafeNativeMe
15d90 74 68 6f 64 73 20 24 6e 61 6d 65 0d 0a 20 20 20  thods $name..   
15da0 20 20 20 20 20 20 20 7d 20 76 61 6c 75 65 5d 20         } value] 
15db0 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  == 0} then {..  
15dc0 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 24            if {!$
15dd0 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20  quiet} then {.. 
15de0 20 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75               tpu
15df0 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70  ts $channel [app
15e00 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
15e10 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d               "--
15e20 2d 2d 20 63 72 69 74 69 63 61 6c 20 68 61 6e 64  -- critical hand
15e30 6c 65 20 63 6f 75 6e 74 20 5c 22 22 20 24 6e 61  le count \"" $na
15e40 6d 65 20 22 5c 22 20 69 73 20 22 20 24 76 61 6c  me "\" is " $val
15e50 75 65 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20  ue \n]..        
15e60 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
15e70 20 20 20 20 20 6c 61 70 70 65 6e 64 20 72 65 73       lappend res
15e80 75 6c 74 20 24 76 61 6c 75 65 0d 0a 20 20 20 20  ult $value..    
15e90 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
15ea0 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
15eb0 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  s $channel [appe
15ec0 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
15ed0 20 20 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20            "==== 
15ee0 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20  WARNING: failed 
15ef0 74 6f 20 67 65 74 20 63 72 69 74 69 63 61 6c 20  to get critical 
15f00 68 61 6e 64 6c 65 20 63 6f 75 6e 74 20 5c 22 22  handle count \""
15f10 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
15f20 20 20 20 20 24 6e 61 6d 65 20 22 5c 22 2c 20 65      $name "\", e
15f30 72 72 6f 72 3a 20 22 20 5c 6e 5c 74 20 24 76 61  rror: " \n\t $va
15f40 6c 75 65 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20  lue \n]..       
15f50 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d     }..        }.
15f60 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 69 66 20  .      } elseif 
15f70 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b  {!$quiet} then {
15f80 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
15f90 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 65       # NOTE: The
15fa0 20 61 63 74 75 61 6c 20 68 61 6e 64 6c 65 20 63   actual handle c
15fb0 6f 75 6e 74 73 20 61 72 65 20 6e 6f 74 20 61 76  ounts are not av
15fc0 61 69 6c 61 62 6c 65 3b 20 74 68 65 72 65 66 6f  ailable; therefo
15fd0 72 65 2c 20 6a 75 73 74 0d 0a 20 20 20 20 20 20  re, just..      
15fe0 20 20 23 20 20 20 20 20 20 20 72 65 74 75 72 6e    #       return
15ff0 20 61 6e 20 65 6d 70 74 79 20 6c 69 73 74 2e 0d   an empty list..
16000 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
16010 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
16020 65 6c 20 22 2d 2d 2d 2d 20 63 72 69 74 69 63 61  el "---- critica
16030 6c 20 68 61 6e 64 6c 65 20 63 6f 75 6e 74 73 20  l handle counts 
16040 75 6e 61 76 61 69 6c 61 62 6c 65 5c 6e 22 0d 0a  unavailable\n"..
16050 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
16060 20 72 65 74 75 72 6e 20 24 72 65 73 75 6c 74 0d   return $result.
16070 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70  .    }.....    p
16080 72 6f 63 20 73 68 75 74 64 6f 77 6e 53 51 4c 69  roc shutdownSQLi
16090 74 65 20 7b 20 63 68 61 6e 6e 65 6c 20 7b 66 6f  te { channel {fo
160a0 72 63 65 20 66 61 6c 73 65 7d 20 7b 71 75 69 65  rce false} {quie
160b0 74 20 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a 20 20  t false} } {..  
160c0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
160d0 4f 54 45 3a 20 4d 61 6b 65 20 73 75 72 65 20 74  OTE: Make sure t
160e0 68 61 74 20 53 51 4c 69 74 65 20 63 6f 72 65 20  hat SQLite core 
160f0 6c 69 62 72 61 72 79 20 69 73 20 63 6f 6d 70 6c  library is compl
16100 65 74 65 6c 79 20 73 68 75 74 64 6f 77 6e 2e 20  etely shutdown. 
16110 20 54 68 69 73 0d 0a 20 20 20 20 20 20 23 20 20   This..      #  
16120 20 20 20 20 20 69 73 20 75 73 65 64 20 62 79 20       is used by 
16130 74 65 73 74 73 20 74 68 61 74 20 63 68 61 6e 67  tests that chang
16140 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  e configuration 
16150 6f 70 74 69 6f 6e 73 20 61 6e 64 2f 6f 72 20 74  options and/or t
16160 68 6f 73 65 0d 0a 20 20 20 20 20 20 23 20 20 20  hose..      #   
16170 20 20 20 20 74 68 61 74 20 6e 65 65 64 20 74 6f      that need to
16180 20 6d 61 6b 65 20 73 75 72 65 20 6c 6f 67 67 69   make sure loggi
16190 6e 67 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65  ng is initialize
161a0 64 20 28 69 2e 65 2e 20 6a 75 73 74 20 69 6e 20  d (i.e. just in 
161b0 63 61 73 65 0d 0a 20 20 20 20 20 20 23 20 20 20  case..      #   
161c0 20 20 20 20 74 68 65 20 53 51 4c 69 74 65 20 63      the SQLite c
161d0 6f 72 65 20 6c 69 62 72 61 72 79 20 77 61 73 20  ore library was 
161e0 69 6e 69 74 69 61 6c 69 7a 65 64 20 69 6e 20 74  initialized in t
161f0 68 65 20 70 72 6f 63 65 73 73 20 70 72 69 6f 72  he process prior
16200 20 74 6f 0d 0a 20 20 20 20 20 20 23 20 20 20 20   to..      #    
16210 20 20 20 74 68 65 20 53 51 4c 69 74 65 4c 6f 67     the SQLiteLog
16220 20 63 6c 61 73 73 20 62 65 69 6e 67 20 61 62 6c   class being abl
16230 65 20 74 6f 20 73 65 74 75 70 20 69 74 73 20 6c  e to setup its l
16240 6f 67 67 69 6e 67 20 63 61 6c 6c 62 61 63 6b 29  ogging callback)
16250 2e 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  ...      #      
16260 20 4e 6f 72 6d 61 6c 6c 79 2c 20 74 68 69 73 20   Normally, this 
16270 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20 70  should only be p
16280 65 72 66 6f 72 6d 65 64 20 69 66 20 53 51 4c 69  erformed if SQLi
16290 74 65 20 69 73 20 6c 6f 61 64 65 64 20 61 6e 64  te is loaded and
162a0 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
162b0 72 65 61 64 79 20 66 6f 72 20 75 73 65 20 62 79  ready for use by
162c0 20 74 68 65 20 74 65 73 74 20 73 75 69 74 65 2e   the test suite.
162d0 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
162e0 20 69 66 20 7b 24 66 6f 72 63 65 20 7c 7c 20 5b   if {$force || [
162f0 69 73 53 51 4c 69 74 65 52 65 61 64 79 5d 7d 20  isSQLiteReady]} 
16300 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
16310 23 0d 0a 20 20 20 20 20 20 20 20 23 20 42 55 47  #..        # BUG
16320 46 49 58 3a 20 4d 61 6b 65 20 73 75 72 65 20 74  FIX: Make sure t
16330 68 61 74 20 61 6e 79 20 22 6c 65 61 6b 65 64 22  hat any "leaked"
16340 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 61 6e   transactions an
16350 64 2f 6f 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  d/or connections
16360 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
16370 20 20 20 20 61 72 65 20 63 6c 65 61 6e 65 64 20      are cleaned 
16380 75 70 20 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e  up before callin
16390 67 20 74 68 65 20 6e 61 74 69 76 65 20 73 68 75  g the native shu
163a0 74 64 6f 77 6e 20 66 75 6e 63 74 69 6f 6e 2e 0d  tdown function..
163b0 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
163c0 20 20 20 20 66 6f 72 65 61 63 68 20 74 72 61 6e      foreach tran
163d0 73 61 63 74 69 6f 6e 20 5b 69 6e 66 6f 20 74 72  saction [info tr
163e0 61 6e 73 61 63 74 69 6f 6e 73 5d 20 7b 0d 0a 20  ansactions] {.. 
163f0 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73 74           if {[st
16400 72 69 6e 67 20 6d 61 74 63 68 20 5c 0d 0a 20 20  ring match \..  
16410 20 20 20 20 20 20 20 20 20 20 20 20 53 79 73 74              Syst
16420 65 6d 23 44 61 74 61 23 53 51 4c 69 74 65 23 53  em#Data#SQLite#S
16430 51 4c 69 74 65 54 72 61 6e 73 61 63 74 69 6f 6e  QLiteTransaction
16440 23 2a 20 24 74 72 61 6e 73 61 63 74 69 6f 6e 5d  #* $transaction]
16450 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
16460 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68        if {[catch
16470 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
16480 20 20 73 71 6c 20 74 72 61 6e 73 61 63 74 69 6f    sql transactio
16490 6e 20 72 6f 6c 6c 62 61 63 6b 20 24 74 72 61 6e  n rollback $tran
164a0 73 61 63 74 69 6f 6e 0d 0a 20 20 20 20 20 20 20  saction..       
164b0 20 20 20 20 20 7d 20 65 72 72 6f 72 5d 20 3d 3d       } error] ==
164c0 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
164d0 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 24            if {!$
164e0 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20  quiet} then {.. 
164f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
16500 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61  puts $channel [a
16510 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
16520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16530 20 22 2d 2d 2d 2d 20 72 6f 6c 6c 65 64 20 62 61   "---- rolled ba
16540 63 6b 20 6c 65 61 6b 65 64 20 74 72 61 6e 73 61  ck leaked transa
16550 63 74 69 6f 6e 20 5c 22 22 20 5c 0d 0a 20 20 20  ction \"" \..   
16560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16570 20 24 74 72 61 6e 73 61 63 74 69 6f 6e 20 5c 22   $transaction \"
16580 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20  \n]..           
16590 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
165a0 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
165b0 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 24            if {!$
165c0 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20  quiet} then {.. 
165d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
165e0 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61  puts $channel [a
165f0 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
16600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16610 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20   "==== WARNING: 
16620 66 61 69 6c 65 64 20 74 6f 20 72 6f 6c 6c 62 61  failed to rollba
16630 63 6b 20 6c 65 61 6b 65 64 20 74 72 61 6e 73 61  ck leaked transa
16640 63 74 69 6f 6e 20 5c 22 22 20 5c 0d 0a 20 20 20  ction \"" \..   
16650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16660 20 24 74 72 61 6e 73 61 63 74 69 6f 6e 20 22 5c   $transaction "\
16670 22 2c 20 65 72 72 6f 72 3a 20 22 20 5c 6e 5c 74  ", error: " \n\t
16680 20 24 65 72 72 6f 72 20 5c 6e 5d 0d 0a 20 20 20   $error \n]..   
16690 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
166a0 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
166b0 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
166c0 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 66    }....        f
166d0 6f 72 65 61 63 68 20 64 62 20 5b 69 6e 66 6f 20  oreach db [info 
166e0 63 6f 6e 6e 65 63 74 69 6f 6e 73 5d 20 7b 0d 0a  connections] {..
166f0 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73            if {[s
16700 74 72 69 6e 67 20 6d 61 74 63 68 20 5c 0d 0a 20  tring match \.. 
16710 20 20 20 20 20 20 20 20 20 20 20 20 20 53 79 73               Sys
16720 74 65 6d 23 44 61 74 61 23 53 51 4c 69 74 65 23  tem#Data#SQLite#
16730 53 51 4c 69 74 65 43 6f 6e 6e 65 63 74 69 6f 6e  SQLiteConnection
16740 23 2a 20 24 64 62 5d 7d 20 74 68 65 6e 20 7b 0d  #* $db]} then {.
16750 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20  .            if 
16760 7b 5b 63 61 74 63 68 20 7b 73 71 6c 20 63 6c 6f  {[catch {sql clo
16770 73 65 20 24 64 62 7d 20 65 72 72 6f 72 5d 20 3d  se $db} error] =
16780 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  = 0} then {..   
16790 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21             if {!
167a0 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a  $quiet} then {..
167b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
167c0 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b  tputs $channel [
167d0 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
167e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
167f0 20 20 22 2d 2d 2d 2d 20 63 6c 6f 73 65 64 20 6c    "---- closed l
16800 65 61 6b 65 64 20 64 61 74 61 62 61 73 65 20 5c  eaked database \
16810 22 22 20 24 64 62 20 5c 22 5c 6e 5d 0d 0a 20 20  "" $db \"\n]..  
16820 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
16830 20 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73             } els
16840 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e {..           
16850 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20     if {!$quiet} 
16860 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
16870 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
16880 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
16890 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
168a0 20 20 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20            "==== 
168b0 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20  WARNING: failed 
168c0 74 6f 20 63 6c 6f 73 65 20 6c 65 61 6b 65 64 20  to close leaked 
168d0 64 61 74 61 62 61 73 65 20 5c 22 22 20 5c 0d 0a  database \"" \..
168e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
168f0 20 20 20 20 24 64 62 20 22 5c 22 2c 20 65 72 72      $db "\", err
16900 6f 72 3a 20 22 20 5c 6e 5c 74 20 24 65 72 72 6f  or: " \n\t $erro
16910 72 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20  r \n]..         
16920 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
16930 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
16940 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d   }..        }...
16950 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
16960 20 20 20 20 23 20 42 55 47 46 49 58 3a 20 42 65      # BUGFIX: Be
16970 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 74 68 65  fore calling the
16980 20 6e 61 74 69 76 65 20 73 68 75 74 64 6f 77 6e   native shutdown
16990 20 66 75 6e 63 74 69 6f 6e 2c 20 6d 61 6b 65 20   function, make 
169a0 73 75 72 65 20 62 6f 74 68 0d 0a 20 20 20 20 20  sure both..     
169b0 20 20 20 23 20 20 20 20 20 20 20 20 20 6f 66 20     #         of 
169c0 74 68 65 20 50 52 41 47 4d 41 20 72 65 6c 61 74  the PRAGMA relat
169d0 65 64 20 64 69 72 65 63 74 6f 72 79 20 6e 61 6d  ed directory nam
169e0 65 73 20 61 72 65 20 66 72 65 65 64 2e 0d 0a 20  es are freed... 
169f0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
16a00 20 20 63 68 65 63 6b 46 6f 72 53 51 4c 69 74 65    checkForSQLite
16a10 44 69 72 65 63 74 6f 72 69 65 73 20 24 63 68 61  Directories $cha
16a20 6e 6e 65 6c 20 74 72 75 65 0d 0a 0d 0a 20 20 20  nnel true....   
16a30 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20       if {[catch 
16a40 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 6f 62 6a  {..          obj
16a50 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67  ect invoke -flag
16a60 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a  s +NonPublic \..
16a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 79                Sy
16a80 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
16a90 2e 55 6e 73 61 66 65 4e 61 74 69 76 65 4d 65 74  .UnsafeNativeMet
16aa0 68 6f 64 73 20 73 71 6c 69 74 65 33 5f 73 68 75  hods sqlite3_shu
16ab0 74 64 6f 77 6e 0d 0a 20 20 20 20 20 20 20 20 7d  tdown..        }
16ac0 20 72 65 73 75 6c 74 5d 20 3d 3d 20 30 7d 20 74   result] == 0} t
16ad0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
16ae0 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68   if {!$quiet} th
16af0 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
16b00 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
16b10 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
16b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16b30 22 2d 2d 2d 2d 20 63 61 6c 6c 20 73 71 6c 69 74  "---- call sqlit
16b40 65 33 5f 73 68 75 74 64 6f 77 6e 28 29 2e 2e 2e  e3_shutdown()...
16b50 20 6f 6b 3a 20 22 20 24 72 65 73 75 6c 74 20 5c   ok: " $result \
16b60 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d  n]..          }.
16b70 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20  .        } else 
16b80 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20  {..          if 
16b90 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b  {!$quiet} then {
16ba0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70  ..            tp
16bb0 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70  uts $channel [ap
16bc0 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
16bd0 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
16be0 2d 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 5f 73  - call sqlite3_s
16bf0 68 75 74 64 6f 77 6e 28 29 2e 2e 2e 20 65 72 72  hutdown()... err
16c00 6f 72 3a 20 22 20 5c 6e 5c 74 20 24 72 65 73 75  or: " \n\t $resu
16c10 6c 74 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20  lt \n]..        
16c20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a    }..        }..
16c30 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a        }..    }..
16c40 0c 0d 0a 20 20 20 20 70 72 6f 63 20 72 65 70 6f  ...    proc repo
16c50 72 74 53 51 4c 69 74 65 52 65 73 6f 75 72 63 65  rtSQLiteResource
16c60 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s {..           
16c70 20 63 68 61 6e 6e 65 6c 20 7b 71 75 69 65 74 20   channel {quiet 
16c80 66 61 6c 73 65 7d 20 7b 72 65 73 65 74 20 74 72  false} {reset tr
16c90 75 65 7d 20 7b 63 6f 6c 6c 65 63 74 20 74 72 75  ue} {collect tru
16ca0 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d  e} } {..      #.
16cb0 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49  .      # NOTE: I
16cc0 66 20 61 76 61 69 6c 61 62 6c 65 2c 20 72 65 70  f available, rep
16cd0 6f 72 74 20 6f 6e 20 28 61 6e 64 20 70 6f 73 73  ort on (and poss
16ce0 69 62 6c 79 20 72 65 73 65 74 29 20 74 68 65 20  ibly reset) the 
16cf0 72 75 6e 74 69 6d 65 0d 0a 20 20 20 20 20 20 23  runtime..      #
16d00 20 20 20 20 20 20 20 63 6f 6e 66 69 67 75 72 61         configura
16d10 74 69 6f 6e 20 73 74 61 74 69 73 74 69 63 73 2e  tion statistics.
16d20 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
16d30 20 69 66 20 7b 5b 68 61 76 65 53 51 4c 69 74 65   if {[haveSQLite
16d40 4f 62 6a 65 63 74 43 6f 6d 6d 61 6e 64 5d 20 26  ObjectCommand] &
16d50 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b  & \..          [
16d60 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 62  haveConstraint b
16d70 75 69 6c 64 43 6f 6e 66 69 67 75 72 61 74 69 6f  uildConfiguratio
16d80 6e 2e 44 65 62 75 67 5d 20 26 26 20 5b 63 61 74  n.Debug] && [cat
16d90 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 6f 62  ch {..        ob
16da0 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61  ject invoke -fla
16db0 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 2d 61  gs +NonPublic -a
16dc0 6c 69 61 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  lias \..        
16dd0 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e      System.Data.
16de0 53 51 4c 69 74 65 2e 55 6e 73 61 66 65 4e 61 74  SQLite.UnsafeNat
16df0 69 76 65 4d 65 74 68 6f 64 73 20 73 65 74 74 69  iveMethods setti
16e00 6e 67 52 65 61 64 43 6f 75 6e 74 73 0d 0a 20 20  ngReadCounts..  
16e10 20 20 20 20 7d 20 73 65 74 74 69 6e 67 52 65 61      } settingRea
16e20 64 43 6f 75 6e 74 73 5d 20 3d 3d 20 30 7d 20 74  dCounts] == 0} t
16e30 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 73  hen {..        s
16e40 65 74 20 6e 61 6d 65 43 6f 75 6e 74 20 5b 24 73  et nameCount [$s
16e50 65 74 74 69 6e 67 52 65 61 64 43 6f 75 6e 74 73  ettingReadCounts
16e60 20 43 6f 75 6e 74 5d 0d 0a 20 20 20 20 20 20 20   Count]..       
16e70 20 73 65 74 20 76 61 6c 75 65 43 6f 75 6e 74 20   set valueCount 
16e80 30 0d 0a 0d 0a 20 20 20 20 20 20 20 20 6f 62 6a  0....        obj
16e90 65 63 74 20 66 6f 72 65 61 63 68 20 2d 61 6c 69  ect foreach -ali
16ea0 61 73 20 70 61 69 72 20 24 73 65 74 74 69 6e 67  as pair $setting
16eb0 52 65 61 64 43 6f 75 6e 74 73 20 7b 0d 0a 20 20  ReadCounts {..  
16ec0 20 20 20 20 20 20 20 20 69 6e 63 72 20 76 61 6c          incr val
16ed0 75 65 43 6f 75 6e 74 20 5b 24 70 61 69 72 20 56  ueCount [$pair V
16ee0 61 6c 75 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  alue]....       
16ef0 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20     if {!$quiet} 
16f00 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
16f10 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
16f20 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
16f30 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
16f40 20 20 22 2d 2d 2d 2d 20 73 65 74 74 69 6e 67 20    "---- setting 
16f50 5c 22 22 20 5b 24 70 61 69 72 20 4b 65 79 5d 20  \"" [$pair Key] 
16f60 22 5c 22 20 77 61 73 20 72 65 61 64 20 22 20 5c  "\" was read " \
16f70 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
16f80 20 20 5b 24 70 61 69 72 20 56 61 6c 75 65 5d 20    [$pair Value] 
16f90 22 20 74 69 6d 65 73 5c 6e 22 5d 0d 0a 20 20 20  " times\n"]..   
16fa0 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
16fb0 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69    }....        i
16fc0 66 20 7b 24 72 65 73 65 74 7d 20 74 68 65 6e 20  f {$reset} then 
16fd0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20  {..          if 
16fe0 7b 5b 63 61 74 63 68 20 7b 24 73 65 74 74 69 6e  {[catch {$settin
16ff0 67 52 65 61 64 43 6f 75 6e 74 73 20 43 6c 65 61  gReadCounts Clea
17000 72 7d 20 65 72 72 6f 72 5d 20 3d 3d 20 30 7d 20  r} error] == 0} 
17010 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
17020 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d      if {!$quiet}
17030 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
17040 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
17050 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
17060 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
17070 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 72 65 73         "---- res
17080 65 74 20 73 65 74 74 69 6e 67 20 73 74 61 74 69  et setting stati
17090 73 74 69 63 73 20 66 6f 72 20 74 68 65 20 70 72  stics for the pr
170a0 65 76 69 6f 75 73 20 22 20 5c 0d 0a 20 20 20 20  evious " \..    
170b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 24 6e                $n
170c0 61 6d 65 43 6f 75 6e 74 20 22 20 6e 61 6d 65 73  ameCount " names
170d0 20 61 6e 64 20 22 20 24 76 61 6c 75 65 43 6f 75   and " $valueCou
170e0 6e 74 20 22 20 76 61 6c 75 65 73 20 72 65 61 64  nt " values read
170f0 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20 20 20  \n"]..          
17100 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d    }..          }
17110 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
17120 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
17130 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
17140 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
17150 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47     "==== WARNING
17160 3a 20 66 61 69 6c 65 64 20 74 6f 20 72 65 73 65  : failed to rese
17170 74 20 73 65 74 74 69 6e 67 20 73 74 61 74 69 73  t setting statis
17180 74 69 63 73 20 66 6f 72 20 22 20 5c 0d 0a 20 20  tics for " \..  
17190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 74                "t
171a0 68 65 20 70 72 65 76 69 6f 75 73 20 22 20 24 6e  he previous " $n
171b0 61 6d 65 43 6f 75 6e 74 20 22 20 6e 61 6d 65 73  ameCount " names
171c0 20 61 6e 64 20 22 20 24 76 61 6c 75 65 43 6f 75   and " $valueCou
171d0 6e 74 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  nt \..          
171e0 20 20 20 20 20 20 22 20 76 61 6c 75 65 73 20 72        " values r
171f0 65 61 64 2c 20 65 72 72 6f 72 3a 20 22 20 5c 6e  ead, error: " \n
17200 5c 74 20 24 65 72 72 6f 72 20 5c 6e 5d 0d 0a 20  \t $error \n].. 
17210 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
17220 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a      }..      }..
17230 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 68 61 76  ..      if {[hav
17240 65 53 51 4c 69 74 65 4f 62 6a 65 63 74 43 6f 6d  eSQLiteObjectCom
17250 6d 61 6e 64 5d 20 26 26 20 5b 68 61 76 65 43 6f  mand] && [haveCo
17260 6e 73 74 72 61 69 6e 74 20 5c 0d 0a 20 20 20 20  nstraint \..    
17270 20 20 20 20 20 20 20 20 20 20 64 65 66 69 6e 65            define
17280 43 6f 6e 73 74 61 6e 74 2e 53 79 73 74 65 6d 2e  Constant.System.
17290 44 61 74 61 2e 53 51 4c 69 74 65 2e 49 4e 54 45  Data.SQLite.INTE
172a0 52 4f 50 5f 56 49 52 54 55 41 4c 5f 54 41 42 4c  ROP_VIRTUAL_TABL
172b0 45 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20  E] && \..       
172c0 20 20 20 5b 68 61 76 65 43 6f 6e 73 74 72 61 69     [haveConstrai
172d0 6e 74 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  nt \..          
172e0 20 20 20 20 64 65 66 69 6e 65 43 6f 6e 73 74 61      defineConsta
172f0 6e 74 2e 53 79 73 74 65 6d 2e 44 61 74 61 2e 53  nt.System.Data.S
17300 51 4c 69 74 65 2e 54 52 41 43 4b 5f 4d 45 4d 4f  QLite.TRACK_MEMO
17310 52 59 5f 42 59 54 45 53 5d 7d 20 74 68 65 6e 20  RY_BYTES]} then 
17320 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21  {..        if {!
17330 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a  $quiet} then {..
17340 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
17350 24 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 63  $channel "---- c
17360 75 72 72 65 6e 74 20 6d 65 6d 6f 72 79 20 69 6e  urrent memory in
17370 20 75 73 65 20 62 79 20 53 51 4c 69 74 65 4d 65   use by SQLiteMe
17380 6d 6f 72 79 2e 2e 2e 20 22 0d 0a 20 20 20 20 20  mory... "..     
17390 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
173a0 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20  if {[catch {..  
173b0 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69          object i
173c0 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f  nvoke -flags +No
173d0 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20  nPublic \..     
173e0 20 20 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e           System.
173f0 44 61 74 61 2e 53 51 4c 69 74 65 2e 53 51 4c 69  Data.SQLite.SQLi
17400 74 65 4d 65 6d 6f 72 79 20 62 79 74 65 73 41 6c  teMemory bytesAl
17410 6c 6f 63 61 74 65 64 0d 0a 20 20 20 20 20 20 20  located..       
17420 20 7d 20 6d 65 6d 6f 72 79 5d 20 3d 3d 20 30 7d   } memory] == 0}
17430 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
17440 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20     if {!$quiet} 
17450 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
17460 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
17470 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 24  el [appendArgs $
17480 6d 65 6d 6f 72 79 20 22 20 62 79 74 65 73 5c 6e  memory " bytes\n
17490 22 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d  "]..          }.
174a0 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20  .        } else 
174b0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74  {..          set
174c0 20 6d 65 6d 6f 72 79 20 75 6e 6b 6e 6f 77 6e 0d   memory unknown.
174d0 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20  ...          if 
174e0 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b  {!$quiet} then {
174f0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70  ..            tp
17500 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70  uts $channel [ap
17510 70 65 6e 64 41 72 67 73 20 24 6d 65 6d 6f 72 79  pendArgs $memory
17520 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20   \n]..          
17530 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  }..        }....
17540 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75          if {!$qu
17550 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  iet} then {..   
17560 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
17570 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 6d 61 78 69  annel "---- maxi
17580 6d 75 6d 20 6d 65 6d 6f 72 79 20 69 6e 20 75 73  mum memory in us
17590 65 20 62 79 20 53 51 4c 69 74 65 4d 65 6d 6f 72  e by SQLiteMemor
175a0 79 2e 2e 2e 20 22 0d 0a 20 20 20 20 20 20 20 20  y... "..        
175b0 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20  }....        if 
175c0 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20  {[catch {..     
175d0 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f       object invo
175e0 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75  ke -flags +NonPu
175f0 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20 20 20  blic \..        
17600 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74        System.Dat
17610 61 2e 53 51 4c 69 74 65 2e 53 51 4c 69 74 65 4d  a.SQLite.SQLiteM
17620 65 6d 6f 72 79 20 6d 61 78 69 6d 75 6d 42 79 74  emory maximumByt
17630 65 73 41 6c 6c 6f 63 61 74 65 64 0d 0a 20 20 20  esAllocated..   
17640 20 20 20 20 20 7d 20 6d 65 6d 6f 72 79 5d 20 3d       } memory] =
17650 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  = 0} then {..   
17660 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69         if {!$qui
17670 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  et} then {..    
17680 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
17690 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
176a0 67 73 20 24 6d 65 6d 6f 72 79 20 22 20 62 79 74  gs $memory " byt
176b0 65 73 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20  es\n"]..        
176c0 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 20 65    }..        } e
176d0 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  lse {..         
176e0 20 73 65 74 20 6d 65 6d 6f 72 79 20 75 6e 6b 6e   set memory unkn
176f0 6f 77 6e 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  own....         
17700 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68   if {!$quiet} th
17710 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
17720 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
17730 20 5b 61 70 70 65 6e 64 41 72 67 73 20 24 6d 65   [appendArgs $me
17740 6d 6f 72 79 20 5c 6e 5d 0d 0a 20 20 20 20 20 20  mory \n]..      
17750 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d      }..        }
17760 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
17770 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20     if {!$quiet} 
17780 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
17790 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 22  tputs $channel "
177a0 2d 2d 2d 2d 20 63 75 72 72 65 6e 74 20 6d 65 6d  ---- current mem
177b0 6f 72 79 20 69 6e 20 75 73 65 20 62 79 20 53 51  ory in use by SQ
177c0 4c 69 74 65 2e 2e 2e 20 22 0d 0a 20 20 20 20 20  Lite... "..     
177d0 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b   }....      if {
177e0 5b 68 61 76 65 53 51 4c 69 74 65 4f 62 6a 65 63  [haveSQLiteObjec
177f0 74 43 6f 6d 6d 61 6e 64 5d 7d 20 74 68 65 6e 20  tCommand]} then 
17800 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b  {..        if {[
17810 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20  catch {..       
17820 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65     object invoke
17830 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c   -flags +NonPubl
17840 69 63 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  ic \..          
17850 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e      System.Data.
17860 53 51 4c 69 74 65 2e 55 6e 73 61 66 65 4e 61 74  SQLite.UnsafeNat
17870 69 76 65 4d 65 74 68 6f 64 73 20 73 71 6c 69 74  iveMethods sqlit
17880 65 33 5f 6d 65 6d 6f 72 79 5f 75 73 65 64 0d 0a  e3_memory_used..
17890 20 20 20 20 20 20 20 20 7d 20 6d 65 6d 6f 72 79          } memory
178a0 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  ] == 0} then {..
178b0 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 24            if {!$
178c0 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20  quiet} then {.. 
178d0 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
178e0 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e   $channel [appen
178f0 64 41 72 67 73 20 24 6d 65 6d 6f 72 79 20 22 20  dArgs $memory " 
17900 62 79 74 65 73 5c 6e 22 5d 0d 0a 20 20 20 20 20  bytes\n"]..     
17910 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
17920 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
17930 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
17940 20 23 20 4e 4f 54 45 3a 20 4d 61 79 62 65 20 74   # NOTE: Maybe t
17950 68 65 20 53 51 4c 69 74 65 20 63 6f 72 65 20 6c  he SQLite core l
17960 69 62 72 61 72 79 20 69 73 20 75 6e 61 76 61 69  ibrary is unavai
17970 6c 61 62 6c 65 3f 0d 0a 20 20 20 20 20 20 20 20  lable?..        
17980 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 73    #..          s
17990 65 74 20 6d 65 6d 6f 72 79 20 75 6e 6b 6e 6f 77  et memory unknow
179a0 6e 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 69  n....          i
179b0 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e  f {!$quiet} then
179c0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
179d0 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b  tputs $channel [
179e0 61 70 70 65 6e 64 41 72 67 73 20 24 6d 65 6d 6f  appendArgs $memo
179f0 72 79 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20  ry \n]..        
17a00 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a    }..        }..
17a10 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
17a20 20 20 20 20 20 20 20 20 73 65 74 20 6d 65 6d 6f          set memo
17a30 72 79 20 75 6e 61 76 61 69 6c 61 62 6c 65 0d 0a  ry unavailable..
17a40 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21 24  ..        if {!$
17a50 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20  quiet} then {.. 
17a60 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
17a70 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
17a80 72 67 73 20 24 6d 65 6d 6f 72 79 20 5c 6e 5d 0d  rgs $memory \n].
17a90 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  .        }..    
17aa0 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 73 65 74    }....      set
17ab0 20 72 65 73 75 6c 74 20 24 6d 65 6d 6f 72 79 3b   result $memory;
17ac0 20 23 20 4e 4f 54 45 3a 20 52 65 74 75 72 6e 20   # NOTE: Return 
17ad0 6d 65 6d 6f 72 79 20 69 6e 2d 75 73 65 20 74 6f  memory in-use to
17ae0 20 6f 75 72 20 63 61 6c 6c 65 72 2e 0d 0a 0d 0a   our caller.....
17af0 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65        if {!$quie
17b00 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  t} then {..     
17b10 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
17b20 6c 20 22 2d 2d 2d 2d 20 6d 61 78 69 6d 75 6d 20  l "---- maximum 
17b30 6d 65 6d 6f 72 79 20 69 6e 20 75 73 65 20 62 79  memory in use by
17b40 20 53 51 4c 69 74 65 2e 2e 2e 20 22 0d 0a 20 20   SQLite... "..  
17b50 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 69      }....      i
17b60 66 20 7b 5b 68 61 76 65 53 51 4c 69 74 65 4f 62  f {[haveSQLiteOb
17b70 6a 65 63 74 43 6f 6d 6d 61 6e 64 5d 7d 20 74 68  jectCommand]} th
17b80 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66  en {..        if
17b90 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20   {[catch {..    
17ba0 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76        object inv
17bb0 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50  oke -flags +NonP
17bc0 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20 20  ublic \..       
17bd0 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61         System.Da
17be0 74 61 2e 53 51 4c 69 74 65 2e 55 6e 73 61 66 65  ta.SQLite.Unsafe
17bf0 4e 61 74 69 76 65 4d 65 74 68 6f 64 73 20 5c 0d  NativeMethods \.
17c00 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
17c10 71 6c 69 74 65 33 5f 6d 65 6d 6f 72 79 5f 68 69  qlite3_memory_hi
17c20 67 68 77 61 74 65 72 20 30 0d 0a 20 20 20 20 20  ghwater 0..     
17c30 20 20 20 7d 20 6d 65 6d 6f 72 79 5d 20 3d 3d 20     } memory] == 
17c40 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
17c50 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74       if {!$quiet
17c60 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
17c70 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
17c80 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
17c90 20 24 6d 65 6d 6f 72 79 20 22 20 62 79 74 65 73   $memory " bytes
17ca0 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20 20 20  \n"]..          
17cb0 7d 0d 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73  }..        } els
17cc0 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 23  e {..          #
17cd0 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f  ..          # NO
17ce0 54 45 3a 20 4d 61 79 62 65 20 74 68 65 20 53 51  TE: Maybe the SQ
17cf0 4c 69 74 65 20 63 6f 72 65 20 6c 69 62 72 61 72  Lite core librar
17d00 79 20 69 73 20 75 6e 61 76 61 69 6c 61 62 6c 65  y is unavailable
17d10 3f 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a  ?..          #..
17d20 20 20 20 20 20 20 20 20 20 20 73 65 74 20 6d 65            set me
17d30 6d 6f 72 79 20 75 6e 6b 6e 6f 77 6e 0d 0a 0d 0a  mory unknown....
17d40 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 24            if {!$
17d50 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20  quiet} then {.. 
17d60 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
17d70 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e   $channel [appen
17d80 64 41 72 67 73 20 24 6d 65 6d 6f 72 79 20 5c 6e  dArgs $memory \n
17d90 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  ]..          }..
17da0 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
17db0 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
17dc0 20 20 20 73 65 74 20 6d 65 6d 6f 72 79 20 75 6e     set memory un
17dd0 61 76 61 69 6c 61 62 6c 65 0d 0a 0d 0a 20 20 20  available....   
17de0 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74       if {!$quiet
17df0 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
17e00 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
17e10 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 24  el [appendArgs $
17e20 6d 65 6d 6f 72 79 20 5c 6e 5d 0d 0a 20 20 20 20  memory \n]..    
17e30 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a      }..      }..
17e40 0d 0a 20 20 20 20 20 20 69 66 20 7b 24 63 6f 6c  ..      if {$col
17e50 6c 65 63 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  lect} then {..  
17e60 20 20 20 20 20 20 63 6f 6c 6c 65 63 74 47 61 72        collectGar
17e70 62 61 67 65 20 24 63 68 61 6e 6e 65 6c 0d 0a 20  bage $channel.. 
17e80 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
17e90 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65  if {!$quiet} the
17ea0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75  n {..        tpu
17eb0 74 73 20 24 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d  ts $channel "---
17ec0 2d 20 63 75 72 72 65 6e 74 20 6d 65 6d 6f 72 79  - current memory
17ed0 20 69 6e 20 75 73 65 20 62 79 20 74 68 65 20 43   in use by the C
17ee0 4c 52 2e 2e 2e 20 22 0d 0a 20 20 20 20 20 20 7d  LR... "..      }
17ef0 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 68  ....      if {[h
17f00 61 76 65 53 51 4c 69 74 65 4f 62 6a 65 63 74 43  aveSQLiteObjectC
17f10 6f 6d 6d 61 6e 64 5d 7d 20 74 68 65 6e 20 7b 0d  ommand]} then {.
17f20 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61  .        if {[ca
17f30 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  tch {..         
17f40 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 47   object invoke G
17f50 43 20 47 65 74 54 6f 74 61 6c 4d 65 6d 6f 72 79  C GetTotalMemory
17f60 20 66 61 6c 73 65 0d 0a 20 20 20 20 20 20 20 20   false..        
17f70 7d 20 6d 65 6d 6f 72 79 5d 20 3d 3d 20 30 7d 20  } memory] == 0} 
17f80 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
17f90 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 69 73    if {[string is
17fa0 20 69 6e 74 65 67 65 72 20 2d 73 74 72 69 63 74   integer -strict
17fb0 20 24 6d 65 6d 6f 72 79 5d 7d 20 74 68 65 6e 20   $memory]} then 
17fc0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  {..            i
17fd0 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e  f {!$quiet} then
17fe0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
17ff0 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
18000 20 5b 61 70 70 65 6e 64 41 72 67 73 20 24 6d 65   [appendArgs $me
18010 6d 6f 72 79 20 22 20 62 79 74 65 73 5c 6e 22 5d  mory " bytes\n"]
18020 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
18030 0a 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73  .          } els
18040 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e {..           
18050 20 73 65 74 20 6d 65 6d 6f 72 79 20 69 6e 76 61   set memory inva
18060 6c 69 64 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  lid....         
18070 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20     if {!$quiet} 
18080 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
18090 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
180a0 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
180b0 20 24 6d 65 6d 6f 72 79 20 5c 6e 5d 0d 0a 20 20   $memory \n]..  
180c0 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
180d0 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
180e0 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
180f0 20 20 20 20 20 20 73 65 74 20 6d 65 6d 6f 72 79        set memory
18100 20 75 6e 6b 6e 6f 77 6e 0d 0a 0d 0a 20 20 20 20   unknown....    
18110 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65        if {!$quie
18120 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  t} then {..     
18130 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
18140 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
18150 73 20 24 6d 65 6d 6f 72 79 20 5c 6e 5d 0d 0a 20  s $memory \n].. 
18160 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
18170 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 20 65      }..      } e
18180 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 73  lse {..        s
18190 65 74 20 6d 65 6d 6f 72 79 20 75 6e 61 76 61 69  et memory unavai
181a0 6c 61 62 6c 65 0d 0a 0d 0a 20 20 20 20 20 20 20  lable....       
181b0 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68   if {!$quiet} th
181c0 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
181d0 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b  tputs $channel [
181e0 61 70 70 65 6e 64 41 72 67 73 20 24 6d 65 6d 6f  appendArgs $memo
181f0 72 79 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20  ry \n]..        
18200 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  }..      }....  
18210 20 20 20 20 72 65 74 75 72 6e 20 24 72 65 73 75      return $resu
18220 6c 74 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20  lt..    }.....  
18230 20 20 70 72 6f 63 20 63 68 65 63 6b 46 6f 72 53    proc checkForS
18240 51 4c 69 74 65 44 69 72 65 63 74 6f 72 69 65 73  QLiteDirectories
18250 20 7b 20 63 68 61 6e 6e 65 6c 20 7b 72 65 73 65   { channel {rese
18260 74 20 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a 20 20  t false} } {..  
18270 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
18280 4f 54 45 3a 20 43 68 65 63 6b 20 69 66 20 74 68  OTE: Check if th
18290 65 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f  e sqlite3_win32_
182a0 73 65 74 5f 64 69 72 65 63 74 6f 72 79 20 66 75  set_directory fu
182b0 6e 63 74 69 6f 6e 20 69 73 20 61 76 61 69 6c 61  nction is availa
182c0 62 6c 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ble...      #.. 
182d0 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
182e0 6e 65 6c 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  nel \..         
182f0 20 22 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e 67 20   "---- checking 
18300 66 6f 72 20 66 75 6e 63 74 69 6f 6e 20 73 71 6c  for function sql
18310 69 74 65 33 5f 77 69 6e 33 32 5f 73 65 74 5f 64  ite3_win32_set_d
18320 69 72 65 63 74 6f 72 79 2e 2e 2e 20 22 0d 0a 0d  irectory... "...
18330 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
18340 23 20 4e 4f 54 45 3a 20 54 68 69 73 20 63 61 6c  # NOTE: This cal
18350 6c 20 74 6f 20 74 68 65 20 73 71 6c 69 74 65 33  l to the sqlite3
18360 5f 77 69 6e 33 32 5f 73 65 74 5f 64 69 72 65 63  _win32_set_direc
18370 74 6f 72 79 20 66 75 6e 63 74 69 6f 6e 20 75 73  tory function us
18380 65 73 20 74 68 65 0d 0a 20 20 20 20 20 20 23 20  es the..      # 
18390 20 20 20 20 20 20 69 6e 76 61 6c 69 64 20 76 61        invalid va
183a0 6c 75 65 20 30 20 66 6f 72 20 74 68 65 20 66 69  lue 0 for the fi
183b0 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 20 20 54  rst argument.  T
183c0 68 69 73 20 63 6f 64 65 20 69 73 20 64 65 73 69  his code is desi
183d0 67 6e 65 64 0d 0a 20 20 20 20 20 20 23 20 20 20  gned..      #   
183e0 20 20 20 20 74 6f 20 63 68 65 63 6b 20 69 66 20      to check if 
183f0 63 61 6c 6c 69 6e 67 20 74 68 65 20 66 75 6e 63  calling the func
18400 74 69 6f 6e 20 77 69 6c 6c 20 72 61 69 73 65 20  tion will raise 
18410 61 6e 20 65 78 63 65 70 74 69 6f 6e 20 28 69 2e  an exception (i.
18420 65 2e 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  e...      #     
18430 20 20 74 68 65 20 61 63 74 75 61 6c 20 72 65 73    the actual res
18440 75 6c 74 20 6f 66 20 74 68 65 20 66 75 6e 63 74  ult of the funct
18450 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74  ion does not mat
18460 74 65 72 20 61 73 20 6c 6f 6e 67 20 61 73 20 6e  ter as long as n
18470 6f 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  o..      #      
18480 20 64 69 72 65 63 74 6f 72 79 20 69 73 20 63 68   directory is ch
18490 61 6e 67 65 64 29 2e 0d 0a 20 20 20 20 20 20 23  anged)...      #
184a0 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74  ..      if {[cat
184b0 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 6f 62  ch {..        ob
184c0 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61  ject invoke -fla
184d0 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d  gs +NonPublic \.
184e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 53 79 73  .            Sys
184f0 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e  tem.Data.SQLite.
18500 55 6e 73 61 66 65 4e 61 74 69 76 65 4d 65 74 68  UnsafeNativeMeth
18510 6f 64 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ods \..         
18520 20 20 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32     sqlite3_win32
18530 5f 73 65 74 5f 64 69 72 65 63 74 6f 72 79 20 30  _set_directory 0
18540 20 6e 75 6c 6c 0d 0a 20 20 20 20 20 20 7d 5d 20   null..      }] 
18550 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  == 0} then {..  
18560 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
18570 20 23 20 4e 4f 54 45 3a 20 43 61 6c 6c 69 6e 67   # NOTE: Calling
18580 20 74 68 65 20 73 71 6c 69 74 65 33 5f 77 69 6e   the sqlite3_win
18590 33 32 5f 73 65 74 5f 64 69 72 65 63 74 6f 72 79  32_set_directory
185a0 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e   function does n
185b0 6f 74 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  ot..        #   
185c0 20 20 20 20 63 61 75 73 65 20 61 6e 20 65 78 63      cause an exc
185d0 65 70 74 69 6f 6e 3b 20 74 68 65 72 65 66 6f 72  eption; therefor
185e0 65 2c 20 69 74 20 6d 75 73 74 20 62 65 20 61 76  e, it must be av
185f0 61 69 6c 61 62 6c 65 20 28 69 2e 65 2e 0d 0a 20  ailable (i.e... 
18600 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 65         #       e
18610 76 65 6e 20 74 68 6f 75 67 68 20 69 74 20 73 68  ven though it sh
18620 6f 75 6c 64 20 72 65 74 75 72 6e 20 61 20 66 61  ould return a fa
18630 69 6c 75 72 65 20 72 65 74 75 72 6e 20 63 6f 64  ilure return cod
18640 65 20 69 6e 20 74 68 69 73 0d 0a 20 20 20 20 20  e in this..     
18650 20 20 20 23 20 20 20 20 20 20 20 63 61 73 65 29     #       case)
18660 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
18670 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61        addConstra
18680 69 6e 74 20 73 71 6c 69 74 65 33 5f 77 69 6e 33  int sqlite3_win3
18690 32 5f 73 65 74 5f 64 69 72 65 63 74 6f 72 79 0d  2_set_directory.
186a0 0a 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73  ...        tputs
186b0 20 24 63 68 61 6e 6e 65 6c 20 79 65 73 5c 6e 0d   $channel yes\n.
186c0 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
186d0 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 44 6f        # NOTE: Do
186e0 65 73 20 6f 75 72 20 63 61 6c 6c 65 72 20 77 61  es our caller wa
186f0 6e 74 20 74 6f 20 72 65 73 65 74 20 74 68 65 20  nt to reset the 
18700 64 69 72 65 63 74 6f 72 69 65 73 3f 0d 0a 20 20  directories?..  
18710 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
18720 20 69 66 20 7b 24 72 65 73 65 74 7d 20 74 68 65   if {$reset} the
18730 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 23  n {..          #
18740 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f  ..          # NO
18750 54 45 3a 20 4e 6f 77 20 6d 61 6b 65 20 73 75 72  TE: Now make sur
18760 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61  e the database a
18770 6e 64 20 74 65 6d 70 6f 72 61 72 79 20 64 69 72  nd temporary dir
18780 65 63 74 6f 72 69 65 73 20 61 72 65 0d 0a 20 20  ectories are..  
18790 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
187a0 72 65 73 65 74 20 74 68 65 69 72 20 64 65 66 61  reset their defa
187b0 75 6c 74 20 76 61 6c 75 65 73 2c 20 77 68 69 63  ult values, whic
187c0 68 20 73 68 6f 75 6c 64 20 62 65 20 6e 75 6c 6c  h should be null
187d0 20 66 6f 72 20 62 6f 74 68 2e 0d 0a 20 20 20 20   for both...    
187e0 20 20 20 20 20 20 23 20 20 20 20 20 20 20 53 69        #       Si
187f0 6e 63 65 20 74 68 65 20 73 71 6c 69 74 65 33 5f  nce the sqlite3_
18800 77 69 6e 33 32 5f 73 65 74 5f 64 69 72 65 63 74  win32_set_direct
18810 6f 72 79 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  ory function is 
18820 61 76 61 69 6c 61 62 6c 65 2c 0d 0a 20 20 20 20  available,..    
18830 20 20 20 20 20 20 23 20 20 20 20 20 20 20 75 73        #       us
18840 65 20 69 74 2e 0d 0a 20 20 20 20 20 20 20 20 20  e it...         
18850 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 66 6f   #..          fo
18860 72 20 7b 73 65 74 20 69 6e 64 65 78 20 31 7d 20  r {set index 1} 
18870 7b 24 69 6e 64 65 78 20 3c 20 33 7d 20 7b 69 6e  {$index < 3} {in
18880 63 72 20 69 6e 64 65 78 7d 20 7b 0d 0a 20 20 20  cr index} {..   
18890 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61           if {[ca
188a0 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  tch {..         
188b0 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f       object invo
188c0 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75  ke -flags +NonPu
188d0 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20 20 20  blic \..        
188e0 20 20 20 20 20 20 20 20 20 20 53 79 73 74 65 6d            System
188f0 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 55 6e 73  .Data.SQLite.Uns
18900 61 66 65 4e 61 74 69 76 65 4d 65 74 68 6f 64 73  afeNativeMethods
18910 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
18920 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 77 69        sqlite3_wi
18930 6e 33 32 5f 73 65 74 5f 64 69 72 65 63 74 6f 72  n32_set_director
18940 79 20 24 69 6e 64 65 78 20 6e 75 6c 6c 0d 0a 20  y $index null.. 
18950 20 20 20 20 20 20 20 20 20 20 20 7d 20 72 65 73             } res
18960 75 6c 74 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20  ult] == 0} then 
18970 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
18980 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
18990 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
189a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
189b0 20 22 2d 2d 2d 2d 20 63 61 6c 6c 20 73 71 6c 69   "---- call sqli
189c0 74 65 33 5f 77 69 6e 33 32 5f 73 65 74 5f 64 69  te3_win32_set_di
189d0 72 65 63 74 6f 72 79 28 22 20 24 69 6e 64 65 78  rectory(" $index
189e0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
189f0 20 20 20 20 20 20 22 2c 20 6e 75 6c 6c 29 2e 2e        ", null)..
18a00 2e 20 6f 6b 3a 20 22 20 24 72 65 73 75 6c 74 20  . ok: " $result 
18a10 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20  \n]..           
18a20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
18a30 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
18a40 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
18a50 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
18a60 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63           "---- c
18a70 61 6c 6c 20 73 71 6c 69 74 65 33 5f 77 69 6e 33  all sqlite3_win3
18a80 32 5f 73 65 74 5f 64 69 72 65 63 74 6f 72 79 28  2_set_directory(
18a90 22 20 24 69 6e 64 65 78 20 5c 0d 0a 20 20 20 20  " $index \..    
18aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2c                ",
18ab0 20 6e 75 6c 6c 29 2e 2e 2e 20 65 72 72 6f 72 3a   null)... error:
18ac0 20 22 20 5c 6e 5c 74 20 24 72 65 73 75 6c 74 20   " \n\t $result 
18ad0 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20  \n]..           
18ae0 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d   }..          }.
18af0 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  .        }..    
18b00 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
18b10 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
18b20 65 6c 20 6e 6f 5c 6e 0d 0a 0d 0a 20 20 20 20 20  el no\n....     
18b30 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
18b40 4e 4f 54 45 3a 20 44 6f 65 73 20 6f 75 72 20 63  NOTE: Does our c
18b50 61 6c 6c 65 72 20 77 61 6e 74 20 74 6f 20 72 65  aller want to re
18b60 73 65 74 20 74 68 65 20 64 69 72 65 63 74 6f 72  set the director
18b70 69 65 73 3f 20 20 54 68 69 73 20 63 61 6e 20 6f  ies?  This can o
18b80 6e 6c 79 0d 0a 20 20 20 20 20 20 20 20 23 20 20  nly..        #  
18b90 20 20 20 20 20 62 65 20 70 65 72 66 6f 72 6d 65       be performe
18ba0 64 20 69 66 20 53 51 4c 69 74 65 20 69 73 20 6c  d if SQLite is l
18bb0 6f 61 64 65 64 20 61 6e 64 20 72 65 61 64 79 20  oaded and ready 
18bc0 66 6f 72 20 75 73 65 20 62 79 20 74 68 65 20 74  for use by the t
18bd0 65 73 74 0d 0a 20 20 20 20 20 20 20 20 23 20 20  est..        #  
18be0 20 20 20 20 20 73 75 69 74 65 2e 0d 0a 20 20 20       suite...   
18bf0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
18c00 69 66 20 7b 24 72 65 73 65 74 20 26 26 20 5b 69  if {$reset && [i
18c10 73 53 51 4c 69 74 65 52 65 61 64 79 5d 7d 20 74  sSQLiteReady]} t
18c20 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
18c30 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20   #..          # 
18c40 4e 4f 54 45 3a 20 4e 6f 77 20 6d 61 6b 65 20 73  NOTE: Now make s
18c50 75 72 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ure the database
18c60 20 61 6e 64 20 74 65 6d 70 6f 72 61 72 79 20 64   and temporary d
18c70 69 72 65 63 74 6f 72 69 65 73 20 61 72 65 0d 0a  irectories are..
18c80 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20            #     
18c90 20 20 72 65 73 65 74 20 74 68 65 69 72 20 64 65    reset their de
18ca0 66 61 75 6c 74 20 76 61 6c 75 65 73 2c 20 77 68  fault values, wh
18cb0 69 63 68 20 73 68 6f 75 6c 64 20 62 65 20 6e 75  ich should be nu
18cc0 6c 6c 20 66 6f 72 20 62 6f 74 68 2e 0d 0a 20 20  ll for both...  
18cd0 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
18ce0 53 69 6e 63 65 20 74 68 65 20 73 71 6c 69 74 65  Since the sqlite
18cf0 33 5f 77 69 6e 33 32 5f 73 65 74 5f 64 69 72 65  3_win32_set_dire
18d00 63 74 6f 72 79 20 66 75 6e 63 74 69 6f 6e 20 64  ctory function d
18d10 6f 65 73 20 6e 6f 74 0d 0a 20 20 20 20 20 20 20  oes not..       
18d20 20 20 20 23 20 20 20 20 20 20 20 61 70 70 65 61     #       appea
18d30 72 20 74 6f 20 62 65 20 61 76 61 69 6c 61 62 6c  r to be availabl
18d40 65 2c 20 75 73 65 20 74 68 65 20 61 73 73 6f 63  e, use the assoc
18d50 69 61 74 65 64 20 50 52 41 47 4d 41 20 63 6f 6d  iated PRAGMA com
18d60 6d 61 6e 64 73 0d 0a 20 20 20 20 20 20 20 20 20  mands..         
18d70 20 23 20 20 20 20 20 20 20 69 6e 73 74 65 61 64   #       instead
18d80 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a  ...          #..
18d90 20 20 20 20 20 20 20 20 20 20 66 6f 72 65 61 63            foreac
18da0 68 20 64 69 72 65 63 74 6f 72 79 20 5b 6c 69 73  h directory [lis
18db0 74 20 64 61 74 61 5f 73 74 6f 72 65 5f 64 69 72  t data_store_dir
18dc0 65 63 74 6f 72 79 20 74 65 6d 70 5f 73 74 6f 72  ectory temp_stor
18dd0 65 5f 64 69 72 65 63 74 6f 72 79 5d 20 7b 0d 0a  e_directory] {..
18de0 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20              set 
18df0 73 71 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  sql [appendArgs 
18e00 22 50 52 41 47 4d 41 20 22 20 24 64 69 72 65 63  "PRAGMA " $direc
18e10 74 6f 72 79 20 22 20 3d 20 5c 22 5c 22 3b 22 5d  tory " = \"\";"]
18e20 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
18e30 69 66 20 7b 5b 63 61 74 63 68 20 7b 65 78 65 63  if {[catch {exec
18e40 75 74 65 53 71 6c 20 24 73 71 6c 7d 20 72 65 73  uteSql $sql} res
18e50 75 6c 74 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20  ult] == 0} then 
18e60 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
18e70 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
18e80 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
18e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18ea0 20 22 2d 2d 2d 2d 20 65 78 65 63 75 74 65 20 50   "---- execute P
18eb0 52 41 47 4d 41 20 22 20 24 64 69 72 65 63 74 6f  RAGMA " $directo
18ec0 72 79 20 22 2e 2e 2e 20 6f 6b 3a 20 5c 22 22 20  ry "... ok: \"" 
18ed0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
18ee0 20 20 20 20 20 24 72 65 73 75 6c 74 20 5c 22 5c       $result \"\
18ef0 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  n]..            
18f00 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
18f10 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
18f20 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
18f30 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
18f40 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 65 78          "---- ex
18f50 65 63 75 74 65 20 50 52 41 47 4d 41 20 22 20 24  ecute PRAGMA " $
18f60 64 69 72 65 63 74 6f 72 79 20 22 2e 2e 2e 20 65  directory "... e
18f70 72 72 6f 72 3a 20 22 20 5c 0d 0a 20 20 20 20 20  rror: " \..     
18f80 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 6e 5c               \n\
18f90 74 20 24 72 65 73 75 6c 74 20 5c 6e 5d 0d 0a 20  t $result \n].. 
18fa0 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
18fb0 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
18fc0 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d     }..      }...
18fd0 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
18fe0 23 20 4e 4f 54 45 3a 20 46 69 6e 61 6c 6c 79 2c  # NOTE: Finally,
18ff0 20 73 68 6f 77 20 74 68 65 20 63 75 72 72 65 6e   show the curren
19000 74 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 64  t value of the d
19010 61 74 61 62 61 73 65 20 61 6e 64 20 74 65 6d 70  atabase and temp
19020 6f 72 61 72 79 0d 0a 20 20 20 20 20 20 23 20 20  orary..      #  
19030 20 20 20 20 20 64 69 72 65 63 74 6f 72 69 65 73       directories
19040 2e 20 20 54 68 69 73 20 63 61 6e 20 6f 6e 6c 79  .  This can only
19050 20 62 65 20 70 65 72 66 6f 72 6d 65 64 20 69 66   be performed if
19060 20 53 51 4c 69 74 65 20 69 73 20 6c 6f 61 64 65   SQLite is loade
19070 64 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  d..      #      
19080 20 61 6e 64 20 72 65 61 64 79 20 66 6f 72 20 75   and ready for u
19090 73 65 20 62 79 20 74 68 65 20 74 65 73 74 20 73  se by the test s
190a0 75 69 74 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  uite...      #..
190b0 20 20 20 20 20 20 69 66 20 7b 5b 69 73 53 51 4c        if {[isSQL
190c0 69 74 65 52 65 61 64 79 5d 7d 20 74 68 65 6e 20  iteReady]} then 
190d0 7b 0d 0a 20 20 20 20 20 20 20 20 66 6f 72 65 61  {..        forea
190e0 63 68 20 64 69 72 65 63 74 6f 72 79 20 5b 6c 69  ch directory [li
190f0 73 74 20 64 61 74 61 5f 73 74 6f 72 65 5f 64 69  st data_store_di
19100 72 65 63 74 6f 72 79 20 74 65 6d 70 5f 73 74 6f  rectory temp_sto
19110 72 65 5f 64 69 72 65 63 74 6f 72 79 5d 20 7b 0d  re_directory] {.
19120 0a 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73  .          tputs
19130 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e   $channel [appen
19140 64 41 72 67 73 20 22 2d 2d 2d 2d 20 63 68 65 63  dArgs "---- chec
19150 6b 69 6e 67 20 22 20 24 64 69 72 65 63 74 6f 72  king " $director
19160 79 20 22 2e 2e 2e 20 22 5d 0d 0a 0d 0a 20 20 20  y "... "]....   
19170 20 20 20 20 20 20 20 73 65 74 20 73 71 6c 20 5b         set sql [
19180 61 70 70 65 6e 64 41 72 67 73 20 22 50 52 41 47  appendArgs "PRAG
19190 4d 41 20 22 20 24 64 69 72 65 63 74 6f 72 79 20  MA " $directory 
191a0 5c 3b 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  \;]....         
191b0 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 65 78 65   if {[catch {exe
191c0 63 75 74 65 53 71 6c 20 24 73 71 6c 20 73 63 61  cuteSql $sql sca
191d0 6c 61 72 7d 20 72 65 73 75 6c 74 5d 20 3d 3d 20  lar} result] == 
191e0 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
191f0 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
19200 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
19210 73 20 22 6f 6b 3a 20 5c 22 22 20 24 72 65 73 75  s "ok: \"" $resu
19220 6c 74 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20  lt \"\n]..      
19230 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
19240 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
19250 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  $channel [append
19260 41 72 67 73 20 22 65 72 72 6f 72 3a 20 22 20 5c  Args "error: " \
19270 6e 5c 74 20 24 72 65 73 75 6c 74 20 5c 6e 5d 0d  n\t $result \n].
19280 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  .          }..  
19290 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d        }..      }
192a0 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
192b0 70 72 6f 63 20 6c 6f 61 64 53 51 4c 69 74 65 54  proc loadSQLiteT
192c0 65 73 74 53 65 74 74 69 6e 67 73 20 7b 20 63 68  estSettings { ch
192d0 61 6e 6e 65 6c 20 7b 73 75 66 66 69 78 20 22 22  annel {suffix ""
192e0 7d 20 7b 71 75 69 65 74 20 66 61 6c 73 65 7d 20  } {quiet false} 
192f0 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  } {..      #..  
19300 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 6b 69 70      # NOTE: Skip
19310 20 6c 6f 61 64 69 6e 67 20 74 68 65 20 73 65 74   loading the set
19320 74 69 6e 67 73 20 69 66 20 74 68 65 69 72 20 75  tings if their u
19330 73 61 67 65 20 68 61 73 20 62 65 65 6e 20 64 69  sage has been di
19340 73 61 62 6c 65 64 2e 0d 0a 20 20 20 20 20 20 23  sabled...      #
19350 0d 0a 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e  ..      if {![in
19360 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 73  fo exists ::no(s
19370 71 6c 69 74 65 54 65 73 74 53 65 74 74 69 6e 67  qliteTestSetting
19380 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  s)]} then {..   
19390 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
193a0 23 20 4e 4f 54 45 3a 20 4c 6f 61 64 20 63 75 73  # NOTE: Load cus
193b0 74 6f 6d 20 70 65 72 2d 75 73 65 72 20 61 6e 64  tom per-user and
193c0 2f 6f 72 20 70 65 72 2d 68 6f 73 74 20 74 65 73  /or per-host tes
193d0 74 20 73 65 74 74 69 6e 67 73 20 6e 6f 77 2e 0d  t settings now..
193e0 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
193f0 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78      if {[info ex
19400 69 73 74 73 20 3a 3a 74 63 6c 5f 70 6c 61 74 66  ists ::tcl_platf
19410 6f 72 6d 28 75 73 65 72 29 5d 7d 20 74 68 65 6e  orm(user)]} then
19420 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65   {..          se
19430 74 20 75 73 65 72 53 65 74 74 69 6e 67 73 46 69  t userSettingsFi
19440 6c 65 4e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69  leName [file joi
19450 6e 20 5b 67 65 74 43 6f 6d 6d 6f 6e 44 69 72 65  n [getCommonDire
19460 63 74 6f 72 79 5d 20 5c 0d 0a 20 20 20 20 20 20  ctory] \..      
19470 20 20 20 20 20 20 20 20 5b 61 70 70 65 6e 64 41          [appendA
19480 72 67 73 20 73 65 74 74 69 6e 67 73 20 24 73 75  rgs settings $su
19490 66 66 69 78 20 2e 20 24 3a 3a 74 63 6c 5f 70 6c  ffix . $::tcl_pl
194a0 61 74 66 6f 72 6d 28 75 73 65 72 29 20 2e 65 61  atform(user) .ea
194b0 67 6c 65 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  gle]]....       
194c0 20 20 20 69 66 20 7b 5b 66 69 6c 65 20 65 78 69     if {[file exi
194d0 73 74 73 20 24 75 73 65 72 53 65 74 74 69 6e 67  sts $userSetting
194e0 73 46 69 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e  sFileName]} then
194f0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
19500 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65  if {!$quiet} the
19510 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
19520 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
19530 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
19540 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
19550 20 20 20 22 2d 2d 2d 2d 20 6c 6f 61 64 69 6e 67     "---- loading
19560 20 70 65 72 2d 75 73 65 72 20 74 65 73 74 20 73   per-user test s
19570 65 74 74 69 6e 67 73 20 66 69 6c 65 20 5c 22 22  ettings file \""
19580 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
19590 20 20 20 20 20 20 24 75 73 65 72 53 65 74 74 69        $userSetti
195a0 6e 67 73 46 69 6c 65 4e 61 6d 65 20 5c 22 2e 2e  ngsFileName \"..
195b0 2e 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20  .\n]..          
195c0 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20    }....         
195d0 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d     if {[catch {.
195e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 75  .              u
195f0 70 6c 65 76 65 6c 20 31 20 5b 6c 69 73 74 20 73  plevel 1 [list s
19600 6f 75 72 63 65 20 24 75 73 65 72 53 65 74 74 69  ource $userSetti
19610 6e 67 73 46 69 6c 65 4e 61 6d 65 5d 0d 0a 20 20  ngsFileName]..  
19620 20 20 20 20 20 20 20 20 20 20 7d 20 65 72 72 6f            } erro
19630 72 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  r]} then {..    
19640 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 24            if {!$
19650 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20  quiet} then {.. 
19660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
19670 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61  puts $channel [a
19680 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
19690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
196a0 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20   "==== WARNING: 
196b0 66 61 69 6c 65 64 20 74 6f 20 6c 6f 61 64 20 70  failed to load p
196c0 65 72 2d 75 73 65 72 20 73 65 74 74 69 6e 67 73  er-user settings
196d0 20 66 69 6c 65 20 5c 22 22 20 5c 0d 0a 20 20 20   file \"" \..   
196e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
196f0 20 24 75 73 65 72 53 65 74 74 69 6e 67 73 46 69   $userSettingsFi
19700 6c 65 4e 61 6d 65 20 22 5c 22 2c 20 65 72 72 6f  leName "\", erro
19710 72 3a 20 22 20 5c 6e 5c 74 20 24 65 72 72 6f 72  r: " \n\t $error
19720 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20   \n]..          
19730 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
19740 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
19750 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
19760 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65        if {!$quie
19770 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  t} then {..     
19780 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
19790 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
197a0 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
197b0 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 73           "---- s
197c0 6b 69 70 70 65 64 20 6c 6f 61 64 69 6e 67 20 70  kipped loading p
197d0 65 72 2d 75 73 65 72 20 74 65 73 74 20 73 65 74  er-user test set
197e0 74 69 6e 67 73 20 66 69 6c 65 20 5c 22 22 20 5c  tings file \"" \
197f0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
19800 20 20 20 20 24 75 73 65 72 53 65 74 74 69 6e 67      $userSetting
19810 73 46 69 6c 65 4e 61 6d 65 20 22 5c 22 2c 20 69  sFileName "\", i
19820 74 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74  t does not exist
19830 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20 20 20  \n"]..          
19840 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d    }..          }
19850 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  ..        }.... 
19860 20 20 20 20 20 20 20 23 23 23 23 23 23 23 23 23         #########
19870 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
19880 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
19890 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
198a0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0d 0a  ##############..
198b0 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 69  ..        if {[i
198c0 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 74 63 6c  nfo exists ::tcl
198d0 5f 70 6c 61 74 66 6f 72 6d 28 68 6f 73 74 29 5d  _platform(host)]
198e0 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
198f0 20 20 20 20 73 65 74 20 68 6f 73 74 53 65 74 74      set hostSett
19900 69 6e 67 73 46 69 6c 65 4e 61 6d 65 20 5b 66 69  ingsFileName [fi
19910 6c 65 20 6a 6f 69 6e 20 5b 67 65 74 43 6f 6d 6d  le join [getComm
19920 6f 6e 44 69 72 65 63 74 6f 72 79 5d 20 5c 0d 0a  onDirectory] \..
19930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 61                [a
19940 70 70 65 6e 64 41 72 67 73 20 73 65 74 74 69 6e  ppendArgs settin
19950 67 73 20 24 73 75 66 66 69 78 20 2e 20 24 3a 3a  gs $suffix . $::
19960 74 63 6c 5f 70 6c 61 74 66 6f 72 6d 28 68 6f 73  tcl_platform(hos
19970 74 29 20 2e 65 61 67 6c 65 5d 5d 0d 0a 0d 0a 20  t) .eagle]].... 
19980 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 66 69           if {[fi
19990 6c 65 20 65 78 69 73 74 73 20 24 68 6f 73 74 53  le exists $hostS
199a0 65 74 74 69 6e 67 73 46 69 6c 65 4e 61 6d 65 5d  ettingsFileName]
199b0 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
199c0 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65        if {!$quie
199d0 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  t} then {..     
199e0 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
199f0 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
19a00 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
19a10 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 6c           "---- l
19a20 6f 61 64 69 6e 67 20 70 65 72 2d 68 6f 73 74 20  oading per-host 
19a30 74 65 73 74 20 73 65 74 74 69 6e 67 73 20 66 69  test settings fi
19a40 6c 65 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20  le \"" \..      
19a50 20 20 20 20 20 20 20 20 20 20 20 20 24 68 6f 73              $hos
19a60 74 53 65 74 74 69 6e 67 73 46 69 6c 65 4e 61 6d  tSettingsFileNam
19a70 65 20 5c 22 2e 2e 2e 5c 6e 5d 0d 0a 20 20 20 20  e \"...\n]..    
19a80 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
19a90 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61           if {[ca
19aa0 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  tch {..         
19ab0 20 20 20 20 20 75 70 6c 65 76 65 6c 20 31 20 5b       uplevel 1 [
19ac0 6c 69 73 74 20 73 6f 75 72 63 65 20 24 68 6f 73  list source $hos
19ad0 74 53 65 74 74 69 6e 67 73 46 69 6c 65 4e 61 6d  tSettingsFileNam
19ae0 65 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  e]..            
19af0 7d 20 65 72 72 6f 72 5d 7d 20 74 68 65 6e 20 7b  } error]} then {
19b00 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
19b10 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65  if {!$quiet} the
19b20 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
19b30 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
19b40 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
19b50 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
19b60 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52         "==== WAR
19b70 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20 74 6f 20  NING: failed to 
19b80 6c 6f 61 64 20 70 65 72 2d 68 6f 73 74 20 73 65  load per-host se
19b90 74 74 69 6e 67 73 20 66 69 6c 65 20 5c 22 22 20  ttings file \"" 
19ba0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
19bb0 20 20 20 20 20 20 20 24 68 6f 73 74 53 65 74 74         $hostSett
19bc0 69 6e 67 73 46 69 6c 65 4e 61 6d 65 20 22 5c 22  ingsFileName "\"
19bd0 2c 20 65 72 72 6f 72 3a 20 22 20 5c 6e 5c 74 20  , error: " \n\t 
19be0 24 65 72 72 6f 72 20 5c 6e 5d 0d 0a 20 20 20 20  $error \n]..    
19bf0 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
19c00 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
19c10 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
19c20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b              if {
19c30 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d  !$quiet} then {.
19c40 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74  .              t
19c50 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61  puts $channel [a
19c60 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
19c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
19c80 2d 2d 2d 2d 20 73 6b 69 70 70 65 64 20 6c 6f 61  ---- skipped loa
19c90 64 69 6e 67 20 70 65 72 2d 68 6f 73 74 20 74 65  ding per-host te
19ca0 73 74 20 73 65 74 74 69 6e 67 73 20 66 69 6c 65  st settings file
19cb0 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20 20 20   \"" \..        
19cc0 20 20 20 20 20 20 20 20 20 20 24 68 6f 73 74 53            $hostS
19cd0 65 74 74 69 6e 67 73 46 69 6c 65 4e 61 6d 65 20  ettingsFileName 
19ce0 22 5c 22 2c 20 69 74 20 64 6f 65 73 20 6e 6f 74  "\", it does not
19cf0 20 65 78 69 73 74 5c 6e 22 5d 0d 0a 20 20 20 20   exist\n"]..    
19d00 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
19d10 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
19d20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  }..      }..    
19d30 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 72  }.....    proc r
19d40 75 6e 53 51 4c 69 74 65 54 65 73 74 50 72 6f 6c  unSQLiteTestProl
19d50 6f 67 75 65 20 7b 7d 20 7b 0d 0a 20 20 20 20 20  ogue {} {..     
19d60 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
19d70 3a 20 53 6b 69 70 20 72 75 6e 6e 69 6e 67 20 6f  : Skip running o
19d80 75 72 20 63 75 73 74 6f 6d 20 70 72 6f 6c 6f 67  ur custom prolog
19d90 75 65 20 69 66 20 74 68 65 20 6d 61 69 6e 20 6f  ue if the main o
19da0 6e 65 20 68 61 73 20 62 65 65 6e 0d 0a 20 20 20  ne has been..   
19db0 20 20 20 23 20 20 20 20 20 20 20 73 6b 69 70 70     #       skipp
19dc0 65 64 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  ed...      #..  
19dd0 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65      if {![info e
19de0 78 69 73 74 73 20 3a 3a 6e 6f 28 70 72 6f 6c 6f  xists ::no(prolo
19df0 67 75 65 2e 65 61 67 6c 65 29 5d 7d 20 74 68 65  gue.eagle)]} the
19e00 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  n {..        #..
19e10 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
19e20 4c 6f 61 64 20 74 68 65 20 22 62 65 66 6f 72 65  Load the "before
19e30 2d 63 6f 6e 73 74 72 61 69 6e 74 73 22 20 63 75  -constraints" cu
19e40 73 74 6f 6d 20 70 65 72 2d 75 73 65 72 20 61 6e  stom per-user an
19e50 64 2f 6f 72 20 70 65 72 2d 68 6f 73 74 0d 0a 20  d/or per-host.. 
19e60 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74         #       t
19e70 65 73 74 20 73 65 74 74 69 6e 67 73 20 6e 6f 77  est settings now
19e80 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
19e90 20 20 20 20 20 20 75 70 6c 65 76 65 6c 20 31 20        uplevel 1 
19ea0 5b 6c 69 73 74 20 6c 6f 61 64 53 51 4c 69 74 65  [list loadSQLite
19eb0 54 65 73 74 53 65 74 74 69 6e 67 73 20 24 3a 3a  TestSettings $::
19ec0 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 2e 62 65  test_channel .be
19ed0 66 6f 72 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  fore]....       
19ee0 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
19ef0 54 45 3a 20 43 68 65 63 6b 20 69 66 20 74 68 65  TE: Check if the
19f00 20 5b 6f 62 6a 65 63 74 5d 20 63 6f 6d 6d 61 6e   [object] comman
19f10 64 20 69 73 20 61 76 61 69 6c 61 62 6c 65 3b 20  d is available; 
19f20 69 66 20 6e 6f 74 2c 20 61 64 64 20 73 6f 6d 65  if not, add some
19f30 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
19f40 20 20 73 68 69 6d 73 20 74 6f 20 6d 61 6b 65 20    shims to make 
19f50 74 68 65 20 74 65 73 74 20 73 75 69 74 65 20 72  the test suite r
19f60 75 6e 20 73 6d 6f 6f 74 68 65 72 2e 0d 0a 20 20  un smoother...  
19f70 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
19f80 20 63 68 65 63 6b 46 6f 72 53 51 4c 69 74 65 4f   checkForSQLiteO
19f90 62 6a 65 63 74 43 6f 6d 6d 61 6e 64 20 24 3a 3a  bjectCommand $::
19fa0 74 65 73 74 5f 63 68 61 6e 6e 65 6c 0d 0a 0d 0a  test_channel....
19fb0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
19fc0 20 20 20 23 20 4e 4f 54 45 3a 20 44 65 74 65 72     # NOTE: Deter
19fd0 6d 69 6e 65 20 74 68 65 20 6e 61 6d 65 73 20 6f  mine the names o
19fe0 66 20 74 68 65 20 6e 61 74 69 76 65 20 70 6c 61  f the native pla
19ff0 74 66 6f 72 6d 20 61 6e 64 20 61 72 63 68 69 74  tform and archit
1a000 65 63 74 75 72 65 2e 0d 0a 20 20 20 20 20 20 20  ecture...       
1a010 20 23 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20   #..        set 
1a020 70 6c 61 74 66 6f 72 6d 20 5b 67 65 74 42 75 69  platform [getBui
1a030 6c 64 50 6c 61 74 66 6f 72 6d 20 74 72 75 65 5d  ldPlatform true]
1a040 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 61 72  ..        set ar
1a050 63 68 69 74 65 63 74 75 72 65 20 5b 61 72 63 68  chitecture [arch
1a060 69 74 65 63 74 75 72 65 46 6f 72 50 6c 61 74 66  itectureForPlatf
1a070 6f 72 6d 20 24 70 6c 61 74 66 6f 72 6d 5d 0d 0a  orm $platform]..
1a080 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
1a090 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 68 6f       # NOTE: Sho
1a0a0 77 20 74 68 65 20 70 6c 61 74 66 6f 72 6d 20 61  w the platform a
1a0b0 6e 64 20 61 72 63 68 69 74 65 63 74 75 72 65 20  nd architecture 
1a0c0 75 73 65 64 20 74 6f 20 68 65 6c 70 20 6c 6f 63  used to help loc
1a0d0 61 74 65 20 74 68 65 0d 0a 20 20 20 20 20 20 20  ate the..       
1a0e0 20 23 20 20 20 20 20 20 20 6e 61 74 69 76 65 20   #       native 
1a0f0 62 75 69 6c 64 20 66 69 6c 65 73 2e 0d 0a 20 20  build files...  
1a100 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
1a110 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
1a120 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
1a130 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
1a140 20 20 22 2d 2d 2d 2d 20 70 6c 61 74 66 6f 72 6d    "---- platform
1a150 20 66 6f 72 20 6c 6f 63 61 74 69 6e 67 20 6e 61   for locating na
1a160 74 69 76 65 20 62 75 69 6c 64 20 66 69 6c 65 73  tive build files
1a170 20 69 73 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20   is \"" \..     
1a180 20 20 20 20 20 20 20 24 70 6c 61 74 66 6f 72 6d         $platform
1a190 20 5c 22 5c 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20   \"\n]....      
1a1a0 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
1a1b0 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
1a1c0 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
1a1d0 20 20 20 22 2d 2d 2d 2d 20 61 72 63 68 69 74 65     "---- archite
1a1e0 63 74 75 72 65 20 66 6f 72 20 6c 6f 63 61 74 69  cture for locati
1a1f0 6e 67 20 6e 61 74 69 76 65 20 62 75 69 6c 64 20  ng native build 
1a200 66 69 6c 65 73 20 69 73 20 5c 22 22 20 5c 0d 0a  files is \"" \..
1a210 20 20 20 20 20 20 20 20 20 20 20 20 24 61 72 63              $arc
1a220 68 69 74 65 63 74 75 72 65 20 5c 22 5c 6e 5d 0d  hitecture \"\n].
1a230 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
1a240 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 42 75        # NOTE: Bu
1a250 69 6c 64 20 61 20 6c 69 73 74 20 6f 66 20 63 6f  ild a list of co
1a260 6e 66 69 67 75 72 61 74 69 6f 6e 20 66 69 6c 65  nfiguration file
1a270 73 20 74 68 61 74 20 77 65 20 68 61 6e 64 6c 65  s that we handle
1a280 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
1a290 20 20 20 20 20 20 73 65 74 20 63 6f 6e 66 69 67        set config
1a2a0 46 69 6c 65 4e 61 6d 65 73 20 5b 6c 69 73 74 20  FileNames [list 
1a2b0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 53  \..            S
1a2c0 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
1a2d0 65 2e 64 6c 6c 2e 63 6f 6e 66 69 67 5d 0d 0a 0d  e.dll.config]...
1a2e0 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
1a2f0 20 20 20 20 23 20 4e 4f 54 45 3a 20 42 75 69 6c      # NOTE: Buil
1a300 64 20 61 20 6c 69 73 74 20 6f 66 20 61 75 78 69  d a list of auxi
1a310 6c 69 61 72 79 20 4d 61 6e 61 67 65 64 20 44 65  liary Managed De
1a320 62 75 67 67 69 6e 67 20 41 73 73 69 73 74 61 6e  bugging Assistan
1a330 74 73 20 28 4d 44 41 29 0d 0a 20 20 20 20 20 20  ts (MDA)..      
1a340 20 20 23 20 20 20 20 20 20 20 63 6f 6e 66 69 67    #       config
1a350 75 72 61 74 69 6f 6e 20 66 69 6c 65 73 20 74 68  uration files th
1a360 61 74 20 77 65 20 68 61 6e 64 6c 65 2e 0d 0a 20  at we handle... 
1a370 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
1a380 20 20 73 65 74 20 6d 64 61 43 6f 6e 66 69 67 46    set mdaConfigF
1a390 69 6c 65 4e 61 6d 65 73 20 5b 6c 69 73 74 20 5c  ileNames [list \
1a3a0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 45 61  ..            Ea
1a3b0 67 6c 65 53 68 65 6c 6c 33 32 2e 65 78 65 2e 6d  gleShell32.exe.m
1a3c0 64 61 2e 63 6f 6e 66 69 67 20 49 6e 73 74 61 6c  da.config Instal
1a3d0 6c 65 72 2e 65 78 65 2e 6d 64 61 2e 63 6f 6e 66  ler.exe.mda.conf
1a3e0 69 67 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  ig \..          
1a3f0 20 20 74 65 73 74 2e 65 78 65 2e 6d 64 61 2e 63    test.exe.mda.c
1a400 6f 6e 66 69 67 20 74 65 73 74 6c 69 6e 71 2e 65  onfig testlinq.e
1a410 78 65 2e 6d 64 61 2e 63 6f 6e 66 69 67 20 5c 0d  xe.mda.config \.
1a420 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73  .            tes
1a430 74 65 66 36 2e 65 78 65 2e 6d 64 61 2e 63 6f 6e  tef6.exe.mda.con
1a440 66 69 67 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  fig]....        
1a450 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
1a460 45 3a 20 42 75 69 6c 64 20 74 68 65 20 6c 69 73  E: Build the lis
1a470 74 20 6f 66 20 65 78 74 65 72 6e 61 6c 20 66 69  t of external fi
1a480 6c 65 73 20 74 68 61 74 20 77 65 20 68 61 6e 64  les that we hand
1a490 6c 65 2e 20 20 53 6f 6d 65 20 6f 66 0d 0a 20 20  le.  Some of..  
1a4a0 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68        #       th
1a4b0 65 73 65 20 66 69 6c 65 73 20 6d 61 79 20 62 65  ese files may be
1a4c0 20 6e 61 74 69 76 65 20 61 6e 64 2f 6f 72 20 6d   native and/or m
1a4d0 61 6e 61 67 65 64 20 61 73 73 65 6d 62 6c 69 65  anaged assemblie
1a4e0 73 20 74 68 61 74 20 61 72 65 0d 0a 20 20 20 20  s that are..    
1a4f0 20 20 20 20 23 20 20 20 20 20 20 20 72 65 71 75      #       requ
1a500 69 72 65 64 20 74 6f 20 70 65 72 66 6f 72 6d 20  ired to perform 
1a510 76 61 72 69 6f 75 73 20 74 65 73 74 73 2e 0d 0a  various tests...
1a520 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
1a530 20 20 20 73 65 74 20 65 78 74 65 72 6e 61 6c 46     set externalF
1a540 69 6c 65 4e 61 6d 65 73 20 5b 6c 69 73 74 20 5c  ileNames [list \
1a550 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 66  ..            [f
1a560 69 6c 65 20 6a 6f 69 6e 20 45 6e 74 69 74 79 46  ile join EntityF
1a570 72 61 6d 65 77 6f 72 6b 20 6c 69 62 20 5b 73 74  ramework lib [st
1a580 72 69 6e 67 20 6d 61 70 20 5b 6c 69 73 74 20 46  ring map [list F
1a590 78 20 22 22 5d 20 5b 73 74 72 69 6e 67 20 5c 0d  x ""] [string \.
1a5a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 61 70  .            map
1a5b0 20 5b 6c 69 73 74 20 6e 65 74 46 78 34 35 31 20   [list netFx451 
1a5c0 6e 65 74 46 78 34 35 5d 20 5b 67 65 74 42 75 69  netFx45] [getBui
1a5d0 6c 64 4e 65 74 46 78 5d 5d 5d 20 45 6e 74 69 74  ldNetFx]]] Entit
1a5e0 79 46 72 61 6d 65 77 6f 72 6b 2e 64 6c 6c 5d 5d  yFramework.dll]]
1a5f0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  ....        #.. 
1a600 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 42         # NOTE: B
1a610 75 69 6c 64 20 74 68 65 20 6c 69 73 74 20 6f 66  uild the list of
1a620 20 6e 61 74 69 76 65 20 61 73 73 65 6d 62 6c 79   native assembly
1a630 20 66 69 6c 65 73 20 74 68 61 74 20 77 65 20 68   files that we h
1a640 61 6e 64 6c 65 2e 20 20 54 68 65 0d 0a 20 20 20  andle.  The..   
1a650 20 20 20 20 20 23 20 20 20 20 20 20 20 72 65 61       #       rea
1a660 73 6f 6e 20 74 68 65 20 22 53 79 73 74 65 6d 2e  son the "System.
1a670 44 61 74 61 2e 53 51 4c 69 74 65 2e 64 6c 6c 22  Data.SQLite.dll"
1a680 20 66 69 6c 65 20 69 73 20 69 6e 63 6c 75 64 65   file is include
1a690 64 20 68 65 72 65 20 69 73 0d 0a 20 20 20 20 20  d here is..     
1a6a0 20 20 20 23 20 20 20 20 20 20 20 62 65 63 61 75     #       becau
1a6b0 73 65 20 69 74 20 63 6f 75 6c 64 20 62 65 20 74  se it could be t
1a6c0 68 65 20 6d 69 78 65 64 2d 6d 6f 64 65 20 61 73  he mixed-mode as
1a6d0 73 65 6d 62 6c 79 2e 0d 0a 20 20 20 20 20 20 20  sembly...       
1a6e0 20 23 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20   #..        set 
1a6f0 6e 61 74 69 76 65 46 69 6c 65 4e 61 6d 65 73 20  nativeFileNames 
1a700 5b 6c 69 73 74 20 5c 0d 0a 20 20 20 20 20 20 20  [list \..       
1a710 20 20 20 20 20 73 71 6c 69 74 65 33 2e 64 6c 6c       sqlite3.dll
1a720 20 53 51 4c 69 74 65 2e 49 6e 74 65 72 6f 70 2e   SQLite.Interop.
1a730 64 6c 6c 20 53 79 73 74 65 6d 2e 44 61 74 61 2e  dll System.Data.
1a740 53 51 4c 69 74 65 2e 64 6c 6c 5d 0d 0a 0d 0a 20  SQLite.dll].... 
1a750 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
1a760 20 20 23 20 4e 4f 54 45 3a 20 42 75 69 6c 64 20    # NOTE: Build 
1a770 74 68 65 20 6c 69 73 74 20 6f 66 20 6d 61 6e 61  the list of mana
1a780 67 65 64 20 61 73 73 65 6d 62 6c 79 20 66 69 6c  ged assembly fil
1a790 65 73 20 74 68 61 74 20 77 65 20 68 61 6e 64 6c  es that we handl
1a7a0 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  e...        #.. 
1a7b0 20 20 20 20 20 20 20 73 65 74 20 6d 61 6e 61 67         set manag
1a7c0 65 64 46 69 6c 65 4e 61 6d 65 73 20 5b 6c 69 73  edFileNames [lis
1a7d0 74 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  t \..           
1a7e0 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c   System.Data.SQL
1a7f0 69 74 65 2e 64 6c 6c 20 53 79 73 74 65 6d 2e 44  ite.dll System.D
1a800 61 74 61 2e 53 51 4c 69 74 65 2e 4c 69 6e 71 2e  ata.SQLite.Linq.
1a810 64 6c 6c 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  dll \..         
1a820 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53     System.Data.S
1a830 51 4c 69 74 65 2e 45 46 36 2e 64 6c 6c 5d 0d 0a  QLite.EF6.dll]..
1a840 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
1a850 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 52 65 6d       # NOTE: Rem
1a860 6f 76 65 20 61 6e 79 20 74 65 73 74 20 63 6f 6e  ove any test con
1a870 73 74 72 61 69 6e 74 73 20 74 68 61 74 20 72 65  straints that re
1a880 66 65 72 20 74 6f 20 74 68 65 20 6e 61 74 69 76  fer to the nativ
1a890 65 20 61 6e 64 2f 6f 72 0d 0a 20 20 20 20 20 20  e and/or..      
1a8a0 20 20 23 20 20 20 20 20 20 20 6d 61 6e 61 67 65    #       manage
1a8b0 64 20 61 73 73 65 6d 62 6c 79 20 66 69 6c 65 73  d assembly files
1a8c0 20 74 68 61 74 20 77 65 20 68 61 6e 64 6c 65 20   that we handle 
1a8d0 75 6e 6c 65 73 73 20 66 6f 72 62 69 64 64 65 6e  unless forbidden
1a8e0 20 66 72 6f 6d 0d 0a 20 20 20 20 20 20 20 20 23   from..        #
1a8f0 20 20 20 20 20 20 20 64 6f 69 6e 67 20 73 6f 2e         doing so.
1a900 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
1a910 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20       if {![info 
1a920 65 78 69 73 74 73 20 3a 3a 6e 6f 28 73 71 6c 69  exists ::no(sqli
1a930 74 65 52 65 6d 6f 76 65 43 6f 6e 73 74 72 61 69  teRemoveConstrai
1a940 6e 74 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  nts)]} then {.. 
1a950 20 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68           foreach
1a960 20 66 69 6c 65 4e 61 6d 65 20 24 63 6f 6e 66 69   fileName $confi
1a970 67 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20  gFileNames {..  
1a980 20 20 20 20 20 20 20 20 20 20 72 65 6d 6f 76 65            remove
1a990 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65  Constraint [appe
1a9a0 6e 64 41 72 67 73 20 66 69 6c 65 5f 20 24 66 69  ndArgs file_ $fi
1a9b0 6c 65 4e 61 6d 65 5d 0d 0a 20 20 20 20 20 20 20  leName]..       
1a9c0 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
1a9d0 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65 4e 61    foreach fileNa
1a9e0 6d 65 20 24 6d 64 61 43 6f 6e 66 69 67 46 69 6c  me $mdaConfigFil
1a9f0 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20  eNames {..      
1aa00 20 20 20 20 20 20 72 65 6d 6f 76 65 43 6f 6e 73        removeCons
1aa10 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72  traint [appendAr
1aa20 67 73 20 66 69 6c 65 5f 20 24 66 69 6c 65 4e 61  gs file_ $fileNa
1aa30 6d 65 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  me]..          }
1aa40 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 66 6f  ....          fo
1aa50 72 65 61 63 68 20 66 69 6c 65 4e 61 6d 65 20 24  reach fileName $
1aa60 65 78 74 65 72 6e 61 6c 46 69 6c 65 4e 61 6d 65  externalFileName
1aa70 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s {..           
1aa80 20 72 65 6d 6f 76 65 43 6f 6e 73 74 72 61 69 6e   removeConstrain
1aa90 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20 66 69  t [appendArgs fi
1aaa0 6c 65 5f 20 5b 66 69 6c 65 20 74 61 69 6c 20 24  le_ [file tail $
1aab0 66 69 6c 65 4e 61 6d 65 5d 5d 0d 0a 20 20 20 20  fileName]]..    
1aac0 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
1aad0 20 20 20 20 20 66 6f 72 65 61 63 68 20 66 69 6c       foreach fil
1aae0 65 4e 61 6d 65 20 24 6e 61 74 69 76 65 46 69 6c  eName $nativeFil
1aaf0 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20  eNames {..      
1ab00 20 20 20 20 20 20 72 65 6d 6f 76 65 43 6f 6e 73        removeCons
1ab10 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72  traint [appendAr
1ab20 67 73 20 66 69 6c 65 5f 20 24 66 69 6c 65 4e 61  gs file_ $fileNa
1ab30 6d 65 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  me]..          }
1ab40 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 66 6f  ....          fo
1ab50 72 65 61 63 68 20 66 69 6c 65 4e 61 6d 65 20 24  reach fileName $
1ab60 6d 61 6e 61 67 65 64 46 69 6c 65 4e 61 6d 65 73  managedFileNames
1ab70 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
1ab80 72 65 6d 6f 76 65 43 6f 6e 73 74 72 61 69 6e 74  removeConstraint
1ab90 20 5b 61 70 70 65 6e 64 41 72 67 73 20 66 69 6c   [appendArgs fil
1aba0 65 5f 20 24 66 69 6c 65 4e 61 6d 65 5d 0d 0a 20  e_ $fileName].. 
1abb0 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
1abc0 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
1abd0 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
1abe0 54 45 3a 20 53 6b 69 70 20 61 6c 6c 20 53 79 73  TE: Skip all Sys
1abf0 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 20  tem.Data.SQLite 
1ac00 72 65 6c 61 74 65 64 20 66 69 6c 65 20 68 61 6e  related file han
1ac10 64 6c 69 6e 67 20 28 64 65 6c 65 74 69 6e 67 2c  dling (deleting,
1ac20 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
1ac30 20 20 63 6f 70 79 69 6e 67 2c 20 61 6e 64 20 6c    copying, and l
1ac40 6f 61 64 69 6e 67 29 20 69 66 20 69 6e 73 74 72  oading) if instr
1ac50 75 63 74 65 64 2e 0d 0a 20 20 20 20 20 20 20 20  ucted...        
1ac60 23 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21  #..        if {!
1ac70 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e  [info exists ::n
1ac80 6f 28 73 71 6c 69 74 65 46 69 6c 65 73 29 5d 7d  o(sqliteFiles)]}
1ac90 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
1aca0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
1acb0 23 20 4e 4f 54 45 3a 20 53 6b 69 70 20 74 72 79  # NOTE: Skip try
1acc0 69 6e 67 20 74 6f 20 64 65 6c 65 74 65 20 61 6e  ing to delete an
1acd0 79 20 66 69 6c 65 73 20 69 66 20 69 6e 73 74 72  y files if instr
1ace0 75 63 74 65 64 2e 0d 0a 20 20 20 20 20 20 20 20  ucted...        
1acf0 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 69    #..          i
1ad00 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73  f {![info exists
1ad10 20 3a 3a 6e 6f 28 64 65 6c 65 74 65 53 71 6c 69   ::no(deleteSqli
1ad20 74 65 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e 20  teFiles)]} then 
1ad30 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  {..            i
1ad40 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73  f {![info exists
1ad50 20 3a 3a 6e 6f 28 64 65 6c 65 74 65 53 71 6c 69   ::no(deleteSqli
1ad60 74 65 43 6f 6e 66 69 67 46 69 6c 65 73 29 5d 7d  teConfigFiles)]}
1ad70 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
1ad80 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 66         foreach f
1ad90 69 6c 65 4e 61 6d 65 20 24 63 6f 6e 66 69 67 46  ileName $configF
1ada0 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20  ileNames {..    
1adb0 20 20 20 20 20 20 20 20 20 20 20 20 74 72 79 44              tryD
1adc0 65 6c 65 74 65 42 69 6e 61 72 79 46 69 6c 65 20  eleteBinaryFile 
1add0 24 66 69 6c 65 4e 61 6d 65 0d 0a 20 20 20 20 20  $fileName..     
1ade0 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
1adf0 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
1ae00 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69           if {![i
1ae10 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28  nfo exists ::no(
1ae20 64 65 6c 65 74 65 53 71 6c 69 74 65 45 78 74 65  deleteSqliteExte
1ae30 72 6e 61 6c 46 69 6c 65 73 29 5d 7d 20 74 68 65  rnalFiles)]} the
1ae40 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
1ae50 20 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65 4e     foreach fileN
1ae60 61 6d 65 20 24 6d 64 61 43 6f 6e 66 69 67 46 69  ame $mdaConfigFi
1ae70 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20  leNames {..     
1ae80 20 20 20 20 20 20 20 20 20 20 20 74 72 79 44 65             tryDe
1ae90 6c 65 74 65 42 75 69 6c 64 46 69 6c 65 20 24 66  leteBuildFile $f
1aea0 69 6c 65 4e 61 6d 65 0d 0a 20 20 20 20 20 20 20  ileName..       
1aeb0 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
1aec0 20 20 20 20 20 20 20 20 20 20 66 6f 72 65 61 63            foreac
1aed0 68 20 66 69 6c 65 4e 61 6d 65 20 24 65 78 74 65  h fileName $exte
1aee0 72 6e 61 6c 46 69 6c 65 4e 61 6d 65 73 20 7b 0d  rnalFileNames {.
1aef0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1af00 20 74 72 79 44 65 6c 65 74 65 42 69 6e 61 72 79   tryDeleteBinary
1af10 46 69 6c 65 20 24 66 69 6c 65 4e 61 6d 65 0d 0a  File $fileName..
1af20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d                }.
1af30 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  .            }..
1af40 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ..            if
1af50 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20   {![info exists 
1af60 3a 3a 6e 6f 28 64 65 6c 65 74 65 53 71 6c 69 74  ::no(deleteSqlit
1af70 65 4e 61 74 69 76 65 46 69 6c 65 73 29 5d 7d 20  eNativeFiles)]} 
1af80 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
1af90 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f        if {![info
1afa0 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 64 65 6c   exists ::no(del
1afb0 65 74 65 53 71 6c 69 74 65 49 6d 70 6c 69 63 69  eteSqliteImplici
1afc0 74 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e 20 7b  tFiles)]} then {
1afd0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1afe0 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65 4e 61    foreach fileNa
1aff0 6d 65 20 24 6e 61 74 69 76 65 46 69 6c 65 4e 61  me $nativeFileNa
1b000 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  mes {..         
1b010 20 20 20 20 20 20 20 20 20 74 72 79 44 65 6c 65           tryDele
1b020 74 65 41 73 73 65 6d 62 6c 79 20 24 66 69 6c 65  teAssembly $file
1b030 4e 61 6d 65 0d 0a 20 20 20 20 20 20 20 20 20 20  Name..          
1b040 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
1b050 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
1b060 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b            if {![
1b070 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f  info exists ::no
1b080 28 64 65 6c 65 74 65 53 71 6c 69 74 65 4e 6f 6e  (deleteSqliteNon
1b090 49 6d 70 6c 69 63 69 74 46 69 6c 65 73 29 5d 7d  ImplicitFiles)]}
1b0a0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
1b0b0 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69           if {![i
1b0c0 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28  nfo exists ::no(
1b0d0 64 65 6c 65 74 65 53 71 6c 69 74 65 50 6c 61 74  deleteSqlitePlat
1b0e0 66 6f 72 6d 46 69 6c 65 73 29 5d 20 26 26 20 5c  formFiles)] && \
1b0f0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1b100 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65        [string le
1b110 6e 67 74 68 20 24 70 6c 61 74 66 6f 72 6d 5d 20  ngth $platform] 
1b120 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  > 0} then {..   
1b130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66                 f
1b140 6f 72 65 61 63 68 20 66 69 6c 65 4e 61 6d 65 20  oreach fileName 
1b150 24 6e 61 74 69 76 65 46 69 6c 65 4e 61 6d 65 73  $nativeFileNames
1b160 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
1b170 20 20 20 20 20 20 20 20 74 72 79 44 65 6c 65 74          tryDelet
1b180 65 41 73 73 65 6d 62 6c 79 20 24 66 69 6c 65 4e  eAssembly $fileN
1b190 61 6d 65 20 24 70 6c 61 74 66 6f 72 6d 0d 0a 20  ame $platform.. 
1b1a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b1b0 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   }..            
1b1c0 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
1b1d0 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69           if {![i
1b1e0 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28  nfo exists ::no(
1b1f0 64 65 6c 65 74 65 53 71 6c 69 74 65 41 72 63 68  deleteSqliteArch
1b200 69 74 65 63 74 75 72 65 46 69 6c 65 73 29 5d 20  itectureFiles)] 
1b210 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  && \..          
1b220 20 20 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e            [strin
1b230 67 20 6c 65 6e 67 74 68 20 24 61 72 63 68 69 74  g length $archit
1b240 65 63 74 75 72 65 5d 20 3e 20 30 7d 20 74 68 65  ecture] > 0} the
1b250 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
1b260 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 66         foreach f
1b270 69 6c 65 4e 61 6d 65 20 24 6e 61 74 69 76 65 46  ileName $nativeF
1b280 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20  ileNames {..    
1b290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b2a0 74 72 79 44 65 6c 65 74 65 41 73 73 65 6d 62 6c  tryDeleteAssembl
1b2b0 79 20 24 66 69 6c 65 4e 61 6d 65 20 24 61 72 63  y $fileName $arc
1b2c0 68 69 74 65 63 74 75 72 65 0d 0a 20 20 20 20 20  hitecture..     
1b2d0 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a               }..
1b2e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b2f0 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  }..             
1b300 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   }..            
1b310 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  }....           
1b320 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73   if {![info exis
1b330 74 73 20 3a 3a 6e 6f 28 64 65 6c 65 74 65 53 71  ts ::no(deleteSq
1b340 6c 69 74 65 4d 61 6e 61 67 65 64 46 69 6c 65 73  liteManagedFiles
1b350 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  )]} then {..    
1b360 20 20 20 20 20 20 20 20 20 20 66 6f 72 65 61 63            foreac
1b370 68 20 66 69 6c 65 4e 61 6d 65 20 24 6d 61 6e 61  h fileName $mana
1b380 67 65 64 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a  gedFileNames {..
1b390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b3a0 74 72 79 44 65 6c 65 74 65 41 73 73 65 6d 62 6c  tryDeleteAssembl
1b3b0 79 20 24 66 69 6c 65 4e 61 6d 65 0d 0a 20 20 20  y $fileName..   
1b3c0 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
1b3d0 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
1b3e0 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
1b3f0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
1b400 20 20 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b     # NOTE: Check
1b410 20 66 6f 72 20 74 68 65 20 22 61 75 74 6f 53 65   for the "autoSe
1b420 6c 65 63 74 22 20 72 75 6e 74 69 6d 65 20 6f 70  lect" runtime op
1b430 74 69 6f 6e 2e 20 20 49 66 20 70 72 65 73 65 6e  tion.  If presen
1b440 74 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20  t,..          # 
1b450 20 20 20 20 20 20 61 74 74 65 6d 70 74 20 74 6f        attempt to
1b460 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 73   automatically s
1b470 65 6c 65 63 74 20 74 68 65 20 66 69 72 73 74 20  elect the first 
1b480 61 76 61 69 6c 61 62 6c 65 0d 0a 20 20 20 20 20  available..     
1b490 20 20 20 20 20 23 20 20 20 20 20 20 20 62 75 69       #       bui
1b4a0 6c 64 20 28 6f 72 20 22 72 65 6c 65 61 73 65 22  ld (or "release"
1b4b0 29 20 6f 66 20 53 51 4c 69 74 65 20 61 6e 64 20  ) of SQLite and 
1b4c0 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
1b4d0 74 65 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20  te..          # 
1b4e0 20 20 20 20 20 20 66 6f 72 20 75 73 65 20 77 69        for use wi
1b4f0 74 68 20 74 68 65 20 74 65 73 74 20 73 75 69 74  th the test suit
1b500 65 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d  e...          #.
1b510 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b  .          if {[
1b520 68 61 73 52 75 6e 74 69 6d 65 4f 70 74 69 6f 6e  hasRuntimeOption
1b530 20 61 75 74 6f 53 65 6c 65 63 74 5d 7d 20 74 68   autoSelect]} th
1b540 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
1b550 20 20 69 66 20 7b 21 5b 63 68 65 63 6b 46 6f 72    if {![checkFor
1b560 53 51 4c 69 74 65 42 75 69 6c 64 73 20 24 3a 3a  SQLiteBuilds $::
1b570 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 74 72 75  test_channel tru
1b580 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  e]} then {..    
1b590 20 20 20 20 20 20 20 20 20 20 63 68 65 63 6b 46            checkF
1b5a0 6f 72 53 51 4c 69 74 65 52 65 6c 65 61 73 65 73  orSQLiteReleases
1b5b0 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
1b5c0 20 74 72 75 65 0d 0a 20 20 20 20 20 20 20 20 20   true..         
1b5d0 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
1b5e0 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 23  }....          #
1b5f0 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f  ..          # NO
1b600 54 45 3a 20 53 6b 69 70 20 74 72 79 69 6e 67 20  TE: Skip trying 
1b610 74 6f 20 76 65 72 69 66 79 20 74 68 65 20 62 75  to verify the bu
1b620 69 6c 64 20 64 69 72 65 63 74 6f 72 79 20 69 66  ild directory if
1b630 20 69 6e 73 74 72 75 63 74 65 64 3b 0d 0a 20 20   instructed;..  
1b640 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
1b650 6f 74 68 65 72 77 69 73 65 2c 20 6d 61 6b 65 20  otherwise, make 
1b660 73 75 72 65 20 69 74 20 61 63 74 75 61 6c 6c 79  sure it actually
1b670 20 65 78 69 73 74 73 20 6f 72 20 68 61 6c 74 20   exists or halt 
1b680 74 68 65 20 65 6e 74 69 72 65 0d 0a 20 20 20 20  the entire..    
1b690 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74 65        #       te
1b6a0 73 74 69 6e 67 20 70 72 6f 63 65 73 73 20 69 66  sting process if
1b6b0 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 65 78 69   it does not exi
1b6c0 73 74 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23  st...          #
1b6d0 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b  ..          if {
1b6e0 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  ![info exists ::
1b6f0 6e 6f 28 76 65 72 69 66 79 42 75 69 6c 64 44 69  no(verifyBuildDi
1b700 72 65 63 74 6f 72 79 29 5d 7d 20 74 68 65 6e 20  rectory)]} then 
1b710 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23  {..            #
1b720 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 20  ..            # 
1b730 4e 4f 54 45 3a 20 41 74 20 74 68 69 73 20 70 6f  NOTE: At this po
1b740 69 6e 74 2c 20 74 68 65 20 62 75 69 6c 64 20 64  int, the build d
1b750 69 72 65 63 74 6f 72 79 20 4d 55 53 54 20 65 78  irectory MUST ex
1b760 69 73 74 20 61 73 20 61 0d 0a 20 20 20 20 20 20  ist as a..      
1b770 20 20 20 20 20 20 23 20 20 20 20 20 20 20 76 61        #       va
1b780 6c 69 64 20 64 69 72 65 63 74 6f 72 79 20 66 6f  lid directory fo
1b790 72 20 74 68 65 20 74 65 73 74 69 6e 67 20 70 72  r the testing pr
1b7a0 6f 63 65 73 73 20 74 6f 20 63 6f 6e 74 69 6e 75  ocess to continu
1b7b0 65 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  e...            
1b7c0 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  #..            s
1b7d0 65 74 20 64 69 72 65 63 74 6f 72 79 20 5b 67 65  et directory [ge
1b7e0 74 42 75 69 6c 64 44 69 72 65 63 74 6f 72 79 5d  tBuildDirectory]
1b7f0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
1b800 69 66 20 7b 21 5b 66 69 6c 65 20 65 78 69 73 74  if {![file exist
1b810 73 20 24 64 69 72 65 63 74 6f 72 79 5d 20 7c 7c  s $directory] ||
1b820 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
1b830 20 20 20 20 21 5b 66 69 6c 65 20 69 73 64 69 72      ![file isdir
1b840 65 63 74 6f 72 79 20 24 64 69 72 65 63 74 6f 72  ectory $director
1b850 79 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  y]} then {..    
1b860 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
1b870 20 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54             # NOT
1b880 45 3a 20 4a 75 73 74 20 70 72 69 6f 72 20 74 6f  E: Just prior to
1b890 20 61 63 74 75 61 6c 6c 79 20 68 61 6c 74 69 6e   actually haltin
1b8a0 67 20 74 68 65 20 74 65 73 74 69 6e 67 20 70 72  g the testing pr
1b8b0 6f 63 65 73 73 2c 0d 0a 20 20 20 20 20 20 20 20  ocess,..        
1b8c0 20 20 20 20 20 20 23 20 20 20 20 20 20 20 61 64        #       ad
1b8d0 64 20 61 6e 20 65 72 72 6f 72 20 74 6f 20 74 68  d an error to th
1b8e0 65 20 74 65 73 74 20 6c 6f 67 20 66 69 6c 65 2e  e test log file.
1b8f0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1b900 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  #..             
1b910 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
1b920 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
1b930 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
1b940 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 6f          "---- co
1b950 75 6c 64 20 6e 6f 74 20 76 65 72 69 66 79 20 62  uld not verify b
1b960 75 69 6c 64 20 64 69 72 65 63 74 6f 72 79 20 5c  uild directory \
1b970 22 22 20 24 64 69 72 65 63 74 6f 72 79 20 5c 0d  "" $directory \.
1b980 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1b990 20 20 20 22 5c 22 2c 20 61 6c 6c 20 74 65 73 74     "\", all test
1b9a0 69 6e 67 20 68 61 6c 74 65 64 5c 6e 22 5d 0d 0a  ing halted\n"]..
1b9b0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1b9c0 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  #..             
1b9d0 20 23 20 4e 4f 54 45 3a 20 52 61 69 73 69 6e 67   # NOTE: Raising
1b9e0 20 61 20 73 63 72 69 70 74 20 65 72 72 6f 72 20   a script error 
1b9f0 66 72 6f 6d 20 74 68 69 73 20 70 6f 69 6e 74 20  from this point 
1ba00 73 68 6f 75 6c 64 20 68 61 6c 74 0d 0a 20 20 20  should halt..   
1ba10 20 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20             #    
1ba20 20 20 20 74 68 65 20 74 65 73 74 69 6e 67 20 70     the testing p
1ba30 72 6f 63 65 73 73 2e 0d 0a 20 20 20 20 20 20 20  rocess...       
1ba40 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
1ba50 20 20 20 20 20 20 20 20 65 72 72 6f 72 20 5b 61          error [a
1ba60 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
1ba70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
1ba80 63 6f 75 6c 64 20 6e 6f 74 20 76 65 72 69 66 79  could not verify
1ba90 20 62 75 69 6c 64 20 64 69 72 65 63 74 6f 72 79   build directory
1baa0 20 5c 22 22 20 24 64 69 72 65 63 74 6f 72 79 20   \"" $directory 
1bab0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
1bac0 20 20 20 20 20 22 5c 22 2c 20 61 6c 6c 20 74 65       "\", all te
1bad0 73 74 69 6e 67 20 68 61 6c 74 65 64 22 5d 0d 0a  sting halted"]..
1bae0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
1baf0 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20           }....  
1bb00 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
1bb10 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 6b 69       # NOTE: Ski
1bb20 70 20 74 72 79 69 6e 67 20 74 6f 20 63 6f 70 79  p trying to copy
1bb30 20 61 6e 79 20 66 69 6c 65 73 20 69 66 20 69 6e   any files if in
1bb40 73 74 72 75 63 74 65 64 2e 0d 0a 20 20 20 20 20  structed...     
1bb50 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
1bb60 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69    if {![info exi
1bb70 73 74 73 20 3a 3a 6e 6f 28 63 6f 70 79 53 71 6c  sts ::no(copySql
1bb80 69 74 65 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e  iteFiles)]} then
1bb90 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
1bba0 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74  if {![info exist
1bbb0 73 20 3a 3a 6e 6f 28 63 6f 70 79 53 71 6c 69 74  s ::no(copySqlit
1bbc0 65 43 6f 6e 66 69 67 46 69 6c 65 73 29 5d 7d 20  eConfigFiles)]} 
1bbd0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
1bbe0 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 66 69        foreach fi
1bbf0 6c 65 4e 61 6d 65 20 24 63 6f 6e 66 69 67 46 69  leName $configFi
1bc00 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20  leNames {..     
1bc10 20 20 20 20 20 20 20 20 20 20 20 74 72 79 43 6f             tryCo
1bc20 70 79 42 75 69 6c 64 46 69 6c 65 20 24 66 69 6c  pyBuildFile $fil
1bc30 65 4e 61 6d 65 0d 0a 20 20 20 20 20 20 20 20 20  eName..         
1bc40 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
1bc50 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
1bc60 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20       if {![info 
1bc70 65 78 69 73 74 73 20 3a 3a 6e 6f 28 63 6f 70 79  exists ::no(copy
1bc80 53 71 6c 69 74 65 45 78 74 65 72 6e 61 6c 46 69  SqliteExternalFi
1bc90 6c 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  les)]} then {.. 
1bca0 20 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a               #..
1bcb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20                # 
1bcc0 4e 4f 54 45 3a 20 43 6f 70 79 20 74 68 65 20 4d  NOTE: Copy the M
1bcd0 61 6e 61 67 65 64 20 44 65 62 75 67 67 69 6e 67  anaged Debugging
1bce0 20 41 73 73 69 73 74 61 6e 74 73 20 28 4d 44 41   Assistants (MDA
1bcf0 29 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 0d  ) configuration.
1bd00 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23  .              #
1bd10 20 20 20 20 20 20 20 66 69 6c 65 20 66 6f 72 20         file for 
1bd20 74 68 65 20 45 61 67 6c 65 20 73 68 65 6c 6c 20  the Eagle shell 
1bd30 74 6f 20 74 68 65 20 62 75 69 6c 64 20 6f 75 74  to the build out
1bd40 70 75 74 20 64 69 72 65 63 74 6f 72 79 2c 0d 0a  put directory,..
1bd50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20                # 
1bd60 20 20 20 20 20 20 77 68 69 6c 65 20 75 73 69 6e        while usin
1bd70 67 20 65 61 63 68 20 6f 66 20 74 68 65 20 6e 61  g each of the na
1bd80 6d 65 73 20 6f 66 20 74 68 65 20 76 61 72 69 6f  mes of the vario
1bd90 75 73 20 6c 65 67 61 63 79 20 74 65 73 74 0d 0a  us legacy test..
1bda0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20                # 
1bdb0 20 20 20 20 20 20 65 78 65 63 75 74 61 62 6c 65        executable
1bdc0 73 2e 20 20 54 68 69 73 20 77 69 6c 6c 20 68 65  s.  This will he
1bdd0 6c 70 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20  lp to make sure 
1bde0 74 68 61 74 20 61 6c 6c 20 74 68 65 0d 0a 20 20  that all the..  
1bdf0 20 20 20 20 20 20 20 20 20 20 20 20 23 20 20 20              #   
1be00 20 20 20 20 6c 65 67 61 63 79 20 74 65 73 74 73      legacy tests
1be10 20 72 75 6e 20 77 69 74 68 20 65 78 61 63 74 6c   run with exactl
1be20 79 20 74 68 65 20 73 61 6d 65 20 73 65 74 20 6f  y the same set o
1be30 66 20 4d 61 6e 61 67 65 64 0d 0a 20 20 20 20 20  f Managed..     
1be40 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20           #      
1be50 20 44 65 62 75 67 67 69 6e 67 20 41 73 73 69 73   Debugging Assis
1be60 74 61 6e 74 73 20 63 6f 6e 66 69 67 75 72 65 64  tants configured
1be70 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
1be80 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   #..            
1be90 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65 4e 61    foreach fileNa
1bea0 6d 65 20 24 6d 64 61 43 6f 6e 66 69 67 46 69 6c  me $mdaConfigFil
1beb0 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20  eNames {..      
1bec0 20 20 20 20 20 20 20 20 20 20 74 72 79 43 6f 70            tryCop
1bed0 79 42 69 6e 61 72 79 46 69 6c 65 20 45 61 67 6c  yBinaryFile Eagl
1bee0 65 53 68 65 6c 6c 2e 65 78 65 2e 6d 64 61 2e 63  eShell.exe.mda.c
1bef0 6f 6e 66 69 67 20 22 22 20 24 66 69 6c 65 4e 61  onfig "" $fileNa
1bf00 6d 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  me..            
1bf10 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20    }....         
1bf20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
1bf30 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 6f        # NOTE: Co
1bf40 70 79 20 74 68 65 20 65 78 74 65 72 6e 61 6c 20  py the external 
1bf50 62 69 6e 61 72 69 65 73 2c 20 69 66 20 61 6e 79  binaries, if any
1bf60 2c 20 74 6f 20 74 68 65 20 64 69 72 65 63 74 6f  , to the directo
1bf70 72 79 20 74 68 61 74 0d 0a 20 20 20 20 20 20 20  ry that..       
1bf80 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63         #       c
1bf90 6f 6e 74 61 69 6e 73 20 74 68 65 20 45 61 67 6c  ontains the Eagl
1bfa0 65 20 73 68 65 6c 6c 2e 20 20 54 68 69 73 20 69  e shell.  This i
1bfb0 73 20 74 79 70 69 63 61 6c 6c 79 20 75 73 65 64  s typically used
1bfc0 20 74 6f 20 6d 61 6b 65 0d 0a 20 20 20 20 20 20   to make..      
1bfd0 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
1bfe0 73 75 72 65 20 61 73 73 65 6d 62 6c 69 65 73 20  sure assemblies 
1bff0 72 65 66 65 72 65 6e 63 65 64 20 62 79 20 74 68  referenced by th
1c000 65 20 6f 6e 65 73 20 62 65 69 6e 67 20 74 65 73  e ones being tes
1c010 74 65 64 20 61 72 65 0d 0a 20 20 20 20 20 20 20  ted are..       
1c020 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 61         #       a
1c030 76 61 69 6c 61 62 6c 65 20 64 75 72 69 6e 67 20  vailable during 
1c040 74 68 65 20 74 65 73 74 69 6e 67 20 70 72 6f 63  the testing proc
1c050 65 73 73 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  ess...          
1c060 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
1c070 20 20 20 20 20 66 6f 72 65 61 63 68 20 66 69 6c       foreach fil
1c080 65 4e 61 6d 65 20 24 65 78 74 65 72 6e 61 6c 46  eName $externalF
1c090 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20  ileNames {..    
1c0a0 20 20 20 20 20 20 20 20 20 20 20 20 74 72 79 43              tryC
1c0b0 6f 70 79 45 78 74 65 72 6e 61 6c 46 69 6c 65 20  opyExternalFile 
1c0c0 24 66 69 6c 65 4e 61 6d 65 0d 0a 20 20 20 20 20  $fileName..     
1c0d0 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
1c0e0 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
1c0f0 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69           if {![i
1c100 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28  nfo exists ::no(
1c110 63 6f 70 79 53 71 6c 69 74 65 4e 61 74 69 76 65  copySqliteNative
1c120 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d  Files)]} then {.
1c130 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23  .              #
1c140 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1c150 23 20 4e 4f 54 45 3a 20 49 66 20 74 68 65 20 74  # NOTE: If the t
1c160 65 73 74 20 70 6c 61 74 66 6f 72 6d 20 69 73 20  est platform is 
1c170 6c 69 6b 65 6c 79 20 74 68 65 20 64 65 66 61 75  likely the defau
1c180 6c 74 20 66 6f 72 20 74 68 69 73 0d 0a 20 20 20  lt for this..   
1c190 20 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20             #    
1c1a0 20 20 20 6d 61 63 68 69 6e 65 2c 20 61 6c 73 6f     machine, also
1c1b0 20 74 72 79 20 74 6f 20 63 6f 70 79 20 74 68 65   try to copy the
1c1c0 20 6e 61 74 69 76 65 20 66 69 6c 65 73 20 74 6f   native files to
1c1d0 20 74 68 65 0d 0a 20 20 20 20 20 20 20 20 20 20   the..          
1c1e0 20 20 20 20 23 20 20 20 20 20 20 20 62 69 6e 61      #       bina
1c1f0 72 79 20 6c 6f 63 61 74 69 6f 6e 2e 0d 0a 20 20  ry location...  
1c200 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20              #.. 
1c210 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20               if 
1c220 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a  {![info exists :
1c230 3a 6e 6f 28 63 6f 70 79 53 71 6c 69 74 65 49 6d  :no(copySqliteIm
1c240 70 6c 69 63 69 74 46 69 6c 65 73 29 5d 20 26 26  plicitFiles)] &&
1c250 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
1c260 20 20 20 20 20 20 5b 69 73 44 65 66 61 75 6c 74        [isDefault
1c270 42 75 69 6c 64 50 6c 61 74 66 6f 72 6d 20 74 72  BuildPlatform tr
1c280 75 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  ue]} then {..   
1c290 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72               for
1c2a0 65 61 63 68 20 66 69 6c 65 4e 61 6d 65 20 24 6e  each fileName $n
1c2b0 61 74 69 76 65 46 69 6c 65 4e 61 6d 65 73 20 7b  ativeFileNames {
1c2c0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1c2d0 20 20 20 20 74 72 79 43 6f 70 79 41 73 73 65 6d      tryCopyAssem
1c2e0 62 6c 79 20 24 66 69 6c 65 4e 61 6d 65 0d 0a 20  bly $fileName.. 
1c2f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
1c300 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1c310 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  }....           
1c320 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78     if {![info ex
1c330 69 73 74 73 20 3a 3a 6e 6f 28 63 6f 70 79 53 71  ists ::no(copySq
1c340 6c 69 74 65 4e 6f 6e 49 6d 70 6c 69 63 69 74 46  liteNonImplicitF
1c350 69 6c 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a  iles)]} then {..
1c360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c370 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74  if {![info exist
1c380 73 20 3a 3a 6e 6f 28 63 6f 70 79 53 71 6c 69 74  s ::no(copySqlit
1c390 65 50 6c 61 74 66 6f 72 6d 46 69 6c 65 73 29 5d  ePlatformFiles)]
1c3a0 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20   && \..         
1c3b0 20 20 20 20 20 20 20 20 20 20 20 5b 73 74 72 69             [stri
1c3c0 6e 67 20 6c 65 6e 67 74 68 20 24 70 6c 61 74 66  ng length $platf
1c3d0 6f 72 6d 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b  orm] > 0} then {
1c3e0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1c3f0 20 20 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65      foreach file
1c400 4e 61 6d 65 20 24 6e 61 74 69 76 65 46 69 6c 65  Name $nativeFile
1c410 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20 20  Names {..       
1c420 20 20 20 20 20 20 20 20 20 20 20 20 20 74 72 79               try
1c430 43 6f 70 79 41 73 73 65 6d 62 6c 79 20 24 66 69  CopyAssembly $fi
1c440 6c 65 4e 61 6d 65 20 24 70 6c 61 74 66 6f 72 6d  leName $platform
1c450 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1c460 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
1c470 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
1c480 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b              if {
1c490 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  ![info exists ::
1c4a0 6e 6f 28 63 6f 70 79 53 71 6c 69 74 65 41 72 63  no(copySqliteArc
1c4b0 68 69 74 65 63 74 75 72 65 46 69 6c 65 73 29 5d  hitectureFiles)]
1c4c0 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20   && \..         
1c4d0 20 20 20 20 20 20 20 20 20 20 20 5b 73 74 72 69             [stri
1c4e0 6e 67 20 6c 65 6e 67 74 68 20 24 61 72 63 68 69  ng length $archi
1c4f0 74 65 63 74 75 72 65 5d 20 3e 20 30 7d 20 74 68  tecture] > 0} th
1c500 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
1c510 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20          foreach 
1c520 66 69 6c 65 4e 61 6d 65 20 24 6e 61 74 69 76 65  fileName $native
1c530 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20  FileNames {..   
1c540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c550 20 74 72 79 43 6f 70 79 41 73 73 65 6d 62 6c 79   tryCopyAssembly
1c560 20 24 66 69 6c 65 4e 61 6d 65 20 24 61 72 63 68   $fileName $arch
1c570 69 74 65 63 74 75 72 65 0d 0a 20 20 20 20 20 20  itecture..      
1c580 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
1c590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
1c5a0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1c5b0 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  }..            }
1c5c0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
1c5d0 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74  if {![info exist
1c5e0 73 20 3a 3a 6e 6f 28 63 6f 70 79 53 71 6c 69 74  s ::no(copySqlit
1c5f0 65 4d 61 6e 61 67 65 64 46 69 6c 65 73 29 5d 7d  eManagedFiles)]}
1c600 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
1c610 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 66         foreach f
1c620 69 6c 65 4e 61 6d 65 20 24 6d 61 6e 61 67 65 64  ileName $managed
1c630 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20  FileNames {..   
1c640 20 20 20 20 20 20 20 20 20 20 20 20 20 74 72 79               try
1c650 43 6f 70 79 41 73 73 65 6d 62 6c 79 20 24 66 69  CopyAssembly $fi
1c660 6c 65 4e 61 6d 65 0d 0a 20 20 20 20 20 20 20 20  leName..        
1c670 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
1c680 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
1c690 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20    }....         
1c6a0 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20   #..          # 
1c6b0 4e 4f 54 45 3a 20 53 6b 69 70 20 74 72 79 69 6e  NOTE: Skip tryin
1c6c0 67 20 74 6f 20 6c 6f 61 64 20 61 6e 79 20 66 69  g to load any fi
1c6d0 6c 65 73 20 69 66 20 69 6e 73 74 72 75 63 74 65  les if instructe
1c6e0 64 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d  d...          #.
1c6f0 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21  .          if {!
1c700 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e  [info exists ::n
1c710 6f 28 6c 6f 61 64 53 71 6c 69 74 65 46 69 6c 65  o(loadSqliteFile
1c720 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  s)]} then {..   
1c730 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69           if {![i
1c740 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28  nfo exists ::no(
1c750 6c 6f 61 64 53 71 6c 69 74 65 49 6d 70 6c 69 63  loadSqliteImplic
1c760 69 74 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e 20  itFiles)]} then 
1c770 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
1c780 20 74 72 79 4c 6f 61 64 41 73 73 65 6d 62 6c 79   tryLoadAssembly
1c790 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c   System.Data.SQL
1c7a0 69 74 65 2e 64 6c 6c 0d 0a 20 20 20 20 20 20 20  ite.dll..       
1c7b0 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
1c7c0 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f        if {![info
1c7d0 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 6c 6f 61   exists ::no(loa
1c7e0 64 53 71 6c 69 74 65 4c 69 6e 71 46 69 6c 65 73  dSqliteLinqFiles
1c7f0 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  )]} then {..    
1c800 20 20 20 20 20 20 20 20 20 20 74 72 79 4c 6f 61            tryLoa
1c810 64 41 73 73 65 6d 62 6c 79 20 53 79 73 74 65 6d  dAssembly System
1c820 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 4c 69 6e  .Data.SQLite.Lin
1c830 71 2e 64 6c 6c 0d 0a 20 20 20 20 20 20 20 20 20  q.dll..         
1c840 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
1c850 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65      if {![info e
1c860 78 69 73 74 73 20 3a 3a 6e 6f 28 6c 6f 61 64 53  xists ::no(loadS
1c870 71 6c 69 74 65 45 66 36 46 69 6c 65 73 29 5d 7d  qliteEf6Files)]}
1c880 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
1c890 20 20 20 20 20 20 20 74 72 79 4c 6f 61 64 41 73         tryLoadAs
1c8a0 73 65 6d 62 6c 79 20 53 79 73 74 65 6d 2e 44 61  sembly System.Da
1c8b0 74 61 2e 53 51 4c 69 74 65 2e 45 46 36 2e 64 6c  ta.SQLite.EF6.dl
1c8c0 6c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  l..            }
1c8d0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
1c8e0 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74  if {![info exist
1c8f0 73 20 3a 3a 6e 6f 28 6c 6f 61 64 53 71 6c 69 74  s ::no(loadSqlit
1c900 65 4e 6f 6e 49 6d 70 6c 69 63 69 74 46 69 6c 65  eNonImplicitFile
1c910 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  s)]} then {..   
1c920 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21             if {!
1c930 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e  [info exists ::n
1c940 6f 28 6c 6f 61 64 53 71 6c 69 74 65 50 6c 61 74  o(loadSqlitePlat
1c950 66 6f 72 6d 46 69 6c 65 73 29 5d 20 26 26 20 5c  formFiles)] && \
1c960 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1c970 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67      [string leng
1c980 74 68 20 24 70 6c 61 74 66 6f 72 6d 5d 20 3e 20  th $platform] > 
1c990 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
1c9a0 20 20 20 20 20 20 20 20 20 20 20 74 72 79 4c 6f             tryLo
1c9b0 61 64 41 73 73 65 6d 62 6c 79 20 53 79 73 74 65  adAssembly Syste
1c9c0 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 64 6c  m.Data.SQLite.dl
1c9d0 6c 20 24 70 6c 61 74 66 6f 72 6d 0d 0a 20 20 20  l $platform..   
1c9e0 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a             }....
1c9f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
1ca00 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20   {![info exists 
1ca10 3a 3a 6e 6f 28 6c 6f 61 64 53 71 6c 69 74 65 41  ::no(loadSqliteA
1ca20 72 63 68 69 74 65 63 74 75 72 65 46 69 6c 65 73  rchitectureFiles
1ca30 29 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20  )] && \..       
1ca40 20 20 20 20 20 20 20 20 20 20 20 5b 73 74 72 69             [stri
1ca50 6e 67 20 6c 65 6e 67 74 68 20 24 61 72 63 68 69  ng length $archi
1ca60 74 65 63 74 75 72 65 5d 20 3e 20 30 7d 20 74 68  tecture] > 0} th
1ca70 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
1ca80 20 20 20 20 20 20 74 72 79 4c 6f 61 64 41 73 73        tryLoadAss
1ca90 65 6d 62 6c 79 20 53 79 73 74 65 6d 2e 44 61 74  embly System.Dat
1caa0 61 2e 53 51 4c 69 74 65 2e 64 6c 6c 20 24 61 72  a.SQLite.dll $ar
1cab0 63 68 69 74 65 63 74 75 72 65 0d 0a 20 20 20 20  chitecture..    
1cac0 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
1cad0 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
1cae0 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
1caf0 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 63 61   }....        ca
1cb00 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  tch {..         
1cb10 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
1cb20 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
1cb30 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
1cb40 20 20 20 20 22 2d 2d 2d 2d 20 66 69 6c 65 20 76      "---- file v
1cb50 65 72 73 69 6f 6e 20 6f 66 20 5c 22 73 71 6c 69  ersion of \"sqli
1cb60 74 65 33 2e 64 6c 6c 5c 22 2e 2e 2e 20 22 20 5c  te3.dll\"... " \
1cb70 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1cb80 5b 66 69 6c 65 20 76 65 72 73 69 6f 6e 20 5b 67  [file version [g
1cb90 65 74 42 69 6e 61 72 79 46 69 6c 65 4e 61 6d 65  etBinaryFileName
1cba0 20 73 71 6c 69 74 65 33 2e 64 6c 6c 5d 5d 20 5c   sqlite3.dll]] \
1cbb0 6e 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d  n]..        }...
1cbc0 0a 20 20 20 20 20 20 20 20 63 61 74 63 68 20 7b  .        catch {
1cbd0 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70 75 74  ..          tput
1cbe0 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
1cbf0 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
1cc00 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22  .              "
1cc10 2d 2d 2d 2d 20 66 69 6c 65 20 76 65 72 73 69 6f  ---- file versio
1cc20 6e 20 6f 66 20 5c 22 53 51 4c 69 74 65 2e 49 6e  n of \"SQLite.In
1cc30 74 65 72 6f 70 2e 64 6c 6c 5c 22 2e 2e 2e 20 22  terop.dll\"... "
1cc40 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
1cc50 20 20 5b 66 69 6c 65 20 76 65 72 73 69 6f 6e 20    [file version 
1cc60 5b 67 65 74 42 69 6e 61 72 79 46 69 6c 65 4e 61  [getBinaryFileNa
1cc70 6d 65 20 53 51 4c 69 74 65 2e 49 6e 74 65 72 6f  me SQLite.Intero
1cc80 70 2e 64 6c 6c 5d 5d 20 5c 6e 5d 0d 0a 20 20 20  p.dll]] \n]..   
1cc90 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
1cca0 20 20 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20    catch {..     
1ccb0 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
1ccc0 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
1ccd0 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
1cce0 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 66 69          "---- fi
1ccf0 6c 65 20 76 65 72 73 69 6f 6e 20 6f 66 20 5c 22  le version of \"
1cd00 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
1cd10 74 65 2e 64 6c 6c 5c 22 2e 2e 2e 20 22 20 5c 0d  te.dll\"... " \.
1cd20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b  .              [
1cd30 66 69 6c 65 20 76 65 72 73 69 6f 6e 20 5b 67 65  file version [ge
1cd40 74 42 69 6e 61 72 79 46 69 6c 65 4e 61 6d 65 20  tBinaryFileName 
1cd50 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
1cd60 74 65 2e 64 6c 6c 5d 5d 20 5c 6e 5d 0d 0a 20 20  te.dll]] \n]..  
1cd70 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
1cd80 20 20 20 63 61 74 63 68 20 7b 0d 0a 20 20 20 20     catch {..    
1cd90 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
1cda0 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70  est_channel [app
1cdb0 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
1cdc0 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 66           "---- f
1cdd0 69 6c 65 20 76 65 72 73 69 6f 6e 20 6f 66 20 5c  ile version of \
1cde0 22 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c  "System.Data.SQL
1cdf0 69 74 65 2e 4c 69 6e 71 2e 64 6c 6c 5c 22 2e 2e  ite.Linq.dll\"..
1ce00 2e 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  . " \..         
1ce10 20 20 20 20 20 5b 66 69 6c 65 20 76 65 72 73 69       [file versi
1ce20 6f 6e 20 5b 67 65 74 42 69 6e 61 72 79 46 69 6c  on [getBinaryFil
1ce30 65 4e 61 6d 65 20 53 79 73 74 65 6d 2e 44 61 74  eName System.Dat
1ce40 61 2e 53 51 4c 69 74 65 2e 4c 69 6e 71 2e 64 6c  a.SQLite.Linq.dl
1ce50 6c 5d 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20  l]] \n]..       
1ce60 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 63 61   }....        ca
1ce70 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  tch {..         
1ce80 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
1ce90 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
1cea0 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
1ceb0 20 20 20 20 22 2d 2d 2d 2d 20 66 69 6c 65 20 76      "---- file v
1cec0 65 72 73 69 6f 6e 20 6f 66 20 5c 22 53 79 73 74  ersion of \"Syst
1ced0 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 45  em.Data.SQLite.E
1cee0 46 36 2e 64 6c 6c 5c 22 2e 2e 2e 20 22 20 5c 0d  F6.dll\"... " \.
1cef0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b  .              [
1cf00 66 69 6c 65 20 76 65 72 73 69 6f 6e 20 5b 67 65  file version [ge
1cf10 74 42 69 6e 61 72 79 46 69 6c 65 4e 61 6d 65 20  tBinaryFileName 
1cf20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
1cf30 74 65 2e 45 46 36 2e 64 6c 6c 5d 5d 20 5c 6e 5d  te.EF6.dll]] \n]
1cf40 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  ..        }.... 
1cf50 20 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69         if {[stri
1cf60 6e 67 20 6c 65 6e 67 74 68 20 24 70 6c 61 74 66  ng length $platf
1cf70 6f 72 6d 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b  orm] > 0} then {
1cf80 0d 0a 20 20 20 20 20 20 20 20 20 20 63 61 74 63  ..          catc
1cf90 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  h {..           
1cfa0 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
1cfb0 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
1cfc0 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
1cfd0 20 20 20 20 20 20 22 2d 2d 2d 2d 20 66 69 6c 65        "---- file
1cfe0 20 76 65 72 73 69 6f 6e 20 6f 66 20 5c 22 22 20   version of \"" 
1cff0 24 70 6c 61 74 66 6f 72 6d 20 5c 0d 0a 20 20 20  $platform \..   
1d000 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2f 73               "/s
1d010 71 6c 69 74 65 33 2e 64 6c 6c 5c 22 2e 2e 2e 20  qlite3.dll\"... 
1d020 22 20 5b 66 69 6c 65 20 76 65 72 73 69 6f 6e 20  " [file version 
1d030 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
1d040 20 20 20 5b 67 65 74 42 69 6e 61 72 79 46 69 6c     [getBinaryFil
1d050 65 4e 61 6d 65 20 73 71 6c 69 74 65 33 2e 64 6c  eName sqlite3.dl
1d060 6c 20 24 70 6c 61 74 66 6f 72 6d 5d 5d 20 5c 6e  l $platform]] \n
1d070 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  ]..          }..
1d080 0d 0a 20 20 20 20 20 20 20 20 20 20 63 61 74 63  ..          catc
1d090 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  h {..           
1d0a0 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
1d0b0 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
1d0c0 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
1d0d0 20 20 20 20 20 20 22 2d 2d 2d 2d 20 66 69 6c 65        "---- file
1d0e0 20 76 65 72 73 69 6f 6e 20 6f 66 20 5c 22 22 20   version of \"" 
1d0f0 24 70 6c 61 74 66 6f 72 6d 20 5c 0d 0a 20 20 20  $platform \..   
1d100 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2f 53               "/S
1d110 51 4c 69 74 65 2e 49 6e 74 65 72 6f 70 2e 64 6c  QLite.Interop.dl
1d120 6c 5c 22 2e 2e 2e 20 22 20 5b 66 69 6c 65 20 76  l\"... " [file v
1d130 65 72 73 69 6f 6e 20 5c 0d 0a 20 20 20 20 20 20  ersion \..      
1d140 20 20 20 20 20 20 20 20 20 20 5b 67 65 74 42 69            [getBi
1d150 6e 61 72 79 46 69 6c 65 4e 61 6d 65 20 53 51 4c  naryFileName SQL
1d160 69 74 65 2e 49 6e 74 65 72 6f 70 2e 64 6c 6c 20  ite.Interop.dll 
1d170 24 70 6c 61 74 66 6f 72 6d 5d 5d 20 5c 6e 5d 0d  $platform]] \n].
1d180 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  .          }....
1d190 20 20 20 20 20 20 20 20 20 20 63 61 74 63 68 20            catch 
1d1a0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  {..            t
1d1b0 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
1d1c0 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
1d1d0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
1d1e0 20 20 20 20 22 2d 2d 2d 2d 20 66 69 6c 65 20 76      "---- file v
1d1f0 65 72 73 69 6f 6e 20 6f 66 20 5c 22 22 20 24 70  ersion of \"" $p
1d200 6c 61 74 66 6f 72 6d 20 5c 0d 0a 20 20 20 20 20  latform \..     
1d210 20 20 20 20 20 20 20 20 20 20 20 22 2f 53 79 73             "/Sys
1d220 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e  tem.Data.SQLite.
1d230 64 6c 6c 5c 22 2e 2e 2e 20 22 20 5b 66 69 6c 65  dll\"... " [file
1d240 20 76 65 72 73 69 6f 6e 20 5c 0d 0a 20 20 20 20   version \..    
1d250 20 20 20 20 20 20 20 20 20 20 20 20 5b 67 65 74              [get
1d260 42 69 6e 61 72 79 46 69 6c 65 4e 61 6d 65 20 53  BinaryFileName S
1d270 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
1d280 65 2e 64 6c 6c 20 24 70 6c 61 74 66 6f 72 6d 5d  e.dll $platform]
1d290 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20  ] \n]..         
1d2a0 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d   }..        }...
1d2b0 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73 74  .        if {[st
1d2c0 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 61 72 63  ring length $arc
1d2d0 68 69 74 65 63 74 75 72 65 5d 20 3e 20 30 7d 20  hitecture] > 0} 
1d2e0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
1d2f0 20 20 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20    catch {..     
1d300 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
1d310 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70  test_channel [ap
1d320 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
1d330 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
1d340 2d 20 66 69 6c 65 20 76 65 72 73 69 6f 6e 20 6f  - file version o
1d350 66 20 5c 22 22 20 24 61 72 63 68 69 74 65 63 74  f \"" $architect
1d360 75 72 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ure \..         
1d370 20 20 20 20 20 20 20 22 2f 73 71 6c 69 74 65 33         "/sqlite3
1d380 2e 64 6c 6c 5c 22 2e 2e 2e 20 22 20 5b 66 69 6c  .dll\"... " [fil
1d390 65 20 76 65 72 73 69 6f 6e 20 5c 0d 0a 20 20 20  e version \..   
1d3a0 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 67 65               [ge
1d3b0 74 42 69 6e 61 72 79 46 69 6c 65 4e 61 6d 65 20  tBinaryFileName 
1d3c0 73 71 6c 69 74 65 33 2e 64 6c 6c 20 24 61 72 63  sqlite3.dll $arc
1d3d0 68 69 74 65 63 74 75 72 65 5d 5d 20 5c 6e 5d 0d  hitecture]] \n].
1d3e0 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  .          }....
1d3f0 20 20 20 20 20 20 20 20 20 20 63 61 74 63 68 20            catch 
1d400 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  {..            t
1d410 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
1d420 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
1d430 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
1d440 20 20 20 20 22 2d 2d 2d 2d 20 66 69 6c 65 20 76      "---- file v
1d450 65 72 73 69 6f 6e 20 6f 66 20 5c 22 22 20 24 61  ersion of \"" $a
1d460 72 63 68 69 74 65 63 74 75 72 65 20 5c 0d 0a 20  rchitecture \.. 
1d470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
1d480 2f 53 51 4c 69 74 65 2e 49 6e 74 65 72 6f 70 2e  /SQLite.Interop.
1d490 64 6c 6c 5c 22 2e 2e 2e 20 22 20 5b 66 69 6c 65  dll\"... " [file
1d4a0 20 76 65 72 73 69 6f 6e 20 5c 0d 0a 20 20 20 20   version \..    
1d4b0 20 20 20 20 20 20 20 20 20 20 20 20 5b 67 65 74              [get
1d4c0 42 69 6e 61 72 79 46 69 6c 65 4e 61 6d 65 20 53  BinaryFileName S
1d4d0 51 4c 69 74 65 2e 49 6e 74 65 72 6f 70 2e 64 6c  QLite.Interop.dl
1d4e0 6c 20 24 61 72 63 68 69 74 65 63 74 75 72 65 5d  l $architecture]
1d4f0 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20  ] \n]..         
1d500 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   }....          
1d510 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20  catch {..       
1d520 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
1d530 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
1d540 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
1d550 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
1d560 66 69 6c 65 20 76 65 72 73 69 6f 6e 20 6f 66 20  file version of 
1d570 5c 22 22 20 24 61 72 63 68 69 74 65 63 74 75 72  \"" $architectur
1d580 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e \..           
1d590 20 20 20 20 20 22 2f 53 79 73 74 65 6d 2e 44 61       "/System.Da
1d5a0 74 61 2e 53 51 4c 69 74 65 2e 64 6c 6c 5c 22 2e  ta.SQLite.dll\".
1d5b0 2e 2e 20 22 20 5b 66 69 6c 65 20 76 65 72 73 69  .. " [file versi
1d5c0 6f 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  on \..          
1d5d0 20 20 20 20 20 20 5b 67 65 74 42 69 6e 61 72 79        [getBinary
1d5e0 46 69 6c 65 4e 61 6d 65 20 53 79 73 74 65 6d 2e  FileName System.
1d5f0 44 61 74 61 2e 53 51 4c 69 74 65 2e 64 6c 6c 20  Data.SQLite.dll 
1d600 24 61 72 63 68 69 74 65 63 74 75 72 65 5d 5d 20  $architecture]] 
1d610 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  \n]..          }
1d620 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  ..        }.... 
1d630 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
1d640 20 20 23 20 4e 4f 54 45 3a 20 47 72 61 62 20 74    # NOTE: Grab t
1d650 68 65 20 6c 69 73 74 20 6f 66 20 6d 61 6e 61 67  he list of manag
1d660 65 64 20 61 73 73 65 6d 62 6c 69 65 73 20 66 6f  ed assemblies fo
1d670 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 72  r the current pr
1d680 6f 63 65 73 73 0d 0a 20 20 20 20 20 20 20 20 23  ocess..        #
1d690 20 20 20 20 20 20 20 61 6e 64 20 72 65 70 6f 72         and repor
1d6a0 74 20 6f 6e 20 74 68 65 20 53 79 73 74 65 6d 2e  t on the System.
1d6b0 44 61 74 61 2e 53 51 4c 69 74 65 20 72 65 6c 61  Data.SQLite rela
1d6c0 74 65 64 20 6f 6e 65 73 2e 0d 0a 20 20 20 20 20  ted ones...     
1d6d0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 69 66     #..        if
1d6e0 20 7b 5b 68 61 76 65 53 51 4c 69 74 65 4f 62 6a   {[haveSQLiteObj
1d6f0 65 63 74 43 6f 6d 6d 61 6e 64 5d 7d 20 74 68 65  ectCommand]} the
1d700 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73  n {..          s
1d710 65 74 20 61 73 73 65 6d 62 6c 69 65 73 20 5b 6f  et assemblies [o
1d720 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 41 70 70  bject invoke App
1d730 44 6f 6d 61 69 6e 2e 43 75 72 72 65 6e 74 44 6f  Domain.CurrentDo
1d740 6d 61 69 6e 20 47 65 74 41 73 73 65 6d 62 6c 69  main GetAssembli
1d750 65 73 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  es]....         
1d760 20 6f 62 6a 65 63 74 20 66 6f 72 65 61 63 68 20   object foreach 
1d770 61 73 73 65 6d 62 6c 79 20 24 61 73 73 65 6d 62  assembly $assemb
1d780 6c 69 65 73 20 7b 0d 0a 20 20 20 20 20 20 20 20  lies {..        
1d790 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20      if {[string 
1d7a0 6d 61 74 63 68 20 5c 7b 53 79 73 74 65 6d 2e 44  match \{System.D
1d7b0 61 74 61 2e 53 51 4c 69 74 65 2a 20 24 61 73 73  ata.SQLite* $ass
1d7c0 65 6d 62 6c 79 5d 7d 20 74 68 65 6e 20 7b 0d 0a  embly]} then {..
1d7d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 70                tp
1d7e0 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  uts $::test_chan
1d7f0 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
1d800 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
1d810 20 20 20 20 20 22 2d 2d 2d 2d 20 66 6f 75 6e 64       "---- found
1d820 20 6c 6f 61 64 65 64 20 61 73 73 65 6d 62 6c 79   loaded assembly
1d830 3a 20 22 20 24 61 73 73 65 6d 62 6c 79 20 5c 6e  : " $assembly \n
1d840 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  ]..            }
1d850 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20  ..          }.. 
1d860 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
1d870 20 20 20 20 63 61 74 63 68 20 7b 0d 0a 20 20 20      catch {..   
1d880 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
1d890 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5c 0d 0a  test_channel \..
1d8a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d                "-
1d8b0 2d 2d 2d 20 64 65 66 69 6e 65 20 63 6f 6e 73 74  --- define const
1d8c0 61 6e 74 73 20 66 6f 72 20 5c 22 53 79 73 74 65  ants for \"Syste
1d8d0 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 5c 22 2e  m.Data.SQLite\".
1d8e0 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 20 20 20 20  .. "....        
1d8f0 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a    if {[catch {..
1d900 20 20 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65              obje
1d910 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73  ct invoke -flags
1d920 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20   +NonPublic \.. 
1d930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
1d940 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
1d950 65 2e 53 51 4c 69 74 65 33 20 44 65 66 69 6e 65  e.SQLite3 Define
1d960 43 6f 6e 73 74 61 6e 74 73 0d 0a 20 20 20 20 20  Constants..     
1d970 20 20 20 20 20 7d 20 64 65 66 69 6e 65 43 6f 6e       } defineCon
1d980 73 74 61 6e 74 73 5d 20 3d 3d 20 30 7d 20 74 68  stants] == 0} th
1d990 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
1d9a0 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
1d9b0 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
1d9c0 72 67 73 20 5b 66 6f 72 6d 61 74 4c 69 73 74 20  rgs [formatList 
1d9d0 5b 6c 73 6f 72 74 20 5c 0d 0a 20 20 20 20 20 20  [lsort \..      
1d9e0 20 20 20 20 20 20 20 20 20 20 24 64 65 66 69 6e            $defin
1d9f0 65 43 6f 6e 73 74 61 6e 74 73 5d 20 3c 6e 6f 6e  eConstants] <non
1da00 65 3e 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20  e>] \n]..       
1da10 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
1da20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
1da30 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 75  ::test_channel u
1da40 6e 6b 6e 6f 77 6e 5c 6e 0d 0a 20 20 20 20 20 20  nknown\n..      
1da50 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d      }..        }
1da60 0d 0a 0d 0a 20 20 20 20 20 20 20 20 63 61 74 63  ....        catc
1da70 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74  h {..          t
1da80 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
1da90 6e 6e 65 6c 20 5c 0d 0a 20 20 20 20 20 20 20 20  nnel \..        
1daa0 20 20 20 20 20 20 22 2d 2d 2d 2d 20 73 6f 75 72        "---- sour
1dab0 63 65 20 76 65 72 73 69 6f 6e 20 6f 66 20 5c 22  ce version of \"
1dac0 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
1dad0 74 65 2e 64 6c 6c 5c 22 2e 2e 2e 20 22 0d 0a 0d  te.dll\"... "...
1dae0 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b  .          if {[
1daf0 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20  catch {..       
1db00 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f       object invo
1db10 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75  ke -flags +NonPu
1db20 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20 20 20  blic \..        
1db30 20 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44          System.D
1db40 61 74 61 2e 53 51 4c 69 74 65 2e 53 51 4c 69 74  ata.SQLite.SQLit
1db50 65 43 6f 6e 6e 65 63 74 69 6f 6e 20 50 72 6f 76  eConnection Prov
1db60 69 64 65 72 56 65 72 73 69 6f 6e 0d 0a 20 20 20  iderVersion..   
1db70 20 20 20 20 20 20 20 7d 20 76 65 72 73 69 6f 6e         } version
1db80 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  ] == 0} then {..
1db90 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b              if {
1dba0 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
1dbb0 76 65 72 73 69 6f 6e 5d 20 3d 3d 20 30 7d 20 74  version] == 0} t
1dbc0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
1dbd0 20 20 20 20 20 73 65 74 20 76 65 72 73 69 6f 6e       set version
1dbe0 20 6e 75 6c 6c 0d 0a 20 20 20 20 20 20 20 20 20   null..         
1dbf0 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
1dc00 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
1dc10 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
1dc20 72 67 73 20 24 76 65 72 73 69 6f 6e 20 5c 6e 5d  rgs $version \n]
1dc30 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c  ..          } el
1dc40 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  se {..          
1dc50 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
1dc60 63 68 61 6e 6e 65 6c 20 75 6e 6b 6e 6f 77 6e 5c  channel unknown\
1dc70 6e 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  n..          }..
1dc80 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
1dc90 20 20 20 20 20 63 61 74 63 68 20 7b 0d 0a 20 20       catch {..  
1dca0 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
1dcb0 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5c 0d  :test_channel \.
1dcc0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22  .              "
1dcd0 2d 2d 2d 2d 20 73 6f 75 72 63 65 20 63 68 65 63  ---- source chec
1dce0 6b 6f 75 74 20 6f 66 20 5c 22 53 79 73 74 65 6d  kout of \"System
1dcf0 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 64 6c 6c  .Data.SQLite.dll
1dd00 5c 22 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 20  \"... "....     
1dd10 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20       if {[catch 
1dd20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 6f  {..            o
1dd30 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c  bject invoke -fl
1dd40 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c  ags +NonPublic \
1dd50 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1dd60 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51    System.Data.SQ
1dd70 4c 69 74 65 2e 53 51 4c 69 74 65 43 6f 6e 6e 65  Lite.SQLiteConne
1dd80 63 74 69 6f 6e 20 50 72 6f 76 69 64 65 72 53 6f  ction ProviderSo
1dd90 75 72 63 65 49 64 0d 0a 20 20 20 20 20 20 20 20  urceId..        
1dda0 20 20 7d 20 73 6f 75 72 63 65 49 64 5d 20 3d 3d    } sourceId] ==
1ddb0 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
1ddc0 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72          if {[str
1ddd0 69 6e 67 20 6c 65 6e 67 74 68 20 24 73 6f 75 72  ing length $sour
1dde0 63 65 49 64 5d 20 3d 3d 20 30 7d 20 74 68 65 6e  ceId] == 0} then
1ddf0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
1de00 20 20 73 65 74 20 73 6f 75 72 63 65 49 64 20 6e    set sourceId n
1de10 75 6c 6c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ull..           
1de20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   }..            
1de30 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
1de40 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
1de50 73 20 24 73 6f 75 72 63 65 49 64 20 5c 6e 5d 0d  s $sourceId \n].
1de60 0a 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73  .          } els
1de70 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e {..           
1de80 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
1de90 68 61 6e 6e 65 6c 20 75 6e 6b 6e 6f 77 6e 5c 6e  hannel unknown\n
1dea0 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20  ..          }.. 
1deb0 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
1dec0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
1ded0 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 74 68 65   NOTE: Check the
1dee0 20 61 76 61 69 6c 61 62 6c 65 20 62 75 69 6c 64   available build
1def0 73 20 28 61 6e 64 20 22 72 65 6c 65 61 73 65 73  s (and "releases
1df00 22 29 20 6f 66 20 53 51 4c 69 74 65 20 61 6e 64  ") of SQLite and
1df10 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
1df20 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51    System.Data.SQ
1df30 4c 69 74 65 2e 0d 0a 20 20 20 20 20 20 20 20 23  Lite...        #
1df40 0d 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b 46  ..        checkF
1df50 6f 72 53 51 4c 69 74 65 42 75 69 6c 64 73 20 24  orSQLiteBuilds $
1df60 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 0d 0a  ::test_channel..
1df70 20 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72          checkFor
1df80 53 51 4c 69 74 65 52 65 6c 65 61 73 65 73 20 24  SQLiteReleases $
1df90 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 0d 0a  ::test_channel..
1dfa0 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
1dfb0 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4e 6f 77       # NOTE: Now
1dfc0 2c 20 77 65 20 6e 65 65 64 20 74 6f 20 6b 6e 6f  , we need to kno
1dfd0 77 20 69 66 20 74 68 65 20 53 51 4c 69 74 65 20  w if the SQLite 
1dfe0 63 6f 72 65 20 6c 69 62 72 61 72 79 20 69 73 20  core library is 
1dff0 61 76 61 69 6c 61 62 6c 65 0d 0a 20 20 20 20 20  available..     
1e000 20 20 20 23 20 20 20 20 20 20 20 28 69 2e 65 2e     #       (i.e.
1e010 20 62 65 63 61 75 73 65 20 74 68 65 20 6d 61 6e   because the man
1e020 61 67 65 64 2d 6f 6e 6c 79 20 53 79 73 74 65 6d  aged-only System
1e030 2e 44 61 74 61 2e 53 51 4c 69 74 65 20 61 73 73  .Data.SQLite ass
1e040 65 6d 62 6c 79 20 63 61 6e 0d 0a 20 20 20 20 20  embly can..     
1e050 20 20 20 23 20 20 20 20 20 20 20 6c 6f 61 64 20     #       load 
1e060 77 69 74 68 6f 75 74 20 69 74 3b 20 68 6f 77 65  without it; howe
1e070 76 65 72 2c 20 69 74 20 63 61 6e 6e 6f 74 20 64  ver, it cannot d
1e080 6f 20 61 6e 79 74 68 69 6e 67 20 75 73 65 66 75  o anything usefu
1e090 6c 20 77 69 74 68 6f 75 74 0d 0a 20 20 20 20 20  l without..     
1e0a0 20 20 20 23 20 20 20 20 20 20 20 69 74 29 2e 20     #       it). 
1e0b0 20 49 66 20 77 65 20 61 72 65 20 75 73 69 6e 67   If we are using
1e0c0 20 74 68 65 20 6d 69 78 65 64 2d 6d 6f 64 65 20   the mixed-mode 
1e0d0 61 73 73 65 6d 62 6c 79 20 61 6e 64 20 77 65 20  assembly and we 
1e0e0 61 6c 72 65 61 64 79 0d 0a 20 20 20 20 20 20 20  already..       
1e0f0 20 23 20 20 20 20 20 20 20 66 6f 75 6e 64 20 69   #       found i
1e100 74 20 28 61 62 6f 76 65 29 2c 20 74 68 69 73 20  t (above), this 
1e110 73 68 6f 75 6c 64 20 61 6c 77 61 79 73 20 73 75  should always su
1e120 63 63 65 65 64 2e 0d 0a 20 20 20 20 20 20 20 20  cceed...        
1e130 23 0d 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b  #..        check
1e140 46 6f 72 53 51 4c 69 74 65 4c 69 62 72 61 72 79  ForSQLiteLibrary
1e150 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
1e160 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  ....        #.. 
1e170 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43         # NOTE: C
1e180 68 65 63 6b 20 69 66 20 74 68 65 20 53 51 4c 69  heck if the SQLi
1e190 74 65 20 69 6e 74 65 72 6f 70 20 61 73 73 65 6d  te interop assem
1e1a0 62 6c 79 20 69 73 20 61 76 61 69 6c 61 62 6c 65  bly is available
1e1b0 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
1e1c0 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72 53 51        checkForSQ
1e1d0 4c 69 74 65 49 6e 74 65 72 6f 70 20 24 3a 3a 74  LiteInterop $::t
1e1e0 65 73 74 5f 63 68 61 6e 6e 65 6c 0d 0a 0d 0a 20  est_channel.... 
1e1f0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
1e200 20 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20    # NOTE: Check 
1e210 74 68 65 20 53 51 4c 69 74 65 20 64 61 74 61 62  the SQLite datab
1e220 61 73 65 20 61 6e 64 20 74 65 6d 70 6f 72 61 72  ase and temporar
1e230 79 20 64 69 72 65 63 74 6f 72 69 65 73 2e 0d 0a  y directories...
1e240 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
1e250 20 20 20 63 68 65 63 6b 46 6f 72 53 51 4c 69 74     checkForSQLit
1e260 65 44 69 72 65 63 74 6f 72 69 65 73 20 24 3a 3a  eDirectories $::
1e270 74 65 73 74 5f 63 68 61 6e 6e 65 6c 0d 0a 0d 0a  test_channel....
1e280 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
1e290 20 20 20 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d     # NOTE: Attem
1e2a0 70 74 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  pt to determine 
1e2b0 69 66 20 76 61 72 69 6f 75 73 20 63 6f 6d 70 69  if various compi
1e2c0 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 73 20  le-time options 
1e2d0 6e 65 65 64 65 64 20 66 6f 72 0d 0a 20 20 20 20  needed for..    
1e2e0 20 20 20 20 23 20 20 20 20 20 20 20 74 65 73 74      #       test
1e2f0 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 77 65 72   constraints wer
1e300 65 20 65 6e 61 62 6c 65 64 20 66 6f 72 20 74 68  e enabled for th
1e310 65 20 6d 61 6e 61 67 65 64 20 61 73 73 65 6d 62  e managed assemb
1e320 6c 79 2e 20 20 54 68 65 72 65 0d 0a 20 20 20 20  ly.  There..    
1e330 20 20 20 20 23 20 20 20 20 20 20 20 61 72 65 20      #       are 
1e340 73 6f 6d 65 20 63 6f 6d 70 69 6c 65 2d 74 69 6d  some compile-tim
1e350 65 20 6f 70 74 69 6f 6e 73 20 74 68 61 74 20 6d  e options that m
1e360 75 73 74 20 61 6c 73 6f 20 68 61 76 65 20 62 65  ust also have be
1e370 65 6e 20 65 6e 61 62 6c 65 64 0d 0a 20 20 20 20  en enabled..    
1e380 20 20 20 20 23 20 20 20 20 20 20 20 66 6f 72 20      #       for 
1e390 74 68 65 20 69 6e 74 65 72 6f 70 20 61 73 73 65  the interop asse
1e3a0 6d 62 6c 79 20 69 6e 20 6f 72 64 65 72 20 74 6f  mbly in order to
1e3b0 20 62 65 20 65 66 66 65 63 74 69 76 65 2e 20 20   be effective.  
1e3c0 46 6f 72 20 74 68 6f 73 65 0d 0a 20 20 20 20 20  For those..     
1e3d0 20 20 20 23 20 20 20 20 20 20 20 6f 70 74 69 6f     #       optio
1e3e0 6e 73 2c 20 69 74 20 77 69 6c 6c 20 62 65 20 61  ns, it will be a
1e3f0 73 73 75 6d 65 64 20 74 68 61 74 20 69 74 20 77  ssumed that it w
1e400 61 73 20 65 6e 61 62 6c 65 64 20 66 6f 72 20 74  as enabled for t
1e410 68 65 20 69 6e 74 65 72 6f 70 0d 0a 20 20 20 20  he interop..    
1e420 20 20 20 20 23 20 20 20 20 20 20 20 61 73 73 65      #       asse
1e430 6d 62 6c 79 20 69 66 20 69 74 20 77 61 73 20 65  mbly if it was e
1e440 6e 61 62 6c 65 64 20 66 6f 72 20 74 68 65 20 6d  nabled for the m
1e450 61 6e 61 67 65 64 20 61 73 73 65 6d 62 6c 79 2e  anaged assembly.
1e460 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
1e470 20 20 20 20 20 66 6f 72 65 61 63 68 20 64 65 66       foreach def
1e480 69 6e 65 43 6f 6e 73 74 61 6e 74 20 5b 6c 69 73  ineConstant [lis
1e490 74 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  t \..           
1e4a0 20 43 48 45 43 4b 5f 53 54 41 54 45 20 43 4f 55   CHECK_STATE COU
1e4b0 4e 54 5f 48 41 4e 44 4c 45 20 44 45 42 55 47 20  NT_HANDLE DEBUG 
1e4c0 49 4e 54 45 52 4f 50 5f 43 4f 44 45 43 20 49 4e  INTEROP_CODEC IN
1e4d0 54 45 52 4f 50 5f 44 45 42 55 47 20 5c 0d 0a 20  TEROP_DEBUG \.. 
1e4e0 20 20 20 20 20 20 20 20 20 20 20 49 4e 54 45 52             INTER
1e4f0 4f 50 5f 45 58 54 45 4e 53 49 4f 4e 5f 46 55 4e  OP_EXTENSION_FUN
1e500 43 54 49 4f 4e 53 20 49 4e 54 45 52 4f 50 5f 49  CTIONS INTEROP_I
1e510 4e 43 4c 55 44 45 5f 43 45 52 4f 44 20 5c 0d 0a  NCLUDE_CEROD \..
1e520 20 20 20 20 20 20 20 20 20 20 20 20 49 4e 54 45              INTE
1e530 52 4f 50 5f 49 4e 43 4c 55 44 45 5f 45 58 54 52  ROP_INCLUDE_EXTR
1e540 41 20 49 4e 54 45 52 4f 50 5f 49 4e 43 4c 55 44  A INTEROP_INCLUD
1e550 45 5f 53 45 45 20 49 4e 54 45 52 4f 50 5f 49 4e  E_SEE INTEROP_IN
1e560 43 4c 55 44 45 5f 5a 49 50 56 46 53 20 5c 0d 0a  CLUDE_ZIPVFS \..
1e570 20 20 20 20 20 20 20 20 20 20 20 20 49 4e 54 45              INTE
1e580 52 4f 50 5f 4c 45 47 41 43 59 5f 43 4c 4f 53 45  ROP_LEGACY_CLOSE
1e590 20 49 4e 54 45 52 4f 50 5f 4c 4f 47 20 49 4e 54   INTEROP_LOG INT
1e5a0 45 52 4f 50 5f 54 45 53 54 5f 45 58 54 45 4e 53  EROP_TEST_EXTENS
1e5b0 49 4f 4e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ION \..         
1e5c0 20 20 20 49 4e 54 45 52 4f 50 5f 56 49 52 54 55     INTEROP_VIRTU
1e5d0 41 4c 5f 54 41 42 4c 45 20 4e 45 54 5f 32 30 20  AL_TABLE NET_20 
1e5e0 4e 45 54 5f 33 35 20 4e 45 54 5f 34 30 20 4e 45  NET_35 NET_40 NE
1e5f0 54 5f 34 35 20 4e 45 54 5f 34 35 31 20 4e 45 54  T_45 NET_451 NET
1e600 5f 34 36 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  _46 \..         
1e610 20 20 20 4e 45 54 5f 43 4f 4d 50 41 43 54 5f 32     NET_COMPACT_2
1e620 30 20 50 4c 41 54 46 4f 52 4d 5f 43 4f 4d 50 41  0 PLATFORM_COMPA
1e630 43 54 46 52 41 4d 45 57 4f 52 4b 20 50 52 45 4c  CTFRAMEWORK PREL
1e640 4f 41 44 5f 4e 41 54 49 56 45 5f 4c 49 42 52 41  OAD_NATIVE_LIBRA
1e650 52 59 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  RY \..          
1e660 20 20 52 45 54 41 52 47 45 54 41 42 4c 45 20 53    RETARGETABLE S
1e670 51 4c 49 54 45 5f 53 54 41 4e 44 41 52 44 20 54  QLITE_STANDARD T
1e680 48 52 4f 57 5f 4f 4e 5f 44 49 53 50 4f 53 45 44  HROW_ON_DISPOSED
1e690 20 54 52 41 43 45 20 5c 0d 0a 20 20 20 20 20 20   TRACE \..      
1e6a0 20 20 20 20 20 20 54 52 41 43 45 5f 43 4f 4e 4e        TRACE_CONN
1e6b0 45 43 54 49 4f 4e 20 54 52 41 43 45 5f 44 45 54  ECTION TRACE_DET
1e6c0 45 43 54 49 4f 4e 20 54 52 41 43 45 5f 48 41 4e  ECTION TRACE_HAN
1e6d0 44 4c 45 20 54 52 41 43 45 5f 50 52 45 4c 4f 41  DLE TRACE_PRELOA
1e6e0 44 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  D \..           
1e6f0 20 54 52 41 43 45 5f 53 48 41 52 45 44 20 54 52   TRACE_SHARED TR
1e700 41 43 45 5f 53 54 41 54 45 4d 45 4e 54 20 54 52  ACE_STATEMENT TR
1e710 41 43 45 5f 57 41 52 4e 49 4e 47 20 54 52 41 43  ACE_WARNING TRAC
1e720 4b 5f 4d 45 4d 4f 52 59 5f 42 59 54 45 53 20 5c  K_MEMORY_BYTES \
1e730 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 55 53  ..            US
1e740 45 5f 45 4e 54 49 54 59 5f 46 52 41 4d 45 57 4f  E_ENTITY_FRAMEWO
1e750 52 4b 5f 36 20 55 53 45 5f 49 4e 54 45 52 4f 50  RK_6 USE_INTEROP
1e760 5f 44 4c 4c 20 55 53 45 5f 50 52 45 50 41 52 45  _DLL USE_PREPARE
1e770 5f 56 32 20 57 49 4e 44 4f 57 53 5d 20 7b 0d 0a  _V2 WINDOWS] {..
1e780 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
1e790 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43         # NOTE: C
1e7a0 68 65 63 6b 20 69 66 20 74 68 65 20 63 6f 6d 70  heck if the comp
1e7b0 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 20  ile-time option 
1e7c0 69 73 20 6c 69 73 74 65 64 20 69 6e 20 74 68 65  is listed in the
1e7d0 20 6c 69 73 74 20 6f 66 0d 0a 20 20 20 20 20 20   list of..      
1e7e0 20 20 20 20 23 20 20 20 20 20 20 20 22 64 65 66      #       "def
1e7f0 69 6e 65 20 63 6f 6e 73 74 61 6e 74 73 22 20 6b  ine constants" k
1e800 65 70 74 20 74 72 61 63 6b 20 6f 66 20 62 79 20  ept track of by 
1e810 74 68 65 20 6d 61 6e 61 67 65 64 20 61 73 73 65  the managed asse
1e820 6d 62 6c 79 2e 0d 0a 20 20 20 20 20 20 20 20 20  mbly...         
1e830 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 63 68   #..          ch
1e840 65 63 6b 46 6f 72 53 51 4c 69 74 65 44 65 66 69  eckForSQLiteDefi
1e850 6e 65 43 6f 6e 73 74 61 6e 74 20 24 3a 3a 74 65  neConstant $::te
1e860 73 74 5f 63 68 61 6e 6e 65 6c 20 24 64 65 66 69  st_channel $defi
1e870 6e 65 43 6f 6e 73 74 61 6e 74 0d 0a 20 20 20 20  neConstant..    
1e880 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
1e890 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
1e8a0 54 45 3a 20 43 68 65 63 6b 20 69 66 20 74 68 65  TE: Check if the
1e8b0 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c   System.Data.SQL
1e8c0 69 74 65 20 70 72 6f 76 69 64 65 72 20 77 61 73  ite provider was
1e8d0 20 63 6f 6d 70 69 6c 65 64 20 77 69 74 68 0d 0a   compiled with..
1e8e0 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
1e8f0 73 75 70 70 6f 72 74 20 66 6f 72 20 61 6e 79 20  support for any 
1e900 65 6e 63 72 79 70 74 65 64 20 64 61 74 61 62 61  encrypted databa
1e910 73 65 73 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  ses...        #.
1e920 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 68 61  .        if {[ha
1e930 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 5c 0d 0a  veConstraint \..
1e940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e950 64 65 66 69 6e 65 43 6f 6e 73 74 61 6e 74 2e 53  defineConstant.S
1e960 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
1e970 65 2e 49 4e 54 45 52 4f 50 5f 43 4f 44 45 43 5d  e.INTEROP_CODEC]
1e980 20 7c 7c 20 5c 0d 0a 20 20 20 20 20 20 20 20 20   || \..         
1e990 20 20 20 5b 68 61 76 65 43 6f 6e 73 74 72 61 69     [haveConstrai
1e9a0 6e 74 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  nt \..          
1e9b0 20 20 20 20 20 20 64 65 66 69 6e 65 43 6f 6e 73        defineCons
1e9c0 74 61 6e 74 2e 53 79 73 74 65 6d 2e 44 61 74 61  tant.System.Data
1e9d0 2e 53 51 4c 69 74 65 2e 49 4e 54 45 52 4f 50 5f  .SQLite.INTEROP_
1e9e0 49 4e 43 4c 55 44 45 5f 53 45 45 5d 7d 20 74 68  INCLUDE_SEE]} th
1e9f0 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
1ea00 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e  #..          # N
1ea10 4f 54 45 3a 20 59 65 73 2c 20 61 64 64 20 67 65  OTE: Yes, add ge
1ea20 6e 65 72 69 63 20 63 6f 6e 73 74 72 61 69 6e 74  neric constraint
1ea30 20 66 6f 72 20 75 73 65 20 62 79 20 74 68 65 20   for use by the 
1ea40 74 65 73 74 20 73 75 69 74 65 2e 0d 0a 20 20 20  test suite...   
1ea50 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
1ea60 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e      addConstrain
1ea70 74 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51  t System.Data.SQ
1ea80 4c 69 74 65 2e 45 6e 63 72 79 70 74 69 6f 6e 0d  Lite.Encryption.
1ea90 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  .        }....  
1eaa0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
1eab0 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 74   # NOTE: Check t
1eac0 68 65 20 63 75 72 72 65 6e 74 20 62 75 69 6c 64  he current build
1ead0 20 79 65 61 72 2e 20 20 42 61 73 69 63 61 6c 6c   year.  Basicall
1eae0 79 2c 20 74 68 69 73 20 69 6e 64 69 63 61 74 65  y, this indicate
1eaf0 73 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  s..        #    
1eb00 20 20 20 77 68 69 63 68 20 76 65 72 73 69 6f 6e     which version
1eb10 20 6f 66 20 4d 53 42 75 69 6c 64 20 61 6e 64 2f   of MSBuild and/
1eb20 6f 72 20 56 69 73 75 61 6c 20 53 74 75 64 69 6f  or Visual Studio
1eb30 20 77 61 73 20 75 73 65 64 20 74 6f 0d 0a 20 20   was used to..  
1eb40 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63 6f        #       co
1eb50 6d 70 69 6c 65 20 74 68 65 20 61 73 73 65 6d 62  mpile the assemb
1eb60 6c 79 20 62 69 6e 61 72 69 65 73 20 75 6e 64 65  ly binaries unde
1eb70 72 20 74 65 73 74 2e 0d 0a 20 20 20 20 20 20 20  r test...       
1eb80 20 23 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74   #..        tput
1eb90 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
1eba0 6c 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  l \..           
1ebb0 20 22 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e 67 20   "---- checking 
1ebc0 66 6f 72 20 53 79 73 74 65 6d 2e 44 61 74 61 2e  for System.Data.
1ebd0 53 51 4c 69 74 65 20 62 75 69 6c 64 20 79 65 61  SQLite build yea
1ebe0 72 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 20 20  r... "....      
1ebf0 20 20 73 65 74 20 79 65 61 72 20 5b 67 65 74 42    set year [getB
1ec00 75 69 6c 64 59 65 61 72 5d 0d 0a 20 20 20 20 20  uildYear]..     
1ec10 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74     addConstraint
1ec20 20 5b 61 70 70 65 6e 64 41 72 67 73 20 62 75 69   [appendArgs bui
1ec30 6c 64 59 65 61 72 2e 20 24 79 65 61 72 5d 0d 0a  ldYear. $year]..
1ec40 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
1ec50 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61  :test_channel [a
1ec60 70 70 65 6e 64 41 72 67 73 20 5c 22 20 24 79 65  ppendArgs \" $ye
1ec70 61 72 20 5c 22 5c 6e 5d 0d 0a 0d 0a 20 20 20 20  ar \"\n]....    
1ec80 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
1ec90 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 74 68 65   NOTE: Check the
1eca0 20 63 75 72 72 65 6e 74 20 62 75 69 6c 64 20 2e   current build .
1ecb0 4e 45 54 20 46 72 61 6d 65 77 6f 72 6b 2e 20 20  NET Framework.  
1ecc0 42 61 73 69 63 61 6c 6c 79 2c 20 74 68 69 73 0d  Basically, this.
1ecd0 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
1ece0 20 69 6e 64 69 63 61 74 65 73 20 77 68 69 63 68   indicates which
1ecf0 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 65 20   version of the 
1ed00 2e 4e 45 54 20 46 72 61 6d 65 77 6f 72 6b 20 69  .NET Framework i
1ed10 73 20 62 65 69 6e 67 0d 0a 20 20 20 20 20 20 20  s being..       
1ed20 20 23 20 20 20 20 20 20 20 75 73 65 64 20 62 79   #       used by
1ed30 20 74 68 65 20 61 73 73 65 6d 62 6c 79 20 62 69   the assembly bi
1ed40 6e 61 72 69 65 73 20 75 6e 64 65 72 20 74 65 73  naries under tes
1ed50 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  t...        #.. 
1ed60 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
1ed70 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5c 0d 0a  test_channel \..
1ed80 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
1ed90 2d 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 53  - checking for S
1eda0 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
1edb0 65 20 62 75 69 6c 64 20 2e 4e 45 54 20 46 72 61  e build .NET Fra
1edc0 6d 65 77 6f 72 6b 2e 2e 2e 20 22 0d 0a 0d 0a 20  mework... ".... 
1edd0 20 20 20 20 20 20 20 73 65 74 20 6e 65 74 46 78         set netFx
1ede0 20 5b 67 65 74 42 75 69 6c 64 4e 65 74 46 78 5d   [getBuildNetFx]
1edf0 0d 0a 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e  ..        addCon
1ee00 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41  straint [appendA
1ee10 72 67 73 20 62 75 69 6c 64 46 72 61 6d 65 77 6f  rgs buildFramewo
1ee20 72 6b 2e 20 24 6e 65 74 46 78 5d 0d 0a 20 20 20  rk. $netFx]..   
1ee30 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
1ee40 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
1ee50 6e 64 41 72 67 73 20 5c 22 20 24 6e 65 74 46 78  ndArgs \" $netFx
1ee60 20 5c 22 5c 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20   \"\n]....      
1ee70 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
1ee80 4f 54 45 3a 20 43 68 65 63 6b 20 74 68 65 20 63  OTE: Check the c
1ee90 75 72 72 65 6e 74 20 62 75 69 6c 64 20 63 6f 6e  urrent build con
1eea0 66 69 67 75 72 61 74 69 6f 6e 2e 20 20 54 68 69  figuration.  Thi
1eeb0 73 20 73 68 6f 75 6c 64 20 6e 6f 72 6d 61 6c 6c  s should normall
1eec0 79 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  y..        #    
1eed0 20 20 20 62 65 20 65 69 74 68 65 72 20 22 44 65     be either "De
1eee0 62 75 67 22 20 6f 72 20 22 52 65 6c 65 61 73 65  bug" or "Release
1eef0 22 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  "...        #.. 
1ef00 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
1ef10 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5c 0d 0a  test_channel \..
1ef20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
1ef30 2d 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 53  - checking for S
1ef40 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
1ef50 65 20 62 75 69 6c 64 20 63 6f 6e 66 69 67 75 72  e build configur
1ef60 61 74 69 6f 6e 2e 2e 2e 20 22 0d 0a 0d 0a 20 20  ation... "....  
1ef70 20 20 20 20 20 20 73 65 74 20 63 6f 6e 66 69 67        set config
1ef80 75 72 61 74 69 6f 6e 20 5b 67 65 74 42 75 69 6c  uration [getBuil
1ef90 64 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 5d 0d  dConfiguration].
1efa0 0a 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73  .        addCons
1efb0 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72  traint [appendAr
1efc0 67 73 20 62 75 69 6c 64 43 6f 6e 66 69 67 75 72  gs buildConfigur
1efd0 61 74 69 6f 6e 2e 20 24 63 6f 6e 66 69 67 75 72  ation. $configur
1efe0 61 74 69 6f 6e 5d 0d 0a 20 20 20 20 20 20 20 20  ation]..        
1eff0 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
1f000 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
1f010 73 20 5c 22 20 24 63 6f 6e 66 69 67 75 72 61 74  s \" $configurat
1f020 69 6f 6e 20 5c 22 5c 6e 5d 0d 0a 0d 0a 20 20 20  ion \"\n]....   
1f030 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
1f040 23 20 4e 4f 54 45 3a 20 54 72 79 20 74 6f 20 73  # NOTE: Try to s
1f050 65 74 75 70 20 61 6e 20 69 6e 74 65 72 72 75 70  etup an interrup
1f060 74 20 63 61 6c 6c 62 61 63 6b 20 75 73 69 6e 67  t callback using
1f070 20 74 68 65 20 73 63 72 69 70 74 20 64 65 62 75   the script debu
1f080 67 67 65 72 0d 0a 20 20 20 20 20 20 20 20 23 20  gger..        # 
1f090 20 20 20 20 20 20 74 68 61 74 20 77 69 6c 6c 20        that will 
1f0a0 63 61 6e 63 65 6c 20 61 6c 6c 20 53 51 4c 20 71  cancel all SQL q
1f0b0 75 65 72 69 65 73 20 69 6e 20 70 72 6f 67 72 65  ueries in progre
1f0c0 73 73 20 66 6f 72 20 61 6c 6c 20 64 61 74 61 62  ss for all datab
1f0d0 61 73 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20  ase..        #  
1f0e0 20 20 20 20 20 63 6f 6e 6e 65 63 74 69 6f 6e 73       connections
1f0f0 20 6b 6e 6f 77 6e 20 74 6f 20 74 68 69 73 20 69   known to this i
1f100 6e 74 65 72 70 72 65 74 65 72 2e 0d 0a 20 20 20  nterpreter...   
1f110 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
1f120 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74  if {![info exist
1f130 73 20 3a 3a 6e 6f 28 73 71 6c 69 74 65 49 6e 74  s ::no(sqliteInt
1f140 65 72 72 75 70 74 43 61 6c 6c 62 61 63 6b 29 5d  erruptCallback)]
1f150 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
1f160 20 20 20 20 73 65 74 75 70 44 62 49 6e 74 65 72      setupDbInter
1f170 72 75 70 74 43 61 6c 6c 62 61 63 6b 20 24 3a 3a  ruptCallback $::
1f180 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 24 3a 3a  test_channel $::
1f190 74 65 73 74 5f 6c 6f 67 0d 0a 20 20 20 20 20 20  test_log..      
1f1a0 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23    }....        #
1f1b0 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
1f1c0 3a 20 43 68 65 63 6b 20 66 6f 72 20 74 68 65 20  : Check for the 
1f1d0 6e 61 74 69 76 65 20 72 75 6e 74 69 6d 65 20 6f  native runtime o
1f1e0 70 74 69 6f 6e 2c 20 77 68 69 63 68 20 77 6f 75  ption, which wou
1f1f0 6c 64 20 6d 65 61 6e 20 77 65 20 61 72 65 0d 0a  ld mean we are..
1f200 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
1f210 75 73 69 6e 67 20 74 68 65 20 6d 69 78 65 64 2d  using the mixed-
1f220 6d 6f 64 65 20 61 73 73 65 6d 62 6c 79 2e 0d 0a  mode assembly...
1f230 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
1f240 20 20 20 63 68 65 63 6b 46 6f 72 52 75 6e 74 69     checkForRunti
1f250 6d 65 4f 70 74 69 6f 6e 20 24 3a 3a 74 65 73 74  meOption $::test
1f260 5f 63 68 61 6e 6e 65 6c 20 6e 61 74 69 76 65 0d  _channel native.
1f270 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
1f280 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68        # NOTE: Ch
1f290 65 63 6b 20 69 66 20 74 68 65 20 74 65 73 74 20  eck if the test 
1f2a0 73 75 69 74 65 20 73 68 6f 75 6c 64 20 63 6f 75  suite should cou
1f2b0 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  nt the number of
1f2c0 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 0d 0a 20 20   connections..  
1f2d0 20 20 20 20 20 20 23 20 20 20 20 20 20 20 22 6f        #       "o
1f2e0 70 65 6e 65 64 22 20 61 6e 64 20 22 63 6c 6f 73  pened" and "clos
1f2f0 65 64 22 20 66 72 6f 6d 20 74 68 65 20 70 6f 6f  ed" from the poo
1f300 6c 20 77 68 65 6e 20 64 65 74 65 72 6d 69 6e 69  l when determini
1f310 6e 67 20 69 66 20 61 20 74 65 73 74 0d 0a 20 20  ng if a test..  
1f320 20 20 20 20 20 20 23 20 20 20 20 20 20 20 70 61        #       pa
1f330 73 73 65 64 2e 20 20 44 69 73 61 62 6c 69 6e 67  ssed.  Disabling
1f340 20 74 68 69 73 20 62 65 68 61 76 69 6f 72 20 69   this behavior i
1f350 73 20 73 6f 6d 65 74 69 6d 65 73 20 6e 65 63 65  s sometimes nece
1f360 73 73 61 72 79 20 28 65 2e 67 2e 0d 0a 20 20 20  ssary (e.g...   
1f370 20 20 20 20 20 23 20 20 20 20 20 20 20 64 75 72       #       dur
1f380 69 6e 67 20 74 68 65 20 72 65 6c 65 61 73 65 20  ing the release 
1f390 74 65 73 74 69 6e 67 20 70 72 6f 63 65 73 73 29  testing process)
1f3a0 20 62 65 63 61 75 73 65 20 74 68 65 72 65 20 61   because there a
1f3b0 72 65 20 73 65 76 65 72 61 6c 0d 0a 20 20 20 20  re several..    
1f3c0 20 20 20 20 23 20 20 20 20 20 20 20 74 65 73 74      #       test
1f3d0 73 20 74 68 61 74 20 72 65 6c 79 20 6f 6e 20 74  s that rely on t
1f3e0 68 65 20 22 6f 70 65 6e 65 64 20 66 72 6f 6d 20  he "opened from 
1f3f0 70 6f 6f 6c 22 20 63 6f 75 6e 74 20 62 65 69 6e  pool" count bein
1f400 67 20 67 72 65 61 74 65 72 0d 0a 20 20 20 20 20  g greater..     
1f410 20 20 20 23 20 20 20 20 20 20 20 74 68 61 6e 20     #       than 
1f420 7a 65 72 6f 2e 20 20 54 68 65 73 65 20 74 65 73  zero.  These tes
1f430 74 73 20 6d 61 79 20 66 61 69 6c 20 64 75 65 20  ts may fail due 
1f440 74 6f 20 74 68 65 20 6e 6f 6e 2d 64 65 74 65 72  to the non-deter
1f450 6d 69 6e 69 73 74 69 63 0d 0a 20 20 20 20 20 20  ministic..      
1f460 20 20 23 20 20 20 20 20 20 20 62 65 68 61 76 69    #       behavi
1f470 6f 72 20 6f 66 20 74 68 65 20 43 4c 52 20 47 43  or of the CLR GC
1f480 2c 20 65 76 65 6e 20 77 68 65 6e 20 74 68 65 72  , even when ther
1f490 65 20 69 73 20 6e 6f 20 62 75 67 20 69 6e 20 74  e is no bug in t
1f4a0 68 65 20 63 6f 64 65 0d 0a 20 20 20 20 20 20 20  he code..       
1f4b0 20 23 20 20 20 20 20 20 20 62 65 69 6e 67 20 74   #       being t
1f4c0 65 73 74 65 64 2e 0d 0a 20 20 20 20 20 20 20 20  ested...        
1f4d0 23 0d 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b  #..        check
1f4e0 46 6f 72 52 75 6e 74 69 6d 65 4f 70 74 69 6f 6e  ForRuntimeOption
1f4f0 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
1f500 20 6e 6f 50 6f 6f 6c 43 6f 75 6e 74 73 0d 0a 0d   noPoolCounts...
1f510 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
1f520 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68 65 63      # NOTE: Chec
1f530 6b 20 69 66 20 74 68 65 20 74 65 73 74 20 73 75  k if the test su
1f540 69 74 65 20 73 68 6f 75 6c 64 20 75 73 65 20 73  ite should use s
1f550 68 61 72 65 64 2d 63 61 63 68 65 20 6d 6f 64 65  hared-cache mode
1f560 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
1f570 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72 52 75        checkForRu
1f580 6e 74 69 6d 65 4f 70 74 69 6f 6e 20 24 3a 3a 74  ntimeOption $::t
1f590 65 73 74 5f 63 68 61 6e 6e 65 6c 20 73 68 61 72  est_channel shar
1f5a0 65 64 43 61 63 68 65 0d 0a 0d 0a 20 20 20 20 20  edCache....     
1f5b0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
1f5c0 4e 4f 54 45 3a 20 52 65 70 6f 72 74 20 74 68 65  NOTE: Report the
1f5d0 20 72 65 73 6f 75 72 63 65 20 75 73 61 67 65 20   resource usage 
1f5e0 70 72 69 6f 72 20 74 6f 20 72 75 6e 6e 69 6e 67  prior to running
1f5f0 20 61 6e 79 20 74 65 73 74 73 2e 0d 0a 20 20 20   any tests...   
1f600 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
1f610 72 65 70 6f 72 74 53 51 4c 69 74 65 52 65 73 6f  reportSQLiteReso
1f620 75 72 63 65 73 20 24 3a 3a 74 65 73 74 5f 63 68  urces $::test_ch
1f630 61 6e 6e 65 6c 0d 0a 0d 0a 20 20 20 20 20 20 20  annel....       
1f640 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
1f650 54 45 3a 20 47 72 61 62 20 74 68 65 20 6c 69 73  TE: Grab the lis
1f660 74 20 6f 66 20 6e 61 74 69 76 65 20 6d 6f 64 75  t of native modu
1f670 6c 65 73 20 66 6f 72 20 74 68 65 20 63 75 72 72  les for the curr
1f680 65 6e 74 20 70 72 6f 63 65 73 73 20 61 6e 64 0d  ent process and.
1f690 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
1f6a0 20 72 65 70 6f 72 74 20 6f 6e 20 74 68 65 20 53   report on the S
1f6b0 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
1f6c0 65 20 72 65 6c 61 74 65 64 20 6f 6e 65 73 2e 0d  e related ones..
1f6d0 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
1f6e0 20 20 20 20 69 66 20 7b 5b 68 61 76 65 53 51 4c      if {[haveSQL
1f6f0 69 74 65 4f 62 6a 65 63 74 43 6f 6d 6d 61 6e 64  iteObjectCommand
1f700 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
1f710 20 20 20 20 20 73 65 74 20 6d 6f 64 75 6c 65 73       set modules
1f720 20 5b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20   [object invoke 
1f730 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
1f740 20 53 79 73 74 65 6d 2e 44 69 61 67 6e 6f 73 74   System.Diagnost
1f750 69 63 73 2e 50 72 6f 63 65 73 73 2e 47 65 74 43  ics.Process.GetC
1f760 75 72 72 65 6e 74 50 72 6f 63 65 73 73 20 4d 6f  urrentProcess Mo
1f770 64 75 6c 65 73 5d 0d 0a 0d 0a 20 20 20 20 20 20  dules]....      
1f780 20 20 20 20 6f 62 6a 65 63 74 20 66 6f 72 65 61      object forea
1f790 63 68 20 2d 61 6c 69 61 73 20 6d 6f 64 75 6c 65  ch -alias module
1f7a0 20 24 6d 6f 64 75 6c 65 73 20 7b 0d 0a 20 20 20   $modules {..   
1f7b0 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
1f7c0 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
1f7d0 54 68 65 20 6d 6f 64 75 6c 65 20 66 69 6c 65 20  The module file 
1f7e0 6e 61 6d 65 20 68 65 72 65 20 6d 75 73 74 20 62  name here must b
1f7f0 65 20 6e 6f 72 6d 61 6c 69 7a 65 64 2e 0d 0a 20  e normalized... 
1f800 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
1f810 20 20 20 20 20 20 20 20 20 20 73 65 74 20 66 69            set fi
1f820 6c 65 4e 61 6d 65 20 5b 66 69 6c 65 20 6e 6f 72  leName [file nor
1f830 6d 61 6c 69 7a 65 20 5b 24 6d 6f 64 75 6c 65 20  malize [$module 
1f840 46 69 6c 65 4e 61 6d 65 5d 5d 0d 0a 0d 0a 20 20  FileName]]....  
1f850 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73            if {[s
1f860 74 72 69 6e 67 20 6d 61 74 63 68 20 2d 6e 6f 63  tring match -noc
1f870 61 73 65 20 2a 2f 73 71 6c 69 74 65 33 2e 64 6c  ase */sqlite3.dl
1f880 6c 20 24 66 69 6c 65 4e 61 6d 65 5d 7d 20 74 68  l $fileName]} th
1f890 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
1f8a0 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
1f8b0 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e  t_channel [appen
1f8c0 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
1f8d0 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
1f8e0 20 66 6f 75 6e 64 20 6c 6f 61 64 65 64 20 53 51   found loaded SQ
1f8f0 4c 69 74 65 20 6e 61 74 69 76 65 20 6c 69 62 72  Lite native libr
1f900 61 72 79 20 6d 6f 64 75 6c 65 3a 20 22 20 5c 0d  ary module: " \.
1f910 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1f920 20 20 20 24 66 69 6c 65 4e 61 6d 65 20 5c 6e 5d     $fileName \n]
1f930 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 20  ..            } 
1f940 65 6c 73 65 69 66 20 7b 5b 73 74 72 69 6e 67 20  elseif {[string 
1f950 6d 61 74 63 68 20 5c 0d 0a 20 20 20 20 20 20 20  match \..       
1f960 20 20 20 20 20 20 20 20 20 2d 6e 6f 63 61 73 65           -nocase
1f970 20 2a 2f 53 51 4c 69 74 65 2e 49 6e 74 65 72 6f   */SQLite.Intero
1f980 70 2e 64 6c 6c 20 24 66 69 6c 65 4e 61 6d 65 5d  p.dll $fileName]
1f990 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
1f9a0 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
1f9b0 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61  :test_channel [a
1f9c0 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
1f9d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
1f9e0 2d 2d 2d 2d 20 66 6f 75 6e 64 20 6c 6f 61 64 65  ---- found loade
1f9f0 64 20 53 51 4c 69 74 65 20 69 6e 74 65 72 6f 70  d SQLite interop
1fa00 20 61 73 73 65 6d 62 6c 79 20 6d 6f 64 75 6c 65   assembly module
1fa10 3a 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  : " \..         
1fa20 20 20 20 20 20 20 20 20 20 24 66 69 6c 65 4e 61           $fileNa
1fa30 6d 65 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20  me \n]..        
1fa40 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
1fa50 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d   }..        }...
1fa60 0a 20 20 20 20 20 20 20 20 63 61 74 63 68 20 7b  .        catch {
1fa70 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70 75 74  ..          tput
1fa80 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
1fa90 6c 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  l \..           
1faa0 20 20 20 22 2d 2d 2d 2d 20 63 6f 6d 70 69 6c 65     "---- compile
1fab0 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 73 20 66 6f  -time options fo
1fac0 72 20 53 51 4c 69 74 65 20 63 6f 72 65 20 6c 69  r SQLite core li
1fad0 62 72 61 72 79 2e 2e 2e 20 22 0d 0a 0d 0a 20 20  brary... "....  
1fae0 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74          if {[cat
1faf0 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  ch {..          
1fb00 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20    object invoke 
1fb10 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69  -flags +NonPubli
1fb20 63 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  c \..           
1fb30 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61       System.Data
1fb40 2e 53 51 4c 69 74 65 2e 53 51 4c 69 74 65 33 20  .SQLite.SQLite3 
1fb50 53 51 4c 69 74 65 43 6f 6d 70 69 6c 65 4f 70 74  SQLiteCompileOpt
1fb60 69 6f 6e 73 0d 0a 20 20 20 20 20 20 20 20 20 20  ions..          
1fb70 7d 20 63 6f 6d 70 69 6c 65 4f 70 74 69 6f 6e 73  } compileOptions
1fb80 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  ] == 0} then {..
1fb90 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
1fba0 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
1fbb0 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5b 66  l [appendArgs [f
1fbc0 6f 72 6d 61 74 4c 69 73 74 20 5b 6c 73 6f 72 74  ormatList [lsort
1fbd0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
1fbe0 20 20 20 20 24 63 6f 6d 70 69 6c 65 4f 70 74 69      $compileOpti
1fbf0 6f 6e 73 5d 20 3c 6e 6f 6e 65 3e 5d 20 5c 6e 5d  ons] <none>] \n]
1fc00 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c  ..          } el
1fc10 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  se {..          
1fc20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
1fc30 63 68 61 6e 6e 65 6c 20 75 6e 6b 6e 6f 77 6e 5c  channel unknown\
1fc40 6e 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  n..          }..
1fc50 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
1fc60 20 20 20 20 20 63 61 74 63 68 20 7b 0d 0a 20 20       catch {..  
1fc70 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
1fc80 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5c 0d  :test_channel \.
1fc90 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22  .              "
1fca0 2d 2d 2d 2d 20 63 6f 6d 70 69 6c 65 2d 74 69 6d  ---- compile-tim
1fcb0 65 20 6f 70 74 69 6f 6e 73 20 66 6f 72 20 53 51  e options for SQ
1fcc0 4c 69 74 65 20 69 6e 74 65 72 6f 70 20 61 73 73  Lite interop ass
1fcd0 65 6d 62 6c 79 2e 2e 2e 20 22 0d 0a 0d 0a 20 20  embly... "....  
1fce0 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74          if {[cat
1fcf0 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  ch {..          
1fd00 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20    object invoke 
1fd10 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69  -flags +NonPubli
1fd20 63 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  c \..           
1fd30 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61       System.Data
1fd40 2e 53 51 4c 69 74 65 2e 53 51 4c 69 74 65 33 20  .SQLite.SQLite3 
1fd50 49 6e 74 65 72 6f 70 43 6f 6d 70 69 6c 65 4f 70  InteropCompileOp
1fd60 74 69 6f 6e 73 0d 0a 20 20 20 20 20 20 20 20 20  tions..         
1fd70 20 7d 20 63 6f 6d 70 69 6c 65 4f 70 74 69 6f 6e   } compileOption
1fd80 73 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d  s] == 0} then {.
1fd90 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75  .            tpu
1fda0 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
1fdb0 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5b  el [appendArgs [
1fdc0 66 6f 72 6d 61 74 4c 69 73 74 20 5b 6c 73 6f 72  formatList [lsor
1fdd0 74 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  t \..           
1fde0 20 20 20 20 20 24 63 6f 6d 70 69 6c 65 4f 70 74       $compileOpt
1fdf0 69 6f 6e 73 5d 20 3c 6e 6f 6e 65 3e 5d 20 5c 6e  ions] <none>] \n
1fe00 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 20 65  ]..          } e
1fe10 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  lse {..         
1fe20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
1fe30 5f 63 68 61 6e 6e 65 6c 20 75 6e 6b 6e 6f 77 6e  _channel unknown
1fe40 5c 6e 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d  \n..          }.
1fe50 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  .        }....  
1fe60 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
1fe70 20 23 20 4e 4f 54 45 3a 20 53 68 6f 77 20 74 68   # NOTE: Show th
1fe80 65 20 61 63 74 69 76 65 20 74 65 73 74 20 63 6f  e active test co
1fe90 6e 73 74 72 61 69 6e 74 73 2e 0d 0a 20 20 20 20  nstraints...    
1fea0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 74      #..        t
1feb0 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
1fec0 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
1fed0 20 22 2d 2d 2d 2d 20 63 6f 6e 73 74 72 61 69 6e   "---- constrain
1fee0 74 73 3a 20 22 20 5c 0d 0a 20 20 20 20 20 20 20  ts: " \..       
1fef0 20 20 20 20 20 5b 66 6f 72 6d 61 74 4c 69 73 74       [formatList
1ff00 20 5b 6c 73 6f 72 74 20 5b 67 65 74 43 6f 6e 73   [lsort [getCons
1ff10 74 72 61 69 6e 74 73 5d 5d 20 3c 6e 6f 6e 65 3e  traints]] <none>
1ff20 5d 20 5c 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  ] \n]....       
1ff30 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
1ff40 54 45 3a 20 53 61 76 65 20 74 68 65 20 74 65 73  TE: Save the tes
1ff50 74 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 66 6f  t constraints fo
1ff60 72 20 75 73 65 20 62 79 20 74 68 72 65 61 64 73  r use by threads
1ff70 20 63 72 65 61 74 65 64 20 69 6e 20 74 68 69 73   created in this
1ff80 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
1ff90 20 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 64 6f    application do
1ffa0 6d 61 69 6e 2e 20 20 54 68 69 73 20 69 73 20 6e  main.  This is n
1ffb0 65 63 65 73 73 61 72 79 20 62 65 63 61 75 73 65  ecessary because
1ffc0 20 61 6c 6c 20 74 68 65 20 45 61 67 6c 65 0d 0a   all the Eagle..
1ffd0 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
1ffe0 22 74 65 73 74 20 63 6f 6e 74 65 78 74 22 20 69  "test context" i
1fff0 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 70 65  nformation is pe
20000 72 2d 74 68 72 65 61 64 2e 0d 0a 20 20 20 20 20  r-thread...     
20010 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 69 66     #..        if
20020 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20   {![info exists 
20030 3a 3a 74 65 73 74 5f 63 6f 6e 73 74 72 61 69 6e  ::test_constrain
20040 74 73 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  ts]} then {..   
20050 20 20 20 20 20 20 20 73 65 74 20 3a 3a 74 65 73         set ::tes
20060 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 24 3a  t_constraints $:
20070 3a 65 61 67 6c 65 5f 74 65 73 74 73 28 63 6f 6e  :eagle_tests(con
20080 73 74 72 61 69 6e 74 73 29 0d 0a 20 20 20 20 20  straints)..     
20090 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
200a0 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
200b0 45 3a 20 4c 6f 61 64 20 74 68 65 20 22 61 66 74  E: Load the "aft
200c0 65 72 2d 63 6f 6e 73 74 72 61 69 6e 74 73 22 20  er-constraints" 
200d0 63 75 73 74 6f 6d 20 70 65 72 2d 75 73 65 72 20  custom per-user 
200e0 61 6e 64 2f 6f 72 20 70 65 72 2d 68 6f 73 74 0d  and/or per-host.
200f0 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
20100 20 74 65 73 74 20 73 65 74 74 69 6e 67 73 20 6e   test settings n
20110 6f 77 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  ow...        #..
20120 20 20 20 20 20 20 20 20 75 70 6c 65 76 65 6c 20          uplevel 
20130 31 20 5b 6c 69 73 74 20 6c 6f 61 64 53 51 4c 69  1 [list loadSQLi
20140 74 65 54 65 73 74 53 65 74 74 69 6e 67 73 20 24  teTestSettings $
20150 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 2e  ::test_channel .
20160 61 66 74 65 72 5d 0d 0a 0d 0a 20 20 20 20 20 20  after]....      
20170 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
20180 4f 54 45 3a 20 49 66 20 6e 65 63 65 73 73 61 72  OTE: If necessar
20190 79 2c 20 65 6e 61 62 6c 65 20 73 68 61 72 65 64  y, enable shared
201a0 2d 63 61 63 68 65 20 6d 6f 64 65 20 6e 6f 77 2e  -cache mode now.
201b0 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
201c0 20 20 20 20 20 69 66 20 7b 5b 68 61 73 52 75 6e       if {[hasRun
201d0 74 69 6d 65 4f 70 74 69 6f 6e 20 73 68 61 72 65  timeOption share
201e0 64 43 61 63 68 65 5d 7d 20 74 68 65 6e 20 7b 0d  dCache]} then {.
201f0 0a 20 20 20 20 20 20 20 20 20 20 65 6e 61 62 6c  .          enabl
20200 65 53 68 61 72 65 64 43 61 63 68 65 20 24 3a 3a  eSharedCache $::
20210 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 74 72 75  test_channel tru
20220 65 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  e..        }....
20230 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
20240 20 20 20 23 20 4e 4f 54 45 3a 20 53 68 6f 77 20     # NOTE: Show 
20250 77 68 65 6e 20 6f 75 72 20 74 65 73 74 73 20 61  when our tests a
20260 63 74 75 61 6c 6c 79 20 62 65 67 61 6e 20 28 6e  ctually began (n
20270 6f 77 29 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  ow)...        #.
20280 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24  .        tputs $
20290 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b  ::test_channel [
202a0 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
202b0 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
202c0 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
202d0 74 65 20 74 65 73 74 73 20 62 65 67 61 6e 20 61  te tests began a
202e0 74 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  t " \..         
202f0 20 20 20 5b 63 6c 6f 63 6b 20 66 6f 72 6d 61 74     [clock format
20300 20 5b 63 6c 6f 63 6b 20 73 65 63 6f 6e 64 73 5d   [clock seconds]
20310 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a  ] \n]..      }..
20320 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
20330 6f 63 20 72 75 6e 53 51 4c 69 74 65 54 65 73 74  oc runSQLiteTest
20340 46 69 6c 65 73 50 72 6f 6c 6f 67 75 65 20 7b 7d  FilesPrologue {}
20350 20 7b 0d 0a 20 20 20 20 20 20 75 70 6c 65 76 65   {..      upleve
20360 6c 20 31 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  l 1 {..        #
20370 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
20380 3a 20 53 65 74 75 70 20 74 68 65 20 76 61 72 69  : Setup the vari
20390 61 62 6c 65 73 20 74 68 61 74 20 72 65 66 65 72  ables that refer
203a0 20 74 6f 20 74 68 65 20 76 61 72 69 6f 75 73 20   to the various 
203b0 6e 6f 6e 2d 64 61 74 61 20 66 69 6c 65 73 0d 0a  non-data files..
203c0 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
203d0 72 65 71 75 69 72 65 64 20 62 79 20 74 68 65 20  required by the 
203e0 74 65 73 74 73 20 69 6e 20 74 68 69 73 20 66 69  tests in this fi
203f0 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  le...        #..
20400 20 20 20 20 20 20 20 20 73 65 74 20 65 6e 74 69          set enti
20410 74 79 46 72 61 6d 65 77 6f 72 6b 44 6c 6c 46 69  tyFrameworkDllFi
20420 6c 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  le \..          
20430 20 20 5b 67 65 74 42 75 69 6c 64 46 69 6c 65 4e    [getBuildFileN
20440 61 6d 65 20 45 6e 74 69 74 79 46 72 61 6d 65 77  ame EntityFramew
20450 6f 72 6b 2e 64 6c 6c 5d 0d 0a 0d 0a 20 20 20 20  ork.dll]....    
20460 20 20 20 20 73 65 74 20 69 6e 73 74 61 6c 6c 65      set installe
20470 72 45 78 65 46 69 6c 65 20 5b 67 65 74 42 75 69  rExeFile [getBui
20480 6c 64 46 69 6c 65 4e 61 6d 65 20 49 6e 73 74 61  ldFileName Insta
20490 6c 6c 65 72 2e 65 78 65 5d 0d 0a 20 20 20 20 20  ller.exe]..     
204a0 20 20 20 73 65 74 20 73 71 6c 69 74 65 44 65 73     set sqliteDes
204b0 69 67 6e 65 72 44 6c 6c 46 69 6c 65 20 5b 67 65  ignerDllFile [ge
204c0 74 42 75 69 6c 64 46 69 6c 65 4e 61 6d 65 20 53  tBuildFileName S
204d0 51 4c 69 74 65 2e 44 65 73 69 67 6e 65 72 2e 64  QLite.Designer.d
204e0 6c 6c 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 73  ll]....        s
204f0 65 74 20 73 79 73 74 65 6d 44 61 74 61 53 51 4c  et systemDataSQL
20500 69 74 65 44 6c 6c 46 69 6c 65 20 5c 0d 0a 20 20  iteDllFile \..  
20510 20 20 20 20 20 20 20 20 20 20 5b 67 65 74 42 75            [getBu
20520 69 6c 64 46 69 6c 65 4e 61 6d 65 20 53 79 73 74  ildFileName Syst
20530 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 64  em.Data.SQLite.d
20540 6c 6c 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 73  ll]....        s
20550 65 74 20 73 79 73 74 65 6d 44 61 74 61 53 51 4c  et systemDataSQL
20560 69 74 65 4c 69 6e 71 44 6c 6c 46 69 6c 65 20 5c  iteLinqDllFile \
20570 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 67  ..            [g
20580 65 74 42 75 69 6c 64 46 69 6c 65 4e 61 6d 65 20  etBuildFileName 
20590 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
205a0 74 65 2e 4c 69 6e 71 2e 64 6c 6c 5d 0d 0a 0d 0a  te.Linq.dll]....
205b0 20 20 20 20 20 20 20 20 73 65 74 20 73 79 73 74          set syst
205c0 65 6d 44 61 74 61 53 51 4c 69 74 65 45 66 36 44  emDataSQLiteEf6D
205d0 6c 6c 46 69 6c 65 20 5c 0d 0a 20 20 20 20 20 20  llFile \..      
205e0 20 20 20 20 20 20 5b 67 65 74 42 75 69 6c 64 46        [getBuildF
205f0 69 6c 65 4e 61 6d 65 20 53 79 73 74 65 6d 2e 44  ileName System.D
20600 61 74 61 2e 53 51 4c 69 74 65 2e 45 46 36 2e 64  ata.SQLite.EF6.d
20610 6c 6c 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 73  ll]....        s
20620 65 74 20 74 65 73 74 45 78 65 46 69 6c 65 20 5b  et testExeFile [
20630 67 65 74 42 75 69 6c 64 46 69 6c 65 4e 61 6d 65  getBuildFileName
20640 20 74 65 73 74 2e 65 78 65 5d 0d 0a 20 20 20 20   test.exe]..    
20650 20 20 20 20 73 65 74 20 74 65 73 74 4c 69 6e 71      set testLinq
20660 45 78 65 46 69 6c 65 20 5b 67 65 74 42 75 69 6c  ExeFile [getBuil
20670 64 46 69 6c 65 4e 61 6d 65 20 74 65 73 74 6c 69  dFileName testli
20680 6e 71 2e 65 78 65 5d 0d 0a 20 20 20 20 20 20 20  nq.exe]..       
20690 20 73 65 74 20 74 65 73 74 45 66 36 45 78 65 46   set testEf6ExeF
206a0 69 6c 65 20 5b 67 65 74 42 75 69 6c 64 46 69 6c  ile [getBuildFil
206b0 65 4e 61 6d 65 20 74 65 73 74 65 66 36 2e 65 78  eName testef6.ex
206c0 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d  e]....        #.
206d0 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
206e0 20 53 65 74 75 70 20 74 68 65 20 76 61 72 69 61   Setup the varia
206f0 62 6c 65 73 20 74 68 61 74 20 72 65 66 65 72 20  bles that refer 
20700 74 6f 20 74 68 65 20 76 61 72 69 6f 75 73 20 64  to the various d
20710 61 74 61 20 66 69 6c 65 73 0d 0a 20 20 20 20 20  ata files..     
20720 20 20 20 23 20 20 20 20 20 20 20 72 65 71 75 69     #       requi
20730 72 65 64 20 62 79 20 74 68 65 20 74 65 73 74 73  red by the tests
20740 20 69 6e 20 74 68 69 73 20 66 69 6c 65 2e 0d 0a   in this file...
20750 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
20760 20 20 20 73 65 74 20 74 65 73 74 4c 69 6e 71 4f     set testLinqO
20770 75 74 46 69 6c 65 20 5b 66 69 6c 65 20 6e 61 74  utFile [file nat
20780 69 76 65 6e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f  ivename [file jo
20790 69 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  in \..          
207a0 20 20 5b 67 65 74 53 51 4c 69 74 65 54 65 73 74    [getSQLiteTest
207b0 44 61 74 61 50 61 74 68 5d 20 74 65 73 74 6c 69  DataPath] testli
207c0 6e 71 2e 6f 75 74 5d 5d 0d 0a 0d 0a 20 20 20 20  nq.out]]....    
207d0 20 20 20 20 73 65 74 20 6e 6f 72 74 68 77 69 6e      set northwin
207e0 64 45 66 44 62 46 69 6c 65 20 5b 66 69 6c 65 20  dEfDbFile [file 
207f0 6e 61 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c 65  nativename [file
20800 20 6a 6f 69 6e 20 5c 0d 0a 20 20 20 20 20 20 20   join \..       
20810 20 20 20 20 20 5b 66 69 6c 65 20 64 69 72 6e 61       [file dirna
20820 6d 65 20 5b 66 69 6c 65 20 64 69 72 6e 61 6d 65  me [file dirname
20830 20 5b 67 65 74 53 51 4c 69 74 65 54 65 73 74 44   [getSQLiteTestD
20840 61 74 61 50 61 74 68 5d 5d 5d 20 5c 0d 0a 20 20  ataPath]]] \..  
20850 20 20 20 20 20 20 20 20 20 20 74 65 73 74 6c 69            testli
20860 6e 71 20 6e 6f 72 74 68 77 69 6e 64 45 46 2e 64  nq northwindEF.d
20870 62 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 73  b]]....        s
20880 65 74 20 6e 6f 6e 57 61 6c 44 62 46 69 6c 65 20  et nonWalDbFile 
20890 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65  [file nativename
208a0 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5c 0d 0a 20   [file join \.. 
208b0 20 20 20 20 20 20 20 20 20 20 20 5b 67 65 74 53             [getS
208c0 51 4c 69 74 65 54 65 73 74 44 61 74 61 50 61 74  QLiteTestDataPat
208d0 68 5d 20 6e 6f 6e 57 61 6c 2e 64 62 5d 5d 0d 0a  h] nonWal.db]]..
208e0 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 77 61  ..        set wa
208f0 6c 44 62 46 69 6c 65 20 5b 66 69 6c 65 20 6e 61  lDbFile [file na
20900 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c 65 20 6a  tivename [file j
20910 6f 69 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  oin \..         
20920 20 20 20 5b 67 65 74 53 51 4c 69 74 65 54 65 73     [getSQLiteTes
20930 74 44 61 74 61 50 61 74 68 5d 20 77 61 6c 2e 64  tDataPath] wal.d
20940 62 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23  b]]....        #
20950 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
20960 3a 20 54 68 65 20 76 61 72 69 6f 75 73 20 69 6e  : The various in
20970 73 74 61 6c 6c 2f 75 6e 69 6e 73 74 61 6c 6c 20  stall/uninstall 
20980 6c 6f 67 20 66 69 6c 65 73 20 75 73 65 64 20 74  log files used t
20990 6f 20 74 65 73 74 20 74 68 65 0d 0a 20 20 20 20  o test the..    
209a0 20 20 20 20 23 20 20 20 20 20 20 20 64 65 73 69      #       desi
209b0 67 6e 2d 74 69 6d 65 20 63 6f 6d 70 6f 6e 65 6e  gn-time componen
209c0 74 20 69 6e 73 74 61 6c 6c 65 72 2e 0d 0a 20 20  t installer...  
209d0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
209e0 20 73 65 74 20 74 65 73 74 49 6e 73 74 61 6c 6c   set testInstall
209f0 56 73 32 30 30 35 4c 6f 67 46 69 6c 65 20 5b 66  Vs2005LogFile [f
20a00 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65 20 5b  ile nativename [
20a10 66 69 6c 65 20 6a 6f 69 6e 20 5c 0d 0a 20 20 20  file join \..   
20a20 20 20 20 20 20 20 20 20 20 5b 67 65 74 53 51 4c           [getSQL
20a30 69 74 65 54 65 73 74 44 61 74 61 50 61 74 68 5d  iteTestDataPath]
20a40 20 49 6e 73 74 61 6c 6c 65 72 5f 54 65 73 74 5f   Installer_Test_
20a50 56 73 32 30 30 35 2e 6c 6f 67 5d 5d 0d 0a 0d 0a  Vs2005.log]]....
20a60 20 20 20 20 20 20 20 20 73 65 74 20 74 65 73 74          set test
20a70 49 6e 73 74 61 6c 6c 56 73 32 30 30 38 4c 6f 67  InstallVs2008Log
20a80 46 69 6c 65 20 5b 66 69 6c 65 20 6e 61 74 69 76  File [file nativ
20a90 65 6e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e  ename [file join
20aa0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
20ab0 5b 67 65 74 53 51 4c 69 74 65 54 65 73 74 44 61  [getSQLiteTestDa
20ac0 74 61 50 61 74 68 5d 20 49 6e 73 74 61 6c 6c 65  taPath] Installe
20ad0 72 5f 54 65 73 74 5f 56 73 32 30 30 38 2e 6c 6f  r_Test_Vs2008.lo
20ae0 67 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 73  g]]....        s
20af0 65 74 20 74 65 73 74 49 6e 73 74 61 6c 6c 56 73  et testInstallVs
20b00 32 30 31 30 4c 6f 67 46 69 6c 65 20 5b 66 69 6c  2010LogFile [fil
20b10 65 20 6e 61 74 69 76 65 6e 61 6d 65 20 5b 66 69  e nativename [fi
20b20 6c 65 20 6a 6f 69 6e 20 5c 0d 0a 20 20 20 20 20  le join \..     
20b30 20 20 20 20 20 20 20 5b 67 65 74 53 51 4c 69 74         [getSQLit
20b40 65 54 65 73 74 44 61 74 61 50 61 74 68 5d 20 49  eTestDataPath] I
20b50 6e 73 74 61 6c 6c 65 72 5f 54 65 73 74 5f 56 73  nstaller_Test_Vs
20b60 32 30 31 30 2e 6c 6f 67 5d 5d 0d 0a 0d 0a 20 20  2010.log]]....  
20b70 20 20 20 20 20 20 73 65 74 20 74 65 73 74 49 6e        set testIn
20b80 73 74 61 6c 6c 56 73 32 30 31 32 4c 6f 67 46 69  stallVs2012LogFi
20b90 6c 65 20 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e  le [file nativen
20ba0 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5c  ame [file join \
20bb0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 67  ..            [g
20bc0 65 74 53 51 4c 69 74 65 54 65 73 74 44 61 74 61  etSQLiteTestData
20bd0 50 61 74 68 5d 20 49 6e 73 74 61 6c 6c 65 72 5f  Path] Installer_
20be0 54 65 73 74 5f 56 73 32 30 31 32 2e 6c 6f 67 5d  Test_Vs2012.log]
20bf0 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 73 65 74  ]....        set
20c00 20 74 65 73 74 49 6e 73 74 61 6c 6c 56 73 32 30   testInstallVs20
20c10 31 33 4c 6f 67 46 69 6c 65 20 5b 66 69 6c 65 20  13LogFile [file 
20c20 6e 61 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c 65  nativename [file
20c30 20 6a 6f 69 6e 20 5c 0d 0a 20 20 20 20 20 20 20   join \..       
20c40 20 20 20 20 20 5b 67 65 74 53 51 4c 69 74 65 54       [getSQLiteT
20c50 65 73 74 44 61 74 61 50 61 74 68 5d 20 49 6e 73  estDataPath] Ins
20c60 74 61 6c 6c 65 72 5f 54 65 73 74 5f 56 73 32 30  taller_Test_Vs20
20c70 31 33 2e 6c 6f 67 5d 5d 0d 0a 0d 0a 20 20 20 20  13.log]]....    
20c80 20 20 20 20 73 65 74 20 74 65 73 74 49 6e 73 74      set testInst
20c90 61 6c 6c 56 73 32 30 31 35 4c 6f 67 46 69 6c 65  allVs2015LogFile
20ca0 20 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d   [file nativenam
20cb0 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5c 0d 0a  e [file join \..
20cc0 20 20 20 20 20 20 20 20 20 20 20 20 5b 67 65 74              [get
20cd0 53 51 4c 69 74 65 54 65 73 74 44 61 74 61 50 61  SQLiteTestDataPa
20ce0 74 68 5d 20 49 6e 73 74 61 6c 6c 65 72 5f 54 65  th] Installer_Te
20cf0 73 74 5f 56 73 32 30 31 35 2e 6c 6f 67 5d 5d 0d  st_Vs2015.log]].
20d00 0a 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 74  ...        set t
20d10 65 73 74 55 6e 69 6e 73 74 61 6c 6c 56 73 32 30  estUninstallVs20
20d20 30 35 4c 6f 67 46 69 6c 65 20 5b 66 69 6c 65 20  05LogFile [file 
20d30 6e 61 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c 65  nativename [file
20d40 20 6a 6f 69 6e 20 5c 0d 0a 20 20 20 20 20 20 20   join \..       
20d50 20 20 20 20 20 5b 67 65 74 53 51 4c 69 74 65 54       [getSQLiteT
20d60 65 73 74 44 61 74 61 50 61 74 68 5d 20 55 6e 69  estDataPath] Uni
20d70 6e 73 74 61 6c 6c 65 72 5f 54 65 73 74 5f 56 73  nstaller_Test_Vs
20d80 32 30 30 35 2e 6c 6f 67 5d 5d 0d 0a 0d 0a 20 20  2005.log]]....  
20d90 20 20 20 20 20 20 73 65 74 20 74 65 73 74 55 6e        set testUn
20da0 69 6e 73 74 61 6c 6c 56 73 32 30 30 38 4c 6f 67  installVs2008Log
20db0 46 69 6c 65 20 5b 66 69 6c 65 20 6e 61 74 69 76  File [file nativ
20dc0 65 6e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e  ename [file join
20dd0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
20de0 5b 67 65 74 53 51 4c 69 74 65 54 65 73 74 44 61  [getSQLiteTestDa
20df0 74 61 50 61 74 68 5d 20 55 6e 69 6e 73 74 61 6c  taPath] Uninstal
20e00 6c 65 72 5f 54 65 73 74 5f 56 73 32 30 30 38 2e  ler_Test_Vs2008.
20e10 6c 6f 67 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  log]]....       
20e20 20 73 65 74 20 74 65 73 74 55 6e 69 6e 73 74 61   set testUninsta
20e30 6c 6c 56 73 32 30 31 30 4c 6f 67 46 69 6c 65 20  llVs2010LogFile 
20e40 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65  [file nativename
20e50 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5c 0d 0a 20   [file join \.. 
20e60 20 20 20 20 20 20 20 20 20 20 20 5b 67 65 74 53             [getS
20e70 51 4c 69 74 65 54 65 73 74 44 61 74 61 50 61 74  QLiteTestDataPat
20e80 68 5d 20 55 6e 69 6e 73 74 61 6c 6c 65 72 5f 54  h] Uninstaller_T
20e90 65 73 74 5f 56 73 32 30 31 30 2e 6c 6f 67 5d 5d  est_Vs2010.log]]
20ea0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20  ....        set 
20eb0 74 65 73 74 55 6e 69 6e 73 74 61 6c 6c 56 73 32  testUninstallVs2
20ec0 30 31 32 4c 6f 67 46 69 6c 65 20 5b 66 69 6c 65  012LogFile [file
20ed0 20 6e 61 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c   nativename [fil
20ee0 65 20 6a 6f 69 6e 20 5c 0d 0a 20 20 20 20 20 20  e join \..      
20ef0 20 20 20 20 20 20 5b 67 65 74 53 51 4c 69 74 65        [getSQLite
20f00 54 65 73 74 44 61 74 61 50 61 74 68 5d 20 55 6e  TestDataPath] Un
20f10 69 6e 73 74 61 6c 6c 65 72 5f 54 65 73 74 5f 56  installer_Test_V
20f20 73 32 30 31 32 2e 6c 6f 67 5d 5d 0d 0a 0d 0a 20  s2012.log]].... 
20f30 20 20 20 20 20 20 20 73 65 74 20 74 65 73 74 55         set testU
20f40 6e 69 6e 73 74 61 6c 6c 56 73 32 30 31 33 4c 6f  ninstallVs2013Lo
20f50 67 46 69 6c 65 20 5b 66 69 6c 65 20 6e 61 74 69  gFile [file nati
20f60 76 65 6e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69  vename [file joi
20f70 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n \..           
20f80 20 5b 67 65 74 53 51 4c 69 74 65 54 65 73 74 44   [getSQLiteTestD
20f90 61 74 61 50 61 74 68 5d 20 55 6e 69 6e 73 74 61  ataPath] Uninsta
20fa0 6c 6c 65 72 5f 54 65 73 74 5f 56 73 32 30 31 33  ller_Test_Vs2013
20fb0 2e 6c 6f 67 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20  .log]]....      
20fc0 20 20 73 65 74 20 74 65 73 74 55 6e 69 6e 73 74    set testUninst
20fd0 61 6c 6c 56 73 32 30 31 35 4c 6f 67 46 69 6c 65  allVs2015LogFile
20fe0 20 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d   [file nativenam
20ff0 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5c 0d 0a  e [file join \..
21000 20 20 20 20 20 20 20 20 20 20 20 20 5b 67 65 74              [get
21010 53 51 4c 69 74 65 54 65 73 74 44 61 74 61 50 61  SQLiteTestDataPa
21020 74 68 5d 20 55 6e 69 6e 73 74 61 6c 6c 65 72 5f  th] Uninstaller_
21030 54 65 73 74 5f 56 73 32 30 31 35 2e 6c 6f 67 5d  Test_Vs2015.log]
21040 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 23 23  ]....        ###
21050 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
21060 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
21070 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
21080 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
21090 23 23 23 23 0d 0a 0d 0a 20 20 20 20 20 20 20 20  ####....        
210a0 69 66 20 7b 21 5b 68 61 76 65 43 6f 6e 73 74 72  if {![haveConstr
210b0 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73  aint [appendArgs
210c0 20 66 69 6c 65 5f 20 5c 0d 0a 20 20 20 20 20 20   file_ \..      
210d0 20 20 20 20 20 20 5b 66 69 6c 65 20 74 61 69 6c        [file tail
210e0 20 24 65 6e 74 69 74 79 46 72 61 6d 65 77 6f 72   $entityFramewor
210f0 6b 44 6c 6c 46 69 6c 65 5d 5d 5d 7d 20 74 68 65  kDllFile]]]} the
21100 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 63  n {..          c
21110 68 65 63 6b 46 6f 72 46 69 6c 65 20 24 74 65 73  heckForFile $tes
21120 74 5f 63 68 61 6e 6e 65 6c 20 24 65 6e 74 69 74  t_channel $entit
21130 79 46 72 61 6d 65 77 6f 72 6b 44 6c 6c 46 69 6c  yFrameworkDllFil
21140 65 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  e..        }....
21150 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 68 61          if {![ha
21160 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70  veConstraint [ap
21170 70 65 6e 64 41 72 67 73 20 66 69 6c 65 5f 20 5c  pendArgs file_ \
21180 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 66  ..            [f
21190 69 6c 65 20 74 61 69 6c 20 24 69 6e 73 74 61 6c  ile tail $instal
211a0 6c 65 72 45 78 65 46 69 6c 65 5d 5d 5d 7d 20 74  lerExeFile]]]} t
211b0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
211c0 20 63 68 65 63 6b 46 6f 72 46 69 6c 65 20 24 74   checkForFile $t
211d0 65 73 74 5f 63 68 61 6e 6e 65 6c 20 24 69 6e 73  est_channel $ins
211e0 74 61 6c 6c 65 72 45 78 65 46 69 6c 65 20 49 6e  tallerExeFile In
211f0 73 74 61 6c 6c 65 72 2e 65 78 65 0d 0a 20 20 20  staller.exe..   
21200 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
21210 20 20 69 66 20 7b 21 5b 68 61 76 65 43 6f 6e 73    if {![haveCons
21220 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72  traint [appendAr
21230 67 73 20 66 69 6c 65 5f 20 5c 0d 0a 20 20 20 20  gs file_ \..    
21240 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20 74 61          [file ta
21250 69 6c 20 24 73 71 6c 69 74 65 44 65 73 69 67 6e  il $sqliteDesign
21260 65 72 44 6c 6c 46 69 6c 65 5d 5d 5d 7d 20 74 68  erDllFile]]]} th
21270 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
21280 63 68 65 63 6b 46 6f 72 46 69 6c 65 20 24 74 65  checkForFile $te
21290 73 74 5f 63 68 61 6e 6e 65 6c 20 24 73 71 6c 69  st_channel $sqli
212a0 74 65 44 65 73 69 67 6e 65 72 44 6c 6c 46 69 6c  teDesignerDllFil
212b0 65 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  e..        }....
212c0 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 68 61          if {![ha
212d0 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70  veConstraint [ap
212e0 70 65 6e 64 41 72 67 73 20 66 69 6c 65 5f 20 5c  pendArgs file_ \
212f0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 66  ..            [f
21300 69 6c 65 20 74 61 69 6c 20 24 73 79 73 74 65 6d  ile tail $system
21310 44 61 74 61 53 51 4c 69 74 65 44 6c 6c 46 69 6c  DataSQLiteDllFil
21320 65 5d 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  e]]]} then {..  
21330 20 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72          checkFor
21340 46 69 6c 65 20 24 74 65 73 74 5f 63 68 61 6e 6e  File $test_chann
21350 65 6c 20 24 73 79 73 74 65 6d 44 61 74 61 53 51  el $systemDataSQ
21360 4c 69 74 65 44 6c 6c 46 69 6c 65 0d 0a 20 20 20  LiteDllFile..   
21370 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
21380 20 20 69 66 20 7b 21 5b 68 61 76 65 43 6f 6e 73    if {![haveCons
21390 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72  traint [appendAr
213a0 67 73 20 66 69 6c 65 5f 20 5c 0d 0a 20 20 20 20  gs file_ \..    
213b0 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20 74 61          [file ta
213c0 69 6c 20 24 73 79 73 74 65 6d 44 61 74 61 53 51  il $systemDataSQ
213d0 4c 69 74 65 4c 69 6e 71 44 6c 6c 46 69 6c 65 5d  LiteLinqDllFile]
213e0 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  ]]} then {..    
213f0 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72 46 69        checkForFi
21400 6c 65 20 24 74 65 73 74 5f 63 68 61 6e 6e 65 6c  le $test_channel
21410 20 24 73 79 73 74 65 6d 44 61 74 61 53 51 4c 69   $systemDataSQLi
21420 74 65 4c 69 6e 71 44 6c 6c 46 69 6c 65 0d 0a 20  teLinqDllFile.. 
21430 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
21440 20 20 20 20 69 66 20 7b 21 5b 68 61 76 65 43 6f      if {![haveCo
21450 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64  nstraint [append
21460 41 72 67 73 20 66 69 6c 65 5f 20 5c 0d 0a 20 20  Args file_ \..  
21470 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20            [file 
21480 74 61 69 6c 20 24 73 79 73 74 65 6d 44 61 74 61  tail $systemData
21490 53 51 4c 69 74 65 45 66 36 44 6c 6c 46 69 6c 65  SQLiteEf6DllFile
214a0 5d 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  ]]]} then {..   
214b0 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72 46         checkForF
214c0 69 6c 65 20 24 74 65 73 74 5f 63 68 61 6e 6e 65  ile $test_channe
214d0 6c 20 24 73 79 73 74 65 6d 44 61 74 61 53 51 4c  l $systemDataSQL
214e0 69 74 65 45 66 36 44 6c 6c 46 69 6c 65 0d 0a 20  iteEf6DllFile.. 
214f0 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
21500 20 20 20 20 69 66 20 7b 21 5b 68 61 76 65 43 6f      if {![haveCo
21510 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64  nstraint [append
21520 41 72 67 73 20 66 69 6c 65 5f 20 5c 0d 0a 20 20  Args file_ \..  
21530 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20            [file 
21540 74 61 69 6c 20 24 74 65 73 74 45 78 65 46 69 6c  tail $testExeFil
21550 65 5d 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  e]]]} then {..  
21560 20 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72          checkFor
21570 46 69 6c 65 20 24 74 65 73 74 5f 63 68 61 6e 6e  File $test_chann
21580 65 6c 20 24 74 65 73 74 45 78 65 46 69 6c 65 20  el $testExeFile 
21590 74 65 73 74 2e 65 78 65 0d 0a 20 20 20 20 20 20  test.exe..      
215a0 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69    }....        i
215b0 66 20 7b 21 5b 68 61 76 65 43 6f 6e 73 74 72 61  f {![haveConstra
215c0 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20  int [appendArgs 
215d0 66 69 6c 65 5f 20 5c 0d 0a 20 20 20 20 20 20 20  file_ \..       
215e0 20 20 20 20 20 5b 66 69 6c 65 20 74 61 69 6c 20       [file tail 
215f0 24 74 65 73 74 4c 69 6e 71 45 78 65 46 69 6c 65  $testLinqExeFile
21600 5d 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  ]]]} then {..   
21610 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72 46         checkForF
21620 69 6c 65 20 24 74 65 73 74 5f 63 68 61 6e 6e 65  ile $test_channe
21630 6c 20 24 74 65 73 74 4c 69 6e 71 45 78 65 46 69  l $testLinqExeFi
21640 6c 65 20 74 65 73 74 6c 69 6e 71 2e 65 78 65 0d  le testlinq.exe.
21650 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  .        }....  
21660 20 20 20 20 20 20 69 66 20 7b 21 5b 68 61 76 65        if {![have
21670 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65  Constraint [appe
21680 6e 64 41 72 67 73 20 66 69 6c 65 5f 20 5c 0d 0a  ndArgs file_ \..
21690 20 20 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c              [fil
216a0 65 20 74 61 69 6c 20 24 74 65 73 74 45 66 36 45  e tail $testEf6E
216b0 78 65 46 69 6c 65 5d 5d 5d 7d 20 74 68 65 6e 20  xeFile]]]} then 
216c0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 63 68 65  {..          che
216d0 63 6b 46 6f 72 46 69 6c 65 20 24 74 65 73 74 5f  ckForFile $test_
216e0 63 68 61 6e 6e 65 6c 20 24 74 65 73 74 45 66 36  channel $testEf6
216f0 45 78 65 46 69 6c 65 20 74 65 73 74 65 66 36 2e  ExeFile testef6.
21700 65 78 65 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  exe..        }..
21710 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b  ..        if {![
21720 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b  haveConstraint [
21730 61 70 70 65 6e 64 41 72 67 73 20 66 69 6c 65 5f  appendArgs file_
21740 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
21750 5b 66 69 6c 65 20 74 61 69 6c 20 24 74 65 73 74  [file tail $test
21760 4c 69 6e 71 4f 75 74 46 69 6c 65 5d 5d 5d 7d 20  LinqOutFile]]]} 
21770 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
21780 20 20 63 68 65 63 6b 46 6f 72 46 69 6c 65 20 24    checkForFile $
21790 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 24 74 65  test_channel $te
217a0 73 74 4c 69 6e 71 4f 75 74 46 69 6c 65 0d 0a 20  stLinqOutFile.. 
217b0 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
217c0 20 20 20 20 69 66 20 7b 21 5b 68 61 76 65 43 6f      if {![haveCo
217d0 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64  nstraint [append
217e0 41 72 67 73 20 66 69 6c 65 5f 20 5c 0d 0a 20 20  Args file_ \..  
217f0 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20            [file 
21800 74 61 69 6c 20 24 6e 6f 72 74 68 77 69 6e 64 45  tail $northwindE
21810 66 44 62 46 69 6c 65 5d 5d 5d 7d 20 74 68 65 6e  fDbFile]]]} then
21820 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 63 68   {..          ch
21830 65 63 6b 46 6f 72 46 69 6c 65 20 24 74 65 73 74  eckForFile $test
21840 5f 63 68 61 6e 6e 65 6c 20 24 6e 6f 72 74 68 77  _channel $northw
21850 69 6e 64 45 66 44 62 46 69 6c 65 0d 0a 20 20 20  indEfDbFile..   
21860 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
21870 20 20 69 66 20 7b 21 5b 68 61 76 65 43 6f 6e 73    if {![haveCons
21880 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72  traint [appendAr
21890 67 73 20 66 69 6c 65 5f 20 5c 0d 0a 20 20 20 20  gs file_ \..    
218a0 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20 74 61          [file ta
218b0 69 6c 20 24 6e 6f 6e 57 61 6c 44 62 46 69 6c 65  il $nonWalDbFile
218c0 5d 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  ]]]} then {..   
218d0 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72 46         checkForF
218e0 69 6c 65 20 24 74 65 73 74 5f 63 68 61 6e 6e 65  ile $test_channe
218f0 6c 20 24 6e 6f 6e 57 61 6c 44 62 46 69 6c 65 0d  l $nonWalDbFile.
21900 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  .        }....  
21910 20 20 20 20 20 20 69 66 20 7b 21 5b 68 61 76 65        if {![have
21920 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65  Constraint [appe
21930 6e 64 41 72 67 73 20 66 69 6c 65 5f 20 5c 0d 0a  ndArgs file_ \..
21940 20 20 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c              [fil
21950 65 20 74 61 69 6c 20 24 77 61 6c 44 62 46 69 6c  e tail $walDbFil
21960 65 5d 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  e]]]} then {..  
21970 20 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72          checkFor
21980 46 69 6c 65 20 24 74 65 73 74 5f 63 68 61 6e 6e  File $test_chann
21990 65 6c 20 24 77 61 6c 44 62 46 69 6c 65 0d 0a 20  el $walDbFile.. 
219a0 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
219b0 20 20 20 20 69 66 20 7b 21 5b 68 61 76 65 43 6f      if {![haveCo
219c0 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64  nstraint [append
219d0 41 72 67 73 20 66 69 6c 65 5f 20 5c 0d 0a 20 20  Args file_ \..  
219e0 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20            [file 
219f0 74 61 69 6c 20 24 74 65 73 74 49 6e 73 74 61 6c  tail $testInstal
21a00 6c 56 73 32 30 30 35 4c 6f 67 46 69 6c 65 5d 5d  lVs2005LogFile]]
21a10 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
21a20 20 20 20 20 20 63 68 65 63 6b 46 6f 72 46 69 6c       checkForFil
21a30 65 20 24 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  e $test_channel 
21a40 24 74 65 73 74 49 6e 73 74 61 6c 6c 56 73 32 30  $testInstallVs20
21a50 30 35 4c 6f 67 46 69 6c 65 0d 0a 20 20 20 20 20  05LogFile..     
21a60 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
21a70 69 66 20 7b 21 5b 68 61 76 65 43 6f 6e 73 74 72  if {![haveConstr
21a80 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73  aint [appendArgs
21a90 20 66 69 6c 65 5f 20 5c 0d 0a 20 20 20 20 20 20   file_ \..      
21aa0 20 20 20 20 20 20 5b 66 69 6c 65 20 74 61 69 6c        [file tail
21ab0 20 24 74 65 73 74 49 6e 73 74 61 6c 6c 56 73 32   $testInstallVs2
21ac0 30 30 38 4c 6f 67 46 69 6c 65 5d 5d 5d 7d 20 74  008LogFile]]]} t
21ad0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
21ae0 20 63 68 65 63 6b 46 6f 72 46 69 6c 65 20 24 74   checkForFile $t
21af0 65 73 74 5f 63 68 61 6e 6e 65 6c 20 24 74 65 73  est_channel $tes
21b00 74 49 6e 73 74 61 6c 6c 56 73 32 30 30 38 4c 6f  tInstallVs2008Lo
21b10 67 46 69 6c 65 0d 0a 20 20 20 20 20 20 20 20 7d  gFile..        }
21b20 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b  ....        if {
21b30 21 5b 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74  ![haveConstraint
21b40 20 5b 61 70 70 65 6e 64 41 72 67 73 20 66 69 6c   [appendArgs fil
21b50 65 5f 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  e_ \..          
21b60 20 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 74 65    [file tail $te
21b70 73 74 49 6e 73 74 61 6c 6c 56 73 32 30 31 30 4c  stInstallVs2010L
21b80 6f 67 46 69 6c 65 5d 5d 5d 7d 20 74 68 65 6e 20  ogFile]]]} then 
21b90 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 63 68 65  {..          che
21ba0 63 6b 46 6f 72 46 69 6c 65 20 24 74 65 73 74 5f  ckForFile $test_
21bb0 63 68 61 6e 6e 65 6c 20 24 74 65 73 74 49 6e 73  channel $testIns
21bc0 74 61 6c 6c 56 73 32 30 31 30 4c 6f 67 46 69 6c  tallVs2010LogFil
21bd0 65 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  e..        }....
21be0 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 68 61          if {![ha
21bf0 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70  veConstraint [ap
21c00 70 65 6e 64 41 72 67 73 20 66 69 6c 65 5f 20 5c  pendArgs file_ \
21c10 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 66  ..            [f
21c20 69 6c 65 20 74 61 69 6c 20 24 74 65 73 74 49 6e  ile tail $testIn
21c30 73 74 61 6c 6c 56 73 32 30 31 32 4c 6f 67 46 69  stallVs2012LogFi
21c40 6c 65 5d 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  le]]]} then {.. 
21c50 20 20 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f           checkFo
21c60 72 46 69 6c 65 20 24 74 65 73 74 5f 63 68 61 6e  rFile $test_chan
21c70 6e 65 6c 20 24 74 65 73 74 49 6e 73 74 61 6c 6c  nel $testInstall
21c80 56 73 32 30 31 32 4c 6f 67 46 69 6c 65 0d 0a 20  Vs2012LogFile.. 
21c90 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
21ca0 20 20 20 20 69 66 20 7b 21 5b 68 61 76 65 43 6f      if {![haveCo
21cb0 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64  nstraint [append
21cc0 41 72 67 73 20 66 69 6c 65 5f 20 5c 0d 0a 20 20  Args file_ \..  
21cd0 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20            [file 
21ce0 74 61 69 6c 20 24 74 65 73 74 49 6e 73 74 61 6c  tail $testInstal
21cf0 6c 56 73 32 30 31 33 4c 6f 67 46 69 6c 65 5d 5d  lVs2013LogFile]]
21d00 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
21d10 20 20 20 20 20 63 68 65 63 6b 46 6f 72 46 69 6c       checkForFil
21d20 65 20 24 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  e $test_channel 
21d30 24 74 65 73 74 49 6e 73 74 61 6c 6c 56 73 32 30  $testInstallVs20
21d40 31 33 4c 6f 67 46 69 6c 65 0d 0a 20 20 20 20 20  13LogFile..     
21d50 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
21d60 69 66 20 7b 21 5b 68 61 76 65 43 6f 6e 73 74 72  if {![haveConstr
21d70 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73  aint [appendArgs
21d80 20 66 69 6c 65 5f 20 5c 0d 0a 20 20 20 20 20 20   file_ \..      
21d90 20 20 20 20 20 20 5b 66 69 6c 65 20 74 61 69 6c        [file tail
21da0 20 24 74 65 73 74 49 6e 73 74 61 6c 6c 56 73 32   $testInstallVs2
21db0 30 31 35 4c 6f 67 46 69 6c 65 5d 5d 5d 7d 20 74  015LogFile]]]} t
21dc0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
21dd0 20 63 68 65 63 6b 46 6f 72 46 69 6c 65 20 24 74   checkForFile $t
21de0 65 73 74 5f 63 68 61 6e 6e 65 6c 20 24 74 65 73  est_channel $tes
21df0 74 49 6e 73 74 61 6c 6c 56 73 32 30 31 35 4c 6f  tInstallVs2015Lo
21e00 67 46 69 6c 65 0d 0a 20 20 20 20 20 20 20 20 7d  gFile..        }
21e10 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b  ....        if {
21e20 21 5b 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74  ![haveConstraint
21e30 20 5b 61 70 70 65 6e 64 41 72 67 73 20 66 69 6c   [appendArgs fil
21e40 65 5f 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  e_ \..          
21e50 20 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 74 65    [file tail $te
21e60 73 74 55 6e 69 6e 73 74 61 6c 6c 56 73 32 30 30  stUninstallVs200
21e70 35 4c 6f 67 46 69 6c 65 5d 5d 5d 7d 20 74 68 65  5LogFile]]]} the
21e80 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 63  n {..          c
21e90 68 65 63 6b 46 6f 72 46 69 6c 65 20 24 74 65 73  heckForFile $tes
21ea0 74 5f 63 68 61 6e 6e 65 6c 20 24 74 65 73 74 55  t_channel $testU
21eb0 6e 69 6e 73 74 61 6c 6c 56 73 32 30 30 35 4c 6f  ninstallVs2005Lo
21ec0 67 46 69 6c 65 0d 0a 20 20 20 20 20 20 20 20 7d  gFile..        }
21ed0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b  ....        if {
21ee0 21 5b 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74  ![haveConstraint
21ef0 20 5b 61 70 70 65 6e 64 41 72 67 73 20 66 69 6c   [appendArgs fil
21f00 65 5f 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  e_ \..          
21f10 20 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 74 65    [file tail $te
21f20 73 74 55 6e 69 6e 73 74 61 6c 6c 56 73 32 30 30  stUninstallVs200
21f30 38 4c 6f 67 46 69 6c 65 5d 5d 5d 7d 20 74 68 65  8LogFile]]]} the
21f40 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 63  n {..          c
21f50 68 65 63 6b 46 6f 72 46 69 6c 65 20 24 74 65 73  heckForFile $tes
21f60 74 5f 63 68 61 6e 6e 65 6c 20 24 74 65 73 74 55  t_channel $testU
21f70 6e 69 6e 73 74 61 6c 6c 56 73 32 30 30 38 4c 6f  ninstallVs2008Lo
21f80 67 46 69 6c 65 0d 0a 20 20 20 20 20 20 20 20 7d  gFile..        }
21f90 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b  ....        if {
21fa0 21 5b 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74  ![haveConstraint
21fb0 20 5b 61 70 70 65 6e 64 41 72 67 73 20 66 69 6c   [appendArgs fil
21fc0 65 5f 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  e_ \..          
21fd0 20 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 74 65    [file tail $te
21fe0 73 74 55 6e 69 6e 73 74 61 6c 6c 56 73 32 30 31  stUninstallVs201
21ff0 30 4c 6f 67 46 69 6c 65 5d 5d 5d 7d 20 74 68 65  0LogFile]]]} the
22000 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 63  n {..          c
22010 68 65 63 6b 46 6f 72 46 69 6c 65 20 24 74 65 73  heckForFile $tes
22020 74 5f 63 68 61 6e 6e 65 6c 20 24 74 65 73 74 55  t_channel $testU
22030 6e 69 6e 73 74 61 6c 6c 56 73 32 30 31 30 4c 6f  ninstallVs2010Lo
22040 67 46 69 6c 65 0d 0a 20 20 20 20 20 20 20 20 7d  gFile..        }
22050 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b  ....        if {
22060 21 5b 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74  ![haveConstraint
22070 20 5b 61 70 70 65 6e 64 41 72 67 73 20 66 69 6c   [appendArgs fil
22080 65 5f 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  e_ \..          
22090 20 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 74 65    [file tail $te
220a0 73 74 55 6e 69 6e 73 74 61 6c 6c 56 73 32 30 31  stUninstallVs201
220b0 32 4c 6f 67 46 69 6c 65 5d 5d 5d 7d 20 74 68 65  2LogFile]]]} the
220c0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 63  n {..          c
220d0 68 65 63 6b 46 6f 72 46 69 6c 65 20 24 74 65 73  heckForFile $tes
220e0 74 5f 63 68 61 6e 6e 65 6c 20 24 74 65 73 74 55  t_channel $testU
220f0 6e 69 6e 73 74 61 6c 6c 56 73 32 30 31 32 4c 6f  ninstallVs2012Lo
22100 67 46 69 6c 65 0d 0a 20 20 20 20 20 20 20 20 7d  gFile..        }
22110 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b  ....        if {
22120 21 5b 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74  ![haveConstraint
22130 20 5b 61 70 70 65 6e 64 41 72 67 73 20 66 69 6c   [appendArgs fil
22140 65 5f 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  e_ \..          
22150 20 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 74 65    [file tail $te
22160 73 74 55 6e 69 6e 73 74 61 6c 6c 56 73 32 30 31  stUninstallVs201
22170 33 4c 6f 67 46 69 6c 65 5d 5d 5d 7d 20 74 68 65  3LogFile]]]} the
22180 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 63  n {..          c
22190 68 65 63 6b 46 6f 72 46 69 6c 65 20 24 74 65 73  heckForFile $tes
221a0 74 5f 63 68 61 6e 6e 65 6c 20 24 74 65 73 74 55  t_channel $testU
221b0 6e 69 6e 73 74 61 6c 6c 56 73 32 30 31 33 4c 6f  ninstallVs2013Lo
221c0 67 46 69 6c 65 0d 0a 20 20 20 20 20 20 20 20 7d  gFile..        }
221d0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b  ....        if {
221e0 21 5b 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74  ![haveConstraint
221f0 20 5b 61 70 70 65 6e 64 41 72 67 73 20 66 69 6c   [appendArgs fil
22200 65 5f 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  e_ \..          
22210 20 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 74 65    [file tail $te
22220 73 74 55 6e 69 6e 73 74 61 6c 6c 56 73 32 30 31  stUninstallVs201
22230 35 4c 6f 67 46 69 6c 65 5d 5d 5d 7d 20 74 68 65  5LogFile]]]} the
22240 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 63  n {..          c
22250 68 65 63 6b 46 6f 72 46 69 6c 65 20 24 74 65 73  heckForFile $tes
22260 74 5f 63 68 61 6e 6e 65 6c 20 24 74 65 73 74 55  t_channel $testU
22270 6e 69 6e 73 74 61 6c 6c 56 73 32 30 31 35 4c 6f  ninstallVs2015Lo
22280 67 46 69 6c 65 0d 0a 20 20 20 20 20 20 20 20 7d  gFile..        }
22290 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d  ..      }..    }
222a0 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 72 75  .....    proc ru
222b0 6e 53 51 4c 69 74 65 54 65 73 74 46 69 6c 65 73  nSQLiteTestFiles
222c0 45 70 69 6c 6f 67 75 65 20 7b 7d 20 7b 0d 0a 20  Epilogue {} {.. 
222d0 20 20 20 20 20 75 70 6c 65 76 65 6c 20 31 20 7b       uplevel 1 {
222e0 0d 0a 20 20 20 20 20 20 20 20 75 6e 73 65 74 20  ..        unset 
222f0 2d 6e 6f 63 6f 6d 70 6c 61 69 6e 20 5c 0d 0a 20  -nocomplain \.. 
22300 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 55             testU
22310 6e 69 6e 73 74 61 6c 6c 56 73 32 30 31 35 4c 6f  ninstallVs2015Lo
22320 67 46 69 6c 65 20 74 65 73 74 55 6e 69 6e 73 74  gFile testUninst
22330 61 6c 6c 56 73 32 30 31 33 4c 6f 67 46 69 6c 65  allVs2013LogFile
22340 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
22350 74 65 73 74 55 6e 69 6e 73 74 61 6c 6c 56 73 32  testUninstallVs2
22360 30 31 32 4c 6f 67 46 69 6c 65 20 74 65 73 74 55  012LogFile testU
22370 6e 69 6e 73 74 61 6c 6c 56 73 32 30 31 30 4c 6f  ninstallVs2010Lo
22380 67 46 69 6c 65 20 5c 0d 0a 20 20 20 20 20 20 20  gFile \..       
22390 20 20 20 20 20 74 65 73 74 55 6e 69 6e 73 74 61       testUninsta
223a0 6c 6c 56 73 32 30 30 38 4c 6f 67 46 69 6c 65 20  llVs2008LogFile 
223b0 74 65 73 74 55 6e 69 6e 73 74 61 6c 6c 56 73 32  testUninstallVs2
223c0 30 30 35 4c 6f 67 46 69 6c 65 20 5c 0d 0a 20 20  005LogFile \..  
223d0 20 20 20 20 20 20 20 20 20 20 74 65 73 74 49 6e            testIn
223e0 73 74 61 6c 6c 56 73 32 30 31 35 4c 6f 67 46 69  stallVs2015LogFi
223f0 6c 65 20 74 65 73 74 49 6e 73 74 61 6c 6c 56 73  le testInstallVs
22400 32 30 31 33 4c 6f 67 46 69 6c 65 20 5c 0d 0a 20  2013LogFile \.. 
22410 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 49             testI
22420 6e 73 74 61 6c 6c 56 73 32 30 31 32 4c 6f 67 46  nstallVs2012LogF
22430 69 6c 65 20 74 65 73 74 49 6e 73 74 61 6c 6c 56  ile testInstallV
22440 73 32 30 31 30 4c 6f 67 46 69 6c 65 20 5c 0d 0a  s2010LogFile \..
22450 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74              test
22460 49 6e 73 74 61 6c 6c 56 73 32 30 30 38 4c 6f 67  InstallVs2008Log
22470 46 69 6c 65 20 74 65 73 74 49 6e 73 74 61 6c 6c  File testInstall
22480 56 73 32 30 30 35 4c 6f 67 46 69 6c 65 0d 0a 0d  Vs2005LogFile...
22490 0a 20 20 20 20 20 20 20 20 75 6e 73 65 74 20 2d  .        unset -
224a0 6e 6f 63 6f 6d 70 6c 61 69 6e 20 5c 0d 0a 20 20  nocomplain \..  
224b0 20 20 20 20 20 20 20 20 20 20 6e 6f 72 74 68 77            northw
224c0 69 6e 64 45 66 44 62 46 69 6c 65 20 74 65 73 74  indEfDbFile test
224d0 4c 69 6e 71 4f 75 74 46 69 6c 65 20 5c 0d 0a 20  LinqOutFile \.. 
224e0 20 20 20 20 20 20 20 20 20 20 20 77 61 6c 44 62             walDb
224f0 46 69 6c 65 20 6e 6f 6e 57 61 6c 44 62 46 69 6c  File nonWalDbFil
22500 65 0d 0a 0d 0a 20 20 20 20 20 20 20 20 75 6e 73  e....        uns
22510 65 74 20 2d 6e 6f 63 6f 6d 70 6c 61 69 6e 20 5c  et -nocomplain \
22520 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 65  ..            te
22530 73 74 45 66 36 45 78 65 46 69 6c 65 20 74 65 73  stEf6ExeFile tes
22540 74 4c 69 6e 71 45 78 65 46 69 6c 65 20 5c 0d 0a  tLinqExeFile \..
22550 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74              test
22560 45 78 65 46 69 6c 65 20 73 79 73 74 65 6d 44 61  ExeFile systemDa
22570 74 61 53 51 4c 69 74 65 45 66 36 44 6c 6c 46 69  taSQLiteEf6DllFi
22580 6c 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  le \..          
22590 20 20 73 79 73 74 65 6d 44 61 74 61 53 51 4c 69    systemDataSQLi
225a0 74 65 4c 69 6e 71 44 6c 6c 46 69 6c 65 20 73 79  teLinqDllFile sy
225b0 73 74 65 6d 44 61 74 61 53 51 4c 69 74 65 44 6c  stemDataSQLiteDl
225c0 6c 46 69 6c 65 20 5c 0d 0a 20 20 20 20 20 20 20  lFile \..       
225d0 20 20 20 20 20 73 71 6c 69 74 65 44 65 73 69 67       sqliteDesig
225e0 6e 65 72 44 6c 6c 46 69 6c 65 20 69 6e 73 74 61  nerDllFile insta
225f0 6c 6c 65 72 45 78 65 46 69 6c 65 20 5c 0d 0a 20  llerExeFile \.. 
22600 20 20 20 20 20 20 20 20 20 20 20 65 6e 74 69 74             entit
22610 79 46 72 61 6d 65 77 6f 72 6b 44 6c 6c 46 69 6c  yFrameworkDllFil
22620 65 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  e..      }..    
22630 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 72  }.....    proc r
22640 75 6e 53 51 4c 69 74 65 54 65 73 74 45 70 69 6c  unSQLiteTestEpil
22650 6f 67 75 65 20 7b 7d 20 7b 0d 0a 20 20 20 20 20  ogue {} {..     
22660 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
22670 3a 20 53 6b 69 70 20 72 75 6e 6e 69 6e 67 20 6f  : Skip running o
22680 75 72 20 63 75 73 74 6f 6d 20 65 70 69 6c 6f 67  ur custom epilog
22690 75 65 20 69 66 20 74 68 65 20 6d 61 69 6e 20 6f  ue if the main o
226a0 6e 65 20 68 61 73 20 62 65 65 6e 0d 0a 20 20 20  ne has been..   
226b0 20 20 20 23 20 20 20 20 20 20 20 73 6b 69 70 70     #       skipp
226c0 65 64 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  ed...      #..  
226d0 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65      if {![info e
226e0 78 69 73 74 73 20 3a 3a 6e 6f 28 65 70 69 6c 6f  xists ::no(epilo
226f0 67 75 65 2e 65 61 67 6c 65 29 5d 7d 20 74 68 65  gue.eagle)]} the
22700 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  n {..        #..
22710 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
22720 53 68 6f 77 20 77 68 65 6e 20 6f 75 72 20 74 65  Show when our te
22730 73 74 73 20 61 63 74 75 61 6c 6c 79 20 65 6e 64  sts actually end
22740 65 64 20 28 6e 6f 77 29 2e 0d 0a 20 20 20 20 20  ed (now)...     
22750 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 74 70     #..        tp
22760 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  uts $::test_chan
22770 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
22780 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22  \..            "
22790 2d 2d 2d 2d 20 53 79 73 74 65 6d 2e 44 61 74 61  ---- System.Data
227a0 2e 53 51 4c 69 74 65 20 74 65 73 74 73 20 65 6e  .SQLite tests en
227b0 64 65 64 20 61 74 20 22 20 5c 0d 0a 20 20 20 20  ded at " \..    
227c0 20 20 20 20 20 20 20 20 5b 63 6c 6f 63 6b 20 66          [clock f
227d0 6f 72 6d 61 74 20 5b 63 6c 6f 63 6b 20 73 65 63  ormat [clock sec
227e0 6f 6e 64 73 5d 5d 20 5c 6e 5d 0d 0a 0d 0a 20 20  onds]] \n]....  
227f0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
22800 20 23 20 4e 4f 54 45 3a 20 4c 6f 61 64 20 74 68   # NOTE: Load th
22810 65 20 22 65 70 69 6c 6f 67 75 65 22 20 63 75 73  e "epilogue" cus
22820 74 6f 6d 20 70 65 72 2d 75 73 65 72 20 61 6e 64  tom per-user and
22830 2f 6f 72 20 70 65 72 2d 68 6f 73 74 20 74 65 73  /or per-host tes
22840 74 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  t..        #    
22850 20 20 20 73 65 74 74 69 6e 67 73 20 6e 6f 77 2e     settings now.
22860 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
22870 20 20 20 20 20 75 70 6c 65 76 65 6c 20 31 20 5b       uplevel 1 [
22880 6c 69 73 74 20 6c 6f 61 64 53 51 4c 69 74 65 54  list loadSQLiteT
22890 65 73 74 53 65 74 74 69 6e 67 73 20 24 3a 3a 74  estSettings $::t
228a0 65 73 74 5f 63 68 61 6e 6e 65 6c 20 2e 65 70 69  est_channel .epi
228b0 6c 6f 67 75 65 5d 0d 0a 0d 0a 20 20 20 20 20 20  logue]....      
228c0 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 42    #..        # B
228d0 55 47 46 49 58 3a 20 42 65 66 6f 72 65 20 63 68  UGFIX: Before ch
228e0 65 63 6b 69 6e 67 20 74 68 65 20 66 69 6e 61 6c  ecking the final
228f0 20 72 65 73 6f 75 72 63 65 73 20 69 6e 20 75 73   resources in us
22900 65 20 62 79 20 53 51 4c 69 74 65 2c 20 6d 61 6b  e by SQLite, mak
22910 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  e..        #    
22920 20 20 20 20 20 73 75 72 65 20 62 6f 74 68 20 6f       sure both o
22930 66 20 74 68 65 20 50 52 41 47 4d 41 20 72 65 6c  f the PRAGMA rel
22940 61 74 65 64 20 64 69 72 65 63 74 6f 72 79 20 6e  ated directory n
22950 61 6d 65 73 20 61 72 65 20 66 72 65 65 64 2e 0d  ames are freed..
22960 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
22970 20 20 20 20 63 68 65 63 6b 46 6f 72 53 51 4c 69      checkForSQLi
22980 74 65 44 69 72 65 63 74 6f 72 69 65 73 20 24 3a  teDirectories $:
22990 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 74 72  :test_channel tr
229a0 75 65 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d  ue....        #.
229b0 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
229c0 20 41 6c 73 6f 20 72 65 70 6f 72 74 20 74 68 65   Also report the
229d0 20 72 65 73 6f 75 72 63 65 20 75 73 61 67 65 20   resource usage 
229e0 61 66 74 65 72 20 72 75 6e 6e 69 6e 67 20 74 68  after running th
229f0 65 20 74 65 73 74 73 2e 0d 0a 20 20 20 20 20 20  e tests...      
22a00 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 70    #..        rep
22a10 6f 72 74 53 51 4c 69 74 65 52 65 73 6f 75 72 63  ortSQLiteResourc
22a20 65 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  es $::test_chann
22a30 65 6c 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d  el....        #.
22a40 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
22a50 20 52 65 70 6f 72 74 20 74 68 65 20 63 72 69 74   Report the crit
22a60 69 63 61 6c 20 68 61 6e 64 6c 65 20 63 6f 75 6e  ical handle coun
22a70 74 73 20 61 66 74 65 72 20 72 75 6e 6e 69 6e 67  ts after running
22a80 20 74 68 65 20 74 65 73 74 73 2e 0d 0a 20 20 20   the tests...   
22a90 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
22aa0 67 65 74 53 51 4c 69 74 65 48 61 6e 64 6c 65 43  getSQLiteHandleC
22ab0 6f 75 6e 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  ounts $::test_ch
22ac0 61 6e 6e 65 6c 0d 0a 0d 0a 20 20 20 20 20 20 20  annel....       
22ad0 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
22ae0 54 45 3a 20 49 66 20 6e 65 63 65 73 73 61 72 79  TE: If necessary
22af0 2c 20 64 69 73 61 62 6c 65 20 73 68 61 72 65 64  , disable shared
22b00 2d 63 61 63 68 65 20 6d 6f 64 65 20 6e 6f 77 2e  -cache mode now.
22b10 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
22b20 20 20 20 20 20 69 66 20 7b 5b 68 61 73 52 75 6e       if {[hasRun
22b30 74 69 6d 65 4f 70 74 69 6f 6e 20 73 68 61 72 65  timeOption share
22b40 64 43 61 63 68 65 5d 7d 20 74 68 65 6e 20 7b 0d  dCache]} then {.
22b50 0a 20 20 20 20 20 20 20 20 20 20 65 6e 61 62 6c  .          enabl
22b60 65 53 68 61 72 65 64 43 61 63 68 65 20 24 3a 3a  eSharedCache $::
22b70 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 66 61 6c  test_channel fal
22b80 73 65 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20  se..        }.. 
22b90 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c       }..    }...
22ba0 0d 0a 20 20 20 20 23 23 23 23 23 23 23 23 23 23  ..    ##########
22bb0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
22bc0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
22bd0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
22be0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
22bf0 23 0d 0a 20 20 20 20 23 23 23 23 23 23 23 23 23  #..    #########
22c00 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
22c10 23 23 23 23 20 45 4e 44 20 45 61 67 6c 65 20 4f  #### END Eagle O
22c20 4e 4c 59 20 23 23 23 23 23 23 23 23 23 23 23 23  NLY ############
22c30 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
22c40 23 23 0d 0a 20 20 20 20 23 23 23 23 23 23 23 23  ##..    ########
22c50 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
22c60 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
22c70 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
22c80 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
22c90 23 23 23 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 23 0d  ###..  }....  #.
22ca0 0a 20 20 23 20 4e 4f 54 45 3a 20 53 61 76 65 20  .  # NOTE: Save 
22cb0 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
22cc0 64 69 72 65 63 74 6f 72 79 20 63 6f 6e 74 61 69  directory contai
22cd0 6e 69 6e 67 20 74 68 69 73 20 66 69 6c 65 2e 0d  ning this file..
22ce0 0a 20 20 23 0d 0a 20 20 69 66 20 7b 21 5b 69 6e  .  #..  if {![in
22cf0 66 6f 20 65 78 69 73 74 73 20 63 6f 6d 6d 6f 6e  fo exists common
22d00 5f 64 69 72 65 63 74 6f 72 79 5d 7d 20 74 68 65  _directory]} the
22d10 6e 20 7b 0d 0a 20 20 20 20 73 65 74 20 63 6f 6d  n {..    set com
22d20 6d 6f 6e 5f 64 69 72 65 63 74 6f 72 79 20 5b 66  mon_directory [f
22d30 69 6c 65 20 64 69 72 6e 61 6d 65 20 5b 69 6e 66  ile dirname [inf
22d40 6f 20 73 63 72 69 70 74 5d 5d 0d 0a 20 20 7d 0d  o script]]..  }.
22d50 0a 0d 0a 20 20 23 0d 0a 20 20 23 20 4e 4f 54 45  ...  #..  # NOTE
22d60 3a 20 50 72 6f 76 69 64 65 20 74 68 65 20 53 79  : Provide the Sy
22d70 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
22d80 20 74 65 73 74 20 70 61 63 6b 61 67 65 20 74 6f   test package to
22d90 20 74 68 65 20 69 6e 74 65 72 70 72 65 74 65 72   the interpreter
22da0 2e 0d 0a 20 20 23 0d 0a 20 20 70 61 63 6b 61 67  ...  #..  packag
22db0 65 20 70 72 6f 76 69 64 65 20 53 79 73 74 65 6d  e provide System
22dc0 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 54 65 73  .Data.SQLite.Tes
22dd0 74 20 31 2e 30 0d 0a 7d 0d 0a                    t 1.0..}..